rtracklayer/build/0000755000175100017510000000000014614353501015216 5ustar00biocbuildbiocbuildrtracklayer/build/vignette.rds0000644000175100017510000000030314614353501017551 0ustar00biocbuildbiocbuildb```b`a@&0`b fd`aE%E9EzAyhHtI t0XX%Z]?4-ީE0=(jؠjX2sRad9.nP&c0Gq?gQ~`oݣ9JI,IK+rtracklayer/configure0000755000175100017510000025717414614353502016047 0ustar00biocbuildbiocbuild#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= PACKAGE_URL= ac_subst_vars='LTLIBOBJS LIBOBJS SSL_CPPFLAGS OPENSSL_LIBS OPENSSL_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking ' ac_precious_vars='build_alias host_alias target_alias PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR OPENSSL_CFLAGS OPENSSL_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures this package to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Some influential environment variables: PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path OPENSSL_CFLAGS C compiler flags for OPENSSL, overriding pkg-config OPENSSL_LIBS linker flags for OPENSSL, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF configure generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu case "$OSTYPE" in "darwin"*) BREWDIR=`brew --prefix` export PKG_CONFIG_PATH=$BREWDIR/opt/openssl/lib/pkgconfig ;; esac if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OPENSSL" >&5 $as_echo_n "checking for OPENSSL... " >&6; } if test -n "$OPENSSL_CFLAGS"; then pkg_cv_OPENSSL_CFLAGS="$OPENSSL_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"openssl >= 1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "openssl >= 1.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_OPENSSL_CFLAGS=`$PKG_CONFIG --cflags "openssl >= 1.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$OPENSSL_LIBS"; then pkg_cv_OPENSSL_LIBS="$OPENSSL_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"openssl >= 1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "openssl >= 1.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_OPENSSL_LIBS=`$PKG_CONFIG --libs "openssl >= 1.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then OPENSSL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "openssl >= 1.0" 2>&1` else OPENSSL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "openssl >= 1.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$OPENSSL_PKG_ERRORS" >&5 OPENSSL="no" elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } OPENSSL="no" else OPENSSL_CFLAGS=$pkg_cv_OPENSSL_CFLAGS OPENSSL_LIBS=$pkg_cv_OPENSSL_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } OPENSSL="yes" fi if test "${OPENSSL}" != "no"; then SSL_CPPFLAGS="-DUSE_SSL" fi ac_config_files="$ac_config_files src/Makevars" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by $as_me, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "src/Makevars") CONFIG_FILES="$CONFIG_FILES src/Makevars" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi rtracklayer/configure.ac0000644000175100017510000000053314614231172016405 0ustar00biocbuildbiocbuildAC_PREREQ([2.65]) AC_INIT case "$OSTYPE" in "darwin"*) BREWDIR=`brew --prefix` export PKG_CONFIG_PATH=$BREWDIR/opt/openssl/lib/pkgconfig ;; esac PKG_CHECK_MODULES(OPENSSL, [openssl >= 1.0], [OPENSSL="yes"], [OPENSSL="no"]) if test "${OPENSSL}" != "no"; then SSL_CPPFLAGS="-DUSE_SSL" fi AC_SUBST(SSL_CPPFLAGS) AC_OUTPUT(src/Makevars) rtracklayer/data/0000755000175100017510000000000014614231172015027 5ustar00biocbuildbiocbuildrtracklayer/data/cpneTrack.rda0000644000175100017510000222452414614231172017444 0ustar00biocbuildbiocbuild7zXZi"6!XD])ThnRʠ3$RKLɄCbN~z3sj<|:ݙǏh԰{4VnlwEMZw%۶$f;tn'Y vWf z'PD*xi%kѠ12T@Va^Tj6ѫ-u^kCN>LCӝerOU~P *l'n#3L#qU*x/dS9h\KuUӔo!eg,-o4kU7(nHWA]<1+BrĈ0x6?y;8a[S=JSMΓa|;ަƍ2 bg,ž.dq2kecH8@M5B^)ע T,^N;kݨV|@ 8~PAR$ۜ%6APq>^AGl6Y xSR,$ ISYW.Whfe_SHC-Lѯ)Qَ%jW sy~OGv8jr(8%M?&@tBX֠+Z> ]slJMSB5O֚}*Ez~-;>h:9CN;gqJq;b5LUjbdцG(+KRZ8X<gNRGɰm"{zQƿ% (k2Xe[ l魕Bcaޛ!ogj;d+x?W. bh`r''\3 mOr8L9.pHɰƺ쩅a5"3)/ ί uﶬ̊"z]=XԿj5nBz'1+9k ]SOa"))ñϻjh::.Qt%ɂ6g,F>"xGsUЗGUUyݚW;"&""ʾwu=sz0#yɀlV|֨*U m܀2!n -c,g/.0.^i9ΐ1HB5Mi )f7Z}Py3$#u+5a" elh+[_mţw#蠵|aN=BA$4P#b١Vى$K`|Zf:r+Ć`- bwr7yClAͶ6x=L1߈ԥ CGn~THq0i-p;r+Y _Sa> Af=fm }863~L[8(Wtf>;EtbŇ$$;t 5Ve'@|%/8 b|R#8P%sk$7 [~5ȴo d-@?1skBo`ckp&āWOmL Du.[_ v'$1v&ǝ<=C~eZ(ٰ7T0r[Z7*2k& )x ]Tj~utcOȿ,Y}4 V(KsjU/2SK}L4j-03 0CHGI9!`-N˧UcjF㯘CnYRM)/PO3G4^upj4"NP#2 畷i4`\IzS<%hoya ܸX暰kw%LbTQ2gVeO#F QǴ(X:b~U=Vlw xbSCEK8Ocg>q%UʣpX?Ai<,{櫤f=쇅 J0XrЗ4)\%OrN+Bϟ)Ixv/Ff-czI5smn rvw1#:!t(r{d/] =TU/k~J (--5zvpC+[CiXڋo!!>,@~؊}t'Q9w~| LpI%U&ޜ_8v#ۦKo=MD-udvb{$SL֤0qgS; D- xu%S`%>)Z $ާ'E$#}=ڀB~"9UB5 ZUiAm;dh\Vge 8>_qTPszў a5 '%u' *22FYXi$I;\7+/G}eCFȇI2\^^~U`Z2 i3D1}{=\!2ԫ{l@w6@ l}#VoΜ-p0@ KO')BNQECsZ =.ϩ "Vhif_P2sS"Ǚ*w_9.C vD:ZH2~ag".lVi 6B;Y%#ѰkorԐӬ:Eh&fAߘL΀ T(2ꄩ䜁xAr7mo2:.M9SM  +2ȇͫS)Gw%e޷8̐0iWD +D&)O/ =nڢ_TsU::C6m>H1߈gq?l`VƣVHKi=梺]_1 .-C72mm ^\%R\Ziv2Ek<)e})kqBm(Us('BIډ!{D&wz޽[ܭ!-14";iJt&$.'V/Z^ދT=RoP~)!ن3&?ҟ%:gB7naɠ{:oׁљw}ܝ́I$)FC7POj TXNS+嗮'#:}N)o4LBz/OJH؉s yC/@GNp "%xLcdH`[6=2IP^0.y.iU_L4LeVd7R>w~7н^mAĊWtWP2.0L6U:Լ%Be4vX00}4BNc0pX@/9Jo 8tXT![P~mq 0R4*hCjP~QOOKا%پ"qGi}hei t3ZOi {Xzyg4`*6 Aۥ#1c\w^YI<o ՞|=wH Ni$NSpIgg"Voa;qt2)q\]4v, F`R>đ"& cu :uLoX{F\p]LNE_d3r7ٗ`Jy9eadNS7}Q%C\񼀅CaO5 Ww$ECn[^xG~A:79zÙʈK+E0t#2[ؠ+=b!>D=kx\.f=+p3UKʹ<'W&ܯrxJ AF lAjiܿvwN z]1XưhOO L 8^kT&V_3@0Ԏ*WɼOC~3:ͫЮ-,nXN1%ʔ`ӾG-RV㽳]눍Xa5@}l : *,׊|M)ysb%p5)N~= QqМI{捇0{d5tRv~pL #M苹 hN@8D+(K scQ]f%,2DZFW Sd"039T'0_9=rQ"הg-җ3;E/B:˅O_6IOgG=%\mǿ[5{͖gZrōn|BF?q >Ѽua|%&[L:(1N9kn(|5-4(+}Nv|1ȹ7NH8J!(ndʀYQa|7% ʴ8P~GZOSU3Ӛ0r >^j(&Cx bJju H3oFj55FO I5ň}0bM.E;dr4Xٳ'AxlhI~rΰZ. (Nj'$.^uSsfs[FQF ]-+UJu_w}hX9-E~)[ 4QT3%دx`~6}FK&ʠ^ɱS؃2WGQIGK兮PVaFvt2G w2 slNz3j:YC H(="dRjfԊ,]!{ 2fVgtj{yJض; H(G(0зrث&Qcdѧ@/BtlNI~O](1l5A1Q\:5,&&aX$Ju wrȦ'?ftD>.x)Ǻ2g/0W[ x A G jt+ nkwF?&If!_RGe8PmS1rY;<%驽4'ƪQo2i Gp%sWlm"Cd~rqa `lc<񡈺Oi L W,0~N9"X\*8NIǰ%oAas`z.W#EĝtBalqmN<`tD sG䓻4( shʄ_#6FUD"҉F@%Bk5m|K3g',r牓٣/lwA|ۊ d< +~<_ ֋{ta_9M>p日q--?kj_IKSr̛G/S$Ccx<!֌V7HGW(j0ueG3M̙_Mfj/t;\/ZDpE2h*0+ReWcO;W\hԮ]>cjf!H G(@GPMvf7 #ja:ڑ_pR9m"5Gp$ 4AÅ$Y,.(u5J:l6rĨ|R͇${e(8$6AZl:a'C,J I9z?jg8aL.DIOIGi3@m?$K) UzX}4]hMHt+'eobf7 E"#yv:@ۣy_OwI-Ky5-͜L6 =,a !TvE8HS&9Y< ȂI}}Pf7ʏ,i_Q4' [3Y3x-K]%C+pe#0y;#o%Ś> Z@o>8&L2ApJSH/?9sY{J̭tLc#T7y.;DI#+9-Uf  jpkPSq ,!ޕ܅)YZޫq&o+x3a@i~l _=h$ilaVZw 5 =YȇJk+n--z!/R w{2DڏYG@tڛ3C<*+[c &R?TcJI&ԇVu uPpNЗ87qkU-&wx6 =/ GӮd&/n+ v_nbzrgiG*~D($-@a"64%t^ P/-Eq5h$y5=IwAk17xt_~rE:[OpNvY :'druöOz# F!CJX~fr4v(m E:0deA<#kwK"SAC>ƨS<@U$?k7 Z J5)ch6Xjnm[,='ex]p 5&Kj Փߨ$|2T /J$@ݦ׍w@ot7`rr |w{Ɣ/֢?,GS#]# 0#jPwЖ_מ@:"gѻ=jD\n}>jM.8#zU!d"w k~(޻=rϦ+VƩ"^ T[Q$_XztT?5r*AYGkȿ}HxGeE}}zN;עjѕul4 Y ?<%6sE?8/R5Nf1tDtUk4kgĽXV tK4JUuᗿ:u$p%rM\ hMnP$܊^b)W+L2v;5L^30YXuO9^ȶqO!= )?=>ܶL?#V/5T{4=:!\k!z RJt68kׅ6Z0j ,{l=cHRIqby9ygvv E/W|ղ'7d}?V泥3X>*~Po<)sjǡ3BT Ah -q-kbqRi!R+har& ;gR.,)klrfH:inV 6/⌸ 29 Gq"wtPQykR؂T6hM ֐x06`Z /Q|^AL~'0ߎ0coMVFi4=@{,K@ɺ)vES /<ف'0Py0pyZi 4YSNu#L,xtf?]䨵xQ)_j_n$Aa4m[H.OZd<.YD{8PP@e5 }7{{&5ZbD&po\gdU Pl¨INb&H>5x#tKf#X.Fm3Y(urnYRQS?K-KTWTwm:CP΍X կ-q_ܽVi/@+ !6O>y=*r08/s-R ? 7+nC<ʉk hVy #Fo3w<}}mg2s6ݔ!.Ѫ oA.\r8{yГDT#Br[kT3][w5Œ}DQ5PalTT{@  4|Mv^i$'bV 7}r w6}nH~"EdTv:4`Q(;=l=U蹝ю|-Rab-C@g'?TQE?Jݜ#Oז`YU(|Ү}^ÊdC =SV&l]5PBj-p~v3gB ;Z?3a '³{@[&;싱{pz+k<*)Q3T\: "eXΌlqWsW˶ӛ5f@Ǡ +g NbFK+r̔l`l}NIw.GN(NGI-nbAw{.?'h $zmzf2^?yk@cCċ#ڊ CeBسc”8ly)G FR)!I ϑ U7}PD~= ;jEVw"WSiu [gLܞfR(!\y|هl`hGК)n%Hٽ/5lt|`<__e8q{| !JAeLUEm7Z OG0 "e뢛{7}qbJ|y mV0 %=EY\u֍px/?)\n0'@v Kp k5.ׁ"QDVVwd|6mjq݃HGooBث;=zx*zI,1f#1nm̒AAEmGGbj3w_c!sA**% s4*w|RIƞ?,rz;m܆4 fu N*~:ߙ1ERO4GpG;Y9A=zG2mfbnN|y̟tQq [cr>f:ՔTY]ݑpo q 30:dspĵi%;<Bmm~ٞvN4)QtZ.$p0^R0R-iPRy]zSoW!Oc<*0Bb܄l)QygWZfXJQޱVckܶ xhI=Q^9)`OelSo5ǭ( ˎ1eoywj_xrMd\`o/JqP!ڪŇͽ{ өDpG9GLpt.!0_[]jlb}|lݞJ` ~ 2\{{ ޭ/q:#S2Dab\rP @hfT,^?%=M5Zo)[eKa!B O}y &\AP!ڱQ%vW=-~A pdqa6g|w+Vu>706"2nkQx繠QH$[6HE>^tgz*q8ȪjxNml1\QJa+I&X®qR ?P6I}+%OX#y`n daL.d~y)5y,9fOt@ gzݬ[|2\ZrGE\„tR~|uk޷dlOZe tI3JV;o;|Jr1#\ $@3,̃#4''BRV-4BvO iSd40&^f 0`*-RzFB?-Hk`dl*s}Oy2$OFgU7rvi*tBr$Rg76FJ1*9.4ה$*#_},ܪG5^ey&^cg .[Eko_r4$^teVdΣ'{q<Wpjg/̼D6դ&MIS8p9E(AcHi̠eFݔWJ!?~$p`K@~Y.Bˢnl 5%/gnދz\dP L]!&(٨3#J:G :| -#944'`X8:iLΈY?PwIp ;-͞Iښ.ҌY Ё=Aj./۪A[\ Y9F(eQ1hlE [)?dV$HV~O^2v]lܛǻtX5d ""[g](vRmƕcP-=N^ml+(Y`y&t fjp(VzN¯u.iSņB 3KbsNVK'^IU&DD°#{gQN@#ܙQT!w=FPJlCy2 oôqq@.H|K0vBl3WZ>Rk 5#Tc1FyYVӨ(DŽ$ҶC#?7;mr8_zzV6>t%D 6wr@Wj]-ZzN:$@tQePͲw2Nd~}}=N> RݕidtrEg M(bkщwJj͟Nͷe2 o' /tEnaggО[4EV pFLq,.%Z/-UX'ӵ;xDRز*Q(E<"C:Z= |t׎+^d`:W糼C .DY5UK#cjnA"RD=RBl ݔa7nEmbY]U5U܈ 7[N0H% WKE%jM>xoKMQ& *I?5SSxA>`<7p$̋ v'VK5:V8LIy9>qD'XGtz=Ɵ:OPȄzvZ]`|mZ,;rxbҵX> O\-I]zK( A403ϵx]}\uf#^:f 6y߶&1|g@Kfs oݟJ=VCȻ&[ %"Y]rSg5&o ]6X`؆iFCۚ]޳ (DSg1T;PKDjH3eRY\.go+Î0E>V v}0(3 j`[DC_`| c0ti+bm8 *m%Oo-)T[ǚ])n6O3To"Ugo%=-9n- /]NJxJ?%U$RvU'ЭFTI Ump7 r3R';]p6 [w7*W^?p>e#hKxn'~1(g3Qmhǰ ϹZ|dkC&~{)!ޏ vw}!?#VK'HV˕ڿJ%vG~PӘ#8gdukY!t$uMEN@ojϕw؏%{ Cx )7= P"”gHie{#leW^)zE^lxwT"}nѠΚhyŌ;QD?NdI oxIJ< ,8jDaGDذa>Ő'SѝEѥ\s?i)ǢBf{}>aVKiK :C]gcp)CAo9Jw#PQ:DX΋ X헬*SਞE>;C[0j`+wf-M,ZWGYuTIUq`"ra4y?>qM m8\ " L_L˖LWRӯ =Ύ7 0 H,0A&Qޚ>s^-\Gj#j>1JKZ xKSobyG +,IZ6Ht/3Mmid~Ue+ C}H^6.j6kXm#y%%>.(r5Fd˞ Ues"A *|(/cz!".oB@.#v ~r5p5+[:{ywоT981nk"%5#կ 6oh;/kdJҢAk0bs!1>ªAtT!%5,5xme=Cڔ1=Xl|rQmw]U>VXM0ċ4i}@I oũG~ #2H7B}, LMH-8bWVkrл+K.AU(ۿ',F[t$rr N4-BQ|BΧ%jg3>u!`f7پw"B(oABWb}J?P)1h1~Hh: u.%#qm wELe,໙w_4w=y(.?S~i8b @^ڼ7&DPÅشe<8i]V+ǚ0+$MC#/}`չU!icP0󋧠iYhu$0H|r1~tYS_3W|iR||HCt>fURE-ܶ]iV3;]4 f˓ǼBJQֻ'c7d~ v&\AO5fL~ +yO"f@,7>{[oVd xҍ,8dПO.: S{Tm F-o@3F_^s$(h*=J}cu~7$e̓2ϰ4(WcL6&o5QF`"'B(HztkB*jM+9zFJ6ZAU4JEMLJ1T7a_^e~a j1] u9PuΙ$Ts̴YF{+O/fgK-` DӕX6́M[>A[}N8o?!k낞 yBoC _&kMЭE%g߲w~A=lӎS> Ie)Q9/6U릞h5z"EQhJP`>2St{Sdⓖ4G4.򽚊"cˤ;caetG]JDU ~5ok0N2Ϛ;=hϪfx Jd'tݽ1m }{-4l62Ff?Z~~{J?Nٙ8,UХs-QيWgA1y-#}%nȺ ;Geܲ"Ţ@ѫݷK'kwD' +Ґ%[Qw(;EXPMO> kP,: Nǃޟ{A5X+TǓPc Drm4dDj`Ja2M*̽w4e"ͷ??tߵK〼#!>cA.j0} h۪B.' WWe a5UNHx.fSik5-4)+o!@da6)شsW]+U'M`WߓzWš)u+7OMڹVՄ3B[9E#PWi}۳EI6b`bWlM)+x8`gP>">+(9*A6ˁ *H jՕ 0 tx4Jh֪)| k$=3oXde>Cqc0<$tUƦgEyAnny03 ++.3ڭ#=zEϜ`80, vHq{uSBg:%?q zO"1Ki"Ph;Y%fjW2^x8 \ZBDx1uzu;xTh[b%wզj+E+ĬhTB 8ﳿl~Q a%3RTE@A{'ݼi=Uf>W$kK-F>=W#WherL8]k Ne܆e|ł@=[b#b欀$$Ei30 D<|B_ٯgB$GfP^+VTt"@RL9iK+ @ƶWFe*LA?tif AYu.kKWhQJ q"g 8xc(&#Dž[|Tק}πSO]Oi VMV R>֝G7>15Dc2٠dQh糡4k|CBXt+ o)+%rR(:Vم^rNFv5ΰ_b<C̳Giox).͋]?𼵭o$8KeHAjWs!d$!tBl22L}s/:6Kq(ު {|v9 QƢgr: JXr4?:kZ!dHlkH.]煵'F7U]bB@gtfq,V'p;]s +1A?\Q66!24F6~n@>o/;x)c{(Ѡ.i@Y?Y9Op!WlNprƢDŽB! BYtpyz9sO?Y2%ǪXsscq(v~ Lg/SxqŖV s&O,6oA7 &6M X^53VW >= '`P;ڏ@m46W[pZo3ߎӶ!F10/` 4-({w\␯):nN|v|\v̤_ Ŕ`TYY!o9u۴8Y9!5;/Ko:B:Z6/Vu^A1YP眽kU%SG >8wpX1/ʪ*TJB|fRcY^AUzE"HgNP'SS p[8kksrO֊[O[|YpRs02p:W_1^q0ˍY{$ڳHn8p)DYsׄ`/dS}|Y]B/fؗ%-&}e{OF}@{]zɮ=|QP=$:'bVO|&c$h\s\yI*`uFp$h{976A8&EX95xg.fAcD᭴9ᴡtNsTUlZe@A CTeIG92fX@a}"YE-+nIF4X[#y U-y:Ñޫ*n2xFJTJh &ڄ)&ٴ℧{DR ?5ZU8or9 2) ٛ8u5Az$SqPU)v{yPLS,EHv d8'9ԮUUpVDn&`"{ HXa6hd>EUu Rce5&( jԘ=ڸpx v@A6Og-F&9R0:h&(Z\/+.3\7yGs|qT49p$"}mN݉k( O5 mbZ7ɘb&”7.%Iٌe@ H礼,ҷW]ܲEJJ `<u}IPkâ}GIx2(P!{B%eN!9ܬ?Qf/NK%OcµlpR>.^ωbqċp:Ss SNf篎<ˬ$ш\6ףY*֥r/v^A Wyµ(nGSߘՍ2-gs8uQ ,R;"yjM%2q[%N:|v6S'ފ^ 2C |~Gн&YYY(( T[#;^j8$yȢ2E6-0t5R:<2~9W{1 s.MԘS}P7l hT솆)9'ЎGI ʹ!f tR9]pXo{}2YB/h(dYBM*R$/M· ])׭08M^y#ݽ5JPi%DžucH{?l%p2fCa6$iD\ ✅5,4k=58B\9o+cORhӈ}?Tdx9wT,«}}e{Lb2%qvҶݐ=ڀ Vo=`,$ ^ȶ/~y{GI6|&Qq.鯩fUKkJ_dp/_s {{|F&<͗?eC͘{v_x+>S1H erHqSvZҊvƾܨ` ^ Rg:E OO(*YuBߎpϲ0>PjD>nw~Bm!xS'6.ē%0y|'n~]"TR5,EQi6['J@еS6`8݃gbѪxTyǞ+CW_g\341F5j1 r\d1iJ 2GUr0ayJBlf&~S/Eݨ VJ-ȗ~Z"˚? C>BH[fj`##`FP~g*ĿcP*3 4nU hޛb^t\2~ $dEtҽﯘ- 95֞Ed8rlJOyu'/ߝi,o9Lpm+gxqp$Za–2Z!쫨#VOv C_:i[GVn~ȅj̡\'|t}bِwiGq+&s嶬qDn_i^Q+˴doE^ WSRaQrhaC6.9E{chC!nŵ1@ǁnӏuHHaG@ɗ2]w.6iP;+e_5o,XPVܘ5P >=߆7ނP(xTg'М\3 7@697hX^6#tZcc CH\YxryC6θ-$2:7a~1@+RVc)BF™/X'_b7.FU$*.;}6B.Ol@ ~"zF<mP".H1[tqPGS3-clp<h@lԇ]#6Y\Oi/87C+# :X8Q'`) ptW^іl |Yh_1٨ml@AG_ǐ\Pj|eJ+ W:,(Ǚ']$=i0+ EΡW3SDi?-=D%eUag$ϏlhEgqO``%TgNtaka`?e`Z1B8/aZй<ξsZJu"D1i{\7@E@cc] g:Y(0%Bp55I2 v9esa6GCInn X_Q{s5/^IQYh푂:pO%Qa7(?.xҽL!kG2m jȩ[-zGd?t4=X6 L_IaQÚ 4d^R-#h%TA't9F^*b%7ч`ljtLl6 vw z},AkNwKbBKb mgbI&/FZ9y8] =l S$eM+%~[AF5!ڹ'];)ص_]I)>L+ D-ďU M6T8d٠2TD#_K.2r;pPsL|B# d0-]=W(,흫a.GhZ}4RrVFexp\NYB#[:W^D6/qcŃ> L4M$rS{S>sK(/q\Eľ!*؃},엏c68'*T߲EhcZ;z݇zB}v}8!#C{ќ[Za3F"F[~à\z|a0ƚK2e-KzPǬVCq޹!O VuCB+X݇Ol*?'\y% 5;[0Ċ1Gf%184B„n}+adeP*yKCAg|"NX9XHf}pRo/GM <4pӬr6-vj@W~`bD3tlf": Krµ0'&Bb-NK9.Mk?+{;W|FUG~dߛT]XzH1܇+@ig =jPUoO+UUSq#? 6Ha7x?#¿rn 9 F DLlecH<ϔIG~3q|ȔՄOڙ#IY7 lJ|!OyC)r&-tYՉT}F[7d_| TP1ۣYcC :~YϾM ԮaږIEb盛F0x`f%ԏV[@q?C&@7bLe4csHBU!-4s9b׭cD< 50WIG" e-MYJ R_e49 { Is_-|69<*2N\u5ܖ 1vCdUy"՛:屪;$o}\t9gpގT'S]1{ţ+ڍ1KOnUoq2w Vj}n۲n1GnTfrf|4Fh84gHL1leehђf+%{h5Ċšy݅9J3Y,@c\baELoJDM7L)RA/Ģơ+?{;bR1Q61>V# ^cd8*a) kNLTH^),/hd]v@%!IܙogL>jp.@_{0ƴH\r*y)1U\^#+J֤Yp=\{IxG,7)s ]ev kCa: kh۾~]6Y[ǖߢ3JKKk L5|7s34}g|4kkxXQ2W\jBRJ(Xt)юH;4 \.AJКzDiQ`,߅11iFD![ pۚ&Uev{5m,; h>P@P8"N!W lϦ}󍲤^٨ׄzO l۩WPf s@uPL^;52ӧJk!ZD7}Ki G8Y{}0Rհ_z~U.:ծRh}T̝r|9 ɩsE,!!C(^Yŏqo2yU,d^#E E_xBmj]@iZ3VCRr9IMN(n}v2I"ƒvNN[7prԿ =2y۞r#Jr8GQ۲1QC k_ȆJЖ5~nƻPf*-Jfx;AJD*Wy5ӁoƤ6Rh.UTsqcjk#Pͤ6%[H5/AJ~. Ǹ*%-v zIUZH9 EqFKv/k{/' 'S,z5BޠYm#2 ?B-6qyr{vo,;(Xa*ޑ”98}behLyڿuPpYCAcs]wؤSEƹhٲm8_8PvHlJ0Y8%%;A~Gm0]/+VzG_Dg3u'wy{ZbD 5;5OHR+qG^۵P^Lԑ beUn*wXܲjVKs u+.e@+bo,מภ,,4)oVgϗA#1"IR/Ό>TnX-jLC;ͻxK9Vw|h12A P3eBgaS)s`OAܠ`@'*Zղ 7ya\P) {m}S9(Z KtjFj*l |Nb':c'oUYq'\Nt5"8{o0 Ů_ &IPeG+;ø> #vKlbrzV#T2Izj ոgaVZa6e_nS|;MXܡ,J#}¬>!7IBuQcMNE^@a߀ T0gа"čuGw-RpQ驊P"3EHD YTFd\'IFUJ#HTdYEW7Nk2gđ+~zgکE|T@)%p$ssD˭K\h֙>#u@ށp̊1H8."=픵PNeY!amҾh؅MHc DЖ@M 6]N:[&}i\+(PFgi>BBNI?;{. ĕDuem{$1pwa9HDB}4 p=Iej>VgfjO hJj)?YyDJءxˣb?zcٟxa2W8H¶Kjc˙0OO*AS|t9hϱ7dey">1ȸ;su;k䣹c[X\Nﭲ`;W.$v٩lVK|NT&Z92lOԞ?U7nO3MY P$wt1+uh@BT|x!:K~(!C6?| +Tf|qu+pL4rn"LOcnM 悅Y+54il"r wxax9\L~C.v]ޭ#;i](y T:9;GYAyz }f,цq'Zj_U9H]j¿ F} 'Bީϕ-/~|)*w*-(>\Hq&+W )~5~+6*үoH/zh\~;rݔ;u{G EUl~x\T]bzXjW#!If Jnqho ^- kcPY"xAO9E,L<}_Me9 bH[{@s +{nűw>ʹy>zm手+*3P[އG|/RA-:/Btb$Ar蕈f+Cv(僔Q%^߼Gz{fC僂y* 2LpY~^ % {#U2D\Z)X!,9n^ۺ&{,>٭cݎ,Mc[x3p+,&3:m /'GY$"?~ܑ~|%PIPє<pزGaisf }̈́h{CK[]m^ e،ꤟdGX.ϣEkK}GM]K\!l Ȇiy~!] G,V߽0u΢>xdlHTf:P;@ ^uuP.ǶSK7T-e+;n!p>N~F ^Ͻ'?(:kc_]I~pHtLI ϶-_{ j\td2T +v|ݣ8ˋշ Lq"~PqRdEbʥwO6Ⱦmk{WdK{Bs+D v#dhZ>ruG6':'^݄ϕ?s89!3/] W^\cIUkSxIJ뿦( z.0)XL2O,?_]F˗C}ޘ c,JE _67*@r& iL% )mpxqykp+ ~1bGQUarltnsJb@Hdi6tU yn YONA2(inʐS5(c'n|a%,Dzxaʽ\/:]П[ٽMT|`@U#?d&q="K_7| Y2% ?}o[ r$׼uߋ\~тOae,#@\Vz5WO=Mp:wcr"Д |Aqȴ7"bٹ_UR9GZ;B~84zӊla=&;=˗3FxS 0*z@^aBfkP5Hհ-(cF9ǰ*:SvGv葜W+W)WY¶sXՎ:y7LKBzװ;!Y0(I[SH =\bnd^%ѯH^QҥiV(0ҬCܳQ+I+bcT)C+7=%))mm}Hdpc QLNKid8 Ʋ1E^Ҳs fTZep(*gVVgҡb,a-1^X?j zrhddklfeShß.׍_],iwShAqfiNt xY)RI&JX < ty0h[7̈́>O&\hqpO%h; *#Qxa&? lRӦ"-3ZG*uF{q fr-`"XBv@c*+׈JPqt*&ڷu{m2_`^G' ȽHK+t SMS8|S!6DJE|//.`%7uMHJ-_s{=`Bzqp"bZ?‰^꼥FޏAvu%YJ ƭR2of&$D7S0)/lj$Ks\4Yf `JX)\܈^`R|[&*U}Gѵ p&Pn 3N-`SX#B-9W#dہ2qIRFs];|O%f$H`┚Uש 2~@*)!k#z41Z0,쨓ڒ~M F֜!Eslqq&?q_ M->!,~kڶ0*䞱zOއ2_8^7Ւz#/ }UTL l[?,G,B&*K-A ^K1Ulg0A+3:~2bNC$^OZ zXպtFi%֧.y U)@uK)<.PO|I7EBS LzeaJylw„*.5rSW_fsRdMYoI}3TT2r`E\sܓסůښ |G'i4#p\'}v@o^H.1[K4d^SE7jQx+P`j5vlyrGOekōT +܅Uڙ ǃ#G v#{1< "D*QSA>%3=}]EPCL"Q -@nk;kĻIMFOfBa-BհT}L{./緱SiK颾x0ab p\j⨹=h,AS^DAW^zFw6sL1Cާ(kiIJ QqFGnq VMM',A,-ZP M!7{ٯ˓'cpAB\ ?QM`ӭ<ԍUp<Ҧ,r!{|XUuZV˳<_:٥# Uly>C؇[92}y+ELNڝgX~G("0u4;i4az2eUۊ|p|aeEWyrYؤ }祹pwvת8s*YGVH uq蔰hx)rf,/iD 7gq@܉kMR_>MQQ6qڦ &𡙴'J:vA'[O!4~ƯCL.P\[QS&yعnr]I6ThdN!Nta1g$WֳDɞ,o~"gB<@ژ *Fhb{ie.IjalvCFmJAyTHqq) `A,S~6 yWD+Ŋ K ~{fqVJd Ұpc?k ~x$_J>٪&y*:߄Tzy6f˰Raك<rV>}C#ґK/;t'lQ͏g;TQJa!$K u*6 IuH4!\\g,iH{v7SL1=K I[:$RXqBuuͺ+'2H#-x#%UERD4hF(P6pTdlNL֨1WrkF1,ʚcFÀ`:aj%'/~oęEw>۵}@?K9P!sq||lXiM͘C}PbtZ+̦@C4w8 Dr2zA!Jm&zT H,x Xf!3ܗs@PV*dC0棦"xT§}4<샛E rvr*%R\ȪR!D00H6qn`RzBnޑ\Zw݆59d_~P^>eȋ\St5g)x\XĢ9t4dR|Jơ<2M&#Tps+x7GɿYB/_7tɱ*q5bQsn8Oƞ6*# M aSZwT⁛SR; 1tskRl hr.6z(]ݥQ:Z?WAo, O^-gļ jd'EMcduWPPY8EoqQNCјhqi^N'}Tר V>*s-B)/dAڣld^ésSdbUGNs%$> =C\Uśy0lBgí@ʙрL9C摛 ʵ> Ȏ?qK\ K3qT$6dig?Vus`m\ m(QUtxTvH*:yS}զ pO] Vx}옇^,Ԩ/_L./f+u]Xx1hFҒg*묍EV-VcG$HyMB" [fv7qxa*elBUsayH$]gM⇯GӴ?\oŴT`$̤TfᵚhRj㋛3=s拦S ֊W?̒ :G\ꀔZɤoޖ̇H,8GfHzaZݬzgǿ#0{YdRczhNI^3j@DP^3N7d=_ΑFq]!TޞxΆ64'v/$hj},,ۥ,E2(%PzOuB@p*鳦[,˩xvI+]~zwY(iϒ\'2h~Ga!]0cKALtCG6Y ٛLꔙAi4SgnC`E٦O j5Ob4][^:QOȆ+\D =ѝX|'?a ܟ|PGSS\Kxe6?QwMaP턘79+KF"G%)}Q1gX~`4AACG"op2L!1F|ܕt /T:zo[od5CJnVd M3_>=GABvG@IW!ӸW6Փ:nE >ŏI;I}dRHkUM]H? SXy-eF3@P_b$t= oqX,AMy9ICy3d, CUmvN3.q'.oXp*h   UM3;y `̏]KpRI[i^jC]c'r-*˧݊3B\?HŸ;L½ MSԐҁ2˄!UOc`LQoDlrH]xUB. EU,ARz SvņdY bXQJDn Y-i~,+hSi4gTALƚ$=U/nupXUWw%:ϼPqdsW,‡Nwˍy!p'Jϸ+ [Lйj;O8p6.~Gq[K!$*o+U;}C~|.`|Y'Q9|?oց/Zl 9nArZ Rf*{*zx`!Gŝ+^wQZ<#G^M`6XY<] QKyU:`mxSpUl/(H!%e",َe%Ш@=xZK ރyݠ˜+<$R =y?(ir%h \;Dy;lؿ !]fԒnI0U }Ky޲g,{CѢ`+A!9+EmSUWOf"{.B};^٘+W>0`*; =eI2?*ıM'+v̳oVɵaK`F@b: 0TWuXzUl\-BLbe`,4+*p&xw0 mYݝ.ӆ f[7I'3'p3(^S\P9PT,h"9P>ds6Dx@{5\!Npb@hAL?Ԥk/ŠRLf+ʬX 7WuO c/(@u[Еal(A^bTD=OzWe]M|R5ö ӷj]$of;,|˕ o?5Yd"E|IsF A/sL7pHB %'plaw9c&'@&T0*LRd|GaoR. g|ԛIȪo B͞: 0Ha(u:Ӿ$E0RyUs b sJx q 2~Ҋ7Zq`40n{VzFb|6yyLPan<~*rj3a׏OAQb򗻮9IMG\4{j_E&!>-*=Qͳ~ZZ;>[Ns/۳=IݞAt[:qi>}!O+ܓ+QWd&4Q&QKkQ|3HMCuyz(|| cY6x%&5$琢GNX[wb.P؅PO^F$=$^cjpjVtmB;A줖/aD k{{mA\n%|'ußADﭭMu1zs˖{X\ Ar:9S\ 5 2sËCJ45i$(J?fC(F uVȃ 02P,l.Ò?'< KW[Ɠ PMN"ZC}ow8< iZ2/Vw+ P]sE[}/b~A'0J4d3n`5`J!E> S|# 9Tft+x|45 S@?&q+\ѰX3vhQ6m^Gv&W|~MKvJ 4= RhfseVfahS|x*"jVS.bie_Ͳ9:}(\?jʚVj^.ȳ+yL>DigdHV\2׎g\dZɢ2O^[6ш2h69ŐLT&"J !TyzX* QǬ PI$i|D 2Xu{-koqUbTV+.,7K VI8rV2=#FKS:57x|'#idzoؠ8Ľ~@B \~rŻ7 fU_j`a;mvȪ8@4-3Jnpq?!?կg>}ʛP/\Zwd#a wv/E[*H+*^1OidW%#G]L9I36cv6X7[̘JAGi6*|#f;n:bm)ZAD"ۄ&"tTBg(en@NbO'0UTRZCɑe 4Gnzc?!]5wD07VCYd# +2JUEdip6tbg4΢/Fjۺ:R5ĸ3(V9T!ba|ضE w?d9U[(u'ky]a[y]<񍄘бٶOJYݙs&3/.Z>Ci T2Q&Oz3DTGQ[KX&lF#'t\'jJT>ПQn \v[i,6xMRV3*pNŎyz?f&_ӯ",1G쮳uArfM8fY"ūptDӶŊnsLvB|H *%_liU *BB[:{ "笒d"( p0B 3:F֙^6ui_z1THƨ@-Jxv?ʯ3b*11ڢ'X;ަ s,%Q DЄJFQx|RNK6e6̜f,|['_*, C/5$hg˗Oj+=sBò vXYQS׌;mÛrlI2"2~<$ȍh94 S׷4W-o8dΆ)cwLm|1Ljo9.<_[wzVcSُB*4'Bl]-I2Hӽ#| TQANfr35Ef!<#nC,vf^X!WjcI<ݐI%!~S Xi l#y.B}ODgH1S?l H)-O?CXueGI@8XE  `$/=,]UagjiFҾJ*31/˟Ԇ up_ K cu>fY#0A@*cӄ^fEUc^CExlLj7P|^d3M&h;j+ @NաNS-r¼ƫoU߱" 2K]_[+^Hy/_.N]YO'*clzf#QS$ʌ APkxųsMIg4,PNJyBzϭ\p1dLJ@iNLHqGMkO6UߎA&p?F^`KɔAԀrHxRa>W3p8zJtc4$<ю@&Lc,/-=Cw/+Mʑ6u$E*.z*0S4u=lM5  O5g#D6_* fyi7'g,#ЩP]UݸNI96)/Ipt\OoUr1>m5^<6OɼPe-h˩jb{A%`XNaNo &%u#^.%09 hlN b-c:!=bFPF&TQnM7UY7^+5S 6rT4c>MZS3~vK]bNmA ܩZ?ά!&TYgVu*8F6I?NRP; ?kTU _6J Ŵa3>8َJG>11BޱQl[ X՗sao}]t%؍#Zj0Jo٧|MP{Ç&ox+D؉{z=ص%N <Æ#͓>ev_@-H.ڹ!xC;2h>&*\jL@BOe0d,}% kSVڼ~P .zX҅ n׳Kie`8 U1KZWG/e} i]U2E2P~B\ SÇ|ۡ 6QJ bvc#ۋ]s/"%En@s&Y q6' rN`"41(c5sׇ~`ǜ(7!7~v7 I%J ~eAdv誊,5:s\m[G46'^4&i :)A#dRo["tUY 2ZM lc(bRmGIߢm} 9ue q+ .^ytA[r_[7MnZ0$زuܝ}Wj0kR ZEؑL^%MC+VCαяht$}$l0! 9p>\<.=OilSBVF>>oˑ`ЪE6^"7_r-oM!h1dEy.!EҪءb )fթSn;7Kzi `ϙ)0S`uʬAvgGou~c=x9jr'+KZYAiX~%[8qGU)͉t;RJU坂>p@)Jp2ܓ$^,)r嫒m?gmp:rNK(3ז~I9cYS>b/+KmTK)1p0jX]G< f{&~_U[%3{ rH_,&wI#UiooU(kWY9kƒ/K133b}%;A)J?]ǣϘO*φiCb 8yw&L`iQ֮79V{3IjN3GpB%7q*t券׳̰1ԟA R+aNJaAvw A GFMWW<z`3S0#^dzTI2"d>r# $kO JxϺ5j,zE7@H$LTt=:ʧgyIJ{IW')2P{L2ĐƜa\u>'ilZ@ *~3q:I| <+(<6}Mj&zn2j)^H̵"jhIe+σj~zKCh,PVւԢh7kN!E;aw ס3O?˜dw1-yyIhNɓ`,-1cN~C|#cҨj0b[YjՌdDY K=l >vMbCkd*ckQ.\Ht xs~XanH;OkpI>4ԔWQLnŽ|2~n U xG/kQ>7 r]m{JX5CևcBgF8J ^.G*ne4٥{f5Њuwhj]'6{؜Bʝ&%|oMdZ,aN'4@T[ZuWk`|fTb V9mZN&I#rf(YU<"hPHpC4}EE: sP]IE*r+T0a+Ե)F@EVu׍(@H%#A 23-S}CF"q1]V},wd'Ac X32nnij ,66F9fzB<6qA&(P$eytdnR3y:`Fy ."SaHFYoi7%is|7qBezm/% )ԶNpɲ : Mz@$K-?@9 ݎGv]f#bИc4s $ots svu [+b5GM8/ ,}x@f XwbvU=W t djMfESϘ aŋPU:+-7 3#Ծ u{^'{.Gְ}Xp"~]9264Op{TAr4¸H_,.`J\f \l8eE1:F Xa\C]V'JGc&@Oh{eiM@_3q}@77;#,XyțNûvh1zEm)%ΏmѸ&G4jBAxAಈJc/y:OSn!jwpf;/Ręڐ!^&HkG-fR +JU'wwcB9 n1 Tr#?_f߾j>O I~* BB!XۘU'Ec>/aٛr͒an"Ħk_Nd~%%guW#VmQu{w`鷵rk;僿1uG뷸&@ډT=H*6wJ|y 'R.2Hc5d>?e'6| ;b {ȓ0 - X,IK4fIL1;&qgL=h1T5&sѓգdˣu~t.&M<B ~qg"3PpK汑 j{ʄ!ޝC4RA)#w re7m"e&a :watV"BQbrGBqL ,p^5sP΢] };".w;EPng R~/haVA[ 五- 4W2>?wDlOPl`pyW]]UI<J7<:'& *ų!ՏWKb6MG0ANXT8'cv2k2h%\s;֊N[k4x"٧I|Y)y1gV圿c3yRupS>-gDyaDȆ 9^A#ůߛT* [ hJivv ന]?~ٝ[- /gV~' {\C0H1KZ1)=wac[MQ)5+xxd,bxiHZ4vCqAE.k5+?1x>:F''QjvwV.?,e|,r{Q*tOn0Ks̘BOeS^?+mи:樗beyi-h}rRx=AkJ%Uf^RKT !Մc-ډ2w=n2Ccy)H w&|}*"fDX=Hj0K#ҼsfZ+%u,'I1#=a҈7)) ިO#D?~AjA_[DY-@́,<[&WO¦ži)r[l]0, ?ڕY fŋ %Pщdb] MmJ\V Wif8K=8>h5cC |(AM1lCš M5m'AP)6&VVQj ^-ΆЎo7DT8YCݺ[/Ћ)Ăv-߁mMיo  /FYeD*"oH.֌U7P`>{'={fDWDM161T>B,g 4wj2/{Εp,)`1Lﴱ|ݫ]ăp@t>_bi*Ll538k;Z͎+w;j=:7'O:GɁ ݮ{yliY4Lj[w-31 wdH?Ts^h C8xs(#(kX A/dЕdR!iBPCo΄k8޹W|? 8o_!' y͑-mX0٣{d_jHDK=zN'{(9 Y|y[Z_Ce6WȾ]Iܴ/ |koKV<)o/e+"E <٥T_d.ō2#jY#<,f/#zKc78YF6 (XTVľb7Z,_eU:uQgt1*[B?`0v+^TP>dž@h 5|ڌsMYx) i:B/JR+gAE[4fy@H:輒 C9A)ˁEׅO&AE\-"r轗U'8//ʢN}Hf2/]7ďN^)0 Jj&pq]Qj )i, 2f_!&Qj2⨐{ i젗oYg;Auӈ-S9;mFeH|-}Upq*k]{Ul֘ A;g8`j_7@mx *pgE:_1E9b()ګnI@s=2j}t} ;ȍ7-HP+u$ fß;ǵ PuS9`D>wEkh)\s|/Bhh*F ۧcWD uQAH8n2 Gqmmyb|5Dki/ ^x hU# %$oIQ^(OΨ9Pi @톐IH55R ̚v )h,p6w2uހׇF㦨-;j;[!x 2)of6`Xyvd]F[K^ùƱs\s HqQ$4 _at2՚Y+,lNy*ZC-DHEY=ʚ<|F% &S흖%ӝ9ݼ9Y% L8w~c2/}h ZՖdUæ(~Kȱ,*2C;*;ZJl'f}QH ʛb(v@ڬ(s2縅dڶlش]toDd);H /H* >z]9t0R+D\,ѻ(Kk-qݫOC\mprQ#ϱ[YUR$b\73bZ=1}PZ}]wq2q潧HHZh7g$Exɽt޸X?W6 (gjDΌ4"5@)k#m#} EU5N QRȷ҆,C h.+h~b#Y=he#H O YfHy 7F;m͑՚ȹ0 &anbb{Ošo)TIs7 3W_g}jj9K}C#($cV02;NjCyw]V#nK>٧tTeﵽ2-=_FY+d$fҞ9yQ+KSzVqVqKrfvv *;e; "WaN)K-<9HLn^|AʔSӗ K]u!sVFt^\Hz[K+;4zFf6I (NX.ܢy5n9>#6^mHRd *ԓ=@lۤt`Ŷv* ,J4\ح\~$gʾ _Dk *nC:VRc]|J&v1T.5@AHqRG ;mE&.)\S'YBwl)Knm8EPRb3hܣpT٠q475@6&2+y4+]]e~i=UI.lEѹ=TcW$hpOщ ~hf's8o;_n[~Y9ZYt& iS~+TZ+S@Ղ0F@t\lI39Mjؑ tgsL5)+.؊!l b| h]7%?%7)?DpA'oQԎaW.A|DI_BHOir8 Y7{121v3hP`N}~yIj ΐb)qL#Ca4C_qiٓ-ۨ=}vmN\SB'K\h48Mk[>F6 `!L~U3e Ϧ 63Rt\B)t0hmkxڢ(\E©89BXQj k9)rO01`vm!~k~ _b3.t_\Y$EySlJ;'/ˎXx&7=\u$y|9na2>L:MzZ̭$M]bAH xfȺV,ݘc|kŒC&!t% ɭ,ڰFfP떂=\ã0D:TZyE>V lx8up}N?=\Y::gBq #[&n]A{59 I-s_^᳌o/mO3;~ǃGGQ݌VwRi:m::c8mM]c*^6HI~irsaޚDqk>޶GJT3ugU 3= :ר#:0L AK>뎆%gfCO'ũGVRݡݮ4qiGjB4WI n7"Hx״kؑnu{.tƏPjt1ZIt7%?GTDmLK#P}pȁH r2g RB Tqso>mpgyh; =2R˲"lG{Djh-' [XRQu^(IԽ>M149/"B{P8$ŹIG,vUgFS -!ŗޔoXaR*"D\¢Oq/B\H؉Vi&84 rnsU#=8}{1# we]O )^,+j?ύʓ;bd8G<#AݐEgO.D8fl慂E#i!(ff " ӢIE;PR'[2Z-de׵nz"E7v;R)\]-M/^eԌ]pAi+\AS@bYSӔt 0b4!%ZwmT*Q[WM~,0W;6|rCL{6ҩ0U~&5oL.fklax2:T-A˛u?Bup =5kSVwqtg4tS*Ո:Fy#X+ʔxFL, QP`F5Bt5f{"c )ݝeКs*|%]Zi Τer Y'0HU)[u1a|E1w{8 24пk*H2wcWUgm)e43 才I7'I,C=Wt`o{EF]BR1g 2D`:m-Si :9 շ7 >E)s 0m@•2Y`Îu#Q6}GZN˱m)~p/5AoK\N\`6rereR"Qxc_n+Y e( 9b+`^ $5&{ٽCAt6S :>s'Xε-*Y% ƛ}%he١[!L 9#\kL5o5:a lL#5f,X< fLSrC~_-DWUlYҨ{n ![,DV^~(Q83&-Az`!:Us>^e>bC@N:'nvs[N圞G5RRyRG::DP{ɼ[(:vEH'R?SSɳK-^azR}"Zl.]xI pE:2%Rb$AnMIzpҭ&B6[\yre(r (DW0#*~' ׼1 ]#{tK6 ޒCMrПHaf a3<bQ&>*CLqT@6Z6RuUNRC~ bSr!e*)! w/iZz2?S'0SyI$ x@S,Y:`E) ~Tl π]9]JaD΋ʂyhXS1u{!PzǎW~{ƩA[qwh:-0 P')寍Mc|K!DsաW8E]9lGn #wr.[B6Z v$)öqv>d*Mɵc)'8ZZq<BJH sobèMkz\`XP )l#$-!Eϥʨzi=m1Jw !mv=zsTŨtcT0\ݙ0_"v-dV6DXdjAIr ^.fۛcs7I2@:NjtQh,)ğ=uUA"o}Uh2$v@H,ڭ-N&ǝǦyzي5hDTqپ_)BZ`m '_鮥Sm0ZdYePرTb PghS [1l/P&f=>2&OʃYi"?bP€0sWϻ'q?Y `kSց41 \ tQo> &&iMp:!|4/qϥTjǢv|;DD֫v R*_5xc˸8y j9'}Nn= z{7wrFfa3\İɵ|Ly$y71Y#%rqE U P[6h akD&IW='}tڢf=/^6 :$Y0}{u 0R}rV[Yf=Ty?ƩF5%K"u&r-Ix5%8-Bx/:E}Qm>yb Li85~^>p_5¶"#`h@j2rt1}~ԟFXT9܍c -rD?H 8ΨCniZ/ G o(l8>16:cJҩml3nJ;,Z>J-^{i|drV8\b'ζٙg j:D,wLD~H3P]$Aϧ%sO̰Rf zV@]aʂT@,5u|s!H͡W?4}o3TմĘRݱ*#kC)hhvYaz^GѐAkl??r'q9Šĺη#^HQbB^-5 `$!-x(7a6Q j&]*" o6X:gVl.e:2^Q'"̬11C"< 먤f2᷹h쯯Ԕ'Hqt,BX&ԕIZQ꩗_|@iF4m"Shi/S"%U$(rfxg-53dF:+CÔ6RR˵RH'6ǚhE33zMMJ9 Hpm'U/ɽפ0\'& QtKJkaU~tHH[/0_)NR-،uĪ=mzR=.YB[4Vr0֜y'sbNڻUe5OyXVZpqlN!H|W-VmmMe܂+tEiݴ x[, 0:2?[mL({& 0V G"坂^&ٰ}/gv2PT^qgێ/"kcPdh565rrnñHMt훮] haTnR+YC~~ndp[qhê&kNh f\fAށ]yrW\L+TMwq\,EAfu;>y MiW0y>A]B[4 t)yCsb2J9z]oVg 8RO[KL՛hlzed!aH~.iKj )E'I?7qib4fYW 笀|_]54)*Tw$\nn8vw@"@QL?BEdsnx{N p~ X Y>aO-7en'}wZdIMϹkdTvV"X<&AQݺ17d$13&2 Vջ xRiJuv8˜. yY_ *-ږ3e\dPD/PZJC}Ͱˢme3}zFva=,#!|=mLQעaV_RJ04K'.0}OŘ~G6`85kT0+k}Д6*Ѐ>#jJ_!5.h[=:/DR!թ:ѝO.UwrY -Йsk7 Р}v}VgoW< B o/n9W@A~9t\Q䲺BLTcq&}xЩjd*r};+Gv(T4ax £"ĥ/h,"Ͽ m +`@dg/Iß(21H',-U֏r/CB rۍ< CH~ TøR?Z:ꇽK:H9^y Bߊ`z&\8RE9N^rdLs_ -zDʗKX[lRq_X lRќ{z7-GRtyGPh\) P /vмb)ei+o.[eOE'g^&[?w/ Sw]ּ?~Ra|7'+ 0B\OCs~EWT ʰ$*.]z:^sv:zJT&B?xfԐ.XCYbE'clPig豄x85( 7@/ҁ .z<-,iR%:i%ӻY גXAɍyژ3`p<|*=A: 'n,#C1./{RS_,*5˯IgHIRJ#9 i켙bB4FX`mL('[0,+Z54k4u[cQ,Sʋmtkuڬvl3e?ŁiK9GΈ6OKJ+K59v4+δӃXNϻKIVS2BY.ZcH)E{wVP~z9x6++[JM)"d+h<:=C*;orٖS]&aý;y5P+q Y䋦*6Vyc(ǮŅ#Ԓ%wrtv{Uox';K7 o^MutJA f6KN,~R)TZ5vb7khdoy1~ZUQ5 ډD"B$[etE6\Q!wF8]ާ|TSU͓%c}#+P ebbvܸY@>.Y8r"`@oIQ&[ gZH9Wb@dc(anJ1; usHF{XrɾRӑ,9=mL. A fQ`4Q</PU30O+2/Zm<ŐسY^!0{adtyh ~&?RK3\^Gܭ ̖(ǨP4RAC jw?@>"zˆUIK ~Sx&FBBߟC?Ñ{^ ^#SH;4uLK&{x\z4uvoֺUϖdzLҒUh\2>^1D_0>-PAGjfosAj&vl fN#R޴eo&P=߻42"(_ cm|;M܁폮GmG=߻(B4bʪ ޫ@@́::MNyw .'p3R\WD)\#Zv !pMZeO&'KMv)T<;IPˀP K/";xb]9}~g @*$UR 3L)?p5)u[h)vOnMҋ-j.J(jlՂ]ÙMD#Ǿ~젒QJtu<0۷_in|O؝蘼vŻ<;'T&RYeISw4lS;k*(RQ= 5>u!~`R'f ã!(Bsi)([Rn/PpKZX^NjH9xNhیILf;HINNã&^AYsi8𻏗S Xg R{45N8 tr{o烥D5کaRn~Y-4<i| 剒y&ie2$+d_gʇڸ +?E9a~aW=&BTU wG k/<~MO}e3]ޑ |k MO lM.5\ĻtBzHoI{ؒ(15p<\ubDxm3IL}YQ/,?/x((:>H]o%%mGX'nKl3,5]TDwΠ+(2`"dbλn7pBQCŏBDXt.] @'=JZ:Ȼk" @.*AF 44rcźo]QR |&\GO rKMr:' EIבPp_ Bt]"<'B#5%b@ jlox(*/QBeKHweEtFuw&qn'KS2X#w5mvXgbe5NUxy^H;ª"N @B~ ϕ\-d'{}<4Σ2 >3a{UH1WS̷ b-Mn(zOVm;ҽJ7ҁ +8X`?D-pL9(#8˙hkޓeЦ{o(2\w؞R 1}לi|Xma-<EeweP6GhأjZ$t:*h7(z| l:,^{+z$+}z)"iqoCs{_1jd4#Fp|0 .,|dl[h_a)>NfGz\/pwf' 1<]gv(*okst|N} K8 1 p7F;_Yۻ`֞d/L<>]akqEj ([#T 5,hIg>ӁvUa UOS_FM!kef\x,Gl+\p;ďs6ZW-UӟnYgkBaW0'(ލR&,y;]RfJ2r $Nqw+ui/7xC1V"<{ /!ʝS+JΜk!ȓih30I%)Ӟ'Iփ5gpeJX"($Ѡ -HxYlWSw?\$ j"4̹AJ"seqX0[XZX$ ߝ-dX y:*-H)Է\|d m!V?jWGonti:2}BQ%ߔF6[tZ{9 [qs.PÂfuS-o. Q@Cܳ cF$f Rԉk@n~l3S\b89aծIw`y\?Y .> ! Cd*RbA eG[Sn#3:q9wa`ޠ鿆j4G)IDqlAHBxڑ< N!$ ELnFoH,!^װ㬂%~es:9%>dE8}ypiewykRGYDYû]Qo|~>E՝GъIؙfVN|~322ΣQSd; H=I5Iѡ: `M,$Ws{0|]%3Q]j$rO{>B-AMݽrέBWsSvc5rW =䆾ܺ́L2vZv:s( k$d/(p8AP@ c-i0 NuN݌. dEE‹zśdK= cu{]?C{ ~md_mT&1s(/R1 /1IG@L?giW0Ccns1|Y\rH8ouRE%a_S%Ngi;@ mےu?myWвd_ߋn7d7EptMOu(,H2qHz vIq)?F RUZi\z"緳N dPͧ}D,"Zoz}DS$:u\]uh5 LƜϋLʮc/d& pun?Eȫ/N/)3҆*hV3J5&<ɠ6Ӏ7Ox€A״C5lB?i7(~3bW>Tp}5d!FZ)j]aʱ!JL#Jn.&Kb.8C[Fp@g:x5CBd PVקꮂjN>(@wޏΞ 4a 23IXrG0~~ps^E~J ]\S9"sn _[UT"sӔ.RH",}Y'Dq}.qDTՋBhW]6 ^Z`lMJ`[rǎ=Tn1K`qݐBT'e v!W{~n‧~YcOY:WZQJm*27HlV)_OKQ>7hm"iA XPY pHK2I7aCO]nCܖZ %#MME0 L@ccB& 0/[l2[HugADQr}0`:s vm9EN W5 $x `f]:yY+f! nCvWd|]/I\V&5Ν䬋~7F-!-f\ gnyW`* < ᴆ`M0h@Ҧa ިNٿZcF*H-2iTH6-5v euOFoE8RTKPyUq4D%$lY-K?R9dgqqxT3 LG/CAd&(oOpr :&W3%Z}^D!*D)M?fBw7>Plf";MFУ#ʊDhnn[aU:8h*y$R"U߶68v/.e\hnLkX~ES܈f{IQ˥!Dl?$!NfBʜT*s3YWgrhdG?f!ad ~&0uԃR{}T5; P3ʭ|0Q?A$&(͈O[Wh^y)E]˲+]bڭoEҒ?J*t`x Db.oe *t©xjDk&}3Mtp GEH~&ioDٚ_C^be}$ @ͿOrsr̹-.Ic) EL}V-)߼W[2;5Sݴf`oǩ}kEdr_uRјq$M%9x9u뉋[gt͌oV[\trU!g*4^qPe 31Tir*'Tm)JҢNl}![K@uDn`yv.~j.vQbDPv\(0/- Ycߠ_O'a5|ǕGU!ʥAE\ . 累T0o.pW1/LC{UdfRN;?rKf\L;ՍpR;>I3">1 y+z SBˆO|]R>Ԡ ]=%t9*ZYx;Q߄x?"P}_H 9`=k7 H2d&uv@rD-,cRz>@]ؼ!+o=jADV,VֻrWŵ~rr NEu8tf 䜴eM hX<.#YkY0}n.deiN=YiZuiߏ*~Q)jw[ ah^\#ͭpyq> Wr05y[Y ],\ľ|p1 kom"K1;?&bUAߏrUkLLhӿM/䗁JX".P1 hl)ޡl,@4={i u#~"㺣asVbZfG!i`vJ҅6|Lq6{cg^.-^tJGy=IiYiHsbelFV$7ȑfP  o8TYn1ذ8Jfbhަx !{t˝jGgN+b?4dOdF~Bgpt&=E0[ S+4f u{;vs& nv NX>̺f;zHUȤ;J0fTV4#eaA'r.% 2rX#&WJ=`S\A7ҐQ=րd&'ftc-Ǩ%jH9fybh. SSʰ߳c4"ԁBd'l&& ~{bc h9թyλ$w|c&7t㢑2ғـJN^sͅmzƐSE>k*\@T ".mA eJלN/+eݺXt~'6fr 1G[v>=cӢ Qǚ$R%EZf9$J 0Rtn>ch |րF X%C@ϛ;l&e#V3H/Ee( Ct$yK݃w6ԫ-!] `{cpnrdLiwo"ՎHYDTgZiOA/=h I}L&+jb;O); D8P]3M8 j&QJ5)c'}€-HSuk#.^Ukե ~n\k o&ߝ?g8\cG|ŖҁGc(.~EF} y6戽Tew k_Q5PUO8Gh; huŅ?,[0 O=&R{xm%g%kV&0" ðc!Lt6jӂ4+{Q,jǭb{wӴX+YIZZ)'eܿd`03B# QßYr`Q<4P :K6闙ь^cI75 -rʞ왢V)6o~_9vEWc x$dlhHț 5nI( j⯼j,wjJFsY'S-4'#$".!_6:_E|3o gDNsF\dta6p>[Iaf(䫳PRiz 1{مaKȁE'mxndN@FvAnK~4L4ˈa!O{ckA;bܔn~ڝ_4ښM8 }ѡC "Ez|&PK3v(A=aQ#yip觩We g)|Zy7%  XȏCGD ~[Mr^c !>L2~b95RDWdeŭRr]V7UQK$2!*.D:Ԋ77 -62" #5E_LSU5)Y07=s3^/&`S"˖5\b ?8>>$36N+ `V\кGFuB i:6Q^ 8i6-g,-GȱѤ?=8s}Xf,irCn\û<#Ҟvmw8ˇ"*͑k}/ѓӔY_dl-͏4ͷN `ǸFEmRU݄W%-Ffsy*gw $TP[Zz̩2"&1'F񂯇Cp\?SہT bL0 ?R[:h1:-E&~ҨJӸ4k$yhhye`RswԒY*s6BYPH dmFkt}_e*&;}{VjNoւM-<;`/,FE6Y0W"5XWSϘ4Ұv`4d4[w!M*cv6˩Z) !=͑Y'T4K*lXnlKoJNez}3UacƻvLRv:DC/+?.p݂Ryx8i,oX:Oċ1dqEG.pkw@] [KAt֖-6(T'?pį"\Y^ Pfa0yx]w&]Q뗨>RV̪7|tlv-FNx~Jcc5 d?4d$4*zjj?Բ3hC, GOHgv;g~p%T@Ր\ؚ>TbveNKGw3KimB\LWTpƄقQm P}ܼ}>ƌDsǏ@YF^zj6yt)ƺ~mk[K~Zdaܿ+rJMφ}[2 iJiQGU :PC ԭm%u/bINdA͙<六>3^::mYΎ58i[]]Ղ1iRB'(H;@!@iBSN glbPJM(2wrjF#ޘ9gp6Cc<͎T"}eFG"& n拱%.<>`KDM PQK,kK:K@NₗF>^ X{h#H\fzڜ0-S۠oV&e(!ƽS6%1yqLL$ Sve)q Oo^"T ;xKj9 .qNŵ Yu҇6w^*5@?{ș=pA<]Ate 0q4YNNeN=䅹)r4à.s^jA!D戁}EmGQ1/TR,O ZUD:|b T^>ԡ0d!^p޷FtUadZ;@KI&m0~AUA9ǿb/[w5ZtZ= _|/R㆑Erޟ ygW-{|"Nw_vc{GDϰS! T޳5rpI!pT,"~CG|z`< K$랅*~tG;=`{@(#{*.t8RF>ͩ1Q_Ò~Z}[qJ)7P2~5q݅\f>?u, tZR/r.6@ b4c\V i1W>NC$\! iB~  #ĕ^S!.Yj}r7#e/7e y4UxZuy%h<|!Հ3|dh)uPği=/-R-Fāďe1ajgKexeXjDu"Vu)qVn3T7@\OϽ'!xpc8a%f9(Ű'0=1sii7ֲUA2=4[ՠxૠ9,4a28(=6_ g'| l'} h4h|>$AC, !#^rˌ c:31=7$v*/ k2d}] shca{>7f`':5~NZj%@Lcߔ揽\Sz>%쾎\{}eqI4Nf8:}PD2$7BaӃf.р[7.#pԻrz\\Sg[B%X1E7EŎ44D<)r{ T[ C k2H")TQZwA,ۦq.Je)) h/_-#L p>op5ayƓ^< ;y:$Ho&+=zI"P3ʦjbUCRQh!РcKʑTT)Ytp[8Kj)MLJxZ[몁B<~!f"DpLj$(PMk"+ =v2g:ᴴ-MzI8%1P\bLh  /Ъ<;h"F (g].* :2ؖ$)+j˅ +%j+EF:x_:3*iLOt7kҰe$&|/DꭏY!Tj%(d%X}P \?JT'iG-#n VhoDSJC|>^S?Y dE]T7]0R4hכXBCj^?`9r\ wY%97RrURr<0߀6^)WYQjp12IjA oxFFWxs?+݀z2G7P_eI{c[NVޏψN 8:&[Z\:3ں`iE$nsХ-E<4Zeր700+P}KDk:1of=)" 2)X۩L,MtwiFNld96$rIJ*HoD/ݣ$︢5>f9GF‚ܐFDQU`~!j} G ڍ17w,iV*ݫ=SCʹ{[2kiΝcb)j3sANo'O/,Z jfg' Wd0G?ma>ͨ.(`C:9R9nmDk`is[<< =v)\ u)&Q_/]"e# |/|PG"} 4|^ua6(Jn7 `(qQs^Y/'f6o$P&23jvob/#p%-b Qmȥ"w#Iσ$Xzn7{z4:lA%cz+v XEW7R@-ePNߖE )ĂH/"vM%Yyo^JifrzaIF`Ȝg"Uks4AO~T;a#JA7L*ql1aĺU M~=iwV+bzfyWTWHqW"i(fP5A·VBnJ)D+[B@c;VNM Ѧw0II E(-/Cj]Rm{A̾KF +IDL@t舓!\پxJ[0`#lzs HVּZ (T2&yyGr<*RL:Gw^?e4zhy`m PhՃ~_a-M%ܧaUYԭ;LJHa@ ތ@P?zH7 .$T P@-~~ffNbG]f+RU@ #1uuͩ3 x P {Eأa,E :ϡ0ej0Xk;E=|܄?uWnO9cbbG/v%m֪##!D~R3V;yҧDM%˪Fx>J\ݿǰ eMC[! 3S9 E)nRuG Q]K tcXmј(lq);w(x8muOONXͥ%G,\0K 41A=%VBwbh-IYuXgX/~j \>H5ʔYxϸz6(lʠ![Q 7̸C~]R~2 =٪ 㝏!oaTQ>M։; zIO֠w + _Y| o炄ftZ O6c! ;h#. I`tkEݶ#[JIwu<o1EpA@?k0`Ϥ-c}V0c=!hAL#~:ѹ`o+4[i =tzCU@#m6Ʋ jfzNAP`*")R?bB%TW]潄ToKxl;@fYWEcO'_"=-Zc,IAf)glPNZ"QR8!QB*72/ڭ?wzk: 4 ci\{7)5aܡSZO1o~Mao `z|=d8 ߪ(vQ,ХIcV,'v{b悬Vp p! i u*d JMJ mF$ {gL./H'S[ D͍ɫAFcYM-U>R4+/#d 5qCpK 7.S!!4A+3Fğ,̧ͩ61I]$2Ox_ZBn<*h0l39ֻMh{@WY!IZ[D>?'+} Mf؜Aul= ͠YԐUG}u6PKgw nܵ!}72k^UziBiF x}DZ5ѫ0~D/å1fMv+Y[ &{mR]-օk9;jA6dٟ9Ke@}al"(~~Q]4GIl} ܡWSa2tnk*.P~}űhGƅYV62$/+At+i孷ݒ;*oOʹ,ᲈ/e80~qz(grfgOQBbkʓYviF\^Zda7r>Kn34l7MȲ8,(S 3{]|l2=Emf,jCj+%K 鱜NcQDEA -nXVklaw `V,Wϳ^ D?Bnwv{&i"54BXY ZSr! ^m뫲.g;V\f2M=}J'Pq6zx1*Su%G-UB~$;L&DM Yp?֏5#lW]CvbV=(hm6O x A.ECBdLGP_'ޠK'7At.v\dSclWoA/6Cxilk }h&} , WJ+_ed9shb Dv:ʣx[s߃3O$ɷ696wkH#3fi\azIs O3o1.b`]Iߧe* j±(f CF[W5,)q<-=$?IMl| 0A7h "[kfxJthe%`ÔISmlFՊ|.6dKϴXmQ"%n 6ٖ9wS\Z.z2Çc3\'"Ac/kٿ jU,h4܋XlLFMD ت')Ư7U(A#=&Cx L47'8F>i矩6tLOlrǜ)!zQ+̷z )!@^e>Љ>nT Fbc,N eV#ts}FgY_3)|@왈G6D6/WODh-tlF&_Day\$+'0aqltX2:Ke8xSɀ(dgϴdVq)`UUY^L,z/ө 8-X:%Ԑc^7Xs7RvmGooYBѨ{@B{Ǘ+iKC:Kl7%< $LnOEy Ν$2#eqkB1l ,,)g֛ho=)kdQ eOiq zo!IJCry#%F/ԾPzyЅRuȻW^_D2Zd t']1&M8!aI  g)">Gom̽4Qd&*=;RD_×,„"}WF[x+kg7[hu-v{kc931ZI tzuLكc"7WTlXɩ^wz:C9Kz8v. a/q5\AGՓn?&8ɨ?rZ1b2|/Zu@lGP͚].0p5^ka#`F*ٛrP;1hYV*Opvra6O72W-לް;AiAJ&R"OD(p1yߢ_+B_>7X@zKD;  S뀑]t*#L8b;a#Dsh2tx.UXoC!^j@5, >FMcS1T绻FpfXP*t)birH e6[l=ypDu},] so73x3*Q]P@󦏤< Ul`۫,I@~ΛiULTpuF*ҺKX>Dod{Rw9L EJoBeƭ\< DyaG}7Tns/ ѢFj*2(z@4s X|NVr $$ye,NU{a# Hs UZz*x6 {lPy׹@@ސ5s0B9V?(µglRfW59 1>wnYEÅ+c"d߀0@%m7QoHOghQLo-`>UxF5[7TON-'g j@N hRxV},/ڀ@)eVvAev*$wInVL+úz2ӬD@B31z<˦[' hV4L8xHnS `sZm"5s]4AbIK(BKZv(45Ӻ6%Ap1Yt,4J0X(wPuGCmEhsf*pSnL]s9?}W#S]҄PfZ Q$ocELl`AU7C_O,[ݣ|'4dNLgҁ?dX)_U~`\ ;!0@"IJ@xbw?6gEu:f]}y9uk]Djk[%U)]dwқ8@ W7ofV5sz5=l}i\߁'XPfѸA- sz)*i]6ndr:C fnOq!&0sz  ^/vPZa:8mw'aԔ:>^%b?zb`l]sҫsņ4xOcN!'v(3@`X m2KZ`) L 5l>l,QU W1q%NX@҉ *1Du]^z־'t!<69d('sҏ=%$.pr X" )Z$7xulM q9rUIc*sJ5]녔Rɛ׮YsB S#Uj<.'?DW<`-+͚ŎEVR\l4 G`~~!vee.6(ֵ޸ɖ_OXEK .RNF!#_eME=ʲO^hPTzt_!?ߊ{@6qV@46zn\lrONxe|1$:̺~F:f):!a6FWIa餡{œy%?҆5`X+ lq\ÿVmWJ# ;$SƍwZ&"u=`+ij9u6g[5:qH>ry/OK89/ia_2 Fs栗!>5WRF.\[83XUA(r3d^,;ǖzj&sz_i<^dK]NZ>禦jwt+VS<5ՕZfqdA&y>S4BMaІÊ+OTr?Rly"A1  ~I'Mko(m(y܈jt)aOx!H&6{54[|Qܳ.[xt-lL{`Ĵ-04+"HuدW-*܃"ኌ.wL%:iHӃ-'21~kKB9T$CO&2}%TeV?PuZ@:su$ y  <ya-ⰺ޿vi+owAں3Ev^rLͬpj |ao>gL wc'K:h4;x ar>%e0AeȕՈ0bd)QL6^>EۻoIV5n"^p{UAUE^{PB'>L6 }~nD0)˙ ϳ}SpI>\O?Br[ן/ 'hNk !)-$?@7hj16a HV$3 0}'}Ran_H{5tDk(j!J=NQ*AJH/ݦ!:OxbR/, ὐ͐+aw!R5Ȕs^6L&5>Z)Iawjde 8DGVQIm,E]Œ|\4l0`[/|l.qԳ>4d Wު`[I|+)Jz4 ^3^̶{q3Hsq@΢0Km 5bq2KkȾ |d7c.AVJUlw\%2_)b1oZ:y;A D"t1,E&'+Z{Ͷ\+L'9%Xx6^d;d UUE}uhS̍E" 3zwF9%4<{j R`y!xQV5~ZltSu'x:1lQ36H9Sgx0(/xH8eE\g{u+KfaM|Kjݮ?Ѭ/$%`KW '~^s*/8nT8nĠM+pWnxm1Vg7FR7kL@5Ha_<3ؿr~*}BL hhti4 rTGKQqLPM}mH >*ǂ zm;ҥ/$L-f%Q&.PAwi?U)^]emØy+o ~ʥ}O҂0_`!71r;?l[SuM`-y[gޓb0=w>#{TAP2H5ʽ<;+h9H}b׊.=nnHR;gmsAصَn(Ǣ9'e>ϒ>TAq%X\,/傕 A?E@q?x(:Z`9I#P XU5xHx'o8Pi51$s_Z8saX'S,Pa>hB쓩oʱ!bN7_LP^~1h{\!UosKRWٮ{o?ohKXS@H16Dz~g]™a-@*Ki@,:ҋ ,=˅$܋ pOM~fVps1bkHz `#!7&,oh>~$JZظ^:e9 22 n2.,#1!cBR|&lS3u=XR 9BTX{!o266+%z:R9GaIOa`b}F%/UuӔSmY?7p%Ylَu0wBވBjn3U䧸LMBL_qO3# 1LG|Ais=pVL>=}ow5"9$꟩e#09 ;Џ`ND$ /~T7y@ R~LP(Z!6E4V} o$f`勯ql{MhE/,Pĉ;<#lR3,ڦߎ)}Vo }3l`‘S{Z5ceјY5 :Wtc-;b=hZ _d:Pcl Ug`l<#?0AS[a~(ALagc$H~t5r|P&iA+RUUOFEedo5vq |X, .J H&?V-`۠cqmNL1b!qI V;Z%.F}ߕ*"ͣ ,${DjIPlܨZPIr>%x2tK`%{tQ *g՟ZbU2 7{G|Z.x}r<>bWx] .,7 Qq;AzrP >"N_*b^ij~Ȯ<.G[ȍ Gf?նO*N_B<\Hy9&63R-DHDzpn/_+G?=pi$y^/훹)y_AI2M{2 w6O81.[NV1?C(܎:ج4^Ǫ7ٮ'^N$B[n6; KcU`]~m$s9|%X o}ee0/A9h-h$dƗltPz%ɟK n=H}ngSa+>R9Wl_\k33OAhKKl{& =wVXhy}*Ou,r:EzL31Y++QYȉ@BT?Dܿ16ݴ;U-7^SlVBAQ7H'~&:PJD3(~L'S} _@@(+]qAy[?ntz;<#Sb'ihFɾظpsfCX pQ'FoهqU#׿a0pO"[{8,Gl wrQgjKfaI1OcpsSz gi|kME"3*@ԾL?PQ$äw&z_ڕ p\7.G1x J$ y;˒eQ2_\9h 9S Tb[~P({Kv\iѷ>E`-Vc>)K颭bc%Nh>rsPwzu2K ʟ4Ps^|>;C2.Ѯ4<:!1" T7#Xҋxg+|ռQS|F8Gf5X5$o6cF*2+"6..Y]Ȥ3,S. L|I҃:{'Fm)Ņof(VG'$o+6Z|o0eIevTNJv4kIH%aEbm[{BV7])V]ͽro !`5 >Y4 J&y|+38~,vMm5r& ;3RB'+wE`M ߤv FhQqHT_PSgK.x,`%6Tc/ͨl-<:Ovm6HMR٭8$VB dr1v5"5,24/uՎUBR*m_˚s_|tRNT$xMiKpuâSG[**( q ONTfHƠPIj޲  8^G1؂cUx uDT$0a]yocGJxfI2|gT#2Ȍ#5ShVW2_AZ0֮xhͯ/'-pc1g-P댦0F= {d|mzm.Xfiͱ tW.ݒ*,e.da.zHTEx OoEVv~\(gpG9]u;UF  Τ8Gr @-83^UsD4tE<.50ĔcF롮%e,!oFBRm yo0RQֆ"cOpkyE%-MjCL Kg*k.D61l.'k xsJi_,Uc$ĵo~zet+퍄_8 5ώOlCb ",n5SÁTfCe(uetP;fldEy{NuNMvNPH n (t@SUgAP9z|EO yV,2HnQx8]SZЏG6c)º?FUA;LC9ec$Kό 'ϵ6ԥ6!<h1qYsUtXPssF*3 8FQdbߖ͟𛢐IĬ=i䍌ڲNj]O [x5ֈis+/$34NNp6@L3ۯk|4mږb"Sre7NZagNDƙ4L˲UJgy|_Oؒf/ɦRNKiS1K>5l绉Oeg=8 sc2P:|_ݻHDOz ͫ.{*̻9dKn+rS?IRww bkEC#ͱ ;[b3ҷ6 -8chT{սvnx hPs2oajWazL7/Ol7)rēv(ؑD|rmHjI`Lfe*!p!Id^y2) Ɠ )F'縵?_TIG}|x#22 -lRɁ?+G`HJ@}FDF#ga I-$<+xd1m$9/={)6>8t:亶dcZ:nO8?$fKPؒN5$ZO&?tG!8}(`xüT%=fC6BY#dݦkbw6Qqq(d\p=i -dV$h%϶!VUy2}Vy=j֢Q3Ih tvbpczbGFľIoB͟'Gr$ҍK|Ag$:{N,dazI^ߒ<;@pw 7W!byN:ϥfMBc\r:\;wSĶgk\*X@-8UTZV_5ĄwI34:w_ҡMrqRj;;iUMlz4!I^R_qyr3 U+((Bdn H@@hh}Ft݆!B-Jfi_r? QUDUj @엘y09\rP.SΠ.nOL2ˀьUJ1 Dc\S~O[av SDa4zAq4ݎZjyP1|x,Yya}AnIpfN/4~ziLRJ2۪ueY(Se=hP' `e->wJ|aUԡBKHo4bY4JN!@P7v<ז?v,̱KVFnv3kk|t4˝A qFK>4v2uQ$GqsX0h)_OiAX/CӧVtA/egSqdDWOrX͏A`˔yNIlGq?eƿ"#1%y -jH 6cO_|.?us-pz\*P8?;/8t2\n&A{&nUZopAKf- 9';#L̮8ѶSSc=l[<`='-q5Hbn6'mDAk%'x]F-SIn\ҽ1 F蠱fr0mUVc1PZ*W]S=!sT=YA~io &:IZ`};CsSK\WZZI[㠿!]}7< Ml-܃4a[n{B;fBR?txTYNüqS$;j迪LUץToG rmAgGeG1 yaDyM%iq 2`Q&@1DoA-kM!%i}(<"fϧ;|7'DIF'4W.v''XX1/ky k[ tr0TilZsNKH4U)vm&fopOHΡ;? j|^|`FɊ? /0HɉjVoy .dHCؠi{pxGV,@y/SWi4ZIXr~y &6T䯟thw- :n8 Դ96U(amHfcsQ@8!L޸ T([DO!RGk+*=4JlDh kcD¡=C鬈M_tG6A~&w:B_9]r׵(3MX24A2%hG(hK9(j\aXDb |H[$ğD~u@ct9vZ4]fBU:z8\ HWo orVV)Gv]dn\rP_}ĝf;8=裙2`by8"KaםG ׅӻNdw~Dg#F&2Xޚk9NHr;S4o螞/ٗzWaw(i)T6߳)ŷj1Rd9-ZZB)ޒ‪Lbg3,}o m&4JCE/y4>MӶƞ %\lh'L0(#y>Qu+.3TA>MZI-HB tޗ5*}cCȲ+"<[E̵ʂNDk1f/gCV(;vҭ\Dx.S? bj%RxwK P ,8<f=?cJA8րѢE؎S8UW5~bGpVFhƞ}g'74bZz:*yudم|j!U+#d8bm w|#!:H$-Z`ҟ.g#dMFXq3_Wn@KY a@ _<RŶO(EKSğ%?ժb2olo7ydῺFsT:6IAd#k 4E*lH'$:j< 4(q,^IH> Gi;a8b\w̐p.`=h.I$Õ/JC까VD;u >6QME,Z:g629guY\_9@M=U[B[ .[. }i#p W]E㥻+Y$^bd 0@޵Z8PQv3 ]|0HbzZc,tkD[[8Jt:D?VU F?fU!QR珊xzGl:t?z3<[3 {=}q9`Ky`20Dӛ̻YCJp@:RXP5]lOL"(p'tԤHഛ{˨XVfe4՝*n7/TE hSsŷx‚af iLKVOM~پitQPN#;=`Cf3 Q8ee7j]MjsFvA~vnz-W ^9eC 7 Pi0{/7)U/ޤVS.j ܌?gL_\|SI*&9J`XlvpCYXxH\㮇Vs3H:d0alL0͝9'O0ꚸ(6vy#HhL s:h mjژeMba)6G'T_u\TIڲ[DDw`B!Zit܁0"[$WUOYU>67qY̒il^"ɚxOSwM'ݴ:NY@/ d(A@8λ|Ž>1-bqJGJVɈ&/޼lЬ"/X-$Q1EAl*IKTOT|6I)Z5¨ʦ(!0XiBlOhLLtڵl0gk ^.Ͻ%$)R*݇Q^f6bc}b v3 ۵dpE|Qd^&*ӮH)# d߾8=Ԣ!(%5_J#@'ym s!o"Cf 7ܵŗ} |1> /kεBSCt_c̳ H)Hׄaja\ 5UQƢx:(>^ږ"JCM'](2 qzIދue̥ 鋷7jb!",sxܽ+aQkORŠ%z*EB},S#fezB&aGݟhZ;桂Z|}Dr`lHeN+ 7U[ 5L⑉[$qHݳGl~*isf&7Wv9 gn֕ p TԶ?,0OKI2s/bROctzYjsU3oX+MYpa9NmC"%SF؂W@g8&fqw., 0m Bӌw% /e&8NNׁ4rnL_zN=LšA8H03wTJ#sH,i&1#Ha[=!v٫Jy*bXP1?nq 1A\5n7!Mksq2"OV=aft]٦!3g ֠U+F@7/x鿏G^O6J&Nv"\O{\0KT_SKؘ_g @s ʊMRG7/"%Ѽ[6jgOc.#zˇʣd0hr>FrR;;a3"eϻKWT[4!n8-/\v\!H)-SlR$Q/ me5ju>Zka3̭,r.DhQȑW-Ǣ\%bcfpe\^ʝ`!!x3(ޚF5H_ d+xio {u @0c1jPFc$heȾ9 q&!JֹY 59#691 X:|lМۗY-%elUؗh4FS0R!+1%D-D.S1DT+W[܌neѓteIZɍggv7 Fj|)h`eԤ X -Qp|fmLЃPӴ)r]&ZL~}ZT>.i܆9HH ]BR i2Wmpȷ}4}R~̨+M,6%-EwqSa:BJo ˰ՄmU1Pe_ߤVb%H!;ǿԏXJRKGf;pPw Iڊ#l ,`PpTzIR!ޑ<ӐH}3TJzi2 L]GpwiLF@Lgs'Yˎ/'5dDk*\J6 k6_wn{1lgR5g2Zi{ nG&Q%4f^l}%J-@x+wʺBYGmhKfE9 PbsgnsCO$d/ї3)k̍h2wY\(1|^/b} D lb6m&`(^MY*2,m姓c z b&avۇoIIEG#5)0 jƊd``ڱ~ Ҩ|( h#CzXh;[w<٧h67DYoLuB$dkSxrw06`sMkXHZZBW~X&3g9r̪ޒJpOW!=M%axN V 6=} 3"+{3N"g%#$v^Q#S噡f#9!᭿)\PTHE$//'YE% ȽH Z5c;A-yѻ0gZTo1xs0dٳV)K4ܮ}+7^Eikzz3,p:HAGh0|%1*~N eyf"jwey;k)j ^w@u/p00әd^tY[8;{yz=:#MN>A-}-I/&&?mb_b6#knI/ap2ƻᏕwRr0r/btMqai8ߝÄia `qMnh 𙝝yH9ӷV@g<;`D<ߥz>ѧ]ƹ|=0'=oI$־:*jR_<GNd +k9 )_ BXu( } 'nӤ$j.V%zAO)OY Zxn,P;T1#K]O %"_D/I=(]S5OqV/4RWoٖ5U+%|B!T'ȥɖu#~8dY9)EC¾9b8`K[WOWf{x ߖ0rch<(P8KzU7׆RqJp+ z:XhSW M+7Q4T1dJ YgdS8`yc0BL~E|YN F*D&~KA5EDp1.Rab0l^Du`A1Sz[o#)KRhS>|k"R/f*ه\n@Eӆ/ƳrD#OF8oBA9k` #{4b( жVS*j;av:Y 6!K"-1\r`M L"5iq0\k+*[;Wɢu W P|MftC`.Z!{Sr?c{n|K# B;yڞ%zMf8PG*WE йm ŵz M~3& Ql#tL$e⻅oV|% |y>>]-86{mMk WIK T!ZJ6=daW|y(Ü 7d瘯Z;eBsm UIrC1H v?{] 5J1s >͛Te 滦G-etxC䬊3Dz|Il Y˸z e&=- Y3uєc4׻L h$ysG\H`EldƉxUA:o>$* ({|Y <z9bB^ͭLs̻O5ǧ6MF@Q_aKrh(da ?Ƭ8x>XL#@!l÷q&5AѰDؤ3{z.B8eDr:#A;9A:J~ 2\q'!FVNv$sր1Vxx1^<1Ycųe5ifL,V!.WjJd1.'IX5B Ûb C',Vx9!b \?ۄ!%aJ %bi J fgX̛|^32mb&MJٳlެׄavl`x4o}fgjy7zo6IXAYwY;|F YuPJ7 ̎-};誶+GyH!F (! ֪G:pToCѻ6M idCK'Kr+`FKg+aqӃ%f fG)P8|;SbWIE1~ySѠQBWw _;,Җ: X>/yNpvÅtxge.f%Y1,<\~N`zY DzIecX W# G|OUPP /35*+;"p)򤖣iqC0: -OnJ C fkSbvYUjϳy(}ho`Ŵ3щAOIXh!DRAF/C0&b% wfYTl>0KlBˈ?\N&(q=$p#_(˅ѕ~*'uMدՐ%S61opMG ё`α'\YfRXvY[ڭR+t[ Bq;OyV9«!&(n=4lE퓡mԎfN=I+GNRVDFTu,0PT"_p;27 *Z&r ϖa3)#O[ؼS( >G2X?a%Dm};Gq tT{/ \ s@$T<%xC,N/uԔFCQ?v*)Zr+i!dWÊG+he-u U%}ٍ^>K9OzmQ_C[.?i2>[&BA$׾E5L7 Z;z?1q7L2(9o0"MBl7Q 6!ͭɰO/J*_Q+uO0nϯțT|AXӶ0_x?#۝))F^:_`!Id0A,/K5Y&Ud#iai`"W-sGzY `̇8TajIagCNLtE]ç~RN͔%Gz1*3@_#b@g󩣙>=x eR6r^3Õa9>4;Uz<)b<8ZK!Sߕnj'a \Yp]rBm5;Ӹuv_vkk}jGZЄCW`~Э>{2|[B Y]om‚E8Cpg?}y7u!b3pqWED[ێ:妤ycJ_D=B4,D0 OK+Ql79xFbjqf'.Meu Fe;֗'3(7]B(U82M6}Ih@XjG8F :6dպ0hW]xiǪX*1COżk°|KLȳᮮl1%74&-2U@Cc~;6~ aU:ɚoxa5La<© :\Xu"ᔕxdz'hm?+@T2AݐRY"gZH^b=`l+|u9mU f3<ɯbЂxI1߉|yJ:Sw#"o?WpίqRʗB1`]*%4Sfp c4M"ŝR~]n hG=@M4 bQM~.,d f -u)v)URY\Lɚ>Cjl]"֝Jd>v=_y[0UQ'"4efpb( _Ft-;xH ݯRmz9V5L~G$Fó(%8w&?9,HP^d78Eco-ڳ l]CA? t@"WDi^GP O Vu &Ԇ^0JHQ~nfV#$3pl{FtUzJNftL,@zn5K'g&n?=Z8Iȡ"6xsY~P)Eo}trcUzꄚHn!G.%foZ*g2}Ԥ204IRO=*?J?n^:QOdH`Yw76!Z)fRrxEtF~F/ A ja- kt*r Fp%GZ5ܗ6|-v0[uKKӅ}wBW< l- fH9$xbeՃ%'gQFVvB;o(G*(@) p\[{}lT!@3-u_KS-{ͿIL{{! NmI6?/YđTC> nhq_~2>rlB}E|')%$eO'rϓeH&RLV'˯ڏ4Y޴l֪q3n\x{  2Y<mާ[6K|b#\,7s6uveDOR}%b:O~3ѹzD-]h[:rARo4d>GrIdܢLu>a-C!ro/y=xֹB 5Bu[M;5A,4^nb]M>b1fw1k&9 8[/(Lusղak[š]ޗzs(!q1=95Mc2 `.&PKK 3~ @dOPVDvExJwrJ=iv=aal8\,L[j" Yu&U>`-30KMkC_1R5ZV\zh 9:H<Ƣ~;H7Pt56fq {{)fcjW:K|^µ[WљxGchR|1CcR@ѷHV%LGI>4ZJ<\18 2ݱJ >rpQ ;ryP~ⲗ}PۢKNJVe|7,e pq͈q$TZaJySxvVou#p A)zr#w4wbW,p8PyA%юL%l-C3?)Ē/&!@[ 6Cm~h-0ogD^ad'.ј/v Ln7h[G>gD;؊Vx<80dZ_td+-qwM^X; ۵*cM7`F,יϡLYzB3N0;{448 '_bV;?B[mzWBjeɵoD`polE&%Fxh 0WIס׺\KƆkw"h dfЯSƨ̴t+op *>}F,:Drú7}4H. ADT8X(y'j~l[@g 'EyO)hoCZm ttO&fO79@U4Bw\C1zw')W2 xe'[,"1-`ʱYiJ{sI ۖ2L B(+0OeE Ŏ>K7H}j+␬LXie:T<㏬lYB"g#cK`Lbg !q ^|w ;FZGח%Klr5Aʈ3AukW6 -EQ&a=mQe?/'89/(9S1 ԝNqkAA!;LfaAѶEbŊsמ:j~}Z4DY`Bk]G)Cݓ֩GY$X$B <*;U GP8~VMxIֱmXrv(dpf9&>`̏3\3,!v$7~Ӗ2xYB53fZ[CII>o7p3iUe nÖ9f{;"hp؀| F2 $J IP#!,R KT[szN䳫rk3sNVA' *.GH78BmޟUZ2{$cBѷS3 {oM9C/!Br֓N\ oxw8bY$/WZ z3roF{ʥqR9^{~|E\ 4U&c 1 q >\$CLD .k-YA%;<,#wS;b3|-`E UBpAWk.2gIV!?BlR47}7WlqHr>#[+{@aӤ|'*Fr(GOҍ'K 8jnޙ }^}:{mzT 7v!{"\ % roQgLZ1P) ȅL_o8H j:8ŷ\/ݔ!Oߴ|"0 r):ڠ7_{mn.n6iD'G17&1;< MbRܘu)Tƚhv?`GFLɣp]%emNk*kzQiquW),bՖڔ+]?y)qBV_*8gFchL95> 8倈˫>0^#x,穯TF9:Le!7hY5q\Y­#'תuH1yKBXرeQL *CAt]=A4 K>Wb%*,eY-4+eV55>:"{Xп׈s-1w>!y5EϞ()/Uw0 ׫ og}p[Z{5H殙)!$Ht@q|0\dt+j0p[tvcw%9NVC<ݨ F=`bQl d-1݌8gT7Yدr!9 Z]B 4rw_ 8Ы @ ,h0 SCG1Ĝ|qMj% M) ֣aYh|rC9Y<}^kP{ㆸcڠdh Sjcl`CI |@&" BB,(GkJJ+"d)m573}{vwD Ta&ێ`5~e-Y.gRCy{`x!UR>DP c ?=H0,:4< Z F@/z83%aEy&އ躔ҦFH'y4dztO )[p,g(XkVBd067?7FC-RVJWG ]sR5u]j5SpW}ӍxO[NlsOh#W&W.'PVmׄ9>6} Jgv#Ġ h [OsAN)Jۘ^` W"*kgeAoBک`GMUK2PU2?ĸK>t16Їߢ+ fӬ)w9 %'Qn^壉@k:iYeX+?p3_gKE#F! s|z%,r]8+ɉSJ*@>'de#be;:C[Ϩ<}]|?kCIvw jbZ9$y%vl Ps1l梅{!. $5+[@/֟!ebؘu:-bA}J"=EήZn$RRٺ.\ Hf] ^]5]'^i<1N>5eܕf=;'$$_:z8tӤnU95q6'0e F~\1`PhRpSh g9'9+H߬1{))R=a9h"? 'm-0 â5=ѻ)b9KvuY e"UBreb/%d빺%{{w#$1!11fTGg60 #̋tF'@w?#9İpL<}3ķkٵ?-=~]KywjOGw0SV9a' l֮zܾGE׉n/ߺB !c? ;kݻ;r3 6([l5Q]Uyy[N))0Mr$bfVPO5 nj21z.ldMbgM!/J6n^[g:~[?|ݟlCԢb.H6gø73*A"ӅYO :dVcLNQƛ`! %ztwgxM[W.>ku!ϳ.@}ȨN:!tieqEAF59z! CK/.RF.BwyjYüTk!waPu$'wGѳJch7 tY} E5Y<ܜF$~cAC(f:ur xģP_ !_Ƣ{,;n['rYJȈqO'V+$]Jw*WKx!2y3 vu_Ta` K{3/q &خ?ic -e8葷rdԛ{ g8î>X^@zVQ3+ޝKSU"|E.Lv-K~^b"= qSWRWal0K,gkAݺK@21lDOWd^;tS]?OM噲%>3\(ZAc5/b4o-4qXʁB$V[䍫V7ya hǣ>ZwR>u+yXx-|"uIJd-`wP[u>cfUʎ0t(9g1sk!Z!4L o(J 3(4i_Aq/'C^0YtB)IIuoɰF,D[$bbCbm: :bR??U|B(`z*0q+#G"!=_շ<,Ftkpp'fn>9 uN%>,p`xn`f*`7*'n:p aV!B_X!SE40[!X-Q2ndcI@}hP Fy,fǭ߹5URJg yub' gFUG(8tzft70 ] FQe-Uߙ{VMl$)Y5: v0^zMCoY 2QTHJy#|JO8R!E2jLpƛ-YD]9x18(4cB*Itisx^#`+ZU[La3]ԙ% RoW;>h{= DrO[MhI.H\ BsL4E4:aETՃ~_7"T)7K8>P*o?RroVX0[qF1Ænx f bIW^rI1DF_fY_"KA0.sQtb`v:U ykûJ 0=VrLpTv'"C_Yɫ5ܶt`61u~~זJHuMq!8]щokGp50trM3܊q"1JɒSL'M3av ŁxpW}5# mLy $2%G#A%U:22  g"Uf>Kd4aIDy``M˵}xa䦲ԌlI_s>Dh=svVRhOLRA ο̡*w Q&WҁsXpYM)K0r#Zj4u BT'& 0~(iNp!hwvXJ=d"*X}q0@fkL [T*+?)"Ui=Tm b9.W.Hk@~b){r7[ӏa|c? T)yXkh] G*{gIBQ45a@.}ȶvn9EgD:zQX%OٞzC+<ﱗKufL eee,BP*wG]#e>ܨ0}>"UU ,[Yϼ%ɯx[.Ab ~+iߘ@Շ ܩFfHAp.;^(%`DH!z Z=pU `lvd)l)? m㮽mzǸgDŽ8>aҷ|Kq>AU/˰}֐_a*"ޗr_ ~,#:60`urg!=㒖=)q:FyZN ItwR쎴~>/)_yM/KA;8bѬu;%r \T;Ro3PqPTSʩ+ a`߭Gh>Fc ҳ;|S~0hrI,2^LpL0̭V-¹htnjW ƖU/YLb}u1} L([^ooђ6Cp4ndO͖5Ribn' 7 L@Tk753 NJ& ZC/\=зy,2'ݥ̔(\Ն|:7W}$)鿾;lހğdN}4BC$0hG k)5lPL$x;B׾,C]8/>$j^[(Ǔ^j=ld*7W.b9=1NC%V=[E"di)E+k'<ae;9x͌TĜi:ˠ .ڠw"T[Qa6ɯ(jdB2+_q-Mro2ż´;FٞkͩjUfc.ud䝌|)X \|O2ζNR>CLEDf_d^nԍ\2` Ff9T8j$Ƃ>ahrx.ޖfkb&Lb`'[w8Nq$c׎k$Z|Jz]s٪Z`&Q 5!6Y8${CNf[#t1KXWq3_|~9 p^[(ozw^8y&+I^zs _? Q,?b/@?̬Q|5Av~OC #qR@aĠP 'I΍MMS 1IhF$nDV~MަCt_fallNr\%=]xN{ k,vȹ);hһH.vΊCHUb;ix7O>Z3[wd}ΈHK=7 H)4H{!EQ?LЩeE U8N>=񅓬9?6d g)@PltWVS*\WZo$I:`e{nhptlc n&cִ#*wDbZp_9n P}\:y((Uxou~ʿ%^DѲm]w?w Oח6)4, `퀐sZB>S#cVL{4tN,G'i.bwD48xvE3h @9y › JvF[Aɲ<MyN>`_Ep0. zgܕf׻u?BѪBfW͚2鋫蚼UY:"Xy^ q=PGh_uf31nݾ9(-UTyYo{ cQ,Vw4ZȎ]JB arO-6%K*Sp1 r#j2 63CLbM&nEZ.swhZrCծX?P( 4%.W 4TIR!ʏ@ԖAɎ$2VqPjI'SLUIX uL:흽I~I _ bG}H ER,-z Q0sE:h !g~SL]l%S6XրQڷDmA+^/n"L/A-}tϙ&57+z>7p굇ROYc M&Aɯc 2 o֤ѐXWa-쟔fr FG{:!NVopQlXrAQ[G:sGAո^#j%8l8&d$ 뼓V40eȒbMoݵTgQgňa)(5psd jXqU7EhШTԧvRS7!dI(;ήvma sG]/JhL!s_Z&t .9=@?͆iIC|M8_1-ԧ=]Kަ5z@M8#F}= #fIrr6ߔtJSZp l-3c@rm#%BAL&7l&XzHP/罇[$u[a |dl(йwnO,4ʈ"ou4KwqHK͉OSrRak%뒿ڤf Ql/܂t,i]oLޔ:~Fxe?h0AP/,BSz+ZpZ7~`pKNoYIɴa]'TOz͙>9mPfmt&|KRoLвx`=rlr.Զל({$d>/k%>jߦ ̐w*F&&uRްǔ>Au Hł%lSz4t|=VT*eO{`<`?eAWm[NAtr"Da҇9bB][8pjLZ*l&tDK⡅l_VeJőYCPNCeA42!eXQ T ?Td[ Xy N_h[;xVwڒQ.D)-Nv0?C_æ6elfSg>}YW 2QrSa*~KA9Rq$ƗK3)mOsDKzփuӿB*N5Xz$CY\{^^ys C 2 :^=]yI+ *Qu6cWh_on*VU<1((cRN/fLEz;a beGDYU?T".}ĠLBպby襐\Οr퓩)g3LHX4Zh|jh|ؾY/fw|:o}59bc2db,`ȇ^ fG[iIpͼS7d31;#/nӴ .Sbr_..5XFSYYҪicptTؾ~S#]MBuix9 8$eVL2{?j]XyB#Kj׸NN[DG3p Gc}80S09 ВW|p.z %#U| ov^C¢:=d'+-gC5€]٣Dt vi׮. 5uBڣ5'%+%%U 4xU>>s95=8+n]yFE /:yxJlCv cKtڌxdkX[| RDC|{ϚcsIٙksgp'E hgie7;諪G+6'\ 7%!6$\GNxKq>ZƻF 5i-@~n=Fe`\XttiˎdF.c$4*g.{V.k->%qu)fnl ,@Eyq{/1&GBmq3kWckp^Q(2Kil: )Ahy o +G EԇA=M^DQwuۗCi6mVTChA<~D=כ.ۈ Ċԟ\*j[ bݛ&QDѫݒ/?f| W2>{Y6;ӵb1@=cArk#K B} B=O`K䁘PEmԗdL3Ƽ#Çz1=u_LIt[Qމ[`w42^"sv`:EaLቒ..sL W`JpRo ߨm+x/x1Z ihxܹ4UB>kTԁD[4RX*z0F!NUhQLzۃ&hѻH>gRh"#5"fk5*Ed( G^kK5/Dl:ZjdԣByG8þ^mSDTx0~p =46)au\t{5 !#F)F_GaDQ;NˡDe@kL;E9GLݴMVF ]:j-CM#F4Cr\^rQ@Ϟ*A{>ݣGt(x."}ޙn8#R֏ГL^`[-rI%@̀ 2[uQf ܷaV"AU$ mٞ9r}2i(A$Yj"QXdB/UdU=ddcBU;BMH*H_GxgPɢS/.hST L(k{!s$qYտ:u|}U WpRI[m5xr3gk 944<dW[=>j;if)<4WPz6pqgv%8~wP!4 ;66A,I4ןoEM䗭E'{L[aю:ppDv/;`8F2Q:z3Jj/^ <6ͫlk{W[?Yl9n"@`jɑ!Q3EcyXh%xwxA )l+NR(W4FGxU1O-+3W2nʃm Q !&C,;jO@0-NW(2Tl4((խѳڨY0}7wE.;,טh-gCf>,~*5Wo` jEA\o1B"+QiY?s;/'4U)@Ao uejuTe~OJ/4Z-( 3_Oau?Z{'QhOQq͜*Y9ÕXӫ7'‚95Ec"e @q; R^D:#; .{ρ/;eH ;lӔI 2h\A#t#S*dݰq1 ѣ01Sş7>lG4w3X:[:r1cxbB}Om\iiS-"OfA(GL"tΟJrȥ't5Ys_C8MS\<)uH"ih>]hQ1X k@|rDދDny넽k.%7 RMf֯.|&xb:+bauBanS/Y[_nhDʻ!s ht7r\SY1F˟k[;6܉e_j85ycVܣ|3GuHB!;2m,x?㴬űw{QVF? \V(Cu*_cVUHݟyo6ƪ\֣ a(G,|lM R,H7`4,#{ wI Ih4eX#]QZ ×Z6^>'dIm^R4fc!/hw|QGTq{~oPsiGR-^ca7 A6mof+&V2j4wbP3פۥg&W<55jk3uJMqƆm3ʬǶ]owMf6) ?_W`^Y],o)~Ou#K'\s"07O6s%hgVDž1Bt,Ƀ=rE} GĀy ?G g6W\9L޸DXK9@M*+@<8fad. 洃wmYHu%(neKsᪿ"U{)yFH[)f\ >`:oh9 v =b]]bŁ thBUhWQ<iTu׳u*s0وӋ"֛2w/W.+xz'Id·)va+ DFYyMf;C%3 m&lLfD/%\/.ab=/0T bc4 ƜT">DՄS(Vל-/Ry. ́@D0m\~s>=F;Ja t(Y:Cґij{FK)y%"7ț`-/b)k(z,, (VkL%b#'M/+h©7z+]+D9 CU:ӓ_vq.q /mu@ûcI YKw%}+yV 5+IT g q|K195o$oފW[vpı h u}A̪n%ݟ㖺_q+:rFWҋjOQ>-A z9ANakuY:7LM_lG:+)P'@g2kNavZNͭ^,$ٯlŊz54Np^bǤ$l1`=O:w)& BIվK4%9ldYCxbRJM t*SY*hu :riQ ſoCF3 hj~12>>8ZORC?k=lex'rf2*S&$b丛Av6WrLXXӫܣɏ9JfK ͬFs.А"%Q*@< h1@>IL㵡%/8=_qNpTȌx{BE(R*cnn*"du sp[6o V U7.X`l;0[q_Q"GޞV)'vƵC#<ՊS%-_>7k{q䜆 2%ZI`6)=~Tg/V\YhIxml>LS?O<{78@[Ȭz$N'Xtc)UOta+ʟTR-8䠼VnH=԰p]pIT9ON%=N19ŤL x23_ (R3cQ%76-_.te!/g$nl=Y4][{yb/GPteEdtHFT"lt;uvADsckS?"T|0R0A !(i0A Y<HhQzwzKmnֲ% S G垻IbWW"AEtv|)u$,ϰc X^=i >1~zLj[)X\w#4t9$T+6J} ݞ5C͉z.:nTOλ0=cPeNGZa6ǺwV|}by4LO2gDzwzzZ}W߆ Iz]$Z7fNl.&41;ŁCfNiEw՛iM$wI[1j Hꘅu57fT`uT-b&5|UB~"gu6k٤9vP#p)ka0MlhNp> m\3>9w}#;KhFO!i8?To8ޤ)Z]4Pdo$r9 oߎcAdhgz?w3bvQz'Q#Զ -o_WbR}]%je .jN κCh݄]X21Fp:T }?Iqt )1 F`M5He"!IV vVDoZ´/g% >^K֓c,RS_}ɪoe%{|5~Df!ȱ\:PXt U+f!`h.Z2KG5ΟM/W3aHsq=ԑWJ_(vn/4dp=c&Wh1ѓ0˒ĐMor l`qE"ĭ=-CjDEh /Dc׃d#91{B6%6&hB3aQk>j1ƶ/ܧ8hCsр8qw?!(U$˛*= M)JF=8Y7A.a\bM ozSc[:N1RS?Y 2%/Ѿ˦a򣞙- sB}ue/ R)=D-f 6 WK伕Q_?iz@&/^_D1:41I.0:H?`Ðשּ>J-]1"`}۷RxGm,3Gm?\@Prs bVW@<Ԃɫ4ZEOM7% Nb`56>@f54uPjm@Hy(>t)ͬzǗ@;>{y#Qˮ&vI[Do-Jw/Wipt2W[:ehO ^mS)"HaޤH'Bf2#SÎ^F[DEϹ37kαlƃE,FC<@ߡBN١,{`:f(!z٤F|%CrvzʜN q%t;_Fi1xFH=6#kJ]-ED@Bܠ(-15 *,f6&"-ޓbޑgk &c' ׸Yku1Ҳ%H ~w."]{[Ⴅ^0VA0@$8]M4||ҫ<]+9J6>PGGvP ~0 (jYq2S=pc/'^F JH6)3ݤYxވQ^;;$]$Ȓ#1nS63$VX^nzttGJl7Fa+iД64T"h'K̈́+0 NZ4c I)&҃qW֜j5nn~Ҫ$*qg #aφN'/TiJEUnߚ*`65~E\N9+Ү9tQ :\J?Դt4Un9 ͫҚ1I${JkWve9yP H+"/lf++?G41_](ǃQv2XoKݑ!7  l{R<w'!sCI )$OcQOGq?|Ph9U~rV(:֍#HƳ~O$]zA`GXaܽ[B:jzy@չcZ+c,:vdo/aPNP \lgprgC3QT[U;DVS━ˢPվ@uD 8Ecr%3v5 HZF* 7ga[-j YRLDԒ]}Ҵq5(;?L$np~fO3yB1V|@r2ig`a;qkh:Qx\RP>GF^"k NC$(8JQ6CGó$Zzjazr۲DB4|R$K< 3f,;e졷 ׽mHtMq]ZW n+:PwN7dܝzA3pNt5g!Aa 6=Nwz{~N?6RXA3s:؜w$is@zx(Q-﹧ȍ`h>zHqy|>(6T,я}G!'BLNYmPH*2sv#&$!qhhvdkorr ?'FEGOd]}ZwXZ}Gaa` V*/B57O)L1Ӱir$%Dsx H4D8}Xq <{}k ]2.5 e~FrN2׬K3C& 2F)L*mө]!Beo/LoziFkϋRN5a%h?d$Km>{ 3[M*܃~zKĻ|ў 6*wOC.v&Q{䍔>}5}pikՓe!a3(]$޶Sʡ7}(DHzt<2Ei.:4o]J[B[4V[_W=Ϳ2mUGu76ӏxu ֲV06B͵vXaG0hV8;S~4lp#Y'^s+őC]/}4?@-0|-S.gOU<MÉm(ΈE!R|+$j_R\+{&15KT1pTО+O/OӔJ $]#9 %ŗJUvráͥ)T $)f*<atb}2AӚ!tԳCBcmt yx5]:g-7?VW0<झs y>Wh ]hJg,KgHL/s%KlKG=DG 1(b&̈d Dt Y}qc{Ϳ]xyI`1o ]ZݍdN#mr}ߏ'9഻glO1JO!r[N3jW_p_ o!XNdL *r) ڤOC ^JNe[{{[rV2J/`r; |fUgފe/ٓwƆݮ)tF XJqT!{<k|6=7ʤ*xyziT-C/9T/"J 4>y3%}%k_%ܶ#mQ lO8 !J/CPR& l(0xv!5b: a䌭b,r| 3^ug^?&: ALxQI&Ǡvu Wr1ӫt \)&hW% N">H9Q܊S%$?RYC)אjT&:fV G ~n?:$p:?Nc^E6XlBÙ|? J 5fQF{W|݅ CPՇfc[=PSa0 Zק(^VXFNHQ4|#BG;YgiUYMĭmĩAr߸A 6<#$ҟ^Ż?f #d}3Gfɣ0-!YMl}?oeſuׂ $<㧥@VkQɷ/_ n')FL^LzLY>-G詸~iV^+^eB`dW?sW|d&v@Ur5ya'<0Gc%OM?|fiy;h>^Fr uN#Q=`|MJ9mOe5[%w0""W'\}bB9Ge2}oۍQmRb%va[A/c'ؚ:)6-SUn˳=8_ojm 4M3|h `1Ay1ߊ$t^xw3$3%R~߭]F2 q5Z7sZq a U+ɅIveIexL=, IDvE>2Dp:|j-adѸAx* stp#Z΄.;26aV yD 2j8YٜpS%FMFpkahg9RPIYy!_ ,P7=q!/V_ٍP :>E/xcfD)dIAi o$NR5RiuཱིPX4w MbMq&sV9L6<;>2ZVoO(FxM1{eU&m6'W4lh|Uxnu5'@clS-3ës[-]@`G7pc +͐O>~D ?b 7V+Xȡsۍv$lWX˻[i J߱w0xH`L/jrƪ s1 R4FFn=MqNf?'?O,09?GնK]<ڻpBU`?C(Z"Z;75ɸ =uvOѠKVۊYWTQ{ =^J~|QpMͫEcX %m)$ԛX͋;~7iWBeMX зjj$ 8rC0&cbX %o,Y#'Bs퐢NWh>1,өcVEI9dHF>vM^n JHZ( 9M17,!V6cɵ_QAЩ ߎs85Xb#&{arı~SΫ L0N*.yz (p$DcX^5=O],ʉ-T Ú\-7\sjf^ReT,P9ܼnm%=52kCǭ$<3#RS\0ϟ?J%2wT!_rS&F'u{{uVDYF+#/4!ΈEC+ekwLbsv7&!KS Y&P=,U^ EIsYƣDm#ttjXɯeǹ_b3ҧ^APoE eAim7 1\F=p b?C@oOd5Z0%к.dR,wFDy1c3!Y>f(rڨmReo}P|# L Rƹ6r 0[5~9̓)[/;W{{5clp^ X͗6߭tjADYS |1> 3ܳa=`1z4*nKn A"wBt1}+H%ѳDS"X^OkXR, gdOYUl'`74}{m-95TE*=t<E*{w;~έ[pt `F"Oú tqS|j츠&c|+~r}iN A6^&:!`!pVՒb+ĸd %Ҽ5\Lre:.e.zUu)aR2j))taI>ߦlY6roHudĔ,U?L"{@/ w‼'KnY+u9,3>-~ :a^~Z$.qN,"0;`o33ԝۗ\\:bBnnbx~::߼^nԼ5a8mAxPN&Vu{:F8i7kJlצb[ ?RrQߗ1.sBͳif`:ohc!`4y̕Y $RNk8좋qB/ >8Ѽ0(ތNW4BԮI΃ysUkgKȷtYr]%/k 0(Ё0^ ҽfdtRiNFYK@%ׅ3RxISP`ذȽ,+6{/;Ajp(Ǔ?Ӌa;4sN8n AE}mu@Q\cVg-r1v H}pi_S+# d@/U3*6NrDNV57K{MVҵȘOXHvRM?&M p<42߯WN{?0:4ΕkӔ朞]w[&fyF˳l e8~;Rq4Oc}Y[&9D 0TSq*"Z9{x?/3@$LUa(_$(pf'aOJy/੄R^>G.qpٷi J5g^<16[i!qHXM5gImsϭ$,x9<+ِ_!2Ečd~b>q_EAB&j^3iҧ 6846)Oz+&Q״gᵠD3@<w~G/[qG@*8%8> *T"ٔ ^S䎌@DyʐonV@P` Io[a;QtdliI®ejNrO«?Oo.YU^9`|Y܁Vym-RZ^^!1EŇVx9FtMQpdԩl(n83hVOU,MkwpYY"t2/EȜ9_,r0deR"k؄ rgy G}sZkA# 1zpGz: x7il٬\c :~ws!@]^}0Dj 6?@`4(! H37`[VߚkUPE`r)Q>)n4ox7;&)f}ؔIK3PJe f{Ϥ<0*by}1*PZc: nK^zF \$ppxhjcD;goMW+no 0N#T꧋XN@_ǃNz\!T,'-opֲ)3(/(L a3'JkitaϿVK:hDžmɽ/ 6$U4S:"W LƏ58U)]1KPan^Fط2EsM42`D0P2`(oJw@q5|K( "?[ 'W[=WX(f]t *kyuP~UjIoj)O$uE[IPkpꃰҒse "+p&Pz֕43yL gn9 dضo-4[31)نƆQva*9p6Wú_'6͵# ? ws93Ov3ÃYLpe -b|M /Zm0`_53k^ ?-5w$;2B-8=hf-xLnL`B0%SVM$v!(kR+tVU%(ՉKH|ڊ`ZW/śY*5g@ଞp:*Ƈ&D n C1?Op.@Xd ҥ9h$ul.T5o8Bnky~8ԇO.Gz7 q8Rt~ޯt*jU𞪎]X8UA5#qbrFhFl6+R}8j>޼R։X7Լ`a &rl(ETR+jSyb žO&.W%**#zj&sPg^ԫtiܕm(Jo WO>ʽ{J7yT 5[~ƳF1T5ukޯkOrbZ=jL!WaUԈ×ٵwt g67ί.C CՓu$RUym |NXtxMs-yJԀOD#f?㬀lZo<k[dpx,v o{HT<~+ҥ#-8f>O_Aj mЙ8'Ŕ9XՇ&jUc|ilIƽju7%KJlW} i5>&p@4M$^f)^GW S$Bȥ,2xY>kpw0 JD{H f@s{ e[M |jw< 0PʴN`J6 [pߦ4և$|Wܾ@! [.crwk|^x`Px''/N+a/qB/9PZPIAtChy֍G WN`Y'ލLևZcWKYZAq[j/$'u~4el5[_M(t˨DXLL9Xq7V^c濳/t_ϗѲ*XAH~CX mL4tn>I,//3pI!Z絒Ӑ|tqF寧&Ҳ̔q6\0(sQc^dP 3uboRq%M 3|ʺm?sX}mԸPG~HSJU\R|/>z (!fQ(9qnwVASUl~4D,BG>I.M.@R#4#z̩XQF3O/NXK 3„n\98ȩzˀ3.oWtQ\.M(M@;L˧vگ;zK={PQC 7WG EIײ=x.'K%Eʖk\'9Y _3n0sDAKO2)#7`zpt 'O>`%˫v#(L!)jw5`}GjuTj %?9ѻ.ݺj Z"Q-Ō S9GhrZp2,2%Ֆ &e?+}'  /©qFzD؞ TE \q_MH3e%J)ϙH:rbl@7bNzgD^1\ NYݳz?S( lwC`*W A=Dߣ&cM,80(l.s~Fi|C.*}CITbe w9l)po#()fB|pR:mQ/'[*ʷ`S#VW|'̑xJ>$v-&}45ʌEU2ĻuDӎOHZNcg#mېL?J]MگEI.6,ر+<,'Rd Os!4)Sc~ lFo. fѕ[>Q}Ro䙔LKA_ ੌdrP(6Ħ`fIx2@R%f< 2(!1gvӚ2|q3ݚUk# M3%|" # L!YB= ==41?>/-&n9>Klm%<#vzt8.+aek0bL愹sJ26&>+1 Z^Umg'2qU@ңN ` 34ظ VuQ")TZ {Yyΰ?M4ᬚp!=qX-01Scruh!{Q/ꢺgqB;J.b0ı0k=#2|0/BZO Ò RM T}Q-־=k)ZdY(u x,E 5Z47ƤH!{uԩHHَ5pTտ%6^8_oW;zd7 8Y5&z/Z+s ֋讎vG6I)| Dlx_3~Xj+wteU%/_o^ o#aVBfȻJ*q[Ib le5FW%ө_Ѩ,o2_ OFFe\"Nͩddzc0dŏEOrsǓxJ(go0nudg>: 4sӡ)C/_IlAq5<&? Գұ1j%svbڴ܏DlZ$_gR3e0"cU@0̓7YDZs+l FlWC{n͒y۔8UfR_T$ Ŧ 6D^S$s|cFmY|T)ЁfӼA30&*z\! Ax,3t) T[cH.+Jx#ʥA*y2?l}DĮ3XE+FLOߏH KNʨ $PNC Zbs#Ӝ=M库 .[^u*%f=l Qoc15󑡄/)`u$D;(;= X7=L7++V𰫠GmmyQ*sƦf/'ч] ;!EfBwťj|P4#‘bSf6{$ {5%XlĮ-u l'l&r}.(3u H%/AJP#" wn@᪗h($Јn8 R*4sGƬ/bOhL{~5p]TkVh; a/W%Gt#l:65H2DPvM.m1^K1ZEMOjTYI}>;vE¿R5zB qf@ӈ[>!'o&-iZnIsdRWePq'^5!q-%:PUa{PE9N~#i_ 76iܻ1"PY|;%AakBQCrTJmXdURaF_R1c %7pEn Un;Kemv \M\?yh.a ԟ!nP.Tbkc"ln~:\Ο?<(5pA>StmG$W'JdbmՉ%4kcِbd1`@=l:վ)J[bw.VwBo< $0{dPrh4Q5 J3*SƅW'uaAgFiCXj#>.ScNʅoJCEUG7:^a ocRQ`YMAi"Y;dtqc.vmr^ձqp  pQTe@S0KK~>$f) Oʺ]SM@1˥Ѐ⻕A!1]H9x5.]#8ȾTd4zU՜ \6xIT+\)~@t# +c~<vp2NǰZ!W!y[\k+GtxjKi;d'/  ӳe> wYp=}emeE:Bi0=W>3"ёUEᇴ5c@ HшDshN]WN=y7@[ILփuG!0Z&,P`xcuŽ#`w$n}2UÂv rҩ.G;\8cuUûǵ)2i6 |}'&{aHY E{y}V6s^yu=Tj!0d'/e[ҥ\87Ǵ*IՠUiXSUf}.8ljh׳0]DR+ #% yݭ\U*0"ͮ ZUKh~>Q~9ܢ  [v)(!e/䮊°q ow}K[-(]A?évď.AW"}! |&nQM,9E?v;p-ۈnLYV-@0j˝˭)"X%PZa7[e-D: 6wo3+B/]d=KnߧKB^p#Q49"'7Nܷ6kMRNª7LVmED|sNlY5;ln|NR22|L?(0"1S a޻55Ox5<‰CJWuy\%&JYN ]'sBD1:s ƫ`#9Y-{FC;ʤEg2ǹ٪+/5ْѩXFUǿ\7V͂З1,pmZ\x:DW[qn0-I5E5Zo}lpou'P{Hk{5U(@ 2@3)WL$J$09*ï=D)Wo6E)zfKG v־ؓx">ܥ*_fE{^7^h i4 r9 ј{dJ7>JD6f^^{lDk8 ۜ dm%-ƞl~f$&kk YSu)X53VnKu_)WU+%ºq{XK?"]!p֨H0U%.d3O)UoK1͘%h(0hPs#7[-k3%\jܙ *誃 n3*R,ʺL+S1 F;]kPHdO 6`=i0|v|UHqIn8JiOkSԢ4Ñ>=&n d2^׶ +j2Wv5-Ɓ`/YPw G] (R " (]k}q-\EBK铪-}wq=kK-<ڃy(#Olhv{ ) z1BFH!?|~|ܑ_VaZ5&C=#[p+`&8*ja3CACxbߘ>Petb]~ $:}22id hTQ4 旓| TQ_@$-Y@+-X^E8JI~/K* t saŸMq_Ֆ ƥW qy/8ẊlHՐ}cAP~HK_ƞ\aǩK@B)bk'kĠ/rfK#n7lə)9bprU Ʈk܅ԷVQ}5p9W+tq &%(F*2eƸ)S%rMwPH\kR *q.kuMf#} xǶje@;SHzu?g4j?Wm 3oqn"b2RxԜtxU9q0:KrY~c>R R85hϻX|sv(VWb|JIzR|C%s'z("q7:~4kztqNl'%z''v!x'Y;*5blYXҝ:l +O6+ :huX%:!rG^0˅)$8NZ\XVE+DtȵmsF{MKneߜxb,4ۯZjM%Qv˝u @ I',/G,1pTsb&$z ;$. H-DZ^NGcq!D%oıi: uˆ`ȁ|COZ4RV_Ev:yW>m,K0HFpдPf"X@_[3g?zФߛG'erB>Ah7˃xLA&QNޜdJ䚹W>ҏ0dqOB6BH[gl㈩Ѓ%.=gkq9Ǧ,ATQDA֡*g!Pkds1mϖȿ=vvP>u0m$GvgD'[HrJ#Tok}Qg|}zA$6qvoq-c9ʡ+mM= E{L3ˮ) Cd#5uǒ>f5*6rs:VP)տl2}B6,ʋj*rnwD:+:5<1J' \Ȝ mP0F-ҟS=֝ ,0ds|D gBW&Fzg!Q(p|8{4>Pg Vh1M+D|g5֬w)g%p^?5 k(N ZjDa)(lr̤|Vr[9e'W`ɰchN dƘa X ɵF_]e@9QFssHzBKwiU;0e"R/ "Uc=Wz/2K7b?A_prmBb)3Lh?):dv<_e_=ܥȺWs$ `݂_)Ή X$w)[TP!6~zSAڋ_'bfܮu] B;:QgC@s5`\=(U f1ưN c8)66S8|k8~cȲM)Q’xȄG> -E`m*u|b?KwgG-VVŭXfkx GKD"2v`\B>uDDܣR6"Byko J5k?|Տt=:BpE?6}`j;^3uH(U,[osqlHvކ0YCK2]S"^ڝnu3챏jTo+_~OqH^!GL= Hi"HX\OT_4ٍhk/>[q} UU:'D{.,yU[̍D- CYRI%-BR9hKl:Sx,s<=Qfe?i#!ϳh5N= pj9AIP8ҟ7stjsiĞu;^nb(0w]iTwC]4!vٜb*9=X.MsQSR!7xà_W:ʀ :~0P%23$p*;3͈e36!Wo[0Jjo@~qۘgVHAjO۰yBחhBL]ͯwŃY;hhPɚ3꒎M!X A #_z,u`X-U'+opԠQekT^R5&أAN:'x>h-8!RiNtڝQ.hBStufGa-mH^e͹Y6us"HGH}2;K[_ti7+qA,auA z}-&tY_ uk=11}' R?/iA'9PH,[\M-%O"q -dě'$O|0fy4v^&Fwz腧=gU#cЭXrH* 2{:.ѬL^ E_uhhJu%})tiyGf:߮F_D]C ? ESUuO**{Gr\FlwuttuJM=~{ XPj&~?կtBWD2;$ãeQ+QuZלtd_U~AyUM0+b&w@uC)1~!.-.k#{'+B.ı|%R ,h*0ǵMb3&_ԝe~6DG!\ ߑF[zn0 <Ѐ+PՙS"h/ixfN\5,`G/s;Ge93Ψü8G 屢4NX{v 1jʝH%2[$U;5A߉>?k[.&زZy9-"@m'uzjHN=n\)h?(^U:U%o9t%?y`7s]x HclWm}# [uDP!DV'BBt>NS'GD38d3ZfĈ udVV4`/Y,"JZLT]'7 567\'.A(JxD4;WkV_ˁg)+F"ZmҜ,u}c261j]YFx$M F/+{?]^JΌm3LNzSTgNrQڍX{,y~Y):2Z3Hd +k~Rf^iږ;>15v[@(xH#Xn)L*jab y4A+^O}рzTMD4$}fpS[ 8˞PҀ9PDyaٌZB~togU?ҪS (S CI5J ǝcUfHw"ay*fqR/HٗXa@e^@ᤋWy~&7VC/) [-'5U{"u;"^|ς{PYgpޮD~TXPiX(A;ǂ{¤[?=\稑("2;~GN# 쎚 Ah]B0՚Pإy3 ,Jx>v z:1L"^NHaAuӔ_{Vͳs|'~`'\O)0h$Y6$rO7+Ki^ݐ&wPoMӟ!NsrG< x溬H )̨p*:DkБ .qp-94';ows̲?Uu}O= a]nHX6ȝ@*(!锷xh`UR JJA~PeOuN)vB_]n7IC t*tnly֖CGR]C@@%?0^j3ƍ4-`]bz[(oW'oSl924l(6ohKݱ8U2<G4NGtKU+rYIlHUs1iSdJUy (WPt\iUM&-)W y|"?kQ*+o~"UHd<[Ls77)-!JM`tݺkW03$XKij3 IT}!:vZR3HHj 7)!QEVz#~m)_in /?JS{:N@,5b>lTO\3zSfen^б1 =E9u&J\46^Dd]/A,A#'i~IoOg;^HlXXcTlj>-AM9$&^*cp`||-b"xfEVF%Vɕ5٤FLsV+BEf%8pckn.A)h~r3usYe~m4IG;GX v f?phOw,Ե^&D=~/Q"]D!>j<~)1I +"\-Svkm6jo yJ1(fJs;ckcZˁ' ϐ0-* hF(dkld5"|4+֤We"Wuƛ .LiGڸŪ +TҬ8[:R5b9Ǎe`+Q6rWZ&<U@y%¯2#U*2w.\ҰP鏪1Rj,Ibޟ3WiD _NSCTk"E{²#\#8eQ'tj߆[IN33> ̘)Eİ%^do`v[([pSx1~.<#VL!@N#1ŪaCpa_:49L3?z~mR#]f9UBTTaN9DDg<=>nYLYN+Ak/jI|}P7W`a\/" _Zs'>U|'3ߐajhc&p˓ja[R%+2ޠ1qȭ&|Ln>ځs{XmYrP&lƳ?AZiOo&h"e[XEOH$gw@Os6Pf{fNu:.:L8?#< 2t~2~!3UT[$a\ί hu8=dt2%_L. ΋eVSVސ*Q* GC2FT6Zu],|\x&Xs2O@}6|G=y!cEa/r‡7LvH"OH YUArhzLw15/I#ɃrGFD/|#Pp}p"!Mv4ed]-"'e %>mZNFUS\%5Cv 5Q[P#&q0z>XStd{$uؕP +*' Y,C ؇xŝC„ũ_Jրtv#`Y\z_C?^msT<+,c7S) Bٗj¹ / <&DΣΨ $FÏqs巜Uz极*[F8!.Dl$ ~#\]7rHJ#-$p܈GqgjwpbwNJהƬฌ.5~lI@*+yo;뒮˻~܋fsdԊs>-) @/t2p&P| DBUǑmesv+R71f'c1E|,O1*wl񡍱p3hocQ>;3X E$+vT`\k%tBL8NfI٣Ű_sM^Ej @IF2Iը SBfdvi'xuۨ-)-]Wu4QcX;J&7]ҽ2xWR&+Pm/7}"ԗ&hvs%DƅivXz)ZԍI%f3ǶCq"0ev"y|R(}KA௅Y٩Zpx.> ٧f:8vBʭcU)c__ܒ0-hMCı?V$`=n+woe(f'y)A u-lǞ̃GOɾZgpS~e_QN4_f$åZ{rݜ/CȺ D3Crtd/IFAs"bʜEa.AMxضۥ6F8Pdk5y3*m/ñތ X^7[9,~<=C={Π^N0 -{M6~~8;R `_wM|t6Ԡi=?NM 6a ",50 St zrl/c>(Io8jm-yv}5pv IYܦM_;CqCݎU0,Dk֯Z׳wuLbO3pQHEåK}itRh7Ob̌`=^ EEwWOV&qqq_qFl>^/ }SD~WyŐyB7Bg {5™>X @= ѵ-Tq7LC#76'OnJ= .n)6o߼g&tzG{|mw~j,UL{+ 7vV92 bt.|H ikHY~xlq"#)'7; |!n_b+ maݦNN9-_P @ۯE D}gux[q&kS D9&#OSe 7v ƾ˨^%YvZKxsZ?qJ!9f&FZ)[n$lswwjI9Ӄ|d GĊ'nPU/F@/Ge'2'hAЇwuCsZ($Ƽ^ .㿰(2v Ab{]_[ :;/c<) TOrw)Zxm>jm7oî,ClDYp!s`FfH YgJqJ߈?OYIqwj9YLD'm۶?#dINXpMd.9cϹxx5%y !c`p wkz^ӶƈP5uti鸚eJk9)tFyQs ՞-= |t5b[j#zxYF4Lo?]R6WǪf=5ZqJnt^. 1C×aA Bz74;=$TQƪ^q;(4]6Fc\ď{?=HQCnS! ŚӾqSYx~B udwpX=?uo'U=f@Y"8\ԵȶJ:A -ÀJKKBqL0\Pa7J&{p9RAg7.+YQ& eT"~{a> "GJbM|mY-Mfi>vVsD46;d#5>.œytaZ79HYWZAML]Aob bM+.Ǟ/(D#K>Hb+՘jra>DçV_4,+ĩ$fڣ쇿#k%QУ?tD5JUr+4? = ɾjiO>{mhLo@X8-Q`PC짘bj4-7@S{B/lu@XRDqUeH|c(j SG8Lh|S؁& x0x!lȬbD@5q Y.?SV+ Ts_Sc,M:زʄ_~ݶh{-Ln+rAe?+|{?Ăρj_GENgr8eQfCTixEeeW &fECRVuLxJͯ=K/4,~ 9 *O]3m9..\ aPay!Ҋp/ht>HrfJ?S OqVRUzEɻ}f0`3wB"D^>V.c@,bl汕(=:[W$?dsg̨oZgOX~B) 1.V^ Ȍu/tkERVVI2E?" VQ4Pˌk$IZMyqC3ꍻu~`(ۋMR?㗰Y9D$8${dè3ǠОX$仸ivruU߄ǜrؘ~S;lWnP[{$TqA?J,Rğ$cK i-=,"ņu&7骖H( Lc箩%~)aHJ;-a^N& SJ" 5'+mRTة f'!Me/;bJ3p5ֺI(Ah2w,V 6,WUQcCV=xʬ@j("0HH?\o4>ePa8ka(ڪUlVU- ~O l0`-ؿ'^.(ؒ.WsoA$#mGT> )-߂^[FXn<-ټyjR *3 xW3R| dEr?3HJp 0V\ kbfVKT䌻,LJP fD"FIQT/{ߣKlh{K]ês%/4R}܈ zb@;lYXxfʔs8B_ 6<}<-XLWcd@H`w3vt ] ?m:\=c7 j7s3Vzn=^1ǽ[ڭ͕t-*5!5@}I 0a;=^bw|sx5n\_x_ C# za]x!!޵3S4ЖW櫹˙ϯhf?WΚw瀢vX.~vpyUAvլCE"-+#B%vZE.Ж\l{xZZeKBk"On+ [\6gAK7)ˬXo,G_>`'aL^K)W. YC-ojd1PG&CsD3=G Q)iNlPS#/v xҕ;`~ڎhw{:rA!>'`IVʹ&FmmXsd*F9yAӒ\A07R(Z`01a$D;LXQ]5z-͋л3Cs1:8XEɰҬښYvaSQk `B3PiyxJC&gɰU$8jD]OB`$A6L|w08(qڛVk%ͅ" `F4",fR}Bc)bm|ڹŵ$v]w7r)4qtu^?`^{$aЙ.(EE٘PT?|%i@~JWܚ2x`cKv2mx0hJ[b`C*解z=iMȵѩ}'Մբ| _QޛHIfWnN#xmaCAtvb9[IiLl-bf8NjLi_JNU%dJcg'_$HMH{ܑU2Z҉ g˨?Psq]⏕,0TjayKun8ꖘ_XdJ9L!Bb ٞ`Vq&Zkf:FE!ۀ2F sߦ+od5}uؑ䠹ms6TRЊz5'b"D3A$ڞ/lJ5Oo-/FųХ/h\A϶^AárQ&s,vlt`le*#L>1@<0*p]MĥWЂZV-ޖ||h+βQI 9p> -X vs_(d ).wV<UP]'CjcIQƽ#2Զ w%3:u*a0X};7MI XyDP:eH\`DVJLrA:/(O@1?AUC0a\bN#AnR>M819+(˚d vch4QZ@&7ah j ݥFa$k+ռ̳@y(pyc1 GC<[3*uߗMm|լ&eM 2CVhu)܃yq'`gR+`-?z%'dTR@}wdtA'J\ p2 *jv|N3kJnL%ŠE+D2T})gxoyp 0v1_&ʭ?V!.pI4_T+z`;%X7&HB l9z#tDs〴kb@xVIsLJ rdKvT4#[>CI FIRљ='p~Bq֟A H\Av ӯcfg-y'^"#20e{Ҳ '^s!!fhT^,2 (ʯ?MLn>ɛK2'-GStx _"8sNKJ1}(tJʯ?8sWs ܝ637XD8=(gi7Ź{@[%Xu E&ux#_Lي/݋TCɞcyg G֩7^^4<d﹯Z'7^2*Ma!Nñ  UxK2`S#yG`(=v ܲև* 0&g@*Q5cbwPW Zs2E(jntLJJ19nTxx3wжGЂ^x3%V2^e q (kQ;¹$ƯxicZG+! b*B,.:24Q]ϯoS~.X]=PK, Afߗ}tL-T/|FIvCxm}FeAoX}6CY7s>wFΤȈ?uۊ*$/l[D|6,jĸ$Ps{ls) lKmJ}kUB'mWQzIUKhwjC)hӱGOBys5>LX1ؚ"BAٹ@ CMp$9]Y/b;қ(06R*@pTJ45v1?j)1)հڰ[zNhEtsFCYӳ%;o)o z_h6%L}Xc"a 6/M;H\eo_A̷cZno|t= G3p ] )'c'.!bE{:濮U lcPtvZG x\&:!(C?rHAa[M쀵)IdK`ӊŠ.;'LA~ p3ebG9,^z Ws #\CP<b7/DH RfnD[|N|7:^sNz*tG˜Q"]yʣ EeM!F^,^,iFek8<@ yBڀFLiqң5TflEd{* P"W, F-lap"mXM ]rFy!F+FvG01`{篡}6-J), hMzRW]՝_޶\g3AW7%s qWz8NX" 2^XS}!އe'^ ,5(`LO"W \u !҆BJv3˥gЏYv!@f- ݋ʼneoly*&H0-:e0a=&mH+L.@: V퉿~3Z.p;niU6n-T  0l*['sâG(cD ɇ g KV}K &G30Ӿ8-2_,߁.VhR8Q ݘSQr0fl9P6{Y#vj^Mis&K> N;᯵œk [V,Vr>D С@K,D dA-9{&{pj 꽎 $Gcl5c +e-+Uk5?gg=UQ_>"~d]x.je:;OfAeGTb`ND{f.ڽ1/.ЇnhcVr$kO+[91}uF3k$@ o$\΃-ElT?$AtᚿPX-_qw9D=+GJx>cb1Ix฽INɝD_gaHls9WBXiIė;>~̓M)6iX4%Nb* !đw=>k&{/kBAEwmK꨾e|*3`s1Ԏ<;Kѧ9mg {PpJNP9/ď' لVfASFəv g&y/@QmtB9؜;@8Yy3˂n/BfUmZlz*Oz"_-O :l=y(榇IT>&reGЀ8B1]ѷE8 #2Y)-w9Z"1|m{U?!+}tdemh ɏ bZHĤ1g_K.uSU~8;A;R=-{pf &y9iw-n}`?+htI4KjBȂ5Mg!~]i+Hσ^po%junIMbN^T=G|'r ! w&׳/MM[Vt&1u\KzpVrGn.@ }+~alBx x}D-Ll4vi&u k-˗Upt[Smfh%Z-絛?iŒ85ɃOdq:;dy^ z*˲ؒ ?\3M,*`.wL.'cO*Cpj[Eр^MUѭwb"u7QڲH!@y>H{#ю.t3h~mvJcgFt6;`7jRڒ\%=xAW' ~Dd#De=,qL9H'Ju! ?!2GaWݱ5S9l.8M ڴ-{_yݭ}z>%tAdj3Pވ5@ F^;[V/u,CRA4Nt4H 8̊FgW{#;SxhFlF|:|⿽if;3C  S@ts y8fhC/oBOnUmkӘ.ъaY;x%IU1C<,q![߫zl!S^Cެsr)tK3-X8&S)i}v=@GA>j2IMn|EfrC; DV v4|դ M;JvC3(u@Tt+ti̿4H@~cju+DyXϢ˔N1%$ڂKĭ|P zy.7qJ7p:LzެΡvU ؞6C!$- 9ͮ8v0AI&#D]r~ݦivQ̀)QѴd|m7`u?,<73mΆ! s=OݜxOM}j)I+ ރ-|i:@%+4yBN3ǹN!k)˱,gЎ?&11A"BQ^&=wMa)6D '1l6Vu1#kzm2-Sù Z}GNE;tHݞQZ"@6z@n'~L y9vWBSo،{zوeIj)v'G2e hVz4y. Һ+uO|>Jrj\ $ڂiI7 1`o`*4N0pKیV*!P'*Vfdl LgA u0b>oEϝQ8yD/17<m剾TxNohc{*vj$YksOVE&ܝ;ԕp>2?堐 r+?eYNA8*qfBëy.9°2+S0t:6*/4 v7k4:҄-Kk&\eu?O Xnj7 ꘑfʯAft~)Ё6>=,Y1Kh+JL)%o:Hio?9 رw^oQ~{PK*Vc0j[jH2XNn|"|nsL9Y/9/zʗM18;$ķ7+97 an"\/SU];{ȃ7Wp =eNN@=>e* AUt.Iiۨ.kxOQdxV-ڄ!eХ{,SY^9O.m$ F&`Zx^C=%e+ʭy1蛥*y՜[63sг /%ϻ_7vj2Nv8'r@ȕUfq&-zhv%q <>橖nh7a Z0D5(j氷;< õ9˃9޽U/R.>l1AC&2貯z0aEV&Edg^F|$I%"kC&}E1I쒹rB}hzi[*W60G;۝o=_J́oLs?7PF& xCuj1˿"2pUB}Fv~@q{(L<܀5+NՁCZ@{t300`lQIo_I>  )%bwWvSrKU#MѝBe'l|E6YsDOS6յT6Q!+VTc:=xԸ{Y,E ?'g&.$O\:^-n˩8&S:dշ6?q=̛xNjdxҧOD:z S8>DE3K4M ~74ڜm"*ӳ hC]4K~>fq"]+]k$JQD|Nf/,BO 8~~lv[W>|_]} PϷ.H)l8BO6ؐ5xjY [9l0t%0XYG%>=>љ+Z*Fpĩp)/IU 08෈ootm(í/=}%1P{&}wp ) Yo\YHپs両=As݈9 TM>cOe2MB*YNKyK[qC{_W ^Ϥ:ݎ7.nWDJ7[ Dn&T)VJ >>1X6h5dAVs,5~!iytܐUyKVb 5T|$j]y5ow+ؐ"G{ R+HLJ,`QkyJ^B&қs=F#\]$`n^fY@[{J$Q+2+|MzRCߊ+CZfG_[[n*x>M!JIO.U_cDK6!v =OIAr~@Sp! lOd$~(}ŴqFgMZKcOUڻW[U gYѸb$6h+1^e[ު U3Nz|~tn Myls~>0| Yָ@ߨ"w~`VJYB߯5-M7 `CAl?֮mkВRyH|%#O&]+SL3i)ǔNaƞ[#Pjbj}ɜQG}O94TVo~x[ I,񢚬@ JDc1z`RXB n~^.`kJ$j: -p>((>E\م WVmo&mdk#kNmHg6SJhπ_ wZFat ~TVWޭE`/U/IcJU爪hY4=J$L0fbRDw6!m>&A*zEN](%ϲմTTxأޝ A_j$ZD0W vTF,f Peޫhd!d>P]%(JcC8{aU.M@>m`v%1$.Mf(3yxi' mR.}UP13KYq>+(2#$AY;P bTh <)w#=|I||puAF܌ +͖ˉ ٪ I*pF!{ -ڋ!i:xTMv}OSHc&$ozp7>ȩ-woOp.7Ӛ\l^ɒj (bƢ`+zW_C59B] <{C#pxVhnPSѕBN([^}>+Och0< Y8% SZCeCiD :^(mrAŔ4&j0 , 6)-˰9}~ѕgIb]CGc2eL'ѧm2ղ RL4#VE*@oiG]V0Bou{Oю0 CH.%Wއ3&f RAS9fdx?u?dˠjtNՉ_Jas7cܻܭir@趰Jvz9`MV=oᜪbmw\};s:=~ vQHwN{( |2R1 ȐtP[xoKѤu+QV.T!L LZȕxAΚ z+r6}ж$[,(Boâ+oeiK0 aܬ^GBw?ͫcON ɩLzf{W:-<ԳZ$B2]QWtI G<;<-rvdNQj U |M -;Bd`t5uvpi`wo"\ո<NAjf-:?g܂P?pBl99報%й+ =5V rAz*.:'ce "B׍+<f{(JpƋ1NmLo*I=G۟a~+XI5|) Հhw{\YӞT'H^:;6jN*UVy9[,TKXfT0"~rO(b?Fc)ō$#$QTc5=1BHN-ZW_tUlPePBƋ[P=#MؐQ-Ỵ;WxoTN4M ."8/̭j3 5uL}.Daϙ0ۿ>eVX' | {wt ?1FFQ8фȦf/KDL=@yMp"1HMC*߇ ᪅)0m0K+pATyw/u jsdWʹ q ׻feLJ0)⦿E*oIl5{, G)$2ddA]/"m)f0^s;(dJrjԪ e +_XM{tw9)g$$a8beel,+;N0M v Z,4 ͺy<ߗ/y'ar j+IxK|Ʈ"́Y'jF\Nm\M@ /2)Pp$اNE#8[f1g5 (^D"tݥaHm-sr@iHEJ]Q—*,jzQ85re@8Բ{|Ae:&Dp-L=<'Eng,WYJ2ѝcVW!a۞:.7śb4gʢS YJ.} A7)DNĒ3PvU`*M >Qv-òS9GVDhIr2\(؊mO1+iLDPZt!# +̡(o94%T޸II#ÂLze w[vdnB\_,S<|Abz^:F!UeX t?!8bB_ ډ9;JrdoG6aWfh.9]jW07Sb VѪP`1AuS*0نeODڤRRh0߷5<i` j1@ /Q1Q(1V%)\T9FM"tʯyv1YmSD^qhbNa~C+q*Jvi$bNT DwOmh8JH6ʲpa|8S @9r[>H o$h|pטҎ=t#jpn):?DXPC bVd/:mV g79{f,!,%AM,wGP'ܛ±wvM)956,Ŕ@RM('GHlD qJ޹^#t0]nX oANz;D/>bKu%j!mIR ;Hpa:D٩ZE\,/5uQ] U|g}[G h45'0{KvZ+k0SAz`%??w j9=ԺL3NY}*BP (Y}ֱ4up̺3<"oY~OڼoIr䅘c;+B?NB^LOk9,ڐH?/ *Go;:qӥkk{bvaܐ)c# k+Dj&?V;zGE3I/+ÚI=OIӢtM 9Kp^tac'7밀g7f 0o=!;q4B%d'iP765%F=gu:I{16|5OO7tB(5&pՀűX| ouȳxD`C=:/%qҝh=!yXQ}adz$FFZښ]ׯL*ãhG  Pg_vSr`zؠDe=mτ/L(>@*F*,ô~".Bv} U|g.ki#xud%h'aob=s^<\תڳpA|ZUu03IՁF'>Qb63+O<-qR!Cq/{1IFŘhlQ'S{h|r#f[AAa:kf<1ĝJ .)~C7&UwCeՑlvM5ܨcC)k31R|>nN5%{%oh~|ΠzJ_raM"$7,  EQXWY^><%ã^}& iNɰH9ۖ163u,ӿYY)g(%+Ϗr' ŰiGty7"ZX#* EPy%Jgqǹ\;c.Td!U0"!a%h0?"a) gg~ѳn=w{Q_U°mxsl>gbIg~~̢aVQ 5;*,W|O(ne[QOnJ+C 7rIGTBxg z}ѱ\aC͈soh n@u>wcP Ad$X$mq2;ynBnMVbqj7/@S >ZT5DdzY (ZhKٱ60 G^XPP˟]%|çi8oߠ:ﲯ㳮pXGqXz{8J?,NHcyY^bqNy5sY\ J0G NZӔk(ForQ֘vK ǵdzU+`6-(-ڵJ0`へ'X&훾fK`BޘYz[3+`PqClz/QY'`]JPpB憭PrNwt:Ƴ Va>tr]O1BCe"}D?'g6:يtxbrb-멏ؖj(Mu|3NIbO 4sO!| ] yt׹>΢bS>̲tcb#DR*L_85i.H0tʵ_v Uƅ2 _E=a*$@ό 5L{>cD;arˢavFKgS]"¨H⭙wˉ!n\ |߹bzp;>0ٱjv87.{]ji[д3w,OӶwnϠS&l7J.2WE:l-noe=`<†ڈ2 h0wo}dV 1)Yya]XtcVaDtxQ*}i27jQHv9fv~lnݲk7j;l^V5dr"Xdza gDN#a7caK>eŐ~O[W3VwMԺؐY81vԘo :[z5+̈́!0*q|8!Ǔ,nqPf7N1< )u?aJ^L1򶴱Hl F)A6:@2-]aHre479e;lMխ)'rr찯H R;DLHe"kw$ܰFRHsSfZfa)wiQ N^IrkV`Impb :XPˏ9gk%PT/7HۅRQt&\u[1fD0E=y_w<@8}tH$ ):CDX9h3 781VHc=SA 7pS7NAo 6Y-~26T Bqڸp9<1 Y^OyZK [ɮ=;񖩣f ;q.>j')CQ  HNS$G[:s2/`"e`L Do~FBoz*¦ G:͉a+a=k;uNXݖ!䘚rz) S 瓬]→ŻA7!ޗ hB5w̾و!BW'3|BE;Bn%hISƩ&HwR39ξCOG{' 5/؁!YђjGj͕t732Yk$nٗ F_E}I٠ZKT߮b bU SzПX0ڨtHlN:ΑSE t9(<sb#_uXq"Fm.3xO^$<}RL_qoQ'vusO%nޱ!Z flLZkQ(CMT/DhD,—WӝPnf8_ ʠ)Pd8/KrQ\S '$='?3 Z$j=?^(֞\Z# H3[0S*$3s:)n,%;6,#QbpX)Q ͑$>XxN볳Nre1$(D/Β:Hb " ' ?O +D=PTa][QR䃚7])aK*`b 2cunD4L߱WJdK~W菳CxӨ}(hl* A %5C6B'NEPpYEcw^'_v}[i 2؁nt a~pXg-NXZGBC!1R-fT\2TW)ޘVQ pX 3PƓgH =b~4px~sI7~K#My?F%C]_q4,t:(`lI˵;$a~7,%mNn[ rk˖)Y\Iwz9 P\ OfcTV9E&XFv>% |SVtlaa=ᇠ4Ѣ>H ޡiOW+x#G3ےM2^Q"b+NJ=XbgK@Nr[D/SXæm*]h`wC-\gN#բR['Ǭ8T3>$^ᥰ-t>y{l lGs4:sߙ@o?!- 6oO{ZdmtfsڅId8U`CV`qJSɐt\O_6-"yjޅ&#%LN۽'рH̢Lh|?.Z0@S`fP ޵!tjt*o\NyWz7~IꢾaU}ʝrZ}.CX|oCW8PF} uoM W&[ *ܧk؛6Д-4 h;y:\)+C'D3dYp) ovzj6vqEG`H$?["1-Ԉ{he ru]$|4F$ E{;T!r}Z"a{Rm8K)WO_OY_k܅m)Ŋص3Le$H. A3tO ع&J[&AP }/pt R.7 _kff" !Vm%;_ z/ZbkpxgG ͡e'+øKbEEK.β5 P]*X~cՊ"-M#{ǘ goG6|mVr7tqť-)ҷor}47|(mz=4g$)BrPVm^(g|(QgȾԾNic-wulBx% Pa-af{Al#b|E^Dw;!Յ(?6@A6*uL]ܚ=#`% 8ĖߙGl*: 3wiݭW $Ǫ{`9%BZcem]z3cv}Z 9:\~Sx\ !g1#4,O|cJ6Fԥdߪ9h˸FzT׀2shlYm`:=5@!C!U/}4'L뤁|\+D(h mL:F`/>}QUeh݃@]Rg Ԋ od3зs|hX,YMuQ);rp~!P4A%ҶzL-YeIѹ ?Ok o }~]aϖ HgTǔ nQ#jܸώۯqt,VK"#s6`SlgS*G-`>LpӨ`HxޜGe TjLi-1iNJZf[B*`RTjj绠_ #Gtz=E! m$r8>u#'R>ymdWQdx~CIh98flHfiinr?7>QD?pHKkذ9f}~N.f?rQ =sD+9yN3 Q2"ǿK;#705sj1qH 0OBvޔ6#bˮӞ:|kP&h LlL8jD;c$ϗ3)>яjGL_B0tI`OIrQȔ7[@;k{2tt6 ˗Vaz\H P޶,&9Nr8ӣ=Ѧy= W['?m0Ȑ1W6٠$Y|#`k<*'5xUB#`ݺuPT1_Zn2^)!\>E~DD<-'z':AM+^B{ {NXweqMjջd6=G, Ђ??`ׂ֝ZMWvƫ]= \Mdo3M3eJKVZT_[ӈ?r%܌%d6IuKJ2#D@}*9{}W ۯSUz`7Rm (AE9'&.*w3b)vxvu;-0q 0 gejJ 9PsrdH4TF bU2f+BED> hZG@Ոb/7,(Dl8GXNpS hI]R eDԳ|f>d ǣ6OE)\ uM2)G}=`oIbahlQB.!aoiL8ܥ \oIHh *Oʍwe#J@׈ {+S#R3;c9*:n'k+Xa]"DVԵVF>FS[R~_yrn&|5t*>֋&RC{)j@glҩ*-(ង NN,?1תrљmZ~-Kj,ΕdQ4@9›l’p KRT1H@fҚOA~%15QuTdn`n:A*a(;1w>FK9E[324姅eˠH\^'N :(YOwg@ J U~2$lK4'"^)l3 TPTz̘d Oߚ>6'Ѽ}B{hw.U?-|s.THl͊ |>}-15;J3[x~N u1℟YeaP?6g1|n/ h$H\2t^`ʌtL}ƚtg0{Jm?ջ *(FhIILoi:Pjsϲf tGlY}P`]ҬQg! :?n,n "XHj 6xO.-fBo*@mI#h-,ˮ!2S!bJȷ*חHlҫ:.wlqѬ6՞xyRܭF3G|n7vfӄM-'%, 0y nԐ5!&k 7I#9(v+w7,y gz >_DFD5`"+YTfXy 7cP5qhx2[p3;*v:0J&)\qkYy"ޛxjd%Gެr%Ɠ-tŷ[)!x0,8Jxm wL hEd%Wv7^el_ Æ%$%b|8JupQ9tJoIbo+x|Q6rE;h+eхŽw)e΢eIRqBoxEi ޝ4^ DvCz@(LSo =#mI PF_nj}W{L:z8ȕPyT^IoOa.ZQ=mDm۷7CttAr|S:S? l CZ#R6ZA_bؙ(n ibֶߪT7oƋ,PJ,"vhl ԫX$,Vi[߭jD %%Io(14j>_@s1Þ6~[5ha6 iױpr?:0^JFRLA sb>Π`W$H:\\b@͔W`byJM uX2 hG>ڛ5]i4iS.bZ|~]( -ҀtN3 SS&5)e4?z\t)B/ln ˖PWT *$6+ `.%.c70p{V6o>Uӹ ͺ&#;}JDzQPDOV|*C Re35h (-vQd<4j%r>{:G33[7Q"zz!2Z:1~TY#哬D_ABWyvJ?_ $*,0A]ˌz0y0g0xzTQ7?*1Ç8wHo9btx[\$Ji[Xq|VF掃;dOy^dmLusq^AxLpWq9rmX@N jD -!)vIwsBi|I"fecƄnQZA&ͳw<PHfV"=C}z!ZFF02,S{2R'3[5|T ?:O[vW_Ms65CNgnl3]Z{(˸\QCzw\wLMۂ~~9O](Ԫ~8bN@\ ` mhr/@ Utou>/ yKґ $%qp\j,HiU ng2c7(B*wV;&gh qQrC/2%Jb*=w!QQB2 n?~}K_x vFHF-3"@XwC|;Wr՛f Tr/+CfG0>:S.@N,M,r>(n:_\oDHT[-fJ`7'USܚFT-ލKxlmN44˜dOCrq߰+l>XA&E!ɗ<,7j {0/tв8Db}=(Iʹ@L}Ӧ߇F;(7>A q0ð*򪦩||)8>)1'|R0}H1\P~m_ 7; U(Uj@N3-Mh[< T$0U9; +!5Um-{*'Iu0H#3͕g.(܄'5!V:$؜kdZ OIdztsAW( bn ̳vI]OpzZ;F"5nͳښzT(Eo&BT6?˧N5_Й0ٮ H&h~I*i;il^=c>r'׬hx(^<(#Kfx:*>gdG)vj& K`W:S[qV4|**3wI_qOe"woBXz?ɩK;o{Lg+gt9DBn-`[ I5GZm9ɑhAQvX`lmC0,ȸWQvU-v\/N+gE;B!dzڦ1Q~E%`aGۑS!Pu\%|xL>bkSv#ʂC;u#'1 ]'Ge| Tf w \5W~~vs%8VWWVBƧ= {++XQ 7 MdX YCwhRC2{np {R[Ibo*c{o].b,GbA`w÷Xe0* "ѫ@@,`R0ndrc_@] U_ZNAP)rV;x9˛3|Ԭށ`ˆ]jnRVrBTCߐnvXd@ҕ T>{7'!e9m)t~Q2U!Oρ6Y:z[啃y M^x|[͵nS&a3$k\L6NJ;k+9䣸3(/Dsqт򊐖b9ǭ5ߙzI* 9ڽbF߄ȩUk/u57g ^>8Pj]P2ֿmtg(pE6C[Q*nCu#t@qgAPrR[>)ԆCcHR'ݍVn8[pr0\#@ʝ:,WMG*#wȜ3n휕'92_[A)<;zCN;4 `>,{]Z^Xr8@"lK->? Ѡzz}fJ5 C {9,W7@GotwwHg1j1n7D8 HhK2LcYfEs?4BԻJ6D^i <2f&=/A~mQ_ 34LwZvi3\m:o?ru~I F4hw68ӱ4,W^^ /onlW8 ';wA?jaҌO>f3=$bĉ%k)Y/| _%8C%^OE{[J4CHmO.2-a$O\)!XSFy#Ej(u<ʹ9뢔lՒ #0ו,O%WMl#*'^ '~YsDpz͛ƮÆ i{  .zA7d1Gd7Dq?nsu RmfLT\J]Զٜ8@4DO?pVq49;Q,}2׭}ɷ~cRG iAy(%C EWX_42.5æyԃo"fn# ȧꎧe ]S)G98w@hB,EpSS2鮺9Dz{-^Mb_dBonaa >Eku)Օin=k\cV_Vo^fSp(8;+E"}+ 1K1L \8%O~}DQ׈c؆) ҉~šsW,OIP3*/:BMd8,%ZUqjnǕAb "܅hKM5] ##lh>/Tl) ̄wsPxsvoO{,e,zaH[ H}JP( Hworϖ#Y?j`..=}Ls)8=.#rw5ެ59"[gY8[yqjY"\nQ9l#Sse$][Xn< _>= pº&Ɗ(Rվ+Z{O>dm`O5*M^31ݸ ْ4&t k Ǔhp}8y~iG1;:8WNIM%8l6$踾IT?`a m p<b<ӮBa95]0w5\ǤͲ 6 0-0J)OKnL"gk7U1/5׆Ȉ q!i|ڢs FN W0¥xf|bI@M+٭=w[{᝹9vq[;z5K Q:+eqH~uVgZjPX!)%>P@ 89}JLA'$x!zY5W͝K^ ,mD!҆RX8S`_ʯgx+}kO3aAYʓC}x1*0rۻkly1Xss3<:sudk?F) B0PxAv93<'^9 +}LfN@Cn(~k1gq`'s=m[Ts+"ku`MDu ]@bJԗtmc14h `mWbTC KギyTT`8`f:. 01ZInivRDPSe0ni0u aڞ;iQ^'TCi2N lԜw1 [7 gIsy{?J^n g%Y^4>oc>=H$A ^O'{xg͋T9ktφl97jRd_*dX<_"z'Ɔ5UICjYTo7jSob> -e1 V0Xi0d@ " 7KuLz~}6--qJIH.Ɍ{#HFl++pX->ñ ؍9b9`0:(<,ȞۈAoz' şW+l>\PI@`|bx A> ={ʐj:ik~;HuXFA[]c$O!ZKk':pPS+fłZ(P5Rj=gqDhD#Tm~$ hg;627L~dh) TPQCUK!u/8ЈZ6yx9islwOjt nOl d9+IDjqfklܰy)w}u(,m(03Z}?۾Vn8>Q;`ѻk4s~f~^SAS9HO` V簪803/$:|ώݸX;D\eJ=Im͎6K0mR >&2-Yۖ-?Ou(a0R:G$Xȩ0D=zSki5G/0G&h`ϭ"}Ot2лX*~$zGB#An j+g 0( [;NrPĮ̑ _8 Kl2.MH)(Dx]:6۾jY Iaj[hmpjA@cж~SlY¿{[oQBk]>=s̕E {#lwiq)IMX ]H\/#ЗsTU,*xNCsne(Yt;JLQNW'*H5BO86c|槉5x@W,v 1J(IH]0tTyb.MtfᎤaI_~KYgP&7\x[b^[Mu`veKu\9!]%Ϊ]!_9WL(pmD YXq眽t{J&{#Wj5$Uʝ%xiCEΡ!FK/Д3kt=v=|D>HlGnnF[ ס~"@*Gb)(wMnUi^ k$2̯1GM_I/_0o- ӷ)f&sԑ6cp7b|2#"ub⩠VcJ41jg_`׹Ț$/40_kZ~x9k)a,vsal0cY/-5J_SkrlM7T,C`㤄E$ǤkpdznFAyF4e7 ,rG.:TKÎ" 1vVͽVtլY%C|Eccn5{&G. D%zYX#*fq$YNVt:w[!B \  pٍm2ش%P@ELN}ir@R@G}fLCfr.5R;{ELpm:f}Gkrj^#vk??#FangD LjxROZnԧƚTM9=U||G&]pslJ*K!mw2xiDiƟ/Mo'xW@W`|zB tn:󇹋w: E Oơja4{@EzyQǧ횘ؒ (JoFWf9`"D5t_%6.f#i~8"x22Jz(p9`OxOxbH $GB?FF(Ңɨ7ȢnL(_ʸo7%9Ya՞[(aAYbesZ2jHT4^jCZ@>FްN-~kٓ$(0 PbkȬZa\D K-lIȹYCyޤٽD{4oڬԋ d Hdz:vw)C Iy Rm9 14B=,t*63nИZqcw^,Pw£-?Z~c* :U.FA רr/`kDco+cĠAf# %,Dgֹvؓ: s?'(tv,Eamf5KHS`PJ()K>zXy &hm/о3TݾڭӸih$$H֫LWk K7ڜͫmɢ>|nJ@Oo<&0W K2|BgQ@/FĿȃ]#JFD(]0Ԧ qwsJ5+Gt6tr":NdQ! KB*GlKѷÇA>N;I.5lZEM7_HB%\Q^bErw#rvp-ȧ6h$K7܎aFWor nEޏ6Ꮹ}]|\uX 7VZcai06e70F(ez.#[?Pm&WK_ tzvϑ$o_-$k!w~LUCu`w3>kmXz;ww>dI$e um@`{__S:1KKpkzߝۏ)+Շ& OT]++?Ȟ3[-@#7 7ήGʬ<46hUI9jŷ̓ F콡a,%Pޣo6^˪]pnUCʉTuiIqVUp|쑣Sh/;6Nߧ:-;[72-UvP@3a<쁾6Rrћڰ=Zfz-M%i-3twM-,4F< ɕUi"րߎ;%a_&xPSJkg"|y0x;vٿ+sT!T=%-`ZUn'6u0/ڌ n3z8j m KʭS0)m,vLOQdmՓ@)3غ=3~&ejNzh.!1&҈l_m`_ya|xzOτޏwx013MCmd;n۟pX=l) FcFh⚧`FݥpGC. g)\]]jX61Oڇ ,,. n=c.+Ey/ּMPMm0pEk */J8[wѦ$EhU3RCەr7f|wQ v3ԞC'̔AQYaD*UXh!6_e!E.x(0ag&p(oK-uxy Ի҄穽#8#p#51{D^Lֆ+c (l>nPN#,<|i.MD8BP)P,ѷGT5L6y9l{ 'jlzW)pb<'hX0P e_mJ., h։{4[U10-jB_30E!`xbaIUZ -STKk4BpwGBiK9=Fe,.dp|UXS|Nhԇٓ{E:!d~UeML]X> wf#'gk0,#;Qw}G{{D-g,#qcוqƒ}WEj]Y|`=~Iދ꽶{[S%ѯE&&hno_fP7RXru͌C),Ո+և2j73aL>y"tM%XYmh@==L5\Ly֧3,oNDbJ;cf"j|"4j !X߶fx7@y #[:-wwc/ɨ%B"+9):;1DAQ:l@zژ*6֓5Q1RC < r{G,l`"s@=ԌRpĵ^n6JcQ @>z$82{%ԱחNN;W#؞# ksxǂ FuI/I`'ad`'.5_\uP-:L'9q0l#fpld1(W'~S  C1JB:ҋ 6L :f}e 1Z 炱s[@Oq9@8ie\c "㓞&C>:e5'|PVJ`;Z6O {`Xge59ɗX.4o=䮗OuGI<,&' s -a o]=PzCvO֙ń `֙S21z= SU:*wtu|PZ՞BUg"Lk_jxc!my,=9<Y~ *Ng<`#@9JVz4UU*bM)As7 i:_/1N)>|Kcig8d~p<* ɍl}{,K.q+UnnPmi*\~e1ӘKl|S>:6lMLnp&SgwIhu%.i]h[)F%Nq sN,[9/8:{N {e͋Kk!\1IkUϤV!7ovk JPR5OgAtwf:Oq)*Ä_f:LR#MHp_@#cRhgzj݁T&=VBSx2&糟GnVfQ>|Y2%d/WdDsi,#9B$sʐiijG]ּ;O".!{nFn-5-hm2| :T ǖy>’"r%f8{^w0U^51&IG{UmkSS6HK5aOa߅,=$4tW#~ x[3:%W LIK~\OƔMWcu'mZϬ.qX)ӛ-lE㼓BF;OH+Us&AK\{aUJ 8q鿑K0sUHrf>- 8gq%dp%wYEH9  h^g^6ܦLqraPl]3 ~T.8)}w Vv Phyx":ܓ[;Όepl*E# j'Ni? yȵ]إ:;4c-J 7s!1LxSt|ui$f \]n$gf*gj'>'; /ׄe""2j|, |RFôaKx$HX/ަD'oK uU'%1|`\_"1-,I-(vx =jv}͖fSpU^M4 o uKCH;,%+a}(KO),Di;eALֆ*l\?B>r_JmZ6+UEze[4mʋK@ qΖY G2zt2_k]@[ђm76 x\Hk@,Rl:@Be%VUhu~+1@)uxq>XJm K5yV$d #c SYWrvRkRj3OK[Y;b=TM9ҘZM_M7&>>qUĉ S5 s3ox ̖Nס&2bdiޡT@"% K;n;[ I!Bqҕx&szG Rg,BUVc6q>^(t8rB4eiٱV*%] 4_S)фr41o,]H||!E:֒!Rݳ ]5NgA#XkoC~pRt&eg_0+hAo^{ ǴMb[+ ?j%\Z߻<&k& t%Q4F ϰ[[t: xjiO`]eC'8uO0D z I({Uj/ @r2ҵMߦ;7`Mm" `NrO%I |s ݆F.Dz+ /Uw<M77IzFT 5yS7w(;{ȊS!A&D0 _wV56ҷ+y;h/ n*l{!B=nȧL, {v ڬlehi 'JstCo,OY$`#nŸpU2N5m =ɏBZNvu2uh(x}]yx>ܰT#meg[c0' (U*Yqxp2jEQp&^n!L\>OO(a|QZ1PH7 nKQhe0e DQucevT?j!b{O2U<iS;8ħRʠt~DAEG)֎Be=BJഐ!I֬G~5Y0zV19i!.8| ` U,eEB{˩W!^h1[Z&xU+lDS(|aS4EUK`#.˃+ns]~-.q ѳX'F}F&Stm8!#OoOȶxKxL?VKhʵx/~729n:+']WUA:lEB,+.IMF1۫t_)eq Rܔ㣈$Sr%TFǍtE~JY~8e6D M H&^ɘ:bo:鲹)@ E-ӕiSz%hSa$+OtGШ+m7:X#xk!30'&%jO7.cN`d 6u9Q;;%T7҂`" u뗰 %aԳIG<g z\l@wuWCܴh_u#_1aWܲ<F}vÖ^p7P}YhzaiN mQ~* ` O>K؁)u9o?q8=z]FtŎ/қsGx+IL\';}O`cĩ04z4FZfglWQOr JY81?$9ŀtZ:0_)wetK;ϙR{dRgba=cFlErBaTa($$U:Vwksgq#5!*A@Зgb104]v.Z1oo `AP4-y%3=-yda +Je7!쇤K ~K4>\ι:V^T޻|K|X34̪WAtfb }Q {5]%cpaw2e .,w}^eI嵙*>uH|_]&hKAO.L5Nkc9QM8 _mM K A8gxW0kHHãW}M{OɬVA<[BxBl0YrܛK VCm6AܙKecϬ(0¢3YO<%K4C v j/LMh u>Fr\:Gfs`WXKO1ZxSe޶VD3_iyѢz-k} V~]$)Q2Sa\/_xoIc|]XP:пcǢj] [ N L62l5>* $d Īu_C禲. c]7i-bwI`͟S.v4.F\$9&򔐉)~ÖCHLx#Ÿy90ͽ\ R`O<8|iW&Qv?!+(}l Bg.ƚn;G,D.c3 _.10$-fz[vr3ۂX:%Wׄ& nKU;(;u_,*iTKvx]dɗoiDVTդ=HR"WL63#?9tcL,zOOs(%9V*_YG4O* JD4[n09ؓ,JK1,n:U+ *@hf0,U8Mpu 9+މR`+Ó4 F e] 6~h.5Mh0ſt4f{H8߳ic*HApJ4VPƻFTT`}nJХQچT=@yth=jqè nt$3l<Wts mH)'ڕc6zM/m}셃X?⮼5q9Y N2a4˘*g-S)'x3??CXDTVShb ;h!VT?riA7(\GiUj#}!MET+Xb{2rp$ qfd"#~*uԫqPMZj 2leTރWf MV"  lXcm|Y 8]90&U_BJ޻&bJ^3~mFpm9A}XHL0*p8Vz?>å H¦Zʦ}iǼ.>y1_}\EEG*t#߉s?ɻOB~lJjjaLļ:gȑǨ pV喈[B 휏jSzg#M+Tgc;ڻ$Q9XCOY^1>YC1Ӡvi!zǓ(Eop(}b)C?n.jzcA1a|)Xf=}t)mw՟lGAWy\[Fk5EH7Z9'n5`ҷ^9zQz;5@ ~ڤAUO8Rgelo ?{3rYMPYGXnh\ZI PBGm|ГIZLSJCxi9y{>U)yuڦ]-*a0.5[s H S1`yl5-5\\PW/)2 ocuNrP^|V^PyS\d25KҔl7jΠعʈ#V u#}d]Wa;?pӦc1"]hW4V'(H9 }EMPƭu*A,[Y{e=&Z(y~\Ʋڙ̦ȶM!*pS\bELDظvP Gh q2pCj"17Du ,Ś<8#UMI[efYF eO#Z-b#/_z.BgLa GLҗulNwj޸c[ ΖP/Uy^vޱJLW8ģSr.dMzѧwhʾ0o!(/!A>'1J3ڐ(dSWexֱܷP7771:lJxϘ #oK9U`XO>7J@6nNvY_eD $V]cGgyZd"'q`3 s4E-kqv9z3ʆ@o 0LXBWZC>y'=D:I@"Kr`ߞgz0P[ǜפ=5Ժ&1{t2 mj%3 = a*D!*Y43y^/~~0ު=Zcw P9%0Zд{^ Bs nMVw jΛ9tsB7ip1EC= bM\[E0\K5Kmjȇ'Kcڮ :O̲S5Ȅp3r%6x6V<$xq0DTeoNs" qD)H1AWW. [xqpI&Kns$潲n)>nщ_H;m;>t VS.DM5[bme\7jKP`Q3D:&Ǟ\܇NhJ6/Rᴚk6yrH`n◃ UC+K`TBv9m$9^zX'l[ài ;ރzDyǎ2GG:thlU#Ufp5J3F" Ĝna}(mt(f1DHބH>C 4_t#5He "Ko=jC)ѳ6 9OjXTqNiݭr>GtHV/!O3 e4G!N*f Ĭ&]MJU #0wIr&~@ >-Y)#K2+ikă)IxmSfK6.TH L/SNQ6DLH\XUq}ot@)DC8rx1 &-z'P&|c%3Z"'{_p]v 0'sFŸ\X7;&t!3F`.5.XY!#i>uՓa N|`+̡Htp ӛ"GQx|Ru*5ht^4֔y bVo%)QTBY{MoԢW֞Mn[" 2D/MוU~P"sR󒎄$@=)Z ͪhѧrh"W W!4(QV>^ï_-yܚbwdlH WP52Y| '|XYFjͶ`jqKħ_D]U:{;ߨbIA&k~Q/)>y4>- bI \@,_*#GFSg PhpI))&T&|CBYqk[Y?i&G4PBsg5U n5Zj)wsҎ^r!.,CC/'wn~2r% ,XcJc"OS8L4 WqŪʏ0!^5WOGV9 |Z ʘA?|7mMywV|c-Fkt,w>2Ӭ l32Lz88[(Oo.vJvZV1t訁/Οʀ0 - '~Y1FգӋsr3WlD 7hb/8:*勺E#, rLg6j00R*U/LKy.NPK8z}ߟp3ĺ UGQ. GNcn1CӵF*V@ X;5F@lΨ"[n.NQ\v18O~EN\(j/v xQ)جp7<4u? mڡ=Д%Z$?Li`8i5to0a{-9<;Kb~c%6)ʖ^Aye{K4vTXgQ0Vqug?ND+-Z62Un|f.h8P3Q e3)(JBk02_|?kvr9ЃHɣZ!G.]/}2Z%KnRfx̙TOHmr픺vKw0N P=wzM9rb }ڌŜΠ(PH!F A;@&-,%jkc]IVXS'1h^m!w5KLfQjbY Z) myMX&[J}2ܣa_*sًUJ[bc,#`}%v ~+H/>b&P˙I`(WOh>NI`^lePdwJ F}%saHP!R%L[3w''C< ĔOcvZ"+H.} SGN%+]yM2=lۤ _:BBkC߼-:NԞ@b{ LrAb+YvriruXX:wN{- `1.-?*R,t@?vKdS=g[>K㬁 +<ˁU#HJT ]9TY :zN(wGrò$S*'S-ΌXsiXFUuMMC{]xhZrm}5Ilh|j|pҜdK?ťIB%H=BI.g1 f 9ipGs TA@)WP~nG_NW;1R`?N\%و¦*r^P OV!7?XS>xb|tϚ_*G@ũkf{ev}Dkѻm("#tkYh\\]!5afз~-{`o70_?SF!#AV |RG|^ADr`e9JZcbQ XRKmѠuS|)4 \de{z(6.B1"&aFl^{$;&%Ҙ iث 0_ W@Hu,o@ɕ&wAc,p[0Pqњ$u"A\4T` Cb%l7X5Sunp9`ddLW1_֬ PϗZ9_D_`I lEKƊC?n{ljr%7p@'\)h1 6GXʭ~=ǾgJQk>?xpҥ~ Xp?.wIq^U5P<\kxzw,*uo2t}r83oKؘgcVke?MbɆetaE]=Ht}\jֺ8'*=敬[5?l6_$AQ8B}\nMsvi!Ԣ~ڏ! _D#9Pbේ:" 0ЗdL3.0^]"%ygvvU"ڮLe8YR-?@# irr'Qޑ5<,wUK =nùu* 2𑑺(k93՗\H,.47~,ܲ' @40q➉;@ٕکvgBҮWv4٭7d҈NH} %)}:K/,ǜcX;z7;Ds/RL{QҎG+:QB1$>`UE>~۵훑GlhМ tѶ0&>J_$b(=󝜤nd.@ ƿl !y~sm~^}*ΧlԀãnGK~X.MR|dlH,-)Iu\կV6Qr:bS IFqrIL<6"eR?r#+[me["Z̗hxte93[ݯ#?gBtC8QGR7Qo-~ ^1 .7tޤY%)ynBg8ivc>5DVշѬh*2eGW׺idX jD]sa+w9-|S{ 2 %4GMvXpYpA\mO!~RQe>CڲHM}L|DiߜCgz6F֒a}x>M Ly9e)ˆ>&Y#e+EY؈۬Rz@@τrCs2gES&}@R)فɴu`.A)!aZ)'Aݭ У]x钒o]"TU y_0\i$gZuƩٽ&3RfҟAZEfy~Uuq@J9-xYFyM~ )0z=w\(\iY~*F|D`o8Hj) N'&JŌpαC7xvLjFMlmoD M0F=Դ/H^.F(b ՙiDL[>$xқ8䗼@c;qֺdVJo尻hь [o2u<ⅷ|hGH_";6 WנEE7 /-I<~#(u%iUi8^YӬTlpc,$S;H-Lo÷ؠyXXJ.{?sd0sp_~;U3Zy Q2LqlܛM %"O͚sA޻ݑ2zB|Nss@o𰨎4Fu~7XrbΜY7 ۭGv~&""|?b()si(UcCw)7-K<ܥS'&+6 ]MdGx~ /Qhn "oA0tXouIqλkIx#ր"ߓ asEvafpcj45u'*!vP7=0 82&'7v*ZTm؀wRKe2&7ɹ{&Eܼ?w|ή[WyWJ5l|MmuLVVŵ>TCFWХ+9t/x!Ě(L`("]ȘU#[<&bmD3yd |[)Qf{OR25_ ΡvQg'onUQ^(w2 EFeފ|U >u=yj*ov4Tk*mM׃&A'ZhF2̀X1~U>ZA T#Xʷ& YbbMF-I}TfC۞./eikhei* RV@A%탢,mG3<ɗlOIAمXquslot̄hɘ3+q=@MH&V܀@ yUŹߩS-bӂoB]MIbGYzYofk!J{_@U4S-za*1e4gf7ˆ)b;㩹Kq˦:E.B0lmSY.Kz!^/WHWovɇAqVvmdP4n4"!JSM#+j*XG&ݺ՚ *?ƴDEcĬEiazc@P[=a+]2B0KgR,8Lv^qfSn<S>׼wwI1a% J'xɬaJt3U|kV =:`^acRȡ۝JY4m^q]#v MNURi؜qBNGA˦o/j4Y},p-3ٶ"VwWq3I 3q3Tx.UhHQܒ#;rO}VxK+P)xRwǿ殚(L+"-*ӬKoBe\9V5ԀԦIR'#{l6Zz"7!f̊^}~ S#+!`ÓoEQutSfLt 䉑I'.{~G?5.&y˷إ[aXKs7Zf?ͷS ] R :t CSwHܧ;X x@m:]wA#E+-%6,k|6' 1\ au$P!CEk._Oq@&3\mQ|RGras< kGmȻWjZE$np9wkZYk 03*3`jhݾׄf|$֯(bٛ8xq-ʡEA U BT^,i]<}e. `A1@:;^oW[ !K>}H2 @Av.;[XbNiY* >T7j~o ={A~h/_Nj|wdl@AQMVtxG;f%61e8*[$lnn:s)Je[Jz!DܯSkgc8Œx ];R969ܽJXS Ƨ@JoK* KWz{„&UQZ]F*HΪ7zk< zmŨ (*]8{Bög&16W03~lȕY{7%:eˎ0kN~š̖ati=X rūpk%DI+Ֆam-_h!+v׾M;ڊ49kf7F~A Cnqc9:$; ԤNEEfRQB7r$x8#*ySj)`H%љ{^By]gA۬&l5=S#P!WxCgԽڹ/_Y?S(^81GZFonH&0Xq DAL0]Et͆Mm,?݇)Rm 3H;]f $À=p:.:Q yy'J;[4Lh[F_: %gU?sxnG2-R: o#]G-?y dyk-{}08ey*N܎"gG.%/̨–sBVڵ^BT/);7,М' .rQq~x"_yq2SQ ͳWʟޱWZqMdڦr }@`rH<g'*唍>&igt5u»#LY$zG~U!۷~C<=̰uL"TuU!NꊫbCE-@(X&_ObaBd 0(1(Pg?a1aTN6-bg/ViMExn{ ?Π=B+Y@w01ۻ@[RUp$a,9tD4=P"<*Ȣ_$T[tXdNEVH ۍ38G!rkpicA^ڟ|cC ="=Uca%O-l"z77l^vzFWěAг9D(PUC]܌5٣ۄD?}$zu *,r۟=R풌YEž  ~Rp32:$GE9e1wn9m,j(ӻ3:ɳd<xn5 l7}9>V:[7WgC'\|&=orYMy:4FcËÞ;?#C 2׷4d+O+i:5߹n)ԯzxGyPEfp^@e*$kߎ=q=')yO3*7~ۊ s'P9lr yJN&cP&s Ƶ>ԝ٫WRC#C`Uż=p3QpM=0}dήNg~I`g~p=rAFNʋ ږkoNJ>t> y㣹q7m;67x[yOyxesZhmĂ,ICR{B$w!4FMH aߋT$K.2h[%/ 'nd-ڻA3%[῿0J:N;VО/H7N3m 9gk {2N*jwpy` ˒LK܃c͊C[U¨3OŬh'g{c;]ʏ;aTy;vMdS=},L;͵FS,kn3؝yNslqO͚>`&g^zS+SqL[>&=4-멕aж=nⱥP=luDu}ajTc_.ТqO1f3䐎ؠ(y6nN\IL1e?cy` %Z K0bݖgEڒ0)D⠼_vy$S݂Е ȗ&0YZ"s#p7/|@C.7RU'f7SnM&>ও?+Ǣuɗ/xn5Թ;4 PNۑY9')GPE0ʻױ< %&K1 @ F2`uoCop^O6ޒ"E%`ӁX Q[$uP\nR97;RId Y#mCG Ee9EsʴRm!N_s?fҚ|:>:2ջG#h)˟Dɥpǃ{輈hj4񆧽srqyk`hV&*ځ6&p[hbmC1)KrT9evA'LQ!W,KHP&"f -BXnX*GD@*s+q3bf?r-OX =#B!]q½q9VvcJ8)p{(5^ЧF|ReaX5 Z:L"S;AHƮjjfVX 6aЮkTiJf큘H]ż[Q8Hh+CSNU eO\?T#^29 1 rNh]e&F]'w a/^jQ!Mzykb>[O$._`R.vKu?{%ָ7CԼW卸zrл a]Agۮ=pF58l/O`AʨR.oPc:$!H}2.H>,J +Z0ꃮy;LU{\(b*0ZjD'vܪKgk+Or?9k|F'Fdwmw)dPWROa*[_ A.*IGa%r2,NPQ:7s1r?b^L)dyj!a[BH?O 1 \ܥQ2}7lV\7'SPT-ߛpQUf0L1'&fU9]l zaڬHN+P(Ϳ5͆PFވܙ:vV+ϯP2Ѥy$ -@6鮸+rp|M|=[!yV7|]c=,A\ܸMg>u'H}|2Bfz6Oݖt GLbNgh<xxAQe([1f<Q{5ݕ'*'.,ԡ j?p H'A'=UJўؖqv ʀ6t/Ecמ>BstLpnrT TnQYQ nZJ$Q s=b2aw_kZʃI,Vi#yXf$3DPRh#F@΍=daW[dtH8/Ơ Rgh>vL gnfe~)n| MJd-F:l{)|dn(H +ōiY+^ފG`+Y⋄s`XM Ds/m:Y-hmW2ys5@m9dl-kpAH "  R!2ՒAr2p20ƫg!W^UX,d{oZ!QM%g5~Ny}BY7Lcܛ_}T q(AU&q==-mAv}{m`BJh.1 i +k|oyHZsc\pSxHu$dCҮ%I;$џ S<0w3 džQA]N}D^=8+E Gol 0 ŎBqh4TTOL }v;JXp>`|!Qs1om-Qك>g͎^Y LY:m_D}`^ ;\gX1ET<CBf.?(+Bi&4u+EcdLܾJ( gO?c Hg)YLg05;;%F9]|X5ƽY/m2+E"VAQGw+HjxO3+G ڸ|˽M87m -# l^Ga鄘=IE ~"e(r ݒk)s`Q}MVqBol@{ |>A 9#6AoC:ۡZb#Lxrv_^H6#{*b]n:1nsq(t#XRW朜S<$}c@¬Ds^"G1 .l|y?ZHnS,].5Ui"TNW}U+Ս (M|ULOEk|k ycwVUw#3ҎuR=㌔LcZ ΰF"hX)1Կ8UDӵ=imN}9G$ίηCFݚ@j]L? !nJ6UX=2-P{ͮjFϨ/_8Q1JC}ӎt";jKcMğk !_5{$ , X_ %Geq?+XV%<[Y*0ﲾ1MsG@\r!BղBP+q Ψc^ՈvV5pr. G!WWTƇ PWjȔ /sЊSEʇfܙҬ_ʉdP3e /Xk)93CJ_YnG~_wh5(X8O۝_0xj1+ !e,,>]05P0mu\gD](*qvo-u 9ݮin(=OMgUdyRǏ#^Ĵڙ+M Նp sWT"vAYm; A6x+#{kRIS%5*jz<@$;3X j~I mp$if5Wc'7͠IRF29<k<v}@|.CQaIto>Jמ__~y.%]. e"ւA3un8,29 @3/%y-5$l?@S8I*-zWpF ߫_7\Pd$KF:O݈Y }M)hP.9@QhCtlWT/ Cm!pF7u<ކ@ǢhUԞ\!^9C+6Q > 7yp Y*f _ޭx1T*4V& uw6A=09&؀^StRqИX/ Tטi[m!5¹C 9D\᢭R NFBѝ J,8U m|1p׵ $FlHTG9!Ee"5tWHrʎ9&yDOA U? j:(xFr/8EXrݟ0|US%jl=#⭹&7Oq2c͋КmF2쭥4fD6Zo4? +9/0 SJPcQFW@ /q(ru]ũr/aLxˠu(ʰ+`H譑bbռQOVcGK\ [:aS襷1>h{PbrQHt3S\!L`ʍB-3$@rp}^maoq{XҘi.})uCtS?1I3Z0z+y3›es נ?1WRfnhBQxQ״uڪ6bJH!{[pv2\פn;_ʆJ vZ+] |boa|t `W@w=ۜG``E']˹p&C͋lzigAtM:%$33A3TPW0sq$\r?4|"kpHrr PăaY"~PI*P'jNGܡ=ȁmt2a-LRdxy'?mw _ Rt.̲hF2c݃o>`!B!M46h6)V8?}"u$ҼY0 S-&NE~z8пbR eYL[Z:fF$_} F;DQHZQ@mJ s?чᓰ#>Ki 3qBt{d: @"m*Ƒԥ;-jH0֚BV7*}/ټVNuz@J _7Jz^1X=Z!IE^RRHp)껆bM0p' g{,0sj* a%?S*yE6EN일y-ɸqJ77JngRJ?m8<:v?äHaGaKwl2M sUt e ,F~ X<௅[e=N'A)sadgȚ>rsfC2AJBu=5o_ dfA\YŠ.py_!2+W曚ҤVd-O,+Y`[{qDDh5܍@?K3qR!w8MVP*aZ;<g m(ɭew۪]ò>ޢ Q Epa/}pn`IM0c QݬӝT@A+f̶ƘF+daQ%Ƅ`/c{DsfFo3YٿyTD2=9&[~%{fzPصs]coTJ^ VeNagvVq o<;nRy(ǢӢ?XWZ.Jp)k0XKSum6@[_N°AC`_-s;2Ω80pYzT>bzt˾a'?BSw.1%ySIm|5J/_KM۳b7Fd@)qɉFahPHŤ^G> S6iEVD`Vt na-E&`.E^"ӎiځJ3HwŞ[)噠4/*۟"_h")y*7nT*G|wE'{:Or$zYj)^;ò[rnh+/in]U^h3Ru zu뿨xbiE&2 nl{ءxŶ\ 7rQII@#ʔNAt(LCCJQ4ɋoZ ;:_͝;Wo.o1͌!b0zA'\Jm ]2(,吴0swxJo_˔x؅Q܍̨frz'gDz_j]A7 (J۞~^]G;3x o0]/R?''ZǶu#NH]Xb%L NV"փC˜XIWǩ&#*l94.C,GԷ -%)?x”tŘZu%8cK.(yS"9,<.d69ۑ083ea>}:ւy@ Őfق!i陬͑·ӻ~Kfli\r:_' K6Ø}\×{7#(2Zٹyu/! "vˀi:fZj@M}3t\hR6=5|#"z`@V kɵ r#Xqsmt:X3f ẙ[28wsOW|lՉ3HRTdk&U9xӈorP-&D6fq0! H"u=JgFH.z[t\VE` &/+o88i>eowdG2CQ5E 7yZFW 2_Qs?Q΋E1dhmbB0:jʗ oJ|^B).K[.a8.ۅL3^"i<}V9t,ǻ^H Y?u}/*eL\sƂw v.L͑&&AʄBUv&qٷSςnu"Ƒ[&DP?5BveQl+am6ܢv:Rp~$=M†}qwDs(os#2oK}ToĮuD)VG/ͬ>qbkIg?P8Sph)3gTH{4({e[zw@SZqfvܔWw#,ceҞ y qo(ޣ|KUc1F4EVwMCw -C^jvt|p-|ĖL4 w&?C8C=q;i4"5@E32KgQ%PZ)Փ1~߭ dm^s>iHF؏x(kTT1DSӥ-/ālps+"l깙SWL鼄y%@f 90jaascP߿6掩T߲/idxrm]X>K6ą [ vW;(K;+?YnoW嘿;_M`ԝh~ü99cY_T.A痤ҫBJ:tإNAAm'eӸ9J*j^1dS˩K&8"% NHjϩb#qf2MM(K b:9>ԥ!֕݌vET4QZ["F[>l\G?*4 S7$j3T˻nKfU TKtaD{!@ N|JUxQu}Ĝ;7:L ތ7F kg}|JAhlX6MUl@BC5Tru8*ml8$ V"8Mj |i/ܹ1\޾VLAq*yFj)]E~.rtTg&ߡۜDĒ'(]6)jq.#u%iބi/~,&m[===1il9 GH7 OorY[[vh"[}\Fj\+bc}U>s(N"RxֈIZqbn5")[?ދI?|,*+ҊtJcߋ2hklfG{iE;|t3QZǦ "<̇,^kes+m=w/2P&<: #cln@K.l|J_z&SAsF|+C"KKE2 ?㚵z'?p@̊ubV24>~۽3REZV64NRE ><SRO&Pgw+^P0k)ԛ)&pGubq5᯻0G_^>j4C+>t6 :5Uu쾖( Hc+RL JdY!R,)#Ȓ9~mV/-}:A4"=rg;VVg yf(MfEK٨=2=>Ju8 ЁI-Tb Hka+7> i$UؐU!7@qux 6k!p~ Fx艝+R?b%wJL|FtJ?Ʈ9AHKƉj'"tS*R[ffw_ w&5'=OuYB6k!i"15EZЛl C[ E~?:n㍳ ޕfb)"jZ<ᙂhʙ}$ )g Wjaij&ml^QxSWy֜1XDaH湶G¯ISV:6 ,}23WYyxR;$|܋= Ѯ EE1 Wd)\ Caxn@vҗ ]YŰ-├<5SvA?Kc1h7i`Vg`wFW阀ut6PJ:F È)9V8(H{qU7[p  c#\=\oF뼭QFMNS:S}E+6m,DqCLR@*" _Ɲ` LHCJb%)Ix$g)ȈJ%C8LɉL$L"9q) t53B#ԎKh`_MBkU/Lmsx )&ε1& 2F܍O#1 ΊEȸHl2Ի0~oF:ͼW`u[R$% 6c=RG L4N&>PaSo~&' ";8>3x\(ΆtLr u\FCU\]^H}J=hĥ&lh"ZpXܕl߫cqۇP|~jD"I㰹.`Xk0𣩫h6ǵOH AKUzDW&^h*ɂ[eI/n`i 02۷:זY+ƚ܆ :]` }xSKݿ0!ͼެNxZ';qrD5{X;Mɻ?$SMMP~haFS<[,G^Y*p0 '4MCu{`mKK hgY=L#i~uєXrxA~^3qvѠ/̓ -Ѝ ^U$f$\TFV̱+X薢fn 25$5 rHv FDEsbzE(3(v24O1Y/:9߾!]Vpw֟ fNx`&\Q" [ eW{]kܒ5Ik .v=,/}K{'`ɡd5:H4UQAh[:\%C9Cj+aܐ*һN84{B433*@Ve ?"c0{5FQD/_fVK<gTpb@Xkyu>ZzosR@@.a@+(@G=%Sj0/0֞IhrO٣C~$uh=nF* p4qPfGp|cA.П/1+=6 |nLe4*BUs:d|/š u9x[쭞?o.o[s!]X06,d{RSA%[kg^\"Nrƨ)ai_gL>&r/@ BBnŅ˹]o&|)9UqnLjH]-݈}\cx)Lܱ5v:+JS gyj"򳤰T~ Š^[N"mWv.s+ǃiШ n㋧)Z4ꡖa6?1 ]PIBu/#&Q2x,c~xgyx3crE6N&o|-_;e*Q0ad 5 ;#htG_\j; furz"~Հ uO?Y}7܃@|oim%TSGxf$rQ{kG'lw{.B_P:NLBD,eW+n; h' 62|v"vZ 4A7MHaDGvn*Z Q+ӚũQӲe=;0[v/^=wG(/wN `/e'^yPvA ˩"+:KM l6)C/]F~<"}Ƶ7=/w~{L[~ gN.:t)~fq2n1!KF.iK%нi^$!gX[{n4=m[,+px\ @fQK%1C 6wѸS<̗ .;L^5~@ [}|35n{Dm qJ{n܄]*3 l}׬G[P1!# .-uY |^Y:Z[ﵤE aA>$y\r/+E|)J>p5|EdmhKGZ Y$2HF#JjհکN"wG~*%?xnqGFm4vX:}r-oMx51ވx~3) gDnzB@/o*cL4@gkSM/AB+AoNd)x2P%9FNUN^J*iZxn_Yk)W}+9m"tTV& {Ƙר>_YK*);z4򄇪S ^U0ݴ?jUgs[G8 KpŇJd'nXm>Bk{yJQ-: bh+L>"KkT 6kLt L/%DFż Y f- )V:f-z` ֱFy#eVD].L}=M ^G]A: v9_Th 7yoOQ~\67T U-f8[a.4 Ljl*iι͟DH QKPr/L֗> p0haԒyQtÁbt Iކ1[S*w{q}SyB+q86srXYi2C4]4dX^wцN㊣YFrА,<ïg]WI2)"ӮwfBB}_ç)cxNvxssɖK'c-F1Q%[ܢIu8vAj𾫴`}0--?2 =hЗ6|V(6DpYč`z-ڋch BJ)WvR,cfQf$jٯ/պGhQSL}I-Gziޑ8J u f'e Ҽ̥ZK@: s$a $rN1 +K.OJ2v{\p5FG ?eej#-/e(ouJħASZ›G8WvuRC$F%Z$SJ\}FFb~y t;z&ĸkI`ms``OT DGIvnH1_ݪi*jg&SX?6K&%l?n_vfDP&0,Mk\u"L#h1 ?pm AQɬ6 . npj9^u,[]ktH [W_y|Ҁ2v*".vw7a"%@Fϧ^ݸ6v̗gdR!Z9Vѧ}{^ US"j zh&aL'~o?ml5Sڋ{smu^WAi?B G;θ-ySqH5a킥u0˕Clc|}Vfa+eh4/f),7f_ _i*tv>DMH$;{)꣭+̐6Zj]:>.wa\;vephY"&d/y_lǷ{ !qR}(_-T;_S%O")^tt!GɏF nTNn3y/L_^VE@\[C%UΐYFOKG[v Nj63F%>F_I>MyԖ,/j#a{ZnSs鋾v99uB(MkKm 2B"bs1i=Hh$Y`PC-GO %S*TL'gV= Ȣ |-ӏI8IiV g8Y_R(j½4. IsxZ$> QqěpM)6+lP #i{蟱1?3g|6b`qϚT` NIɭ|5q5!K69rjv6;P0c ^hdB΁r&Zs+֥=]Sfh KFt7'U  x¿`(O<)t]b|);) 1D,GX rE^NcK yb@G JTe;s!G4S AiFUIbq/<[ 7W$_>Y8B'K&@"YfZ/Tfc_(6nҵu$Mq{=+sݢV덖$5q ^}1ήk9 3ASG6Qsfql,teuPە*q>qr~({yhV+A5LcɄzX vndŻ8Oa&j7#p36b ;UlhT-L4b}jjz?{Cl٭1wV%DZҘ0(䢳ү2" V!8}3 R?"!(eCs܌sp̵ luMΫK9lPV^=0r#yLjeH?u4z܁-TԶW}:6G\fO/.OأR0Ik B)hNO%! JXS'pE/_C?Po8SORK *H ρcg<sZP{׵'a͆>w C&}NXNT-(W=-6WVDjz(zbS ]+s|b{%'j)WF|W=! )Xh T.k,wyU: =v`3^$iS)ºXןwEe1/1"1ɦ]^8؅/E(R6&>e,`+*/|`HŚE&o#+,f?6OKvv ɮjT-A_(紜ߚʱyOS`]9H+5N_ڒcΰ]tGDaT?PHmȘլ_`=[?`-2MWg8WY'E}Y`3{cmUP((m/Qc3~, 10p& ]m犓Nb4pXzd\êZtV\;*\ꬓ757X· |-ѩ`)$O40"ח#`ҥlߘ ; Wr7%璓23M{=ñ6ؚrw_>C&JʇBͣ`NS]#gm}PH;697b tom&(z1d糼`\NGstVtűyTz`9ZpGys… rPAZxu_av[n,t SspS>UY1;"Rn@$i3/$ + )"DP~ΌP@ Xo"H}8K}HR.޴rl6G.A+@<ګ0!1wvc3Nni*h)(OJrH&8Ȫ~M vqk=wfڥϮDy\׽^f{;:O3Y b7fK,z(pz#6ΒvFJL3R[QI?? ?jTq Wc "n&A W+79a{[Ldo}t TR ,a E]KDM.+Lڄ$1B0W9G0O!>lGD']9vr^B<7Zloo#JVJDUˍ!.X~횐 M]n؎Y e腺%is7h DcQLMj>{{TqȾTu, nZ?_ ?A[ Tdj&^B^Ӿk,b&gj"Y#RQZ+>OYF}8_.7"(j&U3ɐX>6-gѻ}$6 j/OZkZbD #v' ԃ -~W˿1bn=$%EA0VvF̄y[n {RS쐉zzMHǕjT\y`j"aMܝW:~bؑ0c&zXa,Yun ixƮܤ̔D.zٵw >V7Kɹin"7C|}{pŋ,eO1ݦYܝ lϞ16 jCLwtlwt(\a o 1+HTri0߃/>@eK*Ml[#o`7 R{Ѳ*t^MsYL,FR=@YC &f]hҙ5h]xtċr@90AS-&B5}-HS3u7@7ɔ'%DsǸRhYR5 ",:{Ȭ2]m& _U\=1<zݨ~a:&z/+Mue) f0ThyOu %eුay=H6]/MF̝뮠\m0-&9B}aC !*8r0)׏k3%tK^ƎVzj<%@jo\7*Ogޞ:S|u-1Lz -(ūs^x_e=F׈4l[>ofF1uB>~h՝ ἅ|TJrO gZ.Y~ܙ^Hm`j7dNR0_= ETX"@Sev\oXXu[ηn' ή Tߤp*^GcP 2nÒ }V4*S54li3.lƳIphiꉕD˔O<(3-*Z D\9__YfȥG -Vs(LbX &EVucGL}z$bErj7dGed,ѢUJ6L´&jtκiGƏPГZt(wj6>X~ .dq#ʵ6&hҪE@gFߪFk |Dvw~No NKY+O+^eR+5E),6mxIT(Q}8RT*QX3,9]a!c!M>k3mDԽvFqϵ` TZ4fɃ>yCZVykUIp/cX:?8,\9S+&c 5 `G*\5).K &3[sM7ua;5̉#ZMA\=;=}q~gTefկIȘ}眣Mr['.(CV49܍sĚk9.EJ mE='/$:LZf{sy$CM!tԚ;PyY|ۮwu7uТH$)[*AܳNw=}bbZ_Mx=) z;1A;s$if!ESe"f`ھ |e??_K t8( dյ}hT)0H НAۢ?Ti$K~f;ìe`_ㅯbkU|F ,8Fsa \\V6vDޘ n| 5h([W $R!)~k<ˣ+Wo7n@ikg)V HSy׀ 9`_܏]r:乡TNj6̙& fmBƸ *.)Y?!S;"5iۘ$^\5[m O~_jt!AK,2L,5jrT]}CkVrsjhFZ)A:|;(kMqYSe?f\)YuCB*)'_Z$jhz/ʴ3\_R!,cP/MX7o37qlg!B䠑sk^oӶ'%K&*w#ƌD͠4|]NwMXtH@`EmqG՝P5AbLJ*66?ݣVmfضoRR:ħ#emJ Aaĝ\U֠׈YM7-˱9@sƫbe_,Vv/MƙyՖĔyZ4hb~G;JcAɛZ:ymxbEv1obyu${ ky^T)`D!#([-VCay%rO04jHxNvGz_Rk0|r"-r՜Kg! 5V *ܺE?]&E7骽"GtxYR (ep7pA^\+hW8n C;V^fɞ5Do̾7aE3UE$~ckN]ehI)BĥFI \L?*HVYD[͡uA* T5L뛔JyA_H[71hn;ҤN"W_``{:z݁|OtC9i<-%R zk(gi!iBP4/t(~ &*7뢎.]䞽ܢ3/-ڽ|^Jȷe܈pf/r.@\񷊵N:b DUk]َ~Ftt;㺆a`"VG<0kuG3[b r'[r>8Y3 C"R?xl]/Jj/JQ40Ca(ocO_?/N+YI!t3DZŊmC瀈lk<)ih d헲Ɓl>WnO ءmz'ZRv>rXbZ{ܷhpg]7'MQc~F&}CA1_ցPߔԁ$QtnOoTW$ ;m>]U 7>m 5`B]x L֫ 0g0A)3n0n7y2P9)S]MOs֑49)+ma;aaS W*G$"~+>ǁ<( u.\;;,UI3!I7|*X|͗kT5Xh=@n0Ā4`$MHekdg &EO: ڢXF/^4VY82[;9UMwn3ym#8$15Sn-v gŘ Ҥ8 8p;1o;]瓀%i3toʥԶߥ )MsH?S>(ͼ y0Gl:/B ,XT #Rxcg){L7,K6`6"+ҥ2d vOT&o:1zڈV?`c~hgh 7A}ay_Uﻨy'.@Pv Y;vܘUhM TQir[j㪇 ۘӃ?5V lH{VS0рj[]'C4kE/tՃgSH麺<(kY?ArI5Q֛P7PqQBVUJ.̯=[8j i- 9TQ n5,"9!W[ڥhZtM2v׭A?>IĿ9n(xB;Yxlh4rȌiz?#A T3--1 6m–@vo: LqddEU*4֎14 I83^V?!caS0E!Xuʑ-WiSG*l9>i $͎a7l#k O'0Ϫ09 ^-n; 9bxeb\m 2h\ Sba&c n톔-`ofvG,v9A "Hڻw kmD<].|`g<`X}B._nztJs|+s ;p.腷gbK{-TGٜ~vhOqŽ|G\O^H> WuVrǴRGXœG9ܠ[OqJiq1,G"Bn>^j3#; vA&)ŢTvgYwyRq)l'$XG˭r_2|FDs, ,;#]*H;WϪ<;z-Ic" nL-^=hˢ1N4gA hՒr_ǖ yacI_>]ʒ))'>%E΀4" ZU?)Tnw(?G-U>ǶKľw $XZzy2#B.:*$ƏqP(>})I񍻜`Tmг ً3?UoR.1=ދL|VT&>͙.s27Y J?Lb2<dUY䐝$ftl 7jkNH`Haz3+M7{֙/qݨE쯇QoU ?|:2W A첧gX78gY^RNsgɒ%J~ICuWo^8~0z.d$yڗ7*"@/x %ps58{c؃<{`G1rfZTlhȐɬ,„y?/ʵS.3F:30OWxg[AQ6%#>?57ea)h1%x(;~xjl&îpevhR &&<֓0!Ze@%: 57NѸzLhRQ&mg)CzF,}΅E-X2*8UhGMu7Ne '>]r;8 =Bvhq[{/=Tٕe ݱ HXe`<["1wA[X"3#O5>6)Ƅw$_^)dR z<ԓ ߔ[ۨw8s)$Ù&WZ:u}U:qkdMI{| Xyrr)tYxw긯Q.v}QBۢw <"W;DT15Yخh<[x&űoa<-1hN^44ذf(OKaқkrGw_E;c3H.IW}dnP8&^*DŽCCnpjUy.]DŽAksj7y$\Zo霮pud$ ()!z܁$ 4{{C뉪mcƜ+8Ȼp Q/őo!,:ǷKj}} T7lZ si+0'QZSK6}"O X3_EUZh򘫬bvtU8tZ2Y$itgʛ<tiJA؅ 2Z[A@ 5Pl/0mfp Jg׳?£2Jw{WӸ𮰫-NPmRBS;VxfF)qBZ@Qk&y)aTOTƯȝ66_%/p)GUxMe4:8w}>fzb-.zi Gq\!-~{_CT]ӖƄOK?Cي僧x aXJ]9cR'j>Fi8`.Nf#~EV\{i}{tnu$X(WCvV!j+N_r XAAO/0SR1Zf{hm! 8l4+[gپ-^gu5Wϰ_ 5~CQ':#!m OݭW55w. ={ Pp CԪs(!aHP" -ָD)lXg$2r8GZD"ȹ;kl,!+螱0}Xt3|{o={frIGn"ΦB0\H#>sNS v^y2)9<ɂWSJX)D:[8-| q ҇E=VExz컃F> cjj+~ߎJNx [b&s %nzUq~ 35_P[h\].8!JT:}46l{*Ļd.!qnR)K<ǘpm{#?UJ(D:wz SRK~$a-QdVg\A2/htKZ0{!v*mp7WuSW2<:Z8@`ix!+cb:ڮF^ b8c5b(eY4 ÁJe11L4"ET&1|:zgt)2?heCLW|uwR>ؖ j~8a8]`޶2DoGdy8UnM3ImNZQ>hobQel]Y_~FeT:^& ?ғ䂅Ʃ(D8:mk[m[z#elS6Un?E0y8S^Jk$~>t(g<%'n2q`x?8% rI5ٖD^B>:FXdÊDeA+-d4ҿE!2gk'4R)C%Zq'FjJ3V= p~CbWӼ5c$lOV{1G(mś_#J*(bMm닢ޒ?E ~~TrU bo$Gwr?0-=:Nw*[-eqvf.iTQ1ߖ[J)cVDk$:] k sɩZDS$-I < >9ȖR VwJ1%;=NaRʺRǕmt_!C5אYlfNTHiIF11c mjs{F|ޖ,:3 M]ґkB1 Us irm#+%RQޔ8QCR*٧S9m3xXc ҧ x=dnrfJѫWrȓd9Z+2*4p 4Rl" @<ʠ!ź2_Di1Ɓzt2ZxXIl!b](,@Q',Y: f|$ (sx#lVi% !]16Tw2a ؚ*DgFPkmZKfSOTA VYPhUZ0 + EH'uBMr>vdn\ژ'#pQn%]j?NnpݩcLƎ| j(ٿPőv(؄0?qHDvˑ1lAʢZĔkqdGhU g *e<80UTEƜ[H u$.g~.Ъ<|elspsbh&7bo ;s6W:qJ^I6TW瀧Qi6(fqe3bY7/ (Mɠ)aw}vN@ݥ%IäSh4pA{sײµl`!%;(`{l/T.x+SD*br*nTocuGh0@*T(Y$#vhQ:\]9*/H@ho;gmmUB UĪ4_VG0u&C+y6_iE)P%^?C!|-t}?knwPGz_fC9CA@ ^J7hr`2<n8ea`㬭v~X|*;I2e=j Sr˄<<""+H XHv;g%DGIIAf/F$!ƙ-^0 ]v#Cvh )p79#|}N^iNTPyqy=^6Fch1vf3[6*`6ng`xPI}e.R&+ȑufً9kmLsF.W~s"0jW1G||s䗁rp1:tQyt*}!s(8F̷2j h$?& p~0"vń'XUh\2Ȕ2>WcPtʔⱪy TƄn0?+nc 7[Yu.uX󋗭35}>p:GIU/dH6, c&"t{M]ý*A]4EQ*e#bi_sN@,8 9WLCg?̢imm Uf]`Й;p)8'(S,c#& F3t%V(fC.xoW-6 k:JT)ژix\)NW˪KU h,Tb|ێKVy^W|DT}r ӵW5&n\Px-N&1oA+tAV]FL#cw<}X=+#9rvFtwqG\y8ueO@|HsA`3tUO:vUh`.ƈZ1Y3 'pָsnnF&\ݴ_Q~o,k qd6Bŋq< UQӃ1CK/`{bBA,nkݛs1D.SFGFKM^Զms&tLF_;!J\r=ޘc@Ⲉ*kCXz<2'| N)4"+6CaGD Ȓ27uJ6!\ |7fsan7{ty49:<H[p<M}\Kqװaso yC1| lyQqL-rz>R(HyJp<M>:'C{%ߩn7&1jzWh5IKp8ʲ2qu˙V%%}C՗;ajTPFpOdME*KC3'k9aƗT+(Y=Ldn+uBtM\32$i$ɮt׻P^[1[|N>d|4bpE&1=a4nTɵ&byܮ{*bw9k_ɵ,sr "s|+?ܔI)b`$ƉƇAj寏Эw`x#>QM>鉆gJ( lW"Nv0GyAef9B)!~QB;RϿܢ_V@{8o:bH=tSC.Nn*R؝HWt>~asaMQڇR߻ڛs[:dqr.bot?i=UV3=-%%DӔȉ+^O#.髇b[9R@LLh1һѝW@oz8+,`(Rt Rrz?Jb~M@/,klH[sЮI95PReJkS,G]&T*X+hV6i9oZ# 璴ם1`tRjWcw@6~1G~DL"0@Ys? ᪻Kͦ]*3T\$j#zX=T4#ǽ(5f&["ZjM4'DM_jB۝ψŘ2y梢>]{l3T9d~0ȽA~ȹfgG _Bq6O`y]-C&d$}p7U}rp2/}m cdJ,1QlNx R}px)Da)/mHs*RW|Оgn&0u[usZ_eTgCPh)\֟4ئO9q,";G),2 0M3,9D{<^-R|@) TX.M9Q&OuU(D2H.5iܣҹIU?nA9 VB{y6d[!e&pd%(`M+isN%boG+ǂwRK >P6Y] 2F}ms\kL݋k+@u9ǃ;&]WvYAҸ'|o^/;5k)_Q>/-զ{a"*(bh;𺹀c|/GG )::P/*Fx<\U#`}81 V~b?bfA핋, ^bc*3M[A 'z͍ `SYZ!?JnxOhw٬R 9yblqoM0twX]nuHaOlZ\&$rQgr%wg*sRnB%l8'a'J0.M{'#b[v0!(}4К;)J،KI8-ϰ5$s@(,O-#[N.dp)DB/ k،#^0OV|Zj2n2j+q-Y0# 73Ad@sdDo>EuBGA /2䗤 ʷNT5by2ݾǒ;dMAiԼKrs0Z?8i X{qf&5wTĥS`@PlE^U Вa>߽p(DE6p~~^8?7J WBש*ٖ֚EnrHS%l(S&/[uOW\i ƣ?H&YFk'AZv׹E14aJcyb.q=v I)2%j@mXQXx܄[䱬fl9t)2qݷEʌ 1i#l 3(#WZԬjohh q(!jwL9rժi?꘣̎IkI47Lex5X:]@ ezjKsSDQ2DWkMvBY?;mPI7;wwԐ| ]b-{Pȉ4d8Al}e~YE(O&:04/WtH9{,s"iii"M5+C}q0kPv3gnG::$qH@fx{偁MmpHOZ9 Rf'm^Yv 'Gr Xr"8{eSd58"MُxWZ@,1)2+5Z4VZ\S\{ @+Ng֦*=U*kěu>T]4lبO=y5;L˔`Ј2y^@_䏟t`z7}ow!A05ul? /3JtⳗZBȈ2!jέW] Febͨ]f})zyəVib}]i' E. #i^o C$b{9Y5a،f. [gQc,r># !E珝YVͅ䞱^NAHdߞڝo'Ef},]2J.0=\6@voMPo!M#D&Qd0=멗^1Jvz|EBasjj S#UIorqfGgJ^*ն/+ {6#xS:`1%! ǟ^X0Υ)':YhJoo;y3Q0dSm见z C8agm~7oS{iCd5uC=U֣^\H#Eί>^,&TΩȀqU)bK܌(e4fXFկco"4z="ج(йfRS \)͏gnVӉ$~HJ5]?ġidbu:E?_Ҹ甆y(w&f,-}!hJ"9Ĺ<@HCr0>R&,Kj'lH06]k7A!*6WL/:h1\\ǚ;QäZ>V]ߜ Kic̒kqHr=܊E Օ Jlis5K?B89]1ﻋ[J%+miD+e tlWʁMwFӚ 7TV;B|}z'U܈c'lXUeUYQ{|2fHO зx eP+ )H+1=dwP(V L*J ha~ ecyŝP&4NJW n/^t.eg)P+U mҌR ø:’+m۩3ަ{UAf n|)?M+2ebrq+X ^PNo7Cvjf*uq$`I:: iHGXD3A3 CًVAhLhoE#ǩ0ü]$xA@Be iVgN)©҇>[@Cqy]y{ZGG=.~*''IVY/B͢Tl1Zd3`}6: +HgvkZJ=;e2]?vX1@4DqUQN˄Mx:z0.nZy!] 6{Y+:xe H&ꈰ'Dd_&Sgn@vۄ[@UaIGuw1j yfp8->ZO WωNcMpuG;*beO[Y(jª+CSOf@u|z+Q~o/nRgۧc%)s 00C;c\{ \,d) ߜOEUq>۷tKDP3zC0Oe\ 9,kT- @k.:y$gz7;ȲDIp() 0|hc._糳Ғ|ͼREu>i+_Ϋ*(HaT'{3'~B6UDc;=䨍NEǧ|}2wB~NLGJZ%TXdwzw)R\]+E>j vjt_juZPkꝰ#8# 7y͚ΊHpmhH'8jz;i7C⃖qsRcY`N»r6&deWbB # 6mɮ[z^9$f 1`MPN9i߄]% E}<RZ`9>.gׯPge(]oaxǔq~@[h*U*ʜkVL󆖕 G^8p3qI4nM/\ φFŒ[:? ǿ` V/8/Q|  ؛?)aPm9"1noLrF"hr!*' g:i!r1 Qh61A56(qk w<[2zTjDLMmX}E8`wQA7jcGj{\.| RB}&OLB.^=UM>#2XMzm(5^-!Md*೾;d?>,eeєE"ùpX<)1dc)Ǧf]E:s}>L_.PꡁFY-Pnc;?8;6svu4Xs Qv:1oO _ mSz`y ХPd4[A1:v]\1@x (ؒ` $pbN +gQ݉|nW}I4ud;647)R‚g$CP+xG6J[f<$ЃB3&gHҋRI*\&}Z0P>kj7IK rn.iGAXEkcDj0+#XJwtaL9\DJe<71$J -TnRz~^{bC"|_):njIL ,T|celij-3mJ#+O9rz<5V~OyѦ-W0?woo }\S(RBmҀH^.x%f.c$EϺ;(ަ}n,oY ^,=,_h(w B{Q^'KtdwiP'`W}~Pd4vD`a 1zqܺ ~sf ec>RALq$u%9NAQ#~vVEvP3f? D^|>0b^_3W2њ2ܮ=Gcc<<9PB:iWfj7,^,&?~Iu gsZ(_$W/8nm@N0Qv\GF B;eiqRu-[.l⁳;n"è .H^+Vg8SwjsX1d9V5 hm9Ts0KpTdsr@"~$AO39<{ hPEf, ^h@:\)d\SMvx~+Ѿo :l IU|oJ;ra+.6X^mx:q@5USbӨ'.ǜ4so.SUT*S碫.50$p^?OcU1Ce< b8XME)$] UrNAs=BҚY_?Ev3~L~mŸ&c"=.1lD$,/̃`!4j:;r9}?>D|t"F` -{~|؋opǭM\U| B@NCfhmJJΞfH!J9X=!<|lBk '3g.i5=1=(|oӿ"+_9t!996 MW8ѷ z̘_}1D1UIxHG/7T 8L Uё8[P؊UnYK`9t ʂ#u%Ai Sb֫}QXB%$OZm" }MdأE m>F[!cUw8ȿ;1w4#+|EV[&M0wR"r:܁TڗSnnz$e,G/4E\My9ltvVݦ PoJ,CMG7,'(pz I{v q"eZożsIѳ4 ܹ7znEma\`"XHmv/sKI=&sPs4sGw_7sMF!]u'4IjZ1tK#|Ajn]`9x~Fnzp )]Ǽ$~ Y(DG^Ɏ$du۶ PyCrH ENU 3`Աl@x -(PR-6|H _+OSnZߊ4VݽES/ noc k j@Kf1UvD-| #;;y#+z @:ҡ G]QeT5AQA`ϩ0a\̫Z$&Ď0f+[u;6+nssg< Zc2_y@O?uVr3#ҁ;G퓘{VEl <<ƭ)/'xeإJhs %@݈M&Q[mD`Ы8T{Dy8YP D8cUg9ߊ`90ii^ {9ؿ6'?nWD2";^M$5HCfˋ(-[3ۂ&d25W_n)2>@&N!ڋW]߶l1Z`@~5Odm~|-=YgEA X_'F? @?]tR?[H~o4X#y%o* _>(դڱgvgUwY<wᅰ8 <\&>.(B2qnq*,EZCO5^+Q]ïu"sJ[XIiM,i_IPҼ$[E~43x/ (B!DvK 53cH0(-1ګ}P].޽ IP$+vLr K(DŽPhenߣ䙠Ǡid>B Cg6-foizl=Xso{yfU-:%Ekӕfl6J|k5xgeY̶w*x=>z/6K:<&/XTѢe{5^uUImT\TNXWMXEJ3ec1/˛/WQ'܁i*ަSԞ’ԥu%xի!:lЕzg0 .|8(A |Æl }Պ|v%ȥqs&%?r1 *']YymFz7;<@d/F;OЍǖ:(hd:esEP LV/HrzeYC ~֥w|&rsCcp4֊䃊6o"s?с@066  Tw  B=vsa]Vlܷl5xW?М:fzv5'A!I 'ԣ$jm[~TˌKbt@!^wq-hRCYkpyvQ6}|.%ޛCt {u/VԲU8`T4L(tJ[j H׭,#Ղ+JO 3TtvK;'ī^P)3 bO ooqwC 6Fl% 1%+hF3Y-?h35f=D6BYC|劫]Qֻ4ÄRY( ίDŒ|R6GvZj>c̄}٧zy?}?S^<|:bѓakY%0 4.UtsFf0oؚDfV TH7LE8Bc[Kqt$o-B8ZO{Z[/ƩBse;ϯ9[0l\}h[c4[ţsK&64x9m\14`7@Sၿt oucD+DSʈig?^15uGґR1==`^H 8^762aad1Hv~,WM%k >d*T1F!ÔPUĴ9sxT{ߛg̋I?|>g`Wr+.x=MsF2RH-j3ujH|];ذN8He!@@ϕo̵Or3 %R{'H}kSA\:=s*<˩lrxAd!ݐ>ڨ4҂ã)!)a&pH$`8fJӝO5gIڷwqoٌ(/JSa 7:ۨQHGicc)aeyĀkW[-O=%.ҎOֳ܇FNUN 4[1䡵Xj_``bd]K2P[,5Z&+>Do7\9WJ܋i_#cۺ$3O}ډ2uzYEKW(ͻws.\9'цte<ȬRڏi=<.2d<=>#1&a6[_÷YVrFð]L 5E{^A#<3eBa̴),)gHlEAlS_aw!~bc>σWwBtwpkZ$yQQm6i-?Jczse+1@f]0j8Y݀l^;bH-Nn ܨ~~R|0D# .>Ò' 7ர;@Հ {rf^'Xv{wۋXg^v{.LvI&e6|1:ܪ3t_!߇)Km,B| ͉߷YTI6R2c{n-&%ȧpj t C}qۉukX԰jުbSW g;nG@/OܣUx-)o])ay4td rj.?}_''=g6Y;/1i$ eS,n4J^\-P;/cml OG~KF`kb6׋0`*A{r`?'iTpu'}rMz4Ϩ)f)`Ɂ?ve)YG}a/"$)I(lJ?#{L&eUIM %sW.n?MaVc Pz, '9愃3Ks #-&6^6⎏݃_,tċ bD|tҮ5<ɞafZC}$n(AD{_RyޠOkh[zBds[? F+ 7hQѹ'[ԳO㤑蟔O_-*t隃xWUbKnHp|˺2ذX\8=Fd}GբcK쉚y7ιmUtJtq褕Tot<|Hة2`g0[.F |ּu$HamHs3`fzyi"xd<,ۏwW$Lp9)p;*G"!F$e0sY7f 9q\,j/T>G71O[pVPw| tWVVXED=+f-/pWQ)9[ޘ?&Ȣ Y_[-sL٫ F^%o @Dr[ݬu@ O'5bx՜iwn_+Vˈ[G.DXA< N$M@4!b~,;smIfOY~"Lo|2UBMuͦ w)/,˪ry-!#d̐ʃ/2obl߶̣&N57oqtx[<)썸y-E\GYzM`f~~'>aaѴ=ĿR&`h4m+34gb&Sx[y'}q5op<ԠB)+fnleSՖtQOe 섺tBadx)U } ))ZHT8т⽞ݖۧQ :W/ X`7eEpcq1DېGV 6 ΎNO<=^自{\gQb\.C"`wJ͠GMbBEփE  n6LLXQ/Y{"h形úerd R\^~ ]GQ܇MX=hP}GP6j*”? @WS4$$pBb0mm5)XLu} wXD`tELMDדrDA"T(!!1EZwӭAcsx0xřM i|Z=ö bT”dzf0?o*)B8P94N" MR8+_B} :G˧IC`!pl-~41oN4^ #u; P@x.Բe_R6u[C}؞%H"!\Gi:(.r]?LxP bC'n#~y!g9_|ۀOՆ@jJzєz,G2FBUw B+puSﶽ8pŶ<_tР,%Dobp [YK0ӂBC /^ƕOO.HwOTd _jѽe9!cu&UZ@PbqŕFԳVٴh_gQn5 vq j~ޟ;\-dO pѳ\l " .~.-XyE[J`lmYn2Y%lkww CT-Ky;,#]"Ƽ>H_M/:yâЧ!pGKKe e޹ƪn`ZZi8:1t [@2iӃ!9.f6l1Cf?*/ЙuP &oA dR͖vwe25N  Ӕ*Q6_qp~+L'3B5pN~ū9C &ރ[H-N%#upWa|g1$%{uy GE?]$ G>Sk + W hZoQH'7NWzRtSYLiVi IJy!Oܪe`΋^)޻-]Qs{D&l=˦D8GqZx<:`tTԓpxQho*qhļY#st%K1 /[z# krZp.u:|A+Df?"\:AkƊ7K/&>v %LD?8rs љ\YSZD*~g6ڧ'<˃DLɴCq˲1 VnjoOH46jMݟOe iIe !z1>uhZm߫;>5kA5M9A(4HŽDQJ1Ԭ7W B?W){zYh f8fҘ16!攠x6[zr lDPC9>Xu* [% DD%YŸOSӈ5˙/\N$/w=ؕ/Oա^2姵󂪏qڷ`4KHZ|'@X.I4?C@$ieH4\_ Xnє_oH<t릹QSRsU6;""\RwsB}m|ϥX0[ccLCǙZ7-,{{6N/)(^D 0ršl:05@IiG%iͮn>#O )\ bdB":jZƥ 6zoV6x+L0x@Gl!iHU;iĎ-Bwx\A8{˞S⪩ߒMl'VI ~Աƌ;L )_&n[ #0(RK='VYt^ 4@*Q21+ G x{oJhKfAL6u!pʯo[zgʑlw8)*^f`8Τ9۸FL9'@JiXj@k{I{uV҂.Q3@xF2[u0}J!ZhZz;}2ѥAVg AZ}*>TI)f%~P8Є3m7ttYN'MhâF%[fH赼5^<l1wWGm n.tq Gu<,N*,\̋Ys3i%0Yg !MGۙ+&O+"SÛ.9< Ş\[nQM5O47 dx]:JlJE(#C byIF1(؍sxYjlb)xhnž+t(=|;-fbiX7 9d @>¤#yoC^[ =UpS1 <܋줘W:$labtrXB`]7Ra֐iO¼):;д'TxsѺaDeI p8|&)dIiid]?҇QWx߳3Pߓ6!& 3#=9@n&&uF2vkˡZ:8S;vDcDʈ8T=!QӌdY<-u 1~6YW}3x. ?H7yN6@ߌ5hbu*fMJlgȴ+hoy$&P ˩-]9,zR ݾ4H/VsY ׮&AP&aLntoTJqMiRƐefXN\nj7Yix%U8D,_YfEM] (ѽbĨ6#RV\A3oƆɆбEic(hFSDKo6n2R%G-{aي s$z!9#KuW)u^Uϯ:j4G;W.nVE-%:gHG<|26!hWVl ɹ^ - gɷ-Srlj'%DjrAP`FLnqHT<-nk:Ll:pG(jUkP2$|BhCtAd׏rHjɾשUX>ڬc[5L c9\>ZESh\ E-4ނl@?T>䊄a[:RldI|AbkJOE-ѩ.; *:mD{;mVX@Fag>GM{Ƈ=N2Y3k@ջ&Rb?.oB \*Q$v{ 7d>N9YbMaԈ%vW9'8Q콹yzՐA$ MẋO,vqr3A&EwIs4ܙ,F^a!v g^bK"N3;@{wxV#I L@njaq\hc&*䡓2$buJj432+/@\1vNZNJi]gF*̇ gC$sGF4Lsw[ߑbz.!_vdp͉pa1i~5aԁ&^ka yo jrh~لEsXRbUE3ባC5O"]}_<*veG@^vE:|זi7RZ?i4Vs}UZߺƑ-V#]@GaK=P ʊ}NԕϜu})<.hʘ@~%˔%AӓQXQKd07z[\MIi/Pp,bBA|18x\U#idm(2 *Bou.o>1̮{·dl?>kLAgxky̚ۃ]Nv`WO+)a=$!ҋk\Tũ.oҹ~yX:j5pN?pe[icҷ ABE dnIj<?)NFYW\w5{kvTp0n-6]Ҟ #V٠2-~"(DT VpdiF'_1M+D)u!"!ג]+z|<ƅ)UPPLsElO_Cx M&aj?HT wvt!_t>$}jJ=uK/>U1v;QUч !u< EkD CA,L*xŚRd?t<J>?6}څ^en+_fđ"pvbi}ſS1 !Eg^CX7p~bb°,kXd"l淮;3#cGCY XWOfo)L#ݳ).Q%2#ip^)l-b8uCӓ=F;6=S:>*XoZv#LSx{ф9^k gR{FDUE K4o/?sq=IPZ+=Ny(^ucUK :jvg9m&.~ʁl@5\< TPʱ]5/q]vt{HY t*ԧMל$|u(<ZQ MǞ/-貪dʊrL`[kBUM,*Ȧ~ERk&&6b!a;O8L1R94#͢᠌l'1xS;\]xo bbwRYԇ^ \zgs%ܸ^=@{E7;&FYR+W5xM; ygn|3EwL[ )R^S)h/FOj Fk2*h.AP+@W^>Ҟ.(؄q`.,}D]Ļ(5 Qt$#_YdEȢ>U!Jyj49q2;/@!2 db.h.N+ɤ h}@9l݀[|4 $b.vߋK !m߿"؆ l1(+X$} pOX1 c-":nIpL]L)X-D^n"O'g YN8QSBcXrokG.{]$,sG:}i]bN2f̃ 5|'Hmy2`f}#eJ<\[KT"P?lKC{#|,.ԜW<=  oƍ`"-~o1EYk~f!p?`ȉ c13):pBJՖOFwXJ֨zw>-ʴ݅%[ =08e7Ip.gxm[eqv nm=꣌/J 60Q5,b2ɁߜRw$K3< QMyغgdЇ. )oTm-he֔Q)rq[Ѯo; h%L,Rt{=a.QܷFl9$c<gG /ޞy2-!{ŋ ޡyKUt_UMk#8VxbtgX}Rݕ&y2(yJ)G'1H I4DA_VN\yXte;xHڕ[yhX?8J0Fw=:/@b/jbN8{#c^2\Vq/ }@,ioRqIED`*w|SIC%.O;<VtI)K?pZx lUO HA:@Ĩbx E;m43j249g n(9n]lxPxJlo(*P{g Mץ޹~$7r(7U18QX8v\2]qZNT[r7T4\,Hb1>~( Ѣ_1^1wBSiAT\8]DAp6CDBfHg3BR,b8~rCLHy83bSɦaߥ %jbMڬ0/)W޻]Z\M5MAB?ʨ__mbnlt QU h?0qE}\ڒyދnjãOV\VQLe1)ۖF~g*ҷ$f1|ZG[t册Bil"y~RU1 鯓$rPpDt{ YMM 41$'[Ѝ؎cve#r?*X2Wz? yY6.i3h:9 hDrkCšFMpyM74C&:3Mn"MZ\1XkYOeˈ&O`0UÃ;/꼅f20t"m~+ ϶#(4Y^j´V^+\[de[rs@lE#"ar;q;Л?KYSAohQd~s lޯLuԝk|{ep8N.9WSIcIa[סt]`5|!+붮7xÖ'0,]o jyXAřN5˃95?{mdij޶ONK6EǤcW3DP"'S _[T>o C %iB>7~_={&8V]ejXnX\5$1cOS^h)mYڅQ]u]@F̣n92d^Ci*kHV~HNS5lj2 L7vt}1n!9z"A߲;5tFՒ/{p;F4cwzTGD?dY!"cGf^1^߱cF eWtY,.~;PQ-֩3Li.东ac1>ɳe GcBW F0m"NĈ/K` 0KQI]MDc|q"%>'j읱 MJ}&&~@F5".Ӯ9GHv@'0,N,kuipn!@;F4>:/2Jş<ǚ"tA}*xxa28䱒 owL껚|j@H X!["kր(ؚ y 13˝1=NPz0.#JLg1?/OU6U4>O;k(`q ;ž&NM֑oAVexS>_a; `ɻ8Kk&2q.O=ıkSVzãrU[#s7Ɗ| PQ(+K;| n''tn pa/"4ю13WF?dJo׋}x=~&[}忽*}}%Ou 8*E ?jyۚ% ?&_9tKA, %y[ݒ!H-Zj&4^ٛ@ Ul98353Ľҏ&iU=3Hpsc BF`>oipذh? M$"p];P9ķ;:~QFf{kէeAnOT)w8$]T$AϽo#'S=c9a Te R`獱ԗ<-߈yY^sE~ iB}7e('O<'(,#ïm^tkD֤0bй:Ml['Q9SP#3%,HړaE[1z[RtzKVx8oU)QCY$%u50M&DY 2gdoƺ"WƎ(&ϭA{YN^^V,&m|6@ btttwm #5d pkNoa6|FYM*qRfo{>ȝ~~Z@VcnKNF6 5;}>R@V\+IJ6Hkr#¤<5CXL*T10燰D&Kp׋Zqs6L05^z?ÈyPNM;\_xPn-SX,.JZ'&/j }!#,m@ KLQiNn /Q "4CE^7#5I{t?2Dۥ'A-GY<K۩.hrQ/Sc zg9C尘oܭ:c񘎪 xؤSAjUݟyi)۷$gOzXf^E/n@Re'ǩIA5vA-QU0SFJޥ:a[qnF-pNX3sӣ] ^i ! |Ys!KR0g,$1+Z@&u QmAYUNga#wKxMO=붐fQV@y=XAkOd=cr'Z&ڹ"rs*O]01 Gˍ9B3XVMf6 zrdns$L)o #f 4'. `iZJhH +W&ZtEd7ӵ]V8f$m玃,տR{oIZEEt,cρ_ki +Z j5==^Y@)z:}1Ză+\KV 34/_{Y rۚR<澈EB̟ #"{cT6KzvQSM؃ y˭e[W۵yX`tHe4ӹ?yS~UTlX/˨˩ٻ^kH^#b#@NHEǘVs,IYաc_.`Oؕ^ZF ԑ/4 Hsir6E{UW~RwOxPƆ_ά:qB L+`־cf !%+) .8],XU&Cߝ2,|%Hv8)ھ:0UKh-A58 O&$` p9<QjIגLfn* /a*bt_O׆2|%#%yzLgp-s32xQ7PdT#.pKT=;#ۨKjA~l.S"(0igABG!G`|!&}-aihuHjmNCԮ_sG~oRqJ2v$mݼl0?d,ⴾš[ Ժ㮯Bc1VXk RN=tLewڀ Hk\-q-7e At!#SSƑ}zEc~awa{v3W=$)%{]\3L. GaL"̄aB''% .AhI!K nԯ8>8bȭ+.?RRIW @YUU|;@kt}rT #f&K4Ћ(6 'dp7%Oϓ@&;V ${&Om;,cOyIDeaxݧ &Jjq *5 ;P̃)t=> CR³Gm[* KX!Lr%{7rQ:]jL6yT)fA|Оx:# JTGF9 ,ْiμI،چgr{fb1XCеP/<0T,y-h罠6Ukq۟H9 Ο(U* Av'Qnf!U%d/]=tw}^Uڏ{$XT 7nf24;(o4E>/&qpgI֏J<:Fhn_VwXCo MO+7ύn~LmeGA6̖a9|pl@ik"DixN-׽%J! :>arŕViOoPJ.EЂGh$2V@ $pɷ7sW@R$7Y&@gZFG\Y8/PWL̚1 "3tc1쮨y)!ў$sՀ}aQ)+|eAo2> ^I(S,ꉴcV9.S߉ֶ (ˋ!i9x_x᯺X:-l&+X>0 sT*=&${\Z/jjkMJk^%st6)VvV=o V00'~he4G݋>35c"z׭8%פ/s2 QtRS+0U/AC@'-O>q^,Vp,"7Okc3 e޶ ᩑ*Xyv v9%lŤcZmw1 (D[Ql~p-bW2{["D:(:Bw)/׺_210_FA|jH!<ͧ!iʁ*EO]hx0YAg 01ev!:@Kr@y' $ZTdB@VCuҫR_0)g諯Q9X3Pz% LxciŗR*ZsDkRzGv"M@E)I@REFAK08F?lO"NC!PNYL;=ybuF*YW|gWcb *jQI6k>Bn"~a LM=Yn|`oR9O ; Oq QUfdNGQ~@_ >b7i>8L}1{.(3i7 f9nsYx=yƼee^\ n֤S{5Ás+e/ێQ³iwEF@N( m@ Џ H9cx(v >GUD?K jͺ91lQz#]+ & '7ۡ̎8{nG唜<.o-Xm;W4GVhX 擉b.r%'}^Tq;Sk[aňPmQ"TQ/1*m3rv.&6@YFˎau{ZZDȴ$4K<h?JYg>yRU!sYC waUm[t/gf[o$ f}<5H":Fª %Ģ%wv^ , ȤAdv`xs=_/oN0 P_տQ.>sm(> ٜ7-[Ε9i 0%-|f:G̫ '~fkwv ZN iS 6 *I vH1_e?}mHqjŸP C2'iske㒐j|\4dl4i 7iQeB0ABqFV ˿_8C5?HeVHHȪ@_rWi*Vtד@q&-5jcPs)gg5;U)fYnWjLXj:iXD^yygX.!3[XA sϼAzDR'@9⏔bC깢LI ^1BUD 4a0hsN_.@Nej0=ܜݕ Ҋ 1=Ϻ-M`ؖP0APQg'!DwwF\ȝ>dyy2W9db R>\Po*dp Om7LCl? G l\w8Iח1)ˌ>'&EAn[9Tl+S)s ɝLƎ[*ݫ{T{'J02,HQM\+2EUK_%tmQ[B-(:IT.t΂ $p[9)dn{qDeN-%B>GO<2}F%׆~NtCv>Ja.OB$o{0'}c9 ,BO"Ù2pag8{jjis aEx1т6N,]VS('GN ;SmwY>$￧$2|̅S:A( 04{#j`9qW`aId32q',vdۅѶG*ȧqkS}`Iy *"z4)6&$g߽:0\Rl\0PƬ]4'VU8s}|*z^>]x>:9u+^o3HE'#D=gO7UjaD:lq÷wc*&}/h !^ͦp`r"*mh<ȱ4lL" lSbh|:2WEevfD8qLu/;Q?w%O0sA<hَ 9v_9 Ew˟JFz# jzj:NnpcH)3qሱB_ ;my S$.+օ4J6(c 72/vOϼ/x7ٝ ‰=zcQ=)\ЯBC&^@"x7N`zt9OfB>fmz\8 ]j dAu_`f9Bir5'̱^% =yr7qTk=b\WOݑ:h+@ĬgGl+O6 ;a)~[G⯺R㗠·(6͹"A^av $V^# U>*yҦCUF۠}Vn*S#"(JbԢHiYH0f} @]oT`Yw V\k\c#JAc <'6H\혢!$q!PχVcy1f)6$ScUrޮ&I}ĨZ3 M'M^'đJLR/7Wo 3spZxts>}'ܥSryQ (~u!NI[sX%/)F R^B "$VPLӲ_ejKRZ_&Sx,W̹֤U'HA\jn7DfW! _^+)Ea}lkٗ!=c";E(2e';L(>q{fήIb*ϵkh͜-Y.[R\ X(fqvLMHCz&hrD+DաgGp)FPۆA:t־R9}ws~y2>C V=R'Vl%d" +VKYi&8Ye#Z2oҚo 6BC*>* o"\\s^OLā0ᷩ`&Evt MpX!?{W!Xs݃Stmԑyw#Zz\o1PdJxM4zjn*mjfI3Fs$q䉒RK%T<7\A|}+{ΞA_ +%/\ "1k78+SL|H 8^z_Y'3;co45(9ӭS`dZ hIq2?τ .&(hI꭛1UQЉA^}gNst KNB܈@(+0mt_>"uP, êAVi`+'],|M ZvQ 87"t-VBA2+%ԡ11p\gCC1YHT]"u+:bJhjZ7`Wyg|/s%IִMDˌԩpDmB1j\"kyv Ͷ6)UUm ΊrT 1iTj{I#oA*)K?LT4WvXmU.#) =un$۠ Bv~s> 9c2\FP5DX6,飢g5?]o4\_8EߓNn]є} R_\nϹD7n͐N7 (q/mv^7"L>nl,JUw':Ia&dRf(Oҧ&nsbX tu'bP%0YmoŸ %^vDakcv ~'&yW.N@rnfjj'Yw\~򙖭N}zA"z'aOYD8г+V|7 ;\x=/"u^D4cN :ÿ荇Gn%(J|2AU(ҙб"31? 593Ȉwl '‘ɮ;lA5o!2IUtiBé̢U!aʫF޿HJ'ʙ|J qWU 'vc ]rUOkBޣ>pJд jd]a"lǘfq^ON'm?f^Ur҂&ْ"J j};3s EAp_8T9̌gcUq=~dz;E[=1Iחv'1r'%J$;XC"'at_`t=.ҙ%CHHvBjB6J| ܼjyk6 W]N>Q>>DF vA;ĄqIVf~&/0t\5W#>i[Li'pzSLJq΄F3;+vHνp 1A[ Kh 6 8PT}Z%%$SB۟SQ`A ]hq{jY-2_AB8sd 8]-Gȗ7~,#3Ȟ(8wť0 +^g}8+(Oa=+q F3Gʆb2A\Q)<+!pj=VRKrp!E-IQ{ѷ0ڣMD"Ib0Hˍљ6xi^_UHV`V:(X-ՔOV5R!Gj˸"%ƉG -O>ـTfP>}8 {0t}ν2 1yNҡqޞf*ߡGv|if7?ćtѧ?t6 RAdػMͤBHnCn‡4+6}Π( :̡OH6OOl<;-,>) zLHԍq@"++z}I!EmrSPYPt'sPFG@TJ 62}\.4jVЇ) M9d%4G}\Lj37?׽>2XBk6>ԅΔ1+2pS!O5U0gŽ],@liU6@A  ^آ҂?b3\r50W5ٯcVj4g  (rPBVK?9F:`y# -5q8+ a13) ]66(47s{Y>up8p[DkO ޫ?p)ËB9y\B#ĒYKA7,^'͊?"?hO w6xe@z(@Cp\|'ur@oa% &cK3(-"SC=QVgnа˨4ef?_cDsƥzyW%l3:s%3X2ܮ뢜N|ZARJ]Hzż[PVuf*<_|mONĥAKQ]^ӗ1veNݶ/Hf.nMV)d4cf,˹N.)\.iT!44jmG$Qd\DAR,?dK~0A@5eHDDdP}.^r',:`̨֣ڞ !O4ajxz l{/e=$c)0+HgwZc5a -ᅄѐ m!3$cA"_с휆;7o0͚BP5lCpBǜ]2 ;ݰ-.5d~1J9=˷sVݘeᑾ ?_1!1^|mWޤ>[$ԂM8P74,VAI죧(dc]%$@yg/Pt0cDL# =/fMj3(doDsܭPcD㻇FaFA$ .J~8x&᭢$<.VP\TfGm[:BS }:B`V$.bpvkK'"sw=5Ć`ˉ=*q ٔ8Wb[ImM~iu`LJy\7M6ZՉ?:n!q|>s= WtoeFR_?Z&2jװ>5[gcN2gֆ`࠻V*3 v^ؓFsfxΩ|y*Ԯ* 񎗼qҸy/vZY&HR|{hjз}?B$!χ/L̽0\ՈNA.C5%Uu^oDѶPOG 4++1@8RSٰw9&$>oI7ҞdxyX'ӛts,1B@íri5$a UlGjLDһyH@u.$La1H4 P{sCgߌlBo%H|Yn[ElZD /Nu2w!44b#ێ)D+'mI^ZŹO]а(ԟ>ڥ$ bHPj7yyjEl) vE[Q4;=3瞵Z:\9̂63ȴ(5xYZÀKN A::߆~E ms̩[.CP.bi)fGOĵⰬnMD:8SJY3Y9țtCTh/XAO5[[XtH݋YK/)ݪ0fϤ[. ye?}dV_vZ%Ox-h}4Ϫ_)KN&q 4vPQ!Zau`%97/T*$; f.QfbxDwpwW\_AF4}yQǾ0u_51!!0R })0qZkڿeMY (RSN{Ѷse ~y"1+pޯ'̼i%I T{ xͥ_t#A/jYsLH)eq'0dLjuE@ gyT4I'A:h k2sN6 UF\*W 5eI8Hi[t ٬7$/s0]mj_őSۧad $ U_f-,Du~Ջ}UZ;4P1.P/_%.@vRPb'{J u_wEg$3_T̶-5K\Z fJ`zNuB^,=5#gw-~M/␽kN~ HvF}YkILF~Ue%o"g*E/@s3d2vnZ1WSۜ 1_$+-6 QbH9/=İsiA6\JZWD"g#L@',"V0aH!O]Y-YƄiJlCSQR:O۫n ְ۠Gs"WYH8qQpiju(,9X>bPg!q*R[< Gvi/*Sqvb'ӼsF΄΀EAV&'ٳޑ=WE! b#ފQO8x?zW>EBJp,D+,N9#0 `jBE{-:VZ UI+J +S7we>VFVI!pUy\ iqVc!$ap/io|da@nQf_{EܼqavsA%}, m"#{xb_;/=GCGl' CK3c43{(ʤr &8+mxN_kMst]r+AI|eCk=dVC5~ĶU/"Ij1 H&,wL.*R$iz CMyI]*h;h3O2Q0?ZC+ L~ ԁRT cHu# 1iM%a!5+od>+rSg݋JwP^;a=? z-zUe $Pu $i>"UUVxz?Eaüާ 5>^(TXJ@*!0joHi!-$*tD0Q㝟$)7i֭aO06"WKTb4z߾:I'eѓ:ƫvyXSB1=0a1rT%WIk %̍D(0ju{LWyoLy"1 p}~:YUƌIslCin*8KṡQ4',|lD,/#`Yz NNXYʻ!UX"[ZY Sud~.PYTB s#ꏪ.a&G_GWDk{;kP<nJ}UK_aF=5–8t'XY2q2+6FcaO+XT ?䧆  y{ m 4̼F,A"v~)y áЩ=QJaOzae0;롶]ԄOj:Si;rY,5XT? v_]qƊ\T!lRFְ\ݧ4a,bj<7M=j[QtK٘ l|5Ŝߎޢ^<|!tkTz1{i ٥ ve $6JPaK>И'YǡU\ϥu|\(m_ZV:˨25UV,~+H씽2zbEki _U2z% VlRs9BoģT=WB^^ B6] $ P˜<)FO0WNlz!4D0ILW__\U.J`3FtP}I׸}PoV VbWy}.c3~θ1ZEUV.+&#WGZ͈I}|o)U;;p^2^XPvq3P䢶+Xu9?ZE:ߘ/%^_.B eOa)J=^ W^pw)T۽xjy 0ʏWB4yJC{c&!7hUђ y1+M_V>xӝҋ/rt}X~~x!!W5xlFӓ(d_|΢x w JsЍKʨ?*-Rp8piPǦZf)Ohmhҋ6[cc޼k],UR`SZNhbVG:( D-UԎ l#w Ak i5g)$% S&)hrFDA:WF3YEWErIL1rД0a%dFY>5Ah43HaX3g3ybSde]j)7㶬g%t٤U2beڽoA4';ฎI'dWVQsjQ9_G@3]jl׽'8@4: R%g;8NܨҜv@M4Ŀ{gc|8!!kb>}Cܢ(V7ަ'Vv "b~T |gʮ&S&nyrnn eihMo[QK,+v4c=Q1%;dūUWVϰӜCTP/~؆x4R(Yt0EWMz4QuI5椞^=ZNrgɩ,忥 %moQИ=6b<W'C肭g{ ՜v\wý!rejzJ}!\:[̒_`ngW8Ī9:V"Vc L%Qco)*/iS P]tܦfz~:QPv~](]w*,%E~<ƲvșoO7'! )/هKY&=F 9!=cwS\;{u|PuL-\ɁK)R`jCtn/o]2{[ nb^:}+ m, eK~ߘ+=wɓ$:#~FF);I\ZhKghVnDFSvFeoU-m,ȁۜkV2фL;~uظڐ;8" D`M_ /48'}D:/U]-x_;Qx z&u% {m BM%DK_zo"tPru5Q> M0zqnv{tUpJoӜ8S@#Y:Kb(Kpj :9aV l(fVe̔|:kiր`.Op|r@X=Kg7u{negcљe*qx$0!z,8D63l\G?t8[Tل3/jz 8}:6b b3;zZ+kr\S%ykdI0f![GO!SlIwOkt5 H]*LxXݼ/!pbtIR hA#ip[4; QX !p P%ިrBED+CTq~ gxY[Hc }_<|jVn}$1k9Rc F2#l6b/pusOK!|WR!˱ޅ G 5Lިm(kA%0/2?Q .dנl niPahϸvSuEŻB(V f{Ls7Į>Zykڳ]-|ҾN ГwO яtE뀚b,}/D0u^E PJyFJgK=6G8^~5S&V+9rT^a۹*stuwUhS6KLkMq"}|>C%e^f4wܻNK=۲vb1vEW8wIFT6-f&eLt;+<#5c[֛"Ѳ$19,%˲2 zs͇{0diF~䯟'IJBԗNI'#XR=hꝉKg>t֋Pxƴth\V'7@FJOBWJaF~R Ѿ&F*-Gx<\nN.o_S=va qsv烩ʣ[rs %ZQѺM:N #Z6.ڃpnw5"61^c l'E ʕ3@<8fMtŝ*LuKpQ&(=+|TƝs†;2 Θ˖blPɇ !H _)~}DUD`:71n?As\u0fi*xb]@F<}Zj,PQ13M3&.(_CŔA*# /S諉l&':KÛ5 nG9-PuKxC>sÎN5GZH0 %o ?0vz.~$aMo<mdd,>R )Vs[#ҟz'=~1-x ζ<;u`ΫuuCiA)s5/nfB:S1$[ަ: o](va4[aĤY⪸ Nmzu~c &.(]k:S pnؚA Rzăg`jCS`7`in=!"^Z (:J[*p-z _VaHJ6$/GY-:c Ry$i(DM&Pݜp܆-1Q{qΜcƬS'{\ 77T#pr bX:[?[#%\se G+w٢X 3ί~i+tZzӮ |" ?dOBF k)Cr!죋C"?L4њP~hHK9&6[GḤ7hatNrn l( 8?T]xV*V\[jlnz\[bICq`w P_TY\Ә~0Nt뉍n7YҕՐ&Ljeoed\l;x^@_@5p$`#n($z+i&?Krb\ҏh ɵzpkdŭLYxi7<(pYAyv  1hj%Sga顱F_0. &K@ ^ַP#%Ғ&2ɰBfpLժ0WԶ3 {Ik43bQDɭ;ʦNs*Er7.n<;KAB02;{[a#+(浾zFS֙?iY?R`+Z@|-3JwZ:٦jn._TGpoNʳ"ѭ,ROQr;jlbF%9D%éZX`ҘoRʘrQhIPNKꦢǏ6V4x#r y*ٜc}DŽLDd<&sz#Q=)Ply>S&w&|rؐE.=^>QvGI r,)>{gpb|ySC8hU⊏Gz'tJu)fdd"O ,S-]#'a]hTU乡pb?wbb-Tܳic?LLQ~J'QL&agFL)/~t3GD%㥨 6)BNP u(1"6Vw2hZ`J}^ ޱ4irVvQimFGx@Km슟D)PhP (gtp"UtwEJ}c4Lk&*ܙХ$-{HFcuoҿ)'nWhS*UH\f ^6\_eD46'4ŵC.:EysG^E+BE8pS}1!r ~0 .BXq"Ǫk;,B}T*w(DCf-cM/nm'ݎ-$\r1F⽭ ⊆hz&p ܁~]Mkss#æZvZ&ؗ(*喣Exe)8iBzb~h;EbnPLyPQ۲Ҟ ݪiD1î^-Eu7(R,á8ƴ3ސ{/J%}%۶ulx"xAY%` 8e_}(IہWз::.j jQd%]A擁"\xg$z'Š _3Ђ,UGh۳Vk]iΦ0:U1Ttc BíTh*a2r]ZIוbne6=fQT޵`uB;R]δ7 )q IgUMk__ .~IOkk8v J{pjV{DO20 LlPցuS+m ҆#\z\Ƹ&j00UU@.6XF\'(jC n6}L|KB3^]| $H%U;3;:MuPbG%x{,?.-numؐJD+x M^qwt ̭]-i TJiSl*@zs|m3xoA^Glk/gi@ǭm=OI[zR|"OuC&]G:`rGܰ{<HΟbK &Ԋ 8 y&ua{h]N0)Y t5h#+xɪlNJW?PX~i? mx~׭'IWŋ7ƌܼ9$G-UP#3C~w6NR 3Z Ж ʊW"k-,= Wn}.@4{=t: ]yy h;_xGtoի$rʲVoc e<h+Ca0ete<l|K|:x5MZAT+[Nt1@ɿL6{0{W(`T@dr.#W#Y֦Sm'79',f-I s"{-D&8'N :mzF 8iIUeVH%γ4M\1z|7ܹ*h+ &u ߟ~ niA&I؉ׄH mjdԴFA"8{(]{;wcXNnrTUKb~R~qAn/dwpݔRSܪe9&P &gS \wqfeDaIE>lB|cJ³lrL.sU@$lӅ4;H&R{f\B5u/59nlN`uݿ ?[v*R"b4B3pJ}LVn4It*4D؛ Vrn)]BFs.H&sz?ܴ^xOXUn+ feF޹%ewpkF^>T-W{#{E2es'eMؓfT)uXmf쭆$&02I9ys]%4GK]qVbN["U=)5 !d=0-ӈk&O -U)30oQbtR_j0' (RԭrAng}̻@Mㄘ M11_&j(6 x#wp kbX}dX;|YykIYf󪍞4+mKE`moP ?x630Ԅu`~sQV|PzXPyo傂 w^h0%Vpȗaɫ؞`UAo¦ fjvUmABIBwt챼 3w5`!~*" /gNsԴ/'nj7(`=nji+DDoւT] 9*ʜ&C'zq0MHbho3CAvĠFŷjL2"yA`Oh\ #V`-on[K$C>_;{ gĢYKD}/Qc'~'1 f2ᝉveMߚId6NQX[==}*-(CGNC-wIb*KT90=o?! U׃}gÅdmUN\c4 .k>ӿ!D)og9FV26cH{z &˜6v𫤂u_{V̳8AizޮE/cn`ɥ77 TX1c=Jzn&u9-g5[\3xFwm,i5Om"hBI0RD#,H8J82kVE`PX_ *.sS|7m; NWabkʾ]MD,uՓ\YD_(!{@,#%eVOk ^ qB€[?(:J݃ˤh[`z$4|\ gvo,WĹ .NY^"nJ͹ ,ԋj-V/!=jR. bߴK\sɊ)\_%]Į.Q9?czH:o 93[q<15R Ν&!IaXnE~|y#jнԚZVwXeʞ4쌋di)!=#xva0 AIƵ81VTF@UƲAKKTEx-/QS>Z‘T|{_<XO[(!c63쟺jScew?L pJRo+?Hkz#j9j}6׫`lJڣJU<82d< ?V-M#yL8tY+W|?FX;3۹9>ehe<N~4w߳%ZcҺ6Ҭz/xaE8F&  8wޥ5![RA.ږ =p0 f[EjYMਅ $bZ;oriN REr1¿,V|a01-!T%^5\wXoa:<޺ WomaLڀS+ɑZ₌,ОƈXǨ6u쮐4#ǜ.~iUN2e6rdfk&6Lz"3Sz+ zN7з0bns~*\Kx> Z`$Us:*Nbce-'4)El06y /m}9ve%\w5-dڥVq}Cm6F~@5zX{Ƴ]{CXR5/ pĮQFu*ȔUeL!xe^PFU6iEwi M2_qF G{ALMT8E}k, iYۃ*j^&-ovpV&Nz`)] G9t&k}T`*f(|?aWUV"xVc42Zo)C"z۩{3]6c׳~3$6  .uǀ "G Z0n,BdpN=x60MS]ņqCg p6mIg1LCjiP3RCzsW27U|![F1ctA.uV̦f:VYK*06ncsúJ/LmG&疣e@|҄XyASkmZ.z6RA  dpHDoʅ4G ]B* Im Cdp=˧KGFsr)>A : Ԩ[> = t2QF&.PS]^ޓ{A4JhKG|t~.f?54)&nc`hm3Sij!JUnQ;cSrVHL(aqBw2hCq~;aJs1iQDsy)J=pIFs<{n{dDeC5HhcV_/Z"42\QnW;;ON0ZRwi\?.o{euI߫A՜vuv;|0amv'^/W>ZI2Ne(8V^ԝyivgώw[kz FqD)g= ?TT+iQR<']2$E"e u8U Vnܷx~;vRf(<ò.a2/C ֺCtu˿˄@BWG88pJ`,~S4%_e4H%QsU\t{I~G@6$ˣ" A ]4rF.a#|P{.$@  mC9Ev)|]!Oby?l vxÄX 3~w7x*)b2A+;d87MF?$!%aͩs^}fAP֘ǜF,)Ts pWtHep vi}T1RARfZav Ր<}3}¤^d18RED fg s%T83w5r EAR7_pѫyю^ T.;ڋݚ<.Wzk@ (`v_zgu !Aa+_/v@Fm]Vl|w(=aTŶTo=/6* =F3,[ v⍐,c=Ho̢}&'Μh`pBR,_pN#H1iI#Odl2#ڱ(%AgǧxvͦLX: c};ЛV,c/\X;7s}젆D[`%ɵ1DASYyh[Xs44 p*|!\F1xTJN>~"頫룥#4?2.\P'@LTa7:n{5!=~A֥|,F /n\ Cp y'DNhx¤v],УHsWg~4fYcG>S_^,8܅  .Ly /[6e"Dg_q&=B6̪,..Q}QvPO\o %>]dLKG@G]J'Q@_z|<֓j%(}y@UOwb!)b ěLMCYuOw KQ*e=fV-HNد7S3!*p-sn6ۄL 鳴z=_~830TkxK|{R c0v5m)Uo+sBjZqre\BmB.JQܝ YR49U1jȅr`y`P|t:tZ+|U6D?6fHÍr^(Xq?t&!Q++P"?:PPO&D-):6\ʤ5,}B l9ͳJۏIӶ9 D4D^)8.ן$+ YDR~k/<\2@^d}IT;!L_WlAc8\$C.{? J1;8iZuc?z~gj] 2,^J%͹BUj3]T,ant{ڃ^IGD{AZ{]5 ?3nN]F6dZQ_vm`3#PNԲB$q hJ͡cv7h-śp֧4u,&u6`, $~3!ӦR^Tl{N@6ƿ!aܖ&R=pB+$rk}` {l1 Rb/PߣTВy>:c8}+;iJWOCS%3b-1\crtý5&ɝE na7UDl5P*pzA4_]_bص #|㖡z 9eC̘=Snۂܴ$܊t%Ny2<zTZ ?kdzϼR53\'{\mAW.ħ9Eø^\-q(~$g8p9n.f*J+;Mv|[ܻμ8:K6Mc2N0H,g?hVlR]\*lmkuْ;EMOܕ5LZ HqJdMfi5V:)@E52z[MB.٘4ø6"p&]^wȘI䔩>Z!@̋26Suӓ{}W}vTۚc hәؗi]C`u\=^CloX+"}9LVRf{pa o%*u@h낱>F/>A(cZoSwʇqZsxKɚP$,EeJoxoT:;csRE .aߑ_S4/ZNe^eILnP^*e~7*ed Yyp0t3l#)2W9KQf4a#/ JumUdm;N8 V,D)V}:*Q+.,݅Jg w#"9$7a53?.(fQX NW_~hBSx`|b6]ہUy\r9L}lOYp\Ȫ lq_`99Oqלdo8͌|>xP?iW;3zk8,HP6 >ˈPdg?Qg!ykp8Og\lX!L@D:KD7_m{6xх@fz' {YJj.pi~{h SV1yZ>ZPrr*WvL5) أfM?#MZuXGM*\9D|"ŃP* %?k6rOB Dl dCe?q잂1P^k$'מ ޟD_%Pq*iCI?}-r嚆:U@JQȰE+_./p\00$9{h۹n5q4I_y9p*HϚ[N$i,E8e_A^h\C Z*}dE@hG8r2j19:k~9߫]zC:.򨛶Xv)B#uP_ ]@SJT7θUFW Ǵ4?j_ALڑy!Z W0ڽ}O(!Қ}^ /+F oG)Os,UEˇ.&IQ'tF1yi#xez+? &Y;VʋTyɶz6\`ȹ8nކn [RݚQȄ&` uj@]Z7-`t{ȇRt:2!7=" + S*jd^cX eH868ף;ndYQ(Rݦ>j-N6) 42!hN oD8IO^""/:|m`U~B!qqԆ7 )' וB]KusL3j3Xn71\]mr#\D$ b;U7 u,h*H/NၚK) H%eeA b R JQPJ\!\FX]p1wn*էsK3/W>Q-[dH}{ ˬ< 5x F zIZBf|T\d~Tt}i}mEzLG8Ian+0©/uᠧh:Р7,\ eʢ[kDuHJk<-I?TW&+F=YS4p¿ua>tα&3[=l͸n`7=.7q?q`uC${ctX?Ȝ&:<k-ţ*fs\u5a<a-9BkZH&KT1Qz.A-z+Snxq#<In MԮ\B° cHKO~8RWrdDv!2[ZJ{=J4p`Z_~ T?j6`9D 5O vԞ#p''{w7u&bC$dtiZe~C[~WO22s|##yW]qSӨ?"&bU elp/a;#zr^ 2\7 AK Ywx3;e1V:¹HV'/Y =ru ڃ.eQ9{WBcf~ SIJZc> v_n!ˆE1o1Zek}+!Z FDzO\ED(3uds,A 2v]KL|['்5輅^uyMd9V!o8")/`w-Cu avKڝ,!]FkO M=PK@ys;zz wQK_`K|m۹xw̑؂7(xv[B OL%G6m+<ޡjx~`9>\7ˆPBSRi)\Tw ݁@D9_d&h@ Mz{k斜inyQUΑ3>; =(l0Y+^ϴl},Z> A&'83f+zr<0V~AA7#}(&UCDdӫt8̈́hZ≐PR "De c0,ts`H5 U}! -$uqT0gsEL`Bl>>OX9g>"@v \DVtAQ Hk談_}b38  84K[Zm/0f -0D ˡ"v}~+HUg֚bT10cS}av9O"44l\Hp;kcVKA}&*[5]El[ Z_(*ޤVܽv Z R6ܵM^y$HiڭVN6r^XgKkUq=-MFZ#֍DU6`!mDyy:ShjIݾ_OV~}*%t<XlI2*@r4x0g44{k)kd%:+28C3|]rҿX[GbaD>dj,,sr:HzD}IX!IR CXnJXN tZ^̘'Ow$6]hG{I}9#8Ir#64`T3h(~u{{ ̔n1? 4jDw3KV4 o:LiTKV V{L3OѴ :Nِ(d?Z(IF8qq?%dYY-Q|a}Kȍ56WaU 5\ sgҏZ˻NutTDz1Cw+ ̞0zȱƇ:FH YoSi];wUe"ktDU环?U`_HcgRukPFƭ\9NN"")H ے{8SO`g͑9:ϴDNV9a>߯/MIMbAzr來Q2z\T?{ל5D'11- HDKܡ͓xfBzʱQ6%mlT? @X!mth"=YgͷNaO]O>fUBT9Uȱ!a&#EVdե ]O%AtmY Qxg3d"Nlc&xDe\Fꥐ$%Y//lfTU]14ϗF2XևUf-宲ܽ" #&dI4@l֡*| ^C}фbu߿1g+ ʔ=CYLf*64>̪ g"޺r錭i唬7kpd,O %^^ 5ϵ6ZaP6®zq 4teeGů#ACAF(vU6=56{sFا82`!xi؄kVw*[8/LT#Ms36k0o`CR#g9l8O&pSW 5HI fzu k`D=uʭ|WLT9YL֠] &i͎=ה>Mֆ+f 4Freh"VGېZ|n Zmu@enJwmv8y= ò0GbUYdoΚ|&&1>څw 7"9,å0@x> H[1=)tXg;gq:[LY]_ {B LD>aD_6bX$&ksc}h!0p)<0F8D{.Шy.*\" Ӯ8¶`c#RNt|\!tfn}tzu(WyUDAT$SjthmQSPy7 `U`7,JkC[iĕOX9e1; /ޣ>lQ`Ь&z܂=CyւUn/(>כ,a8?֋W((%lƏ]͸Gp%v]w֊ =""Q.H7b-A6mf-H)Asxǻ97T[IP&Mp7y ]}r%ҐGgmH |ڭ&T"/ t0l7C҇5B@ar=E t1S+=$?ݣ]f.O\`tp5er7L"ʹc-k?$Y,gz)Wj|!N$v㛪?h3k/ | db DRlժ]Xdb!UJ#؁E.MZgvUGMTZ:V#]T8[LRq8Ƿ+\iWSZ (¿륁8V$Pa2Lh<^L9`֭EU:kƬ?'l_͢'l1h'=s$k 3Sˢk+33_?wVQQ/u9 Dm:BbxH mEU }DꐞSq(/^skă'ckß Pr?`Afڤ[!xif.c5/,:Q;g? u&ȊN3]->@QޜY'nJo*Cnxa U .E͈_ 西ID "TE, T%_i»Ҧxcp S'^acY a*C%bթ\C&Oq  ̣)_!k>΃3դn1(=?YaeQX{VUi7#uIMgߴăқݲ棿d(b暰ˎs/:A^T~{:[qrFNFOb\^RÆ4ߏs'dPyȁ̅!OWG11 V~J蠯i$-,[~Ԯs>+JDv@o ^<79vw퓓,UPy:LD#1Xsc6u&KI. ^⸝fZӳN9{hAqxksO28ha o4\GDm^uk0+eh]D`Yq;,7u"YZiƚ2 Vh-wkj ylEss60橫g"; A[^˥6 UV݁Ujs]JW_9g-ZG{ Ys6)#_C;f%|yrpKK PkUư4,Ӆ/Bl$;OSqۚ['lng"j_X^O?īS:Y̧=JTǯ<&a1$9@eb:-b˜P\Uai (PT0^ H2Kbh1b4θp3eIEMO&6?C$n̊֨7 Gc;H3ԆA$9 b@Z1,$} *B 4< ߛA>\7",R+T˫⢏Su6QABp-;XѼ0pUg&ub⾣ !]Ѧ̖㘦{)z395oC$Fobhf|6^!Xy#4fKKx߳@n#7vmqh/fx=/a5^kGP)[m/{WXOޢDa І.A&*lT)H@rA,v~h:sԹ!!DܷA<ӝTcsgkrSL_[[Cژ`vNUfq+~z7q;N+sFryKN" "wߨAol?/3_ݹM$;2; lm~c!K qnDb-sP&o#IY 0ɺ"^%mfvnEt`=lo \4eSt)j1.D#|1I5P)QRSQBڽ 9UK>@:v$~",iO5SB6HtGgK͇8k#8'*ٲ`oRm C!o :74yw])5ukS%Q0#G(@R /j"lf ),hpj *w?qz~DvhcoVYI,*MI;mOX7np\-YRGEa} ڃjYV{_W-ц{_R qbjrKl5+\^͞}bvg0}W] lîM0) Ɇe3"@^A1(2G"UsD lNoӸ#KY.UatE9,wb7;Ep|\2`PŃwpy|Z-*M#ʌ8ev=W<܊ѣAfH6X+͒!<ʼjcmH^&v3{)QzoܩQOAW5'b(Ôe: ovk:D{H؍ow-&ӶK6lr) 9j7'b)0NBLlԡw9Ɵ.yq߼E4/>Gj-v @ }@BSHu^ަkYi*ES󒯁R?im(|B{jd]g*qiNǙf1CC9mH[PoNS >.1-3ȍ-O '(~';qb #d<\zU(p&qf(PۦZvb5o-IⲼ Rym;x)濉W~7ݧe,d"4=[K Brx}6Oαشܴio<`N펁XG>)SM7$V%Z|B7؁ɏ%.qտ-8Md4ԢRlDg?IWD(roVsb9ga'7̮^ @ (k?ӊl7zM}mY^dwpa[޲SqT2R0PU^BA]h]fg mN=\n>7S{ߢ,%d( ‹9?9.u2ࣘhA>LӢ#g3[uz6}/Q߂i4p=Np>NN2vhIz\u! ^,&p*K[1lNd,g0?:}#*BvUq:g4һ_]F0q} W,PDO4 Cŝx1Ga6n#P v=HQ.npu}ֻG> +40|A.۹ޭly "tkE\$H=Jr FD荸B{~ uپP3֋]= a[W zPC а2E3#j\{;w9Wk{tv4ytfy**,x?o) MV.'$V#1C;l=x1o/)a:&V>Nz3g WwpB {e1Y`l$k H!LH5~cΤmqCJ?+ߣZ߃1fjoi|,OW[&mm jđ?YC:i!7R~+]o0i8h,W*_}cY ЭYtd;g?8yc IFCj?^v k!q/dۮՃGfPDdP"\>Uz 6%Wk4_}35Bهb|?L*[Mx` mXNb:bK}}|+Y_k#6[Օ Q/eJ@$Gr&iVꁓ@zkz5;x]*q/| /.ֻyIuЉ~ 桯.T*(z =0; +fJ5? { 6tv f0S9׸,?GI{C٫ajT,D; 6fx'y|h Eo;_r}p=?E54vB@l'rѤ(ŸFyNl29? XL TP캐n*lgTW ;O!PX*J'aH72@ IsWJ;XW;Dݵw 3ݹAr}xfxT* H2H&``ܝr?>% aǻUV풅%z`BlR8ZHHT7X-n6LvD 7x^W0Vص?@c@Y̙uH栭ZPb,U<о]ح"زd>|֕ Ug0l"#2 f t]/$|mo2DHO|#<|5F_2{ȺWhDYZxjԗ4*EML'L٢QH3=)s_b MYEo5c:YJ} f( _k͡4ؾԃU[=iX`'gsyײl=V`'Lqp VAKF(0f ;I:2fAH8zCc1o J+˞ֿ庁sP-gSE\$?EICV~:O7_nr L<wӒի`ʐZ6Ks6=fJÜcVr=N1?I!], qj5{Q!k]=T!E Q^(ط! 7' D*5j^řetΥ;,}""Ķxq_riE F$ֹR* 1,qt$+sN/V a$Y+mywV 2`*zJ\d1'aloʸJ9`h$ԓu~`r0ڠ x*J*A|O oh4y9s= IqN mcv$>:"^vvL2wn%f#fmմow`PV@^̔[/4demZ=@8>mĝА ':;SG2E4_s *9u"Vϯ¯_t[ ؉5P%r/t=jPY`v$lD37V|dVߵ2`gkvQ \CPlBs?|i{ yO)5L@k֯=: -D`ݽ\OgtEbOZPD p+p"J2W٨~sFՎ΅k:ģ3..08 H6r 6GoR{><е-1^:mM›{3eܳQ*8!&?|j ݶħ۴9/B٠^V쐌_$?GEurWJilQvH%I.Nl5HR<)3 D"A%{|Hj D7%Wh᰺k3xmO" #2=/d8t2 "Ppj+ky^{ݤ}KXuHzDq1ߠõyDJxz 위ǵD^66tf[;"0tyB׹>ϩzlr\|Et!:C>Lk=Nhh1[ecEQ(\KdcB2veFiL&iaXq>}ZuFi=-/@JHwCM ȴS;HUY?Q̊Ҫ#byF#fvDU٫*G v-*V֮#ZNKJum+n|A%@A;9}{ C 9?tNZMܣSH8KJɔص/V@v(`,vaCE2auN f)6L)sM ,C_k.4*@pBtK'C[Byf c`na󧖱Mѯ܃}0 GK DX J|i/T^?#s["ժ[#5Hdo`AwI*=6rd;8r SB VoirrUm5dᨅ/Ag_iQig)D,x)6;.2P ùɐc#g߆F-/-S?R>rbm(|άtM8ݠB4pcu3{sZ؍o$Vۨ?SٮOƖ<쭜#K: LڌΟWK&`XݚB_쬬%0'V}Qsx QtjuR2O/ s2P#1jں*#3J ԤXe/Q%r9ENIumڕ)uHб,huA;Z:,-RwJ $W*"6v b-y+wh #/e0\E < ^G>'tcl9tsm{>MeW@yTvKp0&5`֗OK)f_{R ԾA'08ɢU/aY]TC~PZ̅䌿=6ԕ8 S_\tc_2i3IJTK_Xި H! -9t$V{LRA}ۀʫ0? 2B"^yli/[u?%nBh%¸b?i}MҐ*J"MX8mXG, &A_\:pn,s\iP*ůM}k@btg͝uD5Rߣ=6rdƃplZ/3"wURE831yqD w b8.fUg@6{T!I!SC˾! M?3ګ7ّĢ}$+7Vr"It֙"P2j(ʇ1JF=t+crTҕsU!nBUTi-3!MQj{-^նt_h!pSn a7R?<;^9ʒ|Uj5uPFՑr =7y m3tA9 LĪŶ[MtfF<"F e9bD\H)e![]waEI(NGvY]̪D͇%,=ܶ I]9팋Xe,,f*ȁ+;+A_BFvři?M$l7 W>׀ypeHhl >-0{LdG n#–hh([cwz$ A*Og[E󟡜<\k}Z7{>k;S29]LB L^dQ>)%g&V\ +oh5}Xp>N4A:4M{6hȡ*Z@)8\py:s+wjN-PµTC sW-坁{wC89|vbՋL[QH zEESTK xf}PV7DLKG2W#CB 'j{u.ĵl)"16 Yoc"=[V_`:87gtS*x7 3_*\(fHxSnMeă;&9z T $k'$-'%;?tM̲ۉWS˜Sn:|kzP n9O˜{ 4ޣ̜|lC #/E$) ]a._x~DQ&yiX!M.l/ǃƣ{'=wSJI5^Dـg%|2(~V%Hm)9bq@X}r|$$ӭE]GR7IŠR{t4옾El&2h̭i/j 2EXTmÅ IڞWz5v%8_cōX$]a" e7<ԡv_-P~Ǎ{лy [Xn԰-g3uMVGEl*ce!^s0S+1D5ߵbA;7O*b/Df8%{L2Eϕev6maxư,)b Rp/@: $L cq?rM&վo.@.d7;yBTW' o% bhCE5#t+&ا)4BNEhKH?wOr.Ut `Ix H^}H;:|&N~8`9hm g8t9l5`J +=&6"+QflC!QFxg/͆4x a޺U좟Iݿ[w\"cCعƌ]˯6$vhd-_}QqD\aq:M>~Wdrbү6kbŅX $Eg-0Kv;i/G3h+YSNx|lѤrE>#c#o1O${!M幓z'P5pdZK(Oң:k"[go i&8yJ:A<`ߥі"ЎضRؒ5P! qd7Np;Ѣ#VCToNAH!p͎ˬ2˗IA ~gzjwPE9dɤi)*99і11E%ȉ:)Hd6{vX[^he6npnvd2oEIl ڨc 8MScu亰ޘlJD@ݓꝸTÀh|osgؖ@"b٧)3H=.4:ojO1!?/NLtB/x]vK/f'9i fл&4Z!*t:ʨؾĹ~ImfmSZ@tNC2FSǫVB Nr1e^l$^f/F^v(q/ׯS:l<= ' "Sn?(/$`R闙[ oPϢƂ{\@쭸D'#!fSjrxkDreCq zޓj%B<=sQc0HN] &f% QjHg_ ]{ mJǷPAgtw!UQ<ڭ=9~-W8yJ`)v{6[p^Jtڵ.L|O.2&"s{ư=؄(&d 55T3*!#Ss۵$zT@ gS"e@ϹQȸGh\# )٫.G[Pdv^.b&0Cy)MI6kaQlSr߉uGba 3UW.63 5_y,.Qeꪐ2Rg\lC:fИx;lc `9S7"MzcQ|._7`r ү  `TQ'57(]DP`.U2`Hy2/w)aH#j$83xKA.;W?9 GMx0^Hoݡ )]'wJ6P_wޜhhUB]h$VwߟA{~}^ -P!YMkLZfi5z_Y7RVSE>8㴡oR"M0 5(ϒkj`_IOȅ6aY 4iRBN,CKqf+~j꨹3(l@r,B(cUF'^Wmͤ("珟҈=1rrc嘁&:`C zpp~ldZ2fJd;OTRře, aNsWTg s[=CO8cCOYkׯl!uE^a<`>2yI }ȾxV( B%4myglW,4 /f ;iU&HkzJk)1/t:-RB>nuHUbfo/'[Hd#?9Ս.Щ| }L#Qɵ5^BqZ~XUQ 'wkK<{CynLV8X0+ڽԊ+vsq2T!q} &b,EFSBg@G{s'~w7F&w }U׆Q]ir43{ĠdcӼR޿n7QO_ ⊘6Vga^lq ovL[i JUZo78l{t]G4CpN b-ɝ+=)j.r1."ɤ*E<~5 xOjOL,xeH~j4Ka^N1 }KBs+c3թL/ %]k٬1͠ѫ?"=/nqJ ұs_RJX^$VKU*yi0Gx0!&\bn(g>p*@y ez  mliWQS<e}.n3 KF z FAε]. #qo_RlAsG_!( 6j?*f,"'BZ9dz-\D Wc*JMڭ]wt܉Ʊ&i~X{ΐ-W縧}9Nz};H) v&M  Μ"Bh i^! ׎{#eCքY'qܪQ@fקt G`<`&3kmQe l:kl;Cb:.(]Hvm!b@ _[pPm3]0"ܳ-ަJ\pѓs-Z2 >`-%izRg-*X%/Hꨣ-qw(6 @P$@K'K.ŤO,6+DfH) ;ϊxzG*ŀZ/ e x0!.O؛Fש]o]6#M"k瞧emG*~񰱇\ªS0,FT9H4x8c˄q@.i>ƄUd{'("/MW!k煕pssD fȽf|CBָvWF_7iJa۬ K:Bh+tO% V br=r -;IΌy|K2čKݵƓ1jZ!#9"xѪ^ ?iiueߎhD9/Kjz95!⽵vMA{3QG?Jr /̋H'nEq9 ]}I$DޚbpB%7-ι࣯.Ɏ!B)ou#yXO9v_'+`9oH>9L&*y(E#T+wd{pD'-dqtQY }&A# ~{_15zu(^Voz"O98;HoLSr>)[E.> 8,ǡd$|)1-:+C&a]d,7.?x`4~vrw:+WXXt$3P ?E#2-/"|[02fH 8"Ǭo+HVZpʊwf4 jtw1zU:]}<]TG_nnƱnѕ' U_W?A)|49yySkIBJDȕ_[sn=ɰ8s~Ռv'lJsjQ Vz&9L~Ynރhمn5`AmDeƦ\{czl~%\G`-*|DzWϤN*6Գ)G!+FOgytz )J=K^C暉,bXLY\R4%t 9FLc:-B{pr{.O==E9,gPi}ܵKhrbH_&/;EkRNoݨ{qI#HYI3P?$U.Tx.]~"JPt0t*,s$BlA@ak na ư RFXbpf] i{ɂbRK>]Tɛ*S7<56.U|N%>?#TZ2,&` ˡA5zSg[\E3yHi4ǰVm݈.(wB+˸_O!?XpGofq_JrLSmq:RSeZ]^M:-#dl%s:-ו~Anf(1=@\ӱQ Sk!3 l0S[MR5X]ok] d9;sM*xzĠn;l.4},=] Lj鑸΁h8Jldƣ $i_ 9keiî C>Eg~|ZM<;mQ&[3Ed =u/߁ v>U6XI dQ۝+Fzk2 py/ @=M^%uNl(<,M6q49}:rl;Dl𩥉B}0xq ${Y/ͤnیѴ!"8RP]u} KQj@ׁVqh ̨ݡ!&#ђfb_[]xd?@BcY 8eH#-_##{='a#'ṈF*TӦ4?J9./Uyǀzgն8Uej&~SZs '\i`S KJlR1 ('.LLkVž,&u:|BԢE u* ̡` _n_M}ǁ_*NeΉc-b?SOhlWEЭ?oeq9Ȃ0eq 髂5`<]eh&f֩pisy``W*jM4FXsu3!F蛒ӝ̪{)R*P=$r*zr}" 9VdVTޏ 8;! TbB#?unx(U$Y*hvkyAbsVgD!g'lN#oV%iD3\goz6Ct짢0vX_!AJBAiHсOf1)`e;M;?QGDՙ53QeBQ^ۍ5O[Yo*I05bEǾ ?dF~V$i&'jE^=|&&tQ@p{Ah%-{Әn"?P{dfYɑNE1emB&'*1t+zʱ޴IMe ڱ$MPy ʷφt$߄%Wxt0 ŢMvD(PG}mӐEd7C|Ba,ʴ~Iw/Rl^]g>f@$mFIcM b8BZ<7 :HrO.exiC2\wyZ5؏ZC!ɭFu0ћy'ch oهz068ƐyU0ˆJ Z[-F n߹*G:G)dӎF,o6)*d"SZqK=͡s[&*8ݿ _ AֶK`ZЗ_lEcl&-Vw`j3ŋrz^6W"ґK9$?pfzw@u yRScܱ `g^G >j4L97H&*4L׀AſJX! UKlEՎ#+<-`~a5^ >. = 4л[Nw)qKͳ?˵sہߑbyݸgrƪn2t eSsݷ- amE~ٹīԏNģw5zzKBT.1&l#/_:*KSZE4ر3wG wSxNSXM^g&IN.RϊwH#8N>Qe-v1721"=\ȵ#ީ`-~7)B6z*xo7  ;^FK)i{h&[{gԢ+U4y{ភ"ۍUfP2|5%;瞦YzՅQ&%bf*Mi NJ]K7D ?,^KAZ1i=ڄ0غ S܋ /uΩ:"J'?;޹Ʃhm52YKՍC2u%4.\ -B N7.s ޽{^ٕUY=_o&Ibѣ7(˵G¡IX TMw*&01EaǣY+z&tU)S^z[X9hf6_GaF*-!ہTK}k.ő)PBEic-|mMl庎/뺎&VeUȤ}k&BN}I|y/2a 뀋:4AKd+at^Z]G+tvTkRx%(Sw^YC^vYB#~sܹn̝M k{,x'JR>\ʾY*朿2@A!B1!Lh*(#VS)n8j]G)ƺk(8aa[bP=U?&SI oV]bĚOƄzTa+X3XV_I1=3n8/(EKྋΤ@#ĂQ'ўMNcD:CW^*S(<f+Pw$lxHB G<Ff,JĮ1)ZV\" VL<#DKg3nP[Հ!]t.i@t߬"=>ewiAyoFw>$u45AUGە:gy W'FLKTnn‹\X4ju BGzo,z2p 7&ʘ*4RM65*Hh 8|:|$u.\v߈U'†G͎LF_eB&6q~0)LYx Ybu6kX4[leG2c#W߫r!nL7WQ%n˧&>8(G)&zB?_ /~+.gbK C/>`皒-lХ$lg[&ty|*\IaLlrRJT;4>G_mc''#VAf SqQ(! M/t`Y~/MLQou>} RxGA,]|-aµ2PIo(:>ɑ}1Z4!r]=OYB 7_$F+ƞ0AG(kAdf8:nn09O0,yZE\pM~C@qAoQT{{Җ-E {!"m圍dfg׸n !VD3*=E} {߉mq;jZehj>BGK0FFZdq-A~NIQt6MET_ _ZFUfkJSvi(zqv8TjJ x"jcPھ׿@a7O/QFWk#'[,yeYTsPxeer6 ق"y*SYޟi*?Pi6 "Z5Fxۻ`DS[%(%iБJYj  [WBMpCJvI{PS"±.XAkzsv Wo/֋s5kQbE&GTa,0`PcU&pլ,b<νiJPkZ OyŸ6T" Nn^2ڔ${$GA`=+]|.-*4iØZС뎯<KAz$El+Z[cwjF^I4 *ZB~f"ptYY;yi@ՙwPuM mX КO\)9/}C%j HM狛<,a77 )Gg}lĀ{xB-1o+v; nq 1 kwJ ?wҳ]gío[b^> ; dysm]e7o4ҹ<+n/4j :%U*O"m3ƿr9vQwڳ6DUG&irv.{ cE qd@uD[Jz섣'Eg72}vJrU{HLgg/}. ,TPr~]ﰼ(;;l^Z&ңXK0Iԉi-@ϓ d2dVZ0:]`8(#IJo#7&r-QA^$}1#a\\@.#,ĶP9X?,4eqb4CqQGѫ%t=_gpRfED4 Y{d\oh@R00r([ P+͢{XGkQ_V%žZ[7-S"8iyJW1-k<~g6N6Nr%Wb؜.;GBSO|xI_U=@< ^t@ޚO:Z*(\b8hJ,ɡNʶm ga-'kaVơW%n}ap}զ_$NҦ^u[Fֵb\9cI's-BTڴQ.twg=`WXFa]}?i8PI-W^CAEC.~BሤxPW:?u@yMQy9!{^w%(5A^|S] $X\ M#Ox*0GJހN߮kg+a8nZWE=&qϝg,j.veT}bY-LѺ HΏB~s[ gEXȏ_=z/HUS}/J>sPf1(ANuBg4e5)yϽBDŽv\ y##)|NfDYrjɊ h\[5#_m FɅn,fi/Nbθw |g'HwNl6X9/>+ n\>V+]TY2&(wx[ iB!&`ֿ B2fs1jFS|?πG|7 z8#;ī^c oh$:ΉJ:q9gUVj99 frScJV:"r=Bwso:kcёPrF\ᨣY gq`5<-dŇ}AX  gV[9j 6s񐔇M`duF+LIWdC8w+0JLǧ8{o`qE'ap@[BL P-0Ф&}?  zO5]p4X藿du_ `3{SH93 .A`ذk#P4IFc1튲  %D)]#"_EI)G 2*[1 ZM'੒|3ev/d8iw݁'TUq-wWŐ"֡w-+]S}[=ƿ/b"3 /=wM5,p-4dQ_?uF[4M&X)Qt.YB4&U/X%0% Lʯmf#{m\w~-y-^(p)a M怠KF<Xk\I=uܿ!n F?HmCL|Wo,p-$}9 ʻʗevmO/z!͙G<[C{+ߔ"M|bzw5~*$Εq>c=n7WhڷzC,`Ǟh=DXZCDZͤO( )n&y>bd :Ֆ 6}~{a5LTܰ'ABRp$(TlEb՛WqN7*,ҷ|&PE݌{po΍EՎ\''8Ji#<\!NS=Kgveq%J@ꋗ6dRzT]*_ iR;9x;Y>TKZJ hh %EQt܃.-w4EHvfzoK0>D\ǡ:jqWRCM|_ }NU62 JUf~{M\+':O-ǽIv?Hn`o~V#*H%qQ!mr&(McO"F#,c=f\.TF uft:LMܪ"袰Zvk,?z{¢s9^5V-XHE1d?y?;ަOj jqa"j5 .BuML+8ttڵtb^s %rҺA,*Eɪ"W?50~[ -{&vE 1NeU1FbjRs W{ָ)NGLsZu.S._QE%RAPufAkO\!͒*WFήTQ'*!ʰ-)%pG|{Ǔ(ʒ?fչ>ip"quS\R*4m4gZ-~pCFf}LPc'Kt„=iPm0Q;I*,AWy4 qA9qzT&O3l]D}oXnTAy|(H]ZY*NU.=T+B'7^2gF _.:AE,9ǵNJߖ!j.d"aBw\tTB<ďyXw)lyXR(HtzQa1Z,k3A?S6&@=TeUٞvʣ^|z}0-ǿSa0;!xӔ$4)8RxTzO%B~n$4nk7n3"cun1 N{hWk=2J֮%VΒX G P}V-dU& +.Sk#ؕr,oX|7 becr1Nـ"K|}љɲO%hvd~&oOQ^K:zpWmh|1J9?KXԳG;¼0%tYK69v:&| %iM;ڔ!>̍^H쭏}Ů&*̣/Kx6}Y+3Cd}rfb$0{dtG-T:2c\(Nvr&Qg:LH/ɶMwFj{g6xE0_rY:o\%oiWxff! cU/x ^ 2N`G4Sp#3_ Lvt #!h(qcZ1-Yd @pC;wxV}{],a:]޾>ȌUH֚6s+,2L>]Ha|E[z[[b"|LQs"@GHA2Txr\hĝ!dr,o!8nwE4(ֳHi7S%2%=X<1@9;;`A$"TOPY@$>JqĶ[qoc`8ȧ?8 M'PI!Zɛu2IOŕP |gcAI۝ٳb#34| ⓀWE@o`vuZ(:,M?yqP.VoaB.;3qgڜyb?W.Doh4n5\GsRq 8OOn[ut]z#8L"OSKl3z; =FW0h_hTq֏m0)N0>,Q&,,.&vi bSL;UD, fջa/&Ia)}؃RmC_dz6N &hd6T5C~&+(je8,{_TH"Kx9grK7xxyu|87so4g֎zOO7:=rTs z$eM}Dz7~@Ȑ9-rL 44#{y024B*>uVu9|K8F݇/2r_;cjKŴeIH4S@F+c` Uze&jB]w/CH1SD{6,)}@{+{k=nתkMˉ-4ՅxK"j:?y٧>K),#Zc%7tM9ݤAF@ݐ1L u#Ut_+-MѾ`yd&[Lx&;; ̀}6d%{tlnsv!}N&@GsNI7h}Tm-蓮D6~[/% +.t^J?s'+5b~(08wi;/>M*dsIડI܁0 NvՆrdHiPYZJsޢ%yKLGHZfQs8uwD<y8 ?#$gQi}+=? Q히%Jh&%+:gb߽2h=l|ْA_gO>p9Fdv.n(bx3f>~0ɱaKlut$g؉]i9SuPMANbCY :3wnL\07 }NU.gID[Ǵ㔋AŰ'^9m!3N^=f4r (vʕ~g|Kkcbϸv_(+^BEt>#ݶ Herw%h3@"4S۴|zr!g T=+p%n`]vS0$wy|ۜ^' \+"^*_~H,\(ʷi19kNjCgYu#_z:^!L%pΫi/BʇɎ;[ɶ):,2]nil\^Irnpŭa6NޠXk&6U0&w+;zvE(w}{x;Q4k;U&mv!WAL*x9Uނ-Ww{V 3&VfV\l#KC]U{:%矊XoK1 OeTI ;#UD7_wnl99ޒ$ZzŞǰo߰or3n #EEdVSUqM7Qh[.9ŇQW53PDkx s2Nu]ҹu"[֫^)n=Rjr`WδwNa산M5;~B;9ܓ)"ԥ-0BA+)}/NtPɰ01/,Jӯʋyi%^HuYLw>qE^5<+z =|ΑL5 .H:J/^WB&gb@ sE1K(K{}r .\//P,=n: [ysGL9oj}Y8WB;6 j 2nۀPl/l#.e[{>]2{:?n<={6ppY~`r/W3D2 Gx @"ryDVr\4t8P@+:Nկ Q nO6=:39Koެm@n54alܾ&*Æ\"!.Btu>GNɅw/5g3؅}rRĵ#i[_@^>ȗCDz9DhϕtpxIor)֌="︅HmG ،=&8Ee'2Đ Om,!{X&f? B4hk4)aoQr/¢m&K(t&zZD[&y]մwnj!I5=3?7i:5o<X >s_h 3_4: XHN}xdPY@F 1"RFƮѭtiX~7h4(^^ bdBJf0<1fc-DʙOȫte Lfo*~@'=Of"'y1,=‘ w`,by±ѥ6>>gWER'[YbsyCc5 =ݕ 8qjP+daiHu_"?2>t "$z1m`"Jd _;yCmٷ D1775DΩo҉^7+' _әGH s_d2y=m cn4*jO Q!/%iU} ZϦX2Y͔^ W 6+TP#Es/{a6ZƔQ(UGc}JJGA%\d}:ɮ\:&NH:WkJf&[7@Am?zHC1A,6͉ЪO1 >6zV4bV!7Ƹ"cPXMRx.Lksȗrr,f~lt8dz<}.aa|l%TŴHJ 'X)aV 8 @(PGJ .F ƒ%+'h5p kD iQd;aRN4ܞ'@9ׯ;/ ڂ 9.D%~j21s޽*dc_ b H|~k'O!Qk0bFmB ϓpDamRL!rW0H rcd9=RS ]u"5b-^תL!;}C:CFH.t3]H:6/.!! B Is@XιzێN[t5! .;w㉧1Ӷ_Ds=~}t4oWc!`,vk5eo&>bQ[%K)xS"᭨g 6xlgXHGYR}p/ն#J( ҿ6.[B@=MlJ\.ϝherp5pEYqB+ו\wjQo^"K~*yFe)Y0&8/.{jG`}Zjm1KB`$& [Et'N%(PU[nVC3 l;>[P8}h-Tt@Jb"˿WA3 WQEU-u/{ ^4*[rs?|N댑l\h%QD?:![J"0(*%KF {|Ԙ:\=y^[ȟ C`hy,b\erkv2@@TItH>o[0eR*}uv41J+,i> ߑxsU%11*r@ ϛfR&,9Ym ,7_ uF,Ѥy^\NG?_ ku&{(#"U@;GI`J,\d]Ʒ9K@k~YvֿAݙz}IWy71:e{ݫSQ-aswf-V˨;jتLf' * 'x124)[>sP#Va׿t:S' *q 84ֹwWRЌ,jw PkZlIpHrbzOYmj2:Z =)gYlI72bn3^!ؿRV[wښq+$$,JV=D(uUH1%L&փwP4r/6'e}k$^'6񳛤I?3ӱPu-dڎ_Ĝ_*0҃BvO>J='z6AypHxq c49[Z Kr_%LC5Ty6NIbvܜ*H)x050MR c稰iW095/L:Jl&MD:LW%~i1b,N vq{}h.y#l³ALVUoQ%nhZs =~a3 GSˉ[!4/]I+N`E^1;Uj mdGm.&`` !rWBGTaSy斻m92} CάV:ˊcfX|,o_b-ˇ'-H|<8F[+!~`s-2fNsiA1SA --㞻ws4{,9%0X!QaҜSYFKĸd *; WݽoD*^\Œj i[8lSD*&rFsrQXIm1>&x ؕPj&s'…I42!1iFJp,B|oH/)Z>&n X~I.r ݯT='%w}6Eu=&cցPt PU(XˬoFGQpTLufS@o╹4R:9"9PR *qOE暭@ś좎(<}NVmA"(`FJfCZ# .oĨ:,nĪXX!^K)ݎʼ@ӆO~Z\ܿ˛褛A&sluwWӍzcw3+&n}%iȾJ-", `e %Ydw^Aavм{In.RJZ0 ăt61j׸ύBj-2aTn XrZwTBFM@HρL[%l)J՚?s'k-^un]#/Gv-1{9~o+{o4w=&n@3֨妱h>i|!5yBX{4<2Έ"jCL1U)jP‘*'5[|ŘTս{;^b,4IZKms-}EqeĊi3o>>0}+P߃0U"A0(~B>1 ҌXtGErhӪ&օՎ0N){e?HV}򃉺lѺ(ax &bikM?rkēҙZ6+x)c5HyK17%Fy(P")3ݺ*C,lyl祈m5|@Rω $N"Mx0bXҵd(jMhikNlp{ Pm\k]s~\M遨G]STw7 Dq+$Etf?oeUr-/jA't c?Lwm.sJ+2.勛,xX>>t6"ԦU+`=+24დBI9ƽС72ϖZ9k|#?syDF8U@*m.+^U{. .%*[Ƚ*EevE"e|x&RӗM%rcluyPkk|E=Lc R!rgZB?|hSH6j h;3ʉ>SZl #%.Ѐcw1ϡiVa>x=4ܶڷzy*t\?xu ׈Tu[JF|crJ 5^L#u)5}Yΐ-EX܆h,͵o;%{⁙֞E)QUj F &#^r{NH@3fٰB qL٧|ߎ؏z)8_IvH`o5GNrL1)nvL6bn!vjP_daŘ4}@qJhG0-eG+*w:b {]2,!i!ʍtH;sb8Ტ1'L7MϦ AaםGɿ!8ƌ+Sb,1̔cwE \oy,_<Z GПtIr% vT~:X3޲P贈VoikƤɝnv@'!Cudv`tz{[=Mo!^K 륾q2էUGd $yQV!$EP^FrJWT;nt}ԅ8eCQ/iQ%}4ŀ32 Oe ͪX.|KLϰR!ZA74Ien:bgZQ鸗5WRNNU73,4tex& m1lƌ p瑠$hה2#~xmxtoJ+6vf˭ ]TsX>h \ P!On~ăZla7 ܙ'?{sER7& Ʌ3lV(fj.J5,5ї!8PÀՁU 6#,y(@xx=MlX=}A[^}s_&e>yPDSxt4[麣48rgz#ܵ5FXLS rwV̜N"]BTrFrJe5,=ԩ܌ EX$H0dt݂aq&Jm&-H@+ /Yj̊uU2akI,e*aWQ^ÿGǁz-IV5Ô{qM??OF:˶#J 0Xj5:8`E@Q|"))=z-K _,Yyݤ0z9 ImWARU(M$Zpas5!l*vׅ{ r$4Q-&2n9oʅ")wutWy' [ c[r;.xmmN-b9(}¿JZ (A!` *M*ZHeVB̑3"ُN]Wn!}/}"`k_kIV 6'U?Fm<΄O>p)P1m^V$3kLucLE+j~j` oG% _"h zHsMEVAYWYE|t&iv׬rlINǷu5(WİE_e./&NoŤ,Qu)[Cǐ.bY %3SH H+sC; )b/OnlW3|JJTS2vUd1w= >~IQw#)+JCn-C'~;w%Ӡ'wb!gLNDz)p9";58$k_\OߩJ|9šUmvp$&6X~v҇u И R~ :v=.Đ#42K o%r3nWXօEj)fj30p;[= ]jPEO9=>N9j)4(Ë(Aݿ)SQB]Wg2b?; k@k4" X3CǬhi*F3\)wVΦ}@ ^&++.'u)lF-*RB$B]uV Xlia(p¹yNxJF)>4׫>XuzNAs7o)̹J,JʣM;"c(#ϏMiC; Hw3Zl2;aJb؂svL10MMsMK֠*J›Ű>ȧ~=L72LpcȞh??eOO3w{EU>2S"< סױT,Zӛ!L% ǡa~ldœ1A͕m0bI:aOWm ur'LnBVAϋ̺t3T/c `9L_]7tCaS8zTzZ{]- Zr胑\V%4VMǼn ')w Ͳ soR]E$"ْ"vo)CEw5G]l亁gK#%O5yHp]T hJnF+%~H? EtCs&m?"̄R[9UIB2U >PK4@&G%_Njubfsm󚴮&+')`r\v{4y Iof?mM䜃ov(&=U{7N\o"e!H M@ͤ =li##)`C1M4M8Q A\? fUb!7 a8t.2g+#fk{S;( W}$4lSSCCUJЇtB0q t; 4Uqn00 IRu©~bL܇@vΕKo)jHkč!A$ـf`C~k.No` *1n/ϒC)3Ch; v~mh"k?:8SX=8(mLhora]6 s2s;;Pՙ,dN {x&FBBɰY!`MY߶̜z1?[қ̲ȱTJޡD=wԊA.`CBRN$\uÜ]ή6=@\ {ddƶc_4Vsm(y^xk!SM詡vh|Ҍ$hvU|ػ$ I[)&zmVҲNh*ާT G_60?e=_!+@.wq'UjŴ Pf^)l<1*p׹485dBfz a򻦋h)!&-n=ga|jTP["gS0+iUQ#NE\w➪Xw|F{4Ðvu%9c!/j:iؾ-v|-;e4YWxޤ2K6(ă +| *tJXQx$SM0].ݲ̻FkÈ/Z\K)Z'1.ٯԎ))cΠ.{ O$_JQj |Ȋ* Xظgb o< ,vՂ0V4rNJ:-`b\'R˚kLiQ〫 6Ikyt} q\m2 dS Uoa"'#= $'DU qZseKkm21K)%/r^r}8Ƙci^jJL9t:ԣq$MՋa?brP% ܾP0#bvvfD@إ"yw'HC콧\;Y\VezZEMĈh0= 6}Ի8g7/?Fۯg24 VY(q]UM~-߿O4Dsq 8O}'*dWZ7c>MO#ub*o>H[nӽ KN_NjD6A璍=˱VKGaD(٭yɬ؉9,[Ҟa2S2A۵D?Ô5'؂ZSP靰yrfu}m(xKyDR5| HįbCIl4=QH*I[`ܸJQt Z1qqwl řz`$=9ҧt>rL(( t=Sd>7Wja!Bg.O38K)mnLT]1KqohS*ql eS<ōphbRjp?oIQYpj22PlFL4Z瑎l[Xt)R~equ;ڬzɞ_UI'UZ*+ aCNG2'9/Qކc<>;PD9A~ùyI/.77M<{`e_ 8_>쑰O^fDJ!JJېs~k@oD5a*@|xR8+EGkw0#vRF{ !'-<0'*h..Ks# }[* 'p/@̜{1nŠd,6'71q~Oiz5vOs*\8C Q⛌輡T(䥂v/ -Go/qkGyH\ei8;ug>T]NZcDm7͝%3T+-]jk"|.yQ=O V0cŋ%D#^=,َ,i뱸v<YYD(zի&> ܓJ*ܶWiG}LnF8 "z6,lU0&|lI׊iֳ Ygr:ɑ#+V7$=5LdAY= Hz0H 8V_ɩba џF&b)|3 O:t + l5nNmEmJdH.7?0"梲0vơnSzBaa|qX}.06Qoy*T-8i {t8MMh?}k0✈]}[iOWfh u4a47BHϸЩL4zMZ É6)ɿ1d|z=G|I-r/Fu3\l]y2RDUͥ6?/-+b(  #uT&#)1.d$" )\q,BDZ;YAIK |zG3 P׬wMGm3 10O&p;]7C_%/݄sóDx0hҌ0BJ]-F~֤:l|h#D[oiquԮSGԜ,:~3gT,jmvFB bx`>M < ne)#i[ܩD|( TXi|Da k3-d3y#X|JB3w^kx~;N- :91k0E;~v= +0,k=|Dq}W+EbD8BBI VZ@TYg >'u,!ЋɓW!6MRy}$ ).b$<%N]naPyp* Exkft%bSFwrЁw*~Y'̓3ik֒߷ 7+3tV tҔt;Wj\ )+8a}H'㑃1CqYs>>Y=idM2Xy'4Lff2 d-oc:0U(݇he-]F )[dV غ>T!<  ٞ_{~៼_Tg DLW2ێ<Řhk^gBy PJq/J=pEOl$R0@Ab^.b-caJ _Tt[?jk*F'</.MJ8 #=0470kUҪo"a!_ljlZ[|Ŝ{흳Q5٨Ü\ͦJwI{ik֒F٩H.*J} tjyZ}o5btk|3Èj+'ܒ54(s8P?1uBQF5*.I83Vc-lzZeTF6rHJ$M-BP{q sE ȜD/rzG Vo3rF,N::(hxl&ܻL׍hLGevYI9LHhұ&5 %ܼ^ʀ4 'rvQ+ɵwjouvm.P|3:~+ 'ք+DN}",R &ĤjcÐ]ĽRNh.pۇ/u,Ƹ/ʼn)&Ptई1%pP+_X6^6I\F5EPY[w< f#zD>րd֡¡-_)bD Y /w.:˜G]LX&!Bc6 ކ'shXosjhmxW9c范*x_|߼8F6HQ%Ik:-nƃJ%z;zLoZ!76~t._mf}@xfwQ뛃;K]71<5:| 5KXcdN%J:va)Ks̷S Dlv0|-gкkAwώ\5E)ȯVNB+!!8AYuO?Er7'cw;*8)C}c:7q]\S0b-&gn)h]{f(@Kh}*+h)%p0ORk=+ORQ?W3pռ~4yzdv4i>^syfn@kV١G~(=r*)@lx+oEt*|}m ut2C<{}]?["ZMpBDѱ {`y%qd^5Ad࣋Ҕ׉ģ{qOSEggGDR 'nz`o [d΂"9Me]ESuy*]@jMۼ$v1'!Q\Ɯ\%Sf.T<0]@ M OTUCUP_4F in3SobcּY 8%rH4dƯ}Zuzˬ4K ؁Riz̒iʹzz6U)jdپ  kSȼ!rZ1PUnMs%#]n=z*ʝ׀/zW>gW`i Av~ %w<荖Sv]bOuljE/ 5{*d\HMj6zX88!7Ȳ@K[KcEM3Hى?B_8yTah$_pXP:3iM~)/רIlnu@?#7 _;FRAA)QSV:gh-Jw F/M72 ԕ,@ܙI*\eC E27%VCox)4Na^{A~pWڌwTnҤw=XfQx} ejζ‹u3y;x:/\Htb\KpzYf8;^(IvW/ust]^OuwV&(}7Q'.0%k|E 5w^ߜΤGrC$ݕ{ېan@l1TpMe 8^Ϝ˭ +RH ѭ6XZAh򌋔Wcgy6OT`x#.c/F"i.d)nXydtQ~c c~#}=,6pEp\'52lјuE]g;.ˊ47;Iv2=62."9y=qi~=Q].̮X]Zp {;5z~%DnR Jt;i1_KW\VqU&x*{I?ANJQi#+Ǒ8E4{ƶ ]O.+-2YQuaAJujHD1HONj.M1m? |cʒD9YN1zqǛ5KVZK%63>YT\cɑ[mi.O^/ǐE }}ˆ|2oeyclo=A4y= /ڷ0T~_?YwY272m7=jf,=eh UDAfbPPC.e;>Whc̬i9B<-dťQY%9iOAM4tbPlAVD-ԩL~[3CeNpRW`v+s4 u^4#Zދ1iiV.^ېf_rf&:VʏOƯKJkbq(`+mɂbkeeFo zS ͹PD!.bClNgrN:8yԾf>3pO6Kͨ XJK2UyXK(Lo9giM ϋX^/xTf"Eo sVO U< Ϊsě]-rr'`*~tnI=n|-i~]+᷷EL򎀤HnzODAjy^UWۺ2jZ6䧚] |X2o=wwl vkʷŞ ނ3B(y*qbH]*wzPX]M{rFYs̆])Ge6ZhW̘kRI3m"we(0RF `-5V@NqSyIi8N4猴{UQY^pò=_8ɩbI9ޡ-?hemmM9+p}&ehGJ1U\В4v|!|.DBq{Qo"oֽj#/l> lcW _A c؉ f9&::wu3ZdhBtJC Mx[@sʮaƎF#NQ 7%<$SمWz}aqu!ҢN&$g{W3@ ϲOW\9"wob>bENeEAxHu>!f <r~iLP "$>PXB'߁_:`j 8p.zS_Ϟ̑.Pb)5HAQ3/Ƹ1=L{S2f|n`#/Ɖ=09]8?A;csS|yJrvX|va/i"jBx죣G:T>A>'wibu=u1'[|)gdO_pj/ڇq}M ȸ֩[7}=}^SFF*0~as!p#8>@uz/Vm|'ĹՖ01R`jI|M #P;S3n-?Z6.j hS})sJl)ɭ߭,brjg"vf5"uW 1e^#OWW.ro#vQׄP=v^ٕN{;hge^,}B.T}\R]S ד4&ELi: D,->դ0ZH;{!` *6H/cޜfe0p2!ƪ#mV $|0iE`bJwEzYJ(amJdmSg4|jCeըsx3* l 93HGY M Vt镾ֽJmK< (yv[uH8Q3Bś&8r}&MOG`,h k"K#5PLX !E4'%<oR:zȃ89N&AQ,*Bеnr4cS 8n/,ݬHtV .*L]g ?&8e5*%eͥad~PanV2 lfI%5h1^Aa)e~ԃZ(7wi>*ws3]+ 6袚J@{+1gY8HggdurN_4^:/HR U|#%S# ~~{@%idC_p'^ ` 4؊+crb̉}֫{.uGqܴ\Oe:%; +!a4pp+%- aQK͂+2̘&dMU3,ɳ_KCy QJTfX.;QpTxp} *|!X@gcoCTY#p34qY\\dJ(7>nK Vg"B L1 /s:=|SnR^*tze_[f.rR[)(X-gs(o@-c ugI3Kfem9 jjQH ufV9)iRA6F`Ĉ2|z>=w{/v4[J }<;-9A:Wʜ 6drgulNkl,\Z S غN: `{jE{BT%(giyr)Ǥ:|pZέ3&o'4RUPjb{횠'ԻJ+nn;&o1]:ŇR09Iq\7/3dfV䤶䡡I.*gt/7;fߺda~t^j9D3YR0v`@bJ-\ƝQP~CA$F0q؅nUPkg)/%zM3TA6,LmBSmG gcbeE?b5b@o!iy*# K?aȚmFi/ EܚW9? vW^^3%$,Qo&{_YJv9c+rk*Z\997ZeZ46tß 23{ubNW7000y@dg, n-F}c,ҕӻԭk(>wf^m*РBqWyxK`CO#`I|ز4f~n֧%iZGS-zx,}&#lI ^y+ds:Р+6zsb|SvUtaWB:D{"ͷ:  Xd8~XSqљO[)8;jIђXޓp{=ڪyڜ^H~3~:{&xQ**]8:ʟ\ wPZ=fPQw/OmR`"4x{HnhA`qS ɾ%ãB䁋va>KeHd`ozzdO_iK9cy䖘V,v} x"FGA;TԟssɲQejE'6 lF+V`*D0 QmfUfWpk+Md+Φ :4{zmWvGsۛȈm<@tA%"ϒg%n`xoF(z @Pc5{SnVʘZjeRR"xpHGޙ5qx&S:SBNo_G\SH2Ϥ4='jԅgGv`W_bj H>,› S('Wh 6I~UxZ, 7dxzkIt[!o5ӯaODu¿Z,&0zQGnWӨak˞M{&d?5.9dsW1(7eK%8dp5~(inC ^zWSNr!'KIt6vwpA&vk>E|4Dw7(Y Ѯn4kݽT?aˣ+ĕxw ΚKyIx1`^<BPR}23Mh89 lraEFqkRRpdH e e} z25zGA QMa770!,k-"LaFo'rܘ7uOMo(ߙxL_OrE*e9_s,9 be)}^*సVTܟL$|;5C*gCQeïs[\@e־hZ,ekIguui-uwʽA6:',~oIK]1-OMTZ Ifׁi2C@iasvMZǀcw|#N{;R72CpWPaOYA{^rZIxcjOˬkF`av~.$ brti of@B[iL; $!H=r/&7NaQBR9jf\kq)e/· zJ"MƾHGOC(`ry5ry>>=' :{Tsʏ>İ[.ճ]==# SQ& S_]Qg/I¯iMTL0ǧDL] ^'W׋҆"M`#BL_cŇ}6-󾈫H\Zcg) pM_/L5`-4GV:vZ 1Y>)gX)7;2/ Bf` ZIJظMQcV;!O)^R>+~PsEMZӽJ V},A$g8}gB?(EXٿ8j.Lc\үh6u/dUuqaD$YľZ5D_G|~+{P#3kIxEfa|lcJ9l󉂸 1oTwQ@I@\'kMR,5 +: -pǩ }4]aLK~ 4Hco"z(REϪ /$_Kn?Rk]0M*(/UpM#7G$ו;wRfG,p2l-R0sbO^m2O So7ȴ61N6Vb[4Q4̟nHq?ֆ ];?.e"s`q4͈L [0 ޑ zNHb>\\g@8=^usGNa^ r( Nc,¾ۢyX;W]Q x`]Q"ˏǓ8y׼֧F"=/Dm "1A> 88t.Gd!mY>=)-jmΥ!͗50_% Z` (UK?H+0k+BGFn~@R)a$Zt٬P*DiVӌcŜR:_>l'Т&ip |i34fZaF%`kʊG`w3&;BT0הc:.\UU0<]K^&R_GM y 1Tkta5Y9b0]3&נoiUJ;)M<'WY.jZffM~n@qC;N a JK2$GޮQm.C셆gdۣYgpwÎC}ʕ7U9¬tyV3&B+a`2KrۀՆZOFniNK ԌiC @=3@&K80Zo>IcdzW Ռq85h(}Oy9 b2K$óۛ`j3"ϲh[Y= hl &ƛ}4\CʛMrdjfMi„]੔J"ӯ:xk@_=2pY?);S|WtsGBFL9ǯ[G#NR p( -⑧)A&]6?iA:&ΌR \W#mɑ ̙`97=vIpc\^_1d~NOg–I0]>+}Oy }ɩdU;X4H}JȦfzKw;~b4Fo#X9Uq[7wwri&3A>GK;j%΋)W/r^yŊ Dܦ`qI#C Y6L_x9}aaGت;JlΫ_w3܏kuuia({ w GMƦTM-B5,J$|iV|Rw[ui(|%E@u2T7kIk滅ڀE;pBF."Y/>MLܕ1Kͧ%ܪ .GWɊRT<,OH^cp~tԙs7O5(,}%e;IT%\fg`8jV;'񠍍zPT}*-qUw괈yHI).OoȤ"1 9{m Rmӯk䫞8F5-šz#@(IJU^xV3Pwi}PRqcRKr4=hSPDpMAoeED=%gՈ:d{eCzօJ{>{LMN&Jؖr΂#%G$t P\d %5 | W Eyblˠ{{r֮߱ EZG^QVVSra:VΛ02ed}MF3:Ƽ?(%CHZ~J$aͷ9^|ߨ7OEc(WP# ;a3˘ c/ OE JrC_hqgX"F,ۣqÕH CmHK~ 40 @yd=KHz`CͫeQ:=@,+# lEim 0K܀CۛlfUt¶=#"~&z\nᆄj<Z< ;'# kݝhԎ*9}k Һ6NԔNLsi !mN91.O֞V2L\/צVRAac&/.ј8w}wsޖt.őr)A; -ZͶ?C/i[&گ̃uk4e2:t!կ`' F )OZZΏcKLbaOG[d;ɓh.XAfWTr9; [{.|\ dqhZe^鷀*`~ā(^~HK=! ޳WɋLc'ܛxx>{?Rۚe]%#_; Rq ͭtw[NWSW <~;BswMaC( iy zcxfU @W~Йb6/30ԮbbdtMXhDMH6ml^tC~׀%߉(`|wf[o9y`Ʌ˔b>KpY-g,Ҷ$:r;Ldc䦷3+u6!Itmz^wooHrR )JCBuaM2'L'nN7=lkjгL=@?v K<-x@3lƠu))<Ѵ-bӏ؜>9x4r\ |J=qi2UJ_VGjz5#W$/M~ڱxs?sf_r&Obs{6dp0%\g*a+}6ݫtTn:"CCO_C\8=(:qA/r{G}ޥQb^X,†{ӃtȈ^#5wr(0%3,"uKÇ*D+W,iPLݱ>Ut 1;m^eJD*j,ª%@Q{ӏX ˰gT{eڧqg8hQCȑ*ώ P>]r1 K[@dEGU,!{?;)ϣ8=BID?|ɤ+6̈\ 7JXf4U=u6L8Oi/MS>~b,qWytts<<ij{S7x>?vTOe$?d/nˏN8rHFg~eʐ/U)r6l/VM*jT*?auCcTT Q a?1?pPVG~D`nOHp>vk0šEۉ :J7DVfi] _s'r 03^z/ _CiVi 4b 0FQfN:{h6a0uX)E˪Gy&c6&BGn18l2 Ba+kǨĔ).EmIv/֞(#O5SZr)vBR2"H4?1R.Tp( A*g8v/Zy;|OՎ92e5[Nc27UpJ?k$]4y6њwqݫQߓ q֎x|`[[ &-NsςNXْ;k,F)Zb-.`A6.}Ė~}Ԅ7JzֆFqi ÿʟ l@͡f:I=v5 ?ZXYj$o`UqϊL{&bG$M^Bu8+Z뾫鄊Q8PC{xR %PF?sK$2c'*^mă2irk*{KdORB26P3ΧXP(UOrcs* ?eHHᅆ}l*gz07sUP1UJx0.!mi+B{D!X|V b_w;buͻT  %9fF<6҉ԉUx[#҉}2ΌuM962u1y~xx b{02&JjOMNu߃Dmȉ6Fqc]pڅx$&LNKxD/uJ1Vi3Cb?C&+MX]"#o;(4&!I ݪŽ,bZo;t_ :9A"q˗OݥCe͋87@ L 1hTs2ũZEp?hRJ>-rEMVңl xlޤxO m/v_pw/+pH"\]Ow31G%`q|,J 1a jlXRADUN>r1Nձ9xOgB ò/`mvQHOUk-I&^i8W?ͻ$W #b:)ѻT:csGoWOV`yOۣ> /70X֕jȕ#5+dsӹ>Là=E1\*TӨP(L%E{<"Tuv=i &2cӖ:gQC~Q~WΌmS3"Ũ ƪg&†&mk٘Үo#IM+ax7zf8S>fMig2tӐF(*L\yӈ*nE%) ei ~nQM㼚5f #spV~˂ P/2paP|9H1&=߇_J7 ;z=i<=X{<PʱB7iLtQ4K;it= FwJA$i#E5EcUKv گ׾R=[>1QR rC>SΌ ̅Û HdtZr_Ak,_7($~9V 1 Erq2 zy1베&'A;))g<^~>W$b1ۛ`Ϊ]kȮ $Nh dƆOd si$`(I{="DyԆzKC'e#+[ /.@'2޿1l8^\ םNG?ߩ )]~I. %飔5٘)שmO;LM3AnFzKc,U9Zv=愀(AI/ VN2"ы]=%h(Ƙ9wT%/T;y-mbݷ}H459E2KPc>#zNsdROԞ<29H~iPyyX䓢#Kv̊&EUn4}DG~E}k6 eo<}-v`kˬFK5*!7P#~cc~T`feXq=75za'fM%"n$lF@P)"T]:Hy'2US#Y)$pTYw]\7VlQSZG*d*tT뜍ԣ@{Bg&Eq:gw Hy%,0q/e%Jw.X2y-46"9D雫}UѰhk@ =7`AY6# RMi%qL E=WU58A) [%Ta4B}N~tS(!;fA+\{Pη,Cd!b%w8bM~Rx1e-MoTKi9(0kGZvgb͢l?ǎV'd :Y$wyG| 5v$oQ܆=5{gs #A (.Xe0?!&p6i0JF)ΥЧߺZA‚^00rMd'b&d7 UC"[u_ ]$`1 POnh#Nw;nFmrJ"'`S'tPFڣɡ-Ļ8R 8dxiM@[\P}U}ۏ^$Q)W?T}cf59y;$$XGEACl$(mn ĴGg(J08Ѻ[䮸swA3>n}콯fA2N]JBeT/9ݙG@K۽V.1K7C5 CaCKTxI&HN頲վ)N$r)wY ::|_qa6Fcߦ?YgtK{5dfKOrOsEx&t#oN%X2}/ӳcaU3:(0(Ly),V %ɾI7v_$gu RaYoӑæq7;诂Xb wPBGrק7|hrANohĮN 1 P['a6%^(ܢ1N wTub5p O?)Ԧ,W\ D7>jӲo}YՍ0wՊ]Znn7I@0慤5 ߮Z%,۫CJLҕu{;ͮZѺ:qAnlɎζ|ވ\f-lv!Pf^/(E!(#(8UQjS-$PtJ@iM]]{{rX͋+vZ°ӒT&9WH쭛Gj> }|[3 ҾK4KφԞT!)D_)W}S i< Iowwsex18rZx ͉)ˉ;P(}Eiי\Auvt_4k7C*+T@2UC2Q l|vvW(=%<`I2,qpR=6m[k$|V첉s\ӹ-sisT5ԑ$ ^UYzSj%{~?"O+Pmdtdj1<4⠿.A~ұС0/"#N ylݭE;}rN5W7AMi;!wsoKdRgHȻ&nįݼ$5AZו%xYukP7'57F1dh |#߀)ְB"B6au"Pyci mq[`FںیGZY:DJ"XIJrS< "T}2,}ft\hXL y.;Lƪ#xnՍw@2_/OH;#CP5#dgHFv 5'6i-YFFBl-eeAT.V<纫_rRElnenRf4L21`nΩ\ST8\P{C}\Uk6+m!Ž\ϸͳ)\P`H Q4綼r]?`xEc X|W{d>5eGo• "v_?%GÑvP/KOWJn֍ƞGׄOp[]fL?{6Gg&''> a](kZh>2ul#7F݁,h!!AeRu5Mzrz}r9Z{ymyҌ^q$H8{'&iqPr;A{֑܌؎:ob^9e@֡98ce"Is'&q0n ?u@z"v0EAK&2΄Uc@֍W;V'? ~WgiUhqNLQr*!R~>inpZp"8::y_ͣ즹oCo˄1.vU DtہAf}@OhPUrR"2!\Y`Pٳ;B7rbC.v@ÕjQrk#8 )YL0qb_6,\1N;Ŵ1Zr;n!AT>h19#/esZƴ"K/ t,6Bb Agqʪ0_ ܉KRL@E :JO$jǿ:8]u`II7RA.̣h";$FVsYɋ%v 9ڀm bbtQ.1` 6_~pvL[}Uh4%"$UM ~|xS<}!N*SZEqK id72"68#gKmt`2s>fo]^)aߞ}ݟ y e%/fӱc"w\,Yur&|5"urb-6r㤈 HFis'WX9Qv qyqE?/JvӖ$6+wsecA`U(;+ߕl2ޟ*P>,*.Ozgsx&YX)f[ai^ CTw7rJޯ~wD҇;$&ڊQ! ptQ?@V?12]cul` J&Iiv*J? EX"ra zxbU GLphG7~~Te򏛗F#zmvvoFkD7Tu6|`t}W§!M 8q5Mxw FQ;K~&-<@Ys |&.AoW,ڷ6ĄYjB\骺\t4JXb:WэK(-&j^޻Qݭ |yj=i"fَwT+VҌz-}%P;jRZ:*#y} !^kI?04hRN9@=703G\vJyl0?a8$U 1z^ⷶ`Ns۪6W~UL(YtHb2] =vj'[- 4*`UT{ffg~09SrD ;lٱx3Љ /p2Wy# . q?烐,s.O)41+>!xxACc{&ao7!(0v=OV DQ7a:e*aY~>v<- EHc{Z;| A [?R"cʧ7i Ua^4M{VKURQTQ |abqF_r@pcYNu`F  %eڊ"q.Jr,Q: Z 8$:?ZX`{o^]bcq׊/+a髑lPp L67_5N[l hnr[,߲8ܠCIMD"bCDOPZ|VSsm86)L #p zEQB)Bޅ'='~ge6  :Nu,eA(IMe<ڋ_ b{9XެXHq: "+ t۬nazʗp:BǹQ}++:>.Z'zېu2X=F+$415̶ar| SĜPx1}v(dȧ@kc(:n6_5}0^(ve/OX`;PjۚmXה#Fˡx_Tݾb\oỈdif) ]$ZLK8唧[v_u=d4O,F=69cZߏ*t犔g/Æ4ʇG)f[RɈ/bG  ^=7ΰZ6]i݂HaeS}#^_;nQQnPQ2bBT3{Tpb[$[M]f> tb'0ZY21%Ʉ- n =Drpe.? ȡzݎP%z*->.T*r² sF xd([bOgf{0%Y>ѩM"-;̦!qA=ߖ$d)3H~>o bcbDڪEA1|з =*3B/p}%#Ko"sZ#9;> 'JN,W᪉,f9t,܈_S5{3K}`wS D!t.,r+r5ԯ57vA1A:ϥ sv_ev, z8}(~+($caqyL8*.8P.6:f,s1nO;Q;©o 1$-@*i(<ˈc!8R.ĭf n sEopɽ{ʟ׊?mRւ ϕ\Ja\BG(FOxz !gQ*x68×jUANڜѹZ!i׀ kw3#w6qug6!P 4@ChZKN:.t`rgpLXBMI lFAFٮO6OvW/c/6z+c?A?Tߋ<(Qñ) nt oxͮq}[jB:HL[&S VqH(!ݮz ЈU8ZԸ-6>:8?-@LMδȃ%4u40+ȗgj'ᵫ (@I7gt֢pO%重fU9aja7Nf W*MѮ NI:"ʪy%WN|(uDl:<ޔߩ^XHO$iXi^9 ӂQ_6q6ܪOȃ0 oEo3^ aZl"$ 9Nl!-z#=67ÏX y çR>2zh~[Q4áhcSUlIŠ0e55wTk />嫾([}㯃oh"| 9[Tb|w,\p.<_Z6g)4_+N[G<#ΘNx4kQrd7/DYY2z fI,p(2"j;-c$gzGGe&wQB+T :F"5Y~Y?J\5N^jTG8 fobi,{[&mڜ;2Ede)E&è?3-d28MWJٛ%RPKQ%mi,0+Ex bݑp)[i.FN0i.bSca< U8n;_Ez nǴoC|]Q+0.I)θ,͌6_65m2tݮvU3dӣ!byCЖ4XUl`x"!E iD ~Z9)Pe9ϣwñ\|xh?/u&W!P,f; I#ћԩWRPyyI&NՇԉM*)KI">S-%q:~J:6?7MY&=V'_dzkciH`E.S@QW*qM볩S|JͭXqr=9dM{dJ֤Ҕb|t!٠o.w$Ew$TbWTinyw:C{-d o;`ߔt{g"AEp3qb5$?ͺ>@UTH a\IM+`oJRl߸&.ixǍlk+={˱+<[*:4T ' yòK|;H - ](~[QvHQ qSB4 U1.E+]lV$X̓o՞ qofҎn#$[>#Dڊc_Ns,~@ =v>K[i#`/|䳖|)c!v96hH+,F?M;񏈄}`}+߸5NHN#AޒaqEܰZnD6Gb09;!˔-7m=/ .-CW(ц!:;>8 Vx  K\גb)Εz;cی}pBe pD.Ð'!m+rbtGF^"k3Jf(r\@17 |iz ޕN;}w+dA]޼Wuh9k̭U|K;,mJSf,S; ;ߟg0ڳd# k#oځcbX+~Za]_t"C.41-|?rQ%,Ȝ{ }CTQ>huIH U'9Kpnc ePN֯Sz_ѱ JeQ75Ts>\4(!Fhj85Or$tq2rjYu` +qlNvݗz Uxškë| 8F.q|)d%o<Qy!Z¤=''Ihj>Z 9;-:Gf# 5ME-~IȂ̭.YӍP?KG\a1Ӌot9*J7trn1hʠ˛ydbU *?>ۍ(JՇ ]> K)iv4T*371 ?;M)"/!nh|/ E rvDWdz3'DldɘGAiIOm\١x}5aVIqYE`΄J~zXDDJt  Nb@iDI\~şX,ǒ6I htk8/GEb$c#*6NB3nTeT2 )&+s>߷Tv%&Ãe3@7kݖE}+G).Zr5)k ˥qX¦sjc|9hObiؚ_Ő3,ݶjn5d}| GWRO%QMUY2G֪E!5agYcvIJa0B¦bX!o36~[CR;9 ޢePFv>1f 0fuCWTr gCh@+)itC#wXnnv -5e:]&[Z3II<>>k)Atk,W>RG5fRm#d ߲ndUI<@$]TKPNLa@L [!w@7PفΈnzOi$ 3~e$`ud[5=+u{nUo%a,HV0:&I)`HS#!ڠс(d4h9n{p\ ; YM0nx7\[7n/q?gBO>9(dm*K{ =턪'3\ KⴕcVTn6HCNIWz@m? kA#PtMv%lf6~ܢJX١#ҴxGZp}rzkWҮ6; ?U\j_r|)E~k.as!T4q72% ڛ6$7 #y%BrC /YjV/P0B-Q`SU}Ǭ;h_@.V d0"t_()JQ+ycڥhrq#؇HrV6cC+# UKHaY4YG%r{:cFň O`gfAFL eH8Xy:磢48o } ַk81IdjNZ.UanQQj1 2GBcOAwۇbPt47 1/`Aˇ9's{6}cmn*&FOpni2 w`  x`<.oZrOB+]O4avnO1J)ցIߔrGf/ ] -@v /CD_~bt깓;0M|V2%切#gvGClpd /BQ< zS&wo{̵۠Vs37|.:q^gԖ]-7HDڽ䅷b:]lVb̤ a^%oX>V}Do2ؙ=m\eրAiS{DE 'z8T.b=)S$y/GeϨ;4ceMOZUXyCRr %}DW?jDBnj> ĵS uy HPN'DpjY7;0Y u.1<[(+X%!CDVW6wDV|iH^.q#Q]\Y$r&.-cuUCR<_R7\L%CQBSBq%7ckx&,ޫбxy ϟü>=-)-YutnjqR),|Mi%+`ۋ虣(iEy?qG/~ 22 zб\1YZaQ>D sJDdŬ`>!qA;^AT ף8xs;[V,nR 0pӪDTKz612idC`Y@jR]oQ{Zbs1>Y< s$ CR/sjN81b$A堒k UcL85ѬxL#ij ,Oaq 4fX|ۇDBze.8'Cn +_hr! gX3E7v}DiE357aq2)`4 6zd!aELMV\Շ oāfi%WȪkCqCGkQyc.','y 1Z)y~7[Uq9l 70qkux|}wK8fGQ(ӰLAWxpE3 "RUQH83n (:,tvUk鈆MLr~ cӶao+&Sw'HSiϵɺ%s䖪\yVL6pkR+Iwed\03 ¯Ui6'l*:nOCQ#abyg٧<'ƈ;nuĮ 3@?XW"Zay+9hct~Ͳ~_q-ނC0by9;vhKOncmCkKx Im>Uz@oaLbI z! 5|%zcnb9IV)tu|M=>̹q2-C r{ޓu9sW7d7)^5#ʑQ> [^GDAIz.:֞h9RҠOV=wfӮi-^ )m0'Jf2US7|"n#ty2ohEG߯M/C\qd_uMIl?k[o#=v5xaZI#&|Fvj) :᎔*;n+Lxv@ Fh=$Ӊ;aE)nptG opsߡu8nO^dO wc6h–bwnH{tGϟk?L7UsZFBfMrUwِX@Z}Sjb`l2tY=!IYz#LvZǧFhMCzVS1a9Вz%Z-ȋKl?T + n/H=0!|"\&*x5_P bDPG~+\4\NT`ʒ\˂V+| yَV[B/2XIRͤ2,>b4*ߴoHq>4UVr &AQ}G̼ ʶ}ɥ_?+I6Vӷ 8p*J#Z5``}h@ 4(^-PvٚF}M+Z(/mfcMs -/;}B-Q_>b`i1 걻&/ւ8TSw&J'h>1[ߣ!Ebk:1H $k-mbH- .G@clZ*sn~u C›e.q|L."OL< p- wS ]2ٲ:Ű~}}H<#:4~P"4fP:1*Hs}'oJA E B xp%t\#E V՝9%fYΰCh1QR)[*Vf9+bb$%v)S[K8z!k s0 g6KǓ/~"1yYðI/< |m<ʮz"#Ip$}OW\0V;hUmJqk o1ٮg:]N֒L蹉Zk뿛zW..2)?KKvcyNM( *@ rӃՆ:A}o~42pV,^(]Aʼ z<А2u X.A;:)eu UX^EE׊D|sc$ssIJl\>XrdnM#Qm-PHP't'+?KJmWĵ Pvej7%{ӋPSYbV@G0;,5I"E{cz^Z+s-:Шݎg L,?TNVMfj1$YoVmH|[8I =xK23!%9^yDqس cOݿD{) a\n[[7g90еŎMw܍&C#⩫@^evU_ei< Xb 1x_0['u/[~NulFLrGArpu`+#UeTDe tg=Δ~tWN f8YʗiYj@岊_(%)BWlWǗѺNt'HAp i .=7wUiA$^5÷FFe]`V:| 0)W&[}T[UrY FSmi544N+y|U%]?2Ӽ,Obb GƯ7,],9Q,{0kCz\URɬ0 bݺ ;}hg Xb٨GYQ*(h˒|Eh!4'7- )UBGI?}FlюsshIٳ2 k:ǎjաcAICqG*<@L5u<=)5ˈ[ HJTjT,G{Jљt?U#whSa==a [˪|JN4 E`=<{6{˂P8A]uxA#Ӳ2!&jqIv- #xB? "KɌo2atμM,q rVRc=?S,I'"-@Dj1=f4[ŕ1^ M\kd/)sEJAPa; )2ihKS1gޙr$ d+,)y]Ďj > L6 J25.o-kX!.uQZ$T$.#zVo"JONUfz,&*wIŽ.UTA#l8?ѵ xWC]y[?jt^*1Cm s!H ҤO:fcdș1VNHm.8I] `嚛ĝ3ts_UZڧQ*ͮ&HD6H|7Xo j%SPkC)~mhUQ#vQhS9Ƴ:qHi; 2;E/j HII^0I?X㴟Z66(:"&50wSoP8-.:"~d'l(c1OL.Nx85|/ZsŭH{ՙ& QgI{@:t`NTqn[e) @cֱ_UfBN2ჹп;9dpT| +PwJAh] @q䷈fh-X,A+Y:|8PA(ܩSI8 ![a9ƹʪ/us5%k&p03aiVUf̊Y^{E㺅>޲ʃtL~XCmhM.|Neo4X euDU+O@ls6>O'2m[7s-̞Jdj+C }G^~fW?!QLQ拌QOm0neW2&QP5pX1m/DM_Xgi֌U憄NmGPSEyZW rZuS*F3m]7 "|dR :/`-3V98잚Z\#-P VYOۇ@U'7 vX+e%(9PqA2qŊBBv#W&~?b9Qq#6񆽫Y8}Jr;pS<ŗ /yvq?{O00~^ޞSqrz!=xOIu5 k3sܯny#Ei6JkKC!ؗGDg_)j4}:gX69Xeژr&8_--F^%7=rq-ݐ+fu ꌵ*5%@TZ̳H/ ~BP0EG(ąJ~I[7+?GO[Qۥ ^sArӠ g]DK0  ($P!_DJHe ZpAA _xk7"Ű++ùO 'BX雺^wDsGETMf*5:8K*D>ij3 XQ U`deD6*ٸ5S 7u#j %H~?Fu؅d nqiuU BXO|J<7PS0`M6P^3/'H~'pṷ3oE NU9Uy#.UhLWH3GY+[n"h RH{٠KʑEzP?|j޼ U}L!/Ƣ4<cF +˖E%o19Pʝ o\S A|Q)l^tK$kw92}[h4 *n؋cBPEcU۟p'6@d  CƬ T4F bHjE'H1%0Rgq<=1j9!n[/״2o;r s:[D4?V0¨ T%ﭡEն*8Kޕd0߯6联i[f̖Flal@^xGʵxo%n=ğo3j΂&p=I/hyM&YZh\o8VRY @ k-^yF^f](nzb+;9hg$ň3uҽ󬰳uZ7s/@]/S=QGIxT o[\A$?śc転BYʻޘR/ p[u ~T^(># BYSuR@D(JNw"D) c ~R]UgVd+DʗNIpA?+XDWd ˹DcHm23Gp' ${vm6Ŋz!TgAY;4j4k2Au:!x/w-xV/ j8X# ]FP2M;$ZP10}h_g r"qJ'dXSS E# %ˏVDn5=[% %C#ysUy49 <)\y˲PL˿g:}K ƹB=utViNɟd P!ұkBT.YJK%k#UE0d"ߘBKa.w !͎bG 8/Dm [.3AK F@Ƶ-O+9q zbHvAI=Y I\^!N0 jSТ#*҉;iE<:"5ld%{t75/spYS_Ǟg+D-fO[`5ZagFlD"STb-x&]Ya+wE55_1MPb9R@ÅHpDbrh" k cXʐ۸X=x'~Z'/$FOA%e*=}e/`r9dj!+08,Y ECY^ ׺}UxB<2?a;2=qHlwJ8ŪoO|`X&C1fj&0{Q/[j05!*:]>zw~f7F6$g<'@@ Rm\6&Jb (CU)ˏ*1x@Sy^Y~+uGMP<۝C^"| n K>^XA 4SKEH+"n![nL}zD>F=M:Dm)wfXf_0^b_i,\%):"3{xcELEMdaA=1坳fXNњxrD"[|$g[` ¤ebR x3{7pRCVI,iC$XWtxsTVb3)ho\HOr-;gB;7BGxaLsF:^Vܲ~h>U[Q!ۺۊV4`zo7˜\.#4ONt**9JH9*N~m'G0Ph2RpK^ˆ"ɞ(Uu&LAVn^b' kkr +{!Ñ, B.s`[Md'+ŤR-!K2h>P9~r=8!E^k֝o\ N48[ W q|P$umAS0t%aX+#ϕV `L69*"A $)ż Eױkgp|U26:{Q3Bb7`~J@'N-.$s=bu9tW:+ o<:yRi`)LC63+I2˽W$>1ܻMɻgN RYyZ,QJIL>@34 nWXhwfDj}D/6z)orgGUѣ6'eqTٸ?_ڟ%Y>VyL:QJ˓CcvCEW5АpE]mM=Ej{]fB3ghh> jizwI=}hڤ\lln^,]'$hTCZx[2ԓY {!1E`T`7J/0bv$ܢMeZNZ+;yȤ\e~\u5*E}L|>ՐWN f<o/tٿE*ނ5xhhkܩdƐwK,|HHMe9(X`ꧫkszTA.O8OK- Cɼ9d!]ԛOO+:}30Ԃze>iZUݡ%`|8XtXm#֗RQDIv }Ϫ$E(c* 1NKX821`.)]2)='z~f '"³C8D~q"UۿYd>|fNw)tӇE$P(S%Փ uCeZ֣-%!U%.ɔ[Eŷ 3.VuH|1&ȰDulLӷWW95GbQA>OVS6GWJ/Q|ޱkW/0.rseؠVŰ{֊qΦӜ ](ĻîlwR%WB <@3ڷp:u/ݾO cRf$}~1Zzߩ%5رiyU3\3K[{n8L^ʻVGewbdOj\NjR3@qЛAEbz Ab ||DD6YEDYpEy0Mw\bGic2Եƿ1!f рj}؂+nO&TKAzPlRJR4f xXb ssQHZPy#8GQ&XDVsn({hMQQ95QѼExN`؊ my癐m ֊QqBP¹()EAƯ9l7oZȥ/6, prMZ0~z]Ef)*RʿL{l:E5bG a[8% %Y0U}PJPL}.PEu>)_oeYS[#D̕U8hSV*#..duH76 .naI*I+%Ko n{(yil,. P_gղT7mQ22vMz6qx;*e1ؼ."vT_y7:>Ғ$LɯR3Wghfxx8$UM|=TB[P%(vÛ;^իr;݊U0si;gd 0yGEdKOcV' ?}j-=%\a^޶j[]]،du?O0P t6/ɉ/;&,l/%eR[':`;EilexMk TnfCņ)v@Hٲg~S)s߈$7%۶*."vb/=T&ה_zv)\XC/*}Lዩڸ @2ƠF3;_:]i]Bп< /+C"B{!^mٲf,rשVzE!eT!VIV}p4ӶX}ft*ّ;4?ޕ-*@h›{LdC4_:9 % ,AsYN3Rs[ɃK ^uq_W *xzG)ݝDX)t{`,ր'[-?o h3u9G3=vxHc}b'd8۰~z;85z%Mn*{މi&k{9x%c|i D /d޹[ G@57Q$C4}M4 @܀0c\@xmctU,Zx ||f.xWڄ J @`MAX[v'd 1P(>"&F#nl鞔(J6mFJqbt lВL} ʥ+˜7%|958)pSHlO{ O}NL+'Ƶji=[Mm>11Bg,j)Ќ?~{i0=}Պ Pa) +R6,-⭒@Ml+x0i̦2(NŃ;$MRbm?:h1>*;%|0|R=y/wB(5Gy 0kcE IZu-'2]t*9[]|ԘjФX~׮LM3`] } KE?~+У -D2` sFkz"mhd t~ɞSVc6nRٵKSʤGK ԛ;:-o_KF|k9d0F԰B:0qW>jKF}C&n[lRrP#+ LrHwB2beyQETq4AE.7 \ſfNk+=V_>U4naSF|N¬j2WiA{1 Bï=F7 ੐dAu2Rؐd $Ϻ3_r:P`XhͭEIiSH/1lrc?[@rJ_W sTd>u0èt`Xy6o *yP^w*~%Ƈw + /zաmG4W 8 \9ÀInw[,h?g1x"ii;o;+@ }H^bB[$]!^ [3?z;_SMk(iѶC.V8hx J [E"K-CΠjcFj܈ г)q,H)*4[H>4[Y.V+c>_A58JҦ/9SDyQfpI]يF5Ds]n?dLqhdIP22BqCKX؁A{Z>Cif_XZIh΃(B"UaxUY#:6 dGH4hA`Bc`mQwIf'ndJ'FCO/cUj HZs^Ml 0,Gl@~"O:a`'qu:Gx1PT[8I XeBcuKfigp#QЬLn1 =d#,*<+y陸qmЏKKۉODqF^fD] j7EQr`IaL]:*7.dҏH/ eLsm@k({VUMb8%.l.yR6 *Y[ş6R^/G'rП^uV\No/35/oDԡCɄHR4TIEF Ъ=M&o;\Wab #14p;ХiB0uG}KE]I7W~L4j9o۵ixER~|GH mQ`IZoy{v!@ 3"[Pabĺ`Tϗxl\ܹK"SBjVh ?.t?.GfD}nyq=o8_Wl_V32[ă602t׫˔exO9}mYcN#(w_fc]INHq#.,D~OGd.`r3|7C7fA,L#w樠8PŞjK3Q ]@k4~uyc:Vs%b8Qm.I{'^8O|Ơ ߤa6Gfs_#yj)3&qY3RowyR8# o!vTSAn}},il dWlN]ٺ9 !_O(uV:j%WMOӂ<~}ktp{ExUr=;5@>fpWJrox1_Z<]7#cTȋBV ݺrl*}Rvkf~6" c#^o@z RK-VK") NTT=QE:7М>#_yS1:ƔuvB#qż1$F:yJu( ",J4{KaqK!v`BA\AQTn튦MD`̆92OMrӱ{iˉ5xVRjP7#z}]96UGQĵ_*0*-G͛MIצd巹B-vjs>'Rׯ J"܉=uݐ_zu) 21bRD 9`l!-g &/c'-uɍ"ߧ lW>% ;p8Ohh+5SlbsfοM "&㽞nSg/'X!izM7(|vAX2}<#n1kCU9`2`%dՋvUKXoKˬQ')NkgԒdLmշ:.UxgB?`-k9M_DuDO ALy*I{i+U8ѓT_5}w" &pU|&f|ɽmX2d^&e(OrE~?])༱gt\喂},yʱ:_fn`lhtO w;h o<5Z^"\Ԣ| 4"f8FḞeȎ-tou";},:ѽ&N?\-ɛ8_" 8/2ppCeF*(k'D豅ѭ?5 R? 'H\4ALnj(v.p2\i[J~ ]4k=)/6žLwV- QFyLxWmݑ$' zK{ykwp~[ ;œdh}8d\^Jm.SĊޮL(/[/;0i<Zأ;CZ$8}LkO]|~_2.9^'5Zֹ37@4 !T3r3 Lx+*Zhb+ޱ@NlM]"gJfP-l5JcȵSK\dgR汌}=WZA/xđJ^ENW!Fr^*/\ɧ*]{B᳍Ր9.: cE;-"#HNwH)K-g-Pw6?o胖?dWфo$u RzbS5[E׋V]\Ve+.)8Q@4!N;R9(nV(1I:t=pF}̢Ws1Q=:48hMߪFGzmaR$e=uQ8?%R =8{,ee#@ULDocIpy01ݝck9,$gC Qvd2@oeS^&H]P8'v KƁa#|1)cx+ѮNp*vi!7,췙 Qz# $j:`R*aq~1&×:Tͺ8 !N U]vP¯3=&E:X~̹͂Όګ:AЊad^k< $W pdTn712"!~c_PW.wy61MB BBeǽIװC_-q~*˘%勵{ֻbxی#2R\KY'R v#Nȷ ObEBJv&L1 a`jcخPd a/2eeTl 2?}K7\\)AR#q`s.#_tp]&8Ll.BrlJ TTǹW+ZH|Yno˳a޸7qE/ %Ŕ$'-Q=OYLӓ`D-UzIWK`ndvlG Q%B t> % _f.}!j.6xDk!mv4]*YVze5,;˓0N/eG{ \\ZQn(\5iXXҦ#2cuzVn}k굎{5]\ aο?+B fNZ8/v{j1~T>CᰡϢ+E:֔yKނz\Zp=8ǫ.O-T 84 1@g,?ds6w]lnFI9γ21$4IO`M{I;Jv CY&gd|Pbqx\e+ٯ~k#X9S5FqyD:ˍTBd0.]S=Bfb Vk֊jMe?,]b0߸#Zŷ;-}9KJz7C`(ԸEq?@+ @C8*ˮj4 Va'>(n"2-`)=4:Z'HUa+|O-4U㏃l퉖tpYl}MBVŘeTV liۓcQhY*=GyAil A!n' F}PoYe5D:kZ"cRVy C~.IPyG5>V)kwz[%r5tjT-30^^<,}_Lsuѡ9 p.u۩ bRt*o57yKJQy!Ⴧow+g, *(Q߳ك<2Yo}&SaR?@$I #GLQ<1VR?櫦%SLu9n: R.7mlz5~o Oiw15lhn*p #F,tTQIy˰G=urj $fvF3K3cqj1j-TF LJJ;^9eR3yVhJX;|paPkgm#_u5k8Rɋ*,tϙd漍VmIHJi=Zܝ9c*{aο){iҲB`mn-qhFK&2p&Ik|rq'hPM&RIIgGeODŒbSu%J]'@JE ,S9MDM*3W9}>K[P&g8#I>jVԌxd=> Ut9v1 SI>\)nB2) X07]`jɔbP+n:oato2䖕"ĺNۀsuӡ@ xM(nUvKc\LY~qgT0DQUo?U$Q 1@2 LTg#2T1GȨD!Wo Va "_(to\%Ӻn?G,dΎ-#ƛkd'."p]V$]aNӣcܰVD b LQ v}$ū$>6Di(XB}}f@U5XgKƳˀɈti#JZ]bURo/V~ĨWG,]ay=@rn'tܘ2 $ϡ&dOk^E4/ΐꞕ 6 [)ZoL.ۊ ml\S 2[xvp<ʦJ3N9kKNgWVCl-aF#^ N %PN5[RI:cEe)ӭ`I6^l6E^@= j8 M'e|fn/RO,[vZ*cxn]3I˧u?}[[tf< 3犰tojd8=UH9VI5=j^~6p'C( eG ,ð]Q kz] 1f/joHz^8A76Jb!jJuzvhvņ]>!GJ ~5bmn ~|IUd/_T3So[ *Yȯ! n?W>3AoO %ռR%I0PQG(;[?uV- wb`:8 K<:Bv EQH@I*u *ʣTu7P$Z)~{d>U3ЌI駛 \.`mϜ:[@|Sh1yz-U$`UJ{qlHmWo m\PᖲA Z7I1fc)6_)r_VR^ ޿E46 A`y$"hh?bXqv y c -Ut!ϧ#"1m?Ko "xmZk\F/ߵbA6g?/}8]4M >: vco ^j|| ]jl2rS݉2- G6#d4:'~̏CȤ6/m{ .S5 AMezX؋vi&=Vw44U8Hh=.')l3EKϣZ0/NVKH2uk~"hPtrc)r_eU<0Z)ADHt"CD/f}@H&.7U%cN3\cqz(jSd'Y#lI7ZcvQөD>vyf35O z&$UQ=`}}Ktx=B D~4WBJ1A ݅><C;ձ*G -wB14WHw@T5F>?NLT5r))( ,,YmBuaG ֎F长̐%ݗ؛ᒬAGf(XS$#py%Цзm=[h]:LoGϓA6{KXfX  K[PHpx:L^bVE襪m!ڿ"š&}^T;B54FΙkf3Ȱq皺'qC 5Kuܪس9Ӛ"+>E-zM" C [ur/}!{ymW}$dJ-'>/)4oz7~o꾨0V>g̼:E̫R8gQ BҞ}$ϽipWL< ԫHd:D^<ģ oJNAOk P_Gν:U28 U3Z \rE"W_aƥqhMʤ9}n`uˀx0[oA=9==MOOzdn E @ӗR.щfo\Zj!% TFQ&`3:枆 !bH$x-(lPeNZ ·!yӋ-dDG8 ]fwCzx(9[k<ѕǡ"-kA@Fn^E@x,,AYh\j྿ eQqؠUcqN g vch"&߁2W),y8 `ue}a^J VߪDYً^ȸ&qtPS'N\VlX {jC"3[NL !N!0Pxʞa%8pQ:zAT<24AN:љ* jy:t>ջ'خy2/.8˧0y~u Gɱ aRyzR?Hs!: fuՉGή,VeDZ.dSB[̴$31 Qӗ9{dLVʒt~YO'gonWH(Z6/ ?/~Lj>dXGVcT6'Ffׂ!|B>8pU~!ϲWAW! z9MkasF OVڿV%JB[Y(I*;XݵZ;쑃Js,40$~U]̷ATn XL_An|{pG [ Z}JM<CS} Uhr @M8HʐociȰ&0Dƣf`uIʠ ҳD0z $ANgèvGH?8F/X"wI3ዓ r T2sgƑ]n=K/sxrx $'3mP81*'8q&lrZ> -B"@nv8J8}; FDەTւ@GB+T]P2c@;DI<AC#/Tьs}{a+䳂q+6k9JS3h=%XwܻxcVL!\UM+9,iKbKCvh&,hM\m`)er?AgΔОƁ>.c1hU"+\ {M"0\tRGm?ަ׼9M6nE XiESrWNN4|鹤tXl ϳWkyʊ/|m^d %\TY+7:M{6wdj&ktxf+r !kT)q c܁-\ #=p*_G;J}mߧGt ;"lj : ˗{LiKRJBEl}h\Hw4^2mmPlyR#Rb鍜[ }{;utZͰ LRhf&$m{AƧyb[*)ndæSډ.&XΏ\z]FJ#lV,}8Wd^#+ 󜼙 o\a\թmL{Ʌ,!пZ7ٽ?<Cħy!HO.CG~)ݮ6-X"b;/mQڂa3}v/wpҼ5BI}&̚P2ԶS:8LKi,MFoPޖ;ZCleyy"6䲡C*F y]4;ڏ&o|_jd%^ 8y|4,!}3-Z6}z䷧Wx @})yk*~@[mIwCR dE)Itv`+ƵfmF;PҤ2dl9;GيO>gHіR$HjeIa5t ,DCε.//m>==0$ލmu[&/E܌*}Ql'|M BslZ?u@(DWnJo Nn\+tr } l7jp_>lQ #1UoU 䇜K·kYt-!?r<[Axz7%uWvtAL,ohV7$3i=Fs,%aL'MqH "@{ R#+8K\rG0#ֲ6qѧQ >+.3!hTm,iFpQW&\tԧo*oI1Ο(Yn4g~ F"]nK2~}a],CidKlbޗf- )]LL#`xcȅ '*h5r;"_L7B߭b$b%o!kmDȬo UOr4͈ۘN`sҍV 1 HD *s2/3mSD=T.jƣ3L*@O@/߂~},!h9ط#c"'ffq.m@uEhEIvP}6nդ>خ*`+oWbDw3jR/XwM\+i7u<L~>.`iQIvu,sX>C>`$ +R(%OsoZ,cЗ `GKY~1Y$Bd FLYOIi C_9Q:%?J,CtM5+/{м~&ˣw"A@6.˄c3x Zw^>f6܅V-j+K 1Q"-B:9ԧz{0DL IPPȶϞv2uYou m2zG!:4DRMquTS/ekoʆk:#bD*ł/)X`+@pcMR%8 Y1 ns@\ b}#pbQ'82y'88{ CY|P%\ԴɊ'Ϟ3[Ci"YIu=ֿVaSCvi={]Yz\%>.{ѭ1,ugA'|T?`jam*'NxD u~YE{ ZW='J <3& 7^ni=D`s,[ڠ'J֥5j2Sڒڸ>&jFAan?ri b9_$sEGoѐD'R=:vO)=. kC۸L]m9?**fo4OB hpӕ?.$~h 'fu1bG~ޜsXo1ޙc|džx sȊ_wUk ծaatEЅ].ehW1[q#ĝ?8UF٦&eu"_46I lL]lEϲC#ۈ݃OH ,Xs VTԃ εrnyb؍cXm!JIvlTB gAՖk$p=Bn%9#d#l\z1\ 4Lhfz=\;Oެn01R OarAZ&?'X$,ZB|2MYժܷl8"n1-).}2Ë^V%\f.jWx)=I/'hJc۠5-!V/g*[znM:QZdS ֠ :g?q]5ء8D4ԏ΅eP"MPV#7 m ~,Y;B|0y +#3bɸ@~klQnsFeJz~o&~V0["_MP  : 38IRExZQ Nz2'͌HO6pB+&<=!MXi'uJ_=rq8E|v-”mp`oZPWKJ=/"kY'shSD_;}DՎ˩*8WRNq=&5/h R=(JA`*s|8z;1ABBB嵚miĞ4jtg njl* JB0_{)LK7:fO`\2ȱƲz72ػ\ȶLF7gtra[r-4op( D+jDU{ t^h} VTpL_Աg1-Z~>Y\9쐭hG%p9,DŽ#_Z-Z$=I2; ı8fMYZhb2i TДoZ>1Xb/F߸&ǣ_ Ơ O'ZRVD QpיOYzg[qL%†i.*YqvIkvgC~PmyM](+ƃE$@1a25)M |; i"yLD9gC/'%r,ܼM,S4d [aK eQ]fes5 ,F< pV%12ɻ54Al!#z2/nciŸ^ #eK 3J}ʓ4 gOoDb,5ޔCb+֘7hnDa./nN@Ͳ>3Z15A`aߎܪtV;v*)6+w*(|mǺ.7H\[wzO4);HqmxCMrl{$,7CF%hy&N\%WH>TC4&=&!\aAMa1XoZ7 .TK@4< fUd/O R2 C.Ml*WƧ4][3{nMx[DW9;C[ك3vM<5rm*KɭO֑:'k5aH—^pΔ(+FVѫ`11Vtl0{<*uf6iy `/(R%+A뱛A5TE=22<3_H#7g1I9j/sؽG2ˤKJ?U~RQh'٠g'<35O* !ӕD?4GJX/6 ٤+6k2C.g +;p=41X9?)"8ِv{goQ*zM!2- 8iKv3Ԛ4q|N WV1\L_wQxSѿP`Vox$j"Y씅c޾nZjw-]nDf:3 gǯ6.p|AT@ʼnzr9&=TS 4O/zs}^>O A|F\dVe<>"u)bO݂BQ2eV$ge mG3#XJ״+jpZ2GBQPcj+p|HX67 c!H a-c8+t@*@H"B1.%~]#z("Yo1G7;X {;-֟,qcL1PSąH+`< Rcu9Yl:/wY;-O6׶w}**͋f5%3O?ʖT/Eӱ 9dX4eQ׹Wy^^4J(JS ]?OC}dJQMdil 3Kzd!?*:>rH1= }t"R1l{L}HQ@1El/͇F@ 1cL.סp+G!Mr<@)02׶pn{H.Tyxy=b_j&P,Æ=}0Tn5( ?n ı_;l,AP[QȦe#si[[YXK5)mDny`ۍR<=)P:`,Β0im,8e6#Xrz舩@io4M)47`cPhK5j>o'mo弈.bl>2"R|LK?7xMFWe=G1v O-ux*@-c(̟OL.W9I²[1r4³ɑ"۞qč ^> Ki0JxVfqH"P h8saCDY.:_~s4JEZ&xp Q& ~8Iǵ}Ü_L#[rU[C9V{;zWR U!K;'0KɐM%%H2̮Xi*;vVdGE7ay+To!DkzT~9 XcN:Θ_!vFA{:_+rH,.e\n* $,‹25N@G|^vIJ?QXOULw'; $j@o7C'sn-;@:[aN!qYȆ[*xcԃ(4Wu`4{5VlG@9)bi; O Õ{5~+0Ia5q[ &I;rpo #D5.F2#Ungr㭥 6%iktթ"(ٞ@c@z뷾~ f2-,M6;sXD~UU9m@ 8m)-}*p٠:pQ UC)d32Q?a&tTgTvZ d"lzsRJ"Sp̳3QqRj)$=p{-/(rb>@$u)4 Ȼ8') 6ӱ QUBC' ZPQoTX.E;8`hz@xΞkN$[-72x(Xb̅rcRZIaܤOᅰɂVg!Lp9;KCXRdр'xYܒ h}MB oR Hw_ MʟEmnPlHaGOjpH.L**?Dx[h{Lnf,7wVrN"溰 WgBq$;fґºp=@HH*s`G3f$fENT8K M~s%#8 i̞ |9E1?6׀9_ud`m0j-5è y;_GC;l5~te#d?Sy"Jh/ $c #I}J$Rxjք~ $qATNJ)ͶR O: lWâH1 ^_K#0*ƧU@@Rï>_7w4,~Z@ߵBi-@Dw⵨[)O^9O6\ -(þNc/ V;E1G-9xzW"hDp2- VZ 7+zh0|FIÐ}k "B*>=< Vq@9g=q:%hiAue\i>^Ͻ)']|{C}9 G_wsApZ N^s+҇<:s[mk@xFpڼc8{I8<#(,ͻikhuqCw_ib쏾0[>[.YEy ias1|[Ɓ 1t .,rre)h"RG6g:} _ۣ&nyW,:;1D<+AoOۛ~@\$Po Ps>5{oU> CڒRE(:%: q}] ۄz|Pz7 ]iʾe?o;ɕp:MVr t$Q=X21_p 2̺"):~۳~E͟xZ<6ҮEaa JX{3sr'pX[UA1"˟?k]t(8f]hB'?hG=!.t}Cڎ1z~pd}9Y9Hʢ穞|x3OJL¹}*ׇz'E羿&E56%{[i'KΙIEU ۥ䬦:- p9_u}Kޫ :ˇ7sm .E AcqxaiҥHMr,Зp i,L'`#ܕ+Ot0ry ̺ߘ4¦n" @69=r|מ.XOu}Db@GmJC۵}AF y7 RraG4I6p.b07"0kKMH+7o;̦S{sl"r=?ArΜ:v2jߪLu@,\dD<gT on \TJI4lZ;=&P "KgVi$QK˖e%Вev43F#H2[9!/~3AXu;g} K #fNZ[->l/屄v$Pye9GߍBc޾vr9 Umy" Rx`vb(lV=\mIm;$_e],2S, ,. Xِ).K n}/e4*Y`-9M=ztT)עR|˺Vy|SǴxDUp@g']Upna]\ pݰ(.wÁh@ 6$AROlށ)}zrZ̲%Ȑ:}Vĭhl2T}^QKc\~Ǭ8Kw;Av<̯(U9a9Į gʼn吊10@ 6 ?M:X?;>]D@#p_-6/{:Fk7HFiqF^ njCٕ4nY*gQUR㽃wJHPY;S6pkێԟ&HuMwwcb3c{7Z{8Z=gDrԳ;أ(,qإХ/hY =-N E/3S|WO>$@ I坕 tDl`eVM :?pwPd4!܃O*kgYVkԕF 嬬4yAPs ? y2Ft6mMhj_a}RK9/90}pwΕȵFإKP>C%g|8\jlۿ BYU "sZXu56_oX_`_-ڥ@Kt:n#Pzrz<%hXm`R@Ɗ0lzϔG`;r4*.Mbm kŠ>^ͷu%ڴ%=r#Vͤ90t:`e QlOj[= aM0H Zq}IYN3?"XI X{0(= HG=̓7g_X]zRNFäJRJCm?Evhp3eMWU( ]3+iN2~&uQ{2z?rV[sU`gwؕUxNQ"D:wQ襮xX8I"+7;x5O2LĻeyߺ,/m ,  Nt87]xV娓 w3Yp-2}9hۜs =aRG4CL&Ol$ h>ş.W~*ׇl]KP!hм򪑲Y1Q&r3UJ3 rK;roU .P91LdgAe^ì X\՜"1dd3$> !*4Vemq wx/15;^Z֯|ب)z B v4?RoK]ըK;xe %|)~^<<03DYxy{^K@6gMB[R[22<ʹI4ZXxc2f= !@msX!6ZOA`CmbQkn97f/`$"!9h2JrF ԲbadB ijcm  13x?P9ؗ)L&E&-}y4e{_ūEʲḌRO{@׆ x䌖eB/FbtitS9L ΉO c_ e@ʹ͛x#$' \p vn6; s%knixE`w1-v` ^$U2KU bJt/u7z"lg.KE.:҃R/;(n#[O"gԄ&Yi|ռ&hȤeX?}x.rgsqM}Id wGVS! 7.`9i3dRz&E=U+B9bF?d ~OJzj^m׸Ze)tk|_YiS RѤfwǰfit (Ѱ@l NsnQ#`O `ir6SaCN(}mupaӶMVM*nBWUJ,}/O(.52S6˿3r0!Z!ua 4)ѯ%o]uCoᴀ t7i6 ėVN -Ւwgn?>9oHMv [[}2I8oLY 9O[ 벵,W lHOH XŚ>ƌO|(?9IΩ!Kn1 p- u{X6!M O)߻xV=T7#5Ro^R0*`m/t3[I"-Gz1"ਊD? ;HDu__Po۽zzfeCM=D\E8 4!I q1>'Eg1>d=[k t'wnS)Ikݶ@*T'c-26;*@p.x SĤ|2hnČR(٤1#ۢ [WST$J;JcPvΞɤ/7![s mNykTtWZ$(>Cl遹I/NXڂ LϽwj7e48i%/E`T c?^uoOxj;`HsU.KæC6"vE;R +2vr a;hYZ'&A[ےZ7|-$BcƦds):A?KXTNN>Z%`Q\m3m\q:qfHbdFWlRFgcyZD{ kHriOJ'C- 4mP+'y$L$NcF΁4 ?,v$eW{]sqw*KYF$rL*N̺d2"h@'Op !'_O:ivEvwܕns׿DJDN$6C/z$~3Rdr0B.%R<d%z9Q|4`͎Y+$ ,v;r|׍0bRWPzXC2X&h|$VFL[ ]*J q_"86Ը;%Hw,+פS!T\|DF/F;ºUC/ޟrk8|ES֠76 U@D$y[;ô!HaH袤b& }FhOdw, \O¶e q7ڛVV0n fc)K`]Hzނ׼2|JҒ7l̋9 O#S_DvO|pIIr,Q8/x =ڬJAԙqq_y qwLr acsg5?,V-Sx0LV_W0G'J{Ҍ:L]T};4 qc:7bO]U 9MO5p0ޮzoO C}WNoE T wm&2Yff7Ȟw|:U2**2g&MB(;XժT+Lc#|͹d)s>N^ѣB˿%K &H%G#)65lٟX wҷBq 6~2Z8lyDl'AsZl:$IgNg&Hie}p!6V*9vxO*k7*{IYE@=?O+]ڹ3|qϋYW0֣O$r4?eɿ٘ $v:Fo4OHZEA.kPT_&Ohd$Xkuv4*@K5F]ԗ5wr'4ȁ5k؃=I\oһ6q|zڏfXK*B[΂OPm^V]o+IŒǬ}G7@RZCtPYwzhcmC [\\^ZX>-Bx" D|J1/.ʉ:nD-!IR/ y#] szU5 m+#Z+wփ\p-JʫKGR#9T;=9~HsrZ`ͮںr`[dnG,׶AX#j^^A%TÕac2oȅ0I6A;іE \S[L` h!KWvY7._oOsw(JundfeqT==[ f*+9^>=4A{: ؗс︌lI^JLu8n_?Ь% Wwk:ÔvQ4Awع}-~Vp!˕+ Ukb胹)v#7wԕ{bpc?iY1GND"h0&A*Rtp/@J'f@ nE3G SFV}oWFvW#1<!cDA] 9rH17%LxR xINa]ۀSPI1HT^\KDjn!E zxf`^<2j3XۋwxPOlk?0M//J8t]z_9EsGӃT[*ȌvظJQǘgU6`C@Yzro q.g|%Kvzvhбf|{>h}0a3-L!К~g$oo>HOuRk_gw3=YAʺXijOFO-Vi ]VSl.jku|W6AYo[a>kxhY&q6 J s)^ǐճjEW!4W5z$Ͻ~)((N'C&5$<3su%[D:ˏ]9 (F_.;*/0Vi$,#n> ܃++ֆ5(\ ):G! Pc2P{ ۙ*A~>B|WjjHoIÓU=F7IaMO ? [m|5VFr$+=|4:1SwԞ0ccBud3L"j=y2 VݹDu]bBv/O0~AviSԻ> E)was!cu9vD&o+L PO 9|_wd:@99פ'I=,İG5MŦz:l=m!B#TcUN|-zHƆxc dEM[ =' 6!w: BPpR|@1qOxMbu^EP ۭ6/f,8xMxV~TT cY]tDz_E@{2 F Ruq(2ķ^2UB8,iH"Y$?iT@9F3x[%x>Ƒ5ݡ_έ4y;r{9Sp'NP_BpD_oVֺ%a  wP/*7}DDR4+$VAC:ŗJҫK%w:.+X/՗x]a[qd^puev|Ex?3jdk] 0&gOHڜaZ&4|݅=u u5Oy(HT"A0`ɅTE+=uUE,c i~/k! W<ÃhDW4-ډ(kz 7 z%<%ug > я1[d9aۯ{7}&!38wl]cX̡߳SBfF*oTD ]F¸=n_c'./JX4BDÊC}-˖@!%,xRvZOQ,wne/?>h.؜ 6@{6 qֿ;)gllyB*('*R[[I}rhdtQeQ7f-JN\rѼb_%iȆGr)U}Rw$o+o"-ۚ K{8¸tD)Ԓ@Gs_.(4Qy_~vɨY7z(7^pHx>[yx})=98&RK! CGh˄3 `q51,y𕏒ll>ӂߑ0ӌdk޷h%%& Ybd8F %{85brx,#0avڭ7rŪyiTg@+yD~* p]nGmO㇙Em4;5,{3T:#q0ꈱAK~lv#>oHws}k\528G<{ґʹQRhK w)ى%%s87 i1;lJfD| cRٞ{\BCbWy\nĵ$IfCRN>Yg RcC|`y [ ?7*oS_J+lͩ Ju/2Tm#0RhRw8-Kg=j֔9 ٸVd s*& eO=Hz[eR:g2gE`q>Mqk8gEkrn%̼4MY8uVQ1GS6px9r#^vYaL[-p _ dLj>81 ?[=ңv!5Qu4EWƮQ;>Pod rbmrCKN"}(vqf6 Jvʕ31zuC &NB$ A4P˓jTBtrC©:W QהX.T%HsfdcѬت-XGCє4˒e[4p0$!;9epńr4\\*E,ЯVV`H)1I=5;gc~te>e5 XƼy˂҈. xK*o'(bjqEhHFhg՟3`Rg%4&_2Y'ۛ(^O`ZM8[hZkwU.%nͮG9'w_"ejsC,*ki242n\NK Vo.ŇNmS˴-N&(>7Dɿ#$h۩Wf5zZ ?WS*-DZ.R+0\&Țg`Os=~̜{)(r4Ū؇]nÂ/͍%쮢U`~--<K M7M6BIo_*.p(iAX0F_|Wn$oRܞ(DN3>x;=N?NOV^P(;8"4ZPbhnڧnȀ/N,7VoZEλ«c)QKrr3*Ol;3d=x ulk2ϋh06M@sbjx%bY]q7&2=Q%}in˭qrE6 #Z&>g.HSN$j]],Te#0Yy)&:M4-Bn`ԘﶔȄoY/)4x[YZW"F$TsH!a9Ք6lV{,*`{ 'sjr;ԗWu 6oj#"rPq2Cyvх{A/?LAGu.lX-[1,:Y)ip(?˧:%>Oi1kwÖ,T' 0&:Ne{ݟ a 0bgf iM!=k#t1-4t~6=l8 *}h]&pu[n N  J;i9VD7UUNH2<;Mk4nvrHVs{8. -V*+lZL+vVd^r6RgEDriP\cM.(@!Rny)ɧ'`6T}MvYw |#^,(0^ogp4+ž7io=iawK=Y^:-15^xU{4I_;8Um+#xC? ejJ[M3`TcQnY0ySgS̍tӊt|¤V#KڍcU0){XB9 %ghsL” ='UM剦N:AT@|lh$@/֙bW\j'Qe$5R-P .NsL6Y92rr&Z }T:8d\E$^Hܲ ՕDi%F_>^9j2XBKL /VZqCw#`UpLDŽ*P5\2|B~.O䓃s|̚ |/3̄1; NC #۞}Cʽ`IʹJ)?:(N? z_$ZN:YUC#xxR|ݥ3?`7Q9TjHM6_+ T"t3`̐! ~9lݓW7( ÐnB_R^i"3D"G~ N~ zn ʜzia.Mi 8TS ,f * 3ʽIh\4>-Sxh :Љ?'#ib\NTHOkm"Iz^u-l(9(yotOWZ:;ViָÿD#F _Iw f \%,# 쀀ezw"$FVWl >_\ z|^7n9CUЇ%ԅLqEh,(CQ'a Xwܼa F;Y)WH}&4X-41PۓP8Q9͎ 1}mNvX?VG)Has,[aqk;ʜP9fuiȼA4\{hPKM!}n?x&+CeNnpiq0 мs,-<3>G^o@U~ŀPt.h{O7Wsȳƛ6t OC$`M I-z#B!z; !6x~pHWE& }ʷT)%?OЧR]BL3vz;~P%쩩n6)N4iΫ)So7;͋8Re N81y^ĉwmkeK __yK+ѼOFF[=;=%o)u *a<>W W+s<~`~O@>ۊD˭X=W1ŕy<[quRɁc/n5o`"r4?A/ka@GzXTSah FROzڙi7$yxv6Y7A~TApƩ*ZcG1Ώb]欧vUOT e2%Ŕ$Χgʓze҈1s`*d2T喦]Zf^DpUXM)VI&9VG;"'ޙ>OLR#|`K |r3lٷsvA@3 \qSߊW=(ZD_թ7TstܛXPN{cEzq69zԱ _@ J]Oi]tn9Z8ZX h[O63jZiC-=?jn8DD>w:_;O&zwňR şĦc SAsK]ACA8yz|Sf}]6>TfE-F9ZmIUB* ^xwǒ{c.}Y0 m 𠲬;A0¨%4>n=\2u~vXQk-YH0Fx=Ԓ*[nFV8*3ȞfׁصGliۥ}EOoޛ}uyzBf̖e%ETXg<$xr3&GoqiMǾ褱biuQMi'agV:w(#jI h%טB+p 'oV"\Jd.݁N`񱳧bg4ʠzN " C>HcdN9XLq/&`& VWGf"T ό*"l).v |] C`d" \~uDr}MYB^*fyY8إEj⤁(FDVln̫iDڂX pBD>LYzPQ(e_t=Kw^jy :2Ѥ]R[qYѱc!DgqZ}%$362A-lP:Fꚱ ('$ f%nhb}3xp(BsLp(u )_Jzۣ䁡Xd?sBAc8`g>JNi"}R6rNg~^Dž1x4ˠ騳/f>E,^ICDslqWDj, 4?%Wi[s*Ӎ! M!}p‹rj'~X3;5Li5 "H[1*ح5(#:^F{ciIi oV)xb߅TӍW[0("|qICRau-N)ÞaG^}!3VxŖr>o>,D쪉|B: E[sX^!D)FX%0s9opOAtƸ(rK#ڲP@ԧ.&kDRLWlTXq( &Z+͹"RTKInK_ 󽜣\F-{"P)jkI;゛ɯ"2((>,_vg,ͷy?}bpi]}uga CXZ;И_%s~B;vn2sخ3FhrAVL '>~}B?4=7BNSEȵjHŠwN]ƿ9T#GՖgF*JEyÒ`= ^˗ʿt.1L/A Ps/nr 4rGJǝ#xJ| cUƟY;s%RvTB ~Lqw>>G͈Wlr͐]1 '̊;qp54p$YԡF_9 <t4fx1~X1uX>ZząYcܘWXjHDF;e͠ -"χ,nIy%A)%, Mϕ *'V`Ԃ,9j{Yf_Hp%H<`X'-n7oKOqz`K\R+2L}g/sny؎,MVSs.i |xV u)W >z W)m QU[W쟃 Yf9 8M8.vJ0c m)2 m\{f*S4 xLD&`35,BqyDOS8+܋T~%1!Pg̘0狮ྋn 0Z{$d u &}ɯa7y>9#QljJh$xvs RF gsM-"h;3d\-3p[=//V:< $B+*S%3w O'|V@H>U3C3r?H*i]h)9V%Sbsկ ~LA$e'd(Gcz7|p; #kb\:1dO %Cz-j=_~ϑۉUƶ ݰw~]|~7b((,^7l ZʨW'4*΅h0ae_"o?~RQ?)W rszn!tM(61:#g*DXL(|p{--oH-V1#BΫdoi\h'T׮G}??uD_>k$D1tre!SHP5~0)M4Eґ z&߃ 2v奾ކchO Z0{ƄDEXaԷ"&IAt+}L+=S+wQ o&Uf!:pX:㊟Sܢ.5*\I|kgÇI)HW܁ C$'᠘J;+4=Jl61'R~p$R|#g1=J+Ωw0]SvYj%P0PjBMNKɂ8ɞM~9CF__K+P${+ZͿ6f4d B{7h.CP nbYO]L0`9OۥNw 8}phGhzmn =,&8K߯  =a#qT 3[.XaS(QhG7(#S Hqx ~9mbD"vU/U!\VC"q9U $%fd63oi51o qO5 rNe T1|jfJon'k d}`W4btF vK4-oX^ kh+f#ΒwuI +n nYpWp8-EI 7h 9"rt E3[k~>~Z@ xwgL4d-36 @3xSF+-h NM;c>qlt|/w9q{ikCKL|G(- w6O;FN6iooB.j\ mu)\vCq$=Ac vk5"0C&9`£QԘZ&gɚh|j&v#Ld|ǬJ)J` +2qrP1fj/&@49́Ͼ A֖G/7-q*z&+_ϤfL /85~ĺa--*UaRbkZuS맶T]dc;NvE[X( ,ԋ퇿S0Gbr86dA|ۀBݒm%ē!z[!Bӭjɇ'׻ZL:¿bJŅ%*v@ٵq2BS+ƐPP`)țC,MtZjS`װ4Faah,xآ(?xCaSg4rHtHBW$}~:fER*3^:߬'JqX></ԭC PU\QOԝ#8g45Rӵ:(V;9fw_$LFXG7y"p.Uly4hBO]Lx;8&L7} pm_p`J-Nm?Jx*gga<1Bh׀\҉5:p _K>Oˆn\J"F2p~.,JjR /~lVQv^%F@8)R,xԪ(D~ dD|5mޙM{~3&w>4,C\1s\ Ϻm}Q^t%skcy%pSxo!ElmZ Qi~T7wh%tG.)v > vSl')? Xn2՛6G?F7/}S ,R"Cg'4&:0hDϤv yE=AEkR?131+@=zFIAd%2R}#3.`Ս{WfĐe(wM,.h, ΁JtVob囼VG9Y[3d}U sph]kIi/C)5.%7]-P/|j6@,imFz- NnWHhCxh'rtm&Pkŵo;YUb`Q}SߜlӂӭAޓH9`$j -oYi79wW/km ph|!A5PzyRKsrON郤g&̄2`wk#{%dpK ԕ/#oj{jqT|E𭟚Sn4d5oixj7r%,`.ˆ< 3Yk{ &ǣ/_ۑ/4gE)T [޻gnJm+1ʤ> QzR"O !~jtL~(,8b)}S9óvqΤ ٭ )]z ܀?{ bZl l{w_Ivq" k9Ʒ+EViypke3d xP pvn'&B|G|ۣ? &W+M̱̾1EDPl7%49 {ݺGH67ѡ>:&ܺ\v1'HV19MT7bۑgЭ=O7YH\kDM10 Q$@&ťPH[3yE6ʪA ^E%I(rַ9Ƣhj@983kmTZ~7d>]ݎ,C*NlZ6ύ9h@ˣ߲ٙgċw ]*ec¢:5XsolewG5\斾%QgxwE$K!+Nc/CU7'[ekr# t8 C>,`9ϴqkfIAT 7*޴ c2:2i6ic >P8(XL3a"V,?U>LXNM50# A>ڶr8k8i)됢dVN7Y"A#  GFѸ"IsQv8ġԳ M4:+!)+ĥfZZo,M-YT=|Ex 5BUjnY&1El_7,Lu l'0lth^L@,At=}wvq~}vf[#}sw@͕tW,Ŋ nvi7B -$ $+R1k4Rm}J0ѦmL5E)&M8;>/Mx:]~H]gj'> i>k,:XxACz=q\s73&L"ڿ0] n% y8D6>/ڿKM|_mԠgsUږ^<^ A S,h=sr|8jcnC)jӻ[m t?UX}+:S Ő9m \zv`p@$ }+ :_.\/}"e]BhfCgD ?r(J+ ^|y=cSA~@r%⛜ xC\t]fbTa6ᾄNvLTZW\2!v^k!}t)ʼn:olЛ$b~pa8p<ҘU-y +0&5IS9HZR_m弄B1aw4Qǧ0Cl0Ig#| ܘBS|06#+4pGLie ӷtX %sZ= K-dށD]{BaAY'it8Owf~YuJ Ն|.#ћ o޸H.UF!z5r$*Vr)wd &v_W k~E+z닼c,41};]54_F f r-3D 3z$2@mTUDԇdftN-JN!K,4pR;o\E}nR$&-ϳ~⦛Ŕ(RL؏f,//H+ahq 6Hva1?_q!䵣5 c)$ד1F97g1]qؘwDE]T;sѨih?Rnzka(K%oK1E%Q4{j{ \VѸֲ`B^q+J"YPf|Han.(Z+lE"ƙʳxuM@:0} |ރ <ʮ,43WsǮnTMF .c{ίbi"cb D4=m]Η2]H>#C~'X B]̭ 4JG?0aiPz^|J dVkH!n$6gcS/B?,f+b.35NN,1{OɇДwGgUk9nl H9 55-KU_ϕMTkdtnq-R%@:k&XoXW>Q,1rl!`Ǒ,dmPuχ%xruH!&?w?{+CpMS؍r$~{LͥN!EW>['l~:qٳ sI#|&ēNzZ:n֭f:O+I[Sb _y´,}URρ2$u!-5&m7P B*y\d~+Fh(TGAF] %ln,·4BPv344A5ʒy|,CPf M) 󈔝m !=.eZC:/pحn6Lʮ5_sR=x`j9+KEO^9>p%*4!YO,&J taiB<TTķG0Z^{KngrO*R/āyOYs׊syztRB팺N8ocv1~KgBffF@am!`ة&ߟF p"-P; j8`Y `N҂HX9 g\cqDgF%:'[7BNf҉:"t\+ّf=/J0{Q,ę]Rv5چv<TM.l^[VyAP* tVz.TIwFO4OԹd=_ܖׄh .aÔݩ9&M{Iʏ~l5HiF5h^k:ɜH>y\VE[A|k!<8T @8lM~KҦ8%M k!D}c֒ZTdX选%LJTy"$݀dY] ԬK4:I8^! ipVt _L{~K;&[4/W<(}`DJC[*=D[AB6L^e2sն+CrgƄ !kêC\AW5xqgI6 4?+\@K#p ׋ϫ R81K2g.'0ie*`Ͻy?,']<)r2}w:inK}b8qfcjli93 e9ƒ{xG^849AkIw4F[9mYx٣[~6I;Fkǧ?ڤI:DBOeuuzoaF{h |/ qS`{y>%[?9.9@\ n8G(HËmkĖ0=q?1^ Nobu|[iDr*z/M(ݺa^&Ua R CZ"sRH:e]3s֗X/bFޯh_@Tj0 P[Qy{dF/xiJؕDΪ)8:_iN8AuץV`0mSx0rEO"Jh?&SmcgN`Yld 1 ;46K,v{Z]OG$.5"gqR^|mӄ[T®s+XD3>CmT 赖ÀO{ g),KדkB’!WZ"WiؠQ6qG. c}$Bxg_%u떒S;/h#S+y>.F?R'O>;Tܗ%Nㆈyv7 >A箤pxNȞf4K98 ~x #!^/MZRpnz?s{G%RJ3MTMc׎ f66l6iI);;ws$zӔ>% F}]ݩ20WlqDjBid;9(ssD=.;|B0/KUsT~Ïb& 3^afh@!xlV lyop0{Yɢv)eTV1;uDLPC\-,!DE?uMIz[T$KjAX/N4׌<'5&틎1p0R=ϟkw-'Pb!bn#u-_<T13;/u?kvdIbV) ġ'V *x}w]Azɂؑ7*.FrfLrk7iqD-{]O$DbC_"ߎV{paRJ;v=ML/bBf8KœMǺz&jdd~1 b)D뉮Ζ|ݖs50ҷi.ĨHCV[zwl ';ibS94Cl#867,;x.{-{GJX}bFx%M:m6K*mZGly"`X]ֿaq4i]SurHw%TШvMfGyZph)w-~P[9Qر8ך|;H,>&-}fqnYc=$OԿ}SDO 2?jc)y-?ڎPK0,+ ]Vc 2ONQ/jR=]{ծ[>~`;G5>u}I)O [ #3RdLiqP␸(xkQ\']'1T9SW? +Jގ)16 8fE!VRt6Drzi7fKC>uocŐVç0'Yp7]z% )(1nCդYzL9\@z-iq)0O"v!@RJ+*94גɟF6h qUxxChG<xk|y"ae#`u lz`=BzC_])tzjiz5h޺Ɩ VQ-#8{K? -SET~{kG!˳^;ϨM8c_~hcK>)r̴s2T!pZ'j%⟥bs![y{wE "ᵄ'miBb#ù8QYN*Ϻθ;_!\;e:Z/V9D tl); Go^rc ;׾WJk4HЈ<g=yg=1~#r?Ksf]#Xʸ6z6BE_Q1'EOܓb'? pi_Qt)TZX Xa2shK JiOpPd M+W|g$z(ι[a4l5ԝlĦUcLUs?;2Jknְ(Wc G.%w ҡH=Z Dv9nWT[YrHwC/n}lj'u[)-1ZzъM8{G%,9WoY? Gٱp-?=L#obЫݸyӆf6{ji=VMbSv_զ0ݓu-XK_nf+ 36dZ8C{٫f|gK8,rEY -u)HƏ.cڞOsf*NY%7'?RPu`@|c~= w˙Q9U"EfUt*ae,&PqC %2׆ɪh%" e)~˷d\D^;4Qd&$'s$@0F4.3 MmISyeoЌ+ u@D(+ݝDTb YH*T \=:V03Kq|2D,~e"ͪ=ɉ5^^Wʮ"{DQ_/ٔ4YY(N0||C8~Vˎ Gܐ(9"6 ,do=6H\n`!µ4uֳV[(P8RȤ!b D9+:R~o\OfHTM,ĈFj' 9"ּ+7~=ü 9RZ:`ZMJQn%ѝN &1h~f. ]wgv%qf:RlgS /=a]IZX G :jx/*-goP:OrdÆ~>5W֮0< h!?\;d(ݘ]yM/^ZWnjzSisHrgJ^ 5gZ$l@ѦB~{"2S9p0u >>Bvdy>.¬ru3S2P#acIϞے1}^[>@ї  2 w iy-{7S‹ jG9lʡj$8뚾d_ ^PR(ɝ—nZ6 4^qB?hsj<ƜҰ4ta,OPsSA!Va([]pNG?9DL\[0i4T a\!ʋE/@)kia.FkTwPTLFޓ:IHL6M<[ζ8šIK s6N*(&olz''Z&IWpc@ISީ6{\7UhIߢ瑩-2̉l&1E۸lKP_4vW@zVM8VXoVG'G_'P!\!g;Hhe:Cȍx#wqQsFi th5r3|7}+l&Ue(Y?՞<=tbpA|PAW:C2 x}-+^hDQ:ȁQLA8_V)UvO1@t4K9*z%KRx;hwa)Y*dO՛=;@J $æm۠`>M.6x,)-{;T"uxڏo>L8j7@3^(+s|lNb<6 ֜mVd3TsLf%Fď- +Pޥ\#aX jR7 oǔ:+.1F(^x< l׸j?p)6]7YJ9rr!רm2UE?rሤFʍ 9Q =T:y3۝Pj+{{NnW)fI,_lp"WYo5u C5ěf^v\:%Pi e:ln9o_ HC5|p 6J@tTr\]֑%KeY4׊o6ءdQqʥmTc!iOm{ll=:Կ܉"C "*di֤SC(zQh$@hQ"3V#c9JH1(??pB'dE^#GբII1!4ګ$t|K >` BfSc/{;M[لedRJj'6h(Ebw"|Xg^εS,+`LN ":0_:[)o?9AD(zy>._S?*q|@y| H˛5"w)b tLC4rq1qIiecq fO˫ :DRQxK$҆mXlBAj0H+鵔s!(G=9 k~g5#2& D]%=b>Lؼ G["g?HS|h~ythԽŰx f. >nNp-lyhEL"SJZZnK!a-C yj#)'#A/ޕ1$('t+|UA؅|O/mQLxND khjȀ|E-nAK ͧ5+uTZ4Cy ¿wHe Uu㗉鑽m#@*/?6\C[ < ޕcI85gXImJ r1EN9#qƇryҌ,I*sirvK7~>Jw!Nd$&6*%?O'H]J0f_,&ky"< ~DKr4Яn|QVA@5[du@&S\u &W%5*̏PeJoTȚp?ƁZi`Q=qE†Mw7_TkX.LSAë0O͔Fw(juX?E脺7RB,rLAD ^|Zb\p5v^;Fж^p*a+|R# H9Ask8#M*%yt*Y 6Ti: Ìrm6I^$P-/J To$㴷)[c}\ƪN{Flr=U<}v\BsxqG#Yo#W[w8z D5F"zgT7LF.J |E$F|xEǏ%DUw!dU|6$NZ L\ ST:n~w-2 _b2o&_Sw$qN9;V.Mun;!`R;l&GcNNdFp3z("֫+y=uzr$o}O&/D\3 k's޳әբ /,I6zkAeFX}~ :#RH~VJy3X(k>rД&:@8O9B#gi-VoS.ccr灟 csplڣ@g:9La*VWtB*IAީXJ(8˺2Z5b NՒ^A" A?_"d͔@ o܆K`6rEIq{n"BQ~aGHp*8b8ܧژKŷ:ڵ~7`{}IlBk5Daox_+=[/cR~SxZ:duvpUȁ+@a`J 50 Ub :klՈl*t^t:xgHK#9U Pޭ@6\Kc}x_~ NC$BѯPOasU*P?\-"tRHwp8ߑ&¾C¾_-ZKqδH*y(L I5.ӨSTdbqN#L2(M-ˮS#@mi풎ᔔ7iw\n]KŽPFaqhM8%sfs,(+HU$! +kmFŵ A J*G<C RSh 6Lvezk+ FMU~ (# #"wr:.+4)ŧc:KG0'%\* s[!,bK>a2kbtʕM v|SZڴ?РUHnCHn UK"+rK%N}a-{RTtU]5|c-GkO`(XҜnsB?5 xS0ڇ!GCZ̲pcx`{Fp$B ~ n4 }$=Q!Ěn%/4iڛdY+PKY8`y=ud+i%z7B*IR$S9g>vᔭ88I08%hy!31 u3oF6q@T;tQNYwr9|sR/`Edrd6xUs gC׊†VtĂ*ˀ".bűlQ^;p/e}}WIZB 6M=e uā$@Wt4{񹦱r(n J1lfFyLdWjN[ga9]}bS=4Z'>{aߵ8 VgQ(WڶzLy{bq ̱MN%W6aZ9 : O^"}1Sb G{+6B62_ZEnkd{canήa< $>>=Ik$l"k5K7_/n@9Q190}DZcM~WY񝂲AM!}qjFv)rOF/C HXNf}qAijGbٶ1?O/RGoS+9;"o{>t5 uH=HC7lp9L2@<|gĉfM(H{ǡI%aAO+6Z1) 61 [>u0O5# uކͬ4`]!KW"Iۢd95B pwYԬgm'{Jd@cS,,1.V-a7kSųVh"+< `~ TX. G8h9diڔTHX naQ/-wyܮ&%sq"hSWɠ67dJb1!)êyɍT%Z`^b8CH2'S:m ?-D$CzZ(=p197&| N!$5t@Yh3*8x>{@ٰN?SH,z0?y_}9Gm=H-PIdqf9![[Dx\gՋ]ձaW rQ:}Ҝ%kCqyCgMy,]{}Q$8yY%'?(rI۳ԅ|ݭ<7ڗMRӻ"Hãj{^hSTתJ)v03>u8|둓OYz:c2ÔZ4NեyU;: W!ȦFtޟ:wJ!?h/'́n,IW`PP%6D*J?,(!̟Lp8:p4L!N}v-tU|Hƫ4qĸ]p. '.a锵=E:LBTj17܈_a #Y Rn^[4YFTm%~+sm\|]";cHkՑٻg}jQ#QUa*O  C~:hh~oZ 2f~ܛ0Xc]-\-0c[;Q9bx:oae F2 <z+`uct@\NMWN[5/Oݸׄuxj2DYOO%Xĉg(\r;鋤>Ƭ7 chIc*FΟ MSӸYwMti_W v>0p  )6>~hU1GqHS45y JJ_RU^A!|~fHv$Uifs./9Ivny,֎یO>+ߏNWDx_1 [ulvOG(olЊ*s%,dZ'ʗy|{Na%m nв]H|) _uޭ_iW,}|Z\4IEMa*;`I;~">ƒw`"aSeϋHaj>?˄鲞yS ^.bJ+J,\Ǣ$Ib`Vevt 淨c9ӹR* ^ޏ [m0Åob7u6S)X?x gCgf#[18!09;udR')ط6$ iKEpZ)_]bVjE4_!U%Q~ M+~4v4:ϩ\GLh$eaBnƽ7iM+U02x/vE2D\e5wfHrpLwq Y.597+viHRv{Q86ݦ9QC-l\kEݐ1N6GۗV"D7LT%Yk2ycC 4]u*; (I2)/ۺ frv^HT ] (-QeMT2! 3YHK5=ʆE8~/YQ a=n ،[V)WV~ $zbC 2HAq+9IcɃ~Un\w0+BiKme뗟e tWƣ;cNE>b4evcFR=D.bcJKlf2:?d';He8 a˫GS !V%~koGuc)][迊D1Փ{ @༵6+YP^Z!vcCIHAz(3aL.o]f*696o+S䒼lw.>|iä6i $t0&^6PP /aܑ?nUA״6>N)ޛP/ԢA)RP ;`"K AD\dİ{1UޒEB%d Y6ʹM(N r2#&0mGg>x%q:L$sfUE_ #(ڞj(H58n{w ݸ>̜.6ںmT4T[s>nsm,;4Vy(:crqn'ӷ?PL-tq`Nn,)_ˀi1ƎcyAQDSTi~s bP)?0ɘ[ o-O0c(9Ntɀf>8= mYcNГ54 1 [PAPU,j9~ķݥ=`%HasK OA,2g%${= Q^XjK}牏⺀ՌeZdQy戽({.llۛN)4Tj<-nRg)Z jeÂuxxg!s@x=V(ZP#tB3&ȐiSe4l&qKc2 85t̐ 0R~ \S/>05dNaXC gNwYmY(cU(K;_sAL| ^?D7Կ&}XNvY7'mslcIk}(0R5GBzJ VR4 ] vQ7 7`"-r K& rn+Wr7*/{&dYjq(!;g <@w f6VAri*ćnO7e}+ Y p ›8^OKDSQcd9㊏^n_vONNBVnZVws xi[ܗz=P_P\-e衴ۣ'uRllcsh^eGnBGL+cⅺ>{ZsDW_rZ2ЎUry i:X1}O77v}Hx,+fyr;cTDT3/.}עRCV}bY1,6 y9 _P`W#kC 9TKO*PiRz0kFTƣzόA=nYSv^r6&(J7g# n5V-e4Ktӝ2UİE3wԷ!"*"xtU sz4k o'`,j~cz(ƹ)&(L) ="3КpY3Ɯ'P#ې$Q O8)蘶 Y ^|_gk6|CZMj,X \Ny w*!fo[SH5F#У\~ 25tmMbHTBa8sCNi׏pKxݞuE8nUM߲ǯqwUZk4>*|hH?|x>b .sxAYNhh |"ػ p*DM&cʴZ8 Oc}l F&rbg _|at<g?XUb5+D֩٘+缀tқ|0^"Ag$nBӣd/{ʘ^]IQM>!De3<Uh.v*(ːAEbot%ςpD:G,0FEǿ&PcV G&j|t" tLF( {WwEKcќ&T AN1gU#y;+45zq*ܟŴpNr*f>:*]gCo7SF9xy0"Zց?T~6&[|<&e.! ˘ X]{psf.\ cQ>л wZS^" '(]xH,jӹ*İI #()qKۋӣy~zPLףGFyJr_ӣAe) lkt/<#-Q$(h\f舝xuV|kz͆X0r]v7XKdÝ!%7zZAڈ`6|!5RSTLZU.q>nY 0j䶽Yt|Aȵ3j,JQSKn*.maHQ.%8ͲE9 M*Ԧ3c Ϣ,?Cs1EEy6}nWzî6K4P8"W0[}zյ/*-']8!oԓc|͎XF$%8c:0.V$SY'[!jKDg0e`ư/,"I*]"&})U>]h=f;8Ti2|iwle뫺43v*1k|5q&w} t=ni@A9i[3^GCy.ZRCN,F0SQI)Ar 5 4Лha1!ь@<i$¦T{ A #uS*1OdR龜-iaN3~8 @t@;er ++ФP3DD6iƭ>Y.@ ϧڒo\tT|gPu8-^PυJ4k4gqKF2Wh].BJ;>wY_C-u7js )i"jy̭|y)( fr3;S*'Bx_ G?`C:%m}I͸e<Մv*%TW\c=),${.ue@IZLG`CS̓Z-ЗH3%#K&V6_@Ѝc߮=@C"b lAtgxW}޺R/@ RgN8*Q|~]ެBa/M+{=za>]sTtɲWJB 'y*. . (+*HX怙OtGWäc#N2}q·8Pd ds+p(t @"9jr$%8|b8-W %Kϲ髈ȡ Q#5="f{$uU&,d ޹ޠJTF (4Ќcvs0Z<sK^7V\ ;DWΗTh(@gWW9ˀ"*BKj!.n&Rҹ})rhw6ʊ}&[jl(=z"z+'SIy]n lp/HMTS/䦍VЍJU,9[3?G[wG[i?%OM{%y^3OqXH5eP0KGu,u秈}-͠iZAy01Uź䛞[٧p%K($̟ :,r*ǚV5LF/Xt ؈{uӉH^@hfR*a)EQCdrG c2 <|gChI4Kỹ%ܲH'={ʳsˣk"Fld@ɚR4ow7pz.I 4GBN=+c~o}VG1jdoZMJﷹA[cŖ ޳Kވ9S4F(O1l2"D|ϐ BRk5j *ܧ^e hb+ #ШQDetr6hI]6sdzǷSg1Ҵ~AYrK)i]Q:">3ڲyRNJ"}Gˬp4Mػ\Yoz󫸽@ާI!)2Y_~_Tm b`[:e%խ+'Zp:ƽAZ~~/--"PԨ{!yDnpZ7I8I 976c" g;Se^^NQdwό 3Lo"gpUtB+L;S( kð >u3({lH5 {EkHY.@Rj.*D$C _9dF;B|}kyk8/l;m҈-e uSp)bE#:'zE-g|{q`bHNSƯjb Sikd933<3E; `(tSn,jZV`Cx0k/%@,&s^ )4 r^\Eci/:aM޼ŞGgm%̋Uy3M.qF),"/n+]'xSֆ+w֤6=d(p1kW9xw'QN> _tj-'Y떛œrs9x2Uɴq,-z|8 UŚ6!J,mdg13DmoXxw3yG4QX*h|Q[`N]Twh8Hf8"ѓЪ>(,5*>9 J?2i9$P c [St'ZSN, VL}:pA1Y~~ _qA0X软rJOٗ؆H-+`xȚ& ߕ!>K96K,? n&%HU7=l*zn -?NMS).jDl2O1LsAxvX11rhm%x\tTM6'^‎ }&ˋu̽lqOyKQh;B$L|XE}s Zo= H*|u`%el5޵?CZ:H=PM]`k/cv'KZ#fQz 3[-3Kҭ+F*Gdcƌ"G vyA30 sqieL3AC^m'dFÄrN@oL-*3zq|~GNM$-  A +pj"Mg)1ϑ3> nDɊҪ(~!6Iu'CO Dw~C=(>3<3Ta]m.u$Wsi-, w0\;X w]?Pe˰c5K`v)KQs5L`# fF L)qf9-BsW.$t\7tElI?7:z%2pORV&S\uh")rU[2'p;t8)UmbN̲ƒ*.Wsbb'cqISR%t cn UųkA: (M8\mH(y!>P/R=] UC:tq0禲RZ˰rjS gR|jP?@PCNC`j~ xz;7!QvKc(&_9y cXD"pdchYܻbz;ʱhN'o6t# uxlg v7 %&z wX.'@bi_2kOvZQs^>H0T nk^Be)2|uz@V(n0S"s9)@KUI֕q, FKcM\An+YsvLM@HE}zZItN&гWqT/#0:$3ah ЄAv e{)6 j,>Ea!M8 ' .':JB-[V7A^06*rx^߻ -}6ۣF ҼW~H19/{+G齒>Q3k |>cnP^yq =2,UL<6<T ǃ2xCn]UjE:?k-K⑹ XWv²us.'p YNJ` H<7Om}/ ? U5b&5 kH_NË\|X/08kǞܝ\|˨냀%2\)~:>g\Z=0QδgG~[OTMLyyK`Ø/3 }\z%,/C~$+ ܘ^I)G}S$hhL*;pTgARK,&S]ΛsaajX8 u$rEQr3q(qRJ-K;zrT &]6}U{6Ѥ0yIl}< >jvU:@\kR Q)< c&ǰkdYmДk 6>R:A7&Z{[ū3f;wi&'2EXqlY/EoH/ZCʹ VGÎlܐG>-"=;> L i ZݤSs`{r%ũU3ܿ&"*ِR}bW kmIGTgQMǴξ]I}}_4⭇&s2G>/\0}g~'@\wب/,6]M"Z#!?OQuS9/Oq.11=>B-俼Ol.iJ5jy7S.Ja|RPkG/@m$qM>2^/x0NhG)8YBUF7@t`LƼ:!E,pz p?djqi# ]?SK6$j_F›|Xǎ.r8/K3wzRmS"<&Al|fw54`Y>_5rYKB|џ~KsiU4݇Ǽ%TA5@x%N ɳM-H⵲YIA3:_Zb&~F(*"ћ3#'8 1$-ü}̣CS[4dɡQw/S2m/}Þ4q:KE)5A 9S\ %k)I)61 OB5Q`3ntx1 &>3>c("l 5Pe'!m?e8$혈sjobۊv9.MGIa~BC IɯmoR1vj&4vO.x]EƔ7%( ,ĺVb9uמ> +G[bZµG\1Vgxc {&o^dü*:.׋?K Dx.^ϹOP2UFڪU혫Mi1J^oџ2sʂ]B }M0|!TxuHI!вl]Z}Wu  N]YpI }Wˇ=/ο@ 2`ХhxaND݋7TBK:3T]B]T3` {T9?j;-lwIZ3}빝y):K!ƭ\lksMA!XsW_wjB={k,oA.RUyYa5v{ AutJ;;3ExVGL  48]&Z `1:W?#J^Vylޅ9D'oQu*f׺YL[,Iyo`51OUdyCIYxk@D,ѢW(&?!DEhj4#!sV_F) lB^DCSҦ]5F2SGhz5*I_>;zrclR"2t%ۚ-P&kE? əE4`æg fhwF {%-  w5>':{>覨!r1>ec|k%A쁾xR Jh v>s q[I̧ZI{5;8]ȔUaJ M1FT3fBT/8q*Q_'fTƨp0Au|&M9o9Gӯ_bR.K"$"%D%,/+ % I0;J&ZT s&lG4þ;PKĞcj^7,/ #pTW*O=8ʝ[R'=9E33Q^uء_Ir8S4Ibhd!8OY|iBۼrAew^R;E ˽:It(KrYݐ`sC~Nl$l7R!Ӵtily8j\n4g{}(D[EK:mİHmPmuPW( qOhMV8¸ynQ^e!3ϒ$־5.NZ*A8LHVc"Ș[1g)}e`D?=I*L.2eQw2ڀ,J'B;Tǩy_;÷_^}>6[]# |BML8Wk@g?wX}Kh 1-fJk2 Y˝(!9v) nh=g?1}5(aMdWR<4p9 r!͔K'#q]OZ V0,fV"\A'Fǫ{` 0)38Љ˨'OgQ~G}u)=\EݜoMĚG| I>@CmU뾚2ؿL0>Ce8&n61L)۝x9x}[ l6GdQ~0d>h%0ٍurҝ ov3S`zWH]^^ݺHSwdh)Qh_` 4j[w Be1,%0+SIb3̪ɚտ~Z1zdD^ݯ`)SQ*"FH_Σ6$zww6`u-&m`d0#8TZ9~f],aS]lw.N:3gNTg^le%7S}0 K*zux00~F j2C^SdvHtZ)9!tTuѱl2swAM7ᯁڦŽgeMYi)!ֻty愨,o~3yS}1T0\Vzm f3QOE9ⱰD`'x3_k {lYmYÖp KC7q4 YE@x$ ˕ݧaq?1,NR& hf"bѳڄe Ev{q a0iL ~j#X&Lb C;`=9nڮdmJz{sy>zF $!5E 0gc^w9!>=KuBgKmR<+/hCpIM@`83Т;={ $Q>P(tN!]a>HzJ.H 4{mzn{g<hH2Eb?6Iv}/Ѿ(IOa4&L2ErאDI  #NdDp*{)WEl/]!p8VȑD4l?U'AoHNpo?`[z+g k ) BAɰ&1u#DZȼ3xyV[maa7ARaboݟoM+4G #.iR+!OШٗ(Ct]Z;FY^шD oo,3[0m=G4nf?@& }6T(Ю?6- wGcB@YUղX B Ƥ<8 >mb[u/(E0"nP.煏[Qp`;!1$_KwUsp8a.G ~g,,ǂLl`It-Xcd``B; dsRJB_TL)~W\(̑<8]n{*,:gK*ON`DyWq@SpY_ZHjl+8s:bX# q h<ފ vWR ܿSi|' LR~/ǠGhDaj!VL@SdXEo<4*) }X'IRCH4$#S?[O 3krMY-!l?"=R?B(<ŧ Μ)`(I^@+O뉸UC!e@~6rb[&an2:C,H!𒱺,wh^=i8.J)X赵3tRDJW@ȳhB7(tPK=KCn.:V@_xQ\Դ)jDc0֚6ߜL5n )Db]֠Ocy&^y D'd_{ćBץLF>Xi3~ /?*$m9Ny#}P!tlE ۼDG^wI]'r#b˝E $ĕfAzj#ԺʋzQC?DZ@#5#$jMhQ Oc O+YJ_IZ? m+oګLj޴ x;cP iKȿ5)&\D)#Ik ;gZgVᚏSa7/N Ra"yjY:5m[ 5t * ᖯ.w~2B踢7Z1pF{ p~oSn#D]lUH^^O|S˝~qߕ[xnNHIe5-U`˂*KhBIuiQ`/4 2ҸzTO֠״AgyC 鱛ZK M6-̳|؏>"𪨺TB<{>Y <=\}E3P\8ln떔S`v˝$D5gv6dǦ9&hu pTPkߒH4'֟6rl) nXjlag=_6F\[">}2ZLgDK02 zEcH$Spn`1>9"ߖR'nEyѦ2X"3V ^ [ J.@SiVQ|_\ Qḡ]b%x.~GJf&#|Ţ\kb#CS k}s>z:"'+drӌO C_Chﴐ~zv%p*CSyU{)OGR`UρZ U:Ol%l36EdOԿ[+_W*9m1LcVz50E[m](B[dfx DOYD,JS my"7Wn#q̬7̑yX)adp2NuNX/.Ț1㓗dX̄8zKEbm'Ơ#SjHmе㘯o\\jCQV\iZ-^M#OIšWS$Ф@8 HtP85MM:mqKH׿}BH̷oRдO[ $c$hdKgOr9bl Py`ȤIaj&j-ov$;=rKh._ '2zU[O# : b5UBfP$͙9xh=mIX\C: ?%TYxǁ:Tpr :le탮D:lH( tfSC˘H_.V #+6e 7X7,Y!e-8P,=dT_p$v)R{1n[Fh1B F+|~JʱdV =YK{A\0e}ut6A!<>4nC@|eɐG $Y|4<]!UuP_QzbK8j8[i:tMI#QxNzps:E~q1&5!:Q#׿|JX%Bm5s-M%`@u_Q%WΫ\ طqOסn0Im_GS:+!R_oQ->̈́Q5-ukFq!ز\m'^TT]GBHDp(ũ^mR#^p[: >'-M3j (3)&Bty WfI\L\sl՞.1nZ1\"/eN61} 3g!(!gBQb21gD4Ŏ #y7D0փdƩݫk& \vtWgc(=Hݤ2eGt -/F,brOd], -߈bD#[^^6; I2gBktSK;CGd kti&.(sdЃ\ed_Kq`qȹ .hX|m!1`Q!x<45f ;c`^6cy7~-3Ior  We z#Ny7]Ix,pkdۜi1o.iG>&+z ^|LJtEr@=V F4ysC1O4 ag*X8 s%2.nhlu%$-fJ!( d=\ 'KvDj{OG fK_Fa ZxbRTːp0ZYBNJnVxw# .m}?^pNkr^"0߿ ̣Bq*AN=hjMLmکEyQ2dhU1mjXs:C'~l@lFAJP< [`6iI)ؓ?YjFRy%՟W1Q"+p0[ZOtj^pիwR_OǕMțL3bh1 ɯI_U%, R(/;F I?noDӁS.WЫ Id^g)gVn$fbO7Fg%U1kF(@Vt =Q3m*s& iTR@aey3pH2譋#m߈sA͝us9/i +@l9\d׆8hJ€rNw-;TAZTP.+q^in:IH\狷;SnR,zBt)WTR~ߗi/A%gc;nFt Cft!cNBft(F<""E(xjg p2(pIo.A6aK"IVy/^]CCvR_T~}WvHB+1Ka{S$0zNa)?z(^Rxh<^8ܼGn(7}nYhT6/@UqQMĬL,>9#?︑jJ3-kHྥnDf>S00jOD{@Z,twGYh谸shAQ?!CѸ=Yf.6"Ef:'FTfWS&])] :R.dJ?ɩuFc@|=Ɗwir;ʐ%%_~DPYt~Pԥʋ!G` P-c:wMUNE~˔+-p7tL Rfb,t;~KM sZ{;Xu/_5" 4T6ȌUZX/M⿯_'c}̮8z C,pc &7B;n}'6H'Z'G{ͩs4tHFK*zK]-j 7De&ǀ6ﺣRion:Y jtqDaV(N`_w-<ۣrW:_NNS,zD5Eh^4nq=+d_]4. YD: +Lg77L :9Uz8FHЋ6sv'&%^yGo]:_VC9:;\t'% M5l7gU˽2_J!p{T禠iU2d#sbd47iR軛"U! E+2蓄Z9 g_wBcb2HHd2^ o3VbQ*8 |4ށF7I\}= 2!Y`Zɧgy`1B(ٽ2O}iO=C 4l&_'3OL4m\\ =ГS $ ON:|!vԘ>ۗKzP5*r e9 lSP3YuYN//\t8,fǘp!-Ks_IirI\ץُ*xN7y#/͆bG9/eN=BV v't>EnwG{`' ?۬M0#*7-LڤW5H'VX%5s{O$zSI}GیB^գ±aQS`9KmS܉?ceJ?Wt+w)m9TFjb*1<}rw5&lWQg;+vΘMфQ6pU $\ OFswN&VX[Ebk@{'O٢.QEtnbFϞ9? %foY8*'457':]ȘYI9< 2 ƚQq޺ШD HP{"Q(1ɯG ^zd2MXwtH92-/K(_vF;vp73|+ѝL KOXϩh$ ).nuL?jϬ> .P/'6T<"ޡыoa8_j$/omAʢn|㜽(`ČxO>[99{kl;KѤ*?Cbrz4䤠p2qn٨?ec,Y$HWl~:g TxĽP`zEֿ׬J6F %gJK@7n0{Juɩ9H#<…F:x`dwu˦l '_veN Ho-ԩ{(4?wCP$%ۿ E/Ԏ"7tL>V{̲0A +mڣy[ q>'SW̲<xlK|)]4&6CDmr}[۬v*s'C]چcqսt L1Ž8|Vps aNƣOg+ޣtlI $O\fF Ս*E0q)u3yTvO!x{U9#_}h(˳[+iE3C;ޜ* &ܧ l3^Je*g]e&]>u1Ϛv;zɇ9JtTY6ï|[V#tJɠWiRrč#\}pJe9W~8\}֠ȠtZ lQ2^>zN͙TV)jgfhq9qߙъr^p}v0H k+ayr :-9u]>dG. \mg9~lo>-z-(`U/^ /hf ʹ]Ğs)@tps@c~,R1euC%n'èOiҺ\sszШMdEGt,nN;yD;ySj;Bx?si`; 賌5<{D@A!V2WOli+HSUɛWofg6i@{``I_S{NO㕥fӂ9DO$G'hJ#U`v 8bVCކJk0/fw')u~?5n7m:RR\&yc/7pABB_ng.zYlU^>:iAΖ]bQys!>(jHo7x`l)G=]I~+{L\¾yu*` h˃},}Չ`UYЦcU1t?;;KeQ9Yi'-u68qiIL\ 3O#slF;EHݿ9COrQD2o՗h SQ׫$m~\vsT\pդIB]4hgpP4\lŞx"r~Q'dpiA\v顝uGFAnz;~m~ʧ ,ZոJ)8ӎEx,MAfm&;@oVytkra}- 2 :j%{$9ӽP5?φoﶷN=pޢof^bZ1)?@7("Z*SSGKcEpd?<#ȹq]..gin#$R(|م h} ߮3sD8_S'[7pB 9p:C œH/UMQ,OM-ԩ9@tLc,CA"lImFiyU$]:fyKФQs~kbQ8d5t+dzH}^`h'` 5G2xag.Eaz`u-@%tl옮dBѲrAMH&欽S,%?60- I]6#wkCT'U{Rxb9; QtoEa-UE!W$JXAL gEVM5ohؒ!웥4≇Ev5\ʔI pղS!!d둚JRO3ͰπrM\<ֽC+<<+;CIcM&z,q'70&cw\b\mO,P& f$p(C9ȂBb ]~ _[R@P轔 ^b-S~}d Wqo >AYg[ _[\mۉ9XN䧵>%oi~@@A YǷHb֚_pDs~KCQܱW[G*y<DH m9 I?>g @Hd2.!tkZܢ3؝]B/,R懊&>Gw\XO6|ZE ëÇVۑ z\/QJ-o-,䀈mL c9=IQ/k,r/ #ї/sZ.'^=GX&ܰ=̶@kMjl{{I:8s%^N>ӻe{:5W(Ԭ@TN&Gʠ"([LLeǴE>hmE4۷-_reX7j8-9H=tWYć-UZ+mV'xPIxV :" 㢇_5)+eݦ6! Mn+~/'GG5tGT4KZP&g^Qǝ/S%P Y9?px,e bJGv٬L}tJ:}vbj)$+=蟬j̹ Q]7Dz H.KX}~Ek= iLC,Wd6^G%h*L[YLoǧhَ Jߏi!^#]r76yPZuHBn,,[%EMl4R$Jg#MR-w!!w5?`*EvxTfhм̐؜CT :&hz:@Gh_\YQ,jrLY9,= rD~0tҜ݌Ad3D(5IO)+L<1څmJfTR*0%x^'>^K9uRYlw|a:]~IǑckHlrd?8AN/%I`uz gG&6F@FMes T_"PW.?-$j׻2bגUŭб1 [AnpB[n~\;_o^5f{`;Ǥ_(DLs(6oag |.  Z4h((GxssJg3 N](/\+˟K83ΛA $rv$̬~9*OF,_:){0.Mk^v^-gGy% pAo R \sAO;OW0bZ|\|R`g`XL@ 37́o2~W9nBTHiqMuPs_&>еuriw\z=HkҪJ!I宱5fyKN m TKH z_V奔|Ljv1w_$+M>ׄ%qd<`J sIn$ՓSM_LLnq!"@"G}򜟎QXj"Zybl7PiQ$Ge5cOldjyHU/N;S5ɢheyA62lÿnOiK΃]lq*DiV%=g1tz'?@ ѵ1) .":E:,sNaEZq=wM:: [r T,Џ%laÌbz'O pJt!GI;ƾ&,Zk0&Tճ6 UDZ^>Q ϹsDggjH ňS@EV L_W tPrOLju #,<26d5Tv wDt&v@HkOTk6 (*ň;B: .~tÆ I(9C!;8;{5% v8I"l ] [cH[}L}n._ߝ.%3q=:clJ'S.&Jt^A襋۹d<ʵq ="L &O8UrֿIf0N: -Vh}҇_7 UZx(P)gی*qXz JTh*~ֱ 59e;Z BBy3"͹G 5~/$њ%ʈޒJ TZO9h2QKjZyeeEUL>%F⣁Dmt0I pQ M0 ihEc~y>mVļæIu1\'_+ۜqn*zғd8m AMfnמ1yM(\rBMJq(`r3ejsY<>'9,5k lFfqZeiӣRgrP PDS 5ť<;#IRԆR^#hv{h5pF$ S`h҄o҅i)=Fh;?7Ln)y({&vPҦOy{F!CyWV/FTxʶzsqo|uxrҒO6QXӾ,Xf{q +Wg,*5Rþו~! ]~b^-lSg5PsoY{F%q#.'Yj?!iFSw~u !PNiE<I%һ ꦾ 4H;&]_B8.Dg+p" 2 g܌8(0gyQY!8dh Բ$9O jirG&&uJ; ּ>w{`IִhqW%qq>T+֩׋nURDL]C3C$}Pcm*6c}_h5Gm-*r?c8au^cǻ`7c`iT MzQOqpQ7jP*S-4ƩlKMPHW5KIb_UVxʋWۘ-۵{S_\fN^y܍SU,"?'WVK@$/+cfQ@T=ڞJnU_4W[Ήkj2MOof\&,_Hv3&46qf~OOW*ŦtTՒe uW ,#%L:Z4!AuxGvq m޴߀M"{5*lH u0Mf1>e溜QtbCe!լ:^ݝ'TdȓoKN#?բu9IJ)s"kURj8kU w38Mѿ;7YJ0ușq5YhC|F5f5=IթP12p悾%+ #yqV=6 qUM$!,S4r%PHm2{H\ji" ȖM@gSU 6acyosWUan,3k6 d'kg *CWįF\3 BX n]mDzPqjrj_-ߍړǽdB@]6uL}`;gaiW Wi#{[a.{MN@N)0]2 hǺ1#魙1}'¡5,k/hן+%m ҏ@{C.QQ! kZL}Ke|&Q # _@4FX5r$Jc e-N:71iT&Em ylLJ}nMi94}zK9"0+Vc)m+J]()hSl.y5d\x)^&#]Y.ZY ΂P=Ee5٥wh s= ^QK%'ۛs08k~x8mf&镋@g]i,>" 鬣rHɍF}0W]`Àf _J_GglqVQJ^Ø01y CKVHK7B?h*.g. .;b{Rݤ\z4Q="Ihbܹ^@`pkb E- [U'Cauӡs?|]0)jj=~a{'BryJz΀7<6N]0ŽuJ~ly lJ*6th¨GY !K Ӄd?o؋P,KdKXpq $X؝HiKn_XǛ#Wu,4[) CT%#R8i %.1F53aRh 圛EyċbA21h#,,qv,;G!jx3?Ygl3Rl݆;)VdC:!]S ^DoӠmeן/Wc%wȶ ATH GƹQy_vn_Cjgn1~Byԝ$AMs 5Ų0{B C$( ~=oI nRz |#9Nel1m[P,,يΘ\\nޔ9N)$xh469Çke\)?qo_T`6oϝ3=W3hQ̇ o`]G=׉TB0k3>Ke6ٽǂKnʐI餑OøVeYuY]aD Sv$Ҝ _ejfebňD l\7hoYS7R0b.>Ki^mGҥ?Xk OL5!uWgI]2O]5O ΫTڶ+tAkGW݆R#?7Dvrgću*c7XFaਗ਼-@?xYV"ZR@aI3ñF}ni_q eN|k4NW=KIz"E*ql:$_Ȃe9:ZEr1Lfs8Kϸuц7h"{78>p[-7yRF39͸PeS.*(CD9{{Ca;[׍W헽HΏ.= xwO@s(EiW 5h@?oĠܳ`G>/^MӃU76.5aCE["2F70guyi$",Xutj3 ,Y$ qzlk%w2^ף(Ŭ-E]HGV.1$OBGe/_O(0 dXfj6Tiυ{JL&.cl~hwEl]14 \\2w]KߥÎrhx3,{ƛ>72H8eƶi7't|9)}=hIEV!!"p+$Nb -ˍAal%\&t% <ܯ,V́(sV HxQ7e̯M?hk¾hKH,C.-k):Dp9,OeMa |( %>KtZkD[-=>4q) bC0dH]7dp6eБt>US÷5 bkyM(OQƇEiAZnYP Fc]I6'3âlW-◊WؽQ+1X86ѶeWGy~HlGpD!iH( S?>b cۘԑ9ݫWۜDM#QY.Ε7f+ZgTymPl*-*cwN0h5sŤҤFZ#d L=o?ߒ:Uu_pʥrfc{3+@$_]afԷ=OܤGKL=meQ'?; O-uV] O6?jeZKDQޭ5%dj-xW(a)"[ E}z*:GUM5w(e OnMW\z~qΑ&-RR5nh1Gے50qY.E􎾇 bݚAr1J0BPSZe7,=txMZ5D-[QItM߲hg WoK? J6lwOf|pO/,3(d@yy@jrK tEt9<3X>vh$f*xiSu@? Tsq8p&\V? A'Ë?HWk%DL+ޛ |^qq80g mm H(OG*g =Chu"qvdwM$6+oHͫhQ?YИ؜F:uSM=r=M%Ne(+n˿IG~NJr/%In1c؇xbiuax24@,InĂA-Bm 3CFV7m[a s.Z9MBgS[ Yr 덞 NC,)s*i2Lؼǻ4Eaw5$DCjYc5 {5o%!]IZwj8TU]t6b jv? d3CzGl!Hyf6퀌t;R> SV8Cq8l"<ŰH4Hr=^ \rio:Km5P D IA#qGQ9 _{ 'Qw8G=+q7P~?/SL≎.iy8 w]V-dvr1ܧ<07gagQ%Fc˞k䴑snw͛I7x&m}l GZQ+ZFɴb5=dsrɎf5 hX 4L XbኊtsdܚV+\y9w+q}n+?p S̀ح )D7V\J([Փ8_CO|q]!ʑ ۮsFICWou)f)ݷ\ Nljb"`(H5%ҹF%(奅 i%eZ?jou=\4յ6UMa?oKs;wu9^Vk?52W)6p~tJ4p?n租 Zos z>#VI.d.昳A:/J"nYu(gxU>Svj!~x\l! 9Li-ƌ2lZ=Ruyq]mo*6-)pG2(1!tdu&USCp@v);C% '/o#0nL^u|n3sj6Kzn=yޚq`ѽ.qFP«-ʐ|;Xo猒L'/O@8CIsɹUz_qY5J\l)de~hbQߥ/Yɚ T&|o8v{(-]&q֫.n 'km <7~@DU9UǙ| Ίt ҃ECT"2qf1,' ladò-j\pX}@[X#mr~Ѿk*D7Ŵ18iFd(gYKڱ]573DwC'_&t7Ł{maΈH{{cցx3V&m:ZrGu\[>pfӢB<+̯nu922eT>kzXѩBSvH6u߽O_qo]".Ńͦ aƋ +T+X\G~5[5&1Pu7gtuu:[s ۠"c*6YC[:Q2h*׷_U#n.qq9/@j\WlE d4eTMEF\ݩB-3#!}lE 1>0$ mG" CZ|[Hj+1 /#w^EMP|y; l!lC;װnq[guF^N*+ Sk,XFQKӨp;ڝ;xcBa G:aW%*m5Q̽Kfkj’h5|a 9 Cn75LUc3 . ö6DloY>u33n#ݝ})[}\KJyXL3[ -aV)cyc]h.ܡUwJovpZ|C/U¯7/r,mOQhٷ$M}0Myh:w^3*=ư[0Ϯ@eeN\8ċ ٗ 934y*Jg)yslU&4s0㫶GrXR.IdŲWÎ!̻l5>`a;():L۲N*C-3~ͬ엥\7uUG^WïO-!ݧ#'xcÄ6VWJTjZy%NEnQ<iG+ .c<[g5HuVhaoGwBZK(-BBsʌ $v/߾`R8k/sEvQOy슯{(hBi[0v_ҜAoZ28X6|gL B8ͬ бLv ^eC[[,ڄF pR=,~TIκa5E}Z֠:S'0~*!_3Y,&]b@vL0pYԗJvx"R/i]i%J[ 5Wr ␢ 0~xg/4Urt[q>F5>)Z2Jis6бQRXK<)>'DҰn^z<7^\oʍ,N^y,j&`& ޳:3 6E[k--yw#aO]AgW~2jlFBk8?ǩ{DT[BfAI |¥~ aK,ZpJ2-(xd6qbUQKFAؾF#7 Ux$l}~s:7 Ҍ`cS%;[\G[~ rGd cc IZiG7AنR_J=*Rfec`S]qiUlcۼ53Vrѡ&&0unr_b{N%1Gdej#,w,\z`0f4v6>$ih{83l pَdm|YF 䝚i HоT\2^$kN.SM;1|\I -RI9>/AnuQMVwj*5XMAab6uG|7?z*$p埜PAkV((qy %;@|'Rbp$;+kg ʘjHSe܄ș61˪xI'`@A:`?30ե*ĺgM$,hNRN*A,=I"d8QO<ֳЭkۆX'")+JBt|\xmZI} 4]nTu.ݷR:,K0M._LUKSbb͛Z,a%euRbɩk܁AKa49kssWI `$\z' &皱Q1ϟ|K.遘N%2;C[(HYZVO4rӳԞ"/#y֯ߪ.?A xМ?{[PjI\wTccE(0_ VHל2!\1>3f=Nk"*ǀjCͥ6&Jq$ϋK%ua e<38Qt9ZԖqS%VÆ eV0wЋ@G\R}g' @!QzlE޵F=,K)Hk-Kn3: ?]߉tP.N hInPrhz6QܒM>Ckc8_sh^F@JGS<Cǘ.2Uh5qŴǜx>΀=w> ` d:ӋʶIP\t$4Aw%#0\I;VKrqlg-j]F=؞(9{h׉ز2 . UmBl7Z#1`Te6\0Hk[Д i_{FgXKXfbG i⍑~ek£{apO'xsQʙ3R ^S׍L'T 5OiVVӟ̊Q*BD 0dR456t&J@q% ӆaN/Q#nO5;.O(Ofz mTMrܱ,WܣAId\\/ޘv_,`Np0_%Jy~ȺKʹ#B,䇮#XXRө_1L(5kx?(%Tl6wiji*Whvđ,>F U<$.^k!U(M@Qm'$?E_^"zJsCfjt"]ʘ(* n\cJw&A\$'pt09*%l)%@^#]uAg#g!w"ʩ/w#S ໼5`#!W>7}?)ڷK0RCo p@:%2n mx9a}EFt`tTn{Q:sj'3VJ`MTX{W4? gÁt3eeʧu-%<\|DN}.~}T1_;sJ .me۵J2d½¡&Gزz-+*7*1hnmta 4Ⱥhb[򴔁wݠ0k9.d,E0 dZʣ֝ aP/$/#<&-< dhmd *IG1? > "ްc(2<4/ܴܙz"q RD snC `4rϗ{@K es^VUWQ| eq C!'DRΥ+#Q .ĎyŘ,쵻5q|ϭ,z٠lJnN6$Pֶ S9{ \Ҡ&nm PI5]SugE p-m$]>H.I;3T%E,alB?Ԁ;go?]uRA:Q 'a% zp4~vM 5!ob%(D,p2gޥ%;Qyo.3&6_o(q7]]yL9g)5i V`a= ~BJ.l2˲lh(,ƒ%#(}*T-{)uי}'5a^9yRTwp:ޝn$ ڝpAG2EF'DRt΄3R7D]/Ĩ0m^K xl8q tQ%J0د+wH⚩+ڃ {D'4JC!y%Kg!YqGyQnyeg s۵^JrN(Vq洵#r\AdWi נ])klPRV%)$T`:*FLnrpIsZpg@"IbU Н۫D\j7m,ʒx\~G_LGy紳4A % ⛇ Z!T'tOE9r99e*I@Hc@dܴ<@ eZVNc[Y^kdpB̵*L] \1'DׄjyԌĂRY,U'НQ Z7I0xXc$IgҗG m(z 9Ƀu/i?6m?k8\]ac۠ez1cYkOcieyĨ b1̤ۤگkجdɑpyIIB?>'SOBh'ʮ۴XFM0+#6j6S%W5NU⧆=7%DiYRVh/ *6u.A1K6U~S= Ӯ@-6Z\ l.flt-ʊ_:zhL|!N 1RU?yj+@k)e~| 8PüPҗOQy(0#)ҠzAMd^1s@ Jfqm($ 7'bAýk0N5u+xAP KMh@͕ѥ7HuLU'#j# f^P{̚P^ƀT=ښ/QEۭ쏻L;kYNΈ0 |geC#@8Ʒe6i8ñ)B}{IW )׳3^s1g35̸U{K[9HduBS[h%$s]2ZNa{z5#CR^VTš5%,D>YXCV[*"ַvDq(+^;Vl,>1c]i:KL?8~eN'jY>DwyAZl2%IT` ffZ*+ta3vʽ?!ܣ:"Wf06*!GY:3/'= Ri<|&|{]Xц+G}̋8:Ǒ ^6 TlgVÈ ?lѮi̮MpzW$9V97OJb[vAEU4 0Y+oSO>6{:P'e.(rZR.݅pK'ǀV)khg-+J|J8w5zjias6A!"ds;_4Eh·^:Ñ>X #bm&B{`x#zaJm-`uTHA^Smh>k%Ft;@T[H?7=Ĕ!nh#A?gဪzX$#6AaН,z_4if"`- ollѪ\O)[;-3 uF[0g̠UgZЊ䟵Zb Uy>1Z.2ZE4?e $#Jn֙`) "HP؊h̺`xaթ_A0$ſDRG 5Ca2sA~љ2CR,w/k'N3NX#{"'&\*+ߍ@jO8:ģwhQ^" Ac w}&|/02Pd"Dsd2BL$^SV<![@S(jXdc9ĬFުf8.A"Oݠ})K-,'<|[fVo濻1ʼuv(?0~a-="Ti8ps[֬kʼ+c- ;F |s 55/i;g\|?Ȓ?Rq?A~8/Þ)WtkC:)JɼUH{ƀ cG#d7;FEs0\KU;^&[ה!uoVe r8%ɏ1$J28z+"zD|sLfKrИ*tM1Fw{iZf.q^sm] %ON@?< p :JEe4lyE9k )e@j6/IJt{yk5rJˍV+u*̤ ޝ_N`Oڔ߽.S %Je7ƭocw"*YBh/n4?TLOƒ?هV\m8FR|cGق+=+Kњ6~HpZ1R7@t̮.U=ՙ"t-9YcXCԯ'2HC=BӋgZ8IjHصrg 0%:C-3C:^h8"bI)T0ebGCԑA1мuґUsɄ$⤍"أZ3%]bL"bP`!:NNא9t@Z:vI%~ɴV"ˈo`M_xNx`o$?_H>Vq .T$ <b+>)~i4uKun8ͺ!n4r,N ~04;#1b:){{Aq٧MInPNuһ5[58m dCocKv2T81mIg=,51Ⱦ> QB8|*amA w' 6zڝb-nsOҏܛpjStցSϊJ*w%>޸O:!&-AB> m(7T7h5jblܣP jj?j#(hjL;;ɲYCsxpr յH.M ^L9|/bJX΅Q6S}*݉ M}܅Dsu #H@^ 84QH olOdggoω@ލhM}7}Ł Uz&jN2݇%50xӦi >ۤrԳHMn`+>ptB )2V #=K4zz ]ZS?#*~і^(W؜r'4k; J,}}TL[1pxV?mlJhC0 {~u]"/M{\пu k{4t|z,5>q%Ē93^(<Zc<ϊO'1 8]ʁ`ф>YёN9}D @-=F]:#$f!(t+YU\%Mi17 lC# Cӣٰf+5xןv j,!WY?ץPXI!|32^P /aAY!$<@vDw #yn]@6yIXx)Tb+.Խ1܎x/h7dϭ7W3eT}%D7b&!\9_XP2iljMK#?lJЈ6;5 %z|ea*]sE1A * {;nEDt?m{jvBb?r+;tM@#~j`Y]h#7t %*/hVG*(ьHSe} wX!qM]Yclq ٩ҜۗXe4~FгNܹ =L;f-Cer%pзDwU/As,|od0$*:W_icʳb/OkO8 m#*|a;q<̱o)VB.ć+w"[;5clԨkZe~vz?| ,w@f6Аk;hHʡO:y3SjTEa #fٗ{Lȣ6̞PAr 91G@q61'a  Os;$}[N : 2]fBNVk=H!# ?YApNAx=,б@K{}.$:Fߟ>ww}16' to'Ja?e<Zdllћc1m'h@ 0 'ϦCegYIy%/r)_XɡWKgW:jkY~f]fw|':yiod^?ǓIKqrxd,'8b)hJqJ¯[.C yYi-- >zFOL\'e'F#p;C* H0+[i{~9F:S:b۸Y"*PVkg0MN//wH/X{vʽK︦ɜۄqt ҵDr( "Jv5H>b{M4r; Fep8}~@o!qX' El|haDBZ5)ٜVKFDZsh4`ς dR vHq _3"PUĺ|?eTE-lnk1cl!V6u_Vyea'WW,}Rr3%h-jk@̫y;ՕcV!Y*ĊΞ蒔HByY4uL˂+ȻX#E4!Y5oV nx0$K<~(i:yxRbSQƨJBL{7 =dͲ=4EA!XZV L-E}QS+s愬OV"ȕHl[ ~wue~N8>@ m̷90էκT :^ L^v |L\?~p'|!k;qrlm(gJ•{N N<] f_vױUaVdmNE7q.m LR\.FP|0?75 O0*aokC:WEi.Ac+ k^|%x|)Do"cTR<ؠEτ.P aq.<4n5y!݌?~_ǐ[:ns8NTsagʞƝ2E:3M먝'߆8ƸZ?7:aüJ(͸5}@-5neo٥ meh&2x#C''!% d&isY .x;S ԌXԸ837??2 &['+OfGł}%(ĝz|_Y7ۯx ?u%!z{N:cgPP 38B=;q!b(j1)oH\v)lZXi(Бa`2%N)R3 j,R<1M@`LF^ԓrK59"K1 K)Œ@~ 5|r݅je-խN۞mu׻XIׇO F4ejْ0?Z^aİB_h9MkD>(OSwٙ _jσ8nHQHR([oJϹvy0ۣ3~Jk}~S7`{T4 =r.+MU]yT"d lQo~l\Gp8%ڊ\8h͞mX5qa[AfŴf;N-VfQ7gb3K6J3 ڥJEWtؖÀ[ȓK޼e!_AYv7P%m'HMSxeWdZGVRxg~gWzC[>kTzÑ GVNXA\s&Gz8jyR0K+mH& ?O޶~zbKn͸Ͷal R_{'=d ~{iP~A*lKoM9k٠M9Yy>siL44K!>G'WH,^ƾ:)qztKgﲤiYE;3[Rvo{U:SzΛVgSIo{g\Zg3s ^Qh.~H1VfIb}Rr]z.`Vpb;va6>pP!ƃffrz70@` It.s=@[ɌfY b(~twx~B<%R:[Ыva4Jf} ]\&C]*js_LS(Ҥ3rM.$oY!D箜vgP|Y6+-"AâDbǮ`h9'vu&Yǵf|KdbDN]yʽ"5dYI,AΙ HNXS:R"3p \Q!"yu:|Jq7aF-.̬Mʵ_:

Hnl%؜ZWOBo[2vA{/_/ -tۑ-ݨ~FGMVѦ4#ܖ\ܐ++B€trca?WX=$w9w(YX;T#%F.uw0AYǨuv~51.yM,Ae/gW!VjY h45yS^bfj7dwWͲy?auٚͥ8S'K+c0=X1:M˧Bf$!!RA Q/Miw=8vTGa#5' &Td PtDRo5jK GϔߠݏS&$EՈ1M)h>x_*jG #0 2)B Ŭ=kv$?yplnJ;aD3kh4l,ႣazD =ǟ; -3=_kT"\"Tu]$W|~Q+5#%Fu! naJ j{`55'đqQgBBNI}Hk!~5]pq9J.b_TeV$ĕN X<7Rvn8Q-Envw񫄮jUX~wϥqU?ǧXaEঈx_6` l1mz&] !s_XwCH"K8$Ղl[C+>TdaƤY`6ջ942qۑNBybPs#pt L _SN2(]ew.f1aNK2pX f 8F jێP F0U8Ш<۸6g 75̫=eJp<\K`*P]L@,Uzii8CQA<ڂY˺VqIlN R@XS1 02AYD-?! 0{ّ}5}Z#qAa)tr1i=s _ؚb`,{[6=a2BRuYX-G ;#ԫ;1!$H5@E>xQLjSM9+ fHTُMQⓏ-D\15SNR"; g/[QVbRK-q]W( 6ʓ׋I9<j%?ӯ@.QqGfgBr۩8ܭr(V7qziPqlt/NY?z031O>*0lWNݢzHXNdHdm%V-& $[OFb.L0.M.j;^ER)zpݖ5O! ÷G9$-Z;U hP'{2 6-@ޥ &ڌp Bշ(@`1w'f <clVDvC-,qI{53X.K:9h-mmeu}}{C)~"PCUӟ b#<,l怑QMd90Zۡ{ggZ}$"\'[Ԗ' 1ZޥQbwVStO<’H*#7|,SNM; CnC˕AE#m@G78Ye@]t7r\J@08LWoHԎ+""'xEѸ3#tM6* -[ oG&ܬ>: 6Z||s] mX!ʚNDbՆP//|jK = ]yqnƄAS@U5̥kN[U-dy70K|׭jXGiƇք&Fyl/>+D`c \DFSCV1ռ?7%n|7@_S_䳮 Iܛ)Gro,.rO)L`m,F2YM5G";Q=|pfSЬ12!d)]̩KZ? ];L׶Ax5MZSb?彆Ix U\ 0{wϵgY KJj@C#B ;BRt5&TGSs{\~qSLCg]mг@ ~u/fVdd'uO,u'v~M)`RSu`ԛ-Bm,a눶Sf0[}itt[Tys4ZU&6ݣh!]?[s g4]̛ԇNof0h.]D㍰v74\hʕ,R٦Lknr uDe!$3Lt:n309F_=56}`86|\[H/qORuugZg5MژGb0<^ ְ*l_`Lc ?, znu3(j/ E~opymTvfQuej$=yt||iz[W1i(ngco5c0yaaЩqn)rcKE[ak=Ӂ%#BuGnc,Y`KNݸ3[ ]]|2X!ȯn 1#u L^f/T ^sү09Jttqt|i:k,~K\,8";x s.n/P?ɬaJꝤ6ЄLD*=}ŒGUrLq?NAk0HX */k3g2z~ /{6h:MVM;/>/-P}z' ,8Dp18yudNiyPlݾ# KuɦW"g>3gASz[CV42i ׿ؑSgg֏FM/ 1imuKuŬF%mof.@랸$4~ogp5@%;35#WA Dz&11;"I~0Zo\2R-?9S('S&@b./=gct)ДDjdyɳ D}/~u(MDf7g u|.GeMvwTԋum #d"aUoM z*bZW'H8Q륶_Aپ,C>+gez@fJVCZ!k]iPM[nuwgHRoJV;k~ge:!z]?g)! ~ec@W+Wg&T䇣{!}a/jhl|-1h檭iy}"&ږuvst 5yTQzdwÃ+S&.Y:Y "ޤ$݆eEKy1֒ٸ(!@t/Xĸ.ȉ: ȵYu54l\μƙ%|>n~7$hO na,*䏲9Q,C~T!mҠMjtK3cA8أ࿦#|9 &$:;@ʏ/X U:dg2ˮImr4ck.rwdPKQoqث=qbԊ⫕P``6qe fʫup{QPqw{`0_ıM+T) p ʷgRk6բTS4/`)rZfٙ#P6w8\/TT*Jga [}@pz0yhEt~oXN#MqmڀvqQ~<'R |pP!4ep_jߐ;G΂y&OFlPGU%*Fn_ R9Ӂ}=jsCQD_֜5}rfC(S r**i'r%zy4)%-l9qKxp P0ѡykXN{HƖEλ\ >'-:)E K_[&Oט3 #i_T SzJҝ7QSߕ op6#NZ~b8Ph9"% ʟOzJZz>>6p%l>M||ɼ2Pc?EU' m a=⒡ÂLo>L^ u2%ԌS^c*V`q'%Z/C Ʋ3T.lXEJIw\$q=av[0Iʃ>FV4<ߞ^uӡb[O* ǣOZVD*j& Rd1yӖHO.*ݚ*4Y| EAl<+F<fr*~ {SA&ڡ-4u9 ep&:럄G#gjz$Sqo3ku(! 6Ny((iQ>Hk%]Ba䊱oib#5}=*Z_,mFb!O/!ny%2y1$K1SJKJ۠kq]2W(sb*X.r $ l acFAB2;(pC&Bķ| {l [mi׎ю9uضBL^BHuޜ,,tk:Z~oAț7"ZgF? BHgL:Dd'(j9x!fڽɫd0v>CMN#{xVu+T ܷ݉?M3f|3znZZ굆#0NMRj"BMx|>ץ&F2V"{~M8F1rE ?QSK-ven5ϳF8_ |0Ǫ|2!-:F̘k`h) x,иf+t؏ ww3Rn^O8EX?#GR킺$P]`KH"xWZde 7\s+1v53W >P`M#U`̞2ZKxu.f;~3⠀ {`aPV%M@wUF4sro Fǀ''de\eM/.,%Ɂ "Ǖ7git{8YX+N\8yAe8ivoO^%"yc{ ]ڣK2#UWY1dUZ}Ơ>t(&S]LCN;M WD//\f)UV@tp厈7ېS;>kMxwVytJku吽 Aq{7|D>'Ő0$yG')j P'u'G?@WдPY*85дc [`GZpB4||*VLգOM(Ʃj=';5+-_=aif2LQxBO*_RCPJE7$dp_Nlg(J诉9:#~l<=NFKeco-:K()igIP r9a2v-/nu˟ M:%o}0+i>N i5AjCDs/Fw]ÊQӭ?x&UNLbRA-JV :oK+E'icorr_%5vqOΧWd~%_,K~$>WO.d ]2{dKz%.TQ7vQZ[rΑQ'_e6!gd%5Z\El!Db?h.9 ՒX*4G0N6h\bǯ.D`g͢CyPږ,R6Yz0cPG=/-)Nׯ([N p76Kpj]p}1И3Q"Bړz""6O7%N g|&xd)NF~X~ .!h-zlִk @޿ztK)?{6զI&奍A&:Cli`p1t55CcgȮDبN* o?e|ټj9{'5@ѻV]Q",1 sʅs`lgYWVn->iѯAr}eԦ8NhF9…h-1),fۛCE1|X\&C9Ş7οxc',^q9._c!̪P}>@#p; ] =II osb繌M"&y.ĴYZ8U&?|~}8\))aKsU۱@%A~+_vsk=v>£uP p$K.B9ܹJ%"P{8! AA!TԱ9QDI({+861L"m;VǥQУ5mf/<سF!:W{mw<`?C6L)=ϴfP1d+G2iw0g5(3^g ·K vkVTW\BCm:aYN^f9! kB)OWN>>jȐ\[*P{qKJܽ pآs{Mh37#ˬB r "}+輻+B*ԍT$$F[4kkx'/HxT "NEP$>Ѱo\*TCX'O u z" aQmExxUNLA9Qh! 9J˯jPn@e - w?-\(:|].U.IrTh92`}Kjw3x!O(1zzwxP|50Y),9f;M _Wb 6?@O.u5q%tyF؆5o>^`?Is3aQ}1%oZkBS[?BAo@*R=ZPt[GWO9UB.nf/LݿˎL|Z܈%aENN@q0͘mx>ZHO1]g4I E!Z@+ _*I*A栔)8̜B {}w~eܝ0Hcp]j]X6VD  1iJ|}{V!8ɵ<p.qV`/inP!uY`+wfT4Ķ(˂Dw&A$V -6,n1`ؗw [+4풹!󂍠QMc6#7#!7LJ hQ o&xސ<)kQ5%=}I:,L7\! @ ddND)ĢN5ZdS<T]ROԙq q49DiA8q5Az? <[HNW;)d1in06^-ؖvbc>- ZOeSdzl5+<#fV@R_2zDV3^aw|ѹZNlhW3L3A 'Fx&YYuu?z { MXべk;Gk$~g:dSʪE্^Z#ƜQ)% sTe k?r4ٍj6C ''!|D !šsPtxgL[W(uةg\\K!2_qp(ΙR$oS} $%1HYjucy͘н}gp_M.EW(QrUZQC6R W}x~Q)م֏ ݽTJ(Ga~dSo0VlS&ܽqN.U1al*5#)7\7MhΜ᲌x7g7(gI ݄%h(\ՠ&&gcYTn 밎D]|XnCA^Xʛ84_d>Lu+&>nR0 w*69#ߤW!!?zH -?1s&é~ NYr]&={0|z񷣔(B?R4;L$ (W{T҃z$<UЂWQk͉?1O,+8Аa?rϺmxn1~h:#L=Aʵu"Rw-zzڊyHg zyϧR RmgO] Rߝ-+ ~$pdq%$]CA`h \"ItRf }.+ E 8>k]{B~B^r߭ 3CEC/}T;ӍmaEoȷ wT˿w5S.r N6۽m @2WL3(%2Ul5DŽhӬ\!׊28[P͐RY2trp_-q}fA -A@(.ُj:|^?݊NQ^r@fIU @o=0m>UdѣMԝ ;!'5''Lu_^ 3YӔ~Xa. ~D>Hz)6Ft=+5a!rS'PRfdMGA'L ^{x9mR/zv7 Q7\n#Zw@}W?c'B_CoY$X?:{],*2gh}a7Lм1T]y2 trMW)TQEzD5^%)S"= 6k ߬o^ָ'NM>$:`ZPIA~)KBeг%"$t[mþ(gf*9eo^%Zrђ% 0*$4=M >L ?ֵqb`i]G~v ` r)"h/L/ux?0&[ Z`X́gI E.&M5%-̸7KT8aîJba]4z+&ljpNx:i8+Ĵ+%OuҗztQ$k&i&}+G<}NB@[8cIɛLX9̡2?N ޞ"-jqGIer@uM@bayV. ?pE njd Z*͛{gkdCFW @|7Ȳk (]SUe` w2&t!D 7iC{q*1gAOZ]Z#x!M6řZ&>`֜0s^XF //Xܘ7VF  e2Qy\?/'F7o{NK#:k8}v/iyA-vͮ,$Ѱq9J>gc{4+ToK~ozA\xw&q[>㳭5T8pxwpC'U}zt͉H a\@LOKMdSC~]WN+C-&cF:(uJN]rv$J&dN4zٳg<v??I`JxvD×shڄVc GB# fd|i;}\JMYDj&<ǂnnnpTK74L_ ǜ^='ZH_ǀ tp>>Uql򔏇I]m^qOk슷'ïjB2` R?C? @/VhOp"}v"E=wdVMà)3.#3_}RKL(~Q|_@ܦ:m{_V//ty$UZ^6')ԆMr;FĞvh/(?;;j>"s%פz%2pb 5 $s98KRX}P(Ƥ \y6d.Dj(m9]hUbA Ѩ0l!y5T S2Q=UЯA/QبAn,[Z)yD\.ΐ( ~[$;c`";=׹,9, '@yJnTPl?ךL%wjPwS& hү-.Pz5Ậ 9/:(ʰvΆɺ]ݰp? +EynUIň՝xW'N3A'èBF>e3VE_lM_E٩h2gM}K& v n:bqZsYe2dS訸$|ա( ӯ5 5x3C G3^Myv r7ط`D3XkmmldDDtUS Ĭ:.ZmcA@[/{ccB2FXΕI*';X2Bm)_"}/ӑ{<|y9 /m_tV_tON䈠zK_lVWr=$暃glMIB1\#!#ʎזFkEd8= uS g7Me;j62#F\ 83E"1>Ocᱡ9cɃN%DS;ɵp w۽B[lrs;FݗbR _U~"Eri6\4˜%=$ôҺb?rA!0Sq{yIGSH6ܝ" o =RDefYʿQuhځ);y]).1bM]|1@"~t%N/=K|F57x'u iFG6`w?f>3Ş/ flaOі!?hhg$.1fק~^9: Q:᨝8NnSM# M(AU57O34-(ONFR'E@t[?WA'5 W]7'יKC{H Lm]aTq=+~0;q"3lze9G 2 ?h) D7s?~ tjiW6lc0WdgrMa%3W'Q404bwEcvBuXju(>Ut=f2) Lߎm:dBy]+HW܉s-1B:z+pHrOKbi11uĭS0$ 4p-[zM'3 HɋOlxopH ̶DbE.Z_F$%*Es#,5JOYMSsVEP$ZPBzu!O'>1"WW屯y#ER--\hEA7L=JtCR?>yp$!v˓.PڄP۸$tl_N[k`Ĝ` "+ iXT `{!cաjhǂLjrNW;tQp&km ,Vഊ5V5BcyB%}mBhY+j|&УYHޖj8B:rXW5Y`kfn8ŤHysڹsqd NIm houGf*Cj]$d&DceP!c?3mFE{ - Max<೭*{H/iGs4FE ՠ`Ik_D5MjM]fk|Q!)UPx=EeYDuU⸍ ;qRM >) WaczR`q9ҒOh,I,L&( $oc|U<_҈3:ZuC)8Ue%L84hLc9kw9_&_ I>`13~{\9ubrLE7m:(=՗3y6bӼ~ɟAN7OG:SZk~n#I_fh{WYPyk"1 _tt;6Hia`rX4)OxAg!䛛Ѳ>\Uʍ+/2dbDǔccdͩ}Vz~hVrUoQ|bjyمQ .)6!Bl1 7Ẑ rf9Z8)/}]`+ߌ'!5:՞-d(8F&P2m7J(a9[Nd!7E[f0M F†@w]%&qT9qz5 B~g2Yl{3+ټ hdS=lw:t-=GmfU,J=һEJG%֫Q!.q֏o'B!(}G\mR ѕI'!3 _.P"Xy v% a:ZҘF[h VSI`@Ukbò=WC\X |*XBx'~YM'OG~Uo_@ Je b`Rv޼x@BSpQ9QJUD[_1crD}ʎL9G2&<2>r+oWϙKco= Xia N8AYIҿ_j $ȹ@oaߙ.oGă/t(zqߦ#M30zUδw-npF$SAd2bmر.u)kZ+X*nn%=ǣm4iXي/wX. qDe93^4ٞB¢T;O h_3M'-U]. A}>qn))낖x>%1A{ߢ`!gu}Ĭ:VWʰ緉 4jnfrεA q$J]i¥ 9zMOk"1AUb/ɏWgk; o{*~bAHNXb !74Z\xUr}w<&C+&W(kB6z@1I{tZ *qт:Q<jcE!v:EYO9h3LL/IV7E@Vz?ZvyGnmu*A<$ѩAW!SkmEwQt])w GRF(Q/KH( Sg ,uS'0I1 da+J:2 s ]!uǿj3(ڻQfzj!l +_f=gf|۪`a)L9Vṵu2g1O "ߤ3`'^LIK||Z z$ƛS Q9 +0Mޥw^Bzvno~j4x < d'>͞qxQg.9\2\C1\}H<uOxD5Nm73; Ho.뫾]CpvO}8rt/ӺԸBZV?a4Ǩr^PK5lsd%QVS ߶S[pljǺK  f(ǒ;÷hHDiwaa65XFI1L %[nL*3PzL9(2]+#ȓ2LIT Ehh;ڢ(4,JKWgFo.6tQ`u)8u ʿM+H\`ctgf>`ndܿrHe/huVΗsF[=)<OӰ`~² (Rr?+)N\gۃ/(/N DB2@YcD֤K^;C2VySy |,9BO S;@[[nSXZeSu=F $/<Z;FLufيXg^尾-Ov-3+qd9xِg5:szUeϸU( Q-kSF:[igvKUne0?$&D[y)plr, y썆>7Ix{zJW#^1˻_ !dfէlGV#=J)2\n,B*~5j_lLE } S7u'& =#s7޷g@AtwlPUc̽ Y=@WOFXIH,R7`GgeAvnpq-AtH@ot]VNј+~bTMz4t{f8t;Ud@)TAOrdj’5Vi؜OuJVq"0= QↃ! =B[M_Y+ #rdRFoq?4[T r<(SiQGt5|x-FF6-(KmUP\Yy9 U2VyA2l?]LRHr" ox#C>C3+gN_vLڊqQB zZq7?4萪0tGNFsI`f팱‘эY:I:kHwm|@KZN JPPH|AA $:*'lѹ~Rrov]W&*w/jrn0u}&~2,CzJN%Q¼24b,5Vo$ HN^Fa@O1^$>_scU{ݡ'NHfM&$^'C(t; m` =D@!9v=bM-]b^?5@JWiU*d!ZLs=UZ;#ؑ( Řj:]h3J9i*K3A=:":WA-ꘝ城6PhɗFxqUpD"̓>67i U_ԝ-~Ӑ1ĪI \:gȖ("NI_,vVtI1AR P Iѧ4ʡlu!;_z]8WpXSAD- }'"=uVg{]ipZj6 }OKibGωN#⨷aF>%p2÷i'oMd|O$ u\L,}-bp€ 4 JⓛI#[6v-ԍɟk?^+69qK:Bք](C!4V PA16KJ\@H-NT)883!絇UNJRttMPj/&mUwⱸ 敜uy=3#NeD!cLA+oaE8[H^ /=kQxKPzE(Kil*|ӱhzDBͼ}Lp"w',B`E~t9|b0K#G+/gFjH=U5DO/Jk4udaFm"c[N_Ow:0i-G73;Vl&Gh%JbA0E$Hꄯ>߰ԦF+y#sn[V`W h( Z J񑨣na n3E6ET]G$q R *CTĊn,zt=L'hTI8ҙcMm+Q|a h,scHY^81ON2%қ†ό'+@.'ǰDd?7 ]P{|ʌDŽg% xHaZ!uнhqNvDƘqki` Ysɪgut6&q3*F_ ,i3NAZSkȅ8pN@8B6>c!|1N2 m)+u5)@C<;N*= 1K1=Đ*txޓ-ʠd*U]z؝Q#C^%b{o } RɡۜyR#?Nx]XLړ3r@H?B2 [ h47f8X:g{Ҿk[9GLZ QtެiSpl _yGXw#1A}65M5J&D|ق:J$ ݑ !h ]y)㱨]F85*1l_hr gU Ti+D#JZ۵kc+!͐?R:ԩVcqBU2z۠,bӳ\ _DAOm˂0Rβ(,qe{#7s̀VR:LQ ߨ؋ >K.05-(2[-G6>N 2gWZn\0F3LKaV q]AVdާNz6(B=> ԵqUs}bT>Z{jm gA=Qĵ_Ey, v7oXV2mF5+Bf g>RE U<uR#6<^QT~ɖ<֮_qFޠ ~kT/}0һXW ^Q`d`9GԢaz蠧%t!n&55*zRت+0J?6w, oʸ5P_z!XnnW p6X`2e9~n %_.:x[ľϾؚ "a lG$9oNzZ5P41^qZz"s},-%wYC'Vf2#cweQ,Rdk9L-cP:W5D[RYt㕘4aR]LQddoW1ˎ|.ɛ4djaIIrB.,Us]{̆g88@ no 00ZO%MSIu]xZTs،%Zp8w3z1F/ȝAGO'5Wxa(c 65P^ RyLt=i! U-ei٘ԱD#.׀ ,ʂU%0gwu5`%[|2B$Wj'9]nTt(@D# k*k%+A~ DRM?u<:/eS`a 4o`BNNA!0ހ=&qYE@}T:!W.U1Cy|NjL}whkӂHO.R~ X9?iӘ E`3aInĹo]C bQvUZXeso7 G*C;5M7i'/}Y'hny첯fI62$G]tTy9!Wy.B65X!4DPm1:v`'Z5<{3 RjAq;O8oEy_M“au">2:3`o5$9_c"o"!t#.YC>{2yY0RAIlXB}7dI  Cy5p6ʴ ~훇 ET4(^K$яF.ۉ8\9hCzpfJcR.֐/ <+dX911mH? ,pɉDQbU:%eG9P zf=@{$z\0jEXAw]w-cp~BAxKi[%nGõU˿7U@*sg4VUr&`ˡ3M;͠hNj1uE ]1qPO)bg>aHiXr y0@WqQfUF񏞌Mu7@G&ktC8K~61cD B ne1r?W¸rH`z8G ![]E>֨'r't{vuG&3N<UxqgJi20N~ :K\ܓ(;4w T.*փq) l(Mþ/]"R( ؚi\̗fw:>2/g״.2-A+n%%}q+ 9>g֬6G2W#Jzܿ L.Lg9!dɪd׾5e;̘^-Vj10G(WaoVIŮr΄7]gqr)AyPtG [ͮSLN9-Y~hwLTuo9GW4Y8pXYщޒcAVҸJ_%E '>&̀7CTٝʡ]jlE%sԖ] Oޤ p6+$q ;3v~׭7f螮ʹ^Tphٽ߄ K죈'f}ypԞ&]H4R:-҄j'bh~qTt]}?x?*v/9? IF p\8#PMTݾWɟ4B eJ M *ǧ!78 BUO]`.|{卸3?VK`P]4;ܚud'H[AXj'rK ʦcZUj:=.h;7Scbyr;Tl6YsiM'ya}XXی6Kisoo5LXU/L_8"TU+IH}?6ɚ&}VI9h2ar}ZoKOxsmU+*BL믔SWZ",yk3׈C>4g] tºu$^+}!k˘77> o?f!YW`@ M HJL02?23Bû2@4Wtl̄r%bc9E@ςS)I]XuFE~ p̤XzE+;)-H&(dC>ei6]Y{p X7oH rL4yϖqw,^|bAµ)K;8TUtU sB J}* [*&+O!ifw]Hˈm ;>a^<:N8 S=TAR[lTAΗ}t$ `Om, @;A0>I޸l5{@(OIa~ GpO=iOŇZrǼ{sT'c5o<+/"h٧n27;zP+GFwTqlʳz'AAib`XI_܏NhFSڕTDڑ AW JyivP~`V&A@ sI(7,n%9>7-5Pn-H˰7 TW\pn|+&hYz/'aR=`30rmǴٷM3zQ( /ɰ K6Aw=5lT, w#BXnDjw07 k|d_*'PSռCHX{W$Rh%U RSG܇qyE`%d\ /"Y +%l׬W1/ &Q4^HA=fڸK9tzZ9dNCD.r>#A {8TrNu>68yr mY89arFfQ09p-2'iјhNQ `1K(fT9Z\e㼈מmKV9F^I˨N Ê +YÇ;tCxvDAekͲgqĠgުٖ7QkʦvZRuma.}xۭZ]LNL]v=)#%Q=ݶ+ȋbq0 #nx/D:0Tj5Z7 WVQZ=6 [_LInd5Z6¾y9laĢb*}X20OÎ\@dhgOc*|9/BE^Tq@Gpd=dR?B뺷$ׂMdB>v&Z j/USzjRCHXJtqBPzɨ.aGBBĕ:՝<Ð0^=^pPL@ryW ǯnJTt 躝k"<cB "54^ճy]a«Jt1 Bt>iGH~>r;'9X|JqyvM.=_亩l~|7Ⱦf7tuC^pC2vR%L|Ȱ gi1rY?S3L "rbѹK1dwB _ \r&?hKVW-)qM4r/O^ T!EmN"ĉML\s\!ٍle;칝:,f#u:ƻDm2жgV~NWrlb0м>;~UQQ;?̜.xfN!+x _#MJmsC6%01J0ZLE?ddz#/Q/3RUCO&HOf9`R)d hw?.maG"e77|^ -!Tbz ]cZwWYԋ+Qtޖd+]= M'K ܮۛ*5 M:PrދT'o u\J`\eo{^9b -+Z[owl1,o.x=u"1[!Isd;TL`;\?F8w55LlqmsxwF i_VdD-XB=VaZm Rdcc`*7d`#o;ֳlb m%8^p; : oH j8 Tu`҃~w~}lVmk4{ txt'FuJfO(/#!曍X?ɷ nx>ʞ4ÕDqڥp, ˡz"|f=aޝ7x]8NL|' Dh$Gt b{ H+^9|q(܀ ЁGԹT&S7h!7ǩB/gGv-meӈ!YۖҲ^F mHN[,ϻ5C^$ͧj`o]v}͍Tb|W?œmi5^$l~ghYD>rw[G _[|m{*"d_,EޱV/#h2yNO lGDmPt[B2矑v, ^&\qĶ?-%~-}Lo&M~,PʝVIʐSO!_mI8@)RZ>ÑK+sfG_#jM 3={f` a\'chZj ?A{d-ֈ@_{Q/sEult69P\ۻZ3(YxŷM.uSž"p-wsD`Wى `>^bh7ŷՊ0^TP%5')g,)WYfM+w%S=9w&27}ޯp1u:| ʒS3<`+)4V~t-V Lo)E(.#>Ajd7 wPؿH D nqN.W>hPی k3ƦιɘfOQ&*{]N6&7+ܼWl6O5j? hzj9R4?Ӌ#`Lx . EKZIUJ,୭3|"ƷF: ޷0Y|`/8˛h O]Eز4R`v(AW#!Z۠4 K{6bu~KGXЧ3pWe D4WZ4țIp JѯbBm@ӈXk]"`8e]>,VD R ']L'Ty0Wx N\8y?\%vſ$iSm;^"zz!+vY \}h:%"MvR(2j[e W r@gDt.s1YVhU(Mjq_޷TWo('e +pRKoSbifIAWvRܚW\'fSH`ռ&t< 3E Z?GdiLʑgo3 F?(Er [ifXdjCZRoK1 ̰``uܖ {'bDuR56nTl'qocҝS!R9=fˮ]~oUwն͕x#H-q2KMeBu$(#eX,0*Sn/#H\m1{V%px,"zL< x-Kx tmMro ߵr\`zs^06,"szdƑ}Z6Apo1dd0yAz[ X#D٤ޗ' b#ͻ>JRPSSQYBolCB8|9UD*IFaAeQ|C >A#Q{R6-7tU0~]kc`լ]nhb6~WmD~ JQ-E/"75J)@/$ ▊yʋ6nNj|q$҄)={Uё.WawT4SB̂ ݃_alC^N8-TBbM揉z0Bw )@u?o㦰)#~ӆ(Bz `K!$M1|G ]j M8F||S!U֖۰t f*T R hDV -Xu;Q@hKev8-')wQoEqAí6c 9.& HfW ? Wz eɇ7Bl;W )rߦ ̺RfN8EJAH+sj̧-Fjd:eĒXizkJk_~ Juַ .QV@fy& ,@ߒܘX*G}q{܅.xafNsJN S2Ni.L]S-%ȪY."35d(FI|hݮoϠJc8Kc%+qY ~j/ాM69DUʞY󰉆|~Ǫ?)ǴQ}T N^e3n-=?h',d:ĤkLSKO5Ce[! } !~})D!%BTШ-7jWРMZwqw`&0zmU 8=[n`siMZ.l$8j,|xG)W\Xaih? JqFLZ1D݄Q,_j5L4OGq:,jL̚":@۸3%k m8_JW l6$qyJ̿ yD̞S'+4RTBf4FтmvD xv;Ս mxy$þ;+xA,wK.`Iޔ~;V}e5t|p^x 6DOE&2Fi121X> 2AY}։ꫳ9AHK |49"Fֵ#;pzTE)#1*JYDzBPעN>=S.U& dI<>3Z' $ &dlrԠzB299g_{x~c5q׻[%/7Vebٺ2pGn!=Ce7DvqCdENAfm˛J2mMdg_-qEXX:'} 3*udM:j1op[2L!9JrpYlY"ϞV`m 8 R:O,MVc*tx/Wଊ_`#ndK͒XART9]ej|a0Fg) W劘C?w/ xɀ{9Ԟ:a(:tګTz0$_E2u1Ae6YL p)eûaboRhʳEh4/t2{ o ;aoSKXZ./ s\#}AbA>jJF%f=v*I*˃0ES:O -y"`2"[6Ǐ.ry!gWa.aXb*(d3^v9qoD sm4xף5>",ur6d4M44}Ҹ_0|,NڧvB'7r;cb}u3"qC)g0s 7q*B@kQ$ዕDW>Ĥ+αyVSw]Qm#y0ւǿN,Ԃ6Sm e٪,c8l@˄86 `ZI)p +.d<&Cy}Gq+r4N1w%TaӠ&\<&g(@jѷwDuROI,03/+$Ghƥ`:"CCfuS>>,5COþUMN 8@諽8f8>Sj] 3YG"̦1"Ԭ0pz$ʉl=My@u8| 1!.)(*|js(VXJ1BPֱ۩W!T*W~l$7LA#T⇴riwzE&ig(YL˟JS&QT_,<#;RQۆ}Fx?< ~vzH?d*4\N)P8P3t$zͧUo}4VNUR~)+@gW/o*8H8+:wGYOas1~VuUqGe8_NL؛{/IYVx `WI8JNqǙR{'ѿaэI23z\#r8Ӹ%J}gppګo_%(kj`17U5J|(5 웾Jp7Bf Qmm%k5&\AKXvoQ}ŸJ͹GmU_ cM_DHtZ3ٮ]z"Th\QlvOaש <_ѹ=2RgszӦ+S4uL|.Y6XXBG}_-Ţ#`i7XPK Hg0z V:LC+?Ea<Xa/XN,}PDmWyH\ʚ^~EןUiݟ0}X:&QOyH0HoO$EJQoi=|'mf}gtD4lOVy ZJ B}TM~0@i *\'Q;3f''ߣώAIˆz7m Hp)RpT~Sg߬X <թֱ(c >%DJYcS% gH3udQ)PDHƆ'A$H~ƋI SgW3efN 8 ֗B&l,RbYznML,~j_-/)XU?Ynkk WĠAg94b6mQwII`$E;QR$͐͞AХ~d|v-?.6+lbFMV!RQ?hҋ"呮])uEALcIy!G$qhT{zߣqƨLLz,/qŹ/oΕ@A>p`9xq6?+QU'CzLPkD Ӳ%Ѻk!/g*K|JJiœ( `u*o}JN7](U*Wm%#3m}$@ 4K7U"E e t2BwR]26fr8?ΦE O]IfztB Jw,b)e{yv51J| [!ymuTK58a֌2e-ur_* cQ`C/K9O0k Cw/ЅƏ\`K7﨣8T1{ .&1P.;- n+2XN HOA]̷ЮMUq,(OC6~J/Zkq,Ue+3VŔfxDQ>8hI< ןO$$XzCtY"LuSEӶOeE9ZtEng1$)iQ=EðF q$7EzГ#&u'=?= x3bz?& "\$4HԄY҆Z,C\ci6s3ܾ DàZJhg֮ U&`:l5/PTL+?Y?D- , L1E26ڷe7ܣd5n @o`ev.{C0Iau<{F=nķ@Eu:AC9*B'J9]ʭ;ж!sFRN 8,D'C4=hܮl=[F}N/政8~ &큦-DDTC2%y&-D(yQ{|!~`JPE|X_#T.U~YVq\DnI4N)*=(5"`VgD$\7 oP*_otǯ1ݑv VGR(iH{m+s: Mz;w`ƳS^\XSG/%OChmMQUraS.h._lB{+W}'ָ-FŚdvٷwiER L?neu.x#'elA}wF":>aYG+-->.F59LǿBmq{ˀLF1蒦ޛ:DV`-lAHERU1]([ELq lɟ&ʨ1D||,G668scͺ,j3T`M4=,}X0㓃9o~1WkJay{EH{Ƥ. trR&"1u,DI\ηv9/7OQe<Ήr~ib8*UTO`=+ۗ%uA+ v'N1yz{&/Ug_. UgJ/vwv[q -Dt{xh&zk8洛JQc`W1)Cys,R< (' O%rE4s Ly{P@ܲt !Wa):(lElsJZs@yiOND,nR/{ `H)0gل4X,{;Z }~bOi\or[a! :FYQJØ)u|?͍=%U, u#Ueb3k M\\TK9F x%y߮~.Ș9x`0Y eK)%BҹcUN(~*Pcl(hǫ /,W[Ó+]hJg*IvPF/`0W܁Ub hƕI u73e*ɦ G*f@u%`I/ MMf“Q1ko7΂^7L(!eʋ츠"ͮ!E%>p yRyT*$翼FJj_lHtNvϊLxRۛ?pWMBvCi0|㇃h^gmQ_piS D }TgͯBPW{ `288cw_]~<'LvD䵄pݣ7&#_G K%$$y$df2… rrmα!$ c>q2#D7 Գh $*qƑ)Im<sVQ7QxYM̈0${ؖsE^H9O&FF5S=6[*%0Fːg#?n6үD=T§} ŘP-W+#Cm{Lu`MO!iaQb|[?C`R3yDKؼ>C!}6>*CYv. ޱݱDWk @h /i6/YqC@cnEOۮ3w+DH Ȣ ἆ۰_>WD!OCO E`TM BDW+WYs&LP|6Rz&~e5}J@XZzȏi)i_xGV _#cV1 }Dc\WIVMLP6ev<ds A G4 o@Č=7=TB%Iddɹ /o¿?g>BXVIs<18>3K%4vc}Zajyc j:W%kv@-DE0nH';F:wFq2EMs\QMnǗ{8   ]G[&OQ)ݵ!7O܍_#hI0栁‰hZjW17̊q;qu`G~[N47h._ǡ/,blPgJ\~04K#QY\^Ps,** Gz_4~R/NQScH}[Bop,Fn@@7|p$›;7Ry\bv[.{9(T9)?Bc'k'=ayQj^}]@u;ȋ=Aax8{5 ,~z[w?&oK_5#t[1…{ Ǻ7R5tSE6j+P< SO%# eϬH䖝QZ6חmFWdT*;;.0oEUσJ}0# #šN]0NJnf-pah1^yce>L8 EDM5Z{HߢDo?IfY.}?,LvzP8<;({^׈z$n]\ޞr:aTmU)p9-s'yeIm᫓F$zSa35d46E.cERG88ZXHAd0Z RIFCl.K^?M|lQzY}ǰy MH(2~噎 ONq v:/UF1*{7rn9ZedQӃ\i唩xcL$bri}TGש棗:ARu: 3G%]KŃt n" xIDofIJrF 3/Qs&L7|f!qWcKĉQ]+_5 >'hhհ>{MϏ?~Lz<*\z")XSjM.U6Iہ>u (IpttвùB<'p;Ip_ + lĩ!Jϸ4"3~%Q)f%SatP# S>ڼ!?ޏӱ]jh9[ Ƿ?OMؙx' X˪`.GxpiK]U^_#]{ ~rmm.ؿL͢ Iz>FE`&NY/Mp qG4SJX6O<$Z{q_(pO^@JRCxjqUl#UtSrɌk1v }")#"{:o3(61?[MCڹƕMJ,\G\kiMϷ*}Tcy718Is%bY; .7!_TEyuw>7UH NrIz]A^˝q^CИ!ht񕧲&$) hE=sa'ux=3u4D]߮<MڟWD}չ 55Gq[6xG|C2w21Ne̠BRF9v$ޅUl|^>P{_A[XP="x0*#Qآ'Lߤuog\YB\eEO"՝> #HFkP6%C6a10w)SD' !Cq#}}Sk<wuA9~@A k&K: >YyZqHzwb*Ǵ՗="rw݉!:P)(uN+CS s]Ek9O/yY|2/J W2_ҿ=ym8Qu4ihp6"EեCHQJw.l%SM(uor{m|.)T1- ԕޘH?pOp}N[j wt@- |ɯ1埡ū{ -o\HMw G_;:Zt϶tgpgv"f1TX֦Jqp U$zNK0M4˕k\4|gZUE\TlHΪ4MZ6aDa#9=֥O+TL(dms b%8{aIѿ~Ċ\[$c ."8 9X }KHDzyO<\>JS^mE%^Ż=|PLw& Dgq)q8u+'!F39qPiHm1ݣ@X<[".gF'?#'&[Wi-sBr]O!}0cA}!)3cTy^^+tEOvGvхq<(+t+*/QR/wLg[3ѵ?LVb:zS*Hf`ReobF-ݳ)4{'2se1!7q`K;"[enaeV319v:=^'ExB`r;BTS--TrnMNI*c3|7Eq3.8\u: O<(lNI k 1dUKM=*rmgl_M!JH@&@>.OyB} ,!+ Ã?Iܖp}*Ee'?w|!ľ^icPllSe .r^53]1!lʮ%Y'(!vqR{o+ӣ9zP+n/}ީoE^rdk ڒOPf{|0]\["e~)̿2yfQ ۦ ~$zm\'MRZ)k^}~}PL|ʺ= -X#̳6tqntm)'ℍN&X j kqȗW︲<W+J٫y7bͫ#Ջc[ B^"8yAU 9awW ܁4Dp'( $?K!3sՓ6[QТߢx B}b6wƞ_YI 000Z򯃱NuY?3Q s81Q\խ푛0er3s N0lșUsg-pg:Of(x_ͰjE v 5šU+0ǀΣ5{i4 .۰s<_ ¦z.HÑ'C2Á}v8ds3€NlC*ug)&ZyJj*5hLznK0-q<75'嵄)M`1[[pM%Ay'PTHJ,+Kas]tv2œzK:r,ZSuX>iƑ,<\Ƽ'cB9a,hqb[.|3u> ̲2\< :w"̬On7Z/[rDiC)~,W$K;8UR[~0D㚔V8r$8 #_ĕKl6X_1&~,bR*M& +,s:"oTgH;k"P;y`~r<]ω kwb!փD^yV*]%*$}0QR~^WTN|3FZr~7C^&w 3f7DUd/=诼&JP;ibFsoyatק`z|CKTNdI uzרC9ߕ~;ErJ'@,*wxt_`y6 VGv$4B9Aj:@=`ʣ? fq"95yxCWQfh$[SUc+ΐ4P!I?|M ~gn'ЭZg8mzo5g}*[XDo2v`dReI{_&v,v0- \h voZêk+^FJ OCʱ0v8*^gI9ٲ׵RQyj{J< qCsx<ѥtKu!DVMtKaSRIi< ".p6 VjU`Nkڅ,<ӫ~UvpE*ɠ}Dܴ ]/ VmhF~ιnŜZb`iU9Gߌ$5QZYಉga-dw կK7%ļJXnqTT&{xr1OIZ?l{\t)-顶~ ce;xȏnbJEJ7ߑ(%$`:*YՊeH2uNڎũY383I?BZ[&1XDj$YOhd\!~+K{yX:ao%;ae xw% %-e!ZUj]|$ rUa\>3G۪.']ǫS?5x%^iy6}*`LQEE)H -OiO'?w![ܤ^'AV*5_r>({Hx]RjcEqGZ`'Y)OD5]M|'v$(f˾۠;]Ȟֺ")CIvS}d iCqZ-ֿ]gnrs vm~q)G"1Smo㚮\6UR\c&u ԧB=gAyĩT[X PoaZ_}}%XC5 QhsYDß[SyʩHi(s?jD7_(!f.tJN3_+jP}n20̄ ;R]pI\Tw 38iȑrB-t%-P*DUٜ4JE/nUbS @X:egxoBoAiS-kp+YS7 瑃9"/!zjJHORrҭŏm,-ɵS@ dVv/L'a0y> AVߩ&սWNqHay)$9{ SuXӌ<ە\B ;Oam 9xG9F˼,w~)fjzjl=ҟh8;GZ;66TS 0%鄵a bsj!t" Ħ,߀5k9po+C,AeT5V1ֽEۯjU4JsQUL8d+z">1J )ipb2zdw2\XcE[{88sKE< +c4w:Ď%ñwʎ1F 7bZā_nIl[PRlM*na-;,^%( (q[xlq02a_Cӣh_ v֮MAyz:8|I^( ,@bøޮҙx -ԍW?~m(Ц?dڑ߀fU~: 9qА2v>s3] \";O82Ky\Zxnoe͍;#C-sKT~1TX`)lf.ogP޴wDD&ɣYbfNL$!S$HUѠVLd13j(ԇ`ITxGSa"SP?? Q$O) SL"Xn6NʭqlP *|lE_ /xV%1V3)>pIqp()jL`YQ!<< f{ڞ֒_~'z١N< Y@yv׶ X}_.۲wۧww43d}>1膓,oR(W.2}PG] Oӿ^+j@Zl߃xifTTi%*sfo@|2lp'|8 ܷJho]ޣhقT76XݽsE# ErZEq-bsZI[3B`>1?\g̱t~knh_U]cX9x$nI-:6%}N|[]/O~/ x*Lt`)V}dl3ܥ^]Ҟԩjs_0]E~Gژ HuvKKB_+@V ^>: F)@Ȥ9 G\&s  $: o$ng#d,wDS# ˡfZ$nDLr l{Gt WB,"S&(#iLX\w9d96H#c {xoF/.g6]*Krc?o,ךq"*Ls}Q9:^A#򶄥3}q_†]Y)dW/a 1K {uCNw:ڻ(Oڪ#V9+%D N/tLmj'ʻR-E0C?zbqaqhh`:LԳ1t%q\A.n4F??xs^U@[j.OdTʍ.W. =4YX6ُ֍BZHyՌ`~?a:% G~ߙ;+e\xU7*MWi ?Cx RBg+ ?^O\\m)^FfUm؇w4heI'*{Ѵo ?AuK!i,c tp:/Y75ct.Sơ슲*Hf'`OW6pX;@@'2~FW2^ %֘]~@룎E"~CAS~?uLKWa'y$pyD8ˏէ,:/vIaXvlA[߬==.[A 2&6k{Yzx}cFpm9 o_)+>tG7bCҔpvK{3FE%.NkRf.71m8VƎO$/xz5&kQxnS˖/:AE6Ae鵃RFH1C꼊n7\2>أL@뭧 x~HvPBCs}5zڑ$@2ߟRFZ17eʖznY~^=0%D ^Rw82y-Z3)W=ކWYGJ4N. ZmaBHO^_9Iև6,mM램еt)x KCi-{%(iHis!_w[EJc YqcA?uhs-^ jnܾnoh߀1gq\b 7l#.:% xgqH?Q5Ի gnٚA1ߧa'9c51KK i =4p2V&uJa]466y##EczYmd<\\jL'_!CW&[ĸC`7T=50\l}lfCcZLfċA3/)̼ :ƪnՈ̪j@__3(7l mI#+F"F6Y'(+ߖ9ڌ}ċ.6US1GQu>W+NtHː&P ѣ5We#5a !3r D5,(1C*!0 u#,SLZ @E(>X>((ؠ26(o[3C޻c܌U,WO*izPb ˳ - ~KȔЦcs+$(|%sMh&j>?Ac]Ly^܍y$Km`PUms|*4S1j/`l!ArH\ָwqu{} L 2]wQ(L Z'E^0{KTiRsUvQF!Vo |@[K.$ ?f\9HI˂A9{gޔko={I"/;q4`s>_fQ=&ƣ(pKnQ~`HVs +F;mcK '22 U&Kc)XI>V))B(\^OYC2t1yc}C!l}MhOף;XQ~3K, 1h%gDFCn_aZoŕ?P3%8y1;g! p~ڰX|UXXˬdZ?ΕFy@rzۛBȷC:cm& fLtzB/!xK4,X^rRq2q?. ]kbYR<(no8-Ob×>J,  [iqAMzH@$@VQ@YZrtracklayer/data/targets.rda0000644000175100017510000016772014614231172017205 0ustar00biocbuildbiocbuild7zXZi"6!X@])TW"nRʟXgqjnj-&rYz{{Ph,H?5q4cqtA1|v"SXbCA!A*T:Bgqrl֩_ӕ"x _J:.%5FY*\]|_J E;bm͘|$.I/1 /:YeKR'G{| l7f1@f? ʙ7`д bƅs:=}\yp|i ).!{G UvJ - 7z&Ӣ&+O3Y?;jU,<6n6D| T^d;Ys/mE#?`$9<oj\K=!HSؿe]Qq:azi%2I H։rSN |r+||=i]M|eߒI3! .J5t|M9 ;\9 `A[겁k)x z>"5ب ףTvHPVc ~PkF~ڷ_s&JQG|n"Q! (L)Bbk9NDt 8;\X@,JxNe8PC2'scw5o/'H Wqiz_"YaHN #\La* >~~ORxhWaaq亙aOYdA&]EInV'7sw(5utk[< ;xA(9vTrLb٘ ڧNʚA݁cbESk&nNQD\wx /G\pP3GChITZnegLZkJr\%7y M=%JHy  ews6A]GFys7숷 \P>ҸxeY_u~ 2>ɮ)n* B*?i6Bwy6Pxoi,A c:>; G(KwregLfH௹l~ $ׇK\ɞT7,4 SAFo!$fGN9_41~N;X5҉&!EkARbC4JQ/^\ Ulr _:@;UI}HădЩi a= 3(hHۇW6Ѿ Y%4R,qCliqR:<{&..y($ݰFsS!(.k㠒mwYo%| rg=ω9uOfw~80 rN:O>`4%n] F|}޲;IwIW*7℉oJ)^2=&}F-J'1F>@3{rEPX`\XȺT*l2"O1AH#T]GSBA*,PM1! vDف 2x=D2$5 :8jƎ,( & ɬR֐:!oHnpi)Rbr/ufJN >pm!Ji`)UMiH4L6g+9JM&p*8_ʩi-tc{u=r^j=Zqg|S%vŔ{r#Rj&I+`q9<{xD],PWN\%`%Lxƛ,!1!9}k4C{(s!"7 Ϡf`HB5$\"/)|1'`H,љǴ&HW<$Gd HL8|a|#vq[~o:Ms0_K2dJӥP 7WҡTO#zWur˝#c&sFلSbUOiJO#3 6meb6\PqAaJ0ĂDش 魚 "*(a۔v٪]6RmTgzF&H,vxĭp %˚|, ꙢNmځ^q+\&sw a I(HKuW lPQ<ߠN% _EZmD2)+Tb׺y] [XCrlq^>< [AXNz_9*䒬Wgz*ϤJr:ODLh $ 4W=r6gaU ej',޽/d/uF?d-bkxU~v: S%mq 159s 'mTPB%f} bR~10j v;.$ xTu8%gai;k0T /_4l;Q[BثӁ!& 1t蜏p}BhmSH( h zuඛMRdkRan)'#R~^"aLK?BtH WJw5e(C5\`'"oM]A jo^b#l*fi̙:kX@F"z9]F',qz9EЃԲ:.:FHie ѫ$z^f)-nS3(9>2}[.)75]e7wI|@UGbD䈠ϣ/I߆hygnCMCkq-eQ ԉhgЃ@e_" d!;=X%[./[t-~o@IMgBC#!ij͉-.\a˃*i;"SF( }ԛ  :6O`]K0 1PbGMX];, ҳ ww&Q/וsNOa;p RJrR$|xp9O߉S-)j+RQ}zN{>"Q,.uv`(T`ZoE<2QV_;e= Wyi=x4[`}qHv|`MN4 fyKM WH?Osaspq֗1C~§4 Dr`}V8TrC>S1$|̰g?\]mZv?`t.q\aBQyK rtW4U`fAyu?yeh̚t^q{$Q~N ӶMӏNZzi,|UA[~;1#̥!<ɲFuⳫ4MF7ӛ& mݤcv? 4m td0Ɠ?g+ P?&ڼM-aگ (2qZ\A7ϐdC>?j_U;%6K4]2svr6=z=rS`( Vw_/syᅀozvB֋ #jݝfƚ8t񚏼9;+

;5ǗjsF!Hg\3@ հ: 7'>;b? eǟE xH3z= *L:9t$r&:Qs<+"65 `^K*Lfh9FO{>$R5Ƨ>ƒ= 6ӨrE}J&[ȝ 5su5hPΏ#fe߮jWnU! @TϲU %s<54D|?&|_ްn5a ۊqaqyk} sx$'&x*²Z2bj[nly|ל)̰T+ Y,ºTg@NtTJ~CZXf-ܜiI9Z&c5+i*QPsN؜a$51?S:Ҫ/pp^7Ϳs5U ܄Ev׺engN{0`B QZJEFsPaG?}E,xy pLGӈ}˗ݦbo˺-H/$Qwٮs;@n2`;; [-;iU U]xqS h\y=%зX߭1dWolGTyt0^ #QBۦ]uY[}2+ "CnF7-6Y,0ZXPqFa0]]5~)qyR[~{P|mZľ/{ qs=el$j)Oױ߰e) Mg_݃fFr@Ocn^Р 1 Uq -:8cWKp&Nu4Pʜ6]/ /3P!a: IK3dᇴIr/(B%ơϡyXmMVTdTW!<mJ(8em~oP `p>Z_zZUPp /[7\={e<-XpӟI[w_ӟ/Oy-ۃz~ i1=⧼M'#pZRLNY]O1uխ{N4@dG4%m?h8VFH)d+C v'{F(G=l!=HX#0~Y*jgJrd;Ei NfyOUg Pz!٘^w77f'jQ6|7\&E1=9 oJ; ;'߫xUYJ@ /nńc+d-D_-t^SMxBе 'YX~.8K@N;0DnèQ!PFp-t~4/8xc36VRhJr;RSmk+G#a h!6! qn8!@NcVC Akd9=-.73t#9I;8GXծDļbS  '!icI% TzH4K^Ts[I-a4ѧo5.,S}mPypGT̸UdSA" B1X/JBa\3~щ_4A ŀO4h- *'I=-L-nBckbz-T1!GM٨Jy'#lQ$wx=HSw?hxu~ ҆L&Xuy?^7P2'lX 5MT- 4U YIz~ -5!j`8ף#vUC1X4ܫѢm˿h>-eAۻ֝m 0"]rE-ﶙO9$%Q:h4ߓE2K898pPN" @`d//T_p#6$ #rsg m'iS~;@Y͵13l'IzٹM`&ºWqkel<\iIDjvTd'xpu6@^q'urN`t #*\צ.mǰ=! Vgqz 4%F4CHg |G37pcK/XFf_)& 0".vk(wbhhsU+0Ô'^iY蠲,?{7-- iz_3o}Ts+P\ :PP/s"鄫]_MN=@-ӆEHcB638QC3//L)X+8WrwLv^1 '1euFw+CZ(lV&/!&+9_~RVFF:]&ތK v,Ӏ%[9fj?!Xn&%'-MXN梎0Av[?I2/oޖ6A'5;G>+I_bJvYʊo׿qst,p_IᆕR;{P1e%sK8O܀M7|ϡع.޷k^ut_mt ,7=¬Q78D6ްJȰrB}keiy v0ru-l 2B<CyŪxC϶~d<)AE'KsYbG|D@5qnl?m.αL5 5+s t&}&f@ -Jl|,*hsEɼMtsض֡ R@/58ԺXѓ奍n ꍶO_x&ǦBjo$'ֿ)ꇑ=I=]#1Gb:NG [NB1 _m%MgE!g{VI@WJ[J((:Hmoe6К ΪM T!KV9-{>:5b ?\i=*MTʧwFRJ Fubvjp/գX-yRT Dy)=fRй /܌8*]rUob=\?0 B\&|3FehKT<{vNmP>@Udr=vO7`LԨ?ZXbHFCW빀nX@x`>m+7MCj@Кcb{&SYD L\z`ϝmcg/|"%suYqgiC"Щ%pX̒#j|c5Y28GI=vf[JW`cv|\KEUnM&V&@)!NX[}MkhbJ}l YԶ 2 GH5) ) @Q$,v/4?i \N uj3 Xҋl4O!/oP7=M},d㕖Udǰ^i,iQ!~F61c}*ӨN残ઋ1Inz rX,V5?O>ÚXh,G.g590#Z R;$ك+l ƼXr'zm, H AGo TbdD|V|B]GeY:@ǚ֞%=~4]NdMFO)8&h} wgP`.ؾM΄*Cx|UQ 4jf܉ hQR$l @鉾6H7MnzU۸鿵>^n}O7b",&lνpe1NaA]BkZ)i+UaSm Iڪ{Hi :(V aʆtԤEtȘ:mrW@,B L0C1P~nYTÅ?ۗH@q6]6[z/>M 2}r1`S2f>g@ FcU̴e͇8 kx1L0htDpCm}L- 4K BjJcB/%++W -7K+@N<N;ܲ?UbGt3ezë! z-b cS[mhUmm`xx:MVUP"> XqcՍ; m* ^]t=Pi9SS\DmE!+O0^Fg6lrߎD|0I*V[V/f=ș2EdYG\wRig@JU՚@]@LQx+f@Yc 3r#|`͟1g-~ٚyە.mװPr2\еꈕf`^!4(eNtam~Ht{|_G|ft8B|߼yLX^qMR֤"u׎q ZkqM)~0إ-X(ʓAÆBݙMmqm9y_6 W◧+ǝ' AFXdtÅneJ+F*C/wPj¯^ uB6 %5bj'dM85"m4/Iv6x q>RR6\iؔ:P.8Ft~y/"8t*sS`cυ{ݢa1X!p< fuźC>~!i4o5A{Bκܠ@3 /@^!]˙}C(̇W7F;٫˂ p;ن 5+"[gNh1J㘸ް aGq4$Rííڸvﱔv@aij(BN7hb? _2*E&0ljw"Cwk07 A;(*Ǐ|חS 9|*:]QMcD5N̗7W :Z&;ڝK4/:_+@FM>ϓAs&_56rg.FϲmH|(jJ ǥŞ(p=W2&zo3"ҷA*FC=UCuaG2 AR[/͙;;e BB!=7HX-樂; n*vSv},ð6=~ߤz4qգ߲sw@+K1&؈ O9'.HHݺ7ǚ^PڵWSPZ|ђ&G3tw*`׺c]z]Ӱ7[(ed)UolrMo/4돠e \{ P MWS3aˉaN݀w!m%r?QP@lCP]vӱMKJR19fqpw# ? mIˤx!r)0:* h "to_`M ZM!ቓM|pYQZp&VAi606<0-KoRN՞vwq:9,@ieRZËĤp‹ht1olgR^Q)u=KB [EJ҉,xvsmLy)`c&RTvEow]'ۑ׺l91`#+Ɏ+)tՑW'A(O/Ne4M'Ƈ9)v7~bVk]'b. bݲVwy81GuԐ$RuTZg79䃊֣%JfJȌonm) '9,%!eD eq4 YPI"S({y@u0V:)а:ׄ/c_ PJj`+ǟ>cp93g#TM2XndA(+Wc%%o:ԆiчӌŁUSIԱGVYg CboFOOL ВƘ i!*[IS¾eqxeG:pydp~^[f$XWJ̧-d\_3_Yiſ+?e= l !@9 Z@y`j}2`7ܪ}Lϵ1c@JRԆ[k.Rvfa8.OFL{~|U'1A#NsU.BGY7o!M ]Ϝ2}-bk|N8jcX:k+"fs/\qD(&S)pLd+xO_#=_I-3t'-^##[a2! x<{tZyb\w5@{olE6]׳g%iHV4ME?]R6ϮīX$c"yRSmI=-‚x"HZH g$}bVf& 4*E; VlE>q&(OS@8ںɮO롎,vequO  t9RK@Ez\%P;?DP*txvHlyJ1} 3R8" .CrWA ʝxz_%3-t R( D7Yr$K$ %Ϡ} _7N%o%wZT#q507r:8rٚU(M!336pH?4OuUH"\ntB$NJaB/ $ݤy[M{4;Ahж~Co {kȦ*B*ֳLz18SZf nSU# DzveYQ.k9E:åSjC2gP!+q ((ϤR|ss7ӫHWqKڃYنpr_ajl4TD}۱;?dS̑Q#6Q&^˜}l,fyc/r|X9 u.iSpN' ?lӭcQQTrY:6cojilw_1q] 67}WG©T1 @ wOH[І|TBnH,Wms21*pjJxO~k |ھ4h3}̌~."U~Ѻ<3#Ჸ7]|͔v 3Lew&=ra5 9^S&ǷL5\#4˂;hy \WňA7蚗0סتZHx`r- iB]Vڭ{CeS4\޿# K?Iv$S&M=SԶ놦}d~*xbw0fMdJjɦ@epk޵ O^{'#d\uS @́'GEAQ.EH!/12Y_-Y;VS]OkN1)"L۴jL53ڙS$t7A(PlǮ1sלK!Qa>fEoyT9b>.y NjqI/]5ks$u*6LEbjb~ a[]WZ8]PURP3 lV}8`oʎFgm7zECI Ԩi֖vi7X0+MOɻۉ+zެ|ˁ<%H`Ʀ>݃N@#gcp]M߀b-rUxQ$ի8"MaYk<=Ncdv44fcT(3[L\F/TO]'9Ժy|!p ,/Q/ -)%Dd݌#M 1b(`0R珶H+W;GV_> iL?`9g7ڂ]{hg,=7A_a5p4=!{kNܷP[bی |͜[\Y& bHs5c'Gv\R#ϙޮ@5QrRn:&si}j]0<Θ/#(30< eicT@wu70%U0MJʝZ*EŪuHqʦZ!kF#v\(c#g;u6K)Y銟>yɔ蘗!܉#!)9TWB !ط{,hd)=r),ż?*//YMh\f]) :[z X M{M(n4ǩz#ۋp>CWź~A K Ҥ\!:|vz[!u|^~\,+CGZ~ 6MqPa d%'逇)*0XD%ٳ;>N$tYW,?)dP Tn!NyXe`i_f{3ս]js[7ĢϬT* t̞unkPrtPg]|:I$T p^N[ …SI/eu{@6t@Νg.$ lJ/t*0D-8١b(~G \Q "*2MqȢHWd9Ȝ9HC|O`pc=^z=R\/)!d&5'Og$e7~tZ7OA1OnEXIz6a0Y"Vl&d? 9ԁJd#dġ~7fS¤ߜ5*$%H=Tς*%)RVG"ċpZn-q恇gn7 ACRz{0Ea3iw#Y^*CՐo %HkP}ioKXhP5T22; u)@C$/͖&oJ},7/5 HA|j^t,N{R+.,AbuIqFՐ0V{(~r\6ɜXZ{> cҨ+7 :}̣K oss>ON2a1*b߫i;Z$$7*1*EwFĕ<)=p9^^Sz,ДC+gi&p-8&&fHxn(%K7Wp&dXNv ^Ҥ$̘g:j4k "5]BD^b3NК"o>4ҵpnU3pBаm"‰q&9̷MTȂ5 ;"Ka&(^[آm7(rV"]6ZXy#' FOXN_B#b2r&Ϲ$](bVI\8M/E-;"+g^ꔽNΧ_:&0MZ'Y~Arϩ"~|I@o%,ak,o$dg3wn=Iwehhॐֳbh7h׌FGXoGo;gp(;R-,C>AoP|_<4PYl:95GxQ0 A8سvR>{SCM^rzb&]g90Qs/cĎz\xO֪ kj 7D; Zk x6;p볓f(Sj[ɫx3CZvƿ}S/ @ : 2J0h}5Z~Q23 MYkJͷfv=m3{۔ɢ1S湓 69l2mtjͯ#Ξb|(Iӣ^&Qs&ёV$oF$իa~{pݜh5"yLέ$ Y )իRA$ vK$`nN'I]L6`_w <17uY)^ęh%=g䨃hlD>!cbyRK06Y)yT!KwnYVG韖/[!=B_Q8!p]@eW0Q2 ɨ, ƚOHYD["@/X(VT p\1R*ySkK $Ze<EmDK,3՛@p1El i 5/}d90pz\Wҋ?{̞'F%bztNEWȑ+lA',*7J\=4"%s?*Z ~A> 35"xreW-"TЪzekfAdzA7Ъo>M^T A !6tSl?]Yjrg,`.54(ltMa4!J;qLȱũN#Qv>*Ct0|BP-![ҿN+|l#m~2t?Zl"'w11)"e" XEƤS0knڍ˚l3ъ:$2-h`)o+P1 >Y^U֙LOە z/hn#]톻;b(KkM(م!F"?D7: H9b\k\)w9nG!I+ 0ɤpԅ!>Xۀ]ڕ$6fֿzM9w@>RBSID^IWq菡`HgÏ{Dg]5Ewіu5g}0Qo62gx:'f>$¢ 2qN Ni߲=< VӞ{^pQ'y8`z _S>/%VB4?ԧm&sQ5&1[vkOu{ 54S:B΃Gid{u.T>!; D4vFt߃I\"4㐩IcGH/F x"ww̅iA5|z50 &Qq:(Z0s- rc{^d^sՐc^,L6] q*zs-,/X!B Q o0m&xd'IA+(( -[KB~nEzLdP/tD¼ T0a6~w"L?LG>1s:ʰȫ2=+n+U"wanF\L(6^&VK$3ٛt [>0'NWh &vDoxw 58]mOc5݃/m~_XgRNoFΆE;n ]ڸRZgR)el2{IHuYYbJyo&\fFH igi4M;9h!du tECĴުsgY{iT)]ab#a_|La_n&sRZ~wI$zl(;I3M 𥮤8R'Q=ɓ9a⛜Aioϛ?4pF;7[ȻnHʷHh0qTmS%L-~>C3LL.4hX͟˵E*#n:wm k]b%޳1'#^-7l㢵y/\Nζ 'clQX0ڧG2b[1+]gHjze-L`3k͚ jCԔWFiS))O4lzy ؜`"'Xs۰ $I\@y7u#Yv\vvb6.7v``aJȔh8{OeUHŘekGb}Y/Ǣ%Zߒׄ`̧0တ $|ssH,hy៮*ltvgjK}S'KٗiAŁ;(ajcR~ixŜ>;JSP+ 3-@!mpFur2zo-2[! 1 5m֝OP)tqsʦ9D}:! ? 0nxXGR1kEuytz(ؤD>(YDrb31ޘZnNg o ofauUċ&2/;gT IrA<,0<5ZDTs[ }W5Kr%\5BUkl;x.nsp΄b(.5(6‘0=u!SCb+ZkG=1y@lD; g]g"?DKw=${AIn Gy_ϼBX!?c*8 *#8pn!\ I¶ )")O(uY(Wʵdf u7[mWZ zϓA{y$5X+hmQ"KDUOVЗd;Q#PV%@6cL`@ ߍiV)<5sQ=5j-*1Efdj .AwL3j'%aG[ Oh^qt$dzNo>1w3wBPVҼK̺f;4_o@urp[?_L]#jr%.R2u) Z{_Y}WNPD ӭZ.GV-P(tAy9uyD5w5O[(2 =R\TĘ#') ҥhosEaįJ^@9@y5Oot^GVN'zI7S9my*7">~Vr"|0c?ӂ<[q8}dgu޺Yyܖ9~^beڎ‹ x; G^N R?NQxkq cTr:'&(հIJBRT};Vi,!} TGVuCF/#Xܩ" 8fu˿$]l ռw>q@ eRsMj [2c(,\bsL 绾M+硯/mݏS<M';4Bcߺm&s[!Rh#:i*}+}h-^`5 ZWSv)B{8gO~ Mf]Ap&V5̡`b "oQb4$\Qa?-wRLOYKLU\zd яk ysi13<8 ^Li?5*^UWZKQYo s\MsKK{vy՞ͣ&F!`0"Fi. ȟp瀧@؎ʞqk Iߊ5{#%8 :A-Hzbi(tpÅgD"T{eun,C4dEclhMgs2me?<-( (oFcŠ[nŰ`+BvUх(9sX? He|8 i O I; 㡫pcAPw^tTSEWi{h$ I_OّYiҾiE׭R&s7x//]4ҏ_,Kt`|<!Tsȶ1:TAq_b^<^kR]4+ Q87?fW8;,zO@o{W[& ]IN 'Gb"Y5k̢b2K vr56c Ic|5UKcվQlmu/|v%d.k^NU|(~^g#=+N=MK!3dG219RgtUvM1"=N r`ƉkPH*-:GX%{v2X1qY.u1o}$$˻on >BW:8y&@- +E>\kce?]Ed%B6 t]xT諭!!QZy]Sms%8xL YyF»g-_hdkD7x_ MtܑUZ$wq'4vBep;)޸ < c/WDL7bVnkul@ .:ΦlۑRZP"5pX\J]5xP#u# "-oXT Ü, uk:|&!p: Mlc<;ܔxzѰoAb#mhsnw%L혓~aܥdxEL*Lē,2٣ybUwXpt]:cXZ&hpGUj10ePύpߑ x(ژ˾m]m 7K :1dB:~g Gx5w#Go Mg&/O%c>{6jYr|JrlzafamE?[m~.tV&31?pQܵO;Vϖ:)/ZS$i:Kcň̤NBQ2*a e|SӖoG0l`F3p34G32 VlhrD%br7/ W% 2}l>T3ƙ=Λk^SX v_eC f#IWKp#fZ'~\fu"թ'6(nЕօq& h9 {%f,eWo/z]),#ZLs^G#l mXm8 q+5֓r4Wr<-ۂM]+_V1za: EWY^h\qHLF\HƻmmfKwZ&Ʌie4OpMc5?5!,ġ#bhQPY xϕ도7B)lqsMA]:޽B}=[+i}{NǷǒīotHr>A#;zЬ Z<oؠDgd8 K(pc>8UIÆیf j6IH{#5_Zb€k!L4h(jqJ% S#_ij #^F 3DƝ?Ko f8v%dܢKxGz܆ija#-(`v_0^GZJ [XT_ 5c|w[PP<= \bFT+ Լѕtsafj~sقB?{WLeِ/~5u6$(0 Ez^SdzlF\߯*-o0$0#>]@] 2ck#V`@@l^'7S/*ެ6y[822$%HkI_:sGj;5m.l(sە&NY}O݉+~?)݅ͫ*?w9;t-86 3a0T`5+htJPyճ1GDRGCaըfˉ{'pd}P5%npqgǴԻ]O>mok.!1ɚ?U}AUii}EU hK.U-ѐPk˹={<Һ91<#b#>8d/TMVtDT)bUdPn6T~/5&1:|֥%a==?FW2=Ыt|O>W+KA+JQ-8`-xaJ;XK-rT[D9bagLض ~ndKv#M!1zxԭ zgn'U fɷbyj.V,G>H]gr:ǒ6rO A "zF|ȇWǟ탛>:)wg3Qp觙m~=rGH0Hx<;q[AڋS\CRDSq6{0y(MXUKphX祱D̟0Ωr+ť|B{.9U$ m1A+ƨ흐FЍQFr1yʖ8V_Ѳ%P {L587J: kaDOOiЭcR^664[:m⑫${`!n ztxȹe0:ؚx9"VrsxkW]ӖU,A]厢{?pE$A75uZLD^z t͞B9r 0Y7$W)-ЍX t/~p]fTvQc 0'wE3Ӵ9o)0Q^Y#,5|iG"ɬLtgKڴ<Nr`5FqY*5)j^s`,ڂ/DI[eYGB,҄& ԩZȳ${<k;&Q[(؍*ԣ|DBҷFPd6әZ`m w@h?_OWӕԫ4vջ;0g67dnDxYwuzΒfIȞJ5DH$YQ:cmsbuKd.s^f~zY_t`d((98<&>hA#s( ʚFyp{M@.멃 Vs>UKFM~p_qbNE O>/!5-*Fip/ 1lj&t,[d .`iNwv(4|$ nA;nὌ)yzϩy-9TXH,ǁ( }0UpU)ȎJv^śBǁ*/ˇMEEP.}LyA`V:}+UKٌP(/BƸ!hW< MIFsCRTNk1uU#2Yא}tڿ9<'WA635B+rtsu0(_Ъ;^ٖ@hT!'9 P^s(oИVjb f*ixV2Y$&Ne[A:c D0xlLt;pXxֹWwrgL1XOI1ŔV271<] x7]O[&"kwNv٥1f>Gȓޏ"BB/g_?mȍuM,;5)_8C?b8kgS׻&X-ᖍouꊹz=lɚy'ƃW5s[g4d8u-Ee[Z՝&4rƍƶPD1w6} 1V]d6aSBSýiT @qev9+v?˿$х:,v(__å4.A@<.yuED&բfi #{T ƅ{¼rŁ *{x&8._Z׺K!iu1g㨯8GLZ>DCsN0QSHz$H7 'lh^<-{FkVY-{JV6>.>ZM|SctLdbpʸ,nq VX Nr`>絈産6 #ԷT($7@Y~mwk-cY Ȏ$u~q;*RĹ?u1Kރ[Ln(wԿl8V &|jhYmp pNOOn-CS'Z)V-mMģ%& -$J1iQPm[z:Dاڌ!vi欫2S%&6E`'e1Lݻ`<͐iF'JĔ?o3Q3 Q0RRH dם@i'|l^N@?d)7j#0{џ*[Efn=RVՀ$trښzPٶڶ{k<Ôg0b+A(O_`rz-e_XzϾІgw 4}q-ŮGFm[m?(61S#r]cz$V%|H@vd-cVͮ?|WM<º\[x{Tt(hd(?%$ʹ&})<É BDi3z,.7;' |Pvw%CWˇAz;Rm;H5u.:> N)7핢^a:tr5l"D7F|f]mz:Պ]%v1C6f)C_}Ce>\Z%]߇]w QEElQzIA:Km `$* >ob9,ֶXJx SkO!Px➖S@-G|PpM "gAH 87"";zԿ"\40 &&5Y#IUC>t`yve@]X'L,a$~ c%ZWȰ_^#x (o +K42Fw]7Yvs%e۷u  De ~@~^\w[WAOުJvjM+)j# D@h-ζ `8ǐun(Estwtp@2Sh\M2G/=@crh@=?|x;J8J0TGZ<S:N^[5oeT#o6NڻYBE߽7@gٗJ#~u~K~)P1n#B<.,?ʺXdG8Ҧ̍X[PY${~m&sJA/| \-  Ϥֵ;6!P-҄h}֊eCKL^4="ޕ>;n._63,~_hUZojKDma~Z'bd #$e .aO`{6 ,Q 46U~qI 鹬b^ިSM0S2hi}R۩,t:#zCr\ F+-M%Ze["rN5˷0^hԃ;y", @DC"S*@-#k딆m%# ~EN6i_{g; OP%6Kg/Y?<-d!Z7"t)h^?RLzݺZ 8š0QPsHu';>`Wd: l:eGK&7KPsfuRuc·/V6sS"L=VR,Jq@ܝhATt޳x\( L hkL0WRaN_rF݄{CQPSj,G|bүX)LV`!->҃K]^܄7P 9a#~ ͪ!x?gވ.!& i7n7mѕ45gB֊jG®X)YW6 lSI8oЏ \ "!IXUHn aQǑ h_I^àq)zǬ8"5]%r(@'רWA!'qa(­&ݯ2x%,|%B%_O&;Eā- agL{7mίe9?_?Duyh\17MAJbB@~˫c$X'D^НW V@?G!|Npؼ|q_5|ey4X(#ڴG^Rd!Q]"*t_(-Ƕw㳹JNNSD@bu\r10x_ ~~4ݨfFgzU)TtdB3K!īPwͺo+)Bxys^e*Y`MjBsڋϭcW-uf2UhQŔglRq$-:I&oC^&mQC6tBb;@YؔoD~np75؂Q]}\03AzCۢdiGBBW/TdC.2q;f5|wݽign*"z{l7siJXtaTux;RI={o"s\ˑZ.)WF*x'ţWEm~azkd=s 6-NKƅ% $%d'?{*jntNZHk5sա·)'m>m3VuNɻu?*7*mc>3=0y5KzhƎwỎ `|J}G D*u@41+*c نAm Xviβh̳?R>lԅ l%X^2WD!8+peUvg8KRe؀P6E (# TN!S3@fYׯk]:. _&R !kpҷ=V\Ӛe 1Wh^*#Fqʻ54UY!oׯjYoV& ҺPc?tNśG2ۊv j4Npkq ׁ졾F1Ew,4?zpVg[tVY |%#Cʷ$ݘ?XB~:xOTYŨ3sod*tmGGQ[Jrn@ q"y{,Z4枎TɊ!26(;}jBlBYGuN *L_|[<dW⏓>3  |܎pu0/CE2DNA-#A\9_&a/ D*q'؍kɠ>:a*v'=5nVZQpoQS#VK5=m[f}GM{9"{;g GBfq>)lORcHiN1,hx~6]ԒDWl q滥U"H\gHdNQ51h}D*_Y=PÔq}|F[dٯ iQS>H%UfܯbEO~Iywmt׵AF?.&0Б-=BD.ph m(ijvo A-7u@PJSj.x(eޢ]8,\B#h"wyYW22'g{>({;7#TLQQ=@תҲe0|kG5JF 7P>g^tf-"l/#KK}fb]V,}Swkܶnʲx{<W̙. 뷭Fi)O J,&_X1ZB eYoh_k,?$\Xy}dFn(BT qaim -=CjJ*o ,\R1~2$^i;M`gFK`;7`F}Jy`N*lLm* ApOC]`(!iD[/l yy[ZSLiQk'83\1U]ԓ(MRJqtye[J||nȷe'AO W_Fdڏx"+ eȊ<$xÑc`)gO!{ɨ:7족2o1 Y 17+ӊ񿐻T-=%G=7Uax{ߗjKN<C'ÇAcdwH4_v@˜n0Llگt= dB9v#*K4!0{PቾHs}-)j,$# 6#-nc~Yب^ ްB"稞pa8IqiDfݧRZg4@F€P„k5̀٘u t_O߆} ޗʳ, K7R ٨`Rk\ͮQn0.{e! ˇ^V CI% !Zq5t5Քķ]Kq,jy\Xp٤;CCOM\IɄPEQd]lLC5bnNXՉ_B6RZDx H ,rT;FZ`w '@#Jb0iT0xMDTC0:$Ԯn|KԐ;V]EDb YoE/=}ipZqǾRfS0bԃ5D ܰn"ia\:DKMC&s Fx/ͨEL0M6!E.:ħUXZgm!4=toxW &vHVخHLjݨk4<~Ǝ  /lũ'ʖɂ?/.[7'@9WH;VX`̽y uu]r%|Z".i4!PnDz _|0u4E^?wm :O+.*xe91?I[McF;=C2䢆%LgW'Aɬi,[z@<|5ѐGU\->fmeFќ wݛ.y rdm+6z8xŁ0agvqv\g>\{CƿI̍HK| X&E&b,h5$jWrpMx,xz̴TVH<:+(GժEXJ ;$<)8WDʎNhGG/)2CVt0|?4WGEŮ;kz0xuJ76F9#]3/dǜ_0RJ,a6g&J'1#=' }V/|[0P(~byӟ-}B_sV(iuGaj JĻ.xzVsQY5 u[L L\{6B/~O>mJL"x ϶Rn ~W$A,Q4brPi;$ D\ѿ΁Gy'<=:XgjmǕ۷!-T]*^⽁kY-VP=qa<0ot*pg|\CvQ}>Dž*Bd*c_ⓩGiyG=;i5j&*5LpC`̠BЮn bIT'!-UcDJ( 6/MV".ͽH EH9|-_H,8'$MGq?h l=Nt~jE`q"{Jz-h: "LςYC1%zYj@,6?h*%濊C5~7SFYJdZ?>S66oƛCՎ0ϪNbZhOYb)D*y M6 ;:;dK3&C;R|7%Z/Mg4r]!HFpH[f XIi"G%\!&:&nV>$Yu_,>8@}qYB(.,U ѪK#f̡hKƫ3`OمCk.pw[WP;imJT&dK H?hBF~h k&!VrIU]#vp/N2@Hj4oN%U ]&0`͘)b . 7<*_UldRMj&ȿ:̄j2P)*,E[儢"p1'a(.Y@kMNp,mc7lf_e]'ξTbUerAc4J,bo8Ü4Y7/;9 ͅ= 7GuLbINЫbj5MUTl;ƝB@s`_o^0jȸ?,O˘9y apLh2ͪ1 3^]'Q84Q{9D. N"6l~Vf:ŒD&h l/H#s V/*!^63ԸǼS\d̈́a4[ ι+g]:rrsñ9oÌJ08' 5kiKgK*OǵXJS8uR[h#IXtt ?;X/''F8{uE&eF…lwM#FK4J 81ong;a.Zo蔔إ'<+DU| H 7 DdQu_{`N23_<͒T -i*W`۾AE 7F^y7Q>)SA:Ui1<mN|f;fT٪/ri}i_c1x{NP}cJEbqhfNQ#2"А΁/H~YhDm!U #IQEF ! yrX#v,?bNp8f^p!>=u?҉ӥaIȹCV{8VDu]W J:1,4kA&Fy>'l+K"5 F҆Bi峾Sͮ3x2ܸh@\en > Ҳb~'&GUhV+ F lC<bS9^ :OSa'K| 73Si8X?Dp_ϩ?pcOY~}ZuJ=L| Fp7YuzГ$/"0 MȜll]}I#tT [CI `: }P%ezyjyjpsfJ˙ h^c_ϔϒr h_2p犙j7]C,?x`f@r>*%~vV)Jb #Q9_vP~ye4;^ksoKtX0o DS9̡z/}UKve_YdnrM֗ :ujdi]3ߑt\4&J],'7I@=ZJu$lp*CRO} ?woW9LF |hq6rsyt( $FRzk#m.J=Q!X2YI5aP21x pN\K܄GpM/cTL^) -a/+\0iY '&7I{vXPcX#^bGo?4SavvutI._*CӷFl_/r'pDh/K J9~)#.N̷5ܠZSI]@3iP 91L^h`D߮I0p}ξְouO)W^!/aVw&7?HN сA:;UڽAa҇ϧz"*֝,ϴ \.2s PBF`RzNLTԤO @05Z7!+z$HPA.0R+/w`p̧6էMZHQn&nx4Urϔ3=ٻ! Ed~ 0 |{$PX ٯ?;l0̔e oV֨AF'o]W%^rERhuc,szu: k8E~6&N0f&x( 42Aw<[Y -;JD]:F(I Vp>! 'WjSh1qۿ{x=5|(FzX+*îH:3LsHš><.A0E4>z+)bh-Ic_ V`J_~߻uJ<Ճ(r0[FDO]i\uVfM9 T(E4D9Lg܅U,OVPru'tˋsX!ga$e96/qKI(2pCG2\gmf]NMbYk`ct)a(䭰 .UBFHZqtG,bvd8k6*9Hs^ãhB-<=:hsƩ}e+b}T.anIO)[D?bS=dIQ$;NIޣo/;$ čz=ǽ [E^;չ]aBWCs]3zO 4BkR =l;o.$\g)JXm!.ԁޖ5;~Ӊ˙u:g՞y@űM Bq8զ}2IJ7.ZA/S2aY)A-e"ڐU%Npcyxo*gpM'rӝ"wv8z~ˉAlSPnx-v:l냉!JؕΗYQ)8nN<'s2gRPfn~4;爪r;>pZh{j{sIPC~3cK/B_bMeJ'O؉FT57 ԈQ~ƴӍm"ֺܾUCZ1e 5{8qճzqvdgR"b`gSG&ng NXf.z7Hɩ9Pf2nW#}: LW {L}:O0t%ϟ+ 0b t)o(U;(A3f\w|13,Ȩ;ju5ynGx51)]}?_NU}a;&i!t뒫FWܵꜢN @ =hCj-0ø7x[}Fs͏LWe/ErV,69> ⳪8R8~cb gKDf(9|6><B$Eb~]BX\vŽk" lbd5H!Ja3I9S6لt>%ŊDEW>ŢI1sE$ee U1SLʰշ!: 4֪"nEvi| v,/?f1Ƒб9ؙU0 =*6nú(Vx)~}LhU]cH}aΥ^G/tZK*6 n d{ +[^#WrTY<=+Xlz_+-n1n.~ߡ5&!meJgt5g R;b~pCszWy}ß-qH4hxZMS.h9"N^i'F|ED߁-n.}٫g{=ueN T]`OvܢEIG7ˢ+.QQ7ɬ]VPX(vN1L\ a%.~vP.$] /Vm7 2hZYX\˻#6"8\ZA?"Sn1X d_YёXJ z&)CtaW\ g~ʭ8NԦ Lh~+uO@"o:jJ\ͪ? !Ax~q')R'"U)D}cgaL) LSָʼ*Ato]?BSu![c v]ƶL =ʂ HYtTDA۩!LD %_78o*<=wgw. N^ b}C_ It YmZx [\:Y V\Kt r?ITO=U4Р$ 6kWK-2s bJe*jXOI;Pֵï>wLJ]0=/s DU?~S?k#IdwL7oؙGYFN+0&͂9Y;h e'#lSDIʇTfy}X KpniP {9C)QI..j:Hjr*7E ({?GX/y O#clz2Q7fi+RK!Ցӊ[Vx 4hJPp¡v=$H3@DԳVH?xociQ#FEgE%3Z!IpP5iX0;/y={J!г-3U1 Suz=)kb-/r\N4K\ߢQhJFul`яٞ\BJLڜCa]$ø9}=_vot9UB2N R &a՝1bCl>3/o!YEE2ʉexߵsďCa^5.`[61݌o ۪)G &p։~Ea~K(Iz;mNjd-br3HLt Pv=B/+ԣ y+>#̉|@٧F l>ѩnabt)zbv}g=d(o,0TBzk+I{(1<ב(D~w[׀(27&2#6\}bV3ݤ ͞ FC.{?Ӂ^c2,ӧKL|I"~{AxҤӰZ-mn,H7 nXV#E5VO$ 2uuyRH ORčmd߂+_zu&nn?~]򬎥Ȍn÷45zoJ3\G~jTEOGZQ)t'$qu>$Hh-+>9ԩAi*򠦤&8>TE >-ծIͬ>33H)>2tFK L4n/J2,|O2BJ֪]79)z? *9^ûNdQvYH iDEO!-Ef~ydb}t8cޅ8<ܝl&g; 13A'^H]v{1*|ҎU̿=V!|2tӈ4Bb[F0OC_R&tn aݏ_{ˋ>&ĆXE%53 XW'G%ms|eW$2iXm`C}%ajKa\mޓP*8z]@,hY;sLQ ꍙDl g~|LOKΉ@wzA$,M>KB[x=k6꫓ F+ѾkXJJOHJ ]]wd;PR'3TG8W-Z7{__ 7#&g租s8 1 ɗ$h~$ZXVŎ+#./jxLH=߁^kTCԐSm_p(Y:OMu6+j45JpắdƁNW%tYR%;Axz9v=q,<5 W]p§k˱`Srl&zksS v"bmpJ%KEeQ :=eaY"L+־O4Ntn&\d #),4\u ?G;0F`8:-й Sx.`HTϹ1[~#pq5VVFXtXɱoEXdXl&@+ LBګ=,wrvuz՛m3nG7lCN/'6=+|~ $2?wc-!!_&LciTlA>@ ' \2[Bm4>1|yRI_VD2>~K(EG{gT6vVh&]_j0t~t13ܴMCs?aucltn^7@9#<ceZ!*y~>:dtS5hF7[-4W˖\YŢwYKFPl}~|ԻHiOr'alI?{fXX=*0;ڼa}ÃȁMV^-,wxUPavLl[FHqQr% "juxlc@GcEtIꏭ(ѱp|yK]3;Ý^HmHG7e;澛NQg@\{<8uzq[ |ȻwXν0 xC|< ;r}8p'@(Q}0tԤTCI@HY{6{AdӪz`k7!X-E%ZdI~y$_p[8΅ȅ^3F J>9EX@JgGn;FF3I?ƾWa:us >T h0?S)-U%Zɘz=t_jLUL>=#wc9tB=5vMs&6 9g +n$z_"En.bS}'TbMW"G`RɊv/eXh$^p|4+|0Bӌ[:? A2KvJl<5z?iw:Dk騀Ek#,Զb3HqD]:kvb}벂otc \hc(KD%#"wtS|P88duH9{sfVw`jot@KAFŻQRhp>+u1 r ҄:Ǣj߄k[_?4aͬtH&:eͱ; ?l`?4(Y*;Cv76pUJQg]D6bB/ʒ)O]c=I(cY/*tgQ)zUUX'PVb,e6bciDȺF9!y!kB'M,LK1ܕċ&ŋ6yKN ḛĴ\ EшySEPbVPyx:46mWM%> jґ>g2B`n`X 4ht&mO@T]%4NN¢Dj)j?68iR.%9<)(x7J0C>G Ov$65HfDXgt R$]#mgJIDnq˧a]%w~L0ވc/r1}t' DZEh'}?YK7v116UrH/Sj&#u#ԑ z 4KX:Cb(:*X^H; Hdʓw  r[V7(mD]\=6D $6glLُtN}&YV!%xMПdy=r{TP h5V^M;.E7\u`c+)d[}a 2^!Ѧh.r%b[\gHܸ/T03g:_'L')ن 'FY3N&^Fgaqȣ#LX>`ƂwmdM_&j=e<ʚmHnlYdSQ;W.sM-" Hjz젝~vWf9FK}oD]`5.BT[Yg׎Ę 3bL`fA$bn5Ώ=XYɩWJ }"[8i@zV ήnC)xD!ŮeUde36&5 D[m]S_H `JvxHZr4;7kUN`>MβRV]cZ&Ie6}&Fjj.`?=7f~3Uw[+q=r;$693dU0:bdh )k2b7w4է NX@0i R3vmYm%HE?#~r+#K*nf7hk;)+I{ũᴪ_#'պMm  \C R1\蠬D-5]F/l+YV_& tVT)2Ca(/|иî }VOƦ/֜¦3 :#?aT<6(`-uT>Y>{'Q{ZKd61pe~. UQ.O}E$MbڲQy*{4/  8jd*J3"4]/,Sn.9a-rb K`4`@!b )%4j(ɾ#bLkѺ~X^*IJ^z>;#>-mM;ř}ҧ7P8FOnAIؿuqPG-BkĮ|uشu=G/oq֟I<߸GvH=6O*2tscN0ȖBLӼZ/3ae M) ]YFr$Dgk@<#)TsOȇ族U QʙDmh>A; .i 7 E]'&T#;E/ʩ wߊ7)Ij,DXL(#"/i6=_s~huǯ)b|\PjD$qV]tG-٘;bjXN2Pfvg:ԃSK"%Q{Lc7ILNry$02a =rx^ Yv0媳 N\9UmvcjX˵5斺Nk&$CD ɹC'!^dxG*vFO%tu EILuUаZKshoZǻhV_[a5]FH Y[q`) t,#ӹ p&'i4L.g\m5N?¬@ tcZ}z\Ho !_Aicin}6 lY#us/{NDjt)%UG9js&! v7F^ .HXSd s &pVI ,DKDž`C~0wAVb}hKj)jb}NhOFyn} mˣx/&q;DF `2 פ~\u(>YX11l&eޝ&m1`RW79im,H]Yi'>Շ1jBŖ:I"F6%[n9GW8]:\9\JHfAk95'Z Vr[8\pf7O[w!=l\DHbKOJDފ}ƒŐ ")?ïl+*vHZn*2Oz C»H9t0ݷIEXO7ܜ?~Gw mS>E$Ž%LXk{Tqg5v67޸MA3lG_0€Rd-)/wG9gU Xrތ6O?7L? .i#h)Z%H, kU[OvL gC1Jr^ e)8ZGc~޷an?r"a⊉9DMCʼ-0++g5 Mز|y}qM#tn\iK:I؀шt$IV"9I'5 3q)lOK,=Hb7(8߇C$oL`P-ヮ798 @Ўz}NtО- P,ZvȻ];W̆yN,YJb;sdc,aÓvw&>qS`#רI0?mo_/4&R IJw\f1[ѭuܟք)a7Z ?J/FO"/A{MTxg0Y` 'irX3N.a%0"{WH4wC_mt䨂f@gAlG }$jcHШ>M).$`J>鋙g4:򫄖mjnsګ`搙M>M08n"1.=OWDT 3;PȔ-p ,m c61P?;*UFr3CR\K 煛=mq:\'45Ng8 < )d`-j ĵ(qnو䫃Zn@{<)ϋٓ;*`\%˒,W~i?FBJNjT^:Q ga fѯ$[\Ii%hLC&;K!//F+KFvcI dذIQ![~܋J:tͪ'.f?BDW7PŇylDj~ٻ!D WYC YmD0G1_6[/T"%(7YrvIsƿ3fRHpunFN10^}k RHx-j9G2+锬sgٖ9. [0Nyݘ@SܶCyl\I%; Gɦ 'HV+RځϪj":gz_x^>;TOjQxV<9:ǢꍸcqU6;W9DC {+%UAʼn<^(3Y/ yq91,8f1J)Y4_ ^Yr6rqK8 25> ] 4{j@wJ)B)$pqgSyhg&nE_k0]wOI{,`pa~Y(ZɕVbD|h~ - U솇 ]ˈY"r#l )5kDͣ4\r Ծ9<}&j0$8HZtW1E,ᦆUW/=L^h."A[1F 1.<=_cF-.I$˂KìlL[e p5Xx|5MFs?ƫF75F8Kb f]މS(i78 6cs0TF# j}ЇS$q?-n[dFvQ$ϋθ Tn?>F: iw=X69RY^lC۟W8v!hDΖrf{<#w+ W#FDr7|ab(X+,!)uV/ (߈nKDн[1'GѥvakQzsDn#%hQa1uΪf# V7+NOR̝Q6V=C]j ([X?n ^}7x n)ⱈ:ɟl8`Ы0)ϺigKwo3t YMv>#:)ʙD(iw(EpڳJIu#_@@$ER;>rvMb 2h_9 YV|Av4DO7cв<08?YD+.r ;z%}B|:g~S c8S+Su^ke-u:0L gG~RA7V.rԫk.廈J%IFʚ^qiivPDCVk$!uV~}è<"?n ݛqsFyٯ7򑃓VfH63QBM%z\Q9Yع&}ށ%ghT816/ʯy`(hjV8Qfy%Etd9xH]gEVurf)ޭ*_kėE)(3Q4swD&Uu )NG`f"@ /, S NRހb־ QWl"UoŬ~tMZWcUx0Jyy )T;7Q|a1A}Xܺ$CMhWޞײu_$gYX9--> eaڊQnU ՇP6xU4r^x&CplkO(v1θC[˔slayљefyqKPK_&ǂ& UYllO-OKq#P! o W뿉U{v oAہ, it#_" ZFyz(.Ǥ]v1#`- dZ6P93Vc*z75!ɗMJjI}$Y8jE@I *$;S=!| N^_픑aτ9}W^>+`lD2hH] "[|$Ѧ8FX*r'D$B][hF`&X+]96/UHȩl^K4i, 𖞋hiUXfVpfZ߶Ez7 8a}r!F= ]2A@}8*5ZMȓD\W`^ 7>{Yx^ޠC˦Im=TzɲT.?S\0-u-@[ Ь񨿓Y)ӀP*̔/ݫ5<29rpKDuZ2M' LnuObotخfAD<5f/M%lT1/V2״/ւv n,|vw Uqg:]1ּK^CtJ/WlgW\ŗufrq.ZyDvfV_bs豫\pBU?2ԋ%2go`q4 #d0e 1Z?Ė"~~L*9oȿ pAwmr}HCAMV_o'ɎJEr%cA+TWtޝr疕7]LD'0c6 kE|rA7hp C(2ALOUTTSP '0R;{Ɛ}5Y#[$O03QRb`~Lm:%#@JoP<'ա^:UOWBֲ]jc k%޲L9nvbF:=>q7\+c0|Ww8Է38\oH=oS(bU0A~7 R`, í#@W{ xô< ~G3 ek<Ď'p{1m1_r8#2ͻ  y zL=Y-.b+k Q>'*"WbtWz %:άzHד-g 쁂 @#Ӌ˄CPmplȆBN3\Fǫ p M](YljFfb5r^c.5wH0 YZrtracklayer/demo/0000755000175100017510000000000014614231172015042 5ustar00biocbuildbiocbuildrtracklayer/demo/00Index0000644000175100017510000000010514614231172016170 0ustar00biocbuildbiocbuildtargets Visualizing microRNA target sites in the UCSC Genome Browser rtracklayer/demo/targets.R0000644000175100017510000000251114614231172016635 0ustar00biocbuildbiocbuild################################################### ### chunk number 1: rtl-init ################################################### library(rtracklayer) data(targets) ################################################### ### chunk number 2: rtl-miRNA-track ################################################### targetTrack <- makeGRangesFromDataFrame(targets, keep.extra.columns=TRUE) ################################################### ### chunk number 3: rtl-export eval=FALSE ################################################### ## export(targetTrack, "targets.wig") ################################################### ### chunk number 4: rtl-ucsc-start ################################################### session <- browserSession() genome(session) <- "hg18" ################################################### ### chunk number 5: rtl-ucsc-lay ################################################### session$targets <- targetTrack ################################################### ### chunk number 6: rtl-ucsc-view eval=FALSE ################################################### top <- targetTrack$target == targets$target[1] range <- targetTrack[top,] * -10 view <- browserView(session, range, hide = c("refGene", "mgcFullMrna", "intronEst"), dense = "knownGene", squish = "cons44way") rtracklayer/DESCRIPTION0000644000175100017510000000350614614353502015632 0ustar00biocbuildbiocbuildPackage: rtracklayer Title: R interface to genome annotation files and the UCSC genome browser Version: 1.64.0 Author: Michael Lawrence, Vince Carey, Robert Gentleman Depends: R (>= 3.5.0), methods, GenomicRanges (>= 1.37.2) Imports: XML (>= 1.98-0), BiocGenerics (>= 0.35.3), S4Vectors (>= 0.23.18), IRanges (>= 2.13.13), XVector (>= 0.19.7), GenomeInfoDb (>= 1.15.2), Biostrings (>= 2.47.6), zlibbioc, curl, httr, Rsamtools (>= 1.31.2), GenomicAlignments (>= 1.15.6), BiocIO, tools, restfulr (>= 0.0.13) Suggests: BSgenome (>= 1.33.4), humanStemCell, microRNA (>= 1.1.1), genefilter, limma, org.Hs.eg.db, hgu133plus2.db, GenomicFeatures, BSgenome.Hsapiens.UCSC.hg19, TxDb.Hsapiens.UCSC.hg19.knownGene, RUnit LinkingTo: S4Vectors, IRanges, XVector Description: Extensible framework for interacting with multiple genome browsers (currently UCSC built-in) and manipulating annotation tracks in various formats (currently GFF, BED, bedGraph, BED15, WIG, BigWig and 2bit built-in). The user may export/import tracks to/from the supported browsers, as well as query and modify the browser state, such as the current viewport. Maintainer: Michael Lawrence License: Artistic-2.0 + file LICENSE Collate: io.R web.R ranges.R trackDb.R browser.R ucsc.R readGFF.R gff.R bed.R wig.R utils.R bigWig.R bigBed.R chain.R quickload.R trackhub.R twobit.R fasta.R tabix.R bam.R trackTable.R index.R test_rtracklayer_package.R ncbi.R igv.R zzz.R biocViews: Annotation,Visualization,DataImport git_url: https://git.bioconductor.org/packages/rtracklayer git_branch: RELEASE_3_19 git_last_commit: ba889ee git_last_commit_date: 2024-04-30 Repository: Bioconductor 3.19 Date/Publication: 2024-04-30 NeedsCompilation: yes Packaged: 2024-05-01 05:46:41 UTC; biocbuild rtracklayer/inst/0000755000175100017510000000000014614353501015074 5ustar00biocbuildbiocbuildrtracklayer/inst/CITATION0000644000175100017510000000145014614231172016230 0ustar00biocbuildbiocbuildcitEntry(entry="article", title = paste("rtracklayer: an R package for interfacing with genome browsers" ), author = personList( as.person("Michael Lawrence"), as.person("Robert Gentleman"), as.person("Vincent Carey")), year = 2009, journal = "Bioinformatics", volume = "25", pages = "1841-1842", doi = "10.1093/bioinformatics/btp328", url = "http://bioinformatics.oxfordjournals.org/content/25/14/1841.abstract", textVersion = paste("M. Lawrence, R. Gentleman, V. Carey:", "\"rtracklayer: an {R} package for interfacing with", "genome browsers\".", "Bioinformatics 25:1841-1842.")) rtracklayer/inst/doc/0000755000175100017510000000000014614353501015641 5ustar00biocbuildbiocbuildrtracklayer/inst/doc/rtracklayer.pdf0000644000175100017510001332503014614353501020666 0ustar00biocbuildbiocbuild%PDF-1.5 % 140 0 obj << /Length 1342 /Filter /FlateDecode >> stream xYKSH+XBՄoi|sղ43.nc)H$@nLn&:hקș89CKo98 ;3_bG`0pFwwFBUܬJOX"E4ҷ7}Qm0FH}^C+"G7Tc? g@/4chz =E%SɸŁPɠilқi3w 3c3ZdŒ #~f&zy]v\wڐT2cN臂)I0aoB/-Tʽ{1 LD%0Q*^su%w0Yzuo(”Py{"ad"ߎIX2@2 pfsa3q2(L)PS 5ۈ޴%7m{ie[אDMv+1ÌiEYRVT~xy^N<ꓖI[brninTD>EOG,z<RP|4E}N>Z|5K!jA~Ut.}d@|~6ySPtQdţ׹[f $KU,u?D*Er'ՇD1jx^9s+3[6>%7A,^ŦMj5^#]AT6龵ÖAwkcۇQq;FB/qzj~x;ƩX{XP㧢t:lF(qҡdFw5FtfSfnt]ukD-1Y -U,{Qڃ NDu,\LCcm%)Ht`e&lү͔#k3}D!K<*Җ _3.6+5sܐbAJbAi^?V7q ^;ͲxMh6Z%ڤWJgN<u™ 1,sOB򽦣kD_X`/\w_ Y*AMj]#z"LÝͫNM,N#f$ VL|\:jwϲL#x,?FSU},(٧Le6f[qOaC4O>hmOOpLRh_\/ endstream endobj 155 0 obj << /Length 2505 /Filter /FlateDecode >> stream xڝYIsWHU5n״Ie)0,Aί[.2=K_Da{xduX%??|Hcr_ "/WyVReH7B$I]+[o໻lky/ZUq7IV)RhxRN&*a.ͱ۵S?.lUҰ d=,ޤj_~szczdIOBqQ_2VrvzG|cڅ˧eUU) xid\% W#hvƺxA._{G[n/Lv0dQ]tSOKL[z=ZLJdqvuj>%f "LwTif.Ȍ7;삖5 Jݳ' KUa#Ǭݥ>9bdv>yryq%! 0S i Fe'-"^)ye 8[r`SE^*O?.𣲸=<(%\$!",FD2WH9^1uH=4S!ć߭7~`@Ȑ?r HTȽޜ0e3uAiH9ql2Qzl\(` eRP:5 3RFF$*p5ɭaxElt[/00`=P>s'}hD`o`GV@;`MEdfYHX)Or+[10s߁*"GgJ$К3_PtG,hsW$C呟΃,PXP:󥶮3PJ8XI.]ι"8ryy (,BOVJ 0ΰ >,kFlB{~쌾eQ' OG K%ߵuvp[Js_Ib/¸E4 @S`x4L z` M ;s]BH>8g>)gD,{԰`g_$qRlIadEa Jr{rq`22E4`{.jFhf>o A2 2(~O8;`ܺ=ђ) =OsL#_׾sp J]<&)C&=9a~֊C,_6? [;k?דm?&W_W.չ2 2>+*J pOE7++ :SJCocJ@\Џy 8BjPw^△dz%`q8L!pX<׳auBcbBhE\#(W08U" 1yj8ˡP.}(pT&cvdd8,؛5!A#⛇(W*W"s♾g` {0;E\UζzyHHfHGMi O;XV='/lxj-~!h_G4}ۜpcc5xIG~DSz)G=p?ͫqqD&YG ȉE##m ^@H8!gȉsY Qag;iyEwGNnͰrْrpsȫXۧJb!ѧs~x?<F endstream endobj 161 0 obj << /Length 1332 /Filter /FlateDecode >> stream xڕW[o6~ϯ0t%)n@$m5c@˴ECRMȗ"un߹8tzrb:,(рp@`-e.@%}+9z.$-i CڈE-̱w $ {,TΝ֨ņ$jjQ.e] hJ H®f#_ѥZ$HkM-$_1H% 4G>JmQxR欑 .E< ?YQ#\b.gx`~/Mf(7ڭY;G=e 'dU4dE}g^%ɂ,; SxD_I3qUY%˼ +20 _-˛dФ5od]iv+QyrZ9jb#u•Vk [-z"f4jL"!-.®~bsUL֫b^:C`N*pxM](w- S-Ck^%p?"ujC6#vubrSuKÅO8ծg\U5Q $xנ8+#.u\a0(^x<?ɍV&MƷ}=~GHR/  _z1签Kf*Dj*JVn^>Јƭ, .p;1eDF{~uοm/6--w]ZuOTڛ7Y`Kխ[9) ^۴媬[2^@렘6=oՒ-EWrje7as;OtgHB*/zRQBcՌ-`9RLtV7rfPbONMj8z2BgLejLX羡 8SC]+b5lE~f$s$|)3O=u 1qX&v).gi?@U>@I7;%!SL뀲P53jFWz00}J%cA3h Կ#BC"2L '\EnMbDM6h5wH#PgxoEYY䐆E`g0Qi *aE!q'(mxg@4;mOkO-G5`kM3!FlDޡNo;QTxْt_z_MMw[Rc%xCbӱDpco΀R8ȉw$n' endstream endobj 167 0 obj << /Length 1783 /Filter /FlateDecode >> stream xڽXo6_a{XIaڵElivX[,ܤxWlw4Hf,^>JӋGO^zcZ\\/qY̅\\E?-W˨3vEiF_#ݻD&4}8milůeX1u)t[v(f;QsvL0%G/Gh/gu(aضbXnM>$Qmvv&-~O2 M2.&42:*~3tD:KTiկEW65QԮkEr"@8cKyDY~nsP?XC "FȨ3=Z{g1zӍ,^4Y ! uF /XlGhA0vvYtU _`$Wamׁ 0]і7Ҁu |hMce$ 0@Jɿ, AI灂bq.F< D*LbERu6E0ZE#΍qF x2':ِ'~1s@栒 |C֛nD&XergI&}@:G{TikFe%Z\׋iltY. .,~,S56[B,D 2QRvmi?zO$1?^7U[CѧbѿgK"Y:Y(>?E!4|$H#)CR$q:}pc=f}cbAg#Q\hLe̹owT&#X!7uڲΩԇ:: lBu9V|{|W>ͷ#HW"[~5( ,;`X˭/nL&3cxgQpTtG/.[ EVcsLړ'?iùJ'!"+#Vʺ&Sv?c!\u~_[)I8;\{^P*I7i`˖8XKMpAL:ćO{2E\#G:A8:c= ,%A&,Yx&%gx,W*${-+R`uVI~t+MG nʢ>WmkE/M՘s>0UUB-xĊ`kncMָOHA uhFUifɨ9r8 }i|$ʸ [&KSѠB(8U$L@F?T#՗H_j5/›\[}ETֳ5 :[@qA궬т+o+fUa3ل_i[[tA-(ˡ>ߘv]Yh;UjCEn[bїÙ+'UpLOM>(n"% )+2v> stream xڵZ]s۶}ׯcBaw2q4sӎ'm{oYQM])#m{ $%ʖ$8{X$SF+HJ 2WYVר &(&B0ISɣ#+!'`XEΡ;u uUʢ`y`g4IY:IYi)g?tVq8<&@|C jV)x*u@PG@^En 2Fx[MΘ hJ+{> oIb!\RK1WNk)&mu>*ŗ 7CAܾ-ϭ~n~Ᏼ"ZVEcҝf2g9L'͵~J?׭2iخpsmAg 0-3[LCӏNγ{SgMs}7'FG"0ڎN @јI眾^\=3HǞp<өeZ7ˡN]6i5-W|KH7k2;v[b}mɞ@2ٛu _?χ'uv[FEӳ(2xA]1nsˆVb/^ ߾Lri2glTd Mx,MS?M>NG/_{iUH|3Ul6t+jWվCUǪN5몦qe+{\WǕ=S3=S3=S3=S3=`fPw0]o?×ɢJ @El L\DӾL3>.` E6F,a' >" XO\9Q!odlsvm` ҷMs`q,/taҶ7{\<&UXD= N<_9 2'cMlac_ bt!o-c_'c"Bj]Ћ -,lEdy “ xWDyaAD}O<'вq4 3mt_ Y*+ﷱlNBkB-+ߋ_?I "&s5ǟt8!{@B#؈Dbo1Gk,H!Hfk0~('ߌ<7rB4h M\if@F6>">9HK=|0 Lf_ȷDF$qfIKH 8&#acc9At(I^w|J(Jހ` Xy%!/9xdHX*౅ ȫ걳AzbN 3?k7PS)p{_v1S!(Wl?!&;<U|*^ǁT啵4A4v+CWjՅ^O??#qGSHsO(->Q gS$jC95620k^)JmVSP]4rR䫿:0>K[:lmmCAP {~n+4 endstream endobj 172 0 obj << /Length 1740 /Filter /FlateDecode >> stream xڝXYo6~ϯX$/Zˈ IOɢ(*JuZ16\HGՆ'L&1-EЂ^"qF@ -%bVu'v\?=i<Sz BN ,`CS`)zD[<ȐP&`;gı*v^a%hٱNUs@S,4uǶ C/"Zrѓiunc;mCr>/H pgZ#dUq> sb)لq4*Ĵm_[ynKK+&D]suq_Ea= ,J'3i쿥9-Gf:J6,eq"j mc>TTMU7D(\ WиHJe<,~ ?a~ %wgN7UU΃m_e+2*N!\,Mk aE`| S-SЁV)XƉ ?Xrp  ɮ+j_Lњ?)z0[`x S A<QA|*,1Njo.+#(<;&bsPRLt?m WqU͇S2o 徢Ovq(!O _V-U"2GFa,NE|uR-^旎S7~ɿxOiąҚ$@c꘏I1Ga I&-rG<'@4,IiYPaǼip690 >vT]smhOJʩ.{΅igrƕ:=&S.d3Im}μ'0@n PrSН2 mН}jDET:­LI/_Qz|XCm;x$îkɏ81hmI-n&mEcjPͶɾv@gOӧCC~oWgJ9!sGbo'%Dʢ(MQyQz3dlTGLأ/8!8LI+R&/Xlj@u~iZ^;ؚ;l!wӍTQߗCu , O CMT>fyĠ=Ӝei,F އJZuC! ݲ bwU|_J"W.wODYq/ӈ.-+v;«-_s.> stream xڕXYoF~_!2m"eEd%R`S3!Y*VUua?~RHWKɲ4_IƄLVjG$gj<5Qusi.#T8QQ} @Uw\]ǷwW3g$9GVPy;L K:nYS2֍uSc^[o/A 6خ+mu'P,PL8+$~k:soxc\Q# m'۟a7d/kEuXq'E+Hdn4{ӘNiqKgڱG] R>ww^Q$$~~td>M3r%XWUuP%fSCsnTR9z y hzO?8KO^8|ai_loNII3[g-TRDV/(Ўsdtˮ}GeS-Ku> 7*@חc "wIuDJ̉K94N͚d!x2FH Yκ =&cR@z]7Tpo 䉒y 𬟼O$ǗxR<&1=*1PZZToWyE@oٙxC{]УS3nAZ1'Vм)d{r.J8T0ިs?mƙ(73s#X tXf﫦eD`iqJac!temН\#!Y1g/Vl8yϗ*$&ogmQy7|*P :qUJ8=pTՕ/ fڂJ=^7DzEd/gc7ptEy)D 1IȨƷJYu e -#`DM2LӞ<'ɩqzg] §TUfA5qYG!BMJ]Hs[LJly[Zi 88\]o$S͌`}ơ@PQjAbH3M84# =;0ϢKY;E:FE4_gSvQQؖ$Wp1Dd]Ka <=JP'K(3|\_c \.Yc3R·,%cT:HLJu"Id>|Po u]y>+C 7]! ]Z0BY-q/ endstream endobj 190 0 obj << /Length 2051 /Filter /FlateDecode >> stream xڝXK6ϯ0&{"R`7@:ٝ C2Ɂ-ɶжhHTt~}꥗[. "UUQ 6~WtYYnwU3kh|p=y׿eBt3!\Qqh{φ`5=zև3]u-NӁgr znac]=閬eE FUkv,s gkJZ j>{dWu] V@w˸GU H]|n%eÚ x^16R 3o; lu.&N2^ݕ oa HHN#h0?;#Yu՝,UsKuS\aG2PLݰ`Jyb6=U##}jqH m> o}1C挑`CBէ.j'4Lgb¸]+)g"mE3f_v'PWLGw)]^*J΂ S[Bጱйr|IR_|MOjdfp/ 0j)T7q};+VbZO,pXcZph4Y2=1SynWnm'*uc6Ps4Rs,Hdv6 q\?0S‹$W8P&RҮ؇x&%aݴV9`T1$@ ZOg0٦XM #E%,G!œxB%3&lI[2" 3JːєT]XgCM+je eH}SeKNͱ,bHіv[m |VAܟ1n,94??i8ZTZx߈Tna:w0; [Q Ɠ9 Öx2DOn 3}bI)©h{;1ȒcalVɺϦ];3r, 嗌hߏ3$ iJn\ ['@ QfZa4X0SevBAs_+/+ByWI*#@M47(C R' ~3ɼBd'wDB׏F^R7{qP}j _> stream xڵXK6W9IEPGht"qIQ2m%q}Aɒ8XbqHӟxy"j(Hl4Z6ڔsx2Ae$R 0贿+xh-NbSs۪~w8ѻm lQd7. fjKa:0=asm̼7Lh{#0o)eQ6w '!kH3g8l@ ӝi<:S>(y6=NC jXu}>`6pNfo75hRʙt \"QY AD% oMWgFHYe^\z1ڶL)0J#b6ɗĿ搢Hf6q$9q>ڴVn}l(m`CPRJ}ɡ@7m-;,I4n VVDSacz25fzu[l,3v52& `ΤݽXl1dG9YJ:gِ@D#J]1iRÖջf5 LHW :m, 2 1KkHv)݋+ <ɹT)X)~Q˰DOr ac;')iw F[ N0#M%A\Tv :/1-ajL4A(R+2E<ۯWȆ H h}>1!sR*7lu8Sأ|J^%@g'$>Z熅Z~xGPoZuD$Oɑno}FBfbf0fTS!K8)t8`:4TRƈ{q xa +9z>`x^v i_"**{pyGk e.WP|dh1;Rf!ƑdV ̀޻n@g؃ +>j{[kx=B\`O@-!I,cl'[;Qs ' js)MsMU?9*dV;ms/γ37ބ0 ˓ ] zo")ntwû׿2͆zynʑJ`ni}3_0~#3"NC$h)u5D| zLv`.UYX>y"ٌƐʉ endstream endobj 207 0 obj << /Length 1851 /Filter /FlateDecode >> stream xڕَ6=_aIbF" ( $MҢY>$Ae[-9}g8[NkHpOB}| Of,I6Kqϖǀ3Β"0x1<(̣Tf 'ZVx>QD!l(@Β4\tO`R))WNA)-:Ky$YY3BZ3flU[j{]|=ځdc4f_Rɪ2G+ӊiǢ(8ڎ\;R"cU<8IzvXk(bj"✥Y?Hx|(.~/b;eA_ߧ00\/ѕr4 W;[gbSw, .aЎw,c#Ce*[V60>n)ㄓVqHbB_P@k_@ݥcdC/]:+ۄnl֮ rBuaUgA4_ٺۑ/}I}b|; Snɘ vmXbz۠UE\-MX̻+|N8O'c&4tY'1.9d];.MGLF]ғP=>aԖ(ۜoSL!®a'[4_5w2.HxޫE/ ]ZZx%NNZ)Pq'ׂ%`N҂q7-uVM B" V{6cRJ|`B-{| y* cV%Q%k9g0딑nl`I Ez4(xOS /Sv0#bB ~ qą >I0 aaW:)g1a jm ,A>`hm2|k7Zw_M2瑿eS$ |Z=)ms1pK!+M1c-WS st)uQ wYEi>"b8 ?qnzWqͥljlB^*"ډim5D}8Pba axFNl~F^[A$? |_ 1śjU)K`[;;#6q@ȄS: $w&7n#,IP~;h"IVQ@H`+3X9򥀦qc2MY/ p|s~ul^vW*3*g 1)-60 ]c򢊉+G)c_wWV ~73ɩ,c_ki>nhl+QutD/laqԘfyx" O2qWF&2,?7(m[*aY` &r8;pB**r "T)Az嶛$¾N]Ko )"QI򀜊ѫ~*kD] lny9zBC-jM@[kI){P=B p&ưp =S SKɰLm7v]5juVņ֤}[g0%-xe0v?ӆ> stream xڍVKo6Q,F|. ZICmZɦv_$kk X<>ΰHn"y+/NjVku¥d6.+&d_Y^2mUkQa YSܵ o`4gY ) L"qP`CorY2h}?v\㭛6$֡Ic})-LpR{r@"?Z5L@2#|D6}{:vE2SEɤw笄Dv7YF5eyy Kq="˕Rb °p9Z~"%t|n8ha ?.O(4YuFwm\*z}p "o.|N`ʠ6&8+ 3KC@g6kQ(\0|`͊JRקX=P,#{bfr^I&:OPg pw+f%W}J= *L"=m׏$azz _ 0*2`ͨAۅJ3Q4/(sR9Ml\%(@)t&gpY 8X[gf#qכzoW=wlbd2 p` ?{e]TjQe_J~ùּ'\0nq*Rryu;/zEYC*^pF!|Bc=N#L,"q{:F FcO~P.뒣Xцq$` 1y_$|ypc&iR*J5M7yS~3+m+8qGoC f/!\5 XV M?FiSp+lagw_*A Zk]/J#C884=޷*~U )[;NF189hqz]lyt۹=|pS+iZ@o["6Ap\4I-F~8yr,oW@X33ז"s endstream endobj 213 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpHXLV7o/Rbuild16f8b49ab4707/rtracklayer/vignettes/rtracklayer-trackData.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 218 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 219 0 R>> /ExtGState << >>/ColorSpace << /sRGB 220 0 R >>>> /Length 2821051 /Filter /FlateDecode >> stream x콻g埧'(~qi%`i ^5c_J;FK\Yr̙o[˷ymc|}[l/?-?}to?[~_|߿o?~So}/ۮwg?}/62ٿC}?2g}_҇;{d2 Ƿ3$iY& ew?)W_W2p}Vb &2=M_ŇĴRGj50l*PNL#:1L2F+ 10z# 10F= 10V# !Ԏ_ou9'L@ˠlDU@ʉd0"D|>P~\ M_"UPNV'dL5~ڋx=GvVP! ۭ!=gY &x=#{p{=T_R%ErVRakUJ f22sﵛUilU=u<PV??86, Wf׊؏~ !f_i y+!NJi. VDcr/~zG/Ӧ5*CA$|rք_3h%5[V$|@4&b ksfwӵ>zyS.BjbsM}dLYV'd>'5n^=3" 9@)~H}MBS*Qve`&!3W핰&b++ T22_t>EX'd O_VyVi[k-{Oe6 .rO 37>+N|Al탹ja0 e"jr+Ce^ed2/sW>_TdYCm_T.ce}1jH"ެis«O˖)٢cTGobYSmS_zI}Va &ӷ{;;eogFOP=N}V&,d2ߋx>>\B_}|Xb 2()>>,'bMU23>UZMOr"Fuנo-[B?{qr":L&}f{}Ш:ze9 }Q ׂ/4jT,C5*dOAI$╈M'ⓈEJJ;}oJߏ4~Wz+}JOJYv=ZOWYGm KƮr[-wx>;|on8YhTt.O9ng9f(Ay>s9mq$>[ۖ睷 ǧQAFĭdaic 1L`2E?444ӸӸz|}}OOcilӈ@\XcW}ۊ2q[bV<2o+d2_ L8;>Z,;%B9E2(>ۻp[[PNG#A2/%3WB xl>MTAyaöu?L8L{g1shY>6MЗ̳>d0fdviٶV fxDAsL{r"::o.Z1碏풠bTC,E<6kMʠ}ȴG}Va &x,vZ❴%8x;-oc%NKomX\;kkvH{;xc;vlox }~c qa?}dUZHKN7(yaZ{>hL8U>D:.m46^B"_2ۆʦ&s$ɎȜapMC_"΋ V"c.-$c1{,2EEȘZXP_^d<"Xd6ΒM{K00Cm٧<3L7`n0 M>g"^x}D< >x%AySۄ#irm<eP޹S #i%}('>LφބkSϳyhVZcŴ"2 ZQ v@4&b}u}V,A7kЧڌ2뗝cI^\÷ qA%^YC! i9` f !K&B,d2'q{sqK탸1'{Dq nx^QQl=QF l(XQk=O SxsGzuV qa?ض5=.N:"P!æv]Z{:֘G?ɽX3[?md۶OA9u8ڌ2(~6+:HʯP2E<{DlB|KYAIDqPzXjP4Ap93R[}&>7|A'w=wT('bf'֡(ó&8mmr˞rͨ(r6VLX+)K­kL{q>Npq l'w.u/Np1*'~-/ 0&R͌LRePRJKA_6ZXK&s"YeYGm"1,q=\E\YwbGbAS_vU([+89.r>9oi>Y-bd2ߋ8 XT'֨cTĨ8=*T'֨cTĨsT<#I jԗѢmdb ZNH_N;i$d'd\ďޙ پz?VZ6=zZ CnP$>FRmn6򫷻wePCqu} ,d2ߋ--~۹Vȼ_ \, Kkn {q_' sDsVx=RЫt,LFJ'gk\Cu>@fQQg6cWcg6,S|A>Fh-16/FhilƆM4{d\r1 c$d 2(73^sƂZ1aԗ};my4'3d2ͯgO+ϑV\5<{Zygi?V#<{ZyVd߼1R66&]<6&!%+;:%u:Wl~0lEwظgXi麘hmnEG{sdfaߌo'Wkʃ;43_tS.H_ dΊ >r|v?>-o -Gr"F(G 2SP_w<>Ǎ{>G#qO}>D}r7qI}~c3DM7@<-cgb 3q}<)cFfx]jب7|etVİU/#|xb@Ϗooo~|#|3|/N/L/僃M8Yz1ڌ2( p#}(1dX</Y>6K&ciޝA6N޻rLl b&îBxo}|,_} 2( ̋D<dH&}&# ={1>71d2_&~l{K"~&+NH|g!ePn>^"s%z\qX'd 7; ❈?=Ke0,'J2(ZA}.KP3d2?7}>^o㯟qڙ?aR6җ6xC F E'b\ W5|;,|sk^cq>_\I&eb8soۮ8"jt> >L8>,x`2//1CXx]u_09.3#zKA+L,#Ŀ=#uo|i1J }N~sf96̥lJmY4hnӀ,4%2xsWC?ǛǝǤ/Ab#nU2 95NOv=3]KAV x@43iTta޶*57^݉u3imN,۬'>܇@gPy7٥N:xxd9C_`#}^qvO>B'#vGh>7}>޿cXS} /?,m"lDkʠ|m">҇Ad2qo=~__}2"n;QKscNdLf487q|?1,a>ǽ|Q|)r1'>ǫDǰ~;b˦;ey,-ePRH-=҇dXD.~ ð0[Zti{4z=F2(O%:nG!K}cYV'C }"6p;Ep xS},6̤eQoz_L0kB_#FQ?_\/)R kyHEÃfWU8+bbI&5*F+1*z#1*F=1*V#w [\`7.l>FdGf2^.l5JpaxCPNċ%ē?>NJ},⡶ o=]_Mq0'K2/$f7Bf{FeOMO*op#c 3\:L&1"F$WeuI_j`Jb7R$WW1LFrݡ/[(Dla-U:*}R@X:CYču2L jG7!%W'mèZ9Qh8.%w7x&~ x-;i ?Ad(8pUVãؤ ~;]iD9Q'b~mk8ڶv@8B8޺EmRg[w;L ` Aq%MWFNþm%EWF͢SHq&}'RسP'â}";D?g"މxD< >x'}cp?='aYKm A r o&.R:I"Vb ~X7?sNhlwXsLƤOn*f;dW䛰q}0˩ц~[bojrKu24W&-APb6Ą@È q@ϓkgоhƘ[2/?ak'G]>VZ&9V"`!&!5b ]=?m:WeP^Ň2E]̒|9 }&b) Oi|=d"b ba48VPbɤ;>~ A}3ocP_ A}Ӡ? ju ]* ŠX g>_CuSa'$Qii☰Yx$& ;M?j.rУ>hvxVL P+?Xubt 5gcO4 4r 2eev)p+ЗBTC1W& x+ˍXNhL :oג/9 HIʉH&|Ig1x َsvUDݼuZ^PʡH7$s}; uNiz8DYte } ,>q$x|vev>>;|o;|?w8~?x~`?xBy0*rmz\~E[+|LAmEO QmYIkaW:#C_J_E_37,3܋5K#_l:z>9C`^?.ͼjnw"]x _ӫ"^腦KK(DG&͉{LhN<}='ˉxH&EA޷&-uLɤNi'̱uw)E#̗[/V0*9F&_d}c$MW}#"| Fo|'b5A9v 3|?r9߁Uapr^,'eP.yr&59/Өؚ%>wֶ+ba1"jS?ĻfK˶5ދ:xB_y=㳊Ѐ^gS2!#yp|Lܭ히Q'fpN)tΉs6͔2Qjɼ3҇rE#̗kr~`z(zQ jX~l@^r=ZQ v@4\'i '\~"a4_y}In4,Qbub,Зyqc.:f^t؟3/:E΋3`?>'+Jq{JlA;/ך/xl VEW?IZӐ9)o2.RTt[V ]T>n!D0ɚ-lۍd2 5y4y4y{{{L;M+Mcii?M޸tn8 ^4_3Ν̶iS'9'bqX1d2_&~θ <^'*sox4"&9T5l"_{B#5ux_K5"BkvH_˭6u*Hg!}(4`L{wk%>FF-[~c?qv# &㮲LbX]Fe᱊<}qqJ&]G&Z^i ļ %mҏk]O-TdD>u2mh//5 J>'/m|Aˠ " {}A ߈7c- 8~M8N+╈w">#6 X]DQ,Fne|nZk7!}(FnW2E|uZ>|Y~1cAy[^}<]_` IoK㹆ҤE)?W)?׳meiA8G&̮5buqe+aC};=҆zu|wч uLJAYN2|/כ߼y=yxo޼޼o^]76Zlk)0Z0".7oL|~wśwN ^}"fRh9A')>~Dq nx$wヸ'⑈H=╈G"#q'c#|ؚ+NěeDɘ+VQx71W?>7o7o7o|y-y#ykoLoHoC䚉y M\r1J@DlC5?V!A.@n \3mwG sobD|%➈qO-♈{"=8>} 㠓ƱԮ6ǩJFa9ݞ.cߋx=/bK;<rwob΃x M#E|̚oEYR %pw(UCYėu0@&esUX|'|py".KK{r"^ty|Al)ܦޱ/;,xm2Zt}@f}IJI&n#f7\^_oL1ٹ<"n:LķQN-wjT\m*8*/oը@=Q!")9¨E/5w|>Q<҇+Y7=ĻeYX{,OfB^21&_r;$/18[^C9ɵ_&YI".ρ҈Wm*4ϺSyAW^\&\_}/Hk>p-j}/ȐW r# "왈٦>F*Dܒ 9͝J'pTp2 'N;FŗD?3 -pc"^EI#f>XR1 ]do}+C_[!n,m25- C ()"jS{gyЂu0w&.AIx(g>^-J߉ؕIꎿ3:'b~x R*`s{J2oyGηVg1ėp"7Z78.d!̯qK5Y3 i;B)!)!^Ğ*a1R%xj8pߛ[4T HXT\&٣yk47r"n\ (M|fīKL b5bv~Ź]0 Efi)3(|LO5\>E@g]] 5B[_?Fďsg?l/">El5ɱS?h ߘ&h% 2kWzzjGy2{Q|BPNVWCY]mEv ĝQof[aA1s-cNA9>1VCe҇g0 4r'b$*./m\,xnq(37Ũ!^CYGm^7A>Ui9Bf➈&*Dҗ8v;g ՙL{o?ﴥ~'1ۼ_wWO?vDw}#?7'l Xv> DwA y>/@k`u?uO}<31ۦ|CE||TpUwp;SDLNj'w';b&Nj'SRwvX NLQ[ A‹,p>{)9f>.Ma"0]{Yx9+$N{E\3#dl R(tJ_"^L퍪wf6z}qs:3v<ؗ&a95ƈrpbD`X]&Џ^Vތ ^3m.SD|xFK8,>jL>5s+V+\f2+U+`H1W4WL bDlÑoZz"nɱ@?Bp.VTaԤ5o#ø6 oM:C_p? Ja?l+4]#Tt+lMp8qҷK'Nך;׊<9Wg"52k?W:j5eֈpWE]V;\r Wp;5Ƣ]k367j~ojfW+i|NZ?ybbeaP|nY* T.GYWc2jdY.0vnJKa\[XNp\9J( wz i sb }AlA;ݖ[Tywsʑ |]) 215Intoff\F]>k杺yҤS7M]L}e@6=ZZ1}| u.~| eHҘz!>̔m^Ül('q-,'rī`V`$['F(g}1AqbO:$ƈ|̤JDڀA=.1 wCYCm`ڼoOĶ$8#`GIc.)HGIK (Sy(i2E|N&>*7 a4]7:%cJ&C @,Mg2ωyeB#/=uUtJPvCZ n?4~&`W+ Y3~c]3'vY朄~?o 96+5|Q4e_j l8*Oh,[C2(PdG#QVhQ1B_"閎6OY7tMT>җ;=k>. x8[f7?1|ePxN0ʪloMdo>#*oY BdQTE['SAcGyRSLN dYKmLB h9:EAL^L2)҇/8&}e3qP[,b9+0qGXZpcҮ6Qr(>+O.)10C0nE<6uyU }.Q_K e#}'댵&b$pX~ ^x60c ~֌\yKOZj54ɱx? crNRkS>0;v||c~}b'y!rm<NKj\ I|LjB~.aCXI^+9a<Ҹt)9Ӻj#Jт#zNj}ҋyn g_,j%1qїyʮ[>r2B. 9 +*6|FZUƍ#BmPе(Јrp<>#%,`@`輇:42qYSk,U8اϟ!L5L6ngWѓ&'XiD׷;L7ˬoŁ0Ŀ7GbsrFJy~D/& wL#iM%{oG}g1~ٿqozy>?/.^㵔ՆTzKyԦQdx'G_wMNw"X"TdwrDVHCy\kfKe9T]&cfgGL͹y9?4:(3i_c2n<+T.xG//(j.3y}t\IlwЗE@y+i6Τ ze7Ѝ2=l }A|O'ipmmp77jRGS&!ti׏_&7ms7n LƦ $V#ɂ5yr9]&}&Ftnc5O&n-|3#6$qbgO3}lGljx/D[zqHUw]4wz,)8XVsu{qlb#10㴃q\s]F}ۗ1kmDKSzmߟ=G{S;dVȬn駸?۫ڀ7y.`>R]ʋ+}/7;^ y}j7eC7$ p If \?fH߉$ RMI|=44.ZbiK~:tD͙cÌ|w!b@2faEsP0ʹpxxx$A<~A<~C<;/0a#hBqK#uÜć QҗiAt8փx7Й3C*a dHUr(༝i]#U AfLϵănJN{ ăW8)6tFHV~3%|=t>`V+' Z_mTGoίڀ_З-20Bs7M]YH4hyҙzDg.e_[RFH ʭZPRa[Gm8HY `ϚO؇Q?ؗ; 'mpr]f2p`7Ad-a9VhH c'цEҎ(ri3 ʠzI[7RSV+xHt, w'G`FC褢 ^ dAxZr>Mm`L b~D];/2OQzz2(7{E]ꃴQwpҞŶBlWK+Ec f #B>h{Pw"LR0]O}ZܣQzG9[b(= G95Qz{ߣ:g=j( O>`$N*O>OSQzMd,CE?(l3 f[]x@Z+BFP.DJmf@H$pL)2y=4 Z2ͷt3u!.X~j,k[o%Mri%,IF3\eK6B_j[Ji{Un.\&U$t2SN.FaYMmX&Зw2:ǿF磰l<*G\ؠ0ۮˑoS[A)^D\GoiDe ev@~`( 8,K ;քl714&$:h54ɱbZ>A= Zpli*7.;i?_fO oօ@Yce0xVnr''c"孤qO١ W7.^%rVXSr"\SWA55rA!2mKng4.n]6[8^ƿ"vZehNxdwZc,60tv}OoM"xfE̹eR 6֑k)+hL_l81p^6bc[LrV~&J)2)̐=m۴Gߡ/adIE_;G)fx5wd!uW )+tltۡOć/珨F^ٰ;qXNē2ffbc/ըV}^/A̶EDxZb1\엤Dn'Hϊ>7}}kqZMbLƮH>Yķ!xRQQma8I(D'd?cx)X1Sr5/D2Oq5^նh&}n:53y3˂j+/ nE,8&Ϯ$JQ fWE[IS$6… )p`7l<lɱl?7_>/|f&$n:>=6F8ȣ)7;_! OXt| KҒ>"Tqŏp= }-*+AVK"9V2y+=V7 3+Oe֌~AgzAWzA : :?^Й^О^Ο^Nsؘe+mNrGv-dp5Ф/o&,-6đRǞ)u$ ^#\s!o9q2W>I?i+@z #x##gNbQqҨbQӨbQ1ӨQӨ? ]1;n6"ƝN՛ˠ>;L>0m }qA)$Xkm<6 6Mi")ra2OMdrNئЗg^Izh9ZGw|gq2"Lk(\tˉk2OxjIoxvznzǛwӛӛwo^-ͻͻ?yN1,'becFoaSrKeɘ'9)_]U! o~SFȱ2We.ZӇŞY\f Gx G1bH 39pCm_F x%AHx$➈J#!\n3!ؠgaUZ 6%[2033 #iĮV@.;ˢwΏ_&gl4e^yxMCyʸJ#ʂN$ Ý[lw=YfIwT29;,ZuXOZy#iqo>fʠ\tY*}( r,\iA?f9ٶh(s!}xЇMSt̝Vy6+D ']5D^޺LWtõ +:*ZQV,c>aA6OaYGm?Vyi.l,o^Vi܆5%,vqұzBO,e.o'nY,;#-K;_|A>["Yv탸qO7}DqOOpփ7sK&4L.:';>Y&je_&%Mȶ,J(tUZ&9VZʛXrvyRC.e3d'~#㏟,,,޳gf1E0&{";"+"Y0+#񐭊.?OL*p+<9[o%McԚ g6zYVR?bov eB*+sb/om?+E_^lxٴ[eMPqS[er^|N;y;y;Jz'Wx'WMRd+lwz|uFV=:#}uV;i=:~uj7q"n (o-o*ZDtm"ҵyk=1b޻=1|1^z]vEԦ~CYKF[Dw·Ǟ60LZ#-#dx8i4Ox|FJb|FHb|FEOb|FHb4*G\< ꈅ-^a9wh.8w">#NlR 7xw~M}Swϒ>}:ruG;FHjֹLbJv{-FS2^"jàX}e¸Vzyr T>[b,ۉ҇r".^=oz,(1o&NKj)3_82C1A,r+CQ7o]r+o*h¬tk|fso~DENcc.e"BclYZV}Sg 3$Lɬ=z#!58'"jAכa`) xŠj/L1Df";9DF"39Df"#9Dv"3YtK3{t8Sa_&~~4gKQOo].ڮ5\^xkUTU<LNx'wz'gz';y;;?QģqDJ'O Sj&A F(ģqЌCSLJƇММ>47>4?4ŇfЌF|Cf>m6<7kc8@إ2(W? Yt@A>EՆח(FK(/p *""Ay66鮯02/#j$'n ʰ̭Tü|\f1 \ٹ2M#i)>\&q !_DVZiR浃' ., R:D<*b I|>GGcغ"GG+E?#Wc8tt4\&5W4W4W􏹢=5cii?׉%~?}װ@e7cL8¸h٦iVFkMc_Hυ@uLܛm˜FX!CAϸE($ i CZFd9ٶó; [-Q1s}`-Ỳڌ2(rPrǡ)#"Ϫ2 D5 #ųo{tjegqI45'V(:YNĝeԧ5*.eEq'cnfUE<&*GKċitXR>()>޼Ľ1"8BB3dbX!{#?kĈq2\&1=XX_Z3$ |َŵj%IZ~r2 0BD]d|3q Ih0#f]d|zg"?HZsw[{T!".كZr][ٿc$ٳf.ݺXQx丑s8WmP3.m!Sғ\w2ꑾZL"!~"Ik`PnaFK+uVy)K bxqv~ % K1aΓ>SOZ'b6Z2t`,'eFpcFO##a2x}A*D̬"MwPm-ٶiP,z^,tI"j7}2{QqΔlXfΈ<,r1wrY? _Tj,\q[f ^}>^/;/N/I/xNzvzCB|'|秗0Z_n ^@pkͨ(8L"R5He_ߏ|c(9Pi(4Pi(4{(9o|$ Y:V9;a iDu?ó:I|Y&̚-ƅV>VRjRbZrQGJQNmUBN*3f=jgxUVQ'-2`#A[ǻ~yv\Z~N'*¿j,ɱRGh TV{)LZ侅eRѵxʽw ٽu]f1yZ8n]E:C2Kld߫q:`Eې0]Bt!LbZD+i Y'\MWKb;w=ɤWbs}5E]m԰z/k R)oȱ`a%uxSr [&e0a+gv!Y}9=W0w T_(5˧k"N\5^5^^IZc9٦r| +Dx/k$hilᵥ$8~:lMlERVʔ [ISy8֌ JiA+ cq pC}p@[~Z ouެϸj1EpzhmeἫLȮk>ýE}w;[ASdH6Z迾30/3;'NA9)tͿQT0 Nj@]NYOFfRrIʑe`4 f[eA/-JϟX@hCQwo54ɡ.ȕ#scx7 3i=yҙnTP%᳕;Z3~s+Z{+}Qt4C.ޟ{~e̽?[qq ng  Uօ[JRxj(N~Vg3) 1ĉؔCYj-FR \y~qJ:gT-ʳD Z PcQ_׮WꨒWݴ^*px"i}wZAC̚,Y'3Q :>flJ_pM0Ȁ\>ma1C߻Fzl8wȃ{{+ϗ{JpVT<)Ikߚ/cpKddʠ\%v\Sfڒof x_7p ~CWku;M&E62OQ۶אٌwy{3 l96|c҆2/aッA0e7Y@"lu7;Vi>Q+[ YV1[ȥˇj݈X9VWNl#JJ*ŎMO0GCz)aEn46.;BWPN}tLydb%t"nXNĕ j$ FP5,h 82J-,xm[l1kl2H>E|Vy }" >¿c*^޺6}RahK؇ea_Uk k }7fI' NaH֯*j$JL'Aɦ=L /Em [Ia?؝ނd~vff ղT~п)\b8p#/3:"jf Mo`E.—V78poI|6]gK׋U jnĦ+LJ)#9r͵j% 2G& YhtԆN: Z&SmY^|11ncw> fۦ)n*oD>ʹ2槣ld߫Nwp8rVb?BFL,+$g;`'|eQqU@lD6 o{bTb~L b$JQ, .pK2ݮ렯Xw ޡ/[̞/nfp4*VŨ*(nH%ޥ4:sP}<<݂.f~N@޹>&Dq]j_|_~)\v}j51ɱncMmǑd˩!50ͿFXoJ=r_<DI~c/4gha&>zi҅UEi&Bj[4&@ "Ɠ>YR7+}ӁQ}vrunX]kwNn|FOtf8.ŝZ/щZ+ mmbT[^hG }OT^h4S>\ ,m8'F4ačXWlH?ĐqWc_/0.fQ'ܝI 9 E'I1e^vCYGm!.p'R7?~ OAm!2 }" A|1g1l|znDxD<}Զ_KSO+mzDIK4d}1yދual[ KʷPD4K27>e[Z{bp~{\7ΌTZs#ZꭄħFq>M2%ofsTf]{gG+auaQBw|o$ٔ+5Ru܍6ݧާ :ptxؔA9\Mػ 0m٩/OSE|&}~:1wC_ٔ2^m7Խ>}|,F䛎?2E|Զ&gKUeWTN}Fp˫)OXf8}jlJ7 cj4f,K{;.biPXאA9 >V3q }Z4!c|I'>2|j`_<AV NL5XqTknFV[~~s/rɖގ%vOrC>*?%)R͏c=)fh%$jh5|q@QQU~VTbVc^4{I/T1|.wWVb㔐h8crΚl3 / 6YP CCOΈ%S4N;+1?Gj[4| J.QGJƫh[w߇xZk.H7mFT8H+M*;:13w__?Xԋ\vSVE+ZFT)#0s7TLl$ 0:YGv_|?<[mu^"6#qCG2/a`W ,Em`(D<ψ<2jYrdD+teۤҠqz ;d =/qꛒj e>6[/Pyt?,z>ضbWM sb 7 IE[0HdxU+`C&w=wIC_ooc<Š'R7RHKXlGg#.&-dnD|ؗ,V'd/a Pb;!5eоlDi$$K| 4쩵ƂN#N9aڙbR{;m㯀ލIj'H'd~Dy7fv>0|`1eK\]6ʠYA2y?4 섌%1"w?yS~wuf | G4ò0GR_݈_;J-of'l[L0s&}Ie-FdžuHf$TΧ:}ʞ'}9RO+bYqUۢ,K2{`>+P[c=O:"Pz0j]Gw&9TUNYn1LoѸ1=ğ?ׯyM[[Tr껪bl:j16oB>&vu~Đ>JAAЗ~xpPG(MѸ,[ Wo>(!>@qg)v _@&6:ۙ%c 6Dg}dMPT[k,K>OGeqZS wO_9wF6K.Og6WL+\l01~asEbas\Dۉ{ۭB^f切[$ދ0*(!c|>nfiݚnf3 ݚngv6 _f7A~F0*z^ШMѧIFL0*"M0*ni%٨Ȥ.`U,$uwlFdfI]'Kcj} fa۲mnfa݆nf3-݆n/+3Wt+g6Wt+\l6W̿󧏧>?};+=Hp݈8V^7@,ZGu#\76$=>XK11Ͻe'dlS_A^p"H%&xAӻ gl2( 7+.ڲ=Ac{1$7yZWPnEն;uCD|\S:dC^#H +sE/9Wk}5W'|\s8w%\Q߹Wz;*~EW׸jM᮵V/Nq< 6qom7dIL9V23\iZ8><&`t?x@l[_Ȕ>qFءL9V,>ZuԐ1>'^ ]u=ew]җ Z60@x4󏬟kq1$fbX駥OGЊ!}vZ Y$dC"`>I\0jg7de#F}k1lsTƨ%"j[4)}"^Cf/vŲ*}%1{80'g.XxJ-yX #'Viя$e5 0!Y)aR7S^\9/3!LGIiDQ0ۡ-KB/^ 1A'MNBhD!cr]e+oY4@06VѺб{.=( xLSr~Sᵐ{=/z+oۓFtaYGmVx\gĝWB_ko\a3BF'.7vxcΟ:jm1Y$d-}('1Ql_#`R316]L-}؀\ `Gfnzoͻ2T' 8r 1/KpBzqbGE+i*i>vAi8S:ǪK.j6*|ă/hŌh䋙D|-ڸ>" pVc{Z?3ZI3xLfS9)QGҭcgHxˉζOO? ʼG҇rB2P>F4Dn:E-Y@ib1WUm}[_ǣ+0k&f xK2<R[XQQ?7TEqvvFEu?nSf ÉVir#Ֆs8qY!3X6b_KO9a|I|7+6mF`0dو/8W,1ZQ\w F?҇-dGx[oC~?kR=|+IօTKEbhMM菽"$vӅB/ 7!!dz|97 yӭEIt-]sqqE?bو7!WȈ8O!%!$>-5;[m`.1@;yO!P,q  1n/ҷ] ^ID W$ƩF7~F4ͅbļXʸ#}@\5{/&E)#s_ĉGNOo0TDu)/ wh%f,"j=")<5rwDylF,ˉ~d˽Cf1\r#a rԏ;@ws[Y8=('HJ[DO.ymVo)Eh% 5@5i{r8k2 }æ Z e#1>'iT#FE 2D=*fU|K_|0LQF3L*sK{53uo$1fjҖ%LCf47gqA9S#L-}O}IW$Կ~YǼD9 6QzKáh2ޖ>E<I͞xe"GĘs"'.L!hƟ >MClă=dxlH;8c 7;dDF XB ;_ÞDӦ$Ɖq' Eնh,[D+C0F#p.U]߇x\q5q;(/mƭ+ψ{tB_b MsEKjB^~^q$ZD* S6-;>WK+ZI35BL'K)#C&)ʲЀZ-:\J-X7|<̠>h󟳫ZuCw]>r7}fsO9gM|361nE!wʱ!7rHI!,SY?ω7f7xnQkwʡ[7c >[yMB!<1xjjjbl l_Q- [CkЪ*_i?hoЧ.e~&v,t(c|IdT±kyˡlUZ 1*c~kO\*ɮV@Y#BTÅalr05'Z{ܲ񙝹{978"X1nr6W^<-L(ByAq]1&-W{3zģl7ӕ?dbrL.VX&C0YF`~O*U0Gg+=5k$џI>,'Wɹ?,zUw9/y˜mI9V>y}ts*J!4Lw0Hk=:~SiXbceAW aildsVϰyiB@>=?æ=6lO@gԔQ3F͌5hӨ)"oܕ.ޭD+)ʲ}ܛbm 4RY=(tbZ(M]'XJ B'b_9%*V4Z} 3jtC5[RtV-uaz?=RA]_˜Wd8P'yۅJwpROwppF{LB`Etj)_n8ܚևDg[@]ak']Um`ܑZ#!fq7 e#nLh{Bf1w=k%}('1.e/ח PKTd Ť"?%}ɸ) }K %חl(I824x -Bp_ȫ#=ag=$!c|L Ѳo =f^'dPd/ '{"{PL/FRk$~Q]Nv}sq:ctʲux!90{Guo)gP!0@ gs g@UP6A#2ZI 'G̻t;8v}/O)*V$y=By^?z#y=Ry=Rp^RqG:Q6ͳ2o@Ly͟ݐb\w)/Vk/9Vt)笎˾U*z#m2(yn9VilD|MIxȦ13"nj)Mڈ/ |>8!I"jF1}ͧA|]m 3b~:$b/qbax~$Mä…CVE+,!b5%Jk5c542_ݽ|*VRmw+W^oaw3Bs֟2wmx$M/s~ *VW.&;dwउ>tM3;[oɱaޭ2֩ ofoM3 ՜,z1Cf1S1X^ɲ !c|Nb5#~O4~MďaԽAycGP #JߧO˔x ڬ뷏ÔxM}\ұ>~|Q%5Ört{[M驵UߎVT]VoDd*`u NȠge5Y;Ԍ1>'9A3n |^;mI꫈/ϠsiC_ሀ#dC\,H P0Z=a}5ԜA90ީSP>9qiՒ[~~>QhhcZʢC|]$ЊO&U^d}7`X7B_j[7ڤՑ>q_7=:.jc2Ɨ8N: "<|_Y̭f'Jz#`sy=%lJv{T֍JaE6YhEE5ZI#iZ_~/_~/__#Ooj?_$.N_O!rd 0xaڰSkrΚ{O#L/<ϭkg.#d ts$9x[pgtrUdUTԔwaiD٨}'Wⷻ/Hݍ#yvwɛ6{rO*8qR<~~odCgj;sgDtc%'<ZI2]ӌ&]d*?JΉV/4&9y+|, {Z|zfV@}/)?,'sdZ!c|ah/8Ɛ|40~r$fHFE'>ќ604_'ЯkcW\Cχ䇾 /폿KC~}\.XP5[²~KȠR,7lBcMk~>nxA$.KޖEb/,[q}fwοQ:l;)! K?QtB7K*oiO}r>Y+eDlU|}C>U{|+U{W+՟Wy1J^W(@(78d6Í$d(g>c>Cmg(Xψ$fq-{U9g[ĵ%q$EJ}I~o͜(3y4{T]*l\)NÑIE{J}"X@ ;fR.?j&c| ~RhݙBoc%=g8KWRf+1׋ޞކ 1"b|w?c$u1"$.K2n5,ˠBMmAs>v7 ˧E_ d{2!|N}N}N|N}N}NdsG P˩I̶Le1rbv/ x,,dC7}<7}ִ3ZsVmG~a<:.eP.fP!S捍"}('4۪߇1c"3{/16;5dP~L,eNhCMrz#9|tUD]u#kh8r"a_;_ۯj{2GX`7;dllAǧś2~~x1>'~ {zfnj̚-NO+]IKfꩶʰmکOpA-?#j MGăfDr | GshKI̶<0/ک/w7Yfe̎Ym3o'}%n;GjCY;d/OOe}<[O[ϟ>^xynb81U֋&9VO.HI'4!aZ㏬#I{ ya23ltrȠ|ځ!ރtꡯ`gpx1$>׳$c.*I#7:x3W7G[MH9V?ȏ;j XF6؇OA9v(z\[jY:!c|f:۩q:_na,N^!Ԕcj uCK%D+i*oi%y#+==ˉζ̝of̞|/rBoe=!c|Ìmm1Ok6*>Ѻa yЋp}8֌Jg>\sV2"zٔn>eGm2(8FE.+g5f0~#UuwxNU +-0ҕ{;<*Ve7gWg ?݈w}huns~g+ini57g엮}VRT +!}3>dG+i !Ǵ _G Dqn$ ;XƶYle\ًL/*9*q~R߿0y5\Ey?Fy BFyu!bV{HF|xB>"_B~-G`%պOrvc(e* `l& xjxZe衕plu9d7Fh Z$ eƙW'\lm2(3m7,Nʵ/cY6'd\w.eE;]c _}jWG5ܯ \~c!zEE+5CaTB;BvF5h^KjC:v.=kYNti⢿I e.f6OwTQ.C7Ǹf:99(V8-+n1@<=FT)ͭã}~x]ۤdVt"''q(I CLhޥ ^OA;yTqAϹrTkcnM8 s'ߪFtcjbl`ӭE toQkcz0>J]jo~}Lv*h`z _>@mh%diZ\g?;zO;,':.ePqɁ%:}wN߇ZOXj.-o͝ *OQAf3N\l6L'~"wo?&/gA(BӸ2N':$_4H 60-~R=GnҪ'le=dPqڃbB_dzv}RZ~wB0-{zEӲn,]/ciY[+!WiZT%iZvY𤜳:>r;%o-.^%gZ@gSfan;7;QyAD1SxgF43mӷ6IU2R I60I}FHy#HxzȠHȳ2F7UyB~3?} K2"NK1x$NK#2C5 s-q~ r Ĩ(=G} DƇ/a8Da]s+UUIjn8- UIH[V-e)g&OPUtAj X<9ON9V[IiM?>蚹^_]l ʶvtܥ/ffm`%1UW?`  oq*I IZ\k ZkxwEzG'?9qp'W;e5ZH9;e?l2T|vhE' <)笎oMPGmBE=dP&pwEtK~+IgTPI}IlQwO-V 4∪Cew׭ {TN[8u=!c|]DKpNKRۥvּ]Cxi2~A]ꊒ Ldh8H#|a1m]`LMO]h%331FufXccO,M`Cf<7zϼeXcx c|!r|.j7ncl@7V^k20604FxRQiQq _5T!Iiz:.aqj̇|&ZI351N5ytΫ8[Cg+(w+PZ'KS` `pԿh%ziS?!2~܃p2.6`@)~tl^XYCQhe_?::R^<:jRڄ:}"6C/6?.†T\{02=bĞ=`= JG/=4|I~~xjr@kErueMUľxKj{}[>3m72PNf]*ʠ#$AaWaB c|^a\i1ͳO#u=dԧiVo_c\G[mqc}Zج #-MsbوfA}-FUoM؋e ;dC|!F4~P{x2 Cf3X>>dz|~k%I<i(1q?pN3Žާ4*^Ϩ@30Žޏkm~^|x:4rͲ7!r{(,II̶@0A6^4Z2M' җx"rZlrڌ~v/07/{qm]@Uq>mb6ܴC-2{ Q?L TC]~^Gm`h>_wŒd$-:,aC܁ޘ-=֋ 1>''Vl>>?||~c|Vl>>6Ǹk_͐YZkVZMrT3=pړZn%ZIS31ć_aGQ'a:w-CǽFR, C:|ķ%my93ms[>m-o5oˋݖ{[^`MP i'sYImfM~*S>EԦ^åQI}F<쓍Ovd _|GȠ<쓍>'ҳݚd't`DXdKߧ׷c}}~CxZwxZxYk-Ϯ,FȠ<#08[\b͸ߧ3>hqi 9*#d6gȉ !ؕew1uQI}"F8d#f/|=IJh7m7'eP,xdlYxZN ChYVƲ/QqBz$S ĕ7%dC%`HKFe#=!r2 j|X1$yUg ' EԶy[CD|_ڪMҪ$>7fB i?|"j !}I|d7=U},⥶8,ψgJѿ++#Bޙ+e\2iobW̝nlSJeLju c8w7,Yw8!cqC^ R[cھ>|In=o3*ffب?Ĩ('F\ H۫=sT<+GųY91!vؔiLۋCq>n?}ܬqn}ܬO7y͋m6fa۴mnfaݶnf_n/puBܜ!)h^!1(!#¼5C ?ۓ"V'bD~n A7b 1RE3ZCr40pU'fj},C;Ji>b8!:*_|8c`r{h%Mw1FFmmOgFc'A6BU+lT 7#%cY6Ã2f{}rMڇ㧏aqu}~Yw&l,A !^{bd!}1 y~gm|l,2E"L<Sa",BWg;~}am=h P)O< [h-U3Je:0 u0A̤/O̔ce4sT) ZXh%Mt5g8Uȩ@7n1{tӟhH۷ZD-Uߢ4iiiuku~*A; V.ȁDϬޭ)|7?X۟xUk+b:OxMbyD'>ֹh%MV/١v;V7nxfʱRl3=(v6n`\7OϘ ϱ[h55~_h{*hF3SpdjOoឪos/2ir&8L9V)Oz=ZY*<)笎z;A>6}22(/t>; 4ƵW KvmmАPύHyS%zs}I&P5rUс^Ճ]Sj9kVïnT5AVdoVt;LRRkO>>:o|f XNt]6ʠ[I3i_MQCcWUycZ`ů\;V|cg4sVǷM>-"QD3dPIH6e"Q&f[S"K~ْ[~ayp_L5Sa&& |5驵FxŰ)?l#mk4|<]g+)ca޴4t C^ζKBt8z8Ξ|7N=Ҩ'O{`~<}3kbB#7U0ilA9á γSPNbMUM}bCwsp '⾓FudqJ>q_F2(o{2Eҷv.$~gϰxd1.Y>+>W ɱҿF&{B`%#$ xYnERZƮg"Lr8ϝ",&Wg|A)fO۸tl`AyE o|졵dY[m`%g=y[vGq{*Iֻ+s'r)@qfG2)笎n3B둅,Fp4oMCYGm2i6GMRKV+r򕝡ISƎ|B%b}|h ]C>߼ty!$7oMC }by0[x8߼Q&by~0߼.itPЎ7 tR^0j7cŃv!,zЎLh)笎F}ܔ}'7'2(H݋.:WϪmh!c|/n;q6j,5i+n;nxvNn;GV45jT޽:hQ:HOsoybp4\B󏨿A\E\X6*?!D7ö1|Bt q߇x$N8'8!XZ5QɯsI˯˸WBR_jvgglfDV÷2Gm㮷Qmc;=0-d/+H >sNSٺ9+ }΀EeYʔѣ4qL~U %~J?h5\Di;B|Vj)ܤBTyz# rw?{GRw|È-5 v0rXNtqꯐ>qk$S/d鼾]m^2|YS_}4Y}+Vʱ, B.D42Ibr1;Z9{hƬxݔ+c.oc cl rRY-3{iI[yhb=f` aG;xFG2e_? Q~gݩ ;;>eK9gM#~w#~w_D{׺[r, CrOhEE3ZI3%2‡[l\(ƍ4,':6CbI%"\( [C_Yo-dωv/p ǯRm2(;\~Vv9C M}>^?}^맏Wq?OsO{'s#.WȠO9먈BAP>Yj!c|> a05*u2Lc+d rTEaYC B{Axc7桞{ !$Zwmdk/:,y;ǽI{%}FN=̡dz ēN7G2'fUia9ٶopƏ>q[2~ a }I"t1q3 #af3Bˌqg̘Um`(/ͧ#CUa4–+o:Vɽ˕Њ[rΚ7`F@>]o2`OF!0c n&BLs }Mm`(<_OtՎ)M]Ndzb4UD]ZKG 7∘vO9gu̿0xs%F$|+wȠONAeA5㜒]897\Uz7OUm! aʽψe=o 'ݤ±yǂa2`l?0aΚ;dDX|l~уKF< 4@CējqK_?F\9l?֘Ds 8#GE/Ǩ8#GI'Q1FL\Q1_%Xo;G;Kg3*mc-C}/9*uC}qB7'18OiL'tplJ^4ڌ>np?x֖$~JKԓgՉ֘pݼ?4ނ>`tUZMr?<C+*ɮV(({7%?ö S ;oJW;z9%}"̤۲lJƠ2;:à2.RzYΩ6諛J9"J ]_c;[cVg&G]WkSU,Brbl XiQf3 9ʗ<)rΚ4nI|6 2PGbceZ QD{Rk!SYX(In`uo.OAY]m2[рq.]2zB_!c|NϣF"Ojی] }I:~2QNbie'KmN?fSNƍ.}{wj!~~a522a1츰 iF1xV9;4G_/1߯JRIe}7<$mVT]M{}Y\v\Tt`T1|n 1gDrUǖKǯ:L9gu|8${/bf2dP\rYDo&lq3oP M3"R5%3SxN9V294&xYxw2 >D߲a!l~w?}Rϭ60t>#_mDÔ/( _xw8S8҇14#讜wȩ'3F\iᴥψc8YC_7#hxՒ;?p8R%ՊaKv"O-'*ɮ~K5,h?1^8,9V3NԖ*trNex{w/[gR!dM:>^Kb^Kʈ:m۫u<>;XL>^!te~A@)Lw~i}o5>eQ/],lhΠ%&ib }bGm`yxBhnј+Zѽ%NCk˒܃>z(D+8vUX7Ȟo>t8CeχOC~ }e=}eZò/(c<$ÐyƝ>QhhcY6̐{tFzT{֦~M+ǽ+ΏxrMB|zr.bMr5 W훳5H}Iޮ9sPiI̶KE:/=[ċۦlċ6\#d>>jXH|tDD?LsBFOZ5`Te#!c|>v-9nj2D=Zp4ۭVtaУ# }C!ÖFE G1ğ_c|FW7SFc}h?fE!c|Cm屡 '6 bC džr}- I]WzGm\QQtoztzW#x-zm|>Ӯ0fl:Q8!<5sJ$Cx7B>~>jw!~hzBFtDṧb8V23+*OȠ ۅgxVacnqvk mzl2c_+51g1O׭7 ?x8_#x81C>}A[ٷ9 _NȠܯ_]We55H}ro _|1OȨO3݉q0ۓ&,#}޼y޼o^Q[ۛw~<9c_ͫu>_bnfNx$n+!~$tW[?>V?CjcK~mF,}"n!}N% N}I|<ܽaH _\Ʋ.Q #}IͮQXP[[?̧G3j#w&*6x"4>Ĭ$fZqK;ͻKpv.aqBa6jA^98UXCm`hKec9yA`eNjhGߧ;}2 ~x.bqǵfZ{}ݘw12cc̻̘11=f̻̘.3f;R߿O>FBF1=J}q]2yG|З&x18c^-[Q#}I|ם=0|ێbp'{&,mTGD[2fu,⥶|bqgdWw{13}agɲD 6mxax8?x8686q|jFLwNtbrRQ;X 0З)T;Fe/S*uU^*0hn(/:RajK%ʆ=u82~c7nͱaaͰv3t '.u ʟwprlKhUD;omyo?b {`hKA `P̶,KψZ4[HI60.,[ljaȨ/ @R 1$>?}|c}|~xYxYo3CSKu=Q[eo FG ,60@_v})yۉv$:e>ҷݮFOqXgB=- D6,`UYaTy./j**x܋zC^3 |c*!PFTTT\u\ɩ!-qg9.+"Hڻ2N@OBtl.Z^SiGƥށdhGN%ct[$JH9Ji Yh!A 9&:voXiHx-]cq17V?Qאȭ&V?ȟQGKB.ӣ!@>9 i27ꩰ| J :vջUzU'kKʾ#'#){K>ޒ{ ~폟iбLo>ϴ41r'}Ux3NT SUC[ƀBs@83x:BvB1  ӗU2{* Fc;& ʰ-! )/bL$|ԐtxnQOMr 'm9EXd+;S3+N(SKߪY}r>rFVm4s|JO2x㹂߻{ōQflbFA{&lv >\Nߢ 1  r[-~h 0( ~<^Q@ 5/2Y2kv%ow]ƚ?~; C/2Q\1f;~&9֙#'v&qDVN8FQѱ|PnRb RM,p7:]?Ru r9:>F p\3:zךYQ&W+Ku2ZJ4/U%O]lTg\U]^[Zv:1i!w\Y.i6jˢq@ MtTu~w8QUQ),qLz`\V.E+`XQ$)~ml$OBWtk[քr.皶-ht]lA{yj|'3>30$|_8 Ic~>fxI{~s W\k2wVZwekhl z՘1C; 7S4ՈLqow; qg1_އOs0,_Ɣ9T^!~r̈ځcYx "[M2TEliGWGW2s ঠ?&-~vj SN _^#kbu 5\^-k!f5dm5Ad~B|#YoaR`{:U*H5f CѮHWGCnU c#Gof30Nޓ62∶pfp?f9Lx+t:}ԐK3q&}{ <2Ќif[| =a;ps#)Ibs9 ~B|k"6IjҙN7iɁMxL~ ]ɶ$|gİLlqCbl'Mm ς?%cE"v"Fip>18994ٝcM@,m$x¥V(gefċ.~h\=wKzS6zg)V__X5s[w~Y4 #ߧ#>EeFf@|4fSԎHcNIû>-(Ar&ˈ_ZqJҊZ1G+NhE+'bV /RtŬ<_[sSF\J#m]@iVdïX⇌ba1i,~MC|H2 ޴I5? dO٨ 1O |@\Wf +#L{ވ%?/! ˿e _&s9#d۵ ίAj<I^hrWHVψ1&譿e qȸqo28{W;ysMI ^z<3%h>Kxǻ~&{=ݪd[uuY38l5VeĥTު#Z20@/~/ϷV4WD[|yeV4W֊5C+|kŚ!׳^1~u6|Cc̘U M&5C;!>>NeUUU~ViKtMt5ҖVY[ZkZU,sm>WQ+dL!/ėىL_rN+#Lk^͚WմϚW?y5yǚWB|uV֊(I=>7@%4'7U(XяB _ faIs =A<τ$僸$-!oč_ѿEIcZ[s??9v1&{!&ׄ %K&d%c (vEۗ dݏ$|ɥ\xll'ą64W-Xx]mB]cjI'[BcO[z 4BYɞvx+lp' 1z|m޴^Ux#P7iZeplc_D6<HJϻQ4s({{αajk'ׇh:9msj w_ -!.#jJpB%&~4Лt1M {I^2yCks_Lsc֠pAFÎr q/_=^bʛ m!G2ma0VC[:Ca;/!)_]p4h]֦vi.&B5ʝg Ϻ?{!f/dl)/3(09 +/Egr& q5d k\ld klsg"jAlNk ~Ɉrg` di+k4,?s%Nf a I:+#>:?;MqĥXwxz}yi$Hmw{](sUBLVi˹ٓ2Ir}iN#y]S[ @vr& 7#8 `>vZ({/E q_?hrrF<߈ 4τ8V1!sn7Edl i@|x~}ݓmq_DS71ǀAO#b2G*l'-qǵA3*l'niBfQ\2 Iƕ!i>Bf; U'UO1VGł_B ;ӓ2 q{pwbc+qsݼӓZKkJ>ė˫pҝS߈OB  ~e3j #*#06A4Y rBg%pVF8hZqu2K4&]_,/Tt﫰9/bK~|,wWΟlfW^vކ_9˛3#^3I՟wF3 1i>YQ)  ;M—?3!fIoRyKHXӠ=ӚU4MYe[ƀA,%\IpҜt&3lbArd^O^xW9MBwBVNNhN ;^;^c'^;;! ]wi*&<_߼:'^:v[rkuF%%5ý9۵ ;;9wD6_1Xb?f?k#Y^zJRt{=3s⇶Ou~Ղ_B|"'ă~DPiv.rh@,>G4N W<*2& .vmz~mxwʹqxOGTW^]a1Ţ4 EzXod[S>j":vJ"ׯńx-[c i27n%Y?NB^}tD#rTZ^] fO{7X~Mu1J|Y&fK7s?${q+j{00snNE7ȅ\BVaHt"e-xj (4D񓖬fe-h3K2yw vi+ iJJ^/?%!Gd /MTϨSc,$K/i*{=4Cb;s>n/|_X/)}P]Oֆ7FofѱSRλA%ITڢQ!]JrtK`KA*b iЮɥkJ `Mw#$|njQtRvBL(i1NE1cevS$Hr<ɤƪJ?_G;/|/ﯤVl]&bT33sjܿ[_KWk :+Ô/FjF+PwT㵦ԴJZSjZSgMDT#)=)5))~\( ye퀩`_`WDM}5TcG]:uwp2 P-XRg,h'XZ>uSDC>6dQWEpWph%pɰ&:I 3+󜱛:wG#[IP=Jk(N2F{ollol&[&?&o_YozcUZXɧgēU1aV6MU%MV #׏kK'GIG[: &-2V`V: z '[Ob8Bpg:Sπ2w!@m( ,w^9~z};c<0 .oX.~h裴i|;vj=71G<AIȴ@;1G_1;CCv)Pd/"Nvϳ8\u~5"ScD5fWۺ_AKL*zv;rlнPȯ I-xqM:w[p2Éy# 54 b^pp}>™>•>Wg#<#\#\?>B-Cbjr *x;ӹue+|gaʮtï=>^;PG>cqNcV'Q>4 KEj 9yPg{ 9yPcxGB<~ ;4c-q#GoGFB lxw4`I _g:; 69x#!N2(jtDruG,os /0&(o zA:bc?15Hi2NJ쏠wɂ_A,?I3 z}w!{{l}:ö0/][iN;&v<9Km!6 f?!6f7um!>SivĿ<_Ook# Cj8`9ġ[[N'Mı{X%M'&+cԘ8Z[[M3- 1"}@7Lne|sh3tS'.Zϱ]Ԁմ@| 4/a'PkTN\ 4Vg<dМ& w>ûWxW{~$Oi  8B__0t}/_CEKo@TqYOzP'Z5BVбӒrn5J4&O|3^ c˖}R腯zJ>$#c1@Ϝb0 A#0a wƋa9 9j!hdxab, Ƙ#} ~ضgKf!w2bcrIl &Lf`9u< 1|b Y3/=0|b3ִr.~BN̫W`T6n[bV܍bEf;s얹 Lb*ovBѱc7nt}v+Fǎݨ}vnhC0ꞧgLLt qj>}v qnfHY;M—?$OI6DNԋ] {QQ}^gBF0%R>!2R>m# ͬMOY2@sl0n@\o~Wu ѕN8G E!\۹ 8C9Wt9J4X3gvǠ(myi߂vNconxKz؜dP* zQ@&U<ϗwб+ [ Nj\{]5ය'~k>h&+Ԇ"0!^Z3r 6==1o@(kjrSii}x;17Mwvkqpv#a[;Ag®ȦP̄s1z)q&l 0d3Y {NzIo?v'#=W5 gA{tMA${`E3o:vACn>j@Y`X ="+,C4 K;FҎc|%I;G;FҎc|c&I;@Y!?&F_N4G !ƼW۹gk?Mao%s(Ѩ}O\Z{d^YW{V{|{$IGWR{Pn䟊ɽ 3&b-CcFDo3y?xkl(e׵$es= _N&:vZWrTF,N|-Q83|O\^q[24 ~}}7S'}4LG{'+nY+~W' |e- d[ ӓ`UQxfrtv/HWrZ ~x#-qW_p}A/'ЗSԗ/Ȍ}%ej,=0ҳZ,=|XzNy/=bK(]zpAt1A7( o@\$pxiZ `p FKj3V{=knW޳>I[^i:V{jdt;PXLoKqc^ݸp?,< Jm!^&jqR v斘/|;Z'Q K,ئiȀ W4]\Gl'A i@IГ$|/p!'{,%M"p1\ENH q$bK(Q|E2d<̼<3ifify̼Fgfifif?f]w@Ɗ1:l 5lmZҎspl9]ה % >n ֹfVĬn~(A{o?}MQ.WS·u46xӀ0G@|.=ټn1.*Ҡg*;.';>xWiЬB(T:Zolǹg_G6VxʲPu@_1`!ܯ3 q;z활gkkiƤ5/! #F+8ReGˈ+GiYUi+QC;slBJf+#,;#׉4쌸1_9З3 oecL(dE2C!{v䛖kϓ ҍ^̀DD\9WtF o9 q[Q'#g9 2y!w #Gf2y&o}9}I_Nҗїe'}9o}u$}9}9/Ok.'fTre"&mr4\G[^Nr9$`@NBlsS&` +y7G/0}nsfglh Q`?ۼ陈&o'ݏ!oW;4\h%d9o cPg@|W%B*ѾV51. &~IͺDL8RU=4 DS-Au 8jњ:Z8a /[S'kh*?UZ@aml zט]E9?,sJ>bbg5Kc`}o߰,x[NN#Q0N}dl'ĝ{4 _ 1pAbQEkjm!3&C쑉dyH,o9xƀa2_ e>IwRVS22uӢ iQ(y{kXO&~B:S7=(aV 4 #N\/U{3E>zp bq#NӵM‹^D5Ԯk]QJ+ۄ~ 0SS0#3R9I p~R` VbbF>p,k~v)c;O8/[ @y%{p?W,а=w*5kYƀSW~qIt]ogkǷ zp .:[WEznF;0犎%e SsY: _ ó$|/?gxU'zW#-E :uVH=Pƒ[ǹ#Gp\k\TsJ. ih؞Zp\pP\8XpVbD}bJO`!fvB|l`;s 6Wb']8mxJBVwBX<ƀa:c?!#YN:Yx kn=!0F~gԹZFlEc:[.:Ϻ'nrnrаVWsT2rTA4 #FKdƽ2V#6,x3Ej4lWwh?"wUvx2|;MApǂT KJZ{ եqĥgċeaq{ A463 _Fjjq^*#}ʸsT/?.IJUeK{4 _ Ƣ=lj0cc*ؗVѰ=ҮUh7H$|/'0[8 q ' 4D_(pG_t 0Gy _Yrtט:3 \Xe9!i1܂8*B5 Iqv+wycdhhkswrycm,v $bw_>PyEoTvB<銲&ˈ+=le—HT)=l\{CATyQ?P]%HCQ8""({S1^/|/%:HO.Vw}RUPp)1(/|>Þ>Ñ> k { 333pϰϰ =z@/LnzhS2IPlŵͤ4f `Ee0?6vK?2ǀAΥ;v+ihGO1vv=ihJ1v1>sHsJs=#3g4g4gϜҜ1Ҝ1~~Ee 1,U4ld@%g~64 _F|J %@#:Kz\{GaGFw*f7m rmKzpRr1S\Khl𲒋yM_џt8ugh}AODö@p`STw $|/+>2Y0t qaGy9 ; =:Pl^âG|=|E ]y]FeӃSuԩIܰ]1*,{Q)*u׀NҠMIlAټ96hM ~⻘|"M4s_K՜l*K m7 mo/.?rH q9 'L 4>(M@CX$|XWo,UO烸g|+JG"D:#m $u}fb5V1fe:j/9MXQ3Մag?"6\(&F#GyY#уSp~ԩ!*7ibW %م%^0pʶp".~4υ-Mc[{!=#S#J¾#vB:4@{$Zɜ&d/c {2ȸ̼#.) 䊫.~ DēvUN'/irpų-qb`zMuOwu.z4 _ Fʘ4`l!㍯Ƅ!=umqeq°h'=Hz?z\=qMz?z<wg|  |VWGԙrhЃV= _bASc|!s( KIaX6P͍]^O"DuH ä?!jFQ`hւQA>P회xϰ)vB4 qOica&_Z8Gv>Q>t ďm_^!#1|d\%cTzr,ξ d2>.e46h=.2wnd;!SXF.~B|:߉!Fs/TTT>SHSJSLu+Mu#Mu34խ4խSr{ihjサNo/#^:Y 6{#39M— ?]Zou-u5+|n]%P$R@;} Ұ=wF UD8-Q3I2ǩdi]0mψ 4d(u$pb8ZV7jts-}=~LVJkzN*\*mA|*H^3d.(]4iUq_ W;FaS ,2Z@]==t|>PKI񁞯Ox+Y+~W' |gY?Ykdin[aaZANĒ; $;Heo= a,kl:;]!a.{fZŌea2X3[:.'%][t޺juKno]7y L?1<>9Q(oģsĻ10t_>ħ|2N<1::$w]~@%'^kE?_#?+h.:QGz56 _ ޼\(h`߻3ˢA!krq~~qwq @bT+).xѐzLpW'bV8Gm/8>@xpڇm!6M:ó2¾3M@醲KiQp݂;# dr~]F3iRq/[>L޾!ra8LѠ:Lc!"ar06<Jއ @| l6flNmflgvl8ҝi>G\gr%M,0|k,b~{1=Zc1#!VCX9X O}j8kWYc5_yNFհX k2FX\*dLf4uK̄<2th Ufk>f ~'$xKI#ޒG3 '_KM1~Е`'@0 ئ-X9`Zmjl*11v܋3ɸ-zHm$k#je>켁I)O÷6а]1?:WI^EMfG89 qgA%w6}ܹFޅ4 _F|G0ta 9S@F:uF2LX+a TЂkK2hр.cތu5;Fxj(-0EN٩I6[9Kͱɚm @ߏ)ԝ'!r3V9;PW9c3!n)m!4s ~YK'Wb zzxpb tYK*KuV=a57րF?'w_IShS!ʻkJWA^sg{f=ج̻\x)9KUg69i64llrlr>IJ&ffc69IĤ=Jwy>i>II{I''`'&c>LΑ@kG8ZM'*!MK':r;ṲC,:M 36#Զ{h 3y)jN`)ί(0}mEF, ҟ 1@u|"~&dGKτcI ~I/UߩQ-}T~UC;Y.1w;y³}T"'frM*Rs|a'Gf_\ F(dHF?-Ѱj0~}9PTu0_ /H|'&Ub"Y=&DRc"i%&VICZMZ";Œ36#yP=!Zs1{f;sFvܼ8pĻ %5Iqe_޷~f5 享.E5B 'ĕ)@s&wLx,N2- qc/Lݎ!ELo~wK4hGh rH"-Lx[K#:TcK O|@D>,8ˆ|gv+:9#atvJ-b.X:B]HN ;c%vLK<-r ?7h2@~eOӭk㽘mQHۏ(Q?%O_I?2ǀ4 qoPFt!2}=oo;bZBȩz ^n@ScB?!r^g{ M C'gX&Wޅ1`h_a1")7bKbUdMncfĪڜ& /BXďK4xV3Ce/Ou=8l-ĝ}:L/!FL)L LԜ& /o*Z\&st  u}X'!B gψ1 I26nmN۸a66nmlflH۸i7l`#~v2up+9hIҚ%'Gux$ mu0 1sV\CmbJD'[Z 4l f]:ؤec%ue% Pl'Ekh>)fm%aPl'ʅҜ&{!6 ]+clW-8CQhIC;!^47I^g`߇emxrj"~ qVtP8U(ǽXίys1=ts%cg*".< qә"~I[b=$UiG>B@XN},G>j9Q9[]w |/ 8e=4ҩ3/ #6` j-2-qM?Jd@ 8z@]SVΛ"K1tz @N sBlǞL sշr =>=Igx'=>?xz1LI&#}G$cKt ?Eork}F:az#j7l[I7RdloxچX9$|ZP\n(3z%p׸'wboNe(QגХMijOĺmrE77Н&ˈo|JoL mv5YyZIk ^}h5 |$C("YT7 [4ldݸl,^*I4 GKEט?io}*oKJݟ%MVVMSyh yz[bUҜk56@hAcY-$Ic -Yw@Vtil'(46wI2G>#!~eآa{+$W87v|16%$|-|=CQ@M`;:.Bvw20E}haҎsa B]w@l$kc`n\'zhl2L2=eYdb#Di.kKfY@=4n9;ݸZrɘ;A'oUI"""06u2BUx~8p"hvA֦11L𔱓א2v-)e,^?En'ΔNw2vh@{Xo4Ăz,m!n{ 3)C퉹E絞kxWJI2'`O^r9Ug;Ta{ {F>_MMP*%Ėnn775eR j2nKU0|!^Nb` k}P0}0u)(]p@]es(А.c E\sg3?DvI^Y[ADx&B\Q˻H0_&Bm!<lJOnOlO0V/c!-+*а=~A 6_,X;MB%8-—yHƠq5ӤAE^r1Iӑݣ DfyCvB<ӝ&{qS)NiU)qSB4U\=NivSl_SZ5zSGy\j|pJS\qb=Ws(1W+F<Q|Wh#^ )q7BUoVӘ—n&Co8ك;#W{?R_h:W$dMw?p%cxs>F*<c||/!>-vV(P1Io◌q jJ%cН 7ޅ1x@[1&Vn$rG4lO8~{^p/#>Q$}]LSkl1VUGyT$_ f[cq~Q$[NȿTEalF06TIሆ|PZfHm!*G[_2bQ v=2=7G*fG44 K3]j:M%9_2PѸX{F4ڵx=ZR''q8Q蟻5 55!88=&ˈy5{!ˤ7h@x K,B ;~ I88#?[,o3BS# S܁o)%LzF'6-Ц1X)O(K6% C.ƶ o KAkC42TFztzi1Rr&oq>'o`rh/o#iJoB\,#Vt|C.Pw{G48 ! 6+/*XG ]#b_v ~Γ\7*а}%7auʈN"N9b FFF  +%YGNA.46\ D6[;T63U+c~y o:dMU?%q2{W_Z]Gt/#~.[Fܘsnq P "hخ9kr?&{$>$2xc0I>$1|H\z8|H{4 KƷǯ,scSL&"}+vu&~ ᮎ+xo:MJGmPã6~E2F?tU~ N騽&sGe];5d/ĝW}i LJs< aHdZe\fJ4k(>pfRvRCh^ɍҧzr'_aЍr?!V_ߚ8(s{ +9h.'uד#bdFo0w865!x|#0V@|4&Ķ_2b\'MVo@;Taۯ~!">tDNȻ_oLbg$Mp8lv@ faqX6;!Oab$|qm-ŜA'Oy6xTk#<:HAaCWv+:>}h OV*#G= |$GxO$>~QY炂sP'P@Ayse|𴴬UB1~݆r=sA;|hί ׳560a`+s\ 1Qc&h^f\we&$|qY&n/o0@F:ut]ky;ҭX>jŁqEO*rN:0UF><0F =Yt ~{-σMc䕄/Ktu'O#//K,}_.c?Q]P-h d@v%}5WJ4;q w;'YoA[= 3H'T.M]J}\Θj>HAJ}Th =:GFYv*3442>JH/;/+/nڨoz7} ;YNϠvՓ%ͣN\3B+J/cAޮ: ~Lu;fǗNyXN +BU@O=DAGǣz+nL!=t4 俪'z2M=ԓykx+E5|R'ǃJLAt4\.|yXk% 2+I'4,tzp-):83we)@s_/lhv@G@ögd3@ӐiGc~/ =+R]P#vKB-~mҒKG]mK3 )N$#]~5\I9 4X_NBNNVVy: > V> 9N?Uc]U򓰓6Q*OE<j'aQKh[,}mt]-G'?_ /~AO3P1>3 ԩyy4tE=\}fXtkߌ@N?o @@@ö~ߙmgIZDߣ/|zxk\8x;9J4~xM\k埸~8dBowm -QyAKCWo*PsQzj|Vtk]+oZkM4dZNw5^nIҶy->dGbSgm{}g2W-OX_{OIX[J/+ay`NՃ3-WpqwV:Xݿ(f7$a:n:Y3&z04%ipd>AR7vES':=]WNkxvE5?3Q xÇ[,(yR|}` ۾?nE( R7`&爯K;M/gîiu5Zs:uZr*}xp+:]DSyr׀fAV;߂[@LW6 2G`,[[gҝJ }33k C;JҭUy#/lA2w["!^[׭N*a\lq 6,|甥^|4=@funk;~N912>h7g5N7( 9e}%mЋ4=- zIҠjiз4=" JҠѠ/͊ z{0- jOiI=o_盄WD j#ָm=pNOZw_/W?{t~B+C4AcFh'TYنS("6q98+܆W4X6#|ۘJhA SVſbq=9b>,E?T%G,Uw,?e^KcVX߱T g'7ʑJ-m{P,$rڦ5]mf 9e&kcSج$cKFcߍMFNcߍM&kc?_Ƀ!u)#e̗l6wS˾fllI 6ʑ6JYlllcU$|0''ExnRc-ƃ>.O3!.bk>]c>J̧Wyϧyce6]l<_6^b)6/O.[G\&! R|Um! SW;3K:|U%ѣ%ZWSiup9uʫ)A(sze:z"NuI_a\`{ՙ`Y 3RQ9\.Q^-i%ZYGF>4e¯,G^+c ӷEY<ˍyñbr]ĺu~]kz:2"{Rb_C_5W}3s.y]Di*Ȑp%%Ew}(;qw 8°B_}KKR_}KJR_}KHR_}KJR?Eh=@$ ˒ XUVݏ\bM%Mffɠ_[jd[kTeX6}<_]B¿/9[x-u3l 36 3lV 36 g$>&ϰ>*aϰ>&aϰ>!aϰgJ'\g2ECV'ėxMle.6nbwq#m6u×xxyxC><öo!oZ$ mH3ѝ2,Y*뉉0ʮoIno_s ɜdNxѲ;Z eO/'NŮ.|SbW̗W7%bbW -^1oWW1pW1pW1pWñp̏tq zcz91||949bXLi-!:r녟|5ay? `9kbG&6eG+*~owD~2''׻O.'׻\ON'׫O.'g?i7eet*ڕ &˰eVd C96#NhB_?vmkT26ذr^؀\Z6|ޒ0VQQFEk11 TNN__p}bfg:}QU|er%y2wye$Dhݲ%;"er(6̯[L)q8g?7pjh%.KYM(voMG.2ʧώ^:B0,+bi<弒ݓx#Xxg(+ًO#w>{N[<ș2ϵO}ϕ֨8cZ?#r'Iъx[3[:~u_^E-!pz\VIF˰$C`-A޸>;c8Cx n˵l`Ga9Q' zټ:}M;0tfء/5\SL=+A@Wg僓:#<)N74F@~h?"hNZ-u>W)\\w&q-N>o'u0Z8\A?yqs.+7;Omwdc!~8vɏѪ.3xuj}3F74m*ߨ^<|eFeo{/v bg%_UKGnb.Uayv]Cwd!8g ~}U?˦e}Y?˪e}U?ˬe}M?˪e,3'9-Hd;scZ:1pz%/lO%ƤH@GlAɉ(\VPh̕m 1x3aNcTr@IaR\ F󊳏{R h ^^OTObrsfJ;7xߋ8qjA .&IJ!&NӉ;'ܣ,ݛQ /qB܅ qG[v@&93)˕C]lPb f~3X [nYE'eXzݲLW=FwQ}N<5:`9Q\IA4_GL.|JlI-}:|R1r^9 :@КΥtS]TO8X}zE9Ɨ>QBQ]ߺ:ֱC%~ y aE 9,OAϠ5xb>rkW'IW'9\IW'IW'\INrG~KG~[G~=:[:[ґБzq5% ӏr)o{?x+X-&w;Z%-]{'wOBњnuA実^?r@3C|Z+8"ǃ0)ѪoZ1=Bk[M[`fwdvs-֗]ihSf ncIJCg7x[S MWJ "Ϗ|4yfI>vK2Zo-i 3''G?jEV^Q+$,M% #e]!7dO mK<`cG+*'RY^;ֽtig}HުZwFPhZwn!l:rks|eW=Ul^쩂ۑ nX?rS?ZS ~*fVǭAZKv<-:˰O %FUβCO7==ĖM{Sԇw})iFWؓ6aK?F=w7| P }Nθ샌;6͠ 5c>WzyeF|xi<3s,]o\޶5me7ɵ҉WqHs`2rbYS*'Qؖ.bUq,1X]AI\bȊm|:eGo?l.299kyׇCO&Q /B5bTj4>΢U aDXr]=KO aɸ6}\O_cO(Y$w ˥a8ڑJmA{P Zl }ޒr-~'om6C^Xv: 2< /NeB4Cc$= &Aj`7l54Lef9ܹ:߁HDa9l+l S㯇Ww9]|؊`okY*V9\;r櫹Le<,-.|/❔;1rxxOooCn24sP賲p^(&Y#٫X+Av*IV~FӝÏVb~" sT<1'-W/0 Knȕw;gL⻈:$lO]ЋqP,m2w_mF(_ڌ"mFy6|i3(TTTRg*KTyMJLbJx:VRURERc*Uj)2]m1]Θ,}:=]a2>]5]m1]-%|LW R/A$_Cz~7~<ƕ| =W-L6Hزtc VӍq伢Ӎ-%][]oδᰝ l6ۃ+bcPaywn6k q]_:K,ĞrLN%G_Kp1r;xᐤԴIR28rxVFԴlXN@I;ͨ=7вn]YbAo։•e!ƻD9_|A^M]KS^M]IS^M]HS^M]IS>Nt'CNt'MNt'UNt'Mѝ6lZ5گM&[@C6kjȦU-ڴjTdӪ|lZpN%E ׳a葴h>!EWӥ!ɪ+|qbcއxH\okv96l,+113bgAC2,7,;>M7^Fpi12Ė/Ņ{`pCa !ѧ1m;DDi }Ǻm"B>8qwead」 G6b˲eeȲ˒eq/..seeIJ r].K],eWLO\_,_ĸm Mnn׮9W6 &|ݤwR&jA]ģqkAMZ~)KO饷K饧KO饇Ko饧F m:<:c 1lܖ˔bsuzyCbWW,!^^^+x( Z<(EHר Rd{E>N씐Q7~/!B_[- B㼃-Oɧze:f;8BܘKk E2i }E"\e (ElE\KĽĽqu?gpk܂88 {}yf_+ŲOuM?s}55k//zw`hW=I/^^zI/^^zJ/^eD[^z}ՃAӃW2Y҃W҃Iz%=A/6bxv/]ظ1dXN/}Q ^/%'6'۸װ1RƑ6-lܫb6\̰qma>.>%~Ekd;k38qWzQɌcWK̘Ǩu-&OJ|݈ۊT5|lYn\>%-p94 oZ$&Cm=r##U?~Y+PdX'lu o^|7[ns-6dn wU4͌YnҬOr-n њܒɷÏ`VǷC$bpCm,:˰@[ӏ/ ej2xOjog1xOj6xUg5x48m4 侮OaYOlG.,G=߫L;&xodⷴOO.{B[8u.٤ж4BKon0j?LN^-`Tׂ.K=,dX21iWeNs-LF.bۺ޽۹> eX>W/IlW<蜿UW]F.18FWǨo(Ucqr.Q1c4bC6p&sbۖ~1ns-G_k X\3#Cbn'ė Ji_8aЉzrՠ̅yg9Gh*v(79G؋?psh r;sXt/9E@-VO{%/ȫW#*潴 &N}ez;z.Yqɝsͻw܉||5x{_ >CiBiiB{ONN{td0tp. ~kPee_s.s*s3 3t39C{zWOO_M>~$_ɇ7||!B>ew?ߟwߴw??]GbU'oX҈BIR:LӛyƸ2g]e}u\qW\I ?_ x^ LO9r{m,xi]sӦ\%Oliw+n[;:ÏjsiWYFꌊJv[v^[v%="DUrhuޒKS*K]e uޮUzWY*U.],;brm查E謣U-'/Xl ]?JP(畬ٺHnVQHn8όUs9{ɷ?ͶW4@{xf=rW(&Zi-i- Xџ31t[&7Qv1!BC Hvq>ƃyeA|-A8PkA]V(v_˽W?Tg_R;o-ip>{-#8>bbG2ZVN߄ (xXVǯ)28-S648R8jA]n,: òsn;]Xx* ]j.|Jl)ȏq Q5vqF՘=f9hT=ʡUjGFTM;r녟dSӏp%09u ~k\o.|Aܰ5^v4b /){۽<܎zݧ{{Sw]ݽOu?ݽ3V;]LB,:` H'C9nx3o5ktC{n5^[F7t.膮5]k ̊K7V?o t?]k #Z$Trm d^AV@߾]8@zYyȑ urcO li'U N 3ơNS]nM"霶O,;:˰7t".Dw}K߁/O\n.)36[KV[m힍'׷˻Qxܟ$3{x!?݂qУ8t3n~H7?nI7?n~H7ߤn~J7?]e69VWN'"Sw4yer-T\Y4'U#\pZ>r^IyPC[@bEeWĮv30Ov}|c6׷tc.7x3 6{s'K'S']'SOaaaf]fSf5s2s2sÒÔ9_,DNi%$&.I`O4ĔDe/qM,/̻^Wzeټ(k~#-u+c5E,K~zf?DS1b9dwXu%+IúV~թ\fOWçG.-S{4K>_^QS#w*ZBj-(2_A9QdXgKfI!Sm%/;07^v |o\%18ߒJ.Zvnv3iii*1:ܯiJ:'3TA `W\6Ţ.ӍDzPò.r:j_fׇ/t廈3uelDgβ7I{L ϗyrN+='o`"e UFsbDRD9p'2Qi]:HoAZLcHX:r^ɧ|R|wG ~K~S|]|S-Q-V3JG.E,pɛy;! YkW38̯FX&r;VQ/R, p) QCli)P&JޔɛW!o/!MۿeN2~en2~ef2|en2|c;A כ|*R&_B>|)`/!_?8ɽoQWro ~{;gmi;{;>E!cpŰ$ X2+3Z={d7=r^9ْAAy-rL\:\Gb 2j&2<0K×2<,rח[~0ǎYTY +Ay?EICJH\enp$Šy'Y}9n`#?U$?a''TJ~ny(d`{m CَiCw,w iC ;m}N~wږ(?C:YV6ʔqLI/߃I9d-737Q֑Xo8 E*+,T 7wRCɰ8,/05DŽ'BBvzTwKC39F{sZ#ԝ] 6?!|lU_W}m 1`UA}gR3uA?2>C9 |AlSecٗҺooBleX疍p{ k /Q \++#Qs{HI?T.r,\G,Vun؟vfgq:qTsD:dX>9Yv 7>K'7Zə!|m'__Dib}$'pYK9(0B/}#rIfGrCЭD [Q]Z@vC#vE\;gTV:/(~vC:7>wRTgXdrϨ?ZkRoV?Ū.j+n~v_kZZ|2Ww_\V?ْMis4)+|er8Lo-i:/ۢU uD,>QpNn9F>d2xY<]ml1Ѣr32"18o2mVǷV/ǘ.9 ^\aT /F9|2@Fi.ܺI͊6)#)v?8{Bk-i ٷhyrYby+c ݵW"tޯir˴F/Gb |kb{j[NNgrl] lLU;݉})/4ׇr@1@F^Ҥ4iR4)դiR4)դ4iR4)դtiR4)I-t-1\+ܒ/پzo.|J,5-Ny%Q+](${~VT?_[z-It74\U-L*+*e񈄥̣w[-ރE[Yg7 b{v8.29wS.׷l }Aly ?S\nѽr^)$aا86X 0鞱; cy?XųvJb zIs8w)ݡ/rY .dk̓uPAy6 Q!(vׇ2Kw`0 dgd;#bBXɝ2,7{9Wهr@)⍹9].[(nqn>wyK-nޒ7߁n.|A\^E|U".A]U? 'ۗp-Hу_]3ךˠԬOfB]Aw$.3qc8(r`18]6ز{=LoJwn/ ^Tܼ2]ĝdeX.pՒ/ʟ ;0$K/mdmTAB,J@Wt.7)}.( 7 4qt}e\`}GY4ߓߝˠ }Ɲ2O.Zׇ3O&OBW1՘jWѤjW1hjW1jVc 3d1dB2C6b=dj#LŐiא 0x&{b7lܿx꾾PV/{/ mBc}a{}P>.gmMr.p&jK=K |_Wd,6. ֿe>[ɲ'o]-'[& ׷߁{)^++x/CbbWL  (g (C"ڑFV?BF~%϶\'5 -}6Ȱtd3GϽ]ʄ~$Q>%^q"sY6@^5@p7'ċ; N5cǰQEbs|s&\?n.1sR;ZE|s)"]]n.tmf |ъ`JF^q# :]JvXe'n*. -ų˳x/K<{<;go^MINҔ,M HS)I^M'vGΛffiJr$$'f zdyleuA&ܾes?CC_?q^M92-Lbѐ:r(79ܑvLXbC\ >'Y Z67VfY= ˦ω-~=2V/Bܸ]FIm]e +W[Ax^!y&#+EZNe&ߒƓdSgq*NoI:SSpĩ˩8uN]/?|5xQˏ/_ ^ Tg,j3s!uAe 5yRMƤrx1²2,nSՀ(v2ȡϹH"oH"/i4nkFH#X^`Ffi˫liG#XH.2i1Yq "c^b, _cc\b,Xl\qb*6/l\ظ뇍.q"p=@F9T4_y*Qv& v ۓM/;,2`妻 ]Vnp,Vn0XG_8Vn(_q!įT q"B\w!\PPeJ/XY'u9Ĺ*[V՛S2l<ظ /6v'F$-걸a%h~ #u=kf8vrF+k갣.2E"v4xEmE8}N<^.2~pExE"EKآ̪ M1?\l g@W⃴yKhEE>CǑh3__ `=ob9ctNfX8SP]#wNy\-B̼Hh+> 3)|2,/g>xR>x7wH!P'o Xe!NYjt^66Nbq:6Fz! W/^1++^1x^-y8+>o>.+wݎWu_|JI懺M6-?1&(;`Ta9K2>`愧߬%" ߟ++"^?/K׋x@/!^@\8{_ ?\'[b1 |(]kAI~x``2wxQ_-~ZﯠMػeqgJA7/.|/hS-xx Cئ#0b9o |J.nuuuKC=m:m]:m]VעOCwgck+WInQgFoemKy%t,LD%,ω~~[R~[ ?6f;ZQx yݕ _UMFb]_JR/;e$2_FRY/;%$R҇ry%-i*WދhUupANѰY08Z2G;h㼝~l^7kw_ުzW_o_뭊?}ZX댦=ZXk`1j-ZZ3ZXB'zG 8PpDpمeX;Qo<Zܑޑ;04)/w$E6˕D3:/gmԏ>P󞝡C={gg7졞=ޞ=Գxxyӳo/-y6žJdF7 &B!rlc#A+M`(.|J2Sj8{Ĩ$/mL~x|#)%]2ݙ22ݙt_Lwk3c▂X;[;S;c^x z%?.H2 wP"nf՘kҞ]{qV!pVr.?@S6MeG#s*5d q򭜦d0廈Ɖĸ#i:Mm2,wH!kj<Ĉ,O8uO_z ?;uO7>Ķ: AEi7AC2,qzcG_x[ށ1 A }AW!^kg2"qoƛ˰Cdc>ē.u-e-~a-'-po>!n}PUY}~r]Ķqp guwNH.b"B5]1|1Շn>!>r A"b>>g!%-ʗW8)t}BS/oWY?_[O?u?n=֭/[+KgՉ۸i0%%t}qYAFqe]|Al2h+嫭@Z2,0fqwaYS㉥u+?nKVu+֭к/[֭|n|ye|y|y5|y˃+kٶ@ub1 DuJx*]7 ZxE "6ˆNF<^Ⴝ~B5Vכ'W*˗W`Og r+C򊔜 wOI<F՞Sak>!L +v%o/Y˘4bˇsb#!.}ޔ>&}^>.}^>)}^>yE<~ _x|!B<>ˏ?/?Sxxw%~<ŏ$dR+p'Nx;P+x[F.|JQ;n+&ɱ1{ec[]cy9q^z,ćeE<_WlW/^+WlY bxE [+b֖3k b}U+EWk襗sbx+柹WKĵ_|Ώ?^Ï?ŏo8q6nl֭%irn9Zv])Zm%iVn9Z[vwV$mE"W[X)ڊ+ڊ^mEh+ZzxkB-E8l5!Xք-'G_5!xք(ߋx[-W붣u[)Z lvn9Z[KѺnp854jdL/d u3sbXӉ&&q繆2wսBl-/' e'vo/e 4H\F.⫭VTi+V(ɉw ~8ڊ*m-;yeX e'FN#l SRw.kSY*5I9*d8 j9o_r]d%wSbLat$ă}(_Bd'nxpdWq'N

'Uv2oZ羸8o!bk&r?9PoʝuͣxиB_#1FIDZrMKVTH5-)-CG擸BLJpv\_͞/z(zeO1g bmrQ2"eX{1.S{[Ha]F.!3vu''nI6̡je)S8̲W%zb=1tE=˰=av arA2wNq z E.{ēk.YϮo7$(%9ЍlʡģCkq}Bx "x2Zˋ@\!./qB\[h-__vᝡ}_~yG_}_~y*}{4"mx3=ADr),;qw+) čuRng}7"Wb>kd3鬥d*#ɶx2İ'ׇ,{&zsM-{ H | f f| @n2O}={4Bx;Pzv}1ٵL~(7=91&_g ܼ=MyprdB1&EeX>XoH~UɁ67dh졏Fv1Ea }fxʨ{"$g)|Cļ,9Cj>!nO '[d5pfNչL\Ɠ-L掾,d~(O6Bۿ8aԗLjSe'Z̤ɰOze<%ԱV\NX'Cb<}Nl2FrzFDž&ƲWg1a,>9Pv:,n_`2/ nX:[#畸B3nj=Woz'=SG(ZLɴ,Tkz s!ׇC/ɴe>'~% aW*f&U(G*=aU/OVVUzlx_ 3eba%Q+3xW-xS=ZQ v> . ?e˸QCM._%`hoW|1gm>DW ڃι -aM+L 35Ί:f26&Nz~hK ކ_?~}1ïOV/d W uyyK +n*Nbyvb`[#s}%Ν*'8ܐJTPК<ո#w'uƬnWjAZo+OUM[r >VorI# pT\Fk.:s|ܨ8:o]<:8$_bl^qHO6KB-Sљ$S> ]F]њ` 5q9^T:]F@6e Y@D\ H0ڱ@^ dj-@6?&N[ Z}.R1[~>Oe]*B\7 QU. ?[,j갴lY۹;hJ[.A>ZӉox)ZNݗks_*Ʋsv}΍#hڷr@Ne؇ٶHmS. !8̡/Cw`]NX' }Q¸7 Ӊ}q0VvC߷/frr}( `>]F q"?/U?-yD >JRԓ >9Q jkhcZn.'Gi}JȠv瑻X/f]mRUJ,M){Gk;+MP?m_eެ|ϱ-!Xl  K~uŇeXng]uLs[,f"XNQ hԷ Sn{sv}Ny21sȋ6scamjbD5Gsd=V'xjPΕ=$92FȄ7[˯#[.|AlkL"- Nc =3E,vsq3}\+9qa鯨[<ݎ5H2C ڊ˰^#0?&X_.|}!8!n'cu7׋x v)ψAA\_UzYӁδm%8N9#1;YKoeve/닸@\W!/qB\8A3oInU";O$!̤ cH^RX :)MFbܝdAEjO(ωg)!"[8(ߋ8 YkZ KYJ}eq+Mⵂx2"x Vw*y{ľUU\F.%1 ;837ŏ=̱J<å@% !ok_ XϡثQ \Nɜ!>xNt>!tB!^"sPo%}{̹w:ĝ!b iJ"\FftٶQub?NCH)Ʉ#q4PVeg͕]bّsJl?'čg9$r[qeC6r%+g #QiʼYu9[dg_\n?%Nr A8sJ bۄLxW[Z/Jv36._l?m̈_Qo LĻĝeX.|e70mWN xH<"^aeXk*?DEkkG_\yl"mQƶw> e)<+]6F7q;\Y?6⻈q~+6E\Z]&%~e9㫮 Fvfݡω}M({DqhQ],CؿA}><܉{DoQ8IMg6Ɯ}4;'dtbÎ)q:7l x]m4-`%Qly-4qJu-n6Btm7bntDTXY Fgى'`]W7ҥҍ1.Hu#=ܤndJ7ҥ݈Eiۄf'=dt̞rwբL瓛$ΞR fOyNxl()ٕ? 9$9j>9t ^6xI%}1x`>q筅R+C:o{И*oZ߬ eJGbUB/~'o-Io]WS!~3$U?wWY2PE 圖v ܻ2 qVy6m̆7>1:QgScc̗c q)1_118|9ǘc߭|năYlb[qD[Ai*Sl8v˖f3@]Vbo3&vx6#6mar}C\>? ˿8G2p8VT*a8 w 5c=pdDV'>VٜU6lI[4vg'T4\HR|Z.2 z3~28ytQ3^-oyƪ_-| \KgPZmCv(9G7}FjI)GDa1nX2+';B<M* Fg 1fQ |YJ-|uZ^z2Y;MMwZ^]_d-ǽQ)mwqٸc]lawE96fתņE+י\_lϛ1MFx^"C^"K^"~./!/zx2}KdKdKd|y;& xޚl 6Ja+{Yk #Xw}^;jhMF.G n"@ ^1Q"n>!n۩4]_s铡>v}F|rxDt^X%Y:]6^tF"(:6B8fUƅ|fחf,sfQsKͶ{WcDNg6Yݮ\|mc]l_6aUe!6bqωq4+1B,M'#ά$tXLZkTT9M_6ǽ'd6 Ur-@]d.@ݒ 5PW @]^Q1:Fy9 s(/(>r&Q1/;]1p횙*Ϡ\8Rhs/Br¡ayw1ZOpfa* !C;+mò՗wAעT{@cЩy,نaF\1E tW7݂lON5aK"a)Su#|c?-j/Q7|cRf%?dۈ];GZdX1(&"] X2뤟U粜8dxL:F=jH?\#&&\H8 萝esP@s/ǘ9>Έ(XZlCbyn2{mYFfQ>'RxGF:DR{iJ=8g' 0?*6j|k S(+(ٹ3j߀;{r*!g,ioYkE'zvO=WλK*ۆ^Ze=Rϸ+ B×L']C_TIOM=ϼ3SNPՃF9$OY_jd/z C vid5 3-kě:Fک- M/=W)<>1k軈Rq &VU2N<WV nb d/S^E\U5-lKgEbovږ=h>#m@z&W%dOpdE,6>w/`"MƉt`[d">L93;Eܭi4}BV7f 컈m:ZMFfO)uR8V2+]ui4{&F'ÑQ ^gĹȫݧ_ ЁR^ _؆'2: d`Vu#b崭܋r1$3%VY8(.Vr|&rLQZOr`ߎD.o E>QXhߦm.!lψe!?(\AxN": 4abWOYjM)co@b z~/''gֹqNlu|<6S|҄Vt4X/,3hh8_%Z2{(5kGMePw[)~{oG鍏5M_U- r]U+G; d.//o'5|Q×>U _m7?(ЯϜqہl1j C>s9㤱LgsϜf2ww92b8-0Eq828Lr}ULR67}C<>? ? ~ާiw9S;uN ۃ_SNa©Y_N]mpD໇w {]GdC3x{yYv!T2NTVJrg[-2,[L p"+$|J|S Tp*7aǨ_,gk Ǜ2Z1i?0#wװu؞:l.1lua#iö]`P6 ޓq~ Ygl8+jZc$ tvs-ϧ  ~ud ^Ցk kEhhWy# (Zʆe\.# #[ڌe?|Tj~%^NgXmm2#bח|] d1h7ܲj/ǣW>ξ7"u {Պ2fͲG?I: vm#Jb?r5Ip,ZL_@D|좚>}0I:؎&Nz28QN"+΋a'OO'(e"EyƍUƍCTheoa8DU3=:W]Y,#OG[rx4Q,}i:Ė!AbLRJ<3.[o-b^d$F +s- 9(CąUsQngkސtxw`"3[Q}zmNZOb6e2lwXSĜ{byd">[nqb'{ ӟTm۸ `3SgŜLtjme^1W+JEN[p~b˝䦵JtLiiU l4m .a{'1(nlF Oggi;ŴÈOm!1k"I\\L [mЙpz]z8džXP[8;c[OX6C<1/b;LFMɝGڑ^w8>M%y{y8"Q 83}h1dc5= > c1,x wp11aI0cS<=Þ!Mr u%CN1tu;Pb+5zP6 wg3L^NM髝&cKb[l\)MF~働xqg68#,&K8ac;owΜq¾=q~o,E!1"~Q/?6+ ݗ*3OcSl<au6qdC͡6v ,ځCFn yEyEyE~+X2ȯyEyŖyE~++n_l\L3}qmU28Qc]^]dzxzML{}/_Y?S|]`|9d?[U[\_ݖi%3иC_JGHe?Pvڡ MB*wB ߥ }2TT'.r-kFey-kȢ5vy-kزF,\kYʲF/˗e Te~=:@IR =IO\db_ mnapU>#/ q@\7q ○Tu.R.EH}HU""M]ԯ.RE "AE$DE~""Hɽ z,  D@ "p9+Rnqw "p&s>}wR. n-㼘 8T5]xӭZqm >잖1Ūo\}p&.^.ҾqEH"_B|6|I񕊻wf&öTppMF."ē65PM ۦOx W udhܗODuVjy1*+:lWUr3/ )l0o" NMF__#F&xvnJVg[=p=633" bWs3}h1d O.[C>5|luꯏ[V}l տ|l!)B:261yv .g"!c!cj)E[c3^w[-VԣIg&"[}Fm2q^ɚ[5w.?$~8'b fܭcͯK$qdDm:7v3#gF~*qn#>ƻ S3emݮa]ng'D[)q,iL7StjF^$M;7a'Au$U^2Ye?0ԑ]K`z`2^aps ˊb '~q-/_\CkW/Z5k|⚘aĬ^3n4s|v9tIHsOKQ]bU$#jR#2MDvZٽj%x!-b%R(eerrB|YN0iT[۵,Z˵橯m?0o{_V_//1|K >e-_b1Jx[Bá8dqdJe ȬC&eM'eqOO1`\g1lL#N~ԵEMm2N["'fav'F^ECBMk26kG7P%|o;&|JE'TPՏy TX&O“MדI0SylXoŽ͛cۯ4Yh s&ɔdZJ{&.9X/T8Cmpjb;y #Y&z^HV)""E]$p/ԣEEHn7e.3dcaڟ3m >3Q5Tqxh+2X%rBQ, 9:W0k]UmHR#Xf=LF! ;)U*ȼf[2>kP(b\ȉ!0 2s9̜1s`,f_ XpH퀅P,9lՆrG:d< uiYSEa?ϊqkuPx/^5l8H [CF.˥tηK$.ť˥sJU\:K_FzR1:T]ububɰ _G[vӇ/(ߋ8֨A5jcıF ⹃ N&5X1֨(E< 7`a[MogUfUm>KTw8[^'7X+f"65lmcƳ#[1lldOfE>ǃ vvڮ6L6cr, lMN7_KEgK]-_Xv >C;EX*ױX0S$R٨gF¶gVI&COFfKo TAD QS d}he'**HsK3E>tɇJ|QDžy[m}}ޮ.g-Zۦ.w*>67X>wA[dddeW=UYh?Kjm6L149rXpJn[qjj ɵ??0a7U >$i >'Yr6af#8 auc\|ATaf`g~4hb_ݸV&=Xk ҄5՗Mm'a:#e㽲C#l) MLF޶ek$og2~x 먭qm|t52֭[mj܇([Qq6meѣr5smվ xu}zT* Q笧({Pzw5 Ƀ׹t~.dP0 }ѷg>[a XςHC;'Cb|}A8ڨ C351&קE&%d"-O^'o%Oޖ'o-Oޒ'o,Oޖ'o!ά O*#3 ggѦ(ąu6A6>#>'qw}}1NQ+SƊ+]Ɗ+MƊ+]ƊebX1eX1dbXdbX1d_ƊOqx+x/CbbWt%^1+bXdX1ebXebX1e_Ɗy)32<בBǗM8Rظ_#xקG q@G (_#GF!ܶŠ-]mȊ{؁VĞM5u;`xӼEjpTD>V@^r, ‚g3O; B%ĀUK@k2; (]Z\_*em2py*t@,V?ĠEq׷?3x/X,IB{%ce[8}%e%cJFɱQQdX@=LJʱ{%/$~"IJZԯբqjQy_-O"բ%EjB0-9?za[q1}^uZ[7ߦogd,ZBI.Le3 mE TH+C7TU\fq=[_' !Iw`Wu^`[t>m2E^tq~-ȋ7qcGI:Vv=mޱ\b 6| ߾1|`&o_ fKɨެrt. {h-`{Z֙r/҇p%Qyey=!D~J߲R\\&|&ϗvv) mp^k̞w6`t0xC]WCKvhiCK{-ۡ}Z-CK1+J%AU֎4C[[oZ50H-;|g d.zzy͋K'˙TjҪ#J샋d(eQNj;D j^EfQƕ<ʘe2Eܿ!q Bįg,bg?>]Y???o?ſpdi| 1u1ܵd 1|e F>^>ӧxxyzOCxWMKkl qbү2hO`Ƀt&~a0q>x~6^約x]3pۙpClƋ}?"a=Ϭ2:AmWm,O >r3Fvhǖh5..r܂.ro"m1x6qӆ>> tM>H,4~'N,'BkNمp*qg =%Ӈ70]&|JL3ks^g%RM1Wɱag,`cs6ʹ!s 3ș0S5 < qe#~48ŵ9*;mJ&zNqfzrEʎldݕ~`ާr}֚H*Z rz?J1UY'yBfЗ]k')d{1}ƽ-v`=\_$*C՗(#PRl$l qeHxv6Q(#mlbɴH{>Wx_l~m566F"_xNot?䓛sPyq-ބ؉SGAfm-Z:]bUEv ԯ]ij}|uf.)^'ٳUH=fPbZ<6RCCX!sh6{VnlX/R%u*ύ|^ ةq~*%e{&noXJw^;F4l1XӮ.$wi,뫞"1[4rSoQ >{r݋bPm#v1 *Uggwi͇$5dߡOuukn:^;;Ze5abuÊ=K!$ .v:^qeqڄ$i-b^bY3}B\VR9SܫVR2{ēđ8 \ƈ{Wb:Q<~Q FV #Q/ y缉02h_pm FFwDVW}51jUG(E(÷pUr*|S].GAQau#S~2廈'|O^'͓W>!^^FXEvRDVeO+ăjHwӇw֎L&|AܮѶ {̌ʐѩX3j3dfkft~`t23b7M㡆^3}&,/P:Ys49vV~ ءxCwJ.w*sIOde/Y+ݮ6ʠ䤿>K3A7g5-vSbK\mMGqUzS҃^L3)I7GAtp!,siuertYh3\"tK.wz K-z C%z K!z [%23E(F=[}m#v60 dl5 = T @d2İcxMbRe\b\e] oqЇ|&|NrT.΃<1p,5GȠ}1@#)c q(Qm Yls fp#f02+t95 `lf&NX B,vsD; d. Yy p FWakˠ=ei0k4ZDQ.yr"*lqk2N?xrƁmVOͮO ~ƀJg]mē}0@F.fƻb]$M~\.f`cUgbwMF7A,&dӒ,wHD颺4e_ƃT1?oƝa(_OV(}N Z^e7GnLgk6> |JF_}@xyq)=濛 85xj9Q F^_W.veobxӇv(E|ǺҲe<~X J_+-]VZ|̥k<2JK򉸥-.qA ?n rZ;mˮהi uqvnQ_$ȕub2W$^+vzy )b++VxN/%W+8 q|7V$q~ v_ qWtv{E+MW"^^^+xEE܅xqW!B_]. ;4_*;kBXFlqkk2hGU'| .lHRhVtJ\džH1廈E߶sY6מlkaطsBLFwJ7}A,7q m0}bc;#cv Klm㝌sm}OJ<1G#ka36Fb2eVl-[f{̸-dlזXeֆl2;-dˬ/[f_7Um97ڒs`X rD>?Zi~Xd.5y֖ |A|f٣0ŒOX3m;8YkoISTF(&|6XQQÎ7}JMB$efN }3hgپ#Ɗe׌ ܥqOA۸X3nc>nms#!#c>)^0w%~9i>$s$̃LB<#gwncnG5}6mډ<;M#hj6>k Yl\qOb,6/qObqgqbcIAgDCG *dM:FjCbtTl\>, L+E"U\Ez""5\gqr&.REA͠'NNgŪ;tՆZ 9tmkEػh_h # L&-5qHW""U]tu..2EH"==wç57û5wÛ5Oû eηyWc:3,gW~!`3hVgrUӴo U*?)~Fʅ"7+ r$9+=ylȯ]%Kd9X?*?^Brr'OL +P oRվ\1T3Bx4}hqaLGF^a&D@ W2?CbJAL1A%lRظ/6ίqƽQd=mVqo׸{[ƽ_(2,^_=Qzc3鍟r/I?)~Yఁ*)񫄇7+?"f#Vt  sV&Y$k4XNd1kO_Xw&Y+$$+$khlD7~|/_[(~5θZר25:6Z!ǎθVבW.ר2j.wG?~hO_]/pBKrҳTQ-ExVȡ|Vt2PŪ׌ [qqzϸÌk՘qzϸVޟ33Vc{ƅl'qA^ňLbL_d8vO7}"껵뻵ޭu/׻ʻ5ޞ"U-VX C _b./w1xSwqjYeԲʲ8u9uU_N-,S/NW?7*R_qt%Sepw%V`s1}+򅃸Di3 Oxٸxl/6~oyޥ,e2TrȀQ\.s7/;`4)Dѹu0|&=89&ѹrͲ95ӎѹ\[qtB#?[{q@!%ø| !ǴkdEh>CFp#%e9 M9n&|q~!XgӲ%C~j@"29]#:+XG@2}hqf -wޑ;Jz{Icw ޱ;JzyG)/ށHzI0Hv $;@=,Ɏ4b %c =/cwҐ+5;ح4UC9ڒz⁈}2[wN<dhOn<1q*4-ԍhd6TG/H|;V{KyDf\俑)wv"{Mr{6&=.wޓY2=3}x2?K'6b~XF%+5ecq3z軈eqqYAHr]IHXkĖok̝]j0h_~S7ETNjꓪ>YC)Qi 9v5ȹ_M5VſF(9~9 ;(XˇQ(( }$F?'/?M}2 18yιXB<]*1J`'j"dvQyX?N-qf(b׌ybDC1vQ>%~^Yi$F IL,v *lOVbč9C q㙊n2w$㜆)Vu1 2Fc۽U]_IVbApdokד׾yڇ'ɓ~) R!RAKo3as`cGSofٔnC.~ j97hYE9-l>plݦR >Vt2FZ9'^v}k n5fTrG ,5vȹ~)j`\k`MC. ͍pn84U8cgۨ]k8մ`w858}2l|TC]ck̗kLq!1_5kl "6BP-bGCΰ#R v^aZ+CacTx0^XzYǸ_mv"kjjL'_}@Trdp p~& .vgKvM_ ɂ@sчv W(_goԳ۳zV/S<{ߞx_<ێ3OeZվQu{\J/,پK'ÑQw +0_az0_az0a9Lo{w[^(vἳϘYPFd"^"y3P.F<ΙbU(;'ĻDu+&(<~WDdOה '~r9䄻v\F"r 'Tsmqc0廈n_9pVjW4ue |D z>3YeU [_v^")1gy$ۗqx$#[j2˘VdO>=m̭*&vڡ ڑ9䖥PHϞkEd"}LKIl 19­ę5'/<'m0{Xe2V{XIƊ,cE~9ƊdȯXe_Ɗ"~ďˏq?./?.Yŏ+Se>".ŢwT(.$A;B),_.6 Wg (+|JO* ~xRm{v@i`3CzζJ}MO?jؑЋ [0+3\ƌnuHe'v}(qw0.$q{ ]\n rsڶ߆n -}1I[k+<gwۣ&e:-īYh$(v}S6#|O ~~S$6lsdٞDz0}h (e3P5apR e:gIYBmh5CFcCehfb}]CmψO<}>xOu20d=q/制vLg ,B WfjOGKkq֔@A? od>FXaN4/S'tSY0OZ/{5jXwb}^?xm@ Rۇ$"\6I.Y1ڛ2t݅sp޳p~zk f‰:w UnX؝\Uk7{ZrkeTDc/uފ4&C{ziS+gn1(3B@W<մ"; տ]d:몵8xS%Տ#Ӊ3+W 'y,Xw@ۈ];TLsjT9eW<%qJcɔ)ċ5'YpBle~g%9W5/fDK6ng篑b}3FiF mxٵu"2}F22Cۈ3`]z9 2b;BT_G!ꖘeLB:B0sbQ|0pLAkI>fӐ<ĉKLuٸ24LĻrY^eؾeβz\8^MڗW{u]Ct[d'O(-O['/]-g>%ѭ̿yD"o"Pbq1>!8b6¾{fO_#7o> AfAl_{p2X؞y>/b&|Aooo7H]@eo7H]oo 2 vwWsql ro~7=߬%!F T7C?=y5@P}^ٞ<',!t'-6i2_,N݈+?*;5CC29g+l 4=6`+KF|jN3ECvj-+`͉}4}h qi2w=yE>y°0XD=X)]*= sWMӇo.|NQ /xEU~WT+dd#M-_뭲ļTRSbTVKUIB*A4MFr_O^ɫ*O^}=y'~x#>gMbWaڹhلs :UȦψgaWF뫺' ~쓅xFSb?W'BleО⍿v1wN5MF.8藬{~wYFoƶFO "AkԦ OVgQfmq1e̦"^EgnN#Ʒz|-Ɉ]No͈MF^q||\!r3}mˮ1wP3ݿuc(~ŏ~?[xg-~~})'<Ñ6mNvt&H>۬҆5>+͌; x'q 6qMb6e6)lӯl_Hs79nZ}daX<>[MwZ&xhdl6 r`W3!'`c5eJe=ˉm2w\MfQb^bdH5}Bܙ9 o6ɌM6 FhM y:צ<~ Ӈw0x}i#)B̏)qȕc+2?:ex >~]R ;AmW;PzEu~ef:M-Z)A|Lsihl ʨ.ved ks['Ca. b"w>p1F\95B4黜zfIO$!d1'x~\A1-'u6`rE2Nؔc]_CKęѫ%{eS) :AmWQOݒ=Ju7{y ork?6>X&~/Ķ\]e5E[rk#9m$KxJQ-8/v|^L_pfiNIO ,?~lg8 *LJ9wIDiCS >->kZ‡3mۮs6{oa9:Tm.v-1g_Sc8ymR]δ{E';lXˠE';O *TU*IeOE@zEqe:G;+ A}f >ħN񙊡*D1R9Cc<炄W\_ 3$=gYtt u/bLvˠ=%[E;LD*cLޖB_إ*g-LH Wބn~;I&$˜S2hk@Da?]xfjNBk2hOI@N|njMځk .a"?iY\ 5\A"HE0WeQ\F.n8+u &X]ß~p=>qj#f,R*;O?xۇ'p'0-%Exzo!^B^KwŦtacFti~Äk5Or٭v4S?߯35G# N1(+Y]DQ@^'j vNթ۩:R^o^CzzS/uթO#3 ŶOv(ylE^HkL&- ]F~5}4CO=1C='fg3v4 -B(f'>b]_V\F.sJQ'P[OA60H \kR+,!:HX,">#bWcFN-1r厦 _yVr⯆C[q-1aE\MwK=+(D_m!D.cb[qA 5nɡ/qj.aĉ7ֻˠg2լj8dncψSQŘ ň"񁈩.cSsrq-A1 :3 g?>zqf[l<̏]~칋"Ů%fDv8ɬ.{)h)աV\x7}ADٕY v8)s))7 a6v(MO@9ck7}h d?]NT<E!9F!Lc!)G(7!n/&Uۋxq"nB<. .';%mO]a;ydY!of'+_]K~}BB\N$ w8m!< ת/Ƌ,S)=kx\^q&k<2˗uC7ςWdf$UrQR+e8΂3`LBYz#]ˎX xq32f8߀=od֐5`}W?+?󊿊ĺ~>kXׯgmŮuĺ~7}F|@Ϸ+_]C~}A5 ~fӴ$Xm!5Xc3KY7}AuyZ[ļfqUpu+ 㱝R]'eЎSg-Cۈ]K/ fxMvFe~ZU@Ycۯ& qǛЯ]bwA;y{5%"uDw}U]Kd^|"o#C [+~oGWϒSRFXqP aa7}C /`!Ff]F.nyOnq<&7bLJL^v(K.REvzI\d.EvzH)I\/.T,7~?ϊ|# CR`|6ћT.21g[M>2w(ErfDu_Ltڮ (GV=\xS"{* fˇYeh'V[yPՅe\LumҪyFMZb\_︈+>3Lŋ ebe:G]fv\Ƌfʈ+O/M:SWqr*Nũ˩8u_ %fnf4OuZkT#axl'^'Y0Gd{ۅa/%vb0=%NNI1=[&#$K#6vbp)m99߃ˊ󰭃L2Sơ \jކ׆8.gC6L24k C CdPR@dPIAe&TQ^$Q *=ˠR *5}TV ;+vQ|coΊ/,[]; v>NVrgO:q(h/j8H:}ދfBDbj yݎ V[hۙ|LaH`>k'wli+*.26^߻O}߻W}_߱&n^ͫyܼ'un^.7/=ͫy7/_#v;nbͷ`}:t}uW]_\k˫CW_vyu9e}E^6{U0;ݷ}e%vawWs5B6빿OzRrln}g.-&b>Vµ1p,!}Y_b./lgVnG\#o>9199Yi\3L*v5"ҷȽubɼO.rt݀RO]?o|\?o|_* A:oNUH'p0`VůLv,ƫh5|m3 ˆvTw:GӔGqwW=y6A̬:Js>0@Fn「|^?xEkkZ(JllL Оm-m _k.# v,Q11Fr18Fcdq1piD/3, q8ɍd}mK8$N)6}h !2DžxjFOn SgtO|q.zf׳^ҠQsqw9!LsAT's :q`ߐe`A|czǰļC*O đlP8e\&PΦ f0MgX 8?aO}JRX}rԋkrO}Si}2rƎ_0e1 ) ,f_?eMMAcژb\ 30ݧo@ۈ*ʠ8Os_]զ.#|//Y~iS>j\|AX{͉˘c6 Feb]Bg")QCīb /F<#ÏWxpտ1 d{Ո'd['/AIuQ EM+R|,dE|^l~/ ǯ'$aJ#V2|Aơ/_Qqr<"6)J\`LgZ60MFMg^q"O9el<.e4Yy\_u̩9)]F(ߕjN^v;`eJ{[}1mCg>AF _M  d#ʋٴ>P XO+E`ڮ/KDnn[ [%WcQy$kQ/qD Z1aگ?LV5LkCsrȮbؚe{fvZ \sGurnCߊ|ؗ?z } fUym88 v 2h}bvH-U*ߴ_ؙE"$ll~΀N3b?8gWdgvKrE^9n#p#hvmvu[;68P\_.%&VDA|PBD6>J R'ӵ"KEORʌŦT!U*Qs$ݰ?%\?G(_0iҋ2VO Dx 1v$BHđ(s63b$O#gy0ϖvblyAm"˳泅 kE[/bEO?UU^~e;x1u.'ggȀݼ4݆ljN?"n}hP~=&͎V\oSV'THrQ=Eҋʪ۔I"vT->?`@); s~<+-K*⽴0qb\ix{d[Fٽ4՜FOG:('~h:`n렦O ~Q&sT}`qc~HOYݦUi}`hǡψQ 2{3y^ex|Q&ⱎZ"r?QϘvC틪1o!Nj P×XatS=Y(|v-T\.Ov|z)%;)LM{3)](w.獰I=\A>Mn?gg^^+{/ 6_,]jru[,u":DwKHž|}~OyG_˥^ci'8-va{ XԅNQ3Q)e:6m}*FOX8AqYZ_?]& ,jj2^ۂp]F[.D}7b%[#o xqUߨ`YvK/]JO+3g$*z&*߂vQ![#8NT\_<5]F^~OAH P%>PY6}Bl(EQLCe%T{{&N3a &n19qF2bRb?e/5 Qh,+&cˠn]_wT[<$Մ.=Ư1/=`C{JAg!4mpn+M_G,]yU6}B\feul}`(_ᅰPVYZf[:۶78[el q56>'Ffkb$`ă#կG ~E;j?c"ĚGa-m},AEMq=8 #.>Xc]F 7g*ޜ޼xsoΗ7ěU97/7{y&xE^L9ʛ $ıAR bIHE̻ 1cslV>dP/SqB)~Daz[ȔB\@a]*3S62B_`]|kqrF5(kI ;S˲a3]̔ BlS~FeŽM–W^xQ%Kx;l۔õI i'kE[/iMY6CE,ݾqwܻ}{7qŽxixxi]&*v=^<^<^ڗ'6`m/ol?ظewqb~auyկ7*oX]ް Vްauy_ް]bW+xEWt&^/]aA靅]jE j"Tg'ُtqNUa eBChCh}x}&8Ev.ώ_Klwb(v(7\ LXeRH`N/co@-_{EN9"_{N3Wt{<ӏ׍imPIgf.n_Pk0Bٞe/K?Xv񿱬φZb;-f<]JxӅ]/Yz |͖fRRlil)g-|͖rҖRllif-e C"dq|HE" 'DRŤ a%:E6Wҳq*f ➂71Vҧ憐O{XAljˠqr8L9-k|WljyE+v^+*rEGy ϱ8=p8EZ_GՁQgK8Uߧ ~[Q\qtCGr}dm=W7tT*LáM:_B2m|6eS]q8w|sq ~xSU3,Πlȅ񜑻6f}GG{l<$ 4pl ̮Mƍ48|9]_*Tdnu !->Yi<v;ˠ=׃ !Q+>[_}|3N,-ˈ+7[}86[e2xc&S7m!l.#|7rVӬB].Y^xQd0gv9+r;\ 9e ٵ9-@g-ndgȸ.m1xt =q=R-&n]-%1l1b3ζKLM313SȢ,7;TA;^&7$rpOK̚Ӌe􊍱[ -Z:A>P-;h7N m86z6lz } ކ ކCo6s>,qq۰ @y~PYg^ E 彤<(2Eke,qK/!_/Ke_s/%,ҶQqb }9WQ"mxdӇw9\Fb~ĵދo7LqwoA{ɖP>CALJ Ǝt{b~WLyy+WȒ5f~ `wd?1u;<)>5F, -gɶ33-okm#֗)k -ˆ4 FZPgqL-=a.v5.ܭ/{|W?#g493,1ʝl?l,eu qMU?^܍82r+r>'͎!=[I39^N9X:GnƧ8Q~{tu~M?>:_=:)G}KF-#F-#zH]HeHlQG\\v cdIηGSXLZ(MK1}h e_.#|/;jq IK{5c ~$!m#.֗x:_m`S#1%vzޓxE4s}rIZ}.,{BNYmɔPd2c^mT O_(o> Z_b:dYZO,.[vޞb9հ] *#TjĕeEAߴz8Ͱqov]K4(d$É>h%^sW3rޖb9z!ons"f/v;G֤k5plz`pyd +^5əJ{ Xߛv=NY_2ߘA^o-yH^ y#'W@^1%yՔO9{K9^D'~^ȕ}Њ^$Z2O,)m6j}\SLq{N2}+  aAr)񳢭!gn#gvֈ)vW oKgo;W ,/Sⓒp ɀF^4E;?H̸  g_^)A} nNni4RH:0NRi *VMö}hZ`[Z2Ш.rܢE% ɶ!w'dψ+ \e5}+õ>!R&{5lLڔ}Vkw fLa>bƋOǔc1c1e1e2pk2pL8旁c]^+JXWL%^.XSbs%^xŲ fN ;%jes59>H'%Ӵ ʜ ^PNYn}6Nb2 m+ >e) mp&ܶ #1 rێdAmIյ .Wv$vM'q6+p_akz5ɰc0xa{w}޶/CC Z'SP;{q3eО4 )/mn/\q7qA| EGt(:p{(2pGGс|8A<;|QќFs/5pKEAbk$ך 3r{>Ko_dA9^^1bx!7,_]^_c' \_ξC⯼[ [>gA6xm.7N`lg5}|,m!s ~X-.Qy_.2U}^Zeޗ}Z.r,ӐЂC608{GcepVV9%!xR\_iM"Cw&Uݶx*BMsep%\vΏTfE3km >7vTF}7rqM {>#V2;FU?ԯS7-U5LZ]u,\}OF3nbuM%.p .D\M515[d/eB(b..#|/ox~)~7!de>!~xc[l/ol?xƙ.Fl9'IxxqKAқ%!^A'ۙ/3ufYsqج'g:HB2'uX@qfpB>PU>MSX6FxSbc;›\F^/xEY"_^+xE"^Q++I(^^^Q+xElJ\+NzEa[y 8mxbC;ٗY4^Xe7 !%2hz˜;].i["CyfX̓ƈY+Xf)kx6.!1H=ljacMψw{;2* T` r A9j=0aN!AO6@fF_7/46Hlm2|A6B]lbo<ۥyxnO6_qM'>PF1/G T~Fݭ*'04 M]_# 8|< 2a!aLʹ,nJq:ψd zi#e/U[VpGT bۈ BV3}F|(a6m}wz;Ϥb6F")Ts]F@[˶y2m۞z[nk &Nj!kOR,VO|dZ,ߞD/i:'RYB'208ˠ} \_l0S}1ēLE)A0=BMޤq ߥ"/; ߦK)ky:OS)۝y8ϑs)4uS:O4ur9<Sn)<2WKn*y:O'Y~7igxIJva{krJ=O)xTm6\C`Oo#MӲy#v0(6MwVnk'u]^e/OA=-ٴn;Om!Jref<T3y+qf2§?֙v㼣rGoH9bms`0LBKm#֗-Z~g.^\-e6ŏO8, be~2wYOH|F>+ O TE <`q@8 n[h"W^~+_cXq2qç TLA;6k!+ Ⲳ.#|J ~eFʶ'V̝.vƗ >sܶ6F_f~'6NWFx"/Seϟ.3X)vYiW$Ӈ+_]F~ .@\>gW,L>t+yO ?r'Gi䛭vQF1.F|&l6j}#6}F|bH\$6c_x^|ojE2xANQI2|%jE)'/b[ejk^9|]_d}`h\瑱Olܽd~L 5=]f0#S8 _um<[a}+ᗝ}ᩆo~8$׺~-I4!"d/Eܿ!C?w! Z{@o@ۈ G$>8H%Mb_fM*;6l탍E! FWs=0'Q,A{ʙ^kˈq1:"N4 Fz$N%=e!N$=[S#=L!ŧ'1 r(LaAmaVm:nK̂]&ۓE ~^y*[5[,j f_EYOVpnKvekV[M><ߧo8Ot> :Lqc VXF/e/mju||_j_|W#= ,}Szb;ه] g㦘L$f_ʋE< !^_#Bc? 3d X\$"dq|HE"]!Gf̜8IEAko 6b6j}QTc.ֳ~nf߰$_L7X& qcyC뫒 IN]Fb㍇xCx]fTCl!OmWWd 6[w b|l!s!>U_6v,lxqu /v,B+ѹpۼŧxe1OP l-xXY`~|~u%^[,Kw/s3[=c4n/0v#]99.Ӈ&j.#|e>x6^wm.>gދmpbh[L2rM]^Mr&8[_ b'K/l|6&[3Fo2>eLd<,'cJjdF3;G\/n alִMn+fRF 5ѻ1X@}F|Ƥ$MKd1 -28\f2-=p̂|w}U2R@2L#1x&:kbmAv7Vc ċߋxmxp\w2K*z[:7ja}َ1d®)bw@fd$g=yh G0 f_"xw3:Õ#dU3⾃Mx n9#.#|Aܙ_vEծg`c(m "8уcu[vu{Wt~yE+7+_>^P ٕ6up{Yd؆>#>2VT4}h$ Oe b,7qAHd^rϿm!F{bW,qyW .^1.XW܏L[z\X$#2ųPrjri BvK<)kc>^Uv{ \>]85˱4'h c u90mC76&k2Jrɐӏ n)>_+2}A 'Q"/G"tNJ 1BHAo^vmnPvkU|э}`N!}[سe_<{̄%K] :x=~` ך\[,3Sַ闬}P msvK/_v{0U"%޴QR`}:K+'ɛ@gud{3\B20Ge@oi.#|X% fd OFʩ7vO2RF4!CV 86a/Phr H*MQu5$tm_q?ž}D\ďDړj#$--EP[A39\8&`y\kcNo2S/G"fpW.L]$Y`T;aM_pͷYD4Ӈ|1tỈ|cso9 NMou bܒ3˦Isim!MvwRGcSˣXUzˈ!&+q)}1McQȬęNe0Vt".޽C[Wm;s>&>XF9@DC W A̾sqXʦψ#l뫲HUfV˜bSҳz)XƄt't4>!xƵaƙt{/9,*31t8'x;M#@b7}h q2wyEo'#fʱҠEg)ao^jxŪoX5lڋO΂rT<9V32F/WZqa{I/EgT3pAg$.ҋܷ2r5 h#=n:SN~۩E\!׋~C\?W!Kgoxbƶ,\++2xOaHDnӷ"}.i2g>!@lT`ۥ5}Fl`q%ʶ֗Ar^65RĘrY9lkivq`9l,kjX#E,~ďq7vq?!~ď/x9aF`2"B2m/+ dXRF^]b.M}ÔR.ZkDCwW.3qWt~yE+W֕xѱ "n~ѭY俻aJˈ5U/YXxx~q6mc`?aaę(`[3QgLNKx>_ȟ=]F^%6b-m!Fߴt%GS(FoӇ(8C_m!%X?Pwxxם82F8[lX7&%X1&%ψuMyySyyS.w޼%wޔ;o~E+#@I/%[Ex Vb@-W[3Y2lP7B2FOq@jbK6]Fx(YE$qHSFP2cջQ׃`qGL8\F~buq81=&̴%7s9SMHZ}ﲘ2"O_`!ntN/2TV2"RWG$)&}TvJl,O+_"uUY , >l"qﺌ `/ ޮֈ1S"*P;U7̴jE;Ŋy_Gb#q8Qhq>+Kgć9r\_drrSUHQ$ƁLt e,4`ɷQ|߶He2Dq*F2-`f|NP$#A2ˌ }Al>d!)BoX:(W b&ζ[2g.Lu dxV]ptS|cwjNC%8lq}JULv yyX.^1+SW+x_M8dAưigjvRa(*wkYM2wG"wI8˹4ψWLߋ +zccϓ(E<^^y.#%2kOH/+F˛xWLgĖ9_od>wa:ZiZ9aN6LT^~ ;yX+1B"'W\8߶,pi]; qWdX‹+n}m}%ZMW{q=OҢ*_\w Wbߝ-Id}Gľ'U2&ˢ9$,<o@i}w3\@8xVgR[>eFz07^wn%¶/%V1XK䜰L5)l qZv{/ c\Bm*q9 EGޠeVdn۫հPC_moq&|H]댣,Dψ+.W6Ӈ/3Y w P#4cLB4DSO.U<+VPVaFhJ\ߋgN w}sârq>!9Pu}qұrc}^6="6.MNj^6Ndl1/HMv{2/befR񻼕xsڸMˏ<{J\Ѱ]FI݅W 9J~{"L΄#gPl sI*#_N|fBXp@I(핫MfMV5}/bo0}2+̇.#|JCvU&q&q]xܾۚzI@| ԐXj}2}Sxvo{ZLo&e.#|A/ol?ظewqbcB~724ge.3tL8ď달Lʴ]F.b+SƊ~MƊ.cEƊ.cE_cŔXѿ`Y~ja@xŔlY!޶vi>,5!VYFlMh-ք\frEք3mV5m}0HeC_)a4Hxm&KenCS|NUK>04nߡ/fY*\'C5' ]N$auj '!CkX(R`ߗ7X{N f=1 =еcm4ET\6mv%`|bc8k2lB5lB !=$CȖ!dx{FfR,3mY|4GbVלyLF0%'緽ijob$~o.vΈ ĵqoZ1ψe,6.b|x8_6b-6Η8[*2b,7:eh[c18@e/Hl/W k xa-)^X[FVZ|T/.NqHXx3۞9e&q p#t}Rl! +xE(o(IW+JxEI*^Q++/@<6?,C@<.yE)Jl^+zy{G4yYZуeYM#c6}K=/ 2/e-??Oނ0]~ŏq=6`WO%T\kjTJ#_S[y<^SYd^S27۸^ q7q }B 0Yɰ2h7OkPC¼ge[}`0fK//A!NyN 61•6As&FCl _n q@_nUݺ[%Lۺ[eeﯷ Eat]-Qs#DDݐF6=lƻNj/5j22jLLL]3&3"3v̈́̄̄ڗP}W4vyE+hWK/?#㷉kٴ,n+#N.B̾y hψϨ`6j2"~ٸc]l/ol?ظ/lQSLPͳ ="~–-vv@T5hG|yPp$kϑdG] PβM#=S3qa;EpY9OF@f<Ɋ˚3bl),җKy?/qs!şKy?/<.Ky՟y?wq? {~=?bOŞ{~=ݞXfFӂ5n<DnxvAԙC[C91b˞ vZfȼxC7yē66}F\XU{amW"K>#>vA|7:Q.ohlqɤpHMͶLRƶ+<֋/;}kPž(>WC.v4\ǁbbl"׋i_yqζo\)i_yZWQnu-[e/ϻm OpOUTD$˜ҴH@oi*]F^į;oȝםrruu-y˝y㌉<[4L5UL#mX{ t/dx}:.-ҽ%uJ"6*SkO=C=/kok/>'J<Έ4i]B1ݕx`cw>#>A⑤Fܻ1Tȡψq,DgY8:|N4vu;DϰF27 }E!V3\_E-<4U\FNTc jeKmٍm#e!׍[E2YqSj`ނ|j A2iO"^uރfrr|5NINL[+!Gq$/j^b{z0ux%8O޶+N}Z!b[菸Lp> ]wy2X1E׃2 {}yN~&L'@fߡ ]!2Uxύ8l+.#|A[BY7yNgBqMl"sVF>i%kzGճ)Sv"ڊH2T/KmY4je/?;J.e0+S\|)rŒ.ycr(@чŜ2յا&A*˾K|a%~+>T3x''~*ʅ"5=/ 'm.Xj)/yqمO%t_99re?i&j) s7~Q;-Pr_bgfٶ|ě\E䏸LHn6ۆo!/{s2??YmWzG▸i#U1QbۈM"mI$~Cg@Q$ڡm28q }Aewԓ붌e.zBBUN8֨D/ik7j(t>:Kd*l|gxSޘaG.-)³Y&ES',&,R 0콧 Bt V]U{IcJM~=Q;,o|T͚څw>0&Nj!gcrGky;+[) 3ou{ NӅ>p%%Y{)~/sY$w $??g$c4uV5}+3Fh|=Y|!ooM?>mg5}jzvҋ=VBMo;xexcwY\Lo ] I~d-Q^R*+!#V\>{7:EyN93s?}g[YK91^,{s<\kc/{!۲>c* ,.v6f/R~P m&߹⿔߉^HZ O/Qӛ/…2n*r>r|RkhR|'{Icy h5{RuR<:=)Y_'o,MgIq:)xEI[ًc_]{^QG.Z\}^X].Z|0}GN H\Jx' /%;kƆ K?į??/o|9%~߫vo|?WU9u۠1DovohWģ/,bg]vȕ 2 v> 8hhˠ]%>'y;&2$h>0dOhФ'0gba1xD6}ASU&:]_8`2w8N=ƈ'9`[lܹ]qm隣S!sG)Uߪ_c ,.zs\KqF=aq܃%b_= =iP.O X*_゘s1 [c %d&L PmAŹN~B||WN%l qb*kfʆ|>KHi+]#h _">TQp^P`;sl1[U0NŴnMbaD1`(T1Fb/8;VLxhl1Gcȏ>:kV8C1`{!.ߴwsU'ۆc˒a]a W>wC;s H~Zp2VxФR'ۆx4h׈>_ӆh B$5YH~BKˋ1l>⩱4huf.x_;Hc1;J>O KDхb73/$xey[IZ2a&?% 6mX+hq Q}W(ߕ.h #~c%9pPA| ;Bb@:WbZ wK7V,~Oӽ4A2嬥1Lϊ%|wfu e)3`u'7)4)E:;6]td >yVYԙ\V/L:ǚa1V~ ~L5Gܿc*Pt48;fL:_ t[5h+`Z{ 4!h:K.Y t 67? W|"Ў};2Od?CO>G;LP(/k#9v$kZ NYJpM]9]+y'F榚=MIl. 魃F"1_.}En44ɸv/iG9"n*ҙ ӏle*( R\ ⷼ83\ b13 L6]9>i[Lm!5NJKKRs$g{ ]c7<v&D!Lcb ?&3*AllCoAwډc7#~c&?֜נ88v"qU汏~߂@efD?yjq%.M$;n"i35SSPi` GrGO;lэ0~(DpE'kV4% Ӹ&P .t18vα4yJ7kѹ(r-o'ׄri|]qJ:v^0iwWWqZ8%c}"ܵU u~gʒtanFVC1E;sVNr&v$R9)- p9tQSzf/C;1s >C/Wչlu:YVg9?sꜶ:ODYuYIqp]g_uΚt5᷹c̀w1nW\[0&b+}5I!~&?!fbW!xж:Bbt_9Kpp^+:y#bi,}!zX9^KnN[Ǜ|2|A߸k m\i^Ac^o,+r~-[c@ħb| a(+h _" 62c0-:?d.H&:vO&'!#-F|ׄ^?wⓌkͷ9vf\PaӶ9 E|%?!>E\h#+ۆK<-&>wC_+h _">G]-ķ =0]+h _">:LKltq{WGk.Tp逩`P5@4m + Iy:vu&O4R$ W+D7#d'FC4N+h #~Ѵc|5,n ÅՒ\pm;o6soYT W/K;PG{jT7:dJ>7֗4t9y."kwH>vqyQVw}e2Rb%?!>߬,;E F7xjlѩw ыMm"]D!b@y[wɥ1!KJ1qW"&Kј߈!;FԒߖZmm)w~[vo.o˹!kfng|A|=ӎ[.%FOjRѱ^q3[|):krBsN:ǚŵbH!!{eiѱS4/Ђ+:?bVd ۸ y>[ӣ9+,nhqB9hVWv^*|%M{*=TL{=ՏTM{*=TL{ڦ={{ن6s Q6_NBq C+w쥱~c'9s%i2aP7>unIN . 1N˸&|n%8Cgm>w^-p~\jWDAarTrn]疙t줟!ԐI W;9 4s W7S܍[ OYԢgNGVy?i (䗈?^]›KxJxq .+%ׯ7^J1]).T!-g@(\ϔ+VFp Ԑj4z,WK'0L+>'0T/vF4ѡsm [f5ΦNbh ˸ y]* ;O̻Ѳs;L tf9Tуkf9B7W9քT^x8n4E=tˋ%:* n QcMP! -YX^1`&ՂI$xMhnit{6)6[f;Qs @X6!M6Ⱥ r+델_F\D\ WddG0>HЕ_"/ pʄa%T:(Ac=FzN= lFAv7EbWE JU_S T v^1 `zqw#GXiqv:^K.kWӵG׮kwӵGkWӵG׮kӵ]myG6Dʶ[BpJ?!F)F\-]cz*/7j\ 7zWm WogU nŴl]vs@1&~bvm?qrm<<3>륀NB>3c>N +riNb( qIO_ٯUmMӷBП{Р}[|#BQ*~h XG t'${ p؛|ĭ(vF27n*pzC/ڧVr^Xα:|HV#MO$wxۃf1E^"TWҜⷚ] AJD?ߖߖߏ>s1-mm CdgT5m?-B\xvS7OV a~jhcpMʺnuFf0TW¿6sY6pT񚄡͑tx@j V856Ќ;_-r#?r#]./ZKU 9KUY4=w_5rojŹkU ~$]o xSSqPӽ힦ŘX"K=d0QkrAհ79tõwT;k¯5P\v}o.,f2{sA Tl.t@ͥr\\ny4uT]1zccExPjcK+:>bhHXgՌ/a5cn񱚱%#qpjҗxf(} =jvC!?1R-Ҕj5YTr%b VrYx" rd165vlE c+S4&bx~sOOOӳߟӳӳ?į矞~٧'h _ eejc9c9?iK{!eeeP!W)5@ :] 0.uF*N4N'rJ]N74vvz؃[~pvu[cbfs7ryǂf;slP֋aSWS!O51*MHDU!.!р49 A/hC\M6 gv.McR5 q,j˰2eKt!a,Ú0`Ap[͖aeX,]͗e>˰W_͗a.fː9uwr}-˰2l?ᙊ 62zvαMiK%}oPn9VUu'5&Y/-'n1)%:j~+9sj\na6b o܎dp u >>l֛Y6Ǭ#AH;bIfA_ע11epp„ܒki%X5Dc,dxЋzTm?.;I!D ~~;-h _"^3X[v g.B[gVpg1 V 6/-&B|?>x3-Ucᰩ䗈@5ȧ0$r˟.1T*ѩրY>Y,^րG}IXo-f;ZGs̉lAQ!pwyדα:||!1߻9oMq_G4nC;Asj3k/|/'.3ȼPCFƪз-~xq+ʳ$;!n[,.;zʏO?T@|zɶw-mᴳO -7Ac1L8c8)[c[)[i'idCܐ4/#@Oe}t*ѭ5W/(6EWN=ZrEGkޤ0ٶm˶ٶWlۛdfa۶Mm϶lmEvTSdW3E֏"Jnn+H,"{jKȮf쨦ȎC}7eW_}/??jr'0w`M%:vFv*õygH:'n3l‘ F~~ak:ct# uED X '~kRUhC!/6i+7R>rS6i+7,&7?G+gFkEgd^rlCLmAL~1L39e9e3i@_jS>Nm)cN W$bЉm&?!'4o|?V}~~"j}D>soG|B|چ2Cc W4 ު4⇶!ZvAc+qJ+q~Wⴕ]W8SnPmlVŶOs̝!/''V"x3wrK-}Sك[GA6(eROw(,>'~tڗX|2_"~~5 lDvS5zpMrKepE'k@X_?)f*iVst˫zld#c9J4;4?ٕN\7]r۾{۾aەN]7t:`+Bq]wCq]l/mjewCl>SbVi ϝue|sG'Qk@;WތX;5 4s )G,s" /jÇ7uFA7ĜZr-,\IXy]KD/?zg;s"I'P{".XeH+%?!6vZjaejIulKU%Pȉ ×f|y_d[1Q.t0m:bg](%:~|ܐcaR f7W#5ͱo&WQIEzU/ %BUU'R^_zzڦWCKR^?mbw򷕾'k$,$Z#[ű'< 6(^nZmkLx6,ӂ{»M6p9&g:ţ _L ltHͣBY/^]Q\.IbTIiY;ۉcً4h8aPsmC1|-̈́G{ u&̈́}Ps # u!I^2K6ěj莸3u ĸdAc1SA1 8E%2/c@qඊ@g[$(!m ێxZ4h\=# z~h9%_,xW b+W4+Wt+XD<>R1L*IHE7'/&ƷT,~-Cbxψ7,Qb@x*~1_nQX ?@xx.w$僦wy<vz~2c's=AQUqA|祥t5o~exIbl=-="I:Bvhyw9I~q>{!NBG :\2Iy>;/^b_IX>DO~.x ڂ5_/qW4e)F3"4/E],w .si%wV޻V咻}j%sOr{]yr`sYO#X1U{ojs|o9gcX{w{q9m￘$beblPPALZ.oNE>ΐ@+h 4{|hwD|xHT3e9WܮԜD _ce]=y1NBl^O19Bzh 顳Pئ) AC#=iCw?q599#r\M9^a嬟ⶽ^Q?{Eⶽ~n{E+MR, ]'!MD-/jة[pvXPpE'kVqM o3lgLxÄ7fBMGofB>BLonBL>Ɩϕ)6_-UcTX ڙ(u23Usħm ; En1Ul6\)WI7ҨV{jP@@;kN76v/LTG{nmh ~Y pC<4ӑU?W^Wx̫6Wm4}${vLS; ^@ ^x2/; 7:I C1qOTA6C/* t2CG4 EG}ofkNv$Eϸ q>Ǹ\H\=xuC̱Ɗxs'6ypIvFWԂMVU)A}F ku1~𸶲*+6q`m'aX⇶`+h bVmtp#l֥4n?{;.v_3(Ac1GS:QL:e/~}(+c]()J(@upZ0("`*&~ y) C;!/)AcZ[j{-\;ОҘPTG?CU>pچxP+Ac7c\Ѐ8&a︍es0.~Cdnڂ|kLs}\_o8+T#$dh5|zp}ucW ck(, 뾾YrU3/Ie ߟ 2/-'rC Gi&v._.|庘\o亘\r]'DDA2upnȯO|Z'D~E ĠbI~B|{JGSQd-Wd4A{~'zm^*Z//UyhPCg[ocHT?1<s!p]L1Q[; Fq{e Ӡ1|/YO/ xòMG"y,Q}0*ɶ \}ۗYB["w{B7DY q8W Ac> qkye4B_ W/C>W .\ywKīG,_c|7Av@>$)wc]]71|lA~?Qy#wn9KpMOd3#=F$/o*ءj06j2rf7u >G7R 9Fp|D {';wY޳n$݈߮}nGNPHٮߍfNX%5`aI~+H|WG[n$cW?W8!xϝ;pĺa= ȧeINˍDC8#6t5qwAα&l6" .1.ctcGF>h:ݑ&p;+s}IXbs""ƕVD1,efjl30eI9p$Cj/c"rKaPƾ;%}G5JP;m4aFy ڹQ_"E'y1|"1!W$1]#}w5G]Q\ 5y+Y1ZduGJ7TyypQctt /V-!tJ'Ol-ۜ?0f2d|ԯt1YplָM\hQ~91`(RsYp a=u>Cѭ&CAcnYm!kJKÉ7~>uЎEIpω3;. +hоEa]. ;Ox o o>OxNx o>&O~#m[@-n hZm@-csa<490Y՘rK U1 ~wTQ`~RK~1GKn# l?CuȼG~-~s܉%DxuM#|i<pz(]jhc2ek P7s B- Z HVև r3! G D#'<#YY.zg9i(>E"wE"wE"wE"wsh-Ӟ m3"t(t]c"oݒα PԻ.9GU=FU3t6N GC4s ~+5U =>DٰTigndhTWp t5!|bms)+0⩓',wSũr a@d1rK𫖽 Qa]Acq/{PYh%$jhc']bnmVLytx;s y!.\$<>3HSwW y,q"AyyȔB_\Ք1`PFƞjo_5aWCM-(QUomMm_"^=47ʶwrb??!~\Maa,)+,vMeꖮ#qT;+RXz9ք?; v'%vĻv>;#툳َxώ8툽ێ˓W:jt| :Ƕ"\caݢi cۆ6=%bJOC.=f{#=F7 կ\8S;%i76:l.[@-a t|m]@-cշi\nj&K]cE k5D'k]qe#gbu,Ley}Tmwҡȝ$},wpou >GA5Êd;݆ŷ9ymFEݢi}e:/Y 4/w>@~,6D3tD=(,O2r fDSr Ҕ2^?, YR_矺 '{fRs 3nrp:` :U>,+;\3-)taR }W&o>/K˫SB& ×_/瞴;:K-]c*]k$Dfsmg›Mx 6&&|ڄwc'&䉝 [Nuz-WG;Ct৸Nu}(α&|v?+Vb;/FJEhfT1|m/۶nӷn˷lm{~nۧF">#+F ZnuOdlO)4[ậ\uJe1Rdgeb[Ͽa{[μaL?h 'ĸqZy M\Ȟ`:hANmdCy#ZR@Ze6Q|FܝEꑽn/<׫WUP'p̣ra,FsGbG@THNΫ7RIŎ{hSVX'1uGnSK܏Es1-.j|*XcN~8{D|`ج`nCbWX BC&'9g㾟9r6J4lYiM ~o{4/CO `T`A¶oѰ==bЉ4VS>uqi_Ac~e2=RH bW:WS_rjwc_ xͽ|s^{NNh.lW+g@f+h p5uh"W'-~oē4ԜMcx%bXbnPc:-VlPmbto!GS.X!h _">{J){xƶW cf0~&~+vAcт7wC? @ q $sNks~?]g[DuhJ~eu,-Qu>+h q3>;CwJĨ q 1n\\oМWD,g_яu<91q) ъW@"tm~!t]Ac1B quB7mC|e@,[q<_m!0&o%㒺 q^@ }bP˄'* 򖭼YyVް7>+og-[yV__v7@{E[dtmb7M왓mCf×gq9n9mqq9mgq9n?X1WTa (颌彅8 p NJмEn({f. e OeTа}c_Lz+-KcF2nO8!9P3tmO|ܠ=1ˡ2o[29[BMDu})KAW?m gYkqY_^DdGD4lOmC;h #2i/Ke^:d_"ި$ٿ_VҚAB4507͞RGJo6ގx5BjafBdOտ_LZBI@oy:-~B|V 4P5~#bTqp΃m7 K^z/UekSF*Ҍ(-h]4"p.O'Uۉ}:4l0*r .~h'e(Ic^!,IE0'e8IivcD`!9r֐oJ~xF2 Żhz_o=ahM) JS΅-h 1PR+ tn;YjjUUo;Yj&7\j?esw,f&~b7ngU'Q>IM㡻u}bEZ$;oX_IX>n@&?*Y }` q$g0["~+x:tQzJ~BY~ (P5S*ѰL"CMn|1|X_ґ& 4cEvHWI*"?߈oaґIZ:ʦ̩0=w"@K-DGÕaE41A 7֮jDGֹSg3yRѝu.u(IXS+qO%ԩvz4u#5F榍W?&;I~q1Kfo_cE|A <*Ru7U1Sj| kz'"6Sǭ<)AWd]Ma1J4.fŸ:bƂ`p3V?^0r/@;c9J4 q|b)=Z]C@:vU΢|?h*IXٷvlȤ֛[W,` ,\1""+PfScTg0j UOM6)}dNz6.Qj\dr䗈?mq8bmq8m8mq8~n{sWg!GraG ԩ<eL\;$c}._*B+>xS|< @Щs˗_.FV,\q>%kŸ#r{Ȝ8 >T A^N(l\yÇ $c}oQm:h:u DZP:ٝ\K(|gauI:ǚn# *A?A:vғNp҃KϤλnDsIkߗOA'j }/ki0+&}9B\#`}W4/y6w[K_v~ Y 3]65eD6et+y_կZ_r+kٶ/`/_e|ٟ_α_3@”q᷶:ѩ:.[_qLS~hQaqŸ}}f|o}}gf\?bߗ}cq.4?lF1ffsHi~;\]i~໋i6w8fքS)žjJ~ݙ,tD=dԀi$wL~'cuk-Ja[&nh؞p FN#@0t&-{sq?[4mn Ž.Oqg/q d}qXwU.Bz% ~VXQwJGN][G 0g SG>QcM_;vvs4s scc9ve%Gce !U~s_ٟ.IX8&(|R-~h{SaLؒk1Nͨ۸ 3]x p.<+<˅gƒC-]$a҅&S҅bƥ4K3#;FY~kW&:u/$CJW-fWߎ#V\k\;%kUUUUUUO\zii۴࿴ZZЩҶki˵zmBZq.Y [Nhؾ^ͱΒ~ ĪTe:6xNnG# O/zi%izRPgZٶ@qg/\ ?J_.%~%W_\WK|u?%~>Q>Q?Q'~>Q5?Q:ߟnj9s9cL#NӸfƶWla;܆"i~+.uHH}Kğ wG>_Gwt<\w;* dF<{)l f#ġ*CQH}}kB5tZ7//{qf㔸\#3iFЩ3T"]cr#-F,f\ojgV~Z?g}TfpU|U2Uk}Te0U|TaV3UPډ6H[{CzHĨdNC;=Dv1+;Y!r?1:}`0mOQ<̩Kx{(_2Dj(Qf5sX+eFW:ʴf2pipn_n; X:tK4MWS꾏Wt E- DښHG8jD:▞DțvruCoH[fktm5Z}6[Fjk}5lk7AF W4k[ea D|`:itC;ss>B2!_'R! o!燈' y[.% !n\+t V=Ix@%~}X*sl 0Tz''xd%b$Xe}V;1Rit/1㥍X-[cX%?FhJmBxOSsƃZбV&WtFҌ.R(K_ Nb4ےbc*=P7tD;tTtN?e#VttԒαG?^ ٴ=t}Ϧk- ϦmݼI.'RXM^07s{X ؆oC BR]v.겿re?6eߪ,lS]Wu_^6)^=\:_^[J봻i~H?>DoZGx?c-/__x?4Ǻ _">JCp%;#,%" T- Uw3j39Tݞ{#Ft~#FtoD߈N7oD߈v*+%׏O%~%^~ן]"7|E 6аR>q'=v#ڂAcwM6Wsmtkn~5wmtӯzkqozzv^b!+BK[~Q WUANji| -m]V5-m$cMX K; [X7|%5?l8p"op@:+yfbY8Z}1J4*e6~X2K}Ͼd~XXX~/?o ϥK{R6S]KmeuZv]?.]j{I9ru̬'n ޗ|KL%~I]R~ 5삾~/OERW^г| 肾~/W ]Џゞz8kSÅ3ah_,*xˍ6u9G9ք [}?WTW;2?V?VÃ?:ogqU<{˲=CJhx |)Vٟ>;huo |=И?g~g=ٟ>;g-E>~_-*Y$l 937/q|9ZN,ȭ' ~}h_RMR://|_s/oqL}/wAdYz7c>VltK 1ANT]0)D{MŽs G=LQ:u| >`+:H:_DlWL8J9EY%0 qg+:gNt=Jby gt5#~œ'c2lk1w&\}։,Xďf,hl䗈쀼C@/a'QI ܶjp-ò>(MU66̡ ')MpˆWk ;BfA`vMF-h'tm+B_ff9֙3%ⷄ$|$|bMGob^~H8dx2fЏyGZEx@!:VQ.8QVg1J4cq\'bQČfM4lJ~9[誱aOo335\#vRLv\-~ݶԾHhz`|]^ϔސ~p y9y :vU rgӘ@~Wm[@wm@w? t@ ]=nmh (N@#:WRcWˉ亘$֝A0_aeT6[{K مf ʒk{(4iUff|~Bu@v5 Y3Hh,(ăjLPf['6Ѱ}EFʥ5CL|s?A>E>\v5~=wĮѮFMjƟ{*OE]_t7I'5Nyͤs3%i Ea )1u~.C4ұ |_螌ĮQ›< -jLے_uz ڼ-BN2mr'i8 Qm?4/+#V(]U92oU`8U޴U:|RdQ S:0r:S2z0X)B\1%2> @-}Ҹ@g6.6mm6[A'B5DQPW=x:-RRM0 Z" Yx 5fBZʢk G~׃]Qn+{&tS6?ꭠ{aM_KcfU_[o4_KC῿-xg[OK#r QRWO]/_8Z{h.*8чTou <Cy4 t;Rk}Tt4%у`O;s%^X{'|"|$?g7F'&|MMQV9Gi k__;돳|w/)+Np{5g)eʾz=V;J |o垿5/W_¯_~k] ~ ~cuӾo=Ne _N'DsB߾o~o ~s'|OSv`:\oqmAo"R;0[ܑ>$ע.p95 c|'q"SD"үDd#"wHRD"_ \si F״[ i/CZrɅZdKڳtJ,m+Aw?{:>|e|mm.y#ޢyg93ƀ8>G /KE3o Y4lOߙ{ymp"%}d[p8: AK}-EcmMO6Ջ\vNhbes1 a鎸1|?fZECejk\Hw'?!.gܸZxyt]I| ԉ 3 ~o>5FDk‡xܱoJ64[/z :uz BГ~QAmǚTrq[krxSWGSe)-^Ҽ΋wн?ɉC ԙf2NS\10!m\~g>h,Ahaϭ67\6zt1:d[m\?*\#z:3N[nzHQ[1BAl>,zpPkku|q)J O\{3}9J4ߧÊ^w= @б*2:bt^~7_]M T }1a<.%} BH3ؓ>p˰s am |^Xpһ&Pzhv+ r({~ޕJ-B# PRagh3J5Dtē`fm⇶o l>G|\A>n|CbKI|hc\qq+!]]~5#w*dg)=Yiq l :up*crMm,#JӠE4rªuO+>a{H9aHNQj_0 EM~B;ᶝ5N8}'ܾN}'Nx NXϏSCV*4Y|e_z :t Bٳg@aaMc )[ap8J"#Է<ЂNiu9[bpEG{ԪqM.Y #_dԅoA;lA#W<;9LS|7ѯ/Pgc9Lj'q*ɵ\הּՠ{aM3&|؄τWf>l«MxL o6DŽI6;I'-QIz:~>tyVr=O5^X>F&{Dgsխ|qMAThx܁xWt(Xe?;fd kW ŶO¡9N8\"ű/Ǘw·M|w§O >'|&|\>'|Q]ծU]ծQ]ԮQ]ԮCE tg,~g.uzAzBN[c1$?j&҆:Lq zHGLhAH>EVQqu)0{aMsh#+k#`ՄvXsX\_1Ѻ0Zqhmh= CF e- K4l h2J1`D1,j#F"(YGG9Ѝ'\V51\I%sF3?{9{ʽ^r̽|ޗڱNǞs*"H*Q(ǐR&36S y`<\|.o6sGVX}f\}z>#>ԉZaq̸4:,_eڽD-]md7'/.5³]4_D|=3^^^zz9zY^ ee^Ҏllf횽kNf4{ftk6L\{zk6Mtjbnm6VB?-OH~XjacMK5ȸ[ȞBKe1w˸ M5{gfR_a5f]1s=J}-٣Af{6&jکq"8erp,'W_xWMIMux:+zَ~O;N3ʷ:zOkxmsBZ&x0o۪m\oε ~m?D*/Ŏk[K_fЗee}A_/+}A_7}Sr|nuiaNTmxbtr-[Ǯ!Yn[p ^dj7/xM/gH.GynG9|und)mËwilWX'G9|DĕyI;+ݰh (/)KDl&sp{Yv >1iNdՁ^֝7:ɮm s{uLSLcZa@~G ' xe;au.VEg'Z_' xp _~3Z(cPP +ߌ]]wRC4_D|ohGÂfR1۷Tv-;mRR-?T#p *rs_*LH#@GTd5]IE`@!~h;hIEּ9b;\O, T 1 J8O4аm?Ob9܍ƕ) w F ixK2'bLaZ,Y#/) FMw!d<!A3xd<!A3xL"+ GPC&Kݎ䘈I*1dž\oz!^xz! g@n4Ma0bڙg~F. #RJ4l[p~l q04s?s@}쩕u*а~e_$.Ưw_ D|L"9(q|d#O' Y%4 4+`Ϥ-͗? X%unF:n7VcyƯ]5 kt~ljl">u:NlfB:mo;H@s///Ks l , ,߾@mo8f,9W>s}/ E5lZ{[d[&CmQ}mo|#a[¶mQ-SQPvau*FSG<ЌNWr εD6J4go ^/A-ނKx{   6׃o)ۅ}:4l/;Vt3zұ56t5/|/zFa2>UMƨ1|8b5S4#!Vp_rI7bhTWiXTT>En:sa믩n]X9p1 1nr^ +nk~1&o,Tq).])2Ne\ʅBܭ>aQg; ^Aq1ƒȥzFD\6E9Ffk/o//o:piFed,iWcŗ,bsgvMJ5)&X&M_l;ּؚ9[s~ٚs5`kn/[lyny2&fo!uwJ9ԲU%G`?7~%D1ɵ ߅x_<һI#;=HG+:Οg13s.pSy&̈́ ?DvA$I[/+}ߥKS4߅dl^';\pq_'9\pqҮEgo~~doJH? E!S:FSXM8ӟ$mb  *~] kpeucK2Ǘ edH!O l yj=Ď.}j6 Up]lUD۱s F~Mzs ֛FoQob^zs xn kDql;t)եYR;˰s_~"Lj8ɐ.!h}&~&[p9 j1W]{v5 ]ĝ)0_g3w5^%-D|;I٤|M?Mp+fV3U]"ˡn"`Ev7ZaYUa4_u*qD-Ʋ;׍g%x׍gOƳ_7xnHN*gZꝅ.{"q"Yq"ljdĉd'''Hb+h}"oG3ŸoG3Ÿ?=LY)>E=#: _E} |S]XoF%rLh9ކ/WÎ@#:3`W|u/N/+:]D3/1*k~{wT%y S8 3tѩS^E- 3i\x;9J4y;p=ꎓnN>m&:0ƶtm^ױ4\ȟ8m̓1{ͱIgTNB܉NH':7xvGGN y 1Us{Y} ?r/p&u4S̒Y,v[%h"H}:L|"(̃,̳P{ Am*Ԣ! A-J4ͷ!!hM4CQ[@l NoAۡ}hxAQ_ ?ft.}R9eՠ/ E} *24 K k mfbѡsO'ÒdX^a a a6תSªSêSUꔰ_ГNy:5:%:/ 4 r!.bΛh\׍2>w^8NiLMw!F 2h7q+xKsĥ݈K RFś1AoZ4_rpNƯ* UY3&e/}|y×~˃)0'Wqm8/Ƶ6Ѱ WErn|'D|fL}]!zhoa;R*c?O"{^VZgXWXk^aa^Z]SXWX׷g\2>EHT/Wq3/xn`gcco&'ĸ]O6 @4lh8Oi&l$ E6w!3"es3Oɋ}f_@|F5[%kd5 |79# [%:2V$fbpn7@#W|僘Z|=ӽV>[ݶM]b(ʗ{Cv~.rEb{A}.ӅO EtQ}٧E./% ./% .{#|fu=L W_ qf_Yy' uPgo d\_2.A5ȸd\Kq}ɸ W `b. @ E #.:E4U+ Y4#n/hA+zЊҊh/hA+JЊҊhߴqOGc=nc}Pb!6ZX$an͍`ZsVok///V{}y[ڷ/کDęyd(3KD\JtdXU2dZxGO~B_ZVZ?hEZѿiřUI%`JT Ta DL[GpZDzh" 7c+Sfb@ިn{c1T4 4º6?N;?h2ytr|hw"ޣdvmwI"(`[1`an˷CqG\݊2&` *"Ȕo.QuC#Z)!^>idD|/=݈F_d()"n 1=E W|pM爙ֿ>Wa~ !"μDF 8֛7㊎cT !rw y$:^vE -8^kiDt㗃\.ת=êª=_v |3=jjϰjo6h) /S,ș{ޮ9 J9esU|W%&spCxF& T q|@3:uZ0wD.iq 1נ9ΌjMҤ"U-}*n\-~AT]dt>C xy( }YCPpja{qfLZWWCO&!SA4cUa1?K2^ 5P\P8Ge|a@a Zh>2pO dfi- /Q[8Zq * v HnpGccLcQX c zߑt~u$xDՁ+twRDZkt %S.\{>{eޗ [}9b^ q x@#FS E{ 7n?1&#UV_@*v.B&"J!CUpG"mICE]Oɟx2i bVGċf!)W=jEU-SW%TKveh6nNne1%!k႞D4U7jD|/~ ĸOxF6M]Wq#9bbGyY#>is̸}YIN`Tm}\3bt)vSDZkh:J^,u^KE<=n]/ <[)y'ĺ~eBuR2>Dö,E?OCeK.M)۵8?!1H1B|hض}RX\UYb.D|q'WxyҐ -V@F:u,ePDZkh 35/'(/*[qC(i0:u|J8=pZJGbtV?_2//= 2_2//+ 2 p.ă5k%kU&鮓"XYh" =03ΏH6:ώP=4ҩ3CՀ, - a6J4y_W?EGNF%ː,ģ1zr< 96I9nkqׇBG<5E&Z6W!FqOcW OږB>ϏsHN*rr9"=(T"oE:|0ilu"ѩS@2=Eݥkޙt1 G(G(s闐TE-$kS 5Oey۷;xJҥB`wV ;8ͶT5DvS5ʙ'/&BAW%Ӊڏ<1Y(0:ubRoE"k+rީ".n UX!.>R;kLrvE0-YaŁcmoTbdcһ3QoWC':?G|f [4Ls%тLl0Aݳ=eϩCE"m :"s;EvA0C>0E#231/yDr)5ZPi\#8ȹ<ʚFwauffi5f*po=f1|g1`za{:Xc 繋pڎHU6zHΎ~ē'?*}BV-"807t3|>Km+vDe9,~B.A(?)#Xa3nByz_@$!;OeT,,-~c1Ѱ̆_}A9>xxh"qiBFxqA(ްZR@hi~-_4*h">G _E8aÄŞ><ұ|9僩iՀqMx xSSw*Ǜ7/&lO}hК)~}6~v}N&PP ?!i\jh:Z);@k5dMHv680_f8ЕqbƁ2Ԑq:"Q6~#'`"U^a;Yʹ+fRDxZE9t_ޟXG2X,SI*-U4_D#2)]bYt1Q%q;v<ɌbzJw%F[/a[P+o-$|<ޫh"e!ƒBc#f%т`+Ӹ:s/py=MA1"Ms{vnf; <鯸Aɼ2Ҿ=Rv*B޸pBˉ/mA+ Pc B~ 5 ׏9t6li9@8hj^KL;ױlDaoՊh^'<wSaxd]gxb2W 2yU!:X:g7c fZm'%[Gֱ3ap7~9#}bGbwf*aFDi<2:ub+BF6r5Znm]X/5#yPxFxXUN   <(!гt=R@omK[о%9noS__u}b~9A> 8@-'}o"'. h;b!Ԥ]g#Fi1ĠExP[dUGSK:urzM{CW窎c݅C󠥳U+L3񼨕l(Nw9& ?{t2B٠݅{8.t?.`~͏ $;qa?.:.t?.DžDž`e=֝ie} >)zd>ٶqEDZd@%ppCK¾ y{TI0n/8#ݰԲh" 7/p_ ߀#Xo5._TCY67݈h">G_?eC ;AƓK4l\-+!82'/"~eQN]q=HN1G>.\$$GS{ft ~ TZh^Zɟ)(NA]LsN<D| \ZjGE4y]?YES)Wʨ:h8 @h Դ?-}9 xǻzK_.ܘ:~7o3 Çv{`2!D'r)_F{A!9W;jҌz9\?e/PG`V2~VA6i{@hȆ:L`wbq`Ev9xױ#@!/ᐃ&EŸwa(:@EDc=ITh Kv@\6D|/= {2!_2s8_{=kq=GD)iwen}%+A`>F:uJpe[||KL; hľS s dqs0Y7A< Fv} >%At~~?ЏA??я2gOEjҏyNB@=A1>k .>c4Kkf<x#ЈG S:x4G@FwauYtY ໆf[ЧTu@ 1(#Ș'&3ZEQ:=PY綒e'tijۆ #u<sǷNߺ]X#LW5Z"5Kl;t!Cs9ESx+mE9cvrwSVqduz3{Z-}l^iKY.akw5A{hə[Uv#`m?Tws?;]Cc%Rk o@s0=xuc[?qUςFw~"X^ŽP-͝ qu眵ҥSuީKntV!8QbtJ,vW=9cHDvO nεnt9R= U:ǐF9]?a3~5xף h">G|ev|i)Fˉ0:`*zy%ڂ=';?F<0& &!pa aaOm\_Ps`n=N >=yUeaQJ+HladUUZ[vŸXmkn=z[=pgSLG&CO%ͻm\#8"?21v|`r{R4q tHzC4c qD[ y5@+bn B{a-A%=F<Mc6q(Ub,6(<#8ܗc#'YЫ܍h 'ZUe~8x$kا-JP%L )ʘc{E6HO&?){&s'$oGW,S1:B\5VYnB+Zp)EwC4_DD,87$3hZ\A1l@ֈ벍]Vz&s3h Z1_ZуV̠3hEZ1_ZV̠V问دu#$neo\X hضuV'&sppB3"hT]qI{ˡ 2Xb7N@Mgs*ʩ$ؤAVcN'y%GOaҩ9@9]Ms*B#s \?sIvyK[P, !9ߥ"}bh Oh.@yٲ9m'20ScQ:{ȇy dEH:ueʴ0p-!1yg=zKs%Dlduùrg5fbg8>P"MgC¹r7=%ĝ_3xl"5f.mαJ {Y~oñNvK)#`ʜmYS'shxjדnbQM'ĸD)ENqk)M+Jb+Q^RYGv⇶/ɪ8?!F=)鐝dJbE6 1#4:>q/)Sشbj;gN'xiFW{Y[?8O Oqƾa8`z&@"~B|\Z}+jd7ޥK4#F9ӊxSJENU'Tl*V"tTOD[;f=Oq`k#k?7cؼ Q Ӝ Mg⇶O3~9?Gs ڇ:Bm4v1|oc6˫.eӑLwUgvআSVTS>+t{p۴DAs[7⑉0[y €*:w2#%]Wϻw*6 ?{ LE-xdxm -Uc*lW w"cL?xO -ZcË1S%]GѪoV6;*΃k2YfFwauv4s=TaGɲ&:U4[FnGC!5FedEYE9bz2AIL]Լ(0=ъo*dngA\7HE)ZAڹ,Xl;tUqpc?[ES4Ġ-'T= \':yyl39ٲ#$Ey\sg頓1*%8jVh?S2cX8v%ʆ)LF1Vqy*rKEt 㪮7LN/wr;݈w #.F<#t#rỴ w s 3\33ܯppp>>>3ܜ^c8N!b4ēWxbroD|/ IXidӸe\a$wi~Pp ׊q! Mw!!4~4.3hvԊe{%Ѱ=l:L+L+*f; ܢxK+ZPQiՙ246lUlq* ܡrڗVO4#<|Y:0w+l΂ʃ`=ȷx pk⇶i39?G|"[R薇v1a:۰ft C%8dmLZ4 %a֝ż}0LmαT804 K:(V=C,B1a>o,WM$>@L5m5h">Gi~ֲ3h݉wգj=z?!4B<̶+5bdD1n(w!F:bIoN򎈕/&⋈?E*ސl[-h(C5~B4#gqot`[*FOYrlwB' |!@%b? #SpyLE?V7PFqc9x?W1l s~D|bَWxPWʍ5N@\ !uhE^Lø~{\+:^@h%p| Zp2ά3k6Zqc)0ͷm9q'V}~ ,> q޼iju!ϼ)"ctϷ[;`w~E4.o(^^o) DKxKA%^w:f*#l wX;H [p J]-̃}b,VY#>f d|D5Ѳ5F++ˍ υ|2hq| 4PK~(]7h ܏{=6#h">G b;|ॹ:Bm"gL0~|ee˺x-} 3"_'Zځ/UE8 H;v /ie5l7E4߅ w5yx?^U5-^m qt: /E4_D*x+W۬`?/\NWɳTqCx\Vt`/uF,7R`Xpi+#[2lRTyU^/U^AgPu3**  !6gGmm!Cv獎vv qE{̞ ɉm!)JT`*YSb[3Ġ8Zs%e\g1pLF|kz c֊ZQkEo2YH3 _t$ )͐_ I&O-HHXVPN7Ŭ31EJ3K5ǻ'%BhA+K+rЊA+K+ZЊD+N ?1QֹgGѪ5Yg؇ZU Ѯ\C;̝Fwa JY}#g6{MR@`%X:=%LogSM=?kΌGgy&h~Όzs%9Ȩ#& 6AC*/i,~kFJwߊ$2__̈́EayIhbU&m?!nq Ыh" ^K3o=iKmUGx)~Tq7b$pd/A0"0Vh<q9EvDǽ+iYHU4!FemZj.8b!^É1]T4jYNl1 rwgv~Y, {#wWa!/SYϦeGC+O=WC(* bجL+pGe!la`xHQml'G-ݸfGEOfv- ޕ!-Oϥr#q1~E5-h">G GWf|fg(l28<䟵#8#VUτ8 /lfh">G_# w@_w@<}#F>:"bDUE\ȅۺb D]!&w!̾w DݬKﯕ1rl]ϷCxy-{! \iJ>1ȱ;D0R+ο {-Vl b{NN(ʽ)~:.MpPvO1s\JyvWsVO _ևwɸ "jG1eĥ?!. P})~hă]4ߌ$\1@2kl q՘[ؒ怦^B<'–B9 ݀g7 춛nݳ*`vcwng|v /3 Nqz!N G@<^G@ʅ#h Z1_Z1V;h Z1_Z1V #>[a[~ 8YRaܭD  WU>E˖D|Xd_߬'XPՏtx<=㨖:biMw!+0ɱjxVH=J[⦲S*fZ1`9ZNnTjfc Ƈf+XDìVNe30 D|R7bKN1~]kS{SL:gׂS̪Cp~B|Kn0Vq4"b5݌o*:jJ0>1k8xZC4Vi|öA1&wzdPMwҐ?/πp~_%x,R dM$_J|JhzC4_8Ya*hD$ܕFX#LBYy-z$.mh"R^Q.1 q)F<#r#vu@,kddAnCcuHmGM1.zSd4XqIl/ckCöh Yaj#B|q z<נ-q{q z\-qoX5"ڻ\YC=PM/ nڻ! Ừ}&s=hZ_ZQV=hE Z_Z1VVFĝVuK𚯳cL(sqFąV,쬶KX8|1p~:']I % H&#F4ҩ`H;q65`|މB3\CkxD8rd,XDv8`Y=d0S{8pLcj ݎ3T13SERJ@Ԉnj!4ΦXSֿve17$ͬxgs ~(ugiRVx*`h[[C4̈<|MF҃_bQs1cx~y5F v6~5|r1t|݈cEbic 1R;YI}YnEIi#| C,+bC; G,/wOixpvˢa X<M _}3fƯ⧟g6ARБk?OLt~B\_@¦ 6Oms \_@6kӼ[46ͳ~4ϓ'•FbS??\c-bw LN. _yܯpG{ڷJ-aۥ1f}.+!j`Dq'ۇΓ, Cy m ݲģ_鑻O~5~%dG|gh"=e+h1r輝c*aP#D_iPD*nJ0("Y8 S4#FBF@ڍD(v9mHQ)W?i6ITl fH@stv}FojEsmͥ1|kAX72ܰ{sRVl4no[i}ZqcD TW-R)d?x =@>_R%uGMt$KUrT%v^} Ӑ;Ϯٵ{ɚY3]KϮ%u/?ή8gוgU_k@4fc#B\:**&ۏiZBԞ-McD$ rENE4ĜdFJ61}K4#atr1 i*ak a,!aX.kr~5ƒ 5$1NJŽPwm*uAj,X:ƾ!h bH@s=Y Ae-5ap:/CxiLs]Glz~KR5/|kΘaaΐE1Ü1_s ss|;3ۜqn Φ8Sl X;+"~B,&zl1Nȕd9?Gws_~+~;~ 9|;|4מpݎBVĶX㌋UfܭʐCvϻn>G\n}m8>\s->u 3\su}y>kgΈaxkgK@vF3agK@@agqw"#QJ{% mMc-`-%;R1l[4#n[py9Wky{^;F˘1¼<|^_x"x)cYf!P\5B *~x DF$~h;bayg;?!/o/o/oFZ˛߾N8sN`-s (ԕ4h`qƽ22zk=R *~|vBt3w#F2EF%S&YGاiJ" "PpWKTQzVb+툗JnD|ą-"HAːkڍ]`'8h4T{6#G-75š)dfzMq˧|kp)n7=EE9cK6kTy/ŖX+Ae4kY%ljJQlf/|F:Vt $p_hյ[+Zun.004SaC>jk+%hEXkkac wiEZтVoZ mćVLG\75Y+W?!r媌K%P/&sgU<:uO9g,>Bٛ( eR"DA۴D|*eFm̝qbXI^6Ng{(# mʘ:=Y4dö jw7 @eF?GWM|OQJQ|VS~~Sژtq /){~ɸS,yZ ?މD䭑W?WS`1K鮡7m0*WGVmDa\B4W^}΂?o]cUK5e^l/И>6+ +L'"/:!y_ؑ⡱skVu1 r6~)L~nEEHd]dm-Scy"?yrh4i6>14le'|q'+x]KcMyǻѻ떒4Vo-ę}bP /tUդNPRQk!7Pg%a\ Xs͖5)ҏEW ݒO#==m#|[idK~Oi/ogg .8#kľX<sKLŊs1 "qTN s*Rl ɥ*a\e>ƾ$Oˀ=Oˁզy3 ڮ:ұ31S _͹6;I<]XoW{e=|=hin8}V*$^5Yy</7 ~I *ݥ2bx)Q$;?PvO;x GM~Gi@x~~q_:X mαFSvps܏`BGA"MZ[z}843eSLtSPka\٘)|3]o:v~sO8OyEMDǎO҃sMvn"h1 ?;?)/_޾fIǎAe%CBUZ΢Fwa׎ +ՠ:| ڂ^5ָD)!~{)LCE>1)aSq~Q_zOR57uFUƇqL8Wt;HƪSר/:_k_k_k{-~5~_k?T}[o}aDxﮎ7mrlWU9]#Bu8d|y 45 JD=NN><J5: w,Fwaؐخ$Fb,6 cYu>,zvv"K{Kس\G[;NQw1Tf(T\sBzlPyGYPyrs=8C:~|t8)Q9G%]XWy (x)NvNXiqv=My,' |kjVH:- cZݢxe\%@Bbty1ʭƍvbPc sV y1J(7bVq~q=onn~V8<*fMcd$7~Ĝ$R mi_P{Z\qZqZ\iqiqiqwWi?/XRvP57cmi([D]*rbv/+TdoWoUdtC"YUoWoUɽ 2> p2^.!,&]mۼeܦx %kZW)p) %vFc.QƝy(̗ߵ9\޿z<Ǩ[z%@΃NG [G^t rH49Z5N.FwaSVv{q[qۯy88~엾/~r7w}?UDs y=nu 3i}v)w&: %zw#7Es21~2L±\UоSMw!*o⟫LoHXڐKE*RSEﳀY@‰ 1N\hﳀY&Pv*d\>xE/bG|oE;lf ۢ^ۢEk[T¶-gۢ'{aS]Px(L#h|y4Nx_hb;?&s"*?H*_*""_?C8/'qq#r''}8PQEs_7G3G8O#^[AU Պ| N*∯`'SHTd]nFGL%p 5 Xc_ЊHV ]q U4~gӟ}=} ? k>Nn?)2e:ǚrm&WBaEdr*RcI*eB7ގ1M˽2OmG, ?CTgh}-MywPsp9spypIpYsM_({𠳾nru |n>(L#\O' LNᬞ |$=Nǎo1EIǶs:W!U'^?ACbB2fhOFv USzhpڣo?>G\_/k@\_/k@\R/.AkPR/AkPMOqV90U8!γylwl⌓a1~1ĹwqCk{8 ]v yA t_@<-~h]+h"`aG\&:vJ\HWXZ=5u;Me:=,Yf)T!eNNA}pOOT*=FWwHOQ3*Rҭ"<cr$y(ݭK<4sHʢQ,KBr%_i2 )6DVrY6xUD=Z~=~+ZYm(ZtƄ  K*h]]&;Z׏GGmF!Gm?11 '.&.#͉w!ӼQ)e' 0M}?%,HZJ&E_Ìυ}l߀MĔiL1#:a*󀳲$bDe)ԭ' fm&ghg"pUɫ 0DK̰xjo2c(4% yc[2">@B'%S)M)}xO);OYēuLVbZt i;[Mm ^ [3/XEgUne5NAv5A2s 0L4{PsKO!h_iKxg ށxG xg xw x~#i͗m~G-T:M1#a]P&H̨J&E_6Wҏ)C}jt =v-}6,cd"#L7x qr1'UļN\%FT(F2Ksea 4'h*Z-`0YF\.NJ vgQ k*,谙Lqx#u̚\s²`L仈k8!9[dLc7(Nq8!h85DmÚr;m1-mc ,\Xĺ$X!(>HI>GaL1cc_I*gM2">o8 zP7X&t=nb{Ϗ15'*=VQazV؃a_VQ-o ċaӊ.H\c n_*voⵝ+n|1( ΁8ށ8x8"N׉sMg@~X1DQ|pVZMr=f*rsef’0#ߐ骼HnZE޿KaMA' V҃eM6 C4a0Xk/ Zkc˩:q21Y' "{t[ 6)b; e2+sL KʁXd"*jazUxk}<(w}O lOO}mo.jOSgozfi_o,=Y7xNjx@<>@eYbl7DH|.9 ?^`a*ў7˱2BfFdƬp5j3fr-q?X>ruI_ʐ*WBF,0!.V0~0|quխ=.~IiLV̇3ea/Vq.08877^x{+{#{w~ Y&Qv=e22MYVdd93NLsx*dYCm`'Air4:v@<cľsbLF%|+;qNv6F̙s \! .8Zg \O$͓(3%$%+ي.üMkpeb>>F+;|txqg<}NҳSxid&kEnm }>αWqNd#lWӰ;n;˱RCDpc\k ٮUX wXi3X">@iX/+"ck}W 8Ayt,:H saF5Cza/EaP?qħ&.ߣ#UmeZˎ:wz|W=jJk fX>EX7J';<}6kUřՊ[v">층 ihԉ1^ϡ_&]Ihm9t&]&]IoZ_&݂I`IW ݝc",Ȝrp Hʗ`lH&}})U#Y_{תJBOr$5?j4nM:;oqlJG+)g%僕c%{}^>yw}^CfN>xVU"9Z 9Vߵ%Fz05#mC2B.1Z״ǜC̮gJ?HeΤK)Iݼ';Lttq&RfL~-;oV[N r /Gp-B}, &ӹvؑx7'c1}5gXx+%p}>RG`0#Kmnᑛ5Ci|1.{p,Ȼ,2MC҂ytRkS%k2iDrmgBvkCmg^~`{\gv7dȽ[׿/Ǿl6=27I|N=/kPmdެaj_-bɐ]_ ^qCVyT倹0ԡa:zhSDυxuWP HEⅫS;ˡ+4d"_$~NrD~^[H~%f+zr$;xB>jW~ŋU#h T.Cit[(']7k% Xy^v kMvSy>M֋(h fD4[PvtL`}׃*ebШۃĸ[p=UqU*ڟNe{c;M*wӱ&ST’0x+ gȕTAy 꺟p'd6wJ0&SV8fwuh/ϰ/ulD>'[{kqA<4o2[U/B:\%*U/d9Uփ&9VMXAjn5 ]~edCơ Ͳq:t>A#4:aM_S' wx`Y۾a9ʃ=#;{Na~Y"?.B%Eg;UIVDBgq.CzWgz@ϤE\4dPvw3T@'}vc q E\ k rvqҷ/U{d;8<̲ɠ쑤;c >G0U ` |N6m;$;L[gYMm '++e&҇'d:2ωq>UUč 9^mqk,L׵]އVXY>cd"_$#RĆǨ>MTM!곻G]t8G|N|Z/If:^ieO<3%K{"KL3b5Edbfoj0E]LF.4<CYąu2M-gxK/2L{8Ir2JA/lxdCYĕu2 k2gBdQd6Cn1PoNgM_+]`I&9{_b3.y,.REm]Wpʞ2"bXQ14g>'~.Αkl3E6Y~>'d2jP[Oćy#\.ӹQϯ>XqW[?!K'c7=75 =%'o'o'ozFxzx[ߞ3B{L%_r+YLO&?gy\!(NS$D ֬gMXq q/cɠҹPL_.]Z|s='#s=4NF l\sbH_ ތ́EPċ#͒Lxň2 PE6QC_ sq.Yi<d4D _##@ňc8z3 }1S>oz>/b|tⵝ`ۉ)x@\q}@x8L|~0osǣk<,xcy8ɦ/9K&E'n| LQsT.%PQٍoA:seq Uxذ$.yWE.j2}~\b9dtM{\]m#E юv}NJ6b+X9/]#G8;$gq~l>'~d2_;b1%>nI)O34qPMFV Ȱ7q6}]2%7*<-cជ3#BꜬ+5#r:T*seC[eWA n_^Gs9juΤN?7Xg>u2 ^ܮOtv?v2VUD2sVWM6, \YNϬtIFng j2O$Y|(>+F%]cV_۱ڵ(zk*c}̈u߮ޮOčqLO2|ot Ƽ!igO+]d"Eܟ5ZLh{\dž+gLs+:_^\>~2dY]mLC2'y%MvU162bv%"+ХRsdzVA+%,rDV;'.֫KH?r) p>1jS6|@#K((Kyh[2ωp1oX,ʛd:Ct'>?z&}(;1`X ]_ aE1j黈T76@f݈hq}N|ր|Rd9!u+VA+ Pdxmך̯)mrk_1˶yY:k껛GO2Yk% dˁxc #8 w(b]j2;+eouf>G>'~D/!Á8M&.lOZ{}+#m6) +0L`<& ]˰kJˢ,F~Du51 t+ft@d2/  \Ng) -F>`ؠ}Q>'.:(Uc%vZ# 9VRplD9?tNmṗH~rFM灂DX͢ȳvs[V'?&Թ+Y+i)/ [@g[]W"ZQP=Ͷ;$;+fܧdk꥙ֻñ~a:|WiJ.Y"B0` (xظO˱RC@ 5F;[5YL52o Z "7EͲ@L33A"s?0mp-V%$'bEP\z7;r_Q佇d:=ٱT$sbQIw-1,>뻈ēR8K߰Bx֙Eq/T^FVֲ"qc2ؙɼԜ UDݭ+i8&dSt9TV@.:N3-gXP[kB5x M髶wU% |NXap88f[QOk/*9Vjn{RNV2D Z~~} ܥd}p (WbY]ϑ'9ɚՖx#^W$;/Ɔpmmj1vC@S$X!Ҏčx>'>l`31TW && K&wٯ1r (19)MLpњ2Se'ۗ_^tgvq7$ﵹ%A1>ד“Ó^O^ O^ O^{=y-HJAyؚ&8+f-]dUo 䳦"˽п4GbuzbuإOĸcčqA6ww 5YP9hz'"jCei|v&Y_ŠSIN;:cs&(BfOak=c3&,3nz 79VG jdыrP(>CjD~s#Z|ZkGnZE#\LqB󝊾].:~G?$h-Xcg;pIok툩<39L+3Ik ҋEVW/%c[nFnɸ r nɸf zvUlK.>'&%-#sR?,[ ɱR|[hMavr3qzR\.FJh` >>0θ>8ExZUtT\__Yޱp'= 31;ҔQ+=\31dώts%4>76&EVLJS #gH8'Jۖ }&a.m |N>m]\C*hl^Y7a>[DZæ'fM_ m '"x"x""^xdǥĊ mOUZ]VU2(xK'ζCBɗg}._brF^CmBUsd\;RoV[5w}"ƙͬ `'#Ŋu9mpۚl:mk$=-1{uaD&&D0Ldٷ X4^5=y;Ə3^&{򚜼#b뿷3LQRbY[m|6Uªk.`Ls6vκ4>@pw<č8LCW5w@yQprFi2(iޱ$v[+X55q }\>9q }\_}\{}\_}B[3KA<ZNҮF'F'{blgb|g焀^L4m{ʀy|[ 4V,"Cm88Oe#X V1^VтU`e#XE V1^V1U`Uyĺ7n[:dPx?~5}6:"jopgfĊ1/7zl3K_y5qM>x ށxoF[Y ~ %/sbdP4iĐ5pdN!JT12@)1tyO<ktۃqivuSy*֎ĺLWۭo6=¯mJ_ .kroK~Е=IUO< ϻ+/&#+XюWuUX%x⍬60T'^axl Y d ;AVx 2rx gq8EU / VYu92=);{p? 7ath8z3@C\T +`hlE%}$WC9/j&"->.9x{}bo^}\[>n[8F@/4 "ksVk? -*pdgGʹjMZ:w3;<:<{{2~G:<:;Po]w`>[nmvjI߁ujt1vds}">SwbDNrzo;"jZ'bAN( YQMh)xa7EqKqf(;1ےn9EbE~R$ܦ]_KMO>n(G"qI殕yYA+)>(#W&Ӯ=ZQVP.LDf">=<,x41զ DsMy`C1\'/w02z/G02zߌxkk`{H "ά./ 05tBL@tΗc̣],nՄe2]"&-PFf$j&"Gb]Q"o(\xXDL3ЬQT;B3 wTsssRPt~ +Nփ&9VQ 威C>q๊`Aa\}JM=vZs a?b0F}]bLsz Z\a=^փ#k=8z`zX.3n@t;Na;@75'.mnXnr:윭W~p/q9..">?v |$b_m2Vk7T6~R KgNn;7E֫B +Z2ae_+V# ke8ʰa23Gp29Ȼ/Mm2aۋxx].>'.cN㜀puOt}#.zdy,60M>91}#<挦UZc 6?ݥ׫k|g%yeg)sl yQg]PtS:g /%G.fIx[yL_ pdEl`K\ Gw$nA`Kv5 S li6AE.q0#ͯcyr]aa"hQ[HaF+=;>Lgm4Qn-r]$}ft}rTu|'c0 \heQuQM}]^#,MDB(+P#R‹m*p\PdMdx ىe'f[gNl@xW,apLQA Ļ3>ccc>Â=V܃6,,|J0&-hϋEFNQd|s1QqA` W(ԖxUO&o?h3|ѨGѨw7 of>Û}3Gxכ}7@(d9w:l "qVE\0})DI.!Līh bOVp OXnLg^H?Sy:!Sxhb~==d-oxE:sP [7pYEi2EdE5~NviKh I{& w9'҈Cot SI?}ùc,䥶~D*Cpn1|ex!2ȷt,, !l#87|1еR͉YIVPUY?o`?up;>XYm.!ϱUp nʱRm ~4Z#~|/UK᥾g /^Gk|^#H^x.f\{riaʴ()\IJCs0wfGԃjT5 ƒY̑=8KF\lh!&?V(PKw>C<$aIʁmNyp}q>w8>ί>+>ί>sw}]CkF,א'HF!AB\CpE]C-p &88*rqζݵ^GGG>p F |$/*+A#<Z,&h"#Jv|lna'yO*'oXI6IiӕiawVT>[A`h>wKLTnXS2@ ƧkMvߙx9\.^)ā#8e,lT~VoᭇdZV(%Pbj;$|=Mv`UKlSؤ.>G~2k}!f~ץz2ω;}y}1|99umCS2$ niE2ϐ615sb8!5>SoW o2Eor0{LBmP vQa$^mjCcjp}"8k1YN*N֡`؜Vj5+N e"|p1B/fbË ?Gf`*Tv1xUhY҇rsa2/_+CI^Il2E i1ÚaL໭>nl% 0 V䆂~3e&C/k5[fL{'[asbl4v`պkpo&ޏc}?|cs.؂cr9{q䫼uxݹr-q\tr~y}j5d'ˡm6a> ړl8s;]K}Hos9U* Y}+0ߦQ}d"ael!,xM!Oqѐ/!oMk^|=n!> aLpw- 6QƔ7й!<\_ n aLz'ˁؖ&r,8[̠V[r9_N|M@W_&3b998b>x"&HS[]ZgrRXTІOU9mUXYS2wri[x܈nD;7" u7u.$ L'kiζqn7og#w6#:g2L74R|2\ͥpA-Ld&m" ^f"-L&2D&}u"&WOlLEA+WN=wV4g?:m3xv07pmo,}Κ5nA_ oC8m8ϛ ė`"5HMG!42&#E`"5H&ȟG|6+,ÝdlNզ{E }">2 [.I"njK3t}"F|@Ot?(m0E*weRxVWŕOč[_^t-Cr>ߍe'f8 bfJ2Xvb%f7k 1 <凈=Jk#~muj)G V8{Q/:иi<ۊ=;Bj.ox>)>N6MCYCmp~3]~Yyd3"njhUD͉2C%}(x-51< <D\X#`dlhV5$Vҹc,vH"̠0cS8 =qckLUD>ceF#x.C\i2෵F3huB48Y5HK2e@̶l⻈Wظ4`kl2(e[vCҷ۲0/9LďX 'R GprFQJn0yx?u, v 1 QKD9 zh ݟ@_E>:z24wyIT]ᭊkGeQg-҈"?H_:"HBnYs/ Ag AFO@gH' D9tgƋ S(WĸQYgQdIS&ݔW ݔ-C )\m @S^n=L9)䦼۔?q7xo$hi/EdepqNM e2ω3M_^W̲{ #LلrCr7Nx=ˆ@}^iҺ8sяH<70@dL&E=Bup9a]DBͽՆzrhY?jCdp[&.ɫu˯'/):2דWÓÓ=y^mu烖d=.Z L?z$JD~&\ŘGk3D|g՘r2)-l3BgnQ1T 6 Gz, |N|X hQ;#XDmmCiusxd灝] L&E^~sYrJKsQ%[BL ѦOdrUtQ%HRr5d,z&dLLo'8q@I1Y/׾_ēj2f$1/&3 pH\qa^Yąsdw^8)2A«>N@Gp)'x™^ڮ*гxDZ8Y ge'f"\qq8~KʁXLHc1.qQƒ"}xBגOBBp- |q}@͇i8p2!;. '~%fxM` "I-6>;~raӶM_"bLgOx'o'/,ik+RZL>-lq}_}б\_ -+FW׼yI+ۼ#+ZWo Yąhɜ2+ƣ|#@2V :gPҾsRފ&( {2ya_ӡC3Lk:tbٔ*ts6a:D X7 8*?`Y]m;8{-'3 $ ^[֊CR[q`E|}BW#x}CW#>d27 D;h&#b?3)@tKLVd-S[E'>ާICe)›zP=y|Y^1҇r Wc@>ޡwcJ<>}CWaIӈSVL=ukeO+E1~;OU]vZhp(+ae'=\C ͯ׶VǬ=qϡ#IJЗt_jUȍxOдL_ m6n |N '>Do RKY2",CbLǑ(z_b#j=hc%M ]:El767wu6W2eVN辶ϵlrrYWk%M/ր_Vj|@:N @󼫦5ɸď\QGkqY|gQ$r"J֍gDRƬ|~PV?,K㥀lZQ Y"ksU+ 3caEPϹwb䱌B[|ےBϋt~ OsvV+4iȩ5tx*jyZ=Ļ3"s@01|2h Uk189U@RM.S*J)Z*M%nCrC(U&]Kk1NʎV?޹-l<:/.>~up֊𻵞ɱ0TF6Zs؁8ߙ].:<<tCUI(.J< h3<ߙ].^)nI-ؒS%Q]$*BbS"y3)nKeZ|a0ߓwN5tH.uM*? p䊳].FkADE:est[uUbՑ:ƾW%co_u^u<į!!:_<t Ai4.J *UV8]ks~Eo>r*ژ!eV}QuH`TE.NJ;E#x>ߙke\dͽE%Uq+hZ]W]V)aTEɫLfRmd{YaYEnm돖|a<˘=.fŭK&"q3+L[ ^MW o,94lk, |+ @ʱJ!&BÝ|YǯT-EmYQ7SAoe>#)sYLvr.!7w,Τӫ4WR*|LPt_8*p㫹Pfgbdr!Y?&\d퍟Ί99\qfU_0|hJttewx۟VǞ?/o {.'7A'*ǀDpL&]ҋg{C5oGP3+ÑYbׂ] L&9q +܈L-2tˡrS4ze"0<)| ", H#fQEZ/{k5/<|TORz}?~x{)aia)&lZlJlʷ\O gUZ+ˁxdPnhB.l/M&]m ɳ=֬1Va2h[ p6缘>UxҎW}C[#2oZsKogS8i\pLnj al@r~{㗈"~{㷈_"~{ U-7~ C`/fưv:d6U<[a١2p_iD9Lgd21Bߏelz,eXX,tӑ0ia:"}m:)]ӑ#-LG\_k g-w:p\f|pZ\Ը±EJ~y _TcLk/[YgT e댪KQɈ0QuڥLUg9WQL{q*H{>Y܎{Nn},"q-m^/ktK֘5 u|v<&ʜ.>'/;?`#x;7;F yc\CuܭD([;pAi&3qVl'NӉn%h=LԀEggUZMr@î&9Tqvrm"𼂉`"e";MnDR02L$_|N|gW6㱷pnTǜ,mx }"Ơ;%S4͚,x-3Z<\Չ7BXmj191΅g>NY2w"D5id9+L3gM!qӴhv |~iC`At%Rb0f2 ?[1Y҇D^ʟPvqXTU MD?2M2jr1P#ㇲCVA+f=2Jy;vrQ;"_-?4 'ͥJ\h=Cg-?瀟 ?͝Vt'gGljܓWz'?9=+='s5ܓWz'l 7V.@Uehmd-njl%>3WpBtZ*zFrp|P)(|pøk%Mݙ :5/˫ËwxM˫k:|Oq {H9ؐrx!0^^CJ/aH9rRVy)- )!%C Ri)ҲI@Yf8-˱iiGZRVus%,.Y#>Kls|JkP I4P({Fw4+ٖ# ѡdZ4MMDiddZ4MMGidwioidz46MEioidJ46MEiMg;}qRЫ]W{-:@֪ȜaKPfm."Nn,(B^ o3qw#Ls⳥m Vku235P`gq{J8luqu6OJmlUt̰j6kݴ:Ϯ&g3î49h >p_@9$1@O76uxΟ66LCYT:U1Րb2=޼PQ;59*M1tϮ&N71UW`E@^9@^)"^ϲ9o٩>AY]m xӥ/s <1wM}]|N<m6n`S·ypnǫgxx>icNwE}7Ԧ>Fĵ.}W"ƛ毽6(7PXqK]c;jlťZ\i֊,|WRd_$>; I=cKXqj4ɱRCD6õT-o"Bm㷝A.t%;uYg;9gp2kLdi}b27-Ef'(ba\;a̎#n2zd~,NpL_ ˂Oqu5LON78לgnEv(+s~W,2,⬶̜GpʮH8J|~ӎ"b]Ӣ~̲'#H)kі<.u,C::Y:&r| ~ b2/߃3`pn9 ;#s',) A?tSO ]N\e"kDٜ#~ !MF&AFR#eHZQׯ8CӢlkCH0mFn{9 uۇ:DC]dJ~upMn>Hf6kz%5IF0}B7 /&2Η/IweYYm'eP"7^{dʲ2}q}8YSk]5+\hf&¸f׬W}ںYK5k5+> ;M} !}o)yc|2$7V\XBя.E>#.jۛw:>'x'M[,O*zJV¥7`mY+i %hyD|EhdEž;nR ue>:Qvv]L&b:|wǎ??v?w2?[2]ioy~t+oi'~Eֈgf~Fa~.Ҧ $4}JoDǑVzM)|Ϙ  #~7578hnۿ!:LXsY|nГXqƹ<075(qؗ \ 5*":4"ԖL.eFS_fYRV_;"VB o!VdR^ԕBBV |I[#~n*i'oN^#$:Mَj f[w« )áq$F>pdPNa}Xpxm҇]_ ='&4GǠM>>)={áZB&]a:&1L)K:v\Z۴ssh+v$A:{@ o׃ EVOo mSN唾`hM_ 潫-MmωBlܘH+`! @&mg.}(byT |N|Bol=/v~/ןOt9D]z<;8tqJ=Cvq:DD,MJqiJ?7e֔itECon|W |q{tq& >,蚂`)}2ϣZj_wOb4w?߰Cxp|{ 3CS"4m EMsb 4tle}ÌJt.J N$.&+Xqv&;8&>Gʍcr6.N鑝]k8NV7^"~M8@*j=}B+\5;rŬ}X8J)JL8qҦe&c=wZISZրK܌Z'wЁQKVRpR iE%o-`\.F+ \Z.HIܥ[f]9wbpܥLs4}Sa(e'fix@8EPKS |$&$q9۪8Z} 6OU>m]`2ҰfM/_tC$ͺ (歶!O㡲_ʂ)RaBf2Mob2=zcLƈPf$=L&E5B@?Zcoh~v,AyP~\eh-WC?yRD|b/W;kڤe2}0 |[&r ^ A_ ^ t@;'aT>]ɒ>'~d2'ع[%de[F8| 8u7UD]ucsv&䔫T{V4Zfw,68BjS|r$sZ' k[·+ ^%L&]@yzaKm[Nͷɠ\^l"st6}RS LϬҟ! 9V8~|z$Jg1Ek-|gGs?~Go#?"[+h<ϙ4[(rPF' "| \.z?p×7|3.h@V#) HZ]k7|DzVKU؆7tn&ˎuGvѷZtn&WV+B6aSL່c<$ icHѭu(9[JؔDlUl& /Pb`'RY9Z<<}!4d{hzZ=^!|RC=d2/?g LߊG:o,qj(}NlǹlXM_ c-3v; }Cƍ3G xqƖˡcwH_siJ=xﷹ>ao̗q,nv”e2Ck(cMP@PvbHxMUγfV)Xj9@ܸ:vB6}#*OG>#864wbbg0U@o {Xk IOEךlתXa4rA_E}C0\wdP.j`;'> 6z{wxcw-vx{wx^bw-vx5܀XVl:p7crsV;r%܍6Fg:3)B@F3i?]mBt@|Ls"?3x~ x~#^o _w-|E _o _G-|E _-5q'3N`wv 0a{W7{}~M<͹ymU.?.$'}(;428]EIc1fľ42#brKE\,^Ln2"C e8PPP_CC CɾĆJFqʼnk~/S,r$>u'N\8N<"?>#^qĘ{8#x»ZTu ̴ ܮ1^?:QxS!#( eUe;LJ\w-'P k j5k%MX2Vqpx]r\:&{ߖlɊ+9; q,]XYT}ٹ?iI)|)B^~",di9qYͱKQd_0<Ò7râK*PF-z\&K%o\f^pez2 aB'hۏ#*MUN[5EgD>>k°X\.p}vs5O ζ!k>G^-yÖU[-ykU[ג7lߖT#^F!~p1`Z!;/m$ɳfϣ1`{!/2FTd|[ƧWKefxosc4//!>_C|iij?2u&5=OG jLP&,A)+E^myfyfޱwfޱm杯Wly{歛.%q{( d~!wE+A k@\_7oI . 9S̷f!ѣ[1ǖY6!+66h XmA[¶p߃ EPj7 >tKs2ss2ߟns2s2>'3?'d~}N}N}No+vCVk[m_R5QE~hbQc/? c?_?A~~~}~g}}Ǿ˾ǿY>>}qAA?%U g6NdNI8NGHnQN 6_ 5hО0X2Ed\+Ac}??P4)'צklT%bAxN[`'#! b 5@<)`5ภ*Q5y!.{o n5WQV[-}uCn'WQV.]7n587Q| ;ZDC[ k!zԔ@I_fپQ3AH 7kpgdhgT (ւ/aǓ.S%7~AtПa?״ 䢱4h0ߕ' W$E՘ZpKČ. fC>w+uMEPkt!L2}H ~=J𣱝9\q0 _Œ~z@2[;M'.& 0;?yhb {!s =>?Yۆp\FYs\_yfJCceڱqOתmu_zkZl]1Wn^m_niyyǷ0hξ]5ķ} } } oBN>0+_QQ(%b xkLWb$֢!hLQ fjR:7뱲ਖt̨lT/]r3w$cMpH #J"K&,虓J}4X &~]t>Jd2kPYb$D̺ ,$j^hc'ooA5fyN>at%.kW\S6ok  ;G ~ R4-i ׅY!(EQt gQG[G1 ?!5=αE`>4K{ vJt%b2esSZz-C<)mAvMiSinJguS)pSz9ײ[x|نHT]_vlcRl\Oeߖ/1>|(O<*?BGeof/OUI<3LL:wyM DU3o}OC.Eγ[p58îMP蒄ymO6-hڤ鲁4&@^D>KlTO5i3p|f3p _3p l6 6 yv$Z>ܨa= 5xcՂfc>ou6 ZV_4%&{!$ 8K3em$b4S Y裉FI²2I B,܀GÔsmOji#2˙ t}ۆʑ"~B||?%\i RGg.{y+^ /^[1Ցs'K1U__.S\'W D!ɵ'W "#HĈtxñ>02tY5]&>:7=vDgu` :=oQCn&L88z, i7c&Sl"!1`PH͓gK"G X6cbvbXhI^i,*B5 ]IH$SNEML qغSPY qSƢI!~h XeƯ_^_ZL+iE{kEjPQ+ڗVԊ|ҊaZL+oZqONmLlbL@л W6LO>GIכAII\]n1z+8ytDyzɕipKαuWU6 =#|{ c>O[Dɯ19 qغᡥO-* O⥱|YZN埭<^l̏cJf (<|{}zfC]1Dʓ qo}:\pUOdw}fqk@DJ"֘—-F4{@Ъ[E߼$j[ކt8:W'5J4Ǹ&S,PeCJ}wz-}jl~%yxgjOGc_T'sckK.0/29p͋=hkyu\`^9V؉Г 9\1jw5s-[c~'7Dx,C[Xe0O~H1T顴~=ĬQ> bxM|9VUn @gDMȠ͗y61+MvX7# ?~^?Ct<@9>s^tRD]#|J$cu'덡eyba~51fДqb㚦P&Ov8f=*48] h"hvuk7AM{$!{߻%byB0!1 c|xPO j}"1]74 ^n]%Lՠ+IXD(nal2M(uYl.V&&ޘ%h _"fZrp3֭](sx0U%Ij1葦sn'ۂ>4Xh!~}^$~h 0LJbL8.0#LNg}@w7% (%h _"ެ0+îu)+o=G,o}MgM|`7DUΌr=r\POxQp◈?:DӥǛD1e%o2>O{4!38bAdCLk2{- e1]^<e_&.B5,Cײ4L⇶ãCQ# G g=_e]2E%'p\iJGtʺґ{.îQQj\>Dpva~xܚAK-*Mq iyEc{%{41^Nh S8O}"WjϪAcq!W77p\wLC$Fv4έ% ZgMўӰi 5:}wHCN[t?C)~h)MB<¡ 5:K -Ec@5igjՄ9|ʻ0TQOz wsdÖl|g,O6*ě (Eݻ.D|hr~Ɇ(?ٽjL*dObv44Y?z ggID4݉#\/q>D3Qpx yWtx`k3/pW-J~'=T3aG~B2<{QJ;`ozªCͧ9élo 9?G_׉Sl>$Vf btu_E{WE[`, $Ac__.߲._&n_^&a^K֛)w:v!Na~^7[wĝEkD|/CF~̡/M-h\⪘Vt} C9+͉%{ho4a+(Lgg3.*,LTv-`_W" C_on~:.GA&f=zs= H[n[҃Xo?^h##7GGPy겺u~5)ny=aOݳ<| koAxZeؐɣG1>JtKMzQ'^4va&rH/$,VvfIu[2kyxe !Z}#-F_ઽׄJi4k6ѽ P T=]ro<т%b!pF 2Y3Wt9s*:vtKHDiā4^g C^ҡrt 9GtPSsJyz.^s Ub8L0)秩#%Fjc*DtD?M1J4͸r ~LpuAo1$Fe\I{q-/fy:h]9VG<8h r,Kܟ; Y cxn_/xcV+ِ{;OsQÓ._ /Y!m0VpEky9֗oђDcp EQ&ӲȽf.-;R?7 jL9ւ%bӓzeUޞN;+ kwuF|Yӌ- {^s'X؃kυ޿i { 9v~EƆ9q[cgXMEik,PwZ9V}akaUzCQ$;vZ/3Fha7,3?lb>:H:vb-1 VSt ~Qrߖt<%͕z޸x'ttjA%cgruL\bgvVjIX~o֘"WAŶt_ޓ%2v z+KĈaaPocg##F-XUlW7<6Nr ;>aCK:ǚl]>[=[u}ul]߳ul]>[?foQ@>Ü>ؕaWߕ=-u((C3Br6Cr?UaڼOGt&cgYHn"\!39J4;ٌ+Q>b::t$E*1V袱J$[{K{Z\8a31wق_Y4V5 #Lgƒ|K6lt%*[xa1DVpi39JxQ%ݸlv"ʎ7#;-nQ/qƈxRW" }=h KEJeޔFYRE2VjݖkeKEU1dܹ`,/TS=*wÍ q2K?!. P%I7R6J1^g(!F #IFmwT0")RI)a()BAZEmQ5t7߼ae  I!.5y80AkۃSw: o woHݵfI?SwAjMbPQf=h _ w^n ,GSfhEd64hpB_ -ne?|O&mC,4:X+B!nčNaEbng? 1.>Grs](Lҥ qn|vn?w@&y1|_2N/TeC;qxj\h03ě K8;`+i ߗ)ay qf4Ґ4"0}rV }€0%k6ԁhn]N=t9Aԃ0O^ƀAq:#m'є1?ی-hc)O vƯ9x!T?#h #C+;ܣbMa1s[|@8-Cc/O1Q Ũ?(ۊ\Ov1,!2_M$m2~3.`@etq%-$kݿp!09=3L_S e+ZFu5jkj #E?x±e$C?CO[kVlMU|{!^Q8Io (nV!b^(!hnے,3!)YSXiG>G ӵ!>tz\U.fa# zCXxqD<+? <?1`uI?YĉDpy1`<sХaDEO5cti>ѝxxMp;@:[fp-U4︋{;$ݒS}zmk3g>IXQ0x|:o<&]!`Dg|; <׿%(_J$̿-;wnE-Y ZcDSd@8As'GCf@=l tXeGܰg={vp9xF:{ben;A @|Z"иqG‘'W{ -re'h6}:qb(UM*Ք 'sb}so+u1nϷRХC(6nϷRSR7/FLI!+mۂ~4YbWf$_#g/YHc?Ϗ ?4G~3azDkn8g⊪=12F\]o{b!?ÚI@_揍_Umf\Q8& ?ǤZrpm UmۆYe`g>G `"t&j{8O욐,^fh]G'5+ƀfh&?! A"-Aߍ;Tݯ%cAs; lxJmC|3h #~9X~`s0DYДqUbvoُ6WtlV+eުaRL7Uf2Ɉ>,?,?,bK}yRR4O*||TЇXyb41:Dn_AF}m_5tFI"(SL2 j~>'^)G6 1AcO*%.fݎPL ~J7oa+~Bծ)1.o'fxڵx{!^fZ9Bh1lbś7yOZG6ăV4xx͆nm9&TJ-4BH<{sğZ|BFE5$:vľG~}%٧q|\8e7ww|@Ԭ?A$O&Ua?/  Qw?,u .H.'\,w7Kt'?_q"3h KƏD!nC@ ^71Z ^ 5L~rY?AR؋ X)B ڙ Fdџ ×'6 q10a^wnNcgٟhkkɵ^1Z ^Ӹ&|Z'89W>d(~ffU 7o$yz)Ac^A5bA|fQqčOpz_'V( _3kHa MS@' #h5.h uj?t+9PP~!@nÁT1V^4Jgޡ\n7J.*$V!e狜cx+>)FW}{\_[hҁD̺]PD|DҺI*5OtF֒ތZgc9V9vC:݃AQTci6=~{T4[ӖեȫmuLݪEV`p@H G9wC7{TI{luڼ+gpJ~OXe/|~HUoTTW\WLy"qV8j;0'y+U^*w+h [~a_BXҮ$]ȷ.On=Frbhkkx4/ Wo4t e)p E<)lU&feht ߫_7wlI4握O4r ۿ^I>t.-bj%{r@}/v.  *Xqg]'vC&ܤٛ%+h Gq35ba"iOrY4rn]/J5pO{n}$@/~B|jn"9p+1%)'0gwƳ o^V6}h`"@hOfa"TƏ"~skًFTS3Xevd|,%C{  tыLt Yp3G2^Fw!`#QjB51j߰ߴ5 گ߰_M'#V,߯ktn,@7䡯(mua.@޻=,UF) /C-_;ŷ[3x-Gc);C!_ޒ QKdMKdLeOYoM cx \ >mC|4fb3`hfa;s*}hsxPLQ'QkB; Z|mȷI@ol": !~3ۆCРbs>*=L6rc/|l@xmB6*Mڄ.ۄۄMMMMhgƣ閛&~ 2Z A -K+ W>&s,~{xof8`|혷Bi~˘;fUvYy{3013'#gIy#ϿGG4 pIi-:;hln1JVFjrX]ٱ Ԙv?o||o6{K%;mvZ*$6{6˃mߪ2*U*KUTe*Te*Yz o%bq;o#PF3@is9o#}!-c1xzdc2ĦKc!i0{!H6ć0jlGq{_|]yq/#ɍ_@%ldug̕}} 5jЩ+:ٴWM:_n&__0{_u=1 cFJP8s'QQ=m\ҷ d܋fpc9J*W` nkr#1J4rUŖE E0X[4[dS0)'v>p{!&.[bo~֠ )sѡq5Ac22>-Qhl;D3IH_15؛ΨҮb^]@`+ұj?`36S#YWD7BY3k 1i ?Y56 H?nz2ǬFKba‡(cJi #6ml kР@>wFE6ăd;h #9\J¶$vzFږ\Eҝfˣ 4θR2ύFd8زtxtYE`5/. 03aα?l8˜Xy:cIN6| xӓM9 I@;t;32?/ߵ4h5f_-}F~yYhE0v=cv^4S٥jpui' 3αuu=uQu=[[[u=uKdD[ f S_:*#/Z(ܾNݫЗO)C;As I~j&LΠRG>1zj& jyh¼\3ag>4as Q)bTvdQ~⢓5?[ѱS,!̌\I%&c\ ':gqBVدAa91 cg؞a rB_lRjMWK)W[g_K{K:v|ioŗK,_K{ͥ$߃ىGXfQ)8+n6:Bb47V2ɈEl7α4h"͎U9VYH' q,꟥fOBgnYj>K~}ZB,5,jS,՛+j KUσ1@ұS- qWt >GH k)ebbұӣdxAX"):.1?H%s zVu}@K9Y z;jX#Ai˓1&NȷԷl?ǑAU ϪpV?c'4!?COzBmc@?CGW- Ufx #|YɁ9]z;Z1, !s95JxKGS*fbs#-F;V_4}S)JG `9P)*Z YG4^ps J ;̱j%?v n/^V0.cG*xN%w'? |y!meJf̦_q¦巐VV/8i [jxQLN$0dm otQk ǨPL8>?i8?tF/fQE=23vz)$ 4$d߿|f$dG@zgl ҭ!օJ ,O'C;s2{D<ك-cJ56r\jA-L!~ݖ Cd>/֕? .sm =%ZaI8OzIɶ!? B#dqN C4p;[7;=dw^1|/7/#bcBIC[bg)AV5|_2Ϋc$UF2Ϋ2M ϫc\[zq^16* }Wy\57mC,'4~׶鸳{+'UslUS!ErJZ hNs#3FwyXǦ1~gRŶ`>Ac KnI˻cٶl-~Rv"ΝtD<)^F=|NL ,MXC |mCHiid"4Fϑ99k9t#+F7r7}LkEtkpEDb\*3w%xUl؏:,:v.W-uiA\ ގh9IXV\ٕΦ<37α4[ɗ>&T"YIBjٹ+fOoK t9/Г |t_NRp @@+ ~a9l ֘Dp&~a񅂀`C[*k!# $! -!9VƮG<RozuΪO>GYU1ΌG=ḎM7%? <G|+.;[DO=y>=yӼ#^\Ϧ9Ԫ8 A0B^W wDeV [Րop s'B>5#éoo%lbҰ0Z ~6;-H=g~؇w߇:|u쟟: zJqE璤 d 55d>-N5%b}`߃@K-=}l'fm~Q߫ H/+Yˑ=AcueCIJgU51I%:INj3Ж uF[!7:z_σ1@ұ3U^(4 3K{T0v0qIl ؾKL]{44^~h tNCxK~=wBc:Dqc98fЗN%eoIwO>G2^&%dLɸT-u0M5$GnNdR=R5֘O3o,Ǻc]϶r-3Ofꄌtԭ1`P'b>o,po hqK'uo[Ƥ33NaoۆXzhډDt"_l'biBS>\6+nmCۃf텸UG궢бwӎvD;ٶwzu3^ȇ 1IN3:df1͎IX*v :8|9^ x7D~?wjEc!~c{uKNΤu^Wz > ފ kmT؏:}6H:vU eAWu\m so>_Io뎥בt|Ͽ|-Ob 88[ތƁDvb`UvWCuW O0D[ȫpWZa"? O#R/GǭK#6cڞJ؝E'_IH;HctVR]QʷWRS(~!B1tf]q䋆t[ 5tƨ]I%&_*uO pHBrѮw4hgVJ)s] нs{G89 =;4\i&V#`s &Jߠܧov8?6Q#ԈS0;E燦1`xx,ϴco2g>!-x6v(P!5y6vkhH/_"+g+P:^4-qS/›n@?CH~/Nj4dP!$j^h5熪=[XS@'d@!VmҖdm_ʬn-~h~ :1|/f38@?` :qB?YK|W0SIXıy7]1.+% ǖ!~&$w.C54xFdVvـ1ـvjb;wo ~"Z0tӐi pGDmԐRco^),FF:W-ڨu5&Kv/%S#OBᑌjm\]tZZ{⇶!>(Ac^2vdybG2zq~1Ӄ_Иdg9dxHƏ9bߴ$WҠuRC:1|/+?N[.4ӆXΨrǂgum%LuA>$"y#\ 6ZKC;B,?[Y}2,,ñEi pG1AAc1fW~qawmӨB5Y!~B|&ʫB4L1|n)b-Ccf2шߠjhu}_uXc 638*[~c`˜?⭱WʜO5y*e٬sĐO"޷Ϲ ?n.#^EE%{eDda[ƀ4%$ =.:>ыLtj.1 T,Nk*@&l ċ(Uĥ26%f!u|GpWv/m^ڸ8M1zS\eT!뎔l5>-Qq5{ qCw7H:vmbԑWtF&cM6% wcs: c(F))~}㧻`R%BE ?s6_.1.*Ҡ=-#D!FNk7^^2 cvsQhZyjZ^]話 ys &BLpy-$vBf2&MbU}Ac1Crab\b,xjl3 n@S"g-Gc^%'DGl'B97>Ḏ4hU9'j𫖫Jg ×d6/?x m2޿I^8 BXHimO3h0O$mUku@S*B_*Op;fsS!JlW-0qNl5 1qr/4w:¼csS,o96AcIqA ȏ4TS|f3BwXw׉%yo{qZvӂ9w1וc3!h9"i¦i+%ڂ49U^ ve_WdngXlJXAY`',!b;#~h'b5f}%?CD!|ª/VX'VРo`` 7>mCkAc':9,w^?/jvu?RBʶ!^K q 徫$3)cd -f) D9 _"f5L9ZX3w< ᯤc=W{Ǣ^Kac.q/]W /yw!/r{XIǎ;>,v Qh@X߂/ ^DhwsWHY7~mVp5oёv@||X}`֌[i2Oj 5W5j\ӠDHGʧ-:Qi6oޚ1r2(H$” +GG[^s)V xA3X;#3FWGZtakB6CэޢU= ~l .g 2mpȏ{W!0j7MtlK rc& NUcjd] j)YFG{B[å]GAչ%JM3w:7'sml'tk\t['8Jg/Kc֒!.fIf\YRGטPz<Y?1s:b޷Q;4^/4Г ,qD[aui/A_s27/B)gc9zpMu )wpE'kd~A^z]pB(t6Q^Av:HjMS\B"uin_bx2f+W"pm*[V$ ' ֎;h6M>x=uU,o)6^2.2YH0I8)i?LɚUU39J43\_*+LH Ke{4RtZ g]Kl 6s 7% p>})uIQ9;WDWJ4"q"k)R1yTex';%.6mv3kY]dߍk:֙ߟʶZ vЄ6,Xyq-k_qt4tttaPtf!ttצۦ٦PDAÛA<>Wmz~iW+5&Wgq1/|HJ-YQIPB鈷 \ȼH-Scx/BijHUWTjXT! /j?1Ψ'D| ̶8OOG1AsB;yo^K (ny Ft῵dIK֏ZLK֗?hAKiZY%s8=$E %ԒRK2k7e,SK2k<—QY 5>:%Pcgُt:Gn-?c~/w=c"YW^YMB*k{aeύAƬyNV~2f䗈?Krנ!m"'y*rH1*' cf`Б7^|ʛc9 #c3.<W#H:qY/U[ cruwb? Y7ַ}'jZcҢsӴ1'j:α&|X22}, ZyGI:v2Ι7Äv&jV&8SqMsW3 {v[Mu M_K?io# 1:#a;ۅ0v'hО=M)AӔi-]c" KdMKdLKd\LKdl>&fgY:@>N8h!&H;ᎳAڂ_tkh s/ C=pt @mKğ8JxAXCc>goDћ{0 3i &]FƸ kuϪ;9RIuOH$jnMڧNpM]t]vuF\a>3 =ODvA{O"Dx$BIAcw߆ ۉc ##L'*B< 38݌%#t6;At6Ffތn'fkiS^3;+@`GlK4BȆh ͷ~;>*41|c6uj~ h fl\G%Yc: 0)ӄ4K+0d /1Y2ΪLXuFZ% c\7e~^imIK+zIӴb7iZKjҊqm7jZ _"Y0 lUkb[6@V/m.]B|4LKkE͊9\E^ݎx0fȵbҚ+~V3P<xx/=ަx1=ަ7=5m}WjpDaiͶ/%9L #6l۞d?MH~B|JW w@#a+Z.Gƥ/m6lAceO. )"ުt%v:[K`߬#Ob-?үrb)D+҆+][/JyV X-YJe2N+SXzJI9G!vϤGbXߏhWuᡌPY=<×x?\ pW!zлT&:4nnB2yM/yVkXǍg12hp8D<8%[#P}BIp% b"%<;Uk.iyoWhosUvWf]V*Bh/FfAH6YfyDfd5$>pև3Z{۬ TuY[k?]kQc?{W"~eEۘy!?ۂqfm犆a~h j-.NV{cj0n+j7;:m<ĵav2N10TCRXற,dmP濠ccΚm<"35qQ NC' cɰ5v c#k2:b_R3U Y7tv}3ͅAX>GL~ ncc imF)з-۪G\n޳ Xbg_!dr|nOq8^n_Y>9f,-StppQUD vo3uڦ(YW*[N#>EN݄>\b*l+5dȾ_uZmI&tt/$EAn4 wM:45f. ] W~aؗ%ɌKs(t4'?m )mtl e.E|K m X6(4hD5\,(0m vK4Vbv ¾-H!(/L6ip}@2O@FWܒg}&|8h!ƱGЮ9 ٵSaq'(kq~84O?YX1w7B%ѶOŧfI#tѹqι܁p;Xzhq+1wr,6Y^sG{P=w4vLrA4ב`9r~mpm3@ ~#8#2>k MHe]Z/l&*)(%\2*̼(ʊQi߅8NL MA6mtY?A<[dVgDEUVԗVъ*ZQ_ZQE+hE}iEC+`"\˸,:"j$Jb9 ѶZvnƳ,}^rw!dDCd^2"&2n/7qȸۯdܤ$0@{ipI;dp--TrqkAhv^f6QC!># Dڇ Mp^ܠdGu me]/Y'0-Wf\g9 C7yI.m'x&Zץ9by!n$ qrč%yS3[V@F+ȓi CFb\ 8ܶGW LqmHϠ$@e`QDN,]d<#iӬ4"ڛIw@v~QDj,'FbdS2I><9fȈUݨeޝ͹pKɘZ[ND ^{!أ%!< tcc/YFokx9E7K5 G#ےp%ᚈ$G4/TVeW{::kt>mp_AawtlT۞C=\lo3:z\xꃟAh|@ұQ}q̔&.1pM>3qh2*a=XaqN~fmB cz"Lvij]a%)V͂m;@B% tی`嶅[r~E![{G-i$JbŰs sp$ag_BO:W0G|;PYe. m"Vٽ4g{dW!6^ YfIbG7 :{0Cd&f4dӥ~8ąS %72"BK2~!ݼڃ<\ d!vOgx<׎Ph+ϲ\hi">SB>ӡa~aa#P;p s\[+6;E-c%_vw#$ؘ<VvhvK4VY[8m)$O/8L""$O/'x]/Oa /5 )p:,!W,҃k7Ld,1Z䳆"1'2\q#$26#p5~qZcQI$U^1RTi6BIdpsi74/Iw˔խym=f)"6~98bek,MKӬ >xÌtMPTDZ}/+cђCj*gfHPmv;7CuNUvv~*W|y*C,: b۬J@2>s\r~WapR =囲2_ߔ.ߔ)ߔLt7e7e7e~|SΒ|q={/B^ *0Ok:fN7bnCNq2jWFc&,ry8ۋׁ6%ؖ]72"&!"K6 Y-kY.mKYTyBUč4βkA0d7ﲌE^ i">O@>VΗ{ =䌳4_#pqZNk 7J= /ٖ=.`GK0C~qRYi"~ | |>TS>*ooT_ )EKÇh / C4|4|Oc+Lb<KOYRhy:J#ݧVHb<ChShy& k'SvIGV?*tl ϻʇѱ:;oY\b᫺,>~5,Kwu,JRYE{uC{xwf,)0nI<ࣀ43)bsE7Kx]~U7~}K?J_UY_o*ү҇N ?!$Y!*aԇOyYn|&M޸ ߃߿_~~~{~SEu7类]~} p$ ( 5;HYd+K[fMw~=:Ӱu|+ ~+O9%醯;9%醯;sݾ ?M8' ۖd,7'p?\wL oŸвղp;?`n6*qVbvv~Erm, 1|}Olj[1D*On8&ÎΒv<٘bKKK^ ]```[AX@؀ jx0}}50;e &cmle~#5tKIOd,ZҖ>5$;4dټz { 0#i-ͩpHFda_謠N,dvK[5 F@חzTQ&Qop9G}G 8,ohUԣ~G{IH$]TM%ޒn""n/IwtIIz| @? b,Z@/%(@ӗ:#, G4ݽFQ2@GI@.[@324p,D8~u 1F ^R^C=f VD=z7h/ Tgytq8@ut; t:M\_D$밀#݉aÀ78؜[=IZ"I!]\aoLy' %b)h1\:ϥr8*kڽf7QA wgv# _ !cYu@ t1Cn /I˨2*]GQ9ޣrȨ2*kT.CF?%c-aꑊ^uk8WLֱf8x\8@t䛲۲k%%_%_~/,,kɷe7e7?|>XNoϷ G|{YT؁g!,%B<  t['ZY#> G 'Y4%eWJ'$dY>{0 ٥}A ШC.p/eЧ}`5@DzF N"D2@Fdf:~/+K,;hq;@@X`U#_"4l ntBgVβzƀcs->t-95 ^q #thxlBFp 67WWgDlD{X.E=l,qyLg0$hԅ -TE$rVO6ЋV1"kouT+%veO,.e7n6h.ZY.\k]h]N#tEJOX'kpv UG'H#9eGX%oӱ@L:B'ְ'zBRsu8Ձ a[Ap H%~Jb&T v>X uE"@ Q[-+n?v>,kC>v[ Besm? ph>Fzv^eD dȩeua*`42`h϶"NFPe{%bݓ怈9apň"̻ceG"i!|t-^2X2t>ljO5/·Lc:)??5FӑU*z+VD(P~_߀zAp0ph]V]ʰ&-+ZfYnYYXL*ٕa#H-O=N #iNY_`gfPϧd̲:Уm 3#}'Z_)ei|+bߊس-TYŞb!D%*b"!]]]ty._.߀.k@N^: o%E,E\V#F1_)1Nckf;@TЯQYtTV5*sFeFeEFeN:*{TVEGe|'=+A={<7@ָߠr:<{kC_> pt8-$[$xme%>>P:1!-{m)I(0uLc ineN#xP]Y++ҕqЕUW[WP]2^~D?^}׉~D?D?^~D?>&z6!fM[c'ѭ uYkbbMeM[;:k0?>QXݐma\vdS$2;tv[(xIR})P >UKKRߪSa4)kFu"w\6\. JYV?i"A[c O4Pۙx~`5#F2=;b"&n,q-'C~tA?\p1/6\3[ł9![{zY/" Jʜa7a[V7rzþEI3&_ϖ_ϖYt4YbD@ ptg;䕐,6uW؃F6>YNyqJ3M]C Iv|rW)Q 89@THVI}.HX'\PQX58! :v}a0ä`hk>i2tO=I ʞucy']&IO{T6=*OkרllQuT6sTwqB,{"vlB,||33Xt0@zBXt,Kxko'[ б/0;zD{sqťֱ[#` 3:kL]"i>W6]TrdR z(*Nppm!5PB49[Ga*| ^}kӞ=^"["[ڪݪ5ݪVVVmje ѐ!SuK-/^lA[ƻ95`e~lF *ǭmoA8;i >Hbk%ɬSzq!|,Pf$l I|$uI|\&1OćN=oħNs?ʪ8}ʩyTpD'++1NP7uzzA j ;HŚ5ǹaulN-/=i=)d\=:[ZN^osغ|YUʠ6fi 0isWc+SSO9IFۧz:УMp F1g\u=ȌHP Pű|Y(FoѪ=X 4Ym .N^b?"Yk[Cd{1-u(FS,y zt9%mnK>\$^WVXV-q5=\t[:Ntzz_c'6DZcX+x=;OSn:Уmݶ.Q>l]p>X:pl'8h[6,,YZ6,ƕe#ece9ɞ3b\WM~&fnD ٳ7}PNt[\j:}v*{tUFgGgM::%FgM2:ktVEFg=:)z_)nS>ŭMGg>+^z{$993+l:B'V1 ?˰+ L9=T .CCՇ1Pmbp>w &C}  g7ej ;jjoSK_߀SKyv7¦D{8zL"k4D%xȲe6Fe  /I}KUBqH $]%HZN@9Ybмg?^0ߨG3hߨm<rԃǣQocGbg7"kdD$ 2!<:<|A V>";`yq/Нق#13VﺮxWvMVn>Qmz.(99ˠQ.#4u Ỳee<..bv_.?gOQJkm-Y G݈4KA5Al:ZQ&N&7tFdn1G,[ $J6_h[$]{m'^O5 p4G>jLck=8@ g{[_%3> O(&hÈt ecXٽ41@"*yq~]ym 6ɞ۽΀Jl J04Ш`6)ԬFqFԋEl+VhXFda+h,ή9)82%hDyutUt7knv ڞ:, ;#f?K94<>8@el:m]HLG7vゎl};lFd涕x26xuzRe }4rN8 ;f6a(ޠ 4SX@gguT ڬOH1R/0AQ@?kbd!EJмWk0 )Hn|FBo% basg>^NH^̶IQ2#%Ʌ=fYpfX΂so1^bWJ Q!ui..QWb϶Up[:Nпg:>qo V zzz +z{z?ZoO]o5U tzo_ zyN7Sv: &ѣYKY>6Ә gAsA _ .kh;]t.FDz) P@'YCYC_Pl?J7鵆Bv zzzgރl0! glW12ƳYxVm<=g׷ &CQ{uiZ#7&z7Q^j[5 gyu-Ժ>;$ Z9yB絁r:>:Yf2}ٻ e9BtQA.hy\,~ 1 9iR1MCljlg[gSPerYGq[06u:Xc؃^L1#ڙ,0{0qOmDH0ps7Æ'D;p}t .³Og6"ktDг,^ B4k@ϯA۠ V zzz +К[jؼОg5?O%'p9KMW@-<CF4qn 7WoWU H"kL:۽N6|jF0:O?m$y!2O/tfe-8O#/i7b)H"_Ě^__]*ސ/+5_Ddq""nm䧞}XЋ-S꺲`l5橇FCpx^[A>+݂pm7k* 4#:* F] ?QD;t:[XCgf^h,#4u Cǯ9K\ hK?F ^5Z5BQP/BQݽ!(z/y( @G( \2F h$&q-L F J: MV8:MLZ ~8@@_S^)ʔW)o%Ny=啘V)*S^)|Lyȸ;wKj+ tf2"6A#%c16uz>^,Ґ S75/=.<4J4{ߑtF$]t'n58ӹ jF`$=-Q5ȴ2K so5Q58%IcIGD$mF%igy-i8 zWI @&0z c,oHYv y0 3@`xIz$]DM$^n*颒oIWtIH _>i" c4^eDlnL X@+htIt{IJ%DU$^"&nzk$`%![̋3F ~# *, y}3"64xX^˒ִu0@8'Eu:v^ S9ږ8G=@N#/ЗNw):_:TttnStNKA?Q!1T=z~ޯYuLKP@k.^]t K.qY.&?n8@cc}_`1ȷA5[Ga?ԣ8ˈ6@I!# $҆xBJin4?]X4ėE:=:=:=NIz}#gHzI?ȥ-:&κB< Vu o r iK\ n3a>TO,6Y?G$Fg[`Sm_uD$cSr< 갆GˬDK+3ch櫋\Hc]"<V,fk>a ONnIS.BMAp nXPn/N-`y,"8<zS9e\2Gu:G9e2Gd2GΏ9rDž8{řTq旊3US5E ^ Ok(~H4w{zCRdFdpӘ^)RM wu '',[GL[Lѝynf89,D#ur 'PF-L>QVcƼXݜ{6T}~z$zM5@#kG H Qg!B벆Gǁ*f?o~0FCӎt WrssCFdʹ9ʹ^V-VNo__^[ޯ/~}Apoũ2KCS50PqV,Ѧub4}'OwLf ɖs$Ipߠ5DDȩH!o z>~ą0]OYC :odB8O@6#2!̄| u';P~lت8 d*Nqۋz<2>>mQt 8,}{@Dk>꒣.>F hdOլS(7z\(Ds0NBm60x:^> l:p7u7@Yb8`> ؖx>r#F@ t$bX-;=H`(h;#vdHm_l,6 ojwY== m0@c Qiʓ}XȖd#F:흎Kr#8Lt=B<W\i/5$`u6нߠaN#_g%wH9&!oI,[@tqs-q$]iGw=/ ,X-@oMk=m ^֥=P,{zgg04:::+t+k'\a\˒^q!a\.<ƵKqMkM㜟2EJ\f# vIȈmCvYrb:c ^QŐZE/Gmu׺/ F4QAm5U~2Л rck:@ |,բ 䖙Gq+E#`sBo%ΞA_zθf ]ǚ6Z?gxF҉k)#5}M#3r8d>:c_9JΦ[![^[]u+[VJ2k+9d+9NrKN- WnI$*,C䖌O X^Ctܒ QyGm]eoլOz=uU0 LcC:3yc0Tqٍ$Vՠa |-9_7xsB'=xVIM/̊!P;~F quD\%WlWlDW"n^W@X8O 8>aqf㨠+P:ˢɲ{Qm7 cT]j,ga\2q9ױϳ|NH/45%IW)l !:un=D5D5D:D[!:? +UNtXhpێ`0 3FCߠqa½ߠjBަ57XnuBou7jI+-mZCߠZzS&-Ztm80Nw\z8#P|I0j+%;]t+誠tuоYe͖e͒eX֬x]>^O1=^5^[x]:^}IW<6k)x~`_o?`7op>^}k:u.>< נSϙT oOGK(*OݼE-a8VBoMJojV)xzzZi] ԏZB]ltꗉz29D>L,KͅbL={` tֵ-)U^ /;ʓUy*OV1=Ҟ=ٴhC}[}OVɟsQh7̦q5zTZFGw"Y gZ">- U2c-'A5H BCE#Wiҙa]<̻8y>KqL ^xo(c¥cOV#>S\j͍jǀs\,JxNF[/vؙߋ؏7NuS^xmZ =ǰUI1LÕ{6:L T%˒Ypݿ'C8y.χ]K^+nbT( 8fݞ]i دUc*G4?zFS䠼OJՏ!͒qt~}?~?~?\z}?^Ϣ~v~V~'W*E28"8Wk;0[YmټZCށwrk7x!ΊCpӯCxSSqS4_8g1Q9aBMu9)^;ƎϨQUݐ.bdڐOיƨ&tkydTW}XCH魥NϰXpF#^Ұe7^D YD,YD""b"bC]㵈X6b] >nl8rO|9%[觡#!ڰo׹BoOϷȇ|[SE>D%-"" [d^4zdI̛VTi$qƵH}sP?]> YDh_8،#?Cf0=bޞTkTfɲf˲f5C5K5뽬YYe͖e͒eX|_{~ ;K<'uiui-_2|_izu/9e=2' e}^o?k &}[zb)_+c4l^/0ދ(RR9*R7 T4L/XU*N+Z/` /WZNu_`J(<)ό]h X8F/tٷ5tt/''?Тע^ZjQ-RU֥Ei -E9h;Յzd8< &/6_wVg/P_u {wRTn?jjQ->1;U֥ELvhH/-*E۩.Bf,e05pwuJyRƁ\CckX`хU?-;C1lV0dˌ X*]δzee"0 r]ͅ^X <+V!^F@uJױvlQkj2)R~mg 8qVE6Qy;ہKDL=n%gGMyL3JzYe4kttN魢Pl>,Ϝv[8&-|5S|`Lx-W̔Fe{<ؗϔׁ|LiD 2`oOP cLaWv`]tN7yZqۈ~2t,8T#a7vѮQ thv@^-'kc㲯ZaX*v/Z`WfF 60$pV⡑H(b#0zxqdLW< ki{7':5=_rD3ga5*kTsXli2,6e$hcߑNݿmia3cͳjT֘zZo|tvS\ SmD Ra#_o~c<m); T֑͵0f%lO X/iLQ-J2J2TI*|+T%$$[d%Y}v]l._.y3*6:X21*S\ ImD =Wdek6ͮWn(ԝ$՜ioxbHA쒾=vI {;ͯ~%~%~%++9+$`++8{\a`t knU`r.9`Al+o|6: ضf3 {~͘Z`w4"y6iS{6-]vۭtҦn÷퐶趯L3] YPee6^;ʎ̨15 2#xmΔ<)8#QK4X$ryBb[V8 tب T`$4`_CRE.nnvv|˔!eH!IK>GB|U†@gё[qo;!A+p7[{ydAta %@\5sXCsJo-~hrMgF%$}\Tͨ1`5sߧӵs2NUj`Ɉ:/%6T ~q7}LIxڌ$J$<1"AU3f!l\sL2_Zl!6t|.! Nw4&15f}1hLi49Иuib$Y15XBcjL{1Scg\QCղ }+tjN魤)i }1#ܼ/wNFtauxtj='1C#ם[S\EtWF%$}*P0V'Q<;c}32$۪;zލr; gYcV3%ztz)VVʰ5ZTa\jz cj_p_(Ѱw(~Z Xa_b_=o{9ל8w+s~N13f #&SvւKcʸ{dLYwJou)똉W ˜!]BjoK^aO!S5C# :uFWw~.io0x.C6"ɟ*:5وR7*k4uTWM68lK'>~P3ǀe =Q b #vr^/yZ泋 T_jsK`0Kq%7;TN֑tjh /;$9S#KSjtӤ;q'fq/{VzY,*,ZC[Y-'tϟmZ2dX2YA`}uv ~/i?4a3 Mk,* y{9nrӅrׅr{/kZ(rӅr-PnrׅrӅr\([x$N~)%+Y(JFe+h8I]aNwT *z- KΘQ&$7[{Ywg}z \{VW̤ /;\`:X`m``_`:uvsͬpajb?:<ö>| qX0u a9{`v (]vT6"*_q[8@ΆCCtѝ?f9a/.!xOPvTQ:`/o$r#~!~=sI2CLt/ |ϯoOA>|]i)m>a].u)q[>s3 z K};tSzVu{b[/UݝNxm'8")$Gm?R/?˄y17&98g z]]vQY#ij_>5vD6f#RƔ$ӊh˺5fƌ3[cF4f+4јDcJИrBBc`-v6lvxFe3Ɂ983-1ؽA7. )P~Bz{$s-;[CE#֞|zз6O.Aww `}k/9fx/c%G~ T!O[⼤2cqajv0mwv@q*gF0V]Cׂ&bqX{-aTׁ|Y]1"9cXޘq^t,1ߴ͌~X:EeBogd%+)Ȁ]_ad߻u1>F}>FG˲hMvԏR!,?֌vΪ<Ա=&gz y{p,1`?߭,* sO'Z`GaTH4F:lKU&IbD 2`HXVva鰫"UQVaT(jS7-UT=`]<.v={ZaThm/Cv]q={&?`=(''ʎ̨1fuUPp:j'>ҒQHA*ŕ lIڴ4ixߚdCFƺۓ- GoxPicQ7_F -[6dx¤$ ht\ǺEUvEbP$igC7a`FO Jœ7k'15d dfPnVg_Mq3V<"ԍ1Fta}Ïӯ|9#|N◐30 k XWasBD*k4Ǵj&lδq,THAkXj|[%g9SK>u^;ʎ̨KǍ2'Ɇ1ŵvo0|gkp4؈eA5e>Kh@:SgiTHa_:Ϯ-.r3K| ev %IҞ*^oi/i[#H{ e]v/NpDӷv -?`fiNL agvؙl.cz(|z3^?wr!͈d>k*E"xZj> ;0OtKsvo0; [p /# aΏ7yƭC 4;K)Ȁ?`#5`#!0y;;0ƌy%fXm 1ŵ^v@:--8 ! xt{hPz5@mE3rm<1"y>'?5 |F`%{&ѳ˅Rxք +@½&Klr~ŤS!᫒]hᲃ;;O3O̓&<):O;OΓ&= ~|=ۣnMh5v=.](ԅk;vGy+ϲ/ξŀm7EڞVvy+Vv:.ō^$1?JvMv"śPƂ##іZɤ ^__5_1_~B mB߈lm3 Ʒa?.!2IXe"oVybo&VmC^{*[*+&1)ȀnSY3żYcj"qzvSfigyIA^5أ55lK.Cv;l+ɤ /{ yR茡 -N$I찳Ebi7AO \(N&h[>M>C>W7^ޞ{{qh{jh?.qI؛f&ap%%(yW:ظ7P$w+M=$l6\ M2 {vH،Q 1 w~b*aj6{A6&l>~Ff[ H S?o,Qog}CoV &I T7+L Ra lN9! :8Z`#'f%`MsRR}YIiroݗNJt[?…&iwRĀ [TIJ&q=Vnt*]>UԞ=;."MZѺFsmZ/FF7>|[f@N&yM,mX}u0)m.veHUwb}s' ;Wݾ~EK#Q] a| vei?j{3IA^3IXJF$)$Y MLrතI2ud޳C"` ?Aܨ  R'{RJ.x)m;,W=R#$SaήSvBaqڭ\1apS-;& ` a<aVɆrSE*iI߲04^_gH}$+IzJ}%1ؕ%RV+ɎZJRb%)Vޕ;<*'s!W厳i3ӯS5%ѧ$GU. e~E.ǐGgU}~UTE L?A&C "RߑžHBblP6@bX #$ " R׀X=4Qvý}7߄xπp?Bnb'nZN AlEah^|{  AL 2`[倍BP0wj% p jKUɂt8)P֪Z " /-w  ppgV` [ eDݤRk sZ[)fF Vho*aI..H5xo [âaGH]a y]8l],qHyÆ`#`[p f͎:(; @Hmu77aO3`mgGHo^W˾V^XN.VՎvg OnTeX+Ǩ*H+T1 #Ug5Fm$Ϊ;Ȥ [Z=`m *"?a"8Ȥ I2om{bԲd(vzt^,ѶT]Dvm6%cn7eJHirRUЋ!U6 -Res1[nLȤHbAEI1G@o>pD JAoXPs\hQ =xPmEc"cW+mvKzrML.=r[ bB$ZĤYM&d*/쬰®/쪰&~GaAM5{`Vy _՟7|j?(<0.$Tpȅ‚tlVI8+@NT %'G"RgYߖque!|9ʺ|k|Be!r9'(୾ Hm O gH q%bυ'>D%Pv3Z+^m r|l98y4 s7sW^9ө}3 ^TDW[IL+/x}BxL賖gx7 CrCj{\K]ٜ/UP]{Bza/RulelVu^K%+~ /i& c2.톢8Ҟg@2gH/tKlq–}CW@9Zjǣme>N]r{]@\7E.`!@g~`Kd1ߎG.&O,Lx/j:ƓL $_h;sWv+"vf ܋3CR.բ$1mɽ߁p X~;'ŲVX q|8iv];yi {N|RE(3v_q`ٱ3<3΁\$9Śd}ߵDR_!5V Fu`ĊHT:=tUZu^dR'?`/- F 22.XfBۼ:[j۬PG.2)Ȁ}~e ¶9syZ \8E"E%̂ZPINP; 4%63 {Mq-/`7'\gE rꄳ7˫n[h+hIA>iۜBRʴ ]!Wh[Lt3βi[0 [ Ta|Y'ؚ 7Ӌeq4rRm=+ =B5I ւ_Ĝpi {m: b& J$i3& p$m$vVx=/Y߳^'r\/ؕTh.x =vDn+i+JJZvJ?dRl-o?`[I={f滯B {0=(oZY8IA^:hߗQ+mgZI¥`Qn`72HiB+@7Þ$$ m,Ib -5&#v&回BP$A]M8IJ#-2)ȀݟenUv׹߹unWCv7 ˄bأ^[Z+ B34nR6 &[@^eܞpmTڂq2߄=yπ$(ҼϤ`nwn7]vv׹dngnO]v5- UM>pĈsA ~E&ԔԒ|R]RSRJMJuJg+d+5e+5mN@nM椵]{F.:%E2' -zټg@zw2yQNadj1bG ; w 'f7ۅ"XAm dR _-eA\$Y<آFƬUcR$V/o ΢`I*E*F;I>ŅV]I* ֳIK]oO; FUTؕE-??M؍}`_+IJRޕ$JRt%)JRt%ɲg%iYIʯ~hmmL>VW:t*Gz -jQ^h0B_*/g/g֗Yߗ˙r_/g{`7v{av{a7]v{`wvשr$˩rʪZLZL*c1rb1=UTZ,Xm5e Cn4@s/5pIA*gM,]SƯ5_ks:u)ZS)YS)uޥh UY q.}W^EJAfHջcd9\h& ϱx˱8˱xs,r,r,޿{`6b]/ox-8K"4,^v+셰M&| e_ >t_w_Y׳oY ÊCIrtXaaaGG)GuJÒut c&X/]]KV}+|+db<&d$ѵPdzD@UИ i> v x`A&d"T7R3?oI>-=33o3_܏98c R?nJz }%-+JWjVK ƉL 2`_' 7El'=4=Sv2OqɄrsOq$qfmd\8e]+َ'K{߄xπ hH! &TlcD;8]-$W (.BomgH$lK;0?la\8Eb4×' D~mȀݱ=,~}C2C20IE.x/#fvM؃&*'V8UZ69U&6TslCNũҪũ 8U Ȁ=S`/=_]aO=_Saw=K`O=mAk ԹipDҨv& ,}=R*D¾$>ۓTٓwORtOtO=I=I=|$$$ag'nv|3,mpEB6P&B=ބesH$zIOUZoTS?U%~j=SǞ$ؓIPg jg un)<ө Z8WMu<OBh1}jTgAȧ ~㍳N&`&lV/Dj6:mb4`]ߝ"vwma^~{bwC{fl+c[z`ýF!s\oypL& %ɦ-SvW& nh)-Z.r]7lkɤ /K>V>\$Dr')t cɤ z`m's^/쩰^/쥰^7l`u'8[n{F.#ۅfY1W07agޛ8ttlx94+u>{q6Eb֠  .q[6.dR*fxfGA,)-F.C<Н"؜|*MR2`7$6X;6"`3a3#[+AU;q˅Y{acUBb[`;]ia7\0"gaL5X㊹=yϠ&h;[۽,dO^nmmcC;XxL~/mס & dfU2^8!z!5\8b-5ZUjGk(IG&ymYzS,>a$ۅ۠Hأl)݅VZ#t_r{RlK5*2:5)`'O_I{oyL 2`O-5j'm͒Q7lH\eI F8=\h"l+WȤ öq`wKg6p PoR&qO+p?؟ΝmJG" OдX 6" 9j"IlC " dvʎmmP<*y/~Up~j$fMj tPv)5D O6-60 G~P<\>\ 37d}K]BnA8 'e:cE@ tF_%TG_Mr zzu"G/0:1)ֱ[MF:r=&nY" ]u dD$՛ѥ2k5D#,gY ir3f5weX`:5iN?sBGt7qQWMJG@}w(/ݙ";?/T"1 +3UhgaqjGn ǾEN }hR+x$m\ SSei@yS@ x_ rɊ^撍6r]hu߱fir#mv k2mťA4MTn!bO fqs8%[c#Qՠd-]{ՐĢdSfQjR'hK,_paXd#!B] 72},+jR /̹j1ZggzwCjȌzэ\ S?ym`ƻ wM%+~l`l`uH!Y@hXg~A'ޢLAQ% }-Dʔių)c^ɖ-[ | 8=DKj1CdfZ8z,̠+:-LC.NtҰ=w+,E^Cd$M-m$(~ rۭM|`/h $$Rƣ~Ѭh\-D wMQ2U^@pH 5a5R|n]zqћ=ĹXwk/V~3vɎ>(cqxM/Ȯ>AM1+^)m;%$^2l"+`mO XAiksGZC${hVDe,2Zll$-^eDRH-ܱe+}[F&/,l8XDX>"MCަL^m E"MEtr)nkF$qұI9 8{\??61֡|d#?6@u y0bd73TFwCw`+i ]bKʼn;v!MZ%geЀ9?BdRؔOhM]ū&Sv|az9_@JE| Y+(P.jV#؈s"Vi.j0 r)nsR&R[:gwd:> 96K5+h@[I9?NҭT"lx S9L? %[\D@o~m9B$[F'rJ),EjlxCd:{S"T#3p和IE,f]!V/j`<}CT?Wԫ 0ta+j r]hcgNk |ӱ˺݊V;91]]Q:ucfH^44xG )| =Y!^}K8qZ2kM݄fl$zr 3+cY8ȥ0I)P'8H vD7PTk{IS\s`u[-28;3R(}(>!Rkx8qXk|I`]5Rh\J,'R^aSȏ\>P:(?⾵2Vڣ 5o†Ϊ UB.X&|&[Cԩo|ԩo7u>o7uʛ:U_KԿ_ՏZm]Gfkf$to(թ^97iQ*8 IB-8B'FBU1Fk^.uMa^A1.yOz=3Wᇮڥg͸D|Sρhb>wm: ̶="ueI$Z`襐N@P,3D0Ga(,o6Q "oߣ> .GauSFQI(*yAFa2\UIj\fTێ2;Jb3H[5P (֐$qfB]Ʉq[Q`2+/Ra[j`\ VyRWPT KUU[}gX%P.ߵZeӲ倨3 납OӶ[Br]FmFH6lBvj͠SFŧxV\G2]qù(xyQ To(U5=Q2|C55,S~=UG+^g*ELV2gސX>ɥ0x%f@ X#P1jBn=1;@ kKDwML1(13wGI2λIvTNO(&A^샓\ >$TAQ (Gw!J*q R/mX-*UMLHgt>T i\ 3gUxy8cEN:3ǫ"sOA= ZCf+߯`#]w_bFSrF&": H!|MuOgKY8`[hhnchbgeZ!3 \ . )dxDڑ <3%65&":pZ@fIS$:⯷%z">FTv>iL1*>iP6mɤ (t ")66H䙞HuشBuTwo2GҸt}K5"/R-Q*x!jvF @TPE) X vGJEr- /`#D{\r)ol\'N?N7>jJjK?/ヾx`}k)|XQ W4йNR{2QXÚX.[T552ޭ2؉LIyYsFv ח!R_:x;5띕YtWCf}Y~zˎ j~ &cr-WMy`#~v~^t.ݏKP7xt?ECt?F/ JQ}_S *Gi7m3d!,^( (D,X$VSOYt=L̺ORPYg$p.[K+Ϛ1?qrXqPM3)Aq\"8FY ”jvǬg2ޭhkYG=TN.Q.]ȖOpGL+-F"VXIdo?& ~}|HG(Db.f9Z\@guj6i)=LWYd7 [E{&pw]U.yn;|t!.~M&T2ALt"N_zwɎ!L^ A`>;ӼhBtsw d݅l$.sw9ydTS2q0wox7s"TE\lM0| (U?uJV:fS]lDvJB1gUeko1w[Q.wd U>lH-f,?[Rפ7pl9(9oM`R\h7"E'~nȥ| [w8Gt[biT#|FIHdY a~jyGΘw.GJMlQ7%rDq dH4"10{5XS"87j[amK57h@II'58>Z3P\cUnfQP#XTXh@(߿C=s >\VX!Bۖ O[fʽn26hRG"۠Cd_[ٿ:`2+f^~W)S/CjgЀ6ѾC⦵6Pʦt3݊>8TT^֐M"\ +i!Q n; ﶿid#1"mqMU96oDJGh G?G|~S9)߯<5bɠJ#ߢRPxlѸT!C:z !C(B !J!gUu,b,c e;*< nE"e:v W(P )D8 kyVG YmKd# 4\g:eu$LNH q)LnU~t ֔ӆOW <8U/9Ҿ5N.yL_sMϬyXalKRT9!qVE 4b᜖RHF>dمz%#?gw>4 $y)-etk*j͕Tca R ˇ(FQvͲ(}nZRYiD.q  KW:u|}ܞe8ls}fM؛$4MF6bs=bQCu3.~cT{@()H=5lեq{J.y^ićra>J`)~נy\LQF̐_/$r) np[;-[K w+fϛ5eMTGIR5^C?i|_-j-׷ȿL]EME[T[ԞoѐoQoQ$v[…Ί;憀jvRjD%;~;k>5Ydgq@!+u|" &e7to(s u9Fwts^c㟠+cx!# ˉiv!]!x.Ոn4dFL!2*Qr=O~@c̊"ŭ*/9_=FBK ( QW)D 9noY&8\ES&e%gр,ÐZT/w>0ŗ|r,x`TDN6Y/cD"[dK5kmPKa^u["_[xO2{z渍s|)xNG|Mhx9 )BGJ7\$Ԧ]>V rԦ=hhhCd`_f@ĊI/}d#qEYPTCÐao2u9D@ ­!VO [@d#Ѵ(2 P*9D > )(PWNh">5 ~͸N |0njwЮC3aIy?]ZzZ}? B~vy?&q6:Z!huX.Y-tPdx෱9/ȗU*ӯUZe?tiʴwi]eڳtYe2*sli vOZZ #~@߈C~&竌 MV¼^֘[xثЧfVk:u{{^8$:93۬oFSmοC,>&Kdk%dCpldh^Hy`GY⾣Ek_`[Dv: `mdŷT>!C&hg Xda2lTd%WK5" hMrK<~ ?7/S'֕v޲ہ{ڙy z4A& HSu^U%d#N^>-5odY2?QKHa9rh^&d%l8 չ7Ú  o5>VՉ+ZO ))Vo?hHR/n KEV?W~l *k(9>-rF&vYr~HE:0 Bu?}gC6MdaCj p]r"$#:_E$t#:=#:L&{Y 8lH"p.d#qyw?u{`q)L~2O ?s&fzIzZ}wɂT/,Λ<~-RBK@ iY'YDbӬSwȞ+ .u5u~.6g:LjD`7UӁ{. wVƧT)~8iTS+‰0W+DvCyt%8YG-| 7@xתyLv"/szs$sx!T_*®̤jXUnEe }WvR7G6r)nCҺXi\u ^ln@Њ͍5z..uMXЊmn ai7_]7z3\e]ovyכ&Mq =.$*C:=թ`Kq9YdxSD0GQߢߢ~zoQ[?yAQ|*͎> ֚ID)ccsH-ch@fվR2L76݊<+d ໱~Z="ȭKa[{s>7X qI9ԅA6S ;:؞K5" (=C$֊ӟu3g+ޫ w[Y~9Qx |D)!RWp ?ǀ?vsP v}Xr)L[E(= #ChHL-g-"?Th@alm T*?*OSe_J>V;@;1m5 :(Sojt|=Bg?+Rܼ־/ 5 b)tvۛ|݊4'.1g J!&iװ OQ_}qދ/rɂȫHpg("8Vs6[u&,=GY-ցsl$SMw?DOj<B.~~~I[2˦ydf to|݊:0p;yq;T#<`"hX4>Ҥ !NJٮ~8Jf_ecACӁW;(gz#GI|EMKOXWI~ Bн$A[p)u[=Ⳙ9e$s|gϤs|7/1k9^;mX+p-~|ղÑTɫ%JՒFW-M+f3=,s[T&P5N68mrg|QRX k%el\*>[(/QJ ځ&H/w0G-qQ`#$+c oks5DSά,xT@(IN]!q# *qEVJyVk͢qEV8R굪TYU*תr8[ иu穪Ɠj|GZ%7Ю\.,j̲ɚE6Y<,|_lZljMV-&3bVW< +q/E w2<*2xUY; ײ^k~OB *#z "&Bn֦ eT/GeS fZUZk֚jY_ǬŬUŬUہK/'|l|_ |= xN0 1ӭ,rGI6]; ÷rCjN0\s^0|[ѫ153Gz/9F"^YfwQ;h)U]9H$$l_L@9Ht9HT9H_ t9duB-D2iG!,tM7Y Y n}7Y!;ު'R IMdFb}8XZ[U}B$? |x?6b?Ac?@8w+ҵR\䳮b]FRkU,]Uƻt]U*]U*]W*KV!79twwZ{w]x9>d_s86d?L'd#ѯugq?^;]h@i\C4>E[5>_TWS5>TO;o9с>}W1A(Ӛls 8 kM]4gwJ.Lp!ri8{\2U!d2} p9j$S,7!S&gܯX5Ázwc{ ,K:8](>"3U;IT. 5W8=&mﴊ2Sn=Qȕe:mP5]BAKث:,;@(哅l$FpۅfIdg 2inR ~cK]ءoxءol7v7cu/o0&7!6K{dtZaP;oZ~_BrɂٛSh#8 : àHuYeta֠Bn=vYt˫|_2wF-zB!F.fTS+%mt>b]bE6WFZ^a|=4 PwBhnߋrkwMnEJ?RsCjL]{\0/h=`֥ofT,4j|ͪ}et-KK5~h2ε! t^^2Zص[T k'I1U,+TqK}$p zZ>`ASIl$J],dSeTRSD7r)L-yKnA!Ŗfi_ [yh%v,|Fqp^cۈn' WHogJ$.%(C (Gx(',(iI8}v2<,q7n0 `HqS](v[ UcDM6IrV[@v bQ"EU'ַ%Udq~3q]?y o";1N(۝罉I}zw8];)3KQŅmtMj}G7yAQXd zjY3jx2{ _ 六PG:f;<;<~z_v}Ci5&jGo uYIdEƑx %d% DiGE|/!("M(Q"tdEB8Ac0ٺH!|!#N6}R%HO$1ބr!;*nⓨP$6ogu 'wd'hyAgA|)#|4q&S'QeoiCjs5*Yn\ 30CyaIJ^3)a6G?\K*zK ;#pQ<3߭fWLn<\h@[!"!;Fz.w߼9SECv`Fj&$d-d;E>s?װn, N"Ye.}MmrFpO"jIaV1ɬrSZub N]:ͅ E*ƀ +Q|!M)#2඾`ۑZ{[؍å0.}(Sƕ^~n(%r}Hku7t, ;< pdN6 v0ePM. 80fV< pstr) :ӻ9;z-+ʲ'}Nkк"(S7Cw{ H;v;O;"%>L~ jvE* b.8s#R=䈸:ꇹlad#4cj9_ۚEJ,'lP )˷P Mv,k*m̛2x5jgЀ`c!11F[+loM [*)|k 2FbD4yC)s2fEە#nKa*]IiuĮ %Ot3BZ|7$.AJ~\+]7AyC:JF#ajA(X: rF]x/ݟ0}Ǟ3m wMݶ!*P|ᅬ0J3<ЀRq!Ro9`lva U ՗$+;PvE{vr~SYdA!RП>sZ@l1B "FRfFuQfwW9GYee^KmPKa^u6rl؃bPfn(|`befbfr63@fY .] .Y.Yȭ d~" d2Z 9|+Su+SѭM=VW|+{}meles^c7EMySyc==9oΛΛ"ƺvzϛ*ȼ)#ki,EPAPo\剆Ԣc (L?!OjE*Yq&JVHlS=G`!MR dR5EB-CiKa*}bc?)' Ap6TB,IL{ Du杁M%!kH?><ޝ+2Bn;;lGg#L~j{9pVަs( A.y琲XR݆P0'T㫬f5R }R?]Y/ۉXXqv2ئ^skNz@P!9 -:"GԢCvR(]=Yi~coSr+yAGcUfk'ueQH&-Da_!R9O5!ǫ6@8wI K؇/WTB_K"<6Ȗ0AJ*Lؽ1>".wkc ;hY#D vu-+vJ<&rCmJwӪPR܌<oK^'휇m)Ӂ'#2]V r)x~MaG xtx~#Uـ7M"woA}#&$[ c9`:5v CJ5@PLF"m[#$fo)Sb&AI:MYׄ"Nrڠo:J.zTR?RX&Q6TO 4?GYZAJ9*D9A~:AM G> :啷J [*h7DLg!Arr0N5T~VUsKa[p4 HܧA͗sr$|F H)]EހsL[!U_1I`n NܵmkeD;YdpRuc4$~Bd?*Ϧҭ "Tv% ~oƏv5ҷvt<66:}^56sHl^|I!#}'Ю>.8{o~[~~͸ߢ.z=|H";~'^~CQ#E *t1퓙Q"1K?2{ŏGxdF ¼k7eƼi񈫿ۚ~XKnv*-(UټIn"x$Ƌ2EߥtGۚFNΠ,Q!-%dBn;B !Oa̙R И6C$;EHEOT7}O_[R[Sw#E7E;&Ƃs-u\}X"o}; SMMJf ,V]yXm`^BGEK+tS'R}6q`iY󂬣Uٔ t:4{ڗoL6T#e1,zHUsa!E[MF$gB.˺5?rnLeNqCQo Cȧ5*3(EkE榻LẉZe!= wG5dyTmMQ7yd&}Xj? lS a'>CN.6m~XX.Ozg?KUƐ0Y%uƦs^F1 _y/Cv> /7kk9IKs K*j',Ծ:9F%5 )z:YGqX@c8% Cv868"`Y$(f-;KEx"v:Ժ_mWh="[ 8d_ !a'f*FCla5 fV ^R@3 ufn׍YuVl[d_9Eѽ|KVbH0f(MR (0<,1z9o#RȊksoc3Z9s>e8{8F?Nw+qK&py1k}erMmY/89by4I8xpe{~|.X|t 5G}QgC|UVhz6}'P,6k^=kx|^m]#+J@_(YZg Y߳qo8{۳q͒7'CqWڞmWlԽ"9A [)iyuDT3 3bD!(И2dۋRkd3+W)PK_s^ 2r;h {ZѪWO6du]^u]0>ⅰD2ǰH>#&K:BgmuKJ>$I`:ڰз= DpS}$F'&UJ{eotF~߼2^zM RFoޕ<{1]hl6CjfB3!ìT_kPg*a*$B\U_:D[S}vFܪll681eI{a/?ڗ]B&UJ3[]dSKR}T_n/˫⪯H.Q}Q}߳謯:5Eg}yg}Yo|1;"1\L~~ ɬ#]-{|&{&/) -,}1¡gkPB^@8 GCB&ﶔX2ĒBaV>7˶kWr pS^>{9^y~쁴aFv 4[Zٳ"%8q=I28'Mö0ʒ=P̠kF_vJZ"JL*jkMN4SZ7| B `j0MfeϻEuI}Gpk78)!I R"%ΟI'+005͐I'9X 1{'+E6r}wٷr`bM5X/]设8Gw%^*]wW*]] ȳLKɴRv7npSSYٗ]u8_E&Jt6Ts(!6ǍhQQ*p`-ʭ^'7i)xtGZ=X'h@:a6B(C~=d_w"^o7'.5k)BJX `!T$ɤGNt9i־x\F%4=-aɞ"er=Jy2rdǬ,̻b%^o}{}N %U;e1Sb9ՈшxkUhy4hh44h4/?oKI߈?Qb}l^r 4Vy{p](ec }}v]Q&>Jt*+Qe9%aYZ=#,k并zW{ >:HV=VyLj1!@ \QeCx[O ᧽E&+(YF0bz'C_vG#Komy6qQ{fvQ9N=,[l'ީSB'˰CpCr%^׊ΗMBhs( %'e#3u/O*:j?%{7лc[ϡ$;$=$j.k݉M]Lqӭ{ПE&fA=pN^-?6J#Ia%j&+dGv}mɁ1{}ӣo5E+)dbm}1ұ@RZx23Ces%^?5x={j9h.o9:':GG de b=Pk'_T{[ԡGУDVH i{o :68. R+E < 1ZeQ0Bd;> =fAw>um*6{2GOcѥy+[`cIE/xj zk(ZБ[$rp Ow+d>a7=ϒ)G}pk坰pd n}YС>g2˾Oݍp6} AAPXnI=fK_SH?O#HnSC af{ \+65.A#zAwSx%]~kn՚[H-ުd-!dUa߫tN3=%>a}|Pp !Jܷۨ]kTmww kn[B={kV89%$iהq~mJꍦޮ)7Z)i{JJ){J*{! Ganb=hbWF>Ռ Z(rev6Aϝyq7uAqI%[(RJY|BC' 5D(qqP!]wbpkBJ8nFn2].6/76|a× m _en:7~7MMp3h4px@NM:У/MG_=ZiFRHm +00bW+%d;d[﷭ zg[﷭wua[﷭ON_/[lO[y hօm߶N}J'[/[{;gb?2 m|::tM "aC/v]@2r2r2r\y9x9eed뼌2r2r2rn/߻:KC^y) uET2wuwtq7]w7]M'wuuSMuuwSM/zM4K,q}Ҹ>#]Szt~zc\)q& п+g:L6>%=ު|R2[Q kQ*OGI48L82 |p,G ǚ}ŷ;΀##xšÌS^qhA솖Z8:T+00΀k ϽK#ߛҜ{esÏ(гnpk Ĝ{epJ8ff1Ѐ1E zN[- |׷R*5xJ,>IBR۴JCpV%%U#\pi@(),6K7'`T1T:1XDRCuD *oBPTAVXŎ+I_*^5@@TWXmu4z*_իѤ>l 45Y OV'+&+%h+@eC f1P5R#eGI +)-QF#H}$,$Ca=a}&vPW`-ZtW+00N[<лCv?2"v5M >@/^u |6Y;i!iQIEjnF8,NsuWjnF8nF,k .t|. ]n%t]~~S#ߺe0ܖ v9]4i5KM\´|rħQ.xٽ\Z)iE({kC S&O)-HC=mfߨ-ػꝺAY)6B]};!G?[ sxeplXV16bPN`8g5M8^ژ{_'-6'@EYq.v+ }|Q CnHk$*]MP>~![)Wb894Lzy=" uo)zo!Gx\JVdS<.mdizf=)rSCSO)'?SO){@hęBG/KNg ]cYz*+,t>@tš? #3)Ӱ|J!k Oϵz6i\fH`ɂq ][ fY2cm:/3J3/\f(Cb@^osR-9\|JKH-mh >@mq#q+PbC^w Bv4;GD2\[Iv(!3,?ա'=q-=2]Bg.J^@P ҵm~"/:}/DQFj+ig'`r%JK1zEk䝭b< >Rd_\^ br;t>jFώ(ktsY Ђ/spJ0fl _~Ʊ:_IP߫AxO],H #{Ao v>YB ~% x!ɡCqa`iZ|WXZ|JpmatBjPxH0zVz@?nv鸻nڹ.ꦃxu]2  )/t!Ȇ:AOz@H$;7Aq"g0O$)Yk tT }V>] (Cϵy+舢-lJ|ר9WvI"cUdNrc=@vz54n~kb=[kT=f*a-d4"X衁fl2;Q(x*neRo=fB `!dң\ ?MlW,PnjzYR,R.E4=#`ȔF<sWmIO4eXs^. ~?l{}aۗmml_eB8v;o}|JgSc7TN:*8S,yϪZR Z`2)Lc#VA̴"!p9T bC&1^v//~eAe}c`sثC7w\NZGX CCx,[ե*Ч( 23jF؟ڦϧmr{ԋ7^A6Xgw6wMf$)p|J$KO>sR Z``Z2]Q].my%%jmݥ*~}Qًuj?2Z:t)X9^ LQNjSIH D7X9fH2}ހ]l{v6log3NmA#+ş{ o~k+רg2t777³V_6 |tqu8h(<6eP܎TjvZ&OxGz ?|<Z#HݖeSU[E:;pEw#d[`OY/LuӦy+Vv2>%*o2Amu Gzmu 1zh~y+Xg%'V->l ^7oPۋmܯV_> `c.U ,Әy<_k3 UL/:LU~W\$,p*-pZ8N.ZB h1xSc3J,pFy-pm*-`V ZK![Dk(k2"7 1+ {/ &'+y-ڭrPaX ?j+G €q^븊|ob|*vx9hD^ꩅ{jZ{jZڨS6"CM*^5U9xy|688>pXc%If=g0kYu[=u E#U%d!j(iϷ|^T4є*RM~iJ)U2SZ YE8-#>j2HVB l0HN667&hCYjaO e-HHץ*З`cC&,>QBOC5?,C7JХ@E1MMXv,SYd7.JXٛ^Lc`VH1`t`c}dTsw׷Q^phJFi|JxdTN7O1/ڽ2o/\.Zv[ @(Cؐ_vJ8jގeL@/f߂H1w:SuV>%u }ƪ$P?QaU⑳vbY/DqT ;]YIh;Cf@Czͫ)F0􂡼&T(A:qv)F0nK 65W@PˡgR`z >A5 A/.Ul .HΧ^v.3n ]pSg bl-\5߰vwoJo.FpI# m=(X pv'{g;@;>8A/*v̜?{HSS,NzRpbf$˖3dzfƳiٴNHKiٴݳiTb6mli6m4ldυΓ:eLq v\ur>?Ov'oO(.uMՔ]Lr /l\>%zdjZ#6ZF1P~ļky+rļPegJ1o5H(tļ`cG..#D,Ne>qOX Ҭ= '~An:CyCo ЇN#̰>}7V6x{ F8tZJ%P]V=9\}Zl 4v7.;+aC~d|J!baS)O&(Cv?-0Zbc{?d竾Fp9w36|`bէ, 0kЖ@(z'vRp L22I9P A;bE^~฾ha9x+i-MKVCICR2oa"=~t^{Jg՘ P)5x$IvR>.Z Va|w:o=JwA4peHNkiQdtVF q sߪe1ۭ, ᏨߙkרξD\}UHv wXf^hYС͆鼙Qif@<Ak?(h[tJ Z`l(dg,)B "X|TJE xFFQ^Z+)EH6m:xdx7G ZZm䄄gBI9VB.T3dLRp mSru]ڈI1fӲ& n!l5Zt뱴FRRp# 8P,UJEC]25i\![)CKsZECD=Dlѓj78gJ ̅b.U B F(C?¢b¢&^Xt/,vI,,&/,m_XD ^ )l<gO_O,=9}`S.U ͜=65 nΛ鵀^ AMB/nЅ759[C/r='U.>_>_8mKzu\_Hm^ݲ~Y'',HzL"{c-{;ɯ6Y RkDHʖV l 4g;ጹ$'i OvR8i?!5_T[Wt! ~D |J0-(m/Bjtn0R ꃓ{atӞ8q; ?^u=ר|@%U|da'#' @y.]x(ln![)CK[E F?!AMK\v=tgoJۏdpAa|"EA|[ʁ/F/"[O]- |B&}.䖺 Bm }-i&k(a]ҐteVl&jGsYС>~[h->AV/b(]zm F+Ovه '_q|ܶwoG΃{ԋF0^JxCY*oZȈGpH2}W}:xj\WqV<7=$W,L$tV)*ih UkX:n*)5*f·JoUZ`c]W)%"2J|MP P/8hp$E Қgoɦc >iXPE>l17iR׎?(cDxXW]6~ol4zf=C5X&b'ې`{ D?\3rpN?dwido! rȎI:}⨹l`owPE+J5PȠI;nϣ \rl)Od0:T?,n7*}·ͨ}~F0 M)g?ꤰW6uJ8G7TKB*szJ"+),`"秘-  :D)l Y:!I]Y^OaSHuӜNQ]hljF0|65Y MGc|E*y;M#~ƶ3=*U,e8Z?#'O5q?w?܏'yxp?W?~xNHN B,?@%o|M$@g1 HI@= <%1 <{LUxȕ'\ߓ@j>^ںB+[o+`K貝mԧU•^<ۖY%!R7J8&-joVz%I6Ľ$-#\?|85*SRmQ:pFVuA>^eͺ ^p# 4l"U8VK7Myj.7\LҎ)A r㻸ǗQv[iy7瑷G2^Mkc%ѫF/9Fv^1z1zF[,iQ01@XZTRbe|KU4@m#)'V)hG;&.j੸YV,] Hu>*ov#~X>zvᯁ7u?$5ٍp Ҡߵ U b B"Hv>z;B?:<:Bu9:B?:Bu~t9:Buyt~t~)'}I5@&sNcQͿj_C|Q|xq嵳kv8v;Lr{IC3:@r]z+V";T8$mތh[vh!˸O]}rN"V{/ QW)ͺb@m![) 8%ٮSL234@=Oof VR34hώ#C1Vflxe0^w5|!>Fz^}{V%%TmM{UPs쵺@4i,|\j}lR{4?}h(OGBFлďd7Coه?xt9ָK%]|kKKK%]5R]re]h qK5n!ٮKDߨ`qQC^hҳ~ Nk{)Y|)浊+3Bf6ۄwRBzuQ;ØwX +"Qor ="]tcMWer]$56xʇ.SC &!;C Kt:m]$ҥ2O]J a]Kq.'.'_etCeCeCy"e^C|^Cu^Cy^Cu޺k%ҥtE.#.#ݺ.*.5.5@oKVLU_OBY$5:ɐ8O=p;V Zھ+~&sr5wwn?[ܭxƉF֋~QN~/?j2g\$-1ɮ&%| Kx+m*2S?ơK|iszTT@.9adǻY' ނ=}4ϵ7\${byg/#7tbQرT}Gs!Mqo^"CwScnҩݩ+wƝޝ:sܩݩ+w̝ޝqܩSAOtAA >X L|Z0zօ#{Y[zo={9zl҂O!zʱ$^-I>ZRMK*-I~ŒvD}+@܌ gmOGҜ*7#>j؅v zc)ֳ[^[O5z6zvqS'2C˒[RgKj%UƖnKjlI-ݖْ[R{[}*K O}*?K OT= Oh'4'&&+'R#t ܘ t٬RTz%po$(8>ʀX*,N5GRW+ifvIv'n/ti% O]e78̓2z.Х"ԓy9ؓ0oFll`cncw.qG^x~{ta;`;`w@ز:{h]Ƈ2~]]뻌e仌㻌|///{\/+p2=eex7}MئGF6M#\bϭ0@+o1CrJ@VMSB*?O3SקM0Sܟb&}| {EOA!WwGwGw>>>6uyt>_aG| 1 0zE| sw8E!^}~s]_Ȼx]ȻyǑwȻ#ևjdZ^0@ PW|%D?eD.2̏]$Bt I_FOW&Ab?Eq#e܇.k*O2Dç.آCZ >wX09_dkPVa=g9K"#/s#5|M/eUjMj_DQh ZcRӗעq: 'ݣJH=ⵊ+߽f~J6'd^Z\u26v}oR U4'R~b߸ĮLX'BFlFQCWnx?ܬKVµh^,ժ% u5TzE,=,0A~ ^Oe+^=KU6Yfp;JەP!(Qx?gV*1985E.‘Fڄ{j H,-cc۽UF8 c,He YZt!rb}LGX QHnʋp(ⱂOkwt Ҏq|NS@Qy h<{ h4S@S@)$jG%@iF0 Sbr/- V\~ ;Y`W+ M\ ӇSS?B|=Ҝ {n`Tz= hqBK}`<%d.g8-!]hr>nSbp,m-#}qJkMw xp?7X~,܏c~,܏ݏ[s?~ߘd`SU|эpb OyUӍ?2w&aÄsXs9ly9̏#iF)AZ`ʗ9= 5~[+H _[Wh-NZ}~kٽ6'|7;D}7Rw(N |%:+D}7;D;Qܟ_n%|_K0||0ghM3~(sټv/]xo'꽅 뼅-||ulv 1]kaQ bߴZE#xCkqڄim Ai-x >%Fl@|KHmRGXOߓOV- t=v] ZG;'k&_JQgHu9cܧp?^iտxko%,F\sx-hWgՂHs7T%%MaQf{HeCa+| F Bam˥*/z~g/Lsy ^ Ė"A*_ȞCjc˕V\/{H[gq_0{ܟ_ke-ى'2*tqYp?C(p@Q!U|Rc |FC Px-|GHu߾>o ۗG_ϞqζkoY+*^O+J|k!g~/C?go7 n~>* .7o7 fO7 fo7# l<mQ?sΐjƧDUXfnaJ8ɼr8db1a3*o}A9dHuh;_PRl7+uՍG\Tv#~|JriKUl}q# w]W۸ w]pmupוw]WXr^~)QXr}BanOY8Aaɻ*<,y[GXrMK>sg|1Ҿ]?G\ːz(|KXAV.qa=gc涮59/:k:kKggcYXf&!vk3tß$__$nDgzïʶ/d^ R!/l5OJl_mB?+/۟-l//- tErRhv>O[)l 4#jO[v.)bï^϶yĢP/#"Ӥpa=Ԉ/$Mz~(Rt5J۟a\%XA >{h0๯tD|Js!:~ra=gIoxL Dy>RBz Q)iIxh7l\ )]-H[yo.!0}Ɵ"SV SBʉ YF+֊"F0|EgMՉP.u?4A57q f~eIpԑ6SuM^33|IXott.Jpt*|y >K{Ӧ|?:{iLx<=5ۡExk<= aؿ v(K#|v֘og5ZG.EnP:>|P|鋊5_}aǭ??f֟o?5DYM^V!US=fhW6+zb4}a%[9[snqnŭox/{ښZZ|O[[??~ǧWZ_ёJ]p` Hu۱ gU'U UGXW/[}l}(uEY_}]q>_W\W+t>Z|eÁ2[gSr_A~์֯~pԿ=w 2zï ?3zo 2zï XO9gsss9y\y\_t_M5}},Mm+J<: |@耼r|<9}y<5S5#Ϣ{)4L#ʯGFuShy<5S5#Ϣ{)4L#'_{]\,׵{|^W?_++_+NuƊЊSsъfZq|8Xq.Zqj>^qZqL+Ε_+Οt{]7]JRk:=qQUǭԈ0ƧD ']<{\ɞyb=]p׭uui=!]Pץ5eu+w]nVi\VNj6( O7DDN;fa=KVD!Aۣ~F/A[KF~woKG/Y!Z|+nq{3W<]d=A\ j׭o.%f%Kͫղ?dKsfE@]`V -t!]OSj7QZ!ϋeSX4ܾl|,n_ʾl,  ˶h{/ޗko0}~ޗ{y/ޗzs돏~!hT%qQˇnG>%:}h&myx-GI|s{c ts{T(wť^%Q]~JyAɥ*pJR{tz~T0hREi>C*ßHeIc~[J~2 M/#tezeT|7owӋ2/CYvϘ!(o"CaڂTa>ݩ5OmVnYd< ƳnlS7|/i|-1>o/[ _|ES!>dLo=%aHaϤÞ谧GCgaHaO^h*ȥt_c=f|V-ԊUI)g~VUtUgU4uVU')[}uV~KUaqTrz%KUc*ZWK+ vow A!o"MKJ .w[)rԱ̗ Kzߴ/8P/ehk3r×Ike4a[?alCRVVYlOT%_, Ni&+d:g=+j/T؂[$a Tض+F5#.o ?6h<7|4߳ YoT`V$m[mH (YHVo(}kjeߑHڗG;[qߑ~ _~ _= }//r`Ubp>4k56rp f#5sHe NgWU+v]bӞFzv/l+6I;g(V[~i?96 ڣ3ֿ&MW)oK/ }! o_~g/$W97`^RXft#x-R~JHMԫXRM [~l}֗?/߆κgɳng]YY+<{֝a=??iRT~j'FlT2qd`ݥNJ ak5}?~9g{. ܉M'cV;)^ |;A<渃ߴZEc|oj?d'1myZlQՓ4g"o >JֿW|/[~r?yҰA' >i||eIⓆ' :i' OoG7Ϗ//Ǵ3]gӬHn\?vcV1D!t>AOd?A?AO4?A'8;@ {hFw(;޷%YN'Bqox-Tm0|䍋]F]p#R:o+)NTB |-R ϕai(:-7- Y|5f3™g3g3g3p̳p8szM%EdRk͛v36g\Sp7T !O}O}`ߧ/}}|KC^.5i0BO4ϣD-:f %;q^G/8zp{%$ZI el6pjZRj3V3vuwa_w_'vuww?s7Gϣ_+.Cw'D WK<-K[iDр3|#|F|/GO?SŸr\k'ђC8P ~MnWH=Kf)+c?_YSmÖmܲ{˶p˶q˶---۾lRe۸e-۾kYco}X/yf:RҧC +yo)*RA|wovy]7?#0 ,@ޓD*)6L/(+` eaKfKVjo˖Zr:\ƫT2֒͵Ϸ\q)/NG Y|+!'D'tٞABLk o1FBm\-n< sWQkÇFV*IEU%!Z%zӸȾM5wR}ey.΄.t_^ 4:eѹK{_Hy [E杶_KഷȤ"&6+KH+hnXع׹Io{d:#pwD#Cg|=v]sc,^*'N*hP[k(DJh*"r٨rтFx@R|97EAs ?rE}5t; ˛H_e*Kå j*]G1IJcG1z: zG1ZQL ң^G^G1oڙejv{kIR\Q@J) ~{M+ꡮ-:ۆՒ -a ڰaڰZˆĆ6aI.gU/P ԩk}HO??|cJ`k!si!ៃ뵸hŦz\ I(QztA |ROYຢ`  " |ykΤ VL b[3氕ڇҥ9l) -䰕: >䰝KT83E ^%Zj"Rnk3y]ߝZǾϿc߯Uv>Kzjbs+׾ya2_vPs!|SKy?վϻ>UU ~/Gw7 M?æA릡`MaPy_2I3ikՄ|}W߯1qN9C[}C߯ O 'νjGvx!&S&LRϞ:|BW=ݏh,L3mOYMUo6/u=c#`C=3S7Wm@}W{T|W>?T3;LyoD?T@ZJIu8T1}~:m O[N[ikT)N[yVgj.?,3ي׻U /]}y2XLC*<"[|5'tRgyC}dkk+U A#c`!7T !7k(|>7B73] ,7lm [$o /7j Dw/GN+ ͩZ6- V#Y-c͵O2~q/zeB/Rs׀:ϮWj<-7MCRCi㔝yc=i[O-DZmJ8᥆O]wwЊ/0ِu8toq 5~_woK#/ӳ#ѨXY:o^j5*vT?,*vɦTH'ҪAC*Y1Je)@/XjDϽO7ν$DvEI(1 4GjtKU$zPZUHM@%M0|/ޕ&RfKꢖDʇVįN=]HECHmaoj\!=:VoLvIO02C<4 >!ߘg6 R;1)|>}yCK Ӥ"yjHәu[yß!y"yß y_":B.y*7 Rg|lOӲS_8vN|[v| |}| &sx'PIE^5>j.+`'hb"_'yoGu@jb/l0o"߃fx$ my27zn5?OBdWtC8|R̚&!dV~KeN/=1bEVvB eW,=k:sP/*kS8JoRGUɥ Sw~ 4\^uS0+KIe2`y;Ԇ7]7|40l6 |on7 |o7 7 |mঁqMu_dX)n+NǤ:{|F.U٪tEZT2/.#C!W( >Y@-ť R y0Sy>㼿qqg5 |75r+ \> >KҳGy?M4xMZJ8+r²IujFyjT!~RASAiT!|ɼ$ljD,l`lՐڢMͬk#k/y~VOVBK@ЭOmkUw/4X~fp0v86|ulѱA૱GA>' mUL6fM ?N'DC37w_2KJ3TGֻպ~"‡j]662RpKXsg m?"SRE*~A~wL Mߩ)C[3|*45k7Tx6RNhqlM\l5\:.[^:.[ ~/[V/['Hw`g\ i8hPF@To/X﾿(W}ItAPoc9rdGКoc>>'uCb[q{C&k3Og3O #:sAP㘍5JjtyJ(>!?WvRybԾz~޲ ܲMܲ{p6p6--[-۸llle;}_gooD IKtP{|Q;>WqUw|\u#GMf8ߜyǙ9=tj6>b9p5Wu5GWs#+7%D???Ÿ~˾??}}~Ǿ?w }?~}~޲Mܲ-ܲ{6p6q6---2|۲Mܲ_ }>VV޷ꄷꌷ|ߪ3ުöH[U7[?AH -7YV:5F #24ַGVt=$\pԻ 1Ӟ܎YW[HiϳKv=R EaƲe[G[Q᳗Kb&cj!Fh~8hYMfHu'lyqb nU ha|B0FSoȹR0F7(`'P}|߿_!|Ɉn[h|BT|+jWڛ]ͣw`Sau)~'D}Ұ"^x!~`8gەv߮,]GY nWvKͷ+ oWf< ;S4<< ;O34"Mm*"վM*(vhR;>"M3 9j7x]~J e; >xR׹!7"/3kODŽx88='xpO=}%Eb/f5b |-O_M8.Uޕ9c͵P|)RJ)`D{P :{ГmGPڃ./69#>69LwrQӛN&akIu-v>~5/X30thb 4S#d@X#NdQNt4)4 >4x5`AsD=i[h|BLLϬ85KH oƳ͐ g q{8@t@3q"==) aNC^CxCx;<bOta!L8=mXh`A1|BdBDĺm66Arxj#]Rᓗ @&{D,+6|j~m/)c~_E-skK 1YmR35 ͌5O)-!e>ѓRro>MJ.RS+SϐP -jJΣ^;H4JV֫ߟiXkd=pd==gυ'_'=gO~Ϟ0w4)L$W)0]J dToOM )*&>8C7;Efé ߂O 9V=߬n >羿kpM徿o¾ƾ}}Ǿ/7&Ɗ#xɒPY2 }'/?xعB;`Msߧ}AKoiEKBZ{~O>_ IR'sғjC|+~{ȵIO-o6 #seSWz~;\xH;G !fm.ͯ[6|!Eܦ|SK:B떍Bwd d!!.KhNʒyxJrB m(k4y]OT>-_%R5  XsYx"iWkb`=ytE2OI#uivL=m/l}f߯~~#~_wD)uMvDM nr(1uWS>@U{XqϏ~ڟ߫klM\l5\:.[^:.[ ~/[V/[ <}ܐOJ |-vjʩ菐ӇZeT?_Xkܵ?x }ϞmT^HC_4>!(nW$>q=v]U ԿSeJ?Mv>8z؇XZ*|7% %~.T(k"D<Ӕʇ8 vysHm1s4;OHu޲Mܲneeem▭m[6--|o敢\T/7&HQ畢#h|B@i2MAӥrJQ.Qfy8,y= y& ?gϿ835҆CB8 U ,Ԃ/UwU _3&ٔi/J|+=Hurٜ!h+ZNX!昄yĨoh= JDNL,PT0.ą?I%yԢ-&gG)TJ|KSAF n,(J|+4R y~qgAż#k\KmUj}tY:?kiQ^-hOGi>]`>O7̧|Z5J|a>OwtOWyͧsfit{>0 i|Z+ΧSIщitUOW}ͧX(|02vo|BZ _W FUw/Jƚk?ITc2QQV*|DGl{RD >~%X_C=0 n5(iijM[oUcg G2~Z@hl~1L.abX)h&LIpJvƶols%^ *W^=b!!EXxiBUc9_33KR2ֻWj__&b/*P |+گ U2i^[ZZk >.[%;|#oleKZhS\V}}ʖγIHk\ ~1O >!VL޵ßhJ |-3VGa3n1}KJ8'p8RL=-IW8HfedPJ |-5ĶlT_|:=bTf|S"X&@~wGWkL;4QoɄR@|5DvL+`R>5<64}j[RekVek5ekp5ql5p~~v"5'{klM\ƽl5\.[^.[ q/[x/[ xudεդ"|;1(v`kߵDY*oMX4|-gX>}/t} Ow_ >> Ǖ  Ǖ +sOY[)W}BDǫ߳zT!>{>#0ō:7Nfi8ܭDq q:xnܲ]c+k Rᓗ O 4gSRpK q+`g>ű'x$YdZ/]6^eKKz_Ttx2K. /]e=qOĹpd88'΅'kpM''}~}ZxxikikikV;mmw;}8wwqnq28wqZ>S:<:,wa<@i<`a<ܝB˫gHA$7H_D{{ :/$FV*o^Z2%">gM}pZ5[~އ F>BFvlJ|+=PƷ4a;O|RKj?7 uu#M&`M?o)*x8J}xop_ghfbjܦZy@ȘDljmmar%Y+jM6x [aVVha+R>8 [a`+XP㙶&j̼jDP[ؾ+JEB.UoU-To<~1I ?tiNoR>!9=T* 9ߴRAC*|'ﭤeG*}9,YUCV*hrH:нL\pnI#\&tNm8wZmy~rX恤-s PU.M;l|rp _m$8c%T|dRI#9NJ%2K陸8kV~T\ul3UaaUkޖauVaC*wVTak XJ%q XԂKb]xx)8sd|xdOs)'}xdcкc0^~Jv.vWB[;\6M*_{Jλg`ӽ&MQ%!RPX~ǒ !!u}XR1wc|&qb!,޺Ұ/]XRȵ*v #duy @bsgI^Ow!aiKMvH;m >2"@Z*ui Lu"Gb#?s?j1dK |ҥ2:AloM,j|Ò-IKK!X ~k6teh_*e? ]5t~Fk)tpʵq\Q`Wqʵkk"!V&C˺+0&s|@Q@X|1_~$.>O, 8FPK|5ÇÔ5[{veJ>U>! ;)W#;dJ2kX~Myo 5j ]jQ|BL+]|SKVRH334Q4Z 90"hd4 u55 WMJ%3 t5sk20̸Ό;ΆǖկgcKD5 I/n%z7t & =z>B5?|~y_ydR3|}5O5m+K >7SB×`vxWR8/.NVoc O_jaɎg*.{9Aib|͚J8|Ҧw{f_^ՎnŹ6mx:~~X&K=mɄ0\yAc|K5L˟zpY͉L\LK+D6L× l|ۑ*g/mjl4%"bcqއ6qljq}Xl;΅;(™@~y~zPڟL@voԼ&?ە|'^Fg_|`snoVzƷ {3l)vJͰR>Zw/ ]7tpKsA}5j&yOd=z>^u[{Xz~wUBv72I ({ 1bY2!ɸZcKf_KiR3tI`鹲G˧kbR0=!Zb4M*GH/2vHն n >z~GD !GWk?P_|yO7fzNO6#@˅3ufiR$qf6=Rk n3P G,e [$3ӀYqKX-g-{1&3u 塄ß^*hM5жk26 iIzI7ti5RG,]in|O5KX=<" {Sf-{QFڪu Č}RA3vUC*l6nD=g}HoK<#xnk__Z*Sٮ^D2]tKylT66g] pMclT>o7Ng7o=ӛIMvS}z}$ULT$ -:\TJŋ_Ff-uol>T,GH  H#?\MQ? R L36 K[ oFk' P ĹqĹqČn Ĺqs}c߯ƾ﾿3}}c߿e~$}62 ^"N9<mZly` CWbt]yaާ>kޗ7lgw}y[y~7}*\}_^Գr}oX;glgH-IJ豷^HZeO!޺k*-.Ź }o>f1$U,)ټ%w~0 >,j߂ ӯo7%~C߾>oYLY;Du7uEN]~eBԇܣV,k1`2> jH !٬+zvF=T}s\1Nh6'ϚK /=!3԰^rkLl1 lbA ^x.wz.Wz.} /]޾If:|O0K//mzQROewɍP+ՑT# xCIn \gZ޴T0.k!uTQaB<5s!XLj}9dHYMEY_lԥP&ȫ'bxqӥl=B}txZua˃܀q']xG_S14ymRF3?, CTP.H}KG_ >M_l8 G6#qd"#3|&>Oέ5ݖ@)X~&?Lo0#9[7G;e_6aAT=cXTv#cEܗ.+mϏGV-,uiQX?/t! 6[uQ, Kh2_T2S]- <3\6uvA5={܃8={܃{8{p?=&yX_1m>;Ӛ,^-Rjqxwe-?hԛ*jLP+?H- zX(d]D<݃^1^ZCݿIq 3Xֶ/ZCWsI+7LAc_ߚKYև(τnBHaS2BV*ȻWHԬA mơMF"tm¡=qh=< 666ihkh4) mz mJC{MihS}:ƦMMMM MM65-45M¦MMMMMMmjzѮX)vjj JMRSWSbbX)/q0ϲ_:v1׌zk\Sq8= ր"XDmP@oP mw@nzHunu` l66~5(jTԠp \pA 4֠Jg/ì٦hrvΫTC#R;B"-W5٠cTyBɤ=QcBV4vp*`4tBV4ώ掐}ŦoHY!yΧQVS h혚['(Mu\Q lgmFvB&Kn3@+"'3 8<|#5\7JoőlhL#҃rRcb]d˗( ;4ɚ,|EIS35<ㄉA{: Y[һT!6 Q&۶1жAɶQ_ J F߶ Fm޶ B@x6dI%.]2Z |F n 45*Z3&.f0uhͿp^GM\^8ĺbS/!ou{+<& jPK>U}25QA'L<^\J X)L4hLe..XPJ㲃9,C䐓^UlԥFL2JDX&a`!oV:T_a8=k֡YJY^aդ,3 uRȾ:Taq0.k\4.v5.v+};qqDU,]y+͙1!\>=H$u3't|Ϫ^*h̀#bSTej",ymDVס@/ת.3ll ϳ=P/ovҢ\quK9A6"oTf zXi|KC!.Y#UJYҴ*3:|YJ̑H:ݬD1cR%}MiDp?z#)`!\MVzTa>EymmV*oiP L§$>_;o6fVhtW-ے\PKy/IuGז##73 ՃvȚyr _؃PW؃~=c4Ts@*5=Y\T;>u!-Y-T3k?1 E _"5ePƟ1>D| >X3|M$Ȳ=$Z; e >e%vKޅԞK1g >.;h I~kh|B@_YN'I]Bj\oja3klF'IOi[J gR%D M_B:w,kA^*!Nĸ=h&uZJ78 7Fҫ4?:S#E'iWD^j9c͝ha Qxh"}pZ&dX=ʭeyr^NZ&c NĜkV4@p6csn" kpJ s`MyS35)pޔz"4N{4  OTYaԿSeCT:\lV)R}ڶWTn SDj \Kժ7Cj^WuEVToVkCzվzhQڧj_M3b,5dS52ՓĮ^qȈ#?h4yM% iC0@a ?ӀĎ?)߭@`Md̖@nOPud7+66K$A '/*=_LEψzj0R_[+R?o%KԨ ^jYWfH;|&Z*说)$j ]S򅇸_]F.hp:یR.dDmT0>!T녜\[J bs3kbU:9]J8|RȾT?}=>C@׋*Vߐ'`Gn@C\6$Tڥ /.g%|~_)}_ooK#/?uQJ#%htص/ٕ٣hIN]O >kԾ"S>1zދ'za}u;Tï^*hV ?Hb|`*r`:J~U/|% "{J.*a pҳ6>!j]XC5x *^z`㟊6ិg,X~J~sc"ۼ|Y >ۏI;X\TfJ |- AHGrB`O e\<"ph;I¿RR>GIu51:O7+}9w=ktaۧjƯjx!_w z_`#++fzWJX*l!nb K_-(͖Qc;RwbNrѼJ0v&NXTNrRG[v}6A|a?l&6^86_sKž < `Sc&z7 TrCAQM5NfYqt׶n&luܼOd :u`[ǽ:mO߄?§V6U6pU6pU븪{U#\j㽪 }2MZ-'V\~|e|IX/Ϗ'Ÿ7%DScS+5OYeU4>ӥ_.] !C3c_aqG nX*WlzfHefKx >g4i3C ~xGOg &mL <HXzn^0?跔rFyR *j%5ǎ=gCҦ9JPb3*ꊯjtB5 ը#aF]E~*j,3ES!dPtxUayR,1nHuֱXG!$gr?Tj-g 'a2¨e^^a(:IB"[ZUř,cI_$ e>0TCm|6PDze6x6P"7tŤb'b{6ϪZ]؉ez\~A٣CgW.z?e-|C|S{~2TbV3|M&5o|o 9Aqad57VNöR" }[VO|( ZXN?!5)"֧I;'c;`V VJgtRk@EM*ŸUgC@JOQJ >\\5Hf3N7.0S d!L] !'5H3ju-lJ V*w&w=qYCjݳT`[~?x}.c+[уOn7BqvB|+mn7B*jJ>&_#2 % 'ˆ)a J"U)kw"%") vn>k0@Ncj|b#|+U>!(\i| % ͕44&'u#zFou۷r8l8}\\FRU|; eC!bu" u!bCHP ΆymDYu X-%2>.ԻOD"Rw(?REo6`dd)H_^Od`wg tVR@d(k_I~[sˆ] 1{),Idj5yڧnXj_|J eBNt-PŽrY{Wr d (W\IXu.]1E/#T.ڃ**„二~뢑v xweOt]E&m] at#ݷSHm跻 TUg~Z) MAnڝlT-^ĝuy^itIti/]Zҥ."uy.t./t9|?v{t)您ݸKj^tKT.d.C.#6S]t-Eܠsewut^3V*7j#p.pp]i/.?R?tAM]΍5d/Zr,\jѕp=~l|B̸'uԆًRA-yT(#x՚WJd]#5qV]=|UBDj #|SKMR⃐АӐ3J8rJ~o CV$ECVV_l34^5hԨb$kfS oMC5 QےطrF]MFf`ᒅp-6M߮b]ck_ T>x=HRTR~ %r1/T!6ᵅ"}Mi>Ylj&k)kE*M^47VNT4{sTlֶ߯,//)Pl(ik]]c&l4$#4HfD_#kI*"9ԝLS^QΖyL].vE$%v)U!ᰀqg]Boz Q|ﲍB]\R -/dop urEs@6RI:MNENSfF.l R]vjb)B\h!\ ~Ag%.'J 5X _gO|iM+fe۬_n*f;3,ôW=].!/0 q;m&JdF5Ԣ2=OJk?gs듌z5φ|m;u6l1Iwnxihlpܤy\n B1QIn E^*.a]y:(&[B%f[bܯ>Z7D {ӡ1j)ڹ@%_>J4(!*aDsws٠œ~m}dXL2*2"O|z)Ǵ<8[ 1"!閘BjSЀa=9skToOz6! YbYSb/f3$WH!o!ډȯ]O3~=%v=X~kcO~~X߰]kcwpMl+l-hlfR/'l5ljI> ]k`폻Ǘ?>ڗjFlG'lG7J;v|Wn+-|WҎmZ2^ͿpG;7EK;VZwt'DK;:gVfb'Ǟ'=ӓ ~ ~?/Ϗ'Ÿ߅> | <ɥ N%~|d-Xs04EsB|+mޤOrHuL?.?B隔@bZ wY Q;moMJwYC#'fc _T×0j({ze&em+wTM vj~5&|7c6M MYZuXtg:Hb8JVz3ðGʹD.!{>Xބ}\^$#|+=5pXstXHJJ} >០%kQ_K QRպ* = X|y [:`]n|Ki!@B('zaf|pր/q^5AX͉M&{ Jd֓I5XYBVGHX%f|O/& >{uk:V>×]yix€oR+>luKJ^.UmSM06v!NRkr9EPǽlx"DWCυ { 6S[^ 4~?賎8{/+ bKdT>ִ;1Ik:9SS5^*h"  кrl Trdd'AǹG#G6<2n[.h80z>LP FFQ vhqlN%kݫʋ:!xSEArbU1TM+4vH 0Cm7(n;+>k{ٞvUZu?Z9CYZMQ58۵nWC(WE&lPk-|(o5ʅt!]ĉ>ZP Vuifq6FsU2oF%]%.8g>Qp|{|OxI\PnaqU?41mo҃OÚV_ZbO֯@\lRW` 0:6&6|7qXhfٓTbd^zy7,ԍ?w;m\չY@45Q#uM^c3]Â|D Utډ*xBx_H_g<!!hv?L:rG҈[#tM#$žDwO/{}I==I0#W&' yXW<$ѠDzlxBf*8)=f+>-Qؓ\zJu'U:}r"'Uw.9[Fٚ)gk>v1[s5Ⱥ|"[3l监ycR<. u.-4dޫr/{ QΞirB|~|KԾ$ [ ǚ  >T^hf>?} ?hï~^J |ghv†pk[ ?|5"Gv+5E͸Ցѡ;.ww}p` pX3D_g(G9`2XSA~2&ܲ"Dc`'qjsMvǩ (gǖv.z)|wnQ, HoИ͡İ(gsѣp٦Oo7֢[(;"ʓKB^k@IJ/FF Qs>qwBK:|1/mC~yvB?ܲ1z?;i*1ͩ|dp5okZiٮY S{zd M/èäB9߳GpB쥂FkVMidR Tr6g2jTEmR԰RU-9\Yn!("H\ޠk|B4O 1jk}gT!Lq&h(!?j򯭄g/bɆIYf+*X~=[L^'5/H։Gnf 0';n|iץ ϜVC*[.FmbZ]G`4V!`b }<]v35gC }2WЊS8@<<ՆIEU˅OYTӻvu-cM*l 3W1agSU Z[gtWUVw-exřnk!dP:^6N{#}pX)&kRf|pS[Q>z(_6(wQWQӤf;ѓS0VzY|5-r3f}\Ӟӫ%7S*^9dEoő76`͵?\~XvEO؀ސK\ 3*|4X. !x^j>Jz9"jڔ@'383jݢ::?c߯Ǿ?O}]EqTvy[*3hWU*T *ʣXk󵩨b1Wk a l-l >ju. Nr4 Z X+lvqeٔh ~|VِesJeٔ'7'2_sF9yMrf(7Od65%&܂a`5#zt{=w"%RN=pd+\jkjX> Zz~F' Q5\k<0RpK:Д&|d|,<}; [Ӥ"aJ=2?O}̫RPpk[ͷJnI Gc v,7IWHgIS7KjֻP|>r!ƕ,y\6 'RpyjX33f>&/P^A&5_gRMRN]Y$4Fbz >`?C@?ݝjz}JCٻLeVRk >3DzUI߄k]d};I 0x;ɣ4j\չDj }s_j?t1 j ːqq\xg,>΢ guϢYt}E΢=~?§߄Oo;;;u w wA,A ֽظXXߵ_>}珵X}W {1vY|B:%]ow>O'Qݥ%7Xs}#?޷%YJNeqq$\YEJ]x羁D7OWmR sGH͜o|"ό~5yM ŢI=1~I\*QY.+?%N*;u %V[qu<8Z)D8\?{ 3h3vqZM |k,~7[ tl"`oF| 9vG?3 *|Dt/ J :d;-Jr^Ŵ2+@wzrYbGZ wc*GO띧ѴL rѴ% /^!/*lЃOvJxU7]#+v9R'|h( ?8WT=[IYBt Bp2oz7gEpBs-*cۉG .(|J8UG'6a=秝?[A]S{L*O>QK4xR N>>m[*u[ںڌ[ϴuںL[7]_K=nUhV2mJ~m4&(yWwe7Fp[' ƨTo) /WoU4nJH%{a;- <Tv$]]6ix 6%),lx7Os|nkܠPNi#TW"@Zpy  _" MCYQkUէ!MC)Bj,ȵR|ૻtz[S *HOE-] !xil1 P^뵐`Wd 0%L rhBнu>S)ѸhgHj|߲X*}]Hu Х{e.eD>(e*~dW~ xx:5&W-aAzKuFx{:%o(5@+?,-z!3VJq̶BY{mJ6+<Ѻ˒f(/jǫ_;(gvu@Ἡ[*PR.~:.܇.Nh;=aRI2WUXrTǼd{ަxqXOzlb"^G" &EdEʹD"TJFj${G*1;q/9x'V-Qr`6>KxRmkRN:hvk`"aUB:l%ځ+C_nh[(UxkV:U0r~p:{/k" P^v!H^]}c% +ŊX5^T6+.oݸQp"٤s{TYU<9mu4>%2~tSwz[ \5q'!Pc(15r Ey E9"CQ^CQ(P  }kQKKA: M4jPIq.σe'iX6RzoƧcbITtLU8&# +o ï o ":Q:dՋuyDb9 ='FopH#GXOnÇv{"#&j>= d?!}T-Tݕe!(7w;m̩Hи܃7="E} v]:Le5}FWr]FO"[VnlE弴{jxeܤ˺Lg=N:GEgc]gS6t# ٟ,::ms@:\Nկ:|Sp9XJ=\N{V9F(H? K=%^EiRZun%>Sa U?gai\MY8!6}Z1Nt٦ֹBZ.y \Г >Ljdx~f3˴'o;ۛ<`?z3C*93*;\C 4& JO9>¦g|J89+ҘĐC*2WxZJ#_c=%=^CF -bg*18_˒4+. )_O_^kUmB*kH;h)D350(~:kzbt׵RY{l{UDi}D⪽j7-b*÷֍Kշ, +OYpXiR>J(_UTUkHu;V^!X3s"}|_Vax=JB͢؆To@}|kL1?*J+_u"|$Ӥ:o.U ߼Ut? .e{GN;9c"Y|%%KKUwoU4>( ~wux|rQi9: Njܾ~:#CE-wH{VQ Ӥ2w*_%k#G7+?CE :W gh: L-ҽ>0bRy<{in4[HesI*|)|§D y$W)9$UR3u|J! 8Oo!g}N /vV)18[R|P2obzWY4w{(SWH5T愤pƺlHUₕXRcV^ΐ`m9l9䰴)Qy9S/w,gC>|,g⭊O[He#jO'u=9Ԯz~>VnuۖI]RK>b>kz/5Fs[e8kH:1ˤ2|W5[/3[ސ5THn=;"h+PgVl-HEӜfAj`%xjJN'`ҡ::_PʭCVQ:pNRᩴ\S)<фTZT:OJSiyOld?o.5OeA^1Z.uR>-C񮀻„:rV-f=faboR"EM{ ђZRhIw,IY/HLa2 ̙_f_/,Yv|[pSĨCwYkfs3Pb5 Cz6ÓW[Scol\sz6eR 7dsRp[NkX }/p8z6THo!DrٮlENቊg{Dc#^}rfE x#ZMRȺ!FV|(+1{YG-o EPb(ojB5<݅ɼh߈FX.u $Hv3p݈q.s$ظ.I!nԥ NK#qqHNlx6ځ+ƅd.9q%[#/Wb]]/1xx:tvՈq_r5Sg rmNKE9)b'هs2nE+ѾP˖I[aӢҖR ftVC¯#agͧQBv_Nv-V"ꑐ^ \\\p\C1i(f⡘P C1<b^C1䡘PtB8Oqp>N WfV{i˸Z]xϦň4qx:U﹈w"=>F V԰V8,ҳԿq.Z Z*`RdM/\_P0fTbgvT4aEMOEf4rGOaWكsܸĭ*0fօ"SÇ3i/}•ͥr& ?#'m[O?caw)bU:%SUTxC* _ &Oq,n![)RہمE'ٮfo(7u}qG֝Q xZVoU4b=@KKP*f9zHe0{剌Z9ǞcѪgh~~JW, |3UP~ ?sܔ2^PfV(ʼnqSC2fV+^P΍GlZ{sq._1OHG<3qt>z§KG§r 6 EoԐz[ >R/,oU4|TAi$&%NZ}5A8 >)Mß>nYN֪hԸ,*E [T>,j3lQ얱ȢmQ٢ۢ5M铄CUKSl…($FTA kvD*j8ΐsAgYڋm:nbRXXIrH-NYl+=|A5nOyUp[HOQL?B|vQ7bPU s!%ᠠx)ꃨXpPT_o%R D}@GXf8V3#Wo]Q)5m0aZz3 >Jw-JF9lNi޺oBCWw筄ǹ&K!r3]_#_76R3S6{ ~1|P_ {ƺT%H,'~ILD[|J4,Oʕ]-asVA& ϐz??ǧ._1u__/~~!~c$]h=HRB~7\ >%}se_ږmcJC Op]GXg+zO/z_>J+}K*}܊>H[>_,5-֚Trgf>\GX ~{?s|̽{?swks97`GN񹾼u1{.յ}G7gV8v;R*5 7JcÜ@PI_TKUዷZcB/6S.{#)2z9;J&T6SSs5\WR[>Q\lIipORsgfs\GX #lfAOtZMg;rE-vc4w] >zlv~eolƶ_mm{^uV^u;^u;W~WΫnζ?mm;~cOζ߶olg 0e%{ϡ@eĉHR#JVE,cc z(/b(omHjģuR혥/7U e.O=iblN$RdS$j3j3QD;JF*=ځ+EJ] 2&my{nֵPw[=.U Z+!e G*c yn ~V؛=ji!3Z7)2vOi :q| yߴAڶOvg3a%z3&R?EMrE*x>rZJ%1j`%M˸ϡϤCZT[ړ] Z YI@Eӳ_w: #!??> ǷGᏟߡ'|;"[~qi.j-K81.8"+ |;"  |=YtUEOr h_[87uj~@SagGp?`~ AN9}L5h4hҠ499L뼑_}&yh|Jl)ڝXL ~VE#Ie9hMTk5%ZZUրEkL րh htM9$*&љIt$2M-_It$:5*|L9$kmE/΂\[QIVFV'؊^U}lE [L_| I6>P|5|G4%[B6ܖ7WVl%f32>z?Ӑ4TiHOCrOC!I< { OC= x Oe)d6Sn)lA_/ ×| _>/?¯nWWW+ _]_Ư+WWWWm~u_]_]W+~uʽ@%Dq6R Z Z#`˽6Ѝ7hyo={{*{:@ |.%͜nPRr`.rֳWԵBx\!<X]qͤ2|oTqJ0;#c?tFO%l ƧDc릗X{|~Gol?lBcV@ƃ-\zVXׇKUn>Woho}v{g񾡽 }?ͳKZb.;oëŢKsH%[m?WxOt6~Ogl<6xx:OLTpVR5]؂SdGdOxR|-]1hTۢT :<֎গ&ɥ*Va?2h&(E#_#^P35$WQAjX+@%+sI9,'hdJGeI"[u$i&aXNyѥ*S$a=oGG?xJh"*B 8IeU6'6+xhU4#'8&0nP^k;vЎ-W.):\|B  L߼} a)j?䣙`Ƹ9i8JA:Ȥ3O/E#̿ofh֙2K3/*P)y{(}oƽ?ډk ⢚ 7s jKP@|_ 's GXllu *q'6ܑbr Yުݵ3X~,e;V- Ga2|Jc1J'M_| >zIh@1Dm VbͤWs>h05y_zQ"#Ik,j_4] >3y*MvgGZ ǘ2}WIHo2i&4XI2 d\%~/ZGpO Z3]`MW)ѸXӚ$[Z:Sm?:hQ64zLLe?TiTk/^6 ےUT36Xs{-KZ|UU>T^0[%kۿ Dxլ/-}.l }C+a+VBb] <g5USf;*\p;pdY\V64jEQʺpK5=L CcYG6Ʒs6eV)-Wר`X*R>#:MԚ oN'>c pVH-^[MXGHey~kXt:R>Z ` %昅49ӨM>Z+ |b= ej-~ -Gwnm&ݾN搚.C.a= -YcJUDʹ6\^h3}wffLLF)]StGO])] -:EJV)y-혗$ ~ֵ{lRxo嫾 m >Jĩ^_| |Jcԓk?O֍ RtIqa):{)qpDQn[BtU'}ĵ=6BŊgݤ2a[,.uReφn|#D.jZ"Ie4&Ss1RᏏ¯߁o[#  ~)y|+}>c7o]Hݤ2|,qoRp[ q'Vs5o4@|k];["ѥCoiQz!UbwDa=.zM߇ң{\M*m˥HVClk3YAiN{YgS>yҵ>y(!k!V2߆y8#B56nj߆O VJ2PI%]٦BA$ʡL{ o[34THhgI?HlX ~3w|JXsmKU/s(7!?Z0{Ƈ?>|Ӄo!t=?>i|SekѲ2/[^&/[u/[ֺyZl1~іiƓV5زT[n ~_C wmBFj$-:WIHt#z-Ӫ+V]IUW쬆 ԧ<;M0|nG:Lҫ}#'ƛs}<6 [i&oCjMVŦAƳ/nHd#]?r˶_%KuCcIO.M= z>qJ0j.|g8}H,,K0E{B8~ #6 >z?6 Zmj:|ȚwO i4 ^Ƕ@៛Bɴi4h;-[bV|٣eKlLײlisZ$Ӳ%lt'^_^#Vz㈶fMV 8:&Gq> oq@RR^Zڋ_]e- ~W7(ǫaT9 xu[+iw!!_nWW-׫K_ ~u ~u-Ux^ʵlVeVe%^ʽl /[^}9Q5d"Ofʉڲ:hȉ, ?rJ9Q% Tkϣ_i=O=O˼)𞧼<_Cm_OLoV{:XȖ\GTJl#g >zl_+۾ܶm_n̶/W}aۗ=UO}@dM]s ě8| Y(NG[Ho#GXOw=;~@l|J1}FuC2rv'GX ~g3䙧3O㙧x3y<3yx<{<4y=Ly:<=l(lc~iU:@8kroaRgͥ*DJV\lehTuoƧJcw_BuKUWN,GXƣ7 7SƣTe7 [k-z~0#U3K&RgS}p]JH3j[+<.!O3uk6'O尗7E}ה>L[ +/v;: >AF)q}BQ'oU4"}%Uekߡ`_ʖOo]6\J3/[3Hֳ11CLRؼFaChaXͶhU4#_ȟG}.RC9'yY!I53yi]\xkk;!kHugDZ -QzTKuHQLm' 5g _,%i >zWEipGu /6nBfe;ֲ[M{RBF#Q T@0l36R>$ +;Ԑ-uy_?{օTQIek1Vaޯ!}u\iirJ޳|-\#2\< > W< >>jHur۾7}m ۾ܶ/lm_nol¶/oۗ UN|rCPg)qj*/@ 7o\冪tϻªUWa`՝7Vi(&~O8}zwx=_{a~)G9ԿU}[ @q8HiS`ax5+Zö ̣d#>sKńspJ0j5_U:EvZVeT/vҷG Z D\Ԑn Q"e|MzGF>"AiH83M%礉s%8W&NU&IgIęil&Ζ^M7Y=q.8Wsk޷sY=q8[ĩA\M'K}PAu=O^CkƾR`hpciE 2Sxm<'x2bɷ6Ɠƣiro!C.C>B)I=0d*!g7K|ւ;WC͉IY 3S#@ >GJΐ*\O]p4Ղ3mO4) <#!U8}4F|OQPG>EAiWl=(() J{C((u;ji 'a+h|Gt~;R@0bw-+d< E p[wISrԵ-"O꺭R3gO}-{j >z_2r5 (| չ%_6 %fQa%\y~ϕF+^+#ʪ6~| Gg*}\_y2n.@ڮrCqQ(" PE" To?mMD= Ԋˣw`cyifof\%HkU@#}pm۹1^Eօ~X&;o6åŪTׁׁu`u:0u`:0xu`\n Nݖ|H;S8uS8uӹFByԭ :uk!O>^jinQ죺G 9>Guj >zO{?qr~OжSZˌgV4N(>'yI*|Ȟ N o!GOI^j<-}a%CjӤS q>@8;)8a&$J +#7|^yi][%a+}޿&O+mW~;k3|zu: 8_xp[8|p_՜a% h 6>'sa.=7KUO߃1jŗf ~Rk++ͤK!5EOnk mЦAʵi:OkN)6] oofMk06 Цצa$vۿV$(a_=ەn(ר(3Lׂc>v kU.(;b6:2>PjE "zym/c}MKOJc+ pby'ꗓA,昐9ުhĂ4{Hu@O'vOh h Txmym<*?|VTpNxkR~W*1+ՃO3g&rļm|f2D3g&Lz{۾Z+OSϬ Caw*y +1{V~{߽߿;~? ~k ut ߬?|? >"tf׸[ >{HuKIv^om?˗ ^o ^_27ϩ\\D I>|HsX=)mB__\Bj $Ư/zHρSdr m@s]j>W^#RO 1m>H8tĜ>Z"CJU>z'o{ M~M>&o{^*4NpGX__{ܽ_3~{rr~ޯ'fI#7v-]Q@m8|C" 3j!5s`;Í;bhkVBkQuFNED Nե*a +F~fFӀ¯%t4S&440|x\[!3NVc| c,l_[i"[i [#ǿIj)˟O.;м=kxp%[,Peq\ْ$-af#C\h0[kNVOPĞR71FOR6>5wA s[js>M9H?̩aYť*R3!3\>('ycF4^"0OO3q_ .Y:y^K\vêF <[~>w?F?6{&2n<֎j.YsڑY~5* 헬E8˲GvC '2X=S./?X۰ˈfh7wC͛˧e\vGIIrnt\b0".C"ى.vqZrc(2{|_*ݲQPhuzG%>uڥ6lk.2Ckɼ"XEnlɼ{ɾ,$z"«HU$W}2KZˊr<١8D;@++-4s~ɌU4֊<'Ә` |[U,\A)05|ֱ_<ٷ#[)6&knqۓd.eFir 5LJ]0Q6/rl]j1Хک$^}9뒪^ KtDZkwj%x%[v烙IvNv38q.EhsqA%WL*(ץ{5xJ>/OnO-W+H}C'g iT5j  ;~d2gsZg> J(^/b2Hv<;$^MxM/Ygal^(mpT^'p_`Ip%9K2KOe/](K'tK%785 o]pFR\˔>OLl!xJ<54;k(?' @D?ؙ?n&Z+r*aT_ôZz&cbLk8WN i_] :e#'o  I *wZpi | 蘆]4oZ)~'L>dm<=pZs5F~h/] }VģbgB+o ï o 'V/r^ŪϝX0AFCRu-|lw ^˸I䙴t* ߤ^2]74$ ^:'nz ^OcՋQD;py&E]z+yR^:tc~ ^"~Aeg B)^qyEIf~?%jTl3!&Mۇ`%H kUnVHHG  kXpDV5QsO$ ^: kJ M"?>qq.G/ ]Z''F.۳2Q7KMǙҢLh~lF3k(6 .FIulDMu.Ͻj6j/ت/ߪwV]7F\[u84}lձH#1ʅ婊tբ;[](V >Rb.?0TP4֍ [B}|{}G}\}Zs}VBї}-%Uo[# ~ ~_~}o 8Z뱐QBގ y{-Xȉq۬:`YU6folVͪf5ج:U&[l* !Fy Z0T?Jٚ*`̧+P,Z&lQ6hpZsBEW |rjF jfzW YJݏ8ׁ+c+q~ry(4ԷC1p(Ƨ\Hv(~rg\zʽX\en-5 #vțWwQHvj]$8^k=L/]LPרLpgLp?2C(*6miVO@ ')19;-xT Ozd@14$B*E/EOzz=NAڝhGWhxu+oVځtiMvwPԸloU֜hG1B5Q 'qJP2y;RHρ6ά0 x8TZ?@=cu.P d~x.p{~,c+J5*4[q#ΛfL[]q/>u#6΃ l `uه.7:ɮ,%ڛ]'?lօpkx=9.5Xk:pZ!X }x5.5ZKW'q8e#FUj8[u.|պv$sA/^Ї/aAkԱ|,辄sA/\"^&]p3ש̟fSWqk$`Բ)>SSk(98Eݰ=F %y{t~AE1aE,BQCJ$Dybԡ ]D5&.tDl~VcK[0AzUia%#jR)0Ti oZ¢R jKRr ]ctkUM*_jc[=S&M[ +X Fy>5rkTqE,eij\b d.OhA׳A|n+[z;ףZ@t0}CD_+a%z{^tI~ q ^=a[ =˸]1Ta˹9gav@*L!r2N 6nr0 $ykCMYUC*iL6${(az4^P*bxD J"9ڛ%+'Gy--Nx}S9 + ϼOxOxr3n)~|Z~T56R!!rHe+j69DSQ/di` xyy/*TԩgR?t|Y:(UUJQB)VPF _+5bWd&HolT&ٮ36LY?e\ufXMFe /D_9d+źX{)<]Irͳ<+q%dTORsź]@/GS,L9ЮzE1_Ž5ŽgH y> qm'VߏDòK1AHt0mDۥTJt-kW:L !uO T35Ic=ꖔƚ{jChVH-s[irPCA9C=PCQ= ^}RxEAygx95BBx76o1:t)4˸C<ȩ#y+ۉJF&h;+M} Yr`jҕ#V)v<I-蠔밼]QQ_)om+劔h.2SӲJ:,eŖ[VOetXbZeY-$~bYKK.%ttɿ%rΫwz};w^:U[w^y rF=FܣAsZF4~FyF9 Ѩhc4OFCvF!<rh GhGi)|y 3R3p@уר§]uW1xE+jtoq>$i/EE/i"H^Qv(ҾU||'Ռ:veԃ7!)()UD)BS 12qcGdވ{gyg7T3\;FL:L33w&ޙ ޙtޙDmTx0H5^Z}G}^!^MYìy↶QYìոjY# E/EGEo+rXcE+zuX׊Nf;lE'٤SCX$G񎩾Z&@c9Gx88T%Hkm(k.!#r|å"U mP/(Z ESv 7s! ه.1?~Q1?4)J/WzKJx?JWzJox?~~נ,;EkP1(u AYנ 4נt $@mg(C9@Z`b|^N Op R?v&\NoWkT/^8 +ى0t/h'Cבh>q/<%Abi"GY 0%/<:oS!ǐ/5{w{11'p&5YU8_B#>9]9չ_歸+D_^rL#_#+g]9VȕS2rJ~r* oC6d9Dېi2 !CmHچHm6D ~OfmۑK~* ~)1{}2-"OT OT >zl9QM*:vQjqD 8JH9lI_/B^>ͣPЋ2~اY "kBcBC4x&SFF2OHrOH'$bdЇ"!"8$05C 3\CƄ5}{J"t :D*4[r[ei>ǫ8* ÿ֖o‘/6wz5;ɇI~1;1;kvbvcvNҥB?ХB8Joq^G8J}ߏ(]HHHPZ#o"Fe.=EPK8颕`EOQȠy*F$;vp;~ۺY>Qo{l1DO\@3= qo|:=IC1g|JT`B&^qjr N$'r32)a98g1J.Am >{hpX/(:\녯 @E^/ڱ^ + W' /4A ˞aO㰧zS?쩿T{/{=ÞOߣy415Σ<Gߣ1y4:Fh?.QC&)& {%(Aؑ|#. UM ۾ܫ nVT>hȭ/rYkmϏ+5]k~NDg>GᯏY3O&Μs93M3_O9S3QOг~\gAt>si?R`îjm}{_}½/?[ۗ/lr۾|km_޶>%0Iq{JOϺÓ%VB%ulf2> ߼la+߷ GdcQg;M밯jv݇VHP`|au? CciJeӦ\i# 8~)VwסO.jV t>G_/'#5L*56t~=O?zO?OSӏbj {|F}'ͭ4G dӤ2a΂.U V2Nݽ߸~{r7v~ޯ߸ۻwҥpG1QKR8w@Rxj NjKUOGX?:{C@);߬%V&7wJHGOoU4<jHul+~n6;ai`U/A0ZkC??!ue2x翿mi M@h /oU4w!guYkΚ|5Wz> t) ??Y| ?t*C#|=c  |:Ael͐J@:jjh?\B*$yh(,PvEiT6i̙RARHflXH6bKB2UAAupo,h9:Kl幡:K!eP&weɖr+:zߗ!pyOVfYw嫯k.GB3 a髒fvG]I{.4H KR*u?W(:dD@]7p-5*Ѥ' k+͏\hK&-NNw^dSC"˻&MdDL2TP%kBٖvF8w=;g[JNwfș]6GjJ%*y%l/Kw%`-1P~Vc_VC TT((?P5K(UYv-62L/5~m&-B|U*G([ԝDh?O}D'/O__?¯ G7v×7%`B~e"?}:1H|Wt^b*~}s Aoҷu3]oQ?UW)"藮oyBU~˸.Eu-آ:w~[TآmQ-s߳58W?G}(tݟ?|M\+Dj3'f+?>4POT*CJ- ,Y%|Uu͓K-aVއjT=E#s M- ~RQR CLMYVv ϘA~C08-yl(RA3m RŽ7%Ғ{)-wi`RNmۄ-= F~' g{` #ь'޴> \߇[YKa(gVc頄3\jGGy+Yɸ⬊6"{x$*68a{mM*\;b3x\x:/-_Q) hl *VSJOGTzduX/9#Wcjf|IBV VNym5- ~`玠R 9p6Ev~?/uE/ˤR#|܀^~/|#ܵ?k|Yc?8u'ϺuϺgqϺgƳgɳYwgG7%d???Ÿ ~m_+W۟ "|}3l~m1?]c_O?K } }/ᯏ_~E# } AJ0gDdP3]f(lR`S2#$49pX;D͇2WkvX@(Tcå| &_ʵ7?Z-qǬCe=mMGX <M!d$B)I]!g'+xSԆK%ۨDz\IbLeP«57- 7ݤv^sp jR㻋h@(%(i'Idd5BZo RR >ab/1TQӥOf<럆_>߿_~ѵ_^YDUMi2_f,K>|k(siR Z.KeOMU!}LJDkdQĎݤ a*b p p X_Ėw7y i*CWQڴq d|OOd<;xO>9| |)Es'So֛}r%*÷W>~mgOgs6>Og_'σYAX_ ?1 0 2 0r~/\e헏_˻=p/q,\1oQrwwc@Jn`K^&jE{k) 3ov*+.]1|we>Z+^]tWH8-8"ٕ{]=&%-}普C;綽0J;uc\*Ǎ?λUEݦrVLzz S_mhXTn2cQ^Fr Kh5>ef62(:4-cկiA@h:dH^4qi"fY ^W\j}zjMK0QK#{AQ g?f$y_\'~w֖1ֻy)<4| >}| >|"VSx)< >-ؾ'j`lWErM-e[% lzc%L3/{h| EC#&zrJ,U#3x+/xT#.\jcV.;5OOHGvy<9޸I=2-buRd/ˇ')ߚz!nZt+>-bOH_^~׋^A0|)%K|Ϫȳ#%قڥگ3GS4)EfLʵ4(6j̫Ǵ_\.w3RZDaPpooaFk@ũT>8@@.t*|~[8=gkO$m4oN EgyTH힩RzfZ`=KJOqZ睉l1_ɻۺ7>!K@d|v8ѤE|-c_4x 崚2x?fR0J;]~*9Ϥ70RPJ,Z><gSPʾ@(SE.3}_or _o&|vc ~d@,Q> M$Iwy\Xt珵~?Wi̙}s_"yܯS p $ơH #j| :ӉDOXZP.qXqF̺Ь;=nukYk֭gMH׬ ͺ;Ѭk<2x*ȗDS3O͗L#ndݥFd<;6Oa֏K@$Ram[K$?Ow85.Oo_?o? ɷ:>N~.|W3tF^H&U?^|y>ίDU h| e7Ň<|Yo Q*h.ᇌ|TڙּU2iy% |˓v8%-VӊSBiř`6Zqv8kg.ZqN+hŹk)𼏸L[ic+@tvx'mS.ófQm|5F#O瑧#OᑧSxiyiǚe|;L d/184#^M27&X ~䈷&ʒH%ɩ"$ɩ?jJIrFIr-I6>/Yioc>!"5gQϘ D_T2So-:JTJ2v<{sDe-onh+7%~f? ?>Ϻu |ͺOZYk}0>eu)bLu<}>0g ~3Ynۯlmm޵_pֻUz~CYo\kk dGԹVŃSuy @dn4}ƲxFK:b\ow9Osy>i|sJ~T1R+RA#|OXk~H#3%Ih !8 ZQL.wh>:-|D:Ѷ~ѶNGhgh8!V@Me߹]ksI8bcنw3YKJeKw*ªT!d|OXk}ӵ|I*14 >`c| _KsԚj`>c?~'5h . bYËեfN~Z}E7R*YS"MZqv- Tٔp2gR0J|=)?;R1tH\'DtGjܑ w9/wJ95ӊX ⮻뮻;뮻nzwubl<6ƳxmsYr.#hCXh<>S Jl2xz'6MƳe]cjC\x(S[pR#LZoAn3v߲uRݷB-٥z-i 88굈q"k'~XBUE\˕qqRNW?G#\I<'\2Z:~RA0W+o>v-=j~c<€@,g#yT!~KV:p?R#] ~VאA0Lgw Ĭ I$l^ kbz7.gOp^d,;o;Dpq?aR`(=hX#|J?y[-0>Ӆ>mPJőc ڰ}IȢ2ҭPA˂iwLS? p1>K{%Vx5l*恑@1 yrLֵMymr;/?ve7yn\}y.@\DRRDrWbJ)no'4BJU.)rSM1)ƫk5f5Z#t#txu]c|k.W? `_'~2>d|?Y?hڣ=ضN۶flklۚm[mm۶dۚo=tW3WXwPV&;`Er_awlڝ]ڝjjwjwޫɫΫyvv'v{2Oy3g;ؙOHQ0m'+ zePjMҡRcT6tRT5o$]>kIҥ(IrgPtǡ8-59IzVGXPzM3L;L5=0=0=<<<_ w|;>(Wx>|A:5Ak\]NdH#)ߓnܤ Ah@@HkTϽCh !u5^ΫelA[YADz A,ΩM2T*)H㤁7.L _\Q>U?euI߲Ϋ_Q-)7|k$3G^g~)J>f]4鲅b]H'V]Hbϗyz}2i?WtMGwx!HEW .put䂑etVUu,d0n/#W%]ev?h_蒃.KK.9蒿L7A 5JuA \#OUj>4 8U!vx7R^RC)w)Ky_ʫ_J/;lmc=+ XOjl|~.BKv9qgJfGc Hv| /繻*XtKma ܬTt]W Uy󯐨U(M``^p۔=oԘT! }u:t6{=e_u_}|["K%ƚa%$|^^u+U.# 6_h|BT/N{פ aDxiK5b?"4b;?"7DCq#OwDn a<ե?~w/kεߵ?nO?n?n7?n?_n_ng_n_n᷈5aGXIkh"\P*Rm]."[m-.¸7K " /{I􁏗D?+%9%ѩR DP^œ4 =._?'k~YcOO@,TyQ=ѫZRxUkBj0x*G)ES?gt{4ͷUjzvK|N,*KWw:tx!C}o>|Cx!~=|=|_=|=|?5Eb}lToW_o_oW_o5ZҷyІx€ ZJ ZKRl̂za+%O緵.Atө|jSŧOM}jtNMwSͧ}j*GэAx7'FQUxc9.Y!f8qg/@A/]ҌGk⬍krŊ7M4.I]k-4e ٪IEy%Er.E/_u>w"36v|ac-}Jkk鳍M oK./K˓}*kۈ\N?&R >c ױXT!H-4CR dm'(+.[VJUN|)|xvˁNpl2*/*r0GtGD]J5 *"/5.IW.[0+9yh]M?.;st| e6F;Y.{ɾl 8.;-=K/{/]( ͺ Pt9iv^ץ[TXX 1.+.H,>IoicKK.%R^R.eLӤOb?&R >UCr!$XH4RA#|7mgx8_\X{5 2/?MrR%hΔGIxK}0ܼ7X[Et)VUjttITHv33mW&' *Ҟc&o*tr*JA,o$].r=%'m1څtv]Fhk%Z`u^b.&;72~|uKLnVUzW|)Ѕ %dght䥚pG]JgKK䕮)닝s=xPUdI>ޤ#e>C-RM I91?U.TtV`u^'R—+1Hv5KmQfllllfllllwlltٮ8detAt/]ve]v~r"TO?KZei6ٺcR퇊٪2"+e ed/d%d.!/]R~ /CxɶY8RKTcxx.[|v-rހty>S˨.NJ4s\ J٦K9~x.;dur»e=)q |/»gvJʁL}5q=i0~[ˁtjEM R*&kib^A(}`ICR,W H-4MW˥>O.Ϝ ~zH[LbRyAer.{egw.okЬ[$tiwS4nM(MѸ) 7EsS4nn~ 0~ï 3~ 2~ 3='0oqEK7LfRyAlq“t[ᲅ2E"'H}߲&?tjUX>CZ*hT?8[7y7)f*ΫT2hRqXJJXꍽ7tzuA9Wu ЭͩOi[p]>O{>>7{>=\YmyM!o!kSmNSg2C)^t(/,OS/6ÖC[<VoLV*w wI^X*I"!.c(Ū\ P"4y4$|UV*h9\*'$qvTSH-+&Oֻ tҁ :oߥ r-v7[V!'&޹:KxѦ}52B&X0 thÛѺh-6ub3lF2،zѾ;ϯw`_WW |; |[~m9yM,Zk׶?'ΫTyJ{4q*cFz1 ۥ2ZZFKiiQXZ<|؝w9z6\5P?(WE3Ueմ4V[~XK&Ȥ||ݒkljTʴVq}hSB\]9и1AJԸR͐cS;4|5M1CSWSLnM1b~)dC! Qi=RƴkXsU&ԐPΛ4Nҏ߶ܗ.9_fR*l|u^G#wOI҃ |rPcŷf ʹ P*b|h +PsN UӸncG3}z?tUgRTV es^_KW/L8 5v ܤKM!)*5WSxC=035EWS<)Ejljit{(()jhr7EI)JhjMQRhj(iIzUejlV6fU٬mV*Y۬Ueoo6I.} n.)e T+0+9<5Q_":r0 "% l1>cmacvSyjh3MR $ II=],+I- LL_Pv^RA#|5_>-Xd}lNLaRyysdasdQ a:l+ǀI3 acrҬ;=V>cx _շHkRAcɥ*|9?uĬ2n| T>t{Tw4oVuX q i$\M)RAsSGi!'8z$vg%Q4_TDd=X+x|WVqpxٕOoW<p]'*F\Tڷ161!H L !RIYuk UG1ˬc)Kq׷RBrjU#ZL]4^n^2YˣMUm3*ud_fV}f5rEͬt&ٿkLKiϏ'pc źXTwENټM6#MPvހҥz!t z?]UayFZsl̦冾 7_҃.KK.=]Rj,y{)6.U*n8d_+o:7&]u2K_z<Ŕx|2]?XW^*KW7lJ.ˁ˞$uev١]]Fheev]]vhe~]eeet IjRhjkyBXK.-vqހ;4*WJ{vUL| ']z{v&U@K1V/~v)lS3w<ݢ.(ΫT9|IN!7eD ajd+q2 VE{x9|'Jy| Cv8銇K-o}̴c%2#~!36Mf42ȗfɌvͨLfTˌIdL5C6"MHR3h\P*R~~ɚfIDw'ه2EW,܅d;|j){=ދb61#>#x>fMiRojTl685zeddzPBSAJ5⾦1qw$;s`^>5{ w[tyLYaPY!p^":ݬN6Y鸐qG]ɇt| \DG^Gw+֤[d.r-4IS0]PKr ZqDK .'ۥT`͂Oӹr}Q)4uTSRhg^W'.ӎX#8qT8:O8|Z@8=qT8hjG牣QPa絔TrAJ~hy[ϏzOVCK]N ߾>o ۗGW-zXꯄ՟*W-JXꯇ՟ܿSSO?O`Xa7jj)!KHsƊFKa&.*;Bk~>~gWdD-uDGYВ!)wmZD]#V?_Xkܵ?xfr@Ny.?=[R>(Lyz.>{.>c3gr>q T*3gr>[|&7LΥJf+}_i6|9+W4}Jfy_iI聕?O"FB(F&D 8Ftm9ͬq4kkYco}\g/Q Ъi)"ݺ3\.&UTMhP ~4yVQsG|%YSa𛕖g,VaT/OLk0SKƢK}?u3g] {tmٕ"T^P"xb0<. "ZHQq.5 0 0 ĺЀJi4itP䲩M65ئmSKmjMM_mW%Ȓ' 5S>wJ_>U*ޗߦ?_Z 4Cs>]I%>B$҈(Ȝl|fDķM }kz y`^й̻,@_T> q- > FrvOUy0Tӗ^{x_Hx[ǡp%٦+dlBze!djBfzkNl5LUgu̿ӺRt7*}D%i*}y*=.[PwZOVx4Tړh Azh ><l[ˤ ATЀrdM|:,ym~ > 4'9Gd$.{@#k)tJ.nҎ4zrYlnAa)Ml&;XRMj"i+Eh9NpGKa'kjSiv0.+4U*)!y A(եF9_&+/8gsB[&-_[&B.U?Xۓ;k2GTt @®֟el//\IoUr̴#R`\nsa,jǢBcQNXi,ZƢh%6EEƢh,j5D1\8|!JK2u_ k0psf-;%(Z^ 'jRX5O+Q~ט|yEKX ~G͟=`#8QւE&>Z&۴a}k9GGyK¾0Mpy]'~;L^MWd]-eb>%9cyH =씡GtP#Nz9P"xWbE^B҂Co1Cz`꒬"UحU;k_yoWqOc%k#Y kRnR͖M)k.`&5'+4QrlM|9!Bbq&a`-4 VXap2< Yk/Ye| + Ko 5EQME_F?l^>5U%YI&ïJvτbOrdƘT!>J>AX{n(an57/W87&; c|n ٦7CHW|jʪEEeM鲅 H9p7<ª<`*,T+ ="x|=HrZ7BTn5n-nFn Vivgzngʳ[}n#ץ9Bz:`Ǽt7C""c!/!E/356f4n3lFhf4ٌѸh͈5oO!J?3 hR~1L a" Nk|Qb##87 d}OR-O֣Ejԕ4BVj.˿ ?h2hdUfVʑd[dtZelH-W\ælmVeՉZsLݕ2]c-:YlEtar'a|&٤>HgSUF"gzCKL!C>`| zV;.j)43~J,$s^fkI$i<;d$ @lzpRGRgRkHm!yCC *RgR7t4DL.dJ.ZM='d(Ab I&:(|PQhq&l(fVWf|5wSn>i_b3=`ʝ[H+,Uz âjNv4V9osg4)$RU'j_ MP8RU}J2rCpSH)OJRBN+&m.Wŕv^JiRڼR*^)Mߜ*.[)uM\M) 7EbsSdn|7EnM)"jDf4|j2bMwvfiVQ0JZ4$̓$yJǤJcR)ט4IИ5&BcL4&rIƤ^hL5& }'S”qB_^'B 'ӽTv8GT N{8$i"Cew/k|?޵?>_jBqF7{MMt?qI7}M~g借/HW8} O_㞾&O_/˭tht:tyx<}b>0P4Lrɱܲ WtD}.1&ҊY#@cKkve?!zU*3"[#C1Ϗ?mK۟mϷ6x/hUZ{M)ShRڿEJ<{ܟܧ|gF:N h_wJ # 5 /+=b9!<0B@3mR9aIxH,*YYn8%H+;8+|v4$ AZT0/@jWB40LoMs {}Ͼfߚwe}Gw4KPY` ŭ<˫ZI Ѫ7?:>БCirEj!RdsSli2M4VɜJmZ6-,ܚORC7-HmzTc')[In+uA;I;M;ɚ*v#v#_SWT\=*ԩ"=,PxT,ǧi*5K;|kbwRT÷{*Hߑi*5~?'&&H W8d V ߓA d@bMsC q.pPRA דDwY l*K3 8LB50>46v'ݰT֦Ph 1܉N>4Yg`.ĸnc`[Z mY 5\ɺ5Bp DrMnlWFE|UW_ՏUpRy O\; ZZO^Y1=IEY$J@|W*1å&v_ݞ#ֻq/w.QR%;>%1?m<_4x=00xD*JTyj4xj<XS㾝|;v޷yķo};v~xk\1AAfxwBf?oE%dΝԅ'ۍ1_pWs A0|JW}Jw?)T!,1ߧu#e'6^V\jmgŇhER3g*Ca|w/6ÇI8I5< @B%Ϧ seR0KKϭsMHHLrVRXNEedȑR+gYKKiR~р2CN ~d|ր2iM)sc ?O@@UaϏx"!*5FxΚ0' e EhހOC0q'[D!P~r V֢R!KiI-kRa|obgsKʶbJK6:/U4m5ݏmt<<жK-<줥@SmqkMkѝx-עעעZkk^>:qF!٩)`4"zbkz9ЅWyDǭydn&IKQ !UT[>g$%+>%#(U>X(RC 3>zçpn+zpnO.kR^E)[cu3]#L<eZGE#PN4t@9hj2@34kdO͞BZ)S(ߞB={ ShdO^Kr#{Jrk[Dl מX قDR 4U3MJ%E [F[(Rʥd,aHFɔXgQ @ZCB i* Zz\顷aH>i-f2X|&r:" o.񁠷CD{R+z@#|5k`6fkl[]UKǎX ~6^k7xrmvW.xB/1Mjxm<6^6^Pt?@W${ז$$-~"n| n%d˥K2ߴu+o46nlJ}B,QJ\QvOU?4UVvUivʱo6/>oùpnV`8W6 Bù\h8'uN BùކSOKGe'Y׃M&t֨#/|e r IR? [<\ԯʳ~SyW婿<${SoI"\ovhYn| v8[t龽fүXH..9As&}CS_;~7VV> *?S!4sH&ʊ D e9S?JCgM)viϟpm8|D簧4߼5!7_ CMKIe]6pZI.[+ l\e[\U^.>~<e,Wk(f[I;l5ml9D37|Wm=1F`~5*@n^pmnW3lZAX#fz8~_ԑTfjU$*C-+6/^ O]=6c 54]ᾲ[5]-Pyq7==: Y+֡yƲiRiuh=b̗b=8 5f@ů[Znd~MO >b_=I]6=I;HS@?R*!}{rb<1S_:H$1Jf5Ɓn >[jAXoq c\5\\=Zuְq05kXkX5q y ku\z^:a װ05kؿ^ik[Ǹ[1C3M]{+DSGp~W|AP zeЃhAP =BeݧO_uP)>}}Oo v/qSāXfxZk \9W? *W|וnV![9 E?=GzB :k(h9u{M= eopE*]WY /d oJ4z÷ ._Wo+++ @w3|Fs?>#|_~O Ÿ)gX.5nk˞>t#peO2$Z f VqG|Q7 -=9Whv~r\u`ų?4}kL<5aU ?veb3>*<gdg|U33nknknknknknkxﶾ__oׯ.yض̞3J/m-BwlBF'\Jpڂx#^jo͚pFSL6SxFy!P~9= */=MjV0(k//+k1,x z[ɨָ'}ktõcJO$/l%E`Tk8|- AmmJ|kkh"@[PB_Y=)O{K^~kA׽:J?Sov AXN/g Ђt7tZ¾@mʠǹp=ŋ7 gE)r}g_MXcHb)^X ť5ey(R\eSpFg54"+6/V*"o7+ݬ@ @×~ :zKw៩i5~^sE韩ƆP.pk<3Py8+OGaTè< TFJ|3'+} 0 ! 5^c`[#O46AX1=Va:+iu6 |tfnݹ|f,xT5͍wbj~DEwvLk|]1Զ=;ݢQy~u sr.cLe%a{XGm:Gt5G器<3 T3LT3*D?UW9*|!Qu%TNQs|{uJ&^?E+__n'_e O|Mq Y@_^W?K>O%bdY2SDiYjf7_3|A "|A5o"2;o >̌} [nw~{ç @wO2|BS?>!|૿:|eKon-=_HB#h-L-raj { -[,}v'>ohgJ'v_2|A 2%N/)_^k|ݿ3}v'+ ~E_vo෯7WmW{ px Ovu9k/7?YfzI_G ҇gUOA˥//5I_寣5g֏ʓ[yi4pfuK. : vsP.kn5+.[E˶ect8l.[GmeVeo ?# O1_EKqa"詺GYC˫נ @_BͯP~3 !{~C=g~)q``˞n{,xǥ)Գ];.{ ]M!V->J?o[n㶅>n[{R)>CϨ[>}x7}}B߇޾]bNC!!Dqŧ136A(!"Cu>cA^\)q.m6ï8A {ϒ5&R?:(R(_-ފ  O|"o9NFÉw\;.f4 ';pN4߆sd<gd!T3 TBYy&*@on] yhf& NC34í%IopEh8Α 'h8G6 'p.4 xΙu/BϗDR/rt?_1^@&_u?_-E/>& -P+K1e,}A/zK+|*_߄?ק)|#5sT _~oZZyPt`,,X5FY`HƂp5= XG!Xt5[M&})YR1 H$QPR!%K[S_UR+(i+j+k‰(o(/(үY/(P_YO(OQ=K{>;J߳;Jw[ғ w[{~gnu~K?< }BGC yFy<>di?,D9 v̏s "<t_@K/u_P'$為/ gGgrsr_pN4~zïoٷeZ*L_zDoq'Ń;s Z)\?+f|+ X/lqɩekekkrqe)?Cv?tuv!fx 53O9Jkݞhp5o98|\G^7o.QUSB_Eo+Лe[KjT$9E,פ8C[y ʣq< gPUh!o%)ϨܮS!VydQVzP/~ /v-!/֋u1^潆f. [D1{+7[0Q0DNkFiN44֔rxk kS<8kǣ<8k(8kqy\5LCdiaXְ` ;rMkX5akX(}F,(Q ߳Q-QY Q=KJg3JϤ/wubg<n |U\Kʍ _4$ZB| av_P+*}(ҷt&셥T AP Ao+th ۡcZ0æo(:IU=0 < ,pPqY@8 = ( h "Am}A z۠W7/Fkb++Ÿ^DC:G|5xc~p +ݟx\W}~|rl|"'ȗ-'~_p槡!4?-Y44?-gV4?-B.}*ү_O"|W#|Wtǻ"wE?wE7|+]oo_/۫-Z87toj]W[bUë- .9+ϧLOo)Srϧߧ|TMhh "w-M`!bz-z+Ot̹(#|Uǝ8W<s;_ ?nv9+ϧ䌧/Z>%x%xJ.\|W˧/O}JkNT|.EjV:nqg[yK~>H_k6ͤG§0ꡘr揄KiCHk z$\mzÿg|TUy*3>*<g'Q%G FOFs`t9Ϸ||M鏯җ_iضr=i i:kiЂ aZpI9zGz׋e}^"!ê-m8- h|wau?%U_{q-}~`__eUFK:Nm;WtJYOANOkM;V4 xzÇ\--GCZ· i9_m{ZN[@r8k.mz[eëuY貭-tj-Z.zl:f쬞9qN1uT6OeNCߣSa q+Alt1E|Qı^Wm+U!?J:oɮDLl%8 +z=2׭07 94X4h.j B7ÍI+تx6  ~Wx~ ·Pn7+aЕ dXHIɰ: d晱?aY  k/q ~UsVdVByg󐅶puP}{Ku>lU?qzoձF ˜4f エ"S:m(׀̕ޡV+nk^eQmI*@֫8d—pN ~T\AXQ1oa dϡxq<-> IHu!w(eᲅe>}~Mׯҧ_v5zjHڹ}mܻ5~޿56׀[KO 7Wm|^Ect8 ">ӳ`P8 8α<ꈥ Q*@ڭ .2[е0 :ĚUVnQoUPnqb.@'[CPnQo=F!VbYpN]SX n~Vcaׁj zOm$[ynWtUB[K8+{(7Vk3VW 56׀5F)@F! "BqH_k:6Pֻ5y[PP\T?$+J&Ўˡ@֫U:ks9~9zpgAX_[_~C-o"oe ӍO>efw$ $>et@BpH8=u Vaִs-Gg@lt8Gg18+QeNQ%&k߁x@(z]X./SQ@~B!V?G鏯(?>J|@鏷Gĩ;%Sw%#O݉Sw;3*@YyG_g* y<#<>@gdg,y<2|B  |( ~C-oˍ_u ~?Ÿf#D| & }>ϳ3Y,y<+<>Bg}S9|- WFUz#?3|F "|F3_"On_2|_/|/_ —O@+y՝ W]Uw+i|\u~~*___Aގzmrҗ%1ΙvyrZټzn~^Ctψo+Q \ooVVpϊAY4}Z ;Agݟ&WO5>%h_k}&c[ tVYߺ2 "[~E-'~{ n&j}']MKG/øvYkZ=V~54Ϭoff'̂'Ok>ax,xLYy |0|6MpNMp^Sl[uʧl[l}o77ʛEJb͛ŊE ͢vefq7O 3:]E6-#z^]3㼽 {W3z7AX~v0n,۪00Wtw[rq5ao Z,D#Gtp=af`<{Jvriw?\!M:zÿ/(}t);̂sEf,0d5U=OCz?lɷqb$<-ll&rMʃBm]6 h|_zQ2\8~h7~^Gl&͹"|@U>\w#Cui_i%/6to}ER1/3=#{+Hg(+qc4c}J<jgNј:ml1]tR{17zbn7++׷"1 x~y`+uSs {յ)Օ~ҵL54wp _5v9z4O ;c' 1M JW?֐J֐{hVybu1W^%cbg'鷃|,UTA2of#D3ßϯ'Ÿ?g] ?R#ASaԾ2NFkz@Ozn`ȹݿlY0q΂gY0q< &΂`Y 8 &΂Qs(U3/k|諾bmtڠ Zt5/kk:zO_o/_JO?7?5<_%<5P֫ߜ+Jp +õG77nap ҝm O`96YCY \4lG8tɘ+nVfT%xe3U} ֢-k=W͸fo]iOtE=Y?c,Vw bߟ9&ÇY%} ?Oy<:㒾=hSy^<7g~SZ~Ey4{ ܟ7;x7^$qh>M?\|(M54/~ߵTqgE =U+J %ﮠC^.Xb<`A"ѻ:65nl=MhgGK3.8?$XUY`W6/|pVUnW:EǢ0;)XM_ޟlynk2:u-M%3蚿cu\c(AX/zT <`vVz\j?''s4<{>ԏõ]{ay׀9j 6Ml.-j&C Fk^ ߴ[#CG*KKqVώĢZF 7F'<vX D|½G0Ҷr0ψ-|;WO@,õ]AtP #\z>o'V ~Rh5Ϊd:hO6X8^OS^8\h6m,s?u7`k$\:@@u::qh0ׁ^)ç+|BG>!|qCU {G@ֻ:Ykq=O6C7QR5緍 ~@tDohG}<\B;^̓sEV17_p MU+W keo'pQ<m9ނxR_fߌ{±xbuZk1ٞߎUSa܈~E~'ƒ&5㤞89OjI89OjIM89OꉓqR{RkQRcW+*m"|%> \ uړsWm |5xTɹN0 ;Npv' Bw;1ѝ`t'Np6&uIlR M*IlRM*IlR'TFo:'B#U'B# 8R>x"4DhO^ICe_cX#sbFc7㝍6^CtoJ reԀuO_oj1N`esp'93 {rdy&ZA3hy&Z-D3ly-D3ߖg n/[/8n`1~Xɣƴz {ʻ1g+8{Wgٻ]8{ޕg]8{{'a 77  + ~~߰oXo_?+Ήs\v.mJ mz=/W噿<+lsbU3v֍ӝ7E;Zk Il[ w Ki/X& jREMI 5IP$k&-$ɚTQ5Iޚ$yXZE@"p\$/E@"*.E@, C?K*SI?YИX/xk](NV4TҵVV%]+J Ȯ=P? OԟJR*?KVh_c,%w+Y<P*I,YϕX1nHYއjfB ~3UNk$ `G^lK:L{KC{ƒ>E)rt)0:rtՏ"GGܟ o+kѣ?Gu (yTG5̣8>q=xwGe0DvkڼC~RŹG,Rp~(.0wc\x\[h:v7uR0\huI\i}~ս>Z1}9MrE!3W<-'jX?uRm{mg|^t7Wg hW|}+0raGà>quAbŧqVwՄY]qVw=ꎳyVꎳg^pv#Umopm4oy4@-ד 2=~ ~9|9=;|D sѹ'\\ 7TI ?;y+WĊG/ o]c~5b05P3+ T+a86FqfjE0Cנ mhdkdU,sk2ǚ{ !x'FD_c?j:mc}-õ뫿V?JG>Jd>GDxKS_4Mi:m4}pxc`@t=uN݉SwK8uNݑK8uG;Swdwb;Нٝ`t'.# Fwbdwb<Нowb-޶[|hxJ1nmk[EE˷rJ?Dޢ@G|G;eڧ|q| mSc]7|@9zÇow,{|q ;4׫|GQClSW~ r d 2 2y rG7Zq }LӢ6}\[;Wg]ׇk=OM54JX~KSCLݎ+tL]nirte4u;SmYyGi_w5ܲӾ*OCioٿ.O\Ip9{ cY74!\E.oH\7F÷4 v7| 'yog\ѠH)ޅ.4ͪ]c ХpXB#Lt?9o${RDqF@ CqbA}:/+tT7sf}^aɋ%Kܷ|>$@ɋ%/W Xݵn| qW~OX::miKfgp] !w!?VUyo*<g?e2/PKūvZ6ݢ9j᳿S-RvcO 8tduyon[xGD)y]uY˭S[/^o/ zß\>>`҂v};Di۷kطk<ǡF}VE};iõྜྷvŧXg+87Eb {>Z]ڱ{c![tj/3]N-~Oqc&EaZFu54ͭh;\~o߾J[~(U פu_CJ(4k |%+cyVù"|{nnA=\wko +Abd=Ib -|*+P96*-Vn* |S(Pi鼄*~H5OMf ?%qAPU /J^CON8(ZUh8dGju3|`jr^G=b৩qNݞnũqob ߎ>8(| pC -v<\8{׀O }ʺQ u~GݧuP}BgC<}BCQ8tdoC0:|qv ߶j!?m+y1!v֑TKEqJV1'JUyosk~7-~䴎D,};zŖQ\/ҟ W 1+x<^y/J x汖@?NY̏962q Y%qS^ido#sA |.e7>;~j92>Y0˝Ý·(g>r>Y)J"y?XO١"3NHN)n96&> a:+|\)@lqp?nSobCfFAr^Cc9X-(zXi_9ޥ7{q§Uz !\Aw7Kɸy,D/YI]P-tF6~^n/q5>/#kwV ~Nk-*/inX{;Uv/tIK{7LFÇ־OFf'-=mٍtc=/cJx4LJN<{B˲aBy8^hEk5ъk$_*lk/S+\-A;x(fP{'F$Z0z !_o&soL7yd6T'=oB+0zWrNSz~Wm:Q!VϯO_>ͧSSO)O/Lj?|9vl[rlǙ/c>|NS.-ь~^οK>+xqϊ^@nYLutf&9ay E_I T FAX_ /C=stcs~Ӕ+x_=cE%BM-v9Ʋ p,Ğ/~ꥢ^i 9d/Ĭ6ݺƢgpXkkk|˙@k{kJ>~h/Xt? Cqmssm6`޻a:6,} tK:Eb(?j@jd5@ D5@4?cs,OE)fY3\0BD,Bd:mLYZn(,Pa :\~֍mβ!E{&\+&bb: FI7ϊXfe=0+ F&̊~tl` ˴Õ0~,Yaѐt 7p3n2徱\3zwNinv7v4 of^Ct0J96ńсiJռJ3/YB.$N6C>$}.( o%K$KA/~+Y%}Գ\O (C|t:m_ )]ʵJxc:'IvY5\eLXtY1X RjY-em%qY\ֿ~*}MW_>_X>CN_*i\Q__{~zr=b5v҂晴tj? ʡUU*v]Ά®^h]9 QWݯ5~c=׷׬ׯ_QkQWݯ9כ1{v8Xm9{b`\o\Y`\ƌ\_<{3W鿦<ψ$K/YO$[I_P/ }*7VSաbV~+KNUQyr<w0õbK 4;'oŦ߂.icr6ߊM+>~ ~1pyp;CҞޘZ 1hKv%{zcrmM^Cu kiPK` od9 #?T_k+jG )wwvr`K0NN`'НN;κϨuw}FQ9@g}~swd=(R~[1:eZ*xGr}{ռ% 7eX)sQրqx/yfFRMR[U0U4FX/O<}dh;ƺV7v*RKG{Č~X#F׀/a`{Whj"W7 cv7hT%Wm~뵯 Ň2+k_T+Б}M2X6A{$@Q q9g0+K"w(sor}{-KiX{5: ڒsZ#79tdO +c?j#@3V>\~r㲫eWeWeWÊ@䲫 c':?eaKرcx2xv"}7[H?!šznsdc`~cxdE3emȍWu a,I5VGbcڈq0z 𠠫3݈bbob7>)oʧ5/ЪT} 5SX/ٳ*5[JԲU0U4FX|+ g4[uyWiD+z*l:m㔰c=Jҩ@}r:ĚCH·h oy uG0^C$·@t\Şݬ=Ŭk|~;ð etK}/J> o嬞 90ץb"([°P\ūCkz#jQlixw:mnqꖃмr6H^Cy|W4O27,Z1z9NiijfڊPn69KXk,K_cX5 _cXOƲoF}U0t-xWG tN|]LM:\yúx4OSw9x[p'zHd֐U4eWm|54q7W_0SSI~zhvwp{-q2Wb555zr & G<<{"k"5k"k"k"oK?O1`?̟b`3b⧘?9Dק(V _/,wZ|G9mxh{ Se[pٞylO\g^'.홗me{=:pdWk"Zi j:$Z]qM55MZk qɡKν_Zs5R#iiqzƅ`;YN1e[i,vHP6:`kE;C{ᆱH6PZ̮(j4P h2Pm@ (y(8T+* .yV,h%͊VpV,\0+VYkV7|nKCG z]yցG>iPZνfnW!_Ф7$5IF/k@g/f]oX_:Dsa0^ws<%s.޺K8 hW{,1tMNᘇ1_ c0O:냎-u~ѱMt^a,X~m,y,V-o,/aְrMhyקhקSקקhקhOѮOQO^OѮO~)XK_c_f,KXO$'z&==DOи~"Oo?2|B)o>e§ >!|%vi. _aXG;t\6Vp]}(LwҟXfN*]6@0<y5jcrylw|#`5m#ѕk˖#04+kT,+#XW,r½Gu9 <sE>`Bp^CS\9k|a 4V9LZ5JpHPiohU[6}0+&~_a &~į 7 ~O Ÿ6DΊQok=>Mɬ~>yývugv wxe^cYXk,˼2^ck,K_ck,n~iM\u:<7_P,@kz-fG*=#^Ub0ddىFvd#Khdّ@#KhdG6@#;F߄_E5XkjeJ)KQҧ 8uN]Se.8u9O݁Sq{+uw#RګB۵~1bLWԻ=|:coZaO5oM#{8 q ?TX:mlDٓpݍD"q"Vs`}ъ꣈Pf]gF١8Hj[p"fdI!Vw'[EkĔix;تZvs6&iI {@EcWm8|}$ RKu.{흻sEnvݧrsټRbbO?]lQàY&ljcKqF kk꽆&bp~ RqZWTS D~vaj٦S68Mozo)7 s\/CCbOX+ bOtAXIsMcvET-صX.~!-l[n^􇦒+pLg2X`,.8K+XMl :mfXyN@Q:zPȵ*W-B+Y1a ́M[bTo@7\5ko0#Q~Y#Q1An8#Wm(zUt G&{r"|uNoɵ~3|r+ߎ8DؾLoqlB6Ʃ`gyfr?_߄߾_?9M !m|UCG4m'UzӔ5>b{ͼZ|bl,ܘ=zZ K~h;瓼vW7EjQk|s~GtQb$kৰb׳F9\!~M+k_?\G֣WX+gp%h#z {v9\Q%-;ҏ{jCUTD A''9>_3 ?F "D{}.t>AP?/cϯҧߔ>}5,/ovV]xҡs]4?up[-pʡ_vBk-BH^wB#$;sX#szcS%Yv:[%o֡Of~|RŁ3k`ߠGܤ7H-sq1KqC|*o |^:H|;Cam Go  |-  =W&o'=[o&>3;*¯~l >zYn|E"E> Hl @.̬RuhI!vޱz+K vFX[j]ڻj^hO0.v{'򍖻|iB6+xofhRloHq*Kd{bHͤ h7$1g{7(gN&0>&R7,o,e! 蘧y@|s ԺwP˺~wkOk u3E6k/M^v%h7*(֐*&FjYr ]0[/R+kK$ӫ{R+kH$g7%-~~~V>.c@~^+<# %@tuDΊCjQG7GJ >zÿkh7~y~گYkkiYa25ɱ*֤o([H-~ˎƃ mGw_~گZUk+|sP=fUJ{85kGf|\LeV 469:sz/ h7s |W*_dM_|;.֪~ U}nr V5A["76Vn|T$TziS䐪:Emt: oݤ*FR[bo}|wYsK>/.we׻KP | | (+nOvicHT~@xƇMy93slo|U"lb'0ÕMx0NwyP-ϰ⋔_'X/3lz-[KtZek겥z/[Kz-[0eK3lw_ac}Ծw_-i_goK[[7%-|\-[ ׮|"])m{igtU j43Œ8e l%/y[y׼߲ȼ?kEe5Er9Ki ~Utgk9 N!5_J V#TQ73k LmK;sT_jg$('Xoӳ zѐL9AXig:1dL,ɮ$~(% Q6wQ2"2VdGe/UR?}M"pкlkЊlFMhMrrЊlv{mZMCii(cӀb?ۻ~ooZUkkh7Y=q8N=q68N=q8N=qN8Ns|q-o{?tOs~MEyl,>x{pK1>4L?|zE܋^ 4އJHugQ>Bw~?k-0ÏN4&#\qj0Gh+!Ug=Y2QϹVz_gR. ]*Rzc׿>^~M 8I L/3)+ ~5 8 ? ? ?+~\J<5d2/;f3@tM4J|~8zijHu^گt9d_I8n72&#ys_I8X/گZ]kkhW_~گG 2?Q{EɢOM&I + `x<?bLꢊpzP|rWE!M\*miwU5>3[>ڌ| k$Y&/nnIBԻu6=Ξ5{gٳg&'K}͞CgϦg=`KzKժzi?fL$lK.]'X/3uutg/N?0E3 >׎D4ipK'fLð9ve //M\ yV|0wiϖ Νϖ%3&/qe5.,Mn>o'`3+"I`(f%hV2QJ&/R4ٟf%5W,v7\USxZK;%m 6y̆.Džz 7>*OSmM!jYCZK[i?f#P>4̆I=gi͢!3Cl|irstKr"Yy$K6-Ηln!Mdo4-^Tpb3nOX&pjgt۲qYb|/M|-Lz <.[-@ Tq0;Z5nF\*OXh;ҋgIܵ0Q"P[gbiI!5E̗%%o'Xy1q&8>%1b841׹gp=Aڒq$(B >*-jF%U3+Q3/GLÇpQ ߽h'Xo;h7; ݉Gw|pNC&kN4^̼>bOYH;|&kbElԪ3E[Hu礰> >vAw/beR9Oe|Â҂J=GC>*'O?ò.\rڅ0Q|Zbkk hXHmڅuv|Dm3Q?ɰ!3v1)IU)`t?56 ǐʤ?E ҾwKо}ksX[}|7|lXC+:xZ)N{x\&Us88o&/  Ng4x6rï}"wگ_{߷a ߣ3]ZkX>ii8#9yx퀬rc[a%Cjk| ? :jC3vyƒvgZi!Do< }ж6EHυ6kh/?ߵ?~{~ڟzozI8cM//5t[&/|I8ViXy_ww;G{=5qMY&ΒT;ĹkI'%gI3u cħ}4d44,4$^MÒMCIMCMCOic"ޛ->cӰeP{P^>6 H6 o"ޛ-dӰkiزi(i(iI6 =}lC7-:t{nYn~ݬCw[tfsF^]䒐v<.$&Uw$DZK|U#au;(YRH=Jƒ|}DE.{}>z{ş2SS#ښ^Kpص6 Zi-#>M4EHu ~ ~ *___~%'n^pՏg>ǖJ/-b9ڭ'!c\RA8,J/E^-]D5񺲃3|oZ"'~\>z {;DDm.(QFc4E5Þ&n].Jh}[\7vB`?5v,[\L!Bi] 0ՃO P< ?T{'=3vZzTdc:]*?*s jl*m%xì^ڙe\ ހ0;& 0bo!w.¯iHT:iAQۥkAz ~֐[+ֽj!v9کOi_(уO:,OfYSWl.h[x>Uz^v  ՃO:gt6+t(14-ȵwL,X.a4tUxo?o 2m,l9^O~q9t;1Owxo?nO |F#3N[oy~.]ncӒv-yِnػW~ٮ &VKx#s9xޙY-MXN}VKχQ!լz ր? # $h`Q˃ U$Ԗ#x2y.xO=K=GHupa#sql%^:;@;,[@3v 5V>KR~W?5Ai4~js{!>| z fZO J n6B}lG };ճ/e*<+?(ԈtWf4GvSۍ͌7*nѥ(: Z^y%/=Qk f|Hh3ރ`E(t; Vшr,WJ@&UP-:p3Exf(nG :ُl/kT^k~ӴRVt鳫gL# ? (^_TL%)R ~Y_Loo5:J?e/9?eG^γ'l HN2tZxonC7;t 8NM'8NU'8NY'8NU'9qwW_ߵ_~}~/Z]]kj߭mYS } } )߾߾~][_¯mI|r禨̥*9VAXus0[#0erkjN2n`k^uCW^uMW^uUW^uMWꞓ {1Q$s<+'|jv 4|]ݿiwMwݿkkr:a C& ?t! Cb {.^ 4FHuv?C6W7G| 7[tRdeF#o[R[7/x5[?=tjU}]CwwWKjлyw9&ȇ_>2b~U9I}_+_?ԾtUχ"~R9j?g-R3 ~o]>sg<3~H&HA߭#ȑ741Z fH̄B[`t >m#K 0`1e`s,>KSCwHuN1J0 >*+A ϝpx']t0 O?lK9`RK|?΃HEmByI۱H8//3[OpRڎ!mf ~D7W?458pHa(l[{hf|'X/85NvdtЇ-7'n0 sNvvo >*{>&|gg3֙gg3ԙg_3~3f3yoh}־?[籾Ͼ?9fEMߝl !G9_=m,3 >׿et7] Jm,jR_Cw;_6ݥԇtL.jCT$>K|KgHg+~$~XP3k_`U/`\@l+|<c1ð r \+'}UNZ\Ì,`j*/ٛe ]mY«/](c|&mm3a{H|薘2oR[Do6sY'X~yY[-WVL[[qY[h)!U _y߿O^O 1eOy"*(?(TL^@aKZ4/=O!_j4<>~iTR *oU7oR~=qv&OqZae  ,gi3^R5KAW#j(U,٢˺n89 ȫۏ-I4J >MbAb|~#IoM >*1T3,jIp)|z J \'na_5Ҟ9T{idH O$zފ3\aTD/GCCuY -PoB9oW|))،(Jr(an_ yWY3VN˶[d. mګExьdcY^RM*t8 Ōl u猪d+pu@$vQKJR?.a)m_֥pfLp'NFVr9%7Oo>7T+'d-]|4_a~) ܱtV%UuXGR&a [xj ͥO~l]q Tf5@tE]v Zb)P>zßzó8OuASWʩ]yCnIUNu^e`Q9%^|;~///3 |WzE,k~Yrc *PS7Ÿo[O?8 } } )@ MQrf־`<0X>9a䥉VtJ!U4x5@,3kn 6د(I`k_5#dM_xӛ6KEG(yvȖl& [xC-o^-,MBVݻjSx<=Hzḛ:;)GS4o ,jF|4E*mt5Edy9)GSօ 6S|e!(uN.&U9MPU5_o]IC<:=QwT+V%#b|L8QJmȴ63bMYڙ>ڥSmK2նjh¦%SL6{iQ7ju—_v&noW/-T)NͶw?VճWmf"zl/E!Un[8>@C>M.~_47N_4Eͦ\ fU-\{U[檙sU҃^qJvCˇtnlԥE&􂳝vnP%^Auxؼ@VzFPmӆ3 *n|n{Ⱥ\kBwOl"r!{J]..Y\נ|<` '6}zo&+fnŖuTqoheM!_ b_~ MM>3z Rh xO |s) TLJnO ?TT/+htKB.\Rs17Y 4BSHڿԡt:tSnס;CwН:t=~*?>oI"¯oUrck‹])Ryþ֮ywq> Q3ZN!U|7A5rC D+J^1!?IB|m^xMZWlnCO Vk6vS`W逆_FT,x[bSCX Ђo0ᖣ۝AKH3Lf5O|?Qb߰̒ߎb~|lN'X/{^',aףx2?b:赭ǰh9qц:m/!@aZh뙹3s >OBݲ}fw{ RRT I (g0yTp \쥙)xA~Q_j4955] rNc _L^JP&,]HBdv'$5Jt0v۸\/#*(^9:s7煊3 9!K{ttt1\05v#SHmR閊;TFFFݍjQQFEQMڍʻUFF)94Nnz~MQ]æv`q*g*/ڢ*?,;٪$D+Az7)Y 43z~_6Mq<z<<^6湊s`.6ϙ*;+[|uGA7TW\uPz\KL/iAsHucTj~LU5U͏j^SUשjSռ K!taIKӺʪTg1[=5I-yif4!Uak;{?yG;~Cvj QZJiƝr=våxѦ2HlfTnϙlOXv&a HA_sXƷW[(^E`H x(JwڅFb`H ߖ qָo{A+'X/gn2GUV:Vä U貝;7of('Xo~~ ~ ~ *___~&9;9tύ;o"$Rn"[: `sRA8 Vn"\O%I/1 e}DKƷOǓ^ xJHU8 8|8'M81~sP']# >0Ra(-C.~jޕ+Η,՞$׻/=i_?/}>[_g?&;nʖ3YGcܵM//t#lTLRf-f˙T_-^`/ܔ sI$quET?`0 9k`_/^ڟIjWϤ~"_~Mz ~ȗ w=7X˂|`ٮeZ*&vuUˉmUe/ *2oޗ&V>hgLsiEhHCy)$r!Tp!,pSJ~1Ov ;1uu ~̻#!U>OcPZK 6IU~_ةpK&B?[,1x?Ԍ: ߼2>5!8ķ̀`  o9MGJ|+eVc֍U+W]$^LI~q "_Mi:zA//jW5:eu [xwoE/| .~q & h!eXl3۲I8D;lTZV]ӗM#-['Xo;Bfw&[SD/HiE>?wԐ*: e`'ʹw^tU+E%{܊y]t?RA8쥙kX~;مAj As"𷗎~],2%TGw)ʽg >*~~~V ? ? ?+K#´d:"=N$g+\7MY´ ;,R)U6!`w#|ޗoOEgg,?$l:Y,g1Rff>* =1~?& >Ks22'ȹ\@,D ; ׮6Wx8B&.O`D<`쐚#$~3[|UNj%1(ivP#L.(ֹխ 5i6ѽ4zRHυv }ˍ]|/]gHL $eH 'Z4 "2?AbR7hQ~wTuZ<].`z)usl!5n8^<6<aԥ᪖:tlׂX>7 Ʋ-CF})g0c{qvZ;OM`lDW&[-W`9E!R!^PԌ@˔gyX]ڡ1ہ)U\Z}@ОW/e,L QJ闲LC1̘=Qx+ߣ]{B:{B:!{B:u9_LH=!-O^׸D '*Ck]{Hx}`dK^sr!^{Q4 j!U y'[esRԯ.'lūGRXsAS砭s|AC砩s|AS砡s|A[砩sj|r gFD ٚQV {:_c7 L ЂO ~_  s .*f?td#U/9|I|+|2J 󷵿eok?F|6>#Dϗ| Zމ+y~H(joE=~O_~INR;j9{U%}W=I??Ql ;1)QJ%܆_ NX͘l);M(@US \WBj9̩MիTLh:ǙԦ׿D<W x9%%A=ڵAC6(Qˉk٪K97KQF=PKr`5^R% Gӎn«?%w0ʏej.]X #ljyM~V.]K~Ƽݤ=Ls$D+f܍TW=.h`Cy z~ y 1D5D5DY"tÑ/]J6OuQ UsiUP$V;e>]d.bk\Z( N 5--quy$8aX٠LzvQ^}뒦Z/Rmy{bCqaڍr]j#aq/LEv6|קc^Ke\?ڥ^үvүvWvW]/QE,_:#Z]a̴4ii҇*asYgR5y#9G WSL <9oUM^o:ep!(^kptj?}TtcRO1Vcg.RAh@o`CԹ[ʰFSx:HhS\m#Օ8՛b{ԣ:Hh_>`%Aa~-nN( Vɨ:#dVƖG2RA8奙~t!U7=2a>#&dx2.v[0 :zo/aoTlC$![AxpR ?O5ߤ㍛C°G!hHCɎ=.2y.>}lnzy7i7yNZ߇THMn` x|ls{+5krvcl.0#t]߶rv75E#a]H Ӄ1!s|hȓRld)4ۉϐ*q<]e#Lc 88EN2[y]e"xq [Oj-c?)˧!Wiv=0 Og@WqG)xyCF 9 3ŒҍV\.נy) z2Chp{UU8g:,0ʨg%udg3؂⦊%x9q5{"ҥʼLߛ6g,[b=YWݣSd.DKff֚Q.,M^R# צeAMmvlϛ^"usr.=N=댊ߌ33<~Ս6hoQݍnFC,,\ >pia;NP6,m/-w`'(2j  ,Lv!]K!43B_CR-D9P`=] Γ`| FxC,bZcU,b+r_89~qqŤ7_~y/ X~~~󷵟󗵟?k?fϕu,2{e(=KٳI?|>{=̞+ %b7EUX,'RXO&Mk~$Yo2 Rp\*>vW ~y1~l=!=*tK|qV@2GTy!zÿnѡtޗk ]/jm:tr~}^3@Oy> m.$x >C˻~+Rjie <ꞧɞk3tG4Od] {&{UeϳǞ/;OTe+0|2&58rA9yif[Bk_Fk1)Djߗ1\#bRvcҡipPajCp18 Lvq#*(GD㝖IRvrtL Y7s9Gy6Sl-V6Kʈɡ:NfP&Ux4f"ڑħ;?_%-;́|Ij3'/ʟ1 g[#Y&d!ƮY->*a_&F ^>zLdR-oFF"\[xzUOf^)xU:|Dps4>]Jk+vU:* mbW;1DʑGgkx-Jsɔ2|&UG6TrʱO |yzXvrxU/^:Onoդ:|SnG{DnPiƠ;?yd$FK"&N7/tJ эbgdO 1w >tu! J +=o2ٶzs4c$&tRA(eW; gFL"AnzL#>P{ K!2+Qw V1x,] =l[F#''&u8gDFDx삷AWfw>|xA|)Q 0`\B* 8NV%T5_a~x0G6(Sm+'i[d.C}/].e_]˺tK}ߺ3Ţ)xEܼfa[g2uQ7^R9B'KyZ.kR9@%IQ)ɹq@r*!g@7iӸ yY  XI-'@^-ޡYk#LBu7JF;;}F|b|Fò0xL82t2qGq] U/:Fٛ$f_ /V~fR_ w?nwq%V,Q$ 8)chXj+&F ijx!`=4D4ufx$7-Ճt2Y&P-^<_P|R @,U . ]qY3A] j4+@Mww'F#ݩoStW6U[Q/lCA뀜.It(.ĭp'/ֹkZ<9*`׃IwM}oR!GM'X/WiYN~Z+\hV>Z<iZ5xEb}I"[S|Q,vA*h9aԖw%L:-(LZHMEO4T.к?ӞOZVV5Jy34_LMQs B5*558Uj;v /-@烽u B[ia\ۙtcS݊=x\{[ۭmvX<ފn0 ty9Kp^BPV@*5xѢ^3`R`\4Tס310ݜIV:eRW/Z / _~mMf7UhQ>9al_ୖWwzWd%qt*ۦh)ڷM1)j+EuxS]9r 4Xqn^5x3wSXX"z'Mqo,=32uǎ SRtpj=u ,jg fL~1똲lФfK {^_`:{,[~`ul_b&?}* >k H/ZY4{)АOg1?߇0ax,tCz^R)HLKAǬo9*dEY :dϗzy j [u/aďlPKr"EҦeڶq(ʁxIMK<Ӈ>5KWERwe\IS^1S{%velե.]iw lP鲫,U1cc0cBCt%5F_e9r5B*}gUܢKfa#p0=q9:Q B2jO3YLwMQӯsU~g'w(ٞX9d/qie@Eo!+Rds=Dr<3g5ysuQWU/AG]ZD:%>lexV,h6iC!zXi| ABw D+=hO |. V5Jx.xW9dҦr>l$w;(ܟ OjyܐTW\1Cj'K{ * <^sV:aU7 LzH1UZvGl| _n ~u0kZo/wy@L :30~\'4 œ=$탵OKJˀ)7-=ijF"^EcM~h Lq(ʧvA-0Tb"DxjgS«/]p>U2S:yF1V:_P|f[]*`z)t߷Tmg]WSl9D/.PdkS\lKrޟ ٠D/'eYd._kK׊{XekE֊vcZѯb*jK{s ʕ(V%%$6X(ʉ+6W"u&{5B6(eE9Wqߺ<.]~n9QaJM׉@.V U'~q2v Jur"]D2]m.Z,(s@Hqn<]xI`2Pҹ\ԝv*nFE˂J yL2҅]벎o1e:o7O«o]zԄ2qey}ٝ{T+V%559S:%dUܯv˺˾///xYxxqKU/]9y]s1'kN^R9y\s5' tym[l[Zmzo[n[n[{۲t2u۲^ۖt۲t۲>-cr\tn9,rq'{zm| ^,v,)!"L'yXO^_XXx&;}b$#Gb=*ߎQQ>GEIl|uUWw/]bu ^ϗXݷ'ŵh_Kսv2*AFEQ{Tl#ɨ5*FQeTEFEI2*J0N緲QV>ͅJ4K"FUu ttl;{aTз"OT㬊<6>O*qF"?/?@![3!n;(WF9N"u93n} os{MPUQP}. ]0QJ X*:HʕQ%xxv畇 +ҢȫE1k[sx㔹~̽U^[!5k[1]sؒWimmsoӹWV~ͽ{5_̽c̷kk̷1_1߮1>|||cwNu));t8{8[ѝnbS,Mw} Î˺vE3@.5GxI(l淇lyo'Wqߺc뮺i!!x[QKr`mplե5{9758W,«o]ʱQ] A^j7Jur`-;plyxX K(AtX9qWq>u3ot>~;|g0GB#3t>=M`(% grnOW]ԥV(QJ%uw}:i]M&nYXsIuiU81}oT!ha/I^)dR]4CSٲSM|TTT{ut_;uu?v*zwM f0)V:7C1c|Ҝ'Rz@uTL]?ޏ6CwjX3@؏/K# TO^_h3@=fj P7&5}ե.e.u[ojۭov{ |-H-ٺI ekSDa6~)"[*t_tjj}׭FdKlgkә92ͫ[:NڭFb_GKJt+ 75jS WݪmZQ])Umj'>Vt鲠)܄l%1=_=f+MR]WKjq-@;A.VN\DT<) ˓;1u nTSxIubhv D+-lSUbȓb$E9j-9cg(/^_WKʽQ/9]Q ƭK2*[t9SϛVȋBBy-{&Օ@`Po'pFHmӫM7R>A\ѭ2fHn- ^PikeZ,6c I"x7f^G5O!3գ) 36tsxA]MduG*n+0I-SgӇW~v+LMI:+0Io^Z5:|"HZg]j/z'fS6: (ĕ l% u[5F%@.MLvCmݓȮv~[^j+J꨼dHVAO;[AO=G! s.Wn^:Ѽ ] z6$D2XDnv]%v֯ݺX9qWqߺYТnzQO\UgIf䛅f.̳*K'vUUWףz)I%tp \᥅N4!u:[u:u:;t:ϙ];_Ex;JloH1%d2]h̀{Uxs.]rP6.T+V٪KbD`32Jur"%]u0Taq@T5Ec_CjRޑh֐jQ {vnS jLr"𗗞L;2%?P\*]Td޲ɪ6L-ߒ~! [yat>](^ x.}ZHrb)RPyjo2[/C鼤RƗĤ-C6(WF9ptrJ@2r~ &.8V~ e HW{ T-@hs ʉ/?fҦ/Z<_x!60&E' TUְ[4Q~ 둽4>M/ /#5h^Z:S-:zlztxajyIbWo eo'i«EocxCleDZ0AQ'_nt\rD nbMSyk'Xx )P (RCOHvC:j@$~+@, NS^D]*oRy BMSԭS|OCԩS|OSԡS|O[ԩSRa؆g2 {pQyl^RI=_2Z٠D/.Uܢ:rzdgG^v:YOC+MvZ.uY.mx=-T+'i&E4v:Lk&|~ 1% IwT"v,;}&/-4`PRs35 %xIy԰z-9S:SCǔ35\rLNے3u[gj@gYMfٓگ*xDA|0^.۵%0A"^N\V]~Ҿt)Eɛ}庬(V%4,Î)dr]rװe٢>rQew@^2@Vz`> BjY2nnS6z43ț6KSu"G6|]8GFQ=iakӸM K:9d-%M/;&Şss~Mɥ".O^_mOdu->jSdwz|Zdt-c:vU)ʷMeSoNSdm{T5ɘe'=i'iۍ-F81Bi.lPW.UZ1|9qDbjƝ/Ŝo񟲳ǝv=ЅWq_U[oUn*٭*kʿVC":st^ecG9g.VK]2^et,«8k6Ee<-hhkKb'_0N"M#bY`1!m̫lKyme~L||٘H}m̫l{y/sD8oW*(GL%%R(fESd8«EUuA]_ZTˠA]eP|uA]uPAtϖoI􂟒#>*L_nޥP~ Đaj5T\ꝴa@_[LT\쵥K!oK춸Kj벚22[s«o]jҋR],jbBhV]~,)ڥLX>AC^,e[tƒ>OG!;A3uQJ%c/͞&Z"`6ˉّlZ?W|_'IV:A1Jm|rBjS5뎦|l{_mNJk7BhG}TM;ƻ?bK1RHxdR ʗȩ=aYpX-Tj AyCrJNlF.咷xib-x(eEd.,5\;rIiJm,hdÅ~[Wd']>..t^G>.]\_N3@-hb 53L\pj{j_83N|OS© NS;v%:Y.1 vnysCA`+q #UBzU"7)oX'?ViRšB#_2eˠ., f%YޕW)͉;o5ތrEz+.O9A6"AAߛYv{S^ʚ"n>қy{T/%$w3QO R͉{\t᳝gsX|& R]\T*{{Ԋ♼Tи J inR9WhWxdR2jۊLH@&3a%kK]]9 oRt+ Yd x2^z58귷57/㋭|BP<j|{[Ow9:wI{8+RG6hqjdB-1TAU9A0( d'y+v +pKFba0->vߴRA GfHu'sD,eۇ5{Nݒ^:_Ԇj^^*h}T,`ТHT/\,{@EeFrE8ʛS Z]Nn7ԥ,l=-rǺ8>lIJ džO劋l4A_/?hf~CRԧōgbW>Z:f|5;^ǻzˡҖ@^ꕭ+jR ~=={:_ExVCgїw+iy^0,/=UA] u=^*hxN0=SOػx)kIݸUOq`R;^_V2\4_j5\ >!F[헨fTov| GRCIZCԁ\W[nTZȭ.8s B"^FJ d+#ouivt64Gr4e']< sr](z.څ1 .ՂP3*kBͺL;%; B~t|e/>Fcc}~E2eإn}`CxG-,..|ww x7B/{d/#ً[ҾR^(KKB/{^( F]>FǼ%]#>FFcѽXҲذP]ҎcoaQ wvv$Q:v]]%j@v F#kңOcbKi÷֯\!\ ߅ܤNtҳPPM^*ԑ[Yp>Ry^^*|Hhh.O'FF ^Ȟeeg;1<70 f-*v]%v|C쎐R~NOL}!|bz5En)S6-wT2x0%l;Jr5_#)8j۝ ytLSJ{at$f B{ b]v~[ПB%mߌ S˖pA:A ^(.YCȗgYm}A3t8aKTKa7 ҅0ovi_ݿfREďQkYM J Y|RV{[nV[nV[nV[n7v]( Y~js>G!! xYE8d5YC)$XS0h9pK)fO[0VxXOHR)dAwV/+a8rǥם4 Tr>yUx?/z4^ś% Z,;/5o =[-Qc1*IaѝmTM楽q']KSz\T"(0bui?+4sR KGu>K _dQ>J[+y,&\V*gς?ag !d/J4\n]!em2q),f @ZkRQ<&MǤyIǤcҼǤc1ic4qL1i39Qpɩa3g3t guf|1C{f&{떡yM>IFO^x(u;y+jz`͵>pc'EfŬ`:ۤ~I|<݊Y oM>:;fjO9[+?0{^*7;&VxR_,>Wϥ#fN u%yPz'tψx"ZN*z.wH:ݝ9fy(RDV]_Uj˾tчڷo_E v]0Ӊlchr*.5>!FN?= - L]#/R9iƁI.,DF-Y#:{&): /JHxQWf(4>!u=?Ĺ /4R N)ݞIM譄·RtzsF&k͙,KHJ_~I #u)ܫBsyUXrL*־^˥ J+`Xcvjl(W\\kReVbѠ4<K^Qq.m.FڈJ1]l\"޺ꅤF.'[mB1kxQ'w݂n-PwJ;?GM$č@v:>H/t)q|QB-C ]PQ@  ai'ԡr$J6RWyrm~'^ I(,`o= {c|:*U0K󅷱Exd e<߶retٯv.ڍ]PhU*NcNKjEܗ.3yCVQvt\KP4b-o,s \Ü ]xP7{6iH,Pc/e 7dRA v'& (` bLp^) G ^)J \{RA|5zvI {WOߠ' U*QROsOjؓ*"T},+ЁGsFQ$ML"%[&Oηz^}ۥ~hhU*K.>6}.]vƿ.SlsUb䭲mf̓ܔ=ԎHu%Ιwҝ|SK֐|_t;)';VRw/[4VAG3^o{qS6Lz ih-NDMKRp>!FCȞEt9@Z*hV5*=ۂzUZ#VUhQ9ZP*OlT'q B"#ʵq_=;Bkӕ&w|uJWw޿vƻyK,pKTa˔pxH[{P+W3U0[R[m|dW q]m(."RtWL{6YR)zTPuc>THM5 > ki˜i &;C[?R'k䑒5iv64Xqn`ǑoO%~#cO}S gS5+;9nԷ5wi/\lA ilBmM3 ]rť;+^O#v%]^N@jHMMk2:b^zxӵWuOk`DI֠a#x)0-S> `s+ԛMO=jVϷE3ZFۢ'Z4Emь=ѢhhOQ^}t;z O}F4p٠ű]}F%fEYrlu)K.idª, whUy+Х Iٲ܉ d{r:VEܹ[ݤJ圊kfwaOS^[;.]u[_괿‚|JӃj:rpUB:!9ς:r LvuC+C+?ynOp1 rrr̂ra딃rN9ZG'}::G'tYt٠NG]Is N d.R;0aN؏t+~R2]V' O {N$J8eǷ x7袺uLI a<^C%ٞkH]qCy;svpҡ@I)ztza Fn+w} rHy0ov)d!|4@bkVl1ي<p%n廢LL3XX1rXҮn5BjjtiӹfsMJxJ皪68:$IZ9i名|Ш5FШ n&4FMQ4jBQIdk."t'zBcB䥬afeTPbWa\ %K: K $;aLJ81y1ɤ"|r;+Ґڒ//4;_.a nwl-}(P&erl]]Ry;;r-]gZt+LKZN\.]t]tt?Y˧KJtytOל55't v٧t >]m|ڎK/i^ Ba+XԻ %GeIG {+6Ʀ tjgfP!b~24 nC3XcπӐ6Twj.C{*zk9/y-S W|T8I2]J>f`XYqf9X;ٽVGIu |3ܮJ.Ү1ToAYmA,_uoAG@lA]6h[Б]i A$yd8)ϥd$xu$/8I'>If_m^Tz?ưd8@-=rVOܪk3V{dDEzڧ Ϡ6C'>}<q']&vXHN_ L];۵CLMQ}Ȼ1*(g'<:SSĵv3d \~A6+":[\ˏ'fJ+YVzdO%HX'c}uΣy1C?A*&9%ٴ V'>4eRI35ىL ET(`MFq'i;\%'JЪi;۝ia;4P^ĝ"yc%&dz%oR _Sl&]&8dMJ/:5xޤ7i/o..}%?S U.\{SS{A2*gkѼTA"EW]/-Eۢ+X(h]ѢO-pshsCUOOJs9T>7T%Z5cQ}Vsb2a̻Q<>[ԑZhWGݫh᷉{y\Zab+,luV nа [c+3ˇ'&}cˇio8&aZɇi4|FOja t }iA44vD Ghhm qUV6;9mn x^~*Mꀇ*;u^ĝ"Oq S\8 ] =5F)S\)S834H^  M >34[&{'/*% q ׃枔/{R /]R+WBJѾ0Mkh-nб Dp3p 8{8p3g386@6P? ^Q7?.KÐ/!!ztTDj fZ?7?n|( 7?p3"ѴOp槿pp\(Xىaމγ.D.և8!\z2^%+GQI]>m"D>V|jcWWL4$@ 5h3Yϴ'}3@bq^ *eڷRA|5ç5{fp&fÚ_T,Ԋ<%J_4Fz>Ia5Ҕ8&5Z)z5Z)|֨llN-qyKA^jMa7p&57޿3CאZRk { WOwOboq6WW^m \m6ƽXՆHbPzwÖy*l8eC\p/M1 bM)&6ŸcS4lv7Eætv z;<`Hm-RRK]C> >(J* UkAGScR}.0|tK 3>Gǹ0sSd9v+HayP|b zpr0 C* ^N.'&.'潜 \N{9p91q91ˉ&p86K1seRg+2YBR^jg q_Z׸Ol'i U7>͚::UZҀq qB6pB8{B8 =1Nh'潲c\{eF+y&潲c\M\nS\c}0C"s;n=RVvL+?[[M\RkC/-;&Lp[K &~|8i%)Q6Yŕ rH{ljv.դdcxwn)I3:ҒקXz}"y}^b %f .S>{H:yDuldXF~x b8ʽ)d.ni<$*|O4G,sW)NtK-:Oa΋/]mvF>\e'][YaJ.;WM ^K Յ% KK W]6x7' -=ĝy 'OL~K3Y2Ľv]4K Kr]Qvd'] zޟ_eV::z+RcM:ӓr0%$ pnPe^exئV*{TOOv&7 @bM3sV6 ZLB]i+bl[ ʊa4C٨A66atz`2%VTzF^g5-y60'U][⥂JT_y4Ẽ544<<3,pi?mKbU*V?ZFo8\4CbO!yD]C:VHŞc\}B(Clh(W\z*U!4`1ֽm+ZT/h 6-/ZG' R Q:N,bm@/Wlq\:]ao7¸o_F S9|a*|6.h*\nSTPy oNjœ^8_}=k6+=0>|t>|<%RA3-;Tl !plpR}M**kV!,;W[¯~O>*·`&J=ʇ tYؤgjLf.Uof/Կ  ~/;?YUI%k`5q6Ѩ[ B}Wz FPR&88A-LQvg0^1jlL}>#EvTQȈny5lׅ lMAwS4l ¦)aS)K?p}8žd,-xeZV~^Q {+ad.>>t}(P aPJPzC ck:pJC8[&,XoUגGk\'8m(QJrN/5%ԥB?*ZEhwdyR:;zǚ~m+~0@Sxm$'* So)*P'.AUrC/3`ښK-+A+1W޾}%}%`+Qo_?3*[Rռ-%~N|:9|^މJ=c͵W}k5 Hwz5Zvd!ؤbW 6Oo!%d/T OOOpEbĹӰÕß^jpŤfvb>l/53y;? KvvTRj-v٠3o-uTW]֝waYOZEwc6K6yOZϻR;ZKF07mBÿ$I\ 8I;L"cĹ0!`DoCp7*Ht;·cWr"'"`UK >,lE'!%r4^&./k}:WիEyO t=I[OjГZ{҆ ]$-'mI=AOz(4NT.jJ e+|BPx5]!KDe# s^JK2hbv r ׵Cj-I 9GV/z~Xv!'ڣ5%cx'+'CjսTАvu!o& q\v~]v ;HU .;r4|GH|~O7|>}On%|>{cBLsm>[Ll Zh.-ۧ2 rUI)ǦcS/Ꮟ7%@ CB)i"n1>zCx=[riR;טѐ9l wϻx޿*.-WP$:RWU\6cӼ.?v |O(ׅpCW;=bþ,L%mWw{[hVAbU'je8ZjmWcR3|լs7!F&f1pWRgxjr'jXx(YqWT᳗v 38cM89W{'F፞xX=I?6}T! oR1+>hfk(P%%O-gꕳ5vB`+l;m"@(5J]ۺT'tm3ȵ](W;J%Ï1NQV-v٩d mXBP+.EI砪*?ғ듇owhLcM9:*Vyp C>q^:!-Jٵ 11gnH|-D*a>xyǤG GOos?Gϳنٌ ffg}fgپf3.8m{6\c>{镾/S<iok(_X}aq.jK4҃kz<YO$OI{R/z,Гfy}?UֿzU)*(x  Zl\}'M>6æ^SGï7%~E__?¯o;ŽWˎ;Ď?7EpϚg?ǞT۞K#7{7Ywk9:, ګzR75: Mԓȣ؇V53_/&?usdU ϾX<ȦwM)${ؾT/Wy9'I ʝ3|5~^=xz ?kP|K&byF<94˓؂#™\p/N\ݩcw؝ݝvݩݩcwj؝ݝvݩ{5-%cJ |-53ScefBj\~=3:sKs^"R#%r۲.XiQw GR)膗 aagHERQ}JORwR᳅e(ghyk }J-WHmZS|N}B]+E a.2CZ4]BӝhtnG%4]Mt;.ݦ;t Mަ_.ġG_iCB線k n|BP$ٚY4d(M.3 WrWrWr^u\ \ɍ{%7p%q%7ĕx 'yß!y'?OOŸ???>߁/K#x;M˖ 2\Pǹ<\C_:lA4]v7xw:;y_߮]c;:]x#.ݕvOv3>P-GsϩR^z`=Bo <[p v}3c)i)8"-{[#)/vԭ46(ؑ2l~OmSW əTEJץ+_Լ?8>fK JVϦw]GcX s6 JA/"Dyب//N\M_6l Ʀ)˦M}q|5hyMO')|&R:K I=c XN}Ln 77)s1/潐Tm$:,Ľ^?tP)Hɳ!{*?S7qA͵ΘR6{5U >Is^Θ$kg >3͚!ECg 3g Z.Ex/&5M"Vt!+qM5gg}|q?|TW;೅8PY,`}6_!a@eg>vecfE_^t0WP:RE.^tEw̽f "GCh6!쏆O ?فh8SiibOdO SGppؓJMv]F5ʻ1 ~l æMQzv\5~OS_S |p8/˾૯M >w|&eeHq%߬6Uퟸꏞ3>Zki'P3CxoknuɥbtM+=h|=՜?W|QZÆ*x1S*n|^ĝtzRŞ԰'ջ'mI{R{RŞ'ջ'5I{R}~J;?~cR ";$';"'Dz\7{TJ|+=hv~oXe߰ۻ /NrΊۿ*."8?$/6Y;*>p=41yI*Q;d;W{-b@|[R]~,.kLdl0>%&2l"PH=D6*`"꨼B*_ObpYk- Jq;ppD^jyeWg*7]Q;SKF^ܻAt՜Y%l@/wd =ނt&ǝS3((ju53 JHmeK3fg5=7Ss,QI |ve[hd鞬C |-&͔0@k_]q AqT/?tKbRߎ[R~!~]߈=M _vo77AK#' 'yȺB# Cf־b B?q|.;Rj̓n,i|BPxROMQzxvB*/OBUH:i0I@Qj[3Y=T5YƖ.axi 졿AZޱ)վ;<|r)_-j`;Ϣ>~qpܧ{'t}q<˕HS+Winpܿ+Q^+F/WW-OND\Cp9L9zzZ^:^M\轞8S%F|hUKl >!=mc>R=RA|5la-LqBG[h 㶅m ma--Rk$UْF"KIeZRGC*_^*/#7_=pB@ke Vrd 0u fo)*xLIݼ-km>/v԰RUj`lv~x|NZjHE+(~H;;i-SǐƊrBF7bfF<7V儼,9S7RL+;堁,QU_s.w[^*& xa FjAdٮ1j 0A= ̛Kc9+ sx8 &tSΫԊG˰@:tMTǐ.MpMȑ&T}J`Sh4M̯Hb/h q(Ma[+nSv,ur FoIoT|go]b;{t`!\ҮqmgRQ5taKeCmV5M&7ZZ"%|".k??VǑ6K [Sڤ"XW˫"|SK k_ӒZqE퓯|=|[3~zZry?٥ 1>xT8{*8/=/N랊SzOjkVc^)ql Ou{@K TxR$t=[I +1Y o1S;j7*gA >tQs?V/ >!F9|/hX o]C ]Hqay6<|<GƑq8=lyG~z>.AO-(}[n%r?*>.>O- jWV >ϧ|Ow+yG=-MΝgURA|/<_nhMiTE"5 * H=?gH >n|5nr?4}x=W֚SjxocYՐ]!|zbu^ĝtO.Lk .?7,?GIX~r'SAKT9gE0jgJcYѮCGDlb]CRN!u8W,@@"!ꢶM PJOhuC# 0lXΤY4iiҏǮP K7UY[Ȯqا$l ;7E@h -YkKnkhޫXCZC{[DֻZBI$DriL4!X}F3`8" Կ >[a @m OxԞBsJS4{)Mlfnw J|xե2dBKc͓s,|B@Ac _pJԣ [R[L_$lq7f"y0{N¹+30̄q(VH1VJ۩)O'DBMl|1 @^]aXOi/ 1 ?R"nE)NOm )zt/'fͤU9rBKMG7R?·Qh JCP[~=0,GHOI>fTPᓗ:h[Ob|9pK /T/"q`'2Q=}ҞMsi&៓UsICj`C||Mw.4y.N4yD%4yBӝhm>ݵՄF z*[~L*gîTc?wj'_Ÿ7_-`l--`-`L-ظ-`{[ikô%lmp8m{8m-5mՂik].7? ^~/^/-;Tye*'y %] c!tl\rɭil->{:Mړ@?֕=알ok(wݟx>~!P_Xtw<;}O)k2=;N--{G TM^ĝu)nP[Ϻ6(*E u~߬wb4x7rC5Wy2ɤ=3=t?&i|BM jR)z&IE#bj[h|BTܚ;m&)}Oڟka?3_ Tn;c&O;ay;`v&0Dii00Di0Dii040Dij)/bb)Fj[oOF]:mP acF]zcalx.vEqg]ZI&>ak͍|X`5^J2tYuP+׍ [ V]w_˴WxPǫ.R ==/U ż=7"n^V|/sцwiLv[=m9qe*hoZiW.[T gg}ݳ}}pv_ٝ_V*v ~YLV*eb&Ud.ii;iiiȻi埌|ר$]ʶUbھB]\R0)]q B.V N},Vъ_Jъ_jъ|;F+Ndښ;%>o%@zmD 1_9-] Qi`M9%ǭbOf7J@"%y2G*$o6HXa|5-|?_w,Ϸw}[8oԥH1T U=4dόB&Ք׷\#f`%???D=O}Ho  衻T! <G2ưdKYGvȤ"|{8yU>/!v? XAPW_A Ae(jK KJPE^SZSxDՕhp"M1B`SS|?gjZn˟)Т|3^zE_܇*'Zd+2\q5?P@6DU&1iҭ1pb!? pB85t'cB{B#`yB8NheԔz&QdԔ^FMɨ{2jzLFMɨ'F,;O!fyQIfe^-&qԏfyF"U^ W.(|Wp]]fjt]Vje]=뢛qXF6sO\usWrI&VQ Gy˵d\k(Np ^^K'1'SqD^ߔN:nKy7/]NL1zQ:k3>IN¸ NTOnj8}.ꆀW)`L9}ucNX9YJZ.I^O5~vf묄뱼tk0 3t J# #|F_FG_>_Hl|>%'D2ζHDn 9!'J@֐4R@ZJ2 #Rj1L (*c!A 1>g €{R|7~"F;I^cÍV4O$KoOԛZo4\O֥J(.jLjJ`_GwR s6d`A?ĢVbԃ|[A[: ŒN],R^ Ի'UI{RzR/ؓ*z =II{RŞT=}_-8o)*xrp٠9XW]*/GϷ\q5[W HYP%<'mؽxi|Btc9w~4)4?w ~hD|t5N,w%~#X"{q$ЇJX"C 04X1~C#{?in.hlRop٠gds*.H],gE^֥޺iԤK}RQ.֥KMԗ.uyd.t+)Oy _Oo?>q|%_o?e:H)e&axn˅ \P"uuJV*ű!tx))Q.k$A9So{d X Z x8o劬(W\ʋs{Qj(p(E8J =J GqR GxR=!5lN?yYw(S ,R>!Ft R[ uM > y9WxI#o|B4ⅷ!R᳗ +c|/0|/0&.0|/0|/06.0^` ԛzwK \7\뉻YyZxwn 0-05KiͻSS, 2´ tWXZJUR|M'Xg"*0ʦ^ec*U(gT)tlx|d!\!Q3a\Geiߝ3a\DZδ31v}wicg?LijZ"i%ҾHHK}-iiHh9!1Tiw1*)1-^z%KnkL'^zހq.C ],d -|o`xJ> Z h ,bAl"Gf" MDk MdkDfA`"&DZig&C=(w@E PJ`Ӥ|lFvoV/g ڠ+GM 5=rx^9jJWVad`@6d#,ʓoC|>Cr˲0ϔ4 @ )Ό=7NQ6\4Q[WQ.;5EKxdL$ xQ]g]Ft ]oRlȚNsvVf b+sӤQ@lm@+%4-M5x;%zaFތJMQ́W śm-MMakif#~ӎl$IM)'P˻ӓ!6-9qA#R3r0B{r!|#$k543va$3eGzB3_5IAt_J u'41:på ic-:yHLu#|{HM3>&ϴr̞,EEXdO%%v ؖ9bymY~_lXs] m:Dِ7]7s׍Ï=]q6_7mחG !3{+Oږ{Ʊ|BaMIod V]+c͵?"]T#J0 JK~54X"ұV #RA|F3L DS |BLL{2-#cÖ>D3&u*nZC91Ec-94ZrxS _K o!wYƴJ˒Q~i~ik{>4`$R򃾡;~TF/!!'au^|U2DԊRAKT/~bHC<ȑ{J8[f#eRY!/BjEWsLǙ5YJ|Bt _:)Ր :bgwO}kb]k]CY~c۲,U%rcg9򌝕UVʾ_plCBorMx?s2FY(Say>7 *?;41!Lb 1|jH閆UَJ%6k+owh+vʽqhwh+*vqh^!!=  #V>A:I2d𓟍,\DuFP &d&Uts>Jy4ڮ~j`9)Cheg+䪿T^~P/N$_x>;LnVz0mBm$X'\-MעȱZ<>WRJr bѦRE9?-,ѬT0ԂsR':uٍ ҍܖp*`2>9Yiӫvo 3v/ 1vo 0v 13D (5J Ɓ R2"c "N "boT4.klsdzZZ't/J\U*~UR ;]*|:afw+ܫKg8&[])Sy4m99J 4yjf056G" *Ta٬`T g4XK}XIRԮ?;Nwă;;Nܹ/ă;xwb[Pp.{^DyK|uU@ V~P/!F ƈ/D jJ#&E$ -$2aY}շh;F.-BsвL6x2s.S@V%Kh-Lt5_2.8,*G"N-bkC'վND'ȐD?>EG\|}&AǠyAǠcмǠcP1hc1h4ci*z"P.\VM|7Vz^T9zC5q.5RJ  slZaVzt*g[=b;?vI B?vN+U*W=˥@GX gߎQ >s/YηA,>&cC0|{ޝ1 #'p醟 H^U:W/yW (Q͹:Wl\jfꕭ!jDik03 Uhܯ`0)>okUh^>Z'1w^#W!rOˉn|s睛ykyW!w|~~?3|g ?Ofl<2x2O'Ɠol<'p#[w agۉ5GWpj2kXo]#]#5ylE)Dj_'OԻfSq?_y׸q?~q&&~q?~ZE#|ZE#BKQ~ cJF}Q"}~ǔ(.WoTT}L9\jo?n7o_nF |Ės|eD~|.a8a˶>~?~mtO6wsmi՞̚Um8a%m׏_]گkrw׻Vnn[ֻVnn[w=zH(l3@DHD >T}-K-Zl8acok}Ƶo~Xkmh7,.+Ǒpik5i5yښ5yJ @T Eϯn&p_KfI_2wsi?=JR\6 TP 5K͆z#w~u݌9Tot7];!ΕЪu˭$IO}#e[_m׷>b_o_og}4ƳnYhCIБ~x ZPWAjJ]!9/(m7zel.]Rxꤷ-@{b.ʿfU*~I6n]PKrJ:Mm]fR]Z`u^P]r]4Kve柴%UKY&>|K<OiRASQt_2|d(Ĕ24(|BTç!>'PL=(t>JOB9ƒ~˻e 'ZZtc9U8Ҵ /+4]Wӥ2i!EԴp`?w /6W~|5_Od'?okyH6rVUmh[7`%2٬l[52?W'mɅB;u6v⺀Wb/K'p H-"A7$;+bGM:j"CoH*!G$#"^}ؼuɋu.f`j@u:"M.*(SKkT=+EʵޅJeSc ~yX#~[jnΤ+~R>q~.ʷ|!@a8x:`T6ol<3x:OO5A1QABPT͑T4t/^T 0asd^.7DM +z/Xwv*W>J1q7-# 'C[63! RR3])~@y2M*MZ*hm\ɶ?nolmܶ?m=|q.M×R֏U*If{$i9aX:M-]׾}q}awXj45kݗ4YErJgjL1QxFgb#!௥IŅTߵ;0b*>tYlmq_   Buܗ(sڔej:T:'erfCCI}0CKbZ&|Z5C|{"Kck<;Ӛ'WZ<Ú''ZLk5OʹH.5yr5δQlzH]^2Yɥz6%Oz"wwI)_}OFsΫTe/x$ ZL| 9!I 8LRA>WNON9 _ZqצR~P1 */J;%>7@n^ Zhj65LWbhh( 0&Rh-̦ [0&yoa- kPGԳCB| @]Bf7ҎjL.5·뺮BeS*]I-+Z뺦R]וDu_uO#Vעt+Y@|>Oj϶gM?4, 0GX#lB s9,^&rJQYpJeß$S=l j j|5_'fisH-Sf}N[匆ɥ6(-4#Lr>k7k|{-{*/{zX{C"eO==z˞˞˞^{SyÇ&^˞‡&˞J˞‡&˞˞˞^N p6/-gc=dOZ4>!ć2Kojick{o;V{o{o[{oq:vuCaWƮvuhPaޮe 6աorZ[3#H!J2u(@ KmA~A?uR 37Ra/jyH-/x;l dGD5nf˸%Łt@@:^it@:t@:x t '=-t1Y/dSјp"{˥ HI V?_41`LfZdLΫT4c2!Eؘq].cN4ӠƧ>Ml|X4hާe1M64`aqwwaaqw6waÒ8?OMpZ$eA׊k *yIb N ""Ek4$K$tڳƪlD'aRJJȤA?en|E)%1!SJ k=(r%xmQ(HCt֧IMEK'Ƣ>R9LS$#þ9956gۜۜۜ}os6os&os͑D[ټmξMQa8گhhphpx8pT3G(K'Z Gn| 2O?NHq*s~2B|-p)5bCd>^x}K8^|녏}^x=z~sj~#0QYáJj<?JbU> 6pB|-4#ȿh 6@ \C\0UV qJ!kꅆ d&^Tiʅ\^C`>y~Zbiw^KOS{DfΩ>$tyt]ʣ/S _nJS"xB=LAҮV)b%g|dn?GFlgϦѺl*F|t1qWnܕÙjwW̮7ʍr3gvqWn|R aނo'u媥XW_54j R>g|7~;%#є'ЬAJD/狥?Ȧ\/mxwe5>>g ZMp|*TR7>O-dNƗͬǧ+ADmɢ2ߚOaEdMyS-J¦'mj{9pUlE2Pi@(}`Q0dbT!H-pBR ~<MS-iA|7>!A\WKtu_7g#쫶gI v4K ? KKpҬ~MKz6߲viST_/9r]N۹5A_|`h_WxVT4MY\/7/~a_~ / |gEr1eiλ-90EKH52u\\n|;wWε\kߵ?;~׾qߛrܖ$LJ!^Cpq3D OM-9HYOVF9yUe1peم2<"f T[[߃;eŜ"!@q>GYlݢΘ>-0-K))e#7ᗏтΗ2kǀ E'١LjJU6-κ3]܀LŰ҃IrPCdɇo"k! ;3 "ȚۣbAj Շ aW./GIWo| R. 4ßk RZq)Q^ßi| & r8۽)>pP=I.yRe"[u_ΛjUCt }.fπxPj-})ĉKhKMo+4$Jw~f~aTT_ AknZzJS(|L3t'q's5Oz#Yǵ^uXϗ&xbwR²*Uly_FE>Isه2Exĝޏ@O@my=Ҽ-BKh%{BMAҮR៳QGEZqRG܌ĸ0tc1Bjop\/WG<*uX#ruU#WGZʫ#+9yPRM\0EK'H5Վ6#T! ~R7)\o9>la- W-- HU|W>; R~SK;qiT/ )9I岒܃FR>݃A}.2F=]Ys>J^sfd>JK Qh| [ leR9a 📡'6.+wi)&4T*N=T&U?yw]wqםwu'wyw]sםw]u'w߄?>߿xaXC9hO-}dGq0]r&JMӝXsZh:nCg./oi@ I]jKнKU8}}yD} UM@|~<owv2B0|h?~O\j_~kSDUM/oй ~OT=k?_Ӗ\X`ښ-uikӴ3M[;_T_kߵ?7ksO}վ\gϱߕ,RW[m| B죽)pG ?>ZJԍowH;l,"fy/oJ,}.{ QBACSuɥVF gς(Un\ǑR | ?̸U|K!Pbg`8a%0f)*9e.T* %L]VׇZ.q]a04y0x< {< 5= M:C= # ;¸;B0## ;¸;0#WG/N ܏s%^s%qxV?y%;$ | ^3B0K|~g~e~g`?~fDŀ DN xN/|K 3VQlVqT?\b'-?۸@Ak'-?Ȣ>Ҷ &^ --}'@sk|r."|Moeavp2]sN|7|؋v*]RKoK%,3!YL6ƳnYlL922QrD6c8&cC[]j(4MPK%q3ydZIki͓o5aqm37y~y񝛍'߽x6Ͼ7{x2o|{eE_8g{ib| zR>@tk(|+z_IMݝ^#s;9A*T•[hy1xNE|<_k ~v]ے0oLڧSLLjf/*mIM뼹jS/ vY >#OZp%>+wɵ?o\kܵ?kr($䒝St0]Kyu>ӣˇs^|Mpa g˥7]Sˍ?$GvoAij?T!>J1bW,J e1ޗp%*广 C},vij1ifMvag>ACKQLc<ɥR͢N3+pAzçvp~~Y||lv3HT#i~Fz~e˨g޸ʶ_oۯd7.޶]Q?oاCq*Q*3T7QqwT aqመf v^Džjߎ :qq6>'l7o3_{ۘW6f"ݼmm>td>LFk7ZATjA/.Ǒ6>Ğ(BY5!! ~R>=5rݛ UJ;1K5O5gter6$қSʻa eWfKѠp70ه"E.F76]ƉMNd=yy1RK٦X,tY^4f].U}trVץܭ\uqK3٬KNŽllup.{$.4B.K!ODxG-鲽HF$tY/X@^yn|V`u^(|ib5e';+ [-@{%$Xפ˶Uf]Yx:_Wjk%۳MM}n rۭ9``рuVx##ozm|5ߓ 0VƝ R}BW?ޙ g+4x@Xo@BшT0R]NFvi0imT`c2sV Yexj'.x۷ip#CO$:DIX ~ *7,w 5@+WH=4@IZ@#ܠs5p–BHtYx&&=P JU_K?Y.ζv=9oMԻ5*F Q_CkTnzFnƭQ55 J%UuyĖ| =Ňa%3lwoV}q|\[K33V]W3 W]5U*YKpM䘜7&]zJ_e@m[/LaVUjzto|麖=ȦPEmWWDY' C0S^2X&u>_ a27&]cG1J΅}GhdYsRcKw6Qrd7QF9p o_8_E9}{G(Eˁ+i,L.HenKjұWay*au])Ńl l}7&]䎽ИOډL׆ccJ.(:R1KE'xeQ|1Ύy_b7y/6j}_7&]YtUY5@MK' G`{NzR'|5*/'Tn*Yµy$Rys_sWiՖC)RʁKxKO?_.ui/~O(ӥ[9W.ue>겅2]e~&٦{ekίKVDŽ d uUj24ѥQK׻KǸĕ1.~o *U1OeMNrހtYgx_arRtV^΃wU/YSWA_Hvryv 5yneS#RfRvRkJaJaJr~ۧ)e{_;+KoP ʁJev;_Rhxk+eMOvހ;fyidDh*Nci4P5&W$vH-Eot q 7Eb$n8_)7N%qSns0]pE6wtwŻ.ӫ"%q)ECѫ]rh%evɡ]]rh%ڥvɡ]O%%v].4+K~Kv c.9KIώ7GCr50>8$+n.GkV:| R ~{U fՃY۬ʉf^fجlDeV=U f~bVM\./S[PKr`RΗM0D34/ettAҥ]0Lˍ&ɳQn`RH2^}+ĝ%v*ݽn[]ӅV2ݝd.{D9iAp$!q"ӣkC2z`YizQ\*7G+t=txu{} }>~ˬf0j̪ˬf0jjOJ|˦o |ėKXF~K)eZyb7|iNغU0>t/]v%]KtAe]VetAto]5%C,.2K\{uY`:R/U6$pLfUyp I~ǖMhE僽kإDRrS_4M78GaV] qAUʣ"藢Wt/K #o^Uͺg&luW2]+xA.h˴[bHΪp.ec5X 6VoJElcܝ!;X 6oK_S~-p=ohh|v#UK|_ql_+n:W*=p3_?3tBvXpSO |٬z0ʌu!r^Y`VfH&;fwzFkaaF7 lo<)]dyW+٦Gse]P`u^P"t1']æǡCztiHkh,'DoK!M-uX1Ayoi(e,/# w%n~+o~o~7B.wwޛɛߍ Nm'7E+z>tkPj*nUԭCoȮ~5_/ðo<0쳿զ.a!;ôq1%[QS"]y]n]ƺv>6]a m~Q p42]?XWΛ)~2.6ˁW(6]V1Qomc(YNL鲂ThG\nc$2/t@Y~So 7#uW|pW_7#>ꏗiX=_| 62/Z-^KeUŗ``5,.Է$;2źCw9)ź\. LvХ+8xd7Onzip.O;NE_=9H嬔鲭JM%Wx8oSY)ӥx9p o҅8)) ) .mɾt7tu}(^nle/O J~tnrVJUjKE&{q .,QT0N]:7:L^@1'W!8g IX 0-׉i,R4] 7cAAaJ%L MҒѯJ5'DzX`RA#|࿎Z8+F8Zhhl" p̕_GC#sp4H6<[ATM{:زuA9W챲E΃4ҡwm_"!Ra=$k'IH0 FHαVx̎kD _]&2KCIԚ٪T*fmT! ~ҁwpl.O^={oR{*{t =:f뿤h .WSo}lMh6E)$eޝ.?4Y6J)R>G*2#QTc}I?d?ihR-x;M*V:x5 c­s-R of0B0>]Y:~T__;!RRS~fs3b%d~g~c?~g^O#gcFA< |J) y _ߓ@~!uO< fVedI@'\ۛu<Ƈx^Mgx5٫)l?iqovovovƽfgffgܛś|FdNh-MJ @S^<~hEʋM-Tsހuy7^B.ʋURW#*Ze'[o'up..K~?K信KL_~Km]tD GM'Lѣ&Q ^D4i5}q~- RTӡW{B.<~r_狍_Ư#;_ǯ^x'[ZdJک?&鑵T`8[2elkARA5Iw aYE*hy`orBM/ Kh5s+X(ӥZy|& Xsd'_{~G_}|1=SPXF;&;R5-ztpd>;8mgyW} .n.{G]&^˾e%}KQdynee|hv]ƫ]Ƈvhe]~.M]KA ]fette]u+3,WVXr ˕Z̰\a2_˕F+'˕tٿe]/tCnJqyMT*bض:rto.[(EˁKx}?~ouϼWyT۫[,*R9lVp0Q7-ۮ,H+. I6mA݅gIX;J d"Uy "^JuY-Į&U]m`A%Ih $2BZ*h,uw_RoWi}2 UϷ%𥴜Li8r1Q*_JK9ODZr7,OEjpZMF3hDmRI4G/(| <">tq&"y)<6\*r.ͩvJY/9()|> T9B;ڔO_T> jmM(T߬z66Snl5#dM k速Fk,U6_K̃wCN-10 j<鋧4Bn"x?\*~4xm_~I/=eXkԂ%GrR#\>X%I\j .>å'`Vjb AQ*m=מ%_ ky1XƶdzS/-E)]V7ٳ_&i6\*~\4lZ4pؿEC8߼ha!kѰaE~/%\j*\_˂&1+,w}v%I@S9fK eYg8󳫝DگWµ_]jz~گ\ʵ#?Ĭ%Ēm]EK*r%[Nג-'^]EKגm]Ldd"'ωk*Zk*fڟ]qw>n|W9͙7Uy]>nZFKi&-i&m%[ndZFK61jRmwZFK^Kyk ĺ=鴍ۃMf$T)jXi"yTtCZZD%ֵ'=$̝.J59\(  SҖSퟵ M?m05(HZ2uo,:>F}ɶp/6/2/d˼dۼdkq&K^3/w?rƧr -c~1 {ǔ;wfg1+3Ҳ_ӭsӏt7ADW>TMyeq^7&,XX p'c]c!RG@4OQRO1Y=7&XX ~kr7j_kWz~>z~گ\]ƶ[L=DdfٺEjζ5W7ԅC{;rܪ〼.> /GuOM~~~glʶmm~go7'777(vG嫹>Ws}5Ww]|5jnwÏ#`,y=tyhsTW<{ae|ρ?o[# ~ ~?|_'rohMj iZ ʰ"Tޚ-$ aZl+= 5VX rV [aݭ&ºZAY+?w?<{Ŧ񁨞L> jM7RAPs;=eDXiZnʇ F k52>K~?fٷoghFp(fwf$0HjE3MǥIь$qE3ߴhF_߬o~Ho[f|/zHR|K籌1/o*X8$Fdzesu >/5CҤp0B0|Kp%vB]ׂ,M]&5]]Wiu-/uwӫtSxFgDSe<&6BƳNo7+|zK ?|7i13 vQna|BT_qJ/Lɤ a e]ץ0_2sYXvΛ\>窥@=8|h>KR]]7Q*hFM.q3o*oo̼1kq7-{:#|7q˲)zo%b{zi_\:RA=v\7<$װzZ--Hڷ82j"c% _%Ô]; RT*ٷD7I L /5NԊQ1 }.ju, ΫTrQcISӆ՘U_XNd"=w%!L| ɇzbȭH-b,Vkl|):3!԰"^RI $>&NzK<'c~<C<?~T~d?0yTmR0J'|~/\͵]ks ~z'/]²a{ E*hT^Kg&yrހ;4UfUJT-x-62R >G*)ƇSzn NDh5bM,bS~N:P继@9JU{_qf1RZ\p.JJ9ުrX|m[m_hg-(GSIۂpeEҌ\!Lj|=K% 7 OJB5{!ٙj*KU*odrfX$t/dܬ LL*x CJMɥ}ێd x~HR>QC3Y-.Xx3&J'Nr1,*8[H-ʫd_k k.[(Rʁ wl7WG\;@xK@y-`s^Tk&gOc5KR(| 8Œ-Aa0cÇb&)P*{xBc Jl]*ßϸ׉ [+ _J~g3HZ1ݥ6{lH>ccm꫻LYA0D>7<2Ra# mRGu\?VYDڟeIrPR 2yK.CX]W.CX]7 -EtoYl+ti9R=_HtqK#=b]\p7\kMkޚxͻ555׼׼׼Zy7y{ͻ_fY`VaLrݬL67M*rހuɒܳY/U"JJ +鲭H*U_܌-2EIiOB99C)d:(zpRAӺ %MsQi15v XA;1`ҡVFӪϽ4*JuΫTe7.U?ъ&ٙ=Ekr <7܅Ux1!LoJ%%6^I4hV: g٥2+u uՍ5˽U -ʰX ~U :h.qi.h]h.^ݤE{hύYN)p@ⷺR?(Wd!_.&d!H -7mbcYZV bVpVF5#o X2~G^(o;k!+E*h9J-t(2m@{ Om4/ܱ)MU@34(7sAWCӂar-N}rwâz<H yV{Ȥ aNэF7@pY#4Xw,n `_cvxAPE2LLY/GU*7;*E-Q\Uo28q!5[?OTڤn=-| <˫R]7X#o!6U`U=g`mM &Ud߈6]M}hYzj\t>4ytM|ْSe?O%RN]FB3e<"VCpqDK7x\\9)վGj{G~m]ks~QAFl'>4"U/--/r`gESL&K,+})RS#Uq1>mMIXʣn^n֌Dۚmmͦmi+)5%5.yJ|ɮ1vVT*8`8 SV GM8Kj> /T;_}{Z}|2J}d%@B%BX|/p^B|PK^߶Pqހ;6Źᦘ*~̾3n )EeOu*L1ť~^1>UuɴW*V;߫xU=2GV#ӪZ(U[bU]2K~ťΉĹ DRXH9(jT_,4mbT!4 &'[l ?x#]HjR`]U1Vnwn7nn78500Tha u^@J Aǽ*?k;DŽ0= LH6ʇǥ|(ߚ2QmD/Xo˲$WJ A88r. 0;+ʾ_ pCzZV:Fz5E.FK=?M%&j`].Q]xo"\qvn "\HC!ɇx&>ڲREbXUXByV1U`f)*7 ]/t.ZkL^k=_kp7&5֘=k^kș[3T_brAyְ@J /MO$||UA9|%U}DTi"5=!2MlR TtD).юo\//8WW}wAE&XK"Q*F09COS0R n1>phr7;`d8KE =8REUr !7[J"V>խWd.+} d<| P ʁ5?d]`.es+tvwep0p dM`` =P*0齪; [;0>_V*2[žbUl}[fXlV*VEf=3~]mH-׾S!Г'1lH+GO_H67<&<&␃<&{ض6>ӌc$KmǤg+4p"LOik_)ipŚ"$2i| :׾Dz>Jx +?4d8m[9ޖ|Tz2!2|k'j|:I`I`k&!5N&Zh5 s,(Rʋ MZ8\דJ>8d=8#֧B.WJ.OZ47Z{v]I=L|y+NLqUe ź\NQIv%=Wԡ]C^UVR4t^+/?Q]9AL YvroM{QkXu4_U FXuЪJUIdaZU@hꨕWd.*)kTlVX?W̉BPFNM1ܾ$=YR`\6ԿCP>O'Lcl7EE`T>DǦCK@u&DnK-o7XWc] hu^°[°^nîQծ-loy [x݋mUvjwjW .ʤʤʤ+++vLL Lڽ22i2iIqk#wnٛx6rǝrǝYR;ngobKC|J _f )9˷R[O6Li!.8岅"E\q $;- YpU*Zx^`pG]Rc*6]1!HnX0 o *ؓ`~+[dم η한7&]΀U9.Pu"«T}$˺M.[}yz-5蒖z;Aޮ]cl9WKWfMByneދ%+,JkQB"Ǿ(ddދŋɋ^ponP7Om-ĵyy6O#lky˵aueWauJ VWvtՕA"UܐКc|ϕ`25ܐ0B(!K56LcX/4V0ubl6ͦ44ݴW^N^n^{y;yU:*w*wW{0ǁIgw (`yyH{5:LYd ,鐵`TAU%uX|lƲ@0 wYsՑh,Qju Vn޸ zosL&Xjک r&jܨ .UuhȨW0gp<?I)VBˋpV-uQ `Jttutl::::Z^GM ܝd+ hA传rNFgޝR+RN$uI/]4j0 3e4Tz1R02L#_FM#Ө4m#4mLc$6|FelmrHI\c 9OE16-Q!hᲅsEsހdd]$' E)%{a2A&x8&M`4+W\Mӣ4m9<_y+rUurycJ y<4]ުGvemK4ߜ7c*{Ño\ Azh >}f#mZw߬،kd9/+=*ds+gk𛬽i~9M(ͥrOQIyRmm>:ImAyXU0>)劫k#C.NQҘ!W bU\տ9BZ qܨ&Xnq0p_4H-⋀u_,HH/"WwjSEwj;WwjSEwj;/~SSKz}8}(^.Xi0٬Kg/bB.4E8oKV=,FXXŠ^Eª ~//:/{aw}RWd| JˋrE,mZ(ze eL+WclYqYJh =d Y8P7}O6ydsl6>׫)VhbbX)֫)VhbbX)M^oL{{>󂺶+lG؞|_~/tuue}c} رRUAf],G %z쪠|#]|H6rf ZmͰZaֺV[3jkjkW[%f=֖~Nힵ1ͭ?tτLk51|M1إ'L3!{> 2e|Kzsi~-ĈK&[\\V*td{?cƓJyc eԌ Nv*7%7!oa9/(MZe upGhp_Ĺb"fAes*8W0W0W\\\sEOr'ZNL˩ԢNZNI/]N-ZNt-erO鵜:aXWҐryk Ju:4 !oQ; Gfl劫d.D=$sW>Ϸ=~Lc[iA&f"RI y^8HMt@t_.3Zih^^vĉ'+i:=W2B)GVd>lR0UKX 9NyNuln r2auٰU?pc.R3|3$֍UTf.!3#vJXO04Ikkn|5~~׿| m| 2+YR7K)҇[j)S)R4Ox]^BRyw8uX>BjD7Ƽ0)G sj̠NIGpMKywi<˸;! >5+RK3Fm z_ʚ-y whq؇#(MRՊ?CSLzFlBS upU^wYB[y׻U^wҹB[ mTjvn"ءTnDJ5~yK$DHvǚD*\s'٤Ϟ"N"hsRAJ77m|v~X*Ӡk)Tk )M)]$%8% %KSגy גKv-YRAp_viڥ]Zhj]/ڥviߴx.9뛣WEލҔb]ͳfGٗ? tY(''ʻzԹypEoz&!NT*)͋Zv^=B(x,? >Ձ5)e*T/GO^7h7N)e +Qt]IzJzㅞv.WN%5BS8V,r'٬.C_K_?KE.vIĖCGP; R"Zn-U&; tVu煛t$3NLN̉N0@Jg`TS$c㤌BKKoAw jn5_ݪn5Cn5C[WZ[ЭċiyqSiBOOJJŤ BOMVVRX 25b|x P 4Mux|<{|<._=.__7__\۹RT^^4wNE x YNa]S]:ob<׮'a]iOZRl^ؓts1OL6kRI3G_)x--׭ThyAlBalBS M ޝ7ȒT{LHYsIvaBӡT!)XKc^ƻK.ejzr a jd nZUhysTo[# ? ?~<8Ì@OJ^.7JDrsm'Z Xp-K ˁ4YWr(QH f-,M!̑0pZRRAy*@_מ5ĩϷap]s,4Ne򺲗 %Iq!V CcAyԃtXZc-j !H)_ s`vxzJQTn^M00.˗x5VGtl +6AE' FIz;kXP  ֓R$2*G)-33\*?![RBRu`2٤3$VIv?vQoweN+!HN4 LRi Q<ɮ4OULJ&ip?Ѱ& G Zz^,B 'jYDje5( 0>=4COꯞBO'WO'Г'ГzI4^_2..#2)馼azy+)7az +=+gZ6T*iTЀϒB"Ta\b)E*XWbɒ$9oXJ"Z 8Hv$ 47N#. kN߃㗬RK1No'}nn8oM..~?/uLd&ol"Md&D&ȾLd'6&&PyHCϣ2Mx*PIbPق ]PHrŕ4xgln 兣blKAXA*Us=3A (_޺T/ӗ S.&b% $w>E~ 9[[ޠC䇪Z, ,z$0pt<1D.NANEC"Dä ;nC1X]兯-s ~@,7{m^l wu$XvO/_;}վD ~[wjܵ_ ~k|[c}Mj _bUļ ZzDEPmhV@0o"Lck_6yްگgR߬3Y2| ߚРi)/.FOA,>)2>TA0|֓q,B4_"1ӥf[R 42]*L66znfӭl6ʦtmMַ~?/~vω9.Y䇢ڽPP%2d]XcwΦ}ǁqSD[ ReD@CӔ_ljEӏMc+gSOQkV@|- ֓{$:v3|shaΫTVl24>9ojz7EᦨnMQ)CSTnz7EKO01`q2a4*W2bމ7>J=nEEE'G}GɣرGE=nEE'G}GɣVGEy6w̝gߝgqyy6wŝgߝ'syt_;=}_/_w{%Wc_>_it}(~IW/>_it}XJ/ջW2jdtWRŵ_ǫa? j2>J72"ʖu#aod}#S ߇x##o72}#*% 摽iZb| |/p(XXoB)}P*Rz_(|df;^=!ki~K`IeF+|fe;n_PӺK=Z 4X0T /Nc*r3 sp~176/> d\R*:m:HꮮO.,д,J:%~z῎r0%M~hI#|UZ 4M}lKeME;yI!>v@ |*"Zj_.ᯰ;o+b͜}v*Xawﶈ ~E1hq<wk һ}<\m.4Bj;ÕO^۶|q*:!{0| ? mLͤڟ6_c%ʗ=Hγ4t7 $tzWT(tœ?Nr?yjB %ha }ny3˞K-a ݵhY.5~k˾>}}}Ǿ߸wߗgw?WuVnч( ~V*:ʵ46EmZhZ xK-ϋ?>dK'.*b3wڵ4]}z>϶γB& q~ 4*vWa>I",MJ[.56&454=+M禊Y}5y ʾkЅ[77(n-Ji{l^`yxrE:llEr:BBBJ+źhyՌr0٦d.D=;AsXP +W\Ŗ$;R`I& zW*٠8#'g8gv@3vAJlH6Nwv2%ڠ;ݖ9RG6sNGtd!L |rPCI"E=C;?C(LF~Aeps|7]RO7-tIJq'r3\$=erB"Z}gkrEMFfl @JŁjʆ%օ* .q=~a#xָGl 㖬ax+%m뗄0qg`0KKiR s"ҵTR畷,uʻ`_]jgKK.hJ(A 'HPy&?"s`+F$Ox~xX] *Z*hX š xc~>@`l;~1>36f/ ovb|5#rC5×:ѶɮS,ڮ/ ?'-fQk޵ӕxd$R}5]k_M<8-'-5j.?wok͵ߵ(C咈m4Ce Qz8<I]oPFFl iDw1>G*oJgZ.خ,vTm|5vY=>:JRX| gձo\]S,-c7}?}?Qϛ~~ᾟ炙'%bۦ?>n=}*K~A#Fj5U1>oweX\jDWqHtQ// A]0b2&! Pj| "?t9#.q>vKFF5QKG@0ǎ@ >uWQҔҩb޵Ok}]Zty6yj5OMךGj_<<#kBkhͳkͳx룟GTdCTSW8ŴUUϖ`do.iR2m|5D* YE="U?$| /!jIo81V_A?LIJT@o}?Xk̫.jϢncz)Tj?i( Q*í*:T&U56>?G*-1s:Us}m ܓP^ee[L6i?qꓨ? Uz|Kx!9(_U%G$KT:%G2| %G7%GXDTi&'Y)֓쁑$J"f/%D1Bfj.Kê~ 'Ì sqAFococ~^5W"KϞl 7U2*oW{T Ck(-G9Q0J~q]ZE-|F w-5p_.ovyk0i I_zkkbT'?4Y]jY56>?)# jh Y"{O!{P{q_J&TNw< iT鴼6:-*kNeUXlgp;-.RwzWQDỊ*:Rzb]*_S# 5 y UbQh`HbdRv^nc KnZd ~%Z^u ɤlCKfؒͥ'T6}rwo;~}qwߟ;U߿q~qqx?y<zdycnCQZ4!.En.5#Zexdyc%p@}y e&tYDigSq5~nJ#jou!!1I[=֘ >Ji&RieEogI*4p+"y$/fڟ2IwRXi[}7u^>51>>K@nY_O?]*?N?Bo?i6ɘ_gbɃЎ˧Co*k8PC& ?5@~, j|5>䫌â G)TM]8/ YPS[)ʫ&e*rk/;Gܵiz}ܵxƪ׉\Ow?No鬚 V^-xVJD:5}`!X 1 Jt4tЖhmB[!t:=fBPƠ:fǠMcPK4tA-i Aca%9AJcP1hy jǠ1e6A3cP1h!M'+/+ r|[Af+lV ݍ2w(_݈&:((S7 Rc7܍2wU7z*:wE6"6*,SXrQn\y"n¥j)4M\Se[e@zXh㷦M  :H@-0 B:0QK"`i6f| :gm瘷n/Y r! K.111cPIa *a *Th *ǠrAǠcPyA垉 ĕgrĴ>{&.4vE^3q噸L\3q 1fcL+i̴B߮~T~rmfTojСKtAzPY:[:T֡~hAw4v4^;RhG*hZv4ҎzhhOkG{j 8H/gpvu*B^AA/ c( 4 WV]wum*u•Neh)}0T& fhj&wtnM&D.$ʵF$aC)ӡ{y=K! %Mq\MR`>L:{[3y[x[3mMmmͼ555,LFˆ?Նq0J~F4v9_ֻ9A?/~hZUr?$j_|[/Y/ &-lR 9Tc 56?Nw’ulz'<7/@#|ϳteϛ7I3>ϳ<:f11DnzISH+w:hӵL r^%Lǀ蚃9NQbr(a/\5MZ<Ay ZSl \1$#U$a=^[?&顥&@ N# .q: (fc_-RE=.ygcbr"H3.q"H_麺.wg ?s"*7/Dž*G}Z 4X 1g9-M#C]VZWN]|[IYɎ1?eHj=$W=٦=Yϴ'ړI_ݓmړIrJړB{iOkOگjI36YT~ZhgO!0LԝWԳgR[ʡ$VtPCL|#' N>r5YtI}*3 !XM'>sX q^dgZ+D'@_.?7CR eąˈkb#.l6BF,j66rqֈG#.l6F\؈ۈ#Gg.{?1bt,Z%)R>M7~ ~~ʵn_{ShHƫ«^{p~m@mI2M  5Wqx+or}o$rStnz7EᦨnMQ)rSԯ-l7Uv(Rʑ~nMawϟdn)m+R/$tiwSo}lMh6E__.L "ꉟ!!reU >R&<3~3>r~ǒBzcԾIhw/w7kOgsCK[_?¯ G~~ `H| ;?>AfQ_5+ Rq ?ngӝl6ƦtmMt'ngoǶ(RYRPNxA^*]A^*ZLjRT1qXJTJIj?WJRRX#| 2}ajjU9ԪP~@f|jjU=Jc #9z ;l(RLg5&-NY2@H-W\xq.'7emRmTUz+6M΍*b 5P S\Kt !"_,#OY)rwJe.SJ&U6 )4c5NOO;ytSi; ܈f̀Z5Ŏ'˩Wo`|SJFk`#4IC:ϰRp"k[~Aj[(b*Ptѡhcτ|(:P@CŇEu(c%R$sҧ: VQ gƛøf쟔Fb?t <T >g߃gg3y#g}>uggɴڧg߃F|%/v/B+v^|KMƨTʾRjNJX~C ^5wUЫWzU9jߡWC ^?~C#;şp:O;%"nJ5~RR >]4At;gVMA䓜v$iT!>x |&*MjoU80>$#I6\jִhj+R>&Yjvz]-v*p<&cӤ cly{w.t=$]}K4_3-hSi8o*䤉ZTuWLU F&x򑮵5@sB"QX(R548!k8RCX]y@mvV l c-t¸nEnE ԭ[bnح1O}7>+XitU=w+]qxj+6{mFd/E=omMГ.*痴e.CO vS*$).Au&Lg㈨5dr#Vz`׫9M:I4Z 4X#,{T&Y}hXz)9D7󻝴˥M)7ť/DJV~XAPTah.&oRR @CO܋K% 'Ơvl;>$7J@j՜qUwۻe3s SdR&U䤩*/R/]› ])SdZހe#>5'~w8"t? u/pu/]Ve]KtYA} ̸u٬.ԑ\uZA|SJFk\m/ ƎG5I!Hn @,~mkouu_Z 4x5` +XxYC055` =XxY 05/aS)o)oOyyOyS޼S)oӪ +BJpB%yy*U0l;ARjԤ0C BGWdPPbl%υ+`'br%K|/$t@<2:uNpY]s: UpV!xY+m[ OR5C!Rx>R]RSbZi=暍R*48ÝRrR@mr hרH޳BPek4t!_#Ɨ -kר,0\*????GK)RJU~:d;oKހ;6x{n>q{^ )P*4T*7E\.]jIlF.;H"3mPHեvKГPRwmlbZ;C}3BKȤ 4RWYϕF Tr)Фϒ h(\*'A \T&˧Yc"#%.Ї & FfL.=dfYT`=CH` [n{+4@j]JG ]C|t6pgެ™aY6uaẼJff WMZ[)S$[ʶp%A#.Y[l ԣt)>W)D+랶 O>Rk/ȮFOsCɥR๜,iBkK\+xJ5b5FΫj,ILYPNBSJl&Ay TwVnRk_Ed]vTnt BߑJFsd4>vKM|ԫMR ѕ§@T 'H5R qS T!>Joi Iu 8PMjϴ0Ĵ~쐜 ä Uc3еJӖo2WInhl⬝>ChZ2 6EKA EjP+R?*R"VdI)cX9+>ld҃| }gaVo;M*,D)cvh_CoEO+"U>GxȶTyLU*ye#?,`d!X?Un5t)+jjukpu5ƺJV؋Rc/RCW$9ZkF(n%!Heiu)?  74͢!ؙG- kQd:z2>U4+\W˯JR`\z&^]IcO'Տ=i^O]-<0>E >׾H^S4σ{?ˎ{츿;ˎ;qe;vܿ_1FjjTL;Ը3uLL;S43uL;ӿ7eƨ⮈]wșcOJD#D?nM J ;0>u|R\%L$Y:UHz2 ˔֙OMAj| 7hpfvxnׁ^IY Uc&-,?lh!L7XI3"n+XxYEV1UU V1nXlb|a'QU T>=Ĺ'U8Qu%Rf.o|?n[# } } 3eTaϥE-P7xjl9q7%dgWQJ. L]BTvU.UԙBފ#YRӅ;v*x'ڥ["$2H?CJ?Km2ZOBJu{`[BEs݀k ki=-tT\H&ä #lc 🫢E {[]HKJ%ͺ?-ObX#0!NJڒ=XVZ"~;uƇj?kUyf gkڃq.ZJ44><34AסQkG_&JfhڃRܝ~CW}hO%@& &C.U្痡=D,=!%`U@^,Z_]o0|$Mm٪ Ad2K| M,L&#u-eL3>kGTǗ: 7=ʹKrgh>#įBHo65ʵ?QCX,VO_ABܥR]jj$^iBK5QrJc5\rGv >ݫqD{8zUj)tuj.-k4CƐ*(E*XWK1MjZ*H w%qо$ڙRKr`؛GC<>{a]O5+W\Q#٤,DBdg1!H-ȹRI(+6`R P 4Y]K5 6#+H`d X"  $0 4c3 PBPE}CC~s+v3BpwMҌF'JkX +;᭺pQ})(+캖|,`K5'A*fW["O{?cZ JPI')JnZ-8j5K:Stf59j Q>y#V/'__έ_R@ܒd%Yd6BSKhͥ'P OhɦCYJ6gy ۳%AA])RDG6]Nl2° ZAzhi=iG-jJdT!HKx>TonʓMyܦؔMy)76qdSlmʢHL`lA ߪnIKPB|eo#u ~q,-DI/=jX<,X`U.MZ<6 wWdЍ+nv@'g 5EPӌԷHtia4E if1Ch ) KK=ΊuHzaƛd{!Io-5C;b /F 0F=JGe|2 L|1u__/}s_wu}p_w>BXbߟu}r_Wߟ⾿}'e!jD$q==ԌF3Ol&[)R#.pB(͎&6֠1ܨA{`X] |iٮeYk[! \j6| :|[yΆȔQt/+'RR>T7ztc_RzcH.pt|&+`hT/a|MC5$,%UKIow_RD=UXi=R ʷKEr6Ivc!`( D6>vl_T y;z@w>-@>֟IJ>x)Q >;RUgwگSr.k[["$CfdȲl[|ym_c2@I91? ~3_fyJj-PBRy*ibO[OhξssqkwIVЂ.->;;'55le9ws/= E܉_LjjҦtI)SRK٭(s \0:e;RH)$Ob)sk`_Rn.]'f5d5j$R#oRD t /5G1 aPS\*9AmMj mfGDW%L6:tM]>y]}еk:*Ax,E~]iZxME-yk>.Cs+6- 5k.<|>\IOm3~ʖGʪ!§So}?c%˺d}ْ{U\1o+J4C6"ܚMēHv{\qeHl$~S[;4]4=-Z-`W𴼝^K>X%ىmImyKϜ˺}$ پ'M/iO6/CQMDP лAYtRd.nKr+x|˶3/,)RAbM|Te{'m++jhy3Nн_DYTr%w9^_Q, 0I~>f%/V%YG9bwB.)gASvJNk$RAwJ y^lt~𝒌դƝҪSvJ#vJv|iz~9sY:Çm&wUf&kBɡ'sup.Gqz>C^ ebaz+=|FTe8$25&^YJK)ezy;7[Ujx`*~izx.RJu9߮z:>7b]gmҴURur ^|ET].9[$;۫fl3ܤ˖N1 mb]٦>햨].Bv07v]fuy~!]2Kźĺtr~q]K̺ĺ.DbUͭ~۸O Oǟ&@dOj}R~K /uYg+KŸǷG0{LaLZaLTaLaL1i11iƤƤƤŘ$Gj (Ȼm8PݭT YƦY–$1?$=DhMX|-Uԭ:A6gEkJl9+jT<y#ᚳ \(=!PFZm-jSב+/Cv02 aC/CF02 aC_sP8_bqTTur ^㗬qk#[(+$٤5N_7_yu}#)о/ofM~_ +c|KiYzܔ(_Cx! dT.Y/c/?b놿`놿b놿X|h2n$yGy,ꁶ 1xz(Z:@U+(dx_(n%tYAIl@k YJd+uN#~ЏJ8+B'~G=~‰#m(8X) 7EXS>jr7E(SUBSӘ^^MNcJ8%+SRBSӘ^^MNcV8%[_)Ǧ)Ǧhr{bYE)IZ.=Ey:aؓ~A:$]ْW:'7&]^g**JpFY^g(**zpFVq,ݪsjw*ܭd'Kq*ܭݭ:w+>YZ%q\7($wY oPᣴ! ;ҢRtR&d*_2>k/9b |s1k?oaRkeT#V߯=NpJ{i].g{hK3nW==zu '>0|]:KХb_.W==xUFk3 ?|b^bRo|kFv!H'a𛕶W^T/}E4B|5sg灓O"}YqN>\m|,:? `D(/cYilH-.A&fC! 6Ɇ0oCl aކ&|f܈'գMjmD$Ml*dub;lv؎mNjxێ7b;^o;^W+G UWZ~R>Ov5—tHv??վ"E`hMwtd]JR僚ަ+< Hp g0~Bag[)Sayy0bS6-!J$ aZd-L ]rwۉ749wݭ n#vpw齡t1viC%NǶSXvI~jY1^N*iPh].e泻gw# >|vWﳻxYgw>|vn~;ͻKkkw5}xU;D 1<[ʤWW6>߆s8zk8zs8zw8z Cv`QWAzPSdvn v젷˻)>o?~l9|r:'ON}rZ4ON3n>9-W ? 8|zK%FFs#󥇨KɼK aK\T+U2,Z#-˺]*$~:Cp+JWNvT)9RWm|OiАGp^'?0w'•OSM=?ʭ v ?%4!;| J@„߂ b~U W4.?4P˔I+t927q/IKӗoՐ#z5-劫٢d.O<&1tJ󽥔2Blej~s:ĺEP˶rE:M.G]I;ӎ7`K M^9#_rjMKSlynekJjUPr:l [,9X~|.F9p7&]rY T18ʼ/Ɨ痢׶-Gv{m)W\E_2L$t9-(*? q`L7@ȍDbRJʒ(N <`<|Es4hZ 4Ue$Js]> d=Gi '2Dx΄xA- /CV[ΆlH-W\p.GaRM=ޢr(bM0ĭԚ 6= Z\1B(avRY."jhYA~-mx NM2O7&IX< F&Y@2r=|>;d k'DcF"ߥ_%7>[O>U3hJ V;Ms4MZ|}yU)RDܤxxdYDP6UTSBMMe$( P 4XgO?]<aͮe*T/o^PJGXHpx-̑M)`m)W\M_sH$ty3&p6L M5"G&U}c刺bՑkz[])n -o_4T3٦<97ьe xˢ'!R-` H-=0!|qCrƤR {@#|5kuy|y|<{|JOW|@Α/#x]J*ХF\Z}h3^އOr_&KK v,jk|a|]ο+ k|+3$uI) ȬbRr`6ʚle/f$HY &Ȥ غ4.?=_RAKCMSx\!ټۥE|h.d|5?D8ss)e*L/=D3٤%'JWח}w)zźh9V!h&;ԋLze{2J0QkX!/ |/ >/ ~)Փ{>/-CW/tv~zzKOQ^O痥ne zynҥZf;o}RMХˋ$>C&<|og%MkW\U+(W%Ӕ\q oMSN夸Rt^%sSnMq1lqB(bGud.hcUҖūz,-dc%:N`Y:l|59)Sb<KM+D4L?m P R;Up8jdkNj8dNz8٪dkNZ8d+_k*Y<{T^S M5>`>TT|*!٦~?貿e]KA.;KyD.Up0qSdKqYnuAJInE]W]ڥ?=Y0&hJU%rսvU_^0m)AVBʛtR)\qeF,$;gKPRG#鲽X&uy>эwB.ʁ 7n"} A &6K!f}RlLjtjBMrMO_y8@R?5??JS|)4ŗ h:E;( CiMsb&!$,߁). 6]Š!af9~ld׮ Lbz1T)q#1K?|E 4Z 4M_?jFx?SkX{^$92 mZ pb$reLd.|//p yCǭYi;/ijJoe2NyD.t71QT|άwo"[ELdϡlΛth"Z7M1(-qUBk:nd#5}T@v\DIe|59?7s;%77d!ieD󮳑В5@9P>!qoNMǹqR 4X D>ĻAF!/J %*}Hⴺ&ZSciJ 6E$vq$T9>@Jso|Bt`nXNXmk)Tu*.3uD8>YQ9Q"MϨ*|FgM8>m|F|+'&]VÉ顟5:=l˞F JJ<MiR6=TO9*YM_K@6J~()|Y h&..UKؤ5DY3I?du0J“dT?刮(sgR0EKo'Iu |y)S=U3^eчiy V. m譹kןL}=? 5%S@EZA~. VYd3_V03YAOf"5ZA%+FQvݨݨP7zFFFQnTݨܵ_~k?sr~\Ƶ_˻]_?~گw~Xkk3~C#500{ 1Jv4x QFD_cP11b :>i[bSjSo |&?H""a&R/w囶X5FQQnԸ5FQnԸw7:q ~6HH:g:pٖf8B0.8k/[~'qD⩃0J2"ޡb&U? WJo#g02#/#qx`Fg^ }VA𵴝95A\iwͪY 1&ȌdJ*7O4 E>4G`L8ORy@l|8ك&7q)hW۹&s~~jla90J+8G-R Z 4M hk ,eT9)e l/k`֠ar% etϢ@#vssIɣH5r#a箷^1,MZ<Αj^+ҩHR?|'M$`7$\QB.g0oElE6uX $xP|[WE^#٦K}R.-R_K ԗ.5蒃.K ԠK.r&DDx@"ަo$C_Q榔ҭ\qU`j$"rz*5ra?ˁբ,ti&VuMK՗y]bUvq-6dRijMJ kl|B+pSO}pje.)R B` ,W}-oglp.f?臡p+>AZz*_DldMKWZ8vZ 4Ucw5JpgOCV5|H5>۝?Qm5LD&/hk.kc[mǴt|hn9_C9zl4,4hU @+T.x~@8RebruNV畦”Z @p9dҶ8M k, ! @ HT(4c/+qt7,g2i/W%jf| B^@@kAA)ԅf4Ёv@;v@;yv zˠG0 z zˠw0 z -A8]/RAolJD&{(R&Xna c~)~ C{W{3Ǿ|c;~ʐsf SۖG'j'&|88i1V['xQ\`l!VڐN[m .㜵v2̢@T?Kgƫd v>!xrnzH|5MèR#.k?ss#.l+?n,! U獒 &/'[zD5> xϪ@ԻT/ ;Ia@) ~lJwҗf4c5B@ԏ'za! `};§-9H ߙTgC#|5v^;҅ZkiC:þ'y,%6^ |19]*,n أy'@z6j}xam)W\৓lI{ȰxA1J_C׭R'Y yVZy9!1X Ok"q[ybT ߮I Iqs++?]j&ZX2'kT!CTאDZ !Ƌk1,1>=բ 'PD\lR6,5\jS,n|5vOb$"^UJg˪)`C>*0[MJp_'ksMjJZnY6-dPrŕl\"٤s2PY=l9*n.U?&Qܖ|fTRn|EmKa -jQb|?4E)ƷyNpr=\S*Rm4%^{ N޿v-Te1zA'#fUؗ*=|Lsklsƙ-4=ؗ.rƙ9hiR ]N+=.`hqD9nR`ۦdcN[s*OgL]O ODžҙ\vS Z52 }(6+Y;dfFrh ^{Ȟ %k %%7/?zC{'Gv*mGHo&Yck`_Lj,DzA? ^@H0c;v}H^燵{/T!?J +?;Z 1q6a𧕞&'DzGˤ wRA Ke9bC~ apK<|Bt-/?TXK-[Y4a0>[8Y"\b_+/(Y_:p-8ufg+W\EV]y^Ov5+[S0- =?' 'p_rku"-lZ9Z 4]cNj{<1* Rڼ3)L&;!D?u*߲o-0UKoIt 4My >;m$H+?(ՓqbܮVn:&6]oN!u <#_+ LlO~Z+ReIzџ +.e%k-/AL? `$KyA-QGbiad!X 2/@jsLk)M 3]*VG.:j^!#5szYӛOc>y Κ uh!! ~PHǬm,32Uʠ`j>MJϻON8E*Xyd[†@$A^J|3Ib<YS[ϱ) Rl% åfoͬ1Vz9{(3w >Jϐ|BL_$HZ1W%*wGkG#h#Ph4hx4y<4^33 3xd-d#d5 d&dglޭ0¼[s+LnyV nŭ0$Bb;TQY0. #/$tIKU.!! >ڃ?Ԑ B8UV޳@@3t }m}e?o便Cߗoz )YA!|EUm _J! :UDI/+=Obj"1lR0YKoR/< ~b醟~ ? O ?/kvW[=!ʹVIX.M6iq&.EYTpٟp.뜁 Wei1zAzhijgipIq]j͢g)k߸'swB<jO V*h'yhOܓM˥@eI¡xS?$Ү T9G*}K->6g@ec%/~C.,e+Ϗ/|CRYgCScTp2a:H?Da8mCST*oP7ZjuX-ۃ?bGWaz%)E*XyWѝ~>,Rj6ʁ wlƈbhb3ɉ~|SRlul-4E(?ܘJlc CWQK"ɇ ZJX#Te/kr{Y MR{TINd-`STg'V3b%ŝNTynҥF]٨u:QW6zuel6F]٨ۨ mX#\W?9I(=O`Ϣ_U\{=j܆e|5?ؕ2YS #P˛as&-NxE*et+W\U!/t3R54\5NE2ʞkDO 1y:iR@HpS—oVSr< AhOCB|-!gP< U>OO>JOOR:Du!ZO%(&٥0v-\*/a{vGg_g =s=;c!'DHroR (Ke=lqN-ι-Na i[mq$K-a3hmq\*GޕKSOJ<笾WUƲGɦ,/Y!qk7&]䖅eery/.(?.o bf_Ғ$oᔖA9*>CʁGX`!X&1C4F=٨mԍzQۨucQO6F=F-q+ՓSԬbPOgfzxAUw*_)ܾDȺ^p]$ Qؤ)cn7jÐi.j[M2>z$ŗ0?/W!}V=i-It/= Zԓw XXcO*]Y/S/Ye{`SL=S[ԥJ;(劫EL30# Y@UZNܝ; G~vz63ۤ.;5YXKTmnTN;kkB_7o+RܝPM$;Mc44?luĦ1i1h;ܤ˺Mc44F0Lcݦ4ƺMci,66j=B{W{hc=䌺 ;e_J]6u!^%ϨKo8pN֥[6Wom i'gy]N~eVt^5D\6]6e- |NVz-MvнAzh適|B8 :nR o2rR6fTnH"9xdJ ˻Dln5626MO$m{"79/ٮ_*$ܰVxo JEZ|Jx_lXkGZjlޗ.tR]v.5qt .]6 ] N.;E^6 oJk =v:߶UoFAhhT_AğJy>!`h.Q@@#|5_|e|;U.L%ݗlūJeCSlMint|9Gf\J멁0JOP5HFߩ19].L{4;1 \}g 5_R*XS^Pω>LJg)-VDW7;&٤:H!GShT~>D߃7-N6>JƖBou-YY#aE<]Uxw|2Fp9Dc yE5a.;@|-vSU*ïWNR;7fc OTESф} j klBJ"Z2$tzDAt\NV::-v|#1<.&ZdiJznIpPdyFfqy*Ŋh9nMvPd glH-W\fiͺF!N>.?RGک2 X&uUb#TtVmm3oEZɬqNt";M:t6 ^D"kWRe !:<.$qGX#6  ^h{G[Ϝ AiB] -BS;OyįG|y:9)EO=nE*Xy 9dxb3lH+O*;6]pU-)9f)9Z7jJ.% X)NGXG]~/h !RMsM5l C M#U9ߚsh΍͹~k9766矣W=5?fO+]V_ߴz9un=r;R~nU,FƷQ\eܤ9%ʽzAJ;ŤH5%m+bT!T4Hɥ*.91LW//W"+3ω]#G;=@T<@rP5 PT/<@^U+P{nMѸ):B[hS) 5pSwS:s8s:k8ᠳ:{8s:k83_4y8^ˈRK*:BS=XwcL= K~ z MY.?RХSҥ}Х}K .. ]ZХVRn]fryKTeŤK1..ܺ`q]RC/eAGnޣnþC{NޱZu##\cp1x1x nx <{ <7{ òF!@cНZ~T3S5$Lmxw%NgկZpw:\:\kկuqztp]<l=sI(zR"w=&݋3/,wpl888ߋ΋ʋ~//;/{q!}c=CFA5rA{иz|S tRAiFRRb@NI ڎܹoGI-3MH&xSd/mFGRbPIu% /oBHoB+TA߄^t{y/6qwgl6ټmދ{yy[k)rQ*GȺRKU+/YTD:ylH+.kͦ,;~Fbڬ:@pSLޝ#M.qAha%rgPn)!?yuXМe!t)mi۰6Z^[m ]*?c/_Ss: AT"OW iY]wJI*(4&nzs=1LRYNf- aLd'pr;c_/]}҂.#2^K#];b]JХt)A/ܤˉgE>3YO<#:v(]!:?' BUZ)X\XW#煜t&@;(M#^OV' Bu73sQ%KeV8'UHv *$;$sV!V84v@ Μ=b34CTaؼLIu M7 1X+2wGhAHkrwKn-kժ!%2EJsh|Bd6դ mߜ:rWӢK ^XJ>R^n+=!*U??X\/KVX#\JU6mQ~ -pWRKy@lyu:[>DlQ uDu8wӮPah{jQx/6 ^^P)< c= g7-4Pē_ ]@ZgkJ(oEVQ2T״[o*R0J<njX#EGٿ0AfXB2f&U?Tt0cB Ɠ "|<$Χ~]#B}zCئjΡT/ǁ @='{`K \&a鄯J+Z=||5Q _onPn? JNV.Rߥ7^8a%g9t% LLjdVzg'`A\j|Ƣ>jiP[9;TT ) s:L :ac_0⾿O=q_׻Lrj_\ BA0 <8T!4GX~=_&24zltIKO%B/,|R)||_/??/߁|o e64Ɇ^~z!9z8s7n+9*Q#O଱/DCc!4Ǣ!n3_P ]W @Pj&CmP3|9둪Ͽ/d“xA5?^/U}>'v[J;IAy>ñ1{B.˻>CiY!Mt^\eܤKH&2D7MLLd!^t㟞lR=FռGWގ~;֔XL ƥ.եqFrJMs?PhUr&%glՒcӒdXiGZYQ~@f+4V*hGX}A!{?YwЦX S,| A<[St2.)64#4Np5OzZNPDp&9O+ NW@DVN'8 V%'}x8JcOc nenaU6˷$}(4MC5j)_4EM_M?4E)rhJY\Х~SѽUdkY%E^xAQ`}4̀lX-K6]KtAҥ]jХtAt/]zХ]/uyB/VEXfX3#,yHܔcHE3&SsLDDh8֗LsH &B Dz0eAkmC+WۡvcJc9>Ŷ_G~~m~m_~m~|ofW'^}rA)n&YRI,'n2fXlt Ȯ߮҉q.R/{/C=M,'9/5]~/(Ja_C6&>TХh'^}=GX<=zV^},}x]?ʫLjq]Ҡ2)o!cBZڑ^[|2BK5CS/~54EESԻ)o~lMQ令m)*7EeS3sST9 yԼN +$%P\ZyA5OY_fv?8[m;{˸.O4yADŽ =T>! ا<1BZ*h.```^m[l{l[lIv%Zx >`-Xx{Yx ^`-Xx?G q&/M[5Xd76"R5oB-Fyh=].q |E^-|O(Ej"1•֐9v[NtGg?/_+:)-Pwxd'LSuުp^oW}Ӊq]$,q!əVE.Sto):CeRP į1E5#_,̳TW .ɏz5MWŢ^K>cy&weܤ d򊽿:<=YH/ 7H#>}5`(S]lx )~.5OV*h jOF=N#ȓcB3DT>! Gy^4P`|8a%gKqbiJZA(UtHkhh9ͥ6Fn K5'l{!ipZuՖA6Z8'De "\d66\Fd|B4*?T}><@xp_KMå|<]ِ7eE. B3(ry^P {͛ |))<3l2n+' *t5+=o}]NqUju@״RA>JmǓxێd;OvMwDe"ӕ~dR0ݙtgzhU#|<`(U#Q|T-S|>ͦ]c?{_>k_|Ͽ? ?o3Ͽ?Aa 1G5_~?5_Uwb}Y8_87Vz*b9ce4B0 We/>pEz͵?U3)꺗FzW+ڟ)bם~<;Yc<=qg*RK.\D mn|E$^t@@@Z r/ -vP@@@zd/v'v)TW 2Oh9] p3OKQk8.$t9_fMhÐVAJy>!ls[\j>us>J6yk}M^S$Geľ=;q8.${q!V*hKkqv~o\Ƶ_]kqwtwGmXXJ ˇfýL6٦8 ^\@vT{y9p5kmLfk삓 qrGo WnR 4&ӥs ;'vs8ݕ aX87'pˑ٣@m rXk2Pmmꇄ Zz*Q6*_z={_5*;γ,<; |:γޝgo77[#/'Nl3%KQ] jhweϊ)|Pm?4z't`E X@~@ٛ+goܠX4I .;ӳxT!?;autp׉h` ß: ,\$0pO kK r"jVewb)!/^&MZ< I{# A1Η[Ƞc;LvX'XQaXʧ)B)8"S>Ys͝"䛍7K5HjAvVړR.ޭ//zKV'qdСWmlgu.XἋFUPnP)*4KpO&XRCKRRIb5sXӭ5EjH37)xr]Z;, ,Br>gguArM |K&opVaZ:;-E|UdS\pksB99^9P9.|>'{N<'T{N8x: wlԫJV.*2+\!Xj}"r-U:Ds7{ 0~8qBXtKM~-L6;a/V3LL]W+.$}r2K@a83dih$m4tf\.$T⑴E ;ž̬N1 jlڎxgH:$ ށ\y 2!a{W4r /\=G=swQcܣzno,k&7J߸8'c_7Ƌ7^GXcO!%So = IE9KV_$Ge'JÅdy2qr<909yryrh<9{r<9t{r8@HdMtd P>Cm lGvH( +D@GpIsGWEӴsH>AnOWxm|kUz!oM [ . 6V.#_dXg`@G dZ] jY$gR`Cn,#]oM[٧⼮o y]qvt^W$6 3o=[GX\ы ^:Eg feOH*U]̹T! ~R7um]*X$DcOGu>AA;>bۥs46f2QS*B|-=S q#>=|Y*C0QV_/\k\3~/w}xTԫ~/گ7[# ~2Kt+ncӭa+|5zn%%TlMַֻW~>Y__Sw~}s[;}Sy|8"Fu>!TnJ1SRIoMFk#GG ~3~ᅤ? ~8;~gg偳hԮGf~ow7}#Jjp7v~pqs:=U#ޡm >uk$U)^'8&]v q6zUiL H-xRI,@T!H-4#wOI HO PZ kB4yH-J^T_ճm.!ZaiBS0RiBFׄ&1 ?1|!:?ArNMנJYTJ/~~*J%[߯ _K7í7+z_Zo+?'f]9ŬǬb.m7Ӭ{N10a@fQ*hEr {DȬ񢆉ZR1QT钭t .T*o[j!u|s/ ;Qx#UCs5lӢ_"^\eA#*W>z7q6GSH$LPgdR0 fxͥ|9š[rޅL:'+^7j;^j{Z}U(ſV?nO?n?n7?n?ŤI|/a𻕞wjO=|O;*_VកXdɥ1㻅޿-T^>,VujOi4"nwdW)+ˁ ;R(|O'=JA-`zFaYlQUlٙ˷\p)/ w/R[-W7VSk ^>.#všbWC>J 1u_>_ ~ۂ$l[@0f"m2B|-4IS%Jf(p^O9 (o"s}-x>TfBy3ajAr[U Ug#P}_r-_K~_Q~hz(SVsV@GX _}}sw'}}q&Ҿw7u,%Ծ cqS ?c_}_k#GyWnf$QM$q>OE+?  #JV.*p=o"=r /㎺:szǼ[zД1;znzSXϝz\N$om%={y䵬/Z/ U_H k3Z$tyvtVeyicB5u֝omĮM/R5iv>nUV?tE*Vky$b@f앫UZ JGvJJ<;|^٤ Ahi3"q 0q 3q_ 0q E?3ï ?_kb~&51|ï ?3/Ō {RE)RyBlBbO)?1p:I6Ds >Ԣ #[適|9*ٚ3gxgڂ)7+4 ٥2}==)sO*ܓݓ ==qO*ܓ{R'Г=ힴm5JS$TZgo?)U񔾗(΃R ~}5E)?wSMa& ^uI%4$Π.5ѵFUt)^.XT *m 4V PRA'Pd"COWU*(2ĸ/'PdMzbR.{\.PUyXw/INîTXs;!^,j g#W+TO1_e)uY^M6iTld'0a&^uFFFqkq[qM6B#.-e ]Fqq>z\*퉓fYCKň- bWl▚JZZG+4 5Կ)Α6sXL=\ 7T?|ZeCF[YRA> nDP Q:ŻHvi[e*ҌЯH&]"ݯ'x{$S9@<[G)9$-}dI34/-$-a$tVWW^}T^}t^}{yQyGG>N|\!AY^vhv -2ֳ.5C[&JM ٥K#GNeJV.}wYݝwwJ>gp x4HТa,DLi3_z7ԝo ˤym|UIҴ4>/kbH7ޜX?×VP* {rщT<oGv#|;kLt_sۃ 9L)' j"; =*MD9cY-]&|٭s;c5ܮO_[AW5@]\`&NN$C7^t=? t] ^PGiI'[&=AM5fȠ"sHA?:r˺fErчBAvuy9pk t$PKOq֓2'%yz8e el/dAMlJ.?L}|UE..8J׸;} hX3A_i@v>K0q#R~u,6[1䇩WU|M_K3.*3 I5fJXK)Iɲw9[B/WjmVX*#\;;;uֽZZNhNhNhwB 3t`(zV^P#TMPNPN%^t90c"5.9ZJ.AD'^i/"q@zj5g4;&ddR HbRq;+?;߮z0^q.E,6+9*r顼_4`Xe źh̃d.)xe9-gN旽RKr`[a.Y#%<9g4iV-3E@E~.fl't=r=>{(Mj쩑CILJԷť+*HTԲCC|BCq.4>;Tyt YpP~.v]/}.l V-[<ĦغΧcStJ$R+_[R}NK5R!oU94<e/I/Ŭ"u*}!>|HgEVdA5?$IlYAð 8Į1"M/"ܫ)gK/M%59B܃]2- "< ^ IW4Džd.ۊgQӾ'50٬K.bo2$u/+BIMޭ-lvcYR9tMZ2>{&Ad-[8a"5 = 5ؖ00`[`[`[_mm m`wlkfIdԊjOjf+#y̗#w1V/STM:Zfc7 U9tӐUb7hEGo*; L!<,"hrKRX^ tzE0NlLlnQM.pIp>WU/j%PѤ9a0o:CuաԡW:hsE^DǑ]S{Ms8MZC8w1>p@3| 'Uƿ/ ۙ]}K)R7JU*E s\{Oض摰h ^ 1K<QIx4Qx&5f/3lO !jo Cg/pn0o$ ;-C >z>1lO^h|14 1잪KͰcR~'6|bl<6Ƴxm<'+veGm|舲9 >GmDQF''QkVslmp4o̚ߖ~ұ5/U& +rHAhݧԐJڿp^L%[J 97JUjԸXeW߮v5Tq\ͧrso V‘Th9R˰EB ٠X+J_d[?ΖZG.yrK,jbKdo2˸.29 ;NF[E(J^j]DSOzvOԵ޺%SuMR%+3SGPK:ӊ|CczWWsKVSvb%x&KbR5; f+P|?73V]5>liC.נ{) W'{YYgoMoEkЎF(Q'sƫT9A령)j,B ѳvlUO؍rEjiJ56z>MvaoS}x]^f|ocޢ\L}Fq$><3=$u/]ơ.e.Х.r2]+sRZ_j/=3WAf82W͈2WE*G!?G^U %WRq&-pw^{٠H/T_I=.1iOmu%H+SoXH8`26 ͂W'JW$52Wu=[8}hR~# *xMÂӍH^j9T2Q {:-H/GUœBKI(]r>ӒmI{DnTs1{r1͒(fݕcvא=&-F1ic1i1i4yLZט4IǤZ0Rߊ}YmSJBjwl}}Vfc1a:޷MUG2b l/t*2.t҄rz4 6 4ImRM DԓSY 5(^5.k[Hu^h  \Ʈ._h*u,4Bc$^hr/4ԭSx7RoڿY56\oJ*۬YfˬUlV~aV\%uXvފ?ų%k&.R; \sdBbl1/ܤK{K;e^RviGW]..hvK]WM5Ĺiz 2=OX@ˎ?ҺQ0%zLz݂q?n[#|!_ik&1tZF ^>KZqٮ5=\1jhipCg\Y%|#·h(ʼnQ] NYԵ/a0>vK;toT%}j0'@om=]9o݁vEt7c^F*3EHL?Y؆d"Q>ڥr٦˂WKIr \aJ@"H9i"Vx"!Md")" EKv(2EKz(EKv(RYv+2Xv(ҾP+esҕ %tЉ{-윙2t Hq|CЏvv߷ChE;"Pd"Pd"P"Vd"Pd|HbONۑb)2@.FuwIKPezAzP| ͰDC BPC#,}1X55(6RMvVC;u5ˬaVr|U?jf5_f5lV6+aY/F Eƿ=EKŊH:Y/E:Y/E֡dE֥$Vd[p#=V6OwdJ_G"8HDxp K*/K:DD}$"|$2#ő?Sa~U}*[UMEW7KVcAv X"8AZE""[-RmE/)""w9.L邏xh| ?wPEwnTr~7^8Ρy9gϡ?q=8ƍ4F_?5HNsON__ϯSHr$KƽFHEo)2j5yx_YbAt)rVOvhRA0nlFxmL**7ݩ#h}h斕`n<9@ƓzRO)^5ƒ;!.Cs,RD5$YtZK 'C ;Z:HSWCJx`a՞Vl+R<[p.xB5FbzԮ)ʧ?AIx./"1.1ΐ Х$^}貎͢sGjg(K@,&4i(kQ 5'wG txxk4'Q+JVg| FIa\!sǭ7a= ={ 2:e%~Ro%R6 _\KZeX sq=|4v󌣤U|♐N{4)X5Ep5*d' &E3KBXF'SWl`;u=;ZtMG^:wrw囚N=57,*E᥀7U d8 {Ư2[J ^>XAxh>nM"^SSLM!tԆ65%Φ.nW dP)x^jMQۉX<,~)#4wpE'@0E$Y;b~ -VM$32#o;B:w~wmG;B3~C#; | |?oᏏ!|Bhvز7i[6 1iD~n坖Zz?-i%-y[`KlIɖ4ؒmI-i%ͷ%9OƿMuTORO<\ *د$x@dV,\kԽ2)^)=v|c5M|M!q!UKM1 >X[0|˷#|a |>*vß^jW"|ahDm|?ߴRgHuK~DÚ[/;򁠘S[U:\Q>epTpT`Z&NlR7MbR~lZ4td=3OL_e%S~+Gsla%l_ | |_~oᗏ / }~zï 3z/ 2zï 0z 2߮w3v .GX 6at6Η{;_Ogo彝{/[#|^{_G_YC6NNK_@Pn-Szڽ<ld.N|kr:fy51Lr@@mF('6ud3ZlF6f4ٌeF9-66G#{׎Bzn䭡CC6q{9_37վ /0$_S7 Z0id4oMK~TZ)I5Hi)./^ Z_ wk4M0.}5*^Q.DaXtĴ k) ;]!0\xV5}7aO{AzVD困3|KSs,rR)jTd KλOdr P|Z uޭ.x2Pe~۝w2Ssd]J4z"{YjrƫTkœ=fS]f÷\+/&]{AIn4㖇VQ\*kuٮ' Mz},hm.ɯW2nPVًBGE1jouv PKROFK"z \p >?_~*? ^GX gMz$nP7/Ϯ@c^9_j(Mu[ gsΌ1Zn7f \l14GS<"^MkwS{)1 =t vդ{a;eAp H+z&;R~hzq+.jZ41 VjT !CT?i#uS ?t4>>*25+>:L%RB7N;=I$ Q_'TO~^'fԜ;ywRA|+i+E1 !M×c(A9V+\}D _| >.uw]+u]wpו.]W]m)6pYCsKj| 7b`#X|o]]waםnIu۳>k柪÷Rboi*)\% ]GXO{hҷvMpkUxnT٣Yr ~J+_e<GsHuQ Mߛt~TKy/dFHP'_XGX )Y'e+j_M3(|Ծ 75YMik,'G|HM1j|xGYl<6Ƴxx>—̋%y f̋ u-QeӂybɼY\fQxx͢fq]Œy|Cƙ;lV679WXJMM]?~όj{N//\[XӮO1(R]aJ8+_* [e8+o nqpSEES)Zhjko S>;ij$M-]@KM3}? dĨ)]PHp'kv\v=y)+Ywf̐Z߬"ak|>~My~e9 fR[O;HLJ0fSֿ~~?3|gJ<q[확`^jQ* kWf>| x~zUq?tQ{Wk[;~*Ƀ-Cj;^B8#<7jrnGr׾>o HuBZTRA/)a=J0֏z JJtB$z4/^G(Q=j;ۯm뷶_?~eۯo\c?u+w]]p׭uu+w]]s׭ubl!Qv0z>0>= ?h2 3xiї}X ~m~~elζ_mm[xE7qMcwTaV »6R] @,t Qp4GOsOExDقϚ\(_=(KիO /59X _oOspP7/Y7Ӝ"e}R)2v,6]EPO_4ϼhc,!2 >/$'V?o ß7'ß7;ß7|aϯ?o1?#\4D` @ M@*|Y4wD`wRC_T3yY<{ajxbp@Ũ$!?߬nGXxC-keY@|+DWQ%;j"րo&箕j_$)q־:1I*Il#!M-nirHuïWJ ^N+|Td|2BU+ZĂN˵Ʌ<ҚGʵ橉<Кk yj5kS+yr5O.5/ාA̺>5O7̺Mï4p~ .h|!ϵ_+~k~[cWMGQN %qMN[| cM*ïT_ٓpK 7!k;u=7NH/S/U}3͛k|嵿+/&]ڵwɍ.EڵwѦYޥk])Bw.%wrGhwapGhڻ#*M/)@sSdצ=@L~k i]Cj㇦uxUf'Volb|Ň n|>x7k`V:5 C&s:_1!J0Me<|\YfZmd|Z{T?k?  PW (ЃĖʶ{t=G.Ң R>=u'w];۹Nn;+u'wS5O[o >M5W!U.UQ/Xk|{M[ּikik5ik5yښiK+uw]+u]wpו.]W]Nĥv,mHD ?Ű&?N<*eymK^ 4 ]]0C,#B,)Խ@h\bYBjf–jr2cE25 s}d| t%'z ۇo(+GXOƓxVGxF"2(g#d<+ƓxJ")e\HH!=RC9$*9_s$D-{i⥝Xگ#AͿW6r?s /2FclͿ3~C#;c)v,юek2XF˨׎eTڱL;UKkc)v,v,piftԳu+գ| p>?Y:izJV?nl8k -_o;2V߽[7Ms#W<}{,vd“N#xGz 1M㺌O#O^ 4GXO;8Һ)io+ͺK 64 "/2R79wP^|d,EL4t|`~]Ѹ~Mqtl[ uжM>rf/[( [+f>[#'qnjB]wV꺳^]h@ۛu[+uZ]~RWIjߌ~RG5Ӹ0I'udzOg'u_=={b*ýW/@ǼӤ2ny6&!p/;Ɉ׉xO46vOcl<6xڗƳ8$;tͨSJ^>3'ӝHzU_K 9=Ԑ: :7&wnMи |P;7A7}U«DžW׷1tk׼/&_x«W {ðG}y܏4@|7CGp!pη,5+q-%0n8w{0p^RE_~*. B%/ Q\DJj1P9Ε etUڹ3:#GHgWg|r\R /MʛQ-9j8l˸]iF5HH}Q5(ԟ_#xKO'Ih~Vͧ;NrG\ >IgK6$w4:mNr[}=cXJq=` Gb4YojEèΗi9Z 4GXO;8ڛ؇Xg=X!֗wbR`/ R׵#{h:BFtp4 &i4xåJt /-_GR7/^Gm->K ~YN >Z~N? #RFZNF8XE%X"d['…gU^ 4~B*OԼٞÿv_9^:wPabR |߳q xFc|ϻN]w]sםuu'w]w]WNu;rzGŋˎGģN瓺ҩxL_Ok@;}牕tqɮG@Otğ+=z(@Bʧ]~ha߷1, :T/i@=e' j/`u/o~D2\,iJ͘7xӎaA"-WN]ХY-cb劵)rه.2MM4_&)鷓hueܤK8[hř8gk[i 4ř8o,?kbZ†7I>=yWoE_řaTXW*gÚL ›dI%ʧgKA7[vG~ٔ܉q.ƖْmI-%ے[RaKj%uƖޖAl?d1瑩A [xm ym<ȶ ClbYa@|dxf+ƫԑcm˼y5х>`+۶lxzLV,JWҽ1>#q܌"vV,2}dlH%{nMbǡ[J -ʱL3^{BGMdWQ| l1q1_7P"ٹ Ve4,1*t K܃{5K}V4\TCJ~+ݣHqXH"TJ>ЍC?R0 J`~K)WG9FXUBp◶HM|F"etQKT3 Pϭ*U8%[MNx/>tY߁Ty⟫YPoakZeDTQ 7+0fV̪۬ HdV# g⴩c)dIiG!KexV>@Ծv|!5^B=R֝^G`=\z0 XʾW>QL+SnR`)>JݩG;:uN]ݩDbWyŮyS/ީpթ;wѸSԣc?n O%Nlfr~G[=i!5N_'qWױo5mDӮiXjDXA=BqO=GX9ϙd9N}3 C.xs&ϙΑTq$ϙ2Ct`p\^ii| t?t:w:`CyEZ{0袠`|!Dkv{9ட\adQ| Q3a\ y*emvA"^v]֫W,+bzbbz:zbݽbWW/z\ U1)ךhFL0D6]%a%hԚN.b,E,p]Hke+/ .”]"v+.b,EE /C&Jb%\*5}2W@kG6â˸O]JK˓ @.+ʁxŮj=,ETnVq./1<`>a/,8rq/TRćz)d;ܟ!#pct $l]t'3`E BE.6rdXRw3/ӜW90>[h| F6*YאZ9.4 >z?VG+ׂ7d˵ȅ+тk*-8f,UzJ{=`I\k_\kߵ߹׾\on{dmG_K2>#CGAUoU ߽h\O.~ ێӚz< ? #LU*w>bwSV ̪wn5|a% y=jxGzh|~-վ)G틝_#rLIu%@NH8I%\gT >z ?r˙Ƹos.x0K7 ۓ?A"35dYGSXO*{4EsռԌGOaI;Y?h'0kzվ̐Q(:y(x<{<6E=NE;=BW{8T׃ڿP%W{2U(xT^R,X8j䢅Am+.eܤK֌0?r nqʾ`<%@P\vM^-\bf $+GB&9e}}/J|+M\9|ARA0en%+GC ༠}Q*Q.p4ʶY.&ugJ ^δk(IB밯) %ٽ) T/K)NH NziͥpKfsT] Bk;A3TrT*ՎFhZ-Hv9aD$lu&ˋSW)֡L{ԓťKJ׎'#SL9dQ bl2栘1(.i6@ пm:7@70},6/o)u"yڲIǞLOH/~.]ES]K~Ine\Ce.r# Vfc۽MajU{x֦Xݨ)x۬ˬaV02+2$ /Y{0qռp_tUT]("~쫻S_#ڧ0*eܧ.Mh7]r]Z*U:ټn7 mO,˸vTjvKVOBJrX7&`maf.BeO.k{5#bUy]rذ7EIozlTnMB;N^ L>`NYbU>-C5W/+AX)TK(!Effo6,R"?,a%O'qO''`IpܓIp$8ޓI䂯 rB&fo,?rJ=pvY[JҐxAA6i> 0 ǞZq_[UQC;Ǻ(Wݗ.Х2~bK:t(W\ŗ$_W?c<& ǤqIǤcҸǤcR1ic4xL1i޵?'k~[cOyڟ\mϏ?痵ߏcX5{/F2zБS@[TpǯS K#{i4KZci4|-4hFr,!_,KA-i'lI6d|fIc蚦HaI7y!_nFS_4wuխcW7_:9]tY;1򸬫&x╲ k|#5V`}5Ohjܖ(r//=5 k Du8wL)lyC,Ie=b5{a=)) ^}~J߈W㔾pXh^92ne; ~X9jsۙHv;݂O4y#C]WH㯖8'a=?8z}{6[J0lMԈWK0)/w+xgvC 1>vb;b3mUWJ8]TGT T *G.F ͦ1h4U}ƍ7o&᫇ RfY^Zvt)| sWG##ȫ##rt#.uet.etY.eݺo.e}թuꚸSSOԋ;;N=SSĝzq^Nȿh 7B~"Ӑ\@jCuiF㻌|U[}* .I J;RZ͉Vۈ«U^lD՞**/%]ʋhk8e#KG=xl ܦv-`o{F"^qt^+* wLz=sHerș{E_ |ʩ˰q?==TL2D]nX[5%~RѷWzMߏRKlM-GH%Tx<յ{+<5=5 Ou:Ou輯׾VWtW{_i_Q++輯}"6̀#C![\."1^j&ӛqΚ*M!5}<}|/#an'I@:ރ5_%x)t CGt7/p$(xb]4 A:X)0N +C*8LA&b/gz|F}+0t4>1Ly)(a%8[q@Ml4| &q4ɟwU, D1v!ٛ"E\qyLIGƪ@.4TǞVkGShWN8w&>5vc %RZ 4ջFHuK™7z"K ?TvZ:w&&/r&FjReJK^ x.SrH5eLљKr׎VR//hO37RA8U'VB*R~2A+6'&π/Yw݌ld<sS/ ]_wdR4r31^4ļ-dy,| 3׿o1#iHAJe;p^W ԰j~J($A S%Yd1 D劔(v4^f8#y%T(.eܤ [NjK;[͸_T}DV7[ѽ5a=D쨪t!wxr w K7@!5j—ftKJB< =vWӤ2i &?xۋ޴ R/ka_~jLsZ-/uNN~*'& 1]*L >zx&'} MFH[T٭ ZRḱV}ډ8ct}CPLxʠ 1 刃d5VXpXr|󷵟?~wok?̵ߵ 3fԾ v׾۞| :A\zzRiD!ڟXژ6< YӃmԾd87ڧHӭkx'όSxήV=quu3uݞVnݮ | |_~oᗏ /_|k<6rOxG)l|iDJ8 M _TvIu{4s7Ts ҍ+GZw0dleޕ V*$9i*U茶}Z/jp5g9O OSIe͂clI!r>Z;(9Ѵ!]-8i=M3Wrd0vvn+MJ߷Zu \R`UC뀤q,BjM%H+}Bj[.mtRDoZ) rT? g}W(>gh YbHmv֗VuRR ~K{x=G31h;F^hwQhlFϖ^'~Z_fç@ #Ba׳'Ft])jL &sA?QGXO=y e5Ọi69 >rѷKb t&ojiUn!+6zRh3g% >BK? >IgouEPRA8UXSTϤy6HNI#y'>ӜŤ:m-O<=*y#sg5}_ c#>RZc3*-|ZO+/ා߁_5A~셞&KU ]w.ovނ~Dme KB5'~:4Z#;[Rt'{pKEEH>OO }cc OQ4?>~گkNo)[Dnjς^ f%==#[b >*).;w{fO O/ie[He#c/2{- :3Ie₢s8.^ 4|ZH%\WsQ?|+E7}JAj E0SȯEKvTe%yE*xRKB^2(Zʮ`2S+f.&d.Oirr&qjSD凟xkӳ%x^ }C?P2ZL޷|:bه@|+};Ïy)A𭴪?kۯ'̱%)lO]G,Dښ$%h{H[oKq ﬌)xF.sOw2}1yrsÁf?܃%GeϹ{JHbnSΗ. ;^s \VpI`Kyx^~J5uQ.xPglb?㟉u \1dRC`!၂?pLj(-O%x¿{XJVXXL@!5Ǟ̶GX ڭը'^ VYv*(8g{~\k'uM:wkNMnLǐ5ǩѨq)COrǭidf%< •^ 1T/#DA2udVzZG :HFzuQ&З $Eƻ)nE MP F&nMP  7APH&(wTnMPjG)پX!YF?Brr d9Oxu<8\m+W˸usj0?SsB,a/lw9Ӡ*A X^v%Pu ?;#'u /MP&6A~@J_uC I+eCEFp>ϮؑsU/Ԡ n!vM^%FoJQd'/=%Gdn]'v]dA? [ҭyy>RV4%.Iu%\˹R /p3˹|])ˎިj|mEr6^f}_"ܺnE|*Mllee ð4A?sj&k/3:|\Әkz~Kd >Lʫ_N_ ^$R뷫] 2S',[:tՒf];[xXW%N]\q%[ &]䈓 XIY JW?6$j >H8 I#SS`gMޏMQ)>ǃa{'{1%)zU*_2ǚ#^:tGB5AV:LZr+@ ~(撥B*k"|M|MHK?YP<>H^4i|F@*i4H]*߼:Nԅz55䳆͖lE*xBgU0,6zExJ\H6鲎7bg[\}zd3^[/֥y,v3.٫Dj~{ƙKYZ0a+AQƻv5R ɦ\wl%^M`M9AAyY @.V(ƫ9,Kg[fOԯ}UTfax>1*L > @8z1 J}KH%?׳%2a'hQ[r j/O^h!b u^Z,&gM()`d!k RuTJ 4HTo~ò$^CJ . j?4 !(R$+ߏvh_W_ا袄^#F,Riwrn)V= -T<搖gÇ(`h)*ʳ=M3A*7=Ϟa%k/=߾O|~NցQŒ΍v-x;!2lPHNQ|&] 9Ty0+h~][].\e%hd=ũlq \(n[!tlM+19Delo倪. դ|Yip Ͱm ;a2|u[LJfh_ր2CްRK7hEZ!?~:< "謯R{fN=x5%"^Mjd.dUN*[s,?ݒ'fCi0DČKrl':Y+ze+:|go[#Wep!`הƺY Nk- n8_#+Z|k`aFcbƞP|t^z_=޼ło%뷋_˸Ϧ8&|4%p<.UMåq.e>\ZGXO:/(*jr$o_gXw 5^\mƇ+)O^VjYۉ֟ ˰4Q< T'UG>Zv[IeHrťԥ3.]pQիϤ(%G9R).(=?TBCrE̝ol)HmӓUaKꦧTR"^gds H~+Hrk]R|.=0-O1•Z,~a%ڳJ{iφ[gC-ݳJ{6+ٰzr=۪g[g'rAG6aTf˲—TnKlR>S~8xe܇.%5ΖnK*lI-ݖؒ [R-%5|d34JP3T#钏6]hh]x!CHuzTPvxMA -ʗfZo-drEfW;7ދd.?H?bKV}a3r]zxJeޟ A.e TYgWLC. t:A*)!R˱/+ewߣg_QŒWrKUyn5Nmg2C'^eUv b_Q @Țݥ t1>z6E?/ꕄ~TW8T{4UM7Iyݩi&&5-eܤ N&M8*=مXFfPR9KHjc*db]\q%;uZ$Х==Хy@.Uyjy_Jf Pm(RٔpK|d| fsEA f w/d!RHuɵ/\ε?]ksϻkrwcwoKs>8kz[6P 0|t^PMZ:-~[]?A"+2nEF)a^uźt*ux/ Q|{ds[Q\˸O]ZPˀ6=gLQ*#Rqy.mjq<ª<_FBQ^a@,@eG.i+l|pr=\Å{.W{pwG˒W??-6;[~3+WKQ^tYR&8m)跓I˸IkաZuGOɛb_d%)[j/cfq%+Yn|`u[c:ڶ&/5zRM _s?ƾUk;vYW Iqӯ$@ռU<`ŮV/55C/yP烺 Z{hx 8TG.Q\+v.\aYdw ϱZJ;)lKc_aU~P/6‹Q^Wles]Ҳ+4}.-ʁꢖŭD]U9-{^(1۠w^.ƭgU$C~U-c&\#+T]pHX(Krj_n7="jץG9p%.fMuY;-U6[$j zJ7LG%^ŠK]#%xGP5NJE2|ެF/9V/g!liIE/ >A9NwKM`92Sy+`iTVni<3Xy+O{+Ѯ{)iu ?CR>%?#Ц%;=sUT%'GXl:y6M=M'ϦM'ϦgyϦ³tgyCWx{;x{ Cw[}c/nu_{j,_S-PhR_앴T/B#u_]I3.:q="M-` >%G[#Jw0}r3wD= V)\rjy[V[Qc´7T;%;ڡ&n'f7#]uYxJR=ROROuOS)uT=yOaKRW1n܇I%φ!3}T% ~O^&k E {XO;FSq ^os'z% o~@(ζɷ[7gu!n ښԧۭ=qR9IyWÚ5E@89|܆Iux)^S^` R v,>of 7G'HXO֎Z/fX%csh߶H2/^*HsTmPC1w+6/  4㗊QV\vegi|Aߗ rjHyi&J|CJaXh|J4Qm×u0-NbV`ޅE _]da͎KA/ߪFyr˾nv3]עf7WqYVeG],\Ǒ+؏)A F0>JFPC?Z2j!Mc$d>׋*@;M*ؽ]\:)J{|.cuM Drel26MGrPs봌#[Ӱ6g# >%T#ڠ/.UKs4.kH%bPKk8Y+"_ >%g PiSy@#x3ej``ͽ`3q_`srk=@`HxvbavBl'fvbvN}rsvbvvNNt\an?~W)1LU;9_լ`W#ggYtj,uQg%LPS^VkN;=T[ -xA%>Uڤ;b \jXVƆS0V=vT+5IQ VR#@xHlHf6|K;ü&M-H (ƧD O/5椄Ta13|ve41Z7.f)1~@?hcURkdDiM#6>%*ν Ό)GHMl;6G]L?Gcv-Z$yW4ݷl[%ָe+;|57CaPxbrV"àe[- Y;}XV*͍`Kw]uANZԥ.ep]RqQ5.kuC#^}٩ivv.{g'[vv+];xg'`vv-ήήi8)n6KzxRAܬ/3_v ~|?S.YƾB%N5e-,= =8+o6{kGX #Zڐ^8#G Dwv+H1ծQ\y›>C÷`òK7zq"rQErq-5. srQraTVSoɬJuR H(hay/8 p_4w4| ƥI&h84iܚ4ԤQkxk~ ᭑m'?ԏQR,2 ?ntl*ֿ :-#ZrW]+cWWJu֯h/P-rWtEbON'GvЗxRM{l4:?(lV)1ٶH#H[KU[iCnJ.Gyt`r ywpL.xħ}z%j6{0sT0"^꓎xČehFQEUHn˺c}XG?֗>Xux.MB?pTf1![ ҆\6h!ૣ; cǩ[z9Q`('AƎnaƎ%03{i {HeohzDjPQb3\gb\ΈIe/g_۩ʗ33ӥ^>z~i|(},%{O- /UbџŤ2I6fR_#I'|XQ2'NJnj#]1/Ǣ$2ß|X9Y[?[[@0|FOv֢7v gREκT|6wFSal]Rӝ%DٸVhV{HuSTG'$lzjWؤdLу3΁{CTC k룡%%6Z},UJ*#W'g?g u +T޳}I[W~ 3ټ-_=~׆T "Rϴ~%;4?8 !&H>z9cRmǤZIucR-ǤZIФ:3OTO'Tk(c(c(P(PPPPx({(t  C }iGJXJ  ~/;?8L} X؜ipټt4>%'Pbk9_F̓szi ]zHhl )~ > đDh{sktJ|+mpNNz]Pp.wL電̃z&3\7pAשR` z_Q~t_ ϲ<ʺoq 0.USyl>zvx速->]nKa,"gu!SOw` ;W֟f&҃8v?q~k3Oϸw?w?~}||AA`A`q& UJb;>R =B7Ze%+X^,U\lyf+c,8yLT+K)4(ԗ [a=?wf{AV1`!^PÈIveC`Ӏ__.?I]r-q8%nK%n7%n7x'M^{ze}I]QP.닺$,߉!{\x]PTZHe >~ cq|NT.?\ۿS IO۫;I ˏ""<@y!NLw+']!GWȫ+CWOBveuY?K<g]KKLulר}ץW] e$H}] HZ6\5.ߎ)L >ĆKhUӵZ6\#цk׆kTfhS,}iГ SkiULeMeLMQ2#H/SW#،[hƭqm 6"f\|Whƭq ͸#ь;kf>LsETwZ u>_"_oW_og_oW_o(d.\_sQ0E|@B恐@<zkXSq뷃| ϺZ8\z)'_nc[{O[~/7%~a__>/ E"x("2/r/y("x("cknF>o]w+{4^n߾t_o#nF>F>ۻy>S7"F+ ajZ?@רOJ=x9py6A.א_qHT!Q?CFLSc5Xw_| q00}Ch޴u/m0b+pkgKwm Q^V/5fAѧGH%ωMN@Q\QQC߼*͂f}l~ &\ Va;}Q} M&EavaTD6T=Vv]KilR9 ӂ} ࣴ&Dmىp=Ƈf>VfMDw-|+m܀`#'xg>Qn?@MH*|Ţ[ 3`Ts1|CKd4v8Q g5d! `ݬG~cS=eZXhw⚤Rևڑ R'SZ8o]_Rh(xπ/~8 8 u2ϥXm0`oŗ5MxB!|,#[)+.eܷ&j&P5| U"MJ4KGd+f1\KMGdԿIФJ0|!%_L =kw@J0Fc|/Vxfn;YOCS խ#5fΤ2囹.^KJtzaS+i4C ?| CaOφ%V~ؓ䥊^H5s{i/Mu_v W/+;#@L7>*ZRpK +7 7|a~f 0\s5^,sR3_JfG׏7%~g߿? sq|Fjq7`iOM.j\- :Ûcw"^qM] !+dž)ܺ*ulҺEDryT%6x" h)[7Ea;)4+br^.u}r#i,6"dzJH|y~fa%9οчedo&?| " >tm$y!Sߴ`\͐JLѝ?Pm|J71 9᩿ ԠNx3+W{tx oɮ&r5r"}^xF ;l\PLeW]Sˣ.l&D--.)gݽKޡ7ݰ#Gu)8[⮹lZi1ʫ\QQؗ/-d+Q\Þ'>YjWl?aƋBYʲR>+Һ_뢮bů*egxPtNۢ\ R QQOMB2BJ@0|~C뛩37MbMJn}ר&$wQǛB7xwe'p˜rznĨhNSZ^5xʞҾ l,3X˸j?R>UIV%]j!1V-+ZjZ6 jKA>%Ѡ.{GOz%+V[խ{uZJխku+W7խ{u+DJMґk{O1َkizR`Vp)~=<#Ec3_\zi*fJ2Ÿjx'EWǫ>ӢCZVQZaVhGX ~uWrоXX˭uXxﶥ^_Y ~y;; iKj""XNJ1Ieh.U ߼Tx R~Ve˖Тl{٪/L[l5^*/[l[y+OgiVniCq Y؜(HcքHv6PX_I|5 MSOV'̭8nEAVܭ@w_U eO6q7|*~7@0w"w[}Vր/\δ-U\MZtb#$|/'{9 ?g9l||Vjg5lLc ,g:I 9;x:zT ,.r@tv0I;_1@8 pJa5Es1ۨ(+WkTY 6-%+ARh TH/q 8}Yc;! Yv9'Ez$AVwV7=~{.W fiY%Q?v@w/; (f\ }Q"M6QVAF%}jbG1+RY!D"}I][F[;RNeT6Nr>rn4mtkkrmj]QߞJU"KQKKH7r([S/;T}t쁷" SHȖeWgWEv/k++"[ϧ&X&8w  ΅n8n>nu\y;Ka:+pn8;*f@FSMfGA f%+oxF B \xkh|8ڽu4^{'oJ(z[z̅a㍤vz6&lN|J%_/l~h*ݸ䠔|J,aq! n7Jҿ:99>r8&"JGtEz#Ⱥ:4nFZۊR ^a^:aװqaװkظװk5l0Ո|ё_|Gu>KGÚG%#-=ݛa[w Ty]"2ۺ[_֟j.rb=vY"|DD?G쭯R~YqO7%#_pP񤎄pҚnؤ:!Z%gBSqaqy]Xo8ua] 뇗N5 j kU[O4T| q׋D]@rs"ߴӨ++ܧ[n:bjL˞X괤mySPnX/k.Kmo IvLd(Kޏw\G G1szm+~Ȝ X1Tۀ: u* +eᠫIeeRkv|ԉuPagBnC*`1)F |VK#s\$i|>݈|׭u_X׭u[`_ b_o_KM(GZyqm'DXj 7胏?8\҆.{VF oNG&[Nc5^ ɺhLKd. ߿+c\Svfl~ | q@=V󣍀 V`oۻ;xP߅\T*۝yE5  0/AEJpS{CTĹo=ȄgBUAl|w:|lT!ዕ~؜Dem?gka _Tр|~ZEe;3| GmH6R V-8G:;3 803Rt7fR~GATxiGH!5z(|7qwl(}:;{|WRKe0рWأu3υA6$#E5ri((Mg삕: ȐSZگesל.g3+Qy x|7,E$'ɮ|Xzx.}uY824 D]tY-x.tlK0ף.tDBa˸Ԉ<-jt6 ׂר/}j!q;`r/㦺{w惇yyay{w敇yay0ϏoC | |?/Ꮟ?o$߷Մ=l[ V(רYVuT)w3 ]>vEîb^WQwЂ F%XtQT+PQٗ?aPO\ bdGEG'a1S,Ss>=m^޺UK4'J;[?O5Fj4o5Fhj4YѼHX&|Ѻ/ᯏ_7%bGQQ (XQ0QQ^``(X(`ᲄaw[s짔JT1״pab|ov+Fyb5vr.'oM8i(C%?iDEVmEo7"_2O ?GR܃Xhk]rɃXx=A, T6g#G{:=]ǞN^{uרsO'Ǟn{:tHfk{:eQuSc!u0{QԼ+l3qeםDc]Ii!4b EKY+9Ʊ,Gm,8_K"ܢYR4&)"a=!f} r ^h H@ȅB.#G`Ʉmےb`x*Entugm.Z J9qz>!@M/3~ps| !x:n]T+Q,PucS8My;&U@0fSiw>4j}0NuJ0|I4a%uGi֛9CmW5Тl=xR^7]ćuJ {HG n.p%?[p(}:~tfW ߽TTJA}WӲ s/WkT9:AX/] K*y7`ST波i:gZ@|(U1<>4VU_Uku4#'P~an?5hlv=ܐwj9Q,x^(p52V 9J#0աuR~ԡu_֡C:ց[W3ط:u| z_r-uxii+ssDR5֌AnhmH9+QW*=*݌\Ϻ$9&Yz XfQ^偵v1v=uH[#0gnqj"~j8`7,iJ8 IJ<;l|kZ-vs'V=b*mYNi0tGiݻ3l9շjレnc a=˾' WCJ8n | xRDKU//yb%KN`':xf͑@tkyUwDR^y }BR^n ƸpuYdaF03IJ,7WRa#[r MIBo"|R١`]MT/&R=YDrH%O -[:1)AQbx-|PDU?n}vXJ??T$< MalAv"}_Xl9d/U@W8{/lUx{`%]Pҗ80_vH#]0W SDPҫF]vQU/Ú&DbfFy:hjJT^6uгxE G'xH1ВWR"2'ڜ2̙E&3ZWŒ>pΥ\Zi.4Lc.K>lRϹ\Z ͥ'rgsȲc˺n奂pJHDgCȱ1˺l3lK +o8n<1=[9qqqh8n<{_G %\4=-'Bm5H*Wu撠Zm#7j43a0ա_BB&-үŠ5Z F`k1h1~/i1([+:hJ4XƭD[+`%o%wL0;`0:w;`qL|?_~Bi PV mz8ns<໵x >z2΢ՇccU^(ר-j3(o~0^ʁ NQeX-oj]ttgZF5Gg_nz&$;{zlxQkV]4t̪5cV]<{V]o놺lu" ~ۺ|1-sPrUӒ`ɧ%1ii5ɕh5RE3|Z :#_gq|?>#ggΗ\r_r >#J;PeX:-Pʻ[ 5x 5ZCJ~*f&5f!!k^h~e`ߒJS-52Os^Ww{_o^jW?SؚnKXu͍ٚYzRGȤ$f4)|ak޼T$k!y+ve}3/|>+W="|_a-|^WG~~2>}(tkXH]{@tPkESXwR_ӉI޾iNm@mt>ؾ\}KHMT4߾Tq 'n8ԟo} 7V--\}5x℥:`ѓPfK55t>hbKUװJΗj|t4MscO+쫁IeK/WKUk#=apiF%%~HG)#&WO*_Q{ _,a%j5YskR1] }^~Coɩ/.ƶ(W@)5ݲ})v}9eUlYh$RJj%,Sr`QL/2Lt}![)xQI2-PWa?CTaDĤK-\-ZH=GIa2 rR~ޚCj;#n,R`Wjh9-bq>[/[iZHeo`yBBRPn-nkmRۺRFnTޔhYzrbHQQY YۡqG~1hng5ͅbWV:WB&b9|IeuX@6|_G>(4=6Fý>nڗI=#ꐅ-<#1abd`xJAv-@MKVk,C >Lfikj] Jns:bk}#Cj^hh!s@VY5zdՉƱ8JYG*ȪV`6}{h%x\/8g|[DPϐJA >[>~one뷏߸ۏZcYm F4Zyl#,VL!r28=L~O?~:O?yO?ϼgثX)-ݤå*KB+߷== INLRW6\brK4Li-U #O'Sybzt/_L/^|1b}PE?޾~o.<ե*q*O]B_)l˖Zв5[9II=[5[_bٚK[;ޭe-[I%1H[Sqr V:тx Pos3q#`T &d0dOIG.~jp8Y@ta”Bj6!eG\B*-1|ɮ戒@Pq> Bej#ڿlZ!A^a ߍROrĩ71qJ&No碉kT) gOS?+|BYt_龤K龐+|B~O/? ?G?+=qeV:x&!?W$qEu\L[H=+qg::'nVn|ݬyudn|]7$|n|3]7nVXyʥ<*< +O̾lVVr+Oai4i43>JM8ێюS3ZюsfqJk)v ;F;^hk j}d RӶX_E/겮G u.U RG,'ֿ;G_'mD;-Ѻg'Ea,}a%K_<9O,Ry's'~bh/lu^l^*/[^*/[z/[V}/[߾>o ۗGŸ|ߟ&pJpȤ2nj =]x!~_ړFރ&!CͶCq>%Tק34GXO)}' AfR@ebR~@e%6T@e= = Tz/DqRݻ~b`ae (  aiȾ[q&j}15. zˉlsy2|ZF:ְkXM5lJ` *-ZjװLkH^Fx(t/S(A@F[E"0-#?JT~DJ$ P-"vׇĊRyE1>DkP-B>zΦ>H}zCNnw{V>(ϣaZ4z.U ??ja%1?c c 91y ȷ/'Tʓo_*O<'GL/nv( q#Oh/1dz! WhyT<*+<59b3G۵%k6s7s1v _I?4&G)*q-ڏw%p*^Wֳ+g[+~甓]7򁨑of$WM楦 4B/*O<|T{ʣߎ([anwkR.h!eĖJV/`a=u=6ߎY*M0|-uQcY}eTFT߮CFɳ!;D9D?&Fxu?-!T5WTjw>&J;8r ړe2|+pckzXu?wo'êSKu"ҮCê3V:#禡aߛʛΛ~o:o*oiiiMg#G?/fsj"Q3Kҕqj6'_6Gjf7ٜ#>k=}>]Q^uge+_ð쯺`yi_+J5P+AcM.txs0~*@>< oTv_ MKFd_A,6E_AFŞWo̼@x5K* TqM${J8VbXmx M;ad#:1s_m`W]{7\qnDCѽ$/,'~aS]{xu`Z { |hD07J)p7OGX ܭ/[__­/w ֗3p˻-})u %.}ezHmNzna sXf(_=kx/z|WFW\ 0]7KUw{|GXo9ιPe+]bv>qZLia=qd/? ].< bɼ~>z\.W̫\3_Uue+6HrG4Z+`X6_٩jK]NX3\3+/m4}jh/>ci{>s\hiKJ,4}>}~m`Gl|-dlRi< &>J;"vb=Cy4*>?$<:;JslfJ Ps;}Lxͭ/ީ#xC\@"ICFk.up#\ʀwrGX ~^?@k ~6{|JT'4Y =fo[q뷻ۗ>~o?j'Fʌ?'Ip@Q\QQs (jIv=6ʁQKI5i&[&k`M& kdM&M$9'RN+ï7q%M N$& GtR9В2(5 +=uqG."[\*ǏؿimX_ ?1 ?3 2 ?3zb=7n5WO0`8Tien*Iѭdx5'{|>?#iB_D8+ZpZuYˢ̐  ~/;?/o9)nZq*n|sX{F᛫᥊ s ǗG75uNp.+J5*,\Kы%𪡖 Wx/w;]1Yt,x,y<{|/Ϲ-c8~NȆ\w/oi~[q믻_GOK׻o}IB7& ַ+7 ;GR ? [c  >zZ_l}­/w˗/[_G ~!~=Cwr]᡻x=t3]+o3|;+u[GSyN؍|g%VZ{@t80ސWI[qg|_goK#¯_¯ 3owG!SiF3wJwX1aߓmizwpkr>z?[|cnr~/G\xe7^~H TDbW x. 5E'Lj8K:ͫ _KPm|\n!4p0Usr>>*OCh\oGwئa_1bӠ)i(&wK>%cмzb[ ftwV0љ̀v'S*%y:iZ`f/3+Yyl a&;QoŤ2~$ RK\=oYXO7nݯuݺX+~u7v~cʺXۭu[~coo}i/DI7?A|>Da?b<_OGcv~YXk_g<'R @t5SZ=ߎ+(/c'y(Ow?}+OY+VRۡm->mM>m봕%)7[y&+ȭ<3YyR2Vy)%qgj_5Qt~MZ3$j}I E᧹8}X\tX4W粒8(4'uXħz/ 2zï 0z 2zï XO\YB\y<7 &lrRkuuJ0|+(hyK+φ %'3QV &Gk*5^ڑmYH<7\TwE ?JP@vG'Egť*AT(c%fE>2 1Xju.U nMßC𗎅e䀿\D,V; 5&C(q>z|/)O{\\qů!bW@ DlHOWQHq>JUhԔTE{Қ& դ:/a 3rqJ|+Af _xW+evӲٿU(^ ^@dJYI(XH6%W4uh[5h)u^5rp%(gƛv{>dnSUwmW-Fy]WDS^X}eneF*KMUZ:"ezTaD,#.WJW, Vڑe(+=$9"_vY%)qI^ꊑN'+vԧ 5h&2!nў/@0|ȉ^9AE5d/ &-oc'̓ե*A"'HHu}4/ 4v:@Jtw‡o T7#v>z?,4a ,#a!ȂOTa_daȂOa'X  g$z޶(rEiFMf_EzxS^(adsW4vʗdfVq+\zc{s#V}[mW zW;4Q콜Jc6DBo+os_X%取4ӒGKؒ%1R|O%|I|I{ݞ"I'MB/gXi 0^-+UQy$[u[#5PҎ2㜎TmT;'|,58.+}:ʇIOri ;cp7g؏ Mq'J0|bR ~*Sty`XkKAz-T(. ^L;W뇴v`+b=P oM*bZe㹨WXi땜#? ~>a%%jd _,8A;7]hiÑjJr k݀9gد2|lA4^>RƧ̎k|`I-P܏/U ~)vFTmtRrp_1Nr]BtIPۢpMK*YD]3d"9'P@?F' A7jztc"HlPcxLG5@_W*.x,qSw5>/rʁKynEcUjxl6V_(ץxu~%Vui2d]:D:uZֳqA_::u .?& ,c1%H*Lah.6VK;v|~h?YC +}:r 2+;_6)DiO\++Fj+e\lyv/P^ٴ4t&?m+W\ .*T1! v/1~| e?@9v<@tFJ&7S q>OO9,:),YQӑ^[u<öR?(Q/E_G%`;[txs*Ajw熫ǔp=*AjeHtA*7T H-a%V -ȷH.jY  2G@ D'vL _|:؄5,yj)-P+JJ).kZaM-ZX9q&j]ݼwuwuwuM kWW&{WB2l·-|(RרɹDA⼥Y2KbE[$[=l֥/q̒䭱r]k]Yo߃x,\|ʁ{lutIAWy?V(~]\6~x=+XF.V\p]܎[ ~z9>%O^SRuY^k;F5v.ٿV*xlمKQ\bIO I{? @@3PW)_Tʚ TTۉ#?B0b]gOGQfzkoGv ümIvlYCS {4^5DJGNYoMA!sLs֓B"?ԲBSd1gmݮR*n.?UjJ7F^,Of>7R5fVZ#k5y+&oZkxk59RR&υ乼arJHthH\~?9#fRP󉝩ht|=/G|_V?jܟ? ?-[s>_V/6&#VM*c_n6#6axm%(T~WcM.U `zi+sko+~ L|l)HP=|IwK >J#?;͏ğm~$QH|G#[‘m#|xhIQTC-q;&J[~\7@t_YWDZDDAVWJuQ.AQZ D=F?[uH^)&J;"K% ? 7{[jł(793Χh>K .P+;cXڢbbkkky--&-{m9ά73H7wǴr?(Q.b>7S떝٫u;["|x|t[*L|Sqݦ1?>" p>|~O ~Oק/ i /KË;oˉ9ӑ*oc9QXc߬/S>MYx-m<['xƓ?OfoC9N i` xRѤ+nWnŮbw^2گzڋЭ} БJ/ۯ~hm޶_+~}~ӖUi+UyڪUy͖vɾހ;]L/g 1⯱Fq>1Δ.cgu>ᇅ¯ I h7ҵ~1B^CZL hWk=twFwWw:tj*;v oK=4Ҽ8[RJQ2 M/Ti'KZ5R3<#V ޞT=n{ d5#D#T`FTJ8 O+Lgh;r{^;WG_-[iݱ𣯱pUn0}i0?/_bϨ\g˾TrEiF/|0W)Rˁ_Z%ٗ.".45{5u)^~tA/]l]eMSH%ٮvx4=hn&!/dpȚᐇNpBYSa:c swSӛ^ MxڲI|;ޢ˰e׊Mr!$uyy9z^.xΎO5L5T笆-AZS~,_[h~ZFvNOYFW)R7YlS.\rTuesSj /Ivabܤgz[aY.Z`=Fs_%njBO(. .+z~X:k=$DBX+ɱDk5,Ƹj!!ŵRV/ ;kRTaR uBz:RgD. 8CQ/gӳH͞wQODoaOB>D}  78q܈HoT4;mG* 1YL(W{4^2{aY`Md%\ZU['aܓ3ø'Caܓ3xO(0 * >T)d3pl v~ ؖ*j:h)>-hiokujGK|'y?Ɛ?WS#v;Lj?}yTk_]#2z8^=ց/ _n+× >0| GzF /y$O s !QU=v6'/5Dq~.jk?G|u>%r>Z}>JXxY']|C .>Ǽ.>Ǥ6js! ]|Dug?B.Ʌ|Hh%Kء&[-5UGzX#8/{qqq?y_׸3 > |`ˇzsJl[x7# "a=eaY/:H #Ej` br|Ia1>A]*nHe {85JfKMq2 ;H:4[R" H]Xt$pz\@e7z7PțmYɑ7CM}9\\1~xJKc[ uHwY/ @T8~QZ. fp|JT=Iv%:;~Rg=~c|#z_\A8bu/!ir{H"7/U4Vqr Z~} %3y}&+~k!ﲔ%GiG d\_ȑC eq>Nk\)P'Hq?N=J?INTjH@c5Nv)7&]mI-i%ے[`K% Ɩ4nKlI-i-iܖ↋:4nKjlIΧeI,YҸ-i%9c ͑qc?IvrT[( GiR5cYޅl\奊&rHu6Ƴxm4C%}8@|K >dP!ȔoIFT8Z:zw}]hUӤ2|+JJGRhUr/ol_amLelk\}Mol7uH>ϦNz9v1,29du?.ne`N-U _1ۑ5*վv3+u+X@ekghH#5<-K;Bէ%N˟CJ8j | 'XnTUL(EO;Ra_R!|&/|&wvi;'dɝk:FuܿLnj>[veId¨otyˬ>iSdWS8pv28RKúv8'mL*:B0##wqG;B_s?܏ݏq~~ܹ ~s?~(}R}-] 5P vQ//nw^;)(Rˁ+ |#٤I>N 9 &@lO eR˼, 7dIO_E>(םpeR BZCdW8h!5cah04a04x04xj< {< {]WrW.ɾue^ Zרyuc42n^d_yu̿(j;N񦨾 )w] wdxSLs'(7{4cՏxq?܏ݏxxr?܏ǻ> ~>WxV=\[!5|zQ 1V?ah0x0y< {< u= -&C= _p̖>)V'H+WkT(nfa6o']9vHnwSбDZX |;.MXo&5jSX9c"W4][\+-z+eRch&Dgm8xKߜu__/n[#WoKZlIN^4%`IeI+XnK>%/,I]_Ӧ@~Hm M|űU)&M5VOע\;R KJ["[ғxVŖrX xJGaUkY2=ө wn G5J7P!o! Q":F5{f|e}Y .XO~!Wsb'=o}07Ƃ8??ߺK~뚑Ί=ʻ%Q7EH߀'?3|g}_/KWcfw>~ƅwP8 F1~;R;]j@WNI9xJ~[ڳXL1%H*Lh/i{O[SgT%H+&mMq:g)F,:bAyxgx[uݖ(.O1I6g˙g8c?xlV6cy}޲-rU]צ#psMe2 .~] ȳ/=|)dO Ę 1rῖǒ*$;"Q #@[A?HGih%bCxɊs$BC{x.MKsF:\}_Bu܇zO| \0Fr.jYSw>~B?~\B?W?ЏЏk~\~\7Džq~\~\Ǎq~\fvyz?~|u[w-}:zYHց\uc̓ka'e^ < ӭ]$}e$e/t/]rХ] 5]K̺ Avԥ]r%k)6Rl݊b+VrXR, y-Vح_,k2e勼/+,_rX% y-_VX|_,_7Y%3bgx`b)g+UQNΈ Gj4&[Έq21UT4Ji Rv_ǹsbrcZmTZMu!UD}k Vuhf8:َvPɮ#JM{omYM*V%TdT%*<G*7AV8U'kZ|kmqZk&Zc= Kvym?VXȯGۏ~da1~QG9HAQO1ep=ւ'8N&ՕP/|,/8$H%B@X҅NdE*X4^2eƁcrJV Pr3zM [@bGLl›#6:~H`5-43y+ƒfsjBY lFndž1V?D<sV Oģ)ꞈ<\<+zp8cW~oW=LX)*zB>x BM#-!x5T$4BWQ^h,^amsۺH2T%~Ҏ.:R Uk?s'_w/ɵ\kjw܎iĽ1PQZ| <ʑZ<'Y̛q:c h8ůOSOIxf"eEIJqK6) 3վ7Oc~kpOy\}گ\ʵ/\rM$Pih%L&`Ik('̓BI*M$0{(WH"_1 $j%$ʘᰋ)i:e I,ƞ/5U"\o~X˵_K ~ ~_~o׏+ï_O| ]TVA0j@$>- O߽T%n4cRlUEiΊNC^hW8FIڇ]6g^o^EbG×kq]k_}/\r~}y&]0,UC _Dbryj$Н| yk!r~'Нв챈%m *X4^G_Es!cF9pyBI'tv,,^/38-瀥#- 9%vJEeKGQ(D~eST*[Ұp ?O2M+p9bsj_oh[좦w ßvYDϢt|N?[~Nc03|kC$5,bm\L*`q >k?0R\>T}۾MpK2m;Rxx<{aasXsX9~wo[#3_)C.ʯZ]tԪ Lq13o:ccbUq?&Pbb9|zL쑞 ĚAO$M= *awv?k5ZOZk|lw(U4x,HX GG2ȓ5Hƈ+|| Te|@_; D=qS}H R>[*ß5p WJ QeSGU|?`\}/\µ/끿e<+d2nd<5tOMle`G@X/|*ZT<:{R7+#?%¿/"|EWo]>_t- vZzEV[\xj'l$~=FoѨ=]xo X@~SfOYb-U ?(mr>J'O }bİaO +f>1a'}b#5E|V#:E|GnF]*jX gS\0 |EDr>t: %;)r*<+jR J!#tJ|+HUW HxGi<_35}A~,n4'JN >2݉ҁ,(C ~ k<$O\z|0Cz?q<2?q)'.HgO?>~IXq3iSy晼ggg^k}`kk^X] /7|a7/ _nB{Xg;C?MUTrEiF^iSAxٷ i?.c?ُǧ~=АYTnc>{O+}:{uDP}Ȗ{xXLu*x9Dqf>>V6od<'+ozF? KD^O49쭗&^;c%uwg_^D<Ϯr?(Qz_ҥ 2Hv^ղp]8+ŀdJKF#, >%8+0-Q)BXs fi9i)ґ?odPѬ̸Ȉ.}fC};]Ꜽ)K\+D_Ͽ>p]g>| Ͽ+RϿGR|5>a\88 ƍ040Юit:?-OETL*rY)Nvoo7n[#۟+0\ݪTP+"Vq&&Sy&SY fTo߄FGF|*4PTm>J ~?6x7G>Bٴ,[/5яs O#shF "}< .B`Lr`NnGwg.?56u|=H]YR#|3)L/5-E'O?}d?}/|OBT+u'Ϻgluw]w]quuw]w]wruǻP{Ea ~?4+ݏ iŸIX| D @ /RTDJg!J|+U4T/-/zq@ :|}| ᧳R_jJ=s4Q4{<8ȣn..5mlngζkl[6gZV3~k?[cge79Ӆu-ta=ua]]XLͤru9WV)=~AΩO( xlz,=VӪM ( )@i!s+5jcKlH/. /]wyUZXubijtvǹ@n\=/K]xF>t]y5]uuf=] OוǫЏWՏ{##xx|яuuw0#,; ;⎰a=yݷO᭵՜e2r^L0i9l'V|1"1ܠ=-$ n&&kTVF= Mթe^:+ӻzihl%ǴҺ71XGBc9?GcT4K\ToiM>߼ց޼uJϛ۲px0/|ue_k]PW^ʋrԕ{rܕu\+L]WW.pVz/PVz=sG=sG9bG+#EG؋r&}=t_둭| 4~hP'ZY Oڙa1?gz_k('mV /5*߿xogy-7&]_! ~2.רxpE .2neoSʉ; zt+}`:-Օm<*U `yVGߗU'Ϻ\Դ)ܜG@4ލ=#Hqj5A0j|5_/#a}j-~PՇT>,&ԖL"9#|3?&0 dNyLP_K/!ىo'zxK$=%kC,i%D4eI#%@jVȒj"KeI[0&ak1 3c1i$FǤ˜|1aL1&jzIY5Uzqp$3{(ʋY\v7\S/`rd+tivWotn1#5._Guk|WAUj_[f_k~ ]uRx+sݱOrLR\T0ҕ۴|kK4L:2z%.5k4_m{}y}$>h`nFNw/~2Xz8}>}n&JݕnY٬fb6+ҬrlVج$JmVҬrlV3Yt\iV9}6+IlVfR١5ZlҥS<yt!yVdT%JoMYhV``]mrr詸ϖjhD\M\oJJqz9R'BGWx%qY$:żRblaP7䢕`5@GEr?٨˴t7f@()e5sNKӇRˁlGܤKy5J "Q(=F)QʫQ 7J(nF)QR_ԟ(R"H^Q_*vR֠^)UL0IS5v;zhRBq.Mpnۣ7+aQ5Hu49Œ}aJ:)A XiA*՜RBL~=G)(c &=4&r7pTns7@^zIq%~|hQ 2 eRqTRnd.kh6 5|zn1^SK5V 4͂ȑ 3 1 3 2_ ~ak#aOyَv-4D25-ŲRx>7leUr>N9s6_lW|&}ɯ^ I ̵92uO Ocr]liRtPdm)y7.M|l]nvT༛Ea+Tќwr¿)q^5 J2TFeb'#~X |[R5zPA}xzjb}Sm2*ojFQwyK7!=y>kRp.))*M( H+-y~ڏ|?VuR P 4۵#d{6Nu (n5*^Ktx5K#٬˳ASt1XkT3C_h%\j*`R$C!>!* Cp3:됕u :d$Z|C4.!-::˷G~~0נBN!];?4C~nዕM)Hu5C0CK=C 74C ]i>sJfh ]5JJ[J50JJ5JJ rR C|1== Oύgg7F垞3kzn<= Oxn,?&E=k=ר!L<Ǿ|/!k55jpר5pא/v봓خț1@jpK˓SmzތeRvDތ\V 4țAX#!:wBCt;pw!:wef4QՇD#@oƫ&QΥ1P3)wQ ⡶#u׏ljo2Sj`y<8 w>ٓWnRpJ kW?5[T>1쵌J-,vߜ޵t{P~&?-.I%B|?4T% LV 4X#J  8L ar>$:JR}R"c|:IR8IjX Fh>[~ԯqEv{ @frOSBjqOy|as>?n?n7?n?nψ5'm1殩x{[Q+ӗ f O_U5hn2po ZL_g֠P\1NzX&8j1*d+u NA -7Z d,?z:/g`?X#}w'-TC[!N[x{F]@|#].t=%MdAb A@ p嚫 FsP-Q7´~HPg&;"MviE7AqMݥ*oo1?=恚y <=UO=oG`D!{C18Br Wy24\9MHϜ;F}[5QO|T9wOwiEߣD>cRW}S6UV(cswg6:OK <$?:=c:aϣX|~h7m}+_˙+(_ tjݑZ=1h#k40 D~ Uk1T@XZ?y8jYt^wH_z~xKM'j'M.Ӑ|=ZA3,KEm.NrB/Adp4dӏQ;b&@sa?Z8<+cK/+4a2QOvoAZ<+Xkl뭯^n(~֫KNgc5OԨFF%5cfڂC` ^Z&kμ| V 4 #3v 33v{f ꚱ[%5c0cހեtt?ѥ]KA]zХˏE%z>wV8/m*b 1Nť*AhA#?ɭ?N۵1i=UD:)WOUp +!ʖ_sU\g-PlIV^NSǷrfŵ_|Q5@W vʫXQ:DJvC29v_F)AhRDaSlӅ4駼Z`1=(ÜHvsy{PI6r={qϞwܳ'y=sϞw^ܳ'zOĥ )ف=\PN\qa(ʫ&H8H.X a%+i;~)x赜xL*}&̝`T%>JQm '_ ß 3_ }I#K]XQ: |rWKsWV(Vj 66 ^fbh3Qa3O?X6Ī6ĺs@;\Vs)!(vNO -,=%w9ͪV xiƑJV(ZJhjm+Pʗcw0jS^-ԪZ՝y ~d+嚈. I'MI&_l]rHz榲4/tJ+2*JxOo 7-4Jop_}Mәp֪:J5*e>F_e8^{Щ.Z neQa "2XT.yP% ʍbRI9I.f4:k|5']sP@+ U|%RA8f@#o2T )µ8@. ~Һ+rT<GRpJ&8R sy NUQ8*QQYv>ʲw;*Ŏʆ1V(rK#GҍF65m9A'Y;cӬn2H% /IJc>7J7@L |Y7*51|3ny8c׳H9I{͑|fLT8BG+urr&0_]X) IGnߋƋ΋~/://뼸T#:=|&vH/Fs TKԵXHvkkzv09H6܎KCZOFMP^Z]DqVlzVI!k9o<'m`_O~C=4J(gd̓kӥ* ,Bp>z7Ȃ{mh`(nD oƑJIk'yXKƕ >-Ƀ>'yXJ[q:}rInbCqQnd VZ"@4vWL&_|w>_$mN_p4E0qdҽ=.~PlogǶl>kF#FO3^jmMmR#|\j7ݜA?j_TM^TeUձAuO^ܪmZkkk5xZaZ,&>h7~4//q~fbl?-gDSe?%Lnd?3}3r`XȤG?tR!=0b,IeK>RjfA+W_'3bҫndleJW{`] uzrx]*xyv3I6aH5ղl61%H+0G/jNG^D)yyOȅnsgWW8zQe(o ޓspS؋bvU<wԥ __;5|cF __!^a8cCpZTqw1|St> M1~4)/6EGϿ釡fYTd&au?W>bِOH~0oj)ЈȊ ӛ` fzhUnGj |ڕt>ᯏo_#(:SCz񞦗WS^cTɥ*asRClz'Tx"9h=*S^Ty'RLJ"ˁ 7wQ\9MR2'?5I~Q8CWioڲU@)uZG*ipM _I!Wz''yR/>)l^0)ʓ<)~skXT_n>F((Z5Jhj5OZ(_FFY OQ>GٜhFZQesQk͕FUh]5ʮV亴F@cU TVpb@lT/w ~ڗ ׾p]µ_Ƶ/\vo 3vï 1vo 2v 1~G=R k}@a? :~#ARrj^pJc#=6 ݱ3*qFau5I'w8"Epy$EYOg4WR씻.ιY{;Ͽ(:we4UP́j,CYùT%\e@-6:RCSLHӄ "*{S$j JMfaUvS,6OS|&]>HZF둆^|lp=VdnR]]AHo|5{^#^^1_b^1C^1CW̻WW+B.p_,tYF.V^-v]4*7.˨Kr]o}n]mvY]֫]ևvY?ie}.t?e̟CG./2*^&`" #*g}Xl.1 MAw]INFAzX\h'\ o_H'Z~SKF,:R DIPJ㩛pyy>ɎӒ=.U _h{Bp+ +$߽brz^1W+qh ~TѼ[zU?BSzv:Vq)R]B|ZKU5V x>8|~_~ mI%XK*%\R!YRyYRaK/K`I%XRҒ]=WT+z4TvsE Ṣ\QsE}5E'MQCSWSMQ54E)pUmup}<*ŢH_ YS ƇF-4'OXoE.aSRB\G39,·NM:"V/R=!,-%(,@7KwT>wWwYc?-c\aƊ\"t[*cK؉S"Vo~Xkݵ߾~{׾>EMsm+x] ơi+O~ V3DYr&etJJH.in iPs`4A[L`],`4 #>?< P͵![ި7//0Ֆ~,ce_g/V x,?6@Nҹ7@K-] 7P_JnB 5@Np3 7m{8]4Lip2Scp3 9;}\@kR}ɏʺ?XjEZjL^G)1jTNᜲåΰJO?/߄?—__o[# ~ ~_~}o7;o7o7+o7o_hPfv5*w]hͥ]@ ȍvvDksO~~\ε߸]kswkyg֦kb5sM#oyǻ|Ƿ?>wok|?޵~g5N[,Vd@(fR@&T% d+aj7Sjw.Lܮ·Gڳ^2_|_|$J" Wd.fPy<;VdD讅J%%&|7ߜ>r%J +WG@`WG^AL#LAxW%SG(fXvkWa;| ҃m-*6ZeX >Ng-QIGQQw/wFQ^Z]7nRv߭g=R {݊X)T{}]?~+~^{&~~Mxoe8Dmz'$ 4}8Op w>DjGj=նk�Yhڧ@^] Jɇ7=4 ^[)0JTn;@ w;@Trw@Ȼlo?q+ׄ-]oKQ6wrg}/)U|]UShۣ}H _Ԅݧv-"y=]](R G.$t,% v[%5v[RcKv[`KjlImI~[b0:r'8B`8c500XXXﱨXx,X4y,<X4nOtAq0a|a+Hb.`%@w>4vUJ Fv ,8c%O'<htx:tx:x*KU7+nq=R 2@Cvݖ`bkPOiJha []+:t+a^Hu]]ܓ]ݸttM' ^).F0QKoKCpUR.]|Q>pX{b|;w7ε\kߵ?;~^[sW Զ4h|p>! ]#?>Vc5h[a}-E[ChX{):x):RcޖcﻲXr$RKp-Q0楨 \k> c&w(qf] O+KT;K|IpϤ@#|c|&s<S7x9 :V$B䶭R>þ{Lhc ;NIRj//R~Y],"xM)cklϗ* by[T1G˫`N⼰ySJajT-UPcФJH:ai3rZR6 ;-xij:Eנ+6d.8WO +:oaz+ȄCBg Ő,DRi6$\oM>TIXr_L+^LpV+HҦTߐ@|k.19IN]:_xFbe˲Y:߬"yJ5MeR0SKfmw?>{|,>|Ƈuܝ9'>{gçӒPaђVƵI:+,i@%Mdd|!-_uctx0~~p A"N*:RsLMԥ2y1'ԟEXyU:l˪Kj]u/j̠PCHZ Q5׏ЃTVU*OIKz~9bB"8–tKI_J6oI%ݼ%RR-䗒[ޒJ= {ԭ$L_FCUUoZ&n|ϻ痵??ڟw/k~ɵ?ߵ>cC+R~= 6#_eф. _Ji"R > 6t%9+HE*_6t%6n-eCץ2CSQqeb ~m| *Ea|4RߔRLKeq螅sНA( "O0}.?vvvU!k] `2~U×*4xnb+i{ܤ\= x]]O2LJ%6=_%Mk5T0/@ 5OhF-5KA5FPc_1>1XM/P*fRP$Lq=ްz>1'/&7D҃| Sa:6Ix{ۼ9cMaKʑB·tSbZiCjڍHM|X[.ZvPY T ?a|5*_K Y#S1b#L4,|] ~1?8H@9u9iZֲäb.z? X]*9 zM" T^te}|YF6B(Fc<|'+ R>qb8y|,˒WSi䇳8($~6(onyWGQh)qlH-W\eK\JXZXʽĕWx% %%%`PyY,kYEUBz/ E,t^*/ ,WS=4E}5E MQCSWS%4E}5EMQCS4EsSLn~7EnMѸ)sSwS ~K 62vrQ!-aJ5*k~/@dq5ڇϗYOΦ>O4H+oo6٤ų3c mvB"Zz2LP*=cK Ln quPȒS`MR9ӥ|IJ5{tkDy<ݫ-䃥{xT!9LOJX}BտO2 7MR"tSӅU4S .t r2y3|im)@PRΗWLIXj66/@j|_)2"`Pat0gCRːWxOe Ehހ;xEUHh?&1! w5-D*)Dʷ B5!Ie6X u;iM_6:=L稪.CBLTk<N?TwD௥4x&Zำ yYuP4V0^Pd$Zݺ`o޺dt~X p%Y$OY_שY]# Tá|Mo}UĢ_0mS2>?ې'Zr=J%;=! hڏ 0(a0adaaPxd= --hWuס!htؐL|TV9F)o[$߱~l,WRҦN;w؏L"KmaW-"V_Q\yw5cilDFqq qwŕGq}oaj4cguigԳOF,+K%Txk^X 954%om:n:@f +*#ʷ͔:R6#T/=*ɥ?4&^Y[&R+йL0Ke| 8$@Ufsқ>2%Cd(ƛm)\q H#.Y.'r f#E]~Ct}(t.߱P%@DO򶉈;G!w ʡKS;bY"ڴTnR.(:n}KF[ucV}(źECxA"&xpO9 nmyneJ < 蠗ThmxA0꧄[mOB8z Iwrī,opK)ex!V^P_fwىB&Krހ;"V9'i1!H-mpɈoZENU iRIꞻ\*ÏuCCCֽYY>d>d>d!rkVIx6Kj듾2G/Ec $>iǹܤ˾{Ҧ3}=isOwOܓ}$yH՞'wOxj 1uS8_Cz_ށ? ;U#V/O'wpE7#8"JI >!oD*GSfR`mN=i#N(Sa{Ai*?"VHy(SX*jtIR9Ii1'Js(לIМT5'=lNɥ9)Wv9iלu\ ğ*DMYSH+oL|S6Qa u`>L:LqKg5)Ga += O,5".5*q1VԹ AA{PԹUAA{P=HBĢ@xZo Yi'DJ, /{()j%i~@) c%ɵ]krϻ'~ڟw/ɵ?ߵ/;=_\s[H+ob}ަ;rXG(,N?dgޝ/7b|lM>$vgybg;~{ *}oocO}n IH?4σv}WjJ'=D@(.ۥcrYHE8&04^P9ʉ>'myne_C~lX-obo^P4K'Fɦ4vހ;Ow`]+ؠUyAM2 e܋lBtp]\Y?EjZ az,+=0VTR 6OmT!LL—q|ɺp;9elzKv j2Zė"L(W\oͺ`2Ր2}BԍxA5>_=Ymvvy:ɠƥ$.Ըiא.DZ3R ߆ȠYO5}9*QxT{T/GE8*Qs ?5ء}Qr&V+UPSxGXr0\jmfU+?"Vɮ1FպhEhVz쫔O4CUOPV@#|5#igX@ V.6b *㐼o#Y|R+d.S|?N SRKrF8fIv eKx5Ńz܃<=΃z܃z<{PNUҜEr6cyoM)͡Th )./ܤ˼Gy{GG>x{oG|WW7h)0RO^ĉi*6k٠&- sO.U5)^Cly* Vzҿ(_%]9^1T! ~R>JwJdW%eVa𫕞FkS}|D7B|볼duUdT RϵYi;R.R/ 2jvܛe ;yY `Mt]&-Ν]qtUH-W\ELMoaAr8㨻ӣ[iوƏ^jyN.W]Z 4U ٥28a@<=aa@<{ &-3}_ 3} 1}h$ 3/U5ixd.Bd^kHDI#i&5]5_~ڗj\j$}7NwKz~ -ϭY˲0r{h.5aYrYj8@CU?va&+ao8!,)!K;p5ˣoh|YEN9|s9d!| if Quf-q!3D9c%7E>Ӹ <<;OӸT<<;Oޝl^*?{-Qi`| 6Zf\qMvŷEkkYcw~~\OpbpZ4S!)|g.iJLtVe|ITHKa1_>⣈b4J5pCQvPUd0|'ROel?GZ ~2T7U*~y2l9l-lK5f41L=ï &v9E(6- ۤ]Bܽ_Ը13}c`<}q1y w'ԉ];Ѿ;NmD;Ѿ:8j'܉tվ\k_k&ڟǵ_گjWl?A]З(Sa{yxx͟&8ly%Ξ 5Umuހ㋦8;c+nM1X-qS/BJhqo^> %% ߂Oqzѧ+> % hLj|H^.-g BdgC|Bttu$Ô[uNZ 4HIX0`2s2*0[H+M69g}2BR  uvr O~*S![iC@DxNj1>2_*oZ 4XxR+]t*gJRfRW).K?\FW)UJl^ *@z-o']Š 9ƥŠbPy_|h=7:N;y0J2OR 8+0SK@p_ѹQX_RB&۴Am~^N;òrŕ%H6r5XnM1)sS)7?j?oK# ~ ~?;}}tR#|' ~| XXc߫}w)qzpu0Hא]J0:O]Dpj|s PA3/ t>!svPccY_v,<<γ>vŝg;ϹyDW;;)C3@p癶a6>WC;f..JÀwT_5w?Wۥf71Jx}n5>?ڟXS;/kJ\1vTb*kD [Ui(Z;!v_u _d2M3{4qL)u4qJ~8)g4q8[_~ /7B{lW_~k\K gsg+=OD>Ty"N+"0ߔR\*|dڇАjZZ*5>ƹ,j.CfGf|su&X tHjN4sa[rkk;nVk#u%cB0 k4c ~~/wߣ"$ܕ"!_(|e & 4nE&3&ӌ= 0nK# | |?!Dj3QKlg `Z7dT/B-\A<|ۨ5cU9o?,nbz44r[ -Z_JFk=$sB2IR ̣YꀻT*ïYʺK-Yl?fیγ~`~M<>|<)|i~T!>J >|_Ke{ >0]@bOi7rϮA6q#Kl&T0B2g! >CCou"EѯLnZ ZA&&MwjdW)phw18M 2H^^,{p*`ɞj'dej`0w I Ka)KA LmqR>!/[,˺H`Z fПR]*72%?R3\_$ yV L˛xA,`)I'Aʮ=KSߞ)}HYRAM*;/Y=|`;HvbY\qe9um[4 f .f 'Ia) T`;_C,^ f9 <:LARI̠T Vp9o2c6ujj8fUyLfGӷܳiJjIC+†O wcQ.F=C,˥&?Ho^UkR R.~էM*Tha76MM^ٴRӹhȗᱩWݕi;xn:j3i/䴥t^{t*U)Ӥ[BHMQӉ\g TF \R\\e̥f~4xX!=HxvL-PKh[ª}zܤ}T7j-p >5e)JL,6fQKïN%Nw\exn^wۯ:/SD0_?ėk?9ÿ0!_pC U,@K*c>%'Y57n|5c`10^c1010x 410~0~XƵ. ^ ^: ׅq ׅ¸ׅuaׅsyZы L>`lk%OiA$W1R3)2>ߝh~D'hN4_h~ىN4tKoQ/\OҝTʴ^nqEU4+1xNLR`z9]/7IS?o)o5Boakܰ%7!")K)Sbzy;)Znl*,sX4BUƸpIsY-ѫ*z%1~-=I~\]#Xv*Gc -wt-rl_Cinn[n˾nߴ[閻-w?Fb#$9J˥η^XnLF/\!L4j'canv,aqڴiv3٤Źpl[}< IGq\ծH"6&=e7hz8'vMrm < cQ6A%i0d5-Uqw5 lV`6; Nj*xu@^o4 v/Ib[ejjlE71&EbWwj5+A\+oWo_1%ѐd'vDFG'pހt]ba〖v?|BP3_Y(G\a|8B,@ $ Z@l||X[cJ&dRic{׻T<;O;OSԻT<;O;OSw9BHrڂܟj?T8*V^"%/)6T! ~R>៰a0qYn3T5kcvMG 7X#eӲaYYYR?)DjoIYNqR.5~-ߛ ?s'ĻQOtG`_Zj'z mO+{ ~?/+T n,TJ CT/q*ä aԗRoA ~-cQu#R~s$on`+kLj%Ǭ [>F0b)Z޸18TǬ@S.q&~,:tĥT&~\ ]j%dM u0>? ;!#nA>0|*bE2NKǚT!wR?jY缞6^Jqo6z1NR~~0>JI@Η.;tPClsm3E(/WyRdoV;#;s6lp]p4$0S)DRe֯x}e||LJhLRMs9[8ɠ;hMR*8y}ܹ]N&x}R`\(. 9S&)Q1.(Zd[4EZ[U xj4N`aOM4;qr}'7'''u܉} ??x1!l,f2cC ԪI_ZR)VOMc1GB*>C*OW*OeSST }OIb#΅& fNgg;[)EOS|ȚUhKHa7-YK%fO)x H/JX|B ?q_nZA@ԵjT/a?1z<(i=`Zzn)_G^'|k%בG 4>>nE%WfG9rmY=54؝4*ӥ _01+J59j5T L&ݨ l-^`ӥ8q*1/ӛ`SMyA5— m࿰&7+d.whɡ9`YvV&7ɡ9K% @ & $Y!(.z9)@ww@\}I]@5.tS#M 9 ~ ZOIʲ֍T*~N$IL 5>r喐ϣ;*)Q"| _]pAŽX BCwqǻ{.!70ܼ0BeȦ1VZ+z,V/IZu}1<ʿ|hju*FեV߬j"8븛3|"wWbࣴ#F6]D*L<ǺAp5X# s-HC RXm CnkD6hr珵ϿQ0[2IדRrd~!F$sl7_dqCr:IGI'(R7QYf Fvk@ud̃?i=&UR>JMm F}zu{6/E #O!dj7t)K{ Z5/0|H$պbcO@}\JMԈz:>J~QT?ϣ!wjM(`cpzm~`(M!Rd(bvJD>kRh&W58/'u+DQ h킏2>JOSNh}}|9NytN/f| Ayc %:^uo+_GZgxQrD(LU?'[ts~n-3q+,J5s_G@@#|K GHw_VᾧU ݆&9k)8|Ά 9n85p'DbzޔRe! FAQ*hX d-γ=Sz>חU;$!#/_$JQM2&T0/@;HF@ lBBxA%ވKy5&5$okRc~PcDԘ/5j̏jLVcPٺKpKsA*h LzK]U*_Sbo͘ ?Jom_?|w_ay^-o϶9]ay;0ty;O7uys. 3*./5(ǃYU>JrD,C=ak Vޏ):M 06M>R+d.WS/blM_6b)"~tc,P!#"%ko;bkau q,zr:B©LV ~FG +",i9`_wBMZaba0n[pKA%>/:t8'/A Il& S͚ ڬ#VK-lm&-|5 oSm9uT e՜O"k5jM5lv~SK#?:QN_hNC'ʯNmDD;QNЉ2epP.4g2 喯2MCy{(+MX#bi)^0O]L.@9~u!ebd0n@-TJR>sYn$f$$'5&&[| W+M0CPR ~yFq ܣ0K5 x{WŅGq(.0(< *r :0BoE5 *àk~'?N, ~Ջ| ]>/X_P(9ak?C~-TSjCT4.T\|;Oyv<_~g_~e_~a~eG9_rp[# oڜOqUŁkzQ,N53|-Mɥ2mQU=ŅtE(H]iͤ RpDK.෻/;Oywvwei;Oޝ|8Ea:-4Zj`T*_j`e|< +xK&?>~گkNp;8AK%C)SyNg&۴U@;7e8 d]%×"Wvh2x2&E6Bb[?yh2SOÓok9.uO$tAvcvm&k9b]keE4LDo=8FM</8gU>"B"YT|Iw"Ob-rb'\p% H6<~b y@3M+x,uKs8Ia7e68? w3XU#UWR*QoV?w@0,$ j,ݤfcA'/Df-#T+ʜZ8m+U}W?irnI+4#J5%> }q\"'@ &+=ARO!(%HW5_nQT V6> Duk(!wufבCbIz,KMni%􄙝*SqP06mt@1|-MF7V45q$3E Փ"(V$;{YvO;6E{/,*$@6IVCSX*EE=QK-qO~|5Ÿzj4`< #.0j',ғ֤4Lcړw>٥P%8_cx ;!AH-OG[212KeفdSEbE\*/`/jeH!LE5-TC#1deܿ1Owwn=?w?v{iAi/EJPEK)HH /HL#/ ZRHr6H3C5:e5xK)-F5J%>O_2la(1 Qz bz Iki\k1վDjc"vSèbjc">R)&&JMӈ٥2f\_l66Q\膴eߝORF~@f|E$CӶRASR Y5ZYu]^*c-]J Vޏ~/]}όf-H+.2neFEB(- [;l9o9hȠ"2 {KGbxTWlؠF!Y;r.JjS{+kP/ E.'YlqY)a{6Pn|a4syFZY)SxyR5 ,$t>A[` J^ WB}Z~#qY jynῚlvH+ /Es7[$;{/Wd]JOY.u~db l5"d*Ԝ/&]'۳d;@J;<uUWm LiI5 )OҎg"'}e#{;,ᕥ5lJ!7TM=bʵ^1$zkhã^1ik(@-F5M+#õ <_Ҕ%w.TBVw蟴 \ ,ȠI\W\\s]ssݸuuu>5>>וqÓxb/.qbaFVz*5LG _h0#\c?Ծ XLkV6{|B4QKl^#k|5ψgSy#_]~hrTN=T*Ç^D]j9#D{ szA3A5@'Q a bdФFpoaHm< "nudV纱`\> (\W Ǻ" hAևJernR+dC7rfJϑ2s(]s1{޳ }S|ᎩIoH$;o^\E !.gzٯ˙.gF˙.g_rL 3epHXQ T55aǮEY!a zTz\KĪ5]m1Fu :h/hD홮L^pvvϴѮ656b)@@X*#ZD.1&{#eNj4 MYiB hXK%Ei؛qI[LZ{ʃIvB"˓>#)_%٦ H|=Vמ/'=}9rr/''_N{rd ~C#Ov''G"ȩR#5H s(U~W ^\kk4Bj:dd,ڤ ATG+w_vL<<3?vɝg;, pYDM6M/'*|ܤ~_T9\/F})7E3lvצhM Ͱ))hhMs;5>v{ 9֫?T#|{Sבm T!&Puo$z{.H{#x#1x#_oH|dH;6 =B~hyH3_//'Dw_!|E =R;o4l툕.j ) eX3\e a} /pV{#v)RP"9٬JJ"+E6)ӭH!EZbEZ/EEOAR$HH*P]Yg[Lϯ Y -=/w S0As $MݜkM 5vx5˵fVwךV~H H})"5(R_ԠHfE?TdKSjnʼn?FҎuHT*iӖUM(7($耭Us>?h﵃dgFI? ~ %_+WH^f䕄n^7W;_voc;{#Qkt$~豟3m5m[ծ#jt$D]G1HZ{~'Pva^; F. a/;Vd_'wQKݲ##T$'ww1zs>3?JR;TG|CEׯd{3La]}s>[!JgɳRgƳRY߳RYYiyVY?^DbIeY4JM mfo;f*AyÐ~P*GIL~ܯMCDфxA%N ε2ō]MJ&cȤ59_1=Wc*25KpE;%-4>BD$r;ǥt/EZFuɞeJ_2 .(R2nEͳ#b6\J.˻}]&tymM13S{lLKywjevYv]VhjevYv١]Vhvy]^* O#; d&;4pru}(u"^MAgsFZS R^q: H-ǟohZӥRM SƇ " ٚK%VdVա[ڊ̰!ޮټVDjN""$VՐ8Qב~N=(hWR@ b8R>{%z..5ELw#+ ï +/ ;ï f 8_e>S;$S&Cwꊷ[ce >Z;+bUu5$t!9匄wbK~TwmMwRv!wN 9vd,C5=a]l;_%㲎8T1%Z"Yk`ܝWlN;#b'V b+].T'Vݢ'1ȋV$R#[Bgg5& FF}(=e'#fdFK j4K3e1<"@975&8yJibVKIv_.I1ք =TF&R@ˇݻ cu#_,3 H@Yd)u5L69e!V&ٙ' N;"qIu.uQV-;c;{Yxiێ@pStvt#14ĒTVWBi X#,P5) ~XJ~Mk3[HNvM-$Of +# I XR @0k[hD`m7oȝ*R-JVjʌ\EEќ,"J5+jQg*D}?ve;γγD<|Y""1FYtRu^akG*j4x&Uԉf8a8Me '׹t !5tWmZ;lR0J/ v_Xkkޗz 5Ӟ A@375~ydG~|}:.?y [lEjTO#5tC]CWzCC]nxwy&w~wƝswyw~wɝs3n/?n?nw?n?~4 4,4kӰ:ooƽiiX7 4,4 4pa8n~5@&nOwL>|Y S SײRAc&KekVek5ekyxl8'O'yO''gss9q*ovgdQIv(ax9pe6I钯iHcڅ!IЦi(grOCiMfih4$y#] 9O9]NVz*߀+-7\) Z _r $e5vk rD."AD;VĮvv?KEJk0JuB|I=o 7+MaRr}|37}n|n|nsЭt=t+ ]"5CЭo\kݵ_~kqWvo\]Qy !`(3~hs]T>!)C`TrakR_v$v5I_v$v5[ĵ߿;~kYcwf#|'^i7+SA*Y%~k<1d8:OwCKR]%< 7DjEVm|_¿oM"|5I_¿oM"|5[~R] ] MY] J🠚o;F%G/i:zmɃ^y\G<ҧŗ>skkޝgryywɝgޝgryy6wɝg;ϙ(fJ&Ath>dDj5"0"pѽ4 ֈ;N|g;wV}gjU6YM;+p!y&rSլW_K|BP᱁6kKT̑?e߿ c_ח}6+} z.•<f]m Af "žY.#~}$lS]ºbT>!Ac -Z}߬:-#f{1C k֝2PvK0ՏZ݆I_GX#}XnR`@ Moۇv2嶓)naqM*omɬ>;Ō"-<ny0OE3wJq&lCcq&K%Tx }r_밆?A|]p }n|VƧ7>1|omo|g<:EDv]Mҵ`Po E[ Ij}F+4]-jc\|e]|eRXcc\|e]|eظ% -O(pZX"?uX갶FNC~A9ص@ U 1<*|'\js󕂧b܎/#xTԶh Z-juvo$z-r>kaXC=RbE*÷_QGjqr͢<+I{aaRy".nYV5G> 2S2<kְ瞂W?T–3Qq,~=D}geh~<6>6.>6pl) >}lv1]j<6.>6>6qy?y?x?x<{_<{ޟ'X/[&#w`DyAMsmƛ\WWZ\eAx{ꄟ۫o:,:ܷWonzߴ۫ŷW}{=6 nca@<=6v92恰`jo$I-0[HT>A{202Blϒ.#](S}|imfV|۫u;Fju͏664R yDZELM `rלּBl⌾nO"--)b@j4dǦj!wYrjEѶRm o']62]Nx.EsŢn`E<[N *y,Gl} [(E2:HPy51!<ۚT>!TRbu .lrW!gS34]l|{L)Pj&9/Z ;Ri.ۙcTI)aˣK*yiڍ0+nޓTCwDQT D AjxBM kh/<_3 I9Er^. ja{EM;ⷫZ72K=f ^r{1h^UMvebYdFQ*byd62e%VUFΉSs[b%v8`OZ})04}.ǃXht:Xv[AW<6F-ֹz;azR ;fU*j 8Ja`˖a| R B 4 h@dM{dgOFUo[n$dlPApZ4[OOU^}}~Joֈ5&|r;_$7nRWSlm_CStݚqxwIڃ.YR<[^(TgTvdhn1\Y./H(x.q0Dz"5DJ"5 "5 H} H Cp^Ѣ.S1bxPע.M0t=mM)(^Dž;T^@:/ ^@ / z/  H H[wCej@Z:IBJ5%L'Ibv>_=}ٓǞԸ''/{RؓI+ϗf}2Eє➤rB%w=f=i0&^iY=}W⳷oi'oMܝϲ\j a N iGX%50ܒB܍7+Rq·( ]jЈo>~,O&z5>"\ T 'y%M3BӮǝ!ѕ@߹$%6 0t\U~XT! Ҥ6#b%÷,Ȓpn$ϒ% _C``ci.gr TCvb=EzQ9zAiS>!j=|_JZ/a*| eX>n9IIBgmA[_Rߺ@bYxKJeC@0efKqƓ^4j2bD?MZ5Tt3T+r,IR]˩@8vzmpʸVߊS_pBL` y+PhHo3AIZYjpFWe}SQO7|~ ?g7|~ ?g_Ÿh:YCy<5'eL@C-Y6I:z_#!Z\Q{K +lߢWO)E-Xɵa꾠Wᯏ7Ꮟ׿/W 9;GjjfT'II$Wk}_$4T ?J~D[GO|#.erQ 6K􎝋nz\N~CAY.ѫh{vɬ\e,^Ot&]ArQl×5~^EaMγΣγn;D;Oҹγ3γ.;W,$S~֑өu[D_[J?u-٠u,ZWI{ALZGi2B~JO3j/@IXWל}? HK*OO+R<ʳ>*+*T1ALժwLՂQ!J?dLՂ*Ho#$TT]R.<SAy[y*OE婯C% .]S N]©K%\p=uN]©KS3|~~D#!Q$%tCݓNG `&'FB:&Br)vXvY9o5k_I7,OM#IT;m:[RrEL?g,[y,pq5kcqH#-~w8Wm |U4=Oi<C< PyQy*O{ NqA;<1W̸ZQOڀ@l&M@l-zBGib &"zWm|^Ect?w2"> X-|:{t\^I3Z 'p6b ' gc^xM tp5p6ua~b=c y-_Wpa|Dc֊K5Yɉ eSt|?/z[YU/&5v3jCƛn+;1H{}(ir!59FX{x>XN F؆n %@tf8i 'k(}rH:EfC*} 8ﻴk IDz~[$/;rv:mp|5Ӄ' Yi&yߪ#vï!vo"vg~~$.gX(GSKpcqĹESZMsjOsӒ|.8uzҧ.{2Lp=uN]Ʃ˯S[_|ٛ2{PF;|+] _WpO~G Jg~G[(~K_P߿cϝo5po*"†s|oŹ"fv 0lܒ|M .yf̞sӖ-Bkq<#Nl#.μ 4 dk5h45h4q 4q { ZM\;r ŒsPKrtVp9FiߧDr _EN.wr9M9[,Y\+馦P[͍9։kCۊJp^V籱K 5/5rY@CK:y{MA=ݠ5~-3zwȇiZtC^N5zMNxvdulpvPFl֫y_xvP\qe`G `9|MÜʣGY6d5=F]U^~t'j#h(>YcDf K} ^EcŤ\| ^Ect%|4w #[s ja j+拙~3pDM]Cf7}I:m,k=Gઍ? u_Pܺ?Pu_n//}AݗW8RXGVKUwD*-ʶ'66׀3X1(WjLT tj _]3tfXpL:Ӄ1i[&gH^o\B'g]72l9mĂӹljJpFѫhb?nB~j#34 |mL:mTRѩsWm t5w JSy)m,̳Xw?)VO2i[0) @3ٳނ0܂薍AȀZXI7~0TZXjAgr% 5zVOW֙ /c@ƘtAK1GZ<2hvgӓ1s|R:laSWRVv]^HÈ+Ri9|6 jMl@|mԄiŰiX|mȌŦ46 ae#M#'| +[{FKLCuGrGr L5]yiK.<<=p󾛋t9׀tG=qbid;X-c$=zVd?۠🭗 El?wta~OH-gj7%WƜ]*ГkcŅsBoVٖi >k˺+jJX8W*""keosqis%ݰ"Csk 4M=|]-(o]Kd~Akr||?{ ,ѻ19B>Gx5w$2}O&68S +3{Xϴ^Ect5544KTX{SzPȑw7LݓNpGWg>Qr-y NDh"g$>WK *@s.{NU{Y,hr$W}&|V?4ďG`^5G`G`~t:Wσv8oU5zqAWm |-#+W._߄>§?(U]yG~*O-<\S *ۥ|#OPH_ک3NDJͅS Z\P՜&櫖 2AOwt:mH~a&ku92SZ^jzf[t__~/jUkUjI: 𷦁Yt6g4AUtbjZn,A|+d ,IX|t.4aakǡ[V+btb-,+4akFN-3zmS:Oi}c59ӆHgѝ @AI:z_7|F@ ~ֹߧu4JӺӺxYń(| >7KU=kY8|T-Ȑ ]-J@6o/`bU`j U ] ^gU4q;Y _ |\ \-RNr,Mvo%0F"# 5 cjwNC*%ҟw" DoK=/WF^FFη|\F.umMp6]mmܻ6]۸wmkSVfTu\Y9d3C 3 ?̜\].1Qkz]2m+gn!W#j[j+݁݉qw;ww}xxqwqwqww垺Swԕ{vSW+8u;N]ĩ+8uuj$HQ@1dsx7ʠV-%tX3(Y0%1GĦP]u jC!? ݒX` hV.OͧܛρOͧܛOͧܛυOͧn>!"xt\xth&ϣGG}?ĒTߞ.9<] ?k ޞ5Z @Oz3|o—5km8xIK+_=Wr::H4Tҷt.}P GK4$~EJnJ钾?[l ~ED |Xb|vO/{|]uEX2t3sEuS66>E o1cMTWv6r_7$|{ZʜIXO9+. g¹`19¹`^8 Yae k[[ļx}g3lDז(^7eܲ5زM-ۤ-A߆ls,DOA$M&FI)ۿWmvL(}A[(~Ko J^YU+^#6BIٲ3j{of55*'MAԇ5>>!n@Bp&m!)_bO:z'<,NM/a{}رb=zŒ= aQ#}XpF-&׀/)pN\8^8;. q{᜸p .p~>߄?>_H7|ճ)+ m|NMz!uր?ԯX,L3 g$| k BI'{u/b /IX_?.yY sH},Yb(qK ՈMfZc܇ZJ*2.#zeߘ5P,Cs ?)=(;¯zw=ƩIɹ"UkpƩ!~&`=5ٜ,xԕUF7}QJGеLϤ7y(sHڧ5zEa~+(+}"-xа!R$ê-C0~V+!᷺~ZiiwItVUZ$BU)N%bjUy,%\[cjW_8eZg}}>!ڂ!DFւ(bU%j_L"Vl%BaЭDV*JDo>*ѫmLAW(*ATvL-!AdzRس9 :)o%CP"zQz(JD/JDDn%bT"B%hmp} Vny55#N-Xjs[QuO"x D{-p;ς#kDr(CܜkKNWףsϴޚ'Qzj|Ea ?<ʿ%(' QZi~ٛt-R ^H1` \Hǽ\H1`o{!ŀ5p! 9:怼́q9怼90p=9 _́3' \QRUAbx`:W;o7$ݓ+e f|a}ūgDǨY3WW,Q]Zn5Ui#+׆x0ot+D7J4%/J4*Dh~D C? 4 *X5ӗ  riNjeYtSj(Wև~[Xo[w0݂Uܭs7ssݺ>w]䟻2Տ+4?LoLz~I%DR^hqA%r+T J$Voa-NmV n$WB[*%Y,%s^ax 9_a|Fo[x1ZY`\=j M ie #O2m Z`KSRSwI5Jsqa\WюWq3ݯsUWU3ݯU4|Wy7à>7c_5ƉYDa+>-5bbb;cr*]9ѭ%zby|0?؝#V {><ڂDa ˜Yfڀ1xb4: cЛQ09%N.^2I'v˖ZViGJYYiHz—u>\Ԑ@ur҉q_|ԭT?{%fk'Vfh˙=*S !5iůϐ*}z|'*fC0 K-fg*H7~o{kH_HC~++tt ƫ%CQ;Jꗉ-%Cӿ[5<*PfmQ~O/F'^z%D+fߣ,)dA%?1 m|Uwg|odկk֣,' VxrU/IczﺯQ:VU^.tb|<+OǕpa\y^yW•ø<+OǕpa\y^yW•øʣ GHjnF7E&2{iCnv[zGL%W''V?n-@???U[a3'6u)"}+eXJ fi%yi%3ωJ84s}mBg}mBhBg}mB84S{-}~+}(}F-}~+}(}F)o`xD @o` ̑7' odٻ{G?~F XYw}`b9+W~JZD·^Eӽ\%Wuq*O_fD&0#3ˌheSyŒ2#r3"1_̈өs?ץsωBnϷ3~w?JoᏏ7᷏|0k~ }89>n T~Y7#zokz7U4+o v{uk wGVDߍa<4 t*OwixXN4v4ޥhҝG/w_F@ݿݿuݿ_ԸkY5kstǮyfLZ욇5~]M\rE|Kߪ5 LO9ߣ7%}.7]rC3z֟_Xs+eO PZ- R/y 8gy-IbL~ŋxfjJzˑt1=oWyqQJ: 5.]cݢX{t 5bg+ޫh/呷#GPyVy qie[v63Lqϴ^eXs_\-ìi뒾IjtJz*\O<̏3Qy<̏3QyWl/i/I\> >WzIү(oJ-}F7~P|bOoY/ڐuc\-әz=C6z^/+ԕש+n Sy=u0uUVk_k[*EnsE] ;\2:Bi.2O{?qDϗͿyl96gݫUT5WuUtݫUTp]*Wхz]E/ ~}UuV3ܾ7n _woM^z b `,_tpu|/ ..:N7VӋ~tByt~"nrX5~^l'ք4vseVf}޽3- )k;Zkm> $mQwYLL4q O~ض xX4OX mtbϫފH$٢Lf ޴Y?Xk#FBKR"0Yq0NNTY8N#Vv`$ז{A}]z?Vi~{Z[\VV8*q?V\Uժt.tϙ÷@N=ax˗S{f!洮ה\Gϔ\Q Uil>0H/ѫtĹ-IJ=Y"z3ZRFX>Lb:&q;&1ݓc1eN^p=Nb:&1}15.p[aXUvVŵP,IP0)6P6`ǁt={{1UeqY{Y.t/jeeqY%\VuY?%T ~CP rj%\):Lu%W΢v}VF_4Q5~3FN="U:܅CN:gU0 zUWފP,N WslWužlA^E# ԟ3n?g3P:ϸg ԟ?MH( }Y[=dʧW*L:m^z`Uo^ŵj r{#ޝk3-{9%蚆)׆p_"f RyHoݴ.aOOL|4Fn+j,M |=VrmhU4[7N_m[fiJōt9MW3չɕr32]ϵsڹp9p휸v{휸v\;v.\;'u3a呂+ϼWg3g#k呂+ĕg*B婨ܶL>L,bHŰ+g7wUkCIX~ZƌO2kc:.̞P,k_4ъG$-e[4s0@!A>{A= [ux >_ZwZ zZ zz^赆OTdCuGuҟ߿)QO/7|y _>/7|y _>/_gL_[#ח3./jm(YJ?=J:GߎêJYZI%/<'׿)Qҟ_XR.Vvs9[K"s=OtMu]z]&W8h5𒷶` ѯqX]E?tO\6]GǍ;+xN ?'.+~~4x3rgxGI??᯷G z }>a`~֨94TDeR:2L%w~G/#|O/_noK~G?<^x?UM ]C(w Xml8gLL*g\}r~}ݾ1\/zw0icf0)0)WimQrk6 N8=ʣ3NOKoԟ>O2ɹ=Z㔾kivqTkz劉ŞQ^+?KW~Tkqӹwt:m7?T{S+9u+N]©[嗢pV©[K8u+N:u'g7|/>#|3'~o򔔾yvv)v)OAO?SM\O_rhsiE #P; Fb>lHac?Mo(vK nw~C[ O*&偼Eْhmul ֵtM>[~Ete3Tf3Wf3gl櫀ͼ&ݴKH`36frz̅f.Smf.j%D^5zrk:s2j#s3O$׀n-~Co7^o7nv$Yye[] ز,z; [3zңp?|Z&,G~7Ii&(϶O5aઍS#IXz4ǹ 8mht.iK#fQⴕt0eK=fSbF]_[4,TWm.L%׀/aWx|0]~i*L@aa~\ $ W}P~IF {Q0?Ꮔ߽($׿ ~? ~_ʠJV5:|;7|?Ue KS{$}* }*~/? H[X=[!oh5dI4TWm |%@ >} }OٟZxxn| }!S~ ~ao9efrh %cKlzJz7@H[~+jm_^K-wRLU4췢fr Ԉ"!ԌڹVtڀN=Zکɪ#-avΤ'!|(sn mj#t횣tH 9}f&knP̀5ON7{. K+ @ kgVׯa3>KN5mIO9׀ׇ=6^'aJ=6pZq߶Iyp:W(NͪBi U4 grm/ٿ,uuZWᾉռ_-nNkq1g =2fgql7\ËzMs^?To^ٗ5wtڨf=x?n_K'ܟq? D V=@13RXLAKp#v26ĝgJK܊%q/v=7\g ;ǢIPhf]M=bhRK&l&5ФEI^4im- ׬}3$H/oS%6o]z̊ƫJy3\I~3|%`~E ~C~MQ~ZqQ/: ݊k^1h+@ٯ9V[;FE?q᭭H~C*;7\[+?̷k뷱 ҽܖC$4r&Hiqcy,ˣ-i ipbٴom- vƢ w vh{^Ve tlm;Ƣ)e9Z!nɈ^U@vjCwdLݖcm :Z[iM_Y!p&ג_Etk)'KH&J( !2T 1 -#e>{` ouJ: %?h:$$UflI&ɶ]spuO:ztYLt*Oq&wӆ[Mé<;@Kѩ{Z ,+OVrUs:n/|.;9k3Gisoo>Woع"|MÄ\ӖEׅzo , PokJ%}K IT |I3HrsG3"kHEjN0TÀEr/2;W^䪎JH-;~Ikw _uͭTo_3Q8n)þ1SہX0UF1\+h + ** ~ Pq4TpT& '@ P_'.zjRXΑ5PqǖnZޖ'-Zʃ-rgշ9%1qCN/rfGEEނ!D;jf/˶Jb Lj)IahAjj}nj*Cvzw ^ES=[ID##MI VqQR#^K2RNzrmɮ=?#aIkyHs<~B BK<-n7Xjd\NXjjn=)?ZT 4k ʓt>T}r*4k | I:zK_OjKV<ʃB4p9Z饇q^ f/nҕ_fI'Õ$|>lV.:m#|&| |[>#|[>#|Q}Bg}uQ uoϯwGu}@5nIhqƑ@"epuK:ä/~u[5'>֭EKrs=OjNZβmDKk9~|@ͯpX DŸ~N%?Kf*sX#nMjZz0 ᱂6f▝$Wg27>܌ ܌&\~$vW*cu72,b =KIWm |mvjȉ< WW+## \y^y<+LV:|7$Wy&yZ=ϼ<{{yy&y<{{Q}Q<.xTO:mGGuQ}Q}է}m~Sn9DoLN5uGL-}J\s+pX>W+I篂ϩʼ+ZPrqeW֭<ʳPy֭<ʳPy֫დW'oC'N^B'/o'/+W`ү?)QfW-g\lփ,;-s]wMkHR3rfe|XO_ A'-'|KZ/vw%5 XaiZF}-'ݴ|[+e:-}&&`wo_+¯7[;g]-dgFF_ii7kE𬫃Wmʳigݚ\O[-/<~M~ZbauW:(̅}-J_%}KOГȅ t%W\V&`=q-+k,qjYqu[V\eW3zdem/}XTXǧ?1BWkº=#uQ3a[o1N':dk;[Վtv"gf$Tm^mXooV֢VÇ\D/2Ç\-S:N|-4g\9[{4{9g5ϰyW8[a}v0qzĞtRJ~iU}ii?{9|wm;|?5>~&`d~~ͣᛦPI@gI𖔳[S 5O)0*SQyn!TC0*WOӞ"MW\IZ|pih{ o.L4$W)}u1S6L1oSvL0SL{mÞGs(π_rwgEtig;y-|>-|> wv#-;hAt;kW;.LW+?Tff*T*eE3JzW˼{ cޓ{l2N ftO n(u-}R ,JT âzҹ!J5c'@wIXw!A:-[{;6:{9IvO%<ڈ^Ekrmo"Lb4oi?LthCEqf?ݴtQyè<Qy#<KA5jФ`ނ!DF֪x |mnn | ӯa֤C03kfԿ`[0F|ÀZ=Lyw9>dSa,ׄo'8!NqOvBbB1o #䅬{*@ s ыj#mg+[ҟ(}Qҗ[(}?QҗW 3if"lɚb?WFq\ tsz:)=8'}>=QJz]vA;S܂hK{Kۉk)^lZJ=ۋfT}U#Ri 642O'S'Bݟ?oݟu޺P'|y|Oy|O<Ov#5޹M5k<8z=+:V3YmMr%,o(WoG`$6 j?vP>l4m}>f*bpžm_aצmFIXOq"U=ӯ]b oxxpR*56XOkLw.pG(y煻=gx{{Л`Y쇹#q80Ff z:0*8080UVQn.VQMc򐃮Ut\`]tz5VQ"XE^V7׏?%lX=}$Pb$6:f8?심3QPVU@aj!oՎG.} Iacn,LX݂6N[0%`=^J3LgY Z%i23B,]2,]< ->r-CGeۏGGuяn?*ЏJuRU'h~Uj5oZk.5vNob_Z0 UZ݇y #'Z_,ЀbXŰҁKl$n#6yǚr"#<Ɨ4E25x\"c6T+zo#EGbrOh)RI=#E/Sbrk|U}T4q//\|yڧSkX ~x6eb+0|дy_ibJ.#Z=5~.Ij{LHBGBWA= RHTv傕`= #f^IJ8~l%$s2r(|I`{ MXH6eǷQ^-=c=ȿG eE@V=0 3ɵEDw >M0$.GXȍ%/Y1h|y \4ԑ^dE6/R@ad;e%^}"',ڪ{Y҅uRijΗuKC^h-5:˕\/~4]ݱ]/2vuu['lEwNl޵/kuγIj[k9hLOQ:1C[xJ63nrLPK+1AՐ)ꇦhz4E}5EMQ_4Esxs҇'zB^uɤK4tQsᔐңu}_2]Nrصo].hjR6ú}Rv ܑ,ei<d3uQJƫv]b]񬐭2Z\܍U}"l]fb]Bwܓx\ ]?`ǭ0JtQ{ T^”4RK)xAp/ropqO N/>tVΫս_{w^wZ{ս߫ս߫c*_2ShqܓhUUd2Cu.Ëmi+~M؂|J k ~Z!\Ч*XC?IcOjؓǞ4s k70+HyE9dDLUfxj^א5A\/Cs{R/s?+\o+YpQ!c >%?rEBo^v ^V8m ~ϛ~DWiR veQtb%㺄UV}&u 'S⸄;n4{Z5_B-@{)qOƁ:~;@N=Jy'@a=׫iY<{< y= y:|Ťe!~sTOa4x*ޣD}S1u8A|n-7}Q;0~c鄟̺SW_o5'l!o ʈQU{GȰ:q V "FΗRWȰziE&K-%dH5%9ɻFR_,y2 _,yP7'KXtRb'h>X@8 \|Tq!шH{i`zhċ7!BK\Jl]fUMK.iͤ^&| V6cL'fXH-+턏RE-F ~7?D{1W)A{u=؞7Wx~~~C,9eų ]r_CR9`tsGXOfCwR A >JEjNȍkQ N3,OgVj^?1gl6LcsgaRTm  kb2t\*o Ne+Ex9p $tH9K6X-Eæh^r%N*x*]rB|81T/4jTܓPgeR YʕRb=[V7_} *q_(v!ZԈA!6YjRp Z"dTN#TivhRSf'ghQTivf_ڢ&9R6)[R=jAݸ$߭rG ~>-\sEED˴b 3L\fid\ٛܝ|ySo;Oy w<~X G@ԝtG"RON5y8y#7|ʿ5v#(`FSTӚϖZNO4;%o#ޝriyy2wʝޝryywʝ;F=KH\?[^jW  [2|w!wRx!_MBD8AgCnZ##:ò7jdS\+/ݬ/HM+U4B݌-9u $ON++@.i=LAGȩcMrGXi1y0ģSy͂>h~@#?8,KâX*/KG5>%ZUou'ZvPYAfa% ?iM@dgXhs)AWCRR~5EulϐJwpw^=w'>2KrMh(=~)$y#'˸]DqUe fb x7I:B7 sfQ'UBGZx!#úuXr^:Cun0Xu b:Q:uOu[B9t[V:_XQ:T6aYv+`}F6 %3ao'M#nmP5e i PYQ6{ti#[ݫV˵2A"$AJ@y㞮,TMTӠ$b td1xⰂAKG+,<9z6( UH0_7\AR4̗cT`RȦUv=/\PUȋo(T)թ?`%Xa7+_5;}K$FtV՘^]I5 =cw57[|j %Tqg'Rw=oN.U RJ+X Dz`wh6OQ X**V5xku0!BCӨ QuӇ0uyAcL}[gZo:.ǰTxaq.&3?ѽ*;Ӵj2]R7gTL}qzt?^I』R̀TIEwX TzHlף'{ Z!Gyu:W1c^:x^<{^]<W{^wLn&w nM0&`M `@uF̈́=G(RER=MZ<n^`(R˫ţC"ٮ~]ԝ4{jY5)Pc- jy)$R(k ۠aޱ>}}k*kIeWf<ʜV<;R&֦w.8Ig +.F^.َ&uҴ+:x|l&r7&n@ 7M @^M z7b9ۿ ݛ{DTU( EzKyRˑrEJW^B{"r@ؐ' '<(VfRN]J-w F9pq++:FzJnxbt,mR sMeܤ˾Y#7`M,70=rRA^fTJ0YWD;f'?߬f|"GXOI oq1ʽ}F%^|lTCl2nhi>eݐB')ШhШ54*|^C~^Cv^Cr^CvҾ?NU^#B\\~햼hD9va V԰ҊVȔ#!u8"򋆁_.#kY *j.mդ2/"khښ~D#iFOt4 )A;_oIc4 ۠a=ky 0ir^;|0\VHav!GX 2߿ ݳh4ͤ~ΝkCrM.cbIɬ}lKO7r)$'rr%w%rF[$(Vfyx6#$a)]}/~“l?&yL>$K OdiA.'yL˸I}F/_:J1:4IUU^1ICP)a]%!4X/c5K/&jMUUE\SeV]j]K+ !T}^ @ = xAKT J"+2nis;J4r]FG_AKz?yK,{(Eb#٬KٹYtغU{x\%/]*_d˦vaMtQ0L׻:NzXll&դJ?vJVa=gpi^,50{vz 6L*S[˧ _]BW+ ||ѐ @QD|6C] - $gSl'OmOhW.//8O}Ts7]?{>!!UmBi f/3}L}Z|Jij:OO+qhE.KOkf% cb=3sv|G/^Mu`] J"^q< jӡK:5쓤6:D9`L I+ui*2[u`PR8|֛Inܤ|L H+N҉qT 8*h**YF@0dG|JPna^Ea7Tр|-_-f_if g|J8 Mw |5Y7QhGXOUuCEh&'gZ~X3f&zŸ~19c[} )PR+F1fY -K[Ի|fJq!fXjrkŧ Kn6*§ŧ K#YW)C 0\m/WpiF_;GpM#)5X&M%eV%EY'}в~XN|>=i~I5^OEqM{=/^׽/^'Zkxz}c ׾ܵ/־|}ڗW|ϙ _~ ~ _7Bs&9 _x 7X.J7M*ßZ\6C*?w9z_/ -=Bc3 r~ }Œ˺X*_tbK+W,b|Œ%K8ԯס·~;+}||Ca{ /4(A5(jP>jPXO rh4X? B"ۄJ%O|f|OzR7-h7qs:z~71<ɛ( *76јXչd%\+`JI,¸|ʵ T]WrVʷ+ܫ߮«@yA0: a~g&WzQEhiz xjzjzM\Vxɕjr}BN/^8 p0_,pJ0GXOXvx[v9[*_T6_L*ϾWjS^Ǻ6XK:R:~nFU\T5SQ8~>JR8XKf5a=_'"ɧO|X+O>}"b }  ~o;ok/jVubqߟ10\vw5bX3jy2i)ʁ ;t/F;ECB<~BIg%\] ʛ=#;Sǝ.$uɻ&k_O=Пrx? ^Pŝ^蒍r]Jx] ۼ)$eb7ב^odwf-vo~/&] &[}Oɤ= dJe zL$UK $i`|orvrQQQQ^h5*1*1*j|)tIf^0:tIv;d 0 yRBR.ad.j9u#(ץD&02^P5K6;͛[QKrlE}a45RuQ.<%pٮ>0}J.#ʁtI!ٮ~G}hG:06QKr 1^P]2Y|$*$uIJ/hmSJp g֢Xݣul%uYv-qKth+Ve"lrvu˲ {!^ML͍'y{d(#[]o\r]V+.eܤ_8获v٪q,\b、=lvޟ㡆l\r>zH6DNt?(jS^aKWV/kƷ=Za䥊f~8^MKy~y,MK:y,^{:zeܤt/tCy"t_"..k%UFnE)\a IJ, j`" [U{(GXOy q?c4S-/590$@YZboTTw~M&޲wڒ}8싷xA[-->읶[JI)Ycb&jP7EM5MS穋>t)Hk-e͢ެ(rv\!x˱ԡ]l{+˹VxAKŖ:v˸]4C<&Ysg2z[ŌwS^@pʅ<+AjXiuU'`a?X5 tQjB+`q 5빭+Vqv&#Y#jcZzco#4v]K<TSWުGȮ߮v4˸O] e`/~= %aS<ųMua:"!wO]P\eܤ~ʹzgّLښz7wzRnSs8 |פ4RE>z߆֓K|6+)ZNu[N}seOEp+WbdЗ"9td!R1Q숦&Ed!ZtѼtc2>Lj}_q:jQk}?a岯T Su_S$;),.C%^}i_^Wa)1jدa|Oi` y2TnTaR!WJ,d~6^P-($1]FfMI$Cۡ|l;)u a].aVv9ɛ+5Uj_SO{bjԏ&rLL혘kbj<1=1uOL틉IC/l/@`;V}vBm2ob6Zz¹ΑE:@:^JJ\;ֹ\׹12Nݩyw;ݩaw|g!P7;ky5#QߧM)\DYk@b@c@׀q@tչGMQQ{TչG5QQ{T=j{Q.h=jE*xqCحd=JAsr6&]ֈPòH}_[  |5EtTRbu";RGK͵ub=S;dk.!t3Q3LЧ 1\:"奆5=i=͖*P{O{3})ѓ慛tٯvY/Wo Y̔3H?<7Ldzv4Ŵ|5 > 3v3[Gu߽ރOqwB*&Zm_TQ}8GEIQ!sI8GBwJsj9 MOC:OCyOCмih풘z;0)j~gR4]e6A5XoV >zd\,u,U[H/(TaK6O"ى6Weܤ˺EH< {< -= -&OC뚆Fih4Ӑvx;d?>xAG53:}>>mѧXnsR^)WyW+żW bJ1+r1iF4 +))Ŋר*U /բa= sVkrGa7( W!oѬôc_ɎP=txTaA;FBʹ  T 숲 A*Ǿ! akLDbHސE] VcrIT%-T_߃u@ń]o"\,I/&-dcR%+AZXve r+4vtMG[đnm x[>|x`RGzԂ^p׻b-5Qﱿv٤i<-F;﯉qw)4^f{.5zgR+H~!WP ߥ&R-k ??}Vsz禈%?x)Hez4{; tPdRkSO~o%64THh;{H%ۤXpjRDhl3q٤cc3+#d+劔(W\˸qSM!)o6yO7LuFqħMIf:DNbV-9 eJ5T؝!4bxlעW,DD-Ge'ro[9p%HSM2vzKҌrMj NM1>!]R4솻T`nu!-o^*HlY-5dW zNC^27S3陼L{أ}ɺG粪ɚAbm-u+~hڻ%u#'c LaU5_AS hm |4F~ elAܷ,}ӛ?I-(.pq|[ϼ-7ݷ#'Ɇ.@ ; QCV.j.e3M [VREͺe>= }]7xMm3 svftx\ӫī>z#ؾܳb#ϲ>?T ٳLUG6TB|b%̗ǎ 9u߮bdSړM ͗WRES|yT.wTZ{SK_%dlJDOZ/@8VG%Nzpn/1@SB:]Ȟ4KU/Ux#'Mx.J졩v| o6oթQBj処5TxR ,`W3>nм\QQWKP KCd'B:˸Iqa@@h<q@@<{.\`uò/r+F>n6.W `y:BRhD=J 0*G7@+RhyŌ@FVOPv>86c7֣,/U4OHettt;;;y@'@;@](Fd4ӾU^(רWYyu\xd| X0HH!FI a)ʛgӖ-ÛtTv ߶rpl8K.?+vv;:2zLEڞd%I#ǐ/5$2 j_je1܀+Qj Cadpi+GAIr${vuzAU^ް<ϮmYQ]6tE$g=Ngϳgϳuͳx]<Ϯ*Q 1*o$rqܭbܭ}s' \ȎDƉqѨKxaM5j|V_(V\6]=qkc5^K=eyO9xk<ůkvKkI34[  6 ipD{i ]xpƒ;'9݃;'B{p3=F(<:Zzёѱ!<:Zz£c&3}1:7RhjU*joVq*4QfU MToVfUMۑج?otKO?* d+m4697F|7ҙ4Ʉ#o"\QQ̠+~ RJLMh,zO[iO;ڭ7xxSKZQ"!ٙkEy]x$圥1Kc,%1K,Ui6i.Rg,U_T=f~RhpkzI};[gcTa}x5wUvH+ieMUӨ!;˱9Q\1Yle;ّCָ]MA|c?64o=#o=^D6!௽$Cd3q$:?QQpz0ݚt3A!Zʗui~v>ץpwWd@ >zv}Ýgh`SLrl#[)G,P՞PYj]d./U4gH=vcf`ճovlk#]m >?P]?i&вk a'zYc MeyqROS/vPs>_Zp >WBZxQW8 "=@D!BHqp!^V>eX3A|d'_戕v_IkEmVαϾ|Eyw0?YK_Kz>[>ḍm4t.~|h}Wu23T|5 GW$wEp*X^Z6[g)}aǝ~yӿy_u4d4T4c vi!/%6iiȼiM6~!{\u,[Nk+L1^`tV=vCg/أARWHu )Gl.*qD ?JމbÈ4"rowJ|+mM _6OmlYJQR @9+wRpK2qcB* mv53 w>a sj!5Nj~VX 6+"n[Q? W):lwUTݓ Vufֱ: myeRZ)6 &ggHMzX.ͰcT߯KvĥaǥqiX:]~]a/. 5/_KB6_K3O{氅:@|>Ėǥ;Bj,f5 ~O?~:O?qO?ϸgu ^6\Õ?-Q\¥ ^*_u05di/t9-śt22ߣ|jr:-Cj)DնH6Yk/]4YɾDͺ{H \Җ T5D!r*^H-a,6 IV/ WIŲnFټV:|I'_uOn-GXO%2^T {| a_CjqV59!!'9>¯ g3O'_3ON""MȯGS))M{WGxGx^y{WGxGx^yNRŨ~8(n +JI]Ѩ>QGSHE2ͺ#'OLO'|P:Ńr`ii w=xFQb]egw*ܭ*wzwݪpWzp[Ej[Yi3|b=Z8pcᨯ G=Z8pcᨯ G=¡(3tf)?Q.ZnXרH*ڭne8trG\Bvi/]]/ti.KK.Х}^ܑ*Ol a4? | ߚQڭ8jf|8*چc-r4xyyGkw-È+aϲ>uhWo23q} F02ͽ/S/b3qf>f^fb+ &@tE4E b ^@NI*T3U&BMG_ < 8p_] _iގ x{-X۱/pöAvQsAT k<Kp*ƮM \eܗ. %soq@\z_{&vcѼ~=m5\JdnR7_,a%YDGP;OO+}:@^T% :;h>!mh@'EM3TD=(~&k f6zuZcc: :u@ucc/5GOs&) ۇuh-&[uV#?? kOrLVHHU X*Eh,Dck,caX K  ?E hu/29 Zb9SH_>־a/YnjLK?+nVͤ2bVRES,i '|__JA0й/cͤ2XƶD 2Vz_'V# HtH0HG8m#'8mHP* \`wTCZmP IfaKtXvI!5G.RJGX ~o׏+ï7-~e+ς Dm#sŭȬF 9YA|+h|mh59Oeߌi5jv-SD'%/>t;0RY7ɜ 7X@| TRB/+xp0  >o _oQL?4 (Ń5Q=~d$!5耑|x8n8<v8n8<8Lq|>Ld~l]IP8L©)48~]fߦ i;Z k?;4mX:߬| ZjRW{2#?!^N, E/"\1òV*AXi"eiǿ YnԡAtYA,Ng yj0i0ۥBq#FLEp#1~m$TݼZ.TBjօJr4ݒ?vxq=j#G? (9"&zR>YtSŗᣴVډ}%t>K2,,ﳄ,ԝ,*lC:4I<ŨCfQ[9.(ٵX(j|A5GgB \,V2ʕ/ ;+1DvQَU(^] %=߰޺Zj( i@1? UݛMC[iGO  m27@EVgXn<{HVwZXv8Dk8_!@^LƉ _n+?Ti0x"3kհv.U oeGX fy]f \rY-R;*qݺ²KUOGXUjZg˜&u;Q)R58Yԝ[-Ζ]9v'^}r.jVyQ[^hCk˵B-[ViQ˅\^~[LF혌=|LF'rOF&y2*dx2*<dTZџR;<]*F: :҃רAxz! OUN3-ʁ tѧB͡#1<W5Х[FUJԖ& Ri7lݿom||}o|}+77o|Rv[>V-hjAQZ.xGBV-hBoҥ=]tI/dr}PH%:rcvRTa.EiW &kнT jJ"0PgU #tqDѨ]9_*Gɨ"a=lqRE3>% 09tQ% ?$h*}9yV{3u#w₏@tZ~Ha=0Q6g%4 _D;& ?2'e?2_zy2' $7s5\xjù)i$;vw^}6ŊȻػ^ =P05ӥ*AXվ_ZdpF8|9eq. =UL JE(' oP?_h,`֠X  {^K{(wʃrry({(wʕry(Pދ(\ڗJ`h÷dRO:_1?A02GXz%Xс=+UJEz4]yu܃+#SOt\SA>Y)V3 ?}؞K]r܇M/U4B*&kyuH+&턉>.EX+&DHx~q8 q?n[#7Sව| 2W|\I~g5|r%UGXOr-H?y{ޢ|@{-B|[[ xw>zq߱}>5xQ ˇI%y6C7 " wg-.'P+DN'3N?HewwQ퀟dKQ9y'|g8@8)fK>sOt~.jN?Kws]f ~|\A׮P|R|?VH_?G|6@07͛Gto~{݉^['v./H;҉o?GᏏ- } }oᯏ__^\z^}H R>6>U[U yiv=a=ovk* 0\QQGӮ3 ^pQHKQ\e''?ISOj7{y}jCڒ%pׇ>\|}8p]ׇoGׇ}}^a%=lz[{<ax[_˻B00߶hŵ (}:w&btM|He錺*1jZb14 9OFr28U#Ճ${pɷ=H> $_h%)v\SBjEŞ<%}g7O% ~RClwC!G/ȯ>_"s*nR4$!r̖|bRa;γ>vo|_}_'#.#}_'% _4-$H+W*?f*QJS5ZC!$< 37 ~(CRCb'JHu۳"KCHXzGZ тp>Ճ`mg.U _#.KH%"fG@ AD yqHHSi𧙬# aXN.;3|y@ێN8Cj} >zŸpi:OQzi_, (\\YyR'MLWJfzx׈ xg+U1~1 [jHm_/G@ &Hk)zaR lJӥ*AT၏ gOxFRxFB^z3p>%?,{Fj ܥ*=##ǃ<ZáWƥE*X4^*{8 ڂCSB3{8UGln΁ 5s6j .JX)*{ 0=Z8pa^hؗz4ŊKN@=~"~U ^Q aGLo[9q.۸'-0t87=4Jbyx"0>Rf W|a#Chd="P_mΖ=Υ*vD₇C [ \X` lZHlTu[|UT&~5|?]x?Wa(RR٤@Ǐl?o[y`e]I;Dcg|q'|bpƱ3>8vF%zU:FujMrEiF5_ob762:q!^}R#5~z M2:t(#x9e0`nYQ. 2KsZb֊~X+\KD=Qc ^kjS[ԇ{R>5(lýuJmなT?_M1?4EṢ))懦hy4)&HI>q `\|z +USBϤٌo k ^OW!?ß̹/m p>_86cF!ϛ⥊|R x&쉸`caE*Xޗ%ٕnyXGC}A8xPev.u0<`8(Wú+ererei䊫W͑+.Me8R#W <"&mb/X-Pd.r?JHrDŽ0= L Tnך(T!TT 9p eMՕxMFqնS ïr>u *Q Q*Je0KdTk8.R{)uS)u)u:yJ]ϔO9Jm|ď0? gFgs[#?JFgX ~uH--6-ؼXB"e6.2 |8w 18%m˥Vس*|rTnH%HE*hT^P"8S75;.;Sfm-i/'$i*1teN3F{i/P¶/y|q|$9rB"ˁ+mA%٦K5W-!Te̼&taonX㲽E%٬K||l==t7w=Y9WwSnqz8]t^5 Nd.fn@$~8s83b50PfCQUN.V:wIu Mt^V 51toFėnE>R45˸Ir?  ]n3qQuAyU;YiM օ]'NW/kd.rZ* ydQΙzr`REd#eu8x7"~%zȍd*TRNU;ꗢ!S+⬴"Қ'RhEVZ?W*æĦ0cQ#UK̩b.1y N1S^1X%/v6ǘJtiw Xȇ4;{MNNUjq7uB5.]*2IWY|P5pk@$6%PRWJoR0 vF/ 4TY{[m Eh9ja-;|c0T0N1.t@<~Lo]nuvU^*Ar^\+L=--)PR%dH߶W[ Gm;2#~iT>@E>(MujST d𪴽Я;H{O-RSH} ׇ~]7)J#FԧFX 5zRvz`I-or^%/KSiHv\ q]dW-UM~cBKK&@Lve\ϭƤƮ,#[vfu ?ބ| t~60߷o}M60m@-=2 -(0 N3M \j7͢qV/I)uGq's"/Q8u :]qSK9a ௩"> ,9XyQoZ8> 4#//փqSb9 ZjL */V*UT2JC7gDCwe+?Cwe#n4t[=_s;qR7 ^F j -bR>X]{;翴;M`R჻H ~7͏9a ]+6BDCR,E/3iu+&XnaCpIqxexc(!)JWAjjT$qo=4eܤT8RM^jz$=y|4#Cy4RJE`SDtH^# )Q`laTiT|K;of͑y6J🥭6xik&[ޥ6*/m]/mݠsYR"SNR KC#2>S p)))V?\k߹xkpw\ l|㛍 AQ!fR!\u8\!\`s>??Yڟ\ڟڟ?~.M=yXLh)ܓJ7q/jK-n,Y|9a%{,j˂+h!QO.ge| hC'b᫒K@VO?!RA>O~jVf)xRn5gYVC|\!TT }j.4og?o?wv{@>$  rTCTDb +DMl0 ^\ͥ2rmZfk+kʵߕkʵx53\WrIrVU_GwwvBݿg=t>lbi]z,RfyrM4Hż)`Rd'e7׏BOFʎ3k`^ &USYiG&Vw7h܋ʺ{͐y,l^Ͱ*t8q>t4tҎ쟽G}j3]ї.qf+W%>mR'5*vDVY)@e}O$ԷocZnX@b Om| &{rl7P /5GX u6E Dr} W4| G+{0]jhE[iG3D+.ZjsTn{}*o{{Wʊv#9kO<O~-Oa`X~Ftu+T.-,#,cAaAhaAh B B dAtێ?dmDPY`4>o%nۥK-|.|56_X9٨e*4+ʫT7vU!<~qE'^M I!JW2W3ī6>lz5sj6'Afݥ8vc\z㾣 w-9M9nKv*_V9kJ.&{zǼG"<|2=|̮o1p\ޡѝ_ 3 1_ 0 1S!.ǻ͔P~(CK >mJn3o'X.5J~Z+O^lڗ<]6?4>-f]8m˶m %+4UK%tt%[ΫTܒ%%ϖt%ޒ#vEKi m.Sc#)^] *gHfkQ\Uϟd.JCbs)<$aH Znw>$C!q7K-<$VRAtH j 2e_~}W2ï/+ï?&?1^]nxV+/| ?ɇfM_K;³lT;Ǟcg~b92˶48,{ݣevͲF2 MWR xWPhPD}14~k(e*4+?(WB%<O8F(2!H ^|*O F~/լ\ RS/CnO^5,]#n1sIK(q}ę.+Bv@\v+nM/77H"֓tpTX$>֓t!ΫT;|Iz)2B&J* =gTIP(ҭC/"R@ԚQ,8xa,dUwERegk:VDŽ0= L AS>,RiҎ7˴#V/ftW<*0 1unU12^ IvK㝼^t)70"d9r 72]+fc.Y:=NʷWVAUn5wLݪ[-V9QVbjQjVLԭfV3}EpB{jf{]j,pj N ΀֪]]䡿TrAi@5wkK\eo$;g+µu/~t霸e ^dn .KRy]V.Ul;Iv .^Meܤʉc/Y4ÐU,CMd.__5NPGv m-\˸.q)*%5sF坜I)V*!9tIuI%8U_f"7Nv~F9pe= N,d~Yr =7;}q^Xė'$yũ1fq/%U9ۺ]BɝX Lv M]%0gw 7\GXiqI8,=Na2ejEk.;E~[ˁt"H6r<*oWZDŽ =P*0R̛rݕO_ge -r9a%2hd@Pu~mkةo+?(WěkKu. ]`}/㎺> qզK}YЭX{!7xVM}{V*txK"!3Dr"coHa FKo/J^JV$[ xJn+_քW7M_m>.w9otUx[i+)Rh[ʳ-Emn/66w0#^z:@~;4I=4I36BZ*|dЙaݱK2RCrtjg"3M|d(TRS~;rހ%nIJؒ%)aKx|KJ-Im|lIZؒ8oM m~HiuWb]P~:RcKI.6ɦ'b, .kŒ%g az-1"kd|U .zat+4]K妨m4ȷFTrT5x*oSԬw]B"V\fsH6_r\10 źX VyeW߮s9ov+^;*׎׎kG}׎kGᵣkG絣Q?׎?)!T_ƪ4,G!eե,JyX|)f\u1 #,tAo ڄ.Hpub ]T]uiuIKХ&֥W<- .mEp~+ϣV*9WN]}3 z, .oߌoc}3o~ cdwn۷pip4ܾOsnj|=:zT66t=Z]\לףR)|8zt5]z7?k~[w#NPY!`oJ ZShN%~,6*o,x'ςZ *L*t 2#%t7sT!wdR+bM.֯u(u.CyQr.YFr]vH"JUP/"d'ORNv9otyHCCroH!?H+ dA ίR(GUW)wk/E+%lJu{7&]z bg׺xg tiV~:R3nK|IVBⷫfXpG]º9ޯƴ[ҭXԕͺ~BIjFoyneJ2LyDC?J.(oYt)4٦ f5S)Eˁf]}a]n _ L7,*-PBrAJ5s8Y;˻f"xb=iIkLӹ7Tk:7|z9}H|9}~Ӽ1YS"!USb$Q*"fd7DV3ksf^Vڑ4;R 5#Ӟv@<[Lc0CK۽XB >,dKRRAmTih4yZ44xZ< wZ< ; mOCsZ4x< w< -; -OC띆6OC9 I7|>oCK L|2Et^nw.z\]ͪ.Fkkŵy g-EWui*櫓dnN*%mV^zW7J0IG~Wf|KF.wUMj%ĽGęx)#0rγ'ř#g3Oᙧ|<] /,@|yʻZiU7^ /s -]qCW2GDZjw"-*WRH-|'!]c_м/!䚊A0EWH-o6 I7R?it+w>n`-O4;r/iVhi; YIw+2F- CGm?49̐7\Fx|M.\jq{d|5o5¯#ʺf| *| 99|H];   _+ox|:x>,9anX bdSZq\!H -@RI\Z]셯ѠZ-LFJh 0ds. ߻)G/< !| h5UVjD@].6ʽN>8ޮ"N>pg M>եVɧ&B;٥k,*NͰ&ZI)Sa[T^ [lL /Bb{%u[I)ﭏi]sk ixr\!H -^vA~Ҝy.-<1nK{g.Ms\Zh.͙Ҝ?k |X/UozB8GMV.(W)_.jh0б)|$nհeA jB7l.nW~nkl| iԫLe źh9p oMcֺ{sװ︙(Zz`+IFb4WA{$.ϋ[+ȗ(RA%&Рʛ4[RŊX9pelEWI0atӣiiڄL ]Y}Z&U`Z@bƥ43kT5z[H-ʫT č}F&YBKN$6q/l#<5b52׾*uewNoC)ʁۜKIУMXk k)jtR-Mw*iTǀh6 ZP6 *a^Fc@6 FJ[?ɵ?ڟmOY%/(?v >J @pm|T`M k]8]YMI"mg1KU>H55XGvxp~iY>2zd6>_vôKe7D!)]`Xn|^=oQ:yv:_X#\u kՆn g4Dr#r*>xӤ aje.#F?CwUl >JmJ_3tއ R+rhc߯V\sPs.WFmONVJ8pN;O='Σ "vi '9*dy 7ksR>#V/OfuRT&&٢+tmZ{Xy)bU'$Gz YWB""y]zXY~^\H͸.N 4˹4*UqT8pԭKvm|VU4ۭ'vk=v2R{5?BSTq5`)+<1wN.E7 n?3{)|bgH+n4_n Z&jk`4Gi)b>t L'|M}Zfc>]j. kt.>% >]yX%fo"-P JU)u߱fRRW)d.Fq$U$حܠd(dG +Ww >k0% cOkYurUǬ¬ì?fffΪ-YuYuΪȓA Oue$eW~NRR*Z*0bpq}J2;0 FťQɊUUÆU +6N5`*75_.|2^]-X _Yܩ,9 -? WMg?C vA:h`\j?_\*A{P~{Pe=(|\f륀A(|qx8[WZeJ:R3_%zRo[|T+1/96f (=D6#6M ~[`JHi}-h0*fZ,.MNb]\*8OW\KG\Q:*[o!0P _~T5 [qZwo55'j=׌UhT^b.5:"E|h: 6]}(8RЮ5ޣP ʛMB2LRŠA"ى̇wweu9,U[]AXs:l֭&R+GlJ>F-$& }= a= R0BN!k,3?#5kGf\0Ĵ04BGjr T ..4ß}Fv}=<7-=DX$Y/V[2EZIz]\*ßqW>,u?-v1>cQw +Uk_u oja`R~Vv#t]RptJϓfgLu@5 | ]Cljdv7Fc*X F,[w1*l| &3 ӥ"7U1?𗥎.BtQ"\P*Rm_4j=ڨ6ʁs!3)dgT$XAp4mFhf| 7jU^\"ڶUvo M`J%oAt/5G/'GTnV? e 6#Lߓx{?;;`_$* >J@^nL >k#yD6E*hT^P"/5 `XHvl %ME_LMA1Rk Q]rgj ճjS¥rS严j)nQTlH-GUgWln; yz$;-U7pǦ(ǹ)qu~Q~Ro9T*)q"乷7͢X~MoSؒb)fUS@7MQ7EMMqMƺԢvTHbP ʁJe_KjMux ƉlX-\ .g$VLGx#_:IaDiF`\xT! klM5+(|g/yGlAo)bM kyn%蒿%Ftotɿ%]/tiztTy)^ \v&;Rrߠdg~ E^V .1xc[H~,Fw3D<43Eb y{\b.پ8^{%*8LRty4:dgq;^uހ;Rb{zܑ 'r`RVךS]䲅b]\p7U]jW'L źXTeO铇bb>m940˞X!r=n=Y +/t(uQ-R5>}.!52BiqFߩ$7ʵd06Mv%K7Y0Bor ހ;r'Ve |% AzT`Dg{ ~bTZ7+4UK57i`LnS !m K6Wm! ./ҷAvHv;%~uހ;&4~iJE]2Oͺ3ͻՐ {-TVC/O4AvAbˬ.8yjPĨZ(1AߪAVN:F0= Lha%*m*Ӡ[\jV47E*~}4ZI{Rk1iI߹sd!H -*ԐCOF7"KnS@J ~8_uy$Gy .  $öBM$ΫT3'V" 7KLΖBA;kpweu4`GL7g/@paTٹr)R+JPVc4vQVY01vLj*ueR*W_&ZScX)@e UIpPj?j 8q7yvה0BJ/&Ȥ<~:&Q޿Ip0" >7J]* i4?Si4? ݩswowZܝfN'I8. ځBoJ;tz{*_ ҪX?!gs;xO|sqہ~ӦPdF_Pd|[fVa FFI46M4X }"@ ;8BTme3>mN;. `5>=oɌBeGuӧ\P*R,QD0wAZJ"V.pMAAkF[`m "2Ϛڈ h: 5Ju[R ~{Ҧ$''MI{~{4'' |I{I[-DWNVOG)n}*M'kRG |A^FyGh]Mb#cn wž|ED7Q:jFwk?UҩKjt[mr#pR4"\Γ 24Ґǂ4@ *ّ~vq¾#{9pU TI"wHb o!d/_0N>7cZ͵:85oL%uwKCB|@K9U9%G`2#sojV&쒛Ke+C& oNCfp'Ή6"]BN<ԇ]5P*hm.t8: <0 jV io v <-{XMZ@<+4MPu@eoӹbm뎤IRQZL,c &)V>m$ '(2>!b`%ڸIݤq،|;;悭TTV~P:RWi1:`Y䗵j5L<ɻͻB]]|wvc.tͻɻ ]DDD>&&&ND'z'h}ND/oM_Z/~ݗַ}i~җnFA{7)1ݍ$XAPt>0SwmrG瓟R4Կ`NzkwiCwowܝ&wt;mN;/!FuXFd2ѐy41h4􌆝x4, %!hFCOA(3Q1:ծ$k) 9=n|Y3+4ERtj;$1Ĭ:]WM ed7}O٤ a iw:'-TaHl%?Yx!ΫTbW]u<|ҋɗNbI9# opBE8GOsJpݥbn&M ǵ$uXtq4Lk/sGZ"^5b}?iS헷 > SkrϷ'ߟ,>RQfYc)}Rd)s%X,>G&ϑ?,>噂nkƝ<  .k`L5HUe0%dZ&WӠY%zT`& Ύ^f ֡BqXbr=/jO3I]iyQwT+t?rIq Ҍ,9(y"O |6[lVr6I6G 1B{=ZhGmѸ=g{WtXAC:xuCgƫb0>tLa֡63S6.̤?k vRP Hml| [|Ф AYϘ.ǵaڰymhڰymȼ6wmȼ6l^ڻ6l^& smyM^Sv=]>^SfFkJL{^S>^SfהY>^S}gNe{ <_"i֪ W(M:lLnMCM.i6ASQkm(&hmi|^& _K fcm05wȖSxLm)6^(i-L+]5tހt`<̃``<3ƃ`Y<( <at ^3 ʜCb JQbA|j=!!^\YdsSĉybTxb<1wb<1;1u*OLsb UXlNMࣴT}O{?!J²[M y4>wZp@5(|  R+G8i|{JI^Cq|; !>OC!0fg, Ĉg,Ԣg]k/ҥߞvg, WLX=X3lXY\~a`#SqY Oުz\V>>J\[c=$0hu="yR/]u hi|wX4S!>n`[fi|5?;Ji$F* ņP>=+E*hA鼠Di%VqlH+RHv%h,MhT.%]^1AyWYi, ]C{X`g}JxJVދSi$ݼ&ynERP=H8c\tzAz4>I>T>M5v@K<u?]%13Jg%kO^dϸT^P"8= ƘȻi^S=7}6E)i{Aɗx)It]J`_4>œɇqR1+Ueicc7ε/\k߸ ~{ks7ڿw3uUS;E*hT^JX;ΛlnJ"V\Vm4wǷ?_?E6K*|'A0I@.[{Z/c~ܲve oYDܲ^վ"P[Vc~<y:wvӿ<;O@pKUxmTkb'-IO<a'   ƻ較bb;;;?f?d?`dz___ /o/@sas}l?W~\+l?OM?5E%HQ@${&FOwL 2>~N?:|Z.SRaVRΫT/xsVrjҶHK.뿠./I7_.I% ;\젋_pIKLVzIJD]? FAzݨQ+ʇ$eu.u#l6>X3?z,I <$oT\ӫ:R_,m |eSBre$pG]5A`]+0y_͇Hb]PUj~hK $vӷ7钟Udg^E "#ȦUfZEj~Vyٴ"VicχvP|:ϱ$*NBrI(W> m cS B&Wɉ.dYЅ A |H'k2;Ӆ2I?I9}ۓ@| @(% 17f 0O<uYSJ8gK6gU*5<H?m~|LC= `I6t+~fUq_xV+ihhT оm@hmn C2 z\!5>VU*R[}R;RAgZW}5Yռ_3?|?ϧ+ %mޒU=f>PΫTr_Di5HI´XVz1/@j㋵XCNWZb;&R| :V$ ]!'vg%[hI(E 1qtbR`[c"mcb'IJo-/YœtLCyh) Y0la 1K5q7 (w7+fp7 z %W1n8Vp74wýpn9|@苻3//h)Din7'q-QH-?49mx F R~Ք2Z,~h*d|57?[(ivHS ׻OSn0W5L  ckA/Lo[9oy^FJ ?3$~~g_/3ϟ ~~a_~ | 0|hޒ|o|K[Ʒ/{KZt0goo~~𷧂,p>GH-Ҹ qT=h/ ]nԩe T0. \p/L75tTHVJ@=|hvZ\j|N(4.<~<~3WC.gkHKt©wD^ @(DbY4ة5!\2>< Mu"/8v)Z SJe0faje_ ߘUVc0~Wg N;?w5>uS(A6Daswh|Q؜we:x } Nn/9M9[y+ 9d7V?s{&,7EUH  A-Wom |iX~7816ᱢ &|Eo+GZ̖EZ87?_T/i-{EJdR%c>](|\|\|B)Pڦ+++2 EGd|5?|~cJ,U2 JU*SץX-)\p7H REC/qF(\gMs9ɻT&J&qy0tsZo^݃mJmLU*jkn\jx; F=BKU|+QVbo%:JVD[JT|+?o%.g_~~o~~g~~~),KTe" [KVR Y֛Zt"3R ~<dT|_Jc}K^tT|_Jc}Ky"A{Ŋ#M5ǷĻ|XXzd_ݍKl\j c1V/r}qG g-mw>J>dLR5~vk֜^GRa6%*E*hT^P"8H8w'aC*EXTQAg r+G@|>rky>H?.}E]7lv5B0|N[X/k}[g{eokqgu~X` Hv2nPI"1*bu9Np H1rހVnnU[uVVUnn5[uVgJR6U"/H&/#tg $pp҉# $S&uI/ 7{'1 $S׃ 3o{P=}ۃA?~ | 7n??]WD5+ c3qGLtU*LA6+gh3Q^Lj3'g j.tQ-PJUwH Mo H+BccQ;nԣ("zMwd|E⭊bEsecbX< ; :bb< ; b~$(%vuS B&\bn| BYO&\u[_;b%}ikdZt GokqZ߈=!MO~*MO}?O}Be~ ߞ'?fӒx6l6c6]<ijHl:ϦfSnNlZͦ%}Φz9Z좶 Lui)*끭|zla%OU|?SYfG?J[t|8Pڂp(EĮ/PʸIIӑ#Ss8vAz4>_@ÐF٤ AhT2RoiQ6NV?[r^JDvCf.A:h`:j:kL^ >0+R R-KMۺ l]oiqlv5p^is4>m§+;6[6AcY/[j)j!"8d!"v9Z'H%%B8oxHV:cF|}uz|٨ _f#Y\z=T4鰗^gœ b| 86ajI 퇄0*iI]j^|1?Bğ}srsv*@nGk&W@K'LZp7kSKD MXzp &R]"714t c 5TG:mQ4Lu18(mx.sIe,>fgásrB|%c.)|#Qtkʉ տQn&'Xᛛ b|5/b"0S!`SC%3ZrRH,c*c87-@3]p/v%_ýM+0*9b%?H_\~o| %hzޥ{ot"mk_t\n)rۮN{0]KuP ɂe=NJ'f¥a+Vn~lzͰ[r=lVn [ܟ˺և#^EQd0= L !RI%f·JT al+xX_d"k!8=0>O!Y ~nC>CʤR~\%2w=Oyq=޼c%w֩tetorg_Є`[͡n-n|jTq1SCa53Lo=fjmp^Xlm3Z#EL8ox #Mmh`i镆Dհ~/ܓ-hX ~/[6_tL9??.[flq^˖͗-/[s_ll-b!|{W9k 9Eί3T &r~5xڳ9 :ե 0yqIzPa𷕖svR R腬1?<%) Om["SVL>S6٥d۔=%WXG_p4^'!GhܓDj8JGh\Ϊ_sj0-OǠaP0Ǡ^aP0;G zA~2şc+Avy]&M&2rԥkrJNnz"aRJn:+. .V|UodwIfnneݻ@jne[?ne-o36+쎤i%`jUj:t9 WM-)劫kJ)nfn%R-H&-,Uծyadk]z n )QSŻAQo>? _O}CӁI7-<#=K]kԍNK]nR7 -uRڳԉ}7:1&5.uR-u},uZ-gϦ/U'I ,'qB5EJeΩv$=E 8U6W2Hv%X/_,*`d)ϐ}t9Xit9O#٦KLr7`k1-]%I$wOΓ ؉ԘN.״1<a%r}k+Lt{)S] ~{=-jd.[]Oub%HhFL&gK,pOLc&g L-÷3u]m|:vjnW߮.]]anW߮6]mvݛ8&)=c?=]ӿ/jm\Ɨu{?M xsrϝf*Lkco"T^BEWhevӷ%<퓺d>iJuڒ2]t&[u_lR'NOW}R'٦ܝ:u.顥w# >[5=A 4@)tutja~0Bbi>F1 a*`oY6= agrީ?R `o{s].[51ɋ=fqkRij*]*06^$)уf*0ܓ #x1 ;o]GFC@9+m]Yow[rSdwre)utWx-FE5FE-FE#FEɨ5/M]b"݃PbW¦3KVǘAPAmcyK| ҟhwz y '<FDbCDsQ@Qpaht9-|\h6 .D.yCj.4'X xjP6aW5G_lU*\W5UMUͽ7"Om'qQRKrHUǖKyL91wv ܤā"U$4UVZ0-T)!Sa0 M5.7V##ޜtۛx{?G7'~x+o:q6+Ƽ~lnynA_lc>o|eޘ1?٘X={k`U,Pu4,={` bǮ$' )jotl/n8/S O9g|hbTxn%}=Ế9Jn+u K {R^PnwX >GG* *U² Rٟ%={z-QTA cM]vhv^P0z0PvwIN9'bhlTC"d.,iмWuy)m:t$ tZ !sTALM,b"LQD D=ΫTre/5XbMn0- &Q\p4dQ)qěEvpG-ěŝ\ c2|mO-n !BtC䣿< t'htb\i??胝5i[_lAO>c +:zo{qŖfiGXCfZ"_^#۾ʭ? vG9=|k|JZu!{6j@3=n'׀&%mL٧ɞimLӧ4ܧ#-|ɧI٧iǧI٧iwid.fF-xL =iXu m :2@ >,m+bj?h;cuJ<(+hCagwJҨ p:zß?E/0Vt@FpeÔ kS`utO/MDL84BA /2|'+r. }X yWj[xbwKH!yo#뻇[%c2x4Q7[!d^ FǀIFA#Q `^ V{4HQ:rnc:|:;Η~7Z?>Vr1ƃK=CtϤTKûDo&I{/_'߬%~Y?ۣ.YP-T-x,fEBbF{:i#$v˸}^Ү~i~iWԫ_ڧ_/r6LB#!ɹօVow3X:(-Pܑ\3zrmlK^߮WW̫++~uEb^]ѯ/o-t? 7LAJڎCs !&=wLU3f pO^{QzĽ# %! ߋڇqʠ{yG&ߌ{Q2?v%B1eEl"1ZO2آ<WGĔb̠ s.x-L"5࿎@l[s7>;>; ;X,qe8X'J͍B_Q{9Wg+"钍\G&F.xc '󎇼D@ŒYY̹oU7M}L`6?LAx";' D0;Y h"w"(AMjx6K$@w,99㐀|)QHd:$ R,Ɋ[eӪ) ؕCen^gw.E7o"xޜkzU}{VmqV฽}ܶfy}>md@8鸽u>?mt9n/*7ط}<$h߮>iٷ}ے:zuѾm}ģrZǽ$<.;>&_r4 ~WTZK!z{| Z/͸/cNUsYĻŁWw/,%!˱ѭx$n}Bڎ p5~7Q $jo{,{M֚=>T>>t>>PCA}LJLJ*:{|||||XAqX%*ϠKYտ4g҆ ߨ~ߺYտUMAxSl'Bڽ)\6.)Ȼ)o l]n lUMAIx0)&y$<Lƒi`w0)&$`:D_XwW"?yAEBHWּhi(ɕ_ +H|$eiVFyQ.IYAUZ*P &Y=nE<@_U{{-3(h^nr@Vs-Rj=X]I 7r.DixSI~Żr'M,A>ţEC']꼒kOCI6ۇ076PP[l-P j[|cz w[Iu i(k .$]چCxiDt?bDUMh=Kݢ=MwOhBDwI{d$ .U{LWwx큙rӹ\Y'p Qk7C?VAr(1 pL5ߺ!Nn g\CSY&WEٺ6J!Bi$/õ y[)YCI{&Y&\ aܴE& $מCqS(Zjt[|^_hp/jt/tҰ ͤ{eP7}WC}GVT^, {?K,wˣw(knN3Bk+$uPFx&Aw/x6aɯ鎿_^ Af݁K3BQٝsS Q$W-x_×wv|suv3iTn\V APk4QTbt-Eq3cce=mv%uU&ѥQ︆Z钢oLy$8 #WG]R3wIW$tk  c_>+\+^+|VurYyZy׵gkk啿Xy a ǮV a ǮV/4W~KaSؚE"쬷73x~wy/p!{K4<.$~FQQr(F~F^#J:#J3Z5*(-QЈZQQZ5*VhDQy*~ki Q{~t(4]'eN'^ZPk7a}if?V"{< _A[? %ihx,팵(lJ,O_WzY2|%u-0o[N+9Xf37 l}ꬠCuOۂ+DX4zik0ZâL῅RгKMRT {߶ze,ܲ ˒z,-{v?6eiex62 2+ 8p,18E`cp08&s[dpncpn'6eqgk?1zpBcwVkV5+gVkVkVϬ׬X׬؟Y׬׬1+Iq0@_=q`ǁCy$ AF%$OvK#)PH:}$YZy$Y+IAX??[So~?zf{ܸ㾻b)(|3Iēqz=Hfw_:z7oo91Y!kvQLҸIrni$i+A2|G\\o%蚇D.h}\~2졗 M8U]=0hNzybluP}=:1A,O(l\tY(3jt(!60u{pB ^ 4˷\?N-~h?ABsvvY>oCc7/W7N q@7;Vr+;lK#ႅ˭8k@[\{r% [!l1 v [߸rtSXqmߴZғ+?/W`x岽tuAczgDKŨ̑sRmXvz)j;hDcըw\-Nx,٥lqp)]uGv).;PRܥԬ5Z$@-,?<SSc[cj%\Ηg')కZ~/@ʮgbvMF1%~6}b;IwQY'yׂ"ΕJ T go:JKz /lŰ!֘[vFK ϝx-߮h$ޣ4k}*4Lo4gzwޣ3qZWO( Yf$9?= #&ٻV`tcc(\0(6ڼ"Ԭ^YQV7U}=|M~5PӋ|Hs\1<˚7Q`=P75ѵ& @Gr f'iS%V͢XB݃#b"V5'Ť V)&]1NKinjbaB+m͖01Izu0;i'K!D}6/؃x,,$}^=; 3xUw[r2WKC/phX[t"_F*~;qrTC?%(+jSg:s M.AW9J(/Le(-\G7guuo63-T ⪀zĵMAmbC 9ĶCgn23b,W\V>q6phyClh6m1˷?f Qk!EmbФV-V )֤&s{&WwX?Ua:=^ !FmGrWJŞylVPkLF˶KUZgrM[E5ןN륙e?hhK!Hzen=lKADk.+ω=6%,FH.lK%fCA/za?DZҡAfâA)ohk3i!M?'EG?(-BRil&o+ 3 K($EǬrX:WB?~ ]̼^^ 4J0x",'0މ0x"t'0a~yo滿~og|ۼG'9DݵO ŽȀۜNܒ]yCӞAX G;>L?mTz~h]A Ü rj V?ʵG-4?/E ^[S׸hs7iYfTf VkqǴN!Fj?0Xh}e25P쭮]g NEI[h^{ `S!+Gհ' qV\ ~3S2'5H X2,rߪ&&Xf22 M$oI{ey})zz)zKۗ?޾u)zKswew~}~oIR+R@j/j]m)tw5swectw5J ].]MwWt(\wWzDsw%f1Vv]|..6kڅڅvYGڅvn̺ Y՜]̺%jY8afBf^3:̺ YWY/L;exA#zzk^qQjy=i7VB@\_ɕkxd,Y9ބ% ABM `2W+0|gcC?~x^F+ iÇaB͍>jfK\dۗKaG㇄m_Zᗔee9%6}Y~eQNiy6W6~S]yDae%>LYnҸB^ 4ӭ_;2K+ݝRhZI+vJV /MV;imI[jݹPWCԺgH]Ij]P봱pn'텛d9vp-,^B1v %(dw|{%ou{-T{+? ?j̎WBDaY|K-;K}O7Hw\o7Y։,Cn"n}o{Tj1 - h_O~'dsw\gEr-fU.7&./ #)P_gECrU.B[>k`W?*7fT GW&'Рgq Jc _3c/Cs ? 9fŰiIg!dݞKpMMucsR\fl.+m.ͥbnTXoE:\l.ҟ%Uz,?+FNKjϒjZ_*-"8"oƒ*T%>#oaGٯ##Nti9o B=?om_n}9;yݼwݼr<ݗS}&:iq46wK$[ DQɳGW?ύW?K1 c${)^)@vF(g #P$B9@vj!!H(9v#5bE@رQf"/]Zҕ *% HA> W?pTWbd?/۳GV7AصȔ7N@%7xok$SC`@$Uؼvb9v ] !(C`|,AX jZ USeT_TY5ݬ꣚ªj_{)GBJdB|F\oxFeg%> V^_c Dz?(q,KdĻ$+~$.p#Iߑ`5xWP"Q]1x$;Wy~3+d^W,6ߢY^~/^ź;Z+xZH| ʫ%`K^ _(x//{ h_jTj#oWSRz!G<%oG<-i(xZeH+/C!ː2+-C>ː%OeHiHG 5Z2 i}OSqT<D;Y!5Z߸|wW1Joo]ӑEk[y˭MuZKuCD#3 d wj$V^»ZE_[i1ֻuRD*;om(W5pmHkN9$Mq/:M$k(J$B%Oi(R7#IA=kJE~tW7Ȳyyf#~J,VJ%K+vvPvLvvTI{gŽ%+mž)% o[[,%%[ϖ$9;n(bV,o+OQnړ2psulTdavr-vgCct{ևSS]k}b|]/Z_kOxo}d+AXo#ߌXI!QH]:(DB* Q QڣOxgi a/>]|-> ^|/>{Ɨ܅»0v!h.|.L,x?]{T4aRKqBc#YgIJx8N;"!͇~4Qm%tǨ"$ k!g$bGh4I(F'5(~\obFahho 7l 7x7A9Ėzo 7n 3+5+5+gVkVkVϬ׬׬YY1Y1bVxYf>,@gfmH=0 # G<ُkK1Voы'4cbZ(ㄷ:׀jfrn*^ 4-tJl4 _Ľn,ՇXlÉe$}ovL5`|Vu xǸnQMn w"oHЍM7 #tӠc7AoX.$n@F9Z 2,Q`ܖc|K75AuӍï&@GM}i;W-Z 4 nS˱m"c?uѤ#R3Qݳci$ͻkMik}xPW7+ƾGDㆯcw50ܮBr/~/3.JZ˪<;Z^yLc%?bk\]TDړut/FWxlbc?ރg"k|E+Wd{E6~Ț,=Wd^j[(|n'8H Pz"eZ#ů9S_S(=]8ߐ Y! Y 5E OSQ""ŧ,EX7NR.1Em)RIJq";di)Ү)ү))5E5Eg4"\S}HHH)b DZ"G`n(5jL?t?wj`x-m?J-6 <F1U+#jYWpic6~muDhQ7NluCM !,_2Yޯ>?3]3_3fxfxfxy~3||d Ke,_2.Y_L}tto<ONӽtt<OHZb$Hb${$2a5yX-VVa5a5yXuVVa5\H1|⧙dGԎNgv8݃K\[7h^7r}Ӎ7r}ЍMn佑3?|UxɃgYYd2/ѢDn.#"vӞ38[!X^ͺĘi1iq9L˙ukZϴ״Yu~5-_L8vIccDZ8vIk>ٺ169vIm~;}utŸb]]>]WWOW+/I6.mv\"h:K]mv]Efu.j6B5qB:_dYٯYYWQA6 _#|a—/_%ӕ>ޔ84?żg%J 5ZЀ7f<*W5 sߞKp )^*&-+WVҿga[_{+ߛo}YXVֿ9+! oH;oMR #h\%{ }#.Kx8iY׍ώp9ix;¼wG@¢lܔ\..˃=NpyhxL.C/xl6/ⶲic"kЬvZ6ΗC;<=fv~{Ѭ'텛d< kJrkX]-從[r sٯau=/o.͌/ˣمriovbeND8nKz#Anvd=i/ܗ,;o#c1+mƱqNyѕl6iq-pLs!7-L{ p't00I&>?&@CK@#Lc}Cy2N=ɔc7y`=L 7$S~S~#4x6gTzXZFfP[n KE۞1<Ѐ|˷8«/V[-fըHͅ\I~jRpB^kh@X/'ǥ2r;_K$BAzE[F+~H %/VNaQ<\t4KF+,Zc/`"Ε*۱"hD^KbE|HѳP4p4P="AћAX ٱ5g3!/HKCn\~kds@#uDfC}۷9^ 4#FRreg"Z̀vXe N74[݃U3+?v)̀Naa6;N7xYaA>X7Й\[7hg5[P\=-Ӫ̀-q\^v3 ^reWpB_^ 4gr%&|&o?s x MX Mxwڄ-&m{&<'os~7&Ag>0Z0k00Z0Zaa4yw u h=J=IsTH)\R]zR]¹뭔 )sR:G)w6Ї8H6 E>8s ]CyCQ^ 4qɕ %U\ \H̢{E@VJFtH*j\[h5)ARx w ڼ)AAk5H5H Ak~ ;Ӵc ]'$˧3ɛ>)ѢT >ƜRTEGX0eXLKg p/(qD8La`nɵlPEW1V__o_~}׿_~e ==F&6ޞLJԞNgCldRh#yIl5Vldf\W8levHY1үbdz6 gi&y2i BM1քdy/tWRK:+ttM࣢M8JehWZ24 ieVZj}! aeH -C>ːvZveh2LLvcfѽԬ?Zۇ~u ]R6vr% ۂh-P-mmۂ- mdǮl/!}i0( I/v{Y&=*`󖕸kGxssA?G7 Y!{xu|"{"Ln0x"h;Ͻޠ8'E6Q*jQ;OqYA]}Xڨ焹>jfN(iE#}7gKs陹 ۂ1mI7($ [%#i VkĬH R" +BJXHQ" >D*BJ^DQ"tUҦu6=Ҧ7CJ֏6r^̅pBu>+/ײkpB^ 4ş<RYA2g 70htV >7P!Y.7BR>fĦr}ƒܬ^ 4I R+켳oGr}_+kho$WjE8J a9-J=W[|ivpĂ' 80Cݕ ]%%tVEk\kzV7`}׉=z#|sbhv t_J><&r1j~ x%3پ6262ldrmdj6262̆GFOƥlg9vz*/_'d/_@hHr׸'%c5 ޖNB1+/5eW+|}c'`XlƵv"%h Y+Ovu'ך!! :JɝYytrcSʓtAmfnjw)&%WLpVpʻ ᬿ^xzggʇ3 =ka~#0 17 , Y!רȨUrt? xm4f7~׫m 4 g@9pɬn8/}/ 4_ir m;~[mlέ߿cz:i$Ic@u\r^_/끏tW =Fku98[_y׭-jݹ|V \N7ɕg?.y((0|:bݹ2 G!mw*){Cs4aGv6ZyF|Md# ~kռ%~<;j}, ]I ;ߩ;xN󝺓;ߩyN;uQXL45do C9K~͸?.ypЉ@j[P;j1ù2^Zrxr#Ѐ|w·7ŧ6mF(|ډ{FbALP JDgr W|N3~$j>ùa5{|"$o Gixx𕔆YHiQ,+ JJC ZHi4ddR.2d3&" a ~e_>6\wls2[]1ۅC={*ɵǷf|5yH Ǭy:3 <<:wGI1y yj< uF1 7HAzyG@7J ёy:Z!-3aMP6o}˪N{& < &% ڂXou3Ag{_ kN²\Ox+<}{c4{߱?xw;ÿ5ʇ>Hh{24ɇ'mzi}YX:Nali;i$;휏vNv|= W>=Jdã|>Xi4Wi4t"U6+ U;)syffΆNy}؟mu>m{|ڪ|ڪֿDZCg]l ^Cy%ι9c0toC٩]Eκ> Yk\S'wM=z-J/_my4U^oq_'Q\%?ƫt8ui$F!$Ш54=Jfohȹ4=n"V ?k|1Ӑ\6w85+~oϭƛxsڢQvc?&M<ܜF~5_2jl挸3x+5ӓkKR]h~bDf貟E#'3\);;ZC\y|qfg!E!KN8|HrT/[p÷KQ&}ZGf"d=Z-۷RkyZ4jV):-ϰ7p ?ԇtփ.njno6ВG?xqNVj+`iDrlޚ'u54#-STZfxo:La7#.t -vVfx^Z8ߒk?`[;EN&©(|=NN7Cs2Zy4/IGX/r ΃075ޘuDDїs%xs:F_xvcMJz,ãXCl̰ /-ZN Em=cqڍ&|B#/| 0%BAkn+ï.Zrݤ"9#\s? [{Y,Ǥ(v3K;&ۜ. k;}+onɭ?o[?x[rnm-ܢc+V}luR0~zZr`K5X[!Q P- Q "zGyIyQ,/B=;\om*)o}Gy#a<F0w ō"0RFHH8%>lII:4Y}؇4玔tƕRUNXgh'_c?*F+ъ}pWJ!z'Z9^;q)?8thbj8 C5/H|ivccv2|qg ֡&_S<9ܝ&>dWj^ϐ 1BhBZjU> Y%X!N|:╲}Xhj'd!_5g]v]|~Yv]\]W:Үg]'e3U ۤ ߁8鬰.>Xހɵ]]J:J-BOgeIŮuy޽"Ԭ7SE)1JZx0798Q\e${rUa\?an!1[a!0鴇rUa/Wruw",aaDX<;OaAx",;9tBf3r><4_S{B:(}6w'1c++?Fe!lE~mV䏢/uy( R+HgQ*WK KYXzٺ@ ˑaO剂RMJ|)W))z V1jTqE]]F.*f@RQP !v7v\]{m Ww~ktQ5ZQ- [zSKσմ&B|5ZK퍣 DmAsE\ en{hsjPZc}N[/)aC51PfFqn'W^J7O=kZJx'yxO''=xL~;4*&9@ޡGbEޡ;+>lU+c>>\'u>]zVsއ>'{~aic'&;ۘ^ FARM%|3k+;j*Ls?\1=1J-㺎A",qc41:fOs!ծ}"//]ԘI"@|*v|P|>}y>Xo,}>}}`A t {nfZ.RFU;H7-b k?ڍ(ý*~p_7~u^~tߛ{(;}4-)y"xNjɾ˯l $µN!{)fyKa^p w/}^ ֌ukz6UJzUe#&E&)U^:=6A+]!70y7'54#{šFQsp{kғ+oV׌$+O*;`ֻ5W҆Z}:Q8avotR:Ujfi֭=uk!O<&WҬ7CFfmfc vk6.DMY+9I-S$S֯n}1[٧4IֻO?@X{wׁoi+ -qCT&njp& aI:J_]l4{gkvg/^vvٕˮw'qdw|q;YdmdbN9XdN&㻓7 "3Rkj(^ķjfaetRמ 7g#mcVf6o6olFPZf-B3^όtSƹߌgft3+"<;ͤakgA_Ҕl-M[E}-m+{¯|| ''|3$%:rSPP=4iԠɒڵr O4WmO/^oW?^v`bjZ%x!H*k4X8 >,cgpo%j :. z\3t@qHgtS5N\|: 7U cpڋ?d/QZ(_7y*+Qkh@GX~a0=9Fw}+f_ /HQ~w?~S,s > 3G;u(|ueG>Y9 4 Au_;pq2ڪtp}hB C%+ïO$a%?y;Gw~O?GUU""jwޅ8 # j /[ǣ~G8_?~wF?8џ<џ?џߣoi' 5&n!Ú|7m;ZO6^|Wy[ Y_ѻO4+.cWP )Pc?ęG3O33x<<\y+-݋K;e,CJb:BTx_ O `e늕R@t^7]GKU ]禫U}n[\﫺UnuUMo\ºYu_Xo;*uu?wݮtםs?w]}u-*4(t n dUa4Vn@rV&]" O3Jϴr ?rԤ# ߪЮk)԰J.ﮫB*Ϯk|Uu-Ү |Cou꾒BʣD⺯_I[!oK_g]i\y+rϒtWEn%VHka+or5-E: BG™t c~緄cѻ~x˹|'||[`5x#|Nh?46R"nϏkAiy _7WF\덕+/+Ϻ? ~w_>]#5J)J\Ҹ+h(r7oJ߫z~ꃯꋯ뽪/>޾6N;޻~ﺓﺍk/#<= ~q,W*u qt {Fy 門lx.xB;]O < J/O¡_I(Ε'pAyZ9$ʺˋ:ƳEuCTe}!} ߑBvy$ ;6ߢmGLo[ro[t>ew%R>m|m#Wu8^ĺO6αu_YHm>8Hƺrc%9[xLŭ& y_s޷^p:̀:N^y\գJ{[j{`]'3謱2߾0|⑷&ב^j4ӟ{r nko9WKdԷ]p38׀qpnυB^C:J_oT3񳺼&{S {SM%M5ӛp&{Su5W뾰W+uXzu}o7#j蟍i`4ޅxGO'YNgU Ƿ$h3ɕO&f^%w+z@[*D&(zžpIGXwcy1<fϬh0g[g3*̣h0g#K?>|=2Vx2?$&֥n^{[[jrmjPT|#ߒҶeZvd[VF#k538׀ΐ?Z#xU4:|P̩;2lj93\+,E*/~43:q"vq4NGX/ ~]!Q"%Gupb[pΤ/x -z ő\~}U}x_WVs +/}U__񴉫H!|v|;w]mm&JpWuG }汷yk{<̣9h3~mϙgy4:u%zU&1,Iӫ=gU];s tٵ#Z#譈GrOv9l5rӤ frz;>BNj: GZ:и᫽DkYp ' ָ3^ԝt`90cYЧx:15<:0[HݶƠ֚t۪mY0n[tm!ߓmkMmA1n[?߻.Żv8L9L߰33WsagFX < ؞u^澎7l| 4ueHŇCz   =4,>4 >4 |hX|hX߇*bV*`Yn~pC΂8D,xUIGX/PxcivYyv.TlJw 9ZXkEoE(!g&W8)N'M']Ĺs܅ON_G'Nit✅N|8?~3ſ4Obq*?YDuLNV lOe,Ř&ok oq,vm5{QR<Iޅ4mDp !+NY'5B!>+k 9<>uPu4~uW-j[UD)~&Wox?Y?c ޝݟ-xwڂ9~l<ڸ_<-%_IErG\}lFoVf=@2lz߬Dpg=`&׀og܂ilD܂ZXsnQs  9G=5DoųFo7 ~p?{\~yɵ'> 3{ÿ=eÇ7e<|߇ީx*ONSw]]S9~ßlʳȘZW;J?nru9-rຬ]("߸]=p6)4(no|\IGXѿNs)¹x^8]8 SxSީ+hgWyvb, SytuRVTu޷['A\ǯ!+Swʾlڧue?|]I:š1=兿W|KPw#;o7,;-> rrIgvpjj3N 窴pp3Ǹr#a޷クӽ-7UҠH+=Wຍ>ma \?>-?FQW^hľ+#Nu2+}PVh ppg88G Æ )Lyvpƭz@|̰du3ZOk?{xFrNx]X \g+)t8\ 9'%`54Ós'S7e@_v5; }|᜽k74u" QL+zN2q|;z+^En7[ygzZ52pWk0(YIGX k(Yl(مwP»]w.JP2޻.벡d}JĒ k ȷ폣5zq"kGed V1Wk]ȷ"ɕ_WutU彪+]kz-U6/B骾9ǜK[60wjq87!9al=fz8]-o地I;;a+h%7 z~eB[ɲWqmL;Gv72HV_ce3c NS ~%j#1#IGXoM5B劬Rю7g2Z2% Ee]|`Vv+EW|htP$tqF>yGޒ\m˜%F_߶,n[VM:AݶL~ ?%IGX/eYZ~(w5~~1mA3ψ 3_8k? m[x;|૧WP)G/qUuXQdIԓk{D\]+ï\%X `hp%;RA'<X2\q>*9H _L^_#"^7+8F_l1~ㆿ#XnoxO_*& g#|7n~uuyyowݟw^o3cfᡍ☓ta\) o76(2qؘ+_#{ 1~$m &zg ($Mee|?yo!d\oAܛ7JBEo/|t3=Xݿ+sN~qrY&z}qok)EGZ8gCSO|aM偏j^n ype}vc<]2{}դ:WoXuRy)ϊP}c}N2SYiŕ𫛩,Tq3UM:TmV_nh6Se^ׅoP s0Ӝpʃ^A_< c5ih< JٴtTHZĹt˓ϓ#vVR4Q,oy5~#35', N:A,ZFt:$ѰLŤ#/| 36~`72 xПؖj 9srOO_&#M?d+(A'/XUj_LϹS88׿1SS =FO,Z'e&Xf'Ey ^|sѷ'9W qҊG0g:׀oA#STvGo+&>]x+_x{ ^;; 5B‹BW=d$ſLsŵ7v ߂-J_6oF?p5;d 't<73 9I:VS@ F2Ą4i=z@Dތ\3僫5^CS|Iɕ׌f30NJI=rH%ĈfΕBɏ#EgZk?GJpWc2Ww ?WPRҕǹ|K>SxuD^1hUIGX/l\*mh JʮIقQSw8]n-Xi ຾`&>:b 1|+KQ|J~(FB1$aS󃧪쨈 BE H} -0NԂ  mcX >w6Q͹ ]&ۜkslsBw}mV+wtw6v-vb;ʡ|5prE8rY^ QΝ.As~~(c5^h0~+x ~!0oWk|mn47VosCsP!,Hqw% O%X|y-h  7h5Kwj};#0؉%5& [VyV49n 4[rׅ ڷpd.5J: 4;B Jq%a%9މϫH?!?Nj 0!~ { -AfY1{繱h~^b:W_bk>{&|K}z<uqn9\G}fV_÷7MNQg"-9ϬӐɍ[q.v_ ZygZ tZRc9%ג9F;ٌh@GX/N9JgHYc픤$Ӓ0`Ysmc5[<73筦ZPh0ĹV/Kr|#z  `5yA^ԈI:AqDz o{q* _%'a q|w0H( _ t֘A∾O&{bʳ3l g]E#K U+z vp_%z]k{6 ūڛ? >zC=x">SXq `uuz+Ͻ+/+Ϻ ~CŽJ;K^kW]yj)&y'2//ehgNo%O >z}n[m?ܶmtm[33u-ŽOJSw*M]-4udTJU, LȶZ6<ƏvcGDZ`Í?t d1P}gj }IGX ~}4V*f婬zR뼱ޣo[5tۖm˄bg] ?޶F=u'O];ߩ;xN󝺓;ߩ+Gjh7QI'>I/N}/Qm ܤ5^o˺` [?/˺e}WX֭*eDz.lY,~YkYlYײ.lYlY߯e}e]ز^˺e}e}~[XIpoo`p`nto`_8UU~V} ˕r4uxOuҰ~.oه+|Ȝl?t}x+~-5iIjRQӤjt?-7|Rῖ>[J緥tAbP0uJAb $&@ AAb;Hw J31:`9<6`#\v9| lmt+Dkh@GXooM ?5[{_~:˥ WP seݟQζUHڔ;qP7P1 B>/m z˹9-ZCU*!zZL Ͳ1,aŲxauZjb?Ųx?pq,u2_[Q?}?7uEܖ*ʶ_&2n#{`ſt;g6b:.o,/' ӢUSrRhZ'm- *!()Ku[[޺dThU_ČCeYȲ8eyBI._ē~-BV2}} m7sz{h2GBǐ_V,tJ-ǢLConms(oA ZZg<mf.3 Ajh-K;lEO-" Y,?Dr{,K,vr{&fY~",eX={bY߰:-Z-_^KlA[<6mo,\e܏,2\ұtuɲxEh|eHJ#FO:漯r^euE+yP9c-ZTL S_I,4xS=m<̗~DMk➻m{/BKV跎5m5_{Ne)L[vS$u y?xorc}}xXh-Kj<F߫q?iѢeރf?pM_ěe#r߫z3v:kVEK0_~? '珎Mh#lnp:I_L|2m Gs2Եy12[߫6UYe~hKrQAx/@,,,-|T,tbjؾrv]d oECzNoŰWo,ޯ%i"2~NΛl:ěe)ǘƲu 1YR0VEkeAX2YHkG(wk"$% Q-RO, B{E鬱%~ac\$[UIGXOq/7v>?P}/7j3~}*W>#\j~BZ"Q+T(P[\.2g_UB^_ t-Zd!/a!:a!:/ a!ZD˸oYl/eYć;zVEvn=ᡍd0zұxZD˸Iw2?xaQݮ +̤S,$):!.; Nd^k@GX/ru-Tj1js,\t֨5Zo [&$rG#ޓІ=F_o $ZW g wxP{Ɂl`fU}tZV^ОC):,}RnW޼uɂ~`Kְۇ4 rpӦq< #naYhޫȱ=7kH`Ŧ}E5HmH6+E/"]E8ʠE\N/"ZEED߄WOgTtbZ8ɹW{/۞\[ӌކD3%]hǥD@'\=Ab!iB %r:eJTERF&eJO(%E[<"Ek^=ɪAgpKɵsf!%a OPEsfxtZ$BUsqX $Eaixv51n^[;?f {LS$n^z4i&>^_K'%J. "E xl {&c_bu X+F[ _B<%b..C#2Kyv ,܌?ry팡"1p,;0Q\h]B{oC@o5lk65k6k65k6φɳA٠<glwb#b[{˓kז'_[m[^&1xˣ- -o_[2n`Vg˹}rqR4HՓtzh0|EΕo۽ Uh0|GӤ#cf3fR@2hU 0ڏM(y[~ ϟ"+H ȬY+BwZB-|WP+>3 R `?~/ >/6/j!E-bb7_H!/br"XaBGe*Ԥ9lѺV:Zk.tdtZZGb>x "cBi*r~}RElbDt 0y#>GZ" ZFVѲ2;-ZT~򁳝tϏF1`r:LbW+de25V4^eLi4Y+Vql&3cS5"p+A41BdmG&v6f9߷SS'vvΘmg/ȤێK Wdžm>xga-|ɻox?C4 v!Z}9sƖm'qU$ bu$ܜs $z#Ch5~([4j]F/FK֗FKQKҨui 8E o RQ=XAU/ūoAx/@b̂cgA>RjFv(3e%-Z-T;c':[G^Fq,n›MPMp&( ʻ o7Ay7͛&(ߛ;0k554<ͅ47O|MSĠi\|_|M}Ms90jκt:T<'qgVȲ=8-Zʧf~OqUH2 ؜k@<+$ BK)Jcا`KDsObsNק8>#+S~ywU/Qoko*j~ěe~BV<|no,oX-7G7;gZZBjˣVIVIv!KU&5* ?Tå=鬱سJcpǞU-z b'W-/arlY/e'Z.elSXٲ^fMPHQ綣 ս Dt]>xZP?՝;{<~k| 9m%t[ t=n~ҭÏ0tw"t'B&B<:ONNV'Bп'x=aƻ=C=n}Poao{|o]\e'wk޲?d$d!X,K,K,D˸Y-Ýx6׋-5{dڮړ@'ޔ{xIM]\ YzW,jx>4]JHo]+ 綫XU¹X=e N^K!zzT5H5xg۝\ >?$*"igٓthyвg47\)~ja%vݤI.wkLky+DٯK3#:\.rq_.cZq#/MCZyZyZyk奕Y=ҿKYZyie+^+/2KO0_\p\Fȱt0$`j`GӘ/5ZVR+Ru^j_jZKKVzZa:- , o14|=:=x_ O7:xyߎh7rx= {HG {OcFVcd!Xy7$+or%Af0(cVoy¾87"}/؛tzޛl$hޫ7T$lz싒\ ?>jOh06>calR`6W0m06t%svhvO1h疴#0r8׀ot*^7z>U)ehSf/E>fUz{ΊB E"ZhTĻyBd|7=EјS6,=?DOFt1, Okh^$a࿋^[Zl׵bbV}-z-O+6+"=+2ο 9 ;\VDOr}}}))\b_bŧʢiTf1kӝRz{JZ;*.[zoI6dn>HHp$ÎvkF{v|XC,hA#ѫ=ifOSkMMv{Z+fC-lh<|͆ͳa al5φZx6=Ɔ#!K W \b~}q}y})))קSS̿?X律)~şbXP?ny쮧d,vq̥8 [f.ѫ(5뻛s |v\G^CbwKet\7 42گ~]FueeԞ&wԭc@C˲vj^=խ˹$MܶઔM5x\~=521_)FִW=z¼QݺWsI AZW$$m;dl P+s¼[.˨ٯ^lUۨiv dDo7y@?\Ez/uE[x/Z{z/Z{Ѱu#{ދ^Ԉ7E-ţm`ذ Y-"\I:AWҸ|2ގ\0[r NcVq쿩S[!B~ }uZn۹R o 3шwr ?E/PN"N&GU|x4NGX/'Ѽ2sζǻcb,lb.6 ~g%iޝ]ldV$j*.~qP-\.#or^*?|.eܷ,e[|wwwO^yk"Z;ǣpʦR=.-&Yt@faNW- Yf{¤wb0 ӪJ;f?p 75}ɢo^"Y [!~@Y O1megnEvDv}#kG$Zu?׵#׎h7ɲ25_|k-Z||kwhw˻&d^5YyMEZ\k ךFM\&wM|Ұ e[*%9~ c 9t:kyp8tZ})hkhғk1PF)? DmSz[nqE;iâKVҲ{I6ܷ,!,"$N˾d~`-Z#-0eFGmW#L'$V~@J bI uRk( =M'܈Z^yip_ <L!NK@ɥx$K@&NW1 (6zu ]ra%璺9#C,xɕ.x=XR$%/Œk)J| |zƝ&^l@zwJYƙI}'VV2WěeSܲ=ÿ+ql7Np113|Z!!vu>I;HI ?Wa,#cG xK ѢuS$WaC_'CؚUzbc;suf8R %4="#h'kQ.-b헊&CEW8\ٯ0Zk+"_TR%܊zPMyO:BneZ39A$i *L띠beb:o:`')8_-HNʞ鈝({ C 1{SKgVl^b fYYyV(ϊ̊UyVl{V kD Ѫg_y @ `ĕ?Vn;/ üLAe1k]tϞD78|5P{97U609rF1do-=:Zb{hZ{Bߣ{t/ xr|2!,Oi z1M:k<)V VZ`khGr ,tEhҜV4t]%ӌ#)HK0ˈw[=$  !K?wM:Ͻeԅ߽W[ cˬ6xNFtc ,K8e$n%g+z]# Yf1:-Zw"'6B~0wȢ78,8eWVȲ_mEͿc%m󂜇wco eܷ,v,{i<w h*Ev RLkH5\) P%ԍ ,8b| `hޫwK\C}C^sn4H54ߦGre9>RYc_7_#=:>-;>;u]m+2u_ɾ 1|:22=ov/>&ykkKS3 e^X֊}?t. eGOb5 _Z}T7}Iw!}t*ٱ7YHg}xFFt{b[\c;B|ni\V`3+?.tn)׮54tIQjۄqlsL:z?ec~iAWt,+ÏD_r4Wk0H0g9!P̶54~^G v -\>p5%+< kaD Zhg0mOX!e? Ѱͤ#;pvy@(mDh[VqI^;taRUft## d/kܛ?d?d V7tTք+-[H:O ++z}0K;y ONSwԝԝq'涆`m 3 >/>+sޗey}>{(H"{=rN粴u|Z46+';#e}NQwvf'z&a;;dafrey_/yy_/y_/yy_/}yNs)¹x^8]8 SxSi)㬐_0o=J~[7->~Ӳoz*MOj]|cQl{cY|cQ{cQ,{c|cQ^̗~k_k%~G,+~-̤#kq4ZLb"9I͘Zj >)g6Ƶrj-kh?"]4qO:EooZH\U^𓎰Yyga '9` Lf),)\]nhJ72QL R>S'Dn5uCCh!nyi7ڴ!אּ׵k_|/ڷk}gאָlk6X}/Iy/IxJ$VC{]}ޮ V_V_6` vR֤f<-aϮ0vaư` 5~nG+nGvpݍ-]O[fGo׽+f\kߵ߿">WqŔZ}+p[nW/'Č:k09B Rp]͐J^WSKP(WE9Kp lB K'욜[tzQ߸{ݱ؋߸{>q7&)~zwK=Qo]ol>/nn7{7{ow;q'].zNѩ:zSwtq;DhqhڸZmm6?O§ O§~L~ǔ^~L~ǔc_ zTϝf?4ZXW()CPˊiʅҥFFNoQwB.VXW)*pɼpt//>A1o c1;&zǼcw y{BxC139|91C/B6)qrI ^inRlbeL@rMkT(`gs;}hDҹ-%'ĊkaC#Y*ҮO~C#3ےV$N^4%dIeI+YL^ɒV%ɱFUKӤ="7Eg YodL.u3Cok2|"hEE~-fZRy"hE~-8-q']rʭC 4>!f܅dq\X!c\\׸|cX]h[[c\c\-\c\{ ǯ܏kk܏܏_s?Ns~|o܏܏s'J'zAVM ^'Jt^zH i TQWV~K)PΎ*mhRPZy-)ts?t2KPK.eK`pv&{I+.v_ tg7TyS6ɡ>DŽp=w Jlɋ&|{Śѕp KF6&j H5/k  Trj;7ŴԾ6ol HkZjÃ)K),;xzyet.Z.XkY.;$ B%]{^ t𐳩>7DяMJOb' Wfc(foƕzּJh %+j q%$JHBKݔVBVZ!? -:֩GvSN=Щ۩=8ј8DDcDcqO4&N4N4{!;2ɾfi^RCl<ǦyrR@Ӽڧok>>a]m'}zyc<GRkW>! X>ȣ6>*|5k55kk5k5B5kk5g <:w'=oO^z`&P,Ĩm*^5K3 /_hn۟h mݶ'mz۾TNg #ed[5)vj?!V\&*\/xkeIN .{Tiٸp8;=@Epxw%b˶B`0,B*[hc}A[ |A,IW1woqK1ﶭ]M*.jVvXޜr[7Wֻ!Z^a$5//5aC"kl.UWҫIfGV5;V&ZլiU_V5+jv^oêfU~jvVryT߂;2g$3ذhV\+MWTJ@~WJ`J]_}Wv[>O:_OJG6I'}.>iM-P5*65UjETB]ȣC%]lEܠ˹ /B=u!@%iiψD@<3Z>bng59(!ĠNzU߁XwK>ée{xkZxS{y@ =|/IK[rp%S+Y[,>:hcac:i.X1-PiN:5p]k5\4\s5\sw+ +kb>$*[HzVCV*]5D$e˥n%=_ka. t.7t>= 0 \p@ii,4\.4 Lùr%". },w_/^6E\}Qq˫/jM=d]yW_kM_,ånH|LzcTL!˃byQf7Yc,-@x)cӉAǚMwHq]Z~ۛs|5 3IU}~[5ڬJ |-e +fE-OV qMBwAV5f&|?lj:Ĵk1LK{tr!].U܃& - AzA{ 3J 0k8pA{`Yt)M ne똝 :ݶ:*U"A4[zxJV\Ri-LFC t~;DEvQ!CCj‰YVCfUb4xv\*0n-v46QE u9=b%T5y&U=XV'JJ`5da/9&Q+=h&1PI*Ix\ ~@|1PIm.:' i\*њM= .d/e[ڿ*;tBKret9S$¨'R /|Br&Օ|Uvƌt"m/zZGR~uVR׺_]J]N]~uօ]뾺Vkص/VYuI%MtF;YޯklW㼅O;Ճ|d!\!dSch oRvk0^|2̷η=8߮ uϷ[l =[+cyʤ_|NV}MLi{tĔqʴ=ej-ʇ=h_ti/]zMZ4Hӿ5k=Ғ.߿NʇYig?'ĎvhY:RG۽TАQ,lw8Ԧn+x(:R)f/df6qκ[2v7>J-[pE exuy)d 庌(W\ʋAq80~n$a`TGa5Wq҃ƈs 5M 8L W'x.Po]qb(ʽz]3E"2^/2ݚJ\Wݶ&Օ8Yu*h`F+<#rKJ8i,?:7RpK4XR9e8 M1o)*(g{P// ZE}DPȊrť;7ǑГ]=R)=Rp҆^#aR)cť X~X9O[rgC3]]aR9;/Cj%IO? yb"v rfΫT $Ayԭʮ]qNЩzN=ѩ:zSOtu;5S/tvjv0*݁:GQFaSXD(/ەVx4ہjr7EY2&~ѓ%mmGڌrZF]ʰok̪[:TIIw_Wd0ln@/W\dYL*]xťas_+x@E J{-ZJ.J`k9D >[=Z㧽:4CGP+6^Zu"jmIj Z>,.+]f詛0\02Dˆ PaM=Tۥc޼T(`c||Dt>rGT#2i![(Pt9ϐqIp5 ur>Wݨ~ib.l]bNv0gjlE֏5U`CJI(ӥ(g lErTce=ozxl/=!$=5HM&55IOM_MұIzMM_M2R$&͂<\o킴\HzTϵE="(IhFS/)7B^uPEjrMJKR+ά/e|<-5^z`_<{!\#v-dɨkyDvG;״lٮ,QaUr\UIȸ|Ê'w. d\E./]F<FT)2'; n(WdA^pk{)j e 7jHMd%?''3 *d%?qB?'A]sÀ.^>DS+vQˊrIGjBlE,iGZ{ebi .O6(OkPU*N~Დxw5oxp{^{|+8oW8 ~q$<^m6_m3. z\.aq#%]Y̪Yq NYvlhVh6*;UGj ͪ/̪]ok>Pts>`tx٠_nW;tAګmv a8!7 0xp7 '0xÐcktt mݒd QI~MCgހP}0f j*$ڂ&W}w7?X kܵOXk|U'7iAӳLRUQ~P:PuiMӛQ \t6Cٮ˹Y|rL2iݕI JiR] IP  $eAnrlMC9fsbRU*+[yb&ϖ?B%YAJU|iB[p[GPhIV.q.8hzC氚QˈrTzblEVo䐃r]V;h F]~z褤K" "'b債EQ;Zے>j*+b_F]*<֠_]<55p &+ƫTzڍ EpMYNXb>]vҥ{%kh!@+v6슬W~(+5z5(R/ߥ 3^j=ת~⵪AQP]&4e 5FU >ۣ[m}$J[$JhNw@II@06F,l{nB87Y87Yd܄pnƹ¹zM~  }o홤.πg2 urjJxB_sl9BP+.Ou@"]&rȬTCx庬(ƫ S.ϔr 6tL.Eܗ.6ژ3/ll%۷N61vq^{ŰSeA'*da^KxY }md׎}슱T\qAM>F&modX JY_Nѷ]I%TuYh`COX~/Y̪ȮeVj4UnZ% "2f U/o(=P'ݼJ$דF~L׃4>!a98NWJ؞{?{RSS=g=)%RƫTqj[YV]V<9tٮ< :Isϴc\ g%rG'%BJeR]Hv!|UKd{I> u7.FojWtq֫% n" n"vEܗ.ZY@ygக1^ ޶mEdaiTܶ"Ԑ -UO#Q|/K?)`sΥSwEܗ. F Iۯ)U7E#rٗ.:vHY 宋d.WSEw`^zJZOעkk/z$ "k@,I1VoU\nDkr E~r jX`\DHBn;%Hf^/dJ5 U%wOqD^5R$#`"R^e>R ;"7oQZmK׶PKrjJ=_e:ąG{dwm ֺd.Ï39x9|O?ÏÏ=9x9L?Ï/^.vq8̢(%Y*Yd!9m ;ЌaA>/J*>G嚌(?H5gO?BK pHu k2Le|T`&*:T\k1q2p2™ę 58y#O )ؘ-6M uQgFkJR_49WϚq.Cf,fWzܵ˂SD:,f9YNomhVm[])0;"~*l}`ُ zXi|aF>|{ai@lCS唑z9ƨ ֗c0:Ʈ^+:cHMt1*8ƨ/ǐr. F4\bL@G_o[][72Blg3P?͛e ȼt`fe Bo<)ݽx"fm Y ytr3 rJh9[HoȎI)$l/jT&RU/'n+d={Q0c(?01r?ue Z2.rF\Р'KB# eF0qa4Lj&N`4:Lu59!1n/>j)"9+ հr>ƫT#bR-y씫 dxL ;"QΨ˳M{-kv}zUj&l (j/W\d']Kk¼F22y5мQ 5?1K 1D7^dIFN7X1]a/۳ <3xOdh. iA&L$W4͓KmcB_ AI"5ib ili`9W `#l9XEFh_@]azgEJӻYxDO#6N Xպ&73 饂͝RkSJ/N;S˩ w+N;Щ $'wI`jU54wR)w~QC dNpMnR[#δS_8(h׾}ى;8ޗ3p_v/Z55^Qi#j6V{#*Q㋍}n yA}pd{|}>Ava AbD*61ȋΨKl4oU*m4kF6gJ$Io¼柛h^[_jj_VQj/j+I ~B5RcTQ ~AvMˤ*:H+/ J%dr;Ȫ %5XTlV^MI`p 6Ɇ&in MB7M@ 5jRCccJj f[8|ƫ\"/EvDV@=TA)#阝fgՄ fg[РȰpAvIjY,'-|(W\}d.<0m# ,c',q~EjÌN9d_v!Lo.Z,1֕_^A3U@HEQ>Wp']UΧf[ѽ):mS-eP5^*h҈QHŦb$++z򊑼bb$++f򊑼b|r 62DyiF#\<*51hZaA.m>d/t!˒W˲,#.ݮF}et[].!t.B tBE]d" ]E"???ŸG/oYJ|+Tlv^gT!~SH?\ůz ZfԈ}%6Ȯq,td.9kdқk{^ifEN35+Ҙ}!k MZC󕵆yroST.T~s~_)" k46Y%@/gK!QƊ Erka+4P>  ً#d/"Zz) @셃7HNpbRPxMcC0 Ww}NM3*g]vwq']AaᠰqPX@8(,=(,u z ҠKBz)*aSTB+7Šz;a[هJMrkpY/jj¬ߤ'{ބ&I*F aY(M*Vd5] b{RMqv@1IM1V{J`SL;cY&8Cj^*h!kml)#ۭŶJM}x!օ?Dk6GX]5"R`c=JoFO1zxU-CC*oϾ, }u_KLlRzX mkϖh^>.;گhhh}wGzGwM?KӨ! j )e/X.UWzAc|5ry,<ۣ+C<ۣ+x,ѳ<)g?Em R(|J-Z'L =vC7T %!g 77>%O qΌW Ӟ3Kz y vʃOOC&9EjÄyQ>gM(hʢ_J.zH1<&pWOOQ{ۮOzlP w~5{6{~ٮ >py ڛY/d<;~[kT4F衉oa?u=c3vn_vdPw|87LT:ImUJ;S{s9_o^j>W 4~:v?~vaA#sRsӱiwn~@w_zWW+c6ʧDx}Դ t!u7Mލ\0*qA?LHrxsR껍r&:[t>& ΏYVyk@N2oXޕp䥂,nԿi?~Oh?{ '9—Rye3_-Cm͐ |;qw> ;ϸ;Ogܝa3·n'§~GO#|OO99XV).)*@Bg)Eӆɥ ͕oRsϞ{>d{w@R&kߣP>{6|5~y<5/DwwO&OB<,>zO%R|J4"CĊ_SBj{yX3xڷIIü' yO&N' 4l4L4sϳ?<=}y;ڤo%)ʑ~ύR0\TL y!<͂g7ςHMY,3kxkwozQZ{v7{O5xѦCMeL'#W]UdR*aBzԆd(S >uk02FxrEF M % 3Xwqz`t%\fLSb~ gg%?]y!gB×~tKnnKNhVר44:cin+ʇߡ weoLZ$W4i+ӜE=T`*7 ôEr3~T!@GYX=ңc; 1"]ȘJ8|R:T'Hug~b.UT)`~e]Gx/%w>%jsmjqT!>=pfQQ[^rAiJl)k EP "yXi1~.<yX0F1bcpX1bƈNcz3cJcLczEܠ1DÛ9JJZJJBrMwK4a+cM/saN%~J洓9ۜ6Bsɜ>]02-Q+z- "!=!\ rԳk},WH yokTz{vl%srG,, 9y~{ZqZƹVpc稤qfs8kӻB|g*ԝRŭ2ZZ3f4I#b~RSLAs6Y=(6>0O4a5EwBhe!&&S^oN8˛4ɶ4oxɴF'KD\~;:ٝ&>3]xdO/u%\jLS|],ar 7|2YWK:oVoNeM,L>bwV?ڟX k޵?'kbyڟX]Gw!u__/ ?Ÿ~KL^]NJgkhxJB 0\">_aq5q8l{8lM=l1[m<Gl< gx6Bٗ<Ƴxx"|oo7~E_> ~/ 4 ,s\>OYO<|(T*%Y}گjߣ5mix1zï¯W_o[#7!(&5_J9a̤g/!Ioz6)>/.P#pOZ3O4Xܚ>#/0:Üô45^*zqXq?b)b׋׋^/V3^{8oh8ⴧ㼡ӞyN{ ż̊!;,Lm'^EsMVo+ʧDAO|_ï^*hEqH ͞\d}j9UԅJ/BWfWU7/% k|1Z,4Hk)aYXS.\{Q>zß_Ce| fIPR@+X3|U^]ԶյZ{uϸE'~ e= >-|^pN jUfXi_fזD]Ci垺PrAiJlТe>mڔ-+QHq']GYdLړ1xMmZT>%"~hnIr| 7T4KTB*¯T5,/߇wmĽvGV*hĽT<Հ/\XzZ )۴F0KպT!~~~7|m%p>Vn?&?&;c|a cX/8=-001l hb f+ 4hb%RoĸPsZ#[z#B"VBʧm: oCHHf|T:Z:y; |\|6t>\؏v>@S˫O=oi| .=O!z^G||_U9l'a l@[#v1-;j_kg]LԾ7H\R*O wFC`,L >}4C~xY%K-nZªvXa~hN$ٖvJ\@:XsuG2GUdOΧƹ?5M\WG3m_C𿲟~*O~k?Tz;>|"=dwRy'k)m00:杵杂v'\;{oNID_\owJWwv/5:!]g;eVBkʧy~2f%O _KͰ)\ _n|Q7&31rhbu8o!D&b!5+vt]Bc?;n]s.K]]w3xgxϸg44q 46Ɋ2EM =s =ެTF Tlϼ}R=sI0T&O!m<3x6ƃpDOGx&xDי/e+v1tJ;dRn #q./4[C*϶Oh mnhO@ۧ> ~ ~?oϏ'Ÿ_3x6ϼx&ϼgϼgL46ϵ?>a߿YiJBf՞ft5fTU207b+*G %Fs[ *oIuxSU*Do>X3~ɇ!}ԛJ ||K[ ~fdVQH-ؗf} ^|`;rb]V*Oy2ôs.'.U? i5c?wԾc+OY /t^T>%[|+گ|5h<oh<÷0Fx*xZ?Y,|I|.[ '6rf|-ʧaHd|7d~BjxxM`͵ް23Ջt\Rj:`r:ů(||k8Rb6.XsGvip{gyfzIm=Cy<@ʫ2c^0]f,E|_p.ڥXZz~گXm׏_ϧQ|I2_>?JO:؋cr{؛s-kW;5b4zXtY!bT# .4[ > m< xbJAgx`Zp^xO{qU>K@¯v_J)g8NwR\ߟ^lXo^k1`˶9 k_׺]k]}] k]nZw Xk^k_Xk~{IdI \@*}^՛ tRlB*pRcNP,07 R}q``K<.Q`X|n8K miԕ@r:#Mϱگ>qJ`W8`>=@}tVmWާҤC @=IM}5hѮ& @w<[HE\Xh ~|Bħmt΀44piDiDiD FN#:N#{! ?-[![œF}M0Ƕ -o6oXoᏏ7-@wϏ߃@۟h?mm'@ow9{{={=;='{=( `3 `z( `t`XlF8{sVfVbI)<$QrSbٛem޿d2YQqDhN ͉nshND9@sۜ9їφE}¾h`_DE"}a_DhG"x3?D㙷og~433O7ɝuAORh\rAiJlzw2rEv+RF@l)>68;sle(^`tV%AoFUg Tp 5ڑ\!@.iTH/iHFnsTB*15e ՏgB*v%v%_] |J0J` +Aw%+^1/Xw*_Fw;F`%4tRԘ)X/c")jS$YkҌr=_]%3 QQ] etIt/]ve&]KN~鲓.|N\S'.vx.vxL,'{k$)7K*ܯf-VU-J r6"zЈ<$ :lMޒcoa9G}a[ _JSz`gV, JZΧSeh):7U8v?EKIߵS="|z<,m!C_;oJi8DH6gT?.RDxl!!TEeR~\)CT;.R9-o^%\a\!x2<)~:NjK硲 e9F(q(Wܔ KG\6hU4W3xVB;"nEa<Ҵ(3,%@-}`:  d|dm[܎X)Ye ޘShbN"+uzadK(.uOL)k`M:Fg@Aba-\xj>xYr e+%{:Q}lFm#]JZfԆճE+-,]3BUh5e.qz|J3:X S[ˤ:s̥/!-s[=k?1تgܑboHOE+;_1HbI4`k'ErZ;\I+=e9>N$e9_I+Of3itƚ(XO% m93cж' ]JIWXD.R fr0V[Ft5JhҌ_2n2sRpKIӷe'6).{VH:mk[vs5DvrG5LalQ*OTvR|BTPn|OeT!@+% CRt1g㉽!llW&)|Χ3$UBjZ ?0hF9k8%>'8?ȝ?Ωk>si@^.(('6oSdw|e+aNL54@ה5i~ 6=GY9%rgɯٓ8J<)^*h<WTniQ=_K[rwKnNORԻu&9|͖j Z ^JڗmwH 9dx1,V.ז- -uoYLܲXe-[,ֽeepb,NgGצ(9S%c@s 6fgY#c+CzTnv>G jM 'ZJYkߞM/{ψ䵬KM/L*/>0 Jx|y!?赿[ @SbY}9n!TĒ'' !|vKJ8ePxe-1N [VRAARnNOk\ >U>u@wXTex˹4b}VƚoB3pCB8|R|JL?eCSd=F얋7s7$Y7Ԡj!. q!uv>Z膨!Ca&9 ,}6䀱U@+' Q^2W5)O cW d"nE]4F;~LњQvkK[Pvd= C/] ި W*YdkF%]ݪ5 #n^䲃{-*(rVQ疳Z] \ \y*nmQ+dxCP~҅esGJ3*K^߼d }6yRe7|vw/ x7"DPCw4@4Y0t UG rMw$ w\!@ +% SO5h5`\o8&KF+o0qͿy{5qϿ 4`M5~,m8@(PNݸ4 J5p{%L#8}~7/75E^J-D m\ `!<(XjdH Q( Xx-D🡶dG( ZVr5t5V -> F"3Sp.tO ''tMW8d8d8ݓq8'tO ''tMS$N鞌LW8ݓq8'9cv/<6g<6؜|y5.BE%zK!W\p]6h!\tT"L׋;7E:U STANրS&8U`NTa 8Uht* Dp@:U Knz%M%pKr>%juK|5?gy\v *AaQXN+5*aI'9AvŸ\q5 L W3JwZתҪ4xC3\δ**UNREYk97rn|-(-רi9Gi97_˹so*qZg_TRwTPbN-yҥSk{)ilMQHun 52VFk˨dVk[,gkhVd7hf7 xw9sX)HcB`SHT>%rT-.-%)? IIIӺ'MuON'M4m4-4iݎaݎ0:ºa#Ltu;#,t#\kk7Ƶۺnn n^-\M\{Ƹv[v[ b}9ul^NVkX0v>%ڠ~(Yͥ HMF!_}CDCą>DxHxHCDbs`NJ |[k͏nErƶ\R+fǐz`M2!g;|[x[\PQq[оT{NvIKd.k;7Nc1wqnBqW0y9p Km ˒CvQnIܖݒI**|J%:-%~CtC{7T5'L]P/w7ԠY^пh#M&Ƴ|)u'Ͼ[N^ۧn}}ʾ}zbmZUOO5!*#>Og}mj+^a/E%ӥ%zQ^W/ڰ{Y߽xIxa<c6 |F\0=I >ܩ%=0T Sθr8!i7#3~wO;o w߿'n 9 {IUo!B{r%4v{䥤Tj!C~BEKU3Y/:^6Bj!C>@EGE)E؋W/:^r[zAE)#^t܎0u:¸a|# tv%=TSzZbѭ@bx e6JC8饤Q6 /o;-%iN#mR}(zhڊ)Q"4'DqB`Sl-5mG#0>tCc7{?yG6$&Btk:1w@;r7[n"TRyxf/傿7/ ~E~A5czPKՌ^D~FFa/5[ڗjio#Dؘ+j~d.#з@v#:N9c~pE8dGU? kdDmNL Z7:) @U!D;`At) *= SuXMWx41]͔I n/gHܼuJI#5 /q8%4:Α:a8:Nq<(tPb'CiRk~[cOyڟX]놿FO!u_o/ K0C{&R*O"I!||3c)TL{jTO϶/_ $4Qքc#|K"O e0ɻu{/%~H|o43?߳<8 6y (PΪD^n^%r9XKIm AO0b0[ l0ΧDO0'uÜX!sR4KvR~{F Bշ~ dR~Xcإ T(`&^VKi6[᫖xo%%^XGn޻o]w޻{zᄐ zF_z?t =Cj+&/4®VHECiJ&gCj $8DnV*OBR*BP  a#::@G# t0nG5Nr-X\1ª F D^ Z0> X&jWui*2_=ٿ ˅l^[pل[? g?+}kBg6!\6!9ukQASkT>%M#|VwVJ[ƚkcXPzR+ b^ˍڧ >$ڷC 7KdDQB8an=tyXj>WX_^j{ ŅÔ©av:N6BZt>%Tt*RE!4[4+' 4lmLJ.3YsԎ5-!ks3X1J,vjU%q"`e}l% Zl/%}Q ĺ>> }}`_;eTjC:8ľ6H<5 A^||V󷭄VJ'3)<|I?@%/gIX3l&8M{_dY*;;8j1K8hEDVyfV4 A^'!PIϔXAL>Sd&zBӥRwXg|7*.\G'ZRXzR*ԡPWċy!I"6| k̇49XCxroɎ GeCm;"hC!džGh4ZNxjnކ{>sfvկ䛕Խ{TطlI j!n ط$ۭo}nRv}>"VޚQ܈uJ G@4!?X-]j͢۹|5VyqC_]zOPVL6UZVm?ӛyX׷jbT | )g[[kiǣ.d[.ǡ\x(Wʅ2P.<=6P< ՉЉʫo;QDNxvcyC+ V/ !l[7= 凪{әK-:MY4s2>J,u!=/?LXiW/a`00k`00z50z- 3 Fb` KmRUeJq]PU*%VQnMT-xEb^/ޓq/ލw{܋{=ދ~ܔ/qqtqtQwKxMu]||PbeXJQ-r^CwK9\2m)ȝ3' ^_Eު#E߮Gi9oMu9Nd7<[ =լ/VLbVsZWbf\.KfM ˖<կsd!'əqZLx$QI:aqBiEok9p o}%.)GS;b[6/l)6)v)v}a]ɵP~l (_T*ᇃ𭮾ϰMƯKZh\g*\צUbY9@nێ`lr*d+pmrZ*/ʙwQ嵋ZwQ5ݻ찋ʙwQ;.j.jK@UY/1h$V|BTZ4I$O*ՠX[zI]*7HV-*C=`=*@rUuVj)ҼIfds5/w˳7١)4 Ғ$I) Q`>mrJhxTAk5 5) s ]L5ȉkTAw ]} /jQjkPAkP5&zY3% JY?(W#jQO?FƻG*d e^.p_um&ڗ'`ǩ/;N vˎ{hg/&Z@/{z TK-Re#Mnݶp/$Sk Gz/| Ty*>Ҏwȸ]kkk㶯eU۾Vپپ6nZff~'ïrF!BKY]Ff[_2} C01̀?>CϨI|~ U[T^<24[fyd eY^\C6ɶ4MǤj Ҟ\**a§~ x;W:a EaEaEaZfXFXkQaQaQ_, aϱÞc#9fsמccc{{{Şc%=z9fs8Rqϱžc=Ǻ%=T@7R%dZ'x#V.>rXo-<6v v ?.y2xؼL{ؼL,^&Leb_sV_Pa'UlfR(Jn[9fMCCqr ހ;ԅϳ%<;=.g[ykmEL<+.nx^MAs~fzM禖xnj鞛Zi457bnbȡ7-oA2|[ˁTx.Y ?bRuy|)A͛*5 sUR:Bv3v yn˙6ۺJ{ pA@@d!It÷~!J\e1Z ؕWr%]x.]h.WrؕW+vyذ{Өx~S<]$[RVl]^fX_ [d ei^\pS]sS) 7EhwS4nMBM~Kd?_T3;_[%%/x~x88<;~88<;|E&"oɯ4-;J%Q+c4BifkX ;γt<;ϸ;ӹ,<;xwqwgqwywqwswYyw<i2k9ADRٌOj+Z*%GSfkoI~J`Rj/RcRپMJef{feRp1i }c`<&}x l=k0n ~ ?f|?I]FwMFӟ("I',˔luoR#2`l K%r51r1"(y ;Q/݄1P3c wIHaY &]8I,̊DxqJ^vdzEn| GCN Sd6Bj7+T_CP!@'L!x?Sn| B^5yUCM-4JX#ozk?+kگگk[spg\yjp\y:TvY+O4Fn_!2!Kag >DY+@!߇H17an( ( >lR~`(xWjGo~g[[Y+SX#|t [^#|#dp+&5SX#|~FydڧCU,ϛN&>ouR ykfMD.d  قk| 4o_՘&biFk}@}@}-@t@}@}-m#߁?o[Gdo?;"nto-2vU|EV64ɖ`Jϫ鵤tT(´rAI%ɦZkɊג.[(HK^>]].6@ A@sR>G0YػK=Հ}c~jfQ?X*U*OrDH#d*ҁ"+f4Ob/fD] ~0 YK=kƜ&K+| fئ:A?3!8]s $0nG jTLJTӥ$K[t{.)#\:5s颹T^=\2ͥ%\Zk./ˏ?_~+M+ӧdski?!X<}cQw>wNk,UiܙWɞhx J}dR0J-^ť|"OnUr-ãu1>?gՄo=TA*5،oh?M GvcKvSSbqހ;6X>yZ㸀zd-vɡ)vz2BX K"W3OqNv\qK(CUr.!eWrޤnxGv6ʁKxFx]aTd-'qfQQèhV:Fx?)RIMq,.ɻMa| $`M]jedi $c26]|HԖC}n6Cg" K-,&Z \kCOI5ITѓjI.<+zʃ<+<#4*p%UAˡj*Uld huxOڞ|YKJLMkEJi;kJHy>7d[EAV$h!bEpPI/ ꡷.}ۧA@`{RKCY*˜n 1?no;o۵m!Ж񦭵x{87΃ssx8{87Εsx8p/1wFCg)h|M'TtpΔ1 c!ɖ1 F*h9ls>oI)ErLJp/O R@KMʥsiOp0CKS+.$IfyMu.+?kr2촢>/\h| _VߍY\  c׏_uk}k}gS^.EFq #]Zj`R#Ҍ@(̒X GЃOzJQAJp9QO>$ Aҁz!T'PŲ_^Kcj5XkT¿,kF /{\\¯)~I\s[ޑ?;uqCyq˔u[x-U${9 otT=ʑ0mhi0MyTӌi@P MG t$.g:24mfhk:m|M7OGtTMG5*y|:w#}%>#!D;q)!F: t.)qpSϹMDп>WLWMUC/U .]m~#yP}`SUH`߈7S\ȶoFSl=nRhh빭T_B70  u<^zMD YdZRAS5 Bus~)zrR[ʪ\P*R:/#uΔ(#4/\ c]d$hQd(lT8R3 1ui6*R.vS7ڥ<'.UKdک("Um5ds]ubvA]Ŏֺl5T .NU`u4}wLUb~5>UgHmڛ<»R 1u4Do Md?WF{ëv{ O`W]yw۟J%v=`w+ىr][M}[7cJ"0Rހby%aR E~P,ۥfۺ(4UCTjczx#?x̤W-}a/DC&*/E! RA4{uz0 nƛRT-SS >c/&w_>T Tj58`@.)C? h| gV jDr24KX#,O _.4*8ͦ4U*LCFaM .=&}||iBibibܧA41x&ber)lvvYRy 馘ˑ{SPק .wS̻)δI6ٙ(n ؙzGlgZcz=s'Ix;]O֥rpZ~y.z_t^3kϬqk?}2x2Fa{.QH+^ 8R "/[iTXnb[?Xf/R1O?>#(| c$iٌn"5ُDNuG4R kSy]jc7Lf|5_3$ &5$e,']`^'H%kj0!LZLT"$7{`a* tJ6h#Uc y$t7 [~=2> y$toHuӌF(8<ƇGdƣ#r Wqd: Aބ0(C^T! ~R/Tàrr,]:,Wɇ-W\-\“mz[rNkP? 9ڇVH#CR-C,.5J\*Ïݿq+wݿݿqwݿykiyb)>WW!v\7DñrZfR`[o1? s5,ImpѴOJ4Sޤ aFBꓺOk+—RCVS0H0/,9Tc#ܝσq'/JT*×T?Cӹ) ?wax̖} UA*E&P{sHBKG _LՐV4`:IBҞOLj%}^Sl ҁ:T,7ƀǐ|h`I%~Lqi.#U]3>S?l ųۇ= DC1 OZRASm ԿZ)UDM8)2S#2> \،yh`Ug6cؿ_`cVܲAac#/" f1V]_<~c[[Nr{y 痮a4/݋Fvipȑ*Jc?>Ɩ|Be?,}+ˤ A5ҁ:]*o)TS e&Y8[T_5kK||i|ya/Ss'%1d '칝Wya${D[YȮޏ ӝ7u==,tPR;];=tPu0 D=Nًt!yF &T*w&H=G>wKƘb,w`b;0iƐ%kw`X*wݥ|u'xOrv}l{_~hrLdjͪgn|5oO)K>4ݹQPj&#o]j~ofMԍr],@G) wev;:mj/Ew¹zIDrJK:ȏ갖jb6f#?of213cTtA.  ²MZ C_n\ _oZ ,ލF;_wT^ s1e[lQ&U?lc%֮pWǓt'xez.51µӢTD}ߌڀ7 Ywc8aڟ|'P>qc^=6>=c$=&iKr%<'* S(ڹ+eVϾqix`Aè7GVaNݥR 5Lf?}S)0mwOJ[l tcK#R ~R6;/3$St}iN+4]*kC 7 AQj 5}T:nr+E~f&t =6>CK0l!BVGtc:mϩHN~;ȰG@$\q:[&Uc ,I=?*6/j!FzR>DYZM _#o|5|!Q!>mD狌t3e`E/2CKeq,jmMm3/X]iόT{fjA?,1L$邯Hy >3@ (&8_A0k76Y?tm:'o:7o:ܼ霼צ}?N}m xKbu7;yX.Je/I/$3{e*V PIo *BTPP"c9|"x7`1BpEn|3С" UÏ5ǀmǀQB1] 1@P?'3aSoprrY J[oOab> c?_٨{66-F٨YFf٨l42F#f?RXG7vP3//| |}E mK|,~X|1֨T +G|u:[B FlɝK|8F'ps&jf _J q'CUlԲK-l?YJa?.Fww}KRW(@ ?]EۥVkw7>zï3wP5GyO 3orBPc1/; c"c% >1Ӧc~fKt Wp"͋5v%>n^VZec<:J>eb^--髚qoa|;/GH[?mc| T/qli?b}lg:E`%?tU Z.(W)h_Z٬G)-ũ 4* "*\Ȓ6[+" TxfXEWsޢ6#زF)x wKC"bdol'*Cp_ʁJ=~)$&~5/d_B9>ĜHN.%R%ڥ.MZeenvA7Ltefu2]i| G&x2ݭt rkyĢ<\%!.:vmkAQ*zH!kDyXS]jx<\ $~oor䢭B0i㳺y;6lVgc}?s׹\׹\u\u:un:xkuyEEE[[[~oQoQ;oQ{zXw(dK|HߴTDg gka >\*/ϺE;_mx@=_g M-Ui6\*w8ty&_="R ?_Jp> p@0^?@J> l}@|@p:C\qoww;X"_WJTZbYR>4la|>G.U]$$[G@0CR v7B0|{?FL<;ϼ;O3̻L<;ϼ;3w CdDžn ,Be`L~2̚ӥ~0ԿZ??O?﾿Oyw͝gݝgpYyywgݝgsYyֻ[[XVG/'??oŸbd̖qYJQ3`YCL\fw3p_NUfcJ*d$:P0śN0Ap>'ǀC90Qim(` dwnDPåFdslP#ȦhlĸCFF/OA6E9PN?O۽-wV7"JѻD62>{/J)4e+4Xdf~-u`[n Zڏ%@ ͌gj.8Y4>_^dKiω?'7-&gz33ï ?_}q~gO H+ ?r&(* V*hyZ y ͐*b54G$TZq;>.rr}δkI>Nf},}@N~-OKMf7Z\I='溤뒊ZD[# ^(֖VYԠ㺜JO]mtw/jcdld8vQEkda|&tLyQ+.uq+ձ+K[R"b/&쪥8%ܽE/Y.5=t.K%kJaNv ^YMW힄Z{{XK"V_㸇q<8q\8a8a0k0{q|['[=mH?aiq[3[iћlo+TAXa˜ ~^GB4>)EYR -|329S ǀ7K5Ζ]r*6l1 Y>J=m7[A凬iʥ xhc=i=MEa boE݊.dʷJ&G]u=ȰӺ(Wb;x^^fJ&|c;Ll^ kl|6¯PBAߞLc~xN/Gu>Ӌ9hN~FszӋ$sz>Oc__}CQϩ ࣴ,S~jB\hmDڍkK#d._j߷?jw߷ȲY4,-uOP[6k;l}.ly4ҙg`f㳦Gbm[f͖=XDek#9z:G,[=LҥV1>rLU ˖|jYX# 4uIuCJ `+F!>C@';c(D%7z1>-A -A/ %XX#Hô_@0a7>5h!g~ikROlc-PT-ʫ _QyD0 .ܱ),*ͥhYTZ,iu ?Jf0Qv4iUo@$޿J-ۤ At%t˥QwGC{iGR~׈I Tz܈e|OB⿽h?g[H# --cGJ;zlab([@ VOjy$\pu(u)ߣlK]j;mZHvܧN/.ߩlKtWQ%shSDp)&$`Tv9te|9A1C:Q)H&n|YAtIK%On2T_Lpbl?!BQ\P*RE,r>X9p [Ik ۍbϮQm8RVaVU*Mǣ ~fiێe{o"6 pوEF6Ұ0JJ1=f|vR ,'1GԶ} (G*?M 2>8_5yO_ R >&i@(|Sҍ1V/>y} OͼADF۞#dzO99k)AREł?~heRyGfrBYEWdk]uܦmV@P=P B[Up\]jso1tm|5Zū ښGSЖjھ,VY h*m|5?65=}"lVϹD(¶rAJ5,_8ܐem{+7঺dd%\߉2R"nJbá*1U}8kA`T 30l4Re=Ux RyJ\fRҰe e^.pS](QUSc v58wR=>0>ː:l]w=|kR U ?'h{)ʨ ~ !R l=L[' Ke#7 | >JpBU B>}K-,TY46>J}EJF%y۞lT0*0MZlTJFF+ Q}~v,Tf]&Ujxj51\&ɮv;oMu[u-xD \!b)uU8\Wޤ A57.wgKW}QdisxnVoc.y1@&Zos~+@<6ya@@<ya@n/f[XbY?gPRX XR*BfyR8͢Ѡ1~ Ww邟M_U*ïUDgO6R cmKc˹Qe{li@6k&U/`X]Nܼ'9|) 7f| 2s!Dl\0BbH\* 3ᗮ"OH`(:9,Fs^*/E EY>nPTWpgd[]2R}StD-8KrJINvC@ viiƔ )P:~ɥ%&Y2esϮY(AIV. -ɡD4sBnr auV:qs=&&eG!!(5#ISUsIR=Y4P2>O7Z$_'M -ړf|@\EE˛T!>J?P?@I?;{ xh?(ȶZ?H>zpnd@jPɦUsiЕx5Ra,']˚#.%t` K\|ۙʏpg*wg*vcg*ܙWIP3-gk|$Z [O7M2|KW48e1V_Dx"Dy"<{"z|}<:CPe_?~~?fJuLMf Xʹo| r"/iki|kj_juDўh普y2L׾/*/l.u<յK5jŪ5:qeUE:HeO%"˩wU > O7dgk?n^?n#SW^%bxr٬@Q \@*/cg/Y}q3BPTpC{u܃~! ߌ{-F%W:a=hz`aAim;hvT!5;jc%~g EsH2|J1SzaMLPzJ2+ɗ1xnCx[zU=[_F9HjQ݌>ۥ6֧zt3T|>b}ZcUB%K#Oq,\.ؚoZ֫d|5.Hi;#WxbI8JΓUG}v\lțcKkD==(<.+b+YF cOJeI3i&um/J'XRR :VB:%KK)°.*M!M]٩m-a;ɦŽU&ysu[ (Q-}%[ Z:K%4x< {< -= -OC랆6OC|?Xx"sb6cX4LJ "9%ʝ'x8^8<ux8^8<8ÿ``5lGGGu&u``}aCB.dܢP,5LpdpE'c }o)[\f|lj70>' ~qb{Y>qwC#6qĩ:f Oe0|-VzkK qi~5lKu>w𒡛i5§GҺLSxy/'3Ox-S<>Z-r$Jug_dVGoQڗwN?A}_/6@pᵑ~r~l}?b1֨<+p~6A%U{"ui.k~4l4ě}o&o6oiؼiiצ&4l4yxn[[ym ~=_C7Эt=t3 ]lD[yfˡ&NN&Ε(_L=_&Ld g3g8s~Or,Ik,HsY{! s/Y"BC`al|//3k˭Ϭrk k|h 0FU.yd "{!yd _2K&qr!yv_TKղ4S;`Ow a uJ HY6t]*ht:O|S+v"U}S%v wMXЭ"ֶO}+E"[DV=NwxQ-x7Iʡs{U0{Se^92ecqN^x6^x;/^x;/~/ o/G;xGo;;y=z霼\ssޛɛΛyo:o:'o:{yR?)/%I2ԯ]Kph@R~-_K}l|}r_;}}r}//?o UIp!DC| Tk%*oJ'R97~Kýc#6Z~譞gۥV oVX}6"iꇄ`7;OL=4ä Q*]** WMfYųH]n]S =%+ȪJkpP PYVU(J: H ,'k6BX*lx gu|G%O&QЇT`t7*#+3|vH% t.ԥkXou۴ukn޺-޺m޺{yx붯ѭ~oΨ鞁 >M@@fNJRG "kyzK[# ֍?dEOv*8aƩ^ʚj 040NvZ nCXXy sN ~OheiU{țT! ~RA#|z% Y^~|<gW]i/ t1>JOZ-zRNTrRT-0+/[Ldje Z:ͫ7`mBH Dj؇JBl-@ R?T*_KsUq:2Bp Bcx%kJ(0O BbX~hZ9c]j5[$Yuc]i/IM]@|>D8(I]wPY24IWR b-0B }G8チ8 JuNw~iIVCtʤTH^7MqⅪ$kJ5sٷ7# 5s=6iO[ٓwT0NmR\A;/ G4@^dIZ~'ĢÔõeZ:}5oK/m G)M3T*ïE /c %;kq#jD߂0>] ㌴hԦ/-b|5|+$^(CivaC2/۱ZilX"^-b ?3 2&|q[.kP-b}>q+/IȻn$#5㳑zu!AK=GD+FT/EwUn`wN7Cl|BT-ӊj?T!u`|5T.I=5KT iTAhr%N^;)|[" o'tÄaSXÛ3W)M\RcC2)/O3BFu*V:jֈ~Y,_^|!J+R*[vVHM+FM9 Vnd $*RkMKmp"P kH.5L @c_S}zwJ) B|D:2B΃b|5]"y*:ϰM~ێ3 %O*[TtZm;:04UK'WOyr {0]KaJeS3aOH)Y'b'?Pa'o*hT^P)nDwƛ|?X9ޟd4?Zh"~HXn$YIW3ql)Pj++ap?IZ4>!Gk|p+GaOV:R\Z.o?_~ qSLCyJRW~n+-EGŸm*ڒH-(եu ?i 0q= BY) #?LMFsFUcQxcJ38RV*ݩRYņۥ&h)CTLŗz,s(D+LHMi-M9m<濕LK֋#U־ 1?j?3k?j?hGDpEM{L>w'eS8pwXo=¯~٤pߦJe'ݿ |1V/i):9Y@lµT[<2o*oZ x:K+ 0,?穄tt%O(pښgu/H5k헸c%bݳxC%f! ~Rk4>ӬVW&U/@3lr o / ;o } sP+`%NLA=zN9lsեٻMRǏگPG~owo[G/ӹ <<;OӹT<<;Oߝ,Hb(}ԾwkJ}~t*xŰT/I)qN(48u^.e*7KQ.oNo+W\E+ɦ͜JJvKxf`knFӓ}(zA^sҭל׭;6{-H ^5*)Fun RОU$"'zRWOm:R|NqC.3S*j$:pU6&6\06ii| GS.bFz& KUA;5ե^Mz~iPנaP0kP0g>WAAhPăz݃z^<=Ƀz]z$ԋz6d\ܔr>b` ҂R1UbX2i7@cqKU-!`- @eW}iwH -EiڗK%r| S u~qXR sSIå&:/ǍL3>7BW#]Յb/5(+_.53>%/gb.nZUa{AJ_@xATc〶N_*0"\"EnQŽ}{2KwyezLh ߣa;ek 1N56e|6ƾSvH4E> nX 1R@/D@/B69`Sjhk;*zɻR3GSjX#+JP5>4x%J`ו`T_t%إ|^ MѕTsejgÞF1;gRy>4M"zxMY)+IDɶ/oe\Z$&S ,:c, åf~4 Mf|5?/T~Eᕊ~œOhiA]COK ;*x^R e;4M#eԓ V.jRs-Indr7 d'N'w4\sހ;%ĕgk ;I4:Lge| ™M"fMag6Bg6VƆc}`|\tUX׵Y2|[GJ Wn/.zyގ#I䠧"e| <_eRcFfFfT:ڬFGծfT:vmmZMkI 2{ ]}NP\jpWϝ]TPOś >+ǛXGJQ\e_Rϕ7Mlu"Z\ c]戉 B>~ocb~>!%T--'XR|Yo% 􏩥@STV0 sQQj  ~6SX ްUV7SAQ 4|. I҉~xZy0>qkŸ׊k1<O:"j47pYC2&.R {ލ#ysͣD+/1-'PS5CRfp8NR679WMT6yJ}JxJ*6ӄO_>)ETIsR㔺h|Ju_B,tZT%_͜j| r0.s'xRM 5cCM<~?s[ V~P*R#>|xe EroxrS4 b"ekCāвiI@R%B!TaAX#‹gQ SCcXiA1EU*YT[K]=b=i_sOzzRzl❯6nܤzm2>II3S4klba:2'z*U7&;4Em(d{o67GžGEe:*}fux8.&ߔRG. m . BS r^ b{/0ds Ma. yPŒɓl{#XpY+4[' Ɩ:|9!EGO<%MK妸&&&VvkaZaگ * j j1AiD8nҦ *)o- 15YV›QhFKk.`_DUl @`GSW&UR<*oAA~1o&6ja,+վ)*ZJCI8Ղl8ċCq:p#>1D|X#̏}}繉'!f%ݴ/RY[W]ΪPǾݥ`< ;^_*PT+/UjmϴS6,UK&u24Iƥip--p^C"4V\j2/P|3in|5s.ßc=Ǻ\Yl1,Uo㫺UP6MKM}G cd'*~hLٹ0gmʧ*9|""uJs '/SMOnJ=춊ΫT?y~ij?U-Gv@ym!(ܡ.OtUY[fͦ˶I@L>IYI^tcPi4Ti(4Ty4Ty< {j< U{66Roٷe;Rr~15ˑv KwހK8777y9o/v7Gvt caid)iju]fRIU*UB=36ͥ62]wPyy<{y()@S8]]?{_ ~(/_:_[6tդˡuXJ1?j'ko;kʲe.GEE1fQ3ˑzH.Gsj)$u9.S`v8_a\Il%$=*_Z xʾ0*h ;aw4^vG=kwhbwgEҋrZf<ۻ8Iޭ(U*O̓)F}[h&]?19^ :^/T*DAJD[Ƕ: ڬu+=*d򩄦#JŕXnp^䗹5;>xd?,˖Ev*98rw/\``Oso}TW_plC;iRހ;r ahV]C#ĭگU{~UqА7Uy^d[ׂgt6 !RI`mylR3.6X#B-S ?T?D÷, tJRE3D'z=iГo"JW`;ϋ!\-%Hȫ|J]>TD}mhnЍwSM t5E_`IWS`I}):둦HbM)4Zlݥfql|5|*Lr#UZ|JT;'臌x7TOr)QR &IeNZrV/+=ʧDK>4~JK6}o1_Yn~HPhai|&RESTRje]-m%bƧDH*it%RJhMڍF8O}yCֹ)H+? h҉n`!Xsǀ]!|yGuƉ(ahiE:lD|x];ό]j׵oX| nEǁ ?1N ѡ"Ճ_hVlΘx#p ? 5}? lT H&%ooF-?jsY/"Ξm}SF1l.C"A5UuX5Du> @3]j, sk/Hl[!p__4:vRKx$HؒHXHXv ZHԐGw@CY\Kn͠>8/^˖@U5+jL j\c";&1yL{LoD8&2J9 \43<!JVZO MY5a&ДȳԐRsyMAc)5K%d&Ϫ?$VZ5qNFdw`[ZzkR0 xdTp灇i[bbS Uv~E6tbQlc%禕y K*(RObYeUpʇ+mL|JpA?S?~Sw+aEaEҊ2h^hW_ B *K܅P$Dg^C'zFashU[aj|lGqjG{ɉ۩^@fì|Jt?ˇ:t%;JM~NT>v;]:$FB-$8?ԮlsluB:$B-1\Dy"<{"EyH?L9u 2Ɇf?9ڏΛɛ~mBWMhMh76rqԸ M,/d e깙g/'H5' M_K޴R u?cMg->ՏT:Ox|~~+?MER%FrR%JjꚔnE\g˥&JMApR~??O?﾿OSS-0USL`T+c8TL-0585p\l2hC K ғRrL?Xu ZG~caaaݛśuoooֽiؼiXiXM?!և(n<I:X΃+XK _tc J _`{: }VZ5SS3]D*G K6/%_|!4å35rыY"Yz" ?{DtfawA;T1zrCyI~sdnmM )QU>d&pn quإ2nָŨn2 [b{5 ԩQB4F5C.Qp෾LTL[ R@\G0|5̚KmW, a|P3eӭ_fu27Bˣmz?R_|(ظ3[9ѱ1ؘJ(98gz^-,*JmCԡY)Z?4y(|w-)+޶OcyA$k^u*; M_1Lډ?>\S2s{yEJ#݁fMZm[Py?a0- JӶdĚ2CK.5CffF砄s&3tΗZr eޅ3zZ}ɂ83[wleA 791ۂ:.jfqdAmAQY;}TɄFP|"+J ((# $,v`ic .V5$^6f `yA\bu'XmXU/jbu Ve__ھ0lPJ5(*$E"?! $)Q\Uyu(ɥ&w3pLǭMBij Z![i]HS@ +$KuVR̾"V[[lN][[k]a]a]uuuօօօZfXzX/օoKv_m|K̗~/}o|_z 2zï ?3z] 2zï5/oTTW7j+2d :2B|-U4x<ՇsYO`_6>%_,`cۓ+/`Iג^K ;|T?Z,䲢{}c ,n>I|Vz j;NN@m\N@{4 H?o7-~c߾jsy|/>T@s )1$†,Lݥ6~n~tPT=P$>& əBJ6>%ڃZm聲?Etz\?0JsQnvJR9"ֻy: X,[S _m2>}^N-ZvmRQjKw-mW"Q=k)ueT?p])MnN ik/$$ǩox)Ϛ^ I0&ͤ 7n(1Vn)<YV Nh9} Ҫi_>CG~[ m)!oj4>ӥJ)yp,A<@V/+*%o#)ya\jV)1rDyFΉHD=Op%R~GDzYI7DX3siu;?i`Rs4P"tFtG'R,VOlՌ\&~ֹTk܃tI؃\"C VR{PMuTW.<{e*l/?( !MdIUq A=ؐ4y,%?&SlŒc)qխXVe|56E>genW#dx+ө\R R{xdEmj7ྺw\˒ &O'A=zʥxu$55WnٓOjxЭ^t- /]:_6= CdJ8/!OQ;-dW߮_p![?Dw=)Cde0"xT<,-r+}cQaGR "l>)<_XA*8+<XЭ N y٦E>M7$~dЦ83, .U._uQPA ⼠l%kGR^y,ه ]ʁ;6]KtAu)VDKyR\u]Kt)AK]dU`'fE &2TM&+X&U@K̀5~T"rQ,!E 5HelGQ7*j+K{R'Г=fOgoK=,/UPAlM༠lӥ'.Ͼe źh9pMDX$;j ywy'^A.(¢;)ȝ9d߶uyn qOތp3 JG$&$8 GФRBM-4 qT8⏸k QtcsbUCmr/<0+UsZ ։DۇVFBIlZZZ5X\j2 `AM ns YX$޼{҃ho޼\{ko>ynҥMѿm):7EcStnniRu/<iiư@*S&lR`z꭬sK%1.f݌Oʠ{Ƞ~Pz"AjDv ePL~q h,r , HsmV\^իT`T)A8Fcu5\~SK/R{0<_X{\n(RS^P=n/kA9pUG,ͺWul d>8%*s\eXJPGEc1? ~%Ha-}TLk/ӶX# $'A)̻Iن,#<Csh읤Hgc6'B[lUaL6Rvi8o2Ke,+ &]RU5~Hqx^Sⷥ2bH/0Zh!Uz8!HZǩ4DZhYL@#b*<_An>5y7k\Mnꗆy7-wsw.e~e ̗..]feZk}0g5>3 w9Ч

%Ɂ|(b* &Tr$m|53aHC0J2+2i{c쵐bFerbkrTO˟f -5ĝdW:`$o @` ́u]tԴ'uI~⼠]s']<5m_XOM7\وd^ zM+L3Llodd~1~}'!R%ښʫouA`U^P~Dz.tf3sހt{J}LV5yiqdߠXW .9Zz(oA A.Z\p_D۲)myl3ؖT- ɺmYumy9ywAO1!Le7OJJ yP'դ ad*iA\*\BzbYmJ0|?%YێE7ˤ 𷍄Y i^!mq%u+^!WS"+z#om$%m|5?qYCʆ )jmu4Ll}VtMAAp4.4>Qkb8*4Q<.0*]*<,{jJ|ʧDgiӻnR?Q 1XYxbIfJߋjzSt5M~_T}]J+?}ꌪ?913'+=Jjjrɫ NeR0 OkO=a;ݥ ٤ejJg\LTHe "s !Ia7rfGmTAW˶2K B#P~}C;t+a-A.|i AOhXl>}yAbv;m .O .IdYZGź\*/±\Ok4j_RJްI0+R v/ ]"T@"( quxn^ܿ1XR,s%iFܻz ź\;Ѐ1<7ۢ@.Z weEBobmJ(=0.JJ,MZB3 eqK5-ɪhB10JFjQl|E%bio7T4&lJQDoΗsYn`4(R呍"uH'toxC7(RKynġϗ">SE8Џ t^^*//_3@ƛmCokRހ;V;1;NNz'&nӥ;NlOu'U !7CB|ʧ]7ɇ&+1_KM`TI< =) ٯQ~E֒rud`WIo7rL M%kūR@i୚B)!U5K @KMG@R ׉=za]!P~0*3LCc4BZbn 0Ql}#(EůBjl5F`kF5K%Ok?LgiiLrW^P˲p˰I.ʤ-vހ;6E#n46GM;`As*rShМBgw#o=K kXP!k[gNB[@x,* I,DC+d=r[[(;iUCbӛL<6;ofcS8 ]C5iD Mj٤ d|5FD| [vcT Jl}j̲m-TAk l¾⁰y { l¾B恰y _ *M21bXa) (VMla)J_dV Aw.e!ee_H؇{҅gźJtڂCdC{]p5B"Z*ޞ!j<:kx7C-qG0jƧDFqն604O2>Js : qi\Lk\zӸRO3 kd _ W`ϭ 9+AQz*1 *j/K>u_Ez@+T(JjYxRS\pG]xa<{<s9s\|9xοTjlǴYLڸڄb5P.Tfi ew"d47ྺE+/LYAe˚zgeMTע *qW-D.OO90xu2RM"+%z؅lm5|K-aPhB\*75:Q5?FGcScSi n4*[}(k:@ V.ﴲQ4mZȽzR<ɲ ؞\[ˁK)wET.K>(0٬˓ũw/|4%H-d="Jث}PKԣPHrZ~3٬HE3 5 x%tɏ!#R^R%^늧ٸp^P&6^?٢turtmd_le:fv6jD/kw/WPR-bOK`u +rZ-bO3١Mi4뜳q%*ܚ#9oMgJG/^kCBi=x5H5%$ uUkv%He:1SzYy;м/ϗqrB"ܗ.C*b^ Xt漮VQv]B;;/ܤ83Ku]=}>x=m *'@輠?_ &YRi gԸ烏z}xx>x>y狏烏}GR_ǔM{B( pE {zȟ @H6tn?eh o'n&&YSDMӻI2ْn(Y/q\܂B7tH%d(ɥ0f*3dJ#?UEZTQ)mJdU_%I%R7Tcv&n~hzRϮKsouO2#Voo/s緮wByw2Pl-)RH7&]ʽ9_|Ryq^ 7 P$ހހpU^jze*Шʹ5UA7٬K*13W ;ot^Re-aM}{}6)1B: з3RkY [r|>QσD4!?nbJT)+ٲ1ؓ8~=SB}Z;ܳ 5lw^P;3=;杻ʿB ו]fͺK$K䣰y*raEBTrB.Zq;p!]sU Km_QB7>OO$}MW"a5%~ŋl|5ٕafj n|#] 3ek'jSk jzH}NK+(:->]7^2|1*deH+xJ6-%uX9pwI&˒+ aşu)~2u^,G]XT&V*MB)'u)ɳ.Dz".90_txD6A.ʽ1Yl%>"Νɏߋ!gVDM6⏈kGī_GĹ#LbMRc|Pcj[5G51~$%ޗ*(lgJ,J&`$z*H'txyQ'fcCٓɈb׍Ov>7J%9M-UxF?Z?Q؏o?Du"ku7Y,vC L YFY3t!ut23yu2 1V/'2m^( Ţ [U§'&۴t;EH7|hsL$Ҫ t^Ld&u) o5+el+. .kMY@適|J)mʧ*W٥(M~h ~iut =VgG, id'so';:og5ş2*>nU(r]'ϔ/eKXᲅ HRހ;AǂH5qyf2]+V "M6A RkAZ R 5E&٤c͢I"mmЯӽ:K ]j3s.ecWS,, 5EF@ݝ+Be/34Ev M!@:CS,?9_,gS/L~S.#tr4>.wYz]+oM+797Gn Qƭ[a_b|J̰+ǵmPj.D#[4C.åGAyQR~:f TX^~PT 33&y7(S$[9pe{BnN($CSrI S>%:GMVWaI @KKql7?[ՑXs~KƜJl X-7_!٦K>BWٲ?v,8ˠL>mdyco'.p.rOǚYmMbzqػ.gvl8 *wg-Rlӥ]D}bOOl>qk8ŵ7԰Ol>>Q\&?JL N2}ǻYrW>%2x !^xT! DQ>_߹'~kqw~~o\ɵ߹j~ArUjU|[97ڹwi.*AqCrj} c%7\` S"86ՊIo\]c~yn~E;R ~_K`ŀTd!W%^W%`Q\*E*u?ݷ?[kVz.y4n!~i^vo6cZ@2P~BRa|JL>%,fDz.XǨI"T7êEPB2X7XM%LR66BbOjHCbfAm)\#).57>_16Ϋ1mlkWl+o?c9UyQK+cUBOK&xu;oŻ#Q4|=hafV~0KBa>+ I3lh)@J/* %A6IgR+AREY\*?w4\[JD;yAe=N tb!ȷDQ )U _jF [TrnQPוZx dRq#ٱGzٍ՛)Q mZԶٍǺ2ʬv6)C^W^q)Иݸ+C/?bHhe@p;a+q5Ȇ>L0╔ygR05-/B3T(vq^Dpyq&"0b| 8 AlI4MT9pXCK`-T$3L[ꍚ{1ekl* J OVkʵWԚ\gߔRE#|Opޙ |z;M~W69bk*I*?4ViY)_VikOe*m% ~F)Ur[IsC@q.UHbMRg#V_ӵ}}f}LϞglIvվk}vM}Go߁o[# ? ?~%lW TzT>eQV**WZ_5Y/j x"=q*3~I)({#4NcUbryܱ4βφ4(U@>ե8#P:8#[S=LǙ㌄㌬MӥLt353ZߡYѶcŶ9u&* K0\|n&r $0["WI9ٳ++|+oo{!AJ!NtbNtB_~VPNT ck$~V SZ-E&CV (6քTRkL FXQģj|5rx({(gʅrrᡜy({(7ʅryeOWOZbkLZ{s@r) (=.&Jfr{B.(W5 <oMKIy?[WSMQh~hCSMMVLo p6T)p*7h*f%wڅTޅtޅ{RxRyR]H]H]Hw!w!w! i..]H{Bʿxx]H]H]Hw!w!w! i]f<2 @7یȌ:z:یw?ZhwbGdbbLɏLRyGhY>t#r2m|rF+b| )gt(u%b?szQ_0s/hWO̡&Q}Wl/Ӕ`3>׿Ǿ?~?Q)Nc[4UZpڟm5!g UpFs&4͊Vk!4&~(q^{Hy(}WPcI^Yɨe`U&UZ T6iqF* jh)@%(K Z%"H iPHPUDCNuE($o11&A@E Z/@&5=?G_ѿo=zh])*RKJg+ż])&RH%p*RԷ+E=>7 gԮz͠Y1*-4L5PO*ccLo .SD=P~HҪk1-.5aTc )^uvU@RBr+/ zw,oTv6g1ؓŸ'-qi@kB&(hZ";SG%wm85(NOkdJBu4ꖆ5Au K[c n J~!yKq;5ОcfX+֍`{d]i䲅 t719*[l}p96{Qc\sTx\jPx1V&Q *0Q[:1oČƧpFEscʨtk2.Rҙ'o)= %x٤ɢ$➤@:Хn\ ,l?&ga޳x "fR瞵*,ޅ,+eͺr jXƹRr5J6ؿmnJ.ʁ+р7٦z}l}l>^}l>6B[>C[_nsEUʳUA@U^D4i WSYkL* RYLۇUoŪ[)żdû[N&U&ٻj7__ J@S#>_KMå~KxnFjƳhh4Vl@ (Rʫ$I/MZg։BrB"( r#RSd E k(^]jX&;4EtRF"F\u挞<WISge" -lLfދYlSqm(64^ʵ6kCᵡkCad^ʽ64^ 6~~2zï¯W__I Cqw-LV^D6i)%\plLn@:6Hni#EzԚ"qS)# 7Ea ԚBX6j۱O7a<_ݛ󜒅 MQhW)mZSb4ń-Th )OFYduyNːe~/YOro e'ok9p ܰ4| Mzc6\?KAdk.>+첅 XVdKM~0˲>&qa^ź\?)/a|ϗn}L$a|]4osހ7t?.]or"WɫHWƫHU߫HU*Ud*yUQ!,V P!Mk3lA5͛*aJȳ`mxT!esf)AocÀ׮\&u`(U4^ͥ3#ffMP9MPn9/YOFpBXrHH6e81R1@]4T g n˲tYvpހj(bmhP ʭ%42AX݇.e9oML} }hQ<֢1>+)Q8Қ |IΉ"5qT%ˁ1V$J>%TIJ0wPk^LƯsrӜ-LU·7&-N` {dM+~;a؝7&]nlg쬴(yv&}l6<<+]IYi<ٞ'UII3qOܓݓ2''UI{R~$CEg)B: TrbM6iLu~=lɠHWIvХ=ר.oEUL^nGetr\L'ٙ/\ogܸt I%FxGLa0k3^^#^/.]?%K0ٯVm&..v jٸCyTХٌ7R%xIyI{Id^R꽤4^R*/)|2#z! *4Ev^O],"MY&?um-wNI9Vԫp !RIe5I4RgKe}Ls?/H+62dq./(U4K5M4 <&+a𫕞E?oH5Ie7LXPT [?M/퇶Py)1CyvKmP2>?fs6*H+Q ;aԸJ"(ǁdԓĨ3Ǟ=)I |z|'5LDM$5J=M"WkM$1DT=F³a" E^`SQ?-v6 d0!M+fS6]ۦbpS)ƷM1>6-ohOՍv|ؐM$Ykjn|5Ÿ;Kq$)c-tg-#]I;ߐڮc_G[i2Ctc4VMERm8y&*_(5zS]jx^Z4kGiTHptjuCP;o}QQ=AQQ>vPGQ=AQ7^#|}_>_a_ul=ꒆxz-u]T0K TХ fwހ;5ߓo8Tuz1T>%& |_ @6B@Ph];O?o+ 傯]K5gf.Kvdp>|XbˮHkFk2vta}ʴ Tz#ǪKy+.|Mz~X;o1u= #z+{Ƴ)h?K<ř #kltT)RmɒK"prNU"@Y^^w %&vY~Z m%$x|\*kZOE$EؒFƧD[lNs7[VFPݥr+cVX 屴P (zW^D6/wv?ޠHZ$ؖ4հT*I5b]Pdi[׾ 6Gv]lTz~[A5y1$y.I  Yyӷaخ,lŤ ݪc1;ı'9C#oX AyA5O_,x~ v^7r ar'+\TCNK)=-Q(oٕDo(4X+3\r= ?npB V.xUܚ_4ֻ {#[(Rp;HRu}(bP<W*azd+=ʧm·'(n oG*m7T(c%MQWj_&mT(^~=iV\Nd._UwХfqٓH_{t^.XT3뺓~ևtVuӅj2UUYߣp'uE<`~(jt97<#7=X VmY\ ^͟fa7H)":mi"U,ˊhy *8mcە`=T0)_LjHzܐ$%hBҦa/!R : |+4*_(Ux 72å;oxy{u^ƽ-^/~ͻ緵??ڟwok~ɵ?ߵ^ۨQMQgmۨ(xɎ(foH6r5nM)bpS)67Xj'} ŋKԖ=nVYBEaUb{ئ g  đJC c3=:ӓpth0j*YTvæ~IlRah!XegSg I}I$œ9iyNyNZ<'kNڙs~I)ĶW~ MNEgR7 -c_|Ɇ_d淭YIQO2EY4SXAO?-6FG4B ,w*j%%T4>k,{Rs\?~7]Fŗ #~Fi|5?̕?T5s:X2KyⰩKo$td0 +&d.?J2v ' zlpu;Yi`cX&@?LۧGt*iPQ&ӥ|$QM|L^P T%>i 5^O̊>j;$,YAEL/i P%#Ab(؂~G]xyAM6j6 ҹ@II}JF;MTbUPP3IuQ72 n={(0pNt8}s .H/TPA g%J,,4\Qfr` :NcQsg ,[|6(Eh8gSd.&UY +ozx޵kۅ׻]׻F.޵{5^{s9OxX J`µ]TfI*< 2]*~ytefIwoM apg]c'9u&Uq7F#kQ/)E X`8Igf ,ͻh>& ̗ZӐϠgfAkAϠAϠgvϠg3h{Ϡ'Zcl+@KOS@>4dR+gnKeAik[W7+ 63-#>3W {TdTT?0x0k0q#<jq³uv.Z$2[(l6CS LHdsk$=F~e]/u67;lvkKე6.{yxޛ?5$].c\X«J]+ؘFbrcdcbc.ۘv[ɳyljZl[ RdϕMlgm+Ay6Oc")e_+΋Unj^նX/G_}:(s>'Pr ^Kp"ż I69o'ijXpG][Kd+xKX.+T`|fܔybD7ɦc"ȬW?!_IPX"vQ͌AO0B;4 >,VzO^E:UxU/(U4 R^~/9Wrzej jDlCD>hDB4Ev՟)q2>ǞIcOܓݓ=)I{R~|8aWl i{g88<{74@Ӓ?D N5BݔDԳte`:n1`A\b![Q_TPBj ^??_vk%XDvdRvgg9#B&aqCT_Fxg3&UPz\*Ƞ _oFF^`~>cɇ9oZ:e|5?=93cMt T&aBfZlҥMŲl|rl[a˫Ȅܳ2%do*=`dǫ&WS~FQrvHVUx!+k+/*Qh܁wa߶0`k{@V('O,Dxد_,dLYdπ]770U狺}@UGqm;t Ӭ5j.o]Jviۥջ]Zv)ũ|.@%UnTv2w\.:{?js/W%H6<}D*/AJ \j1Ge|5 ~;G:l,6##UKe W SX }?6L #2>J $Xg;{kZg͔cI{ٕ *ؓfQ1]vLK>*=rހ; ZXuNݓfG|BP Mc$ť&_7-,cKU6/]\rU,CX+mmNEƍ9&{EE/]VuinRPXJ'.8љKݗZ=vYyK+R*/*Uhͺ<8{#;Q/m-W\p.Ǵ;i=VJ,ǀiq*azt+m=p8拾f|c3\r(kiCig d:&U&!r ?n g%-[N{KyK8yK8[]`v9R %6ĿA ]jrl;.7&]$-'ܐմ/A"ӥz8r ^U[*K\*kwNa"\'BAkz+3^s k k-(1 4Xy뢡 .}F]8".k.k޺hb7"*Ͳ8Giʰqb]P.kTs~)IL*PW".]?eKm]h]S !Kg=P4paFt*U5nZh:/pm<::bh:cSt[!!EѦ2oވwB˽)*?V$!2!2it3K1#:*l$ }p.)riGPS(vīKF$-1]PKr&٤K|Bfī/d*_j^p!Bf~_iI:B/K1q 7ʥVMxU-9*4n IriR.t4^K.*_.r˥MK\ʅ.6_.lx*<[ QU%^l0[mF~VgK>K[-%#Ƞ.7x٬׀(G!ƪzˀ3vހt)'/zFfQrgcry^&VieΦ-R\$;X }>V>Sc%cXNW/XWw{Vw^{ЌVwhVQ^{};oMt.v]{عZ G|B4& D\jveR"lc2*<$ ǸA˛D2 Ѧq:G a: *Ɖ#vfț*l1PeJbCb%P.JWUڞVA,rT\Pʁt!P&ٱ=Ȝl,j2gJh2gI{9Kz sVdڝYYj677$ .67$$>|I&q&q&q7EOOxُi mP *4,z;Iy}_ո&&&d[dGdkamaIvIvIvbm0D:&YO(ӥ{`R-&Gg0o]f,+0dvYV+o%#.Znf3G],emre _vހtyy)ź xj^ڦD'?}(Eˁڦd..rH5󆋄.}P"!E¸/2_$lH-=[댭LRo-P%exJoѧTڀ'-)rťwEb.OԚ R21F R4^"˝/E\Ypp" nK8DV"; "# z CdCd!~1DO\uoooֽZZkkk7\?~i?9g5A{TI?:E3}F%ކ>C}cb]epٺ.5҂.K ԠK{2.-^˸p.pmpȶ_axum6o&o*7\7\ ԶۣؠB{T۾R#_jXvN{X2Arťw%ܘs; *UÆUtHwt|tXu7}+6Jl:@qt|B$vƇ'c;$cO˦otCZ[Unq|}rwdzQptvFܠ.ΈīT gD DHv3bV\$t66%w}o|7o|o|-77c.]fKKKK.-}Lt&¸.ܭ&U+Эrh+V~@j#K^X@&ق%u-S뙕|ټus>!;^Lvm.5u(U47Tן%^ >&Rq'<,!nVR\&- ȋBwjmSMQ)ۦ(pS_55 \$BBPr@(P ГҔʑLKBHk'Ko@*EmSͥlJ-%5*2mB-ϩ-:*hסGs]2L5*2]2[uT𮣹eF&M$ԥCih2,Mx &L}  wGx^x7Gxy7=kx kkx{5-װ>~):7wSTnMM1):7E7E|Z-E0C|=*_djiUV5~ZU*bHBU 6 r%:?)UId'vdOeL+Lmcc{K # +:{6E{̠sg<1L*Fcø}j>5^}>5Bwܧ:q}jp>5zZxZyV{Vw^ǽV/^Vϻ &x۹ i6mNlMpQqQ,6%/jU{jm+[?zGŸxB%~L*$Qe%Ii*(Mpf0>LFeQWh0j@鲢5J=jkiU MjLj5VPcXߪ>X>eT5,c˲-Q K<#pa!FEs nHh j ;'^PM3W]t=n6:oty #}s)u 8 4gbIbr}lz[㹚5~J3n::hԶ %5i@K)n +R .OUuAă!R*R5B#^P.@].#.xܷeI8 |I\ݲ2b;K@5̖e7rwID,yұYPgǒK;N5ЃC'zuyb56o56tlS#i.*9zyvgăxefS3Iڛ|KzZ_q5 J,@/%'9eyP^Pyڠ<6;w\J"Z(K`+MÐN7o$xnd.E .[(ޱSp./lkڷmomkͶ߶B,VBNtlT]ðB--6nB{;y,p#:|ؐEˠAe$ l'DH(iV ),PT}8T_1_d( nJeY—a0YK&۪ݥz/oDΐ;+`Z` N2{@Jp]zs}Bc2-o+m'뼽-Ue v^ /Z 4x[|R\%v=ɳϷR˻~^Mieޜi#y |dܗ.g e0uW<}/#ty*?GjR9Oiᵜ('a$򫗚TsW_BWgz_h^THI*o6zXЩ~>8ԯ'g0J۳S>!:sË Rz]*9eQ<H]*ï څ|D] څü8¼ c`px;O_6VYf?'Dt/]|.Wfl|~ `Mӈ lb M fC 5,{DwkrWn̕]ey+xK Y+o"iFZ#?lDIHXk?J;vdCFdc$&&rYJeK/Z6mpl|5?G hLl=ǬH,O,Z +EcbJe[cbq l&uщdB,.j1௳Z ~$t l* fhϜ>z2zׁ~ ~5_ڋOKK61 ̯0m9^ML·Fʛڋĕfp\j}^vR V'>/Cϗ ߋ2T2k??ai@0w! '{c%rȇra&^ z "\ R^P9L=>Ka -P* 5~N%}@/6"?r%*D4dX|c_5f;_^;]TF4w.Ƀ1?=k]ܵAe0kqW\Kne53BVD_xJbd<;ƳxF"2xNd2xJzš>V**|CFȑDrǘYF͟#x%jHReGK7T*G^-nq#|g6[X,,,b]0暝"\r+/)p#8:.be+W\USfM ɖVBcBcӅHt1u1_hlАl/4Jz]h4wMSH4tMŰ|>tOŅh*.5qڡf8z *P(oӷIvh''z[Λݰ#;9hRހ;ZRf"ݒ:=MQفH-[RQR):ɖT!):c_Ibg0ki{&bA~%|U7;`R 4Xө\?%vV-IJUlnG!fgؒPͅdsSNcܩݩ:ԙ;u~wjqV qCG8w B|Btg^Z 4U:ť2wK$?dbcR3@tiX󃼊,q4gY.o%φf-l;0hggXnb5Kw7iyR+v(|զWЌFoA wrwm7(AnPn_h7 qLg m؇ATf,T9W[ڼ R[Yv_z:i[,v -`x%M(/ӽK]s^{&R`>uh|VWuBQԳ\zV7OguYI-s+Kc kRdݰk]k32 ll҂Ͱ$;\!Hˮ 6]=-7O힖+OˍvOˍrriǰ%Ga*٣:gP>!I:_EֶRI:fӨb|5}YU9|j)P7}L*tx5'%2zQRrfǿ\4]f}n\x%Ml4|MR`vvux.?z=~HR@K@YNEH-~*,uSy:N>t\|8CGI CCiǃv::qCGc  QڇF d!JzO\y\+yQK!$^{0Jo ؋z,[{T ͥfL/0>gw8$fjH,0 ΧhS $ժIhFaS.&{|Km Ӧ%or/U) !+}E/jɶmm{b_lm6O`= l&&&}O`'ؾ&x<vLga[XbfB7 p˥fB0SGigkSQk AT>!:6_?R:7cuIxKǓ`x}:vRÃ]_pW4xF)g[6 :ϗ@V.N M@h@hd1\ĕR*WР- ~zj҉|B491u?&\j7木X#,Tɿ,{~" '+KIM4BVxUT_/\k\~/w]kpw#Ku2$(RFebCDC&l TJ| {ĉQLE; -cxЅa𛕶7T_" ΪIO-4c`GGIpX~NF2{RA4xTAC5ѱ/-vեc9]}SSQKQOHWbpޕ9,AFEr@c3K%Ϡ83_*̸]TxA03iنҡ)劫s d_WWtt(uM` yULHKĎI{ܤ˔|| 4d/pi| rɊ2_]l.Kܤ˖F]UVNzVw[)eyb==MO*dsx96ʁ "~db-YXN H-m'/J_ö iRiZTv, ,_K@%?Tr2RgomX 즐B'z> o+=O(C$خs&U_hs6Js2g!+U[Ti:INWS:o.[(SZfU$qS\oB&kINwxwMqT*7E)\jjNK5r[+͓w墔/؝ŃsmɎ=YⲄ]d]:;_p >lŎ#{c2A IvaѬ\qUu n$t97Nf>gXAzh陷"Ք8ܔ 4B(ͥ2eX `YS=,S#S+ͷIwiX# "S'3!dF|E,h53 73c:4s\iEL\1)/Q&&?e et+W\p]$*"Q4IcT|Wn)]$qJ3A/*i0h4"_֯W_sׯtxڽ~=L~=M֯Ϸ}_[{_ XtPF,r>!/E"8旔 ^HՌ~//Eh >MaE{MQ\np]^ѹWL{E^^ѹW4{E^߽=,gX -,k8yĬhV+*0ɬWfտ7+b]M +WlWl]jɻ6]1sZLٮȤS\RFūCROQUCF&ɵjL!x~dgPWч-\Хj#<(V{{K$*8L2JT,*^ij_x Ekz #x%@(Xb%ٔ:.`sހ;[ď.sZ0v +=0!\_ak P 4,j 59(,揲 h MNXq÷\qJ#٤˳f#;4'PD?6MdZTRq4VX HMR >'qidI뇄MԐ[\>,ܛHk'>Kz&ŝZ7eKSh$< Щ;.kN gu{ݵʻ þux9.۹KL\O5^;zݿ?]>2/t..3]tuet֥UG.]Jg]Ju)uU+=0=pLr\׺e{8EmA'ML,/j_?AGnМR٤.z7>K32zxf>YiC*nJw[ytsj)XR xjF̰] v5㵫aW3®f|/̪hJ xeHv O|K\˜Z 4C2.ǎ0#,;00#t;0a Kp2z Q=T~n]+UJ @T?ol'[=o ?Xa|TWg&Uml|A?d]ItonJ;F>!(a-[-C*8Dc J5F #wU[H+ʞoK6/˖#u8Z [AbgmdmX6oW"sކ\AV!׮05qÔ{oΉVRaTnvc^.UeNؼۍUx0H}@IL$??r(caRz |*?T͡$#~r3@S/oTrrR{)TOZʩ>۴ZʭBKh)7k)'Yi>~ 5Ҏ&<t$o`| 9Jx>(4Lȯ@2DWod!\E\^|B`$'W ~R1R ~mWrJlmܶ_Wb/W¶_޶_n/lm\~a/mm헷h IuX޽=g+=Ou JԦH1WZ]j3|-o\i|U3<{_Օq Sxiykڔ"\|J,~%rɮ| +W\9H6sUL;K- +'M)EvM$cbuc$UM#ىix8oM{iyi=ҺKƗ֝^ZwZZK~//;/{iOSY,t>: [Z//{o~ڎmiwRrIā\OAF|O(ӥy`U^Pɽ\鲅2]+#u/]]/tAe|eBt_N"d/,aO^iA-VpHReo̲=i+5pހ7e].~]`#rp,g.~D@#] .tDw&M&m&{4x4y4mmmҼIIIM+xd~H }#?؉:ͥΐ.NȐ>{8^=|B_Bz =|}ݴtٻeeeラZtݼe~u͝z_zNCޯNC^uߝzCN=k?˳nj)~-+':r(~-Ck3Oc~8|3}o-:|s~kGI}L>s)fCF}n0 Bv!5;/凪R ~UKj.5§Lb;w?uZΧӾ#S&DV+/wƵ_\kܵ_3~kq}I:.*fro"\T%S?›< "E\q oMԻ)MQ?6E妨wSo~lMQMQQ(y( GzF]x(y<(Z Z Y mr -{B;؄ Oh&ڬ<ńv Ǧ%k#KZ)P? UM4e\j#ߔRwK5瘏N9z[ʙWk n|B$>K˧Ge=yn5 MB11DI*3>J ]D*ï)J.٧nf&c~CvCPPaa0Pks~~\ε_]ksw?~wokε߿ZtW^v^{-i-+E@TqCξ6@f@S>!t)?4uǠK=Z 4MzK%Dm-t!sm Z]U'-VA'c or9b1Xy#fGv;2owd6ʡ͑y#s7;2Ovd.?4x?4xKu%}XWu5h>Jϑu$Iuōtդ Nc|{k5AKJqt ;i|5~\L^l^{3x3y3555ϼ<<m#>^O>m#n#7m#m#3ǰ\+ O T~b棐X 8d[X#3e8z[VR_#&< ?-wK5*ݏSO~ Ҧ脽Q)\ :A\IoNXX󷵟?~wok?̵ 'b_sL 2#:;4}>_qd>+>;a\*9v2ƭ>t9筴wG{<>grl x{_0$wT3~c%^cAƫ^*='RKUj*Rk^*57V*u*uΫW fՂY]Ղ*WyujY՗Y`Vz/_>ÕyÌR<* |Btsd%]j|c"{ rL >** )§Ev i|EV)/MErI5:7=ħC?$P)?ۍ)\jOfRGe|෻۷>~owok}Ƶ޵'QAH^l CPRJu9&mBSkM|ӳ,cPħU7[rSf]#2_ܔC=Ljc%MO褣A>@0|McZSTNՂmwՃ2hc /lG ^ LikZ]SF<43mavW67mR -i%̖oKZlI-iߖْ[Ҿ,I|Ԓ6[~Y|| ~M ~MDwvg{=|iYiGsG]'y֥Vi7>]jORCJq]$s^{?;m|?6x?4xo5%+kQ'YPJGRP9N;Nwo=uI6'p~ /{<( "RWQL]P 6&]yTMypK#P=rS~j,?Me}N6D*X#[ҧUKׯ'D{*0[i*GcXjspn1V>tOc8EvR#ا_Fk{:{n?~z[/ؕ9"\p7~)ʢ';.+%˥*=t%% ;ù??׼LTxQ@#}H*9u%eT!،}oc:k^jIij_wdJIeɫݥCbÎ1{W9,؈4^PG67< *OW,iѴr|ؿ͔Xtn_fcy):WMm6\!McR >>.Uf o.:r7\եߥf8 gc /٭4ۨ\[iEVJkwR[[ivSend%<6ђ%N8P顥jI8*5ZyD&KJ5@YJ;V|߱)EaEf_ⵆ;6rr"sڱ), vހt9!t%OCVi?p;5bS=0/w@qC#{PCf8z}:Oq!ݤ!*T!>JfOv8m ;O[T.b NMqxu)$;XV-GI֚hy A2(}T, 1+\\Oq~ٶe:K)Rʥk/lэ,Kr5l@I+,zU"ƶ`IazL+=0OϰU<'tcNN@B.( ,۶GcgfL呈0cdz Dm jG,ň{:n|57/@]R sk~gsv>!J97R.?Z ̩Q(U@ ˻nk`I3vMv2E+l> $b='MitdIӕNc*r^asѲo8( .Ѡ'i=, ]b{|TyA5Mt^rEKˁ ;貗㇭gE.?p=RAYX|<ߎϟ&WRBKɥ̄uV−ԥYgsˏNXCF:gmrO:;RHrચ'lzGUpqY3ϢTP%kZ#ChC3ޣj`s n#7nX -%T~B{W{Ceoo5Sp]275KV; p%k/t)_6uNO`ۈאӖqĺͺЮ˸."4|jv⪩TRbu}⸜ť6)EAFYWĕ^Vi9(KfILz?V+?chLBKBAi*,;xKⱷ!W.5@.ˁ"?g2LH҃IԨzK]&WcqP^$Iq&ZckBD ipA?ce@JI>!GT~Ȳ${‚܈ϛ]LjdMҊɕH H9sǐU@iBn*aSH06GP. {g/UŪnBvї2!U$o i IOI؜O±e[v& +ǭiZrxo(e*t/?B 6~m$;yr|^}R'xt꓃:RAn*a<:L":`SD7lSeo jko_!nWxwNs!{TnΩi2 UV!&o6o\!Lm MRYW0DeN$s Z*ۯTh qä A4!(wbͰ" }\~J2Vʠ#9Ñ_Iu>J=۝k؏v5l؟~e"vZ4nݳn 6` 07`qLnu5@M`` S.L}_]6.L bW&;\ ;LVV幻zAĦ@|B$F_g;ìtFyua /p%L0f3ΤAk8$tٙgjzfW|(iBViI`R]tv>z[-+XɇkQV4pZΧD.]R&z7.?7yejݣs=r^5q{tw{3qZ^ѕztܣsGKf=PeQɲI'45Y|d4BZ*GX $ yƨV55lߓvqLY/WƔ4٤:"9ZQNv،\V jr.':&4*J"V\]gwySŒgHVi/TjR)geJ='٥6JJR9"%T__sC sCۼ47%? {n<7_%eV&^tʃk^:V\=V\kރkZ߃4 9jrk 8&j7Q&g3<7eMv7EnMѸ)pS):7Ehh.7u­vm$XF[ޮ-\opV|F[^[qWͪ꺃/ :ABw뾃 2A/ rrHXCJx;!M` !M P`@n|(P<ζ0Ύ0ڨ˺8K88[qFUօYeܱsY֤Vybȹs6R""5vnoZB}!'[VA#!"J5'[!%vM eYe曹nf7s|3Wfn7so2\4 ?VWth^~P/A]U7^\IY,W::i.]ʺ/pi-܌tI$;[C\\geAuL*?n{^]Ajn A䇪-.xM&J[Xa). +%8 hWLCΡ]m̐ƨ㊎'X)p&x;`Lۢ.,s>GKZhI-iޖ4ђ&[|[҉[cbx: 0J:40TΣZ1>@m D!o,f'3 e*,/w?58U9?՗Y7˸]0EaErn|+1WWzvAhiB^ +.Gt 줔4^Pl9^t鲅2EPmΐu'!>dE˻&OD0٦K>) -0]R)xwEv8KpBxRKK^.XH&uI$%Q4x7R^_R.KK.%RIsYt CK;fx^ˣ.}J殝5RA>'o0%M Zz*ݞFu{zVν{֚L: Uͮ ~~R-=*i]Af OI~\C?W?.ЏЏKՏ{5E?nX,rG^8{9ıhG7 !2qAeM.eA}i{ H-=0`TRb#eMʵ+?ԬKA ]ZХtitiХ]GXM֒^S3!RIggٚT!H-MpƉ`q^%m9-`9.B a)[O4d,6e e /O-.A @ #mb)' !HSahRYSҤ5OZ^'4o8nO#khxCWvc(MpFHyq [~O5Q j ^gh{_5cD ^_ k,M~z%I>b-i8_G?J4p[yZSc`h+LarGw l0JqɄvF۟6w^G|Y4KxY5}2`]T1VM@|dW@oͺd9,"/NF6JqvEvMGF):lmTej= L=/˸.?;fOʖH*-ZР#=./T0YdVb%T 'bO}"DlؼO&u>'b}"/``N,h~0\S!'ZOiJ5V0\;˥~&JMSǬR CO7\gD.AT>!j8X >K)y6dS?Y{c@{kX‰۰RCr/M|d&3BpOz(GXZ PNz/Bz'=T;qwe 7| t]AH|qnTV*!]6]jHH䙩GX#n]ݣyC߻hJHR~HdwJM ե%\&Y&@@Z;ع$dR 4G)z\!_j5u9U?c'4Z⚡k{=C .UM3t}ЕfhŠ yB+/D^MRC2?.$M$JЉzNudK_'Hus(4_>]ۅ.ܹ op؅;wMC#{M0&ömyM*Mdg@/aER3\ULDzr} OCO^3t>!zQ<@=А;h=J33 O5`fy\+EXp_ ꮂ%sݛ+xA v:oti]q.ĺ IvytJ]BjY2fe(tɦ 2K;]wCEhLwg[,O,wi1䠆;7QbΈ5&|Z(|H 19du(N}Kmpҗ n+(je>봡aMTT./@eM* M$x*|h@%^}29s=vnzgk9 s*b9*2neŦ 9T?eFz2EPη-J%^MEVYɢpHMVt^5˶. Mkٶ-[)e$/.KkTIv%f)~ 6헍`c3ؾml`c;~XKw%sjJweqjKKvy~+'?,R,cȩ>w  b;eYl!]\u[ӈq_8I`RA2 GbY'eIlf9~*$ Ah| 9 /.<#`u{X/+/_*g[Ÿ[Y¯& zz枞ӫ/+qO_=-{zN=ozzЇk{-ZTӵ"^l /_MlR[=L12KGTmV$UV$[SlZ[6J<ZoVm¶/lm;Eӻp2ib!Tx+rCQ'q2WJ͖l8|0Z;C.Wt>CXVz`n:Z*u$ K QG3[R/G!q sI L{sV _RmùN=]ja4!ݥݹS' %0 }ì|B ~wtH04Z߹T4M]_e(k")2HPRwI2m6٦t-͚ ,H+O;Bm]V.e~.Oo]Jb]Zf]Zu)5]fu)uIuI;2K.e{{B.Z.XTu)oe]JurNM/ll/llvm!'U3u.tAZz`.*xS򭮗WRA3HM9 ]xo)\ZyAp;M1m M1:xeV f5%+{?+xA /M[Nk+te/.EE/H.ٶgu\y =T>/i+}sYfTijX#bu#Mȿl>5LwhQk MS)F@^KehpP|oyYA94`ñ$x=rC l ]'*MuI ʭ]/%]άڬڷ.H1q.羐rɍ2,La鱭tԡ E撫iPTS ås81λYTxA5_ᗢAXNٽj/OY/A|o*!Sጫf'D-!AI²*#WSC[WxiM=d_M@k 5peܤKFU騮Nbqj:VZUn:uT7ʽ8{T^P/dG(@&]rk\ "IJ.ˇ'mɩz%iu.4iV PI"+͌n Q3Kr TYJF;ĢYceVRg2åǷkomV |isc(3 VZA0#+?t$Oyx0 tȾi !&U.H sC繡]s _v > sC{ MW%?*וY"֚z o'Crwm6RRCK R$qB~>KZՔHSJ9[\%4ǖe0=J ls$Ԑ$[Cp>߉^{k>_W+ ;~V VӉivV=<=ߦii1<{i3o^޼v{v{v{_yym6E5qn-j[RZ>4NUr/MxbJqShygjׅu!hڮŏ9z5M7Skyu-w?[j[,=V|ٕwUߓxwlس3=;_={'ٙ{v{v|=;s]nK*ZRhI-ܖTђ [Ry[Rk|[cr~/\?'?I1]?\+J J}/nY쨖hW z"ԎlGD"#ΩQl"!BH앷kF"#"nХMѱ)&6EaStl~7EǦhnMѱ))'fIZI=I=|R|RO>?2x˚^5$vꁝz;}Q1|;t>}x;lql/<}\GyȲdS R |T~(hUQ_(W?+ ƺ6B]pPuP+TsEc kZc>#ᜍ-Sff{i/8|R F0sxl&ʐ|==`MsוP f;u7tVruVn躳4Z.\^]^fi vص_oGǸ^} }[bl[#|bð%s(7ٰՂ°NlؚM l y!oYr[J 5JUƙR~I-Mm劫 u75X6"m 75আ xJ75lM M[͢yhq_HVVMVHƗvbd'䣈.[f7EJQ^7޳YE-V2RϺdHct9?vCr?f|PKrG?:"3$d\b/ @"q[qa(C PJG*'N eS8g/6v0vhd'maslYڀWyf9bo9Lvm-W\Avn WSTrͰ-MJRkڠ)h\M)Ӟ|{ufz'rNgPk)iжd~ sֿmbymBsxعB9u_M< FmbN+SV|C >3'\ɉn4o(M@ > T\w2?M\tjã T uX^ZÞt60ʼn ~ЀPAiät :i60NL:;A"jrTv i&{K.AM+-zRHEǭ%o^[']1> kD^iDiD^҈҈^#J#2yFFFň7¯=M6gA]`x{8+i7{8_;OdHD`p:j'S'ZӉ|ODu8~~auﳰi7bx[r)f;DZp']~ߖT9,Ԑ _+lvql&*ǺY~ {Úr0%$p1-r%+TE̲F,؄ؘҢJfcVSl[JaX*WaoqnQlEG~mtѲ˴#Jh9I:g.u'ٱh FfT2^ĝt|U+}(FGGmQ>j_>VQ}~(5b[5UVJN4rS/l%>MրO9 5w%2|͝ӃOs9Ρ_;g`+yѺA(?6b| : \7k>}_~ᗀ,TmrJJax9|1C#+qʛ88N: p\t'q6p86xb}Sr_w|' }|B>jgH' To|Dt kbwz~-Xk޵_kگww_ߵNxJLIHY t&'<@yn+!f;5>¯o#|v>[u%HoV2¨+ 7>!Zu~Q)𷏺X~GݎQ_nm8vu=vukQߣQߣ O|J oE{OA b@\J w5y堳e>FC ߽N9ݤ:Pᓗh=REus}J)Io :l zj`!@|87Av?^q;tT/M/]и?^xijÿ->^y>??+/}GᏏ=rQÇ>$RluOM*Ω ;su$Aź #l9.ci"%~5=(,9ɨ^E RkA>_Ch%vPJ bP=X;ۥ @7Q|]&xWK&OrW ߊUe!{~m>@䳝駤l6aPoEi^RcOϱvNnD6 Tr0^VL3ȳ%ϱ(l@/W\A6R@] 25yO(ׅ\R5^><1Xy,+RuA65^roZjzSƥT7^JO0 qT!RA|5?@W_@)-@/'I,@vlb7ў%rkB^P +zo K5~I6QcuGeRETꢅ@=*"?6`\-q%@ +=O18-vd%МT(`mf8g:5jg_F*MF 1qj4순hU%~K *@,!]'7O^]֋7#LU)Wk_%1a~K:ugWƮ/ۺ 8_mU@ZK Qs>҆aTÐG >$.U\Z >3|m | @1RIEKϦވ.UXߥ)!57Yv dp<_">U/5F}}=-}*^jKHg|4S?8:~9Vqvtvg88:ΎgkYψ- 2nb}"rr[CCbGCn"x OL@l0zoCy=ߞz=Fyy8[0( =! poŭfƚm*mT|oSnS1nSTTT|oSmܦ >2|5"gy aR3|5"s3c|J ?})?{bqbQbqߋŅōE7..X!5ç~;r#K ~nu8_k+:2րם~-Xj] ? ,WςP\گP@*G IҪg[p϶KIyTo韧ͤBj^TxR׳Յ0U1CRmobN/Ym%.梄o^03VFxgvU o'? Aq-?DfBj%|HU+LjHE3r^][J ||BLL$|H$uXo~KT[_o3pK|8W%V3co [ ׈1:Gg]7;=+bLzR9cs׭u;vzu^Vn/uu;v݊]~u/Yqvtr88+8^qqvtg};voo7n[#ۗG$vPyn䊛z$$uKe䦄^*h=PC*@L289CB|+=OD~ұN VHmMZZk4Yb?r4Y$dO-v'DdSP0T $K*+숷Ր3  's'4"yß_ykHuou.WnuV7 Tr3^z@#Kb\K{LrR"˳P&t eh^z` ε!u`15+8+:rS ߽'uicTᓗV}0&!&rK\wM\⮉ 6 >!:L7A9R`DLwMj//lFۂ)PˆyZeZ;,nOL^ $@`v>tk)2*#e$q]<_]Ш/]mV ͊ѬmVjY۬DZY1BZo:)G ϐ:vQ_)Rx}i݁7oIocR]F6c jQ _zc~fЯ_ԯwկw+};E.@.ujYU4}Ym4}Fb4}UEhVeV\[.ST.T'VzFG(B#D+BB6=MaVr+V),K),t +NaϷMa"˳_P X&.h%Usn > |peV^ٖpե XiXp=o!d_3(=ʌS >!fZIӒ9_͝]@ZZ">B*ZRo.+Tnz~ƿٿ..mq5bK;Kŝ f|0+_aVv8ZHŦx#Rb<ՕSbW)18SJm-W\ʋ×SBVj=|Ag!^mX-0TKunXےj,ޖ4J,,%,,'KɒT_&Փ‰`U_‰'U_8(+ɬħMv;{W%@+R>!zQt?n 5a7]kX~{5EMRSWSM~-5E)ګ]Eګ]E]/k.Ornvv7N躺]^IGu4iV4j6u.uy.}2i^'erex7>!&vںҪW>{X)/)79eD[d>p=鞷Fbl5|L*6ŒdlSwsإ M1-H`pm%_W$b%nI(`9ϑ>30`>ON+nK"~ڐv |n|03]ih>o2g z,_C.- YlsR/r} YK|^}[PG7o7ԿuCn~C#;^?<0Mȡ_64͡3K?޲R-^ k`폻Ƿ?>?>A`܃A 0A` 0pAGhGh<D'%BNT{ TTkvsq%  7>}io}i}磴7>bOtî{ɦ^iuds`uO2ծ{3QH-\Gkr|oh懎0f懎0f0(’kUY'5{i|Btr|QQfْ&ZBK% 4oKhI-iޖВ&Z|[ DBo&촘d$/4OI.۵'kiRؤha! m+V l[m @_?>>LȜPMDJt5b9)XXF'?-O-h@Z*M O7 7nPӽA6M* toP/ܠ&ܠQ%rኒ%Ҥ"XQơ%2^S.ʒB/"azկf$G+KR;^Dfva;q4!'BGЄnWG#}Q%:tB01{gHK-^^'xd. tc{iv!|xjSJo Q$7( |MbvnomVt!kY߲4N^5RAOj# >!8>;)vU|-5Ļgߒ)qMt+k C`aI.s|;K >s]w4QtT+- ڔj||MFʤ&mYӶ~m+rVi[qwV䴭mYӶNۊK /-hǷ } .-w᥅u_ZXxia_K¬pi㥅 NZG1HӍ>{$-=cX& nC̞/K~ ="D7rK9J쥂X˂JX2Xoka~HnsMy蚋nsU%;*;EϷ}. E{yE\l]4#ohqH ! mM,?,u|PT@z]:.U?W>zP- R@L+[[x+›ۮS@L=PպF;YZ*wI%}+dsݖԾђZR-}kI%5g0oe9Sro)*(?(WYH/E ޢ]1Q=_A6G<-?8#m/q  >Op4CęS3Z9T(`Msp8 [ VDZ. r^)/) =0|{XDE^ĝ{pasŒ5 Yͥ K Y^R ظx~2paR&4 Tr:c*Ubt~>ӑ,ha!䤆,@ YBYS Wax)Y܍Y97p~`ͭPdVhŞ~暭Rd*xԻ %A 8*d x"]>lׅ:]S%(J#%)47 Ve cxBG’t$''d}u/%4BjTT߿F /DdJ%-]g4t>Omt( r>{:g4p>_n;PM\Ԑ۟9'Dś|~f֭.UoURТ~}`~~$ |B84$^a3:0&;?'dK)PJUaiy|.3NNmxcI1nycFxxb?m:~cb?~|0놈ZrN>t7Rؤ".w }сM-5īg lt6uut>! utR .UF bإF]Y$ie%%RC\B&`*g/7Fc-GH)(\rI6V۷t^*^f9[⣋oy?UFہ!5 gn8+W.<8+mQFV49ޤu)𭔞A,?tY_ ]"E|SK^{B#=/Yh< gƳ5xx>§}J>h'^>ZZu>h%A{ {}3'7>W,Y ' p"?}@^X9y~\PBtDpl2$/`! L N:\`AmA -т F ZhA|Y*hAo ÿa`0pk;6 0ᵿo[#  PҒ^!!xp ڍ(-O ( CQn q ?ޒ(x=(Wt^j<#.:nG]ERm50ū7b`Ov <&.§mkM3ր/oVM9.jIs@Ɓ q-75يY >;L=aA1!T2"-'yovKc6KG_#vM.j|5 #u7hCTDZ~P:Px=EaI);ȒLEܹ)ƯH^_Q)Ư;Y^WI%vK" cAk Nh!hbbܲx'&dL@A9'h4:ML4!)vEDQQGtnM,5s ֏ >4}c{s2#|3+7-~G߿?}Ȓ?;vvR0No)*(dKvfIZ<z^kK (W\ &v]W"=񇶮?QVPyԅ̅;H_k0i^*hC*9vyŶ%RKT7 =-wIT\Cٞo[u(:詷ުsl5[tuS6S5{u! lqd`RXiR>Lά&N(WaFFW)8_.W6G>IN5:5\X`5^EiF͖kRpQH/@_˓g-?5ebtWvU_ofLIkX(W\{l圾\\&raq6U(1=vM"Ԝ2 jl/'!y< ӢbpXcJ,_RG6h8MJm P+C.ut/]Ve']KtYI}%鲓.K]"Ua\hVMmRA~Juh >OމO')Gm6bQ$[ %+ C6ȷ\]S !8v/1\V0(BK4r-y'D Wk.U߼>T_*~Oz?.QxO ~?8"nХZrPɀ:%TwYv -ARAutPAQ{;v樨KvyP VUj2dSyJQهB]\q ';Rْy'I0VrjJ.Kw)C#{)~{Mf^}X/-K{KKKK^eRi9]["}}ԶA3Y Yn#9!c+W\~uyBt-;+'ң\"߁uyN:r(ׅXSv]mV͊ЬmVjY۬&UGYDob)fjj)/b_6ߣ ٤Bs ָg1$2|GUjFQۃS"@vҏ"(\\.U*.J˝ήk%%%c#%Ql^6Q1Ʈ77ƍ76xoo2M.xcx#x?ȶUɄ=R TrJh7%2$ؙo["KO u#@˰[5smU(eE1R-jo1ve劫?lVծ[헷vVvVվծ[[s^Xj&moK6TX$? {Bb%@+7WH(~!fPŽy Ke xGv]ؿ[ .EܠnŁEnɡШF.V.7ƫ<)~~4]'χ`2> jl}]DY5%L5X^o?|?'ե V}Můe}jn9M'Ƹ.#T} ųk"Uv} vD xw%;ՓJ+{Q"UN+_*WGGJVV3%"IiQ$#.8c02,켅>F.劔-ٮFy.2oSib6^&nCWm#zL.ݭ xKn]/evve]fjEЫ](JBv]( څR.jڅRrhdLscBV4CtD*(>{j=/K~B*SSSqO7N+N=u8u8u}}}\i_iX_۷ܒ"P#t"plI-)t}N8=ttp@^J %5 )G0lbAay1/κ\&';MNkrBird&'+MN(MNkrdbrvٿh ]osٲ*[hDږ(Ʒ4^sssӥ XAc|lFg˷%tΖogl -vetvwJA;W %3E$g5҅7UjF>cENK=R.m.EI%獳r4JFr^ -lQ2%*YH%#%Xop-B4z)B3`x/ÅCjf!8k/idЁL+]L FV4-W9NۘڅR| ŪL8+?[p/GKxY$Dp3 A.UlqXIyO)IՉ ռ'+𫗞S bD-rZƧ|Z> %._Dm>_K Aqcʍ|{TW >g>k"guqc4/5^d߫U2,WRpV?;vqwݎ]w`wu;vqw]®;wו 4Oa_nk;1b8241Yb!Fna *SsrHu& oL6Jd6>!zG[ /KHiA^Z5^:BHE緵??ڟwok~?}Kuu;v݉]w]wbuu Į;]3C#;I3 SMIJ f׏Z!C,@/ʐ|3F UJﶵ4I mcB %칹T!>۾`K򒵯N 0ז'DM+s&6]' ~WÏ2 >oό5]wauu ®vuwݍ]wa]/s#X Xn<&)^ϖHGhߵkgW#V_?zPLF9t^cX뇷K'|C]CK5> %4ܐ䚦 J㵍Owxn*˱R[$"o6oX3le]lisxʼn;_ K NLwHue7v~ۯmݶ~{҅Nu~~WW/=~+hg;_3,Wڒ/4XYKQ8NWqh*𻗮sqzST/;9uzO>K*Eiž3"(P˗\[ށ]6hiu;@vO\q ta$v,IK4!\ A1۔[\=X- o`-S=;Mvx\r2Chʫ9ѐܡ7m/-RKI VĶhXZF%%aEbEwMeZZo u.1/]V҅.҅.+·.IB3!LulJ҃"Օ=}K4R{/;+Gx4EK!s4P)-<"Bx#<I!xK6̪&/dV;~Nfɬˬj2jf$h> G%~. UjƊU◕8avlL~K;l,E3^;n7ll"vD(eI ]$Ick\E JLbƣCoŮzJ^잱/}BvߞѶN*/NԪ>6+nO  IaYĤ4)Hv%Dx,h  #%)  |ή*wL_K q_eI%iDH2)ln2CksL O(RpgZ~Wu'*d (or 7"3O}PLi/q_ ӸB?O,dfBjѮ1 : v<[bGhtV##  ;B{w~wo[#!ogvyT9>CK%2x~Ba6 k+?4.Yk,>w2X8.I*Ÿ.F >xxL8ka"/=TOA٫W?_`^U*w%lF AM!\=HMZ*hföR9R 3Ɩ6*Ÿ !5)v;.X {2;᪄K> Jʼn,{";߰=J8f5's#|V-&j%90M -[YVyVVTh-ejHu[xz-s.1\#$<<׫.}QLݫj|O K/xl Ր{íS6)%~ҥoxi?&Sly8VMuVC*?>Kޟ~hmK-QH^4BWϬWIM^t-)sa3?6 $to-ajvy.H.,[|:~hn'M ޽tLf9*QsYJ-k"KvNj}K)P˗[>!|ӷ#|B<]-I\I>fMۤk6 o2Vz*{Fw%캌];v].aםu]һJ攍Y^Lu]Rg]ӻ.)ivT_XkݵOX kݵ kݵz®뮻v݅]w]wa%®]oa4÷mOkyVj56 Tr@.۵k!b|Gfq) t74*}!F7 mtCnh_nhTtC~<|u^# Rc9jgO0O@ ԭ~ZHMFҦ}2ր5ȑ ;׾T`r   T1@+A='*s:V*e t|LR*楂fX&R~kb7zگX] kbwk*,F׮kXzQkE^kk5:,ZWW G?,(W%J+\WmgcW% ؂h Nk&nJ`kzԋLop%Bj}5i NZHRi/YOIMmJ2ũْR- dtɍgw`ΩZ\+̚kh81f2==E>T}־-XG#_w?7k M &-kO#{r {ϻ):h),*Ԏ{r8{-+?,6Ծ<]7MsԕVɻħLISD] oMs X|&<79ϖNwW7/]vTfT8ԞKͰs `CUPM3ָݍ|CʻiG҇gL|*b   JX"<@/iL/5R~Ffu1zv{+bbdaI15;n B2KZ&w-7Uj Yir3V/o|CX}CM /CW-{)j8f=4ojvTQKFԓۈfIFԒ50YЈmD/lZiiiaZ$ .pZZeRHb&+VL$+ˈ6ilFD?fѫ,zk-FhDN!5͢Yto05`um߱]kcw v?щ'w:gvj}wz=ۡ 6%hMM\2ZD0C!8 ,@^*=C*$?Yڧ"|B ~XCK'{*a\^*h?OՆ&|BG^^Oғa!2 -'$cH=ҦAvC*O a7ȇRc].#%0zVnYh<Ƴnh< gƳx&ϺxzܭC$ kћkL ʩJ I8O#\T!ҦzC*?vΟ?otΟ_Bj_S>BBT{utXʰLR387*5~ZFJ,N%ܨ/-Ű\|-#Ug|-#23,#;:xEJE380F5BjA) "[ģf =gSI~MWsk8_8kO'b5[a˛DӘ'PIBpH\.WTAKQԬAo\Q} M5(֠4@.5&@j@nd@ ] subUMhR82)3hW6'k06gBhݟ&_(POHcba( ] r@ ]#ߦ8q Z754Iib`ݜOiMM* q|@q|#k1LG#ɤI&=@p9IƑzz@#ɤj#fvvcLHq"`q@ ͏=3(oPRF.hPo _hPQzkPՠ~Ԡw55PA ڭA^ jn ڷ4ԠJA.J&C)R&^T'D dΧa"5UR|?nckg?ȤDUb[Ҽ&sG&5wHm$ /mA[  Yl^|+t+xz&˫p$S6|[lrBo98[lԼTm̱IEnɭRbVzmc?kU-"V}&L8i^_]h]w_K2u7eԿ ~ ~?oϏ'Ÿ!3i_X\}K)WaDD?R_3 ׂf䕊8.[a??^zoiZxChW0xC~XvD]!p{t(-t>QF%}K2])!P-5l1R/st>u ai T팕]v6'}\id!9Q> jHr\/6IEӴ.}qV/6Iu' _/6]JFۚ2|NAV DɇlLoAlRJT@K^"РR­铻Ƙx.M̥ؤ"iaR;^h@j6ǵkaϏϿS'm6ퟀh'/='Hbd 5ҦC> ?g7|>ư$cp)X: 3p#Xk 9kHmx!X0s>suo'Il T*,0\f(.0q3Ng+׌Sjgf [߆ V+0l.װ%mbZ ,0lۺ^"|u >-v8S!!Qׁ^K9ۨ_SpO!nj)+ >.vK__! 84}Dx%IL7»f'a"-G%h] ?m枱f;@7oh m߶?;~9큗 yCC O^fʐV/ͮRz+׷(~6@Z* mR>y]5m>_3xϸ 4q@h<63xWƳ,>6f_O|$KCV1% UtU"-e$]HL^#RC'#fpW\*Q.vw˿[Κ_%#kvR Typ6/Vʮdն" MywCмnhc74nHFǛ܏%c!~?6>%3n %#U' Ÿe$O"+Ԕ& 1"+6T ·R3cÏ/ۏ]/ \׉2*,^JΗ'/kBu-wCI;zFXwLޱnXcޱ;zz{_N%7J6N%ׄS|BSp*&J6;q*9&ǰǨ U0j`MPX68%a#6:##ltvnzC7|%| /OY, }!~__?¯G?cإ{[M䮣RHMإlOL&I49_] jJ8|Ҧ~ ԝ/>cXH/&uOT$AU^IWYҘ1,DO&ƦȖВ:ZR, :)찤v[RKfh.SВےNH&w4ɋV J |N*pƚR󼰤_q{`5sfܬAnc6 @6}l/yG2R@r3 i*nHhУ^H/-лgYtT6-݁2먌 @·8*GeDQ8*Ge^Ge  ~OCh?~m?ÿGFF(d=d54Qk$i$i$_db~l MAb c]TiJ |-uȇbB|RV*h ͐Gpaa|p G0nKZhI-iܖ4ђZx[07lb;4@Zz[G>w hݒ%u`kg}PCq\P}@q~Pse#?"8kuWF#Xϗ%Yb܉z*9t^ĝ"L,KT˖Xq2*R|{;1#[> Kg JqB~SKh!yppqp88{p88w=8/'=8OMZpssI45U@2\U _6-*6M)cs7Ɍt&nhb74nOO>Mfc]USN^@o|SXޟ>}Xl[[[ ^zqO'ôGXT! D[`M/CN9CNgƃ4N9CN9f~qH|1R \& C1r+ 1sb_bfBl^h|l_CI5Kk_Xsw|QT'9y`MUIFfO=4K=<(Wo#6>u?$.wcMIuk!Z#k8fVH|ӹm7d{Q{-=O#c%"۾XXs'Y;p2>;p2}<,kXy/yy ~hEJ^Z!Db'3+`T?>}nUU|-5=lE0Ex$UoMG&Z. &Yk'(^[u٠ų޳ۖ n?w(W\dӷ.Y&]%Le#r:(y^Rӛҳ| 4Eii7gǼ@"ѥtXH&O#K6ѮyUm]y`dKByu~!{Q)1BV.9،Webc ؖ)-(劫LclЅ>+yz M JLcM OJ>~2tM^^u]!55IƛbHi:&i H;1kU+RgҭC"=ʽ8lٗIɨgor`בtrjJ/^:G3 urAWhY"D,7*ZnU %Y8Ȧ ԰R,{ ù 9("og #%@+=YOحɪTo+Wi)=iki)t=mŞcOKһ%fRz.=t%J=lV).VilKl{xQiA6!alLF%]\'\6RxɜJt;]mU/Y[z:Kp^ɬʗJuBklf/VzzF o^*Odj!j橫|J$K"=3fTRNTlg@{E jh* N0|@QEQ*R+:|nCF*^q.8$X^СKvgwP+s0lBHm_6m] İ x7".thz' #vF.ҽR%̈́-[ B.3"KΘy%Hv='dLv' 2&),e;5E,[}*x9[j #A d!@ +mX 66iB+؀[+@ZS1V>``[v?q~dXW)xj]hAՇQ 6 d.W#nWB%r>ooR5@KWbh!ФݛZ"W/5S/R/5_TOL|R3R=RKKK/zy5&55֘֘ZcZZckkk^k)M1h stY J,N`4^k LD54^ĝuF•FFB]FBU* G‰#G#‘Ħ&)& ɼ˼f2kk%ɼ˼v2k}c^?Q(DkٞHK J OL*NqJKz\_M_Mh ݲ.QӋ3m+l벢\*Rr}-Xg/ׁq.rŠ+Q~ouqxjq_OE K.W =NdLjb4% *Gd0&G6ɵR߾>`•ƕWW W;7cq+v<~Zzzv`^M6Zì/̊ _U=@q"WAE JO D>l§ %Z*hf=?>EyQ@â^Z9ښWq +$4Z*hpH%qޒFlI%r[R+[(- Z/,^WtPT; TAzuPb\A5蠸BA}ẃҨJ|+emMbR~+e'k<kz~0ba}xPˆ\6j#{{n0bsA,cN;U-eYsS,}v)=5Œf rBdEsHO%]7J aZ AxˡՇ{"RK ]/|ܥԜÌ[kEI,40טp3WC+@uEhK;-|+&+0‚A,OuiQ{h, "9lhF3,*1q(>t`N>=]T)P-#^e*g@+.gkL/mzρ?)))뼧Nv{ʺp:q:S <iH"sn U- ~mI7_3r2h<63xm<gxg̯EgE9ՋԋԋW/:؋λeE'^GGuB`u@X>0>N^H0v{A=J@bavBfs>K n F8k]x} /tuօG^"XiEӊ`V3VZ׊`L+Z"XiEX|n)?l)5<4k [[.% @3ǵ~5_[.%~eVWnG28şH{Ic?i|ş48_(BI '̯~|68n~Hl<#ӓTwzlalXL'f<9WnY!ZJͰ˶R~L?>$Z}fTRClۨ&DJ _z+ k_^0-OD6m2M'2:UBhTZneϫ?>}A?ԾRڽ|G[Hmjb3Rs::K^}??$^&#$ ^}_J1toj+;:|E#7em榄/ڛR 1/e#IgSᓗ6}|Y';}&+2l_M_R Xค'.WJr1bYs6²6*)ScMsjÙj|3IJ8f;f^oQGIƌ68h3^c+frK7uw>X,^g9r?5jnG׋k5jT.MٖBlv@/gI^̌LнݧIq8/KӲRAY(E5 鐴>um^*PO%peiRq@`Y>u[@J0BO-,"L*ߒOjiL.U?_GX3<|u&_$ _~_/QO&_ºBs6#YC2t?KY3jW2HTJ~,W>wpq8{8v}=.}'=~|Ͽ  ~_< |x!Yu{Lj_5 (S ,> =sX8s`9{0pp™úg339nHguJPOqRO/'P4:DG6{iKzLCjѷ|,%2|lj k>YJ o-|>[>#|7Jd$X//ldR~}/5F_6`ry:i9$'jY q|B懓ARK$*p;?ɁeC|ЈP0ViTx>!i|͎VQ7/4X~o׏+¯7-~E+W ?jɾaU Qm~"eVJ)qJL`ix`%:d8%M*Mz)lypIugX%YM ߽45x:OU4ni`+*$CY|oX~Xwj,?eߐLU} |+=Ǽ'ȬYr> =rojKH&bl\*|yH?4>!&r>J᳗2 ?Da4y@h<63xm<3xW2y~>c?ߟ~A? eۀ-!~lb{};A-n-%  ]wu'B].t݉n ]w]wݶ7m/uB۟hX~K Vn'D.OU{\JMgKH{|! >߁f+'VCIR2o*pNĩeiQQq. 8S#PGr;#0#08d&G P 8B-/G |ZQv`E o?b8TJICߨfNk_+L% I'\0K>os&`_+Lk}M%m_K%IJY3h80 qť *tQ2Ch<2*h<Sxx/']$:R.c=k"ݵ]F˨eTXH$b iBkZaRk"=zyŠ5r2^&`Ix5])а&mX9Mnh:@ оu:@{;_q0|oSqo `Sq[r~'禄ï^jo lE$5l4Cc|ρoW'{pnnO_q r^ПϕyڑhihbF*#W;_A ENzk ?>}m>ݶOh mnhO_~JM4L_N [ mm~Gwohmm_BkEϥ$Kri\/4q7U(g*,r{lb%` o-8Cȹt>o >o>o}}`SSSqOnn㞺 N=u8u8u۸v?~BO 'go1OaǵI v?:^ (_^^A  ^m!+w+zOx5p;w O'<_;^ xGh<6̏3xxN:׆$_{.2Yo|81@ K᳗&Z7RТ99[[ǽu>pps­[u.hgM5dK yJO #| ωz -l|^ >o4aXɖ+^ƣrF^ć4#7!&f<\ >'ϴޫ`1y>Y5!,|uH2';.pװ3,T^ ζb )bV[.79_Kcb%Zj)csU1^0gCʆa+4lP/ɴԊV/^*h&WokXkY=^gVk#RLPAvlPL]S/1hYUڷiNYON%j3Q|5_w11V᳗h 3JΊj|Oj*ï^jlƳӔm4Y&m(HivfP6o;u tR>o B%PJ69J6!rU*ب[zJZjC kj<>RS[_6.blY_5)ZhMR-w>Bmd_;l{I [D|G Un'*ud'o(pGD!P -UPʈA}y%M j]kr]J%WjS^rjڒ &WSKq']~&.P1: U JLb,|wu3R7/4f-HsVp}Fe*s J9Ԭ0Ps(9T0j 8\c%$nwͭ#݌r-je2g7ѮUɥゅp% e-y[/ ۵-a{س]{س==a5n-8reQ&%~@ Q"-4/!H}x)4+7-~G߿?,a.o^*x9K.*7]6hq^mK(PWM]?ʶkfW#V,g|Bn|(RK/*n*kƇKHur2_l_^5sA1ϡ!.U TCc|5c2|.ơrxv4vyfh緫5EܠTvUF.-{)zXLO2Ch.!Fb"M-%Ʈ-9/ims~^|9?O9/tsO؜ޜ߰9lηڜ{̩ɲ%Rw?55Y䟚Gu܏uW*Rz-Txw4 F>lV"/j<'D[·g$Y dfƚ?~?CH<+gth]IEo ͲS{fRKZ. \f%RpL*g~ O* \>?zD&]~K)PJU`)z)-~{҅C_m+\ƋAYnA.0iKzF%]Wi:M|tJF%]qg]wB [?mB]\u$e.6i=t{/SCN=j ;GjQy1RHH Jzzz# \1RleAI1vw_]KL"w|b{+X)ULWSM1-G"~K)Ǝv5]vj @**nx&]M' i . B{E 9{1\FDqWFDI gn>׈XaD#"׈H'$}w^?)ו¦y'd_jmrJ劋,@rSj iTj,|lTPMe)Mq@ꢔ榨=I/n+?ͮ\xZ] L-WY2ޙԦq=t]aD3Ul]Nsdo x <W3Ѻч;}G{岓.|G=k=Hq.һ/t2 .æ x:]ztmEjZeoo EIqw<DŽ=4>!:n,=W>8l,˥2XWS9ssZkλqλW4]5y}M eIU{$iHFKg..f/U_JR]KnCPIi-7څ> U~]pe?h4Ѣ&Z)4IbrIhPeDq_vvy׿;kJi*qm.;ڝq.2© 2gq _i笋SYTųKѤ) W9vD/]Ͽϗm/65.J1/ȋVOOO=;'EIk2p2O8od6L̷{2`2XG5'7̷dBWSAY5h|Btr [s&"aѽT(`Sx;aJ8Zoo =v+ .5cO b]RЎK ,I"! f\!P~SK qkYm_2b-/y[kˤTOөNMc< [Q>zJ/#ӽ"OWGsH9b#6>zb/_ӄ=s1>P\zI>܋.ϸE\.ۂ#uJG#S%ɒu.ZQ4put8j%VQܞ4m#[gbj.dH; &m#Ԑ0^*hȷB߬?+9+|>x$9FRL?VyG;60DHlH 4i6_fC-͆k64lPb6N2'SN2F N2*N2? I$(.? \Nݿuѩ;:uSwtv~E | +([|au_j-s fM1NOɫO|R+*db)ƫ[˰gVb#Eܹk׎km?Uz)7Ŷ9C-ҍr(ʵ=\vji w޴)>{k`leM1)&6Ÿ)6Ÿb`S6ŸbbS ln k>qol6pK1rͤ E[(.UT_T?o[# ~ ~? =R4RskiizzzFjN#L#b^wS,lM bM)&6źbcS,ln ~5ة)35WSpj_MSSpj )XzDʺyu\*Pr--S.'iʺ]ty}m˒)k(8UjmK6QK;B+o<_X3w8Q G`5^Vx g /uF.5"?V}Adpma 1]6h!Rҷmc?"l#*?c_^`t%O6>fJ|+=hTi>g?v$;b>De']:4I%mTEWfq筿yy=o?t8,طQבSϺ? :C.qD'4KlvqᲓ.r%]l.wGqg]JJhQ+Jq+iqp VU*%[4k*;[aU3.6]Ss~AP+jJQ I)o3ZB]\q)/κI^YbMTX{#VX]9aeNk*+eO:v]h"b))ُ%ڡV%LYO.cR]74U57aZz!Wxپˠw>j*URR"mp+bqTd.KK.-^_Ғ.K]d lGiXimF&V~ s0Kr@uՃf c4tnǨ ݎ1*:Fc4tv =LMk# [iQKC݂x~);jJZ B"^Dw <9=fj*knWZkB%e|OK4R+ct<B@:TY!f,pCaXYtTխ wHM d(v;FaУ\x6Ğ/ˎb5ea\QHiA߶ ܢGZiQzFimڏ@qnJML@rw|1\Q uF]im$x nxo_p/~y <٥<<ѯӨKgx.m>Mԩ!0""ԠA j[ԠA j[@P43 ,Ѓ!'5@œx9j/M\c}$,]JV^J.N׻^r鮻etv OT#tf\tLs~LT:9_fJWQ@v>1M^ Ƹնqﭶ[m[m|o1nMj{mVV$Rw9OuMa E ϗe^㼍'mtY.+x,'>Cf3vrIfEglTexw֥ԥCȮ>'r2:yȉr]V;z\vҥNqJ&x*v{`WrU~ٲtE~ԶBEϕ UneJ~k&fo[R^ĝu)v1b]R:O| J˰![(gARCUGde\!W@(LM5`yԇ[A 9a!=qr@`dIa1OQ1Qbv&}nKktK[)-k!m8am%y|Pކc/5 M*m inU/4 7Bj?Zϖ}~^D%r7`;DoItCP%SLd.OJ녪s !vM3B|vq ͥ M|jaS\jw|ٞ0r٠fSת6|j?!>ButkHM;...K{>~KK/uC׮!on`[vyC^!G¯߄b/~$}ti\-4Vd6ZjuiTONOCjd]/o7ڧok>>a]m'}z>qxkxX`xX@῾^R/S/J^^R/J^R/ZS/J^^R/J_~<Џ ۏ;qC?~~oKhI-ߖDhI-ߖђ-ߖ4ђ:ZR[8ķ梖H_vOÑm|~ % >f)O$alږ0 rȾbQRN4tB7]& 3e UxaJ2_S=W)—T׎ iBxwn }a/:@_/ 􅎾0n_X }a| 4ӏ9:/182h6N {&*gN4&׌bbb333q((:(=X88<~Oߩw93+^m*+<xkEowD*.cMmϏ?]ڟkbϯj9 zbVTs |jAjk 5=˨ưx"rjŲ\eh^6cI/d&dVF'lb4Gl7JDԚ |8k*\pzmz-XߩORz\`MZ&6YQm,)v٨>?t@.YԂ}|R#;CrC!bCb_:QcؿPc'5KwըPQj\ jqUqUUU5z_j޸U #8_Q'5$x=/j/ߨA|F{`$ >_-Ԁ:˲֜r_ 8_xh^I ]zydy+WP"eyI^!+0\.3+xŬ/r8 MIOl@9R Ԍ2,MԊ U2m2eCPE6! ;]%5:5\\kɗkttѾpvm[ 'rԮ-9A|[߉-mk Dn62q 7u_K>QC CivHm@~Y|j%=tOx5gǫ9d`/9f;P;atBg%;;PpR;y|no߇p~G߿ex7߇pz5'o^k_R(j4{+We9Ҩ7Y yE9]M= ;RNC^w;itrŪJxS{S9vnr_ROEN슜,&^uakm*JX>˕O#58!&X g^_i93i*(?(W)RQ&ʝ `L93'"58~>yރ3O>`'|b+JQ%@$G (ZW3D Qs~~lRVCB8 qt&D!RACvxԿYcXcߩc FtQ$ԝg5@Z q:sem} J`k)7C*?7C@Eu;-'\42~w5w:. >zÇޮخhy^>v=v='nO~m׋zW˒ZEu~~W>;?|?-"j_o&'w`5h8@>t NsjT]'͐v_kuק%^;0T*חL~dI@Zjr I/.}Jg#MGOl}Ԇs]DC*iO-&w^5 &?y&@xXj`W~Mi; bjSJTV*h%[T=z`z2Wu ^-#6-Njf9Q"*nw4"˳-ʓ/x=^V5H*9)B!)T`T ] kU`7v~kݵOX kk ;[ ~K)P˷1W^Zܨߖ|Nݞ7%@ +UPŒ.,TS;%}9Vձ")diFٜaXxc&-h`sˍ8w5S3 I mvҭrڜ1rTN9mvRG5 {@Ҥe[ҤgsZ\Ww˴I[-(dW#oI<2S{#3*Gf‘W1.12/fu^C74kܳ&Z.ƴk2Ǔ|E{U^swTJ~)@8gk}qfzxCk;$_!.cuhCU 8kɗGwQے֎R3A]wXr2RH#x?1[V,єȵoCW 1c7Z>tO[Jm|^_NA >tp_B%7c$*K@?)Koƪӧ]k''!~Rmͤb tz~ >kk~{<.e de.e|^/;cjWr˃>'W8^*h|y!:tݓj \uI O'DI{p]v$%>`gۧom>>mG'}z9+e5 RO<J.;=l&kۻKzHk$ kxGixGg<zڟ9b4P~li؂Oq͢ )rxc=1OYe<|f|@-ܐCz|ؾT?lޕ@)T>!VZ`izCe?||5+ޕq_R(ߚtl'8Ô`֩lwBKI_-гA ld1-[L*¯ܮY޴X9:$|ΝSއèՍ>XXȇ)fm 0]r@!M /4TQ{lqJ汜_|P!aº7>sMNx3@ۍ'UD㑳 gHxT(`Mu@F‡ Ʒ5$nm4#T!>{)[ceo}n p~hLoV予\vN:|B?Qqsb?J8D3M~jr>+7~}گk_Xw3%~"|}UZEVMO ]·(=}6|h e`͵ӯb1@b[ 5ֻݥⅰ4f _]Q_ _2k2_g֥ 𻽺XxG-2bDk## ;V*h0ω <rSG#V"~S >!V<'&ھZ[\臃f"W)>'w8לbå mToGF!O]Զ{ic+{i- -Kkȗگjm|5Efel%rI[ZZHtfI[V7KXoSmAh&n_ oXk"~1j&(P˷dpt٠f_9JG,v@w!'57dbk_}6J׎OYk.cp6 ` X"M5@bZmS+sz +4Ȥfl90x|[l%2|[eˁa"3U!)kj`0 =Sp79^.Su&칳3\Vy)X@}H  n0;tB-Zk.[~o.]:D-t Qu^}Euvi. vBnec.. el]l<Lc~LJLbu;:Cy-2.TxlE~u|ρ_o[# ~ ~_~ $ef SlVT@F*c1:䴘.WJI7h RA'@z&,{VP+?(W( ZFea/B?gTSIOv˒NoPݯoab] R`C^J堵ow#v=ێ~#g{5Xr}-uj'7fDghKOSHCo׀pb\Ҁ}& )G@4 [*c*52ʝ KrU}P]ۡi[CBYUH'5En)Ϊn)_2nT.#Q3*5Ųm5q2sgW FHUf \ 7]<U8e"GD"P 1U>!)=#nn1 ;^ђW5yEK^^^ђW=yEK^Ѿ_UYì/̪Ysʅfю'(iᤥTޥ X)iR2?) }Ѕ~ %] }Ѕ~ %]  ݃`Ap{$+tAAރ(wn %&Q]UMLu٩)-TƍiڽTAU_[~)ɨ[N̤gEth"|+} Az\܆}.aKwK6ss}._oo>M>ܐP'qۍJxTChDҫ(M+ e; !/)΂gj;8+AQJt; & ZGzm7p^Ը]®j]UǮj`W5j`WձwWUwW5{нpq8t{8tw=t/=th R'޻ =1}4V %٭5D{> Opц?9־YE-\ܢ[SR5^*& K@x>Jlժ@vwi_.+/t卮nW ]yݮЕ']y+/tveYY6uR'0}pR'}β, /;#[בZR#/ ZZ Wylkޯ~|5ѯ~wرnXX'v++c:ccر2vXE`B@̂pK~X䳊>BjYE+^*hg!'=Ѿ{"ƞhcOhcO'j{=Ѿz"qr\_4XLy{"6:*?=fWG>ty;ntyZQKxٮol.ZH=e\@vҥ>} RzT{MU ۈ-y\]H.۵6|$ ZLƇ/5{RJVCx 5K "ݛ.g劫sd+7@Yf9^f\T<]zd[b-풅&RiCȠFwݮb\d ;N=8ouO[ ]/5&'BOf}lMWni_m9oB-; nen?]u;9lL}(WD&O K Wc{iS!u='*7m4mZ!R-A>!*fcN۲Hj"7bp4Ş*!{ = tk6,Ď)Jb/5l'7[HkK,ox7/a7:ђLVŒl%؞KZ2Q>!zYx,"haV|T.ò/6*5^f 4?oY JH#BvblF%EuupdevgFH+"/EV<ƭ_h`]m9t";J60+Wl/rwEvaJ ћUDk +d. GwOﶌ;9Nwсq']~NFU~VykxۃOoьԎo%;d9>Kń=f55˥xUjƤu[y'9xy8K5 .5hv{TSk _QXp٠޲1zI{d!\G!dPC#LJE5|cQI ?T:)P:vu@pR>KYB-֣+ۘ :F% ca2>CIA| wPZ Zj)j{.+o|-ec:4+i4%v Y-cMonɩ)9uJrꖜSSAnS:uCn_8I ^C'Y_9z50>!&nHkˡC*Nu/nTjƚ[j_Wً+O+*xԻ*UŕK۲+m-(x7"d Zlh-y4QӋR~R[dOQe荇$. Tz62N?ˤѼ4ɛKRbkolQ)9 4^,+?4_H>4DTB. Q}6;&Ka|엞+7>>Yz$:> 4oo`M QRQEg.ЇBtJK 2q,nC+e {GUh8}8_Gx(knk 0R+W+o[a|l0l?DCء.PݡvPvPv;qw ;ԁxw?>#y"yß yg?I }T[9q|)|dϞT[iר22?eR/IَL*hΤG&11p٠dR!9K!;gRȶZ"Kq;;;hbw4;wwMѺ-j}kQE-u[֢GZhQmQ,*!Jr>s٤Yr \CP"mYۇC*[((+Wʋ{dɪkve7qڑ1sekVW  DQCZQ+Q>=j}٣4y,h!pRZ6rçE'(+U4XA̓{`4| y{>ڠ#a>Qhv['ܺ'>Np '4!0'ՃU0pbCy_ij=P̐~Xqڧ?}X;ٱWU_ "a/V'wm vտ%6s{Z(m` 7b;7ĈT,ѧԀ#(Q;R= C㿼N㿤_^85/_"'-ē%/Ủ9J%P ϮmR^h,5Ӄo;avrw=)#uNTTLDHEijF mI#DF *DG H5 #P+0ZVQ);RwRAwr; QT8_hZbD?7+oZKECp"9~?hQh#5׻+~گw ~گwW}گw7_ߵoϳ ;j#J3;ò%)j=o T%~֌5v;C˝wq{Ҍ5J7sI.URG{v|==bU+!>%9KCSxYEzzYEJ9FƚKKҍ@ß'F Kkd 1@;|5oeKO ^W _h"c݈7r|:Ek>'g#}FC߇:>o߇:>#}&>ї#gj@'@axaa!RtqtǷG ututD&v)w"f8?TOԣT\*6 HSDT%fDicYL#~+t('t`P!fV[F|?QA?ڟt!U `sw?ϻo'v[\I ?T҂GV1{TlC:D|Av_ /?5=DT0NFF"haPsV*Y|E j ;pM v7LjR.i@ȥbgzKP_ihॊv=`gz?:='fm^j_~# _M|9)]@8|Ξc[X0>=[xy2#HLf DɌTJqCHmx%r(MfS~Fx|TN $n&рר ,E?yn~$8 #EvJ ҅N)N@))%tJ:t; RBN)݆@ nCo >!|,I}uWhb5x8dn->%>BYfkXGV7#wD[x|=y`'-=D \?qk:|Js[?}픐aoNWXkI$\$ \0. ^0. |/ K~/ N`sbꑒ9_bD_QK qv|{(ЫoNC#,|No. (%J3s˥:O,pnHdRj^ܱsV_o[# ~ ~_~/S_@s~8gsU8WNUYbhTi^a5p4l:.ܯ>_SN%]V"} E`.ݒ?NyAxft0nΧ]P a2VOY,,BYdY,C JH.EVEq.ЎyfM ]`56W]4][6wVSnH v < &"5͓*p_+AH%BÖ =o9.ꖫ+awܫ539d2򕌜9JFηSIF #t Zs,^^%Y|]$Y<'q']lU ]hL K7LSbbJnMXzY~x 7^MQJli 8O U[UB6h! s>!Y`b޸!5ƾbC7]9dt&_Ku7-XnFŨF~J=T;(uZ>u".Љ\wHlhW'2]62 -saø$QOX}{+zڇE~5xelvLR8]*o~؛ݗqz `O03př=3X~&7f˫YR;0* g{f{g3CApf3{ffpfgQ3Ǩ]XswZ|[V\gVrʾ@琝t1NyEm-Oܺ)7\{鷿ҏ:.j~TpkTZqåyno/tIaKlyٜJD(Q)thҴ S<(.G;hX3[́>F*VY_%g<>zmG^QN40jdMuM;^:ΣyImFV: j<,5Ҋg|Z-UY^.W)j<_g2ӝ M)7˯ C{M}`n~N.rP[v!}Ye9'Аʎ2C!E,r*\%".:رj-+Jp8RAAͬlX4!%@/vc'R>OMm܎qMM+hkn='tFMXjT'p4؂[»PK/TJ_ cV=|;WEBBfulD(˷K Ej`i J|ҍkCfOEX.Kv TwxJ1-pxҐ!cvVX2:8a2*X\AFkvyԨ>\ FWRDu>n>6DQ@u!YuP urz5j\xoqdj~8 tQN[##g xjx̺_jǰȑ]ϑW9冫QIM X"N%](65jN40ޢO`rȴ߶@ uэՏ2-ф˻ħ\:QZBi iwx"ă*O rilmzx|J@~*Ӻ|oZ1>jF)?lo Tjo2FS4MQfkIPƋ.cAMdS ~{1K:#F+nheih5[j /ޕ}V MXxm)uiOCxFl%O Hbe;rBjAq摊nyCG~<@+OU|÷:Z5Gy+0Bw85GjN Q8Q%Ŋ>Ԍ@-VÇ/5i4040p`ZvLno|9@o|?1U޸޸7> ʺ_ғ.KK.=ҿ嚸;N'~M0o0q{0qԬR=p8qw5_KOܠ.?rkᾶ+V5 ӱ/odÓ:q:qg4nCPHtfN3aR53KE1y4(uH>?ZxC o-|I˂گX*_:TjRM}N.^2UA2ޠQ TrWר~NKU`9p,jb ;tى$ r[M"smk yږ' be?D|#5l/||> O>'W؅n'§>#|B^JӃaJJzM+M$M+Ma[ 8؈cE v>%zɌIZpLŘt:|Q9`wDM?z~^JeW>#fZۇk.Gj?7'WX|Yx(gv&v$ߋ_T+%p}t}Qsq<>{ vag2 TrEN8/UD]}+UgwȞ"{)"rl=)w;c@@(7\w dChMB$I1zï¯W_o[#Wk%Q5`ǙP {+Juj_^^3!:= WoP]gv5@05ޜrDC Pk#x^5J"RQ[ԭzVV\Rj[WjحZznSj[/ǒTOq{tGK.Mv'M6n] Eܠ?%\1{?j@l|FwP5qv 4fxV=uUuUOݪUOݪn_jnS_te|eBt/]]/tI.JpetItY/]Ve&]KN.. ] BX:L u)t)6=^F,KȮ'rze;_!zmk=[4>#k=!^,{+ CKzVog TFYPBuΖ ܚ`YxwE囤vW= SI-wʫMD(hQJ^:,pRБ:4YMD"TGG>kqn؇j1HMYM5SWH\}6rENq/.%"Jd冋~"jEiE߹/jWjwY>瓤A^$iA^졜8'I!NX$iA^$iazyY"Ά٥DW=~(POׯ =q61e;7[dyȾt)uY~BtmoGq*Uy..`.PN.ȁ@vbg߱Ps%\0]H's6{e d.v'c/κyB]ܰS5Rso7(q_eʿb"]rXEWXEկX-xxgW->߫?ަ{+S\uaz,j]XO K?冞c$٠ 3(kV;Pvt%@+UƧJ%xQ-s J^:,*Ȏב}>گWʝ\^ %.. >Z{owJ+&qNUqAz\1 T?|pBM+U4#&#kUo 0.j5%@/:WV#VvưJU4aAX`YBB,Mh d XТ3~Xq`'ĒBbXǢ{&l =Ҕ-By*5ڗ+l9БT(2Or^ĝb$w|o;o嬨#{qݿ-3JMwHџ(ȨqGFo7,FF FF;2J02jadoV7|lY7umiNFaNQR}I4ro[l d']*9Y]miN{ӜTңܱ*AV֥x=9éЅNHHAv9cpid9)}؝3sRh8ۓ5*x鰐$$TVpRe1¦rEN\R[<)|"K>M(pSI:5ۧdnt*^ĝu{uiճS?S*ti1qxR٨KeQ-znUlBu ){CG^<HGޅ#/8.y9gey=ʫ)4M!X)$5BRSBBRSM!#TaYcK;Jq2mY'Ԥb*R ^__,&iSGUu) ocuϭk xe |i5s:SQ*uiQ,hށud+H.Bs*Oj R *&ARi|F[5JU"4hQ8`;r&žk̳:*xC ݫ)52`(xwEcPE?ڥ-dH( RTa'~`M|̞WOzdMXV>|jaS<}Q\خrkS{U+S[vjj B")P$ Wd禘)^MѰ)4ESRpm Ʀ)8o?d`y&(m!;5Rۚb&*)7}v١K]uh Ϭa{9X9Bx:$;A6$1/]egm {n}TRzxR١%y)ZV*tܐ3]x'Uݥ=*LSBO}jT%@/UxWGj?zzf焍~;dϊ#[ >{*X}j1_(UxוHŞT>"ɶ:.. (g_z:"ń!ODS4䜏l@(7\䱬 CrFrfrFvxܩȾܩ)EI˝NMtFr- Ըݩnô)t&Sݩv=ޜi'j6aӗv\ޛ^xzk'Nۄi{i=ipڞ8m$?KWQ ?)P:U1 ie|óGZ h` ZD+LV0o+Xh`~ck^V>/OV0|+ +h` ځߠR@͓n#&4F|]1mĄF<Ј6FLh6bЈn#hĄFLD#ۈЈmW! >;}HYMI*_’[@~ZVA^h" m'M j &QqvSt:o{ .r5bA Aꭤ*mcJV0ψm,m.Gj=G5V;|?=Kry!/Ih/|ţmV,̇&0!!a۽w!aw,8 1U=Zp{Z8 1C|Caa!~CrOSp8=3NSS85[t40k vuiyjC<@ :OoW :O-y]v<ҠH{uOG۲DlR"W/UgD }6+~%*G*rW#5#Jk .FR7[0x)vwߤnネX3|+z+j?Q7kzU>#/G転DݱVR@/Fܝg`yyvgܝg`iyy&vg;ώ2ݎyh*@3bO=R_ҎԆ;o6?ޑXo8 yp Lyp <y<q<#x<8NDh,.Y{'4Ayx:yg4rndLK7&CI\i+%MGx`^u\i'*GjZi'%LK0([ain򩒦S}ƘA(oq -)冫i줋`4dϯ1֜{9{(Vu'{aޭt*tYܐgm<hٶuw6SI;:p^дKV*"-.Ócӄ#<:gDIJu$9씽,5[CcψۣZ&Gj=Gop+`MYn,8˭{8-=-&rgzr .kHVݥ̝3E@y:E_4y'زI@ac^ĝtyzvcB|NdžRi|Fp#!U נ(U4YH[kvZIff7If7IJܳ[+iv4f +HFn4X1~C#; | |?oᏏoS#q?5 X7hݻٕ z>iN\S|vz3r弈;r5Ħ ly7EǦnMѱ)M1)WM<ٗ+dg\c%~?^gl؜z`zl #>-u/|<%#R R.LKIɈTѴHELx@K LQK)dUZfjM:_P-{bo%zaKҳ؈P`y0qlXUoT%f;:_h=L}&Q#8ۀ!r?r=2%_`Mʈ?<\[F ^(ש]M (冫CadcSdm ZiGQ0RaKh{CAҍkdx0N8Us7R2å"|yJUI; v>k?۱WcюXn;cF;ێ+ڱˎ5%O9k=ן-O߼bŸy1ψs+\=Gj͋^TTOQTj?]^\~@o*xt^W͸◖j?"RAv}JzD4֣طg3=bb^{ _>DDf!X Ԃg@| j0q"hf"}"=5j@TW_Q)PO_*Зr"ʛs|:+QfIl|rk8q}Mn1mש4͚&BvNnxw%juBoNz :ak0+ \uBoN U+ 2$} \2$ZuFyxJA{8cFDI;IxO߇.oIgpx63fπtgt3j?,+s;\Q:Ss5E5{`ݢ/N<0yTmwJ[!1؎Gf1>t{-Ro6OS`~ ˡ[)Pש}y5(ϊTEYehtEfm5';1Ezyxjxz+NyvCP@y W_*]h&"riaЃcS{lCHnhӳI 5L].R(H5S)]Ԏba =.J"խƇn5~ѭFVխƇn5~ѭFVngjǻVѭʨ8%B (X}+zdM/h&U BUtV1nhbVAhbbG1L3;bs,^ʚ=x|F|>؉XTq=R!9!Y PK7&CWi=MiMiii4}zJTTf2LeLe%STT8J0u ?ooo7q[8-{[nRԭ֫[QV+uV+u+JjnRZ_wBibƑDZIB]ܱtڶcv9taABFP++$ BBF++ B~{_13_~W_bߥ"|'Ÿ7o'xz~cXP>}yWh >z8߳RpD鴠Z26jF%5z%d2jNFQmԣ$dQKPc FX=tXyxʱS 3\B,A%%Qj=Cʫ=ۃ =Woj G+.R]/t. ]oR__R.KK.5R%O&a"zMDN&rDN&r吚'a"o&V_F{*{o{R[ގ˽Vm޶z4Xi+J㙭J*4+ WRFhhKK.-^_Ғ.K]FUxyv+{H[YH&}j=|V3 ;`M5| ?!lxH3"W/UgijɌ4#REc|}4F=ШmQۨuEnQ4FF:TjPidCQ!C%z*Q:T5PidP/ pzX8=== a@pz ==|}Rya _ك%( B#Hm4Yeo{p=p-*{*pM*p=p-*{**WٟCY~'=;˃2f8*xC u,=:E|zĕ wrY]֙r#/%$rY]֑r3/%$vYx{2>^>J>,4^>L>xO>x׀QzVwBVq"ѶX:Rˉߴil"G*љk&蹓l?fP<8ލO [ |)UDFkOe0h1k"h7WAqzig0{\q:|ێ;@;Wvo;hv<Ў;qqM =M #M `:W8-״qZXe_HBOBbZwvo;hvю+qxw~[sՕ-t8+dq>?[OKp>;w b~4>ðK~ kF |JԀFzS0SX ϵK<ܡ21^j4^.#cNIQh5~yߟO?o[#/o1>?DFᥴLCwۍOC3M1 ?>a/}k`>ݵOXk_XO_>ɯSZϘ RXzT5 C*OL?9JEԒ'MƁ;ê?p FT8p2;` zJ'M#;2׊>ψϡ؇S[i1⸿Aړ^zB2"@'KEݟHmiܗ(]g v;Ͻ6qoغwM ;`wy<(>.@Ž]*rj^)#(U4#Gj>D9-kψio ;m)̊JNdAVHW# ޹ʥ|!/\jJro9`߰]_]k_] kbwgHXmDmDmD 뽍H8pq|xljob@ ɯy״|T%*<_ޏ}lho2GR`1#f$k_|b<7DQ굿$cOX?]kcϻ kbwﭳ! 6Ҭt%SSr(.5X~vW[!WN+Y/U@/#54z wmz^Bht[B%^z[( NjCm^-O/ BC(ugYd,tSͩ`*@3b6>gho#u6'qNH+_.^A]ZB].^B] ZB]oիz8x.9s9*xt^T6h`]b]N"QnHP i u3tgukSB|^~VG{HU{5G*~EmvjJ?}/*ynZUa_k ?Ԁ7|>o-|>ˎ܎e+ٱ$;KXn;]ǎ%ٱ|ar۱v,/cA;ێxeǫ ڱX1Vo||_~7g~I;2=.X@O('I{TISTՓ:Y'IPѓ*?͈C'fZe+%BgK 롤n4X&;) c֌@Տ$`e6| )I ?h =Jn{È߽|FG2P{DCڑ}[]X3q0ݝsx7_0Lw(7QQ] JtY=`4yZcFjhN(4oG*oUJUц.c1KEU~ŢʑZp[Z1>gh;nhw;z;Z︭zZx[O?O?/? ?ZEe(PAo!V rCbKS :[sdhPeh#o<;B1_d>c1È߽kD EsFHU"Sn4Xۙə̍3ד3737^H\Ox9s3R4yi~E{7u3esk4J.^q']5j"u'7LDK*,#7}X[NqZ Gu,Oa0?(S3XVnǾ]Gݣъp{"VtV G+ъޣǹ<ݼn^.|{k94s-t`Mi5EiEiii4@z鲒.tY/](鲒.J{$]Ve} V`R*Vh|[U, B ZU*4,=5 Qk'~HV >#Fk>D0hR7T`'Sv__[z:Lzsv__ !=·tkB:tQmy%Cd2th+VEYJ$_¿)ޒkg_w~ J <-=D8S[kQյXV]z^߶׸p']xakBǔ=TaD!QH BNvjQHHyF+W>#LFfi0#3B׌P;zvkF0#3\v1#Y`;:q1vێإ5W$jwc9*(P^[}yWd&.x;vv%^ ,>tɈJ[FVJ8.zn>;lAD tZu\G*)~pt52Հ{$yZ!YsDJ"r @vn(ӥ= -J)ʄj!U K)6.5ǰ v&&aOer 7_|F`#@/2ܤ->&;ӓUFO/IgOOxz[k]Az钼Z|E~KZ^[9;㭼ەTo%+[3/N<<;Jǔ=Kd>+FR jNHul!d?k -p?1pOOubaӀ65mydxB"Ko54og[o[VpogI3rkïhq=DN( >`*> +\_>akr}}xUY%վM=ABDp+X?>c~iŸ~ 3z|b}b49/g'~ ['n}vzLΓ^ə>1{r㝙Taq",!aa|8Q>!aϘuP)ephύ IM 4@$z g b{°؞|F46t搪6xlb놿>_׷G ᯯ_k ^\im`] µA[`%Z^6^KWWë]G rfA |Ռ5!|TF_K PRT~Nvd|RgEՐ>.6WY^ZPuø98RaKGJf3Z}ƾwg >_}}}_0T0(a_a(mQL(0_ C|s6|FdCe!eɕXk [us-/:|^;_^ySU&EFIL*O`Uǔ=KO{ H6ňРFQ>z˾ E'S w>@/`ݥ:^ШKHU[ #5Ç1)o0&Q$1 0&ec{Lj0&}?I|^SWfJeo|Fn}[t `}NoH[~VHQQ0/;.Ԯ*Jx޵_+~k~[cWzMχ3 t |i8S<@$+L0̳XI$ &I@m Mtlh6 %;4ݎtt Sӵ?T S_|JhhX܊&-*GN+oa׳+pQ:Qw cqXl |j2b6c^ȃEHE r'v~wݿcwǜ:񑚻߱w=D4|x=D3:ۃψ +~L#LʯbKA/{~0"w/ n.?3D(h|~¡O_C?C?Я.HC¡pЯ;F?#uuΧz4>#j2]'{F Qf=u6akkSHtHo)T#rP¦PM7]?)D*M!I{޴f%TTr4{F`Sh)m_D]?S?$ɠM1=b x( ^J.]*Zݳp?R٥bbM[^bMۋ=m/bOۋ5m/k{EIۋ_mb P,')p_~c0)4 W:GUQuG,QU^J**8.UU[QUpT Й)W8]NwuN'Ego|ۙcg!$;3MM0/ 0a? 5֨y“'&7|#@9^Eㄷ }K~ O /;=26}A,ڻ-US>#NfP=E R TTo#5$ 8o c 8ro Wƭ0ZŭCv-|{JESl/ k)VƧJucO5eFO#e1br5Mc~tmY,GZ g:)aL,Jq+tg:Ϩy}0*vγcvvYeX3}3ï$m0r 7 y D\hh<t&B^3`СԾtP=Pl8vK 8Tȃ1c>x TK7i"Taר-4۾AСEt^1!RfIem冫 d.ճFYzxzH=kzH=5^=Rg/zJI%ZW$[7 O|F$[cy,$[B(U4S=u%ڟ0|g_G=C%rQsgY8Nu _mx8f-@(7\s2 H=/n[RczCrAS*L37]<|hdth R1ZԀ#NbG7%#\wh=ؑ.`=θkrp}[v4J ;D9S5RRBFRo\Ap(4(4')2"ͩPF:Ւ"m#pE]%2N᪡ Nԗ.=2.HK}R@hv7FiQSb=^u:)TI3oSsVMoUܝFrå w1<y߇RTǔ=*L3I~N|/܍ f=c&[.JkJgD\+WөF_5|5'~If،㌧&63pSl'qvf|ϻ'>aϻ;ڟwO?'?ߵ2|啊Zu0)U3B?wR9R,VBf NDc\[Ot r(.5 _Lh JW5nHgHWHk i i tttҕҙ@#&Fe>ض#aw{>Ě?!_ؗػ:ėv}Dt^..mmINζp[hÛpM1)Ǧk5.go@fqQJ\ [) g#sg`2{m]_kaj|>}/?;5hםNM N+=b9׵ ֝NَԼXwκNMK zP3$Zc~_ Z|Ln?ڨX#/wBН5r'8 y NĨɝN۝,U"`c_b!JgD[;z6VGRl1ڎT uxQV(ש-x|B G-TMVJԛlZ/g)aR E$)hjqHdw~Q١&M os‡A{h\s·AanP67sC[ *nUȽU1pp ­[roU ܪhU[ϙEOX?]kcϻ kbw>|~H=Ԧӏfu|njuٿOmﳇ|d+)7\ d.:γ_f\{¬ ](IPujexmݲ[,c:m 7 ~ T{"6Ri|Flk1,QJk!E~"lFO~ՖψWmi{qy\=R+^%JR7'6Dߤ+R ;@/7g4t!-IXR>44`)s!%?{4>#\.|~}BĈ_T(b ZM%K4*^#?o`[V꽹qzv8`kJ q}5|F  kHMV5(bM%s}7`IKע;9o|5Gko?}7\Q:SڥSˀʁ~ZuDb?  8vèx8Më48%+:(%O&P2CnMб `Tlz7A&Mб *6A  Fp#8NF47bˍXp ~ˍЃ`m߰]okaw888qt448pvі8.w7tqLY\s;=56ѝ\o/wn)fjj详)6EbbSIt4&ohhM&$DMbIt460CXれ𭔪OR(-5 {[XSK!m폏?]k`߭}Xk}ߧx5xrX6)8grځcΫv\偙Ws!zk=payw56ħTRĤ'e͜1A:@)Jb|R>RQH"@$=?)fy2`T)I$'A*v"+U4N~щwD(f+fF(f(fg3gٌn :kAcЫ1fjët Awc06F!õWAWWA^ŜWAWA^^ŜWA^^^*4g l`w݊RVnm`NUm$6լ}7wo`Ûp.>ؔG#|vpN-+O K{YdBd|^/a'SFU]l|)'bd.ϸP),mp1 sy*[=k/39IƜ$ڛq#y_LҶ(vGjGI3bC'}C{RY RHaSש-{^o^>hHGsPp.>!2l#)$3ArewB4k| J^hJH?Rޱ k3\i%~Q>—?/߁\'4akߣ|ީ'@ggfu R;&PREH^?)]rDt^¦Uڗ{H],ĆD ;QNԮNtƧaNNԠ#;QN԰w'??KF# &~8Y2vdH-穹ele=Xc?~NǹО@3 2],~Jh 6CrlKI ,,A&>#.,S';_&%(U4F0X9w)5}Fᥴ_z6>#񎕳|G ъREcy+4~`7kPx 0HO#)iD?! ?Ÿ~_mssu]ss`{׵= ^lnύscS (Ě3=|:T- ?HO^Y1GtSfMDi􅞱&j Ÿ]kY8\0VSp3c(ޮ)|2ID)YGjg'5>g>#Z7,0&\TTG*m#tj4/ |mwc֍,t41>Ě᧨ )A6S Xf`&!jN7+DM,  Q?JfF]&oj3@Y'_fI `Oh~XMԫQ*'vJ W.2 |xQ{WsmΧX/ҿdI.SKzKԥ=KL/]ϥm R#&@ JGGF5\ׂy3 B6(w .7*f{^/#Y5>L^Iq @G(~`'d"ۼ.D<i!w&#m BӟN${[,7埨X>o+@vhm_XluVK.jV$rv>MMF- O!b&[;A 7Klw5z_7tc` Ba"O].Y qdb[c!b;E!ʗqIwCj(7)})V]b!a٩j*V:ND+;P +PCjq+;~;bO}Eg`C ~mDMEjX)A% t?:P@lׁ_@@1({źׁ뀚:;j:;P{ >+۷c weH )bf>Krh3k"!`(LHs"~&1'~X p +ΧX_y?TЃ&[?w?-&#x*wHZhu?I(|s& qY9?{0bz!OnaNޛe"%5r4^aVO3ߩJ/XPٜ_9p|#:WbUp,PQ)mKq&2sZ(.^ܧStNkyNtz`Nq:]YNBR$HJ|#}9%]*L[}T^ׯ_/GWK9D:ΓoLc"k"k"a_a]a65LM3Dʗ$Ϣ@H=X #Ѯ]mj`'p>6EOWUqtW7~L\*ooΐ*O0$~4"#i;l5*/Ŭc]dG~v U?F}Zxۇca~v>oy磒mӶ5޴ Qb" MLONFg%t.vv傐X`;΅RYE0h#%Uʏڢ|$j2&;@LB;`h:bwu:DtӨUdѾÉN};_1?I8ꥃ&}}X/".ST0 tG)|$fD /GK!tи3:|ClYIYMyl"pNOk5*MbokO,'bϘSdK]!`ca&HHBF/VBꕽ`7/]0COG0o<WSNG;(9rKOGX8NG8FLUgԒÖC㖜z]k,\X>g5zU,~^[ύm-O%[ύmmNyw7QS+"v^Etw7t_Y)Vrtۊj.V:+Hk1:'|[pEvk]+:!U?8n9'cs)Xo9-AmzV O/iVHu'*Nq'fJQ/1ܝD |3-b^Bj }|(Z!U?c؟:;cco:;cx]aT ] ab(רf%Q?d^ŏWW5> XfO:M:ZJ]B±& ]Qz,5f,'%x y]$t 9y`Ą]-..+2ZBԲ~ǧv^\2s!U2Z.>CӅwiFRQQX0W:|g:RA|+6(Xo3Z!jA=AQg)2{aǑ/ba!x~@WHU'5GN۩K/+%3*j!?Kg/j+ Z,//Xs'K&Ǎ(רϖi AIE].}whԴ+iOW!]a7{zw>lOjVMwSyEQJFz75kh5,[:X)0.;*uXSddsiP H+ ʼ*8$ Bv>*1Z1 WVDi5x=XlTˉYH-,5$:l /';|uXYרD. F6K7 ;$^e9W"H95χUװ/-s˰fFv)R87 ubc ͩ+ "d;@vL g9)b4fxb :| 72 b9)ٮ_LGȫfCeλ.B_ޫlޖgz B*b.R~8e=0%dIC֊V$!aX]Υ5y;béYm:̴xپxO>HJby\-\4Co7TGSmF,UJRu}k^ 4pp_O/Ou8~wbbϔerN+{]S@?Q$f|Uc~oPdhF%~Dza! F ~҃fyRb m g݉V`~>h-,o6K,O _Æ;&*x($Vl-].0ES5xvmچۏm\pcn ݆ۻ w݆no.Mѡh{Ѫhehe2et2tm?.`@i!E]t?Ew.FuCtb _Ko_[/H[v$X6a߱t (U#,:ɖG!SDF緓epK]JI%92yFyMę$4:ᕘ^ @Cq*B;OR[x,Ov>zt+P)r4^uʖOB6(Ha&ަaW_b]~O3c9#n(59c݌uyZ9;Q^EzVZ^Uzդ޽nBjuk1~ 4!U)Z·yv $>KL^aRa7}ӺnY5X y<-\[DI/rkV:3H02M, /) u3+oYpFI  DKu)kI!U03Fl3q|`WTs>C}]`,!/nQRHx3iv&*|:m/>hv&j.[jq z&[f6J*ӃRSTwwcpbq#s8/~;;_#o[g^:閵VOlŽ!Go*X9PQ5Ҳ -x]3QR/#5ڃ aC9jՂ^6-bm3,Jk  x$9dݘ}^nnӜe #o,$N:ۥrc_ *¯__~;}V9 E)6qg5&S/SLLVFU9L[)RiI@zݧL' GLDg\˗hhYќDX7n"زzHmnohX/O?~~{[ۯߴ߶~ WI7nWH tHjBus>I]P9OpTx57V C]% a% ֜D֗ķ/{ICyI+K) /.{`K. vn\C]D=-*.&u wh t tnn]7s?b\]1?]]1?b\]Ѯ?b^]1GVe>/]V uvͤJ%S[gheH!]1WW]1WW]1WW]WW̿Eew0קx̭`HLy#%fc)~nk',]`_CSjX|$uO+~K[$~;ZO_Oͼ8"#@iF_[Kpdkf9q5 BDS*BT#Xր0E!d+̌$;B\MY]jk\ VeUr  `s>#a2gMΧX/)cQM1i-RR+J5ꊸ٠g^{97 M L"?F?j_q5ʵAy;4-|T_{r|vR|FIM^-.9=}IeiwYZ,$ROϲ,-YVz,RN,cYG׋21}cug%1#RaT}45S}k8*)^@\@{ hOitZ\@s hN?.9=' O0 cѓ0zzN= c cQ0rFN?NqE4LwUT,:>dKKY:i) j:-*G@&|HPF/|$z")5u_6/ԕI8꥓<;uNݪSt]CoZ) {:Lt=L&jDoz=L& XW&&rDn?U@fU@VU@WYUU_dWdUzUYB{ BW/L"^YR3Zz<3 j) gL.uA򓏳nAL-j[hlA.ѵᥓv& ZEC]M>1REkޤ[5t#h?uw?:~;+_oŸq4(Q8?o0 9N^ag1RA8 ?jOv<E$%/apw>M),ꉣCjE͉^Q˥pK&[*R^p'< kP.KCVw[ |n9?)]\06i}Gā?ds!5>MNfR>|A~| *j"P4B]Nô|4wroZ)MYC-l[OZVr{?CȯcMBt2#f7FMB[@>z3㇅=-]om;ш;+Mkxm ΧXo-v_VoHt r2j9_1}*H$-8bCC9w?O V| O0RA8F"%X~{ni:uL]xmEh2uG{.t9uaYC=uLdcK[im~om_C[i뷿m{7C~{~:&cu=co:ϱߟ~rG:wyt9G~kr9)_>kwmo][ߵ~[jwmkpd)RR+H%䥮Qס$l͊)wGP栊%ghJ $gAcjSFl#h}'@xMH\q,QvLכ׋) }2(2(u`|$ACԥZH-=ޚb[_LZ -z-rI]!QtA\VI.(%:|ږz~Uo xw#&ث>;xh^H7 Y?̈́}$0siO03xj3ahj2./7\.eUd_u9rȾ'1ygYzFEX[p]>bn1X2dise:M#15=rKgRAH XJ4~D!U7S1:=xl @OwԢ~Z)T_B^K:1®|8[ ~J恡Wi^/(%) 0od =4{t~֖h}JKW+LըJnBKL֯o.?C[V ~~Q_ (wP,a&kZiaԃ!Udz6xjHjC[|3>4Vۻ ZrY!YUS/|];EWٺ_H8R:My9_upJiQC8ۯc?c?:?Fi%%GB2bPR#ە7n| PZ=@ۢ9C[}{RmӤ*n>ļԪ>İqu>O3}Hss9|9b/Wan%'uhX/ԭ:uNNݢSԭԭ:uNNݮSԭ;utmߑ$֪o2e(WM6Ru険Tl1J6pVUx}S&3.qst>*%ߘ~4Zߎ4ڞG4ޥsH9SOEVė۠aÇz(6uMO2u?s0 B6[u> + ) + *_?)3u ]p4 K2e#7@VS?m?[6_h|p'F¨ |+&K|Ug,}8C!j^z4#QW39&)c[) AXCA#~ސ7$#q!׿/ސ4QЀO^ՐÇ~Rxgp#*pP ;4H-nohXozAA[>z^`6 fRAZ\*֭!*1~v&ܜT |QܜOc>m9{zZzhd=m=w3Y9^x˵3' ^5*B-/7%Kobٜ|U[k]jvdɉBG|$>/J>=#i<#') :A/ κ֖Z "TDL_q"Bj7~XP|U BB)LB[QDS H8"RjOFRr-osؠc+Ig|~?'?'O5b ۶ֳ2x9tLn+ս i݂-]- 6| mF?vw,Nk3?b7kΧX̀lTƜ U`))@AA YkHͪJY )LɺMxK'\ ;̜|[Gb'~!3xu >KƏ- ]TW! B (XG_KvRVhVJ4t-:| 5W%WMP-FòDp<`T 7B(%eZH0cog`r>/>0"ܜO^🽫uUt諸ww諸wݻwuݻ]ޅ%JwU ?|j{TD3| =>U=Ya鳚XX&>bҧ5i퇥ϷM椦>boߦ|O 5˹ר?/iקN7+2{ᖺ 6޲tr0kҢ8`%! 9srgYJ@L#p|7ͭ5tQ oCɒno H00K!YJ4÷z׹0t., ]й0޹0t.t Kй0~΅?OoOu2~滖N]K]KSSҮk|ҥkԵt\Kq*|Zǜ#[bnQH ;[Gj:bQqyT4#J&]hIvQΗ0X ?DqbF-.Svs>*OWIDGD47D"Yg /-'4+eR%;?- QZ೔hh!Xo^ YRtd!A@/|^6/AuT - |X | sLa7ue1vu>u]7Q;MoHu$je&e7oJˉ>#C&!YJ4܃[H_櫭S+ m_^zD6^,',)ox.mΧX2g"1IbY1w\5ovTq{ƼsjΧX>wK\`wu `X (-g`Gpdh [?5L^ ˴ۤ*n-yh!ih $;bN.aX>]˜R~\. Hgd_5 <1IU G]`ۇ 摨TGC-DG<#>Gi>=uMnyn֩[twYnynө[tꖟSC%D9t8"i#\: ]*N۞)~Vg`}aLWRI(fW|V܀w$-RA(e.= ַAIXA/t|&n}>HNOMI$g@*aG %^`koiWGyAtⲽ'Өd^eD ??1j_Q5&!gc(i`*Xi9ѯlYO)]*RI>1Bߚ}2 x,3 Be$&Z`s8U-34J4i݀:JtDJSLgFU}hJY.iS*fE >y@EZF]UD{Mkb)huSw{뎽DA:;v%{޺cOݱc;{ܱOOp7] DqZ S7 0U v|A<=y)=G;^ARXTX)-󳯍,lD!WkUa:*c'پe_C%`I}mdFL9< D 6qJ+#!AfWR6X)xR֗e8qUS m:b dߕqN(i}z S__ϟ___^˯/ K>$/>=RUij?USjD>zÿ~u<>\6]+_u_t/?S=9K#V,)I·R5-I MwΧXoC3Ẉj}+mUPN31/i[p>zOݤN |T;tbʙU1R8r{JłBO;qS=k@sYB΁yhf<2רβ_:ɢhIho'5?\QxrgZe9.jռ{N8<~Rz/=0GBBU[נ[)4K2B߸Bcڇ@|+=G"7o$R% /sΧX> Ϭ!F߸#8d ~r n S/tϰ,|QR O7ր?H(i8[[~#kbv}+-N̈e{XgJ.>]Ou)C_ R|z)kn;nz)VރTOOZG7`@P,|LZpS>V˅7vSRu \;t>ޕJ3u<ͥn2G:gj9aXP,>bpAsfԤokKcAtTEA6=#fU/Һ}aV53G2q[7wH|*ԗy` TpMYwn<5?pYħ2x Ru*,U ZҩPN#/U/FU:kH-*tX)<6QsIm:~M]d~ 嚺JƓ*#N8D@۾DJ*#YIH4:00d0e`} n*)8]=Ri$hEZ%О۬!,W)bk[A?5Q?(-J5*,I}!fu-2d)֮>IG' y\-ʭ+rˌI N.IB_'zWurTAf֠Y^ b@yQV #Q<ȖzRA|M#:|8 9NE-3^ғ|$$~h]BjU5h*sj~%A5}w#Q5F aT 0!.;iqc{@S Vv|$RrVve\K5XV_cT2s;nv\Lu.ݟTD +@‘ԤV\KU) ?ˍ>VeٷHyFW$}}i-7!gHK. W1?!.ߩ Sj,F bJ@v9xoz|IБFaiJb#~8e%-YkR~Z w fzj`ھc[׶6u[6u[w[ۺMm혱0sT!1|k^NjIB|)`#K~AE"!8s: Â"`B`~O_=,67|g"bSojU q%Pw52B,?(ר/ +t;tq<}ün`"Y[$q>z9|&)]5JfkMHY41:·01>svSF#"3~(LfH͚N>rȧX_jmۼ{'׮8*O6( B[8B1= :r>"D M2J9= Dp<c^%.p$0yݏ1˨.,'V:!x]K[Z޺1x/R ~Ƀ!% +e)|$j(Wc+&QPp>zK 0/b0|giP^d&Po^fl"ˉ.i]W ӨK~Fi]XK .ib[oHuua!)a53h渳QaUJmX)jgXלeX5`+ԧ+x {F=]QvE}]A ~vk]aO{ᎺL-.aN f]A]uivkT ,ʩ˶}%l 2}Vwê߆UN2rzUNVa5 ~ +$fH M}^hj2J_̐2BKfb4CΧX/!&os>wسwźrXUnW$oWR! :sN=(e"d=f ]7yX9q-u84c>,;wYЪ#y*vd3x/W]a8*VauX (&L i @]j,QMf&cvγDvVeh|^L5%9xnO^IfL}ʉIM5(a]k|()x/O]ڕ4,4b)ʽݧԥuIi!KdW/7\LL4%? G_ˏףaC J?а!3P aozaT_]O_j//?EϘ }v>$~jQMg[hRJt>—Yc,x1BT$R__-l>zRJ +E͛\/~p>ʅj}ӥ,%iRy$Mtl"6}oxGK ڄQxp>#uTR›iT.}i_؎;+abO'c[9 kԈx B5"pK]U/a@ճE|l\#L#qN*G"?Z Րu~X|U"6숳rIw/'@y\L|q$R)6WHׅV[j/m~֟mߵK[jϿk5*H·|$u?T 0qU%ŸEO pB~KcC Ť*f,2Bjf]>fv1;H Aq>w+Rqm9b[0u)Ġ[pYlel([Zc ;}4wqD//t(د&$]Z:sRY C¿ZZy~.L&k֯i>ӉE"N?[elaG&YZWjR>RQfsk'{4ŜO ~֯i~y[H礭_֯E[l1qf̮֞:vmpe 5K]5c3Or˳f߃Cr#߈Cq"[MRMb124([7+%b:R1q04=oQyfנDy=o^sB]8?_ Э=R5j>b…Inzq`XH>].df||gH-avo_O]-sqDK4s"{Ij J+TRh(iMF|n[p=FB 7rRk}Tz>Cce7ݩw;b0F͛zؾi^ZP?;QJ ?ШD*2J\L򗁭F;:/a(?axfOlE YzPTW@Eb>$k$]-uoWL튥]1߮Sb]1+4EܘoW,튩]1vŹ~` $|aN`R~jm~ԝ :X-ZH8饕ItZ&់Hjq ~IVJxewHu,7* `Y}pK+S :|h֪}p]*h!Nx㇊l}W/Kk Hdmv 0_˥pJ&YFR~/` 9g2Z·)LCCs>k[0גcZ{l SP~֬x\ɉ;,W5/vKͰ8 )*|4]hNsٜNޜ}4g|4MhM J):+oishW S#֓asTN^Rą, 9b6wy߃xo*x9C^u5s d= X*қD'Iq*7Hx=#BUJ.`Z)АO§[f!>K+;ҦT߰:f5_|_-.2Ь- A%;l*Wq[fuK0F7Qca/GWS#+ŏeQ{/eQM=J/~.CGu>߮6[3&u~i 2suQ~Q5j_ֈU z gaJ[Rz[I뷤֟K[zZ%m~~I؇ce;cIHgf|1ay"ce%//Yy+O+bEW-+HW~<ؑ3uGv"sՖ4tä:gvΔ9W+%nV% u*oÄ}{ڷHI4^rdJ/K;dXT;Ed{]3EUL9E9"7N9#xAAlcMð$KqZ؏RI갳9CCF5W|$Zp'|  e$^ lX2֒qظ[x`HMzkJ1y+!UA#hSt/!g#hoyAS&BRA QBSrU Q2͙bMM=}ܱ<^z8*xi mϑZ-u'x4_(W+je{]~Mdᷫrpuv Pbp5K>q\Z󐬁FeM@1hWZɠwײ,%/WE4H٥VSU+a#HDl"@M*<"(%jnI]$^|1|Tz Xj1M뵭ZiZ|-R@-{;'R\.N[ybu{y sEץOam;UߡQW]<^FcDŽl%wA_n׉l?v R/}p>/7!CC6L̀!i-?,\p>ol i9_2ۙH(|.>3hZ ?1颚 w##Lw2ϔԥ,)VdKn(j[vI屋 Aw'nb1@KHG"7sl;uDW7w`=R!- ?RE{*gZi7V?QMT\M?[r| CWW{Qr >K |\~ugx/?C/?M/?L $q)sܘLHxVꗝh2Ws>r6VJ4Ss(ˊӁJ# (Œ@m,˖ZPyYer^l )e2=N>چM뱼#.dou_"6 ARb 5S/W}2p#Sa{i\O/we$iJ]DJ 'B b/":J_`HɧB㭘Hd5Tom?)6^he!U௓X'XK~8ðn-7t>K(㇉'R%2NΧXoR97DoNGR c[5 iΧX>T~2xb{GS}$T^2ˠW2G2M zu/9eЇ{,Pzc[dpKOX ? ,RA8iD3l!Uz)ww>=hofByMBN#Qvkn[Ed[_I[?k~oWm*u˺?K&3|>"}2T7|ƘΧXo=r;C/O嚙cw/5 T_|/Z"3Y:b2ϑx'ob2MFaOҧ=)|M7_w>MѯqM ^^AFeEΓH`$-23""Z,EV _sϨDҳgQ&X ˗rAx/\{`}b*~P$V`T oeq >K |m ξ_}$~r.^7t4dIߓVSqK~f0!d<cLs(_=6RJd)АO| 01Y_%%~N/,[-|\|s3QˇRWV Z/ox5 [2 ߟMis\?oٴT?> P,a}iҪ݊4J+ { |/EΦ gyNٓc$ g3Uo}]8.Es/GWU~#+OȮ-ca90pKI uT[}Z.VJxˬZHuҡa*JJ**jtjth?x+q];0 ƹl\,wue /IeR9Ӡi #O <͠9b]y<[Wj9⯀?OHQJxSnߤOۍx]4DV+ԇr~u hw>* %aQ, #X,#j(j(S ޔnܻKͰW ((L=9?DMA-v>KO-9)EKԒwSXk8c}ڒ߰\N-)v>q 5$e-+| 3__> kjT!ylLvƔ]4l^nK"Ҟ7 =;&;nN0 fw'&;Ao?wۋ/h=aŬ$ (BrDMķ]עi^_: ƴR|]{ECaj?~o? 퇦0~Ca_~' T? *>ji XOǹlzi9"oqhi8]*2CRw +2Hn Z;f "in G/fAJn aԬ|5O,B#NˍuہvB 8܊| Yn%mtqoQQMˍR x`QZ vQlchv]||HNY.of{ΧX/|dQ*jr54yc^&W+1?W5ԪVRiv!UuUHֿ];zK=ƿ*傐J7BqZbUV oסD9&(/!);rNj7:a-6633Fc7:?efX)K!5`)АO q? B+Z׮vEpfib uuE1#.⸺^'8+fpYKs ÷Fಆ4'R~?)x ~Ҵ;X*xy;F^R@w٠"VnHDnt?0,>J;"zբua(Y^w]1~C2dL/7B -uY'@Te#YYL1[Ċ@ޓeavhLJ-agw ?$ |jw Bo |] `:O_u=U`y=Z~fuU|Htbى !^'mDRuMW:;N``:;Nu?&>@F!vsRdą{o }~Ä){oyeO+FwĿ[|$Z =?ː=R#Xc_2c__:{zznnnǺǺǺX؇S_h2Ŧc}H|O %MoaR~uBj~ٟ":c_[i{$;\Yt+u:駛*5?QIII-A޵m/Y}׀}i_﾿OwҾϾm3&W?wPnCvI,EiT=g^I*e%R|!#*{׼d׌K_橻楻5/5O5׮f.CF\7VϡU<rE,VQ7˧RP_ ~? .ɫ!K.i?C]ԅ1pAD [dtK=ʔڟ[嚌q*w ~RGR>$Dg΍KŪF %5*Ee/ù]%q83q8]E frqfJMeӆFhgbm+xm[35^nL-zFM08MAfy6E9x*a/LId'5bS0}G6Ue!7={n &H"x!Bj(bMJ8O v?˾L}m B 3t4t56fbe14SuFHʲٻyH>.eP3P\h!IBvwd|~]{]kE`AV-"0WRdE(" c]+'|p.]ɊM>(W!Gy3qn-6_t.lKZ4+ensH^"P f9|M5l !7PnP%Q|YwA~q/pZڵ{HlQ ɾv-p{T7L 7q )|@q DHO^C>B !~/g\D{C>!9b]گ~گگ_~~[hx^L Bn%@رC}noT  kUN>e;"BP1T_-jgH-eoXΧXγ5&f| _W+W+@W+@W+@} +~S]7oSw@?Մ=R4WBԢ!PyM8C#xXosܬ&.bnfb#{xRfm!Y6?\CJj)[_nz}pE.ȗυgV-䲒O܋`qKv儳]*R/mT'x#9}!%bV1@8R{EG|sEOqidT/rw)QJ%U"H$˻mANޒ,7\o6]`.~Däe.#=x2[Hᾏ߬fwO^?l/WW08zO?5=_) $'MLe${)N&U7R%$~v>z ;9lO^+֕&]jz 5]+֕aʐ ;ʰoo~~_ ? Blcĥ/K ^T^i_q㛫M ;:ߴ˫s/Z]Ej?g_g_3ؙ"ps5_iVt3"Oh!ExDGڟmSTwu梦Ќ Эgn2aSCj-f1g|3|Xf5]psUD/oseO5W2e'3ȶK'_SUDZ#_.G%z/=01Ts18o- ~ ~iPO |U%F,Wu0hF ^έϧ Ze|g\ZwA~Qq~ݮG3Rەc^RU3Nz阻z:n-syt,rDhMk $/QFS9mSJ.yf}.0(Q~2^RIus[n+6: тD sU^yj>aR #yic]eV*״Đr R; F߼C^ KO]k %w5rV;ťPۮ)ֻރ{?/Vj>jwK%,ߌG%H\Բ:ۺܼ1k0IuvWuZ.O+%fWu; W_vmyƻ/; < .Jj¤j,Q_oUI)!UrZ硥v>*uuy66?rz#VZE8:A" '6"[tyWUgl1H5FYUx=ߥp M2R:;9ƔS/Vu,դ o3ٌRKt:f1ϔ|U[#G> ?} v '+R5M5/R. LZNe6q_c +Iu B/ΧX/xXWKgv*R#%l9UoctA"VnH"["i|F4EBS +OѦ(K)R4EЌ5^v߳qh>)rKj6@|;,7|z3@dO킿,5v>zÿ;ђ~.u^v4vyF9;J Dϛ^v=X$DI)`x]2Li {$D+=b2bPU͔KRfCnKH*)@n fF''Xۓ)֏ڟw˟XS[ڟ/q6 Ҩ}c5~$Qe2E=//m'I6fR >B(ދͥP24%S)(~ǭE~!,ViN-@Hјѝ/!5GP&M$)*g{UxR2# 3#KQJx2䦐vmUdB|_Zղ][֮kWk^^a"arD)m=KbZY_c>v9K" :ϒWHz,J|U;a YH8쥍YM/(j|CpJyTE~Ӿ_^}XyE~˻7E~~EQJܔ{ܣGiEQJ{Y^(oYy/{mCyKeσ>\1&yy9a{YH(a,)VdHY%6&=gfRf*t ~}¦J_w}~վ_w⥼jf}[+݂K0pl >C%S7{V]n}ݢCЭ[u=tݪC~9v/۞ "(QqWi>5}LB6(Q x//]j×gg6T+oz˾tyo{[dKCvh)x/ܢ }Jǒ2c $aF.5CxIᗄ( /7\pti/޾.st]jk/]lOp%D8=.?b:GP庴(o'8zmz.+2wA~q,/5][ \EgZiXlopuQe.?H/G]@햠繚庌(?T$= Bo2#;y ;YLK|Y[\F&V~+\8tIrWpl+% )ܻ5R d~#F&eԥ4%=|y9(e W,r p|Տ]20G!hlK!j{ b?BW|DKW^![Wb=UϡF_sud(;+%8o&SBu TdilnfXIۣw{U{]{$g{ LPe9wQt*Too,_ΧX~>=Ǚ5# ^?{9muPV,C{tZ;%hn╍Eܐ}WnƇ.+ZHՎ51VK7wҙqw:OZcz}Z#{eHvu/7Ґ jfO]Ƈ.e\]ƥKtKq2>t.ڥ~.wۅ_Kv'+!zX)AU7ZIxVx=+@>6REv[6E_>YO_he?wS,;eSWo߄~~}ï_¯¯ /oW_~.;|2`(<j1_g? JTrB/(-rY=o %X!]vE?lmSlmS_k9P)DϗDٳ52'zD]xٯ.M6E^FEoW*{uCΗ gT˷(ʁxI }Ex2=x#Ujr,Qٮ L䕒䵺ɯߺX9TWJ4+Qv=G/{wArf6>>6?ظؼcccͫͿc46C6W K*]*YʣKcʚkB.5-HX1=]igfBՅ5v)NlkNPܒGKna_/% Lp`l Ny= ZD[#X'˙qc< zlY)K 'VȆgVBk^ٲ9l%%O<"Σ+d+^n{]2s}ˢM}")hY2D=KHmm\ĝ6gfn;0-yh| !$. >]*_JH?ïDZ3 _udy&?M]*˙t,ʲ';%*xw^Rtw5N[Vp=P٢>эDSbܡ#>-V|`?_6O]HJKHզ(gkMQ\$.NOuUmr܀M>y4~ 'V][uwl G |QK|~CxAA꒖C7 Jua!]f]DK6 Ri9ʉj%Ⱦtɖ߆kiI3ܴ n)v!3) \jar˰!.p5x.=.m x//]Z]OyNZܺTqTVۋqR%略Y)0|s]xZx~iZ;aMä*jM-B<7ΧX_pѮVKԣ$L*[aٽ^_=-xkɜkG\\]~.|lto']Qiߊ*JG{f(H޾`נ4{N1\.р4| ]p40Bmg3R5nJ:xHl&)[o6ot n$\XbT6'K  spCNt:̝o^ä:cøpJ|UEa\º(kQע0>BEaEa͢r(:JvY<$!*XicS{TǏ] !TH[ S7fχmitF]mfLq*&X5vf\S d&:q6'D[H8'4 <ârtT[)АO%ٶ4kDIyFwgmD9@ĕ aswzg?Հ_k0W=dž}L ꢖyғ@xzW%xohX/O H +ʑxIȃ-S%p-2{"bJd?Çj=ks﫹>EJ8ƺTDT.Ip cϖ0HT$3't +%iGRq-А [D/?(zmlxCMWe+5PɞvE^Ɲ%^Q0S<5 p(|9ΧX/O2ӪxZލP~@gt#!~ӏ]mEk<&Yidf_8ɘmHq6{VS{t@&LcQgz]=XikHSԇM=!zϢ0cl 1f5Ưq6 \*Rb~/X~\/;q l? RSt:+\fyk\/LNXmsRA(|z.&៦$9mq&P3kv+%c7 \ރ/.BYH 5a`ކ/ɮC#}(drEdWUd.gG=v{=4>]}:aG'(<ƨKpYTiR~.毐Z5:MVԥT =P:6}g0rJDއNmVnD'lfC6(,7\|Q]^=ٓ=kOԿI۞Ե'Ϟt>ԇ/! (;|cu;RA|YÜOI<~o;G6]z\k$(1< -r}5}J|E5khfq͢c,ڮYt|̢E5EzCCB!WC.3 gM!5:M7:RЊB3H+{$&U{~vťP) k/v=Ǘx|;w_q88e_yE0Յm! Jm R`̓Y% 7Y!\r΃$ߧ! c>¾HEΧX/ϥ)/pe(N"*(?(TV;9ÚБ]4Wc[r3*]$0?ƕ,%<Q<$Y >kh{T5s~D3;T_r./l +52JTyI&[F"VnپWU)kMq2/oZΧX~}m$بsk4lVMҪMҪIE6I6I&U$Ijxڇ6kDYNW/m QDeR> =a +%iB-C[7o_?2OxydPO'%*x9;Rcel Jr2v]&Ƕj)Yǐf;=SNzr;f;-UΗiaǷGvz~{~tTٗ.jw2Jurb..%y (C٠T"]c,0eyɊ$D`Vꆽf8_3ռI,%n[HϾ\F=^rVA|Tժ-Z ~R›mTO8ܟW8bDBwN_FR]s:[A#Ν09Lo/m((ۤ:|sX4[2 _hX$?;f]'HMG +m rA}C698oFcΧXqj߫گR | | (___~;aZrw<`p uorr#(dvE犚&\w4/7uD\NKc\P}GԮ2zP-ϗlÛd'=Nv{]ζS̏1ISq:!zXi;htTK|Uq1z^Yzh􂌎b2F/li2RA8eD3襇Կ.w>KA}Fg֕Ezßp|q7 ^*ύvQ YrVڎ+4CmRRz\$~}w>'I qwjfU94>Mw'?p, ~w>O-wWq&[Bs?TI786XMRեP6 ?k-#n`.yx.VXR~{.rr*\sy#^V6<ҳßo =Ww>9 ټlWf >KݯH9ֶ|t /АO^OB9K*Ņens%=dE{~7E"vzҊ(m=iESϚ"M0XOj3'hes knqR+2:^c8tUD͒Jci)!jJid=bޛ|IyfB皅8l<؜NfG9zq& Jr5Y\_S:Rk~OK;)ssBT|)u˔Z{J-2icJƭ7D]̹7௫!S7Ge|}WOVJx1*BozO^mc«I|+!M Wjf HOà/ax ZΥ ~s:}#V=j8Xqq74± '!fG1~uvČ= ~ZH(f m8Ί5̩gicmett٥P) >m+}4rUqN1JsD|"[Ro |q+ _W >oabx5+ z?uNBXq>xsA X)?*Y/:g̗(y)Ĉ1c|կ: ?~cq#_!vOxĂVڏmIu9 v$>K; @@X@_a\a| q ~ 155 b}7ךbka>tLղp]XּVhגٜ_ !YJ4|FHSjr~;ovutD$oD&WY/:$_9bߵ?mOeokjϿ`v1©oi;؆glc7+yl,#x/ܗ.O<~IYZF$㘥+=cZ=$*"|6Ĺk :%[zg(uf$*ZJ7P*i[ b["2ueKjfԐZնtm+%f#*85/uj Ryz2F0#:I(ˮ)7:^i=!>K}l|17?{ke#}v,"o$r=qeueqeC<9voΎKsC[?pY ǏN1G]$ NVJ4ݒt vz {t1u^;tt>w}X[_?/}N}5`y"$kr(' 0|kDIm59O^<\W?#ѡ[bzց,E8kk Xʢv],0<呇cc,6.ⷜ,S] {?K/A_tɿ=^5^5^xY"#e%_%x/ܡ .y&9<ûg$sNrxux68<=zqxI3}' ym|Ym%)t^R3fU~RSlP,7\ݢMebEc<^P/kE9o7.]~vhs6U冫I?]kmn;{ t-/AlRu o;[RAv7O߽jm%S nѣɎ?z~8ΐT}.m5ITi 7>=|h~+,Jٝ ˷_~OqIdZܞsNr9Ke_sۤ3ֆҋj(Ⱦ"iSmnM))r4E3HhS4^fHՁp+5Mo8se/yn+O)J=֔ciK])MSq!")Ÿvg8_KAd8n!Dj;͗";CG"}IJ: 24>=E84R74MF3*Yc7Қ\*jv$a$YC6(WyJ?vlץr%v,0D$\⥝!x0R] (TAR›f5CŸ?' F* ||v6 -2D3|{REh'5DTg)j| Zl?'tt'6kZ#y}Q+0|qR:|k:bߑ+;bS;m&Dж&U/Δ.\=%yR!_ NBW"W>VR5/ΧX/&🮷_>jo'$>4}Wݴu DTR3 ryL)O{&}FHI:op#> @Ƽ0$~~2yv R‹\HS^A:dMJOE#O>x\} EeDqgHUXWے qz!x)Ċ oD_v RL&!e]ؠHL{fNsa| ZIXT=$uq[WdsV! dH19wYH8H>e ~ i1Bj},~Gt>\{850<;附^bR ~Ai|i#ۡ\m9b=3TAvQˎG8^Lo~tJH1L|Uc%ˆQ'B~%:k\:_Y)uM2WRp'Y~v-wH:aȦoü%)V%#> ~f}=D >ɣKq CRp p oL)G| whiW}&.SgLu6 sO61=IU#4TY)O:gqQ:QO4D$P-`7YH-Y̙`9b{Hu^"IBk߷j%@CH Bo߄?o?QsRbZ"%x9haZ0Ax$ Bu@)1N BpFc:eiu eUIlƱ9i4/)TD>zbaE>n"B 刍Jg|͢+E㝞qd)= X0u,=`@N:9`/t|1~ŧ_g,ٯ3-i&-]8o۩KmDHu][k?kw9lߟ=^}%*xA鼤^=,bC$T;6 1kI',H tZL5&Кt]2@L;j[:*P`QH ;J%:2c:z%oy~x{|dQ\K4lL2Yk4K+ wjR?bgkv%[RC"(2F~-cf5510{ ;s 7#20X! ̘ҥpJ o5C p!\CAJn:9˻k.n/}w7=\_6n۟pȞK%x,m /eekN т`޵4ڸאZR!`s[黏s^I8ǡ@H|(rn4!UB72ٚO2 L?xgwM^Oo2b{]dcc:<,||" U>UsDI̍>;&:4ё9sHuxډ?ke|<2w%k=>ހv4N9* t/{/z^v݋ދ7ߋ{<>y2Ư;0Ư;l1~w6ƯKy6"ϏmD4;mNݝvi4;wwڝvٝPrӕд {2Dtlzu^vu%*Wم«n/%(2*EdI"&j2CSʪ\G"="0lz,z1Eh|EBSk|T4o3+fR[vCÇL#٩ȐNk*(0 `eEocݞbP0~2LƧ/5|iS>MڢQJ;3m7u_i A~+ W+n]^ۻۅTw{+L{]׊_CqW΃R6 6=nN{u:&#{mΗ,N$Rw%:00i-:ix=J7{mCxѮ޼gAAKdxRBPx!z -M9v[W]9L/*^,m_=!r!V킗v]P3}9o<͇߶r<K/A_ti'_ rqqθBX3tٗ.N,bԑ4f)*n\1A3 m|19;=+4Ѯɹo87S2[22ߵR`$tx\:F)h%`iReIk$ǥV{#X/'WD 3P>#v]2])|)4qGpNDr-I]<^RW牁Ʒю4BvZj{*K'HUU٤=%J;#Cv RE' H3>3[ڥ^a@|hTm'k"mv%F4E2|XyTu ji,q'#drEFװPUd.ȺbXј{.,). 2 ~ cCvXԥd^}Oxgg7/%tLG"{)$4uS6ղEvdrI"[u)g.#W$v&X9/) /^oGv ?!_PUUܯvtо4Ls9͞*ۥC'bY9[t٪siY7P6ˉ[tumJ0%^RSNrޟalPg_"[t˽yG{?~qGAj :31<6 •X^,4 W4C>3w|QJ̝tDs| ;!F&͝yj.҃\D | ~#n?eKHmzK9 SRJ=S(j1UA,Ӥ*|f R:奉8=?s7%s?-BdRcmLUTceu| /w O6Yd76;ʉId.= ֗b}; KJxn>i'˵Q~+T6Y&d2EN8 Uܗ.{_k<|=}Ǧmb궼D&?;TǓ3H^:hg쐪:\yxkB$qv\6׼^Wi%y|Z_jHU:Uo`l5S?Qz2i鑏+~t ?}C/:a}CEu*Nusxe?&Z`hn&HW&H4&E iwHwk9UH赍Tc3Xmb'jƱ^5*~kWH5 qq[tjQV:Q C@_'9x TJ]kZHtwqЍ%Y4{ĺfT55.uIh%i!U禮Z=TkǕ=P 𻽧,*w5#-V6K]|S޵?;bwi07oV81Lɬ7n98S7M:-]]a8`:| DBk:ϚBaԾkrK/;Odze}?~o~־?ջ󬭝'kΓ-Rγt K1>zwJ&5x(S`(Gy`?!vDC9SꥉmpEb7?KAQI}:T;,%%frLh2i,Mt书Kh_5jHl5R;G([RY 剉<@.V UgQakH=ß^ 4TqS}܌I/LiBceR>^C=RA8 %iCB?*{F5 ݆h >VMU+Mp܀CSJJ03IC 3G)F'>Kػa4LYȫ/]#lÇP-WV=3T7].ٹ=Ci`''x3c0ޏNb⥝M?Kc | Uc@,N~|1b>vepKϱ:J~s>pSjqyEO|/7'A s H8ZY23LA !jV\yUe1c5J~lEՅkb 楇KXaa<'ZHV%eDu8l[T$*4g} GU=='X 29N4f\ZI8''|ys&~@S]o߄_2 B%-N=#l'i(Mxi?o?UGC>z,#?63h-C%›Kd 'h5:¥VezqRYof20 ]Yjaa[Pa M>z۰&jH|+Ç_mV _m6O |"7(N :*V>.{j}=}J]uE^}\쎁p=fͮxLM_Mdo7# yY~}#[}KDK|IaϕZ4^j/`?|ϢSgѥ|Ϣ]gѩ|ϢSgѮ|ϢKgѩEONC6 Y)} >C11DۥPݧb}.7wZ_^:hr:qڑDTM֧q'R>biGm]unL4>c0,PJm^,>z_Mk?*53e[^O92Vqg}84vRA(|osDoW͡%ډg VJ#8sP&awT3ػ¨UcW/bo3 gJ M< 70N^zߠql`,>Bjۜ'Xo[^rNyr&CS0"a1RA(a3y>iT{Ҁu*3V_\,p /ɮrz ӥP.f VFC>,yAH8@kA~|'Fw/3OHUS_yFN/zՉ˄s*||K >fHu}~׾?wߟKԾ??|mԍs3q㜧l|m gdS*E7[6syΏ3mTc7 Ƹblz"&JÉq?0w#UaơZ'Xr\|ȽpF8qPpK ѕm ./^h7<,ϙu^j9z÷Ǐ&}1yV V Ե0 $V VX&?I/= JRaW-~M$R!`t  t uPa4Vr 1>Z.h` Bjp!-sڹ˘uFe6^'eo?d V VW?R )|u?Z }GdJ;YEj;ah;l/=>F:/ֳЖ4Ԫsg.^ 4ցR9Ĉ>'LԚfWB >=bFX#Vx&bTt|ylgcW4oNQ 1;,4^9haH9*i #`}bI!>.,bq5Z"#┟]*oS!UD3AQ>y9* ڳ߰TUkڣIѤ׸ s Ǘ}0y|A_F'>|ڂfR9i|ŔK&y|!R}?)9QB8/|͟ϗO]ó&('䓨]h6Ct.ĝfm4H5(EaT]N<٢ْ,X<9WUd.g]dE8O6݃ݓ1tIԦTJ vSr>z@j?~}~v  ?)~QI|+ (_>;:%_z_Z]KkjW헤׫1֔Xy*f@ #ɠ%j&4cyEU+ J<)p/ )޴ݛ7ݺ7mI--]{ӭ{ә{RH=ԥޛ ]/(9sɨKdfMxI-5mlK7SݙtIxBq&f!az *r AooLbW$}M+fo| -(s1^(pHEuW(:iL˕1 e`6q=( Ϩ!U|0 w >*v 14183o^_;+ JRZ1Ts⺩0fk4*Y4*w¬]2]*߽*v)޵O8bjP [Y+@v)']{njVerD_Ov5#sX܄*t]߷Utі|,Γ>GVtS+B/zR*ZK󥅂:J ЌuP-7` yaq֏p;~㰾ǁ ݝUɴSA9=*J+kɿJPcׄOi|e{rqMqxogo2,@ƂqNc kPFOf/d;(kFYqdE}O;XefI2y(Y-bR`WE8 Y:ߞmeۆuwlBcl$*&4N;b͌z'_+` 9[o( }@ C !gqh7}`ǝuij" '%ni5ە ДW+P.:Z?b6ÿ87Z͉/#?>KPڑn @췣p !߁wc+(c U31)yg[c6QaW7GdGEX~q?PV f-huh>S!8K%NK%N%N^q(NqZǞz5r~)b|b%lHР I5m [$@-_'g?Ϻڟ/l?#"c'+goߋ+B-{ Lkϰ\kU-:z?67\[^&ߖcDv~:S(D,^w׆dv\QfnvבvRC\~־Qozz Bja Ro譓Ao־־҃$6M@m jGm j$P9 &oPV!8yhkk@!P!geC a?Am ۰ӆ{{6m #su1Z) F?b@3Jk{tѿȮUd^w8/z&|Hy& ;|`{q5~k  !Һn.{{!yiא* i=ACC+FhGVG1(Fb:xh -FXԢ-M6 䝭X<o+eC׎xC[X8Cޡ8 bCp(zp(PI'wq0)Y=ERqm% 2wd@gucJy󬣟{7ڀg6"{ټpq~3j*5{'utޓκN:=l“κN:JIg]'Ax}9 U$,~=tǍZ/ Y/n.V¶DxC[>\MF3SՈNB#DUޮZr:Ttoy=+gG[펇@k R խg ]n:|'7iGQ4 jGC=ʄZ+y4+w]>jHCR6aW>Ү% >U>WD@t4JEsՓ:(kFxa Z/Iebk+*V¶Dڹl|rzkŕkŕWw_+|zrWTl29×{V¶Da Z+olA>~i?VdZw-↶6r$ ;bO,>nU/D eYq57+Zq33eKBǒ\m AgaMBkqgFQt}A38;n#{,HC|Kv{QC!hH&t7zzֆ,o|pvAM6-٩zx.B8;:qql k ͎X ҹ{`ࢳ 3zg+UϘ 3fϰ' &AN sXs"@OmLV{Ca΢w 4L5E̯ClVNܞC ǺWPjFWx@#k蒳 !w˜/#e=iĺ2Zވ+˾`zT`X"?E~r"]":S++VB5gWё7*a$VQup}V찊N-#IbkiԲvO9&|LI7":b^H3k VN J{8WKBY{5+s{:| ³=ae}ړQ&0*}huV.>gq:zv '[a :+YM{B—54{XqMp5ϚY0 s2[e.홟3ŽV\W% p`/7#yf)^HF9v?)-X2yIVez&|X׿>K}RtJWUuMQݲ{XEk_'V֮,NmKpjnO(%|9n}$]MƵWFVT@xQ_JG%IpEۼz3Qr§p[EXzVCv+,.l|+g+eZy6ʳuHN{č8О6?$wv$XE ~|:ڲc!y$A l :I\1ͨ54;ڮAufJCl⅄v{T\?IpMf-᠓[o/$|V#(<#lAWxg+<#(<[!T|~yؙ?$XLiW|'屽:Pᖵf*cB J[*>>$EmAiGQjR): Oq'4xEhOXg4;۠^6DmwJ(o`_ G6,hLB6@ :+5bIr~ZCC9+¿;ꃢ>)A}8Wq;wvW/g0a 7|EgX#ΖtӦq=?HEX_w?O z_w?OO zo{z6?l[6z=[EMW`zM}[/?ʾMeEǏ8uǏSW+S?~߽o8!)}DC\[S+DH_ L?Ax@/6Lӿg3Px& x @ n(<3PxƷGe*6棲M'l:M'l&ݭ*FT6_*DXQk2'_n䈋noV{q][|w䣢7|Bwc>Z#[\܍}Y ɥWbi,ݍ?9ݘ~#|~o߻.^P3^P@{AxA 55}_Pz9! #ڥ BYAW"!ņHYkhV -*̌ 3Q ~fPF_Qa; }T񎂊s[r7POfТۑ uoa獫> *:zD_rqu5>lW7y<4yC+`nN;)Ϣh緣qxF_W)zҫ;7yD/@; ~5"#r\& ^EVQ(**ʻ ɨ~~JCSQ, ~enַ/sbܬ޿WQsd*ZtWQ4VQ}VQ鸊`-=yY{ AgP?9<{ҥ9ۣ~s7P?wqMvV6_{-Lc+ :+p_sЕ^+hrhZs7lt3Y=/Y1`x-{C7~4&vv/ v~_<7< 5x`8?_GsOAF6xZ$VC{O=X}b>mo./ezN&|+e~l mN|Z0C ,w2G"=PprZCC2gWB(P+ eW7B_߲O/|#|>!|zӏ 7i;=} e-N7kKq׺YkhwWIs$FԲ'Hl8{Qx%W$k s. ²oxObkx!sy]tVZCKKX\'#Ѭ8|__ |prvٝz{m?0iK;Ӗ0*̊ 3Ϻ=m)u7~)zހFWޠ{{z7}_ zWs??w߿BǑѽeᆿ>47|B o{#9OjE)0ՅznLUR6dWb7E;bjI%~Lf\z]fбM81X:8ZZ_.sL<~(֋=$/;NV@6N.:zKR ^|hD/Vh>m%7Iy%alo+$<72"{(msn{J`{6_}=^I7 ZC3#ׄobW߬`=nZ7HcE&Π^(-Z8p N -'C?U=^Hq:>( 2/v27V }m/ |e,'\0:8g}yagШ7tX5=,@=taY셄Yr-@\\H1{!96r>Ep1pxM?O𔳭*ggm"r՝ō뼄G!8`}yTQA{kCdTĚt D. +[_m9~}7 v謰u8C4NdJgq:~sp.:zF5BgZ8%cBQk5N="|_(2&W+ | ;k5H̺ }uq/:+ #.w<5 x'\t+ʳqk.<<+T#>+ƕpg?: ASzj^1 :؏3v.7:#t_:#|F>#|~3_7|yˏ __~/_~ ^yWŕGޕg#Ȼ<WyWŕGp(HۚyhҰpFUFE 9:j=Tۏ޷ rtfmV.mcX :$NsRH?c㪅nE`Yd$\-?о?s=\뾹~`''0O |~]~|Т\w@<x8dZ>w3&|iܒnDgpE=X8PIVH=nco~ >Pd/fP%΂#B tgpZ\[O[As 7]xBwT칊'g/&_+d $k ЎZ\? ?O(ϯ3?+(-G-Ze[H:YG-{ph,PoK6tX¢2#nU޽N1 ^+- `-ްKNV@^&óhq/f`ߑ$+Al)-mFz hGC;.ED^=g 6藽؅_΢66.Sdl j5PC!a(  a(? \C!R[MZa].Mx)ݙ^x16'ċ-0nxiG)bڢ o%dbt綪^vD큩& &uv4JjC{[w)lT})z~_N.ڒ =kr-{_CNu]!@]=)KgpE+}uuǭ߽~a vLlo6_U'VmH heE C;i=CZ}mC^p{mxQ` / (u~Mo{Q0Έ"_r b-^ُ":.E^zfo]dQ2C[ՖՖC[h˸2m}Ijǣϯ#Fǣ5xsqO6tP1˜X6D}2VF9C.VdrZ mT0Jgc>k8AˑEnzVؑn @@滁qm @2q9̯ d^Ojz7Caakh\h\ s s _ n s+fFbs #HBY |0u'\^|QofXWpMԝU2Z!K[q 0u\;-f9 FY˞ЖvzG#Ayq\5k|YuLy83Gg-G9{auyt543]yVqw\yW}WŕGpgWŕGW}e_A?K}AW}}e_Qe_ٷ!߲Z9Cc@ gpޗ\8OkWmEX ]BJ~?Akq"'^#K$J'W+$ MGw/_ ߚ;|EW{qMǍjDZiwɞOmtV>4v>kKrB§54NXo'&'7~2:V؝$=<ŵf8=:+_/GG ##?~V:߄ʳp~mLVVHLAf*MhkK ϝ0*{݃ _v)5kBLyOlr=$D9PY I6n,حgEX/'Dc6!(D)Uo)KϗymhjUvj;2X?@n6dm^vH֞\hnXU.{`d4_?dYk TQ#qI7,nq=?6: +InI(Iڿ$IQvGI$IQ>I(I$I ";TYYղ=.k6WhL:3v/d fsWJDI$4P+I$i5JDI(I[ R>ÿL~qjm%hAIk"36dvQtnåYL&hv:n5vY9.{r55AEXo!g;c׈j gt.8݌:WtƕQ\ڿ? rWfsWfrܕy{d_peoٳ:ѕk'|_n~/y cZ1X%̙䋳k ιP\g6;qw V6DAV2Њυ%sG0#Qd#uZ} ӽ4j:Tiѥ\C!Zz+k M{½p/[^6p/[w/[ ֻe >#|z/O^§>#|B  ƅq!Bp!ݸw!ݸ.\H2.@@xρֻ8l<@@c WÁffh ~N62A;Ζr}itBy^H! {ׄϯ0 +<(<  #(<3|/§Jݏƣ !GNC.@ |{ԵQtTP{e3Mz>/A^n@ ЌuP-CC>B Fn߲7`21r.:H`߲nZ'v, [[60jɻ1n`ƸɳQ Lp L_G#|E?+ g UXBʸ*..K(J P%TxǘAWB&dYa.ۢt \MZ{EXާa1?[A~F+nlzlԳvx6/]5kǀ>t\Rߒ@}O=0ۜS u/$|r1j}oN43gqE?ͬof!S^dE Z,8-iLĭ tM1sgm8qpN:F!PČ碋v'*V*L4^?ɪaC2d``YAʮɞـ5>@rBŸY;É R@L;vOІ~10Io3>fEX|{b/~ޟ߱ {b?n![N{>Oԧe_ybGtV8\glA\)k=+9LRf`~L90Zp2Zpin`\ó@shKsfuv$CDB,\h[Q&̪c Z/5 ''CI$9[![` :|5 990q, 99q,{/O s` 90q;69@sN#vHh;dk;dBv8v8m^7%^Oы^9zY?zQɃK57:z#gV0ٞ9CeL,ZN \vQ|~{c3>}{{x!@drf/ |?p|l>&W+`SdEXoE' NIhe4}kd4}Jo_ks~>kvhv fBف_aa~ - T(<£( #<9GQx[x]yV󞊕GߕqQ\y]yWƕG2eʣʳ#<Axz{G@xH{G OY g/YMQbv4!J#ZQbȌx7 C{; xC3}`[&eپ].2Xp0P@ UtcsЉy<`cy, 汴g[{b+y<`xyly ̇m+ҹS~;-Lۤ^nh[VoM$[Z^/_0!sCPx Xd55` @Q0_jַksm/~H9VIYaJ'.Qkh|3fMP̆恨%񋞾MU ^jZͣQNVVPLOf|72B)W, a ,suS20`YXENŵkSw4Ug,hhĕs`s`@#n_@#Z8Xp#ֻ aaa{=l}ag5>3Hr gj\3S{.:ϥJf2/~ro_.<Ǩ;vf-N^I?w` gm|z/qwZ}n_n_q"ܾ{zm m=o4 ڞ= ڞ7ok{h]h{^߶u/jWvO[;JЄ/f~NJАw\N* M6$žbwb~1u )b[ҵ;Zpo&|>|}۞ R6aWjOw-XK(B "nh˱WA@u{vshskY (,t(Ѹ^qg%_׀OOOk^p >5O%,<`I]RTmj{T{K’:ڳ%,ԾT7 a~Ԛx7@o Un*5ch*:%<5>g^wҢKᙯk)g"MY7ZǏSGE+}LG?~G߲3unqvS8u;N=u-7L|I6e-Sֳ0~h+> fa;pN㙺p㝺.7㝺;k"4d1kb4d)5d) Y5d1 Y4e3Qx |L D(<3Qx}? kcF ZlI3klC&2֞J,eS]wjk3ᔮ6x=ǃ&6Eѕ A݆8ֈ1 Y15~&W+$|ڃ& ^&Ak|נk5hk5h45p 5*qE#Z Gǡg<^82n!xT\(2\u7c][ًQazZ ?>K:a(uf-B&+?biM$O)i{?+IZt x|N6 i͜S<*cHkmIKV8hbHk {Zimoe'vrB— -Yl`k[ {G-GBÑnEyOEXo`C[?셄wujYqqOXu= 2'|o_Rc(:Z#|qc. :ݭQVo`Ꭓ0C/_}&{rPEFpػ.ᐖkRS.=&b$ _V[(paELh6:mD"&.t=lzq%$eKB@S<2v^}޽wOVJ>DxzE[r+,FR>񒑵{X~0u=©[ :V9uCM]kqaUOa5uwLti(<ƒ^} x{`Ogok.wO?{?tWOV96j < k1>00^ظ,9<`YPamڋ̬54+n*vqE$Vv"'H$!=kNA]z3âir$[ aqׄ?_ٟ( eQ'|ewBٟ([??ޟcO!+;|?Gytyp? 6&.W754mW*t'hwQ k {^g$x17{*ʶQeGeu)T6B^@ee[eۨlF٧W'>+?QO(->#_#!g-|N 1*澜 YtVk<0<vyK1YPGWwhX|H~#'M:6{@. txxK tCΣxyO<ܾtCսPҋk·{wJκ0pVoF@u/G. fp/:8$%M%Z!ᯬ5xΒ\\t__!srCrYpe>dP=.WP]Ykh2c(]h7_դzn[{E[6_-_zQ\t/Zoҭgy۝ P)Ӗn}-/s!;ׄO[O[O[=mu]ݤM6/w\\=)x.\n]\VYaW*qzjQ\!]tِDCZ+ϥ9,nu)k䡴V8Yd+PkWxGPxBa~Qx_tp`s JVb)`{tV8\g r 7Ro5|s>©8d}`\oቅsgVxl]T\ty(2?Y$?xMzg)N]LeEvC;-  "$%I~$AIW䏒$?J$ɷ$;~\ I?d[t¨EOK(Zkxr~X~7!eu)6EhۺzC[ϑ|Q5~R/$|Z\kB؇@:\`ܷ#κEXokTWe_Q}E}d~d_QK=<p=LOԢMz9&ҬG;eP?[nP\q_mLlJznطJe⏜ª3}Cv%j^e.EX~4:ZI[qt-Fk5~@5Aff4!ʤR˿ߤ󙜭ڃ)݌VCݻ4܏fˡv8JzG/\J7Jeac ne# uשn iR+Zm0_:_:)7|P5Q@5{$UW5{`u JU Tlߪ<\}((#%FGH|~DR\ clWv¼*e0h*]([@R\ .G]ˑ|-G|-Gr-G .Gˑg⽢ UV x𖞉|-YkvDU -8&zՆOj Qovz \˶OC&!Yv$_QmK7 ߣyD`G^DgR[F[vY{0Bq[+ PzK-=VI` \+Wgr)Ur~ B};wcJr;1N֭z};W ̾J_f_Kw qApAݸwAݸ.\P2.Wx6 WxgWx6 Wxyi&!E!MC!ţ^&xHC zV`v\(A^^ju$G%HUV/@+`L¨֚1=>ƀ9 s`5=srPܞ90FNuY,[{u*6:@{N^hN4PW'DӥbTǥb=.{]*RUl~UQ*t(9 QXeJAO/|3(5=%WxazV\z{ao_?{a޿]mllx=ؘ-t_KZ gu8ݷmItM}MatMa„Sxw o„S~3 dFP>u2Iy%ohƧkm?e(eK{|pC[;!P uu:~8!6NW;ٓ " it3"wnWpmEX\I~( P` `s(XP FH24NX/͍u1(|@zq8ٽ{q Y}J{% `Fo3j8ugiާno0u{m4 'XiS^hՋxN@ 'c<,U^w: m8 gs?Խ Z官RpM=w6j Zׄtp~JfaRЌ:":TtN[az ,f +P,c{0;f%hB[xRy^"IVDtj]VX._px}DxEYh݉l3:jĿvmX˩Teč4_ ɌR6aTPJ҆WC/llJrB` : 8;`={lEj[`=%c8Fi=-c26k=jG/نEa>X`_Q2 :ܢ`\iAOVH3B+W >LBNlQ{-E׆6%kR¨콞t~m&W+ճvzzOrߋ+"Mb ̵ē?Kg—Ca!KVKDuEX R{}^&W+$3~cG]:Wu]jY+ W\B_E-(&gyL6׭Z~e)t[#,LdžҳN<䪕2zur\\O!ᯬBO@Y(<3Px+<Wx @#/| — |F7|^O`CEZތB`Uok*պ)  Y2~OS-AQ{x|4o̠[P 0|su v 9j-)yL!.:+ $GЉD{Iu D 4AXo w]uM%.-| ]N<l9R{4u,:z7__W{t|c;==]t >GeB\wѝEX0[ F]܄=&1%Wt\1mA7V?^(eD>tPj/Y{`Sq N]~.eN]ƩK8uSq5^7ps4Z4>GX#*9 \t)t*='tʼz?jCnH.<,f>gx.Q0 l=̇ha}'}z{ofW h74!ʤ**2lun&w^FD\2H#"H$b*-E[H$ˊH$vڭ[ j3Cq( P }Bq(Bߡ8C =o#'|*Ztyۈ'&|^ek MY\ )hC66$ )jCjCڐ66;jCڐ~kCze8j &мGmGKwWt f8YU הY\weua}8˟z e EIguUec&2K\sDr{I3/AޖҺ,?\=m%hH;Ixq9"g^8jc%" ;* cힵ!<7ւ,P\e 7 6m[;^y"Ȅ$h;wk(uCvp/ mY1黿 [+4"" قM>ҹ'< MФ='4sE Ͳ R m58uB[ԫ_zkR+Nj8Z5'u_z^'ߓڼAQҝlI>?f&j)S0qph?#ZQk`3zwж|#72wDOw/ | UtKVvy{R4aOIrK$G;Z{o0.EP\Wƫg};Ў2+cpel [q+x+c{4P&Jx$BJx%i$yHDI(I[~~&# Uv9l=o**::rV1Fg*k|y{N{/q[.ƻR6Pt} /y ւ,! #K&/:c5@NpyN'rhmj! AzˉϿYǜvU^ezEqfolˣ^KKzab~ T^Х^KQ/́y`S-i[@ k CQiJxFlǿ%#@ZOVFDGk, -j 9r~;BÈ u̠̻fq?j7V|n9آ : { V>6sRO O =),8)ҒsRxRXxRX'U*JJDPW T*&** BXFrgۿ[dNcn ,w8-w Ut/?§ ~/~cfWـ7.7\o~K~+lwU\)R"p1xm>ZX‹@B @ $&Vq0 +<QxF(< 0  Uhaa,snW4!bSL%yC+>jLmHλc UFMζȻ lpw`7y7Mqg& ߛ눿n#f܂_^G|AG͸p FG_[0Ԅ'Rs/ԊԖʙ}4wB?RS:Y,,i%//٧W$T?@ǫ~WT?U?O U?@ OV?a,e_Ÿ̢ Y4rf\+,1rf1DyAtc2thgLQ`DyA D_Qw!\y6<<W•ޕp噸лl\yW^y+eQ+kV7~e/>o-知eܧEv2 VNֻa_5&| EAY d팔1|c?^2qJŸĞxJR+W U_{H*#KSl®2i1gA`/d+4k !dhэ܀=]O{[^N<%[J$ϛ{֬~R 4P'O@} q.>% %lGw_ޡQ&dX̫;[ajHѶ4$g\*S/oh3Cq( P }Bq(Bߡ8C_C/k:{VL9Iujd t:+ %|d[r~彋+o/< [ Nìp9 [x_ݾNûak" }MzK0KMʼn0D8vÉDpO)|q,d:ޠR-S\KT#jH˫ ْ3bD {H8 p=dOC^j  ZL {lt*\a6I$ MQK?fhGAT']7yCPr>CqϏq͏y͏-PZ/c`G@-k~k~5?Z/c]cX @ʁ_V AQiYy`ʦ/J x7L$T>x3zwt}Nώ.wt`G;:;pGݣ,=}?qU":f߁8vWюxg:)JАxC׃ٮن5֞8NCI{' ؑz]C!>CqO ľ}MyM }M )A8%)/(OCn^.<Ѕ\xo &t³-,2Su$ٖeJؖWˊ9ڿ4|jVv%"-s[!iIQ¦DA SR0WrdlhFFWfKKÂ>fGڗnQKڗlPWiX;"im MkSӚfӗSꜦ5nZImZnZ-_[? o9{r+j[ZnZnZnkke\nYnr+r+˭]IP\e]z4˓dSYuc"'u=N #F'h?%F(eO-1bK, sxK-ch .:+!]jvurqEwO?{?;|{aO&R:FNb}$Ęy=[dO$cO<3Msl3{)5R6dUҮCBgR?=og?h7彰cS[օ;Y}>䅝z///CT;B§5ǻ\TzNv|Hk!ׄM'+Hޠ)Joc%7h >MP, _R Y!ץKRtץ!Ktu]Jl'.e.lgh Yo _z.ǽ\3H ]mSzt/(3Z)ۢU_>hQ¿4;mwL-i7n"miQtLYϿPBo+]mɸb4>yޑf&Lw}kXK^~рw.IwDQYdO5B0YjgaW@F@Ч^\Aj7PX &5 b} Ÿb]Cb]C1X_CAPk(o?eЖh }j˺BW[-te]mBh˽енRKB-HBq~EW[nW(uít^K=XJ:G5BO)Dk:B_:'UlC`;1Ǩá+U@:|8xs!|Җ :OY{W/3.}z\z~ZCtפkR5kR55tMjrMj&5fRjRgtB{ݞjrl^@1^m{ݞj䡨=JSM=DBk(k(5r | \Ck( PDj_aGSK'-ֻV DgttV)+$sdU+Bq(zBk(k( Bߡ B;ϬP7IY8+gBqV&3+:o : ʷӠNSvSS:9SQکqCq ;'4NԂ;NNS ԽNSN0ŭu(h}GV::$@yNJ-"Y@ :Xؼccc_̙aȑ:}R}^IPFRB1VFz‹V4&WLMcn#Ao)ʹrjtt^~PP"x:R!_rB"ˁtiM5E.BrM!5EHME4^l\"d'u_k;ܯp6k\~0xݯpqe|,KmA'H\%T!H-4YۥMX[ib-VM5_S$M#Sl)vgbw~Ottޚs7QxKje2|-'Yʹ&Q$Er٤nZ|%iq~d1idº0&xZgl 5Z;mlVe̓>C 8Lwp(ơ$J%n%1Jq*sD`MSGRa5+"\)ִ+95[OM3 5F J$y)=4 ./p%Tj|BL{ȇ. t CS|5?.G PD{LU`Ltp )<ZR3F꼞y # >7S]鿝hm? RA>3w-(DY2oH)V%(i8|7j¾j.o(  篦RJJ/ \%Uf_Vuj_%kUt&hGXk}M:}y6&5 7Ѓ7Г7@O@@{y=y==$YYQ|H*j&=$y=$}=$Y`MVih4ĉM漧ihiyOCНؤhQ굟4\ ~6];HTЀFqo8tu]⡻CwuoooֽZZhhh7@]_ӭO+ڇ`S.&5}5Y~yx ^KK%xK%x%&^/<5}<7;yeR;r-8H[x(ߕO#UsY(~CleJo0UAPHDEOMhҦ+bgyWX`~< 1~D7s9/s|׳' s >]?VqaU*ßza.6Bb:qa]*p0xqs6gʶRohW75Ԧd<#ʘ+yγ쏝y ? ?~o3_|G0fI*ތ8R~ӄ\]jj(4MekRKc/Uwڧ(xM ~?;a T {\p&p㿽\^*/w]Z}Ivk8?/\Pi4i&2OC2MC54i4yiHF_X' h.E#i͉WFRE\fJmx ʆ'PH2< * B Oj"ÓU.ÓZ$#<)x b@4e<ಡV>!3w34BJ.@wvT>!TUm6D9b%>T>4>Cglz)))"5bb*bsNfa`LVMn P#IhvJ)>J"SvtB/8Hx_tlScwjO= ]K7C4Epv ?:uzk|k!!>އp!BKjMSan~OWdO== ?٥K#GAuQ[,ͽ wJDd |  uw>yy=ω<ҍDP_Rfo?4gVZaGKj24MKjSQqfJ‡7ES;.N qk2yq^0J~ zϒG[V^kJ } }oᯏ_!gu.ߢ^`ʷºulS֤ ATt͸]<Ͽy;A04Xdh^n$憡yW y=p [RC#$ȌAՐl "\<~W(MZx*.[(RʁtFM w"pS M!RM 1%)ʧ=\\kO7]]-쭑;!UߖJ&Z;$Jt]c<| L( L2$Q0x+ qzZƗ5 ~RA>?N9.&|RࢹLݚ:-1zX0;0-LǐIsM7,&+. H-'68߳+iR Z*hGX#.wMO;|BLv->kl=|IKO6lX waʧO6OؘT! ~RER d{_e4 >J#B8R 7qq Q*hGXg W~h]A0|Bd>}W 8a?x'*n,笇-ˮ ~R𝨲i7Utq["(/FH=.B;o!~a)|?t+UF<-X%]n$alI0]*ZW>;a5e;XXZh8\t%Ώ&UoJk"}/~ϱ .5—L·zr+UīEw}~^?m~~WlaI7r(GX H'[qAv.caq+9QηJ,n SեVmJMť} dެ^K4C͐4ISCS4M1h~ʪjs;i |Je%7nM53 )MGX z5 MCSWS+4z5 M1BSWS+4)=*ͣbݣbX<*=*bݣbX<*{THKc, v|Bpr"q$ Ke[iC"(dq\yW,xh/Zoo(mXR?3}o㸧0k0w5w3}8a/bfSM)Y"sS ZjF_V|(<`|Z82WCSջT\el&]mR[S2%7z9Wo0J1kߞ..9}ۉ|B4S؈KyqX.5'JTjj_lj'f9o#դh:RC'"YX(m٭TBzg&jrK~RkR~U᫚]B_TЀ|_eo9m"?* x~ee'DvWT{*ߣIW+=hkBc'BN!V>![MGg"Yȉ 8XqnrC--4twc8tC"M@9)鉇_,,A0IeKVDfQ\Zd.yAn3QUurJ/Yl>J.Z\Y-*&]ЎTYjM|glϷӇTBkTm H-4&(jqKmdgԔ̅ߞ -π3^Di;b) '2E7 #d.Uyelx%I=5U?n8 AjhiCl٪K(~R5ǣDPB(VBE U8ǔΎ0-FCzs F˸IJ}KĥK䡄J.eP^Pٗ|U$Lǐiu=P0Ǣ4''!H-=OΦdôPTӥ6J,QaZ]]:K*w~F+έ@h\tO6)7-7ֻJ }ϝ Ln'm "yr'ͤ~qb؆W|5< 'yu,Nbs|hja ե|@#/6ĊXeP}UW}+(<6B#Y| 9囦 *k!g²碌}Z 6aT1i c`c`<=6c`_c`$~~&~GeWs% ~K/w AL?ZA q[o#tjX5` ʁFGjh.o# ^*9?1|-'v@R?DB9Lľ /e٦9a%<;OSC{x<<: #<;OSޝ3~M#+v_c&_Ćk"Yxl'3mj%FHjGX6i %hL/'FMy7XnM1)sS̻)7䦘輦i𷺬 .j$VRP!E~gT+.+ͥuzp&~y6,SA(V'd⩑&yȇlH+R2ne=iSOB'Tھ{䞴''mI{Ҿzdў'wO ?~?s| S 'ij{j|x] ˸.krH;4- azd+=0o ^`PɛD^+zQJMR ~}t?%,VTX>KJ5HNk w+4]K5:*Bn n6~T6>$F] _KMR#.C.$0Zv jsXǕow,i yy:yZ:.yf3ӫ<睜]?o2W`C(RAΫT-?$3gqB"V.q.nMQ);qSnr7E؉MQ) 7Ey7EfQYTcmESj :|̢.OGߟfY^,ۭ-~5j_t@?GX[MjywɝgܝqyywƝgܝgryƻ <;ϸ;O3 <;ϸ;3w9ȲW2dxex<3jًM-C,{>^Vnon/nn/}Y0Ӿ?/便BpԾw?AbjDt̶?TD|$.H1kRŵ5lWFTK)W@,K8Y< wyO\#7^_k /@B|y *qv;Fg5DGG=G,| CWe#6q`f9iu|5)T1$j}xE&G*,`~)f9,CvAk'2)rPB恰x l⁰y lˁОU%GE$? u0m2Q(2>"iL=)c1Iz@4AeYk E*h9z dLvIvًoڎ7eZilnʼneҞ0'ǧhꋧ8' ̖)2j pK1FXՓꢞ77zwOԓ򦞔Փ枔#Vmfʠ5̦ $O ^F^dfS073fXRcL^@dG?mb| mu˥Ix'H=o`q6]ٴ*a6-|R{M{4.WY{?>y,Yt\:Z6D*w% _֝d5t ֿ]Ӿ#$CK@dXF9_V@b ŖKeacn}l?|mZJ嫤kB8|[zBJ|Z$Os0<&Woh "D1>ݶPTrAJ5{x/UCi$q$;6a:.H6X\5crהt)VU*[/Ix›BW`eQÜ|)ryڬZb]PU*qb$eZb]\p)/C"7H8D Zhf E*v=<:Gtͺ¤ XGXo^^S.{%QU>\ ~? >k.#=ڇ~2Z5ڇ~2Z틁 {R*iFm.7)D6W,k=i58gؓ޲/#'ŕJ͆[+u啺JJ͆[+5n-6ZR2<[6#tO+uV=@闦sdL2nE/<=w.ΫTGc٭EAh| 9~XC&qThZ*%P5E×vZiZ=b 0K:Gb)"zd_9s b#$ĪA_R8/|AJ)E r7`~j~ p'5@ISQ44\а)MZP[4vĊX9pUrHrɜ4N検~eNyEن/O&4I>7]vǏTLeV^P"[ը$ҀesQ)r Id.k;>/rH(i9cc5>.Xkb$.;gSCeT/Xn5TEX8!K+6΋| L Ʃ[ۥC#|0+N3*a#\##xj%G&^ۣ~n~=rWCPxbP:X-$z[ʷZITkiOmJT>tTBw*T>tTBw*_tS*k 8WVQjN"F>ť6lJM?ғ/zOL5LL-LL510101{b<1e=15*OL=1݇9&0aD>Ld>Ll>LabWܧJ}j }j>_}j>Bw*9ԾT u_eϺĺtI/l|wq|,yCX4>fGO|8G/K?^zk(!)JW`Kw?ؑ]! ]58E"^}ukulX_Ay=hKMƺRT0Gu7#S)o+wqDtS#:B:r )J.t;.!{P$QA h| U3H\R,&9a zQx3+Z ?d3V _aȳ4@W''R~w'i \V1}'lBF1>>>4w gi(W+x5bȇ^1EhŎ?\bo_Vw O0=3-CS4MrrWa (1,>4 N(vեkiM(Rg$)DfA Rf-!^֓(D>XA&¤ J5v\0DGK/Ym7a| #j6S %: #p\_}pߟ}}po'}/ȿ]nߵDM! ê Ry*KdM$uxX3BvLم2nE>,*n6sMf| d 㠦&Uț{S !9>&G3-CKpؔR~QMZ#wcULx\;TV.(WdpqIU9ϵ$ ZdRcȤƾ;ѦNTw}wɝhs'w'܉&w}u"ӥWklzk-JV*hK5}瀂(RpzrڇE7>].TŤ ktE|57F5BVjyL*:w3!KV54BXS:#_]~&80DUO_ 9'dDSSd#S_gsxlx=*z)Q!>QQ .5lYJ3jiUx.Q׸[ikR>,oyV̛'0hS᳼y+͓Da%as;Oӝ;yy;q<<<;q@g3иg3h3 4h 4xH\Zj>*y8ZjrjK&-NfjgˣFlA"|7fB45Ap;T5("Yfl(Zs&R`Y|F5;Lq׌RcQ5B0']y =---ГЃBoBOBZ'q%_PqI(C6kn$>JqL 8 ֲ0|U yh[)U,+W-f]J >X[RlBJ.ʁ`Yc:?mFJ.Wd.E?vuБ-N HmGRU 1/Ks4Y-UV?6n9A-g2W..C:)|\T˥e/kv!A؍hbW2]+V{x&tTOnwxyjJ;EzAjYhLG\uvG*縩JeT1\ KGM]mOoi2 vg6ka| *"=_2>KD5 Eҳ~q>oB4PYvV*t_yy8Nԟ|I͗ԛVÉ<p\MdPNpJR҂yѰ&Z8,vcMhr,WˍF*T,@q>4hbIR)@@#|2C2MV3A0mS|2C|'`KmlgS3|SI,55(cv/3k2H5b/ȽDRvk`$;&ȠWH6ń]cx AzT`DC8w8;p!5+FJ傕\b e0la΄䵈8T3ܹM̩4vu#V/W]=zh':n(;ߴt!!ƹkEH&!LZiGT&jYS S Vk=@0@  vv)5aP$wS@45Y __3'G1RߕM҄`!n0h=ZZjK21*|YMav5+?6m΍WASUY H8Jkl6L[iGp"> Ql ָ?6uTDƗyECL%t#"6xpCQV1 E- '+4fQJρ3s?TrAJyE4`VX#&Ec =9y;cD6h| cq(ȿ0 $DDYyE،¢b܈Ibآ+4]-*K%dkPQ6o$4>^1\mq!D{>J2w7>@s&Gn ɍ~ Yr)l Sp܌QRL8GX#^1{M˳51)ȡ͑}4B|- OkL%|r2$9n$.w%lNUq)! r,W#KCSoq$°pQAҪG-msz=T<,wO{Űk?x|Vb*}tOv͹yγhKե|I-A/VK WƂi  # ۥְW+툨T-߅juj\i| ]8fS~N49´!>& ƺx无E}q; (| =ôYӤ QatKe޳{Ap!8=#U5CJeUʥ~@xGXo-'c'hY7[lR>En _4jjԢ7?Ҹ ۖ@ GTvh٥6Y\V# Ig9& A=4>; K-ަ׸GX#\K2|G\` FlpS2|랭J&40`=T<7~~߸ﷻ7~߸/~8O'vO'g'g剳_ 2Q[LSt! %+;<畽@}X"YJuߝyӹo;Oy:wt> >RJJJ++GX#8t;CCE GX 86;<_XO839Ey:M!ܷ]Ƶ/]Ot.'_emv'̚*M,~CzxXi|BTRb9=Y*i;E`'"j˄le i| O1(W5al ~U|ϻ緵??ڟwok~ɵ?ߵ/[Bb*e +ۮ!T0il2fiT py(YUb4ly0-@1ìzuV-KmaVV*hͪ.db~c~e_͚>lM 1z%9ޭ3!80,%70M% QT \N]fM.rVT*9(Rd#裾dBZ~}Ec~4$fH-SOљ&E y1;j>ћ jӠ0G Ijl{J {4/M q$Ywx7rl; 0T/xP\zwytj?H\*Q6CΖCHT ] ׾YW* ~Ҏ}E4K\G=h*ZH|Uĵ_]k?q헻+~/wq8')cǒX} %yOa-c-I6]qS)27E(wSnMQhA яΎE'-'f@vPY bo\jbE(Ǎ|w>?{p ; )E*hT^#Ö0^{f8;o{h˸I iRKȟcŅLWtV>OUqz-AFw,~KSwSY<:2K %tqRbv \H-$řHu#WS !cpS@ ZV+_Dx kr /&]'.^$:.ʳ.{(R؝aT0*kT0*f5*f=+FbTl fڷ61ɁhoATSbUOd0.Ut7")VᦨۛBn1)ƲoMQpSM1һ) uBbf{b2[KqMfK+mT!H5FCl EO:VA`JZ gh-FV֢|uIW+V4\/wʵ__kp헻 վ\7z~/\]gCFrcKQ@- ~R>ݍ2r(`iӥV6 0 GXx1gBh%vP JU*ٝ<ُ&1 B"V.q]ocY2iy^|3bVg¬pe^uMfo(24\)jhj)O_4E|Ҟo50V=߁{>!hϗa=ʴF{Qi7k7kek枧:jǎ@9JM_yxKSBˁkM g㦘Gb] o4z ռ^iC$> Ro_"n=GXcS{V$uSYбk==u+^/JyHt+b5BZ PI"b[GCHUL`u=a>"4mP uu+xS J _ >[]> J>Av|GY|,Y,8GeIAtVUʃ*SַB=˸I~~xĺJGxW*2l;R5r9xd$;>Of]5蒺,hO( ^q藢Kn=ʡ5] ^tV@XWcU^;^cU^[5x[a32f6#Yn7#@S eWSWL[3L]˴_SWL[-L]˴5.Fb!2aia0Dk0DZ"5Df"# _P@?.M5鷚;×X_MTRoAIkz>x{>xX?ANYH%vWn䩻k7AXPˇ `Hv(:ʅt1#Kg#ȫ$tH[yrT:b d*1Ƶz̰zz11_ VEqXa ^tynB'N't1τ0= Lhn;iJ.V*hMQBK, ^-੮? P{|<oj.!Kn2''7Ŗ%H.&l1jZSHRP4E7;4Eq+_gsM8JiI{7ʧdRcKS%dW t9.M=!@HcCd?bk˸.!.6L @RuA9W<Jp"tu+g -d]RN]^ TХؕ*¥'EL3B"ۼӆ1dRh(L[)ScZV*V-a#YUc'+=!j.5ʭFZh|5%j ?0ùO+ŭr;xjf_-Y6Ξ! 5$^}b@A߹i2];+S$h|PKclB0],$.uu5]g.RNjͮ>%BMS#C㿓zNeܤK~K FONj*Keb#x/R?OtR^R.KK.%R%c%c5c6]|s^HP1;$NJ&cQkp0G5k- - w{ w }1kaaI'*'&]T!;N#L˸.ɺ<ΑWB]݋ЃW)w%/55oI҃IrT(p)纶L5}hVU{~A+"dϡ qxս2ɠa(ьi])}`,Mv^Ie 岅b]LmwF-oQ\?bUP@u^Dirz̶FR85t) Ib*l4)ql JצqQ]5cpot=iKt ~RCJe'4ۤ avD*)b%Ͱ Z|q|P:Rqaaoŏx7" yND֗R ΫԑmS_ъ4\$٤խuŏպn[[-V 'ujT.=OyG$WxoK)RA˵>gb?\nIx$t8C8OUi)t |hs9?O#y$jUQj?Th6eR?~~W |5'~MP+LP;LP5A0A0A8Ae UY{K.2^͛󾬽&koI;QOI~Y{?1V{={{y =I$E=IIUBJt[$Ո=jУ¥t]JӒޣRKi^PEGK.Wz%\6ONWp$d<jJd, FvRgpM|5\#zy$xgQ}/Hd'^y'"^M+/.18_n7A'IQ8R|) %ɋd#d6;wG-Ϣ1-rW[^b]P4M6뒳O4f!;-Tg/p.'B]/"K<]ɭhM&﹍EJ.(:R3LZ\e t6q9o}WV^E0*W5UVVH6j${.s\xXf]ۘt^fH]-K^GH-B..=K=_O>*5طtyNFoaS8u.'Rv?i''Vi{뎻7J&@LxP_Ӌ0kSriS./"~{"< TХ9eq^P"t%˔"[yK[wqvW:ŕ~ŕwjwqwqV_wqȦ8K^:H}(e*t+P:RɣqD^B"tA+q_T2XesJ]zUA뒳z\;jNyJa)C) ^jNyMpxFey9p5]$tyRyfVǁqE;\D(6`b&yn5٪6åEŝ;vyKVwjWZܭjnUݭVHn[jw'H&%){> Aʡ&R >3ɇjw=?f(X#~#diP~$kK(>$1qK@b&v ?d[q->2kaXH"եR񩉍*UfokϞ:yctO(RATV _\7+h15t68݄ :,&קju( TAh| _S#a]j\Tf.Yڧx2(Jr#b-Kd56>L:H_kmrbቌ =Bfˆnc| ća% Vw͍1?-;4DŽ5~NSf`/zbAx٥eoc]{ OֽE$'j3OEmBbLbowqoio-v{-]okq۷>~o_]|쿑Jj窥V1Hqּ30[KgF[6AǂiVęySD>JK<:Oy$uuBB$<\T+Ls?ē?&]|47e͛g$L.5־oj\jI}ܔ>m6лI]fT+z~o\̵_]k?s׻~گگ!|j ` YAaЌDتI>(yޡ4+PfJRt`FK7Lb3k]$l&۴8vuWcd!Ln5cch<=cch<{ H[K]#V~*&Pl</>ڔ2E[@lDM,Oh2B|xʢ4h"\Y{-ҕFWs\WeZ选\ ~c<ˋAgL|3 _}>,+53b 7. +4riR3>jfWq(5o2>STm]^t En"DՆr, ~@+?;Sݩվ񁘡nkG(&UJ\4z4UĆx#Vt^ o:J&ىEW֝Q&٦KqStnv5$SMѨ)>ov7EhBЮP @BBx @PVULjRyʜH7X*e e /\ R]ݭ:wݪݪrܭݭ:wݪjpܭ[}??o }?xͯ#̯3̯_k xͯ:^ b~:x~<{~m<_=_ϯ_'ϯ_Rg.:l k/?n 0Y;d>Ϥ"1]c߬ׯ| aa0_a0@@a /:AIckEv|pHD|{cj<K7|k;߻-Y>Ko K& &)G{3| @N'G'Lݥz6'OO[`qqy]z -lD΋}(RʁKxne67'o4kFc~m4vhFpހuw^LrlRViϤ)EbX 0$$Hxv[&U@K/p,-.s&ONNThNR>ßC&;`U:c~%.4wA= ꑮA=Mz{P%Ѡ.5} Pn -[i[VhW6h/> _x88~84 rͺo>hgN 6iOOD$1 zifdśJ0 !9[)S${LJt\a@ܰ=al?7} e@دP}R}R}q׸>i>i#'=oao!$[j{X3bko13-z݃H {^ioQ3-j~-nivӫl/LMXf9d,"5#zf3BHQtF m~"53!LVś򡩿H?;j?Q:PsJ= 5:OC힆 OCvOCPPiS>V?X6^, -5yZr$}///s}NH^r #/RѺ ;WWT*udі1N4CtuހtmObI87*ﲟCyJ>+O)i-鲽\p7&]։ih|#q#,#,cB.ΫT,oK[3gQ\͖ m..'~?otmtu9LUo]mz:RMCXVYVo]`oX7v]}h||99b9b|###!u!`N>J Z a-U{(V:sJAԎ=ԹP#k@tK0U̢h\AfEl.+O*8ԿxT(V.(WNd],2EWҝ`#٦\f7lCb"@nJ,Q]Ef{9߷\`sEzd'7$#`]P`u^_[M+ˇ w 6X|:I"Avu(&].'P{.{Bꮵ&]C@!He ̪Vsހ;KjVdVxIVKbV*߂Fl 4Y^MqvL-ӫkd-yeCSt[wOl|67)ݤ5/ƈp5jQ;A\ΫTY#Y8D Ah)@%}H0)"# 鱓'\́R-R2jSCO65Kca{Y-,h9[ĘVzl痩"E6-}k%^cBXBo{XgͲq6s JaVMӸ.JJla!|FjsWqXc_[WGW= MQlu^lŴ: H -= G5ݯ ayKK.(_lt)RX^le'e[Y^֥'֥{zO%z枾~~񞾹{zO{ztmGȹ[ ێ| *o;$.nd\jmc%ǹ@%)bW%Qj%.MeS3D"9| ALT! D8!+^+r+^+r'6ݦ(}TF.)W8prB/y*}ij_m 51\Ϋɫ~;**o*|󪼿W/<(f)/Av/<(f)/Az'x#~+QiW8Ҏ0Ҷ0ڸty]D*_Aέ)G:LLaS2W̉Q5o0d!LmdRe&B=3 (RU?1z5>Z3ckP 4>|99PjwT4 <:K=_JMݥ}oo[#?υ?'ʹ$Z a @"?;2!Hfn|K0fp5c1 Yʻ3|rd rMXc/åVfYJ"ap.$d^&kԐvc)OOd6wߜB5k8ȁf#h.i/q`K~1VwjhɡYJ Z>%n x_]}"ٞ&Gr*zI4H6(Mn.zK\l BJ&@T{6z@KMå+"K_$#Lv8myu-.kU 7\)Uv(]9^\ȸIsרWTs2OU9'8lLzP@@^>9C&UӠ[k#V/8mH'p#ڔ"AJ%+cӱzy B"V>1O$tYI%myHBJ&@LsMa/%d.)P*hnWvċ7ϲoZ4>!D?`^4BiotT?n[# | |?#fZ#t#t:xu:a#.+貃.z鲂.#^ ݺ{]@Y{<[ɪ, -GhjJjyJIJ ,z )NV*hFqZ4ZV&VGuVGɣպFxZ_z.[RT)g_zK$ى/ϷTl:ou.>@P9=@TK*5P3y}⸆h Da| zDZ ᳛GjikG-ʲ}hBF&-ڝ~^ |<X犥0Z?>E?$G;|;A|-4YCLjϱL9V[i$N7Hnd1&$urhvҁ8.KZXySs?#*_h| ?D;P4>ybK=V*hF_.??nYz)Ծh''Y _V:pRŶ?nlmܶ?;m~ b_ ׷Gᯟ\*_#¹nOtq/&\Wӥ*| IO׾_T%Qt~I\jPMWzվ%_([bڞ$zR>eKR=RAar?ߵ+~&]j_]k?sw׻+~گO 0ʵ_گV_o\kkDK]6Ņ4X?;E2wc QYX#ů[9 BtVI_TϚbڟ(IZ7T+~~1voo7 3 1 3 2nWְەu.EvK+ݮA+e\+eJFnJ+M]YnWxݮH2#̐XtO _JgAV0xjO"o:{jR Z:pSh˥Fl:#DaWGز@>/$M+9٧p#_*}#P:R]*(P׾ۥFH۠+\ |e*V&;o.m 4R $ߴ@k?N#X9sQ9F鹫gBJ($u}-~L+ooo^e^U^{Vyy6[~ӸZ?ڪR/?nψk,2/Ƹ :h9,hk˼ڃ=^s;,O&a }vE"~R~ט;X 9?4xrseVO''I/+xKojuw]w]wp]uuw]w]ws]uu0}7H2m!}g<5Coo|jShߞ7}j|j씮}o>;ءo~f58H̷l2xZGQd<3_S*b< Im~گC`jF8 Gg!ЌDhE3DQ|,? h!??ca7ñ32@cvg4>Ϙ?C҉=2J >K6.oFM1AӸ#$M2>/O:<ΩɴU孽5iYҎ3}iZx>R3ka9_ɵ/Z U"U9"q''T=#ܪ_*oRWhU]3,s/򬔭u h0߲-ƠEw4Cgg>|Ps_@~y:ТLF烒<9}c͵gw|:٦ :_Jaƒ~ ૚u%_KM׽KvrHnYTڧ!}*wڧ!5[KCD#r2xPb[rah>jI2ih5KeCef2Q[CeI]Bʥg*9Vݥ6%l7c9O_G9G O*XInIK <9O6>zϺgʳnfݚx<{4ijngʳnY7g6m#uz*\-)Ej6mq%yN ]0) @汈g+) GJ)F=OzŒ'̨n0wJu7B\ R#Ӣ\xPxPECECMh(𢡼 %T:7J)1(DEۙ븯R#|5SzL餡YŸ5b%y*;-aN˳K%'5KoɦdE*hT^|_Ey (Rʁ`26]M,λUKVWApSd3B̒:KAru $7X#xt` t'@:Oh DG'@>|d|_v` >bt3e^XI#q6>J | |?oᏏ?i0$:i ~R>ic?=m\_V*hy_\ε?]ksϻڟ?^Ȝ`h l0CK'H5הo ҍ0i =D.gS1YRl`.T # wkZl|qqx_x<{k|Rqe]jomAk? ~Heb· .x 2DmDe6&U42m1>JWc9m_GNf5@qqMqCjژK%OU:*g@-$`{?J&P\P*R~K$4BZz0/@8AP ǭ ujl=h粵d!X t2*4ƗMa,Y@)*ifm Z:5Xc_8'?># 0YK q-vi7&U߬T-1G / '(̺c#ndΓ| OY-S.5۔oTR~{*#qW 2C2*g[ kb|5iぴi恴@Z@y @x <@xG)h<3='ˁ*@xW 0>TC|kjay Z2ҩSJJ=4y:<y G*E36 t"(4E޷xLT3]?OkRkz~9Ieֳ+rr" MFBlMqڇ)'x&QHoZ 4U}K%'Qge'IhVa'ho"T^rnYnܤO&_DHJDg|brpdD>}zKf}2OkJu~iI /Vzqyazk}ӯ/$z1 qHBG`4S?$Vzp/{_Ĺj^fx+?& CgmX0 <7+-Htx?y|y~K<Zމ5Lu.%0ݮԥ`,U65D1HՐRR#PcwWѼוW%P,KIv |Z*zHr6*lQ`{XbD~S2KSK~T$T'lh )lص-U*ۖ=mHWm$;lηm֜7<XcU]!NOѭȨFt *PYSZl(7hFLI&}_ޗe1[*5oMM1b39|~ޕQly[7"}4x*f6&ىڌe+[Tq#U`'S?ƞ}6,S0xtBɍ|1lX_MQjl*q]e* /GUW=_&;4^:ew-TA%i$YǙZiȱ]lT#kBhSc@rq Z &ьGN{a#VHm) K2| G&;Hx5s>0Sڧ_{|vϝyk׮R ֏/K_u?^OiˍF:öPr6UjK׷X[fuvXyKѩ/S*yK)Q:~4޹Hv0UE#5 /]NlQ*5fEh1Z@BK"xAvlGfp.@&&佅T\I H--H*U<5j[g>&U@3ԮK%{Q]!ThXAL~5IJVxLJ9HwR j?jP~SsF-yspq  E 2ةi#:t7ҎׅQUy/%R+Ϊ@#|!|]\"xwʡ%nNʋvwrnAt;9rNBWFtY>#Je]/#K|1MR Z!͢ïz"D-9iDŽ,t 3%tR~ 350 =  &g ǪN80?48Vn5V hāyzWi+w6y=`rwy=`rn[# } }_ ! J³o Dsoܛ.< OI@pG}Ӆg߯ OU&k`ι9ׁ:9s.c_Xc߮y-562s9 +yܛK=ïߍB?'?gI?$| *{,lI)d.5Z 4X$(KCbU\0EYJs ?,$~ˤ ?40>;ۯ{ۯ;LL?>Hd#l_Q%_ lMįǛAmI >㹟֒ 7jR0EK k~/\͵]ks ~?'wܺㅑ #O/6 TdF /~Z^ |0< gB3*sb<`A؋X[v(62u2\4xhI[˂OyNg8MϱLoR} xJC~y̓y86ʁ whANjl^bUPW(M<]9,R`2\*lv6QSojA h>o䇪+YdtS&p6FsJ3LҬzl R MΫ B[_WlRpހ6'Z!Ԝ. k:l!=~DtSKm5-EWSd%qB) :-׍hIMhIpsy擞lV8tVM[X8RVSL3{+ .цAkaiaY% u#HHy X}>D_UҙJ  䇦d߸\jpk)XRx}DD2yß #)Υ߬98%˗L;|lH4/&j̥2ޭxkIoƮʻ ^h𓺵 4~|lck8^Wi;\_ u3]`]*._c+2Y*E!KReADt /mU91  ȝu*HȞ*AQES񬷑Cq'+ AFK.`Az:zC.ti~*gEߏBz@.^.H Ae+>w ~R"4ْF8S,R`JUUJnZRRB6Vx;L'Р4>58cY!/NEԒBB>eD*C77)2KC;|h.i|50/[._D9]9 |XE/g ^yYS;,,B0i@tTZ3ݖ@0t1h<ߜs#ɚy󋓵Tc p"?430]j'< N1ֿ~bm)ds2/۟l}S}}x McOg$^A?1y6Pv{3&\jbxI<1dZ>J/eA4ǢJeӥ_?Q_]ޚ_d8䜫tݜ=[Tg٫56-_o-ڑxvmwѵ*4rlizd+=0'2/摚i)TLjQjee% g:qH+|UjgeÇ7w "E\qM$u̪ˬJ0̪̪*ˬz0̪ĬN>J;;#Rs%CDIw\c*P`[A,ېMcݽq++ ƽݽq(++:ƽ{txoUk͜4KAkJ%iZ$oMZaykJ%%{ /]?,^.o֔b]ܰTU#Y}Дn劫yletEʖc^1!LjaX4bzH&^4RPk Lao5&b6*54PQSn)\fU8TԉrjjS,3lj t5PQ{X{Nnҥ&&&8j8z8kaa诉cdR-RuvE(T*Zu6l%mui]]P]L ._HI[,{q{jDd]ٰؕ2]+. .ϙdURG-bS?&顥a~$RI\h_SߋA(gӥqo2o2&o2Ƶ@ &c&c7d{1y1x1ޛ  9\W©н\&}&۴z\mU N\quyKf)GE5.gTuΫTfy2AT,)-49&z7&J$_Cl$R"lE*%5s٬:5J DaF-$!R.E&J&Utľ@2"0MBSܪN]d15Ӗs/U)oM .ӗK(q źh`R_Ɗ(o`ηp..\wwέ"- 6cZi}'H5%IPIB4x䊗k7gOM_MBS;4 McS;4~7Œc#Jc~)/vxNyk9Ȩg(A@!-rot`S* jX* հcBZz`뽊xpO¯R'x`kl BMlUxUPZ.U ^W pe[\'vQΚd9ouɋO|_ fU+cVYWUyZ|z~fUTUכwe4!ʮ cM5Vz`D!i =MrI&J&3R "4JO >JTC#HnR`ܿ^`Hh$+7+Hai-#hIіJQ[U'v45=ޥ j,}]׻%;WA\E%Swsg&y Lb]ܺ>}_,.[(˒-m@@U@_UU~ T9 T; T5P0P0P TYTRy\^@{J-ϯ_`cݺaV*XPyKl/ƭ9{jd]^|D ޼3Q݌an?M:6՟8R,t( DtEWJ+V(^tXPWBɾBPl=b԰Bqހe>%-,x: \֊ɾ:9A.M0^۰C;7Rooo ߂D:^{[l+|-···eVY_U fU^fU>UY`V'futB^ Z&7żbrSkR)MQ(FaJ?aߛ8~g^~0IJaȻx\!L4MrlL׆ m 7%lxXhC[^VȾ6-lh7&]]|^AJ+ÇTSBBW˶ LNAӖ1V߮{& z kF]=AAR`kih`= =Oa#9N$9MJ !R 3 N{Lh)ME2O$Ai&jҳ Z*5j@0^k4}/jڀ@pO+g2C?Ox{oߜtR^7FtR>D)SF0kioz4|2>羓7 $'5xQZ;Tm𿆫Rj7XXی30̨̨oF`Ffv6t|wl`5+tgq [fFܺkyXw6>(ĝgbƾt=wƾ{&y&x$oY1(ۼSBv+O*¿jtq,!k tcQNEto5ԥHS(^1>݉ʰ{—μ ? ̠|˥d|rR"vߧd۲L32x2V '3&Zߴ[kdR Z:phDe}5&(75VnJ=L|>|:>y>΃ϼŃgqC}8$J[H+?(Wvp%?0"E\qY̪ER]xzr.~'cX >#EIal-f'-.z yF}0JIP | :~;=եzNA|؞k­܁Qˀ"9}܁4$Oq_㌏|y,1ťoYYb1B@c)Ke#yƳAe. -D_Wx6_xF7~}z6Qx:ßެ(*f|7_U2>_ڦ -g=-6Oh6Oh'}Mh9yBۯ MDlo3t:uƻ&::㭉xtLg;N3^IKA.zkj &;eH*jݍ2M$21ܨA}|Cp+]*>]V*VaRdwc_3W#0Jq_^U*o'.]y.Z 4MoʷK'Tv=m'&ڐ U㳦hO:b'ᾍ|ͽ;[h{7ͽ5[5s惡w{-4Lsίwٕ^?Hd F%^j@$~PA,%ǢlR0UKxYv܃O܃ONa)<{)4ăOʃOP.?J8N\C1 BU3)MRK6NYlhlJ1kgACB|-=baD=jˌKm|!Mq?ѷ\jŽ ( 4 hV,KM L$ lW7?[XإFoZ 4lm^9}/v8no'B9{yx>ZM6iqyn΅η m 麗}q{zUr Dl c/K%uɖ4oKlI-iޖؒ&[Ҽ-i%5_|CȠs8 Z*=5馦T?u,8I!nIX@>q m3~~2zï¯W_ZV^6^k3/B+/B͙^6^V^"XiiXXiXi4VX=cm=Cyݢ^Nj咑C8WMkq^m.[CTKnWkm`n|7ȝWHqC !WzȝWlcvw^и##4;B;Bи#wGhQ D *aA‚D-,JXׂQ Q'ƓIݓBIIPyRh0xRh<)p/4ښI…m66Qz8 M|TU?!{=y`b8|hm|5?ξ[[H+}5٤wwVzA18%/3ftlFYPV8%Z)[;t @9:n(1~l'$v"BD3!A/Tc /ꎟ >L'!5{׾7FXuϏڟ]d:7Mz2:4I5>}Jx"e;#_vk|{]=x]=y]=uuuuՃՍ^WO^W^Wz35xϸg|k< 66qxx.:w4Euذ3Ljtほ6>~gd ܢVsM>kOLO>t>|0`zӓL1. -uDTҠc`InW3SұOנc`|RsG^ϝ߭T'xt JdC ZXU*oIf7m|K\FǦ vMրz6ilBݜ7XJKr%KCX+CX+^ ]8{]@YHҥo7$i)tv伮K~2 ҂.K (&٤lJ&ڢ* :P"4x{8'/&XRhdK%`<ew&*O>!D* scR (AVK&^ˢ/K".Jk?tĵ j4!?3ޣMѶKyAiA.u||| }-~o_ZK#% /] ~`)://CJLjq~q`Y$܃,55Z~"٤44ײjAZ),[3>gy޲eH6R 4o!$^0æFʐmw/ @LN$6IQhH-Z 4HX 3ew ; e10RMx6+FM h긄7l̿VtdfV$i`Sv36/kKR?) EfUCg^.L6k?y$ ZL 3’,DҹFɆ| |HlЌD r^4Z<|SJjR q4N c_A"J5rۍς/hF=L&jYh O>,[ /F]?xV$ރdRTZS [Ri/;eM) kEDuqR%֌DRH%R3R >'c !Nz`x2f| B2vUX-dF+|z?@Gڐ8;|2 |ۇΉ_JojڣR ,n?d$cRBJy4ə@Y\Pȴr5l"٤Qt(x(y<{ڝ|-XM)d%z ?I'oC?$Df>]Uڦ,dRBYm+P30[vT[`ݤ aZeco@aye ?U@0΀@$]IѣL _J k_'K><+N| mf+GQ#Z͢G=i)=.K?'Q%.QWtKR|6Ǥ AQ*hXoy]qy'Op& /$t.!mK6:]w٥v2o2v%gsy]ͳtU*8؜_jJ"ZdMH ReW79'1NkQ{KGQ8waM5䅨=4֓l|ƦTGSՔ MѬ87Rym=y!67`Koz]4 Z-d7uڣޅ-iG_A~Ewx+^x".喇=nD&UTЀMeLR'|D׹[v1O~OZDj>|Yb=g$?l G d"-Ut"ય!R?gU-ȍŴ cAF& 4Vg >t6K@LasMR 4V.g4cC$8q gin| ?V uZ/vb|5?m-qI`%PFP-  D[0ʇQjF(稀!B#8sbɎ^&u5vhEK#Dq?bI^ ^xs/zc#x3ͭ[r{qIԋKzⓄ:t`suc BϺYA2x=d]ޤ+#;R|;Z8oMkJ ƘZ)akJhQhJF)AK SxabJ(R^SxKb-Y'%1]O.'|=9Ιu%zRp=Yz 5PwԖi@QuTP[uk@mRi@-5!_kh-뵖hGZZ>b-2%*[t.Zj8Dj^õ`gOO1s>+>k]KwXk;|~pQy;<ívxk;:mKpd`d.i;۵nãvxk;<m[nvuF^aɦ}q 5}}shڻ|?>¯~?~ٕ4Da+1)l@q!R r)xD0M"5;ԾJ%Pi`UifM*tK} uLÚpԡ_:|gAJ >PZ}-T@ȏ`R'nHCt S0EFL )b+dR0SKF+t|2&Lo;&dz8RdZdZsLOHA'Ӆ^j(# 5pC5ź&(*˔l`5/@jH8yp2_to"jJ>a5Cu\M)g]ť|Ͳ~wۤivo/p/pUB fsFkt+Ԭժk>>6RUr*ÍF1>z筘Wl+6A0f[13;KNy+hm\4xh<uOJmo_ ~T ~+? xdV8'lJq #Sd_\OSgDĘ}1#tun12׾K!SG:BM LbO>Yw92[!! | G2"2ѫE1XӃKŊ9Bz,m+]C:U*~`Mb{R>J🮾eK?r2ϷR3FWT/Cަ o&";{|_|kJ$>.%{8by].=.]]C.\I6)킏.¬b-v{6ŻYU.MSLU*{Vdz.[ֻ7a0yn0\xn< {n< = w= uPa,xVK:t5H+?(W.yfR+bCf]ٽ}ٽfwgwͺ7d_ܤK?X2u.Ҥ &#TХYK8ROyե .e trŕlEIt"HH.ҹt"H.ҹw鯑wFFFy{y[ykaa?y巺.xں.i.iY$,^awN*%=3Ωz-r+LA#i$%:-tٗ. WdWnϮY-2~x/?q^e22~^JvKRynbX;ר9NmI:A.l'.^ދak16~c?q1eO<fx@QItoyE*m: )}Z h!;t]w]|ǻ]|.]|.Cί44SӼLLLk0k0k0 555$$$_|^_|~MuMyMI>a5uXmVVCa5a5uX VV[a57y=u^k^ϯy=y=u^w^OC|y=u^y^ ֟5XAWG ֏,`Nsͪ9ac XEFv@3J5*i@BXf,ۉnD&`>l=~̣#Qo:lV 5HJ4|jH׫׫_b]b_b}u***h|(J5Sœ$k^絚j15Jbm<4nBjp-:9k뒵u%Y[Wz֕tm]#ڒ-}d 3}%r>%&;|~K39b{YCA~FZ_島Y[Y?k[>k9?Qֲ|Z5^WV6عuʄ\2Fv /$F˲wL!;E>tYٮK_i[HKU^Ɉ5?{=WFVbq@_:܅h;p49 `r>W! G~H ь.h)|Vr|j_^Us}s<Ծ;վܪ=1}yaLH{^=PChXJEω٧*b톫ZG"xI_E)*^="xI_**^**RY?q2㉽5l9Vd$P}KMfI5d,:sKR"̅Jhg)*~W\k]/ {bA6(Wdx;q-4!I.< yؑ~׍R]%ٮ y? Jua!]fo"[uyK^^{?KK{v2&sL\=q<\!Q9K'A6(ezJ9ٗ.Ii_=.ԥChy\ ]˄WmVm{]D!!d^/D"B똫llHH-ZDh,k%o& u'%9Jqp2PZH>oÀaaZw VT?W}Ä}y],RkTr4P9 )(bE *h#Ĕ>(چs[1Vh/bG|Ν @-]>>Q@j^ Ժ@kjkZ~@#\sc(dYy#΋a&H ^'reFYԪkM3R;_;IwݝOݝ/ݝwwtw>uwL;_;_߻s8\gIp[f)vkQt$Y{=n5*+Fyґv"Y.P3] Z@k_ Ծy-P]f}-P{ՅKV]Je.;.; OR]J%.=.=VUS<;y@*=slo=0Gbc:HZۉT/R{,CLBw[g(-18RA|KPT5gWo=QoV^_v>G+a82KvS7+z?}`̟3G!QΧX~y"5NyHZO.!M/RC`&/6DO45BB{Y|$ER3@t ]jw>z[_FVG }림"޲=:o (¯ )o * ) w_5#ᅢ\&)nюLzBK+uV}YQ*M| *zȬB15Qh M^ؤ^E2  j_EK_EXV/X?UW~RuQ v>q beCjU>X.|ߡwm:ߡ:=kkk߮߮߮~~~k_IT[VSJ +; , d~]sk;؅XwS]e?. ՝O׽{o\,5gV(~K|rѪa ȋ +[+Mv!sM'-e~DoGzhsc]wf8w$`uΧo \Wſw_jBſg_Ydkg&? fUY,,YnnomL]@.`RA8bD>z?ծoy(oV},)mKI~R%XQNS̨^4gkc<"fc/3jγ`N Bw˨9O^?ER0'_mwI7@bG"ݔ)t& B/K70O'yRmlm /* UoG^ޙX%K~ȖCd]#~5HH9oRSd3 4S=su"s*sס܅܅]}Z]]ɹks200/)Gߵv@v׸Aq:seuS/ k%!υVϣ'geͨi)3:NB39S e6tpB7DX:%'fBtYRr V3B _Rl-g҅mM1s;@9/~|ITΧX>چ|mxfq#ͪ.f/g9q|?< ӑakSA 3tGO }&ΧX_c_:c_:=qG9>}:"DGBC(/K:EzqsTZp%`e-< ~*kuZ燨'RZ;Ie|H4A0N+2g~2?1ԪwViyT=s2o{)QǏ  >D1~ MBO| ~Ko9Ȼxx 5dx+ᛕMB_@;|5#_ `vHRXMHmP>VCOSW}.v SZۉQpO[2RTNS7/12ԀA >[|$F?4.J4S5ܘZO ~ZewxN(X)i? MbD- z[zZƦ MCv>S-ə\*_hYfHu?,i(* nn$H g`|fە| )by*zώHNg??XV}T@cY<Ga ۏ}ymϮXClR)p V M<] R9Woeoo&w7l̈́j~o˾aT/-e g'6Ӥ*|_8?|pvZ#3:sMVeg}tXt%'fx+6e&. )RkRK0hmkfmΧ(i9Pm*5ڶ* ܽs[z{kcۙ~{ WXGw l%afHuc! Y-m8g#1<?tDbY`$V#oTr5ͤ@Qc4U.vhM_pi.wt>zo}݆5fGCݚQglى1wӔZghy͐z8^޷ϻ>w}z%R9Ot>z?M(tNa=?"*h?(T²ͬ ٠x6 x/ܢ{ߎ[LZܷ}}{\\]xfܷOSJr5-^Ez3ڛTvh!*x{_Иy&8Gm [䳞h.##HtgV ΧXoSk`$b>G*#Ijsת$IGk$?_~7t>zNOSS~O[N{)x)όS:v_ҵ&e]zZI%Tһ&_bMZ&&e]V5i5 $TN8)aw)@=,nI&pz"IvY!Uߦt8mw\2aJ/&U)}/1twSr>_Ϣހϵ{.k?y]*{ǀYBzYN|OKa뢷.06?3J(,Yf9bȘz~2Ynkz{#(ގxI0F~gg[V^/]>֮ݲq< 6p}-&Ul5dfs)a9e#(o#tyK.a J|G,Ro}TOU׻ì3yXzHWkO7 'l+_^Mԯe][kct EŤ %`8_(3¨vVfa_!<σ<8xz_2;]G w{Ť*J |M~{~u~uutoσg8x?<3_$c̈́ÞEJTyIUu!.^H[dKudF_ODp"'{9gt1tDDD{wMwUwA A4A% O:?#:Õk gasbpƯr 3h9í*oϘn£5[33f9_ˣK|UIV3O[|zeŤjwU]a -|Ff~ ]Ա߱tw]~ӱ߱?uwc| ~z?ks{bR~CQeeRkdJ,`2 *°"@0q00q0! >4|9ѯ}}E;ї!Ne*׻\ܺ\SX}zKCwnw.w}zT/Zgb&CF)+@X ]g^)5Μ{1H>e+wӏ?aϟz?s۸&̫d:םьv/v]m\~qEp;٢ *HҒ%zbtXĄ,6%-S`Lu0w0?`:?hSSwN_No^'!??'s&֤dXv??L2~Ll>~/@wq[vq9.nYwq[wqkU!.A6teTljzA56h6hglvmN_۠xfҧ45ڸqiNѰ1RΗ-H$~K 5S ->[ŧⳳ,>;->Hw7qgoٛٛ8{7߳7?GHi& !OzrY5?GȚVrE;r#eފa+FPDsgU4g#ڵ{^RFT-%,mW[>jH% 45٨Kfhkg,YIJzl}x~[Kz%ꖱ|dL]e;V$#Vl)Yg'3p?\}Ss/fVօ펵'}!ṇu{=I"۫l _j;#K<)5wNjs8w}]_-qD˻>WΧXwéw| ݘK!$ڒ!?,';(.xG\p>|pe!W,ƭ'j%ઞ <*kJUJ@,;Hq |B੒AI23mkL Z*_pZZR=?o'_g$~D}*qf; k񒶎| 8U FMŝ>[ '=A{rO`g [sOxO.'M v{] оʒГГWz)8 *Égᢆ6+ ֓@AY8+*4lu~)VO@>O@>PO@O@O@kt𤍩 PͨKl!JUxMQMP]0a[ZqhV؊j[Q폭iAyUlE!VuPA׈ ] A`@_쥵ɒVٍȖn v<^.j{;uw+E u`=_Y\iRHGmX+se!G\LLbNB'?6 =4wfݶIT~hv>z~z[7TIL$ۗ%b\&/I5tfN7(F g\tϤDoh&Xϰ?=׺eZ.zT]G4:D}A_A~IV87Ⱦ#5~zr${@z@hz@aƻoonnn Ozg J z5@4K ~Ecvq>zÿ/1/__&ueer__NC/ܯV'NPuU NPU:A *V'=D=OL{8z8>̌\/=/=;bgrMZ_>\_1:~Hq|pt+:C?WB禈qH-qmp>C w8|tM qlb ;q۞EJTvI0^R5+ l7eJvU,٢3#i#iHZ:;#i#iHZ:F>~ |Ⱦg4IU;RsllW~ow]{ߵǍ*ļ@#07;5]9]+=\q|odx[!bD6sl'ty6fR >^z>IlzH-Q*,'S?.mQpAR3e RN/'h_ 2nFZ | ֠Yx[tpuQȖ-gᒼ(IU)V= 39uFlV@6/& čҍ`MyFWpg5,h [O?͔`!57)V;T"Us @iibE1%皅Gßz×kV׬u޳b+`oZc}ݴ"œ)[dWPX4,F]*365${PJSrM?8{k\@lHTCjRw(hN!U6^Lێw~*KqeEK(%<UK"ҥFE8jԥ˰&85;t";i؁ {XH`D ș/EhH>?XvDPťj4!G6RY13+ UDGڬP)jLewV$Kf¬="X=mʇ %߳P+w;d 'T HHLрO%f޷~jWrQ}˴q%m͓V&.N.ZIV5,T`wXb6z!ffRS5>$1'1VǓ)V߯"_I_cqzpRg_wO|oNo% ~~~>!U7$ۍ| m4Η1; V5 ?i<>"ĝ(QJ%55ww(Q x/QL ;yvZ"I T}Sr6BjkLVIΧXo=}㇉;D-K=; ,-^ >]}CҜZI(S76oXoXoXa]aMaMuoy;b9!*WyP{-B.CSr6]*V_eRSGx'fDO9H(n-@u@;Rz{`Nmr>z?=;6uy4{oLc?׋3Y/Իu9t9u9gxCM~N~~]*K6usZ.m_ AT D>*ʖIQ Fq^c CRGRA8mDRHukkky\Z˒\EB[kc>\6#eAތZ D+4YLz]v. Weg7eg9ߔ-AΧXfؿɓNS=+ij,FfR .u lY3TDZ[~?c 5,.5,n5,TťqC¯"jMB_@yz1Kxn ?|SNfrsP<AdC>%lTDR33tL<e3)$ͱO}[۩l&(o-k)Dm!U_~NgYWz%~O=麿d_]9ɺ׺zzz?CI$R z4:{yeS o̖"KJҿeI'],+K?'YsZM,G0ag8ZlGA鼤ތ3f )K\2bXv S"y 4SؖSXOr &v r 4SX-r INa9:|+D g9\=LcwA+z7>UK!˟V)R>\VVl 2V.]F %ڑ*y] 80Bjtk5PE YH}i%b| HWu@1|yr6OPBv٢ǡ.S=drEkv]:NK,rQ$7>]O\Ud: рDdCod*t _>C+q@D.1×#5kVO^?+u5QB[h| W-*u#~$ɳ^R# ~ D$c`}j {PTI{dm>M3~H0[Ty7 B[Ab}o(8HbH:ʩ~SH_"VORgGFcz|>#lBA ގ<KGEǑ]no7\՜>v]OU9V<Ƥc, 5ĭ1#2&R_ V(|Y[SErCOxﯽmĖQŒv$6^R_V n2i Id.*07+%B1l_cW):M[܉kh}JH璊fWg3R]w[[oyܦqG5&<enyVO<zßTK&x'bDqj)\PgȞh4SE[|}\/`A& }M2^@+ Xfy H;9OSA 3ܪޖtX_טO-H4<+pgx3% O:rOf;=v!`*?)¥pZ oѮTHEM;BB[+&Ie;|f=|[O | z\Aq* _ԗZO3Vj'zԢZVPB?lꆌk4ϓn$s>MOI~!y,ΧX1($."ܪOïژz"Iu] Dӥ5x&Z" EB%.ܝŸv9zÿW+Е+OՕߕSu3th80,M-ozk$aðj.ß 4S|S~8)1dk;\_|i$izhRA8e7-줄~ |40qVp >Z|#31!gd²T#@tLN8_T{Ph%)VE<ͱw:{Ӕ>D:8%kH-ZYyZO^vx =I8᭍)X~Tᾛ\*hOOݩSwԝ:uNNݩSwԝ:uN=uֿm AH(dW#@Lu.~3H(f.6 Gi\~uH8魆ؾ&U7NdAjҸ=8b_·P;߲G\szF0c)KNVl%ŐIqj(nmn Y*| g=omTRyS7gץ > ލ3e*4t3&xO xEgiK.`Ɩ  ^0=L89+ր_Bl%ψ(G?V2DS[Zl7V9%xՑAvR &!)UBj<DST{$} s,4Y.>xOO$ieY{CAuZ+zZiR~ojHq#oPqW K-#^.G, <0w62xлᆹT&83s?;rf,ulEӱuyPCjQVcku>z2ɖ{Ύ g[yEJTyI]h!wN]Eǻ6]E]EMWSWѡ^EQ^}X>JY9ivUX[쵸ρTo?`LTLSOSy{S #* ڕbE{ æI׮t!*Vk ~~~ 'x''xय़੟ 3uٺwL]yL]y<]y~3t7rp[ۉЙ~T,9eߏpx&ZƓԐ*?} a7؃@85I|ܞ!|,V8}z|G-࿆T/znY>>ss{,z-CU܎-ΖKBXr"!&p,S%֖Rk8բ ) Y-yz"@h''3] [,#7͐5̸`hE赐z8)褄2:)1I{NJ\ٻ8)ԜO/ A&/}A|IU^̧kv*3:bZH$.Z+ٷgWobWra˸_hU BZ֒U2 UK3gHĊ)~R~_o/cHد>|Z=:a塃tSV[y"yЇye>BjSgkb.YN촅W{:nR=~qgc?8=ßzG X8<ijxپpT?tw\t-!/ueL_iV|),ـ\*{)Yԧt?tn#^$mڑV}ڕV|.Zե3Ƌ<[H$|VHAK(|6u%!j%%!%˾/WXYj/WuYeRu0m/W쀿1>-޽[zgY{ ڕާ s9?sޯ~__IS./{sX_=<,f ];By5}YHhOqu8O4dq ?ʳtl<<[:\^EӲ4dE< t8u էnՉПKoxX1{_&Ai).jPӮ'ViΗz]]O4Si避Zn /$W]g+n /$~q)~*`QHܽ?UH&k? nK >_~O*ڍ_~_K]*W!s?suXJR1e罒ǾJIc4-6Vu ]v_ǜ3;O%X&U{6 ^@rygh!cFc~网{2VZZwҥSHmZZO|2KG=]3TRaG[HUF¢FV#aS#aQ#a{]ΧXoWacK;K?1oFR{q۫)<51V! tG!/1] I{^![l7|϶#(B{?* U+9B O{LSwg%{L6uG/nh$[LݑnOqnnY'F@4GIz YvmS7~rfFB{]|P8_q3UTE:|?4 ʗ28 Gmx3r %(R&Z1޴z/F;0l1E ÈV'>Swv0lQC?ˆ)ֻoї KPm{MUMgcec Kr0:b'mrQ: fѮlꮐaDϐuTG@Nݩ_$,V,~T7 ?Qa .ßJ4ɏ!,;NT0? Jgkc"K;T! ˃6S$zS͓7nɂhT(נG{C7D&u8G̤AZqw8.W.2)H'.EVӯ.2,'0E"-`W0+?^'~L=R)e62i*aPxAAh)eq"r%X!]-ٮ:=%v^Ȱ(>KGOITӰƨÛe/T [^/]>檪b[3&wv< 1@eRE \Ka$\*n+:'IkveaGe_bKDް/Dk7\7L"u'&0i(`։mԥKIxIBq"6Bqfoq D.ȗ[Q-i9fRle I; {h5ͥpZ oYT V3&"@Vª(ԜO|T(;%'yeh'ӿg>"k0D5Ԓrv#JꉸQ$EV_ܳXW#h_Cr$0nB%lINDј}2i^0#') > cqC\5L}hE)|LzHWq],/>Y8X^vYRcy],/s\_iWE[}?&ƪ;x*Y#wlImy(*syz^IHg$8me[D;z6ϵ$(}?7e*ƥW#*{^o]~%X`G^6TkV%5Fx/[{Orե#Gޯ1ߙcLqv`5^R)6>t_K ٠\1|pߺ䮵 ;oJҾ<~f{.z/ͬ ]*epx]V +Mo[&Y@~9WMp~@u}LٽxIUMp~O?yB8B8x/8:͎Pry^Ep|mu*XhB0$n|_3-fdѬ"Doo=;_r)\*_ِGHz*s}MgGަ=*10KךId(g';pߺ-+GޯIKW@.KFjR,74";kvlqF^o]n3̀ XK?o3 3r3ٮK蒏k.[A.֎$1K*k+~.ysG6,'p_|RtUҸ+ a L4C@(ea7 5Jx^qaT_JŃ|ϑ^}1JTv/)yqVȖggL{u_Ot/F.K*]3HMoY>݋Q ۉilשO_)ؗm/B[L1?tXٽK-$D 3{fZ9lK*Ꮏ$;-\hƲ V BAFErQ JK;l/eY isG955\o\[_kku5^~"d}|wkmJ1upkO ۔bҼݐN "u0;KM:~,mF.%0/K2oEUl7\\@v]YCv ߭Dgh xI &j~dh7\|sV]~m3$-#{fGmF.KE )rxQ W@!]s !_x ĥbXX;ұ 59{gX~X粕YGH>3K? 4%@-ڡq/^yOgLo7\^ylػ%.8%˞qQup=v=hh #)!h\VtTt@& |A ގDKd|jkOC6(Q W2CdrdUX$UD-`/PAֲV?`kv}Ts^0ȝF #OJ%U_b/ޛlPvÕ|٪5/]Jq>6C6(Wx!6v]:&WERg"+ i<+&'eڒ:%^aI9O^?'w<īj2K\4>uhJg_҂c_Ŵ ՏlP׫3x/j5A9@;ykgn뵽Zn',L +]%s:bO䝃Pgh=}vb9z)V+l'3i҉V%u#ac>M. WSd_l-;5i/t.I?bjD.%˲SKih)?Rc뽈dBX!o2tߋA2-dYKO^zzK7Q:ET]i{;cl`!R9&56LS7sHgbd -2ngA<|r-3v[.a`+$3͐z?ZZ L!m m |!e \/md3Np[u&k=XoӥpZ oZ / }2ؗPͿ"__d^U._v>o:]ɿBVI8{٤*a6\*߭h ߴ~{{h7~/ߴw#)Arﵫv8uBĒڕҔɍ\ST3'?/~#cyj?s߶uZ{(?$˹T [:|ٲ?[2RF e%5⚂4[uDk7\pߺA Tcy [=_ϴ; > =L=Ȍ 3 3ރЃLӃx2S2C2 3ީ;t.㝺]Щ;ީ;tv㝺KЩ;]?~q쯿3ybv!& ~ruhTp) Y=V!>C¿{珽???;k5`Oz J >Ae|=4J4O!.iiغiaaannn$٘c^+#ʁ٘1J%3(g &UOVFliu _hhh ZZkjZj 8 -mpvD5/ ':~킷x͝粕Eϐ:ْex_/>mDZ>A-p3J4ՂfH+?^^~_+?`||4Q &! 0_g.U63بxﰩT߮58k ·5Ȥ> X/q~Ǒv69::8gq~_U/Iݯ/7 Z}4yDL4r J4ɯ/C_'_  G ^ d5\s ^mC,S/$Kg[ vd LbX/?7{iÅYO| V?!DC_UgjU{_YpTY$cfLs7(Q*mZλd"; -Da{+x/ܢ 9y%U3&lԥ ;C3f=qdF/ _jFzFfQvd1UJvJdF0,F*4ٟ;SOfOf.bM<~342A٣)V.ĥ>z!q>]K_@_\{r>z?tnw ?%R9u ;xg R~, Ԑ?5{X^H8DQLg!ReDB!~VGL ƲK]T3th>܃DVׂR=G*V<+*?8bݐzTJΥ쭆bRL)\7Ƃ( nNlޫQBnoic,.[8~RhFV,H"յ],D(UxIe baWcNZ6;qs ҐAtA" 4.]]%%Ul%k';O|v /m c(kF]` U5K!^p.&SHd Tp=jCpIu%Ś5!*TV[fX!UO5^rƃK[`j(pIx; ?hX!n6L' 4H|k q8!395~ KJ4Ҁ*W e~N^ irrǘ ?r9cY,1r>*S{iϷޟoO?_S{~]k& W-c߾=YD2rRc>3ה+j_רY:!e$R=`}*'Evm*G]jP|=V0գHj,3orw8d+|.=~%jL61gwOL:¤8J iJu>:.;٥ǾSOgvA$ggp33QT[IL)VBYy6W|2 ßz/G|,$*!Fk<6 hNC0$؆ebNþI805'4,Z/M[bq&M|;+|wo!I甓񬑌#/ᴫM [-HF"n]m- N*G"bEA >]o-,z-Z] -w3 4>Si!mǻ%u 31ΧXϟ>bªoa|Zr;QM~iv0cg|4Db}&B=ƀ&x9`&nG;z]\uD F"!j@%m슜 %Ъ 0qhd4>R?K0*ChɌv>—OjEy͑I(n k|Ifn16jq;bvWpfp {@,y̖,,ORA8jD3`TŠ>nMreWo>+aXz7 7k%aaY;:03UvBa(Q1T+0Pת9j9w^/]>|n]@[L1c]:a!-|U]Ĺgt onh;80X7tk%ꟃ(+pMr8: _L<1k?t+OT 5fjQ Xclj{sF$~V ~.T5fz2v>*"ʼn a|'NVc\NV3cq8Rq<$V閑eTt#D}B[kg&:f&Uo˫HRA(e7t=K~`֠lO?nC?4+,hZt:g ^SM])qMᭆئIU^ 4+knk%S7:|FOY9qN*IjNIjPbH#hr0d򩡓\4S$k5P`@"80Kkwal+ ]|'& dΧXoWV=4A,x& bz Uy 1 JVB_z!= |;0m7~W7|'Zu ~ |g:^?/ahmc`y]To?{_cb BcP.h`\ j`WEyA>8=,oƃL3W mrA MОR1{ޙٻd$g"%wwfoMtʟz~ GP7˙Fޛ*u%}mn3P5ؚ,$PE"GES$)P$EHR$Y"R$F쪵T1Xճ(@\V[UCe`/[M&"Un ~ZC, U,ifIj0R'yxRA|keBRHUi3]xE«.lLE7fRr=]*VVB7T?ܕrQ\Ig!!۩TϋmUs%¯J>g)ފ6:+/>3u%-[m~ckP֠vA]ё1.֠]d݇t *T~)dsQ=Cd>oɬ#&7NS >S։Mcåp  ?/TiI[gV37~J?~J?v)kq=,SzVF}fW |!Sn8S  ?bn6ӹ Kޛ%ّP[%pu:rO񀮸*^wdpp8T(` ?:awyvqwcw!<;YyC,(}Un:;sFnbMv%7WAaKj~@v ^b: "@羭ktld,V0O]tkvѥqj`EMj5c WE٠:V9iTjb!GG 1*Dk*L Qf 8jEԲ˴5Xf1oj>fIweH!U5V֐%+_o/ZOK ?tj;TzėԑK#~Hu7|h>kI:@G6Of"I4RpKLR3|i|;Y(|gq2  7xRk _,D;/8Δ|J0i&et\)uxR^muiw51SL~;ɡj3I0FlznfXhR>~2W5eQa|6<*ēLť`^,hvmvpA;vpA[kAAm me]rn?L*w|O ӺrGrH/k~?~8}1{'F]˞St|J؋c6OeSdzj2ΐ]&:劋,3P٠KnZj 򓦘 h]>5E-)ΕZnߛp{l {l4@Ң94"d eo]_+;/U@Q³;Q%v-tW-@\jX/κ<:#X,F9#b劵ZAbYR.YPJ!գ*=^= 60zT{TlNjQ{TiǃZ[!ǃYsfnEWA^ĝt`xl?z$ЌP=V8:B{Zk^d_;vx/]nuŠniPנnuŠniP ˧>6~>6%[ MA]|YEQXb줋\tNF}Dyԇ^.BUiҎfV8wqXkcG.Z!Fi o|0JBnUݫu%N$FL5M×GfrfTԆTo6{X{ii* Wz5leV6p\s[6 0TrS ,=d7H^]Ad/M "DcO%\gM  yA&OytBK&wԔ5'ش/Bl>,sa/gJu _d^OߺQ+.Eܠ ;JJֻ;J;JHֻ;Jd.A ]r<~b?dbx9O/;aW'yG .7ɨ;ނZအ_HުyՅ4 ;crS*k mXXuYh-ĺ,3@!bK( kQY UWQ{f]ayWl2*͓x8pcF.7EˣЅtY>}վTY닱;c=ҊŮ}e Blԥ.`%u B>Ty y0+fܡc 3űx" i_4Ր{;"K+i"uoë\QkT߼$#d tY^ `cbq:y^OQˊ:.u9Ȁ~ nԋb%@+5[SMXĎk5hր/027T8鸐8v8,NLt6$؄kT!~RFc|$ժ'?ꐨ 4[MM|B̦rX kvjڜB*8p&AYسGhW7?.^ zr=_~Lɽ:l@/\Ƌ.y!o4\BN遟^.?.B{!{nQ8fyWrhlO75^coo{>tFEҢɋX~dӪG)tr:[v2}vҔ@Z*h&b8 xXS Q1C, ^Zw5yUNT~گk^كC$O/4TiJ nك))vcIR@ZjJƚ5_iJ mw|Bd+@Tb|t<;O;Oӱt< ;O;ӱwW8W7| E8l(/ >!V$[Pk!T/FhP!.r"!LqTO $n|݂j'/-Nk_e[G;i0Q:R\RLż2ElH.Vi x7BwS6¦)6aSM1)nMAn>i$Z8J{pK.`H~8ޒ±`M@i 45f0@@i PVm'ryS^:5mM*6VzjJxkK|;xD ~WgI?N%> JCKᓝ[ xC/j~F?>e>D?23oUxk^ؽOG!Ro+I2> a 솎|7B*n5ݰ=rg*xd{5^:3TG~^ĝb9۽Zsa^k~f18 8Ң ԆT Nn'n'ֽX N{;qp;p;ۉ|>ng/ s 5/ >I>MC5_j eP|xӤϵP8 YpUjc-~4 >֎劫d_q T5wV]hܺ@]4KMjqa"wW.=KKORSW.=KKO2.YޞD]'y}ePˊr=ilԥ{=-+bv]:>I=_I.(utg)UK)-4uB]\qUUeX~|O ^=bSYzKd!%TZy&-U`nm)%L{*ue/}d]ԶSk4b.y v\+>rt5O ;oZ+.Ey 2DN5i[2HgN)$֞lX'DJ C Ӥ 6D el^jC䌌W[ԭ[ԭjVխjV'uV-uUIhiy.yE<qo ?YXOxK^OV.w=Wu \2]frw5[.;2yS=U'n6xxoK.yv.seQ(-'tz{)v]$ ],![(4Aq*g/x@ל:;N)~ˤjs"yWՅ`MQ9 6ED"阼?ЦE!fV.UmJA"ыW@37TWkQΙQ>e3('b債r٨Kwq,B.VϮA69Xw`u{;9\-@қ![(ʋPqΆjs29CRޙc^:5T9Wt>}> {ŵ_{{V/"=ǽ3 /M\rElJU6ʕ(1^zђQb7Z(WDyqvNHsP4NE3aRqX|BT.44$ .UӀ2_|6\r@ŞWMRMz~ ;J 'k+.4yqC.j1UQ>%)0M R_Fy59.0],^ĝtc(cBf8^:58n Jl *|]AҢ9{X>{@8"IW9H4rRtby]+Y4VHmh$>vj4&@<z=##H0<z=PGiG}= j we65z|B|·DpCߴRAS+bTߟ6;!tSN+N 7ۤ:|!tԎW74W^܌9xIAz|H|~:#M&τzb 'P~G> 3eAU>{蹫z|fbEn~,Ufz`^[y)[lDMgS\eot;EIGV/Oq|pV"|BÁ| Îu+mFVC?w_s}a?W_}}@_¾ Y?ϫr!jAr?jO?PܵߠgڟU !,佋 aOŲk{ O=C×Jl$?K?^kfw}㥓|lqL÷ n|VRA|5狫&\Y|J`U*̪jjQ^,/:MMBŁq k $啽@k4BŁPw+ \n tjlE*7ߒ,%|?|RfHadq^CWoj!A !uISn3+WKZwbن{)_ %ñ:ߏT!>y)1> eGAuXHW^m*N QuOT!2|=z~DŽr|„2GW>!:&=q[CVZ,!ҍ`+=鵕k+5NM^M1SS+5LM^MSS'MmvpA[F-\ֽ-\u/h z/hj󋦠)Mq~)KA ]vettٿe']Ou睹suY睳su9;}9pޙ;s;[w,j;?0j,Jc"@oE x=ɷoF;~N_7̯-ھW8}ϯWh_7[̍~ϯrMW[2"vSL+xg;m^ +K(>KgL2XˉMEYʙQ:QO9Yvsv5bxj~ӊ0op*)WW Ak}v'-O:xtI }>i}}y#6FyFI#FI#|~oW.u:+q8(w]KSW=]ݮQ٦ ||l{ 0[ɇ6Vf+{>zQFlQQaTrx`GO>Ĩ0*zGEQAFרo0m|% Ztŗ5|%~s+9`b0)˰_4YZd[yɌUTdF%]0_;OXO *!i|B U> UfR uw8R* kJkʍה= q\qה)}MהZZ:.jͻR x95 N*;/j, s5t_q\Nf{x[B*֊kkEŵZﵢZQqZ1pVZ/wϏo߃<g3Og3OǙ3OǙgqgǗG Sy XDMmi?$v';ʇe57ۥ ySoUs/CJd~D 0[NaRQ >`<`6<`999!Gŕ?_ju-@/gΫ+ҠR d3xj.kH-sǺZ2*-bl=Q$7^32 I9 Hc 4)iH"Ӑ߄Ԃ&囼4dRp 5Z?0VXi+8 rrBj( k yPdv?!J R_7LCnKD5=-LC `T3\D)>_KYSI m#M*T7Ժr+=t8tǡK9tyw}?L̤ . w* >dCw{w7>OCc>dBX/Ϗ'Ÿ7%DY6:ۙ.`}rDg,,4'y]&].>t!`ȇfse20L7eK_|(}>x)=q Os{e;(=_hHM%i|) SNO9p}X>)5٧>}ip}>eS~ʟ?#{K=ϗGAZF ^(WPݞv#CN rEޑ@?Od/%>nm|B̈#.456E3;|5+qd1^f'qdQ_f5qd1^f'qdƱ{+x؂DTN68*a%6Nd ǩ^jyBq*|@3c5Xq X7|m"{q\ q+,zk_ u?K;k_SPXjx~?k SCB|+گ5]>p-jox> rs=\Vk~?XiV`MOA7bԜL/ml%# ofc:<K/3z[X|Nz?xR3JU ~irU¿w+fO dcSt\_|DA~K>>_/}v `^D1ff<0yt2%TPHgu !?ě(;R_7 #J(.U}-x6;:|׊ YsZ٪̮ï^ʑNOX{<+Bj&ϛlm]$n8[ôPx"P o["]v u7a"6x{vvrd/% ׉Iury0^('m:UvHZqg]Z}^Q,E#k#rWGU˺lg]v.ێdxwy83;&^~Lף{)4>!vz8]FM WV?y`}`U⎢7!j1\ޓW9|D54YQq'](U1%XSF^S J 1bͻK"/_~E_~A?;¯+ץR>z}ID'ѫ'чDIz'ɯK-O'm Ki]5ۗ.SYyQd벣\qMo# \q{8ANPtOP jE8A{/[ V^32TkU{o.;5Ykni/JM7"n屺φoRXty.Rr!Jd.OcT~lP+W6F]´I`ߣ P VU To!1+.V٠\*GųSe.%@+eDŽH% y-suBVZBZ vHu544Kx3N3ϵ.;ϼ'ͼ.#>HҴ$9FSM$L#Tp=$s&ՕDmm *4/4ݬNHub= W%.yԍ2jra2^.{Y=5 Wg+nk٠aIPhμf.~LJI#Us7N,okHmq%B`Ctqrz.: MadըlbY-)9sЌN%"DUQ:KYQ+% \' JHt d*j`f%%G1P#p^J=@x}2=K~#G|5@8=:aa@8=0A,nHw_ݓ؋X=ږ(={=K[iQ{:!.5_ s?!sU,v <]U3Ϻ~Ùg`w<Dw7'<1ʍ_S ?+lYb+UsB8奂,{ e?_:?atjw}E-$4 TrFJuwV\(P˫}]n )cS6MA_6}l ¦wS<&ܢ:,2*5E3BlЂ] ~BaSX"]f\@cS?l)5ſ|> m-%2|0Ժ|qJ ~F Zc/u_X'GqVNZ`~֎"̏ v- /Xkc}>ao}'}X]~/?>7S$KE6@݃t)4bMcHIRC'JHubw~M3Quf~4|V2>!Z iPü&6.UoU_KXo{&,$G Ts&5!.U_kR}}c?}}b?ϻ3& "\Nc(X\aQUU YG @K>[pCZ(I?k]>5,\ 0W ˧Wk_2с%P3x/g;_]lXelnʊFy{2 J&_6NKAvZqt8c .J c/3Luv..8]=Nb͌U}av|<7;ψt ww' .M|%ZjFR__?¯GןOm zC[ǐ&pb%m fm fE[6*r[]o[X̳Zo[QJj@@B5E< ^{ySS=.Uנ{i5뭙f )J$%O!RItjƅR1)V xdCÿj}uNx7q>+}ܿ߅?GOG=#axI[J ^N8Ag?J![(PWd>ʏ"8So0E3Mp3?7! oFkg\,0gyY >> ÿNh;,wfr',wYnG}厂Y?1C#3H>gOߟzz8׹}g!?4s!~&=FRΠz\A7^6%.\\q5gTA7ITo+TO /Ts_' /R__oXկFcJ (ij vxɤ>؁ojN) aL`'O&*_bS ̮/11Ԋ0yiՐ Bj _|oOZRUo)[=fVL- >b |8+l 8>b4|hni7ސ !D ߐoHߐFzCb i7 R [''!ԾIaI_J"~F1f/h>%P\x"_kdC08an  GQQQqT4 GEQQ1pT4ϣ_:(T| ąp!Bq!{!w\罐.^'m~Yw\'4;I} pj) Y 3m) Cp X9t^&/R@0otW77sSĻ»yt;xw0ﻃw}w@xw0`\$<!|&|Nц%2]Sɶ _K$&dR~&h}6MoUl?- yAVO %IҪvXOogyBFO̟p3s^z24/niv75dlk~\y٠˦=ErSݞ"lHj ioOo=c>oUQrB,x`kCYsN\@AY-kYN>1QN*0,I" cq-1Qm t-$$:둸l9,yzC=!b%y=.UJ ?V3^&)b,,]B[ر4&Zvo^+k'CzÕ >!ҕc'֦pe=eIו/j}>~'׸2$wx,ҘS*e*<KJSUj"_lՀʮaU劫6lץ@85fp { 4@h@8XG+ٱ'Vb>ZJl,ؓn+vJ- B{ BKBK^a@h?Kt\Cje^~SKM7Rv>]Z=CB|+e'aZôEԁi}RA30C*~\Dz24=\k?#ĝ~}/;'G×yx >!V<:O:*y&Gc'!!RҜEE*\u1wh奂F+AGXI5 8NZӃ& )t0-@bRAQH |/dU|#@/)x_We&o*,v7;7=@SMxkڠ'cGb=I{VkxKl;B]nz)i;BT/c:_#Ro/4Ï!P wk1K`7eR~SK/4X|v1nÄ7شR TrFJlЂT Ocoj4(WY~nWǞzimP+`Uj{~r8S&*œv3;r C ľ!A8$=$Cb-=VGuhMaRƫT m}ACPV.q.T!ΦQ^J!FIu%5 K4Uڰp3 l:`<6Iۤ]pyR@üFM9j615(>C;Z?$qUDR~SKgAVv)?xĿpQ:ReZʇC i)]~tQSPDJIsDxT{n\ èx"y! ?- fV![`fI,7->5hx-[ j[~eR >M*¯vM|BjknZ^*h]sI`,1a잯x3%1n[32 rE8@6C=ڨ )?&1a-ZM>HN{ƐK5^*hoC×`/؊-ݭ.@/JdUfzl@/fk7]½ƽǺ {,{L{{qp{j⤦د;5~5NMA))Njb)6_יtiz'bx/C.j(q?k;exc#wT'|=lQˊrz|O貓.{% ![/t`LD02g Ju _Yf"UvHB-Eܠy}Et>J>vR[yJD^uxW>Dfg.7*UƜydzμP+W\(+a_}V±>;R:2k`%N(ƫTYx] ]5D tO.OBJY?rbڶzU;BN%mKN*tY\M:,V1=,Vr]NW);˗'FMu^њl;o[y5=L ! l7o>v*ß^ZYcPH{rQ hn^*OoxNmɈR+饂NQHuznQ?Qyq:̣J.d\MfqT04㐞T:$!=8p;4Ŷ0҄ԡ!4~r==)\z\vRA|6*Az~ C!h!߇ X"سq/xx!h!DCNC59zMCS ߽sY3MC|ES O^*hYPHtv ~7lf`4 TrQb)p٠&bAKr@Q^-«- tzm/ؓ&y$Ko_tt4=]/g~Q$_CzoW|ܛT& fo Rl c {ⷔQ:R_f|lpr5풏@6U)%O*aj=T*[[uX XiH+c}5]Mq/dTPVU}?=88e.?ЂdZЈ[^ԦQˌrjJk_ŵC;rB&KYi` ^0Gp5P5(T9*Uc_Anl#[(P˫Mlԥ44%q T(}iqP/s'l#[Ԗ. fV#Y^ l eJ*$IS˵ާX]vjgօf ݍP+W\ϭ u)Fq8.31\R#F&c[ XjvF uqcKy\۹s B]\"W KMLlRh2^ĝu.E^ Yc벣\.tIa[f;^ k 6]bc%X>6ʫmc`c%>6ʫUc`[VeE=ClZ]jۅ|.|nU]Vy|#]ۛ*?k;E J aP>+ 9Mr4XmS<'K3KGޓpB]\R`Zg7ڥ]..ʷbgRMPH֎x){ &,<7O2t/4X~.2,(lzJ(WFm*_[f^7dbO)gDvk@6ct^IH'}$]|F]3x szFWٮ ?fǤm8.!V>! |5Ў+lc^X)zj))zjb)OBLW@[BY!3'` k1.e}EYnJML+"}"úF%RKTM+՝Gwu NAqto4Gh> P'+_PU\k! KK ^`͔+BQ{X uy{YΚ{P VUjW^{#͸kڽٮ˼gYj޳Yj,5Yj,5p,p8K,巶u]n|%\o e~yxq(  3\pOl4PLi6 3D]D*˲SN|\8S疳T7rv 0e+iy˱7(W\ŒU,WBfEiPizLx)ڥkqdXq]iVg>]-qXv8j+>]mL_֤BkFSn(Ůi%% PHosE m>OܓnyQ,'^*T4SHcr'X3|N17 ? ]T/` R76t7>:>?|~=h|`XIgܵRɹ:V]碮Y ժB5g j:g }@4R@쀦A d{UCjM3PRA\C*V_}9 Cjo >&D*R?lM ?󎮾;:~c`i Al { t˄^c`8{ tM k ( F ˊcwBKR]nh~D= VP[ ;Iu l m%  xs'rq͟|[ N#a˔B*8tEhń!\%+&|%4lq|\.uC$y)Txzß=׸u_[|OV'wo> kiͼ$<llV+h+ؼW0l 6oG-(Z$=ĉ# B"~ϭο!f|;k$[y nwo&iA\}On%|>KUE]Ym`RO/eW[f-n2d]Ր"VVuʴy(:|t EOѐs+K AA>L!#jY7/X}i0F' O(sK7flyԑگpF$*K~OОp|74koR0xU(ko7N<ȇ%};qRI'7-̅vH5N2&QIy(={ yfH5gR!;Xg|^]AKK=jإ\ZM*V/)_ˀ `Mz MB{B\ǽB\;^ W+x"WׄSo_MQ?}o_>h|x4S!D`'}0jaq@3ȵq=6Jӽɢ6JR > Ď[7+&a9 g*0PTˉPe,6]bF|@6r p =@@ a@ Ÿ߁/JqU!][:>MZ)oib8U&GG /zx&\6+mPWA=iVxwIzRؓݓ6==`OؓՓZŞt'.O oN<1<҉u0|5OA@8Vy뎁0=FŁ]eУ\q)/],+esՌJ^wo/Ӛ,XZrť;ru /bVUËѰ[[5V /bVUnհ[w-!iYzQ[-|L4 ^Qĵ|ؖ3I,0QԠ N=L;-B695BQiCwh`Z3I6 ftڅtƛН$]j =tq[`BwpV, uX|hj,@q u frz 0:~--@^*hv~XeT0~抃``8+~恃`!=|;?&N-@/_F]?f+v dĜJ V>5Ѓ&۴`O\7J"/>t)tVV@RҼ˕O3A̮Cm?ߖrItG]nxPwp5t.nKQ/)]* Cx7]?, ؐ{'f4geb#;De";T^*ÔnKީw ~㳗SeF+' ?TY=`RO~4ISѦI4աkz~b( EJA3"<䚄]?䖄u%IV:+ġW$M%7$_ ̚[(9` l?ߊGsW~ OV:噲q7 W3rK-f+-Ϧ*=qF?Rw);e"ej~x;|_Zp;%upbd: U1bM`e'io' Nq]VEoVJ[]V9Q-GXt JK!~Wե&WͿ)E$evߴ)hz"W3ƢX7gCK7LcbK9)!!@-e4]}dj54EMQ()jhz5E MQBSԫ)zhh ȗhj.YN)h(+ÙUTyg(E8 DԐ>Ƴ/Q|SΓdg8oe?H]=v08xw%7Wg&*啺RK$|xj_ V›ueg`κAM8z.܉ Ush{ٺ .)Ӆ\ /]. OvYWPhe]BPhumoe؋i45m%쮘;y@Gv'jmd5nwPNм}~[WVl%bqq8/ ŧӵ鸀l%N%t,G|2|N;ȿM#t<9 qK0|L|V-q0|ODž/Q۽E.՛c³|kR&Ҝ77nozz S@R uz ȥf|ںIz -DB1#C.}RB^?Cdve\eC@Q)%O^t`sr$XG)Yd_>T*(ACMҊTySK..$$MUYpKfh`SS[Fk$p}nO^.qv!lG ]2CPhڅB.tKO]( Ry}n4ʎIL>"ڿgψ& |)ʻPh n2jE_r>i&YHʛ]Fg`fj;5IEt^DC%m,x7¾9vtIp\ȫ8\~^\Mb:M6KYC$3hƤ|P/4hEtW^\7:MvhϴLOd$`=T@ #E)!hOv@D|6nRC 7;X~! hYd1tJ|y3U*—@C T&>i|5m g뻚 [%`[piA ;$b$YvZ.qTQ_41 ԅBԅcmiKnMOd'?NY/]50Rq5p^;Ìw^3.xwԥ4(_G> @=L匵x+lԥܼYSeIc1ܿ-tWg}_dW;N9SS =lK`/+e4X\i:*q(g~6o++ s)l -\‹.|_QZ*-74t>&;)UTZhW Ⱦ.op4.(!q1|5<_](O#[i57\]o-~N4}PqPjJ8)RԄZr/ ޿m%-݃Lgɱ%xBJ$, TS" G/Txg02ΒͥASE@0nDƁ uO:r|5OJHK$$yNB q  %DDPB _"!\A& _T{R ~'?Cѳ/Y@uNv ]r) p×r3;H1L |=vs>ӾϙO|p𓟫c% 9ߔإ}09_J?\0 jI#[RNΌ8\j8J7j |h9 a[bs'msHEZZ_K..'Z&]ves(V:D{IRB-z%ٜ.~g?C7w! ~)TLhj8u~&<`V(`k۹]ow\|Sb0[!p) a%~5 }\xǨUoTh^sL6hϚy])SdzjleH8ai$㱭!kV:YdHD"T&LRF3tc\gOؓ{<{RǞ4'ͳ'MI{<{aOؓݓ83D$O*JIyԾ<!cb߼p7XMZ>vgagy&vyvg`gYy&vyw\@98McZ롻ԄLVZ$ۘ 5j gBІ {&!R TN|P-f/@+\U]q`όxp/ 18^8qqP>x^|%s{ / ~y &~ |>p C dQrɏ>aur>&&^fly,٤2XR =̎x0C 'd-DNX;+H6aV+e4MEuj˱w&y8 f}*[*؇q0aR>>؇u ib$,J\I kУeT_$*E/F+29}~I, anPh=/N ToR0JMһR ~l~IuNL990^ɗ7o-;v;:E CK7LQT*(/f5g.N 2DW|5ߧ_|ժeg!1[Mm8VO1k%G|U~>g|Z~+&[_yӬ ~p= r>I֖gB& /XغK ?[W1Z-K\^gЅBG g9vΕdޟ8ᇧ Ӆ|SӅŇ^k=5x֝?k"$6wH&0Y-OM,4"Y~6T/C=d (C)P' X&۴`B͘|@v9O tY5,;ڂ|\!Ln1QGy-9)ŢM)Q\d@zwA@\dp^/9\^&::ќSJ""nЅ.㚂qqMq=qM˸`\`\e\`\S06>dž5&8*=N!TyJIlm>&w+`~Į.aedKUϊm$bP^lAսW➵1GV^umr~r"u9A~  CgܖRy93eklM~,yq-uy/v]  I#/ǧ/4jVL"1Qg/&zAޣZ*6En7cێ]mގ QD#t3h6Y8KM$@V) }*'SSs;Nx*OOk}_}j) }^tɟB }K.ušZpySݻ\7)' y[W"d[k.%]k/\W% sL*nE&k-"{̄QH/\ϾxߪطF>#N}oՌ} ǁȎ}bZ/wҥ\7Ot)ArRR>ѥ] ]K KtAt.5蒃.ҥ]jХ.]R>ѥQ=?.%ф=$,USx6L*2Krc@с$ꎽ#19qJ#ewc)' cy}jT4 5A6߶ȋ x7r-+,%,ZsXkXװďk/a_a_oK[a|BGjt qLrƇ.9rƜE,jA ivEa)όWHO536 #5}-52"ne\2BBlK].ۥBj0^2^ 0Zxi'*4B](zSs6 ;r|.e?=t40{L.M&Ѕ:2|MnЅ-2\n @IB^N!tw?M"V4^}²Hӣ>}٪K[80vu`s%1)Qt>q{q`ܶʒPvMS[M1&@-0 H%۱K(Ւ8`Gv{.~ӽNK`{"R?kjn#[\*Dl C#|_.:fx=rᜈ].:\tF =r{jp1]xEЕ/W<>w++V^Xgbft^.HɒDlTZTFXeSTT(X*#TFX[T K[r-#Zqc_\mIrcU>$ZKe Qnʺ/IPDKdrՈMMR=6 >nr-IzX_6]M0Jk5]Wn^.5aH\bkG_{M)ӥx9*ee.|M+OuokyUEM.]2R.eee] K̗̗̗|ו]WvSﺲ>H| \WvV8r]ٹϱr]^\+)6)).SlSlS\ XXa|M\.|Yƛv̗]_/2_z0_(].u%~b\ b೮P 0_u)å#O/_K9RbKu]Jp)Mv=\Ju_Ja\.?ˇrbGS Tq0#0Qz0lŗ$+=lz0Ql†ߟ ~%E!sM-J.|{ͻ-”/+37eT/\Uӗ t!Uqf{hm(hK"hJz79B.[KZAڧ2 YZ\h[K CK7LcbK%4'Nj4RFS5,p;`NR0' Chn+<*!C`S$VsrF~Х]K}u?tƋOuR@.\$Ӹ^$ՠKK`NR0eNR0G0' srlÝzB}f !ѬtH+·$&pQZ6 IԙaO+)-GBϚ-lM)УӅ[U_)P6y4~}BA.%R5|I")o{23EQ]5U/kfh BWkU/kxkkx%~q]uYtY.hu]A`A+2=>H*mu=BH~Kd;Է1Q<Ț4vbeR ` Jk-L\y>-Ar);oɰ%LU(A|v+i\/_ja§+<ǿxZحQMźz n岺гq$岺p:Xu.o.+=zje]'?%K.;X 8E| Y-. < V%)6 CUR e.]ut*AcAn+\?;tNKX),bAzCa%RtsTꄃ!pT""ׂN=4E89jprR‚^߿8‚N/tw:;Ь*mIԮcLZa*[*($(| :jU2_nIS?hIS/6ŵO-h.ᴡE\`K8mtꂁ1kp;-)N*<;TN .sfvkܖ Gsv6GA]vYK899jI;e퓕pvOߋ}&'oxÙJb|LG|cR0 2Kj5RY{5$&R(|IT}j3>-RG$ߴkl+ ];4`'`[˶)`'˶з5x˺OtYD/%:+̖:#kůujkkzlxƵpusFHdMa2^"YRd:H=Dd]5D!?Sv+\W^Q6C?џ8JJ(sL*ZPwS,4Y ȜO, PCK`rlDī='B{=ڛhGplDI2W0sOˈa?U_/##>ԸS+5.$kKpUUnr!";NV]/r׵!YFkCr6$ڐTz˽! ɺ6$ ~ӥe^bb by-S k-8}K]KXWJ浮0k]ia])a׺a[i[t.a+0b^X -cZJ8Mt\ ݂̥5'9 ͽBhKkN>tAkNn6.5]9 | sr6k P՜L]ihYQR urƪK#ʔtI} m޲!?7u< ]֛vVv +Q\+G._]_3@ )8u9S PWx+}_K} _Ɨ.ҥ>:t G.ѡK \Gu]ڥK(+1WB<(9u%/e|K]'/!ciK߇/{m*"k *P[97f ur%ts8G|) |+^o눿 | 3 xhu,ñx GctcF8[rYF%YV=rrY#˼Ot?Ѕ>%.E]$"EN]rsS{4˝dC~jyفqv9ֵZw1֕nX=.gֺS|^d]'?e}Kr1ߥ˽ߏo |.~% | V.]6yO\jUyڲQ';PSž, DKTR3`S7gp9x9G;PE< K# 99G40y#E܇.Qx;"LDHݲz g2LvEB3ٲ! .EܠK ؼގŖu=g3n^6Llӥn/ xxg.)ETAB<X?补11] '|< I7V"ǼZx'BS0ؓ7[ ,[le\~:wy w6&Lb$VMTSb?Xme& Ӡ[)>?E&9jB|zw>&RW4.+RFR~.{ M~|ſ%P|q{{B䔷pt<]p]AqPuAAqPWuAA?a@@h8:~@@8:~qڟX?Yka폳'wOo߄§?mpiWǕvBҮ+ iW)]WҮvHףkFfg}bǿ%Y/,lĖjJж-$i4']\_4~?m RT /_Rxd4-x8(/GVٛREz0)]VUuǧ[Ϯu> gQ>&]s]ä7߿kLR#|jwPKΧ{Fg>>uC34}u'N>hejhW;jucC߱=)ZG~{x}j2QQ~hH!zR>gvYjhRhpTj!z| ;Z{mO'g"s:ӣZka,24K44T}ٿuLC;MC3449 ͌iFdi4T3NC5z I{פ͋GP>&UD?|pXj#͢iV_ϞT'5II=cOؓٓ*'ճ'5I{R{^^d%<}BxN!RgvߔRF#|[I,#\ZA/W+U2~"+35! R(bE{EgE500kama,:,,_̢4q%Bv2 Lk;(P LL(u0B'/o2t[囄-:Oܙ:txSFu) y"ӥL%eS]ĿhY|l,TrEn>t.-QrE*6]҅BBAt7'PЅ^UތI~.LL弄+Pc6MF'Adlg]1lH^<\Kpu2r\9 az. l*W'RU 4*W'7.uARFcW'ͥ=VD^hߡ}%|K6!lb'ƛ$!f)^.H]V=5K{꜄=tIiMRAUeh`&@-mJ yWEbgLC0;+TNROz+ .Eܠ6H^.Hd~># CK2c{R6О}r "nCĥ" +rO<Χha_A"W!~}Es> Gmʉ؇Ml+];+KJR׃UrJdR0JsR~< ;S4<< ;O34<<~AY|œI܅0J׎*|LdǴ??`>7, ?tQ> !<oG(w+]F@xHL4_ƔL*$ݡ6j)c%+'Aa W WAݤ2ƾhX燵?ڟgk?_ztI[hcr>mk_P-?cݢ9`=;N'N‰sgljs9ωsqI8qN8=q 7=S_lr> d+o0G~(2 tTtv9(Y\jsvM)e4]6 v"s>'46t*q誑|LlC_v&Ldh.\ps*l烳 TxA%KԧO,㪓R%{=sCac|RYzaC4`Pf&H$Nw?A=43A%sA+sJ8AYA=5}6;ܦM/iyd96;ܦqI.5ܦ i=mZOmZ)~֝- [ظ,+]༑7.=+& a 7.X#V7b0tA@d, FXĖjwйgˤ2Rw>ௌ> b ԯ$,猍⓰> kކR0Jt_/$̝g _qr>m ʡI}_$T&2Jdp:2fjǹ \&\WqW+8W+`+qA-A#A㚃FA㜃&A#AbZDMPLxС~t|:@|;r`Q8`SaHdQP@}e@@+\U;ŦM)ۦ͙>LHD_hvVeSg]JOUL~xR8, ؝~n\J 7:qiSL:DDq {SC0 z_&5%[!pL/·S'ʣx = !Vrw`"%/ʶBd'?ߖr%ty 5oz< =j(B% űC"qp&أ$ Gw> jIx*W<ҥUf@Rʴ^3nE4w\C=I aJ,+eMKUv >qSHo`e/«T5hEPQR/\fmy"!F\C?XWnCD4"x2Ȯ8DoW"xK}.M=JNcw1 ; U/YJ7o)zjˑ.R. oG<߿W e+w5c٨Kcz'ne3h MG>[]TmBEK'İ& 65}6o[ux<;B; ~#PBrFJus/Vy˾W}c䷥\p />t{ԥ$My+YWB]\ "'_&'p.ЃnqK 2B]FheB32v.4ܠKa #Ĵ2t ~ VU~)|emZ@6\X;B;BchZ0O#8:eq{85Ï|5O@Q\sM? 6#>`%.XדߔRFc%å+3#jY=Oj}.e'DG+AŸ1ŵ  'Wnߡw[|.r31PT>m1|rXqo?NC-+p6дgq ݩOf}3Ogq ih,pXo~[ ? P jX{Ԟ:BԞ.r;yvao;33?e]ƥxDt_fX*>i%WCBliOxGmm(e7 CHt!:T|K{&s1&@)e'J|A&@-mBCOji7//8]_RTVt^]".NEuc]*zKL??SzKT@d]zKlޤ[vro x{.ek>W.ee} KF.+貾.u<{3ԥ˫Kc urZ7/lԥvvuު3[vum)\]$'R0RycuBݭ]\y*v_d޴4y[J.Z.q,yRIR*Řt^GK%ٓ%ϻ\vGz.?M#P-.Wi\2䲙 4 7qC.|ېB EVX%y OR5b!.asbɥa |~iO89Dd3X;cT7LJ7w jh3YލYJ Zt^/ o|E[v`R.q.X2ٍ猎#+Gpq6Lc#ɇOnҎ5L*AR75K/TM}U0z|U*ō~I0D3`;cFaWVvO^{ہKˀjaUn^9v{F޽#En$& w#H_H b|֧X+a>j^NɥbL I&pN-5rST*aizw+m~DߠB&2|4LjFc*О'e4Vʀ.4yh@d+>ivh OK33]\R>H!@ |VO;זdJ.K֚]Sug=h`Դ 7e?e/PO-5־do j*9`wgWj"+Q$RR_dQ$k5?w!}r> /mւ,ROCi[ [yY!#iA`A`A˂h1Ђ1т/,RF|ĆMmEؖn7Jutc+\i9oQ76bnlE x7¾`N[-ܑFjLxjRTCM-m9]ȥ"8!M'yNH'<'R i4qBĿ|d~G4qDX:$I& l0qDTfW3lYlj6ljq5jFM\潚=[= xHP8Q*RdCXAf*c)\CMt$8~Nܳ$D%I+*/# /+dW?xT4l" "ŮqZg RމMrPT*pQ|il5Rҁ\*_@n؅Pj][_xIm=/+:|)qA}sj't}V5UMxFת6êFaUkUͰѹC ](jbUsIws9qIhѹ$|N|ұ 7O7{x!RWK6>!j9{5sRZ9Y)z7H.S(L(,(sp0qBNQXQXFaICw<M}S61ZV2'@,}@,7='Oٜ_2SJ497KE"|^& 599`uBf+5HB (fʇQ'# F[X~y &~ {?@|@3vХFB?-l 10r^g'_e$xbfEέ ^O~u"|U#&¯`9`8ٱ^' 'q378kc&`8'LĹ5qqo?NC- G{t1︦Sߵi 0b !KaL -l#y'Hz"!  ս@i|Ve-j9,yJX9ek̳Ιgu<%,[ gu<>}şJ6^eI.|Btsm˖+ӥp=)jR>X,Nv`s ,Ζl8Ed8]_&?[vݐzoPf|LTQ3 avq=b%V`o[y4K ~VS^Gr]&Y:63gnq;twbXhY5e6r.oJ)+T&>uRN!W.BO=Uuj'DFƑ=& ?tQ> ~?;/_tuզRρMCL& ?+.r%gOs7J2E4t2h㸒ldPJrJdDZ D{+IBOWmɕ$/J $kRF3lr/vH%T)!\B (xH/wXRrjhI.Utt>XS tJgYyzy8vyjΓtΓO(s aOY@-WXaJ> ͈'2h)/TӀ37{2//lPBפ@Yt <eZbWbt\jMf4M3uP8MSyh4h칥CaP@4ߦi\`^GOҧ)Ln RybѠÚugIe0JZ3 g y^ù0|<9-Cx([Ke!|>_E 6>!yȇK-~a𓡩?s}:4w*B[ST_-k2.r[z ţmPmqp[q[.!뢈ೣ_z~s%ϧ|=! ~ъ> ,߻s{Pң.%xq>njPd|xĽT68CF û&>uKR ~?;zJh;zJSbDyNO6tl"l"~6 _6뷁_W{$ҟ i$ǢH4_JP{T}u}t%SR4XV ) :mf0v"ߏRMRy;;iPSyL"ܖ]4Yǖ_e[2~M-{T7|V^G xax*yå כ2KEilXI] "xq& /Zr#S]jCB!Yωĉf='NЛ&zN'0=qO)|I4R/a|$ X(0/t {,8.0:&{_e˖$8r-qX!|>| qΧ Q,I|яզB-_VX'd |ׇ[ z !q7YS,2ƴ*3F{;fhűxB@V(W6$'one] ;>xd/\EV4(\5 ˜u~ Q)W)!KԢ #L]\p /nů[eV9݊[QnEV[tn[ݪ['-.0s:AM 5cP1 uN.0[A5ʁ*&lhGn@-P:P,۴{;>[E(btA]P'c2\tK)"LhdMR9[w̄Q1 :!h81| f092FYj GCѐ~BʏtG"rBQ:i1>! 49!Mä2𗞐6>D+ +=(D.JxW O@wP3p>&0P]ÈnaDsDFt #^#9zFt #K~7Tj.e R0W02T$SdLA0Dv4W0q]u L-"KcL :؁v_LBZvEGS]h Wɣ>WW3Z]!*U,ƌ7[Ol2Ϧ(U1ٿ-VE]8cpL>"%AZ4>!TSbVb|XjjC]f9`uqm!~N2yʜXo=KS²rDG«T{=nϮ工\p /..S6Rź=l=Aㄔys^QtV`u^ > [r=7H)J.Wwad.ѳ]figu]{V6@׉uGӝFelg˖f nٮ*e X3eAs{hl{˶˲ ? 琫Lb:Ku PpKygr4[yL߮juEAGwcLMaj(=6K-GIP>i4q:gi4t:xr: Nq8 \WE6_J3R~I\j [i'L9 .3TR=ϗ 'b)*hyJw稶l@+g\ʋ.#ٌh=n~/hS> OO;R#A  ?(bqfq5@=^Ƈ |3nygRxF۾~ﷷ}~Q7d|^e:(08Ɍ*R/>y%rU4K٠ۆN4/w EM Sxϰ6=Q,L*;cCw>>k2Cfq)7a(hBIK)h:KI˦|45 EBjq{;bbIԬRyr_I՜ @vCBE1q[]7#tqhbH,v+.|,_ǏZv QRFQp߲)ʥKyKDt)..]JХ tIλ}jLQw{y7.W̫Tre-}oL;d&pL·OlHzOBӑ{Z ZpvX4*1[{2L'PviִC\J[c [󇢉iOAͥfLlMJMåFȃ}qBn?4yG =Uю@#Vh.oMstVrv4'='Gi2L*_KMGå~#[`QS_SqL @½"CewriHhʿ)]2Gov}aogo+v}aow$ `'q\0'a$èb'H,&c{|58_4)v!> |`T8k?B߁Gq]ߴT3# 'Zi@v}TIOB fF )yv$r^2sz3h)ik j"]]}+)^=ŦȚ2LKO0"hPb/KdzwG]JE%s`q~_9l^s~KЧe/tj||k|5|弮 W+W3W6;]|^u.}lܧ;]c6˶mڑ{sɇSV>1+=QDT1-kYXUcMqq Aڍb(c(/tSxY=֊ _+lΨ7aRR+gi#0"V)%|ࠖA-q'R{O9%ƽXpҺvFgCY0PR*~UoZn`i_07; v4 9 7>+Xpn\fjhU k*tc_!Oh ~-$"ZΏ CC({zoxE=H'^Q lZ1`p ·+j9tOTTj#w !&*^k_,֊ x YbZ0&袨79o᷏o~~!%|ТEy) zT:+ Y`hJzδ8rZ 5 ;ذy XG bGm0+^<&1y|f„yLyc<8 1s*i>J vno+ˆ`Jn՚lGuX $۬q#HwnzNbA{S.+H<̨UONíuB]$Y1"A]$Y "F]$Y-EH޺H ' 8' 8' pNyOm qmv=9!~*'کtV\l,ݔ5ݜL{Xͷ.r?kWQ3[&]Yo_^7?A^R\E}~j5R9gc'}hY ňڍ.F2жiKq` ]gͯ-DžkE/yZ;:@JWQKvht]3 ; 7qu;e ;*xkY6hWFjiس٪IvLp~eo048[!wjjgftQ[݅/Q;,،9*O8r _8q:H@uq /@rȁdr ȁ|3Mѿ0[?;lGyGz ۗqO^??C{^VQ55rXy4h4h,=ʹc!RothNhRwF-.~xuh//hFAFJ *8 FK *_ƿ9sPAEj~AAEO90k~m:4:Ԩ= Zd"qO58V! fD[j<0k@<p=dqoŁ83l ΰ4 93t8)tڮs[ Usų{/aڿyBwC78n ]ߏڀon-¯fսNcǽ~ H+ bUohuB0]?sbg9<^@3p#欁gT8# PWˍk[8}(O3>M_zg&I- : .']>]>w.wzπF,?Ga~ŋqxq^.^ŋqxq^&.^}z&[-nTKAg.mqUKV!6%V! %s"[~h=/Z}V>I 7oкdM۫>{^VQxG;# <dE(bV>oqկXde™uA/ُYj>GiQf<-AX/s?@U!$RCR5կ ThMiZ O+ߎyM葸iVs3ky<mV jQ˖(Bj  |;g>#9ߟ EUệj𙣰[[= uZ_=k :{~?>A﫯X(NvHU^ԣqS#Qqꕶ)ζilwVW+} k/};AgjW߬t=4)Z?i-d :zۨ;%`wS!VNE[Ot YODlt+dw^>KEZNiD?_" i mN~;"]C{N,^Ԫ⵽|7F o_ƋC+OSn^_C{^zqʶbi >:+\/N5{A/N}lpp^9"ycHwZVs.9|:6KԲ9*/'[1){?4ytV(eCӖru)ec.+|hޯ{fϏ_$|O|. > ~+7W~¯f/_3+¯oXd{fߋ> =y2AgVO|ZMU4ii߽߰;~KD+{ zcw޽yW*Ⱦl?>R|l⠳By0@ D ,3GQ:zÿe3~ϲO(eg(߳3~Go  |;g>#9 ~?~d-|_d-|_ "g"Of O?7'goڔ%|L @N>=t)ZZ!7VP8h'%೟AeϾo砳B3!%誟Aeg-O`&41?݀GY`l0 09?΀G`go߄>o?`QbHG;$6kAg>ήղlY򃇎4fJ'fXs:ϻq%y%ϻqEQO |JsZO>|,'>gyGS)[Io?7G#?2-@ ?oW+C~ޮ m nW$oW+#]"ܮ{oqi俦bB$ݮ =.rhM%; kyQ祷CP`;;qCPCq?[-?[--W-ƃΎC[̮58Cpk `+9‘kVuEoec?;*F_gTgT5+FQӇ I1*&!- bjtc0 $4PI$i2uv^^Q:!u1!{mKm/bwyWl fYb/e!~;CCׅ\>4p¿_ {!~U4zaX!௨ueXVbz_jk,wz>kAgpez@=Ol _ku 4JXo /D=Ʀ.ezm ;j6{ hU F-l7_@M{5y%|~3gfп˒a>W}W/ >ZTDϺ#XJ킯s{(T}hR.-=b{;>ޯO {bSO{c3~ϽO{s3~gK*|hY-l0ਤ+lͮF?6T:M,cBMe{ fZOF( V]ON\u+ W݉J.\u{]Y/z_W D-zgٯeϏ_ ݂ʁ/*-"O. |9Ymw?wt૧ 6ugì>PPy O :+PpxtS)nU GFctg{__hl/+5~B{_ޗ }]/=sLSi- -zN4R=զ-+w]" .p/ {e;Uj?1 kjRBQ?ިKtpA)ldZxGy(ni5x̃\<̋y0.A2< A2yA^!|zK8{ ~rkazi97GAچ7wn 72ҫAk@6Wc6 7#^ Fj`|ɊTPKʭHFc?TPJV-h7)҉TP[άH'(ZPάHDE:"HLT|+ҵ1MNڔ\jo8qCW >O*~qoM@ՂheM$j5BM$VDjD{.k'?=.Z UbQ cň)zl-4, ?<{-찉?D Whf …H#8Cy!&\ABvI~gB < ~ ^@8p*8@y:)A8hJp8=#_;dw?2|A7|[>#|[>#|N,koJIkov :a핼 VΎ^zr;4Eϳ~A< OYANU40VVD rZ [aDUQV& kQh?ZҦMFN,)nX CZ1|0wrqXTejE*mDM7Y<7VlOڍ{Nh '<&@k8(Op{{` {c{a{cwo§'K?o%] ǵ絫PK^QƔ?`|bOvֈf;w۹s;:vnDzs_~c`amM2Bg}vtE/s#+j(X/IxgHF#(<#Yx [xW^mmomomoގކ^^*!a`٢n[yٺ춅eVZ.[l-? `Ďb3N-+ ^(Kt\ؗHhrB5B]o[ƒpC1P, A;6q J;H}JqF e$by^:gnh[fu`XFI5u`:0KZ4:Pk'RݧlcsMmd HkAg9!Pߢd[jQ+ӶX~KSu4[F-ɏ4mG~fC ?}=Dk^v^>Agy @FV{ԊŎuc=Gg_Lwſ,Q[G??>d[#ǗL_`%#deJ6FZƀLzV2Xxd}7{}I^:ïɾ:63`lzzZKˆމF륁M {6o`dzå4C34p(p;3vfvEġL}oghD`'^| 6L{&‰0q"k_#|M ~/?,_xmmzh0yE짎ӳhU AX/])`6CJObޕ#pyW*?/C E]9A<ƍo1tG_̘;Ќ QxOc>n5p o̴^xt931qc#tfZ70½9t͚8;Wͺs kҝ\Qw.Н&VAwҝm[^3? KZtV']~w]oOߴZK7,?Y~zMOy5gi&~`YN^tz,bɋjFsZiPCww+cuCetuew>4q!zHcQo{ F/䥏 :(|VwA j+3~7؜oo;a{?`] |x -@[[ηoVx oCt_AS^[S]~[[kFgj]j_:HceZ!V/Yw[_oo:'NAݙxh9l9w-gΖ3r^rh97rn(o>Es>-|}ǣ>O/_2|AK? | *;z 8{EX\O^5jX|*IwR9v1ԝtНRsvVo9*N*;t'xk55^DuFAhLT?|EAX/Ox?7<|/x7?')cߺ| #{{uJ+9IYa5or]{#S! m0|3y_ fd0stf`ƃ~0I^3 v ەvEvEp2 O]vV}|0e??`D#F#\P~~0.sk3vz3 -Z! v5JJەnWnW^z_ڑ}Y1nK+hV>q$ZBo^kh^AOŌ3j=p([sz?-%ZZ7#ai?W=c=~'i>hD'C}hgaWw\J{Cj Z0^Uk 1.b4ZUVP CaAieơPWnk;Ya\C:PT+PP E! DV,4*H KnFg>Ad9tLV䵆EX?+zGwQ eyhty/* =PpCqFiD`՚L#0E0hd 1~Lnӈ4L^_^pu#\ZZݸpukyukqխՍpuk_Sk*^S5̯&xM ߯_SWX>D, 8N%$8N%4JpSJTJC?uc<ƛ7y3Mc<ƛ7y}㾘q_\q_7?c9[lBn^Aع͟(:ewqiVjbr̞E;Cma`B/1!v,Od{BL0lBX &} 1+NjyBXT#pBp{O][˱O}V]B dFaB/MGYU-Vh^4BJYS/ JԢ^mX }]7%#ZB^khe>qI_4^D$KK%ItIxI_4.I_HȪ֝)TV]oXM պ:;VINT+Cl/ ~߲`d 61>1f)ҥښ{ ג\Qו,hAG+Jʅ(RO5ES#[POAgӶ+ z : \Z ԲWeZzֲriЫe븎/^!kH5$D!א HC"8$g4 P6f$ prԒQ 8ݱId eJ~"*e5q-sَn. &U)vAr.hZQjBTq QϻE D bABdG4 Qm D%!W&DAI{ D?-÷7_j]t?t釓l &]|!DQmj),D^ ک'^*'$,NhzBp1V1΅~BBBͅsp.<Bǹп jc)Rk7cUӇՄzonݔ paA$.gʨX+'ź:*VFY2(QrV[+ҐX_ƺ,zYeiX_ƺ, , ҐDK[v%NԮ3k׉hKLԮ]'<Mhvu=K%x艥_pCy?DiJV$ [I=? 0mO:Zu?UKKKV]U'juiàUjV#d_ 1} ٘lLC%m\ұ aN.жrrh/ܐ̗:u?޶B6e.OGl Du~a(YQ=Q/Py|6jROWЅz,Ӭf}' 7ЮQvݣ(kkZ&Qhyp1Bb~F٨?b0 SGa,LP( 0U&Q¤ѱ+bSRpNZZ'}ꑡ9tYݰᵆq<`@h=Vz~;tjjt麚N xQ:zhw/nwa/nw `w?~O=9N!g0q,v`+|}[tVhḤtiGg £.<3 Lg L£y.\x& | .chP{bӳ.V3jȔd/(ͯnW̹CoZ`=ħՂwiMXsG?>#d>#SsHm_OZ ƩWd^jxT=n 7NZ Ff;~7^ ~陋\^ N~V$Xj>8Ղ3ы C%FywFi4W y43 Gc<h{4ZK5jibt`bpKCS8WKn &FkϠ1틥]z:ݰW-]Mk>^h\;a m7zeID7E[<- _K/VOJi^F0j|Xۻth^q/FpսЩ7J%Bge< {)xw\J{^k\5.|x ]2qq׸5.5.|˸e|1. ˪%;#h; G= 7/^E.^Kx~/_ _R;˦zbmWvٿKi/[M-!zhXD GE-YZVyyA~js1(b@$a$1ˑ$)&IAg8F!9>ڰV9CߴZCto_w3EA1/d7|ޢ+tm]DvcEhG9h Xz2Z/ k[6iw zǥnE_A5b"+V>FԒbCWQ:R][07o^(aayp yCZ^ɰ@KjQaayh߿iCPyҢ(+|rIvɱf ϲh3.p`[sG\]C'PKVOhTOp%ǻi- !!@_}{Q6{Qcԧ.>[rhMKF{[ k`OMA/ yx"PZiZZgUq 3j[xξ3]h$6UA,]kL+ t HP?uA(x+lm4{WխFqDeY!KFFgzjsf7FYpvEAX/ϪԗMCjqvU@ltV`ճs^ёZ,p͇yh4NH2#\vdZz`s?E]-X@,1tb w=3^9*N8GZNA?2=(à_ J}Aiנ/Y9YYi1S7*hA>v4:+Gc{i(zZؠoAX3| >N7B2jBP>"PXnY(-Q?cI꿐ߐ I?$zBx_B/>B.^^nUo]Ux9 t*TUEUEYUuTUAA?⦳%:xoK/wrzbt;z+bfZdt䋍q;j܁gPvԸ=k܎YԸ5nk~I__EDKK%QtITI_/_Hxx//^ _~"/|RU\Uخ l@_UeF˚;EKO*& rMyMryMrPraG$8%O\pCd%Y,yI_%dK,$K^.ɒK x@kKPNd>N+dF‰@nnԫ^[AM54oi1oC˛[C.V tU-|U4FXK߂O .}+/}K¥oo'Ioҷ^KxY.׾o]zY.׾o\h]zv4ԳSޥg]K] Tг%=+hg4 lLS`b?#o nFg#?qZiݣ }:0DQ'#m_ bѴpHd@q @y8Pqh8a8ǁ_ lllk6k60Άl bclllL!x˔]/SvɷldSfM);^߸?̿22e.O.?̿q oאkH5$5$| ɼdd0CpH&bH3ΝJK -+ ;-Y>4OiuAXo8 @]3+ @`l f@3p|a1ߗۂ[V^3SڹC/ճE=]8Ë_'^KC^xY^8/V^e!/T^4 ^3+X;ӊnb_طud)τ׻05k !`ࡽƣ]Ax<\Ѯhh8\^Axk<㑯&^-QZg/-O8CLWK&^-1^-jG7׏߳]_fCfCfC˳l8Z gC޳зC@p(};qC& |Q[~E /*}Q ]Ysb,`Iԭ)jES3u+|ZCCROco>}}I~ƥ~R?~~ƥ~FV?OG3T?x~-|-Zk1k1bb<Ř_ccb1,N4Q$@q'$(NI8M'Aq8px"JBb]=iQ۷Đx~Z%|1e|ZuvzGDM媒d݋uVZ/#wFfi-8z2R 40q+04HW+^w$A}zHЬiu54JX/ ߁8TNe%bmyxu0c(8i(V(t()Q)AהyJrMzM*8%jS^S~1%ܯ/(nho!XnZg5`bR kpSC%P:JeI(IDY%$QD(I$zI]/I$K$zI]TQ(KRGIK IRYfj^cip^sތX}e9% %g8DmD2>ĭ k<(ZK͢2qq@g-/Plm3W](~sQh?P y UX%@/m xr5-O.V%`tumڔ^"?.A=}_Ui]}p¿1r{R: dcn1W/c_\9Bc1GhU48szs;sNrD/ĢăoAk>x,G#w[AwA1~1w}cQ q,(oxA<ׁhX I : a{`Ƚ{{?rw?r?r ޗ _B3/ |F//_gVB9dT̊sdT3+΅soũMꁿ/-=]ߺkgNq]V\M [ՂWB֠C|}ޅ/ t|zfgUuL?v?j MsWzZu&odI5>W}I?t!Owod՗? o_=G #|g[G t0W?LWŲ!-Z _vrnڹNl9s=LZ : t|djnU_H 1Q4nՀS8cFZk Uخ I>veخHԴ] ەQb^ەA]  e``n z,h0K6 q fm fB?z_2Luتyn/qL7ͰjFZ qO`e4)Hubr[ZvZ=TՆң{Q:G凾eo>ЗsO` !G?>!3| /K?P;/(ep`8 9XL`%" 9X_rp"M"-"qEZ(B%B}ۃv` T!nMRC3.w+^ YWheȢdKM毹Q껾)rFvzPX.+Ki//j+s0Ych(+a:]AsG[=C*vsѦyWBQζ7[ RՓ*d[nAXM_êzURff0Bvn!2ZŽ{!V(${/in4BWQKA?݃B+)ѰZètxGlf-6;u;v.DAwkuZCtϏzcnoyU:76uc~/4Q6 k$# H~`Kg 5= ³PxfF(<3 DagL/co|})?~&:㧲KK̬~&A3go':b,}Ɛ.ǯ'ڵ ^uřjߢmY"y9I:Iabgsn9'2˜9.sn̹us2V6^̹ܺ6 z4hE+٠`P*ɠX E+ɠ (`P2(Ʀ9kt~$iE$eVsgsKC[^DS-wK$-|va᠖lGuU:Ҧ)MG! 4XZͫقlUXVMقLo\`5޷lTXF}fii`<f!-c֡sOo]e0RkEZ@Zkhس&*Ojh\gKqP{*u*kW]B5^JiƵ_*UpJ 7,  0,Ī01hXa1˰Pl~Vvt:J+_ wb%I풤|,IrOvIR{IRCI|$]]Ծ'uIqR4n8[ &T-OꎓnIݲJmR;ԖTTT Uj*J*eQ6TR)cyqS1<< qyLywDŽVx eo> Зsۢ@[-* mQB[-J`JC[-:%EmRڙY#ߙ ܙ5;3i3[@y\tvfVwfvf`g63!]9nY࣫]iNй"}GW[|t A;Nph'||ƾfFR.ݺ>EmߏN ՀcUvU-|ZCSfV=55=Op<'@ `LqB|Be e /Sh\]xB|B2ПK۩1>NSc185{jlqĴPy8-ȥbN W̵sYN+Kgt'yi5KyI$i\ė$KqI$i^ė$y`\#q^#f15o5o5BKƉ8F(Y<d%+ىJVP[ y<orZYx 5k@or^5z5{5z5戃k@0k׀u ׀k;5yZmx (k MkqZEr0q9X̼0.r0rp9r0r0q9X̼0.r0rp9ru5;j]wP+A-jj;+wV+߉w]y.JwV z_}$h6 Y| c-Q GH$Aq VkF˞~#lì ^ktý/4:?W!54uV/aCctZ7$ƋoiaiDgIns7c.h9thU {S>|'hz?힚JKBkQn;mOӶ7\F{xICA} ¡<Pǡ  j(1ӲȇMi)[?V1,90{aDgPn:i*[8c.,o IZ_8E?ScZLM54y{3PxzQxzPxzQx[xߚ]ԕTcK~`P*C"|+M8(bcuGv=uCC)-ۡB7}Z~װ0^Ӂ_G;JB{?Jp d_@hƁoǁ_G m/kVti=qdiwai׳Vq7߬wAXlPP5 04CyR3Nꉓ8'5I8NjΓzF_wG9Ty ߼HpoR.h[{?U-'<|Z;8BcfQx)XSJLLy\jHyhyA0bi54ظ'\b]B^ !ׄׄkB5!5!5!ńPs Bi)-+;CqI+]SvrIoXԈOumoϼeZ蜗.Ƚ&iYkO_8&ZMm^gӂmXҝj!W54JXo6UO9Ӧ6%k ڴЦ$mZ j ڴMWm*6UǸy^zz-^nXByQwX1ڠ3X~'U~C-o2|B 7|} £d6u 3Y!ר;iFUn.WC7vK^˹ P*q]V$J75.ͭI! Px ei({1:zÿ{`3ȽO{?r3 D3|Fs?>#|~ß բ ; Ÿf Ÿ"?1P}Pcf/ڹ^;mnU,w^hU zS:z_{_F_ڡBeKr˖wbC?+Qxp[qv;$7i8[V(Mwg,<8u'*V3k9 weǐcdQ̷Q{ǣF}s}loüΘ0O\:IO{? : %`5$>.[M%`5$>.[SK"x ioV>jCwϏOJ'B&ytzW݊qm궼궉ȫnUw;XuSiOK[n%MbJra+{A[ .iX{Bsɽ? O(4Pޟ\rW' }g  |3— !|A _7V_sW}<{b{",QcU?çOA/~-!tѠiX+(hģE:tB1hxJ7GZk MuZEw~ާ{y(aW}ʽ߱gyV8Z+-ΊBIhqVܮp8+nWZmq烒-N -Nƒ%-N -΅%}Ph!vRr PV@V@"ij,f欠CFb>>~z_zW]zbX }߈EO^hzTH׃ m?tZҡ~`tţ[tT&08`{W݆W݆WݞWݎn ɫnO׉:k;1~b+cSohU _ss*_5d V@dBEejX zgmC9"@CWjE;$9<'ɞ~CXoy?z)| wCPෝ>pOf᩷4j7Xݎ5S/y9_G#/FXUNl{)/ Q?v"[R;1{4"-+*FfbPf#F1(F3D1bhM/8e_BWO/|! C?-װa*-6_>]NMYIvC'Yv(8N.'[VD=tb#}; qG(з@GpQ|'749OBoQ;,#q[E)nF2#Va~=fHX3.ZG6Ur6`S5V鼏vdA?MhBzfЄhBlB4 MMhB ]&t _/ — _/ —_oOl'͟7x%~:-tvī[º'tK@kVWB-X~<Z@W<{g<9[g/ +[@Zmy~&~ 6~^uor^uW>4u@#u W_3{Q/W32?K_0 z0pdVOVXVo,ijafu?[F:&A];t;;΁gPwvԝ=ΎYwԝug qqtBA:^j_-=C7,\G;^$.{լU:wcAۡE0e3?f~ڱ-nXN0cj=_=;ߴZEC0Vh+~񶦾yPwZ k8R9r=A:mk)Y^q9-^MƢ"vdloBg^||̻D؉([ &Ot j9ЌHMDzG-FW4xxi҈ҨʗF^:|*-_ Fv ~T>71UǚJrh@ TRěRsm/Y _oJۛRaxS*jxS-UV7z#`ęy,|_&޴{Ѽ5N1M `l7-M8 7-dop3qZmxӂ8j&"ʍjK2[&`ˤJ2!-2I[&"eB[&V-Ze2Lmն#"՗(pE^2,\ ] 傏"/Cg&.C2o?}?7>Gs|w~" C _vZP>]u/0ZB-͕=?>G#㏏ .>=G|>e|B|F| )ħψOOlKӪEta+iq"mnyĂVBJcrzgBs>Y'>g/>Kz^÷5ӣ>'n>÷ 7-{go<#/TӼuhĪny6;]֑g'k!"i3f|CwS]|1 [V|妥L\0t,.Ѫ_x><~KE}A/_}A}Au/zӾdԵ?@zl ]Kaˑɲ{}}oם ?dGdWkB!ͮ-B񯴟ңVM,Ridnh ۔J㰤Yxk}`u4tѠ!-^sO_o9-?X.EZp|MWbp+牓p\'N _EWEI'9l룏ԁ:;גrK3 ;\}mz-jl{!>|Og J&3ݬ2~ⷌ>G+5ܑ>FKU~mk_->s{]V«ׁ_rY}my=.k%pY_K]Re*wtYq:QHm?($? G!($? G!ף࣐GW|V뷑WϋV}\3Y;[:MfWz֌tqe-=mfB௨%Xf 7&W=Ua9`oKEw'> xj~ʼn}}_j}hl'  o5~a[~ۗ /uw[뚲j~g;rd+#O~1b5pi\X/QQh%GGK@_y kIDؒx~9+i<.|j)DZ?szCw:3t_=rZn{MvOi#j5׃w7ů5Z*^s~x=8OȑViVj{8y-;@-(n̞gQB a@8F 0@8ā0p v&4oM ߣ,aQh'Y|B.'Kex PA+t^?SP7sjsZZ"(V3BnVw񭶸иYo'sωρϙω|6~4C1+̰-z?T6ɑ %YѪ@ _V?i59<3y80g3j9k_Pw]mu~x B] 2BsԒ',^d̛mjՁR^_eҽWEٞ%Ae}XgY)R4*#9FVT+Z$hA -he ZhAՊЂ֛WO % *?_3~E5/į_3~E57į_¿W 7^r+W=o\kjʁƕnaz߸Z=wğ>tn;`8#?#~ X_Zo¤CVKv/WJv]NPwZ|UruZ |.;{^vv\vVBeg]}\ve|/#< ˗ĉE HĉEz>.'Q>.jx\NZ\;C$n . y- [r#+q?O/V+8۹FXhFfxߌl<30 (xߍ},KƯoY%KIƳ#x[20xgd<2Ọ̏۱:9Bn<{7f];.no4YPS8.Ai<<.D˳M[#6)SppN;w r)lgl&OǷ.όo1f'ϯ_זs.ACZ|%`X) H]+޹VֿّiJcr dYs(%tij3ь(@+=U- >Z9rz'Gӣ OYQ}BUF;F-YN" m Sx%k_P /YԾd jPPڗwK~mᚧ㚇gg55O55O/|m}W_#BG?;W'jަ |mq$l _[7 G$I8oռ[[Y>~d<)xg0Yh`J7 %O74[D.&Gv!ޫzU-~Zc苷z{yï~Fa ''Ɂ_bz/~Fojr z:(Y8Sp9s}u.'3߬#je'}Aۧd}>e'>)۾>>ggủm3~'}ζmmOb l],?$1++ג1EaVaO.wFXViLX/d\ŕ;//R>^$<^xh0}R@{wVOE]ӻKoDݥ'p]~Z{wq/͗%vt!i]l;+Z^׮ØQ\nNDhh(ڑV exzS[ȏˆdeF(s|Vpy;rz߶h'>s}F۟hm_mm3>~ F}Flqmm?z 㙬*??`j ӫz=?'Y??n|E#~ӫ}__~m/_sK|Z\rk~:’MSؒmXlK6.d㒖l\p&(ۭKYa ,zy[ol׍KXq_0syK༿bfVy_/ ڼ xڣz4xڣz4xG㩏Sxj6xT4n<&ydJ=tJ5ZRz"A8v[EWUwhC:7+l<'~vh١ѡ{?;~vhz\'J;4Ж ;> ouorpV^[fw?2?⏌?>Gėk/_go]f|A|N sǷzCC0v0Z]Vo|0~8V^j_ yFd4Q2qqF Fh#>GNWkM OQ]N U_;iډPʄsEm4nV}A/Ծdj_P/}BKB j_޵_IZz`XkY$%VzHIi*zk}^ڧڧo*|\$SOkݣnŸ~ۏPy4P񬌿>G+㯏! AY>[-eķZ,- < |KD:ajm莼ǩnA^ r)`8m7k$ lqjMp+PߺMO tk.nš[? ݿW- ~K>- }*8GVY>Bζrk|ߴjmܬwęw4O&yMpM}RW&NƉw.?')8qR8'N'剓p8qR8'N‰'gˣ?/Ƃ8k7AhEaw"#Gv3 !Gnv@+jfMqZEsm:iԅF!9y${<ӐCϚ o#C]6Q-qT>ƳםL;H_Gε_˅oG*/*cRvE;Տ$;Us]suux`TW|8U|;םGX>y(_k.]jPv]L-wF,,}#-qZFX:rz_')8qؒ/C0kaާ>y_7DHNG(RuUO1=~ƿ.#ná}}yyy]EoW\rq 5j2-qZ*N'/&ݽh@RTB FA@DvnvZ'`m$tZ 4t4T4gt4nO9>\JKV-'+Ӯi41s~~IjƧ zƳ^Kpu o_=W¯%I᱾ׅoa/fJ N'm3+ViG_8|&2!|Vp 9`}B;@~G mw߾A;~ r 䚇GnzS=SƧOOŗGC/3>G|F|% /ėO//__2B|A|7&ߜք?+[{Zք_+v_g:jD ~Q2~-_Kנ/?JƯךGy4yFk5O=rlpaS y<5Ϫk>Ӭ#k+KC5[rlp#kk~'ZB෨~EܬCGh?q2q~#qj`j?r~lw+~''V\Q|\QM ?>WjϕZ v/ sEs+|p}\ᖍt4g4Ӳ40UxZ6xڻW&w~Cw ~;"~;?~Gh=~Eh=~Gۯh=@h#~!~{ğ@lr_ۍ25(؇'Z.D޴wY+s~d X*me# le}Zi Bnd[bW~/&(Ml>"k[I]T rƲ%3BtBVZ=c8֤,S1`C㊋`Wo5Bn&rFL?^[#{[9)+A~CwHoŧ>!W/3n䮓VoL.BuxVDqXBb_^Bektaݹ5޴OGY+ tٿted &;"79esyB<𹴖tk\f{{.4|.Ҿx.axr^wA?(}ݹRz]&_GX۲Ow~/ z1lL.7ecfctؼllL. +rD)%HdR/Q̳Lv:#ǖ7z۞S\N=kUxq9`k׍~/˃ܿQ[VG<)rl6,t%Ap]Zp=vt5j8yב M8-8 px oyޯ!/e2D!oY 3pY+uNٿD-[?KhN^o\]Tނûkxkx5%o8% os#8[އVz{[[}}[} n;ɞ^/U ^ 'frqjoy:rz /ӯ^/5t!7eZ=.ۆ<;-EnKww#n۴@\}Y^\Jpij-/η6;_4GF7~zQ-ʽNI.x-[3{4[ }f FftZ~QV_PkB PEeC ǻ+;˱4+osjƧWAwqZ[ZeEN\\m!}jQʬfaB΄zc>F1c1p>}v>/ =ho]x\Q쇊ݮQFqQ)WFQp/FqvЎQvTюQvЎ*Qv4ЎQ{Gg?wzԅ͈^kZe dDxeus#{ھ3)^}i:E{v4͏G },MoFZxfr9D{m}j7~oZnx&7_'<۲=w8ߎd;sߐތ՗ewRwFdvF޸*H8;G:H8H*)Z+觗 Qϯ3!k% ,ǯz2Y_}zo~o_}ū<3k h 놜u dc~4TPUT8Ov뿀,r_}mqz" hma/5i0[ GV3Y QNw?rXkjdC#jhާ]|Zk5:N $B.Ǟ@Ҿđ&';qZ19`|~|ug~tg3gL89q<yoҽ}bײ{>H:N ]Q45>HO<<OA oOA>>y| OA~ ]lE'/;8:rH/;/;/;_v N71qRKWջ ֏lex :eO4OF/{in[5j!X=2έsUpne[%ͭp:̭>`7 |~,싷{viXGX/FZFZ#5_k$ҽFZ5k^5"(P=}%п!QT92VGando'({ /ov~Pw7_8rZק^!WaY!k*M} qq87'8^88^iTqZ/sR}Y+]8hqm_o[q5UX2u6kq{9\T G b2j!:1ٍbLZOЃSJW^$, vb}#Rv b^zT/5\}zn'楫/VoOg}E,EY}z2Y䆾h<:](n[.z_][EZxmrfKM[J_/"%T!l9"Ra3pwt=_sFFk2#jy52_Õ]'ZBs*덿^EJЃߐ!q}o׍hX U]OЇ#"1 PeQeUxt9-+cUk"mj5vYW;aB^S;?s G4rBVH6i/`4"H.#7#eDЈ&e#4"B#w#"]݉VzHKW'$RҼ&SEwHh_旺}F/ׂXPE*e+@?-/OJ(-Zxwj ߺ |ao::Z ~k-za5(}u%wW6`5Օ@d,Ew#HV=*a'As27nSp$lEN=Uď<]㎞VȺg nsn0__"^gdMGt/bucw- e+a=a>+a}z>}77(כn`9e}8ot totnn:9kS. UU^\n\#7vs| +ߏY8D^ׄ+vfy[v_+|/H:1/|EU-~Z19`hHh啑hh•h•z['}*}*IT>i_s}~+V޴oyꅯe}i;p';NBGiD-YWgw'iGX)t&~5=!-*V hrZ |@;ܒ. rIE8y7f^;u ^gw(q zb:rj5YW.'']FVZ39`9A^>A/Z:rNr۫Tb(>7H+VPnnhzh;8L*bt{]8_gJcrҾxmjE/HGε>ayVIʮj&vi5[[Q~˶GAo;~Coﶯk FI- b;Бc]W.+C3VgI6c+[wر,VA jvrpANQ4&fN:MjYGZK% |r䋆jUV_/Ê/ Dp9DVۻr ۚV|Mrkw8,u~"WA#Ǟ&Ν+[Sc Oyێ^k_:F| ڷ4/v ڵoqy_je hU !69`]¡8t)݁CpRCwХӻ@?,w,FZ#sXͅ#A|mcsğގq hhh`\4p^40.&.8/ ~_4hhɆ%j1ǪV5t9] fMj ꍏ'ĹpluL'򿎅-9JЅg ,mxzS$k4r me.QWKƗ//_># zY?dG{i7TrPuXTzlz5i\_P _N=XC7=Ьuv/w'9]-Dj*L?B^1ՅRCKu-a~S юw*w_TOrW١mza_܃:kxpODb-^<Ѳ#-j!RCW7::[ PgC:,{,pUgu|d$1ouadt/t_~W}z0Gt9ڎ=i[KW_~ ܨ;2vf5g ܨa5voBoQA1] `[{g^˞A1zB'~ϱ= j3٢Vij`j K8U z]J܎Ov݌;~kA/GȾul  я,UZjtb]5v9 уgrz3'iElQvGUX?uUZ!װ`H*=a""ӂ`D;4DZmڏ|Y}HN-j<[ES^Lgnn?rh6((wڗiQ;IuOWVIK[Ȩn ?DgmOmm'|}'S'ğO_9|3̳p<<3Gp!y$< gGgӡ㯌ψe+SA wY_4׫//]XptrY?”h{aXllx):ROq,rC_jzQ⏢$(< (G!łGQk~ Ũ(F}o k LkiaO`A\[=jշqZ QЫ}t~}DYߵG@pxzL _ 9; V3p|6#x?2?w|k[ENdsAM\iOHsDZ|Mrz?/qBMЄ;r&l♒_V&i/y]TMhEUQU[EUIWՁUI]T LgG7[HzBSԲݗ5 V_˽̣U-Z39`|=ףEoo};Nu rxS:U|ݽVӯv#΄_: m&|E#s&Ba5 |oo[(㴊)0qrS8q N'Nq4qrSp┷s3\%guK7iV-I,'V_r]ndk~/U@$~+Y? h#~~#~}į_3~_+ ߂kSK׫иV#V&7bBV@>^9^N}+ YD^UhX-kj!{6۔u~ۜזFY_0[![+,.zRBv9Y2l ?Y0i55ؾ>늓+maQ~ayAn5`ٓuDBˆYyZE|B_9(KZ]_K}tly?}jՁLQ4uVBp 3fnz֦PC#ǖGBFv3U- >{yo,1wp Ц:rlw9SB=%ڴ/GX1|W|noo9>l66VL^f̖Mb!VNKA a2=j=>E7am*৉pd8)O'N‰I8q8)O'I6 _ 4|>j[%g\>[YT?㜧UOh< p6F!4Ƴxߍgҭ_V@|Tkȹ!њjWu=vC5^Qu #ݜEe uHLQvq".oGEGD;OHƗ//_># |l_>ھ<ھK}hh/ﶿB>v![7-s\֯[s!]֕TmLBU>+/,y3yy3yyy/WMlWh+پmo=7v @UbU';U- m<`ޗ༿p_y_8 +z-t_keߣ09-5~/OTWiH/]ЕO rZ4C^[I4'OUĿׇnKrJ CW8Cw%C ]*oCǿ}X~y<ﯨU| yO}*oF9á[q65݅CЭyV nCЭ8tЭyV nCwЭ8tk¡[m8t+>tkڢU{vEk˹cֵ[ hUEڷ-Z:r -~Ch->Ē%l lV5mmwy8 yzyqy0SV3p8Gz[Sŷx?01yk[|w!{01uezq84>DxG㙏3xƳ/\ Tnuz |:iDiVM.,]?Y^uZ-'NYtq,l>6J:YV^s9-(o+m_%J3b|ZE{]KyNC%.+8t .ݽכY3[h-vA[ -g+ >f|HIgMs;>d "x6N"85]g*ெ7!}+H|B;7![j;Б֬}8tExV'N'O|"xGXs7o5w}0㫻ϑVp0tW\:N`f&m+Èxe{(~9 ڠv『^/xA>9˶_AvEN5ik{:e%< *'%!v9❓O 'N7?:r_~/ ;kmbķZy /dMӕT9j*M*n1 oͩEt9-}{bVq2%gl< 0ZԂƳxFxpy7n^LW/ѭE]2Fb{1EZ͜ ߬/~Ԡ/NGN,M8,ޯ?|`#O;ۅ}G ob[n5B M^ƅo/zĉpi|៉s99a,%zOĉsO;C0)UQ=X U=X= =PW#>fQt[? Ϳ˽~V^oG9zf|ڱmxRmn7 ZugmXaaD>rRu/We y0N^o>چGA=> GAQGAQW" Œoaooa·00[x[[-L0Y>΢8΢gQ8,J8,?<GoOyndv-8t˸{,~]@s@e͚Bͫ%n@5֍g0Ւ% :0Լ?D'>>MC>1Zyۦi&l#kӰ2li(i oyg}yq<3}8/Iٞ'%Nzɜ$amI`8 hR&pX XIO&Ns)y$8'NI8qJ8NO[.Bü}@H# ,4S83oVGXo&iX{l9-@B 59٪fD %A(fgGƳ\ geYh<צẌG1Ƴލg0FV~ uuW~.| u _]oo]) _'|M o% _#|—R߱~]h伋L0QSa VMU׊zk}Qm^yE}O?|WǼ}9rzOLYSb͔7- $5М<k䚆VIybM9r Ͷt⹦C4y8yhۑ\ΆyۛvHZ8{7ViM^,^ow6i _V, v% 4krͭhU ?։Yg?ww#~!~{ğĿmOmwm7mwna\Kۭ/KUnGƅOY?h?-9`G?d<_῾zYW] oU`t5Z/+GX#>}C80k?m{?=QO9cgnuk6xT4~4h<OM-7]6d'Lڂh]Uᵵkkp8Ǽ~XŸzPt e0Q8xZ`L\S!wZx* ֎ aE~>a}BXOI~ppKpK "'h?K m}Viag5z͑VOoգ+9@SG*Mljό?fgƟf|B?~?{/7= ލ\,+g|%7eZOxoez -;> z|򣠏ᣠGAoG!ףG1GAףGAףףG!ףQз<>G1|Q c ǷvZiAN GR%#Ϩ}B3jO}_}FW_ ⯌ψe+y/_ kMw?6 \2(?JdWn̕/Rvh m=pkh!5]Cc\VտYS9`S|=g_j-bo9`;!t$2B6fmv*nCȰ8MOw!fcGj=j}^G_f>Wį-7~+e ~o=|ymrer% {yzK.k%fU7H]So\&W_ң(&>EGQ(:>G1Qt|Q?>G#㏏ .>=G|\" -koˉ]䳓; y5kM͛Oڟ}FϬڟ?Q??Q]f_om%Aԋ5]Ҧ\7kt_}H>ʏ`# |#(?G@pψ?#>#>=_dtѦfiY^]N faid|L Iy t]kP~[ҵk okP֠tAm 5(_kPb oMGYeTԏW"9'//EW޵w]Ҧ';].$ւwC38}HT|Z[|HlI$Z{mfeݬ#A_ⅿV*JqijXrZu| p6Mt'm i&K9oDڟ֮5jE]]O؃ͲR+j>KsQ1;GXo1u3K[T.>IJW ZViLX/M赀m R:ig^a˼4UF ֬FE7"Zկɹ]ڷh߮IIIVڟ:!>6uƐtz,iuk]ᖎVx3ѼWx^@r^Rފt9]+19vV=ǯ+x Δ WZ^VR9SNo5՗GݙҮVr\F6nQ+^ɉ],Ǎ[/ZDѪDm7n {\V?k߲t!7ejIۆ^Tztc{z#?ͫvE"p7-t뽮K?\JW_,V`!K:e }L ͒k.+i0SA~0NK {?JY#>2>}ħG|B| ??#S,^xԗ~ nd+Dsn;Wu9Kz1~{_?_;5W_(_f ~+w|]Ĝ]<\Vot2,͛]vƿP߲+j[~CW~o_jo{#~G]~wG#@G?|*| ޔ zFZ$nvU~G6C[4:rZ6Ր~< oJcrڗGj>j__3>G|F|tuhJ<^ޘ:e* o[eg:htXz'nH~OG7ȩ'檯U;|NiA0Xr2=X+8,Q-yjo5>H#2tB;#wV!sΠ19`=zvƣGYŴNh~BC'ql%ZBר[Ni5`w@:a-]ShV~ٔZz>rb|΋xD`6hU +Ϭ'ڟYQ3kP?ߵs<d٨aȸ``f\0Hnj'~,v\0ߎ/kҏ-.o ldΨ˚!y;Uj;^$ V ~\O.L.ۧF {O, -ӲioZ,4ƃ+NT,xx$8ȻH6AYhє{#9|zi„ɀOp[q5G}=IR@R++'j}q ;dk$VZ(TUğYjU1,Z[@<}ڧhJg3jPPwU#ĥ;ťegKb-.VuKk& mq4GX_2|ėG|A|_%C|~—Ge=/_oT>įKƗ]k%WTEuDE/5. .rNKo; \CFk :r 5kjf/~E׬8v۩ؓ2n Y]:^ AYk?c{hn0biX]^]$Gso.gz4WY)>/7~} >¯[~E o/;o@WR*0q:k>u~dpfM 7Jj-,&l#'۔Nf/]8zAsRA)}/AyڲM~e ]YiمEtcR>8>LJHtMγ9#ggsqG8nLp=q73y1&1c12198 csA8ǘ8ǘ96`oX K%KB ;ҏ+gk9|<+(YA=G.5¯ /PEO1 iY*_]ja;+`=6ʯ!$իCyKH| z‘|aV"߮Xk}yV5L_?-tv`B7` v](e.9؅]nHW _ O2g ur/5)/S,[uy.czl.R.HqO)mXO` B_ShmXK7] }^}˶e[{!l/5a{&;ZKBAsۿ[ұo.RNLW5+l%o]Gv]ke3t!"C|ӥ.uC]*t)A|ryy6޴.+Rq)/⎺\X)蒲>}$ْbdP-'}4c٠ -(Yij&En!dPܚ} ;fo@PÛ= }fCȎ;f;rc89TT4hr 0H6LD|GJZu.a]WΡ벎i^CuCD⃌)3GO6^I4&ˉc;4sRaI%eMS[Ƥ|P#`v3I &i$fLRI$#L"kn[VM.ZN*Bm٦KpDvR.qA.ti2KvĂ.eG;2qeSc^i&6>]& PDK7&Cȇ;h$y*9b&Wcbܼ܌`h/q+Md='EܠD^RqC)ӥ{9ݜd.cf$eg%+͡q.>Ix*uYdV1 H9;z> bv@vũv2]F{,sTeiZ^F/S-@vu+oWT#EA O;ßyi5AZ6>d ޠ޿K59a ݰuA  0 f)t̛.#2. ˼BAt7]fЅܠ"y4#eJb)trhO&&t@9 R*"b d][ }l=ǀqL-< }|,I`d^{٥-Kh2OHJm^ Xx+gIݑRrף:Up5N/V]ڎsP l&Lõn`գ%Ȧ!>Dn Lt(C%/B|4^*K/2ޤa+[vm)\‹.勵Rtk#VBo)xhl .E܇.뚜]OYkIH~)E |)`knt_ .RntA›E-;]`bي2F]2<'_#tw(B5~yA-m)o$736]>wgBu)ե&/=(P 8//+3oz͔R\p /!rm`%+h9CUM Vɲy(4&YPCK4u?õ:[PΩ)b?vbiRJ(Pg6nJv8@򙍴 )ZthҸU=.awjJ싎-_kCCL!Fkݩ1|LΧV,;B |ˠm*VM?jl|j վy:O;4tv:OC|JOK%}%u9j&Jed (p>&_R|/Ӥ2`zO gޓҭ$=GsdiI{R:{gI{t=ꓱ΢f$($oo/=:2Iek:Zo7؈雍qJ#ޯŲ*@7Irp-%y\J5cF$.7^,X !x KY%M{CYuϗgLd'm+ ?S0Eq6 JQQ.)£8 8)Q@gq>z"y%RNj%JSTmB%L4v oS'Qz8B1Fh1SOԀ|-yQD RVǭ 2j02UKeP -g+ƒC*lk.)Ыdv#ύ\=|I#_luCtaѩ\ːa:LԡA^?g\eT8헏"BJ(&Xe|/qɤ2a2<~-"vR% E;;DrRC.d*e@nq?h˧5~K(S{9ib徜JxKYY/v-&oJ! Vh&kibKB먂Xa e_հYBrhq|`Gz :@Iga)p )RF3Tm`ag&ymcgX&yobh|2ЌݻePB g߮}zO_:᯷# />geQŶ&1kʷv8-!n4X~G wNykgڟ~S OAK _" < ;m{vcBs DHɘɴf J\ R ~=kb7z~Xk_{گg7_ÿvzA}® O{cPo+Ԗ Zšf~Kdo rU5|4E4E)ʣ)=iC E(`R1HZL_&uZ(`=<),$JIX;,zE\ ɰFaP+,j/v'6W兮 ةm6z/^̕4[.\H{7оd&Pҫ!۶Böζ޶vo t։ڣ5tv:Q{Dщ:Q؉& Д~K)`B%L8y2 ܔkt[XPgZ$NS&q2XLN45NrΑ0DdzRF35NtDNTh|ʼnW;axs?!bzX!Vo#V`zZ4ޖcX!V[^ _PJϽY_RBrΌBe|IcO| C)SdzJzUA6rXT7PrRITYXa@{: [02aJ,+e@Ķ}a[87H;nM  R2Yjl 9Tq{[mְAW6H{ at6H'ngJn6H9 8mqBsO!`: -)\jCT'|t։MDI4M9:ѹI7}γCء.P١vP'vP'v;yv ;ԉwϵO?YkH'H gNsF:qF:pF:)ttgyna $=+&b;wgLy,fL`/<R]*ߝ';>.G]wL*j?*]4) X9]_eebvl%W̻e5R$|58WЀUtӀP@ VB 4Ԡ--D ^Ua/M^/ VISI+R.?r)W⽣|ɚu&&&oKʚlŒ/ot~o|jSƆ,i. .I@;Wӊ쐼v%mA#6x(W=ts"]*ՔKKԌ#hVhl۷T_#-h%T0sJ*ee;T2}f MTx7 ?K}}ɖzp^6irK}u2Bb$3SM= RN@h" H&&R4l"l" H&&ұ4l"DzW'xr:WMݬ͔P=EyZ"b/u^wwl4}~{?l=4u5uuFozFC6'''[B4B4n}}R }ҸI3I#I>ioM1M14xkhu0Xa1nf#:m1¬YǸ:Vu0:MMѿih5S~X/ ;/ICiT9c7R?C%2 CӭrQuuuq_G_{_ǭ]֓'Myz|Iѓ&zҼ{Mi usna pJE]wBw-2n;. a@![C!!Fh(4!4]R\ġ6 ܝ]\X,tօT]6tz8рq.6ZaEan3fP+̠L Vm,AQA/>t)R!ͫ&gi債]e.I& d&+PI_l "}EW`EkoZu 8%d"w_0`ٱ~ۻ;GŞ`TFŒQqH FEJǨ9tT\0*t|CFŞ`T6*STF*S }ӧ(ZS%>zB>U>)O||٧R>1 Q(Fyjq7=6W/77*Zpr}T-FFZl+F ݨ7*Qݭ uNU ]$PlٖxJxOl4UJU Trƕ,S٨ W#꒺&l'oM㓼O+Tphʆw2ȆWѴ d.WOGU^9xkdǘ0=nDA =3%RoJi@nk]j0E2j2!q琁C9&;† 8dC%?{haHAGNt^׳wlA>,+:I51JҔ:"W2ŲMa(e3uEH:"Ch`QZ0J7J{4J Fixu&ykw8>O3j1Q]&,.o&};`;'~~O#l#2 Gdt;"pD6YpDYL9+r]u]R S) Aٍ$Xrkh&@-mz$:(RLX |~nTsƯaRIːC>4ŵjKZWR6J.E'8dQ\--夆3Mf:6]^J.yͮ^U+rB5 T y^ز ؿ]:@^u922? v7O2]v9K8ștrp"Xr(e%pe1 ,p1 3,Ęgb1 3,\c 1 }bBUzA1az +0-xW$/r4 +e4]wnE݊>qn5>q+[ …<"""\L\ \s!BȺzp[VV'n[܊yΎ$\ם$1eL//S,t.(e3\u٨KWPZ~7yz̿Ll%MNżIV,)%JxP9 5>补1QBF[y3a4RFmDt?=.y {^:{^žwaKG{=/{^:wvX6й۰pp݆ t6~vws;Οx}ҎI]ג g]Ϯ&)Ry*_%g EQTLA~)Ӆ\ RS/kfMj0M6bOB`(Fa9^*HmRO x #&@-e4X)N rQ&BEUjFSVSqL)q)/>GvG nn[k jknWxKtv v#a;ҽu>ؔR7?$u *e&ҹszhhsBr%t} |ɒ[]5׬T ^Xwmvjf]\.@6clK0Ƹ?! St|hW%M)e4Ma.?GŗhËi%6E5r5aJ4+ge3Lp=C]^ {+"劕yi~ުölYoKy'F=pܪnѭ*U=ݪ[etzUCVtn"֟rRy68jVJUXʵ0=)KyPz$ Kx*ՇVQy+X5Ή()EW-;ĉm& DK>Y:akQMX`%1 7ͤ2 hyX#ffojs!$< ?YoV_(0F,>^ʈTRz4>!Cק/ %jW}q8`>eb?4}b\j[22W4Z<{#N.kSLw/|B'|YO'OX߱Yk`{+־=7³.ym䬁Y*Z*U*Y?lg J1ipY7k>Z ~?# w?%I>,;K7XjW rрPeoUȇ/Z\&@ZO2]}+f_Com,|٥ Py!t^Rο)åq@[p?N ?8 \v\\Tގq.z.z0um"¯vJum1T&*|nsga3Χc3g3̳YL|̷3gy[癏3yy !|B?B넿@O!EoŸO)}>UUdѹY5qUU7جUUt۬Xs]lE\-kk`͕ӱ \ \-k.ʰ \3\3/WsL$s%xs7c ^cL0txf~h7WdPK$ ZV7rj7]*bfĿbyJ mFη*-hAT̄iQIz6Aqn9Or&B V(7+V(V(h &8k&@)'D;yxS]jƿ4t>ᇇAPx5i-&d8leOk“yԬkKm'j8QG'j_rz:QE'DtNTщDӉ::QE'w'7+`PoV( 5XެP PO+tBE+ЎYKԈvQY]n0:*0kunS Kڅ쇦_f\j||X&~у|5?@{ch6@6m{<,ڶm+m*egr^YM"Vh:pvC ~!dž0k5,lV鏕-McWuЦl) o;ou"{S7};df  H$ÓU$s([$j 6aΫ-ɯeՑ3g1ࢹdҘWiw@f*} ;reaA+Kb ܺ@|D]\.XWd⺖fW&f͔2긴w)B>V~ CJ&XRA bGu7XR ~eeݢ/_/_.a[B@c7IjKݿM=#buk?:QpެI_UZm{/-},'D# |i_ɳ4 8%24X#P+a'K:j$}JeU!hVb|B$.t'3_ʄVtG~tSyJpSy<Ŝy<pU 7yfa 7ъJECxeR0JRXc@_d@ĉ>]"hLZ)瀶Ƞļ>4mVmَ+vv\׳Wkj 2G;n؎+zo<-4=lIioB@bK5:W7%dw+mZcX~{OðvOPW-ΪCv;H͞SJMvRzh34~k-40+]!!n”| O/i}W} az -`͖ap?|Y/>sV̿5r>%;e/|X5}ݱq&黔zWxJxYIK|#lT\q)/]g&4AqzHa|LAշ INIe4҆[5 sZ%0e_ ѭw& K&gc5EGѼ'WFB礥/I BËArE}L*ZF|ෳO_Oa9'ڬ >6rXmvI96aD'mIb,6DZ]lYWڬb쮋6DZ]lI.eb:Lh& a *{e.m/K.v leomdwܷ]1=i|LTSbz7ʆIe4R7f;TN'>DuUsRYOnUCISӥSJMI.6 P6S93 a𗖾6Xݤ2K.$yl:T%} zY{f|B$1I헽& _\^H.Vh8‰ۚ _HU$6-D;RnOKy+'_ߖre6]vh|s! +'f|B4<}/BJMɥ| "j#r ˇO{T&2oO.4˃%n.@7Sߵ1R >+U廎 L*Yi88\$~!|wV>d޲b|*\ VwW˲4!JJ ZJ %~9Fy+WȮ6Qߖrt:AoK .tA|%](oKu2›'"mM k5R0O-XU3^|3MZh/O˄Iiƾ!^դ lTOxlfR0JM=TTQ=)5wlajf TrUX/zI:?2LZ5"S%dlD 'n&!6/J"i?JMs" ꗋfTi^.q.mŖJ\T>8+: &VUX*qvj}e3et/\‹o|ҥUF\e].M(2.MQܠ-Uٛp;9BMK/'ĖjJ%]^SnR0 n4X7B@bZRN9~0L|RF#|௳>a_g/'7*—E0nKzeףw=?sw=ZRFJ5t>AN>? k'OGsi>ks'>dY u 8p&&A]KV:$ [DeW.-E1R>'jS$쐥2avٞ3b`1!) aIKi'Dq?,IYG8M*XiY"_Q-ag|~o k?_3~r;!~QB$0٠Es oֈkJ"V. eMr6 bC(GC>VBPΆP!H?iRP!lG#|$F>>,lYw_xaDQʉ3; Pia~)whCNV巵ͭ.)[SGST4E=MQߚ>)GAG?x4: & ~RA|Bt)*~Hf*Vψk?~f_vooG ~{ =oc.Z:EqƏ\:ltn>mPq.a.Z\*¯aڡiPv#vXL;,M2WU9#=o#].D^LO9p\u/ZjiGR~ޭTvo v¯!vo"v!vO-#~oGŸ7G[@?_oW| >Ÿ[D#OA0rJ$N{Si|BSɧdSz>RS|5~'ıOOGS1T*|>T_op Z gbƐ]yW3=½>h|BtW>Y+PIKեH }Y}ﯻ I09!2qƐ@mZP)Fd('Pax|6t `wr+LIKAedt=e|n1/ٌ%I Rhq_X?Ykc폳ڗ _o"SUaQ*RxɜZtjxLbW}7L(tY\*I 1 ~cieϕɦ'2 񙭔`uH@79g?'3weWz:Ra׉Zn@-'~f[xv_xG~0LZ1)B5ȏj/L}ͲW&,fM[X]D;NgL.BR4tT4D f т! Q4DGC44Dw'-|r= a*T-ݶqCJޥV߬z-;` C{R.%ye簃ĭޓ*S}P75-ܝ!@gFp~sg7gL4Й::SЙ!1pQq8Ds8DT"9D ":>D|f0hF2p5NPj{r_ו Nz d=T@%=' p})s T_RAyx{s=If"CwC75Эƃ[Oj7oj<@^wB-xuZvֵ$ƼJ* ¬AjR?K2Le]]rX>%BzA\V~t^^$"i{, BK7&CȮoTi,6kT -R?|20E >$T>dd4M_|B@:H_O C.HsRc~_g[$f8K jPz G8`{ |CWD+,D j𳼼@d8` #_:=IK(PA*ݮ~)t;b 9Eϥ_u??qK)_[Cm[͡~~+ߌa~r Õ򿙨j\*Olk.p:L3K[*hW U5c&ԙ\=grfrAɤ333zճԷ >6 mTl ʷ@ylk &(&_1A;᷷# 7>?O k_r%—RC # !G_Qnð<( A{^k_ӭ/c@_s9~:OG_04>AM4C /ω&WiD[k~SSb* eKUxZv )aɥB$f kLPa6iY[B Z.G«? _Fض2X~l 4(o%&Fmk/);ޤiB[AmFKnUIj5@C3 pV4:%~' .T%(,U}}0L*Xi %-57[9+'電KͶėz\1ކ'd)mCL|)e'DLP ً/kZh"\%}tkP4&n|Lf|!IeKiSy[)SyyzGYlq㤌gg2v8v;r8q8v8)cY,gY㤌g9;Άg;z嘘FURTEr#_r`rrH*p]IL?k[T׷T ><×gVL?IWut+U2.s81IdҔx]$A11I$&p^1yNxF2)2\pe݇ tU"Q~ CJ дT咡H]~SKͰͥ|#?_crXk Wʗ?_. ࣷ&qxKTtUSDHE'鮠XNuOEgH*: oAHFGMF7A6Ep N;ǘ=a  "ߔڞTM*v q3XfL1)#S)V0'2o]'̠˼2t2.C]}Pw_Ԟw az -e'D =/?ӔK1Ld] iR bSP0źbS`u3 f XS,],*42Ȟ?U >N$&jR@zg:`=pᢔpQEEE: \.J.J}Qc@m-69%jprOp^|vܖ0y:`=f~k?\2^r ^톁dڇS{ R >I/0X%$/Y>45}R74Mg=]* sjhFB`[k6>!gN. /xof2Q5>][|4Q h?T6Iۦ[d#!|G ??_߄}?3cK >LKK>|_"w$p+t>n5*w&ҎD>!:w ]"V%k4R~4p`*LzIIC)0i(4?0iؿ铆U`Ұmo~Ew٫?k}Yv<rţ/7z-C>̈{筚23JU*{M%iN JT "aA=*)%ğ. b|Bt\P}DR_|E J͢ e|ෳ7li"l q;qF\wl q7v6↍x`#ng#؈6v6↍b#ng#؈6voHи%hii)eÛ,U׽i/Ȥ2s.[r_>"p7Q.u&— '!op6Z<fьd|5إ j&K;إ @s]V5]R+v×bXڇt1,DYBy8\*'=!h~I*|yǦ[6lh9c-tt 4ݜ閳6ln7ݽL{iŏ-— |hЗK3)FV$50g^ M PR%{* Iew+r/7*ɥ=]h9' a^ jJ<ݤ2a2iԟ[~G;S twT.Qa *Cg;*6NF5bqDk#<,0V_SshjKnT+k_"qubO`= LTZdDø:y֪_ָ:vk?k\bmߟ߾W|?x?No}<@w0u^fPAr9^L.-PޮL0òR8rihMG/^,e)ryd !> @3yYS|M |)r?(ba4>hbgԱͳu-&A+ #` M04 `Mu(uO:E&>A*$}CnUHkeA@ ތ C) FɎ)uXAGeE~KM0 =iK:'у''D$zIID' !T~Mof7KKhbC״\KcCͦ%CI+ >e=S/0T?( 8>%["^%b/O߬}z{rwʞ˞%_P=ߌ jh]*5LfCn%Qrko ,g-o+~[9/_[2_`ՂZ:WoroZɗʁSKt$+*4>9R#DIyRvg }(9c#djڽoRڷݪsAE˯w,z-cKGKv~ْؒ+dh,5-bK\گXk_+~=kbz~گX^|k~>{0w~$Nn6@-P:Rc YbYXbހtu ʅv!| &>P]{~˥VZ?0Y.&CoګZCNi|9g34abZY^ q _nR&C~_Qi;s,or˓[hvn*>ZvPSqssoJ)z"TJ{"%7ޒcd nɱr}|%7G%T+slEq#yWofoZz4>!n eWiu7{ Y{X:᯷# />XƩ9bCt a2@+eJo ?cdױ+tKxu%8ǎO_M FFW4^}?[H#zߐqW eΣR~76]jp?To!—+ Kk7>!&f]wLwvE08'yMJER ^qU٥|΋=dO+%^YOZJ;W19F3Ӝ"9!?~| |g}W>} wBw[^6%@-*fV!dc]w+9}vnR:$SO` 5}S5_р|=ؔW1`~|A'Dǃf2}a )b _. ל7[UE / гt jIg|EY9>gCR >'Pk de#n`I7>!e7MɥJEk4}2T:_k Ryb٠#j\P -xaJd|ӥOn|f90S4乪h{a}UW4NH/"Oےfnz4gVަ*et/\q]󳌪\gvɥ%N:TQ.g*ĴP\Э]f2Jh)֮]i/&,a]([MCYucbⲌȕekL.QYeCQQCdEI7D}3 'Dƨo%!RR.OAc0Beie}q 9Lhdwۥ=n!ch6l|8=jGQQ=x@G 5NZQ=j=j聯\GdHɋ0K)>!H}!RpIeksA)x&YZ.3Aǃڭ\QZ9Kôi@+eg 'X7XXg#_:U*u3u`[u+upCuOtD.}AU(1&@)eK%|j& @KR)~.yVڲ$VM_ݪ{B_vCj鍸@Zh6>_wT/Qm#J0ZB PhxS[w~R ^mJM@RI =n4'II+x NOj)x >\/&+ӦK)E*08l)f ۲3Ƈ=9o .`.B7Ѓ]P }`ڋ5ܢ=K^GKJ.R.Xl%C.d;p].`eVqLKKK]~Ir5LJ\cT8?|Y3{^fZf'DX3qY .X3 kb|5?Z"ctk [H*F:[batk[EI*Jq$Zq9{#71ljt`2^IqIO?$ē?˓S`|3E~0E9"`|"5E~4EFS))2"dER&d_0%t'ۘ`-g%>fR0J RwGa+?=:ʮ뀿[8'+ @1>S9OKS<wp?4e!SLH>5l|IOQk;u9G_~y_/ok<~/s{MaّeIE oQ.C.oQo*+gW_Xk_3~=kaWޛeٵ\]&DЎl&Zi?w؃5Pׯ]ϱ|F w(.5~S7H-n( -cMi5pUq8m{8mU=m :N[=m}6xoOh#F,%LG&P+U4;Iu2z@=gOMJwW) ,GJt=P/ۀԃ& G 'ڻC}uDrs|F DR92TXr(iGb-BrENbA3ujp<_Ru^DEEMulWTR([+a^RҨ5j( ;博픓_Qd']*uYeGYX:NU[zhmh6x\? (ϿU!1%@sysK/0GlTjp9`^|j >g/;*JK)WYXWESSQ^ !wOՊC}P+.홏~zX3\c+|Io7={yπv7)*@3b'pvRd_jX>^Чi ,u#>ψq/gƑ /=fQ>Ě_߱'~kaw~~oX߱[XdzZQψjg$Hmg*C TY6羂4"w/}Е@_SwԐ+*\SHE7?7n<;bG_Ϛh<.ф"GjKREsHx&x:D㙷L43o!43ƳMh6i f?Ոu23d JdK-`?RA6``a6a`aw n l@ Ԁ@w~!%Rh|F@B;[8RG`ߴR0po#SovF|H\joi6 9R;D÷4HEI,5A6sJ5yXjRx"5gHMqVKՃ|e>,TQVvhtC#h2&]PBgJ^plʥ^|ք!JC[i5i암I}JlYOQ`1G ss9.r-bN`1ZsG(嵘fPeC zju9XX@Z2C [`|7i7j`}4>rlrW=.೅m>^$G)Ytk?egcM|/oH]*~I)m9Rk,vCT >٠ӌ@=F3G>T%2|y]ӛ_)fq܊Q`p+]9R]DQJv+$cM/h<Sx:OT4~@h4዇ qAg? 0}zT4lf zmK| R3,x Hm(U4@8R~6Ƴxm<gx&@㙷,4347l;gGb:\1hީFi:J^f ̥*CIixi ˥"3׾vE =>ĚwtWe<->Dx〆7:٥"ٝ#]ZQJ~ndno͟>?mG'4zܥ#G<ۉ+>C+:f?6Pu|+%{;‘ڗ'67Х"΋bR{}|5as5@dD^jg~` yMGjQɒ)>yī?DOS?]*E>9JMqAE8sq5s4s\t\3ęq"=sC<>S}6H/#J gJC>7G d7W|?R3|2\}[eD'/5QR>y %Q:|2 C-/k6hb[6>#lChm8R}JMH35W2Fe3?͟<6[8|mQU:g*^~c]*6יԎ:doyZ8R66BSY)tf ]jt5L>R+ޜY%J"u||?2=̒˨P1XS3so;]1[fqx3O‹K{E5**{yDTl Y|='bh^vc%ՏĿiIђ/X,|o/_ rro?`ڐ`zu`l#gx-*{*a`e44G|hacGihD#_D3*bգTtOC3Ԁo +ne#Ӄy0ˑ: Ⱦ9A3 >Ě̗Ӣ!x%0r4xq-^Ұ*|M^A49Q!?Ԓݩvꎝ] vꆝݝA悝ݝcnةۻSkan ,] sG0ba] s0 sj9$`ph\/A%KNNrprPrNY_ķُZ4&yqrMaNR|ڇꑭTez": 70Q0q0׆ F+l==Th|Fȷ:pHU4REC#M1?4kq5LM1_M1?4kq5Eq;=byo⼷pޛ7pޛ8{ޛ8 =-&{=OeBgَ=A>eN{PD}xKq5v1(u:zu:FpiM+uE7eUyNإٱ~L JAg?̽47Ӽv >ĚzvY׳ ׳ug׳ ׳뽞(xvtGw3IJA@1,6xev @Q! ŇV}ufwoO +h<|kY_5|y-rvAu*-$-8-b%׀<'-@14L㎡a)*0F0;F0ia z~_~|~ έ3ί\cڣ8*xt^l i+7Dj~r?)R^%uꆝzWWԂԵܝ)ZjܩvUSE~9WrYL=}g3Jԥ[hcgT.+uYruPu+?&/](JC.DRaR z%v֑"y-yg۳/=:-><^pv~bG+z֎G;ZhG ;ײӲCҲ_JˎT^vpZvPZvk!iqx'8' cO0}S`{dJW)vҲ-wSTͿRRB4}W "뷽{N={ S.D&)o=)_;;:YXTEeQ ZT+E,ѢfyYTEmQ,K5ˢ-Vnj-f-Eq(1 QƨY1ajƨV1ƨY1(.1jgɢZ(IUE՗EdQ,,%ɢgbTE,gKacJV0%BsK%]|C^ |;dsQD!+gͥ|[)s'*,#N]Sw5u ˒vN]SW\ZcةS9ƙծP(*xT=ˏb2 GRH+.M.44ŀiıi&ZL'gnq@g&7&@luIUVĩn`SB~M-NR^JvY#ρQOF4dD#^шQhGFchi5%uYRKRQ+5bT-=U_4QTьԀ?^0>I+ V[a`+/ZR#9 /(P5`(P5^jlGAyG6: o*o l2&-^ fQszt/ g?XL ?sP] >R˅ɔ,*&,*Zra Z&'F&Ԅ4Q =>KCK bU{yR^J5B/%a+T˼PG<[S.K _KN˚S^-/[_V_2/ M@T5j1JB5܀!iW|h冔ljA$HԢ@.A-#Gp]]3[ǕЕnWr;d W]]Ɍd•÷8oq->Y~8|_2 ?P k}?BçSBǝk?^(Ch;]b{jFtݔsi;!b?ϦT}z><l|g4)#xi Rb'Zkr;U6OkU<[Gڃ/F&kR#*J|Տ xF?b;{ϖO?ݏgO(я\Au_Xyⵋ<5,azxZxHs?Kٲo?KÛp.z3[=Խ>|bT _+lGRx[@6Dʖ@iw,g>g TÝPK%IQMg@_RqfSzXסQyEO3؂줈MKFYf8s9b a}6lY`n=QW$߷_]~S8+dF]QǬS urjN9$_H9,}d-o{"w6 ].AV[XM]SKuj].ZT2ORބtj_Ɩ{%@3Jh:;EKMGRK ބ;R >b{9SVuh"i>J!YN2nLƗ 5?A|1?1Lj̗[5G5&1V3u:|u:L}:L}>_}>Sg_tvzT[~ԹtZܸootyzTTqK{v1%@+UgDb|׶*xF{:z5E6+JfɬeV3%YQ2̊^fɬ(}aV҅.t.t t %]$]8%o_jg3˛/l^fK#}fVyTo@vҥ`c鱓X;tidS,?0eySIÛp.7b^]~}O$N.V`=N!R_]~l'$j<#NjCž)uXxjso`|lLl.g9 KLRRCvҥt@>+NSٷO7v]v^ÿ9no-Ϲf9У``vN%fG}S+Jۉk8B#*h¤r@fN!ܬAy5hkvꪟ9Jahl]tT# CS xN > OC ~ ~?oϏ'Ÿ g -E?Ώ6<ു1τoyf)g4СJ".MsSdwDwBw̼1m;f;f 63owBwDw|c)'MA))'MA)苦v33Z-2MA1+=1'5C)J+ z,FZYPZYkeA{epeA/VtMc±iD86=6M&ǦcDoGOdDUO_\S'n㍻fJkp&I^i˼-J[f2"^[fMAe;yHU"4(]\+_Rԟ׫?ԟW՟y?/ n8{8-=-&Np'zOp [~c+ȯ@VSo6z)[utILE2Ԏ6z*ʑwj߳xӎiqNrRٗЌψ/Ռ}͢Quf(]v=IGj;-Gf5=p^Åxl>#F=Ĉ_T(bG!E=̷lqpY^M 4Ahن~BNfa K++zV_5J!%Me[mp>L@0`Iؾf=bՐ '^t,i?]?v ]x˨8bK-RpѭDċTz%ZB"b|V/ANjNZ>nuq1-|Fl-ԧ⹆T%В?!Qz/$[Fx-lyxJYaQ ,^aQW+,*5x粗=Q\\T˞zk\6W#.(cM FbZÃ"4+eeoV8]*VmBY|/ưue]՛z8*(3usHs'UHV"(ݘ/A5X;məJM'\j'l|HIw^h(,H {y 'ܾolxcJ '!U 66uW ߒ9)|;R_ yqT&LOX6mf#>y0(2ȂZvPHU"Kn4ƇX3|£G`/ce奆xQt9((\+GRE3<y#j  sT%~ҍ#<13jôx'GR/*539Y؄T%~egLG;R5}Y ]FkN(8}Q=}]jRǒvM_L_/gh _jgK9\*CRHmqUž[!V_S+ 5BO_б*B[a`+tlE+I5>1Q<ۄM?m4ިFި1h8MZ¸kj1a h+h\? 2?hm9ߛp40j:.-v(io\RfPsɧC֪5j|jZut/Ugĵ*3h[ڏԖ֪ήgXvȽ!G-k ˑS^eݲܻ偻冻nY{ gL"=&uIIǤqIc1iǤZV & 3üg3ęa3ę0pf83̰(oQ Ot5? o7}ۂ[FHsj9[ -@ IYԇՆkZh'LJPJi$aH.| ̂QhWqQ,~9V! /ǒg~H-leg9ێ'h<#h<|0h<÷xڟc߬gVpjI]TH֪!-*蘩v=Y1njqT@b>R#`<#,4Axge<#*f 6x+UgH]W=[F8ٺ2 ]v⽽*bŸՈψo>1_t6]5^ C=?1,]>vʡD(m _X?|C#ԁU楆F+Q9̺}GY~e?'Ln+cψyA7tG*/o|'U4[sTA^,y]T|}o'Xj>õW/jG?4Ku*u_K !?>gxq z.Smg;Q>#\(4hbS ^jh; oXkݵ_~kaWvoX]`^bYWoW0"(m~nt4s##5x7:z!V'gڲ*aSM?4#J۾ |FH-a?tM|U}p*uyՏԀ{oo-O6B{U3U1p}CԆw[=kD$/?(CJ|/ψAK/K X)/CwC̊~%n&|bVR2!fEk;Z1feF헕x}-j-;qRYq Lqn{)GjdEC _ZX6Cr^Q^J.K=U7FoĸWwl_6ıݼψncA#5܃f #FR~QRkx >#F5#36KH Oo~v*X|c4V#VVهԒk@K P#ߩkpsڣC c>nR9ճygc7$QkfİznjW{U.M|4o? ]rᚱ|DRE{^ψcafXauÑjNKNŗ;`Qܕz)7ݯq5v弢L/[.jlf;xdg=rZ}!;o%.  l| 2/jөwe(YI*C YD Jd%w!ó3Kj+PLRX<]*!~tT%S8R3|H߫.+h{&|ݫ)&]c]6T]!kƙZ|_ڧOz &ek wS䓲>NK-iN]r7v? _)J}}k?=!1kYy]uB{js*4`$vѡ#y P#<#+߻O8L{-%B?6{i;K {/ௐDo# r+ Fڷڟ ]|b omg=%{hE#W إ"xtsU؃5m_K=}do*DFN5Pke7MA*^Jl@pnuuU݉vbNw'f ;1_xČgˠeâ `# J1senHm\YK Mʑ eF %N^gGskg-niF!'ljmu2*TSש-ة=8(w\cv],t P#rw :#HZ;B0 tY^!"|,CJ|/UwBO F(ΐŸ~!'k_|QQ R3|_To3L߼4ۢz^jdj{*@.RaQ-ZTKEZE$dYaQ=kQmI5oh6Ah6/h6_?7@vޯ7>m_nX͊Vc='ZIYԼ밞ss оohnm аڻhaڷ >6@h_6~"VBֈz"~KGʖj깚 =W+|@5LOv3\+sL*B1TMG@s0C Ht3K.X4SD3*ש~> ^do< w :N~M0Ql0{*0ޤ`Tq*@og7^>]S)_rTkzٮ96!Y^sXK%I ]Yˆ\X(B3#2r. 3hyJ|=y烎`|0Ց'vyy`Gؑݑ'vyyaGؑ#{57Ϗ2ǎS C*.v^ҨL#k?͸/ޑOLܰt\K3l'?~G_CO7|B?>!|Ÿn W/!te?In!ĚDc%}j Q3VZlŸ̕3E*3ZT%f!l<_ѯnB_]n_}_~uFD|էSէ&էXS'GinI.5C/)^j4K!5P+>惏0ga|z0Pk۟K~sDi۟sj ٟ \zsG~~"'1rCn $J7@3P=ɳMܢk_ }_ jB-|M ^aDh1-.ԞP"LX3}GdϊɹƳEf.q7Yu:n1-2Tok}ڧSpOXkܵ?id~^ \.ƵtKKq/,ݸmK7¥x/ƽOn>?ҟmǽG- \+!UFtsQC(Tܣ;nL.5k"Q7T%o S! ?7^ë&6`~07:8#4yГLHac (U#!0! 0qL%Z^jh:K`6M}CgM_m}7/GlvJQ"೗#5J0+&.{J^ {%[e|l[ԏQUK%TKng6W v1+{JT^޽^w/|^^;Cn:w;:ԐRCC~'TOiU>LKqA-\e/Бq⥆&rё ;H;u') 0 tw:kRP@ u4g ]2Eg =e}|P>%T+o[4kRDhм-[G*O#*0Ih{$jk$G"HhHDHk$Z!C+,5dQ>0zj+R|zN`R{,Zjh"@wj}nmA0~} R:} )|Y!} YR } )|Y !rA %ՏWP={ zq / _z(*O? PVO y`[O J`?ݾfi%}"dMTGV҂Jk%]RGV҂JzJz;@W4ohͿ?;?pkEE0kE8{ژp[]5J3J7@3F +F2"೗Fe;QD+Q4,|=`q' [(bEhJp)ѷF|()8S?ĝpD)YXB0Lp?2m|e||0Lp?2m!Ӝ8H >; >r> GGpY8H|7a|==H >baI>=0>܃8H|g|5xxl֧{w7n{p,7y^3ϬAW +>4b> ͿT_wÕ6xb> `4cz4fwLl p^ $'m|$! ~DA9t*4觼K$A;v{ϒ1]3* >RA'Oh柖@rMK ٧ȰeZ'uGz6[e-psxnetIt/]Fe&]KtIe%]fe~ˏNؿ,M)aϭ-.~x"tP_gZdwQo^o}ۅRpjzLB].evWpjJB_ ;cwON'vw;cwEwwWSpj IM_M)(5BRSpj )*eL K7L3G)e=N!U J G`9RЦGt?剣/tYuG.E.5"/]8"Iy"INKtC}u_eϺrFU>bGTRG/ys6?|T"\Q*u)짒;A=wLx.Z;R^d~._]cG]4f[*uߘ(l Nw,TthoxVj_D.Gj蠮UhuZkl_ kF+T)ψ-5owo PHU"w/54Q#Ԓ9dN6'\mhNeN V.;SOԒ9/I{.*nꎳk8SD/~oN}&I=U–a~Rvhǁ#'1=Wy~OFncVF>f q٬(Hf L 7K'e'M90>%3zj'r)C<^lqO>(inj=JB#f95@ZjhŸ?H4!Ra| Bڈp/!RmEP%cdE=1+gK^VJIJO]]Fk__e;8?z4QBoE_on'5}&I _~ϟ[Svښb ^m +~pFySʠI{n -54o?#55ŎKMa!gx?ۛʭ󞍐[&{SV~LĒYM1΋lQ2)ǨRS,:ψqz m#g>z5E)aKuJ)HuJ8)aKuJp^_n/E+vbhw+vbd%˒%5/KJu9%5/KdIs1]'B]uP凘1\Eǔ=:TP \JVjh(#G*6EϼMHI:VzP E8N3K/_ܼM&,n; jV.+^貒.7tB.]]] uy9s]އYN9׺l_Y;/|oS:޽W!;R^oǏl\V7]^ {ŕ+{ƕ^ʞqe/ʾW\ 嵲/zMrXɱ>_=9Xɱ^c~Xu./Ecry}>N.}xڲCsћOdo*tQ7]4Y Wu&j4Q-ĚK9.zXEv)k%T zMbC I#55,#[ӥ"ȖHKwlq_sv;O!Br S<h4nQzokj٭ t,i~kI%My[֒GKhImIs?b*㫦u:*Sط&ruW"LQ1&#@/Ȝ%.5ܥ3'5RCz"~^us0tM!:/* .|FEh`׎z^oVOdS}aLR>#g2"(*z;uӥ}T`lc{5_AUCoXӤ}Ei1⊃u|p7(bra91 .'^N,\N0.'^N0.'.'ZN lG_&yp^B ]T*jVXT_a϶Ol"J.gۧ +]OiEf#g_ bT\AȽ`\A ^A Wr F B+?u VQ{ KFQœ O ӾOԐh`<-v=RsAЂ󡆁zJaӥbhjQ"7 ƇX|ƒ| >RG`k𡂃#| >kQs$[E=K=jwɥ"|FЧe8İb?[rR@|JԀ|55hښbM`c_;.{gӫ:ECc2HRq miuQ-,i0+c|FTE⣨T#(ڂf1HMO/j> >#1TQ,<ɥ6Lc8Fe6X$k=&F-;&|FS^z^ b۞u-=ѼҌ5J K\*ŸJWHU"/ B]|^!vo#˕޶aSU5yB'[vKR8CӍ}u%ί_QmXfđHOhF[BOh'4 D}B3&д'4Oh4ަ(iMi٠4VǒAioe\>|FLLrY*(GjTP7t#5<wjnCˈ?kO ֽF,#>{:W;R~X] kbkaj_Ol0*ݏd)J=VբU*T%x!jGj߫r(moHWĈQSOgD=w{i.Rpz1>Ě_#`vNRו( ohNVuu|k36WuN[Gz[կ-^[jzqmzWﯭ>$ ]WSy=#{\u]w]w2icםuǻ~O߄?§_y:yBgkuyy@g.k^ O§>} >'O_@ cEO? hUOء#`TY˭bk?ڟk+n]T\ԏoS}˜QnWxKE2g= ;^j~u9}4H>ígϜY >k]N3g8}= N=4O_zz Ͻއaۣ>Ⴙスv~lEuqFBc>gD ܳ1;?RS䘺-plbMs]C>}.WskT@e(+Z 8\+N}W+Z'5Xq+Q^+α-"nGd ST.٥"SGjLjj^B>GiCSگ~Xk޵_+~} OS <^~* ~+yCe<䥂]>%<x;W]Wv." 3j[t)#|K`@793Vo~X kݵ߾޵??4 yJcFv1)בZؾY}8ǵ?>~گkp8p{8p68=p68+8 8~Xkߵ߿;~ ڿAη;sI k_CO§ O§7u___'n_/(=\' `IKV.0$.cvZHUouy\] ]vh]rh].vhh'hE;o7լ|tS-MᣛjTZ7X;hxB/FC]#*OC^"S3ψ[Kv'Rv\lPr%{iTf]m<%~h]tt.tѶEE;E;ԀKh=.Z&>k;CEDiߡiĥ|ukH6LY 摊mMᛗ^6o^6A/^6A/F#5y4μllHE~9neBr=/>T>oӁ_<}~.4fxT**%PK*WQX5& =~i\z'(`(u/.O_G ݯCG~~# |xC5ΏJ_7'°Rpd 6|-|p g/¯7-~E__?¯~ 쇻9l؂W+| ,]8_4 Z@3knɭ/~9Y+|urb'x;J ~^# :z+,oN%*.$ji}\֏%*,ٸmVXZ= QeLv@(KGKǙ6mեKyhls3;юޚYO`Ś>Jg5o u2|w?f۷o|s7lv~on}ebzif=5wsoV^KeGM wcf֮S1^<W/;\.YEpBNǬiܢ)- :Ě k yESV ~*~X}ɤc- Vk;mri\Jυ.ZoҠU >D@kCVXo *Y\·Zנc 5kժuԠ~kPG y"($<.m.  B91 [1Z >G uy!k}[nu+\otVgv.y[!kh?>#y"yß yg?_7-B놿>_} ӪYS% 7H58- f_:2Xa\t>\b.cu8YAߘ@ mV hr[0Z\V @ mo!XrV@+ ƽ[PV DXAE+F+ c V@嶂 V Z*o+X`-#,h1Y(ג'|Q\"1]~ZjT}eϟk 943 :8j]slGP+gc#_ r :Ě[?q#`F\ q-kw 1ۈ*`ī^{Ua nR`P+j@ 4"``՗d=q'qG#ɈF\o5Fը^j$ը[*TzQG5F5V jQ[j4A.5*j ԈץF@lk׀n+hZAh Vо ZA{[A{YA`VВﭠ}}a^R4\RCT/ÒB!Z.)ڽht1@jh%g5jTPG5S#N 1"|Bk5'ɏk oo*Mʃz{kVynozV7]S?HA'IzoA'I?$xY$x:V־B[`؈:m&+dY"Pઅ?VbMszFϹ VADV^'Ȣ\N/tA4Alt5{_K{%e{z6e^t%mHOyt2qEsW+%4{'vłQ]1&tEbH5Ѯk+|L:\!̏GCg5iBI4Sۮb`W+Ʒ]1>vU$.Pаo @9܎!0a?c9t5b"!A*O ,0Yy:*OCio/re].`(|x6\UL͹fv.a0ē9 ?]E%?}dzIBo:G t}?t?~wo[l߭߶~[߭߿m;~Y0@QS >ۡs-͗^e-U )$b3>*OCigԇ*]2Ւ=\ tHʣcssĥgz1BV$Z?fCG<fХIC$FAX3BP#ERvGUt:E )]n?Rj[?Rr!}Bݟt~GG[[ uӭuP٪ _||f .vokC{-y؃]֟%[AVkh~~nm߱??> *=   ^4..ƽhh \4{Ѱp0p0ދՔRS VK Lñ@P?t^_Fi. |54.r*» i[.+dWtk)Jt7rHZmܵ#AXop8Vp8Tg:pHS /CU6SX9dHq}:z3CoҾltd}m9+FR,z&K! SÁ$Z_ p:|}_e/cV@}t>^[OqPo\)]gӾgz=-N_-$])Ap?#}"+G- FsL#׆>V(bNmݠn/_7Сsnۥ7nP!ֿ }/_>o i?&_ ɴ_ S _)-d}!|X9v˦8+{vZ˜xA|u?=TE/dkS:Ě?DM+j3Ft{`БdgVjxW-јegÁٮ88 plݺP u]*u?v~?CcG'޺o[#  ~|)4ʵC5jW85t/sE52~vC_c ?iYiY!%&D3 ,dȞ$ :ۋ X^ {E(_lzhCܴB%{s UXtNtNX-(b;=.GҌ'@^ Fktdµ(}p+~)j-+|ZCSC *߂o><>ÇK u?*o>J!V϶fG ki06NןOεCbǨāF+|=esr__//|}> —G#=9UTuu>%GRTCG{Ʃ3蚧fO^khn.J{~PZp+M1kq&_?AeA7s[ߎCǡ#{jgVχk;no}FXVwT'vVnCoY)Dh~ Z+KBJox~ڄd a!m 6BChht@C 4zٙv?Ii|>>OMk8 5{Ck?TM f>=g?lkOh}z׀ψN%25`Pݙ|,5"D=mQJٖ}dÇ6z췵quO}S7Rvp&RƓ*2t%Z nٗF+Ki:QuPJ@ kLgAoœ=dFAkuپL?xXo-(kx,?UTq},Gx&uZ+ܥ=_ C[vzŅtNڄ;r)'`RK8)D[ w+ϙUo-q贰NYjiN!\r 4ykgA4Cuf[g=%!6ZiaooZ,7e췵q ,KuA[`uN.elmoKuyYV, eyEPYPYnY#,K, CCQS8)V9D #xw=蚆*voj鞉]W;Xf '{,|g ?6\/ `l? ~! NY~zw^n Vj_{z]7sڄd,dIzҒ,d,diIz2,de%4q(t/a,'rqҽ\_bic(t/ir.Ϸk4Z4Z=Z=x`4Zk"Z5Z4ZQjrə \:eiME-툰Gӹ{FL㕫B嵆F  — |Fr/7|ok{ w0dZWP6.(׀=dmAX~^3ouɗM VD9CcZv"|xg{6/xGIh(ygBNL|Q+yHR}'D 2 vƩWD3QJ00xΓ!.A)nyn ٗ7T1zO/ ^Vx_h1776Wowڄ;RIe_XsCP8G V^KOɴֆp !]/8޵4eYDZo t(Mo&NFقZ^v^E$0dQnbɞfiX"(^kh|[_n/r`/l}Z_{ [_^6 h"l@^6 Hyـ ,l`A/l` ♒Eq#DI:u͋W~Z!  P/<% b/Y8tظUtbF}6o\^pq1Y L.0 ?=,V,|1"D=iqyB=63Ki,tD~B͢ZY-0G˹V>=(bM3d?iczjݜ3ja|<@ѺwE Q6N0a^Q89cZ9V{zr:Q߬'׃|Yp a,??\Yp A}KL1t\ZR^.:*\N+!HpVuPJ@_i{dkdEVJa&Z_֖͟qYx,t;g(9gfrԗsf$ ' F@L33z;gh* O>PG-)~cv>-;:񐝏ϣJU j!_'Y~h$QܲsE'c_:k?c[:\_hG jAys; 6׵ܛk5\s6A\rmg5\SymUں `]3d%ݏ:йcjK@Fp0%+1 NɆvT!^/A;қӬ/Zi38CהtvNA '1a%]ΝSjJYVFx;WI0f\_C.nj^vqO8͢i9.n!E,rq.nj&` bE5\$,jI",]$}I"{DH$jEҎjJΙ%39S휙39v/᜙3ΙI蜡o󭯓:ԾHL OD i ezVZ@t>9<}9%׌ x,?eAQ|.CHAܧ B< P+.,I`R:U~Շ: ܯܯ;__WFoYi: ܯJ~5?EeRsOӶm6lMe4oK*{&hV h?J}di55~yHXam~e7RD"9Z:X2ڄ;8>^s{K a|aU#?;W4^s/AՇ96 { iC ߷F=QK^OU3 AĠ`ĺX½%)HS qJ`zv&CޟܟO?im}-D64f +=jɞf(# #xDfMK#ȅ  :Ě4ڛ 웝> +|ZE~𓕹VAD ?Y0>t.';s9pQؙ:W_}c:!n?\yXh@Scczm?6Y< V(QQ6oBJag*gUT 3dCzAE; v‡N QXLc/õ9-<8$ Ǵ!N C;inXQ(xEj5PGUO]otEWov"Z}rģ;E|贐yAfi/SuGt+EMZjI 5iݚդQjzkYy9|MilKti)~ڝM1a>]t = 5}@S=ҒW[/Lֿ/̉MhxdNl keEwE54rE5rEWEEWI(QE?v*baWO]otykb+|mNmWGu_lwxj[lC ]j/qSzӬ jL>j5N%xa% WsQ"wU[x)<m ľx-´[KI)&ܗ,c-3Zp)/-WQGy[G߲Lԭ3L-fj)L-gjZ_z5GzLi<0U1q^ iwIY zwd (t:e :Dwڮ:CuUq+[ȟ҅f0t~~!voo7߾ t4v*h VAht4ЮZghkTqD[?fh^5CУ ={~;I8KnaT+u$VKf\vʊ֟*l&DOj/ַ9tZ' ~$~?\ ַ#k33r gxk|r|HZ+%g1y#z%ܑJ8$ǡM,cq-:9Mh7+,= Zci̞VioWɏCpg<~<ᴀjZ:ױ:'xtp<"54͏ɒ?X[~ZzCYkZC<8\NH^}#'".?#EpH'ͅ4D7H1dV?)ټ+߮~V2ma7{ >$1_08#h$oBj Mop #Bǵ1<\-aGx=DKFـEr|X~>WyR<)1Gc7{^:-@"}|!+,oj!7WH--Plala$[d e +H0]>vaWǮX[bgC %C= d_(jigڊwŹ;khWõaTvq!_c_x~ 2nuF=v=yovO0&+h%OKKӨRBq7ʠRKK%콇M[up;Ax,\~ַ%)R_Sjqe*t4{*8Y/^ɼ9zH潒yyd#z7'^ɼaV#ks'M Sߦ Z+3"@Di Vyk)d7\Fp,;MܓUav6ezLVR!^N,\ .^k,+ʐW@@W@Uܫ@U *PU W\  W]б zHKu].ź42C ]0 V#xvϦ-C9W/%d0Z,gsl[Z5keX>͠C C~5CK~h@ AOBP!WtB^B!^ԜJ\/uѻ@w\Jp'Yxڹ&ɝp tnj EW?J5*:`T1*qQ`TFߣzzPd *2 h!Ϟ[\*m*IAኆPY4',xκZ@WEwZ+sm̾4gj i⁌Wvx,f8 L504040{`80 =01LfL̸f^38*Z L&dx 5< wzI2 Wy>ć+l 2H]Yx+3XWX5ZiB, y]®zE~ae!a\kǛE<]&l!6a 9*Lt;cPJ'DJ4!3kY`e۲׷>ZB^oȊ5#wGvAM w!9v,'!c- ۂQ2AR?fNw?0~ .sf4gAsۜ'39mΌ<ќ6gAsf4g~%_.h8%az#uB\%%]$4G.A<'1>Q<@d$11ހ ڑ=lC< %H^2.-Z +-^JICpgYTr:퐷z9xP+-^N' ? /NSng-K8SQp٠J / wh 6N\AŠT\ ʽd\ .^ .r-bPp1(ŠE/D*0H-h"&RK2F2& *o\m6uE-\]Qw]ASW]ʻ+6!m2`K[KK. V /o:'𮘶Vz;7yYnB燠n燠ΏAABz;?65/⧩,;Np*k~;T3խ䇪7~Xuڄ/w};]AגPϪmI(H, ҵ$g[ŒZʀ%"X.z- ֿ#Tr>ݭO߶[#T;BE%*n}Vj?k`~W~W[t{F8#L5#Ha0a gqg3xb"$j+&B:uR:IZ􊉐RLu_6l߈Ba/| ]亟6b 'ZCݟWgQ{u~=qnzȚռ^oMmZR?ԝ^o- ^H- \c1i41pL8&{L8&IIǤnB,4*Fz_+_UpFШWK)^3-=Nh'yOh'4 m m6班?k{HiHMq(4_CHCLC| 3 )kHMq(k!u~1nmN]!ǖ@ɒN ڰ++1õ^ZCC׀ϯӜu]H^ʩ+"ysWoEW&BL {ٽ('u[WH= :ĚK/G$GYMr((Qf}Qw \=cV0C]K)XzW5+|;VX-BboN tnm*k;W.7W!ύK.6#&p97.m 4w7e6눻#ho- 5t8o%\.$K\Z)\]yd k%\|hK4/gm8؎lVpml(`[.R[WBYA[`XA+VT+XAVP+(.k5VB*VP+(TjZA= J`5jZAo +VP$ V*Y=CZ^:Nz/>Ap! /jT 3 Z[yWZꡗ~!vT+ b9kBwET6 72nSuj:QԸujNuԩqDSS[: n7uշu h2㾮;-2Xa\WacDLh.rOG\$!V?YN-ڜ~F%!޳3Z+b_(zqD7-c-u<ڄeK4ZY$CTNP Qj!v!&I}(nV/S>7= )؆ݲe ~ToNNjs! =ưh+LSF*@s%zkAGztn`54JX_ `RqVҠ%-#jk셲.\^(KZ-TTh3_CSaR=A j~]o(]@b!u__/ᒾRZ^^S8zZ) 9ЖX*-/ ^︪_*`TʯX//,^XVK. l^7û4mwJp, Y!,۲|2h"Md~4.)_LAcectZ2|ǣpl-AX;xN6Dg>G1JH^N?%e 2""[`j 2d o5?jAG b J|M*Tz?"S}VhJf[x6i5j]r'l અOQh>dx e},^x܋#.6CoHn`N5"K˖=p"lٲHZȩ7쁅#x,mx`aS5'MlٿMl@AC/~v^v~k[iKar.yn+.EIuYFQ4xp+~劫P]x5'zZdt7I<{ϮZh{;saW~XV/MUxkogfo;醽I z50bGAM2 y+ %j>(L UŸ'·a=\ρKo ]sBQ;ɐE'K|u:<5ύ|VO7zb{Y*{ޢvػt$>89Z#jB^_*|TCdߣv<}NFБg52V-ӎ$ȑ L\^+"G+2Gu_/?3_}_P tj^V^:ݸC=C֟[_~W:' S/ _~7m0m6jr!u5̺ԣv(us {|Y6rYf;~Y?>aOl}[c>ݭO[֟Oֿ6>8=pf8pfֿ|6і!Oly-,Y$/oV_0CXr믏Oozٯ4ug2!f>o}R.2[G(H+.E 6-=0p cG{a:BSu'YV 8j 73Gp_ \Vu*|+PG1: yP / ! WYBQ;_jq,#DTD1:ߚ>XcLM EMwZqf[;t />BٛȚFdp:-, [;in\q`Mw@O5@s8Y eO-qvCNqͶ;"[œxPdrNk}&,S}&Deo-Y4hz`;MhL^{)d~hCM0Z2B:v$qw;1Ve#|~Z|<%ev V|Bc-#j$cW^A?ZzHA?C82u6~Kл%kzj! \;XzO60wk@w$Q~B1-=j'Y]S l:O{-zwC_\Dy`z8|۹rslTr6<3j g?\|/q rs?l}u0y~kts=NhfYyƷ3>*@og|T3RWG%_nJ<^~nְaAQ_xjfX!௨_n[>{fI=!%t祐pzAga1-Xt~D-Y4?ܻ'e9?Z ^/6“KW췭px,^},7ѵuFPS ]vNJZEct5V1*&Zżb~kUL_iBƿIĿI?vîvzmVqȭF6zc{Y`#C6rQe"ne{pɺؒu_BPPӒUs,bݒ9u-|/YWZ=P+~JjIVj%[fIjI -zꊮk+H=td3hios!~^!Ó^ jjI/MID&jRGMj&=0 M[4O_l|լ8 \`|r\p|_5WM a+_W*!PIjy!pACrr AjyBCC@mT}(U؇jW>T3p>T`\}fT}>T`:C>kJ0juM@k4=pizp@"[EEhY**ZEÛVQoh۷G ~~!#Gkۍ,/y8|H-q>:RT>$W?CX-;jNtӫ5 Q;v$yt';׀ׂ'E>9oTo*O<g/\}"<}j/LUBoQ8:^`MXSN/׆.bڝ:\>cJw`a߲igUbbR[PTn}UU WNk%x˾؝~y\Vo J W`BMN"V2{jk__T&ʕ˜/%2/ GhA1q?n[#O'}''?o 'M_x&;de#Lv<_v<deǜx&;_baW0vźb`W,uw® ƮXhC#|?Vv@Z~@#nsp@Κk];tk#,vtt"i!EH9!-"F "h"Hk<)(KgzzP>tZG#~Z$w_ġ7||;"T|Ԫ-S+:Z-u5>djU|;_mnoL?.mGe4]~:+!33{A?~>A?B?_| ||O3_zwo_~)Qk | o5cMoMI8i|iH4&͗&ͤI#i|i'MIp{*p _^BYz% _{*p {& SozX8Y.@Bef }^3f^>v{,zk C#|coG¿>:>1ԝϙgFBS(~CkOt Bٿm%A;r9%i5i5ȯ LA~%9/d Yֿ!, ߖ僉ph"Md}2.g"0DG V&zBM֊a-8W_t/jpZEct52J iaaJ,[Q|U4[?%aQą\nyZ2$,r\WF鞵ps>\S ~__n=:oF7B}-N EDu q 2cMWne4]AӕtMt6݊+h6]M|K\^-b_c}zvA4j8ݓ$j{mV?5^tV{tjDCZ᫖i@tO^અߣvq: 'My&CӠ%!iT_V4Jikti7x)'FWS?=ED/'xwOx6m9;/ax2Et.O-?!'f%j!Uxs> gIǑ|{sn%\3 +Ŝ<\w!s?b~x 4T߾ -k9٫_~`[K..X:q'YtEqaǴrpnNuRZ C/+ c8ⳓFl[V^rŠ1>{ԬRH֡C FDOA j2 ' (DOѿ0}DEy"uIt49iNFc{\A)PCjU Q^f$ǞxDt0ZZJ e_G 9o P!;X O@סYhǦzᥣҽBSB8 ־ } @i<=Û V "n^A4F2 zFKA4eL%ӠidL0 [v`K`p%ll ۆ-݃p`!M)[ 9ZѝJңPp)ڇ.5S4{?V? [ܭO/nOn?ǻ ~ ~?oϏ'Ÿ_'|D I4=iYC{zkHl^Zt?4t?gֿ.3]8]v5wv/D˦=nrprv_]fpAIî(ݐhwIY$,9 Z1X N놿>_׷G oxC\7 oAa/}N3>u7)N[ݞ~~iKL[N +M[[E| Z@֡YًhTX#p\>`at]R. A+ֻq|V}y႙qqpi쭿=J̞n>=.ug]g]Yw+iuYWp֕+׃ L+s$\/ pXX͈]73p(O*Ow:-ţfn}֗0_q qEW}q~4"{ >"~ç#50ר ʓ[s/lVҡ֕g]皕g]Osj<>u '}*|Bݯ׭NR.uQkXgWm>,{VjѻTkݼ .@/Y g .=ϳt->yv (K8ϖ}rZ YکW\NA~Bd/YY/dI,cP%Tfs?7OTتh1q~h ch7ҮśWy+kVְINۡͫaK 9\,H͇f]c|4+ |UFyV.=Y=\o?ƇfĞ|)hف#I Ft. _dthV ,׀kwNY?n8d1*|i;tZ\%?0˘l&>\A˳ Dva>sd&VN lf3jgy.l>t5F* נ0ٞ`- EzV*Mn'8X_M ˷|_VQ*QDwn'§~GO#|OOLݐajTQjCS>ٚ(BoAk%3e_gy)oH5eh7ȲSC&kmf_#a v01ŖݶõfO@Y%:<=deϔy${/{hτTygoF1(D1_wPzvO`+y'rW FkwzҺMpW-|Z;/*}TS?*to[)힏q(q>n|1}1 s5WBln%ynrrkO&]+I Yt:-Ʒu:hR9\Y&Y|:߫VCVC^ ՚VC=k5q5TkZ jjPb5ԯp+nU[͞­ƾVйF0 j+ܪCXoU.s+qV^U.R| > r+ >Z !LV~V>m'l}[m}O߿ Jz{΢ݯ4 sY ^I-OWd?o/f)Î+,hnY╺sͭOʳmB`G)??? _#`tu @;i+S[/~ղ Y廮b`W+Ʒ]1>v_vEmAvE% j]{x)DSMVڼ+jmQl?$5էDD9vt:-؀~5p}h'Jൊ+wiČ7HNKm8׀/4 :Ŵb|,T׀}:~m,/AK/I#ǵJ-=u:S=`R:krS&}FDi,Xa{`'׳HF(|0֑@^>GƷ4U d֐M(7+`4\ZeΖ|A.s,}ҥ铩8 I w{i枱fy%@NtO 'P p]8=@ 'PzOs> ĽfN'6sR9T! oZiOB.!_{?w?w}?Wg}Wob?ϫrȟ+Y.37wks0OS$~ssI V$)XeVoR~ER!F`jse?"՞|"kOR4`fwxY}x0ǧEP3p޻V ߼O :k#c}+ K NU>bZz`MS`/]3Vx!vΫTzTz}Ңd>\q)/t௬]}P<`w\厾7DGEӞ.+Ȯa'Kywe_dì2ëB]\R.٬o.ˮrť"Ws0\˻SڇGRekj˚K5X^Z5k+:=)hU@ 4OᙦTLcs4> |wr[f8Оf ۼk|o>}YOjOWpL![i{).Σ6M×RRpK#:|=c_>c3ȶqsUXQxj֩_\8b rEN+.Eܠ~QQt/](鲓.NPeߺ< T9W*<9MNGN^4ϟzN J ~]V3wƚCk~z53ffͩGJ{'c%j-5+R=DY.Jr_>?t@ZʛyӤ:|0CHa.U9̓&OίhWO6^(WaGl\W( ZF/mnXn_8ʴxwĤڢ CP5cG$20^*k].YPJ!3ƜL?j|lQC(T*暿4_ei 5+.Ͻ@6(bNI$zs-5%'W~ x"_$˷a8!ψ~Vq_ xX3Ny׌UpX^3VIk5ךph׌VkFU6TيI;<(zXt=]T&@I4[V_YVY{zؘVYk{/>k֩Y*Z~2k5n/,>Zȟfb勏ƫTC+%~TCyͻRwP d.W.#K{KMRW.5K{HROڅ6 9Yg4ZSH-0DnDOiivʹj @K!u5pK?{@eR H%T//4qT_e]>hS](YV QQ]S4jqB|+e4X376^;Ոzx]3ZPjW5ЦԂ5DWi!M@\>ĎHERk)oBOGOH-=l > =t Yp{݃CC%=8tkW8,. r>EM{>$M,IT$Ia:޵_~k`Wz~?X_] kcgoX? ~kc7v<3-?󔆈 m 2G<˥ ;?ls s1';4| 0 py)XHܥ V}њ%chp4 м7@7@7@n&n{4jC` Zr-Ϳ匲slТsK ʲ o/Nۉi;1vb3m'FNvvbd;1A=qPyꁃz⠞8yjA=qPWSPj^MRSPj z5X)'5OG I{.ͭU+8U@JV*hfbLF C\LfBs5wSg3Ѩ0\okx֓J R/ CDKnvCH]{ށBoL4Dfڮhvhk& fU`&힉:DL4{&;}0Ԩd1z)4>!z}>iT2kjH w&Bj_׀MDb-j6R*l"k D_NGӑsu~9NG;NG^Vs"|Ay@Ca-~{fJ8YlDCa-+.UT(`M"<"cgVbGM(P*ExD/ˎdvD~d xZ>%R͗<{՛+PKy)aK)H<3Q.UleL# F/ Y.0F6; >_ħ.-ť Tu_#MMm1m|Lv|87*Do;>Mϒq7ub7u2n7uYa7*DzS7foAopm?nszk{=R+-RAnT4/^Dm_K+,q۪RA}E?a 05lk5l5l6p [F-\{ [̳p8{ApY̳p8{8_X'Ow/}ڧ ka]k]r9۲|X>}Pٖ6(YζVMkmڧG]kU.ccwKr%&CجLan/ .K#4g)uB8B̌5sF_T4N^մZD>UF{ɗ'Cu'WiQ.q']!~8SC|+!! [? gyxZ7:Q2>EI aXp@(*WJ$ ؙ`g87A%|t \: %3}@9̐-v&+WʋskGql AI 1nS[XTv{cR)8N<.ULngVv+b_(&v>zhjM OK9& a]Kw/jy3#2igEbdV*^juM;&ᓭi27*_7&ugV_sP`P'~B ^.a9' =.xλ-l@/W\|MMgU}5JgU=Q8W4pVū}"\sROsHsRK椞:I/I5'4'4'O$U0!u{o6űpb;&ؚHNmZWe3k rð7/eƷ"p??:i*ß^*ZgHa_þ׼N|p/R@q>W+BW+B+BaqE델杒Acc r%ۆQ/6n0^D5> `!@+dfHtTp*Tq*8{*8vJ=.JN=lu!>R["|B,t+*=E,DEkR>_US|-E-%>} QU+)jkf$ߖ=g /]8~u߅w]% z?j\gX"KJ3gYh ;o \i3.h@I!zmVQk#Di#F^6B6BFh;;;}$$6$ظXNNbNbv\Cૉ_DK]Δ Յ_ۗ?~㋤cR=v<𵙥3L(Sa('67^ /dOoY6Qh9q)zl%pPtN7xA_|Pt;nVA{Pc\XK]DH]g*4HyWX{=`}^_O7 O7{ਸO70\yTPGnt,ԯOBJ |-5u_N5.U``S9+y n^jH::n!a(7Э Ibq {ƩI(PxiNys0 rŵt˼ApP{PwAqP{P/|ybᨘ8*&y㨘X8*&1d&zǶjaKZR%*Jx١I/ 7r>>7>}7>>)h!ƒWʃx"|-%*|](Ԏ16yi'kd_\?`DX⦢R//;P&־TxHma # a~Hu2] d7z}>Yl d7z٬3:FV/C4nK|;a\ƫTQ_*oYnLb];RyiA]k|Wݮ 5*5KȲePN^Ն/]5'I`8sҨt`NFEלT+sҨלtITaTP}IAz!! )^Jз.'䃆>a.@x%+`]NK̩쇰^*x9=ӝ*Vo\d&߶re;rC)COsxCOshM:t=ϡu=ϡΡ9T̉<[.Ix4ESaiR,E{8wHe5^*hRHulzhFuQdFWk)YNAv~ k5_KM7$ ?|}#9m&J-ZVJf1@ͧwӾj_S~Փihx~[P4lyվzPHvt(|mGGڎδLёi;:?َʻ뎗s}(r?1MJh9u*Ų]q7!5d ti;rJSW.+zJ2SW.+]~.a2i[:փzX)1>! | ة{a 5!`M ܝc4`J`P&x]Jf@xf8xf̰@xf@xfXxfp@xfAB7M.ɖVj3b-|2F,LKG!M/dvEbKSU(q`J8 szb3R!P3"&54GQY+I5Zh,ʒ/5:+o(RCSaQhT sSCӊtnj>NmD^eS'.oBI|6krj$;LFB-^jߪѾTjߨQK51_j̤Jj̗=1D5:1o51QJjPRcIX/51PuAB5joԘ\ԠԠ[5K5ՠߨ0G'ѣ͵Հ[VUc'dOe|ٰ z*^s/~$E.!.]A]K̃sǥ ;rZl>jj?0I cynͤb*ǰH*kpT{m!\Gǩ&4d>:N_ ~[)Q +qRVQ=FmQY n&x"(d O` k}9a?85K4GE`mt:)+}h5烼B43dTjf<7"ne߃|v/AA;| AMYz`zԘy*R8bc=d!r*S?v6l"ݎzZ7G6mRRr Ow !5u<-mjZ5-Ӵ_i 澦Wk{㴴ґ`+`_Xv (u\aƫTEΡ[0% jT/E;%5NR8I Jj[ B5&1o5&A?5jo8\x]x ϬF ^} S?U㤰9G5;g{ QI -WM4*AQcHDFI s'txPMBP X,fM*Le<*𭴚Xs FlGB|o|B9GR[ƣ98<i𭞚:<bÓdԇ_BjmW|5g#>Pjo)*('ϭ<]6j-ڝG叺@V*%5'ׂZlu6n3jR|z &?^]{*ҪzwsBι|:> h3Ilp~R,z&᳙Uk^)] ?yl9!?\`_=djTp@a(^(W&\ϗ&y)ڝyy䷋EY0nQˇ w0f>rŪJ0/Ce&΋sحD&LEfXHR8;JQ#W@R j($MjxBOl.tχ!վޞD}u'DG:I/H/`MyOFp;4Ǥ5Ja_^ZK E-v @(/M1y٭zF'Y4$ʵ:R[:N/WwRTOC'UIЂ7$y V=BO={3D_q@(^+/ 'D2ljL*FZDkyp8 -= uNC㞆NCqOC xOC2V ao݄Ò&Qu7{.۵g̥ڻd!P |9=Ox['RՕ=[AG~{NTC*x['Rg<%FFx<+ ">)>~L>!f:&/70@ݏ X3}+UDldj?4VUrnW}RL8!/M >,d -dk)33CHxR[u?~R>q8\rN)erfKL%KqM ^%7-;< ;r03y{Yr]V VU'|􋶞~hBPˉrEJleG~RyܳB]\rR#{.zoP+W\ݬ1]TMR<DŽ=aiv2Q 5dQ.5RA|5o=-đb ӃOU~.Uo"孌5n ߾ǐ&S3cw1L*߱ǐ![_r}˜> h|GAFۊ|5v" ?hȲ_R rhBP!M7kl\ 'Jj]Gbo/*V>k*4?[qQ\*4 'jǿ_RVhfI.@6 J |wsG# e D L`k-T!g`V#P5 3JUdz~i"E|Uv-bxwcF>t^c< \nj#M 1z~LjiqY#hO9("O,4˶<3 +^vT;:-*_ `ˆ]M謄7L*5A~i+e+Au IG&%HfTDyB2V! |.WPJ2)!5 { y<+ȦnТx[`BlB"<ἰy#mTy7ct,֯%~Q˛2%]v82K 7saM]?jπO`:XVE"KN t/% Uä'9_3aIap//4XMHež F{B ^NR 霚W56ZC, r-y<|@y/y2&.y^&.yB^.y^iii&&&yOL'Ӽ'ĉi'&yXWt FK@eɬ1hYri 2VO|#hٴ 6V}l}B 3ʉǝ*q"'h2| Ȇ8ZF>S>F̻Kwx3/w^3N3/"?c>>cص9!ܜܜн9Y9!ܜн9!ܜ,ܜн999!ܜ{s" ]?>B Uj9*fHQ\q.P$IKLwJ$&R<łLUjcb)Kff.ڻF.98DFMC伆NC!r^C!95 d4|pp0Lӊ5Ow= ᓦ4e]ZM4ԗ.uYuYeդA]N}PVQV.y췚ƾ?辰? B_|쏂c8[ű{7򂇪&m}.˞N3*K^:>W-n;x=Xij8xR}j.ɛ`K5y;M J1!RA|wR z5EB8dS9f:K,+ת#\vj*5-K4v1ØtuAz^ ~ ZiYVY_;Hdh|k^-]8jO2$1[.JW(Ub_?Vp8V\1[}rQ?]t;r q W5D!R[q^CnkLp#Y%Hp+Y­%Jp#Y%Hp-Yµ"ko%ۭto^v+ۍtow^v#۵to>k**$-K{lގ: ' \ص:_3w)ƶj`Fknk'+ˊlkǕˊl%+ˊlkǖd/6]Э7fmѴebxbٮd3+.Eܠ\HU؜HK,ݜ- (RƫԌ~Ul* )eGR^}XF[nVFk骮'}'AK+#Z5ǧV(ʉ; %]sb=-TeO^}ec̒eڅR..; vw̒evٿi~/ty]Z ]^C.~OuYv!܇;s 7uȚYw})7M4Ex .$]zkO'꒮.Tn]7tiVeg]V/K/ʒ*N5ycBV0O.aH&zkP=BV*hЦ`'&G2\>?V=سQ TWM(BEZh&|e뵝W-RSLO_K>O]![(l +W\)d..aj]" X`5^*Ƙc]NV[h=m 37[+ d.y9ü:%=b ۣУs H GGg#:QV~g=ګ+Y(ת;d)ZFxz(/ܗ.yJ"\p@f. g+r][}2[,]e^ƫ~.grGOe7}2^'1 uivi_K]ZjjEoڥviKS]Sćj8u{j0uV zé.Z⨇9:VM o (ioůKeѺB |?XNMꗡ4h{n$"v-x+p]R9Yc[A2T [ǚ"C ףy)vu-L+W¦oT!\/v$!S۵:|qP fR?-3TRZxCԂRsziSc:2\Lno -a~; baYռqg.IX_gޝGS'NY<6?zyy$ތnsywX .]sW,)oG>4s;; f&=:o1zDE*CB8 a(Hwɩ'/muԌEa$USkRO/Kҙɇ*QҖRK7T(` 0@'Gn5l+Rf|B1& <9pawB8M| I]ncJU]7_'k@Z=Vt |~k>l x?_sH>L J{HCZ*h|5"5P]sD 51r#l =ͻRx7‘mEvHm!/Cm('xѮ GTn8 XY F7_!u0;l W'S̥#07X3ixѮ`^]RH:|^x_]3"-3zB%\Q-XZU+6ke /[ݶEIͯ(]c?&뱼a#y"Q>yQ-,Jmk |ۋj?tRm"^ mK.cqCj nA#:}#ڂۯMiD4=7h-5mDo=aDYCq%B%\0^2gN#3o*`d*QtAho64zLǨK7WW8F%]b;R(RA7{мyZ7kLuk-JV͜sJ.-bky+l'qr''sqr'yotK ppQ6 i)ܶIER-\B*>ǀ 7購v/(a(1kőK[i 8j?B.KǷ)mTCh+F.mRF5.Y\.6!omt/tI٩kv8;U*Ni|.J4q']Ȟ%#>8O}5O}`dr#{ٳF5Гg`Cu̡,ҡu鰹.+lJVJUOǤMv&K.u 6}Г v%=oz$ !g|{\k!orKӜzAEl˦4SGSg#u9O;b Ք>?`MOLP[X mz J" >!*f:r?o1ӟ\g e7[Հ^wfhd\wp=ÒDewBV*3|w`0syDX:՞O1!R>?1{ئ4*66}R>6qR  %A 6.V`]^шrE;"&6fխ+z4/L(QL"zŦo/?nǗ6CMC om*5wJ|ԖMÅ흱ڗPXwsƱoU,i=`*ò$DrYJ=| 4Y0M)9ѡ4Fo||6Tyl"R[HKM4"3 |b%.jI(W`F`<&`@grp Z}jR]7-qhQ7zHx\>qfV'IX>LIeT&6)bfHEɀgbd Ω10>s0-0iwd>#wdI+!#|B׀_Z1R 5}NOυ'II8}.>>N'?<N>'M>|V|''gCsp!|=<$'_'bcӶQI?d/Ղ˓H Z Ъo)tm8Yh;  fK+:~"~o#~!~ß#g;'e!zVOÐ!|97T I!5ÇؔE%)C)ЊK|xX!$׈++8/N3avժF ^.qLW(ZH39\e x"U^ ~*rh߶9 媌(ߖ7Dk"q>ץ.XWT0nB_}$%) +^T -W%W/f+UK*o-^ p6تZ}6vBr2 cB|T͗\ǥ XiS )k NRwZwwZN;wwz%7:rlϸ^q%MH'Ds5ni.U:ޮnJMSЫ fjJM@w6& 66aл ({,Q@8 GQ@8 = 5!QN5!4!Q5!QV5!4!Q IQϺL{;4;~2z`U^ׅz֥  ղ,Eܠ˾m_vjj[/nj#{}ޯid{do GGqdw`YR$1QKTϸ2uRn6_ϗ"O65j=cbOP).nk><FO00šAjX|5KC5IPWKxn|BH-erR[l_(+C) _DK!+s >!I>H;_B*x8|u ~ f翡&[J ^(W| }ً re;7aH~1ӈrlB҄CK:z\M`K{Ҵ~mĔMDghkKt*lj-Qזv [ѯ-%["-#uRB-FWkW>ӥcK.*RCYRϳ(: uqL8楆xGRsf|{J8VA!kϠ1;_K hڦn|fJ |-.R ٯF(`D6׾1͟|0gL F@!t+)vS{O,XiO^{{?Sמb=J{ɞأui]="Md,'bxja_\ ou'f ^V]v]&coj2vc=Ob򡛽}!^*hPHw/}ӭ(u+zu+[7݊ROÍe#g.)tBy^Fھ>__'k@v 4xwRĞ&vM,M,66+mb鵉=iKiKlbi~N- nv]U>&$ܥ1kT*Fm)`M_4)vjjESob?)~ d!\MM&ܕ@!.p3>, 6{`G*O}$oa(HV.xEjO~w Kq(t?Z%l]@F_WQ/']0f>r^`m?0r S`?5?]?olEmAW_K{4":R;^zM=9T_T8L灉W8{&^q<0qzO &Sa<=q@Mé2jn$!nn \ݤ"iHa >NV68`o:jB;ը."zmM F@hY$ RANHEfx d=CB|+ݖȚ 0raR@6'+H|UX+@+ la}~_*D^'k ݎCwЅa{v08ġ;qv=tYMb<ɦtV|Bj}x4jkjY vB*?va 2@ۚzTDM&ҦjzB;Nqա+tJ8[s9wr'ƍ|wS O{u}ﯻ ¾?ﯻ}+_I~3-x9)RC\_+< ;MWg?$/>C[3e9.+gd|Oy qy vrwҠwtaD,&̝, >>Yť<~~^j*̷=}o/mFƚO|\Զ :8M!R|tn'+4a鵯6SA:ts9"|XcKki@>TZ4HoH  mmM;V]tCҦa{iS@}?!K8t=t].KEKC8t=t_]'vڵ^]5v_]=vڵ^]5vu>y:sٿm(7>6\ȣ" |~8)E4C-I7xcT! ~+^*h|q s#C/e%~q'a$..OIJz >otx;j:J GbË/.r&$bmz"g^\W fU ofq']Nr|w{^G s>!˳4r<h`1VX3v87_ƙTD; s?Xl ȇ#!*~1bE#TpaY(tzrYTO8 5m킯|i ~4_K >~ p<^-p[9t^[A8"X*vL Tp=28MqEGVRPe+h91zX4fIj>4M!M=X>Ic&So a^c@fA]JV_e|{`q(/\ƍ"]I@m 2NéԿZO PB  #LH0F$;TȎ;WUc ű g"9!!2@bFADP"(,N >kD0W% 43VW߇IE.1=Kŋm`ehm_B> | m&t0H<:)!v?SԺz}gicf¾9[RAqIžͳDHmD~Yv|ો1Tsa5a|fԪjF ^y)lB݌>gƐ-(+c k|Xz5Ȇ#}Y5FkfXFDmojJ|+e'rM+WHmq']]4up /Ĥ}ٹfuo^&S'ĈWoW%`H-=~kv8HR,U{͂>O_r2^F C > }R|tj > {daXrB6t?a1~Md.UO^Ո˭ \oVᓗnf˂Iu|dԝ6M돁6=]x݌2zrG+ylBB,y\.B{)c2>elk9iv$M Wz tiR/+L}xi7|ϼc/*oje]J |3mbXv ڪG|1|MytlTπ9_ ?{(v}>t:5:|^>OhUk_xVZ5 K>~CKo+vbơ%G4=vҵ2O'ϵu;_5r=,G|EUP'\}| ]3$2`_֎|ΉMK (`? kk`j޵/OF_)7 W\|o V~+?_ C?M ?nMͫˤ:|^Էy?ikh~y6I8q)0jteRs˾oKN*Ү4uT \avV ]TS|B@(΃mXi7Kߤ5i~10xM1E9yjx /ʴ':|fOqUӕpKVeR٪Ʒyß^5b٪+T8okm=[֜K7)QtQER6^ttkQ};[)c2>@{֮.M`* `:u!Is=bFYgRA|5wx8"IROj|BFχ)J§"56Kʹ=MK?_oi ~0<"YL5h ~3O >&D*|{Yl [iW22 cWWtIrIEd,}yiGV %d"RzE)FžV/V%oMrY=.U?OX3eKR[e2b cɖKSk!>;cBnφ֚C?r'~boϹR[KMw!S moS!Fz;1)iU?|H8気|K֌K?᫴tKX3#J2aW[l9e}X`* sUy;m><(Q t-@5ad tRf7ր/_n3 ~r_ Q(oDmm |(R3;oCW_$i#,饔l2wm h KFR 6=`iM/zQR~]k`폻~w/?޵//k1q}àLq,Xn}6Ϯz߳ *_vX|^V8 ^ڪw/uq㰆r,:| zO|Tj 3fS>{9.[O/e'hr—Ko/;cRe$n9몧lK'l w rB>+8rB8]oO6e7|J㸲WǕMqeWwG:p\ǕAT6vsyvCw!< ;ݝ`!<<|iq`n k92|BLvy3u M$Z*h|~f.G2^jfy){_ClyfΧC9h]; sPsCyvswPswazK|c_>DL׈ ;!bŽp^VAC`_]bvX/J&^<(Yf%(9xQ"3{qy 3ċ(<|<ܝgC9:)W/y*tY<~w'Ͳ7G-cr}>>QO 0ļ/wLPeVzP/?NY`|AlS`֦>5Hw%rww%ᮤ뮄 ܕ w%^w%] mRX+w%]ɬ6=__$`aSss.国W^FG̢&D*(W\ݞ&v]`CgndޓzpUB}Nmqզ{ kK] <= _EӞ+;QmcNm5]FN+ıqԂ)hxi\1C×FX4zwEm)n cR>ڥET=͐}Xt'}k'>ݵ k޵lxm\[I~y`.~Ow]飰Hf|5> |8OaSHm$ߦԐWB{ .K?{?% /5}f#`6-}g/[ݣmo%,/9%VlWm`M9@O.W}k|:qUQ.eW)l48>Eùl\劫d.ϻsMM%?)KToh{HTP⹩Ʒ!_ , 1ծ^jV䐊=ToCpYXe(BHx i3|1_L?pvAMM+>TiH-a']Óa :]v5L+T>3Qc [6a_u [ְU^k<Ֆ{-ڛP H:PånA"GKEk?#G1h޻%YZ]\hnGאz/?[f RVh|?}胥\k:T%~lW:fGN|F|ou>T?cS:[<)5௽ +I;ω_q.D9Q_PVشx7moW\΋hv8ʳȁܙWCkWa:XY8s33?| s|=@}-h/#*|+9_ܗqRck">ya>p\y5F)Ī?|A*B q>zq8^8=׷x} j2h<g~4T( jz*V,n'Tj=z'$׭_n+]=;$\`VGQҝ ؗ=q!U G6Nf%`=̌xUwք 'V!S?n9F ԎoF[+:|;OkF>3bDhP'V_wkTC-Z)3=K·RFBzFgo^*۪qgLHX PRVJhbuѤ13>螢N.Ԇ lߐ|S3AFd [:,hSbۡz0v͈?gڱ J,91hF >|bigŶ,9NR~+GǗ~۶@@CnO . э@HXOBVǾ;|뉯}ڹB}t#>w;%`=ZUWE ?*Vׯե"R*x7I/[6lM0h 7?}yf>KlmQhյ˖K=o˖l`zol%`ybH_*hK%\49ֻIVe;J wyf 6QlFb_]jfguITjDzoZ짔}E O@bݯb}*WU^ŵ/\ u/KK%xK0p ^%}DZ,c3Z`'|'핪= ?Cxpg 0 1k[xz? Ra!hX[V8CbZ9$8tHh%I+f;9$ZDkCp,(_8$f; n/F@.DXB2+VJ_;i./ T%VWpJ=mx,g겡'%5Uꝣ٣-ox=GrSƏu H*Rle{J5B|x?OGo4Ƴ' Çe3i<גO ]4v*oC7 3BB mgt~< etr< l?C#~V\jPã0"h%a!LRqcZ52 5=њ? [)q@lgZJH8|ٵ;آy4g@O,?g(ۂ1@)qZ6-a )2Dzj0á%_#_=i+)*q·p|M/K•(1FEG5XPm몄T%>EkS+W)|_tӏ/ v[z~яo?:{]^u Wu W݁W]Uw᪻ޫᲵekವpZpl{"\.[l)MKLKcf74iܥUl-yA 3{MP4O)N>z?O}Aӭ'>'Bӭ}Ajڿ}V|.CwEU}Vq./E}V}o>G.D(jO_ {xOdG_4,[˸ަk1"*vJF1@z.ɗ@p,&|›D#A_cX䀒-dA4=DӵgA4{v&[ bzt7 AY[rtBD/WM+-+`uE[ 5~4_+KVA6{,1:wF9kƫkʾB.5m_dnDѪhDZJJE;j~k+joߛ__Kߛ`ͿLPͿ7z ]-uz§͓g&VZwD`nu`wk2xtd鷲֩]!].EЗqګ)]G (Kv'휖ۉo\F@ۡȒROp"ۋV^T')ۋ {>^ױN45{J {Qc$|(ж  )BokanDdcHPdo}5qÞ /'ti9S\ ѾQQ /t'VLyKy&.EG_X2gE蹌ʭ`*V"qKN0i, -U%iI=lwVB\kۂ`,\+^\Z|ŗj-k+uѪh|V.f\Op=)Ԏpj6O\CkEӈOѪhup{ q%Fb &)©ټPoM> kcci!2!Ҏ!2^CdCdCd|1DˬaV02v8jjf/Yìfl/}E_/~/ |+o0OS(Ok"F+ZAЉ}^(B~Ymp/r+1kIުB&{So^˅2ӭze|^өwRhOW" H2^zKy|`c66_ؘ>ylw_*&P7;x/pb**w_`_,X66 1ۑ+?޵Ot6}@}QF-UoOj\qx__ ro_hY[c'u9횂y{)kLv˚*nO ?'ξG=YZ{"ac гG=ϐ}ez˩/=<^. ] dfo.DaT ޔRK)kUCd}"CxŬU|7Dbf//2_/ } /t^}}_􅎾E~ї_e/t_t3]eq/<74dU_,Ot[5o_}}_􅏾///"~/^Nu/_K=jOG=Qf/fCӣGg>l{h@vۑ{/↾h߱/ϾH|yy_BvE&E//>S8e9yuF1u4OJc_:2b/^.h>J^ŋũ g}y {zXiկ8}b*4=tR4;eV'Ѓ2&ũdW(aq+d{_U&f[f}u {}ʪRG_5.5jbҽJĖݳL}E 0N)-~_3;Gϵӣ3T#ު" uKhrjw:u!n-|qkr "/*+%>=:Up(oWkT5/KLJUs@^vP^,Ioe1{u)~|QxoK }%x/{}/u;G_Hgo { g% xڲ/sܲl- o+7u-4{hZ04{h^Y|X OWAkFE#NEzv:Q5ÒU"Xy[7&CG7K{I YLqz2ōնLqz2iRf+Z%~}Ks2'M(sRj2.l4x*yGW_y {GRv弈Eӱ+bWǶg N\pzFJn׎u/efQ7^U-Rj@7b[QSEY,C1Uo\jת]!U SԀ|7`_ lo" +Eo=BvB-~Xȩd2^ }a_RLSv T`//;CYDg֍2tC1!0&f=ƄcBpL=&㘐kL̊cBpL{L2?5 bVG"\woNx5Z]7RFkvӨd&ep^*ђ~3o*0ZvEݧDz IScvrT-[_]Œ)dG_lײ/Ku R^}P?RRTON}@oGߕ))[/ˏ ;"/퉕%^|xi@IΒ}*"RNϖx7ESIpX2nFx?fV|"ɋwwzJ15-lߪT8FE67u+}\SЅh kTDFjnީ b= Wu7oїc c *iV$ Te"tkT}REÕ秕l/3ۇg{P/H3,:" YXHBIz-%Gr-OD< YbH?g 4XP~gTtaf:xW V*1WSۻlL?T.EzVtV|VtVsf+Zʾf+>f+:f+bR ξN3|+s`U x'C TݳbG1۵SvND5vt:UH7[ޑUucr>|v*C ~ : C_CBP=MzaU ĩ/&5m5)ymk]*>J/{^x/z/r>ދK=ދE~/Pcck1T**Cq=T*"_ 蕌rQ%|~%\p_ ^I-^(JFy;n䈯8kyxG<{s9F<㈯5+QpďF2ti׾gek5sSbd}|MDL܊F****pr֘&x** \M***¶.Ӣw/qeyB&^:f[tskK֨.4D^$ї៉ sC.|/ES.·n-}fvZ㘵=kᬦXajYҖ|ZgVb{qZv#C=nzvDG7`=XGpKWNG~2=8~\4”e/:YpR< _3ۇ{z@՗Jg_oyS=\ξL@}tiee7q});O<){Rξw 1cO.͔ /5^1^@~K_8^Wj#qv/// =^/ju,Tgt/5ڊ%)[võ $+{":|{6] `@R`k䬳 m^{n|vȈeVfEYˬY/̊/̊l",Y$0VxœEpƾ/dܡ'`=qBS/fP-Nj.|h/0djxH>zŸ_o+(d?ĘhUO٥"|Kg|M[ԆD++UFl!5+e#x9JMLV6Eȑ|O_ي'Vs ko8*ՕimGJEpnΆ,>\V\zjf>xoDk})4y~C6Ekg;cZqfvJ_(rj<8y!ZX*_o6@eFJ=%V~Guu÷KWZNhuz#BGpl¯"Bu,3=h<ӣAGV/7||/_n-|_|_!!M"\ҋ B"YinOTʼ""{?s┘y$<._ ]#<9bϓ|>][q=tЕ{ ]ơ+Э8t<_v~\`*Iإ OR& {R.fy·z> uWؾJ=[=??_tbMExW'#2)O+g0Y^3e<40Vn0)`kЮ=KPVH WWm5B4vfֿd'휻!VﺳJ | {I>%V%T֦ԑaw֪h]lkkn5Þz]k, vͰ/V箹îy655kxڷ>OCio}4Ƴtm/SH3cu#~VuO σ7O=*G*'S?Q~Cw~Q oO~GS`/CÞ"]ut>%FDF{X?Ƿ?PGW`M-/k /М]@#Ze( @\j_q6892VG`~if~ĒR 9T3- v-̓R|\v5Qmﭮ&ALEm|ݏ2G|C#|>ݟ\t|rE'&O.:>"䢉\tr1~r~rkڱV+8_J)HXAA#*qM")?'\uaCd=G sqݯ+HG s.ѪhLԾ>/Ϩ}/}yimWTC[[V %#>[ʾ82)<LFԁиF~wjTL? ^''-s~zn0*gUrX+¯7-auGz;41]bit._O % %˱qV$R*ƺkۼ\jPź\+y9 bR=Z*A+C ,˟Yǂnj¿n' } vN`*=W!%|V|=Y2ޓ8T%d+??>¯~?_s H쯻)1%vf5ןG*{ЕRaV:4xaoqP| J-<~%`Q~V;j}9Rzk w.CW8̀!y"yß y'?/,t)7mm_lD?(zɶ-g/泒//>׭_uk'jg>&{^+_f 77 70/0O0{̸a^a^ Fk5; gIj8͗B|{zĢV!9§-9‡ _'|]>$W`/X>ݶO>}}Bۧ[ۧOh?|ƘO,R"/{`/<_3YHHU"K:b_)H7,S+K?zj"1% ix?4xwo-|>[>#| {ZRzv?eH5JEC~ *X 胷*FJO+E`_(L'ᝍ~7{,T\z(ݨ;reF h87QH5s[=^ߨX)/2\x@7/~{W_n[L;['3K}C'm;}v||q~%EA,?74H=O6$ Z)/RW^^^?x ?x[|B1{ ň{ /ᣧP#)T)L>wB>I:YɃoPQ6tOt +&톫{7]y"eK{l)Sx^7f^sx(s< 4ro6@kT n6@\ i * _YZ 8Q@w({Vkj1}<h u/*KҴ7i lDKq/M7R{iֆ%J'2ݳʮheC> Ƴ8͗8}\c0(w+g%z,#>0D|Y;e5Δ:r5ߴa,k'Ԁ]پ2}@dw>' ھ׵R@XO}V 'O7|B泪 60Rhu波 Yϕ-n_BFe`cRsq9ϩT%D#ԣ>_桠=Z# Pf _(TSJE7V" @dNDCV '3hz-<<99]szU<<999>ߞO79i0/k{C1  5hX[FcHLXOx c9!%>`wJD:,#T?SeCW>Z)駤-h)u7ܲ픔R*ָqhwOp>'d|BP*eeԅ DJuz j'}KCB=x6sbR|w.*[n4Xs}zx]VWYؓ 2xR[oU_ob7JtiV=zos>'&_͐gfO=Z]j7 77$ۜ6ϸaA;y=|Nt_A"zﮧԒ 7'C!oK.St6@sbba۱䕃yF|on6N_mse5kl.s=ω"n|!JHU"s±iRt45e@92]_oe@đASjע0twʹWQlك RYTHU"K*+ԿfɥW#("9وO`t>' ::d|uT%c}@A\#FڎŸ~oI U*v/;cS@|N4BFAsֿ ~y{wۯ;Rۯkl.n >y)M4%>EN>zÇ687?ǜbo֜/Ct·ܼ rN/ԿxKEh,t~ ʗ g>)ߍS__ K!y|Zň}nuskkĝR8ז$`k>j_@{]Wڗڗ _tˡߐsA7Cw'|;VCx-I>zwO3Dn?rA f לpT?yN~R[o6?aʌm+l_}=_[E +a^ɪF8| ?}Bw>'<}Jq>2 <=ZսͿԀnohm]_ ~Co7Zmm~G~E~G@>f_gyi" / Y#A3 %+jǭqkjڟo>~oϏ'Ÿ7-Doa֠ 0W*N!%>pRr=*{% ww;y85ww.o;:p9's3C20k1xD u0Yg2x'G+RkZ/ " 9|w1~eDŽȅ cك ǥ?XDhU4˃z$*[yAw?OϣGϣDC?"~VUPR*&zvȱEՖtVpQ\w *[N MZ%޴D412: ԡ;ωF/R*'}wee,h܅AWw='- J KV7X(ĵ];ΆXF;ΆXHT ,"Ӊ` jSu#~9?zE2T%iKk9|ŭ;Φ]B`pwV.\7+Xe㖍-[--۸ll ltoZnM¿lhPD8CWYpJ5iDhuvԀk}I+'"-#9dqz_o"-#>G=l_Პ;!r z`O65JbYAlV,1VwU1_+)pY1Z4т-n "D1ZۂWp=~_K% /Wp_z_UZ=[9eE9bElz8z^5m)uth +g86> I6o w>':Dub=C7K/`HeNsY?VG+YWK9{2̞z'߳'8{={2Ξ'_8{{{2 ^p=t .{2]¡.*ZOa'f:HUw=Rk7uɒXO|._kCJ|}3M*Nh|kueZՃRT<"0z"Au@-El_]|%+>hy*H|zZ PbK+D.kb0tg0ta@VGn[+ ZCZuv uuoKjJEߎo_߂z*__ aoU+*Ϳo/>>jo jQ|kQrb/r.[-CJ|}7_j_䀿bF7G5 ~ZDX b>ͩSߍm?aIV~C~E ~C@ /ϼ9-fǧ?DCb[ ěVk'fH5 iYUo==qtc{uߐ[z&`{t;T7ϞoK]e]R[MM>z_τ9Tݢ_w'݈|ٗAHmMf3g(/oQO)ӥ"|};>9?6xOh?VT,Z~H  9;$^,*;`=yR0 ;8Λ7༉yx<-y'\'V |}٪zBݩؓ 2xRч]Vݔ Z\:[+X __W,|__+X g;5?5qYFzN?5Y'''ݟ\??(>~~rM+KO[ Si _k-wJ:|KVSi'/s6cb5`Mk7q)៛~M=M?ᦟqqOkӯ}ϸagg™q{aygfQpay=ȑmZy 5-{ 8rm)4m.shU4=^EJE%l˖%lɽl .[˖\˖F%l{OyMèNu۹|yCoU@+n){A4KW/@/ ~VW/(~Z4?7?O??O7~÷E_.iǺ&~]Ҿ-~!|K :!C"bfh݇D `vT܉D Z}͝ 7;sQjS.sbbZrI=uZ$1 5߂V!lm`>gl !8[[pvK>zo#nӚ򇛻9QxZ񴾵 )?i'^LK4-v0V*Mj)?Z~_;2ځk]xZnX8O??>§߄N6,|s-s"$^~- oՒU/K(| /e K9A^tb%/^Ғw /YwV.l9_RkT%N[|Vi UZBtbURZؿ_ViҒ ZՒSe<3'׺?h9_xVOur!QK>zOҔM46 }h<6?=Z֒ڗv%jZR.~kԀkޣտ"\ڷkD\(RtHUoIZ>:: tӾ'GLGKEoљni]YΗ{i{T%D1>o4,4n4nn4n7 4gU FqkX_ߗ-G-wl{ c۰0a=jcޣnlGJ9vk9Ccc 0E`#xCXeQ{K_cGx6ǢUec#Nc˦;hT%N- 4x04FoA5-~ک%75@˾-(6hzRpznA'|8^G!JPOz'NOhV*uZ]-2N[E[G|ٗΗHjz/[P~C~Q n7~?|Cr88b'TO;8^6a+I6oӒiX}i hʥ}*_k_~^@|lZoYlڵg gTl\}4xM v76*gNlIzJ=~Dᄟo`ߑRO۟hmmǷG %s 8tqCwv ;CW{T.OQ[MhaR/מ|W[6[Qݵxel|-9lղ_MJǖmE봋ȶe)t*M! ~BDԾUb+rVGl=aǩ'ԾT>8g'MqҼv}V;;>ak~|<e ߺF F>%<y0ʖBu'Bbyz?g33g3q3q8{!y&<=.Ze0tᢝ'z~hgk%$pl N8(P/Eq>T>?_:J%9t ?Rk91QBnl]m9NQ׉k(vuQ^2Ծ.R#,eeyۓ pcU0P9ZHBOˡK+ # E's]^u Wu W݁W]Uw᪻ޫgG?}M0h<g~4)@'E=b[sr :`O6Fgu%Mu|oJ@uvj'ܣзC~~G7?>$vdڏ9 OHw=(rxuI>z?͟5hOӷO͟^}ͿulhgS3rʨ'xZv\+y{lȩd2^ }ѫ*nu}a:Erh;-j8O`Qؓ!Ȩ%lRɥ"85-*<XOyv}DRg.r=Ϯn${h*//{=pnRLϗ=w R^%Z]WnzjݶOGoad-yT=lkX{JEϏ?Vk?E?HC`z^K=n7Xڗo//}/j_>j_P>^7=1L_|iI41%`c92}+bDg{`<{V#c1~= Hڦca˳&|Hڦ-/ IhTݡQJ=D:-cR7t߀.UUU1R{ j^'%{-n/{* :"GA$ayMOIX a9|NIXx@%6j)H²jN8ˉzY/HX'>${54-~^}Jm4 <4ϳTy٥Q [-qJGV?n/?.# |^B!a'_oFT] Cˈ?|N,w$~7n"S*,5Rj5fweRɈ?|NDPzV+)E6MkUgo#"xx6Ch!|F|gO/ |F|gˉo6M~ %>[z R98||k S(b c Oq c /P͈5#hFfķf͈ьmF{r;j{X hHc&X+Zv@x[`G#K?[D18gMR8|3#\OF: |􇣀>*7 AANngK5o|}].=(hmH D Xڗo//}/j_>j_P~U||'8A2*PoPܱړf JD/j*pŷ[hzFeuBbtA8͗J?#K[7Rssv;:sr;s sv:&:17ogDg#*@Ym tf';[:ZDg|;&%xQSW?=p 9LjJ-@Zq'ֿJාG7Е?q}C_3 B"TOG@8g@۝Rπj1 D̔GW~_~گo뷶_?~Eۯom~_߶2,Ծ]S%0վ]s%0BڇK`}snton~[ntq>%w;U>gIUڇW￧k8qv85qRYI'zO'Ίgj[~:*57NgHU?%`=_sPvj砆sP>A kbc nqc/&[{['h|=p|N iy V)yPL]sPvj砆sP>A SijXߐVx* H5TÚ"RjTԣՕ}qxGh<11c9s<1u=-1/iaЏݩVT#$-V!owʄhR;[HhRMovɎfJ=C۩I 5>et?PҴ90 INRj$:-HTϻ(·"" m7 'gJ%.C+*qjoX_ ߎP#e~C?>D@Hyb=x40%> 9.auQ0xRI *q)U ,9_\Jmli7zLB0z!|{!z!|{! |{!^~{!uLM~yĈO`t>'V@(J-^Z]mz§g |jsQ&⌚8'q:A>$ҋNb{A J`uZM:Og]+޵1wmrwm6vm\q&kM !|F|g>3>#|9_̫μyWHK_؍RުhN)?נ5)<~" PoPȾ l {k[ X,>"!X,:"!0KX,X,:"!X,>"!0kKtO> a|F|goAX3:uGB,` bw$eSf(C 8yAL` bZ R*?ga$qj#!(S6%xA;8ua$*/U8͗hWElmb lQᓗt_XoGNMޡn- _"Rj{ۂ\)q(q(CCq{ٞW:l<88q(cU:;W_o[1 og~;t_gЭ8t=tC>?.ůO|.{~ M~a mܶ??׏ ;`z}m?=9̢պ;UB'eO~(o*[võfl˳*X-M]ˊa*#0􁥼#Ԇg+ZU+g{*Cjjsa_N?R9Jw2;`ƒ/Ƅ>⎋E`ދ|1&cB_}ieoy}po.v]e| A#|p e|}A Ě/f7PPe.zBAUO j*?'kge%}3G}ӈS>t/m 4W5]VWf'>GvnؑxxznW-v9gvIxuZʌI'V0S{QoPG=r0kH\ȝ[!pȁ tp]pȁ # t'Ѝ Yh>/#>;#UKlU4]JAE[jV/ϴL=`c q |D1&DsxMP6f΃=f.Ng~280m"HLY#?f<|׾%=W<_WtSOuI * ( * +oz;r`VP;S5/nGj>kp|;`t ^+44VЬVPS+h{VЩVm'ps nپ]l.W L6ͤRU1 ?i>fe2#"J>f`A0cfsMí9y>zÿ57,47 ްVЩaqgw^# "7FܬF\SD{6F GW~ߺ "nv‡, ߿n4<9lSNm<`kr CNy<<lMNm<`r Oz!^y,5|Q'x:O 4^Hq3<[k8@Xzh#&O!D_񵻿K"6Fo=E;zޠZ3nJVCd_m?>Wq.~N~.~wu9u9g|KS{`y^m}Xv<ՎkGWebGioe[bGW9(x0m]XlڄC biQcA$i\! ='#U~UM~SU~RKRIoESΡKs}I9oUjdH9G}J ć*+) UA\ڍQ0`8 {Suǎt#n^zVۺiMcN){JO 箕:W`I{eW;4:XE],u>رu!G\, ծ07A0ӗ* ʶ՗*m T> WOjq6~;Eo8 qwٔy1F5$3$^)ȐH_C"ɐ8{})rJ;!1Đ!qJ";tY/)(S֖w*|$2=_Ti]!b ~{%/킿<O?_3O^!~oĺCb8$5$ofRTT^EZ1UdWRoy!#S9z9zns^9z9z9zu?9z9z}n&oarܾnMmrMzlzd܊Ntn[ᙘ:N%Ӽ&DN+<STm8LL ։5pֈX1V8kDuv*lY#!w odx/0e^(gPbȾC/o.|8sls#؝3 OfT ?8`IoLh=yOjIm2dk%G^}tY3u9#}dN3>s*P9ACI;{tB>v&{dNO;c'xb/YO^u;Yy ?qQ(#1uI@HŜ~߮%Wq>־LC+47/z)^K⦗=Ӑ^/_ߗxҵ΂׃mHd'yR Ԁ_Ivʶz,5͐ "[|Fu|/<0|gBo!Q8AKrB>fZ仰^🾿}i_o_}Ӿ﾿γy֏giYoY<γuώ<\DY7}{kߴ־=}ڷڇ"Wſ>ʭr*TX,qTjFh B_;>Grf xd@y$'Bšd^M|$42)Q$wƞwB&E{@ r:Dw: LD2 j~D: L(2 ,ˀ5 ןd˄;G#H  Fu"g/G\˂H(+5H-_V`<]b 0 *K6 j@tNC{ ݘ&~ۿ;Ӑ],Td8z4/0G_J'WCDh0+4>#UşskcSBgt^R-Z|vG6Pdt޸EcÂ$4uK/= j]pz.s8lP.q e7j63)m ~w\}R1%6+o?JuA 7t2.{Ľedwغ]] ե%gi.bqBR*[&z'!~_)nѥ`#ݖ+w JuAA%r4DU,G阅U٢ 6QeY \ý8!za.NE^ u,7 >NAfqB5|Hm4_7#sJ"߅Ie|'Ou3鯾h[N %)e2P ړ95]sjm"&=,;-xپY#>^+B’5xtHg#d ]"9O٢˯n׊uoz,N' cC+"vp:!ȺG K:@wSDD2"bBOSq!g%MCC*nѥe-t8ThT_m[-?A]ʿxoܗ.,u^gkuu+RۯWn)TfsB H6W+ Z 2ڹS맲@iC1TֶHV kthE;gE&PNޝnv7!->:y4> )JYTcvom  *}8>;}߭$ݱQuVF8waB?/;BQkN9!Q޾Ht}v\҃lN|~`;PFJ$ٝk j/h-fE9Re/uxL4jcd:)(q{&@:h]4&8RE˨_gL21N7 F@u+m4Jzq fw" 4 T*Ri5DMy ?c!-5^=GM(°|V}lftqt"/ÜoE.dǔbu#5oU"j4kHAHA.d>Y d ^ :t0oBF?:E~ !Ðv6vӗC{dWg^~_"x A١ض~&]z!$.s(եۃ7y,i^22ÛO٠T~w\@g<2~h72v_2~h72viCGNy~{D#t^aD\ԢjhHUcqZ}s01:݈Qk8R7k#F>R/?xAݐ0MJ ♥%d BԾ|~ӿMŵ`}??X_WO/8[5j×/Z/_jOǾ?'wOvc;i籷;yL;}u}c.K2z|SBŒA% Jv4}d E\q_M6E6IS$M1&Mam"MQ4EIMZ瘆mw]j@> 6@R>nKGwg _rS~7>a|V8~~/7V_ST<<17H瑑 wyvy * ?+ * ).FK C?\iJ*T(,qTVKŀ;6\m#T(wJFi١˶%Qe[{Nf۠ BX/G3l$ *ܓO4HH4Swac ʼnߟ ǚ5*4lK Co{_ Nd EH'uBq$''np7`\6H.% ^Rii@*n8ّ! dؼ"CWv Jgς JuAA E4p˯3EJuAD>i]:݊lttf"[u\t-/y=> ]&K9d.Ip^7SPԅn& Dž[tAfx0 qGErSSM,X7]KniqyQܗ.SUa֨-z |$^#ˋߨ؟Ԥ=W~^T¯8%nf|W)%RroP[6%㳷&ondPk޸ElOEC3ĕW`mPB#~hbXT9`:&4,FW|>/qQ(:Chi7{Vqy88rm>%ghVϺњE7ZYt7RF'+hZtUFbmg% ^7rTlԖ`MX{]vBvn ˯>R˯?2苯C=PKa 7vAG?";)~;i}7|ˀ$ӻ1OJ3xfۥbq wR]qUzT - }u僳9!z`${`3!h  m$M佇Y+_p䳉|H>{ 38^FH^k25[klվfzV횭lծ٪^U5[kjKS]>fJžt.vb_إ˼tWm4=إ}`r#wvaFKUO-+xꞼy]v^<\.0@n_Zȃ4¤eZۨ{R/+(bj仰 q{?dz$x \;XGj ,~l仰|)(oSюc;3`ί_%(K8L딭∂:/WH]~2(rrʴn~(fCxr"6Ct!B*mI{a#߅U)K }$\a[lF |$9O`|. ~tҍ iM-}+#G닧}ґZwax$㷞.? 1O=ґxY@ѡÎX;9ml0AQ XkPT)%^@֏E ?#}")<Ġ-Oۑ*)u )Sh)T&IHPiU=6I%sd*֜(G"kOOG낿¬z_}b7'W>HEjF7'~'߅ U|#쉬r9:O֫Q%l(UOO&7!D5*X~ޮKԥ?Khv]zvYzGӥKԥۿ~ڟZߵ[]ki~→g:qN8;q68N8NM'NS'ήg8wnǵuy[罳8{qmǻuuƂn!:O::xgϡsgs9st9u:{j64~HN H\>n'C_Ϥ*o*/>Hwa_a!*. +w"E ? 0#%)M#U;={.=gf5{k\s9u\9ΞKg={ܭ9;㹛yK-9q?w3{"&Ws[#߅ ۃ do2AK{=(k2AՃ:M @Gvٸ%OWWD/ *GKpƛLn:nȢGTܷ }a0/4QjߙVZ li%;T|'߅_0!$%!$#߁/ r5Ԣag@SPŧ5i'FZq ||} |q|仰 mВiÉ"+< ̙f |$H3R-pIY+4HGoO?z<Ș S|ąݡ&%( {LN +|s/}U~xC(f>U}(l߈|H#/-['߅UW-%=gzmv(t4H¸ >A "рz/Wr:{t]l+B| 4?D%ϩ>SP3%*xFA }SK:Um ˮjvѰeypOTK1ޟEOTQbd%I#p_I6| ߐ bjTPSC:a B_h]C?RCcaXXh:cXX:=6@u-oD^D+0&%"F;R^!_u]X{Y,S2sYƮgӳr)_gL׳L>tF0?]5=Xy;.1 sx`zo+$6J_7 VgMEEWҽzs^t^t{%{9u/J]]{Q}K '"Øy$3HC;$0u!1vy8R\kup[9H"^̉go_Oy SyAfOd!AAf$<#}uu5~(Q_C*A_8~7xI_C2ߑHW>Ӹ[oNP+^OyP*9i[Hk|~c﯂ǑqAp9x6+ ´#9 c[H]XX|T'c¶ךZH%h(uKA?LR/̗1w A=GQpelT=SnwO7p|];55;Ց2;gS x:=RMT:3Sjj2S=SeRMTR ‰=W_⾈['lphTc4Hm;5 ]X/H&?< |$TI D2Rʸ]X|XH<%͏O Gbx#Ή#qcq$.SGb\5za#Lr$H ] MT~U:ywh|nbЕzo9WQ*=zqN M&|Be`̝=P3$߅wa}?k߯-i}K}?vj)O籤h)o)y,i)oyvy~~%#O Q};wZ~/D-)_U)~Cw=;ATJ^GQafbH7+.7HVnj|Gҳ  V\V "Rv B@dj䴵pG-QՋ?{H>MO[;|-ikj?m-]X~ݩ$*.<~!,ɰ&TLVCN8%ɼ$. 'v;⓭q_XҋUd8R+s7+>./z9{#jL/ MB 2R9H-d<HT%:k\q=qt\w\/Sz5"p\/{\"qTf:4zMԥɒ2x^-W6 7K>9%>|}@"%yd^鎷ym=N||}t+nne_j]ʴ[ۭLneoڭL[@5 ٌ7B"wMz€RNyz]m#w(#1NStIxtvwadGx# 2t64di*YIosVqf^|['¯:LY:L}MMvޠy%7oHD*Mdkk\oQ-q$'t,sF~AsFsFőq$')9w7mg;S'){C W? 6@<0(|ROM~@v*Lk}a{> pvh]4ҏz7_ѹ8%d!Or ; ^T ޠ$dxx& IBSq_܎G}wSxnxnb YjǣZ#vSxx4x #+xdҸ~J򌇽wCV< {?o#&CyvHda"FdkTRXoP[v)鸷s'ХPq_>=§gyAtKM|zj{|z">=xѓjp|zO/܎+///ᅢ'x\wWbN/;h;n]Vx9bq;ljmƀXXZۂYd仰 mSjǐjpW1:ND`NJNm|$)ϓwϐ :3.?/R/|q;g[#Ua\:-x*g%"6  "ԨA%*I"X)t򡓅BgyВd mEV)}$S,Zfoa~_)-5!<;B+_saiW XV|<j> ݬD/ )o\ D~@ґ:=jjڃۃ==jڃۃ=~y)s3/8G"ɾ5O `<mo%vڀ1(7E )QK6 j^Z4$ͱBFJJ١K߳Ւwt;GaeZ71Хdc ޠҹY%fXv'!D(2d،IĊπrC|OE9MO=!7=!=\=!#гkiki_K۸y-mki6tifkiYKCai;vXo;vX퀴KF6+Fv=ާ &K6 J2/E$Nϕ}w;%Offv;Xsh![u5x@6" ?~iH %]֟R]VjvIۥ]zŴ]Vj풓KNq" k c Ql#t@0:_5pB*Р|GjiVxF{L7 ap @>{lEvֱ}q.pn\lVB^l)A.(X7tBn*#;Gm6xoܗ.}!EOc̼uoG >@A9|9: 4y>Rzǃ6l alnN HkhSSRA_&1&V>R|kj|khOZ}ڟZמs#]g t?@)QK6 jh]jzo7K}LJ”Е_v ?x#q+ -;>65;>zÿmy WuxRyuzϪ_YSԀ8ކֶG9l#Onͧ!=*àT߰\g7$@4|~v͓lQ%;D^@6ځQ)t3#M`H&n0a R`2N>' 53%>?$Dgwkkw]pI/O]~z|M/Gۉ+2_Nxнӓz@Gl\(5! Hxp^OvN }Z7}{kߴ־Mk~[G|/0Y7|3 JDL7"k5~?NFc`.[m_fU/gP |G?vSivy?<8kӉԘǐ "4^@x98.h,@uE4#$ 5oL;T߼f #5t ߦԁ߆ߪ;j nb; @E`"-XwX";.CwMQL~y//"GV~Q>ތs nx%AbyRH |/&aF<(€cY"x) (NC횆L❆7NC띆NC0#n Ӧi}OC82t &JE=] mWnE!ݝo]N|ޢu߁u L݋w L݋{@-@:@ًbK0!^g/:E^ʳ>O|ً)b_{ڋ"~iԷu_گZ: ־NCj~~ˏ?Ws ԌˤUEF2=mGUԀ|~ O7zjj/~ڟZߵ[Kkjӵ8t8|bF* [N_A(5#W 0CJ^@45HUw벵tYektٲw2]n?˻l-~v]?#}jXEjckku Ů}R(8oR2hGQb:_8n9lΫ?t*nw|u1*q|;RF~F *2@g QMpN2KWxk?ad-HArֈ#s >QaքWs:aH厸|=Ӂ0HS|”Ӂ0u 0}IDu+~uf'/ v3#|9wa}kԾ"PoZ־i"P}E`־>B?c3V#% w`4`lѠ27. :_]pS:ܔn{wS:@Lg<ܦt6@nJ٬t?bJ.ij"p #6rlj[&D;>}|^KK$߅UAY#r?;#s0wf(:wfl;y"s̝s$߅ |w?|O|/?|On z`Cp s2O$/p(-Uµ&lY^z0'Ag*7"Tqw^O *K>U/֑|~;wq.H&= i:}|͇VAD2="%sM[7Vn"n"l2MuYƲn"Ⱥ@yؒel&b~o" ϳ @#w6]]¦pWa息^>sG~7CwN|՟t8G'=*[qޠy%'5Z٠8y}邘eY]^ah0 ʂ9T 3`f=v`6`V~9U'y8~9gL`f,gǘ7twgǘqya%V e],p-ҳ}7% LWr,pS{ӯnys^EJ@EFp#_~8XdR}l?ʁ-H Q j8V.}*QN1 <"p B௓gz×`/K ۉLhd"{(Ȅ/^L / /?jRw]~}}[C"z߇/-n#O<D翀LyȪwa}?$_evs8{|< yЍx>}͸M仰 yT/?q*>0~)&sJbRiTqۤR,L*}"]>eϊ.2<7hz*/xCjGjSqK1q2z & pnMLI4I&&Hl8Q&=jTzmH[Nū:}` 72k6k]Kro<,)W*]Xo _1>?Th)Ea4!D落'#§#:xף'+COCOxg;B'rr[L| ;+B;*3[:RNnB*#đxW#JHܓ{z=鑸,=oבxvLF4Kp =L6]t5u5}qAhNk#1?3kV%CZ {5,|`-Fv* C*G _ooK==KKた*Y6UW~7O~=FTW~6F4gوY^M*b,K5b߫ɞe1RŸb,9-Sگ~M?~/dZ교w!Zw!˲դ Y~ Yօ,/dy\R"\ C PC|Fq->,0Б J@zƲ('}4`jd\ɿFA%#2 h2\Er?9u m|n+jN_~K.&aI?[*߽h:s#U?G}&Zτ7@Ot(̂9^)bxyGJJTN{$-؞& (%ށt tm &p w 4]3}`z|M(|Z=xnA@< \<,P6|ֻy0Ɉ h+~hb8GS)w‡b֜PQ .7 wNQ5K=ի+G>g~F}< R+'߅N*vu~5'dn.\gѶj#P髈x3;a\GJ=qޠ%0WO+M%xooO@XWs~@8sҒ!fOjU5Ka)Gjs!}9 ;!z}? J hG;=N(8]Xs@2#p)xG|$ 5=VH gzÿOߋ|m^t`Tww/j-'`],=%xt ^t g IK^oo?7o/|#|)|owg õ[?^QB--Ow!6X?gz|vg[aͰ~V]XodAdD=?NX#1N4f_;RIat- j_q2GP@RpC*I ?l jHM[ԀϳĝNq);Ai~Nt`ø? ~c,X>^o_wdY!j1H*N|~5{wRj7E~|2 ¯?%"G JU5R{~)N%;.ߴ~{kh7~/ZߴwgˆK߲e?toٺnf-lϖm6ٲekuVljڲ}2R0e[ O毤eD /9y|.ܿ|w|D`> N?Z:R7=f{%߅Qr0'-<)i5*\&NJ2qbj zQΓLGj{r[!,k Z= kPdo!gDts%߅<]g3Og3Oי3Oיߙgu3^9JӤ(sǖm~"Q{!}j3PƄM|V?˟6OmvOFx{(R0F`)ɉf_'˝ Q:/)-vi٠BcI 4U-|B0ږ1ESdN_Y+R)F: D|VpL6@xH NUYN_GRڏzHxPwab8?Ё0cbL{n1a-F/2F[jrQ~ѰKEÐ  z0M_4L{_4xE˾^4EC5}PET9 W?l'n'Ln'LKl'K9DK|AK |y'w~˗#}M߯~L˽޾ܓoL&|U\c-+ԐŦ`}cf>]#yZv=.6l#ӧ@ |{oޠ*cQRyؼ aT(2Y 7]d.k* VfϛXn#0_!h\?ZoyM7F1](7 _(s7J'߅U໹*T; x ^.Û /!T(X]d.VԪD|JEЬV9iF)9j./KwN2V99id:';'IS${椕tN2{N9tNf3'ל9ɮ9ɾ$uII+_s]sfNBT.]RE&Ƕ=P +xڲUOXٰ@CoB4AAJPG/3;I G9Udvj@dΘ,Hpn|SnH / wa߇c\1G9{xuQ_=¸x$9u8p%j0? |Gbg(h{x_#YҠ8waYۗdiCLYVDB6Ҷ,m>Kj*Kۨ_K~ N pks"j/yZ{Y&< 8R~ Yq>K Ue9 ?e9k9ضۥE/l}=LaBv#VN1BhyEٸlPdI \];Ӂ0߁0t LSЁ0߁`:5myU'f5fd1^"鍑%'|ޟ仰 o6ͪ~nR=U>x!?lߵߟZk-'BV>銠ea8Q:sѧ "hcd;r%_|)ys;|}x<_sӇ|Vг3U\SyTH'NXs| $߅ =b ¿@0twӺO #D~`%rjK)Q!7(X'tK_x=YI$ YԘ/)|VLZGB#킵 BꉎtZO &r;˱g7GXX0XQ،m̝D;(PP۟y*Uh;hyC41+ _6:;_ Efܭ|55sBW^ O]XŇIAcL_66nLKF; 2tRRuDl ߓ`=HJK{"X56_(5zKx &ב{ s$_pWKk󗘾'-SSUwKᣀhבK"vy #TT?B;q@^K:)v"iCҁ0ށu CBׁ0ށt { `.>%>SoꝎsLFT`&~M|v]Xzkizkh/Z}_ZS/hε|OUOJX{teGW NT}9;O-]Xjk2 &<ȲϪ| y(JiY4ZC9faE Mj^}{kj־oZSkߞIkߴw cn M3`^*%:F_$F̆ K^&ĉqhבz׾,_㖚__~s@Ue|cE !ytγ$ԤgIyUwKy$u*mb#\ T`;v*ul^R!,erۻ$pU6HnU=e<SjV{J͏=SF$=ӈ䖿).X1:1ZL_xvA[=)25]X~yV+ {YY jg%{f_ r`g%UV+XZ >ϩ'"nus|m;wtR ׉ ܟ%:@؎ԀxkAs(Ls ?d仰^׎-dx+esvȯe* aʍNiżz*Ɯv[~;:K|m 1zQ/5 bw#ʮWI,%,6E:/L);%A(8F v~)9k7~oĉ3/gタ7]Xody}_rJSr`c]_S12u}")t_ŭE{C4`A!D^@xv|b%ܣCf3 ߿6~Pg˕8Gj:9^"h2#ڑ)Pz؛y8[|m;?DԀ3 p"O/ Jٺk6xn6۸nݺ ٺaQ!ٺMݺ ݺ6ܬ:|IDqNv;y@/ݩ#U%O *ɽݫ` X J ?]h>1?;XuF ރ{P؃^Pҥa^:KT:GT:o`9M)N$i!BO#t,*xJS̾Gj:hrbT77M`W&@d tݍ>zE@.U>mP$.ڀm OQ/-(EGv ~;Gt] 7u1dwڝvԒvԒv%i;7-߀_T>qTHx&*s*w`tVjP3+ T]@@Y+lZ{wA~˂S[|g&E|roMAt l `CbLСPvhW;#Pv(Q.iPw;Үg%%=D/t@d{o%xI ])nzŮZڻ5]5.Ů^´=޼&y浮x):klwlwE۵YW^k'%9?J{WI~wm90-qN ;Ԋ[t[xnf?$ۖTJ4T2~WދҚH!ckx%i=۷IQX`p>/jcٝp ^;o,dth / .`hZI׎b968 b5oCC}Okpni߲sbajuB _udsE$@݁NyLb=q1ܓ&w^<'OܧSE_`_S}# V- g1/vj|<2Ivš+WoW(˚>V_a xY:,4pA%큦y\ kSX;cӉYieo? Xl+/;m]of{a3hǓӢ!EYmҎ7J$JkYϲ+K,ugkE5I㳿_[jRR]uiQ孉`(/mQ Yki`ěeK=ߥ~K9K=K|z|r|.r|z|4sMD ;s"B=4"r/-2QJ>_3-EZ R`\Q* Qh$# 1 8Ff@}$R#4 ĻHkWԈ7R4Cm>MX߫tn (7Vhf:-{F)di^H'n2n':U/,%5Yzؗan'F.B"Va@wB&1B5-UC=xta{Nkˁ6d3-Wmw\0ߌXR%=ҋ rY/XIOg_.^C}"$(~X<Ӭ@rxt(TvN(p4z_#PlVd#rEѺ8}LJW>,KNr=N=W>ZrϤxbR=wyRcRlФk3@d@c4k vׄvǀ4)rkhwMhh7ihݿ&mоZBC%D}d,WkR".;vZw.h+]s oW݂Mwww"ww2"w222~]}4|4T>hHَdZpGIGX\ϣpp~R.]^b~98uxYĺ {A|fNN1RHW+士}ϛ[7A7߅ϛ8nkMck1Mc7 Y|Ӑi\l5Cپ(lC6+VP¡lǂg([NVlN+o;Y/`YJ:(5dֻvXOkjpEьHΛ\ ޿gZ[>k?l~׏?q:(jܕl%-<ȍ\Q ȡ<U ߯vW!|K@s@\QWO Nw`_0Oa:+k0'0;k>awյ5[p}>[-Xނ][->< o-?-IS'ppZN+Vp9Lg"vatG(|- 47yr7;fjeUp;K!BvwZ;xkMA[yyt U;&Yt6"0c:fJiT%&ItԀQ 1Pz'אa;? p2uTYfLמ[P5Syoo- ( O7F?t@? RԹ4H- R6 zO\s*3C`;J{Q.ey8 -i'Jn|z;|G#h6z;Z;Z' &~OQHB?'' :; <&O~O y{t`<wt1tt1||bbv>]tt1tqg!R ~otߒP!W>*~'Vy K\nt8:^BK)zG8/7/Oɢ#e,,^1yP+W +&+&y{b~ $¦z v`ѤCqpݪ8.Cב\^o> ;݁:zY(0RX` M::PAWc _Vp G +S ǯ%0롰5χYYQiVxu9+fE{YQiVfx>bBU9Y-L֝iDͲtCDw4 Q? X ~Qi?^Bq~[61:h?FEǫ~/xTڏGNxm5ڼ_kD2hDV%<*6}mYy=jLnyU6>y]=t=ttc++DtY؜.K=d! +%m,ʛw՗Jdw]]....r|wee&N !Gn~RP{tr΄UR@Suܫ8^5VǽJ~s<<3eM1,oqJ!ӛ8jZX䍒2l7\F˸S~;gEe仈a^üa~]ds="{#/?dYn-o,aYܲ,Iux,ķg_\< _vC;&Bc[:F[M7Vek7 O}`bIJx;:Sj'^v|&%o[2Z}_le FC)dNk%XMKB2J+_oWT e$˺OoMqbLeiGM@$~dWRnre w0yH2ne3̝2ͩXc $$Pt^h+Z3 ~Z u&Wv4 Xҙ_ut:6W5wfߣh\fr r~pg8;,pp3ޏ. 0hXv?B?6B^WBͅyX. !j:AޫVuopg3"9%v)njyoae9V WJJIdEAP A $-PCm i>F%Ko}nJa? +aǰϰͰcXo~mͭ!"i϶m[m[?۶:m=m6mzlݶ(!D,c[ǎnt?)aE X$V1:JaE@jcd>zSVh4yXτx1ZY&YlNjEK^5I9rh א\Ikt->pBH 4FGX ܋cؾx@.Uxr/f>.Ŷb%vɵ.ŶbXl7\lb[ZlĢ J"\mv -K>+ _I@^Q?Jw@ ^qXW:yq͌UTo۴iDJey`w~ 2KØdA~&$c~tôv`uZCN$!; ˘$0&Y;dY[VǻƂP- ?+COVVc ~ƶAEZ K}^sk+n7^>S&صuwE$.> +t(HAaJ&a%zE՘QEXW(3ۑ`i?hnaۄeNμ崌;esqKQ/e~}v-d|Hrfd>GT4EGґ\) ~|K:zOߢlQŃu*qe{{ $67(NZ"<9+Rj7h88Wx|= }[P2kH9]ϰBh[re;9&Af +|o%j]./8Z3Myߒ×0rc/4+8|j؛J:\@Q99 D+DI_pw,H.Rвy |BƛboG!ZM,9EJrht( 2C1M4 ⵽A&|0Jʱ3ȫyZ"h>|GͫCAfH( HlzN5i=DY iC@d 1nXzW/)q7{pE!$h 4FGX >443r1 Ey\d;:-JEq<Dݐ.OWډ!KQܵb"YYZR43>iU-b# M<{c䩵yB6yqieǨy4scy<c>ã!mV-(3< et(@p#{ \=nA{:M\ggw,5owgR#⽩uǤ0=?|o݁ '`\Q`gt:羛F.i?ut:z^!Q\] Җ\+aTj9S$׀T4W=6읽u>ahVm5hgm톫qcozʲC²#bYò疥>,eG²eYoe9פfw[}SUW|-k[ܽi^L޴lޯwilO1}V]fFvC:Ñx,{5E>™Zrhhjӡ@z4vuOU+5&kIj>=Y"]gYNB<@?1d#R/d7?;X av l>=b+=8pat Ę/=ԃU^ !z!HQBENIR=b;Vr F <4<q绚t(Lխ+[A]Kb;Wt5J<њV +$<t]x^톫`RmtHځ] M;0\R}neZv`,|ղ(=m==<{nD˸/YGݍuǢ4O`7slqmkV $ UiQ@HF?1dc;w+9S2uneiZP( [ɕZ,hr%K<բW+f=C(|o$hUୖ\kZ=7 b7:sCg]9W/Tkˈ&IGX >r>@[d+Z!h;^syiӽbW~V[S|D"DDSXK!ށZF7.Ї < =D,oY4 Y 5 Y4 s͂Zh?1?5 iKRZ+/[v.K^JK^JYhݘ!_blߨK 1DY [ Qv7 ާm1%1(0t h5*_Ak[y%H~@T<+_7Kޙ~XNGX >^Eh,SVl=~i!YmKk+߅(Mou%2^-`[!K:Dg T "kVfuMtgVنh֌a\}.8׀tn .3Zk/^J啨 D+Q++QJ+DVV&J+Qߕ1߈1GG1ڏb4F 13_T1|*#M%VjnC`CTr$ShĦrI r|~||z|9|W Wǃe>K5=Mݟ+,ն (WV3:z;m h}<@,*\eh`D+% yk5'ߊ;r |kDk;ߚmxqkn3 b[wȂX9~$¿R2}Ž4?HY?jQ4 W~dE;>EaM)O!ù~k (~֠a%,} lmdw S Dkf?fi>BKZoOSq4M,uڭrHNz&)aPؖӹ8#=h)kr Ȓ;52Xbe~i]ڊBM]J=~0.ShѥX >EHgq$adtcSR l>Dݐ7I%$˩*V4(HU0INUeHUY*뭰GF8mV:$Q [p8׀txZMu7֚\~{1{jnm>g@V_L=hwv֞_u:qb2'Љ{>׉{>t3udS:qs63ff4 Z/NW[ˉFb"Y5l0Z Ca䈘jd[[irmyp0S+{XKuSayaϽA{X=}ӎa36+vXӡ@MP` d/VZv6W~VC:Jp^Ncz·fFG/f<[NzѸjh@X {p/q~߹{poi ?:=h@WK?Q8|<1VWò~(Rz~צEVVZa**v} (/+Ѐϩ;x.㞺;;xv㞺;S3m&2ڹa/nJz{})N>;dtSRbQvc%hTczz xk]$.D큛d4}B(8!ް^[V9fBy :+0촊m$.NQ[@P{c=࿻s9I_JvkX[ qJ$oNOW0'h?`s]W0}L]Ĺ2!XPI=q[<ډ58 B\縺\8(sZsEsC{/ Հ]~9|kuĶvGKWpE _MKrzݽλi/hޟ8BF!ωz~c`4FeapvmltoFGc%pZrox&Wl\=0!*0"{wAXO-LjR  VhAgVajKH~F $n' B M9RQ.4؅c=࿱x0;} 5߲R َFk-xhw\=p_50w~x$r<Lj|<,m۱wwpm;BIN*v` #Y` 謰N,~pN`Naêǝit:WљkDK%=m6t}%mguMo5c'8Nttt=t;Nq?Ogp1V=Zp/kW!N>WV7cH5(:HhoHjI'w߶[큛dEv:YdcEvl?YdױcYd{(y>~7٬wAgywhNbVa%c=?ֽ[YѢw;[߭{o~~_'clJ5/cݹ2?6W9f)$cI G =XD~hV;uXNVtǹU&Z +_w?{׏׷̾_H ~ȹHN[NH\EtlM@Mqm7&0{# ,,"m;T`lM>Mޚʚ/a͗ޚƚqkkk| k*kWUuNvd:Iht:!ԬNuN'dWd//?/7|#|0|-cJ_jːʵ ehȵ e\eH-CUhYڴvRԦȼN6ԦùNjSzMԦڴ&h_ _E]-Y|E,tMeO (魆Xc"$׀?sC1`l]uHZfif^3Ԓmkw\?W{$-I#i#iHZ<=#i#Iy$-I;`,Gp&gb/+|oucDax_@k1~yt ~,Ce>es> >e>!>a}P:A B B B^'~ O9Ar~+̗\}6m|ޟYF ~+K `i'P, C'Y1uN=VqN U}]A"u]"f3 ѠM~uÛtS<OO?ʃn6|^S~>U$6 PC;+WeMqLۂvZ{X'e[A,{l|횸YsM=w־0=4?*p9wTXֶ@_7x\Q y"QO^>t<(=t<4Dth >P>%>uBoѺc#Zn(;=,f|8i o54c;wEfv~~o}ȴνqGoP~ce\oPlRAAWNh'PoE57˕7cZ-YmtV*j$!qwt% + *t+M˹Yki" ch"l}M\⡏w>=+FDO/w:0kE koZ Z/5gl}|lE*|߉wȂX#@i3_{2Jvbhmfb\CYNk'`B d4D:J17h$a>b"@Ee:4L =搡<&qr17?5kVѹhZEgUT:UPlV:Ut.ZEU*y|?~W~`ޯ/~U}o#; Xx}Td/v_#W|k$1xwp^t+XT!w{_,;h}{ݽ߸;~zUƽorﷻ;~owP|Y6KoZ~5Á?ee3{k t^"]\e$kS=e##H7r=MJnOb 1@WbTĕx {1%4]۰c%;%N,CN@u[$aiל=Zf{:ƚyi@Bꬂ yFHU<6DGLrU<kg11xCG+ y4xC<#5x |ϛTHPHheD.;+$D RVH B YX!1W!1Pʢ%?ir>n0 3rcX ǧx+ 0U :z?GRHΑTx${$?IlGV[Q "؊YBvC a2+tV A _:6CYED/OrVaVCvb&׀/Aew1ăp AxGÖQ#SA~#$;ԩ]k2_mŚ0݁O,٣,ڞeNWBR !VC:JTθ +|}5:+Ni+- {'VCc&WN-FV${Q P(DXijiQ¼F\UmۑΤ=p<Dzu0U}gRҳXK%ƠFEcJB|擒cG4oFA_bby0+?(bQƥmO6p>!:ie\F6m :JoWɮx]յ&=y&ͮy]&uU7I;3"aaf~ Z+;wZdDuޒ@{>d>ES:Sww~);?~>5,J-BqZ`X+xr(mU$זK@#nQ:kK55XP~^/*Jʯ 9M_cM5_S?/Y 1xLI(js"ľ&9W?Wv+c35GODi+9|kE =yXɿMC_|@#5}l;'>ul;d>O]K;zV'%|vt0utE <'ք4xLョDï>xj:|DX⑼X8J<%ޗYɕ_EQ/63O ]|h^:n71vcuDXEqg{/Bȡm#:W=F5N@&B%t='yf.a~f; oot(dS]'ג YܑccSAnó̼ ?49D+WVTx={h!J[pVCfi+|++30xʹ+{JPN'U}ڂ+GݿiozL7᳖ױ3QZlg;Y͕,5PxXR}V6. ˕,+.PwwSvfBUCх@/>x&rokc{^@ɦ Z{^E=W~}VrO'tD5-y`Ѵe' #?AɐAW5M *kW65^y`h}5@ԸxGc/r J(d1hg8BkOcxn S}ۺlfgݿ2k:| [24xʬͽQ93koKgd =?VL f)ќ+݇ >Ed_4|*]WMNzxdUvjI'Y]Z̢+J5ҺoVOAXOljvℛF'Љ:qr8-B:]8G'N<ۉS 8|N0<.- 6o+|ou&ܜ+;۵ uCc%w]qݣq/=JFi{K}K:^y׵_%pm~&Mkr ;F3[ѡxsx5+t<}p%FۓkɓcQѠc_.u3 LIhЀatbQH݌FE]nkP4+ s'1s'6u`n̅LǸ̅L 0lxsٹkL+0o-⯬Բ5y(9hhO/jcZ!hع| 8ms>6:Bkr/{_/{Oz~R~F=F%p}o~FХz}789ؑryʢ#M#pyj;V_䵒|KAQjK$. r09Zp=5oݓ\ >~ lU<Z>tba ӽBoi!wvY; ¯+xCt(~])]1$5[ +w_Y;~qM IU4H҉C MXZ_̰4 U∯dЀ84 f 0 ҮC=ء Kp= ЏD<܊iס%÷(-mWu>]-x#Z loO1VT{u(Nhu_ZEhݯDqʽgEwX ᳎m:G6a:Nag#ۼuu1o'H#ns:u~_NnC_UC'Br zO]6/il^2l^"l^"y(O]6/yI+2+i^աU I'UseɵY=U :J{(wRoe3P\Y%ִoVPXABӀ)K_暆V3ZeWwA5aK;d"c=V~g=Ŵ|ѹ,ebNp B7Gz]WJUQfq/g eb!쮋j-LߴVCcIW k_T1]EW>Is>H:F~(TtWѶXɵzⰞ@=sM b5֣? _Kp »tqDNG6c%BrܘќV+8|yU2ù|x3 dzc=kKHTtt ǭTpȑt(465}yCkr}@Sݡ&׀Ch.> *ZD2'Q̅7@I'>)NOwpהBjh{yJ廮bkoc#Ph;v .V҉{C+hɵ%Ѐ|[|~# yTKh>/ϣ|.rNYw>o=C鼽fMeetR1F k:|Q  1U61>2f9}m|Qx&}=,`>#<$X,%X,d %|X,3cg.y;y;y\y,3wgn&*?}/uYb;+B¨ӭ9;'c_iV44rOyLc*4~+bOƸ4<4PV{ j]խ@Uv(\ qgk÷@#?Zz+!4vG_R 7#RF^`zkz% ΎqJC(X PK0e3Fe@a>e؁IX:'&PQ"*ipE[)r4l# M6"lknRƑ9ouZ!X@x&Av&y[<(#Z|BI],^I-c/gm9c'c;dž|\gCUYyC{CVސ'_gCr 7~`~~C[Ec>v5<],-\ʦnYfzu$׀[:HV|j`$$< X= X2Oh?KQ]L`?JpN XU4@Fo%?JD2iZe)CZDϡl2X{iSJo5M z[z+0i[ 1^OS}T?>"5Bh70cv䳸@6kLf6 RτRi&zLЇfk&h0+̈́Y?3aއɇ =9Tq4-|(Bh*Bh:P1y*&*8P܇‡ 僝܇ C*I%ʶo T;G?7:J*Ǻp$l 4FX;e[Kݶ[}ϭ`ns|K iotl)%7'͠c j >^~#dk:]G*:*/kAfxEV-\xvy cW++߆[d;P}W+Xljusd=;7ktdoA)v -b|O\>UB>xp@lެkv{M 9<5b^Bjh5wX~΋ U~{)DhcV)7F5 !V4 2a4xMFFh00<Ѹa4x0)s_ߴ/ߴ5>iyߢX(_]AXXb,> ~Ytx Ĝa?bc{_~?罁Mo`:o`7yo`7ؼ7 l~7ucfGt_3kEjHW)DJ ~^+ßg;?ogn'ֳ}s6FOVWѨY]煮Qv>!6:J=/ψQ*Rݞ y /IBMz7Қ9A0$eb!}$a{_~~/{h|`NvFge{ 77o?Lv<[Ί^s; 즭w^auΌh?x hࡡOʓqczFT<~O E_cJ %V-Z%/i n$a[,8GjO:Jaӿr5SnSX& ,k07+ o+i nMXJAfRf2ZM,i!kE H<[:.5rR.."̉ Oz(]ה)?vOO1OǧϧSS)9>B)A)KTwZ~oBUI͛dQ53 !HVU@/$o>$o>Iǟ YXs?x<-]( { ̆ uQ 4JruY1$=(<͋_/_6ve@D.}y1 <{5 ^Qj,fv!쵆f&d C= FM:|pMyJOSb<<%S>)QGrRYG=d),#K9dCC/di?»?w,DK\4^xW;w[yXs58d!.g}`*!C-$C- &>d8敏GsGGqͅzͅ敏{4Bha>gy)D( &n8wHAn^! :~r-/nk*JdczczgzR_w-xӻӛh!˵ 1f7mPmVoB۠4o۠|q/QXD%Eݼ`xD /Q^&/Q]nMeMgja`͸66j666b!GO#̖Or_I1{{ZYvF󷩼:=hGѰ"3 -Ny&Mbzf=q*Ļ~yDFd7E+Hz^h$M(QL(3zk$ En˵EZs^kQMhʵ˃-XmZ 5g-; G?Fh0{5FHa$<#a$<;-7OPi܏my_-wvt-wޖ[m϶!ǤIGfBǤ.IhtfcRu: W&Yׄ,u Zw+޺a: gs+֐}_ ( 4Õg-yyuѓgt=xFO;Fƿa(=1311=Okv~=izM Obf >7I.#*J( [E%R-&YScj<ǘϘǘcL=1ט)11ыC/>HdBT1ex8*ڡoы#.{@xN;xY !NJ֝Piɏ׈Sȴ !AVi~?z?9~(_?toz)?%ݚEFRC2G̿{^`Ҋ|<鈣׊O|׊-<)w""Z+oZхWq?gtktktѮQ~FGFGFGѱd*qŏp=vV01:v\@+aIK oM*1Kjxt'9!ک}wUhϡlbnMFh'i{.]t[5馶l \.jUucEbȾt9Kbʻln0Juvb%/7DTw͒]xOG OE)%9A]L=݅Wq_x7c%qQWҹҐ ׈y!syk2J,[ɲBpg#oe~:hyI ',kLf>#Ov"]/y-ƶHo"@*t(v{HmQ٬\k>z?]/&+pt-RŠyIu߈heD"x.;t'YAYbB;(MuZ9'` &IxcWRH-zc3O^JqAC]:x ^mQ.m.yH]g4Ε"aZٺlP%aD M?*/'w 7oṂ*# vi]ۥ]Z]LIaY gҸKoK=jO҃{Hr"NOOғUѓۓϧקק?^_|~}z})))|s؊"忑؏=4>#xDwHq/Y>|~j.P)xW瓉W)F\`;Wq.gSc1<6 ף{87xwb|'!I}d+ta>B_?b]b_bqu3*5*5*ϨרXרX3*`40CM1Υ(+yIڭn=FO;E_wٞlo]ۻl/].].K.[]gzwFvѝ}Oo󒒝hmkg*ng 5Z5<_kk >f Քq钷݀y(ځxIdx5|v==dR]ileޢΖIzo=0*J|)FYNe|(|Uc/gI-%OÿoPBq;/'|H|̮lPȈvJv,>E2jltlejՐ /{gZ:[ l5WD*qu$x"!9ƉN.vu~gy\U' c'w7XI]yIpeIS3줩 o'm0Wq.p|OY啂p"X86d.ߓ [ Jeԥ ۉt5E "K"qNNetٮEpk"Zk٦J"R,dB.]KEwA[.=݋ t\w*I `<,=Pˎv`5^R5.I6'"ĕΏȾN+t wzO[KK ]ԝ>]\tӗ*n%?wL7z1hC,\ Ke;&=_qdecB/p_M{/pt0 ýΐ }p/grdYn;R]-0e.yL'=6[D*G֎8eqؽu}e b@>n]0y%#$Zʐ%[tigɱ<.|{vU=ǺE^3$}Cbn(L;IB6(ץG;Wqߺ{jFx0,\7\*h'X>Nrg-ˡ DyIKޒ.6eSȢ{w7 zw+T MB{Bӯ|G{^zw^Ӣ&cI[%j87o'a5T0sJnHАO |i'ǎ=3œM\4^RD0e4!+=Y-E2`[zᭃ7@&U6]!Ue7 46~;HZvx]M<xIkjEEĺȨE-gE_{ΛQ:o?UΌfxΛMq\nFm3jUeF׌2eFle%o3Q3Jx˳v_꒮{kw}돯.t|{k)yBy',hۜ~3庬h8@^fh.tiZV%h'.*[`83o[9wn隃|O2c$[t6wW$;ɗ  X:|嫞OP'-<_u⫞DnM5UWY襸W]J:1k;cYpקz⺌oEEN`Hv4ղ*O TLPo  [8A`^"=B6(WE{6'enc d8~`üv+17E8BR5 39/oR ҹՖH闰B!C)BwfF;ཱ'E榃y`n`:榃`n`:;vICt"*ݺݭkwv[vǥQ۳xp_s-,#V'ŵp=blrI:I 5 >*m򉛷E۸xP /˼=Oܼ+.2oxSU3rFAz``1UN vH17]IJ'X٩́ /js 2[쑚 ]cYk}`dC̐B*;ͫ;]9ӵ[jN;ͫ;]9ӾӼߤ *J] 41Bؠ7U@DwXQ?[ǦC.5E;qy$X٪wp/]҆S n2%%&^sjرW}{B6(ڳE]TcUH< cy8XEql+jfšlt r 8nvO }XTvWxYjs {,$]e⼟+8drEFgqPDrKgbl eII':,J`8. m|m=H[3$羱 |TZJŝ0vғqwnyfl3-7t D krΜYu5|++L [~֯0++_aW?_|X{MqbJz04]I5/44ݥp[3y!Uw0p F/@q@(r EByB@(:@8kEBؤז* uXD[73p ~l.rc}Mз޷_7}}M~շ޷?7}&Cm>lp٤M:ڤs6)i6'd6ij֡6i6i=MOq/~r2wU#vk?l܌||8>|v{p 4QT{]䇪LE[pX4 2 1n R @: QDm ?Y >K!Q'TZfqs ( +Lxc/3@m/Ij/A15v,T~; Щ ,_NF;9]&4X#2W\{)kP'pE|Ne:O@9l`$̞ml"C ٠Do'asQٮ Kљy G칐0=0Йzk=d0eΗD.$\@C>*/=<] ~yŴ| Ys3U(>0Ϣv-xyoB#h'l'RMd_tĄXUj\zb]]\2Wdxd| Y8epi;I :έn7{IuҍԬ1h%o!U/U4~Fx~5h>p1D:Ιcq \魙1:,ZHu1=e좪΃(`Dkɸ-+I[7{N:'-;'uI㝓I]IK礡spgwf>k}t-R;k-J|RfWiJWE=[dbnZ:"qE:[դǼyͥp 4'X/k 6~1NeM.Xoc2䭙xl!eTz7* I:'M/o'4/2wܺ+'o?{+4Ren[39w T$dkfR7V0Y<ƔLooSuT܌+w֥p[|:?Β &%%*xaEoZm ڪ좡¬X.e ]C-*@ ʪ/Mb0cUbh>Nw˜{Ton0zHu3*q_Ȋ/ ̵jDV^犰M/"3KfA/"?mU* _u|vfFISޚ\*4²C mn<-o:xmR>rw[Ӳi/݃O |(ial\|U(WaD.۵XZ$ µފznVu+j5h_@}] WazAh| ?H/JzRrڪ {HuD[:Jډۉvhhk'ډӉkhk'ڿ贏qg>u8V o*oy}x Đ1$*Q+ _u#6M^ub @ woͬAaT_>y;b6/{%N">|6]U\gM.Ÿvs`g)1k8S\m$~˖81c<[VŽ^IM RqXF0mNBu vLgvy^"եPl=hO^?k.)+]ԶFGR·V$ʑ.̉YdTI`TXG V?ߡ;unCԡ;ߡ;u[ԡ;~o//|d 3[,օ5?tZ'/cDc7={Ru,֝'X_\1o|Q8@^.rT*_rT>%f V.[Sݤw–'법e+벅ewOiy.[w7?/GYG,3^K _l#@Cj CYr`TQg y<~qMb?LK#r٥ x!៭ 4+`Ǵ#TzwoLV3x0$1" /o "2!qx3Qp0y䛼>`< ne^a0pxgH5$ 3tu]ǹ4jl!ĩ~|`6 {-w¡-z16Q)Gd\ѺEhk:yb,'zܗÃjifZ~-|U#z.&5ƒ>I8ܰ i_}|.ޚiݹB'Kެ⢖-} 1t-Ȏ{=Xx|U\)(3w30֘Hgd}Iuؙ,Wg$~VvbB^/{2D킸F/7O[@qmK/ŘiKI?` )^F^RΡ!hWr dfDJQs<뫱~.kQ`2>,j+_W [B|߯P+,_a߯`We`|1P,*jEǍg|aYLƛEU`(WaDDa\uٮ҄cR%|ղq[d/7A"N ȾtɑvO<9Z"+yI0@$o%Lo[;KmKVD23SQ{/@> \N:uh.UܢA!ȱum,i"f['2 `{+4"!Up$:—#|_IG~Fxƙt(F͂Y8J0QgHd 2vf8a@-6T13ʵJ"!N^ -͉{ԋcIM.ß 4\I06[G7KE6MFaУ}"yI8t4t]IdHV-Wj/e3 V!_*1Oı$Γ,ƙG.).~* ]u_ϓmwyQˊ;s]ɰ] ٠L﷭ͯYd.2%VIKH:yvO'Z[3ZYwK V_#y,mmbp^| %54t<>er[mW"u 6UR]t^R3dX?E" ۉkXThٮ˹K'!3AgnF*5ڧ<+˨}8eH>,:Q[R>JtŰQݿNS;PEP5]q(¨oEqY"yonX(UxIOWIA7\!mĕN~>~|"ڳnQg Z}T]N\v]>{20ƗCn~QKs伤5+> \-lAqK?\^@.=ځxI٪ bډF.+ډ[t?}l^}l_}lqyOWWJl~%?yR]}gK*] yR]Wq.BjC'ӊ%v,EkQˊyI/6y UmȞݽ"eGf<|w?.g&3XwX+ 7X5dr]J;*+uAe.ŊVqY(QO]T+jΐ Juvfߞ[d.KDy+%4ۏyIX1籎 IdN]Wq.o2ݐEri`6RA[oڕR>Q"`Uy\N(WaFDӰv-PǦa#d2EN ۋN&+uG WEE2~>(Ԉ-pd@q$߃f$Z5ddo րDi#DCX 3 eYdhee]Z&t@25^e BttiJBCKɪRTIAr ELILL `h'E/C~u!_:W,::W:d!pm礜6@L&zv7yU];5RA8歀7m!#y+er _0C@÷<[-.,rтO Nm^I5wR]'5uR]TI޼IuڦNmN^N/y0kכ/zdZ%zLIu%2Z[:YWBGY ­X"NnuciK+9!+|o 27nxH|p7ywNPx5Y&=+=?u_:w:O;OS;.[ d|B]vL&5Bm1 ~..COSbbX))~b=b%K?O,KbxKԥxRޥxR[ccN ut% n*wJ.tvo v'koYyvvgioyvyΞ牏qM?X6<P/)|x8gx$#c\q~q%EsEAj $<WhjJ~k X W_cn_.VY8ךJo1 XDyN5kd@B'm6nXkz'"H23yD{9g$LrF%[w^L~F'Êr ^!(5,ٮK%./].tF|V 9./*ꅬ?^ȹ}YR/b-ص Y_/$YX-B_/@:lLFv$LPTew WoE]mQ#:~r}\ V>A>Ay?AO\ <~ f+l1TBP S qO27v;J/]Puy:ܦ1_(ץDἤf  ;dr]zװCd.g_d;V\Q$ Vd+(^%`Ŝ7[{tktktQѮtt]GG~GǿaY:D@ 7n-:k' 4o]'Q%V9sTz+$sЏϹpvD6H|k]KckIu'(, 57/'XQϸzuSzVlq%uQϺzQϺzu3).Ւj.dcɮTKvKvudk.dZגE_\jS,&-oKI᳨2CߊT?ߣysQN:EYΗ|ԣ~"dAPgcaoA&a E>B9XooTzkaQcZ3:mir%KӶ> a|P/bK4ȳH/Ӷ{6ۃՃՃۃ,TTI9ԴUA+V}YgEޗU9+ryUyU1uE+a^:ڥCt]uhCuCW]XڞkZﺖkƻ͟5z^kN!ǥ˵F5:_kN!Syou<5uWL<'D:$.^q笘TSr>n 5GoV V_k/y0_B;$$̹s2N>݌NvLizy}~`'z i ?kU-'{ySA)# 'Ga+_Wֹ jeqfo63y;|Kv)9_݃~n`Hߟ >e]K' ?D$"<`65$:"&[ۅR~oo}3)#;]:^N>".fã]M3iltTIт߬fQ??og}Ek_kַ"ogy; $.nHd!aѵ 9j!d+th!A<Ff/yk/7\Mp3g.00vHuuYo[[ufE[qrOi)(Prv/l@KEQD>~xLKF"%ډZ{ٮK>E5yTvO1)Oъ|VOb![|U[ 63xR dlT Ōm5BCj|_% 7o VNw9I$\y}! X$ZH=fs=Id.&?}=Ԕ/W[>pE/;sHΛ-o4u}~ځx7RO.N{Xƴ۲\r͈lqwIx?$ɵs"ڵl?&{Hƞm>fF\1\~3[]잯]njvnjv5kv5+rH^-ՁtME^-א-q,VBf]z;Hјr V5<{# kh_ h8w{sXa=[>,:K=RY%=҉G,5H[6yM?8v ~K 4r䐪G$v)Զ$NNo] -YrS<mO%),wz/??_~% =JЊfu`g m uP(E?AOPO h.}~"@^2ޟ'( '8^ s9NG:9h[OAm)0܍nFwF.u >*Q̴n'&WpAAu뜦 Q;_{p[|Ul\eUθ-,{ڌ!epVGRqc o;4%{bQq *rBjdM ;b- 'DB[5əHQspޞ>y0 'X~~f.sUjyf>:3Ryj柙9?G+ |+ |ӤG- k V_8{q5q$,2qL8ɧ#8qg-2q3qxo (¯ )o * )wO*ӬO9dNlEJTe{q#q0TgZ||ԯ++;~~_WWշN +w23~f:w23~fg:|ovў>~KZZ&3u*j Bo̓y1wypM YpI΄νΨ򡝧kyyvkiyyvv`;?l.Ϫ\ugUg՝SVegՅo]rC 'ۥ1c2}g#]' 1I>[ q7V;q5bz!VR EukW'X|-fK\|eS=ekOY>>_|%VlluϪORv$to~0}Y n)A'^Qt"{Rئ=nVN«OqbS,+9ޫ޺ w.i\Xp4XRZucՂXjAׂjAl kAl Z Z]-kA-L6 ᘐz^ƷY[ϯlm:8ҎTx+yRx`,uإ͐zhϐүLTm>)nϪ˪%}]'?f:hy4wH-qYJ >*;t+\6t;tݭCwCw]:t5to:tu/yP,(習0+8eoh=oРɍ*`yVsۥKyzl$l)y0 !ťiYMl~lܱeR>7nؓIug4' ↟~5d_gއcXW$FCߗѰb4 edRh8Fb4c4  -nhZ `NȈ"gCC qK Ϩn0͂ՂFގwNK|+{x«י].Z+  / T/Y4omÂө> o2g?SzWŒ=⭛! co $CS6C7V[$|<9?[$ ؾqelעM-[$mko~S>/]!?=Ђo3S<aYI~&`}>qt_K>Cp5[ 7VG)cs޺Z]'sq/ep[c󝆦NCKNC]|Pihih44!i#vD}U/l5{:7L)d/*ۛabijJM&m$ͳ>jslHm%o6O|Ǫ6_]5Vuǀ.[ ŀ1{hʏ]#Vh'XoWG>)}D~o=K=kW~~-sOG/ _-UU-^~y_ՂX兯D. ?C7WɨdPlDۂX1G7J ΈԺM6/To}yٛooo_gwr ""8[ qN6ː 9Hy6 eO^1kf_8ydO cd e7.zĊnۍd|cZٝtc -0nɭ;u*[{ mw" ?KAۿ 4LvL W|UzX̕`Z!]װRe;?d>G~(}{Koٷ@SϾw|wn`iY|M:qo|ad+АO 3oY u8q('&| NdMԢ'nq,'X`_`#s?7Awo'|EqWZZQ/'s]F穥r7Ppsu48p "F<"a{FzkgXwxw:nn;޺y:_K:m v٥.i`~W/m ~{7/': ++'EJECW^}ByI5]|Q^/QȈמ|Sj>~Oa)Fu"%Mch)ZS >7VߞԵ'MIIM{RמߞԵ'5IIzl[ۓy~.@O-Z"yS/th'aԪO1ϔ!^ӢKzכfT:NBjC<hYv5G~35KvY-G~["*<53 9t䙝d0޺`s"-bߚ9`ih44NC띆NCKNCKztZ: iGP1Y"b'rh߬HeMT:XrA[3uO D _/K DK  žA~ s|\0GWst]IѾYіmţR5o1|IzR?=̠Q|c[fXR$5ęWeI),.ղ~|L Foh7V^M^U7^MW^C7~%6ǟg2O ߽u۵đJƷ%[ʃ_ 42ö{N7PWc*ρ.-Jb#SBBiT 14pie9MfK-kf%'>eDN$́&cm1Zå0LŴͰo SLѭtQj;cR6 ~ՐZc7 4qClg]36Vo,ؓmR>֢|*ݗFomK T߷}yY}]~}CҾ??}}H߇gԧ/CdĹT܅f 9l%uM@W<2z7'.[tFxH8)g΂ͳaؼ0!F<~F|lm'"= 5ؓ!=iٴZIO>ѓ{Jғ!= +{(ғFIx^ A\ ICgj*H*¯ 3#6+$,+0%;+[+/tɼ9r ~VG\nYzo x2x m!yYoG;qUs -ܦPSz)]_Sz) #4)Ԕ)ԔjJ_Szw7Cq{qqtw7Uq{qtqy  69gjYyyvggjyyvgvXCػZ[!8Zn+D'~N5n !P]5XCc54֏5ao1:|p_sᢵRYO kO?_Ss &ok5 }~X >zߒu~hOM䃻X_+DkH՝yjs4: WTtn!EeZNrG+/H,705nM B[n??Cym[n2ts~.{ۏ3tn#g;ErS_Uo8!G"y eTQ.)2=SLUK03`^'Xk0}5<5ٶlEMlEM&[M6w&5ٰ1q.K"{DJ2ߊC+&| c[ou BU$BÛvzB?'w~\YDd3僁|7%L l|U^ & ?| q7-; xd?N.Bxtͣw ?> #<(|KaC|n')6_>|$+W#cjȂɼ ,/ sl?^R\&;%`F ہxJG-]I'ڌO{"{+/DQ zt i0ۍdFE.{R R'dkRȫ]N'rҘ +xrdƤ.(G2ҥ[^-**Y."=?3@~I5đJ"6ou \@3,lT`ʰ{VoɵaDk E jo]PU~Gna($Dkmt~곫AVFQ]ͩMZeWS볫anl| ^^SeWϮhwU_%.DT| \]/.kv~q '0'X/f9 xW7H%X;@/Z<|+N\0Z|Xt8[5W Z/>Ү&~fQ8(Ae >*Ͼ'xGԱ٬I'~|Qg3r;lm܃ FƼi`m!J#1=a| KP >*QLndopb~Ԍp ڎaмCFUmOX,y@)f+>̻[xq.9YO^K`XkȗdRE]F]H/s"[uY7mɩ{1jm{훹N5*7K|!FMQf5>z*s`fY7^F ہxadO ϓkGxmUܷ.yII!lѪR]N%&0iۢ3>[F.9*Uܢ :ZS=,G0[ɚC>Jl]TA̷C*{`-dLʼn9*3 "HsH:GꭝHy'T',H8j@#ufz|~'s6xk\z?>zbyG+^ $>Lă)6$7LėB//~ #? ~tZG+B/3[cR~tZn?ouÄeZ\uy>ڐÄfRCm]BuP⨡3SHU'ϼ;%J} nF;|Ƽ~?>#S W9 gl@W9i4|c@STRyVJS\i\xR,fjtlF `ag33u3u:wY:\yN?[xvϱ[E|\5i$yBlsdo{$˟=dZ./uAe/߂רFڳ.hb-J:p乺+\y ;ׂ̙רs&sI=zN\Nv]=DR56uYa ^o'I,|e|mE^ #dDQrl뱭&bc7n_M/J8yZZ~0!cKk5Ⲽt>C3X*Z+CѐO𯙖a̴/3-2zqYfڞ9$3L[̴9LLyv<&W8E-J Am;3BGwy$ FVj[pC7R5>K/d`@iFe'e5~W.C6(Qہxc٪K+O<'u; ~vb%Q ؓlÛ,Ǒ"ĕmE]FdzLߥ^n_^_)3W-al\E^}n=HrV&UH57F]3#xG4V!UǕ_ ,qMRE.]МҠ¾j[݂ qE ;>JSgJ(t;0HNp>|0$ WoVoX/}OYoZ`WUk󄉂,ns~E^-]Kt?KzRt.ҥ/]K]RA _6!3x9iu #1@Ԍ;0w \孝AXSSS̟O1OѯO1>ź>ż>_Y;9z'=c;O(e{3xIArx1M9e|mD DHTQeHtΏ= #|GhTCO ~GY~? ?-Rܻ ='ku;yjiVgcC˽[ >u8qCqdD >Y9^`aO vj)OI;OSSj)yoAF|.s H!Q0H0 |$cNX!jKjelbYcF%ZÅֲuXH ߓAךN*Jwo%:SyX܈6⼍ïZO]򑨺F"znٻCjmtj!3[x: B%0X2Fv>Ɗk[?O"i V^Mw^E7^M^]7~TK~WST]RSϿ(?WF ہxm՞4ς&k.TA+J+>r]SxI+<r.WNUܢ~Ȗ!Cd:D tl"wWnT<|R 973þm(Wa{ר$Y7m+[X=ll[!![tyW+ҕ+ufԙ >ҕ+ҕzJ=~W~Ujh/ *¯ _ Z_jh/hX(*:Z8O-z2xAA>Ϸ%ܯR6V`?#Rz:6em:44t*7&5jAF Vߙ/yPaP@T,tk+@k=G"]A1H>\*oWָ 0.s&򯃄t>.A[h!D`f|U'%vW2Y޲%%X{= ]y~0>xnӥð|aF{&:dIJ#e]Mu84ǁ]YcGIF2wz{2@- BjӃ^ 4`so8<_VZ;*HZC5[Hͺ1:!* (%@ om6 o@C>yqy-?'>ۿA?>לMRϲW$Fbl(Smfҁרu/pXtkѽ`2>,jTf0w0%Q=s/ں2=i`]*?3\7V?%d nYw%8Yx`1q ]6%!K_KKT?OC#u(0E +_:,svg]0a >:|$W;vv(IۡJS;OJ_\T>6G;7*{bR~=ZR[ĩhVHU[:ammˣ t;l M)@ۖ&pVjgLCog =Br;WF]JTIK_A,=O!_j&Z+.+>rm7H,="{K-lfQ۹|oBjZ?B[UI,$DcWK>[yh'lCj _ g5W|UwJהڮ)A)^Sj}jS#8eJtJ:R:OUiԷ 6A&oTmMP&hU~7y&8Vt5@#LҍTe|kz7x)-K#BGr D8_ogr]G߸Å__.Ɏ5"b#>d Qނ .oxPnXM}̨쩺gj`leSNpKƭ|p[ nɍbԥ5z +}_ly ˽K|%~gYZdY\0 E.M]dkߨ*MQâf"b|%*Xel}yf9dEH{~tqߐ9sțu(ՅFuݾWmY-޽;Ŷ;x/_vvvߵ]E+5xCٮԪ.{.]]{Ez-Z,ʲҋbeQ=E~-{t峪ܥ6VWf#REqLvͼK;szc" k֕Ayͨ!P$V%δY$br-n$4ɐ5 {IJ?0O$LUY4 OM;BCy^^?iWrbqnUaqs nɣ XjwL%;\Qr R~ҹ5 B[)MߕTmv+``ZYBp`Q" 5bU-vȷroǵ]v|o ^ߎ{,C屢xﮋ{Ż={=tߋjCS̿hy5jCS̿hy5MSu^[9I7R]XnX/}.e҇7A]t_-kQHZ`4 cXnFORHmnDdig5>dQdTbbX:*;*b=$KGM\6mM2JTr4^m-۾}gtlKr⊽v]ے քaa@;IJYG lVH-a', ?]cI(Hk4$4BRA|+ q;l%*iy nvZi=&#F?+RA8 H6y&hMcY{s>3ҾeK5a-~o,2or>z׾DK 륝oV vk&Ub06!5=2FsszHMй9w6s2w>No[93sR yMO!YeDO,/"|J0p E5znZɬnGIuyڷm呺Zϕ饃,%rHOyvvghoyvvghyZxCKT=+I8eHxjLm)q ~^:h}c)CǜqżJU1bcfJٯD'B0Z}h' 1R̜Kd'p*/Uxj<_g"+'yY翳 Kс_q)݆jF.=wqe_Dʨ(;>r^/]>ׯW|Ilq@,L򑨞 L-Ue y2.u bgn2*δ; ߬#}D83HЁ, >_Bd8) &>@//d$\ y&j7;"DkC Hɲ!&5E Rw}cgk2,o9u|Q|$ EҬ' t+ @3,rg <㏝gyvv3~e7ԧ|vC}nv h|7n(g7g}7SvC}>!O5PPk7 V?R녿P녿Rw𗘽 > 0 #6t-Z)eq[om(b+wGL>*[[j7V[[kjjkGƬG8l/+@Wq} 쥃V!JAeڊKF.FuYn2R\}yd7x/ܗ.dU휀yjg0#݊'n玷CK|U窢(^U\U*FQQ䪢%幪hU*JR*IK+Vz犺%EGyWԀ+V劺.<վ-p%j'}&}z${z_O{:O,smb1rH\ڣv oELa[Bs4nKHuٕ;.;ݞMvv=;dg[Hwv]vvή]L݄˪aEJTr4^z^_-|[?A"^N\,]ؓڏ=iOjoOjIǞԴ'kگ]v~+*.5xw]w7v~+.5x/ܗ.QUOd8jDg \fI>E5;_2IKIj |=]]&NmD+ ^/2jfWuD貎b5jaxc5]MᡔTQbMi# v D+| ]vHզ3Ck=9fQBrV5y|3̟C}d>m5|ٮ eqhέm!LL{8o_& J-+n7VJX" c0x+ta4% T 1Ԏ0-j`C^ 畐j:ԯz]x5+y&٭켮UkE'z]\ kTGgzAfngI׻t]/$]M_}cŰ|D㔍2z5jmפm ^GԼ(Dٮ RRtdbϓdN6U\0^lE\eM(ץEP7 K5tf{oyP=<%רK3.Ͷr]zs%Gsh./ڥv9 y2i<6Cn1p/VZO Uhj <ρge˰Ԭf{)ЀO^ߦhWS)WSԫ))jjv5EmS{t9/S\\=ٸV+t>U̳.Y; J|f_>_A}\fhVK蒣2j|!r~3ILYO^?ƴgHO$,YF VkP{᭖Ȯv,ژOݘ~m|]ymo6NJnUŬEg )iREVݶXYjn= nݥ#5վאl.Z|n5F4\K ~7VL tF=6}O b6u>\z,1ݩ!HMMSHȁ"mD@ZAeJ5;_iV 4S70[kO?*j*lw[4ZRAt/_ޝ}TG]KmWVWD1_?BtЦ뿧 + ) + ?+f,~ŇlD&N$@H ~6qfTz'Rylqoq׌0vGO!V\0JsETӡc`6zb`C%v>n0xTy)ЀO |Y 8lK$g@ֺklJY xS t+υ(ck*Z"*/J% 0`<1>dvr"[t9̫fݤl*s LՃȃouW*^:,º^ @<O)~ޝ,a#&콛G!Yt BtXycP_~W~U?~W]gśJ6ww0ݜ^jICR,ܙAw+t>-4̃/[F܏?Y:x)Sҍ?dߊoO|~s>|!5?YۍU%]r /p ˁya9T(kT  {w>*#ٕИg)npJimXjH⁡q aL" d[H8m X‡i@&쌳<^ypx?o弣)|R%JM+뺱;t.:t;t uw.C󘸯Xv¶ױDi`kTȒm/wku[t 4n[=BIS -|xO2nKCKzO Le' 0k" vrC i.K|UNZ[[kjwZOM1Dno$0,|Ҡ&kߥ曬oz׾.[t"0uغwغL]줋E`-ϫLo+َ| b|X /ȓ <YduDgm"\ P.ںjm"Y6@>gV<]:OOE:Oyr}:OyvytYy?oiq%K|w!r])VӴt<bpUyȼ?~C+>HO~Zߴ[Skh?yu^eFFpoo͋i:|%EƍU"奃w~kXo't=7'R#XIHVSiנ?vi-t>+{ *xj0bHagHaZtօ&*3*cyç[:/Q9͙r* 0~[dZv7Lg( 8K> K<.}ŵJJk흏$϶'T,`1O^?(]aV"*,/J5$鋹hFRJ"Y!~4_Ə"yz@K/_,kp.eĈF~zz&f뙄뱭-)Ht?C=4+6O|'L) >{PHmJ^d%Ѡ0( Eq\ARrR]jPA jP^ 5(?jPTyȭ҅s'6v%՝Hֲ.o^zАO pŪc w _H԰- PRE[b,SyPk{E?!Y #=#!,XΧXڟN*ƕ8ɣoÃ1)P; fݞYj]hpGtDR6 nԣ `g%1|6r6v N+gaB¬w\@iFx#YҲ.ah.fi-+Hn&Fik>b ^%#*,WM5 Rz@[g %xB(W{903Z9 @Y>\RS<4C5<5ՠ. `G:n\A| W48~2MKuQ$!Y8\Lß~H @\*o<$z%I^}pJ`NJćf[tRkx%.ޣ+q9b𛓹g6QļXg;7~pg!u Bo O^׉N@F{%yXgm?p4?X@ӏ?aϟj?Yx,.j]$>KY#Ѯ{񌔅=ԢC7'/jƉ+:}BbclF VA ۵Z>A"^N'6] #w-;>|,8d l+/|$޵x.kP$v>zÿz^ 'I#=iKOIzRMOOI{Җ4ۓ'Փvf|X0#(0qČ;I|'-[|P'v>*yv<''G2gX*T Yn|+OPvQܰv%-OUvW3OC<9Ciz|<Γa?vw:ϹTxw?$>K? M ӡBjsM~KY+0#0$y>A ˁx/ݲ2ފ ʮ`rglm{t]ʎE@E@yH@E~/)o~~}I/ ڌ@8jT̕\#*t;OCMP{PiPi4ih4tjЩ41ظ}cfIJ/S=w5x=V[]a&f+OMpҙdtE#! k}t y\Mv!z]'KϏucq8~w8L5b0YI:) +y+Ht!P#T?7CI~=O9ɏs|r9W IwI~I~9uDM D+J5* 6܇-s`%x9q%"uŤ,d')螺0*sL#Q)0Uq.ktN^(``=fW-oLF-́|{3nSO?m4 ˽[ԺGn@r4^R8{K Ft%x9p-R=cskS"!zHkJ=TL8YgrMK|{UCCMa" HHWr!#ʖJ)8Ì=o 'C?dJpqOGi=A#ܟ4Kכ[Bj Ez$S\>lX. ]򮁶Fs>S5`(RA8@3̒2TK<O> LBw8(F̄X{cXr1ru0Er>* 3_LPH.I P| T3f!,$SO:}0\4`} !~RIAY,F$!zRgPoW|`D0WR3#B0|E#L  {`n~ɇmeXěO S<"$ T=40!XdxYڱ"$8bTK$l{,D||$Z3&,rH-?LΧXN#z.>8rN[i-@fR>f|k iNy)Og}?$~26PLҧt_ⓠ-VΧX>ʖ ? |4/ ?)O Xz#V?^;_/O^ɀ%w[)Ss>9/l7#r_:9bOZw9jR'[! aԬ[~8O} (XVf> .絿S BRQ̥VjϠ'):Iwm'wmwm߾ks>ڵ%9_]&_}|j}~ K [ 7l7,7gP(Uݮ뱬 $>KY0_NPBjgDt])րa=/_ <d` oHM%Y~k]jlKtg U!FH:d"ִ9t*^:X/xfQ\W"!Yy&Uw '%beSw~oo7ZKk~~j?~~j&R5i~ߵf^❱,@':{GjSZhX~y?/?/ _~s{_ӷeγlНDC?9| ~>T/4)kz~@Sh 5-*$QKuafթg!5E)gyrO3EZf 1EJ ps|7 ) 7-V5EK2Gޝh XZOd|$Vğ.1s{閠 U)gS7,=Ig2`G|wW 'W7^ |Y,H]v>zxn?TZ_D+J53] v D +%lqY?S(3CC2fW%XSh2$R>me#lt ;bH-pycMU D%aX\T؅ BQŇj{tA(JBWmGlϚKYΧX_>O>C2[}jߖ\s>O~R>>];tݮCCm:t;tݢCCm:tEtF7ѝ.Ln_bjؤ v>{]6|I{jZz|ـ >8,j$~RG?-{VRA8bĤ:tݪC:tݡCC3\o~`wM$~.räQ,GSQeS> ~>>|9.?#]w>1dž|P݂gS= z^5j\ 'RS `EkAB4IKʴn9BUC5[bSHBsYf~MOf~˥5`GE<;}c̿Cu1 u##aata&{.^:Xo%'-_}& 퍱;"NrmPkP,uz.}^lK>z3g>[/}^K_~z?_?_ ,~jӉRR$“UvGdSD 74/,ʴnYx[҅w ԅw»߅w;uے.[ ?CGo/Q~ɇm\0$Gbj|a R%J' q-!_?ҏ߁_Sv*gȨL<:(OE:Mg9hYj $"QRe*mHNYjptJi@r*q&&o%:C^x*jvHH ayptRW@ eu) >T-ЦqNcՅa]Ma QH饓&5X>L>d !ww>7٦ECۊsz[H ˁxzh?_Nzno+ʉɽleI:i9ݤmO' G RO_>;;dgIU2?2>K'o1S_ p1g:d>cROaRo:_9)jFV~.JĬ3|vwp>vR˷l|+!֖e m5uںlwںlM]lmںle W1?1dd-T|2&UW{2ŶԢO'|u?+{l@|i|DN NjPOΧXoj&^%j~RHK7~.RX߾?ޡ~Łj1u9W 8ZjQ>BY/޻=o3KߟBoݤ}H߯Y~_}r8a@B[H ^t>ٚТۥpJ|UקӒ"(t_}?FF-L̾?gRߤ*}֯É.WsK*5xiHue t w+%<ϳSCn\XU>|W#uzi9^"Lϥg ''ϸB>evVS7k¿^O#q]#W{ڿu>zIlwOs:]j_lȹ-t>o ٲAn`tU]*?qc,Y~!S>){Ryɕ[Η,P$>K2׍_>7|l6~|L#qi<eX?"8 >!N|%8|,Y2PCj@}YzץCI*1n~^CǽaIHVǭt>K'.b29@aD|1k y5_r F E %p#3[+h1o$! l4Si~~:gMJ݃0Qk-10riH91>Tl2Z?o+%j9kHux҅Dc6y(^le0|_6C7#i1.ȗ{ͤZlz8h?DW3 `$q3h]אW$k ݨ N^:/ɏ`z6)>sGO:ߒ>mvkk {v 5_O^/GU_񏮗/GS_r4/GC_Ր B6GˡvcaK겯9=bX\*?ؤ:bO/_*Ÿ :_ _~7ֻ3̦ h HU|MfR LJ>—DP^IoqhjSK_n˒}AD bu>*7!|h#_h:/GᇶtRES<u>z7=|$RgiR~3gwCjT#cQu>[vLfiCnMCGҎ|$+yYC/;4Sz# 5K q^F@_ 94T XiΧX=,y:EI{׷-2Q:Rוn+%a(-:B_Cw ƞ-ڹY$b#qjG<b5I! >M5?R>,~2Kq8yUb)--ŖToA8ߧJ]*R›f)BÇy,:4g&.V 4SĚ).bsy˭KpXeR~BjcX2X*O/RBx_Dbς /7\n#v]@ -B; ףyi.,J4꾴tRB?/-My9 L3G =>r>9n Ki:RA(|!- AV# ` ca9! 95Fv 7S*CF1"7Cr>E22F v! yh!ϷkXSk?XڟZ4B5P{,Mt}C_ME oN斴hBǁOW\t6b@Oć|$€ܕk%8ze2U |X~ڴ78.aG/#1 O~"O |XŹ<՟VpΛß^zB3.O`LÇy6Ov LVJ4O[HUyyf=wtu~v3Y.=|ؖn K\Rl;+򿦀@03[)Ѹ Y;|Fzxɫ}Bř }# MJeV4EvpȾt9nKt_O%I 8]{^Eܷ*㇭. Mg%czi9!˞Iu%p?ٽS7*;b_!cl&!gG"i:?1Y/K wSty?ϗV>Ϧ4^:V}eUgl{uI[W|<.莺אG;2r‹}lP.p.q;*. ^ԥ 1x/r;lP.|7F^/]CATZG֙b\zXi*ӎ5[kؒZj=ޏMqw+nuʫt+Pڭ4j$V#[6!ԅF!pBf!sGr] q]hE'ECNa!#"uATrVM>>2 J϶|$56 9_I,%nFH#%ibfR5u5J5J΃JM?=d8ZSL3{uyHHH"""kkk!R!!3DNoHW| .M+E9XM>erAJ3u Wk5m(Wk(+]QZ^Q(i Hۋeő`9ר/L09%F翛G^/]>asfٴX]@K+3% RE fp#_2KZHJ3?w*tݪnUt.ҥ~R.]Kҥ^KKt.<V _O_LXU'NXU'V}'V ~OX_ 5Q7%T(zZ%YujtvUp{\n8 5B꿲GPxġT>]X^?WJ~($%B|C!3d?~ }K]_Kڥ}K]_Kڥ]|1,"ԓw' lmU"bU/tkLۉ7S8R[?ΧX/Ti6gF -J5*] ߎC6(Wdz9q-/]ƥ˺t_Kq2t.e|.]ƥuF)Xry-wUryu/=~#N21.a3]*р@C>zL2] `¼E^Z"]HU iRCjUa<{8bk*[VuV dY2nEbo%IΗbF[y[#m[޼`N٠D+'.^EHƭ.\պ.T+Q_23S{~tרU;e2.Akloѽ2]vc+ 6P<$LQԅr]VvxV_蝞m2]!뒽pGh|ju˾e˾e]%_v2ӫL֥uIu%?Ϻ̤{]R͉+Zon\||%.]X5J,e c݌8?SW+Νp "neE.2]$6ua#[<]l5)z"!zXi=t!'|p8Ʊ鎞 $' gsmN uK|$jM2/$CQ_ |T_/GGYoǕS#Ȃ=<3!0zj/$əPq>S7"|>9KoVJ4 +*V"Y!>K `]ja`DFR{3?,Siyyv]:O{;OS{Pyv}wnYXT(WFAiFh/~P osCdo2of泸ƃ[toSLmM1ߦSbM1)6|bkSLm녿)_~+an62']>ݹ:x"daۥJ3'K /vHu0_wtKa:7QB'#w_g쨳;[nnp#0Sg HKYZNŇ-S\1}s;b:O]6I(|dSr5Xю=c<ְ|/35dˁ-@h-@X2fz*9bof ,NDo/|h&Ul 8t;Q 4 ޵hL,u3t/޽hK2fw/Zb34Ţw/zrKVU~%+o * LM:sEX8}DV#-g2.V 4S0/>NL# Vf4&S$pMw!7!ϖ#|[Ht&7| >)BU'^]M tr>*WW_f'&㟹dL?ޛ Ќ!y?QJ4 RH5| (gZcQaNʯd~kxK3[mwrdwGRp օ ^Rӟ/].K!wAeOc:\V1]\HnlI^y5ۥ,%<)V?,p̷ޖ ae \0Čl-m9R[dC6K_O ¨C0Z3e5yi/Iuc/Z8Ph,;b?.?YBH]V^0D]fz) w+)VZCk_~kkWZMd)_QuOvGb>c0KK=?K!YJ4ò}"Y)lih*?o}`4/5t(&UkV6 bpOtչĔK]7ZQCjo;gXd ?G $cEU: Rا4Eyȣ﯈-8ҍUS:y𷷆F^^->O@2oy #1ZF@f!x?QJ4Ӑ?vc;;ܦ17>,sQk1Z$V'1w7qU3^g)t!U, eCk_^GM3NXZ,ΧXoe7vpYeee\p>G~;ϖÀlvgkoyvtlN86sيl;/eٺl;Kmg_΂w:|"T/WQYU$ĕ ,$>Kf[T 翸Y nlp _鐏D f1F+%)Vnnok覿y梛/ɇiΈ =I|+t02Upޓg)4p.!#R'EZox`rFWxg1t"ϗ:@G2b{8i{d"bE-D=i'Zo'ډvvhj'ZO'I;N;ٔUw{& {={<[co]jG_?~MϹxnGP].Nol߶>gz~no~2޳ks{M_Z|hLK~إX}6G,lLBj&VΧX~c_cΙp@re3ŇezaOJ8O |O _:\'sq Nu>*6^-pGS:͈W /8N?R_/.VJxӌjHυv ~At9|1.|V&nUt킿-Zv?{RWŸ + *S <];O]A(_׀3jG՛Vf\4Ʒ4JO+uĴ!U!d( ~7@Ӥjޛ~w+'{|U##|?( }j_}}j}~˲u62J"VzvT꼯E|&^O 'R\-RM// NWiR>6frVJ45 ϡO{>mvk"(xWPsfE(Q x/ܗ.82Gqqto[qqeVNiwWH4b|"D+%jwW-:~\S~ooW~jᨛE~oYj?m]V#C&K!hۺ7_49pJ|U/|F1J+2s/O$ U@ZQ6yܜO _x{Hhv㳜DQ5mC{^HM^M#p %>!$G^z|G~Yfϴ}$VlrTǛd|kcLWehM*Wy$V^2U3'WJF .q'\4a~H8饕&5T{| N™f15>gRTP.tyBH$n6 xT{gؼl`ł߯Yۇ4R϶G_ۇcӛ>l kGT9L\YY"_nu;,zH8dfiTd3l:bQgl&K5,(Sa('y fWVʖ,oO~׃}0\9}RrMrUx#0ՋJ4+%ap.IZdU\f*4'~e/;wwA5yF-p%IBTғV|$T#W留НO M c7= pKOVTkl|3kSq|?@<3c,$y&U;s[~׳̜VJ42=:|Gv2lAw/6wl8Ri M!!=B<3>l$Yo#|1CjQs\;bW>qZ1ᖙ9GܧBSHdugL+yvݥpJ|5q \p'1T3 }cƇf;щX!M.x4Osz/ _JC,[-=[#Xg'+3+M8w}+|еxgt>iNRMgG>zß|ض^0n?! ~s-$~p>sj+h_'{).yujRyMڟOhiݺ:8n31Ԙ7/(vpsMA,%F)[ Ƿ (Q+ QJoFc-q`r+ Fs4'X/AKe7Խ^C02#1X.VJ4n^̝p(*^ #]RBj խh]')%~ _kzn__}q>)O)Ԟ[*EOQe3*|fTW|lpLmo^h^V*ִSX)|+~:O ^2 yegv(`DIi u8>uAJqڍÙ5~]J⢶]9IBRC#1x^=[jzbo]mI |RА줚)jI/yר-hk$SԐ Jr^$v]}DoӒ+YQs6oG"‚C՞Tv?r4{RHU'̠_v<.r`+ȩݎL傸;Ӝ1r\˸4ظF=OLE v֌r`ޯLj0!\|.!Pkp\}QBןT`yuR4v?du%=B >'>2dÙ ˡyjl{':H7\_04dq`m_Z'x;%qI[ˮtDTtwR!b3(: Z[D2 r~D: 8 (2 f1׀ [Ġok XpY*\ yn2rMF&!ݸ41*{l2fM_02 ]Զl+$D+=BGbDpm8_s0_Zb:bqɇa<,CH8#Ž";P wJ á?ݦOS=l8p[{vل-^ne#wٻ.gg]l_,/REϼ4^gcj|zD+7\ITqٮ˹+P+ɕygQIvYĊh0pY.+1p/ >oRSHaEu`AI"㗆rƂٍEp5 E;EF'yLdBfz˓QmIզdOR>{|U%+O&sK6 Yԍh0-k^: 3ΧEo 7[{O(=9ѯ tӉ”D5khܨbT^׏_/GGKop,0`1B[W$F[a@ H1Z!ĥr7+ H)րy7[) CWws{pgϢ촎<*]c eep{"s $+WXzM-Ý&$Fѻnfqsh_ɳJc-ˊ'754W$G $? 5Ӿx ^!f7Zk5iog'A@8u-;_2~ײi][&ee32Z;eײ󽖙+k$8fX⮥L`yx_UiV^'쨼=b22ׯ6~._AɿWB_~_+W|H-O:wt]ot˲%0{P?9j1T*%A;]v$fG 7JUO54JXT r rܗ}A3r_*r_}=2Fvk̡~PW֊7ٿtbs=f\w#ֆ# rxS64fty646lh)mׅ4Q 谡9sʆ{2_:6 j]3tcjij8P24>?77#~(=w{hER{#d6[månxul4'a##֨{rW҆/bKIZK`ceݼ2FK7:e_>[Ω·^otzowi6MQwTqlӼmfm>e66lցm:elL6mئ)M)۴[UR{|{|===\\ְ.-f]L4=?Xm;`].օ0bmisbMu5t6Kk+ieejdt5ru5ryTWJW%bt{mv:jWNŸ[^F4"zyQpʾ]7ijSk|W%2[ۖ>eLW!քw&N*Nue)՛j5`&wtdۨE/M:rԕy2HetO~dHO$4> _:`8' +W5ROkhا.+|F'+|Fk$BS8l whɢ$AfLX񲼥l9jC5;7G@jv\.⟠f'ٙ}CW5;0M(mvKcE*iLƏYwgH:m!܃.~MR?y~EAm|^ 8 $Ktq[B+6[D(=%G RHhnqXl dsh!E{ t=ISȗԉ.`j6Ay9M:d>9 ށ' ?O~,T?O@ z)ziYdfȁ^7m@%Y szii+8A!0.wߵa]毦 wCWPDlwf7\ۃPRؠf%/gfwCz&~w^Hdp轗CN B"da4~|~zҚt"<OpFCf < p䨏L/@iNt#c~di&PlIX6΍z<£҆ '7åS!H3n)H: >z/uv =lǏlNFK_OfloCJa[ۼm /25ߒ_'3Guƻ5oŋHfo2Z\Nqp`O%/OfCckA?/"iMElʀͭYaI줻 y }tẌQ1$(+<߽l8f8۰F5[]W8'C=J n`i Y ѳQlX(K-eմlXZA3= yGf>`S̸}'ڨyi|qC:ze3k |%ϲ.h%K>j{o3_t3GuضܗܗVQ܏MMՀ}q<#;du!O׻4ђ'iKIۼ(]j_$_3`x; ^EOMnbz!i{hatd/{tQoq: KdܑLȌxt!S|x%1r}At/@Ye=`=Ms:m,5D)G]YhAzUcEQ>W7 !|F\3_+_J5Ϝ+3qNGTV*=IVY"y'JD#6rTv;y܏z[7:(m! U i@~.jSW(<³ FUx6 *<³Qx첌цelX.fP6]ѧφel3,ccelXh2Fk0d"[ܿ4yi,qDMhcQQx2n|=`(˪t&^B >Rt:5*_e8ĶݫgIhcdq^Od Pg tR3IbMZ)n;[NJN ;S)tȈf͙9*gi{_4^otTR>ULYբ)cbr5Y2p_35#{^;p4gw}=jYsF| vN^K捌:l>@>N'QVJK7t$u$`}j*09E'C-e89u5 N^Re (Fʧbs5_=w,VOw,o{E3z.b_:m<P+FFmVaNj/nI?7`xCxokR`W(⿫FU7?*QK/c\_T7—O/_ktNvU`Tt [}O:-_>;Mgߣ,Н|-͇n>5e:A$}:=FߝtrX~\\+ԕ%rg̕uV.Bri>ܸL?f7 O'/`9f`rDފWzh[lk8Y#ނW،!k=X9RIXʊ*tl #Fѫh&]q/lWx-c .TG5(!g@Oܟܟܟ}jN-a$t`F_VyhP:T)GuU^$`\}As>!ϕ'>W r}E`ՆaX#s]X:jw M]+G=M^[kEk^`6x>K<z6"8vީ16E6D D"t͉YY9MJ:m,)x@kxi w-2_ {g~}ϡ/-x%x-bXgZ//X=]Q{;\>_'Q|چZeی۴^>jZ4C`GoCѶ5x%;,۸9[#Sl2Q=>Q%zގwQ$s:1lѫh_Rm9טi`j.D/[衙@:|j`, ֓|6P",{o1*Et_{z GgyRdjUdҭܷ^GUKG _#&!'r*Tp }hV iƕj[!j̞ef٨S~9ڈwXez;,;}^ni`0^qko;!0 v̀LsN 8LI8' 0tCrwN ڰ=.u]ҫwQnX#&)|Ԁ{ָrԅE7Wn Ho5#pDnaUp:wmtڠ5ꃥGJ7"·-jNصOVjS;m+H_Ak3I;~eEz+.E.jӂ$UstZ$IĭH7$I:JRI $i/IvMjT;NjIcpZT=EUVzxR֌^E3]^<)7UCcZE 415䙩@ QК54Ɨww05{^NvkH_NF꨷Wz ߱^.!-7acEaKaydf5siX>:{J7FgG كl9S.bcsy4""yi)H쯇z^:+? BÂX0M  B+lw-%-P  >`ݲTViS4OFmm 'EyJVb$`׍nvvuÝtl)={p aʸliz]jv_5{Htlp=.݈eXSn{[vG5rhkLDWou+լObthRVŘQOGQq6]e_xn ^N:6?)^SV?˪%l=H֌|W] em[uǺaեgOwNL({قhŸNnYG^E3UY0e7AᴷC;hxOX-hQ;|j޺#m N\ u>9z>jWN 'm5޻j9[FNg}^'GSBx/|y&@ÌH{}c\gƨ@ g9i99 <2ravұ9OZ*-Qzgi/eV?F- G=.9jgtE,N?:o 8 mj{.>*6C(cgG}ǯ"+G]6\,L: Aq^3;"S6Vu:/&M3v&h4N5l&)&:d;h/MzsM9:EjELҢfv:,rZ+c(2—㊓5}I!eX EaW+G Ÿ?ŸŸVGWoHo^7VCl5^a#G jP5Ol1(%9hL5kFmO{+96U׌16DoS?G禯M1vƊo%-^|hx=k X,Q~O`~&cO~@lR>n ?|rw=hitX:x&Jr:mp |mL9ba~Q?n~NU?As9~6Sԏ~qAs=} hq/lG|/"mEX-ѫh&|FH+K>'գjVjp4Vc+'GQG,IIX+|m FovI:v·877~o&7BTnL['z D? 5堧_nexӡHOD4}>pIQ=Lr Fn wSF([Rac|W"5"IX}ו]jׂp-$5d2?״i7dǨ3z EkN9".z/GEQ#"y L} 0GE#ho ZTC)15:HOx#tz6; g]a ~xt.<Uߧpbnt1F˖ʗ`5kt+3eO<%)GE)7b.!3$[ǧte,LSO?§_§ ~O'O?AӺ |+zrJ"ƺ/K{:1vFC5:'+6YӻoRr;>p-jiwCT͈qolty"?#(?\P~凫0pAar&X; KrYL_otlL~ KĨ'zGy ޕ~72E F?Iǖޣ- ݆訷LӷSmSGPx ϩsPxᑎsPxΗh4a_5m/ݶ$_5~ sǯ?~?^w?~/!{4+;G>u)|fB ;XިGcg> 2b5]6StSٱh`Xa2XdF'cv1v,ⵤlw"x|} =[Jmk|mU'D5~m4.ݶ_P>9+QgEo/;9*oƿ7_M WfQ_}f _O>z ꮬe~3_8}ԀG"9i|8sTٿ0\3~dFwQ_.!z FSousޒF*t;6uo@5ji3mKB9:ˣֶFxt}^',b{mvD-.Mo?oIX_LG♷3e鴦 ht.Qj}i1,ix _>Qr1|@p5n ZEGE[o{1QWmsԀLa%C85^L8Aq\pSRq:]q&`}s^xqk$YxLiDҶlB^E"!:ҴsE\k—Vd_ \>*d4ъ쏆@U @}ɾٗ?@U? Vd_s}jUȾ4}i_/brR‡co # 'H > XϚuǚ kBz$ݶ Gz_..~F˩-=QKozU9Tx tm13<Ǩ@Oߩשq:uS:u;N=u\?ExOȶ<³bNC(jJ'tژ(WΣ$DD3FoUW3z#r}A3rU3}AU}FU3}BU }FzWF#+i] |_ /yG÷]V:r1^o[$G~>C?M%"&FuS A TTTTn*vSig{CKF r_*Rr_ܿ>PFZ43H0bѻ-y `v>Xj9i' [fQ'k3Dwޏoԯ/S8/|vU;ʻ+,Eϻp~׉pp":Ώ:N=Nljp~'©8ίD8῟?Ux;r_!W5DZ~wvN뱄޻t:mi Q#sts7G/Z)vaA ɩh L:mPmbybQGMhg ?IX,£]x"< Z*YG͚x訯,3AxY.gޥ]4+]˜w]4 ]ޜK'ػ {3.gi;>nQ7BoMkւ Iڦilۂ~=.T?)~SPb᧠)6~ OAߟD`'׉p"0Nq",\'Ɖ8{"hN4ώ{avmW0,v`bj+F#SoM:IX_/7r w>#7rWo>#wAoKo<أp5 <أpŰS+?FBW?B_"U3_}ף|<͇\5VSE@޻/5_hrQ·,`-_n(aԛ8jCiNⶕl'[l [Xs5,[[ʲ5>F,ek0,[FhbeۻLw]wYup2pewu+цE3i !ѻ-y{՛sԉ٣bM׆:ETe7~zY>W-oRjAqP{۽4sA[3@wy'B߉ǿR'R=%Fo5zxcp;6'qhqF_-NBsŹŹ⤅zZDs~[zbZqCώZ5KoGk$4j<~9-NbN+i^28ռ^Y9j[#=&Sv[$2cw[U>jtlbTm8|1'L:/g33gv w$0u}OSW{;L݅W;J>nW#^wە+|ܮ_,V\^}3wk8|n-Qy%tsԙ!S4 }^j3XR}A{ă2(B{}[4v\0hNED(HyV>yzhEߚGN8Ӡ[։Ec(X&>jYIxv/J: _wCWz_UGBR K ͲKVs!"+I XDZo䨰@O+LbV~]Abɜ·BGE b;g?e+GuT5٨yF<5As9y6jQ5FCy[s٨B_Ak9=Z&ڀ^i^a5nx'kri= L<9>jxQD14xB9*5awT=Aé{Q=8zRoy k+@6ւ3Oe$m ,oDW7 ?8%?I 8dœ{[b-87ӟ ݭ(ZVZ+J'FqCtݭ( cu4ybU#Н]Fm*MwզxlԦjӍڔPMFmD4Y=9T&?_ ku]i2fWщщ4b+]Ӌ'V tY0YzfE,{f!µ(zf!xxfKreE#z~Fvz)zn2_:mPKW6'GYwjZYfyNQ_T;ϕg>W3r\/}F7w7'Ko<11sK͍/17>&̍?sC? S|i{VA5 Iw!u5f5o+(ZZ۞,/9%`I~õFR06` I%$D(IT%@BI*I%P[ݨEUA5QE;jуjhU-zP mԢ[ʭҕ"M0ۭADlFJŪ=MԷsԞeG$G z$#AVMo8#[Z >F#ٓќAkmltlmh.sk>Z|xS/C?ӆEXCiQ%>^tš,!ç;K?_/8y- f#|A\g>#|B\ gTK/T —ouO<^%$fecWxmo_dvۯ%`fsT r OA rkTs Wù'J<0 wCN'Ϲj砻5|@)l 9jXer[`ts`:{);fEwIE9*ԸXKߞt_w ?*#,$O.+;>$*5ΏQg*?eTYզIuEVJW>^`ճ#,Z^uW >!w>!] W4Ϙy9h5@0yͣMgh1Ay@B7§ !|BT_* 7Sg l> <|Y"<@xKxT5q<1݁{(P>ľ!Iܟs$srjn4{*<茿lFUS?>!| OO>#|B z6¯zPoz¯zPO[k2z%t$Þ${[#S]X'ܤ_Bd 3 E{oNݍSq:uޟUqNTPx$T箊s`è8'*8[?_VKCV_'GgϨ8e"YOϨ8Qq7~/|RWG;| MŹ8?.};;cm 'tژ}Gq|wl-\^-eKpْl .[V㲵pZNVIܳi9o@AB9 .$>?*F4%9jC1.1';Frw~ Qp3N.~1.1qR+Koһ7j9#j9rj9~^h9!|^;6D؍g]TFj=z6/քO74kdJس}Q)&:{s:6YLUex&=\zt_Wqd%k{<ў:Bwі'f!rZkd=k{Fm9Ef.E.Ո#40;LFܩFA#Nc &GFfaYHwvAbLkbwvGg #;;~\bŨ+FшՈh4N5qQFGF5p 5l3555lk}aT05셏kةkؑa|\{ S~Ӹ/i\z:e^<^OcU?16^?=`u &\QK%%q u \ `^3Njh=}fˬ;5 tUCirBz%_&zζJ7oìҳdT;s=胈{Ǹڀ7^^fsxMugmMOYR$dE4NA`鹰M5lȬU_,v4NXn jqt<"*֎g>̯ۗua;-y8Gu[sf?AƬf;q:mQzg]>mvsԀi7[ݜN EZzActژ:GеH1٭vV?* Q:Bo_'_U O*|F oT* SO!|7'O9/,[rƻE/z9圍w^Yxh}9g1&r}B3r+O}>#O< 0[[4:yC!>8G홻FzN]+߿r#*zv\4Vt}"{O!V9M*Y}FGy:_~/_*| _JbQ>Ag8O.m+||Ǡ$'쾹툚"~eEK|Mdy4 I-ֈX{JŜikz)FFe j|$}4z\$i~[~[ 4z\$ihѫGh4,IHEqz|OztK mvGwYA/V{hN9AhPƀ,7v;Q2N'ǯkȌdnK:{+ ףU>5>}p?}M ހ}q"0ٟvVe@.vVd@{e=IZkx4o+DEjo!)v1cdm[l/ד!k*Dh"Du^͆BԫMBԿhMPD!GW 'L=d46tcw&@ 'Y>اx:Y ^!/ʠc}BMZ@z+c쿗d@wWtMem+V=6.} _0mx~%d.uQ(㬨2ᢼqQuQ޸(YQeEy<Y4 ¯4=ў՞hOôQ_hOO=='Eiݡ\kڗ8YX(5밣]0Ϩ=/|C/|KZ^-}];@9ȋJ#$`}ϖzO;z;*OE;~Ӟ*k=ot5^@VJ@<ѳݿiHzq=: n hUͳP0ǽjXPHA88O8Oqq3¯y| <1՘h4N5smQ(1GU'?o?o}B٧o7WŸoObh+ȡ# `kұNFb;;bTm O]rԀ_.8uG{=8u7NQƩK8u/ C7S(Z(q\t?~s< (tBˏUq2*NA9PMY#osV)8'+N FT/O*|B SLF.cEMxG3H8>)< GGs7oN8F'nf'7N8htHD 1N o'WdTl(<gWAMPqj *NFM6GUqK/?R|T8Y=7C?^htXQLQQᛠ)@ vYXڅ̤Q) .ݖ=ݖm-(Xl<.;~ OXG_ ;~ ƣ}e)͜^xryY.EfKr]! ~7zZfxb-xLZoO{.w쑡$^ cûI?JR~%$*IGI1ܯ$uI.$`9e%lrb\ɦnYcDr{н6e7z>rE>1瘕Nk FgP q"!=GC[zBr<>h~z}̘!kƒGU-; b; 2<1C=32{fE 5UFg.p{`2 |U4FX_y -ćK -?S/-VbI̾,ss|EXȳ| :kdbv{` ֕nimѠP$LK4FX+|8"'D!EP|vUǍQ1Q˾JV53h jv]~58rg9ʬlI$`wQrU]7Vפfِd{`YcE=~)Fw3GͶOxmI:ĻlB7yadp\e-xWNU-ߌhF}^~Vk9j!*h췒u{t9_5N{Fǯk~kVBJ~ ~_4}ӟˬ g}kAcu?NtDXٓBnOU4''G Xz`G)_5Y5ߣHt˺.@sh:QfIfe&ѫD}ɬcH3贡4 &}{6Hrb5dL'{a>]x4MG|bA;4Q^o8tXe9S[κr\NMlrY&r 3+Xrvk93 i͜g]%@3謑2 6.?MQ8 i=IoZЏtc)j.ݨOOҚd g'GEchyg?}^l{hhQVQ\VۖX)ʼ*|t'+?:lJ"` u[h)<` u[HR-[[b Fn}}_`40RAz<Y,7 sE[tIv+NKG^ht֠3{0]qk9.'a mY>h`^lO8*ߏi>b胜es`u9:́`^^E3ܩ_LLY <,(Dkb"_>* y^5u ?Zo~%Dxh| @!(D B!(D/h#b,0"2#b 0"(F`Dh랣>F!id 8&908&΁Y90p:90ܟ}BܟY??+ ?TOܧ'>Ur!r# Oܿ+"!lm˭6[`YcŇS9kJgBKOU4G[=b46kyj/9/"-Y|ufv~SM]M&ܪ&Bn;kWn6&7|M!ziu6k&NNI"kS=FyO: р hl`@T hBZQz t6Ǐǯ@_~oOf2 )P>x2B6@ct_Cf̈́3[&PǣdZᇪa=0e9Cq羕%IX+|_g*Ftķ䗄*Qok-GGt5=O7ݭ|ҼKxrYE.U} KQGyƸX5IZk k Nne858ۃ 9L?+~*SBɨ}FPq*΁z|Q@%~k"|\>_W 1>GB_>WϨSB?Po?8Ju- 8kaY׳.Ƴu (릦n'CX3L??[ I@}r$sڈ8ѫ 4!k8ԟ8_!k5k| 85k|0S02)Zl['s'ZP'G<ڈK)5z?_c=Ax;~F&Tƀ1;|kטט5FQ.ŻT_Kx(=`rSQ1sK<;k+]BY6F_ti8RjUG/YPWQ~́s`:691OtO QD7DwnF!>QFD~}_>p-W~dWU, <+U|+*3(|ݵD-Vna kk_Mc {$ƎIHC̶gk!27cn|/ssCsC AsG576 ͍z᠘b~ʲ {5#s-f]U#b-jGĔt Ϭ~̊3+Y™6Ί1WYAͿ ?A_1נ55_ckP} | } LLV4^=t,5:1n8FF?{8`Ƕ:.~ +p{?NsUy<Ĩs^dM^ _C cR>5կͬtQ~mva=FFѫJ|=)7x\)TuYBAg*`B՛=-GP5=)TN:]_^]uhHȭԝAh}3i̳{ΉQ)zɒwQ5[i^++Wt9sYk`YE8>QvLUy4|'rU/AͣO/> 2j l]`4d oΊn'sр@ҙ f~o4K: &#p2W \xBxWW?rώ^sԀ|p^f>UŭmOtQ{F'xmk|^OvƋO :PGaŎFk%dGEkbu^OU4:|M;%x0>.z ]'1_]#ؕ[+rLD!2KO\S Jnk7ϊ$ Hh II.Id7HI$KQ[Q?^[4_,rs=E@[X^%X"K^`"cE@,o3LҳfӢQKL|3`%X`3zoG tz:-ОҔ(|zo^Q :^[}ccEckkԭ׈-֋ޭ׶$zKVƒ*ߨ 6@}z\+}z' l³Px0 B*<Qx[xz/#|n^_֊WWNkd1ΚeFy >]v?O`?Ůb`~bߟBD'ԉ8'ԉ 8'ԉpp"N7Mm4 |Er~{p+?:P9S"36 L!EhoEjэZTPJբZtE{C-*E[V :U44h})$oS/?/Sߑ+miܞpD7|pq`9l#g  ܞm#;6ZW빣4zzh=w4Z v$*Phh"0qG z9"j#sz^/t(<@^`¹O@$M* }.<@Zzt೥:Gkm|KF57Ag_'xbTm|^'D/~}4so93~&o b}AG|o@sPx  TF*<GPx5!ٳ*GV/Հk`w+Wx#Z+#{~G{dr[p*95f9kB:~2kQt ^|7¯7+¯/v v`).zlv`IqRgq8 |NG#|K֪%Sz 'Dž{|O `Zn)MbC8浂ӫ֐)[--0,T$[t[ՓBku#X bvo 5+Zqn P0-@|[-@8^Ǖa44,wwAtA0 A0 : ֽ :`|< Gu|/8z^`*_WƚK E^k]G> ^/8z G4 Ub}mm%ZzdRYǖ F rN 4t1v[~_ƒ>dp>%hy'|ᱷ Ů-:ca<Ɠ7̤oVt>%J -%ÖKZ23ր/K8| DÓJI-ʧDւsW|WB8`= f%B|2$)9$|v%k[_~W|TӤ ];q28'_;ɰsq?'8;ÎKg ŷ'C VKUѨ;Q"[X͏h.uA{?ј a`o#!9a e6Ig 6+ q6feʧV)lVc͊جh=6+7̌fy"Can0{üq<6 vo%o] 3f7̌a{`V?-GA $Ӻs]d^u W~UwUw;p;;qn<=twnnšBxp8t;tI᷿~ !vo ~C_8'N'N'΍gʼngʼnsIĹq8qw|-o~:,N<,n<,}XqXl3ϺO[+N[KRiVֲxYiknED%^j] tMCp/>'ߗtq>qaᎳ;ΖvxXzxX\\S/EޛA|b8g|˘c9e1In!Vy⮰/Yo~T,g';T"5e[Ygٳ"mSüX\%4)'|/JLBgScXV]yurw.Vm]uۀUkՕh,V]iՕok<:!q4좼iP7 ~|nM)q:|ղ1To4A }8T-hP EMpA5},ӑѠ%-[fyjR0|ß)e$Rt>%(cr>ʏZ;Zkߚ7oUv|\P5Y||\߇l }2ٔt_k-kRlԝU{ I .|o\!@ @rT@VXLgk #~:jc}RovKf'?-HR59`[F7>,-èJ8F+3閘ǻZXZC TeudU=mh!@ UP"g\[ ||Rń2|ҠA3WV %~)h:lw[;,po63oC )_,}Cr`R:U- %+Ln*lqn>aj='-6U PQq@aS9/f-+2^q wA6r$ƞ4'ݓ{cO'1$žwOؓ{=Ir4϶4g="TWj6|J, T|tRV;ԇB< T\ a4ych(j)A S:&JxR[?kM7R;_IӁC +[Ѕ|wU2':bXľϻľ?ϻo|n%xy:ZDR"÷%KD;%x{И6TuƑX. &Q 4UV/: s%6Oglys>j%q7 ei2Nxx/JLkɺD<AZ$|4hiؠZUxknVaj SVaiyWOjZ[Ssug >T`%<ߚ8eNP8R$b. _k-R)5}i? OO~S9S:f04vtxkEx"#9TC\LvdW<SX8f>#"i:B݉Ʒfrb%k62idBWҧn,ǯZ*_kqN'򱭞x^Bj͕~{iC8F X{,0c0p,0~¸5LGJ ` ԀPqk0Q4j ^R-< #V*6R>1C VbL&Daߙ1N@PQa6xM(#d xބ;ij$Liz4ǰZL*( 馩m~QCxt?[}G;_k?Χ;ڦtc'5xGGצC~-m{[4p[p[mmmѺEE E{&0fD3Dg}Dg3Ѿf^p&8g& nY~Cm)1Gm7g 6Rstz[b M5Wt O v>!D×[f|k+x_TPT ObSx*Tx*T SA}OL] sf`x٠~_hE^ o kW'Oue>:î]븫oiuڟ]\L$E-UvXҦ4'Hud=t.U?Vi@P¯6IEfQ ?YTբk4rX OVKM#}+T/Έ].VO4uHuqvQ=.fa`5Hi~n-a JH^+ x='θ3 >0 :z'ɠ'iw]}HP8Rw偊۰zo,FN W;F%ׯx(`x2xѮ_O9{5p FCIrJrpS˚?PM-A 0XFL-}o#b11Ҁ8 = &bb〘8 ; ֽ./\7^ u uyy8`ĚcaX~LcaXi,{,PIca rʞfk5YHqX|s)1\>ԝbm%\굂| _a ȵ0$a\a zkk UZxbƩ#x8o7 "ނ7M% !<76<6dܷ!oC !<77 imH-؟}cwgՎ*Y߳*̺f~ϪfU7kVeU;ΪUha6XĞ76 *4"87hT^ w!\ЀuҺi]g]hi].г.PZZZY8 a]*ѶxGxp=~0O -8nQœ#^+hmZHwSpj)85?M)zj ~bcSĝ{Ku}YT>%v;WrH+ZA-{RX~n)1%-[r;}ߒ17%o-Z𲐀H$iCh )1ѐGF~˥ N{42 ?]^ zw7cȘȘp5Bx3u5Bx3&\\uwc_wvuw`_wvv3|[???Q>_XYr} mi}.Mj\}KdޒEIW8fG?o `K浪RUiשd ~6ӭF/]KMH&Y/cd&^Cjjje6YaC=뵡LC&5mÆWPl{no8tNn `;5tgSaCw@;dIwGʧDKæ#O .Έ4iO~ "iwm|;ϗ5ܚ5ژ`Ϸ~r^`v_Og] oM4k5ӧ:!5~Sj YfR>0OC?a0Co{$;ΝtϝN¹p8w=w; Nzxxk♋ xxK )u'\-˽xDb>%?2G$AC_j!Vw;}K/u-[z%3 v<1Pcپ4AYF^@P;1PwaLua·A}O&Qpg޹qq8kx'Lt_o^o =09P=h cQ66kd=%n`%/2Fh]6ݞ7r8d MTtK5JZEScvu]]nWWnW%n)St M] 8ٞ]Q^}9Oniߎo [4s!W_bI(¢1vAVc\CY-^o.):~MCq"j!: 4:LC&f< LCaNC=cJx4{igS=8tf]&Ø51ۙ7r[khnKR:& Q27]kuX&m-,SY{V{9M rr9XIg䛞o&5_TGۨ %~ڦlTTYt}ÏbX)>*B×0(ʋ:IvQ׷eBhABml}hc%@Un㥐:gd4WٜFH#{<#{idgd4G㇑-o2UYCBq,lڦ`O]^V=6MU4‡X="޴lŢcO.S5r>%[qzg?Bj{cY!h KOxsmccj:Jɣbj/|xGMꂅ@CI-D֔\Ȏ}HW`x|Jp$Ho/2; CqqLhz$E梦 mdRkoT! \&)<A {,ԃVAA {4 =h==HR{Xma@SN0cE }رO 5 V:/QzȒ&oGCC SLlwL&،Mj M0 &8S<уXXv`ֻV{,*^jMcAMRՐIM)!_M0~M0R 6m l6Ws٢l1yʞ`2[/-Eb`-$K X" 87}⍃x ^67 qmG(Ҕ_W\;oP"ZY <п.XסYb\#_H~+8㗿1*Q/x}_N#8Iǁq ']%90tyWr`Ɂq9tYӟHGtYӟJg>ㇳϐp3䉥^#4hp٣U5Cs-v}*W>k{v3@v҅aYK=URQYV]N_%XI3eCdW\w<7~څnCư-|hɪyeo=]&a@emI.{\AM?JvYivY].z0fQˊ.1Ku٦Ľf[*,) &Ku~vsTjQn5BnV/רZ’|@yI^lr6Yx weCHc^#j6`$] N#gڀ6`('y DON=RSSwK2t[N$ NCWSL|c;V$w|K)WFzԌZ2Ug!7\l'v]Σ.r1Un^7uiQ-W,AٮKoF.Kx:ϧA]唶S zX큩|BTPb-ت>m.U@k!mn >>!|z @|>w7 X& ҥ%зԡgQM%դ:cRS+!NY)dT?_⯿ןOOy |߿?CߋLN|,3-#-YvZfZCvYt`wz.;Rͭ`K6-hڝ>un'Ԧl[ ZLU}O!Oҧ(U3*—ZA|5svJK|] \QnQ%M /y$,5XZ·tUl{_CNahmL9qu|~oM;_UGZ+hf WdI31kK@ ӊkVh"rh/MiR#8~؊޿(["c{!N-.\Y¤7]|@nSZ6:|eg-T@7\| dT)5E<)6Eצڮ:FvzR?ɥ M!돑ہÁ;?A |5݈ďAl'XKZ2d v#JAl=Ւ. ƗAD]A=1eK{tI b$Yb!Fq3uQ-uD)̵QFKA^o/{ uGJp҅]Z҅.BItGNP҅~Ѕ]82.ғ.tGN ? ']ota N^roj|oMGe']t~V3#L_Ayr21Q3%@pͤ~O+$wrBZh!C<5Pv~ha yѻ h%d>fC*$ɓoj%j쑂b>xT!ZES,f ÊϡY^WRˆ.1-P|(Wd{f_ uY.7?貒.eF]Ve˗7f*{r.9n}LjLSb\뾎/%@U4xHZ Ke>wPc>\s3^j$Le-)r.UM.WSlh ^)&6ƦwSllMbcS쟚bTϖ]nKORO RYB9w7/·XsO6{óRo17/)ޘC4fNxv:ij11nq-ѰzOQr]vwI'^14 Kޱk`R9:=-_ K_^p])ݩbrOQZh%PcDMg/qG;d[CBtu2JC.{8-νq,mqgzgJsi?s/i4yҌ܌K_if+0mymרכ0ZCNn[(ǭQ}Fu'ǝݚ7|D?>ּήN?]F.F5eԥl@7\lEBv5.^(eD}k[#RF]ީַ.v]nxBy\tjNSfoN;n"ER浳l=GQ7d(zXm?w§EA+:_)"yfg.+?&y&˦xW\]P"u8{NqBj!Ì,?cm)XvUZC<&;g8υ%T,Mȓ+ow=5A@ӍZnM@Mб 6A{kx`y?VWh^5z &w$XK(O;5#$:usO υ瑑N2rs4‡X~m13Xz`K\"j~&Ms&3J5rR3*=:|:QfWaOe1̉x}0em%]:ᡶq~>&.XAkPi=犏 N/ӿZ J;Y%§z5W'OU5‚&Vhf+k,Ok 1M*/-A(4*_Vheg!ዧ$|4M64Ŕt>%Jho:|y =gw> p~(pv5lϡ6UXQ%̚'0OPه2EtGz&ܡ F^F`XF^FH>%ڍZn4*fv# xa4|V?gFV-6 \_k2 0TO/(f5ݺ ,d r>%B&q^4BjZ[!QHd'Dw=O ϮQi9_B6oJ> ϖ,a j  YΧ@uL>H#"1'9CCwН8t=t ;;pq݉CwЕ!o~cF̯(W[^*NCvd!\e |9@q>->dMyʧ_ZJ kZ&1,PWg.U/w> šN蔐,'K7=C(WaE}h5GnNӣo'C]"ة~sw ބ;t A;Ҷ,kE jqՀf]BWLG,_}:ށV{=PU4‡X|-&/ *Ƣk@S҈H+j檪E(hbȝzjKQw$Vqlׂmx{2Ϻ:Cv mW\ʛp.gz< t1V^ۏ`TW!(K5V<4TodUvEc|HʠH5U$.U?kj;? X_vTjv]6hi]| rn)(ZXJ`+3n} mB+yB~3lo!ˆ lҢ &J |O J?Ӵu>·X1q { 10p { l|٘wy&2h,?\¤]:GoKҦ_jT_e_E~} ܡ"VO! ' ^Ix*{0-*k=ezФ>$'^0ujIC:<g cuGs> 2${|ݾ,NDFP^З,W _}Y»őN3]ӈ8|ÙM4dq8[kX̅O `4Zi~U1'M:ҜT/WGcPL9kܱNJ8Z3L-3%309O++@s(9uKԻxFxx>KQ3N=_׍mt}m ǭK9)*pykFQ\iL(o Gv5.w u[NI5ǖ`5ɳ|7tl *V/X(H,slx6N}[ 2ǖ]/(Ġ6uQODŽJleĚF2MI[J ^PQ0[K4}-Kzb֧ ]>NاK*b'㜭%ڇIȮx>߮v֞pg]~M6.ɉEu|O(UcrP]I]uYv<,L7[ d.F0-;lKE`=ᴞ zrXOYOb`Hc=ٮ83[ WҊ*Ons +z:aʫTĜZ2-5c55ȮSTx`C]2-z|O(ׅ^*Q#lZCNn 1f&ܠ|teAt.7?2.G]Hk1Vdo_YʧH \}MJZh#fH;~j/$mVB8ᵤO"RL[;ԞƶZE/fHu(X8O }UVO%M R,%]HaoJi bTOp0:p}U;j:TPUӡjCC~&t?Ka {rZ0]vzŪJ1vOILr0g93xKowJ`}:iFok(R-ns;K\跋g&Yk1a*>XGŪXb%6uMyPf+PKyٮdy4UbwՁeo {F8ח=#~F=[{7#q#|F8+W+"ȔWD+b#\+)YƊ+"\+wI-9|5O#f\z:wƫZ-ak+b^ +b1}ٮ:G!/k>o?[WJK 庌xC%u۫ԏ.[u^7]ܕc[Ch@0X_~0Q~l%@=0-TPz@kj:h?v?bT؟\U\iuQ7?47?_t[iIt\ VTnuJ[A1ٹ[VK]ڣKKPҥ=ԤKKGtIBIti?r}d8Nmg}BK٦aAP{3MsY󨿸`!\ ZŨo00N@v]Lz,F$W"ʫTbƒ~-[Oٮ.#TLڷ.T<1{-fWےhΥ hS!ѣ/ =dN_bH(WaD=ƫTWMRkڱCrd-+^q)o}钇yZ{Z 糪RZY)-Y;+KzeizVʚ+{e "U*ye\^>~cK]otyv[.iEnotyv[.;춤$%, D^^Mڌzjd8RVH.K-y:'m.fҰ]Vyecpvr)v.<Ұ]jvmlj.+뒶^lFgu钶^_1׉fu%L^B'rRT|p ?1x^Ր楗/C!dU(WE= gGqؔ\YU@TkŨ7}]\dfC` Z ^Y(Wdxބѥ˰h]܉WPIigD^ץ=ΉGvÃb^oK` Zzj&lӥ={ZT]!Dz)e<{Z0Lvn^3cNɲ$~?AUj={H e@vG657\›p.%3%3~\\#cE̵3%3WKfK)ص9Pt^aCɶ5Zh6"D^K'^D toh-B*爯hlJk ZI5!e| 장+&Г-zy$2Dt^"ܚ^30Ȧų, u ]yJ|L=e2Rs^!pX8Qv,p.rOa'α5ǜ% ›C :_ ++ѭV @K.5Ԩ7zH&5` #\],YU@lMCk[O޺x3,v-ޜ JͰxxsZ{&ܠ #ջ`?+庴seJhdmKn 㘽^q5A ;! C$4O SZWpΆxӦKEsWҋ9]4r/ƊGj^dx:oODeXPF%]=pg]v.3 ?B]8 ?©]( ?2Spj]~N'_XOɣa-$0?W$i%Io’yna>Na ӪӱRPKWxyϞ(xnE_֘Uߖgy^T\z\v]$e<8E ,5PS,`Wd>2S(ieFO(#5|eFQa+8ҫ'1)Q/XW% ]/BP+Id+e?le֤~tYItُ.;鲒.e֤NWdG;%Bڑ쨧cd3^fH-LŲ B. FmBIɣܿ߭CVU pxcp}T}]ZjnUS.i6]6.viGK^h%~?ѾA>G 7wNutn)aԙtճ\[)R%!j$dM]n bTC\(x[-[Ŵ^fC!|Sj dI6'kjj>Uڜ9dHd< H J z5ll*-+-YWZGZO :>S|4Myϫ)I_ 78IA|ws1!A2\#|3q O5>~|B ^ي*QOţ[yn waII[2_4W'tE璘魞-nApb 'y=o1ui^o uCiE"iU Z!I-*i5 Y!2k [,f<0qzXWd|B@b)>n[,;XtygoJH{K[풚"곷io})={Kg[V,N6Td;hW^T%nߡNTÔgT7A6߭';/~ZvgN(ץFʫc-!{)~x<Wߊow{,>7]sLq:o>֟>0Uǒ9x&s<х.ɄJғ.tGJ$*ѣK2NJп\Ǵ=7Lu;1dT70}&׹#s"Ѹ;Ѻ4I2W Z25Dx3'{|[ &ܡw,ƧcϢSm@ɥz>lU(l65.7$ޫb+5^p.'g:HIl9IK!R]1F.UנY‹H!~{);5q JhͿΤ$|"W(Z|%Ӝ'>^@[d X!ބ;r5Eæ lv7EŦhnMQ)MѰ)j KؒM}3ӳ/՟`Ϋ|ђf&PzԸ@"q)vb)4E/\M 6łjZ)vi/,vT9]a0}K)PJUĎ\JƲ+ߏwL9l@W\ʛp.z@I1q>Bu|IQJ9PeYLy$eY] n|x 7" ck! gd3GZkWkw<33jZ׊ZqJ|xcdvqtz*0AM*8A=AaJ8A=AM0!w3pLMQl\BaSXƫԈ-'MxI*<Ǔ}:'EސN doLR%ȼSOܯZ6Qˊz>s %MS2-<[Zg1t]ƫwjF.="nЅIcM\g),dң %]YuE d 庌W~ٮNJ/MHS{5YԑRߒz2(ۗDa벢X{ ([Atv2*ԧ;ѩU0x<^LUDCT{]^p/N|teO;r]FoJ٠Kp_,W\g3xJ1xYF.^y*UxYg'B]^qK|XA6rc+c;cFV344gi[i[?c>#RR>){B.3*ud.Փ^9FF~^4|뾦)Sp5%LPVTyWlP5%ȉ|Jf(ץF}Xd.Ga|LAپlWj[XAdx_-Y7Eܹ]x}>lޞȹ] 3w7^'I˾ym,~r]Z+iv]{a&6=O܏jrֳW,/7Y,1'밲IqPc θ)zX-3 ;`NzR8ߴZA3DB*O|q1)}?OЦӼ wS޾`ήis5&I7]7*?8W/|y`t![(WX1/Iƌ֖S2Br[֖)/Pz-g>\68c}g~dwow4Eܠ˱WMP\5d~/ J䵬R1L+qlVmRp 4XWXqgYڭB5r8*5RK'[(WdER^ |d/,{_C@_|Pˌzj՜v]I ~yABPm\ƋA-wA-~] X]%*5UvH8Kf9 ]eϷ^q)/]$-1̼Q3/7[c̻afYwyϭ]5a3o/0̼iֿ[$"iy8Llʓd|Bf[˧Iu،3^T!~Z|5稣 f5}cҌt^(jI%yFf(KywE_.9\R_,x[(V mkɲ}Phx7O_8lP'>+Svg<~D?OWGܩkkt(ׅ^qUKA6"mPeqbwA^,rX¨^k?fklo_` %՞ A+OTR}kM}:T^ .qQ{h|B0K'C!%CH G2d(\p%CH G2R2M{jhFZk &57z ٺԕ[=QV?)Vj4)M1RSpj ]x72A=qP/Ԍz⠞8A=qPwP?)J֩SNdZ:J֩SNdd" KLKNK|,u3-u#-uYvZfZKmidiحnKXBKۺ-m -m2Kn6z-mX 1nkź׊kEFUƵ|YMHNRbZ|gTlQQ1ӨiTlbQdQ1aHcTlfκ|ݔ \ tZvKȦo=#EI[m؂̂jjbڸwڸحխfnq wMQ?lۦo6ECSASǦow)FwRv.]jRݥK]jR\+,uR'p۰ KݮR+.u/N_Zf+,u\ ?ۄ}JQ+-ңl@W˖=RzRǞT4yWIIz̠'3WIYv k"j>QlB ^P:Rl:c[BZD=7/4d8M+?Ga $ O~av ,3O6>ae D0ʿ~ګE@ZCu\|n&5_6qGt%\Z|4mfLph3kllm3(Lf6f ~mfo~[?>:qqG'=N\mщ/yw??R'vcyor[ rLP/dG?V7fA,!}qQq rv৬'{k!uv)N֞d'6]nPK[WmY-^ r](<VoƻovZ;2 vpKlz亜FP GZlv\.-"Ѣܠˏ?vl%B]~?f Z{N+v]n˶@K[[ *@AR<+̯vr7KY,YVUh)-Ti;g6=2)r  mBۣ14Kh{ =k{HʹҭiHm\ܔni}s7EtjOiš⧽ccP֪ÔSÕk BkX5A~☮ҍٍ8o-2TpVZVTҖ)C[iE3Qmū\ӧ]xI7i8R4Hc;viH-Z\-*ipcEm7w+NλQNg;Qλᄋ_OFOAx=eD&kR-ϚTSFrl=ecb|L5 cb|L; DtjXz<q`Z\\ .]/]xMMO{Q{S{Uh{Sm{S:xo:{ozޛ|MwKKS_NIRO4SRO/-K_o-C%&q]J%kRZf؎ڢy7t6Тܹ_xN1@w7Z/{\ڊ"xcou)88Sqtw8Nqt n8.$CJ$ONO]$-=/+]sXF@V_hq6Ky$!2q;ݱcNoJnt4 ˱E?+.#-+-]l"H,[v|ەۑb;ޣmG|яhG:}i}yvߣufWg?ӄ`g~8~Y[yk29ԥ jVdܖpWaԤ4{jEOMuᩩ-~jbZ?5~j OM{}OMl66 l+m6 l66 l'm6 eàϜM\f13w<}<9Ӝ<9lS˜7X t`MA 9Jq3YI7AAA{ix9x ߌ B3͘7z׹E>6T̻ιws%%E5iv-}2ü뗷@HʵdKu9X˶E9:-;)"* ecVy?U.E.dvlq?zxiޠKԺ6QPy 8^%ݖt72=>ɉL\~g3u1j U<4y@W;EvpТyZlq͊=N+Tbڻ=[8[۾=Rw{././S>(s5.PٿfW0,[ mՕZt9W@}`R .xwDnq8G]aGlw6[A, w9>;4~#N3툓5Ŏ8qG8}gc:#.'#*n~%o[ 8B5^jKvy ErItinT;rk|s$)二of ozeeNXSmxTiQݒ.VY֓{.YVGE}Omٖ襄Ky ^%vLuF([Rx!S͚.3^:B0[~m"nqn.=ТIR>$`ULӢ<&iEx 8^%%' 2u[6"_ ϲ:B3Y]e{4mnuA/Wκbr1*TqH}*zr>;`G^}i\Z.,L'@$@!vi=E&o_Dw4I[e5 xx$6Jov]h2Ho?XMhQaScsȍ L<8h>-͊t-;+jZ{YQӵjYO>Yq]^DtRhBK < S-*_Z.#*Ңܠ~ٽ/;ۺv7we~IgYJpK'M.L '-?QiN[垾B] /r-ʝu7&7&uޘL>ƤƄ[嵪oLw1oL37&g}Jcl1>cl1[1ii4/cLܲ(Qʺ}tI>CkthQnE1z8 \u=9NP¢R K[˼Kopκ='no_.F]B[:7yQ=@r?dB ]F@+tiɐQBrܔ<.W6]*?}-ӊ"-? :Btfyzϼkj Тܠ2.+2^]ZO2P֓.JEe%]ve}tItY]Ve$]GtYI.NPetIt]ve&]GJEgk}~.s~###}vߟmxXܯr^ mY/%']]!j/8vi uwOJHNft *4NJ4J+O]Z}CΈ!S/7";OZܖi9vpʻG,~@r.+9XIrym1nZRPDƥs,+x!κKk;M h?>U7|Y h?( E.P<j.Pj.P6(up T_(J&:s=zl.M=\\6t+/+<דo*VVVWcU5L0vj.IɅdh& xXU:jiĿǺ^QsYZrN-6-Qlo\xTiQnХBzڢ By`!yYU iQaﮙ7o{(7ҹi-\BN*\BW%t=goA*%-\BL[%ļ Тܠ|MCnqp$34]M5_Ӑ[4=5 G2sDӰͯiȯޓ.L8J ˺...$](5,t( /HlbLqאvQs/ЧPOs[x m_V4\xt]闞e~o`xc>,Fe~_/ߤ@kxDQ Q똦k.mՕXܧti(+A aYY-nhM8 &I ^Ck/4.R;Z VM& ]~&F}&F}.\ǣAM5%N ~adu*O~FrlA'V?eidoa-LZSP *8~q*Ua#i4HZHZi$_F .A[~[_y /B"ܖBi(%ebxhQ_/22/o~7:ᆾ 7m'n 7oWPꊓ>]RWP tX+'u_>f.%3$3^3wdR2sck%3>fIf.%3~1s NZls$lU%-u/5ZV=Ֆa~ƻGSUa.A_K~/'IB_/*rE_Y)B˜[Lf0,it5TMZ٬:5ğ}W^ӝ[bNw杦8g>wk$IOԚ${.'"my.?l n~sWk2#w%Z  u0,t0t0p^FD:osħhdWbG>FĈ}nϴU;F󷻥@rg]:@]_Y5{.YvYһ3.Zaj̻D~xG- 4-Kw-qG@˵ /!CF~[fm>j[ru+=7r--[|M.H$|KYVUhsun~ 'ТIg7{~L(;\p FS ӽt~UG(~Gsdru΄~kS;Ҵ~lʼndxl*+l+4+}tl%ѣs%r^AFN{]"=:]"i3AJ22?ic}uuu7cՆWn?:ڧA;B-EmVi_wA+u- ϾӾwҾ}Vvg۸]Zg;iiۿ{o¸A 3 AƁqPj#+6\߸%&.(MKK!WatZ /<{iN!%x do^2Z;wa4tiz3+*vuʼn5 +WPƮ83 >8QeI0VUs*ļ]ÇKBN͐+Rr)-לhNYל:fEEsTEsrAFsj)mů(~}ů(~A+~G+__+߳Ig}Ղ>r__G{Wkmz*nz]tѥ']G]_tI.\fߜMZ3?2PR2pќ\0TӤ1:ėu[j#F߿**ﻖ8@۵R.mYvrEvUm&ޮ Nj}Hja>ja5ҰZaӰZiX_t2̿B./`.biV\]Vhޮ|;}X]z1 ]4h4 k4 +5 +MMÍm +u5 \xm AXmf0m1kmAmū\ MN-P$v^i ¡oQm5-\ ܨU΍ʻFwUfcQ|%bv~xqm>Ж^eW4 /{{-B^Mz٩}KWOKHKWK׈ǥˏ?KHKWOKWeG7KnsHh.-"*C2虶m.3,Ӣܠ8a ]&CðN `F%i~AϺh`XF@V=Uą#Ę+ݱ[+PwJCM\!+|Y ϬXiV4+gV4+V3+V#͊;͊feVQ"p(jpZp( DD%׮t_tKWпA19? ,K?ڂG[E c戗m`/D ZRWЧ+v J]A;u]QK J]At#*Ai˲zI?zmG2tq< -Ĝi*P hQI,Nҭbٛ~zYCW1u9w^:B-8iK$vI? r]ZUjYv]^"Խ"^"{CQ6r Sgjxj 5B;L\9F`o\xkCoqb;wɷNTp'VO>Yw; m8VYX'/>1sO2sĥk}p3'36\̭{b.3钌5?$Ϥ2.8YK2NLr]>N߳|I>%9{rӷ4_{|I쓜x}yBvn!#+x\9N4%(tRMx)TH͂<pA?wA?oG?ohi2\]=3VH:H:i$H:i$4;ZI#餑tޑ lRt.CG򍎏ot4StF8 Z,Ekuca`= ]ca%8Qcmca%8 [uHt k(- M.'||H84:J$ޚJ+gbkU9i$>9,x$I/#:GGHjHlWk=jP oHFv-*gzf aW^RZ;6mƱq²1qn 8zU}7jxx{^5$ˣ*8^޵Bu^nN{{1x 8[{NbQ^UO?k8 ,*T/z!q..W̗H4_Z/3_ΗV|i2|ii_c.wi\Frg]14g4Vc3Vc3cJcl2ƴ.V-Hvd*UhDmi^/|Fv hQTigo$|Lð, Pc{cuazK˲\;`yZ EJ}pc&́+$4}:]4(`XF@g`eZ ;"UL5V;"4 Rj;"#hQnХ/n:P>a^.l@Rh˖ЍeOOFmxTiQnW-IkeB&H[$VK>I e^Rږn.O/3KKKSO/-KLS_e|teEt]te$]/̏.3鲓.H̤2.#2?L_tٚh^譀15˷4MJlt$[9iB}X+NI}J}?}tߟ~ti_;}% + aEaEiX4VaEiX/|t9Et9]t9$]W^]Jr֫˘ZZ.k.c.g}t!ԥ-ԥ_ty{>pw z>pw {N^\xsݯT ȏ@´ZR>SXUuEAp;>%nG$L4\x96K)A[-[$;܎s^ƠoׅJ̐JSNU1=fsT8joJktb*NA3uJ]1?]SW3uEO]1?]RWoE.py02uuE[N[8ߦK(x%(B0Kg ϼ,4YwCXZ'K1A OhhަK7Ҷi-rmxTiQC]B]ƿսkvmїoȑmrtPs9_UF4B[i@U.Eu)w*%]kpV+G7uiWY%_3RՔں-]#|"Wu3loEd=)r @Òf *su%LJGr \ ԣ;7Cng_7nu 6p! ~۞UkUUkVVV?蝹ӪҪ?IТܠZKf`(jp ׅO} 1oEnR_xxݡVʥ(wy9Rm9eOV_Zy/e/*/Trmlp Y 8r'9< rnW`b!EA{^O1SedCI6z4ʳ\+2n+Eu`t8E~xScE@#ѓĶґ͚z˴@X,L3˚3N}Ы0O(@ PFPiiҶ-@E.EAK;MsJY~Et}K4ߟiNi~Y~ty䊘;/YXvZgڱ(mY+vZ/K !R-',Fh4z-84,IRB R5[='*WV8'B=,sm9p^Ko{:s]%]R;vɪoԂ]+vIoD]%7Swɩ%%FOj̤Fђ=?jtTUc迫sV#qsq5WUC T" $A{N}G&&WIx.G"|$_ i2O}zh\<m۵ik,johQne}J+ t+ ^ z~^꺅/ɡZ35%{>% 3R]HIbNЁIvꅴ}酴}tퟃn }ng ]삏i]ӿT .96D=CY}Xї\~O!2t홚*t;T TȨt : 7R9W} a_b/\xbo*4-7I6nar)- pڡ S]b;,%{*z n3هqu%ؽ{Tg'Xpt +,P3mbY.P .P- PC5jG]lm'5v1>mT.zA5mlJKi{Ȧ-ݴ״7mFΦ-"7'ТܡK-oԒ$]StIRJ}~g.+u*oTZKJ.M=sh4ӡi~MMMD5:94u1lYؕ8聧 ͨ'-2mQݢ~[*W$x.k=edFcuY'(B;޳kL[ ^嚞x.MB$teI@H☁g*"$Q[ p6]"׋~X>(w"OKtK1:Qf*K3@UA%:dWSBjOUMC :ܑo*kO#=L_,pÙ 3!L?-1g!+l=|g1t5er{ B*jPIi7M u^'Jl(6bZ;낏eZ] PU-.'"ђ҇EN jCyW[jk-ʝu+(_~ | T L+N+0WQpS\^FUUoUU\U\XZUk5\FUk5~vQ# 4t8`~Gj'݌V!ps?{.+"ѢܠLR̷_X藙e~eb0mJ2S_e:'B;FlBB[ckO[ck7[:[Jck7[ckO[ؚ;D(Apձs$jCף;PitZbaYYA}͚36,+N,I]4E.xKfX`.r6qEs͠YA|}A+jSl*]qޮW5ҳ-C=&Bia8ʫdX8*jp AF/XX_DR79s]Gg 5fJgV**"SL{pIS#ܮmū\-ps0hZX$]ӃcŸDm+℞+&ˊcEVpz|Pw>$P}P3?+ONJ4J3!f;MNiB4!gBL?0!;!6Nb2!m|hI5FR%5ƣU51^51#2a:Pց r5V8]/jwC"w n>~t#kuڟid8#kڿ,E8$!GN㬩ELUq[9sQcLF"Rxdžq_VVy@ϯ>_\auS{8*D鎖,ޱUH5t_\01_).-+?.e5ule:he`lnlk NJ4J3T\WOE>L]߰)q :ZDC69WP|:2Z'V% 9V>aa3Rj˖tSH2y,qhj +UhơF[A'!"{5ТܠK'JBʘz-{do`Sv@u ќnR@JJ6]W%Un z4:V|Hð_R#o*VQ:5ws`W]%+dgRj8xVcw0m%yX۞O- 5x"'침TͬEVql{ĵKE뷋m>@r.rsbf.FE.?lB%wHK;HhÎ[ "Ѣܠث戜.#7'JT>Ӗ%'d T>o^Zvj:5[gp}$A>  aMkpϟ5?Y+hK?r$fzOtu0;U"ܱ3o@ǫ\2]C@wH  ߭dh*T4V6#=I)tDzLF"g5*@5jTW:͆ T"*'ŃKV4qA-x.J4:Ľ+˿'R/B=lmie%lvW@r.] Ecҁ9Hڊ*cYՖjaM!e^\"[Z4Y~^.3 B;Jj˲ ;e=Q- a} C>cԣ rA= {Mqu%8H\5:› v*AYW^ҪEUkUҪEUpڸjѳjEZǬeUcڽ ;ጡj(N1 &V%E]r%5ut .9KΧKv aK*v.9.⓼W'9$',$%MrI0{I^ NZgUyQE/A/1zqQx<+ ]%k+ ^ώ=ѹ4U޹R75h?n kׁ1,p0+2zM\Aw84fNNpq8S SOé28dzHñ*jI ݱT+;RyH[a:r1\p cEYA|9_.R$z>j-U猓NĤjE:(b;e2: pUBv=6ȕ?zG &.9AݙV<9VZfV$ۣh{L=k{L=:mGuN8ڟq48i88&#qq_HqȨ\giΜz@pLG̗41b_t0GuHt k?t p@K!P,*TH%ZO,yJP~좮[Sw0)L`:3Uq0Uq0L>i4L`j;F1""Gr+t`XXVgfHA  -BB { l~e-~)1.y P+( \Q׻€=?;UW_,!cƏ5W7TphLUe  9 ZkA"?j`i0`ji04g0uL Sq0_Ph 947ŝ@DWF*0)>o++M{ӂk0?SǕ&xryw4zIG4Ŏyoˎ'g8^%ݮ]")7s?>&1bmyds۱"޶Wsh1|#!V:BbbGGG},ؖ,q vF`ǂ]hj8Z G B5fIjGԠ} Tc1 Aq5q>jPR$5Gjq^5*qPUC:aQcK(Uc`PP_ԨϱW8ͩұh8 Ǣ]cmc,~X4;zcQc<@oP'{4X*vnw@+ м;_MwwBIzm!_KfP,m Z\/^3mm7rpY?Gyy]$%#*RUٮ@*Q=E!aH.c7K3Xш\Qa_CAuYM+TaEa_۸ncQe*vh2I|;LOBrk(Bf[BWn/ ?,\/;]2"O (bH5W% @MbDkMfL8=@V UCA玌t#%na0cG'*HhZpɱ"Ͳ:=;MfJy&Lyɼɼq2Ōydɼ. `c ..PGϿ# X̶F ;RF] {1{#05ȠG kPj}*t 0p^t8$Ϋ:?pPA@QuTP* eP˫CFFMI'@o~XZpcY@`EyCi +pV.~sH3Y|pzNܭ-JN+;ӛNK׭"v-{5pzNQ>Noiﯯ)ooki>eeYAz# Z~9Kׯ:܃N%5*W(~#@$^-~knZT@y5<7h7hJ{pc@nt WG5:$U:vYV_KW$0'q{E@PWPRybFYWyv]~ٟn5ob玕vȸPsY-98WLIQm#@_q8T'ĶE{Kc\M#V`7xۊ.~u,Kct k6NSerƇ:NqHW_nߴ\XF@V)~ů__(~EW|>H}܆N(`,=2:&чmOKHV-9,aЁ!b/A_7iɯOJwKaga)Aڠ BFpmIX#Wp57*{-1qz߮ `E_@K~m(qtw9WL|y;@V4O}Zi5]X>δaz#v 囊r,W_F_xjuam4.1,:[s`O QfFqWa̲ln!ЋQD/t&ͰW@S`i^gycVp<*K:x(@Vi9Xy%ΝKv3Wn+iò+¹sߎid & '˷Ԗ IV]kK?R5hytkH'Q7}Y<@r.gD &i"X }D}fb9Dl åpg"~ 0y>d$IdR:QHs)tO :g-?!bw;AJPRV+SZߤKЁI|b,3H-d$hݰ.`WȌg\pcScW%h%ApO MV< S mHj3 B%@$~Zŗ!e>P X2- i] 2DZtsm*|]ɵ︚vko\e+)Ǧ K'ӑ&{`DZ"Ͳ:%U*l}{,Wy#H9֠[K+qTIyWK߮V-h{xZ eWCAU Zإkeo,)"A:ZСȠ19VЂCVig)* N~:t 0W~+FG&Y ۱SmV wRG6d' Zk ږ c=KUREC UlA ;D51a'GI)ՔؒhlM{)5ݱ"޶X\]vm 0sbW]{cW?5Y^? ®__/-w=+b*}K- ]NphzAbxjf^~9VQ:ħw" ‰ NJDXiM"‰@Nn6NJDiMaw"L,ayOڲ5 DQ88im^dz ˅]-d.NQ,X_`w"$yRR[;xׁrE`HE[ܠ,Y1} 2?$lZ׭/{-\xؾ1¾3|aoxiDD ӰWL@l-r\p ȱ"ҁYy A%-]0 T WXj kpeWNaWxម3%)UzX{9^4Z>Se^ֶpc+ :CHjXɾ5Av2h Z>:e"ļGa&Тܡ˒tU'ꝑDV3)WfŰj|;{gᝑfb׊1-.M@\]|=z%G'۰K(üaZ !^0I!f.߬S?)WfMf~ÿ ;ViWpޜKscRşUK^:vaZ^#Y!NJ4\5;Zi(?ׇƌ4BEJ5hm-S۹) D R5.>v,@h.\0%ߒaP_uƖE?6fw%J! P?RRD;-d˵T*Wax.jEA]\<8Euk)(_bB]ĺKInЅ׺6tlv\0`W" ۱"СIlh 44vCCOAhhkhk)!'Ccm04khLySbe9΂vmw0"7H_t]v$]GtIe']Vet9Itٿr>ER|tI.'BIB5r.w]UuirhuQʪye1,[^-beEzκv.e@-]w_98;K7ρ&_yt}[*&C%;~}icL/z1cl7)B]qRHFcc\J]8QΈnHhDi/?/J [L%v++14Cn+R:# s-?PoM:wsE}0K]#vuL*?Ԕy?_'Q?PWo+>{jZX>{QoJIp8(s%({ 1CYA-Q<\´eI6F Wʠ5=-Ֆ% :4+meDmYue5TBڵMr(ۊw.v]S~6Y7Æ@vdT(-;Kh+YdQ?.^z m;tx&TvxDǰ)Ք:ŏզs5hJ sAe rK?$;5K,t*pjuH3FgFoYn T[T=pIX"m\i= ĚU. m9Rrď.,G|r.?5D;cWR.:X)tv/xzNz:̍BmBD40,#\;.ӱ"Ͱ}?4?а,rI55ԉ)N {t:"Ӽ6tN tJR7,CY٨jFɨc1¨>7΍5.0Q'9nėwx*>[ꄒoMipuyv2:ڶFKlcEm/2U)֠tY{x#7B<&1x<&cyp;cyLyL5!1VzkNp  UŧskS5ȡ5ʁXhyxbդzH5xFwZrTݍ1vŸ8_LVká,ia?uSO;PW^+P-Xҭߤf/ t T\HG4=Ԉ(b:G:MpubekX2&$^mt 2r.i^ªnͱ[#V&-FD`DHF0"Z#b40"F{hy FD CQ#d{Z6aY[tXGao ݟMNJ4kgqW4%{=SW>Sw xoǂ+s}nL 7(UK\ͤ ;tW_✇!I 8Vv_/wկ.+^NNTpɰ?Nė2Q~\p2* 4ʲYy QW`ԓXyfggW+$Ї7Xyj#N>x(cE/@/4 2 * YH6z(sAV]pKh}yi?W X-eWw`Uqݱ^eYA|9Jo+7N.Υt LS_ ӱ"Ͱ2d5agDF+ @|^N^ށ-P9WP|:ʚBpa|*^PA#4UkP0;Q3ƿD㏃h  r?h|?- S 09GC 7@.t H$ v-&&}׌P,>jP|tRIKco Ŋ%Td:r(YntʢkIWp\=/J2S !V a :S”g[0 ɒ:pj ]  FZ=:4토HXmg>Z _C>p ]Apm_wf 8*t(k’`-_*=2U>v77hZ ?o}|ܠ '޻kƐOj<8ѡ^fD N]˥co|HPS)T~sVt9i=][bzpM:9 KaW>s$F)0~Ijt% v+- jI1d&dzL^Nk=-A+`OrH3i &~+]O.d?g;K޿̥#\o\"T[ѹz=Rxwm } }=5OH1u7{2rަfrQ\[ eUǛۼ,x.7AUn-Krqlӂrjq%~F)F3Vs5hUi%s7v+}_jid7~" 츔izGm+k M4k VcS4Ӻ)۪]l\X>-(7٫diᦰȰ*MMaWJiֳ7j"&Dkq:6N«96fpN]igpu3~ĔUu=p gHQ?{i?@gN?s~Ə&Y ,uglg?X0 &0 <7L?X2¶&OۢeÃmM\S`&W Ͷt(+s`PI|N998~6*8~????sspl??Tp?3~p/M3!{15]u/ WˣPMЎX[[rEMi{ޮK{B ZWtޞZ뭕wEׄc ק+:tj}Bq>z!/5X2^•d<*)ʣkK}nׁW@y4Ӯ]@5aA I]*vAO].8zm]@ ?Xn7,ԄI<{M#ugE|$IߌIL&1$'(??P?|aFa`thخ0eIv츒[%pu:r ٵG"[뾜MMߣ~t ::$+s_`1)l. \M QsH Vj+;CW`>(Ԍr$w XAlAp]Nrp PT`tE~nnH$6@8udr">Hv5yKUOkd+9H&oCwo5;eRT\2PK `!@+|qݷjc55@>a[[k݋x<TR7h| zRe@Q@| .bq>%TWO!Bۥ*aKVVh$_>?/_۟H/le7}}’xbؾ57lnI?eK'ۗ~پF?eeOY@s~?&N}gsk," $-.2/gLs"9~a ~M 0r/&_n_ 2 0 2 1?+uas B}-D071yoKed{] y1Vw~~~W~~~oLgvsD bB;½'usZ;QS[mC÷:_`Y Z+A8u{^)JSeK s ohڅT#dZ䢖[vL*ޟ=Vy[DX 按Eor>ZNHQRqeƣK=ßV0;c=_35xϸg|k< 66u9I["u㽕'b }:@ANi~wS7hH%'pՈ*!˦iHCR1 ihiHMC=45 iwXdihkJP4 oc-!`T/Zq"cnRޝAH\l|Y$Z{y֐JSaO) ~ | rN=[( 4*R:ßVFgE,?[+4\B*j>^dFo7oqMqFo~ _1 i;/<'E ?|JݙNm-]4KUVcLLz2sezk| zؙ>h*ov0gG<:@Oa¶_.yir~!׹Ei¶_Æʇ 1aÆq6 >lR/|P۾6n5$s|f(Foe~~~>z??Oz&Oh<~4;n[# } }~]#|Cڮ=mWl_]+_ەiӥ^ەIەiRkR5)TO" jalwDKAN:(A:㶠4قmA-hۂ[Pc M4'Y7 ?eB<GxB>Ŧ| . W./B:~V.Z/>YhA-{p>(VQArTMᣵʘNP6Snf-ĉ">:c%~۷??oo~Ƿ? z;zm라w7߻λ^]woW/7 ~gW^+ ?DDFDd:'__'_oyzowowۯۯyכy+~}@^nD} ;{ @TrR;&ꚲ2frmx1'>iQwۧ]}zgTe]}L'>"E^ ®W{(m|mc3yo'o;9{Ax(m.}Wmc]]wMwu6{y(Kif&l:j[Hoc٭t٤V0^d͖{vÅ t |/?;/&/?Hx)t[:&_ykW[߄d.C#·x^}}}޷޷7޷?>—?/߁{-۳Ϟ_[g =[>89.vL^qqCŮ;.vq\hb6F<-c%Z*5@t|Qp%hEbKu>-ǐVE>zy߳g=su,>yݎ52X>av,_X>:yj۱\!ˡcy/O Eƣ^~q ~qq>ׅg­w7 w7c>j|L5TOSj1SrSM>ek|L~rL`;E |(WaF{ՌbY&-vUwC(W${Vlx_SZt-f9mJE?01\ZͩT!?H*Cv|&FScVP4BCcEuJ8b|~,!|* w!~@$ ӊEjR`þ]IMLieoG\X-vyrau&oŠFȒLV^H[(\Xds]J97= R7hͫ=:t h,5 0S5FRg<ɊXJSuokʮv]Bsߠ+1*W*+]PȤB}{Hu 9]!(GW 9]!hGWFH{49ڏ`h`Zأ{;B$)>5ܻPc]яhGW+ګ+~tE;+vz|Q4mlX1%\ | ƒj:zH݄k0h.˓"hq[B]6]WnA5 _5D-d(b!ىCivÕݪH6ļ%VWH`\t(ѣwenkhȤ5}J\ &$kɓ˵vkDd<)@yfMٙS(våeY')t1⊮-r5=iv yLV<-[l7Ml7*n; T^;]F VÉUp2'{V+.U @|Iu$"CׯKKMLU}ixЭ8~j*tk cc4/֤ *V'49 @0|mfR~ߣ ' 0*H.H ^Jdēdi޴41Vn$u:Ms͢A'Z9+C QdC{c1=~.U `Z+$;!/}Ń-/;Lvp[6&Tߣ ZNcF𮏙d;z! \ ?1tO7o7;'.ɍ`GƄt$)xӍ/?3Ld<3g{c1=-q\q\1㖎qߎq<x&sd]Ҵ&R]]/(rēfVqH69pⷫ(=p.,>S3eqD2;Ù~JLσb|?LT%\j7B÷_[rTQmY̲NVO(&uK!ĶD؊b:c=9v.(V 16Ť2l5R#u"~3'Nc:–|OvZZgHu,h?Oa nM 5E+c@qٮfV#QHv%$uoZgj4i[݁}+'gE7";h֎~ӷo+sUb𻷊h-#T+_ xòJ̐=-"oFFJЊ2~ nr2@h<+ ׿nDt$g Ǜz`EailӢfruMYE#_ O?5sZ{C _A 9y"%|AdY/@\Z+$+ɹB.C3nP`InLR(G7 >A']˸oEFԊ_%D`5b2]:bȻ`Ŗ5)*FLt?4~KU_Xz|HR5hk)q5-3run^XO;BŶ~Ɖ&jT uEKiwJ8nqBg%&Pu\A((Uo6|%&кFvl%${1y z] ,CJ|kDy@}Pu(gG+TKB*lacލ" ]4x9-<`1u]Աi]-r>L:h2v'J M}|<87o~Ap5x**+VRpZb9B*?2#./ʌϨV>| muWԚ4/ʌ|MHWk.lDŽt[>7>AH?]hqcԆZ VoVq4h9[yG#v˞hR# 3~0IiWHuzNHY_ V@8ᭂi8!W _v_ m~2-d\e|E^g ؛%y_F"nݓ/]18'3*7f3#c#%v%H+2/c7 HfYۀ@8魲Oc 7٥c Ƛc#Gw~~?3|g:{/䅛A 寗.FaušTCElќ( ~VQ>J5.|b7p/*Vb9*HU[?Rk,h|1=XVaDc VWvVAv2AȾR%!01e¶} پܶ/da݀~c}yVcLEO=^86Ť2|lj+o@r>Joooo'WP=c`b >AJ]1/JܟjqWܟݟJ WTApZv7V_V)9c=s>p=n5l25i07-o lkl99ZBbu,4g"/ٖ%lYNt^ia \کu*dZ+n?Ӝ&9LzУXo1鵙``_կlKt(oj>$Tŀp ]Gb Xԭ`bi7\JCiw@R Ogɳj1,g64[\B_qFj}|\CVcIz}rW|iA|LVuyK* j׬ }rWWVGtVfD}+_Uw?m&/|2Cj9f@#;TIikb}=Q\nd[4~+.U ߭Uр}AA/"{" h'z|\ 9NJcL@j|kjdQNͻzsSm'pw(;]Z+ -C7-`??> Ƥ|T=U=֞*ۡ|JDEi~K;ti/]]/ti.'K-Ntdkh}3`C"c\a IJVR>KL~$ ΰ&0~kz#TH%lKUhmJH%kW$Ϭ+ IdKO* ?"6-!c Nǥt.ePkuXвNG`uD+eK԰o%<-^!.kE`QC\s.G;&O&4Y6bMtFGюQg#QQitkt4GG}39Cu.[iN[VAi8` #ߓͥ*AѪhXoB1>F|Z=jsCWOŊ:c%_4ڞcjF ,ĝTp>< f+2p)t>^^'"U>Ac ?,(ť[BaRM~ E8cX⢦zHWd;DޓaR~"+$u :c (XӷYDaXĢh >rEa91KUVq4N%:ϯxZD./saHbg Qf,3"@!Lqac_n×~a/ 0|7/ _uk^z4Klz*helB y!;?~;;=p.⛼>YFuYv.{>u;َvt)hW JxGxu͛mOegХ}Aܳt&((WeFMV6a{}O j`J\xAUNF+!,(nFeEpyFIsڇ fM{kƔA4S >%aI55Ò%T Va˚v f 9 I\%XmuӵJhm r'8#&bבUP7ˤ'=p>ѾR'Z'+_OZx~Fb٭q [w: %*^S-5jCh>q U!,;;yAmٮE݇XzBRxܧ.* T^,(%y"^PT_Oeg'(jtѬxm;bGM괓A[XQ-Jo2 ~r705cń=K@ ޾Q:/-x(y,v1-xܤ#rD =7!·QKvћai/h^4긇acyj'ٮ^(zx)>~9Nu. ^e."鷐d -Y! [ܱUn7zD c;U@+uKPB*kp}T/LqfOLk/T83|A5c'Ate m S2-:+pL)-ҕiNq'րO('5%ZP-v>NO{A{ۇƫT'x2[6d+ctmQ'٤˪F4$a^sPኤN*XwkR3lk!)G d)Q 7yޮ,+:4j?բ(\ԝ4=L']󚂉< nm;| A<5fqJ|޴3R D/|;`ěu:ݥ*=֧;c=o 5:=xk<"Tl_GjM8R} m"M޷#(^7uE#6>$_Xx!5@5Н=PVZVS ?] |JH*As7#8ӝ🃺scj2݆eU4+k٤sR]"~tw"Z٩F*ZhVLӸ傕 5 zH%tXɎ]>ǩk \ | zf켵VY+ ;l!Z#;4W#ӡ.~گ}'5T%8|?#äJ6QhU JqVWSdJƈ:}uG^Ztҷ/T`M'{;`/<T/< RlgH]x: <Qy@]P4Xajg\%XK| qݝ\ߩW[@8 yR e|#KUwkcgTvN+܇8$L'jlrW+|7d˿Z(㬁8~ >%(џ>>WdTNo_0@w>J:T}IkS0u_r},'FQ5#Qdݥ*M3WRO;oo_w~~߾;!_%?(>CKc ~5pHP|mKUᣠB"܋z'۾AvN~fg[DfW,"L*h;tR\ 1.} :@0S}YWx\#V\*"LH] !@Hu8'M+9s9y9y [=p<UYr7OOG 6RI5KU5 x"gHuԿA>Oѐ%Pt/אo˞Ksb緭pZCgHuVt \j6r1nJ5eOLVBjTb.Фi(7{oX< {< 7k OOp>>|\OpY ܟ||<ߟQ䟵4yro'];k)gkoW>lO@ws8(R [$t 5&~L cykC:P‡sRp ްR~4sq5Fq4kq4Y 8Ε4W~e JVu%W]6$,Rfw 1P4ݜ1V_-*U%LTN"'B[Z-q-%V>rl3JaK mWympUxz!6j!i(&H=!ihVyOC[=:Zz/*&꩝=MT׼8ͪg/N4=}-RKfow9c%~۷_?oo~Ƿ_ }_~&s<4y=y*Ю5Y =|rF757$fxu7o2EJvU#nKwZ`-R\@YֶsD jJHbEC*7g +?sq)4}K|g߉q,aanTH=q^g{'V>=vɺ>?zkLKHք[HB*?>/ ǽ.^@˽^@^{]~_?o?_>oVx+h1굂aJm<|_b܇.>>/|w1xzn-sA ܡ om(,1 Z9>v[M~)g{[ky߿W^Do?-oK>/ڽdk[K^~Fo';5O5O%ۼJ|3VCyM@"Xa)[p4 ;1\%HkU@{\/Zzqx\{\/דƵd׋z2ǹ|^ܔP7U==oHQz"\zk® %JH%+*5+*\!Oo4EbEz5"}5IՔ#'} Pey~ֆ]Rl2i#8M2!FR*+{fLv1+ͪF %ڛуTgW)T!ʮ4ҢrȵTĶrɵRB.׶ m+T\Ji,B"meV|0Y1<z.ZXٽ.U ߽|Tx tBUtrK!BaLh8a:]kɌ TQ4˟/R.X\` >z"aZj)6\ÍT?P.hMvN_)tJ) wF =JQ۹^Id%\ l>"4e~"V|,](VڛN/$wɖkEx;peFl%KHkWxwɈfūK\6bi+)(ӥhOVdTykODS@^9ף-t'b$lɦ%NEO/&]4-WzfeԡK%k'fiiѪh=:K^| 9@$s"\O(WcF{mVLI4O˭l켠%+jdoM( kjDŽړn7![PcDX(v 9pdо}9v'RI?֥B~Km]4UYH`=Da uym9L*ەX XBj9$| #gWTI]Ec wwTRKA2_SbZTV=|nEŲ\{+W-Lђ6D[#znTWbo㬸FT%\ 's=X(ǨǨ(h5* QQ^dThj4e8ryy(F.֮XU2EoãźX;pqR_CvR_CzR_CrR_CzRt/tCy"t_".̞UyWb?Qu4VXg{\AքtpIN]QfUQW!%}{- b gb.%[l$;Eivz%^MW_//~KK?_2~G:ҢK7<ˢ޺ aXnStꋭ5XޚEvXwW+qtxu8]1^]GWt|2?2??wO>>|UϮoz~HxGA3|NVx?7~aV?0٬z}]O$31%Hkm}LlcPǗ ^n!5ǽF KVTԿ+ֽY#^L^,^{=x=2y=HϼYYͫ1mbՄMDE*x{!mVP)7boz&)hly+6]$]]!黮SWD]13}໮D]!xKS"R+|ROo5@:M ?U+ /#yf z? >3֬s#Y!Df3U >%÷_>o}|WuQK*ِKֹK >O.Q u?K‡Ka%Zޟ'%SdKUlCid>jey_ゥI J"Nd.-,Z%KV㗻nf5iu~ f' ӄIV*4S7bb '<+:ToU^WB*SRYEx_J MO2^PG!ex[AT J.˸xol5{\Ce_f?n {z\[M!Y$sO)Q{1]HyAIIQg'Dd8o9J &](?mQ?OGTjAVbr1ʕ%,L싇>\xYcgtF} z 9G} | z 58'QhGW?Q?r(A_G_r A^:C9t[a* uAVq!ǸǸ׸Ǹc\k\1.1.5.1.qtCaK\=05iv沴ۣA1>.W Wbz~RY(U#SJQv.]pT:T)gطT.QZvGGX <">?{mDL\qv^9$>ÛcPLLH9 f]R:tpIG:(JDZ>\~3A"#$2B]IXܼ:/q`jLuؒ`5rH1'z=ZBP&7{}OEő{=!Fw*L8$̎`RZfՄ&-is#g?|V$B(2?**\cd,RzX2yu,bo-D]*:[sl{lykxxOsbA\ iUB4tQ C6 O RZw̖)bDTI X*1R%%l?4.;VC 3Ze3#\vQ63jGX;mca$SP_ REF鼠J=I֬8wJ[~9/[^_2pæeJ \ ,^ZDFb] x Lݑd-b,}0c!G*>tؓ<44bbPqJ/MZ9eo NdhOÍd2<.Eod]m:\Y%+AXv²_#6D|V %оkCDC|*4~.*ɩ*4ˍق\߻V]])%}&-{G VUU5bd/Ed8"y"T+8^.Rؒh%N@ TY,cpuomj0\DT3N|bbЪhZH=g7$_A3J1lΤxMUƾ+.X ֡@0>|wW^Owޯ.@|_]=ҩ Jt'~F;h/5ڷjj4VT ]~zZdߖsy-vn`SUؙ7LO.xcgڽU1Ʒ/OCYOCJˤNlՐ*QJAS,a=~w]`\Ie\@r/ .:]1cvTٕxAkUxv:xvu8w\hPjE5&b]hqx}8\ #%.t u'?3($ooQCvE,4E#cJ"+ړe_}r&k NWƕLop25(W25(dze\'kJNy:٘aP͏|> >%Jj胤 VE,G 즜T%bEfXR \wvUNKZX3oXҦK~&Nϯk_̯ެNެ.ެ{y:y:j777YwL..G̣ `p̫ 4AHr Ϻ\'O3|M\1:u'יu:Q1TYY7 Zv${iTI_)Zegḍ00Us#h`m|XJW p%Tɒ3 oVa%n]nX׺u׭ \.^^k:[[I,q9!n":=؎eZhw0ѬD8MvZs東ACkѝ|;w^}k׺ߌ;w^uk.FV|kE`A"HBjWF^TAGXsoOXv-lEs]޺3>zKUoU4=k#㸦8^޵xA8NqhtB'=q_cɂ {O +bj>>1hMHʉc_߅\q4wL u4>%FJۈKU4"#ۈ#ʿ0|Q~QֈG#lD;#1QaY^F[݈ Pa&=>S#‘X>J= 1P103cc@ǀ(<{ '3L@ ޵ xAIÓbAso=Y5/ܗ.8(.b1egCÛq1ve;uI+>͕_r]j+VUeܚ>c.Z פ{+@e_`Wdߙb_#ܰEJ'bm#ˏ?碁p*n_zHuZ0a-&TڟCSbyzO.U>ܿ{.:sG8(R7JU*L-(43@:-KN]X.uI%KM.~,3TJt9؉qf_YOK\;ZɒȊaVIPjȝJZXRسYCdNޑ%S 1c`b3R`Gq!+#U& ȁI$M֢I$`J#'?<_/3l]SO.xPɍqq![)Rہ8 ٬K:~[p_wy~#?9e3Cv荷[4Y捬ɑK^Go NeȃĺeQCSjܝXK1X9ڻ/X9 \0{IWd.u/wW&3FdeU*7( :r WJ.îv]a"B![Xf ]QJYd)lp.M1p5&ۗ/l;O'~MKx<{4.ɶߓɶdߓ-6? sò*h(W)MZ<눕@l\@:jl) W'-tqu7kuھ"lei+زx77[WA;2 X0,\]T[LuH1E+[pS#i`+D![/a`0u^b: l"`(ɜǔ =fXS)V}FC*U߬GXOҜ;_ ~7?7DŐD!7(>RM?UϊĊt+RҷIXU$_MyE~dԡH>y[zL4!_j4v}Pc\KFj}XT^A|q0zIV^ EHmE~*˫GkyxyU/JWI,/lZ^}y5/fz/`ꔦ7nN-ut }l4[/ lYnvڼp(2SCk޲gk(VtٚCk^ͫ;BRu5;˸IS/:%_S)'7) _'Ua]b-uXEA!^P/ dKwE:kq$^wv:NgO8_lT3d.Jbh^iT:Xs|7~vG^?4>PY?rjyV_qq\)qj/Z9oq,t78qʻ?AhAsyApƓdi;X![)Rہ+yǐl岩zؔ6U_6M՗Mæ2TmJئaS'6%/EPKr(""RDE +""C" ;]6Y)%H kO-4p)V\ D)f5Cb`?Xֳ ֌rj\ *G$P=\V\ɲLM=NIbn?!޺a4胢KdžٯT 7Ѫhy.̐_OuumtSr\׵ASv]oǩ< O v:"sEK(j1#ŤfƔT%Lu1>Ju DS{Vr[F 3ڻF'*xrפQ~dH.vNj#I;tQ)Wy |8S"E~0fTR u>WHuU:VQX*XcU_zx5UT:VQ'ier٩kvʉfiv4zN2N+f'ר e{~?WŜjmB:5^uV7~Hu~E7.~.0PuW\]6 DݍnqD>E+j&O<.ФCv("/EʡK9)܊4VDE'":}"'17DFڮODmȕ>N9QvԬ%~|GI[IϪa50,\XQLt=ߌOUuު]$N#v,uUE*bw}դ,AR ֺa5[Wo isUT ZbS+:ToUJ:X5/z^ scw2dNPG}ut\ +Zk&g|5Of8.ӫI=7̱ulDɖ=iYSEaQ9+߇x~$DZ<8VhL ANjVE>Jqlظ6:6:6[cVcVظ:6:6րLK>z* zB+Z7@ ßb.*B&ҍ9+oO{\;gXZ{[ǭVv}k|3֪y\5!xCnn,4>%(Ӭ>Ŋhh|)?a=/x/uK>i-K- +_K\Ţ3>tYuɈ.VlS2QKn\ԣM4i^B3v]LHOՎ22Lɳ4s3g05$ykuw;:!?|TQB5pj #&I%pu[\ fvb=៟EyXaaaݟşɟu}$aa>23Ci<;Try2-/Ƒ2TUL"CFGp4I/?{GXO7=zhMO۷R5֎dlzIe6=+wf yXp>n+ y෮#vsn:qWը[+|\"u.q׽mu+`taOX[Z,IP =7}/T⓽Iv,k[jD;n;V_!&0}3FH(.(Z9ao>r弌t1۽a1%[:b]|YX١욯`vi/&].A$5t "QzgRC KK/ "4XQjfrTvOE;, T0|Y'w&-GOŔmT("Ynq.mM)bqS)7XoSlnMb}pFkkk2BOu..R.^Ke_襋~颗.Et.zn]fy,4ܥpoZnv>7 Vns Yh5?~KwS_):7EoS:NZߦ8)x):7ŬIS$U,= B˙ Eg4(C3IZ3 J <#7cYsum_6.Μ,rM/H94 U-#ψl*^ᣑ.dL3"`A4Փd̔mGKgW` (n!?:&"P . OԾ 8џ~W{Ewo?_¯__~}¯?¯ N2GfWH}U8E{2m;F)u7<"^}qLWS4 `):lqJ-Op!o6sT#H/nhTnz.ʹ)Z(&.)ܪyAI/smi)(n /.2wTЂfEEe(OEE .bI;΃=zԍu{uA9]o<=?'K>yB=m:L NhKvZo <'վOhǦ)M1NS~-# ~~g  ~=9 ~-Z>(|1/S( +_-WcY~(Dߤ|uQ3'H-WݸCO׀>zn#֮Oţ%BtZ:yOی*.飅o7^˸ߦm hb֒ڶvnFM1 f[p(Փ?1[؂vM?z1['z|D"EE}ѺErk_$׾2/-\"}~bsS(7~bqSln6Xm )WvY T<"]0|E&  F0v+s\7?wѦ]ot*T,?(Jg2".W!r/$-?$=I~IZ^OzeuQ:r } 5/}Y/#euh)Bq2lf`p)6̚`T$!6 "l5 w0͠bO]|2R2J7|ہAy ;}ǿw|@v!hf8œK!fZ]փs PISTQ-AlˌR .N Q~PQ&L,9a:)R$ʫu'flEG}G}e>oI_Gʏml /ߏb?2ϬޅiGqi2x2٤gV%Bl`B|g!˸/]vnFkRC-)?34rݚo j0W<7lY~mt-#J͝x' 771KF"jie&zyc%݇/%p}2՝ Z{`Ց_ZDRkXM3 W J!١xGQ1yTwT4GxGQxTwTLG?_?~{?7paߧe  7J6r*n&$;tLz}Ec>Nz}y}^]+J M>z}=I'ͷ' I{|{4'ͷ' =i~4\{uQ6/^* |x͛>~ďA$a?ޅػP/“.T. ^X .˻p׻P/BY](ۻP0hKD ]fV5Tw~V?:,Jd.vX]>Rur9!3~Y]l.]P\]d.#\x pyG_<#\xχ?>Go5[!ɀN߷K.?H=ïF)|F=eCQ']')R!ų/N6udt·Q\-NE$u'# 1I~( 󂚩9~9oJ-5Ƿ[˸]|3M&^7&^7z&߾7r ]#ÝG#\x+p}Gzpfp#gG?¯](!$7Q_ޅXZgF{#uyfxڷӻP.BBb6Ƈߛ)֥E{4OqL-r~&?BFrf$t!۬>ʼ|J1#BRAβ8RI!BT#BnSIګF@BFx6*Dx5vgx=462n}kmn'a%{nS _5jUSޜ|*_mV0w Jyؚ_\^~MPzMPrMPNP9A5ALP4WLQx+F=vgDFA+1DhPCV";:|>gKnhֻ Qx}G'V >?L~6Hy4ov7#&<8TOo0ѸCY(?(TaOdmVևĽ+V}HܷB! 5_\ Qh_jKq^55!5ڗԠ>5X'j8`&'[C =@-:zQ=$ Qej 9ߌ" FQ'!L-TdG |dd.ha7azH5"(0T+ӂZN/"\髻`VCH@h$[# o)\Z͔o,ǀ&xA4_D ?V EV.eܤI)ԙm,0C*^.y^$x*rsAjxa&(AW0-•A# 8J,鼠_t;ʠlBU@Ivb{/ bOFv*t,^Lvp-O%k;府$͕x7_._"W..z\o]]j}` Nğǃèeg58m!ũХf9puWHK.@bK]ˁK.3j}Хe9p5(WHvOM|~ٶDٓ޵>F.fkҦL;LNCvOV|^"yLe]p] ºaG$o8ï؎WlmdyBY2ӳZ}jf|( k KYu$osN.^\eͿc_7ce- yFp.]črgH!a#`.͍re8ue/~te\v_үvWvW]W].OŞI&:#'i{-Brem~E|d"Ʒ[EeܤJ>q}}.TW59 (,lK1uȠCdq7#ڱy)|(54=&9 q<S"kʱ~<.ϓYq:vt7;#7m\\.(5d9݌T#68Ȓ.}f)..ە!Y]/7R38RZz>5+?J\GsKg\,v=ߣߞ+}}Q~{߸O:?"SArħ%5:(m8B)t#_.eNfGl[g7y;z / ^jhGX&c~XjB< Zψ W5-fj?PkVj"yJ[p?eX?ѓ&j/33&!o4שGXoR(!`4j+$Ķ-ڳ >J pߨRڗ}~g_< XSnp h<3e_wGK6mNyʸ/# Y0}3͟Y]`ŭ{Wm_֡g~BK>J#^Z^J&d M#U/+}Mh(54[J gۤTJB2/(=-3H KbRjO7 va,F:?ve}66@Q.X|.Z.tPp@^jR x 4<3 d.nMphlZy[>ukwrAk!,|#ki|i 0s:7@oLn п` m/uG $d#(; fُ̀?g >J#|[wE. z| ~8zXj]^GX A3Љ-q0@N6ic+`l^1[U$W~4 ?<_N x|s< CvYT=._nZVA /-{o>cP,|F GERRj>|>33ÏkafT->`!-wOq\*Ï aCRjؾc|]4tfl K!9e˲}KGaOeV %1׾J>#fnWB ]zJmofZJ%6 gx۝8w{8ީ+J@3щfnXo#<(<J9mefŪk`+bIeT`Rd)o\jH!xvXX6W2%J ĪR&Ǜvĩ RKe#&38568gRC3bL7V/blw8܄)KZ˥2n:?+?GXoosK?>#gG) ^XJ˥2鹁mf_!RG@Ju vi#Af) d#gb9L{u+FndS*ߔ$;矜ȉ)%ap);2iGVO= a~D+})<}_ }=!}Q~/_}ߒ 3ć ^*;)6>ەkkoQ}a+?O'B{8 =iF·@j|FHjj?`;}6/T#arz/tN+>l #R2[30C\zn- ^R5J^0FJeW~گM .OµkykRB?ʟF~wO/t2:Mv7|4/`I_WRH߸~{jFkkߨ~M]kq?+3«.v ?\w ;qٽ_ POkDBE{8 d=a0ao[y:@{R [^<9&#*yl]_rst>}qߟo'}sߟo_'^U}$+^PR Fg$K]s9B HeҺj!E?gD"(cedԀoL>0w6K H?7UvMT-j d]ԑzTYTM7UcTcȵ5QbO^)yZ\phpܰ͐\@Jl̳(y⵻"D7#ȹ~bn^ K MwR|;γ̷t<;|;ӹ̷,<;<2IX`Dwy;#y<]G%y _ /|a _>0|ew fuTs`vRHb>RXޟ43J7^ \-7Ãj@pR]v HZt3bFNXR;[UK1a.0;,At# $S>*Gwo#==G;h|)g#X#{4ot&Y}/Iouu~e_j vͣ3{ & u1)L|.4 y{Xy3O}48|y<‡E>,?$gO<<09b-J11+')azH=ԑTCX|>Օ+=+W*{T|TW>K>Qݞd(B&N,9DGc sM֌E ݣ}gQ҆ʾT=SLn+),!`ĭAC(W{\Q>T>R|\qE"|\㊼f nnu2|0w\yìf 7a={- Ll`>Lx˕tϜ_ Ç鞤T_S5*]S y,:5U皪 ]S-uQ5UDJJ'Y_yCV%J7lk|RYms; 70s$a%~)3^?: vcV#$=eai]5"4QjGpSL~:^0wΝVhl;[si11w7c܅]N{gD&b| M><)Ws| ~L>ۏ᷿!&/zb$PΥD鉸|FױWBm I{61S*jqм gn5*}~ڼg{f498!9|JiQRGR~d2S ~xi:|xi#wgpqHPN$Z(åD>~fNRjKk@O0!n9\=_t{З^| 8Rxmi B捕^ keq -H#ҢMDsn-4[0eovkbO||jB6ykwk ~熝\;=6(s3J7.E@r^?kJmyo6?p#ߢQV:z-6,,y4S@|҆h%2v7kN5gl.w[]sN9q͹9wJ Qb E7}~B٨pO]'g$1EE ~ @ __hGX Bj^;N}kq E{_(r_;N}j^;N~/8*?_󂯼_o?_ oiWW~'oiW-v߿Ov?|ƣfW1(PQ;aR-FtÅW6D ԀTpMՒMUopMՒJJoz~y~yy<ĩ;%=Z|mxd;4Q7>W[k_}\>κ}׷j_덕f̝͑1tCWf5c.Rߡng*Av gyr;iuaq$caqp^ lBGi3bzÏ̌W"sj:|\zG&ٖw:|d-)5}kYpQԀאjD_Q׍ߢkNyvKn@_z7/QpKr-7{һA8^ٸX W/ _f¯ _~781znp&cg]A|ҍ\x.["ηw[v)2kQ־RJ?Sk_w}kQJ_w~c>}^z~{7O{z ~c~? ow.#/Wv.a˼DԀog|ݟ,[ ~mNV?ڟ\µ?\k?|k_'_~z_?_ ]GŸ??/W^tn ϬQ?/η+dzӭYM>zÿk_~[c ׾/}k_G7!'lPaHWn)jD0a[ːjD(54#|ſևv*T,?(ԼN*Ñ8o\QFg$e}˼tKE.]&r.tf=?=q%^Ɲ|2|\|}Ϩeg//΃Ioqdۑ]/tѓT1l?fDQz`:=xԒٱv 4.[J T^2=']]nt g"^P o/3wꦷGve)2np~b#a  6ގHcUi_wF Bfx ̖R\[v`znApa,}bl7=_.5?LtmD묥Toq i=J7 Hrb};"N+J;7$Ԁ?-NbO Z)R!gw('~xC$dR|#ɾti‡me]]o/O|krJK{miUܝPd w~17j .Bv^P={RcdL]rǷGh˸IQ+0@,@_N*+n)xeC}gwΏ\6"(5eR*0m!q0׼^Ɗҍ$`jTaNAtz-v.Y6?MlӶd۩@<\}7s~'5dOBIMRChhZ/GqVA x>i{(޾kn "%a}.7{'#jJ>OuE$}>wmGXowzEҫۃ=HA=Hz< S*W/R;J7­`:JyNH$"5J'n^&hYSo(7n)OXnoJ>&hPgM/AqAu鰾tXCuC.qѬvC.,3d3ģl#v֡:Ș)_SV},ޡnLY,cgєUyʪSV{w w w ف;;@@fH{w w w {ҾFEaTkTFEQѮQdTr\MM%zSsMa,jcN6u43%5Gk@k@k@w@4D{x@?/a{ #s;u7Ғ|>:UP_Uu(n`Xn&Y8/Ȃôa^`/?9wKn$ꑼ?6wX9ӻK5"4Qj[9J|^OA7io;>2R pD{T_o/ik3|/5AOh\h^h|uvuquvq'o'܉w݉%:a~ x@?a|x7 .6o#J7Q\j?ڃo)5Xu(6EZtfl\jz6V~BhZlRj?=\kh6t#j׾K =D{0Qjhj~J vc6,)ي;Jn .5LnC(xxeCO7|։b7f9|n ~5gE[)E@v#g* ]˦Gߡy*]}w9RrբO7#|[mi/_F0VqηN ÷)O{F\w~ڣX ;Wah%%,X'䃟G>nG_K 5\Zr-o6:^mdRU=--_=ZVǭѮ O>zbW+O Ti5qTXڿfgN3O̳ <̳3fUhy:<3s4\mOkWR~j(7U|z| H-8`3^m >J\A4g#XF-֬PA#7 Ƶ?$>4;j ; ~˦j׾5H>zߒe:l`8΁D+}Hs ;6BmRv˃)K9S*_ XhNϥ9S?mb} nk3v4#&5vvDbpGX q[ql6:_B/ ~ғS6r'ѭ9l #j3J #U79d·=J.'5R+J R9:#8Nma}_,ƇJ tPC^;}xCrA!#H>JсLdǹ1ccs`aψ8BixG &LcGJuNcwQ0m푰GF|G ԥ:|Ke׀)g:TV'B3 |prdOe p F0|:nu25 _t%dJ}=_y:hޗ|L7ta{@ Q~P/Ok`5PuY1["|"/}ZuRATazlig&C԰UbcMwgđJw`)b|7QRV32|l _ωgGEՌ.m( n~ f{CGiE*7VUhcl DQzv4ԥ|d۱9t^'#J;snԀo;Z[B`-/|0lRcgû>-6/D>Jn8#E}|fڞ0|/=FKgđwl_Iʤw#7x~?x?__?~7??Z@qïTɷY*/ //X=o>Nf6nOزX(A|q=~gg=Kgt{ĩ{Nwm>wϲyN{"7G9#J7Q]*I#io#gJ `;K;ǁgnOZ0\=|}H5"(툒R2ǚ˜klod:~ C-;U>~trp vҎ5lWJ% fC7{=qK3D vv Edwɉ*!牢fJT3uyl(Ww:lnuV^zեE^ǐI]~#Q~T~T)r?cL mXr G04.8fupZh9wRC>z}EtaoئE*DAf4͑ل| "^}7(=,nj AkzS>#V{S`MA''{Jx,k,w,{0XhXh4h\p0x,4 Ƃ^7fE }q|qh wpeP]5:Wַ ;CaJ-;yßUN=7OvŸ^)5x?x?l(ɗB$-7ۣTz׾dUA ˢ'#>JN mqSܵ lJ0D\zc%,1DCl]@K 瀥|ݟF{ y;r瑷,<G#ywy;r#V9ܖ9v-J;,RRj?' z3K f<3 <*fy-Ț"_l= k\,H%34S iJeQPS t~HSK%+!uS,|p|#aHdH:^ tN f~ :-_o%م'f%^}q.G%>yuByA^-z4ZH6"Qz09C1:"Jyv*x",qK #_WtyfD#7u )!JcT  _cL$"e⦦q x +"Qpmv_)Keao!FH5&a}ky2jr׷k־Qww|#\~#E#XCZ/0ևqwJ+6אj׾?&aO>6u>&~|FL>6|65@ݳ+?ƶ]g[s|F<*!>L5wjW#910~S\{:20*6{=/C}kVty .g@iΧH"#b=F"R;J gM#fF*㽽}xߓψ͏ƍmUB &a%F=|s.E_{T8w_إ޿KE_Kɉ(54a)LU?dpfw7GJ:˾f|9W?{Xf]E*DڳƉ&dC/48RQHWNU=r:-FN#|*H|ك#𧿿#7ץOY4ć]$m7!e)鉧1r)־=uI>z? wE?jSS{—tگB_*o] Ew=,Zvj%#:O"$slx<-J M(%|kſ4 p-PBgT;PB=A=kb Fc)cw' :rYf7MFND +\(Do67(GX =<6(h2PV\OV|G8!3e,.2K}*{q1{fB-ͨX鲤XA SR!H/x2_@I߼#zo>!pEO#Xyc? \<3 b k|{P}xfIq>F9|ʲ肈c||D8*GXo8n<c[}7ǍƱEQ)ǃqqܾqM5k6mlP7+tٴ}ͦfS;n̦gƳi3H+ъ?NF^'->_;%7)($ʁkyBIZDVAF">&cK%%tx yJJK ԲuDCliqߛ&ڛA vMKqߛ&ak@ \ΙTOt9ZZ6._ΙH FX=rIw7]ks ;aȞwQL:9۞whz:OگnZyӾY;$a%wG\Mw;]aoWAz8đũeg}Րjњ|d~gdbo녿0 1_ 03ܕmwxY >JXg7YʕRw7V/0`?(q̓`z8FyrC ӤM1A*Ioz逷OC)h~(s Z># 5Xuߟ[\mG" Fi +?ؕ:ώ`t "K*"jtԀnCq5ڎ#H=G 4#_~kRwH1s_ ]$Jψ(f68KJ`M%g* ]CWߡy*]}#*R[־F+Dk~|GWB AԛFǙr>5 |j#/ *9{8E*DZ63dV߇7 l*ķQ\-VMpܶ*E7#Sm WfEܶ= fKMά*X"I"dDQHC P~T#҃ 0|YvHc)p.m^aN!}&,e 'Jkoc'CKuaK="\-Ib;UN"Q\qTI6ՌJ&Rf=bFS8_,c8^y)KY_QjhՔ/?1# |;i?}݁'.dwP|7E?hWm#W:gzxC>|ŐjDQjhWהgFewMY'RT[BI۾̦&a}Lto'//;/纱|yq*O=q*b|ȱ㘪 VQ͔SVMmJoDW!Ok<hf#_N!Oyj_j_>3gfxŸ3h3cmn>s _gf(P?Ǿa?7~;,<|f >,Qx-x%"o cH_R`|-׭·؉ }%" } 6CؐjDoQjćnK Wu5G%v'<3oe^KR~7gNpEZ@0W-yfC߉Ha >Ju]fy:OI_`]bZ bXxTbhy_1^1VE`úb(bhy^1#Kbv3W֨}]֦G|6ӽ{K 5plz牢&~Jp@g3}8W1yǹ8O)];qʵ_>l\̓ {3kQO1W&G*WWJtgєykpy |mN 5/?~ e0N ߷o M#^M{G/lCv S\j(av|{y+ H/yoK qsإڎm~5l'R %k9t^|{Q r`(sCB e8~xKT(m<>fbqhY,j3fn{^x F^:gЖR>ԥ9u.Ȫ˩Paf~TᷘuCrVOᷘ`r>LjXDE:>t7;zf8j,_SvQ6?Vd.\úؓMx7ql,7 B64ȳ w<띹j@M라zg*;>z'zq4E?t9-"f "K(Ԁq<VÇM 4ōZJe%`g0i`Ĭs YZFÏ- _30QU4( UsU>/pi)_~FʳQ"g#䚍k6k6&gmzF's[= WW|pTN ˥\vH5"Qjh$HB.f/[|-# d?yx^<;;yyx<;y~g %@zvwjz Cnzŝ ĥ| 6*=sw =Vɯ'a%旙vf's= {8OR9RQ3Oz;ƞ|_XZ𻝈]W?n(u,.߻Y_zނj%Xǵ_kXo>BQ~ ftvx7zǻ̠̂n`ox7GX~ſt_ڎ~|?wyw!۵؈TKOǧoylM\XtǶOЁ2m u27B@ҁP6RjVyRd1ӿ w< %nFwg0ZmCD~3:R*c5ZHzd78c]-J \KeX9:؏u(0?֑Rѕ,@YfgnKJ^K\ |d9^wH݃֊ҁL)5 s~~,PDQzOv2K5?Tw#9^"wX'*a,x߹_fGH $ؽk sV^k\ŭ&v9ZO#WoG쎑|؀bHf7>r7;' ×RXHwqc'9}'ӹeҩtj`Ch=Rj_~Xn3%JۈL]j >7#SYfH#__[#|e+/Xdyvc#',l9By4J)z<[KusfXdy,Q8\g~asğ$jvy#UFK%1א7{mgVo~{~~s5\)YǂyAu>*ookN"=ˁ xХ?~3v;f8t]H%M>#.3F` D~3~33+?wzBO:6 R=9R бzD7V_\µ\kzk_}4X>>\/ _R-ْGv*=ޏq8r7w Ƚ,VY`INV;biRmRA(n%߳hYt,گY7E΢E̢,Yt,uYtz$wl @5>oAsm߯>Ķ}>ض?sm?(6<3+|y7|.lA.ԼcZ[UxOVIB <5I$1ٻ9oIj]ZلPE} @Q(o@},}8&AZ[6`iX2$*[jּeܥghR~{iwv~o_]{iw9׵4 iGh- 摦O\ѐO ~~ߵ]{j~޷?}w2,Qםf'v>ȶkLiKMg2M:u)?8X_ A#AΣLq>m;#-RF ~G}ձ \qroz?:]݆!Bހ79Mq}KUAm{=&"BG"1 .N~3 5lig+Db|P-eK-;Q [?4xf3O`+6Q,Jy}{>Z[s,+\.V!`=#^\mT*u?{# U?7mCr|N7`ORۡJSM$.LIn7?nSZqnzvhPn/jUͿͿ'5rU/jm᷏̿75rV/j6mMͿ̜S?Ob9ӊxV,l'mDD{[K MdX2ݵ0Q٠ mD::ٮ˲*qPuǴaF ר%۵=KDvxbf*n>b Ӗ/|$~}>?Ȯ9<Ï9% 'm[Ҹ-% q[PKjI㲤ԒZx[ޏc?cFx;Œ1#r:B#А9TGXGIaFuߎ053Pd Pjk'B:Rϡ23Pr E=C!C((:rdPc(1Cq{;a8&gOE}/ CJ&~O%4(TjTo`n^ߢ'^*]TEv^. ]cu[ *Z1QF.d.c+6ceۉ۵(EvR :|\q=I|kLʜʉuOvt*Q{suy:8 s(ΝQ);% !eCBdDT(Z[E~6DzRf=~'X?3eY_\@iFEz!o٠\ہxrmoc;`ʱЎhv@9k;v@D,^OEUymd6?!z0GbI%'Eݼ.B4VĵiKu?-ye' Zzα@ JfFAI:o\労\ƫEN ~x>\O˻9q^@rm-Ujj?ZyӉU˩sQnԃ5S"N8S\mROnԹSvgT>>j;EG1>>3Q5Np3*3*#!oUv^bLl ףXHDK*`gM,fT|Ƥ/Z?3t BbLQ@iFD|&b[X1uX ЌrEngiq1Yd.P$NjctũqN=ĩGrj\08xnQq^N],wX\3+EuH>)`Sniv9< j#$Saq.GrS!pςP8B /Gxi4~,,S̝1%*X{[kTk${]҇7E%;D/d "r.?Hn5|419FT+yʞ˞$BLE+%bd^-`\>)X5d]ujI.xu5D_Ve5K;JY*nѥtitiѥ..7CօY֥bsABV\) ooo6]&6Zؼw@?;Zŭ*eF0DCӎT~nX].%[RHfX/";o7ۉ+{"J}us#EOn-h^b!JX% /I/xoz:E|2FW$5shY[G"yDD/@8BR<"عX|Բ:HQl(רI).3C1ƕpه.>tIV[m+IѨCdaeL\|Ĉ #OȰ u)S}|>!}>|>~'>\>L~a>uQ;V˜&Gq"!z-򑈾zǃ1McK!욥u ֿ ~ ;w֣qIO|Doo-UuN(🀑fHtOMʒK!h<aR~'T5|ORj<6Ɠxmz_=S?ߙ3H kTpcW.ha )K IKQ^5ev)5HN˚.HGCo'bv]Kv2]Kz]KvR]Kq]_:ϱ@dj@4t>J cK!XkeIb-UCяPPc(15v E <C=RvCpxIwqhǫ"0a|m(p x4 @ \d_M[k yo4+€gis:o-Uw cCwVk00#w&C~r(8cr|uBϿ?FϿ^cU>HϿ9ܟ#_ o]ĈB#"%i.O@6(%v"vbD뒎r4iV0b05[[2kӉ]N9 lRN{(҇Ht Ez E07CH砺*Obfڔ9= #w)<x*17/ ~ku6?NC|t˲#l!\KOm !ꎰ"sTZ0;S#cR˾ј1mtmKuk'dHgoj"$g'w>KG)Zv"vm  3m䨌g+hSA ]*߬c|N_':M_DkJ5P!>^GEd' ey V3o@t~LHʡ3o KTog^RXc( ,BUH޾zM%IX4 B԰j)BǸ@"v.Q%I]K%DR(KTu.Q.~?!~'a 𳅑JBg8H׃ 0RdQ0ҡKO(=Ym:U2N H?YNo @q υn2s':u)^Bx/lľpn[ßwO]{jϻ~ޟW#ޟ ?~??~M/דuLawM_DkJ5*K|2?Qye97=f&]ߔZL]ĠZ߬'{}3u}S|㺤M^ꂂ{BZT$(S Ңήz|$TWbZ]uK-#1CS펦Z VR@+Hx^dpd8/cJs]R97kT z'X1 >~ g=Az&1t^H*(Qۊ7^N'aXɉͺeEWq\Cq(E"}9P$(/ EPoE"P|Eԡ:Cu(=E"PPϛǡCMwa_~ Ѥ*j& \*_,Wt|~{?}_ג:ubH kT "s*o惘[+G3XWc-D>A]VҥQ@kLiQ0('Q`k:*mDUۈQU#U5FTo#jjDURv ݅+ ݅D8\)wwJBww'X1~C#=7|ٙsn:|$:#ʚtK,O |o C'!-h*xlA|nIcOU2K%/h6`&*l67 ?| zgq'FB{[|/wR_n$k?_?xQ2bi$Vϛ}KuT~W~S?~W j<]gxOWt5oj<] wd"pQb !-D\dG}+>^ɋԴK?ZY*eosg`2HhG"`Z<زiK L OcZfNP-I UkT3{v&d}͏S^}ZaIG#tu0nG]aY a#_9¬"7 ~2H(|~wIUK[{tA|k-a~a%a\y\"LTKK[\"%¾놏3\:.h_x,_ֶSdR >Q}K*_dt8ḇ "VK3V5pZG"yz8>,aK V3TrZVaB|iJgkm/Gy7ޭ*жԴ;kn{8b=<خukUzns׭v&;/EB97z~VۯjmMm׷~۽/Q^~m*Tz~㊇Tymzm=Er/dA hf|A__IU j}A ] FALihJ'ù:HZG?d h-5?3]|UbXzђPh,ipZR>?:-i0d|uß+=G Cf57 ?'|$/H8@~GHhl8Z$ >LÅ2Td{yd g1OޏY{?^~ޏwGY{?j_O7%~R醟>O ?/??/߁nzrt+(u.XYP?(7QM/֓bo%;# V55YP{(E֡PdC:Y"j(~~(r/_/kY_nY_nEg_nM_nE_UG!{PZ?[+J6 ߷PUضԴSF?ΧX~{j7z~ޯM{jw?/|߿ۗGM~~)|_~|>V`#J>ZG"nxViZ'!MS'w7M{߽?~ezǸE%: bLv>Ws`KWVxbe?{hw1g`YyV>rV:@Ud*wdu BmYt>z?*; O~VuVUuw_gS*搳9g5>q``f'[W[,t?Z+W[,*qh9)Qx+ЀO o᳸oLB{:|${o B[kc5k/-U]^ e ߏrH)ßVVjʊ L @.&#bBAg_b.濏|?kbv♕g?Y ;r?եp[ q'V΋Ly֙dJgk}: dAgi԰!?U;ΧXOu'cƒZ}\U X"|$a>#;_$Lx @d]f/Jmߤ*궿j#-߽|bD~[zR0+ ?HH\8+Y,h0\.Sc Χp F cwg>7S%w* #Qwtzov{㝖U҉%0=|$nr}8_p[38 |ńVF ܼFE̺'iD B՘9lVtP+1'|$gzHp㘋r*Ϭ-TR.̽|˛,o@n^P:!s \8,^R]܃ܦ18\|֝); .2&qyK-,::b=ϱiD9QDY7/(f Ap !1vKVTa}]=" 0`2E| _>H%dɴ:b,`jfTxkcOI~cݓ%jM / AZW~×T{+x J ɴGX:E8j8=e5 "Sd.jɌOqK+mTV+[U2a+U"%*X;PQAu,ՒEt D ki9ãQϐ( xZ7Wo'a n:ˮ @U-/Ҡs'J>(VE yK]h`熵XOKiI'e#ĽjROGݪ~O uBUŏWdNH?}9xPk-5ksW%:b=7Z|XG:Zԗ-5ٶ֣)SL Q+ߐ">Z |Kjje2vԽnsw>OKOK?°w&֓bs=Z0Ay; D;xdZ.|ܼCJ*vj1i)R?!z0G")b㖺`lDS~ZQ<ȜQӶPAv֟EVXEMWl5dDom z_6|aVǿvcH! vZ+[kذ([:Ct=S {!$CCNy!>:0|$kˊy%Gj>z?{+-U{Wb/z_kާ6z>aDJfoާ-U_SzҬSTSi:xOOק_Si֩4EJS|OqJ3G(#8B!}#$ut;BGGHe紐O{?i__ |~|~m7z~VۯjmMm׷׻~ޯwg_ޯY{޽ߴ~}>#Tl$~ȺP.8_ududzr>*9f46\TTP;HDMvTZ"-U¯(6iσُ}&MhGb2K/چ=n/z>[ ķ~b2'|c9Ws2^>D=u\}zYԠ{ʍ|Agxϸgt5qOi33oK# ~ ~?~SYȚ|?g?&뺷|ΝOn9\y{ڵ!߃~W#z-Qz?^~M>9O{ykA3ddky?sx;בgԶbUz͂r*_uxz,ˡx3);|M{t.-o"`75bLo7bF>t5Z#ƍ.872fլeV{L1xUIs2^*YE56t;uR.rթ:u:SרNn.I:5%{P5aK)`@iF5OTgOm(Qۉ㩳>B24ɛ@WuC-C4v P0P(;bpr8uéYé˩p ηSguNoNY:Nթ:uSguv{-ƒҿ`I7TmI+t857R.bX5*kKGh 7 RԺۛp]ʵD=.=/.=<ҳYzr-={gML$/KZe陋,=sy-=sYCuEQ(?Y1[ruT\auin./]^2^OR[ԥ=KKZ}UqG_yY);mɮ{]=[UVVUgzVUgUgU٪gzAUjU/_PUU *T~AU/?Y( ~X+/RM"yuPI8@>4S>O~~)vo_o7~ } FlYO/j[>ھnV_¯o_ٔ{su{~#|$$iVsQ٤O)Gi9YOT[߆1mR?(7QEs:4gF+dG=Y7kY' $sfnvb%QUo'5țޒd7=p\~ƱzC=VX=zk0C?Vu֒l\sK{ Ѭ0G"jűf1o |F/ \魍}cXaV7fj1MBb |kK [GȚ=8_5\H-99z8 ^yx|yJ b a{=LuZ+VT1LOsTђ6b@XR>"϶#  6kw7+mBG^fb:˝;k([hdSgS@~ H}3?| }<,Oq>*mE_wb̿(j6"tw/uw563ʾS0q'=7I ר3I@M労\34u!^hAif_+ n؟sxԮ|͓w/k;BC>z×`>c1K0n2cl%Txkc3-#M^@ Y@ۧ>JrGHTyU!_SI|k){k?~wAHGRд5y݋1ä |p>噼%MfÉUW!P-Qv|2dj .GV I Y 3 z89·Vb/lIwk}:/cƄ-5-7gČ *L 0uusFx yj)FfXgS r&-Ut]&ʲMGޱKjoM-h]-[GFX_G֯ g>A+ȅ(qt? HMs2ߌIRA8B4ډUM#'H透T{3o唚6)hߠUO +Ms#}vu ~VKuK[PX޽Io"߾)*Dooːרo#q;^-\7[tAZ&g.̂( -0Dח\@RG=^[KnPih4ԯiGNNCLC8i.NC]K7} } %0%ЛJT^nMr ܊ȁҊ7"A?1m[j֍qmKEv|6ֵOk@򑨻x=;>H&ߩhImKue~22K ?G͵)FfI1zxY\T?{+xj w n"?Gv`k9 ~ A3d%iy ,o)\~@qΉ,6 jo?0;%c']5-~[)D t N1˅g+DݡGxP2X׸▚2h 4-~O?짾S~m?U~OUoSu:kE矪O*÷z?]矪O}?Hێe IpJ~; 5z_;#_ba4l3?n)VvG* `hUk @#wOy B{ZR|v} <]FBᣕG@x *v)0km\É~SjmMm~Sooot^O=&O'OɧݓɧޓORB~2Su]}7K*Q=Y䁵;If[zg8>rK6)9?v8ζг6gΑ0.$r9<,QK8`rx_K!s9]rr2B*^(E )F>mw^(R-^ڬ L= ||[OEO"2J4UܼF;xb˞:;ndEօS YH?Fyf.FJsL1] %]D TR&[co7 4sXdS%b\WF4".q͝)VV&)'LʴcfVrʃr?(7Qe|eFlN\َ(]`̢%v)L>RN$gB}&Nhv`&5h;^wȧXOxQݹ3Ջo9.*,XZR!GS߰{QTEa];N%u8cQD٩O:ԨQ;_qF7d#b$>DرE|Yc]*NCw>źᏵM%tc*(FzG ?I5iwcnK;/1Z)V=!4Xr7fE+JG"J\K[jػwS ]c PI(h| U#|zfZw8 nI<J*(Qyn ۵x {xƖ Jv"17D2D4X -p=&@o2Tp \歀zl$ 4?0eJædRNHyK-dk-|b?+dvL@ʽi8%=+}YI]AEF%jP p>{jP}@$t>PI(|,T!P:lJ5*P|,'3-(l}Ә$R'`:5&G߬cTeL,t •j<h[)XTookv%+' y˓1>w.k01&-U4MYM[)RKVMG7uB|F˴[cXdtlߒUJ؄ul}:UNXe| !qߎFǖ*WAPOC&lC/R>)vXDd}ؼne.5P:& ף[k[sH]-1k770s{)XOI# :2TKySvs5dRr 6ff gAV[W%*6BiFmwxfDK[6(Qہ˓:KZg0bem˚Μ7Qǂs=IV8`sɖ5'sE xʈsyF.`ݼFߞd=Qq,YDz-uT\|=Vg%> aNޒQK>xרԥ&sr]n'./9E"o_Oo{n`P PK5* |2 u%-"[t+FTy]I2 уI>ɳFAտ]*Z&R~gď`b+$~~w>0)AB^Ro:b=w`o7m˃M1VIU͒N ڶt>z_>K`/3;bx2e9Mv(faO. VP Uz_ 19\ծ\*V1TDA!NB{?}'̇ :b~f n\[eKM~V:T_=&N R q=lROi4.ɛΧXSxG1\ۛHj=kpZ::%S$S|R v{g |ztZ?t"/G2!;#L冂a:a:OәΧXOyE+a;yB8z?\sjt ~3|40\̆+`CG _`E6  e|kL1O |d&_GL:ux~qv>KrF]*?nt>zUbOzv-Iѳ#1 - zf:voQ4OKei&J@O*g^Ya 5 {}O jg; |ܟEL\Gx+& ?=HԽ4H,$DqU [j eI)<8q3LLfCO|YG\7čR<=hcD{?"P'nk#1AL@w ~cYNI$ZS;+V֑k%~rc9|ΧX>j) ` Q 3r (GbhEY+@VRA8DzX>>!jڼKL2b@#t/XΗmG{kFl)4 $ gEu>ch.sKqg|,bjr?2hs= 1ce?65]dUfG]m2*h쟇kFެ總7Y{U79n:}F ~~~>u q| gL\kTڱ.|2hnp܌  ~\ /?-p1n.?F=q )7h0TQM \5⢲?p0V~D[!v vEa ȴ:x@zo {?@ dՠ[U|kE^T  <(p +5:>+5Ryip}7FSluĭ:=%T-xnR:?ڹjf״:|$Ս}6X(Wz{[5רNjOGA\dtD].Wօe9,²² ˦ ˢ y/,.,.,{aƭZ 4IK G j0ۛxs <՛S7˛(,;X=! 1 v$42~w>uAue{m[jExɦ|U௹6[uEI Oޚ֦c3&f +mIgݪTTKq_oŖz!Ew|$یKԴ6?ΧXXG'*?qlY0rnOO5w=1zKQyGK"7eȅE##Iݎ|[: VtlO>?߾e䭻NeÂ%Wb3(}U"+҅dcղF5J@ShuS4\ ZQ d І\-5 u5&ojB]M&ՄPMh u56~?]矩O矦OOgugA~WCP] ~ (>|wD='R(QOm``}J \\A7eQ^vs,bkk8ߣ.{مb?JȂ>h?)0(@GƵkKlllD-n~JW ?LW$߃~Jwgkeﷻޔ.E1}ޙ.IGޔn-5޺c}}0TcaD3;qpºz,Z _ccY=J, =MXK<,b)ֿVydq [ [p[:"#sʥpZVU{:ṣ_γS̣_Ω3~9ת3O}<5~C#CvU~~yy>N Saϲԍ =ٱdFͩEׁO%1X媬[\ɪOKD!$rVu$##5OV>Ux7W]SW]C)t^uWÊt5w=<_]+i"uY<Ӻ0pt:A޺rHeGs#$LXVPI~ßv ?ߝ၇FR>w8b🍰c<~p~Jc d33 Y}ksFΧpEȚ1?- xhi0nL?R ,CRVjҷT`I<}_mg0Y"yG$ǃfWAq N RߝO>\Y|iŇ3чc|8&zpI|#52|r.cJ&𓷮\#v ^<(>辥]V)>ٷT_+g'v}rчn%*x{^kTǐ|]o%;IdG}E~¾ I"/ PCU> ^"oتc@e7QM_uV7ٔf2} #_v]}Q/ Vލr]nUbO%X$&X k*S.!-{zR]XkT |.D0 B4a ME(laLcG,@h,Z# ahr>EF΢Z|Uq #}$t@G8AYx*I(븉/Gbx d%K>PO0< >G*a<1Jsw2Tl9BNz* q\)T:h)ygA2CQ$>[ ~IN}*S\)3>5*g?W€L}W4Jx*;O<5$Փ_6X+[Q(z^ezQBE]h>k:0-p<8Ȣ.(?`9Fc畨t vM e+On &j)MT1]U)`yՍ"Q}7jm٠Dk7\ڦv]ֆLfіX5?v DG '"hϥp  O7%~R醟>O ?~UM~VU~UY~SU_:A8%qF e/kԍOEO)5y3 U?qC8{pN {|JcRc)5WRs\eJEV)˔:LT?EON~Q 5jɜV,R%]aV`"jߨ\Q-5KA5ơx1Tc|Tcj̗SHPcPcԘFW5O>a5`Xn@<uD)j,<,G`Y#8_I8dD>z_zQϴ? [%QtHedT"/oFtg;7S}Wh E9qJ{y̿A+YT (&Z4sAl%F?!ցC uO7ږ@B{2ʕ=#ڶ@qٮ#1"ܧjt3X5ɷ {<==5 cIu%puz8_㰞Iς),a;%W&l ev̤T|I Fw \jDƐ"f\/$\@0T??^ U=?AkT[YlPHv^v]zEGkzȗ7=f/Gz8nj-\c1@Gl+u$߬Y`U (FSܽ_~{?ir~O_˻*Чnٳ;vS}4^ʞ$c8|Dv i(>o??o߃?r;K{`JfknQ*<aRk;bA39ڏvlW?.+Qp J #%>n_ֺ =(Ԓ}%ïJ4S*lRQEcRBc?!530?I1;'*e'k>nwۏQ)1q~o[fm}aR %8_e H;D>z×Y芭%Ebbbm芭NEbkb+b+UqhǩE]1iǬE]1kǤE]qjǡE_onž7l_Do_(T؟ [:SeEݐv[<-\:BuoG-#:BTGoGH%%.K>XR-)%IAJH=-%%j〟qy |^F,`HDM[4ۢ}/d+l[TMkeor&Z 66/sldkqoA ֊n{>t Uٷ溄3g8jXӉ ZyB uK=NZV:;-I5Ir:mROK\&JZ#C_θ;jIGXb=%Mhzonj%3uƛGlSv: #pavZwYpGw]aWf{Gw#p}^\% %95 8v׮kWpzN/I N/qӋ+8^,am7~OF$yrY>B:/ hx$˩">AJ^Mf~;+S"7Bp'Ypvp&v3N6L6_{|3|;|edd7/l>V'!MN^`V7luV[lmTlua[V NC1Pk(( Pp JCi(8 1,`k-lvNdKB-9 lvs-NX>}F}ƾgl|32||<^4&II4i$M/MI8ixiJ4&&b _\oWo9-eE?͐Z !/!2Z O0Kh,KQvy(ւ]QwG`UZkHN*S3oi, Weio48-#^oO2^:9' 8f#dxjlh77^#E/?_zE/pNڂӶ%N+. w>m/?8m/"d#s qn|* .Iic:%>Xz \.QViZ~t^:&Q5L8X\WTPS}Fpů1^IgI4v $oee@$j:Wi8e O+4 &qS'Ui-I oB_vڧ@7\Zq'Yݬqf} * ߬f=?y9l ͽb:$~&vUkOrw[Mvhvr9ci ګ .gx&= >FM&,4NϤI+uNWgۓR+mbW@< zuzo^:wB (oVxW-a!{YqoW ";ﰒOCv`w!~+ >ׯ^QjdKllJKM=`_~Z"t5kmX7V';\x?YÐ W$`?@ j*.CY)%E8kwOb;'6|.CDA:,ZsX*iTʂ`Y,>-1"XF,u^r,C /CRHgHPD(K]έґ^m8tkj̹?<6&[qT,{M1'܃I"iHͤ)-6O",r:|s`97N]5k7sU\܌×xatODsgUxN+:hj]zK(UU_>isӪ2iK[v+Q ۘm|gWB#`Flr\aS4>n^NXq ›%UdZ:{$S:Ҍu \x\^^ES\1@aH}k+'[y/i1,`ї[fp .>kɁ¿tK1zj:P'ɚޜ7Hq k,ۧ3{!dT}N,er<%H(HO߃NP}i&MqX58hv:ĚT?wHJH[rv݇8i 3\k ]zL:ԨNՂ:+TN:U ԨNuЩ]QvB$B9~8f6ݨ!D$\AūO vVv: KZ)J:nҷS-T{TCucK(TK:վ)ԃ,/]nMUi5ђ#Rh SY[ڄd#𳜿t+2,k@mĤq*K %.!z\v&YV_]X#PF^e[ndwZ(^h$s#TQyx3VhG׆Ѽm6+e'm;Wil O+^V/ڒmXM*eLԖd-IݜۥljPeA%*ԠA@'A{Qde)B1s6\ё>y~ 5y\ U4l.\8`qLxXÞ(8LV qA1 L `L'FyibbY ~j*s94;q bKiSynsqnm686ܦ>IYZG-aJ]=#ϒɳw<1/tNXgq?99TjS|w ųO\􃭕4)A&Y˺dݎd˺뗬vԦhe떓uѺۺha H\ʈbElP\~gН r٘b:giz%ȗ][[[@sW˜y{|R.7\,#V\%YKdy_؊+wO+V\ sjٺM zIj BX߮sH ov 3g?n ?nᯌ^ir4krZ$ 'ɽɽqr/6q*$1ӨvŐa \iih3JbKh$e,0AZAd&Dd nd 2Y "Yh "i$jⱴwD1y=6>ٵv: _Ν NBp۞iNrt蔢YmܶsFJZ2 c%ҷR/K l!\_:#m&z9F%Jz9F(9FNݎ6Q81rCj'NXLSIY}=%\[:o6+UZsGZsgZskͥ;ҚzZsgZs6NO>b]qAHІ{`4>Zm%)G?>⌥2*i/kpuZ[Xi "mK'YHkA?kο.Ik֫hpjpKe~,;=7,҆{iX5X=4^Evbዊ8eZ]HN"x?IҞnW/] 9hY.o"4@ 5PB@'AFBIhf\0О1g"4b6PivEu:p4űGTipe m佧Iwu1ɒUZQ:'b[CO,k~K[ N/U m]SxK ~ť wE"sJcp(lCtt7+bX,p7Ru:Ě5iE:Bx&p˗6ZhŰɓ-9ci z㴴|5:-ie!lDoW*sR>;oT'shv /m|_oط Gǹ. Z/_r)NC:|_rw* / AbFJhйz^#\j1F%Lct\a^/\d^ ]e}eDdY/YYOdYI, DaJfQ1idN-h5+hYӪ!V/YlcbyCYiz/\lCظ:V+8dmm|*֫h&`C„HkKW`h,"?atϱJk›V9W$%1x3ԛArތ]"'y̛1I!̙qs ]ԬW0)] bԗ'b$F}Q~cCØ!cAѯ" b ba4B Z&ܗ, ݕ_ruX,౤~굤ש2&ԭ@s[6`| _xPah :"y'A\](^_$ RM,PQ֖]>L@^NzL#-CX^M\hq-i?Os*iN48ͳ=*س2 j(=+`ώzٳRv}J=eJÞmeϪѤA1 l]Fa1֧,}&HX=kp,-%?,ˁDlrDtHI`w" nWf[n&#gk Iؙ>Z.B~{y'Ak0vAkf4)5fv3&gvbf 0Dibcݭ2V[(*4 +y|^ JidV*U*q*qjJ{b\:RJ-Փ-ɖ-|w V2ٖdKm}‘mT2'E4J,6:֕ z#xHV,K{[& ƅ> d\( ƅ> d\( }1.,%_'-ާw4<ܡYAeo, D{%ȗ-r% ˕ZI :օ\* 9%Kޤ c[Y : i,c 1 #-!bBj:zb0nXb 1wUDV/034?9sRekO&Zna]s9W>|ʱ6@U (%nmuXi!nX4(U'xԬ*\k*FUp`2$L2 dIq0PB-D02 /$R}q__ ڝeHm4/ } }oᯏ_" $.ӗ#/|שhM5fWOnI.b* so~shMq,pؾTk;I^Cz,4&<4Εvp*F=B&!Ȓ$1N s%w2[|Zm;!F8EOx/kׁ "i ˴QodP_$:.Z.H~eJAv"q8ki dJh䘛;ץpE"COp!:kqu ݪAs[JAs֫hY|/K-eYeYee,TP*_ʲNey0qjf>(*ԇ˸7{&sH oZ|<'6B c/m-#M A&Ppۚ~I?ФMjI4}V𸇧J{*i4FApgJe%Ot= hI+9$IxygY46yv)³LY+}x'orUdN~ǓڪN~{C֜pM#y7D'!` b={xk'5>:=|Nӝ^{?|<e;eyxFSg$(gJ #6L#959bM ji}/\_V[y}e\_;pw^_5\oEFxG1n<9iKZfo.|]/ɹJ$^AbVWA4b' ;|r+*VБr">ibGigD*(:k,EgF /}ѵk0k3#‹.z_tgFczf4Ӝ3&HOs(=3Dؔ>`Zx^{;Mz z}+)Jf:`++ZWR+]_f:`Sz%E_/k҂5i\ֽ&M\I^IפuIpMZ5iG#%<7D'5/J إt cv:UMB:YWѰ%1O]9ϖ lJQuc HKwNe8,S+Zf!Y\ sisΥΥΥu;::\\"t.۹_׏o__Ly[>[]yT ҫh؎\_o>sB8MN;+toн )toB& {QKw}7O*c7}/gHi}Sa",*<4;bMw@q0oa U^Fo}wcXv*LUX c01V1V߱ hrJZk9i9Zi9Zrp9k9zB&c9ZroRE{[oS~[o1SE{[o)ނ`3{ៅ,*mmKk2 ۸k^Zhd! xҶݷ/m7zsKvz.e'{6ad64=a g~φ?@q_]x}[OM; T#C^vg@y.e8IcŁ\N* ߬{\~4ȒcnKvB ?mР^o jA֠?ˀd=R+2[dHdIdh enp4e ReֹSrh9n!N?KZe+g\FHq.y9K#KчaR9TW#u_F+IOFCe.#ut0RG*< MĵwlBZ- G4 nfHG,Y.[ĸ]]݋qnWbQ G]Rj5 vuk8/ ٫\,#`(Yf?}9giz% eie_ROeeqY,, \%~/K|f".h`m`0 NxY'oC|Pox-Ze3ZZ d]PZmHK˞.16a#yV7lqҥti޺ްް~{zz6^Θ1 7Kli# E ?~vxLl9pƌZf_+-QDqZ=DM#-ٽȪ0"D-\.A1n^%%aDպ  K6z5۫1^^;y5˫fRj*y5VjWc'H^WcgґΤxIq`y3iLdacW}Fz>} >'O_O{q(={Otyw^At&{MK$v{x'~{?:pAUef|&>ց݄_:sg#|MS_Sb<yj~tȻ%*^5oz! ?ןį??ןW_fvkii=l=l=lv8L p)^dT t8l p0Ks30Xjx>wXCbY":i@:ye-~B'ozt_w?RR% &"Kz.OӾv4ݲG}%oŸ×6Kmlm 뺷mlm-"mlVlEnc뵍ʹ66666]@ؾ5iI&mԤ}kVGMڨII?wn8qwl-`E?{q$>J%֫] ʴ2դLL+)Nʴ_ʴ2LL5)NʴThHA$ѠV-%./BY+CUeյVIVIV*`խ,# S+>i/g}Zi>-ː,qIR1̻5;p;DY5. Wѐi 8?>& CL\rv˧6Zm&_J[v.q;5(V&ybhZ[u֓$oh<1<>nz~V{}bp_T.eN6tNʵө2U˽5VnNy~20Ouy Q&'k|+>ʵO2>aU*ODʾ>ށ_'}>HP 'n o}Ohz@-8WiXNX~$v/!Qlm|]A+Z5+Zmu!\17CV+{=֣֣a=?YjZQ[CǭZݶzo շcr[CǭP[CréTny*m*7ͧ!q*7=X n!p C5pv9. cJ!! @~ml4[͔N,I-f3 O -l :n  9ڦm  H6ȹ^[FB/^HhE[TF-\ZIYjǒwMV gIǣ:Agz :JC!DN_8iSbGہP:-[H9+ߔ5cw(rX7 p{aVD bwϚ,>|Pd" i780")8`{`{&{_օo=O/Sx V:?2{*m _֟?_&H yH $6lwah 4m anцk ydw2yd&d&d0gM{'; w睍çZbKz/k[?ly\{XҫhWOr;ta 9LL÷T*Jcs^A1+ۤKa$nLRXF{eLïZI2a,Z՟ bd( ~H,|{YF:˲ӍFzB5v ը)Tcc)j_$R PB5v X"i0E(yl""0Ex/NSdW"Ⱦ/6^U8x˸.0Ncܗq46^eOOk=| :2)3j7^@gA50i&W1 ԃp" Q!ОB@p\v nqFbKh$ TFbvMq\Dz $d>IW4\ ^8A$2PZ)~hT 0+o U_\kZzM):wo'^M(ݫ'^yzt2^޽.Pv/{?eD"EY gdܞ=G!k^<1W<с1`2meț0pwoO*z6>'pV oxVb!i8IŞ*z>nK?U4^gW/ ˶ |[_{ R:io:Oq@+hf>l__0%Ssdq +2Pµuհc*Q4lOb$bHVg|(q|:`Ƭi 4y%:vo~W~7_~owSWԕ:uԥ~M]0uaShk$cO'[췴"gID~7HtZ*W)[, f(l%8a.YB3z)G%(jtOI* zE׌5'p륍BڤHP T: ſ;}c\rT]C@0o-|>*>&| sn\5 m|eM3T7J[?] _{jzq}(YqrD,PIcDT=ϊj\Oo-3(cM{VM@3俩pX=PtZmuAz|>c>Ac9q{Al?& zYLE'քJs:]% 3J`EX02}@P٥ ?CA' :Ӈ`7_6~+k-C кeheh2eh2pZeO_."״Җ0%Gsts –դq<~z&h^<-!Da\k f&\⽦սg `߇} 6  u(}("a}/B оEh_"qگE'ʊ'׉rg}@ݧ[;>ӭQO}z)ogU혤S|ǵ S^W&iDάb̞\,O=Ya R2i ZIxRZ 1.C!22ĸ u\^.C!'D8q"='D{"Lxlg r={YKq6vv::J_T(`4?+khy93.@\ 4{f Wt :;?7m+7rD%w!iW/A v[rD b1o b1т1тhAۂhAL ۂzhrp {f9MW`((s9H+ϖcjVVs RlKy@Ry9Kå`Đc܄59Uc]؉xvv6V[4]/t`Mx%FRoe?I*Q3Q蓵\ll5fkҐN⌥b -h3k/ ˹1|^!Kt;x楡O4A' L^зt͞ JHE{Ԃ+ߧL2l{r%~H5dXqe 5^ oVhAXD-Oig4ͨFRLsj${Z ~ť;c &I5܊ҴVcFJc&e: 9Mr`Wy4jG Y[brF6Zmut۝T>#q ]mG;Wq4ỼOJ(=rl{5ξk|+h|92M_:KFNа:N  Z~|96?F ?/K %.,{Y,-\ֽ,-\&.KZ಴pYZeiG#%<+*ϾgطlTʳ/ӔgH|}BjX)>aFׇR|tb]_{뗙&E.bEѢطEѢXhQˢ$ſ>XeQrp`HY,;~^ W#Y`oUkRxq:oB2YoЁ7EvmW\l]9v,Ϝ.C1ONAi2M4v\iv)Z0V5`M/MjI.Mir&[hz2IP[Kz$JoM4'M/MI\&&QҤ4I%4]=$ThNk^u1fб oT]yo04FXG\br`Rr̫[rzP:7Hq21mV\ŞkXi(K;P6dG~M3KI eiyro:Guʻ毿o3| {w3N8;pgN8=9ý*If'I( o0:ij.dNb q@["W\&>&|DS!%]nIˮo*%ZK{7kW/oi`>\hkOh^~/Nh~~y&8^5~~{;zys{e紕:N:J\ʳpAc{%Ϗ_ןן~O_~Ϗ_ן_}U8c@g)a,et8[RFQm, t ^.i qXfk-k#Y(-[`Ly?4KV:Z.Ȏ~լ}I$Y3R~[/{d~Zmx$VM~Ӂw%ώCmv\qYpv-) gٱ1 ΎغR5N<ދK`'j8YTN>Zރ+}(+hnCzp5T Q˽C,!VbkXw;D-!ACPkzMTam֦ZiXVikmzk(6zMD&\]b.Br],Vr]\]^.Hr]"nErZ-/\`k׆ѼT&\Յ-px˥ ?kRGMbԤ~kRCMI֤PIQ[ LX8s=gtLc}̆i$^AtKAsYw >ѽO;7xWLNNYk1h @5Ek GCAkMk1C*yX^;\= "\ ECtԮO_eeVw lG0J[w[4;5qޝ*f'mlG?[~ȶ6vB2462.C\!A5?@sT.q{q48j5-jo6{AX3|@j '<=\ż+gb  Q̳{!(f ~ru\)uwaVaZ=wsVX=[VOՓ;_' @t> wO7 >ggpZ~^~q{0.?^~d# Qu!*M a"jɹ`E?Ў/ahwR'V:1ߪT'Fu/Չ0|_34zNdlcS 젓aWtM.k}$)<"9:|ɤA&H4V6\iU|8,yʓ, bydtCA BI iK =8'bLy-<1 B~.1b4vFcјј8Gcޣq4&v41 _6-I^R$Elx&nx7yox7|ox&Z|-y[|-߼-@oFo7ziI'&&o5i}Ԥ$)(Sۇ`@(Oܓ(:wб>,bOxRt*M4vPIRmltOD)倹Ц4\gD;1 AN++d^A`{o{8uX[˚qu>rM[|k{Onp4W 0KƀcI>ٕ{¼}DMwU76  Qcvt|oi DiUb_轾BY(t9@=V|No(Յڋ\q;!+?ɓZ+.]󤾁(gLj(rXyfgt aZ M-VqdxX9F.깸z5×atO* ߽蝣z#GpE_CRT֓Vo+N '2-M~YBtq_d1CW^ ;t>/^_2V/%j&EI,Z\;y!1kCR-z{Bc_ @3~)v)_׆>s`tTF4To< è<<.6unnéq{v n.8u{$'zKD:/}d"a %Kwh]Hk Sὂ3GpuRDqֵ R rݫ·q4×$hXm%ҷ>]]W2]WUrw]4זv齂\oᏏ7-@+yMEsXcj?$ {w "]%AqTVMj#:|+1DŽld@H@jJҿڔK&PVi-NI \qPhit!\AG򲜫4@8 'C6=^͞к #Y79][䡤#kogs";͈u%ݠO- W݊.EE6M47% Z@\hX):rf)oÊݣ$6 N^2mz.M]_p-N$y^8c9wh{r+$yS\;Ixo&Wa:PƜ6qJ+:%4w)+F/g04JX~o׏+¯7-~E ]wA ~ v!%S$O]jBwMG[! Βk B•bW^(ѰM\G IB)$<ÿ~ G__ɻU]W4NjkNk G;2!|=WkN}|1~ #B*t :>7~WSV3&z-;)3$,9iiB[)^8fnPlv-ͻTޢ9kJXoMlS"Zv|zzwZ%dIdٮ8kl{xo|"zWzcab<7ٮCWhb'Q \Dk?MdOPMz@Fb 64'Z3kYyg<è<|+*3QyTaΏS~sǩ;eW)`Us ?nGr`3kY-ĸ-B b1n bAhAۂhA ۂ|'0N@;wx' [p'0N`ם>+_Y򧏒x_{]_JOe+4PۃS?>qu|\{/\ǽ3q}uu?\֞'}cURkG4u(h4 ;YlRAzW) ?g[g[&[Doo_7-B놿>_wDk^ r4#Hk }*7> ׂw%Yߝ o+~}²rDkY9*oibY9q)^tVV~X_ :~{ӟͯ?(EU&j]@ͽA7v#jϴU9* ooY h7䝖#e—ЬӴw<zƌa Y̗s'6=fyܾ ΅ ƅs ƅs¹) ƅs)۔]eݯMJt6F'hWΛpMT۹J=eAX3S$IV}p|(b_N _Ό5r)*)O (O+p~~??fE}]_{HfDǷJᇔ^C Vpw w\Wn?o3>#ľ 8y`M-+ElD$v،×J[=~x-Yfq`ӷOu# Y[ݧ޺Oz[M6 *{4q/ ?WTפR5vVRaCtR𫅥BGI|n>`XS>J?HS{/Q#Xk sß[}Vp3>h0ߺ! CuC4oyߺ"$z8ss,"Hջ2/ oA'Ktͧk)1|N݅N[뒝.N[>m-J2&M,SIBEjI(}ٕճ,/eəe_4;22'2ez3tW-Rmߩ,g@,OZ<7˸kda ͊[7 ֪F$:Wi+h%ZhVcJWZmOuu%ZjvQj5wn^ dKi:|b+/j+VޖV^_g/YlZĝeu&Y&!_^Zih`5Zmx)|hweٖvl-%GDbGtʍA%;GE/1RZM߮¸KQBl' {<ܽq|?/_?_6f_/|@ohm3 ` 0oXSvw)l;[+ iw]|x/$vwW.:VZ{cO_+uN4a(p[-WojID5i&S/-tX-|~HzV+_Z5Z = ov?`_b|} r񗪪y|Yf7y4+ af0[''<݇9]v(!-;4<9~_bڼp,㺻.nd.u46pwuw]hL{]N.x]<@%xrJ241V[%.Lbh=;6^[ۮC;ֶ+jI&,^sktOo IEV[yc6O;a^lQ=RInn@ɚ̺j&lŃئ _puJSy2\`3aLi&Li&, gq&, =Gڵ2 ڹw֪]ckO#aKeIu%KD#֑qԙ}9PNHa Ƀ!a ?'ڡX ~=!aֳ+7<`]n焗e t4lݬ~SwY=Hn'UiNV3|o?_O~Vy ^ ~Hƀ/08d0kN+(Ը1WK-A͕8,E3[ݰΡy7΀4Ů@Xح{{JiKbobrO[jۺpqb"s§R鈮ұ\! LM׹h.~S/z^^7R~ 5I+kݞ{JyZ='h V$ɒ[=cNܨ|鲴l;sG"9Yc@vj5>am)Y~TVZr.ak* fYƚ`٧(ʧ%Э햎]o n(W\3YԬfjVլ(5U5f_jfSU׀C@Y{Lap'^#/z``ZBV>Gby[-F&FU %YO`>;-@ ƫ1ԘVjL՘zjL#5jL#5x5Hi|hLYա]KrSMF:vU)j l=m~h(W\/.yL[-e]-_[=mvdwlk jzb;&cǼǎcıccıc1ﱃq8vر^URUTU3UEJ_JU1SUWUT+U+Qpe #* ą~qe%.|sp{ЮRe/nVYK00Il;z)L"%.Z^V %NRSWpeezT/U/5NR=ҋ:Rwkxyq5@W4%͵6ε4V"̵\..HMJ~-GZZHˑ#ZPZԴ#]/.n*{C)q`JYIJM6=xO.otࢺ3l4S>ײGmU ɐ/m ER]ĝ<[lQ:tpc9JKL樄Q?:ܪΠ{iU752֫*rjYԬݬ3/u|ج6+̪ܬzjV-5Y=l4'442 iRýơkUmI`bncÉHJ2RЫRZJBJT)-U *eJT)R^k4pů'[#k>э4pUڽ~Xe嵤.%%-kI?7\^KKZKe&222222sƗBi_[-ZFjZ(mkVKM[-u~_֫^VN^2RT/U/+H^©^V^'q?p}.y*]|/<2@W2_r|}߅}ľK] \WYw9 |濮 |sҾΰ? 4nW߉|k`pӞdO{ړ'9ҞxI'IiO_{=Iִ'Y?Ip\=uxP]/N Nu򸋹eF`2=42sDipktUxtsXh8RR&N ʔ<^|X{8(W\{v.e}K[kYvLZϴie=moMyMnp ok\64ɹ(vkpHVɵYMݲNdydz9w%1WK?uܒKN@"b#"U?{iUR3\ X _mdN3VYrħD ^.tU:v+E"^.LqD|O4i"?_&=Mk"D|0oIdKȑ&5i9$r&3M"{D$rIdKaΥ>M~TZׇjPmP^”<?W^/<;lܢґ<%a*nP{ѓWv='+GŞN˫W.iLɫv%]ɫvWcH^j?KvPuB+>F >誔>s[G7lp[='_9IŮ߆bct}[m羟&΁9"/+sa[qvl @י [˫WAZsW_F//i>(zJBDЇqJH  t/hi|2H8$+^ 98 `rp tUJ!|I4`rp@j(N`89Cⳝ_8Z;VuYn;q;2v8FWFQ۩^rIk1Syq,_^k8j)Z/ \EځSp$b=WHW IT&Dpy*@q^$[:R=jlLzgx{neǹB>)#TI,/9b 71^3}`+|JzkH_zqz^Kcq ؎ɻ`S^:DXW ; ǁ~URA3,*֎͘ xqJiաvܰvkGHVޱӷu܋2ߪqJǽ-׷*R:[;0H*ai]9RSiUiO4Wg7u$E܉˓$QmLSDDpKLa]$x:䃂`/4U@,C0ҍn<׍n<>T3xtxϝOjov_J~ tJ)jdC)%فKuwd6\H"ެ@;&6 MOͲajUrZѨ`s+*} ^WWlb߽b+W|9I!:~~Bx_Ks]M/Ims2, <~j<r7<04ZSWr&y2V"AvcAM+g::vwdr5mۧ?KSp Rk q  \ \%MA&l?(Rt\^ۤ~MmR~mrkⒶIm^n8Ý' X 6p&H$f YOȐĢإ) '@\fZ>>^e3$]' I e{{Xu٪|3[c,8eU)lrVsH8l.梻e$.e }g}sYH\ƋH\օĥKtyĥlljk3΃4DL$zMC }Vx#+FF5(FWGLJO~imª WiUm}mMXV azrҚFքD65FdH |;:iu04ֽ&Y&a\kM55ɺ$ $sdk55zIdyEFf?~"9S·/,dvp-Q^9BwG;N\NFųdL[Ǒ~aXthm\85Zσ-=V_ܐEzS]kL5xHncUoF+ʱ} o,Dt"W 5IL;[қi>ݰƁVe1Ba?| /&![+w 4%q+ `m3(݂%hL\\q..r3vۉgTRʡt={'䩔ݜf Πy?ê?czLGcMѤE.JwqXkic=3Vb " >aW|gnGDpԑM>*$RAlax]"|8BKSNXK[ӷXt"8j߯=CFwumy_cpR:y@6 1>|6XIB1i.H색*`.nXu䞗=k[S=kI5G-sSu$6)(_TB6hp"]6\L6|tK`ZMBV.MWIT?,M7wrU-e?-?9e{*+]ED=.=K,U/ـV )Z_&?[H|uFTOIAn#IS'V =r-%7teBTzrF%G>KnYIc0go-W\>WZ`۹ȱrtўs,k'K׉9YU$ά둌bΠ{6^a˞'kg ;dShQN\CU .@*~ZrUemrÖl莘lP"~n^4Yuǽ\¶6jǝ0Iz5ïxInŋ g2W$ܐKPzyɎp"|+=hCs ̚^1ﱿ*%YXB8ʝ'bo 6nD6z/пB?p,&tp}VQ*8Ī8LkUݪ`yS=z|뮺| evM&8浹BjI+$N-iZH-i^-i4RKZĩ%Ԓև~5qyNdmT7f2ɹ(_sMm#2ldgɹ(W\ l;~ z٩^U/3 zWp_SpP/'Z#5мCDpK]ͅcH0e}͌T&/?Q\WsdX/7lD\q `;qIJe͊YՔPެZfݬZެF}5+fͪMTxZr۟B_R4= +,) +Y{?yE^c899/ *''|6ynrrť;q P)ymu<&DAY4; ~eBZ 7Y)11# -ͬ"|łzѐ-28'H=a<\[I!/w eOh]?걎^㰊ƾ\7FO5 -~XHn\7npVp4|AW4 ~IS-Mq^iӭۤ)k?e)Sp1:VRz_=f oa#H#B5"6҈0^#H#B5"iDFCoTl9U1TvBϪbTJUpvU4aV*JCO2o1MZ_ʗyR Oey)婜TnBjٔ*R[Y:usdz5.᧦],n.._iQjgsWtEɲki˴6M<:=\2"%{2rx$8']SwЧk>]>Mا+}V >r>g|V]UjY>ݟUnYYmHꙐwĽֿĝ@Wt~{3vOk Y pl>O{jnkhO&Il;: Ha[$btȥ3ȥ 3f[4V<"UƓ>iQZ5cə(\3R/ڂK^&%.{9誴R7&ҽIK;syžAdtOcXLlMb}ޮW*U%y>8o! +AW<4_i>|<#  \}+zLHUntW? G`5]|5h wE[rEvdmF8A}"C '6 |v5U&,i^z0BN4$<-zP1B; ,b JaNj = eƯ*Z .jRfZ;. *[0jĴnY-=L!h~)J#zOQZ)J]SSV`"4`\XBoԠ!=i[Z$Q|YDkuniHݪd< Kl5_@q_\rT%=UI{UIMURW4U*X% }zѠoh4(Ѡ % ! LHBRh4Z pUiE0}҅6LF7iT%UpO&9'IΥGpnw\u יk"̥T/⩦&d^Ik|wۉK|;Xi:.p>?SO 5_}>-xL}~> 5>'ۯB~ʧ4oc/@pĽ2V6 9Xvr[ɖE"^Tqg.ؾqlWAW<44{l׶`c;"̥Oݢ&Y? G`5]: PMC&خx1+f! .?XPY־??759^ԡi 7Ԓ7Po1np7P(tUJ(Jc@rmQpr#.4Fl1uɏQ{Ahz" 2'u#EoF+rU5>ɖ1X*i-v/*A0}}^nۆmYL_ʛy.>Q4h8t如z0~Hzd>TpM]4^G#Sίu슫fC-u:w;7v~ :w Wj$wan:m6zw۸X4sFk!4:=O!1]H *自T eUзUAX*d%X%Q줂ɤDB uv34!]Bt91F,S11e&&D @334jt dsz5oq%Ȏ$Z6{xv5BO'PT7U>`r:qd%f0)P/Q}vBw]?aQTq_\J.f}djߥaRB]]J0}4LB.V.LqPc|S?OLՕ~|+_rX ᶝ}u4Wv&9Tu̥!}Bv}IMΒXb%B4vR#_ "!+W\łW\HM;#vF3Bigd3B3Hŝ fsy"'xp[d+zy"+YO6',[[Acz5ç(ʀWc0$zʿzˮ̂:V5)2 /R,p¯s+lD\p.\*GT Ѱ@$eRR,2] >dh]ākZ I1I_@gx\RÃO-n/K# w iIeFYHsuy3ġK>[gˎf'6r)'$B)InW9 0$Kˢ[bwKG_zrEQhJc=" JL6oYG >V.⥂F+&*%`mmRUJ+mɆkհ-R[oMcf*zzXo&!+_l$ɓMs/[aMNdmgM?6Ip+F[vEpKx vDQ+N-mT0 yE˞dU?OL>]lR/4d[XOB)׌pbj[M* mgM ܎lag9H =_[pܾ `sJisn}v4yl3VL±b_X1 NJp+ t7pQXj5i2eѹI΅|{ᶝ¼ Ɏ\{N\ҦIK&=mצIO&3mצL&=mצIO&-m&iYfwep9ajطO6<>mV5ͪ8;:'FL gT6PbcUbbة**vbUqN*v* >ʓkk)61[bz",ΓnLgUnU``fڬU0RA⮖)_0.)AcyA*8RyT4"P֩ hhQ s9p<$/A[tRRb;ϭF:V&EuDN.#K:"_#վ:"#rpDNEZ"H(Eګ4".^]Ri]P3!>pAg"8-*Ƅ$c3V{܎RA~$VWVOLZ=zf=z'@ǃ]-pOR0Cw+[b / zԭ 6˪2ז7I_({tWs.-xBgɡXt $xrdXp?(OFU-UBX2 A\[XSopkKäD%Zi$7ÛihNC9cEfVO#4a&9Jbr۩>yߞ_aYQyv.Q@13# a@WD4TI ..6ӹv{myɇ喆]t=@m"0n@9nW'TMF Zg 3 ACʗx jX3t KP=fg'Am;cDr ᥂@^w\O\{>qθ {θ *|**WzHLø=aaÃ'} 3 # 0s Es'9p1x\J1fc5c}9Fs./]UAKrBiw؍(x2O|Cnk᳖ oG% Ku7p9°% Jۜ~ sDyIݦ ;ǡnW'^*aUd??>a::?։'0Ι瀨Ьw./]')0/I\q"|9Têۃ =euw/ͪLγia`lռTШ`s G^u(ءg^Z~Z#/JoO 5lۧtYvbF=IX%6\2V/Gz$v4gKO5 (x:(nY*36]f劫yCE6 KJ@ۓ.-_R-@l %A4] \*82D/(ԚId(_'b L ;9bS|nW'A^ ^aRRR>KggݟURRR{; v饝w7.wƗ7v+.`s?piKm.R8α1t/mz57"x y *=Vm̵ɮ{EE㘨i'Bxܱ2pt;8Ks;/ɖw9֫,1w-Z^zMOI]ꊮw*n!Uն#kO7zi~m3.'|{.׶ #=߽b+b^_b+b^? م](9ms}j\\J3EIK݌R7;nGqr5|C l)=zydQEn[\840]fi}eUd=IΥFv'vA.uLJxWJw`ǟһ?Q?3ɐ;M$጖ CBH}\ֽp]zxOAunsQƖ 3bF .5X}D_2 gfU efXu_US,̯yS8uZ9^U "b~].M)(Q&"9۫M"!++F.EתӾEB.VH};?~\TazŘUg"+=0MOWA+nac^^rkQs:j:Ƶ(yGQ4uԂu㵎rMKx8BmAO%ǰ33w r+@K{N̰ 턙b̓ā aGb a;浝 &\`i\ڙ>>S;ӧv>3}jGקӧvO 8͓o=>:6MCD; ~]lgF64q+Rl$U'0YSi\} Ui>v!b[$bkQȥPnNhh(EB-rj*AEyN=hQ.Lqg.!g".S_LdSZ.XMWV TܓF.r&qBAUKN10y2e(u$`4= He=EڕHU` 9M4O;`'xҌD25شJBr x>wW)2 vnSZ.XMW1XS5*`hdz!|0K ]$6)U+W] JQ躧f4OQ,#: O\n?tsNݜ_ݜnΩn~<[&{5%7奬 nН䁆:)akpȦX3wCMMqx?Z`h! hwIlg^= VW2C}ƪs}z8quN%Q”tl;}z ¶HNF";qqD$^Q4=F5Qr)e$Ih4hX`\vfdDDZ27;]饭B8QA)%zZ(,8)XdB!8yLzk/*8PDs+Dsڱj0mM+kό5 )? _K@c(=68,'iW?ׇ+ ,G[-a&aKrť;qsTXSsbq6ww/=0MO8/S*jdURA3n$!uG7sCSf en>RzdB:pOcLHGr7O}NkYG`:FZu &++?1pҨlIoIc+TCP4Ĵs{T9L;f(=qKz8q-$Q-lI45Ge}mCvmACvAKӴ.Eܙ U>Oyh?"!+RE퓭sY±yh?EB.c-EEhגtv\pY2ɹ(gKGc*km)w/ٹG czq1=(&@DXgRAM{U3ust>kYo&R~.{=UV*hUUv،K%,ITW%k$e&1nq"`%e]s#O7J,-=W8XQU0Hx}A~zJmW+fpۈPwg-w?s$!aaôz8sX+ 59v6)Q(. Sb0L +2.B9pgh:1SɬixLLOƇIm;+4dž 7ava6v|^2% 9BUYΐ9½dROj[.zǵU~Ҧ7g U5,?-n%}e.k)*/lG3?TА/ K|ջ݁_qDhGVa#9#GȂ5*QXR uF V*D,NhڥBItTܪJG: u 7zTLO(41hXg'`>|>嚾_QWt,KX-z}E[1|}E \+3ؽ` S䖏ހEq_(g b.[,PHYZN0F.u" z3*5Fi]7C&;xvjj. 6@-DH@M"4uZ|? :u!?f_z3fV>Yr{Xmq_۶?˶?m;m#J#4zFFFu G#Ghz#) zi՗&&rP6G3aY.Y3p8p7%#!/qɿa/j"Kưo|-]|?^oX3Ò{WMK-}{1v\{⒟q{_цhh___}6~~5FF5zْ9/#8>'֡g\JtZtZkiS/?~۷o~_R?w|*|*?ww|?0o7l],Ȳjš g?.ܡX3|~FsLퟀŚbXS/=9zO;*o^jmAw]vXypDc8mFa=0`ko;/;|_O' `Oޜj)~e__૟> J_=>d34~%^NkE/w= luOp:efUo gTdUrՙ=_ftuY-UȼBPp"|V[uM8=Äd 'pT ^Ζ5r_ "/WN\ֳgwf{[UR:[&!+wEn;qutj$12n6"n^ҾCT/U/zi?KK>ԋd\Zr:E.sb]"wx9t7p_$--kW-zZ~ZW"]Z_dagM\^%P{6cW3)˰+tUjIWڞSةVTAUQ<'>k>:S/'Rq2AW4넓Vq2|jTz+a .ODEΪ'JY&@bwj#DF 7 "|ufK-)_7+a5pZ}ɤ%v]flyKjВZ{Kj\FA.z\(w.n⢉Wx*r,l{O{ q"8f|T!׿=QK ĺ]4[㜮%%,yldf}tsW 1= 7XJƥuچAING9٨,dg% oW+.E(~pN=|ί_[nݶsáKÉ=|s/PENXyjz\LGk=M- =`C殢-|n* |-4Î[Xu;tJD= |G'ufur/8e{n鶝y$Lz҃E#Cs|=輇i̹x$.ItU"̛=^[,s]"u+.EܿQ/z^~^ΖR娴=UpKXmz"8S$1EϣM既3`/4d}[Xu놿~ } !u_8k\y{$0t]68Nu˴؉'!VH 4LU,'['RyNLU-D!V)o^o_[XMUipt9{Ui&誔Ґͳ~}B2] %~iGN_&o(įoJ&N&~}8}V6m:6q6oE.En>5Bf%y=OM?osVJ C)883ęwL1q:wL1qcFqz&+>/ڷ|g􁟠+Rz.]7|6ɉ(Wq!y;T$!^<ˎr{dW22-uOhQN{bl;<!{nM)Npbٿ u*k"fۃuM1TM;R &4x9OHRR(u<<9 sCuU:Hݾ-/c[$'2\q!\&43&>6RY)k =[#fO7wƉ"8ܪ`yAcz ^aYcZZ^zBPǪß.ĎYnU^*hRXW3:{빲J@YvTo68^u˲oH"nrGh|7$.nc D~wCB` z Nj]g3)15>Ns;uEƂj]uǍ2lDJ_p'.ϦB*䊢U-3Vzȡ'ˆa^t cUjAުB=+*Z*vljX;d7=%Y$ъ՞;.z"L]|i<& pWSK  o8=RntaW¢OaOZ);=T ^~PJXΓ&(խخe(W\Vl;9Pyt/=8fI prVkN,/48*Bחkclu5TI@YO` ,$cytew$ }:v.tLRs\ e/mCXnz _3VRk{ٱ'~>[d$0FYϖXw=O]Yo"xl%wl5;OO dc+=pl%klCV[⥤5X('vg(;^4-*Ÿvgí2dk`s_/ook7~>y*`=(}%9Z~~?bߎG}v8{;oo;vo5_x'-zзdmS-ZRUͭeU?̭ejO-T skacKq6g_v * Wڡ'\I[^ioҺj\ITА z{cC+}z;oooo_?n \-)(sQtU;yҶ|tۙc[$'2\p.N\ UAwU4 ª*aU]*]DO#~~O~8FmOK%T1RyRfIRW1|qJ\KO\f2_\f̏\f5Y16y7jbwج6y7+f5YwZ7K[ %-'ٗq,e\|ۺ|_ƽq˗q/eV/82eԖ -г=>kխ-u$;CVylon!DO+xFX5SWnzǺ~V]F *&9-~ƪRCY}BFN:.1qrT.LsE9szHx3\ъ3 V$$i+ rEZ2߉AI)*7E㦨wSdnMQ令MѸ)*7Eh4EESl`Ǝ+h 00_tSawSqlG/p *>=ipOjwOܓv=rOjwOܓIxA=I#jvYv7TrTQ-mJ(ݘ!_jIb.}tf1J{vy9T[mWGF$;;4q.Z9X|uurԖh*\,$H]P\~52Hzuh䎉JtN34uQ.fxKW'65"xy"^}";1"K{7Ka񉥛?;*E׆ aw9%Xuu4h1 `ɥ #Wg:yUrU5W\sf-b3fg^vkǏK!5na%jB'i8۶!RvAאڢM m{|@$χjgnoOhK q=UR0Xg^ehaDs,N%j/ѥ8oks퀔)R2nM !ڽCd{;y;'hvNx1y;7۹YtVMl=J4WMsg\i6}ٴk6DMgtlϋS}wD, 5Y}FߣB7OJ'K+;c!5OVDa!IwdIҝHls FR9`LЄ' _ BF 5ųCJGǗdEh%\F}(rCvnйۡr;Cv_>#.J3kiG9EPs/sfֳ+GpWӰ:9y ܯ8|Jc|IR(6L/ JdjXײ_தM{^HOG3u._^a=Ϻ6l:*Ǥ|g][J#^hY _/އwOr}_/GI}_˻}|#CyO8 yY8/}qyM<8ΛySyko`iԤA.8гQv R6濾9i c`%\'iI49s=g&ioOr%jVv-/ɞ#l\,"ٮGҵo/VNp=b墁|+.uk0mt)b#Z$(9e5~vL$NzIݽu4 _ټUPBvoW3EIR'!N{Ԣ*<{`n}\s.W Wbz=[sPwX+6^Pm89MI6K̾Ee h&^-zAzXVvbRI5ucְAVʝE1ֳ9?oO~j2"+=|#8|>taB8zZ:_{~8(WG xAe> ؞0b&+\q/>t9+aQ+qVXt #TR"PR Q+=i}I{Rؓ$%\Kg|a(IV.qҖ;Z] ܪlB$:9grC>Ԑ—$k>%I \WHK{i|Of/U4~BZ&o˄Phev-?-ӗQW$؋d.?Zn''3|n4Z94ҊpZ!k@!1!ǀ׀\9!< {|j,Uuhr[bY [8,|Z@bnT!v/b I6QĊr5GU}YGs,V^ 8r= Hn=jڣ&nnB!CW5An9:n`$*@)Q"L~H:s.ե*AT$q%2cD+Vj'^VhZU[Vꑮ:Z%J-R%go[#c2|8Quz  N}-;@w&7 xp٘Bjd՞I~%e@F^MӥA0ngK5hIG#\J+.蒜XS?u<?6yaD=HY(dO:R8kF$ a٩^b _ȢY,y;U VhBϡ[-u)/ݒ4g5Aqn]Xb5^P56R,M>=QWO!ٮKG*}P@ꥂ,۸ʩ&Օ4qU %Nd?ń#|zAV'vYlX4(u~ORM4 MWꂕp*i/RYsm6L^64^: ^: ׆~ ׆kC ܻզ$`azAKk'|$=.557iVH- lGR ~oΜ2L__H/}s01lbO5^ ,V˫=UH6r׈kĸ׈k5bk515b1x5bG2W~zn ~Rg7 r<5~JQᣴ4HH{j2Qau&K8LT`uDDlηo8s0y Aaaayo77A;S:G@oc84Tr icy[(Rˁ+l֥{4j`\1G+V5tBb^M..Ce}eBu貾eQ7 &l],ѰCnPyr=yb-lE5 /DwHwJ*VPW&Dc`oQ*Gr# u(CCn/UV%ZsJVJ/%Y|%{d+}ʁ+$_h5c@'NbM,\ >djJ.[[NH^pKy[m֌r{yKeR|zx3[J.V-q&]4 ݜҞʳ2MTWBx{7'4jsƉS#~a9 ~?GOzipG7}wF//UI%?5YCj:ORET߶Sa? ? t8?[KH/rxAm٦󥊥{x봰@lH/W\˸I|5)z[VZ-mĤLw' -;%6kˎRBj 3jSYµŵ/\r׾p/}k?s ׾|UO\w! ٦i'HH!?,U&Z2÷WO!SI/%UJ"l:W"O?Ij:wG5{3-B<9UYS:OOW_u>u<\C7*z텆n/5|)Σ'pb|kYFa=/<=yI^T־P̵/w/}ڗkqUj_Uu_a!P׿/JrXtv3>Aֳ5 BtRkhjU&tאJo"ӄ=P/PŬI񔂷iiܻ"^\eܤKz>BT'D=ifI3_=IOUѓzJ=fI5{Roᗏ /7-~a  o / ;o }%wNfž@ ^Q:/;ֲ=}7ia |Y^JbV[a+ԏ0~  ~o;oz[/ԉ$vng\{MGreM6QQ\eܡK 8hk瘥Asz @]&ՔX{s%\A҆+dh!OǡmĎ@ߑ+vRE\lGL*mI$ _1ZHus?n~,WK. >蒼OplbA^tiWo^>$X >ϱk9@4P.6岂OvB,؍o-M]oG'|>m#Q4䂏sl! Rˤ y;!qJ87-23{E>|/z‡NR^jW;۝'<;yot.=}O%|I|I/~OeG#_?_g>|_ɇ{}mxƇ456LTĂClע}05 J"^\eܤK..._{Yi".үtڻ4?\ww..{sHD:EkXR8,T_ąi,݃=GO}t>_\s'>:|輿NuN']ԓ(a+У\,X3\rZH7\RؼT>|n;Լ經Oͅm>>|j^sɧmÿ&ɓgޓOg3gyxz?j_[}ϵo>Qj_>~jj\y.>3O>X̳g<y?>z^s> a&&X%Շ+RTdGVovCU=͎y5ywuqwWRE>7 0|hK#%>J @TO&O֐8^]j kOJ£~k^C3mcvz<8]#'g%caqVR 3|Oko^j]aPFHu<;OSΓT<<;OSӸT$Kpɥ**Vn[# } }~{߹,ؑ8q+hpJb{/|h4QZך^hs|҆D|!>8ß』GʇtMB>J?!kJcw㶮^SSyF2zi~j-PQ͇})zƾ, ٛrEVxB)brS̻)&7ঘwS7䦘O7jZ/邟_ d?4gq,qK8^4sq5sqhtc4gq /^kܳ@ĥ:>T *4aAezv$=C*cKjt/WƫDO|Xh삕p*RYs$ɋGGr45J"fH1u\Ms#P/Au25^>Q^$|$a̯+:*vjH=uHuxV*$2FN 0 < caXc,hkX  5ȿ`75F*D$#|W 9Sz"8&w;=C&>JMR JWmJ(jk>5J+!cӡAz녪pX@ĖJcb|ϡKU/mђrb=D- ʡQ| ;+' XP|eƿ r^{rEiF5ٗjBaq-MN2n%_ k\hawB0 -%\0k*[¼2-+U/tհO&s>nUOKu;S0\ ftoا}>,+'FLwz,_L ޏ}3W}}w h~4As4n~7&uLo.*k oY΄p(&JDʥ*AT sX!oK;4nIøSYv lijdrRaՉ6cMBW/#/8c?eMq>u;䥊ƯqVH%r |,r.@@^ˁĔX^r>9b9mŶi>M606-mZ܌dݶi>L#M649J~`a W[i'|lїJ^qB;2/V:BJr"2Î T&u⥊|/'R|hHGM@4H5-ڵSDUTM!htc%2rrEiF%A ctJK=!:_bzUFN V[P6kkt-W Wy=4XjѨjO%j bAXDcRN(_1zT{q@ Cm1pa!:۩CJlUlP$+7o+,R}CzA8fsq&>T,xnY,̣a%+>Dvt@8a@>\|ŮKYO '|rU-S38|&vv eu#'L'! _\1|u{"=]{"XO&ܺv\ѣi9S;ؑJ ^x=M(Sd7ʁ I*kсéPD ^kRO:*(AXiE+߻zL'hH3{9\G]4uoFuji`HVjg8` Oz4}>mn|hzt|US\67odB*_qy:4".^gJPlAk&O9ՐvJ8V)XOy:O3y:OKyZ:־u3yZ'+wԷgHRL90ꩳ`pZ\A 48#c¯_ ǖ~nΗ͙ᑚ×A?]?/7|ah&J ~/WwRӣ f,ɂhlJ1M+dAL,Q"\G8{lrwאZx _>O'~cℿ{N Jc?~>}rwo;~}qwߟ;??> ǷGo &'s9s9xxƃ[·0)| ݷ0oa -Lub=-.^쏎[Oߚ9ZiMlj -L/U4#/r_ _//|dF|ar?_l }q2_Ezz*Ck_3Dөf*ǩIs>OM4W6qudwJ|Tg|J0i⑩|mj&7]@2e*|C/P+_j v_6@-|: Ԛx Gᯏo_}O{"=]{JDs>1H\9d:C|D!kz1|:b4a} 3 2^oW_oqbͣyf l+_&[-dL&[/M˹o;Oy2w|wm;OΓ8\~w>%T^4 Dz|="ȧx%+F?VS睉R~RE>z_Ǽ|467'|Ϣ&y_cUJxse~kyڧ Fj^8&7;߯j?T4;!ggyŨyAluƑm2'|\2Bj<1l|I'V)$ 7﨧 w+}:3d?eGXO;*ßckė +@s]87 5<']3J>J>(|ts]DDcՐDoqPd6QkzZ >JΧJu Ź[ Gi Dڟ_ܽ埔d|\t+EdqQ=N^'}/yM"E ˸O]ZG+|6ys<Z=xP5l7o5-oW1MvٞG,=C݈u'u+mQghփ=H.{SG[ .Щ.>22ҭ.[]Jb]JFɧE¹l;''|POЌJ\6oRIFxpBtɯvG]]h|K~K>Evɯv)G]ߤKKKKKХ.K=ti.K>t.K=tɇ.K;t. ]uyF:I){'R8زA#xAlE3Cyx1 զljvK?ڥڥҎviviG]ګ].hex*lQTaĖJJH<mq-!s0O*np%:~wo[#%V䴺QVluq[][]׭-&[]eUz݌. 3s?SV0JJHS_|T=JK;~b%I{pOZwOܓu=ipOZwOI{z[cNzټOkӜtؼeݼ1'lޞ9y6oJKwI}B'H+'| _i}+߻ܪVk6jzL_wS&_eټI!;idx9Ÿ>»gF,4gF,4{1Fx4k^k1k$z}K]84-s)ǽKU7/mKy 64*s߆F/\lhИlhµsQ߆F}lS*T/WkT /%YŇYCRȈrJ籒)ǦcSlRzAPVm.);f51kz-;IdGѕx_ڭKA ]K?K?t.?ХB?] ]KA ]ơx2>2~8t_r-)KʸK%eK%2%e2xI%ebM!GSWS)hq4|5M1_4o}Xa]FV7ʳSuA9f]`{ۇ(ʁ/m 7DNUC55[CD$F.kTcW멡 ޢԐ]zw1wJ;ti{㬧}Bi޻rz,+ s9-ܙ^Q/kTрM~atQˆ7RGCa RÃѸK;TcTOߩwB{1 S]0|dus;۵_>־a/(=f|_w"Eds/48N:kx.uQځKt؂S>g 9D5A2\&/ թk&5_kv#'sfnHN[lOFgE*X4^_;׏Mn&Ks#FiAp UVu\I;(V5jv5~~)KLK.]2CB "&e3%Gi15kBJH-1o- ?fSF?jllђIeIg y\yakZ*wBvvϵk֮cs!bH|ϥjTx{R9VrwI:R)RkTˍ'ʛ-wX{Ѣ\q/>t~cSTnz7E)Ǧ/߁OhjȠ;&'| {WCҧ9T%!|Yό*a6>D=̆fO>RaO,/U4퉐L^y/ɋɋE`ދ"0yE`'8j[H|JTCSyT%vDRrM mĆwF3(|ƴ(ذ4}2%֐״pjhGX'QO;JçW;0“v?#D7YE{z^~UB _-թ8̩NeWB˼z>G9xB_E^*׎ڏ| (ǒM $g Gc;'+=[R~EGcH[^)Z[Bxʉt?+SN'x־T5s P{׾ +j>JeX n-omUanJ6TkTgsecKҖkQtc2>Lj<~$?˴Q##N @ܩ*רKUx}%Bq㿋=˸]3CwJ&@N {dua Uv3rb="5^ iWFXJU ^ KYujF,(3+v]8d_^x -K ?6_kTc+͖pT\Z:v]>.mje#(U"}WyKiHeȄr /&]v2$*|(?vצ ٘(&GTaq> kW[65EK7#G|d>ONb XdwF)A0G}@å*v<"zF:FbF8F:FzuqruŨv{iB&ၛIigJp\Du=29i~Їjwz?00 | 2OS=@*eRET?_/_v<?#KWk$?QY}64ک[2L(PQ5@K@7UN g1q<ʪ=!hNFaj.W RJ;nǰ!4[1h֨Gk5ګ5hjqF;Z}.ĝ6I) =Pt>bw_Oi`}Дꥊف ]4a ^vz@| (\p}$'OST`6 47+O) Β 8\}>9KYR4ZKUO/hq_\ε?]ks폻Lf}~Wh L֖Q&GntST%~TxoyK"dqbn|薾M?Qho!_cDpcD3̻pHy1"'Ljyt;I*=F9f4*#]/i3?i|HL(Ws+zHpO?D]'.VX_z_;_Ò' g[V̆8l .&||]{*jQ"WHu'q3#'>gu\] uD$U J"=ʁt"ٮK{RԹ''I{R{qN{R{RԸ'wOï@؇`2^ >D=:UK>o\2iY0GKeDލ4'1V\2γ@8dE_ ~<⥊׮JyWMZQwR>=@[L1~)a9c{y:ONy<;p瑻wɝGΣ]y;;?y:>Ƿ#wy;ܝGLUʌy_3R@,o_!/ߴ]QdlWG*'| oW4mWN.R3oWrWhlW$^?7?77k=9̳ȥ)J @Oe3xdg.^h<RuVYSzZM?Tf Juaj!5B?=u8c%y{STQMsVaU"AF/xEM(Rˁ&]~F<~SϹ)=IK&PZ:LrKU o: iSUBuMc諼pv;+xx%[͛4P dGoWBIu/Tt_D's(d&s* "e!&˕pֿR4)S p^ TBZxFQe HHU q7@9zN#PI+ |JTְ[Q@|+UxBHHe/(7>y( ~RG</(lƷ]P7/U4xyLX uQ׼Ew | gćI}#ޗLMROnY'XK_B֒f,NEC+nYv}sow/v}powƵ?]kq~owƵ߾>P(|[V_W'Re~GǼ{ --OxQb|Lv%O\;&| ">T{F JX1q>J]kr폻wƵ?ڟ\kk߼%Ї҉U}04Re$yZ1 >tːsM8奊&_>|/'^Ҿe=C(vkₕ T1N{(!!tXG YК(c8 U>(H?4 M0B*% &8c=}Z[ IUM*~hy_楐xjRO<{s>=6m\ Rl>{T}n-&=\+|uh=Kuë! ҹED2>.U 1o!$ygm'|ẓWkP| <'s瑻,<G#yw;O#yJlbQ7|v3GQ>z :tGXș@_1@8RY.Ur>z§kjj0nK4t[z5tM9$XڟwƵo\k޵_*RSݴK=}1g;m·^|#F >Jm$zbnk=Q9^k3Oʻ0˞kH-P^jnC9:|uXW'yt=OC=?[@Œ*\RK)H +g8 D E19168&3BᘨݝM8y;?Rri"EN3x.U ߽tzYww w ,VZ; ; ; oJ]okq۷>~oc@srn/ea\f>ĖuC+wvxi"T? O6Ϣ OspF O@A!.jR9O+hX // _  / cU3NWH+W $^eމg^\| 8tл7gM?*y=0J~>-je!DvO*c ]ke~#2v 1sm96NlqȹR;ΕȀΕ-y)Rj&/4,Қlk ^^$ôA\:+:/Uq bۡPbVB|:rSbp٤Ŏ;RY.Ċx9p,q..uiԥ |̓Oc\eN@ 1;[ n|zUBjZkfR3q^BMQhMFhpɭ!;p"Ѭts4KaR]tܚe,, _"P(i#'U+P+H䈋Rْ2@(U#yND-n:5+UˣyJW\G|R4Olw4 GbʘOAJ~W'ޝXb Rϻ'ڟwwɵ?ڟ\k޵'|+jߝTd^N*my!ROVMbf&6Yt[,z$ uRE-=Dwz[uEoчz.H tfFTIX?T%>J69r:7`Ew F@8i@=D>x0 xBjmj1>9k4eۥQ6wh2U^mwR_\0* s~\d&;@>oTtf_!5sqO^h<9\ :вU=H#nZWq&w7vY:qÿs>kBPsoV4Xz P嶬'ɁI5MV:g^ha5:}vB3̣)X+e߳u=iO/^h<5g#E> >vDufI3G Mn'^~b=}_8Z߯Ҙ~ ?}zJ=~_3}hW_5bo-}OVt> y;TR`b{|<EO@L{NezIGKoR s(:!␱k:(@L(RJeGojѨ Vˎ+>Pi\Ӑ6X6 {*4 8..*OC4yԉQ4MrIJ@x]/Eu| j<ܧ)~d+a;|4ԣ3RWxZzb=0m;úsG>gڇMqf}XϾR>7ڇBZ^0}^Ghl6EdL謼ՋyآZť^h#[VEk}٢$](Wx4^P*x |Ƃ!; z=ʁtmT%ٮ˾ԓ葵+hVt>[+d*ƷyKU5^:|52A  bQ,7Z3FrgW+?R&cnIˊ^臦=,6mxD?dA!_/Vkߵ߸;~ks7~\ڿm~-˶hmۢl~-˶mۢa[MYq/ ? H>0O J MXKUհk|yͼf޸ͼf`3of`37n3o7o3o܃z>vԝ5ԃuA=AxP=Ƕsb5_^$WgE*X4^lb|78"EyV)$s\:.IXvqx4dtS~bb=G^ VkJ1E'vqGΓ|Jp40-.§9|$ǮXυe7I9} 0\QQ[oٛ2E-B Kv:n!9/U^nX.u#=RN}Fr U٭;i~D7lj™m:ls;rorHm6*VSH=b&&"Un DSʕ鲏vǹ[#dݢ[Α|X.sVh!|&M@PzP7B@pS XB~1*aT/FBz3Yc\Rc?Qhr WSHx[4xؚŶɚ"E.hEEro/ilHCs PjL}9jHEbYO@ M&-VDzç}EK9Eh_ҵPXPPWD^jb1f4/QrJgFĘY& X2GS/^:l74-l/O'\|+ͷe:l>4K=mQkl_6_8d5a7 f_F V(רʦҨ$;;ׂM:yLۥ&[Rh>:c=K/mx&v0A0|^-]F~M xz9صakC]6,vmXkb׆ vmص]Z}[g6 [ ~_}-*4]MW~_t/o|~a͗7l&~ h 0 ߞ={`'`O|{Lh ޞVTsОLԣ0Fe)` VWaL6,\4R4T@^K@Ky,r,ZX4˽4YYX BJds9ٟ)AzTaD7aޙb(ЙPр UhB'T'**Z)(4ȜA"F.U Q1~GƋb H@칊Ĥ2|U4#Z L?ߛK^8-Գe+oU%dNyd o2C+ה}45c"QxeZ HpuوTj\Ezz?< {;x9 M'|M >(,(< 1پx }\ϖ9*\XOL*doj{v=۝U&Mۓh_\xJWO/.Y עySZ<1h˪vZ R@X:ʭ v'KU[On{KIjd;)(Wx2xAlXʛ*WJ"=ʁ:w{:j<u=OG힎OGvOGQ{OGz Fk\=Xu&߭tf<[t1_IN竾My E!/,A?XwRmx +}:@a+a|IA soƃ1~=TGa8,記T_-OZHKg+׽MuDU[b1mf*L/PQݦdᒕ0-Vҍ |Pc{V﴿t acMFgmkǗba6o6-;s"==pM]kMRӫI$X$Ij&nBM25H_4惉qNBiCd4JċB:#} 3\CZc̤7V3j6TXj,sf{x4s鑭+R\q҅\S |Skc[Q.ZĺU3B>Хg^d.<̱GcQ7)t~ML,Wu i5RE,_M굅Hk0j*@a0k9Bjeki5/U46#2}zbi jѶq/z|Y/R⃍~  ?qġ&D'JOT{,Ir]Yp+::bJ!-fIk@ Tقh'i1teP2\doZFHs-1}>}M2BL䛂PG){P]褳-x >v-M-$~|U'@)?U# ~%b#!yevy誥Sn8bFtnTk%qw[3Q]V/ݨp:Oo_;OS˖l? GrHm| 35@흁@Mg@Mg3P{g3P}@&Ц h  Zum:tm: RG_Ÿ? /,SҡޡtN;]:t2tw֡ߡtn[ҡKǝhb;a^!e8VI|abIl9}2 _u1cT.jK2 VYq Z 4ΐ//Z~V~7V,q ǷH4D+l>|o7,kΧX/Ǩx9vmEJTv4^.;:Ӥ$~ly7bGǛ}:RtAȒr,|#%0 cL\.uEoZ`t!UOD8NzDʢ-nHXkHmzMKR9W_9NsBMJkt> ։Q#wo)V;<FB'G|$Vd/ b>9\*oM*wcb`g@K] Hk:a Iۯ!5_WV)2CWZ#YM‰TMSwϕ\Դ&)XWgktDk]ԢqM{+x5RT+:XLh{֮=>Śj>_sBjSji!Z |>7x?%nRHV5X~_m|`;P2xF"N\Ţk]>|]@@+`DqbRA=n:߲>ӑo檨80W'{\Ҋ8.=g:b}z z+kVDk׸`LMC{JnA>q]2r6L jQ4I0d9I7N^jL`s0ĻNNg+2[tAN`Elf\DF.?Xר|-86h(eE;qu)"[tU9̳20|siA+`D|lYo!5iu38̐.,Cg Orǯt-{,q/-Z ՙkΌ/ΧEdog>T k(Wbz$ Z٨DvnNޯ}鲮t&m{nD|Y+`ĺv'x4[Yuu}XvΧXJܴMsSOܴdn*I榒$M^禕dnZknZyK,+}5o]Qɖ:QCq 6\q8f8+x/(?~/?S)Wbݖ]Բ=P|MJajkW툅Uۡ7E:-S ^~gIY CP#+%k%dŤ 5~02q ڢoЖ)ߝ'kyy2nsxߊƦe>QwӳQv̞T+;ccvrٮq&wXtwe,4u'GB;\v!;+3;{'wXΧX/ɝ.(xb;EJ?ہxJ1t$o 6lPקXV{[t9/[ Ʉ)uϾ{%zkt>EwtuFaÛTAA&n.VHheHtfHH4 ӥP ?)Y-O JNq>Ku rg?\*>u)VCT[zU(Wze%$m`N(CvmkKd.gSUk#/y@靄VkdG( WqYвNZ `z]y|yFQ8ZNi&ld%xj%+Hi4 ]d0-+ 貘<`x:՝mQG7 HDFY>`x8]E5:5e*O?D>@[Y_F ہx*j++(@ Mweĕ`DrCEg5i;!p\+<6;~.Tݥ hŢ*??# #|A h ٓ7],S7YBԐB|6~n~7րϑ-y{O]Sgu/onx6I\k}~7;x/ܗ.\݉*aR'="BaR&X0a\.Wx+IiT |F3Q  Vs_}jR~y:o6G&qT2ci Eq8H 68TZgWR>bcDNA|jh1tWD!NZeTW鼺B(Ϣ #QLե0d0th!o9|H~kK_Kڍ}/gw]UB|g9o_|9Nq |B>*ϧ x梪 Hs ~ |$T$eA :& R9#ԏzpZ &~fCU ߽ufѐ=׌M>m"QY^HtXfJ.:̙gXo]`qe[(XSq_[DzTl#ƎY,v;b8FLF)Z8?a#\K ] ܭ2}tF)A"3ډt'٢gzbՏE[R(|IT!X+d_B~g;:躶ݎ~e;:ڎݎ؎躶ڎlG<-t~ a1/] uAYmJX;z-U̯222˼˸...o B*oZiQ:.KvW._~UuZTܲ-/]?.]֗.]tY.7ix4\5 ix^5 k4i6k޿; oq؀/܀4ߜ(Wa{<&kT2|“7x>A"r_B\<+n%CdsȑCd!uCw'1D!RJ4wɔ!g: O4<4unYifRE5 ͥp ޴$)ǟ)J?|?Eҥ\KKt).Kr/]ʗ.ҥ\ y\~L\XK U3y0/f_ډE߫Mc|z%mm6Q gAiNDe.xm.Ռu}j)x/܏.5`:![&{=RaOFU͆=$7Y>Ytad_LlD ܪeUݶ!z0GbU*g MMRBȧ/rɒO+n])~_>ֲ//|WYo+9A8@,7@ _טXⳉX⋼^>[|5?Y'@(|ˬz;}ZY =)mD{M u2䥐:OOO>{twtOϬH4f-ͨkxhA ^Ђ$[1{&ЂңBisu2-| 貿SW5ukrٮ˾.GU5u9o=t{^}{_y{:}<?4"@.ڃר#tamҝwB6(ץD;q-|Ee]d}Ee]Ee]d}Eeɗ]$.T{yP>a}P7DZ5x"|*M^&tUTk'd"]4di{ٯ;+_I._d[f@| Oo bnP}8awٮ Û9n+2EIuQ\"ӛT_S==փԊѴѤ"=huAI*LAn\o72p>*״xv.8K!XOp=hhjoڃ=jjoJ ij=ho_ooo~S@ƾ ۊ~#WMR%vw#Q@^8MGHM{n]q>(&=VVkILIǯ|߮+@M2~kbE}D!Θ?D2AJ>OZz,ڣ`ho@JF]`ymQ##@̵Iّ~'X?s?;*lg`ފIOTAVag*;55;zFCFC~GCГ!hߣ:t(С\:W:u(Cz\zY?1 Hf5aYfy^皀tUɥkBo&"kB-_kBEmQ):R#]*|Gڼ೵ۦIu2Z=;Dly!]mj8$\{_'^3u=n}pg=v~©..KGvFFv]Gvӑߑ=udw{dpm wN%d=lg6ܳˆGQ~lU^AK02eA7Xf6kT@leoeW5 W3R٢ JE*;[kڏOUTQb{>)Y) ӓcOړۓcOړwO5YSi'OzRGiRråpZf.!o:.`&𧷖%4?f3Taoh,` dE11o q6< В1ܧݒ.jWr1M .bvhZߒQ-}%+=}%[>DG&%}F-}e+?}e[~OE~[o??o?o??o?565_PRzK#+{njmF_x&Uč\MȺ[U7q>8Tg&ndlFM\kk*l|^I r $K*ᜄI%z3eR~6WtpKB䭧}c(h(=ZQ |$Vh[HTKώ&+L la5f㤉ɨΔ; _&xP-l QqH-~eD+T /k!UY/f8>l?B[k x,*]zWR լJ4**O:?>",s|VO]uo/=\hqIVbz%-u^gC^;]D*>Z+KSl%M$ &+$^'G77nnLZVJ*S.nnZ(v5U EhȪvd\Aխg𑈜|0}XaV`f'Ajj6n;biB ~#+^Xcfv_ͰO ¯ ?fx9c1>V ߼X ^<{Ԑfǵ|Uw.[zСtw.Cz֡tk~ɃaX]%YǓD}>.bԢꕬh/!U?o_Y~ҷo}K~a: V᫙ZW Hy6fX+рOO1]k&aq1pZ ]fyi|FX61 *¯ ?+o *¯ X>]¶t@ G-$~֓ޝ|$f`hZא(1E}fD-cT +vNgZsåF'tګ9po~%X-KD[ opnJ]5Ŋ3@¹vG3GDy88skOeb5o5s |7K|1bXZ>#:ՓՓՓWOWOWO_=i^=_=i~uyޞ'=i=ijOZړۓ=i== ֓ݓ@<3trVWGԈ8t?]cNAc #x/ܡ Yky<,v| eL=lzOY7~$ 倘]Hq0bdyb*Vrr2%ٮL7y;ob+Ҽݐ-xF_dBelEGx|{{.xl|[Q,nُ=2@.NǛCHot>*q>ddx|o5O*|x{5!j@(rCjSSOTCjWjSoJfMJ Db)ݚ %+Wh|I̱qIs: WWW_ݪ]ݪ_ݪu~uݪjjWVD}ik8Ce GmHt]q5|c5k J4Rg 77Z钐ɝ[^]^i1_?.+w~YM71mp[O! I݇ u2R#o| S׆k|׆kԵakԵ0ߵa0umkL{)a]SOfh\^P[.E`YU} q#e+1.R!?O0'?~>,x55gmE1QRttoo,4Mk1WZi=RSohmZWHugOcKESR6I9| ]VK]*߬ï*ulHa ~kPZO4m-wDc;R]䁧8ٜ :xx$ 8a#)\x?*R20{" iwh*>I7blǺLx\orVWQ9b[t^fu \lXScCؓccO6oü>mo=Z#QhTlw VIvCGX*L $} G5`Mމ:+Ht.[].נ[+mkQ'`aУ"^iێlׂy: Yn틶v]ֳ.ྏB޲. HSu.YzdẐ c=B޲.%^_vn+_ețrZ 6]gs >Z1O;:|$.g  42QŒj?v-X;oj2Q)`构;x/ܦ:YPL>? % 3庬hHT\fxgzz2s6XQKOoX.p+ܴX TknÉFʥ 4ˍ):|,d#~)I޼,2VcbʗF՘U>Fd'췓]p. i2ϢKzR4ͤǯCPK4k%) O譽iٮ[6rԂר; +쪛'anYt$5< r岯Gsٮ )W~E䉔A[tAU`@ºW`όslQ ;|$۱KЛDR˲VivUB?.MQ3gp27 ?l*îߛIugV3>6'9b d?#秊dvܓe0\{hӡedXK]0סX+1zrR]aY*/Cpzzg5P^^uWfZ(Wz`ErL5n^,,u5\>D&' }b>\0WcX+1O_:Nv4wuNvg'[d{loN7*;՞l}.q'+XO "S"&ZhXT#ǢXs,y]˽Euhu?^סuzkuõj?^k~ԟ!w] ?+^#WeeYzgHW!+C22}Kx~׷?}]xҷ?k9X{?遽Ԗ c:q:|D|%+B!V揝C_j՝51$i:ccv&X5f+6͸\Z}vý4dDZ:U!;oTq8v ~KJxˮ^sH5%=@I }atX $H*0KVUeYJUUgcX!k%M6֣=dc NjRu.M6֥}m8u,"&jg+G׺VK:{r&y Pb/U,JHuKdKL8I(|>)H},ΧX>r|K؆6im$~z"":LÏv;RW7Jx2甐𻞏1N<{ *DǨƳp>]OR۴Vv(.!#ӥ0tw&Y{gz^{qmB,koMғjZ{vT~x 0aEJT #t٢YCEp5;U-|vF\E6?b]ΖS RI%"G; 3 7r>*{6YO{6f10gugֳqq6Ξ}UӲqٮKy4֛/Y Z!˂6,h< ,}HYzYjZjll[|;^v6Ml{;[Hl;% ={JfSj>iS="S2LګOzM}ȔZLO!O$s}~-Lyz첟.f#)e?W~WK4Xz5XP ֫V j53tu[qĜip[+-6L?l(R[Mm1:b q&i\*נX+O(x g?tmF%$&UW'k3:Gq/qOCz el&%1TY+АO\/Mr[u+lvyrVnfJyrVC1o9$:11o!|$1Zc\l!ykk%fR 9--Y f`7Y v{&*K(|_ zyfaf^fff{zz߇~-ƌCCt`D !c Ub63k"*uP?;!L{keUoN:6}kf4+_J4S7L?Q̯s%33\jGRA^ƞl ௽|/N5z 1MOoimR~4 L^eJYeK¬Gr\cgOk9,6xi`m+CɥpZe&zQ*lf|`ZH8@ >9]eI,^F-ҥgEXk,]]tKtH"+-貥kE˖ 財^PP7m׆Ala@ 財kCr[?-)GUTi[n&D+M~CjzTmp>*W)K|1V y*hoV&Jl$YuEp5oD+t|ΧOΧ[Χ[ө~S|u>[%wXww_a_awwYþK!<0cV;蝢!a0|;3[lܱ[C$F'Ӣ cioxrșU9~rXa.Vd֟!yHc5c Yy8VˇpZem*2ËvVt8&l_zm1[Ճ'ʉ)1yE6OS1b0  Si HS)| ljUB!O |}B"jP!ꇼJL|=O)&d[{]^~Iϯ=.C4ʥ=CKao;`|Cy#BE ֕u \g3V3> 3h`].`Y+O^uMAX}y c!_;E:I(bV|מVcI~uT>ٲ֞-5|)?w7 +|OqDΧ +|)V~JAa??0?$r)[N7e?σf7SiI駛tfw[Sl-6h-ޖVoߖV%umKkmi巭.Zؖ`@_[: klҍtmN6$[-]M<+[:ov-N_[}f(6"?̖ &ĪFF?ShE|+5X+tʻCNy:3"̋Sh2Ln)47BG{m՜u&P _;5RY˄O tH5|ȧi"&iȧj"$FD>;sTIppDX$ a[8/#۵-S ksz??RE˥EN•h,pB2>˶]榕lsHuOm%#Oyj3{x{6Vڳ']g-hf&ڽq;`Ɛ_w4xU ZWA\@M"A\R~*yޕ/+>~o?Ċ2 +@1 5XJ@ב <%G\õ  #Aϑ9;*HP #A_G Хqil [jvn7e_cXcKjr99r^E7a=,,oOS h\T[ |caa,L  oq,L {,j0~`_1 ٫mxA Udl7 T^QC͘"o~ym׻S{9^CNW{-]-U9뵼7=䥻yeE޲"+~W+y+yꊼ%]{E3T厘xorV7(~q٢$cnu \lD rQGQ9tGn QZI0 jDZ[':gRՉMNTBG1h*q߇·ttuT6W૝yS_4N2"DB4| zs:!UC7 &b'enՎ_+3V" JIyCӕd/2w&Ǖ ;.oh+06 2@Z)hX/ΧX_?a//g Yyr_ Wש`):k^]eGgEyvy&)27զCg B .wEzPM҃jA5sK\uCS%NaBӤ:,^%fTd=1hڕM zߧ 0 B/KPo}_B/9GLrKPm_'I$?hUjV]5xcK1Kdl3,$/k| R JPՑܥpZ|UN= EOo=W&=vb 3"aGV-!cq,HLعA-ãP%}tٮrNc  [|P!%6fm@ o<(bE{C*ߠ.mJ,̉Q#x_ꑭ/ QS{CՠԠ^RV^m£.tL t+i)22 |>;qb|UǤB b}5ǤҷTVʏIee1&HL*Ie1eRaygX%[ȮlET)rd>X.[`RDdEV`"YԠi'f v5:*,(ܯ)Ts)Z.ՀneJh5PN:M"&s׏tDP]cB#Gԏtx`^~i* 0Z8&34 %ri h|ձP#xZc%&َ|??{g~,h>˜XZCj }b6>Ku -$Y?sWlдnQպhn1XHMj݂ۈ|s׃y2dvj/˱UސlllS{[q@'1p5;5?]קXvFh/i[c_ڤv>CְR[P7Cw4u: wRwu4u: wRwu?|)v\HiOonvE؂7Y"e:,V?Z^O!OjCzkFj}جVCY5X B^YQ̫rtXzmtXvm׿\7EoيW-x/ܢ1vbPN0aΆ(פE{cb4aOi%#p%hf j8L_id:hop4v-FL dw \e*"XI]7|ed(e_!`ݵlPvCƀ&]sҭ7Rp*rUf78xd2Ѯ^8-0QJRkΧCOMb?/p/DI6lF,He;bHv 󄦫c[QBvR/ y|vJEdP߮V [t9UgdQIvt)z;p%P9 A?D'a@DOuŨ*r$KZ>C6(WdxJvZ"u,fKl ':m$\ &Օrv+5 ZfXT _  _ >vT-jNlszkmRͳh!{%k%n\/y1v0$Sc{6{80Mgk%!U(ٟ'~]ŭe%*xA鼤.yzu}o;t| X~)jO= :/S?IݧI>H_ X>OE,RՎ י1[켤O-d6#;id#x/ܢ +y2fu?/7应hxII~>^˨)>y WvU٢κ#8sׁX[E7'r8:@]RAl%},ǟbSŧ&]>n@Vͬ9 +ޭrqx!_gR7X?׋t+0zD}çS>Eçקڸt) ́2(ځxIͥ.5iH~H]n{](1lnnh*Y:Nyn>|CF 3;<&KjƽtÁ7  W7o!Msd<YЩ/deH[l hږ/TAa,WHuQ_ٳjrNĸY֪[;okr74MRk\|+43ϐ﷟W}y;W}Y~._|rRp].ݖE |a^-˗3/_v])~())~()8{!mg(G3raR묫0buCCjQh8ΧX>v:טqq*hxI kdfVkn+2p5kL&HyjRcjuf7vC?E]ve~.Bnԥ ۉ|[P.ÌuvC,e٪ .)51YJ_ 61dhVN{EȝVn1%ki{.ȏ' s[7R`ml$+U_Ѯ^d.s~ɓ!۵}""@.-lda2p%٠TR^/]_T  5PI35;1#egn5y.hߕÜgHկQkWnU>:aWk ίA^R5JI]?y3);kB=f^Ey$|<ōkĞz;owʯ62meMowߴji3W-bȺ.RC_ԡCFk{2R!q^^M.jY()0_ A]>a.(,>XIڙ#m'JAu DM!UT ]]2"l՝%!j:A.ywH,wA"uuuPN"ϸ>j:=Or4믥"=NBNp5X.g+Ѹ \]|}|}r}~ '('hUOPOo2|%YۙU:YnOk;hfwKe#oXhKlf%/]gn3jRXP9u]5x{5uF%]|$ceDw*fb传 ui爞r27.]9p.H.JE2sFNO aM6N;5J4~gB?F0a+okRxt a@}:ZHe -wA5;[FlկJx;+;l5t:[w,kl5g=iiOoOړ=kOoOZړݓ -# -#;yֵsΩ\ji;;;'j|<ǡ֎ jr5FanFsglo7\.8Ⱦt)[ SibJ^R% ij% O";E;Y r:Kzױ%1{{,l*&Օ8$5N]*h\^ΧXoCH?C+05h6=BCj ciZ =OaΓay2? >< oDoǧxI5)0ٮa6JvU͓bKaҥ ?6uYXmuٗ.Ƃ(&[^l7\٢˳lo]m_mײe{}٠lu_~/x=h~Y?X?{}[?eܗc(8c 'yF&zlouTq(ƇlJl%<) >(|FF~{a% ٭^ >E93>!3KmS>ak4\GQѐ#w:j}FC2G}GwѰh8sMNH5JMJ$}TxƮk:fEtr9o"%F^v醧m\w;ڏf+Qç<|gOϓ[%&ˣ3QHv >կ>5>տTTTT>UOOiݵO>uv>~}De(`xWMkaְI|޴RkRLpD!h(;*r4Gl| 5Bb|ˍAơx*aߍ G]E|"E:V%U 4ْ]x _fe&ȗ^f k&l5o3[9*n(~+c~+P"VT:_ ljVƼVᷲvru乻]NuWuW;2gwP3ꮆwKoͫooͯ555߾5o [[ZpO[o[8pS\+0xT 1.Z> |S7{زZJ]-[W[W~VtغZ=DWՃNty^=:DWDDW =ߜuv(!5;kv_ӾfyNN25;gv)vMH[-_NH]ԅ~JV]&[|^w!?^T&j|C܂=ˋ"N\Uܗ.2 Fv=;ddtd/3#;{k;rc?EiYȞ5󺲤Mvj%%$[f2J?y蒿tɗ.%t/].Yu)%R/]K..CgH"H!Rt>D{v"ޜ7u"(ړbonх!)t0m[tXޚxw Xt@l1W.tKmuMxIIy=mNDo'.*n;Nٓn%$e2(K1I lV#;vIxK=eTڐ*3@.KƄ'ْ5LLNV< .w_~5k]_ﺦqMkwfօ6ZR,ѥĜD]%?iK[ӟP;/EXB6Ki5*KOqfE9wq Dk=0DxvTK"^ ,-`wi_EBǯH88뫙T <3VuB#M'X[GEMר_b^b_b}yQQGE!-%〴" \o['Ǩws3A| ) =dUܗ.+'`" ֖ VO`mlVz6X+'`J7i/8!]?ŭUwQOj|dQS*.=Dק?|OO>ES?||}OqzX.iB9 +e!F.,t+U"lPKvf"?.Rӿ.5];DCk}&Z(ץE{?a6 ]!2=ynt݃`g= B\Df~bqkXV?S^{֓ rԢ1Yuz+4!. rXZ\m̴| r\ amz- B[+*RU#9Jίq6b1Q0O)GTXHMj[&[R9TO#25KxIIʚ$4~!+Wq. ~ɃmeA[~S>*?mgqKal\a|1-NW%drEr\RP#B{=Be'[aRM?|rDB4dU*qЙq+ ccgL㋰ecشYrEj'0DrvV6EYJYCQä(f8)UKsf$;𛞊qx&BZ(IUl+;f= C%  AjJo5\IUيcT{p/!b>\20 ;f ~3\k98ЕlP'gn"ERQUzq"ߍQ3}*JdUyɥp M*%:|˔z`3L'6vNեG6xJHUíQ5B|lZ5![# ֨M.[ҿFѽWqh`*h(lׂɝ.0Y\ƫE$ /&=i=kO C<= ԳIOoOZړO |+uK4x:m(hr~h=kX=@T=X;R^B@-f ?;'Jїd0/| ە>J&ەD+ЄGLO]6IR5iIzIZךyMR^&Iפ56x(^BJKziQLhVBq4lGDJȫGTIoHa$iqq]SBO~kBkmϗ3ʴ)+d.:jx]k]mpu1BZW7!Qh]k]B4'FfvmxNl٫^٨3{F:f4Gٟgwy5<j܁ss"^@$@x}ʟ@AކáĶiFpUm IK6\:mGި_tJ3f3VvB巙˩Jo9қ W2d_l΋1d-.*_N.Y$y!$[[tR6I6]b e܏.LLLLz~5;t<;3bLԦeɭEuoEyʥb@ .^q$GvIha1)bPWl-Zv΢ťP(3Z]7`@Lǡ,UFw>t1 "k4GX/g یߖ#ӷQ"kTg*[bb {vU5Hv>'Y&!e2%>FE /20l փ2q74,Dqn#B֓M@hI[ߚ hjTIw4 LZޱQ؅`ww;ʢ{V{GeYq{YYɅ@v- \-~bu҅`Р r!hq!@js!GpIqa`FddDn1"k%#dD1"֌ZɈ GI2" #dDˈ{+ 71>X(DGΓ&yv΅>B*z8a_x/ G8_h#RM_<|XjaUdhu`/X" Yz:0Y7"(hlN ",ј@d﷿$nW*,ޛo~oϓ A!^o鹿o@T;4ewʛ.O̻*2hYVeH -CR!yV_D5'ĽZg4$a_#I^a?i"Nj'>{P|{H{,crK\Tc[TAdAXV%X%A1idel'oy&lR5)-(ry"= lR:/0)do-K1vEvZPb;= ;";dvleܷ.^"G$ ~BFի_:y H٠Bw ]B-ka2sn_N&r.U,bnߖ:㞸B] 7^ j b[^iaͧ:L7/|v^|ӎô|;L#a;m\Y8mmw]^+ہX.b-viUR` %njqS;=t-<P;=qSRCr|Ķ[EF3tܱq,ՠ)D+LĢ)owI{wI4Ka ϻ$zowIK||IWbN[ڟ-vxOO'}>CN+dNc8l$)è.:t8ݜs)Wz- |RC㻨/ߣC5 ۹iD(0 r>!;""u,)upZ̢``M ~ ߼-!jEtoh|v J5tFİ&awU󝿃;;ywu$#Guܓwfw{nv$7N__[#|e+/DS$:&jc!z"F SS/[XiH}Y=Oz+ЈG2JQZʉجF2llY U9#=ZehԀ?Uu-obAg`"i`g Uᣝv[vmaU>}7]~ )jb GĊt 4փ+_gYqܗ*fECyXˈ*QW=DIhR> iRlq mV>qt78*)<ћv@6R gGJ@_12'5|C@cZTV7W+4+(4;Q(4+_а+o?~gM9Li1/boǵJw3<1Z"r7q}o=NC.6^B*?݋$a5x`k6'm<. &{T?} h)u\G+L _R*x44 ҴQX O,nhܱ4ʠ>𽵚ϡ/)5߾oo~7~wit^yڳ+O㕧+O^yڻt^y<{ig#?v)0y:OTvAa5j%=p3懦#{Y!^ X]Y+wzbQWrc,혧,TTF7[p7|sGV F:n7ѕ[fWK;b^**v+vۙo/gY 2o 0 1Ÿ 0KgqcRNmffF0|kuv#5\*GvEsg+GX_QQ/\Fb.(xҦo_"I:]o? 2Ÿ??O?1k FF𕷟mD|bNR۵T "+GX/U^iOxVRO cN#%|y _ _^ ×0兿0|,}B7|| 4 3[+a?ASmS,{r)m9IW|]j_ve|LAhVqMs.+cNU/HhvKR9'c)ke!;oσ);?]FbiT vj/PDrLz>S*'w/r) Z/\1mmn!^Ѥ$a.ZE!WʫUtUTy]* Wfbf~e/֔Ĉ>y80ѐJ̴rB@<bW1{+VTq*E\'}Z_F ~PQt[-kvd$52QAT+FhwmD D 4V}QAT+ ZOi%4IEקVw]BYS<)}{OϧwJZ>6pVǨ#FI*T.'_2=QO`j+e EFWA%٤3:##H<;:##iH.G~/~o~_4H7$mK@s>ƌ u0xq-3guV`3eK-M]0j|S.wx|}[}FK|5A#hJ#H34v}GP*VG?kl|Z3Z=GS8 Y=pz?sԯy*hgg^Wj Wnͫ@d9̫WRjc1h{/o5X*o.ӚՆ>LfwBd+ڕ)_| %jE"=` 4vF?(۟;[Da} ~F~pK٠B%YVlǹ78h;y -y1)$r;yВ|!=XWc뽽 $IMW<)]YU ˈPc=#5e=>9Ӆ}s )y6e Ƹt)ud͗fH9ܒ&|HVHױKOZOwE-¹Dyq lZenzJ ǨCGYj?<4q^üURA@#Ԁθ;O,><p;r\ר9>ooNXh^Nܗ.`K>DWT K7/=̠Eu+,z;,K5p>JNssBb4=Z<,tR'ܜ`钐 "Kt7R<}?l[b"("yJN .^,C $6 $f楏$~d.^z^01^rOAhq\M_8%vx~RA @<sӫT~Q-IR[!Iمkncvͺo]ʥK{rKJ u)z"0.ѐxN;uA 3NYaE͢]Z)vMP-c!DQZ)uRiQ=\XXcikHRi1x1ύ .s=+WA b_'.kt/s3 jv@c|W~a}a]~}~Z߷Qs1%X!J nb*˥2*>ZY}g1^ 2VPq&(myNC gsQG6iq5ݑCV#BՋ[&EN"F lp`c!js*~H{(5N&tL B0Rj`ՓcZLe˽ԥt{x LXj,τ[r+ FTs.ǟSnFv JDEmV򁘹f(.)gMDJm+Jض*ضwjmۺ:m[WӶUm[x2i::m[GڶpyRn=Ȋ * w{i{r=ѽ===#VДʹ)ѹƸl7%{Zlu'g!kH>Ljw0o44~;Əi`߃ 啄>:VHXQu[ũadSxX!;@W+;#VTd[j9H61QLVcr.Sk =UBŴ/JJ ]!i+tɍ4"D?'xR~GRA*ekU a Z 6 dG[+*鏑Эbc=2/IJ|k%+ZkŸ0 B vaqB[u5J䰱G dIiItia6:?hCkA vnIڼzCkA;fl_o襀|74o_~|oۗdlOhBxݖiDz,:XbN;V:,/I͂-L>JqrprXԩPaf aYC gD5dŊփ23/&b ֠`%R[NvC +5S$*Dp=pbI :2g|+dʕbEZçogEЪTn&xI>zNpk8l?((N"Ӧ3V$ S-ɞID%CV=n&Br3[k)upգZtRk\Tt5iućO-cS>I\*)5:J~Y'pbU(L䣵AU-IS˭Rh 3doF|oGI / Owo'Zpăn )[ZR"%2{ju^ڳ+P+Ph^ڻu^@{:6a54k?|Kk~2FoZv,R+rΊlńw#VwH =Ґ>^8RA|ohlF_I՗YַDFjA4C* 6mU!fKyNey/XnS'@@tWq ԖY-ͯaW_fik+dqˤ7;Eo%a/:pē3} vȧrvťՊC \j\@MI٠Hh7\3f]yU|X>OZ[a<kqX[kk}lFrRZ}zL^6"hUK H %DTA-Z-QVJ%{ph- ZOTɴZDtB5O0W[B5֚R[vi+k>N[Dz 6RUM' xvJ YWwuvZW=E*"l]ޞu7ZW#5R굮NnOygƒii4xjy4;kyoo ~-|pvvGXoǾc}?y;}/c_ޅSx\pʻpN^8NyNs)¹x^8{DqDŽ}Yv[" ^&;a\WIv~]n;[l]+ P }B+B߮]]qWQd!Jc]F0|U4Ԯx]VZbM>zr^a+G|jTaouψ;ƒo?-q'a%UNĬ]I?W줂a'ke'%f(s,)]Vq? MfEQtQ{=X7^FF%ovuxǻ=]v\?VٓIv#P8lדy*t'oQwlPKvr^}I8Y%^!c&M2D%}ҏ-:;vi1{ZR.AL+m J- w3|ࣷb= 3@r,tS;k 'ݳNt@BeST3im+ES;+'h.ǥRT8˔[|D6gmF0 #@4vM@U%;RA|omVsɍO[7V0Y(oX4*ڢ.c{!uQіnrr4汤ԀǢ\ZՆy݈_UOS>h-Ej ڍ#ZTH lvٵI6;ͮ5ٍN6dklv] 4=FRlvͼwwyM|)|)Y[Doovc]zRVh~xP~>: 4GX 1=mOa1uD.…7! ߧn 'W`S3) gfA浰3zlVIg:%éPDpUO}UH6F6+y:K8mxinⅡt>#}J2|duAx+)5U#6uOC {~Bר'{RR.+f! x|O3kkFå2oHRu4Zf.]8gڮPK`y Xh@w^fix(mmMvet4pQm# tՈcF|#ɥwGRz@c$Ԁ-RsG\-ۈUO>åm)oEn#>|[ |qK=Q?u̶)R!Y5!8;lz&'4bz`iE*bEu]]<ڋe/9g <s5+?^zO58a'`BiTmsC@jG|K|;Ekz?/ӨkY=1Rרӣm8o#CputT`ShM.]F œ P3R6(ۛ_~t `O{te2w5t074#i!-uk:ubhJYޮ-} <N.#ہyjFNTޱN.톫p/_4kؓ+-}j엝xۭ'i͐ͺԉ:;&ϚN.nq?L*/k@]X{//~j-t6/nqf2|ѿ>_1dgK`wl6{|LDeyguOĐ "4X,oaRN$dK^>=&8O5%;> <5W.z;Bn+KXo[KX (MfW4x /af%-SMzupzpzypzp JM+{>S7ZKt2(ae+;dv]9=R/u:c`}F؋Uۊ:źx;p9/uiz sԥQKt)a"^2lIdiQ.#L[ԥ2g˦916TԩkoY'͗6u/;l*˸s=8C?O-s}=sim 8_W5뇦lPXxpߺ}ױcC,cZf>;c}:F9_济x7,/S[JsGbU]=9N35:%su:</ivppBi5-]E ؇e"`3th?z kAyG y2x ?\*}Ӱ<7|J>z?q̀pJ^ki+#MEW5d *FHSHv !˸I gIћk]awO>#7QHaFHV1>z_.x%?t x1]*ONj[{@5kT]2Lj 8;]*a <+ kJ_ oq>X|VMtE \ -$)+Z7oٹs?"ջ8E*DzjsZXhsQes%.q7FI+`姮B]! ) $]WB]ʯb[oΒǏ{O/๋GZeA?h"hƳRu-۟ooGɺ[Ǿ#8VCF/z_ Go{|k=rXq~% 4U%[J ^z6+y>>V½F?|rRhm4bhKѮ ~%(Wïi 'rA=ZZJip\4MFVo(? HP}\$ɧWFX*v.ԑ Zj|;d"B2&,$y;($oB2%ԋJLNbR)n lGX﷯Y ߾zW/oJoJoߊݴ<v㑷sNd uVE!^BS]sd&.ewW(\Ce,//Xr$Ź^\*wp:$m)Co?]K3F҉tHF|o=1EΧ^Fr*AYiJ%Pѐ3~dD |KG6qѡ)׫snq#r2GhmVn.ZJe.6(8x">q ?!ƞcF+a˵;*U0"hn9q =Q%k+' 4mq-|!L >w_F ю!FI' x g;@t_3Xҥh2b]]Q8b.!;tjYv!% 5eܗ.4ya^0u^&/L]&/L.L i~/Lb8+&ϊΊY1g#Zyx]+Zy VqE+ˤh1(Zy{prWVnGX ISeթ`fBΫHzԝsk|ՈaEktR*pO x;&O P'`P=ܚ?kx>76u65\I?n+Z{#^YI-zAW 2aB1/zyzaU^HyzA ªdRW+HsIR"9$`3I>\A3 փ+GF \[2nN &xBVCZ#0vU=O5F/(|T = _< w!]N\A-v= IlfFWY`feZiF^S꿮7]$GdYñK]*.d$h)gy+7#f^GuGaTWsTv:(ru%=WRJjԴbt%5J7J[vQ3ʯCA١c8/(&-jrTA"nHճ&vk쐫`Ӓ̜xճcK<;̼5]M{`zvwwٙ;;LLgi{www{g 4zx4צ%[4đ{* "Oʌ;R*ÿ>~~ϩ*oSUooT?~?x? O -'dž?[`OK%Kݷh6+iR} xꦣR[ߘ}JxMKIw2hgi>|z{𜂊W YrNM>Ŷ|߈0{s4)_.\կ//x\\\r _IiS䃾 4M>{NrO# rOJi=+?)L̀mLb&ZSLrv!>Ϝ!V)្W ?]JE -Y]*Ï@yRΔ2i@=Ooˠ-4l_i9m@HK2#>٧ȯߓc[{Tcuz%ZwH ӟηW G*yxBS\4]1Fmm#V=%WL/?|#/5ZК]Tl7myn7oommF:BpjaѭJ>׭*tk`R[{a$a%(Sw;.&7;ZՒHZRq?++oH>RkF l~@-U\Ǣ@|o=Dg=|AY?)5NK(| +k3K=| FFeOH-s?}FJׅ6 -Mt4lЦa54lm,#^i6 }m>|Msy||Rp{> yWs'#Z}pz^]~*:'n'']|w\G걓\* DD!uM@#du~o_|so_.'@[]nT~rr̍z~ 4K ɟBngayTaSKM6_,H_7-3EȤv# r.~cH=\w%Zh ]"8jT yH>z? }6G12==Z@#X0XMNDk37VߧkPÙ4u_b"!S ۠q6'\W&WjJר˕z0YC s+Rcȗ Z+VrŭJ>׭:ߤރ/n4"k6+D`%> xQKYʝ [3'U$a^{0|om%q9Əs@;?;R'UXĸv޾z5ZHm<ͭSB+vOB6i}B4Vc{A { Ha4y #y0<F0_ Sx\B].:&َFUoZ?lMbUBR6(R$o$;t$U΄jgڟsQ9:m-t\T e)@!],9(向-&y&-> Ò:uuix0]!v:gtfAD?'#c )7[˜40Tnu۸ND?ڟ -p}+@֭BُRSmZڬS꿮kyMwM^$}$5IxMwMڼ&)I&dH,+玵(w 2oB+2uN2xZJ=S8:|G|1be;+-?Qf"b]&->o0skXyR/~tL@ME9r ) k/]JL34k `dNi뺕Ek5eSj뺛]>.guJźx!ո%١˶?ATA'f_>@ |j s4c8Ym#x`E|7-ǍqM4o(/'GcF7Òp;zܫG.GZ`iHkMޑR. cԿ'Oħ~@ %@%(V#yGN)R$ 2?~x-Kx+'qd^.yw \N3[Qn mjfֶd8 '2m=DNJ Nr:_:UatWEUw򁸪pBU?|ݿ9WnT{&a%V4BV6'K7sj*lWd#!;[`6tleIe7 \/gzzN>gÆNu>Ohvrn!;6f֧+i+LHLffVrd{tiv~4:wjg{tYj&]Ε+eKq-L-7&CAth[КH'afVITY x| &T!g3[JR=Z&N32Ů6WZ並+-͕v'Z9rȰtWZ$|#WZ,\igJ!$QؚS)kTgmqʳaŽ6$.elh -+` k͈УF+z9ۥD(^2: B@S\LynGԹ[6-Zcv>+Py>ժC*?h7%{_檽X[%ĥyß^W])svO93̔z8ڟ܎ %|QЙN>YTv)jq6-]Q]ze_`hX|jyo_>iVSw")|???Lt# OSWyw|;xw*OSwj4x3?+G^[#|a—— ×_¿ǾWc_x;/Wc_izT7? `c/]-!D_ 4zm$a3<1|ou-u9RcI]-)gZ}XR{зq#z꽝|Rm| 6N+Z{Rh}//vH f}'~O+ZfO(yyL(y(y&y,(y{7%Mi1v]?e4J+:n]^q=vL:'r]Rn8j8s 7 zuSL>{kp.Y\d2|^F~oUKJ;QxP>3QAjhg^~RiSr*Tl?(ר-tR|)+x7+:kL`-kbM]- %&.8@q;ܲ6 `|֬Din1;HR~F;@4AHl5Sjpgg| ӥhull~/W qv4&O^UI'3O@_' Pag9Qi{"Dj)T(Ҳpj &]p=}݂z?Azx| f uRjkբhb_')5tM-M+J8w/4 +uע'>C2[红d8 F.ݑܙWe [{u}kJmΌ6sg#ߓMAGFTvȉ-uDgx 'mM*#XI>JnB`ÈEo:|2Yxk#V~/)|`T-Tؓ> z/d1^4C4u X%e E$ x:!١{nVϓVPuW1F܂yQfɢxY.]^~_uvjFDgO_~ٞj[o7\d.\襋|2.]EtKq"_襋\ȯu)Tj?'|ͿFE)IY.] 2Krpį*fǟ =te9ƥg *M(IWWw=|%%"ae(ElO,u.N]]1\q]qB+KU? Y#1-Qz(U Y,so?'[Qx3/υvE~Tkf{}uEu/O $9Ҝv^MY$p˟동NA658AQ5Ni!2clP.MOBd6de2F9tdf2Ad2^2X:e2^2K U.껳U껳UN껳]UX)7,7}p%wdh| f~\潎?}Kyx=O^}}G*x?uz}Oݾ>u˸]ss)/޻:uy;QFnn#ԥK2g:cXf 䵊nF)jķ=&srDYj-o;wźx!UOW($;tY _<7pxw/3|3| _< _0\L#r5ĭt_N]]B . »ww . *׳gnp}22vA{yWW!}2;r2q.H۩}~enG۩ԥKU>sK_tԔ %m 2[re!57aKCv*tYnX(EjO"ByI#5OXp/tyVMծZwZZm^Zm^VYvjjW+ a5+:sX4uz $5ĞT>Yv W%!ٗ.GpG#>#>!%?'%?˸S=œ(ݤY*0cчcQá>Z>rE h9a(e)SSH%Su:`;aÈ)o=1x2eci΋y8?{ tV`4>|wen(BFyMM܄!U~FyMI |P捻tA]P. ,v۝H%ffNlݔn©!8K Bf-jFIf? EUWuv(vu ٗ"}H R6(R% i~Hˉ:%򲘼=)nXר#%lTÜ$P.EM vST y+T ZյMEM2|MŮtS1sSTh _7:ոռVVVkXkXkXa5a5a5~1كQ<^qtیźxbF-6j'uG7\4eW#nqQSq_:(8T|2pJd}|$^r)u|y8*.w(.ͫkgc:*l? (ɬPdWp0#wPeܤ{-|-ka>{-\ZxO>Ͻ{yZXaȣaxٰ +y uTt_k̘xd7.W>!JC(rb{_v*tl_1QCÁAoo7[I6a'yMXoV5j'=}xa-[l qߺ|V.-dղuPnb3zɁԹO{>%.Ƅ%=Qeܩv64xJìN3(,U到Rދd M\˸I,]4],]3-]=K-S^tv-]XVk8^+^wݴ+SB^PZ`ii Wl7yd.'Y}iGڎ9 =u0roas[rB[JalwsIH /.}=W*eFId| /ֳd!D_ 4WەRfc]5:( v\,BLoҁὩ[DV`5tj;:eNMS %$ۏ+x|jjX[j s"$i冝2[Cni>MCJCވ!ocuϵ/eܗ.w2<#-!o[L[e'c/M +@gN++_ҰZXS޾PTJjƐ]N]**2-e܏.Yť~ ||&`37#$ysUrjȾ曫It9'hHZh=!j΅Γӳjx;;Q=z፰#g˸IsWױ\ڧ,oדyzVw->R1}~_O .Hg >Vܢ3v>Uͮa}ZԀߏm"Γ+ ;E*DIF)G'?m#UHŠDUIvzqv ><[LéХe:Q=S]jgH=fU$ty>??LGx?>!V6???33|~G d? 2OߏJ8}>At<@IN>(ǃ߾|Ƿ+-|8`pV92prd{8W I(d y{L/ғoY-tc@.|u|-o 0ۇeDh]'|Sη$6ˈ4v )5?OǍ~O܏C k+uo_ǽ~f.d|3 4ICnr3GY~lfcs3]))xSΓ+O &P˸]~.[]'ⷋG)f|x.5j9n"ٕoW/4Pqߺ|6K$Rv"CJgFto:oQwI"B=O>e;p9/&]NN0.mgT#H]| 9yx?"R-ZH0{B1ô:]e 6`kBNqWx᪞ls[.M`):yor]Zv`u^F:}ٓXb6ɮiv=l!٬ CIC?AF]$Ρ9ȾΡ翇e܏.ǚp2cfpVc۲-Q%RC1GÅ&qNT]+n~l؆Kk~(}S9+Ku|jAw\ώz.ݝ SZO=K@}uɟ F3QM}ˢG4{F8[zaE"nӚ"C\ed[Fvb{]R3/t*l'e2aE?ѕmTز f[ؓa*$~|#`nE#"༧+̠IEOH ' B(HuZ<9|rn;Ww~ ~5Ώw^︆15k~u 5E{y{o\n{z5EŽg׽h]{V׬.׬>?fqǬ>Y}\5_g)[[ pF6õgS,3k 45#:)&4s똑rI<)妽N! J<ꙂI7݃n;p,my}/| _>~ _Yȼm^ePA`=Ocjpn}.2ۖ_u#@-[@TNB֨__J52[w2Kf[Vx"6~?Vy2b[\-sa˾P?ٲi/oc~~lr[i41Z/@b_/n I>X/n2n) d;|^$n "Oũe'[G3t-ӢJ1p8de˽H%|?{-R89,e"yнD,,EJM9'?Wxݓv݋&h򣧈&aqPNf(w{&CNp;n*)o;ÌӪ?n3{=DZw5l8"5zB.tUO> wA8w0AA;&p PIex],ƀ>{9u>.O.8CeK7dQ@.[Za,~Ἃ;pY~-ܭJR{^[-ܭf J)GX__΢ ([Ty#,;4<(&[#, GN> w2Vmjڡ+˽<)gDafmqבe%tAr=,l)DS:!1׵2|,Wh5#wxmje'˞U>0MTB6ӵ2|`_qV#>ZZ3ԕ=_SdBﲠsvMg̖]["C\eܗ-ɦ<#wvnd#灧\XՈɔ5jhU >&2+Z^mk=1#Dktr:O3b Ec-N ?5BԕOG?F'QlAȂ*|&,v'O ~.Hq-L։C?rө' YPo/B[7Tز2&[`f*}0+hP8Fњ`5)ht 6l4IFm~b7وm3N7NU%V`zEZNxRm/~LRQa$'m;l#y&|1kT2p8jI4S6|e'_Sn;l{KO&z&mMĩe%$M YP"*!rNMj9żM+>ϓnXRSl)鲠*g\ +!smes؃1sD#sP5UÈ5\땝r#I̓ %gw9#CNDDd,54ӣS[je"|D'< >C;~Zo<+ݩ YX~R-_y=e@ b}sJv+P9@(2$U|m)otءϧf?ؖdA5lcKVV1 2!NUprA!$ C ݗ!/Z;m_]-e'd+#S|?ڬd}u. FZ\mJwsJfPr _F "q#f{K.)n MWnU ÌSNC. 3[p @ZÆdx̴Sn,ߖVcx{i'գ`fw覥=;Nl9x^l-Wg DQ{.ʻ!LkqΓ~V#‚܎|J \ϓN z9E& YP< 봼t_9\};lLm -X%5HiO=T[v`w <L~B*QKlk3VƟ1aOw$e-jp$H9]N[5 h1]V nGJ7dy8I{M,|7kq >puCm)e.j_mLIoEf[c Z/oEbIB/l8 i盧 6Yv`Nqvűyhmu'b }E|m-C2}NBAND|겠VdXp+dMcV$47Hqvi?hv]~^ƟAv8t9#ˈv%w%*+ټ+Y׮dbWr:)fXEcE0$Q0Hz0kLƵs$D!*5዇3bpb}NT ja (+\@Ӽ6H d2f9%2 Չ73 NBlr,8= s ߲#8v*LXߧn\tGuNw(6"lFj%+T|xҹ0(6f˂=xp-my Li_50-{`R50_ Ll /[_eVl}}RV֏vPn)W;G;z~^ j)zRc5%C,MDP&|;Y #{2źG['2C>Z3al-t5S/2JGW۵)íBp7;rؚ+íTp;S^Y@>?P:?BZ^σM)yስs s=V]kcr×1vs2I a;S+oۯ/~_oۗo~__7S'/PdBݫ͍}7g3 F.!6î>ώ?Ͱn_z](h':żQ;uEHtN}55-zM VSp] `iZY1-, 70 # _Ե-<&4l@pȓ?S+"RdOv-КSv5]@C7YqH᰽6kIɖ(վڷTQG(վRsKc@׀4 H5 _RRiԠLK^j Zjbb"/5&/5/5R2 ~J9G(%O$Ҕ3qZr[=*Q ù2S^__\s)Rs %皟~.vzq4\ 9E& YP%/L{C89>$y`f>&P/r؋g@A7_ Œ|^n2E?穑 KVT$a˹[B]wﳜqO0ⶋ4ڃn#gK ~?l[o—]'Qrr(U2# 2kOTgOdZ;N 9q?7_oK[7%-?oϿ ~ ˗[ _//^=˵zk,uZ=YVzk,Y~z>.F^svㆣe;HI䲇2a]A.\U FՅqNҽe)ut[:܌ũ0b'_-]dA'ų{$vM~w\Xmb*-?[mXv¸$RMoX]j Opd^ [ZkyEÖWܪ3kpyC.g} ?sϼgn5UJR?AaeN_Vsd# (! f#^}!N9EfML&@D2><Ƨg \I]>X&={P;{ZgDV+z~oZȖ^oţvJd6; E>!~WOȵAܝ՜^sܝDJ9zt4 olrӝ r?#g?Rk>] kV~aAx0ˇˇˇ^>L^> ^>Ax0y0?./DU- oMCրlVZ FۗXaIjEOC-Ll+PaLz&-aQM6(|lJ+6F+ _YJ<;Q=yj3;=Gir2xR++ ESk7|a 1|a/ 1|yW/ _>7%-fO~~w_~~w~n&M&M&PnM&M_<{<*Ͽ_<*Ͽ9w×/+V]+Z^k (B >D8Q@}q5|WO8$>$ 1R&۾KOHaip :S!jL/(aÕ=gX%/4jX/j&+3N_YF/%{)Qx-1ZOQTiFZ^$EFQI<6E(*c___~}ï_¯¯ U;Z|-osX9^sa=5ôsX9>ry:w;Oӹwy*w<;O?;OH`6wvn@P|,h;A{=q܃uA{P=so{P=}ۃ_A`7ow? |ŸoK[7%-? | M[?q52ESDLA$ I?UURQdH+ [N$λ?rvm[X sUd5V.ૅ-p% |^.^h}x@Ó z{`=0큩쁡5i?{`#JmWjJ)Z+ȂxS[wj+Vr_yw#n܍ݍw#n$n$܍w#yw#n$܍Y h8XvdVpd"z Ênדkf# L.ǐ?̠JjVDo\}xɌgˆJjIG' 1♕!OO[we[ .g̓N{нn;3,cټnavߚ^w 3|cS;cɧoxӫ bquD$ 9oW 3 ^QOR|;aGzbw B3JάjV#z<aM*sUa{%Bf5Dx͵:v+ݘZ{V$ߩ5XϮE- Y-WՀRs1g5+*O:r?;]F܎ۨS+g烦*fy++bAl1m>WܟDUR:}[p\Ȇvvn#oEM:rƛBmr{\s{Mo_kh GX !A9Ek+33G>rF Q֢jj=D$VRP+||?^X f6}>ZB6l3VdpGtJw6Y1sV^nQSOS&x/%C_)GXtZ P!B{y 4ZZ Zh1j}7A_MPMPjnJMP 7A}7A& .EYˆnTUiyFtIT+ shS^}PS!_f]Mq9Whaƫڸ)gSx)sԜg? 2Փ>׎\Jdbiy~ϩ4jkmG\k~g;7W7}?,h7[E0W+ZYF=wJj=D_54O52ι PuSp_u] ) t/4+F#(LU%吝Asr0|Iܳ@ F|vl5[o8@\ŅvO!Z a>߸rvETe1L]2SĹր/Gc.ty?_Y~ҏ ?96g {TfUZ16jk7_"}_&u_k|?(M-˝6/{)GXt2'ae~ꉗ-=%73= (pz)DE " +:4\k?͈54T F\'WRk1*ʥ ϓ._l=، fQzI%d;E Cv GiGO4[匘0tOg]}֖ ?g+)GX/ڌ|lu{\ތ ތ5-XS gf͊͘=XSڌ{3mo{36x3mk%tfz%݈~`" ~3d{='kh5g.)GX ߾߾߾W~~o_o_?t1|EP<㜂;F0p _iwGQ7^X>.g5ķMoO\f==BQc yTmx! 4gZoyjS<:,yfyuYl<;OS uZ>:;ZFigi3#n4,,{;-jE\m^gm4p'gJl4p8#r9pZU868k8e vtOH{p 5[vrcCWp  fM×(z`='ޜ)(k@7-Ӿ?Z[4?' )GX 9#-[MNxQ-|v:l%HPlDؠ.L6AJ>qN:)0@'P,|xӵ|%^?QwZ ?K# 2ZV).:#P_[.b)-S 59M-fE Ko'PW$s?AF hಠjSۓdAm|岌ly5ΓaCo?sm9_nȂj=,+zjÒmT2?`t7ͶBd#,5l8uu2:W#YM3ʼnUǁ.ao,FXrqԢ DX 89KK)ka|b9 "Ddr,q8ΙV F| b-?8.7 LÏrFV1lF2D-#׶y&vs(2!eȂI듐mF E ˸Ӧ_6ͦbeeI< I& mmOHˮΞ=|,~Ҟe }3,ULɖ3gըQm MXy:I=OORoIS-'dA->J]vghE;]pHql9%ٖد}uJQaNauY aOZ.Tfs'nK/綾{=ʼ/^dIq-Vivft{vi+*mTآW[ +nPZʶgV -gN7Y\_xRmJ?n^;2Kdp}ml;𰥐-=};li}]}l\}A5{4c܇cc$˸ɖʎ*a'gw mq*ϓ١6F-.2 "Stň<"ǃ,Uh,c;g`vV^˂ڹR^+=d\QaL>pAq-Nn vp#wvmrFT АkSm/ ~#I^B r)'5(|Zm^ړ7JyQUJD%_qY0cJΤ8 9h J;FoAF8WO\xְbӀfCim8wp ZC-7o_rVSk+?rg%:,DYX۳{1|.gJE_R!s S>c1ƍOw,;kV~btGg'Ո߃}{#sY8Em.iAhN ߹]yH{{5* .ȯzota}_~w ~0nuhkD5# 㨝E&_ꌱ4tϑȔL +'\+bD%>Bjx-njo3j :Rk?C=O'7'y¦s خ5[rwI@{8DdD=]Nh0|bg JȈ>R~g7;ïo?CB߹0/G((k' unZL:ٚZ;N\C3=lrր/#_vwywȷGg9 _,UD?ڜئIs?,0>-=C/f ²0Y2d lk W:%6;eF` ϧ ϮAprz &V#s /Y㏔#%mj@N9GKaD:[j#)%fzH7||d2"j!Ȏ] ٱ ~_ozc%#kŸEȾ?b9K-WMH#Put!Ո_;p*3>vh{̰Wiki+vw<% d1'A+-OX)rF-O8ao~]SNqENL \B:a4Z8a)GX/Z^F~QluYPC'}#%Σ)emKUz4(Q9X!TnHCTŴF!=\!_f<Ш2->?uΪj%V&Ċ(0h3P F~4.GX E8{.Ol}8 ~s>!")Anq kZ'oրv6}g ?K8;A`aZ+ Gn{Qs>܁(7,Vjv/^4"ph7wM.v/n#e7D#7uMG`c >p&u'Jy&]r`=f#ȹ;O4vsV F)Ԏݜ?Yۨ0D?<Eɖ=[NC[PAvk0!"S+AwoɶdKp MwoJ\L %JGA5QaBI^ C܁(9RՓ!-h=N-$ p=_=ʼn?)ѓbj#Œ\*W7jw(N]߱j/R a-5=/!GҭԿruHmuHmi!!h"c"CeGa!쐭 &g](;d+ZCpe$3(Z+;gE&8PSǩz{xV%4O{p흪Rf3eƸfˌ~?lFe3یft6aƸzʏ;3yN-|E dI,)ۢWPE"Y}l6%/=]kFF,mI .=Z khҳVgvR%HBĊx0,xAO=/RzRbo9<](2i~"=Zg72ùt}&CNl[X\o-,5@p7꾯!Z:M7Bw7\R^_T6u6u6_45eu6_ 6u6UHq_JjѢ){7E'jśq5v Vܺݟ Ӑj ʊ$I^1 zUl6wS ϊ6MAYt%gEXU&Եn9KyCn9O\ 9r ^"I7|iq(\7Ր +`U*HWIjW+WWëXC.W#Fɫht @SIg@ȅ-:/1A0Q>r|Cktg`AĘN]ÐQ@MYFD.n'&~SpLa|^UHlƖ?e˶Ů-RrmO$nE-΍!NZ!ukukِJ~-m2I9'?' IqR@=7{:W*ƕJ=GhJJp&+Bj u[-0%Wb5% |UNcޟ4?Hw޽ S!I@OOQSa c]RCeK ,M;n\EHw'ݟe}kÿ_R+%t߇_|G짷)d1  6d2ds/Af8w7ۆrszr,dõquoM\.Ӎ#_p%=PLO`%zRȁ 29H@0%)GX GCנQP5k_þu} uUa__/ʇBEq<.gTLE\EQ/ZnvQB.Eq|t..Cm_i$Rtfxr $zr-JqïKWSC)wtu|e$5"?鶦>m]3]=Ť,~o6)_kfj|1;#Gl ~?r8|)GX_=r m֝,Ij)jCC\څC9UVyuވY 4M֩R)[1SaHK~+tl?r “mA_ /[&ݹ.Iq-V6%'lu gku.H0s(|2+A0KﯢWBUWQP*hUT*WQq)Bn( 7#$Vl߅;2;OOm2Zyiyċ#嶈"̐_٥j[Ɋ8T_ 馳Kw]ne裂 64\p)Fj [.goU8C۩5< .S0Wsj se8'U 3 P%RL蕨oWyfs2#Y`y^RPm} b)Gp/ dVsL֪%'{Z vXdr-b'Vma}7_Qd'G-=e0m5}}n~Iqߝ>1wntg_]/#|9ࢯc>d+Z Fp.zc gŲ&=Ě WBr [ٓ_d54b#ݖq+{nz"(2ʔuF!R4B;uEJ4 &[@"dnfDќk0!b^YM fp\Ze],*ծbI0@}AD(Y& F\C3Nl S"o(]֩zRvW%uE}[lߤ;l[礼),^vLDr $nR-vV#‚܁վKt2} Gdʜ(} 9%9՟.W܃+Z%4$u{6Sd)kΝ//V&A680۩lxAmx^VqV,qv!Y;b)GX >Y$U鲸-9IwW+ZȁQ 1+'Z2eyh{>U'[We r ~J9_*;kW[!\`&j;%(Wq*L%HR%՘Oޡو`X&)%3u|*؅M{yǽ|i>^5[s>1# ɵ6,ku)]!)$k\*bՔ#|5m4d*y\q+,(ӖJXY܁odm UWAg9`z:c?S+;|dՔ#Z -r>5&PSן,C;uE"n)W;)ŸrO?Jr-)S)O٪ xj$TgEjC/}'x=ce:ązȆ)GX/wyR=O+⏸}agYD}y%"Ć""]Sk?d#7z"/oAa#ҿLÖSRk:G)GX/w f B$W+>l C1=cM.bCo11ZzyH*k]^}Ņx{ȁ$BŽ:ȫouɫ_r?9']Z\ ߞ\t[_𻟜h? 9pO.WD`9E&8PSص,Tõ\;I+]H8n ח;^w׷x;#oV툤PO"]\'Bz$e>?;;~/C:L9 UG) W~k'$7[ >:bij ^ 6~~^{&~~mMx&7y}ᾯ}//}y}/ÿyȰBpdX!GF]BZGFu߅ÿV rdhj c ?uM)x]S5_L˦6_6)67US<*:i1#_te~ߧY§YO4kii~f=Y)GXoiBCt?'4 m MxBۯ 6OhsB;~?o|QJE?a}O(VFrr50虂s5E]|}o#}m6Rym6Rxm}/HF藝G<ʝGߝG%/'kZ-"iEK\X >.ďK ͕ 6IuLp2eE'ͫV%f(~+Mɜ=dNdNdndnT>S::h= O*]dƖxz\m[-זJG--%{Kl z_vDmճwFob0S+]l᪤a+mdAndNFZldr 8ȴ3pjj72={ZgAM}˫0@'~)Kn^ao}۷oo߾|۷_}^Jۃ\JwZJK{-sms)=k)=-ilZtDX~OU[!WHj&r5i|Ru^FT B>FF:8Oܰ{CR_iN!#Ky;տٝitXS$J=t ߸{H&7,M'\C3=qRI _y\z.)( @=j%nJ-% ꊸRHi{um¥n7|3S+3>+?k$NXDo}7ۥgkE tOVR+P@./(ѝk!_KCMZĭS+?Q?%}NiU_ Ju\kqJb[m6 rY}R5! }eǴ6b[V:5yf>tkj[l)t-=Hé˖u\$ S?9k;q(uL;/3enj^2cQlޡ#tsיNל~tN(;l>i27e5e|O<~ه'UWF"-zJ])mf9Ǝ3MP!k&KTF{Pl\Kj 0̒;ɾ=j?(S֩߰?vB wwW젅t<'M͵=\ 9:j5W V Y܉:YR+WJ;Qen#\4R펐q%ڵ4k܎D@܉KkX |Tv%/*"nW,1qLp2eqɞB֩yΓi!y@e~-#֣[ŶX5F}ٲbgn.[f8SHq-a~cl[ҖC/|Ġ###}1(11눡>bP>b# U~ĠN ;xՐu^G c3SЬ^O)ǐo3~nDD.3}cMfOZ71|SSg'-v,T 鮜=wodwzm9O)--m9OƖZؖZ~i˽Dҩ}}ZZKMK]^K^i^ -kXhoWS\$Dʍu0 61|CNU.8=V .9E ˸ɖ_=oO/K$gJ-A{OfD]pCA5=4͓q 8?XWwU/E?ޤUUγ~geܤKü?`nWSUAyѦT_&XRC[%RI˲jlYueY–Uc˪ݖU#˪mYu[VmY3%k&>v5RB*[Qd%4ѕ2E .eA'vbU~~g!srw|GV >??d͙\O2BZMxRy(~+oT=ѽ"] ^*rTf=:3?Z:/&]PBt0J.ΫT #2$U1lUGPtY.qG]c],oU<+H0Iok ÷5Az>Ѝtg̶ *"V/A\[Z* R?(WLxs15z$,]/ZֈTAd ϥsV?\{Ʃ2vMjHBpzB\mBRMbLs'"7-RIJuR*RIOIZ#w\IodH4%FN H9Df8dn6Bq R&M#g|O/즔>nm@7;T*G˥N *GX L^fM#Ȩ$;+*d+IϤAFdrU AFM*2M-)RH-l\܂|εF#vLphl$uk=ɤ]Lm(R BET)MģR? W(m:a:a=SAwR>}DW `ԣ^ԣ'Xu\.I]N,7jwlj.˶+Sh+mR ?>OoBnW+.Ɩ8ح-Ɩ{ G#{llrK 6vdcF6vi/_?ւ)c-FchbcGv+ccE5v@g }u6_bL+jG)q>[1>sS4X*hGXS2S7S@ .(&-5f5 -)bݮ 721Xaiaḭ44&/KcKcҘ4{i=7=Ǯ=ܼss ~ϱ+L~{&!8a:!ںR iT/ a1*hKO@["%oxqTgu$R"#׾:¾¾^ z;+} VfU|#:l/V >KYj|E Kf8+ޓ V\ٴ678R TJ&G4Vq>z{߽7?_ }w?)~ѢTC7@x*9-YʷTփF5]e??H}&_w 2 1U31u_oR~ydȒҿ'IB/'1ި7R0D簗y<"C1\j T#W2)ˆ{enya>+eSWk6?+߬UtRV]*By!{!^BBPx!{!t^B}/sBEN* D4>ŴLK-pZW#7|+qoWk n |\ڝgʮǍ]1K|_Wo\i@y$,B,#E*hT^gϚ鳺\$r޽V˒!ߓNgCb^׬KAx.[(ex;pug$tEVG?\9Νˠ+t随s:R6NJ'N\Qq;l/ M<_URׇ az4m^vcTRn*K\](qW:a%;9B?g _ZZ ~zO6R[W#mh`h`hт11^F x3# Cc Êibި4><8t"5T Z; ƙԟISY"KϋR|FV̕5MJ$:qe]jfL=b%N)D+t9Š W񁈯S &U|J/ZO#h?-{ҋ@ҋSE%Ԑ^ok)ե2hCf}y|5CɇP}:l!T}Bԑk Ǒ|`yPH,Hi| 2GeYb7-4*֎r`cFuYqH~$K8쓏3g8Μ3JǙ#qf ǙLU(ҞlmZZeVR|FdHu>Cf'2;8d!!sx!o!Cft"r/-\D&@L/g_4Lb 6CpRپ?G𔈂g=' BX'9 )3M*9 QKT\>>ҲC0|KD+\Z뮝ծnGX#vk$ηx~N|;_/&(GQ`K=N%6X H4>sS[8 cK-oTk(~-T|]#ѷ|έE*hT^5Zrޜe EX;p }5M;jJFS=YaBhy/]ǥtaK-a#q{RsNVى1;1r'r^cUvbNl. S912˵39/392/jL3392/39/jLgk5| llQ[ΫTVeo "k˸I1uڡY6ħS4Lj+I76];`C4_.[(ex;p H"k괁gM'W H>0=YeKxfGk9Y2#KG2 HJ;T44ߍ,b0&nr5:O}M!O]ObB@w>!db'D o9bK3#FDG2>1C q'פ AUЀOߐѡz264BBB;x|U/l J}ot9ÝJr8ljìEk|BTSPsD2ۤ C1^\s>Jۜ\Hݫ= dJ ΫTb:Ag&;&Dz֎i$8.*%3]jR$Ge| *?Z; ՏqDQs>Jm&v׷L1݁6mӷۘom~m)$*.,P JUjN47 ^l+׈q_M v ~nY0ҮX}>젋(q};wh2*jqRiZi;R︠f%Yg|mͥl*h^n.Uz?j@%d ጼ 't2GXa%h$yNC0|soѭ,~h2'6K~9˴;a OP)@ .(WOW-)bKywƉ ُZ;m[XWZKRy({ltu ljdw#R[?qFm(v+4>nLd5;nZe._hPDjKh̬JV[iUh Wht#~ P%=h6FuR 6$[s9lCZ{ru:ľpݛɆ|s@$6ObVBJ57;٤kfoE*hT^gS e EX;p {I66_(3ur%ΤYu-Y(m&- CV>g` 2nb 300U[ٻ@M Q{˥VH /k;wYMja mZC,RBf64UR ~- B _ PB诅0Ba!/BWExg.yfv_=d_qo%.3tiM b/\{  aplEwY&U@[Ke?nɭAhTI'i!8.5§TTe |JH SO}]GX#0|$%e h5ȩU*b&|<__(Wj|UzHV/-ϬڝFx5IOjdoCN:f2&sysܼ`cnfcn17ܙiҲ8qMtr)-1y\j唖z/z[uYiץ"'?JerVK %Ī F"?o7Ԗٴl-m-&o$dL zoA?} !%x1 ItĂ&U9Fi?N((;iy實?{##Kup f g{T5&uM*b}T?.Oїe6eĸw/?o7.GJ2ό }i]| Ÿä mh,{T1?@!I%<@h`+(C^&W@[0+ϥ#9׽Z#(WAR3N2pѰR pvuT_8EbX(Ezu_\1, 5h0:NquT 1{PʫT@@>P^-| /gey@%g폝i(NI%_C,/2z,/Y\åƙNAN7W7!ޓfRom=}VRJus..?Rܴ_oC{8gJ7W^7WQ_79Fϋ? AB_| }_ᇬ52yK=D<.>ޟ\J}@+1 ^R~ZrouTIٴpp>??WF% ɺ P]P*RT] dq;7iZ2EwI(7RP}fh(J' \E[1WfR/a&<#_L`խІK5Rтֱ<*8 ~:6>լSh]j+.oCcKe%Tq)Ū] /[~mLh 5E1. (WX]vQ vQ#!+?tnK kZ._?{sqŽ?WXǡ.Xr2c$×VT*oZ_@ w#_}!^r3DGz*e* kP:Rُ/{wd!LmU_#((NX'R| 6UI5\jE?oNJIAID'kjʚ,jICUEjAV?师030'J5Vrdr{̟;{;p`$ty<UyˮaB[[&@$\T!LbV_P' KYGD2IIvN'S#t9&U_UM= .5Oᯭ>!k×VjeZvV_? R.pQap p5#}*yh#x<ӮL#~cտ-ޢn6Y[ ~h6[ >MwV_FJORLRQZ8RLںmv d~SI6sLkLt>?a+Ϛ3jY[_L>H-6L e:a{Ίc)}䇑ާ|9EV hV)_^7]*`CWkHt_N<~b _,ۭ0ZMR'OS>N+bL=wH@W@`4Ha|ՌW3)ܵ@XLaಅR~׀}fĮak0t>H%8tV/qVYY_Yt>J%A -a?" ~#wn6>%,aۍۋä a sNJ3xL<<'33x4<<'3ޓ\32\w4  X~mz~33o~{p9Lo [ߏ×V𶹳sߴRLNǙt>JӃoMKw0C[b;-~oco.#]ߺ.5O7|mLA˳m\- _{_F +w  ]uM `| iU]5Z3/ϴ0+4%YJhGYy-`Yʚg4YErnl"?x9e)!>b| ~N%lL K5<'OSx <'O'OI |4y=y*O“'g#GVn+a/ >#vTT*]3 ݥVO2qe|5?7[E*hT^*/Y3h& )ךW֯Ex>4gZa@bty;ema[E2|K ä.*" j},c޽_+~{~cW<+U)^hʫT%kZ$+N6/ PT>^C:8aBE[CZT*E"\jmyfң1˥V C[&ʒV#Z_4ʣksGӬ|2V /XϜPTl7ͨ#I(wD|㫲{tn?9,{ K52>z>E Co?ko ~b|[*R ho 0+d垫' '[un]iʒubMv"uH6ſ]p]-:xKmZyKm{KmVR۽Roז–:–^[j [j [j{m-l5l/vI{R{R={R==ixOj=G~~3{&3La&LfRL_̤P\[~o~w֯o[o~z::d߁WEK:I\?B`yxAˡ5١ء5oVgdּZZZvh-vhMvhͷC3M#+P::ǜ=ΩR?(Wu嗧|2޴Rp_J".p]hU(iIkvA VSlFk"XI+-=2>{FHZd%/N[ IKNqOZ%-)ΫTHZr~Z27pٙ`&XҒwZۅ>. c c}0DžxaƟ3.qɻTe*:%xvMhZV;ӝP U!5ΫT(*4Sʁ Dzn Pt.Oh"Iu4:,ZC_ UPT-$.ͥ/,,Z0ycC jm {"W:RkW[jy($"ve EX;Nb&"87_|l)W*_)W},Wvz9=go[# ~?߃G__/O/E>ǠeC I>^ΫTYl"E]p7uՓJQ|p^m^Gsm|56$L: j?kls h>3lf-R:m Lz'=gCAw)5ymCw$T >{pqWq]z #`DP/.QdMC`[oc~bgG}y'BWuU3=,6SxR}xZu.ɳ9&/Ds(@!ާrʶ&)iq qf? >ce{K/Rh:VqP@G@Lx?dP8L c#AL)AպKzçt^2s!H煺Q_+\>@m++ux+2K@D7m]3| *籮_qŽ_-ESᯏo_}MnUm(ƄEdVp;? -QVL_[jۥkjo @@p`̍Ry*\ʽ?ikGPWMMGaTD3ҒFQkuу:4b1Ad?F Z߮q-L^ ^ ۵0?ka PoͨQZ|Gj| P Th -?fXl.@mv@'[@'[-y[-|[ehm5%/*ߚ3-m ۥ'Y'%>n0P JU]=Q'ce!%v4&oΤq&ߜIL?BKBh k&ewX}!#/x+_؂lAۂlA, mA, [ 6[- N>2O(6- _ZrRVJzHy#US1?3-ŸBwB Hg%^.|Ԡ.5oVbj&-]Շuf"'ʝޓg ~-?с~~lzJsJqEyT^幪^)R~BVozT^Y'C|m4Y~ljF?t| "Gb5>G?{kaApoXko87}湿s_r ~4Q{lq#v~?-?-R sI9ķU!f8,P JU*q痄.[(RxߑgeC1 x(YXY&)DLV]jW8FfRn$ YA_3Iw㳙45eqLi邏|6~ ~@d.%߆+o m|Z qX5¶-<S_x:y!& UrbMzdo7Ɏ[ !">+[jK3o3nK.%|&RW~8VaitgZ3x:nqK:nu<ӽ?똰FkdMû%yp/dеFv3>g vkdOd/soXHA|,TFrZt\I9t!}Pmѿd@Nf|BT/fR0Z2iPT/ȐS9@,/7"u&U?u S9C"|񿕅/OW Y$u1>! ?,cߚRpZ_*mC.Go/4UcJ t^_|7kݜJ"\g$| %x+]Wt{y[J/t!څt]%rf\ H >k4y{VI4փ|5\?wk;ObhJyJ+flѤlr0n| UR|{#ZzxazLm]@tj}jT.pPM*hP0F=-'UM /m@T*i)'I4Blx5?XyKuEokYk4ZS}2C5_q?̘3>G?\=+tJBYdR"֟ȼt1tJB*_t1)L ~pMNn|z H^R69IWeOOkv524_ծjulWomߍt!>VZT!T:cc3.NP !԰n| T/ʗJ T-b%Ж?wy:9Wh| {凮]RymQ47c_VSo -#\|EJeMr|·kց[(F.I_5TWM=ߔiU#wUӍDᯚ~fj_5ZU]*Gtngvbe*dkʫTRW4jFjA|σUC&5n TpgRn퀳n| 2 H, L_[1?L׊o?:> iP]@*/ o+$I܊ t*Gpf' Q @+v* +duon:!zXی_bU4iTi/2UWYj]*EX;p{?j:xb;~*w6T.nhs_.4><@vwm}iUW2jְ ֡1+b +15vǰI[(RA*4SRLD}Csf I:i >:A($M׍]X~_]5dR :Sjv3 麗> Tda+ˎ4oM<Ͷ!c[`|`|nyѺA@Az6>%i lsG v-NzҋŝtN:#; wE;NN2%NZ{'px}PX<)yPB4 b04elS */:sstSx(J] ҫ'P>FP]1}ih).40_p1TJRU*98M;`-3 /5*h_i5i5jm 0٤9:.4fqހt/]jХ]KAt/]*rХtiAt_O7Ktste:N7GN7G͇N7tynJN7Kҥ[%Eoi <ң[z-=*[[uzKJoR_o`O55σZ H'bg_u YR瑑P1 MVkq ?@akjh<0x@j-WVY~<:؝ݔ :؝J;CFlõL7۰VYH)E<PCy({(U£54~/fRyJ|:6eS´j.q *wrd~Y::Y_dF:r-,ߖoᏏ7-`+DY6`I* ASkl0`l0 6H쟩R r(P4^};; ;%ݣUԅxhjH^R#5# X K~M+ۭw_Pv]ݸvv@"ޥ&RwyRwɻԼwɻT]j޻]j.5߻| 8803| 0x=aq_zS>^cPU*SԺxZOXRSK{T{]LۤT@Trx8~Ke*׏))"E_\߯QFa(0 5 QGa(/FQrmrN}9"fvmrN}9zff~;~⎪1~ṟ'm3<7|}>i~~}.}c̞Y"Ǖt8R THx&ZJ I#Iu;³#cXۑt^‘,|$Փ9Av8ۇFQHlEj*O~aBhA%*InaT%L#XƙquxksqquLo)Iq7^DžqrOFIMO§ai| & | > ~+q=,C'9d7k!c%%QؒhlI˒p#ݒ(%QȒ CSǖ-ƖDaK-`Eja 6'[A<y(\GdhݎDTGY24ȶJXk W^pp%\y { W^…pp%\y EE9Ϻ(eVz{Qf%/JEE((5KAjF{ѾU}T5ΝK\ T jH[dG5v&5&5ƾJbI`-~aZ @PBP,9LP).fD3)n|׻ S|`ۜX#VgVK_7˸'ݽýNT t ֩SYZIu!jnIσVۯ0t֮!9|4Hk%5Kwݼt׽t/KwKwt׽t7/Kw65_Z-WQ+e)e Lkƥs f * pb$kzGiXKNRt'Yg}/ ~ ~_~o׏+ïo/]37XLTP\A0|R:A1UM_[Jhkv~om﷏߸ۻ$ -Hf5 Y Ydv idZ{E_vѝ_E7.E7nuvѭ~/Ewd.EE {I)L^Zzs-/s-xо$ɿL"wVyxx PQk\ƇqyNq ra\^k\}:mw"Ɖ`qq"u'X`1߉'hDmw3u!@RK8 H5'=nPdz^\jOW<R&M#7oGA*E4v9:>Cd8W{rK!~3>tTۤTcoo x*e| B*eUO1ؔJy5dz ^|f03g>3X|f03gmm-6G붏GuGѺbh<\sP:5iSU(SaZT^l"ak'orQd L_[n.:|)8^I^8pJ' YK[HU[ xW{:T! ~VA34TL"ȇ[r/"^/݊>h|+reH|+yf[k?.|!XjȌI94BZ.G- '"Vz!. qo : `؍NPJ :U&5ͨ*e!Z,9-ZU; 7rl=)`2mG C Jͣ7逩ҬKҝd. BfR).d مBfR Ņ &'n\nqFk_ѣGj^< 'ݥ:WW< ɾz"?6򪔩PAJux~r "ؐE,v .'AGoWP4tm|U?$U힬 c;΃)Ew7j:E  4a˥{yh4MKeowWƽo{ݽ?~{~o;7-~g t zyBmso*&bxzNh4]sKww?{ܽxoϏ'ß7-dO|}.amQNT7BmڙeFc_u&&6&嚘]"&&`ĺ]]X#aR;aRU’VCJeͥVK^ZM3ӥ;-s35Sf: ) _Hǩ2>7|X;_H[Z1\@*so^mD-| OKOjkA3CXBL!)뇰K%d9ZrL}(SaYT^JHJp6BZqI>9Y;&dLΫTm c&01&EDmNT Nj֬X9)΄[,62FηF3XåWI'5[ѭфiZ7N5n<ɤ AUXݸR ~;|ikJHnqvOt^lBgw^ ݚtq5od.OoT痦,yk2'+P ΫT%kFÛ-^RWA.S_Uß𚂰G*)Ӷmunv*ic%ϙ~3N^S)RA׹rJ5ᗪX0OHkYd.rakgXgX=,Z+,b˗ Y-5eˇ i2Aj HerO%+)u Xåh0;zhh0#zhGܣQtKNcD"i=u|)>B:RR }ۧgɶoLi[mZb?uًx[iҴگi´aZ״aZ0=ιObZAkt: ]%Q.CIv^*,3Vwu,I/\d'"'[k&<󢭵뚑ZlkœH=lIY8Ǡs vs,{_cOsl&c3}=>RBe.uɯ9+aa0k0vc5Jc9̱|Jot_oP~HQ^0KHr.i鼖ywvm=I6Re]VyҊR ځJebULe]$٤O Uvwqi4=L#k?1R55AցcE_/D\*lJU*%"n ,5-["U)Rx,I54ww-0v$| 5U]j[\3^X 䤗*oA4>ɫƝ eC:4X#1]ĩED\y]tɃ蠟jPCk[#1>V]^VxJY/ճU*/WRť&3ѪS.?Mr>L -z@ .(&-KWqxn-)b@Hͺ䓩u)(!J63)źXm?/SK%51uv MglVPe^^m ⪨fRU8V@dSmYUUiUϪ+?";_ [ ]@[XxW] 9ƌ΅?gY#(< TX.(WDeIL|{3F25+pu5jP5>+r[ H=/@_PU-T@Muk9lPU? F;d>P P>4MiΣu:2>|ͤ/[EBDN|#N)̝'yd'}h"\J"\CoNm0f-7þ Ɇfh߆fhaa$tha߆~ 0/bدbP0ˡxmuhI&l\=0{E[m KfR 6 V+{+e*,kי"J`iK o+Nnlɬm .!} <=l͞'v`Rj/CI?OuvRzl^W2B*FtBvh_Ks}ieؓRĶuʫԑZ1&M<"ȝxAxjleu6ZTڶ@⃋v[,yMre E/c~?nH ?r?Jbcm?V"cξ7;賑i4VPoLo*—%8If;$3ּ_X (0}EH퉬$z3Y N_.l?](e ռ#;@%_LsS2bJ|1%/F#¯JNM_Aҧ:|iTS^DpfH{5t&fe| 8|;rAv!(<!====(7AރArDUރ AI:mƒ.ތi>q'I bR *hH˥'L )#pXj~6+׼^]ϦW˔?K=xX#°KpT ?kitv1hLG4Dcc1,UU$>^T8RjơΦIfR ڪTos鞳6K+1>!D?A'd΍mR`]m.c1~ 3R_U nw>*߃O3UVR 1J 9T1> Ry_f,)wKwegfP4fEob|6., ) \.&U +ѺFu8^z#U -]3]\Ykbf\G\gc{ v$ viD˦_}J}|H.c 6v@0|T) | F`R1S}c4nc؈lĵۈ+l56m56 q6:q6 (5itĽݯrM?=~ߕ'GHP._?yNE-J)۟'D ڔ2 JKj+Wʨ$Ctx;pu3EI6"_,ea{U`. s.?rC\Z]jeyfճe|5Τ2vcg۝6敓U6WhO, Rn:wcf:oK.''${Sg1SKjǙ45zdlLq9o}fRl(7Ba(Yk^{ʧ^r^Lz^CaR_OЩ/ a/W- 6H* l'Ve*Wx3kHm,l뼌| K3)>wG3ΫT gR' L8G_؃#o-,1@ ZNx,pn7[U/.c~|c~cO~c==77v7ؓ؃>05%, e n0][ @F^H32>'8yoNq_]*ߛf*= iRyڛ/hSdf,u #!]n#2^1"9sHu^bHX#2(Fd&9/m9m&Qr8h]'7@L>_'lR :PnR 󂦼'qIһY8 U)SXT^P"xuOS!lL@:5zj?RvN-N=Nޝhz;{wj;s_Sݩ޻ƛOx:Zk& | &gѮg/M A=6>?4gAY6{0*5=\!S<:]yKT]܎_Rlۧo cڰ6;_MvХh ,$dQ}6ڇ]jOK[X#,Z5,y{~F w\"]ŨU(?Y$:;8ro 3[ eZn~Fnt6hF!vCĕZ!3bճCknOs~ LԔsSrEpENV%5 WGEw<\eM4(E_௢dyVY_ŒWђ^%}K^:Wae _`:Ĝ!&<8q9A<8l!k}يb$1KuD|Ϝ7`^|g}[``,|] o7;=apgw B ;F rg5Esh-+ݹNz\SYO.z>}b07%OKɖSҖ=|2 ='wwOҝE{,ZiOz,Դ'whao/\* e\@D`-HS]@Lp'jx$VOSNoTn?K}Bk*:vJn?4/߭g 78+I|}\;߭ge-Jڳr|II:.n@1hOF1 %eIMP8CQbH/bY֌IKK+VtrCq?w}۵,Nz?Kl{۟6t\X!۟"Jh^W!N'?pB<8>p*q E~ 9p*]x8\È',6&pX,Y,Cnfk bmbr8flNxq 6Q75,DX# )ˁ}B*}:ݏ^k_;f? :bB@haz?չ;Z,W"%&o()K+V]6u&S^|2 ˖uyzռw<8Q!Ky|%K>[eRj YRs/^'1=5i^Km'VamQ&vi vL*HNnI.5垻Oj[М;Q 5shU=HLx+"1‰rI $"Dw9P Y$캤Q$5Y]2c|.6g,X/zQ\"!K*6r~ILxUI!ĂwYt-Z~@ k/wUš]tq]XOr5K"\CVr6 Jg8a]/Osu%U.[@:BUj;uyv}` bQU_֖Y~r[!KJK\>GvznO&k?gQ >H 1@J)7d:LbIFє?-|5BQnK |oWLH߿iщQb K1&;?N%d/ܗ-qk? ;/,KTe^3x/(UBa8–yV"c]m- [eKj8uen2%F.b465ebc7u-kp,r-2O}ْ"i4~)3yUF|b-=\8 Ot5I`&`eF}&ˌf'rˊiv+g3zTfȜ2W&ip+V9ӻ|v\ ˖_O~>ɗ%'u_'_?nņŽ3:$DBfq8܍eKYPmu-%t*d/ܷ-~VZ |zba[Vc?~^_eDW_lyFxd:?]l1ݗ-2+"$yvI^?l2ݖՖ߶ٰeۖn"dOO^s,qP,J ٧6mKKȒQ Z )ڙk6B !`eFv]p_f5܌|>n1A;ܒ|"WZdR[_',eI땘.߉CF]L-!{EN` N` N` [dmEN` NJ^_#}}61|20jf]**u--*̦T}9xZB}9eq؊r5>H-l+ắRy:㢻Uʡ[l&IB }N+YYRT桃-StGj#$d/ܗ-OIXſŇ/(sGZň+ZFr49 ׫Xϙ's9(1|45d+ iLVVZqN&ݖ " vp<l:Kڔr *݆PvZhГs McB _9߈cM^d RsǜTQ?~hvqjrņi-3 ;u9*&:]Mg? |{7G.b=[|vg^&Ɩ|vt9#ӂ*>C[[_gU[[hwm'pI{~l 77:yG>%nȭwZ 4.4^z``˜:%~/c\#6ohX:|ϊTxXt n.bE9-.ɮ|J'%\qh Q~58I@k5Orf V6y{;tY]ҽЙ'Cg{/K7ϯO࿿m{ׯzu)W_ ? &%߳/7-w;/ ~ϟݡ_LGhxs&3`c΢ ^|9ӧ,%AVFrFЌU%3!+G }JvP7:C;Q˷HouK[H8q4@crUSI^ L#pneDHϊz}Sn-Zkois~goi}/o3K * *_ 7_~o/_ 3g s^,PbAGT[KaVT;kVz v[Uh*Uh*Xg$QZju!Ɋ}&W3YR5V+Ew(-<;3de(e?LKqeÌ;=0!GG1=>ZkƲghC^N<ơT=adx!ɭؕ_m3鶬F=O{b 8|3sdH|%xCHJs9 9=ҟebiHLkLMcZq_*.q2= X*.[GrӥZPr,VhBЁɫn?4<0s >&KQno;^_.XSG]y;E >ߛwyGMQO)_zw&$'uS۹[V?袼9vF(r9z~щsEMA9qwM5'r(]NUE'Ψ)/*37|@;e7.DYf!{,К,/dЪ3 vρ@7~>\7 ӹ:Xa1~hverd~5r9<:qdω3[yщӶPo83}t9z-֯n֯n~u~u~u[?< 2v0ס%ߝOmUSЭ:Vo7ㅬ7'k`CJ5&byTCE>C(r!>ba ~nrK}C^/7zǼld5B1lqU1ջQ%x!̈r?4:5wWyR 49e 523+3-Sz Y>r z$$ ~ 5>-Ss<_6ċM> @a~]Xqv&JJ !2S-׍ۖXd)p암R_὆ZVmo%;O;Gyn<;:`>/X>VN qɢg5-(J}RmILKheqaO3(#_J{Msp{Usp{Msp{Cspǫh׫׫h^]}vz***^EaK-ҿ–~Ö [`K-7l)Z >YPaOE|Js[s[rR[Q^Ŗ^e⽌뽌2x/e\eཌΏ|!w~\v}w~^pl"FV.54b1+{nY-| [, tų CdW^Ŗa– [ee~a-eЖ=4|:}O'dv Vni#psˠ -McZ:eel"%&8Ox\[ڹ)d,RbU}"nV[UNWj^j_jt}uyuVH nnЭ [,O14N~5gFiK5B*Qó j g41O2sWIі\_eIe=7($JsF%\Jآ2Đ X:!Lb$VC5PLb$k2宓 bHִV)3eIHg_2s ѝ<m|-ݖ1X5X5X{v %u%k2n#϶L<8 Αy+!֐%U<"O g{n.D d>k@ùYB'nBU3=S WU>49#L_ LNuF .-fRۡU[/V~Xwkt5~XU[Gnmz7# {m\> zjntl )Kv@Mb_tپ >|ƾ|tu/]/_5~>|/߄_6ۣ7|#fo3OKQ+ ߵH`y`޷6a;RGGmHs9)LT8#}k5r h}ugyk-oUZ?i}upg_/7 g@,Di'N_~}V ߸@crni@OVԲ4N6=cPn!WcBV&ǸߓEK Ǐr?^~-Z~7V%r@\O'BLN^_CCWw@k:t5~`:twQ6Zarf_".ZYW֗0kUXB'u1NKw>Sc$O0'wn’پA30t>q[lO  )ivs;=q,iDHX!1 ii^*h5B,`ALC4V?a@X:{ t|MKFW7t Lxl0_ ,G`G`G`?[?K?#ޭ]z]__w5i/m _WUWz.znznss|kV[szgW ~sO/= J_Ϻz >6J9K\|ptA;k5BÉ{!3YY7wji~=k52ogm[NʭŌ=},;Oč>>ЪIǂpgHWo(Pb fsb`Vfɝu"c+Ъ(d?4V+FD5@׳mȌ~OL]N | ey yȔcCTVÉNQ&(TOv 3 5|N>5~ɧ'"OI|N>E'9O6E#lr MZݥ&]rN.Xv/[?f/[֯dd螺[(|YvQVI?/ bCgUV+>]bdr ~zcQso,daao,XT=\ǞYo,$/o'l\{Lġs=j /ˁח4)BPxf/)~?MOkig9 xY=qAA;aOQKr F {v[!,~7%wdó:)72&3UWi#@|2 rt&sh:b#wyؼғhVRÉHO='ܵlrˊToLTv*;f> Jxt-V@6Ith/Y !LXX ij0SĎzדvp3+sS7I$ܦW>OܼLԪ/ż\ 2bZ~wF8Ily"(>扦뫘helevI=><wq><ˁy8,Ŕ֟Ոgw4%*~ϯoI[?kwgi~ϟo[m[jW&}ȣ%r & jLjŸlS;OӴWiY;OSߝJiY;O}wj穟g\"vc{pQNU:hH4Wik:S7 }n⃌pݹ ܖ.b8 j_)VHKOpڼă&?[ZYR'͡i\tJhu YŪvvst- v9C#K/GhVbEr4^NVT⇝,G8Gh sR9#4A0Y\MdoVI ɂ%~M/v@Ifx*-g3[Rh}/&_'|xgGbA] `WV#~%@N nߴ˫{/EZj6 j_gŠȺ}krJsGYR)ٝ_6r&ѽ55nE'0A2F~C (aX=a YRUc`&bzn/EKt_l=WbL}rу^oXs^ɕ sNWBT$D 9K҃'g.5 :ܖ`fZ?x#RН":%|RI욍pC rd1cPC/O#w!&Dr O[4ʭeE׸bSC~I>CU9a}[و-p,Y8C#\Qo|r+F Yhy!Xߟ .0.z6l$6@ {>Mʍ>$d;3.>xEwy'Ut-;E\ _V>3.&q֣jXEV˴ZUKga87)7aߚ&A;Q&&GAF$.d/ܗ-lŔP-2,Zco^RMjW1X?-BwF%g [M~pQ =4/y 7R\*1AkБH ]h{OmG]N >prqU7V=y2V.a[+Z&%"6ͤM_eςqښ?gRbM:g.VXz>B tW&?Q˖ P's,OdrFY\2EB7 0cjCJd)\z%y eIhQO\&{l?ɏt9[GZ> շt-M3>6ttn#,JWQNlyH>&^E YR9^{&>b rMϊ[}wy YRMO 3lg̻ٓGep_zTi*_(ZݣO{TGU+?QTgg+t r zQʳ0l#g/9Υ{:Bcjє)kzޖʫ /[zѐ+Y>PxZ |4Pc4rqГڗ=)fO_O{ ;ȉOw`P"Ԋ)_ru!Ǘjnž^KnvʉvF-% r.49Z) vF(#S\pD0ӻ{h`9\N^qMTfY׹iy.4dIkLו{>tp32|n4MxFsPIܐQԺrS󠲋n%.i᭰eY\l~\A]_OpȒ:ݖ|{ jv>>q Ŗr~e2S,J!E[f 7,Kcz#[(RO\0EڒneF^}<)beՖy5m>.t}Rt){~\l)ܖ|`\n}ْ=撶RnKs>q%jv[,K }sTO}Y\ r+ F9Q5V#poV/k{e첬-EʲvײvWY֚Ӧ4ʵ]ʲ׏eJ6t, Ÿ .irױPG >2c[li܀|øX-@#d Vǂ @Gvhjo9G(jvU,|V ;*JCkу9JZy[rgz)KKयt ߋoo>ZSmC8r V3+B[3Sd޳sXY4M/Rn 9,p;?|˖znz|ڸ[z疮禮k=疮zn Vvcg0vcgv3x-;} v#v]<7jnZ=3-e&@0~hG5jCĴVϬ>\N^Kdi,kz/sۉYZ7Dqiei]ki,GHK? <'5߬ɒ ƪ꩸lj jAAkСonEGEb߰rTQ_bTl5bd# s _)2* Kn'2ϲS@8܆go:QvgZp\tU?k9]T٨2#f`^UaS?_UDu0l̏p-ݓ={R՞Ե'wOړIC{Rמ?{?"M1ZDt[DoOGlr F܇!B/֦!V'ݯiCѲ ^9=* `iY9\NcTQ2ʡ"Rb 0gޔ!DfzP : S2 %։͛C^՝KĽ Zz%^ui\i,5B'OzBK)fF?溱^@gsl\VAIYR_,޹5A!`ow,/'cmBmy2Nvd?T^E-Ygf^E S7sթeRۏږ/#_’pnC:`? o&S5K>ePc[[0,e݆31*yeWlm؉\`m0%MO77l B h[jug?ύxq&*y}ρH #>pטZ~;7#dr4ݿơ n l ,"7)X)غ)MMM~m vMMĖlb&Ml=ﳉgK&lbg=z6?&>uti~﾿,}?W߷*9;O}HߟY̟}?/Kiczd鑳ÇN ZiWriV4';'i K$d(+h2;8h*] fpo$B{-@D[r\)tU[)1Uvۃ`70ZlmN?r?vZrl5Oz5`S,9ZrIX=2\ 3:ÙkZ?' ݖ$'/.hu4\.kZ@S5Co,;N҈PۖOf"4w ~;%D,ƩmT|Ei|"St-ekZ痚|+]_-<5xgBa,-/1M4Rj D:z/IQ[51hY/[GSg}ʃj8W]<,m|V>V?c' svʤAw/ȁ~fU=9F7r]"s"5?O$EE,r~"y_OS\a<82?v7bK+>O֢]{ 4]3MK7/~yu155888x]x^x` zN%7-zm'BrF=ɕ)6,r3DWZ}ihQuaؤ7B0S[p"A,wGo5\MS#r|HP!G rVJU~IjzgO\ѩStӖ_ze=e\%2{qg^Y K+9=4xlW/Ǎ=:=\֨)˴[rCt24dnż"d '˪W$:7RnK ~#Ȃ,ZGNQ N^!i[lg=bgw~*\w Ocܖ,5\TtNKBy-= bG\t.v,6TgV7j4ʭ}vr5?Pߗmu[,}< +7򭞌[#@\,Zɑ#C'T[t-w1X;8r0aZ ^EA J"2ULz VW`) :Y *.wO*j5Tiী?8IYu]N _JƯFs)0J[VIɞ8nSՑyg?AJ8#%c(. #srTUŀ$J̮.-9ۡUt S77$|(1! *BbgΗNmg'&$!{E*ocNhD)Rm C6H:U;d/ܷ-ߗWOv1\>Jm!߰R(ӭ|, X̓?bn~C-1\؋ZcRkz/q*U%ERX3ɯݐ뼍O r\4Ten획p+xҹE qc7h(t"f@-9f,f2.HN-j݌_^}<3>\GX}kQGql134<*)h[m>#)f<;1xx[lcQI}Ʋ6=R߬tdA1_:góEw3x30wnMCQ\_Yj +eA ʞ_}? [=fϳo[l~;4V|UB~;( %3CNѷCw]A;d/bWz+]WWz\xJoW"%UEʗ檼.ͶqS +,2:^zziBehLei\/g-jOLcIDk5/r1whuN2#LomHa[Vo B 4vhguYU*;gPQygPC1\6=Rس'Rp߯Sҁ0@:{ L]|a@ἪzЉ|N5 pVIŧ!ߥ|MC\oLNCU?.9Ŝ{'w0"R~c|.[Vh-1XZV1w2&m}p\R~fJ˼:Ck,kVS7|>%!lqQ#ık!=kfQ]",TC?Ss;_P.^sq3wJ @Ugw9'>{HmIjkP6(D^VKގBo]N $I>q;cP6DHԘ \oIS A8\8U7o1졵^dVϕdC9"=:܍4s*Q+%vSn-}67{Rļ)* a.L | R.٫VZ"=d)VoMN!z '3X {uvRށLJ !L}I=)ٓI=)ٓٓ#VBs4ID.oZ>=+G\gFQrIw͞G~'. ۞m|)5tkO*LɀC'Rp-vW]s}v+^`3D֨Y޵ÖAχYH]H'[ֹSִv81*ٹ&G|ß???|ß???|8 gGU7@q~3UȶWS('I(7d;H3gs|hsg_B~c eNmTƨw;+tO\56v[66b'p4Xu#9kz\im֡U354S#~ jyЌU>OO$_Z%l !|єC+᛿7o~/7-G#[S7"K%s >7M,vA-91\? '7FwBwWP` SW~K_~g9c+> Uj| KEc+6E򂏽oq9*O`B)Ȑn <6#ɊͰ%fo׺Xhl*_hiyʻdWvV~/9—M'UUsZf/[f/[yx???x???N|M>cVƔX֝͝#:|-f`k]SL7Gq+/w7.qua|mJL/2>>* V.[Bo mDZУL:|].3! 4oUy'{ޟ:/{_:OkI-NJZ,y.;% oWlŋZՆ5M64+fKj 8ԪQ"wNrF|p&1U rk/,3 ^g1??_~~ *ߓ ?gߓoUg?74ҹ}L=_N-AoIr(`jZ)YXb)voT3?8^ ~wq`\3"L?˩ZC۾JoZŇy|'~E ocS<-8A|xSl_).po R]SY̅ZbXD|͙KeEwnZ)m3)78L-t r,duL. h3d3bA:}\ey%K,Y 4&XkG&qJ>ښ 9—$ 9@&%hr_\N3)BtS6/BEmzFsF|p Ce: 7Yt~b \I oVm3rnueBLwىv\Mt-Pu t=BՁPt @:9~)%~)%ۏ࿧vMR{J)116Reʤ{Jהڮ)`Jg=myaQuop;sqVۢV7bGEZp @crUvt%[!x* ?8Coܓ\[qO]B*׼<\ô}D5#Lg ܌|NYPIoa|^Ѥ^=v[PFl1, eoȂP"&ly39 c[<v2Xr|Vqb-(\bz+'9kV͙uUO4ㆿ=0SoήksSO8E6/ r da-X06n^l@w9z['m"_һN;ZEKz~IZַ߸3dU'0B';ktKmcT耵/z)  Wy)%&8tYPI^6R-/%C.^WQu-0VU ϫ{߹ޮ[_E-ޖVt']y|"[l)[M~tFg9A]@w;aWqPCkulV+Z )YJh'!ڐ/ |U‚r W,8/;VQ8}KsqXto-pc\acZ[$g6zwSRE,ZIA8vnl'nju,L98֢>r沞8> fom-V< { Y<۷>=d/b8"a7rN[s RjK:^[dA/Y@좻ĭ.]q!{[Ī _U:UNVsBTy/l墪6Rnp>qe7v=mO^B Q?T^/`֬"rUïMFX~Xڂ8I =Y,,(l_ lWe /D_7o[|/{NO2uFm-V~%>V`!ݖs}3d]Kή-%ZB]F"o%k. U,x/l׵+ldžX؊l[.l.lЅz/l.lC}qMVQDB ×6ivg{]C)&oz_ #>Řw#*W:%!khz,6@x0B=ZyB.#!@E^ցl.F/`yp_^e%VPEmGG ݭw/.h$ѝuinŦ1I3l/;m MJm!ֻ,IxKƲDI|ʼ%k:aHqn0yMӑ|`#t$%1y/ґ&t$;9-<];[&u,F"tFДC'%F̜2Tٱ2)agdA8!L{(f#܊Baӌ6hFfd5cˌ2`FV3ی,f`2=ݮ*`)vmN˒ԌT7l3xΑ-?S`+|H"a>kfرs!Y{2q7*.Wo*k,<.X_ZGͬ]ulƲdEV*|Z~vuT b;P}V$*s[WQH!wpnH9xdRF'Dt-"vcԝζ.V?>kA̧鐷kP+2ae&}4mҝO\iSt-]dޅo b5RnJ >BPZ,a%#}9do7Xxv r¾z,qBaL *kAn'E2榷(SеoM}VI?Wǜj]c ~1ug2B6>>[e%ԟ&?x.dm܎8-J# ۊ+/{fr9*~VE7oYo ?kP_bPWyLu}73%u1ZuA?Q5*QaxbT(9FEk:*VQFݪ[,ѭLnUY)Ji->T53;|u^bd)\\C9*GO*_TT>zR'_rd.n[MًYo͇vd3b`𳃟BYI}R.Scd(&h!XXo.rF4= ,}\a ~{b{RzRzRIII'ի''ՏԮTTГǷ^ߊv}+Ƿ"_ߊz}+Ƿ^ߊ|}+Ƿ]ߊz}+z/^kubP_ v 1bPkP j;Yŋ&19Lx6ȂQ9t;6lZ#uXjeVe>1(%D ϽR[7r/`ˠso.[/)W^!R5r'3 4_cr>"5D2ZդZS 3?)V?f~V㚭lU٪_U5[kոf~V EMٝE{Ɇ fќ{`RΈ_ 9.3 hLN5Y\򩪃P'3b\T, KZ5GMr+*yutAF|r;2XP_єDäYҞ٘dnbǓJJ-'i %m}p;?DwKw'?k5B/-S7) ҉Hpl!gg#1=4F nLٶB_ Xn8مL!JgvWlnttqc'Y2je-S1+]tiuL+ؐrud1];0[0-'·ņnn슍p68}Z!uQX!!h57.&uYmMnV,_Ljbqr'&ׅ\_$I) Ċ{\a0A:F)VRlYFX4vs)|p;fP?x9iOG ҽib/a~sYfM"hkfsC%ͽ`ֈZ>Ef֟YZ/!ב%WOm^{}>?.XoE=0U*ioOC|r [y,e.o^Boz`.S߭oh>gB:뭟+2u:~NF}p3ϕjrJfZ~ع=Ӹ@S}3Z>R} 2V`7}K13Dr˷W_长]XU[1_o}`;uB#=k¦yk5݇kn :qC|RLN۟Y3W񟞁:@4m Rx͞!qX2fL;peAs"BНcۉg{eUl=gA.^U<܎ָ4Ԫb͵b0nb_+ TԞ$]IlYIԐ3ZITV)$PEp^}%]N[_>;맸ʧxקX> ))6)-ߟ*Sǧ* Mwr9yMSQ8X4&St\ 4;:|}Sx0`C=I(ב)]C|4vhMg&lSw?~o +~S *'| -XH-܄H[ K3D3,F!D:wUv4E_p8>or[f𻅴unv[, }κ/UxѷEeN6<?LV(433X(%F4Ǜ-28˨ rU# ٢l8'#>wOPe Km6˯I!%`{oeG3nYGC>9"SO^IG@'lД}7TSdf>~Sj -@8֣\ $܂\BfouGݝ!{m"|)JGhͺ؆ȎXZ~l|Pw\3P`ևVtNM7,i? + d{XZ~vn?)߇4z,\F)$~s.TK)B`O},F ?(ڣnY7kXa4BŐDq^jak\GcVnBqn? kLGIarkZ֬$w.-וB?"OEuɃ;ە`y+σjrZot 7/vl$\_·Cf5Ck.t4D|:1 ovRjrYRRO6㺹8\"md^ỸD"˽/C{{ǖ]{u_rT]^Yȉi^sӺ17kn4?榩sS׹i禥sԹi~17:5=tpO={=upt9e\o!7ve떑uNM[i2Ԋ`lB2Nkm$UbbxvSs O.)WWV{fݒIX/~]8Vf1r7F,P+i}wFHpYRS7A6A* d$wq$5"3ve;NvL|ɭn"!7iRhuF`%V8,b*YDYJ ]h2G .#{lrыksoӸAep4R^yLyH֮O.1'|Վl[;5m+[ʢ[l > :$HaYĂA =@\A KBj]WBM zٞtdCsiOsWa|4ɒjz|0 e]9YoEVql9 sF<F--Zm]e } [7kVr[f+hϢmola˸lola˸l_7,1\X xn~XbI~g1XzNdە:ȕ:2G9+)8IG>w6]Is:bSiu[&3ksf$Z sD9}Ҭ_njI=7z܄~沤Jl$[5Gn˹eWbvK`[5m Y>/GPUb/$.i{$-i%?k%5/[A@t)tr[ZkX"l1VD'w嶔w,V9SDw`փ,&n-plNX6,FOK׆Z_ &Bt ܌ĺzBur LF]&og+@򉅕Pp^  [vλKóI͹L5LoVZ:3t4* w_W+h߾;`m0†q06_0a Kcxҍww7|U7X7U*X7ꁸYZ-4:ȵ#ȒJzf͊7m:^ou3g(D" 81ړНYP8.m׺q#RlZ[>XԄ,Z^FEmݹ̡iV&H0%m9hKhU88^8_x^xqu8^:9ǂo^ }-ǂo\ y-ǂo^ q-ǂo_ y- >t;!P tK(22ZChj*S  Zņ׈^:CG#z:{DoKGǁx dYr f;Am8S¼]3tfy:e+Jh5("O(ŁVfPn졠l@Mq~v ܆\`lx Ӎ('Iʍ&ۭmũCܐdu5o,WK(5R`jx"eCeW B0.0.;UmY ;f22!Yfn,` ̯1 ZYGr ;~m-ǎ#_c7c ?g*cWǮr@HjU 9QM=9eG2iZ)o / Bh}jh`V,wP%?k{ށ祻tbũܑ\)A!'iov[ڻ;;;TԮݩiw*ڝڻ;uNMSN+Jh3+oD͎o"9 BY*ljՐ܉!x=b */&!{Lp\1-6=ɹ3X~C++W>D񥜌rJV[3ק͊E 5n;E 6EYr&Ǘ- @꧱Ֆ!]kmro[R&iKVnusyVGpTdx'I| */{| CZ^~j` (~WC7oK?>#Pz|ʷ_F+|baw ,@mV h!'pÂB=baH~vVPG6iDZ#vf&i|fjſ7s;l+ĠjոJ߻8lf= |Oݒjl[WᜆmM-^JϾobGP _nK6>ps^E=uew0.\M0((7!ƅmViXtRkb|j`[lAEDf?/Zٹ r3$K_Np ܂\`~ȃb{VV 6JL?mj5׍!'Xo7Qs ~ 0F"߈Z߈.߈Q17hISyv3[;!wyBN |f,.-=N;(1@Vœ/IK 7DUtͿz[lAr1ԴcQ;T٬0ni_!bVnHr_sjZEI|&NZ~E\F֬eyBNޭ;SYN)RbesW7kI Mt)=hUg-L$5_R ?ƃ=h%փvw4m,]I3u܄a mzrn=ip3s{_h1d2y삙-6b3C F27ysvW- wCԚ9n&$ᖴhyyjySTU)jG3787sqیՙ<јF fR3&K*|̧{!/nPb㩧v[<uԱo,̓5r+F-,*X}g8j1fVѝ4aŮ'l)Ֆ|nԖ\rC~b|`5YRGڒ!XZ<]-'dWSt-B/ v ۑ{`9 nIKhMUQqLN |7c){|h(1'LeI]5:99H >qe<[my ˖F{F{R[&K4L&,-EY}M\e Pv&Ãj_}RК7}f VǒfИ!6nS& bz7zAӹ5spł\Rl$$q7vMNg44YZi:hUt s!ȫ \I@$q@̪(_> |`}×e[G$e \B3|pK_Pӹߺhg}y?<γ~sI+5e-RbRT #>Ir>\ޚr/TܕS!z4{1i4RjdIIB3>v}dQb+ۡ:$F֕ѭ{ϚmjtL<&%ăjѭ;ht+(C69*YE8;Hf!n&IB;^Nٴ:31ksZAv4CN^w~ï8Y;_~>@ǸirN\oyc[>o:ho?f?=4nn6&=z`[hTÌ DKTZi(`2Qh^%Ϩr ?|s9lZo, k~o Vn?#g:đ?H|fˉ+Z֊۹@C9zy_[uvL$D2M?(]TFm"۩tTBw}mݚWE6+Wi/t`jEً/׳W!o:}C7`Xm8?t;4q&|m\Z 3k_(,#=izٓz6M<'mV0w$Fr$>#j=inIT'I[zRғJ~'mI={R?zBԌXg P.Ŏ;b,!vw<hr~8V)d1ăHt: ygs$J fHqWΕ>V97.弥5D+MޏFMIzqn_%mksbֶB=>j3A]=>}KxN=~ 9~w2#fT+y0PQ >?4^9wX.,ƴ>`+5)TYߴ}Ծ?Ͼ²yP\fx{͋Vv:+tI~Q8vV;hϝ& C3ßV"p8Q/TIb<,]Uk9 9Yg3&ؖ\5U4/P1"X<=RO B{` 9zwg$-k#T&1^Eh/RBx`G);zcPi<dz&ID3EX A͵.q),KU(ϭ>V^H ;˒Jq{' ,] ݠܐ|J^7n%_27{H܄h%#fZ݈ \$nJt~Ӹј(^hSWEQ׍+P(qBl(sE]ZA8\U΃' #n68$3C@}ܓǵpݹd*w̺W3 mЖ{yu5*wlџ5ŗI57V?hyD2J$|m sǹ>'V/VǢhsr σ,-J) /J%@\U]ks/&]~8dL(7@"q5L[pLzA۹[ob+} 'Ò?)۴Em^u-d-EkњO\&$-ƖQ6X6ml}K~ml}CL6I'=rkI# < .?Vy9 I^@OtD_{9 򶠨-鲠mA jR ۂ|iՅ `]IZՅ@B.$Z.Ԥ "](.TXW7 9="(.d$Z~.?\WK͡w_~~}~eo[j뿳y *~W +T]/( UCK9 'õz f,,bMh\0ƪWG6V/rPZMCbbwY &_:e1,rX &K#̪kpù UFvhui&lV;7ON ័,M;wXNȷՒVӤ-Jj|&IYB/p.sfZd rk3[dfrj?ۻ~ooU[[h7m[_t^ERA*)|֫sEn':"%*֢Ϋ?tZ5o][[k7mnߵWV3d5Ӌ;?4 22F`tҟrX6S+o\*LwhW” Lov C*&dzV-RbJ%%Qjqt?Dۮ!OYSCN!be X=-4DA~ g3kf܀!8Y8V$!'Xo59*ls?   9EJn.592yV 9zÿgh|; {Ʒ3h|@c k k 1011>10t :s21qbeI ӹfrA"?.XF7c`$ ko%~NoK$Wz_I/~- >7//b/oE c}~Q~}@qh課]E=@@Y":hmcxV(Ǧǫmy H8S@|ƃO%ɍ 47OOw?rHEZs@ 27><}H#}H]yC/K_nzCp'=woh_ =OZA(i#ϯydyN:o\ my[}eȼ#˼?Ǽ80&DAeO 憭(1˂*r') ݠCt`{_Ex5. Z,-aʌ,\[P 4ɢ GhU'm I"- ZDO* >D~[7V_\x0lg#n*|rɲF9xZrBB7!W# 5"ELiк }Ɂ¸xд+2?@k:h~hog}fB; i@]m5fхӓК5i0BN㶚(Rb\:&QqԣuM_͹he#:|DIAwJB7^W^$rdq>cK^% f` j'J$,&8eI' ݇CO\n GE=eI*'iAFYA!#e[lA$Tm;$NVnKۉƓ)?fZk*h[Zɴ%@x$'<B.29B*L君,%@#9>>)6=;ρf FTOohÔ==eL-RbJ%utOoheoy%8LVq߯i*쵞tV Xe|C &|= E Ckր7ΐ%f$!ű'T@퉄_ΝCѶ3|ξRCk$h|B?(Ќ~nt3e^+;Kz_, 9[̅?%䤱~_EkW4x48lsy홄ΝiuYpE\+_yCZ:?J(5'W/u@q |gSn5%3 _Y,&?㘧"*Roc W᧸ܤ|DLٵp͹4RB?KnDwWF k$~q9I1|KYrZInfM]7 7C~YJoۻ7GN~{}io}_ _ ?!-?L[Q׫XvEVqո>>?ؾغ~S̶c|RS6cg5(e?m%'ɂ3D ݠܖ|JDڒŃڒ9=y;HjfxIG![x'n)#K x:^`x)IK+:^ZyˑrtN'ReKaT-ɲeײliU--p沅.kZЩg;fz-S|qy***ǫ׫h׫b^b\b|*2Vۥ.(XMTP$.p ִ|W[lgα|U >at(sYRY]d'y{gҮb|2Y-lA,>A-#g겤r/|(e^bk/[z}p_t=ܷ}}=Փ{ҩ=PWO"=dIaٔOO긩`Oj˞-MsY}ےJDICpU ]3?dkWf:"X!gdmK̻N=qμ9>5ɒϓ3//]teqyEVql9I~x/mX{#~.E^٪7S6#sdog N"Ŗw=+d[ 5{F-+i)KjEV>V m/~]^ܪ{& DaVMpefnCD)Zh-,V_!`=DΓ"Uȓ":!{'>DtP=D\t9D# O:'zN{ē@ےRA,(v[293B7(H)?lt[@^ըi eݖo[mi]mimKsd-,) k`>)1m!R{ȁx}Z|$~W0`_E-O6GY %&8Mm&8O2MN,k]Y-3yUo^W1W1>^UxzWl~<ڂja҃& *=3E%>)xr9g-]2Z <&K*Ydt .R_잻n2yͯ!K]Iٹu7*<ԪBoh('X>Bqk| R-|488㴘:@s? ҆v+9[eS6>qQVq-gb~*L=h ; ø80Lqv)\9owbq |cNa!)a#S*lrki? x %8Fr{ABOS5ޭ-HiM% ?RA ڹeɅ0.:i+kCKzkUR[R𳄜`U5NXnIIfO=I8y.ێZQnZFf6="MBs<o^{֪,_MsZ>K6 ~y#mQbU{nAI̯m]EPA_KUit#jS6ûCG=w}w\`\vBPC5,xeSLoüނ?Y%u4JeSG!. >qU[6Uѭ]"nPfH.Ub 6pep^wn3i7Qw*:|⪶V$gQe$ /&:rˋG$^L2j*;li@y++_~"A-ƟG˒Z<cl upo'˲DVq߶wu^ފfs2mV%ut-v}0B7(LVq-Ö|R/[ۖ.[eK%-#][eKl_rb!ҟ l ֔ovi^/=^zNd?oY$Wހ#7-P?GGGxzz}}}ԏѮQQx-8jqZU.:aW U-%]OxFقO..VۡCmi.&S?Iչ2n9URhMqXyĒ!-צḰs2nЂP,"xs Z{nPn >p[ΝS*?ڞO !vwϏl˖eZ݈s܆5-|$2Z^/ig0w4F9~/1/S,n9oO\[cr,NaWPKC$5W B0nͅ}5Bf ;2C!Rlc8wZi:Ń~~䞮ZA8\[>>B/c\(sc)V9G᳝v,~__ߋs^t|/Öz.[-^[eKl˖zR2n<+M^v7]QnK >R֑F6B]v7ݼ"ŖTOQD収y98x%ܳ09+`-g\ `:h('X6-o߄=CSfw6 r Zá{o\& m}rSN O7ED^Zc7\-p4.9zhuX .om_ŻGe0?Q!sھjn &j](<"/[p'3:e/ntdJo*FCGխ(ôI(ضPh}N՜={^mӪjSZyܣ,_챢egm utK![hlW7!Ŗ5􆦟c#S3e;{`w3x{lZ^̠\(ez ? >V=nD3LI&7YU { 3I8\)C58'\$w֜5ݧl Kop؇b%8}D2Pa"LaC]RSΉ]PPƃU@fN|a\`UlX'vPlXVV-(sptɁi>r\W q .40(xG[lQ 2=e2]h8l,4B_ U/[N˖Y[qC]Ou|/o{A5mM-gmq][\9#\٪c~CkUע77{7CGx{#otW=‡#}5Z%Wp3ULYZijU]b?nUo7L7|:qT<^5-zRO,*K}/UqvV?~ͯ_}u5@F_5k~ *5BӁu @:SBׁ?BOC]POCMPOC]POCSPΕ&i}An}35׀_ x`f c o00=aBׁ0t @:KЁ0>|ß??|ß?? > N>@|&BCA2o%+de@^5Yq\H #˂uǟ},]R& n}9WQp4x튓n Ja\46z'VbqEB_o׷_o׷___WD" CW"|/Vv!aoW+!'X"l"t}a^_}}a__y}EaEmq/zmb|ymY}ےfm?=6N jɨ뽐&KOoj\5ĸrkb1^KMz%WK$^ID+W}%Jb L$qOYF%Pkݨ̐ gB'rpKn{'](3a௓2dIWgsc1Cfѝtk}~;yۋsmA4ڒ< *=Ka*%Л,)O1/-VOSdekn:߷C{l#\ov(##};pCia[< \;=id.mCuS>)~lzpUS$~w. [2ЪNQb(* o\ЉE9+swMcZ֗f>3ӌ֗f~^{Hj}fDE%/1h}4ϐ_oo _oo } /r_q׸9ŻZA(߭w럀WoMT!?3ͦUW@X0tk$~[roЭpo{u$<͎_-$_K]Nkߎ[ytr`?E IR^}4킿"r ^3 8NS'8N]'8NM'8N]'9q7K[C7K[CᏯy"-៣}9=˳ :j;A/Mx3:s]%ш]6QRҝT+ & oV,Y482Ԡ-:wZN\,39 +~X 9zu坠1%uuϓ5̴~rDVq߶<1骯N=vJUt$.IblAK)O ĉOnpirUvdOY,[[;Z4%/BlD }p˹bIF2լ($̈g4א#y7hVn@sAcrρCrPx:H䱖aDjZ9La}{P!'X/?[P\I}fOWܙ849M]9Cb|ZqO'Lt!'X߭ Q)S{;B7~WwKYVq>o[xiRhUWt^뉢=QRR\kU3rU4* 1E;oolm7mno߶~o[uh< ~QClI?  4w`? ·pƔ<}E\{U/KޚO/l5ģX?:~w骶my7wg: g➵%ShpCG]>Z3xtw7bjˍjZ9e~r grfs_Re,?eoaմ*j92.BkJf1GrUv4AB2C@?M"n Bw!'X/ҺPar=|.'j岆y(2D8zЪ?eZ6 ߸־U[!<7na9&aۡmmml]lSlddd%%%\!~e]QZisԐqe`$\4cp۹w3LDCGv!ϱ5 3bH|?1} V͙>Z~zw9z}k_?/}־Ͼ'/[Ÿ/w"w$o})|~7|.B|'uNKMWhU]])猅PaJ/bۮVەs`UCkCf{v%~eV>[Ά_ݙH8u|}ui5-ON͔[sr/Džw(E gzEo^^4Ӫ]]-Dž3 KqneΣn,?[,2/ɹ'Z9g$9ZA86+*5t n;k^tm5t[+ӱVnun.yv:OIyvq~Ma'̀# zπOr_I?qZ~{}ho_7}оߴϾ߯"f78ABwQtqtpTBt G?_=7&L]s%9w=c@ ͊\ZNLmoq5WsE?;^5%}\LܓGC&X/hs+/S |~aQռ`q?[斯ٹjrV֣Oɵp͹wX(#\vUۮqV!!ktVR5lshm17ɭvZnqҐ_6޷L`U8\H%o7?GG.kV;o ^oc~%~ Z? ??_ߝ[iZMߝGFBs!whuӵ[fG9*q?-TpƼ8(RcUsbI*i*ssF(Wh? EYn1]uɆ%[9Kl}[ݖlkp۹L\*[v& _f702\+H?`[1L1U=.\ SэATݴ*nTbovLCN s:CN'w[ݒv1I*p9 bZ_v9 r"C$~xP.r 7_1t۩~s ~r?[oɹ ?= _T1>~ ~5r RlKfr6 ̕!'X>RIGi;o Qqaݎvz-+v%}th%4<{dEYC| >qQVq-gb*~VY=3axX`7[d'4&'X/; d*ݔ=tCeeIb~<ms¸N9,fyv<5yv]1k]s}IIU:sMSٽdֆ|0u t0Vͽ-hy^2ǴХ 2*O5 ]#:>0|IM79s1 >2g~3ً| >zqW9c^JpuTχ;UlAsXieU>Ր 穑QhVOM#1ʬW6s[2|Ѡ֨%Il[$| ƁFa@vK%Ы'X>ި9rWNBK~ L3@`pr ~7hfӫ!Uߝ<:O=>=(Qˁ1 V ӒT/?!U5В{ASc٣,{Yd:k aQ{]Q{=j-GcZk_ =s;YJ}fVf}ݬ}ݬB굯S?WZe_WǾLs]=4slhږ\4Mh$?o*M5 u/~pLy"'R`Ӥ 5ȡtˤ #Uxj 䙕F {ꎻ_"hvNӤ*]4;?RM)JĭXoCOwt,qP$ZeTϼ88ڛIw/fwF5uͅ &'"A6Unxg.{^ai-.g!TαgJs)̈́=Gf'bqjl}blPWrD+IQeW3U>j1LUf(j՛bHUcL46S| | ~!1l2 @?KtRc0b5Ï|3@4GTXH(|Vnp̾ e3ݲ_La=Yw) P۱^1{ Ċp5`!VmA!`{ҽ"߮+B~\sE8S:,S҇^;`TflJHpЇMR~.o}x܃{v?Oìy'X/ӳX?vNc(QJ%ծYGd(Qˉ٢jFnւ1.݉g^RڟᥕtXCT{Ryz.13#`Qc鶮՚e?+uzunw7#]3_~RӤj/'O8Tt>!}y G*ou'q>_gYK8jܤ%vMjM~,/f<0/iO/li]K}c;OSW1 ]!{ b]n{U P֡+b}z ]Ր=}Т&6[כ]_CγBjyV O*%u#p/ \iP٢8;:0}yʥgie- Կn_cZk?\~R].=X`៘; 㺣g-<#6y٨`xwWe+e8A =sp^RS_)'_1؜O\5앲l剬w\vVܒ=4>z9|}TVkG8/]t6X|WEo/PHϻPVU9'P2#K4_FD=D&r Lmt KhX:%d40ѰѰ>FúFüFzѰѰ 0=gW #$i{qpHH|zIrwS))jju5h|5žb6"^h ؗ3,OTZN$D+]tfeRM$l?Ԧ~.G- Ǖ*g{MԮ oH3uEZHUǴ]>T f6lsж=~b9Pv[ V_K>0+SXPhVL c% F!k RLdb#݂T4ުԵ-HR=Xq|_ /q%JksZ+UJ`W#u%JUh+Mqq8n:{7Eq{8nLs$Y7,hTC7_A6x?z4/j9_&U3_U$`}×Z[XG|k^&ϷQ6˭|ρ K>Ts;,'Ȩ^Njˤ:&jåjVZFORou]ÆaU]úau]êa ]úas 3tuSugu34jgִqVڗyվ n|O6}YzG4A="<" kW-fiu} sK=ֶ+><62-;Թ ŬK6@x׿٥pKE7I*1LC+̦mT,Z"~@6/޵/}m\~RڧUcIx|gUK~0|Yv\E;!v \|)1h 3lF ΄j[MI0eZHμ@[L7_t[oQ] n]R;X/;kƆ8f3 7 ҈չ(tTov6 h_\>q騄He-־IuKk򑺚:AZ#(ROZ.]JI8gˤ:-]*h!&e˻0Mf\ q 7}(?}ß/Ysy Ӝ{Hm]/׶鶮N}l-d['7Tνk¨vX sRHVj4$ۤj;,b% ʅ ˥pK7~`\Ts0U-$>K|L[pu w|F(1g !!UkZ@8 ?4x |Ïqj8g|Փ![P)~^=NV FYQWOruqPsPu'K>e:@Hzn yl[@h>zQDl2HiOm6[ 4~)rx0^fr*2D낻W`Gu^P('.V/!ԧ%³|]U`:y kĮ UhS x͸r}ƪTzU&w3:sjay]6!dgY[鹖7>#,:s֕0dBz#,a+Ѣ|?=xLYdKJ0NU/]SU_vCZaԥ <[j-'y.nj')[tYvWvW]G].].jM pRe3`| $3>T!/#5~^֍GoOx\kC Bz,:{T'o 'XC2gIKuK=g\'ړ w!+RDKAq'yo{RogDq٪Kw"F(n,3tyYW<[l8Wjc?CjPbV VCΥD{1j o7(.۵8RX&¡s t󻨂# #{8Ť@:CL >*#CItne;Ў9C|Xq<&h:]@g727 !_'͒w (K4S;mٞ (vK&5v2.3pT3C$cFI>3,[Go!ŕg|&-vulgixrlUZKJLY -VmX«X]~sN93ѱM3ZպYWMV\.QJ+_eG뗸*Xͧ i+RmVc%2>L\?Ba}PuuD:=tu:@9Eӕ :=u>z1qd1m L/ӫLtjw@ja+~~ )~W (~SX{[|[2SL,&Z.밼g[T߃!Kg%urĶ_2 f PPK{Yײea|, ZƵ,ea\B,kYײ0YB/W vǘ2j[CAxA% /!$H=٪˫]2].]2].vYMMZO*&ϥJ7ʓkĪ*Rs7)+^ݪ8G>%i٨݆>_yM'MdXp} ]ńLCǰ]<!ePnr뀾.˭V l\FV{2JJ%52rok4{L}lꢇc1Wekt(GklO,&X0Cmt L܀fTܠ6|D}tt_]nAdԪ{p$Q=-HH'VƅDwN -RK@.boD/@jK TI ǜK94$>O=$t`:gl6 !jX)0N3BY!طaL%F;Jۮ?\jͣ7]rh4CD^_5b>{]5W{}d_+wκr+N+7yTU|jr'zl/=08CiӃޤʭ~3 OMqp^t[ꗬ*IGxM^5·pK U;s3rS u…A> bj12dDb/s+^Bj .f1|E\M  JQVzbyVHMqؙCbw 7|9mŖc$~v >/3$ |'Xo'Q  ϓ É[B?oKߖgRёȞ;;{x n,WMïy9K!$wH#|] H8sRC\]% .usE7O*KpN7/LN{jR ȳ2YMyeﮟ@"#Ž)~[okύ/ٻyi5 zcǏ$ |<.tǯevX* u8 =t}L>|!= ER>9"`YD a-KqRA8A CÇ?=cXc%7xXd)/ P]*->zÿ{кzнM\=h\=h]=h{4wڃك t0{J[@^WIi`&k1ZL|w "VX]o\'e.H -yxAh|庥+=u R*uRv!/w80 ۾- ~/ Q/ |f!Do0QѲg\fUxIpZX)HKxziTU*6O,kz6W+jDҵMu W{Lܨs>`-TWUxuZ#BgNVM fx>YkC(EL$D+=Ʒp|FjH܌o-sřh` V6|Dĭ|[Wdav9drEj鴌RId.U,OgxI:w~撽t9\3ô5våp 6Y*e_c.dz%%*x;[i~I#Q/xa KOիOOՏ>>U>U?TTTSSS>dnf ɋYۂ݄w{"ra ԊpEh/ܷ.9 "{B,x;i]!e_l{H, A.=ʛ<WXl쁎\؎.o(ǸTc(>vk>؟ b_Y G:QK蹵a8EM/З";E(2|(XI!fFB҃6J(2MƇJ! XAc|~lfY^2 K^~exi5#23;/FB[Wx.7 vFo3nW|xv>k CȐȒOfa?Q<^f'}V1 ktv 6#hǾߵwǾߵϾ?Μ=dDbY`\8P/)x]fa+2ȫ/]^a@:{ 4Cx@0u s n Q/RC|+5vP5 ZHrRŪN'XS_ s<ykҞd)KJг'yӓ;=Iw ݶ*n%"\ep=5F3 Kk .k1>z_RD14~Hr6rƷ-{l8*!Kwvf$1U.+[mfmI?oqd^PMT)j053IB{mg}Epi7:ϰ9Iha! E΢[gE΢SgE΢CgE΢Sg9//c4ߴsС1Y[m'|u. Xf|TRϻN|=qb5,N;]'RAg]x.&^OQb?z-1z>Gȶ%/#5y7xVPvwH(|nf)O3 m}jHLwFѐO;7;AO&)mhrЛh&Mw`S_:/4طK0c396[  GcE-ECZr| z<&CT8;87zM'XTV gsbI-@T}6o!5y^sڍ5ÍB/0!^I5HWlmK]]-x)АO ch~gt|#Iu-4'9GS,t.k=T%~(ЭK7s"&V˨|+mJڍU#wʏzUx =rR7Qy. 䫐 ڽh]@*__~}~گZ]Ukhww_?k'%^(iD#W2KX%Qnik/⪈{jselޅ)y\B,j9bwYR:y>Iu#սz) ! m R\@|;Mf=L/cDxTy!f*R> *뼊˞Dz_(wU]U>Cȴ\%/m4<:T*-60s&,kh*6 tOݤ:͸[͎p^SAtf|  6?x ^ a7CU/.~g3` %1B|fbаN$n~0h\P %,I%uSv"l<#IyFγ v"$<%}tt ?+ ~K ?+~K ?W~m#6 x(W!G~G%4k8óڡф?5r zgra]!V{X#밼YHzto:̿G0?uXo..և뭃z:=KuX鰦b@=$b4b)@tf|ϴRA|+m)|\׉Ul0^1^jۖ1=<[L^ wԢ={iwNDfDJr`$+YifЀlDGj鲆Tנʏ PʻoE|6ۏ ? ^h&@ufDoh}OU&P"'_u: XΥ:<7Ee⇲fK|VROm|aťV xӲUԐMp=kTUA݃={PTo{2ƅPE&<tj$l43@fZfȵRV5 o?~ooc7m?[[[ں[[޺uٺ[޺ ݺuݺϭL"*@gp\#^ J 1 L"C.0 ۗi߭TX/ (9Lc7H ^Uh%t٢IlX5"^N\2U~u |_\\L4Mkr ߛL:d^ kH,/3w'|9JTK+Ipy-ʩDV-3KZLAB5Ω9+{qK o&-aΊ636m/{/s ҃ RNKRNSRN]RNS9ηCw80LqpKrpS4oup«令 6i4 42_fJ^\tvHM8|;|U#إWRse0Ot^RE'4޽a>XGfqR|yÒvIaaj;,mn0֫ai;vo[g o~ +)t)s DB[~&@5>:X؏ie U3쥍/T=X~~~ZEj?woW~Z[j?w[|%l!L'=ϔߦۼf#yz0"5d=ZHu]EkiW8}R]Ej_zdXU_g7¯oEW_/ w_~K8#ul[r3J4y736IC$IbC]: Y'/^:{M;j:]@~jjͱ ï^ /Z&U3qH/mtQq ڃt =@Pu:9pz9 Is'̧d>tԪ>cx)46i!UjߵokX]kW cQ[Pգy\?kxul?X8(KJl1{`pq `iL?􉾩A43hsz#ҭzonaY0Msߛ޼ ݼmݼmm歼7oS7o]7os_s"pDTK7#sl20>oTyAc|Uw?]w?S7oyۺ[y~n޺~׮kٳ׮ֵk׮kٳ׮g׵]ӷQkofhC_L;IS G4}˕vD+1Aw/'ټo&FÜ'7奍7չX.aW2.??|vXk1>-fn՝m?Q<ӃO |),i%Ӝ^tX)nX)NxֆԢ V6R!UߝgKQ:~wgkγ,* qh^kX@dS\*1h8_3FHU]]`nhVT߼`6 U]RiyBG|gK-7LG#?4{~YR@>B¿ҾwKо}k_g_ףh'y=z9G"^_py=ajǞGc}Ũ CTC|:M!! | ^p>Be^'X=O2^>_ ISrq>՝!?vԤ)SVGC>zÿ;ΣĈݭgiyl6)G8Ԣ;Ns`_g 8&P&>Dw/ ~ GH-fM >zol |&x7띬D1}I퐚zW/5!U+NDd,#ĉ8G"[mM^Rg[\4}sϓD=b,K s3O^ok82 \&Uw`/p ~7|]lZ2q2'[>ۻXlFkl^jkR3ڵkh E᳔Gy* ~/N%ǻ|UW L' Q,Z%}D#_E\H=g)АO?/&#O7ooU7¯ ~?^Guܐ򨾧xwzrTuTGLwzrTCs|xڟZ]z7xoZ]SkhjVOuUf![)k|$" ?d_BdHD..`kzS"&D/(bKI[ q:wmo@V3* d.jaŰaw+ [jzÿk׏׻okXKk}[9 w_zï ?+~7V2֍xbpό= +r65^ ^P:kss; :RExUg &j1odlLI H4lPQ1Ȯ9R$7ޙ'X:bZ0'\&"xAAPΝ;mÐ`CR`\fBS^J4 ՓN FEPPrMМ`"%ʽr|cD>h||\׾FF˝Gb=;?4!poV_'X~~FW`v>F{~FFKhɯhɺݲڍ7}7FW؍?&_xel'5x/-)t54u1ZaΨ/E^:_ú\: } | Yaú:߾}U_:6inGDNB#^K#1<?4 0LnW VNw!៳ .a 뙂Bq>Cx>Z"~X|D !Y #}Ȥ1uyPW7``i$;3J3$J]?|G뵿U;>p6uy7VXqkF3:_P`({Ӱ}|vGx ~Hf^եp[2!y73fdf3oZ)Gby>~TfNե0x 4B'DW 1 ^>S@$|l\EJ+|$;CCj&p.*=9n$;:|(-^+HkU~4 :HuDϖIH;*+-_M9u-Rq[ܦ|V䒷oGy| YԀw`l6\~.pԶ(cpJGb?4 MRkEoV3?'X+ G3N@#Ia--).I6xg6#6<jn6 Lm'ߛC 7bҶ g'XLRȧ/X}YOßVt>˧~< T黃O^!]?p"}#~UxL.*}?St vL=8mYH4?CŻ@jb|z.v_=NװI# ~0|).fO~~g~K/ |X~z G c`^hE1T!9ca!F"r1t ݙCwmInKے-Cw-^ 4òܥ~Y_C_c)f·~z6Wb-'Huae_Y x37{Ā}^yYI8l@" ?'_\@395O |zG\Wp,/Vt>] 3#*Fw/fIRHO d kKD+Fjю|s ~urAV @OrD6 r4^C/݂tnrh5쿮w=:ӶHhgv_؜{}wL>ay+w{>owg* LnЪ ~6oM᳔}O3ړ]`gBj !&K&[RohFﶬ<Fh^M-np_!#T@_U3kT hA4΀λ Dp 9qhQ5; QB#1Լ9U3/g)4srI!U?únL)HBN\ / J[@iF}B`n7Jr:lyIWS$˦Yf1y0DslREYK!X)MsL!jf`6<*\QSx~` /Efw$ YWMndϏ KGb=? KVͥ h*+7!7 zw|$8%{wl. U[)_C/1[} '(dOғ3QWO~^}7E  M1|.z\nDžABq! ?_gk6vpJ%_&! Kڰzï<`Qÿb.a5yyR>&AˍuځI~$>KYwx&UklASHmigy)tTy=1=.$?y9-^GHMR!`N+yd)N?+T̶Rk\7O^a[iaa|$ƫa y0Yvڿ& LWpHhYPs>YP;SçGĤP 2OOKT\ԴgH(m|P<.+&~@!UX`Ӣ稧u :|; 1CjK  BVsﰒ {v4x(רWeX0٠D/'!ⲵ)ʻ)*ƨMMѵ)M6E4["4b)rBPœڴ)"M1- b^$d9Wq.Oׯ/%YG^qekz>d.7_(ʉekoyAiMŠ]zl7jG2ja$D+4b,tpQNғj'p|Ԥf/4C_ڑ/LoȗFT \/_a!Ub'7]Oj/ %>Vq#QUPӾ{,+";G&,vYx=)kO*ړ'mIY{R~=ikOT'eI'7//5)~5)_Fo?&#?YB9 <@(F VkԸB9©v } l~ɇagڙX}ݭJGYAyGdRkRv!7Fs.j$>JDKGCKY4~^|6m](bƶk|? ~d?xjtm]'X>nQ[\$pPV7U^ ^txf\«_%c<0m'FM ]ID.]=fUܗ.OrK;c~ Ѭ0TM(4UA"-L97{N:'M{Nj:'u{N:'5{N:'u眄fA@%TJ;|cjǏ?ǻokXCk|W9/2{I2$WJge9PQ־T *e;f9qWqM)qٌ|6# \ >O\RcpE!#h~}v_}W// q{H쾐7yWv_\}d>{),1k_1QyٝD~tSDRG"+#s ր_$P(m`(c$ ~KVAGimxLW/ץT@jNnDJrbv6Lj0!]O 37{R]zn{dwd^Sz(fA"]_;z#-;>@.,džxzN=_;Eϩ緋S*Хόp qpѿd4r>ݭ:WZ%kłt[eNm-R~"2dE{r"⾛bc;3؎miُ=X^Q&Uc{C4 Bc{ >*%0.V>bLBo;M#1=X ?xi7 y''X>UrEWkQ}/)v-i;A"5ʉ;tIQ| 49==77L攴d. FLB75lPQ\^KMd.K>tXxoKb˝wVˤӓmMl+\7h'X15k KzgT@#ĺ9|[u|+O=B?RgDO:3pPy*L/J5-Ym6-aqZU\ٮ~-=i&Iݓ=i{֞4'z֞?{v)vucAŅxK=K ^:_-6%x>_dMd.[tuݪn[jwVKUI*kIUOSuɗ.%u!Π]Co]Ktɿ%?3KյM[f^L;x~/4?{*xj&7J *SHymF3l)Y6#fdfdٌ,R^q3ҋlFz،p>U>ծ>U?TTTSSSOOիOoĵ[gv)<eNb4Q2wͭk7Fw/[ٽҩTHRfLN\ T(Wz9 Q܏-n@Ljr2^-!^~gEsz4pDtмO5p4e|U#>#5hpJG 7 [w;b"=_K'/ޓIyƫ'I{)I"=ikOzd=I#kO'rĺ|ɸ>=0b]FEF~ 5<7ee G2U"&@H *~mRWoZig>ngH-[ZA[XKF ,[' ko[9.2EGݐ6OrM5b[/?ζp%͐%(CqGPr _f\fN ~\&}\cXgŐ9i^T$Y_3Ѯ%j)2U, Vl?ǵ>k}ak}þևyxjY)B1Y(ՄJ"Zn0XtP{{) {vo=>:G=aza/qCa#\GX jZ?7=k]=k}CZӳճgZn_a'3ExE&KwJ@@)4`|Y RoZ)M3X!IU,Ηj Cza܋QvcuAF x ٠\ĕ ilץȪ1D /H!")=Dyݲڔuzv Uu9Dx5bsJ!5Dvv)CH!b"N"kY!1׺t{_\ý\ý| .]ׇ.p_p_ w4UC|Nm`.ǴR$#Ux,K/2}hGSlmMWS쏦WS))rb_Mi?Hj9GֽI5^^fs/#_{ܫ,{?v܉Nyb`5*놷þ\eQHVz0|q/ / Z@Fy/ Z@jr}2{. |. 8H֫Ek~ZKY#5ux|Bj~i;b1r& >Jw5EIu5&BjqrΧX/OkiFzjWrud3aA%QN\m,Y<3LJfьrMLđ8]s% •^ @nCkf*/])fꩱX)굙zm耺BkXRk3L=D/]~:L*\R]X` ^RD_=glPt]D10_1ư^10_1p_p-Җб$Knwb$}u[O#%rzu;W߯*W^W}]W\W-Uuk'jUc_U5[~]W!w>/RV,3:,//)6-^L  QNB$`8JOdBsΰ; \%ٮK>/xs!RH{uMP5qMMbS.ۋa{ѲnTTƸ:D"\Ew̶f6JUaU{#`3Ѣɳu]ƹa/G@z ǸD%:{tO'ݒtmE'Vޓn+:閤,I('.NK3ozR/]V.iAAW]Krf[t亽*c~^Ѯ۫q{ծ۫r>Ui88·WWkW},_}^}~z|7}^Gs|ygY_GhѼѼU9}Fu4/4,tR}͇xa,ǨFum7(VΪ&Q#RK4֌l$[˜D-]Х,(Յ6^Fx Ro5ٌR]Bq.k)R?v-%ZJ{)麔4]J{)t]JRr˷:JwR[(i [`֧̀K!hX>:">&faнAF]f< .XWԯwE9qіGq.Ѝq0SpeǶ_01C"Z#~ӃfSB~B^.+,[u!|-[˺(" y =[ RKIהji[? Y,^Kv>z7Ea*fNTMs&/OwWS gn ٠D/'aVYd.kڍT\fW15^3}iv⺂疔]jR.T_eye[]kT<ۗ.ȟADve~Znѥt][:|K`η|{MZt]=֮mn:| {2n]<.,7ͬ˾tRSEvRƌaH K_BC^#~Q3K7'퇷54dR]O"uUS" V7u^` ^!Cs .+23"~x๷`mzC}ϗ8 ֦5އA Pz0ϞL&']ƞY~mk2IJG][HQ_$l/jasHu {kiu\ B8T?(רq"Η 2^'b-EK^:h]橇cQ j|+5*{4~rݞy G%x9pe7"[ty¿-Ue Ef]MB`)`.&UXծxD+f}~3nv>YI{nؾw2UX^Oj,%٦+B嗐zV>βKy.p7稝t\Cş9"Q-G9N)"[ugieZpãE]v<_Rm^`{ǫ)kdo|%٢ {Dsiȁ뱭0Gb1`Cܛ2QKߦ 5_aHCgϦO󑘑f]#T t [CӄϨmEJTr4^ZN~KUdg?7ogIwonέS@8y(:o4Gbi8 m-?V EPK|U"9\]pJG"BC̍'|9V,Lh"C  >3Nlhznm[rs3]EmVB$o.ΧX>]cWpbdW^Mlv3U^ ^$!O *%!;[[_J.yu$XkԈP0F$`%x/ܗ.0Upڢ4[+Ώ=dEp>]/G9|.w#!X%ͯ!/ߑNbۍg).ۍ%mGJ e5=q!) _v5S~EJb ! -۩5?\jbk[ N7gTkTc[nÚmFEFklA`EK.a|t`W896k{a.5޼5רɀIow9JqR :5;Em,6h4\k) #A`xs\ҠOn@}7k@.zQ=}ضnwz!zrRW+J59pV¯>MQ RA(tA:g˙7~aٷGO!U.?SS5#`2D ں'K.04`3M.~|cHv gH(=I8_#1rUdЇJ S??DE=5ն<G"G$nfV<+w`v+vܝO/" 6op>}ƌcƠגWoV2 pL{7f~ʳ3lR{K>ϭ)V %g\qgkpZv@>l.'ZV /,}N4?O &GbD tI =R|5#= ]%rV ugK:t')^RUn/ 4v85:¯/yyY0P*$ ~O|$+~xI~0- WoaR~:<ĴrZțȨ9 vI_EwHVb}}g`{M#8,zT_n?=H,斫ΧX~c6_`1YűS#~:ޭeeJ 4,+Xow7ޯM{ߴ~{{h7zc~tޟ޿*wu_u_u?x{io?W@N;df3Td2qnkhyUeR >.#'U  )ώV]l]{|c4`kd`?v%dE9{ȾtiQmعKw׎Hoo7֖˾t)'fQv̝lg-x/ܢ f[#ܶpFbȈhQQzǞK:~u';Z[ta<ųp/7}27kԑQɖ3cl"6֣}xt|zp.|nt nl wyud.!]4Z *4 ]BHh/ n"?@רsKF*3ڇg3blu#= Ӛ' cXX[$lo<)Vlj]6/Z_65.ZM/ZM VZM?s'1K$K_o4ylʷIc)s_ZtSoˁT7uNș#$RHJgv>}9A2q$/Rsx+4sO,xyՍ }gFivsNBtV`!Utx^AW04}]_A_AWL}]_A~8W;RZ05޾͍m]]{e ]=sy+0NCꐯYlZbOF?Z Z¤ Z$:m-Rdt/y \_=v>3J?A,K 44{Äb MI1U5 ƕ܂7@I@U_*SA_Q[mg D嗎yKsV=[&r*Uxo dQƑ~ уGGp4THtZ7`tS//.i OьPVM¯^ZL5Sd+T/RQ%r? :2Jv`$+M<]>g Ci0p^ҕ|OiONW}d|2Tmv4PQHaix;DU2u7F0/5xIA낚(-9ob,/dR]}X-ܢYht nXZwyY~Wͱ3&{`07V=1ka]DI8fRY rj]t 7N#:|#K1=pg[^N[󑨱TƒlI)ѴԤK%Ri8bR傟k̦NXLHj|k6 ooTorA}(<,9mE*B4Q-XfdڲY#| Y^KK[6#|)Ԟ0$eJK$֏HDG>@J \Ԣv:3:sHDⰜnȂnPOv>)De?!bȧ+?qF]jy`kFU<#x VE}7l層ԒcIag)T^K*bIb+z[RSKҤ&|[R9puVI8bR~3aXGX6ާ)V_]_Uw_]W_Cw.#Ͽ0#AbgCjLceGӼlHuM=S`٠N)}eڞ+HH6VN4= gdΧX~? oo#vH|.gPbZ?8#XXh\*_u* C9WHum _:GAt ,BSJbHHUܐ Z܃d`v+R>-BOʮڰ(bOl ^rIt3drEF6gٮ fe0 P, 흄Ѭ@@+p 5 xS: S +Eo$@#1c_xg L˥p[f L~[Yg==+}PW)KbR/j>lܥ>,S_|6 ?᧥4Ïq]NVHuѤZhg/M^RHmQf9b ۧ028bxH8e0gjR ~!k 5 h=o45^j5le ^ 7Dj2.xE2_B ։u1Bζxh.Uf[C _4מȡ6N,gvs>EN=j|j KΧX~d+YA\tߪ VA#/+YA\bq1Y9W2R}?? ow_MK +%0# |$F*L˰R_ul):WbwGo'v"A5E;qzD€$$^`.7hIH֠Œ,#(i:[J%"O ݠx^P@tUL@;+lt^.w_ڼ݉!֠KNp xHjA ] F F4^.\! td4uAFHP,R"=mw>9x/ܢ oA!<'yv֋>uxk5"Oe!WK=r便뽬2˺˼z D^^ְ֟ڡ K6$終R]o4{% La,!;-@ Q}r'ltcY+`ĒTd[YY3"YfS e6S}WexlGgiߍu` +Eq>*;*FEQ2*ڞb49*{Tt({TtD}'sVt뢠\A6^zԾ䓪%kA P.Qv^Vd.Ky/].e^/]˸t_Ky2Dec[m__l}}~}EʾllKɶ }Jd벣 zt٦D9NeI]R2u)N\pߺ$|Rm/HߔxXkTѐ0xfh'Ls D(0^EvPbIR2z)nW 7&:)m>9d^ʴ{5x/ܢ |3T_5rY&!zXk-zzhW>R>Y~ާ$IhW_{j'3Jo-WyW *̰Dl/,cR/lJ4!U:vEf mVDo?(רz`p5JvÕ}lץغ;رܩFY-uF.5 D\Ν.~}dr]//*E?ޛTT{qѼX!DCfKR?.kU.q|? ~\m!xDSG[CRXMB[H>C̓U0'Ca JzOddk%[]S$+s[o[~.|l6t ݜߡe,Cwg讬CwEn2t[`zqS3]ԲbhbmAx*uoDsK Uo*jJtc5xclT?Ffv Mac[벺]܇GD|F}`&>}H ~_AT~BvN/B}k*h/8+kv\k(܊Q}fG{]P\ILvA)- M$Z敻qV3p5#P^ʥCt(m:KPD(t(Mu(C֡:K~Pt(ҡ:TաաUu:$sMDeXK#! Xk9i8XD;1wO@<de)VߏZVɶ'cN.(WF{AmK] ;v#dSeY}?v[Wp_󁿺ڰWHm|<-︱%F%%FyS[]bl]bL]bw1uuѿ ]zO+9cn 4o52*fPXjH %ZN|Ug5QAl"v :i :q \e8-rT6yѺh~Qh^f4_3jF]hfԌ6T.֗a]:W:La=::,aÜ:aiQZ o=1+68WB\H|3;j7bzHWOvS2G"e#HWNW |5@}&QM$zGBkxm0O?zVVK!_`<Hmk;'6ḦeRfDӵ޼s*c?gY+ oCvbD=[1t So{U{_ޯO{7V ։M(G )Ng>+wwaq ~V›^-,* & }8FOKW zͨsHBj[+TեɌjgTh<'#wp[I>#5[\-,ˇ55]{h~ow]{9-U"hC^CvK7o=GJ25Ka>.ßJ4ɪ!2)|޵]̘SI(|VM j/v˥P)~p %j<+<Ow]4k$eq(5=kc$FH{Ϋg[cu:/ǑcJK )&Sucs/yP-o!4I8pB>xL`Mh& a7-vQY;H;&$L|$[eں\"]qbN a ?gU#QNR); DM+lúGH-)yp>gb8Čm-Z/'V,7~HV}:O[{o|uq7P9˒m{Eg}:MXbWgHu,#9ӻ̉eLpJbԟ]*3z0v$\j4 I >|pU7!g/RW}ݜJiߵo7k߾R߹OLn~dn.>Z1҅$#/)v]bou]B6K(/]KRRKὔx/z/ߢ ƈ*;[ XHz`Ēq$VrRuΧX>]2DXCYL%Ȼ kLRVƋ%Evsw nѥ}U̪_fվ̪\f.j_f.*Y/YˬڟտK{+JIlE #[ѭd+۳E\Kqb+ڳM}mEQ S8**`.X2SbRA(n|oX KKaI ].,L]$4uiSu)d?01$uISuL%MՅ~K.KtQ&uvER˺tCue e/o}׍r]ZBkԀ&ojV@ @/ց .Vܷ.yDu>YV EںQ.lV5:t$j'o(Gv*o.^E?'4W蒖0JuH0^C22L,y/<"GvQth xbr]z+y >YvSxNJ,o7n O}rqu5^5^5^xxx_e]e\ex_t˼t_t˼tEV'sժܭ#ډ˨.M쪺ݪp)]s-?<>w2}a\>RL+qbls`Rާgh< ɭ }.񹩽QŒz=kԑZs/U%E:{]o b%'%T iX*JWQ*JWUdhU$bWe$R ΍ D>CjD)>iHj3OȮJ7eV^W15 ^&Zh}G1۰Gf6K1l9 PB^jQ E:70Pm[DRb9Q˥pZ|cXX(1qc|1;c!8muLu>ؽH ^ lbWDxRr3D!K YіZ셄`'$H\aI_F=H^VvFBĚcZkrfXs5ZskƚyP|́5 K(ž\ډZJqٗ.S]4ф*Y tDvNL':pz; WykeDioNA;s 4!EmnyT¢S$Y'zO.̟?$>['e@@?V nK!JxVHUMUP`*88,\T_FVR^Xr>*yK F#ګEÚB&uSwvg-bAZѷu+'8ֹ̼r9]zFQ*ֺ8.rڏa|s%ZG2ז)րqZO1QD*Sd*ւ"Tkl<ov#+RݐN;"[tW7dqe"K$nNz`n\&U؞?UF |UxǩyRxUT;)5H %Oм]ecZϛ'8^1[|K5?EhQP1[ 7|DPbD@O_:`:ִѸ⺋QZ+cVM_Rzw >?:VX>btcqM9D12b4zk=1ɂIuƊ"ץpZ oZRYlYP#]f(Q+wsgV-Zq)x);yWob[d.K~2/].ҥ_/]Kt_K~D`Ol\GZWR=x՞Nl\fH-h<>J>d& ?ZAMU[Ba֐Z]Sg`|UwNZ:'m;' I띓ICI[礥s@X:¼º%]a]a@GHNGtaS)3J0f)^ ^!ΚƺM L  n7斥M9vcy/K`{Ej5\֩i,]֜w!S֧p.uɃaP7'ij0=P+|$7X1ųp Mt):BM }iߣI(i|$nYqZP4aDSZt mSO0a'ad}L\hq~/]U(z,Pg.ot/]g ܧf|J K>52T\G^y/$kV] NGuzE%3yF]C [W d3H\Y[`+12R^IG-ǥGZuG zD\9=/]11GǸx}},}C[,3t1(AGa R ^n4ߤIB¶,)/Џ"Km#- #(2@jGQDތd=ЗtyljM զtԦ|mjMiצT_6Zw-7]+?ŵܳ{~\=klq-1w)V_DD[NNN:jUz?NIL|b M%*x{lQ-BqcTdHF*@"[tY״:Twc5G-] p3>|$̑ezl+\iВ  @@ oD[_j-=wq1ZVk9^K*I-eiI;}YRKI-iגF,i%Z/2ӒJRK*ے˲z ,;(eG;. .ҥ[(&;x蒟mɲmUVH囓lGvdY"9|ʶUYٖ,+ےVYˬeV5.ʗY/jV-]f̪^f/bV&];YG;g#&VCdäM \cRAZ / jTJ/*]kޮcq*}\vUz׫VOV)?p4Fl^P\ -l_~3]2Q}%RD1BAhK<!Ń0xx<cu xBA(˃PՅ(?;yG|gO^Yr cdpmEJ4j̹&Ztqxu$!:E,vԢo \Ew:C}ksھ}:wr:\;V\N\NU'NC'׮k\pzsyp~s+cS9zWst Q9>P5|O}o|OfyoS  f8Qؤ*"Uw5 `ĉM>9 x=e="Ww\j]99k0zw+z+su|Ey u 5H90ߡ0u(t  IS=ިQ}PxF=LzoԨo( P5~G=LhMvbńy.Z3~Nƺ'mhr3Zҁ@G(BN_a@XIJ@@6KBN@YBK2ZC ?aC:v̅7XȬٓ~`ۥ47thMthсU)`!?p(S8V@lGr*n9ne9O :UNZSNZy7om:y ^/s6䈁۸Z^/]@ 'e hsl_@(*@#<,2h"@z1z1:aYXcc&^N^h3f hH[ ]5ן_q\I8nDì:UcD0]Ռ"mX] YuهEpU}DrA[^EwOfN$\ꭕ9[qH֝YIZ9C 7|sss;Υ;Ρ;888F- IԒ)WE{EP޴eI jeR(2p5 D׮ !}Y._ [_Ap ЗnK| 'Ap ;,sa@[+0|TQbc++&?J4SfSl}s]D΁$4^RZ A"nH{~tI^ CdX{*6D\+ZuO (V`"YvGp5xQƌݮp-j`+\Dv+\3y*vlե'ێ?jB@$bZpb˄%Pl5\lzgt!x!CV=jpj/{H [W;xV;]Ajpjpjll,kiyCJ[̊#EaM:&Օ8k9_% O^%HfKHdѳW܈b}-Af?._? oCאYee[ސ[C5a&Yٖ7ajleאV9LJ^Y9\kԈB|'oGk`p-~ţKNPBERI[ɰ,6i|[RIZ oZ͕RQQ eTT_jHD7>Ka5*?uS)XGf@S#VFuDl80tbK# W_&jD΁}qĺ(V_EW%-) .Q*;D2sS&[Z:mR@1 Ok%)V6G?hgâ)* fsH>]?0r̜a.k%fx{Hu&]}n\`bH8᭕1)3 C\\fhȧX/N m1,YS[keL"ۤ*n^VLא"G)~v EOo5y Z$(~Cjѡ;77Kân< oHt=z۸EGokg5/߲T YDC߿zrj8b03+OPoLH ;J%٢I_?drEev]F@if_(ӓ47?SjlP )x/ܢKyQdNBdI/sς$2'I^C5';QdNkN?OCY3s<'WJB[k; OP&(8 *[oO5%l.R%?}:r>회:_񩨒P'"S7SBO+> qlm:a9V?aqc}6U&}i\sw}FnR>!_>*Ÿ/7K7e:sϚm 2ezpVrʛaJ2r?O3O_ft>[ jٵ?  5o™ܹ#: _"#`Ʒ6O Vb#_ps>[@8Rp:|fC(n4 63xk[ D4d֚JxӲjO1v?g erw>W5 5g?3(bFU^3_*m"kM_ܦ/*|3/"i |狤0I;GHuL$~Hi/d=cBjr03|6/sKحae 5$j%*xAi []4ȮݞvC *wnw٧4ni5 'ݴ|S%'숖~l)~~}GvK#fdG >=;.Y:Exp1O?/CԮiA(ޟ }{߾w>*Ϩ(8.0֨D+t;͞!UV[mg0F|(i@ lH>3i`:G[˥oI3Oz|A9󞍚fMz?s/sy~s|IzX+t2C_f_`s "iA&R[̽Nu~9!բe)ֻc<{ia=Doo, X\0|s@a? t)\|'$r.eύ;|$zdƒj7j3|M3x*, ?˵|_dzgU}U\Z~78KxCQqq9޲IUo6O^wfI'=ܑ%H>Yw3;wUI:Ev2ާ)V_ީ_u/ԿNENEt/_u/:=C0^i]{O붞e#q!}}u=zZ7O Q琂A7o=G\(OCjO:8 O'?ir(PkT(b>FQ줁{zJ%.~Ig iSہ2>@ie/qduׁՁ8P@ee~;PHҿ0btM2bm s.!m;u$ӿOS7SQ3;jtVߝm 9_RSMyk_gg3cZH}MZv LPx}g`Ťr>< B.MLi ]!/3Ӏ]}UL +;F~VRCG?/~fr_`Z pFzR6݉_svFZ k9bU᳟gϫ=)i)ֿOi?ۏ}ßj' @C^+Iv*bĥN[jaĻԅy41":]Cj 5VR 'O C bXib \`!%@>X%?|ٮ|f>v}d9bH<(ƃH9]$~ƋU)91Ȯ }EujGvHFxM+*{:q.y;tyNyN]g3*aׯO fYxY.ˊY0\ݒgzZ·Gҧǻ[-G',pb]f8RkU;bק씷o͢]-> [ҋ|kHLOM;j߶e~mwY~~gnje?f Of#,e1FLGDo?(T Z[,.W.Vl~g)^w~og=WQ/$UhEZB62{ o}5Hm tm%Z~Y _{Ǐ?㷽?~?~K7Ӂ |) g%yƓO⪖ nXR{d.cxz:)?(ajRR%)myJTǟV\*u2 Ԑ nD6tb^EW1*U \٫*fz_EW4"Sz^摇n;!|xp03 _RhZAcru/Q,9b |8=CI82mO'b.4˳[5:Vi7T>_>f<]5،Ǥ*0GH͑IOHuf{m i-śՂ1xDoV͚f!ǔ<ΧX|_:t;tݩ?ߡ;ݥCwj^RZw]J 4]Jw)t)]t'0[/.#&v∆iͤ*nsD#w8kVG/EM wAK. l^kghz&O끟>3Rw$޼דǑB[h|śSOd<.uI>A&S8W<@ P=njD=@ ֏` Bj+luGR>zlp*w@Z-pKVHHU>CVX5!MV8*;b٘:65zk;`uOp+ 6TX+рO ^)c_B[.!/$G3{5& ^qTµ8_H8mDlCW7<f̎ۚcA&_ט,X/!Bo;T?_~UۖU[˺jmmmZUU^_ҳheѰӻhXhI #=dEÒENϢeY4$ u+~b>w뀟/ΧX/?7{|Xn;m^ \Mu{-aRo Y,|)e:sg>/簦sg§|UǢ:4Z೵âЇIuǠKs>O`3 Vbោ4 }&5=Eä*{-g|#տfe/$;@Won/|Y4-,v~ "2 |Y4> qhh(Y %-v_cV-:t;t ݖtwVYnUnGy~yV}w׭z):y`M:5?{h|%2++r'[3-!U#ū¯p~qɀV&Uo/pRA(|zgqc2OqQh9?t^R' [(W${jvhZDUp3|)a3cͤޯv&ȫE5Xpl]TK'$cp)N2diR >DRA(n|UGuUzLjE[>S{T7mGT=#P3Ӳ #Z9Iט ~~hzH-xz)S`R }~N[YiR'{sfR&M/B ,*$Ėut$Q=PHBl{37! igIRA8f,Э|q38(LsY?x+'+1MŸ(QiͥpZ |=.´,r;%6MorTֻj[ 71/_,c4 5+s)% 'h}!<(QIJ$ zvwB΃σ?dr* e7[^uNMnסߡu6Snסۿ~I[d*L~!;~|:Ro?xmPoj?ǷjOt8*̘#.޽1|N/.7d˭ww|q%.:VCß/[GS-#oKtLtE`Zet >/1sJt zE-1_gt8 * ) k T\R/OK>5|8{Ї];IUscd G- 1̒ CeW 07S?3/yb BVɀeR~GIH-Yms>zÿ{?󏽟?_OGg%X׿ l5=%U>[=%zJtKOIGV~OI6=%mU/c~m{hG*ka + $CF:Ι~[_!>9 V立xKE#W_ݪ_ݢ_=gͬ}'Ы8#{h|_UHzg4k%b&-:~Uoj_kUm?~Uۯ߶l^墼_WI"+ ~"?m߬hXRD ?O_~}Wo~}~y~y_Ӿn R{T "j/u uo𩀏դ ~Z|^㉉Y߉YuYu,:qw:qV8Cy?)w!Pw5=]==O;%:C~ۚ}ȋ[8]r{ƚ&]ˤq5"֤ʭAt5S7{ @h:;oBq 4{ h+angr'𫷶S;[yeR>ܚs7 V[vTϢ3΢o ͢oHXS=E5ҧYp[~z'E㸛sޗz>Պ3meKzg򤨅T{:NE;6E΢E΢Mg΢SgѮhE;b Q1]Q$ptomeR>дTY+M1l!HY~( ?+rc}~K]x~yy?S^^WJI~@:/ڑ'5>p6쀫9}qR0'r't6PeR9`.OOiR\Hp tQ7zgߡK铒K8_X2f0u,K0`}Dm&Y?Z=3N50T|ZB3D|. 7|-D&>g %3pB9^-+p&-lΧX>ӥĺM$6庍=eݶ39lj&aaԐz-~OjVkݶNBپFھF$ӗ# x-;qtS d|UrǺ_vvKrM>Z!Dž'={7-,o[Dllc{Ƒ B{\Fw>zwq1ƔwώmǸeLj[cEv=ˎct2{7df5߻![̬ MGm<?_~6|)1ΘMpYcgVOSMŸS}|)|ƔwS}Rݽ?ïXpN_>ӥWvWtG7~(jiE$>[˥36qL}T ɂ{Hu _,  oy`Mor`eAMnD=*Ω::::::,s;:?љK#{;{nju/h? P{iXya8-Tb҇d@]ɏ%%ry/Q64&z=V{9g!U^ YnsXuIżABೕhK * + * )llOO_\J$ztIt-5nk>]F3n5J]UR5f5z5z}`|dQcƴŘVRcگ1M5ƴ_cjLSi?ƴVctIog -%73>/q3߶߀os) kD[$ #_F.#ڗ/#jDKh?FV#F (QW\?%1"<#ZbD5FňF#ˈOb|yEG*)`G鼀8?]0סX`TtRF>Z 9Sj6ҁsIy;u^ - :L SM/ 4U!^x&! X+jUёV|Ԭ^VVR6B_'kxdjov2a/[`c$>[sd7}QhiU͹vt|O57ԪU51SDOxVgƳҏS~QM~VE~QY~SE?h.GW>ᕽ'(EOR|«Y"^W#0 =<Cbv9CL U;CRfDSlToo{&Uoo\o<ܷ\\!׬Y9!f_!o{]{|}7) _7K7/̏UH U ࠛ鳇)VމsĹu\9t\:qwK%WD;] ` +f2랟0 Go!;ssqǹfw'#+ɵ2ˏ *{= ;ϓ޸[b+IP*aY^ޟi: dOÛl Krk_ يey ,-}ƒcr#L2ʍG^XjXrb,Xp ,0]n,0N}a _[2ӒREˡ+x KYKժa鋱P`d z,3q,SI[a85OC e$m !(Z m:wMjln Gi?Wtq_{+7`SS'VIGhlL.?]'vRN}(`GKE o<.HJ-W73$(rehs0-inVlj3{.x ^yg4>599 RjApMBVԟO3t*?494>5?NGAUv{p[Oͱ!t$^ͥ6I*liJ3_p wU8<+g2Ey 6UK6޲-rޠ7aig%3٫/jgs5M(RĈ5^P_SV ه2,U/[NMX GPVWGZ'њRDˏ*s4y0}ir 5cu +v}3Fy-;ӿYi?q+gDž,7K[tRh#|럣bǭ~g?nYqX?N/negݥqv²spT!H}B~Tӥ;sy.&"c>': La>c'ܸ&USk}̺ov\>_qM>JUc7"5LU6k Q&K%eYOI\ZFJ+?Z/2EKvρ\6sdE=^>ռHvxwerޠ ')գv Y)y_^OI!^B^%EEd&zSfRIJ %^--ȖٜѬ(x}tIcVH\>"R, zc}i*h̠J\4BZh)JS QN 몊Rú*UCW%>s5;o(Lrޠ4-W֣E^ɹj-*CW^e $T&E?rޠd.+Kܧ}#CBy/K[ۨcp[cpf"لe,qBaaY%XԼuˡrvWVFHfk~rWBkzô(GAB; 5XM@4XWoE[U 8j!XV 9#qM2;S4>",fYo.o,(LepeG*[lU XͲ7MXn_j*WqCB^Ap59_oʃ$MW&uэ݌T:2>o?_?; veGvv A % 3J"_z\PDUӥ6,_/P'C2uJS2^P9X6[4Ց]<]td9oЛee,e,=`/,+`|àeXXf2U K X6D^N+hllƒ\=`*XPz ^$;إ&k=]no|7=wRa$ٲ zPry7UdBmX9d?ϓ4{1S-sRvڧsNy*OGxRyw?yގ>Wv9Otl|g$ ~n{)/n8 B)7#ΑNvޠwE.;٬H]L¡GM WJ ֶ6Hy3Xh ()9iYv&d$ r ex24Z:YR<-w\z}lÒnxgsn|S *tuÇ׺#;t o zR>`)?`)Kya)|c%ԱXXΡPʫc9:V^u:VB+ԱK vi.eR].5%ԗ]ZK vإR?إ`R_vRK v%Jy]C1-UqX^ϒSD AHPJ%($2J$l9g͉sr( ^3J5D҂Q("AEN! Klegmp8>A1'DubyP4^d(.5jNޙ56>7G}>|}>ʿhc>>v(QFi(ekFi(3ɐ-53 Be6 qljCfl z,&wb(zW>8KspT+HD8"@ͥnt~TS\4qKIEm;t.sc|WPJj|v$"DD@dԿw#4ϋܼ_[\5lqѼVe=B[\-.۷)PNL#~&pѨgؗ) KZͦ6n2EQWRFfkaaooo~3I !]NQ.;XJ1-*q'Y36s#{h! JU7 & W^ܼ77u7{q^w^ܼ7u7{q^^uj}S:BZ:>ԩCZNo:A{YM!lҩ:ZqM!R **Ҥ $2c]I""DkB+rA]n,?g۬Uټ-,F9o;bFͣFaدQcQcQcFFF}%QcQc3jswCX]|Wo*墫*a_Q6˶ŭTmoy4Xal4x]H`Y X:l z7wױulw7ױvkwulv -LW:]g4"(2=lEZQkۧ0(25* HרrS,voUx?$"5?uq ԯV@r\6ov|m)Ro&iaF<{zz{yv٣9sW/B9*g0JT4USsWΖI +Mp8CRMq$OgX5'dP{y?TϓaO2cuB増ބec1t8&8& 1c1ycz(a1_ˏ-,?k|-? սxk>|zGJ0H#5a>|$3 1`Z.+v3ۥ.=]jb|ۥVKlq9>#Tiq^V@-dz|Շ.6=L@KEqK58Y~}R^b-3DXU)P7j<ɖJⲅ2 E/e K{aiX K XZ^XZR2oG,uaJ2/޽g|wo'^P{;ܺ6]C)2zuMlIa/`2_v.3e2]z|e`]1XyCn#b #bG#b uuӈyD1K9)̗efdܵ^NUL%CTIHv ލrU4K&)֫U,n-V^bVBXVBUUd*VhVa;)ʝ2pl+ZdT1^\3BbG#]I}mDK{YKVG鹲|7~tΒ,oGQ*MQ\*4t%pgwu5L6x:}MO [7^15,$;`Y揬Ok*etNꏌ䏌G j?oѫ;+eX'@vB ˹LE{%E2-@"FIKVOo;8*@I0 iŤphЪmt ?LQE)6EqS/hI0EvSMAwR]']okB~%j|OAfwdgwލdқIǍ"qd6$컁0JqiIaTqlR%4BnHנ#e6TG,{(`]<~ *9ή}oCˡTa!CvT M+O bً7u ?ﴴ#.;9Je\>$EP6Y&j꟠͗JDe JO>bk|_4BZ* \*. \n*8.Pʏ xv0lWIv xYorBw Q8oa8vR 9ư-!IBHfl#]]gGv ѨOm*jCG˻NglEq4Yj,#(^MWMXvOh*m/ r ¡GM;(_h6M{RM}qeުQ;d&iI@T2˻l8&PtgoꚞZ>x˓zq|I]7ϐcIY5(SdS4z2C+(I7o\I6aZi}aGYi15ᘕ&'GjptpJZ_*y[:/6洗1%'ݼ ^.~Lvu9άgtǹ A.\(&Plqbl^zGS S)V&S|b S|b)&M ":RotV $wt AkiGrT*83O+6<4 G2sH%xRzy<TI1t"AH]LIJ2ug#aٟ 10ծ|0@JEQWӧZBR^tR_KU>I۴M6H~AY5qvu>ҕԟJ4C%ZW%PMD+Ѽ+J4o*љ8(އUx"5ߓ]V*vX5U*_4^U? R3;eMRK#NW '.&SXiC$RIlpK2BJRT:毿?/௿/O9-8ŷ.$lM Nt>Ֆ(K|mRPec |kTǯh;H[L{$Mr}}D駞B_V_KUc$J.gPy CKfU,49]6&^P'xd8ll:z,rŊWYN/p,+_R ZzK.*!VpDz2Es*x ]V&;"ZS<Xyu\z,_#^8Glw"l7 6˭<|v=v -_Z ca3Iת6aPC˄0NR:g8hVpSR+E_G\CU9u9B"Km6UԇBs>5(W7!{jJ+12لBcKәOzHPhIX F chҵ\ 0^_ qy)Cg6u}a90UvwrUʰ/7Lvxf9ޱuvj*'pB-bTnHؐr{UPYu9J!h#Ř@*qP(>gd1xA%(ַHWq{ZztR>V9(2铩W}j02Eq58/P\,Hvhx7ʡWKRdvxmrw3l'0Eawf,)@;VUʸ&,{h3tkNbKҭ]Z:, IeٹFD 5OZ˃*; åZ\YtW9JM/ S[iGw\&Z#,ADp#08e|+p)/ᢗ9c@J+͵oTS֥|l¤ dRM fS;8\g{cnF'D,YNqn]{9O/TV\*_C?Aݟ~V^4B T[6/Y!#a}#]]3B_o;;%%B_g=~?wJsTJ!S'$I=|B4JgZsɥJJ.ԗkWI4PHEr*ExR p"Q%7mͧՔ 's^Y7;&,WM\:פz$gGMIIjՕ \:פ5kҙw?SBqs։=RAZzT䯴ǽϜ{S*K-=6UK5٭>[rSbcfe ewM͊6نz#dS4M'CxY2XfT0y_-#)bhy?T{ xR͂7dgnszG,]2].]v.{/B,,_`?`YGqG#G#bq#q8#v7͹hwkwsvܓv7v7͇v7aws.v7|n%=_~ן?_/VV_߬boG?T~RS_YC~2mFW$ T!H}-MrUտw4FTw4/տw4;eED3YGvMz_X2,G8bJ)|hn՜~x狒}d! HңFN|{ &%lҁIJ^n&թ>f^Z56 ^Z$duB($? xe %!tSl颫#IS* K櫢W',UOkQ*`Ai dڱ#(,uzG,YI}eJ䵩b,Z.*/q!Hlf*ٙSNwz2H߮c:E?ԱuLNِ ̀kZ4skM\5C%\W3::^&ңB'@aЈkG #]IEZEzEk)a!^Pqia)aiQQQdGb(SїLQ|B4ϱ:R\2aCaMK5%poqK&|"AEy@]h|Bd?]v+߳`R 4K%O*?>&y{iM Xĝ8ռnIP D$;s5z 0Ha) S5EaHqqSSSDK0d}C({em~fZ*O񠇆EWŕ.^JE!=KwVh҆`LT*XCֵ6مQ_I.5Av+xwKOxYhfy /bx.xMNʴזREcxHK͜IuL:tȦhTu<\s e˧V^D6Nq`:Ύʀl/Sf,Lj3I0a&5_3fR#̤k&Ljf& 'K'iOiq Sm %.^.V[gX--?%$^֛Ț:\}M)ƢC4whfMXdQ˓e X< &f,X!ݲ@՚R ʡ=xM5"H9l9&,],S,nEa^>$+xfdM>O{3/]ʰ /XfT`OI@ X+}C XQMh)`!TK S'6,r1< ~l(X|Hl ͫ.^zG,3\Oi>]P.*/췙e[,-l=~l~l~l1 c&¢S1e/,.Y2t C{>5e;o~f&;]$cevmeo޷]f]:Vm ]f}ۥoʗބePul:6_ul~c:6C1Kzg#Ku, XPne.Ɠ}6rD&zg2bM 2_f_lD1,q|Ya|!^Ux|a?c6F,AF8ȅGr(lb kTX}/<3%KE_(\v8) "Mg" G"Hሡq`u.2!Ah(8%TVjtlgH~U˥qa||`e&;aB2}/# r>VOQ_-Dv^zvB^v]Onj9q^ܮ׷tg=(B ]"-./J2  -.U&ek`5GkllEnFSྕ 0Pkb'Z2o:,L@v Nje6t^CR*B|BЎ<K)|G KGF YݣV*e[)s/S04r>R8b>ۖx"yZ}Rnt.qZWgʤ ag+MpςrEZ-z}ltL-9B P.b%KƖC%)n*ӔZ;X\O Zywi I+|kPjW SݍGR*Xaq%^Pݍ{8+nqPl/3A '݂]RK &AGF٧Skn\$FhZ* ڑdU>;v4K%jygH׫&ni-FzuK[D-_bvniw'|Ȃ1 `9rk=1(:j9j0a,=j* ;t,wd |^zGx7dd$wd7Ywy62¡Gm J%/iIzER|eޙٹ"[/h [dWٸ_a40ޙٛ^0a|߾m.M Ʒ;lߙ7`[MIikd:+< \̥VoiΪH߰Bl^|hZ =S&=CV@~4grR>Kg96HeǍHWR_:bQ[|(vx%^PWɾR Ͱ&FV:c_GfqudQo~:בٯc_~u#:Wgϋ6ed>n^V߉ԧClQgHר~ ύr9\x|.\h|ΙrύsyRw`Xf]Q"VZ^P `"Ene/,ao`7xo <څ*Z=vMb/<<0<0<ؐ}x \,xx(<~{Y+`B Vh eV(lv[[}c&Czߴ.Z:[U"|/л]e^ɗu2wB +f] h] ⹓x1ԭTLX{ ŦG&jfu*gr]jfܭT)T]*6ƶ{x[xililil{OcDJTy%+J_0=/0Ga?F@rJx:V$ 0m;`|`!\j[5 l9GF˥V#.t4LW2߮L%0vv_Arr &gyğh&FbɮKXBLEXDw~וsּ,;g*:Dd4{}ij6sWJ@,17db9O,DVu/1^c|hAbZu/}aɸ \{\ O12,ˡk^d,]d̸z{Ia9ƎЀD<[!^~MUs`y0d#g1"XjiBd`."zWn}O%h}Ɓ MӼۥֳ r؜P* < bQ^-}#u.5OOJM'P_UaF 鯥ZqTVٶU&RW t%4Sryv7֫c+L5`%^P)VYh;n~nOq/XJTy` !2{C"6-Bۤ|-S^-A%CK9wwɋt \s>! ͛F@{ݏ&p6#]Ie,jFKYC;̢^>Sm`C ;"[LY(44Lyr 3%</0h%N3 Yebz-2BaH݀{e4LJCœqm)yB)0#@Tɀ@\U^ē%>SsϮAq"J4]'CoB3x.>0vi3KE62.|ôL/z[;+mXd OPk3#[&9@-=kmqJ5@a_љ6#]kyZseڋ:"o f`sCS/Kyz#]ׯvk o! QCzk(!3Y|kTɃ!K UEeOԘ9bsj).i)4n%X?c_WW x h= h# h500׀€6€6M!GTĽE۷;iG|/%㫚ve~ՔHרd/d{y=x=IIvI'ً'ك'=ɖ UKl!${!$`j a]pB`o 5ggN6EkL(|Xjk.5(񸖨ӎ՟ϏOV~ xY:]j8i+&O z겅I*Ɏ(+bK\G IieX|l#T*7C9/2EmmMɥSe Ͷ&l&^Pq<òyyfbd/ w}~TA 6P`%v巗s^z(V(v(kaXa0نeT XW0\V ^l B[ B\U京V*IA{dM<P DˇDl"&y;"n ʡxY2`Qv0~e(Qv0(bڢدmd ͰYimQSX[/Q2xB&7l9T.-=j*Le[U aiQ8'4'[:'dddsss}II6I{NS?4/yn:i:f^'{xyuuuҾI5:i:iIrjܲ&I_դ&tդ~UVTrӫ&eHc܊н4o bKDd3\j-%91dg#]W<.pҫKܥ]jOwSR7w+]jNܥRh oJwCzjiCVB5~TNS9iC9i|&T5Ƒ\W!EK-|$'h4=.o؎v\~XҬPwwh+jej; Hhr7ŬL0;{50}14o4o4'tOz ӼMӼi^i^N<=ІZ{ 0XI'%0 jy2l@fe xYo’_F0JF/_%4JFd%*ҶΗ0䈒Wzu՝OVҙҙnZ=90K.ՏSe?N{|NS;ewʯa:tôWta&^$zDœ*_IMXjHAM$RSUԚDjD!n'$*J1-,xAжN#LkE)b増 ;zsZ縣*w 9zr9zB9z?R΢ΈHWRX:UO:*BAXxA x4Q @ wrMcٹ6e;j4v.\F+ l #i,;sYG"]x 79\Xzժjj5?U~Z=s4Ee!>T絔 @}|d&;y xV֬@9 7a'bP _ҞmXCnCKd14kWb?iU+-A-mGF)R:mߝO)_o//REA:ׁA:C::p9/9ZX/9:SQٟc9r$_@j@:7KiR^G/%˿_G/5p2^G/#TK]^7G/Ev#0{,Beg$h$EEVfe-ԿZy⭼p+7򑹕|C+w~­dn%[yo4{߷+f>oW>mƧمo0S<44o  o\d,;Lm)ލrwVaW L#ch7 laZe޾žw2AXyIyV$ljKkDC/ LlǥU?Vϒ>RCw>ҕԯVQChUԻUZE ZEVrh*Zh5MבQtdIJGF^GF;2j|dH GFJ#R_GFE>@IYsW5vpi*eSg_5L6 pB増ބE(0R/d ibB9S^Ps ~:]Pex襼wğsz6.iKu KaS3̥䂈t9.[(2<m$%bFp'TՓh!+FQ0_XPnը K7,7qFֺݕ XNZ,p\Y e/MX险>յ>ʴ Gt'D 8A7la6պ^J#+Gk>|xA#5Ya>B7avdBG޲k*,뺈T] 뺦RKxYeŹйVJV*@,[38ZV*ʥS)|YaQGnS((2_ fS vSd|>fgnu9'`_N |9ʾ;n^q>5-&/8`k8`L^{7i8`{eo?դCM&j͚tJr_{jOLi¡ㄲͪTqBYj'{Rkb6:X6 f6E/mͦM1m)Sh^5)j~{t꩓J;Q&81|4Ma!Ƀ>K-OމRѦKpuD ["}٦9["gY'mymI["+.5lE["uҖH-PQ{?(yMOw:P@ICc!(,(x@6reJ+V,FWVټq8ΐ#gc[xΧOǭσǭrZ\jVqks>ҕ?. ٌEZqOv_񖖎>xTS"!WZH-Dh>ҕ?k|r;Ɖw ρr>!&;</*?Tk\*)Xg\ A CĢM! V2Ո&,$ 1O5OZ֠>i4,=6Oj'5 jCf|`JU}d ]*5?!էH@Y;J^zv֪c(O[oOЗX'ohs>VԶd?dipv +^*o%|l:AJEϛKUϚc?OhgyPayIb&<:ަf8ۆN7a]4:'1/+XfgԹMa-i_rBtjI6a3-3^wg&|4GNIiwA6;G=_gjR(j3QؙZWؙZL*JZŬ*zVUr˯_>~__뗏_/OfP$Mr٫@CS3 ՠ+s a# GhwLp 9@G6bQ,TQ}lBns6-JR,ygHנ=00HHPHP_#A #A#A}-5@2` emrt sd JðjRu0HMBd|>7ˆP?6 !ԏ rC6.(١9ƙ^٥z+O酱ԠgQ&N >&R==~?UՎKvcK;U^Pn_Pme E@z%n*۰헦hM6E)GS46E{\}8Д4Inl…hѬzP: 꼈ه2 ˳^;`fggyviiig|1wt5iSMZkҾk⚴&&mIkҾj\6פIl]'[N>~nYN79c l/? jy!Q#v!2 ˡ5dh˴UL󭍣 AnM2m2ex/ƽLL[L2m2mryL}oi^-^ ^2mȼzݕOlW""pU4c9+--=V~f,Ty]yxnxfWx-~PTCG著Ky{'VdKcDJ+?Z/$ɍ@[ClC/ބד#L)aZLOA .Sa3vr8??g?GC&z ]ˏ+&toRWd Ŧrh:%D=^E.EQ}M(9EzxCEQѡxY%.UxD^ҽҋ>Z%M7Xu ^;b3'K}Xy-I6y_KlGEWE)[lC>d9N$(g suCKύwbqafnT!6=J za$=i ijz]T O_SCN#+7Mjm/}a*ْeB}אt 5.W&}dn h1&,=Q%OzwyH4 ʧ/xUR ʡe$rKWh}J墫±!h e_v)/萲b c!x.eRzRla,4/gf {sqEP*@A9T6Eݨu.CTt 3åu![!u*ʧ$Դ;/Ah.;- Al e/,dNfh'Nv2h'3M;ٯv~ddvvSh';n'Qb.' BQgОwjisB3.{kg/^UoMmX]f:;ױV: ױ\zױ\uջulVcؔH<#U}gEx2d=&ɦۭ)XXzG,O|E=9e)|j\Dv%*,,x4_$^,,%`/,=`K}aK"I}ǻx9t]:?&;`:?>Uǭ)TOeXuP?c  sK%uApD\PԠcxYo"WDOĐ|Uǂ&N XiO'_v.[.xz_XN Xݵʰ4/5d;bY3tںReziƥw;`jq:VʚNʮcr|jcvI6Vf $Z $ (h[|w78n^ޭ0(E}oidgf&,ՉЉЉYx'Fb'6B'B'6^ f,¿,:O-/FX/˧Fg~q6K}zj $Z nO@JM󤉋f}VԹtΛOG墨*d/ޤGv)ޝt/2J޷Q 0\ $M0(:4ٗQt9y&J??~ٿ?7[BM~ M~&_M~&Oær#z'^ŲwȮ-2&ԙVʠ,/60MH#a `d+ 'R=X{P\ XJ"wrоd3 $\>cr!&ɾ.킛İʷ]Vv٬yη]FavMfCv,K꒛]-vj!ީwikHޝ7*Ruku/}a S%=V:fS XlR4)Kx4X9 R^ڤvY"^²x%dP.%2yPEEWWE6͍mn+yo5/}a 5}iסTJ ~W?V[EX,<&Rc!?O`)Į$BlxY |b-!+8eX(ҕ/jU>TC*ZW*UZP7J oYw3 &roE)ÒڃT`ynai^n&,;=eg٥=vѣ^@-=j*G*x`-С `ZqQKժPVj~Z))J!Sr2E2"5"5l󑮤㺟<)ZdrЄ9|K *繀mqn=Sޭ増ބ勳ZV߫W ^%┗/NiZ^*{78?b?`K},| 9)T;:;*kV1!b['oo-eXYR0K fI/`fٷU6eMml}/4J+)xlgw D)$ML'hʀL/ -mX}Lw1c''Ӊ>~LWӕqӝ'YZ^;;1c5n1ݒ3jp]>{2,EWU<\'dz$,+zJH9a+-F*&li@>A-'DRI1'RXE-#]x v?as[@ *nnoBS)›z_Xb;C|>|W;C|>|co^˫ǫvpmka5CxA$i w"FV70F?e6(_e|4m0԰+__5ʇڕa]ͮIAy{-,5go%^PGvRezC,(^UM DOwxJ)s1k5Jk,J/fxYo"-lqcOŢ"@d=2+Geœy\\.ʻ=*&^;`σ.';:(pt+=j*vA@—5@ RѦhRM}YSTYxw4B5^Jل0^P[O\עˎ^zHQ~SKc0JObp|I\ˇKGi1qQ%9572˧77ԡ]*i6;@ɉ$vN h#&-I? ADװ>xAςvm2>YiRTRa]$ (zAE#^Pk: 0\PʡРdm,,_`?`)%6^Qx6>7񖩍|񖹍oj3mXh>5"0E9"L?"`L51,Ȉ yK="[c xAQ6]VΦTR/\-C o^B oW o۫[hII&'ߓN'' t䤿&'=LNF{rAR'';5: ON:ON0 }MNF/}acyN7c)i<#Ojd,Ss/E.[tjD,]\.MWLv4WLd*`Y/ulPڿc:6m Qp+%rҏk0KeZ* ڮ4J .e"fAhPu%e߬f_Jn*A,fgN9jFlC!tU7|EUP(/zOxudyavdo*eXC/pc,C;b,Z.*/( 752hO)`\zGFFGgktatat}}}~3uLr^rKVǖRK:Ffcu첅 viVLjXRxRK=> 'crUyA%wŚB$3B--./SWialM^H cDvl؈UœE6qw7M&,8 .Qɤpԋ@^>V7f xgQSG>:jE=;ָv,nWK+42 Ν첼|U9\&[t6OMhXMe pF9$:cYױNBr^cGvc8,EyY K}\zNp\zװNpf'8r.tXf$t5YDFZ*@C}_՛+0JE𑮤QU3@Nd3\ᕻۛ`|D^ޕ'twWr Qv>5Zhb^*\M.Pʧ\/#PTs"ه" V^aq26,5P9(JxX'Pu_' ;QZvԕ_<S 1.jX0 S_`atdS x{$KjgbϥV 4nKHurCnz•`Tq7,nzd-[#J}/O^6JiIU 'U S+ ߽h|JHU)"} bGb?$a>6 1Lٵ⣝sv &l]F(i0EXG[ql7Cx3+qlfXݍrEF}ۭJBj\Aa=P-/9.a8TBY.%"qÕZ; yuJ$+d]d\dbf#\^g8QFyO\˲ㆉvMkb9f ^ q%d F9oTF^$\ WfZb Y-I >zCkhИXX1Ckhkh_ )޳c:N21}Ӈ:?|ߎ=_HRގHӴYy Ӵ>?ԡ-I:i)`iZJ4Fٵ kH#S2B#d6ѧt٦әYd=UTE011RK{"Z3J5c26VSyĵO%j$,5Xp#BW|6]=|  #UO c}g'X_]fhA"i8\5|h^ 45ZO.rU3 B' [K! 3O |߱(T,4u^T#BF ='Z;MZDAkfq \嵅6Ru5sraSgJPb۝`ipמ@!7 kZ&k|LfD&<[Dv]S-ZxSm(DJ^l癳QˎCe. x"F6]t4J{SQٮ p 1 gF.#GEWCrٮ\tgA&k!Sy?(REoXĸyAuW9\PJzUbG,WD/cp_HTAA04v^ͦzXi| $ EW]XJ7hܪBoooo ᷿~ )?Ÿ 7?x )?P 9Q-54WinGkF #'BROJG٠\5yKu#oⲛ7QXi].ҥMvL#>;y{ٗ.5 j_LP㚠5A5 j\LP5Aߛg?e1&&^&?!2.&ߑ1p7aZ~P~"`UmZ2h.k1ɧ_jK FϪFo5耲Taj,jRf| Y@H?L0P"ٰWQ"ٰ b頀)cbrA D>{i޹<\}0ټ4>W\ê?|WP7ݹ3)iУ~zFT@`I X^KP>G+.ˎzwˬh={h>  s1Km~@C>*wQ1 {T8Ĕea;mZsŴL eP-X[xRchU瑵{@]K#XC-n¶IUJ= v䵅QCHPNI˕1XʜQޚ9/n('Ų˕L%x=pt%bw'Uwc \嵓1T访M([,+Ԣn+{-Ts!T2=K.RZ u7o1;e arùK!h'Xo#ܢ`#os}v1m1bEA!jUh=-! )f[a>nK. 9| z84~ U|*|(xAw$Vkb~>ۥpk&%TY`3W@6w /~yfloV6_Znd܍ F8vS&j+\0D/qz0Nf Uh^ @UBr6|s9; .(r,gp4?otHux/RSo&>'X/(>uvvl~ osK*J,r-P-#}1:\Wbt5]TכD/FQWG}17btts1:Nui'ï s0>)|OJS*?}>*Sd!~ rO~nd#~|T?S /<0!/~Hgs~]$|!1BSW}wH8E:?;pG`gsPq`sq׮zx7Ye/ ^7i PP,k>{Z,ȨDw`mW޽]*o4㍐3I,t@?Xkx¤o更α$(Yk|^")w{&*'~XV(ƫ#jʹ5O^ow2:!8w%[Űyvƃo<V xfH\boYb{.0ky}߲gTa3rH\|A"%ꋅ)]m)c3fž=9=Zm[{Z4,܌1O |Nt8>(~ {[؉\o]_Dy[˧_1/Gjчo{GMTD'l)]D3ɉpt##/0uQNtӔv]$.tz!벢HLNw'KK6R]~ry!lV\74<<͖4MUܗ.kKg-vZPʫ8gC/vH;mLgd[& 4Jr%rC ]qL#drEZ0%]3YFXt<-`)8ޠ5{oTB Oq+ 4{7\qG(8%^D^|ٲocM||<5)NنbyIcI`G]I]lWq_{&LK|yE^,Apbꮣl f;|M⩛8uM8%gӲ^gSMΦgӵll ӗ V -[[_3'%L"y-oen20 gwm5rYֵ][jK%Y8j_l5N:a9%{G&6pt{Hw&k sXb]Oɴ'O l}W+$-UxIɛo4{wxC웿~;[xs\.1-LY&c6*"≕2"v޴N0Q*n/_kW_}{uu?Cuȿաc!ã{W<}mTjf{^s;ėI9{bЧq1'7Eݥ. 91CK<Ӆ4èFiyIXYR,\1QyMQun4<[S\=sZ|}Y)GIESf'XgƆss)7lm:ma{G6(m 'iێ-]gY4f=F(^+%#\~-F|g,޴; ׼ڮyu\j̫W5t^::t^m:*r-42Ӓ(QVJU *_*dY\dgUodz-NvFTYsNOHVC>Gvj򹉘! ݝ.wUI`|(*Uv=| ]u1.dx3Փ]u`Xn|~"uI^ٍnՓ]V%5X|~E&k4o t_^6$Y_^+2#^^B^^3'f}y\}yO ~YMyF^ 3@5Ѯ$}" BtZ`P&;&A8xl@ T K_bv6[dk\̨'#Cd.ucn,n X7 ҺQX7xY7ZEVR_֍%֍=ĺǺq-x\ǵ{^ϽdkS- x04F;*Cbђz]HG=}<\ldOE2#&Օ8AV 5^{`s3 wEmDt?I[-.T}7N -;Gg\fX$o7pq7~|͍ڢonu%7gw]um{÷tçWrc6|E nCIz(q?K8%~e_緓4?l10%$HVM>9gl[)"!%O |<4`0&;6:h\AAk+s`zu(l2J3bgxJͤ*dv B[-$CBnԯntY5ft˪ՍuFj`,FCQnԿp 2㒍" =$b[|Y"V:9T*7vW36{嗱4v[y"n=apؽ]Vf6a_;|X2ͰW|V1T9\j5HwٮE9~~411% {gUܷ.F 4WY(xI՘gX-LMxF)m4"ufjRa.ip|_(ץD:IO?.uAPE,?Y| ңHI"uA QDwMfjb!Lz G D 2Bkad:TZ^1nP\:/(v-:y劌'eoIJV]ʌ,aȫ 6~bw;4&;8 ;ȫh #5\GY??%:oI%,mv԰c`k!YB2? Iy-$k!B2? ɺy-$ y u 355gkk_ wD^N;tYiKNhH|庌_ I^RGN.5C^E\,U,jK$igQ%% O,;ߩ[yKZ#%mH|ۥ4]^R+,oe٠L| E[ѥ^Kѥ_Kօ.˦Kt]¨,Yd.-r9k'?&!zX:.rMIu%`IW|6 j+m;Xok9q[;ŷ.56iMYNB۲|B53Jk7agS>H ^ݦegSA"^O\Үem<ҟ(c'j[ e;_pf.tHJ{U*KD*o rUWqߺLuyҦ,nNF]$s »/ߺC}yҷ!#ی|7afFm?%:A3| Tb'iRA(|Vbk:Y'K[G^1M~nR닭tFTCOdeQ/TӐAs ly|S7Jjs}ty5EۦmMM)okS_5.N{#S !j3m6¤ |_mD'!h_<4u-ϓ5 yMZ:>v7YT4Eȫo]]̸tIL<"wF.#.Ygl_f]Av钷Xm=M=ݕnOw 8ަp'>O ; _v8xuTMpw F{H7|S~_7~_qy355gkk_yeLk=iyA,[eS{Iu%a;(\^{HO /KW'_c"*?(dg/_C6(WdG}Wp.g{.^cR=iZgS\$\鵋a6L'J\o``k ͟$O`5*fK*]bHi;o>*Q*nNq۷f[ ow'ԣX  踮|*6oe~=2"UίkO4T>nuZk~]Yבd~3>i\ugdt;/)_YIOZ>i\}Ҩ令р44>`UbF_U~Ԁ35L 49S#A5535dNrUԣ~Ԉ+T0pRVvx<| dߥ"T8.uu٥*Q?q?o0|\;~|\T_q_4E_@SP:B_ZCE\Һe_kŭH!2ݯ6R>)f ^Z*Q^;/%iŅiգWqߺ{p]UޱL,qj?/m7Uܢ _&%".8 \_yIڋxX";k5_ CY=/a|sng$+|øR:;嵕2=Bo 5Ԏm^Yk~3 _)(7b#5FxI#q#|8?3RF*!@pgLEܶUF*^Ht#x[`z|DQ0+ۛ9Jadw0 v0|0B_Tf R-2DK ߖ%B~C`LfbN.xK,)`OߝKN:{OKzCx^!Cx}sO7ۏ nK.X ek1N^B9[++%- Y=nӝ ٠DvŰ/Cd.ݓ۞'wOۓo{֞=Y%ٓc |/O_Cpjv/vZo;j'GO=oM!vv=˞7%5ք%nMo[#j&SxcTՎm;K1n&.w^HMm'4OףfHb6g&:iGqV Y։\.נxm%%-H3PFbrErKe($C9PFz<K\d($CyP鵳@΢΢b"'YYlgeg{gQdg1,f,fbא(.L.Vk8|HdRAhLs'X~,{ketLK|q*Mwjxλ4{0O˦bfTT~Y/T,_ xxڦb˦z_736__vLz~eEvH[B]+/bEvvnˑzv<K_GZ!Uߝm穿|:O 3R%/& 6se{ B[mgH6PlZ~foj33:uf]y=a^ ʖ^F ^J<4eIW#dEʞ"uCwa@:{ lS¾Bo aa=閴)'%R#Y7tiq0n\A8<3Tڈ󜲷>_^kwh W(RkoV #7O`K':fN/DBv;D1Rse\*< >zKvc x xc輻(&X4xdLc|\AZ6VHU N{ՠt o͏T_̋ecI n`_α EslO/ؽg, T5 |U?/60_QRVOPYmɧ gQqjO$~g`?p#Š .>t(%%iX,GrDoٮ_ZJf^" PKɽ_V3pN9=))vG@y6KE/F*-+Y%]>uH2i{W՞ayW%;/#VMtZ! x,A݌ށpk7s;T_-#RKLbށ+?ύ : cZrVB S 5Oݥ.P[C.\ʚ"ek&--1t*!?36~dMZ'X>ދJ攅eaLrt(9:»-j-&ՐA2s^}گNݯnݯ~u~u~uSC_ݺ__k`Efמ=/Gy[ytml6oykۼm޾yۼ.X%P͆2pcHky:W5D=]L`/;9os,h䓼!G"SGŒ*8Tysū|I;]=hOӓ'I5]=ikOӓ'kkkf#٨Kf6*zMLQALdTD䮃ȶ#wE.NEG^pE+OXL&sr1 QjIN,ǐ_#5l|d[>˧zsPVP:/ݝ%"<[G6(Qkؓ-9KS0J%WS"MA@5wS&M4.EրR|,ozV 7դ*OERA(f)}w oρp׏kӯaΗB__Nk ܧ=RS(^weUwb9dEbE買wnfj!.F*V-+TwV'Ofhƹ9yJB԰Z`vCCtXKu@i.h|RSaWTCjKGfD;3U ė=S%!߷ɤ/g~;|홚M=SHcݣGCOE wIcc\plPhf«1 }wL5M@Ƞ]>%IզHpB\Vۥp V:qc犭tI~a|¨^d3ylW/{f λ hI.#@$y¸eF\',)4#i9tog«/]S}RULeki#zTLueä kp :?  \zh;=؈C_ ̈́L;fwa * DC "k3OΐZX,(A{yD 2GK|_TM~aqrDח(A7#J>z%Pqi%P|KjmfjWFbɚ!5o EwiW<{/.~pkO1ճ.bi!gO^^ 4a ұmִkhv[h8WЈpx\0Z:/j; NHZ"翑rFKj)K5s}drEvװ[d.ݪ4Ţɉ a0AzPD  9~C7) ?DفjPjR\RA|ܦo kT0$#8189L5&U7"XԱHh=!q3*Ey*Kf'Gm]Wy[ER[H17Y+):^PwO+9FC%ؠM3Ry*L6Yvk\aF,c3Ѫ 2h Bu`}n&w@i9[FK X4i3w`DJE8Yvco?]q,+GYrrod_e8<07Uy$VO\rb%-<K !zXx&Ux/{^TM):?cq@Ci4iOgfRM#K6^Iu Db:nhOӂD((HRsdo1ACjC 1?KEL!&veۻ. `tTkߴZ!`?T}Ēb_mNd;J%u3tl =yv )Q\ƫ/]Փ.zұ'DBޓzzR?$lBݓ6FGbO!bJ5ی1iҫ9l/хTP:ț-Α##eUܗ.ߪn t=R{Lk7Spq&Ux7˶f" ` v>f'X_Mqh0tv3l˾"[dEYdK,svcYxKϱWuI|V yOxJuz`5^R=^s0`El"k۬'&m/]jD# {x~oh^ݚ۠wٗ.eYdeoYFL\"u.uĺ}JTܜ*F]~え.uJ@nFf @"x"mr:66#~J•^d'zilx;"õym!sHux7.:{Ռt^RWG8Hzk */`W%6,( ou \@,z,L/<5L=<CDuFA鼤:@Kd'=Y6]`~|F yv"z,ݖa <-ƷyMZfvˍ?/k|H~8_ ~Sx7XqVD~dg ?lr?2v?3 oHw^Oي٘AÓ6OLH OgyIx͒ju]7Xd"ns+ڎg֝IMc#@4Usj;vRNz-иѬT5|Ìvc>مnWØql|p;f}ӪM%:|\Kl-{]zIu62 ~ڃsɿ~%tѯ_70 Ϳ~ L?~v}p?o3c^_1Nimo^?7Ǯ>܍/^6Ӓ Yg"V$ o4JHujyGj[yy0ݣx;3K3l >z×d.:ϔd.·cRoy$su__z 2Ͼ{> !W[^k  8CIچn!1CgSn t:h >zÿ,\Eh(Q7I(BQ1gVTVR5PJg RQv<66 ]j7 v܌` D×mXn|!G F ͳbVW$@dqۤjl D65*94$JzKmW6agkI'۬oǠgv٢ٚ&b.}d0ky=5-i>+e!gM1hqIkMmXߣd_C3)mym4#z;FGtZ 1/FH,+⇮x6cxTmR,̝Ƅ-{^|r- Z{YZʵ,ϲPdYI^. EeϥZm!M&ĴJHwK%C$n*d%9-[k|_C]T*]T9ʯ鿴EJEeTEFCjU AZ! BQFR~ԨFUըT'Ns/Jf4 &G8͖MgexCj՘&ym3wrc?+޼'̈́/@1!쵛tt=&U?6gu sVLWӟ ǟl;ō-6 }q3\*?g~@1)*R`(188hک/9fZt""hܮܯ>C\C]C}rӡ\t(P: t_ t,?@7]{n@]{@7]wf4HQ 4zk8v3*UTψvKÁ@C>zϑ qO2b&l*m|kH8͜U#l8<Wzcfی#^sHM>M6R%<:dLvlR4[KJeei^$Vm7 KM%iN$g4 9[S$ 9 e,'UW2'.[%y4eP4 2{/oHM(ai>%j mX%X 0E&]wn;B悯Zz>$7j~h= f"yL{f>f(T4B Kp3FH`fPNfXX=^R%3$ǣSdxNa tynSW|n]W|nSW|nKWn^*|̲]& ?}դ*|# v F?#9XSls+ yge8>B@>f:_3xx_m%S%ɞ}3 ޗ*^,u G@3v*rXj1$؋) %r.K";E6뉋Yqb;ְE#ۭ"۱RX.4\n5'X>.ªwݑ@ܑz4>##YA5guC EݑVƧt!U?OE?YJ3HU #">6C N#?^gdt3`]J*,yIAplaAhE!/|8Fv]wJ/;Uĕ8NCrѯGFnލQ9)7m.ݩZUcWca{ږC ƨ|Mxh:{<4UC{xh3$. =M6faMpx hiY|`Âñ]KqGMn-]b5h#e՜`0gZ4Z^ 4W(0l8-;L%u* +9(שdA,#lх8dFOX: jN:=amk1t^Ro<`+%OS5pdsK^2⃗ ! paGR >Uɥpkw[͐-"9r* 6mYAǃT5[%]J&l!D 96A+!|[0u3/GC>*qi#O, Oa Yn75 ] \1FA"^OBwM-,HhdF ~LD0gۉ3R OM3R xf VcwJavE$; @3:;g؇-?9Ma: ؼ`]bcaX=*l+yPu%\rYDv];^-ȃt-Awb i4K <]n:RKăoO3*mq=%A6r9b2 +_7~_~կo~pKMuH JNU5YhhK"[ivo/[t]+tA&}QQ6noXKAܓRAV{`TdB=M<*T+!J:%&z1",Uܗ.w\0 -h.Ki?3X`!U7=. >*O:;qX Axѯ6fS[ ψjV+(;!giHxt[ >zhmz'O\f*&U{$gY!AcV 00m~ 4+1G V ]Xg@[9R 7ՇQ/ x)j2)+ qk@ϩ|W4.4 -B݅v]h.Ե wZڅvBYZ~pi3SЕ 6 fVbR~idZ.^ 4Nk+u-<:]OA|QD.R/ai!UK7y)'*#Ļ {VġXrP:SXLAcW)K}p{X~)+Q,0g$##O;Cj~3V(q!l=3Pe޾hiZ+mRjqL Uc3F})$s&̌x?Ŋz1ln>iZY-Zb[!#JE]Դ}P4>#YrZ/ِZ`&W YO/'W4@EUXVBu*>%j׌YY]2"{d| 9؈;Rǒ :͛H 0wH1lieWBj(f|U猭SS2MOdYlJ}̢SjVrP:QZ<%ԇw T٠\Dꮑ[d.iS-_#/O3?JuAaSB^OoTGvTl[x UDY2vzdɓ/ެjMgnh5YmLU W4Wk5Ƨ5jiqFZc|Zc]1heF]2.eZrOON]'75 5^VrP:S.zKS"[BݷK=Ŭ8Ov(ץXNesd uQO\ &}#-K X4jԥ)q Xe_x/DP9%Uܗ.黩*1`3<喋RX@L(a9T~R~ v wjANý]˾얉+2KteC]h*WfdaAPzKci|$ Օ h.k0v~u`oYWW~R]˵ne}tY.nx.5]Ke3 +YD^Ygm0y',ͥp ͰWf9:l٪^3Vy5[lկ٪^3Vy5[_V\עx?$^vB@ t3A?aR^@OHsHuΫ)>ڮcl엱)>:WS|4zFT=ha5H(80ψn3zo5bk7YiqR4ed>ֹzMu_ֹzMcd)嚠kLm$z &(u\%9A!vsk_ZI>AT_>ruBߟSN:=i\vԮzNO'd(U֊e4E+V*kŨbTY+Z>ZQ~֊9Ǩ)а!s7\j%:lG7>9񷳍"[tLl۵Kߟɶ]qM3َkm.}&v5ٖ_LD>˭4/HPQK:lKf` _:`緫=,«E"C!2C:D{ "]xCd!Ŏxǯ&,m2eks=ש a6~\[;cN(«_CZ[!CH,ZuP=Dt\`"C~1ѭ٘ox)MgSa|F`w5^z>䵝X~M8%' :ǽbiS̤M1ӻ)fB}5)jҦϮ` ]]~":=i^^vTqzvymt\ YL\a%.S~Bv6z"lC*qz2?yG>2.H#d(`AWMJ5OVnL:C$+oh kH5RPlL bBĠH|<1-t 'p >k;3r$*_=] (ړg[{ҺY8ֵp=)Q'khX8̙H?`DgLN#4>#|}fWjHoZiTK.M4M9sUDTH^-JÛA ٠Dv>em٢yRT%g9;Wɖ1xbz%`>iBe~i~9O}j:udkS<~5xVը)Ei«86/§!N# >eR)%>{]]S >*G5# 5u9QKH%=,b?{[b~ߵZ`$txi[ `Č.TbZN5 %na-sf۬'.4 ؂{\j%5_ٗ.۲Q To[=oˀD.52=u(%jy/pْ$zcpt鑂ؘ!oZ<^1I)9HY7chLjT%rQ𷋅n«_},Ǔ|c}jW>6>C~իOWU]U~ӅP%-SY̱NzI H]|痭ȨoE^(үFFiFW_7ɠ[lWFɪH1SU\.eم!2,l"[tYgmUulS)yHؒYAu6Så._Vi;~eRo=9n=>oO5nOIHF{u'f75E2>Bvaqr'l'XZ5ֵj*kp^Uc\FV _#\u«?օ,,.WtI X6.ޛ%۱JSC`ߌ#ǡp#{V@n`9uEu[t163UwI$8.hy ˖;.*;֭_nٮXlWXlwXlb;bb>خخ,u|M[9REu,q/ʗV]rWQe[яne~9~2C/_vee/;AlUvI' HxE$D8HLsyGt4FvjW|WOg"PĴ8@ %)b+bk~e[\UWHwXt^Ceo~%N `-BMQU̬ o^eTTVm_*/|3e؆] 1nb^-t{~u}t9LwYfMk]xw5rc%1vc91rc;1Jc91?Xc1?c,1?Xcl1?X c,1G0h#ؔ#%l&HO]ve6-QK>p"u4׈DӌVAu≜!3:D jo DoBi7"k;<Xt^YAU2%ylad?d#TE_~aVB0+b'V\Fը,90ש׆lqpg7sz ..$Ry TlucIdof%PRavfO-/Ȣ!H%(y6b/K!*XAH>S3X[)禣]dB8~k.}?N2xV^3-v^ޣ#_fUx^:0 һ*CH+pO[BG{KW$ɤƮ e9\WjUQrtnG"Q=Q3Qc5̛Q.[5k5%b]3􂥼0ORe 1|$8@ v^((/` ߧN![2uwp BWqG]^#jˆ#5ˆ#j:{D-QCG::ܤysWcfRuD5;_e}^:g 1fQULj &=È#jLXe~`39|k~X ZhگkXRxd%1ŷ$sy#wK5@I Ǖ*tU=_x'_xwQ6d_sU\H"^%[tY'F kzlbH* 5)']AĶ"WWLBZ(|IsDmxf&yS= MU.Hk#*r}~i3HH[Hk^s!#HGZɑv؜Fe6ik&伤LkafWQ+CxwI0T'1JAPPG"сkM/irFk;ʌX#]d.j.|tȺ]veXI.nY]%F8z;`B^`%TKf|$Q`1 Z5Fu:b'XT²TòTJaY*aY*Rei,eee`Y.C ]oڹMwڹ-sٹ-iCq]t.;wA.q?w_ -U+xΗhRec#dBW,sD[0rŠ'RnZ@ho4Z/-Qku , BӴOҌ!(fyҸU^i\>࿮_y ׯ__%xwNk~`^"pVPijkѪ$ӥzcAWUbm栱ei55\-K kZUOWZuUUtU_UWeeie},K5,K-,KcYjaYaYjR Rd"yO3හΘǚ5ur]KVuW5(_]fMt!_Mn< UMt63"+EEuCnIo27yCx2?:eN١SG)3t:ehwl:eSVKcfmKsn&vK9yi2kz0+4fYxV)l4)x',o-Ğ_1^{ P|$/Yм3Zgf|5:vwFm'lYVA8|Uා)”aJ)QÔhaJ)”:%{J -L)aѶΕn>o#<dب3Htݦ-ml+v\f^i?LJ y-PJNUk>_LYD;oKqQ2hEM_/A3lvAJ3,V]$n^ѫfM[W-}`~cQNhSu8X,nͥ!ЀO t 㵼-&?PpD%&cq#~ҼR Vo9dqj G|W¯j߰A^}-"tT'y;|ty~1x?+/;x{,Ӥ]F߶l0/`l߭quᯤ  ~I/%)%{z%/_ Z8Wsڋ¹e,YΒ_ gɺpnY8{ Dza,+¹i/l}|[K__%WH |,_+|ZI[|_~O_Sԭ:uL]¸S-[Нti4qVEn2`¯4Hj.X殑]N ,[W?le?leisU\?m:_QpD' c?ڝøRJ; >Ju.Ɣu#Oe1$`L)'~3~^bL0˜M[qAwG$>H (J:oYxd6JX"u9a:Z=Ҿ \BjZ|$TWiZɇ&ZCU௏X+v#t ]>b+GW+t슝޺줺< \.#}TT޺ŏ,e.9.;.;@3;6<,>o>Z9ڕxj7;9J*_9Bkw!XO-E44 Y[,Rc%n\+ڜ/(Th0&ɾR]5;>5x"*o H,u6sIR54ük?#ǵg|$^|0e2^qmu%hfmYW]Ysڂ5+fz_Z?ezTi}y\ nRjl~cT b/`-]s03!L#>=A\3agBGVc<^+GJVOR}J|klW=FfovR.Hޮ('ǂ0b6gK5Bo Xc돰6&v_Q]Q~ |y eϏKw[&=0~q]Ljl}6~>jXTokd8bxE䊂|$3๞u0S|k_Qd4?h( j8RPق^_&kx~鐳n&쁛!eT_$!URQs/`{ZlClSl}dkzdzd#>Cّ:M= =#S7Ul¯>uG"{>Ul?\9uF9 <4F/sƥUֱ4!<|mu:xk SCEj<T?$yS8B"~ @H>&ΰDvWjb&y$_*吩{nMskb-RJF)ɂۦvFD vs@ÏpWh5h-)*v,R&¤ ǃrF|2qC7HYKHH|:N}>5ȾRS~/9 ⵥ+Zc!i1 33|?meomn_ߟFZ+ MCl0퇶f5-g+H+ -عl^~߬IK᪵dbHrTwP<åRmo=xsnB.gx'VJ#YOމJ5כ>u8uLݙSwmInKk9p8uLݙS7{.ku#c^] (ı(U{37=IRV9vXl[3PV#E+V; m/RP54ӕ5yM3'g|2V7Zli}1YO"_Ǿ.qf.Y03sKrfnuf6xf^rfҘG~CKkE~y2ۢO<37Sk#z c_̥x-M ̖gA'tm_WjO?7/6 Xi+]vz<6oh|$|+s/;G@#V_BXWiJs(>5򑐰pIZ]|koߙ&~k}g[?;ioM8T#>j٘{Go~p䙧ə˙ODDgV^gV#<3K뫡d|7)hw>z6 HTu&lv38o&M XSr+HމO$y(@#!M|)K.54Þ ??>=w=yyy|O[~S[[痭?gß75!B>&~c9A(hj|_/׹(T? !C&H{ fIv(kWj73⤩+U[4+wv2'$Cwv'OHB+54w6]p/3<-6*p3 +r*ɼvwN Xzi/[iw믟l}sh ql}8">bdpOG Z@g~qF֧a|ρ֯|@Q8C(S֯|@(U?& _n"_[?˵4Iw]I f#Δ,hnU;d䵆_`_ӗ?WoM[y,|;j-OInwV,0]Dv&Xǁ([ljVGHO|k)ET;?Vxfp$0JG%xIl"^yK7{6JGt+lyjZ❣=0J \6cTw}Ks"zy瘯3 >Vn\%ɰT_/5b#PF&Aa܇h%RJ8R;}v#yh7-V"%x=p%Zv]5Lbd tc's]ۯ6bn7~z ;otyVEWUyV5jUt*ժjUVZU]Vs-HMUr/OdBWy*qd$3SPcđ1ѧ%Q45PHf SE?OI{o~L?rUڭD,]n],.ߌ߫T+9X)LĜMLI Q+P#[DUGQ#:?{~TYG}Ϗ"!a`PJ7`EBn|$F׻_MDJ #<V /Y;_#)1uS`-@m%h6 ѬZ"4;+4fy^׬ "hd:n=p5l"[t _zk_7y_or zA^/Nͻ7=FEo_F'ĸ{{*roac_Qp`D3|I$&j Myr \`%߿iF (J2٢6xlDI,]%?Ks&)JVuw (?x ىO/q]BU1G#n5#$ 2Ѣ9s>[0N)c|Z4YdX$JX 0^Zِfjm("6Fܱ?;u ϦXtó>uѝEwꢫϦ|/[ݩ\t-ޒްp~5FG-RN{!o% ^/WQ7Po^(.;(?)եp^bv󅷯-"[uyF. {6 klu8ש#;K2WZE |[Io~J9g/ŧ&LTV~!:B)d#GK^;۳ j 6:]WK E\˛ko=puf";5YBZ6)%SVw^[554{ϊu!ڃ" Q#158}_FE⑻>Fɴ@ݮlDi)bXqEBbSwļ3"XSZRc7_O1/ ;l@ἄ5)ClD lvAg))#j}ґQ(WJSIMEwGv^O6 W(*"uSc1S1ScSc1?nURXľo5D؈4}5P_K8>. !1x:wK,WJva!%˕ϗσ)ꉡ!$']mW̽A|f࿗0#XVXvX222Paaڟːʝ6e'm#&wږ_|$i#Urbc#˘i[1 J5¯a x-OVzy ]]xX40z&k6ZC9n8-$ؕzZ$8c+5FMK7 %9C)q0EJt";1NvbO8W[ng@Dz#1w'ٜڇIۧFoz c<͊<ILAJT@ PשF1uq Yb6lhZ_ϗ9(%?8: 2~TşΎGӥ.7Y;cψU[p.uP/'HX6[+5ӫ޶/`GU,F<5Xi|$Mw ֲ/額|/` - .bs'ځnSZ74^p/3$l$^0ӇیMB{غJ5¯7etެ\)io|WI>$µz? Ԭ)Gځt+W/zhqE\x8wE>.ajg-[JXM' g ?|/ '_*O 5%'ANt:u\YMI<`\ ?N-Swd=uNݭSw֩tY֩?V~8~(v@ Iz_:ۤ&2֮ X&'Fl;B/'wDȓɵL_ݥ<;A'_?稭i0ɞl~"6*<.j |K:sOFv5Q1N/xpE$o`8_Վerv|k=q5q=q#q<>'r 8DXwg \4>Sús ~6 n9)/]Xۊtlln|67ճ`c|V4o+#~F#6>+(MvKQt@ZCS Tf dkSKXTm+tN"eak k k끢k kZjj*R?tAtK ]jХ].=R.4X݂v_s9_I L0Du|_ ;2d5GߚZO@td|mUs .vA sP[IڼM^F".㍸.3BБ o{'XCOA,UP.Qqn]x0aBtoOu_0TR пaC3329 ǔ}CTM·aRMʰ`YNqúR.o:_0K0Cטm.# 0EvDZ BWZ֔u.ؿ]0;]iF ~"M H<|EK5s?v.8yo.X v] r.G]|Iʞe-ODLaĢCq^^BIcܔd2Ȯ7e~Z.獸_xz$ &# TХɘS5Oqd˰2Bd˰c}fmKǶ+?fM ohu^Z:,c*2K6"-X96"F[nxhl='Dg,x-Zy7 /Y6?dٖQ3lKC3SLAV) &` dYHҊz/` c$]<:w^wdi ƯJ#1$I$M5(ymUKžQH (J:%/P}:Eoy p_p#hQs j7ZS<6MTzmJTJu ,&YRpk|\`ΘŬoa֯#\ ~>3sԬwpWǼ,|8"غGbwZVQ$ ~qFDKp/9FMzM(5/YvO7V?Y@?,$ ?)Wt^R&۵Ԙ{6Hwo-v<_n6@i|$FNlDfy:v嵆nvI6BosIloM=CWЧ"[”,Dr,FӼ\x;olL@I>c]']Wj=7#ZnuEmͫN(~;vވ[t1S}W;2xNXr:Sd0R+(%A7^_0RMJuA?것.% |끫ile"w?VDvb>ZUUHg* a혳]W*7Y;J%)5Ͷ@Qp \8m%4>Cc}e<BWJ XcK: ]|\ūH%loFÿ˔r$^UCDW40ڮ xU!c=lD7\ ],NFEL,GngPp`DUOV{I2b#8i굆Ɵڧ+UjSj , ~Wj#E+_y4J@:+2 k"_gr%o,\SIyFXK6µh^k7S&0nĢ'Γ2`D-4JUBPzWj9t"_[ЇG'K&cZN"漦T,H2V33'x/@9wٞw534*_Ppĺ;_aB~rV{#5"+w7mޭ_~{~/][iox|!z_ *|wz(__>knөu-:uNMnѩSm:uԵi~=t?nD{YrRu4cs5]:Q;|<ӕϫ9x׻4#ϫGJ-/qҕ0?53)vOr *K5B{2,{אT|pԡ3 50@Vp[F Stg])r< B Lٙ]Բ' }#qc=)Wat^Z8Y4/d:uWf[t9Y{L퐶/"a&H :#j7_&dDƘTSܶYֶA8d#R׎NR}͜}/`]|GE {د]’)#D'Q']6͘j/_]#M&_*{";NF.L+N^u"DE'ªDU'B!p52W#ՈE Zj7u5bop5R\ nP Xkh2C9ωخPO+V$K=Cc(80Gp-cWjU+cK^;a:t*Yӎ.MBE3/ew/$ 3)'X/rt8Q.58aM (x/2|QwNGX > |<̣W[yH^_2VR0k޼d9KK +KGkꈍļ7"Vߘ`g 75v[8ق[ [8x؂gWj-U\T_U;aVpD=laױJ-HaJ/?memn/_~/?jNq+gŽ?oPu()L 8zMdgF5U7]Ѿ];]ql渜)jgBv!$ϐL߭Pq 8 G S&FOoDv96S7XhwfN^H΂VP[AނSo]w~~ѯKv>Uc9WrPdN]K||Ք+7SKM7SKM᷿ >+-/- ߅/-o?/-V!_7qa BPi{Sr*KN%WvԒzaF~;/5ּ1&Lb ;KUaHHLyf@ְ9J$Fb!_*EbӂwRT ;9EC<¦H:]7]`[ݡu9l%5@ӷs] nWGzwlqMRx{(a*Q zlA8%G7O!z6t1BA16y:f[%U7d] 7d2r ckzY]Mg+rL61u,9XשuL>~x?xd~3o&ӧ]_貂.C.-f @ID>~B庬[>T'?kٯWv:Sx{g]v=y#˒ oVA, BXmD6L1V&5y DoMߘ()ƚMf|"]NuJ*s¬GvWA&UZukcgTV3שtߘXIY?o2#RvSU5],څ&crl=0D*T?\rT#\15͊묨YQtVT=+ΊgEYQuVY>@@@},P=,P-,P 9U#1bΠk |fR(=uauFhWx~J}5GL(4Q6^vJ+8]ڽ+ H9+EKμՖWgxLV&[ui͇-YdW=߮twtw>two>uw?p2d8p8p2>'#Nz8 '<\'ioLl8庌[ u97޶gmY⸐W@qG]^_8/_fe} 2Cw߾BK ~\,pzj7ŝV]sl7ʐFbr*]-Ϸa-9-gI>]o㱈[_ZH( [JaVja?bX_ tym[7'lcC_aCaC ~o# } }`CAkV8hpZ+5r8hp?8hj_o1o5lye3`KS-!uJœ/uidg7}\ l%N]-˩kT9u:u$ԵԵFSWίSרrjYN]-Ϧ=Ls:ž2@ ^PשNJ[ ,q\|+b!vGP]ξ-:]X_D$e.L$l(bd|rP5>ߦ6/55}齩}FOmHFOmHۧqJug<3V=c>{FkggRo|~6mWH &[R)qA2̦K6µXmd@?e/?e/? ~ *? ~ *wv@i} m\{{tZ_yӕr퍅itZoW_WZq¬Nr92B4˘| Di25i Ӌ|1?r75e>_Ճ HTdA6)PƕnLnd>lW_=7 3_%ؙAdQ/~2NdHg (@_? ȔN[^|$gӕ>puo= Z'i^Z${釭?n]+?Oڂyhi [M>CrGȄW5¯|S◗38<)^e'}yyJepx9 /=eOHf"XΈ%B^˙RڌP0,ثK5˗_~~)%~)%7}OX>7|ydi"Uכe>nvɲԋUED;ǗEj*t.[8~>Ej7I=+KWgXE꛾pYk{u}o߲>h7Ʈ}Njh`+RXZ՛#g; $ Fl\Ǖ(KE_/f[K@>9' 4,XL e.ayAo]4,q\],-b mF j5cahZpOAu跾<^P&u8nH!dwvF 8B_|/USK|/U]K|/USK|/UKK\,XZDi9l')WaN%I]FJnwݲos^erE/̈e"_}˛޸lRTe%8D]d.yu^+̋~ϋbدy΋b {i&/ICHT8O(q#ֽDkx&A| ܨAN5 .k!Y[72߫H+h:KR+ feA/_ |sH!~M >j@#q zFPRV@4Â? Vo6716ffIQn}^9J2-7D~d'Ǖ]/ ecA wAkOh?#Ѯ7o\Y]|@+U?(|% {I ^_-1h1,Csu5m#frb8c-]C}N3eQ?{1i1T_(|&,oE~d|&9Dr%z8mC'T 5H仐Y Rj "\ !1eGZf#Hc-H8&ƨHYT\?hϏ+$l-"2!ηZ>D6̎ P 6`\k? FQ6p8ǕR]XoXש|/N P]^&".]%z.s%-t蒞.o1P.aK蒞^.mRUX/xp*уn)t`AfآmwwW!D+ ̐EJu6YMMC&˺.kӮ6&kSn)7Yv4dmM֦>&:l{w i@$۹Y/Dέ 3>u˥7Oړ|k?.r>z@Du7bܻH+nyVoywz+}?kw=WB᣶w~Ȕ  K] JUSfl984vq٠xVRРӢarhhLo Vm:DϪ|;ol[}0\xkpYt 4xWkp,AWɗGmF dAmJo$_ௐb~!twOxm{H,._ce?RW.7 @ }=>V)Am Gm}\Z7c1{ Sҕ ( 1Tm %-R¼Rf: p.bÌ$_,jJN3j9!U} 5TVS\r{'T|rP㵙mNH8{3[m{3ۺ-v7fu3ٲUf {xcTV<Ŷ6JA q%zDꒂv@OT+@Jk->pXAiϾRf[Qw4nhK>d*tJWxD"6.Ӗ}$#8olm5k#xmј"]i[qF_7e_oNU;Ҟù4`I.*JŬ.`M~M/?[9[%[caaV떯R+w5*bX0ǰ_ að?Vҥ~K]tWԥ|X c1fxd0+wv_c1V+?cҥBoK_K/5̗K/%̗K/5̗K/=̗K|/Ȫnٸ_a`R0R0bI5h)KUkYU #~F&%51g6W#]zTIL62 oI8I٪(QpGa {v^Qݣu= QQ#"9u8HHEuu*~[ tl;ԈӼi>4oӼi4oӼi^4o|i4o?忺k+i J{+4J{+iTJ{+4J 'qB }PZ8PyƮaͽ'JV= UV- UV= UV3 U/te]Ƈ. ]/tA벚Р B}p=G]n+ Ndr~0"_ب^]1\ЮXARZļ+Ƽ.AAtŘ/ܢ<~.e&/o{zNnT֟ujK:3jc}(JW%V]^'N;lj~:O3臞DDtP9>ygU# NE5P_Rޫ>Au\'Y pcX_ o aXsԓ{j{{F.7yK@eCzIx lT JFܢ \; 0P< D&?#[4ӷ+Utx"݈gB*J͋H7%X\h@ djȮ ]c7⎺ P]ʰ X{F.7TqQR.!0ξv1wNtAqG]R׌>6ZsWȷpN{X2RF_T+q\7d⢗pCkbYQ(Xg3[5"G8Bo LŕerGk\%Fq^edU Vd9o1$tKu tYJK_:rzl87]n;vFܢRhgz%ޢ&%d%1ϱ`K^\#D + 7J4X=75X7Hp:Y5TԢP@4WW*;uj1Ntj5tj1Ntj9\ m{-D*z`fqj4C@HH(7r'vވ7_/R~_K O:nW 䂂ȓMN ;QU򑐨VPuJp/`+JBwxjW(wwsٱ+j+el~rl~qF ͯRh'KG]+ 3JUֳ~ JqUH|N?  '}4kp5 :'B5f xr}=!N'D QuB:!NM'D Q?'<|a>0|.a>0|a>0|a>0yCW|mwx!z4>C-;(iJmjɵ7.Ż=+2^#Xsd,2J/ @!3dJJ;"[?voo 8RZkް&u7J򥇮|_aQAhW2ȾR+Z{>X+Z7k6Ӛ( [SS>BIaÛywrdgޝog_3%fx:o.~1a˲%UdRCPq8+]``xd 7r#(Fci2}_+ %\<@Ρ7ު|^ri9!+*vUE*xEiNx5kK:f#d+EX p)oMP_v(xPobPϡs(KKa9s:uCNPsΡs3ꌏs(UjT{.cމ.1y,Za JE FtJ?y[I++Q(/x|c_ߚKo4/|k<_O軖f~{޷8H7]Fپuٮ޴[ުO3d+EXq']="U~i+].ؿlT,' b! tUGc /}M A֧?WѐѰJ6mh K}7~r2e[+ժCv55'(eDےTF~zEpZK.-KpzHTT9Pf;@@ǮC*| ko?e֮m=մJC1;Soަح ɮ|kgvkw7Cq\Bq9h7y<-+jkRxߌcf<3MOi.V\O)Uyg94$bu BC]1cxp| g:Sc?1tތ;rNj[B ]M[ C4ir"'.̴> э'Yޑ&eǍT_1n$\Lu>j/b6DRI'Nh(n 0N!6¥*A#%~\9W9hPhlr["[\V akwW9!5E4YP~Ϯ:߳;gJ$3fܤ˹Gm Qyu"VEt{!a pwRgvD?Ŋ FܶGXFYEeI#-il$+W7~R|#޶}o.竀Jt:U\|7:]6&\3iq҆NJ@Tav T:@9i|`i0f \ v]Z Znn zs| RF7inD wCjֺgtۖ)R Y|qK@E{ i<|QZ؞{[^(p jK B+USOh-Dǿ/_ %~~35~3fj7S+oFoVoa:x37o4V'\u-TAqQNuZR|ti.u>z?vHmM vs4t5ßϋo=,{')q2>!U݆_߁/aMߟ> > P'OB$I?> > =}O> =B\<{._΅\<O˞YdO-^ⲓ=USJ${hq\v]cnH# - IsC>憤ܐ1ܐ47'sCޖ%lY#Y|XVK%lY,ajlY%lYiY\VҠi$콯zBsRp‡1SƘ=4o]j ySgwByκ .uoPIGK/xbLo'Fvb?7 `5`|` ߩ3K@p@Q8 \xZ@kc -:ɖtF⸆Kޚ5]ik:>Tޚޚ oM{kxk:xkJb=MBC2h{אL$us ?s&B?t]>f?=Y?A.چ:%qd-vmWvwUM2Kݑ~Utk" Je. )oVu^Q8oƝtM-lT|嚌Hʂa iNm daòxX,ױ|LPm4X-KlYA%|3oI|\6R/hFBlֺy3ˬ/ͪ~kVͪͪҬfU٬Oͪ\4]k$T+rY4p^<[z_gq좕p558 ћJ6\lJs[E@"5Vp.NjS\XaR xH15GO?ƣ<=xGў_ݡ4AU^P*p?3d+EX# oƝuUX펛)uioĊe']|XvP@ Ǻd.`UWiO&0rMfv6Bfmh2|?M@RT}*;~?{zr3ގ={:_cOgʎ=ӱGslFUuIZh!u gCC_Rg.)$ ^&2kz7ScPX]YA,xa Yj>]6UH% nZcnm4Okr$V98.1ky(+&\0*v]ۘ6acoclLii1M66ƴ٘1YlVx(P1bYC1KCq{(ކV>ɺ @;L>nل}N֡mFI|vG dW|nS#ٮ]ѬHmE{U秂&R\>^cBqmX+W W[M%}axM.kEٍd >#V[JHx?o%f .1 7W"/\]zXt٤ųL|$!wbO;{p.yqW`b,arkҢd1&]e1&rrJhB*iXU~jKY%Èͽ(שRu[| ?јhq\7κ[Ju2#RK$yTRRrEWnehb\\sQy𗱖[Q PIxsތtE GEo,2LPDz 6''C"ar#VhpT7p+tX2ߑVeP\F[7^@ؿob|;Ob5X`Fo5X`mmƾ[[K#zniPD*J3o 'ujs2XiPJ"-k›l֥1z庬Wl֥n\?]V <-tl弢E-z+Z,lH"EN 9Ѣ-G/akે7XN_o1 ~\ ^~/<^Kzh8tU v>),JMFR n 6wKQwr٤w?KzN];OI#Ѕ='F.5ɦ:pYJxN.:iZWѴΌ/Et$6]jlbN5^[j#d+t9Xw͸.Oty. ?v:mr^fu{E"(QZ֥ ;olc=H6?l%dc-Xl'?1s;Ҟk].RX.uʯ#"v<*[)E[Ky3k\qߌqqoE~3.E~>.eFz #ݎ1?9XZDK),S0Jsd.{y K(E{1^P*u+9[PQe+,8ҥIweϗ*{&"؇P>RaK-%_Ot۹ VΩ¸שYVl>1ϹnwMǸZ]}U9$1T>#T*),'KU5x?!T揠nm=>j)딤#8n5Akn8A|V(BqGErV+*8#-]JѤ= ]ݩJ()lfoUO]9!hq\MSb2kb_NX<1{b_NX<1ĸ&7W_#[@/IT|>Oqۯ?N_X qb}|!fBX_3}!/J_/~y?Lzyy^O=z Ṱsa\<{.l ~υsa\؟s? ?o_ ??G^dG ]o 8r,UuYsE1*p95;X^ߐaA*?H0T%V' T==O-E_tq:W7v c xKUWkeg {u}xu=kZ]NVcu}zy>-Aw.ŸdI?l bpN %ْndZ:i B_d<7kA*[T#/29F0|AZ5Kyc)<+Zx<ޅ.yфǛq-y\iKy,c?py9*r[z-G/Gw.m蕝}9*R>P9ۡh6y5)m5mfkXM^MB]^iWsYXMKմմeqbzn!nKV*-`Onl^Z满+@k|rV5'7sfN4'ǜ̉9QӜ?='/DvNT='/DvNTsN|PA?44pS gk}'Cw>[ BJH%{p0{O?RH!oVR=&KXqy5[Rxޖxxx>l'6777WvxxJ獧ύ_0NII~3Nju4=-*b 1^$ϬCɮ8AZpu_tl֥BG?vLT|*UO/a%(K]'ٴ7^w̪ 5!vٮBBt_h.͸I{i( ]vM#HgDEJ4X4]6MAi _Ǎ?lEk&hnk_@gx:G<|UUjVd o4e~?OD#}{R?*Wy=U韚f6=9?^}㟌i~x|N@0k0Men@hj5}?%({F͟J7Aj2㥵][C KHe+tG>]( x{%Cv]Pb4R_/MF?{hR)O bNKOSǺ|_zz]xV'Ye< !KX t_Б^o*u oh\~/KIOT%LJ| kg:oxuG6;*Nꌩ{p/aOX>.uRVǂ. | +v\yb7ipC p lj20:,1ƅ+N _n+!Q"qrEʹT#$uzKz,χ_@dCth97rJ@U(_š?b?E?:\SQ5uOTᚊ/&5S#+S[*(R/Jup-U4xЊ 2(dDČ?0s>ؐʣ014 tF5OsH'$C/zrS+AZ+ιH=f4E,7VO>ÝdO*>TZ1 % \E@152QYAlr{B}6,!`>Nn_yDlEb?ϼni k%-0SKX 5[# .[5ࣷt>FR~ɡ͕JUȨ> kO6MG+N|[E*xTG&-:o}vV.b}[Wa Ioa;]*(J+VuߧG/ rYω_-t rlCeT#2hXmujq~~;t3QȎW77  +hsD7^:(WF-gFZkBZ |.L8%Ok>Ag(K%G}D*?}O{iOAֿ1Uw'6lQzІ{;P>+r(8LTኜkZ\5?i.GEKU63yA{*О4?[u/GKU#_J>3F8|}<́T%l@pF8e sRM|-d u?ZF8&쩾T|{aіXm_`TX>vXNc;9Heuk/ ໻ ݮ+úR 'o{3,#| Zz\gu<m<=O5SS*l<=&gLc {J_>_>CI=R/YXND͂#V>ugu}T%kR~lml_/>[Z~}vl-[ؚŎ{*1S+Z&-ܺQ~ (WqM[$t9sϪwM͖*XQYbؑxVυW ղ?QYuw_ƍ Y#,qz櫲J5]R?hqT3:GducO~JzDOmdu.U ߭(_š?E:S>yU/c-}Wg Z`e<=t>ad<f U p%2^Cz p{)TWx =KUok⯡JoW W0(WaFhCnԈJkLے쎃J7?^;ROzWLԝ^㕺+uWxJ镺J;ƪ-T>;j  d6o 5zOӗ~~-ky=} ~ =U> |'jl;ˋUmhg8A1; \K#߾}_>oOcrZц^2Vv_ТR Ӥyu3҉/3 tι*@4>_+.u>:| fWp?#-Gv_֫pQ>u4s=.uY6$!<3Ǯm+pQB"U:F5#I5kC؂99bQ@sƾԒDF(ڡ'&JHDZp%VMgLYKX Fux8g+dgrP|Jѵu^Tp60tJٳN?j yp—h}6"ڐxEWHe%7vgsnA no gZ9 ~ǝWH\ k5 ?m\gЖKk˥ֱmjmj-K[3h˵:mVr?~єTO7W,UU*VY_?/_Joݎc0OsO th݈3}M$V_m:7T?6uU4^B+D1~|PBDAATqUjjgZtĹl(=.Rx #xܢWR ̶+}BwŽV?ͥ6Nd[Caqpl[,@Cb|[zw5gi]!Nny{q >1D =**Оr;2` q | k?}Wƃ#K8 a`$ W59 YHuxDh2^Ƴ$)h/a%v;|*e,BlzXtN\[{\Xи _OM뙳i2|' Ϭ^\J0˗?9߁?tZ m÷^E}  $:PwBiY5O 5s*E9,VޯuxX#|x4&4T:>VƏ{H >%&$՟ٍ15$ˊh*@He&rV-͓c_W~{o 2/ 1d~޲z>e߼e?e?----;3쇷c˾+fEyQ^9^aHƧ R܇cRn3|& /n;~*ѵídaGEF /V'@+]NM՘+y3W:$֥.WMjiFDQojl&G,w'2ތc\ȅL=q1'vq|#^Utx[B@t;oƝ{ysm3t54H^0[yn4EwHu\ DlF0| 8hw:_YW {9͌5/|' Vѵ\gEֺt'k2;nD;vNh*t? 5/[S~VQ?G~UB R@!UVSpKOӷ3+*bGr^}J\š@)3j )h6 Dio鲅sjF80|P_szc[Sw]@Xu9YWƪ go$57Vŝy4m'/i4KiOci?2:yc@Q6Ӄ@1:s߲i~ E%Yރ+J*4۫p'TI~,ZӷW<| +qxzVM jn Ժy5je::;T_ܻ 4ks)AGPG3owy.[n_,W]?zg +ĉb՗ `IJU5@eOH% n,QR¶C''aRÌ~ e7n;ODg&EZ!ٮyơѰr|Jqx4{48[px4k4izz0mt3=2=,XWޝqS!PP38Ѓ3MS&J{|[n9ޭx\;KT.z;w4 7KHe5f7(kC)=J+ ĶHeE_N)(GX }"_cC>5rziNH (SzuQ?k&4R~ζ?if(N ~g?,rZ;愧V#4ҏ%.#nʰuKY]YA6od7gJBYjǨ"cx.CRD}fD}C6qx UJH%҆r-rr5/Lr|}4Y}ЗkkKٗUh*s>4P5e+H.NL>:2okA1R k/'zOx^ x=7Ox}N^Ic%f^I{%-n罒ngWߘք4 ?3gREm. I 5?Mw%߽S{+{,vD -rHZhV-a} ak"E;MpZUhE |b.{ _C"HBGl| kSyf*o=/v*os*d0?^(J`Ʊ + >%RqEAV:-z + 5@~mzo~-~m~hhhDv5af=IkasM ?]%4$5n 5z?|ۧ?|ۧϧS=zPo)S 4zmū=O%oO<}@1ïH6:/;O%ru`"qm{+U ?cW{ V6 jbl> k!QM'`h/a%bėj.7^:U_8@"4 aK|mAR3S_ٺP7|O >[]32[CV HیIbkWO*(רlH _ŋZS6#AZ͑q.U B 3rKxAHu%"$L.U +5:OD<{"t'BOy"ω_(LU ݥZ=p7ļS'@ %k$#YTTs!ᯛd=YkiVҍYmyj:Vnk[j[U4mN%wo[~lKhKܧ^ǷRI[b.@[R~߿~߿)ao5o W&{R[ۀT_P'O0d֏5MBH_ _ʷ׿_3 1,MJfYܲF-e0<$Z-Z·ѡ,44RXZZ)|"BKV>FHUԍ&I}hRJzפԇ&IhRJՏIك[@/Ng)18qXn3 Lׯ/f49[HuʮiZ8{ys\k_Rd +A9ǵR!lj?lKX X/j:ŒI& tҼwO J <$R`4[H%O`n?&Ut%ݼgmqT%X͵WotQ!eH 5O0PT=*1%5/a%wxxtn4/n 5M|`R9,6̈́D %㹿E7mG/xB*fR%ϱ3IXǞli"򏳙1|J4ӊs2衐>2kKXxT :dPVB4 &x&\E+54gf3f"]لAu$麫;5֠AmK7oO R/(|Q#\e9ɘM5L Ev{mO5ԴkV-p^!Hw΂ƽGX{ vX7ƽ?.uSxŸKX ~X/jzX^ʱYƦ $V%o'/ur9-'H$:9PۡK!~vmQBy^--b8KV]+!hq\M2nEune.ףyXfZ^nwJo!pTyPHmU11wbU v-.u/N<25(CßV,*Z͸i&l Ry̰(lC*˝;ܣƣ U#^,湵!L=fi6cՀcUe5\α^AJs,UαDB9"Z|7LËnQPlEͮi W@Sbq*q>Avo{Op%a"|4:GZ>%/sRi @1$:]cJrfN dY6 cw([P`k,`:o3'\ U1z)1[n߽9UoG#pJO3 ۙʪEb)>%ld0_HLEL3'h-lV[AЛxvWޙTF8.ZMۧ֡]*[)RZ1 ٤Ncfti9?cl`nH%%1^?#:Iu̧%3yX>"%h~kC٩!5]h|~ϐzkZGV^l^ˉRau+^n @34Ka%ΩK " ntyRQtcn-~eQ蓮ww"~ɕ,]̟ϳ{byl-vckU>;Py3Y棳H\)X*tLB#\%\a 4!4ЂW+E쏸`+N])i]\H>f~TL>'uv0"$؇ɇJo8ߘKX ='[+=N ނ|rw3~mU#~(7^-(pK#$Io592Z{zZy32l<3xm^#H%HNjtH/V}P㮬؋d.ZElTlus}O 4 =UjIh|GB×4gw&K&R&-ƬZ\$h5<7C1C.4- ŊQp[벢\mUiN[y JAѯ˸C{ͯh89G55og'c0'+M{N4\xof .Fr]#zDi=ҫ*|b H%yݫo1Tzyא d鑺y? W u$k0pWh0--zl?eO,o@j>?z R~6r<)Ƹ6zG/LƮjHuicz@LE UO^UVY7P[>Z0wn?ыWCÿ?.d?,_GX`^;&i]f?Ċע6 qR%RSU|_5Mfɼ,6;,![N4w*PJz?ѫh&)8ד,dz4sq36,YnZo o!} ߪ|Qя_itT8n1m1O},lkjV//Wa%ArNAdN7zu trsA.уܦZ<@>Jia*ܭ9}9ǎյ4HaDSIH]OjGX Qi7pk6]2K兩xoX.o-kB:]yoAɶ5:?'پ Ͷ?s{@$8?(k|ۣ1G^E3] fX ߒpy? ߰ zF1@W<2j=+ oNv+5ق`~TOq;/!\&n֠˧|4i)Nz GqkK݋_>cxW ~C.1bh`xnNqc|,zq]zO>z>4}4_v_JvlWv߯&TMWk:SS_^muF7> [SOZ)|[IVݜ{l(Ef|YsQKs/T$U 9LkмWM ,'p hV>w}M]iR_JX~:Kԣ*gw-%nM̵g|ߣAO[}Z \kFp߰`AOwYȇ"#@V9# ~Ճ/nYE*xPEJlҢ!5ER NBMxɪ/G?}FNÉYax:XMrp%{ 5]= MEV2{u#?z]Tw3o R[d`l|5N/ ? = jk3>OîJuXڍo(`R >}sawm8Ʌe67 ˼.,VHֿ5N/"Vdvު0VziYi!u⧀rJ{ň%T֡oٵ?woA Wv܋mHeb}\^LB*/%}Fo(X1[xY-b_x(J0|-FB/nHwMnJ&dCwPԿk1 *%s>9!R2~QC)\T2N#\(1wTvD"KU/E-;Jo`7N r2TqkTcm Q`N#H D!B] . RDbiNj{ r"k+U W`a%罱9Y%ml| 99͡f4.7olV -jqo޹l+^UكO+߶uk"ޫh_R~^h+&VQEIךV͸F 2W)Z4 K#URҍ`AI6i!6i˒iDO;Lzߧ- s'V^R],jau#aI -@C?nޫhөT;nuNǠd) N١`9<`|B]z9 f 3Z s >*WSk:R)Pz9ⵖ|]d]YM718(Z8j{-8lbۏ >JC6uA{|o[||9hQ[oWL!o+*2I=8n<?WLR>ܫRp{t חXWc%Gyڷ-#qCOom/2r!{HК|5O"sv (`G|^{). K.Pjf43E=At:T֡֡uCe[: 8c`oQ2_z/@MOi>BY]J|;ӖfioPx,= bqmYphx̂Y>gAEGL͛W:= MzE*x0}5Fayˆg#[)R LM^h CiWCQ `oZG)5l{5zG͐-’f[PeLú@A]jr\kaoz6Y":= J$٬ˬZ2+Iffk2̪}Uc5U0+IfՒYUW4ln-Ӓ?\KTWBw|WKU4@oq2V/Y!<+& y |BB3߭gY!<+sV7K[7K[OӒg}QEƶ?F8|{>%fZ`h|O#bHFeNʭG9K/8i&=|gMCx1>J& b7/7ߟՃkzu_˴ۯh8l6S jߴkJVV7u;_P kxa iF0F7-#-L-L$rT%taMO\gl~!ι4|.3?^q'}&gL*|wXGX +M&3M&+M&'M&Dx~?[lS4]J(eG[[5ERM`+G0.]X$;R8ve-,ϢW(| kT5m}.L)^-OL"Mjd:a">$= Ium^'NƔ$̋xw?ΕvK2^J#:uiJΆFQԎuess%ɺH]Zҥ'].=Ғ.CtI]҈S%ʢċVztvJu%BTJbk0X%bs+!kl;^Q#5oU2|L&oKɒvaI#YL4?,i&Kɒ%dI3Y%Õۣ}xY9rߋ1zogM+6b{chHNىmӉfq7ڎ+ze-hq Z}T%bYaC*[J"c}XRZiK%X";-EO"z_XV}sU=!ےn[RM_)oKօ-ے,J,۔%u;–t'_p4JUOnt'(WEj) :I/+6/z˿JL:h:85͇׼0QĈ`w0 tZPm\lE0c]~,ýʵ %Э{:%yTWBQ'6⽨K`+R~Fh~FB ΅O}#oD߯o*g߈1ae7=LF8J'ˀ{.TN(* ܨU$#2nRuMOo)kTKԫR-SK巔[J*Z^jtO]nEP6Zzh8DfiH Օz5(GSYB*5/Ꮳv#UM[[zR;Vxw0\sVYjF{aߴغ6PtHj?Bjyφ{| d zg?į~- _Ϥ7o; 2޷`+ ;c'cxr=(~țd_qdj$tn<ꆴXZtTM:\T*i<%ݿT??ޯigؙt/ig*;SI;Ӗδ~3"|\߲C̚L:eE̲^̲xXR'z/ ?4~'~'-~'w,)L3,iXNvkXI%X~PobPP_v(6 ]H5zQ?(WaECqٮ>\Mi$=4w ށoMhJ F׸`Cd?&M^mw^nV%fJ˸.yT -z.Ӧ(||:oX>mZ>i6Z>J˧ZhTt)>wy21 q=.{|qpx*E?eW20|,9z: i1>#-9z: K%%Gɒ???E~(:(*(B/\h+K zyT/Vո:QEݢ&oKJK)ɒ>}%KJKiW%dIiQtHW%U;?$ɖ[Wr+ uu;g}d5JC ` 6hhӖN.Kj9mVѪzFRݖ_Ŗ 6Jm1sYP0ʣaB7˖a%*˖lejIgV[gVSgZjl_-g#C0Ow.^ógc9l\lo 4kgcchw]$?ҫGw_~IL<.^Qb\õ-#2hDYy(m]n綮]u㺭ۺqֵnn,?s[g55Y}q5aE^7FaVO cP,'KŶHEt-^v-fcm㺏qǷk1n˵ջ|--*KE=ɶh׶%-KEcEGm+^ۢd[Tllʹ[5jSɀC> @Ȁ3x7WVS19zϑGيyN:RjՒȑD챚gH2%+|( qZ>n4?+LG]CN ˁ˅{W1A>hry9vg6qCV~ǁ7ڞ|Ъ^"} *5|Akҩפjv>ԂU&kzI㒺WV]/^R%Kkj/+U/,6emV$t_̈\lVX]k9Z!_f('9!E9UOrF1<(p;Jw计[҃OOnDFR{ht@= }'wn*pk&+ncuD5p+s3K[{܄6̈)^n^{9BDD%:^{\mC urLm?vjz 5fC^2Ǭzjz 5jC>͢뀘: {@4]D1u@t; >z>zgٯ;y>g9ݧ{u^g9fE,GeucYt$eѽkэ$)\tpkƖ%˖뒽_gv؈'ota\)GwyK 3[Sb|ڔuزnnbR*MSMkM[.<_&)6?&8IUy[I8DLL?+\k(VcBM|9- g W`]05 5 >h^S?{ғk/V_5Ś%>\Y=|9OD A鲤hʳ- J q>p-vUUyrT7Cox ޱ伩oxv^(';%p۹[mZoElk+5nE{ V_XoG4*(x=dQӀ{r ja R"i h% ? %3T0[F.{mV߸%Ǻ^9MQsxmbEM?(%_vsA\ 97 ی|ۨ#`FJfMT?q>I^< nPb+ys{TmGwzȊiÀߪF]= "K\V`3fSn3ug|LݻԽ[W7uqxԕtvĺ~]ϩԷR'Vq8odx~JIrm9wϓLqp ~vAcr5 *!8m^;Yȁ"].VZt:ZٹXgV.:,F.s@cw՝֢U:UsMXn5%&8"Ge/J c>|v%:De|ٲS[2,,ݖ#;-_#--3-3mYm[l"O? 㭞kZ^բ0{L9R- Mn `7dκ՜ݍKg֢ݫ9h 73rYKX$q@׋oC(UKCNޭOȶSx*(Zɢ#ZGɢ#Z/ᅤ_![_|q6}<'9yk'l~]+>=`F Vӹ੊-] r*1>,;9h('Xj鷝g3yv;g? +-?V &ɝLz:hXD(=+|f^zc (tp-&Oy,Vd0IwW (V8S!(j%>ʞaZ@Ɲ̕[6bx۞pZ.vqnfo3:|-<+]ղM_$>yʦ ]s9 h-Q { 9zވLNSq`?q}wYeIk}Nuj 'a'NSXe?==ly%/wunf OG'$J" ;:|l? u 9z5ZgI0oljSIVks70xP,>BkҬֻ973^7Vv;po{`* OIbr Rl΃6{V߸ Vo~q|^'FNf@ىLNZcoR^O݊ǩSo?E-V֦׬{9h]p-sۛ6-8w>ׇ&b %ۏVK 9zs@=>ZClљ<>`'H:$PEONKZnv#IcbX?QP 9z(O:>GIEJLpo%?,KtKv)IMs/҉wSsѣSDk<8MXe$kf3/ :~/u /_?7K̐8!g;eF vrF&wxM=qBIgعk$>籁3 |)naMB_Md솮euIjښV!'XoR=o[?{4Rc/NV.,as7Xc}[}~ 9$e?CȔ.=+7T fWby\V Vv at|~h^Jdqr,SBkӗJ^!'X/XSP͑8[d@lyV߸X>xnn^;IKг aVUd 9Y(p{?/_ѴBN^ש,#CJK5:Abj %viMr{ ?IW,Rm)(,cऐ).*r,UwOڏeJFjiseZoS{Ȣ;H"v t0A˖D+ޣAR9.KN:R0ZaQJ 9 r&fKg'׺$NwK ɎWhUSa"&t/\q|.N(ԝ~xzRBl.\Eks 1UVhU]#\,W8)Zi%UK[YLvdNGW\U;{Uˊ!b^W ?ٽj 9SU˹md_:k^u`H!?pdi ^L"Pb'%& 7dls.&Qy r =>^z×ï|ʁ2ޚe_68735Jk7 9 knʞ<4{2e>n|/n fK;2;{Y-S|[8FĻލrSZI^1n5чIa{p3sq n J>y|1+?& E/{ˮ7nG$Ъ,}Q.v =_yXBn2lQ߾Ǐt,N|ֻkW.|:7֯邟,Z$i^?`_+<멣G4guO㢞i\cxK;xW:N+:|L[U2s>EN ca\^lIr 2jmQe)Mnr]mp۹9hlgZ Z^kWkWhʹ:| p"r'W{7 '-:?ɕ nM$Wƃn^B$WozriVOYz{l;}x}F +6ӿuV .-{tpo]"Ödafɣ#~o$OW+l8b-t!l/EPA_ a+=)y0+a=MpZvdrkBYhLYЪ.?\,sH$~TCb mt.k-v |8@m!k{2Ud2~.,^ܵ\e!'X9EЍnl )6m99w2e<iu䊉0͍Z# Y- t`T`R6GTyא־V\ح$FWIs-QbIZnۭx,L(1D|nxx%AΝ'HuT5n ;=˹ռ}ڡc9+ tYWԐ, (uJ_LnݵP+v V䊺XgU^ijXF #eIk!Ι[![|)rCv˫Rn-r (xgCbp;sL,aI}|7֤c$MZW՟yRx\sṚi.Pb&ˆUZ*Y~8Ѩ(-ā?Qb&4 1cAB,z'P)sD&Ub uc1":;Rg5겥cieD0y6Ҝ[g1 /f宿R}DQnF D(嶝snbո/t" I᷍O\^&nL X9M_c4nGuirDesɷ]Hp s wʾ |a_ ]R2ε #SA*|Vh5bK) =VNmO ?~t+\h+6k-jc# K2G|s;\ܘ%xp 9T: o\`?s,;}Gw0"n`iYRU {6#|Is+EY-S5-m,Y$2&)>s,tdbiu#"{w{>YYsXRҏySrv𧕭GnGw#trCJ+64nA1LӶLB0d9gՍ~V=X 9%n7[shul(^E=**QfBMHٿUnI'#trCjn dT/'}y*R 8w됾<ݴp .W̿CFEw.T!g/R4 |q O9(E!whuc1et pnvc}7|In WDBm|GU{<Ln/u:0?9:|v'-$> IziugaɥQE5R*Ǚ8`x*&MLCn孍 ~:CkUf9 ?AD+`8eݹΌLtKpGIz z~ӸG9z~u5Lγ 𻮫Q•rزF)<][ *M VzelfȶYb%8Z.vkn;}jqk7ۆ,wkaG;V_;IB[Xrh䨓Yv-q[[Qn>AŊ-_A!;%neyTd\e6_Gkܴ,I;GpA-'d"Yt-Fc{8fZF-V%U5svܼQ-DŽ*{zy/z/pݯw22겅|/<Ȣ?P\ =Oew{aIzʵ2[Z ejOR؁iA3䎖`nLnҩV"II`䜻Z4%&1bZ >J[̼-̋:.yGw >y̼;fޖe-Ifޒ>3on&)h" ]V/Px<6x3]Yϫ~5Dvh LM.[N ]Zo*"/[i ~lKσŸyX0La_42t4M1 \Y!!-Fȁg;5RКtEպs 0*?UCO!=?9ikx\kp+ ӪYrҫ6[xŒU+<x~-V{9Wk۪}/J 7.]hk|enô*nn8@4L+}9nZoπgdZ L30B?ZU?C 9z?I? MqH[OJnR/!{wW"/[JԔq[*}*QnK c-(II'J6t[R_6n(^JQmjOjiI|cuu`H\+RZkq";҂NHbu#eHّvu䎴S\޺m˹ŢGS!rgu,afȹȺ!rGCxA!۹n(vC?-kLnH5]F!Ɵu!8Ә5aY^F).Uܷ-)}VU:cZ^+-Nb"K*@.HW4]5'ːּ w vzQ!ۿ"KjƆO:>uh#ա8EۂXK*Mˡlv=4DT c%5cѝ􎨧W["Ֆ\\v8^|ok5V[rj2oѝМw<5/"ÖsyT?PϞ!:')eju-WGRD>|g~}QH}^^|k|+JˋKD^>#JEB?ɂn2%lXVB7(7H?7r9CS[xK[scNuK+^|r q7 I?7i~ _h[8QrD3J q>qyDjKr;G|m(7ܖ|`-1]ڒc<#W#DcZt-g(bٲ2@?a$܎yʅLQՍ;\$܂\ia]C?=Y^[vb~Yݠi|EڒV[J+I^Jm1>,-'Ӯ$b|"v%YEv,ŔDž]ҙn6øx:Mv`RZAh w'OŸv0CDCۉRI-{r9mX1ĠbQļoUo(-Zt.o͛'"UT+noqleI% Wym*o+tql|2Y}ԋj՞TVk\\b&/ ɪEb;tg[ 45W˫W˫XUgc˼lٗ-c˾l-mKN-eljKN/yߎGx_s?r\p^͵o\5YV_,&\jt(tWablp-gj۲-:L׏fW-y 9E}JhM ck iixWӨUd6ET >V+*MWA>RVq߯Bd]3Qǥ^I^09WL(f8ꧫ*e2+U7_AdP?W1{POKzꥃz^A) M '&S̅IoۮMϛr%xi&5R3A\#!j >ɲ&t%K~eIMq2yG]֮[ %~Y-8Ymj':/["Oh..2`-Rd-te ]~s}.68}XeYS'~8#ݐUѭ+Ja"0 +=Tdn%{9n+\NjTU/[3]VD5m.[O%ut_nNwn[_^.Ut-G̛e=.yWw̻μKfޜ3o%y[̼Hu"HÃe2[ C@=7nc+[h'}jW'jD?С DjrbQQEwb&/[N:&@i+~ m)z/[&n)0NvDVq-El"""/YRYw7%&8ŊV(1R-T Ex+Ni`AŹrB(cYhJf3wrUkȫ;ϙ|mvlF ?q.Kjj?w6?YG7(1"xDߦa\`vBdjtLF3HչɁƒ*y[+Shwqdf@7eH7JLpI첤RD)IZp4|JD2O76}Da.~?m~Qn>q5Dز5L,1bqL5@l'`Z4@b>-o[ϬR[7/3+>&e/N=g>%%8Z~m͆I1g3A iZ݆Gl9mFnt'ܴ1 Tlr`Uju`7g,wrɝLOCmZΘ!졍2q&CoO ? ++ZRiY3dEJLpoՊmǛ8^yKAkX1XBzfb} Tc粍r#V $-)V<~nS^o2+NGSN(Qc"Y\Iߖ`-&qujV &߸=V$6 ejzOB˹qIh1MBK&ޓPIh$FLB~IgԻTqi٭Dk+ )>u/&`l#Ah"`29|v3pf!!c^GApy=^G}+;h]YW-T˞XHh[EwrYq<܌mU } <*{`f`eN*=ɵPyt2ED#Nu6:[SPTgs9w1so̖ ZTg+Kr}ZNx}k}I7?s^OyVKG_ŹiXSKЛv\BMO} __>]QrN<&!'X>e&=eRPU]&!X{o'J,% [0-V Rb`oY[*<{u]L署EZ"'uQM5gZ֗h}[D4%"CZctiw)cHKE&@ ysדupsZsbbR&]Ȝ8ᐘNc# xN^{pXNȷnYRvbPŮ=FsZ+4<(JfЯ/w!<(\Iչ@S :N^=T.zZbWM9[Icܚv*m)|ZO% '$]ݞk_7{Ry=iO*'Iݓ={RӞT'oO*9tN*9I}sRyIE$~uI _椢sRIx|^=rٹ־wfӪ:յP˶3 ?=q7|8$V (|ou쨀?}5rUW)~⁕~/g%=gLn18'uZ$Dâ3= kj4T?PzMC3 k4T?PzMCЙ*CWՅkgU43d*F@ I]P(!09{=&y,~@ţtŪ<}YѴf=ݹey?Cv~yzz***UUU_|-PSuxT_5*/BDy'-Vbq o2/:kw5k5Y.vFNUa ro[ŊB6YwoF!#U, /[$vS[O%JYۖleŝ:-U/[._fތli*"epTejKY/{G {G`4bG dێȊȒq>6#T(W}~Dn3i}H vM( |#6KدLoq~׸>JkqRyR`DkLeeAA[<{D:TjK*:<~:ȒM"$r·-[D?\"?Hl0 (4`"7!21jM1/ oː"jn1ZcF]T"RC:pfjǴ+eƓkX]t|. 1Ɂh]\ح~$qZMZtt8.M,߸|5 SSnV rU 䛄Kήjv_SBDLx,Z>W VBdEv Ėt4rRN,-3&O %N@4o`?s}Tmv}=Mr5 f#.oV .\!'X߭*¶1^Yt~8*q9z~Qoĵx9Jȁ(ꍈ|"c8mވH7 9*&Ht31UF _Æv+%>MW B;n/ 2dkW x0Ɂh >9Zk3>gU/͝Eۊא-T[ff^1j-^Lٗ fa>\c) D'cG",.&⨚V_Ϙb@xZz~Z~rfWyK_AM jzXh`+ }H%7oFL: Zbi1b=.KDp42ef(eHx!Ӗ/^.>|ᕄ=>#TMï35Ck6.UvhUW疳Ć9QbBh=j铳Ow["?sw2smBQb!}T /{T+ ׾Z弭مkv4|jvhY9S* _k훧c$t)>?rsӰ ?k t9N-5}F%-j-FKz.8ŸV߸ gϸ&][}woǟ<f2b.?[v8G[i߶~ooߴ۷{i:ty{):4y{i:y{:4ywW_![o? [Ru?Tq ZVߤ3Zc߬Vpn`[ގPfF[y5?w4XܷК?o`WuЋQ;~;੦UgsȑZ:\/t١#Zv.ⱹ$qkmZVoE;M $qk{*3vQvjV-Rbj#[ȩZ\s.}Y}]6j%X91HhO"ܱ7*UTZA諈]{ zғbDcd =èEds;! bi9J݂ c[9{[p/..{t=<^FO]F2zz#sK71H8\k֤Z!׬$i<~\2M5^m W(bϡdP51[ 2=ijOZړ'uIS{|=kO'MIۓpqR.$o8*##?0{*_EOrDSg}D3k&:L4u&:Lu&:LtTz!N?jc?HB1 T!G9*/=>;fcP?!3TEs j`gx+|n s\y:wmmN90tb1Hc\k:ogOyiir|p7ɁQb4'm9֨$hvoʔ{R(;AI8Ŕ!vhZ>䞄XG._.:si{H3ΖJ%yWr\ZpشC{WrhQr,T*@ h| 9*_t0bšU0i} > #:>W~|LXx]M+\̻Z[!r?'5pU ;Sud[L4S/1F^ Lu)?C]3xl %:$[[ȁh&DΝ9ksghU3]`+ZH"h}oBn1=֟s:3QhO𷟥3w97%;w1p*𷟥cEBk՛ ղk 9*~֯U[[jgmn_Qp)N˹ Hys,Qo!gvg#`r ~w!*Ottۜ;qt)pչ@Ńc(e ? 4|\ bpmқø2l tL/hfF ZέLҐ)ޭ֫d5 mi!V-% FR֟KZ_s9 V.2tϭe $~{r hfʞD(d%&8tYR5)gPֳa|*ޫD$ɝK֨tɝBĕ;]FxC__n Vnefo;b$!dMƒˇ?' One0B?CZ뜆[]$pLeeZҭ۵p۹@[ЪOxeOBtj?t?kjLo8\@q;9gXU/,gc/߸`lU?mZsoz¹rU|A&W(-k+MB_A!Rl֟$ BNg +'|9(S~]@ʁhj 5њc$hb5Z6twKK$Ljn!g/6t޵Pçe\X\Au݊-dSCkrCNG䤫_X?TC;N4qpZv7 = Wj%8hZI, $MS5Ĥ"җ=@4H MF9Z4"Vtc8:΃(?T\1t\5dOh-shug/gV< =@\y^.9]˻QgV9 |,*>jH[49R MZIcMN |$g\ p]ß]nZ>jLkDtfH,MZ>ˠ81C\x/İNgr39]O İbZ4O s ր_'x`2wLf1q23C#3p[]yJ[{2l6Ȃnti-ݒDm?%PVYoנ^נAݯA=A=>z\_z|Šy`^E5//ꯢEăŸU/Ok!:JhuW8k}^$p:R𑉬\5H8SF֕.UFoDUk鞻Hr9)|sf*ޙ Uk&Nu+/QRgƗaZY-krɹQVB_TyzMIbx|u̸5~X$xJ,=)!'XY-#_F֧|`ŋO'r B Z֢.|h}k7 )e ~\Kx7 ô*n vz57c*!'X~M6ȃaY];^=M: (.8 9M]ɌtZ@\`{bbmN ј;QnB :勒ۭ@v:|讱/oW2"/[Ɉ+vv&.KϾNeYR]2:m0KtW=5lzm[mU]vg=Pj5{Z[mc{&;odiMd؂B yyE}E겥GYPS utH/[c\^XYEhNJQ-*nZ<Γ v 嶔/Tv\%d+NƜ]ް~rv~cccڧ_1,bs5f?B0Ųz*F<G+`w`t݊% le)zVVjnEwռVVQl"$YKmH']ǎ򤏩24:LTl M(eLVq߶0YR]V_:V%2uѭLA ,jl^hk2bW3yAkyY`J:n[&c5,F]Ȓ*Z>csf< ݠU$TEVq_^EWU*~E_EWQޯ(*U*qBO%xoU[n@6yRCO1[lYC'Ȼax[['Ն+6bƚw]lCNޯ"ghw47&vvīݞ9|^6Ӻ-t[_q_W17≹ADvu. ƞMfUc* U$=V`Nm*d}*8.UqP_dZͱeyċlYܸEPY ۡ΍lG:7vUܗ-iAk5:rKR0i7 m*F8d֬1OofyM6H=HTDs$5WeYȒ '~Oi :{kEU߾_EUt<7?, {قe }nʜ]L+mZ>1< 3ycCNR(x#rGLon9-ˣȀ1Vq.xZkxU5J6rY!x%5:GqNH7 YdAAR-u!e D:-ajKzv4s=; s=; u=;O[(Kds=;\Z5Jm1>qes=mAOr嶔oQ8I -/?݃_̚A9St-YVSem?B0irV#lrsk!hşgkki!2!Ү!2>Cd^Cd\Cdb,;K'9Yxh48U.ܖmVq*I6'2{dӰ㷍OX3Eٲj1 !=e{qc,;rɭ8X[rb27S>]QAy*/$h>%mݬׅ@62zN/r?4B]\RAsx;!%+b6] ]=^{Ur:-6P$-gyQChDa=jڇ>}}bƒ|Ti~K>1F8XKƒJo~K~hx4%\᥂o9:jb详)zjj详)zjx)x,bZjmQKrjJA_UV9?!eEYnXjh*K߭n2R˦K-.~QIcEܗ.'ץNiU^]zdv]vs P.{_A/3|LeL㥧2_e2x/'$]zsJC~'g|Z`5^kDQ6{o-벣\q!a|iX]⛬Y!21Uh/?iZCP E2^ĝu)y#Y4Lr/YB]\Xe\6R\ oCd XPq.tlE–n'Ѩo$+O9RΗn~U&mw?aEܠqV\ $u>.V^h؁TWB{]94<}T; sHEA-ѿX0V06 4y2GX_2"[po㤯xQwqII}R(W5lSJH+kPT)9&n1Z=0hgKy4I2n `N?5m 5G3͋TO`k;4k/kH&?tr{ǚ?x O$v&SS;` >zp2W3p\Wx =x_$ӢQ4㞵Y^Q/R>9SIuCo}JRUkc׫[گX ~kcW?~+V|{/rQdk̮J |-u $".!V}`>4L9sJY)5mN@O|J֐ ?ԜZ%kO|xbjAY$"nK@3]fM-[2tɥbvͻ`M%:䪵/𼞄pKY} C|©^:4o+ j{3p3q3,ngާ5{3q3p3{ 8|O]'8א0u/^IEL!f3|5Znt;iO/֣%Np٨F;`Z/Ă++^%.<Ŏ_VI*:׸TJ* V`LI<NΪi&0Jj|ͬesY|5_q9,z)E.pt;Hoޑ,K)NDz!v࡬Ilt >!:H cІ-mp%kM 'Ѝ'Ё t t tp] TTyZz?AN|lyg}2gZM;ML-Y > ki4:_ t p8_L}d5<_AXe͵ Ap٨>u$1E Y4|9񬨌Z<9JmwDjsfGn\!PIL+XM~E۲:(%~ɞC*RA3|f &o㥞u-0 4rw22> ~g*K* ^^RK5n|ӗ#|Btç/G;¯e3"%~'|$IJwB`P%wO9ׂmnqw<2 s*!k?vq.]].].n.]\/#{w>qg 3_Irؒ_V >zw*Wѧa<`*GԐъU:(XUz~̳pٟf=3?ΣiRDԶWrmwkpX"x?7 T3m&o3lj'LuB 0XS eq٪ll.[EllU\-~/[g]߷bO  yվ͢&5׾+ATJ! oMګgE7VmY K o|fX|5r+T>r|*k%~|@ߟ||@߯-c;,GD᳗ @,qC>,?,h]֐!LEuܒ3|+ WiRsW#ak3 ?=OSzO OS4?zzStO5:z~گXe׏_Źj ' OofpEU fW3(hp5{9mW} ԩk8b~z'z D/<1+
    ?;!khVV%Revq٠ɲ5YF"^/ ԭcji +U8 m3X6J<h`fZlR|uK=iHB mkZϞujg^=Z4QT~d [Xs\y䪁i+'W K3&#J#)L&Rȓk_o[R&~C#{?q?(7 „3WDKA] _̽yUTrY}T!T,˟UC*y39L1V 4r+5~4~؃A=0>``|90p_q 0>`]_=r45<ý#|+5lmT?R<ίD7KQV~Cw]8t=t;݁CwCw8t=t݁Cwj~~XU ׮֮ZzZFZƽv \:]^]׮^FomM=t?(g$M4kV?kڵq5p횸v{횸v \vm\&]vf#NG:ŒtY^G00>l<¬tY8¬{"Z8m= ND랈ND'uOD'zOD=CmR2 ;Al7+![(P˵q']$w šw> -%\ 1#i|Pi) 'Ȉ,tsDkR[TIS&I-C #do 9^`N'W$X\z*Uo, o%3zz)Eo[۴.רQG![FE.VbjD Q>BPX}Ky.bvK].Z-Je_RZ0YQ˽]Jp_~$UCoU^keTj-zN$鄶˰VJ2]/H\Y7t>B e JA Rdn BPI-W\ʋ.cFUo3z7VJ*-3 >֜vm?g> ųd9si|'|5V*?"W}"Ud\E6"x:IEC9|񴍺FԎ1_eQBPרTqx8Nox >!Qۃj+V*"1"Zb6 [' dc|ؒ}:u|ªLtR|=KgPb0ШE쒞)ʇE}RuYjmj0V#!Rf,5AX-,6T(`g:4I ȴGGH|<+62_HT0k2 H۶`K҇1Rş &G Zj{9W<:a^00ˣZ^NC-K م0˩?Pqߝ4tiݝiagLܙƄ԰335Lcf/=~W~C~E-cϻ ~ow7?/QVO7|>}On%|> ?|ɕِt`fCJF ;JU-IJ-y~"˦SS< *FlPAiiqqUbZ3nPAe ߒ?,j,yӰVF4x|)n2)T م1թ@vE/]o].Q. $U]fE].o]4ȓUqU;  =\b<4k<xi<_za@Կ5 z倨DQ_%';_<̐ĨꯠM&[4bK4(f=i oS<5ʟSw_S,r^{c/!qbҀq.n=_GKh_G ۣC Vԁ%KeT!!@+=5 94k>7% ͚Iװ:؈hF]:؈^ۮД@I}jC%~陠펨8 xLT!{Z D82b xk0.eiLdĸ)SFhTn޹)SS{߮ xoD&ÃErQ29eˤ"|ݩ _ܔpKe+5+%s* 9^Ҭ|RCv "nХttKO../tIK]ihШih44=4:CCc84{h##5[7TyhTo HEP@sWWsmX_|auhuùI<8As7 zb dv ЧRX1\+Wy7"`>GqHEx(zX)?'DGǡuu'L ҡ9qT;:ì=SL%~R~^O)$ ewS TL B*{L=i4_=4SO4SO'WOZ'ԓ/zDU&ii?&aGI3aKCM[?%~6CLφQˆrك"9_ kCPȎrŵϦleM)bM1)6źbaSLlu7aS,ln NpSiž&mLΫOPw-(]>ƺPO(4th!u`Γٽth C×0$P3ўڕpKw=.U?th8z9<سJ 6zo>M*g{ͥ ,`{ cTܔ_y@#h|Bt< i)T2Vd_c1TM:8K"Owt>KZb>43G~ 'Dw2w*҃kϘqKG[$9R 4yEƴ3@ib,6|=pjV[)cz %FX)N6xaJj&종@5܄:0"r0BD>e %\[mwTK^v~íNu{V?`,3DoQcJٮܮi)d'1-.MT˲>vYOT+Wbl'ePKDPˎa.l@^# y4ĥa!R]RIUrBV:4> #BBj6o)*(?(WA;K0e.ZWTA D["8EBE\zlTAOSE B*^;]8[)xǯ6gKb M0BIr ؃QOUO~-ߜ^jNq&GMc]RV*h%Z!a Ixo;tSCWSC΂]q_EeS*lZ'Č e&>Ej M-4gؐIX?+=du~Vl>dPc )𧽈7q;n_~Wo?7כR *>aߧ} }¾O/U~,_"/~|V\ß~%%|=] k`폻~wO?X3cN K" }fhV"} ׼56k'lm$K"}; `MF#go)*xAJULpձo8o6 Nb?M#x4ҸDP+bj-cX 27bZR΅Wm ؕ/$6{$P&s+ߣvP)p+UfWX3|8A!~ϑ*+a?jaw A ebUt oq(e8o q?CbQp;yZ@Ì2F&Kr[dtB |2{Q`!?Vog"T!pGvF&ٔ}oU/jM=c ûŋݚ4{d)X3C?6oyok̀R3}׾>QOT.oON;ܵ_`KϐLsIҚRGAJ"y5rBK׻YFMBF'GސOD&U*=#dN/)y/κ<(Қ\ٞ VU!Vuٶ]v[EWj5R{W{ԽսZݿ3"< 2ˬyOF5a^f:Se0T!@+yGHM}x|>wS${,S/ڧbi*eE?v eޟ{ \Âm MrqYBISy(Tث8 ƒeBSy5EcYR:Ȓq#u+0$tB m"#kf[r,0%7Ki K@@:⚱|_K+:VUs*U0 ~\9d׍trۮ;_ę@vRݮ_((xB,2ժDIz2&tLgQ_KSRQ1.-MS{( >!R(:6B$,ͥR  e7#|>C~SñPڔpK@)׷=7.U?*S-/FHڟe<. [Uxw]D*0.jH%}`MjfVëJ)PJU*޼Nܙ]b<\q-3_ u9xU&ql3 ׍B]JW|r^'nR,;t T͛}EJ`bǚW3R&CԞV᥂f )&ЦAr"L4RlhSpXMi6)4^ĝta2u &ُ z4/=05;xѱS0}Ր:-lM/4 FHE[7u ';c|I!^Ad#7]Jz"fZu(eۥcL v%9wb\mQG!o WC#u+eMݖ= 6 =RA-XkB^~HH}?*lR>O׾RGz/fڅI}s{e<;& ٽĴ7:Ok?Ҿfʵ}P{N >!FWԌV%^^jf#bߟ\_{A߇DəLji|I0MZ^j}_-FH>yE }"A.X$?Н7Z$]yE(HX^jCwϻ痵??ڟw/k~?ߵo_ s93{'×,! VHu${}n{1j*(g\%\k!Yrޟ'rEv+Rd.?B<']]-y)ޖB:債&lV{M-S^DP^t-jIk63)MkK Ѐz`My`qQ'koc54>! ۭ|}47HKM#bOtzCE]J|+MA&k/696XCՕb4Wѐliʶ4d `w-";^.(P; %2JN]q&-ޅ\*U1G}B"^>,jAl g*fuuYJWw028^@<|RZt )`*RwV>!JU h=pT!'m\`M#.o^x|B a of>k?wγ v;Cy˲5_44Ts8rQ:jn/eZ7HEüYzHxԔv >z>x+R|++Uj%PsB탣Ծ:*y|>o:XSR!/MqueLyFOe}mKspÄe,m-vުѴx"% 5E)sfb`F5 ʥW=9/HrHJz b]R}P-^j/hhF\$$G:ZS"w&u.;Hf}f]3s >[ṷ+5)ҌB5-ܱ5'BQC6&yz^A-XsjfG+*X ,@&?K[ؓf uxxQJ?B> u8 aGģPǣP$Vs|xP,.Sx _%r> 3}̔w$~K)PJUj} K 8Js1\q5 u{0E_=8. e? 7ElY1b.S#Nz+zXؤO:9rV4ҡQKe(WS,%T^or5E8=5E5E y)6;MA>tKhݱFlR~ 'D /P,>få \f\LW-Τko)*xAJ ts3"5ZͮsS-Ζ lnll7lR-Ζ;[1L S(i@QE9K"jeI2:€ o["% 0A7Vݪb[v+tfc"V|w+ty݊խ ; uˉ×t9QХrR(R}BMG..R-QnvFy[dI{V5>rw^p k+"47_- ;_J)1<~cGRmj枔/qV3dg_v; (Qqc_'%; / V}R?RBt/]]_R.3īg^3)g$g$3358# gU_g$A[2|2#@ ~4.%ßfS5bEfBZpMP"ҫ_"=P\sMq}5E"Kw/5ꚲB?yLs^ڌ Bhd')u_қC_CJ(4 ?q*@S| ПT! RGŃ'{kd 3:>DNѡ5n ?):)&)"=EkJ==E=E)Ĩ> yA֕Z[Gb10YV'_˭ܵ?k|YcGי0QD-?DZ*OC [RA3̕lTEB^OS })}:ŷ–.LR@|OVYeif3:__4 TrAiF5ߨڗjw0$dt \qUY oB ]or t+3&=$%bF=|J I Ҹ238,M^dG|[<׭T?0,P+hZܾT?$C8|RC%"V~X`%5KA1z`MEH%W39\HoF V.(רBK|N$#w9\qU@vn .P2i [)xBSM]&M1'4xISw >z5E^57 Q]y[^nUk-83t%s^K&Eb+ RݖFJYNׂz m+g]D +t7+?`@ke:RطFkj_Jo {x#p ;lBl@= 6A ] A!+ffڜZO؊aft:؇o6^XT^=ZOb5O=i{zRzғvzmGq҃2qasi}ei^ ^dھ4m4|L3)R7^ tH%x{I 6V"SC?0KܧC*ov蹂fjZ3)Z VƩ突qj%ZZ8kj_|E qI" bڀ>Po)a0O R;ZrRA3sT/.h>ˮ?xG(WAJUYkzVQrEZ+RO,A6ieDZV9,0Q /C5V8t/@89-nJ^GhF%F\k.F?K6w!Kcjcj1cjT/7J@5>FS^Zl`TuT/jd1׫GP-WkT*~8z?2d|x*_A~ܻ{ʭQa+wr~ܵ V{ʽ;ܻW} CԳC,E"t_ESԬtp1M+4(!៣UwˡȬTki=IؔOըy1@t 5Nbwbki8{8b=nb'N=JL\y %{:L/E"o_]k!nx]MQ>̋n1.@,T5hK,`l%@-}`:j )Z0Kؽ> gFU6:6Yi=]OKaXv! T?}X| iK%"6~(p9K^*h9PHugjXo߇'[Pkms>%&MV|9V:44ƒ+E ÙE09@)Q mzɉ T!Ɍ!)kFJ`FAO`Q0^`Qq{,#Q g`i7$^: #|3'|Xf \BLYe,dkOMV?x"?Cj$n|ˢXlUbpV^=A蕓{{[^G_/"=f4jnq.h/^F%;o{ÍvoF,+oWmmhsÍ6F۫]ZjڥRkjڥڥaԚڥevi]گۥt)9-cfTE8utiʭ%]3"n ֆ_O 3ry.6M Os5CcqiP)I? d+ !՛&w;mHMېچԴ i_ې!!ކT܆pچ/!&&F@&&vvOd_0iIa&㹦|Jt4i甯.Z¤uif5iEw"g 0%1xBKNTOd;dR1 svX>l\y8mհ\8+Xny5_ys%\0"ˣBU*1${㎛ºT`*7d|aHaS؊4X1Z:@X НOlG5ܨ:]`iXu ~7!>[d^EHB80%p1.֥ 4X3t!l\oHߐIJ7.pя-wc7Z >j:~u/ϫ_rdῂz-rXG.E,\ 铏ʆP1X3h {ps~JcM _&nt[!WFM _ʧDdl E;@!Bnrh9fO%' [vu*~hcz^YZ.5EbYRG3 ڌ}{^8XPѮ6IJ~ֶ[zk;iS]E_^kL&EUK_Jp)"_'~Kk_K޶|%|H]:宱ʲNԲ'TR5h^. Wb2`!\S0*TaM0 &6a lq7&hnM0 ƻ >_??__Bs_CS /l̕O3ؒӫ٥ 𷯶X3PJ";0j=Ė~ō "Kwjs1\劵ǚQ^Oxcu(W\ʋAs;S-JZt>%zRI89R륁 c$||;h[0:O0:u{_t'u}=OM:ne&rjm`xiC+kr+Z"W#tOୂmy5x8܅x` B.V>+N\݊[݊n[v+aحV`"VVo>/Y#E[_J:3MgXհruutuQk\6U /'}5=c}I {~~٠n85㠞5 jAM5ZqPԵރZuAM58giP3jApP׊_ zꊃᠮfuuA8=ꊃ?i{R2i=3OTB)˲'߮yBv$ Ǵ|p.|4OG/ IM CKΧDHS37T4!MRS55EKM^MRS#5EKM~KMKғ.5^Ԥ '] ']pg]~~ NKVԌJt W<רUQC^T/+"nХĎā~cO>>6"5;{qGxqWGx#Z8jZ8zZ8kii诅cb= QJl 55Ը555xF:0t`t` ^iIdJ&Eܗ.yT4*V5*z##FxFHbbTL->n[bUR}`Ϊ֔7U2F 1r!NWRAg(Ux`fJ, ^lY4s4M5\p/]'nE^ך"Co /qxꮹ})Ȯv="nЅ a','8amF qŗac !ampD@a0D]$j C02T~{p!B{1>>ֽX v|>ĪJw w8)G;iN2bIHw+x$z= q[ ӘQ>-Y6+%zb&Sڜǰ)1!G?t:l9nDLKùW'!^J8ihY5\&38bԊNBtoK#  %|BsvejHE@rf L0jJ\!PivP-nZ$Tُ:T(4BZ.(רhP ahh~k/]3']4kȲw8 w~c챼ܰzNQL8o! (ׅ\p/N`2#ɌHf9Ɍ)H*|̈sWnXZVOnE[qVV+u+J݊^݊RZ[ѫ[qV[˿!KkcLFd벽ܰ3?_.uyeYY&LY\*/]^YҢȯEqEqQ{Qd\7.|-b`"EQRrҠ%?4yl+U.IEŮT! bW-(6ӹHg,~^y rudO֜ܺf=xكw^ĝtdvE"DiOMQFrO JHB;i0OSL|K޶-bSG ^j;  :Emn/4zHE3b]lrQ$.I@K\ 8`ۤ".G?k(L% wWKJ<:–m+\P^l8լ*Ҿow?Ӂqg]$XҥQSl1F%]/kCiAbCkƹ+ ƻxׅ48HL -}`:3b|D.K5ҩ13m uq%Ŗ_J_Xh$D0hwR;Mҩ3b,'чDѓ($z$Г/zDI?Skl#Kb(l/7ƉaN>N%&d/ĤWrQR`FdIES0 >/x+hMmVjX+ڸkc n7VXI쌚=[εd3hg%ܔXt4$C{ CBy79faWZM5hy-fG]"nܜN":K-#F]3Q7ӲE6*+V5yHpR -bKحo܁q']UջkI^a,?v>%) whKHLҌV:5j%qӫ@^rz]QϙޖJV 9"˅*ï^:5BGqYSעhT^yD{[!m^:]FH͵?U]eI?kt25l00-5/*#:,$(k暚`9 m<Bi*Yme0ϐKm0SXSW7g'֕X!Y#5@6U%QX_+mt!\D٭*4iXNXKOJd!E DŽ@r c_q tWc-Xڟ Oj1:x-I͵P!ow)XS HT+婕tcy/_fݒԒ)Q0E-ɤKZv%>5>kLLmdt&C6\ d!guyK͆T8c~~B .B .B .Bk ./.q~ :C$`q[~[ &;XK@H^g4B 4 J}w  s4p'5j%Z~h4ֹƇG_VYKRs m l2(kA/zI&yT`Pݨk4oOwزE8R*Z`"2Bc9FYy5齃Cc-J,0)|hGۖbcZi=+)QӖjĞ%>%.UO^z`^6.ZfZ6.^6.}/K%`5(‰NDOuuX^.(רH,5 ݒR5d pOAv]L3ݙv&Dwg"L ;ݝ3v&zw&{P¦rAiF!}~?νí췵\qMy` N^cA80c{`0 AwgbL:ߝicgbL|w&δ3ՙvؙݙ>ï§oG1FX%vSb`1^Ð/vPX6,ha LQ/Qj1Χ1TE!:fV4±1*2m@wj+^^ë*Ògq.WנyZ4x^eCF[UbP3|0&oH%C8S"s*iqH眸uM T/ eUv Qq1>]  /@r͐ <&G4' )ʉF zTyT!RG![~8 |vPWK'e/Ek#U, >z_Xkܵ?[j}v>7]~kW?lW{j՚7aVc6pJ~%ՆK//u=c\XR^tfv8rJl4skZ[.\NuVcR]1QhѦUpJΧDZU̓K%Fw~JV/?j{%ٵ v35,j+~% aZPҩ|qXSC~ZV[nuxx/}8\O4Sb|v;K$5W{hB*ϓ*0 51I|: '!$5 NB$kZFn$:$:tH;pd^-Tew]BjJ"Fб>v;OyI[?T|)=ޓJO q!RS $|5?s?:qde}1tM*K6U}MN}]T_|tu٥VZO/SR\H]*Tи ړCpJq=Q3 k P]od5'sBjV0U`x eӑ r;N?m w>˨B񽏳`J,sAe Lfpp [gj&yhCXJZ*ƔO&ksH_.Uˎ`+k8f-R(|P?-M=,RG+kOK?$־z ]? ~%JWWB*zZO𷬀K߅lJ |)U§Eaȳu[ .V c~J }J`I'~dT!>{Uӽ"1n-nnVIhqD#|yC|.}~/᷏o7%trqYmR_UrǴR01S4a˲%UdRCPߌ#҅|8>j+ IEЪ( [T^D4-C$,Ь#uB0PojСKtAzPY:[:T֡~D=#OGB(1܉:O*WU_K k.xx"5Q0GʥQŃw uSj6tT!mt>J } }~o᷏o_?1Xm.֖nJ *_Bޟ\Pr/Mџ!Tyjb5+O2xz-| `!=>mZ*h,tZFk,a,ja,jXx,<{,<5{,G:T؝4@)6_n'ng_.rG;EȚ!ɬ)knZO R%DTgTqfiV:=TzXͰns^ڮn믵 k;eܱ)ɘ\!YL :n )Eew*h .5s ]t>JQƢas+˫;]K'H5gP>oqI/+R ~L49q"<6e_C<zڔ!^4VI> u>۞!^%Dzڜ!~:nvinrM櫛W7|u3fnut :[u_, F JȮ"BʡxU%O]_&2~ًZ5eklER/*WһS6, u'Z.fM 9||$"ڜ@|-4hTv޼]>T{"En7h| F.KOZRo'||;='3 Q{4+B>4d%Kb !D\I^|ϦI)RA*Uysdtsd'࿓ny2nEVuJ$q&(gLm<+/Ge!1go,eܤKz6JF OnBF]eԅeيhԕڃl2XUԲ (A)'C|?R\RN.cj|>Yp>z8R/xΗ,W+*[(Sy9pe&Y$uh*J ŭ(/(ֳU򲊰_%XE*Z; Ki>Ymx 7EU]AgzUr!Y.?E7 KsGt4R\P*RA\$Q^5f]⤸uIU;֞Z_\yA7TХk*7r^PZu)RiIg@@TOK 1vɟNDZe|3&?Xґ:bH?y2sJU;M/_oBNv"q9ote8!x L| >$MI#6O-4I˥8F8V8kap^11^ ܮ˖K@rsFa`Z8$Y)%'+UgE`r^;aY)%W/]66]"n{BN }?XWA%i B&ZDKޔ&>MMz<ބ.@fJ#@+=Iv!N hAS0a32&{^(6}!" f6MNUGb|I=Y$\^%`F5tQ}uQ ݨQ ݨp7w7܍jFnt)\H4ۨ H FE>4 >]O+Ϫ*1֫zd0ҡI3:4UB;,W&iGɮah^\͆&mHhS_qu(r2xgBpS='H5%YS,T֑*iq׵]*ߝCY)}E\DPԔ[k2{ `eۉ*e)+4MXlA`ttx:htx:<{:<4{:htO[O+O-_V m[+W7QnC7nԿFc7/\v+܃4y[iP8ܬi5ٗ"T(Q+o?JM/пܡCj^W/{fa{/{øa=` {w;oa|l0v߶a|j׸֖!KƲD+=ԘJ ΫT\jH~fh!Le]]Pl``Rq NFϩq Iq-#\5>qAB|ΑIg }.? Ͱu6]pPOmR~]^o+U5E]{ѡ3ġ:C{xCC>::ϛ7uhyMXML|^%$p&NJ&n~_k_0!S/>SKpؔR~@_ GcP%Yi#^־T%Nퟗ]tS&W@TJWkX|P(MT5BZ*^(lJ\ m67`clnU_c禱kɮIuعsɮIc_cgaפySRCɽ^ (*9V d+^@fV?c,J&Y8'1LAv-Rfs^y뗦YpoPxkb4n"٤ (=PQzTKԣZzGtbƒ֦t//q:F[r'I3h#g "|˲߂$c_=~Ї% mk$-Y#ǛV$Km;ᦔo.TI~NY=5>S(RA*սKUkG69㿋}OpMbS |.| .) @D¥W4+4X#8j4.D-_z،pg7d_]jco M@RɥFY\ >N53_o~os{ Ds]0EKsƳUT?9)X&U߭t5?>p<?-YW}-5t '*+c%VG'$bZ0UKaAفjƾAaQ+7'777_t+!Et#! ~R>t%Tg6BeC`ΈOL?z{oN _J1T?OM k҅d|5oϳ3?d*B&'.]K `]F4{ކpTjmO ozKeёO5DSc 2| 2،DmT<9Ug?Qu-RdY:OsSl4>I38jiRˊX#Rǀy/wjw]aU*R[XW8?Ö#yBt'()PZ3rQJ5g8[$RO-4Xoc^q#o >"T63c^qS$IT.j%; &_l >Oj jߞ˓\| e4~Nb>Va؍Dp=i ـTT =]*?7>^8Vk>,[K >^8vl|E~ZTc]XH^l-}{*0s)J"g#zoI]I u6>_HI>yA|? G Ze@$ٜ Wz IBK_ijXkY4#ϺG#g#gȳ%y<=Ds,Z\VT*k{U8;L"B&yBO]CRƲrè&5N>nL^S~,Ɏُ4KC^2w\@tAXૺ i^ť2rlPo2t'|@y*2TM Xc?3/ ?7 ?3 ? ?yȿ&CqqHd+ zѠ%gƗԯkg_KM֨ť'~[//w}9T*÷TM{6_TXR l}0E@!=0>G+z VX'db貚|[ӟs709D<ش'gG+?u^ZA@$ Dϲ$Cl%־f/ـPApTRcXM$m50>C;cguX.k?@qĝM'8 <Ϥ\i.Yvz?~N;in7"/@RAy*@p4{{tV:4:+ VBk:*;Xpd7&]mm} {`Vzz%[há8 +z}ۺڃ?ՉTh F41t^/CT)j \W Iv7EnMѸ)pS):7Ehh/h*zh/h*Jh_XaSԏM1~)z5p/t ,%j%,tU _ >^_ǍЬAJ%vHQg̱'d߮翵\p7\0¸ ! 6q`Cl6ņ0$)!3t.$P\ziRiCSm Q\令+4Dm]i]M4>k ʁ0Od|USiR Hd' B|DG@t0@ _i Z:4tΌX d!mgL?h| ˇ=R\j$(4EK%WYy6wuw~;3l<;zw=@w>q>Y}ęσjGHqD5>k{V1Uq'eS4H4>MRH-ULCԈW;\yv;gG37| ݂Ow }i!`"V*h-TşhJTs*FҟH _bR/mٌ|վfVskS/j_qC7~wf|WA&VI%N)6[-18Ҩxga|U6ܦ)hV*hNͥ2ͮjM6$2WLbRyy:W a:t+S՚K5^S=,qh@i>^:A򡩇[tϪ1 Anr[MGB| mnwK581ۤ +wЃЃzAA{P4uA݃4Ab=t  L@4P{ʗm  ҁ:ͥ2#4 M0^MCnMй `p/`+)v0tPKp^@^M0m`1yc#(ekԣ IQڃ4 YJ`J_lT AmQoz Ȍ+x,B*9Ej@ԁ#Vȴi'-no?b'h,QymF7gzx#4c~,Z0Jrѵ"R-M070BpOyGDeDCjO_gh{&U=uXpM$3!-;OLaRyJn$.9m.;M8=^4 ՓtB;!L֓tBS'&4R}V*5¿8i$; -5hkiw;"w;c'{洉Boz*1:W3gɞ9Kހ|IR{mk̹R tR9QAJURl('7KgD.f9A^ X{&݌F   Fg i@!X2@44h4B4cAGAБl#!?J,JHe c R+?OauG*ͥr@E|۴7l읞dd2_"v/*w`Kś1?h(I>AqBRy*|1k8V]3[ˁ\6]qѤ$avx7 ;2]?XW! OD1gRJ[ Sƞ$fSƒSƱq'2SƝ$2t2L=I:e1m ^S?u5XZ**o{M=K gҁ$xM]>Iz)sڔw 2HJl 5挤3Q8dB(K| &tx6.٬Tt=.?^ዧ0Di\GQ`TD-ϖ+nyJAuXoc]99զ ~RέR#y*#V/  JW\^14H-Y^]tMi!Y+X7I_']ct .cKFX ʁJ5/U&Ud{a?}KxK#)WJW%Y쩛@"^w %`Or#"rW:ӣj@{‡AoyU\!La&kR =4M_MQCS=4E M_M1BS˦].tP*"@U=n*et+:P"4T0NS¥gi rvM ,ҜH ABJ5gٓK{F7>! z{4#!>J @t2%ydJZ8ȔD˯n|5a5aakXVaְRaa$y"뛌 䋰}?gLWQEfeMJF9pٌ>H6*!a_c&=&X+x%[$;vAIcp;ΟwaYJx;6Q; @Pꮂ#kYSt}%AhMѭ2Q/l+/nk0Qk%.tiU뵂ZVP|D[-.5:FԨѳQ؄I,ji>!"sSi*—^j X5H^#X>S'SؽӯC8m<&Uhc{j-&`J k@Px'P%=ic \tI5@jNCrpc ϱMN -#+Z*Eyp5 Zh̜|ۣ4ՠGkYћS4x$7$vRUU5ԋp1Qd,Fb(B )'.*1^4eJ&ȿF5?Q~K|vu |a'= kY)Uc'+'n*Eޅ^{ֲRIrಷad.g5E9ikWzi| Gl.څ ӒLcym'2S-+k:-)Ҽ|hDǟ$t/]]?R.KK]jХ~˹vxWxP+N^Joz.aAJlI4V:ӥ)Zhh)ګ)Zhh)ڗM"Oiv}"j<])ӤZXAPl_0/E`ʞp'`N:L]6TA*< TMר?$p8A$UqE3ZW*" UxqjcUk!FˑC{Tc8BP {@{ZЍt[>Q>th[E!!c螔1tc%BW{ZL rMKbOuAToZM ?4>XAܘ/sܘ3%JT^PMˤV8<.[(RʁtZKlM3M5606 =6 M&MǦ$E!a{6t3"a{kWn1KWΤd (]4tހ;FtEȕŻ]~F4޸J }2ҁd9E_zss7kq:'/kG@l| ;YQ>DsRAͮ]f8zt=)S2=AGOui|=u^^7^׽zz]z]uuuݫͫū^C ^J)1k1yk 9"AjEsdc}17&]KA~?At_VVe[btBAKK&@T@q.5{@>\@LcG7M!\N"^Z*b|@ xr?MhX9&z2R-Sk/y<{Ҧݱzi;b4^ Гp.qTx@ v8epz,Rkq^Nŗ*nOg͟7&]ʽ\׀&k)րkRx XLR| (%} 7ѼK2ݗ!ykޓ<p{L^¼wUh[5*| % ȐddҫRHCyѦy7t tҁP0\*p5A&c^&cR --W&_5<AJ Ycь>K }sͦAgSe|5?okBK.۪ څ^MZZ'Wgaۢ-Ĵ\*/T>w]I`t]QxZNҨՒKMaڭt bPi]HVjOd{j_*5~TSX} 1_~X7k?Nd-Ld#Ld500{"kOx$0B|-prܵ?k|[cqsܸyny<7yn<7xy_^ɵ]krϻ'~ڟw/ɵ?ߵ?l,o kFZ'q7> \g\,ec~0)~;|K'@prfǓkevX#'}}sߟ'}}qߟW})WlvέG%9X(7Z?KJ=_Hb], ߜ !R H后F6B0i X,<9qYwywuwŝgrYWɉ;γޝgߧvN^O}jͧv;h*NJ v9aȥ*ڗ\Zj7~MT5]//7HwwzN׹N|n :7|nTùQM|nh(:7ډ΍vz|7A &nmM 9+ny ~ƦRrrAD6iq6xԑ2Eu[ҥ]jХtAt/]zХ]KtK\L+\iE7򵢓pZnr׊.WZL+_+}޶P],̮x+]>J}\Ύ[m|5?H?iGQ{*E""imQup_;]0ۭ_#̉*k;œp؍aܤ8?tEL zT$uI'h뒲&Jr̓ SxX&ty^kɩQA"Z:4 _jDK[,K/Ks,K_XzbJuPXGodJzm%`#7.ȍG 0Vޡ{\ ; ?jjaIcu˫Cm~zӪ(r(^2V)Ľ.lH+DaiT ˩S*a9Urd9.q9Sp.wfQ;32{g;#wfZzk*ajajQQQFFF(%R5-nGS*"Ux].E3cCXn]*/zIvV9OACi L8g݊# $Zr5G Fڨm^Ue9TrmbÜ& 9R[wGMMԏ˛$< !Of=P 硪TS!ӥzmg^kk HuԦO~b?ՉrAJq[yd M4&٬5c]余5I~'r`RO h^vvހ;vL^wld%u9znZ*0^D̴!-ѯޭ(O-N7~ۥ|`Thg\'mP碙ZMi!<"#-)b wZ O_xG:zW+tHxI6̬[1FC, 5nRIլ[ɻiZCZV*hu+j%UOȢAdIq1B8ƕw&xƶҁum31_1i`e31_i` DlqH6HÀav):RjK$WX{'K7\3G3~̈́+̄;̄500{&|ff}τgf>f^2L/2[̼%6Ef>e%[iH( ?3 3 ?3 0_?1Wo;$;nێxӊ`nj~j)JMߦ_nr7E)Ǧ(nmSMQ)ʻ)🤽?*zR/#!>J @Tϡ)f*fydHgpk~_K#V+C%U.Z*h*WyΓ䏝fq͕3̅=.K3vǥD.rFmR`(}_ɥ'Ts C9 "98j ́(ۤ QwJy귝~<;O;Oԏrsu%>wI#WB3>eu9(Ť fMX/Xc߫} LO CCEm̖ڟ"-,z>8OzC(aEV<f+'^R ~(gQ%+!]`'hfL.Ꮟ¯.z.| T5UJ>J'^3cjaIo:k~3BDm)1J @ zۤ Q*]S?!j?I-Zw- o.&ʵ|?WŤ ajeS=j|h+z hf| |Y>3R^HS/w?K,C0|)@3UK ҖlI#Ygc3}?_}߇UH}?}?SߧQƾ_gOy~դ)䏚 gQ 5>=gLLRkTP{RE Gr5(Zx-(ZhGrG£hyzR@ρ$wP@[s + 4B0|N%b(Zxm<{<E=E3EGE?w?ss&URAu]*_' ἈE@ -5xU*t=;&U߭T c%b" v|{*gooC/C%bw/gB%u t;sBXiڭՔ2 J M6kߑ>LŰR_)XSCr @h= (}"iU5mX N<5b a]aIHn| *?NbL>Np8+x OR~7aȨWG5lO5GʷI[Vks{`_k)}kVnyj}}'Ͼ}Ͼg~ϾgƳogɳoٷgs͖C,.b0k k@_ƀm|Y}.%\iuTc%T=D!{S\)Ϛˇ$[D•T cڇo}cT}ƨ7Fo}cT7}(o}ñ3YعEc~;w>v|g^|g9I6vRx0SK @箶%++R[҉mړ\*_0E}[1f'y4G{MoaṾ):xMJ7A=|H*= &UTcuD{9̺ͻDҟ񁘼qP_m]bc3VLS@0n&@4v3n兯$7VTடF$:iv6D?#]?#ϦßßV$:)uSa"8q= q;P-ii>QaC?8Ȁ0]jVTd=q(.?mM~oP55D" 0>%*g|YނoD*)Gģ#V8>qh|\UO}0ġqվOW>q("`'CCWaO4@ Z.(WgD ^D 5vqR5fE>v" ᣈPHrv1LvP D]].[(Sy99D!٤*{X}J&@5tQBc4+4B|km@P I|l 猫;ۀ]A0ۀb|5_#Lt`.N/Z*b<MV*hkj]kp+~ow7ʵ\kk_b ZBevv-0>!V3$~QWe1v$FiJ'|zXoY=n V ! ~Rq;T*_q+oJI]ҩ-b%g+Fᯧ{Jn0]K*|+sP\j +eINK5LOߊ>hIR}/?kΫ'l/]Y7|d!LmR4Oǖc`+Saj)f J(3XT!8T`+\| _3=!jt#yҏ״*hy.hGxAl@xԛGPܮK Ÿd%o$),W0#/>%K$;L=[il%wt/S'A?X-UsfVYCv`=[ja$tR92mL?Vz`Dib&NU]jiB41MTc9e.\p8E A Q%R j k{=m)UO&;4M۽im .`={}{ ^ח`%{}{^/̽#o㑷xmx-<{<6y{䕷ƾk ~Mww⅃`rS5H-7ե*z**zb*VUdMV\rpY;DiAYyT!HVf=DMFcK5u4U4p1TwxjK͸7m~&)m{~:V:7 i| 6[bݛ=5N~k[` ak/ka5` kKG۳8\oS^YOM1acBii˪>2أ T MLV;&މDab*L@;r j|ݣ֫G oe[ThyGW܂cX-/ܤ|Y AIR~GVyڜcm3XTv?Q\n$tyΨ8sLVenUID rjvn59&V_KbD]$ vs2]ʫ/Iҭ oڏ*[(e[JۭljevYv]VhjevYv١]VhE{4պyG}G#Fޑy<^G-mp_G=mp^G+mp_G#mpپ8_XgaY)xP%$-4JLO> [bRঐR*l.))#)IH}ZKl ʰHS=@"MH6R2+=_fJB.+x|I'KRQ\q otٔ,^>XQ,|«aJ7%_"$NMtCwX/ /[UDu4>Q]ޒju6^*U-u1\P(>ƅttԫ$349i B@:m(q/I,,SJFkSe1ΐ#(m`*5,|iz3*ɮ|3+:d./F~_֦(r@,)K񁠇)!'F hF)| ~pQ%R,G> :|?ݤ AQ 4Xol6 w:j V*tU*ßf'Mwh)M3]j:JTs4`g])R͉*U1~ANV&R+i:f]~.{ o)W\E8uM\F٨'uQw6~ugnl6F٨ۨu;%ImQYcV. f gC+kuGߍM?՛нhђv̫_$"4x粅2E+.&IZ_Cwhe;4ܺaWCۋwhh;M:Zw:*{R"KTt^J"(xa–{Sbvs6tvހtٷop Lo l-|'[,\N17[~YNO/2bI -‡:O$/WRvJ=R+RiDZއrT!5CjyV۴LTĩ / (JVZI7oV.5qFUiqyXXcߩg3<_JR_'Y x%`z| *S|sw>ynEIOA/0,6LR+Rtl;_%y7;K, /5c@Y ԥNeΫTrw UR#%R|1D b @[X4aR_A<81mS]6ʸY]j3Mׄå2J7%qFƜ>J9ScMeHX/g_40>J}@V=^>,{X⃀>X|0 `@Ȣa:7 us慳unSKp9O_ YAM&#! ;{e՜[^\)+RIeXYjd*?RLo Zp/R"[軽uK?drKXJ~u>P [’^*6c7jᣴj¯J=N+pa|ISR>z1-DۣE䌸w2]n70>zsxy {.4(Rʫ^(4 n-j7+W\MN>BCC !FF{Yz>{Yʵ_7|+cΫTȕ8_a@v‟ܤ.PJiN-x&кRKLʫTIJ5/DW첓d_u䴮T*KQ$'Y&h!H*(a "u.t)3vk+Ⱥ_+GS7l"jyö58ba.tx8~aSZa 4+HNѬKTDԞ? ;M-#ӥ^}i"aTrb"{YB 䟷=*@GEzxy jDn:Ezx(JуN|:ۃ72:;Ր7eVC)ӥ{y}%ʫTZ,}K ɎkYEMyxS)ex +se el+W^t)OM.ϝMuyH #$ *U$Qd D ATA%l`Sg?TȖAJhI>#ˇ2 - c%@\ϗ&xKtul[)SazT^;p B7 ܇ԉ{:ou) Oyxڊ+] ?WKh`R_?6[)+KICO]6У rkMrdv).e%n)vծqt~}Lyֽ5)..V* Q«Teuo~6.{khT<p.+ݶgn#*l|q_l,tlyn%tAt/]v%]KtAҥ]r%K}I}~dC_W`.]Vb] rހ; Vew;'aEq|3CK+aTR ZƗP^+o4E% ӿٯfSTygW)ѥWL' )7nEDWn7%pe| 8 ~!~hq%U֛Jyl5֫${w7yn:B#vm)!fxJD&ԔYv`!L4 r D.D=gm0Ҋ1Y G)r i?Ô8ctdnN\!qqT૥2'M^-/-WK˥|ٵ_/MH&ӧR*dmZc!;oSNv 4drހ%?fXtiEΫT\L_.i.M\jrܭݭwjjrܭݭ6wj~խ։KA` AHexYL 볦e|Wf83 U抂ĤiS~+JJIB礥@cKKۼ#ϓyϓAۼ#܆yGe|5gQɉ;Ϻ;γ,<;Ϻ:<\!N3b.2ݜtmMwtd]>馻ttiK/9ZV]%^KމQSZ bl&QLhƬ[.qSQ\7Qi`E= !R %MDHka'[$~۾?}}Ǿwߗ–cU9I_H+?(W)!:Z4-ߨԍ@-uX Mo݉v (s'Չwtw-Dִԉ,mx~/S+deu0TRAhSrU_#gj5B~.iLt4tOchjil46=evil4& 6Fm` D6Pe"鶁L6N_ـHh6s*|/*RC\Jw~+" H j63;5l\GVr;}^.OޞڱCX] Zhn#(Y>%d:BSH)$=.^:jl/1-9w8O_q 6>?W)1'j\Q2ʫT|tn;хB"Wd.JnLKKxȫƄHƭ]cnLd.ryJ]P ʁ K[!txix>RK\M6뒳flIv羅շQkaaѪѪѪFFFzjU}M5L=LyzpmFw'h|Mߝ7%5yMAHwJӷOАw黾oyN&BuIHo[a|k4 Btmc7|?!$ XױCO*|&G&#_8cc'?Q%;~"|MId^3b3>v~<:yXyETXNKoGST*A&8(V M8R+.$tKBE@'=ˡ22]W͎+sm 8dS'4YZI)"|)g|E U Z3V@J +~wݗH,KN>+yyWC=ٛ6-E폧>fJp.nM)brS̻)&7ঘwSlnM1M_M)j M_M1CS;4 M令)4MM9LP.@gWazl+p,݈vPD䳷cOc%:bne,z1 T{1d1Juj㸠ʉK- 鱑&)c 匙#a:bQR0!]'MS> x a>\x㌤٥zqdǕTq$;Jf0 a aCf0 a aCB<o8˯"%nDzx<(Q_W<,QF*f 瞍k RD|@0l !R DK&URp%T~3zkZhⵔ =ɂwU*'FtTIQ \UKf<;BWyj{D}Y9Vr u:ߖ@72S'u}@8^IL:Jϗx-][ߨWBpYaWYg8T3)Z[5yBX~i׼JfEB@#t~~?3|g6RT~S M./\ fZ*H;SjZ xSOŹc |N˵.y@7u7FB ep[6[!𷆷-FX#1]>N>̉^>Mrh""}]0c%rڣ-BhҰ)%!{} xpNuk Y*;m`7rNM6&'e Zm=1 jBHpʢt˞%~*@W. օ5SI.5օ RЅH&H&ŠA~Y0c}{43n==zܣg'cU|1j[_֯Z 1Xz~u[ږWЯ2nօօE}Z`]ظuauamߺ0I([a]XyPա~]Z:puWuuhPա|qud2I$i.YۆkƼ4Kcf ,yi&RY*YFGs-X-;,֓>6>%b" ߬DpY<+@UK|[ZOsL|l`oFX N "ֶӁVZp+GWd\`ZcXќ+O l_s_>&kZçngյK\{gp-|N\^ Vf'4eBDؼ7KdQ{)H11]@8/΁q/ ? ?~o3_2eF ..2eV2+ .s˴ww&~ d+t(Į5f /1z9]uENWWӌ#) ~4?"k$%~HtI0>H*K1`<ċ" I0.G̘6Y Q? ;=> =ϠCap 1(2(eh[4joCƆ6h\lnCņ6hllކ;+{<o?$N'D.F($i4rt>r >r1*9:9}t>r >rt>rCT-13.ö=k)V/Z$"PŠxWvԆLKh ˵Tu^XT"~u^Tu^XT"u^{8te(p0Q0jƊ-V[2*\+Kk%ds ?>}|kFD3ze537PghFыftM׌^fH4GzZ0Dxˏs[m{0@S|h2; ^fsvVec5'UH(!b(|=ABT}4=aF4|\ O]ҧ.ErPvml4$`|Od)/YYR,%K KYJ,odY,DEQB4{fEVېg-+,ȇJYNqIZ5罂^q^Wὢ^Qb$^yx^,|a.yVKDB_5 '>=_LZt/1>`R L I#`"UeqLEA$iBLV_֢` Gq+4+4+4Р֐CӼ+4+4XoƼONONON>9->9e>9|~I2 ̄bϭe8BkLFr7*f= r(>yD^GPgA MG<'/Qs%3ҳ ]z}Y.=/=dHRiHҥgLgJdr^.[T Ty!&\P"/|1/e~-;xyL IrwEhꊝ+ wEPW]QhBec5S)0|*Pj?ZJOT;<Ĵ_zFj3&RH\=?j 1?OSS<'D}Ci6ն~6''^ º=¶¶^ma-׶ö¶=3{3{^<=3{3{^<{f)”aJהaJ0%kJ0%OuOSb)eq2f<=6Сpυ]$Аτ}Ot5}ԼyE_=T:)/|0_=^R^XO ?,6+gYYyLggY߳3&in7,a,o<{,o<4 k~X(3XXBkyrD>f A{0?YitςE$%]$fAO,4 VYkjMAM_YZjT%w0{Qv j{6-"ΦDڪMxJvOBvm~X_SC`׶k;geA (J "Lo.SR2Q+.;/mkf2x2{2[:-_l26UZf{A̮Zf]cXG׸EK?yoK5>P0Sk,OĩAMsn!xoNHj-V`2?&,c=gAkF}vaF׌aF>{F>{0_0A~=$8 "%dx;Po'IZ,T}J&ʶzŕ5"<9Ӧ?lY="ٚ|•'Gl,e&H8/AjOaiv7~#HP(%' U'@h%Z\dӉwe<³,YF76Yƭ<_Lݴ6t&Kc-f%ZssZ i,inei< gTPЌML@HN#@O(e%}tY &Z9_{W_{ň M_{::R@p^I{^{+I#׸{^,*6M5KaѸE)JQR'qso%n{m0ăsmbIi)lIempxP*m;ămp"la4'W2q8p1FG3FhLL@IT#\8rP9#\8u-;{JrYǠU b4K͂Ăt R}f,p *iv oXF "Hi"%DҢ}ȗ0KἥDh=pe3=Ld)N)S!ݷTYN)N))YeT:|)V"X+V ְ-Xi# ŠUvi/di#KȒF/e:X8[xhi݇x0^w t%ϗNtnA']~:2Xy7/. -LK˴ HcA-dAFeZUuzdh6#S2\L5iDRs7sQ x4O7\\ET$?ѭTxiρ6]Ѡs`,s55!|RJЊpHiCJ ZyR15Øꐲ^K⥷;һһ^K K/%q魔XWpһXzw}$qGq' Gs:)L~2.>;Ϧ~[ϯbX»x:/p^,.b4r8//΋Y)r5A8Ar^i\q˱Ԗ=]Lbȳco**.GS<>S1(C NRJ#2ꖝwߨWK׮L,qlb w-pA_t"-VK5o' W5xł6)W=*} ǫ*ዕi̚nU@BhmCP<=>UӘI~k۸J@-$ ™+bK*)򱚖LM=э7I p<ED$[[oY¶p }C[8 Ю-=CW)|&Y_Aj5Y_DRNH٭4\Iq W1|AG2D=~zQb1JR5r%"h<Kڀ;rTQwO5u{>SO9\'U Ny@ D9u8mOKƛ5pK_yEkAXm  [ի,=,/J6&YfH #%`FbTQ:IR:K &"%F|"?%DWXx,EgGev[ϢRi4򶼔=MW Y $jK%C|7]RB/D" HT%)DJ<*Vi4jՄ8a hɹ67lc%/[ #zk<2mTo#Gzk|)AVP)n调_YrAj @Ab(HXRo<;]#n]_AD;srKKKA;pR),7|C#s7W $jh*8W`xqqUx{x1+qN'qyTmR9^4}c { uܶOs-Jq޴s;vx޼s[|: %0n㆑lU51hQ u:m34\Vm^,m|Y6>_^,a_l=" )kIEwt S$ Fc,j-0 &摔^1uw-S!y:;Ij9/5Ϝ<*\oRIj:_j5A3s=f|3 ? <+ rz4[Rm`QouzϕXIa`']gN+ah- % -Ag f$hA[4L-oxeS.rg? CW"ڦ;Yc[{9[6' WWbMW qw+Ǯ㫮xH]쏤` Yʕ?ODC|%^t2yߟO?i的{:'Zd" ?(VJ›eJp-CLmThne]+$vźbrW,uw⮘ꊙ+wzwʼn0 ޵z^J'̆ vlW)0+a>wh8獂_V{쭕N Hɕb'z ?k-4v4hmY1| eK2ADzE?HTӜ—K0 Hʊ^}`'vxXt3>=.v69w~!2!"X?(q|)hc&oDin%:?@7IWDkt~36Ѣt~;op::I׉-ѐx^xޑn,8P y[,UoW)~ 1V/j.ՔM`^j셦M(&,#t2RݰJc$ J.gU4ʵI! Jþ5 >ikd ,]K$7 -{oh$-%DQƲ,r=b,d4JdSvމFQm\҅d9jnO[ֈYm']ջV&İ9IqIZz-LA KyjD^̛v{)Ky mf`R,L ϶UXpxyAkb#\ s=FL3Q cEE=EhkѢEEEע"bĨb Ք+*İ@;Cݯp¡6Y'pIu6=uvɥykK B'~M.Ig_ W(N _>8Ekg?KA,F'it)ŧ*Cב'6:&%rMY2Oa#Ȓ'[?sWn|> nL\cWṋ߭TR+1gN(I`]^ALCt+fc,hù AGPT##ZGPGPTx:jg?G8qI]H _k_(hŕͲhepcí@,ss%z(C8d"dZ /Ш ϏyKiV6&Y͇6!Zݜ؎͹V-,뻸3tݝC+naVЃx,~fq*[myɡ"tR(>;obtI_=jC$@-c q<$hL?V{*ߕC!Y9sm<M\ \閫‡\'\!E_]H'Ң\-_V%2e-%D w,KMl&yqLUi$YW;-*[J&˴zEjnxx~ ϭϭ_¹(GO%ZHpn]ϭss|n}n!`C5y߻ 9V}o7} 9V}6X=6oC!O[XL";n/щ_/ATNV*7VY}|6tEkQWd>uE ]1;߇ؙo>sf>[|f&ghIEHS(;.Gђ R^qu]&&Y}bO tȅ\\>3'o}bOOrj 2T5b:fg1SlKaff{LHeIMv^{y"7+r xPcؕb+fb^1edy'ֵd)6'[/YX'O?/Axa/.L ƅId´]r Sׅ)w0;p´']f =M.- Внk]{vZZoMnf}bZKhK8C׽tx{NxMu0_!^ } acON2r{yMH=FJ'~!tY-5S^Z 4jB ?$`&Fmi^ߏ#H;"̚u|jEvi| ? it $اĤTJ~+o8F|DR'.[v*]G7kMxCM ]"Ypkl>ܖĒ㭲ć[jěYSp6C~n7 n}-||:p+igŇ>܊6z X:*jًNyTãzTo\8/Ϣ+=͊%:4xLJfC$ձC]CҬ(bղ+ GSZm}:r;tk֯/-b+nt'N䬘vB(W9`[ݸJ/Uh.c_r4E'N≂VۑEgr5VT3R0[kou_|8!\EӠQqSn}9 kZ:zçx `*j$ٔkcfSA h,BUn"C5M#C%UȠѢ=$?&7|xKzŕf"JHrvRΐJ^C(u_2GxA)] 0^Np_yJTey砒ޟsPɮ|[uMsfyyyf9UbXpdhPl>,\d'D] v B d'-xVFtQ(Z+x3;a?F^FX~]vp5!5k\}]j "\5nk38 ̑ 9F5ә!V.ztDE939v~989GBBJE6I&]|࿋*o IcSAۻ1=yX\!3~uhzQ&gpxFX ߨp\n\GEk1W:) ,a>\O/int;_9ZWyQm :)ͫ‚9\I*iZmtK"dWsA||,ǍV%IaFP> r螐qU k- 첝G\gW(-%az}PKmn_Gw](ܐE%&>l៏f&3`r,x G|j+)޷qI6Uɹ2|Nj>8ZX(.i4]3Gek$jXG;e.h}B7 W)\Q:J 5㗜R2{}w UTLJ\ylVZ'9×1<&MWIƓgWZMԗ,5҃,%K K}R,%R_ K od8_gfj)Ȃz`!)ʒIJh=p%}Ldy ߶mҒm:6-,ZߏJIx,ϗ;C[no),ZeQͧ\ q/ΒiO98sz(u:mQٴd O3^I!4_ĔOd,99q F6FR-6LZes?^s??a_a0s_T@wAtMx.D^W\A_(5?twMz)ߨOxb"$:HIF֧La1I!\Ie+s->+lr:J /o7/9#)gIǼFHGRRFd)_|Sj[é7^y{WVN]+o x"v*AfgM2Lկx,s%ĻXTߵ8Ex,/=_RC//=K _2B/~z_RN8CwNq.]f ҍ2S-%eyRZdYےDˇV֔XzL $Jw •S@k~+wOqG]fXy4M%5Z2ףAdk.~(>q)5ΟhzUf⭲זR– /l^GRkKqKټ ז /%l)-d!y`< 䖍< aM2 ًxWo&Vq\e$,n{,5Mvz=nZ2Yw 6 ZKeRI]n]-,-6Kkѻ%?2P)ﱡ\I݇nYn S|H kVqja5^êa5°a5°jaXװaX0Jeb5- kN+t msFYɂI0bL$MWv*&HRqG~Go>R7t:#cYEo>2#. # PR`K5Oxl›f%t-J=FΗՠMqIQ`R:LbW部0Φ\(ZVS3/aΰO5x't5+PͼU[c* Dhk[4:1UwiL+Pͯw_)\ Oj"Mh BSxk BSX6\4k)\{ a 0=)\)\i SS<S!?^S3pT9`r%6^? ï +/ ?]&k5/Z{(aǭ?~/[?b-΁)Z,1YP5x$.^Q?U=7IqV6zcA>i/ܗ,Ŭe5rc;mB_|.l~$Ѕtw0M4 ~Їnw{lFNS`Tw/c q??>¯~? wo[#  ~'sŇ^tuGǎï;N ` q]`Bk_,'>T,> ~4UTImʺf6R`[T#~~~ԝnũ>N/ntLk@k@k@} OpLJ]xnp]I!MqJnpktz/hFMWyY/Y t:) 6ZJX jX&kt{L<ϼYL!e|t<<3߃ y>Iw\ GUpTi`Jw E1W)mojޢ\ [s믻_w/n[}?|2Gd7CryO–2'CyԌ.k69OV(#Ya?֟S ? G/H|`y̛̓:0K=0o>0S_vך ~ }Y j:+~R~qVaZo'brs;VKKL ßN %չj_qlΕvpG9]Io͗MJ]Gb6j ? ?~o3_Q n73p.M+ۙn7+wqƫqV \ ~Vxݯr*roZ+к{?Nc0X/^O@"Z(~8Ywo], ~v\.GR,dcYD+Ϳ8*Pn^0ɠYЇ)w?9J~L}a@VЀORF_YDB4YDR#K^_Pec-AG2 x?đ\dr7/eMblK(dwˏn͹ ,'b',HU=+o{dHvtZMJa\sX;A;RڱP5ݚX;HE;ҏMm3vbWs:''L?+=۷}׍uuv^ny-0=*m<^J}bIgBDC/dtDȠ_pjSpjԾNpj<ڗ2F1ltAf"fr…WVnZ2!+H/e" 5?gJwwvjP\YĶĎĶ[%hr\b/v/Kl{/7'̉s~_ y')ļfr: $֞@J'i%ï5lm6saćoV+#,Jt )W)i xGhΕg7d"""o%ovep:ml4T/ZEkz|AHWУrYDt* O'9xEc5kQ3VK @[5|)W tNt5?m[|cnetY7Xs`v$R_<U5k88ǶJш,HGEg-ŸJkAt5_:ߦgi4dZ"^@oʘ;`;8T5R6aF 6(j!hEiVE2H.ĝщ{za8?"ӣZmu.J\Ngx"ks:G?##{7snnF`VVj+OrE8tkkV3* _ku֖9n[# } }~}ロwuテwŻwŻwݻw޻wQUPwgLv-ݷjcݹ2p'jf(ZKDXiyJ%lSD #Dj2}ːD8Ɨ2M2}ɐR>`xʿZks2E$Ù21h*277 &ڎd+I[+ҍ.˝Pf7{vct:5h43A^Aנ}Aנkо qX5h_kP׷0UբH/0Y`;)#|2"ݓJkm;FRwOnOd4ZMϨPn'f[,Iu^w@נS.Ip~LQ īytbP2 [m? nr5CՈj\+G1j"@؝+8c6M`&3m;_ȣMk6i ܵP,8R? WJ!GtRȮIgMh 6վdC4~VwSǣE-H{BD^P-J5K0m6LU4!y'a!X,6ZHKRZfm!ZH%/RZ*+LBh!^ t+<Qk N !% 9V_y\y73<<=+y{7Ǖq}c*Bislj@#[Uyo!s͜6Ϭisy /Q:5J&BhQjrKN5HEZ2AWՄ4xsWp8M EEZ flεEZ ft!<<.<+z<<<+ ЇvC Q|u Bc._B Z94Ms%2x { 5^ڽ 5^*/C^/C^Rbk#vVVqsaZ"?V%ha9،XA(|Fg`T`[QI(2NJzIwt>hcabbNKp]5>fz;;rB)lWK&8B)ѝ+&]\?M2O۹#n+ sW3M$-%~Vst5m 1n_W- YWtUw{'IlZr=@𵶟ȾB[}kqsO ݹ6GSl 1u_zn+8e w#$,q긎.8fVۑ[ACVBo4#~<J6&W $&upn` 3^sOYM(mIj@6Zp䀅ٔ`ε*V+h j3➔D?CS;gt&-p}05Pu As%6XX[ot@ dVZZZJygwgZl(Wi줳f~;vy |´Gh >[wJȴ څwg_|rw6V[Q;yg+ ?ˇ&O\+WZAT7?Z3HFHdՎ׻B9I:smlgSt5'3EobJ7>Vv*4rp:JJl _N mCW[h˹V~-p:Jo` ҝ,_S R @7N;Y;o %,A_ K0n K:n X5K0Hx:&6?x*[tvL:!Rݶ V V-AbRձ[jDX9*?%5^I5R` t7HR-HUhGlG36JR :b\+?f u):I`)hOIX Z'Cu@2hmNJ2x>*h#7 &PR& ZQ0jf9ß Ї-n(YR,&-i SҁpD@V5 vSP NGpIs&>Ai1 q_(m1[ɇ׹eٲOa7rMYx Wh0M S8k BS&zMJSx³,ڲIm %0ܻ0]c 0.^\B^d:T3!T(k@(b$+WU"ӹ&n&d:׫SYޡ6 `;`_IuiF As.Ip^pď2Vb(逷&n$4}`O1n`5hĝ$¯IbS>X-kf?Z4M#6m>4+9C;G zP5R0&g:Wap&GKPXA xpņmX͕k{Xm£qN+ЀvFuNNHƲu-]#H ў&t ]#pn~&Yt5f5mIB^@ 7cSVB9CEt:H@[G(tNRSv(W_΃hJ(U ZmAh+/F㧗0~:qmrRlt!5Fg?*1TB<"}jt \xe1|?BRch)vx\Εv ]^Ϫ4Z|z OJOS-"kŸ^OgUZ|V}->5tj=6(X6|9kmc^1oVml6Y~;'XR4>ő9^*Izee[Z L XD˸/YJXĻ@W% iRՒRX+4$[&ˠamr夏B8c!P̂SpTdT:)T#  \wg;r:J&ɓ:oV{P:)LypQzGO4#{=^ӻ==nazaz0[ ,jm3)Z;ڤ$s0 U SU4_KfOj* Xܝ,W4"_'I:wF&GmczZEܶw|hFչRr6Ϫ1dH]F8 hLhp4NGUkqϢ+?Nπ.x} 灎ԑ0<У|+tU_D/4#7OT7BDI6>~'/ mi\ ܙI߾p_Y%SKK$Տj(2;.ɺ9w"w2"ZdyTEQN3)j[g[{ 8TFIOhGBfϱ-'ƾgD=F hQqN4ΛZib{0mLӾy0{0mLӾSy0`t߉? ~M~!;HΗZXG`ى%:-Km-:o) V\IMI+]?vEwWo"] Fwl/H#.m=noe\N؎ 6v:z2,r*-9DV1R@k㦆N8Jh^sQ2A .eq$GSGX{mv{YW(ۛH(t$h#֫+2waR]Ժ rhjU:9p‚Km62n:7-{vYLϝGwJ(W˲?,[hw%@^6eT{GSURT/;rT{hwZl /r-ؖ{-\&mŶb[ދOqKcc"hOy)돭Ѣ |)cmV7;;#&Zdy;3X&ؚf3)Z;Qߕvlٹ6ٖlW8a%.m&t2Pj=|LP:)dV7t2U*ZFzKQ Xjw׈e쀫IhbSkv;xNGX|Qd'2VIGCVwV*Wn} ,4R Z&刕{ ^ U^:/C^:/C~/CP/CϏ/o}}Xq$N _kO  ʇQsC`LOfRi;W[|cnq<8xYa:0,?2m[5k&m-Uz[vp𬏃ύ ~ ~?oϏ'ß_3~__g(|Wd{n_6+_?ѕc/TE!,%ax8JRHzMU&wx'NMo-!+r)'O;BKPFi~eZ!}|xL- (~ɯ/%YmRӾ*#K'pKO9lLleG.C}pqZEK*DM^:-JͣKtg5wwoh7ɂdez*7(ZUK&K!EuEx,b mQ={4R0IT`, %H H R =_ HeA-`Az!AݏR%hDyܛBJ&q)-JŢ> agT翛D˸,Or¢fmM/`׆d؆ Jae[?NlJ U%GU9xLh-/iTBT`UK:<#T j7fM"9fNIySvֿB$7F;$ H8)#FqMUNXbXE3 %$#XG\ۘbƶ\ ~IDo5boBx'ԡQAZʣ2Yjfcxq_ jTNZ،\4^hH<+ƼI!c@ =׌ ڃF+?Bt6E]D&]dV;Zh.r(W?,ΛE_Va;KJ ~ ~?oϏ'ß ~Mp[Au,ꏺN—Gb:& Jgٚ%DkZVqo=b%MWɢ@ e$=9mB&5v~6Vm8! 64H:c_lǿl~\y ^tc&.أ76D;8yNvof!2c>أ:2 `p-*p\hyHLN'ᡄf2:W:a 6WT5}kv>u^ziME\& דV_V-@ G5iP:Pjα2 ˛ EU &/iZ+h@GXk*0V 5z 3LyOSTTX<&O '\,(ooebV+:,N:,,ao4U_se'~ jp; o'az)[?k<ߧsM&[nzgX?fԶvBt Զ7 (o{6-s%Oԙm9?q7ijeʕ௡frPq7_k?gcLiP Zt:+ock Jmٙι W!O_dL2`{ʇYIKAeqԬչ T߉1%xHs$?YK&㐦R~k` i|`0!=9W@r|. v9>򩺦.mRH cgc-Z-@% ׈1 " Gl r9+κZ |@EǰQv30!JzlNGzv3 . Iz宗Bgz\P`LۜFm78sLaVq6]ʕ="_sl/c\06%' %;$]62gombЄ6lh`R~oR2 ˳QI0YڤFk3tj#JBbH͚dG_ ,6qoɻ"iz|J+P?4eK^_]NU[J+&.nD˸XYvaSV+ 7؆*d$Ow\IP?_2uj3lzXЮ4EeV Z-tR)|֙PIn\Wgu2kΕo%/I:䭑+=N K^>4C2+咗DaA21(qPn(0| \%#g7N!^s:JZTI;$F7O ځ`S+W/A!剂VZ;sUbF2}c%'4fl4xՂIV ̯4?aVrbVTݹ| g.dsg{Q((v ,.r5bn }U/WxKݹA??DXH`O![۞BYލO!Z\M?CVMtU;A d QW`kƕlHQ:J𥉛/CgY~h&(6)j -j _~'Nψ=h:qwTJְc3 e{ ڷUEdUc4 QKKlVLgJ \]$}vWN ~D/+y9m#"v=|k/tsvl߷ ܋< /p>.n_YkVŤ w"{Sj3 q3 D:$>.5n82Sh543>)nZCvnYa \+99Ԟ0hQR*߼3t vOkFX9=oZEÇGRj?˕0@OJ{֍;AT_C Niqx%a%ƽ߹R~{{QKoowƽ߾{=.j`ׅukكpᤒ n5rVrlcG;yg;xwxwNG1|힂EQ%V-/l2#u U4 ϫȜRuwz_>a mӺylÍjD_o3x|L6dl<53xw<,|;t|&O>|&O>'N>'ɓ|?)ͮ(7>&{/C[B*8|?cǏY.+W$K>}D4 gD͕6|ȻZ/ |m{qﯷo{{}~?[?[ʟ~6ZgK?[r)X cqX߁4@w lA߁<6}A糖՚ajJ&V?@}#jAH'M-i(WJ}~?|?`>?@LLRbv3fl,P~_u.3bez/҂lMjϒ; _lY=l[@(c3{~9+C*_jGXolxSxƛ[卷nUxxƛ捷]x'÷B?esj[=4_KndpF DڧuT#~֊S*?\ò)WPfhՐMZ|PT+jdl6]4J~f.sO޾ =u6ؑSo7:[+2 iԀ?ށ0x L4LNKI0x ʼn 6?="#~֍HقȮ !UrC>3q"SjWWʻ(]I*T^Iw%Yy%2ޕ.^In_`YY /Z0 o$gUf^K=DZJ_s?l z:7Nc`;#,!3",;"EAg{0=3 PVC3=`Ԁ)*ΌG'4iSA{(:p  2gN>|p/6EhK0әHK,Qy/B'-ƻBK{{/B&h'B@9r ]T7Mw  R|~P~.~Pha|m?(m?l~[G @Rq{c ?!ym?n-_ǏXRneIb) z`:={P=Rm(wGX/חۑ}0.+/1ET; w #w细7^ôw |5|a>ԘD91gwQ|Zɧg򱄼>(M>OG&4H|_9a֫rzW~^\H9S {~ v n >bX,i[m6]N{0=ɜ)udB |;>/[f{-s;>/[f{-ҹwd/!n6غ'`߶>//|bϕvrA_6/W5Z}w%퇏|퇏/ڻj퇏|퇏^7tC2wÇ8t-C0JwvU)![d܏,*[le:K7ʈ}h{K  F0|aI>zzq?Ž_>{wwnz5z5z7ͣwUGG]5a~^Uޏ;nǫebb|UqB/-_/}VTvV{9hATvV{xJ^4z;z;ޟ;A?rЪvڿFA:9p+vZojdx͟Vu| _(U\֍H8. ٌiAVܿBfBMdW[AFjT2xAGOHqUlHhB┽^z^\g/^\g/^/g0Ͻ.uQ~]hM[@3be{ W%]QZTJRz{׏뷽~Ž{┽>z>tg/^\g/^/g;; w`}}XXw`w`w`^Wda/^\g/N׋^~{qvVCIiP7'DaFk+Z7Rh5O)]6O']DhD&?M_^/Nȋk8yًℼًNjk8a/N/a7#딘11\.l"fFm#%ȘR#Z %ᅤ~? ÷J) <`>F2ύQB|-x2١M ȗYeVz|պJ./ˬeVeVz\f%cVh֥?׫b]ݰ:/4;Y= ZO?LЊ~D;nWHD A#nՃ@8lq #d_*ͮϔmy)x7_6lcG1}٘^6_6Kژ^6ccUVJ/3"';7 ¡r_|)uds=^M~S÷葿D͢cr7Zmys<]t-׎Iԍ2=;#0&aSIن _g;kŸZJ%eGa{qK_dDh=ψ;3sAZx[h54çR9oٮ~ID.RY$-?6j|ӛjVCS<ԀyH:Ll 攫kSy2١%sEeD)ۨPdd;n4$;t8p)NīOC_ A޺O:tD2=AH$GXcG~? s4_hG9n0֍YhοQ{H5ᣵ!.`M7(Q#\;B&M牑*YBkVT:=%6.iYmQ|-a5+7!l}2ç!q*TX~2/uMCbIv򎘆ĩPDfLC$tE " 4^xM14ơ&r੧TJi 5_nxTTwηQG$Wh54#tF~K]X+%]_p^P=oI,Vx#d20 ^ƝrGs.牘;?{*tl':]dz=ˑ3 ލv^TlШFwTUhTUxT -ϨFE+4*Z}\?Of(VhPr>? yAKϓjzTBAd.V|dZ9źx&Ӈ ١I!2PDdWv^Gvj>Df]Zx2\#yA̿'Ooռdz#٤3DC=CЁICCA`R!2x4"{iwݙfYłlVp\۟F -۷rgZ!;0#Er#LF"3ہ t6^]l?]t^ap^o{~Zd+N+>l~#7{K;xX+ψͻJjMX9ƍ۶Z<ᄬ3Lqhl ^PǓm%ه"E#d.|_!cnp_nHQMi7DRI AՅ;5}Y{-+u%"낏}NW뜯{[] ~M- ~~]* a dbSOʓO.zFjO-C)/~SjJOy%֌*ڏn߻RCs;ܓN= wI]OdZniO|ut?:Mٍϱλdueܷ.ѭ*l!S~O}F.nXTcdێ]-SM.\N Qk|k|k|ѯQѿǸGG1O7X=)8n'ѨedzKӝCy=ST貳d.  W;^@޺ {&Q)_Ɏֆ+)Cρ&.()}[xjIs`(;6EYNO5}%Aȃ~ VCb맨qrMѱ4WGWO7ͬhY4ubdФYJZ2!z" wKCv Z‹' z˃{Ɓvʽ:=`*zJ" ,ƒP&:tиhG^K[ }RI9׺H-] j_$W)ѺGK%|;Ԗhm#\֍5ᏓPl"*V,T- F>ť:|K$dێDS]+F|Y(5Z,HقIy,H [ZP# ,h/ ա^:KdGԣC%ΏG:T֡~`[slt~Lm HoHR9IFqeC[R)>uO0 @2Ѥç* ݷeٙm{|Ձͨ`FߘQ̨f~kFG3jlFیƫøtKv0.ƫ`0^&0X:Lې\w”,+ψкPiw%62MQ].0N$dF+Z+?Yl;X"= "n~"%6QdL ІR;G9"ǤБR5=qwG.[j]GlIG7ۊ|xH5"K6?h7V_l<Ƴ_Yl8,/Jonݮp NJ3|,n6{ԙ&Pfig.4x?7BAֆSҽn |jkBuå}Huu,/2! uX %t㗮 3BxYfChΔJO!%aqZl eAh?(]C6i%Kh/~FѵKO>FwKͨeҪShH.!2]J[j2$?V.6Vs--&%J^q][^>POf8*r/o&N ̔B녓#Iܲu~3ZI8lV]j|X'wZ/H6?7VorOs$ 0raψv}w,-/-T#Jeub;+%Dm?8oKl%||" ݃{ ~ҙ|x6xfٯl6Ƴ_Q6Ƴx啞-DI7?#M>GIR jhJ)5ޗ{_}mˏ/v/h@&;5˾ A_%?L>J}ޗʽo rʽ/T}ׯ޷38y`>9y4Z؃y|^G<ϳʗϳ 2_ ï + 37.V㥘\KޥRL,h)vRLx)۳^FKվb&/zmA -ZՇψ؁L!Ո?!i+ 5xO–@hQ9|F1“4} >||} ~AÇc!}d>k|>D3@@;MID^:E'$L j1!ЪGՐjD_t%a땖@l^&_i Q)JKhp|!7TOWZBjhGX :Ǚ5ì @2'8بPafX:C ˿ebQ߃d*ld_ܳfSf5k6]lfųtlx6]3KK1Xb4Yœ;RLx)ߥRlRl}/Ŭix"MxFhÛMۄSCMA4ț^˛@^8{zt5r*Y:aRw-V#! ;Du&;D:D~"ahCw)o]Ƴxk<.n^"0|irVue/ QԄ쥬 V ~ē2/C#_?.JN'ν?_v󂯞o%a%l--8-8)/'T_h NmY65ڂ[uu:xY< ^w/__x;>=eְe%;ZO4 *7rd% =,KƆ=kkgx_=/>_=>_=/ڍ>_}}v{' =V@O@MZym:xm< !|̾ >:;5*k5gR[;_GXo¹΄:_*4h.VbuѬ*z&f67`Fܼo#w6z6j4,|bc^lTh0]Nl휺|]1&aGau8ڤ'8]1AjgD͜XT^ujhGX L(ى!QCaA( f(|zψJaVAO R!|K%1>$a_ emF/2F~i6.O{ؒ*e6l`|[`z*<&k1ۈWpCI\mF=Z`ҡ:Kqоtҡ:4֡a|Cڷ㙃d4i㚃6 sP4Am\b|1Y6(&A2h= T=#EiL|fcz: vT?ДgX|7Ɓ?òRs=Zϵ43APS{ߖ.)_/P{?2rG*/SNj_:!̛L#w6-;W#磠((~? uGo(~PGA? ? %Ab4/P??B[%SkK4+gf?iKEZ]H'}J.cf!Y4M>zÿ@[a@ၰy 3Z <{ ܩs*9wK 9w]ɹ8w]ɹBǹk;UrT箟6پ=۷mؾ]&7`dpۈVC>xZ#gx >52'9#x-S_dylT꟣dBbU js's5f eyµB$,gĐ;.uioq$3ۃ R[&w6/K]^?͝h; 'K1-GQZ^tSV1|5  :@g BaV>aV@ i J֯PەhϢS-[[}9³l0G,x^-֎$ӭ)ts}Wuhu".Gn`Sjch54SՔ"WI^P.!!t _g {KQX֑R>sxRM>zÿm?}^#0ߏ@lGzm?#P2 ݸfoO½h} )8l@~ b -O𗧗v!kzg~c}kyJG#Oi+ * Gqa[HGz⁚|?6i<`<"gQcEZA|֓(  U]X!ՈߢAyc ζ(b/-> g-U%) 64#'[J߽OxQ2>z}uzÿeôVsER~&;ޙ>$R~__b_ٯد_-atK_Wp⾿XK\i1/oSxlTZzA,Oޑ{Vk-3bglAlT%:5̺={5 ;a%_`['VקW?whu0?l=+?%7Ӌ3dEA''nR9 F8Ucm):S,wJ<6%_i+3J"jNy2<6b+\-ہkq ٤)Nءfeܿv&a:c(x ЀXҨlI,! ~ZT$%YEOaI0ÒF%Kے|OW>\ Y5[5Z!N:g;<"qRwTI8bϋHmi1ͣ]/x^UWpGJ%J+n8Em:KJ$lY 󽐀  MPgԀ//|a兿0|y _ _^|T!̡J6t9 /*^!)-6^CZ@)֐3+dA5ԆPMPPe#P[TCm{ *t}x h38 s`.8 {Ӡ]Ӡ=ihq&a.rr鮓xNE*DA( ,-ӷirvZ|lE5 ៪9ò4;pZHlmVP&4Q]é˪F W͔:׼j"l݁BC x ϫ.5%)ԑ =G:(_c'[a_`Ju`Hu'D: ,fƩ|Qm&ϔJ?_A|oԋ*##wmR[&u |iRN$tdoS b#]S{'ZW|Aï|w[l5AUNj+$ !3K_!z_!4^s bc6q !VOP}b`bVi)+%Z M (|Cɦ3|IMA𱃮'(_D4qzoRɳw/0&e+AQXb ^{%ZO¤ڿ*^ag FO|k]h "#>Z >\qW/b%> ( Xz5t31t؆|1tA]kiJ UK։m Cm`ĂiĦӪ'; `xkJu"-Z K@+|Ks2z!5Z]ޝreFZ+IdpyoH4C2(| ԰M4ƀݾNBV[[3H[T|͗}+Z MwGhT7ډ^(#cΛt*Tٮ~/+_#.BŎփ2aaHD,;A( {f~~lW;'\>:?Q`np`%&|&p& "XzOq|#ϯ=-lHhF#!OdnV.PvDb #6TTc { R;DLj5 i?J]$$FH5֎kXߡsX첾F\!vq092VvG|B;Tۑ'2ng{5~4j@"iɬNPB2FR ~Fb11w/z=@26p ,ToWl9wJ)ٞw4wvJ%=xc W0F[*ȯDϢpFI-Y;~2]gcE? ((uxs]m|'ԚkˍEOo`Fc`’"ZghinwC N>z"~6gp36qKmn ͽ+ox{Ǐ?wO q1)$>{hUw]\jkϯ!,BXd+Z~ɍ3=Oeim)M{@5~u zz-JSZg'a%琍8)m +Z/.wK /qGtwvJe/C`r_a3aŋoBo+c]-7|f5;G3# _G*"KɌK4m݄ ;Wd*~\Urv 0-jvT %5>`->;i1j@ͥ~ijDo=eX {qfj ͕|F4\k\Q3ӕ?OT%+?s Xjf*VRUOv߲RTA9KJ-9-;KL>Js>i# IWscUI{0DnIK0:II>z_ ~O ~B騹T?֥)`>H K_2>:6gyx[׽qOI>JxzYu`J6'ߣqCԀo'<ȑjD_ڑ.9a$Cw6-"d#Z ~g]Z~r5!Ո;s+?gg[7cYuA[F bffuݳ0.#d8N 桻ޡ;x.ࡻޡy.{Qc3vNY3Y1W&"a]KdjDhZЈ*zgj66[Q7w*MJx_B*8֎ATÊ6 ]]$oЍӖy0$a%rW}}{_{_W}׷+rwφM45휒텆n/еk>t*еjZhjTF@zjǞM fjޓψ'灈g=vBR=Z;H^o{=_ ~oo7Z{qޟXb'fӓ)Ϛ ~s#ώ|!ՈЀ^uqB+DWGz\/$28Q.@0:SjK퐆G޽?g?Id:ݥr XS*Od9Ma-+`=dl9lW:JViv:h5;tH3~ww]<~;~ww]<~=Gf)Y'P,f{)i%jAy55D>_ڐjD:<1|=]׶Cn Xp<=ZpK p<'(ݏ7#!Ոu -)|bEYy#ZgګYg`#Ryb.q#,/Ybv[ A& V=SdUaԗa˯9tb<V/|-|2|}o|+Sr޷0vo컙J>핕: n:[ FuqԀoߢO8Dq'¢{<%Z8p#iԀos:lߑD;g;#|W5Yt%d@:<{ԚC|[H5{i-+bV ǺEDѪؖr J5L'!Ո5 Q+_/db07|ϛ_f6unE(CݖK .έe,ؒ|;L=d5l>FW2NJV={˃K v9yRh~:n7gjSӓ8~S@FY?\ JK}ћP?P @ih‰X.q@$w(#|yArB\cGk ތV//c=^pY֖^j)̿2KS/d.lqV2^{2~$'σe'v"_ lѪg_qR}%'D)D:OO7"Q*19pw9| W:g=Vh4BܢXJ%&|8תּ.vw5R:k_l|-z=S{gA ]ˊSjzEh+XdOL)aɬ ;э8ɧ@vVMB[#|<}Kj/<v E(k|vijXBֳu># o6ؽl6 +IH͛ XtG|5sQ֋4-ܴAfihk,%h(YR]SSjhGX zoe9fkiEI>^o|,A F|FJu [=# 9PpXK/UWE V@8ݢL͔ 1W~{7+o/o/zMVXȨXa!y+;GE8u覌s]'v8Qw" ^PJVӦSHO$٤'bUڲeFުXدD{VziE 8\Oց0%7Vorg.dxq/rCԀ#|B L>zԎ~;*Pv-I%VgVfVC#O`WW4W4' /9dzHF\=]U<+p3~уpk/ *2᫦.5Igvcݓo#7߶OqDO>zç-0>gK¿e#PCz љ|dƃ}[˯*%Uu@۪KgDt-7SdfO>l,C/KaO>7}_~yJ. 7۾͘GX_/U;/CWե2|eF^ǍO^82E$Zq.-.O^.-7?f讳ksͲNf 0*^VN:c# (rkDh0-*RC `U,lp|Z?D x~YoA~77F&# )wϦur9m| v2ZXUBE@g뭔} ;2)o"װx0YfTɽJ7' cA ,H/ ׂ-H؂ lA_cAuQ JjwY/,lĤɂv% ˂x5}44;<F;\Z;<N];w>7?hN=x+MY=\9y㵵.:GXޯo=< 5zm.{?wgxogh[zS}}m_m__W}aiʶ_o%xwnZ^g[ց"Gk+DRhQs1^9Ŗ^ _DLzR0| %u8jÏBc|At,:|Jl|Al)N:5"ʟtJ)䷑7}Okjy]Ӎҝt]S >#)l?+yt]SI>J;.g(AbM_<c|QlvD#€$2ơ-הċFNp Z>A. R3ZE&)5[$o;7w?2𛻟-@v?yp܁!#7-;%.fܑn :g/ۑF FjGIȕs>)[~Wr)6B.W#ȷz$ǣa0Fq46j"т.l\ w~<ւD1F:pR*7w˩N?)pצ\Dzmx,_]C ْqI@R*?ׯZ^]-kW3|@uB'#wM"Bl X34iְI|tЪT#>Zz޽߽n-OՒ>GmXْF{zqkT#>ZEMRj/[G-#oS%*پ_[߯|/7Q+G%?:G%IS} 8(PCc![b$žMEaXtmBH\ze%@OV m>&e"d҄"xwyJ&Mwn ZI>;| <͔:rRwڒoAuPvu®uuPv]vΣ/sj3[j Ԓ6rz#K|˹@O[CuĘ "1&tQ̔&M I>šo19J_[\U@0߫| FK|2S*%Vw+K)_s{Yϝ|͝sg/4w̝NsgN-4wj;QGa8ui`,ҠˣһKH%|4^JW>2Vp֯/6EF|@|_:N𝏰QFއ`=nO$k}ݥ޽ס٨'Xo$\Ax:Cw ?\+1R:Xe|~-# ~~cO% 0| 8l ;{m& pmd)T:ݚR&=g7"º f eQD"4lG/[G~-#9,NJ~ .}>%糗R`sHiֻ 9P݂9:_}_z_^BWH5OAGX(QÌmv܁՝ ZHB`E[!؈aF@`*R`3ZfЦymm >?AiA7Q[hʍ 0 2AM*~%ZxXzg&|=raC4@;wߡӾCm}_{8G"l {`hNf1<R'Ӕ-G\3)zT5A0g rT#~d_J?T<>ꙘtTvCN'3f~b&$wQe܏.5xKȫ.[b]X5FȾtY~T-dl.]WReܷ.aҥv;..K ]XTx&o^ʭ/](^L]N= bv{BQ]DwYJ2p,md~%'?bkH7R vYk'PZFN:N(R1P@h2ߏM.HO(-|Hp>XRVQI @ 2˒:dGhꇭJC;as ?*YrU$Qbg|BOe[,Ib 'a)e𫗞ǽ煀Sڹ.bBjG@9\ԔznrS.:5zsHYz_qc_ip/9Y btp\#BR)~ah ۚċ vbɦ yjO׶^`5ԓ)12?Q@@`Tqߵ >%=Hji43^quqzmyk v¥2řVH H=ցtV>,~i|_m7|__5/)By } RoU޼R7޸I_xhQz ߽'G8p: ~{=@f"5p7?&a% _@U*ݝ% A}ȭ#dDFQuye,GX E"榝wW<CqsN9řR|[ەȞ Ae]N"\y$|4 |w/ ~z om,FҏRCًa-^ ?W5+?^ڎKZƝ-*c{cƃu )C_u¥NM8nۃӻy̗levQ| NUH|;˹|p+{oOޗw ޗw+p_iغ|S@[[A2w.5[|-&GVC=WM 6%1_g(Gx6g6eѯ(v_oF.Fl4h5u<-lM_u¿ƚ-OޯZ޽/PUz_˻+~+|zL÷4i.w^𧧹\qK- Ԟ)#2G?o6xxԷT6eoil<~]B …Fp!mpQ(\h5 Z.57 … Voh=\0 Y]fG 7f<R{dv/ْ̫7 ##>Z Vaʡj85boꝉJ-N?R.تy,J? #V+@8ƒi_uFGm7 s"}縂D>Gy'>? {֖|/ڮޯ(7VLGVtx Rx-Q];뷖RgsQÖ֗Y: ˥2씯ΩƊVC3R[K{{rwcOzٓn p"tRىa |fJD+Z t'zK a(=&S>| \ t_-IY%agxh<Ƴgkgkgk?[?[?[ٚٚ~NV4{ vO >= O-WJaGD.5Yh/ՊX. <˥=`RG GYȖ|o9 sFT >wP૟U#7u,lKz_E/tngd<%֬ƃb-m<&xԮTC+’ڸgyq.3։R}Y̊YފYt56ESx(rc%'ԀfO\DaRk7qE, kEy!jh"z|q3Gl RtAu4=-;pMMŁ_V֦%86ʽMӿBm/ÿ?ؿHmԀoa8SQr(PRNpkxEm|kpD2J^`[*zzfH_p7U ?Z zjZ*5d:(멕gA >Z}DWC +1G—?¯ny4<[YVcXX7!D{;Nשʗ!w;:-DAjx+@A_JxrGB՞U.( ꭆ| rAi|υjD(Тq>Jˌ,qQ 3a3R2]Ɍv}ѮlF"(fȌz%3kF 1 ~Vp7Fi .*0o_$]+dm ~`(gM8߳FWXoЧW6 ih | o-2 TɱXRm:פR }4Df*Thn(ש Ω4gNO 6gE*"7LJiL(x' ^얎Iw˸/]!SXY^aya@+~1v<$Ax2 k|3@2i` xJ0]j?SL[9 ؖj|^n29$剕|yh7T{Zls3PˌՀuoAXZҦUAeED'".3ficTz ^%yDhUk4,L3VHéK+u]+${U1FS#Z#lo&]^zvP?zԃՠXUWɫXВ|J@K \mvo)/KWa%Ax>_*.uUWB٣Xԕ5PTң$u*S/28\B^er0Xy\=KKe6n Vz,f]~~R7yIIb]ujE2nuAr~/&]Gy/]Gq2/]Gy2.]G}2/]u)OKឭ)֥Dn0I^r`KwrG2֮FްAbC ^^eF3yjך{oX,Bv8AIbUzïv- \.Tj\>FH5ő|N$|+XMd;*ho';:5% 6#yk,Ip w% 2n,ozP<4D c{k;y=(.58ϭ:L+0T?ehM "P:/(MZ o|(R$ځTHS!:ɩQtaWu?9" >ƃE,s F5Z k·h?[Bk|KU;YϏ)9i~Dl#5\ eCfF$elRBIdUˑ$ gFh5yE]*)^"rT#HoHՇ3eJig!|_xD jhV]j*mWH5"h8{L( RhǶ,-[w*Thn(ש+ZTvl)\e p%L/WW**mq taD rXڗԀ?ڗEAאjD_z䵯R ,/_c}/2 ~Hs >;b`yѶ4!?L>Jx&bolrG9Vߋz~VL mza=v, $Zښi<7fve[;+y·/yyU> H}> -E0|Y~`^q>j]h\B%R_% ~nGX߽mQ!mQoy~S"E^_z鍕5Wbʹ_][[mZԀoW]WWA8|jhJ|uS*/7$:|CMA0! @K! dZq}CRu")|C3|r"ʼn81>)NZ)Rs=)NFDY8)[J2U~g#AyW()rЕD=z4o+` 2~g7;ᅡ/'/bT9jbg'c-Auz~c{>nx\p 3@H^CUB _=p%aJ1m2_qof7o;7h[)mv} *_54ou_dIPSp?ŕ| |l_  ~[_6/+{5Ɲ/*I֘yZg̃wrJg=+;xN=tCwxНwԐjD_:w+2{9ImY%a%Ѓ[wFxh$@qb~KrHNF}{J 6̖cϰy0@`}̺[Jm&j!KJR_⹄xZ8xvbzu ~\EWFR§۩__KF#|\M3ZGJm|5UK:|ω fP_ȝc D̄>Xଠ В >Z5]}!ۯl¶/dlB`VEm`v[+#v""y)Q};+?)s$v΋HDWo}84SSjڢtx)\G /\h| j0,L¥,E!ְʽ?#zU bƱXԳԞYM?z;ibQhj蚉}԰;4o//R .S/PJuGH?im۸HxKl6j"ZgvPhV:rl6x=Z.OF{-&lVC!E}8*aKe~cQ;b*p'a%koZ#W0o3¤FGX/uY &Uu_hN 5 :pڟTR4B^}'3:xZW Z*DV"i΢Ԓ c/Ki~&SmI, -]zkX^^Ԍ YҺ{[)ʽ0T+? ~Y/:!|C@0|#ȝ|wAu&Vr\9:Hw7^Ez_YQl+!VTlFȊSր_9Sb_T}id_Cc^OueL^PEt^l"n6. Ot/rkK{BN| .VN1_-]ړ\[{~\[Jْ2 KX$WEu x f)_!^RUDi ]{H@ # :htEO=g˸IB@?S9V\,Z .To9öT7dX/%g ) J:Dz(:7~GV|DV|)"+ ?5;J? GdNl<ʽ߸ۻ~7lu{,`$I0.6ͲR|[25J ]%N ު]]7!;sn/8E.M5 OCӐӐ4$iHxZ< {R!NCǏKIK*d%mI.ӳXRC7mIEw M_S%X%/(͖T$F,hlؒH%F$cTɹ8hQhǠvuLHn1|/tG$MtyN VH9%t{+F$-L*))Rk/aIGXom(~h}) niC1f\1S~66|+#F=0Q|FԀoY'AuX7 {Pk0Fz j jރ^ZZ ɹˠV'FʁY@?a|x@;h54 GJJ%'`'}sa'E*xt^P,:) PB/Ŏsreъ`kj(l o.58^2T#Bo=.ܣFeluI#e%k}^%SnWq "ɦ ;5qŹlIOݤOk k>u>uSgwS7S'>u?:rR& ,|FԀuH6XhH5{3>J-ڞ'<257?Ee,*CPF?(שg<H~,eN"; x/ܤ)z`- @["WԊF2qRR,gTc7WS6k[<\  ~WRL/lZ|S7oM7M@XliLc_KVټdUZKv* 撵mZZZh܊xΙR%ҒU6-Ye9͓E,` _=֨&5[8BF|os)7~-CO/e?r= >o?bR Vh%45X aj|W>|\ Pvwo> ~okQy,+  `1|H~|kM;<(9XRjʍ5]}[\ɾf_U"'ʞN w"[7O^̯=8WX}#\-Οav8Sחc17l?WM_cM ˳ʳ.hZ &@\8كi˱R u"GR 1|=yCWmFwÃ5C*EzXqc- ?nB%jhaUHoO4CeI۳ZU󖲍"EHwPʅYmnNk BRMRC771`DPRoS^&M>e2M>bK#KJ|jC4 _y-7Q~LzV)KeߢV55+?qi3nz z|H߽| ԀJ'{[3`O>baj:7 ~%> ['b0ՔJ-ҏK4}f?U΅9V ]*Ï'C9{4+?7?iOi';rM {~"ePϐjSj17|Q0S >b |( `QBGySS*_$]>GW@,.?Cp_]eG]͎VC3}W)Iӏ(Q&B20L;*0:2|[<+'m; (ݲh`\>`y$cH9 OQ PDbkJ nW&jg[UKA9U7* 4>0̿5"Do ] + ]ž?yZdVM:ED;pEP%٤LN&`߬Z &@̬Tq 빗)5ɚ5_~fO~*v_(W1_.z5})W /F=ObF(Vףb!QF÷&'&=;I&5kRsMjU'kRuM ]BGkRY,V C.Y,3#HLoPîSji ypo׫*\lS7hWJ@U@fe=U*!.e-օe-e\z2HJoԥKI%y/ܤK=hв By1:|>sz=|N32yG#>Kd;x<َdO'lM6o̔zO'N=>nl'Sg{g=?u}M j_LP㚠ש{Z5 j}&}MP{tyb66fج۬dZo6ffuE/ݢ460g^5DC<(^[ nF|o54󅔔7B?8|Tb q!#@DB*y>.ӕcsl2Ǵl{;*h7Tn';oGvnK%y/ܤ|&(&ԝ]ĥKNP=A5AT^IsnxۼgA5y]I{=`/پ5 uDE. nؑkrv-UnϏF/1}O F=ZN*ԀoiDwysv]I]zuJDw'Σ{6vZ^lQ|*Uo+vΉ| Gs\)[F8OjJ |8ׇWpN_Áސz8ćχ3|l$}3@5<府z꡵[|Q9ɍg|"F 3hXoZ;p;Pv.vvv8ؾv9 P,ҌZs<@|Freλ|^+Ldd&P۩csl=؀)6BRl7 ؀ ljEe( *mP\_]}d**|U@͕]Y%D& [;>L*LpԞ"?hX ~m c6Zkmz^ѫVhC꽍ѭ66y/6wPN n(û \C%T'7dkh5 5??_[BMk>ļ>_ Ђk;ZJYVCKiѷ/f/f/f}1}1}1 4Ŵ/nz\v$ȿ Q9:2+#K >zϓp]߮|CII rrC®nEޯBU( yůBUUůBޯBU @)1v@< NTZ*-X Ψ+V~fօ|7J}\ uBxm\8sxɥ6$w=6~^c%2S7C#+nqKR+%c%={<{e[4g᡼C<Z[=uYq8M4qY҈օ4pJ_o7&o7}v{rĽ? X=6/s+ ]ࣾ/ded2|o54IX |}،U="glvI=_=3XH?csgO;C>y|g'Sbc<6vOpMmmm>hsmm?h>hsm?h?h?hAl?lo\4 ¼+ G 7 4X/Y_?3cjڟܿJڟZl̴g?gĆr} 8^(q~NU޶D,7rhUv'^pm aH*OW ;[/i Hr=_k#̳E" {$;@TGb͜R`y{1֏6VٌFc3mF/3j#WOHtCkQ/з]cc}鯮]n(ɡpiFə;)&gh54)6_fVvh 4;Œ(QӀI`hu3RJ T'UIU?&U&ULʓIU_IUyR_LZX #rϩzˈs<[_ӭ9;|;6v%i׏y 'jO"|VUB v1lRĬ-#Vu*4پ|ucfC-Z=NbD;ש±~$eu=';u1:%y7jX"`m`Vqevܻ&r,]mD(>Jkd9YKLv@H:퀤v@Pv@v@`z@<=T/{~JW;z_3)5p%OU˩PaD{;9mש\cc#Yh=4<IJ0,3۰fx I3%y纜 M$ہ+6 Xx.zN.+۹o*cCCF+@3L9 %=$қ1T)V(L\*i 6SjόLX #gky*| G|5rDA>ƚς[k|DBd F >4̔g;c1L?pvfD"xP̴S){c`wq,eJiA0b5@d@n}^/3<3+9tq>. 2;奻HEw_ "rVMHRFB[VZ»= | (=@k \n:3+LC2Mi '^ R񣲟,'e9HL Kփ|Jl _:'d[klg5| 3|ͫ7k!S32ɨ>rQKFD?_<iMR VO9 VB\5U@dq.=Ë^" 52rR*#gPpzz#X_o]xbR* ' ?an珌xYP IR4`X4?++ؼY 9uXk|ٱ>6͔:x#5Z JI[z5^@+V؈:xEY R*,fu\hiWi%J//i4twAw`W++?n3d+zG^El޷O@ J<vf|ݏ$z{Rq| 7?R~) Rtۗ3:.Sj+YvQvK: uw jXVu~WJ%ٳ=.?g=| ٳrlٳ|xoxO{O?Oci_Rc=a(4 Gr[[C҂X KK%ȎօH2oo /~ 1 3ot,;Z.˃+fhmS f`Xu3 jhˮOZ)!?lLXD݂aҐ.W~iV '+kSZ s Z۩ >5zfG3EoigP+^MM4V<gРqlK}R)5uǯ[C) JkJMpc%pjh n >+vx0,uԞ?yv1 (Y,  ÷V4>#L*;5>Y~zݛ{zzc,UAjx@mp0z_ѳ!Ո?=RYV҇w['|yOѝ Z? (:HR_A3Z w9[:4+v?cqaR%'Hcsfs;|9r;1@%C Vt9DhZ| ~$9I5:C=7k~~{JbRt-"6j| fY2_ ~|A-Gʵ#/0,Ke{؁L#k 5Bqf!)5ۚ2gOi`O6hP6Rh)\j?_iFCWBPp\0K1Vl<=Ꝙ( >Zb]si˱Re<#Zzÿgl663xx&`olSW`j.!6| 4~_/` /`_ "OU5"a+.^8"A7e{'qh]WBR*8=) {XESL]V%:|TWY. [X V/r#| zl=53>I1~,w.g*yDÍT/FBl<ׇ%+7]^ю!2P^#>w]紧eTT| S f4h<8r ~Og/y xx*-T6K_ ?^k"5]ÚgךZFk^k˛5KHVKpTx hwQfK&6B"Rk%C+N;{C>c 'RùXo# /EzΞpo@˲ 2NsaHSoE1 g&Oi= ?=@ݜ<` h]7׍Gi]( <ޯ1Z/l\V`/yfH5yc׻0ddwG)pRj,w4 _N~f?۫g19ۈ+MՓ(g}i1{VͳL324bArh)tS(SyfYggg<<<晼555y{0yѰx0ߋ΋ɋ^4L^4t^4aaa~ V v ˵ˆTh0FsNlD谣uy9c_:<\]ȈP`zЪ]Sj˿橮5+(T.1Kt>bw#c#P1*[ww;F}ww1;F~wkznph7پDMІ.W4P=Kl5߈򈸞K2BV?29Y) #@ RƔ8hݸ %|6yJ\?g2Q^3 6~=* ˸!=QDi#?:_ >z/?mNiS$1bϦZZO%|+7G:\z VA|>đIR%AFhX//lZ7tX/\* _~v,{Gp7 J% S!~d],X/}d0{?WmW{ ꔗ0cXڤypg0CO{k;bf2Yh54X z{qw/޽u;'^sx+j@=p_WAJv?NIr/ׄo+lZ8 aqn#h;א5vv74֍̸TR*<VK- V>#yI+RjͤÂ$+k _ __o+_ߙɈ)kZb f 纲r` к=*po NU\tGW&/.Y.^YXUz5w$)%k·/|vcy/x|fg3 O>B]N1BO-ɧ7;ï/0~%0~e ؇גN`c*Dښ%AdG<ꮔ lZS*dW(پ z0㼯ٓԚw?ѺJ|>U-=Nnp]IĩP`E1XAԔ(Q_^_~_ ֻ(tHڠȵ5NhC;7|FFJO]&|۾iv"f?#KP+tށ| &ߡ"UJyNPuZ1z4kW?K n/+@7|e7X JCRZ{ YJ9xVj7,ULi)5=xITZN]_>GjpC7^1|c+&3C27 Ke+s5SjgcX/Fc1 >\)@~0[\xqkY6F51K~V)H P::DN^$&+Lihw\QK%cE6&qFQbwZnJ1P-=]&~mޟi?Sm٢Mpʹ3W YuR[\>>c#+²+ɰ E9anu,'(W<۳r^';O1x hw\ ١YQ=n]K77)* ҥZ)rۓ^}ΨөKF^I+rzTם[:Ue]N.#ۛb~X !;tY绾k:SQˎvEVFnx" 8BWl߻\HD#^by=B y‡UDRI^ 8izzhw\ͺ؂u)ï W;czY1z$S/؞'/ ,KG2Iv;kG2 7r#{zI-X2 Mf|""|\ih9GJ% D҆W9nEkCV\YJee!Ո 4X pA8HpD(BKJpR>z?@O>߹~PN7Fܽ&|5ϊ?4+(Vlc,в},Pug}VF+^g{+ @)5-G6yU>ƷSw(BA}nW) S|Δ:X)\:A{-CGqС C/o* oti=a‹xl(@uFkӐ=iHi!P,yVLCᔗ M4! ʦ.7F̂K+| 48}Zȭ˂NXYZYE'G| f:rRb'RjUtomR*VpLI?#U/PBDtZ;'V#="{A@M#{ex+dJ_r-*gQ!͝Gsf^T/*{Q!XXEŲҠy|>E]GV+YAwZ ̤jEI{3@qD #߆Ked:䆨4@DEc|~(BMdool766?[s: 9O9'pDҧSs;yJ?~N'%(eOJ 7bnF#C;u)u^vēɗQ${pnbܗ.r"IYv7Jn/1ӕly,Ҥ#?cߎryQpoBoשd31"ٝ~l%v,-\,\..| bvvr\V1V/Q!<*\B>b_BQ!Q!רר8BQ!Qc_Fz(N.'k:ED<~Aėn!;_N 7R<~/KR+w}eW~/⽜|cț3~QA=!Z _T+E4cwJ EBq*BҴ%Z;8O{0zd/|,Le*UUʽSgVH5hvJ 6NW<ռ LJH|d|u<4sjv7&?#jAPWnf!IH ihvJe!ܮEi1A|oGXw npZ Cf3E6LxwJlgˬfS-27oR.QQA$tyJuT4x}GwN.=O:Uq<Ȕe})WwdY[93 lOț;b]ݰ)'ó nqtHe:ESZ|*Vz)ujQ]sI]f6uA~"$;tUzyRr^o.<5 ]F[Nd.{ʞ9 ˓w^Xk\.'' s =XAbd- (oc_ˬeVrռj]f>f.YYeV2 uyz8)֥qdK^d5GG6IPR}2[.i)b?BN,N'#cot\/uz nWR\Q*W.+H˲R 4%V)ᷬ3}kx|Y$ >Z.-o;|+F0|k Zo%"_s_|E+"\_}}Ey"r}E_9H:8OPmw=x^8lyM68mvG8CHv袮~=ak_-uunX:'ïW*w*ptmL/1lL?6ecz٘^61=5t ʑ~̃ˠT2Cv D v]bX@`<ԥ䞼NU>B`bu^.LxL2@w) 9cH-^-"u"Jx~  =w;`J/]6T8O=,S2kbUH}#aSlMF]L{u{lLު(kPVCY y+! @Xa{;]ũKìͺHMvK;.<%١K='r'3L}hs;NUv'Qm껆GQKvU|$uҺ?';xT <)=eźq$z/#r^$uy|efPn=E~/{˒{Al&*c3v+igN ēTp}dv+d_E9UdD'h4Oߠm;po7[\"`}uwLF#{PMjy(PzhDqŵZMq\DJAŃe|W$)_E*S*\Z5bOz-,&YRQ*H#EI62Hd{cV ߸ HN]p|e7"lG$&5D5D5Dgkkii!2!Ү!~1D `Qw4mj(Q%sJX|OjiVС)W!$iVw*Th~P:/(MZ<>(\-XtlBt{%٬<^ 7;;3uv:f٬h^N_ep.˸tY.Kt.˸t.˺t.XҦEcdΐWgX)^P&;t*[2F.hwƕd.˺tٗ.˸tY.˺t.˾tY.׺}׉y-s%3.BNkh3v˩EqE~N%١ɲ:'Zn6[e=ĠPb#$_fg 4sMiJ rQ.益JUϰM&ȫِ~fғשImT()]ty2MzBF󨒥N.;^P]y"#=oHqWq.r5]P _V.u]x 9AߌRl쫅ϥ0ByAl\TT8fB#ۨPE#^šlBX ]b]ݰשyq[=.N.hw\/WRs 񔣇7;plE\AXMOB޶fe4^R&Ő -d˰Q9x/ܷ.XTՀW%t5X(ӥhVՠát!;wu5  +n5'*1hϕ^]){3 }nr`;ovQKvC W2"V8YXpٮ \~|iC6(ex!|eEd. \vY(]qY(Ɨb\vY(]rY(J>A͓a{vtwkԵ'^ݷ'T]bw/{]٥!&ϿWlk5>;o|q_d˿44uBY9tq(ץG{zM{5"OFom6Evөv%x/ܢ 2i8vdJ^|fhs u^-% 3fj[3n\jp._a;/DoT"jP +{CguR AEd_xʖl%Yt'4EЙcQ{O)d5*0@vx%fތ&To7\^lck&WR!!zXklÉ#Օ@|3Y-KXu>*?[yÿIpGbk;) z|Ζ h v->Oqޝ.Ѭ@e; W슴wM.|Fnk>?ԽϦ|}}_| #֭AN!o][ >e]`CFu >H*}Ev fpߺkpwYc{ܫ<ϮkpSkp5?('Jr~DM>QfOٟOd2'J+_H?QOO ﻩJTjVVJ&b8ę6 W2Ud.9gYw?˫rab\ר>cl!v5| ٪}C]p#GF]G9(벯p,(\E벎U?Γ||Pw?fU %Y@&HN1_d.DUUAi ZLTQSߧ*K!XkPjPIWנ"kYeK[^TJGzV#jmPi4 ɤ1~'8p}݀,'aeIŎEGvUzWbg☃͊KzuL.2+.Md.+gP5&8lrخr1VW^uL1{+)ƨJL!/NӾXf,nC쑣J,g/-Z lnj W7p>rԖ_9{(,_&ϲ͕-k|aR%2~@C>*O&V}(P%!$ղDXu* L-JZ4d4k%j_!-:|W sȀ9 YY4]܏X.۵K,[Vˆ[^/]Vr~x0>J\c Dk=0Gi-?UKUHQVb!?U4ߝz ïzD C=dU9P_#&7J49zOEY1 /UQꌹy>/>|6Tl*ƒ|{"f\'_r>ODRA(鈝O^(cL&5)Q۫etYx\vop5_QEIZƵ&5^kR֤&kMךԿ֤qIZo֤~ y/%ȣy y/-ډZV/]̢woL|v~ hQrDŠσ(a'Y@@kp2l|Q%UteZZH7rAcz)z[GSCj>嶵MOR'X LNXXӰ/yX}~o + hl}scF.^O;ly:_٠Ti4Md.{{{_e]e_e}u^^^o._ <,@z`nL(=8IWsHMVkfk%fϰ:TH|5*Y;æ؍r٪ņZ,y T'' [,TB[ {KJI$-$Gbjσn}̥|R EQGDD@%<YVe 5)Vb~qO%p[|$Zbw8|u ~V6{Hׅvu)f$~,)v~RAfj?b3"%OZ;b]MϓXM'zZMgt7]Mw{Wt5j]Wt5{5iPo"9ksNb7^&9O@Dv9szvqE2t.e|/]ƥe\K˺t.7c, I2SeD\fe5J%[r&3V3zGR [Rc%KTQ+y*o% A\v֯&^[t9lk ) t~JXqѮٯ4=X SpS9U&c:>DysTO|JMBᣕh] {lV> _jkq:om=6 h5xP̿k]4ԬvMiΧX>.(Yej# ".|ohXQ᫙_ݧ<`vʃw_$ueߺ߀רst 2QA"N\p߯b~*hqUSM3 j*jWQ*jWAS|߸%>vBC  \50~ aGQnDlj0D?MDجnKlCuM/om sxcotZpOV7J4>"FHrc-uPl=GK))ր?u |'c}n~)͖> HD?>%t| bQGG<fUe[&!iDxP-,c)6M{RԋQXx/ JfYF,c+xRrAZ -f" ~ɃjhVH~km Ãd^Qx7J4<\gHu](3xO)9]k10=}ŲV`"R㯷$wKe-m}G(p_;6H(bwI]m*C)b4 HxQ > BೕhgHu'< Msvk>[1H(l;!5MdtYs4>*gHuqDJM<ßژ3-'5x΅ /?|"of<ΧX9852j6 8ꜜ+Vm t>z/} A <%˚Z| B`+0|fpf:)k[/jN_a=|f B°|5/s@ {ƮZ))NZ +P >n^E`Bj [%~D̬B- {Wf:>d+`4V3`48GrAZ VHU Zvac,RUY/o tI_k mRuixwrrEk}x-AZ(FK%YΧXo|EfoO2{K[3{f;{ޕd={ϹT9 O$fI8F's=eٔ{Bw<gΈ.wGx;~v{tr>+}U_@^@ŵ}/ W/8g7H8⭧b-,[X$ÿ[+M\!UɃ阢won$Z@sH-qD+T_!~w?~7~w~O~8y"^ObNlW1ExѮ*]l:0rVbvBt~&*Hzum_pTD3| fTŃmi2w^e؎.&n V>ϵrA 9Oyť[!`?|/.X(R;|)o ?%Gw/ċ-?[O??[~twd?[[/-œ3mԥBy+P^L r/e^u0,r>:O!lʲ.BKdYjEh"4һeYvEhEhgyp}`}`>P5=@MlFz"NlԀ17I(,vNF6ʔ)ВԌ,M-=3 nEl*VōYB^7(F.P̰ilNrN҅̾6 hbqEI4tUu]ujΪXo'{tEsnXI l1D kuiX~{=?{DnGt#Gt#r={=ѿs~񱧆QAbx_vp3s{ڲ1HZq+Zk-_kQ֢yEk-Zԯh~EZ߬E3(ϯƼǯ𒺮?SFoO"Հ{Kڏ~Dސ&]D#4K L _j{g# g~EU .ժIU¸do _c(kbkbkb쯉1߉Q5151o&MUcFuZk&>jo9>M.nYж)Kf2-AcO)`*8uT܍9% Xmm {8C8)IM^jKwbg8 KPr ~Vb}{\7$쀟5g^ژjv?- }H0W|v pess᱋m7uѓ1Ŗt;b5yr2p$$,;-@?e6]^d+2D^ E¯/|?)O GfR(Glzkz֦%fGiDl #6>) >LtV.oUT ?M\5a͚[,F ސ+oBs٢^%-JfS[ؗuRU{jژ2Uy ox ̩з,*9bB9-:p-aN(l | ֎~7^R5 ,lˑcogK-c+J֛3ˬF] %+~$x->nI~T+T(V./ ZU[z`ILΧ/pз|QY;+kAFR>6!rQ\7-a{ qtQ'sSp[O^w;:|w Vb'pj 5-i~Hq<| Z|eArnKH=/'9bi Ńp( ';"!ͤ:!ɥpZ oH NÃ盏ip5_˱!?˱n BoKΧXo3JۿjD[ƌ+<>{ɮT7eY+ !5:{ޮw:{ޥw߳gG?z/__/_/_|\7|wбz?>S'^ӓ~n ZPP >ӥ ~E\j&D8&Z|v$4 ƛSЖ~2 No Kd<7 XޯQTl˲#-4tx{<-Q 2>[}uc p9 g5\T $ߦ9Fekuj;'{aeu>Z|t<+gIOOAb'<[u<9k@4W]g>7I{Yj$U~eo)V ub g,XL2 z5&uSP?LI[OEMAZ+T !U6Ϯ?j>n?B[h| rBbU3+Sf/tOgj+|X'~.1#fP&Uj 㱲ϐZ"e~D>*~DxڮATT}:k#ߏ.zoj6A^MR?h=9n6nR~1 #fT bLrHv-4I|ɷC$vend,0x7|0Boc? }XK?c?w>zïm9wifQeN#;Kg{dKyXM̨3*?Q U,t + 2ܻ&}Eé%.hޗ@%O9:.Z<ڮJomWnR񃫞&T[+$!Ul.Zf;bW?ڥI]Fyv>*O$,I4o$6M?Q%4דg+T3*?EobL#7I۽7;&5VaDSXCŸQH c~ZC;My^BjE ٬>snݞCy^> %jO!Z}zu3mJ~&3 |?' UQKJ$-wJON Xo{_lskRp~ )`]L^vm,)!_v,j.) ov>5L8S~g2@%{2#Rza>뺱rejOla"U/_-Z~ ۢ$whk"z1ѵCyY`"!7Y ) ~+C.0A$~=C%Aa?콿l%g zTͯ_0ݤ*jW\]+7¯V-TbcGI)mZzM[j&oE*oeD͒- 0jXEjjvv&XGԳnx7rDqhG1g+/;k4rT&VQY}/O`^,XeUQ4Ul.g+рOW qMJ{F;fOx+N&U7az$ΧXo%CM.[5I(nYG{Ygk-d%傟,gYv>zog> peH gHu2Z=-ΧXz?_?_ / #1‚H5  + R X/V3;b(_钘qQH_c^/ _ołH|MRu]<2u g>Y=:0Ngw4[{wߜLT??@HâK*T]*VaRK${rn_$~7|^NYYYo& iΧXY4rLM/o=xטD|AK . ڲMvsiHUCc{2b~$~41s@MBWΧX>KSS$?H/Iz/,˲[,N_rv7d>\hq~ hFV?`W.= _.U3Ʋ-# (_M+l׍?Z9H-E{Cd{0ѢLJp{RW 6WP*`mä+8'bWg+ ;#Tc NBO.$5hдmb:_ԪiPwG>避(* l5t3&Uw_避bT'pxuVdK0I .OҺOEIw< ]1Dm onlNsXBjvnD} 7|q|~PA/Azg>m?jApZ>m?%:|DGTpQnݝw>v *g;nw'p[O?~?&{L]y4]y<]y# ~?<ΧX>t"1ʎXώ&ᣠ}vLJI/k%LJO$=>xTɶ25ސ)Mehj :lk%i1%'nFt7% mƂe&ow>#˥I:zV*lY~zgggtӳ.?[wCy Iҟ3)QOQ0'Ӯӥ JvC::KkGIwc;y&ݑgzw䙮y|D;rϲ#פ;rM;2'P=>!1ǔ'KwH ,Y ԰ڸ(HP15,Eu>zÿDrO`?t KdOPS_)z=&jh~ƝF ƥL8UI|٪:R\|~3$ΧXoWAMUsl*I fz > *E b,(uBC?tfLy5<<y9$硚C])Ja՘HhW 1" wez¬7ww$h?5gek4i )jժ$pkiNKZ|P97;ygiRg~ U|U7^nÌ~j$= >We$Q+uZZ _~ӱuwM~{~ӱ_twwM~o{觩_Vow}ccw k%!_:/RGII3L:/R3GHqOD+xR +LRafh E4Ov Bt`+1N?N'@q3P*Cw ;!u16hD"HEiWS|W|_!vM' 96\`ofLASxIMt0'yQvtA}xG{(}X`De %e?Ĉ`mCuǔ.1\ba"WuJVʑ0U,1dFiH L 5$%iv>|0f\F¬RZpYfiR>v?.Do!Ugͣ0DT.CG02YԢ?~>>.g+АO^WB\e,P[kcUx&UWyLGH-C/k%)V%1I#VjI4Oa >CsUW1!j8DI؜u>z2&*n ]qo w-,OW=qOc8 ZES$q÷]+ T4J¹O¯|<Mv!ݣyFzLӢJfNJ.Yc{H- ѽɧX_y=k 1~^|'uͳYO _~ Dz?_?_ p.Y8G҅s ԅs¹ޅs9u\9.KpH[{jbwLlOKDoK V /g=Aӥ6c oWD0DfYQv`!3Mj0->|SCiΕY/vn'~LȡvNK?L_ڑϐ*Y ) =Z!u5d t-B9C(jIPK_Cʏ/`|DIdK6+{Isq^RWŒb(O" d_[^/]V8vrn?B_4s >]|p̙b@&FH9yEΡ9-Еs|;n9Csh_ІzN#ԕ8E#K+%HΑ-mk$#I1vr{p_Re)범.KYR~tYʺ,wYʲ,R~ XT^ˏ//GGEc.@uEJGPv_%.o*t ٚ=Z^W拠bg46f*Z{za\a|[3v3v.[Nÿث;Nєz[3v+_g_n~>뾡~27|^_.}M}ZHձ\t3WB:Ut=ژvIձa~HyܬhX~}Ouw{b3aq&l Um3[9zÿ_'{?Uz?p[p6 [?}X+t!_se{]yq3e=?KoCٓ;gsgIs˹s'9w;wssgIϹs9w$ΞΝSW޷&o'%*x{)tAً@ g9wAȪŧ`вR<Zv,lY[H![+Pw>z?Yai퇲D6&U5CXaͥpZ oYTotɃn%Kfe|B49)nDh\<(VdMWHMLV@;b~ɃjqƝT ۗ>E\61&㳘#Ȥ|rhMo$(;@HBSАaT|L<>}x >>cSI{_~V}&!#[͒!zNWo=1E$GrJs VT?4=ᢶB>NIxbhz 靄¯T؝O/qHW;,lvyUz_!Xm]z_y>Cl{Hu>gYgl$s5C@?Ǥ֌/ť0kkGVjj!|$+d*g<| Q;LeL]ǜ~י.ԅt]]2uGub>jSG9=2Wz,>54Ńl%yv )4.a8b?oo?~oEHǹ +wjUK(n?YOx4JvR~<(PbQ{ >[;uE}J D(~NXs/5L ut`KNO>zÿǾXC:{7]~ǾVӱPo߇XNcìEmG(k Z;SksbĀƃ!ip>*߻w-KZ{ײ$4nQ-]һ޵,kz2]˰>潪3g__(B2xvcC{iﯷ_oo{s~Z$>[ ~+N8|{T_m8b#^)ѰQzOr f{(xO-Nj2mS~_W3`++ l}Lr]#,+`u*"ur1”uK]]+vVL^WjUz⢼[z{I$_-gޟxw>Pv#PM |& MSKB]3 v%71-ӴeZOHqMԧ]]*?z:b+/`_X'N#t6  U_Erw:]%t>zK63ֿmڽ.݊|⢄#?~5?_m' fRu wňH4XF/HJD{'|[+NSww= Џ:fr\Rtԫ4CjCJ4sΐ oɃe1x2OfJItz!oδ i]6؀r귛msB.wLnTͬaS2xms8k$L`s9RAm8b}>r :xgg:x5xr141xY険H)ԅ[Lݒ AK. Hhg+]kxEq4,KpKWje|,"A|'ӊ%js/:?BoߩJyN$@!F f5r>zïzd vdsٶ^AT=KvdC@?7ٖ)VdZ QŲܽ_̨\|$Z>x1Au>[ oy]h%p{M0y^cZ|K_ ._O޽Ul"^nR`=f(RA(nv)/_~S~U?~S۽_ͪhoV'O_f_8`?@.jGPS.>MxOgg3{~P$Z1Js$PçLIީB7B-S=?_Ÿ/GGSoap }mH8ǐg| e59i;_v"MuIHƻtݺw.x׻.xnxnK7.koؐIZ,$E9)#4/./Sn#{ޟ?>- 'R,mZ[&VL?f{HmdOg|[{i_O Bca9CF&5~`5jZ+433oW) >*_K<7*tH Q(`;M=)(ύlVnSQoD:|ۆk]Y|L'$o[g uں{޶|UW_`ÆOB͔,uc8~ n1nAJ^Cl[I)x}Th,H5Zt9 :9w:K_k¦%?tQ`Ou-f)?) Ǟx7L?B[kgqu^U*W ]!<;jw=ufeGQIh/;Ζ[E'+0TŎno/o/o/o/oU* y*mVH8|"T-R>RkjM:[l|g<\RAhosΧX/WUkㄞuW4)2jv y)8w Ok%؂C7_`bfzM|` ZsZ:lA49Qzu~u?uuﺿtu?W<:G>}e6fa&7 -T"fi8wHqoiww4Fzï7"?[z%oI{K~ViVr"? ~~?? ?gߌ|SHHزN]cn1 ☺!U ?W+\+R0\AQwJ xJ|Q  U 3?~hh94 9  jRCCDaJ>4|=/+,FOrmyky7].ZCBhS~?EOyO)?|nEgoӍ<l6{˻B6xwWM}_uwWY}_u_ߥt/gP.U8Q7].{4޽J0|K/-:˶}\%{bgk ַzK'd~ TZYq~7rbRHm5lV/`ҢȫEUq &{תUq-ho%XAHU\<𙎹7\fB,0YR]~zsɶܷykPrjwtwٮ[(tFNIr෭ȫ] ]V ]=eA] :ׅ((..L3EO"mQs$!-YQՍRM 5V,nIٝ \\qm8} y06>ԑ!5]D >B:f8aQ EN:m޿vA"Nrf-|*]|p 1GVtvl ݤD7O. 5Xޚ,Ya |K,(f(,MҊ=@H<`pcR[M&zvc}g3?G6L π_/o& _ǨTrGԹC:C o팩u7 ٧u=n95YUyc5@Kϐ[I|5䶣Hvb,.lM\`iR~Tey^VG@{[9|R}ZHz>[ 1rH#ϟ7០&oe]|_$ =KjڍU{[{~綗yW⇖ܢP銸*>ՍwVH-r+໕;󏽿a{?|_'Q{#UjHvF= *m BO >#~X#7 W[ -"Y#K"Cǥ>ffxf73XOVU>>LS' cxi|TQc-t \7RI/ؘ$cSׇ U̘$MTHui ~ioue?޷cyBCRAܽo|ndZ/))G|I tC6t|+]i6>\肻 ?3n׎&U /÷]AE䭉>)XU5dGkMGXn=_OrkIudGk jZӳ&3kMH55=kRVeR[$gzϤ[I HyQ{ds~hKZ{!e|}Z|(|kM֍U#pteۋZ8ip[q(")Ӥ:|8W08>孉/kXy\178UZnK0x[2ܖsdC!mIޚx+Rctaͻ2{I&Uw;?ctZܷbDkHUM?Q +!Cxk+b(L(5>]j VoZŃxyVPq:w'}ZfBsvVWL8 0|?<-LCK҉m'춐Z5-Oͼ8kH_DZtw?_:?v~3l7~# |7a#Ӥ6g Hj6RCޟO?\b+&!jGV;^eQ/lMtϢE vo2^?YѴI(dhfuZ4(EJRAc 'XosM]g~Z[ c+>kGTHUfہ|57%6?vB[k?EbE¨8|fh?RA(|  u[])Kw%Jv%nNϮ g1wݖv]kN$t,sm_g˱C(|&zzrcǾÆ\ zHϨ7xe >G?]OI=g+АO c/I~ѱ_ޱ_d쏤cc/:?z[ ?y_g?ϕݥP{?cX 3d\8U^ly݊W22Ѣ^u` :4oML-+8qW %]\1ӚUYA|LnYG!+HI[+t3 OԔ9'q넽2jJb}q1Xߥ*ˤ:|$./Η, )-GH>b]3q%x{!F,: '_l': _BO:ܯ+ +h \gVB?|n(4`- Kq;}bj'pE0~|C_x_ ?/`|w ~!_'=scRuWuk 6 B[Ac|NYyto5tX&O'q,3 |==/o5th!Uv_/yto5]&_K, B0X%iN~(e;  ? 9a(W' _-`߽?ޟޟ?ޟ9imҶh~}kG2 1+>& _S`冷}:VcSz_\+@$uu`86ŔNWzcڡZ}׮WQ3ij{P{mbm!U{JՎ; }mDJv2weEHǔxWƮ /h@ zgٻuwKgzg;twnKg҇5fU?_&QҐ5cЏhL?jvZ.M- ? ~:ïfx(b|?UyM*k}r|5#ΊGn@jՎ~B.0>#%'GT-͒37}:M4O~h>bΏqz  Buڧt@2Ms `ZJM|c) ດ\*_hEz :I_W9Z6 xjL ^CjոJ$gDM|wXx60zL|b3J)qbkz{?&jl|Ŏ ~MogGq)|.XCS>1N+DO5<9Ԣў+{k2tcS`,fBCZ[Ϲ@ƒf_ 1!ޚRu/h$!y3]Zw3|.$v VCL aKVvc%d߬8~1#Ds&߲(}~׶?WuPrwii?wm8Xm04e'zhn*!!9zpYR5%)@ܢPbҖߴe~2/[ee\˖a˼l-Ö}2/[OlYolY`˺lYolY`˺lY?ɓba ْ%{ønm91cω9|鞓) =.y=y=.y=nysE4ephbj~aI!bK"$V0ɹgL};B _W$W8 U&:B~K)e9z_A r.Rm ȭChg:}c tV,LYf#n8(pP8ܠfnp֢鬐af ֐T0t$maˎ1)O;g޼Oa!'X?~{ooW}o~ӷ?n7SUmhr߼:y] _m!'XoKs!ϳkd.}y7^Ʉ/f|W&` >.\K?MW킟ŇmѦ^(LfDg  =2H!RLoMCk ݴŇ` ̫5:T093⇁. 0ϏZ>HHGF媖e@hv ~ C *Ԡ dtU/-;ω<6om@ٴ*aeu;ZVwOڛ!'XGQ;Y*N\\Bu  (i8 >:g V8 #v 7ZBw r\Cgu\c5tkuk5t3||||{u3u3+++^,]L]ϕϱU$qc90}H8jr ZxjQ(5kjQ3*u!bB ZZY)R9r<"*ΐ߶N_ö )s5?q'w0}LP~&42=C_%? KК2#/+^*\ȞH8\`}?iBZc@ӋwGhWGWGh^]}tvuzuO:B bvCv_;%vΠΠt_CwwCv`|$ tX/;WNB!Bjѕ'yJ<ӓ!+:E- å4){#p-ns>/<`Y!'X>+^zjnp ?;N"m &?&ftVBК^~L+ =]E54]Oh 2J,p鲀_iW BmJE+eRԆg%>A6j&Z+'B]BRt V7ja+ ߸X~' _~' 'bÚNLt8J/!7URˋUkC2q&,7g&fTM12./CmV~23p̡5E!<3Yr5sV#c Ch>U{d;qzӘ0L#&:1 ?/n|_Y (?(]Tہzklv?pr8"OQf䙽Ui;~厠"۰ .jqrK*/gpGvzek/\T$#pչ/U)kqU ғUi*jUi-Ui-*Q\ʪ4_GtU)\ $'>%Xc)-6=ZCČExVb%F:-g1ǩV4qJe?x|3fW Bl0.0.KCۀ I)m|^5Ñ5[e%'Wt{|y X0-= FlafAZޣ0!9zϚ& KY&ˈm .&8947CSO$$~%Q +}p./$ 9j33ɞ$e1,X17I[^xsunBN^I#װ\ ^oaY> U}%wvhrxfj)[]7A3ϰk&]-eBƳ]pdfz zc~V > ^s0~|fvL!'Xߍg܍'Axʵε&kwY+[lJq.QN SEڏCcR2ߘqܝ7d\cI|M$)*s.'GW3P@:|פ4תZ14&'Xo)g%~zxBn0" 3͵E`;fO9z_=Jpez8Uph,0X)G`$F].Wtnﶟ:tʣ~Vt[~WV-B$n3L!'X\UCYH(bp-*!sW1al _2x#]ވ!AnİUZ V^11F C۵jFLfdiZs,ڒdmTcv=Qb*W[7-Vl!"?WY-0rc}7|*_OSgpnSiEBowBD:KY!,$U.{ S"N&'XoZ" vt|en`|`ܾ65jqiZ}mr7,@Vb$I::]2^bW ^+ d _6d"9 Ht~HHu$IG#%F#J#Qё('rqќq2C'o8ŎGb~by> /A͌hn.dQj`ǫ9n,{嚃?Tmۭ8ގc$܊܃hy@ jO&&bhJ|wjwѫpݹX>pǑg_i5 ݳ8!cYyUN ~or|߆?){.yBBO<gŊ n>Լ<ظ)ˌ"\? t{-x -*;E;w%cw_Fcr ܌lui@ iz7 {0dX2 v?ETQC6F)7 ؂d2!vGurG^s) B9M{a@.-ԏÍZ9(1EuسH #˒J`6zZQv ܊\B3Ρ r]q$H ;B}pܩXF ʈ= ݙnX $,PkvX.ICf\.u ]װխ,y̌CMqK8zTyO:MNq=-Nq5#:iv3։Qε#ݴލEavR ` y,Jz6egQW<\Tǜۛ˦i~O، xde˞WGا=:ZOF%+W_82ΘP\?c}!eԱMU-XVkZN+#=<<M3ZZ̫/X+p>>-hw vE$!/g奎kߎ|v|YdwrUg]Q=ma-zx,9$sEwtl|WG/"/[ֈhL= 6m #DI3%ԫZjVZBN~|?>EOZ?C)O~ߟi*ղ\t]uކ".jVU2 mWZ*3=|QXx3ϓ3RfEI?3H-_LWfzoM ErO?`yO!ghӼKkͷws ilz*Rb] -VG2))yjQnB @pnE;sO փO\v[:s14cwnGsˉ s Zc\ivQB_iH'!;X)>ô*a>6 Bw#]BN s+>𼣏a;p"S"_4oGȁc8);} RV973=} KhU~]з?o/}C|'Rو/U闇\4-j:Bn0S3eClTʍp)N$9`[C8qAk 8plA 1JmavB0%Ϧi#tYaϵ.)PO@GrUA a[𦏵:pZy̓`! fG >qe[7ѭ^^$Ox\ÖF /@-1ᵪ^R^) / \MhdW4J 5G[E$}Q$܌\`cmEX/0x،a)EFZpEwl>|>YneȏpXɏWx+;$?x:R Y\)vBShj~uZ_utZZO?){{[Yb1nOr^v?٬D8/^Yk Ҩs *ٵu}֏үrm2r(&cүrm2r(&~'eDmzZyY]}`Fü. B h!'pK t̷iu qvhׂp9h/CG|r/S*=M߸|==C5 қqoo\iVDVSץ|]ש|S׮|Kש_q83^y , Yro@)o fPfQ2O),BD>Gn-`(BLZ~.@&߼. y 8uϓ[uۻ"wݐ!#Ffp g`s;:|,&t ~v.M? Wmg-^v?=nWȁo&tpIm;b-|ԑmqfN8vO杺Cn}9xJl'hz×ʬ|}׶;ͶMZA(nm`_m_}\UIھۢGߓ>ھ_xSvnK?6^anDe%>@.A%ەuQ,ܝ_uⒾ;I'ՉNNܓt~։OaC3f^{.WIǹN gśB~J ͂|iUjX+"_A+t&'X_YĠ^=]s V#jӇ~Ǎ ^c3,O?9\~V_-9$Gz1UKcC_h]ݵ'ҌNVgmnLd- {yh꫍{ bjЪm6j$[i rKr P!W9n&!'X>bl<(L:Ry͹!7,!vٱɡ:jL޲s=*/X㕒?H@L9r487Ky3W)bpT=~&|O7hr N%vzrxu 5 B%ك@'wv*W+tZkd33/gx<{^v<{!go_y0O7YE޾=\{<{h}>*=u9ϘܠooZs37|qJ|fo/[[5 ?.: ]nhu3gx1TpN9s.3g 9$gzg ZיrCN555xyk 5xyywhPT}@>PԟOxm  yT7zw&BUr$֤k:7MVס# vcd,I܄y%MTz2Jm*@hݠܐ|2Y-LH=:$!vw>&":xd{Vbq3x5B_8XZO ?!ghuY}@ғc]˹7Y  !-{O6̢OKd-,Rb'bmo\Xq2pT}2bnPb[*!~˘t| $ЩmũBL !#ȭsI*p:U|di01{ ~ud}:ho;9?Z~wݮ]wh[vuvݪ]Ю۵Ϯ_Uƌ ;AW}֐,ߋ`MBU}>~Z>E'_ ;WlÝT̤ܐeI/>qe~gng{%[lQ~?>֏R~Rl(=?J~QA\1 cy:6bBtP_ ɀ$qDz,(㮘.#t\!'X>nP .\q^I8yH(d s.V3t糏ZY4').Y;Au.USt[rV' ZA8J 'X3_ȗPw9wiu Z&{FDLJgh^UO ;~I(|r ~jN̸7LlLv ~ 9*ǻ mVZ!ZA(m+Y ~:!e‚$( @leBHLa0V ~6?7|nJ펳ϊ=߲oe W99|pXKrFJ%կ6'lrA;|n˹ yd*bV\.2t/bqr3ɘ;ְyNyyq3o\ᣀdO-w,n˒ҬxlB)kD[Ղ *ea\oODAҋ(%K,AtsF9#jnIu.A%[!H;A;1FHTCnZC)b #oתD't$!'X> ~8ZHjT܄ifv+T77|=/+sHEtȡV쌃誨'Ոr'սVtirZA~f7ֿ |7ꫥpeH={l|k"[ksuv ܂̄ pł|ł܂8Dx&b)W¯vRCN^שy~ UżG#ɝV+mYR*?xlu\uIʓnSs)wyF "=QW SPET~{HN䭗[dݒ1k x)Թƨ!,Ck5FbkZ>6b1>Ɲ~~lZ>[tk͖mXowGvM;B׎kGh#L];B'M&K]7 ~S _KmX/SCce*oiܜ;Y8|h359h9魻 |̃ Kr .QYfh-תz:7[ucW2)2 dFEGO{%#X$KH1ۂ"flT%[!;0uGawX;,Sz}Դ;}4a%Ni5@4 (ϔ].[`y ~rUࣙTY pH -|'[ցIW%%=KyEqggs|"_ܻ">ݬkw#~nJݍI!tbIhI:DKђv%bw-cX~v7ݔ*8) iEv7v7$OWF3 X*MaT/xT/q6Z%9ZbK55LS$epZs#ۯ )^:,F ?(]ԌE+G67(1EY-0-8?F-ƟVnA?=+ d{2$ 2ɶԎ'pef%m܃@bV Jh=@naX6eЪ{8'$P55aV cB 9]`+Z'ݰ'Al)˷߿}~y{n8tu<xBnOu:eU{zcx$-fAmenf#s@!I&k5Jtų Yrx`v{#4Glr Fs:T<>I5Gu ?>}8}lӜ$~wdԝh:Y B!r.TseOU]?Mejgvj'<݊7-VeS5,w>|⢬m+M򗍅m=w?&H&|mV%4eX9G6wK;ySm|>UnmV:i:i:iICISINNNuuu\'*u*u*uWCWSWJJJUUU\d< .[-bE}hO})C}t#0>:º:¼:zw~PXKv1Lnv97 øӊr '^kc=Vbq S(0d y>+Ӯ/`sazZ&ľ2)kq&'X~N-'jmevIf^evCZj-'r2)rU'#ij"%&8"cY:ŊSelCuJ q>qu[ew>DکW~wjR:uN}~NYzVU;uکsȅ*kڬYդ*kfYդ*UfYf_+nxU+nQ ?V=ˊ׊gYq$+n$֔7krŝsXq?NFJzҐ_sXRUҖdDո,gmt|vD\YdmK9Sj G_;G,=W|&K*:,eeu$m|JGDeK8Z2>2Жa]dI5=8HDw->|⢬[p4|3q JiL-Ν'iYnZOg4-$@C9z7z5~5ѬլլGW*Wͪ_ͪ^ͪYǶ0Ɲ>5 Ƕ>ݴM|lk[$9 C}Uz##@`@v9 !栿p >rhUTt:յTWtk:յTt+:յTuk:յϩHqpi%Aj#==SS>Gq`oSҐ^֍'L)cD_i+(?(]-V<csDAi?6>phhUGUGUG{:::{ut>Wv;BՎе#wGvC;B׎?;BgaIG)=oΝ6h?^L.Wu:0L7p.̮ђΫ_ 67nZ> 1pFْ/1`3gUϸw3>z]{ϸqg=Οgy̑]Wuʕ+ʼ2ueއ\&WW+rwݡ]Wϸxw]=Cxwݡ]Wϸxw]=Cx6g3wx6n<[3?23K=nu|뺋 ߺnMҮ{ YZus&1B |Mhg;l$ß5% Y_73Ubْs ~i7z^znIWzz^z^z[\=#mΥmpDDk%&8drYR5Fl>GLD$೓>fUܗ-~x~w?ڏ-i?ڏg?~C[73MYhx21NF ;:rYR]dkf#[,=]b'jU[!hv"!v49]x 2A.k8hmqJhu܁sbή*#v1f-lE#NZiE} BQKhUMo $i7;a7ô*j7N+j7%**䎜95|Ady6LohZ W+Vk9+~_'Bϯ.⯇_" ݺs 9GQf 2K+aFLu-YRU3r!5W6"2M#Ȩ1NCy7mOH˒QQCW -%(?9* 9Ajrx<~7^ {܎6Sf`הLrw;Fc\`lxMmx􃹩=MĊJt1>|ӵ-O%:|J8.i^1rFOO>qxGzyq xRBX4Ԅg=l(Q 6CdՆJiF bX4J q>qU;(m+Xoeµ!S2I"΀TՆȒF_0WA-ϳ\&.kV8%&8>s˒w~G6KV'd{Ut-Gv;u(0)eMNɦi# "֪E)CSZOO~3CYX,xM >i\/`80.7ۂnKU;&SiK5h+ɃUVkZCۀ !{PQ.ubq ܛ.:BkSj7[z?T{ |Iכs'fR%oZ V e2-j0nձԫ9>*,WıCTƙϐL-q+3ӵq<$fXy n떛.,{nu?wG}?-7u?+ 9:42L-tn!'X>NW?N6gE:5rz'2.XۭYM.1rCVqD؂d(bOqfv NffeZň'sZA۹"ʍUK/ I1MdAaL\pKRjw6!iRjrƠhRꙜ[xaVޠ4G#tdAra}E&>6]񾲲\`Z݆S4ɐtuzqU Ǵ$ [q;x|ʪA+&˟JՠN6Z#J$h('Xo92-w1Q$Nz5ʹ8s92 ?Yȁޮm-Gov1%CY6o94I \8qK&dt ~v. l#k2]u8 L7}^!!7Y.{2oEl+XvS0Ъ^FsAKEvgmZo{\Ōxs 7~D_m-`_m%Cnzk?w B19*VR":y;Et,-Ʃkgfs}!'X/y-:sMPM4NW;pkof9*> Oگ9$e&<[[dA%)4'31d̀$m|"EزΞr%;{G($NfnWG@1(a X`\B~R<+G)*<)zT|~bUu_bGąYݠỌ?EzEs_@ٹU5WVzńOh-Wh-<^Z>rzԹ`P &OxQ ;=ڮۭGGQiF!= [V|򅵟xb~ øœyMݩsh-L~vPNק/~ ^Nͤki,O_Wc駐/~ ~uUܗ-tP1Ŝ*ٰ)R չiM 28*@e2GЪ-ij96UHE(;~|jlj [dIa?wVnfLxs2϶.j-~~+2Y7J4{y 9סsEH%#F!9ȒO*w"(1*Gbk ~dy?[|<ZS?jϡk^o]`ݳ앴gwϞڳK{Ԟ^={%K{L.- Z҂Qn $L ][kl6 '.*e ח^&V ;)v@HkH eJwz{hyr@8eł5cC3mtZfzZŹ@)Gh'VOnŸsW /qnuכ,'h"*ZnpBx\VZ%mh$!F4#bruwXtPdL.|BζI8snrηUf\ɱWǕ#n8-Pqk='xÀ0 B" fhk2E LPk8Ӳ49=<SЎrż["s ] 痃ಋ8rpY۹Lkv"kY\_.eםY\fhUE#tsG/ACs.˦ߧ=.CK5ݜU+<x1e[&!{b.V?bZ:h< k## TI8uRcR-V]4U9j):k`9P%J*Ś9Eau{-_*KuhqbHSԊO,jfQj>ObqcfrhUok! 4ɂMghup|"oϽ;H8ܓs}@Fzr~ r43QS:ZASV-Y gh͑c0CN i{,N ۏm߸91+3 *QW 9z5Ƴm<[~7Ƴm<[l<(۟>꼌+i_εޓ#0KMgaŐZ~zR\+{=X^ε汒_nGhgfsÜ!'X:;S 8XpcWK]ǟ?(ZLGnΦks ]xBG8 ZHR~ 8I]yv(~`t@Y'v6ٞE ;P[8iݫ˦il=dKtlc =7=uB>mRmJp; mqϛ%eKtW)EM$m]V|KpMDwc>X%[l9`o/^H=ULn1ja: cN& B,0na6u8X%+vz%sOr?#њ Vq`Eq(1ݺ=h_5)15Glr b!izbJFF{5f]!'X9uN:>\(Aɧs{wa)3*N 񆊇+ ??_-*nJDN7.֎oۉsW]+? 4vh+:|Mfrj(eOY"Ck=2C VhUYS?L YmN΂8mA;ߓǣuo׺<ӸŹX>Rɸ66m!?GIBw/ش:S-$ 5ja[+  ,i8ϰeDrt~gV;CY!'X/'10eVWEJLp/w3 H$#-u1糓ET/Ubb W`1wԌ苄aŪ)ՍX FO1,ʣۡ~ Y!'X/' P'IUڦ/܄[x1,'E¬ɹŲC+\saꨮ+Y3xKL{ˋU^zWV }sKg0]7VoK~`Nf^ K}BnYAY oK7 ﹻW 6%ȕ),Rn 2o}z`-VMI b6 'j 6[vbHWpK88虴NO=,n{ئo$bBQ;eIUn#&v We7F#Fӈi:u'z jQ#冔ee3],m\!v49=Va=9ZcEgVM!'Xqql^v0(PZgYiu!G!#P^\`g9ޡUOuFUj^0uٍkȁH 㘸2' l'3k/; 3;mǧ)Lu݂%$uN_jQ]Xq2եM (1UfmnŎzI4:y HG7a":a^ _BkܣxP (RC7׍ |nm-Esvv>kr*xfr_7mx򷍧N9fUo:M]?wZ[wȀeGմ:s:w(ߞCk F*:TH _a?Gf p_qƛsqbgW9=ʵpݹIXtֿ | *?~W  n~׷?ۯ~]~շo۷_םljm ߜgjZ~8Msp Lɡ35m 8N[=m5=m 8N[=mMsAO^ JGA䯊ЃP,Fl1rCVy*- NsBJ,' c8wIMqNX!ZmȰ%g V{t_݄{*=~]ǧW$oUg[$miCmcmȺ-Q0;m)Km)m lUw9$ee(Bm۲b]xq6Ewl*іs\[w&d)ړ0[rKv).khW)ƒ%Q @^"4VG* tY+ ˬl^DG&z,KYUtX4+ɴiIdK~)S=UrœrȂB95rYP<,Gz&B7(H$ ^SG->":r #b1`v ryLr+LX'VnVjVjVYYYfծfUf>UUUI'[?R[?2srٲ͡їM\Eeu5Esݗ-0q@[ze-,R/-l薺Lr岤RD MGNR+S&&U/[_C׼1tk?~ ]5_CWЅvSx_]]r]~qbm(-ӹi_6ANt*Ӌvf# d$sP 9SVk|WVIH!'X/R6m 7u5m+&Fx򗎕9e-l򉋲[l]c^]c_]c~tquyu555GWטWט?ceK.ȷ@}~=QjXՖ-A-.Uܷ-iq^⾦1-ʴM⼦Eȴ(a/W[ݧ?0|N6l,۾G&eBNoG+/ ' /BfrV"#ﻍMK-tP&zd21nNj#g;+(e϶Svog7P/b sjȼ9\R[P34#6}m\5ĸ\ k{~2"V"jR eE\eHsZ!ų&(?lImK[%ۨ˖eMdݖ4߶˖:Ֆ:߶ԩ}xl5Foo92xMfer$}W;>;rWY֭,/ǘBN>Ōzyt' |^' l7XsקB)wY]$CYAqw_t]䵬߲嵬_ߺeee~-H}eX?Myr~a$gDwYRCK^զOa|⢬~uB[L8"2q5liAZ }Ӓde˴.|ۖjElu'.*&ȹT-u?,˖JA`1;ߺ&xU/_Ԙ.NvWS/DO@!͍epvB"5H]W¡O4-,CBTմ5W抩c9zvj uW(I鿩jvjBum/݋ VEܠoT'Q  uv:ŭW)ɓ2-(6{d70o[2^ĝuiF 4>gvIoNT 8.&q~["K9 Pd%]C uvjJ'՘nL~$ Xd|/5zRc&5KIR FF~x}ҥ?U Oݤǥ0?^*Uzy3+zQA"Af]H<5e&_`'v )$XcyjH9]WW5uxT*Ÿvkl-:|fK SF2U~ĝ,a mV-,dZ4wYn w֥<E>CFze2]uۻe'] e!H zj.װZ8պapX{X-VպZ8{Xɰ@+ۨ+W%=[kxLB 5EIgUSD!$"Hd!RA "%]{#i! +뇮? xҍ]!!&%Х)!R]k׻.U+ZHSʈ$[2*uEx٠zK+/dT-"5SmXkX4( +z +JjaE% +JÊXsRO%zQyB.JHf)O*Ym*-R]p/N<<;I{ 51!@k%tRؘ^+ #k|d=>i]}ud>?R'kwx'nti=ߒs.U߼|8 '>]˅A}"89eNzsvٮE=>-+ң]p/]NZ:؂SS OH>؂'k 1p ϩC !!DR`nEOJŐZS7 Tvz<ΫTIX&D]|8AI_:j! cFOU_>ˇIɦԥtB[Yawt8JgVbY)KL\IJhA(~~YK݋ ?TsKUgT*˨JuUP"5YpZ#XPZ^6%B|)A?֫?fꏕcc?֫?(J,<9G6~?p4%b -tsyg\O/bIǖ봕p[Oܗ1"[QP*go4X*1'vU4 䍛5(h7NҞm|bPRhjO(` ѐmV;[.j5Uh6^ {n9l\x7" :j+V8 RD;W]AB![(ץG"I_1=rPZCbzV/cǷva䲓..@,'m튫AZ*DQ1a|BK f|Tqi@0> +?tEO]_]?tE+zEWHJXlTs:]0+ŭEY[ >!F<Dj =j&|5h=rXDjT_%cVAk{Q> g\FbL6b#)>$:e$UeDGZ\Ft,f?pHFu 1Ll%2 Tv:CeV8> GF;ڻմ]1C/WCI(eF;+v]d{%jB..udlׅN8ϓn 4}I!nIkJU'ŪA,lSBP GR^ĝty2oTE?ҤmcB[ˉɐIv|ŪY=f4l`cO$ldoK(M/ic=% _6Ɲ⭂|Rq8=%)QEd1-F`TEҩ솑tD{7F #_K +én0H^P=YD]vk?cs>͆o}nE OJVgT/)hm6RkR!f 3kL23lDi~P:R%WLPHvet4+.L Vaa ka $paj0 Ӭi~C > si@!sq sRV (P_KkF 5JJdvdѮHe?A6v- Y%K1tkWo[UlRsW*3BjŸ=պBS͐O&yv|e; 5 nJ4T+Iuq:_Z+ fgHulv Ã?9P@= 0ZJd64$T!2|>X3&-\6I^I פuI פkҺפk5iפup{L< Ϻ3q{g}5x%u%Ғ^KLKJKz-+-3-뵤RZRWZRKܘ<傱Y!翤^LfxjUCKMЧVpt+^RnJ.]?Ѕ~Х.ֽC1 k:{I-߫NN+ډZsɃeEO+\ZKݥ w24X+Òr!D lcuϕA JU 1%!ѶBv@ ^ a@+QjP8OZ,OtFjvVABÿJ J[~o(Jic|BV-_4*{DUZUZҒނ!eNN4^(Aga5E1NZ+O"ɞe`P"9HL3ْAf `|,".XWU0n󰬐:"X(H\de봲~)(@EKYԜ4 [Ci^j؉py0Cj4D*hYIbʇr2CJ[٢kD*EM-Vt:_}+53ӈRTC*nn#jGumPYlj|m(튫u0tBpZ'NZɑ ٩lNF%%-^iAI)wٔQ] é;&ϓm>wuʈюvjJAB}2~x;| x7"H 5jYJ @Y*"-^|4VU@0(r}>\| ~? 3Yy">wׂ7ģ4>!V; l!u`y"*h]%j\.Q(%\jZp"XF(DK.%jM8P_Z(歱'rBO2dbE܉<v"߁RH5=9X|8@.&MQZ/'@~hk%M]=w3 ϔ&D/)@ogK޵C`!t \ImԂ;+ZRL5 TP?jIUslԊ5{i!k#ȄV3 TvTOo.۵Kյ ۸J;2ѵ^/xrTZ3T7ʕhΚTi'(ӣ{g.WWazk03\+bX:m \gL tjUsB[4gTaj1_`Y~u)?|2h 5߇:{&3> WD#W۷V **|EdkKPXB[T;!Gakn+vV0MQֳ'Oo=^'(Z4tGHPGDfP*'Gl|5*+!gPIR*hGoFO{"P:}):}uT߾H%=:}EC× qqk{Ι Lʚt' 1 e|9H z`Z ˩J_Ƀa\y ,͔-`Ֆ2Z{D jToUP"vcm( sU^ T9kBaDl|(q6ug(Xfo_oϏ'Ÿ7-DD|M$'|4"'>_# Ũ!\~S[ Za(_LU _$/;4kOsTa|Iu1yt*y),zVaqy xR0Bd;ly [\F"ݢ456l,YYZL6K,-,M,{DYZYZ͒(!EyDmTmg+Jezmu `0Q?x?]u.ty˓.JۨKY:CPI3"nЅ^B~JB~B? ~/]jA?Ru.tTS"2iD0I ZL|.?OR4VA(:|~u +8u?tԥ ?Ӆ%2\F`W+ꢗV1E;U]LQIi^ĝtY¸7Hca(zX^nRA'[vU U ! pxc{ \(W>lǮ'y I? dEYڱ KqEǢԞjɺh2,lԥz@ݝn]"Dq.Uo'.eǫf=*RNyYkqXzkZFfq~Z[RӒuĒpZd1.YxJKViɂd5\xwE >M݂WU[e7 &x" *kн1>zu1)ʝPOA1 W$_++.x>J=:nZY]1,A"rց.uiF%]J@C)Xk8S'EkfW$bb".@Wa3>OȒTQ._/q-a^}1"[kDb1٫t)݁WqZ9vQIi ea$bJ!W[^ĝtaTyBߟoD(Y"L@ K k*Tנ6=mG{|jwٮEM? D:6AżC× 71?]J)K7){E~Y_\|5nۏ2gK/y7HMǚ̓n/#!% &O>H3zDi P)Y3hvn]c+ .WӠUozWӐ5R,0 [lTR=âÖ:0]:|tZԿǭx{L=ǣ\Q{L= #bح!&h `hgI?Q~0Ѡ3M8 uh* Ǘ:#JTQDxJWӇLP n E/tQIt&41jN]2]Zv0\vҥؗ\JֽUA)#EZ!YZD[,f!&5h^E]R]z`MW4eMΫ'J%Fx9/G^*b5 SԮ\O^Op}jI3"lШ'èLDmGz+v6KHaT>Ѫn ݌aT^--t*NiZaδOJg<])]15φ8dT!+֗B+ >b^_o;Bލr je7Y(:4`!\Ck:/ʀ NY MF{r[p>$*0U)Y6c`o\AP 墶Q a!bLuy {j"Bi ;_ê$9uQ=g+z+ky:XVb*'ozM볖ρ,&%_2m4~R |B̈ zIIR[_7Ut+ VB×40%)G 9855 j ɷK߾M RTM]r~ZJ8lئ"4R0xT#dY oX 𧕿j8B氂%k+lC*V9sPf%>y}zä|.(͍z$udY~j<+ooo$V}=jo_+^o>c|~L#X &~}*'?F`OW-ϖIE\CpV_wƚCb7aT0-=QL Z G26 a!}]sWʃ.2aJ`W ~)iz85@W'_?[z$40e$# ƾ݇I#ɬ+bsBPcd&cXq חlԥ My4>TQ`20)% eP _|ֈaI4 g T2Vژ]\$IbZ͊9uflO$yH%9`M;cX̢SFcP5TcRcLo[,}nv]M򍆘: %\a|B,<C~R;֡Ѩ!؂_7 [Ѥ+)dM%ֳc40M?Q5Jl3.Uuh3V﷿}o'}}· ?_TNk(L]~56_%.UoCsjR96 M(d{@Oh=|,|ǥ aGVAS^C*?N 60p3rnh:|BHaiy_a\k|-=PC "hRt\vv8E uE0|BtHeG\\p[~z⾷s(WE}_.z~[}_`b>5V+5a`14/~ 5/oV[[V/YcS݆ǔf硄oz^ 0:l4H֩M݂fgikDf!L/R >!Rn5_۟uo_'| / {(2C͘j2&?a7-?K'J}v~!QڧDgSj^a@zg: V©|᭄+UuqT_ŊM꽜!`@b >zw~uA[&K]06j `]uVIN:huA t @Litw.@ `c`v? 4KAA; J#D86 FTm z Ϥ ,Nϖq~J%DRyNJ tj9=*W@vC/ѮY6]$DX#T쐥NkJ쭬4BeTSBwi,9%P[R] ~`)?T3Kn\kے\Z:4XT|s,#_\j7Z4l2"|MBBEjF{V/}@Tz |oސWuofT! Q]RBjG$ojyU;Q?:&mkMo}otӁ;fH{;]A Pp©J+_ʧ7Q?UKH~ o?:|e 3]G)+𷷞3'DAtM}R0x밢Ôf4$N 5 LCsihkp D5 0l *` /Ӑl >_ .}{J |=k.].Sp2N].%|M]u'4x6u=uOao4(@oghL֡-+h X䭭e֡RMaz~iI;lkdMU&|WH4K׹{*D*t?> ekFrAJY$k6ȌjdJ5LCӪRK@v8tE3|Ckr╊{u庴h'HyX4g ^-TZ3W0\.?Х?|2?2e&]KA.32ԅ&B~\&d+h{+k9+-D&xꈲ5ۧթh@^M}`vŹY|2D0 Dϳ~> t{&t}HyhW\<d.ODU~oj7i<%6jk ?FNQ 0r ^]-{^Wj00ja5T>V*yI 1( ,+/kuص]BiTvb緻ջA_RW~藕e}/dM,)?F)dMo=0ɃLȤA&,# 7=d`;uد+vꊝbد;u+$!FU_Q;}tfwa[YjTM v!^ J-0'Q8Rr-R[dkVA|5ϪѦcT~[M_|9EZ|D*oVX9T\4bhM ?'DG(K֑ KH:g =o.=ɂ8X*L O=ojЪ4C*ohR {h/haxe_#6TkJ8C]\2V/f8O탸[7 Tv4^]kF ^-zSM=]q  u9E;0ϛPO>1Fx.W`wo'~Hd|)e U,ϐ %#vB[T;"r"l꽔%5׸H`0;_@%bX3y<(ڲ%KJ3Y-W&5X+ ma) j/Q.qg]$RU qWP E`5^:֎`q~h KywX0 Kzr|~(rޝ?)x~9ɞLtx\\P'va/]y| z͹!{yywO55*\dYEt-dmkW\2/.Y|4-4&w\UyVK0[Z-j^ok$ բ!dPc]_-Ot.>p>Oy[\a*_*hB0j2MhO@kEx'Ŷ"tBP J]r4^X&-Y}IOT>%"E1fYľo)!|ڱm+ot`HbV%"ӛ>X&O9ӛ5w&~M&N|&N|I_$i/&?SuC.S@ˌ+V5{Q{F= 4(b튫}al jK5-|7jRd|ר˛=){V>'PkW\F]HB:_KȒ-ޮXר> \2] -.Ƌ~p<`k4_(zJeB|y~ B_]B¾ePmEȷ.u`+t)7lbkd.|”@'N\IRv1!\V|J &ZRG5RM-Fx+k'Y9$ے|^lwy[X{/R~RxѦ\$\òp;0P5/x,5G}Ln-+t^OH*-X.Sߴ֡_C*?iCۄhR TvAiFUgjO՞K\*bY7EC/=-wS?V8vz;jcñc ±cױa3w [JC3TxVm'זS?bVC ף[k?IOѪ@vH6ݢUw؝'[qǏ]؝'1^=cc'fUݘ[Lv;U9('@ح5vcR/? ]vxvVKl5מh(0\aVP"8P9$(20E&DmWkTI'N@oW\d.T텖*&T [.n:XרdxTKXJj?ي :+LypE/DPmWkr=fR`1Gl  d.tR*Vpj, K C[)|{$! D :4Y|+߷ zoA3 ZCy`Sa~PQ]7ؠy zĖa 믫>IZ &Z-J8dQv-9J-AdՒ]8F :$0ʽ;ͯ'UX8H W`[k/Z UE7u=?5 D1DH45GƑDi$-+ZH/F2K>Vt ZsRy{?רEvK1pd1-S^ĝtN'eX>a0 ' N'eËNTE5#j׈bQjQbQ# #{DOZ=OȒ;=ǪIO0LmE QˍdZ%&Je(L-fq'](9%+lGٔp= LS"›,^pɈ~pMwSV?nہ^ 7e`l;`qn;hkT& '0"hPvYę.˙]|>,lz<|1g6, ]vYeI<:/֖\lv8e)VJ.KF㜐3M ڬF.{ ^'v]tﲂF.튫ٮ=I{ { _>0OuVuv!W):c1֟ǸJ8|)1mF>9_5dLbS` \.,7̊(7|*^0er=0+DaY./,OܧIUJ_D7j!r§F}0A9=얊}(@6OEF(exbU^zZ)m+8edhW\^AvꗍV_-꯿Z֥տQ]nk*#5֒.֮Wgcݧu #xN N&/.:}>>ƍ.Fw݉ݍ}ot7nt'nt%nFW "񟩪SC 9~K)Way4^lLU⛷m+Ѯ<,ABwWvcW + ®XtwcWv^,J,N,zmV`QyEi^,N,EIkKmtu7u tu tu&u +ꊝSW+8uN]wWSW]q,-*)+آ+]u>%'H֓tUi7 5ۑGHyy$;sa D#.q5 U oבF5(R%8BPHvU2>le_B6m$|mQ6j{u6pudmTѮ,F3tMsիS]rP;רb]SXŀZUX RF i =?0v`@jG#j-w@TVovC; 6NN8}2?}(I|(:~(v?!P ѮqCuiKU+ijijRJZkijij_,U-[H[HZ^t}4v[H)dg IkY,|idj bTʄZ h e:L0![ e|\!@ k@pAnA!Ʈv7@}MYi"\]u%Pm@~TқSoғ%ىfD'%#[~Y_T˕Վz7%k;``=uw 쀎0X;`;z<y^$<ûd "Χ. ]|bRoo4X{',AAE緔r J5bO"yxxrE(F]ھ“J.? p٨K8Pkt8 yq^{^o58{^XYԲs؂d3Ԝ7-2׀Jf|BU{Z?T`Eiлb 9:-ώC{%,a +֝V…paݸҵ +JUʓ@JT|BTZnY:٬֩Ul:TuC0vv\M_`KbAE OρWhGT.2-,׆v?T*φSKR5`oƫW\}zCia}R]zNp>O|LM(SoPQIuֽGv tyRtTBH{2t5PmʪB`Y~fsB*MnAoimkFͷx3xCݞtvx-|.pQa3iĶ衭SX`w_YEjE*h/jHuRzB֞Ѐs}[(נz2xYiNq=Z~ZःHJtN2J4݇SV9_>A:C&v %?^-鱴2" \5*&f5J.XJjv˴l*k=W3t몮uݻjf(ؼJJlܽsݫ JXT^kH vvvVڑVڙVZigZiGZikii_0q(jzTZa?PW(ȅT2NV F2S_ Y+pJ3|fL3|pO3| __3|Ni i4k4g5)fb tY? ]uc݇ }b8'z#͉5͉D͉DMsHs9ѿRMf8ɧԛ] ףYfw(I%~873K5z`s`K΁:t\^΁#u9}ql3RXp1M*RfP9:8 -RL)eZ`T>tW-G: $8IpzW: tIp`K'IPyU`3KUKĥjR5jR5qjJc^cXi~i~4?c>~n5Ioou6~~(ka\hwqaHf^M(az{/Zxn2'j* >+BѮqg]δ#u|ҙvδ+iG:L;3mL..?e .҅>B?BIzBtt }w [/+typW:-2K%pW.J̰8fد啘J̸3Ą+1_+3^%"^0-٨öF z)=xXAx/ܡj=y{ ~N2PϹ+v\&Tvs\\]4R4qH2|K茯OHԦyҔp (Q> T0u2OiՓrq"K2xZubO:;QrDKtEI<;I.'l87mkhkͧ1i8-N m ]NSߥ<P0\@[ n@]xLDnv},7Cr*j?x*^f_Cv٘}h\Ƌ.ʆ܉gK*0O5܉Ԏ5v[c`uuXc]v;Vw;5aZ2ݱܱu{.l ~ͅƹﹰq.L sa\MMf&oooɌ&?YudЭ}tk@j@5 Ԁ wDZy="GtٓzP Ξ ޠםA og}3@8gg9G_o_sookG|-.^oxdWGHu,yR‡ul$QɍQ:AB ދn^{ɐl۔ {췵]q)/N\S;̿ҙO#7Oggřި?A?Fޘ׳u+&\`^sTyM0[0gy=k^O1z!meg%纚H4|Ew5yK{Růթ xqxmmxWٮK $4>>P굪衭LSEO*AOsԊݼU43͐>IG.ѳ엔2vv(Jl/6F4d{²)|On mREeݤVM.I T&U"&uؤzmRwMꬰIIw*k.׸3B՚ZXLAxu98ԎVA36CV|eg:VQB~k-;uFe"˵\U'ZUe۪:pU:`U}bU:qUE#'~>h.#)4؇O>|0i&**hE̐2pڸ { -\ֽ -\.C^6.C ^$w'ı+|rR J5a-5nŪ[O"OaDXD8NuOaDXD8NRky[]Q67;{z2xѮé8ec,@*ɂfHEl@Fgs-G͌#-Gv[6:'Z~zJllXi6P fJ^l4pBH%bnnX c[ΧƲ?| #ٟl>&df̔:|Ota|Ofɜ:|MfJG̯ɬYa$#*^^#b$Uq#I)Ir H"I"k"0V{$ԹI ߧ&i]!t<`~:AW,#0?IHj81ª9h.:h$u J"FNHU=YOU`Z.:I6Bh*j:5DS'DNq"TۉP?N'~[, /< O< Q 7^%W$nH"*d_J8i@Sby>ĈEVOP*&I4R J5-koyLD.P+j%]4 U]TM +Ҥᥡ0xO#!]r Z#M AAf23dv:AfL:P:t_d o᤾oVO`B{Rخ< >8X=pHn.n ;\\e{t7~ t t}{L1[>#|#|FGG{u'*'GxW)9kr֗{&*%GxW99wr/ܫUeeTi?&衭S8RAvfq(]>H@ H@ 8 (lZ5 Xլ?"e$K͑24p`4`"l{"\!!&._OpJêZȬgRYRK t5*>1Q nH4 ~4wtE$Rr<ȧxOrS"WN>BekseJq:uw=]pgr{ڿ=3wy3"m{`}Xhk`wO9W[p_F}}5CX"Y}5"neM%=TΓ[(ץ{5x:]IMy˔I-벢]q)/t2S//=L2_2S//+L2\Ů~)x\+藝Eؙv//~Aea.$ە+kW.ohݱ=WN3ɉiv,߰$ar>9:> _@vx)t -N@@UUXm b])zDUl bRA QHŪp7*>OdZ5R5jɪQ5*6\WuƑ m7n"nХtItI~KO.o_KO/t/]Fe&]KtIe$]ZetIt_B3>U5,gӣFPV|J0*|e2fF+#btP[f|Z_j깫t-P T/@r/Pp:U+.P\p^]84&kT>% U|6F {}팝ooX1=U=or>GJG+h=Z.{\Sq4<<8xOOSqUUΧ[z<+@\ @STFnT!c);b'==^?q=>=^==c1يC{>Ě#aGJ&r J5jʞx3%]L-=p "HyEjΕRs Ki]1ӺBSIB6+@ "5'cjN0$GƑ8I#iHk$ |I#bAo>Q(Q>]n[M|͎ń=vZ]PQݣEI=Cx#K+*1ppg]cJ>J{O(Epe=O/,-T.J&ܠVo衋x@k y]JmkTJ8L]ۖ]ѵ/ANj\~;;Qqv{vogG8;*Ύ-[Cn<4CyVм}hn=7"VBL'&C|B.I!lFMbO& 庌hW\]aqXMVV1& ~ i?VUaotꤤYJ,q8Q@Bx5BjTpZ&8bo||폏o_L{t_ S4qjä"|?84IR'#lG8bc96xa0_kH0IHU @ں"<qg?6<~LC@cy$?8VC U*k7KR%MGG*O }0,籙{(UbO]0xh:2xh X ?g&RwKTKk?GqS49]uB֥sGX,OK"ET|JL'9 qf$T7˴_淟v̏gqL<E#'etfm-%fRΙ=!çZ"h4/|oo_oo/|뛷o[#  8D)]`?D@i5eR;EwR[l~r>Ě&L(L(eBɄ eL(;Pf2 e'„B/#Iƶ1xFBoF $c&ܠ _z28 SxwSҥO-σ8N"@uKbp70)A.uvsa7˲dGCPDxƽUU/_FB=.F-J%8zz7EM=r}5EO?uSgMMS6E基K|>nU6z3"6ޡѷ38Rn(U4۬GjӾgxǹCե;s^xiA3d;>O,u\Ae%](^J.+2. %]Ve} tIw#=yuqR/1M"Gf1"۠}hZ)vq5*C^%mm -yݖ%kmrmp["-lv[҂|zpJ=SWSzL=^=SZ$Jyo潕潱.yO.ik_{{ۍ=Lәòe`N*x|A!O-vJm|8G-OJfSiFpv 3AˢD,ț&P^A \i?^p(, li?޾؏[ ^e]RuK˖%hYTвܖe|ܲ`TMвzAmY?O߼=<-yFÓv{5*{xB.5.dTR T)bM令)zjz7L]))*6vbq_y90hES,Yl +uàIW{OY-g{_"*f߯52XJEM~aZ!U?T÷utut3 ?ŞNx,{Ytg=-b{'D:]XΑriO 8ZaIK+pNAJRE\p re w֥֓2Ծtſ u5hcU^yza_79B]pw] ;t60t8 ]Fy| ١>N[n> 7bToI:#[ ]f?XS_D<PE8J7&K_j@ krPc0atL5"N>MB!{!t=x:)AA',&J ֻRj3z,ZcHUҍ+W/]C=efvECzaa``ԖZ軸9NNr9gLsݟבrwDQ>Ě mƝ =h'xp'/RK≢$kϜ*ssڼXۺT+ۺDQ"<DOgԾJNfa'S'ys'sPw r@ܛ`j@U j͏LTlJB_Ũ߾}1*b//}1̾F1 h<qh^z,ԑFf<jC.kU|Ft|#J,h<H! <-_ZwgpWhwOz9RkD|%k_o]}U@?~wR~oj< @a_v݁]w]w|uǮ;w׵ 3bY4ש7GcOmO XdC7E/AFЈD o_ QDB2$TQ핫pg;i'1M<ֽ4g03#VՌz%+j"<4K3"ywK$F C i 4]үuDt^NRxSkǼ4Vau? \|^jP{QP VVϊQڥFFiFiVC/A5"_eC_W=6/Z[jgb_"J` M_@ӥXװD@:bozȾt)b6D+p"~AmT=ZTңE/?JhPC(^QVX̓2,JɰeX3%âaQ2 ^ɰ(}aXjqۑCcj=iSψ|-FA2"4(U4ݟˑU]{R ˅՚7!;ضYRK7&K/5h'5XxN%5܁C!xoz@g7DP.ܗ.wpzG4Nc {G7cmO=۞{:cO{cVR)1?U?%~=~L Jm@jqJR)$N 6pK%N?ɒ9&c}ZswӅ.t.tK{BIt/]f҅ kZIU [I3P^@%imx)ZIM]GUS{XWiw®:Sh&* ]UZҍɻ BNjZ ZéQ1"T/U჆KOv|LP1"(%KQV i#KI)W(;v:5Oٗ᛿m 4Vn7]oE/l+4h M%]Pש~.KZ~%<߅) tyVU5 ri)zX4>#扑 )_Y*G$M+U4ʇXm#7׏og%ϲC KO>Ď 0 ׇHmitQJH#_o[#  ~ wM oY[ޱ Z+JuE+Rae]b6> w剁BI'+ yEbN.%|u}17EqmY,J١G=ҞOzLJgDOod4 TDrf+bܽa++bܽbb+ƻWGo߁?o[# ~ ~? %=~(P:50;Ro v4E l -^o<\*6EW_sGj M+%{l?['YSiV4ԓbu4`S ئ=~J5çw{!*|bO|#B t/Ħӑ:bj9<]X >zr>a]i#dšg>^\!Y K7&KA毴ͧ_mHT毴i^|JÛpg]JUJZZ]i^ՕV#VkJiju}Z|"9LWhz$'kzD4>yօ;r Yqvqv8qv8;q]88.g{]d.2"]х^+)J+)N+)zbm^JJ*N!;8o}ۅ> .څ^Bڅ~hJBߴ˾BKh{᪺ &e^Žf5ݍD("Q1(B5F}vzecv'.ڊdxe7OصECg%n֠>5&]E s1h0gJgD=qCQcjRque '8 I}_}b>OOp+ ~ I}S/Ď"CUa{HuM p3k@M+% \f Y=bWWqaϓgML}'u^6¿hVV)P$ etEYˬͪdV2+Jf%ɬeV̊YmV$dVYaA6t^ q?D4>#_=_=iF_|x"rߏ~s1"c|J0z;R |W|S0)נ(M?*.:tOkw_`%BCDBB(Oaoi7kFiwު{ Xop6Ukvv6lJCw?.?#BKT=R>lcKͬX>ψaʫMHm`~J"Y[&,^VV7ްOxwjb)FjjX)FjM>6EM?6qĠ qb'3H'S3>JʼnO a'5k{3{+{544׼7Ӽ3˾潕ÛpK]wZ-SLjmbz |FsJ%瑬X#o;&vywmG;Ď0|9|-GZϴ0L 00ia>X.+RMʫnm'r6Cv҅Շ»J%]Ûp. {aXw+ub`Xw  {z`|ݹR5>5\&#`qޠ|1%JE~?i=Du3"V}$pT})0&0\sigxsbZuRE|5g9TR;詅Re67wmJJU[T%ɟoC"'zif2*4(Wk ab6ux^Z)+3J&uP. *I +7%שqؗ9ML(䙃I.ٜrgf/ x<;}yM3e0ߗ/+cg~_o:}d1$~y}OKg[H]Hm~k(%{*%c=&:2u:-w{B+*HBS[k4i-UT(NRބ҅N+"#{$5^^e+rXoaL"LH5ST*?UБP͑0=|8v R؝~|iU,[c?UoOGgD;C͘]*p-54_1#e}?T4Q;h{} OVa5BML@3c}4#1H˩}e~ *0Q /S/̌Ohۯwok~_گ~Xkk_Ղwp>va;W2 T̆_KR-v:zxL>o M.%o-~ToKZRhI-~eIRS|SY>{%O4߳Y>ZRKRGqPtao5@(oկ{$P ١EDse:s!Og:EvALuP0DҶk$Z%sj#c9 ُԀoWvp@(oՎ:5292 n)K? wZ$ \$-\$k4;..ƽHH>K!Z$-\$ \$"2C'E=:8tQ4HC Ba|&EjnAvu8{p8.\=.\'\ׅzj JM)35WSPj^M)(5}䧿IO0ޯs%d.z-ISd%@+ULƗ (s=MK¥\iAY8١ @%8P=P-**Ɓj@@%8P1T{rwn-ع܂sչW-عݹ pIsQ-TOMjĈ_(bMIplD`jM{l46eMM usGz>xx.#z ,<x.0C%W;C)xH܇Ks!jxH? ҏ>{E^QW +޽kWh+F^1ޙܙ.<)0LޙrڙyMw kL{gO0)|VM_~ n\avzn fU`vS0ۨ0݆='ŅVU)P!ʛ>ȜCvhaѸ)PW @6r5E)ǦhnmSMѰ)WM M#;v2wvmMj\lN Q}g&C }iMjOwTRd.y1:".b5Eu*".b5E~"ք]谋 Ը֎Cġ_C+ ! Z; gT:qh8:^H;L΂m?Ynr0<˝}:]΍5 Ok}ZӚ5>YxZ3fOk"yߟO?4HlRQ8M4 p-A_: E(&ܗ.Ssos?N~:tҹ_}t7ҹo~o~~ }oxYQ8d`vd 퐩ƑL|xJL!% Cqx?),(4BS,U46:Tlǚ)d/oMaO*M.`K82t[p8=2-}6 $fM8ԁj;缠c :S2D ^j_ݍ#RËӱ"guC _ )Tl{^T%1xbĸ' OO>1f<1^xb\'O"iӗOwxS)n).N0AoVCU[9Bz DAQa_jɬo}6!%՞MA処)fS`Bv@f=ᑬĈЃ=oψ>t |~SK !ZHe<-*} U̬T?&>j ̖ *Ky˯!ޤN%kS{KQ9wC*C)z?R TRrjuRtS&|d+(w\ CNEhǜ_|lIbl>ڱ3uÜ!S-^jh#?k4-j1֌5J7@3bCFQ-o63گAUvQ ~M+ˋK͵_j'9 > iLQ1Bh83) FKQ7 "gP)5u#3 jA {K'Ç c aoCJ&tɤL4 % >ĚKr,| `*\d5K8=R?N6۵??~>?n[# | |?>h7s1QbDᛋ_Gb|p1Qb2iS_A<Ӣe#4"(mώ;f8<ǒz 39 >T|ޖDi{c3iR|l%+wD^hf{wJ2 4 yM]}ɪE۳pVjʝUgno[{]-*sZX3\kc׫`Wz~炵_Xkk7o]s֢ ތ^ڟ13 U?,/5B > >Uڈ.4@ң κΩVSJ =U7D^jfx:D44oh< 3x:Ofq.W}־]Wjm~/PWjn*yۋT%k|6欚OeYUՕjJe !dfTUjZjhfxƷ3>@og|43ƣ<}[2=ۣk])p}l۠Kڇpu4z޵?kcOyX??ç߄?>§߁O7|B醿>!|_n ӗ/EW[T? 햊I=PԐ_~@t8 WRǽdگ⊓j+NP+Nz87K&| ue,۩ێ1rs%g}{Ϻե|ߨPQ6Y*K YT;(/UITOkvJϮ:sbgѠvFX~_AHXn·ҝk2u)kiT R:|vXNk8@3d;4AdW J饆=O=8f]+z'#|/Cd_w.qohW:"t"E7]m)k h|Vʹls琪ҨL7#K QCaDQ_~v2)_c1oby&< Gy<G#ϼG#OǑg#‘g3#>| ߢ^ BBgA@'÷hp:BBz\f3|XlGe96vUFwQ> R[$ߌ|kccm YC+%o۪ ޶nKo"KHU(+;aɶE'S,d"SB|ԝRT.aetw݉]u ĮKwe캄]]3|M#|MyE7Ŋzo+n7, n 7DXcc|~ >#I^-oEz Rk$RC= >o>RJ t_Ԇᢴ}|5W1qwt -ݒ#3c%-oY3uלCJ|N#JZ3'9ԗ(n fl l; .RN ; r&PѠóU3:XaT> : | M(CܧpDXǧ[RO# R!_ K=ʾtk3ĈQSNAHU"W/5t9ySS%DߤiQ%#. O) ~G{1w_w?Np/5xi|FyVՕ J |-54_ pAi`<1#`RoᏏ7-@ lLl_S^R2"(cI'~(E.*K Mq*>R~JnnmS}([>D:β :RlOX|86H(fd'&:6}`~cS? >Ě?)P!RͩJvZ%oB9A'> EZ;pM؏c cX#a?(`PޏT!'c cXޖt_9x)`Ivy`Io7Ÿp]@Z6{U#g|FC? w+#JT~AE3u_B#ٶb3~E侳yi "c_+gWM]CDIVx-QN.2}-r7wYEFfIO&UIzIk&m5*Ц8 t$ = (((Q44(p%544/F~7EǦnMѱ)bS)6EǦ ~&tlқ%Y<ԀNS|S7XT<|5;Ha0^0RG0RGh#WG#a?_ܺn~Ybkz(ݑψs?a?<ڏX*zؐC~{ IѰ2MYy@%f5:PjV'+:Fv>Q QE=bTK7@3>,O#.5*,?#5WoX7P F + +zzJaް ^RVU^r-#)K3㽤T>4VLiɒKJ!VO^M1SSPj z5)RSMۜTy\J?D豢bNTP9YJT%BR|ૺuax^elOnv x4M'|8SPY># z)U~gog|]m}k_}X/O_~C~E?~CX>^}*ܞ<ZCO͓HOSB:7|D^jft|W7M9~p t_!U ?]{ > Dl7VO6j?R>ڰMB{Y@_Û{R0; 9*Dyv|7Bvh:GxGRބ;Pa5 %܆ѮaHC0tz C=!R5 )ڙ,i'lm^%5#~ny1%E ݡ"᥆{rDˉq9*.'gCHm9C.~e.X%kױtyk\Xc{n,'"C/B^Kz9n=J7L3'zX0=RK<,t(udYOyG#xxC:  ֬5b(bnĈ0E{Ԫ5+RUxRp Trǥ 72_2?4Qfjj}̏2S/e:L}>_>SGIAWRqHOG. ~0 l|40=[FIG- H#Hp#u$(5J:oۭҥ%]FetI0t?S[ +tzH5&{]{(룝!|d"^@[㻲m߬#F-Jw"3ba:^'aDh0 _#M1RS-5HM1^M1RS35HM1lϺt@.7u30L;ߛN.TKth.D+:z)BIIKIPRd6|5 FQ旍UA[K+fx%F^aU?!%BVM+54ų7#5௔ͩWJ;3c\lb^c· 5̝k6I$:3vשX$P o-;y;ozxnESZwuEZv_^J>.0ψ ?g7|>@uɾLƯ\0T@|t^Ʌd_ZLolH[v9- j1!E~,ЏG~,w?&ǂX~,؏ \X cycŴw7W7Bq%/nfF[Gj;ucӁCv׏c߬}J}dj}G-NQ%.`kJVjV쩏TנG; <ţC~ QU/ț5 ٮ2<KEOZE9:M.yTmFUu˳QU= 5j0/4U[Qר_ ~ ~_~o׏+¯OG{G:m_,!VR|t^*F_|x{GR;⹰]ۦhaS)ڷM>6Eæhxe~Y~ز=h][{J=]ۯB6hLQvزydl-\2[La7tɓsKHs'g 뙜krn89<ܾ?hVoUhVw̪G~~#Goo߃w:L:BK_RG诎0SG#/:xS K]|ȥ͏Kyq3{pippHvӂI )귰['4RB?:U0X&PFT(poꢗ@4 z+{t u!5V?Ԗ+UK>v"ET1_h5 AccN-.uq9k瑭6wp d.CO VK2"QwL˥'y9y 0z > I`Kn0E[S<#GXvC خSGW@6r5aS6M) lMAwS6aSWM Hkzan._h x"=Vv ~aK\?HDZ|]mg}k}XڗZe9ZXB:Ky-,Ûpg]Up|%_)WyWJ,i|4ִpnjrl@JDuxڲ.+(ڛvd+tc/>@l_/MMS)O߫Ql,שYH},]N)m+7\ƛp']42,"ů榾ocJ^aV?_ &oZ#GjjT^jdjΚbxbMʭMQ-V]ԛjcÛpYf57Y~0f`{.b'[=k1]Z;T{سv)^Y؋~xnŞBXK5v[TROyTŀz ާlBKyK_z/#=I_S__F/7]v<8Ep{E_RN_4"Q-ї-[ȥ;_gY/Uj uG*g-t4aY3BvKJyuyozuPf/U/d<ӚzP)R@FT%>+A>Ě[t%=BCsG^-:T?u5|ٹZjh4*Q_ i?.|xEq> qД|vj)q3J%#Nr Gj?7dC? H`,qȥfFjC)^}>RN@d@oƚs<#GΪfC8R⥆{~f]'§]-G-_/?~o X]|O>}]r<'rW##|FGFFUp >Ě?yN45D3ʉ Dy>,=i:B5HiǦ MjIswl:u^>ãm2r6ܱiD~ ƇX|˟~G~*O-0.h'嶟 3 (/Ȅ5_z:%L<Ԥ %JgKE]Gj M7(bk}}/kv7Zn}.`\.炶/`Zh lQ޶_گ~Xk޵_+~}׾ }Mc)k"kߥ"}HmEyu/54 &^'-e_x^/Wxq0 隷WCx %a u ` m7vҰi+z,:G n HNAQڟ1)1Ojg['yxd&#53I?DΤ5#+R8iJRن]j3iEV$r&9 8R3|?m m;~CO߶?Ujj^T5j6תylk6a6xƸ΁cıscgñs9sp9q8v9nh?g3~~n=$=J #|π$ @ ς?o۟h m޶'mwyB۟hmmϏ?]ڟkb/k|M#|Mx8 NƁsI8p=pNNƁpcYc>(&8w'v  ۝(G?=n6ç⥊koTm@AOD鼦B hmZJVj]ƑG +|X.A3)MPKw"3bV?t`#hk{q"< > 8r  |=ZA -). E|xRѠ D @sc!lIʒla.`zpεopHD^zj}ew gjYP(&h|7Ao;M@qkeLLF:~VSfbwk%HE8,\JMzpH '˓%j.[hv.H,Y_d=-YRw ,C~Z jj^ :HʵR}|$jZQu,Ot_> % 'O7|Bl߶_CT[_^)WWG:~G:XfVh{ # [F*na0^[} [Y_[yVnmܷR5:V6zm5;jy  8x3 F Ƅ9c >ZDlgbeD(0?Kp300Z7b}쥆fzby}f\?Rl"#ҾuԀOY~vLHGP#C;]֋_t|gaG*tx7++\V&J⨤W#{)R~ f7$*.]X|7xb87K~ϺDt `i7s=RK M/^Gjona0r`PKY %٥cp/a<.5֌Gݓ[HLJ _]O]cQ#~'J9fK5s]!U?,ETOX&SUVr%4'N7s/8)xE d.;;x+Z[F#Jp3#9Vb_lHuzLךoWkV8DдAiS*ux>m0FD:R'C@;yYG;B-j;A#rui@GT.KR#$`I%rY>tKQnKj`IT|eI;̭"b!i*rʭY(/.30@vr+\Fd.<-QyZ ӵ<]5OFBs]dVq]Į=PnK >昲]ڒY6.!wOP!{l')iKXrٓR8?q^bs jA~ Ղ,jÇ!ۘzV&ȭ-"2I.@N s""19o < 7]H:456"Wt9zÿw Cw Sw chccCxiF߽6RvXa–]]/w¤]4.ЬUMoKߖz?ƄiJޏ\kISwor^ԩ܏e\irV"+aY9Z?4Pa [M̡V7܂Bk̡&eֿ|ß??|ß??)B y! 6_RhS.|]H>/&/Ro )Rs~\H̓ Jz6M#DI;kF͂ig}]s~ym׵1~m1ym1um1?[] RWyZ.%i5i^彍K4\B?<םƳKG%_=Ϙ(Gb!8e&W-Jn[$>D9zRLH4Hv-(15#-xdP9Ft-ĸT[6/ⲏxV%50@<76kȖm-[?i {y}ojIfb eI@_E&v1(قPΐprnɓL"숏}$tNڴi.װ|6f) >|9zT&!{!6hӵP'b3=?ݏՏՏG?^W?W?x_x]x|}~زT\[͟_jš>D'(quYPm_?eؑI 6&ߐNs=_[lt2@ P%Uk] P=,J2@1@!ʶ<'/z"s `ONx|=اV Ͱ+j]RJX ]6%%lPbPLU#~`D>/'bXl@:\,\ /=*XvPBPgr ՜z&9,Sg9%{K |w׳QWlg+:-'4DS 1x]sg]7/lAMV>~*9Z{|t:9۳Ļes f/o osS~¿yl*ܣݟ4)SMyYMyVS&m]жmjwmU~mkmWK瘟,j$]Q"~HZW(h~hJvτl W4!gEN)Ӫ߰O\mr$V$/S7-WjYhK4lYr754qe1 jrM%ki\o,a96[}Ce~#j݌aƌ3e0cҌS͘?5Ξ^Ξu^gO]gw]g:{:{:{~{c1jǨ1j~;FM+v7#h^50f3[pGRnvRU]ŴEnzUrYU- 7Xb j){(!brr iY#) Lճ!߸{&"i$rLg}Zq H6 yÜ~/~᪈,loU{׺bb8VmAZ.,VVVAjȁjTEBj?{* wUVdML:č` w, &c[HDiʐR e ZPN؂5qKhߦeՀO!jE'v[|X$4\NUEz&мr5 Pۛ&b'W0gŽa"uHå+U0-r9ᮂ_C7о/0uڟ-jF~VjFGHŴ*+Bzh=/hbǽ  ֿ^ f`hQt(dIFњ^hM:.EGzYFѝdcE )HR5I*H/R;IY}E۷h5th#%8\J졠m8NĖI%e; }-S8nyR- -qK--v-|lhjW(ؖ&[QxeWo`\c@Ԉ'c]7G!4 `k:h:rVj}MtL&21)i[Y.6esYIipqѣЪ6\.7Rqsh Z!6xjՆi|J/iG./â7YoF?~ѯzFooߟ7~?9N[xV= @4S)B$JwYQ)q#uPD4(PrUdIEMl-a7CbѮzh|یlFf4hԯh\Q5k4ѨhTu4hhu4꟣d~ƙ!H8 :Iݹ'YɁc ?T\V뫡UNf9 =k]1O$s@k)09ZA8m\›vżC?dI{~u"=!B:rpvM,]mͤC?nc -_a9B"sr G>›yd9Be$zb?T/}|Ϙ(1aW׭Vl ag[½]/3f1ՊgVBh ]`\4aϝiFmКcCof{Լ]N |h5M>qQ}٢ '\WkɲpmEµdYZŸ~p7.]ղ3\Nd2,Sv'v%-+ډGډHz\N 9m-; Up?QbۉcͯbwѫY!K@0V_Ղ')7i 9#C{\MZ*YI8n\bүR=oVj%&8tYRZ-{;[_-U.^da mXBQnK 9#vYRʆzV#t{X'Òv[&)ǩT9Qe  gvRD`QѢVn4.PNG#ĎNj|6ӱlZF oϢeAA[1Όks J 1!]>nk[MMyAW/a| a@p;rc ˡ! .TBg4pXٖ1S4MoU-MsnNJ1ٽ}$܌e\ !e߆DHK`blAv8fATCVCVz8koD b nFM|QjۉSb ćeKEm װ0It-U"R;[rl*tQUȒ⪜_XYBo3 q1Roe2T/O4q?1M@-+'˒-gfYS,9gN!{[eM c`%bqV3ӗ4LnmGrr\~/F:7Lfɏ !$'܍\\[t][o 4S)'_q<V"1ӡz:so\+. OCZUK?J&-ߥkүZYK?~~mjϯ_m?~_nU~ֶ?8|tΘ'F+*$n^BDQ~upZ:\j\b?&PZwSu}7puO˾B#bb|Š]ڒ-[R֖T%wK*ڒnIM[RіT~֒v^UyՂG%&8EmRe.5K\U^A̭],fw!vY;DQj!C4U;D8!U? |NU&7n⹁⣪Q#trC %Dr9i5f"ά8%UKNC EXQd6 bsOM s9yքtS6{,~'j'Stu=Zx,48B&(np;sOV.}ݴxc[]=BB|(0.4KC¿W]WCWJJJUjUjUjRRR*`w7s統SWNE7-Ef`f8V 3_~W +P]7ǍO2Ov<&킟x9짉ԀHG'rU# ⇳d `&7D6(nxnOV ­X&]/3^KKK^u] ]hҨhFKFCFsi4>Zk:>Zk:>C]@]@@?Y7k\Q߉΃}@s7ZsLn1sf<?,w#ґhHt$H4t$hHu$hH4t$#83TjFFͻ$w.|܋ ?\+uaS7{G0vcG0v###w Z҂Z-hj Zڂֻ-mAS[z-mA-Qݛ@ >0.;sX-v^OkX@.u;mϡ-FAhDjDjD݈6hrw[#ڈg#:{ bv^k{AG$ғU߬n\b .r\AhxeN$vn;YIô|&f˯1#cYqFQ\Qb \!dR(z؊L }ه z\kR(2),cR(5}y{hpe8I^H:mpTd8*I~6%%yڬWm׻%-sD } Uo@A-_L`hFLB0/r &3y3zsCkdf:配QZQfBKo}tubʼnz]6u`QnHu>Ɗn2nɠBШB-9tr%loѭ^^/NYRK >ɡ;]G:bѭGg[h̶{3 gYRM \s1_ ѝ5I7\N[,YM)B?p;sL1}ֻsrjczß}9r8d i<ǦS~+5Wԏ"_sE1Wk\Q?v+O1e7{v%U1|r JxEU${Ӹ+ p&[Z>H)|De`Vô 2sZA8n\[[B–󀂼.31lÀVĆigbXz= Y t<|4t%Ub_X)1+ Lϗ-hע~,ʵhע~,h*ע~,hעdTkkkZJ 'ն7+]w]W]ϵ8dmV(1 !}'+e35<`;i6o=+[;By2\2;kmߖyU;Bey'BkyøDS}ZzoUOo'K6dIoe̜EWh s#ar >U' _*S-6}Цq+Z޴s=Mh8ⴳZ׸Ӹ^yX/ah04ua04tah0tah04tϮsS%ǴL,_="K*k>痴-#>7Ĭgnas,۱ 7S6z$IxOr =1jMrf;} WUHP_7eq]q}{ >#sM}Up۫ W\Ut-x<WY-Afutn TU>v PO(:ۖnŎ7Etw/6]eK c}z/{s[l9CS-YˇJBXxhՍ8 ۰*&=<˗aYȒ-)S[>ђ~;YhK*X0$>W-1zXW ?cRiժظFU0:Br*4~)?7S?Ö-7˖aƖm)yn'1[}z49M=އ˸D|# ǽf*pי!߸`M*Z[ͧu\ֹzLVSWw걩bUG\u:WSmfK3b$#keK]$t69#4~vZkM*%'8,mo@d㇂QVhMN|> <[,D 8|;z#3-D)'SZC_RTax=ps-K4. yjadhvЍ=W m%i- Ӓ ?#x:,~Vg?KG5,OK21 FE ߼[ydDKl۹|v;| brOm ޴sZ ; ޡD0DnM|rČEkhYΑZheY\9[+zu_Qdqݲ,[X\3/5p>| R?7uan0-%Uԋi!_L&fT(^q=2$P~%-~%-௭/?gI˕熈rVO  B{g\N^K}?{Ax\x^`xݮx+;VB1;3@~CpU11e-\%%Uq#; zVGIMZA͸D9U~ShX]UQUQUQY۪Z*5UaF7rpb8 vpݸDS-@ ݒՒՒGK*WKWK-^-\-~~z+2K#RFg ?86ZۢȬk ,Qdy:(2X4%nQdZh_+3>~Rn@ ho 2p q hU+??٦jC0ptɊ 9/|U'!W|H|rƝ*[hu'./pI2[`t(CApҧ+U0|r Xl]1VI;6܈v,) LJ_2)A6O;Gxtg ȇoO\05c"[γ%FW6qǖj{\c"[ޏW[KxoϡEox1 "Jorvy f E(E? cH _5$_r?H`aKYί-w(zgAڸ!Y찉\Q %RU YŞel=T X(Sq_r ܆j\b?ܖmiߖf-?kKÐ!7ːaH![CeH!NQS4)fNQSw()fNQޝi()g]=C/![Oې7_4ۢR `.M |x;CD.;.wA{Vi!+闒`\ 02۴*f!9ϡj`1] _N5JE5aP5yj(wmTnM6BZ J 1>qQ7vs)9ܖ7OզN<ʁ(#]OJBfq) ^+z ۧH% ){(zM&oW m%iZ剝U@.q *k&`lxӵMZ=*5J=*J=*5J=*uJsTj%6C7֥7ֳz7XXYuc~mn{Ӎuonq'h !XI,=LDV erkm$r&Zk,: {,:u{,:U{,:uXtz\\srk{/չ(a=۴j7 [:OZ^\a\i8!_0t!!k:3\1<9@V?ah04Pah04a04ah04>PZcŁpݹu'q\ q3 |f/T9Y4)1 9cni(IAJ>b7dfw3ڌ6nFSQf4hi3ڌg3g?8SγڷH #˒*/ }v =_&@A}ÕROO^ erQbO-ޓn*3J?ZוLfnIm]N s9!U(7n{Ɂ1zBb5f=|Bw9zUo>ϋϹ=nax,C2S*-3/]zEBOB]Nޜcϐg:᧮*'HwOGH0˻r Xl81TB>QeIm*8#.~E̿z.T_V_ms?5n8J6\l歺Ms ms$~2r6L88f-|r.R1<]*.Dpٸ7չV`emmڷH o̖=rn٘Ar"` ݠeN]tkKT^U>B,ˈgۼ*6 2S3Zkt"k2Jka({(?>qq%eoTGhUNLXg 5ps <}a*䚵КH8b\5FhU]#pSboDB 3vh-x ƌ5\N s'S>SN;Q}$v ݆sL)+6 2\N_6<;` ȴ0VrhrT~}\EJh,/с2OG,/-Lsˍ#>`(-do*,Vu~_t-,U5@[YX_XҁZEȲca1I+őŗ( w,C=)lS-FiUd8B}ٲ?LQ%,AH-N亅jJjs6VLnnA3.PNUM <JLp>di+nю豽3]51\m3Dq0pUlip_Q!ݎ˒Jq{~yOAfk.ȗ 4Й1pLRKW8$L8BʁpHE:r+%f[Zo!YKUk\w`b%3W%p9zÿrmyΆ嬕'Jڽ^&J,)}ovzs9B?MME |]CjȁۉJ֦'F(}ц)]헥߾-ޥ~YoZgxw'sq(EΠ_U sMx#*Vi/C\Ugn?m&F -"STfs~ VL.ȗ8+pwt2T L1*brk۝:H8e\›v?B_o)a`A)a牻˒N kSB]/宆ʝ(CmbS;fx麌 4Q+vwCD..p/ q*U'뜺^9k:49r-t9Ωu\ S_ _  ɨ<=y#N5O9y A鲤J\qGd=Ct-p%O1Nx\c`gSܓ亅d16ł'ĘqfXڏZ>o+#2oț KquFя&Gk֛ٖ[[o8sy߻lʦ"0OvZA8j\6 *%I͇|a'>zi'49# CTBkG/hn3*4ߖ?ǫUEWKA-V#Iccro*gt?{N&柺Wsn 9X*aWOY(jA݂ѳFϝu,:zYdYG=EG9z"?~O+{x؇r~S=фA!*xvKl=JxX=]N!瞛I|ZoK, ƹnh.a)V?^t~লsl7d0QSymo~ Wn+)˂s6\:Z .qh׭V,\Tzs6 BhY8KJ 48 " IM!by/ Kе.N`rU1X_~hpùf'r|ʌBH^\?Orcksvh=kwrԎg:[ZA(i'"7=C/CM 3>3Mr~7ֻ͚§kƅpEw;·!:2 zD\ȼ+t9{[75l r z1tg /Z߬ 2]N:@%CQRl 䬹O""O")V_'|Te |!e;f NV|)րz{WޛKzoI{Kzޒ.={o޻ޕ>z//L:J+Ytrv;께bPY&D-(%aZst?l=(zPE?|3VK: ;j@7K le݆Wnw*n\N_6XݯUz&qWA@Ț ?tOf!zz EGX.X3'$2nJ@|q])gX)V3wוMr+:rU;4t Y[[Wt >}0!]trr87!DyB8h_[hC|!BC\Rv> 3/ k廪.W,V/$~3.TKBGn 9l\e/dNRS~mLuH.t3Zb|5#pnd'Kp9|l  8$.593/lLH]/Sw+Mg,}ۇ@|&Dtm66VVkr*|ϖd!-)1HGu] fXR.c]K@"Ъg<ˎWr2Yw!ךɦUO3tg 5)V_~ȸ\NCƳKIs;߹oe&~| )+)~?GEU9sK$>xL?x#֘~bo! s'8&$&CX}y;S6Mg&;~d%r9|pw]x_]x~tqu]x.< wڅvمnR㪔Y3W7CL%E$y_!Y",{ r$t:u0e}p;syu0|aZ݈s>e0)`hE XU?KB> DbcΗ&65VELp*%f1_r?Ph5mBxa!0B%9=|ΫZ NBkߧ$+ݰ, K^봝ۙ;jZ ~=>=Kkq&ĶCÇBֳ9a,ʈ;hR,(v+5'Zh 7˼۷v[Na iGSaΔ{;3orD_/,"MZ 2Uϥڶ=MD&~3Zh-|634})Vpvr> UBn6t!]# Mbwf1ڥ#4 ʗ+ʍ֕=!lyI9QnB A鲤^TVfBYt䷋]Vp-C*Htp7: :trTFt1gjh-)os.X/k\\e-ه@|v&YˉqsCk0.t Ca?1cG$ N5 ~/,*) k2X2zOS'zOK'zM_`d>'}ØyƦnhV&)f1}v9zYyQw>g1S 9M}++>$~6.TYܡ-?ڲjYB-B-BhBNѲHr4j1{!Y ]vBf' 30%94d+,'dR(-\(x)/ #~xl$~qng:5M# `V97|I!'X/^mlFÏ]1C &^mIrZhMWm? gWi엎=]>(1˒j 3 ^ѝ%-KY}sUm__΂{p;sk)/&kҒsov긱-)o^]\!^7Kooko%Vw@,PAjh?T+%nf'q÷'@+;V7|:7؂߂=JG)MR(QJѣ>J)Ad:Jq_6mx_6mx{04a C5 a_P1 k02 !@?fNB05]3e: VcXo RRe) C>ʹ.s ~+7V&9Uy8Oy^jr ?tKZ[oh-B[&--; 2q2k`ŵ޷Le:7񕻵q2ѢIÀA>*E^E?hUK͖k5G;7 ֏Ƴߍgpa ߸x6}CZ5)7{ĜBN~~{-.{)u)=t)=KKK^J/]J]JϥxaC簥sxa]簡sxaC簮sxaK簡s9lFt od OQPbeI_E~dSʹ m|f'n%'!_9<[Ӄi2&K*'e+iMC ݠܖ|_>;oq[և-lY-Ö-7˖S[}<Ѷo;v݆]x} 4qZ~l!]^bX&llJ>ق6ΗKM>q{Deh2͂t;ߓ=lDԘΛGYãŋ/~|/_f[MIƲf⬁~+ mMx 'Ah Ѝ\; =F3'˒*0>=d&A!'.ɢ0DbˮBsp;sLQ՟7A:AbBkR暝 4rj$ |^{"t{ ,> 'm-6]`\`:~\yd?;A ?(]P S}tWu>&(o[ƕ\.[2A_I(jVll˰N ݠװ8Yt-pvO/E%lږȒcؼ؃[N W&&ݖewg+w^EW6W1%ۃ.Le^dIf2,coY}ܓ65Iv]?F~+˼ўȔwasݖfmER&k<巫"/[j\IX-@IK%eƫV1bm,菜\>rCN nKAes!F ?J]TC޹5 <܃e>(Ċ$Ӎ-ǗFlhN v8nke[.{a|)o5<X޵ω-u: oj֭M_;9$Oi::thu8{$<|*ppݹ}%aXR($E62Zs-\ 64=9E7s8pX7!'X3=׶RkƳR\g;-sYlH(|r |Yti=r 6JLpyﲤ>dN;d (1~lyUeUobkUwU_V*VYU<]NRWd1d೤uS-6izX`UW Bl0nMmUmAP<YKzu+ٸV5azfLg[B`-(ۂֿlAR1R5U"{l/GuSp97.PN+fqCZ-v'cOU7_yChu+Z'zV;>}=MЗk:p|hl&H3b L9?9WT|ev.70  _l Bw)!'X~~<569y<#3kAj}=yJϑnʹT=/ߙW'\HևW\kgbqhj jARr 8g=ɋ +@$uDbrk$~u5Unw`-Tq 0Y`#`#%قڂ*[e V r`iB==mUvyeaͣr qF="9(U9*!'X~e C@x@Ud,9Y=hsZA8D]o)I"&w$Iu>+J%MJ GI !I"GʑĨ# 'VHGʑDGH'W݆x2ȾrΌvr;C#UL-pƶmm$>$Ve9l#G{m#GmdDb FF&>ad|6w93NMƦwܥBDQFʌoq k2:O{2n:w{2:7{2:wd|D)w;OG9No͹0f\+-m%xGƳŇ㇮7it`7OJyK3DTygӞMtH 0BxRմJt8pF+p6D3zq65+!'o.j{GX$@UwgPBkӎГs}{ |guNQ@dIpZ\^YY- )ۓ,q.5Rju!eZ.G {.C <6>N_jn&΃?&'ƶqe;[mjTxpP–YeɂjZŅbܖ3YkdH[vLg<%ut-=de6J(?v/ܷ- t~ivJ +SV[j.xOmA$o%1Z^=Pj5Stjf,ynoE?mUzw=jRߟ%u?V^k25KYN35K,cuқY{2uү5Kɚe|qyG_W_oW_}}^}}\}}!+FeRv4bΖP `k!hPjhժ()Y'II>\g()K$$g(y>:+ĕnZxbY.}܂R[B\Tx/u#d7R[\&/[C+a8{妌 Œ'N6`p3sq8j}痂pD0TKQzs˖eE=WbU QgO׭dUѧk,[猷<\xFr#uxx]:8֐-mmjuj5uگj$PsB bRQL6VF +ZE2[x0I6|F!9D꯲6[bnh<Ӵb s"!v38Ӟ/jF tK&4 B,0n,jU3UKh-Rn~G \X!q:nPnH >qyh&Ֆu'du,$Qjz Ֆ/5klxNF-'jv[HfG~Z8SFI q1~?AILTr_&zh˰z? j"_zWzKM^륜E5U+ɒ8p͠louHo7 LDVqlzUpjϻY3.l),lu_,1< 2 ˖t^lb|bv\eKr.v{DVq-uЎ'=Ύ* NFSr S1qeN,X|#VW&/[obZL iE}\/%UNeؚmi\mi O6u|ap/[&KV[ }A݇R[O\UbK;}W/|AG?N64ܖ~B, NBwL|ĕn%_(DU^q5D2C~`~\QLOUКctPN^ϑLެyV˿EMh?(]ԕHi %6f˳5t8`Ha~oF.K_G6w(eD-G?m7%"Qtti-2nĹv(ެt B,0. lU?'4=8J-RZ?(]Tlo 73)i5 ꪊeMdmXe˳6`$;2&Kj+ƒV>w۲,͂nǍICl^}pk(]dAAۂ(L0w=nPjE/mV[9U[E4s9I[:lV%%'%ԵHv[Αϗ,y/b ]r5\q-͗E(7dl,/9_ L)ĕ켾n%jWEru]${I\+jFc-Ct8=LBYt\lY.w]^er^}6lE.{lَeSvcQ磜MsӍtp/;w=7-ɞ--|9'Rq%D2ߍijcژ1 mLS|7ihcƴ1MmL1UV=6RHv o{oreɎ+R"p(9Bm ofU>ݫ8pp tC%tngе}LGrW_ɹ@̩V'ϣYb{%&8{Dz*] ^#xq Ԋ S[FOB!/paN ;@ăBk(D&rK8OYtVmw[w_خۭQLM.ѝ5 JOE$$]t-9qrmb|`5YRI=O2c䜡b|2Y}򚛶M+ܴsҹiܴsֹiܴ_s:7m4,<̕z|r I~ /ZA(m^#9 o1 [PfJ?%]TCY&ˎj&VT&&nZ7rcU]n^n3K(Yn/7Pgp{,7F( a0&à0A;5W@.eI6_Ҳ9m{Z7$Q%BFE|з@or jxuၧW\'gqI#bWsnuc?["&XZҷ`0u)&xpwl~)KJ~|⋿pѵt׃O\mitpf:Mnj{n̍}tt =*G&]UGE{B9*[ne=kW#WO.0 r]F@d|O3Q; ߭v9zugjӴta<^`OQFNp`0xnN8>4\kl4&'Xo8^2`xqt8^:;8^:8oo߿4|utMS7 O.SD k<9 _ɹ@S-|uV[qq?=w8뒜ܝ'A'wu嶬ɒjT^;'.l鵶I;ڂ.;bm-rz-rҵŒ+]b&Y[tYnմ[V;kEU.nv[ѭvY[٭&71CMnxe fVzB"KjX憷]`fK \¦V[r#ɉlwf}/3G>X)wžuYЧ*ۖv'k^<V%%x|xlpu=]=olm/#PK#vT/"i#Cp뺇`!J!fhuN]׉C։։ķekYɵ։C։:qu|L=,zއ[aAÂ|}Xoa<,_?{Ã2A:OQĩ Z9(8FKA D'wm}=izTxף6ޭG5sh֟?o}Ծ?wRs~XO.RČ5Y9fPKh ~bf3?o5ߵ"qbw9.P}h7 n}ΐvliQ4y6 ?{2MnFvsoaɹVMVophUSC?g<|[l7cӪe/o>ZCN[_RQʹe~UQt49e_ʎ)eH<(2CN|IPxTePw (с`!hO" ͎V VYH+\v~Dp3+:_* (v]9}Y]1:7񎝡d+ 3(YqeF\R~ʎV.8]+- 9*q.;>3Neڜ(W/ Z׾Z;7Z?h?o~_ +R ?+|ĹL9 W>8L5Yk|ĹdDJR8ss'8w8HŸ%eق|#@3]%Ng]+_ xO{ +N'wEʁ YV ZA(m;G"ͬX_`G6 Q|0!bGyGG`TnAs.t*?);Џl[܄eI 'fFnPnH>q KEr (lh$ th=_]EjkH#<:#q;(\zİэrj%^*(zAù4,jA՜d\\հm$q]zJqFÃbs*8 !'XOg~TχrI>j.KF'xm̜u;E4ۗ[drRgɴmVpJ+* ô(PMn Wx7XVUOATp~ΓZ Ր3Tr惄Yw˹@3iVڔ_zmm1gDsVYRUϷΓlŘ2VI >qy"-ݖa[ee`-eƖ+F\v,jD.dZcӨOEVq^^{0nc &wh#T#1e*C_jizIZj^j]j}tuuyuV%]j]j[*JW߯b*Ul}S_~Ul}Uȴ >79Ǽ(7`{X&|dа|; U\o߸}smZ,\g%r qmsZ?+y`-9l8"iΨ۹FqLwŃʔ*2\v9BŸQSg&aKr..iUw+RΥp ~u.PN Lw[;ȸ(9x1Kser˃ sbÑ(%;w[i~yʹ:sȚxίZb,V#`g4{ ,;TA/sp˹\.;Tmƶ*f![)k?'_>G(-{=G\/?'/_˞>]HM\|r 1/7iU C:OkhV InH7V_߭_~}3IwWi}iʸkm_g_)|&*(=-`U#E͜/ &Ân}:e:X/_@/_@>_>x"?Ṕ{ 3@Th;WPZ'h961]ySRI9frպiϑw545)|޴B9[~IaKs!g[~U,g~Yzcyv;Oӵwyv#b}!ҚtpӹOMy4ǧϵ0(ۇ19KXXZ/8z vܠxi^,uˣbi4bJzyd\F'2w-RbJ%%[WEy,s*"Ŗ~Y_EW_%}Y_E~,%}*"JiU1(2 Fi%vyMC4TLC|LCA)A^Mȳ]?^ h>P~d"r]*XDVq-cTkTkTQ3?uB{=uߣ]^bTۖ_Q-;V -mv{iv%!`29l?[JAAjeKl%Yv!7xCK|Ń~ʪӚs9%-#LEZAӹ7-V_y$tb4zgXʞ]N%:dM >qu,m9SԹ7d?Q܃qnyCFK%zCI5x ր_3E|"Y*̶۹/sLneGZ*”I8\`"ES?Ul1SF+BheeI(R' v,.Q]l9^EVq_'<۴eS&!vl!bDp<UgZk oV;ҫ!'X~9MPlBo!@(65't4nIjhkCE=Fv$C ~vhr :Tl.Vu͹@C9*-q-[Q{r$fS5M(pAauJ\βJ![Ue_j ȩ}Eawڝ;N( VO  {K >EڒT|L?:>r[jdIXiɡ u&W,4dQ!NȒz< ԐeGUeȚ'gq2^"69Dnrv4Ǭ!5=С:T:TPءաo:=ck׌eHX"KꞱ5ck\3*`-mG_LLm]x`NB0irm5b{]~./Sh-q$73扵khUuӛk&u [r6] u.I ~-v 9*1Yюr9a#u$rQVd& mѝcPEVq_cO #W<{ҖAwfNC(O;;"XWiՎ5J&!vriX~ZA=hLN rR_N9׫((}v+( 6F6\Q*\&o[Np,[rɷu ӯȂn%M% Qn*˖gA/S] bb|BmMXLaWB3 B{hSmxZsôd&kxrgB7M7bZv=KrPb}L3~LHG#{u՚v6_.54u:{R[TEhnPqumQ!>Qy9Ex{frRn8ˢnvn$[n#tѝ"pY-XNV(LۮVl%Hp !7XA7 wL{JzVbq3z3HVFAă_fv`J~9LY}~ 9*Ycul|/pBF 3q0vYR32d~nPfJ'o}r1Ղ/k֔mb|GO/[%t75r'.E}O3>}/۲|\T"4ˈ=Q7W>qQVq߶}<>VdIIcKXM},kIH}l|_A-%5 {ne7u -$]9)%pn&BBa&}8\ E]yM5ZԦ8'z.!%NIÉvWJLWMOړ^"_^"G)2*Ǩ:*tfרררȿg_ً\uV6UnGvY1OV7E9K-oh\*::eL 4Ы83,SF;eġw6~Znr?52Uo\ B9);|w&rGHum~#wwiM+<|^Ԙn MZs7Q);~eIkzDM.|'_Qb+Y *quO=㸿qqt8:9ڢ_ky-{mڢ_k躶xdem?Z[km@8Iǫ\p`\"%k5Nzi%fqvPbI+ת~=y2BN^_kkk^[4][ ][bڢbSCsm3#?_~|PɾEEE///~}v//"oßuu5nyǺzKɺuu[:O{3u]=?Rd'Y~ptYRnO?e?doO h\Im;oۑ;-wrbFAZhmzCs 7|9|mƬ %Rn@ YXcf6|X c8} 9+P&cx6'D v:w8iٴ:|$KvBREo!'XD9?e$jn&Ot,)1O;d?Ko \"Ŗs%wfmL岛l$,[0QfH((lWi-F҂OjKHj1\wo2eɒTѹ˦fQR[O\UbK`K-~RzRiԔ]=q~ a&@GR#Kd[%k!7}UhuUUUWQWѮW>^E^E^Exzz.3J\nb[Y0;*Q#ϲı+{8\h/f'r|M(F*2`d`5:Z>Q;fYH;Sl1É S -R++8>`8:UQ&B v "G v9 ߭N 9v?1 ~ :u!#oqKҊrU[AF;bx\%e!B's¶r{hafrU7z}Ƀj7T`= qpLbi bt rcoӶvlyl}] 9]wuM]9)Vҕ\iKB¯Hk#w=kG^{#'mRشǾ[S'@z*"{\@YzVչ%QBN^5a$LvW$D/?sBn2^>V'NTTخjI(gȁ[?L%k-3 'wvQ;^,C {yd*e1̱յPӒwԎj "-8g'@Mٚ]Mv BNwDuX7?kh}Y0#69k}Y08 B./ f>935r_/Ν'0j7V=<>{U;h|C?L5^O}m.kp͹$\6v\ɸza)Jrg!'Xo=`Zb$~w.N;U7LZkTִ4[z~^/ܮ 7=]~[/6ZCN ѓ":}} >7=&KfʊO,>79_tۊlSkpù!Ci;!>A82U}>+xvv4i[䫋-8$<>⳻rV' ba TTw_ޖ @ݲЪ d@~N,uiU UA|MuCh58,t`@Mn\cReD(6T0tKe+]% ǍW Mc&kWn@v<7iu8m&g;oO,!'X/k/sN`ƭr9q71G/f\drk$~wnq^K,+V!c]ʭJ'n(KJrL/CcY&O5 n}~v>li?`Kli˶XҧvpXLr(Fw[-Qz n`/yPmYQS]ups'pY1M&"ږ& a.c9dˊZcS_"'~]$sOi48$rJhm;$08'Z>b >ffG$t&o5iuvFlVAMPCN^_G_[[[k/mj}R/eAi~{Y:l~{:,~kAZ~N?cAe9fb's(';wnY˴4l둜H8\`Hpb[H(e_+̖/2büBkfbrU-$qW'F,[泎ehm(BiVkSgp9ߑ@{+{fv%șïlZ>z\4$Kݔx(1d0YR+<ٞuk\3j5Qtm^XVŨ nTmjƃ9g<\NϕU~# RwprېfhKdIptCZCJCJzMr]^ȹIYx,IB ^!7ysU#J˵ps +جZkV:+5kVYgR}JUfuVYTuVR}JUgR}JYgR}JUgR}JMgRk=ԪZ"Ue=k=Ft=e=ԪZX5s[dW-K~+)g}WhT.Z-E] z)`Hm ɈA m C[u4g*ӹ(}TnF Ο(B,Fhn L!%}s3J q>quSEy%&"%3p;xF!' /=YDq s zcJ|³1s͹)RLrRf˂s OeVϔ_[:Fzpz%x4}kN -D:;{: 2Jٰɮ> V8KlWޱrtpӹǿ@k9L9$OVt~Ӹ@3̇V{؀36F/E4D53g!o-[F VF{n==-,S:[lDJ pdρFny[Ha}=joxc*/*@ې 0 ks }P9Ъk@ƃfaówC8q 1KsX>i) >/!PF(3.uܴ*Ю7= ?o/n-o!7YH>+b=|xgrOT:|e;eJ@ż,NgYYl(a=mCWמFT-K]2 }<^wMVrWIK9ޣuWܒhf= k_1 oC:ofO[2GLWޔdZ-[oa/ 6 >B;:|o?ƿX>0?nz h7¯oU +R[ֻ~~^~>owڱ_j<۵;o ]e0F9o=T U+gl~pK9|ې"Y]aA]Un+ٹ};4M*G1gZA|4&'Xo>D+3h779%_oq)_ZA8B7'HqgNV>vȁHշkpu]+#z ƃi~),r`_9W}n'藂pZ2/z Vo p/Bỏ9#f*W&-uo(؍6 ڍ!g|` . 9.2SquX 6@HO<`.D@o[u#Z)yjzw\ܢw<γ, Kڽ𩢻DvMY-S\'R<ట,ܖs RIޖяnPn>p[{u1t_kUuuk.kUukkkրC+THg9s"&/KSP9|ΓǓ^V>StnDMbO,eK;< \ t2FhqR`ˣw' OS _9D_WsVMzW'ZOq\+o\7mX8_6xetk4Nd3\T/d4[p'\|vq6Dr'B$Ugz.HJ ^a5\U,lV*9=gP (LI)7a!{Ŋg<4 ':i{8/bqU~Ngmr/ّgG?۹ I0IaQCz2M_AYR=>HJق.1] U/[tt155__N[ehaKv/*Y<_VSOhj>嬹SkjK9Gm)ũǑ\Wƙ&KD瓌*ڕ?WE.KJ;gvI8JnPj+[jKq%&3Ec1C-F]'_d/6?jWLVql)Q_OXcMұk51}uFK2k|/;{Bk|/;)zw>T2T2T2T;cN9^Nz񲊢-EO 'Q?.KJnI1JItpo_nKt-ϲl^,(D?v)QDTKy&;xdbK%-o}x9q]ƥ|` _8Rv{Sh%lK}/f]C.*z1J 1)E㲤RIYݙcݠwLVql9R-ݲ' Mxl*"KƑrud=M/F-'b۰%_En)âX G\TbeK"^mU{Yv[ߋQ{Yv[DVq߶AP sRA߻b5fc}R,ۑMuto{^%0^?/I\X&1k+$V>&rMbY'ĚNbo'0X?,Ö-˖aK[eK-8 P[J Oi;OS"Ol^v׫QjdmK<>O/۹3Wɒ<>O@MEm]|<^[m^J"V;CiKX%#O\JHC7(Us[m"K_~߮[)*F=~ a@ƒfiRV)(Xg>!'X>íS}Q*,|}Y Żu$ /DPA!EXJMq|6INnDw:N&iu hEZSh7<אאCb\Cb^Cb~ y q 1$5$5$/#˖h hKɇOlM5:#tli[p* '{e}_F /ȒJzY>>?u>ϒRNNlLyKqN.(e=k-%ߖ)o2Etlim˞aK6겅|eOۖm +hjo[q~Үb{ڮL͘f~لV[-/YiyߋلlzY0jR[O%5l-aK livYDVql{G_~O ^}l_%W{ɿx/[1,qjz }XMn-^R>a*HA.ZKdmKkZj<] ikWa }KMj3IGXĆ]M4w\lrƖ'%OԤ<-G줶roQ&[e2{dRlQjzmQj-ʒ-H-JβEI(;}lQi 76 ?J_&Kj4|tYC<5 Wix[lK-ea[u$ /(|͊]'=QOD/dI@qCEtK0.;Y-I|6LD&*L'sǶ)tk& vd"/[VW?]<1\1qLCyPqJ b9 4՜svhWOn }yCcڑh*heu_ÑmA!mn W9pmÕQXjZ.Wl=* ;0";Zf7>O>#&.KGyRTӑqytog"/[Vӫ}$$)VΑ󊿝- Y-\{/R| ejm.sňɁȑW6@ƶ`NƟA^_A@P][ݠܐ|Jݰ2Ywe&WQM8Uk|4&)g { 9*]}i.&U+4QnB BHE6W݊syzyq+/]WyA~!9V ȱ2ǿ+טcR`HY!9V"YꕁIq_Lf۴=DZڥ;% 2u'HZq+arc^t< b7'wFiurl$c `??cKOR=mU u{+'$;iU= &'X:c9.N~21Qn)ಇj$lv9+6lV@23M bfƒe#di.bq1ZV*gWCkJ۹@-M uMRǔ:)u]SRNCRNK)̨ŧ\su,^4l0"vlKDPA.fidm Eε,/ʹ݉LP֦ ?乶_ Vo AemշI|W&\+T'V`Mfw7ڍjFFFMFՍjnnэ z 'cy*qH:(IZ>ʹkY<|xkdothῺQ2ɊэՍs$w'}ҍՍsoZZKQP|t`9-+y\m{L5+6V=Z3#2=VpVƘgV"orbqPZt/~\`p N'\kiwy=OY堋,yu*Du-WYt-pun#. Ys@[]?NZgwI۹@| |0slٺLb!1Dܓq@ I÷ZZ5n m*3olYÓ2@i,gxfGRd_kS2Yz% a\IݭVV2hTKjErhue]O֡99w%cmopMtgu8gV6kϢD>aʆvwr](eXu}ْD9{[$ܒ\JV)b3_o޹Hv;uAB-dT#y]X1 7"9 A-UlВ{x)Xג{ExP;ZMͰZ~&ZVwu'*au_9?݉_BNU{Ts0B߫E_vV';3 gRbm?[%`w[b_jа%mAd -ȿ hAV /-H})FGIh3Bn8}VBk봕|8r'Wu;_"m=B6JbZA#r" T.*av&afjxX^ZK)7m.!'X߭yyS$^DhQ#DHuqg f 9׫2g O90 zw~7y~PBN p:cV)UmSBB;϶[#@t2\Z%.!'Xo+|+]iΓ@:O6&gW7vZA:Ovxoo]=v zRGaZsRAo[q^ߜ ^n8|4 ~Gtu-߽ܢmQ}mw%l)Kh֯][[hWmn_~֯o7o7>O!~ov; ߜXô:)7s׸Gx7xudY 2 ~O;wYiDx*&/' [yq;Zs<Ξj$qp؁0 q#W̽|O \v^BV݀OEJLprT>(V|k!V+j-g[z4P⿔Sc[GȁMwT=ZA8\L[B _n -'-C\7_8O 9Dž9XZړ r3(nPv%"!] n̕OfdM%'MOg79-VJxP-na$ ~Oέ]~ޑ?[aH83Ķ4O\wK^cMr&Y {Z :O Ph+4j2vv0GaZ 9,6 N/GBgBӱ%f> ^2QMVb\57: *ԃ/ZEE~:24N$O(7$4Rtn-ցɾmUdRQKTˁЏ@ETI]Ɂɲ.X`\IvXC_RCi:N!C6k@\u(2l?!9J2f5U4[OWJ^ӬiZf윤Q$_,'GY5 iy x6:%˒j \VzZ75,\v I96̐QN<lA9nv5.bq,יoorjJ%5lnŇsBEw>O\?㫨᫨?O^Eg5/yP킏4("r׫sdr ^ͳ^ u q&^ $}ZDÆtBQnB zd[xzr'=trCf+knyoIS)1a øĻՍ8˘~k!19*&:6n(HQnq{pYRIwm8j{aq4糧[kljQf`s,U4,`V'.p-Ѝyn7;v`ȇ82jWdX ]}p>܌6s< 59zOhd*x OU/OpZA[p{ MdU3&!QMiZD Y}Grn}kh;]sn".ga9wͼ;;[Fj_Y!C]e^C]^dJca1,HxR]3c E.Uܷ-߻-qjgד$ 8o Kb#]}XMTS8:y5JWnK~4'ӶHo9Y!:Yp.Chd#rL4g^E"~P첺/9*Dwg*j*v졠Z,/p 4?Z;JbfslP>rj^)#`as6ys;I9ˮi٦V6?}ze$_(3j+G(?g.KJSpEq4W<;Q2D.>͐t،z%n\!?4Tb7О/}-繈d<}N@!-넯,K- yd۴m,.Ub A2|'bcD|dZ",Ҥ9|ϐMXc4-'.j[lY2eBZmmOABXr+:q9\J$ĂpAm!'XWckk>t@:5/8u`mHOP_{zC@!=j[ iª MY'i Mt-rJ:wL<ξ$ Gw:qE6{V7t&g=+eXέt}R ?zZ ȓ( .K*k$Yy  J_+Ydjk|k|k|̏ѯ11?ǼG1cp2ӨvqKŽHùYŢ2]khZ)jlMZ~{N'0c#~H,c 9-.&zb[ מtL!߸pC_7kW]$q+P}ch֬ϵ@2eZ o3i1kZA(i-kH'N)Q#gSI)ec:'ݜɼRn)3 .ԋ)Y .v$Q4g_%VvXoZ $C{z U(AtFQNnuGTYRC=R6n25ZDwS:hQo]tjyY/uDfeӶqY.^d̡ziVBzV,˯gNS$߸Ɂh&=i'MZ>f8 RvS2 mnYcw-ƓIX-KH8,h\,kl9zo^9!\N|˰k9Ew;ۦd ?S9z%S%Zb);k򾖘z-ѳxk XC7vn֡C7vn֡?.?Gl~xEse1_T 3SMW mi={P~Aig/ OZE7K$ǑERKLb #Np[uE , |>qAt4J̠8#~o^wo{Fw=~;}_̓N&pˤ 6AOVpn' *‰fUVx+NpG9p5j ͺ gLF⤿WR'Fq_! *Ey`#]2bI!v'S| `6zL"Yj,5&&\>M]p˸XlᧆH:ZAzPೡB}8|,t >P޼|A]>7΢Sr'7M𝣾 Αi/= &.[ }Fg|!^P>,#m.Y n% ?scR 1>j̆)n`:`TZ+7EHBJZ 1+& H +9B ^ EO濔Bjh3H)B:v~rC#ܤˊwzyMKokS&sӡTinZU>榥XJ ڦOe\yAQ/|@%مOvE9pE"IhOXhbT*a_D㑭bxwVX dc? ς[|Ju:d\̥*AXu2_=r%W;hmZִ^1}Gh{vd-ݩt>.}KZ-vDE >JC SWr-vP(NV o՝6g%B•*W%%Be6gU J *D\Zkr#]S:%}'CAkW(|z%N[!=Zh@VIj***NV~VVViU*UzfSXЖ5`yD(e*K¯~;~~~g   3+8zbGϱ*((W)MZ<{6>BRȌr v{HrOQD AQqqJK/# >/ݬݲ5m*((TK뚦ņHd#ia^ P NjfWaz5̂VJgNj6]*G׽ia dj㦽/ 74)1ÎP? *p| hDXGXWfM Oh._Q܍t^P=qX$yGy֓HsSMơ MB7gz ]..)&L}q&c-X&cߣ<,eccݎ]?""Ku^P3^Teؓq"ET$u))HK`ZF.VX×e)u+d(eg&]`U~ƴ7cyi|J̘6ðj. wK +WkT`~#fvtF+C <-Y[ovֱB*σРƒA}xP><7RxPsP_xçf`7|g[5Cx m& k4UP͵_ H;Υ*ATL!_Iё6tox6Uag×of++?@Z4ȵ8$2:| ݥr:Bjϗ^B^RK^^g𥗼/.*.|^z}_?Ϸ_vS 1` 3b;c jI3.f~,%,5R*?KTgR,%,Yj?f;G|s[ hƱqU߅>š #݈n~ х_WMZ<ۼ=1\vD nCSj &POWbrWVԗ }a%5(&DPSo`[#mљHUMj܊,إ( X+M :)A6?Hz '=T~g ADd3|A$g5 FFM~ Cx`h<0*QoAV6KQJP5b5\/PL,!Qg"MŒlMs99m9NqZ~NuNitS霶+v8m}L|z[mg5aOuޠE*x< t uOަ/8lRqg]d?e##sMx~O)/܉E:6nP|G&^j\_$fیJ2}l/] (qJpwAgEz t 3|K`;QHrj(=TѽNo{M;jd&Ͳ_h-PO}lQ: |Atj>W!WJAF6\ &M`  )yL/pjk3cM_&ވ}TZF/(27zHv22˸IY>XĈFqيJl#66L*AJXiGs\5hF[;ܶ*.'of'}2V#HM'5p%D_1zO.0|;mov_&\EAnQ煟퉀q}/ba)UDYצvMNHZ762xS;ߛ͛ɛZKjER+f] OwK!;W)d.Fb]؛h0$D(eFcYpbeZ7d+府(eӛd.pohrC"X H+t=>^T*)qEB,i`fYRSSE{EE{},3-+-c^hO^{>h/^/1w'1g;1w31O;If ctZ_O4:PXW)ͺhΥ7Tw˸.7'83O֝68g=q>|y8kVK$ -1_ؒJ: e:E+j1mbd/EHiKc4wcoG~tᑾy__t|/F%o>o(WqaYW78KP߯!U_5ո+ %J޺`OC[1*irxπ&ڕv3 VX6k&rn5rݵLunP^\wu^P#<[#Q;F[dOspn;pu xIver.x yNN۶0"u`Ya62Kl5=ǩ{KbbxA 6NFj;HHv ifE;s;EPwn܄}&|vMҝfܹ ߹ǝqEX4q^| ½#§X - ( VCL w'`a͝rsAN̢GGz<z]KPSԚ^'bKU7/5xU=!ujdhjix{)IOl-ݟ5@q >pc!k&i[2D1( w31FyEcnu/U@#I{TxNPcVuPuyA0w/Xh6lmQ(W\˸skgeU !>Z̰hnM1-Ԟcڻ >{UizԹHg)&[h|JPA0lAOH+I3 >JQ辪OxFägvyNn|Jh)5=J[T|~Q#PFb'1ȱT?nAkH`b>q&vv0k?L3`H/(Wmi]*@,,uf] p=|r`vm.;R1V5Y^-'bLxAM*s&gKly?<۴f|?bsJVzaM(~59^>Vjښoݳ]|7A8 o^/:0JO;V%4|Jx;B,}\ _|!>J7ڟ\kksOõg+&I6{ Rqͤ|) .S܄!NVT~#W >Ryx%DYu~E&| vaM c'n<*~J[[L*b>z=GX :u`35Z:!7|5Ky ]Э*{hBCP6t ] GCVRhJr ~KH/W Ď,8;\%H+dY~ZɪaۮU@p 'H~"ҽhxR# >T?K;CB rț.A,Vn_+pQ'$6q$5U="*F%5MtEl[L$Ls9=pu\lZUYQజ R-gݤJ j ~ _p|5Qܧ0tҠLZt^P#K _fɼQHn>뭼ptcRe#\}#މr`!.7WM˸sIXz =5jW "cu}k |y\vl;=#Fv-<ٍFX.5;#}l"[*|kV3*2ߚN:t5x֬fTN|kxwn aiEƦ)xɗ-tBէ*ql$.X(qu'm~GZFTUSSUKSON.;OU#MU˸.qSʫ6<bxAQz|AcdSzv#/&]{y1x_ZyyNZyQQt҉ODNDtY'''y"⇊.sްlQByAm"գGtu\\OyNHk1,\ J)TR :cb OIWS,`MSS `wٯ@'=qx7γ'aTҤX4Jѯ_I5$׾Pµ/\µ/͵/ok_7{#y6F 67Rc sot1oSGN xQ]k)AqeL[L% Ze-lH_k|[o72&1XNZ$-cIZNZ佌1I˘濤 |.2 2[Q˸.ܭ,խv[BjWnJр&G"ώOQy y዗ #0l >XqKU7/Uxۢ{R$=I'ݓnʗ֥ (Yeַ.P,[QIAy{T,ҵU[ 8%[ ;iQQSt1NuJpˁ]WW?ٴ>{>{Tg 540Ջ`ZƸ>{{BQd`40 'Q10jJŦ]S*62Om\MvMش39?2ܙeX66F$.'"P\y,!Ľfor^g:Z[RaR3!wZ>ٵFEea<Z= @h@h% 1z- pŪLjD ZamA V*7l6{aR}qP =m2$=cMe;÷ w%P@X8i=4"\%n֠>W=,U0kA~:, 4x?DM֡f][9+נf{H7=@0|=)Qä~xi.U ߺ| .cC\Ltޞ.cx]hl\ƨuPe?о27eo;M-O/;{ä2n:{{]GݜV a%>.?CU]ͮO >% ;ގ ?=QX\J7d MM޿oDZ$ o-h{6x/'L\YBjru?C҆|wy;~wŝgsγ, xo_₏<6 =yu)*(ת6^T 7|Qy6ck-lo[9n ]H拤hzuIh =T|. MfU{‹T%H+ڷ)+rOk-q z~g.@?,=`+'O˦V|+mY̮ )$+ Px,4pٮ㼏BV{xw֥/^]Q@O 4 B[x-FQ}J"^j,K3g8zmźX93MCS#)b1czcα\0- xt 3.Deqm7îTcx2>šKKAGLRbkpա٩/⧺IҩntsOuOux7Rߣ~9*귣QQQQyTQQ?U[?V5uѭ7ݪI[_tM״t5xA55\+6Bk82 XV-iT{*uaxA{ ]um+:/p5NWý_i{~{bzSzQ4eTROB9pqVC.9a=0 $]XՐlU>b>[!`%ܭvGV,"S4^\ 5Gn)a edۗ۷ooK[_O5?ݶ洗m MeڑcA5ɶwGX)2 㿻Xoz(P:/IeJwy=TͺQ-K~zG+{|;?=-ݾ&|oŭ`Z vӓ} Am+.2஑ȇ ]y^ NkpF.EBv=FB9pq.ݭݪۭ:wVnտVUV L榵nTj!^Pn7$nfD9pM_3H6R[/yoh.So7uiQXbީ+zqTI`z+2Wnj(Kd]m7]蠊Q͂Mt JuPT@/l焰rjK~Սb]gԙ pX}F'b]˸p{vϿ;;a Vu7;9>O4NM1]r~tp˸_*=3cEliEiE+bO+TO"δ""_YiOyźXb5^P5z"źX9ZBdFýߜni =:5({s-7EUsm=AvOvs2neb|ۦ˦6M/:d~i~f~24_̯IptIu1 0@o*$_$Ipu9rm/~ˈqBaTjm!'z+PuK6s3ʁ ˌFẁ1n{tٯ>6h?- #X>*H%<˔T{ny~C+zt/ >%FMSBZ]Q~XsSaG,iEהQ(ת6]67EfɌ-dW(b K{+˺-\$bx [X3@p>Lj̫Zѡ>6IgXIǐIA$UlR˸_&4&IG/d~$dINu= 4zO6 j cdQ_Q\a@..COo~XhފʁumNTP8dpvo˸I&G+o{YF%]% ry@'d+źX9pw%Iɡ&y)k꒢M jr !'s(:6HMH^\i a)/^_\+.Y+c}5hh֣:/˨"L58f-n2)(l;x[/:;vJF@<'UJe:fKw޲̿⦰a) JNnX{󳺮fAVza 4Xi:_w 4RE3ܻ*WO_mOܓ'/{'mI=)oEvڊ[";mEVdVdVd"""[O'1݀P?%xj(.; omk"Q\ Ir}5lR)1L+qf| R9M+U4#x ӂ/+@ N\  T%~ k6mzRPxA]٤1KVҋK,3ImY{PRI/~ jFxG|ǗJ{Dxow%#^$5I4t֠454j ^(5 piԴqI'I'MZƉ6FqB`c8/].M=z yS_& X-XJ>-+&3v j%d."@> (8kwCK)$Ю̈WII7Q:ܣΌݏbUoKro 7x]ڛWK;HecVGX|IXu @,qp;)΁IJO'°hvDa!5`X<K ZƦŎC&5هUX: Eխ5tPCHu=Z5 à; :aпAuǒ=\ ~RA:l-o_0KUO/;c%72xW*}fn|t׽AM  |5fcc~b֟?2(WGE鼠zX>KSoV(WdE9p5Ho{REO&ӬVd =TnYL+q #.ǥ*AXf`B*$2hY%Rl>ˤs,ϸpKUo/-:{Gεoa34;Jw yOwOpH'tx@a oV2=oOUE8å*A#~yNL?>E>Y%~ +m$Zlko Ђ{F^o/a>Okc5tHm\x@pj_yi|]xiDKۮeR~ˮqk—]]-?Ii_IJoR(ޤơ7%&&|7qMꑚޤf7&&MJk-~3vuk#F Uvk E.U RE,fB)r/&}zHwH}:S5߾=|h5[h{ֿ } _!|~?/oW_+ï0nszzDmC `lD!bBy]ȷKUw/hL=)kl|GZ|_& _vs# X g>š?]vE D(.;ر釥 \Xs{>š߈M\B;a,ï^j[U*DU3lyoMۃ>N|@tK5dkzG 6@ۤ:{fg oYMqR~rJwP-[ 83*x\kWI~sxEc|5oOUDV<)΂!1a)v.okw/zXF RES,1Ly࣐0X^2-PByR٤󞿫6*[)WdF9q']fSZB"ݤ=,j< Sb+e|g3F>Vh=qy snǻ$6̻v¤q<+yi|5/PrO]1%&DhNOy mpv"˥*5a% ^/t^/ ^:/,^/sدxŘ/jMx E^1IuCcjʐf+F!a0E[^\^Iu#WԟEvwK9Hƚ#g͊ZN}TTyA/Ŭ/Va*$u_<MPcap=LƧNᚴ=ORp ];# bUs:zvHx>f6] )Z? {N'.U /^h< U2L@=Y v; }r>8CԔo eGX3?eT@^Ō2 f nV]O_Gp= Ljco/I `;v*^j `?ò\jd-- Ǣ|JLyZ@0f^=k,E'/WKO^f=̛*T%=ky#v##_vweɓFl#9O>'Gޓy$me~ᴜʰufTҩRZyhi97i|gy6T9;}a (+Z}P?) C}w߯G?Gr5 [p' -YÝͣj[íꥊf51֦-PTdg^zXf!Xi 'Q.Mer4Ovمpn/&] ZVbiíZJtK{T [Ōl»KVS 9:ߺ_.هz԰rn:B{^^D)oPw$uy{v$J.VXW,NMrhNEsS>_t䜃dtjEVXqa ]z(]6B֦Kq޲ںV\Ky&]* uoqnָtn^Klvn>&Օ87}uuJK/#_] 2|S9D`*G>\J0lԑ-M=.JuJFwL*ßꝦ|;Pw#+߼k]k7Zt󮵏|JTyͻvRȝ7#oyGG<֕Q-`3 !Chg_jW(e>G.?1Ȕp}@ -/J~i)օdW~:~xwnNz>Ls) oVRlnR8ƽli`6q5B߿zR7ץѓfIK'u|=&?G $I=iz 28KLE]/'[[۬ݸl-ݸ#ڧpZR Vܭ9>T}`5?+>Eڟjh ?a2|/t;OaJkъ;킚{X|^æҼ|' ~zW~)8rT%^/  p( 8lx;Q$ ;Xu(xL0k,^'*AXZ2Bkpʦo{7;0ML{<ƧĎBDť*i ߀?!-K?Yۯ~ ]ҝS"Z:4ǥhim/U4OFHڟl|"*?{EE>cR}•)|D+S58 >So]>|>)|*mWFHuy6wγߝgqyl<;~wγsm)hP{p<^.^*6>% =  ntp8VOGX3nH^7[}_ pIeF׵!^jn4xsܼ9]+ ^u&b9+Cjg9?f %NL'm:SrJ0c9C*̇L)nxh|JvP}Ȫ3rJ0mn3k4(|<{94HGkQ6y>< -gOo?/o@7y)QkFGK}C2uz 3=, >š_gQ/w4aVApW$ĕbRS#(>Jb] v1:OTms*tKCT]J0ef ?#S~1A0bO|%Bť*k_Yf:C*O㸢!KBC< rߏ+++qeJWnyUӪ+^u;s'䉳'g牳'g㉳'g牳N=qv8'O=q68;O=qv8O=qN8;OsME睷 x/7\C75H)196_^h]7ϐs墶Gߖ2WЮw>WI  #;yA©JkwZtǩ;N >Ӆ8U8Um+Cj;7= >JҙP MMDOMD4.y3Bj&Df 3YWJJ쌡ՀmD?ca9y\CԹR\Ա @|+ROOKnnZHMɴRE3|T cHЩǰR"׾Ux)Z~8 HD}<&#b6e(mC¶mzkضM,3xTeeఈ?`Q=QXD\!, (mkfTt 8C_mX?@ d ~ ~ 2?87B58A|+_mT=ނU "R yYW#[U!% jM4Jw>o/kW \7<ߏ4wx=][U=͙TjOsIT3d'#˖ueueku˖ux:yO[}Z|:|:yO[O[u[C[Sxv[[[޲޲m޲ז޲޲->1q:𧟋ßQOѐb7>T/ff!(v)^hGX3ӲE_ iٺ6)^h!kWuA/꒢hwU>ADÞj6e+jz-}#G:,^\ўaE*W&w=.!V>,>Y|5ૣ0-[вl^r)X!CV/eTZVekekiDy2)Yꒇ z5T8kTq"Vsvkѽb2>ԐNN>`:? | B[|MېZؗBKIBo:>Tc0 PKM@e{9MsKU[@-kܮ$ 0.:BC0.[Hm /U4݌;WHe) cs%}dJ~z>| ",>L$?gx@* XG+g-%;ψȅRdgMH jIRg/@4e޸a4U7ER;Jb9>4{:w}SavRȝ >š pq>\ԟwF\NRԯ swKU/sZGX3ɮ5z\1OR^fTl抹fPij~عvR=iW@pOC~?ÏWB|6'GJ?|5 0|c%,X#\eBF V>U]FXڂs#"Tiax\Eb]{wípX+| Эtx+R+OXq0A8|Jƚ7d88jnəltcWh"oڥ*AtUNƚ( \ik)N -xڞjѾL˵xy=8k/2HG Mz=}RTy35E3gr>UH {V ?/1/̟OXitun5 -R ߖ␚zR}Θ'uGM Vn=ІԓݦqJ(\E]?K+l'x)(RSTрQn~TbA8e@CWڃsT ̣- >A>~~H!Q. j.:pƇnGrB*9oz|5?<^9|skHȃXդ2mFsJ0ixa%fQm ?DȢqzNG6E(Fyo_%BFtTңݰlM^T9[o&̪wTr**L-'> }6Vn tr5VJ{qQ[C?9@s%8m+_X` OvVۗ۷ooK[d`Q| 5: L(v/&K&M) /5ĸ]!/?m~_ /owVu(Wy4^;ڗfEC-]QfW3M]q^Ӥ1׾O9t>ӏ0 q t;f8[)=Ҩ >="|XR<)!,/5֭B/oO?'ß_IT{5!%>JP|4 yo/Vnq}WڧZx&?šs@#ty7d)2+*=`T%RC*:Nz* חg_K_@T_\)SFN=%>,9i.^/Z,|w/k[kkY\kAܣz,jR3Pf] g .^u7n^u Wj=E4W6 ]]X&U=EljDRbߗo}}n?7쫚{@ V(ר 2tYȄ+q̄͂&leܿOS\C-qܢᣮ| v>%T?T%^;C*_ )&2AQXn zLCß?|>š?3aI`"\ZW>oZ|up.U yyaKwÝ;γywg;γfO0H9 O0Z+\_CFCzT$o[ |m>(Wa{4^V9o۟cow!^꒣q`NZ&-q`N:JcNZ<'$7r4MƱ  'kR]y ]-љ:U|'/hTh[}TvVq.M?Z-2ilRSl_D‡F7^Y|5ÿ ?$zl׫IeS-'ޓJaS`{io{ khyo!Ek}[X"+o| M'Dei~H R>lNO7I IJHPQ̫o"\QQ%EPDGVrZ.tQ9ZIxySLcbv'| 6dWM1lHۼU/H RHhmOݥ4J1퉕?M6ivRpK|4yB*N?_ƱE*X4^ oh⛢粺d9iSԼb2>;Q?Dm'j]âI{k$vpw n?|?9\/0NT={Fq'B>|k}xӘ(RˁYnCIWO_mOܓ'/{R'UI' _i~;v(Mv†vty(Wz2xE4-`t}]Ñ ]<2nE],iaSRnKPz4+Qwub:>t5&P>Nk0Tt3B8!_ >b'~h (}:( 5ָ߬v/t䄕˺:# Vt>'SR{,-q4T?> :Ǟ؟xsa@1-_C\ RER ~t2"ҴG | &_塌σLD# >škJ9'x=u2X~Da7 Vg8Gm^o'kbvhfVx1klF+-OY_oƋaRs°&T!Q$K'v"0u'̌5zӸo]uU=,&5}+:ل7##.} AI@fpJǍ>MòRp⥊fY*R3a 0b7WX3|GmW!1_ų9B1$5,ƪ%_Ca7GjSwJqvW#J^7R0Tv&_ь"7Wyjf]`VZ& atpcCЇ, >_2|[p|C0*v_pM*Ӳ;R[l}RźPG.rPSWY,!תjkuVZhV^_npuy՜XuҪ+cՕp =D OW8Ά2ffVh'Tcɍ"jroW\;9v 4^=va%f?4fw.v.BXjnE"7ajKU/@z aQWu차ayfRG +nRH:5F(=Ta}ç_c-없_bjT <ݤ2 65a7ڑ#γF/4uJXyS/N2H~ :3V?^!:w{|,"V:T?<Ԇye:ҁ !!'×㢎&H[MYkR ݤ2aٱ!%k/){4,ćQJ!o;mk:B)oxئ!:|=Q#Tڏ=G@D0|Xj p~JHUa}ç(G|:^:Adx:)Q>g5 /#Wl g, |Rts][kKUO{Ŗ#g;6 +<t\铎+ݤf8*;y6WdqEB >κp[h\w#}YWw?*ieYWB*B Wᑚ;u[0CjoOz\T&i@ֽA$l Bj>mm>maD}zZ 6\4a5U-kM >šo,cSMZ rHw>#K\7P27~^~9rURס_UPKXߝC];y.=tCw᡻x_?EmK,C2$3m9_3'{e$ IV}غ^fJ{@8e@YZ|Ϻ/05,2lٲuehy/[|EmK}-[_\~Uݲ{E KxK}l27=.Ʀ#$P~> >J`Wn)SjIt5oVK+GX Yal?:-H+bF}~(Rˁnd.kytm}p@kMu*_;a5m?a?6}›C]^ߎ|_{Ӆ.<[ O O | ҅(|)tᩡK³5/0BRo{y!@)FV|v[ zSۜZL fX ~#(.E&؝bqdqovn 4j2#5q9ap8퇔 (@ aR vKUO (Y" N< [߿." jLKZS!p>);N}\C*E\HxVC*aZ9L4Vij8ͦUkLT%>J2KX nboG1k/zGX| 6Rr4#>=臥6"dwSp>GKO-CorZa%wPׇgV& ܲy_TCx3|GWQGyHv8j(D$(5ģdWo| } 1`|X8O9)JH5,1qUWS`ӔL+&^'|JT?56g)uJ8_^; &i6|>DC|hfjZLڪ !0kVq%> M}YiCO1eN3|5ç~WR}e§~et>_TC鲿O/5XCWX`QLTvB±i:'v7P{n3@0iAk ٺe|B`Nl!yv cR2 ?gatÏ)wX|` +㳨IeSl#Ea%j\LTᢎ ?v֝bYWSЗ|C, Ya}癇3|?3N~fsx >J3O&R{\otS a%Q/VyƠ=מG8aϳ:yVy{;=i<y y_ohV Ǜ¤2imkL/5Ę[Huumκg]5ht]κkκ0Ϻ0] u[ z V\cT?4wc>[v-fX(ReǏ Ee' y (}:t%x8.Tרo!?νO۲jpJږmT/ͶlCOBµT4۲Μ},.ʓ`JI'^"%<6G N8rڼRn~(:4"JΧJu߉ppK'QGXgh/li{Z:| ]JZ:t>/[`m \y,ޯC_~ CA}iT~]&g-܏΀>ON6_}q>_ /zƚ# ֣R ˤ2aAtf! |èvx{%e0DzUb F[ -qne; r߷-iv-Z7T%-[V/7ZeW4ɴ$[˒ܸ[+F*qרIp[}G(F"=5eIs-HHO X<~L*)\4 JkmI쨲S9C1GfE޻횝?,GB =d4$&O=9Ug?O Gi| T/ɄW2\\^ GX|IZDw<}U'OṑPP^TύzHX+ B.x<{i1 fVضFXD/V5VW'vmۭ4>k_ZIZKJ3t~QA,RM~@R &oiRZvE|5i=<3bTzAD6iqsV̞"[(R2VeA=ǽX={ɚA1%O]=5?~eH$fw!3څ'6$R@H V_ .Bv |z8X(hIK74Mե|ytM/v W @ ~ {o.+k_O֫xN#! ~Z>݃_Hܻ ./E}#pUo H.CedQ4>9ʷ',ijVs5;څveX еT . ]j]sÊ:a$GgWHm")p"H>k*:A "٧*5#VvVjsi0]k'H5ҍI3d*_VdX#g&TE-9X34> ٷyeg}Ymǣ<8]u + "Gi| T/. /\PKf GXf[㩲\cHnbknbHX65 Ƿ!a%DžzX:GߦJ5aRW>=\ǣ1y\*ϥ:tݹtL/P´zAJ5~c7%9 7h)˸wWtD#iWGқg]HT Vb?^YB^ ~V:|@_mB/NZejfmMZej_ _O~/_nG?Ad9:ɪ|ù(E*hT^jI 9b'ߨh#.]KAuYU6fUolVͪfU٬2UͪYU66rd~g~c?~g R*q6)[aֶ{ oSL*=jA|5_C/&7ג %VX*WDt(ZBrlXrD_v=4 -sQ[$.݇ 0qu.އ}kGX#.rz¢W̒ xynvAxjRPrq |* ] P 5'wK| b/.Nr&>T|~f~cn_~b醟~)k'N网'NȬ{#x#3OFff8y#klW_w)| tN V(;~Oor1'\n𛬅\v(朊$s|M \ٝ`QlׁBŴp}Gr7L*5ZA( ~37LU0 ?3 zJG(Sé?K8BٕPvP\z)?NG(J#{YUr֮{eqgkl>[ ෻owWnƭo[ݭ?~{~[sOn~~nέ߸[swϓa%))9OvSRB*,y/O_&YbY| 9Q /=OI>X|>jƫϯ.z/vM6$8 [lLtIN#nwc|vn.LiWOI~6ƛN4 Y՞q.8u.Ƶc68}69mX.BAg‡|{"X|qgѧ?Q=N i\jRTvW)Ғ!#o%r٥Z. b?2K9XWЅ\mNBgD5]B1AMьt9k2څt9ٝ ^]-_.8OQ0w9 Ԭhˈ3CՕti.r0UR q'{OeX1Ԣ*t4p>KGI G/ZNFlR$RCXխVИp9_?Xx%왲SE*hT^4@IS]]9oWSAMϬgVVJ*+6MY V+~5K5dU_<.8cC)SYyꞏ%U#"9!pJ5F$u)q)(W>WJ [xMC)֥A_CZ` [=K =!J%)`-uOM`^RDk&cQATb.ODɛM(V^:ȲYގ翳;eܮ]>6CFu-0=~SHakG'Ctm9)#_sJ[ >R05$[&U_c?t_,!{)y\c"a}kJ Ϋ԰ZtHviUWxwԥP2˳Iw\O(ӥZ=WnZR5-zsdu˸IFɑv|ώm+mJ.ΫpwZ}ɮQ$IDiV 2,(>vzG?SݞCj ލeJ.ޜNm̗..]fett?2.E/*Dzm*Z?QAA>K~L^X8^&f^y yKk#FB3oa=34yWgU}=h5̼fRy-yKSym5μoyWwQqJNGEaTRyTzSRBڨ5 UyTͨE&[2+d􋜵UPtiV`u^GCI0Ie eL!6]eq3Bg9VV/LiVUʏj$S!هR]u7v]vu)Y^,֥&֥[S,e.uىu%tAt/]v%]KtAҥ]r%KyR.-Rn]%R^օ.-R.]W"U M ?k Ll݁PP4̓.5'jMѨۥA$e^/xD E*hT^{!HI[mSB"V/p.<ꧠi|: LLh鲬&ʫTL(t& I';n Uh.CRP5U=g{~lHU%9DB;Je'@k ^r#JytuI) JU}K$i"[Bw%ӉJqAKYىVs^‰)i6ɮag6]$AI5L`TTUv4P.J dBהk k a @ᔂe8dj_Mg78+/KZ,K/Kr,KXl)Xx~t7g(EkfKA׸GERTz-Y52>z=_`@8RAP.֛JTR;6,iK/Kz,K/Kz%A~eE]c+)<CԷ,d%6]\:UC9̡@_t/]fe]KtAe]zetYAt.F`d1슃9ACk&@C6)N91K ' ,lQ'`%+t]^]1BW+t]^]CW뛮tZ{ɪ<;m1z6j 1V`đJJI%2B$UwX ~u殨)t~u ]CWWW3tž;t+~%tY?.9]Kh^ -W웖=ђk/7-WВ='ZZoR4m=8{ >DaojmEPT!>jMֈ٥R`ODf7ɞLvU*"xRE:)4;i72_2C//# 2_2C//; 2e}e ..]Ve}~Y. ~鲃.+o]z~lɭ]8oq ɰڲ/y(Z24 eP/e'$t!@v`J)oOSX_XONMjNRެVT}Y]oY̊-oY0 f5mVYuEeVaͪo']@./_tAҥХKR#4u:;<]b*U/v"FV޽5덄 >Wl+f 78;a%2PIgh 4@@1Ēd*Ф a$ t.?n+qw<*Ӑk&UVYdGIؿU։#_<" Bms[6:h`>L:Kŧ!$,zX/L(8R $OWuj V+hew diBGV_6ضR´*n$yq7 .6CWAzV`Dg'u6qAh@#yM$dZ#kެ =!Ié-:`$: 7"5c/ҭFy#zF #zyD/3<{Dē񩫨5۹Axq'w˺{f^=ua׌:|qv I\0!! L>'EN4!tMH;hB*隐$]2&hB5!`i@rd^R¶*9)im1d J$zlGwՐynҥ]0!;مx4vh4H b0h4Fhǧuv^u[7X C *UxĠ%M>']lw I?8%Sx8=㉝'B;dzU4JFҞrEzye[= _Ղm`[ζضm[mmmt3z *$}U4QFqm/0ƻ$27-<VCuXx cSyjrJ뇞p`I6(l#m'MPc[\m| BTir0LGꢐ?ֲB׈ZEtVM4q5BTA@-&-kvKP|[xYפhX#/qB{?Kr.uوd YD J5-Ke 3 tZxUJZ/ :lKiⵛ`!HӖO.Uuc;F ixM Ev0!'$) 5]H4!m9*0#9C2`sq+h6Y5 ٬/5KR_RB//5K R_C/~5UII@!.kNZbUPPWoP0p!5G Fch.-2.K K{҂.5^K ot1?˜ȁטoȁ0k̏0[5g#͘mBAdc1σ5'߉9pVUjzܢFwfk鲼~h6/ܤ|2?2e]KA.32EƋlGd8[)eYywJ`\+O,*L ] -]&C(6LmY)U㉑/y~Iz,2M|Tҗ"ϋzl,DX W %P+-J% $5*)=EtJܜ*q# ~9mN9DmNi2Y1rkK~iJv+׽Nv]b|-vkrkJڳн,{mz!'uM=gEFV2գ<$J$ xvG[)n^S?#d+"Ѣr-([PAW]g49|jB!kS]P[IMzڟOxf-nh[,G*UyY;dSHv=n^?KI.#]J]ޱTu)[ٻ.';U|Ab5NygƵ&piZ DF!(Jc2Z, "4Nc5Qfv;U剪;lvif8퀃;. F KXˆf#dR/-Ո4)Y_t,Ki|F;8n Ns[y5xBR=QR5pc$ىwz*J?M.奄@p}f :BöQL/ki^ "h >LY>@U#PTzAJtV'/N&rv5Iq2yZsp/d'0IXܟ{aK%_+rӂqO$Dօa @ -DC8)'F!/A4>Hʓ(CS RyJ|\n}"Iś\w_'-ph'-BD9e*,oEèhvF7cofܓRHzJbl%^W[Zn^U*^KkOa|H!1o"Nɒ IԨDW؅oE/65$x>=n:*[(khІEY8G*Q=9*>G|Q%y:92Q+(ܟ'9Rb6[QVߊIJ-&;cdF$PIzހt.KZ..%]ҸK*wIK~RFjjFֆaaoqm-lmXW6,ֆ {׆ֆppX Oɚ7*GIUkP@d8ktI=hXےZ,,Kj˒[ReKj% ƖԾ$1Jji"5>AЊt!LUz$墯VwޤWx%1&V?] ;.%=tIuIm]ҹK]NUBCl&Av1>!D*_S`sUM<0P+l\ ^h^q=B,aOj8 =r^*3#m*Z  _.h?ǜ>[ԴE-Sts?52>J_>y u}$2-{DA!KPRz5C:]jS)p93wKsO}1֣7t}{xz)b w%`OK &)D[ړ*5QKJ#هb]Y$tXtJ,fR찿8RḿH;S)֥ؑrހ;r`c? 66t_˗Q`+xAh+2:Vy~$cx)Kx) b\-ͺ\kV+kmj|&:潶Z߬d)zq]ŗqe'!LAWb@L#]LWlV+h ?:EEmۈHU+G-KݥH:%iWec9T_1c nƍ=B!DF~(5҂g634^ޏL64e:nwQV;4lhRD’ I@/X?@WOutoORTzހ;>`,x)(|KAոbSɥu6 2k I$|<?VDer~b|YsZASYr.أsEJ Zt^)y"il X L ]-()i3;II)ScYJ.[(${=p oML%oȆݗ.VU*ܐ7d7dL?tC7&]΃O"T>g鑵i| (4MOdR)܏EX ~Zŋw]EE4Zkڮ֧wZ-t׺ݵkDox.x}h ~Z>ãIA=Y]j5C'jsX ~G_^xu({;c2W}+p+߲ ncOIn2I O /[æOU.˓Z?9`u2EHγjdIoƾTI ''>F N~t1'J'*#;99m .f]a Qط:*ÁT!+6a7_r7'&G'8*wوڹSvGk|ΥؒnIUW- *U< JHo)4[+iM%~Yh,m˒V'KBR%I:YR%N4fĪ'ej=!B4[I^V$uG~e`sBij#?N0$PCx!!R(^?5K잖U]G3)tiz֜W̞M,DDT.KpH¯0PQzY>u1t;#*Qe'S}~xq}>|ל0^oqډЎxADMYndWMmX@X B(Ik >ډ}le[,.\V+hfGK.Z)=HZ>ܓ, 5_k h+/k磜d[*,&1HoRy$USo. .xd')hr(k}i0= L()>ť&$ZA5wrɤ :'+Gqv݀kID4FEO1i+ܱ8aU)SX7uiJ^?5nˊssǧzAz,;rSWAqS׭VΥ|_\S4Q>1 bs>!DMj'*ß5cA!/TT?*jbq&> ?k4GjH4Xo\s&Z.|l*5ύBwBsX`0sO},5YoIr(ǨʫTX(ISΓm 51)}qSR*U8i6jM/A}ޮpm QgaJTp>}ĥ iR6qO4Ic${'coz'15S3>8x@RYZ|Zd|ߞ٨٨~_uOd+O]ջqyRWAݮ9111 %ʃTxV*ThVc%_JX=%U0ܚYPThVγwUuS`Sxy<K%wk-蒛>SIDG҂.V*ud.9K --5r"A큵$ H*nC)ӥ[= Lvej"ᰧtY^p.SqI Wm :b]P`u^5i캤s*źhoujI m9_>|O/U[4U*q&vQۦ1MouwRkl/46{.  ,_,̠Dj̜ǖ.oZvJ- Iu]@"&SMHc 4Jᯡϐqhzp3R~ga.a"'c>j"R>N_LiRyʖ|%_.sB"5yz"H+ |'O| u'OB<>F 4/\ N}3b%[" o q䁲:y~,%b-ۻd-)^pi6t+IA`53!Hw6k"qb&eCֲEAhDp6"֫+#$tT˾>[R?իlԯD9y`aA|XÂŇ }X`a jÂ͇uXOD韇,*BhI.n %Z@t4}.R+Ъj gw nX">w(DpijR_ 1kl}J s|Kܲ}km-J  csF3OO1*U=JNVMm%”jyhI͟KA0F:{7>iN]up S֪Ʈx<{F\Ń9QRtq|ym/udW;SW%_&٬K*uUdֵiΩ2]k]i7٬KMAm.p.O H>x6֯6DR˳D}+tum -ۆHVt^\p.^.oa%anm| >IZC%B3Bj'b4`5]n ߮ķqԍZt!.q&UZBFdSoDI]x^ q !a',ǙD0.u .t$duI_sI@I"Ɠl'ɓ1V?ΠqO6R?(W¡BNIVϸÛN-7+A&٤bj Vqi*96τ =P+0ۅ 檸ɸCZ+h-\3OIy؊,O9PB BKxx+ΉlL@G&٤:7Ф3a^=[-dÓrա| / d|Ual4X '&Ii2)&uOL'&Τ=1mOL=19`N;z洂99`N#z洂9oO:o0?'`8G _r~}r3OJ5t~J:?Y=[zત6]IT*8<p=qτ XD"q~muz zI6R>32G˧q{tvYV u&uU_}^GRKz!lyE"MKa!ZS'PKy?le#[Rw%)M_F~~/G~)]獖x)|uN蠓!c'Ufo4ÁYʝb]PXq5LvХ.x.Tܯ22u-y`+%Oak4[KeBkEגy%2_=v:6毝j&SQLyK%ScZKZR,bp^:#EbRlEy б/Z䋒:3vV/WΫTW=%Mta,U1^Z7ė䧤 ɟ/уWWGm+s;m9Qy?WUG!/o}_تr&1r$۝ ~i6[g_:2=Iz퉡nd._[&3"ߨnd.;GжJZ}>SĒ·A˧+c>\DvQyQ ETY_QA0| ť+MkђF;52͑5luvE`[ d0IvpQoDžt)%ZRhI-ܖT~kI%SO׷D9fIOn3ݶ@vT?޶I;3k\cR5r7>㬵x7 v(|z)y7vOX\*O ә~7|G%G-ʩT_ue[8 ?Gmifkn1v [a|Ɠ f3b%n֯[r׻o[~lʭ_߭zR<&ji]A/~sq"Bf|U k h]{ָ+oJJDg "|X$ ?kGy mHhe>%_G jƌXc/vGur|'_rbĺ#P R'/7\SbkPXSm#fV9vJ[p+~wwnʭ[[_$GPovT*ïz$&Kn xsG=|P8SXLa8SLa68SXLa;ZlJX 8i[߂ QAɉ|]j %j'qTN5cœ=@5P-#eR'iډ7㈥S\?>['/PDž>f0Ck"sqrY|k:v0jeK%'d?:G- QKTk꠹'کkJ=tCwCw]߿m7[wZ;R D;!Qv|WKq'4~3R _l>ns#Ry*eHlCxoۊnNM3]f~ꇙ4~5Q?WļٞMx=gh)Ք,̱zZ骺TNMD0sy^&$m[m9'>*X-)B#uh-5a A/I~mOaӾɛy&GcxދP.5§ "3șCv &d~Je]}1I&O^hl \]?_ Pm7 ~O ?+ ?3ï+?w%9,_kI]!| ;% ׄR+h.WЧt_`Bf6O 9|9L ^c~Md}OVl:. ~Z7~a~c >~c^z=犨TCkO R qn?NyާB0,+?'􄰞њNqDl}<"))G j|5Sko׿ ~? o<77|< RљoxkhveE^mv[(&MK|cRG_rCj_nA}K>U*7_>[/HK^F-\Oq 'G'$l^O'$Fz2b /v=a|{43Ͼg3g3g̳g$y6<=MnmCw`ۆan)_A0fCk gA!ٱ/-*+WNϤ\1Ve-.->->FkKdkd#Z~Y÷0}uWJWc2#ֻG7֧8A}[pT46`?SfۧAh-4 \4h;Al<`?蛍 x8AoT zgG_%~T%O5 +R8if|5ғg!fzc$JUxiAJ m8M?9+eTW\vH6 S0%⑶LCkLz^dz 㫺ziZizq\?ȟ=Ґñ\@l OӖJ5k Z{R <%bK7B0KVT//5i^3F\^'H5ci[nXo_?~֯w߶~[~k~_ep>)z~ jӑJ%O|{~ZkL\5j|/O ~[rajwanχ[_yN^P^,Xia՞\_O`j`VJ'AKSñM:Vr2>m_ǶR gL6qOcl<6xmghKBJZ8lR> _H-H,4>J%ϮKZܨ ">b.Bs2]~6BDۇOC3>Ǚgvg3ϼgۙg~y&<=?(B;$Jag2V@a'ֶK| )Z@Tn[p믻7_ߵp BBBOnv[[/[ݹ1h<_Ay~lXJVPKGC(~!ٚ1ܻ(#td_SJ'KRu[5>ItN7Wإ{/kod /?-f ~"|E"Ÿ_??t͑J|Iɟ'G\]vG]mQ<܀$ܨӤ Xh KmDe;/nd=}y8K?tǚ5* V+-gVնW!bZϢf1V/~22c8O%A(0_*kg3ݺ<2c%_~c冟~a_~f~a~-~e_ ~_~~c~a~c~g᷿ |_&>>: I-+GÃ1 K̲K%]'Ս~| uBȮtH?Y 6 :ΙT!Jt[% /{rS (FAdHJM!h<˥6M@ݥ2ƇU23ctXE<P'R~U+zX%jnc|$[-k$ڂto,)*%y{dIcg47g|4Wl ͝gS7ˣ %ie'HH5JTC(h,zRw h\\LK(ePL:&}Z3>;&ZtL2EX< みVUQωtsM ֞}AIRpm)S&RX ?,RI=B`BbUWo#V<@MESZyJSa|;Wʭ߹Z_IZpwnn~<9n$EZ{Sak3Ϫ4~J=]jRޝ 4>ǯD WW2xbgF<,D_ݜnN]Օܞ4H~O<3WwW~}y[M~4|9io%4y/4 |79Ӽ5 |7B4Q4oy$d~7dR|F%?Mc\kYhͳy$yv5O.ZBki̓g)ٍ<КgךG*qHXyOc~n[K[ЭЭ4t}p~n[CCGA@ 4>Ǵ]zoK)wKv?z|[!p3*E\sKO.=?ݥgc%g6|ߖ,I/ҹ3AwJV{قDt)dr]jtg۸e|K&Yjbq!^bBR"Aw[F5jՄFTZi-4}\*RT)A#ɔ^"T^_P$i'Ecd g*Wԋ"<)U=(eW 865K\M)MCM/cAγǠQ%%ˣԩlºUjG,7rYz4KFK^rWl YO2.,et<.,2>TM%,GMu,j'8M,*WǞ$Ks=g3e|ْr,6_r.iEz[(RRv}i5 -)n>BL6 )v_K`J=0J&x@j+YaD%IfR= &Mݾy.~J{JC12ʫ(]B"װ6]U%S)E-ʫT)R2&`~x`lXx?Xp]]nNq^׌w"]삧O.vų7sH\w3!H=0rTR'HqN@Y#I˥rW̏NI̹I\B 륩TL(IT(D ajlUPI3-iP[Ʀ;>"\Kb&)c+b;Y}u5>I'k*.xSECEc|K:n5Vmjjqck]؋AJd%ҧRAW)XAP )9@=TxnÍl 5 C=|Gb;a. y7LO,:LmK\*N2Gd%HBZ/JWQ4O-.B]4rހtTHHKK.p^RX~m+/6mɻb]P\ .5)"jb]^WOI(ozuA=p7|)Y>"/=IO(E+xAl%-ĶvBOew^pG]r}J>6f9Fp4:VUhd.58V]Pot-H3MLCkL7?q7>!Xt ;רkpo } 67|z ^x0k0{p_Cu̎fJ]G8^!d!boޥT"z7ྦʑNI6}9 }GJU$;{H,["!&rހI$L_#7׮ώǻ<_uUWT1agtx&K)e. I}~6&#6vUTХ9R93ؔb{ހ;5QΪ<RJ{uV<͈eOP04G:.դ Ah^]OyOW?l I|ub+6uE5_]Q3wŦB]3u(g'T~JcI>(*rJ%߹HI^cG-)ҬpG]]#<ˤ;R2Utۇn&l6KB5_l{%wO~:"]HR9~Gn `S~C//C~K?ѡSRP8V+eTT^P9 ;΂>v27\C//5K_C//#Kҿ?I'b[%94:q8r'\`^Q+nH u{iϷQH $p}&*1Ga="G3-D*7e$(5,8&kR~maѶѶdwL+t-tk|5aCPcle|ˊoIRyM kmaZ_q,_K+/"kj|b z_Cvcw82[֕pR܍p57g={H$-g80yY[R@-ujb۲aؚK\h⣑J5JF/,MJS';Gyzy}jFy¢ʅ4%}a=(W\Y7cu9+.YX3߫=//7{9զîSV'IZ* 5ZdKu@|1bc> C/> C-05 04Ð0DX(͓su559[#GYw'kUbl$c ;KK@nQf| =zDm`Rj=qJ-m_~^?-53׾ECX0D?KfT5gxO݄vx Ob,zOSY)sBh!?*?34^rÐYod%ɔr(L3٤ʼnN9̩Io~{ðh9=꯵cɍux2YW7Jj::oM761e,y 4X ~|h&( &(pwx0dJ趸,PI|0ԜWp0$jao,iI )/\S< 밻FllN- Ll(R~XME"Ǻ!PJR>Ji/YT~,E5J KyJAK81LERhI'2N2]e4BҊ(J5'V2,Z*ch)t[e ~W~w_~~w?"y}jxᶊE Xo & wH@&W4Hj{y:xگU*b~UjWV*߫Ϋ^v$p#:]>i-T >@</ɶ]! RK%@l} `*U 5'MԸH-W\pǦ8 mSUK')Rih`J ?$9<|@-$7Q 4X#ؕ;wrurܹ+7ʓr]y@X&WCl+T ,Q@ w6I_*\raJ tFL~VN$ a,-9ǓK5 mG`GeG=h#Q:ѼhMx@!jm| ޵w_ hI/ehcAS XT7J5$z|d ^5HpǾP<BJ'u:NoH3'cXz~R#$u5c@#|5ϗ%b-I-i[Rْ Ί,iKZ ٶ7p˒Y%`Ivؒ˒Y{ݐ 5Pr0rѺ{GGы{{=GGoы{zh%SK(?(W#xv KAJ m}됃(\!z9kތyhUïM5>M#_3=Ӫ8&Q.RrIh6o`e6afR`v|RM0HM >S<:d;Jz*7JDs C3BD6:<7uPa>7 Z5B>H%O¡N T!b/H|5Ÿ[q RmR'U市d*Z 4Xg$,*mXYn4Ut hO,(MfAtCN6P^@ԓ6=]xhҵAx4 BNAAG FY4Ff((FZ5Fk,FyFY4ȷ5R;F9 2A m_mCdn|A6nm \Y~^b<+ydqM6iA=Uv<7R(5F[[ܭQ5j(wkTn­QޭQnᯠb0֊ !z!0(t3BKrd|UÎ!D*)Iߥ)-Xn )ek=?H>MC7}Nڍt?FW C@0|d]NDUEG8j V Rcե6[R 4:K5r֖S=%B.tXo z&*-Ԛ BuY&z &nnFc|5?{۠J0aASO5 m2t6٤9+SeɮRh@vA1tRO~ڛ7 +AĮn| &?JL+Ao6>gb&TCēcDKv1P\j\fUO7T_䱎/,vQZ:@4?\Efq*,ZkCN,2xFGSYd<;ƓxJ")e<6M#kY Rt+<6b#,6=!bfY,Vb%g1y퐿m2C!c;dnny`6ךv;+RZd9;)+wB!jH&&O>dMQ`[ >kTS;ঘ/(X]"']"._]"%.C_tHv]6zJd'5ÖRMrv&IHM=z>hm֊K%q ?h?ȴ(?BI}rTh sgTс*E*Xy=AT-幘J=d!H &/5ƥ- J[jJk(8 oJ% |k{W@R[wZ\?hF>7)ȱ5R,ky+>?TͮNpR=}Yc3<$\dzfW+==yP 'T! RR ~zzA ^_^P =E/yP<{PJq$sn)R{R#|rp'4p!7֬T.vnb>Q|ܸc̏~xG㙿b ǷGᏯz%>{b_<>ERg4t!D)/u(.kq7}\|ڧo:ZW gh)>[~T--׵Ka,u\p E 1Mu肣 (u!?uHhCCI|fuz{uuuиAAA^ ^u^{x4x4 I;B!6$]ڠ4 q4񴁖WMآ6-$Jƛ@|Kx5Mk:kykڼym絿?QC:?0 YǸ?HG&5MG WnW\a_þr;++;+{_Y /ahzޞm!5sa%CSp1&miy{RA?*˅,; Uk=&xNHph!L *B%棆N7Y%F 73| 7o>2AG 7olP *٠2T *Am6|TalPmPđR6G.K=Ѹ4 K\,4.dґ%sWx6.jkp7r>uv_/Ta!5~/\{ÿ;q N\NÙ,W'.܉}܇iNgN\"ZoJlEOtŰ۳z{k=+{۽zVZoZoK9-?Xu_ y"ok7+-zEiW+-j}-jo᷏o7-~c+'`at-PW XH#&-h˴_RF6X &v+PV0~ [~lp]+C9X RCצjе17AʢF_D*ZC9> 2"WJhqg^s@QV|ye&U/7]7MGb?fd'i~Gsz$6:BY&i\RਉyD\D 8Ka0- &A p+4jy0O Nh UVXZA_i<i@ e:@=JQs-@: @{ m/Zn,r%8>!2>Wϐzۥ[ R 4͚ĥ)%we s>eo[#CyCo6-d6Bd{pv`?ybrS)7EwStnM輦B)$p6զJ OLdrɨM!+Ishe劫XSlE^ɾ ?*E#\/\,K)|EdQڤP"ͥ2V ITX \ @1=곛o(b67?&㼕Ny\uZS^r*XM)ZjjJ۾Ns$ͼ@Dc|BTCdT!>^1?OpF,#(RJUjpؓK׋[Cv'U}vܱ)zTYpؚwZѲB3{O=\mI1Cଉ|}d4 L\*?w!!uT?u~P;5Tw3>JNθ_]jE )@R~4&tW_VK'd.;NoM.rLf/c_w&MVlM_o+x!ږ?tl>k ߔR>p9=Q}(l"|.'c=\N7>k0bR"8ڗ@V.\Q+`5͑V[fԚepI ~Ra>%X:lyy~ho*|UGj ORi]*O츉Frצ6>}64:q3gctD#0C겟u5V8R)&Wh?e ;).48;*hUסqtdǜWaz4}h!L ʒ[uL͉ĒecCSI*ȒechI!Uˤ A ,)5ZR~ hii#ࣴ\KTL&U4D7>$ _Nn{|@c/N`iL Nu1V/}')SPj?˞qd g8)%fc 🦚~Ry_4Chd[2ײ_&U5vf7>kKb6d&kf+]w_[:j_ݗT レMWw/qGq,\A0w@dNᶫkI1΂n-KBkt9_QA0a5.TC"~v#jH#F7>qվ[lCx A[չ+~kR탏ڏzhu'z*|qyVyVciSV̺J}ʸ6>!D?+ߏZ&U?$K5?'"(bNƄI_mj蹈+KR \͡@Lt6ol!D?5)c+&URveR ՙwBg^G20x0|7QxFyOk~[cWz~گ\]_l~Rqqqx_q_ڷ xQPJ1钮 B拉c6 NgOƳ/O>%>kэDZ㉴oiOKSj<Dvfu ZN̅i]W$ǥ7cUڿbo};X|'0/M# ~ WN(&j؅].Η.W&@3#{Ծ< O4@K >Jb | \~HRT&um <`cSĵ_[kSDU9qo/T3Q|_\œ1뺸|q3_\|_\_bő..vዋb-=#Z~m˙rus|/bw{y<&U%,!eNVz`OJJ'sȼkR0 ГR 3eg-PʫTŌ;o#v37R?(k#oh'PA}*Ea*KhJ7i8#;q<QZW{'JUG_9oҗtGvtIM /]/6V{<(֡d]:Tl27Μ|;kDecqqR$xUz/NvNjʋ*Z}-NWtހt@:SzY5.]ଓW:Y4I?wA+E*XytoT߶ H *& &ES:ע ϪWYrvU0F_^P#<_!ӗ6J ˛D^~`M}AM+W\]Om^YP,}+tzR4Chf=f[Kփwe9H|>&鱬T3(g[˖.iTЀƦb! b"\ZyAv@ZDKN;]Wy<[Z4d([8to 1R~r.m H {RCk rXr>5TaC!^Pf֨zзR5^9, ] ;P.mOE'^;FگwJTq\1悔DD!U:cm|5"Z_!N4\1o+ET _6B85Y88jVӇR~ x8L 6>oOh<7g4+ƃTHlRR7K"|Za/D;¶@ۡr;rvnLCۡr;dnU;~5Þ k '+Z`vK@Өw>q1>ށF^VMIFX ~9ex8=U3?![(J V$30xA ϖ_T:ۏ)BAyD j׏mO~5(,+{R*hr7|4 (w>A⃠A}4!txy<{tےKGnwʷf fJ. %[H+ojhfIc̦bfJTRDI!?4IjNNZpt Q/ 6 _bRPZt k|b'vO}bWNǵb3ֱTq-P p&=)֐51m)W\YG%t~`H^̪TeA@#^P   @X.ܿK.?ХD//m˚Ňӱo *,[%x)H/SPX3K800פWœ񂊓^ Ms&;Nz=Lzp]Ū8/ﺈGET!dXo Pu7tMF$S'ON(T/6}^Ws*E*XIf*_69D*y-)R+&]IDg9 )Pz`gSytG,{NX(~_zŵJzو*>K&SIS8& IWwk~a~&^Pq~^a~a~^yy˳Oʓl {S-8-KHiy1'W'L Vz*#yغڮnP7ꌏ:|x//S/Iϖ{=sT4ުᕕ2E+. /]NKt# ҭ ; ĺt2n#/t[c#/t&/7]Zb]hU]Vy Z9R/Q<~)[) źh`U^Puy25J]\YR?oFϮ%..޺tɬK..tuMWR~.%KyK.'RB/e'?K6¶e%[-0Lw>!lT!H 1WSThS6FuU ^kbSt͑Y6'+2ͪĬ`V'f~ݬPs֧KWݫ(41B,>z~ޣ6- K]KK.5R_ԟR.e(ʓ;ZQ^~LӣX適|B.zw)ݥfwIxp٥sHJ|JR?u@jgݠ|B f+|˳Km˭2dc_\'Wt8YoVڞgyu+å&?/Mj8 M]nvǷG0'd\y7CBn 1؅R+Pԥ@,T/QsU &.WH\uXiCU*?m*2HZ-U)@#|ϵ[_wOŵ_\k]_7377777/%]KNDGaw$_W6Ե;kP#Wdr_ڈK1߿Yc_7лU zkoׇCr}-IAKM[bh /.KIɂ>#`''޺, M8ycSfsx׫5CSu .._Ɠx*Of'Ɠx|dh<' o 3/ / q ~ ~_~o׏+ï/#|I[+C0%~* 9ť?~/krrG)>6B$cSJ#BU"T Q>!G?o7-~c߾>o `JfϮi=5n 'Dw YS*Sݥh,SKqP脹u:a:a|2~'G/Ԓz𗄙CzyF9R[?Tߍmwntwc|[h}-ѿ;yw]wsםwu'wyw]wpםwu'w{L63ol1>Č'fo|b|)ow'ZiC+D*oD!kR+GIKkR ++=veەەە}oW6oW&oW]鉷++]i֕Yw߳YwYw;y׬+YwgۡCUg};Tт$ۿ;T Rw+PUp{×ӷ+5"ǜI@m kcT?{=wV&U_hO@5DR7% s<S2e8&U8Zx_]*5t? ,pU0[;ThT@|-mB0uT!R~ʨB(]Oaεo^-]Oׅ RWFW7 Ez? sEawylx؝/G7/eH#ː?y>e|d*5GD*%oJճKj< 8%\]偳[־87?*?gj#lEU ݑ[U)RʛD/KǍMTEhހ;r5E)nY8oYm۳06{ַg&?vM3G9_=+=O -?4y'^7,.Bt'.|߮o~Xxo׼ھE7o׼پEW?_~qqxoxܯ<{<7{d<4xHp P\\.燵LӤ c a⿿=,kXpK,(fIΧMMѸ)ƊX#mnZIEm_v8vE'EG~GƣhGɣhQGLϊz;|zV$hvR>n~ |<+o\d<5_9jAilW_ř@)!PR 4U@Tjo}qʹk¯{7OnUۻo_ö}^Ϟ'{|Bp,u7;{ ~gcK l6[G ͑ {p[(R >#O\j㘅}i)R+W2|e:Tn~e:+WXڧmRB@V *5mX`4j& mo]\pkᛰ"[OldDe1B(Kh)?50,=,&?$N?ǟ$I48%|_KTjW'_X qNdN-OB!~zbߖg*G) ]*vK?؏ܯ_e ,/?UA.ɺ*fir0 P4^եTQM YYz *d/.=V ψQtd`fjǀqmQhF7 +05a4kіhm5O3I y'>T*ß}L"&?8 KjRi*9 ̋,B`, عO+;YMY]j7M)K5)qSfPOGi{NO*DtZ<>|SJF+%@\/a?U\A(|thx3ے/KU9]ͬ銛1V0E? :FA|BtN۸a /R m|Y4mc3>J]kqϻ;ڟwOε?_\kk,i.ﯰwu뇄 Zz*ݼw_ӞT&U?tތi4#Zza)縆baMqߥ}&Bj<6Ƴxm!/!+BIw-cerɓl2y~e3rL|ferw~Ha^ ~8y~޸y ~޸yg[߄>ϿE?| ~?D'_pg~#EY:yK Hy@j-<6c%`ONtc>{yBjN=mȍ/$Ӓӆu.]q& ~*5+0.*Ԥ a 1V?OK~~A,ěMVu*e*t/FCyA%.-DM,2Exy&*Osm8Odqgo凪o\%ZZZ 4UqKeOM*0CB|-ۚD2E4RD,YFrb?܏'yc^^Y" kՒx ^#R} QEϬD+t9R)zf5\j1n7GUxgCͬ+U CrM'P"x]s0$ ѽ >FRR? ƔPcI`|k5P횪vxFCvdAvCˉtY'=,xܛPr`/kLڝ=C]J.;YF2٦>5Yȼ%fe]pSR.E/8J7]:nod}l6 TH}Tվj_NJdu/+q2vB.(W\C߷Lt.a̾\^ח {&<(V:xO8?P8N977.Y]8\5NʁBl%-u8#봣rEԙcOl6~bcm~M85?_F3yLLׄK hbf_΁װ9Q-g#@H=,.Jq꫌RM !T8GzxS`Xi|ʔp|qϬTIo-6)SSۿ0:>CT2 7Yn^p%pxNm.v+07\f5*fڷYoj4+voGk>gIu|_ ~w;w3w;wmvݟ'jYfͬhr09gL'o*:/ne[?D aj-UPI3-LvXہ]{tl! {sꃧDOvd6,+?Ocg:SKЃTL*Dt,bT!>Jo)r ?vcY!_#4;fCc-Ͷڻ#WGh#ګ#ZZ5t#t:B#{l}Gko౵w!^Pa ]ڻ{{9oM w^HU_IMlVS[.B/q?[%>OK|gbdB1)1|X._cR1i1yLyLj<&{L<&u{L:__IwD6Uv_5=RfR>kq>**"`(گ*{PSHMU7گa>>*|, @a>nVJڷvnT)<_)6TqOh|ZhGN|>{BG}#Geд%1Bb7RNH %6B0|)4c❛Ҏ Ĺ1Łd΋ރ*eG)cjy"qPUh?hq9C<5~Ts_Jf?r9zsTs׬A V~P/!›S?"E\q u^$҅7n>o372n~qy|޸Ezvy, la.]AY6mI.?s3q./T*} Vud.LySq-r5."dH_Zkfo o"V*'DP%H=i2>g)'5ďA HV8T*oOJw}c Y?Zm<#=PkFV jtK$,)5J"AOqVwy/./ȓϵ =, .dz.!;2X KP- ?3Zp_R9l27-/X-7dcՃᗢaO_>ڎ.#ͶCThm jCr<-|)ڥ!WYd,'A_Y$xgfI,7"N+ǝ_[Tg"5"rު޿}+Bc, .ϸ.?l//z> | jK~~)Al[.َ<7t9~ACNʁr:I5vrmmC]\[bۥ7Ĺr\ytfΠϕ *Ε;̕3̕63^EJ 2˒k+uc:;ct qAwlk{]86RA Tqt;i8{-! J"+݊̑IH'^nŊt+R&6EҁLUuMȻ'1'N^Vu6+6]9 "[CpG]G]|WzstJl͑d.>GHBY_ap.iq$ƹE=dE)%{Y/wy`Lf劫&٦K}K E_V_꫿T/9R_RC_l/+jl/jImqMDޏysJ.Zn\M<)OLmGAT0/@&5ă*={$FS*4 OP$Wmj3(UM7ynEu?F0:NzFWti^~v/#tur*-ه2]+. .2%0Pyj-L-508o}.=]fX{!N. *]:]~ڥkkg IqWr{J~b^_;fVe[.[܃.VnUjU=U+nUZ9eJh)7 źh`U^Pߞ_:UUOQ9?c]d MǧuM'-*!_!eIYIv gHW3MI'NbUrەORcBJ;̖a E˹rRal-A4K'(IINIw:'-s1/Qp=}czx[;WUazaw]C>#{ N4d}97&]KA]VetYtY?e]\yMylǴҎoJ5%'p5xiq1Vox?#2_^ =G!Y>̪Pw 2Rljp)tx^ i8_4m"Ab*ۥwrC9Jr`j&;rBxVY2]W;d.=LMe1=qGK=aa)D_G.BBG RA>  #5w -k3٤S:o0s+ed/V]$35dF֦0RibYR>!:7EOV6J H-MHt.<|;MNSVNSʦӔΙ':M\r*5bij|ef#?H6mo"4^P!PGג )bIpY8prTХP'^Pτš&ᲅb]&$u1XtIC]!o}fNMӰ*/K-¼hܤ6.(O4%Lx |'Q&Ns7M+x <# ,v:K %ߝYr,Y2wBgɯRCgɡ/: s|{~Y,ҖH̠&/hinMi6iDM*=IH6r'Hru̥IHs )MR|Ry>)<|NbE#ՠ)e*T/7&۴866"ˁ+*$t$](.^o]KU7NJܗb ;BYpTi,N&8N5E ܏OdG'GXqMvQk[|5?SUC0݌7V2(-p~)A` іSɹŦrIBa^*e[Y2؍HM L ZᖱݨԍieoT<|7nxV:<+ݨOoF+ww߯ڗ4`VkߵߡaXkkDvbm86PmF@ >! \仙!m^Z4*׌ϻ'>aϻ;ڟwO?'?ߵ/7H9ΓOV//jᣯdR߰SJYTL{gm!3r(V~\=/E oS@ꞎM Vwtı!`YT4ǐv6X!cyמ&5W4!b Yz~oX_]kc׻~گگ; ]0t^C+ Y|pyCWn?g,[XOi$J4DʝK a\>5JL˥.p/>ߴRA|5ÏMלR |H'DG/|^B2zZe"C×+:KGiUu@/M]~e[ B"^Hq./[v <6{:QKr^v\!yv9YC6ގ˷Q_s٨P}6, j'G4[QH]p|J YRRĂ#A?q:)"]ïOK'86UDLR٪LMjzmϏ?]ڟkbϯj_/#1+Ba1:|B낯7^c3ygHz>C= ]s 11'UI4Ů!%d/J Nn'n'NH fNn'Nl'ۉ |oG_-SZqM hMmkD7CT{s]Jzebڧ?}Xwj׷G !|?;O )M԰e+c|BTLDw \J^"botwCwotwC_G٢0##bU*ݝ,>Ц#w7|kl0b$5~toQE(<;-^J]1%(W\L'] &!CJ zXi|B:?,yjSR~x`mI&wI`''ƛvor'$0܉7 or} |>Onx #U& or'O[eEsԣ,S7% ʞRهO@nGԆGo6{ hJgS{VHkվYWRRی'D SV/U {i+(5dOB p;p7t-R{gx!Mzgnۉ!Ԯs58-g:g"59|B9̺3v3Qs9.j*I{ҽ_ny a|B[8iu5]Ejr n-B*gsZim5/Gқ|NR5*S7pRa4a}\ս4jN9L~sp:-s 8x`}f02i5y}4Å}^}p|q/S oMqվ7>R oaF\~-Q.|.vm_7m|_wyvovle٥g5pٚl{³³K. .geKj`#5~!7Kw'ß^J|G q&YK//-zK|'NƉsI8q2N|O'Ĺqd8=q7}(oCr_J |-jy5=S#T! Rm;@h;v߶kav`@m6vN7y7zibyWɉ#lK[Ac|5}C¾o 7,oرl1kC3؎I5%tksW/4>sHFqclGQo/%5&( ݆4>P-Ʒrs7/-vM]2?]Ƈ~Xn-0tknŇ~pp 6Z;am4Ԋ^ mځځe;nߝgZ]軳;nߝg])okFkvyՂ<_3OEk[Djyځځ𯾏.hJ}F}}]Nwt>r{̸aބ}081 f"5}¾f~o_<^w{1o{ qIRp(R`/IC%@{1o{h/%y%e* qDŽ=4 {TPb 'T =K0 ~ 9>< Wk3?ó 5TrEXEaH5>!4v0X T ;pH@{K6#'F^N̈ ϾbE +h`E_Dhf-<χז8-=kז_[Zcޯ-l?wquJ |-%b)ݞ+!oT0oꏭ|5bt[JU奤 l9c'զX*HP4_}|x|ix|ieeee/dXIx*<'+X[U{n=VRUx^O۾ Uxݻi0a>Ҡ'~v`BOw-vH= w w뽛^"qo^o'ǧ~zYǠ@854|sex)ewXͤ:YD09p쥂f :]oS 8&tyCjx{t{ cM`&i94\c6UQNb^lB!r.ZWcy*h`Pjv@tw%ہv`l4Aw!8JPܣ7*^*hȶu+:u J'iU/8ѷuTRD~׉~eqkQ푠 0"hP|L~ȶRl|Ҕq;5V*Ċgz:.Wayi1^B*h7$RR7ѱ*E9ߐH=Ҫ>5'/!؂q|vE[#VJtä:M _XT!4+SH5݈ Qk#6a#:ڈh#؈2_F+_7-{>z豾3}t5ۅ |[ ;'ZDr+^>XR eՃ˒+- BX~ 3JIԌrTϖFR=ߴҪ9fb,m{gn'Ÿ7gXP,a56=*_K :]R,^vHmcZ\! ԁO WYAF3*x9Y&A|ۓ̪Jlaj! YAf9Q|"Q<1^*~D+XfB |bw'P։4RO:jKAziHIdR{^7nXköܨiF1_QW'ĊqߚQ\<~VM[R:_t$⦦<\zr؞ʫ/LU.ZސifZA'E~%NjSiSۡT|q*=UȮRv`J >7? D@3cF,σBڕ@ZJaYrT/'ɥ z >KP|:ŐVEA46C3ȳ 'Ե RGhǫ|FLҨQӨiTרiT4*kTP3Ũ8&pq'F^Dpq'i6nibhHRe֐⮓V5F5"|u4=p׼:zNtpuwhD)-Rfd_-Y2BaOr)K`ԓsR-YliHx>C4*N4*bopC.#ʵ+R=,i*{k-~BF.劫d.I{xTIh*zXi|q$tl1A(3tb/4jHug6#hPb_w|Bi~Rk87Tt ^C*4sU$N3rfe/-b[̕. ͆FX^*/ [#8sPJJhNpYZ3* H TAK[ԑO?]9g@YRR#FT,/D!|+j@#czyl v\<V//% %/ 21jzW#̪ZhۜR ¥dKIܗ.%$RR"ۥK]KId+Kɓt7!7Q%wMr٨Ų;a%pCw+Ԥ0ZTR Zf"⋃ ѼvXdmYm.EIǀihG9۶\kQO$L3]\4Z+.ώ@6kj nM!>&1F0ijwX3'}5YhCx9!dQ_{`!P-ppCE|Ⱦ]%r%Zˇ-N@eMF%1\qM{4o lV~I]?!',eB[2dO!YP,f >BaO53cZ >Chvn3BԽwhvnn!5_10QR𶰲3&wWqECY-` > %-p l8{ϻ*Cbhh wd< 0S\X lHV٫ӿmML*(a R! Mf-Ehɱ({r{i[h|B>1Ԭ#ZvLi[iUcI]RE#8a,_jXz hSm[HE wE=^uR> 6gQR7Kn|5wA3oqKkOs#-?Đ0.UOJۂya05lkX5l65lq FM\{ ;%7DS O >!F I|wCS _}7|5ïHKq\04ҞJ8VzIG&{f!\^ҵ;NÏۉyNgMGuM';RD>N'NƉss9s9p8qN8{}.Еq/50tÇ#m6> ݁CKwӷOk}c>k<=[14G!%~CW𑆬{xH1ߣ8ߣ`M׉ū:$ß^*QL*~r6e-ov{emXsWmR3I oK+ASϐ6J!w  3_<0v;yca<< jI1.jikjJdR-!b;Y-'4L\rnn?9TrO$Xs |"BikϛZoWf/Cf|;T)!cp\^j9ck@~opߘ++C |.@]3<%g)3,,yj=RҀ{Hsԕ:Jx(#c4,4l4{@iXiXaᦁpӰMMMzo5ov>墾Fzk >!*l@v~:T! 8xoq >g;6Ee{u9 >҄`D49윞oS > O/ޥ־J6]L?=®3lJ-Z?]+? BVw>Ϋa';|YF"5{4q<+}x888}Yqo5mUlj =|.o._UA'z8wГ scٷJ=ᝁWw>v|o Rsz|C 5?~KR~PBԨ/5jԏjTT|Tk,Wsz\?:1 ٽT ;\wb^}H_TnbĎtB8᥆XzH  '̡1 s&&NN30 >8aNtC? -0$[0N=>0ugC9|}xw}Ϧ<E)P*5%[gsDjvj t+?s/Pqc̪T`=Ԇ7L͹@  VkQw+5^[sh\8*ꥤaջ+#Rf59 ԆG͎=_A=`_ 0ՙ+!*QݑW,U6YTvC"'6JJI A>Tlb ?]f|)f:;-?Z#>;=2kvRd Mv552g]4HYs/ƙvpEL˜urkM-U.͒tEܗ.Ĥ!RFxq+I+!PV]veٽ*d]<_^ Hn<ىWLvvèK󝬧}.5dJG劔}dҥG3} ټt(s.]q&#ʳ5Xuuc`8ҏ. aTeH^}21ByJi#nAWOپ㜼@vW Y/ty*CV PƳEcJ V{4RU|H2 y&&&d ٧`pB4!/N쓋 Ty|\zlg'0Rer^็T_`<$|-q:4gsHM8`7\'"Ok+6x^H!PCdO٘40H$ tyvI\F|Llm2|B0HF'5H%34_ `-Ґ<2yEeuVF LeH|\!P{YNRG܈L~J`OPbC j*𫟟P[j)]5۶(WaD9yTK[CP Kr+ Ӹ>ii\O9PB@v v".KIK{Ғ.%n]FOK{P/ܗ.]=hCxwޡ}:+D8xc$(m?QImoxbxs~Sco4'Ɠ.OX<:ZcDŽ=4>!&>I:&f."fO=[QV+u+zunEnE[ԭխVVՐk8l R@R%iڍ2]IX xJSk=F+fրd.4@"XW:r]Z!UE_<25h!\ J|#)2g؞ѻCC"=(d\vRD(Q=ZE u!˴8s*庌(' 1-*rٮ Ym:oh]e8WYlK;D:4~8'We.W\K}!>xB OirP iFkƧDg%T]\RSBOGHERaD%$X RQnNJ$*'n Wi?ӱOռ{|B̩4Fr.!2NKͰE|R}ߝNTS'NTS'*؉݉;N4N41vDgGG:JxW%9.uFzgnI 6|97EzQYYGpx峎ù'?Ցt#f%zR,!wRWQZ|>];.őWtZ*:e)::pҁo[:W:<䞣=^?$+@^JT_[J8U퇩d -D_&I ּ6Zi&ֵˤbO<-WXHhq$Fjq4|15Zl&u4*5bhJ\vKz6hA6\跻qgrH+≢_;TҤ V`SkvB`k >7iib$bEUmE otdŴM76GJ%-[k۽K۽ ڰ۽'PV~P:R o/ůDBprUorSjfV,1'ɛcD{"ofۤbSljY\B'-̺!cqYzܠz,n=f㾼]ꚘlZOTۜ_^UJ ^.=xhtcvWV3(`w-WA]%R2tzC֪QIb7d;X`'ݏ]V̦c3 n,_ nXuu>C 7V nxΐVKRB4fq%cGQNv٨Ŷ$..YbE >|q^n8tLjP8cX=O.8j FL6ܣ\M5WRkӌeDfuM*EOKH$N-ijfHOl D=k>$RʮHkZv/B | `]3YЬC=%.=˭D3>!|wu%RAgHOo*U#jox7 Tr=tlOu֍E ty,U1z Xk;xu#H} >u96CܓzIÜ4;S'U>#z%yttnȡwo V>UpRiIvRR;FV(#ʈȡ2meX9T];A;fCvti? +|Y|K7YSb΄{aKP#*.9qxy5BM>8Ave=#.EHF.V.XWLeʰ Ћ.ӼX&"l*K/464Tmݨ:I%L .UVZZգ[ΐ6E =HL?=Y\M*(>'g{ RIhiT2>[DR?i [-Q}=|Փ3'T碙պ] ROjvEW͎y[pr+![ԓ"MEܗ.1'H'>QJ.='?.jzcJ#x bQ$s&Iweܣ\$\66I2Ņ.' 72^ԝ)P(ԴrVR+wjRƠ%mf낿 ¯+7>x|FOzß @3j?:v)7pK~56[0>36 쥂[0R3.+qie¤f+M;Cj_nj4 F3m^F3d_^ {_2V̱Y\~Q 1lG|7l#Ԃ^Zկ!~3k>o~7FFP>ވK/o|5>}c't}ǾOI,_fw'sN4邧̷u?y!.;ck{{RR/pO4M*4=RA.A3γ>vg~<:NYMg$9vXX2R5ng*CW‹{@@2;`|o7 7 |o&n7 |o7 7 |on7 4n}|nVz@xT?|yz=m: [ΐWljq8q=qN''I8q=qn8'N~O>}7B=_ w/~%O|Qm7r||?Mo`{j׷G !%\Oڗ^>>}*ڧr!f.r{kyP `߫b3E Y_q+C)(+?Ob❧PJ`SEA3sL*ŸfLX34/+F[OP ψ' ЫmT~׏}b߯w߯WOE-_ghu߂gOFWaqt)"5\]1KҡPNj_%eat2Ծ^xRHuvpo`_v~{ nǡۮ+m6 o 8tve1{a*^*c7u $bu/41Yc?lOsK/a TnlM*}OX3|B ;F Uo#ßf!{J|,fAX tX/i4}">&qt֙٥qtRA37B? -yH-fsG!ut;BthFY1Cj==&xR 7\[F(APʫԊdj[Td}xyPI]/](_ ̃VaTjk:r\- k]﬋6 e0uQz'>dtk;.dPcCd!sη(E eCd8D=D!2CdLC!^i4D|@"8Dq']$MX['z ҏa6y'-=0OF$? f>H}* aRmw_ti|N;݉4tGC2*ͳ.2*nOb:67[KSSHO/Xx'@@c(PJJd'_w'G jAW@q p pq q 8q pq -Dn IP1)lTj -?(W)5E{BP)\q'6v sFE^iȣ }1~ #bTghB-LH?yK-x jChMm{C+z2wXYftQ4:&0>{u4X@`՝J:hw]kFjeXj41XQ^-ȇf4sHTwzMovFE^*݅|3ؙf.Cҙehm/4Xئ ڥ_B VC ?[` ?Ϫ gՍgUYuᬺYuJ8{V8.U{V]> @X> @X_ =I|ۓ{IFO`حr6uI(J8'z QpZ˺V̥.^Z[X5T_1rĦȕaFQ65ѻM\a@qB m@|5Ok-5mִ֣kZ-ri-XF4 L0C_Ӹ4.,;llY-pGVuGV ޑm## ȸsg2OLcYS+UvO߬Å *2V($^&|TzT^\+L>^ʵ䃏ʣ^禼 >*;n_df3;1#_W/{XXR%2.& +.Q~P:ROzG69rR㚄*NB=MBvIPIޓPIh= u*NB= [A{iP 5h 5A5AC ߩ5ccXn8=ccyXn8{,?n~7@/c ?6@O5h5N*?:[n`,XW] fc"kJxyDk_.ρ*E6iϡDŽ=4>!Fs9M"|k9`{ kPQX P[鉙k|B0cL *fX0CRi hAJ_$ԁ*e @jIM\.נŠiPנŠiP/ߥhPg˅Z@[Ӷձ8)aק0b++A^*ĿPũUT[)?;'īzFK R{"/lF9"|z 6oL N~wQ8:|ɢ7 嵮hFd0-oflB!(xv y7dTeX^ XZÞ1tf.{A]ڴH!L|O(eF`5^F x xx xCcᡃCC㡃Cc⡃CC㡃߇qrח~<<X)q>R~5L5_4ʼnK ndh TBEey`8G1{m(/Y`Wg}l4RD? 4x܍\VCB`,_O^S)[ l)Xs$wR,J&/[oN+?tykVk_Kր5^j+| -_(W`E9&fMvBlIrp VgѧR]zkPQ4YTԠTGBǗ˽4AE [vkоנB[ 5h_jh-sʺР`R@"TO#%>$S+nY95³9ˢ ÈV uyjE_<-f|d0ToKVq.]sk\>&y5bV!` Sƴ~v%5TYG <[(pC9Jҏp2QCy*ESq(%}"3;,Hķx]g&; E3IΧئ&j>s ls^iG[ 1𡺝̮{8_JJ8|RA,zTDවOfj2ԤMM~C~Amd7/E7Vl(Z/8_kj `Ve/5oTOFkeie#\^W++•pevnB ~񣈪>T1 \^O&I,mK]}ǭ_ eB'2Y o'3'fƲIeۓ >z7cb+¯7wㆯ>#|3lq+|F9|('71  n!ˋ-w7˯Ċ 3_Lqs񋉆hq |~11ń|/&^L,~]L,n'Vhύ-2 Tr~l{W(Z,LA2 Fݘ[ TNm&7K$s|I鹗V <,?RsPqQWom*Vĭ\T!4XM/r_? %oދK,=Q,TE\zE{8""΋XvE`" `#Ӥj*zX)[iH%]NqBVZP#OB=bOؓՓjT'ջ'UI`OwOؓ*]OړGO5NOfoс{RwObž4CPWOw tiwSo}lMh6E B Z4!nMo9AQ7UQķeb*&nឮjI uiv~a懴{-<͏ixJː%ڑj~XR]`s~i* Gi庴(?ΫTE{e[R.yd (\Ƌ..]Ð݇r]z VU " /}L~W " ȷ\q3A6"xKm[0 urweIe;XlnŽx72_6'6'9isB]6'#mNksis2d~9/:<6^Y/dR:R>ui{/ˍ6Nv.+ ev.jJ2SЫ]VjJB_ ˈנf>ys/b'6*UAh&tQh/]{.rWbeӺ[F.|ܸWEjEl(dיeG"o <, V6 1#Q-U[=i=HT*lf5 *]m&&.,az]mt 4A&tL %ݜ<5mbQy:]}|ۜH Kdo q'],V'9a+z,/=0Oq.f AҪ1uTGQQqT{T,GžGQpT{TTGžFEӰis?s~S>͸YWӠ_`PW\^z(>Ġ^8urE꙲Kn]bnWj.zJ=W҅.32_̤ %]_v4 ixoN ECi 8ԐBܨ}RɬEyݰݚ"^q_݊;Z;mV\B]ńnh6d fvdBSI ;Sq.5k- ; {} Ný{Ký^÷.SlgW.n8W)F)KeԥKeԥ .F]FRwgQs^rjJx_ږޟB.="n`bgmd[1M JY0qoyRK¨  ~[#czh|Bt߳T!f(zƚߣQ1ҨhAFEQ}FEK}1*ڽ7\.Z% z :Dj^. ^{zljKѓ*!`Kۨv` !v^j}5?vRyx6a/yK+*x9KeӢg0-! -$ Lb] !Ԧ&'G"w,k;3vB~+4ddKH{vSoLBN+I4']/ph B'(}ݲS!T#/4X[:LПM%%1G^vqB |[Uk:LoB[߷C@ Q!`zbťbcv>@h*F"O\ ncz0^R邅pK:jhR] 22>" T!\,&BU ZHx݂YH#~["ny/;F?.ȫ덍B]Jp5_4 똍Jl;Qqg]ʱA]~?zpFvrjJ HwE XRF}5 =[(} h6m-JW^(m˔iMl6SX('5ʖUFӬ΋(ׅ\+]yTI2|aGLd.'=þ8fR!,%@+=&'D- ŭR4Ҧ2!èQ֊XQ)%E e+yS.# ~$"c* -aE}LJLbI- ;_Q SC*6ɅWjǒge6KURsYz jYyyF+.Eܹ)V/NΊ_DŽp=KYv֤bSogs`wBxu3֫)c˖FE؈-LD/^_- p٩)i#dlͨ+! <08AU1~i%zmV`KK l -_=cr?+my6heI[xbYֹJML;79K}na`;r{׽^Ӻ章ҺӺ_NJ޾׽۰.3HB.M'xP+txh%S urť;M]fvnYoGvۥ/6fy!e WWIW Ʃ!kd ~TR&U6N&omҦkd_;:z.&tmZ(POU`K/![(P"KwcQlWwvRig{~푝vζ/.^_Ғ.KK.-z] ӊ<.gU[M ףzi|dJ9ST!\M}۹e| v/y'WՔV*jTWTk!u{^4o^OՐNU|!zX(PYBclע8/O#8*]qU׊=iΡ+=iX|Bcӡ KBKi/}u%~|Bpl˵~*ffƚ{R;'*7B5DFaOr)ƫ}_>% -0BPؓ\p/zsz 77:'Ÿ7yd9 L;tNR.GjܡsXw2 >'IL<$p.544::^HkKxͯ3ͯ#ͯU~;g QuV]ʫ]y7nT Eo+"]$d "F| #4zG~Df %\RA3, )M)7btte&]KA ]fe~K+i i=\x*i-'[[ %tB B.x_ t/t t/t }Km XO{ZEF.3*0&4Eyg![(eEyI}Rvm7]qQX;KvͣRqEy/.Aqc+1~>Ư>ƩVc. B ?(&T|-%@+=n'D0ssXK JMǧOBK>[qz|haӤ @Ӥ"a ~CjøSxQ>. Z~w~73V/6xFgϯC^팸rV3;R5%͐zY&h!\ ++0"Ȣ_XGƉ਑$,KY#Ҫ4ABK R;zn!7 &z0YA|7*nH^AKt8}o"Kw^'sw.z'G.ŮtžE׺ d']|7 j.߻X`5^EĹ2]B]\- d.tnMz: =9®F.ĭJutz#yx_Ckd{=WA5#avl]SXmzX)kZ# J.O,ڐ5Xnւjbh)Zjjh)ZjES.#BIҥ']FetIt/](2. ]\~ڪGܵg ,Vz|ԌO ˇ;T!@+=h;Tr~+nkA>IM!G= >!Y~P=%%9{qǾR}?g&<8yþ,GG-Cl$Z rEt)ۦM|7)MMh NMMh NMcSG# ZG ٫$7| qFƚ~\iK?I]ST.TͰR3|!oxqo=7NCx_X88 8s$r9mٷrVā~w٠ɶ3Np(W\dqƦiJ2}UbBC͏qOm!ziSAIcOZؓǞT':T/iE1OY \KZ`?-hlnXz *ON|Lܓ4a*G*(a)Q'͐zܓfw4ݞzH[" t} G\QQ15w|7* 6Ѧ8O,JFBc0zS@4m cʘgcShD)6ZKbB%qx zl/=0Oj~8w;g.+.UנyiDmf'=iaO{Rs>T_T>lR3|9T> L |}4.1zHXTdmXfCu3̲Jm36N=yp΢,Zq,ZEY,Z߳h=1qoKO$cM(V.x:Ap钅-`2>[j8V+V -BOV8Zjj0 B[c+4lE+ǽP_R#555 ZYIόZHao`{>W7DgEmt{ 2Mj6z2>|X_._ 9r//7 /7kz!ܾn8=۷C} pj_vm"fMDMD7 6&ݛD76_f<:`GU:*UW`,L !_v?!F:wpW[~oXc߫j2rW[J|+enIud| > ]k]hk޵?k:]tÖ&LI+2 ZXK6Olr78XZiS;TҰ jdѝշ-)'Č"5,كO #ꧾg' V'/ŨIuL{8_MEj羮<J`֝2YNerּ]ּuUvy;" 9!Ո$1"(ƫT|b3k@yo燭`2> je;Abqus+*,/g-ɝz%7OW /z~RCzB|i5PPraxlBl]Ќz+fd.z!Z8)D&9Nx)RlIIu%NB*ΧQDj EKͰ?G "PD }V "H +ݖRD }FVߏ; NWa'\ž: SQr<+TXl\rBBdr4\*/]~A$h%\' ~1Vq&kHmyf3|kJŮ}I|٧QBrCe:o)O#F)rťt9I`քŌ$..ؕrUf{(횜eM3I~1\RȖlTԡbq610Hg;JНIE*HȰT!RAn#:%ҵ:k0޸.JY]tT/y-G_=c!- ]jlc;Չ;aHnْ(Tjz Q0NɈft}brz"dR{,h|M /7HumjUQE>w?nC.۵:^dܯ5W٦˔Xs2א&˔Vp=KO 1c$4m5,H+Xop/ Eؙs|8gh _^lg_vbTʮ[UƟ֔pKϪ?1٤:B۬5%|;w7X kߵ?;~JwQJ`oyt'@/?UyNRSaou\!@+@"*fHu >Z|vbl40+Fa lR9|.UXKT{ލKt{/n^ z/{% T&' WS'c%>[|[-E>;(=|K iIgHQC<:PJ@|" 6Ubg{Tz`Mh.$PREPfwneςGolyNfV.q.KztKH'ty'LZrPëT޹8oݶAf+SjQ.qg]tyeFB]\R#f&m6>N7e/EW.z%htʫԌ /Ii9{,4rƋAvAl9X<'6[Ϋ`/UuY ;`U]4Jd/] 2kr@] ףz)e!R]3$t&Rp m'+|> p&fǣ=oG*n46"&]r`C+YsnJ8|r >wkgv`Moɩgrrꖜ'/ɩ[rrꙜ'_8u77Lh5vL|XpBt;dq4"?]]KtYIҥ']FetIt/]Ve$]t2_otIe~e~L̟bT=;U=Lus;QD.zvGe.pzG;]6/YgR.?/]^Y icx٨ˏeh[libTy.glu5ti~ӧQ]ܭ2κf o͌>J劫Yb]e'qlx/; "ˏvI;}l,&ԎIF+d llث x.c ڋ/QˌrwU ݊i1Q}P wR-5̰(P"udIBQ ufپ4eٮ~N__Vee'Y__8N?Iz>%|)JO/|}z }h]( څ> }.څng.Po]l]l$.]l^F+K 宋 ;Xa9 0;a(a54iCKPsol7667l __x2/`*c^Њ6=%俭\p/κz39maDm&]\*RGvE4W*_*PIjax7ln/l{܏ ep3p^7\l뱡i[(W\v]7v]/%IwP J% a^ĝuCϗeO^-0?\x[`zdW =]-0t/]?I2K GRΈxjW'fˈ1p 6рRjR+״ A^Y||nY?=4>!V߅fIR;FҦQBYC*'۸$oװ>>hL%RX@ ,Ł\{iа޵?Uzk#Zjjԫ!|+瞱fGؠ#T_Wh.Z"@r1X3X![(P6F]'v'<[ X9+4٨KR[$.ר],!^ <;>x/,D(}PyxH_tۧ B]\q-zA6DK<{| _Fv!ÁWpYc,m2ni Q QpbKwM3e>XF%QE؇ _!2* >^ĝu)kˋy=g2 ur9,ԃLtaϚuW'劫x7s9#R*jlZ(eF9{%Ed'#rCP E"%A.pQYE>hEydU*+ 'S꓁q.D< xAF.+ 2ؑ.u= *b]RX ; ;/S˒L1L! [1'\Cv/SHSL14)9d_faCwYˬ('Yq2+Jf٬ì8y+V_eڃGޖAiJ g&P^Fl& W*ʮTTthEFMA_%OR+*0IM0^KuD tHE/EQMۥX^W 0unN /t9w̒.l3*}F.VXW=~Y5(˴]^X'> )^nn5zɷ&_R:4JTԕsцCj8awB!0%p4m^򴽧i{Kv"bAgQҜsGsڱJd:X4>m,yQ9K4RA(%gk-4] g_KVO!lե *e|e|H..]Fe.]?Х-]`Nuae>F%]5u]`/QHIPA]p;nEP:٠K>ƥDZGZΑqc6 ?=|q;G:=Ǹ4,.ei6EJ&6_1qYbm*;r`VɬˬߘLf50EYV|_9w!\JKIߕʼnK5,%\[\ n Z+^At{Wl  BW&Y X}ŵj"EܓovKRo)<_ -d (\Ƌ.Ln˔TaJ3bkQ~1aYbW]DR,lCnMk?h 5/F48 :j^U J07Iu%$tainVU4fifƚMQSSnZRS=5EMMQhҥ}Х}KK..]Zҥ}x2.32^H.#Ғ.LR:UPtC٦uX> KLXORa6,-3`X4EMѿiM1_̤N̗.#2.L|鲓.32g¶$[6* k)zL/=X'Dm烧iR n+TRA|5+/%%b[K P!R>iGR-Tav-y~1EFji"]b@7=Cj2X~ '=u#!'~ݤ}&^C9`|wsm%n3H}Gj|w79k(s,iϳTӧ 6 Ty~%1"#x],#qGB:aY[ l|`SSb`oJ`;{i|O-g OyMJ [a7IG~Ԍ2F{stCaF)o]Qh ~atpP +އlAA',/"LXn q]^zYO'zB\4Bj^*hsHܙ;q3rfBgyۙGIL̻\ܪv FRngfVo2O+ap+PUjG8㉕1&쉓AL4*4aF='3a FCG+CQ Xig5_ ,j%5{+#M@[*o!f4}^W/=O#C!iFvB8R59BOPoGh%9BMP_PZIP_Г# G8|4ve'Ec/׮(|o?jiW 0Qvݟh'LCBVßz·ҮD@TC/ϡ9)=Bɒ}d[&l|E"K=yH^_^QW=yEM^_^1W Utn&їɇn!E_^M%fyBXWm醆IE\;]q f aȖ~kV1x-FZ3{gLC*s*_jg 4@,j_flSD^#v% az!dPQ+GoT_b{z[{0ի=zۣ/D z;/}2c>q0Z(w:&`OG/'E Zt/6UMdS^MdSeSlzTGhS'6FP=͡5i5jP3͡zCk9TbUk 4oÑ|K{G6Kj |j [RU~7lJd:mG6K>ng3B!v= U vb$h/!ZrrQ!C/iێٵ)*X) MYtUNMKX'HBkR/3K'ŸeD;j;JWj(M^gKQ{uG-uGiJkm;j_tG5\4\4\{!Eõv]:׽pzp :+RO*4(Ҫ>Y{kE\6Ϥ9]6*R}t#Pj&xwS?OZմM⮷iq7_w%x-Lw]erf]u74}C+ե[ʍ JUL!o؁JhmVY4Ѭ毘xuU#uU3uUUUUWW5RWհwW5_tUnva`;Oa|l0lvvzڑzږzigiGi=66U%zSmYV< x޹򰢞,h.Ͻ77Ֆ)+=!_jw|q7=.*{Oz\E;Gw_Mi뗛Y/˦^Q8R]k_v-..pfkvVAdV§C@.OjOA-5kU{R鲱b9V pBV*qL QlxWOB VJ4gP;)soEKJ`+hi״md ߣEoKb-բ΃EwKm%`Q{j-FƇj|Ф:f|B89,|WwB9ii|#cM>ibOw4O'ͻO' 'm&I'n8<BVjkrUy>J f5+_wX kݵ~Zc/=|'J$ʶazh|B-׏ Jy T%1!o>}??>bwXK|~WSo]|B؛ݞuV t/o35:}i]?G7ᯏEO_I\I#̷&W[7dR-kvyg|U_]k`׻;~گwWIs7/o{qp>||Ӝ ~_{su\ؾ'J8\~6>!fʇnSe/aǃ͏dfj(}kc3>ߵXkڗ'V_x+"+/KH_&q$>"MX)[Q>kNG 3{0a^&̫^f{0a:an&̭&̭^0X١zuЭ@8W:Uㄮqj8;tB4P kcGoX? ~kc7kG8rS7;n\'Du@ac >z>nCrQun]뎊n ]]_n8u_0ר:r BjuèkmiJ5S6הMzhSկ)0equҜBRhqئKb4X3To\9ΤLHb ;_g೅U3],`MVo "|pTB놿VOE8l1[t[ -aapZ8l=l1[-;NŽ7ș7aIwIq9qy#8q+%YыLJg#V>!fܣY2u [\wJK 12"چU$RkI(Y?pm.߻lw{m.]6w&5ek]^^Nߌ[{!.po.M'3n Cj2|aK.q~4B-ß>lݲRrtiV͕*յ<3^5"5jd7EOuE *RCkRi*瑤3%Tx|Bx-iĎHM$>$ jQ}P Jj_D 3ƥTu??"S >!jdJⰧ䷊?ҮIX0nxGih<6SiOk}o?~,z6myY0sKga /SWH-8s*ә>/>-CD|KإZJWs'Ĉ[,JEZrO-횺pƚx5[vQ,˞;^M3](ßj>jRvM=Jƚ>O#dfabg2fr*IR>aggǎs`ٯsU8;v8;tbs`ٱDBAr }⥙mWh!w+#\﹃RV*h|Ĵc?M%wvhh9ìdH.۵[ $I Eܠ| \v_zЊәzC+O|ͫg)l/4X3lI -ВmI-i%ےZDKZ%ZBKZoKeIh%myG~2W_ {: K´K&hbM ٌ`w׶[QTR:7& Yz}F}fAI;ZaߊQyVǏ]6hq&'Tv0"&"ץ} ]]/R_otIҥ~Х~KM/t9(dʲ_5|<<*źe'DzueRMѥ/=!K.b.Aҋ&͎9!R,_wF 7| ~ ׾kL7ljm;SvB m|5{Ӄ FRdlAv s-+h`h =QO=H=Q{"AJ'sO4ROSOԿ艎 lL]yئ9*#,N"-]f]R3V3ֿmI%ߴђYҳ>&Mۦ^Қ fPlR>Kե ěX<{PUi)rki MGx˳Ks7PWv̥ a4gHW?Xkܵ?;kae#¯~ k=<5T!3+g qlJ&$W\k!Iޛk}(JVz0B8g(IeͲmK6r5F+坒55Q;{5\que u9-2iri$pNzQk)gK>l;c|8zʵxO>y?|ߍ>O >@yJΊ?xR^ X>[HN,m3c`MZx{>o.V TyZqܫ_aǽGÎ{"'dZ:-G"ucZ.n6Ȳ>kɩ)O)F1 h|5րZY.uލ"-@/6^q i|ؾ6:]buBV*MWHM"˿44d'"!@+}E5/5h_}\}^ڠWU5 :t^fl.lnzٖ^ĝunen1r7I_B]\R3"ːOrk؁٩]<_F0ϳM2] VV _]yx0(Wۢ]T᪚zdf(TJD&pZ#XPJ3+OBX<W%@+zw 9K${\JF6X~; L;_Afڙk9?"ΫԌ42d6ӎ솛iԣ\q i^ ty*vB"W߄rMj^!0>!q.WWbxZ> M!Zr&h! C!:DChoСSǎi`bԱcwԱc1c1ucw35A5AKMS :6A&wLlMпj>x]:LF&:LFk$YU*_:TtlT xy|Y{vƶ];onw޳r~"W]~鶸;. onvo/κ<[=Ranw?P+ƫT5R-~юrU-slePc%X,n /b' l_mq-~'ɶa[l_W+$Gd?ر#ln}d jHA$TE+*4/ecaR4{6X]zAc|EdQ+YԸ-ɢˢZ /ZɢFE`ң=_j^(0^Fl&#4 urzٮ>*ȁ0MN[Xι5 F.3 =q^Zl =– -BQlmbgdܣ^.XW{eӒ^<;lS["776]~v(&˰AM 1Qv$TjfJa/ՎowGvMFoOLD.%!FUc`3!@+eNO]@#0[)k̘T3ٕpKYSĈˌs9-(+t1-$Ӓf;Cq1ޤyK%%:I~͈08T?oh< gx&ϼgt4yBhD5&vN=ѩԲcNѩ6t~;Dt {I5?s$ *5#BT0ng劫ۆlez$ɩ˩[rꑜzz$nɩ˩grꑜz|.3J2_S..3KO2_R.v cɺyye[͚F.V.XWp>䡼4 ungrl-nTO}#\cNT^z` cNY3ux}pDsVoKVl˲^@Z^z;YsN|R/RA|56s |#l$5/@/?(W KP퇷<E\qBc{8{&{ǽ}{ǽ޾=q[DuUJuE߸W+xwn§6aӰMa{aҰMaҰҰMaӰMiئ/m~¨K+I~鲓.t.tIui%IRbZjcAA1vP;(:VbA՛}5FjS-6*5 }^ٝ/ӞCԃG cEI|e}rE?n-ŏ[0q }2lŦt eU׋(shJ5 Y(+.1vU0 "nEvBe#罌JhJQ_LtlP+W\ʋAICM&~cl=![5JD&ros ajȽ/w{0n:Y{=vjN;KjN_ YYuI7P;9˴wȔIe!vר/]E2O@Dz̤"0]I4Bvˮ˚kZ AHð8 \â>}OnS>!|z?>-nO45d;0Ch,x4¥`!LQt_+pd>ը}SuJlڧ}:NO5jd9u}*NҢo4Iu(JӨ蛯ELKL^Ӭa6bw6jdc9t%m`lFF3t-t!{1j$Ҁqg] ś"/;J9+;t-H^y9E~ј{-#.F.-ʇeX]פI/Ҥd&%+MJ@פdl&%II_~+%WZty^+K!1e(eFR;"_3̆s.}i d']F/ӎɇOnsc岓.͎ɇܰ FP+=v]'d>'}^R6.#d_}2ي..貾хC;~:ktֶv}t Ogm잞t ^ Ktn8Y c9W ]^+b?%.$](:7_LL/K׋(XڸfmlF {-[[4rJs[4inɯLs˖틹eĥ_++:zZȾb$+^#%kʦڴڥ庴(W]W#uRd[;d (:ne\d$EEZr\d\d$iEEfr\d|"v.E"xntq@"v.2EE4]J [Z ;'rL@/?/E:R5/ʃ/䢅5TA)#Ed?d%C2Чx5(g Sna.j]Uv#nnY ;"nlLX,sI{oW'a|*kDym\_K%{J') {Hu>! hb o翮),ٞ&)teus2{ {y7*H| žn7tlRuxݕ8Ϣ|C5zנzQ>?cdizHun?%f1v٠Ź1\{E\q5ob)&4E7Q76ń|i ջ!5S>d1MY:7:d(l +gO9Y*1$/Lr%򖃕#YJ&C5/]nLɳ7拪1bnA'.J1 ЇR$h!\]ӂ +++zW~tW~ W~^-\ \o$8/wgM _ )x^(Sԁ煫{wgX~k,\;a~Yثw~ѱ"CF8_>N鞈NWCD|Mo玓Fvoߔ"WoM>_<{V){(W\ʋA~Y&s,睂O]Ҝ ߻?4X^*h]1<'9K?]璎NR/=Oeɤ:|y4p;Sopjhf{C(٫7PQ  :𶝁u,`qۮCӡ_b w6D|;J;ϸ׈ut,|=@vҥѥ9Gg|x2ѥfiѣKc![(ׅ|ؽs>w|?󒜼YS!\'fX&(qVe;_~*W?JtS^N :ŰS'KQɰaeKNVN*n劫[';A6ǻY`ƻV`kx5 ,0&{$VޣGWe(>rEZ;OyٮpĬ{Q>rWwdJp\)v])Ww$JL{f>lו!gْz,,&Kɒ˒z,,i$Kɒt+ZySY_4Ǭ|f>W>ҡDž3Y$aa$K)PJUD|),; ![(P"neM1cSLly7iS̏M1)) sMv%~JTݚ>{S#ސ]\a# o67b|l+Mmp[goiux{[Gcium:."\d\d&YEEVr\d\" /]]7~?貿e']w?xVw?>FJKY֧ؤg%ؑ*k^*h/qC*'t|`a1GCNH%T傑-``ɖadZ]Sҡ0V P Egh|BSp.)m1Pde~ >_~7^_>(רp὾<×<=Q'Llx补Z§50$NE6E|}%*QPOD _ޔpKMRRЉG@ROȆpo|kVk!摱&tz-OKL}|AIpS*OCɵm]6·ҡ2W폻eϙ6FfkG)U+X|b#T^'I{R+:|vіn8]Զ]4 hTt\Sb.~趋FZqM^01X|x*6?Ulrٻ_J)e$Tx*Qzĺ&Ԧ1?z3뱕&fF\PQKc-i[dTWђ&KLףYʆhIÛB`CjS=^jMaRl=tlhy2G7c%b%hktXe|QԎ4T B*y'YTNGB`KT>%'{T [R &{饂ٙ XbLҠۀo6K40t&W"X͎V\y.wiNfrC ߭TWqwƾ/pC TT{%wṬyP>yw=@R:O;SHuL~JJ |-4X3ot^}z?$0ʤۓ [![uS#:n{+7Uj >[p cNb XbVoՒ˒Cgry`py gn֠=cj1.GFa^Ńh>>WϺKo/4|B*?Gة1v1a'?4@+kT(5ab+Ȯ]zq. :G>Z{>0OF% _V"c+^:r4 q`PwDɮ?iVm08 $!qTtBKp$Pa'Ev*X2x6f E|X,l 3 iT{۟d!.m|JD0dI6 =nvƂ&2.(#3%R$ݮ[M P0- ) 1PJfHuց>@@Iu@u ԁAn)9y#${3rHT>%ȷÒ^&=R0WV/K6,kXBȄźa@+PQؗaIdû߾Eq']D*ҷISTݖR|JDp~XecM\*Ap5ZFkP>g5㝕pdwô@a.U_TL_\p>(|D|Pjk2}=W$7A W/gX>`ye펢g[WSb^^H彜KʹӬX-3EG%2,G|Jl_%GUVͥ$Nohfk 5.FQ".)Zc >zw7}`rپԾ> | ._d;"W4x*'Rg?HMk/%c]oQ'ߢΧDڢk(J |ߢX~xGh<6SԷ3.dXs%NIGRؾu^Kw/5]cT/qAK԰єpJΧD$4͒K6BjŠ^*h%!WρH.jصє@RO~C#I\k?k~>")~.jyю7:ޝ?~Pu\_~_+t݉;nm]wܮ;u]wtvsb'i?2ʧđ b#R[>zG?5xϸgxGh<+9Oγ\]A5 \+޻m"OwoyްTm_Կcl֯4aC^p%v0H0+f&E |.?",s Χ _ o>> m mB_/nh mmdi%g[;yY?kdu3I&٬إ `׳'l_H6.-#-%ERG\ݔRA|e4ji+kmH>6ʉuRX3qn}ƎsŽsh ;}wFs߶m߶7m/}>oۯUCSj: ^l׀jG_#ctxC?5hK9ejKoDl ~+KΫ+¯7lE11FIn د*JΧvb4<-OZvj9aIR;"^WU #V&2ʧD\]XsT-, `T4S9O:>OGh<+s}{(ț">>i<^sՇ<N}CJ8C/A>Tu;Na8q 8q8qyfqw9;4ƎԄؙ#a7vڀ;m\7v7T#7vh;toS Tަj k7k7 M%,-!傯f9|4ۖ?v.Bb⥗<{6>n}>n6(iFIXI8]IHQB:@N:a>ylxJ8ePh$v~ehJY0i`/s3ֿ]oX+/_4Ȓmi &)|JL .÷-"_>(]-QLG̗mOngoo}jKVm|xod<x0 =ۥ6Y q|Jlkr:&J a`|5ϵXk'}kXe"ߋEŢ)F,EosZ]X|>c>_{g}k~kgٚ 3'GJ|Jl:"!`KlO ~/3_s?M#|MX~_[ߠ_^ *wߠ>W?W+~Cۯ3~EۯW}Fۯ7_߶_گ?+~kگX_ _nG ~)~C+2e$]Ɨ<BU;˛mY^LnzhT>%KӞgA!GgwK >z5EFfƫjjުjzzzEogy0ROD^KwK.ut>jKwR<.v]7~]874p(zp ΧD Lw狁p(p X/b/Ҧ#mbb"j 3Ҧ))jj.ܠ|`VɬˬߘLf50saLZd5]9)k"$SbeXhȴmD>Ŧ`5X'Q)(_(7ŲX[VM1 ^ĝtOj۩h1T`g&`Tɺp!2\zK> k@_i@i@_='LAq@wٮJ:,/TvwЁqg]Jy<u)z}G#'Uy*fxZbU4+h!ƵXظXccc+++u<6<<{gYԿ)a(.6ֽؘp>%b|Xbp|eICÄ= `f)BݺNT-Mk%a;P+jo .7t zW)]l/]l.$lP+w]l]G3C*&(KrbxCN+}`:SN&S\k+XiMHIkV@T? @S<[?,{^?l*z wƩvc_~|^xqjqNPwޯjΌ5YHǒSM/\xR|i)g\7KAzc 籭y,;cר<4iKU0]n3"0QFH2 .U/4X'FOǿ.d:$R|JLϬfֿ ~>_S>< N&ŸΧDÅ'@Vru&ɗN J/I9>Oɗ$u7,ҮJ a9 3QM3XK)Pڗ!yrd۩Z=R@6ꂯ}]w=jQ˙l#xJﲝ/B.ԱOkR^}r.&]d1SyjTEvrڅ$7mO_jbdG"\B狾ry%T/QwIV^dz/t_Wy=K7*[#x_$E&\AvK2|ڳ֍lLMP]Hg#iD="p>%R:qnW!~iR {?جr[w>)Y˥ =V|9ZX0Dz4aF V>#hk+eJd>qF"^=T@ zH.y˾t1wvWpE/]uEUW]4oF.e.믺}]ĆL|i~kQ?XW)̰_EEPI/N< *`τp= LSb{CwkJKMXYHoB;KOv.# O%*@ʹaR4MvR@Z*hU%丒|/ruiee͝RדA޷`'q{_Oc0W$I(*~sZ?U ~ҿ+ z6yF3k 'X/D YJ,-l3v#7|PM~zHN'[;~c | | (???R?]6ﲭe@i [xmA"NUP 3L!.iuݠ&+Ll{Q֓lIހөtsel7׃+Эէ̭0pl0|-oǍ3Lլ$~JHdd\)Sإ-kW |{mwiL{Rl}:x;((RWO^E1g>g6H ہxIAhܹ?g ٠\DJ^-#͐/Փpߒh^N9R'5f'Xo+::l DEiOk%@/LgIx7TasJg}c}.% (l!B.^Kԅ^ &]K\*9e!\wmk u8ҍs?oCV`V*({1o]5_y,u-}-׵{1|-}- {RUn)77 уlqͤOd|׬K!XkgYf[!U:y2:鎲:cCvv5yuu:-^g.~!;t{EgRr%:Ӝh2Џ0Ū1 ]ljVR֝iȲϤ六W"!G*lfYb&yakdIն|i^͉J|W"𷵲M~1'rL^M9jĮ ?M`f?֟|W|0qLT]*oyz8+Pmw> v? oK[Y7%-'r%,lt$CjkIhW$GJhOr/!/$[|~ޯ5i"_~y~/嗽/ݢK-[.ݢKn[.^Unѥ[>cD|AfW%>:|=wm.oڙ߄_9 ׾_uo׾e߯}ʾN}_u߯~e/H(JƇ8ZJ7ֻ#; Ph%|.-]i2L||z+Y(%ƲHDd>h>O6RYX>:^_$ϕ?c{_U%/5t gLRAܓg 7}nM7ήg{oE7Φg{oM7΢g{o]7Φg8M*7>sw#ڥ9 ? ~/<-߽ߴxoI{ij_[=`t\ïk#Uwh2?˾?ġ%`6u=E6H8f@׵e|kX $rA)O^wx0i5H(i!SHtOD(W,!$ 'ZLg,.f8c[f+M>^7_L٥p[k y>wc2 :xqP5z5kTs= )"N^}RDdLt<;'ϖ3L^g$<[&NSd$Sҫf_?{K$?ҫ|"_~IP oF7H7HFF@py#"oPe)Ǔ@;ixhsؙǾijp>M3y@YsLGSl-!/s̋§qn8|ߏG;_#g1|U/:-/:{-/_usGnLv4/KU:*snLsq5/Fy6\"ppܬa&Ue1\ .ZE)b(!K,EXn v%?d8#1e󀬐o@C>z"Zx0͎۬\RD |$"Z~Ev}jQb^7ֻ[u6]t.ݪKnեumt.t{/~vW=s~;˹# cN)@K |RЭx8@vS|}cAghoXEo= µz0B5x.5{[IC>M]);_ &Jl% ?3]r;^;=h?Sy>L/(!h'Xro{޿w;hw;hw;Phw;h|@'"޾g^1IܓHTuEqGd{P\K s1. aB6ړϖo8Hel7>2hI)9< ֻ3<3u_N:ya/=1Vq{* oP/)v-pt!+HȾto3!o52-Q[.l75=iHJފ̫]=i7ۉEo81^$\k&9ΕWV93Ovz= 8#XA/{o x;An:/*6(v֜2&5J`TyAї/X|53Aa|2!,{4|+"XIBH|$! ŃԬzxk q- |%UuX7Y,a9{|0`ptWi.\cX~mo xA4Pm`(Sa$oPQI >)nƱ* µz0B@LU2MSbFEa|$Wh!5G)'[;iX/O3| F>?u?+>V1!UX-O?H,|Ҿ #_9ޟf[/,X8><ƥcb؏#ase_lcyu\5.51c 3B^CՓ ,A[;xcZF;f5ڻx"[uImd9v"=b9Y'd'Yn>9]xKC[[ T(%{;f.[u~ [ǘv}5Uch ]5UnXYo}MmX _qh inѥ"\P>,z2Y@CM;xjz6y<("[\*nTH;yΔY7O (ץx{?)NרtƌeRӉCvJ7,l.Uܢ R ʽfG8Hp&ʽޏ3l,2Q͸lPˊv"V la9u}XׇeuXN^}$L㹰MsIg D&@@(eM/TvZ K u 'N(t8ےz <1 lZ*&6_`h'_"[tycYUΨVSI%d?|v_L*EuV>*VY7o[/  c, q~ *Աu.k%eۤ*n@N B7s:'X5rc3d5*X{Nj*8$ m55EnHb9ZY,G5,Gs`4QfC[QM/b9I,G#}Xko[FR-&[5V2b^vv9O{ٵgTBvVYv{Q$ NZqc6z}66˨ŷ)yIͶjx}o?fե~X}Rt[Q+[Q"IEscu+ފUZ]^闚LnY7lLL_fffi}V=OtjuUW*Ϊ,.k0 h=24 R wW͉P!!j5he!៪5 Ik확/v], 1$V?Bp |H> +T[T`z?YY~\,6E ulR~%"*#BW_'X2-7o??(yP̏tC>H*~X ';.k)25*EYm~3:!Kwf0,szҥs:<;K7g_ˌt#;nv3*?m(=Ÿd<~y/ 3CZ7j"{1Q_w?! #uLq)TF֙͐r3?gX~Ōcsgk#HHN<|Oze[Z ~m"gH^[͔D}鄨Q$K'`"b($E>3tKޗRH3Cï_u7=s~չuo:9;)-}`8JBĊHt<]*-}`?' E; S>)mP(ר|QB6(WG{7wF"uAYI05uܲaoIH'6oXȮaSx ]ER:5g D&Htj~hH-~,v 'X/OYW+ IQ]GEQV<;J,:KQݽh wޤޟsH&ƫޯCzW!߻F#{3٘gGs|$VD@l|[T}k$\61MRu(U%ktU5J@ B}Ձ8 *ne(PsP$#RL#1#:6̋åСh:O^CѿP EPk(^Uѿ]]WE߮ m A~+Mfv|$r*CRA(ev|/m{?7{}Oz0yP,`e[GC:=0>D$td+]*hy̐{LǧѾ>i~itMj0cZ+`DFxP~5 m4O^̦w}cW-H>5T *{H|^d>3_IG3i4I?I'mߓ-'4uOں'uO'kO=i랴?^ l!dY=’P,^ $]KBOe!$ a>BDds;|pTL/S)N(rE8#$`qu>sAȃXC!~TDkol,,Ob쑌r54,6bo\ldC ܷN:&0K̤#|zAT_Gj'g21L\t(Ca4mb=k=߮)Γj ^3(QkTqs=I' yg?$}?;{K}9S\w&=N6p YI\0^v_I})\ 5N憄+b_3DՓ6K 4 ):|Y-d1.f&n{U3VU/ 4S) _Cjđj^)V3 O+HbsHRAF'rpl]#)<-Kٗ.tVtē}E,; Bփ|K Έ;ˀ_d : ߬FTʙ9kALonժRHut7ŀ!cn>gTk\k1M/:d  ɂ|S^@]?ХF<幍].tG(ՅJ^b'R]9c]vxcQWId_gxBGsVK*{{{BG/]t]T]|Z)x/ܢ j* \EKj\zgVJ$:e"+:k_ !/f?#*1q+ZGbLyD-ҢT{+ rB?]7||^$ntkGB. >Z~*?T> sq  Q"SvgLP3 [8 RHm~n6 KΧX߽׫>[۔=Ӝf_8hD7s\\ofa&Hxd:1(F-7.&S&>Fyщ瞊>ZG"yDzW,Ir!b࿾R|+uR~nJԭ_SR+o_[RWiϲ!4F9MBOih%+Z+ORKOkTHM!}˹[~sj# d?c&Clg@{@B?l,?)Way;PQ/p *+P ?bf)HBB6(݆YGȾP,O4pONZ}(%{(X%d(o!'uE\O9aU,8dٝTKg?Y$?tåNqDv>zÿBօPu!BIBօ !BIB~/ !Bȟ !rk:5=嚮&kuMDz3tzoU"Ky/EzcU7b⫐l@QRG%%lfesHu=yꗓ~;yNtcer0/˒v#14'jZ#'4C&؊1fk֙p3[(W{;PQ'k^Ȗ:o+*{(fƒI.AB`+;{ٕc7:5̴ Z|UB.^]ԅ0 aB{!,]S\?G'9/\Ce0AFZQE}iF] B#x:M:.YdVv]X^EZWurz%0WCWr/z%P>~;7CP Eác% 7| 68{4ʂ[!F5D1ܚ&:(ץE;q ;]99>xʤGM`k?"0Rouv0Ej^9@,q _X^&f2qV>avG[{wּ:xJH9/ʃ̘IlO/PLB;PQ5P,WYDv58K"Z }ċ;6oO IAuݠW>x[vi Ga柪e=B0BtG(MBH6CF]_ۻ}K^E׻b^~Wv+ר]]y+-`Z9ct@2tp>yN:#%=DWO !!!cMC}zhzCFCFCF6um~*:'.Qfv\^fneq1.}}˼eǥk\5.s\*1.?|@4),ouQ+$dW!zzlPKvqUE|U|8mҝW{S-_mjjqރkzޫjӪkZyo[hN7NjkZrޖqGuޫYUͿV878Uf[I_ 3!L^O޳mJtٮ t:sqA.5ډ[_٢˚QbƏaV$UNQcLk--Nlp4HBS]C{>bUC, ^zI`ⱁpL+ypZ-#݇ziՇN+ypZ-&ͧEzypߺsk(ՅJ^;OÛ4d!5x/ܯqrm]qqǭbKq[W[AݺxR O{ ޚV_GDr/>eHmn)Vub1eEG,*oPQWQG&- ijޣ{] +.RRmˉn]` ^{[m"[jN\s]Enu] =>p^[u0?nu7^%[/n*NM2 k-nKzT5jDhNtoR<uR[-~Uu9ڟ G󑨚^ț%8Bj:}z`V>!Uwqr- ^w\;2{]ptȸȼ/.Dר{ku%2%.ϭfQLDGV_,-4M.x־4X:,к^_¡¥:vC},r,]}, :X8>u,-6}>:tnu:\r:\-סu\ַW|U^]zϷWTx~UW|í6<0Ls2U ^22cK;Id7.%ډ[|iٮC.u?.u q ~]0 q]0낡₡]u˸N^]2G\'V/]/t9igY\"9a2#W%" Kd9R|p (>Yi| _9@ bdNHW񲠅eR~qU$s[驅T4N0OKj|+|/;[NJp"A˶kqf;%5S?v<-p' ~:ɂ>`3In_O"DlXF ]c:4n`ARUw :=GݳeF|$]g,GqWf-]𓕠mΧX5IOTz?[ [2 #]h!UHgբ7>G[=0}-#15 1o"f)VYn +v>=xP>GNY[`mUowH|?$Ǽ6f$`|$Ȍ㔮I!5qb{ew>z~~< V߀#0 ~VߤW}Y*{}U,W}MNJqU3FTdy"W>1%Ƙ|$F$<RAНO+ |O?|N9|1HUw;b?I? A~\KYhj;k6'K{|c +I?n |Wܤ;̲ &K_f{)_۝O^0 Km*tql*p[3yC?ΘU&qedd.J_nqĸ}$gl|$VToI3ȃjX<6PDg(oå2wS|S Wxfz*?93&^f _ipZG %^rϦMd#*g`D"$g\FVdRߥ٬Q&ig`C)`8by=&[>/X" 2bE \>Voi!ץPò So 7_>*_oKooRsu7 m]QFz_B[ uģP𗅶b4 < mΧXɳ4xF.Aޓuֹv]V<)X|G [Gt-|SjP { nEJTv4^RY 7OsydHv"Cd.8U*88l'T<,+Kc=c-o%*T΍NPm{%܅jvBsd}{3Gd^KsS7պwz7| 4Y'֒Vzd #C)VvV݋%2!ҿ)EStW{9}( D l &Z^nh80pJ%і,dIZ3ɒhKwJ%]oUk%U@Vw}E/ v>ZxQv]*hS7q@_{. ?2G L!5/4]S51F&g|-mklcZxi ,% 2.j:cΗT鰩r _DB`k?iG"Gt25"틍0Uh ^FX']&6.w:83x/.C] 'l R, N %{z5x K>ɖDf";AaKWo {!oW[F]ݰר>_|RNMdp{]`^=Bz22{{n{qV+> ˘37 w • @\VHu eC .*d01f)y2xAAp6: 3BBuٽO_:IQ@ !ESj W±(c`NƒnEg(.B~~~U ~ ~ _=9W~O=2Yg_ݯzçaB*$?~VҍU|AC l^DCAFbo#;E;Y k&5ICgR{Ϥ3Ljt&UI=Τ3}Τ|! feOrO?U>_3*G}r>*\ң,TPd0nh` 'xAAo5=,7J$Dk T53;ΠAԿA]gPA!ar5S|$˰ >}p[Pir^! ß\~?>~GԹ\d ?as *ZŜ6R *Qbc}sT$~N.(& u9_5稾Ih9wjwz٢#|O[H-4Yآjz٢PLY?TE|~$>lQx$g}?zFC%κc'+v3 _?_,0nvI|cMº]3&ʨ1 9K]=~;b/|MM?QGR 0x|GB 뉵._Bjx x3{v>{f]Un~-ݜtf]t,ݜtҭt.tX_>4($nG U/ygZԕM;N^[y*hzT{m*aIÂV! mGf\!!e[WPD2>g[ )d`|C\%^1%"f`@̨BPlTex㹝O |TW)qLb%}J^t>Cm~55Mgo) vla4:$G^M~^ϰ7^wḪx0e{顥ߜDG>24Zޯ:yER~ _[r߶|G+kTﯭVH~V4O{M%5MzDzߴT 5%ly~7w{?c|0z_Jlͤw Y_gX/P=,:k(| HȢ6=eˢ6 ?Wq1Qp-DH8b]>Iu(pl$~S==RHup>,? YjsOt2kp_譅KRWĝ?hEަ*W(-d1bIspZ0RI̥-ey봬*ϻ޿σ?q^\$~܆RyƉ oogHuC|9 /kɤL?/&.aʝM7R ~F?8ѓd% ?v#!V~aRr̟O[1d,]Aj?7SU,hGWKe?Rs1fO р}-[κ]Ϻ}z-[κ}֭[?{<>&  zNgϞ ^ӏ3aclO.x[| Xt8.Ax޲HUHZGbh$|UFU?OΧX/fdUH(d^bl<VW'˥6Zf^O>ާ'FWk}:HuO]*?P,XeY}Jc=^0º'SVw>S͋σnŇ$MS9 L!)c\&qcF kTtV_efЙ.-䧟cs DkIzEjQZ|bI0M8gF LF54i#x}l+R{ᾇȹTzySFHblzG;D&{hQ{kΙހ=)N(UTFxlgZw2t<v]~\׌@x:_4>Uu,W#x.ϓu}7 NY;yӮʼn_#To'xjQO]~ތ@+xg_{]VX?ۚ)F.%Xuϱ~m?1ǺQK9['$]<8ױL) 㳊5wr5V]R$ez.k2uOovE坈 הCa{u)h%3AM(NV̷* #|y(W{A/(Mhp`Z,mQB5E/ B-x@ ^7mHr4!;%Dy[Ω?!UMo|%c]y#IYJ]֕OM% 8oaf5qߎü#x?]za^ĞW+Nj8a]Uo@ 4~7UBc里Nz`m\iGbD&j6y9_]$L\3KQq>z?K[{LBnV(=TU@âƭ}ZR&-"ҥ_k1~t~#uqD#x:7L..-<'+ɶ S:[R] RKl0.uAuLGNsYK^/]\x@c26dVYIH1‚ WITO̼d8½5ޮ/fyA M/ke Y^_Mzř(#fy)!Rq@JTv.URl0Y`(oPtْe/3₄ڑ@ΧX/LC;j"u E5 ^Z&R=bZRI .ȗd-"%+QZa&UG3 ؂l%nA5:I6e=lY܏yd14o-,_WӤ:*2#RH iz_[ꙂfDΟ$$N_{ka!U[ݥ_}IQEi*PYd?FpcfSL#"&'j V\C_ǹM'L+bXC ˥{%,*T%WՁh&\t'RC4:GؒrA5){F zlx9ji( RxeG2gP EHVD_C\e†3;8iEOo-'|$Z82XG!-D тelp-l⹱Qk٠Dk7^OlqZC<.9LuY^NQh6]nxQ?+52yZ^o];XekR]XAšC^)RMjy4|)2u}7b s2Jv/E/stLIى\-x/L>9i J L"?*k \Me&5|%oB9uv 򬇓>a]_ˌ?lH.^Nwe.ΛE(Յ [#' qU+*kU dXkT@Ia,A]2-4gx;g$9 l&0 h3} hc"smozp/$fѷ7IueϫTGGkΧX/ϬS?wǸ;)QJ5*`m+x<0qKr٢sXU5q[Neo[Lq_!v竈Qjq){(ICQfz.PjD:?_3}ozGvQ-x//]zd_lɾe+xuc:y,:R.^[t9 NJ|,'.Cu)~Dk ]s ?v&U:*ϠIZyuU?PKL+xj?OٻRj"Uw5| KkQXOS^VZ?PK7xjZ^<-E%*k{]~_I'ó&zއ(׻_ޟI{i??] |$nfDzi R_:5W(o!U?Y<'?z.?+x%*xAi [xz.?s#(btY]?eF.?ist<y#.Q+yIAҧy.?}XG6(Յtr٦=zd;]]K2ҥuQIϮϓg]٠.]]{^o]Z׫dXf܊hV<Gv;YpU3tm'>xG;.ی˾t#ڐ^o]VU2S?<طY'oi3xٷIU>q!5]Z&'{*)G'y;$R>=ol%eN= |$oTM&WDo/ͯshaMOF˞ZnXt8eau$|C _H+0|,7oQn:_"{HOf'X"!$(/,~P7 _E1z;b}i\_ϴۤ[;b}RDx_Do/5psb )c7/.b$ZI4$M"h/oo߿*{1_SXx(uVӅ8\Υ+[+MC89HN{~M$>[ϛ|$V> T [Sg=ȵyBb .j2JT, *~~~V ? ? ?+KK+ss:(ODoFz@pƒa̡y//Ro| qKKUxBPE>:R4^ ݄fEg{tΆ-/U?f90 v;[Zft;CF,W&J`T7  j|.P]0 ZZƫ z~I/4N_̢Kz|D'/QI:B//(b|Y)W.]#!2{4L2SH az1La/~//_~~ mp[{i|F?| _?KӾv{xM3nw)f| fxGL'ӊgREb;;_RbO]yPQB8Q=B\Y}}dW >]xDW.]j;5 TkV5sn]d0pu߭D\[d]nJ_Q*l'$Ahdk\0Q8=qTqKwqCwq]wqCwb{i˘z-%*x;ƀ6";>aw[tP6槷+%K(+"Л_)lv)-]9fpt9.]/ď}~ ^$t _";K{nezΓiƞ䑴켭^ ^ьO|fٗow6{u?Y;$ZawS3R:RY[' #H' =Ԗͩ'ur[f +dI5?B#ms݇-3F^+ʧӢ9+`ZMJm!`%5i38-㬐BQj 5|ZݴeZ%ʴUbm"*eZ n-uĵҖu9tH {~RPm/}PPm}ZvjKe5tzM-<]MY!ޠ%bUssGAEiPCkx]xZ@Dxen (Vq8Z@ɒjyO*X;gYrv[NɈ<';Odk ܎SrFV7lj[MZVɮ%||2rOfZP=uXJV4@8D;@p9BJm#]) aK?Z鱛s+rrvż=h'i֢1V !Sspz×rĖ$ݝk|3S}-e @3-;[I`Qu$|'?{.S÷A4\.3P &h| 8C7/ '"$WnEmTpn09ĵ!LH|ߕV^9mPVߔDg Sr4!Fo3*I,{m\#U_gVejU;ss,K.Xe2Z}TA퉆)r_ɒ: +Uf6nxQ^wc ˖G2)m嵄!FhS1rFV1b!?c  |T2{0`y\<>B ~_/nZ W`2 /*}ȴ uF8Ln 7ր >oKNVguA%>_Zkr9zO:㛂c (or+."V&sj9lbwbTL3io +XIZK/ldMGr9*{ ^@)ĥ-):en ?͙ ]%kA5i᷀_ z_[ ~a9K}\ǎP .rUkeIe|_I,a{cAD{Sor,y{rE~վ_gwU~Ѿ_>}Nn}zJ*k:JZx|p[.X5%?ũ TZ g 9Cڞ0BԁظSr9zOZYvU,,X_BI-f̞@8;̽rk) 9a|?]'>Σ -\q\N_w}~վ_wNroWo: ~f~^A(|p_r]'U n=kV-l$H:[Rsn}Y3B`'Ց[k|'7cBB$I ~I ~%ˁcE:'ӵ\)7/ 전_o+I_ yNs<8 ` ML;:O4{rU;]q?8z>W."_+΁ o_q <'M 9%bߟ ~wn=1>:|K)|c] 4~hB+Ny8|tb+$ß>!*̚^܄Z҉W:Y.X?~}}T_o b_ԣoۯW}~¬U{If\ŖZ^oy(̺\Xed)IpΣ9XDH ίiZ”G6 %ZWC'B%ՖջkYm:ƿ>~5VȒ<^͋^^}-' mKZ><,u5?mZdIEV?>IvkO iu'.p-6dv;GTݖF)qA˹vNFju#1*'sWCk O2\N}$,hc*|rO1&ȁ Dj:wH%Hlxx]N^L#Ӥg!/:ίٙYZlxr $oδ#&.&XZb̔2WXH˹K{q5ƹˮm,<)Ⅽ JH ȷ6, Ƒ8 _NNd-;'#nm.v5EFVIlFK5F.MA?á7bVFB@FFljȒRRBj#t,@ )ח&VZI!%qT]eH=? =EҰ&OVPQ!F[O 4sWE]Xr'hO UG+l/k5)|r+|ԪH0|/]N | ɕmA ̈u܄j7u)q'uV0WEb./S9:-:779̡(m W/f2I]YCԈO]B]Snڲԃ/?o8IT,۹DO7j\>Ԍ#V (\iB|bߓkbE'O9Cr.\[ -YB.4*7buzq~3)1%eAn _mB>.LmܰÖ|d }>OLJm!Ր%5<tflkV>ed/ܗ- cRS&.\ B&0bdP|TL:> BG bFZ7NP Krǽ-&Aep ڡ5Ӹ@S5Vo)/g݀G UH ίޡIn!2 )1|~RwbI셔ے\8mDwR[{DR.R̙F􄙕e[Ȓ %WlZ݆s*|['N,T ˁhT֙/мE? k'St6> :wz-dI(7'lb;E! ؊%“jZOiHF-55T=5, Wb$[Tڭ&AңȴPѣ[MQ5jnx@U'5%Y}rK]H:n<rOO9 hAf7 Bu9*𭄐ׯVt+XNMh?$OKF[ãzKsX)!5TISFij k!+fېbs>dUNJL!_˖ݯezw'H{1AzQzCkV\i>>B÷[ݪ3(uRWSt&i!KJ:If14Eݑ!R^_`_V,(G^ݪ҃,,%-SZ2f#Edr 1OF-]jrc,+9柤܌ݤ,-|8'_Gw/wL!{[|q-y 1['0n+k{]n&LN{@jd\ >XӪ%z+BkuS'ir?Y j(7a,7}I;b6/R4&^/[˔=e\InQZň]h.s]l\NM)/,]FiSo5w[ nk;]-Ֆtd[F-VȒJrlYvW,n[[v[ Q SNpJ~]ie>븮l.⺮@_WZ>!\19zoώeOOj0in "m[rTКGE ŗUѓΓKjp+rVωU<)/Y/kv>q̢e Vfj,FDmV%5;]L [*'.pl9[]%#d.W[7 ˖z{6/[qEbؒ–x2)NYR]CոjaK晔>q5^d-XE1ec{mqW5U7r @޷ pwoyzS-{ !KJH ')é!{~ٲu6(8uXr[r +d|q,N 49=79H',wcObqbm$;]B~}>8/i< >Mt4۷}9d/ܗ-Ats!Ж DNPRqFwj#r<BZ5sq^QG'kq4YS(S6SecP Ku4% )ˆծI"!M)ˁht~vyMPbG޸UM,[ '/5o\?g\j hOU߾$^ D=-uUFwq%Bzao@t=x4XT֪u 4U/=𰷏zV\u9o-K<8x3s/u/9Uyyhf#nJw_E׻ p~rGC3Zɂk B?SVh< B[O&9ju?,x5A(]NzFHy'pùhvя{QM:DM.MRʡU/6߬3-x٬jN,6YwM-ofH:hcXj&ùAUjĵ7)V&T-?]Xװ`RCr kvS U-. _,]:uUYaAr@{UY1γ]VYa#Vfڤ܄KYRK;7}NCQ4T#h1E[c1˱CĊ!d5|a\\?ЪHȶ5$H?" q8\DՄlxa# R|T u$![u^Ъu8k8phYC~,á%=!p_pháp!q7Ґڣ3YREO> IiUM")X yVY`:SV< ˁH̒ 4׺f6k\CÒuQQ~1*姣|9*9*v /,jA҂;ؗyR-KRȯ' dIIm{6cf^4BwZZ㼿ȭۖǏ`\|pju8G_\>:a -MvꚍY<,.wAXJX':wOhŹ!@H]Qn 'hHJhV J?>Zw Bwz Qn_,|)g o7p\Ue9@(78_L#hDSbHPq9/?_?~~7}2yt搕GZ ~*0\[a8fj5hgju'O 44{C'.)[lUeb2ϵ~N!yxA˹UTM+&u4WoCݓ^B(|TKh.V/<;[%8w|gK)6\}+UHTV4}TfRs] kR +vVNykt-r $t ϡ5€c3P]Noo?Lgz}3gۯI~M?|9vҷ?^SJFyQ[rw#!]FR.nghw 5Eoݏ2xG&W䙿+N(T Yd8 cF~FOH }K>.[|J)ӳH![s 겥nB`b[`Cpj-\Ǫ[#qKBĠ ˁ4-fQn-sK%nIVjnI = "'L0]DnW.p2O񟅁k~*rd9{^—=9vVԪ 3ghZ h w5 'U!BD:JLpAIYRSMj!"l4Q'.p_<ۆ<.nɳIe:Rar :R3Va;3Ez%h*5:|G&[G\j0!L16]D`ƒʌ IӸ@crJV[U_W& tbNGo6J !H'qv[-`=[2 JtKr iQ*bZ薮-_,+ofK''uneIuʛk!z|<[l'"TL ~N،quT-t-O燳S{nU|r ҵj{n5}rp5Eiw%µ=!K*7|}rD+!Ֆ|rO-b6 `vK\x>s5*`N׭ip& (2t2[ڭvRi(hRSkO3Z,>L7dJLF~.0N&èUZzOd듵Od5OzN_Oֺ>Y|kذ+&u5G=Xf)fz.p/ -iPۮbXY܆&V7(7$; {mX 2h a, ^DTĕ]EhK;8ٌZǒ$|Bݓlɠitd n.X/GA%͒a$'RnAIYRS%e{rCk½njǷ6=A,u$L4oEn9B~nk5B,h&]+[hIjt ǩIulʄ]X\--V18jgpGYeMU<;b)Vo'l:*oP_-3TQ ;㨰᪍p3:|Hb5n!ϒ8!F!PȒWsX$JSd]'m"ݖFqZN&Yn:3Svt1xиt[ah-=O݆7z)Vt8n`WȒj]枊 ,wκZ\&R[Vn5[/nO//O//~89'/| Փ:VVȒ*겲=io$BP5c1snp#s9QCnzPi:әg:S7pKۊh Fer $y|mskMOp v W7Za,RN˕w4G7L\ՍS|]TROyv[6 ~OOS>uF~7W^.bjY#yЦ,Ÿ[^|Ģu_܄]~nYa\Je4#4RnTK\-EJڵ02YR)Γm+kvL~.,ޗغ]o3o%(۞A)nQn,A)IaTʰ#&ƥ L!{&)hMl[M?_aFf䟚4#fXǪZ<&B”&[ 6*ľhYJZu+ԯ[a?nl[`[eJ0cpFSQYRM'm/lt :WWDEز_ht!l_ fr 9#֕kQ8|qJ5+DCw*WjW*=*_=\=|=*k*մGQ=qKZIq4yέH2f{4&3gZBy=Z1OY 9d|v+RHi+oInsåt=tג9/Jt-VC@¢iK?R_nh .(8]rзR˖ElkklKi.[ ]\z^/[^C:D{"MH{Ci!u4"s9]sƸ1gȜ/s뾚"挘35g嵾mv\^>xd}ۮmX6]X߶ַZ߶oPq<)EyR6;*eKy/dAnήadZR['[PMyha;ܔ| YL֓bq:e؄aЪ6l݊w,aC!I]6nw26agW,=s2^F#eD#[jR+ۊVlպ}u 0XvȒcs]uXZ qoqnH͌,BIHYPEɴ+t(HMeh~US C~BYvݗ-f6@c~xdC}ے?Osסdq_Ҭۜ|$>tfV5{4']t-gp:CM539r3}ٰ^,+`,/Cjc"[R+O2sOt'{B_=jݴxVVͫ_KxW<2f+;94xNȒ]OܻbډI|r!Ֆ;d$ 7 MNu+>oXnJ.yM79&#d/ܷ-bx$] %j aPƓX /] W?NQ[b1q .v[G].].j.j}KhrK%]\:)t6$h?HwdDD`iy]b4xVm׬Y\JU5kVJf}*cV)׬Y%`Vly͐!5C 5Ck3drk3df|͐3ϗ)(9b6 0D^h5/M!n_Ǐ5g)rR2B74|;ۗ:ʑUgy3NMo^.9"\a9Rqk6­&]?Я0?FCFCFC  MGC_`4UkdB1{sI]_(l֥AZA5׼Tc-ֱͰRyXnFμxȂ2nd2ru W8xr;B}Gepep;sLȁTnmLfqp @}CZ.ːa_U,zmLכ.|c:H!Wmݗ-0.u)X?.uvwKA3^#pȷ3U<}loZqJo`@Ȓ'NKLn?O\&{ [/l-ߴ~R–zR?l_RaKl?5cHuYg u[׬[#}uk[y K/߃ճUϲ̝oD| Y)Orbk>7Ѩl`+}v9㚯G՟w0u'h:kYHǐ\@!PȒ0d36./iiO,v["EŦ]! Ef:v[ֱ5H-^Z[)瘑c r ~AL\ pOv5EB0y[EMo̒A6E*ٷT:N눗 [-ӄ*y-Rj D+4d&~ntIv[,|Χ͸ro'cW*v;NF-߂ @_CX`U0łg7mOH9#Fl9A@$ >@X `Vtz eA'5QtTP(b e/戀(Ukni[CTt.b-i OYbli_MJSoI j--]{RorۺƖ{ dkdAKN]磣CT(Tk6BBSԪOVzݮ%fR37U9\uM~3I%WL{[m)MCUo9͉ajBa,^I]i?ߙA^3d/a˲0U) P$>;N3)ewYP5BIs>&ꙔRO\Kt-Dn[u~˖cy<k)[myܓ> m>NVYrX>#rjVw([mIQNNB}ٲOh1e#mѶU.AnCfZj#fk5B,@N~  NzCD0D0m!"s"a N+ćH[:D׭Ԥg M_<[虔R=,g ǖm[C5{&u2yB"[O;a9>>3]<,= m5'=W^_}keHCn |YP=Nס=U:?zU/b]IFdYt?5m 땔ے@\ԌxYLonܖ|ꬺDvz{"liٯ.[BȂ*ONd~CQ-^a[l.>Rk.+!GדH3<]{TySDTRbEvq<); {myR˖'KIS}cIsACYPM6Fd.Q]RB}R^}#YxNQj ^}'On^}6ڰו+d/ܗ-v#<ՈٕLo*&e4)!gМ&\z:w-p[.XoKop,MC:\Cy'ywɵ2K?|~{ȅ{ j,㒇Gʼj%w+'*n8m|,DbeYBKq}m{ғxĞ,'1dAIƜť)㺥\e;'SeT K Q8`^Z8WOyiYZD x2αU|qyNu2g&F-@ Yp) ϒ9?3hε 9#z3ίMi-Ӹ@S鬰BjdCH'" J&bIO<ْ?oRn ~;Iͳl;_!}r[otV[eKB+ӗ6 Nz^|JYP#Q3}Zq˖+_!{~r%k"n}!n5^rK^7csZ0ZN:YBbksr ig Qr'#p @cr?4谝e{n1\Ԫ;7Bk 'Ƹr_ʷ9jsUCrCqkR=(nr.#PS~շ/~U~ѷ_oۯ۷j7V%Q3zR7)1eAU ͨ؛Ԑ B>qV`ڢ[mO{lc4Fm7ut-߿hܖ|jnX" [)37K燞ݒl+סgz yBQY L]EMZ1f߲}Ya\<ݢ8 (/|l? dsOJnW+eE\j;*lS ?ۈbw8C,üFW׭Vxl5V,r8|άe>BFFb\].ISTrzc?Qゟ85<39{cǑYe,w׺Nɥ xhRhuAtgv|fNX N9#yZTr9WOQǍSk\-HZRvRGq9zïo͗rgO%?;7*%oo7V_ߓ@I$P_L(I'*@|Mk: T$Ю<{xVxVWJJ^xʐ"bO$/\) [dA>O+᪍p3(Q,& 'X 'X 'X N`(X=v@Xۼzcz;{lKaLifQLV[ Cg ]g Ug ]g9| ~ !%:1vȩxW2u&yWgy߫Iaڱb9ՊJtByBO 9#zXNxrFh+4K.X/x||x|t>x|@0z}ۯzoK4B~gro/vR#8(?B}e /M<S4N]G~@'ߝ{Xe DȖ=5]E.( t^u}@_y}@tt?K?S?P܏یˆfpxaDMsݷ)QSXff2Wgb"j6fwgJ~rFw.ŵ!礡U[ۓDo F #) *iVq}k5F! =Sr$! [ i1G,C93Q6b_^ bj_R`!M/V2]y6'd6Rf/}D&2n UɆ⊍FfBPN4^1>rFd^2֤e 4هFhUwZ?AwZ?Am7<{ #1#(r NMdAJRw v"ϦBoۡ/aa;̯ڡm{tQӵX y-0ֵX Z`Ԥ |+I~;6*…Q')13-tV%2- gr>qeDjӦ_6Ԧ輦?meSLmæU񳥹(>.)ȷWMT -B!鐏t WiK-IZqقI:?ٌ" jD mVc[?q/ܿ.2vh/ٲ>lY_ز~a˺lY/lYe]ڲG!˙ڞ fAI &R~[ҒrAVkdW\>bB]-mx"̢PYZr0a9rGk5B x&Xdu'p4WJ{S(ۘ\+C9Vˀg5WjPbPϯuK=h 7iS?lUSX@޿oqg%AL֚jx6o-\~YfO-bx8u3 3/ؗÌS3fl5cЌ4bwskIK5E7mA,b[NWlK'.͢[my*n˖,<ܞ3mY75ѭ[xG\ےO\eԭ*9,gA.;jtj#0Fܵ!kh X/OARON7O,ީUt q W׷dzo_53}3+LYݸx#B_x[҇#IGY髾_>~a RU?çuI2}g79zß|x32w˳@(#䌘|CI=jhm|er1JJh;Oʯ΃y[:3tL΃Z΃j5KJRqkqLOkS|yy׵)?(]TRϓdd H>pA}$aY옏D9lZgs9DAu_ f ثn.[:K^Q!wmTHE\[8ޣ"E4;n$X()OIafU?xy]F ;) *i6SO#S&z|v$w+"C]Γioa'Rj :xIJAO| Zq>qy[n8[L;igAnCAKY|'}jXr &oH6B| Buc,^?o{j \80UWw{.њӸ@Sy*PBoVm՜&6  h) E-]ˋ򱼨\ˋqQq Vaa\2H9+#;Զ9J iIwV#܂Fb࿛^MѮMWSԏWS)GS)MR-R6廌^+tu_sal%_U}[nE&&B6ߌRKoHd=,S,v /B|;)t >` @Jh eV>ccZ@A鲠56 je||*>6Dزi(Ǜ6'-OW:\{ٙZ5ص;`ŤrntX2O,GЂo:ũǖ2}[NrFԺvI.cx.BL؞`WarB/OpP\N A !D/BT:|r FdNj\ rba 5 !mw-AMmFT1-VvCy <)@K-wUxQDrrXލ!/ Ai%ˣ+R"RXG>ՅV\l&˚7~##> a#})Z&jh\i>C?=8TzWGpX=hOT!nZ^v+_~~א)/ ?1O96d'J] 1fq9tWl/7oG~/c 6~/m |IЪ5#C6t9#/‡~g"#ʔC%˳g_<1t˓)/nw\DSl#q\NDߟDғWfWnzO[=(pn@~NOy@(: #8KIoh^RrURG\HPl H&%&8YY ȂjH2}lI!^/[K(0_ q$\CI3Έړk.{Sкɴ:K`GwS4A"X/ K&v隷Yb'FrvT2!a\[RplBr{A\`\L>QBp'5|"{5k?IE"ZSlR',kǵcą[M^disa=EQTM4lʹH gi\U_1eH4] {HLMw؋͐k("1efOY.2zŔ=1eahcB6' WI?\U-J9)wU \9̮!6s\]PwDsJSnR?7JlyV#]u9zBqfBn, 2̐k(!n.W3ė"nz%h*+khշ?m{:ֶ++|rPf7Mڪ۴B 4khz~ >ӵif]V} zE{%h|\C]_o{͸r~^29U2WrogVoy:Ev>9G6g6. *gEFv暡;-u||[l/\'5񌮷'i(%=F+дcz=هLw=]

    ndLnsjjpbynmL![|MI!՘nTdkIG1NRnJ~4=vK,=< ܌E.0lx$aTPyLv[-Ս0J ߌ, axNfН4eT_'B*R[VS_̃sόp;sL14)ܓU\'` 4ijhMhԭf{R.[ZS[;liMm)-R%[tg-޷Ö_vɛ(׽*g24FtjKHv%=EU#{dUdj$oz~L^w xw.SdAu^WJT߫-RWT^אp߶DYmo}߷gBa,(،'! j薤ow!{~P2K.+icڅGS" jkem]Ļ ]%GyR*WoX) *iiqm{(SS~5d/ܗ-{eR= L:ό;mZ?V1b7^&YZuˤZ){|W[q$^5eA% xl[4㰪Ce7o9¹Yk7\նud%]1kgFh+YThB,*gQY,h\Yxݒ˒ ^xkCvmm7\hlebrWl]1++&w஘b~v icPԴtuxSǎ e;war=syi ބ;wEc9=qvŴu )yI%%, Dͷ+]ǷeTmd3x˓e]]yWWWW& 't1k+϶b]Wd~)w = '}gG,j˨/˿p6Ê&b貙xhw]l2v/]l:hRX.pt qHO'B,^b&Dm<J4S57&]dcllJ6Vacll'_ؘv16,cTeY{!^PWUBN ^$nK.h7\ՊOͺTF%]=o%c4}&H'Ьe]b4}']boM !%٘議v F%]*sh | rRCKoOWBoa)u˵ 'ShO[!5çbEZ JR>:llɤ2tJ7%XWJG]u$=SW)|.嵿:WjV&h\>H"+ތ2Auu7V%NDeG6]AVZB*ipǝ wvӢp{3*yJ RI5/G sVC,pcM8^qkq|?|>xEx k|tht C@aqh'M&h$Yn,܌ޔvi&d=S~F*#ڧ&Tk2|\]ƶV`ܖwTai9m66؜ۜ`sZoslNi}Ϸ~ 7K[7K[/ab7?o?Oyn~݌VXS[]RJ|sk{sa[i1-i1-iI^LߎŴŴ|Ffu.\{b9d}e]y=Z$;ULByN\IM_\G엁- yC!d]f2݌Wš5 'aF"""kYqCٞ]H6H6^(``RDnGl)%C8w&5d[+NXw>:bZ'rPbcbhOp*5qȱf.Y bvFzp~/G%^Pip@(  "eE&Z"SCK%EuEܩ[}ҌU,9ބ;"K{ΈmuF^-J~5fw7ajR٨R[#zH-\W_hk Mfmj%mj4~65!TjY @"En[%-%neHi j+L(eO%ك4{ᚖUzlEҒ*ZbPur4A`UD}mV}v)VZvC*iB)]`C]Bf] q"'Un#~?&Ky.=vyϼ5j0ͼgy;ͼCjyϼg9Z,z vg8(WE|;O=y J j|;M _:*X l;Mds2U>SS-\Ky"q9&M&r7uZw~% \j|5ӅDŽ~ jƓ30CR06]uk9mJe|ߴv |36clXxc Ui+=jlVh0o"AcaVbIl3X)vvB*?f&jDa?kMdBb)28߰, q>ƚ|X㰢Zo}]wm&~BJIV:1@HSbMQ;kG@H+iаzdߎ)9s=+Qb{Yb]}j!C5/J6+Y%Ѫ9 & ބtqBdh[)iwO8'oբZ臷%|d+ o7\RY\ˤI\Z6ƧDD%wip:q>Jݩ͸OQgs*h{ǸlB=r[ Ư?nՠ;$uGA՟Ө˱[F&7ќdow?pg]ZJ|xHkFU,۱/(J|'Պ^^O|8QKć'xne}JrR~_V/+L>~Y_?NExԈ/.ui4^x4^7~e~/_VꗝeNR~/;Z9؊5䧕V]>]+K_UJe.ɶM%EC5h7ۂd.C.7ԤKХ~K.5Rui'"IEXv.MIȇ.º`i)$;ߺ+o#]jv`IK3]V`]jҥK&ܤuCJˤ=Z;)QTg\5iKU48A&w:V3ڧŁԎ9Tɍv@VCH6!O>[ͲhXT6kxⷵp5 l.s0=I sNw:@3H%R2&JĹIE3]SD:/^b^\ E8c'aQ/^luy"^v|M*juZ+xzK _ MJ0 {|Pr Ho ^P5VUKV8&Η '5H#9VY,cMDY>X: ]3rƪ 4g7&2?> IQFW_+ÇT]30ORd 22 2㇫k j dg~gET]ӓb1C;k#W\#FLMmq\N.Cvͮ6"AiSmJ%DVRWUqJTnRT5G˽p,~H ?4>%FTݪb%(Yj8c%m?g ~zfYl?~9 >DWW wKHoUZk+,iVZv<&!oC]gO.y t&owե*cq>Wd f fo3]>.|i8ݤf"-VHmO,F=oRhr415~mR*u5Pn;]Њ8" dd%i>DCuG;c,Z1M]PU>"ƙ~Bp޼X_z)1MFhGGHm|f+cc/4Z< IvDjc ֪T@}TS[KwIHe#Jatpj.ʣ=)NMl7"Ӝ)M˛8c%7{ }Ědy L>%F|ݲ[!E7(&XKc,Uz~ *w"E=qJ䤆7QK]/D WxDڝ{떌FZYXID'Y@0S9| >KUC?o*U-S#'Mg"w e|zҎßo[\ x&mJS=*ުY0 =* 57Ѫh-!t M1MT"udY1F%+AZXK 5b5vRcsEHj՘1{,x_PXXB Qh( 11V2iK zi R\ԱK8-]k haRX|͜wjcAz D7+j<2" XF|JΈ0n}RS.Ulb/'aC2Qq8Z~o)Qcnj˥*lֻ/G2VߴȒ#r%m[;Vm񂚱ēno7q']^]~ۮh]Ѿ]Ѿ ! G:T,/g)—Fw!Be>]TȻhWC1^Ax۷{+joQc$5ƇjoR>jٚc>hAAD]_-[st>h>(i|4} <T#0y|4qu >h>>hAAAs4ku+SQbrNSbq1ol| iO |/ZZiV<4y5O2IA+{VVE3p5|TXO ?E*xE鼠JD'O*bKV֋2jOE6E4F>o!U8uh,Qdm![)2 B~溬 ^P _//u5hS]V1o}@ t|Jl3g ZPGKH%Eo6H4R,jGtOӼ&-n jId1%ځYRBMZl~Oz%n[o*SbEt1bR{D5׀@&x x@1 ,< fyYx@ S^7Ѐs@TJjLKsXvʶtwXv7T8$xǝץ~ڍ\%^Ɲt48&^|h `= >%Ұ@|>(4]歊GD +6Ӌ@uTTSZhǫ`SWxZ*,5dxa*2<35CߢaZNv֪/94<˧\mpSjS t#$C TҨ; jGoVWeI3(2,]kSSR^ƧČĠ[MvGHm1go6K<^fْ*[RgK/K-%շ%U^ؒے:[ReK_YkN<'ukNsR}I^xN9TyNsRʵ[#+GWWʵWWWĒ/#j4566K#jQc#jFtDbZoc RkXjcKj)^x2-WVE3$^ uL__Q+[|)1cczHmQTL3>k]7QL~ՒS`k&ցtJ0ňGXg8k)SbrR=5K)^?jq7ZCoXmunp()zD[kSJU\itZm9ex7Yp5TA t"(t.X * ZH ([|%(eF{"/ܡK/o]za]&al޺ [].XUve6֥֥/uQxREnHRcJza%T*)N{B\*m=:銚~tE+o_t^8zԬ7k求jq>3kOԬe.cU{"5+dԬ]te/]r>Gꗏ>k4piϚcϑ% ptqI߮ c-:L'ȫee zcA KJ .v/o-t!M/|Í VOa8ǫ88><DZDZ8><5Wq,w߅M0Oho|J n8<9|uߥ[^<vO(RۧR*۵[pu"EH-u&]rX6SwչX?ƏI%%"l\צ|%mÖߖ4ْ6[~[fKlImI-i%OKyOc͹zpB';߱P|JLN'<\nuR;Z⭊fs_>@% ; IA>@@% IA>ʹi>y+$c'i>}vʹϛ_tvSM4Ni$ځ>N_{҅Z $ٮ.c27Kvk L2Bt >%6'MoY=ߘ!upݽUр&ojɬAko_Z2aVj>*ϖ̪}aV3]ZtUҥ|\ZH-qi}LK9>t2~H]72. ]&M&}zoTDݽ.BO1.r/ Z5>;6R98TGX 芕bX]1RW+Vꊑb}tN]RW/w2 ]ot9GLQ/^Ջ{^$EGԋMv*;2S"ϸ_vtG٩_G/6~I1s~_Tzgt^c벣}juhN\iԫuTv:b $n$ty;7G~L Z/L㛖ɱ@.A2+U Z޶ f.NIfqS"O%OMdV$J|KJEE~$]CF.t/uɗzR|kW|y]&×Su_R7t9ѥ.cct֥lLߖ=/(E.޻5d]:d}1jYonmknGօؗO3Y\fu"EAA 6 giCӆӣt^Ptڰ,N`)=da/&]^L.-]wGk譝:sS<օXtGkۄ1g{vB׳K_&&+ÿ"}i!] B]Iم\I]q/kuV1ͬczi|JdVfVZO0dV[Yš᧕b#o³u!C9lMlϢmbV·%$Ϙ%KɒNaI'YNtޖ3y,|aI|FIȇ..]$"Wi!i?vv_;Vi?vv+8;R Lr/Z /e~/p/~3~@4E:K/uV~f~ٓe/EבUy֮]61%\ʼU'F郮4&`{kA-o%Ej",|E(yX [?!"դ:E_1yBjxXװ+C*ÿ~$}dqu%h52'X |McUjHmf w=҅ q!3 C҅tӅ^_ НN@%]PFc]·.~. v:_Kh_ ]w4_"~nZc``Za `pDh lR)_Cm$B;wW7]yuEZԏHoB~i=Z}.^ʵh,&]k6gpe'] lOtҥ&^7OoCsYv\Nmh_UFPTvYb-;;o[{5;$u8A yROM<ّZ)b7Ͼ|O̗KU4ւ >!k瘭5:®/J[ /[& J _7= >š?9&'MSStugZ ./YL=W·#gmH9zz"CIHPd"oEFRd@"P4un֝=] t81QxZ)Qbj^H}ET%Hkh{Ȟ.bf-י?u[GȒ>N{|\{kX+ת4j%] US#MP[ 9!kبCeB4[yZ&ĎB`Z0Bܢ9i#':k~a,[벼É*v;T%'k.>uj<?jR4D:yVpΗO7[U"9How.vRL0i З}\Pu֪jA7ѯ* ƧͲ͗:&j4Dsh従ʏȭR0zo lU_u=ynOCR K'l# ~ξ)6vEuϯ- /\H )A7.C~MJ77=a\A?|e@ ޾4SҰIg%>LÝxw緋<&Ŭ-F*֮PR*4rSAjXbjtRYnr'0t \ 2T,ҧ=t_za%ׅ=?~h`h]t:+J,ҝ?6k͠# ~{%&<no 8A!p ԥv SO3:lȋ8'!H/mO%[,vՃt)/7PoR`2.I (n }\ۧ{#ĵ0zf Lu8IKamSi'o<t(mRh!f< Do|Jd<"xnRG2fTiS߾F uxh| >g3'g #×tGXoWz„!u_T~˗paVEH14 ]=' uOQLlөfrL["!S딻^QI8 zGon0dtKU/# B hm*Ӓ]oo]Hז-Jyrj^gR%Jo&!GX3䞡梶%K[уo!_ ~׃lk,MtWaƓjЈPƛyҷת|d<˪Y.=' ~xHV yy=Ezf+NmȤ:{v.U _ JFj+.[Q_ݦ;(Sh_(30iyzrp *e1%T-,Hs&0uhѾ,hly2C(WdF{RH6 Ii4sC`[eePq5L4i>* }U1gv8O,.Jur=R- b|{`hU4#Ӏb1y@< 1?*š/So2NQ𩀛 >%T--ku9d7kGX*+jeWܻsr+Ihz Lqad= 8akkHͶ ÷vC4Ч,-3ۧh>U,".@7\I-C _z8aޥ}  :;puNH-7ۛ*jR >'^J.+imh_Vev(i- _jF{5/<7װ%j%ٮ˝'Y;&] P6Hot\ -GX3 J%,??BY<R''V G#.N_ ~ ÂIeժ9(= /߾Von:e7zBSw~~|7v֬p[׭nӤ: yx\I.LGS,5~ -:& lF ޾4#xAȵZSyV>{"M‚"MBEzxMJ{aY mjֿ 䳢zkahvy",1M*[0gßZ͡A2V mq]8#嘘갉-=~.uKU[kES2V1d<t}-w2鋳w:&tq_d<[M,B*_QnG=VC,ӉY`X=~wH:VeaL63x&|dl5urqeGg%wfe,32ֿij)g+_ml~~yoϑ=o:l8%\Ubgnp_ >%f\-(ڜ[;>iopl-c%Y7Ѓخ6m3vŤ:ە̛=dv%|ح<$w\/3uooCrI%!(;!rD(ZJ15:|A>cf ^x)bf413:ɍbfFVE}R Y@KH)9l2hl$yBjzkEZ22{dC/l"l⛌(|)x|ŲKh0eʟ8֏/ }y}o_ Z3ր>5O9hVQccOMo:a%箪;m-R@0|^4GX3#>XAEam?DW-eT DRb[=sšo_jTP:">CRHve;"4)"rI S Hk0Ok%cJAIMnP7U(-:|&AS`tm q)A !˥4k# '7q=%Ƹś3c<}i4׍I1ɮchfdsWWarKAzX}-^a%=rqaIi HkU4ZH~M)XIMuc3|Su| Vdd<ِJ ꝭB. VuXv؂P3'% yΣz'kJK,wYhi4<_nvKځ[FIO""4 HKȏO!y)a.Y*MMj Ţz#:*3֑'f1ox4K yhjJ]j#^ƝƈZ6|=wG!o `1*FV[hU4#GvfdߌFvˑݿٝGvzP-:CС&u8K: o$t=T%%mU kW%{,MZ.*wJ8V=&8P)2މ%#=4>%F`mD&`[VT?#^lv'A8 phP h9V|[ qs}EI]Q?Wӥ0UO7g:|{"ß>JN&/c ޾Xpݣ5>@=f =ܹ7ѪheT?_mJ7:Ч e"<{tr$쭉݂&2yn° i|/l|Ԛ[MMsHW=ٍjMjo= +|x2Qg&4!goVXόx8_;\5r[xd_obیjomz.ǡ?Coߎ/Bÿٗf.XY ~؆|JP\>XV~OKUӺ# H%78cI`W-T$, ,oefsp- ßjSr tv- ?jOX HpA0i.Z+h좵AEk[R ֪hh _W*Y&p])vͱOוԢijVmY.U aM~T@ ~Q:/xRt~R.)UdsW\OlI-,^Do*5[R߆7jM?p^ YԒDnjIv||51pԓ|V$񳖐Jj2g۽~-oU۲},CM$l~|5mشB{FޮYlՉ4X!rZR9֐XL6G3,4TuzZm6 >%ŝ4o!5P(|;>š?Y@0kS-uL PT%xPO"aoq'՗gZ'-T3 V{=q⧥a<Ϗ%94ąa{3pʜVn9k5p\&5ÇS.";Sf $[dӅwĀ6tWH-Cn=+1tQ1C+=RUዷ^Sb>@6-7ZBXQe}1QISR[h|JN66gBɦ!cS>š0!y_x@3fT.U ߽^Ԍ෷46^ƣQxO{O#㙅46iRjX W0~M9hSg75hѾ!漗RѮ^Wg:LoU@Hu]*cWf =}8TszvC? ^ sC|]6ӿi;&/^35FCSm֪hm{HuvSx21& 1;ׅ_KW߇Y 6>6nï|1|\mljc8|0(\m#???B]]OO]OOOZWҍfw/+YBErlx;wnFtoI~z3sxpۧb3YIjN/*+k_nop1 Q#6u3#9Ǧ6#VT^ =R{U.UugP;W&4U *AXkEх:3\`667do?lya66b?o6>_Bl24|(^a"^;5+^,qh>š~}o?w~%F}//淿9QzT!m81s{b_遭oCR9=pCb{ր1tq17 _Od- ֛h|گi/K3gRp[+"rKXg9<f4^ƧĈBzж|K~h󐫓FVw5;_zOSsRpVoi?..?tҍ܄*G[VQGO>P$*GR M=L-@ ~Q:/qG]$ ك=vv>lEohe'P_ vH]9=N-Ԛﴲ4ƇdS*ElGX&O&oy|~qF3tqG'tG'`j&gzW\7yA NSr;xU+g*]-U$^Ɲt[ΐT0-3O^z^&+݇,އ!ZOO'p[b*&FDMY 䚬ua%šAK?vB-[J/1>^ W|@<恰a@<{ .vfy>6.Y Z/&cI glk/5孊LjIe< -&ކT{+?_.a"\=޽J ޾ԧzX lD6⸼.1v1I6R:;O]YWb pb]2xAuv7{( U]xKoC'&]#ɪ<ä=.ԴuTR9·@E9Y|[#!N(4DCD)eGc!I8'Q9[/&&ՐTvB;ؾ ^P#-<S.?Wv)\B'&]^Ф&]yO']IWޓyҕפ,6 O9c%uEϣCitXH]xR7t9ѥ 4>Z!o}.xκ;w.-z+@;$GJ3nOLJ#%'ځӓhK4>U(ω@ѓLHtP u~@=q^PO<FS:S<"٤I?2jMp; KWAı3`%?#m䭓[T::4>%hbthk:B[U>NJNuE,⮰v} 殨?L$h.Hvs=o_%\V}ٛP<>R{ZV5̼Fj;q`/F oGŰ ['C ?tqp7.;z^&p 9QG <ȶ~,xtZ.gp*2 )<8tnD&l)>V]KNZ±xgaGb ;p$oC.Q UkH}*f^!kB[]zDQlI~9'Bga-d+,I,zv/κttIZ^J"+0<$;݂al4FH_ 36B>tiIy]KykzOc5Nvf^t9U5KܨD{=>xgi9NtrThK(hl(gL5uvκTD]/]6G;pUG-҅ A 93~orSuYu \˘ .c.YiE, ƎfɄ9]p6^P+d, ޮq -}/&]j?gnÛhoF^A 2V%>mZp}\%H kHPRI'f 7 #V`Z/.'V2F&RklX>2B* o- 17f4\eXQu+λ+wnR+yT G >%!,xgzYѝ{fIeg/Kj5K_YfnIQw/KIqu-@AS+Nyu)Y T?vHǶPWk7z:x~y~Zy~uy~k/ԀݨWWBxAPG}ݨ՗˸.rQs_#G)X;!pr %Uy@ ٘ĸFձWcB$iH21ڹa}S _qӸ3ouOߎ/:hFWtî0|1:W{ոF.5n5Tw㉨5]ƌv~FȩR.MCeNvjjY%YO%d+tYV `/Nϻ ic?v&{Fb TR y{"3mBßvdxɶd;yvdyvd;y<{3x}5?3iZq'\N2dwvҾK{/&]nzu,)*}媌hKhdy$TwJ[j+ÐGuUרqB˨D\/n]+&uG;pŽ&]4A\BDW^Ƨ%]?+{RGg9gHesQnut#&t[5h{"\xkEDsU=׹{RUOW7+P R[o6IfW)Jç+W&߾_vd!|ek}Hunݼn=nuuu~[7['[{zxݺyݺ?׭URUk%Tn ߼JQ_QC߭JؖƊ( >î ߌ*foaWxޮGxU~}ʯ~ | 0~ | 0{p&T@+[\UO>~L.Y B^LǐI ͭLpGEe!F RZj|JHv9mR;'wG5| ^ ^o{A^:DGr5N#1_jd5cD >ϨPc*F%5Ϫjz᠈+Aaj1&Yʟ5yք?k Yʟ5Ϛ||ffl!7n6fSF%&7ffZPB jJټ>ԵԵЂzׂZ*-w. ΃=1>s+ǀ_ VܙWBR+.eYez&]o΍bT|*j;WQ!%19ӕ%1GM T䙂qjHd5>8TXBsT*Zl!GsgΎHU-sPvUxATo1+3bxwҧi#hTBZ^ S!h؅>駢}S!~*ڟ|*ANj)je'!'z䰃&R9(Ao)o)Q_VjR(2dGX_G#B&!ģ0pZTϺX&R;gQ۟xx 1k9o[`3)e<37˴xzR 1|qu+sj %/Jb;'N:$x㷻;˸I`Y.SRz}#MCZ Y@[+|DxT߄i®~E*x-缠FTTEoӍ"Eգ$t9)㘓nboܓhc&]ߑk0UmҿCÿBV>.Jlo&6VZ֊6؇OBK~wZ3}g@ .?Qw&&׿1;HUc*h(T 79ǒβjnAVKiȫM-b$q^8'KisumDe[,&^Ɲt9j>$Ԛۏ)z o0O >^zCFHV*/Cÿw3TnLSҢ R1~Fzǔ^ѠOƟKr UM!4x ^% l[rf_ sX`[]\@z"Q WxwȽQ,x@kuxiDW &߀R UyRR~6k gشgЂ+===3\Ltoo:߷ OMIqYo#%']xV OHrUm0TS&Ob螰'](WaEE鼠'bDk6=8N$ځkZ &ٮM ):bc}@Sbf F3 'J0M |=[HoߚMteuo|Ex{@y31$%=CRiO@[j6Nwۇgjǥ*ToUxj=_= }cKt3]ijZ#Z^ao{w`PfV{Z5L6-, Xa|C Ǵ-$ڿ֠B{;kC_kk$$s'xQס{/T{xAէtC%Nмb2>ըըSu٭F֮S [͏qVHofQ(d.FKP3Jj޲\X5ETI \imwJ&[;$9s-W+& %b4>%&h7떐cVVd-c}x9~v&:QE75b4YY"E=cp.wN*y$W/D5ZomCS QnyL5T*D酨N_ 1|ԵsQc˒u%RKLpo+#n5붧~_i8L  3ejw J[=iٖi6ܓ<aMb7ZPT~f3UQ~Q:/' ;xNAvS/=t)^_iWnDڥ$%t'KU4Ҋ9sg'%Qm;$. :p|1gw uA[nˀ$:{;*4M᰼*/IG(1>%JB@vuJ0|V8k/itWS+V/u0_ V%$헮R6]*e$5xND/AsoL P߂o#8E?hwz!$CwJpL| GXs$燡H7ݻXiDjҼTwXfR%J-: UJ}RE>J5'.\LT?7)1O`#9҇iR[7Ֆ#_4x :=ۦiУ|[8tA]kAmIvMrj>lER)J\F.33:/ ׳x{\ \R*($\(nF4[}jp2/SDz9L#^rX4vi nFfx7r-])3ݱ/^')ÂV[)1@xwn{|5iíǪZ> _jDO[vB*I*:"ZR #V!%^Ƨ0k24<8YOV%!@}`FU! e%ʷ]i8QHFd⢕p5V{ƊqH0)"WUϝ>%d}X(~&4a92,WS|uë(J<0O|ƫv-_o_J<"EHd.eިf{-,׵r`-0]6%\{ wuxiv'rSX }Zu{1]]kkU%t7^Ŷj XmG| Gx~t=~0_~\{J$}Z/RU3d+(bd.'4[wMz2@V/Sbv:?o#4 8,D<;\f-}"#eDgh)͸ q>hf͇jxiCD!gK 5b XP|Ӎ4u-RC7١#^vC5 >l;ve߆2k: õGHam%k/qr8|E꽴 VzZX&eVueyERQ٦yS`fcݜJH;uu v7e0UY*@.ZuJ0iaJ ą1ยj}ڷ6lU>+_Gj՜Ko~}}?~XmH(<⤌;hXTtA+!O?Cw]_f>]&:~us˞ 0ז|JTvlQpXlݏ~%(ʬ#c͵?JϻK\ D[+T'ݨBpx/uQRؖR_c=Jvw#k >tFRګO|J(J(W%T5KEQ2rEf+.eܤ SЀV߁{a$(ץG~b۠wv a벢TLX}PWka8AVzO5|N2a~۩a}/5z!"Fޱ;zCgKM`WcwԷ*Vϊ3KWl5ľ)5pK](3MÿU$]Cj xf5|7K[7K[Oh$[{nӦn`D@87-)Nb^L:_; /U4|Ԑ5?wWKUur$ʯq߀_ݽ(n>*6]rE[UOt:4i5^O5u9Q-*-m i̕Ey3AOd.ZK̩ X oS=c^W;ۀsyA6_<}!d+庌(W\˸_ ~q\]lJ6K뢆.MmN3urvHr%Vmä=&ҍO}81Õl#R- H+U4# >-}/[Qu4$H"ڲ!+E(Ӷ$Po7Jow,t? =p'vQJ]s,enS VX^Ŷ-,#) JTq(Q)Ɓ*a媄jRPba)x7rY3Ne{AzX50>%&[a.9R )PhFJS`͠1pAxLtC?_!x/!xiL&gƱ]#Fyi !bOl:#4}vFR%IӔKxbӷRۤ~T܍jxX;p3L܍lSgCFKUዥkGX >hZҎ81Q ;4-(ߚohZ] vꛂe+l$t1J*gYx i@gp=^[.JJz+_{@⥊[R %4nU6|qzLoȾL*PAX_=;c7'hҏ9FHHwE77[Vr {i$uL6_ЦXأm)pߺoG~WQ2} )aMO=")a >%:ڬ{ޓc\H-j3K k_"c\ëB/F; F|[rF fu|KVQ6wB;Zl\Q;l V8o/ʵ_LR`^[VYNV_5$j ؝ >%ɮ{ ZmvⰓmGX37G`# rMqgL*ïvg^ѯI$+O~Nܯv2Lj4Xq~SY2<Tқ6(ָpEcìR>š44`#6 Bm0PI < |!wqj^C :_ƙ>mjdi?xYalRXRElCoO? xß 03rqpTVQH|[z,96_9*ySw~~N/UxzHu2N^K!?z ~?Og=`aDՐZӁayiv\!# 0?ܝ":>%VΔ¼}*eDtT!3~Z{ݨݾTImZ 98ZqɇU 1| ԸdֵQ+`[ r+v+nW6R}UY ?J k߷^MV\~g}; v`Ů}{V//w..>;Ok]|]\-q 6;OXk0 k|5.߄cZb_ (u#gkplf.W `/U@hW<ϣE j%*F R7pR )ޣL*ßi^kዏSb{U4k >J uǨW%V%ɾDgܓHئ'n` 479&&=71|VdFyR!uY<#~hʀwujtQB|Ss g^ X|5% ڍֺm? x~eR )lz S )Eo<< 7pK"NT.!x.T%~҆ԼxW!cP̒W}:YD8։c:Yu8 HiAc>EYR{^ 4B'EYxSbs%уt>U,᥊feT~↓mw~۷?#7Q*. ]'|JK&Sbsn"guv xϗ۲mymwL0}Zp[In2MnkcD=r[V+-In#2nm!䶬,D ï۲‡>J׻/z}q_﾿7}}vON=o;2IeÎ:8Mxi3ú5,4ooa'f "Ç-tY//!Nn8#kZZ:kli&<3v6|JlmYz?i/mpEe+2nN'86  p4dR>r/9ΐJq :,`S=|=|=8w|H@8z9hJ۞_w*(ߚ$!MZ\Q.Q,-$u9q4w'NߝH)NDND3Qf daM𯺕ߠ'FS}f#: Oyrv=v[bh`na/x}e|=Z|8:ƪd>5blE*x]D^qI%%P|m i `aM!,Nu wG|J#fjz4lhUjGCͱ ֬.PdHM.Iunwr-GoZE#nq1C*×jXIk&mjw9.;5Ex\IsIv0e;LeI57{mvklz:u6{mvkmnzz=cҷ@io1*Vb(io/&]܅iKs1*-!^P;a!%+C, >Rce>6 8`^Q́.Ը'-x_UQIMeIsS+*OȵzYkGoQV Q|tl5RѱvaMeH޺'MT.T}7)Bj1)^hC*ß [ J0|`|JHx:o4`F@gp̑G6k鬂_4\vy6)>@|&]n` jd IcZOF R3ún%(Jz{.E] }b_sDt^"E\j_)U>r< {撕pE^LC`/1Fjo՘Pflu 3&H~)楂,v0cr[ 1ŒI!S4flTib KqQ6WJ5T-VKVj~Bj-Kg[! ~n'rC>z"HyA2~)v,lk PD'EH@5X[WQ/Ed"kQY!O UF12"yXoͰiXa=~9Ƿz|*u>ޯ vN~|u\ӽt/՞>n?5^w "_!?aOD3u:D=u:D;QN4ߝhq'J#cM&-%4X| /dyJ%=2><'ǿ!k]g+V&NY/VĵVجz+ 2i(/O|o t DnP>%$F j H|*0- >J^ עta R9'`vhIЫm|ՎKU/mSER=+ӄȳhj1TrQjat {]a͌CKf`WDM$wWx<;p:F;MؑKvN/U@ˬWHP4.?5@8.h@AI . ت.Vܤs:ID:mrQG#ebo(dsk4.t|3}T rqJē|NݬA]GXVMVͪpu`bŨݦJ*O=PH.Ozi97MjRLŌ 3QT CS*I]6C| 9q&;K //USb!svqfFMFyf׸C mKpgd Ћ SJRL?jٖ:!FD yKa)^`3̐: \H? J0e_Cg;Zq6 4>%J˙rlͭwoZU&$:;VN,<Nk oʵSbVI gsa"Po"Xb+'GX .NHW4#>@Kf)^*0wD Og{)80T%~҆kf5.{#XE-0(W`D1V%$eqZwkT-3 ,~{]euQf9A~+5ĭiE\Oa/|ߥb{O:"kƒ㟆#32T>a'jkEhx/h;QGͩ$4z~­*0(Ko$㻄Ju\BhT%mJHe)~UK'09?oB}ma*GX  3(_ a6Qrn&uШ8 PK8@4Vy ^^b("@4NpKmɎç8Ziz BϰϪvYT)ت,Ga':Tp9}ZdUA8rm$D)Z16Bj ft'+; JyYjYydKAIuMLX ^hR}/Yyuv4t74rW~ ^{ Vt҆s$0NH%$91hNdff8ػ4>%ȉAѠ#xH%'Kx;GX @/X/KAT%ӈw:3^#?O# s wDv>5Q. hGO@zCCW밼!'<%OHuԕ%5-!VNbыeuRWr MA#Y7ch_*[l!^kD?OI:L 杴luۭPx/]G[ŷFi3o]#6KвWR]kAAj/kTWRD7Y-ܕp`)L:#II'/El-X>%q/ϟhu*8V6x! Æq-P8 WQU||`nOf]!L\xi& r/iuE,&-X߮F3=Ƞm}v\S[mݤX1'CjOgGѹ2VIhQn7<4 N`k (kp졩`J3g_rp * ܤ{v;J:, ](2+9dC*eܤII|,/^W`xqpxq^sq3tx<2JJbi`JƁrUxY`mAfwV*e`25 ?)x&8j<Ũ)&$ yE4h Y[Zx^ju>;/y4. xPSbŽ0-*NUOӐ:S9̍a%N4zl  "W4–hRKM9Ҹa%' }7B f݌2n,h/sаT"ZiQ\BB y Ы' RKyAօ_e.6ʁ v]w^Y܋=k8(S"- cs_AXi;EHweL|RbZRaR3|Ĵ{WZ:ෙf3 ~(1{_5÷RC kaR^Jݢ#__5zƺhZ@:4[;! ڊnp']icUðh\( ^*uRsBiORE3,N ?=isO4'MIݓ&=i{4'ϞtowN}anw2ܦgB㻄JuzqyvrJ8|R͝Tٻ :1,;^d>Ud>H6xJ;E`WBkpuM}\//K ^a?,T\PM+U4wG!.̍t#OR^ja;$1F7;-߇suHύ뷏 pW((R˯hE(K9o Ȯ߮/κ5VkA(EX+ tf'^%)$܃^\z.(.E.E{ĽƷYeܡKX5تqdyHbTҥۓ$^P5̅U#j]Sb]\q/N c~RWl3WSPVF3l?oԠ}1X6kH(5®n֮`!(n +ݎt٩)^HqчC@J :)rnPMLЩe9 %b4>nh(!j|5ç=׸L{|boBN{^ؓ|82,CX'a.$ˌ&dX2 2,ѱQa"ˌ(_g t͍^o<_nt .gFFL}mtMܽE9nsڪ$;rSكK1ur`mtIi9:v=bǷ3˸Ik%;6:ѥI*JSbW`unRAVhjH%u:)P& @qSXE鼠K::QG#=@qSX9puRe.Oxt)[gVpA$ ;xR 1XSM{nNxw֥58~uldmfF.断e.Xк!ޣʫ$ux xyzrjb/(ZR9$]˸xߏϿ/xQZsn5M4^:SMl=cnT%HQ&pipGװpoýp% 1{- ᮖI'؅GJJ3M*)!~n2\(Ux#~]iѓvYv]ng{.FzoP'v6]vI2~K/teC]Ǟ=H{=y]yk=H{^e/]sPPb͓x˲pJVuQ\.+f]4Njvu:Epꔌ& i0\Zi9y.AWAxwǢvҥMI=O)/t,9$F>|&UeI׮n <[.^ƧvNcLs{ 4RE#Жpl^8{pL^8{ᘼp ^8{ؼpL^8?^j\ a`y+YFAMvR)Rc ,{eTd+2`##z=ɏ `#AHޏ #z/aaaa>u~jE*x9z2SOD1j/n9*v]6yeN_](䠞ZO~]_,Xl O'3v+ $'o6_|aڿ~m3,or#On"h2&XSr GXyyS7BjL!5L՘1xůHCԨI$5NR|qX a5[jV5^ݡnT^{^/w^ZFrw>; KUgO*|M3|?G-~츁Es i !29t yiG3: 6 ӳd?bo'o_ jCYYlʒoWi˸sSgMYe Fw91k?^̐TIjIJ'jSlK݂xRWA/]:ovPVUmzqᗦ|[z!ٔ.v؈q.nEjYNXܬƫ1Ӯi8ZV*/~2l$}OiCZbbKa.]!ٍQ\Ì&]^UlU*V=[_V٪lU?g+ULI}g0qQ]_FO [׆]a(f/d']CS jM<(wU77يxKtB- #-݃cr٤K-Dj[t:-46k꿜U牪'ˉ;QuD* y7šfvQ)e[MA'5n-呂T#^vuѥ2.y1L #gLWrVX +9+ _V%HrrfúFhxB>arѻi2]lou"˥*AXqR )7Majd>,~)>,~_M,~O,~"!2~3DF"coi ~K/teC]GG멏_>6Sqt>F;Z'}Wɫ;;sp6yuvRS n{עF8l]W,h9pga%Ҏtf VR 6Pu"!FT:OJ#°XF&!G@&Jl!敮 ^8 ߝJoSE 0AIR`({kg e͆83g`ͬW S+oc#,.U #k{/ I"V\N |J̸q,_TрڿSWj$Nm7'uV[&kY4R4*~J+ݐ] ?z >v)2 ~/e|R=:ڟ, 9-ʝRwwJuZ SQ}y̮ổ >hZc3T7"_3?51_ST,t 2៪?4{9#!uDxkGXJ^G[߷NY#( >_V_EzTXk!X$10QŸ WK*`ZKU;Jkiؼi4aaa7 7 7 i4l4MFE) ׽2Y|R4k\Lתɦ //.3\gܴ:#t8+XP2 n3+wPbE oZȵVF E5ĕm˸.eF6- ✭R+V59Bh1ua w,3hoǔ =4>A 32Jqnaf4CM# i|Ն2J o)1Ӵtŗ74Ҏke3搨}Q# ER틛UvTݒ iS@`J*mGX &5̶qh: 2|$]$%#jR;'΃-kQxyt@0fh$#k= c#rf|5kX(z*WҼpKAۤ|Mao$7_HfREAzHuyt7.|<ԵMt^g7<=Tj<:Ooyz<37!'BLM^_Co^* )9ܾE#ՐZ9ܜ^ !\zHu7Gl/_<2>%R\<9[?fIM| ФiL {IV4Z2 %Pׄ}ݮE=09+j_hT?H:h./0zJ"¡aanpnץ)" n˩Aaa#,Mv(0 aa;v]g% (F_|JPaZ@ykTOOqGX3X'$$k$ ވ&|D 3R(1Qaj܃kW梎^k/$؃[>b|Ck?'~T}j}X7b/~ʎf)FD2nqm9/͂~Iwlw|KH/Unq-1喝\%Hàȣw=z'ͣwG;yG- JC;6\T)1bS?t?U]6Uj~ ϴ>m6 ߶p}|ͷpo >}&d^-5z K гR{ %b ?1zAH"4F)T^Wu ?h?^fC.WCJ|+{6?4Ȑ X|5ϝrǗǗǗ>l>,>ee_O_gGڿsŠD}CّIuI)5#g8 N}8D6q O8_S@0gwu4 ;[e־Mg][Pۥ*>{7|!E/KX*BQWoӐIM'R“MVuV:~x< 9Xx;5JH|x\K;h1_—o_c{\fD=:i2⥂L90jELt,l!kU#.GH%ύ.\phžU8Q.dաl:#\?"e eܤK}YC <ݤ:IBOd !~2>wXsB5>š?ّ ZA|uDGNK >%()KKUw/ʄcRB5%}$66|T P).4b@sJ0m G _+^/Ym RpKͲ#:|M@ܝLBox$uš?fCj^f 8cj^*_|8Q8] RpK/qԿSe7|>S7LLjg 0_>^GH}gNjl3OAI+<3O%:'Զy,(¹&kGXs ۵pnWQC CxNs.RljJ -eHT'G5Dhw/=T/p;!Q-l|5 ?ϩm?o`J#ҩ>\^-gϐI-aכUM1:҇meˤ:օ/!stcR3|2CnĎu`bF||d-EɈOÈoaM_3g33Og33䙧33Gjg9|PC Xu? V >ڵ]4 XG ?O'|O'|O'|O'8 f5n~s"WŸf5)DDz03[HRESpiT×cqU D@,q69uRȵo~\cqE]ֶXkzo1\ ĥ*K;|2hTѣ"e8ϛ==%bRSaz v.!ߨ_ojt u} t^P%Tk:,Z7ΌK _ɘNen bR e'g GXV#Ըso&.kfB@pgZ>AjL;ӹfB@0ꛉ# $U'"!Iڧm|d80lTj]]KMܦT0p; WŨWGaQAM'\b8'A i @_v @Cxv+n(7,|6|J٢oT%x@{GX3/6vm^佶/6vm^sm݉גUUQ̿DGG7Ѵ_VwRDG^oca7Tx,aJ9Pk t]ypε\,*]]K4zrE+zY bd/Er{o=Njqmq~98xO/儣zNi &6%ƓN35vN8+%.GHyqhmq{ y55x{{]'D;|ۉ?D՘j8WjTa=:b'ݞ>&7QZi7/= *c`O)^C*!u𣽺ؔI32 3 2یCیShqkq o3m3Zym3vm,͘c1m:ypѯW9wGOq3gEgK΃3+kS/- >&Odj:l>X']c8נb ?B*E19?5C*ϝo;OSߝo;OS?;O@k@{@{͆X]h Z7y%FLõU3f`+kB?CHR˧r< +t 岂fyqʵ>*oVk*Vq|,@;a^7z`D*?<.K2^-X)κ/HGS o|aT%6'|5pi?P*b)A!Vqj{An_GX ^0dX4PjtлQm-Gدh%XctRY8|l%^`FSDV(pJF64GX?ځA\aVջQBroM4ǫbP;mL/v:)NIpTS%6;6HFqJV-ikX_p]rocv@|_\"0bffǐIqޔjbiH[=TlQg켠j\f/ʬG"M[JH6򄧫ʏG=I;}L J/L;]++񄨋5ܣEd]GX1 zn< OČwR[ͮ#W 톬^c6@0[)6ZljS^ߦ*"2^U1y>^!%B[B-Dz}BSC{ƚ zLFoӇquga =Q}Gdyur27~=泠!gI,(u:/+/YX!gע<ҢҢ<>((w^{Q^((,6ѡvcv_Q$}ڨNv@_TWHuF&u( ~Q|P?l_> &ϬZPovG3,]t/S{Vt* >šk_0jl`g`dROwdFO#M!k?=s+3ggNGfSh}Gno?9W p|Ey7 PߧQMQ}E6ѬBm] Vu}~ ~&O?~O?~&O?~6O?97K[7K[?~wu;vu{jrD]Af܍1vn&w ,vӵ} ὩZ}82.k!潹!Ioc`~;aҶ"GV#OY~ Y_ߢ|ҦmacNyiS8'z*(VxABQq,'n/ "Q,"ٮ U<\[ZMMg| -:vH-ڢ-+k8ߎx8ߎx{o8iq7xq:EҲ|٪|TJiqĵI =؂R9@( a}OCd}WE4D 4 wM*,`t~ӓѓoz=YbVWjfWvW;>9n/lɯ.ˌɯ.ɯ.qy#eW7~h6V( ʮ*LjbQvAeW!TݙBb }t/ʃڝ)wKUP gRsj2 >%(>|4K9>bZ# ~mw _ 茭-/JERY A$ Ye+2K7rKLP-ŨKܾ/w>%&7bT%q']VTݪp*nU[խ,vjՠne|5 uT`"J FiXeV;RKUk`JR3|8#R§H3'X~#EhRq$l~LЀѰO(R˽뛑N]=Ս@ #{Z$q*g&g"JpS,R[e%CNM*("0>6t!sP؅ঈw9/d܂rӧ2GX_Mq SStOu M!kV4!;5E}Cl) pv?Ky+k?Q<vj'*!ٗJ-.u9ot9$]·.]ot9IS]-}R1H>uU7: xn|JH2RS;i`f_ )txj8z/|>ާIGoz(:PtJz(:E;=/PthCy=izC%54ijz/Qf |JDmeUr#N ZzrŲ /^/@L*W !u #_g .( >JҎ]M!rS.U o{T6~1Q@0b5lvOAQa'ݞꥊf>(|))|(|0x;jR3|Sϐ_Jwy9k G14Y=DNoa[No}5.X {N:\w咕>64LӲHKYqaJǒZ\kK>QHrI6w%أ_bZi0*SwǞVBjytCi;w,96F75w*&{R-vJ0c;kI5mF_b*O'YaesOhuQTAl/&]mBvobw@u4>%vRoRx "<:wy^ t˘wW<GQz,tA~gdӞ]'b# mLt?uTRO:Zb4'U<M(id禘'=ѓn=ipޓϚb.{^X5PO^hy@K>tˁ@xNKrO?{=BhmG.SV= 2)@*f I$qRp0Wj1t,R{L]fV \d62.t/wwNʁfN4ۿ"@%ٕ-u Zxw16Hb>T W{K GKjԒcֳܽA5CR/dKzHzEM^?^QS^1RW_􊎸dʓsz: Ye K:obt50 -s]vhMUqrU勐y &ࣨ72םRDGJ[O㿛$˸ɖYi=2>둖##G\2zGfZ,N4l44ax/ '/ / wi8>HLV-V#V3Z4ZhcSHqd:+ӊUםl"tChl˱WF%[.0{lf[ IP23R9L˃p ;.D5N%)z֞sڡ?Ozx'=|\9p1پ!ܗk)}rbV)p, \9p_jJc1Y p܄ϗMW'rݷ U4OCk_ Z: D5 ~/K|+# ]tX t ,NtbD|xh GX ~7͍p3ln)a^ 7q)BNdԸrJ0|1r5~juJ]ww=u[ʫ]Pםu+uS Eυ>8MICiu DbJJ8'rym淩GZkKVs=!GX|_55BO F . BOKEs!6^qzlc8l{~L`$Z-5T%v}0W1u 8 Ϗ U?"E6_64;j$%Q=lv6lö$'MuFL3QɈiFނJmZ;-!{!Ypx^J d6-B4&FABJ9jWظr @Se>u6"v^f,—CFrkVr 97=I'YŜ{x;H;G_6X Y+wѻ,۰_6)t?گa\ʹ2ݡzw ;|#7LyK*܄|URԵqJLq-zLAFn%M $yTm1\& qh膻łCaTXxCkKyR%R-cKa[$[ǖl)ɖ$[ w"ɖrtkb|jV8_Ss_(#!nbGKҩq=~(_*eЭ۲6ͶUJu:qϐBRdlXҝlٜ2-1<4:VY?iV'5iV7I:Y_4זɡُĝR'x0Qn>nWrɖ7DqkX1m2nE7rJS5C6)F%[9455~6sNbT{!Y"~U`>ܖ|G_&#'Ŧx bSr[j!f>ڢ)E M)Ҕ{J94BSJ/)RM)}ć)E M)R>Sh3$wQae XJ\?uMV܃tWW:Is\eܹ*f(H9Fc;V2۫Z LG'Z淊-'K*Ri5'eQ%N}釥niWzp sвZ8y)ҳݪKSUSUTS#UEOU1>URUTU񜙜lK]>[{>4*e:V~h_ɖT?öv vV_TƕJy0nDCuv/ p k"-@~o%5#%^-9@iVl@BKrJZR#ĈNW}TGK-55*V[}~^ZƚKדmno>NתεcZΏԗaU0|Zb:L+ZQ*-`7 U3VR5X*^\q? <ʼnL? ՚j\塄VӢczIu8#䔘I?t}NiB%r۬r5\sa^j9jǃaZV%rۗ"KVF/vtmnЂ0)50iT^ņɛpZ5Q ^l0B*"v7 ]+`6o\ >c &[ !$VIϵ!gHI_tyE׼{k"$¯>pw #`ڋ _"<ٻWi)x }ȖJk>T ,m 9)}=.|OvصQсcwrJ v1u-'fU4MV( Mc\db8_Ε')Q~xyO{kUsR @e DPSoQd@٩^%* \@#H D6D#G"hH$G"DH}%Ю q(7tYPW7Yq O,t_ a9 &[^K:%]iI'%IK:%tK:>ZK:%|t"5^ۖSA8~q/ x=C ^[E쳩PN_ta XF4Mҡނ!nŹM/U;BKsCVZ|`A!ͯ6Kl)qlL4}- >n-2xZөH}5MŅƳ*5U_GCf'өJo>nW^6St\|>фpivgB+_Lkwahmp͹ x7 zۿ's0VϾ)\VKV^!w[F[L.||GV\d.bO̺.';fݻ@Ap9 ~w39%:W]H_?U4RĴN|w]wrם;u7w]w~zͺzbYW/Ӭ00EZYw-uǠYW{4En[YiU$$ $BNNBVsǜd`ǜZ ?7ōpY3,n ~˗r5ÿwY Y賡W6 {L+[(ݵ2v)^ h ~Zr-^52 [pյ*nu&GX ݽnKom% v}IdrJۺh۠khmB hB+-Pv f fy-1|;X0w,+uʻn]W]Wn꺳p$[/'.ӑSWc"p-SǙqCeZЦu)[vKB&GJ Qd/J5_^fAj6qXȁ5^Ö~Ss0\BhRJxM-,ќV+Vcٻr8" ~63 60rTSQLp VzӸ1o.·]Oq":X| 7&[u5mFPQɖm96ɂjc\lnC遫Nɖg1Lf1=UgJ;VV2E[ε*A19=Z(<{ȿh$UQ_UTSgNJG#o㑷G^ᑷ[#oWx[yߑ~zxM=^=|q'Y+}{xO=d7߽s+WP<^߽Sv5ɽs^1-irKZܒ%-irK4%-i[4%oKخf|iżymO_.&+IBRdtۍ~'nzW8\]bqUwU,UUq*WV=tڱV/D_w24H r<{1ju/ͻ.U /Ux.{h%ri;?(˪AOݟھ4}̊gjR㱓Zن܂6 -hq ܂mnA[~ o :)o,{T2=f?.9%&q훲j*n7 =W*Uϻ7??\KJ.å~YCOHڨo`N\wmZŜVת_" 9JaƏpݚCE8_H5m}vxA^8W1m|SRGaRg ]{KZ+_hRaM_-HUnAnA[p w nA[[P$܂ӂ'MtLOPW ?i5dUkgU;d#'fON/f +k nieGC:(7 #~a'Qo'`c/PntYP3Ked1B⿽e[dd[-jAlY#nK{q\weXڋ+Ձ;? YMõG.NxV}?6aV7V尀U W*׶8M}صp<8Q,!/!uݝ:|,ζo7ɚ32[V b5YP_&/x٦/q.2nES|g`i!dZ|Bz*lvbHV))!,-=[)@Hn%T:\-D^<^gzy\_^uU@:shWm4{ݸ4gKڠpaqdAfo._E/;FxǼCG^h1\-ni(®U `8w UXcZSǨ7a ^1e7`:aek1*GO@<4DOXùU8`b7BIba@W=Ť8p^F`rJPL ,ѪjU#֍# 3p#Pwn׃ESU׮xl[)2d72]bp%ƻK4xw]q.1K %=c:[qjܜ__. ŽrI|3"C\y5H7R{A`n{[*;|ZSm[*s>[)eH ҝl>_]z~eF-rg+-םl>wi3ߤpܵ\" v.f"t?-C'ß?X{8w]i'?+x<`Ǵ2nAsթ~֖\/̕|uk>+GU ޟCNz:W{_\߸f8KW_'-]t?}ѷ@0%+נ=4;ܛ ;c!x5`5:\yN LNwg{kvP7;&w#;W ꅏW +^?ʯ֤W 'zŠÚNAW +؟W TH~XpnXT sc+nMN.X,\ _|r5GKI /ywpl_⺮T6KCP 1Aj݌õ \ ] kp-w-ŵp޵ \ k|kA#eO '.>b2NөB)f1Fw8OI}|>p~>ǵokaZؿyǵ~-Ղzǵ Z?m-ׂkA䷵ \ ï&[/~+oB|)/RVi(|+ uQ֋֌2v <[I59|·[w>pu :IUѹ*&WEUUٹUEWEx:U1*:WEVcЇi}gu}/ꑐSsl&}=Z fR8-!GX |\]KrwO.?ߥ'>cņ~vuQm[F 3y, Ap5kV­8ȂӮIj݌}?óݫ(-Kt Ĵ:-۾k=}lKDK]A+x TbZ!0]"vf4C|bDBwM`!#r#!Fľ^Ck#8W sҘ㲔yN8fyC}>QY"W}vȋIwCS\y&[])_lW9J%N<\ 9a`rCoU*_&C*˵rHǝÇQ k8Πފnor_w nHͨ`ˁة bg]ao _wí<\ߋp>=+Z ~/8]!GX3?n4ztÆ!^06Bmْ#^qJ8\+pxڮ~q̪ƥ.>]#6Ÿw*E_AКR\x һ{V%^!GX37ϧ`T:QmY[hO1`aMeTɲ1Lcr ߎC1uhnpiv۱BW*`J_tߌnjWȁod\+@L*B+M)֯qp8|EiF 'j_i=m ,w5GEl>K?|*=np;q.by8|xCdڎr߫I+ɣ >.5xt+/ ӖˁXQ9RJ܁H[0Z -m5pשq*GJ|pPܖ_Ϡ_ kcSBHer)Zp۸@1Mð M8H͞ԭ#tN;cۭ/&1.==:ܛ ~җ\Eu kn8Zw~D?D< r.bz|9Ecم"|M{Mh.d.j.@,޻.rOy"ùfeV/h%i=폔 *@sT7Ɉ4,kwJ0eea}~?_쏄J5^J0|hw  %Fag$Eu;Oen)ES^hܡ -mq߹nm?oۿ+& vem}c`@ _\T*&Z9a%0NMLf ~(Ӹ@܋ͺ:M*OCr[qCY ]V2@TGuת^4ᥲC+rxf UuN.`C[8Ws vY74K6մ2|߷˦}8i߮}h߾Cx)x7H`w.I4Ti4/ v'۸@r oN__MgmTa?nG5}\V* r.bkV|(w;CkPY r5_i;AoK߶+.vE0GJݭ{ ] >7#m<GލGop_5׸/>bhrAk as9%NM‡mpZ=LZkr8?1- >]DUH^ 9šQ [oU֎%@;v;P@\ [!\CKZ11r}7ыnއ_ywpenF,&[}'Fk}'DVF/p5d gҴd [-\\F-;YM-m%r>dI-'ٲ-mK-ɖl9Eh=aF6 HH֐5jPCpՆ﫻v2tHq-!Q-Gz/1q!b䪽{xOYCB|bN~@H\ S\(2hxH5* Z(.YLHۢ*D@XՌ2[jq*[e*ľL QwiBB2nS,%զA :r o=Gۢ~Y:j`R~j 9J:vQUoCU1k&t?(C֨X2ڗf9+◒X5W($˸_rxJ/%߰QRi-kzlBla~ İA.DA.^{ܿɾ #t+W`B-#WlvQɖn{\JAGj_Өd˱5,NHI8q_m5Ar ~OdD09i/\E3, VFE&R~V@3^F hFi'uitY(7=[u;n/?+ 1m,(@F:2[Z >nscҭ܈ e=#j<"캻5*9/Ӟ\Yw{=,Wx!YƝm);gXBG_-v_Rl Y6 ` y]b[\ NRkSTݤl9^޲yUU|I/XGmSJ-W\&˸-BwwKa宥 KTzwbC U|kΝ^5 6P'bm S4UbiI%vt9%TQ@Lp%)!GX;xn28bPFqU(M֨pŗ*=XGw \2\#&\ŋq53)vavˁ| 7y6 p;wHKh%?[)% =Z ]A|pђj J^]. uk_KrR+jLNw.mJxN6q$6Υ\8uےJW)?D 9J=__]4l f`e%KH;FM%ś2d8UKK_bۙuB+U1GFv/zwr {Cgh5xո.G9š?w?UG"496x@lީw!.a{sJ|*/떽҄ m!<0MhPQӧ?էT -ޥnt-g MŶiAv0!b لvߍתY`܉6=?~oCNtI4,02d(|m{ύ <N6jn2L02dlŃRAjNq9]dCːu %~{!̗!Ղy<ÜIrȐ\ &Cu:o:vaƱ9F!А5-3:-i>F)Hjfed|ldKMǖld|ldIǖld|mmK-ɖƶEؖYؖY޶̒l唏-mmnf9ޝ=[NAvt9'O/iԷʘk eHҡ\ON *je"hBZGdqwZ򍝱&wiZ+*Ћ5^p֐T ܐ|൒nE#06AȘ@۽6tηntbn{wa[xM!Zp_ <ԦiehDV >y\ES-UM NhiKZ!ҧh_lͨڃHIZ+Dp!Ɖw |ԑԙRi]!"3RyȄ<44_ f['a3K؂CK؂SKBǖc3d|r [ptʇ}m½n.+4WhpkEkLrʶۻq.{\]dqkknV354Lj~Ljf5?jf5ShVKo{ز"*iNJZS^9ue!phYaĊXqHB۰rhS#jxO$p!kvheY[CTRdkYJɖs;^ͿL}WaF|iZr6N\#=h GXsUtԃ/ȶszꍽ|5d*=|iR>3p H7ْ8\XhG#m݈qUϽ RSAN ."r4.GjsӸ-k* Zeh~.24>;24e%Vk*c*CSTa12dVzUFh߄ 50?Xm2 w=دB-Ihh<^v kv knAGКv cnM--ܻ<-4-4-0FVgZX<-vV/]ME'<:ܖk ¾|5c2)1pAq-}*(^p;q.b?>LDYU :W@&1IhLK*=&$yIc1I^c>n1IxLϘkRƥ+&cR ^,<)ʓIyWgi*ΓL+Mʽ~&^=IѳgF= ]gٻrϦU+Գgͷ;G7ٓAݲϤAM ȁZpkirkU,03c%]kMw>纜Ϭٍv>v>j-)6Q*h3|zOoO4SKZ%OK%Ԓ%ԒzjIӒVjI34U1*6W|Wઘ\]bpUwUlU1Uiii~&L6LGI9罨eT2bY_Eۗn^tXxtMy/|&?ܜ4E^yn/fl5`y>`g'X-}ܣ#q67m㑿xC?o? ?b 1a7OƚWtWtvZѝ;I+Vt罢[%NZѝ_~ےVmK%ߵ$=O[K$ GWs=6v9%Nq{p~"&z _/#_-(yT/}mZqo&5*Zȥ=kxpSn<|Nq 5S^GY9xjy7>(3ޗ#]ہ<']˃yh;Pߗv`^_k+ME&&B 1@,>Pog;Q>{h|4s'hbVU|YgUU1Ĕ2eȂRneLe)>J!=@m&l1L7lPWaBS{|:?\*,q7*]2B( R)Ӭ(2()xE8 ˸_^]ŋ5za}}^`|*>;ٲlw3t+l$˸_hˎBl&B =y'=6y=y=Ny;"aa11e7aE&_QQ}}> W{] t׬[9UG1d2c衋y"Rkd5yÕr3!kT3XGT|=O$6>p Z1H73zzL=|~zL=>?=|>S;ͽc{ޱwwX;{ޱcFV{Z<@ {<@-wZRs:9Os9Ԝ֧9ԜfjNӜNjN+5|mз}YJl?!E6۲'۲<$˸ɖ᮱]cr5kl~w]cs߮W'b^?bW?;^1E`$b,!0&YQpWUT*0&qEEmyVٖ+J)|`QݬCR 7+Wfe."E?"ȹk0:kzXK㴹Ry YP%8PBwɇ| ,N첣)ߨEHSLv< q*AFWA`v?سwv]'1-0(;zz.륰yU@^jY*uv:Bu URꠕWW`Y>u0cXS![ ryWLÿcpUZ愀9w" wghuՄf&Թ !t05!jbFMHګ I&D 607NMh6jB}P{ICRk!i$=$Yj{HڝxH;$]OtoL>E1r"HA,f b嶌Wt-S/=H?RST/S/=KM?2RT/̶9o9li7ފN4u|. pAqlّ _2˟GoX2N,%tsH5O&2dQؔS罥؟)Av0!y|(Wdq +׳q#^^BiН`tQ)Ϗ8-+)^U@c+ O#M>&O>6O>0;fGQ ǿ RFLÿpU{ =.?]̐# )\ 긤Ql7Ӝ^Db^M- ~uqwZ@z,%5 c\<2 Z~}#/`@Usܞ0ǝs\/9wO}Lj+l sܡ9pZqt-y)x)~*/g)}WRZX/^R6dlgf;11yk#f3[/TVmeK8UNσT}4;GSRT/TȆSţ;;UNSŪ_U?^V轾{)K꧗T%'{B_5^R_ު4᝴_‹/.R &%XGҪ4V;qo ?"~NH$ZOկYDpa%J3R',_iX7-wiʝXu:H<-_/;)w:H;w䧦N?|NS']--`KsR"lQaE Gn(C2m|mR-O "dk*<4TxJTSa4 {*<v w*TwVoqK>rWW`*kTyRe<v]8pvt-W;#zzH=~}zN=~~I`wKp44nInMכFֿ_DZ_5+ᆈs/&c/3rT%dd*٩JJvdDRT%Ur&M[M^P؟I2„H ύBktiGh|gBq*nݨ`7.F}篪ؑ"q{Ⱥ(z 7f[|]~ܞ^{n_bnO Qs.YA]nt- w#d@&4e&4֐uza[\aÊ+ޅc6l6jS|EbUVT ܨVTiE5kE%VT{ЊjZ7N݆hXLݫ(ւr Z<^l޻V%q|lvhe'vaӝz|" MOnڔ@\dq)/ i%+{%%3B֨ڼVRpJt-gr}syn„1+"Oqm,>9ρ /UØ$ 1MXPQ /Hj* ! .72-y|01ss&:HG/q\]%> si+7=暍8aO[Ohua2:iΡkA8juWz1|oִ|Kh=g+G GC/Manr _ð\-lZ{w%.(Nh%~D-7yl8C VmxE8W?c.i?wg]cWMq.bnr} rD $';[G#sԡba\D2lGveq?=q9J15LR_̹@0|>]D ?EV%q/1 ?UE#&F* U 騢-;r~T1W:r󣊳Q>8ɰZĹJ6Tsh! '$ e |6L |\lS| HW]u#p:N\+]KvKpW׺ X?4E?QqP@,?]n<Z/s9 Ėа\M6W4ɞF;W4!5*ٗj0nʊ'dneh"d)~I*P.b vۖd$"Rrh-azWUAbˁ' |zjrZ{Xr5?~#0f^#pfv8#]8>4vaM;5~. |zx@UD`@дi\5e ~w]+ת3InoC*|t=>$>TWb`*jZ~ 2~g 3d/?-C_w5 ]^=Ԫ:?t9t^ۨ\kp۹F+WF D7CPRnt)FE!|)~V(Cw,Co+.&ɖ] kp;q&@,CwWҺ Z[ U4\%:sw;^⪶îot-K=x 鶵Jv? [Qt#%6C]DxZoJuY'.X!׽L](|"ÇGp9]bFc— _~ # }8ۤs c9kh5pjR NJ-?('6=IfOr ">t{-E-p%:|WiZWz?*"20_/%QU h-^#?P" ?."?PpԮo @aq9ƚ]"TE4r7{:\N J9&D@o{E郫T&7_d!E&_QQq6b_l*DVw|%d\e@ahzX+l.U1-@&:Ja?U4ӂqfDA8eˁG?t;Ձ_BcopC>,]_rJVY޽xc9gx|< B)7k|1h>V>cc>5÷X|1WccMXx0h1gx|xm>O}Zdk|\j]`Ekx"]buwqEkXpHkUw.<%cMc'|ٖvNH@;͐5*gf 9_|RلlӐTۘUzq:u1y0m̪⺛H4hWEhiBS MӄMhӄ6kBS9>Mh}҄V;Mh&4EˣhQw5FλyQ(yW|]N .a뻞V%x+^P _s `_r. b' 4bf5An0 FqBLS3dYDnٹ5UG,\9#i1\ns# q^92{zӡ#˧CSʻ ^>:꽃OpoոD_0Mv<4- Y:;z;|niBVV6}Ê}%2acyFYb]!kTRtԌZ 9wY~l/)vCϊ:Gac&@LCϴ F: .LB)w$VF%iVڒhq1qVpx#n ~Oˆ(9FU&ZjCg)lq/&%d>u_dV]oU7#=nu[BDŇOUz; ri^)?qQ\(2djg_Xf,/dO>_7 Q _7KU_66On?NE#lK-|_ݴ\?>B֨-Hpr쁪,+.&ٖ#Lpfb[r aT/M#dD GDQZ&d08g}>tM!p-]c%whqw{#A] @xC^߸5{)7 \&O =HүH\8[.FWbZkU">1 ?%^NJ8c\ ˴x1n#hFޥ\lmQa|n1 n5R) w] ȁ(t{ٖKElνh*zhu?_}sL;y;fI+>e5x_\٪e 5A-섦dK2~d름gZPF]ɖjilWww=d-/˨/~.FZEVrwQ˱vs-F=m| =_Ggy;9d/2-UfTeCY*;d/2-V*"69M_^u/VEOt-W:߰6[ulͶDUԚ8[)e_qA6&[]=rwi}YnҜ` Yvߍr[fkz'H[$D}WL,!lF-?XC֨:[8֙z8Hwc9\Վu:f[LC,<rŶTC֨g~@ W<9b[\vt#m 5ۢ:0[Qnp5dnkh$[v-;rdG!kT~e:~j;7iם^J-?5cdT BRnK DV؉ W/K[װuk+D)۶ Y_3BQOrՃ\Z ɖɾ22eOe` eN?]I$Jy8;Gd2r^6ԣx| :/Zn-#YCݒ \ҿ%'J¯ E,V :o&84;#eIܝ #[a( dd#d 1^a@?0$N44 hdig!|7Rz?oRMds|NQvCNMq0"+ڇDV(.kgFh5Co<*44WvbuȧX(Z'2(+pJj:կUi{8pJہy& ka ðKIތjsâlb 2uƎvnph"%G2 v=5Q=x&}Ί\ -nλde?{+@%wo"))S5(#@t-e(5AcPZCDk˖[d;}=Z?FQql[8rlHvbGԥϱV{>ygJQKQ5{>L6uhWR.-ڇ+l÷ H 87|%fq"gfIg8N>1r)PPȥ";xc(RC1EB.E0y/ܢKViU05Ǵ?LiUiUV\LK~(jC9܁p(TCKyO?LԖ.U_̗.>uP]T7JiWo}u߹OaB̴[ MbTd ) 8~bFV>+كsbT#u (7V?o?o?~%Hߢ@*|ˋl|QӪd-*A1~((=_n򁐁: '-ReY'b=̞ٲ #[MN$E-sG;pUvM][P2>glY̭YrLȚCm[p3jk[ǸqWF`u;q5(#,~SQ=V4\CFH%J;$] qUw&-(ݷ& I[P qWa[z%]]) 3]?E˲$wG\9$>fͼp,HF+|Cj5jh05B _m2K" ?"iδ(6gKd}O'3SzboTa#I(1_P|'Oi~9aMlu b#|n4>,ëʉȒ*qG]\_Q l_pO@c;@#`̈@u\#dTj0:{7CxOӿ?us[]_mrO> = >C~䫖${nLZlu5X/dWɲJuP,_&UixVq#cT [ - owDm\bEqę3ɤ*nעW' G bi GNdUBeTv0ygI% MAo?wuk^xYB8 B[+On]߬@b+rU=oȧX޿=S=[=홺mmm|o{n{n{yWg3eOd|>.̬3 ]>JmxJi3q6BS{z$߽K޽XXX222'''>l=L=ssUW<-Ox<gI%sYt)jĽxO^o%"v'1Z9) _9eu`]Fٍ$'1)ֻGS#LNVvy^=}%l! yN )VoذyƲO+P7}kH\*'/)Ո>buu ; yr(v2 Kq2țvqxݱn)ҥ²$ -߅{pj*6tۨGwqĒ:ymR$܃|'?&`[ҬTrJXA~ìq;\#Af2>LѴ%.NBvk֩4>(Ղ>'./5Or}f!VxJe|BO]J^_Mf_!6Y&Z큾gEʭK,LJF&a/ޓd=)=9Ae.p2gx~U=ʰO`&^_ӗ}KHm+[ MwR TӐvS4VA~ @t]l}|FH-bjh/3 =(v0[!j"En ov)Rܺ=9ݗ]uٵf7LpW+!}l54 ͐J/SEmm ‡1/Z{ᏐZՅÃvO k/ya=a y((*(njxz c.kjD=~a` [,"|)wK}8Ŕ;*|ke-_ӫ᾿Iz_XeoL)ֻf (O[VICo]Č{}ZHm2T&RhK3f >3VΘX`W" RifH_W4.YzF4tJ4`LhFhp#`A6B`nOz1Զ@P@aR XaK{T# BBIػ&?f^z:N;eo/o%7F!¯*uijg:gHu+%W60 DSK-@$;^&Kݔ*&nc"b߽ L*={K$_ҫKVAU{H$gקתu*-Y>%>%w˧k]Y>+|z1R V^@|ތg!g|WGj3ȧXoEO_y5z Fc!ʉHMb B)NO|U[;`5֕yl>bE~{6;AfwTߟɥ=4G3VE+驸TpdPCj-(k"bc st$1X @aR 8l8.hFR ^^2x @,=8_qPpOopiAQRW`ٖxLm/g W`y+bD)F*,P6Wp {(VJqMe %j"bը຿PdyꀿD}w(3k_lu?G 5GW/5$zGU0߆o '7lZg} x 8.J)_܁WHBs?܊ >o7ܟH|sjjyg'bfPca^ ޟ<yg6gJFh/,/) 6/S(D) lPTj _8'Z`{X!U+ҕgʳ+Еgʳ+ҕgʳ+֕G\y&pM":y<= u{BwyȧXssz lub7 65ǫsrRcPηVCc|UzI`ǰ{"$(piy8Qy.xʖ 5҅cOBU6EFjh0 @$5/f(ѽB|撘'3%ܫTB7g]Kv/wR>g8^B>"s\eH}-)րR|<2=TLCd<^>QRPLɧX/OLHRЎinoKZ9YI7@t/xgRCVs2n)ֻ./(%td_,եj3i×} }k l54՗Rn":#/utl [g=SyO _~ (_~ (-廷,29 {J" >kHmQ>vo)ֿ :LNȩ<߯S]NNԬvhC?3M/ZpJ1eB[/& ǵmoS~ |_L~2~u7;K_M&;{EEnrEj~+J>_̺yie]y꼱^%OV[d/PkhdQrZ:/ތ(v* s{(=EPdIR4ˆ"L2>EgL|Τ9^QgOa8;( ~v7J8<{cاT#~w7M>*:)G}\!q-U-6G8ޝ1\#Cj k]yx.J.Ckǔ6%RJfm1g&on.VF)chM><<ۖDэlGwx33,|~5͹b @!U7u4e ǔaW{ߤ*|ܳKH-$iYIrOUo/K޲#0~+0}ܳT*.ӓRg+Qg+ p_.Dž9g ~% JoIS҈ ^%C*᷏g~g~g~g~ohh@я@ӏ@{~~###>?%5aHΒL{F@ &SA4vRk5l5@ݓJ ,?n…o<  ^%7xk4u[: =ΟOu:Ο?SO?x?~?x?~?=yNg'O3t:yN'l n-B?2B:W-],{'}quI:;EO+ =8saw{ޟ^(w2< /zrcgQ5u幜mmW!+vԥ޽d3\+gM>*=K4NɎ䖗JOK(@u<`PjEb+ց?!UV3:*(Qہ1.X5@k>6[ vH=~~;X:s鍶,gzq7K>շw!+W/Iۻ%&b};؏/ OoOep.ZB*w)δCLH2/T΄\-|46iOﹿeSֹsܟ:kߟs8m?AA[ٿ.UgƗ4A~f#FNRûkMwww?[?K?-Y?[?ûu郫rۈ1a#a]՝KU,[McJf@,[7V?Oe WwY:| ʷ HT#>Z'rÏyc4K?uppal/(t1JTvCN(*'k6Iku먧p_LTY[g׳&vd9ͥP4/fRKfi^n.TIRtLc-[Ijf$DEEkE.pf6S/ײ5L β 8`RLYAzw [B-4Gph| RLr8ͬg;Oo=hXo9%؃b 7HG]$YB;2*Y0pT#:r|U%Y.p,$Bt Sb(Z YJ=Sہy$ED0.J2CX48D5XX (I !U Gwg%x*''F>]W3t9 Q YW"b}ͤY9F+mgn1ST!=N:o${kΛ}>STi$>%D-k%nS&YA´z&5BuO r*Bhމ%n uD-$Q|xvYv2 rQ(f[X?b&=2m=@eORs(D1>* >î&VO]44?(ש&'3:EA5:[*y$$)e1X/*TɲĈ;yWl54,JT2T\V_S:>tgVtlԕұY[8STdF/g1ιQ+(QTh#v"p'RQ&~N]Ǣ3VWd*Hr ͥ*]e M],%uTC7GXT~u@#?669zzϜ 6|%gw**sP#ݽ?XeG?&byz{.husX_{X[dao[%zi{qOk^O N۶xGX /PJu*d]>BQہx/"4E1BĹXKtXCT0P|?"L`*2eX>\§qMTjbDSJ!UgR>eIyyp3%ҙv:vl=g6\}-ˎ!3\I/}3%\@$i6/}C։:%%X/-r)TVpSTaP:SIfκCdn"uD/ȡPX*n-ѡVw | v[/=)jz}>V=7C [ 5/ ~T#yc'DJ'J- tR'F~ ͅwqeLR-l29 \TcҴGj˕A8|{ِڲDԖmF杕A~e1>zV,,9OߖZ-Y)Q :<)~aoYLg3{]t8&Y-3-Bb}LRt5ϴ  NOo$t*|z#1Y*NH$+kԾZO+|3W [ #zjnaǽ Qd-K!’dJ5B{]\nCﱩefB'+[>l1cM\j pzcZbY{:r-λ}* td)ClfGi6pH,44?}C͟>\7{<5'Y"V~:8W]|2v)qr*O^uk Quc୾v_'JQū Z֯!(>ɧop!^gp:h4d=$denнNu& ޮ25]uꥁo b^s>rwvu];T y6ߗ!p{n$×zs-3Z~o*Bo3_? ~$nBUA(:_3G7_$nfG>zjg+'/ӭ B/uqWzk5Cjt)X/EߖA;;@\{vrz _21!vh$>t*|fb|,Rו7}'b /ydHL;}@>z_zuoznqOuzu d%W .S y[qkV-9% x;4X~i]hxnjr5e9PkLdIl?) {Id0 HI` ^H+3$Y9z+'H6&)ZBjΑ9}.ys6#fD1ܣSMsvs B2@jΚhBȦ.VBV' +v!zuCpK?9B%Gs9R]tD6uG[d?O-]6өKov:5ynOqr֥kɝ7fK\tS ځNkǽwʸd.өk\2p_95tE:`;ר-E^]o ]kZx 2,:tn=qF2ܚZZsk]sk^sk[[뛹?t?˾tte_O]]}pQeGK: rpb;\+1tu>߸n\a\jU|ߏ ^ȓ OΌe:U#@OgKG}ى1?%x/ܢ-3z>o)=.שqTES(| b0YD,ǷHIqGO'ffu*y>޼KgڻK^o]Euk# _z=C6VSUϱþC+oNQe|Z|qiV]ڶ+N~÷3> zN^ Y?j: z<ȫMOBX_Mʾt[l E?.)꒣0qA|r&[T⠈`*rFoaN9(ң ^L4հ[F-!{Z0bO_:_z$zI%zIԏKԏ]/I^KbL_~rOA=[/$oюpRoO@yk(Zuϓf3Nw3O3xbq `(wP0gN =zCsRz t(h׻1Y2ߌ B4@+'F7րǿAY"vruZQ\qYRz4MR ze+g{≅͑HR؅lY q>v%v,cq ?~7}rϩvͩqͩ155ǜjל:{N SS95?"Rd~(/EPd^tUdYȼt'K\1[INQgu^ZfǓ%_ж,=V[tWc{dzqBR}7@\ [k 7|q$|z\eכ|/V֖0S_"T7'X 9aRA~ak"NGJ5)Voa|L;!f2@~gq)DId(!j Q]w'b?olAta]5^xJgI/[Fs~w]_jK陙gX";X,שNx<3O>Uow\ͽiȦ.[$vn\!iRuaNo[W̬:Al7`@_X豋4=p ʱ)ވ| F ?@=uJ5B@b 8'sp #ڭTH C"V FQvǕ<\Ѷ 16r=);L| $YAWL=eh!U_c `o.) o? 7f:ϠðSa0tWɧ/2o%Tg!P %xu)[8og Ŷ5V5zv{0fm?-_u5V>0u$~GLX"{*"ɧX_P[_h Ge9uM?h%|uCџ;*i-=ѥ˃6@p*|$dKi\:+Q?^ ۻ.Kq㰿{D^J45+][h/Wb+Q%S䕐fkE{:+!(@u_ )h6YO |[?Q0dD8g;8 udgN(W(]d.ؿPlۡ?֡ :<-(G0KOTs>OH#e,i;kaÇo\H?`G{u;W$T/ 6:oRU+~$ގ?SZ1n㌐p.;|HՖ"6^3~O |1q,}jWfk=>g$ZX?(o 4ɃFH `4y.X.hH~^$|*2r) E^Q>_w.ts)صO'OɳNw.t<үoW_oW_'ZfxNRo)tL<9ÿ2ڋ}Z+cg ,D0Q)tyPL#u噺l]y{L]y{噺 ]y{ٺL]yʳ+ҕgʳ+Еgʳ+ҕgʳ+֕gʳ>W/yÌzrGǃaB!5.k<>GXT-c\ 8!~n3,|zYrç$bo-_lTM}+t^&h| ͤV]**j%`%V!)c| G*4ЀO |rE/WqU)ګeB9ha;&KR=}bPEDiâA=2[+2oI%|O J54o^a3~E/y0=e3m2@p)[fHFM 2|Gwh/lu%Çy,.X~2R7=Yzol?g ~Gky' 3Ϙ/q=C*៷Eih̥6@~gkEIH8=(f9fv4x;N)V %+Q+FOMDWOdcEv%  &R"ͼTKT"s{3Dv I>{ip>)tε"}t:h0Tn3x/hǛT\{?3BV}KաV!㓵Bjw'Z{R:u{$͚y F6k{AI| r\fͮ0ح,^ޯ*>>O-HGN1{hVvT([8E'Dow\×%E*V.Ni[al~&JRc"4,|׋|?mspgWx}eGkE9DrVR-"bTTTvmE EX(u[QNo+ %V,)~ҏ]NfnH&X!nr)\$~?VX~P_xzL7 ISbǞ>ҦSfQ ߰E>z~*V>4N-NՃ{ZהhNX/r-)Voyk8"ՋST!G{Ҹʦ.lBރmilw\o?~RKt)t)Х\]\,d%_َzVTƱT*qҿ"}*r՛o?;@-) '.';'^@:Uc${|N8okw\iDŽ6]_V]_6]_]_s}=C%[Y9}~Plj#T7!7K$YfBքp3Y|lj#ҠsXW156`@ E6iR-Ȉb+ۨNXEy-q"*}B#=$yEod~SHd(M  )lzd| wQ >m+IK' "!x0OjooᖛRr1'Qm T ȟ$IvɔCQ;KdS>ɉ[A^+{BAnn;pT\V 4k5,s}q`@dln-.Ug6op#&I#3|U#cX픨ʌ-wCA9Y6BDvBEHN("ӊv*R.Ex+U[ERorPPqW)CS~'ӓ?EO,QWA=R+r0Ol]dH{tynQ@dOˍ1ZTQ 5a4( +|wS`VSœH9Xh 4))0)p'1a ܧ#a;5~ R}ggi\#T_M>{kpeݖjQs͎ B`樒Dv=0?l[!ꐚm>[8lo)VodRum)U3Nf)W.{T+9I'+k&5+(AD`&Iwn:pIQ)5;t&&tLj=jNjǵ}ʘzxkEQe(ĩ"_sQA+vvS:"ۂM9"@~ekER_\*dCАڮax+twi!UWR820d) !PFR{g<]Cj, bONw*(:(\;s; P Q oEH-ia4b4EV"Q#:RӃ>l;zŏ> w/)ТZlja\Dzld^htle߇{KqT D򁸏 f\η0@+N S7{<{<{<7xxx|~-'=>‰7n ֊Gť @E&|,•R @3tTo/ٲ+Nknmؕ| bm>HFs Pӯr76S{a4>:J>vv.|\wl!5L 4x!/:M_XqjCα@(|z_]n9Hi<]&b75o`95;N1 luİVL)BjQiI 4M;s7?}>Gl1NQɧX/4Sr%rJT`ANk7l>ߡm( rWho)I V$ó-85B@+ Ch`bE5譹 j| Yp9ٻCj=6OglFRbmjQSgl1gؖ; zru} FbE{'9y\lhVN_QXź-X^c&],RQ~ɧXY/yP̥a#4\Q֊Q-]O幀6RQD>z_3\ER #cu\K!إ}hfkI;Hd Ԫ#x+4DB? }D57 B.U/+T#;][$wݚWoERH%rY -b6Y8"V^ˊ -J-#}X/KB6{?-eGznud7R>fd&)V_o g_~}ï ?+~U; K86Rv) nqc#$v^Ӕ&)~ Cґʥ\ [qۊ6_v2b?,[&s j~ eS]՜^O:ɹ[Q8~!(Qہ K UdPa9> T@M;H|(@R)E͢*vZ7V$]iTyC )BSHU:\ EY W0|D+NfwwEA|M4)e8IÝ_L | %h`9K]tOەBvS?!=B{>~噓vm?)¨`{Cd1P{45 ]_V&O y$LqKMqsMq)M5ŵ6ŵ8Ľ2ŭ0.7)ne}rˇYeVlfvBK}.]>̊o]R/\&Ҷ/].2֥K}鲿ek}>M\_7[Ly_\(YBT#Dy+ȧX/O>qGgn +Qs9-w"3s(|M,L)jKHzw/z"JT1j_z@=gH 7^{_~77嚯{P- |3(fȧXo=y7S'SsKg~`r#[ rSHչߞ-2ߖxudw&U~zQuAMh !Zy,RW"+Jgӓ<=Vtٲ^y<9ʓʓY_"Ww˫۳=^ݞ~u9˫ǫ{!L?_\ةA@ l?(T ?^ꤠyN+F#^^%lҐKl׎ڕby}9ߓR D׍n;7z ~|e v]j)j·V"nN[b{bи@(q| ōH=U)?}G*z?&lo>qLNu"2 R]qT#x+b5y,MO*gA{tx3k,y)5yLe9y _ֻ ֊A).϶ W#5kb?QT,!+.ϾgKnߴ NbT·k*jJ5BsPȧXoRzΆ5X. ] }GAZz#D3[B¿.ƀb/YJp.2pviE.'.٥ԏ˯GO2Syyډ(Q:# Oab3. w.*{]nIa;c'sMY@t==}9lw`z+b >][dmIS$dc}`j0r @UujNh[44t/o9rP /!XQ]L9jjv>_NSaD{5 \TSTdq5"[ty*'ּLQzLVx`<\(1'Kv1lTke VotI>  nQpIiy^p`M-QlhV raIqO`i?lk}?|k]ɧXa٦VsdOz]7_`1]*{Hw R 魀TS$X?MXyu, $蝭?ߚAs /o%b֐JY jqÇ$΃m7qрO z|}}?|>1/1/>OG|>Q$ 06z 1й X| 5[gr -VQE!TQβ&InbGgDĨ\W|mwo^]-f0T[aWd㤖[VĪ0Tzr?/Jg |& )OW$!^8EFF^.X5،-#4~qUshtzX:=K`l>``x-\y :S` >[` @O5qJWS`G{=WQۏ鸜 \#AV~!d|j,NΓP\g>3uK6ț lVY}OPQ9XM~RުVO8ITS )sɯ: hhf+~ނx)?^nY'beARVۓ”h>]t& *_9ݔ i{'J[=+)W+K}mETϑGg[Қq 9 :ϐx/_C5=Red%=JqJT`;yIϓI-YdWMM:^/]Vs~?°[w#Do=09[BR@hvR]_[fBp-E&lYN^D횥S$`˺b_ 넟'㚿 ~+|FT¯/w4|ke{HOϺOЋgfkE=4=ofGkI{~UU޽QqG=QoE1~G=Qw)֏Sޓ'(pv8y{TS.Y:T/8XbJ6@ =X"A}BjÁ#q8S,躝x .j?Ʃ'o'STF{=uXTJߪ`t1moҞwj!zxkEt?0TQ≵T#DtRs+xsU2k[O -5lLM9!:O)muGFS4cS T o7%*muJ;st($~sݑ& tIF܎'yGӾ;4t0Cj9h1C;n;Z,h}ݝ -1ͳl֡6t'XȦ.!^oQuü+ DoRYzdۡFFhaO= [1b^ox+VoŸފv㭘[1b|Vzsls)Њ.= +xJ{“ lb;p/ea\a\eqzXZ6-wK+=K_ lo!mLɶ _/DOu*|ɰ5[rJvene=:OXkYݜvh᭰:צlțMQhw\+uetY%;]75={/}m犪 uy۩ ^RHIYvee76Tx/ܢKХ\KKt).Cr/]ʇ.ҥ\otgşyR;tyFO-To?\ɦ.38mvG:ݵ{l3 PzJO_X7;E]Z Z dSsGmulwcȦ.*QaXb-8Dlmpj8 #D=`Y¤^%*b C,|?~KGoSo?Ÿ O?| * 0|,i"lŠf*"yG)Ph5L +LyˎS|FHV$HksHfOf5[S7|j'),pyGkC-C{q"gL5+FPgОE>z"rQ&NW姲3 xAÓ\~C-X Q0$XKlmT*qv%{A  WHUMo >Sc*-H.-Nwe_hO^🫌t'b  yG%1Y%YR! 4tWH%|K*j:/QJ8R 7_Ҕq-nmI| /}R= {jy)[[SW産$/( Ów9{\jXJ\[E01.nc|ImNQ9ԸUӅ4Ɋ.]qu9Db٢^^0~ڛV5,p=X;1l* kʸnS5`)Cc|U7oUw¯ ~e/k{F쏮$)R9-|FC~%5HP |o]5׮1 IB:V~[`m$䕴ݝ}yȘfy{MH+@/yм,d:<@(|%{ǺR 6;hZTa^䆈E>z[Go7G9eץUB1԰eWdJdCT`nZS7 +ŕFVjjKU4+ Գ4# =y )>]@lovކdOxCt0Bt@+0NC*uB9k c Zx)c: (dE>/baqhKS[oM] P/=lo%nnxF \J8e[N lod"՟4wKCVQ^/] ^@X3#6OdkC2IH b{voBj 6,)VooooZE9_kXֵk-hZt-گ31Z?֢]^:rPUQ::Ԣ:8su..:Xb8_Z3$VN UkubI8Rc&Ȕ$`Ν'!=Fl ֆ.!8M g;~?!ͳR6@ɒܛײ+^䧞7>/(Iz1ٜZΑuJ^*;EK]YaVsאn 7U1) {vPokr!5Wޤ渜J( XM>*י^r.;O̊]7d6STaF{凳Jbm~>;Jbb9-y<)n|/vmSN.N PTT(.MEc;u2T}鲷7}s8vh7ۼVRMser=ir,[qy>C <~jF.@K ooQ(۵8Oms6JvǕ<&#l꒱}!Bq.|[&vא1U :;UܔQaD3wI\N |4~x)@T}g7Mh?Ga. 6y ˡ2oHݚOm9:RgQ vt6Wc]3nr , $qjGc΅^E{5%5ޫyf\3c鴤j'M!xC>11O umTLn{|LKzcXQc}:KayTmW4"!{TP]uS(t2CgO\p-.aC_zVH?\HH^ <͝<]2q2`'ƽ3>Zn>aۼګI9O+1y6*#E ܲ-)Tksu9{Y`7, 0fq܀uۼ={]nX؛qr9[E6YhC +D_5fDvEd@c:/FZsD{ S< Vo5~f,yл.g6CA,38񹓱CkQwY%fβZRa&&b.T0(dH4.1\nLTSbA{_} r rӁ\t @:9Wf?nږ7fZVuI ~kZ[Xh XY$g%}]МۘS'Ӵ::յpӸݪ33U` bW CKvu^4`vSdjb %8 +r5<\b\Pmo760/ۆK6La~e9~/9[t+KQ\4r#FgJAk6[-inPnv\^Ǧ YY -bM 9צ mf(צogEU\r*::\@Ѡ=|@|αȒ*z~ba܌=cjb*WjHNz&<XT憀rCf72ītA)ϳ'!{[ɩ?cm`-gĜrSV.d[㎟e]g\17#ezjۆo(]+U1s@Yˆij]1nC~ې!Ɔ|ِ6_ڐ! KNMQ5LH )ܩ4|]p,B}{JX sal.płhx _' \2F ~{&=T g|#y.X3UKiUm)jvU\H5-ӪyXfIr!5S72ëc6nV?;ONȱ%|dw׺d1޲In៕ls;[8nɍ/m$eZ>t9֪F7.4u~:?Y?Kh̊Y7d˖+`nT/.`ţb|[l9K+?Yx"YI BqݰX!B a7^eGOuILrr߮786v9ΦR*wtZ5NM4:|dđ8T=.BAB$חiu'sՓ+n|UK2?i\PY5\؞r(ք>\= 5Qu#i#{YFί-#ȞEFv2{,OK1RyJ&agr.OKMfRj\b8=ڦ!k)F ohZ;][QfŲb$|2gbw q֡gs="K&뒏K-j7RI>BэK)Um*Lj'WU-yLbq/t26m"=J&,(V[Ȕ"9=tR[7,q5h˴C:lbQ#d/be}c-e}زeƖuٲ5up=2u&㶩k..ַppp|z~ wu~ {]u]8u]_~ pC~,BY7 Ĕ"1Pgn f_Z4,ΚYtob 7ÙTlp`gvngҍVe(p ~1.-̜U_}&loRf9C+}?1YvhnuhNS7?.{pU% JAכZ~G?yf5>LM~3 ,z~YGq}Ϣ;,΢9gќuIgі߳:ά̟(N◜=lׂڔvDNYْYI3BkNX[q$G-m 5ԧէ>>>)g)o)OyOyOy~gyo%/زU8zm%v֭DYRV[u+{+n%f^=){us/oFSyb\ImIOJD)ړjR U׏WS)GS))jjz5E){T4n=*tMGn[{ `Ϧ}Tug]u)C0MO˒%eqKWu]y_|V[oV[1oV[ѯoV[1o[>ȺȾ"""ckk!!!"@l0{#0wmuBc)V[Ҵ@ @콝oHbOp>lϲ]~}pu/2ܷ9ϊn ~F7bW,o >{Vpy2V %r5V(٪jlUV%g+fjlŌ%>[ejj%VV8n g>fUI:[hVKgيlV+}V˖rrҟV\[JY|rWl)_ڂ4bΖNe6= ۑ{`\bZVsSfVu)V?_M1MѮWSWS)GS̫)gR.*4IE>r[z;2Rt-\,},eV[^2v'}|˵8)|,NʸZ.d]d}6׺l\}}r6,Ͳ.[.f_\u6mٯ u 2'OZN8\=BSv&K,Ѫ)W3#r9z?]?L8Q/|v{)7a#Г>SW+N kb-ewv[!{[68bf Z{6X!iWhҖ̈`.XmgcTlr[ר:*F~\tTpɾ']|,Nrl'cqRIΗ-.[bqd0 ['^'Kd*'N2P( q1uIƮrI>8V3/wq됹:$09-bCWAˡDXc1.X/Ԯ4>zRzRzRIII'''/zGdŖsxEV;YQ?"+DV@6 Yga_ V\{Z 6QnK ~ }3(v_eS;r1:eK7\p-,sytӲ1Hv^MO<^ZKljbe͙9x3gRL~4QnB~ 4Cun2*iom[E",sά;HгatT*F,~OZ% Y̽]N |$a$FqxSn^#|# ~K(39pUYX"0*03L$܎~ҸOi5#ک˻$CKUꕤ|m %hS[%mM[b(O)/-Ö-7˖aKƖK–RÁRp$VÁwV:ɇcׇT&cl*?~ǩMPp(rh[G(-EY}?6E)ڟ4Yi;LLa}5q;ĊE7IV [vr^YgZz"='Ĕ%բjYy5nMr{ \ՎZ֦{R՞Ե'wO*ړIU{RўT=kOړgOjk~ͯ=O0_t~_k;[ol [olnKa_m NMa(jn:=7LEw S'b)v[{膩," f6D&zCdCd~tyuuuѭխխGWWj]j^j~ѭ[Ԕb1S)I=0MDY}Zkdf3 V>FźFžFcTkTkTQQQ=*tT:*KGQ^&KG9C~ns/xYr敮uEc?#r d]Cs%8h]GϡU?n+Ӕ=.&^H](1yunq1 Ga:t-IjYdba?lLqYq{^vF_Nu~x6p%^7Y u.^V?l)InרiXvrprhͺD.s Vo~' ?G?Y(w>:?, 53/kj:! e_˴Jt2ZZX_]dIue,kew\ռknY}KbN[6J }7mi隷07]{=d=)=X3EY-F.2<'$$؁e7nĹw] @C9z_Q?,Tv*/P | \gZsnZMnyy5H|M!Z%-oY۔JٞEJLp~G:-Vd^GY0.A%+E)8~|D ]1ۙk,#-8DfXRw ܀S\ʡbYFz$tng hqp2eQ- d5-9h('XoÉo#mQ]uS~T :y˛SmI`x96~E+'h]Yk38"E|ζs7߲}%w"sZBZNTt;I!NgklԳLN~YtJ s֝λG7e^Ѵg-CYP-VzEenX[%8?_t˖jQUSŴ=U/= a18ѣtg]ZšIfNKhU7|V,EAP '? > Ȕ7 Ŷ*A;bZؠr T`ʖ$6hWlP8\E++v(tf Y.fN'Zbؒ^Z,WWBN \?mۂv֛Y[j7+sCŵj̋aLd]BN |!sBͅ +b8eˈaZeZhm3M<2VVM&ѓAes=wD93(O7B3Ad@ZLnM}; ?{И`g-vVXm@ï s =6J-e}f}rU{AKK U(7a@Ql@[^`-!@[l9E sQueeJSdnI@JK'W B̈ڷ%m 9vP5A2z0 XYv%Bg˗7$PX> ?k/iUͪbF3柅qa.ݹQbOQ^%%sKX#sn)gU e )uGd<JɁHzPs3v &^M`"Z)Te V_|j%5Յ=p#am(m Wmݗ-$ud$;Iv_d5kIk$dOΫ[= *Zt瓬q}UհvnѦV=RghI?q'"uI?q3>qLd'kyW'dkКqbSոg:݊c1N|kVT&ָZ5#wJwDr32KQ72YR];D <S5լ^bںv}fjfkY8s!'"'cPu ܂SC~jhuJ Y.}|rO@sF\t >Wrv^Ϥ{?o1eτYwD5z[x2:.eѝdFkVEI=~ۓI=~ۓeO|maؑ3 %_[c,.YgȁgdVזYJ)79zOUvy;9\(iZG&} ro Ϭ>`OqDET\).#0舙!יG1%e=!'7AcrU4CVa[sԎ}pչŷ]?er-sҮֿ99FB~svV->W)np. ܂C/ЪjS|whOe⶙zZ$'3!"kyVIxo+ -W 9z?ʳ?з);ۮl"%&8# tbvM8v]6:{\َ˫v[erX^-]6 c:G4 z3ܤka;L21ZQఏ+QeEkE1(Vʯb$YQ DSVʊeYQ^x_fCgmjWM?nrԵM˝A Yxʿ {)1˂RdLdlfeRg6~spMq6E3_8[ $ݢVYIټ#2<'k}Z>Yv+Fs!s;qWLG=jrOks#m+nU8n:{gEqy88.qtsGGG>3=W o4Ϗis9| _G+'ɑ g_#Ay?wgd&̭~kE˴}Eɵ~nrU\N?'K,WvB>a[˒6/%%»NV8LEe+wFW{Y}~;~;9Hp 엮MQAw %.BD[mMFL% `Er=kOjT'5Iݓ={RמԴ'Ϟ{zO|(Urj;M-\Xq.p 7f册' )xLcƵԚ4ԦU'zR7~>zqU?΍q9Cg.H(e$򴱤F2iЃ+,%JLܐ|⢬[pSWx3 pp;s;0{V7B/2eUh-,v=Z ~?[sR? xvPfc(_ȝ6mGQ>qzhu@Q8QXf8[d-L=G*&+[}0q3OL~s5 u \* ۙ6gSV 74&'X/'ޅdClY܄6ɮn-V<>]fnPnH>NUmiZ2vZyЊQCLD&8ڟݹg㌨UiVǘ5xYQnB ~G:Eٮ[8?W%trCFtځfnYsf\ wtbq;CئՍ8qɳ\2+X`\IU?At}+2p"fēQF,b-## +XB.Y2O ֦z`y 6a-"5[NrMڍUTD@$9#?ao9?r,v(x =K[?_ltb9\& oSC:RXd#MYZRY-V9*8F^љeiвrF;BEjoVu&.v]cwύ|ۖi39r[fnJ- &t2[gEزOoS~vu3GJ-I~cp(Xöo'_#U,x2]X B΃@~eV.tϰ4K9*Y>IKI6º. )(mw?M7][0):e ݠ3HEt-5 ð[ ;c949RO R>k&'X/-QH$y^mZs\5GN#`eM3/}~Ўzb6X JQ bxG6hn5#&M㻇V'~5>s57ЭyΤdm,et>fTd|2Y}"ۖd06l-9&SDOYGsJF̈ɐA-%D:S>D]],5-WH@[7um~KIP21שׂ]$d;f|bI?E>5?۹Ɂ`&g`l```$>>#g_~~  ? |A */KNⶎ n5P:rߣCඕV m[չ6B_qٖ5=Mh%a.I(a.rU#-OÈĬt*= )b>f!Bv;tg)[g -,{t2gZA͹@3,I EBӁP!@(:{ YBy@(>y3t"_y2{0V [rտ:P{;bU*ٲ3A BO󪎐}ƶ/vt#cof \ْγ+$/}ש*D_Aylr fnkZA}tG}aZy/;OTK QZ%s@ՏO, P; 8~rU7:~Lc>i:bp~XL1z~ZA|&Ə8yV~`5C8\f7CL%I^4޾Ԩǣe3[fOyZA(|τ5CNΓrFJ蜿LKpz$x񉔲[l >i{첋aq. FBi\sѾHMLxA <)<痊WNic{Eig5,鲤Jd/?e[smGC<ĕb^Zu ˴d -(^YYx2YO4MVp(U t({o܆|m%UT36 '.*ۖ3Z/[Π5_=VdkՖ3׷Qj#זFv2Zxw.[/E-[wni#n%gt9x|9(%Q=X;ŸJrFhLVOpLr$+QbLЧ4QSV̈͊JOap)tnU/[/KI`]t}7SujK.,!YYL91=M[t-TpT[jj6ǚmuf9iFWm64.K?4USv)}x NGXXp΁ 'w}Ƭp͹W辭E^]oNO>١Uw0C&Q: ?-M_ͿZKlLCN^wOIlл){@L$.1@qA鲤rQK4'tC\&dSIHvK 6HhS ;ȫ!F P*;og&KCN Q 8W,Jfiuq-~׵p۹gvhu ~͢ ʩK_$t8WET7A\&aKr.d*ء{PaS G󠙯GoM >AIj;4\+|20~ uf!a6 g M5vD(Dx#ӆg&1BN^ε[ZȁuM#O B73iFJ7篾OojO.ˬʹG -B- ao 9z?~xb鐣rrJ%^}˦.҂O\ÂГl)QنZ@e񉕲^IuNq&^Snˉ$+2'9 !Q;xKiu#6f/'bWӫ ?Vst+x6x( fP?P"ߩn1 E\ ­ `i$j݌aFƌ3eF0Ҍ]_3i≊=eO&4 c֯oC}^n-`'gks,9N܂aW2j6 ݆jgrpsqUZd2̈́a!4{2m('r\$h%M{=.AN+(mg岤$?Dn ݠװItleE^2O|Md4ebZA8̃3Mgd wkwE>>/n!yST%;@<q3SYuc#?:,nf!mN ߸U8u*W脑ZJrCNo=3a4r4JGEMj14FɡĴ[h0oGSm$*?pZQ,=(SW掯ϺȒl[0KtKA>?mu ifmIW2%ۆ,(V[~~l_ФA-'i{,C~Xv_qQVqMѮ^U%v m_4_ mUB9m^3ox\j೚QnB @8wuVI_)^lEVq-(1KL)yՍlɖe]8g+FzНml',Eزz^_7b;IVl\{R,Nk]Cu8K7~\-w&UաnZ_g֩'h9rh՞T5i38A6v'=twړJyS.5ӎWVt_dS[؇=a۴3c2l !rĦdм]5ĸ+~}j~ۧS>5OP?| !;έayriuH_%W\/vCNnSw~Gy CĊcr3kq>e2p\/[CK]C]XOQEw"6U; $r%uy\8IB7w`}$2o?YK?h7I!g'3\3W$+r;h"sh'̆.J؝F?w^S,'}̘US?hOC|wj_vwyu]-ABf>jIVuPorULl21{ZF08UBMtn}?A!'R*˖WOZI۞'wOZI۞'ϞwjɄfKgi;e0WmgUN&o 3%ːD!?!?Qjg2d"/c%8H)Ŗo&'o{<|maՍ17Fd[wJLfk2^,V`l`ty0c^}y0c_yy0ۃؗcTeb ҕmsǢxi]b˹ C]]X+Z[d37(33檖6 U9C+(QN6 O.PN,P_'d,u0\Y10Lm@`.jyv"e}bJhh+0nv7i#&V=r\BN Zq,+VeŽkōكKe=kōz\q$+n\;%G.YV% "`PP.0#|OCVf:!yECEL9x Z%I.TK\Br v :P.]@(@ЎN@h@(@(_ SO$ڳi ؕEGȁhk?;Џ\h]IhS؏k ?K;|OcRj&.K*iU痺#[lj҃\&/[8~W߬š:g:FȁC?f\}+Rj׫8yf%hSfifsQn$3\ڔGT<峓+"o[I˩Y@9<b|`5YR54RݔM-N1e]emx7eT''|D/J>{&bj>:',׺ŹA)X/{hò~@ e ֦3:7[|{Ԛ, U, ^2zZS3ҳuFZB6Y-T`X8k9dڱ~O%&8[&KJK^v#yj8mI)@OKbے&;>]fkӴ5pCs3TYZ72v^] v&H] fȁXzu(g1^X^n̠3jhoR'6hE+kgZرYRI&.f~]x'Wzsnf//3Zʖ9MȂĩfYudllFfΚ#Q\k.*wգV5m;XK#5ø֣XoֻGarص k=jI<_Qv(%ޡw/cD{x3C#D{w'tCИPUZjW V{`!M7Hhf6=(YqH(|2CnX~GJuI)jAWCN^OeO/FxO])7e/Qn>q˖>Vz{ 8dj3ifbq3i|u1xi[5bqm $oh5-#k]٬02s79*N06V1%êI8ܓ@4M`9O~+&ͯPBk}rU#6S 3LT=_u !;XiuQ.Wpuӹt[C?7c9񠭹{prn [ޱ~56Pq:ſU'.M/NcBO2#ӴYf48?Dq 9zj'Sö7Jˉg(2D}7׺}973v y ѮO}>/1+#ƈ3o BN 0kB' }͗!\ ktݵP!'X/?o}oԷ?q~_2>3Nb2M,&( 4CU>og17K[K7K[KO{yD1v7ȅǓ'٫Ɂ-Y=Kc \`kp`ݫ-6 ~n0MS~2SZt0seĠV8lhɽ *cjXI˴u i@t ~"Z PKQH8\C@XȷZA8\vB UKbhg^r_B/+YfxSu4N[h8$,YҳЍ-ɁͽH(7sgG-V}m^r?e ;I'rbsc~$Ȩ^v[ Vus|q-_W۹_XՍ@vo&shm@O `Zd--Yr\q3R#X'rhZd4;mUoW<]8^RAJV?sLߞ>Vh3:;l~NN#PHo&ΐѯҌT+($/!'X/w$ĩE"vѴB1 C@q<#z 7| :(g ٜ;X)Qe۴ g Mo/A4( rN oC/A;tcmZw(\XI(|r)L|N);$=eI]x71Q㶖Jg"Ŗn˦6n˦6ЦM(_oYO/9*S)C9ze&r31U?hiGf!gh%r^B)^Rxg`Q8Lh : m*!bhT.\mEABh('Xo,:t]:,u:,:t:,t:YtuAJ?D=:BO?(]UoI@|mKy-׵KjYrl%v[..{ItI=uI-jA˥'Lq4Q~2r3F Zvb)L_A۹] &nj6Q/Cl)n6Qvڱ|r YXC~(x AR 7a:wŇiuDžX=G q*MB1Y.KJ*oìm7^'r;-em7^u3NHnO\\I ˹gdr GVrŷ͖ X/VW+G+ VV [[a8I8nZH (tEVdYSM=,$_ t@Hic_Ӿ L+7.]ZV Z Ys!n WM?%%e-<YQnH ~dUR ѭMѵ1rxlֲ;;Y(ȁ; T#*HbŏG WSPWS ,f⇴ ZifYYE(;DVqM5DAmEhb.17Qo~ņICz*ma!#GyiI%o`{Ә)5y2yj[ZI(|/5BN[5߾ uge07ooU΍/ChT^JL >ըk?mFAذdM u`\`\Vvrӻ7`f]WRʒ Zёvݕwlj{"^,}!Vmn}Y%JYktǴubj49;mOGh}hFxǼҍ\6c~S [Cd{xۛ#՜;k{MndUpZ_FKѨn4B_Ö-7˖aKƖKҖ]f8 ,a ܎@$M^fHs~i̐+/n>*mAx OjvlFN^nM2/ @Fhu p>~Fd,$%B7aOdIk!E⋿n|Ct-) cBs=0Mn:|jUl.W؂aą5zu4nЪ:Kj2WݝiU|(L8]+|rՓY_f1kV׬?f~ͪUǬ:Y_jbVl9!w( ~I(o?ggl^4M y֐#fN>=S2sk`'_O˕"y8eLɻ;q g^ZbRPfFhsRRwV_~RRRۗ՗ԗ_ԝ՗՗?}/\'ׅ 9C[߯MBw^` \&OrU˒w2N޻e˖ʂ]9MhGc1dWfĭ1F%7B7j%.\f 9(iO!_cd>K^fTBjjTj7j3 G%iGi!_j[;?ߪ~2%?_~7 9nRCHU k{dR~lg-T"3wV sT_$ _蛃o2C/ A,IN w`/g:g*3jv[TK|*)e>l2OKV;dOރ>XtZ'3(ĈstxKv! >zßVUcSCG N:j٤*aU5Kb^ϐ*?i&skS_]:CT[m4+δvۉ[)/O;LLa$0''IeS>e SSOO=| ~ N| 2z lV|Ttr % '>FTCtF-ށ ;TR3 >*AؾCT|AAAaaa_g|~^!D~߭w=)wgG/_?>jl?iVy' ?۞_ CxEm.gkf+*+/S|6o*_Dmnww*hX'X_raJ!y|=,9ǔ$瘒sLIzYr|?|cVsJ_U^b* ]!?QʫC` U6|YEcEje׸KME\k̅.uk7otG X*يF=0͊!WM['3sD82Kfz3}TO/}|cd8S+Hz.6]$[zŐN@WqK_N¹锃a8~X봲Ӊ\3e b=̼x^!/RG_[?Z$y"Dyh%>(qtZ!UY*;vf/Ro?(T|R-Zb]]"URDe Mg 3k=0Ĉ,9x,& Zj{+ߧX=c3 mwaEOdZmV#MjgV;OrUYFŤ}Mo X6a9Rc'i?6+,0 DLKzz2j^#&:؇j*豏{Foڋe7z;t/E"Q|U_D~3v3O i5P}Z$' ŎEdpbW3nUN*fb{1-n e{_Laz|75f&&g` e^|n]84U!4 "V3gdٲoLMR,Mw'(@y  9 ˁɑ5PZ+ KxCdsVx3<,7QއyI8O6Ax/f;w7rU_nan+K/yR,{dpg ڕ .űHx?N]5Ť(f[WYm%ykf:ouۀU5 "!7YX?ʘC3jSf^53Vbd >~JpjR~C$??|`'O&6E6XA66_Z̤M|n[] 6aboCGQYۃ*ﴙ|uRX1Oo==\VM$fB\|\C?qͿ c]hjZM=Ĥ*  *D VJS<0QL$NzTDRA(|p1y 5 winkh"/+񠓃7(Hv*G2l:Wqҕ0i僶cq,:GG3҉Ovfz=VE*S[kb77|6S@1)`G;0n4=n8pvM!Z g>S+L)}_}%U^IB鈷ZhnK{?RbG KI1UxV3ԽScjRO7V,Ku)3`] n7YZ8t)˖r[[Ro^\g(oYY>P*O%5:řmf %ED`沥iL/Ax/LƧ#Y  YkZDJfx1YL >tIYXI~kzISx(^&j)>-&xZڢXVBj@| TžZZ#x[u#?{h|@ԒQ1*RA86T-}ßx],*x Y| Ft^t!FOl-?Ǎy -`TG;<ƶ`kL *wQMk$~X|%Ǖ9 k,DZQR6*'q 5p[NJbkg |BGӺo|Oq*uWTQo?(ᓌs&sNOj% \Uҗcu- tcLh7v^t'@HFa?z=_@S-Y N$ɌE#T*;a`6|հ%mTETKhzo5 :+24/Ӳ&,-.YPЛca!5G)'Y&T*j tCe!ZEQSU XEqK\AY /o-tz_'ZVC6QwX+|k,>*#U¯#`gz9àh0081I8G4>W6`=Ru uR VC?f^\T"lwHuYF#<) ^;~~gPw3ϥP(4` .s0+DaD/o ^7'w \ե05{ka+!gϊK2=~:[FuI\*߼hrHU#RMoq2:qUL<蝾Bj[''X/ҭt.,]Tї[ߥ[e֢KKҭtEzףFr_tP2e(~ 4R>'f˜|$٬PJKlV(EU"bBqڬZfUsHׅV7Φg׍=lmld㔭đn]7Φg8?~_"#gwF;JN7o=z{9_I8魅ƘR$Tq YKllѲb =穇kVɰom ; )Yd{_$7L3p WA{M/#ڧae~/Pi5IxGL۳g@ƚ-d_׫ 2ʻ1}uXWQfA R+%pWqK_ο8OƍZM*HߛZ'+2i7 >gD Bz`>uXR%HZ'ݢr[9sW'?Pޅgp^RMS'Ţr+ܱαTWq?}z'\>J2샧x! ]N_=v2 ۉk؝GMy/pCfEe/>?)sl .]$ov"G+4sll/VnKUsVޙzkR~7ef)w&𛯇Z/VoegZ|Un.phÞvYk삷8V^u1| >|!]'٣ ۽Y:qyϻ|eIl}:K {-pQVbp^d֫aRĜWK J*Z%\;-좜IcE>Y/jgL)..K > 5Њk'~%ͧcɺ:4UCjѸ62R$xdYI8ä*|og`2p 8 /NDIpw ؍>I$8,{t{VqĐMGl|U%&D*/* Ǝ!Ma;!U2?`.'XoQaGQka4xx?0jCԘ5è 0*n _(z'R xuԤ* )@Tyk)!U-?I3&HɒU1#[ttog+АOדg8y_<ɳ9wr?W6n1I(|7T)czARP޶Я%*uu n2,ܟѷ&@Hf]]6R:iX9Wȹ' oSR'pi9_?{й_`2Y:6N3Lx+.LRedjR;zT ޑOk b 3=&\L/w$?_/q3K䉲̷۠6 ?ujFUSĢ2&P IS§"rLzLQQ8 g,omhT82y!yzB <5*nσONl>yoeJvK3ܢs9;90`vcO5)7iٝ!;Ԟӧ}Tͧjt ~3Cb >*Q\/܏=1 !C4M,|K5,9_/Z u\C?^Js\.jYrlF;mo1Ӥ*f*l-1X>\Ld8;,qNhåp[5RqԙSv;[W:iR>O!)I >*N, H7BKCoOx QGbaL4*S#k5:~;rzΓwl+dEʻТ}RbK*G޴`lPޑe[2ޅG>u!w!4]z]zx aBУW amh64m7݆nC݆lC64mh64tбQdYGbZ~7I8᭓Ma'üv 4אmZ$MTF_8, 0h7*-6+:wcdgBgY!3mV5 ~ (e&)_ZIUrMtه=63-~?" .-Kw$]]S֥ߥuN]Y#ݺt_M:1'@8孓pchT?-P_h]i1OE>uo+_+2s~~߲_/ OG럄j2,2+&XMFVtGeR0ҁ|).w?|URDcevf,2x+f| 4ӥpM| ObNjDJ:5t/{aFZhXdY ڃSR{P,wVo 9ї6zT0AT{Mg/@N•v{/?܁ZвZPn!UzyJ}X2]I]}Xm /Y>UdHJ%ЄWqK_W# ťIˬC#*K]BĸPۥ.:i~/ m!UlEᯁ;U!4>G_b+f˝g+Ts,k!U/uR}} ‚⡈~Ri@#Cwzk  [N↿}q_t-=sԊ+ e8Ff)B*qfN\*쪷`*/y5cK4̷hxKHnF|?)R~|V\^g2ী_\7$~1sIbk!/Wwϫ;o[ >/Wwϫ;~2i?ϫ|}kԜ{p['K1LqTZgX&;Mo>z~B8ִA'Z k-?Q.uI E >zÿL?`g,1~0Y~0yh g,1!6L?x4I~\&9~LI7Ke>6댔t'۲~.-8a[ytm%v2^}%MNx01k~ѣXY.KFƗazIĕ-[LޗuŃ!Q}*<./# r3^RMXR_woq쬮cG;qU6l˧y/57z}v`5^RR3AHG| _݀\z͓`?uV eǃjq~L&Ub|U!gqQݵMBwzYP;_X6 R|XrSxX|?y%]yI5/rϋFl.o=ՌjƃRն]M[{H'%pS'HIt^RIsrt/,CZRSҍ|e.?o4rb| ;Kv=zg[ }ھ^ CGΐF[ /,Ikڅ<5N <|MrMzMNITIT&QI4NN$*0{dr3s6K w!{Ah| frǣܐvԢfBOfr!FTj0cRyym 6t}F|\V\fViHT?>R {E8})|1"ӊ'U_偿1-=FkwDM;""D?Q;d~(y{ E gB7#Fq# S):F}ɸ5ŦtZ憣_MRPmN4Om!McS7)4:ܬ.m{!zoQ~#Yw.:@;l0І{Y/Ԣ0yx=ЃO^wv|3ߨjaMMRJ]qX /6%(&,ogz ~..|0,/ۘ;ZN;}`ZYLһt}ϗnzn֥R&ҍomCXb5@ƗO"]>il禎QIGN\"ͻ׵{~*FY̤b^n;obةΰ7T[r2 J:DJ^-}64UZ W MՆ MՆjCՆjCS G,Q} | |Z}w| |>Nz O:LW)l#EJ';w,>Xka65FB}8&Ip]wh oEד=0A rAj8WgB=?Abbov#j+h'j{wLp1wʜOa=X[hXޔR)*&ac% *.xWiV7&6-Q9R5ܯ2pdr+@"`^j7VԂ7WaN\UW_>*ҮX[mGZmHW};Z֙6Y#N>'X4mĬ&jc&Ía<ҶIՅP/ kH͚veob=%9A?,sluah_De%>s͙R5at5odhO |/ j_L{\ֺN$@)4[g]֐Z5=,\Q5O^?:؊ki>Qj3J EK=粢E%o(ڌx;qK5D_U0gynݝ#0? n }>zß yz*?VOA$z*#z M=VCLOR.<.,.«<*>*xU*Pi*>vHSU$}[E:F;r~=qS` ʤ*be V،!5_魆#:RO=QGt$~s k|Y9cV?q /o->cZQHׅ ~'-/֝A_ټ~dRՀ?\C͗sdT ;nEJ-BJFnwB­MՊjEՊjESjESZ|ZTh~kE0 ~3DuG=x[ qقv >=z:wƦtgMZnk`v 55~֏k`Xk =#mbSD/o]r@ 34競Y7__T7M"~}දo6 XnK}}g ^ǜ.j4ï 0/=x$'+fkg+АO|&O:i86yZ{>-涍SdizxF|*)遷{(>|E'\0郵tuG.|G~հn?9m?-PE Vrz#*lDd>7RӛϞ5ɔZ4k.Z53 ]al! 3<^v@8A1?}|7SHꇰM1?R~֠?Az!5~39bÃdAlťZNRu\51yX>q;1_ȷsGaQ 3aaQR~a_XFVQ!9[I}X#UB1͐*NXt7~Iz-E<`[wB7o-6zWêm?# ?d&Uc_@VH|kjfHUǃOFcW~@:/ O}vӀz _}pw|X}AgjSJ1 m)||5]*Ag UgH?TJB| nl4 SHU@!gHoIFbd'IϠ2_-I?R&[ :]0O2l+ _F'ꄍ>k(ݽF3:Kl˷iH(|.´cIuRA|k-HR)B5cdTk$~VGwFkHZyi'XoM0aeqQFBu'IUբN>|\!?R g|~t$9FB[h| ģȦ-]'uK*7OuRN ?שI%;B0 dfNh"%=yчwU} 탵`RN- )턵K3+[NORtKg {řpYDaD;0Ci/(+].V2f ރ]Ij{фGcd4>-0'Ϡ&R} >?VɟϿ>O: 1 TPCTV$ETПQJ[$~5'|Uo^,JQu} !xŌ Ƌ͐z߿oG_IjrN OjӓjGʫuR]T_kH[Ԫ)+c o+ʜPM!9XA?^\u  @>^+j.a%W U^aP%=CI:,QZ]uNa%QVR0RtPEnL_"5@&<>,LAxڨsA*}8Ǫk| s6:iNA{G;:ad~I@5ȖTw%k:L'xf7NMaSZ,ch`^+4HݫiEi0z9sXbz6Z.*a'JId0Qr,Uhz5)to{bhzW*omzg[|U'-꩓VIs˕Q1"NZTMs[8OsB/j[d ~r:9~7] >EvOuoBUl>Cuc!("r"%]u#-DXÛ!tۉt$W!1|ϘI+?3i9pW3VZ{s t&mOǎ惑c[ܮaHńT]=!=Mek2 >{+B/L.$0q3bR\3X 5p{@|? -%)= Ta,?åV >@sR%Nzm<RsXl-z"FQ#b4܊_B'jJbd p.yȒn+Xy5(˂hg퀵+I^+`tnsH V{Lz.v oB[z_4]tP  >*cZG͓Q{LRŴ^cZ/MsziUŴi%N!4H>91? wV BGY+NzT kZ{,`lըk3q%UUpɪfsh'kZdK_>}M׫Hఅ`J^(#W,J. B_Ű;|JVKݎSZ ~]v -[g1uo-IW LY݄}.=U.x;gpۑ˾fRt3Ȗ\oOWq{Ҹ5sUlY~[rOqX;{RHuC{`@WHup< fFyj1ye;c> oF[!UpK6K97FXӟy+6 H)&Ug]J)x阶g`'.M34Y o%=s缇>ٙOv^Q]b}CK=$w=$=$<$FW偃H&툍D x,3KHmXլ'X>xw'u(邷/dꪮܹlM^3V)[䵄QA_A9J'W2?_^Dm÷@!@mo=hO^?~UPK',b`9)7z' Gp`n}n.z:9͖&`8G']Mj}a\`(W<  |3 ˜}5!.敶Ou:@C5 Al&DD k )H8s&6>%zJ`EA"i8lQ~; ) 󆒈?j傟O<(\*o@3'pT~n`B8L#ti Y^֐*FNLcO B_`*XSQR bdH ].遵FXR!U{04=/]ԶQZqV{MUsREQ/%v ~Vbޜ5 Eb Z[ (lT $&jyEf.-6դ |KR3Imjcя6;:ʯ/y01āH 7i׫5@2^)êRKY,o`B59aZVQ!omT O* ݞ9Q/jRM)N wo-}*O_k=HpzG+sh$~֓ o Cޯ!j¨n?9P8K(, b^z{9f,=r;݃1Ż{^F?4R>vZDӘ'#WzHqӀJw; ?i60V^tCm/՜jH Ix#-mTZ y#CG yd8/aӢ\jPMpҘSHm v ?~?x? >>R7p~v"]:RAs; _?.ݡKwKwvХ;F'τ;Hc c5l򈽡)Έ!^)w _S+ >){E^W>/S3"eJӽr`g~,PD}XZ[mvT?2PnVnmT?uR.sr÷VHIu~ɃC DUb¯bV8IT4N>_~D >—(=R+/j%\/%V\>I#Y>jNs _ RT:5TݦT?̓;KzqTG3̋r]h{Fym魃/e~~$$; V* K* ]J|JCWaJhS4L﹟~2>_~n22(C}0vcAxPu{yPPbe5?<(JJktÃr{HeVտa߭P>jN -(7R`}'OG?[ G3} %=v_!$1ك\0郵g?igykb,IzNznz9gIj >zdezcM/oK&U3:uI =@S8R:N@?LߛoT/n&t@{Yܰ$n&[LJ8`n7n&gs]d~LJ8SOGxwߒ~K>tWF qcjW σ6353l:5ӥN?N'XsK>=?>ϵїs}FJaǐ1d׺&s+3s!Fޣ۹Y~~~?s?D *KmoeUšIUV[R/0$I:_jc \ Uf$|6y$&!?E3>FOI@6NO'X~y~}<~I˻K}~}_~u~u5b+b([[4b[[]h m龉J֥ڛhiu龉ߖnѥ&Z£~OTŸ~X >:,sfBj[}0ˍ#=sW8W8 To|6Gz>J RԬWyom?.nq?ts 2/y0𡰥ۑs՟ziiB/VrSnؖnR'Gn7y>ET.sV ~P:/+eyDM4sV#N\Us}g۫ާG{b-{ ՞j'Xo3~jIG-oNjZjX. ~j(եp[+x ?E= cC܆f%ejgh%^vKre)?;J?s7%"|eje"B2AN9ImTI{Ҙ{fGS] atjϧp ӢA7o=ADnH礌pMn9Oziq;(ԬrdG,߰;Q_]nu;2Q#!}飼%# o LniGDoo=>zƷ`_QtTY9Txken??;DsW57>O_p[ZR~O'm??ÿO'm[?s'Xo㳁(vcg}OUE@.l5iX&;Lj#]G_`"mU{Զbїy~7V1S#q4Qv'k:F{BOPI(|V81TΑU[F_}2ozF #{1T6)F?9b>3xb/<1كF_2xb_dSM'X?u u6&'Aq>[S|.b ~ǽd2RŒlV5`;u{+~8ӭ-> vV1Ŋ݆^'s_+|݃1#H(s? l5lulUVVV{?[]?[M?[Ƶ(OL'DyW3Ja+b7eyqW#!VLmEn|bD.L|H$v걷Æd䐚[#ؼ2/LsH=g.V1IF?,:.ԦFmIƏk5P\ϭ5|>=NPV7J i槅vPKV n9F,}|%B\\*W=@\Wc!;{OޯUho?wByp.hP/))W/ʡokoȉkZO.kZ5W&Zߡ/ƶ)}%r"Ed80N\<-}Y]Y.d'e=%,u*Xn]CmZ-ž C/yPyDd\ZI_6d7xh]*PgX!U2Y-$*"똠d -d^@ޚg/.3 郵tu#jǕN7%ɀ׸ϣ x |6*ŚӲ Tyket7Q]  %6LMO)^@/`HwLǻ|OհLZC=Zs sA&rw$  ڃrȤD?~kj),IURX gw t mwO^ڝ)e`n{(ˆ:.'^l'p [mVv2X </.X33u*?_d|K!Z tc (4fUaF7"`hD@hF4)P# H-k .o],cxaR~\!5k.;+Xo9Bh!\60$ "k@e|_BۊVF3ɣT$moMͱత(ä*f !Aj)Xi%c&vı3 =T54m`0d=휎Xa nFYZSyIn|W;5JPdTWG$6xIv˶ 鄵.&/0+m >/S~5VO |KlӦ3owмu13+aRe}%"\Ȯe0mT_:?t;CGw4@sۋAB[h| "Lqe M5 E zwj:ށS=.x,2%U{@e]467" 3Nhh4:;Nhh4:4_O@Y%@AKT+J !_|gF4J޺Ѥ/K7hv ߓ:|cY ~BH7 uY|ph|,VRMXOaW:u@lnXtUO繢M?EꭕWt!U1H`jfs<~< GLp?7=O| ZO>V8S'[|"\5'i?RI>gXcZv.>'X~}}T]CQqًz˾_l~HN+>~H_r5J=@tgdˤZǯoo V*2xD %&𗷮j'?8Z3VߡT ӌL{ j]O#n_9lRqGʬ4ⶐ*﹏)F>\e=>W3Wҹde$s ?+$~~g?/ߝ3t3tYwY y y<{iG ݡ5&3=ζ;hs,D 5*V n D.XR >D_o/߷__ ? '>[ VoI~Ƀi3DuUA̤O|ˊʶKz]RHY?VwгT߹eϤss:;s?s&[y<luγg <;OyE׍ԍs_^EO8Kyً/(eZ$—_~Aᰤ?_,kT>,/U/YO|_|Y,oV>5y?5g-'|'v>lgXʵ/|l`Fr¶| n،)v0{>]6BN=^TKRK(g1~>*ty9nBbn77-s.bn'XAL j jY5jY5D{5T b~kwo&,vD @z<;2Yl̀5?$fؚbj&YpE/-)<:G=?|Iv{tk{3uʶUekʶUe˪We˪mUګmU٦l|OqoU~-׌ %93<#%`2uMk=DP<Ȗ|] IӞ@- :=MZ}v+÷uF)^tLn` 8H n<o*$3lJm{ Tsl[V \'X/H&?Vj>fB[fQUq Yg= 4R-] eunYE&嵚lfդXti7蹼Qýxj"=i=D O`-sct փ?)eNTcBjhѾ6` t==ZR'يhp8FA "0!r&yqm`TyAc|*d6QaA~4ʻ0}g{^|^Xƻ}X$Z-84tdgb=O8۾hlG^RFe%q:nE|Ƕq0*?ё::~HSJ+IjǕOG5J^$ 0~~~aggYv\ugYjfYk~v֚egIv֑5WYwu篝uw?MOy2-):;0̟)Dz~;=I<|;r9Jߢ]*?ҵ1; gچnCP զPm6!܆rmhw n }ҳ\9Nϓm1d4nX;/)Is'/Y|࿭wQw]ԗ4עԥuQwQw]Ԫ..jUvEݿ$(A [%:Kކ>@8֝~lK!1>zϚrWIѶoa1/s+I\*3eߒ#@Zb9U\܆o} egTI6JU΃v VX}GG5&9@uGT㰍~ e8S Vc ;sQ`'u?'Z|1~~fW*uAr*\S}3EX.U/Zkvc|)Klx fӂo3|9=3 KFL'X~e_`#q$~֓tGY|G^yG? e)M6ܯ|nHͪ9UK5Zl_pNZ3}&To< )? 4ŗnHuLjd_RVP_E6=یm-רRӥmolRH2g`8@8魛mrwEfuf, 9"߻9*GS-su ~LT)CF\e,<` чmFIFgqkeWzG$~-# ?~~V¯?#//[GE~-#7|_YO (",l6=6FF֞R[[,ҖV\;QW5J:.yzpc7Vkk&fR3]3}ͤLja&k&?I Og\ʠǠ:TɈG̩nްk`ݮ6z "/YXKU[a%ZH -|EqӉwS*u؇2yt;^t@ZGv|*Q4%R3ڡxAeR'QdXKV@a!^xhD@mE+G|e⭂&kM/fE]BW Zֆ,!k".]'nd5&7&4F&EDh&k"Jd%&BѢ逿 $/+\F)1"V@ Z5-nR[gUрKp7ؿx:%۪H1U.-T+M(#>2CXZka?L Z7LxR|P'|kԷkpGX ~sRS$><u EOA2|_}}X)ըc(}eܗ.q9tV'ڶ. l]r>t)9xt5uv/>t{*lRAYe JJ<.Ӯ[R U၏|G|{;L'Mo% >%f8 |guf9uVE킼Կn\&UL % \m}5 r.U ?|} >z yð*8S<93)e#ӥ~r gHïV a uo6iwQ  N(`E;RѦermJ[|מjhU~4M*oVyCrHhaK >JÊMQ{w?u[K׻qSD< !5ES#%C'Ye>"?36R VA8R ڐ,.5:n^}10 ڑ >%xAjϐKa=]௩nVA溨To L 5|hmłkRwAeH:''"]x4<]W:hv=^;`_}F![eF 9=Q*uXq4{z 4oU#{O~ 0IQh~5]6i(PX!ȠIܶZ7(WD.꼠ڱ_[|MmF*=ڛt~&]<=|_|<@7uѾ 6:/QsyӴb4庌ho~.ܧ.iEf[G%?tI\֪hw.e_֥k[#-tA;p $tDlⲆ7q9N%'[$Mh)CxnJ֪`kH=c~?6됏}= BuxAMx꼩YԍrEfxz>c;A*ql3iaF )] B`%i|O]`i` <e@hۮnrV0.눫h~q[ͰRowƽo{ݽ߹~{q+!tףUR߽UvͰiRA4x߷-_GXOQaOxS2Q1@|kOS_TW}!4ulY6rFOcUb9 ,Mcߴk ުBk'f@ic VA4Тr rτPܿH?`#?K55h ȗG 5ip Zg0oooZ1ӛ@o2w`}k@bYh'д<UvJ23e;.U 6e/|l3㡗?dR7JE)$J^CDY0R6e܇.ln٬UC+l^͚]G9O%-fsoi!wtKGV3C sGڐ.m-/{_~c_k#yes𗹺SAVa3nℏ|@eOE=V(v L*~ Hݥ*ȷ#=8(ȯ{={Ѧy"XxL?9'h 4r"!焑UPL%sAiEBjeQ!Q)'V_[xV嚽#-<{={ ޑx{Vgoy?~?&~__?¯ G—gD%i-깙 % bz"/TH`_Xb|qjO`p_Uj ˤ:=Ať**i-:臢| ~l>OsOƳA~l;IyOݷR[A8歆.*OM翬4KUO*{ۂ|_}Hf$dWJV9mߤ:|ΗUpN^8$Z3n'k9s'ZN>n^8I?h'8h@^XD{S=el+!5=XڐZ N,-MM#|ۍi'dw$aX ƧDnk!7#6[RK![ md3w,.YI)Zb θ\*ϴV7%:|\@&d bupY+"]C. Y.>t@աD1?PE%(v(Q܎@/‹ժcp4G| Pn$bM Q]`zfU?41:`*KGղMR-^kBN< 9ݣ1 GkD05 3(%XSC _>SLt^)X*(X1_S'VV3N76C*Ńз)zla J2XX<y#O˕~@V4Կ3F=& Z4FF#gAglLWo\qpGXoNTc'y'*jz·螸i|ډj3D{Vt%ࣹLHgHoyAH<%ƱТϐZDVE,{oh]PP`j9#g[`Ůb|;p[M7R?Dj;vea >蜝HvBjDykC,{To{ݽ_~{qv~oe}M(% h1 LkҘ;cpBcU!4xb>B谩CeW}-Z7Ex;pU$u+dL-[oi|J;AIhZ45CQbJ>zטjq ";4t枢 =eNoU4Ϊ{Hqe);ೡ|開bne +8!ODřٙ3k7^83E!r\{XO)],zpڃ ֺ ElbR~x SUt!o0Pnd$c Ge *o3.1":}r@3sra=(Zfe  )|1e-Gͥ*/݃Ka8znqh )GL4?^]7Ú5F{OoC0s!P7__Rs.A5;e0bdJrQ*|/;Í|{_}½/w˗/{_}Aj ia~81˿ u 37>zi_~MDG?W_ӗ纘>?>Hd#l'G#/ |o8 8k>s3!ݖ̘C8v5;B;Αi9B*V+O'+ʓyʓy^y^y2u gp!֯-t- bxP/Zl𹭘s>jP=Y[Qg/W_oRO'bBM\y꧕'pmC~Mm{޽_+~{~cWWh6wI7s+PvY0uDs_qPCjaGXO;/+j HVT>#1]9`YYjhD1Wj|JT,[ükAg;GXo/,g V=#4'̈:Ro # !r4E<gz+_}LjM}&Z +M4o lA-h4ق:[м-hMyy) _t' ;ßzß_,׷ g>6\ƥ*[ÑpTߞf]7 hɕ9P97 GXOzڹm8),P+J5* /6ϵ[z,ǧ*p%PD Lj -iϛ֥*4H#_5k׺ ZZgeIv(B/g;*kHk~rJo[#_$Q\/2M ÆhvDV1U ^"Æ"`c0H![7&cȇIJ<Ω54Xv xf ,+wKU[IbT$vvr$$wr$wwr$4?$wIܞ== ; __o~aC^;EȽyjyN\T%[2T(sYl&.Y&;9# J7Lǐ_jPtjxb:vF^j nC>8\h\ȉBN\髹ҧ0ͅ^s'G#+6lY*ƚBom6ΙBocNoc)63 ?(_^쒮,KԲQ³@4^^/MKZ>.F}<լ$ٮKPTr a( EPH(PTCQCGo߄?oE ~ ~_~/׏+ï"sQyxQDl0vATAG;;;A{~M#/ h/n@'|vʷPn_¿݀N4ۯ߄_?EoGٿ;%ߎ( vD9# ~~~d{ضbiz=8|n`x ?YhzD gUnt_Pgq!ohD74kFuz-9X—"D.Ӿfe\5;7*|&Fl<;xp>tZ1d8};}oGOo~fvD+|;P7A뀏V]L*ïZASu>X|?80O@;zs](0:L-?Rk3#7T.{ĒB'}:|bROE]m_K/j{;t%_Ozӽu 3XOK{:Ӂ\+zk=:zG״ B$;>DZBj1gXGX ~cVaqzc#k^(<+<sQ5h<z煳ə,-!ydVp{L; '>~{Z?DZTh,P+J5jz,w{RJlHoaa&d.KK.Хtt?ѥrUelV6fU٬mVͪY۬:Ueoי.R %ggT8-8-$Bgg8]GX2LtG lqGӛQ?(רw4eg:(/ ia1C uz% -<Υ7-OY`OۛH\Pi8#ۭۭۭoo7/wiv+vkۭۍ;'G7׏|5؁0|(MEet5 v>2ᇦk @ 5J3ڐ 㘿똿511=ww<{ !HMEeҦ:]k)?L=lɥ*A!A'ssyH ;:F@ۡzv :v #>Z4D`vOGWMXc:;Z7oU4բ)WH%z^hVT>% ?L͘R Ci uX?<Sx8<)zŸ+_~8WČ _[سʽcd -؜ X6YVHDwdc{/8'shbm<F,FLFko#o#{^W$%B3k) k>55hL዆]Yf _,`8-oN|j%5GlT+u),<CkSX^SxSX),“\SX-Ȧ{s@~2s@qyI"$i^-B5"Tӵi[-B#]PδIEHk}Z1Z\LD:iC\zWs$ |}Iw( $yk_ooI%@xu&JH=S w|)'$w|,:|3~aϷ ~fϷg}aϷ̶߶n\( LYLJ{sﷻ ~ow7½{{[h,:%uY@c,:oɥ*n4GX {p/q~߹{pw/MSr˜9| ;? rp3[#痽7 ޿oy#G_>%ǟ>K ?}?Q*G*_ժ9|Vw:-1X ~jU|W/߄??W_oq8G VG2դ28lcPqY ͊5H?se'$7b&U+<1_.GlJr%DϚ3 ~¦@,?R8hGXO;9 |LNm}ۯb/ ?=lB I=n|[˙A8?+]F?,~ gk}rfR~ 3ִBspQ#~SH@;Oծg&~V vML*o u{#N'V_y|s5Wٌ"}"5*Kp)xtɎ,;&gC1k9^mnkR7 &K֎E)jeSrqH4u+ܽ21MjU{+Gƃvۇ<'WRSʑdit>%5bn<%5!9JjdG>z?g|i< 6qxGl aqlWiLM5=Mh"tME]+]A-1rk"|D^w8O!zd ˍ|JךŪAy]#*:r~ޯ ~{PĽ_ޯ{{͍vlʖ;*Zo kA(]ުGXWW}]}{޽_wջ7W}bA-v(2m 4\UJE>ctסp*F[:F8F8Ftp҃uS(Úk8@!aϛ=}sY)~2x携 o|k' %/;EuOJeݙS=u%+Z,ȍ=u&pAܕx2œr%@4vA!V鐚?+P7i<,_ݟ[(רu/ dl/"q<9Uy2x`B .2i:JˤԝDL}f!'Sݟg)VT[;X 1\`zN:3Vk}:}`gj_qk{r+J5Z(>YVdShbud_v2,iWk$uzaM]KxB+$pD $Хq/xp޻5;]˨CfG=xc8;.߰O kaͰ:t/V%UJ|:jQb5ұX-^ėæ|*˸]4\L b@hUAX(,Yn.U Z;ܼX6&| |0P`"AFCtOCia1K~eZ_{EdLJ\7רa~CcԨpQ~vOBt)p-~9eK7+ŨClF*Etvsqt֪G T=r/P2%br٤-P[ 2S,֥${Sp+SuYmDB1ZwZa8ՊE f{"T%HkpJ5P),J5U( ^P*۵Q7MSj+ңH˸]3$ 9t{ZfJJرՐ]`X}Xc;|O&-g2i| Tݻ"GHwGx\JvOGG>CC)R )ÎCvRw3}71d*ToWkTs%)$;s=;g!^M^^^g7,NֹS'D;!Rd)cUުhB*nmqbK %>Z @4O{ޝ ZkH1BpU-GXo_nʛKK'&p  ~i1;؁&Π(6Udk,!$,t. C sXy$z&|0q_?~;y㞺n;x=u%qbdSXGZ 2wgZ=733:uu_Ž?½׻6/5,{pYGT3Z|p>[*]7_izwkEʽOXHLJq@4ѕ=~2Z϶iGX >GX{-D1TeRbIuE΋ -[zA>Ը޾Boߞ+wW+W+WW+﷯UQ(ɒu=x@Vg"^P*xZ>d+Ex;q1Ch%䇰r!sunw~IZBj+lz?+b8_(G''b{!v3`R:|_ko XXZ6z(xkG1_N׳w^}[R?TYB4dIcy|nI=_\7`O >zZRf?Lݒ;q7VOڮӤ2|=:u ok{a%rĶn'<>J@y)R?q@0|hm!AM|~@DơL*jKj fĭ`b4@L;$kɢRꭊ|?DWCNDWDw:*|\v( >*|#wqljnۃucN_'2eZ >NtkH%xc۟}YHkWkTݩJptwgn%^}29+ ]Yb]nXtه.b^IԡKJ;b]5> %q?D>GHVeܤwo#g/BgyQ ,4^ _l^8g'˸]4yVxR,hUx[U>ʇ}xivH\C_ڔK(3}u1`h+.+G:M*z&rאJIU# NNesB%t~f/zY޷Ӌ#xGii<_3}|6rpޗ/igjcʯ]|9XߗuߵP& Ʃ ~Ied׭8_S 8J_ުhאJs ټ H^c|? `xAl"e~olHoed.>]o-ȓcc(u7@tU=ȕ+G{gsGXO&b",v:A8aeT5M`!>ztV%77D;N$p'VES|oR놿>_ חG[t7(O8j֪br:Թ3b|hgKUDixjV)p#y+_/ꢺPV]|JTOP8>Z%m'z,dv.LMLhk9|vȫ{V38kG,hȦ+?qQxw+x*ddu@ L*$;EYaq:n˸I ӆ<2c]L)5jC3ELl]96e܇.kˣjҞTEV >]>۞ 4VE,qR , Rᓿ>h9 2'Y|/?t;1#؃0#Y?(تR<3K >J5^N"4.Hkox*|~p+^. X F P,9ޒ^55"5XV>s㇢~Kv Wyk=ZH%)zE?H  h|ixeh=Zpe4oU4ՎVZHޟO;Rp"0~h^H{9+ G|x$4D@#1> @-j(è^uEUY+e[u#ۢ:i#bk!k8\QwjįX >ZΈ_Ѳ#f>U'm#} \ɄŞTvEiFM_FsVv/&]4 4 AZs ض_Bj1U4;]i!~lLDZ1t4x:77xKȾ6ؘ/>t9n{4V >۬} 돡!pj @f|t1Uqu![VsQ~j;ܲKihj>mdhUs0|:>=}7u3|iau33ْV?u:y}x}{}6^_ǽN^_㽾פǤǤIݎI=I=^zz&<&8&Y1>̊Y1Y1^b|'bb`VLk xC/SLkZCK=ZHz[-:C%PPc(15y źbc(1Ca7%LaJhU-CN `Cntό`|mIB͒䶤ɖ$lIr[%M$,I% [-I^$,I~bIrX,I>XĒ$%s9uХ.uQ%C9t.º/>uI_}\EyJ.ہFMN'JyRKvvHӽ3󞷤מwWרc+."8u=o'^}rqyi\$HeŸlƥ'~0.נKW| ;0kqk ~Zg*/Su_F|Qb}-wiX`q+\օr+/ gw;tL/1`&kebREsL 3h!Ed GX? 'PA!"?J %ALtP%pV:( {~rjR{RR]5}*z^/^/k=r3k9Z_ 3kyX_˱6YfUجmVK*ͪYs[/zڤ. ~V>M*ï>5X [MIR~}YR=,T_TK%՗%ÒaIeIzXR%כoq~,xSכzƛxSM~_=K>.(s׏1^1.+t\q\I_'[q]Ku2]KzR]KrR]n.'@]/2ԸSSSN N5N{;5y;5x;5۩שa?N q:U^8P^rtN q:ՏSS>q~Ėj =t>oe#`a oz>_NdPeu H5O~`e1x9؏#:maCQ}?W ؏*5YW87j\ɿJ :6o-M,YW87'HgCv~XvXp=3워2p?tɘB5]O|D}OZ]~A_Zv\f1H4}v8.FH=ᓷ&rFo}O {g$[ {gA ?g%:uWd]Ϧd+{_C<2u#W7\Q>JwHvձG ڵߜG@tϾ]STJi#+GO ERk3U( ^_nXo.Y ע{d| PY:ka<ZWz2AE, LRpra%;v1 W5HWΧJu9a/E5#.b&FHe;č௥Jm7kETu)ST&֎̺H00B_Zޥ蛅2{k5OtT~PT d]kz>oFH%7TK"?k++elɠuY!5q5G#:mJ7fco';ߛ13GqÝD2ʗԻUn/op@C 1Q͇yrvsVF|eȣ,BX Z;x~;Ǿ_h_W75h_I1ǖi`Y.Jtvp5| Fy%`Uj2oKUtETbu`_lŶ?m¶/_/ /7|a_2//3] _~N? ~N _~K7Bg"3ށ2|qJ==pkuqfJiǹ}HKU/O49 J~f $~g/~e??gOvOv mOvO|J9''F''>]۩FE1FX#E%Y+*-߭h6ڸToU46@39_ MWxCICde&C aE  r$2 Xmqĭ8m-8\8XmnѠ3'N{DS E7>Q_+T/zW'T ߼[Bub=˒#_cQ=#::5'ri:_N)LO7Ƴngo'Rx&Z^IJ9>;yI?8}z<gʽ_,})WHMS S N /H=(0:Zh(__KSj/. [mAR^[(.Dw~(&{!5GtH2w% nr¥aUvEiFUl;D-Bs:Me܇."Y KB[ʧJ%%4UMdT%x"W%fHYEuh%BYZ3Un]1)Cuod-劌h 7}~; =:3;̤Z?s9_43_lscd2lZyhyZx dA<oRlH}fHv*Ӭ3s)Ci~|l w20g2=['V?_{ܽ?xehPeh24eh2x24y 2ϏE[| B}5RBުhϐ{_{rϻ'ޟw ޟߗTO3=" 1m Ga/1-96'%<%2" Y!RC!)C k@lR ɥ*q~bĶ_4ZMm`ڪ" jh$fhRE@ >zw+vSˉbvAc^;u 汃Xώ:v;}T5)4RXPN*ٜcs؉Ru<-]C\)AӖdѥCk(PDC63PH9|@k.Y’$$15i=k`פ#7| m7$nhnHx7$nHx74y7$nH!ݐwCroGR>xNj>gR?HZn=`Ů)AsхbjJ sRm*v3[UTGykۏ |  dz[;Ҭ" 83oǓݖEѪ;&XWWT*5{~ {|zJo림kD=/A$f(R bEjf}]< 1S71y- bR~ѤFRkgVz@hc*@dz@<=Z,Ki]E%{  ٻ8ʷ{{A𭵳4a%j4v>Ho iQu_u#Xh~ɎF ߽[:vb%臥/ GT8Wk&| &;MOc!¦-c>~ؑd,P+J5j!b'OHHh׉H`<@<ӍxB(i81?t=U5m癿=nξz9;Oɓߓ$<=;OƓߓx$<{0q_s8_/C/PSb >1$.q!/b|7NUDT8tP;"qJ0iuҖ1ֿm<4x֯>S_~iq|m}:o%-PUcĥ*z+2ܦ1\ع9M0j'@$n?D.U ?j9c{z+zZm?\͕Uy/jډm&o> >L>{0y0x0aa[=*b~dːIO;&{?wܯl/\!V^}49)|?)D>jMܧGg9c%zJWKhs7a;>"AFU(d.Mv%ЗQשX$Ot..(%+\zѤΉ''IxR{R/ԓ'&uN<Opr×/G/_— X&ztkXSDcIlL>8Va8ie2W5c:_2G?-P÷nz? _FBoPFPe  FPO}} עt۾D_e5 H}Id޶yJk&9_0CF ^}_4}& GA,(~vzz2- PD뼺JsjGer֎\IHu~g_~c~a~c._ZmOP\&cd>b dGꊜCjp]}&Z 1jZKH=Sh.jb@0eA&>h|ՂL8Wjcu{ۗնvY@c mA8魊ƋdHH%[{f'`2Qk{)AѪbp6&-Ŏھ:9GHIYZyffÔ̾Y >fUqfiZ}<|%X "Ooz ?! ]7&d[-!>b|8Mx j5keD  ^Fu%e+ʫ9KѡƣWB({1ƣc#j<@82V8_5ïުh$co 7[sQUG@$/D?<'$O6T t&c|] 4;vj@4C|f*c'| 5})B5+9+TÞG R)[3K;|Yg@w_[\לĊ/̌(эouٰ*gCl _Fw6>vjL.|71=7~;^,hn6 ?c'YrE'g@,L*ޯ.uQ}d'c'M[ {N.eld9O+dͥR}Z|b%{Kz*h,;')2h ʌSҬufxeȤ:|9/rR3/6X ~#aڑDC!Ȥ4k;֊Iu{#]WH-|d<3 XO#R8>>R8*9/H؜ U ˉCO,&0Wuy~m(*k~yf +BTA]qK;RO;jC] CjaߛRB_U%QQb^s`b 8.qϚ" >+Hڲ[6=7C9DrЖ=ĖwX@U(c=[E[6o[uo&ooֽe[ee[זMۖmml~T5u ^0/k}:^Kmi዗p[1րDNM;DTJF>wA8WI;ƕ*ƐK֪!4e}_?yT\vEiFxYc^d {vVs]K 1ؑ+xKӵ i .K5ne_KrsUBV6PX.Jhdb2UJKf5U1*>t=N%}W ᕍ:v!܃רª}o-dtZ $Glj$e =ovi±z@+$!m>,IRT Cnw>%Fl_Yi|ρ_~;Ap6Lanw>sFRuRskwZv>J|f-Ъ:p QBeUPk d'>-ځ+O&ٮK{-GX{9ڎ娽F-8[u^/Gˑ~Z SU 6TƯG,}'?u LY'VdPݣ'\ _=K;wKޝDT}ϧa|KLݲWc֪hR yH*pHA!]mtH;~Nt !4tmG'uSư:1upmY] /G@d![2osl+ _Ӵ;>PSB:|=( ߥ*qOoZR b {UZ(R%JtMZ<+"•Zv8`h.$gP,>lס(:tخC|ŇݫHPJCA:8lQ}5_8ovmowk|QRc Zw*cy8[u1|>D W>7LƗ]f/ogf|W<^rU%T+LiВ*lխdf>n[ͰR~T6rOKl!X/`}CCъu0]$t;e1ڮ(ר%iU_9e&ءG 9#{ lezLoP<8؜b^9_:/R #}UW3z*t~3|=5dl( Ӕ*Lay8*᫯F2-U<[@&΍JHG7ᯏω/V=OQ+J\%VJst+*=p.5ݫRM*AJF")JWxU^f:V &JU&^jzJ"kFa U4j?J R| &'ai8 KުhD֐zC2ebaZ)Fu.qdӷU'%N=d.qL;^(eCh138fvZ4vRG/㨙v5v, Xvj9)d1@PFCNGFvVi?_RMc۳@ ֮(רʵe:WޤbggE7T}6  z^=uMU(x*9~IZ-GV5:Wc\DO7%z8%LzK{]YȢΉ#G2yuO'o HX%jX%ʽJt[7JU*Wx(*Qyp:({!6~#6#y؉U*Dk7>t؍`r1DY,wbRݨC4QuMzVKp س'-#J:Ӥ aR ˨. MLaRya;tLXzS֏d!Lm|X%3SSYbRA>#LBvhM6M_K1V/Yh HFdUQ5RZl@j3Q>@Lj%|Z5>1,  V]nu]jc+‘t  hͥXskQDU+q/T-Q| b q 4WA5WAi| be nq˯A,AH3~wo̵\k?ߵ_3~U&~Cn&笔0 JU*r,=X-$V*u9n$6BKw+,uJ[!'VaY֩e| uJZagC^)m:5j+|ɬLQDl4\IZn"\-1nhSWuADWubƀg3>JohHL0G@d|/MO.(cr3>?ᯭSH=Vo6pSŤ yg`C38c$4FR̥R~ULcK-MY4BQ3>;OyܲT}trB7vQRcT>xZ5B0|$ƃGsЭT/iޟY:z0CKbӃ|O'0BmCMF?y0F-P JUjqO8 s沓g<Ʒ7M䁰y { ¼0x { l|׃_C%x& HYSe| 2'/[n*ŸJCu vRvR7K"GI.9jk;F&Z*hfn.XIpwXSKċUۗl Lc1V/O*d//UЗ{$;- Hckpx*UKoXq0Bb +?oTKhퟫfԾڗ२m| :>ڟإPJK߀61ۇokat>[=l{TZy?i`]kfJD0IϚdmx ЛZ+>vSbWv|IetP]He5Gzfv$JMUGR "dۥTS E*hT^ny&ynl;}b"QYb#t I%Y>Vr;KNmŶH;.؃I,LUK&Pm%Ӕo 3R\]*7ENRv~j34Mtї"U ^`94e6.;M~,{E`=Ir.#Ȋ[ 4PApS }{`TS< M\jf1zWai).ϩ@qCΦ߲$Gՠq9TA\K4.4h5h/XMG5v P*,Hw`RMM w 0rԻ*7@.]~~kKO\12J⎹+z?6>+H$r̥] 16je9oX?sMKo8Ͻ[OR}r._8vpAbH-g[Je~yԏd!X Aٍ/@j ŕ@.(wf4!>K:xiW3;J.5y@a @na ȃr<W~Ќ,o@*%@OB]/»Keq)Xl^ ֽ ^ /^ /u/Kz/Zt=_zhu_-|=!1#C}=$fc'\QaO]RTrAJQ@#4RUҡK@"nH!q['RdwN+:R;u筶J*V\xdQPg]rQǰ/ÞM'鲬X<@-g_vm--d.HCWF<}U2Z#7;HnLF[KgAξ6'D@e-)cQhR0 spQ._||(RA*M.;}eCd 5O1=kSAdmsk)jj],±b/a#\j׫X@gjѣekIEYBSHyZ4Rԡ Myd8o}R8)8#3=y+VUxS5)j$8)b#pހt9EW 6(ʶ+p5È▞]btkR0 [pwJOoSCc eFƍ<Jp۴S-%=Y`K{X` c+4u8gfAݴVR >kfZ!ݥf\JN jy!siu"\AKzBNt9@x= ay< EBNckcI@[O?bl |*±ͷE!6joT7\*WVVzrgCH^kʭVZZXjX'?)RRRK+~~J%&/5/U/~IW'eڝt!ZW^SᗬUKL?UjlEl(1d&;`%5d/s0堚&/U- :QHvdEx _P 肘ЅV@:YY1o]`㳰&̡+ηƮp]`g#JcB sWQm H-p%b"q,8˫wDmJrjU_60VI]ɔO>Kma %laוW-l [uހ?QUb_g=d+K4y-]jwZ5 p$I+ܤ +AbK_ KK_{-}Ҁ⥯;9oCu yſlM8AMeB.Ϋe/CssWGvװEd.2x ]U^j de?XWꭈ_Z/<ܓĶ8cw7|o0` `A{qL7|o0ȕ&?Nk@d)u I/+p^gXwXkav^===_˷ܗ.vNK"l'"P5ܱT <1V//5|q ݰ(YR²y\6-}v]PHa[0HOeJ]|7TXJR ~a@-3sD˯Qx@bOK6ӖÃeX;V̶d]ͷȈHkqY9wlE<Y6ވ]1ZzMb| G~F:p~݃o&5X|3ſT*UH- TqKrD jlu@Eix,3I?%)R>qbv(!Xv#e^b'ԧjҽ5^iPv(vB}xK׽#[(RʁNd.r¤h>mٟPOٻ|v^(~Qa}ПqpG]rK)y\?6y=Lj ^*_gåM_U|]ffڥ ʽ]vnu.)]nd..vߴK_ҿhM.vgi9Re1kUJvjGRB٦vaɛy(e,/jIY|b]lK*m(tA"Jedl߆RAyKk 5V8L .# ~tjiCvmp.  v~,C]ٟL7~ I)ʫ/g4ޤ!1m>p]TIEbsB*(T %IǷk(RCK㴮R)G$bHnۣY\=FPoWmOdb/*͑ɭQV}854 pQܸ^~ȲO&H.5mB!OcO !u>B2Q7q1>}䇢#$?_uF7oc%j#!fdNffojS97#(+P᳨6Tj#ߴ6k],9꧿~v)ꧼ~J_W?mYg}r'O'{%DUIX}-d/dsD!;N'ٕy]=e5Lξ]US%VU*ebc&YRDK&ȤF= &zg;+7LbLUbᗦoսΑUc- Iu$Cu[ߦͅw LLل*͝.՟=bـM|Mrb) A5Ky*| (ß IZ_ ~וac ].!g LoPTV.(W`~[dGw$D67G?1- nqYҗR˰YkNx|Y,:o\zY7u]e~>`.Ӡ Cȶ1V/;hHXEB<Ą0_6-#ORC$Ovbot ̴K5'yz3Qݖ K,0՞R }E_]j+_̳x<{<,y=,y7 M ˺iU4bŠ~-% ?~~fSϺu˱C>3/o6863t֕L8Dx3|SK'^fX 9R{u\:R? W(m:z7K2:hDs$pL.t;Do;5~}tV+9 1~imV*V_ ~ 2zï__~}?lVߖdNi<'9o,IO+x:T}BTD[BfK) /bJaR`y6c%/a]tXχF @l"6yʨgևs`(4X QK@}zZ  !R |nk҉O\7[K-%gwu7wuxe>L-GM5R_m.5tKT#GO0tsN4 n| <~ B4մy Tt4<ѴNE*hT^g/IJtbn/k)@% H0w;(& &J}l# (@"Dv[:|\, }dn+V&?XH&| U٥g\FNkʪkT7>G*L~vCpf޵b ؒZjR~mwk_ӥk(|1oN4K% ) ƒ_yo= =Aim8'9qjlIEXIv@@$7:?e[XXa+]X#KYLR RLK-V"5.ei)r~گ\}y/\B/[eRگ\kkjo%-.`Ie}&f-'ӻc-HV|-uҤ aNr^"?NN IM `ꕧzz)T&R>>(WBkM/k/_~ow7گ\kݵ߸+~kp7}W2>ɓi]䭡iЭBhA,|Mò҉Cs.t$aY⧰]JT*(.;R-.[9jl|1ᱍΡrK"KXɓ?sg*9A4Ĕ\P>Ч(5`R1ΫTc,>`U1^31>҃ |vS6ušJ&)jѝWlѥ*jPZd` FA]#6q]uZjUU*EQ:%Kf*)0ͩt/n:Dm[ ؍dGQbh7;c %R-Ob%z1e7>!D*_SS-T14B|-x9b bv@ ZJ]a+RGgF*ne xؓ6Yél5W)i+Ԥ]Eswzq-h`!;؃pq] v4f wMH ( JDy`!TT0ivc[wPq^[Dk+r(^G-9@ yL,Ζ:;o#٥PuK%.Az]mR),+O=Ť Ah,@٥*I_! Nb̳Ӧi$,gMN N%Tkv*₴-1>"NJZ *4\ϭ~1BZ:^v48p Uסh :HT^g-XLe숺I@Ԑ{&ʹc)s e] !R X.Gͤ b|KGvE</—f|= 헆J5go3M AΊK%Wʵ_okp헻 ~K\ʵ_˻ON /i [MB"iJ+Ԧ]Tv c KqpqCuAt/jСCg*oY:othYOt8S[Io(uyѦŻ&XKfTa#zaMGCB]K @ *?4m:jVfլk/i#,i+,i^ZKKx-iyIxIOyF aFCa00y4t  G0ߣa=irOܓݓ=i=irOܓݓ6=i{?7f ;,=;?cP1Ξp2~:QW)ʑ_lJo7= .Zڿvyl/.8Qz&;肨୚`/.8oMgzk{د r}:cC<Pc.Y$HJ LesMgqoݥfnyF#Tc:_%k1YKEo+- R jVRR 4M3UjO\=OHT$[IJ @Lva|إ6vaUK[TN\j`O$߳cl1WJ522DUT*l7c%sqC.988 LEBYdiM y]9G&]ؠoxp.bYGoxA;Vڂz[J.ˋD 5M"eHv]\uu:otA=u >yP/ԋu<5GAxP>~t :B@}Yi!N@S||XT! ~RA,pu mԀ@'@]w_^^|lhZ&[@^liw\pEip][<;(9HЏ azl+-0DȥRIZ,K{ *iPhV6jlnb?$1Z ,$r*olӢo 5n4+.5mkPƃzРԣҠ^jנ^$L.5A5ԭu(Կ-G#y]C9s)ElJ-rM{omҸd +W\CPl֎mH# 顥}mcTn6$2BpS 5}kXDžٹ(!gO?d:dՈ'uTSf>J(L1V_A=àA aPנaP0kP0{A=^/t2.B.#2>ץSK1!AWoτ債_2A F겳^ŷQu;w[~/Gr^nwA![BSk#Mb= OH%%XT'aXM#mT777.̮{3x3;x3ll{of~7g {78nyͻw θtހ;OJ(Y=\mQ %Ie+'8jo.UuA|HiLxXMrDXM; %GjXMh)Иew?_Ah4JFͶa4H+GC3_o/_n˗ /V^xUWRU sU1hU^Ր ̼rj jW:pwNu;ɿlnv;h7z8Ov?N촂.[L~E^G'RL53ctmtEP]\q١.ߨ˵T^R:/)^R /)z/)KJKJ% ѾbS<5S=%`RUr-iZrެɋJU!ߛ7o÷]MTNԥ oUr8IߪJS*=?;r H,5Dnaia^C$|HdHJo]"]Zg]ZuA0J w: |ݻ?]Q"L-N4G| C6[9I4Z 46a.{M,SnAuה"ܚ0So rMQ&+0wM[on5G^nVt#ݪ6VٖI.~~l*w?m~2.;_ [.;_l.1dvy=M.K4_OSi%Fj} /]3~=C.gK ǿt“ O>ÓOÓ O>ÓzOdH]N n+jYQRAbWv+ hOs7=&ZG h.-ey.txJ7ZS%x h>CV,&RAQ 4UڻK% 67z3yo&A^L8dY7tS S S|MY=LY3LY5e0e0eה”5Ô5?$*sVXV;SVZ*>qZwܭ:w~wjrZtbo4)7=02_3n03̸502_3n03̸_]uY/zxYߌ&'r2H_ͺ|3 m/]ja]rf]ruA](tY䕤b]tAm/]b]`](tAw%M2븦ar`MmYBlTuoj:M^I6-X-vٛۅ1: cD;ojփ.iK2Qkܹ]r%{K]6}فg"khNM}N'$V,eEͷR. Jd.Z!WXwB]} yK>Ahgm.z*E&+ 'b+&Vm/u.]2ҭL]jJcdźR׺ĺ@k%HkeMJ]Pn[fWY Z\qq%]FvYe]NKL]ѹ]Zvin~ c?Ia/ݏ.%.VLݏxY xAXnt).]_c}l%y,[*j].UFHɫ_p] K~~h>fW)/n-3f=7jN4jm ^MJ*g[r ^D4iY'pR6BUKqjȚR=CߪooF_}+sߢsVP[5Vo. ]7KyRХ|K uWGT|1XX]]?|wxP«T%kÛ4F-J]pvΓ-'}2 I$]>O6+w]Fp](UK Ə'L֏ Azh >K$_"qbIeنkRCSL&~~YM4E-EQ*4QVl1ŗ>.[MÊ\fܗ.-!ye{9&!Wr`^9R53٬xpu/]ze]Ktx鲂.#2^j]IOϏuWxťE0_JO}OE)oInyBմ: Jfff^MZuȾff^ KF7t)~Lda:ޟ-~_ˁuؾd]a:E_kU*R~8oMAayM]m@ZZ/H8{jR P*hX|IcMV~R@0|*1lPϭUZwZ]K ʵPqOA$jX2A |J VEVڴ'Rårg'k }/Iu~[TR˦Oj?ud|'HHH>#U>#5>#T33R3R{΄AL鋈c*Ymƴ6 Plj#Ot}4B|dgg +4>S`( *;1vfQa|~*WwYgjεUkZگ*{/s vwߗ$3Vuc'۾߿~~m_}ľ?au/R;}}rǫUoۗ?:qDeyщ?3@X8kSǕФ AQjgm.>+'ZJU*vT?7/NPZQݥڏ{{{qy:yyƽggg<q~yy?? Qx|-վ?͓y_}fkT)+w(mSߟ9b;x]{^uǽ^u;^uW^u??}rߟwߟ˾?w?|sVMT{ '1>3ڟ&UXzc|5?~}>l΃REF*7ͽ$pK=ïfc`|5vs@#f4wCe /? I MU!#5찆0x,y,=\E4e!oA"_iFP[rgn%ME]{in1[Zcf0Vu%P ݉U]ja,쌏}O&x?y<{zç}ǶGӮGcӓӞGc#Scvt_TNץPPcZ 6Z0t,qͼU`ڇ_3b YFfu|ffX# d%U x$#,'% # RhFS.:wVND&¿Md"|639ڞ_^nSEWTRy|w%2.oxPN|;tހ;qh۝UyeJ{̮~LCKLf5G6z@5$И[leLJfصK%wS/b~34|5)7M1CSOZ&{׽y{׽޼׽uouo7޺___ o//>zbi,-L*54 ΍dWoW <7&]V>IDB[<=Io.ΫTiI0_u/;MoJK8-e|p>܃{WeGܮJ.ץ.=t٬KIKI.%]6Kºĺ.]Ϋ 9??,`ɞAL-| & S k\Hm[,lZwS54EMQ46EM_M)M_MQCS(v}{ BE})C*JS2>_*a1˃bI [ /v*;.K^.KUnC]Pub>bʺٞ벪j\Hv%v}syM7(tiU*ss[w MP|`R$nW͢b/a(@lX mK6fQlK,7m mWymߌG}.ML 9`^nXgVF%;u]T'ɮIM?]$^E1" άKFJ]dU6]d&yTХrހ%K CW.5K}K RBW.5K]rb>ę;f}"/5y'5w1A%#h겅 L[p_\5lzߋ[.[=\5l|w˯WoHcOXƪl"cE^AZz`nD*)u㫚fW!>J۫)MѾi}훦h)'Mr3겤cB{r8*6\y]2.x,d*" ;貏gndt>&w+A(TХ\-Qd2i7ڥ~./OetAt/]ze]KtAe]FeFPZӰZ-Qedx[-t}%> JVinG0}(Ӈ2 3}>3}#>7a 2}XeutȒG'ȇ,Y[)SazybUmZEF>&Qʞ~~x"O-['9.O.Dc i2- dž {x"6\W ٤F*d!H x$6q5,Pck"YOjZ_+*XhDWh&d.rz˥R M2~y4&A`J%ڛd!b pȤv"_XHO+ejT/?!W#Ԡ;f])dX*ꤿIt) u3]Kw꼎uU[& ud'؅o'۝8oui'rҲZVC'J%3,/^[M)])ހ;RsCú.$Nv'7=LJ٬K)<YlTl0^7Ҿ/2/ox8^ƫ]2iee|.v]'rRY4y>~LCKƋ5-D*)>>|l Jv Zᱬ0J+)/RĂ]nkT)`i)/M}]ܓ7=ԿI{I&j }KSr5E/TUjlZ)rj\)jX(H j ʖFOP&;4OP6%8A0A9oM<ſ4гnp4BWѷKS2Hv\H+ dߺ[5.+^,ez鲃.+^˾p_p8O jjSK{Fu%Kzј山lXWӛd.Oͪf]ʺ䪗{[G+x:YrmJl rI}uou)vRu{}W+0J KyLs0=hVy%܃,]>%Z{.z> A`_ո6_s=t͵_\+\sp͵_\;\sp͵kt͵5 >xu(d* .Zn^&p/-iR'@^W0c~ט_<[1=/>^c>.yuylJ1Yk&Bk՜WZMV `f/2ۋI:* =|Z_~ٿ`K;W.]eKC]ļbi&G눦=RQUrD[IcjϬrŕ5 o"٤cYxQB%Y >K3Ӡj) 3aMq'9'5'^Ox)UMI~'#B԰䰞O4OaZVQ-nfn՝7鍽v ʩ[ 7RI,WP˕S7S-WfQucJu\9T5]9EmWfQ*+. .كTYEŇH H15b=0$`eRCdc~&?VD!}|h#0,]3>&PBD`R 4X v*_NP'rOPTr*TRp¸.RyxX RJu i "d!)WLH/.Rڙq|$H)Qzdvzr]/fQtiV-䋔Kxy.KKad/>D%{lF$;Ҭ\qe/*5c.oƈiJqI+;o7F}zc<߮ 9oM{< 7= g+O+OÙzOÍp}O7݌to]$ڭT^'I(ЭHv$nQf%/kC*u w56Uj]c+<\6n-TVR7vߴKRirEj8pH g"u,RYN Ej8O"?]>8w=}>W@. :R΂GRiڥ,7r4"+'0BVZ^dM \\CR 4"#_E 1B("FڍRBzWġ s L-)2pX]nչ[MVVUnnչ[5VVUn?V?}=9'kfcf|L>,~^*c%pp̰p11^  G x-3,#,㓅c hS  bS Z3>SrS$Z=՚6ޏcMNXn%?.#+y4 TgRJMw1ǠL]DPaPK.ln8Ńz܃<=΃z܃z<{PM<žME^]ɨ6K*Ɍ$+T9;5TA c#Wد~*#{د~}ܱOewĖwj}r1 .4eTR1Mʷ:T4@c%pcѽ:s#q5zSW)j8%!S+N?K9p%NHv lc s*uuVVkfYhi^]B6!lsO ,PMYɥgϑPU` d-TïΫTg[&f3;oQ[REjr/ $tWeH.o.[2]WtG$Iv}RM .]覻К.twB7߅.t]}݅wB.%@֩i;OD!!۝5X&Ud|ڇW>QǺj,}xU4k^d*&U/VޗT*~t m_v u@tN44܉KgM3㸝<;2˧#5L2N Jd8np$64#[(S$["f@)5%=KBʲRޭv&'KV5i*Z!QZγlNuaJ= aJmRRp97۔Ya8:~fIrr@XoKހus as]>ξHRW#JN.O(lҹ]2;nC4ʦcjK-劫6leOĕ:=qv0 !\!H 1ܨ;O$xb 5JήR~γeqkR :1K~}EEɇ(6j![?C,ؙT!>JojR ~>iXeSM`ZGi}<"$6Ud _JFk.?3?[Y0nΫpO q$'~jwԥ%Q_$t vT++J%Q=ԭ;*e eT+.ܗ.j_bvGjwt1WJWU$;ڝo'p.Uxz_KnpI7$$/Ro嗲4B[,#x8i|U#lE2.HB#B@w^G@r#DX$;sڬ\q oM.-҃.K K{҂.%^K Ouy*rGjǼCKL~څ/A1xTpS"Idz8Yu MRU*~OaNe Bʵ7ྺU8_MDᦔRr˔W exVH7j>5Jž)ŚhU0, YgQj|7j='Y[Eյ}n|fvѫ@0|)R~b#,wj*ȂV+L*lp\qT!>J +)n837 vǹRa,-gw^=g-g7+Ƃuf /]st>%RՕ2]V&;RecY4 łfiP+gMFyMY-K:CKL W [}l7 c)>Un|\qR6/fM67c:ﺬ~neM1~˦nۦ_6輦7ß7'ß7;ß7'ß֒Doχ0ͻh˽2lG o-|٥2>O^wXk}a}>{}>^>o^'>׬¬ì^ zͪ+̪#̪500Ofs%&z*sk@Zz`]}%cu׭@Ք0TE]csu@i @46p_V@(h}Dfx&L4y&<{&<M53hg"e0s-m~ `U.e[L6iFmR* 5Y`HnT|²RAX5UIW?_*3X'Vc>C+< {V"\Jewn@lydFk+EhVG Xq@/DQν4-!p8vaV I|'I;=iSOzWOz~𞴩'|B=dI%{ҹ"r2rz\cBlyj`5T.o-oZ*hX Yɓ\x}2hL۲}hwϵc]j`i)T}+.g~xdtPVTP ?@4B@TOTEfz[]A0| 5D% (_S/b|gl a @|- >CNv1=2\+Xwa?凩f:\Lh)M5(.aS. wWTzWęq6@P&SIN5' |rPcNVXþ=/E !R Bt%mfRo|O~Dvb"%fwY3T*_cQLj)ٶTW_k|C˺7D/}Y7 Ѿ/+˺rn?mX\D]0>؎s(L:ӥaۦ7R*' t$A)RVzh=?`wJ$B(}|$Ȅ 0r* C\4ahO_KO),4NӥjKKPq/vx~Nʩ)`%b/87pe\!Hа̥rLU)qS-øU8t"K|-P]福\ nUZsiivzvcwX:{`Sc $N~πm.=YѲc)նGmXgO۰RTc]>RmARm ~++Ȫ~X'd8!yG€ a| &z( RzIKF{௰kӫ1vmRmצR]L&Umf|5[&VOMCmDYRf}m*.UKNx<5q=s&:Ϣ3u3weGΓDWdxךﳬkz!:U*jx=M A5>7Oi Hi%=u 8竑NBfՈ/ذ>!_t >W]爕~f ~O ?3|'og?:s% ~{yF \K3qO)};Yj)Tl.s2gDjL\|_"i| _H4N\3K|Y|eI5>z[x6*-ϺS.Ar=R`[Ϻk?齞[_h얶TPW;~.jMJ1ltJeU-t>$sofXkx{sz({[6y KP+`(G\@P *58"ʒ%[&ٍb劫kXFIO"`FLf$L;ʴv09_;Qi2`Z~`DXG|#>#>+sP>;H Ge7>J Bȡ/ }q򢗠bKqU\A~-=nJ57 7/AGPKR$󗝬\ P_ v4K|?F:| P2^䑳8}`ҌFY0.+pGoO/hbR6,+m1|Ze0Tcgcg㱳cg㱳sxlﱳ߃Og΃O΃O߃߃lkqhzv;߬T"nlg0SK&ٲȥ'?n[h^^f֍RѬҍ53J\SVZO-&}`}s}`}`qƻL5;%/6(Ҋu^*O{P M/46Ns q8%Q?N ?k,e|b)-?Q|$q،kf폏mmb_/nlmmݵk}[c/exfh<7g~2~x6lG*- ky>!DpTxkߞ6c~gG=xal/9g$쨷?H'pkTmCڏ?7mO}>C/ɜ #'FCmX{7D-bu]R/G~JRTzˁW6ho^jE%)Eh9p7DK-%t[&Kډ,i˒vbKdI%ݖTȒz"KeI[n%!:w!:Lmsp+YcᶻTFQQ(Z=nEwQtk݉GMhI(ZhFў^hϷo'4ƓoOh<'>|9 Mui |>7M>/!>O)O>BxovG?j U*Ç~u\77ROC3/R_O)cQ@DxOjQ_&U51y~G9 uO) ~Ru>*"9/[i)c%__?¯ G?5pdrMv{ono6[IeS~"d;m'),VZJoqR+}.\wc~G€CyNT7sGʳXġV bKR?RcqK5şv?8/\mT,1vغTc O-\ꖤM\kY~/?(-L+̑څlod!h 5A (9\!Lj]ʭ`ů aW sܜ.@cvKU4<  A:-tewyw۩Yu5[[5R@K+{ÛrTN4^&(3ٍ wrJf%' h hwr"/oMNN@ k _hAD6iqBV=Eh"837cMVi͟#-#T%Ӥ aL-?VwϏf?n~<`L0y&Lx&<{&<4 =L =xƷ3>qxGa_>3lll&&&qOd'ٸ'l'?C򢈩!vnNyQS^-C4/JFʋ"za|5W'~^m:qRm!R~N|ԉkKKQ'Vޓxd<ɸdߓq"'w.A=%>T4^^5|ftzs`!LhiKM?6&`r44_cc cмǠc1hc1h4cCZr}䒗b[ `br-1X5ud]\vcM^̨ N]]@K~ w|wD`-B0 q%\/i>xIKZ_ZԦVZ< _VJ[2&[`m| B`Hgs TQ_|R`D0kIE6zN+=Y>f=ύv5B(|y`kCGd(RE[{;)LO$ѝ% $p*i{Q`6ֵOjiRt*DloF#wuĝ&m5 @?V ߏŝƥ6۵IT<- :dr|%9/c m  a:d-F ]*ٟkYԝ 3+rnM5ΔTQd4FDc Q'ڠ3vA|sy9I@EJ9FSfrb$RAu|H7nif5,+\HX Jg6$V@ eAƹ@:d^~2*R_dK=x.kR4)Vf$;MwHl8  |aRKMեp ï \Wb~!+1rï 037X7G,kM T^_K(5h !Re) N]BnSSk@SW.ԩeB&ԍ;uN]6؜mNͩ9ۜ*Sfs956T/7$#i*e/? W(M:<>U9p tZ ɥ&fM } }~o᷏o_C|pM`B(?(W). Y N'M%VG[REZPiAi/E:+Xv+҂"*sÊdĆϩKCPHr ^—,[Ys9:cV7F(hQƯ5_߭ߊ*{rwߝ1\nqwqyyܭ<{7;-R!-LgjUVp@IK8]V˅ҥ=*ggHD{冞5aӁɶCK 7\s9d292x2x<{Y< C{9'EvL$S-EN_K8#:0B0[1i{|8_>WiG{(Ry=~ihx.k@\M 6]U"aÓ RsĩJ٦ .2-al-UPIcLclO@6N<W@Pz0OJ<7qKw&UR75p_b-:6-LNQ> ;QNZ @cT֠SlD ujԺ @Qu!#^JR;W8c_):Gxb$@Չu+Wh%Ed{@qܮeXgU<7l 鱬9Cpf@vb?X}0]\ ~>-)e*l/?(T2QdL΃]uF";IrM^VJ2CKM7@d[ CԂɤ Ah^NJb/Q<[?h ~a(z#'gܜ&uuEKfL=]_--4D__i! ei-4rFB#gZhH\aRBcWZhL _ $!{G)'yoŒIl 6>!DWV[*Z xSMj>_l}&ml}m*4^qgU* +n$;g8.[qOM\Mѹ)&7EqStn~7EhnMѹ))$ZcCGXԴM~j@qiSI/-4yHX#gb3,JqG F\ !ҖM|R=xX|I-Hײn !jjP\: uռpU]1xF/C#jO͡^CJe[2*ؙgNcݚDpf Jج)`z^-`;}R+Om4>Gω3Lydin?ٷj?gU 짗v7sIe ӖRP~ٜT n=%l [eٝǀ)>u"6!.T*VjbRMk/9;]ya IT߬{ !?TcgBlޫP =xzLas~Ʈζ-JȞMj.|LO7m Zz+_CDbiKP5sKH+Hc~ ۘD aۘ 8qs/ƗlAp'c>"Aii_V*'P˶`M]jP ihc7힘s:54(H۟ɇC[԰mFǀ]%\u("x:[w{Mt_!@Y%[[ʮ(c~ܾzB 7m_JKIE"eE1BۗhkNR]yr5O0 AڳPVR.cOjz- YǠfk{R,H\\j󛝄e/KSGҥ%+@|hpٳRggkO6^P/1LAx<.;yzwyKt);SZleo0B"(L IcvK9(m/ H-=1ʇ/j1fR?\vco~N[_|vXg$M))lp(6 $L?}g Qd|  3߽‡ .*Jꕆ@/q?Vm$Jc~~Lc~l~lpI(F QR$RH.,'Dgr|F=R9?.cMB54A M&hM0 7A{7AUVÑؓIy l 0E^Oţ?^XX#N 9f="^ɈEV+'hY.XˢQ$zJ _Ky?hTx坎 Z6Ybc_Ƴ5xϺg}k<,66}ωkߵ?7ksO}~N\kk?{3g+7Unp _KFtUc23TZ>!7i݆.*5gdʾ3|:UEK ?oXWj(6SD5<2v̀OyCҰIT!>J&i`R~̵_U^LH_3~;g|gH#`S3)|m|X?M9O\5 XUO!j9ՈwTYO?1Jj= a99VnK*lI-ܖْ [R-%er[RcK*lIKKφ$T$D&JZ)`!,( aCYM H(砅$ V(?Ig>4Jw7HeISɛiR (c~ OōrM9T\x*.T\h*ΙrOōSqyO>P?}}~>Pwwok~ʵ_گ~Xk~UdPddP_AA A}M5L9L500/&?K^qkioCS؞qžyK2ff%جz0ڂYYe3bդIv0N9Զ3ФH{)>(Fi/EHF^iѓayP4"\܀.R+WZ= r0L2ËSҶȗ@u,_Q7hk]ה"ok(\BrMңtPyA?XNJ 26 %hV[|@Ċ[u#,Fc}䙳%XKdIߜѕ2 7wd7'UEfsW==gtR`dۥOfە$) }/ Wtt@vDȴ?bF7QS"ezX15qu>!h.fMͥj]Iyc%O|6y?bY{ҀT! R ۥ] hw}%A6F :EJ%OHFjBR G)du.k?"vud_lŶ?e%/Lxc Z"g%REOʐec KA# _WXc ;(RJU _z)gh!؈FL4)"ݖvVDR8RMJtf& vvvvڮ5Z۵vZ<&Z;$Ak;Pk ɸ;.I~z|R dMS;@@5Yrnã"&137FQ"vk+7)vNkHY7m:p>O'fX_" w>oʹߋ;5K5rCCK>MVz*G?gGjΤ a0w_R6qqDo($B6x6D@DgI;kR0[K +A3:{s)e*L/oo#4mZHr"&م!@yn}W~𗩳Y}VRt^ޞe]y>stB$tysL>xgB.Z$TK&t'ocF7`bl30Iܬ%ŧʹVAl3l|56cj)4sih6 e{T6 @YFA|[8`arp*hVC[zeYM}l݉*hVU[ìZcj6Wƙd.gq=C˸P=jv"YTS⬰aVn;FRqr>-~UG= 2,>-jR_'Eo.Va|t. is _KB` U*ß'.7K ?1 0 ?;n+6 #gj_Pn\m%C\D?х+J5'(oTդ k6'|5_|%>ܵc| - x&6{ecwg9HIhUAb?LW  +Ґ&*ZjKX ,iЮki{bf(ݏCO|ӥꗐE 1~|K\RWREKΧ)\B?!% >K|ك_ruZi{ AvT! RI8Txȁ]=dخ7+5ęib2&U?TЀ4o՛EE7KmVza(Y$ Y$e5B0|)4c9gC6}  xX?j!JJƗ`8#| @cK%Ayc Ԓ?J V~P/>؛|4T29BS 42 EQ.\l*D;hp_&d>)w++J>0d-Z&Uh޵]7u=/%o;r>NeR\jinl|5v ~Kn pwjhϩ2_?XcwDz.ؙKßT}\n _Ug5@|TQ|*V:ZԦVkX %"}?!j}J5犸v[(}-kc Od бs)e*L/?(T=uM<~m$ cnFv.uZ ]2?+G1?$o8QPl{uw~]i}Yơçlwq9y1Vo[#   >\C\Zw̥15K]b'e㳘K뎹<撠>Z\I7w=I9 .7Z2i 3&*Z x.U#×?)|IXwO 8ޖw~1>?[/OL `LC)nIۧV,M_q%CÝb*!z~<.;V\b!٤i*u83!H-=0Ofd*9DjmgLLki _ &0S&)Zrd5KzRNh)c{H/gkeM-ߺΧ}TcS}؄x5Ә8+4Vi( 4$A462Mc>QY4Vi+_ܽiF-"P-¥x%MM<[R`\z^\*(oF:,k. H-=l*/$l>׼ nK _{&<8@b<ϫ *,ldP&;< (Xg@M a@rj쏦[y "C\fZ݇g17>J%9NoW ~(^DWt@۫c 9'|~yߌ{ V rKwhr9 ,hKڏ^".C/Cǽ  m^.^^2T\:u_9wbAWJ˛r=Li!)Ne05*߅y"-$G2av )Ms/#RlhR ہ|5ofc_WΓEK(n-?(Tq|ɒPIcɽv^7M1ɨ|rMhVڐ~{S ~2|Hӓўh-,\*QZ(6dâ{)EXԴ nаCJ%^=&˜6|Ԝ˜V0iisZmN=sۜNPҠ.E<}e&e[?RRoRFoF򋺜8P%0\j@ Wd!g$7$C;d&XSk)0NuG.thʥ?B? J(KPF$+Տ:MKWAVMxdr%K.CsAy.]'L5](tuxCE_2V /]G2]q6([Ph+7]kK;EL v[]6.ܤ8({lyz*o(e4/o.{ Y oj2co+JY_0^bNqXDpsހ;lWqt^.XTD+Qád!L |rPcqxfd sA*hiCd%R3{RƋhXm$t9:J.-WǶ3UE|TS8.2ˤ Ah젫TkW*KZuK_)4^Pߪ/EnJ3?W9Jsހ;6EÇv^edW7EՃ|Zt찎A6CyGgic ׺-)[Hے2[RҷK2o%ă,ߖɒX% !fr):;\b) GK$&ZR *y#lFYns;lH7Q25KSU {S}v_؟E) ? iJE<`MW!Q֞whaj8bK6,0K3>L:ϘJ:Ay*G )繕 A@ /]\I]s|5?#\SuR P~P/@ucEῥ\quKwԇGޒ; x9N}̾LvХsvR6BڡKَFINf\}w!=?j LjjI8S_*j8I4Z xf=2X.31;|^fT+^eDwˌ+X#qxMTԔ(:V*'DKҒTAt+1ӓ+?#i`ax8=*Fk?|BL~ӸN.iФ ilX#/Jn#Hݛt\[_.bRۅ㬹\jf|5?BsaM=_7v9 8 ?M?y7\*'SxD=loOH+?U^$m(vץURǽlu>`sH#Q1╯!NtAH[&U?a͈nrFm.b'ꌺOkQ%bΨcj)th\ N+ 03f`M <2٦㜤~7Bێ1+xc };&^}Ŧe!n.^0hT wuO3rʛqrJ@kxOnw_ _v7M+.p[EɍW貇 f 5bL]\7cQ Hz~744h w|t4RMD?ÉQ\WȂTu6 PI>L;>#|1BR ζ]*[a~ oZar+̻淭0?V_:)H' wd74wi> AðYT(OͰKm&:"@J&hn/뤉w p}XZjV}5G5/\;L0m (b("R G'"0>J%E@T[xɯ Th 2i| ě~cqjSS /]E-EE`Q+XzYblQ벨آ[¢=Q/g MA O램Oԓ'uM3Dx^xz~ `N(so.b|]n4Q>Յk ~%1W׻3~گwW̵_o\k޵_[x/l1X `u9Vv DZG:3EhmX~O>,}\kKGobՆP:tݪ<k&Oһ OtY- PWRc7~? g|I8_|IDbVx+VCeM]=ջ1'l7@U2ݻtv>!CQ{,B'SX#'Ol?+|d? B2O˗LuwXxyHt7@)$O`-<"px|G~&~:GǕyB`ɋTk7*f_gZ.ptYhz|uξ3y'٤0AƶR; ]dxE$EZ4v| /HU%.^zxA(qٕdCYT0m2IlPcI#9+PȞHYo٦ $dtzUJ %%ܝOII4R@@S-nw qڶ.H-x(ʛKz,U405ɖ uzЍG ϠGe- H-z&U*[P][Yrŧ9Ϣ8R#͓vHFH$'=ެB0j+cwϻ ~ow7µ?/IӼ'"?C>h| Qc:.| Q?C4>(| QP ]sHx zo )ݽ ;ot/dB*_j#yg=v>!K-6w_jwc~\ >r)A䏦}W,n;RvRgB&`<X# D_${// d@Ȝ0l zd=M|5_(j" GG'W'I]]ɦ7Tz*xcBX/;: :nSKdru"ʙ:gRiz]?h7u6 D}]B8- []7 `VX##>;hJAKyfnU\f8k)0.]Я Å YBrt!9+]H~_Hǀ2o8f] 1nY0b 4 X?ujH5+.x&1%z LMV}*Mi!54BSKTRNDEzmkmW)l' ㎭별&UR@3lyR | B;W;3| йav_!Ha& yDGc1o"s0-Yp=iLJ ?? |~ } s>!Z;ʍj|.&RQ#ṼkIj0Jۉx5 Vl|jP+i) #]*ߜ;6ɈK)ʛDζQѬò>fFaڎ0pkb+ XVڞ5 "I>$(/K`t aMKU#]G~M?YO/_'#bH3b_r`MJV~@@~V!cGmY0>t8wR+*tp/\vˡxAUhI5Wrܽ/9%ɞG :5`(Svz>-vV1f*÷kXE֣ut~'@*iT?EO.q~3UQ#G~wO4%jK7+?tP=iESӭQD* _cA|M7år0yΙRlJej/Onjڟwۢwo}ij<׹{ow7}.CA&ʔ[Z@o;kkLL*?wLDkZCkkr! !V5D彆8?nO׹֑0JE *W qtF>RWH&qQt5>z'! ÁZOy&U?}zc2>_K `3&䃹MLn^nWĨ/Q﹫z]sWsW幫.9q\z )PD}Q>!]+FRHGcc_V 4#^Pq;6x;z؎v̷k˷c$t9{ ̒%b!ִi(M\> ^T!TC3LJ8pQuYVz*tpqM:\:\W-8Xn_F̳@DX1EX1 Nag2"w5a$n:?SX#/D QG캦*N-9Z 4E;t?ߵ ~ksg|~\µ;@#ŶX;`yd;@#Ųb$21 ?j1õQI`E@B|}tPсIW-<{-=]*"縺;w-+E*XyxJd^\o]P+R;$-'őh-@JFZƗeJ0VJ b_KiIGV#˻R UJaM ӥ2VTqWH+@yRlŋ,0u:U]j=h.5o`T6ol<3x:O<%,$2nJ2Th^~PP"x^bNbN'-)2\N[Бl%% X_{I̝_{InlKNKN{{IWZGS:0L]" e湺u$⠅R8ԩL%H} ZzO'ܠ _d"5&M:| tki3C-tḔ2w ޮxE- ::aQ\q<-bH jz|隩MC>@RdlyBXg0V-M#I XvXű.B)@˴9| 1ߢdr-|aJIj)XR X"r\ ;ae_E)Rʻ</(A{쭏ĥ6dAqAb_ԸZ| c+nrBV( Vs \bV\B.\? /5s?KuS|qD^^P Vُ frު GvuWw՛wWHh>UCzG cܽ٨ӹn]tw|A8J.5x䟡FxG,24BKW/#| Q-,rUݴ$il.[(DWRgEC,4If4O$(G#4.&uyUT nbaܤ r ӂ Y{ cSb]R6^Pj<,$hweg~1,WUT~^o{.),URW'Zxn\t *iеTЀ\G\_&Q:p0[W:):בwj8בsU\g׹ΒYO{Q=|O\uZ<gs :B#L1ݍ{ha5=vn$;w@ynE~YG6|sp0m;FIۜg|5?{$,7L]k1Xb*֓f *"S)ǕX-wjpc-j:YTna˥ Ybc w7~muĠXkQUJ%ےq3B0?c/ ^0~HsRz-o};Ģe|FܥI@_X]ؙx+T8 Ema<&Ux*U.Bnf~@`(*ghx7\jGN'[Ia'nBarB+e*4/d؇ Xno43rހt? /+@3r}W#+qR`pԿrH0H٘0-0^)ѽJT;20٤ʼn[XI\b05z¥i"l>KٸtWϒ4(gkjY3)Y]*|KytDzTХ;B|_et/|*F})9rހ;vД,ƖTPf?,":vo' k2>L:̳ߣgKK5Q"7us~bJhy?cTJlB{l}7HJR 3lLELCKLb4,7B(aK?GaoF)GaoF) ߺԗ.%R.K K}҃.5R_ԠKp_pD#ZG\=J]#n -*#dfNj&1 D_X'E D_X'G}}f_^ )|'ޮx_aydY|Yy?Wz[.Y6yRur_ʗ4e[]=/Xx]jp;2neP2ڥWjZ+pߡnۅ~Ρ;ogt< 2ר.uctu֥fKe]vf]vFr'sd.KW\xA >PCySrrc$tig|݂W Ϯ )e/?[ *|9Rb|SB.ʁ 7_6փ`cec5X6_6փ`cec#X6ֿrKXohYUʺ)源G|n8E) .5F~!ˇV85@)cM~lo4)Euws5yϱ{ur2G by(&1&E^%,kQâE}}-kX簨E} d]fG@70fzbk 76xw9Nnm;@Zz`*}zHOY.Od#~&~ϝZx.ܩgzu͝%-ݝЩ7w^xyW<]7+~f ~I ?+ ?,Kʷ%qP%%e$Uv,)K_X0ѻ~iz`8zG>0:z%7 ޡK"ىޡK ;BWίy~~5}~V>zxjo-.2_Х.%.7tiGt}gvt2 ҼkV.X7kYb]~qqqg׸%Zk\yMmV¤%l׺ua z y؟& k]Xy]>Ȏօ5 ?LjOA(A=:wVLUyAu$#2="eL[^ywԥ#={ źh`U^PͽchbЀ\€\_r22_/oK7K<ǏA4KjJSWS>4uoDݥVM#̪ˬj0̪̪ˬF0̪}aV?a˔"o,G~O(E|iVA x]ۥ n]ƺe,n86}KΛd }V˸.=CF5_DPGk9d.ț[f5~dg/2/&]mCϮpdK~Y-=yΕOᏝ˥V!RAc9K% qc!ψ`VӖ c἖uvYe[A/M1->lQ!'{6MK}o}cT0Ɛzq[FAJ%ԨCt>|s!}9D!&Ct>scyl!$hᣴhf]}J5q_(¯|5ϒG'M 4Bs>!ˇ$O Iki3^N+?sU d'7Ec؛ ~sv|BL~N1 RA>õrM2 *s|I0iV) z)>(FY/EB c7r:ZO|%gzwMq|BtUrp?R)gX??_ } 2'TOQQ?J= 'D 'pګRЙTI;a ^ J{~z`z`q/W/{` fXtXP%U +eRK'45~ä l|5Q4x%UMלO Fֲe; QFr2$=TM(6#-?Z V-Η.݅4_~d EX9puMI6뒓/E=rV+)źh`U^P8o[4JJ.Z.q]YIV5Bf%ج6UOdV=]f&lV*'22}b01| G]h-"\0.]vtzkH4@`?*k!Q2~%}U?SVs&UojR ]qnye{<\Y`AKev5QfRO-D+?ʬˁN.3&]55}HL pM\S{\S{&Բ5Ukj-V9 rն`yF˫rތpy++:Rʋ2Kk"fI2miWV^ewǠ$ BZW+-v&+9]8|bA7*iƒudRa)_RM<,e=,eja)Ra)Rw r/aV[2w ׇ(dC<#pB"ˁ ;Ӻʈ kV~DYEe+f]t k졻l.(Op36] ,+'d ]$g5[iG-<*Ք8Ѽr5;DL:jRA4VvyȌy Zz*͎mi#`AIKMp,K/K*j,K/Kj%8q^.-iՔbMI>`ͦO\_+)|4akzneQPڬ#B,MG#X 6 mjiBndJй/L Bй/4 B}A=, C6b]Mu(E*XjhF/?-!;1dT>!f|?WFۤ Ahi\;eVUCiuJ˻V@ȳnCS$ zf%7x7e@DCTL[)Eyέ_Q/E(9$;-"/㎺$JzyJ],V'^RuL=DHSՒ鴃WDR뙽RhJg^+kƧS[fhe tYvBEe|Y< de+źh9ѹ6yi'e lY!^tyo\pD?ysOEROnJM R xC|ڟ>?1qoW_Rh$\W/߄?/Eq&7, >VH5 G*]TЀ`z q>⋐~K^5> \&-3R^u,yj΢`S4ڢ!|\%. H -='DV>deI]*͏(4 T,|87C˻(! ^88}lah]@Cr]MQv5Ak7TjlZ&H ,8ao0j#-(8+mRdO]Ʌ V/=M'.r5ȮJ 3(/%^-AQ^\UO0 &]Uvs'Dt}+$Ѥ AhA|tG'޴8M D;|B$~fRqGW|9HBͣ= ~B4fٶ(TrP;G]:73>jU7ԹјT?ݱRgH-eQkf)C?A)C7{O 3 1~2 ?oCx!mh64mh6$ w ކmo{_e71aڳ@ >4UȳI(\m'ZOV*H"wx{  sP)Q=o XuBmDP0w#/|^/z_0y=̟ycdH{4&*jmCw7+Z,~ /G&ѻδ[H[L[δR绥nRgRonUq'LjWwRHFX|ſ&VA t %ݯEޏ/sgh=א;oo5Ľd0h0<~\F2/lrWcrlr!F(Jze~,둖JzX֋eeyY/^O/x 7? 0UziR Z8Rԝjj[Y|ܹQz# >>wKUoEkGX MSƋYclH|r VMX}Eh؊`%Lӷ|8_χ^3oz>z^z>y~=~=gufso1VcTq;6Klɖ:_vKݒ| "TϨs"OI37yx 5ӧXSCU"DK`DV@( wxrR JL]IW4:ʍeYE6WCAցp[%}A_Q9Z T@'GXg&II3LK3LZg*LZgRx R*Lj4L'3I"*zIC 1#֥+\[X,nv# ⭊|5ߜ@\"& SU-~Bޜ@5Dq~sJrHlJS.)`)1ؔ LAϐؔaJ#9P^!x\{\m x51^Iu1|_J0|# --kKo{4ĂLKc97kk>_q!j!'5-Eƣsu̠O:QMBq;QSJ]:^!:^> GX3| ~e@RqӼЃ_b __A"/[mJkv o@;k@~$zz.S\.2w{fx OedƟ`ZUТ!&Xf2 `sb0Kg(wPIJrnբG?:ĉonAUu.:&-ngE;҈v($VOX4$ Q>a鄾=Cf:erJ"֪pcAH,O|ؖt-a{t&^ǼiB8l{|>lm4KJ:oERѮ]5t:`%Xa>|8p_{(@ӉJHR‹W/Z`uIjXcF!<y:LSOөөt꿝NS鴾G_UDoX X >C[ ͞|FW VE3,름g&H;=3w#:HlILW LjU!OIo);>o$~MLo5%%RۍiI$ݘۘ>I{KEIt-p%]͇೟T%^4GX,j@:̣=16IDB;.,/[3< yuh&eQX'tQOpT߾`㫚XVN_<ڜ|#KfFL.: &(kcs[\rٮV CdP"E[K_G_)^W=:u:x%Ɨ"ik@ksY?G{k`|Pˀ1|]ORuVwXB+\я8{״QoqGvsN3j:Ċ]. 2Wq']kBqځc =u e8L*OoKU4VESRMZ޷s p*hr[] \al +.vBH]M]"F%է2ոwB9VM,rٮ˽:b}KV[/&cI MzKZX0[`0`ސZxu⭊UVBH ilWHiNKmklb#i %]b&xK:$|0ܪB[q(nj[;6I_3#sF\xd| @Y\RcnŹ|겵M\CL,;oj' O.0X;2niidhz@_tF.+ڇgXAը_V0MpwT$ӝ" ? +•sWcƧ油{{˷z*qifZ4km4;q<p )8a8Cqa00}Eb;Vyb4>%*;ET%\歊؂!~K+ï/oW_ ]aO$SJ7';)QD}SKΉV%$;-ĚZazŵPķ}.U @Xƿt0|[DuN)ϔC0ns%rg1|wܸ7{{|\" >%_k).5\.޿?v>&FgX) ïͣ+:<.R ^VD7R`hUxˇ"fa@:u)|Jǰ*ccRt *t {aTMld2-͠M{b jǤ:ItJ8hFH%g;PpĤ/ugV>1;yN|`umo|kyk1_πng%fKkx@PPF Lݮ:na/dz^u7鲐BaXеHbZ[yG0u?W&pô*f)pFH%p_TT33/\G, KlJ4|R ֪xT?9x\qE\/+^:w79XsYuW±3G%J Ӎoc[Vcza%ڟܽ{ eJ_ Fc qi>zH>[ RI_^, 9)ިߔhpדD=uuS=fGyuD"vfhUSbHf?ښ[(v}f?3:9LgySN㌱+" ~։:;⌡?T;cl4 {xkA1fHuB潗·5,5):RTuq;t[ ҈[TJ(,Hb~丧$s?t^P5UK$N![)Rہ]w'?kPLyHqHimcS]k>3pWXߙ BB߅y!/. B>[JQ@E[j |>0~.gbQja%p#c&:KY(Rۧ9?؀lBvwp㉑A'EZ!=N$:VGȯehuh|JH%Qi$!DM#{a}ơMaLܴa 6ØAqA6]8q]$ȵL:MO Wofs$-*[Ӫ#TkpÉк8.uSx}*š{q܏&@b}#ުtaR%Ó7q?{{O垱k!\^޲ޙ ։[ Ë}F3&ުh2COؼ1Iy(hL}P(hL7 >)1u1M|_1\}ny| 녮4?$c|c|q lHoW`uuz`w5*t#9g~7N󧧃gǸ /?] n-6>ia;a%jd> q1* qKN+b6C-tk} >xf}͜_3Y5sk_3f͜kF/k5s`@b[Vd,Fȡdx٩&*|br@8ꭊfX _ϯ5{?2D odQ|Nե*AUL#!{8s/ȝkqiKѪ"gR[6ZO2Z%별/Z, S%\Bv]Ƌ%LnNeYn6 3>ڋy $:]u\:^zAKKCc#ꑐ?BtīTea^b"^Ɲtn8)5T/ x(]BໄJ%%[U_ĥ*z >škMC6͞k w Oq>pj5Loo=*| nS2IdKGeG eD;fʰLji,ɮq:[˸]3n=jui%c>Ave:WR.&2nES *5z Z'SUt:*eS+k (UpiŚ@ &Wz:֣gIksY xT8{()>H9ͻmzʧ:G˸x4Nn؆w˰ =N(.VшN!pZ#Z"|+;O4g[˜i *uV:Rݽ} WGo.נYWA3,g z! MgC_ϧzƧD^Ux Z,X i=EļNA]RxPvSb=U/;\สvhZ#dyV us L_p֡r:颺EwA Xl[QM*'R3zWHY) 3/\& }9;OYD~O_΃++לtJ;5P랪㰁%|J8]zCHRPraA7 4QЃIѪ8lgT%E >šDVH$޾fjR3|y҂/ۥ*|yZ!VG_߹7ZH;VC<֑/+w.U ?- >NRz^>o'S9m0:y&+#_mQAsK)1ڦ A4Cjkk|5߃k'4j𪏴{{h|J=5xg6ꃏ;g3ޝ3x3xwY yϝrSfve@-s-|to5gJeӪ{*.U ?,% >J'[b)fK{c >%J\_\(&H!R=:2}Ta\#6>š{?svO/ܟ<Ϲ&$| >qoUSbv$:wY!VE-r 3pǥ?G̗^5 c>[ ~{f% 5q3?tMd{H wq4#HsgY>W?Vb+sNR[[>[j#R{ } D}+>-n->-WVh7c7B /oB7QvЭqT%֪hEqJؐD&y7sy(ay~lΦFa梖DjYJ+V|JR!lUm>Z>š[ĭ=H 4"-aW}oުh6!߲1yϼ۽@ >53jn.98vLEV&FMW2 e/RL EzΕM:xv5M;~&v3JyJnaoWƫf]x۴`ORD;nI6SpӾM;oN$4X>";5ipj*w'.u}|5ÿoo*jCSBNE2n.rzHL1>Jo4U K_j3@~𗾌[)1#Эv—J% Gӭ&geZdhFB5/ MZ|kiy[#k5p5o$t9鈺5֤߭+VaEpDmD:jp՗tDmua9ዕF NT*@fR~R ֪h}֮ױU F,lRnR}jjǾ] -3]e~ӝvRt!'5vgO}7ֽGC]^%va%ZJZBZh| @ hI0SUX:fRo(_3_A~R栏RǾNW\[5?~+_Oj}f|5T@_]Qiz VP|o> ~wMDjR8~U`bp}Z\6-izjv=7%Am\e܏.ZCb\;X&.;Mݔ;ɮV[g!ٮK}Syo&ϸ$;$Mg47F{ө7ԘعrV{)!^PcD * F!A8˸.ޱTרMaŤVYE+7xOHg~F-(}匒54!-e:܅#NfjTc8wtCRIb6<$;R^KB{ HX*MX pJ"ǿNxCbIE?ip ZRwG"NL*㯖j_H-q{k8_t#YƄٌJ,FM׺&i6p\ô '0p}:CCPDS2MOB)ժf>)t*ƓJQeyMŞ*gVՑj&ǯ=ځKMY*C~iE=%$Tޠj1XkwETD_Ah:-}t(ntjaHAF+{xϤ&1vz}f CEP}~*F847$6_ۍ'Uؒ3w'M*~ּ-{b]5 e_jff)S?j^Sj^'k~EIA1JW bJRe0"|0ߟ#yב;>LǻjŎv6wf c薾 R%32#Kw?{_~of-xp̡7xK0j0;?̓a'צUxYi.OMe%&5>RkM? NH߹A0c|3Y/+&>!᏷_m?~q$:It8J:t?N#D%DǏL'ёNON7io_7Qc+W|(<ӿfSXf9ۃSx |J$Oa|)šgR[i!Av R|)Hoיxm@6Ϥ6ۺ/a)5!^].E΢/oO?_/Ÿ [p1[uh~ի= $k(;2u(os3ڋUOA!I[;Rѐ9b]X0lEDv)bs=5FQu[ gϛ:g<ߗTQêL*uBڝ&ԗswS&ɜ NdI46bBbWŸvex>h%N5k NHo%`6`p#$'3b|p? b!o|+ls 5I6zų2n}_6m~d'^P66?6^abjsVrzOuZnSZ L}%+פ{~J3 wz^(Rۯ}yA >w%De7>Ç%VKj~GGi1|}Z{ls>"˾#֊ʥ>*-n;5Չh5#1*1pǐCz~ - PQ\ĉ8J$l&TP˟rp*i+jHu nB[TU\n w5*,K Khzvݞ/.X aYڬ|8N*|NƑZ'A0OuD..U ofZBR3| ֏f&/5IrA# XaXӥn ϴVE>š⫖q:f{`;FPз*O=\.U Vv2:pF ގ v.C?+RZ%7M4i~!NM˒-9$G=8M)4fH-qķ;VET_#Ih٤#KFk0QU|4BKAM&QrO6k,v7^]/q"nEܐa)Gغ:W#d} rÍwH(dFjHKI~}@Mm# >EKzn_ @ >_ū4϶Vx1I։iĶ;ϰViviEu~4me?n}zU=nMjb8m-NV_-c?"OᢖE 6o<}ڒ7N\Q)_"`hb;c}^OA˓ŠKx?.dS}p_>Y"ZC×,|t|t,GgyBGg|t,|tGgA  [~eƷL>:~ޟ}ν/ɽ߹c?-潮}HEy7-TfT.h,aM?[j_W":F ~Q:/tƽ J"^o?P4x&-IIg4ޙ4x&uIIg4t&?8z+5O7j j# >])|+ >ݥ) >* ֐:>+R'6(Roz)%`CcS \1&]hͪRFF&~+Nj8/)a |4F7T@8Ļ0_㾛 𕪄Z%-cM<p? iS+k?V[XՈ۰"50WBǢ}lνzEr%fO=5L_P^!["@K _qg]A;R~5-{[KFxA%G~x\H/z1C~Fm"HY6հvt'.; Ip* yp ˸!/âWM{f]Ղ6*R~/~tiL7eCӫ?%\DNBᲓ.|*g:SًM 4]Mou'W%6緺k  ]puy8}6ځ ;_kJ[ܚku?\ ._k.ܗLs{}}y > EZyہi׳eZO^MKchT<~"?"M6Gg *6M|Ϊ|b"± ^Ƨ`y pR{WyqRl!R A2k6!~USAѮ]mR"e- NﳽRM#^Ɲt"+rPJ.=L Z/?I%%|Jd9h68#>e0XBAqr}Zf<ǯ A7oѾTNےWtPb=蔞=T' @y{ROziK-(5GC!3H!޺m. > nL̥msY [VVigZ [5[5 VigZ ɷ7j|Z[;5EQ7I2vyb\u6b8#ӈ RƧo'S"eӷrɡl|vl|y]4`0dV(V{z^`H.,kt2M*XӼN /OZ GjcV>@m+xFJ 5Ռ--k~&x~K. Z[b2;[jzƚHdj#T/Hg)e1vz>CK)LulZsz?V >.)ҭJ0aI2gҝ,:`h[GN>*h/޷Iͽ%½/o >[H|#[o(@DIa&5G Ӧ> \+w瑿y;##owG~< i\ACe\ؗf.ݍ pY<4 T9]#/|P|P(| PxYiR36~(>(Z|Y >r3{_~~Kcw`~' s?&ܟܟχM_Ӝ`|_ j5|z3T^ۡۡ!멐_ WcYHofIIµ87gq>b2>8#ʃA!I3wRSoU"Ie" H!U8I\O7GX$@o: >[|н5 $꒱k`ȳꢶI2l PXէtSX1mGo~3@ Mh 'Xe|J$ť*[kfTepbs }W RW⯮#.N}-:\TAw~){|Ï>š_I$y-4o"VいT $Lx|kb$<&aQOMSDZgjY]Vdߐo<"NlH5ahQImit&Fg"+Q^4:gEx;pqtzƮP].VW&j!+㭊&܅B*otɤ4>3L]*AUTIOfRKw:{Mh"}FVL*gM%~=De'I&V́]);%j\jjO=BM{SOJRQkԝ|G֊/pn!5kC05ya_95k0繆QZ_Ü06MHуsr v_ΫSd9|PQ& EfBSyGUM:'MRӒh+ozU>O{NJېf,uj!鏴qQ/|>ﭤuG| ܥ*AU7AH5UFGֻ[ (p >%Z^ +U ,r ?-)~VʳV= @ -)?YzD/J ZSPʕ8ѮJg_."VpV}=A6^_B;RMdY rQX;dYY/ / ["!^Mhͼx7!]DВ*]x/]ˉ+AjXbiR]: ?}PK)r ^ LU >š#peYس@ ~Q:/#_0HĐbx7rrע\2x-[%F ףzE1>%&{-.-/·,*UkqtoU4|%]0orkE*xE鼠R'BTdy3zWleOGIFЎRS!Z&|(ۥ*rtoH$cC+xqifC c/& lC6OP,`ey(RT'd^aJ[u b\&bY&ܙ.U `xM HHu]ԝEExQw^]ԝuEE=xQw^0,*0[3+&8XBj+:}&Z k#W6|ddYt> Ji/iH)3\IH6S쥖¸6k)94>%R Y`$U)rLo(T%7]o_0TFTO?-yJV? Ho?M|!UC3q\ VbH_Qr`#J@]\i1*i1RIg2L㷓idd9o'4l2}# 6qMsx?v[7du J 8Vd#lHuzK 5Q`Ex^輗:)5ʺC`U%R]IQ:Fw*!tmO:lGju) oOap[+Uk"|i1dԼFX.T49X'y)hCjMrg&͒=I#HqOyf5Z·X{*iloU4#!|E@ d@0|1|9ds%bYM >šOvѬ7p;/cz"^L*?_p)2VT@G/G7az FzE*x8\5cowK6vfBͺBK xAKsž ;%x@$xeIM-zk:MK߇hj=n|JhuERS48M-GX/2#I4ߌn+QB(I4gqJ0|!GX$<Ȧ32s6UXseT|ޢ]"N .O(˸P+q+-GEXӛnE;pqXnMwg[NsK.p^ nDxmW\-3XNFWd3|kEiCWt*'wZ_Z_O,lx:Y;pMK $;"Ft˜dxވmx_.;R$ĭM#pձ{J w8;K7jq=פfwVkٙźX1E/̱CVcT 2ХkF}&ԋ@kAzX!SBnbkpb7\b= h\?hrBuZeM)/>>GZ9a@B|5Ϲ8z\oP?Y8v)rqB8lWj1V6k !fȄۤfȄW%>W%eMG+VìV HcUľGX;N?a7aƽM__vCRi:vۉqu9KYKC,dx\,ecGe%,e!킕<,KY/d!N'Dit5pt6_-Qċ*Zh6Xz?_h:Hf+-|GW$ntEsEEpE$+銤7"D S o/gg)a_T3(#n|<Ҏ:iVo ۤ湏 HKWjs"zHu<;OGޝ#ȻšMxٴ;[M&L[+RHX qa[jy}Vwo 6= ^Zڐ*Zф:|$l1 )KzYlBrlxifZRš/M4PbxW }S)K)1yINye@\ I 4qS&,o9) n\K[NHo$t4<*t(:')[u(_&|lmӡ8XL #pn͗deޟ HK-R9uL. V}L_3.׭Yf%1LוJGqM`/?( MGjzę.S5e0GX}C~d<҈jH\ ։*B3 3͛䨇T 8}k+k9 RL9 m ֪yEmvS pny(T>Jop;x;_ãn >%{wl{R 1ώ|5ZY,_ުL*)A56(BPD;}sĥ*AgX y ==~Ux^=[߿_&Wy?*o7cWnF_?@[ rBfcR 3{័*iVoU4nF!0y3س@ >a3q٤#5xb)U :HExh(*]iy:  ͊F'c:5P%PEq2d/M?ww o(Rۧiyy\6iqPhX ia ,d~7p}k(VzɼC ~_I< ٬K+li4+EM?O)ץFb5^PQyQfңztyp?r3%]Z7K3֌JĪ ^GgS,ǘיuYf/~t1T&Jo`Dߑx}Ƒf -uj-zBqA]@xxq+ ,MJ,|չ$C^j)4ﳫ2^iG{}VbS։˵+]Zmu.AX:B;)zo7]޾J -nJlע*̭8ov7V˜N䭫kغZںzں7+l]#m]˸]&Ac}X p ޷[N2,v;gw˸.U=r_ 6֍b]>|4. Kx%ٕM82^&1^><ƾCzȇ‰2/֍JBt?He2~Ie2~֋2~Hez[\2tcn,r]z+Vչ~Y[+Ϯf/&]aa|?4HN$h1u~w ƧD*q9DHGu*~(1W!OYyZJiuz";/(V MJ;vi5+OYN )e[_-/P q^;/(ʂ_Rښðlų MeI/)I|9=R+T㽔&M֓<Ӽϥ 5G+3x|a-=)QkNJ5U 5cYb5[x{νx7"wK{EQKs9/EiRt5jFklkW\Nͺ[luiuuxމBv`/+a"<[,p/N;rBއXu!U9/? sqRK = 3Ѫh8͐lI)~_GQi(~rwYM ɚV#(aVxwi/V3+ JB]B7\VxMdw(;?P4PL i(握Xi(fc(fκ&iտT\vIq'b:qDbALfHAXkY#cji%JôsZ}_a 1L؟_'q[(xg$!d_مM/NhuzRe#YVh0OׇK[ꅤR{\3Ѫhe!瑙#+GHO瑙#ydHOd^YdGjPd>Yr MnIr|rIepĩxv6WIN_Hf.bG[SKMݸV>uyވ;Oz#oęވ;7NoDzy?>ވOވ݁*ELuyk:wW Q4>%V$VUR;W8[ͰJ3i9`CF ӪPgZ!1孖eK 1x7r~LGV+M1NV+MNSҴ:iZ?V B}Ea9wG P_C}P_9O;ΐj'9X!Z0|U~W?8Z{ɏe:B )z׌oYR8T{ɏde]_QVH%11s{}w1V>VMZ1F {\nUփtQs]-ذ1PΘٮ3u^P%Iܲv\H֋2!^< VQ\ ]B Vlzӂ^sA\9 ^]AJxSJ%R>7 1׬t_s'xq_s'xf}3t_s'xq_s'J5k|3Tl^^Ͼ#hjlWWJJlS|ыۻݯ#_ȶ4+h4#=P NȆ8d>+ZCRX$tN=\wfc=Y';|utwj;"{d\s;09.B(?oT Wwmջd%\1ƙ|yqpO[ ŁK|JLҨ5O$/v&Z#d2v.gz߲Ї?m|+-H"VVɝXi)}. {̂+8Ԟ=Js3= >Jo,7x\Բ`~@0|^wSBh愤5gHtϬCfipQHo W!t6:哏 >$V:o;FX!uXhtsNPltJ*?yUAz;BQZ4T[ @3VQhꮨs~EݜRh9޺/fR ~aDʱR{LM}f}ga'5+|R5OKV/ˉgc!W/j#CEJ"FkV-'::b\T,ZE,xhCVXDoeIs3*ߦ[MگE Hc=4>%zYCjj|5"okOSu&ax%T*3Uԥ*Vi@_b|p41@0|0ͪ^%xIZ!+>šv}s8fw Xlwi>Ey!E&[{Wm O*h(Ԉ+~閐l$[*vӂME8_nvY4K盟F$\K3ԢP!5b}j>x7y;Gch~޺>W]S9_KZHmamQ7;!59VD<j ~Т ˨q.9^+K׃m^)Z݈Im$!,|GX7uP@iαzLC鼠j$_LjޡVslPl˸I-rMcC\t r+hX I>ǢS>J.d~s/]4Dʦo@}I!gĻh_VqMQKUe;$F(]-D/~tiӓ.{y:DqIbW![)ץG;pq.[N':`pLu Ĥ_i9c R9cNH%i!(v8Yx(}(xR٤7 K W(d+Canzp?W\y;Ң=..uiAvKhGǺʵnյźXb5^PKBGn\T I>e˛>Qmj#gS7[2ydG+D`FA8|uݐIuzCWCjL '+(NSM\ SAh_T̤&.uAU:q!a}vC;钋Ğ^(;O*;F5i|JP{.WgF|^wuFl::o](8x7_i7JEgUt+}\B*P YU.kˉf(+v9)d.Cڅ|kե@(v<=ψE+??~ +oyXxw:_G+qo:1Scve;鲩0Ĭvy8m[NP^ۅz01C*UgUшy݂ ^C+ ^*h_+yA5w5ԯ¦lϨZq'] do{.䙞J%%vkڮR%34{ƚ_I2]ԲA0Pڱ|-_+A0|6PRs{>w*m >Z#T?4?GX_s?+/ˁ^<QаEONmzo%cMp"[5Qǫ~pFz#^ƧDKoWA|kU42ʽ?ŸҖnۼ)u|){Yg,]o-bT4jBQf 澺?N/!|g#>](ZjBB= -]u υPުhbBx.myz>W, _9k_u)O#l:ESW_2V9.j[Ϛ | )\P#JD|#Qak9} ">BF{.0'Ji_5A0nEJ Guچk5Z5.Bf*BŽ9o! o۫ͥ*[n˷TŸ 1_ |ʽ/jNU7;ޛVz%7gͫ1VKU{ >_Oߚt>/s,|eF0~k.v=L*h5 Z +Kz~iׅZ499SlyWBj6gaeGX|'N-pRoɞ#{*x7|_ >  ï&g_y㲮a{&dCA-"[ഄä2|+_򃻁p[jLם&Ko1Lv= 8uUo7Ho.O]I"(GgIӢIaepn|L Ifȫ@kCd!5緰!!BCDC!BC!!BCDC!B~"Ewλh]TxwE+wQ]T~򞡅Ѓ퓧i{,u[It*gǑ#]{kAL Ex}CMܛi8 b k>R>\gNB[~ Vl岊&,WQTz7Hw 9.54t -!D_ZٍU@G̈́ ٺNu)4m)K ~Q/r 71zaxay5\8+zbJN{ ڊWC|# m:%*DAf$n/枌-«8yy U@߫6uի zR?UTm_p k4 O>ץ >=#TN ˫P.r8&7oѺӤ2ga5̱MFv&|ޯe%DUP{&! O8v{}`B*[~}~#?OG{KUz>B ciy,D  ?5} ¤[&yHoz+АO=7A7Mo| d]<$h=hOK8H0@<tW[q%ޢԀ_? gp"KpGYep* ']Cp& 8 I@czFh%|oV8Dܕ'7yj%olT7N->j ֻ% D d]9f0 Zw>W SHH/+ G|`B7>)/sz$yM>_ycq!j Vs1{i׎*y^U V? zgt;0zpAcCn)U;kR_ZI~7F|Q?H|WIZKRq?o\> ?ڍŸ~4u#C~K~c5 7:s_FH]EJTHΐ-ZOìyZq5SLYEED>Czߥ&7PtM d=(4POCTuA ggG9PvsJK#ĭ<;ꒅhvO* Z9+f \,KG'Jh=lRCcbƎdQ)kz h'XGL,t?FWސ;|1>v@jMQ&[7 -!bwr'=H(-q3@,LRo!պZUM\SbC׏!ѿD?Xa҇XVnwgɮӣ;<'^AڮɳhL#oao'?uPq-F?r>+(RM7h)U'w?+IBQއ}?I(|O>*׷c/K{}݉ {P5?\B0$`K`)jXq/FklRq" KVOv~Ź!4RȸhEW%.UoZN ??v_z8D&\2o#0X%Q"s)P=k'Xo;V҅ NOF"h=uDÏDH8|*&` -G[/os.+=ũPag/''/[~փ򥆝ۢ~\ K Do=HŜԖN7Ow>*+,j84bFS(پNFSiy8٤rODl:Q* =t>S10,6=ZfVKhPk(گh E8"C6s6N$BDVGRCzJ횜thfR>@.fc55MÓ|b^_nB*?AkQ1W: x4.ulGGnu&x']Z!xkc7\),VbH.H/A-Kst39`Tp'ڒO^N+ $YGEéРgPh_`ÊJ _Rj0?v|3P?NZP?Po WOס~衾%` ?vh'j2hކAkԀhТJJ ZH& Z-|\湬0=\alm1/oqR==粖| _7p`gP7V9||o~_7-/Sǵb 0E*Tl?(ԓ5?h֖M٠B弊;uEu/9U<ߡ2P Pl|PG?rDFGuyfE]~̥||/6Zp#Z$#rO7|򁵹eXCQ>D+.O5e.Uw$&)jJm3{Vh0ްԀwI=tF.̥j^LHG e;/~8+/~8[t ΐaZgsDk55{Jv}uʋX_}ur<;߯nl!8lJsgCsRM]6qfB2,2D~6V*)Q ڡJuWkB.z {N֟}ڙ9[=ۂINK|UJ7{ V=t=L=!`!`C!`!|S]!(|37ɃÅus iB*/]z ~\l>-3ņT>:}FOuKkT?cM_[n&?+(l.Uo?TEw7_s}~/~_X_߹jS_|7V?#{Lp2I(0Z蚙 nږRffB13SO>zÿ?S?K?o~x~x~x/:$%_Gǐļo F/lOt*l'.*.O8擊 NkX{-#Ӽı /GK9}KH!xkeE>Eŭޏ<0Wĥˆݣ,ŒujBEDsW6ocj/./o[Dh?(TIdP[H!Zx| Y8"⯎TW>sR b˺X>` T.=AΓvvu8O{']/qzܮ;`u'=,@\]9;`f1)z Y5y([HG MVbRN8<4OHKR>3aޢc;yL&~d3yd;yLϯɃ5I1 :橁~_OoRK '҂RF+]jZRFJ 3sܧ7xUd&sܧgpȓsMh ! [1 @h'kAe /?# _+Us`D$&SI"W*T-⮮}*qը4XA"׈VG̻ɑR[z)EgsQт/Y'!uAۥ|/;j6l}I}bsr yֈ;Dc3X;e9tf53`x!bX$F` /+F`Qr5pD1kJF})y1z0uxb[-ۉ3ƶ5vča-P-_$Ji]3PVղ=vUvQ0 vQ@sH>|p sAFt,Z ʪhEkeX?Õv13 Cd\=c1ff{"1dD='ҕ|]'#f 5P@f4e[ \aa .xRj\-zb;`xe&%6s#@13r^g)gX`G MuGzc.E⇏&~"K>S1 WvJmꄿvp'ROhK8G7û貥258]W' v>*QSxsy@xs< lDh_Zf\Gw>«o]EyaU{ToV%ezqpo͑N.N\֊le0*hBN{D $ w!DQ'/ljvљi͏@j,qzEEcl,9u^Rf@r3Cg" kyъ%hT|uL#5Z`Ԁ_#"(2 SC@HA ~RjQ3&m7b~|{3#[߁߾s:g˛qeo2evdֹu7o-z'4T4w 5Z|K Vk-5O~{_*(~'}d?ZJ*K]54 I-Fh_׵AB@<~ni !h୕cXxNw7 mk.P:ގv^RiOjrZu?F5MUPS56sP1kvk(mq=5"mqmL(Lƙ|UX#É+$G +zd,!I>+]eˍ7wՀӹz:1fTԴ/y{|?>}nT[VGwb05d!yŊ|U//_gCS<|$]=@̌zƃ+zJmvVz1LuVLi1|$jrejiu)$"QËl'Sd3iq&p&?Τ$fFE5ò]2ygW<iZVhPITL9O!v6Q`AX"8jtwhԥF]JP>zl7#z@¨?<\Evm0V'~33X@z8BjVAO0uSlz.%{ڹxB0UbL>|p!C Qg<5 u=3 rݏQ |=Mtcj#4r;oE̝wq%$vt _iFM|VJ '{% X7f&: ?U?F,^ 1N%=(J>zM4D?B{*`]A2VF4}hLnD_R> ySip)Q!%% #g[V\0`^ɧ 1 @ZĘFaE$XP8} Z"[MJ rz{ -vV|vz@|k-;[W 4n10$vvC%7WM`(SFlZN"=ۉ+V%CT?a0^Cr^ĺ7+B2@_x"y\x"}@'X|f ! EpGIgRA^V"Ԁ u3 DzЕj !hVJU!%n Q3eŸ1_lDm\߲Nb ^)Wgh;DQ$~V$0%pOM G2h%`?S?/q%زC%:ީm VNmT7~_}t UqR;|{=Z'X/ErC~H\cǫ|B{zu_Kh~oO ]yc%ː%~RA;Z+%A#o)%A#p["&/EVoҷT z?>0 =kL}Wc-`F]fw|UO8{c? $1f'xK#ܯ7<_'X/Mɾ?L8+;ڷ78p&\!D/ x枛+:|vԜ\".y)Q ڡ=PuAcxY\Vzqd)54L#~jH3s_Vd1O r]~Z'6 x ԛTP ^P-Zg{A"=ۉty8Х}߅Bw}߅Bw}߅Bw}߅Bw~o_7U:"KNK5ۡvE7BqyX[&ӈJ/9,-,;RzϬ*ߓԥB]i^WHPI}8B0aԒOL;c>*3`KV;q3Mz6ҌzNRk:t777@Uݴц;YA^̓D)^[ , G~2|t ?.k#i2ܢv70{2ܒO^_ي[V|o7%'cD DwJvb"[uy殩, jŰ ]Z3^ʑkȮZ󷣔 ⾧PS2sگ`VI+P0H=j୕Y,X?C5B/BkB,.ʯ#kuۄWqtj ^)oc .]1,KFJ8z?Tg.1$5Oyѧjq{WIBZA@K:OW|)+&1I"nHT@^RỌFR6(Q%ځybt=ݺw=]OMө}ӭzjSǦa[O-H ~P/!<%6Ž6Mxrqŵg>&M"Xj,E8 דqZ>6 נ}5ޏ\ZVey_\zݮ|˾OOm Qn7+G(uұhu9X~&ktO&|Ian}DܹTCk֒sX`BtdN>zßZFIhB< 2?gl)+>;57m!~%1C϶GJ>k2B*}'X/o quk XY-T/ӄTS_z)BLd?~_g ] ??`} BB|";V)% ߷BB4V^hT63UJ>%# Nm/q+`wFx^R%Lr0Y~[d.x̫* [9?vhT5]M5"qxB0PE+0씪:ϥT۩ƒppK[X"lÓ22F4O Gb Qh!/*/D9^BPE^2Gpsg2zJB7>mQVcu,jf%!S7=꾣O_"u͟g Lg~'4s%x9:c$*X]y Vzx}sJyovOݽO^?]pW0! wgpׄekU wݬ]ib¨oEJy2tOI2}:SHvu^RMIkڪl'HEˣwЛ73UթK&nn* .;2lHȾ&T$yjOyۍZ%f&&&(Ytn«?24qq1|Qa&1$^͇:uͱoH -/]NK&{!:u=v /i}ڪ-W[ܢ VGynٜON'S2Dvn6ۉ#٪K׸|Ÿ4>sExIk\ڙ':.5ƥ9uKq^ѥ]xt5.] /vc-KbM"cN\ᙲEˣ^YE~Y9u3 /G}3e?Y>eVmw"1w.RB"!}@Fٜ%*IlUܿ]۵&kMn?& o 5]kr2&kM^-!AG7VzދrםR]ݐ)ѶХ Vwֿv#$E`r>|a'hd.A*}To=ƃ֐jR{K 43^28/c|'_F%ueoaȾ2 ty](|s^Cm(H٘\5IK7 omH:58*,7|g:-Z>Kr7Vf)[?åsir8Ǎ} Q+,ֳ:IXL/ )7qP QAB[ْĸlY |5huO^߯~-l4bWs8*l7OǬ-d\TIp*YN˃] -7=՘zN*JcsM Do|ۍ3S#$C< ڏ쮭yHdb^RS#.Q4ҽ{uMkxVHƻCQz 3UK>cBIW~N5#>'X<]wI3wkmt*T~<d}dAw *l'w[d.ߞ*tiS9P*M3$:; O`xp"ϐ B4,nIP\U9eP0(Bxp(ҡ%w ٟ`ƂyS#9Qz VZ]wGkZCӴ>$Vu+V3:Mɧ﷣_{ɤ>S#!oH"ǖ|4C"|5~a|'`(#,*cpQ_$ū| { (RaZ м^L-SJ2`tVcjU6x#NȦO.H,k ̩Pafy8pѡw3^#:hBRUBjOiJ3Π%Q+Vq)j 3`'`<]8[ӮQb%fD'l 2[+}T&5zUy~VK|\eE6_)q'XOR΀jp^!D]y rTKI*wOrQ  TQR D'D\#'^\+׼6Ȫ$~wO V|/a23_)ہyI 2[%ƒ3;եtyI3dž;5džv'N7rli"Q?:y1߀K.ƽ.o63ék\;w%U#c1_'DMy??4\Ix k?Mk8u)2xх7U27`5.?e eOEJPcGkv(/3F UFcl'})R^[Dv;xziG˸FXJU6SQsQWB Fh} TU3N}B{kdRhZኘR(~zA'?]'\LZ o'[g_)UhO&|SqtmH /=$E]YJ ̧nEj @3v^R#3 eWiO CmIKY\6{ޒȣ{QдT T>cvܰC" g=.U`yc!D>]f.sndVI8|s4DWq,e_qWjQ7 4ͷ% /u(o.)Q! Y{Y-Z\+yg(+S-3ŅO5.U§o75cC56xTafa4+sY?`t0\on8`|Jͣh JJIW}AwC1QCxIIn#n`(fzF?Q¨hRzt \1Q[7\CZ#WLOz0(x]ʒR .,}XsL=טX{bEkcL/k:xy p:d՘ꖞ å) )ѤmmEk{3=AJJU+C95. g5'K [,d>8қ&P`DkALfgZ $Ekc-WKJ kXLcvq5ā#ԏ]Ԯ|UnyUԪ)kHvRІUiԀVv`3VM]۟h**yOO][sJTv![k1"& D omtu^Yȃ.Q]徾Sj$1ŪC!i)ڙ +QXUO^OhoS'7Gk[t ^R+]dX2dEF:Db¯ ;s6â՘C1:|yxt,%Zf-Lks#-wG')Q 1 pKb|):tcK6/?od*7,Qȗe2ݟevL搭DDs/N\y:%fװبQ<o&S,>m3D^ѝΑ$T{`^ה+9̅\F攨95CvhM:au]ݰ˅*˹C WZ#t"u]uK mJUd_܋'ԜtɅIx3ڂũ9<< uSKɊh_z꼤Γ[f#]}TEv#aC?.z| % 0!bT6n7QE-oGn65Zpgۥ*{ňRFemX>zd<鎌=>H޲ݐacЂ.-yTSu|%E?zl4ic$Do=0DS?ydh@$LME?KRM>ym[zmTг]&0C5ݍ D"]ו1Eh"[b(GfsU=E{5v.ZOƚKn%HQSjӨ|/ M_IBV;bflb]j0vqܓ¯H>z]Gw1 =I((>Ϙ5o=):C*כֿroF Q]Jgʷ[BeZ S d E,ۉI'EgRl ki[2Jm&;4Zbg6IеR{kBgp#I[؇-Zp~N[؇-ߺd\1}O޽Q-\|;锾O $1Zt=I;'oL=p=haa\:Сl[&4Eu(_,:[B77ŋN>3ٱg4~ zAƺtCqzk? =)j"'{?7)U{{Zfq*\$]fꘄhhTO#3.V +P (oyɥ>Lka_(^pTo85;3B*~54{dsmr*T5d+=l/n%DS(:.WjQql5J,w\U/SV`\qL"lu pсؕ3ʙt:;j9}GX%9X$}D*ۈ2c_R뵍h[7Vo_#GV*y3@ 0Fz7wSj⾣hה* ߻}O;ϮD3@ :6k0@jk&[K ( rQ?,Ylsznȫ9< ٢)0G^!K:!1Fqg"u&w.Ul;urbN*+ Ɣu_iRp[ O|O+z?+r Y\l)d|x /)Ʉ'+֊O6nq&;uu9ԏ'NIR ^R%7ם՝5dHWΖ| Y8 j?̓iɚv8ERY- tL 5 bmS+w:_ ؊{z~TPݐEkul-"Rv-dwW]p*n?j?l;KA-Z흧b}?NRnjVi~o)U.u]cE߯CRQzCrc: n- yH?B?+Q}xR|So]Rj?'q!A7Xkmt+@Lu!Y Ԧ.$p IK>zÃ)KhiZ\gxΗT3=i= Ʌ_![8Q2y7|l$X"|@Pyx󧺞&iKqx?!ն=BYkv΁d3I|oPhr6ΪS!~u|oc )PŋH(|s iK>*0[֠s65uZ?󁨹A8URJRo-/ (I0K|oբ B{A~{y/%{Wr _eO 0ؿv}ؿ~ 0~ؿ~[0~8(-*o[`Uނ[&oA-jϷ}0Y`*]ɷJbb䲎 >֜Y-@ݺU  |>cqqk|3ђuy&|-i7[tx V߿Ÿ 7~ )?~W?~.}Qt912ǰyHY51=_F#&eE"h*7\j?J)qkZ6&|lO۴/v 1{ ֓xoG?sݷ畐 "hm~VO e*zDU`*K@;.˿ 'Z/Sjy0}??/Xp&1HKsz;>Y|ГOD*ug@|Vjֶ/;+7r~[3i)Ì*٢wLgG'w<3_g &lk\5 ]/ &^lnvjdO BG]sh# x_{MQ@cN>c7 {؈ 96RGJ H"C?ڝ j}ƹo{0~|!w]׈F;2RC؊ s!s XB^؝| +!A̔hq V4~yNJ /Wn V>K }ԪD+АO <ZMח۞ːfڟϓɥoq ]}~ zuy1w(ہyI٪gXYOo{! ̇6URU=$B| fx}U]{ԦhL 4yj +W>ch*#+YƍR/AGXd>ue>P ^RRԉOx'o K{EOR0D Fhݧ6M3ކ}~B*РFkc`*߄R0y,  mQ~ "R 'Xo+kAt5|!j)Q ځ V:_~꺎ͬ\ |G(kC֮`ky._P"-]J}?5l 4|0|CާgLƒ ':gwDC?5+޿;߅'n?5/)"+a]D=Jhh WOk=O}_'YVG<;~rg:| rLY\j?-eY5<|n+إ j0S'S7x[O^mhޢy3DfB^J"hݬηjr̓_FVI5nwL/ GQ^n2XUDwxyêYV2v& Ue&`g=w/}Z#qI>#4[JjEӞ;8ϔzו1C<·Xyʃ;ZeyX9mŽ${nzT B*ATNXRj\tbə|, d.MV@|o=x0<[T'X>W&ϊ@nkBT"ٺ% QvydY [c5g(I)(Ց" c"d( پ ^PxY ?w},%D;Wq.Z'ްq_kr_[瓳c| ֵ]d ۈM5O6l7~#|>z~<<; |)IH&D*Z@%"GOO  _*!! ѭ~ $&GO~$f1)>B 'zTGz\&G+ _Wn 2G+G'/Y7 2if#(ѾQZz^%n4-~؛SH7c%Cw9ocۅ,f=7sEYLe(nQ<ȡhTu=魍~>)5&Pw1f{󆱲GCv>Rkcq)e=fx|[RN|P!>H(|beH L.NRA|oIWJ q ɉ!6Ē|_leHN<,43Pm+?3MR1r(&1SdvMo=u,\!K ǜScX)9I(tX'Xo<30AԎ3I(g~ttޯ)'1}VJoݦv>IqxP\_|MIe[6ƘJ 3M+o).ԋSDh^sVo)=tYLUuV`4-Y)5tX%\Q&$ fL]sh闄VΤ)h2d`|e5;o`qCPƤ ;E~ zO%1)Ԑ ~ jyO__~/ Q )~QzGGoUqDGT,BsEnƎȑR5W䠏uOzJ QF1)⁋lZ-hq|?;7{ ՅS3=U^QWyukWw˫()sʫkE^]+^]+'|+AG~~"ŷ[\Ofl?ʯ{͑2/q`7vܾu05\ 1{3L0~6~{j7zޯ5zϐ_Gg>IGjTD]J>S`= "hu&zد+&Xnoe-~ޟ ~Oߵx~U *X>fp?G#z*8! 57mHUX VB~J H_dN"h,BRS oF%K>zÿW+ЕW+OוW+OՕW+Oו^y&Oȹ$'O|_] ?'L V??~C{ioO?~!I/ 0aABXlD+ׇaHRj+. x+^*Q)BG%ςN]c'YAk;|Y՚>w-@gKbV $+-A?'D2]#n k ,%4h5$vѣ["|HPtmjm;ZwV Do#hwJ8' XqxSu},%5pSgpdPgl"[tA:QŘCĨj0Rҋ%IuZ E;r Ew;N>zÿ "l)ru*| aNmO 7>Y]/\D ?;ZIPԀỊBIᮽ8`o]/=TYH8Df&V6y̴ϦoA7y-Z=kTϝ?>H"gtowF+3Ɔ5;=Eˣ㼓O˓i`OƜi䩼Q:'Y;1&oi*Y:r'`m7?E*T(پQgA ٢):woJ"JP'"8錇+&c$B8F ͈n} &+vG|}{!#ح芎=DE+wEo.U+O/BT%'X/5E+Td7^DѺYR&k3ew1ɦO^kj%:OzX/jhNDh?(TU+yRJtxe%l'V-u(L".(rKg,޺Y0LT5T:$2FUn&OD0uDS5Qǹ(Ԁ?\N>zߧB=Q{xv$B0eFlORf{|inZiD_c2/.-}RoT[~)7V߽4jst\W9{~ɩ=/ |R` /3< ~3" ˒/eI3ΓR~'ˣ̞]džSBپ_%Uu l8^g,T(HEd.aypnNn~aT2}I%ud.vm+e ]v\v]m~ܟɷYCB>]c.0șTO n?`M3N4t܍D/zJ9&fc7?ߣĉUSy4Sfbn$~V t kJ`1֔$cĦ$~sU| yۇ+ < [ϐ:8$|0ũC*9:H`q 'Ixt$od{:%D;qu/*SEv펼Ȼ)Doݴ27t9|6<2=]5V!`ϼe~SnrSGbS7RTuVT̰MhSLj~»=繸{b3^$}X~ɧȾxDmr֜CbI[~DmƍU%kԯ]K.i^k4]RvI._z?%PU^Cbq5:-^Hzq/mL{r[Y}CvQ2@3G$ @rIĒ\*' _ ݋_Vl)8S|^pv/Zg D? #z붚 g1@2L%F;/Nn=\@ɍ6)ãe^KJ VӺ  !o6O8e& >CGBj8eM% fT،zޏͨM-63qޏi3*[lFe، `qᯊt^REE"Z{vʢ6]`cA.&rFZ0$Mֳn7Bx=m B4@oOcXVSW|:L%%|HfiSvv*VolQž0čƭJ[)xK (qX lF/"UCG^'%TL%T %@;ڡll,jѮѯ~fGfGfGgvkvkv?WT/]W]Xۋףz릇L*J|1Bf2Oאvxkc\j7Vo!_b΍: ߼uB/,Iuo ܢ ৽nLyMuM3!5!5!τ:!NNbꄘ2!`nVB0Ր' ZEO͔]u \nS~@"a 3%?9F㼤M؄!B6(Sok'dUd.3ye ]Q><KKy'2vJډ+ٮ'[H[Sz?Ɨ[XV⼎mvb:-%5*$BU ]>DxDv҅ãk%u /(V] /1 Juv"fm"u)ݲ?ž rVf߲/%um߲=Ceeo«E;y3z3KH||sEokbR\#r7V⯅Tm4Vx+W,*ֶbe|Fm٦W6tF5,:z8|zOz/?z'z/nW$ܞ4H8ے'&XǵI+0*_Salаo3$`~| t`™8 vgL.G5JT"j9!Ik=YKpVomt* [/_^/ (_tW28~y~/_uw_u5{s5{}s{}s랫s랫_\OzeR Q-ɐYxDSy`RA[o/o᷿~{ %/^1>t|/\ 꾦]_̙._uǴׇ^io61!=)Ѵ7xL{si1cCՓ>~YDlګPKE&ew,0k3z_']rKfvbhU[h|gUN`\OMd!=cB`|{pNP5 W!xX{!ؕ<vl8ȝ(:Nlo|`#>+YH |#i%DUo{`qqeI#B+[q)5ZHWl0MVb[#>5BARnVV5!#n|EUuGJ7k[QV#v 4'X~aX^ _H8j~_SG V%,L_vyI7Dv9>HKqѐO^k }OJؚ_DkJ%cۓi߲78_■H}φ6]y. tMWIP PV%ډeTTP t?Kv~ti.e>Xs|Ӊ5 pg c'k`:A VU E$pe >zOQ>FN&2u0ץG"yZt*q. )[1:;l [@@?'Vf@^RcZkIR`kZ5Ӗ¢h%@=f >bnmPlf3*))RX=IZ 싿}9~j))>>5!Q'a%\78m8pD"Pb燩!pd/H$ݙ:XRA(i|\WK_oz_#(&U …*ைv)}c_o ?_o ¯ +/ *¯ ( *_uwE~ձ_߱_u]~ձ_~~׷?W}]~~׷_}]~} 'c s2[JRD s^ypK:fy`#5֐"K`*G'X>(Y5yp*eٺchޭ&wV0|Jaw V0x!-̓2t5 ɥpK/|9,>+\>/bu>/E5˥P_x %޾ULf{G+Dv$5ˑ et'XoK7 uO'RK5 |> PA$[mcc.$к| d/ 'Xowww>^wʇ7û;;?=ĢoIt.T߭M)HGlv_OZiPVZ-Gj_KB䞀?O+>*QƞSW"GrSWwL!yUi<`?A[,ns>S}P*\㳲3G*߼h'X~ճ/]>[Rdߪl[}-?g zoKN*7VoqeȃeYPKglѯc9_nAR[gkl`=dvHÏ3u.JO2뼱 cد:c:;#e߆ʼnq_= JL]f\H >z?*\GX %*X;PQ-xۮ=͊ xs1lO!AAr v-A5lF]h^f:EoJΐ"\kьv2\0"[ xVΑ9k7?(ex5x*~mOlo%dvE [8["&IIZh:&-Xjmǿy ĺ\CM @m1r[aݫ ֳ|z~>l=ˇ&|hW>lyVO/N⎬NDeGjB,~o|{'X/DY'IYx]_z9z։;pz/DLZe"!߉'k>>ɬQOB]W|$)@Rs,O?'X/G%fmVy65Ѧ;hQ6fmVy6&`˹ns*Ϲ&9ws]\ }8򜋑qAۍm6zHz֕~{Mgc&ZtE84oI[qY[ă3 kG𑈢|,72#y?e'X>d@ zsQÇ DǧǎgK!5_G魝@vt{?0'̊lI\(W{;PQM=1;J%vBΘuE;qWq.p\-I"!zֺN-!B' ZE_II"UI)ݤ p'N"5I&W"BaDX:;NaaD:;NaNc)ƭ/SLubej)f)FH?"{k(R@k]*R M4d]b-;t)픒SZNSvH)#2)[:eSZN)I;N)-0S$|NOL#QHK ^ړdf۩]4Wz+A%,|9&YUL-Y+0_?W`y]H<zL[e:y1t\|5jQt k-s$]4ZWkLԥK2G#/ÓqnX9 }ii|C6(ډtZ"~|Rͳ!{v1ҥg^Q%x]tV~]Ό;r<`%o^JjjXz-*h'`w D훏|i[)^sW\@iFeϿ:6cr(bc?km#ZlUjfٕV"[2bøӱG!!82\TfP}4kp?B{a$o eר>,΁Ql_#l>aukӎ_N4P IfFuؓj3/PvRoOSWq_6%m3[| UXlȹT2A _q'T>lj*4oPQSVT \|[%EXMg=Mgg D&H,gulT \rWtŗ x]vjUwv;P^dz+A%۵k_N?I+ȯhv'X oQ͓ٓb7q]F}2xx''1(ՅC˾t ')˨K[xK½݊TQIi2uN%&lP&${NEd.Q]*c vVvb4\h+`R]ȫExW˺n[HHeZt>JoM_ 7 {kgn/||W/7o\cv.1Q0zV5\[7#=]/eճT4,NmZ0St5QyfhV *E-E9V/-egX/3xAiӪ !q[ ZV.1N!ojY?&U]؄T H4)7OyΗ'5Gb'[Z[CvA ݜFMJ;7MG=l!Da^T;ՐO}>Ԕ?_l7Dr(RSSOoxKfI~k/  Voy,9g2兓O Mޢ0}X :(Q)xcF5f'Ŋ )e0N\jWr]S8'gS+]%>Xר#u)g?Ǫ6g?1d9㿭U K(1Bf[ 4fuИpKb ʾhu>t«/]PTY<7{!b#Vn |$/|Pg+V*%[;KreT>=:N6R7Uh޾"# LZ›N_DvR7 ]r\g aE/M\+4o 2xǻ !벣|^E<ۥK.؄PiԥKb#teݪ_A],8 ]P[Ru0+R~WX"r>W^U2PSzc7+|F_Kh%bʍ|/M^h7V_޷_W}yC.jެI~y~շ_Ym; ;ڹh@<\? p#QܞB >*ds|#_rsFI\ 3Ur>CScM_k US\Kr'S1LXȝI8j+"'Iu=: r $:kf /V"|y|Cj `N6n!d/oܭ0-쀗 t>ٍxy9uL_.փ oJZ3jY^zcfpw>C#%2 責3[D9d< x{:/<x{DSxmrHMz{:v^T$ܷ-~>QS͋ßֺHd ]'axlzp|5w!n )N'RxɨIrB>Uw| F,>M6+evfћ DBOu_͚/%0?jy!}U~yL"o&}}U~ѷ_~ lwyƥzeH*fKt%,q҃O oo/ooQN9{йdڧAكQAfFk]5$:M?)n.0G*A`翬#>BH ہxIAh4 ;d2EVv".][Օt]:u]ݺw]ݺN]WuuCxhӘ胝HiGٲ V YyM^ĎF3v>. %4 PT ǿue&?3>t.[RxOz/?x7_~}W uߌAXIFWl@ۀYze1qHiF VJ<;w`[HAԬ߁?}F nk~X/>K5nGgggYO#1nZ|Y^,ȿO}ʶt5ٖlKWmi>-!̂+HC-ED8ʶtԟm)U[A#9Z[ HH.<v_t-=%}>*q1ņt4wʋ)Rl:u  ֈV3= =,=LG4K4=,= =ӌ3 ZҏZ\Djpҿ7G"^ABFm58]*?[ qcᷨi_[<ˣ_bwg@|P ͨR#;@S,LR;g:xY:x;x̡6' :AD|ֲ{)NS[kgo*Ki 8sn*m"* oJ5ETJt/5vw`!s]08`$D탏pgdjQ#GyHxjJZ׹"$Wx*uABjիTسy^'XoeV9ǗVz|U/>r|i9&ǗY2e2E[WwK<~xAtwuDCxAuw-DCD#"D*$%y HU  \(#_=O shspC̠-.wֺ2uf2:Yl55t{kgnpfHuҌKcK^*J~R)rےJ(T]^*MZ}mTĚ^lHcc_/bn}1"~s}`Z<:ӡv/Gb+Y) ^,  Lg)$r #<2k~g\Kν}09Yu*5您#3)+,^&I,Sw%=B<ɹQ5F>񀮄[)eIY{]POM"ٕa:Wf]TW@RR?i~L_!Ì$[L19d ?uH,|pKȷY"KX¨uR4GG(of|1N/gL]S7u@Gز苄(G|>}P>k烗@?ӟ(ӗg$Yʼ&jR >h >ƋKasΊ˄C'nxïf4C8b$ȱr׳O֊y;boYgG)`{;@/u^eBG=ofp"St) 2SQCN ^P:6c \0סz+0O_:rVXFZ0Qh7%V-y \2bYv qmU&nVp~D8t,%"L|5Ffơw)PH1}Xr4_$ΧX~y}7a#PǏXAf|$v: 7|T4K o_~ | d7%h%%_s/ 00o ph ½@lMAH4!5mf ?S'y57= ֕T7'RTV~եPl W)5;D&$Q1H4_ B;mSۿ~}ೕ/|Y + )-Mu噺wit]yt]y<]y<]W ,(Q/fkD}Ses> Ƒ BΧX/_S}g~i2|)ϖIg 3ʥp[ }BG x4Sf9&PuɦaX̷O{h5e֗[IooV}XoKYakgfvYъ7++OWlcPg) ԝbͰz߯;ZM)|ɧ$! kO1M=h8O延m0CFk46&DvS-x/ܗ.;=<.gp=c*J?b\b^bLvMqM3!5!5!τׄׄ2!Ƶd72dz8+SFxv#MO+.ٍ^堑48^+*' uπ,qۜGbEn ݼM$ 42Gdjڣ|4VWl%@&q0_e~+' l)VtľCQ}&"2O|$xyXBOhI KDm<%`GBVt#Rc&KO ~ 2#0#ߏ$\@ĥ}NpL|FH8m#[>y%x+t9:||Fc#GJVQ04v#QbÑ{|6I&rs4ٲ*՞1Xü ]3M5=;۞L3Y3)$ d1kR:, O\Wx"{xb'v3$|O\wx5Gx`fkj9U*ToPQoI7Y~#;Efw9x/ܗ.GιtBAQCAQIPcw##\fAQ:HBjKl,(JOR>lc*Aww79hWN7X5J5AB1ah*nr'K22 Pv?|hT?- .g!fաRCuk]h\!kn6Գ!@@ӬNDgdc,F]NIk]UOM?0bq UVΧX~IwC +CL>=@zL@zg6Cjd+TKUB?߅Nʤ. R%k:Hu[n3+#<᷿K/>)΁ Ɯɸ(Wx:eר('p"A[&]/5֊ȂaȲv]yUJ"FI>5UWع*~k:⍯zv 8b2-dZvS6b(רW>iVqV;"5%/{~+X9E{IzgS5xAˮjy_9X#^foEgŏ=A^d sbSo@)QځxQO9N5.,!(EctYΦb:8%†O2i0-:()MUJ-T' `{+4+^B)2dU>䷏,H^Xzz]*޲%:3x~S"} #5> BoKTO^")߾l/ ۵p>C]Q;ey)z::Uʍ_$`vGݽ?Z Y,0 ?[Bel{wcړ ᨄTyJCds<&GHpH$9@O\xD4|z}~qSq[qmMgד>~Sz"||ߓ䯊`@iFe^Vͣ5sD׮Hk|{dfG%[S mY+ҩ 3+Y턐-3@q>z?19 cHE_T/C:LRǖZ |5\v8m]3\6ר\6zse_^\V}wFצ>18cѢ^Obv DV| o҃PQ) Q@#q:|ΗRs?h.!U?VZ z=xQxv^{7bMXW}28QFf5y/sOs-q: (<H-x9\ꊎZ+ Ke[C|4oi5&kzt>IsA9nqw]*?mgWO s1fIs35lWh̳6Ϩ^7`w }ΧEʱkakەmmS+?FeֲpKdE{uKO޺QKvJ?pR5$[`4 TxšExwBIbW ~uXJAB4Z6EB?UΰO G >[|D#aD^Z:2 >[>ʼGu72$~Vˤ*|d$STmVz2 a wogy!8W?otkf[&UK3> Z!Tri(#X<8y%*X2xzY5Ag`E!;-=$xi"[tN,]UM4RSu3hLqYt7t#iWW$ΧXxy-ZRϒگ%u^KYR絤kI?K꺖y-ODۼ! ծ&;cx;6e79D~ʎhzCfk!5`d{xA됹;Juȱ/)v-ֱ1w \%x;r+E1T:Y{P=V켝뜇rf"!X`X7 >EZ'RȴLo7,:mhaONCA3y+0NNk!u6'bDx}PylF?kTmJ:oZyh|;&Eϕh*c&K]3q2HWZM1Wɛh`NuX/0Y Mߘm H>-i7˴ M}c XZqLjt%Pl#e&Yq B߾ΧX/#?ƈsjhjXJ^aT_-Fd(RƈvvS/zgj2ĭ o QZ^. q|Y/e4Wxzc׏Me䞐kd_FM=V)_"G%'+ փҾť SQްed.]nX=1vٗ.8oȒtVozϒ|$)Ŷz?̇ ROuH4ծzHU[l$x0·UԱa\yvV$m>-].t0VCw8 8W{k4*  8E50jh`$g hΧp/ I/XjX ȍ%VT \+t8jYk4;$tSZ`)egoIOj: 4njP ~*UP)xf\u q f^*~.z4w4OIQI[}QCb|fO:5*?=%Mw>z_HZ"k96װmR00K@tНO ||5Rpz\V\^.C&yI?$vH-٢y+иR 5"R40l3}Ґ(:k W|wѕj羱ރgh&wWyOwP; U6xwC~O3uw4<]OOtwL<]O&ZZ?G"GbRA8  ~QGq62Y(l:b#_b 2][n$ث{!:BG6]xmZV _aGX!| hYsGHU'_$,V&>Ï8\*r8b'Gs;RʴlYIf>Z?GbDmCoDžL"bϓj6~DkPQ9Bb$ͱn3H2D2Mf^E\l*$'XXed;5d.ߓeY+>: uNnZv]&I!{ s%7but>r~ͼW![{T"rQZ7zIJ*m_|XPѥ;)V)G<8~#_nWe  t@IԶu LO1NbL!u@: Wz1W # 4k: /]o<wfߥ|ZS#H kT O”E<dNC֐DS'e岊Q-coU" .rBgY1@K]5V=B7?A$HoÜ$~U}8q}jm[UWj- ? Uʼ:2TDbɞ_ֺ }$v tJ%8-/dsH!9 ~O>; ~N?~K~g^39oC&݄ji|3:|+||Un|dN.$>Z1Ē y񭉤NG Oke9:|akmV%akVGB@ y45-ІFNni!U#rQ;8Z pغM¯s=Bj*bI)ϓ%)9&.%k%@.~+;ׇR#"Y-OOv>*m2q{Lg(m$>[ 'G+\\*6d/CGsdX=Yïֺ] @@Bˊg o p /ݒbpZ |$jT) c5~Rd\O |lf2ا ;uZ(Q׹7^U_-T7I.jփ)òu5& ȃn&+%rNBu]DΗJe9ժgzct*ˡڋZ$UJnR nŕKa[6!U都iYLk1q"̜![~ LfB0ZRY͛3;b7ȃl56KMB> /\|E4\]\|Jv>z7 ) (iw_~y"~3!VOG.kuc |2]=0Y1%x1 jsˎäh\ORkdV+ROs?A~dMsmUudcH]*}lN߆R>z oOOeiOWMÃ7däV7uqTzdRtI'35UO!`@iFbIԤf(NѶ%x/ܿ]ʥKti?Kr^]8!Lv~tiKL j{{M%\$kaTt"Ē %%O-n^j8b{.dS>IaI& @zY A=Mb5t>s2ې}Y&abEq_pỈrFH*HDJFp$7y$SG';pq$)Kb*,4EЏj0"|Ppe\x6L!5Ǖy\r>*OW+ j;uEB^ɾ]]Q(']o>ϊzmtuSbyQ-¼Ր);G7;[nѥKe\~^Ү~i?Ү~W~W_ڟ uOK1K ? L{1[=uRQ K7LPk;oջ`LXuivXnV]v"3KSҥy"cqٍtac=q-Ւ{zj?yܮ";yw\ 1T_Pn}EnX{=/%ٮ8_嗚èKilId.g!>&UZQ"rUfW$hc٥th$RY{욶 $X5)0F梒V&4͉y*Υ5hX/gm݊>su۫qK+a|/K=7 eR0^~S|;0+M녅4~irnK dk%<)֧`w3xz7ze<{׻`w{]sfN_ g!zXkeԜhX2mZwr6h%jCuT:NGJT#{keA9IQwlǿH8bDS\*KlNXөCOLDרEē p \jD nj~bWQ$Upg}ƻ;N-@%+kE+r<q\QH[G>|cHJtO/T#`?Cx:lt WѻeNBᣕh,X>6!3XԜe5rZWkר1|2̵bۘBv܌oa.Yd.Rq_\J^z|Xn(bl_rX92꼹Żkj=ګ9REmw DYĺg'Sh8ľk82D"|P|4zVV1^hO;J:-C(m[|K]f8Z}O^k+=,]=鑹Aoqv[@WQZ™Y~fv>zzT *R:4^Va A|f]ٮ!<=,ɬth t#!1xE`Ԉ!fΧX/9k=Yv+yퟤe5J^X{dkp}u˗P/{X;ר;jUYa1k";E7 x/i$lk4mE0cX&*gX%0*5etyBT@sK+M_E'EӢ聦R~ E:#8 '&:/ 'Ag~|׼EBᣕh C?y𯅆}p[1<#i]3FWxH|dS3]si'𭵲!M4ݤ:3"Rk&;b(KZ XG oѥ ~:[1m9 i ֭#Ygm  HؓW4)Vi勍)N[[y- }QKVDĂ ; ,:uPv>|P{}FvRXZYtt6ruN׈=o.zʁg缱 glQ+&@2r~& P$hVX~9qD#œQJ q.h`yý4X'h%}17Qm?l U\Hk`y-;N.v@mhq>—"6~2~F33~Fe m"$?%ulj9ǎ;|# ۝|$R Wzk1O f B/sH*ΧX/u+SlqpQxή=٭^"Ǟ .C!(b KF/]QK%Z񲇭äjWTo %? D&^\.] / 5bh%XB/gU|d/gl36|Z7ggP*//y0L ? Ǘ§g dB_3Ccv1U~PQI2\k(ӎr{Q5k%mG"bv$vdkZq)󾔘ygAh%F)Kg* 5]ʻ e].C].CY.CMP] %\3c8b0E䓺FC} &ه)ٖsw5@N5jE`" `=g%X^L+C/Hf%l'iw|y0I(alyä36"zfTU <? + *?/?|O׍UcHH#KFHGv-p#CD,3pߺ'ҽ2Wc<5J*}]+kZd.UI+Gnԥ ہFI|R},+zt,ey.p_|ըn*RO"w NY#1,JH$竾$DMDHU5.Vh1%EcHԨ'Z/oLHQLt3%_O>*Rdpgd*hV{\"OH/s-R :L jR.%Z+\/REō3 ܞ)VԑW]={uuEFaip^X2PK+۵O٢>9D,y9' mHD6>pV_C½VT  ^FPc$ nbu>2O).Ѻ|XiFz}")*}ii59xhitL<=HI:`;=RB?.*S2G7$K@ (,]HO^?#=FlEz MIۥpZ o KŃfY%Y3>T/|>=%$cؐ"Gh٭}!h^GYA_ҹhu2% ^k/ڸ.z ]xV :Am& 㽏gJw 5.XCzZ7~&״[ L2J~GZRsIDg)=s,gD;P)Mק8=C"qS;8`WA͢0Toj3:H :e_,m*ΧX/o??úa~8{~hv>_w~[;b~'|~( $=רٯ$ot>6e2Jv"9RE"W~E.dZEߣ{E.6@k:"˩kEړ_")ߦ%?rFL-ڷb TK: U YXq>*7Bd/¯~(Fi?؏Qd߶$_M9v%{u( Tag*r]V+y!u[04QLN"x/ܡK=hbJF1Z;b~4eZ'Ӥ W 5(Jx)5:rȃiDc.,xI9D>,bJUK2* ߭he\>f|  }'AB 6x+u$ɒ\GJ-}QNGfRс؀hrZBj Y)|Xcs:Z&"Noz#Q"O$/pn KM !C&nɰ}F*4rFx9Γj!iȾ9oCG v,nt..1^3#,W3xAX`Y)~ !j֐:fEǏY& Lo'ɲiR>2x|$ >Q3Gu>zWWW߯`+X  O`,ͨF2*MN E3/G^@heapk"5W3Zu>GPq8֏#(+ p桇9Q XzzJ,#Q₫2 ;lsHMQh3r:bײY@ܽO|$fdfn925(`_B-/AN`%]Vz/I,K#ZorВ.-}.Ur/K3ҷ{-e.ߪ\. Vم%zYnR(xxWW1|3AͨU6UW2*o)\CjQMwz"QKMg>&e$X ϜJOmN~| ndlK]W'y לO^VqH5noVK:\^kK:GOΧXUYIM /WbZB,^+^M'^/dRnշ3 -R:ZAiFu 9Oaj"hb-x/ܷ.ϸt 1@.᜴\I.";ւ}Zkumku?VH?VznZoV7Ԇ F2iVhx6dT‡W@›zjD3VBl&=3*!" M`XM4>RA(|'nΧX/RowJJY|_?c&߶zI)O7RsM#JN\CV03% K|YK!;]iKGvC:-JKI1q[]Z"%TM%GG{h?}3P~Dt-^RZ^c,#ɥ+!:b׽:?q+uYG(5ըN%Y.[8m>p5dM"zuMy yiwO'*b2^)[&U?ap.ua=º9b_E?HU0W7uUX;F|,׸؍Wv|^W1^+ .Ik*/H_k]*}4Sc݋YbBu}lu/d׽lחXɖne_U_W1ޯb|*Əb◺#_kZQ׊i05*_k3El_+~k4N\p.dLM SjSn\d%QY6'7oaz.Ks6=vW<^ֿyRH +$\${%QYlΓCC6(ץxJjEDX)KǝV.9ΣXxKkȭ ^j$B^YճKl ]  d @u82p"p,Gfavi8)R'ގaJ9oF3E{L+M0-Diz wGRa+V < dśQv*&U?=ӨK!Jxl=+8~ (*SXqHT/*| bsgz?Ww>*OGVV%ń5LW=^-%/*vċ ]0ĸ좢Tai2}Meh6Ь3Mj0`?ۣ4k%aR5tHol0xQ]M3[̙XRN톫Z .]؎%@< Ͷ;X{}5@s+y*j5R kѼT:{0^/Ez<.q^]qKUGHʜ &U4x\=r.+Эh!U࿖teiY@Y{LBL2uLeߎMЎeק ڲK3JTcX6^ Ş%-8Rvp_^EU_EWޯ}*ڏh{U æQΚ*兕4`[nmU t-J3zt ,ٗlr>*O`*P醊MBO7S8vY)NbZu!55ʛn #P\+)u-u:DM6ΧX/,zY|Y%'GH h|ә{Ul%b{H{ރg[oDh&/E(<*xo?7kʕՇr7րϪ7Nm𷷞!I-k~/d?'|0o# {p_[nN gノQ!Y|UW0A12 4$2 Dd4DCjҳ0*w>*V  +; |sQ:`\Sb /eg+T;L-ß6_:{oK~ uosC @ѹ/ +~k ߼u8 ߼4> q/8_SK > qߦC)y6!OD-J?BtA[2Alo'QyJ PO`& f A zhG`1)E᳞Tfb/ٜ )VՒY9$-sg##'@c9+,|!jB]h̐[G8s~'om'{.TY|A-PV+R~y1 $0Rq#!cs1 Kp+V!b/]VI=EJ4f%tXWWxZ(|PtKBq u+$4Ng#Qt3w½4J7 B_t>?/,Kae7o=A#^}rgRA8iD'gHu' gDc~͸; ߼L7>=Nrx_y2OO"^ΧXoSc$Շ搄Ds] iŤ*nXkHmlO 2üEK+gsXc  >#6b?R[ L4mjr>*1)beӱHpc/ I!t[<|Ŷ}PŶ?ƣu H`Nozk;w竖=Q≚Sr>zo_$2NH]"v^UλBj}VbGF.S7iNE}OOFqjڍRA| kĹc)YF"𷷶@/˽IE ks;:|OwC?݌ |dȂ).2aӭ[ϑ.搚 XMOwT?KX7nv+'7om,9Y&s Ok)VNb*vƪcOrĮZF #b㼤fT;na+Glo7\ݪm/Y`X}l=?%>hW2 %6"ɧX[-O*I,CGERhL!z)$[UՂ%3xepkk`L B`+0,j{⁗vFYH %y)m|̮,)[}4ΘfCoT>;Tl'9alEj!bq]z-ϘA" 鴬Id.(zL]?D=i!4>=C<0 9`H-&:29b0OkažE^0JT4y%Ͱ났mSd{v aA=vF̆u -% iѥ<4kV޹V#i3HHܿ ]#d#ip[ $$ h /k%#) ݣ8 Zq6\HIX{Cg;Y᳕h]lT[7ŸoS?Ÿ ~GG4]T5ʹH(jh-@5 Х.г,)*{]2֤zϢSgѥzϢKgѩz͢5,t]_yɂ3OG M/omPo3Iu)فUNN~" w훼|zc?ZwaQ*2vsGk=yH\Jk% C.9/*01fxukwf7t]D{98edE5vTHkU\ Ev-Xib;oj`U\ nѥ6uɦvԭ̩7&ZdSkSWlrM]n:du9wYuy׺\˽˺k]u"e-zuȺ˹<9ߋc٦'?<9+`@\TXۇ=Y\*?qc|SLS*QBsa伤r$ٽ347 \e K_oc7~$!JXkc䖜( 1/ӹ%HIQf!=ΖyEADkp[۩,T*|ͿEok%nesHUCZ.j#jr^|^Li#1d|)~W+Q}krQlDkP,D=L1nsGܵ.G\f5Qv>zjj \-n!װ6Ĉ XnRk$p4͜_sH,o&jw;X^ 9X2UT$?2x`ْM9:} 97|K6ìfm}gRj_ݩ}YWn-;=Vp:(Q GAdbDqNӗk0P q3uy~^κk%`S7 ~N/ϋnRo̙S 7eΧX~9;Wk*uN#)|kmtk0eZW٤T [@q>zï6۳$F !T,mIUWX%Bj mVO ]<`*-Jظ9\,yטB%[w&!J4~<+!HHVq ?R /ds_c͍<=Vh7r@*!4FB3kL/"q6ͥ"$o|u g$x s"OÚLjQ).|Uø/0Ep[+LDOTv V!b`5o@2\=|ْZfu Z]pwT5H(|'T,E-JGvBIF $3<;_5=H(j)̊)V?c_:{wS|c؟ﱿtOsO(;\_Nk0"hw<9]Zq>c~;c؟?DZ?uϱ?^ons,U4YJ6Me(mqepn۳nb*!/p;c1KQ|'*7~8:v&!ǀQ4Dzl 6]*ϺGQ!(!Uv߃g;xgٟg~`_4:O#6>ݑЕDT?[ktfH ?$2 Yj=nhux&]0с8-a ú+2rf,3AJ$ f~E/ǩulDw5+Hñ4 )jLw5ЩW﯅zlR5%M:Un1}V.2/ O(Qۛml4^(2YVE򌆦<՗ wD$ǫ`| 0ev 7(.Nz*EUS|HoYw_#ZphT_-Ar;fRK75VSw|a][/_z3@ |AQ#1^u7)ֻZ3qrQbS&ZCg/fj|k`K\>[ oڭu R,dff~夰 %WYȚvkN ߴ˻~//Y{{i0xںE6Ag⌯ZқTH(|UO kh"Pߋ@"PE~,UE~,Z,VJTC#XYTIHbi|%rQ%B=[sb:b߳hY,Z߳hY,Z߳hY,Z߳hY,Z?gedwbdrЋ:`qLw @E g3QLLރ`:{0it0`j:LCS>S? ow=55HjHH#_#]#y~t:{}8: 0UެmLk'jv?AKOΧo4t8-N=iu8pZ:9T[7ŸoS?Ÿ  vö́=^YQKj3 ׷SB6(Q װUd.*ַb*~W~|K_|DŽ-mp[@kL'D $!HJ4<$jH@/yP/ҘJY[k;qTbgIuyp >Z|$cM$jot^R:aJi%xb~٢_k S_N[_5,W0Ze {cJD0 $4fu)DWj bwBc3֍Ǫ\.р4Bk5؍"imHZb.ݖ4-vDb>-v ~[?FP}%906b5OBjr& YvSbת {fEJTiDe':hoN9%XjCDRޛVt=VI7KxI]Ut=n.]|݂-mMmW_0~ohU }կOfž]o!rXEg^g[pN%|fh7\*O " grB[k;~ܖIuKWr$!J4J*LB76e-Rˆ&m-Z^x73B)V`Q5NHN=HN=NHN=nHNs"E<~D:{jp[Rm2el]X*/G} CRlzݡB&^ws{kb ɮY.^wԐZnk%w`!ar#"5[;n!xP2d g E/CVVv2B _6?c7A8m|"R+"2BÇ??>%]ᳶ2>y]2עY+0|jȢj\㗢>=qY'l=K!Jxw#* 7 W gn W'I}ѫa}qLq ~KQ@z߭h< FeE`rU(kY[ 4}嘒K]rXoG,7#:`/yPl Ω[I8xD-y(Kr V!bO5ˍUNkc$ʭ흮/;!Ui;+$ovR7O =sNn*~hlUo@}H!fGI(fG|▾.} 9RЌ|"sZ I+fXB*[5hUH!C?'0#/~[z{kOlNȩ2>9Tip4SL iX)$R܍mDr^LpٱԪ&`e|s^߭rezXջu&Rs%'kNEt1w /ML&~[ѿCFjWK^`H%4ML5|U}3 C_( >[*NHeN'+c!F:DOS7q좦ԥ 8+rzԢq}8b?W[CbB[kg5R.PUvGF S!bt`yl{v$?.tÊ ''PjɏW$?+c;xw9nqb  :Bl 4lrbnnZSd뫨51qIn3Yo^JX$Q>]h!#3rac]r9#[\ݲ*/'F;1%Z5.J4ݲ\ΐ*>Ie`_L-RNAn}ρI7NZpWo7\⑧v]N~n|畄Q߃Iu%I_>RAZ|U#XK̳Qd0_ph@~*IwsЙnT7| ΧX~ndQaWoLOLhҍ^hWKE) םEhk8^3ot^P-Zy-=dkz6 Ad.tYHّP{ÂPOxk.%%uH a-Hh7\զv]{XMVK|j갚a5uXuV=j~+|_V'ܙؚ9Ҥ6¥D, ESg[Ό]qb[ϲl| j#4X5WaՀo-Rg8d)V_^Q}!lrǗU"W]=p RIDR"~+).S,Jca>Iw-R,;;FVH&oᅁK G?lO?=lN[;8XR.[U0\P4|ɃaJq좝 e{#Mo,=]\Hxĺ0ZΕyk9b V<)>5wcKD±f'[[PM~>mV%p-:fiKMVA„Ʃ ڙjR3?M[âp`7oΧX9Ir4ԤfQH|'7_gu3rJa|pZ|U UǨ$~4&L&B5R9V!bwϥ-X<\ؖ~_6gC]?t Dl6!%_W#rׯ]_Y uF>/vQ:_Ş0ro[+4s!U*H ѮZ@!*xqiHhW ~#Tv;Rwwgin[ *wzV:_:oov>{~} 0nГ~8?q:'ܭ;:|Ы)V?8~ŃQw[1H8l[uԘ\*?mvHkH g|YH CGj6̕-:ˁ=0'CBj{f)Gc*(EF*IVo-->jj0~5H,2`}U{?z$߽KޯY{?~y//?/ o_>6,~yaw~ßWpqa '~$ CYh;N/8Q% ޝ)~OOK{{iUWي^cp!J3$Iu#O gkq&) gU YOfu^ŵ1/73kJB7dB r-xOC73ͤ* ? >=kS V ~{o (~S?¯~;~~~W  + 5Kd# NG# ߼3<=Iu'ȷ9qU'ˬ@|UwO?߽ߵ|K{jG7|DE?Àh- ?| 6A ύ߬OO |-Y\-ZpfR>"՚=\=TU\)VsGpKCMbiپ໥Ҁ&4 F閘&T_`Yq Jl-u>rƃnq֐+o6ۙOvVayRS J 6v>gu%.~V!`}ïYL*/I{gOo疉qhsc̙3ӗrRA(n:s VnVJ2BX"dyV75h-3~vN s#ov \8}àK4~O$}+н3}2t:Gi0~&^R H>V˒xob3[8AA 5 Mu]B|Y/|>#3~hk1"\c̀O>30u&r`YzN5(P9{i"ܝvh}[z_g<>6[6چ!`(y'|Np 'FJ0{%B(J~RDܕxDд\*ߒ ?G!=֑#W|\ =D]0&A[ j:7`]}(Hnuطj٣#RA|kMTyҙ&oN?jd6̹L?HQnʜ.|UԊ CwQn0%:MH08|\v!ٚh)\h˷_~_޽_c?9@ež,+RKjӔ_-`;98VHͱ%of;} _xޟv{zY&^}LhXExh>.!<ٚ1x)'|??|~7[s.F7/('Xߟnygu)h{<Ŝv!jgyHyZ/EyJ'Tn3O'`gSNz\>QFNp[ 0Lǀny (^穷`RSf`U+~WDoz.eݫ`dŴ| ~ d}`]I[)0|լyPl V00|`FzumzZVt I,IYx| ֻ]6NVCs>Irlr66 [ZgRx ʋpٰ51q G\͆{̆mt/lȤr?xC %lB <Ȗ.`}x֐s{?mnk[w6>ƻx!6J ֻ^Tmk-E5E5N>]/:ľϤԢ(͋|U7-#Tq>0l|y9 nn|8Uqgtq>t!9DO&a0!N['/xe5Lብ 'Q"~MxIpNZJՐ JvvrȾZp?JKff0:U;F!ǢPM%*׏,^$~xf̠XxU BwK$_O /yPp{P{?@SֲK{V{'Xsgq_"lɌ3uM4̥p[=C0R ~Eg@rR2JTNveȲ\Az0B~aCyRaΧ:pnhWKaQ\DIK*qO,nglPKvJf"[uyRKTTiyS6Ju)B]UM Bփc(ȓa R@,bY湜UK!hp5:|-_G T ꊩe*'lעuM7\DWٮ X/z=C^I*"JucNv^R'>!;k ѝ*[=2ԌhRkAnG(ץD;/(V]ʲ2Eoӌ߶v"]Dί-a}{ zة l_g=lI6 ~kMtic(B muk@|eRODR۵ޚXX!}Fv e-y)7M ?'~?_<#8x?<3c}}}}߾&99$\@.ÐZ+B _.6/*[Q.yu,6" |87o`SP7l+W|['oo!5mB?9dNE@R *sx >#fxS0vf ̄"KVO PlΓaQ6cMC(WaD{,K*|T Md;ډZMٗ.U3e4|<:*='u/cO{oG5e'M1v'/ܗ.fB#moR!zXi|AʥԦ%qdK*:o*~UM~U ~}o * %3H?m<;#zFo*"ۤ:[}Qp[٥]3}y.R1 oaR]?C3:~{ ?Mxg+ Y8@"*h(;m]h)Q:<-Qvټ[z\6K]d.*b_W1U*~[_W1?_r)oyo)oS)OS^I?孟ly+ 0l}/`^*  Ig_~EeFC(|<KHOe8ѐRP6:tK_ڌI7RA8⭉>@t\!(ka3TKnX=o⍟sHzÃO |TS8?_'Oʵ% x|3V+x0l Fw DkMtU?Bk#hq W*fP}=DxeX\0ס{kbl%ûUZeD:ͼ:E_֥A_Kۺ UPmmNl(U hq} k5aװ5a^_øVdそ4#V湋Oao,Q;YwɗY:jICޚX=3 %g+Z0(ikV$<,jתe5Yp'10Mr+UVR_^zW^߫^UoUYVXUŸ 7~ )?~WwE{u],N|`Ģ- P\RE&f^sFcY!P{RuWؒ:y`⶝Zu]꒜)!W ~2n!yn.B f(ft \ >}9Y<2*I }zX[5T;+"G~f_ > A-G~/g'|D5F+{{PaoKMO=CfDvv۞-u}G>yd({1*\I+n}8^-)ɶ}"$.#s%5b'H1BlPˌvCERƊ'*"=ʶhy5D_XԈ1>Vő-jQc[xrd=.KddN`Y.p5XR^(F\s:].Wbykb .};=a-[' +@֔ry5 +XT' 0a' "%*x@aeχNHYd8򷋹lUܢe.e}~eAu~g ' vbOv"84"\HВ$%Q1'[x%A_K;dVd񉏱Rt[ǘace.-]cLPHcD{6+ܒv]N*`E9?[D\co]%PWqߚB5z`ᗈjuXȯ9+Jͅ 3}ұӥPO |F^w\9?ׅaf !5#II(PŠmU k Tְ!]*`8H!U࿿v}.E/]E/z\_t/<(nB;oQZ [>ߑ B4փ_kCѻD-J(Q &Ek0_jߴV3BNt;4Lo2~|冪LH%&π|UkFȘ 8B@[-ʼnǏ(ٍRAh*]FtÄ.c~2ʵh.}2ڵ(.XEyktŔϺsś+Wq l{/ݤ=q^t W'X=H/ Is1@ <^ys[coZ* <`*|3˳!Ռՠfo=EٌdÃfqW!U27e'X>jw'W]6$6q>C\q=RY>s V?cx4bcybOT#9ٰR?><[х![S* n>j|C?xyR#]=g>*1 zAo>aeɲREk*hHxJ^RR֛Ou l]4ĜHYx ʳ&#,1f9ɤp 6Rk V.'3s X*hQ׫`̥{çOY>n.a츐E(Tp"|XjsKrߴVTXUK0 7x8iVӤ:saIȽZ/[|U݈Sqp@ Rߛ3 R?9_i RZ̖U`/yP:8-}=hnܲ˘ 41I T펆|5#Ǹ9Pl?pəG.+ClV"gz+M;۷-W<8Yǰ- O\WWrO cb왉!(XsOߵV='GNJi;;'[\I[ kq.2lz*kp[&[W U5$\=pOc.ϨbZ7˰`J>e8b[|U7-#~~~Wwwxॠǐ"ѹ:[-R@A~3c %?LT*nQi)WE@8*yI٢^q e!l'bv]αwȫ8=If7Cֳ6ôr3$2R٥ 1>z/z,C]w)K%zqxTz+ [zHS{{iwߴ~,[Xˬ*6y`8laяzb!=_``;ݳ H8N-o,f'X>E1' V#,l Pۆ0U-p緽dE^j! Td뱼uX9M drT%֘ L6@H >zߧŸ8c:`Z_1,a ctAbZp߬^!Ǧ,fQf2$C|i̺KCNdo HLf1"**"`w_`'KknҎIO7?INJU]*q V_߃i:xkœ Orh)ރ:xgv0Uh>aR|ɓ'KAR%oOaDZu'X>]r ? =/¡i󣛴f>QR^'Ͼ[kL µފL{l;# NA|88"*gArPHxLQC`W:d`d:& `2L7ɸ-vi/M4@HHnYGmwή~Go $3#w!ӇҘMh]Ҁ| FZxc 8xɼSjh}>wf~R[;o(qٯ?z:{Ż 'zI=s7 4l}#E7\D&9K[I bA?n Ԗ fs3J>*;7AsE*I"b}Ls>36ds['XyL3auGTt=Zm!\xнԖ\DQ|㺑3Z3zqcT\j'GqZ2;Zװ/7V2Y#34M"h]j亸ԀɄ=xA1+kǦ/Q.|#8˳u1"c f\AǽߑD 4]w-xrkQ].au4wH %<0 BI|UcsW0 1gaSuCcV6 :ꜣ=Z /hyf)UzivwM_;mC{i]\24DEw[y_G8ڂyri6ARE],yɩ{-,XOӣuѤVK%gbi^ l,X޿PRO99>[ѿWͤO99~9X /\7xF3~ z.=_c}B*V/ G<ȱ_VG4?cޯLKdwWi'Xg/E&[o:^J}grln o米&Ӏs-> (5]ŀGBOlOJ ~3 (| |:>+rlW~6_~m G>S=~⇶fzb(#W̓÷H?eZ:|+7VyS%!jyOx#ʕ(<7W[LKWi<#,И}E g>Yy,B<~:fK>+ $'F/>\eSl_".Z,oufmZϥ/K>|੪7H [axPp\i)@SNR¿̟YR-SPaɷJ̟w_?]i˛'ڂx>7 k([.*%+΄!g<[ x3xѹ1Wd zTwdtXH5 aK>1N'*B\0[ v ڱyٖcX!DhPwJU W mAPVl ~G_&|EkaR+_?XlnK vFٔ;bK ~,9~vJZ'7Rۭfw*Th~P/BJ%B$^Eb$\ΫE$r%~Sp<2ojǏͥg "tK4IKBw J|'[ԟSDA8ɂ5_U5*n|uTL12NJs;RC i9RD+tԀiy;) j| FJAQABҔZ7ZhwhTG:<6͒x | Fi/Fo&GJ= @C>zG&e)Ouo) ڗEXwѢ_ Bta$txn"O6PP*PyI49I>YD\8N\=N H:E]V!zh]G4XyǓe{Jyd+АO^W“BVnrDh?(dow oDM٠Dh'R*K2:xg}ng%rt lxڐ\k]Ѻ@ܼvώ7>)ymOM]R/HrE+(@UKҠq^R3%G쓦nOnPWq_-'ǥ ᭋ \K%p@>, B4JKJUgavy,cA=*8J-)fY|U<1r9p[<Uy yl3[y\R1<+z^.W+* 0~P_QIbW)#-U|EOB{kk<~D<9<<<3ݧ@Ts""6 =txT]=޵5Tq]o?1\DXؘ%'"g.å# 0Ր "hmvI߾MGR Ro ~W 03 Em{2^ 隽}!Qq]c jLA"5۫y)u\ΓZ;It>m,IsEr /*w-y# E)}Y\WqtY7RSPG ^3#Dot*}#(œy̪*K]2mWym3X1x<Dkg0OWם$~ڹhM~~tv355s?5ިB[h]LDQjMݏwJ}hdLQSk}tiG?T3 vOw|1V7|6ײőj V+15%ދDzo1s>|)E+Д)U?I>VHtOC:Zye6R1y=x b;Br?-WǼ? ~&)#n\̥ 7eVY3h]nAX&Y%9xwFzi~ #~?¯ ?_)Tϊg7P'k.AĴq)U 7`֒O |F"[ `B3 z/V-`C,󾵃C4PcE+AM"^O>x`QwpO[-DIzp;zp"Y$T9VV 0LK} [[(rN]o.t%b X\Sr`B.}Z  W4ؗGj/ "G)5تj#'jK96giyAX)V򭯩Ch{9hrFފQ㳔R9:'aU#N:[]ʚc|TjuOV:pp?RV ޝ xeayHս!2 Ǟ|CqMQO_c񀱇)fss"A3-Sȭ2,m3vD%Bj+Yh'Xߟ?ne_RA/~|g.Z_}8^ L}q=ޯ@2,H[Mu:_Au#YszcW.<1aV.ũL&Nc&y %k&l'HkEdt.r<I}<KיOg~W?[.;]x^ˮvw!:1h=0o1N^y~C*РEke<(1u{ZY̥:*l_-Bvh J%jh6x"AL53 E@"KئF^N؏v~Thn^e.Cv~}^Ơ' Js*tپH%ٞf&KK٠B弊[tA.6Y:#W|Da’ĕY֝R:sc *|S (TC/|SS_ K/׿RGk4dɛN$uɷX5m^; e7~yҶ|5Y~Γy4n@{ ^RrF9oʽGmCx2OzTFx;:Göq+EmZ"0UȫEnNy-q\1AK'׻Cm)V'Tsn,E+0#)5tJJ(d}Jlf>ɷ&gQcFYBIV'/I[H>~c:?M^YJ)q%0o1%cMRmj<6೬H>*Ϣmi̓-k\ZԁDzDQHên)JJρ߬^+n$`rܦcV(ަZ6 ixyb'X1AqYLR0eX$E+G*R.'>n޼OH.CB0N1#8b;Q| RЁ/*=fLѷ<=&çj`k% く!g`}C 4#fJ '-]\t*Tn"/)4ϒG3/MӠ^-wn9̳3VŊla8K҃7i)+o_E7o|ysǞޛ>49dA +%U'Y6lUM٠\st9Wq.<>7v>LSr&er܅p^#wr |^'M 46IyPXR@^PZ8Hp Jv"5_"ҥf>i~Ki{Cvb%V|-B4ФF+Afڎ9:iTo7\d" ;alPJ١uEaxE->-D|!]F'.J"4h 4'JU=8,s2"Bkl7=;;4ȮHv:NW"b%&ɟ$ᔕPkz+Jk D o%JRjGT:6-RSUo=%ڝ$g2w||H!q>zT+6:7F<| 앱DW.Rݰ7?k ?qPZ?a H ޲ϘluVvpϊ<'X>j |!#gN@jGv|5\ZyXJaٵ>[| VN<0,5?]'X/'g @Rv([8_Ro#/"xrvREq3J:6}=,Zv>+/`>SjdgZ}W |gIKEC@B 9>Я nbs)<3SvClעb#k(N"5۫(c"[tAF2Q-E(i>9us*RsQO'Xq+l(Em?TI(|{f BLx澄T[ql+ :"m(PM>/!*%Z'X/4u?A4eG#>`&E#8RMjw&f8%`ˆeI n=Q ٢kKɃ5)l';#*FăB"'~ ˽ۥLwWutT* 4K_>e}4OrugԥKv^REIe@A&;LȞڀ5X ;ֆ1n,64@!?MtnC tJxa\W=xwSISw, D)c=)"=*>io>}d'X/^,JmHC0w8Э`]?ÓO~{_tqFK(6}<f}&ƭlm mƒO^x?v\dH n&E^RKT >3eEMduZiߧ꒧~B w%O 0ӂ*ne|j:wX9?j+ y2uX=1S*>cXlXDeXN]"<1LxG Y~0S.ozPTMUqcN]p0Uܗ.aU<WVl5VTQ tqRAZY,H-Y֘a&>+d Y1ke]bϬI^{eoΑ{}{:fžѽ*3xM,qAװ :a ɘg0j>]5p!36~fl~׊kҵb~׊kԵb~׊kE׵b~׊kԵbXuF.&}tJGK\664LsFҎe{:u˶*U׺z7̰*ߙ$B}QҊmL/!Dh` 4睳} K%D~8QwUi'rOR>J%|u@jKZsJv>zLt"D:NK'Љt",w"D N/,k3 lSv!;ܹ/ߐYl'Ld.t%7|$cE;wN*JXdEBԞR$*}GLO[dZ3Zͫۏ ^1ŷ.9J8|'`k9aE 2s 2 ӶdZ-dAfe+R^4& #1V1c$.[#q>Fb蠑%^F&d<#1Jvsf/.*o}u?oz C?_ރ/n_E |om4R%`yV%kV!-ݥ|\?|;;XhI>*w Cazo0TaX:t4< &4sQ2N龺V{g!j$d-ܳt_ C%N>*F<fȃ><8il=՘><ݥYq|CSjo6-ܣdnJ q  !F1!U{ ٢%;D$`3II35I3II35I7#bRUv\FB_Ew|F_ܺT 9k DoGJ_U9~2B'zJVY3s׫\Dg 6ۉ&׫`#*fӅ%Aݥf0zRAh4*y]$S*z0t%u91'pxÍȾo?^}y= 9xd_sykws};0D x}\Q#@]N=6-u2`{!x5Go<'Sr8ouVpW[nG򁨺oc[9>o͆֒|U 8u\K5b̲u\Vݘg  \V:%Ǥ~m "G å)Rv "[6f*=<# Ƅ Q{91{`Χfx$`SXxm_{bu>jD/ 4 uK,Yqsioq>ϘUQ<Α۹!g+L5 t-@M.X쇄Ÿ>gI*\YŸZt @bH5?{cO~OŽo"%*DN ٢ k5y0/(Cc"ȵ:*‹](Bߩ)j&\ЮHYQA_qu=la8 YɘUc: 4|k&F3@4<1a;ŒRK}v;qwӹ\q:;˿s\~s*^uBNHX[/ňL3,dݤSĈԳ+/RS}_[T0 +1zFapu%nϕ{"ݴwF>s+ًm-5? zl,e3[Ĕ.G|S&NmgA-w%{6ƌyc5͟j$>[.2]j?nc=j=o xBkJAy zÿ?M?C?j ])F?C?M?ÉdDzlqB2c.0Doj@ A'7DZhitjJ ╱.XXw@'aԀ'|= !𽵹s}{_ؤ}{5H(3@t F5pIԪ}Fk-8S_2+x>#Z!N$qM=+rtV=&`?ȃ}woQ¦h=zv\LQ1_\ؠT\^O{k [hͼCf92/5 C? pqq+ \[mʋ-"{lϲK.|+]xU޷'Xo[n5ZO> ^@jgڇ\Iu]Iߖ@k `wO`vCّ}FGԀy,r#LIO@dP/O[T~n ؝v->[]}13<Z킿㺻&`{_"/ 5E_z׽eF})52ǣwu:u{*B?.|I|@Md&g'?4lh ֻzݠu:VzQO|ۖQ{^75*rx0k㖽4R| FA9^}m}}oWM2c΢cdGz>c=:suL~cov=%m 90y\$oh5&:OC"}{J7zM-P *~WU/w κW[9at9H?՘ ćâTq`{f^DԀ_Ko_ oߋo|QoE q ^~/_L34ֽMd+D/j'KwԀa3c!QShšTo],|yd jl![hx\1*}K#!hE{J Ho83! R:!1Q'yҔU>SAiײ@To#)5zi0>C ~Vcjͥ | caJGihmF[OGcql~$~Vc7=ͥӥ|R*V<7 {~.>]{wEJTv\Zl/D9~˾kZl{"6Ԙ90u,;΁s`~9uX:΁;#LhHԎR>R?gVы?7Vvn`gd~#*IM-'Hs?L& g@=*DGY $ePq?dBr(+|jJ~ۓO&]yQy0^` y0v򁘚cW @X[KM` |U1?S r.| 9{ku*T(n_}Z/V_$ zEփNXϓfW21 ϝ)U> ^R]muci_IEg;qU";t 1N!τ@RxNeB˄@rR 1dB.b +y?'^VAƀ| wH C ba!Dژ6'RC{|{hw?oKҝD.Kw[].Kw/I ]RT,{^ Ř3~H; |3d XXC*o xxFJޯ5-/kqm|g,Zʔ/|ol*$9$H><~|hݬv6jn VEWVNmt׌ hC = M\w>Miky]1O ӿOm!o:VI|oݞoC Rj)xG )Uo SD&dC ~춇hwZ]9Z1 "hΤqԀg &Z:_u3]mAH<nAאz!3&KS{yNR[nh(%)=6S&0A';Li-t@8SjGG|co CԀ?~Ԫ_MO3yRzR-9`(qۃ}T[$EkgJfil !j4 Sѐ#:\Na?4es2h3P<+z|_B)hG9S!g3ĐM gh]!>C2 - 3 ~o>Cp6čL#N]j}#yI4$IqK6DP=[0*KTKN)<>hXŃ9wT:%4'Xo,!u2TAڊVh _AA$c)J&[y(Lr]O?#} ,t]r&Ϸ}iCJ>{kp.Ud?)O92XdhLkq )Z+>ỹʯJ>*Wl>6׃͎}{ȷ#d;()у `OMO CsU\|jA`}GUGc~ӏ+pN=Skа`+ b>\n(5WQ+{ehԀ2ugd ۜdgw2' 5]$VJ>zvmNn.]|0]a|a g[)U5(~gYehR~䄇R 3_j7VcZ4L&cCOcExI]4ֿFmr[ɧ/5)4-Zv_wQ3|i3 7>SKW -|} F޷J߂ߝTɣ' N#eExl}S]l1t^G(@ts5r(Ҽ+c%M7 5oe{wيhL;WbXA V.+|;>b:'t8bJIT}#OC q9Dvˑn1Wq_ܹhrNf'#$-rη[*|l{ Tsƾ1J>*{p `: TޯϿS#oO0UYj=Q,pm1K df|,Jn ?,a'X~elyP`,8IQ?!H(`ɷPI;UBAvL[  Yc Z?ְZe k8FK7c *k՟5* zWl?lp~թha) !DУ{NRCMۮktm1kJtu0mT|v80&f)i47=Uߌk>K>zSP]=D1{ 7-!Y'K}׊Ihs%`߀1 t`X˸=h8ܓog_FR5`lch4 -í9 Zv e>& Mi.56_D6[|&`_Gbˣ>>{H\H\GG[~}$ZGb=#au8A&ΓDѺ }3= ύUKR4^2q68) 7 buѡ9ͱrs*t~͒O_:pn!s }%Mm'0usaRA++8>R^=tZ;o3OWW+4WS1x{w!`May0pk*3ߢu3*A\O7+X0 #L?Z!`'gxx3*ǛH8Ru+DxEA>˙@M/>_]O߿ w~Ÿ + { lȝ'sqjɷZC JUv—R8ar۹O |io}7}iO}7}_C߃~  .-Dŭ?\$WfYѺ%ccspi$6f-tԀYF<؞yaVu}W~XiƒMwl2T N>z'ǍSo}\?e|n&᩷TcmJm9ޝR~#G^-~h鑫X:bKU͏\Rj#ȵO:κx0K޷hawQ{ǖR%Z;cXo5:-{ lɷYvT=e?ńxr>[xR'*./3)Z\Xz]§5FaNOJ3;L/P1فC"h=o( ߚ'/I5MsO޽3>SDw;}-E)@=YۂZ2߬~nUV|W-ndgdznGc _U߯~~PMv9"ոi@6h-Z73Ԁ01޶RM~RjޟK{~{kOߵޟgwgglj~⎳/qq"-wuʎssGkg,ΟqvN1<8Y:xL}Y:x3x?->xwgc:xg >OA9{ qV/0sXɷy:9pW| nt-'X ni(% d5r+&6=GmfFF|}+bD 4_3E3dS g(p7| |-)U࿛ nnmH?B{Qy$f*qeLFm  ?j8w Ȭ]~Hnx =oCFz"0?6%Ǖp᧳P{A %O)%<)>~Qwd?zSw~N^}bRΠӘ5S'xx|0f3&(!դMoY~mcxp٠BDJ^-g.޴w=zstP"݌9WJmzoV  $ȲL;N#IB{[Rvl+t4S@|vM355Ϥפפ?ڮI=I='5CYRz\4!lԙ| ١)wv 5%Z;kc[S\ۅ ^'~el-m[{lPH=S٪_]LsZ6q=Pv`]6CR-t/ov"5߾Vê}TC4S!zxfRE t:Sjh r'QScN dΟ'=$ΰ#>QsC/Od-S^-=P?j(%A~wP36M hFRA#Z;^]Sj?_b^v~***ϫ׫׫*QɽxQpMf-X{FV;#5QИTN̈XO ISGHߑ4t$MI;#i~GH:H:Q>i3gTlݬ& JV=fo)v/ kJ [zG{ߟއ߿?>Β= ; o==Q9"#/Ϻ8==O~9O.g~yFVo*~ޯޗuHoW}>M{jޯ҇%Qx%Zqv hԔ*f-?~{c'GϓLN -7R ١6?2ޗ4jpلQA"f?I yCp&Ѣu373Oi˥E g#` xA|U9G ^0Z oGpzڎP+ORA@x>R72wů"GsF(MA,˵#Y{KE#}t-/R8,',[73黸\pgɶZ3S~n߾ctoSǾط7SǾ}ֱo:ww워ط_:MǾ}Ǿ_:3aPo:woo}_[{{k/ho(9Ә4> Au !VRcCnRjYH3dOߤ*0ˠ6kQaN?Ka%ʡ>cWd9ugVT˃}τc%Sw"R~e?`yr&$wߪ|Eͥô|wP-'`|/Sϝ|? XoCsB2u%Z>NKw _f|U#*P<ǣrHzbA*i[-(ʗ3&/fHG)Ԁ?ϞT-;*GzC G@ #7V7Y-U9dE| R^d5BV,_e~9d)˗||]L>ew-A&7=/s) 3Gn1\jc#kHq'X>Rd'Tf9lߞE9\NH;Z|Xt8#:AaA,e,Zύmf8=|̝!_O^?E`]w0].l]LYVE`"8V՜pm13a&;q}'Q/@/FH~UcH&7 ]6!ؓğo3VqnKUO@ۺUh'X iȫt<6*r'fU%<?Ek!_E{ÑǾnj]d( EuTwh3zמBI[ [ 悄@^){]פ'X>D_oKKq2/޺Oؿmuޯ),ޯ+mTW&̂OF%R@ biƸ4Fެ%C$^:[hTN`xL?>{*t(~/g!V?EU9Wq_|DMD]D%ZEDMD%j%ZED%%j%j_L]ӸSLL]S`4t0uLw0!V ܐ+N"h=o{rԭ_?{ֲI@3݂>Rj&p啃u=Z73b&"n jLlWj3玔*u+iN+(`{E=0\vshW>J:O#4KtJu( /JztJ>կwJLDK!e/mc"r} 5&ec}:RE,D2 RD,O Vly*zM<1"dsl'fȶ%B*BfR-y`gkmEɵ|Svu7U -57Sx* 8\q[Dh?(HC|o]ߎCxw2ωGTٰ <)TAGy+Hd+>*DhPhΔ*E tCH>5jxB*_xqN LtH:G 0HlퟀҥC|oꆕRYx.7x{9ޠ /HWb>~s)<9ͤGaQ{e6H|D G|<3y BGI|Uې?N@:0xY/߽G#l{ "htsduR>nIY O [ >-zZT?i%L4Ze [Ƕ }?^8'`l¤\aT[; 8)Uu|Ba66?tZx HO(<\u$>OL>_L1M}L㕾9i+שӸ Fl.:wv>]ŗ:tFp덄뱫"H<{*{7B4KpO*6|y*h(N%yO(18)Z~[{ x0X~rM`+0DFy| ^*QMvViyƍU4 7BOvD6 )kN? ;Ќ)5EܴYt½i >+. `ුM y_'Xog9#?!2'#/tr-% ,sR n}a}wzi]vP {gN +_Ԍ?a~6/1)ooSv]|u9ORrU׿֢<:o]bEu79zT/Xk;[f=Hk:\Z "z09B5+i++i?\]vrJJJ߼J?_vJڿ|%_IW)okXn?[_GDT1feDGGT):3LGT{tD;s(5*EG~tDwDKt.Ki.ҥU.].ҥ_źzXXgv[|$zESZYO V?^ż^ź^yzzUUU̟WW1W1U]֥]]ƥ˺tY?Kq~tKu]/t.v2*%#BV$Lx]ΐjtЌ|'XVq? /^ŵUl?[f*~Wqml.[u*tW}tٗ.*{ٗ. jo.|/tY?+KV"_~VDՅzYQHWsa USdEH/)x"[d^(^OLq97¯(~(~U~In^[n_[n^[II?SH7K6":nqc{MGzH >_qcݎ7u𾆉^$$#06 ыKto 'wtȕ5`I==G~'ԉ`:w" S'NaD߉`:N;dlEt;_"𧷾DfRM\]'Sh'XY`2CR)/6%8sJqXq#`oRA8|\XӢ$`߾o }7_~ )-#yk/zQ IYB"$`o~޷{Ԣ2^~ow워g>kط;/ا a)LMxӴV@;_TKwU/D NqEx˽# *d ό,Lֻf.|`fRD+Fd .ER~݋݋>'} VL{Q8|M&Bѽh݋l d"ofo3K7- uNaSl$o$`,D">3RyG}XaϓR{:7:>X/7e🤍o(שIH[&|"I 瓸JjŚ{r@5l6v(s/wK|$FXAdFJcd+4O\RjI>}t6|$Ԁ҂Fl?:x,zk.Fd"5!YB*_K}cw ;yӥ* )ew&[f.*_/z?KS ɢgf+ŢGE >3{Jz$h5ce PK|4TGKy^#\PB*(=FM5<3]<|ͩРD>x j`56λ!x`z+0RUСԡx A;RN}кPPG~5k `aErS]OٕXwB/u6ٟP嵈lIW.QLx4[HAB`+`D>H"6?H/_ !x+д Ԁޣ6L'l7#5݃ f(ש[}|Sqd?8 N][$tyOW)T.겞KK}r~;tiҞ?yjd]y>=έ#qseH8RunhJR,M)PsaT6I˨JR/!V/:Ԁ%q2U OwJTEsyJBߡGd<ÿ tUFÿAZe=5&HT=ў}t 5ysВO%w,{ޒ(vCLV|@7Y>=WJVc׶>>TxEWZ3R%jWbpA"Nah";t9%5w팠nf?D1ukMH%?@SݢRL"g-oE["Yc;^={?"7{&J% 6H8j~!d)U6@5p,|$L? =8ʭ?O ߢk*E}EȚ~}E[4|J|oQo-[bg]X&2= @}JlDQ3KCfȁRA^̀Y){J 'x:L/{: h1+&.xrR&'pEDDDgkk Z:D[A~U Vx~1.Z:OǷ B5n:'pE`|Rptg$ty"l!x͍?C2bh=O!_j2jvG Y6L>#<{={)edVC'X>r=< /:̘)gz>Ԍ"ƼT'X{Jߏ~>[zuoxQugt]x<ԣ} {H>,j+t-5&2Y!i+t(e,,'X~!<`elXʮrl}(42FjRQf2M {S_ =H Ԋ?=ݳKU"oo-ۿۨ4Wޤ*3Z^JI|U##v(EC0k$_wԀeTPӭ# x{hD{u#3B!,3ZRj?-:{[a !A3c-WHf|5™&jnT~:;0Ϙʻut^ROENOx ag^- 7|X W5b ]Zl:eO _K٠B˗q=EKܝ !b))S=ICϐx7֥D]Uܢ J͓@R}3~qrю\ Csbc;'5V/L6&p]WH[_Gb#04?PKU͢u`fJ %K9Ȱ'.fN3_v:Ϝ'<~Eѥ'/)Dڗo`(ѮD+] :ʡHd;6~w+)bC DtQco5ncZG y걩'5r-]2H4Sd.}.]JwSt mT+ya'ŽK+vJuv*n&"uy/',msR<7E"# 2y*OarqfUG᷽}xmKd. IkY(bfx?0J-Z=q6J tA m8Hىng^"_'EKJ_U(^duJ`;8/)-. 5N%D;.O^DG٣'̨A]ԥ +m.uܺLd ]P]^-{F ox Aյ{*t)юT]l|[ >o*[rJ s[q}IoN.5klMJȾtQk{GWlP]:ƈO62uB/u >o{&.ޝ ]f*nw%74IL yΎk:2e>dN#Y&*ner_a(a];=ʅۣŚNȅOt:}:l'HDRMR W6.2{T+yqL'?C.N\]q= 3w+rG UFPD&Y3ADa m+:e u 2/>:<]u*:сavAbbV `W{K?s%Y֎V]ٙC$' 'TD;}`j=V :C g6k6l:Ά}]u6ـGG>pCu`.:4աuEBC:h  8u?ww{U:=Ԧ{1r2C`MރGGuH3S=Ԧ{9=PyCރ5y~Ý]jxv)t]>٥9dxv٥z]x*|fq.<|oXKp:)Ylt[_Gb'|NR{l~ݣ-챖#쳖)Qہ2nXWK$d+$-`VI 1Bjj8@ۦIBZ$'  ef -X)Ӄ?`PJbeiJf )V,\Yf},i}`)ps?$ mkEGvdY)Fμ87@ȁzϛURZ InE=ymEEXܭ?>kZܭ?>kZ|l5V T_^h`',QD}쀠W%j5@19zoǛg"Oy&?vy:[mB2֬oȭtDZ>e~-V4(a2oYNCNw?kDwԙvtי[-c8 ?tT+;-a͸su}'ֺ Pjn=i>f"ֻmno*.PΈ[A$IV#[1skT(kkcv%CptYN$CQl~ } 9m% r&Gr}q BoEEqkb$q cez+'y/@bi]b r *. '|XlRɹoU_?]2~:Wr MUNT:ZJgV0y0ήtLmءQ& US鹵&ߠr9evq~~)cgAhKHn1;MDc7PUI)I5蛋CٹzB<_v`YS-0\1.k*q8oA4ik1X^agت;΀y^}M]C1Ɣ\'{FaM0V_Rebzj!B WU; r v~hn*A\C>ZlOl_QNM?="SDHbK G38{ϭ50bf(I9z¯cޕ:Uu٠Uz5L)ֻI9j2cu+^='y*Ih<Sqp[;F|u ۙrFp۪ԕpuj}nO)Vo9ZݵdΚs窧9~`#D5T^fzrUϻXR1n֟jyTwY?TϏ?P'?)숕)Ddgz F^9XJxRN#X@:d{ɤs4Si~; FDת7yqtֱpW[Sߴ]C漖Y1> \ȁAwxힸjŭuGً);|ko'^zi (CB9=/RykM;>ڮ cuUVzcGQ$Vaϱ#Ẏ {R {~Zb=ߝ.cW~#s ŵ*iYSmh^尵~O^~O^~$v?AW[K.%%b_kUՋskJ64@VAZeƞ@/rkDEцEfԉ&xwZ im_ }۴XؼZEG?CAenig}5 S'|`BSK@](2tX&vZlG788Htm(q\W\o^d.m|/]njE x5V)-5rr75r>lC-wEɎ'~~Zv'Q@6=Qe:u{ ǙEB}l}U^tHV,hS\Z?Hǭl0^ZqklBfab)VV&72ވkn}P @߷fY` R> 6n':Uᖘ2+΍8Z:AʽPN)~;>ck/e-BɁ8hz-rr{OQNR&G]ێ6B h[\:t?o\\3yg@9zwo3[= E5m8<d38O<dӢ8'kG 7;3C|~oZXV#Ϙo[QNޝ'$387Y&qoӪ8O<%ߜdqVOwyXPd5(XcKtȍ&.iOr )VoG5^GOdr >@ʁZ UKZN[k&.Y(X3;p)~aPgN("S{ Q p@9z!n'>:=0v2Y;#ȁ\T9lZe+Mdyt@)eZ8-bl^:m |2,cYo \2WUr=;!#p<_;C֜ |T˱ur Vʱy~:9֔2~: Z.0l5u,0aITPR\>A~$d/VEJWWa\*Zd7.T׼Lp5XipXr&< |98FժzZn=r4MAZ B,(N[ L]FAQR*@ :*":ڮ܅r?n)n7쓜wd)/iQ|vT]4]KҮ|)XeoZ\1o!> gϣ8%p 㫅oKpV7 s P9QZe8YXi ,r;Y~q,յL9ҥ8YUN" h,bpX \7zZ9́oeCxD)Χ-7[-ӛ-[-?^GVgH! ߸@"=rISߚ%4]UMHv/̵F%n$kr ddr6ߊWEX@~trFV_1[7R_mmBδ희|q@s7˩΅%9H9q77boA܆cW,J#>a+^?b]%*:,Meiڲr%֚,Mi62qb=#v gQ<!@Kr;c[HGґ(XOL+>*JG`-f|(ʻяLK/ȫiIWF`?Ps*"9M(XJ;[kޕy횙,~7= |l|i`QQPG:T_ >*')Vo[{މ fY?dv gPgi| V?A;| oS;Ÿ75(كW]niZXvQ\W0ߵ/%xb=?i}d|,oQQhȀ){bo|(XS >>u n`Γ?z~] xqP zD9ź֗~?Wvѣ~7߷XmI^Zos#Wn8W:m~ գkWPͤ\>fɾ\C<8oOjO7רOjt~רOw~R맏?/ ?/ ? _~O (r_~R*'whA]9fG?'tlY9瘟lE7j# V \jk#*}SDѽn+I92IJj#{%yk,}0۩-qDԫ~_ZTꩯm|c/n|Z^#}uxv?`AB"A_6#rZF:*R'`~ˆ߾?Ox Zf><ބ~ǻ>Wv9̖OOanJ:.u9J[RJp[|yèWGuo%XVfAd?h* H`?Pj%ܛՏsl,,b:f]7©k"ܫsl׽y?o5's_s;燽VB+y:T=ͷ7o?|^#޼_{{Ep><۷w4A\c_qv7O,U endstream endobj 222 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 225 0 obj << /Length 2528 /Filter /FlateDecode >> stream xڽYs۸_ɴSjNۙ5N7g]$}RNX,㷻Z<,+%7Wޤ颌Lg"1&γb<.Vŧ:NIbU-^|6?mqr\-"6ElWKo)?G`W]D7Mx*<7BDUk𹯺+X0ĹLokj+[ ɟĥXnPXj$1&qU}pNHM |@ϑh+5W|@ }uԟ뢈zH:UL&qgqT,wřJX8g:)c[h&jtOO(Zv?+/93͡[,7\l+.h};7L qh/uW$qA Wϳ*V&)AwpAeu#ւюUslr_Uag˫M;9ܮZ&i76Il9WgF&'GE0I Iʾ悂 mwJV趑׵{p T%БŌt" y!3IX588P48% oxVM0@ 1*ݜ#2#PyH9،8hѐύhB%|,*.Ԉ5#?8)@;2hWA֝;-*b36e1ljKU")D?0BUpru0T}aa ذAwFee lh!޲%刃#S>+0|BNNTC>TvTMrsjBγmP\qͲ1n@P:6hk2m~a2(@7o* ]+{ u'+-cX`c݃6CVl6do ewO?BfM@:HҸL=х"K(aRBzGIrJ\O6CtC/ k@U5$ipA4\>m/m n|XnPY(qg?xS!:el9ٗT ur1JE`DA'ʇl"QkXr96,q XL\'~[1Dz?PVwUC웦LJbˌޥN6urCX$H3k?$jIqj`40?vE*Rn8j( 6fXSZS梡lomO?VP : L-Ԏо `+68-+wSa/,^PeJyMDC(k1˄dpbaQQ=/|&Ώv@"MHzHb=6;Xׂx @[hZ5԰Vf:0b3$ү\1;X(il)!Cxg~Fס5JS#ҭ8}/ټz"" a;8̎\K "*C3RetN;\c!ԏbԘiqcd_%pi[ίɜ\%-UANB2NQveG<<~M5cU75TH_s)jҚ"̜`9 Mip|UտodğO$BCxeX,Iy\7Wyh}J s6]% [h/uky5HJYr̎:JE!/RW:>א(2溛>ܽ v8w{FWs FE.H t_dI>߳+_,e  4b."+Y k72PȠ&HǟnV6 > stream xڍXKs6Wh X4;MgQd=$9@-H wE..,` nsuF,6 ~d$N}Ƌn;6_B{M{+z)3mǓݡA[xQ:*pmyޱ`ͩR(:Zy 暶`=K5kk z&F +!<׬5AA$@my2e-"Q{eW2b dnKzJW`N/FwVBN 0s2<YV\fB=QN7k|f\Y<8d!{k" LZQEmslLsKQ0@D!g`]e*!B/Ša 1DɄ[RϹ-B&9c֭AOz/'X*9%~vYb~nM#7*Mt;}lڒg)^V L8 Ba ΪHy8x,(!zQ+{ݏ+Uוm=s$E{70OdRˌcZ: ;c+kv%`ONj~#@ v[Na/rP խ;ÿ~\}[_5 0xڬ(zoxuqhT UYxZ0}zW(;n˖סC{s)I0&,}_X]DWD~4Y0.)C8*&Ax³@PEj"4p.hO~6$ań* ѡ)*w[?,cr/Eҏp&]Nm5 b?}10aϪSNV gW/_8P/t+`zo/@&Q)SxK\c\;>>tb:-[~vx ~jmK֙.l@ܢa\/:T1 ,0Bς貅'3nĸ0nqKS<= RLS8M]`RXlp`0wn>j"e ?U 9/6FOp}Ga`{weyé's[mڦwEkDk9XPP'TrɃXTvA\yV"Mm,x+Ik$ R)f+)[Zcb*.GTu:.[=YG2(uH!Lẁ?YYU=Q ҠN67ߴ:צh[!uE#bFW %VɊ1Ex?3[Ԉf&$=* o,PL]KW> stream xڕX[۶~KK/iWL'$A(kHM_\? gë@_{'3| gLE&,Y~-gWoBpձ4E.=zXy< w1Q9WyYA_ݽYIBe~աp1=WwY<͠Gy0Zt~ Fk@ej7Z/Z53ueMl"̶V TTE%؂8XEkmA0`O1?THGLMmn$Eq^هaJAȕj{*b#'cI]8G m(VQo`PS\QD_?/$"u[뽙JyTlrsM8q,TfqNPlI&ҷ{ӮLv^3O J۸ ,.?:cO_yETO ũ !Ѳ7#`F)PIc(Vc%uO84S(p]JzV\pmu_n<'p.C 5C׼k)dT>%d3*E[ k~%fzI:9z "r7iA:lq *jPd0,4V|91wX,<'W<9޳i.y il4P2raMU*4aAi--V4>$,1I!laH.;ģ~zwbd--;İ7xbۡ;?-lԥ9ix6 ҋLo^T)N2Ic#yhsEVJH6uygTE<񠩊+p0MkG\e>Q[pMk56h\S^yݨdö8UR !R!E)z?!+ 714q &v]Yʶ}j8> stream xڽWYo6~_!@!,-޳{4MbAK$X!Rq3$؉ݗ!ɹ3О[gƯ5q'YE(u(0v}Zl2rB?eҕ۰ώl#Mfz"_ !$-*]ZޅbOiyǚחLi͹ 袓SM{{Ɇs $6T8( =a^q!ʶ9ڍ@;oh]AnjϹc.Q[7=wvΝ]Tv;\+v'*Swi>ݻΩTh{__h%܏z$MzM'tf/J#J bY)z;Mj+g͚L/HmBEz|nFoBUps#?; ٲkCо]t(~;;ĥI΅J- 淬^W|g2m#$z1{? -fq#[5)76#J͏;Rʐ~eaT+oB_Rҧ*ۊO%P-wNfS(hI"4U2(0QBoLy;we ErXYRgBU!*pzVۤC(=kq6窊.˳~%vg/JE5k7}<1[LUcxPBA (] hQL) "ש&1SBPB~T(b;݂FIc9m@Ս(EB4#=z]~Oe08th}DT=ͣp>-Za,ӟ%<JV}aPd@V( ҀF?Xd Bɛ!EBn&Lʾ͇TFovYdbOY3I4,T}y¶`u-0˾I"E\Uߏ4J]FUY(IȽj0NGSc}0̤ \D̤>L&#g&zՓdȳS6/73C) yQ2}G-.ڥф^QIA{eQ t`U1lHa0LEu#Ȃjpn5 C5M i_S"[7@n;)B! FmU94sL hYxʇQ2o;PUHCp)c-ۇ{%s7\.]zIsIcqQ1 ɮ4mog:UN$/oH뛌 ͼ]֛AB}`+o5O/+YƗ1O?:390NjM=ʗU6^,C]2qx|9\rQ1xy~q>{g̏{!KbP+TW]m= j١ ]: π:]SLh^_WNHxA<|;ΞzQu#X endstream endobj 254 0 obj << /Length 1074 /Filter /FlateDecode >> stream xڍVr8+t(H* bS1dz( șI\ i=羏0Gݜz]\(@KQ8–匒|}qn8'i2[D*}Crm熍@~aϗG840Fӓ:oev36Meqx4{cեZgp;9I*g06<߳T9yt kAh0>H5 c*ZD8[m3J:Mdv|X(#|:Ϻb_pIzdTrgV&SMU$}`o13GtdTmXYiwTED ~9Y4uܻJ!  ^ad\4S3vнegs*9}bĦ%hMt:;HgGCvɾkWqzːݶtYբIsTtZ2J+S.s5wiYب"9xp$wr;LPCVs.XJH,!PfȚP( %ض7~تv~75`]r-5?m]r ^PPy[?nX+%2v~p^^c_?6aBȅUU=xBt9mD u4\XcyZ-Y)gk^<@ySr"oOS~'oЗ_G/? +$Ja endstream endobj 258 0 obj << /Length 557 /Filter /FlateDecode >> stream xuM0+8^&U*ZEqRZxd}DYNHfGG<|E9%Qqc(Y$E(Qq^WJ"WNGE}kZp^rqF]N]v1 I O)KUvGF4G fGMrx˟V ŤU2F3gksm'4:MsՔ?C= nf٭%mSjF>c%Qu?QDL{lz꯵96R9L]$TBZU:lv9hAޙ@4X@ .XЃd0꿑Ї<i$[u̫$Ҕ8sQz؜Ć9)rT6`3 =ic_\5ޮ aSmua?(8:@쇲#:#eI8-}S0Kd0*^6[?_ => stream x313T0P04V01T01S05TH1*26aRɹ\N\ F\@q.}O_T.}gC.}hCX.O? |7Po3  \=J' endstream endobj 261 0 obj << /Length 199 /Filter /FlateDecode >> stream xڥ=@PL ȟ b&ZY+hxJ d)-bߛy63f%gtx0e5$ jOaj:*yAUlQtєg&̛}Nr 5r^ a2ʮ`i`r_zH&=| z)3WwFHH endstream endobj 262 0 obj << /Length 203 /Filter /FlateDecode >> stream xu1@EPLL 1D+ c&jQ8%gdB-^6gߑ;dO\q~ƨ4 Py*^r; SrPEqbtLR~3&0 > stream xU 0ES:ޢI N&O'8:knh@}7D%YgXnE68])$$ƒ~ܟv1ɂ1GG xos*!~Zo(k B" Pq>.۶{xcA+M;= endstream endobj 264 0 obj << /Length 187 /Filter /FlateDecode >> stream xU @ O Yxw8jotr'utPQ5I-$f2c-Z)+GZv*C@Hx=Π9sT/Ԩ"kF㇠ZFQ"7!\LŮ{kw; #e%(𮈻i^/aTtY!)y@,=l M>k endstream endobj 265 0 obj << /Length 167 /Filter /FlateDecode >> stream x313T0P04S5W05P0PH1*26(Bs<=\ %E\N \. ц \. 30߀JNa!?#I0#;xI#> stream xu1A50]c&k%P)DRAhQA;C_ V:F:i]yYm)5КԸI T:"$a"X B$֞?!#rljtjCsehx. MO {}RmU@#C3zT endstream endobj 267 0 obj << /Length 203 /Filter /FlateDecode >> stream x}Ͽ 0[дtj3:9::(> stream xuн0[xDD'㤎]GQxFB1K~\q4CCM1x "֡ΐJ[1𥎁ޮt=x= W3ƼVTQSc6CC55Q>Rp(s5Mے`_==?ͥGrJ"ZSZ endstream endobj 269 0 obj << /Length 107 /Filter /FlateDecode >> stream x313T0P0QеP0P5RH1*26 (A$s<≠=}JJS ]  b<]P$ 0,) endstream endobj 270 0 obj << /Length 210 /Filter /FlateDecode >> stream xm˿JAOSLs/ <{ F,JSP /6G> 曙ҟV녞kYjUrgq+q)L}.n|w>?J3QV{XuG>vv}1=@nȘ^@2"u)'n6?"2ģrL~Q endstream endobj 271 0 obj << /Length 151 /Filter /FlateDecode >> stream x313T0P0W0S01U01QH1*26([%s<͹=\ %E\N \. ц \. | @ v:QAA=N ?@J@#`p`\z> stream x=1 @ER~- g`#8RK EJ4RZ(ޑ'̨i> stream x313T0P04F )\\@$lIr p{IO_T.}g E!'E@!ncr e endstream endobj 274 0 obj << /Length 124 /Filter /FlateDecode >> stream x313T0P04 f )\\@ IrW04 s{*r;8+r(D*ry(0|`??0 ? v'W a* endstream endobj 275 0 obj << /Length 118 /Filter /FlateDecode >> stream x313T0P0S04S01S06QH1*2 (Z@ds<-=\ %E\N \. ц \. c$! b\\\ϊ> endstream endobj 276 0 obj << /Length 102 /Filter /FlateDecode >> stream x313T0P0"3#CCB.#)T&9ɓK?\ȒKCKW4K)YKE!P E >'W $ endstream endobj 277 0 obj << /Length 137 /Filter /FlateDecode >> stream x313T0P04S02W01V05RH1*22(Bs≮=\ %E\N \. ц \. QqC=C=2p\   \\\8 endstream endobj 278 0 obj << /Length 205 /Filter /FlateDecode >> stream xmj@_<s>QiZ &z(BNM9$7GG$f+`f`'TE‡~(=iDEI1E2HQ]%0 T Qm} WG?pj26N`Ԟ}}gvjPhCLQmQ +I.I7y-q endstream endobj 279 0 obj << /Length 273 /Filter /FlateDecode >> stream xuN0ty @!R)`b@L 5X dcģ҉&~uD9մWӤn |0rsK*kN%Ƭ9;fT`6kl:AP<ʋفa2~z`j0:hoTн Y,lR7"fSҮ_‹ᰮ@c91XtX u(cAr6y.!nCI@qqHf `W4x?l endstream endobj 280 0 obj << /Length 263 /Filter /FlateDecode >> stream xu1J@7L17l hvfm +BBBNVbKX"$IX 7c<>HV<|ɒog@%N~oniQtS)1(Ռהm` ]\ jys 3[ =5=9L@jT TZ) iv@J/cqCS86vKdSΎJ4{wS2&-e$ Ԅ endstream endobj 281 0 obj << /Length 282 /Filter /FlateDecode >> stream xeнJ@L304? 6XW0bUWV[ +,Lv<7) #I6;O9挏N8O>O:Ks>v g.__t4:DG ^&rD*Ovt%JtJRE8)m _(j#χA$`Fl r5YɀM%o x}nR0k@( V:P/ ~#+ 祾` endstream endobj 282 0 obj << /Length 188 /Filter /FlateDecode >> stream xU=@`6$p.?`# b&ZY+h+L9 Gذ nKfQ!!^CUdx[a> stream xmбn@ 1DG@ CT*CdPeJ;vhծGQxFkDd>;zWMrMMف5eJYƿ?mvϬ ΏToHN [`CZ,{ê3VZw LRD%ڻ{F:lZY> stream xڥ=N@Xi=B,  * D)S&\7GH6.DIi53oXk]꥞Z\ޤY\jw^%{"e;xIVV;RoN>`a}x3 HVmHb&oNhh:+Tp=q::Ϥ>F_/C21eya:#f`x!7<=c endstream endobj 285 0 obj << /Length 208 /Filter /FlateDecode >> stream xuн0k#xO `D`qRG(}FBЄĤ~pE.-K =zh.wStlytGN_NgL\kZZo-T c ښ[ۺ8Rf_yOwy_6|pdmA&:QV&ҘP$> stream xu @\z'H  ԩCtEh>уhkeͰ;Sr#&ttBpvd31[%OюWtOh9qh璳8"hre)Q5VzV \4 0i:ul3%Rk-Le00JKE|}xB endstream endobj 287 0 obj << /Length 186 /Filter /FlateDecode >> stream x}1@!$pBBEHaRK .G(.ZHI%ψ$ɧ)) EQgLs$"ܢvKs. yF R 0RG5X-؝X͠NPSϐnilbEO&4>=VgWX(9nn endstream endobj 288 0 obj << /Length 232 /Filter /FlateDecode >> stream x]=N04M8!UeHbD9%Gp²!4_fjOKO^swۆ^%k#n{27ocGf}w ?6\?Ѹa@=*ŀ2* : (}!WjtYW=-0|3?*| zclb`Q$9R 2S }Q:Hq/3@#7p@ endstream endobj 289 0 obj << /Length 193 /Filter /FlateDecode >> stream xmA @'.4Z̠Yjei7( q 3o~f4\G3C|:x ҹ|pb"Q)PHK9OeJ5jPRn|-`Ys.9`6.?g[@K۴`Uf lvi)ʡJ渒/V endstream endobj 290 0 obj << /Length 156 /Filter /FlateDecode >> stream x313T0P0b3SCCB.c I$r9yr+[p{E=}JJS|hCX.O0c? &p`Q"p@#`p`2QpOar IVR endstream endobj 291 0 obj << /Length 239 /Filter /FlateDecode >> stream xUϱN@ PK!~@ZK"" & Z> stream x313T0P0bcSCCB.c HrW0r{*r;8+. ц \. 001 `LAȃ=`Aԃ:\?DԡQ?Q \\\[ endstream endobj 293 0 obj << /Length 242 /Filter /FlateDecode >> stream xmбN0?`閼A' X*E"LSad`y^o+dc$sT@|89:]NT8V4)[bFw)/=e3ynr5z z^AH ^_kO mb2{ o)޼IPX5`j5҆uiSy 9i^Z&WW9+ow }:难{{ endstream endobj 294 0 obj << /Length 221 /Filter /FlateDecode >> stream xmAJ@tx9B FSjtB\U.jir(sn }|2)$9?J\ze\)7oϔ-o/Yr>RbGx+$qP-T 8a Hڔ@\fgm{`%NGPik,F=pk0jluo-9m骢;[| endstream endobj 295 0 obj << /Length 200 /Filter /FlateDecode >> stream xu1@![L 肰!V$&ZY+h m(ذ.1мL4'bN%4 )$ft QbÀD4l ;+#/t=ȳ͂B9C X> stream x}ν 0+['SV8sh}>B.E$$q4MS;Q)+!׾28^0+Q.zŚl s ,5yofJNѭ>THA-I?6*<+1vL{Ԣyˡj endstream endobj 297 0 obj << /Length 226 /Filter /FlateDecode >> stream x}1N0g4M8$DTE"T+*Ar! D+f$4y{%w|VmisEoTwqZEzz@Mn+R;W\>Ұc< }:!1VxdV8H+-Y¬ȧȹ2sCtb<"C^D/.gx/ӊܬٿt==}h. endstream endobj 298 0 obj << /Length 244 /Filter /FlateDecode >> stream xm1N048IUeHZ()XA 8WDAr)5cHœ5\+.U͵CT2,.[ҷ\/eL#93\SaXw>:@~^M:_6;~qLǠVrﻘJX&{ب#Izc&4~g'.zw'ʗ EJsY#袥} endstream endobj 299 0 obj << /Length 245 /Filter /FlateDecode >> stream xm1JPYR |s}!` A+ RK Eʗ^a2Œ񟉋6̼yT尒x"p,\@_فs/*g. )&LOPvY`n ,{OěMx[l)zi&$vX?zΏE7 }t endstream endobj 300 0 obj << /Length 163 /Filter /FlateDecode >> stream x313T0PaS 2TH1*21PA $ɥ`bU()*Mw pV]  b<]HG#13acFT0ca``?p`L> stream xm= @irYV ),J--mM8mR,dgbF)MidPaly&T'͞ Zh = vA͒#Kv07}> stream xU̱ @ B>y;mB`A'qRGE7ih}>BAyMI!xLH4PЗt0F#F 5Q$ rJ ELErILY [A37yxZJҖ^ yY\-n-!vjQ8)|%\0ok endstream endobj 303 0 obj << /Length 202 /Filter /FlateDecode >> stream x}б P/'HE2!!(hJG"aRq? noƓ>gF;Xdg·S=N[qrt驻8REQdHh^3dxa;| 8uW;7&(#-zH_Q+2)e #ʈ)_,VW"Xp endstream endobj 304 0 obj << /Length 197 /Filter /FlateDecode >> stream xU; @? ` A+ RK E[7GQr)h1/t)ZEyɗϴOC-*2gd6:%Smx],vKȬqzjHHHC,10\qEqRc,S4EB訵H<,l)o e@)]X!uE{/^q endstream endobj 305 0 obj << /Length 212 /Filter /FlateDecode >> stream xuϱJ@_RG> stream xڕ1 P q(dGx9OA ZN⤎m֣xҘ!$!'3N*Φ|INY>-KNɗ[~>^W݊SSNNT D'Ҡi!4y;쑷Gwp{cjCe s]ؗʞZ."US9©-KI endstream endobj 307 0 obj << /Length 218 /Filter /FlateDecode >> stream xeαJA b > ]vj<-,J--mo||ybCBdy-j /;~2xxD-+j.KtoOԬY:ni0s #VH|ěFo;s+lq΅Ƕd,6ɺY'=alp +%D7p endstream endobj 308 0 obj << /Length 196 /Filter /FlateDecode >> stream xm= @'X#MXXSZYZZ(m#Xo[fa5B&x#/~,+E³N|n-f-nKn!R7 !Hꇨ+U4jdcޑM-孍@l_ "j~' f&74.WHe4A o \s` endstream endobj 309 0 obj << /Length 181 /Filter /FlateDecode >> stream xuα 0+ zO`RL'V08iGE7}4бC1:n83d3dftJFq> stream xmαN02Xŏ{H.X*E"L0"5)oG1o`ŃsaA t7;/%KGvA)N v=4GOYScs W,6+"< .L)'rf;GpaF]1P.;a?2yWL ǹG9^jo.G82TJ="b> stream x}1 @49IH,-,J--mMoL2LvY~ Gc 0G8 q bɁD9쎐y Y|=,9 ܂IѱË_ꪽ^cf8y/>_[;bPsfm]vҨVi.oVڷ[eڏ2t6 endstream endobj 312 0 obj << /Length 156 /Filter /FlateDecode >> stream x313T0P0bcKS#CB.cC I$r9yr+r{E=}JJS. @-\. =2>gg`zp=a&f?qA|.WO@.J endstream endobj 313 0 obj << /Length 205 /Filter /FlateDecode >> stream xڍб0# $ hA%1!ALd08FWxX`|]ۑ5]2hH}sBK&rjиjO(6d9(\G.zQ(ښd0 Ԅ9F"Z ,EIIQx %U4d]ԆG mQMSe[p )yX$>A&<5NX endstream endobj 314 0 obj << /Length 230 /Filter /FlateDecode >> stream x}ͱJ19X&ywl 'pVbvb7[E(6W77V80/̤mfRɾ@f|mcqw<︼Բ\vgt|y,/䲖ꊻPLdK?t4g1:Vu&*ޠw#¦%{"oOp($BJ(D|p0hs^>۹3k¸ cԤRP5y>ZsY endstream endobj 315 0 obj << /Length 154 /Filter /FlateDecode >> stream xuɱ 1 ኃG0O`\op Njh(bl-?崚aUÓ+>$?*_5o3z  H1D>1Cf$t cUIa.<5Ga D"JLKL`` ?:R endstream endobj 316 0 obj << /Length 194 /Filter /FlateDecode >> stream xu @`Ń0yVq :fNSuPY7|;4kuhgd4GO q^ͷ=@X f܂x>] C)C 6h[ }POmwj؊n֬GerۺInOs&y?ͅ_[*o&+jIhiKx endstream endobj 317 0 obj << /Length 180 /Filter /FlateDecode >> stream xm1 @ )xnBVJBBB"^do)BBbFST@F R/r@)Z?K6A}cE- ol}:X}"j&xovV$GC* ~f endstream endobj 318 0 obj << /Length 198 /Filter /FlateDecode >> stream xm1j@Ep!fsZ1d"W.B*'e h{A (&E a-]{^ҙ|Xr8}Rݒ;=K}A~qIג7j$2%32 ]hzdLs_Lä_Yt:wjh^H;FU.o%mZ-/LRz endstream endobj 319 0 obj << /Length 230 /Filter /FlateDecode >> stream xuνN0:D%{:&KmȀbj@y?BFi>@UJO򢸑Lȯ9Y^.wv™/}UI\ |~|]=%g\.7B>@T*ƒvPU> stream xuαJ@ )#d^@7!;N0Xr׺Qro`Y#\q|,Oۜ/Ҷ,7nV2oFOKds9F6۵l6PKF@f*;!ɅY$ rHT 'HqĘ8() p^we  * L1j ~-Sё1qx 0hD^)㫎 Zz endstream endobj 321 0 obj << /Length 179 /Filter /FlateDecode >> stream x}1 @]RVBVb(9BʈqvEy03L8I38Byrj5tكL@N0ހ)PR+IFdޒjIWZE,& *>`۰m$jKaj` U endstream endobj 322 0 obj << /Length 206 /Filter /FlateDecode >> stream xU1j@Eq!fo Rd\ l`W)B$e\vG)U8Mb3KtkZ>iyW]VGmZ[wy|گѧZg7}'8l"M !#T ppP\`~ԅƲꌀEwKr40À0=O%AnRZA endstream endobj 323 0 obj << /Length 176 /Filter /FlateDecode >> stream xuϽ @ nY ֫ 7:9::(>#tPCÑKm8r#:&xAk%5ጙC%k,ƭvd9%hr%HDbfRA#JA;=LVi@ &!`nOYo .n R endstream endobj 324 0 obj << /Length 178 /Filter /FlateDecode >> stream xm̱ 0H-}SV08ͣ7#tP> stream x==@!$x.d@ b&ZY+hq%g+̛@.Wy!5||4gN>0U(N$#;NQ=_;!EFg ꚮ~3 |4ؚ4#\Y]gr1WOL$ǭ#bVO endstream endobj 326 0 obj << /Length 197 /Filter /FlateDecode >> stream x5; ` %79m`A'qRGECGEzcokB>bw!ܗ&QvGlE/rPPMycEQѷ(5ҕ;i?͒5-7-ǫy! ^P+́<$r4+n "ID>8q?U endstream endobj 327 0 obj << /Length 216 /Filter /FlateDecode >> stream xEαn@ PGNO_KH@b!`b@L#nvH0e`'wgFJ)S)gG, 톊!څTVK:V6t՜b%71w%;]ͮ:$δ & nKoW1]ЋputF@uFjM0>ɏ) N6#0˾ j5>[ endstream endobj 328 0 obj << /Length 224 /Filter /FlateDecode >> stream xMα@ )iBy` A++Q);l3j:-(#IorNjNӜNP6hW%OR9Q[Qv$QKRvrM`> stream xm= 1F'Xxf׍ Vº[ZYZZ( vz4GL?13yL`(d8.,mv}zsQ]볝bʶxޱ-cIٖJ%YsU f7[q(hV젨[it'zS[ v.Q*FEQ"x ?>&Twse endstream endobj 330 0 obj << /Length 221 /Filter /FlateDecode >> stream xu1n@Џ(Vf\^PXJQ*;eDv mGt .4#Jنc^"U4aY:m_ȼqy1'ˎ2%'PU2| (2w(ڦE-zD6BF{DIڝ3?mgDj # Arf#rNN,t']c^al оWqi7 endstream endobj 331 0 obj << /Length 170 /Filter /FlateDecode >> stream xe10 PW"y#' MKUJȀC X)GQz U 8eSI< e 15ߗ rKIr5JvDYPT)wK@1c5 0|2 GAw= /t:pZi|m˸иI Pt endstream endobj 332 0 obj << /Length 229 /Filter /FlateDecode >> stream xmбN@CA2 <əXg"WYBh<>%aKK6eg]B}}k{oxⷊ>.6-\WT<*#Syc]nyv@6CG'=D",2dfFz-mə1:;_w1|4t4hn7)xM> stream xUпJ@YR,LGȼnb.r6?` A+ RK E*-GHEq[E}\I)rVɢB+~ziRz>yzu^%k+snv#r69MD^HjO@IGJ3&`MS |08oF xo2("~B9~}B@BTB_Cmc1aH9ԝz xk endstream endobj 334 0 obj << /Length 214 /Filter /FlateDecode >> stream xe1j@[4'JT@!* q"JR n+s.*70‚,̃0ir$CdKyyωf^ˊ$9GlӃlKZhYqb~OC~OxCH7L-VhPjeL hA؀&jΨ\5әcts÷|*f endstream endobj 335 0 obj << /Length 224 /Filter /FlateDecode >> stream xuϱn02X%{D,Q*5C%N@ծu͏GCvaOoQϚGhI 5NXYQ39^pӢ>PB"m+}~|QovOdPoP2Gp=AΘ&n > stream xm1N@ D'JM_C~QH@Q%Z6T({-SD1Q Ѽcgqwm݉>4,mFG K=\ۣԻ3mm; d plFar&@GPي>pOc({zUAL/.ީ8|ks endstream endobj 337 0 obj << /Length 202 /Filter /FlateDecode >> stream x]; @GR2͚Dp A+ RK EBRZ㬺8N(->GCW;]@G5v*\ jwR] endstream endobj 338 0 obj << /Length 251 /Filter /FlateDecode >> stream xUN0/ɋ @Td H01NͣQ=X1bdoݿꯇNVknӟ/b+C~g7A~u}N7;yq'rTL6lq#T%TӤE jU$T;xؙVpya"Q1|r9@af6Mq@R{ ͊Ie,yZ,[Q?_Wu endstream endobj 339 0 obj << /Length 241 /Filter /FlateDecode >> stream xuϱN@K5 E+uM0bcl <Yumչ>*epUy> stream xYMsW):x?ݲ%;Vzv*x@B h;>!D3$T03==ݯ{zF;& %a*&2"Mmόv`V`uԌISԖ%XP4,Q,:e1<椶g)R?i43  RPPp&XD@aG`*),==:"eBH"IJ"%Ӓpr(̀JSlTR`CDǣ{ǺLu<e9v<0.mvnlx {dOcOI{'m}Zx LTɳfr*:m{eO]HHxht,)0}{r!vF=}rV_=(:{v=Sf:l0G;6ѵ-` 8[VlLqWLUrz9[NlT?}2T!GR3͞SfjRN3% nEv]vBT5z1o0Iۓ ,'?[Ñ}wb!= ʖO>׷|B endstream endobj 344 0 obj << /Length 192 /Filter /FlateDecode >> stream xڅ1PDPl Ċ1D+ cmq@IA;WL0 v xlagnEt4'g'Ty!n{> stream xڅO; Pl {I*L!he!Vj)h-G,-$q̃T;LNuihuɗV'/2O4Ĭxq7 $$M | ,G\W{F9^ـ"J[|rY"ֱ4nT?pGrjݬc_e*[M* endstream endobj 346 0 obj << /Length 167 /Filter /FlateDecode >> stream x313T0P0U0Q0T01SH1*26(%s<=\ %E\N \. ц \. L@$AD=$? ?@P&VV̌...SG;&.WO@.n= endstream endobj 347 0 obj << /Length 114 /Filter /FlateDecode >> stream x313T0P04W5W01T0PH1*22(Bs<=\ %E\N \. ц \. a`?r 5ez endstream endobj 348 0 obj << /Length 116 /Filter /FlateDecode >> stream x313T0P0V5W02W0PH1*22 (Bds<=\ %E\N \. ц \. c``pzrrlI endstream endobj 349 0 obj << /Length 104 /Filter /FlateDecode >> stream x313T0P0UеP0T5RH1*26 (A$s<≠=}JJS ]  b<]'W * endstream endobj 350 0 obj << /Length 171 /Filter /FlateDecode >> stream x313T0P0S0W0P01VH1*26(%s< =\ %E\N @QhX.OXǏ?1 ɁԀԂ2} pzrrxS endstream endobj 351 0 obj << /Length 116 /Filter /FlateDecode >> stream x313T0P0V0S01T01QH1*26E-ɹ\N\ \@Q.}O_T.}gC.}hCX.O A-4v@ ù\=emH endstream endobj 352 0 obj << /Length 99 /Filter /FlateDecode >> stream x313T0P04F )\\@$lIr p{IO_T.}g E!'EA0XAՓ+ ; endstream endobj 353 0 obj << /Length 157 /Filter /FlateDecode >> stream x313T0P0U5W0T0PH1*26 (Bds<=\ %E\N \. ц \. @#HD؁:Q'@&> f0d82>3 df Dpzrr@: endstream endobj 354 0 obj << /Length 107 /Filter /FlateDecode >> stream x313T0P04F f )\\@ IrW04 s{*r;8+E]zb<]:\={-= endstream endobj 355 0 obj << /Length 110 /Filter /FlateDecode >> stream x313T0P0V04S01T06QH1*26 (Z@ds<͹=\ %E\N \. ц \.  \\\A endstream endobj 356 0 obj << /Length 103 /Filter /FlateDecode >> stream x313T0P0W04S06W02TH1*2 (B$s<,=L=}JJS ]  b<]0 szrr$~ endstream endobj 357 0 obj << /Length 117 /Filter /FlateDecode >> stream x313T0PT02W06U05RH1*22 ()Lr.'~8PKLz*r;8+r(D*ry(01l;cNJ l r \+ endstream endobj 358 0 obj << /Length 251 /Filter /FlateDecode >> stream xڅJA'\!Ls ޱƅ+,J--;y4B[O"hWf,4s n,͡c%:IRc{l3yz|c;9?Tj fDTP&E{h+9G2D~>/BGE$E7~ }KvmV:$,H@%j}W}azH O#bA=b2~|0 endstream endobj 359 0 obj << /Length 263 /Filter /FlateDecode >> stream xuνJ@YRoyMry),J--$ba#*Āb8Gi+9/w]iF ftQ5 sʟjN\`v 1f!]b:ڣ5a&HzЃZ](&Dv) ZEֵ^mVvjRPkY-B4x1+ɛ>[OB:@|ӃFA:nKe4bڈq4Kmۘx~⃌ endstream endobj 360 0 obj << /Length 191 /Filter /FlateDecode >> stream xڍ1 @EGR2'pa!F0Xr!E8 I 33;MR(oSJb:xEk%GU/hvd-Lkg4fAs \102w{(` UO\+rBZt%p#'*=J@ ҿϫFa;Whn I endstream endobj 361 0 obj << /Length 184 /Filter /FlateDecode >> stream xm=` .߁1D'㤎]ċ8p n #~$(}L> stream x}0K:#pO`i1NI4 Kd0FMj\ijx@½%\PPGL2P[2;|=7P~K<Ls 9y|9#l K#vӜ_[ZCN _CF,a8[NXTQ endstream endobj 363 0 obj << /Length 218 /Filter /FlateDecode >> stream xڝ1N@4QY AT (Ar 3AzWJ_kN|y9H/vI'Zun8-)\ؙBwoVWg)6r}Gݚ3J~ ZTMa.)- o̤/`tR27V֯ifhh`+-RN]dvg9 endstream endobj 364 0 obj << /Length 183 /Filter /FlateDecode >> stream x313T0P0bCSCCB.c I$r9yr+[p{E=}JJS|hCX.OD|?b0 AD}&> f0H0b!On%rv?s?>  `szrrǁG endstream endobj 365 0 obj << /Length 147 /Filter /FlateDecode >> stream x313T0P0b#SCCB.c HrW0r{*r;8+. ц \.    `|$lthvb)،6 Q .WO@.̌r endstream endobj 366 0 obj << /Length 145 /Filter /FlateDecode >> stream x313T0P0bCSCCB.c I$r9yr+[p{E=}JJS|hCX.OH" $`@CLmQD !( ,x endstream endobj 367 0 obj << /Length 227 /Filter /FlateDecode >> stream xڍ=N@\4PY AT(PR$ގk 7eUI"Q|{;5袥aC]8> stream x313T0P0b#SCCB.c HrW0r{*r;8+. ц \. ?c4 N%'W  endstream endobj 369 0 obj << /Length 108 /Filter /FlateDecode >> stream x313T0P0bc SCCB.crAɹ\N\ \@Q.}O_T.}g E!P E >Փ+ HX~ endstream endobj 370 0 obj << /Length 218 /Filter /FlateDecode >> stream xE=n@E.,MvNm M,#EPR%)SB9QPr.]lȢOLt&c&FRf1K~|U.k9s endstream endobj 371 0 obj << /Length 123 /Filter /FlateDecode >> stream x313T0P0bCSCCB.cs I$r9yr+s{E=}JJS|hCX.OLŘN|? ?*f endstream endobj 372 0 obj << /Length 177 /Filter /FlateDecode >> stream x313T0P0b#SCCB.c HrW0r{*r;8+. ц \.  B`W${1y 01h͇q|Fa  l?`!'W , endstream endobj 373 0 obj << /Length 194 /Filter /FlateDecode >> stream xU-@%&c 迨 P$u[GEev K1h8&nL؃-;CFXA_>pi ?!&+R"c(ɉ(N+ƵGSroW\"Ϡ+tIߣmśh5| dXB]/qs| endstream endobj 374 0 obj << /Length 170 /Filter /FlateDecode >> stream xŐ1 @ERxt)R-n!he!VB9EqW7seϨxAƘxң3U5ݮr 쀾"h `,T'uID x/H 9 Zpqol endstream endobj 375 0 obj << /Length 174 /Filter /FlateDecode >> stream x313T0P0bSCCB.cs I$r9yr+s{E=}JJS|hCX.O0"370`H؃@`?#^^Q`Cƃ-Y  f $700 F"b\\\wN endstream endobj 376 0 obj << /Length 209 /Filter /FlateDecode >> stream x1n0/ʀ! &HYj کC @9j1CNjKޠ{iˊs.y^,V\.x_ЉۜWH[KEԯ|9_do\g ƃHLd pLi'Ai ?NI i&tZ0^gȅX{cY701<5  endstream endobj 377 0 obj << /Length 197 /Filter /FlateDecode >> stream xڕС0jrf{::"#a e0XvtmCOh)T^ aLiOvG ֤FscT,r0ʖSiNfEN`Y9Q3pqNN3O0n ZJ4&}5ty+A -ؼ+ԀW2>z endstream endobj 378 0 obj << /Length 236 /Filter /FlateDecode >> stream xu1N@ E"a|$H" * DH$*\!G2HQwmT 娔DJsՠg?x#Um<>r\Iq+wn˜24wC0MLNLtA 9a=tC68yF̛aO2/a<&E>oxv endstream endobj 379 0 obj << /Length 124 /Filter /FlateDecode >> stream x313T0P0b#SCCB.c HrW0r{*r;8+. ц \. @†H0 z(QՓ+ +T endstream endobj 380 0 obj << /Length 167 /Filter /FlateDecode >> stream x1@G(LtYY +D ,ZZhq@IaGhf'_Ϭgɂ#}SqblF.b27+e=Z3bÏB&.ْ`9:Rs)U*H]J^w¤%HRQC/~*hGo8 endstream endobj 381 0 obj << /Length 189 /Filter /FlateDecode >> stream xe;@!$p,1q ,ZZh.F5\5o2s? q98^}G|9^0vV2#kgdfAYL{NELi iww?>, ʐ ] xBi LHʛ1VL0JRaVuZ-Vi endstream endobj 382 0 obj << /Length 226 /Filter /FlateDecode >> stream xE1n@б\ M<'m JHqT)"*L(iRZt)GLᏱEW23ɢ}ɟ\YV>>xUs&Ւg9pzy^Jz-NS={kg`g?EJEAJ>.dt &JI0r熻qM 5.M_f[݆{GZ>_?WKq{ endstream endobj 383 0 obj << /Length 192 /Filter /FlateDecode >> stream xڭ= @ )"U F0Xmb aҔ)®p)6 GqBQ@O[SQ6{ t&NExޡ9OA q@#~8 7ŝm'ch/m:^[ endstream endobj 384 0 obj << /Length 191 /Filter /FlateDecode >> stream xm= @ x Ղ?` A+ RK E[)S,;h%Xfh< }:ex\T:8^pVQ>EmqF;)C}FE$ sXBט^Hȃ@?|bezYETZ_q-`R!a~K<.Kj/\ endstream endobj 385 0 obj << /Length 187 /Filter /FlateDecode >> stream xڝ= @g"#Xraˀ!N;GYg!BR@[]/w%ܔ|q&?,Lƹ+x"ҡ@yRx -0遍~*?umֽr!0e] EӐ`%Ж*sz endstream endobj 386 0 obj << /Length 182 /Filter /FlateDecode >> stream xڍ1 @EIk9 n!he!Vjihh%GL2Φօ}g?ofǜlS>'t#k5?;2{Zd܆L]rBC\"iJzD=[5/jLAOQ~ߏ@B_Zh4J5Ϋ^RMuZ9uEJ endstream endobj 387 0 obj << /Length 193 /Filter /FlateDecode >> stream xڕα@ .<} L &`qRG;[pqᾤ 5)+H+9s<^&|XLפ*L,r0S⺡MNMC $z11wx!"><Zi&N?>cH RaH'c ˁ:ѴmO, YK endstream endobj 388 0 obj << /Length 201 /Filter /FlateDecode >> stream xmPE4K BBrmM>}}V́;ܹiԥS=T'u9&a+NFF⻥OK+ VZ[( f#2;܃J>PDCv@Z }•cC 7'* 4u.7mp b2rcZI_ endstream endobj 389 0 obj << /Length 154 /Filter /FlateDecode >> stream x313T0P0asSCCB.c1s<=\ %E\N @BA,@Az H?*;&p4Aka[~ `1.WO@.^ endstream endobj 390 0 obj << /Length 253 /Filter /FlateDecode >> stream x}J@#E`}!k.p` A+ RK E#U(y[,gǰzqꜟJz`;볟 Z.(wk~x|ws%{/xv4lnfxYDdItSn\#7@efd=`El6X4jB*`f}E_h0bj1SL̀,x>v*!*:MƢ:?-y%ۧF@-7> endstream endobj 391 0 obj << /Length 161 /Filter /FlateDecode >> stream x313T0P0bcSCCB.1s<L =\ %E\N @B4Pe,B @d ?  B~oAd $?HzI8'W z endstream endobj 392 0 obj << /Length 132 /Filter /FlateDecode >> stream x313T0P0bcKS#CB.cC I$r9yr+r{E=}JJS. @-\.  @x@@?C1;}pA|.WO@.O) endstream endobj 393 0 obj << /Length 169 /Filter /FlateDecode >> stream x͏= @_#d.͟ B Fp !VbnxK q\`eW񊉣~2c!GOj .mO1dXV|-M -X endstream endobj 394 0 obj << /Length 198 /Filter /FlateDecode >> stream xڝ;@%$p.H)L0VjiVW(x[_~0E_cƃ=2b4gA ΄Sp)-8lsQy endstream endobj 395 0 obj << /Length 115 /Filter /FlateDecode >> stream x313T0P0b ebUel䃹 \.'O.pc.}(BIQi*Sm`Pz<7,{\W endstream endobj 396 0 obj << /Length 171 /Filter /FlateDecode >> stream xڽ= @[&G\@7!Q1#X^,7[n8ȃW3r9Al&]'-\,cx܎` s0 n ==Cbq1 SeKvI'mr/)T8R`5zf endstream endobj 397 0 obj << /Length 155 /Filter /FlateDecode >> stream x313T0P0bcc3CB.1s<L =\ %E\N @QhX.O$$PD2`$ȃ@H&?:7 q.WO@.ll endstream endobj 398 0 obj << /Length 183 /Filter /FlateDecode >> stream x}=@XLvNBLH0XF[٣Q8ab^2}KJ)*%Kw4 +@@)juE]VQzB[_P :9o.A@9(dq%7@'a/=ߵG.^Tyh p A!\\[>P: endstream endobj 399 0 obj << /Length 200 /Filter /FlateDecode >> stream xڥ= @g fI"SZYZZ(ښͣ[.(wS|7q4HRYs_8 LWCNv?$#(%p:lHj&5pGٌs V,S*7;(&A]t, -GT@8=F> $_ȥF<5ޯ endstream endobj 400 0 obj << /Length 211 /Filter /FlateDecode >> stream xڭ= @ 4 وVVb&7J{ Lig Z 6_B޼q;QH1.#ܡ$ )ѯO-3 # ƒcM?n0O$!Wɾb|31P_6rilxz+=Տ>jO=]quBVŴ~[)D\|kse8'vG endstream endobj 401 0 obj << /Length 158 /Filter /FlateDecode >> stream xڭ1 @ПJuj!Fp A+ RKAEh9JAqc![̃I`4-ØԈmjw쎜{Vky\Y\/|9êe_Hx+5C8#$RC\B"xo<Iw endstream endobj 402 0 obj << /Length 185 /Filter /FlateDecode >> stream xM1 @4!s7q5@T0XErr,,2ԎgDM&rv=pr^ًYMyaoY!RrGB7 }KD#"eZSW!("PB Ca}96A=> stream x313T0P0bc 3CB.cS I$r9yr+r{E=}JJS ]  b<] @AH2`h AA~[@ Lx:B endstream endobj 404 0 obj << /Length 148 /Filter /FlateDecode >> stream x313T0P0bcc3CB.1s<L =\ %E\N @QhX.O` $0()D? d=H2cģd> endstream endobj 405 0 obj << /Length 186 /Filter /FlateDecode >> stream x5= 0W:oN`B`A'qRGE7^̭ ء4ؔ? ,&Q@>0[}pb*Q)QzܟvI>>yG:J^]S |-,ZHZX:^<r[C准qzb&gaQ$L endstream endobj 406 0 obj << /Length 174 /Filter /FlateDecode >> stream x313T0P0bcc3CB.1s<L =\ %E\N @QhX.O `?aC00~ @2?Dv`N2~+ߎ #ȏߏ`` ?G#g``?A6 H@RՓ+ ɝm endstream endobj 407 0 obj << /Length 202 /Filter /FlateDecode >> stream xE; PEoH!LUBBBN!۲t @!L@,a̻{ې lfOÄܒZrɌOp>ܘW!kJ/LnRQ;H(+p{h/ O.ok> 44W&F&R$}xY& endstream endobj 408 0 obj << /Length 237 /Filter /FlateDecode >> stream xEαj@ dz)CB=ҩCɔdnvj:t&=$%p!:d-"zX!ZnhyxDQd}LKႲ)ֳ[{vȭ+OPy5 @U-G[;z[*lB;v\ɼHer;SHR Z88 ~Ka{ endstream endobj 409 0 obj << /Length 176 /Filter /FlateDecode >> stream x}1 P S2Y<9*BV N⤎G(Ϥc|?!?'S3>gt#͔+^wr~ÏB.9#W!H"Px+"B I / >i`$f_$hj(D{{-ӎ~b endstream endobj 410 0 obj << /Length 203 /Filter /FlateDecode >> stream xڝ= @_L#8MLRL!he!Vjih'({!q-6߲`}t!'<8 91 ũ piNfqJf)c2ot=̜w{@^m W÷x: dTLdO_'X`*w]!WҢqz9KU" }}d endstream endobj 411 0 obj << /Length 141 /Filter /FlateDecode >> stream x313T0Pac S#CB.# I$r9yr+Yp{E=}JJS ]  b<] X큸7001;j?0FJ endstream endobj 412 0 obj << /Length 222 /Filter /FlateDecode >> stream xe1N1E*i| .-V Ab $(UAݣ(>B,?kWEwk.i;O%/$=iI^>$nF6x0ڄʬ ͎X⌾T~fGvlgOȠ<|HTGǂ+ˇD5WTL3*=2,<8h endstream endobj 413 0 obj << /Length 226 /Filter /FlateDecode >> stream xEнN0 J^ @ZHHCL @>ZlDZTe}9W|Qps}ů}PYkP|N#5[ Sj~??ScNzDDFM&4=:4WL hLVښQ5A1;,wKi sęǐ dw;-y"ͧ\ۼ>[z3Vc4 endstream endobj 414 0 obj << /Length 181 /Filter /FlateDecode >> stream xڕ=@!$p. b&ZY+h pJLh$%^5Y (xTHN)74 U[QcL uMĄB9ƛG3a(if M( /#`cV2OZ˿Z;5t endstream endobj 415 0 obj << /Length 207 /Filter /FlateDecode >> stream xڥ= @4{t&)!BBB,xxqFE惝}ov)ZRGk;Sʱڬ)Nюe6aܠOi(Zb>$\Cǹ.5Tº)7 P \)'ߘ'-,e$9ґ i `AY ֚ G9-c endstream endobj 416 0 obj << /Length 241 /Filter /FlateDecode >> stream xm1N0E"4 @TE"Th+)S ͓=3uE5w|pWs/ 5gFGn{n5j+UknS=6@! `dHp糢0g0p \ύF<'"DMbLz[Zj6]*7DE??(jALP5ˠGԡ(OY*G@BR栛 5pI endstream endobj 417 0 obj << /Length 183 /Filter /FlateDecode >> stream xڕͽ 0+- h NB`A'qRGE(}zWEq _~3#)';#I~C"cQ8|Q iT5t] '`010%p1 iBt*Rt 2;nB)4_T+~Ѭ.:\M endstream endobj 418 0 obj << /Length 213 /Filter /FlateDecode >> stream x}O @`qM>!zI 0XɧSW؈p w3s3Y:'sÄ1P{~s8Ӵ$4'tcot=w {* (D`D:y#jAԠBQSQ]9h@9׆mƠ3/"-PIoәn ժ?|R3{6nR}Zn endstream endobj 419 0 obj << /Length 245 /Filter /FlateDecode >> stream xm1N@ Ema|HBbE"Tj`&GkH 4أnv+4rVISJ{!Orݢ~9^ꖋknR*.PI^((`)3Sژ1+-:%8p'?, \%ᔀ^ÊH"4)MP9%7Hi/! GdL!n&{| JMc_u|_!r endstream endobj 423 0 obj << /Length 279 /Filter /FlateDecode >> stream xmJ0A#d^@պ AГ=(zn#챇Oam!d褢jIRw,uA m=u|M|׷aG=zCO ABB*tSl"c1$F\N>iuԶPr8iA66yr1B6at;Ѐv[|}.&ݬ 6T95r GQg;U_.܁ǎĊue0 endstream endobj 424 0 obj << /Length 273 /Filter /FlateDecode >> stream xmбN0Ƭ~Ϗ5f[r-Q a2^gUMة:9lz+ᄜ `T:{&U33obuT;ِ3:ajD짺5Ak&8ԊQ#<\ŕRNghO/BFAfj|?%۹ endstream endobj 425 0 obj << /Length 208 /Filter /FlateDecode >> stream xU; @ir %$ >Vb֛k(9BMϷ3i> 3 )iD󘒌>0 )reHir5bGr_QrM3kPLl#mZ-3p \>jt=c l5OϧҩK ַ *Q;Eu7pSw endstream endobj 426 0 obj << /Length 208 /Filter /FlateDecode >> stream xm1N048ViSYZHPQ *X}4Gp"Z3yH8^ۙ{8p7Kg&Y<̿:.dxɚr_d7lɜrBˉ ЖVᒊK(RsJ jgJZ.CW|p)m䊄ȀjC&6 ]Q:\x$^Rߖ=F ۅ` endstream endobj 427 0 obj << /Length 242 /Filter /FlateDecode >> stream xUбN0#ԐT4)IAAL-" b&D:!b o:~7$y endstream endobj 428 0 obj << /Length 235 /Filter /FlateDecode >> stream x]?J@/f0: %),+r Eē^!GH9B&b=-Ӳ >xYp~=Ң0弜n$s)1^vd眑6 GjʿzBM?ڪJ{;R~1kl#Bwaɣ@+`&gL #ӭOF-?v5cÄ ğCX<=*@5uy% endstream endobj 429 0 obj << /Length 193 /Filter /FlateDecode >> stream x=α 0 [| hR[P@`A'qRGE7ih}>B%Y$fdhNC.1I(wsa>P> stream x3634R0Pb#CSCB. m@ $ɥs{IO_T.}gC.}hCX.O!'W ( endstream endobj 434 0 obj << /Length 114 /Filter /FlateDecode >> stream x3634R0Pb#CB.CS I$r9yr+r{E=}JJS ]  b<]Q?dX x~\\\>? endstream endobj 435 0 obj << /Length 291 /Filter /FlateDecode >> stream xڍ1j0a  jR'YbHSB;u(ڎZڭؾI=JIqT`$/VI~k,sOxym ɓYSH{dsf=;#ҍkTNUD38L41裵>+*bT)?d C~yE}QKZq<8ZTb+Ώ1ܼn NqA(F.gEㅸ$ > stream xڥ @\z Z< fNSuPԹG> stream xŒ=N@ M!$)fE"T (AKrSXؓ,=S$_> stream xҽ 0-}V NlGpPz&M@ᗄ$$BgK|<p8s93d-!%_Vve9rȑx)QTŔxe4GzMa)["ei=AikLM!Ch.TC#ig^woJ-$KHWeN'Q<6?K endstream endobj 439 0 obj << /Length 208 /Filter /FlateDecode >> stream xڍҽ 0[[' I'|д@ໄ\.]=0փa:=)%!i> 2xށc@&]CuŘPq"p3q%ѫN(WUyx98 V6q1 D=$D/$|d endstream endobj 440 0 obj << /Length 104 /Filter /FlateDecode >> stream x3137R0P0aK3 CB.cS I$r9yr+r{E=}JJS ]  b<]lQ3\=i% endstream endobj 441 0 obj << /Length 290 /Filter /FlateDecode >> stream xڍ=N@%[l2 G`O hL0XF[h#PRlwgv@~vvڋ_wOh8>az'vPŻPÍo>ceF4BHn, !QiADIT!Iޛ=ܲ EsgY}/+̳ Lq+qaNXp\$FkU_*K١UqO,-4,iTU< x nx? endstream endobj 442 0 obj << /Length 149 /Filter /FlateDecode >> stream x3336T0P0b3#3 CB.Ss I$r9yr+s{E=}JJS ]ry( h 4?8h{443fPB3\=a endstream endobj 443 0 obj << /Length 278 /Filter /FlateDecode >> stream xڍMJ0. o Hd8]ʅjtBQ讽WM0ϼW:(yĚt+ܲfshsat}e^-o.V?^RV T+xi[D2h; _Џ.#ğ Gf ,D# H_W3H| gQPMAP]r:)8P]ʂiP]͂.Yc႒4<]:l_@c0ώá%+/]z endstream endobj 444 0 obj << /Length 277 /Filter /FlateDecode >> stream xm1NP!$p*l!YD ,6Vjid;<e`Ia93o,(H~<+mTъvE-Ur+pcH[>ŲϏW,7Tc]M[ !@‰:,]W`t~]'!LdDUHZKZi:j4DGDiU6LKGT:ҴJ*M¤%#Qt'%#Q2bⴉ&N#&N8m+L\T+wetA f U,(we#ĿRWY›XM endstream endobj 445 0 obj << /Length 185 /Filter /FlateDecode >> stream x3735V0PasC3 CB.3s I$r9yr+s{E=}JJS ]  b<]co100U@  P3 v,f[=n/O~085 )cpzrr\ endstream endobj 446 0 obj << /Length 251 /Filter /FlateDecode >> stream xڭ1n0: w֠4YDH!d̐h9 G`j1RaKd}22yPD zIP"eDݓ̛ ŖdbQQdoiSEN܍WƩuJ3dkYAW fuM<7'Mn݀ASwMR \So'%uvrCh2<>\+#_2ocibBר?i h endstream endobj 447 0 obj << /Length 305 /Filter /FlateDecode >> stream xmJPO"pyfaa]Vbv ɣQ)#\83w.x9zuhI5t^Sҽj-%]2on۸+n$>?^];z,i<H90w{1c]< h=Q=6 zh,݌$d1b׆ا#XA}ăiM֩S-dpAí$ r0cGݑ"y*\'5 К?)ԜhVVQnܽ endstream endobj 448 0 obj << /Length 162 /Filter /FlateDecode >> stream x37׳4T0P0bs3sCB.3K I$r9yr+Yr{E=}JJS ]ry(D11o``!`G0 5#Fʨ e02`'\\\T. endstream endobj 449 0 obj << /Length 208 /Filter /FlateDecode >> stream x= @G, &"),J--mMQ> stream xڍнJ@ )n^@q 'B RK E.f{tצ"dUCP#,6?;>A 'pA~ 3dY/J OurEuR^N7d w\(P?REx: "XԲBR$jXPT舊Ib&|=v,UnX6zmY6^sDVȊ9^[q>'KMT#6QܩN(͍)]SB] Q*41cXQ3,h endstream endobj 451 0 obj << /Length 378 /Filter /FlateDecode >> stream xڝN@!H5Z5!%5I=y0ԣ&x#:3/d-:;>Wr!O䑒J|VM(EB./kObߤDt["JbGnֺ8Wtx@NC8YkccU%ScUS$FSy(wPARpXiV@}jH-DqL jymVFyKV/U5/J/j{HLeŋ2+WrA0'' ">5"Sq'<7 endstream endobj 452 0 obj << /Length 232 /Filter /FlateDecode >> stream x}ϽN0Jl;Ta?pۜ7kBjikVb7/;8jC'_o6RsS-3[&0`Q0|T*M *pӌ_2 $Lo1ÔJc4|ݜ~82;eSz)<8`͊N9y{2hl endstream endobj 453 0 obj << /Length 229 /Filter /FlateDecode >> stream xő; @72M4(SZYZZ( h"8P+q3z ;MVYmcsd4ٟ9ą!8~̸+fܒ^ ke"e, tGd?˄b$U5Ҋfl$*lMgn CJhVʷ3Fip endstream endobj 454 0 obj << /Length 214 /Filter /FlateDecode >> stream xڭ1 @E'l&G\@7E1#BBBQRgEv>'S &3!3c4#NqRdn uS:]L> stream x1 0yд*N`A'qRGEx 7бC=q(8 vي1&]lwqy,N1y 6n_pa8&:2)љBztUUN+IZ^>j$qIMMR'*mse cL@I 9Lwni endstream endobj 456 0 obj << /Length 226 /Filter /FlateDecode >> stream xu=n@gbi|eYGH@TDjh> X VyyD%JC80/*v[ dvջ\/_Gvxv+١hJʞ2Ն(W FOFFl@&%`}b zdeL,>2~dgygL[41Ƕ hKyJ BasQ D endstream endobj 457 0 obj << /Length 167 /Filter /FlateDecode >> stream x3632V0PacsCB.cK I$r9yr+[r{E=}JJS ]  b<]700P?aA<$AD0H0 A6b#4o@ endstream endobj 458 0 obj << /Length 281 /Filter /FlateDecode >> stream xڕ=N0’!sHE"T ()@`)<؋$'{Iן5-5tA-ukZw75oZOv3RpC/^Rk-=ԣ/qZqg XxqdWjIpnIUi+W%KK"5-CiK #;A58E, k΢SvYlK S^`%*#G4dPɲ1:^.eiiC%>+^ ~ endstream endobj 459 0 obj << /Length 167 /Filter /FlateDecode >> stream x3332Q0Pa3 TH1*25\Dr.'~)PKW4K)YKE!P EObPFS@ >? uBP?(lԁD(.WO@.Jm endstream endobj 460 0 obj << /Length 131 /Filter /FlateDecode >> stream x3634R0P0b#KsCB.#1s<L=\ %E\N \. ц \. 5 7?D # P?P1?H{pzrrD endstream endobj 461 0 obj << /Length 220 /Filter /FlateDecode >> stream xϱn0 HrObB*L 22*+cc" F,YϲA/~o:ϜuʰXoiTYp'3d|6dFcLxsr‘"?D+c~DRdZ+-ЭAR.ZT7rBʰU. (]«],D> 4Hsz/iNW^`ص endstream endobj 462 0 obj << /Length 107 /Filter /FlateDecode >> stream x3634R0P0bc3KCB.#S I$r9yr+r{E=}JJS ]  b<]0q7c.WO@.S endstream endobj 463 0 obj << /Length 209 /Filter /FlateDecode >> stream x? P C!;Bs_ZA,T;:9::( n>'GoqQzJcߗdڍZE5eujh}OSXcu4vB{%gQh@&lJ2DxbΪUdK 9T`P+XU.> stream x3332Q0Pa3 ebUej 䃹 \.'O.pSS.}(BIQi*S!BA,C}?7T10@ 6P?|'W [ endstream endobj 465 0 obj << /Length 213 /Filter /FlateDecode >> stream xڥ1 P #B[SV N⤎h=JбC1&E\|>?dј>c &tA$GOX4 "4 %]/#d5#MJ[h6%y=\0`..Y尀AK<@\@Q#6-WQwu;Sw ?kBKn&j״1a>7k.sk|]ŏf endstream endobj 466 0 obj << /Length 227 /Filter /FlateDecode >> stream xڵѱjAY,i|tNWbe!V&e->B|-XDTX>euڝLJ+Hޗ,ה?8G۹)ϲYo؎^$e;E*ɒPS݁T+(5OT@u%BMwF=poH-eua~nl]Tȇ`1)6AbXi DA O  endstream endobj 467 0 obj << /Length 161 /Filter /FlateDecode >> stream x3137U0P0bcSCB.cK I$r9yr+[r{E=}JJS ]  b<]oH?1"~`? L7?bl'W n endstream endobj 468 0 obj << /Length 223 /Filter /FlateDecode >> stream xE1N@ E?b%790;"E"T (AKq%GH"4o4v]_+^sk{w6[{T^o(=fKdJ~|Q_stgj8UR:EZ ʷcVG@VjU'3rع: Fg u1vM#bj2;4@* endstream endobj 469 0 obj << /Length 173 /Filter /FlateDecode >> stream x3135S0P0R5T0P03VH1*26 (@ds<M=\ %E\N \. ц \. Xv8'=3,X w'C=`?`A<7@ ? r  ,t endstream endobj 470 0 obj << /Length 166 /Filter /FlateDecode >> stream x+@i*6#06&$  (D@@/G[58"e9P!Zj Z)%eʡ^Rv3:N[|LuM+C]MD ! a9PIcУd/-x>o;w*!aVB78\ d endstream endobj 471 0 obj << /Length 216 /Filter /FlateDecode >> stream x}=j` `-A䳋M)PH !SڱCC |'ꫯo4J$QLS<Üh'+v 3v/ز^e`7O$e7e*Ɋ*#3Qs;*ؗ /@ih#2+1@[|iơy(sG=ַ G#ʳpH endstream endobj 472 0 obj << /Length 276 /Filter /FlateDecode >> stream xڍJ@ 970&X9z l o=3wR<,gN1SZqBxyy*N}8_Ӆz7\-HDHC!ڐ%ZCƫ%\:Pm)(0#tB%S@=ERPGK(b'$GWP$d9Gmj9h m@Mi^Hv:vP{*j1uE!7blEDna^ԟ(¯n  endstream endobj 473 0 obj << /Length 234 /Filter /FlateDecode >> stream x}N0(C['4R[$2 ĀlUGK$/ 0ղOeu%\s][E;jjXƇZw䟸-?_o-p НiB1E mQ,GE!A0)29÷N3DhIA i17VpH4Y0Ml3ÐEgP1jDEKێ(k endstream endobj 474 0 obj << /Length 267 /Filter /FlateDecode >> stream x}ϽJ@Rn7p h~(b`]VbB !y&)Sdw̙SRqKu&Zso\iLs9 gRiή1笹ַRpBGn6b-eFGZ0Ucc^pG))$)Y= Ư㗥itjuGj wAlhA_Bg6UT2u2Ho^_˄>> endstream endobj 475 0 obj << /Length 126 /Filter /FlateDecode >> stream x3530T0Pb 3SCB.c I$r9yr+[p{E=}JJS ]ry(000```` H0@,0%#zl'W  endstream endobj 476 0 obj << /Length 266 /Filter /FlateDecode >> stream xmбN0|G/qCyfίF0t^ߟlߣO;O$9 1!rHdڈ4f&pBl9{Ð68,ִ/vKqbҷ+tي%+NC7"EB8сVP #RI*h~j:Rᕤ[Il`Φʗ'& endstream endobj 477 0 obj << /Length 258 /Filter /FlateDecode >> stream xڅN` {@ $g%^Ltr0NzGh< @= icu]RHRb)U?XHUw>5?1r~geΛ{p~z< 7g!ґRUcR;Q2QP:X Ja2m0{tƔyl[J8 XϠ-AvHxiOzMYSgčV6oGbǝ2ClčLU[ϟ]~(6?d endstream endobj 478 0 obj << /Length 216 /Filter /FlateDecode >> stream xڭбjP r7DpI *NJ'utP-4|-7_խmzޏs/{Ck#ґS]ŲdbkFR̋&1 {*|ZL4XL_m̛3ul󇚴] I@BI /s'sABNjAOB/#&-'5o#Rԑ endstream endobj 479 0 obj << /Length 253 /Filter /FlateDecode >> stream xڥ1N0 `?uGx^:bF4G  Gءj]&`>EIc;Gy:r>fG}=~@{M;vyJn-2ЀL]_~EI-jV8Yz&? }Bs훃$ShjMM|wSSYN-Nm8NZT2f5JD 2Mr[μ̐51= x_d endstream endobj 480 0 obj << /Length 264 /Filter /FlateDecode >> stream x}пJ@9Lso &p6p` A+ RK EGG#s&~lvf IYI)A+ A+~ub)u?{MZցٷ~sy*h[nB@""^H1j$eLЯ; tY;suVfL5*}:;8CDx:H:n2ffuYrViL=݁z!mN@Hö h+y- endstream endobj 484 0 obj << /Length 93 /Filter /FlateDecode >> stream x3231S0PbCK bU@tr.'~%U()*Mw pV0wQ6T0tQcoo u 6 \\\Tt endstream endobj 485 0 obj << /Length 96 /Filter /FlateDecode >> stream x337T0P0W04S0T02TH1*2 (B$s<Á\ \ %E\N @AhX.O??}r Iz endstream endobj 486 0 obj << /Length 288 /Filter /FlateDecode >> stream xڍJ@=/ @Mb۔BIV0AO'AQ!y}B0l&.?|C̿V3qz` +| 9=qvaw+z^roOmn.0o{HiQ)eMJ]S2vHk̄d-!]#~u?8,yl-VW6|tOGq8mhmqmQNcGPtV<Wc_õ:RӉ-\GI>)ͿiRJNڸ o/L~ endstream endobj 487 0 obj << /Length 219 /Filter /FlateDecode >> stream xUн@]X"yp7O&Bt),J-x`+ BX3wf>fQ6bG)38Afkbwq f̼)s>/'&t EP>{Z;f,OȞ?B]}t1LU|h!L+^ި=I T̝B?Kk Y +xir endstream endobj 488 0 obj << /Length 245 /Filter /FlateDecode >> stream xU;N@RDG kK,HPQ *BIAs4Gp"6ͮw~V*Ru%O]^{u{쪫nJ^++ߴޚCS{)z\"i%46UjHSK&eoTFgK5Ѥr#kDV# Ĉ7è'p*SA ] > endstream endobj 489 0 obj << /Length 275 /Filter /FlateDecode >> stream xڅJ0顐}Ͳ º=ɃxR(y{(3itG&dfd^QAeE-Wt_g5G ZQmj_*Kz}y{Px[Uo @<9uf8g:&hFO^|IN{?,''Oi%_M ?KӴ L z@;u32<ی+٦ JfW-ƽ<%5ߒ uP:N}m endstream endobj 490 0 obj << /Length 270 /Filter /FlateDecode >> stream xmѽJ@yppp` A+ RK EB>Z:_#o)B֙wGf6ł2 :):rjʒUyL=um;*K^qܤ5}thG[ RdJ " h"|<z؎t! #siD0$'x,.$cq/c,g J z\U endstream endobj 491 0 obj << /Length 203 /Filter /FlateDecode >> stream xMα 0+C '0AI7h}>BGbE1 䃻dA_$);tD/8,y bC lQ%ݮ#b5Ō Au D Dfc9-O_pjϷ3mߗ3m߮ 5Ꮯ~66f;_+Qqɚo&V&9Ԡx d endstream endobj 492 0 obj << /Length 300 /Filter /FlateDecode >> stream x]?J@"{3'0   BRUx #8IoEZ&>Sz ŋ( bVEk_k$BߩP")$ NHA?%A^ |6^@(.:\= )ʛɠWQY;XvrʚTf;<+fT QR8vʙYeKa hd'I~:t'mi ٪ #JkRBVAn+q饙 endstream endobj 493 0 obj << /Length 266 /Filter /FlateDecode >> stream xmбN@!$;/Hl<)L0Vjy팷ƣp9L0@eef./Zr)6r]VWVRŜzI;s;gۇ<p"OO-.47RDS4EYRzcfc=Th\KΕHg:Ád@ůq _e\o ә͌Ec@[ѵWKY6' PǝѶpl>6ȿmy endstream endobj 494 0 obj << /Length 208 /Filter /FlateDecode >> stream xe;0 T H*0V*  & ۣ(=BG`O1$N;f22LКhxLSg(J[4NA+]'z)9RLPQjN-rĄTD#ɉ~T?BfrOMPըs`;v)G/O7r$i%O#}jI$֣w{?(a/5sR endstream endobj 495 0 obj << /Length 261 /Filter /FlateDecode >> stream xMAJ0)]fa/sm+"BЕ quBQpG ihMIyM:dhOsj錎Oi'a?bKE67xK/lﮨfGO8ceID``g&@Y953ؕ#˙ fW<@ Es>(R :$V.bA*3J ʘsJڛ?&JI_B)Jr&| eDX#d? endstream endobj 496 0 obj << /Length 255 /Filter /FlateDecode >> stream xeбJ@?Lqy1;y),J--ɣR\g&w|'[1Ϲ#^<PSL[.V_ʘ^ߟ(__7|=PaH(fTA#{Ľ8=Nݯ#_+Atj֛4H`~AWQ~,@EkflF[b[Ϡ~-(N[NA/V袦?Fj endstream endobj 497 0 obj << /Length 214 /Filter /FlateDecode >> stream xUϱj@ `ZB'㐫S0NBc )-t͏G!z3HKh{~\.hN )')+,9qs<\>1-_ -ޱwz𐴶L 73nb. fV cFI, m%5Ҁ+IIbM/1Nb5'1UWwݦpt endstream endobj 498 0 obj << /Length 253 /Filter /FlateDecode >> stream xUAJ1[4]@3SH[A+J] UQzY(/(E !Y}:rO,[3VlΆWZ2' %פWPsHr1Z p8#l"kdGvR !P)J,.RAE&M#GטbToY=$-C0dLm.FÒbj~)kB endstream endobj 499 0 obj << /Length 231 /Filter /FlateDecode >> stream xUj@ 9s;/U֤*X ɃxRBZsOP|3jWLĤū3+C ,t"y\6*v211E[&:|UdoM~3\<9L^|Ip` endstream endobj 500 0 obj << /Length 212 /Filter /FlateDecode >> stream xM?@oH1\@ȻNbjະ)+P $`Nog7)SdgFA/}q7`o:Ph>ggiLjaDGIſ|:w/Hxx@@6/cGP!R^!'TH3=,њR;gXK%Hs$h%Ƣug+> stream xMϿ@-70&aÀVW՝rWGˣlg[QsŧMyK)!Jp1|pԠ:_gzPzJ S ĎԬjukzE Q)]xĎ/լeQPxўc=r_0%t,!_ endstream endobj 502 0 obj << /Length 186 /Filter /FlateDecode >> stream x]ο POG@] b`955DS5f&>$)5}6+X8!C %jPfJ`Rjן旭Zz FB!‚_C4KhEoM> endstream endobj 503 0 obj << /Length 237 /Filter /FlateDecode >> stream xUαN@PL#0/ H3D+ cH 7Y0@IAXcClbv?;92Id#GdO!g^&^xWUc奼=]Iz/$w\G ~=BO \N nkm``\MdG :5">fg|w3ތT8ڦLH[e"48 6I|k endstream endobj 504 0 obj << /Length 193 /Filter /FlateDecode >> stream xm=@!$ S $&ZY+hfx=%-l,f&LC9QQф)LLs IK^nGՌ9owT p< AZ-@:hM,љTY(P zG߁ؐIavU.R8Uk Z B endstream endobj 505 0 obj << /Length 216 /Filter /FlateDecode >> stream xڕб @ !? 4?Z`A'qRGEC~Z?O[&\A.rIf>n,؃ҵṊw0 A.vAN(2pڂFh pi0@!D-%\"ōr"R\uTP\(z>Saا#|sfCuL1>|S$^Ik,b&rs\ ;] endstream endobj 506 0 obj << /Length 236 /Filter /FlateDecode >> stream xEοJ1YL2/ٸ{y[Z]!Vz ({h_$",I曯^SE 5=:|zӊ%+mmvssAUn @E2 Ȩ1JAE8Ab„rg|FÄ d]2Gd3Kꖂ''Bǥx`:!s\I`~zNx /[_TdW endstream endobj 507 0 obj << /Length 229 /Filter /FlateDecode >> stream xUϱJ@7^~@gfaŁuSne!Vj)`̧S"@-Fa0a.wӪ,NJ~CW5;;׈7vu{)%۵ܗ2{z- DfJHG"|Z֦Û)`tfTvh"?|@QZ計VШ@01E-e҃nO;`DhI|Ud" endstream endobj 508 0 obj << /Length 187 /Filter /FlateDecode >> stream xڅ1 @R,L^@ܹn),J-m5M)Sq793?<~Qq̇.6Ҍ􆣀žIgK]Gj!oCv^a JH˸;%BX[O ԎgU[kM4FF~xϕӁBT hњ~; 9 endstream endobj 509 0 obj << /Length 215 /Filter /FlateDecode >> stream xڕ;j@_0La]Dsy?* I"]I Eu4GXw[ Ɲf|8☣,> stream xUαJ@YXrM.A\8O0Xe _|XFlR,3m/ʽe4ݜg4/6G,r|{eSVgrvy~L9]]c"-"46"n"ja g\ô 꽅}abZvLRȴWWqz=A腁=AFZp2Ǥ>}m1fxԑ0S!9TxR^ endstream endobj 511 0 obj << /Length 172 /Filter /FlateDecode >> stream x}1 @bم #BBRPQH!(9eٵ(E!/I )txAM )e8E!Q,LF.vQīI m%;L>?9:^j7N=j AvG ) E endstream endobj 512 0 obj << /Length 266 /Filter /FlateDecode >> stream xUAJ0?dQ^`0v:B[La.]WRU'GQ2xɢt|MUG^dy*W',WOxقt,ErHh,Z}> stream xUϱjP? 9/Pc0$Bj;u(ڎV2HQ#dt`]8x)?DxgDGNx/4/)|8Yb o7/ K7Sd蓺@7=bTEVӊUш?I4M;@AmQSuj#S}7~9`^B 詤tU endstream endobj 514 0 obj << /Length 190 /Filter /FlateDecode >> stream x=ο POG@]A(AAM T EmB/fo#AB߁;ˁ.=t谿6;)#ɭI;~=7~.ɄO.;gJ +92 = Y5"$*GE1_kMAێfb)n! a!"t5}6)G endstream endobj 515 0 obj << /Length 238 /Filter /FlateDecode >> stream x]ϿN0/!Қ?"R)ĀZF@j?y=D $|jr=.YMxzH]lo-_iVSȪNTBᆥ:'zzLfU/2k`&[~6bT~4Ѓ{Νh{FRDJ*+oFt:^Cf\8،&и%FӶt[ӂ~Jl endstream endobj 516 0 obj << /Length 182 /Filter /FlateDecode >> stream xU1 0_:`/PMCv(j3:9: U:zI!78QL#NN"# ÈDkg%- lcdrE,_ω#+h(  0RGC:k3dV4P` {@1gy9xΡoi|KZCf1.$n > stream x=ͱj`27h 6] fԡtҎ*:H|(V;QX\Fje%E)MT̂k1RvO1j}H9S B47Z4^7^;r<ȇ0)z!Be,; e__=FʼW|/Hd endstream endobj 518 0 obj << /Length 178 /Filter /FlateDecode >> stream x]1 @ )tMBą-,J-+GQrBt |(1%2EϨR.#ʒ;baPI(\4 ^nrJ1ʒ61E[4%o!Au4x@u/YqDwk;ppjhWO: m 837ġB endstream endobj 519 0 obj << /Length 216 /Filter /FlateDecode >> stream x51J@o";MBuS,he!Vj)x9a)BpSo\^]s-_Tܴ\ZKӶ5w1S WT##M~!J& zt9Fauޝ"Ya b&91ĐMJ^-}?9:o,Uێ;VF endstream endobj 520 0 obj << /Length 238 /Filter /FlateDecode >> stream xUϱJ@?l0 ,GH`<Vb) rGGG2ENS8`vfv,]W|測y]7* c]WtsYP~-iʻx||s{Ɏ-?8.2" 5B+h&Q[Xo}f?BAqa#G L0P3 (E>QZAj4Nq12!Qydq-`l.vL@Wa endstream endobj 521 0 obj << /Length 243 /Filter /FlateDecode >> stream xUпJ@/l¼HSge!Vj)DN.>Z:_ca;SQ9m~ )T38,>')f(eHzB %m.ALsI7zkv+FQ"q I`{}w3 faB=3 ӍKM;t~='s.C˱ |GewUû%sLrȕ|ob3 endstream endobj 525 0 obj << /Length 189 /Filter /FlateDecode >> stream xڝ1 @EL70s @BBZZ( 9Z#XZ:IVt« 3Or#xjBN%7nt8SjImYǤ+]'RzΚT;l@TJ @ hxjze/ ]a;AdD/ak+?iTRS" }G@ endstream endobj 526 0 obj << /Length 188 /Filter /FlateDecode >> stream xڝ1 @EL/ :ͮA"EVbE$Nxg1q߄l">h.!Ǧ^OXRcR 7'e|ޏՌ5ٔs@ th~//iKxO`LГtIVx?>(=Cuڕ/@RriniMoEBs endstream endobj 527 0 obj << /Length 130 /Filter /FlateDecode >> stream x-ɱ 0 g 2'0-k3:9 TGAEfڢ|7lXU:x@='e; m;P=fpq}kw+*\ǣҟ;ZFy2ddL*R!sBY ,P# endstream endobj 528 0 obj << /Length 131 /Filter /FlateDecode >> stream x-1 @E?^ xЙmV"RP:ٙ&Nwo\%红V\xA=y1:nwՇ Y/ t4M22DT&2+<*B# endstream endobj 529 0 obj << /Length 94 /Filter /FlateDecode >> stream x3230W0PaCsKCB.K &r9yr+Xr{O_T.}gC.}hCX.Oz 0X [\w endstream endobj 530 0 obj << /Length 153 /Filter /FlateDecode >> stream xڅ̽A ɉ̗eSH" ͣxwN5gvZ88Kb񀷲>7TzOoײC _.)k̓<j*zP R.NO|[ƧmdSL6e\6NdV;x* endstream endobj 531 0 obj << /Length 101 /Filter /FlateDecode >> stream x3230W0PaCsc3CB.K 'r9yr+Xr{=}JJS ]  b<]d7`= 1S'W fp" endstream endobj 532 0 obj << /Length 140 /Filter /FlateDecode >> stream x3230W0P0W54S0P06SH1*24PAS#Tr.'~PKW4K)YKE!P EA 30` Px҂!Փ+ &, endstream endobj 533 0 obj << /Length 162 /Filter /FlateDecode >> stream xUA @7 u XJ0fԪEB ,jmAi"=xj1k)%g/ I|<$7}Mlx]I'$K>&ȔGȽm~i\ԅΏG8¢x8M lj0 b+12 endstream endobj 534 0 obj << /Length 94 /Filter /FlateDecode >> stream xM=@PEx$^!R { T߱4J2:*54`ƴ"f@BJJ7"i endstream endobj 535 0 obj << /Length 165 /Filter /FlateDecode >> stream x323P0P5T06V0P0PH1*2(Bs<Áj=\ %E\N \. ц \. 10703H01X010000$E@PPc0n`0\@r ;g0 endstream endobj 536 0 obj << /Length 351 /Filter /FlateDecode >> stream x5J0Eo Xb6? Vf`T AW.Dԥbe|B]w6H{-O&79,Lylʹy7]Tr$:)zSQ/w9z槞PgS@="m͢"{tS_\L:eR@5Rl# L7^ Z7] gO.Py&#MYY.IgϞp?GTl]fb& endstream endobj 537 0 obj << /Length 172 /Filter /FlateDecode >> stream x3134V0P0bSKCB.# I$r9yr+q{E=}JJS ]*c<]0A?  @CA2@5@D!dPICd \\\^ endstream endobj 538 0 obj << /Length 175 /Filter /FlateDecode >> stream x331Q0P0bScSKCB.S1s<L =\ %E\N @QhX.O g``~?`g N}`o`F¢0?Q\\\ endstream endobj 539 0 obj << /Length 208 /Filter /FlateDecode >> stream xѱ@?Xf!FHJ"BJ--|1}_aau=΁egM]p,+qeL?&wXis)|›p1$Myƀv3|-{Pe!,GpPghFdPCWT-kCj( gf"{![ޗAftC endstream endobj 540 0 obj << /Length 235 /Filter /FlateDecode >> stream xmj1 ^=;Od-$AhO=Xބͣ{N"Q6>fB&?N'izmf4Z||DJƠz.rM/T%V~rEP@X8 \IU{3bY1Ez$'i=Sː†LBp6Pu 8:R [49޲&&Z'XΝ_%m endstream endobj 541 0 obj << /Length 209 /Filter /FlateDecode >> stream xڕ00#pO`Amd3ALd08Fgh< @ڴ_e4f, kӄqH2@5(xEB3 i3 5C8ZA/:L^pXpkFbIF2qUNCE>_c+vdn&~VP endstream endobj 542 0 obj << /Length 260 /Filter /FlateDecode >> stream xڭѱJ@? LaZ 4ܪ[-'BBRP̛*y+uvg!B#n;MG4Zly\Ѣ瞚-Sӟ-5#%_v^QdRPDZTRR OԵ@*(AWE],RIR57P&?2oƐ(~#FLg5=dF#zvL;mf&,mXJ[a # }R:%e-vvS=U:霾es endstream endobj 543 0 obj << /Length 194 /Filter /FlateDecode >> stream x3331V0PaS SsCB.S I$r9yr+p{E=}JJS ]  b<]Bc``D@.0L1S?UB7@`JJ=SP (<9P@=mrC%hAC!@ y`> stream xuб 0  /0 D4?/iLsqINƪ&v)9 O44FQ5o3j ioKk2 DdFLƤ1(C8^QDɰ|p1۽."byҀ)gk׿R?U~ endstream endobj 545 0 obj << /Length 166 /Filter /FlateDecode >> stream x353R0P0bSCSsCB.s I$r9yr+s{E=}JJS ]  b<]d `6`RAI68؀L2`%Hv0)"G'!P5Ⱥ AJ$ `G@%\=Mx endstream endobj 546 0 obj << /Length 254 /Filter /FlateDecode >> stream xڭѱJ@?l&yM"&`p` A+ :--7`kMg+ & XKf]{t\)pp{ =SuV=UvT]j__Z]>5(6S`-̗oնd IS03aLlB".!1Ox&pcJ&HۅrI)ܔ_,v0{ltT颧 endstream endobj 547 0 obj << /Length 125 /Filter /FlateDecode >> stream x333P0P0bSKSsCB.SS I$r9yr+r{E=}JJS ]  b<]?T b78) s)hb y.WO@.!7 endstream endobj 548 0 obj << /Length 106 /Filter /FlateDecode >> stream x3ԳT0P0aKSsCB.#3 I$r9yr+q{E=}JJS ]  b<]acW3v\ endstream endobj 549 0 obj << /Length 243 /Filter /FlateDecode >> stream x]J@Yr̡@&A[sjsɃxj= Qj(y=HДeDz~,//Ue7~_G8"Ǎ;ΟGΗoKWn6^D8I F"!:+2oa[87`d`+hLMfp&byiguf0~5jRryd* Sk_ N9Lxods-5P endstream endobj 550 0 obj << /Length 140 /Filter /FlateDecode >> stream x35ԳT0P0bKSsCB.S I$r9yr+r{E=}JJS ]  b<]d3 eR/i& 0 d`L?`@!\=Afl endstream endobj 551 0 obj << /Length 244 /Filter /FlateDecode >> stream xu?kP{<0p '% ur(vtـ]G|X#y=8. [~< 8:İ˵W|Ք.1wQ@jH>yo瘣1 ý 8hFx]*18yTB,a PM 2< fep\$I5+zG4VY5D NZ@fW'coQ! endstream endobj 552 0 obj << /Length 243 /Filter /FlateDecode >> stream xUпJ@/.0fMN?Sge!VjihkR\AKT֩$EuwM1f``w%=.>jRWRkRnKO/VSYZR7T@fm큼0 {düۘ=4]L3Ȧa@bli@T|`MLjb4L1dtFW$G *.|ؙtI6Dc endstream endobj 553 0 obj << /Length 239 /Filter /FlateDecode >> stream xڭ08#^@D'D::htGxWm~_LyxJsNgo(I5M7?/&~I#K CԼ*x1F%)dB 񑊅A8EjGU(Nk4, ~j}> stream x3535T0P0bS#SsCB.K I$r9yr+Xr{E=}JJS ]ry( , LS? 0adT Y;PCuP7 .ĵ'W K endstream endobj 555 0 obj << /Length 221 /Filter /FlateDecode >> stream xڕѽ 0𖂁#x/i*U ~I(}JK "&HrtF*8 q0Y Ȁf4  ״ 2o@.08BDu uf,HW lf(ze~ަ_Q@6+L6elZv,XKP~EԺe֩N=v< endstream endobj 556 0 obj << /Length 256 /Filter /FlateDecode >> stream xUϱN0 )K~h{=B @!Z̏F%Psw|J8êt0r^jE>U KWk=?ܻbuyJz_uEk?ƌ!fl#>3Z;@'7x &&ȖNm9R0!G/aEFD+E$ьMX^>a-M=:upǴ-i}GA^{sywָ+=# endstream endobj 557 0 obj << /Length 150 /Filter /FlateDecode >> stream x3Գ4W0P0bSsJ1*2" Fr.'~1PKW4K)YKE!P E?<@0g`A bP>T*L`)`J+F Hʃr Wr endstream endobj 558 0 obj << /Length 191 /Filter /FlateDecode >> stream x= @B\@7JL!he!Vj)h9G,Sl3X,fuVsmnFlzl @Hw4HH/I'S>[ِ҃C#^(>l \3X~ZPCAJ'BEH?4u7{-'ROr%xVݙ÷C qBszxa endstream endobj 559 0 obj << /Length 240 /Filter /FlateDecode >> stream xm1j0g1> stream xu1K0W v8b vtr@?')ΝCMHH^K^Y/PX.8\> stream x]AJ0CМ.8]ʅ҅&uW<3ѐ.OXSZ[svn Ik_> stream xαJAYL"y.p1bLBASP=p2E8n@,ofgɌKWR+s8 5srzJ 5W7Y ~k%vTZ^{cٳUoC0˖*STB`ζ&%EQ0b43e}"_馡}l endstream endobj 563 0 obj << /Length 204 /Filter /FlateDecode >> stream xm; @ . Vf.1L!he!Vji(X({8Qښ}i<"Ńf{Qj{T3Qes:.{TŘ4 5E&6%/_x/PAP02g0yp&dBw:+0}ATyM6Ӣ5l.5iK|T endstream endobj 564 0 obj << /Length 198 /Filter /FlateDecode >> stream x3134V0P0R5T01V0PH1*21PASKLr.'~PKW4K)YKE!P ETD0S$00|`A; 00* ?8Q"I&PMb`߁q ̍:]'W ckA endstream endobj 565 0 obj << /Length 182 /Filter /FlateDecode >> stream xڍA `'?(   AZDjX.̣y҅Tcu 7f: 5P L % MBb%_/#jƒ&Ύ҄Z{Ue5TƩ-ՇW6j@-OӉ;*`{^[bTd7 wSZ= endstream endobj 566 0 obj << /Length 198 /Filter /FlateDecode >> stream x3134V0P0V5T01Q0PH1*21PASKLr.'~PKW4K)YKE!P ETz !HԱ` |P=iu D)ph<krF=A?0`> stream x]1 @\B/ 8M(+Tr!bI q23;9nvdC)lGUgwIBf6$32d@fr@&m)2ϩ\^sϵ2HQRQO5QJrh MTrL@V@ endstream endobj 568 0 obj << /Length 141 /Filter /FlateDecode >> stream x3236W0P0bcSKCB.# I$r9yr+Yp{E=}JJS ]*c<]70| C`003a`\=&[ endstream endobj 569 0 obj << /Length 237 /Filter /FlateDecode >> stream xڍJ1ƿ00 v^@9Å+T[}> stream x3134V0P0bS CB.C I$r9yr+r{E=}JJS. @-\. ?&iNa`D~700n?D䇁$7 \\\y endstream endobj 571 0 obj << /Length 122 /Filter /FlateDecode >> stream x3230W0P0aCS3CB.C I$r9yr+Zp{E=}JJS ]  b<]0@A@8~? q0\=(CE` endstream endobj 572 0 obj << /Length 150 /Filter /FlateDecode >> stream x3236W0P5Q54W0P05SH1*22 (s< =\ %E\N @QhX.O  P?`E6?gc?P~.WO@.W endstream endobj 573 0 obj << /Length 196 /Filter /FlateDecode >> stream xڵ1 @Еir3'p.#BBRPQr0E:? d37u.{ʧHrCqJzƁGz$15x2`ts [R?L3؂rkm;x3HKv@%.oԐ nn**ɍ@ÔDr endstream endobj 574 0 obj << /Length 108 /Filter /FlateDecode >> stream x3230W0P0aCS CB.C I$r9yr+Zp{E=}JJS ]  b<]?0! ̃`qzrrƂQ. endstream endobj 575 0 obj << /Length 177 /Filter /FlateDecode >> stream x33R0Pa3scsCB.3 I$r9yr+p{E=}JJS ]  b<]?`@=:773n? Da`N``` O7Nszrr#߈ endstream endobj 576 0 obj << /Length 147 /Filter /FlateDecode >> stream x3134V0P0bcsCB.C I$r9yr+r{E=}JJS. @-\. ?00`D~70n?D䇁$0I.WO@.e% endstream endobj 577 0 obj << /Length 188 /Filter /FlateDecode >> stream xڍ1@E #0e6 &naRK v9GTd)HN^f̦ǚ95(EqߜR{cRkI ? ldM*H&g8^WSQdHVR!J*- i~ nN/ookg$AH> wlzZIK endstream endobj 578 0 obj << /Length 196 /Filter /FlateDecode >> stream xڝα @ HByuj;:9::(>Zp"]qQ |CB?2ܓ1G!#I:Ramd$V$fO"tٓH$R^K6ʯ\UW0/%>T5*4hy~> stream x31ֳ0R0P0V54S01Q06WH1*21PAScTr.'~PKW4K)YKE!P E0a<|?`0?> stream x3635R0PacCcsCB.# I$r9yr+Yp{E=}JJS ]  b<]3P?n3 ~o0ah`?PszrrjF endstream endobj 581 0 obj << /Length 195 /Filter /FlateDecode >> stream x=αJ@Xf x{`TSwZ * W6`"8%Gf|q~K.4pR^j<> stream x363T0P0T5T0P05TH1*22 (Ads≮=\ %E\N \. ц \.   W  @ @,?(fQ 0pC sC3=;?f.WO@.uH endstream endobj 583 0 obj << /Length 153 /Filter /FlateDecode >> stream x3134V0P0R5T01Q06WH1*21 ([@ds<L =\ %E\N @QhX.O `J`pB`왏I@.WO@.1c endstream endobj 584 0 obj << /Length 183 /Filter /FlateDecode >> stream xU̱ P#k[WJ' rjj Ɔh>`Phj @ B\Q#HEldȗ$"Sg3:.{|LVkRj_ ..X ,g0i) <p&A=j|c(vk]b=(ԿOI |F? endstream endobj 585 0 obj << /Length 233 /Filter /FlateDecode >> stream xU=KPs Xxv(zb`A' Q|A7|~Lx`7UN?8g!Aj"z$r~nhdHڙdrO/$GcHN* WUP6Aߴ45q " bx%tq_cGŲh;L t5<fOk2|+ZlECd(IBY_ endstream endobj 586 0 obj << /Length 210 /Filter /FlateDecode >> stream xMν @ )(> stream xUj@Yi nZ$sSEGQ|x I;=F(N8^D!qiIs ǔB3I-1QYAg//74gZv* 0ÿ+]SCE@QsϰF,IqSn/'gCb^mmjg`1'>ڟK endstream endobj 588 0 obj << /Length 183 /Filter /FlateDecode >> stream x%1 @@$|'0+AA),DQI:IUuO)Fh~!;:c̐ېዬQ֑)HpIH]RY#H[m(l2Oe-?uC endstream endobj 589 0 obj << /Length 188 /Filter /FlateDecode >> stream xڵ1 @EH!L#d.ͺB` A+ RK EBbGRRl6Pt+ǬƬ5$Ii;Xf$#aI,Dv$f,I(K~ |[jWopG!SE /zO6x+ӸY~uд` endstream endobj 590 0 obj << /Length 121 /Filter /FlateDecode >> stream x3135R0P0bc3SSCB.# I$r9yr+Yp{E=}JJS ]  b<]0001; aX*6T?0'W N endstream endobj 591 0 obj << /Length 228 /Filter /FlateDecode >> stream xmαJ@o"0M^ป'pWSZY `eh>J+5E~;Yct_^iC-/+9u'Zst }{} ,, %s'l"aAZқMY'W Tc| endstream endobj 592 0 obj << /Length 235 /Filter /FlateDecode >> stream xu1N0ЉRX`3',ZiY$R AE GQr[0"OʌǓ/^ҟ+Vɾݭ%+yxb>F:iy-29Q EPE6fLV&b&e6fՎY (y/ifU _ cBԨM>y2_ |Ǜjh endstream endobj 593 0 obj << /Length 188 /Filter /FlateDecode >> stream xڕν @ + At-('𮶵kotrP?Q_ I+F!=ړ,o)$G$'KROt8oH&{$S^zVSBĢ iAf1h.p;`Z \2oߛy544` endstream endobj 594 0 obj << /Length 226 /Filter /FlateDecode >> stream xڕϿjAna s=b!j WJ!`R nGG8̜EH:_1;dySpnyΟ9)_6[d?9oR&[}";YL9#;e銊Һ„pQ*+j .+xs7xĕ\ }rR /:tKuNTc'ې'jiT2Dׂ+X endstream endobj 595 0 obj << /Length 243 /Filter /FlateDecode >> stream xmJ@O"p}dXW0 j)h()SDm>{uuVZjG+9}Mjag"VNbkx|JV+-*@ Ps&[ D>#E@rI~2> stream xڕα @ HB}Ѽ]`A'u(GQ|TZ?$w#3ihdȎhC!s8cТZp*Yz?WS2f5wHPQY 4a:B@ 8 1n -SQR-8 d_Ѯ+J_> stream xMJ@Eo[8м$AB`B]W҅E ;#Ǜ*y{wquLZZj}%OR7KmN~&wlֺ₲<>H\i%Jo*-o])L O[ `;d1a3X`LpM6{{xSHp|tO01l6 i4,e3zwgRS@v伕+c endstream endobj 598 0 obj << /Length 237 /Filter /FlateDecode >> stream xu1N0бRD@\lBTE"T AKr!e3 gi_'aE5tB 2(_pӢ&1^_v7T]M=[b.'0S2*(ٌ`&p B!t 灼__Rc%ɞ 6{6C!Ic)A?XZ1IN+OVqY- m9 endstream endobj 602 0 obj << /Length 102 /Filter /FlateDecode >> stream x3235V0P0b#CCcCB.C Hr=BIQi*S!BA,A'W !$ endstream endobj 603 0 obj << /Length 256 /Filter /FlateDecode >> stream x}бN0[#[w7kѮ)5ڂ,HY1FuE1$̝`ڳ$] ciiǒM6jT%0`t)ߚڣ0R7 A\tdC@f;w75>/G% endstream endobj 604 0 obj << /Length 208 /Filter /FlateDecode >> stream xڝ= 0J[r LKSV08s{4#tPqj |[Ƌ$D^x Qξ> 2Q|n->+lx^omIiTEud=X4i;87vLN7oTόdT}X_QO^Wo5Q;G27O> stream xڽ=N@ !L"nCeHJ $GQr-7qF}#[9մgXsoSxmWt5Zx|Ö (ETV";Yepš{J9~P(eRXfdH- Xq*K8/~byoƃq?}`0fW';j#cͪy< ^ux߳= endstream endobj 606 0 obj << /Length 196 /Filter /FlateDecode >> stream x3732V0Pa3 SsCB.3 I$r9yr+p{E=}JJS ]  b<]@ ?p,B@@4#P2J@@hyt?iBAu?aa ?[@?P\\\2oə endstream endobj 607 0 obj << /Length 184 /Filter /FlateDecode >> stream x}б 0+-}'0t I옡ۤVr~>S hR(#^- &َ"lU"kgdfA!!)isޝKT oY<py~# ?@IzS=ZAh1s!o9)ʦ:#ǥ-~ endstream endobj 608 0 obj << /Length 159 /Filter /FlateDecode >> stream x333T0P0bS3SsCB.S# I$r9yr+q{E=}JJS ]  b<]CfPLC(~ŎB1PX ŀD@!;7UӀj (PEqzrrco endstream endobj 609 0 obj << /Length 262 /Filter /FlateDecode >> stream xڽѱN02D%{p<-R$2 Āsh~> stream x3737V0Pas#SsCB.3 I$r9yr+Yp{E=}JJS ]  b<]H|`d!A b"Փ+ 0 endstream endobj 611 0 obj << /Length 101 /Filter /FlateDecode >> stream x3632T0P0aSsCB.crAɹ\N\ \@Q.}O_T.}gC.}h1\. 0 u'.WO@.y9 endstream endobj 612 0 obj << /Length 138 /Filter /FlateDecode >> stream x3531V0PaScSsCB.K I$r9yr+Xr{E=}JJS ]  b<]V0RP %B٣P?bP8(.WO@. endstream endobj 613 0 obj << /Length 253 /Filter /FlateDecode >> stream x}ұj0 {ʦIBPvP:;~~? &S !HIwWŜ :[U4߱I_6|> stream xeѽJ@YR#dM\p` A+ RK EAI|Sgwv/'W,fnQE4tuw8\/nqѢ=ܢmOjKvI@Ƽ U;=zŋ'|+|1#GR (2))RT58B )*B 0Dtc㈒(rTd<\B"!OLm%!) Yxnĺ endstream endobj 615 0 obj << /Length 165 /Filter /FlateDecode >> stream x333P0P0b3SsCB.S3 I$r9yr+q{E=}JJS ]  b<]A ?Q( 2%O&b Pk!: @'@q%vՓ+ 0( endstream endobj 616 0 obj << /Length 233 /Filter /FlateDecode >> stream xڥѽ 0->B4bۭAAAk(>BG3͇uP=AYځK]k̵p&˜Mgd ok|xp +@Z/0d73(M\5|3WU =e0> endstream endobj 617 0 obj << /Length 263 /Filter /FlateDecode >> stream xeϱN@ ?y/iJ"JȀD' X{hy^cꊙD5=:駓|_.(_ I4BCjz8nZ:76 endstream endobj 618 0 obj << /Length 152 /Filter /FlateDecode >> stream x3331V0Pa3cS3CB.SK I$r9yr+Zr{E=}JJS ]  b<]ANi Z@5`NWiffI3i04?(p\\\wG endstream endobj 619 0 obj << /Length 196 /Filter /FlateDecode >> stream x1P .^@?'ILtr0NG(сP[C_۴ˏ0$y4h CmJ9&#&5!d 4rJ>6>y[Rb\ [Bgpq Db 7 %Xz’+pC7 M=$qY+|T endstream endobj 620 0 obj << /Length 271 /Filter /FlateDecode >> stream x}нN0qG"ݒGȽ8DHHd@uFlUGˣo|4RlK\%XYU>y{9<¢ mn K|,0_AD"ML1 /Θc /jE802FxZ0WFf a2+x3  .Hb[TS'J&f N@MAy@Qp:7v#".ԝBMGH' S~ }J 2` endstream endobj 621 0 obj << /Length 345 /Filter /FlateDecode >> stream xڍJ@ 97 hZ=yOуC1yCYrkKƙMEۃY?['j&(U\."pf r HT6ER秗{,/NT*NF+Z"(W랜;b#y6s"s>yGA9߹!yCacp^W$۝ࠥ; B9>׺vݱ ,)7?cyDSmL?h:3EXC7WΛ9i-ڛCyv,qZK yd endstream endobj 622 0 obj << /Length 199 /Filter /FlateDecode >> stream xuν 0+['0~I훙G#t =猪!ARG4!3vYW}؟pRP>@}vD?YM)C?mFAh0Wp(Ԇ&R_GWRM1|w5F ]5IW'C{p:V# \ 8.y endstream endobj 623 0 obj << /Length 191 /Filter /FlateDecode >> stream xڵϱ 0H- Lj3:9::(:O'dP{^CEĐ<%$Q`c^ c4 }p̀4]Pf*[1.h&GA}1t@%c55l)1(*zúg ?q[넭Da_=@M 4Bڐ3'`a`Ot턀 endstream endobj 624 0 obj << /Length 184 /Filter /FlateDecode >> stream xڕ; @ )Bnb*#X٣(9BKY#X[?MbJ]-(9ktRSZ*KJPUtH(>> stream xڵ= @FR2'p$!v-,J--o d3<6{A\Ƹ+ [΁Di,7P3P#eƸ֠5->E)tDL̔Z&U!˧m,Jy"LXI?嵏]&^-VgǞZn$̴ɦp h endstream endobj 626 0 obj << /Length 191 /Filter /FlateDecode >> stream x]ν 0S:w#>mб N(Q3 \'3ʇE)rF2:Rߥ}ה$S2{Z|)/&QR:tCuňC:DvG|iFyV;tPo07{KxN. P5 ҂5-Qle endstream endobj 627 0 obj << /Length 155 /Filter /FlateDecode >> stream x33P0P0a S CB.c I$r9yr+p{E=}JJS ]  b<]?000?FF1 b bҍXo5 endstream endobj 628 0 obj << /Length 264 /Filter /FlateDecode >> stream xڅN0 ]1Drop @ZUt`b81# xlB$7bBb"~??;㺧j|ƶoE]p3A{)~=\SvK;rJxP0w4{\ .c9N]"Yp&Zmm1B`XX 212sP)HrL51UW[$tUݒYņ'r endstream endobj 629 0 obj << /Length 157 /Filter /FlateDecode >> stream x3530U0P0bS#S CB. I$r9yr+Xp{E=}JJS ]  b<]3$;d%YH2$@A6W  H$r  WH endstream endobj 630 0 obj << /Length 122 /Filter /FlateDecode >> stream x3235V0Pa#SSKCB.#C I$r9yr+r{E=}JJS. @-\. 0!("3#! F#.WO@.Nq endstream endobj 631 0 obj << /Length 198 /Filter /FlateDecode >> stream xڵб 0J-}TZV Nj}G!̝:w'dfiYNf6\`w4=]/tbMf u~CQӈ*SKc;[ȩXeٰcF:ԋ!1H޿B !%ԉ=ۈec'l_ق0aOP endstream endobj 632 0 obj << /Length 105 /Filter /FlateDecode >> stream x3235V0Pa#3S CB.## I$r9yr+q{E=}JJS ]  b<]3GBqzrrW endstream endobj 633 0 obj << /Length 188 /Filter /FlateDecode >> stream x= ` C!GhN"  N(kyo =7:8pӺ.fϣRv39;6X|6|GB%%9 " 4Drr{EfV5 RגS^r_,IQiN[)%[y/ [> stream x3530U0P0bS#csCB. I$r9yr+Xp{E=}JJS ]  b<]1` g$m7>0`l@"$'W  endstream endobj 635 0 obj << /Length 176 /Filter /FlateDecode >> stream x3137U0P0bScsCB.C I$r9yr+r{E=}JJS. @-\. 000$700cA2 \ i$ ?l 4b>.d!p!dr~$_\\\-in endstream endobj 636 0 obj << /Length 193 /Filter /FlateDecode >> stream xڭп0$ h[I;`A3>#02+hMK`#8c1qgaSQH-1A9O=t1A*õA]OPöJAy)Ir&~mk]{77xܿf}N$nC&L-, endstream endobj 637 0 obj << /Length 144 /Filter /FlateDecode >> stream x336V0P0bcsJ1*26" \.'O.pc.}(BIQi*S!BA,? DM}?`@8P$` 4'Apzrr8W endstream endobj 638 0 obj << /Length 187 /Filter /FlateDecode >> stream x%= P7.BBBQy[Hθb2+$+]n: 2/*NrN7rZmx]9]bJV9q*> stream x3634Q0P0bc#ScCB.#K I$r9yr+Yr{E=}JJS ]  b<]0<z @?bT 7~`@400cr pR endstream endobj 640 0 obj << /Length 149 /Filter /FlateDecode >> stream x3530U0P0bS#csCB. I$r9yr+Xp{E=}JJS ]  b<]30??@5J2"0?;lA*r  endstream endobj 641 0 obj << /Length 199 /Filter /FlateDecode >> stream xe̱@7&`8ɚ( BX+ RK EBɧ"8qaZ=y$/$I+w良`=,g+b*qz;D$K.&Q~8-x)؇% Vd.hUAmP[0+|D0|D] zy^֐}bUc\6??#Zh endstream endobj 642 0 obj << /Length 236 /Filter /FlateDecode >> stream xuαJ@9R,Lop'p=pSZY՝pE h({]#ZFcf˳朻Em%a⹐QWthMB{[ݝx|A6%ڭy*M\K&#d!#POI* MD // R2h``R̓m\Ջz=@>6m8}F}:1Μ> ,Ef]O sSq0iTxj endstream endobj 643 0 obj << /Length 214 /Filter /FlateDecode >> stream xeͱj@ `-~&lpB2eڌZ-?&A 㤻_*2zSbI_9`QJithwThE}鈶ټS}Nal}!!xH˘ K{0S%YLI4^½vA:C52?j,Tk؄pg e3D^63U[}l* endstream endobj 644 0 obj << /Length 245 /Filter /FlateDecode >> stream xeϱJ@YR &^SZYZZ( W$/%E[nnY|,3[%t@{!4?dS5}{e ݹ5nyyJb"fo87a L{kqEoڛA IsLlL;q6,)"pk'a 6jTvMt%yp7c%^ +~o endstream endobj 645 0 obj << /Length 122 /Filter /FlateDecode >> stream x3137U0P0bCSCB.cc I$r9yr+s{E=}JJS ]  b<]DbvQ$G%AÈB\ endstream endobj 646 0 obj << /Length 231 /Filter /FlateDecode >> stream xmJ0,%Z%c7!02I|zGƭVx|,͝Gif4ۛ IodyA# ՌJ&E8]&Rj Ф KX"9߰C"N +oq @F2h.pFmLF IA.gOլ endstream endobj 647 0 obj << /Length 237 /Filter /FlateDecode >> stream x}J@ba> stream xڕϱ @  Y6O`[ҥTAAAQPG#ttt $Byp :D%;摤8ߨ0XnlBuحVK>/'2%;%|AtG*A0`/PuF199a{Db#j3X5SS imhO_o`{ endstream endobj 649 0 obj << /Length 229 /Filter /FlateDecode >> stream xڅϱN@ `G"yh_p([+"5:T #^%pcHe``\wm# i䶔߸jQD^yݱKղߢ̾{{)oPFn(F ѩjd|L@6mБT /刏sg`|8c¨5 M◔i\Qn+ yrevEsᇎw 4s endstream endobj 650 0 obj << /Length 235 /Filter /FlateDecode >> stream xu=N0M#x.NV[YZHPQ *Ap%G0EagY<]6\瓚CMϴXiXq~hݒŊ܅K~}y{$:܆ok0`2Rӗr@IrBGbd2lRV;xF!#SIgk4IY;!Gabݸi^aeb_Ȼ+:(4 endstream endobj 651 0 obj << /Length 237 /Filter /FlateDecode >> stream xm1N@o4s؊R $(UA WM#šapJ]_;勆ۖzƆ5wdJ۞^m1U-P↪?6\?Qc i&d r2!.G?pS8|9]'?XPT)L%[2/jNl>9ے5FX = WUUG@~U햎 endstream endobj 655 0 obj << /Length 327 /Filter /FlateDecode >> stream xڕӿj0q%C `*B]WC:Nm-vG#dt&?RiD ~i]_\V;WzG*I꒚M dߑ%)YRtZ@m^HwYmVaܶbN4RbXMΔ\uNnnb| mbީLE捴]$ⱱ7!3ilz.2Ob'z>уt!򸴏97 טC.k&) 7Lʬ k ͹!!KkK!#ܥm<Fk(4J@?mG/c endstream endobj 656 0 obj << /Length 267 /Filter /FlateDecode >> stream xڵ=n@Ǣ@f9Al%"C$SX+V*;eDIpJ zְ̊շy^O=JftॽEzKIzWQ+DXQ:]L@GjQPizV8Jy<_oSrJ^CoCK(vRਾB,|.WKuɡ`DuO6KN6_i JGT+ɭ KPJ~ s uy endstream endobj 657 0 obj << /Length 338 /Filter /FlateDecode >> stream x͓?N@gC6QڸHaRK vF8%^0 Z-;;3|qvrXЧhsJL6~Em*iS^o*\R[}OT@WdR;Ȉ,QG9Ci 7rXK0A@$s;:>GOÔ11PVGG { r(ܑ  J}1*7S($;SheIL>oC^fi0ӤIΧ C4qHGnJ谬cC +{7Z۶> ࿢*E!en/ endstream endobj 658 0 obj << /Length 258 /Filter /FlateDecode >> stream x1n0` x'b R"5SS۱Cd(9BFcWGRZ}l_Y1S#=e}EeEzYNzm6|<>I/O^捪ko?n>CK(I֪ov^سs`'rVr\w I˼ދ/np=g?;ؗ= 13rً E7Z1ӌk kmgj.=WMs endstream endobj 659 0 obj << /Length 228 /Filter /FlateDecode >> stream xڕ= t y G('v3#NI4:(IӾH~iՍE[LK;nc<`gq\$A95(8;H(beYc6,wh*.9)"1RH HP+whyś(/*P#qRDҥLSc_擽P[+^& I)Jt*Jl)sŪJSN2\U\ endstream endobj 660 0 obj << /Length 192 /Filter /FlateDecode >> stream xڳ033S0P0bs  #CB.sc I$r9yr+s{E=}JJS ]  b<]CbY ?00e1 Xp?g1YpUgYxY, Dp,y8be,^$'}TaAfRX\\\1=# endstream endobj 661 0 obj << /Length 349 /Filter /FlateDecode >> stream xՓN0 ]uPU"D$02`nyMNIܻEJ8v?ϊ xc\=83,OݣZ*ƲR9UZ_Jt79f^! 5Dň6X;ЖuH@cN.|͎r.m@γۯF|=Mb ִ`]Üb{)$U2ئ' ÄcW|rƬ,e9sOx^cfu=z.{6S1;Ae&oVgۛ`_#7ğ)NG YmvM٭f !&\oVW ?! endstream endobj 662 0 obj << /Length 123 /Filter /FlateDecode >> stream x340ҳ0Q0PaKK #CB.K1s<,M=\ %E\N \. ц \. AD!o`e b gS7\=b endstream endobj 663 0 obj << /Length 105 /Filter /FlateDecode >> stream x331Q0P0bS #CB.C I$r9yr+r{E=}JJS. @-\. A(9TH:հ endstream endobj 664 0 obj << /Length 311 /Filter /FlateDecode >> stream xڍԱN0o#O \<'H3D'㤎H GBI%)+,`z aJOJ}o 9ƙ={MyqB<>@<1f#q8&t3x=%T]_'V1 S>8|bGx ~ه_(Jf2Lc# ן8~w[stJptU,r,]#c},=3ֳTc)frLiGvKA;+DE 1]*YB8k ~oL endstream endobj 665 0 obj << /Length 316 /Filter /FlateDecode >> stream xu1N0qG"yLJȀbF Rc@n@G*9~,d4iZZ?Vݣ^6RVyy~}ԺܘT܏R*<Vs[(;(rOηwp(X;уr,8=Sp`b dOx`Op4Lh }S8:S8^b ab`x'ܷ؂ ~|8'`5l8qN Xx> >kJ@ endstream endobj 666 0 obj << /Length 209 /Filter /FlateDecode >> stream xڳԳ0U0P0b c #CB.s I$r9yr+[p{E=}JJS ]  b<]8J,fn0ªc5CX@Y bGb}e1ce H,ln~ #BBP`pb~Y 0SFY䱠I'W T4# endstream endobj 667 0 obj << /Length 290 /Filter /FlateDecode >> stream xڵӱN `H&GJkNM3NIM{4"Rȍ%) ~ٜoK<+>Lcuz^aہxĦqkAtwb{%>X> stream x}ѱJ@?lv_@p] !p` A+ RK E;!hM7HqfwO`vv23)Vf0WI%X8=Uk3UqaUASSbmn*Sުvm| 82"7@б, }8$tHIR2>JJ =MT;4[6R׳ā~D}~k.:6ʃHϐDJwk81ۇ=Isz6WBJI7l:ahJ7Cަ85,φkVq< /XYd|vRJJ}I endstream endobj 669 0 obj << /Length 233 /Filter /FlateDecode >> stream x퓱 @ S:Y|]I(>BGLZD''|r7Ѧ;M CA> 0Ym՜՘eTфU8A5!hHpɾe PVr{y%رW Kp,+&uaJNEIM4y0犉%ޭ^ AlH4ȗ6eOE8`| endstream endobj 670 0 obj << /Length 270 /Filter /FlateDecode >> stream xڕJ@'LsL 'BB> stream xڵN0/`?BdS` Heꀘh XI-#d`stgۿ~Iy)x 5_XQ&oG\7vWEF<z{O5 Tb!ȣO!2J`@;PP<;Gg3E9c̈*l09t / inm';)),bߘ^Jq݂zlgF endstream endobj 672 0 obj << /Length 253 /Filter /FlateDecode >> stream xҽN0T"GȽu~n! & 7+Q!ʟĄd嗋l4\jU<sMo4HQ {N^Kls/dKɮꑚgʱw_ s=$p8E . (sׅ42*ȱ| ]6&ܴLpڋ_IHGN!X>] 7#f".F?^Q 3ҙ b= endstream endobj 673 0 obj << /Length 244 /Filter /FlateDecode >> stream xڅJ1g"0M!`Dy[ZYZZ(ںy}<•aǙP1|?IO :1H=>cTPc;Ocw!^_[^ʙ;V8?dmgPj\Rq :dĄ* |Vbn;gE d1o( ؁ahDBc!D[o1En %in6N:\Z` æ]H_I<?y뭜 endstream endobj 674 0 obj << /Length 175 /Filter /FlateDecode >> stream xн 0>B L*)j3:9vtPtnG#8f:M|~3z> stream xڥ?J@'X&G\@HBL!he!RK E֛L2ɮ9o[,Ƴw565>UU7v1.tqoYKtq ˣ|QђCDF"RcB|&;J e%wpU3B?O|G(^'f ]THد|X9/O8E.> stream x3635Q0Pacc CB.# I$r9yr+Yp{E=}JJS ]  b<]``0f+ɃԂ 0a@\\\٥; endstream endobj 677 0 obj << /Length 243 /Filter /FlateDecode >> stream xѱJ@)nMD BzQ|-#w_Z˷euG|]KkhFrw[r??ܓ[]rKn7-74B,? X -,fXNpMV%\{`r_ |7fZlP \X~r['-pG NZpZY̊4_HWn$ endstream endobj 678 0 obj << /Length 107 /Filter /FlateDecode >> stream x3635Q0Pac cCB.#K I$r9yr+Yr{E=}JJS ]  b<]0a\= endstream endobj 679 0 obj << /Length 232 /Filter /FlateDecode >> stream xҽjA W#>WZL+vrp!ET+ -vXqt;';됱j-->xsiNY-gOّy+#CYEI O$Rx%4DJʤn ׮UH@Y$߸Np⧤D@(Ax^ 9Eۄip xviC endstream endobj 680 0 obj << /Length 184 /Filter /FlateDecode >> stream xѱ@ & &]xHLtr0NUy{ጃ zw6d4JBGqlfiG{1+P)QEz@-ibc|!Pi ౮!`{.TV6ߡA_y48+po endstream endobj 681 0 obj << /Length 231 /Filter /FlateDecode >> stream xڵ0kHnЂ0 &2`A3<#02^KL%!_s{I!.qa@CT9 +@P% 7 v+@x0> stream x͒N@ ]uG_.!MBH 02<Gx۹F:.˓"J:lN錞c|,5<WO(m(KѭEGWbtK=b$(#!@5@oJ 4{aŌfJ`o}4.lO%wm_mte4](z`_TU` endstream endobj 683 0 obj << /Length 169 /Filter /FlateDecode >> stream x;0 t#' VbTD$02`nQzT dj20XY陞c+4xRps?aq@iA W<ix=   E^6ɱC:_:Wѫ}O_ /h m Ij^ endstream endobj 684 0 obj << /Length 259 /Filter /FlateDecode >> stream x]1N@4;ۊB$\ Q%ڬ\vY)yTk.拊57 UIJ/Kn6O\k*ybx[~|nXp8HDF#々~7'QȔ^;LKZ+45qj@.dtv!"ieh֔j]dV絳Su ?hgcfKxhGZ endstream endobj 685 0 obj << /Length 186 /Filter /FlateDecode >> stream x3534S0P0R5T01Q07SH1*21 (Cds<L =\ %E\N @QhX.OON2bH$;&=A$3?8HAN7PJ`$H `( E` qzrr:p endstream endobj 686 0 obj << /Length 187 /Filter /FlateDecode >> stream x1 @   fl1[ZYZZ(Zkyt {O!(VhpZ0(j. 匴F91J3FNPf4W.dI K#ZX+ސ8 w6 .n N<sUv848n endstream endobj 687 0 obj << /Length 309 /Filter /FlateDecode >> stream xڕ1j@7Xx6l6@RXR%)S$$fB.2Ni!7.V?u~f*U+uW9o(fKUn*< ݖIu>?_dRLjG/zV!C؃@p` 'h'đv3k"t{O<8 F evb883MmH Є̎io“z>Ba"0i5s?hb8T0c00c*Cٻ1 i<8^gvJpi\DXו!) endstream endobj 688 0 obj << /Length 270 /Filter /FlateDecode >> stream xڅN@EPL'~ >X<&ZY+h+| K$\gfX){ʪߗu%B-k_Weʡ/ϯ7/nyS壼'7e"0қ0Dr92DI-٨l+s@!٘b4Hfoq!C?I?b`6|tC t} lLD2r1uIU'TuIk*T%5P%5!.>Z/1 endstream endobj 689 0 obj << /Length 137 /Filter /FlateDecode >> stream x3337W0P04  )\\&f  ,ɥ`bƥU()*Mw pV0wQ6T0tQ```c;0D0I~0Y"I ?&D(I"\=VI endstream endobj 690 0 obj << /Length 301 /Filter /FlateDecode >> stream x}MJ0)YؖG_]x>.]W҅h=Je? گiftߟ ChÞ6 s/\knCs%ux^ߟ\s>k o@B,D'DdZ"-,-B/63"x甙k p7q|$pF暿 dL@AvZHFӬYM5k|,ZdIeb4j`Mg!@Tt`[Bͻ.A8Ew̕bԊW'bt7}t endstream endobj 691 0 obj << /Length 305 /Filter /FlateDecode >> stream xڍN@LJlA gEr&ZY+h=> @IA烋 |gf.K xQz!eY^#[E{_o8_c#>UX>)EৣNGG#"qhfH8fEAEI=-Β%$#쵂H\Wfä hgcgݺi8iZG`s+,25\i`2[[E3)D/bZ1.8G IUuuR:X&oݴ]֯"Mߴo endstream endobj 692 0 obj << /Length 225 /Filter /FlateDecode >> stream xڽнj0 ['Pt!tP2;4qh~?G$C@Bw&,+]po1}R28^~в$IF~{͒/wu|'ܯ8&旘knLM@;&ED-tw>5 pU/jh:؊,PW+D5^ԝhma#:YVp=Dӊb~9ag/uwiS]]q endstream endobj 693 0 obj << /Length 285 /Filter /FlateDecode >> stream xڭѽJ@Y lGȼ&H +PN-`bu>r"X?L6']x\c[awO}͚L> stream xڍ=N0'’!sHRd E"T ()@ Qa-G#LyxcOx~ar Լ=>٦fqR57-ϱm__l<ږ[Od%2 9SQvTy2S T 2NXFvY _C!"%R/Q("!V$M x#$0"W ΈPr($7y?"^\%Id^EARiP7@t4F}ҷ CGɞ~\ endstream endobj 698 0 obj << /Length 136 /Filter /FlateDecode >> stream x323P0PP5T02P04PH1*24(YBs< =\ %E\N @QhX.O9   fv6> $'W  ' endstream endobj 699 0 obj << /Length 152 /Filter /FlateDecode >> stream x33г4R0P0bSs3 CB.S HrW05r{*r;8+r(D*ry(*P 2C@,dBPBՃ)A0@\=R endstream endobj 700 0 obj << /Length 258 /Filter /FlateDecode >> stream x}J1 ] {-(tdibVp> stream xuϱJAba yh+RPK E;1 tƽpS|?;?xžjs3TC=-r+SrgkkrKyrM͒a{ծlB-`a:`u)xuwGW2&e˯ɦnh huaǨk} [ bԪob"EzONoɌla endstream endobj 702 0 obj << /Length 203 /Filter /FlateDecode >> stream xڝ 0OKдv vtrAPGAEA0G#8:ANȹ-Lp;"dJ Z_V[UglJ#IWc>NҽIs-0pu@܀_x vZհu/{#ҡ^EA^UzN4 E A2;Wa V4'VhLr endstream endobj 703 0 obj << /Length 210 /Filter /FlateDecode >> stream xu1j0g<7 41'z(S$ MHXGQ|JW\(T 7uN3uki1}.Gq%Cf&u#U])Yϧz\R׹fi WOp_PI! I@*#f%#~,K{ǏT#,ΰq`(nYsLޖF^V2 endstream endobj 704 0 obj << /Length 167 /Filter /FlateDecode >> stream xα @ ;:'zx: 7:9: *:{G;s]!3pck8YǸh PsNA^/r9E l BuL[VeTɎdÞ@`_wV| 䈚 oafaosK endstream endobj 705 0 obj << /Length 125 /Filter /FlateDecode >> stream x323P0P0b#S3sCB.#C I$r9yr+r{E=}JJS. @-\. ? :  .WO@.P endstream endobj 706 0 obj << /Length 110 /Filter /FlateDecode >> stream x323P0P0b#S3KCB.#C I$r9yr+r{E=}JJS. @-\. ? C 1cqzrrp^ endstream endobj 707 0 obj << /Length 159 /Filter /FlateDecode >> stream x3534W0P0bSCCB. HrW01r{*r;8+r(D*ry(0a@R` `$@z ɀ a/ m?C&\=?qjS endstream endobj 708 0 obj << /Length 144 /Filter /FlateDecode >> stream x36׳4R0P0a3CB.c HrW06r{*r;8+r(D*ry(0`?l(g?6g u@lC{ pP endstream endobj 709 0 obj << /Length 246 /Filter /FlateDecode >> stream xeɱJ@; $p M!澀dF 1` A+ Bv362e]X'qι>giF'5Tkè;.:TQ݆UwG_oTZSE%yB7zȷ CD`Al`^Ѓ\F&i!Qڤ5#+]VڂQS"w)͊S28`?ah֌+.1%t}z= endstream endobj 710 0 obj << /Length 248 /Filter /FlateDecode >> stream xeпJ@o \`^By]  @-G̣R^w]9 Opj8>xPS5ZOLIppu%?^^qDzŷ;JW\ׅˡ~ lr&Vg{'´N2;s8Gvn=ЪQob]pл ~^8:g007~ʞJT Ͼ4sM^!yJ[X' endstream endobj 711 0 obj << /Length 207 /Filter /FlateDecode >> stream xڽ P FҡмVn?`A'qRGE7f}>BŚނ*3$|9VuQۀ}+5͞1%kTڤ|18Ux*%V738 \A&rOP deyܿ>X ?c\%#'q(IfNĴ) endstream endobj 712 0 obj << /Length 131 /Filter /FlateDecode >> stream x337U0PbC33CB.c# I$r9yr+q{E=}JJS ]  b<] >00013 A9 CaՓ+ t^@ endstream endobj 713 0 obj << /Length 259 /Filter /FlateDecode >> stream x]J@Of!"." E0pA.Z v |˝gH0??pNNmnҮwYUϹ勧7wk"nssa q[{_AꭅBaD4%;>#p{%*édlW]HO˷df 3ÂױtK҇FoMfl=o,"E"pLΉ~WhFF*4& !3DWZnvj endstream endobj 714 0 obj << /Length 206 /Filter /FlateDecode >> stream xڥj@@CkB  A GAẸMb/hffӱZ'd?$u{<l(潽x3\h*fTK> stream xڥ1N@gCA2 G`.@lI|&Rhea|x <Ć0̲ϼDmd`ggCګT״}Iz>\|ʼn|Ƣ=,VgGTaˊ+lvuLC! xr~`]T VIm o0/m+H-8٠HŴ̃%'b eA lR(~ FYtG%4xڂ~V *L ^TjCyĺ=LKg 9鏀-uO endstream endobj 719 0 obj << /Length 274 /Filter /FlateDecode >> stream xڽ1N0E"4>BHح,-D $(PR%>Z#l"WAg}{+nǚ^يXq{NiQy͖K9TꞺ=(te!LJBzpLa'=0s EsB5qgZoVVPJ}!J,D;'^Ezdg|F WѮ9!!9&g1#&$| 3fkj`GsA?M[ũt }gz endstream endobj 720 0 obj << /Length 275 /Filter /FlateDecode >> stream xڍj0 e2hCI PhS۱CCZJf endstream endobj 721 0 obj << /Length 286 /Filter /FlateDecode >> stream xAJP. :'{ U,]W҅b/xGR!d̼y$ L'Ci$%!, aJE:ۑ>NAO"j$Jj/XS:Q3j4~7N${%u,JXR7Աn()nͻy#_%\7 vP endstream endobj 722 0 obj << /Length 111 /Filter /FlateDecode >> stream x31V0P0aCCB.cSJrW06 s{*r;8+r(D*ry(0o`&A(1` r .s endstream endobj 723 0 obj << /Length 184 /Filter /FlateDecode >> stream xѽ 0-y'06 ftr'uTܚGQ;祝\݃~ +0.0xH:: eOPZPwA%ޮ#r5 )&;3D"Z*rLD^cj&Uؑˈ^t;;jUxa|t-?>W`na o? endstream endobj 724 0 obj << /Length 195 /Filter /FlateDecode >> stream x= @ )2(I#XQr)uv! jc_13{b-lHlH\J@2$]kH)F1!AtG "Ù`*Coz_kjSӵrgFOT&.Y<,I(d&t^Pkԏ-b0P0+f endstream endobj 725 0 obj << /Length 375 /Filter /FlateDecode >> stream xڍҽN0:TG_%tR$2 Ā[dc%oO"]\LK}ɽ(@"6 Ub)TelΣVN֎X%ҲFV8!TZ^՞j#{)'F2N4jvQWQڱ/";6lC4*f}X `aUca7Pl*L5L> stream xڳ436W0P0bK#K CB. 3 I$r9yr+Xq{E=}JJS ]  b<]" ` )dQe21 8pfAfiA&iΔg22Ge^L0 @ Փ+  endstream endobj 730 0 obj << /Length 287 /Filter /FlateDecode >> stream xڕѽN0> stream xڵJ@%4y˼nn p` A+ J--PB\_SE;%_tB=ܵlkouLn}{ ?T\n0`Bh§"( v3,rV (R0(Z1̾?^3A RW^SML j3)0}1F3f liX6e*yX i}lM󣫖 S-zY endstream endobj 732 0 obj << /Length 267 /Filter /FlateDecode >> stream xڝJ1'lq0޼fpVb]hy}-86L /;q5%QwFO-kHfr;r +ZoyaC 2i寙5z>%k<&r,`vd+q3ߒ1^+ \oxE<@G*q/|Aoٸ=,8U(`ش fA-pڟڤPj"{mI倷YR endstream endobj 733 0 obj << /Length 351 /Filter /FlateDecode >> stream xڭJ0ǧȥº=z =umr!4LRuDg^W4;(M}h-ԣKCQ\jժԥ*NѮ̼<ޫbu~lX)U6_GzahB t ]2G6Da)hrcfEA1-?pλճ I}҈6ĥPgOn ܘ'+tc036u! 蒡AM"9%} |H=X9ZHv]ϽmE=LQVgq)ϜRT7D]n cƒ|M'b<%NZu>v endstream endobj 734 0 obj << /Length 219 /Filter /FlateDecode >> stream x37ѳT0P0bsCCCB.33JrW03 s{*r;8+r(D*ry(00`P"0C=~d3@@C P?P 8xq83qe0w`0H+p32> f qՓ+ P endstream endobj 735 0 obj << /Length 279 /Filter /FlateDecode >> stream x=J@ )2'p2Dl +BB\K E;qy^a2E33EdȼҥOumYꭥA +]Ȝc2͹~z|#8іF_[]PI%ae,*=c<<6F< ӉY+ _ ^Lubފq,?vMectJAqO8:G}- ȘKH~cD='0t[g7׏iC endstream endobj 736 0 obj << /Length 288 /Filter /FlateDecode >> stream xѱN0Ы2DHmNJȀS22`%4*1Cg[!uBbbt:Ftr6IF9s|bli%cLl^_0\tSv PiYY0٣-$Fi nQC$lrڢWF$\Ea}!~"bǠ?qQu{3}>t^ uCaΟ jeG)AmJIeŐ[W.翢j؄7,?ne endstream endobj 761 0 obj << /Producer (pdfTeX-1.40.22) /Author()/Title()/Subject()/Creator(LaTeX with hyperref)/Keywords() /CreationDate (D:20240501014640-04'00') /ModDate (D:20240501014640-04'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.22 (TeX Live 2022/dev/Debian) kpathsea version 6.3.4/dev) >> endobj 343 0 obj << /Type /ObjStm /N 93 /First 877 /Length 5527 /Filter /FlateDecode >> stream x\]7r}_яi"  1~ `AklɐIV;e$A0}lY,NJ[E_ϋSgۖe qWpmb^$A;2n ڈ_Bi q%d lrz}wqx|PP`!͖5cD~CѺ~@ܛ ht :EZ'N?qmEBEEEEEEEGe\CAqPYЀ2G)Į.:k0V`1xqx^KEyId^HHHHHHHHHHHIIIsdyҵ~}V}z/>%ῲr/( O_BFQƚi_|8hA8tOFeVlHi/  }l#X^>ml&>mhO7n$`>1eL AC!fлds- v &_t F/`999,,/,/ŗA栝E"[ss&ejH|y탂k.[g6h[Ñ-4aˣU(A6J`ݹQΏw2JąQ+.xq.n ^;X/?xA/]8: z?xA/]w5-%IhׯonJ,O/߼նn`\oZ}kY>vᨀdADB2Pgfu @@B2& $$ @B22 L$42DB+g.:$ ,&,',`aQ([X(`Q>|E,*XT`Q9rEEa(l¢YX6 faQ,, Ea(p=Nz؉:YꇞuXʼnu֑XG&Iaዿ#] ea֢Ͽ(km |-i}K,p#m.-tRc>bVVO58M@ 7S9luٿCMیmg族J0U5l` Tn݌6&n *`צ.@ *Ǖ1;JjsZ~VBW:Mښg)pʴoaZ;Qɰ `}4+tͣyIJ`"Ngڂ ͺݷS]>8Ao)M)Xw`D7!=iSHK PA6@1lT PA6@E䩇7ReR䉲DR&I$`I!DR1ui!6:Ma~ |yx㌉! H\-x0Q 1Y8 T$HM &@or죱QL?t/3Vq*μ?;<5V,Z1SX v=}+]ZhY&r2P\6j={u^ 3+C ^NJ NXڭ|=ޫ+m85P{߭U"5kWj { I6Zp> 5[<+mUicO(Ն&l~Jr&aIZ&RSK)JiqiOҜvp%4#,t M4baȼrG(#i&ȻZQ/đg!^QR{]e|۸8-9#u\fd<,C'j~/k}MhiΠ#{!TiCFs+qx_3_yͿ7L _Tj0J &Sd*5L1:=;b=F #S48yl6:TgrLSa39Lu&0ՙ:TorMSa79L6$60zT9LT9LT9LT9LT9L`slSaj9L Ôfˢd|g;rp8t8 Nq8;(Áu>z="k\JA\OP=Кo~e'd xV֊ {=V{y QӤi'A_l-۪{Eld/AMk؇cD˹^dͲu_$ ?G@fm6$#x_uf35{yP3"93f6C($95-@K9htD t#bĈ&F5"z5oFWT+@חu &V@w&VX+ob)Z>c+pXv    ibhhM7V̗6T;\4=0%Ԝ6 tNm4iGOjjtߵ]7v>֌&J-"8fO s4xZ{*fI4 iM2w6ӀD@R*,Ý _ Ƅ$s+Gc&

    wszy(p2gPv+S#!f0j'__6k k3Un>TyE6HF[̯YV=j{ZcH"iXTV,)OTWLaͥ馃hOPDLbT4zNg S5 |JbS2!, DJrv3"BشKWޠ _/v/!] x aBG nvtcEND%_Fi 'NT\İȐj;l3$uh!l'3C?BiO|]ލ= pM{_޿xs ~WG55bk&}>C endstream endobj 762 0 obj << /Type /XRef /Index [0 763] /Size 763 /W [1 3 1] /Root 760 0 R /Info 761 0 R /ID [<506ECC7FB7BF827E6846DAF323FF3DCF> <506ECC7FB7BF827E6846DAF323FF3DCF>] /Length 2179 /Filter /FlateDecode >> stream x%y|MG3YH$/ܙ!$Tb"$ZjTѢJ[Rj}/FTZUE)jU[>9;sg9:,Z_rWeDAtIbr^1ŖK296Z9鴒NfJ:+X$)'g\Yi))x[W9yYd,dɱ4[26Cߔ&bٷ͕koʀX2Ik'a",`DX&29KHwR\ 8ݖmKkZzN-SפKfT851 f> >7FE=r,/XZ 5;[J?w^5w &46M` olK7/6/`W8V]`(6wi } 82 Ni'pO)v禁^pqve:z \\e+8|K(e}u>w{3bCoGr <\2lǠP?iHni׍ hrKfA^S88fAf -S"ޯtKLn0nЖNytiP@BБg;} {].AW{(ĂeA/~XsTqi f~Xh AȽ2xw: q~Wl F!MW`L< ͓_RE7\_=``~9R 1zL~ ~|fȸh mD6xǬ/X8Q#Q`j kA/gVp>Vb%UXzu `'JgIU``fkZo%Xz#OlZ 6w[881z[md;~q|u v1][޳eؙi7=E[l>p+Spw;8 ^~dNrO-3Y 1) & (tab$adj.P.Val < 0.01),] affyIDs <- rownames(tab2) library("microRNA") data(hsTargets) library("hgu133plus2.db") entrezIDs <- mappedRkeys(hgu133plus2ENTREZID[affyIDs]) library("org.Hs.eg.db") mappedEntrezIDs <- entrezIDs[entrezIDs %in% mappedkeys(org.Hs.egENSEMBLTRANS)] ensemblIDs <- mappedRkeys(org.Hs.egENSEMBLTRANS[mappedEntrezIDs]) targetMatches <- match(ensemblIDs, hsTargets$target, 0) ## same as data(targets) targets <- hsTargets[targetMatches,] targets$chrom <- paste("chr", targets$chrom, sep = "") ################################################### ### code chunk number 3: rtl-miRNA-track ################################################### library(rtracklayer) library(GenomicRanges) ## call data(targets) if skipping first block head(targets) targetRanges <- IRanges(targets$start, targets$end) targetTrack <- with(targets, GRangesForUCSCGenome("hg18", chrom, targetRanges, strand, name, target)) ################################################### ### code chunk number 4: rtl-miRNA-track-seqinfo ################################################### genome(targetTrack) head(seqlengths(targetTrack)) ################################################### ### code chunk number 5: feature-data-accessors ################################################### head(seqnames(targetTrack)) head(start(targetTrack)) ################################################### ### code chunk number 6: sol-1 ################################################### head(strand(targetTrack)) head(width(targetTrack)) data.frame(chrom = as.factor(seqnames(targetTrack)), start = start(targetTrack), end = end(targetTrack), strand = as.factor(strand(targetTrack))) ################################################### ### code chunk number 7: subset-features ################################################### ## get the first 10 targets first10 <- targetTrack[1:10] ## get pos strand targets posTargets <- targetTrack[strand(targetTrack) == "+"] ## get the targets on chr1 chr1Targets <- targetTrack[seqnames(targetTrack) == "chr1"] ################################################### ### code chunk number 8: sol-2 ################################################### negChr2Targets <- targetTrack[strand(targetTrack) == "-" & seqnames(targetTrack) == "chr2"] ################################################### ### code chunk number 9: export (eval = FALSE) ################################################### ## export(targetTrack, "targets.bed") ################################################### ### code chunk number 10: import (eval = FALSE) ################################################### ## restoredTrack <- import("targets.bed") ################################################### ### code chunk number 11: sol-3 ################################################### export(targetTrack, "targets.gff") targetGff <- import("targets.gff") targetChar <- export(targetTrack, format = "gff1") ################################################### ### code chunk number 12: browserSession (eval = FALSE) ################################################### ## session <- browserSession("UCSC") ################################################### ### code chunk number 13: genomeBrowsers ################################################### genomeBrowsers() ################################################### ### code chunk number 14: layTrack (eval = FALSE) ################################################### ## track(session, "targets") <- targetTrack ################################################### ### code chunk number 15: sol-4 (eval = FALSE) ################################################### ## session$target100 <- targetTrack[1:100] ################################################### ### code chunk number 16: take-subset ################################################### subTargetTrack <- targetTrack[1] # get first feature ################################################### ### code chunk number 17: view-subset (eval = FALSE) ################################################### ## view <- browserView(session, subTargetTrack * -10, pack = "targets") ################################################### ### code chunk number 18: view-subset-multi (eval = FALSE) ################################################### ## view <- browserView(session, targetTrack[1:5] * -10, pack = "targets") ################################################### ### code chunk number 19: sol-6 (eval = FALSE) ################################################### ## viewOut <- browserView(session, range(view) * -2) ## viewFull <- browserView(session, full = "targets") ################################################### ### code chunk number 20: browseGenome (eval = FALSE) ################################################### ## browseGenome(targetTrack, range = subTargetTrack * -10) ################################################### ### code chunk number 21: browseGenome-simple (eval = FALSE) ################################################### ## browseGenome(subTargetTrack) ################################################### ### code chunk number 22: get-track-names (eval = FALSE) ################################################### ## loaded_tracks <- trackNames(session) ################################################### ### code chunk number 23: get-track-data (eval = FALSE) ################################################### ## subTargetTrack <- track(session, "targets") ################################################### ### code chunk number 24: get-track-segment (eval = FALSE) ################################################### ## chr1Targets <- track(session, "targets", chr1Targets) ################################################### ### code chunk number 25: sol-7 (eval = FALSE) ################################################### ## region <- range(subTargetTrack) + 500 ## targetSNP <- track(session, "snp130", region) ## as.data.frame(targetSNP) ## targetGene <- track(session, "knownGene", region) ## as.data.frame(targetGene) ################################################### ### code chunk number 26: genomeSegment-view (eval = FALSE) ################################################### ## segment <- range(view) ################################################### ### code chunk number 27: tracks-view (eval = FALSE) ################################################### ## visible_tracks <- trackNames(view) ## trackNames(view) <- visible_tracks ################################################### ### code chunk number 28: track-modes-view (eval = FALSE) ################################################### ## modes <- ucscTrackModes(view) ################################################### ### code chunk number 29: set-track-modes (eval = FALSE) ################################################### ## modes["targets"] ## modes["targets"] <- "full" ## ucscTrackModes(view) <- modes ################################################### ### code chunk number 30: browserViews (eval = FALSE) ################################################### ## views <- browserViews(session) ## length(views) ################################################### ### code chunk number 31: sol-8 (eval = FALSE) ################################################### ## viewTarget <- track(session, "targets", range(view)) ## trackNames(view) <- c("snp130", "knownGene", "targets") ## ucscTrackModes(view)["knownGene"] <- "hide" ################################################### ### code chunk number 32: load-snp ################################################### library(rtracklayer) data(cpneTrack) ################################################### ### code chunk number 33: datavals-accessor ################################################### head(score(cpneTrack)) ################################################### ### code chunk number 34: trackData ################################################### plot(start(cpneTrack), score(cpneTrack)) ################################################### ### code chunk number 35: layTrack-snp (eval = FALSE) ################################################### ## session <- browserSession() ## session$cpne <- cpneTrack ################################################### ### code chunk number 36: browserView-snp (eval = FALSE) ################################################### ## view <- browserView(session, range(cpneTrack[1:5,]), full = "cpne") ################################################### ### code chunk number 37: layTrack-snp2 (eval = FALSE) ################################################### ## track(session, "cpne2", autoScale = FALSE, yLineOnOff = TRUE, ## yLineMark = quantile(score(cpneTrack), .25)) <- cpneTrack ## view <- browserView(session, range(cpneTrack[1:5,]), full = "cpne2") ################################################### ### code chunk number 38: search-nrsf ################################################### library(BSgenome.Hsapiens.UCSC.hg19) nrsfHits <- matchPattern("TCAGCACCATGGACAG", Hsapiens[["chr1"]]) length(nrsfHits) # number of hits ################################################### ### code chunk number 39: track-nrsf ################################################### nrsfTrack <- GenomicData(ranges(nrsfHits), strand="+", chrom="chr1", genome = "hg19") ################################################### ### code chunk number 40: browserView-nrsf (eval = FALSE) ################################################### ## session <- browseGenome(nrsfTrack, range = range(nrsfTrack[1]) * -10) ################################################### ### code chunk number 41: rmsk.e2f3 (eval = FALSE) ################################################### ## library (rtracklayer) ## mySession = browserSession("UCSC") ## genome(mySession) <- "hg19" ## e2f3.tss.grange <- GRanges("chr6", IRanges(20400587, 20403336)) ## tbl.rmsk <- getTable( ## ucscTableQuery(mySession, track="rmsk", ## range=e2f3.tss.grange, table="rmsk")) ################################################### ### code chunk number 42: uwDgfEncodeExample (eval = FALSE) ################################################### ## track.name <- "wgEncodeUwDgf" ## table.name <- "wgEncodeUwDgfK562Hotspots" ## e2f3.grange <- GRanges("chr6", IRanges(20400587, 20403336)) ## mySession <- browserSession () ## tbl.k562.dgf.e2f3 <- getTable(ucscTableQuery (mySession, track=track.name, ## range=e2f3.grange, table=table.name)) ## tbl.k562.dgf.hg19 <- getTable(ucscTableQuery (mySession, track=track.name, ## table=table.name)) ################################################### ### code chunk number 43: trackAndTableNameDiscovery (eval = FALSE) ################################################### ## mySession <- browserSession () ## genome(mySession) <- "hg19" ## # 177 tracks in October 2012 ## track.names <- trackNames(ucscTableQuery(mySession)) ## # chose a few tracks at random from this set, and discover how ## # many tables they hold ## tracks <- track.names [c (99, 81, 150, 96, 90)] ## sapply(tracks, function(track) { ## length(tableNames(ucscTableQuery(mySession, track=track))) ## }) ################################################### ### code chunk number 44: session-info ################################################### sessionInfo() rtracklayer/inst/doc/rtracklayer.Rnw0000644000175100017510000006634414614231172020670 0ustar00biocbuildbiocbuild\documentclass{article} %\VignetteIndexEntry{rtracklayer} \usepackage[usenames,dvipsnames]{color} \usepackage[colorlinks=true, linkcolor=Blue, urlcolor=Blue, citecolor=Blue]{hyperref} \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Rfunarg}[1]{{\texttt{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \newcommand{\Rcode}[1]{{\texttt{#1}}} \newcommand{\software}[1]{\textsf{#1}} \newcommand{\R}{\software{R}} \newcommand{\IRanges}{\Rpackage{IRanges}} \title{The \textbf{rtracklayer} package} \author{Michael Lawrence} \begin{document} \maketitle <>= options(width=70) @ \tableofcontents \section{Introduction} The \textbf{rtracklayer} package is an interface (or \emph{layer}) between \textbf{R} and genome browsers. Its main purpose is the visualization of genomic annotation \emph{tracks}, whether generated through experimental data analysis performed in R or loaded from an external data source. The features of \textbf{rtracklayer} may be divided into two categories: 1) the import/export of track data and 2) the control and querying of external genome browser sessions and views. The basic track data structure in Bioconductor is the \Rclass{GRanges} class, defined in the \Rpackage{GenomicRanges} package. \textbf{rtracklayer} supports the import and export of tracks from and to files in various formats, see Section~\ref{sec:import-export}. All positions in a \Rclass{GRanges} should be 1-based, as in R itself. The \textbf{rtracklayer} package currently interfaces with the \textbf{UCSC} web-based genome browser. Other packages may provide drivers for other genome browsers through a plugin system. With \textbf{rtracklayer}, the user may start a genome browser session, create and manipulate genomic views, and import/export tracks and sequences to and from a browser. Please note that not all features are necessarily supported by every browser interface. The rest of this vignette will consist of a number of case studies. First, we consider an experiment investigating microRNA regulation of gene expression, where the microRNA target sites are the primary genomic features of interest. \section{Gene expression and microRNA target sites} This section will demonstrate the features of \textbf{rtracklayer} on a microarray dataset from a larger experiment investigating the regulation of human stem cell differentiation by microRNAs. The transcriptome of the cells was measured before and after differentiation by HG-U133plus2 Affymetrix GeneChip arrays. We begin our demonstration by constructing an annotation dataset from the experimental data, and then illustrate the use of the genome browser interface to display interesting genomic regions in the UCSC browser. \subsection{Creating a target site track} For the analysis of the stem cell microarray data, we are interested in the genomic regions corresponding to differentially expressed genes that are known to be targeted by a microRNA. We will represent this information as an annotation track, so that we may view it in the UCSC genome browser. \subsubsection{Constructing the \Rclass{GRanges}} In preparation for creating the microRNA target track, we first used \textbf{limma} to detect the differentially expressed genes in the microarray experiment. The locations of the microRNA target sites were obtained from MiRBase. The code below stores information about the target sites on differentially expressed genes in the \textit{data.frame} called \texttt{targets}, which can also be obtained by entering \texttt{data(targets)} when \textbf{rtracklayer} is loaded. % <>= library("humanStemCell") data(fhesc) library("genefilter") filtFhesc <- nsFilter(fhesc)[[1]] library("limma") design <- model.matrix(~filtFhesc$Diff) hesclim <- lmFit(filtFhesc, design) hesceb <- eBayes(hesclim) tab <- topTable(hesceb, coef = 2, adjust.method = "BH", n = 7676) tab2 <- tab[(tab$logFC > 1) & (tab$adj.P.Val < 0.01),] affyIDs <- rownames(tab2) library("microRNA") data(hsTargets) library("hgu133plus2.db") entrezIDs <- mappedRkeys(hgu133plus2ENTREZID[affyIDs]) library("org.Hs.eg.db") mappedEntrezIDs <- entrezIDs[entrezIDs %in% mappedkeys(org.Hs.egENSEMBLTRANS)] ensemblIDs <- mappedRkeys(org.Hs.egENSEMBLTRANS[mappedEntrezIDs]) targetMatches <- match(ensemblIDs, hsTargets$target, 0) ## same as data(targets) targets <- hsTargets[targetMatches,] targets$chrom <- paste("chr", targets$chrom, sep = "") @ % The following code creates the track from the \texttt{targets} dataset: % <>= library(rtracklayer) library(GenomicRanges) ## call data(targets) if skipping first block head(targets) targetRanges <- IRanges(targets$start, targets$end) targetTrack <- with(targets, GRangesForUCSCGenome("hg18", chrom, targetRanges, strand, name, target)) @ % The \Rfunction{GRangesForUCSCGenome} function constructs a \Rclass{GRanges} object for the named genome. The strand information, the name of the microRNA and the Ensembl ID of the targeted transcript are stored in the \Rclass{GRanges}. The chromosome for each site is passed as the \texttt{chrom} argument. The chromosome names and lengths for the genome are taken from the UCSC database and stored in the \Rclass{GRanges} along with the genome identifier. We can retrieve them as follows: <>= genome(targetTrack) head(seqlengths(targetTrack)) @ % While this extra information is not strictly needed to upload data to UCSC, calling \Rfunction{GRangesForUCSCGenome} is an easy way to formally associate interval data to a UCSC genome build. This ensures, for example, that the data will always be uploaded to the correct genome, regardless of browser state. It also immediately validates whether the intervals fall within the bounds of the genome. For cases where one is not interacting with the UCSC genome browser, and in particular when network access is unavailable, the \Rfunction{GRangesForBSGenome} function behaves the same, except it finds an installed \Rpackage{BSGenome} package and loads it to retrieve the chromosome information. \subsubsection{Accessing track information} The track information is now stored in the R session as a \Rclass{GRanges} object. It holds the chromosme, start, end and strand for each feature, along with any number of data columns. The primary feature attributes are the \texttt{start}, \texttt{end}, \texttt{seqnames} and \texttt{strand}. There are accessors for each of these, named accordingly. For example, the following code retrieves the chromosome names and then start positions for each feature in the track. % <>= head(seqnames(targetTrack)) head(start(targetTrack)) @ % \paragraph{Exercises} \begin{enumerate} \item Get the strand of each feature in the track \item Calculate the length of each feature \item Reconstruct (partially) the \texttt{targets} \Rclass{data.frame} \end{enumerate} <>= head(strand(targetTrack)) head(width(targetTrack)) data.frame(chrom = as.factor(seqnames(targetTrack)), start = start(targetTrack), end = end(targetTrack), strand = as.factor(strand(targetTrack))) @ \subsubsection{Subsetting a \textit{GRanges}} It is often helpful to extract subsets from \Rclass{GRanges} instances, especially when uploading to a genome browser. The data can be subset though a matrix-style syntax by feature and column. The conventional \texttt{[} method is employed for subsetting, where the first parameter, \textit{i}, indexes the features and \textit{j} indexes the data columns. Both \textit{i} and \textit{j} may contain numeric, logical and character indices, which behave as expected. % <>= ## get the first 10 targets first10 <- targetTrack[1:10] ## get pos strand targets posTargets <- targetTrack[strand(targetTrack) == "+"] ## get the targets on chr1 chr1Targets <- targetTrack[seqnames(targetTrack) == "chr1"] @ % \paragraph{Exercises} \begin{enumerate} \item Subset the track for all features on the negative strand of chromosome 2. \end{enumerate} <>= negChr2Targets <- targetTrack[strand(targetTrack) == "-" & seqnames(targetTrack) == "chr2"] @ \subsubsection{Exporting and importing tracks} \label{sec:import-export} Import and export of \Rclass{GRanges} instances is supported in the following formats: Browser Extended Display (BED), versions 1, 2 and 3 of the General Feature Format (GFF), and Wiggle (WIG). Support for additional formats may be provided by other packages through a plugin system. To save the microRNA target track created above in a format understood by other tools, we could export it as BED. This is done with the \texttt{export} function, which accepts a filename or any R connection object as its target. If a target is not given, the serialized string is returned. The desired format is derived, by default, from the extension of the filename. Use the \texttt{format} parameter to explicitly specify a format. <>= export(targetTrack, "targets.bed") @ To read the data back in a future session, we could use the \texttt{import} function. The source of the data may be given as a connection, a filename or a character vector containing the data. Like the \texttt{export} function, the format is determined from the filename, by default. <>= restoredTrack <- import("targets.bed") @ % The \Robject{restoredTrack} object is of class \Rclass{GRanges}. % \paragraph{Exercises} \begin{enumerate} \item Output the track to a file in the ``gff'' format. \item Read the track back into R. \item Export the track as a character vector. \end{enumerate} <>= export(targetTrack, "targets.gff") targetGff <- import("targets.gff") targetChar <- export(targetTrack, format = "gff1") @ \subsection{Viewing the targets in a genome browser} For the next step in our example, we will load the track into a genome browser for visualization with other genomic annotations. The \textbf{rtracklayer} package is capable of interfacing with any genome browser for which a driver exists. In this case, we will interact with the web-based \textbf{UCSC} browser, but the same code should work for any browser. \subsubsection{Starting a session} The first step towards interfacing with a browser is to start a browser session, represented in R as a \textit{BrowserSession} object. A \textit{BrowserSession} is primarily a container of tracks and genomic views. The following code creates a \textit{BrowserSession} for the \textbf{UCSC} browser: <>= session <- browserSession("UCSC") @ Note that the name of any other supported browser could have been given here instead of ``UCSC''. To see the names of supported browsers, enter: <>= genomeBrowsers() @ \subsubsection{Laying the track} Before a track can be viewed on the genome, it must be loaded into the session using the \texttt{track<-} function, as demonstrated below: <>= track(session, "targets") <- targetTrack @ The \textit{name} argument should be a character vector that will help identify the track within \texttt{session}. Note that the invocation of \texttt{track<-} above does not specify an upload format. Thus, the default, ``auto'', is used. Since the track does not contain any data values, the track is uploaded as BED. To make this explicit, we could pass ``bed'' as the \textit{format} parameter. \paragraph{Exercises} \begin{enumerate} \item Lay a track with the first 100 features of \texttt{targetTrack} \end{enumerate} Here we use the short-cut \texttt{\$} syntax for storing the track. <>= session$target100 <- targetTrack[1:100] @ \subsubsection{Viewing the track} For \textbf{UCSC}, a view roughly corresponds to one tab or window in the web browser. The target sites are distributed throughout the genome, so we will only be able to view a few features at a time. In this case, we will view only the first feature in the track. A convenient way to focus a view on a particular set of features is to subset the track and pass the range of the subtrack to the constructor of the view. Below we take a track subset that contains only the first feature. <>= subTargetTrack <- targetTrack[1] # get first feature @ Now we call the \texttt{browserView} function to construct the view and pass the subtrack, zoomed out by a factor of 10, as the segment to view. By passing the name of the targets track in the \textit{pack} parameter, we instruct the browser to use the ``pack'' mode for viewing the track. This results in the name of the microRNA appearing next to the target site glyph. <>= view <- browserView(session, subTargetTrack * -10, pack = "targets") @ If multiple ranges are provided, multiple views are launched: <>= view <- browserView(session, targetTrack[1:5] * -10, pack = "targets") @ \paragraph{Exercises} \begin{enumerate} \item Create a new view with the same region as \texttt{view}, except zoomed out 2X. \item Create a view with the ``targets'' track displayed in ``full'' mode, instead of ``packed''. \end{enumerate} <>= viewOut <- browserView(session, range(view) * -2) viewFull <- browserView(session, full = "targets") @ \subsubsection{A shortcut} There is also a shortcut to the above steps. The \texttt{browseGenome} function creates a session for a specified browser, loads one or more tracks into the session and creates a view of a given genome segment. In the following code, we create a new \textbf{UCSC} session, load the track and view the first two features, all in one call: <>= browseGenome(targetTrack, range = subTargetTrack * -10) @ It is even simpler to view the subtrack in \textbf{UCSC} by relying on parameter defaults: <>= browseGenome(subTargetTrack) @ \subsubsection{Downloading Tracks from your Web Browser} @ It is possible to query the browser to obtain the names of the loaded tracks and to download the tracks into R. To list the tracks loaded in the browser, enter the following: % <>= loaded_tracks <- trackNames(session) @ % One may download any of the tracks, such as the ``targets'' track that was loaded previously in this example. % <>= subTargetTrack <- track(session, "targets") @ % The returned object is a \Rclass{GRanges}, even if the data was originally uploaded as another object. By default, the segment of the track downloaded is the current default genome segment associated with the session. One may download track data for any genome segment, such as those on a particular chromosome. Note that this does not distinguish by strand; we are only indicating a position on the genome. % <>= chr1Targets <- track(session, "targets", chr1Targets) @ \paragraph{Exercises} \begin{enumerate} \item Get the SNP under the first target, displayed in \texttt{view}. \item Get the UCSC gene for the same target. \end{enumerate} <>= region <- range(subTargetTrack) + 500 targetSNP <- track(session, "snp130", region) as.data.frame(targetSNP) targetGene <- track(session, "knownGene", region) as.data.frame(targetGene) @ \subsubsection{Accessing view state} The \texttt{view} variable is an instance of \textit{BrowserView}, which provides an interface for getting and setting view attributes. Note that for the UCSC browser, changing the view state opens a new view, as a new page must be opened in the web browser. To programmatically query the segment displayed by a view, use the \texttt{range} method for a \textit{BrowserView}. % <>= segment <- range(view) @ % Similarly, one may get and set the names of the visible tracks in the view. <>= visible_tracks <- trackNames(view) trackNames(view) <- visible_tracks @ The visibility mode (hide, dense, pack, squish, full) of the tracks may be retrieved with the \texttt{ucscTrackModes} method. % <>= modes <- ucscTrackModes(view) @ % The returned value, \texttt{modes}, is of class \textit{UCSCTrackModes}. The modes may be accessed using the \texttt{[} function. Here, we set the mode of our ``targets'' track to ``full'' visibility. <>= modes["targets"] modes["targets"] <- "full" ucscTrackModes(view) <- modes @ Existing browser views for a session may be retrieved by calling the \texttt{browserViews} method on the \textit{browserSession} instance. % <>= views <- browserViews(session) length(views) @ % \paragraph{Exercises} \begin{enumerate} \item Retrieve target currently visible in the view. \item Limit the view to display only the SNP, UCSC gene and target track. \item Hide the UCSC gene track. \end{enumerate} <>= viewTarget <- track(session, "targets", range(view)) trackNames(view) <- c("snp130", "knownGene", "targets") ucscTrackModes(view)["knownGene"] <- "hide" @ \section{CPNE1 expression and HapMap SNPs} Included with the \textbf{rtracklayer} package is a track object (created by the \textbf{GGtools} package) with features from a subset of the SNPs on chromosome 20 from 60 HapMap founders in the CEU cohort. Each SNP has an associated data value indicating its association with the expression of the CPNE1 gene according to a Cochran-Armitage 1df test. The top 5000 scoring SNPs were selected for the track. We load the track presently. <>= library(rtracklayer) data(cpneTrack) @ \subsection{Loading and manipulating the track} The data values for a track are stored in the metadata columns of the \textit{GRanges} instance. Often, a track contains a single column of numeric values, conventionally known as the \textit{score}. The \texttt{score} function retrieves the metadata column named \textit{score} or, if one does not exist, the first metadata column in the \textit{GRanges}, as long as it is numeric. Otherwise, \texttt{NULL} is returned. <>= head(score(cpneTrack)) @ % Sometimes, it may be convenient to extract the track information as a % \textit{data.frame}. The \textit{trackData} function does this by % combining the \textit{featureData} matrix with the \textit{dataVals}. % It also adds a column named \textit{featMid}, which gives the % mid-points (the mean of the start and end positions) of each feature % in the track. Here is an example of using \textit{trackData} to plot % the test value for each SNP vs. its position. One use of extracting the data values is to plot the data. <>= plot(start(cpneTrack), score(cpneTrack)) @ \subsection{Browsing the SNPs} We now aim to view some of the SNPs in the UCSC browser. Unlike the microRNA target site example above, this track has quantitative information, which requires special consideration for visualization. \subsubsection{Laying a WIG track} To view the SNP locations as a track in a genome browser, we first need to upload the track to a fresh session. In the code below, we use the \texttt{[[<-} alias of \texttt{track<-}. <>= session <- browserSession() session$cpne <- cpneTrack @ % Note that because \texttt{cpneTrack} contains data values and its features do not overlap, it is uploaded to the browser in the WIG format. One limitation of the WIG format is that it is not possible to encode strand information. Thus, each strand needs to have its own track, and \textbf{rtracklayer} does this automatically, unless only one strand is represented in the track (as in this case). One could pass ``bed'' to the \textit{format} parameter of \texttt{track<-} to prevent the split, but tracks uploaded as BED are much more limited compared to WIG tracks in terms of visualization options. To form the labels for the WIG subtracks, `` p'' is concatenated onto the plus track and `` m'' onto the minus track. Features with missing track information are placed in a track named with the `` na'' postfix. It is important to note that the subtracks must be identified individually when, for example, downloading the track or changing track visibility. \subsubsection{Plotting the SNP track} To plot the data values for the SNP's in a track, we need to create a \textit{browserView}. We will view the region spanning the first 5 SNPs in the track, which will be displayed in the ``full'' mode. % <>= view <- browserView(session, range(cpneTrack[1:5,]), full = "cpne") @ % The UCSC browser will plot the data values as bars. There are several options available for tweaking the plot, as described in the help for the \textit{GraphTrackLine} class. These need to be specified laying the track, so we will lay a new track named ``cpne2''. First, we will turn the \textit{autoScale} option off, so that the bars will be scaled globally, rather than locally to the current view. Then we could turn on the \textit{yLineOnOff} option to add horizontal line that could represent some sort of cut-off. The position of the line is specified by \textit{yLineMark}. We set it arbitrarily to the 25\% quantile. % <>= track(session, "cpne2", autoScale = FALSE, yLineOnOff = TRUE, yLineMark = quantile(score(cpneTrack), .25)) <- cpneTrack view <- browserView(session, range(cpneTrack[1:5,]), full = "cpne2") @ % \section{Binding sites for NRSF} \label{sec:binding} Another common type of genomic feature is transcription factor binding sites. Here we will use the \textbf{Biostrings} package to search for matches to the binding motif for NRSF, convert the result to a track, and display a portion of it in the \textbf{UCSC} browser. \subsection{Creating the binding site track} We will use the \textbf{Biostrings} package to search human chromosome 1 for NRSF binding sites. The binding sequence motif is assumed to be \textit{TCAGCACCATGGACAG}, though in reality it is more variable. To perform the search, we run \textit{matchPattern} on the positive strand of chromosome 1. % <>= library(BSgenome.Hsapiens.UCSC.hg19) nrsfHits <- matchPattern("TCAGCACCATGGACAG", Hsapiens[["chr1"]]) length(nrsfHits) # number of hits @ % We then convert the hits, stored as a \textit{Views} object, to a \textit{GRanges} instance. % <>= nrsfTrack <- GenomicData(ranges(nrsfHits), strand="+", chrom="chr1", genome = "hg19") @ % \Rfunction{GenomicData} is a convenience function that constructs a \Rclass{GRanges} object. \subsection{Browsing the binding sites} Now that the NRSF binding sites are stored as a track, we can upload them to the UCSC browser and view them. Below, load the track and we view the region around the first hit in a single call to \texttt{browseGenome}. % <>= session <- browseGenome(nrsfTrack, range = range(nrsfTrack[1]) * -10) @ % We observe significant conservation across mammal species in the region of the motif. \section{Downloading tracks from UCSC} \Rclass{rtracklayer} can be used to download annotation tracks from the UCSC table browser, thus providing a convenient programmatic alternative to the web interface available at \url{https://genome.ucsc.edu/cgi-bin/hgTables}. \textbf{Note} that not all tables are output in parseable form, and that \textbf{UCSC will truncate responses} if they exceed certain limits (usually around 100,000 records). The safest (and most efficient) bet for large queries is to download the file via FTP and query it locally. \subsection{Example 1: the RepeatMasker Track} This simple example identifies repeat-masked regions in and around the transcription start site (TSS) of the human E2F3 gene, in hg19: <>= library (rtracklayer) mySession = browserSession("UCSC") genome(mySession) <- "hg19" e2f3.tss.grange <- GRanges("chr6", IRanges(20400587, 20403336)) tbl.rmsk <- getTable( ucscTableQuery(mySession, track="rmsk", range=e2f3.tss.grange, table="rmsk")) @ There are several important points to understand about this example: \begin{enumerate} \item The \Rcode{ucscTableQuery} used above is a proxy for, and provides communication with, the remote UCSC table browser (see \url{https://genome.ucsc.edu/cgi-bin/hgTables}). \item You must know the name of the track and table (or sub-track) that you want. The way to do this is explained in detail below, in section 5.3. \item If the track contains multiple tables (which is the case for many ENCODE tracks, for instance), then you must also specify that table name. \item When the track contains a single table only, you may omit the \Rcode{table} parameter, or reuse the track name (as we did above). \item If you omit the range parameter, the full track table is returned, covering the entire genome. \item The amount of time required to download a track is roughly a function of the number of features in the track, which is in turn a function of the density of those features, and the length of the genomic range you request. To download the entire RepeatMasker track, for all of h19, would take a very long time, and is a task poorly suited to rtracklayer. By contrast, one full-genome DNaseI track takes less than a minute (see below). \end{enumerate} \subsection{Example 2: DNaseI hypersensitivity regions in the K562 Cell Line} The ENCODE project (\url{http://encodeproject.org/ENCODE}) provides many hundreds of annotation tracks to the UCSC table browser. One of these describes DNaseI hypersensitivity for K562 cells (an immortalized erythroleukemia line) measured at the University of Washington using 'Digital Genome Footprinting' (see \url{http://www.ncbi.nlm.nih.gov/pubmed?term=19305407}). Obtain DNaseI hypersensitive regions near the E2F3 TSS, and for all of hg19: <>= track.name <- "wgEncodeUwDgf" table.name <- "wgEncodeUwDgfK562Hotspots" e2f3.grange <- GRanges("chr6", IRanges(20400587, 20403336)) mySession <- browserSession () tbl.k562.dgf.e2f3 <- getTable(ucscTableQuery (mySession, track=track.name, range=e2f3.grange, table=table.name)) tbl.k562.dgf.hg19 <- getTable(ucscTableQuery (mySession, track=track.name, table=table.name)) @ \subsection{Discovering Which Tracks and Tables are Available from UCSC} As the examples above demonstrate, you must know the exact UCSC-style name for the track and table you wish to download. You may browse these interactively at \url{https://genome.ucsc.edu/cgi-bin/hgTables?org=Human&db=hg19} or programmatically, as we demonstrate here. <>= mySession <- browserSession () genome(mySession) <- "hg19" # 177 tracks in October 2012 track.names <- trackNames(ucscTableQuery(mySession)) # chose a few tracks at random from this set, and discover how # many tables they hold tracks <- track.names [c (99, 81, 150, 96, 90)] sapply(tracks, function(track) { length(tableNames(ucscTableQuery(mySession, track=track))) }) @ \section{Conclusion} These case studies have demonstrated a few of the most important features of \textbf{rtracklayer}. Please see the package documentation for more details. The following is the session info that generated this vignette: <>= sessionInfo() @ \end{document} rtracklayer/inst/extdata/0000755000175100017510000000000014614231172016525 5ustar00biocbuildbiocbuildrtracklayer/inst/extdata/demo.narrowPeak.gz0000644000175100017510000000035114614231172022122 0ustar00biocbuildbiocbuildQdemo.narrowPeakE9n0 Кs<s"#M C7T%$BlY~w 9XD/y^ b^= Lxcb``8f(`B$? h$ppxc```(xwsаa?WΌ@/;Kw0s= A:=u030` Ӝ  h$pHbpHaZxc```(x\04g`p|!3#P/`}@lp@Å!@ģ: !X04'h$pPpPZZ&rtracklayer/inst/tests/bed.wig0000644000175100017510000000060214614231172017475 0ustar00biocbuildbiocbuildtrack type=wiggle_0 name="Bed Format" description="BED format" visibility=full color=200,100,0 altColor=0,100,200 priority=20 chr1 59102000 59102300 -1.0 chr1 59102300 59102600 -0.75 chr5 59102600 59102900 -0.50 chr19 59102900 59103200 -0.25 chr19 59103200 59103500 0.0 chr19 59103500 59103800 0.25 chr19 59103800 59104100 0.50 chr19 59104100 59104400 0.75 chr19 59104400 59104700 1.00 rtracklayer/inst/tests/genes.gff30000644000175100017510000000373614614231172020116 0ustar00biocbuildbiocbuild##gff-version 3 ##source-version rtracklayer 1.15.4 ##date 2011-12-06 chr10 rtracklayer gene 92828 95504 5 - . ID=GeneID:347688;Name=TUBB8;geneName=tubulin%2c beta 8;Alias=FLJ40100,TUBB8;genome=hg19 chr10 rtracklayer mRNA 92828 95178 . - . Parent=GeneID:347688;ID=873;Name=TUBB8; chr10 rtracklayer mRNA 92828 95504 . - . Parent=GeneID:347688;ID=872;Name=TUBB8; chr10 rtracklayer exon 92828 94054 . - . Parent=872,873; chr10 rtracklayer CDS 92997 94054 . - . Parent=872,873; chr10 rtracklayer exon 94555 94665 . - . Parent=872; chr10 rtracklayer exon 94555 94665 . - . Parent=873; chr10 rtracklayer CDS 94555 94615 . - . Parent=872; chr10 rtracklayer CDS 94555 94665 . - . Parent=873; chr10 rtracklayer exon 94744 94852 . - . Parent=872; chr10 rtracklayer exon 94744 94852 . - . Parent=873; chr10 rtracklayer CDS 94744 94852 . - . Parent=873; chr10 rtracklayer exon 95122 95178 . - . Parent=873; chr10 rtracklayer CDS 95122 95178 . - . Parent=873; chr10 rtracklayer exon 95348 95504 . . . Parent=872; chr12 rtracklayer gene 87984 91263 . + . ID=GeneID:100288778;Name=LOC100288778;geneName=WAS protein family homolog 1%3B pseudogene;Alias=LOC100288778 chr12 rtracklayer mRNA 87984 91263 . + . Parent=GeneID:100288778;ID=4644;Name=LOC100288778; chr12 rtracklayer exon 87984 88017 . + . Parent=4644; chr12 rtracklayer CDS 87984 88017 . + . Parent=4644; chr12 rtracklayer exon 88257 88392 . + . Parent=4644; chr12 rtracklayer CDS 88257 88392 . + . Parent=4644; chr12 rtracklayer exon 88570 88771 . + . Parent=4644; chr12 rtracklayer CDS 88570 88771 . + . Parent=4644; chr12 rtracklayer exon 88860 89018 . + . Parent=4644; chr12 rtracklayer CDS 88860 89018 . + . Parent=4644; chr12 rtracklayer exon 89675 89827 . + . Parent=4644; chr12 rtracklayer CDS 89675 89827 . + . Parent=4644; chr12 rtracklayer exon 90587 90655 . + . Parent=4644; chr12 rtracklayer CDS 90587 90655 . + . Parent=4644; chr12 rtracklayer exon 90796 91263 . + . Parent=4644; chr12 rtracklayer CDS 90796 91263 . ? . Parent=4644; > ACCCTGACTCCAGGATTACA rtracklayer/inst/tests/gtf.gff0000644000175100017510000000250014614231172017476 0ustar00biocbuildbiocbuildMm.16.ENSMUST00000040592.1 EnsEMBL exon 22572990 22573061 . - . gene_id "ENSMUSG00000033501.1"; transcript_id "ENSMUST00000040592.1"; exon_id "ENSMUSE00000310143.1"; Mm.16.ENSMUST00000040592.1 EnsEMBL CDS 22572990 22573010 . - 0 gene_id "ENSMUSG00000033501.1"; transcript_id "ENSMUST00000040592.1"; exon_id "ENSMUSE00000310143.1"; Mm.16.ENSMUST00000040592.1 EnsEMBL start_codon 22573008 22573010 . - 0 gene_id "ENSMUSG00000033501.1"; transcript_id "ENSMUST00000040592.1"; exon_id "ENSMUSE00000310143.1"; Mm.16.ENSMUST00000040592.1 EnsEMBL exon 22568081 22568323 . - . gene_id "ENSMUSG00000033501.1"; transcript_id "ENSMUST00000040592.1"; exon_id "ENSMUSE00000310133.1"; Mm.16.ENSMUST00000040592.1 EnsEMBL CDS 22568081 22568323 . - 0 gene_id "ENSMUSG00000033501.1"; transcript_id "ENSMUST00000040592.1"; exon_id "ENSMUSE00000310133.1"; Mm.16.ENSMUST00000040592.1 EnsEMBL exon 22566859 22567246 . - . gene_id "ENSMUSG00000033501.1"; transcript_id "ENSMUST00000040592.1"; exon_id "ENSMUSE00000310124.1"; Mm.16.ENSMUST00000040592.1 EnsEMBL CDS 22566977 22567246 . - 0 gene_id "ENSMUSG00000033501.1"; transcript_id "ENSMUST00000040592.1"; exon_id "ENSMUSE00000310124.1"; Mm.16.ENSMUST00000040592.1 EnsEMBL stop_codon 22566974 22566976 . - 0 gene_id "ENSMUSG00000033501.1"; transcript_id "ENSMUST00000040592.1"; exon_id "ENSMUSE00000310124.1"; rtracklayer/inst/tests/multi.wig0000644000175100017510000000335714614231172020107 0ustar00biocbuildbiocbuild# 300 base wide bar graph, autoScale is on by default == graphing # limits will dynamically change to always show full range of data # in viewing window, priority = 20 positions this as the second graph # Note, zero-relative, half-open coordinate system in use for bed format track type=wiggle_0 name="Bed Format" description="BED format" visibility=full color=200,100,0 altColor=0,100,200 priority=20 chr19 59102000 59102300 -1.0 chr19 59102300 59102600 -0.75 chr19 59102600 59102900 -0.50 chr19 59102900 59103200 -0.25 chr19 59103200 59103500 0.0 chr19 59103500 59103800 0.25 chr19 59103800 59104100 0.50 chr19 59104100 59104400 0.75 chr19 59104400 59104700 1.00 # 150 base wide bar graph at arbitrarily spaced positions, # threshold line drawn at y=11.76 # autoScale off viewing range set to [0:25] # priority = 10 positions this as the first graph # Note, one-relative coordinate system in use for this format track type=wiggle_0 name="variableStep" description="variableStep format" visibility=full autoScale=off viewLimits=0.0:25.0 color=255,200,0 yLineMark=11.76 yLineOnOff=on priority=10 variableStep chrom=chr19 span=150 59104701 10.0 59104901 12.5 59105401 15.0 59105601 17.5 59105901 20.0 59106081 17.5 59106301 15.0 59106691 12.5 59107871 10.0 # 200 base wide points graph at every 300 bases, 50 pixel high graph # autoScale off and viewing range set to [0:1000] # priority = 30 positions this as the third graph # Note, one-relative coordinate system in use for this format track type=wiggle_0 name="fixedStep" description="fixed step" visibility=full autoScale=off viewLimits=0:1000 color=0,200,100 maxHeightPixels=100:50:20 graphType=points priority=30 fixedStep chrom=chr19 start=59107401 step=300 span=200 1000 900 800 700 600 500 400 300 200 100 rtracklayer/inst/tests/quickload/0000755000175100017510000000000014614231172020211 5ustar00biocbuildbiocbuildrtracklayer/inst/tests/quickload/contents.txt0000644000175100017510000000004614614231172022607 0ustar00biocbuildbiocbuildT_species_Oct_2011 T_species_Oct_2011 rtracklayer/inst/tests/quickload/T_species_Oct_2011/0000755000175100017510000000000014614231172023377 5ustar00biocbuildbiocbuildrtracklayer/inst/tests/quickload/T_species_Oct_2011/annots.xml0000644000175100017510000000024714614231172025426 0ustar00biocbuildbiocbuild rtracklayer/inst/tests/quickload/T_species_Oct_2011/bedData.bed.gz0000644000175100017510000000043514614231172026020 0ustar00biocbuildbiocbuildBCmj!E+$LA}ꌋٔ@&)I*Aڙ)Bk.pɧakޏ3ߢY8O1--N+^M11ZJm)(`RӈFՄiu!0-m]5亐uMZ纐uMV+@OZ6 w5aZt*ׅk´X5亐uMW' ( Y}ôu_r 2BCrtracklayer/inst/tests/quickload/T_species_Oct_2011/bedData.bed.gz.tbi0000644000175100017510000000026514614231172026576 0ustar00biocbuildbiocbuildBCK 0-\0nk -s|2?/{WqBCrtracklayer/inst/tests/quickload/T_species_Oct_2011/bedGraphData.bw0000644000175100017510000000000014614231172026225 0ustar00biocbuildbiocbuildrtracklayer/inst/tests/quickload/T_species_Oct_2011/mod_chromInfo.txt0000644000175100017510000000001114614231172026713 0ustar00biocbuildbiocbuildtest 100 rtracklayer/inst/tests/quickload/T_species_Oct_2011/T_species_Oct_2011.2bit0000644000175100017510000000010214614231172027340 0ustar00biocbuildbiocbuildC'Atestd8 ::DZ Żirtracklayer/inst/tests/step.wig0000644000175100017510000000066014614231172017722 0ustar00biocbuildbiocbuildtrack type=wiggle_0 name="test" description="test track" visibility=full autoScale=off viewLimits=0:1000 color=0,200,100 maxHeightPixels=100:50:20 graphType=points priority=30 variableStep chrom=chr19 59104701 10.0 59104901 12.5 59105401 15.0 59105601 17.5 59105901 20.0 59106081 17.5 59106301 15.0 59106691 12.5 59107871 10.0 fixedStep chrom=chr18 start=59108021 step=300 span=200 1000 900 800 700 600 500 400 300 200 100 rtracklayer/inst/tests/test.2bit0000644000175100017510000000027214614231172017777 0ustar00biocbuildbiocbuildC'A|gi|157704452|ref|AC_000143.1| Homo sapiens chromosome 11, alternate assembly (based on HuRef), whole genome shotgun sequenced8 ::DZ Żirtracklayer/inst/tests/test.bb0000644000175100017510000003417014614231172017526 0ustar00biocbuildbiocbuild01@Y%8 table hg19NarrowPeak "ENCODE narrowPeak format" ( string chrom; "Name of the chromosome (or contig, scaffold, etc.)." uint chromStart; "The starting position of the feature in the chromosome or scaffold. The first base in a chromosome is numbered 0." uint chromEnd; "The ending position of the feature in the chromosome or scaffold. The chromEnd base is not included in the display of the feature. For example, the first 100 bases of a chromosome are defined as chromStart=0, chromEnd=100, and span the bases numbered 0-99." string name; "Name given to a region (preferably unique). Use '.' if no name is assigned." uint score; "Indicates how dark the peak will be displayed in the browser (0-1000). If all scores were '0' when the data were submitted to the DCC, the DCC assigned scores 1-1000 based on signal value. Ideally the average signalValue per base spread is between 100-1000." char[1] strand; "+/- to denote strand or orientation (whenever applicable). Use '.' if no orientation is assigned." float signalValue; "Measurement of overall (usually, average) enrichment for the region" int peak; "Point-source called for this peak; 0-based offset from chromStart (-1 if no point-source called)" ) ??p@p@@xchr1=Cchr10 xc```Xp8 88 8u @@+;& d2wr0/d2=@Q` \Re cS)Xxcd``H8M 88 8u 2s12Xd2˙~H.3s~1H.s($cn14Kh$HoH~[ao:_xc```Xp(34h`1gf`0G݅ 91"?taPF?tP90H(u93LX'h$H8 HWrtracklayer/inst/tests/test.bed0000644000175100017510000000133314614231172017670 0ustar00biocbuildbiocbuild##Example 5 from Custom Annotation Tracks User's Guide track name="ItemRGBDemo" description="Item RGB demonstration" visibility=2 itemRgb="On" priority=1 useScore="0" color="0,60,120" colorByStrand="0,0,255 255,0,0" group="user" offset=0 url="http://genome.ucsc.edu/foo.html?query=$$" htmlUrl="http://genome.ucsc.edu/goldenPath/help/ct_description.txt" chr7 127471196 127472363 Pos1 0 + 127471196 127472363 255,0,0 3 300,200,100 0,500,1067 chr7 127472363 127473530 Pos2 2 + 127472363 127473530 255,0,0 2 250,500 0,667 chr7 127473530 127474697 Neg1 0 - 127473530 127474697 255,0,0 1 1167 0 chr9 127474697 127475864 Pos3 5 + 127474697 127475864 255,0,0 1 1167 0 chr9 127475864 127477031 Neg2 5 - 127475864 127477031 0,0,255 1 1167 0 rtracklayer/inst/tests/test.bed150000644000175100017510000000065414614231172020043 0ustar00biocbuildbiocbuildtrack type="array" expScale=3.0 expStep=0.5 expNames="breast_A,breast_B,breast_C,cerebellum_A,cerebellum_B," name="Microarray" description="Microarray custom track" chr1 159639972 159640031 2440848 500 - 159639972 159640031 0 1 59, 0, 5 0,1,2,3,4, 0.593000,1.196000,-0.190000,-1.088000,0.093000, chr1 159640161 159640190 2440849 500 - 159640161 159640190 0 1 29, 0, 5 0,1,2,3,4, -0.906000,-1.247000,0.111000,-0.515000,-0.057000,rtracklayer/inst/tests/test.bedGraph0000644000175100017510000000070714614231172020656 0ustar00biocbuildbiocbuildtrack type=bedGraph name="bedGraph track" description="Test" visibility=full color=200,100,0 altColor=0,100,200 gridDefault=Off priority=20 alwaysZero=On yLineMark=10 windowingFunction="mean" chr19 59102000 59102300 -1.0 chr19 59102300 59102600 -0.75 chr19 59102600 59102900 -0.50 chr19 59102900 59103200 -0.25 chr19 59103200 59103500 0.0 chr19 59103500 59103800 0.25 chr17 59103800 59104100 0.50 chr18 59104100 59104400 0.75 chr18 59104400 59104700 1.00 rtracklayer/inst/tests/test.bedpe0000644000175100017510000000035714614231172020222 0ustar00biocbuildbiocbuildchr7 118965072 118965122 chr7 118970079 118970129 TUPAC_0001:3:1:0:1452#0 37 + - chr11 46765606 46765656 chr10 46769934 46769984 TUPAC_0001:3:1:0:1472#0 37 + - chr20 54704674 54704724 chr20 54708987 54709037 TUPAC_0001:3:1:1:1833#0 37 + - rtracklayer/inst/tests/test.bw0000644000175100017510000022112614614231172017552 0ustar00biocbuildbiocbuild&*p@I'naa$ ?@xchr2~chr19<xc`; :04g`pb nR[Zxcd`` ,@; a Lh$ *% 'xc`Ou; V~@<. qU] ,` ; ʻ Th$%-a%-ra2xc` wXA`# x\6%(85 h$2&rtracklayer/inst/tests/test.gtf0000644000175100017510000000044614614231172017722 0ustar00biocbuildbiocbuild##gff-version 3 ##date 2011-05-17 chr1 aggregate_genes.py aggregate_gene 564418 570350 . - . aggregate_gene_id "CUFF.168931" chr1 aggregate_genes.py exonic_section 564418 565718 . - . exonic_section_number "001"; transcripts "CUFF.168931.1"; is_full_exon "True"; aggregate_gene_id "CUFF.168931"rtracklayer/inst/tests/test.R0000644000175100017510000000050114614231172017333 0ustar00biocbuildbiocbuildlibrary(rtracklayer) files <- dir(system.file("tests", package = "rtracklayer"), pattern = "[^R~]$", full.names=TRUE) testExport <- function(file) { track <- import(file) export(track, format = "ucsc") } options(error=recover) sapply(files, testExport) ## test GRanges imports sapply(files[-8], import) rtracklayer/inst/tests/test.xmfa0000644000175100017510000000022114614231172020064 0ustar00biocbuildbiocbuild> 1:6-15 + ST1 ACGTACGTAC > 2:1-10 + ST2 ACGTAAATAC > 3:1-9 + ST3 ACGTAC-TAA = > 1:1-5 + ST1 ACGTA > 2:11-15 + ST2 ACGTT > 3:10-14 - ST3 ACGTA = rtracklayer/inst/tests/trackhub/0000755000175100017510000000000014614231172020040 5ustar00biocbuildbiocbuildrtracklayer/inst/tests/trackhub/genomes.txt0000644000175100017510000000006614614231172022240 0ustar00biocbuildbiocbuildgenome hg19 trackDb hg19/trackDb.txt organism BigFoot rtracklayer/inst/tests/trackhub/hg19/0000755000175100017510000000000014614231172020610 5ustar00biocbuildbiocbuildrtracklayer/inst/tests/trackhub/hg19/trackDb.txt0000644000175100017510000000050514614231172022723 0ustar00biocbuildbiocbuildtrack wgEncodeUWDukeDnaseGM12878FdrPeaks bigDataUrl hg19/wgEncodeUWDukeDnaseGM12878.fdr01peaks.hg19.bb parent uniformDnasePeaks on type bigBed 6 + shortLabel GM12878 longLabel GM12878 DNaseI FDR 1% Uniform Peak Calls from UW-Duke color 8,104,172 subGroups view=Peaks tier=t1 cellType=GM12878 lab=UWDuke metadata cell=GM12878 rtracklayer/inst/tests/trackhub/hg19/wgEncodeUWDukeDnaseGM12878.fdr01peaks.hg19.bb0000644000175100017510000003417014614231172030261 0ustar00biocbuildbiocbuild01@Y%8 table hg19NarrowPeak "ENCODE narrowPeak format" ( string chrom; "Name of the chromosome (or contig, scaffold, etc.)." uint chromStart; "The starting position of the feature in the chromosome or scaffold. The first base in a chromosome is numbered 0." uint chromEnd; "The ending position of the feature in the chromosome or scaffold. The chromEnd base is not included in the display of the feature. For example, the first 100 bases of a chromosome are defined as chromStart=0, chromEnd=100, and span the bases numbered 0-99." string name; "Name given to a region (preferably unique). Use '.' if no name is assigned." uint score; "Indicates how dark the peak will be displayed in the browser (0-1000). If all scores were '0' when the data were submitted to the DCC, the DCC assigned scores 1-1000 based on signal value. Ideally the average signalValue per base spread is between 100-1000." char[1] strand; "+/- to denote strand or orientation (whenever applicable). Use '.' if no orientation is assigned." float signalValue; "Measurement of overall (usually, average) enrichment for the region" int peak; "Point-source called for this peak; 0-based offset from chromStart (-1 if no point-source called)" ) ??p@p@@xchr1=Cchr10 xc```Xp8 88 8u @@+;& d2wr0/d2=@Q` \Re cS)Xxcd``H8M 88 8u 2s12Xd2˙~H.3s~1H.s($cn14Kh$HoH~[ao:_xc```Xp(34h`1gf`0G݅ 91"?taPF?tP90H(u93LX'h$H8 HWrtracklayer/inst/tests/trackhub/hub.txt0000644000175100017510000000023014614231172021352 0ustar00biocbuildbiocbuildhub test_hub shortLabel test_hub longLabel test_hub genomesFile genomes.txt email user@domain.com descriptionUrl http://www.somedomain.com/articles/h19 rtracklayer/inst/tests/v1.gff0000644000175100017510000000024514614231172017250 0ustar00biocbuildbiocbuildchr21 TeleGene enhancer 1000000 1011000 500 + . touch1 chr22 TeleGene promoter 1010000 1010100 900 + . touch1 chr22 TeleGene promoter 1020000 1020000 800 - . touch2 rtracklayer/inst/tests/v2.gff0000644000175100017510000000227014614231172017251 0ustar00biocbuildbiocbuild##gff-version 2 ##Type DNA Escherichia_coli_K-12_complete_genome glimmer/tico CDS 337 2799 5.347931 + . Escherichia_coli_K-12_complete_genome glimmer/tico CDS 2801 3733 11.448764 + . Escherichia_coli_K-12_complete_genome glimmer/tico CDS 3734 5020 6.230648 + . Escherichia_coli_K-12_complete_genome glimmer/tico CDS 5088 5237 3.815619 + . Escherichia_coli_K-12_complete_genome glimmer/tico REANNCDS 5310 5741 -0.111382 - . shift -21 ; note "weak tis" Escherichia_coli_K-12_complete_genome glimmer/tico CDS 5310 5720 -0.111382 - . note "weak tis" Escherichia_coli_K-12_complete_genome glimmer/tico CDS 5683 6459 0.234908 - . Escherichia_coli_K-12_complete_genome glimmer/tico CDS 6529 7959 19.75313 - . Escherichia_coli_K-12_complete_genome glimmer/tico REANNCDS 8238 9191 19.169035 + . shift 63 ; Escherichia_coli_K-12_complete_genome glimmer/tico CDS 8175 9191 19.169035 + . Escherichia_coli_K-12_complete_genome glimmer/tico REANNCDS 9306 9893 19.613488 + . shift 3 ; Escherichia_coli_K-12_complete_genome glimmer/tico CDS 9303 9893 19.613488 + . Escherichia_coli_K-12_complete_genome glimmer/tico CDS 9928 10494 4.670315 - . Escherichia_coli_K-12_complete_genome glimmer/tico CDS 10643 11356 13.285624 - .rtracklayer/inst/tests/v3.gff0000644000175100017510000000166414614231172017260 0ustar00biocbuildbiocbuildedit_test.fa . gene 500 2610 . + . ID=newGene;Alias=NewGene,new_gene edit_test.fa . mRNA 500 2385 . + . Parent=newGene;Namo=reinhard+did+this;Name=t1%28newGene%29;ID=t1;uri=http%3A//www.yahoo.com edit_test.fa . five_prime_UTR 500 802 . + . Parent=t1 edit_test.fa . CDS 803 1012 . + . Parent=t1 edit_test.fa . three_prime_UTR 1013 1168 . + . Parent=t1 edit_test.fa . three_prime_UTR 1475 1654 . + . Parent=t1 edit_test.fa . three_prime_UTR 1720 1908 . + . Parent=t1 edit_test.fa . three_prime_UTR 2047 2385 . + . Parent=t1 edit_test.fa . mRNA 1050 2610 . + . Parent=newGene;Name=t2%28newGene%29;ID=t2 edit_test.fa . CDS 1050 1196 . + . Parent=t2 edit_test.fa . CDS 1472 1651 . + . Parent=t2 edit_test.fa . CDS 1732 2610 . + . Parent=t2 edit_test.fa . mRNA 1050 2610 . + . Parent=newGene;Name=t3%28newGene%29;ID=t3 edit_test.fa . CDS 1050 1196 . + . Parent=t3 edit_test.fa . CDS 1472 1651 . + . Parent=t3 edit_test.fa . CDS 1732 2610 . + . Parent=t3 rtracklayer/inst/tests/variableStep.bw0000644000175100017510000022140514614231172021214 0ustar00biocbuildbiocbuild&p@Ua+bhVg4@@xchr17chr19Cchr5 xc```|Q3ɠ 1h _xcd``9{3L `1#A㎷ q\D/pL|Q8Uxcb``8f A,h$oo)_J^#xc```i04g`p|!3#Pϫi̜ iG@ HG̉:`!X04'8h$oa8+boa8aZxc```|ݬ9 ahటC+gFȟW)]̜ iG@ HG]:`!X04'pvh$o/9o/9kZ&rtracklayer/inst/tests/variableStep.wig0000644000175100017510000000070014614231172021363 0ustar00biocbuildbiocbuildtrack type=wiggle_0 name="variableStep" description="variable step" visibility=full autoScale=off viewLimits=0:1000 color=0,200,100 maxHeightPixels=100:50:20 graphType=points priority=30 variableStep chrom=chr19 59104701 10.0 59104901 12.5 59105401 15.0 59105601 17.5 59105901 20.0 59106081 17.5 59106301 15.0 59106691 12.5 59107871 10.0 variableStep chrom=chr5 span=300 59102600 -0.50 variableStep chrom=chr1 span=300 59102000 -1.0 59102300 -0.75 rtracklayer/inst/unitTests/0000755000175100017510000000000014614231172017075 5ustar00biocbuildbiocbuildrtracklayer/inst/unitTests/test_bb.R0000644000175100017510000000506614614231172020651 0ustar00biocbuildbiocbuildtest_bb <- function() { if (.Platform$OS.type == "windows") return() test_path <- system.file("tests", package = "rtracklayer") test_bb <- file.path(test_path, "test.bb") start <- c(237640, 521500 ,565725, 565900, 566760, 119905, 122525, 173925, 179865, 180185) ir <- IRanges(start, width = 151) space <- factor(c(rep("chr1", 5), rep("chr10", 5))) name <- rep(".", 10) score <- seq.int(70L, 700L, length = 10) signalValue <- seq(10, 100, length = 10) peak <- rep(-1L, 10) correct_fixed <- GRanges(space, ir, name = name, score = score, signalValue = signalValue , peak = peak) si <- SeqinfoForBSGenome("hg19") seqlengths(correct_fixed) <- seqlengths(si)[levels(space)] ## TEST: import whole file test <- import(test_bb) checkIdentical(test, correct_fixed) ## TEST: 'which' which <- GRanges(c("chr10"), IRanges(c(180185, 180335))) correct_which <- subsetByOverlaps(correct_fixed, which) test <- import(test_bb, which = which) checkIdentical(test, correct_which) ## TEST: empty which which <- GRanges() correct_which <- subsetByOverlaps(correct_fixed, which) test <- import(test_bb, which = which) checkIdentical(test, correct_which) ## TEST: BigBedSelection (GRanges, no field) which <- GRanges(c("chr10"), IRanges(173925, width = 151)) test <- import(test_bb, selection = BigBedSelection(which, colnames = character())) correct_subset <- subsetByOverlaps(correct_fixed, which) correct_which <- correct_subset[, character()] correct_which@elementMetadata <- DataFrame() checkIdentical(test, correct_which) ## TEST: BigBedSelection (GRanges, 1 default field) test <- import(test_bb, selection = BigBedSelection(which, colnames = c("name"))) correct_which <- correct_subset[, c("name")] checkIdentical(test, correct_which) ## TEST: BigBedSelection (GRanges, 1 extra field) test <- import(test_bb, selection = BigBedSelection(which, colnames = c("peak"))) correct_which <- correct_subset[, c("peak")] checkIdentical(test, correct_which) ## TEST: BigBedSelection (GRanges, 1 default field and 1 extra field) colnames <- c("name", "peak") test <- import(test_bb, selection = BigBedSelection(which, colnames =colnames)) correct_which <- correct_subset[, colnames] checkIdentical(test, correct_which) # TEST: export test_bb_out <- file.path(tempdir(), "test_out.bb") export(correct_fixed, test_bb_out) on.exit(unlink(test_bb_out)) test <- import(test_bb_out) checkIdentical(test, correct_fixed) } rtracklayer/inst/unitTests/test_bed.R0000644000175100017510000002660714614231172021024 0ustar00biocbuildbiocbuildtest_bed <- function() { test_path <- system.file("tests", package = "rtracklayer") ## Import of classic test.bed with RGB colors test_bed <- file.path(test_path, "test.bed") ## import() createCorrectGR <- function(seqinfo) { ir <- IRanges(c(127471197, 127472364, 127473531, 127474698, 127475865), width = 1167) space <- factor(rep(c("chr7", "chr9"), c(3, 2)), seqlevels(seqinfo)) blocks <- split(IRanges(c(1, 501, 1068, 1, 668, 1, 1, 1), c(300, 700, 1167, 250, 1167, 1167, 1167, 1167)), rep(seq_len(5), c(3, 2, 1, 1, 1))) names(blocks) <- NULL correct_gr <- GRanges(space, ir, strand = strand(c("+", "+", "-", "+", "-")), name = c("Pos1", "Pos2", "Neg1", "Pos3", "Neg2"), score = c(0, 2, 0, 5, 5), itemRgb = c("#FF0000", "#FF0000", "#FF0000", "#FF0000", "#0000FF"), thick = ir, blocks) seqinfo(correct_gr) <- seqinfo correct_gr } createCorrectUCSC <- function(gr) { new("UCSCData", gr, trackLine = new("BasicTrackLine", itemRgb = TRUE, name = "ItemRGBDemo", description = "Item RGB demonstration", visibility = "2", color = c(0L, 60L, 120L), priority = 1, group = "user", offset = 0L, url = "http://genome.ucsc.edu/foo.html?query=$$", htmlUrl = paste("http://genome.ucsc.edu/goldenPath/", "help/ct_description.txt", sep = ""), colorByStrand = matrix(c(0L, 0L, 255L, 255L, 0L, 0L), 3), useScore = FALSE)) } correct_gr <- createCorrectGR(Seqinfo(c("chr7", "chr9"))) correct_ucsc <- createCorrectUCSC(correct_gr) test <- import(test_bed) checkIdentical(test, correct_ucsc) test_bed_file <- BEDFile(test_bed) test <- import(test_bed_file) checkIdentical(test, correct_ucsc) checkIdentical(import(test_bed_file, format = "bed"), correct_ucsc) checkException(import(test_bed_file, format = "gff")) test_bed_con <- file(test_bed) test <- import(test_bed_con, format = "bed") checkIdentical(test, correct_ucsc) test_bed_con <- file(test_bed, "r") test <- import(test_bed_con, format = "bed") checkIdentical(test, correct_ucsc) close(test_bed_con) test_bed_con <- file(test_bed) test <- import(BEDFile(test_bed_con)) checkIdentical(test, correct_ucsc) test <- import(test_bed, trackLine = FALSE) checkIdentical(test, correct_gr) test <- import(test_bed) checkIdentical(correct_ucsc, test) if (!require(BSgenome.Hsapiens.UCSC.hg19)) { stop("'BSgenome.Hsapiens.UCSC.hg19' must be installed to run tests") } hg19_seqinfo <- SeqinfoForBSGenome("hg19") correct_genome <- createCorrectUCSC(createCorrectGR(hg19_seqinfo)) test <- import(test_bed, genome = "hg19") checkIdentical(correct_genome, test) subcols <- c("name", "thick") correct_subcols <- correct_ucsc mcols(correct_subcols) <- mcols(correct_subcols)[ , subcols] test <- import(test_bed, colnames = c(subcols, "strand")) checkIdentical(correct_subcols, test) strand(correct_subcols) <- "*" test <- import(test_bed, colnames = subcols) checkIdentical(correct_subcols, test) which <- correct_gr[1:2] correct_which <- subsetByOverlaps(correct_ucsc, which) test <- import(test_bed, which = which) checkIdentical(correct_which, test) test <- import(test_bed, format = "bed") checkIdentical(correct_ucsc, test) ## import.bed() test <- import.bed(test_bed) checkIdentical(correct_ucsc, test) test_bed_con <- pipe(paste("head -n2", test_bed)) test <- import.bed(test_bed_con) correct_empty <- new("UCSCData", GRanges(), trackLine = correct_ucsc@trackLine) seqinfo(correct_empty) <- Seqinfo() checkIdentical(test, correct_empty) ## export() ## the 'gsub' is to handle Windows paths (for later coercion to URL) test_bed_out <- gsub("\\\\", "/", file.path(tempdir(), "test.bed")) on.exit(unlink(test_bed_out)) export(correct_ucsc, test_bed_out) test <- import(test_bed_out) checkIdentical(correct_ucsc, test) export(correct_ucsc, test_bed_out, format = "bed") test <- import(test_bed_out) checkIdentical(correct_ucsc, test) test_bed_out_file <- BEDFile(test_bed_out) export(correct_ucsc, test_bed_out_file) test <- import(test_bed_out) checkIdentical(correct_ucsc, test) checkException(export(correct_ucsc, test_bed_out_file, format = "gff")) correct_ucsc2 <- initialize(correct_ucsc, trackLine = initialize(correct_ucsc@trackLine, name = "ItemRGBDemo2")) export(correct_ucsc2, test_bed_out_file, append = TRUE) test <- import(test_bed_out_file) correct_list <- GRangesList(ItemRGBDemo = correct_ucsc, ItemRGBDemo2 = correct_ucsc2, compress=FALSE) checkIdentical(correct_list, test) export(correct_ucsc, test_bed_out, name = "ItemRGBDemo2") test <- import(test_bed_out) checkIdentical(correct_ucsc2, test) test_bed_url <- paste("file://", test_bed_out, sep = "") export(correct_ucsc, test_bed_url) test <- import(test_bed_url) checkIdentical(correct_ucsc, test) if (FALSE) { # enable to test an HTTP URL using the R help server http_pipe <- pipe("Rscript -e 'tools::startDynamicHelp(); writeLines(as.character(tools:::httpdPort)); Sys.sleep(10);' &") port <- readLines(http_pipe, n = 1) test_bed_http <- paste("http://127.0.0.1:", port, "/library/rtracklayer/doc/example.bed", sep = "") test <- import(test_bed_http) checkIdentical(correct_ucsc, test) close(http_pipe) } ## GenomicRangesList export(correct_list, test_bed_out) test <- import(test_bed_out) checkIdentical(correct_list, test) ## To/From gzip test_bed_gz <- paste(test_bed_out, ".gz", sep = "") on.exit(unlink(test_bed_gz)) export(correct_ucsc, test_bed_gz) test <- import(test_bed_gz) checkIdentical(correct_ucsc, test) export(correct_ucsc2, test_bed_gz, append = TRUE) test <- import(test_bed_gz) checkIdentical(correct_list, test) test_bed_gz_url <- paste("file://", test_bed_gz, sep = "") export(correct_ucsc, test_bed_gz_url) test <- import(test_bed_gz_url) checkIdentical(correct_ucsc, test) ## To/From tabix test_bed_bgz <- paste(test_bed_out, ".bgz", sep = "") export(correct_ucsc, test_bed_out, index = TRUE) on.exit(unlink(paste(test_bed_bgz, ".tbi", sep = ""))) test <- import(test_bed_bgz, which = which) checkIdentical(correct_which, test) ## check TabixFile test_bed_tabix <- Rsamtools::TabixFile(test_bed_bgz) test <- import(test_bed_tabix) checkIdentical(correct_ucsc, test) ## look mom, no track line export(correct_ucsc, test_bed_out, index = TRUE, trackLine = FALSE) test <- import(test_bed_bgz, which = which) checkIdentical(subsetByOverlaps(correct_gr, which), test) #test <- import(test_bed_tabix, format = "foo") ## To/From text bed_text <- export(correct_ucsc, format = "bed") test <- import(format = "bed", text = bed_text) checkIdentical(correct_ucsc, test) ## TODO: empty text ## Using connection to add comment header test_bed_con <- file(test_bed_out) open(test_bed_con, "w") comment <- "# test comment" writeLines(comment, test_bed_con) export(correct_ucsc, test_bed_con) close(test_bed_con) checkIdentical(comment, readLines(test_bed_out, n = 1)) test <- import(test_bed_out) checkIdentical(correct_ucsc, test) ## Set offset in correct_ucsc track line, export, then: correct_offset <- shift(correct_gr, -1) correct_ucsc@trackLine@offset <- 1L export(correct_ucsc, test_bed_out) test <- import(test_bed_out, trackLine = FALSE) checkIdentical(test, correct_offset) test <- import(test_bed_out) checkIdentical(test, correct_ucsc) correct_ucsc@trackLine@offset <- 0L ## Drop all extra columns, see if it still works correct_stripped <- correct_ucsc mcols(correct_stripped) <- NULL export(correct_stripped, test_bed_out) test <- import(test_bed_out) mcols(correct_stripped)$name <- NA_character_ mcols(correct_stripped)$score <- 0 checkIdentical(test, correct_stripped) ## - and even when asking for a column like blocks: correct_blocks <- correct_ucsc mcols(correct_blocks) <- mcols(correct_blocks)[ , "blocks", drop=FALSE] test <- import(test_bed, colnames = c("blocks", "strand")) checkIdentical(test, correct_blocks) strand(correct_blocks) <- "*" test <- import(test_bed, colnames = "blocks") checkIdentical(test, correct_blocks) ## Drop the columns except for blocks, see if it still works export(correct_blocks, test_bed_out) test <- import(test_bed_out) correct_fill_to_blocks <- correct_ucsc strand(correct_fill_to_blocks) <- "*" mcols(correct_fill_to_blocks)$name <- NA_character_ mcols(correct_fill_to_blocks)$score <- 0 mcols(correct_fill_to_blocks)$itemRgb <- NA_character_ mcols(correct_fill_to_blocks)$thick <- ranges(correct_fill_to_blocks) checkIdentical(test, correct_fill_to_blocks) } test_extendedBed <- function() { # the narrowPeak format represents a variety of "BED6+N" formats # used by the ENCODE project. see # https://genome.ucsc.edu/FAQ/FAQformat.html # "This format is used to provide called peaks of signal # enrichment based on pooled, normalized (interpreted) data. # It is a BED6+4 format." file <- system.file("extdata", "demo.narrowPeak.gz", package="rtracklayer") extraCols <- c(signalValue="numeric", pValue="numeric", qValue="numeric", peak="integer") gr <- import(file, forma="bed", extraCols=extraCols, genome="hg19") checkEquals(length(gr), 6) checkEquals(colnames(mcols(gr)), c("name","score","signalValue","pValue","qValue","peak")) # make sure that all seqnames in the gr object # are also in the seqinfo(gr) object checkTrue(all(seqnames(gr) %in% names(seqinfo(gr)))) } test_bedpe <- function() { path <- system.file("tests", "test.bedpe", package="rtracklayer") nms <- c("TUPAC_0001:3:1:0:1452#0", "TUPAC_0001:3:1:0:1472#0", "TUPAC_0001:3:1:1:1833#0") gr1 <- GRanges(c("chr7", "chr11", "chr20"), IRanges(c(118965073, 46765607, 54704675), c(118965122, 46765656, 54704724)), strand="+") gr2 <- GRanges(c("chr7", "chr10", "chr20"), IRanges(c(118970080, 46769935, 54708988), c(118970129, 46769984, 54709037)), strand="-") seqlevels(gr1) <- union(seqlevels(gr1), seqlevels(gr2)) seqlevels(gr2) <- seqlevels(gr1) pairs <- Pairs(gr1, gr2, name=nms, score=37) bedpe <- import(path) checkIdentical(pairs, bedpe) # test export test_bedpe_out <- file.path(tempdir(), "test.bedpe") on.exit(unlink(test_bedpe_out)) export(bedpe, test_bedpe_out) test <- import(test_bedpe_out) checkIdentical(bedpe, test) bedpe2 <- bedpe mcols(bedpe2)$qvalue <- c(0.02, 0.03, 0.05) mcols(bedpe2)$annotation <- c("promoter", "enhancer", "intron") # test extended bedpe test_bedpe2_out <- file.path(tempdir(), "test2.bedpe") on.exit(unlink(test_bedpe2_out)) export(bedpe2, test_bedpe2_out) test <- import(test_bedpe2_out, extraCols=c(qvalue="numeric", annotation="character")) checkIdentical(bedpe2, test) } rtracklayer/inst/unitTests/test_bedGraph.R0000644000175100017510000001117014614231172021773 0ustar00biocbuildbiocbuildtest_bedGraph <- function() { test_path <- system.file("tests", package = "rtracklayer") test_bg <- file.path(test_path, "test.bedGraph") createCorrectGR <- function(si) { part <- PartitioningByWidth(rep(300, 9)) ir <- shift(IRanges(start(part), end(part)), 59102000) score <- seq(-1, 1, by = 0.25) space <- factor(c(rep("chr19", 6), "chr17", rep("chr18", 2)), seqlevels(si)) correct_gr <- GRanges(space, ir, score = score) if (!any(is.na(genome(si)))) genome(correct_gr) <- unname(genome(si)[1]) seqinfo(correct_gr) <- si correct_gr } createCorrectUCSC <- function(gr) { track_line <- new("GraphTrackLine", type = "bedGraph", name = "bedGraph track", description = "Test", visibility = "full", alwaysZero = TRUE, gridDefault = FALSE, yLineMark = 10, windowingFunction = "mean", color = c(200L, 100L, 0L), altColor = c(0L, 100L, 200L), priority = 20) new("UCSCData", gr, trackLine = track_line) } correct_gr <- createCorrectGR(Seqinfo(c("chr19", "chr17", "chr18"))) correct_ucsc <- createCorrectUCSC(correct_gr) ## TEST: basic import test <- import(test_bg) checkIdentical(correct_ucsc, test) test <- import.bedGraph(test_bg) checkIdentical(correct_ucsc, test) test_bg_file <- BEDGraphFile(test_bg) checkException(import(test_bg_file, format = "wig")) test <- import(test_bg_file, format = "bedGraph") checkIdentical(correct_ucsc, test) test <- import(test_bg_file) checkIdentical(correct_ucsc, test) test_bg_con <- file(test_bg) test <- import(test_bg_con, format = "wig") checkIdentical(correct_ucsc, test) test_bg_con <- file(test_bg) test <- import(WIGFile(test_bg_con)) checkIdentical(correct_ucsc, test) ## TEST: 'genome' hg19_seqinfo <- SeqinfoForBSGenome("hg19") correct_genome <- createCorrectUCSC(createCorrectGR(hg19_seqinfo)) test <- import(test_bg, genome = "hg19") checkIdentical(correct_genome, test) ## TEST: trackLine = FALSE test <- import(test_bg, trackLine = FALSE) checkIdentical(correct_gr, test) ## TEST: which correct_which <- subsetByOverlaps(correct_ucsc, correct_gr[3:4]) test <- import(test_bg, which = correct_which) checkIdentical(correct_which, test) ## TEST: basic export test_bg_out <- file.path(tempdir(), "test.bedGraph") on.exit(unlink(test_bg_out)) export(correct_ucsc, test_bg_out) test <- import(test_bg_out) checkIdentical(correct_ucsc, test) export.bedGraph(correct_ucsc, test_bg_out) test <- import(test_bg_out) checkIdentical(correct_ucsc, test) test_foo_out <- file.path(tempdir(), "test.foo") export(correct_ucsc, test_foo_out, format = "bedGraph") on.exit(unlink(test_foo_out)) test <- import(test_bg_out) checkIdentical(correct_ucsc, test) test_bg_out_file <- BEDGraphFile(test_bg_out) export(correct_ucsc, test_bg_out_file) test <- import(test_bg_out) checkIdentical(correct_ucsc, test) checkException(export(correct_ucsc, test_bg_out_file, format = "gff")) ## TEST: append correct_ucsc2 <- initialize(correct_ucsc, trackLine = initialize(correct_ucsc@trackLine, name = "test2")) export(correct_ucsc2, test_bg_out_file, append = TRUE) test <- import(test_bg_out_file) correct_list <- GRangesList("bedGraph track" = correct_ucsc, test2 = correct_ucsc2, compress = FALSE) checkIdentical(correct_list, test) ## TEST: track line parameters export(correct_ucsc, test_bg_out, name = "test2") test <- import(test_bg_out) checkIdentical(correct_ucsc2, test) ## TEST: export trackLine export(correct_ucsc, test_bg_out, trackLine = FALSE) test <- import(test_bg_out) checkIdentical(test, correct_gr) ## TEST: SimpleGRangesList export(correct_list, test_bg_out) test <- import(test_bg_out) checkIdentical(correct_list, test) ## TEST: gzip test_bg_gz <- paste(test_bg_out, ".gz", sep = "") on.exit(unlink(test_bg_gz)) export(correct_ucsc, test_bg_gz) test <- import(test_bg_gz) checkIdentical(correct_ucsc, test) export(correct_ucsc2, test_bg_gz, append = TRUE) test <- import(test_bg_gz) checkIdentical(correct_list, test) ## TEST: Using connection to add comment header test_bg_con <- file(test_bg_out) open(test_bg_con, "w") comment <- "# test comment" writeLines(comment, test_bg_con) export(correct_ucsc, test_bg_con) close(test_bg_con) checkIdentical(comment, readLines(test_bg_out, n = 1)) test <- import(test_bg_out) checkIdentical(correct_ucsc, test) } rtracklayer/inst/unitTests/test_bw.R0000644000175100017510000000570014614231172020671 0ustar00biocbuildbiocbuildtest_bw <- function() { if (.Platform$OS.type == "windows") return() test_path <- system.file("tests", package = "rtracklayer") test_bw <- file.path(test_path, "test.bw") ir <- as(PartitioningByWidth(rep(300, 9)), "IRanges") space <- factor(c(rep("chr2", 5), rep("chr19", 4)), c("chr2", "chr19")) score <- seq(-1, 1, length = 9) correct_fixed <- GRanges(space, ir, score = score) si <- SeqinfoForBSGenome("hg19") seqlengths(correct_fixed) <- seqlengths(si)[levels(space)] test <- import(test_bw) checkIdentical(test, correct_fixed) test_bw_out <- file.path(tempdir(), "test_out.bw") export(correct_fixed, test_bw_out) on.exit(unlink(test_bw_out)) test <- import(test_bw_out) checkIdentical(test, correct_fixed) export.bw(correct_fixed, test_bw_out) test <- import.bw(test_bw_out) checkIdentical(test, correct_fixed) correct_bedgraph <- correct_fixed width(correct_bedgraph) <- seq(1, 300, length = 9) export(correct_bedgraph, test_bw_out) test <- import(test_bw_out) checkIdentical(test, correct_bedgraph) ## TEST: 'which' which <- GRanges(c("chr2", "chr2"), IRanges(c(1, 300), c(400, 1000))) correct_which <- subsetByOverlaps(correct_bedgraph, which) ranges(correct_which) <- ranges(intersect(correct_which, which)) test <- import(test_bw_out, which = which) checkIdentical(test, correct_which) ## TEST: BigWigSelection (range, no score) test <- import(test_bw_out, selection = BigWigSelection(which, colnames = character())) correct_which <- correct_which[, character()] checkIdentical(test, correct_which) ## TEST: empty which which <- GRanges() correct_which <- subsetByOverlaps(correct_bedgraph, which) test <- import(test_bw_out, which = which) checkIdentical(test, correct_which) ## TEST: non-UCSC naming correct_ncbi <- correct_bedgraph seqlevels(correct_ncbi) <- sub("chr", "", seqlevels(correct_ncbi)) export(correct_ncbi, test_bw_out) test <- import(test_bw_out) checkIdentical(test, correct_ncbi) ## TEST: as="RleList" correct_cov <- coverage(correct_ncbi, weight="score") test <- import(test_bw_out, as="RleList") checkIdentical(correct_cov, test) ## TEST: export RleList export(correct_cov, test_bw_out) test <- import(test_bw_out, as="RleList") checkIdentical(correct_cov, test) ## TEST: export/import NumericList correct_cov_short <- correct_cov[correct_cov != 0L] correct_int <- as(correct_cov_short, "NumericList") which <- GRanges(names(correct_int), IRanges(1, elementNROWS(correct_int))) names(which) <- names(correct_int) metadata(correct_int) <- list(ranges=which) export(correct_int, test_bw_out) test <- import(test_bw_out, as="NumericList") checkIdentical(correct_int, test) test <- import(test_bw_out, which=which[1], as="NumericList") checkIdentical(elementNROWS(correct_int[1]), elementNROWS(test)) test <- import(test_bw_out, which=which[1:2], as="NumericList") checkIdentical(correct_int, test) } rtracklayer/inst/unitTests/test_gff.R0000644000175100017510000002045014614231172021022 0ustar00biocbuildbiocbuildtest_gff <- function() { test_path <- system.file("tests", package = "rtracklayer") space <- c(rep("chr10", 15), rep("chr12", 16)) start <- c(rep(92828, 4), 92997, rep(94555, 4), rep(94744, 3), rep(95122, 2), 95348, rep(87984, 4), rep(c(88257, 88570, 88860, 89675, 90587, 90796), each = 2)) end <- c(95504, 95178, 95504, rep(94054, 2), rep(94665, 2), 94615, 94665, rep(94852, 3), rep(95178, 2), 95504, rep(c(91263, 88017, 88392, 88771, 89018, 89827, 90655, 91263), each = 2)) type <- c("gene", "mRNA", "mRNA", "exon", "CDS", "exon", "exon", "CDS", "CDS", "exon", "exon", "CDS", "exon", "CDS", "exon", "gene", "mRNA", "exon", "CDS", "exon", "CDS", "exon", "CDS", "exon", "CDS", "exon", "CDS", "exon", "CDS", "exon", "CDS") type <- factor(type, unique(type)) source <- factor("rtracklayer") phase <- NA_integer_ score <- c(5, rep(NA, length(type) - 1L)) strand <- strand(c(rep("-", 14), "*", rep("+", 15), "*")) Alias <- CharacterList(c(list(c("FLJ40100", "TUBB8")), rep(list(character()), 14), "LOC100288778", rep(list(character()), 15))) ID <- c("GeneID:347688", "873", "872", rep(NA, 12), "GeneID:100288778", "4644", rep(NA, 14)) Name <- c(rep("TUBB8", 3), rep(NA, 12), rep("LOC100288778", 2), rep(NA, 14)) Parent <- CharacterList(c(list(character()), rep("GeneID:347688", 2), rep(list(c("872", "873")), 2), rep(c("872", "873"), 3), rep("873", 3), "872", list(character()), "GeneID:100288778", rep("4644", 14))) geneName <- c("tubulin, beta 8", rep(NA, 14), "WAS protein family homolog 1; pseudogene", rep(NA, 15)) genome <- c("hg19", rep(NA, length(geneName) - 1)) correct_gff3 <- GRanges(space, IRanges(start, end), strand, source, type, score, phase, ID, Name, geneName, Alias, genome, Parent) seqinfo(correct_gff3) <- Seqinfo(c("chr10", "chr12")) correct_gff1 <- correct_gff3[,c("source", "type", "score", "phase")] correct_gff1$group <- as.factor(seqnames(correct_gff3)) correct_gff2 <- correct_gff3 toCSV <- function(x) { csv <- sapply(x, paste, collapse = ",") csv[nchar(csv) == 0] <- NA csv } correct_gff2$Alias <- toCSV(correct_gff2$Alias) correct_gff2$Parent <- toCSV(correct_gff2$Parent) ## TEST: basic GFF3 import test_gff3 <- file.path(test_path, "genes.gff3") test <- import(test_gff3) checkIdentical(correct_gff3, test) ## TEST: import.gff* test <- import.gff(test_gff3) checkIdentical(correct_gff3, test) test <- import.gff3(test_gff3) checkIdentical(correct_gff3, test) #suppressWarnings(test <- import.gff2(test_gff3)) #checkIdentical(correct_gff3, test) oldOpts <- options(warn = 2) checkException(import.gff2(test_gff3)) options(oldOpts) ## TEST: GFF(3)File test_gff_file <- GFF3File(test_gff3) test <- import(test_gff_file) checkIdentical(correct_gff3, test) test_gff_file <- GFFFile(test_gff3) test <- import(test_gff_file) checkIdentical(correct_gff3, test) test_gff_file <- GFFFile(test_gff3, version = "3") test <- import(test_gff_file) checkIdentical(correct_gff3, test) test_gff_file <- GFF2File(test_gff3) #suppressWarnings(test <- import(test_gff_file)) #checkIdentical(correct_gff3, test) oldOpts <- options(warn = 2) checkException(test <- import(test_gff_file)) options(oldOpts) ## TEST: 'gff' extension test_gff_out <- file.path(tempdir(), "genes.gff") on.exit(unlink(test_gff_out)) export(correct_gff3, test_gff_out) test <- import(test_gff_out) checkIdentical(test, correct_gff1) export(correct_gff3, test_gff_out, version = "1") test <- import(test_gff_out) checkIdentical(test, correct_gff1) export(correct_gff3, test_gff_out, version = "2") test <- import(test_gff_out) checkIdentical(test, correct_gff2) export(correct_gff3, test_gff_out, version = "3") test <- import(test_gff_out) checkIdentical(test, correct_gff3) test <- import(GFF3File(test_gff_out)) checkIdentical(test, correct_gff3) test <- import(GFFFile(test_gff_out)) checkIdentical(test, correct_gff3) test <- import(test_gff_out, version = "3") checkIdentical(test, correct_gff3) #suppressWarnings(test <- import(test_gff_out, version = "2")) #checkIdentical(test, correct_gff3) oldOpts <- options(warn = 2) checkException(test <- import(test_gff_out, version = "2")) options(oldOpts) ## TEST: 'gff2' extension test_gff2_out <- file.path(tempdir(), "genes.gff2") export(correct_gff3, test_gff2_out) test <- import(test_gff2_out) checkIdentical(test, correct_gff2) ## TEST: 'gff1' extension test_gff1_out <- file.path(tempdir(), "genes.gff1") export(correct_gff3, test_gff1_out) test <- import(test_gff1_out) checkIdentical(test, correct_gff1) ## TEST: 'format' argument test_gff_file <- GFF3File(test_gff3) test <- import(test_gff_file, format = "gff") checkIdentical(test, correct_gff3) test <- import(test_gff_file, format = "gff3") checkIdentical(test, correct_gff3) checkException(import(test_gff_file, format = "gff2")) checkException(import(test_gff_file, format = "bed")) ## TEST: 'genome' si_hg19 <- SeqinfoForBSGenome("hg19") correct_hg19 <- correct_gff3 seqlevels(correct_hg19) <- seqlevels(si_hg19) seqinfo(correct_hg19) <- si_hg19 test <- import(test_gff3, genome = "hg19") checkIdentical(test, correct_hg19) test_gff3_out <- file.path(tempdir(), "genes.gff3") on.exit(unlink(test_gff3_out)) correct_genome_hg19 <- correct_gff3 genome(correct_genome_hg19) <- "hg19" correct_genome_hg19 <- as(correct_genome_hg19, "GRanges") export(correct_genome_hg19, test_gff3_out) test <- import(test_gff3_out) checkIdentical(test, correct_hg19) ## TEST: colnames empty, colnames := "geneName" test <- import(test_gff3, colnames = character()) target <- correct_gff3[,character()] checkIdentical(target, test) test <- import(test_gff3, colnames = "geneName") target <- correct_gff3[,"geneName"] checkIdentical(target, test) ## TEST: import from connection test_gff_con <- file(test_gff_out) test <- import(test_gff_con, format = "gff") checkIdentical(correct_gff3, test) ## TEST: export to connection, with preceding comment test_gff_con <- file(test_gff_out) open(test_gff_con, "w") comment <- "# test comment" writeLines(comment, test_gff_con) export(correct_gff3, test_gff_con, version = "3") close(test_gff_con) checkIdentical(comment, readLines(test_gff_out, n = 1)) test <- import(test_gff_out) checkIdentical(correct_gff3, test) ## TEST: 'append' export(correct_gff3[seqnames(correct_gff3) == "chr10", ], test_gff3_out) export(correct_gff3[seqnames(correct_gff3) == "chr12", ], test_gff3_out, append = TRUE) test <- import(test_gff3_out) checkIdentical(correct_gff3, test) ## TEST: 'source' target <- correct_gff3 mcols(target)$source <- factor("test") export(correct_gff3, test_gff3_out, source = "test") test <- import(test_gff3_out) checkIdentical(target, test) ## TEST: 'which' which <- GRanges("chr10:90000-93000") which_target <- subsetByOverlaps(correct_gff3, which) test <- import(test_gff3, which = which) checkIdentical(which_target, test) ## TEST: 'index' export(correct_gff3, test_gff3_out, index = TRUE) test_gff_bgz <- paste(test_gff3_out, ".bgz", sep = "") on.exit(unlink(test_gff_bgz)) on.exit(unlink(paste(test_gff_bgz, ".tbi", sep = ""))) test <- import(test_gff_bgz, which = which) checkIdentical(which_target, test) ## TEST: SimpleGRangesList ucsc_data1 <- new("UCSCData", keepSeqlevels(correct_gff3, "chr10", pruning.mode="coarse"), trackLine = new("BasicTrackLine", name = "chr10")) ucsc_data2 <- new("UCSCData", keepSeqlevels(correct_gff3, "chr12", pruning.mode="coarse"), trackLine = new("BasicTrackLine", name = "chr12")) correct_grl <- GRangesList(ucsc_data1, ucsc_data2, compress=FALSE) mcols(correct_grl[[2]])$genome <- NULL names(correct_grl) <- seqlevels(correct_gff3) export(correct_grl, test_gff3_out) test <- import.ucsc(test_gff3_out) checkIdentical(correct_grl, test) } rtracklayer/inst/unitTests/test_trackhub.R0000644000175100017510000001026314614231172022064 0ustar00biocbuildbiocbuildtest_trackhub <- function() { test_trackhub_path <- system.file("tests", "trackhub", package = "rtracklayer") correct_trackhub_uri <- test_trackhub_path correct_trackhub_genome <- "hg19" correct_trackhub_length <- 1L correct_hub <- "test_hub" correct_shortLabel <- "test_hub" correct_longLabel <- "test_hub" correct_genomesFile <- "genomes.txt" correct_email <- "user@domain.com" correct_descriptionUrl <- "http://www.somedomain.com/articles/h19" correct_trackDb <- "hg19/trackDb.txt" ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### TEST TrackHub Class ### th <- TrackHub(test_trackhub_path) ## TEST: uri checkIdentical(uri(th), correct_trackhub_uri) ## TEST: genome checkIdentical(genome(th), correct_trackhub_genome) ## TEST: length checkIdentical(length(th), correct_trackhub_length) # TEST: hub checkIdentical(hub(th), correct_hub) # TEST: shortLabel checkIdentical(shortLabel(th), correct_shortLabel) # TEST: longLabel checkIdentical(longLabel(th), correct_longLabel) # TEST: genomesFile checkIdentical(genomesFile(th), correct_genomesFile) # TEST: email checkIdentical(email(th), correct_email) # TEST: descriptionUrl checkIdentical(descriptionUrl(th), correct_descriptionUrl) # TEST: hub<- new_hub <- "new_hub" hub(th) <- new_hub checkIdentical(hub(th), new_hub) hub(th) <- correct_hub # TEST: shortLabel<- new_shortLabel <- "new_hub" shortLabel(th) <- new_shortLabel checkIdentical(shortLabel(th), new_shortLabel) shortLabel(th) <- correct_shortLabel # TEST: longLabel<- new_longLabel <- "new_hub" longLabel(th) <- new_longLabel checkIdentical(longLabel(th), new_longLabel) longLabel(th) <- correct_longLabel # TEST: genomesFile<- new_genomesFile <- "newfile.txt" genomesFile(th) <- new_genomesFile checkIdentical(genomesFile(th), new_genomesFile) genomesFile(th) <- correct_genomesFile # TEST: email<- new_email <- "new@domail.com" email(th) <- new_email checkIdentical(email(th), new_email) email(th) <- correct_email # TEST: descriptionUrl<- new_descriptionUrl <- "http://newdomail.com/articles/hg19" descriptionUrl(th) <- new_descriptionUrl checkIdentical(descriptionUrl(th), new_descriptionUrl) descriptionUrl(th) <- correct_descriptionUrl # TEST: genomeField checkIdentical(genomeField(th, "hg19", "trackDb"), correct_trackDb) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### TEST TrackHubGenome Class ### correct_trackhubgenome_uri <- paste0(correct_trackhub_uri, "/hg19") correct_trackhubgenome_genome_name <- "hg19" correct_trackhubgenome_length <- 1L correct_trackhubgenome_organism <- "BigFoot" correct_trackhubgenome_names <- "wgEncodeUWDukeDnaseGM12878FdrPeaks" correct_bigDataUrl <- "hg19/wgEncodeUWDukeDnaseGM12878.fdr01peaks.hg19.bb" thg <- TrackHubGenome(th, "hg19") # TEST: uri checkIdentical(uri(thg), correct_trackhubgenome_uri) # TEST: genome checkIdentical(genome(thg), correct_trackhubgenome_genome_name) # TEST: length checkIdentical(length(thg), correct_trackhubgenome_length) # TEST: organism checkIdentical(organism(thg), correct_trackhubgenome_organism) # TEST: names checkIdentical(names(thg), correct_trackhubgenome_names) # TEST: trackNames checkIdentical(trackNames(thg), correct_trackhubgenome_names) # TEST: trackField checkIdentical(trackField(thg, "wgEncodeUWDukeDnaseGM12878FdrPeaks", "bigDataUrl"), correct_bigDataUrl) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### TEST TrackContainer Class ### correct_slot_type <- "Track" correct_track <- Track(track = "tcell", bigDataUrl = "tcell/data.bigWig") # TEST: slot type tc <- TrackContainer() slot_type <- slot(tc, "elementType") checkIdentical(slot_type, correct_slot_type) # TEST: wrong type slot error reporting checkException(tc[[1]] <- 1) # TEST: names() tc[[1]] <- correct_track checkIdentical(names(tc), correct_track@track) } rtracklayer/inst/unitTests/test_twoBit.R0000644000175100017510000000440314614231172021530 0ustar00biocbuildbiocbuildtest_twoBit <- function() { test_path <- system.file("tests", package = "rtracklayer") test_2bit <- file.path(test_path, "test.2bit") correct_name <- "gi|157704452|ref|AC_000143.1|" correct_seq <- "TGATGGAAGAATTATTTGAAAGCCATATAGAATGAAATGACTCTATACCCAAATTAAAACTCAAAAACTTACTCAAAATAGTCCAGAGACTACAACTTCA" correct_char <- setNames(correct_seq, correct_name) correct_2bit <- Biostrings::DNAStringSet(correct_char) ## TEST: basic import test <- import(test_2bit) checkIdentical(test, correct_2bit) ## TEST: basic export, import test_2bit_out <- file.path(tempdir(), "test_out.2bit") export(correct_2bit, test_2bit_out) on.exit(unlink(test_2bit_out)) test <- import(test_2bit_out) checkIdentical(test, correct_2bit) ## TEST: twoBit extension test_twoBit_out <- file.path(tempdir(), "test_out.twoBit") export(correct_2bit, test_twoBit_out) on.exit(unlink(test_twoBit_out)) test <- import(test_twoBit_out) checkIdentical(test, correct_2bit) ## TEST: character export export(correct_char, test_2bit_out) test <- import(test_2bit_out) checkIdentical(test, correct_2bit) ## TEST: 'which' which_range <- IRanges(c(10, 40), c(30, 42)) correct_which <- correct_2bit[[1]][which_range] which <- GRanges(names(correct_2bit), which_range) test <- import(test_2bit_out, which = which) checkIdentical(unlist(test), correct_which) ## TEST: getSeq() with negative strand which rc_which <- which strand(rc_which)[1L] <- "-" test <- getSeq(TwoBitFile(test_2bit_out), which = rc_which) rc_correct_which <- correct_which rc_correct_which[1L] <- Biostrings::reverseComplement(rc_correct_which[1L]) checkIdentical(unlist(test), rc_correct_which) ## TEST: empty which which_range <- IRanges() correct_which <- Biostrings::DNAStringSet() which <- GRanges(character(), which_range) test <- import(test_2bit_out, which = which) checkIdentical(as.character(test), as.character(correct_which)) ## TEST: which with empty range which_range <- IRanges(1, 0) which <- GRanges(names(correct_2bit), which_range) test <- import(test_2bit_out, which = which) checkIdentical(unlist(correct_which), unlist(test)) ## TEST: invalid characters invalid_2bit <- paste0(correct_char, "L") checkException(export(invalid_2bit, test_2bit_out)) } rtracklayer/inst/unitTests/test_ucsc.R0000644000175100017510000001076714614231172021227 0ustar00biocbuildbiocbuildtest_ucsc <- function(x) { ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### TEST ucscTableQuery Class ### genome <- "hg38" table_name <- "gold" full_range <- as(Seqinfo(genome = genome), "GRanges") custom_range <- GRangesForUCSCGenome(genome, "chr1", IRanges(67003232, 67132477)) selected_table <- data.frame(bin = 963, chrom = "chr5", chromStart = 49656261, chromEnd = 49661871, ix = 804, type ="W", frag="ABBA01004242.1", fragStart = 0, fragEnd = 5610, strand = "+") # creating a track and a table for UCSCSession and genome identifier elementMetadata <- list(bin = 0, ix = 1060, type = "F", frag = "AL133320.8", fragStart = 2000, fragEnd = 131245) track <- GRanges("chr1", IRanges(67003232, 67132477), "+", elementMetadata) genome(track) <- genome table <- data.frame(bin = 0, chrom = "chr1", chromStart = 67003232, chromEnd = 67132477, ix = 1060, type = "F", frag = "AL133320.8", fragStart = 2000, fragEnd = 131245,strand = "+") test_trackhub_path <- system.file("tests", "trackhub", package = "rtracklayer") trackhub_genome <- "hg19" trackhub_custom_range <- GRangesForUCSCGenome("hg19", "chr1", IRanges(237640, 237791)) trackhub_full_range <- as(Seqinfo(genome = trackhub_genome), "GRanges") trackhub_table_name <- "wgEncodeUWDukeDnaseGM12878FdrPeaks" # creating a track for Track Hub start <- c(237640, 521500 ,565725, 565900, 566760, 119905, 122525, 173925, 179865, 180185) ir <- IRanges(start, width = 151) space <- factor(c(rep("chr1", 5), rep("chr10", 5))) name <- rep(".", 10) score <- seq.int(70L, 700L, length = 10) signalValue <- seq(10, 100, length = 10) peak <- rep(-1L, 10) trackhub_track <- GRanges(space, ir, name = name, score = score, signalValue = signalValue , peak = peak) si <- Seqinfo(genome = "hg19") seqlengths(trackhub_track) <- seqlengths(si)[levels(space)] ## TEST: ucscTableQuery with UCSCSession with NAMES selection session <- browserSession() genome(session) <- "hg38" query <- ucscTableQuery(session, table = table_name, names = "ABBA01004242.1") checkIdentical(range(query), full_range) checkIdentical(getTable(query), selected_table) ## TEST: ucscTableQuery with UCSCSession without any custom range selection query <- ucscTableQuery(session, table = table_name) checkIdentical(range(query), full_range) ## TEST: ucscTableQuery with UCSCSession with custom range selection query <- ucscTableQuery(session, table = table_name, range = custom_range) checkIdentical(range(query), custom_range) ## TEST: ucscTableQuery with genome idenetifer(character) without any custom range selection query <- ucscTableQuery(genome, table = table_name) checkIdentical(genome(query), genome) checkIdentical(tableName(query), table_name) checkIdentical(range(query), full_range) ## TEST: ucscTableQuery with genome idenetifer(character) with custom range selection query <- ucscTableQuery(genome, table = table_name, range = custom_range) checkIdentical(genome(query), genome) checkIdentical(tableName(query), table_name) checkIdentical(range(query), custom_range) checkIdentical(track(query), track) checkIdentical(getTable(query), table) if (.Platform$OS.type == "windows") return() ## TEST: ucscTableQuery with Track Hub(character) without any custom range selection query <- ucscTableQuery(test_trackhub_path, table = trackhub_table_name, genome = trackhub_genome) checkIdentical(genome(query), trackhub_genome) checkIdentical(tableName(query), trackhub_table_name) checkIdentical(range(query), trackhub_full_range) checkIdentical(track(query), trackhub_track) checkIdentical(getTable(query), as.data.frame(trackhub_track)) ## TEST: ucscTableQuery with Track Hub(character) with custom range selection query <- ucscTableQuery(test_trackhub_path, table = trackhub_table_name, genome = trackhub_genome, range = trackhub_custom_range) checkIdentical(genome(query), trackhub_genome) checkIdentical(tableName(query), trackhub_table_name) checkIdentical(range(query), trackhub_custom_range) checkIdentical(track(query), trackhub_track[1]) checkIdentical(getTable(query), as.data.frame(trackhub_track)[1,]) } rtracklayer/inst/unitTests/test_wig.R0000644000175100017510000001302514614231172021046 0ustar00biocbuildbiocbuildtest_wig <- function() { test_path <- system.file("tests", package = "rtracklayer") test_wig <- file.path(test_path, "step.wig") createCorrectGR <- function(si) { score <- c(seq(10, 20, by = 2.5), seq(17.5, 10, by = -2.5), seq(1000, 100, by = -100)) start <- c(59104701 + cumsum(c(0, 200, 500, 200, 300, 180, 220, 390, 1180)), 59108021 + cumsum(c(0, rep(300, 9)))) width <- c(rep(1, 9), rep(200, 10)) space <- factor(c(rep("chr19", 9), rep("chr18", 10)), seqlevels(si)) correct_gr <- GRanges(space, IRanges(start, width = width), score = score) if (!any(is.na(genome(si)))) genome(correct_gr) <- unname(genome(si)[1]) seqinfo(correct_gr) <- si correct_gr } createCorrectUCSC <- function(gr) { track_line <- new("GraphTrackLine", type = "wig", name = "test", description = "test track", visibility = "full", autoScale = FALSE, viewLimits = c(0, 1000), color = c(0L, 200L, 100L), maxHeightPixels = c(100L, 50L, 20L), graphType = "points", priority = 30) new("UCSCData", gr, trackLine = track_line) } correct_gr <- createCorrectGR(Seqinfo(c("chr19", "chr18"))) correct_ucsc <- createCorrectUCSC(correct_gr) ## TEST: basic import test <- import(test_wig) checkIdentical(correct_ucsc, test) test <- import.wig(test_wig) checkIdentical(correct_ucsc, test) test_wig_file <- WIGFile(test_wig) checkException(import(test_wig_file, format = "bed")) test <- import(test_wig_file, format = "wig") checkIdentical(correct_ucsc, test) test <- import(test_wig_file) checkIdentical(correct_ucsc, test) test_wig_con <- file(test_wig) test <- import(test_wig_con, format = "wig") checkIdentical(correct_ucsc, test) test_wig_con <- file(test_wig) test <- import(WIGFile(test_wig_con)) checkIdentical(correct_ucsc, test) ## TEST: 'genome' hg19_seqinfo <- SeqinfoForBSGenome("hg19") correct_genome <- createCorrectUCSC(createCorrectGR(hg19_seqinfo)) test <- import(test_wig, genome = "hg19") checkIdentical(correct_genome, test) ## TEST: trackLine = FALSE test <- import(test_wig, trackLine = FALSE) checkIdentical(correct_gr, test) ## TEST: which which <- correct_gr[3:4] correct_which <- subsetByOverlaps(correct_ucsc, which) test <- import(test_wig, which = which) checkIdentical(correct_which, test) ## TEST: basic export test_wig_out <- file.path(tempdir(), "test.wig") on.exit(unlink(test_wig_out)) export(correct_ucsc, test_wig_out) test <- import(test_wig_out) checkIdentical(correct_ucsc, test) export.wig(correct_ucsc, test_wig_out) test <- import(test_wig_out) checkIdentical(correct_ucsc, test) test_foo_out <- file.path(tempdir(), "test.foo") export(correct_ucsc, test_foo_out, format = "wig") on.exit(unlink(test_foo_out)) test <- import(test_wig_out) checkIdentical(correct_ucsc, test) test_wig_out_file <- WIGFile(test_wig_out) export(correct_ucsc, test_wig_out_file) test <- import(test_wig_out) checkIdentical(correct_ucsc, test) checkException(export(correct_ucsc, test_wig_out_file, format = "gff")) ## TEST: append correct_ucsc2 <- initialize(correct_ucsc, trackLine = initialize(correct_ucsc@trackLine, name = "test2")) export(correct_ucsc2, test_wig_out_file, append = TRUE) test <- import(test_wig_out_file) correct_list <- GRangesList(test = correct_ucsc, test2 = correct_ucsc2, compress = FALSE) checkIdentical(correct_list, test) ## TEST: track line parameters export(correct_ucsc, test_wig_out, name = "test2") test <- import(test_wig_out) checkIdentical(correct_ucsc2, test) ## TEST: export trackLine export(correct_ucsc, test_wig_out, trackLine = FALSE) test <- import(test_wig_out) checkIdentical(test, correct_gr) ## TEST: Plain GRanges / bedGraph export.ucsc(correct_gr, test_wig_out) # mixture of steps leads to bedGraph test <- import(test_wig_out) default_line <- new("GraphTrackLine", name = "R Track", type = "bedGraph") correct_default <- new("UCSCData", correct_gr, trackLine = default_line) checkIdentical(test, correct_default) correct_chr18 <- keepSeqlevels(correct_gr, "chr18", pruning.mode="coarse") export.ucsc(correct_chr18, test_wig_out) test <- import(test_wig_out) default_line <- new("GraphTrackLine", name = "R Track", type = "wig") correct_default <- new("UCSCData", keepSeqlevels(correct_gr, "chr18", pruning.mode="coarse"), trackLine = default_line) checkIdentical(test, correct_default) ## TEST: GenomicRangesList export(correct_list, test_wig_out) test <- import(test_wig_out) checkIdentical(correct_list, test) ## TEST: gzip test_wig_gz <- paste(test_wig_out, ".gz", sep = "") on.exit(unlink(test_wig_gz)) export(correct_ucsc, test_wig_gz) test <- import(test_wig_gz) checkIdentical(correct_ucsc, test) export(correct_ucsc2, test_wig_gz, append = TRUE) test <- import(test_wig_gz) checkIdentical(correct_list, test) ## TEST: Using connection to add comment header test_wig_con <- file(test_wig_out) open(test_wig_con, "w") comment <- "# test comment" writeLines(comment, test_wig_con) export(correct_ucsc, test_wig_con) close(test_wig_con) checkIdentical(comment, readLines(test_wig_out, n = 1)) test <- import(test_wig_out) checkIdentical(correct_ucsc, test) } rtracklayer/INSTALL0000644000175100017510000000037314614231172015152 0ustar00biocbuildbiocbuildThe rtracklayer package can use openssl for accessing https URLs when e.g. importing BigWig files. One can set the OPENSSL_LIBS and OPENSSL_CFLAGS environment variables for specifying the relevant linker and preprocessor/compiler flags, respectively. rtracklayer/LICENSE0000644000175100017510000000067714614231172015135 0ustar00biocbuildbiocbuildThe contents of "src/ucsc" fall under the license below. Note that the "src/lib", "src/inc" and "src/utils" refer to directories within the original Kent source tree. In rtracklayer, the files are all under "src/ucsc". All files are copyrighted, but license is hereby granted for personal, academic, and non-profit use. A license is also granted for the contents of the src/lib, src/inc and src/utils and python directories for commercial users.rtracklayer/man/0000755000175100017510000000000014614231172014671 5ustar00biocbuildbiocbuildrtracklayer/man/activeView-methods.Rd0000644000175100017510000000124314614231172020727 0ustar00biocbuildbiocbuild\name{activeView-methods} \docType{methods} \alias{activeView} \alias{activeView<-} \alias{activeView-methods} \alias{activeView<--methods} \alias{activeView,BrowserSession-method} \alias{activeView,UCSCView-method} \title{Accessing the active view} \description{ Get the active view. } \section{Methods}{ The following methods are defined by \pkg{rtracklayer}. \describe{ \item{object = "BrowserSession"}{ \code{activeView(object)}: Gets the active \code{\linkS4class{BrowserView}} from a browser session. \code{activeView(object) <- value}: Sets the active \code{\linkS4class{BrowserView}} in a browser session. } }} \keyword{methods} rtracklayer/man/asBED.Rd0000644000175100017510000000243614614231172016103 0ustar00biocbuildbiocbuild\name{asBED} \alias{asBED} \alias{asBED,GRangesList-method} \alias{asBED,GAlignments-method} \title{Coerce to BED structure} \description{ Coerce the structure of an object to one following BED-like conventions, i.e., with columns for blocks and thick regions. } \usage{ asBED(x, ...) \S4method{asBED}{GRangesList}(x) \S4method{asBED}{GAlignments}(x) } \arguments{ \item{x}{ Generally, a tabular object to structure as BED } \item{\dots}{ Arguments to pass to methods } } \details{ The exact behavior depends on the class of \code{object}. \describe{ \item{\code{GRangesList}}{This treats \code{object} as if it were a list of transcripts, i.e., each element contains the exons of a transcript. The \code{blockStarts} and \code{blockSizes} columns are derived from the ranges in each element. Also, add \code{name} column from \code{names(object)}. } \item{\code{GAlignments}}{Converts to GRangesList via \code{grglist} and procedes accordingly. } } } \value{ A \code{GRanges}, with the columns \code{name}, \code{blockStarts} and \code{blockSizes} added. } \author{ Michael Lawrence } \examples{ \dontrun{ library(TxDb.Hsapiens.UCSC.hg19.knownGene) exons <- exonsBy(TxDb_Hsapiens_UCSC_hg19_knownGene) mcols(asBED(exons)) } } rtracklayer/man/asGFF.Rd0000644000175100017510000000243714614231172016114 0ustar00biocbuildbiocbuild\name{asGFF} \alias{asGFF} \alias{asGFF,GRangesList-method} \title{Coerce to GFF structure} \description{ Coerce the structure of an object to one following GFF-like conventions, i.e., using the \code{Parent} GFF3 attribute to encode the hierarchical structure. This object is then suitable for export as GFF3. } \usage{ asGFF(x, ...) \S4method{asGFF}{GRangesList}(x, parentType = "mRNA", childType = "exon") } \arguments{ \item{x}{ Generally, a tabular object to structure as GFF(3) } \item{parentType}{The value to store in the \code{type} column for the top-level (e.g., transcript) ranges. } \item{childType}{The value to store in the \code{type} column for the child (e.g., exon) ranges. } \item{\dots}{ Arguments to pass to methods } } \value{ For the \code{GRangesList} method: A \code{GRanges}, with the columns: \code{ID} (unique identifier), \code{Name} (from \code{names(x)}, and the names on each element of \code{x}, if any), \code{type} (as given by \code{parentType} and \code{childType}), and \code{Parent} (to relate each child range to its parent at the top-level). } \author{ Michael Lawrence } \examples{ \dontrun{ library(TxDb.Hsapiens.UCSC.hg19.knownGene) exons <- exonsBy(TxDb_Hsapiens_UCSC_hg19_knownGene) mcols(asGFF(exons)) } } rtracklayer/man/BamFile-methods.Rd0000644000175100017510000000445214614231172020125 0ustar00biocbuildbiocbuild\name{BamFile-methods} \alias{export,ANY,BamFile,ANY-method} \alias{export,GAlignments,BamFile,ANY-method} \alias{export,GAlignmentPairs,BamFile,ANY-method} \alias{import,BamFile,ANY,ANY-method} \title{Export to BAM Files} \description{ Methods for import and export of \code{\link[GenomicAlignments]{GAlignments}} or \code{\link[GenomicAlignments]{GAlignmentPairs}} objects from and to BAM files, represented as \code{\link[Rsamtools]{BamFile}} objects. } \usage{ \S4method{import}{BamFile,ANY,ANY}(con, format, text, paired = FALSE, use.names = FALSE, param = ScanBamParam(...), genome = NA_character_, ...) \S4method{export}{ANY,BamFile,ANY}(object, con, format, ...) } \arguments{ \item{object}{The object to export, such as a \code{GAlignments} or \code{GAlignmentPairs}. } \item{con}{A path, URL, connection or \code{BamFile} object.} \item{format}{If not missing, should be \dQuote{bam}.} \item{text}{Not supported.} \item{paired}{If \code{TRUE}, return a GAlignmentPairs object, otherwise a GAlignments. } \item{use.names}{Whether to parse QNAME as the names on the result.} \item{param}{The \code{\link[Rsamtools]{ScanBamParam}} object governing the import. } \item{genome}{Single string or \code{Seqinfo} object identifying the genome} \item{\dots}{Arguments that are passed to \code{ScanBamParam} if \code{param} is missing. } } \details{ BAM fields not formally present in the \code{GAlignments[Pairs]} object are extracted from the metadata columns, if present; otherwise, the missing value, \dQuote{"."}, is output. The file is sorted and indexed. This can be useful for subsetting BAM files, although \code{\link[Rsamtools]{filterBam}} may eventually become flexible enough to be the favored alternative. } \seealso{ The \code{\link[GenomicAlignments]{readGAlignments}} and \code{\link[GenomicAlignments]{readGAlignmentPairs}} functions for reading BAM files. } \examples{ library(Rsamtools) ex1_file <- system.file("extdata", "ex1.bam", package="Rsamtools") gal <- import(ex1_file, param=ScanBamParam(what="flag")) gal.minus <- gal[strand(gal) == "-"] \dontrun{ export(gal, BamFile("ex1-minus.bam")) } } \author{Michael Lawrence} rtracklayer/man/basicTrackLine-class.Rd0000644000175100017510000000561314614231172021146 0ustar00biocbuildbiocbuild\name{BasicTrackLine-class} \docType{class} \alias{BasicTrackLine-class} \alias{coerce,character,BasicTrackLine-method} \alias{coerce,BasicTrackLine,character-method} \title{Class "BasicTrackLine"} \description{The type of \acronym{UCSC} track line used to annotate most types of tracks (every type except Wiggle).} \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("BasicTrackLine", ...)} or parsed from a character vector track line with \code{as(text, "BasicTrackLine")} or converted from a \code{\linkS4class{GraphTrackLine}} using \code{as(wig, "BasicTrackLine")}. } \section{Slots}{ \describe{ \item{\code{itemRgb}:}{Object of class \code{"logical"} indicating whether each feature in a track uploaded as \acronym{BED} should be drawn in its specified color. } \item{\code{useScore}:}{Object of class \code{"logical"} indicating whether the data value should be mapped to color. } \item{\code{group}:}{Object of class \code{"character"} naming a group to which this track should belong. } \item{\code{db}:}{Object of class \code{"character"} indicating the associated genome assembly. } \item{\code{offset}:}{Object of class \code{"numeric"}, a number added to all positions in the track. } \item{\code{url}:}{Object of class \code{"character"} referring to additional information about this track. } \item{\code{htmlUrl}:}{Object of class \code{"character"} referring to an \acronym{HTML} page to be displayed with this track. } \item{\code{name}:}{Object of class \code{"character"} specifying the name of the track. } \item{\code{description}:}{Object of class \code{"character"} describing the track. } \item{\code{visibility}:}{Object of class \code{"character"} indicating the default visible mode of the track, see \code{\linkS4class{UCSCTrackModes}}.} \item{\code{color}:}{Object of class \code{"integer"} representing the track color (as from \code{\link{col2rgb}}). } \item{\code{colorByStrand}:}{Object of class \code{"matrix"} with two columns, as from \code{col2rgb}. The two colors indicate the color for each strand (positive, negative). } \item{\code{priority}:}{Object of class \code{"numeric"} specifying the rank of the track. } } } \section{Extends}{ Class \code{"\linkS4class{TrackLine}"}, directly. } \section{Methods}{ \describe{ \item{as(object, "character")}{Export line to its string representation.} \item{as(object, \code{"\linkS4class{GraphTrackLine}"})}{Convert this line to a graph track line, using defaults for slots not held in common.} } } \references{ \url{https://genome.ucsc.edu/goldenPath/help/customTrack.html#TRACK} for the official documentation. } \author{ Michael Lawrence } \seealso{ \code{\linkS4class{GraphTrackLine}} for Wiggle/bedGraph tracks. } \keyword{classes} rtracklayer/man/Bed15TrackLine-class.Rd0000644000175100017510000000361014614231172020720 0ustar00biocbuildbiocbuild\name{Bed15TrackLine-class} \docType{class} \alias{Bed15TrackLine-class} \alias{coerce,character,Bed15TrackLine-method} \alias{coerce,Bed15TrackLine,character-method} \title{Class "Bed15TrackLine"} \description{ A \acronym{UCSC} track line for graphical tracks. } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("Bed15TrackLine", ...)} or parsed from a character vector track line with \code{as(text, "Bed15TrackLine")}. } \section{Slots}{ \describe{ \item{\code{expStep}:}{A \code{"numeric"} scalar indicating the step size for the heatmap color gradient.} \item{\code{expScale}:}{A positive \code{"numeric"} scalar indicating the range of the data to be \code{[-expScale, expScale]} for determining the heatmap color gradient.} \item{\code{expNames}:}{A \code{"character"} vector naming the the experimental samples.} \item{\code{name}:}{Object of class \code{"character"} specifying the name of the track. } \item{\code{description}:}{Object of class \code{"character"} describing the track. } \item{\code{visibility}:}{Object of class \code{"character"} indicating the default visible mode of the track, see \code{\linkS4class{UCSCTrackModes}}.} \item{\code{color}:}{Object of class \code{"integer"} representing the track color (as from \code{\link{col2rgb}}). } \item{\code{priority}:}{Object of class \code{"numeric"} specifying the rank of this track. } } } \section{Extends}{ Class \code{"\linkS4class{TrackLine}"}, directly. } \section{Methods}{ \describe{ \item{as(object, "character")}{Export line to its string representation.} } } \references{ Official documentation: \url{https://genomewiki.ucsc.edu/index.php/Microarray_track}. } \author{ Michael Lawrence } \seealso{ \code{\link{export.bed15}} for exporting bed15 tracks. } \keyword{classes} rtracklayer/man/BEDFile-class.Rd0000644000175100017510000003201414614231172017455 0ustar00biocbuildbiocbuild\name{BEDFile-class} \docType{class} %% Classes: \alias{class:BEDFile} \alias{class:BED15File} \alias{class:BEDGraphFile} \alias{class:NarrowPeakFile} \alias{class:BroadPeakFile} \alias{BEDFile-class} \alias{BED15File-class} \alias{BEDGraphFile-class} \alias{BEDPEFile-class} \alias{NarrowPeakFile-class} \alias{BroadPeakFile-class} %% Constructor: \alias{BEDFile} \alias{BED15File} \alias{BEDGraphFile} \alias{BEDPEFile} \alias{NarrowPeakFile} \alias{BroadPeakFile} %% Import: \alias{import,BEDFile,ANY,ANY-method} \alias{import,BED15File,ANY,ANY-method} \alias{import,BEDPEFile,ANY,ANY-method} \alias{import,NarrowPeakFile,ANY-method} \alias{import,BroadPeakFile,ANY-method} \alias{import,NarrowPeakFile,ANY,ANY-method} \alias{import,BroadPeakFile,ANY,ANY-method} \alias{import.bed} \alias{import.bed,ANY-method} \alias{import.bed15} \alias{import.bed15,ANY-method} \alias{import.bedGraph} \alias{import.bedGraph,ANY-method} \alias{import.NarrowPeak} \alias{import.NarrowPeak,ANY-method} \alias{import.BroadPeak} \alias{import.BroadPeak,ANY-method} %% Export: \alias{export,ANY,BEDFile,ANY-method} \alias{export,GenomicRanges,BEDFile,ANY-method} \alias{export,GRangesList,BEDFile,ANY-method} \alias{export,GenomicRangesList,BEDFile,ANY-method} \alias{export,UCSCData,BEDFile,ANY-method} \alias{export,GenomicRanges,BED15File,ANY-method} \alias{export,ANY,BEDPEFile,ANY-method} \alias{export,Pairs,BEDPEFile,ANY-method} \alias{export,UCSCData,BED15File,ANY-method} \alias{export.bed} \alias{export.bed,ANY-method} \alias{export.bed15} \alias{export.bed15,ANY-method} \alias{export.bedGraph} \alias{export.bedGraph,ANY-method} \title{BEDFile objects} \description{ These functions support the import and export of the UCSC BED format and its variants, including BEDGraph. } \usage{ \S4method{import}{BEDFile,ANY,ANY}(con, format, text, trackLine = TRUE, genome = NA, colnames = NULL, which = NULL, seqinfo = NULL, extraCols = character(), sep = c("\t", ""), na.strings=character(0L)) import.bed(con, ...) import.bed15(con, ...) import.bedGraph(con, ...) \S4method{export}{ANY,BEDFile,ANY}(object, con, format, ...) \S4method{export}{GenomicRanges,BEDFile,ANY}(object, con, format, append = FALSE, index = FALSE, ignore.strand = FALSE, trackLine = NULL) \S4method{export}{UCSCData,BEDFile,ANY}(object, con, format, trackLine = TRUE, ...) export.bed(object, con, ...) export.bed15(object, con, ...) \S4method{export}{GenomicRanges,BED15File,ANY}(object, con, format, expNames = NULL, trackLine = NULL, ...) export.bedGraph(object, con, ...) } \arguments{ \item{con}{A path, URL, connection or \code{BEDFile} object. For the functions ending in \code{.bed}, \code{.bedGraph} and \code{.bed15}, the file format is indicated by the function name. For the base \code{export} and \code{import} functions, the format must be indicated another way. If \code{con} is a path, URL or connection, either the file extension or the \code{format} argument needs to be one of \dQuote{bed}, \dQuote{bed15}, \dQuote{bedGraph}, \dQuote{bedpe}, \dQuote{narrowPeak}, or \dQuote{broadPeak}. Compressed files (\dQuote{gz}, \dQuote{bz2} and \dQuote{xz}) are handled transparently. } \item{object}{The object to export, should be a \code{GRanges} or something coercible to a \code{GRanges}. If targeting the BEDPE format, this should be something coercible to \code{Pairs}. If the object has a method for \code{asBED} (like \code{GRangesList}), it is called prior to coercion. This makes it possible to export a \code{GRangesList} or \code{TxDb} in a way that preserves the hierarchical structure. For exporting multiple tracks, in the UCSC track line metaformat, pass a \code{GenomicRangesList}, or something coercible to one. } \item{format}{If not missing, should be one of \dQuote{bed}, \dQuote{bed15}, \dQuote{bedGraph}, \dQuote{bedpe}, \dQuote{narrowPeak} or \dQuote{broadPeak}.} \item{text}{If \code{con} is missing, a character vector to use as the input} \item{trackLine}{For import, an imported track line will be stored in a \code{\linkS4class{TrackLine}} object, as part of the returned \code{\linkS4class{UCSCData}}. For the UCSCData method on export, whether to output the UCSC track line stored on the object, for the other export methods, the actual TrackLine object to export. } \item{genome}{The identifier of a genome, or a \code{Seqinfo}, or \code{NA} if unknown. Typically, this is a UCSC identifier like \dQuote{hg19}. An attempt will be made to derive the \code{seqinfo} on the return value using either an installed BSgenome package or UCSC, if network access is available. } \item{colnames}{A character vector naming the columns to parse. These should name columns in the result, not those in the BED spec, so e.g. specify \dQuote{thick}, instead of \dQuote{thickStart}. } \item{which}{A \code{GRanges} or other range-based object supported by \code{\link[IRanges]{findOverlaps}}. Only the intervals in the file overlapping the given ranges are returned. This is much more efficient when the file is indexed with the tabix utility. } \item{index}{If \code{TRUE}, automatically compress and index the output file with bgzf and tabix. Note that tabix indexing will sort the data by chromosome and start. Tabix supports a single track in a file. } \item{ignore.strand}{Whether to output the strand when not required (by the existence of later fields). } \item{seqinfo}{If not \code{NULL}, the \code{Seqinfo} object to set on the result. Ignored if \code{genome} is a \code{Seqinfo} object. If the \code{genome} argument is not \code{NA}, it must agree with \code{genome(seqinfo)}. } \item{extraCols}{A character vector in the same form as \code{colClasses} from \code{\link{read.table}}. It should indicate the name and class of each extra/special column to read from the BED file. As BED does not encode column names, these are assumed to be the last columns in the file. This enables parsing of the various BEDX+Y formats. } \item{sep}{A character vector with a single character indicating the field separator, like \code{read.table}. This defaults to \code{"\t"}, as BEDtools requires, but BED files are also allowed to be whitespace separated (\code{""}) according to the UCSC spec. } \item{na.strings}{Character vector with strings, appended to the standard \code{"."}, that represent an \code{NA} value. } \item{append}{If \code{TRUE}, and \code{con} points to a file path, the data is appended to the file. Obviously, if \code{con} is a connection, the data is always appended. } \item{expNames}{character vector naming columns in \code{mcols(object)} to export as data columns in the BED15 file. These correspond to the sample names in the experiment. If \code{NULL} (the default), there is an attempt to extract these from \code{trackLine}. If the attempt fails, no scores are exported. } \item{...}{Arguments to pass down to methods to other methods. For import, the flow eventually reaches the \code{BEDFile} method on \code{import}. When \code{trackLine} is \code{TRUE} or the target format is BED15, the arguments are passed through \code{export.ucsc}, so track line parameters are supported. } } \value{ For a \dQuote{bedpe} file, a \code{Pairs} object combining two \code{GRanges}. The \code{name} and \code{score} are carried over to the metadata columns. Otherwise, a \code{GRanges} with the metadata columns described in the details. } \details{ The BED format is a tab-separated table of intervals, with annotations like name, score and even sub-intervals for representing alignments and gene models. Official (UCSC) child formats currently include BED15 (adding a number matrix for e.g. expression data across multiple samples) and BEDGraph (a compressed means of storing a single score variable, e.g. coverage; overlapping features are not allowed). Many tools and organizations have extended the BED format with additional columns for particular use cases. The advantage of BED is its balance between simplicity and expressiveness. It is also relatively scalable, because only the first three columns (chrom, start and end) are required. Thus, BED is best suited for representing simple features. For specialized cases, one is usually better off with another format. For example, genome-scale vectors belong in \link[=BigWigFile]{BigWig}, alignments from high-throughput sequencing belong in \link[Rsamtools:BamFile]{BAM}, and gene models are more richly expressed in \link[=GFFFile]{GFF}. The following is the mapping of BED elements to a \code{GRanges} object. NA values are allowed only where indicated. These appear as a \dQuote{.} in the file. Only the first three columns (chrom, start and strand) are required. The other columns can only be included if all previous columns (to the left) are included. Upon export, default values are used to automatically pad the table, if necessary. \describe{ \item{chrom, start, end}{the \code{ranges} component.} \item{name}{character vector (NA's allowed) in the \code{name} column; defaults to NA on export. } \item{score}{numeric vector in the \code{score} column, accessible via the \code{score} accessor. Defaults to 0 on export. This is the only column present in BEDGraph (besides chrom, start and end), and it is required. } \item{strand}{strand factor (NA's allowed) in the \code{strand} column, accessible via the \code{strand} accessor; defaults to NA on export. } \item{thickStart, thickEnd}{\code{IntegerRanges} object in a column named \code{thick}; defaults to the ranges of the feature on export. } \item{itemRgb}{an integer matrix of color codes, as returned by \code{\link{col2rgb}}, or any valid input to \code{\link{col2rgb}}, in the \code{itemRgb} column; default is NA on export, which translates to black. } \item{blockSizes, blockStarts, blockCounts}{\code{IntegerRangesList} object in a column named \code{blocks}; defaults to empty upon BED15 export. } } For BED15 files, there should be a column of scores in \code{mcols(object)} for each sample in the experiment. The columns are named according to the \code{expNames} (found in the file, or passed as an argument during export). \code{NA} scores are stored as \dQuote{-10000} in the file. } \section{BEDX+Y formats}{ To import one of the multitude of BEDX+Y formats, such as those used to distribute ENCODE data through UCSC (narrowPeaks, etc), specify the \code{extraCols} argument to indicate the expected names and classes of the special columns. We assume that the last \code{length(extraCols)} columns are special, and that the preceding columns adhere to the BED format. \dQuote{narrowPeak} and \dQuote{broadPeak} types are handled explicitly by specifying these types as the \code{format} argument, rather than by using \code{extraCols}. } \section{BEDFile objects}{ The \code{BEDFile} class extends \code{\link[BiocIO:BiocFile-class]{BiocFile}} and is a formal represention of a resource in the BED format. To cast a path, URL or connection to a \code{BEDFile}, pass it to the \code{BEDFile} constructor. Classes and constructors also exist for the subclasses \code{BED15File}, \code{BEDGraphFile} and \code{BEDPEFile}. } \author{Michael Lawrence} \references{ \url{https://genome.ucsc.edu/goldenPath/help/customTrack.html} \url{http://bedtools.readthedocs.org/en/latest/content/general-usage.html} } \examples{ test_path <- system.file("tests", package = "rtracklayer") test_bed <- file.path(test_path, "test.bed") test <- import(test_bed) test test_bed_file <- BEDFile(test_bed) import(test_bed_file) test_bed_con <- file(test_bed) import(test_bed_con, format = "bed") import(test_bed, trackLine = FALSE) import(test_bed, genome = "hg19") import(test_bed, colnames = c("name", "strand", "thick")) which <- GRanges("chr7:1-127473000") import(test_bed, which = which) bed15_file <- file.path(test_path, "test.bed15") bed15 <- import(bed15_file) \dontrun{ test_bed_out <- file.path(tempdir(), "test.bed") export(test, test_bed_out) test_bed_out_file <- BEDFile(test_bed_out) export(test, test_bed_out_file) export(test, test_bed_out, name = "Alternative name") test_bed_gz <- paste(test_bed_out, ".gz", sep = "") export(test, test_bed_gz) export(test, test_bed_out, index = TRUE) export(test, test_bed_out, index = TRUE, trackLine = FALSE) bed_text <- export(test, format = "bed") test <- import(format = "bed", text = bed_text) test_bed15_out <- file.path(tempdir(), "test.bed15") export(bed15, test_bed15_out) # UCSCData knows the expNames export(as(bed15, "GRanges"), test_bed15_out, # have to specify expNames expNames=paste0("breast_", c("A", "B", "C"))) } } \keyword{methods} \keyword{classes} rtracklayer/man/BigBedFile.Rd0000644000175100017510000001051314614231172017074 0ustar00biocbuildbiocbuild\name{BigBedFile-class} \docType{class} %% Classes: \alias{class:BigBedFile} \alias{BigBedFile-class} \alias{class:BBFile} \alias{BBFile-class} %% Constructor: \alias{BigBedFile} \alias{BBFile} %% Accessors: \alias{seqinfo,BigBedFile-method} %% Import: \alias{import.bb} \alias{import.bb,ANY-method} \alias{import,BigBedFile,ANY,ANY-method} %% Export: \alias{export.bb} \alias{export.bb,ANY-method} \alias{export,ANY,BigBedFile,ANY-method} \alias{export,GenomicRanges,BigBedFile,ANY-method} \title{BigBed Import and Export} \description{ These functions support the import and export of the UCSC BigBed format, a compressed, binary form of BED with a spatial index and precomputed summaries. These functions do not work on Windows. } \usage{ \S4method{import}{BigBedFile,ANY,ANY}(con, format, text, selection = BigBedSelection(which, ...), which = con, ...) import.bb(con, ...) \S4method{export}{ANY,BigBedFile,ANY}(object, con, format, ...) \S4method{export}{GenomicRanges,BigBedFile,ANY}(object, con, format, compress = TRUE, extraIndexes = "") export.bb(object, con, ...) } \arguments{ \item{con}{A path, URL or \code{BigBedFile} object. Connections are not supported. For the functions ending in \code{.bb}, the file format is indicated by the function name. For the \code{export} and \code{import} methods, the format must be indicated another way. If \code{con} is a path, or URL, either the file extension or the \code{format} argument needs to be \dQuote{bigBed} or \dQuote{bb}. } \item{object}{The object to export, should be \code{GRanges}. } \item{format}{If not missing, should be \dQuote{bigBed} or \dQuote{bb} (case insensitive). } \item{text}{Not supported. } \item{selection}{A \code{\linkS4class{BigBedSelection}} object indicating the ranges to load. } \item{which}{A range data structure coercible to \code{IntegerRangesList}, like a \code{GRanges}, or a \code{BigBedFile}. Only the intervals in the file overlapping the given ranges are returned. By default, the value is the \code{BigBedFile} itself. Its \code{Seqinfo} object is extracted and coerced to a \code{IntegerRangesList} that represents the entirety of the file. } \item{compress}{If \code{TRUE}, compress the data. No reason to change this. } \item{extraIndexes}{If set, make an index on each field in a comma separated list } \item{...}{Arguments to pass down to methods to other methods. For import, the flow eventually reaches the \code{BigBedFile} method on \code{import}. } } \section{\code{BigBedFile} objects}{ A \code{BigWigFile} object, an extension of \code{\linkS4class{BiocFile}} is a reference to a BigBed file. To cast a path, URL or connection to a \code{BigBedFile}, pass it to the \code{BigBedFile} constructor. BigBed files are more complex than most track files, and there are a number of methods on \code{BigBedFile} for accessing the additional information: \describe{ \item{}{ \code{seqinfo(x)}: Gets the \code{\link[GenomeInfoDb]{Seqinfo}} object indicating the lengths of the sequences for the intervals in the file. No circularity or genome information is available. } } When accessing remote data, the UCSC library caches data in the \file{/tmp/udcCache} directory. To clean the cache, call \code{cleanBigBedCache(maxDays)}, where any files older than \code{maxDays} days old will be deleted. } \author{Michael Lawrence} \examples{ if (.Platform$OS.type != "windows") { test_path <- system.file("tests", package = "rtracklayer") test_bb <- file.path(test_path, "test.bb") ## Returns ranges with all fields gr <- import(test_bb) gr ## Retuns ranges only for 'chr10' ## between 180185-180185 with all fields which <- GRanges(c("chr10"), IRanges(c(180185, 180185))) import(test_bb, which = which) ## Retuns ranges only for 'chr10' ## between 180185-180185 with name and peak fields selection <- BigBedSelection(which, colnames = c("name", "peak")) import(test_bb, selection = selection) \dontrun{ test_bb_out <- file.path(tempdir(), "test_out.bb") export(test, test_bb_out) ## make an index for 'name' test_bb_out <- file.path(tempdir(), "test_out.bb") export(test, test_bb_out, extraIndexes = "name") } } } \keyword{methods} \keyword{classes} rtracklayer/man/BigBedSelection.rd0000644000175100017510000000333714614231172020210 0ustar00biocbuildbiocbuild\name{BigBedSelection-class} \docType{class} \alias{BigBedSelection-class} % constructor \alias{BigBedSelection} \alias{coerce,IntegerRangesList,BigBedSelection-method} \alias{coerce,GenomicRanges,BigBedSelection-method} \title{Selection of ranges and columns} \description{A \code{BigBedSelection} represents a query against a BigBed file, see \code{\link{import.bb}}. It is simply a \link[IRanges]{RangedSelection} with \code{colnames} parameter.\code{colnames} should be a character vector of column names. Default columns are \code{"name", "score", "thick", "itemRgb"} and \code{"blocks"}, if non-empty, as that is the only column supported by BigBed.} \section{Constructor}{ \describe{ \item{}{\code{BigBedSelection(ranges = GRanges(), colnames = "score")}: Constructs a \code{BigBedSelection} with the given \code{ranges} and \code{colnames}. a \code{character} identifying a genome (see \code{\link{GenomicSelection}}), or a \code{\linkS4class{BigBedFile}}, in which case the ranges are derived from the bounds of its sequences. } } } \section{Coercion}{ \describe{ \item{}{\code{as(from, "BigBedSelection")}: Coerces \code{from} to a \code{BigBedSelection} object. Typically, \code{from} is a \code{\link[GenomicRanges]{GRanges}} or a \code{\link[IRanges]{IntegerRangesList}}, the ranges of which become the ranges in the new \code{BigBedSelection}. } } } \author{ Michael Lawrence } \examples{ rl <- IRangesList(chr1 = IRanges::IRanges(c(1, 5), c(3, 6))) BigBedSelection(rl) as(rl, "BigBedSelection") # same as above # do not select any column BigBedSelection(rl, character()) } \keyword{methods} \keyword{classes} rtracklayer/man/BigWigFile.Rd0000644000175100017510000002124514614231172017134 0ustar00biocbuildbiocbuild\name{BigWigFile-class} \docType{class} %% Classes: \alias{class:BigWigFile} \alias{BigWigFile-class} \alias{class:BWFile} \alias{BWFile-class} \alias{class:BigWigFileList} \alias{BigWigFileList-class} %% Constructor: \alias{BigWigFile} \alias{BWFile} \alias{BigWigFileList} %% Accessors: \alias{seqinfo,BigWigFile-method} %% Import: \alias{import.bw} \alias{import.bw,ANY-method} \alias{import,BigWigFile,ANY,ANY-method} %% Export: \alias{export.bw} \alias{export.bw,ANY-method} \alias{export,ANY,BigWigFile,ANY-method} \alias{export,GenomicRanges,BigWigFile,ANY-method} \alias{export,List,BigWigFile,ANY-method} %% Utilites: \alias{summary,BigWigFile-method} \alias{path,BigWigFileList-method} \alias{cleanupBigWigCache} \title{BigWig Import and Export} \description{ These functions support the import and export of the UCSC BigWig format, a compressed, binary form of WIG/BEDGraph with a spatial index and precomputed summaries. These functions do not work on Windows. } \usage{ \S4method{import}{BigWigFile,ANY,ANY}(con, format, text, selection = BigWigSelection(which, ...), which = con, as = c("GRanges", "RleList", "NumericList"), ...) import.bw(con, ...) \S4method{export}{ANY,BigWigFile,ANY}(object, con, format, ...) \S4method{export}{GenomicRanges,BigWigFile,ANY}(object, con, format, dataFormat = c("auto", "variableStep", "fixedStep", "bedGraph"), compress = TRUE, fixedSummaries = FALSE) export.bw(object, con, ...) } \arguments{ \item{con}{A path, URL or \code{BigWigFile} object. Connections are not supported. For the functions ending in \code{.bw}, the file format is indicated by the function name. For the \code{export} and \code{import} methods, the format must be indicated another way. If \code{con} is a path, or URL, either the file extension or the \code{format} argument needs to be \dQuote{bigWig} or \dQuote{bw}. } \item{object}{The object to export, should be an \code{RleList}, \code{IntegerList}, \code{NumericList}, \code{GRanges} or something coercible to a \code{GRanges}. } \item{format}{If not missing, should be \dQuote{bigWig} or \dQuote{bw} (case insensitive). } \item{text}{Not supported. } \item{as}{Specifies the class of the return object. Default is \code{GRanges}, which has one range per range in the file, and a score column holding the value for each range. For \code{NumericList}, one numeric vector is returned for each range in the \code{selection} argument. For \code{RleList}, there is one \code{Rle} per sequence, and that \code{Rle} spans the entire sequence. } \item{selection}{A \code{\linkS4class{BigWigSelection}} object indicating the ranges to load. } \item{which}{A range data structure coercible to \code{IntegerRangesList}, like a \code{GRanges}, or a \code{BigWigFile}. Only the intervals in the file overlapping the given ranges are returned. By default, the value is the \code{BigWigFile} itself. Its \code{Seqinfo} object is extracted and coerced to a \code{IntegerRangesList} that represents the entirety of the file. } \item{dataFormat}{Probably best left to \dQuote{auto}. Exists only for historical reasons. } \item{compress}{If \code{TRUE}, compress the data. No reason to change this. } \item{fixedSummaries}{If \code{TRUE}, compute summaries at fixed resolutions corresponding to the default zoom levels in the Ensembl genome browser (with some extrapolation): 30X, 65X, 130X, 260X, 450X, 648X, 950X, 1296X, 4800X, 19200X. Otherwise, the resolutions are dynamically determined by an algorithm that computes an initial summary size by initializing to 10X the size of the smallest feature and doubling the size as needed until the size of the summary is less than half that of the data (or there are no further gains). It then computes up to 10 more levels of summary, quadrupling the size each time, until the summaries start to exceed the sequence size. } \item{...}{Arguments to pass down to methods to other methods. For import, the flow eventually reaches the \code{BigWigFile} method on \code{import}. } } \value{ A \code{GRanges} (default), \code{RleList} or \code{NumericList}. \code{GRanges} return ranges with non-zero score values in a \code{score} metadata column. The length of the \code{NumericList} is the same length as the \code{selection} argument (one list element per range). The return order in the \code{NumericList} matches the order of the \code{BigWigSelection} object. } \section{\code{BigWigFile} objects}{ A \code{BigWigFile} object, an extension of \code{\link[BiocIO:BiocFile-class]{BiocFile}} is a reference to a BigWig file. To cast a path, URL or connection to a \code{BigWigFile}, pass it to the \code{BigWigFile} constructor. BigWig files are more complex than most track files, and there are a number of methods on \code{BigWigFile} for accessing the additional information: \describe{ \item{}{ \code{seqinfo(x)}: Gets the \code{\link[GenomeInfoDb]{Seqinfo}} object indicating the lengths of the sequences for the intervals in the file. No circularity or genome information is available. } \item{}{ \code{summary(ranges = as(seqinfo(object), "GenomicRanges"), size = 1L, type = c("mean", "min", "max", "coverage", "sd"), defaultValue = NA_real_), as = c("GRangesList", "RleList", "matrix"), ...}: Aggregates the intervals in the file that fall into \code{ranges}, which should be something coercible to \code{GRanges}. The aggregation essentially compresses each sequence to a length of \code{size}. The algorithm is specified by \code{type}; available algorithms include the mean, min, max, coverage (percent sequence covered by at least one feature), and standard deviation. When a window contains no features, \code{defaultValue} is assumed. The result type depends on \code{as}, and can be a GRangesList, RleList or matrix, where the number elements (or rows) is equal to the length of \code{ranges}. For \code{as="matrix"}, there must be one unique value of \code{size}, which is equal to the number of columns in the result. The \code{as="matrix"} case is the only one that supports a \code{size} greater than the width of the corresponding element in \code{ranges}, where values are interpolated to yield the matrix result. The driving use case for this is visualization of coverage when the screen space is small compared to the viewed portion of the sequence. The operation is very fast, as it leverages cached multi-level summaries present in every BigWig file. If a summary statistic is not available / cannot be computed for a given range a warning is thrown and the defaultValue \code{NA_real_} is returned. } } When accessing remote data, the UCSC library caches data in the \file{/tmp/udcCache} directory. To clean the cache, call \code{cleanBigWigCache(maxDays)}, where any files older than \code{maxDays} days old will be deleted. } \section{\code{BigWigFileList} objects}{ A \code{BigWigFileList()} provides a convenient way of managing a list of \code{BigWigFile} instances. } \author{Michael Lawrence} \seealso{ \code{\link{wigToBigWig}} for converting a WIG file to BigWig. } \examples{ if (.Platform$OS.type != "windows") { test_path <- system.file("tests", package = "rtracklayer") test_bw <- file.path(test_path, "test.bw") ## GRanges ## Returns ranges with non-zero scores. gr <- import(test_bw) gr which <- GRanges(c("chr2", "chr2"), IRanges(c(1, 300), c(400, 1000))) import(test_bw, which = which) ## RleList ## Scores returned as an RleList is equivalent to the coverage. ## Best option when 'which' or 'selection' contain many small ranges. mini <- narrow(unlist(tile(which, 50)), 2) rle <- import(test_bw, which = mini, as = "RleList") rle ## NumericList ## The 'which' is stored as metadata: track <- import(test_bw, which = which, as = "NumericList") metadata(track) \dontrun{ test_bw_out <- file.path(tempdir(), "test_out.bw") export(test, test_bw_out) } bwf <- BigWigFile(test_bw) track <- import(bwf) seqinfo(bwf) summary(bwf) # for each sequence, average all values into one summary(bwf, range(head(track))) # just average the first few features summary(bwf, size = seqlengths(bwf) / 10) # 10X reduction summary(bwf, type = "min") # min instead of mean summary(bwf, track, size = 10, as = "matrix") # each feature 10 windows } } \keyword{methods} \keyword{classes} rtracklayer/man/BigWigSelection-class.Rd0000644000175100017510000000332214614231172021301 0ustar00biocbuildbiocbuild\name{BigWigSelection-class} \docType{class} \alias{BigWigSelection-class} % constructor \alias{BigWigSelection} \alias{coerce,IntegerRangesList,BigWigSelection-method} \alias{coerce,GenomicRanges,BigWigSelection-method} \title{Selection of ranges and columns} \description{A \code{BigWigSelection} represents a query against a BigWig file, see \code{\link{import.bw}}. It is simply a \link[IRanges]{RangedSelection} that requires its \code{colnames} parameter to be "score", if non-empty, as that is the only column supported by BigWig.} \section{Constructor}{ \describe{ \item{}{\code{BigWigSelection(ranges = GRanges(), colnames = "score")}: Constructs a \code{BigWigSelection} with the given \code{ranges} and \code{colnames}. \code{ranges} can be either something coercible to a \code{\linkS4class{IntegerRangesList}}, a \code{character} identifying a genome (see \code{\link{GenomicSelection}}), or a \code{\linkS4class{BigWigFile}}, in which case the ranges are derived from the bounds of its sequences. } } } \section{Coercion}{ \describe{ \item{}{\code{as(from, "BigWigSelection")}: Coerces \code{from} to a \code{BigWigSelection} object. Typically, \code{from} is a \code{\link[GenomicRanges]{GRanges}} or a \code{\link[IRanges]{IntegerRangesList}}, the ranges of which become the ranges in the new \code{BigWigSelection}. } } } \author{ Michael Lawrence } \examples{ rl <- IRangesList(chr1 = IRanges::IRanges(c(1, 5), c(3, 6))) BigWigSelection(rl) as(rl, "BigWigSelection") # same as above # do not select the 'score' column BigWigSelection(rl, character()) } \keyword{methods} \keyword{classes} rtracklayer/man/blocks-methods.Rd0000644000175100017510000000242314614231172020077 0ustar00biocbuildbiocbuild\name{blocks-methods} \docType{methods} \alias{blocks} \alias{blocks-methods} \alias{blocks,GenomicRanges-method} \title{Get blocks/exons} \description{ Obtains the block ranges (subranges, usually exons) from an object, such as a \code{\link[GenomicRanges]{GRanges}} imported from a BED file. } \usage{ blocks(x, ...) } \arguments{ \item{x}{The instance from which to obtain the block/exon information. Currently must be a \code{GenomicRanges}, with a metadata column of name \dQuote{blocks} and of type \code{IntegerRangesList}. Such an object is returned by \code{\link{import.bed}} and \code{\link{asBED}}. } \item{...}{Additional arguments for methods} } \value{ A \code{\link[GenomicRanges:GRangesList-class]{GRangesList}} with an element for each range in \code{x}. The original block ranges are relative to the start of the containing range, so the returned ranges are shifted to absolute coordinates. The seqname and strand are inherited from the containing range. } \author{Michael Lawrence} \seealso{\code{\link{import.bed}} for importing a track from BED, which can store block information; \code{\link{asBED}} for coercing a \code{GenomicRanges} into a BED-like structure that can be passed to this function. } \keyword{methods} \keyword{manip} rtracklayer/man/browseGenome.Rd0000644000175100017510000000364214614231172017621 0ustar00biocbuildbiocbuild\name{browseGenome} \alias{browseGenome} \alias{browseGenome,GenomicRanges_OR_GenomicRangesList-method} \alias{browseGenome,missing-method} \title{ Browse a genome } \description{ A generic function for launching a genome browser. } \usage{ browseGenome(object, ...) \S4method{browseGenome}{GenomicRanges_OR_GenomicRangesList}(object, browser = "UCSC", range = base::range(object), view = TRUE, trackParams = list(), viewParams = list(), name = "customTrack", ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{object}{ A \code{\link[GenomicRanges]{GRanges}} object or a list of \code{\link[GenomicRanges]{GRanges}} objects (e.g. a \code{\link[GenomicRanges]{GenomicRangesList}} object). } \item{browser}{ The name of the genome browser. } \item{range}{ A genome identifier or a \code{\link[GenomicRanges]{GRanges}} or \code{\link[IRanges]{IntegerRangesList}} to display in the initial view. } \item{view}{ Whether to open a view. } \item{trackParams}{ Named list of parameters to pass to \code{\link{track<-}}. } \item{viewParams}{ Named list of parameters to pass to \code{\link{browserView}}. } \item{name}{ The name for the track. } \item{\dots}{ Arguments passed to \code{\link{browserSession}}. } } \value{ Returns a \code{\linkS4class{BrowserSession}}. } \author{ Michael Lawrence } \seealso{ \code{\linkS4class{BrowserSession}} and \code{\linkS4class{BrowserView}}, the two main classes for interfacing with genome browsers.} \examples{ \dontrun{ ## open UCSC genome browser: browseGenome() ## to view a specific range: range <- GRangesForUCSCGenome("hg18", "chr22", IRanges(20000, 50000)) browseGenome(range = range) ## a slightly larger range: browseGenome(range = range, end = 75000) ## with a track: track <- import(system.file("tests", "v1.gff", package = "rtracklayer")) browseGenome(GRangesList(track)) } } \keyword{interface} rtracklayer/man/browserSession-class.Rd0000644000175100017510000001011514614231172021310 0ustar00biocbuildbiocbuild\name{BrowserSession-class} \docType{class} \alias{BrowserSession-class} \alias{show,BrowserSession-method} \alias{range,BrowserSession-method} \alias{genome,BrowserSession-method} \alias{genome<-,BrowserSession-method} \alias{names,BrowserSession-method} \alias{trackNames,BrowserSession-method} \title{Class "BrowserSession"} \description{An object representing a genome browser session. As a derivative of \code{\linkS4class{TrackDb}}, each session contains a set of loaded tracks. In addition, it has a set of views, in the form of \code{\linkS4class{BrowserView}} instances, on those tracks. Note that this is a virtual class; a concrete implementation is provided by each backend driver.} \section{Objects from the Class}{A virtual Class: No objects may be created from it. See \code{\link{browserSession}} for obtaining an instance of an implementation for a particular genome browser.} \section{Methods}{ This specifies the API implemented by each browser backend. Note that a backend is not required to support all operations, and that each backend often has additional parameters for each of the methods. See the backend-specific documentation for more details. The only built-in backend is \code{\linkS4class{UCSCSession}}. If a method is denoted as \emph{virtual}, it must be implemented by the backend to support the corresponding feature. Otherwise, the fallback behavior is described. \describe{ \item{\emph{virtual} \code{\link{browserView}(object, range = range(object), track = trackNames(object), ...)}}{ Constructs a \code{\linkS4class{BrowserView}} of \code{range} for this session. } \item{\emph{virtual} \code{\link{browserViews}(object, ...)}}{ Gets the \code{\linkS4class{BrowserView}} instances belonging to this session.} \item{\code{\link{activeView}(object, ...)}}{ Returns the \code{\linkS4class{BrowserView}} that is currently active in the session. Fallback calls \code{browserViews} and queries each view with \code{activeView}.} \item{\code{\link{range}(x, ...)}}{ Gets the \code{\link[GenomicRanges:GRanges-class]{GRanges}} representing the range of the genome currently displayed by the browser (i.e. the range shown by the active view) or a default value (possibly \code{NULL}) if no views exist. } \item{\emph{virtual} \code{\link[Biostrings]{getSeq}(object, range = range(object), ...)}}{ gets a genomic sequence of \code{range} from this session.} \item{\emph{virtual} \code{\link[=sequence<-]{sequence}(object, ...) <- value}}{ Loads a sequence into the session.} \item{\emph{virtual} \code{\link[=track<-]{track}(object, name = deparse(substitute(track)), view = TRUE, ...) <- value}}{ Loads one or more \code{track}s into the session and optionally open a \code{view} of the track. } \item{\code{x[[i]] <- value}}{Loads the track \code{value} into session \code{x}, under the name \code{i}. Shortcut to above.} \item{\code{x$name <- value}}{Loads the track \code{value} into session \code{x}, under the name \code{name}. Shortcut to above.} \item{\emph{virtual} \code{\link{track}(object, ...)}}{ Gets a track from a session. } \item{\code{x[[i]]}}{Gets the track named \code{i} from session \code{x}. A shortcut to \code{track}. } \item{\code{x$name}}{Gets the track named \code{name} from session \code{x}. A shortcut to \code{track}.} \item{\emph{virtual} \code{\link{trackNames}(object, ...)}}{ Gets the names of the tracks stored in this session. } \item{\emph{virtual} \code{\link{genome}(x)}, \code{genome(x) <- value}}{ Gets or sets the genome identifier (e.g. \dQuote{hg18}) for the session.} \item{\emph{virtual} \code{\link{close}(con, ...)}}{ Close this session. } \item{\code{\link{show}(object, ...)}}{ Output a textual description of this session.} } } \author{ Michael Lawrence } \seealso{ \code{\link{browserSession}} for obtaining implementations of this class for a particular genome browser. } \keyword{classes} rtracklayer/man/browserSession-methods.Rd0000644000175100017510000000171214614231172021651 0ustar00biocbuildbiocbuild\name{browserSession-methods} \docType{methods} \alias{browserSession} \alias{browserSession-methods} \alias{browserSession,character-method} \alias{browserSession,BrowserView-method} \alias{browserSession,missing-method} \title{ Get a genome browser session } \description{ Methods for getting browser sessions. } \section{Methods}{ The following methods are defined by \pkg{rtracklayer}. \describe{ \item{object = "character"}{ \code{browserSession(object, ...)}: Creates a \code{\linkS4class{BrowserSession}} from a genome browser identifier. The identifier corresponds to the prefix of the session class name (e.g. "UCSC" in "UCSCSession"). The arguments in \dots are passed to the initialization function of the class.} \item{object = "browserView"}{ Gets the \code{\linkS4class{BrowserSession}} for the view. } \item{object = "missing"}{ Calls \code{browserSession("ucsc", ...)}. } } } \keyword{methods} rtracklayer/man/browserView-class.Rd0000644000175100017510000000403014614231172020576 0ustar00biocbuildbiocbuild\name{BrowserView-class} \docType{class} \alias{BrowserView-class} \alias{show,BrowserView-method} \alias{visible} \alias{visible,BrowserView-method} \alias{visible<-} \alias{visible<-,BrowserView-method} \title{Class "BrowserView"} \description{ An object representing a genome browser view of a particular segment of a genome. } \section{Objects from the Class}{ A virtual Class: No objects may be created from it directly. See \code{\link{browserView}} for obtaining an instance of an implementation for a particular genome browser. } \section{Slots}{ \describe{ \item{\code{session}:}{Object of class \code{"BrowserSession"} the browser session to which this view belongs. } } } \section{Methods}{ This specifies the API implemented by each browser backend. Note that a backend is not guaranteed to support all operations. See the backend-specific documentation for more details. The only built-in backend is \code{\linkS4class{UCSCView}}. \describe{ \item{\code{\link{browserSession}(object)}}{ Obtains the \code{\linkS4class{BrowserSession}} to which this view belongs. } \item{\code{\link{close}(object)}}{ Close this view. } \item{\code{\link{range}(object)}}{ Obtains the \code{\link[GenomicRanges:GRanges-class]{GRanges}} displayed by this view.} \item{\code{\link{trackNames}(object)}}{ Gets the names of the visible tracks in the view. } \item{\code{\link{trackNames}(object) <- value}}{ Sets the visible tracks by their names. } \item{\code{\link{show}(object)}}{ Outputs a textual description of this view. } \item{\code{visible(object)}}{Get a named logical vector indicating whether each track is visible. } \item{\code{visible(object) <- value}}{Set a logical vector indicating the visibility of each track, with the same names and in the same order as that returned by \code{visible(object)}. } } } \author{ Michael Lawrence } \seealso{ \code{\link{browserView}} for obtaining instances of this class. } \keyword{classes} rtracklayer/man/browserView-methods.Rd0000644000175100017510000000325714614231172021146 0ustar00biocbuildbiocbuild\name{browserView-methods} \docType{methods} \alias{browserView} \alias{browserView-methods} \alias{browserView,UCSCSession-method} \title{Getting browser views} \description{ Methods for creating and getting browser views. } \usage{ browserView(object, range, track, ...) } \arguments{ \item{object}{The object from which to get the views.} \item{range}{The \code{\link[GenomicRanges]{GRanges}} or \code{\link[IRanges]{IntegerRangesList}} to display. If there are multiple elements, a view is created for each element and a \code{\linkS4class{BrowserViewList}} is returned.} \item{track}{List of track names to make visible in the view.} \item{\dots}{Arguments to pass to methods} } \section{Methods}{ The following methods are defined by \pkg{rtracklayer}. \describe{ \item{object = "UCSCSession"}{ \code{browserView(object, range = range(object), track = trackNames(object), imagewidth = 800, ...)}: Creates a \code{\linkS4class{BrowserView}} of \code{range} with visible tracks specified by \code{track}. The \code{imagewidth} parameter specifies the width of the track image in pixels. \code{track} may be an instance of \code{\linkS4class{UCSCTrackModes}}. Arguments in \code{...} are passed to \code{\link{ucscTrackModes}} to create the \code{UCSCTrackModes} instance that will override modes indicated by the \code{track} parameter. } }} \examples{ \dontrun{ session <- browserSession() browserView(session, GRangesForUCSCGenome("hg19", "chr2", IRanges(20000, 50000))) ## only view "knownGene" track browserView(session, track = "knownGene") } } \keyword{methods} rtracklayer/man/BrowserViewList-class.Rd0000644000175100017510000000123514614231172021376 0ustar00biocbuildbiocbuild\name{BrowserViewList-class} \docType{class} \alias{BrowserViewList-class} % Constructor \alias{BrowserViewList} \title{Lists of BrowserView} \description{ A formal list of \code{\linkS4class{BrowserView}} objects. Extends and inherits all its methods from \code{\link[S4Vectors]{Vector}}. Usually generated by passing multiple ranges to the \code{\link{browserView}} function. } \section{Constructor}{ \describe{ \item{}{\code{BrowserViewList(...)}: Concatenates the \code{BrowserView} objects in \code{...} into a new \code{BrowserViewList}. This is rarely called by the user. } } } \author{Michael Lawrence} \keyword{classes} rtracklayer/man/browserViews-methods.Rd0000644000175100017510000000110614614231172021320 0ustar00biocbuildbiocbuild\name{browserViews-methods} \docType{methods} \alias{browserViews} \alias{browserViews-methods} \alias{browserViews,UCSCSession-method} \title{ Getting the browser views } \description{ Methods for getting browser views. } \section{Methods}{ \describe{ The following methods are defined by \pkg{rtracklayer}. \item{object = "UCSCSession"}{ Gets the instances of \code{\linkS4class{BrowserView}} in the session. } }} \seealso{\code{\link{browserView}} for creating a browser view.} \examples{ \dontrun{ session <- browseGenome() browserViews(session) } } \keyword{methods} rtracklayer/man/Chain-class.Rd0000644000175100017510000000563114614231172017312 0ustar00biocbuildbiocbuild\name{Chain-class} \docType{class} %% Classes: \alias{class:Chain} \alias{Chain-class} \alias{ChainBlock-class} \alias{class:ChainBlock} \alias{class:ChainFile} \alias{ChainFile-class} %% Constructor: \alias{import.chain} \alias{import.chain,ANY-method} \alias{import,ChainFile,ANY,ANY-method} \alias{ChainFile} %% Generics and methods: \alias{ranges,ChainBlock-method} \alias{offset,ChainBlock-method} \alias{score,ChainBlock-method} \alias{space,ChainBlock-method} \alias{reversed} \alias{reversed,ChainBlock-method} \title{Chain objects} \description{ A \code{Chain} object represents a UCSC chain alignment, typically imported from a \code{chain} file, and is essentially a list of \code{ChainBlock} objects. Each \code{ChainBlock} has a corresponding chromosome (its name in the list) and is a run-length encoded alignment, mapping a set of intervals on that chromosome to intervals on the same or other chromosomes. } \note{ A chain file essentially details many local alignments, so it is possible for the "from" ranges to map to overlapping regions in the other sequence. The "from" ranges are guaranteed to be disjoint (but do not necessarily cover the entire "from" sequence). } \section{Accessor Methods}{ In the code snippets below, \code{x} and \code{object} are \code{ChainBlock} objects. \describe{ \item{}{ \code{ranges(x)}: Get the \code{\link[IRanges]{IntegerRanges}} object holding the starts and ends of the "from" ranges. Each range is a contiguous block of positions aligned without gaps to the other sequence. } \item{}{ \code{offset(x)}: Integer offset from the "from" start to the "end" start (which could be in another chromosome). } \item{}{ \code{score(x)}: The score for each mapping. } \item{}{ \code{space(x)}: The space (chromosome) of the "to" range. } \item{}{ \code{reversed(x)}: Whether the mapping inverts the region, i.e., the alignment is between different strands. } } } \section{Import}{ A \code{Chain} object can be loaded from a UCSC chain format file simply by passing the path \code{import} function. If the file extension is not \dQuote{chain}, then either pass \dQuote{chain} to the \code{format} argument, or cast the path to a \code{ChainFile} object. The \code{import.chain} function is provided as a (slight) convenience. It is documented below, along with the extra \code{exclude} argument to the \code{import} method. \describe{ \item{}{ \code{import.chain(con, exclude = "_", ...)}: Imports a chain file named \code{con} as a \code{Chain} object, a list of \code{ChainBlock}s. Alignments for chromosomes matching the \code{exclude} pattern are not imported. } } } \author{Michael Lawrence} \seealso{ \code{\link{liftOver}} for performing lift overs using a chain alignment } \keyword{methods} \keyword{classes} rtracklayer/man/cpneTrack.Rd0000644000175100017510000000137214614231172017075 0ustar00biocbuildbiocbuild\name{cpneTrack} \alias{cpneTrack} \docType{data} \title{CPNE1 SNP track} \description{ A \code{GRanges} object (created by the \code{GGtools} package) with features from a subset of the SNPs on chromosome 20 from 60 HapMap founders in the CEU cohort. Each SNP has an associated data value indicating its association with the expression of the CPNE1 gene according to a Cochran-Armitage 1df test. The top 5000 scoring SNPs were selected for the track. } \usage{data(cpneTrack)} \format{ Each feature (row) is a SNP. The association test scores are accessible via \code{\link[BiocGenerics]{score}}. } \source{ Vince Carey and the \code{GGtools} package. } \examples{ data(cpneTrack) plot(start(cpneTrack), score(cpneTrack)) } \keyword{datasets} rtracklayer/man/FastaFile-class.Rd0000644000175100017510000000431414614231172020123 0ustar00biocbuildbiocbuild\name{FastaFile-class} \docType{class} %% Classes: \alias{class:FastaFile} \alias{FastaFile-class} %% Constructor: \alias{FastaFile} %% Import: \alias{import,FastaFile,ANY,ANY-method} %% Export: \alias{export,ANY,FastaFile,ANY-method} \alias{export,XStringSet,FastaFile,ANY-method} \title{FastaFile objects} \description{ These functions support the import and export of the Fasta sequence format, using the Biostrings package. } \usage{ \S4method{import}{FastaFile,ANY,ANY}(con, format, text, type = c("DNA", "RNA", "AA", "B"), ...) \S4method{export}{ANY,FastaFile,ANY}(object, con, format, ...) \S4method{export}{XStringSet,FastaFile,ANY}(object, con, format, ...) } \arguments{ \item{con}{A path or \code{FastaFile} object. URLs and connections are not supported. If \code{con} is not a \code{FastaFile}, either the file extension or the \code{format} argument needs to be \dQuote{fasta}. Compressed files (\dQuote{gz}, \dQuote{bz2} and \dQuote{xz}) are handled transparently. } \item{object}{The object to export, should be an \code{XStringSet} or something coercible to a \code{DNAStringSet}, like a character vector. } \item{format}{If not missing, should be \dQuote{fasta}. } \item{text}{If \code{con} is missing, a character vector to use as the input } \item{type}{Type of biological sequence.} \item{...}{Arguments to pass down to \code{\link[Biostrings]{writeXStringSet}} (export) or the \code{\link[Biostrings]{readDNAStringSet}} family of functions (import). } } \seealso{ These functions are implemented by the Biostrings \code{\link[Biostrings]{writeXStringSet}} (export) and the \code{\link[Biostrings]{readDNAStringSet}} family of functions (import). See \link[BSgenome]{export-methods} in the \pkg{BSgenome} package for exporting a \link[BSgenome]{BSgenome} object as a FASTA file. } \section{FastaFile objects}{ The \code{FastaFile} class extends \code{\link[BiocIO:BiocFile-class]{BiocFile}} and is a formal represention of a resource in the Fasta format. To cast a path, URL or connection to a \code{FastaFile}, pass it to the \code{FastaFile} constructor. } \author{Michael Lawrence} \keyword{methods} \keyword{classes} rtracklayer/man/genomeBrowsers.Rd0000644000175100017510000000164514614231172020167 0ustar00biocbuildbiocbuild\name{genomeBrowsers} \alias{genomeBrowsers} \title{Get available genome browsers} \description{ Gets the identifiers of the loaded genome browser drivers. } \usage{ genomeBrowsers(where = topenv(parent.frame())) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{where}{ The environment in which to search for drivers. } } \details{ This searches the specified environment for classes that extend \code{\linkS4class{BrowserSession}}. The prefix of the class name, e.g. "ucsc" in "UCSCSession", is returned for each driver. } \value{ A character vector of driver identifiers. } \author{ Michael Lawrence } \seealso{ \code{\link{browseGenome}} and \code{\link{browserSession}} that create \code{browserSession} implementations given an identifier returned from this function. } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{interface} rtracklayer/man/GenomicData.Rd0000644000175100017510000000466314614231172017344 0ustar00biocbuildbiocbuild\name{GenomicData} % constructor \alias{GenomicData} % accessors \alias{chrom} \alias{chrom,GRanges-method} \alias{chrom<-} \alias{chrom<-,GRanges-method} \alias{score,ANY-method} \title{Data on a Genome} \description{The \code{rtracklayer} package adds convenience methods on top of \code{GenomicRanges} and \code{IntegerRangesList} to manipulate data on genomic ranges.} \section{Accessors}{ In the code snippets below, \code{x} is a \code{GenomicRanges} or \code{IntegerRangesList} object. \describe{ \item{}{ \code{chrom(x), chrom(x) <- value}: Gets or sets the chromosome names for \code{x}. The length of \code{value} should equal the length of \code{x}. } \item{}{ \code{score(x)}: Gets the \dQuote{score} column from the element metadata of a \code{GenomicRanges} or \code{GRangesList}. Many track formats have a score column, so this is often used during export. The \code{ANY} fallback for this method simply returns \code{NULL}. } } } \section{Constructor}{ \describe{ \item{}{ \code{GenomicData(ranges, ..., strand = NULL, chrom = NULL, genome = NULL)}: Constructs a \code{GRanges} instance with the given \code{ranges} and variables in \code{...} (see the \code{\link[GenomicRanges]{GRanges}} constructor). If non-\code{NULL}, the \code{strand} argument specifies the strand of each range. It should be a character vector or factor of length equal to that of \code{ranges}. All values should be either \code{-}, \code{+}, or \code{*}. To get the levels for \code{strand}, call \code{levels(strand())}. \code{chrom} argument is analogous to \code{seqnames} in the \code{GRanges} constructor. The \code{genome} argument should be a scalar string. See the examples. } } } \author{ Michael Lawrence and Patrick Aboyoun } \examples{ range1 <- IRanges(c(1,2,3), c(5,2,8)) ## with some data ## filter <- c(1L, 0L, 1L) score <- c(10L, 2L, NA) strand <- factor(c("+", NA, "-"), levels = levels(strand())) ## GRanges instance gr <- GenomicData(range1, score, chrom = "chr1", genome = "hg18") mcols(gr)[["score"]] strand(gr) ## all '*' gr <- GenomicData(range1, score, filt = filter, strand = strand, chrom = "chr1") mcols(gr)[["filt"]] strand(gr) ## equal to 'strand' ## coercion from data.frame ## df <- as.data.frame(gr) } \keyword{classes} \keyword{methods} rtracklayer/man/GenomicSelection.Rd0000644000175100017510000000171314614231172020411 0ustar00biocbuildbiocbuild\name{GenomicSelection} \alias{GenomicSelection} \title{ Genomic data selection } \description{ Convenience constructor of a \link[IRanges]{RangedSelection} object for selecting a data on a per-chromosome basis for a given genome. } \usage{ GenomicSelection(genome, chrom = NULL, colnames = character(0)) } \arguments{ \item{genome}{ A string identifying a genome. Should match the end of a BSgenome package name, e.g. "hg19". } \item{chrom}{ Character vector naming chromosomes to select. } \item{colnames}{ The column names to select from the dataset. } } \value{ A \link[IRanges]{RangedSelection} object, selecting entire chromosomes } \author{ Michael Lawrence } \seealso{ \code{\link[IRanges]{RangedSelection}}, \code{\link{BigWigSelection}} } \examples{ # every chromosome from hg19 GenomicSelection("hg19") # chr1 and 2 from hg19, with a score column GenomicSelection("hg19", c("chr1", "chr2"), "score") } \keyword{ manip } rtracklayer/man/GFFFile-class.Rd0000644000175100017510000002721014614231172017467 0ustar00biocbuildbiocbuild\name{GFFFile-class} \docType{class} %% Classes: \alias{class:GFFFile} \alias{class:GFF1File} \alias{class:GFF2File} \alias{class:GFF3File} \alias{class:GVFFile} \alias{class:GTFFile} \alias{GFFFile-class} \alias{GFF1File-class} \alias{GFF2File-class} \alias{GFF3File-class} \alias{GVFFile-class} \alias{GTFFile-class} %% Constructor: \alias{GFFFile} \alias{GFF1File} \alias{GFF2File} \alias{GFF3File} \alias{GVFFile} \alias{GTFFile} %% Import: \alias{import,GFFFile,ANY,ANY-method} \alias{import.gff} \alias{import.gff1} \alias{import.gff2} \alias{import.gff3} \alias{import.gff,ANY-method} \alias{import.gff1,ANY-method} \alias{import.gff2,ANY-method} \alias{import.gff3,ANY-method} %% Export: \alias{export,ANY,GFFFile,ANY-method} \alias{export,GenomicRanges,GFFFile,ANY-method} \alias{export,GenomicRangesList,GFFFile,ANY-method} \alias{export,GRangesList,GFFFile,ANY-method} \alias{export,GRangesList,GTFFile,ANY-method} \alias{export.gff} \alias{export.gff,ANY-method} \alias{export.gff1} \alias{export.gff1,ANY-method} \alias{export.gff2} \alias{export.gff2,ANY-method} \alias{export.gff3} \alias{export.gff3,ANY-method} % Other: \alias{genome,GFFFile-method} \title{GFFFile objects} \description{ These functions support the import and export of the GFF format, of which there are three versions and several flavors. } \usage{ \S4method{import}{GFFFile,ANY,ANY}(con, format, text, version = c("", "1", "2", "3"), genome = NA, colnames = NULL, which = NULL, feature.type = NULL, sequenceRegionsAsSeqinfo = FALSE) import.gff(con, ...) import.gff1(con, ...) import.gff2(con, ...) import.gff3(con, ...) \S4method{export}{ANY,GFFFile,ANY}(object, con, format, ...) \S4method{export}{GenomicRanges,GFFFile,ANY}(object, con, format, version = c("1", "2", "3"), source = "rtracklayer", append = FALSE, index = FALSE) \S4method{export}{GenomicRangesList,GFFFile,ANY}(object, con, format, ...) export.gff(object, con, ...) export.gff1(object, con, ...) export.gff2(object, con, ...) export.gff3(object, con, ...) } \arguments{ \item{con}{A path, URL, connection or \code{GFFFile} object. For the functions ending in \code{.gff}, \code{.gff1}, etc, the file format is indicated by the function name. For the base \code{export} and \code{import} functions, the format must be indicated another way. If \code{con} is a path, URL or connection, either the file extension or the \code{format} argument needs to be one of \dQuote{gff}, \dQuote{gff1} \dQuote{gff2}, \dQuote{gff3}, \dQuote{gvf}, or \dQuote{gtf}. Compressed files (\dQuote{gz}, \dQuote{bz2} and \dQuote{xz}) are handled transparently. } \item{object}{The object to export, should be a \code{GRanges} or something coercible to a \code{GRanges}. If the object has a method for \code{asGFF}, it is called prior to coercion. This makes it possible to export a \code{GRangesList} or \code{TxDb} in a way that preserves the hierarchical structure. For exporting multiple tracks, in the UCSC track line metaformat, pass a \code{GenomicRangesList}, or something coercible to one. } \item{format}{If not missing, should be one of \dQuote{gff}, \dQuote{gff1} \dQuote{gff2}, \dQuote{gff3}, \dQuote{gvf}, or \dQuote{gtf}. } \item{version}{If the format is given as \dQuote{gff}, i.e., it does not specify a version, then this should indicate the GFF version as one of \dQuote{} (for import only, from the \code{gff-version} directive in the file or \dQuote{1} if none), \dQuote{1}, \dQuote{2} or \dQuote{3}. } \item{text}{If \code{con} is missing, a character vector to use as the input. } \item{genome}{The identifier of a genome, or a \code{Seqinfo}, or \code{NA} if unknown. Typically, this is a UCSC identifier like \dQuote{hg19}. An attempt will be made to derive the \code{Seqinfo} on the return value using either an installed BSgenome package or UCSC, if network access is available. } \item{colnames}{A character vector naming the columns to parse. These should name either fixed fields, like \code{source} or \code{type}, or, for GFF2 and GFF3, any attribute. } \item{which}{A \code{GRanges} or other range-based object supported by \code{\link[IRanges]{findOverlaps}}. Only the intervals in the file overlapping the given ranges are returned. This is much more efficient when the file is indexed with the tabix utility. } \item{feature.type}{\code{NULL} (the default) or a character vector of valid feature types. If not \code{NULL}, then only the features of the specified type(s) are imported. } \item{sequenceRegionsAsSeqinfo}{If \code{TRUE}, attempt to infer the \code{Seqinfo} (\code{seqlevels} and \code{seqlengths}) from the \dQuote{##sequence-region} directives as specified by GFF3. } \item{source}{The value for the source column in GFF. This is typically the name of the package or algorithm that generated the feature. } \item{index}{If \code{TRUE}, automatically compress and index the output file with bgzf and tabix. Note that tabix indexing will sort the data by chromosome and start. Tabix supports a single track in a file. } \item{append}{If \code{TRUE}, and \code{con} points to a file path, the data is appended to the file. Obviously, if \code{con} is a connection, the data is always appended. } \item{...}{Arguments to pass down to methods to other methods. For import, the flow eventually reaches the \code{GFFFile} method on \code{import}. When \code{trackLine} is \code{TRUE} or the target format is BED15, the arguments are passed through \code{export.ucsc}, so track line parameters are supported. } } \value{ A \code{GRanges} with the metadata columns described in the details. } \details{ The Generic Feature Format (GFF) format is a tab-separated table of intervals. There are three different versions of GFF, and they all have the same number of columns. In GFF1, the last column is a grouping factor, whereas in the later versions the last column holds application-specific attributes, with some conventions defined for those commonly used. This attribute support facilitates specifying extensions to the format. These include GTF (Gene Transfer Format, an extension of GFF2) and GVF (Genome Variation Format, an extension of GFF3). The rtracklayer package recognizes the \dQuote{gtf} and \dQuote{gvf} extensions and parses the extra attributes into columns of the result; however, it does not perform any extension-specific processing. Both GFF1 and GFF2 have been proclaimed obsolete; however, the UCSC Genome Browser only supports GFF1 (and GTF), and GFF2 is still in broad use. GFF is distinguished from the simpler BED format by its flexible attribute support and its hierarchical structure, as specified by the \code{group} column in GFF1 (only one level of grouping) and the \code{Parent} attribute in GFF3. GFF2 does not specify a convention for representing hierarchies, although its GTF extension provides this for gene structures. The combination of support for hierarchical data and arbitrary descriptive attributes makes GFF(3) the preferred format for representing gene models. Although GFF features a \code{score} column, large quantitative data belong in a format like \link[=BigWigFile]{BigWig} and alignments from high-throughput experiments belong in \link[Rsamtools:BamFile]{BAM}. For variants, the VCF format (supported by the VariantAnnotation package) seems to be more widely adopted than the GVF extension. A note on the UCSC track line metaformat: track lines are a means for passing hints to visualization tools like the UCSC Genome Browser and the Integrated Genome Browser (IGB), and they allow multiple tracks to be concatenated in the same file. Since GFF is not a UCSC format, it is not common to annotate GFF data with track lines, but rtracklayer still supports it. To export or import GFF data in the track line format, call \code{\link{export.ucsc}} or \code{\link{import.ucsc}}. The following is the mapping of GFF elements to a \code{GRanges} object. NA values are allowed only where indicated. These appear as a \dQuote{.} in the file. GFF requires that all columns are included, so \code{export} generates defaults for missing columns. \describe{ \item{seqid, start, end}{the \code{ranges} component.} \item{source}{character vector in the \code{source} column; defaults to \dQuote{rtracklayer} on export. } \item{type}{character vector in the \code{type} column; defaults to \dQuote{sequence_feature} in the output, i.e., SO:0000110. } \item{score}{numeric vector (NA's allowed) in the \code{score} column, accessible via the \code{score} accessor; defaults to \code{NA} upon export. } \item{strand}{strand factor (NA's allowed) in the \code{strand} column, accessible via the \code{strand} accessor; defaults to \code{NA} upon export. } \item{phase}{integer vector, either 0, 1 or 2 (NA's allowed); defaults to \code{NA} upon export. } \item{group}{a factor (GFF1 only); defaults to the \code{seqid} (e.g., chromosome) on export. } } In GFF versions 2 and 3, attributes map to arbitrary columns in the result. In GFF3, some attributes (\code{Parent}, \code{Alias}, \code{Note}, \code{DBxref} and \code{Ontology_term}) can have multiple, comma-separated values; these columns are thus always \code{CharacterList} objects. } \section{GFFFile objects}{ The \code{GFFFile} class extends \code{\link[BiocIO:BiocFile-class]{BiocFile}} and is a formal represention of a resource in the GFF format. To cast a path, URL or connection to a \code{GFFFile}, pass it to the \code{GFFFile} constructor. The \code{GFF1File}, \code{GFF2File}, \code{GFF3File}, \code{GVFFile} and \code{GTFFile} classes all extend \code{GFFFile} and indicate a particular version of the format. It has the following utility methods: \describe{ \item{}{\code{genome}: Gets the genome identifier from the \dQuote{genome-build} header directive. } } } \author{Michael Lawrence} \references{ \describe{ \item{GFF1, GFF2}{ \url{http://www.sanger.ac.uk/resources/software/gff/spec.html} } \item{GFF3}{\url{http://www.sequenceontology.org/gff3.shtml}} \item{GVF}{\url{http://www.sequenceontology.org/resources/gvf.html}} \item{GTF}{\url{http://mblab.wustl.edu/GTF22.html}} } } \examples{ test_path <- system.file("tests", package = "rtracklayer") test_gff3 <- file.path(test_path, "genes.gff3") ## basic import test <- import(test_gff3) test ## import.gff functions import.gff(test_gff3) import.gff3(test_gff3) ## GFFFile derivatives test_gff_file <- GFF3File(test_gff3) import(test_gff_file) test_gff_file <- GFFFile(test_gff3) import(test_gff_file) test_gff_file <- GFFFile(test_gff3, version = "3") import(test_gff_file) ## from connection test_gff_con <- file(test_gff3) test <- import(test_gff_con, format = "gff") ## various arguments import(test_gff3, genome = "hg19") import(test_gff3, colnames = character()) import(test_gff3, colnames = c("type", "geneName")) ## 'which' which <- GRanges("chr10:90000-93000") import(test_gff3, which = which) \dontrun{ ## 'append' test_gff3_out <- file.path(tempdir(), "genes.gff3") export(test[seqnames(test) == "chr10"], test_gff3_out) export(test[seqnames(test) == "chr12"], test_gff3_out, append = TRUE) import(test_gff3_out) ## 'index' export(test, test_gff3_out, index = TRUE) test_bed_gz <- paste(test_gff3_out, ".gz", sep = "") import(test_bed_gz, which = which) } } \keyword{methods} \keyword{classes} rtracklayer/man/GRangesForUCSCGenome.Rd0000644000175100017510000000363714614231172020777 0ustar00biocbuildbiocbuild\name{GRangesForUCSCGenome} \alias{GRangesForUCSCGenome} \alias{GRangesForBSGenome} \alias{SeqinfoForUCSCGenome} \alias{SeqinfoForBSGenome} \title{ GRanges for a Genome } \description{ These functions assist in the creation of \code{\link[GenomeInfoDb]{Seqinfo}} or \code{\link[GenomicRanges:GRanges-class]{GRanges}} for a genome. } \usage{ GRangesForUCSCGenome(genome, chrom = NULL, ranges = NULL, ...) GRangesForBSGenome(genome, chrom = NULL, ranges = NULL, ...) SeqinfoForUCSCGenome(genome) SeqinfoForBSGenome(genome) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{genome}{ A string identifying a genome, usually one assigned by UCSC, like "hg19". } \item{chrom}{ A character vector of chromosome names, or \code{NULL}. } \item{ranges}{ A \code{\link[IRanges]{IntegerRanges}} object with the intervals. } \item{\dots}{ Additional arguments to pass to the \code{\link[GenomicRanges]{GRanges}} constructor. } } \details{ The genome ID is stored in the metadata of the ranges and is retrievable via the \code{\link{genome}} function. The sequence lengths are also properly initialized for the genome. This mitigates the possibility of accidentally storing intervals for the wrong genome. \code{GRangesForUCSCGenome} obtains sequence information from the UCSC website, while \code{GRangesForBSGenome} looks for it in an installed \code{BSGenome} package. Using the latter is more efficient in the long-run, but requires downloading and installing a potentially large genome package, or creating one from scratch if it does not yet exist for the genome of interest. } \value{ For the \code{GRangesFor*} functions, a \code{GRanges} object, with the appropriate \code{\link[GenomeInfoDb]{seqlengths}} and \code{\link{genome}} ID. The \code{SeqinfoFor*} functions return a \code{Seqinfo} for the indicated genome. } \author{ Michael Lawrence } rtracklayer/man/IntegerRangesList-methods.Rd0000644000175100017510000000175014614231172022215 0ustar00biocbuildbiocbuild\name{IntegerRangesList-methods} \docType{methods} \alias{IntegerRangesList-methods} % accessors \alias{chrom,IntegerRangesList-method} \alias{chrom<-,IntegerRangesList-method} \title{Ranges on a Genome} \description{ Genomic coordinates are often specified in terms of a genome identifier, chromosome name, start position and end position. The \code{rtracklayer} package adds convenience methods to \code{IntegerRangesList} for the manipulation of genomic ranges. The spaces (or names) of \code{IntegerRangesList} are the chromosome names. The \code{universe} slot indicates the genome, usually as given by UCSC (e.g. \dQuote{hg18}). } \section{Accessors}{ In the code snippets below, \code{x} is a \code{IntegerRangesList} object. \describe{ \item{}{ \code{chrom(x), chrom(x) <- value}: Gets or sets the chromosome names for \code{x}. This is an alias for \code{names(x)}. } } } \author{ Michael Lawrence } \keyword{classes} \keyword{methods} rtracklayer/man/laySequence-methods.Rd0000644000175100017510000000047714614231172021107 0ustar00biocbuildbiocbuild\name{sequence<--methods} \docType{methods} \alias{sequence<-} \alias{sequence<--methods} \title{ Load a sequence } \description{ Methods for loading sequences. } \section{Methods}{ \describe{ No methods are defined by \pkg{rtracklayer} for the \code{sequence(object, ...) <- value} generic. }} \keyword{methods} rtracklayer/man/layTrack-methods.Rd0000644000175100017510000000153714614231172020401 0ustar00biocbuildbiocbuild\name{track<--methods} \docType{methods} \alias{track<-} \alias{track<--methods} \alias{track<-,BrowserSession,ANY-method} \title{ Laying tracks } \description{ Methods for loading tracks into genome browsers. } \usage{ track(object, ...) <- value } \arguments{ \item{object}{A \code{\linkS4class{BrowserSession}} into which the track is loaded.} \item{value}{The track(s) to load.} \item{\dots}{Arguments to pass on to methods. Can be: \itemize{ \item{name}{The name(s) of the track(s) being loaded.} \item{view}{Whether to create a view of the track after loading it.} } } } \seealso{\code{\link{track}} for getting a track from a session.} \examples{ \dontrun{ session <- browserSession() track <- import(system.file("tests", "v1.gff", package = "rtracklayer")) track(session, "My Track") <- track } } \keyword{methods} rtracklayer/man/liftOver.Rd0000644000175100017510000000244114614231172016753 0ustar00biocbuildbiocbuild\name{liftOver} \alias{liftOver} \alias{liftOver,GenomicRanges,Chain-method} \alias{liftOver,Pairs,Chain-method} \alias{liftOver,ANY,ANY-method} \title{ Lift intervals between genome builds } \description{ A reimplementation of the UCSC liftover tool for lifting features from one genome build to another. In our preliminary tests, it is significantly faster than the command line tool. Like the UCSC tool, a chain file is required input. } \usage{ liftOver(x, chain, ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{ The intervals to lift-over, usually a \code{\link[GenomicRanges:GRanges]{GRanges}}. } \item{chain}{ A \code{\linkS4class{Chain}} object, usually imported with \code{\link{import.chain}}, or something coercible to one. } \item{\dots}{ Arguments for methods. } } \value{ A \code{GRangesList} object. Each element contains the ranges mapped from the corresponding element in the input (may be one-to-many). } \references{ \url{https://genome.ucsc.edu/cgi-bin/hgLiftOver} } \examples{ \dontrun{ chain <- import.chain("hg19ToHg18.over.chain") library(TxDb.Hsapiens.UCSC.hg19.knownGene) tx_hg19 <- transcripts(TxDb.Hsapiens.UCSC.hg19.knownGene) tx_hg18 <- liftOver(tx_hg19, chain) } } \author{ Michael Lawrence } rtracklayer/man/Quickload-class.Rd0000644000175100017510000000401014614231172020172 0ustar00biocbuildbiocbuild\name{Quickload-class} \docType{class} %% Classes: \alias{class:Quickload} \alias{Quickload-class} %% Constructor: \alias{Quickload} %% Accessors: \alias{$,Quickload-method} \alias{[[,Quickload,ANY,ANY-method} \alias{genome,Quickload-method} \alias{length,Quickload-method} %% Coercion: \alias{coerce,character,Quickload-method} %% Show: \alias{show,Quickload-method} \title{Quickload Access} \description{ The \code{Quickload} class represents a Quickload data source, essentially directory layout separating tracks and sequences by genome, along with a few metadata files. This interface abstracts those details and provides access to a Quickload at any URL supported by R (HTTP, FTP, and local files). This is an easy way to make data accessible to the Integrated Genome Browser (IGB). } \section{Constructor}{ \describe{ \item{}{ \code{Quickload(uri = "quickload", create = FALSE)}: Constructs a new \code{Quickload} object, representing a repository at \code{uri}. If \code{create} is \code{TRUE}, and \code{uri} is writeable (i.e., local), the repository is created if it does not already exist. If it does exist, then a message is emitted to indicate that the repository was not recreated. } } } \section{Accessor Methods}{ In the code snippets below, \code{x} represents a \code{Quickload} object. \describe{ \item{}{\code{x$genome}, \code{x[["genome"]]}: Get the \code{\linkS4class{QuickloadGenome}} object for the genome named \code{genome}. This is where all the data is stored. } \item{}{\code{length(x)}: number of genomes in the repository } \item{}{\code{uri(x)}: Get the URI pointing to the Quickload repository. } \item{}{\code{genome(x)}: Get the identifiers of the genomes present in the repository. } } } \author{Michael Lawrence} \examples{ ql <- Quickload(system.file("tests", "quickload", package = "rtracklayer")) uri(ql) genome(ql) ql$T_species_Oct_2011 } \keyword{methods} \keyword{classes} rtracklayer/man/QuickloadGenome-class.Rd0000644000175100017510000001523214614231172021335 0ustar00biocbuildbiocbuild\name{QuickloadGenome-class} \docType{class} %% Classes: \alias{class:QuickloadGenome} \alias{QuickloadGenome-class} %% Constructor: \alias{QuickloadGenome} %% Accessors: \alias{seqinfo,QuickloadGenome-method} \alias{seqinfo,DNAStringSet-method} % sneak it in here \alias{seqinfo<-,QuickloadGenome-method} \alias{genome,QuickloadGenome-method} \alias{length,QuickloadGenome-method} \alias{names,QuickloadGenome-method} \alias{quickload} \alias{mcols,QuickloadGenome-method} \alias{releaseDate,QuickloadGenome-method} \alias{organism,QuickloadGenome-method} \alias{uri,QuickloadGenome-method} %% Data Access: \alias{track,QuickloadGenome-method} \alias{track<-,QuickloadGenome,ANY-method} \alias{track<-,QuickloadGenome,BiocFile-method} \alias{track<-,QuickloadGenome,RsamtoolsFile-method} \alias{track<-,QuickloadGenome,character-method} \alias{referenceSequence} \alias{referenceSequence<-} \alias{referenceSequence,QuickloadGenome-method} \alias{referenceSequence<-,QuickloadGenome-method} %% Show \alias{show,QuickloadGenome-method} \title{Quickload Genome Access} \description{ A Quickload data source is a collection of tracks and sequences, separated by genome. This class, \code{QuickloadGenome} provides direct access to the data for one particular genome. } \section{Constructor}{ \describe{ \item{}{ \code{QuickloadGenome(quickload, genome, create = FALSE, seqinfo = seqinfo(genome), title = toString(genome))}: Constructs a new \code{QuickloadGenome} object, representing \code{genome} in the repository \code{quickload} (a URI string or a \code{\linkS4class{Quickload}} object). The \code{genome} argument can be an ID corresponding to a genome (potentially) in \code{quickload} or an installed \code{BSgenome} package. It can also be any instance of a class which has methods for \code{organism} and \code{releaseDate}. A good example is \code{\link[BSgenome]{BSgenome}} or any other derivative of \code{\link[GenomeInfoDb]{GenomeDescription}}. Those items are necessary for constructing the canonical Quickload genome string (G_Species_Month_Year). If \code{create} is \code{TRUE}, and the genome does not already exist, the genome will be created, using \code{seqinfo} for the sequence lengths and \code{title} for the display name of the genome in a UI. Creation only works if the repository is local and writeable. Reasonable defaults are used for \code{seqinfo} and \code{title} when the necessary methods are available (and they are for \code{BSgenome}). } } } \section{Accessor Methods}{ In the code snippets below, \code{x} and \code{object} represent a \code{Quickload} object. \describe{ \item{}{ \code{seqinfo(x)}, \code{seqinfo(x) <- value}: Gets or sets the \code{\link[GenomeInfoDb]{Seqinfo}} object indicating the lengths of the sequences in the genome. No circularity information or genome identifier is stored. } \item{}{ \code{quickload(x)}: Get the Quickload object that contains this genome. } \item{}{ \code{uri(x)}: Get the uri pointing to the genome directory in the Quickload repository } \item{}{ \code{genome(x)}: Get the name of the genome, e.g. \dQuote{H_sapiens_Feb_2009}. } \item{}{ \code{releaseDate(x)}: Get the release portion of the genome name, e.g., \dQuote{Feb_2009}. } \item{}{ \code{organism(object)}: Get the organism portion of the genome name, e.g., \dQuote{H sapiens}. } } } \section{Data Access}{ \describe{ \item{}{ \code{length(x)}: number of datasets } \item{}{ \code{names(x), trackNames(x)}: names of the datasets } \item{}{ \code{mcols(x)}: merged metadata on the datasets } \item{}{ \code{track(x, name), x$name}: get the track called \code{name} } \item{}{ \code{track(x, name, format = bestFileFormat(value), ...) <- value, x$name <- value}: store the track \code{value} under \code{name}. Note that track storing is only supported for local repositories, i.e., those with a \code{file://} URI scheme. Currently, supported \code{value} types include a \code{GenomicRanges}, \code{GRangesList}, or a file resource (copied to the repository). The file resource may be represented as a path, URL, \code{\link[BiocIO:BiocFile-class]{BiocFile}} or \code{\link[Rsamtools:RsamtoolsFile-class]{RsamtoolsFile}}. If not a file name, \code{value} is written in \code{format}. For generic interval data, this means a BigWig file (if there is a numeric \dQuote{score} column) or a BED file otherwise. An \code{RleList} (e.g., coverage) is output as BigWig. For \code{UCSCData} values, the format is chosen according to the type of track line. For \code{RsamtoolsFile} objects, the file and its index are copied. The arguments in \code{...} become attributes in the XML metadata. The \dQuote{description} attribute is standard and is a blurb for describing the track in a UI. For the rest, the interpretation is up to the client. IGB supports an ever-growing list; please see its documentation. } \item{}{ \code{referenceSequence(x)}: Get the reference sequence, as a \code{DNAStringSet}. } \item{}{ \code{referenceSequence(x) <- value}: Set the reference sequence, as a \code{DNAStringSet}. It is written as a 2bit file. This only works on local repositories. } } } \author{Michael Lawrence} \examples{ tests_dir <- system.file("tests", package = "rtracklayer") ql <- Quickload(file.path(tests_dir, "quickload")) qlg <- QuickloadGenome(ql, "T_species_Oct_2011") seqinfo(qlg) organism(qlg) releaseDate(qlg) names(qlg) mcols(qlg) if (.Platform$OS.type != "windows") { # temporary qlg$bedData } \dontrun{ ## populating the test repository ql <- Quickload(file.path(tests_dir, "quickload"), create = TRUE) reference_seq <- import(file.path(tests_dir, "test.2bit")) names(reference_seq) <- "test" qlg <- QuickloadGenome(ql, "T_species_Oct_2011", create = TRUE, seqinfo = seqinfo(reference_seq)) referenceSequence(qlg) <- reference_seq test_bed <- import(file.path(tests_dir, "test.bed")) names(test_bed) <- "test" qlg$bedData <- test_bed test_bedGraph <- import(file.path(tests_dir, "test.bedGraph")) names(test_bedGraph) <- "test" start(test_bedGraph) <- seq(1, 90, 10) width(test_bedGraph) <- 10 track(qlg, "bedGraphData", format = "bw") <- test_bedGraph } } \keyword{methods} \keyword{classes} rtracklayer/man/readGFF.Rd0000644000175100017510000000650114614231172016420 0ustar00biocbuildbiocbuild\name{readGFF} \alias{readGFF} \alias{GFFcolnames} \title{Reads a file in GFF format} \description{ Reads a file in GFF format and creates a data frame or \link[S4Vectors]{DataFrame} object from it. This is a low-level function that should not be called by user code. } \usage{ readGFF(filepath, version=0, columns=NULL, tags=NULL, filter=NULL, nrows=-1, raw_data=FALSE) GFFcolnames(GFF1=FALSE) } \arguments{ \item{filepath}{ A single string containing the path or URL to the file to read. Alternatively can be a connection. } \item{version}{ \code{readGFF} should do a pretty descent job at detecting the GFF version. Use this argument \emph{only} if it doesn't or if you want to force it to parse and import the file as if its 9-th column was in a different format than what it really is (e.g. specify \code{version=1} on a GTF or GFF3 file to interpret its 9-th column as the \code{"group"} column of a GFF1 file). Supported versions are 1, 2, and 3. } \item{columns}{ The standard GFF columns to load. All of them are loaded by default. } \item{tags}{ The tags to load. All of them are loaded by default. } \item{filter}{ } \item{nrows}{ \code{-1} or the maximum number of rows to read in (after filtering). } \item{raw_data}{ } \item{GFF1}{ } } \value{ A DataFrame with columns corresponding to those in the GFF. } \author{ H. Pages } \seealso{ \itemize{ \item \code{\link{import}} for importing a GFF file as a \link[GenomicRanges]{GRanges} object. \item \code{\link[GenomicRanges]{makeGRangesFromDataFrame}} in the \pkg{GenomicRanges} package for making a \link[GenomicRanges]{GRanges} object from a data frame or \link[S4Vectors]{DataFrame} object. \item \code{\link[txdbmaker]{makeTxDbFromGFF}} in the \pkg{txdbmaker} package for importing a GFF file as a \link[GenomicFeatures]{TxDb} object. \item The \link[S4Vectors]{DataFrame} class in the \pkg{S4Vectors} package. } } \examples{ ## Standard GFF columns. GFFcolnames() GFFcolnames(GFF1=TRUE) # "group" instead of "attributes" tests_dir <- system.file("tests", package="rtracklayer") test_gff3 <- file.path(tests_dir, "genes.gff3") ## Load everything. df0 <- readGFF(test_gff3) head(df0) ## Load some tags only (in addition to the standard GFF columns). my_tags <- c("ID", "Parent", "Name", "Dbxref", "geneID") df1 <- readGFF(test_gff3, tags=my_tags) head(df1) ## Load no tags (in that case, the "attributes" standard column ## is loaded). df2 <- readGFF(test_gff3, tags=character(0)) head(df2) ## Load some standard GFF columns only (in addition to all tags). my_columns <- c("seqid", "start", "end", "strand", "type") df3 <- readGFF(test_gff3, columns=my_columns) df3 table(df3$seqid, df3$type) makeGRangesFromDataFrame(df3, keep.extra.columns=TRUE) ## Combine use of 'columns' and 'tags' arguments. readGFF(test_gff3, columns=my_columns, tags=c("ID", "Parent", "Name")) readGFF(test_gff3, columns=my_columns, tags=character(0)) ## Use the 'filter' argument to load only features of type "gene" ## or "mRNA" located on chr10. my_filter <- list(type=c("gene", "mRNA"), seqid="chr10") readGFF(test_gff3, filter=my_filter) readGFF(test_gff3, columns=my_columns, tags=character(0), filter=my_filter) } \keyword{manip} rtracklayer/man/TabixFile-methods.Rd0000644000175100017510000000602314614231172020471 0ustar00biocbuildbiocbuild\name{TabixFile-methods} \alias{import,TabixFile,ANY,ANY-method} \alias{exportToTabix} \alias{exportToTabix,ANY,character-method} % undocumented/internal for now \alias{export,GenomicRanges,TabSeparatedFile,ANY-method} \alias{export,ANY,TabSeparatedFile,ANY-method} \title{TabixFile Import/Export} \description{ These methods support the import and export of \code{Rsamtools:TabixFile}{TabixFile} objects. These are generally useful when working with tabix-indexed files that have a non-standard format (i.e., not BED nor GFF), as well as exporting an object with arbitrary columns (like a GRanges) to an indexed, tab-separated file. This relies on the tabix header, which indicates the columns in the file that correspond to the chromosome, start and end. The BED and GFF parsers handle tabix transparently. } \usage{ \S4method{import}{TabixFile,ANY,ANY}(con, format, text, which = if (is.na(genome)) NULL else as(seqinfoForGenome(genome), "GenomicRanges"), genome = NA, header = TRUE, ...) exportToTabix(object, con, ...) } \arguments{ \item{con}{For \code{import}, a \code{TabixFile} object; for \code{exportToTabix}, a string naming the destination file. } \item{object}{The object to export. It is coerced to a \code{data.frame}, written to a tab-separated file, and indexed with tabix for efficient range-based retrieval of the data using \code{import}. } \item{format}{If any known format, like \dQuote{bed} or \dQuote{gff} (or one of their variants), then the appropriate parser is applied. If any other value, then the tabix header is consulted for the format. By default, this is taken from the file extension. } \item{text}{Ignored.} \item{which}{A range data structure coercible to \code{IntegerRangesList}, like a \code{GRanges}. Only the intervals in the file overlapping the given ranges are returned. The default is to use the range over the entire genome given by \code{genome}, if specified. } \item{genome}{The identifier of a genome, or \code{NA} if unknown. Typically, this is a UCSC identifier like \dQuote{hg19}. An attempt will be made to derive the \code{seqinfo} on the return value using either an installed BSgenome package or UCSC, if network access is available. } \item{header}{If \code{TRUE}, then the header in the indexed file, which might include a track line, is sent to the parser. Otherwise, the initial lines are skipped, according to the \code{skip} field in the tabix index header. } \item{...}{Extra arguments to pass to the underlying import routine, which for non-standard formats is \code{\link{read.table}} or \code{\link{write.table}}. } } \value{ For \code{import}, a \code{GRanges} object. For \code{exportToTabix}, a \code{TabixFile} object that is directly passable to \code{import}. } \references{ \url{http://samtools.sourceforge.net/tabix.shtml} } \seealso{ \code{\link[Rsamtools]{scanTabix}} and friends } \author{Michael Lawrence} rtracklayer/man/targets.Rd0000644000175100017510000000212614614231172016632 0ustar00biocbuildbiocbuild\name{targets} \Rdversion{1.1} \alias{targets} \docType{data} \title{microRNA target sites} \description{ A data frame of human microRNA target sites retrieved from MiRBase. This is a subset of the \code{hsTargets} data frame in the \code{microRNA} package. See the \code{rtracklayer} vignette for more details. } \usage{data(targets)} \format{ A data frame with 2981 observations on the following 6 variables. \describe{ \item{\code{name}}{The miRBase ID of the microRNA.} \item{\code{target}}{The Ensembl ID of the targeted transcript.} \item{\code{chrom}}{The name of the chromosome for target site.} \item{\code{start}}{Target start position.} \item{\code{end}}{Target stop position.} \item{\code{strand}}{The strand of the target site, \code{"+"}, or \code{"-"}.} } } \source{ The \code{microRNA} package, dataset \code{hsTargets}. Originally MiRBase (\url{http://microrna.sanger.ac.uk/}). } \examples{ data(targets) targetTrack <- with(targets, GenomicData(IRanges::IRanges(start, end), strand = strand, chrom = chrom)) } \keyword{datasets} rtracklayer/man/TrackDb-class.Rd0000644000175100017510000000255614614231172017605 0ustar00biocbuildbiocbuild\name{TrackDb-class} \docType{class} %% Classes: \alias{class:TrackDb} \alias{TrackDb-class} %% Accessors: \alias{$,TrackDb-method} \alias{$<-,TrackDb-method} \alias{[[,TrackDb,ANY,ANY-method} \alias{[[<-,TrackDb,ANY,ANY-method} %% Data Access: \alias{track<-,TrackDb,ANY-method} \title{Track Databases} \description{ The \code{TrackDb} class is an abstraction around a database of tracks. Implementations include \code{\linkS4class{BrowserSession}} derivatives and \code{\linkS4class{QuickloadGenome}}. Here, a track is defined as an interval dataset. } \section{Accessor Methods}{ Every implementation should support these methods: \describe{ \item{}{ \code{length(x)}: number of tracks } \item{}{ \code{names(x)}, \code{trackNames(x)}: names of the tracks } \item{}{ \code{mcols(x)}: merged metadata on the tracks } \item{}{ \code{track(x, name)}, \code{x$name}, \code{x[[name]]}: get the track called \code{name} } \item{}{ \code{track(x, name) <- value}, \code{x$name <- value}, \code{x[[name]] <- value}: store the track \code{value} under \code{name}. Different implementations will support different types for \code{value}. Generally, an interval data structure like \code{GenomicRanges}. } } } \author{Michael Lawrence} \keyword{methods} \keyword{classes} rtracklayer/man/TrackHub-class.Rd0000644000175100017510000001122014614231172017762 0ustar00biocbuildbiocbuild\name{TrackHub-class} \docType{class} %% Classes: \alias{class:TrackHub} \alias{TrackHub-class} %% Constructor: \alias{TrackHub} %% Accessors: \alias{$,TrackHub-method} \alias{[[,TrackHub,ANY,ANY-method} \alias{genome,TrackHub-method} \alias{length,TrackHub-method} \alias{uri} \alias{writeTrackHub} %% Data Access: \alias{hub,TrackHub-method} \alias{hub<-,TrackHub-method} \alias{shortLabel,TrackHub-method} \alias{shortLabel<-,TrackHub-method} \alias{longLabel,TrackHub-method} \alias{longLabel<-,TrackHub-method} \alias{genomeFile,TrackHub-method} \alias{genomeFile<-,TrackHub-method} \alias{email,TrackHub-method} \alias{email<-,TrackHub-method} \alias{descriptionUrl,TrackHub-method} \alias{descriptionUrl<-,TrackHub-method} \alias{genomeField,TrackHub-method} \alias{genomeField<-,TrackHub-method} \alias{genomeInfo,TrackHub-method} \alias{genomeInfo<-,TrackHub-method} %% Coercion: \alias{coerce,character,TrackHub-method} %% Show: \alias{show,TrackHub-method} \title{TrackHub Access} \description{ The \code{TrackHub} class represents a TrackHub data source, essentially directory layout separating tracks and sequences by genome, along with a few metadata files. This interface abstracts those details and provides access to a TrackHub at any URL supported by R (HTTP, FTP, and local files). This is an easy way to make data accessible to the UCSC Genome Browser. } \section{Constructor}{ \describe{ \item{}{ \code{TrackHub(uri, create = FALSE)}: Constructs a new \code{TrackHub} object, representing a repository at \code{uri}. If \code{create} is \code{TRUE}, and \code{uri} is writeable (i.e., local), the repository is created if it does not already exist. If it does exist, then a message is emitted to indicate that the repository was not recreated. } } } \section{Accessor Methods}{ In the code snippets below, \code{x} represents a \code{TrackHub} object. \describe{ \item{}{\code{x$genome}, \code{x[["genome"]]}: Get the \code{\linkS4class{TrackHubGenome}} object for the genome named \code{genome}. } \item{}{\code{length(x)}: number of genomes in the repository. } \item{}{\code{uri(x)}: Get the URI pointing to the TrackHub repository. } \item{}{\code{genome(x)}: Get the identifiers of the genomes present in the repository. } \item{}{\code{writeTrackHub(x)}: Write hub content and genomes from memory representation to the hub file and genomes file. It also create resources if they are missing like genomes file and genome directory for newly add genome. } } } \section{Data Access}{ Note that all storing methods(like \code{hub()<-}) are only supported for local repositories, i.e., those with a file:// URI scheme. \describe{ \item{}{ \code{hub(x)}: get the value of hub. } \item{}{ \code{hub(x) <- value}: store the \code{value} of hub for \code{x}. } \item{}{ \code{shortLabel(x)}: get the value of hub. } \item{}{ \code{shortLabel(x) <- value}: store the \code{value} of shortLabel for \code{x}. } \item{}{ \code{longLabel(x)}: get the value of hub. } \item{}{ \code{longLabel(x) <- value}: store the \code{value} of longLabel for \code{x}. } \item{}{ \code{genomeFile(x)}: get the value of hub. } \item{}{ \code{genomeFile(x) <- value}: store the \code{value} of genomesFile for \code{x}. } \item{}{ \code{email(x)}: get the value of hub. } \item{}{ \code{email(x) <- value}: store the \code{value} of email for \code{x}. } \item{}{ \code{descriptionUrl(x)}: get the value of hub. } \item{}{ \code{descriptionUrl(x) <- value}: store the \code{value} of descriptionUrl for \code{x}. } \item{}{ \code{genomeField(x, name, field)}: Get the \code{value} of \code{field} for \code{name} genome. } \item{}{ \code{genomeField(x, name, field) <- value}: Set or Update the \code{field} and \code{value} for \code{name} genome. } \item{}{ \code{genomeInfo(x, name)}: Get the \code{Genome} object for \code{name} genome. } \item{}{ \code{genomeInfo(x) <- value}: Add \code{value} (Genome object) to existing genomes list. \code{Genome} takes named arguemnts of all UCSC supported fields for genome file(like \code{genome, trackDb, twoBitPath}, etc). } } } \author{Michael Lawrence} \examples{ th <- TrackHub(system.file("tests", "trackhub", package = "rtracklayer")) uri(th) genome(th) length(th) th$hg19 th[["hg19"]] hub(th) email(th) \dontrun{ hub(th) <- "new_hub" writeTrackHub(th) } } \keyword{methods} \keyword{classes} rtracklayer/man/TrackHubGenome-class.Rd0000644000175100017510000001245414614231172021127 0ustar00biocbuildbiocbuild\name{TrackHubGenome-class} \docType{class} %% Classes: \alias{class:TrackHubGenome} \alias{TrackHubGenome-class} %% Constructor: \alias{TrackHubGenome} %% Accessors: \alias{uri,TrackHubGenome-method} \alias{genome,TrackHubGenome-method} \alias{length,TrackHubGenome-method} \alias{names,TrackHubGenome-method} \alias{getTracks,TrackHubGenome-method} \alias{trackhub} \alias{organism,TrackHubGenome-method} \alias{trackField,TrackHubGenome-method} \alias{trackField<-,TrackHubGenome-method} \alias{writeTrackHub,TrackHubGenome-method} %% Data Access: \alias{track,TrackHubGenome-method} \alias{track<-,TrackHubGenome,ANY-method} \alias{track<-,TrackHubGenome,RTLFile-method} \alias{track<-,TrackHubGenome,RsamtoolsFile-method} \alias{track<-,TrackHubGenome,character-method} \alias{referenceSequence,TrackHubGenome-method} \alias{referenceSequence<-,TrackHubGenome-method} %% Show \alias{show,TrackHubGenome-method} \title{TrackHub Genome Access} \description{ A TrackHub data source is a collection of tracks and sequences, separated by genome. This class, \code{TrackHubGenome} provides direct access to the data for one particular genome. } \section{Constructor}{ \describe{ \item{}{ \code{TrackHubGenome(trackhub, genome, create = FALSE}: Constructs a new \code{TrackHubGenome} object, representing \code{genome} in the repository \code{trackhub} (a URI string or a \code{\linkS4class{TrackHub}} object). The \code{genome} argument can be an ID corresponding to a genome (potentially) in \code{trackhub} or an installed \code{BSgenome} package. If \code{create} is \code{TRUE}, and the trackDb file does not already exist, it will be created. Creation only works if the repository is local and writeable. } } } \section{Accessor Methods}{ In the code snippets below, \code{x} represent a \code{TrackHubGenome} object. \describe{ \item{}{ \code{uri(x)}: Get the uri pointing to the genome directory in the TrackHub repository. } \item{}{ \code{genome(x)}: Get the name of the genome, e.g. \dQuote{hg19}. } \item{}{ \code{length(x)}: number of tracks } \item{}{ \code{names(x), trackNames(x)}: names of the tracks } \item{}{ \code{getTracks(x)}: Get the \code{List} of \code{Track} from the tracks } \item{}{ \code{trackhub(x)}: Get the TrackHub object that contains this genome. } \item{}{ \code{organism(x)}: Get the organism name for this genome, e.g., \dQuote{H sapiens}. } \item{}{ \code{trackField(x, name, field)}: Get the \code{value} of \code{field} for \code{name} track. } \item{}{ \code{trackField(x, name, field) <- value}: Store the \code{field} and \code{value} for \code{name} track. } \item{}{\code{writeTrackHub(x)}: Write tracks from memory representation to the trackDb file. } } } \section{Data Access}{ \describe{ \item{}{ \code{track(x, name), x$name}: get the track called \code{name} } \item{}{ \code{track(x, name, format = bestFileFormat(value)) <- value, x$name <- value}: store the track \code{value} under \code{name}. Note that track storing is only supported for local repositories, i.e., those with a \code{file://} URI scheme. Currently, supported \code{value} types include a \code{GenomicRanges}, \code{GRangesList}, or a file resource (copied to the repository). The file resource may be represented as a path, URL, \code{\linkS4class{BiocFile}} or \code{\link[Rsamtools:RsamtoolsFile-class]{RsamtoolsFile}}. If not a file name, \code{value} is written in \code{format}. For generic interval data, this means a BigWig file (if there is a numeric \dQuote{score} column) or a BED file otherwise. An \code{RleList} (e.g., coverage) is output as BigWig. For \code{UCSCData} values, the format is chosen according to the type of track line. For \code{RsamtoolsFile} objects, the file and its index are copied. } \item{}{ \code{referenceSequence(x)}: Get the reference sequence, as a \code{DNAStringSet}. } \item{}{ \code{referenceSequence(x) <- value}: Set the reference sequence, as a \code{DNAStringSet}. It is written as a 2bit file. This only works on local repositories. } } } \author{Michael Lawrence} \examples{ tests_dir <- system.file("tests", package = "rtracklayer") th <- TrackHub(file.path(tests_dir, "trackhub")) thg <- TrackHubGenome(th, "hg19") length(thg) organism(thg) names(thg) \dontrun{ th <- TrackHub(file.path(tests_dir, "trackhub"), create = TRUE) genomesFile(th) <- "genomes.txt" genomeInfo(th) <- Genome(genome = "hg38", trackDb = "hg38/trackDb.txt") genomeField(th, "hg38", "twoBitPath") <- "hg38/seq.2bit" writeTrackHub(th) thg <- TrackHubGenome(th, "hg38", create = TRUE) seq <- import(file.path(tests_dir, "test.2bit")) referenceSequence(thg) <- seq track(thg, "PeaksData") <- paste0(tests_dir, "/test.bigWig") trackField(thg, "wgEncodeUWDukeDnaseGM12878FdrPeaks", "bigDataUrl") <- "hg38/wgEncodeCshlShortRnaSeq.bigWig" trackField(thg, "wgEncodeUWDukeDnaseGM12878FdrPeaks", "color") <- "8,104,172" writeTrackHub(thg) } } \keyword{methods} \keyword{classes} rtracklayer/man/tracks-methods.Rd0000644000175100017510000000267014614231172020115 0ustar00biocbuildbiocbuild\name{tracks-methods} \docType{methods} \alias{trackNames} \alias{trackNames<-} \alias{trackNames<--methods} \alias{trackNames<-,UCSCTrackModes-method} \alias{trackNames<-,UCSCView-method} \alias{trackNames-methods} \alias{trackNames,UCSCSession-method} \alias{trackNames,UCSCTrackModes-method} \alias{trackNames,UCSCView-method} \title{ Accessing track names } \description{ Methods for getting and setting track names. } \section{Methods}{ \describe{ The following methods are defined by \pkg{rtracklayer} for \bold{getting} track names via the generic \code{trackNames(object, ...)}. \item{object = "UCSCSession"}{ Get the tracks loaded in the session. } \item{object = "UCSCTrackModes"}{ Get the visible tracks according to the modes (all tracks not set to "hide").} \item{object = "UCSCView"}{ Get the visible tracks in the view. } The following methods are defined by \pkg{rtracklayer} for \bold{setting} track names via the generic \code{trackNames(object) <- value}. \item{object = "UCSCTrackModes"}{ Sets the tracks that should be visible in the modes. All specified tracks with mode "hide" in \code{object} are set to mode "full". Any tracks in \code{object} that are not specified in the value are set to "hide". No other modes are changed.} \item{object = "UCSCView"}{ Sets the visible tracks in the view. This opens a new web browser with only the specified tracks visible. } }} \keyword{methods} rtracklayer/man/TwoBitFile-class.Rd0000644000175100017510000001105714614231172020277 0ustar00biocbuildbiocbuild\name{TwoBitFile-class} \docType{class} %% Classes: \alias{class:TwoBitFile} \alias{TwoBitFile-class} \alias{class:2BitFile} \alias{2BitFile-class} %% Constructor: \alias{TwoBitFile} \alias{2BitFile} %% Accessors: \alias{seqinfo,TwoBitFile-method} %% Import: \alias{import.2bit} \alias{import.2bit,ANY-method} \alias{import,TwoBitFile,ANY,ANY-method} \alias{getSeq,TwoBitFile-method} %% Export: \alias{export.2bit} \alias{export.2bit,ANY-method} \alias{export,DNAStringSet,TwoBitFile,ANY-method} \alias{export,DNAStringSet,character,ANY-method} \alias{export,ANY,TwoBitFile,ANY-method} \title{2bit Files} \description{ These functions support the import and export of the UCSC 2bit compressed sequence format. The main advantage is speed of subsequence retrieval, as it only loads the sequence in the requested intervals. Compared to the FA format supported by Rsamtools, 2bit offers the additional feature of masking and also has better support in Java (and thus most genome browsers). The supporting \code{TwoBitFile} class is a reference to a TwoBit file. } \usage{ \S4method{import}{TwoBitFile,ANY,ANY}(con, format, text, which = as(seqinfo(con), "GenomicRanges"), ...) \S4method{getSeq}{TwoBitFile}(x, which = as(seqinfo(x), "GenomicRanges")) import.2bit(con, ...) \S4method{export}{ANY,TwoBitFile,ANY}(object, con, format, ...) \S4method{export}{DNAStringSet,TwoBitFile,ANY}(object, con, format) \S4method{export}{DNAStringSet,character,ANY}(object, con, format, ...) export.2bit(object, con, ...) } \arguments{ \item{con}{A path, URL or \code{TwoBitFile} object. Connections are not supported. For the functions ending in \code{.2bit}, the file format is indicated by the function name. For the \code{export} and \code{import} methods, the format must be indicated another way. If \code{con} is a path, or URL, either the file extension or the \code{format} argument needs to be \dQuote{twoBit} or \dQuote{2bit}. } \item{object,x}{The object to export, either a \code{DNAStringSet} or something coercible to a \code{DNAStringSet}, like a character vector. } \item{format}{If not missing, should be \dQuote{twoBit} or \dQuote{2bit} (case insensitive). } \item{text}{Not supported.} \item{which}{A range data structure coercible to \code{IntegerRangesList}, like a \code{GRanges}, or a \code{TwoBitFile}. Only the intervals in the file overlapping the given ranges are returned. By default, the value is the \code{TwoBitFile} itself. Its \code{Seqinfo} object is extracted and coerced to a \code{IntegerRangesList} that represents the entirety of the file. } \item{...}{Arguments to pass down to methods to other methods. For import, the flow eventually reaches the \code{TwoBitFile} method on \code{import}. For export, the \code{TwoBitFile} methods on \code{export} are the sink. } } \value{ For import, a \code{DNAStringSet}. } \note{ The 2bit format only suports A, C, G, T and N (via an internal mask). To export sequences with additional IUPAC ambiguity codes, first pass the object through \code{\link[Biostrings]{replaceAmbiguities}} from the Biostrings package. } \section{\code{TwoBitFile} objects}{ A \code{TwoBitFile} object, an extension of \code{\link[BiocIO:BiocFile-class]{BiocFile-class}} is a reference to a TwoBit file. To cast a path, URL or connection to a \code{TwoBitFile}, pass it to the \code{TwoBitFile} constructor. A TwoBit file embeds the sequence information, which can be retrieved with the following: \describe{ \item{}{ \code{seqinfo(x)}: Gets the \code{\link[GenomeInfoDb]{Seqinfo}} object indicating the lengths of the sequences for the intervals in the file. No circularity or genome information is available. } } } \seealso{ \link[BSgenome]{export-methods} in the \pkg{BSgenome} package for exporting a \link[BSgenome]{BSgenome} object as a twoBit file. } \author{Michael Lawrence} \examples{ test_path <- system.file("tests", package = "rtracklayer") test_2bit <- file.path(test_path, "test.2bit") test <- import(test_2bit) test test_2bit_file <- TwoBitFile(test_2bit) import(test_2bit_file) # the whole file which_range <- IRanges(c(10, 40), c(30, 42)) which <- GRanges(names(test), which_range) import(test_2bit, which = which) seqinfo(test_2bit_file) \dontrun{ test_2bit_out <- file.path(tempdir(), "test_out.2bit") export(test, test_2bit_out) ## just a character vector test_char <- as.character(test) export(test_char, test_2bit_out) } } \keyword{methods} \keyword{classes} rtracklayer/man/UCSCData-class.Rd0000644000175100017510000000500314614231172017610 0ustar00biocbuildbiocbuild\name{UCSCData-class} \docType{class} \alias{UCSCData-class} \alias{export.bed,UCSCData,character_OR_connection-method} \alias{export.bed15,UCSCData-method} \alias{export.gff,UCSCData,character_OR_connection-method} \alias{export.ucsc,UCSCData,character_OR_connection-method} \alias{initialize,UCSCData-method} \alias{show,UCSCData-method} \alias{coerce,GRanges,UCSCData-method} \alias{coerce,UCSCData,GRanges-method} \alias{split,UCSCData,ANY-method} \alias{split,UCSCData,Vector-method} \title{Class "UCSCData"} \description{Each track in \acronym{UCSC} has an associated \code{\linkS4class{TrackLine}} that contains metadata on the track.} \section{Slots}{ \describe{ \item{\code{trackLine}:}{Object of class \code{"TrackLine"} holding track metadata. } } } \section{Methods}{ \describe{ \item{\code{\link{export.bed}(object, con, variant = c("base", "bedGraph", "bed15"), color, trackLine = TRUE, ...)}}{ Exports the track and its track line (if \code{trackLine} is \code{TRUE}) to \code{con} in the Browser Extended Display (\acronym{BED}) format. The arguments in \code{...} are passed to \code{\link{export.ucsc}}. } \item{\code{\link{export.bed15}(object, con, expNames = NULL, ...)}}{ Exports the track and its track line (if \code{trackLine} is \code{TRUE}) to \code{con} in the Bed15 format. The data is taken from the columns named in \code{expNames}, which defaults to the \code{expNames} in the track line, if any, otherwise all column names. The arguments in \code{...} are passed to \code{\link{export.ucsc}}. } \item{\code{\link{export.gff}(object)}}{ Exports the track and its track line (as a comment) to \code{con} in the General Feature Format (\acronym{GFF}). } \item{\code{\link{export.ucsc}(object, con, subformat, ...)}}{ Exports the track and its track line to \code{con} in the \acronym{UCSC} meta-format. } \item{\code{as(object, "UCSCData")}}{Constructs a \code{UCSCData} from a \code{GRanges} instance, by adding a default track line and ensuring that the sequence/chromosome names are compliant with UCSC conventions. If there is a numeric score, the track line type is either "bedGraph" or "wig", depending on the feature density. Otherwise, "bed" is chosen. } } } \author{ Michael Lawrence } \seealso{ \code{\link{import}} and \code{\link{export}} for reading and writing tracks to and from connections (files), respectively. } \keyword{classes} rtracklayer/man/UCSCFile-class.Rd0000644000175100017510000001576014614231172017631 0ustar00biocbuildbiocbuild\name{UCSCFile-class} \docType{class} %% Classes: \alias{class:UCSCFile} \alias{UCSCFile-class} %% Constructor: \alias{UCSCFile} %% Import: \alias{import,UCSCFile,ANY,ANY-method} \alias{import.ucsc} \alias{import.ucsc,ANY-method} \alias{import.ucsc,BiocFile-method} %% Export: \alias{export,ANY,UCSCFile,ANY-method} \alias{export,GenomicRanges,UCSCFile,ANY-method} \alias{export,GenomicRangesList,UCSCFile,ANY-method} \alias{export,UCSCData,UCSCFile,ANY-method} \alias{export.ucsc} \alias{export.ucsc,ANY,ANY-method} \alias{export.ucsc,ANY,BiocFile-method} \title{UCSCFile objects} \description{ These functions support the import and export of tracks emucscded within the UCSC track line metaformat, whereby multiple tracks may be concatenated within a single file, along with metadata mostly oriented towards visualization. Any \code{\linkS4class{UCSCData}} object is automatically exported in this format, if the targeted format is known to be compatible. The BED and WIG import methods check for a track line, and delegate to these functions if one is found. Thus, calling this API directly is only necessary when importing embedded GFF (rare), or when one wants to create the track line during the export process. } \usage{ \S4method{import}{UCSCFile,ANY,ANY}(con, format, text, subformat = "auto", drop = FALSE, genome = NA, ...) import.ucsc(con, ...) \S4method{export}{ANY,UCSCFile,ANY}(object, con, format, ...) \S4method{export}{GenomicRanges,UCSCFile,ANY}(object, con, format, ...) \S4method{export}{GenomicRangesList,UCSCFile,ANY}(object, con, format, append = FALSE, index = FALSE, ...) \S4method{export}{UCSCData,UCSCFile,ANY}(object, con, format, subformat = "auto", append = FALSE, index = FALSE, ...) export.ucsc(object, con, ...) } \arguments{ \item{con}{A path, URL, connection or \code{UCSCFile} object. For the functions ending in \code{.ucsc}, the file format is indicated by the function name. For the base \code{export} and \code{import} functions, \dQuote{ucsc} must be passed as the \code{format} argument. } \item{object}{The object to export, should be a \code{GRanges} or something coercible to a \code{GRanges}. For exporting multiple tracks pass a \code{GenomicRangesList}, or something coercible to one. } \item{format}{If not missing, should be \dQuote{ucsc}.} \item{text}{If \code{con} is missing, a character vector to use as the input } \item{subformat}{The file format to use for the actual features, between the track lines. Must be a text-based format that is compatible with track lines (most are). If an \code{\link[BiocIO:BiocFile-class]{BiocFile}} subclass other than \code{UCSCFile} is passed as \code{con} to \code{import.ucsc} or \code{export.ucsc}, the subformat is assumed to be the corresponding format of \code{con}. Otherwise it defaults to \dQuote{auto}. The following describes the logic of the \dQuote{auto} mode. For import, the subformat is taken as the \code{type} field in the track line. If none, the file extension is consulted. For export, if \code{object} is a \code{UCSCData}, the subformat is taken as the \code{type} in its track line, if present. Otherwise, the subformat is chosen based on whether \code{object} contains a \dQuote{score} column. If there is a score, the target is either \code{BEDGraph} or \code{WIG}, depending on the structure of the ranges. Otherwise, \code{BED} is the target. } \item{genome}{The identifier of a genome, or \code{NA} if unknown. Typically, this is a UCSC identifier like \dQuote{hg19}. An attempt will be made to derive the \code{seqinfo} on the return value using either an installed BSgenome package or UCSC, if network access is available. This defaults to the \code{db} BED track line parameter, if any. } \item{drop}{If \code{TRUE}, and there is only one track in the file, return the track object directly, rather than embedding it in a list. } \item{append}{If \code{TRUE}, and \code{con} points to a file path, the data is appended to the file. Obviously, if \code{con} is a connection, the data is always appended. } \item{index}{If \code{TRUE}, automatically compress and index the output file with bgzf and tabix. Note that tabix indexing will sort the data by chromosome and start. Tabix supports a single track in a file. } \item{...}{Should either specify track line parameters or arguments to pass down to the import and export routine for the subformat. } } \value{ A \code{GenomicRangesList} unless \code{drop} is \code{TRUE} and there is only a single track in the file. In that case, the first and only object is extracted from the list and returned. The structure of that object depends on the format of the data. The \code{GenomicRangesList} contains \code{UCSCData} objects. } \details{ The UCSC track line permits the storage of multiple tracks in a single file by separating them with a so-called \dQuote{track line}, a line belonging with the word \dQuote{track} and containing various \code{key=value} pairs encoding metadata, most related to visualization. The standard fields in a track depend on the type of track being annotated. See \code{\linkS4class{TrackLine}} and its derivatives for how these lines are represented in R. The class \code{\linkS4class{UCSCData}} is an extension of \code{GRanges} with a formal slot for a \code{TrackLine}. Each \code{GRanges} in the returned \code{GenomicRangesList} has the track line stored in its metadata, under the \code{trackLine} key. For each track object to be exported, if the object is not a \code{UCSCData}, and there is no \code{trackLine} element in the metadata, then a new track line needs to be generated. This happens through the coercion of \code{object} to \code{UCSCData}. The track line is initialized to have the appropriate \code{type} parameter for the subformat, and the required \code{name} parameter is taken from the name of the track in the input list (if any). Otherwise, the default is simply \dQuote{R Track}. The \code{db} parameter (specific to BED track lines) is taken as \code{genome(object)} if not \code{NA}. Additional arguments passed to the export routines override parameters in the provided track line. If the subformat is either WIG or BEDGraph, and the features are stranded, a separate track will be output in the file for each strand. Neither of those formats encodes the strand and disallow overlapping features (which might occur upon destranding). } \section{UCSCFile objects}{ The \code{UCSCFile} class extends \code{\link[BiocIO:BiocFile-class]{BiocFile}} and is a formal represention of a resource in the UCSC format. To cast a path, URL or connection to a \code{UCSCFile}, pass it to the \code{UCSCFile} constructor. } \author{Michael Lawrence} \references{ \url{https://genome.ucsc.edu/goldenPath/help/customTrack.html} } \keyword{methods} \keyword{classes} rtracklayer/man/ucscGenomes.Rd0000644000175100017510000000171614614231172017440 0ustar00biocbuildbiocbuild\name{ucscGenomes} \alias{ucscGenomes} \title{Get available genomes on UCSC} \description{ Get a \code{data.frame} describing the available UCSC genomes. } \usage{ ucscGenomes(organism=FALSE) } \arguments{ \item{organism}{A \code{logical(1)} indicating whether scientific name should be appended.} } \value{ A \code{data.frame} with the following columns: \item{db}{UCSC DB identifier (e.g. "hg18")} \item{species}{The name of the species (e.g. "Human")} \item{date}{The date the genome was built} \item{name}{The official name of the genome build} \item{organism}{The scientific name of the species (e.g. "Homo sapiens")} } \seealso{\code{\linkS4class{UCSCSession}} for details on specifying the genome.} \details{ For populating the organism column, the web url \url{https://genome.ucsc.edu/cgi-bin} is scraped for every assembly version to get the scientific name. } \examples{ ucscGenomes() } \author{ Michael Lawrence } \keyword{interface} rtracklayer/man/UCSCSchema-class.Rd0000644000175100017510000000222614614231172020143 0ustar00biocbuildbiocbuild\name{UCSCSchema-class} \docType{class} \alias{UCSCSchema-class} \alias{genome,UCSCSchema-method} \alias{tableName,UCSCSchema-method} \alias{genome,UCSCSchema-method} \alias{nrow,UCSCSchema-method} \alias{ucscSchema,UCSCSchemaDescription-method} % Accessors: \title{UCSC Schema} \description{This is a preliminary class that describes a table in the UCSC database. The description includes the table name, corresponding genome, row count, and a textual description of the format. In the future, we could provide more table information, like the links and sample data frame. This is awaiting a use-case.} \section{Accessor methods}{ In the code snippets below, \code{x}/\code{object} is a \code{UCSCSchema} object. \describe{ \item{}{\code{genome(x)}: Get the genome for the table. } \item{}{\code{tableName(x)}: Get the name of the table. } \item{}{\code{nrow(x)}: Get the number of rows in the table. } } } \author{ Michael Lawrence } \examples{ \dontrun{ session <- browserSession() genome(session) <- "mm9" query <- ucscTableQuery(session, "knownGene") schema <- ucscSchema(query) nrow(schema) } } \keyword{methods} \keyword{classes} rtracklayer/man/ucscSession-class.Rd0000644000175100017510000001222614614231172020567 0ustar00biocbuildbiocbuild\name{UCSCSession-class} \docType{class} \alias{UCSCSession-class} \alias{initialize,UCSCSession-method} \alias{track,UCSCSession-method} \alias{track<-,UCSCSession,GenomicRangesList-method} \alias{range<-} \alias{range<-,UCSCSession-method} \alias{track<-,UCSCSession,BiocFile-method} \alias{genome,UCSCSession-method} \alias{genome<-,UCSCSession-method} \alias{range,UCSCSession-method} \alias{seqinfo,UCSCSession-method} \alias{range,ucscCart-method} \alias{genome,ucscCart-method} \alias{getTable,UCSCSession-method} \title{Class "UCSCSession"} \description{An implementation of \code{\linkS4class{BrowserSession}} for the \acronym{UCSC} genome browser.} \section{Objects from the Class}{ Objects can be created by calls of the form \code{\link{browserSession}("ucsc", url = "https://genome.ucsc.edu/cgi-bin", ...)}. The arguments in \code{...} correspond to libcurl options, see \code{\link[httr]{httr_options}}. Setting these options may be useful e.g. for getting past a proxy. } \section{Slots}{ \describe{ \item{\code{url}:}{Object of class \code{"character"} holding the base \acronym{URL} of the \acronym{UCSC} browser. } \item{\code{hguid}:}{Object of class \code{"numeric"} holding the user identification code.} \item{\code{views}:}{Object of class \code{"environment"} containing a list stored under the name "instances". The list holds the instances of \code{\linkS4class{BrowserView}} for this session. } } } \section{Extends}{ Class \code{"\linkS4class{BrowserSession}"}, directly. } \section{Methods}{ \describe{ \item{\code{\link{browserView}(object, range = range(object), track = trackNames(object), ...)}}{ Creates a \code{\linkS4class{BrowserView}} of \code{range} with visible tracks specified by \code{track}. \code{track} may be an instance of \code{\linkS4class{UCSCTrackModes}}. Arguments in \code{...} should match parameters to a \code{\link{ucscTrackModes}} method for creating a \code{UCSCTrackModes} instance that will be merged with and override modes indicated by the \code{track} parameter. } \item{\code{\link{browserViews}}(object)}{ Gets the \code{\linkS4class{BrowserView}} instances for this session. } \item{\code{\link{range}}(x)}{ Gets the \code{\link[GenomicRanges:GRanges-class]{GRanges}} last displayed in this session.} \item{\code{genome(x)}}{Gets the genome identifier of the session, i.e. \code{genome(range(x))}.} \item{\code{seqinfo}}{ Gets the \code{\link[GenomeInfoDb]{Seqinfo}} object with the lengths of the chromosomes in the currenet genome. No circularity information is available. } \item{\code{range(x) <- value}}{ Sets \code{value}, usually a \code{GRanges} object or \code{IntegerRangesList}, as the range of session \code{x}. Note that this setting only lasts until a view is created or manipulated. This mechanism is useful, for example, when treating the UCSC browser as a database, rather than a genome viewer.} \item{\code{genome(x) <- value}}{ Sets the genome identifier on the range of session \code{x}.} \item{\code{\link[Biostrings]{getSeq}(object, range, track = "Assembly")}}{ Gets the sequence in \code{range} and \code{track}. } \item{\code{\link[=track<-]{track}(object, name = names(track), format = "auto", ...) <- value}}{ Loads a track, stored under \code{name} and formatted as \code{format}. The "auto" format resolves to "bed" for qualitative data. For quantitative data, i.e., data with a numeric \code{score} column, "wig" or "bedGraph" is chosen, depending on how well the data compresses into wig. The arguments in \code{...} are passed on to \code{\link{export.ucsc}}, so they could be slots in a \code{\linkS4class{TrackLine}} subclass (and thus specify visual attributes like color) or parameters to pass on to the export function for \code{format}. The \code{value} may be either a range object (like a \code{GRanges}) or a file object (like a \code{BEDFile}). } \item{\code{\link{track}(object, name, range = range(object), table = NULL)}}{ Retrieves a \code{\link{GRanges}} with features in \code{range} from track named \code{name}. Some built-in tracks have multiple series, each stored in a separate database table. A specific table may be retrieved by passing its name in the \code{table} parameter. See \code{\link{tableNames}} for a way to list the available tables. } \item{}{ \code{getTable(object, name, range = base::range(object), table = NULL)}: Retrieves the table indicated by the track \code{name} and \code{table} name, over \code{range}, as a \code{data.frame}. See \code{\link{getTable}}. } \item{\code{\link{trackNames}}(object)}{ Gets the names of the tracks stored in the session. } \item{\code{\link{ucscTrackModes}}(object)}{ Gets the default view modes for the tracks in the session. } } } \author{ Michael Lawrence } \seealso{ \code{\link{browserSession}} for creating instances of this class. } \keyword{classes} rtracklayer/man/UCSCTableQuery-class.Rd0000644000175100017510000001717514614231172021031 0ustar00biocbuildbiocbuild\name{UCSCTableQuery-class} \docType{class} \alias{UCSCTableQuery-class} % Accessors: \alias{genome,UCSCTableQuery-method} \alias{genome<-,UCSCTableQuery-method} \alias{hubUrl} \alias{hubUrl,UCSCTableQuery-method} \alias{hubUrl<-,UCSCTableQuery-method} \alias{tableName} \alias{tableName,UCSCTableQuery-method} \alias{tableName<-} \alias{tableName<-,UCSCTableQuery-method} \alias{range,UCSCTableQuery-method} \alias{range<-,UCSCTableQuery-method} \alias{names,UCSCTableQuery-method} \alias{names<-,UCSCTableQuery-method} \alias{ucscSchema} \alias{ucscSchema,UCSCTableQuery-method} \alias{ucscTables} % Query execution \alias{tableNames} \alias{tableNames,UCSCTableQuery-method} \alias{getTable} \alias{getTable,UCSCTableQuery-method} \alias{track} \alias{track,UCSCTableQuery-method} % Constructor: \alias{ucscTableQuery} \alias{ucscTableQuery,UCSCSession-method} \alias{ucscTableQuery,character-method} % Show: \alias{show,UCSCTableQuery-method} \title{Querying UCSC Tables} \description{The UCSC genome browser is backed by a large database, which is exposed by the Table Browser web interface. Tracks are stored as tables, so this is also the mechanism for retrieving tracks. The \code{UCSCTableQuery} class represents a query against the Table Browser. Storing the query fields in a formal class facilitates incremental construction and adjustment of a query.} \details{ There are six supported fields for a table query: \describe{ \item{provider}{ The provider should be a session, a genome identifier, or a TrackHub URI. \code{session}: The \code{\linkS4class{UCSCSession}} instance from the tables are retrieved. Although all sessions are based on the same database, the set of user-uploaded tracks, which are represented as tables, is not the same, in general. } \item{tableName}{The name of the specific table to retrieve. May be \code{NULL}, in which case the behavior depends on how the query is executed, see below. } \item{range}{A genome identifier, a \code{\link[GenomicRanges]{GRanges}} or a \code{\link[IRanges]{IntegerRangesList}} indicating the portion of the table to retrieve, in genome coordinates. Simply specifying the genome string is the easiest way to download data for the entire genome, and \code{\link{GRangesForUCSCGenome}} facilitates downloading data for e.g. an entire chromosome. } \item{hubUrl}{The URI of the specific TrackHub} \item{genome}{A genome identifier of the specific TrackHub, only need to provide it if the provider is up of TrackHub URI.} \item{names}{Names/accessions of the desired features} } A common workflow for querying the UCSC database is to create an instance of \code{UCSCTableQuery} using the \code{ucscTableQuery} constructor, invoke \code{tableNames} to list the available tables for a track, and finally to retrieve the desired table either as a \code{data.frame} via \code{getTable} or as a track via \code{track}. See the examples. The reason for a formal query class is to facilitate multiple queries when the differences between the queries are small. For example, one might want to query multiple tables within the track and/or same genomic region, or query the same table for multiple regions. The \code{UCSCTableQuery} instance can be incrementally adjusted for each new query. Some caching is also performed, which enhances performance. } \section{Constructor}{ \describe{ \item{}{ \code{ucscTableQuery(x, range = seqinfo(x), table = NULL, names = NULL, hubUrl = NULL, genome = NULL)}: Creates a \code{UCSCTableQuery} with the \code{UCSCSession}, genome identifier or TrackHub URI given as \code{x} and the table name given by the single string \code{table}. \code{range} should be a genome string identifier, a \code{GRanges} instance or \code{IntegerRangesList} instance, and it effectively defaults to \code{genome(x)}. If the genome is missing, it is taken from the provider. Feature names, such as gene identifiers, may be passed via \code{names} as a character vector. } } } \section{Executing Queries}{ Below, \code{object} is a \code{UCSCTableQuery} instance. \describe{ \item{}{ \code{track(object)}: Retrieves the indicated table as a track, i.e. a \code{GRanges} object. Note that not all tables are available as tracks. } \item{}{ \code{getTable(object)}: Retrieves the indicated table as a \code{data.frame}. Note that not all tables are output in parseable form, and that UCSC will truncate responses if they exceed certain limits (usually around 100,000 records). The safest (and most efficient) bet for large queries is to download the file via FTP and query it locally. } \item{}{ \code{tableNames(object)}: Gets the names of the tables available for the provider, table and range specified by the query. } } } \section{Accessor methods}{ In the code snippets below, \code{x}/\code{object} is a \code{UCSCTableQuery} object. \describe{ \item{}{\code{genome(x)}, \code{genome(x) <- value}: Gets or sets the genome identifier (e.g. \dQuote{hg18}) of the object. } \item{}{\code{hubUrl(x)}, \code{hubUrl(x) <- value}: Gets or sets the TrackHub URI. } \item{}{\code{tableName(x)}, \code{tableName(x) <- value}: Get or set the single string indicating the name of the table to retrieve. May be \code{NULL}, in which case the table is automatically determined. } \item{}{\code{range(x)}, \code{range(x) <- value}: Get or set the \code{GRanges} indicating the portion of the table to retrieve in genomic coordinates. Any missing information, such as the genome identifier, is filled in using \code{range(browserSession(x))}. It is also possible to set the genome identifier string or a \code{IntegerRangesList}. } \item{}{\code{names(x)}, \code{names(x) <- value}: Get or set the names of the features to retrieve. If \code{NULL}, this filter is disabled. } \item{}{\code{ucscSchema(x)}: Get the \code{\linkS4class{UCSCSchema}} object describing the selected table.} \item{}{\code{ucscTables(genome, track)}: Get the list of tables for the specified track(e.g. \dQuote{Assembly}) and genome identifier (e.g. \dQuote{hg19}). Here \code{genome} and \code{track} must be a single non-NA string. } } } \author{ Michael Lawrence } \examples{ \dontrun{ # query using `session` provider session <- browserSession() genome(session) <- "mm9" ## choose the phastCons30way table for a portion of mm9 chr1 query <- ucscTableQuery(session, table = "phastCons30way", range = GRangesForUCSCGenome("mm9", "chr12", IRanges(57795963, 57815592))) ## list the table names tableNames(query) ## retrieve the track data track(query) # a GRanges object ## get the multiz30waySummary track tableName(query) <- "multiz30waySummary" ## get a data.frame summarizing the multiple alignment getTable(query) # query using `genome identifier` provider query <- ucscTableQuery("hg18", table = "snp129", names = c("rs10003974", "rs10087355", "rs10075230")) ucscSchema(query) getTable(query) # query using `TrackHub URI` provider query <- ucscTableQuery("https://ftp.ncbi.nlm.nih.gov/snp/population_frequency/TrackHub/20200227123210/", genome = "hg19", table = "ALFA_GLB") getTable(query) # get the list of tables for 'Assembly' track and 'hg19' genome identifier ucscTables("hg19", "Assembly") } } \keyword{methods} \keyword{classes} rtracklayer/man/ucscTrackLine-class.Rd0000644000175100017510000000356614614231172021027 0ustar00biocbuildbiocbuild\name{TrackLine-class} \docType{class} \alias{TrackLine-class} \alias{coerce,character,TrackLine-method} \alias{coerce,TrackLine,character-method} \alias{show,TrackLine-method} \title{Class "TrackLine"} \description{An object representing a "track line" in the \acronym{UCSC} format. There are two concrete types of track lines: \code{\linkS4class{BasicTrackLine}} (used for most types of tracks) and \code{\linkS4class{GraphTrackLine}} (used for graphical tracks). This class only declares the common elements between the two.} \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("TrackLine", ...)} or parsed from a character vector track line with \code{as(text, "TrackLine")}. But note that \acronym{UCSC} only understands one of the subclasses mentioned above. } \section{Slots}{ \describe{ \item{\code{name}:}{Object of class \code{"character"} specifying the name of the track. } \item{\code{description}:}{Object of class \code{"character"} describing the track. } \item{\code{visibility}:}{Object of class \code{"character"} indicating the default visible mode of the track, see \code{\linkS4class{UCSCTrackModes}}.} \item{\code{color}:}{Object of class \code{"integer"} representing the track color (as from \code{\link{col2rgb}}). } \item{\code{priority}:}{Object of class \code{"numeric"} specifying the rank of this track. } } } \section{Methods}{ \describe{ \item{as(object, "character")}{Export line to its string representation.} } } \references{ \url{https://genome.ucsc.edu/goldenPath/help/customTrack.html#TRACK} for the official documentation. } \author{ Michael Lawrence } \seealso{ \code{\linkS4class{BasicTrackLine}} (used for most types of tracks) and \code{\linkS4class{GraphTrackLine}} (used for Wiggle/bedGraph tracks). } \keyword{classes} rtracklayer/man/ucscTrackModes-class.Rd0000644000175100017510000000505114614231172021176 0ustar00biocbuildbiocbuild\name{UCSCTrackModes-class} \docType{class} \alias{UCSCTrackModes-class} \alias{[,UCSCTrackModes,ANY,ANY,ANY-method} \alias{[<-,UCSCTrackModes,ANY,ANY,ANY-method} \title{Class "UCSCTrackModes"} \description{A vector of view modes ("hide", "dense", "full", "pack", "squish") for each track in a \acronym{UCSC} view.} \section{Objects from the Class}{ Objects may be created by calls of the form \code{\link{ucscTrackModes}(object = character(), hide = character(), dense = character(), pack = character(), squish = character(), full = character())}, where \code{object} should be a character vector of mode names (with its \code{names} attribute specifying the corresponding track names). The other parameters should contain track names that override the modes in \code{object}. Later parameters override earlier ones, so, for example, if a track is named in \code{hide} and \code{full}, it is shown in the full view mode. } \section{Slots}{ \describe{ \item{\code{.Data}:}{Object of class \code{"character"} holding the modes ("hide", "dense", "full", "pack", "squish"), with its \code{names} attribute holding corresponding track names.} \item{\code{labels}:}{Object of class \code{"character"} holding labels (human-readable names) corresponding to each track/mode.} } } \section{Extends}{ Class \code{"\linkS4class{character}"}, from data part. Class \code{"\linkS4class{vector}"}, by class "character", distance 2. } \section{Methods}{ \describe{ \item{\code{\link{trackNames}(object)}}{ Gets the names of the visible tracks (those that do not have mode "hide"). } \item{\code{\link{trackNames}(object) <- value}}{ Sets the names of the visible tracks. Any tracks named in \code{value} are set to "full" if the are currently set to "hide" in this object. Any tracks not in \code{value} are set to "hide". All other modes are preserved.} \item{\code{object[i]}}{Gets the track mode of the tracks indexed by \code{i}, which can be any type of index supported by character vector subsetting. If \code{i} is a character vector, it indexes first by the internal track IDs (the \code{names} on \code{.Data}) and then by the user-level track names (the \code{labels} slot).} \item{\code{object[i] <- value}}{Sets the track modes indexed by \code{i} (in the same way as in \code{object[i]} above) to those specified in \code{value}.} } } \author{ Michael Lawrence } \seealso{ \code{\linkS4class{UCSCView}} on which track view modes may be set. } \keyword{classes} rtracklayer/man/ucscTrackModes-methods.Rd0000644000175100017510000000521514614231172021536 0ustar00biocbuildbiocbuild\name{ucscTrackModes-methods} \docType{methods} \alias{ucscTrackModes} \alias{ucscTrackModes<-} \alias{ucscTrackModes-methods} \alias{ucscTrackModes,character-method} \alias{ucscTrackModes,missing-method} \alias{ucscTrackModes,UCSCView-method} \alias{ucscTrackModes<--methods} \alias{ucscTrackModes<-,UCSCView,UCSCTrackModes-method} \alias{ucscTrackModes<-,UCSCView,character-method} \alias{ucscTrackModes,ucscTracks-method} \alias{ucscTrackModes,UCSCSession-method} \title{ Accessing UCSC track modes } \description{ Generics for getting and setting UCSC track visibility modes ("hide", "dense", "full", "pack", "squish"). } \section{Methods}{ \describe{ The following methods are defined by \pkg{rtracklayer} for \bold{getting} the track modes through the generic \code{ucscTrackModes(object, ...)}. \item{object = "character"}{ \code{function(object, hide = character(), dense = character(), pack = character(), squish = character(), full = character())} Creates an instance of \code{\linkS4class{UCSCTrackModes}} from \code{object}, a character vector of mode names, with the corresponding track ids given in the \code{names} attribute. Note that \code{object} can be a \code{UCSCTrackModes} instance, as \code{UCSCTrackModes} extends \code{character}. The other parameters are character vectors identifying the tracks for each mode and overriding the modes specified by \code{object}. } \item{object = "missing"}{ The same interface as above, except \code{object} defaults to an empty character vector. } \item{object = "UCSCView"}{ Gets modes for tracks in the view. } \item{object = "UCSCSession"}{ Gets default modes for the tracks in the session. These are the modes that will be used as the default for a newly created view. } The following methods are defined by \pkg{rtracklayer} for \bold{setting} the track modes through the generic \code{ucscTrackModes(object) <- value}. \item{object = "UCSCView", value = "UCSCTrackModes"}{ Sets the modes for the tracks in the view. } \item{object = "UCSCView", value = "character"}{ Sets the modes from a character vector of mode names, with the corresponding track names given in the \code{names} attribute. } }} \seealso{\code{\link{trackNames}} and \code{\link{trackNames<-}} for just getting or setting which tracks are visible (not of mode "hide").} \examples{ # Tracks "foo" and "bar" are fully shown, "baz" is hidden modes <- ucscTrackModes(full = c("foo", "bar"), hide = "baz") # Update the modes to hide track "bar" modes2 <- ucscTrackModes(modes, hide = "bar") } \keyword{methods} rtracklayer/man/ucscView-class.Rd0000644000175100017510000000600014614231172020047 0ustar00biocbuildbiocbuild\name{UCSCView-class} \docType{class} \alias{UCSCView-class} \alias{range,UCSCView-method} \alias{range<-,UCSCView-method} \alias{visible,UCSCView-method} \alias{visible<-,UCSCView-method} \alias{viewURL} \title{Class "UCSCView"} \description{An object representing a view of a genome in the \acronym{UCSC} browser.} \section{Objects from the Class}{ Calling \code{\link{browserView}(session, range = range(object), track = trackNames(object), browse = TRUE, ...)} creates \code{\linkS4class{BrowserView}} of \code{range} with visible tracks specified by \code{track}. \code{track} may be an instance of \code{\linkS4class{UCSCTrackModes}}. Arguments in \code{...} should match parameters to a \code{\link{ucscTrackModes}} method for creating a \code{UCSCTrackModes} instance that will be merged with and override modes indicated by the \code{track} parameter. If \code{browse} is \code{TRUE} (default), automatically launch a browser to display the view. } \section{Slots}{ \describe{ \item{\code{hgsid}:}{Object of class \code{"numeric"}, which identifies this view to \acronym{UCSC}.} \item{\code{session}:}{Object of class \code{"BrowserSession"} to which this view belongs.} } } \section{Extends}{ Class \code{"\linkS4class{BrowserView}"}, directly. } \section{Methods}{ \describe{ \item{\code{\link{activeView}(object)}}{ Obtains a logical indicating whether this view is the active view. } \item{\code{\link{range}(object)}}{ Obtains the \code{\link[GenomicRanges:GRanges-class]{GRanges}} displayed by this view. } \item{\code{\link{range}(object) <- value}}{ Sets the \code{\link[GenomicRanges]{GRanges}} or \code{\link[IRanges]{IntegerRangesList}} displayed by this view. } \item{\code{\link{trackNames}(object)}}{ Gets the names of the visible tracks in this view. } \item{\code{\link{trackNames}(object) <- value}}{ Sets the visible tracks by name. } \item{\code{visible(object)}}{Get a named logical vector indicating whether each track is visible. } \item{\code{visible(object) <- value}}{Set a logical vector indicating the visibility of each track, in the same order as returned by \code{visible(object)}. } \item{\code{\link{ucscTrackModes}(object)}}{ Obtains the \code{\linkS4class{UCSCTrackModes}} for this view. } \item{\code{\link{ucscTrackModes}(object) <- value}}{ Sets the \code{\linkS4class{UCSCTrackModes}} for this view. The \code{value} may be either a \code{UCSCTrackModes} instance or a character vector that will be coerced by a call to \code{\link{ucscTrackModes}}. } } } \section{Utilities}{ \describe{ \item{viewURL(x)}{Gets the URL corresponding to the view \code{x}. Typically used when passing \code{browse=FALSE} to the constructor in order to display the view in another way.} } } \author{ Michael Lawrence } \seealso{ \code{\link{browserView}} for creating instances of this class. } \keyword{classes} rtracklayer/man/WIGFile-class.Rd0000644000175100017510000001520314614231172017512 0ustar00biocbuildbiocbuild\name{WIGFile-class} \docType{class} %% Classes: \alias{class:WIGFile} \alias{WIGFile-class} %% Constructor: \alias{WIGFile} %% Import: \alias{import,WIGFile,ANY,ANY-method} \alias{import.wig} \alias{import.wig,ANY-method} %% Export: \alias{export,ANY,WIGFile,ANY-method} \alias{export,GenomicRanges,WIGFile,ANY-method} \alias{export,GenomicRangesList,WIGFile,ANY-method} \alias{export,UCSCData,WIGFile,ANY-method} \alias{export.wig} \alias{export.wig,ANY-method} \title{WIG Import and Export} \description{ These functions support the import and export of the UCSC WIG (Wiggle) format. } \usage{ \S4method{import}{WIGFile,ANY,ANY}(con, format, text, genome = NA, trackLine = TRUE, which = NULL, seqinfo = NULL, ...) import.wig(con, ...) \S4method{export}{ANY,WIGFile,ANY}(object, con, format, ...) \S4method{export}{GenomicRanges,WIGFile,ANY}(object, con, format, dataFormat = c("auto", "variableStep", "fixedStep"), writer = .wigWriter, append = FALSE, ...) \S4method{export}{GenomicRangesList,WIGFile,ANY}(object, con, format, ...) \S4method{export}{UCSCData,WIGFile,ANY}(object, con, format, trackLine = TRUE, ...) export.wig(object, con, ...) } \arguments{ \item{con}{A path, URL, connection or \code{WIGFile} object. For the functions ending in \code{.wig}, the file format is indicated by the function name. For the base \code{export} and \code{import} functions, the format must be indicated another way. If \code{con} is a path, URL or connection, either the file extension or the \code{format} argument needs to be \dQuote{wig}. Compressed files (\dQuote{gz}, \dQuote{bz2} and \dQuote{xz}) are handled transparently. } \item{object}{The object to export, should be a \code{GRanges} or something coercible to a \code{GRanges}. For exporting multiple tracks, in the UCSC track line metaformat, pass a \code{GenomicRangesList}, or something coercible to one. } \item{format}{If not missing, should be \dQuote{wig}. } \item{text}{If \code{con} is missing, a character vector to use as the input } \item{trackLine}{Whether to parse/output a UCSC track line. An imported track line will be stored in a \code{\linkS4class{TrackLine}} object, as part of the returned \code{\linkS4class{UCSCData}}. } \item{genome}{The identifier of a genome, or \code{NA} if unknown. Typically, this is a UCSC identifier like \dQuote{hg19}. An attempt will be made to derive the \code{seqinfo} on the return value using either an installed BSgenome package or UCSC, if network access is available. } \item{seqinfo}{If not \code{NULL}, the \code{Seqinfo} object to set on the result. If the \code{genome} argument is not \code{NA}, it must agree with \code{genome(seqinfo)}. } \item{which}{A range data structure like \code{IntegerRangesList} or \code{GRanges}. Only the intervals in the file overlapping the given ranges are returned. This is inefficient; use BigWig for efficient spatial queries. } \item{append}{If \code{TRUE}, and \code{con} points to a file path, the data is appended to the file. Obviously, if \code{con} is a connection, the data is always appended. } \item{dataFormat}{Probably best left to \dQuote{auto}. Exists only for historical reasons. } \item{writer}{Function for writing out the blocks; for internal use only. } \item{...}{Arguments to pass down to methods to other methods. For import, the flow eventually reaches the \code{WIGFile} method on \code{import}. When \code{trackLine} is \code{TRUE}, the arguments are passed through \code{export.ucsc}, so track line parameters are supported. } } \value{ A \code{GRanges} with the score values in the \code{score} metadata column, which is accessible via the \code{score} function. } \details{ The WIG format is a text-based format for efficiently representing a dense genome-scale score vector. It encodes, for each feature, a range and score. Features from the same sequence (chromosome) are grouped together into a block, with a single block header line indicating the chromosome. There are two block formats: fixed step and variable step. For fixed step, the number of positions (or step) between intervals is the same across an entire block. For variable step, the start position is specified for each feature. For both fixed and variable step, the span (or width) is specified in the header and thus must be the same across all features. This requirement of uniform width dramatically limits the applicability of WIG. For scored features of variable width, consider \link[=BEDGraphFile]{BEDGraph} or \link[=BigWigFile]{BigWig}, which is generally preferred over both WIG and BEDGraph. To efficiently convert an existing WIG or BEDGraph file to BigWig, call \code{\link{wigToBigWig}}. Neither WIG, BEDGraph nor BigWig allow overlapping features. } \section{WIGFile objects}{ The \code{WIGFile} class extends \code{\link[BiocIO:BiocFile-class]{BiocFile}} and is a formal represention of a resource in the WIG format. To cast a path, URL or connection to a \code{WIGFile}, pass it to the \code{WIGFile} constructor. } \author{Michael Lawrence} \references{ \url{https://genome.ucsc.edu/goldenPath/help/wiggle.html} } \examples{ test_path <- system.file("tests", package = "rtracklayer") test_wig <- file.path(test_path, "step.wig") ## basic import calls test <- import(test_wig) test import.wig(test_wig) test_wig_file <- WIGFile(test_wig) import(test_wig_file) test_wig_con <- file(test_wig) import(test_wig_con, format = "wig") test_wig_con <- file(test_wig) import(WIGFile(test_wig_con)) ## various options import(test_wig, genome = "hg19") import(test_wig, trackLine = FALSE) which <- as(test[3:4,], "IntegerRangesList") import(test_wig, which = which) \dontrun{ ## basic export calls test_wig_out <- file.path(tempdir(), "test.wig") export(test, test_wig_out) export.wig(test, test_wig_out) test_foo_out <- file.path(tempdir(), "test.foo") export(test, test_foo_out, format = "wig") test_wig_out_file <- WIGFile(test_wig_out) export(test, test_wig_out_file) ## appending test2 <- test metadata(test2)$trackLine <- initialize(metadata(test)$trackLine, name = "test2") export(test2, test_wig_out_file, append = TRUE) ## passing track line parameters export(test, test_wig_out, name = "test2") ## no track line export(test, test_wig_out, trackLine = FALSE) ## gzip test_wig_gz <- paste(test_wig_out, ".gz", sep = "") export(test, test_wig_gz) } } \keyword{methods} \keyword{classes} rtracklayer/man/wigToBigWig.Rd0000644000175100017510000000210414614231172017337 0ustar00biocbuildbiocbuild\name{wigToBigWig} \alias{wigToBigWig} \title{ Convert WIG to BigWig } \description{ This function calls the Kent C library to efficiently convert a WIG file to a BigWig file, without loading the entire file into memory. This solves the problem where simple tools write out text WIG files, instead of more efficiently accessed binary BigWig files. } \usage{ wigToBigWig(x, seqinfo, dest = paste(file_path_sans_ext(x, TRUE), "bw", sep = "."), clip = FALSE) } \arguments{ \item{x}{ Path or URL to the WIG file. Connections are not supported. } \item{seqinfo}{ \code{\linkS4class{Seqinfo}} object, describing the genome of the data. All BigWig files must have this defined. } \item{dest}{ The path to which to write the BigWig file. Defaults to \code{x} with the extension changed to \dQuote{bw}. } \item{clip}{ If \code{TRUE}, regions outside of \code{seqinfo} will be clipped, so that no error is thrown. } } \author{ Michael Lawrence } \seealso{ \code{\link[=BigWigFile]{BigWig}} import and export support } rtracklayer/man/wigTrackLine-class.Rd0000644000175100017510000000675614614231172020664 0ustar00biocbuildbiocbuild\name{GraphTrackLine-class} \docType{class} \alias{GraphTrackLine-class} \alias{coerce,character,GraphTrackLine-method} \alias{coerce,GraphTrackLine,character-method} \alias{coerce,GraphTrackLine,BasicTrackLine-method} \alias{coerce,BasicTrackLine,GraphTrackLine-method} \title{Class "GraphTrackLine"} \description{ A \acronym{UCSC} track line for graphical tracks. } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("GraphTrackLine", ...)} or parsed from a character vector track line with \code{as(text, "GraphTrackLine")} or converted from a \code{\linkS4class{BasicTrackLine}} using \code{as(basic, "GraphTrackLine")}. } \section{Slots}{ \describe{ \item{\code{altColor}:}{Object of class \code{"integer"} giving an alternate color, as from \code{\link{col2rgb}}.} \item{\code{autoScale}:}{Object of class \code{"logical"} indicating whether to automatically scale to min/max of the data.} \item{\code{alwaysZero}:}{Object of class \code{"logical"} indicating whether to fix the lower limit of the Y axis at zero.} \item{\code{gridDefault}:}{Object of class \code{"logical"} indicating whether a grid should be drawn. } \item{\code{maxHeightPixels}:}{Object of class \code{"numeric"} of length three (max, default, min), giving the allowable range for the vertical height of the graph.} \item{\code{graphType}:}{Object of class \code{"character"}, specifying the graph type, either "bar" or "points". } \item{\code{viewLimits}:}{Object of class \code{"numeric"} and of length two specifying the data range (min, max) shown in the graph.} \item{\code{yLineMark}:}{Object of class \code{"numeric"} giving the position of a horizontal line.} \item{\code{yLineOnOff}:}{Object of class \code{"logical"} indicating whether the \code{yLineMark} should be visible. } \item{\code{windowingFunction}:}{Object of class \code{"character"}, one of "maximum", "mean", "minimum", for removing points when the graph shrinks.} \item{\code{smoothingWindow}:}{Object of class \code{"numeric"} giving the window size of a smoother to pass over the graph. } \item{\code{type}:}{Scalar \code{"character"} indicating the type of the track, either \code{"wig"} or \code{"bedGraph"}.} \item{\code{name}:}{Object of class \code{"character"} specifying the name of the track. } \item{\code{description}:}{Object of class \code{"character"} describing the track. } \item{\code{visibility}:}{Object of class \code{"character"} indicating the default visible mode of the track, see \code{\linkS4class{UCSCTrackModes}}.} \item{\code{color}:}{Object of class \code{"integer"} representing the track color (as from \code{\link{col2rgb}}). } \item{\code{priority}:}{Object of class \code{"numeric"} specifying the rank of this track. } } } \section{Extends}{ Class \code{"\linkS4class{TrackLine}"}, directly. } \section{Methods}{ \describe{ \item{as(object, "character")}{Export line to its string representation.} \item{as(object, \code{"\linkS4class{BasicTrackLine}"})}{Convert this line to a basic UCSC track line, using defaults for slots not held in common.} } } \references{ Official documentation: \url{https://genome.ucsc.edu/goldenPath/help/wiggle.html}. } \author{ Michael Lawrence } \seealso{ \code{\link{export.wig}}, \code{\link{export.bedGraph}} for exporting graphical tracks. } \keyword{classes} rtracklayer/NAMESPACE0000644000175100017510000001316314614231172015341 0ustar00biocbuildbiocbuilduseDynLib(rtracklayer, .registration = TRUE) ## ============================================================ ## Import ## ============================================================ import(methods) import(BiocGenerics) import(zlibbioc) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### base packages ### importFrom("stats", offset, setNames) importFrom("utils", count.fields, URLencode, browseURL, download.file, read.table, read.csv, type.convert, write.table, packageVersion, strcapture) importFrom("tools", file_path_as_absolute, file_ext, file_path_sans_ext) importFrom("grDevices", col2rgb, rgb) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Non-bioconductor packages ### importFrom("XML", getNodeSet, xmlValue, xmlAttrs, htmlTreeParse, xmlTreeParse, xmlInternalTreeParse, parseURI, newXMLNode, xmlChildren, addChildren, removeChildren, readHTMLTable) importMethodsFrom("XML", saveXML) importFrom("curl", curl_unescape) importFrom("httr", GET, HEAD, POST, config, user_agent, set_cookies, content, upload_file) import(restfulr) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Bioconductor packages ### import(S4Vectors) import(XVector) import(GenomeInfoDb) import(IRanges) import(GenomicRanges) import(BiocIO) importFrom("Biostrings", get_seqtype_conversion_lookup, writeXStringSet, DNAStringSet, DNA_BASES, DNA_ALPHABET, alphabetFrequency, reverseComplement, uniqueLetters) importMethodsFrom("Biostrings", masks, "masks<-", getSeq) importClassesFrom("Biostrings", DNAStringSet, XStringSet) importFrom("Rsamtools", indexTabix, bgzip, TabixFile, index) importMethodsFrom("Rsamtools", ScanBamParam, asBam, headerTabix, isOpen, scanTabix) importClassesFrom("Rsamtools", RsamtoolsFile, TabixFile, BamFile) importMethodsFrom("GenomicAlignments", readGAlignments, cigar, last, readGAlignmentPairs) importClassesFrom("GenomicAlignments", GAlignments) ## ============================================================ ## Export ## ============================================================ exportClasses(BrowserSession, BrowserView, BrowserViewList, UCSCSession, UCSCView, UCSCData, TrackLine, BasicTrackLine, GraphTrackLine, Bed15TrackLine, UCSCTrackModes, BigWigSelection, BigBedSelection, UCSCSchema, Quickload, QuickloadGenome, TrackHub, TrackHubGenome, Track, TrackContainer) ## File classes exportClasses(RTLFile, RTLFileList, GFFFile, UCSCFile, BEDFile, WIGFile, ChainFile, FastaFile, GFF1File, GFF2File, GFF3File, BEDGraphFile, BED15File, GTFFile, GVFFile, BigWigFile, BigWigFileList, BigBedFile, TwoBitFile, BEDPEFile) exportMethods(activeView, "activeView<-", blocks, browseGenome, browserSession, "browserSession<-", browserView, browserViews, close, export, export.bed, export.bed15, export.bedGraph, export.gff, export.gff1, export.gff2, export.gff3, export.ucsc, export.wig, export.bw, export.bb, export.2bit, import, import.bed, import.bed15, import.bedGraph, import.gff, import.gff1, import.gff2, import.gff3, import.ucsc, import.wig, import.bw, import.chain, import.2bit, import.bb, exportToTabix, "track<-", track, trackNames, "trackNames<-", getTable, hubUrl, "hubUrl<-", tableNames, trackName, "trackName<-", tableName, "tableName<-", ucscTrackModes, "ucscTrackModes<-", ucscSchema, coerce, initialize, show, summary, "[", ucscTableQuery, genome, "genome<-", chrom, "chrom<-", range, "range<-", visible, "visible<-", liftOver, offset, reversed, nrow, referenceSequence, "referenceSequence<-", asBED, asGFF, split, fileFormat, hub, "hub<-", shortLabel, "shortLabel<-", longLabel, "longLabel<-", genomesFile, "genomesFile<-", email, "email<-", descriptionUrl, "descriptionUrl<-", genomeField, "genomeField<-", getTracks , writeTrackHub, trackField, "trackField<-", genomeInfo, "genomeInfo<-", ## from IRanges start, end, "start<-", "end<-", score, "score<-", as.data.frame, space, mcols, ## from GenomicRanges strand, seqinfo, "seqinfo<-", ## from BSgenome organism, releaseDate, getSeq ) export(genomeBrowsers, start, end, strand, "start<-", "end<-", width, "width<-", ranges, values, GenomicData, GenomicSelection, score, "score<-", as.data.frame, space, ucscGenomes, ucscTables, readGFFPragmas, sniffGFFVersion, GFFcolnames, readGFF, readGFFAsGRanges, BigWigSelection, BigBedSelection, GRangesForUCSCGenome, GRangesForBSGenome, summary, seqinfo, genome, "genome<-", Genome, uri, Quickload, quickload, QuickloadGenome, organism, releaseDate, mcols, TrackHub, trackhub, TrackHubGenome, Track, TrackContainer, wigToBigWig, SeqinfoForBSGenome, SeqinfoForUCSCGenome, resource, path, FileForFormat, cleanupBigWigCache, cleanupBigBedCache, viewURL) export(GFFFile, UCSCFile, BEDFile, WIGFile, ChainFile, FastaFile, GFF1File, GFF2File, GFF3File, BEDGraphFile, BED15File, GTFFile, GVFFile, BigWigFile, BigWigFileList, TwoBitFile, BEDPEFile, BigBedFile) rtracklayer/NEWS0000644000175100017510000001113614614231172014617 0ustar00biocbuildbiocbuildCHANGES IN VERSION 1.30 ----------------------- NEW FEATURES o Add readGFF(), a fast and flexible GFF/GTF parser implemented in C. See ?readGFF for more information. SIGNIFICANT USER-VISIBLE CHANGES o import.gff() now uses readGFF() internally which makes it at least 5x faster in most use cases and dramatically reduces its memory footprint. CHANGES IN VERSION 1.26 ----------------------- NEW FEATURES o ucscGenomes() retrieves organism information o New function exportToTabix() exports a GRanges to a tabix-indexed tab separated file that contains all of the metadata columns. Use import,TabixFile to load specific ranges of data back into a GRanges. o BigWig import/export to/from Integer/Numeric/RleList is now much more efficient, and uses a more efficient storage format within the BigWig file, when possible. SIGNIFICANT USER-VISIBLE CHANGES o BSgenome export methods are now in BSgenome. BUG FIXES o Handling of quotes in GFF3 is now consistent with the spec. CHANGES IN VERSION 1.22 ----------------------- NEW FEATURES o import,BigWigFile gains an asRle parameter that returns the data as an RleList (assuming it tiles the sequence); much faster than importing a GRanges and calling coverage() on it. o add export,RleList,BigWigFile method for direct (and much more efficient) output of RleLists (like coverage) to BigWig files. SIGNIFICANT USER-VISIBLE CHANGES o UCSCData now extends GRanges instead of RangedData (thanks Herve) BUG FIXES o handle different Set-Cookie header field casing; often due to proxies (thanks to Altuna Akalin) o attempt to more gracefully handle UCSC truncation of large data downloads o handle re-directs due to UCSC mirroring (thanks Martin Morgan) CHANGES IN VERSION 1.20 ----------------------- NEW FEATURES o Table query interface supports multiple query ranges. o Files (RTLFile objects) can be directly uploaded to UCSC, via track<-. SIGNIFICANT USER-VISIBLE CHANGES o All methods with asRangedData argument now have it default to FALSE, instead of TRUE. A warning is issued if the argument is missing. Eventually, we will drop all support for RangedData import (export will still work via automatic coercion to GRanges). BUG FIXES o Chromosome list for a genome is now downloaded from the table browser, instead of the Genome Browser page. This supports genomes with more than 1000 contigs. o BEDX+Y formats now work when a track line is present, and the extraCols argument is used for the column names. o path.expand() is now called for paths passed off to the Kent library. o Order of metadata columns upon GFF import no longer depends on LC_COLLATE. CHANGES IN VERSION 1.17 ----------------------- NEW FEATURES o Export of GappedAlignments objects as BAM files. There is also a corresponding import method. o Support for BEDX+Y import using the extraCols parameter to import. o Direct export of RleList objects to BigWig files. CHANGES IN VERSION 1.15 ----------------------- NEW FEATURES o Integrated with tabix via Rsamtools. BED and GFF export methods now generate a tabix index, if index=TRUE. Most import() methods gain a 'which' argument that takes advantage of tabix, when available. o Added wigToBigWig() function for efficient conversion of WIG to BigWig. o Added SeqinfoForBSGenome() and SeqinfoForUCSCGenome() for conveniently retrieving Seqinfo objects for a given genome. o Added support for FASTA import/export via Biostrings. o GTF and GVF files are now parsed as GFF. SIGNIFICANT USER-VISIBLE CHANGES o The import/export API is now based on RTLFile objects, which wrap a file path, URL or connection. There is an RTLFile subclass for every file format. This makes it easier to extend rtracklayer (export, import) with new file types. The existing API is still supported (and even encouraged for most uses). o Handle CSV attributes in GFF3 using CharacterList columns. o BED columns thickStart/thickEnd translate to an IRanges column named "thick". The blockStarts/Sizes/Count columns now map to a single RangesList "blocks" column. BUG FIXES o Numerous fixes in the import/export methods, as a result of implementing a full unit test suite. If something was not working for you in the past, please try again. o Compression and connections should now work fairly uniformly across file types. (start date: 29 March, 2012) rtracklayer/R/0000755000175100017510000000000014614231172014317 5ustar00biocbuildbiocbuildrtracklayer/R/bam.R0000644000175100017510000001235014614231172015202 0ustar00biocbuildbiocbuild### ========================================================================= ### BAM support (wrappers around Rsamtools) ### ------------------------------------------------------------------------- setMethod("import", "BamFile", function(con, format, text, paired = FALSE, use.names = FALSE, param = ScanBamParam(...), genome = NA_character_, ...) { if (!missing(format)) checkArgFormat(con, format) stopifnot(isSingleStringOrNA(genome) || is(genome, "Seqinfo")) stopifnot(isTRUEorFALSE(paired)) if (paired) { ans <- readGAlignmentPairs(con, use.names = use.names, param = param) } else { ans <- readGAlignments(con, use.names = use.names, param = param) } if (isSingleStringOrNA(genome)) { genome <- Seqinfo(genome=genome) } seqinfo(ans) <- merge(seqinfo(ans), genome) ans }) fillColumn <- function(x, filler) { if (is.null(x)) filler else if (anyNA(x)) ifelse(is.na(x), filler, x) else x } setMethod("export", c("GAlignments", "BamFile"), function(object, con, format, index = TRUE) { sam_path <- paste(file_path_sans_ext(path(con)), ".sam", sep = "") sam_con <- file(sam_path, "w") on.exit(close(sam_con)) si <- seqinfo(object) has_info <- seqlevels(si)[!is.na(seqlevels(si)) & !is.na(seqlengths(si))] si <- si[has_info] if (length(si)) { header <- paste0("@SQ", "\tSN:", seqlevels(si), "\tLN:", seqlengths(si)) has_genome <- !is.na(genome(si)) header[has_genome] <- paste0(header[has_genome], "\tAS:", genome(si)[has_genome]) writeLines(header, sam_con) } emd <- mcols(object) aln <- paste(fillColumn(names(object), "*"), fillColumn(emd[["flag"]], ifelse(strand(object) == "-", "16", "0")), seqnames(object), start(object), fillColumn(emd[["mapq"]], "255"), cigar(object), fillColumn(emd[["mrnm"]], "*"), fillColumn(emd[["mpos"]], "0"), fillColumn(emd[["isize"]], "0"), if (is(object, "GappedReads")) object@qseq else fillColumn(emd[["seq"]], "*"), fillColumn(emd[["qual"]], "*"), sep = "\t") custom <- emd[nchar(names(emd)) == 2L] if (length(custom) > 0L) { type.map <- c(integer = "i", numeric = "f", character = "Z", factor = "Z") custom.class <- sapply(custom, class) custom.type <- type.map[custom.class] unknown.class <- custom.class[is.na(custom.type)] if (length(unknown.class) > 0L) { warning("these classes are not yet valid for BAM tag export: ", paste(unknown.class, collapse=", ")) custom <- custom[!is.na(custom.type)] } tags <- mapply(paste0, names(custom), ":", custom.type, ":", as.list(custom), SIMPLIFY=FALSE) aln <- do.call(paste, c(list(aln), tags, sep = "\t")) } writeLines(aln, sam_con) close(sam_con) on.exit() bam <- asBam(sam_path, file_path_sans_ext(sam_path), overwrite = TRUE, indexDestination = index) unlink(sam_path) invisible(bam) }) setMethod("export", c("GAlignmentPairs", "BamFile"), function(object, con, format, ...) { ga <- as(object, "GAlignments") collate_subscript <- S4Vectors:::make_XYZxyz_to_XxYyZz_subscript(length(object)) getMateAttribute <- function(FUN) { c(FUN(last(object)), FUN(first(object)))[collate_subscript] } if (is.null(mcols(ga)$mrnm)) { mcols(ga)$mrnm <- getMateAttribute(seqnames) } if (is.null(mcols(ga)$mpos)) { mcols(ga)$mpos <- getMateAttribute(start) } ### FIXME: we cannot infer whether the pair is 'proper' (0x2) ### nor whether the alignment is 'primary' (0x100) if (is.null(mcols(ga)$flag)) { mcols(ga)$flag <- 0x1 + # all paired ifelse(strand(ga) == "-", 0x10, 0) + ifelse(getMateAttribute(strand) == "-", 0x20, 0) + c(0x40, 0x80) # left vs. right } if (is.null(names(ga))) { names(ga) <- as.character(rep(seq_len(length(object)), each=2L)) } export(ga, con, ...) }) setMethod("export", c("ANY", "BamFile"), function(object, con, format, ...) { export(as(object, "GAlignments"), con, ...) }) rtracklayer/R/bed.R0000644000175100017510000006605114614231172015204 0ustar00biocbuildbiocbuild### ========================================================================= ### BED (Browser Extended Display) support (including bedGraph and BED15) ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Classes ### setClass("BEDFile", contains = "BiocFile") BEDFile <- function(resource) { new("BEDFile", resource = resource) } setClass("BEDGraphFile", contains = "BEDFile") BEDGraphFile <- function(resource) { new("BEDGraphFile", resource = resource) } setClass("BED15File", contains = "BEDFile") BED15File <- function(resource) { new("BED15File", resource = resource) } setClass("BEDPEFile", contains = "BEDFile") BEDPEFile <- function(resource) { new("BEDPEFile", resource = resource) } setClass("NarrowPeakFile", contains = "BEDFile") NarrowPeakFile <- function(resource) { new("NarrowPeakFile", resource = resource) } setClass("BroadPeakFile", contains = "BEDFile") BroadPeakFile <- function(resource) { new("BroadPeakFile", resource = resource) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export ### setGeneric("export.bed", function(object, con, ...) standardGeneric("export.bed")) setMethod("export.bed", "ANY", function(object, con, ...) { export(object, con, "bed", ...) }) setMethod("export", c("ANY", "BEDFile"), function(object, con, format, ...) { if (!missing(format)) checkArgFormat(con, format) cl <- class(object) if (hasMethod("asBED", class(object))) object <- asBED(object) track <- try(as(object, "GRanges"), silent = TRUE) if (class(track) == "try-error") { track <- try(as(object, "GenomicRangesList"), silent = TRUE) if (is(track, "try-error")) stop("cannot export object of class '", cl, "'") } export(track, con, ...) }) setMethod("export", c("GenomicRanges", "BEDFile"), function(object, con, format, append = FALSE, index = FALSE, ignore.strand = FALSE, trackLine = NULL) { if (!is.null(trackLine)) { object <- UCSCData(object, trackLine) trackLine <- TRUE return(callGeneric()) } if (!missing(format)) checkArgFormat(con, format) name <- strand <- thickStart <- thickEnd <- color <- NULL blockCount <- blockSizes <- blockStarts <- NULL if (index) object <- sortBySeqnameAndStart(object) df <- data.frame(seqnames(object), start(object) - 1L, end(object)) score <- score(object) if (!is.null(score)) { if (!is.numeric(score) || any(is.na(score))) stop("Scores must be non-NA numeric values") } if (is(con, "BEDGraphFile")) { if (is.null(score)) ## bedGraph requires score score <- 0 df$score <- score } else { toCSV <- function(x) { if (is(x, "IntegerList")) { x <- unstrsplit(CharacterList(x), ",") } else if (!is.character(x) && !is.null(x)) stop("Could not convert block coordinates to CSV") x } blockSizes <- blockStarts <- NULL if (!is.null(object$blocks)) { blockSizes <- toCSV(width(object$blocks)) blockStarts <- toCSV(start(object$blocks) - 1L) } if (is(con, "BED15File") && is.null(blockSizes)) blockStarts <- blockSizes <- "" # bed15 must have all 15 cols if (!is.null(blockSizes) || !is.null(blockStarts)) { if (is.null(blockSizes)) stop("'blockStarts' specified without 'blockSizes'") if (is.null(blockStarts)) stop("'blockSizes' specified without 'blockStarts'") lastBlock <- function(x) as.integer(sub(".*,", "", sub(",$", "", x))) lastSize <- lastBlock(blockSizes) lastStart <- lastBlock(blockStarts) if (any(df[[2]] + lastSize + lastStart != df[[3]]) || any(sub(",.*", "", blockStarts) != "0")) stop("blocks must span entire feature,", " and be within its bounds") blockCount <- elementNROWS(object$blocks) if (!is.null(object$blockCount)) if (!identical(blockCount, as.integer(object$blockCount))) stop("incorrect block counts given block sizes") } if (is.null(color)) color <- object$itemRgb if (is.null(color) && !is.null(blockCount)) color <- "0" ## blocks require color else if (!is.null(color)) { nacol <- is.na(color) if (!is.matrix(color)) colmat <- col2rgb(color) color <- paste(colmat[1,], colmat[2,], colmat[3,], sep = ",") color[nacol] <- "0" } thickStart <- object$thickStart thickEnd <- object$thickEnd if (!is.null(object$thick)) { thickStart <- start(object$thick) thickEnd <- end(object$thick) } ## color requires thick ranges if (is.null(thickStart) && !is.null(color)) { thickStart <- start(object) thickEnd <- end(object) } strand <- if (ignore.strand) NULL else strand(object) if (!is.null(strand)) { strand[strand == "*"] <- NA } if (!is.null(thickStart) && is.null(strand)) { strand <- rep(NA, length(object)) } if (!is.null(strand) && is.null(score)) score <- rep(0, length(object)) name <- object$name if (is.null(name)) name <- names(object) if (!is.null(score) && is.null(name)) name <- rep(NA, length(object)) df$name <- name df$score <- score df$strand <- strand df$thickStart <- if (!is.null(thickStart)) thickStart - 1L else NULL df$thickEnd <- thickEnd df$itemRgb <- color df$blockCount <- blockCount df$blockSizes <- blockSizes df$blockStarts <- blockStarts if (is(con, "BED15File")) { df$expCount <- object$expCount df$expIds <- object$expIds df$expScores <- object$expScores } } scipen <- getOption("scipen") options(scipen = 100) # prevent use of scientific notation on.exit(options(scipen = scipen)) file <- con m <- manager() con <- connection(m, con, if (append) "a" else "w") write.table(df, con, sep = "\t", col.names = FALSE, row.names = FALSE, quote = FALSE, na = ".") release(m, con) if (index) invisible(indexTrack(file)) else invisible(file) }) setMethod("export", c("UCSCData", "BEDFile"), function(object, con, format, trackLine = TRUE, ...) { if (!missing(format)) checkArgFormat(con, format) if (trackLine) { export.ucsc(object, con, ...) } else { trackLine <- NULL callNextMethod() } invisible(con) }) setMethod("export", c("CompressedGRangesList", "BEDFile"), function(object, con, format, ...) { object <- asBED(object) callGeneric() }) setMethod("export", c("SimpleGRangesList", "BEDFile"), .export_SimpleGRangesList_BiocFile) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Import ### setGeneric("import.bed", function(con, ...) standardGeneric("import.bed")) setMethod("import.bed", "ANY", function(con, ...) { import(con, format = "bed", ...) }) scanTrackLine <- function(con) { m <- manager() con <- connectionForResource(m, con, "r") on.exit(release(m, con)) line <- "#" while(length(grep("^ *#", line))) # skip initial comments line <- readLines(con, 1, warn = FALSE) if (length(grep("^track", line)) > 0) line else { pushBack(line, con) NULL } } setMethod("import", "BEDFile", function(con, format, text, trackLine = TRUE, genome = NA, colnames = NULL, which = NULL, seqinfo = NULL, extraCols = character(), sep = c("\t", ""), na.strings=character(0L)) { if (!missing(format)) checkArgFormat(con, format) sep <- match.arg(sep) stopifnot(is.character(na.strings), !anyNA(na.strings)) file <- con m <- manager() con <- queryForConnection(m, con, which) on.exit(release(m, con)) if (attr(con, "usedWhich")) which <- NULL if (is(genome, "Seqinfo")) { seqinfo <- genome genome <- NA_character_ } if (is.null(seqinfo)) seqinfo <- attr(con, "seqinfo") ## check for a track line line <- scanTrackLine(con) if (!is.null(line) && trackLine) { pushBack(line, con) ans <- import.ucsc(initialize(file, resource = con), drop = TRUE, trackLine = FALSE, genome = genome, colnames = colnames, which = which, seqinfo = seqinfo, extraCols = extraCols) return(ans) } bedClasses <- colClasses(file) bedNames <- names(bedClasses) normArgColnames <- function(validNames) { if (is.null(colnames)) colnames <- validNames else { colnames <- unique(c(head(bedNames, 3), as.character(colnames))) if ("thick" %in% colnames) colnames <- c(setdiff(colnames, "thick"), "thickStart", "thickEnd") if ("blocks" %in% colnames) colnames <- c(setdiff(colnames, "blocks"), "blockStarts", "blockSizes", "blockCount") missingCols <- setdiff(colnames, validNames) if (length(missingCols)) stop("Requested column(s) ", paste("'", missingCols, "'", sep = "", collapse = ", "), " are not valid columns or were not found in the file") } colnames } ## read a single line to get ncols up-front, ## and thus specify all col classes ## FIXME: reading in 'as.is' to save memory, line <- readLines(con, 1, warn=FALSE) ## UCSC seems to use '#' at beginning to indicate comment. while(length(line) && (!nzchar(line) || substring(line, 1, 1) == "#")) { line <- readLines(con, 1, warn=FALSE) } if (length(line)) { `tail<-` <- function(x, n, value) if (n != 0) c(head(x, -n), value) else x pushBack(line, con) pattern <- if (sep == "") "\\s+" else "\\t" colsInFile <- seq_len(length(strsplit(line, pattern)[[1L]])) presentNames <- bedNames[colsInFile] lacksNames <- is.null(names(extraCols)) || any(names(extraCols) == "") || any(is.na(names(extraCols))) if (length(extraCols) > 0L && lacksNames) stop("'extraCols' must have valid names") reservedNames <- c(names(bedClasses), "thick", "blocks") conflictingNames <- intersect(reservedNames, names(extraCols)) if (length(conflictingNames) > 0L) { stop("'names(extraCols)' contains reserved name(s): ", paste0("'", conflictingNames, "'", collapse=", ")) } tail(presentNames, length(extraCols)) <- names(extraCols) bedNames <- presentNames presentClasses <- bedClasses[colsInFile] tail(presentClasses, length(extraCols)) <- unname(extraCols) colnames <- normArgColnames(presentNames) bedClasses <- ifelse(presentNames %in% colnames, presentClasses, "NULL") bed <- DataFrame(read.table(con, colClasses = bedClasses, as.is = TRUE, na.strings = c(".", na.strings), comment.char = "", sep = sep, quote = "")) } else { if (is.null(colnames)) colnames <- character() else colnames <- normArgColnames(bedNames) keepCols <- bedNames %in% colnames bed <- DataFrame(as.list(sapply(bedClasses[keepCols], vector))) } colnames(bed) <- bedNames[bedNames %in% colnames] bed <- bed[substring(bed$chrom, 1, 1) != "#",] if (!is.null(bed$thickStart)) { thickEnd <- bed$thickEnd if (is.null(thickEnd)) thickEnd <- bed$end bed$thick <- IRanges(bed$thickStart + 1L, thickEnd) bed$thickStart <- bed$thickEnd <- NULL } color <- bed$itemRgb if (is.character(color)) { # could be NULL spec <- color != "0" cols <- unlist(strsplit(color[spec], ",", fixed=TRUE), use.names=FALSE) cols <- matrix(as.integer(cols), 3) color <- rep(NA, nrow(bed)) color[spec] <- rgb(cols[1,], cols[2,], cols[3,], maxColorValue = 255L) bed$itemRgb <- color } fromCSV <- function(b) { as.integer(unlist(strsplit(b, ",", fixed = TRUE))) } if (!is.null(bed$blockStarts)) { blocks <- relist(IRanges(fromCSV(bed$blockStarts) + 1L, width = fromCSV(bed$blockSizes)), PartitioningByWidth(bed$blockCount)) names(blocks) <- NULL bed$blockStarts <- bed$blockSizes <- bed$blockCount <- NULL bed$blocks <- blocks } GenomicData(IRanges(bed$start + 1L, bed$end), bed[-(1:3)], chrom = bed$chrom, genome = genome, seqinfo = seqinfo, which = which) }) setGeneric("colClasses", function(x) standardGeneric("colClasses")) setMethod("colClasses", "BEDFile", function(x) { c(chrom="character", start="integer", end="integer", name="character", score="numeric", strand="character", thickStart="integer", thickEnd="integer", itemRgb="character", blockCount="integer", blockSizes="character", blockStarts="character") }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### narrowPeak support ### setGeneric("import.narrowPeak", function(con, ...) standardGeneric("import.narrowPeak")) setMethod("import.narrowPeak", "ANY", function(con, ...) { import(con, format = "narrowPeak", ...) }) setMethod("import", "NarrowPeakFile", function(con, ...) { callNextMethod(con = con, extraCols = c(signalValue = "numeric", pValue = "numeric", qValue = "numeric", peak = "integer"), ... ) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### broadPeak support ### setGeneric("import.broadPeak", function(con, ...) standardGeneric("import.broadPeak")) setMethod("import.broadPeak", "ANY", function(con, ...) { import(con, format = "broadPeak", ...) }) setMethod("import", "BroadPeakFile", function(con, ...) { callNextMethod(con = con, extraCols = c(signalValue = "numeric", pValue = "numeric", qValue = "numeric"), ... ) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### BED15 (Microarray) Support ### setMethod("import", "BED15File", function(con, format, text, trackLine = NULL, genome = NA, which = NULL) { if (!missing(format)) checkArgFormat(con, format) if (is.null(trackLine)) return(import.ucsc(con, drop = TRUE, genome = genome, which = which)) bed <- callNextMethod() if (!length(bed)) return(bed) ids <- strsplit(values(bed)$expIds[1], ",", fixed=TRUE)[[1]] expNames <- trackLine@expNames[as.integer(ids) + 1L] scores <- unlist(strsplit(values(bed)$expScores, ",", fixed=TRUE), use.names=FALSE) scores <- as.numeric(scores) scores[scores == -10000] <- NA # stupid UCSC convention scores <- split(scores, gl(length(expNames), 1, length(scores))) names(scores) <- expNames nonExpCols <- setdiff(colnames(values(bed)), c("expCount", "expScores", "expIds")) values(bed) <- values(bed)[,nonExpCols] values(bed) <- cbind(values(bed), do.call(DataFrame, scores)) bed }) setGeneric("import.bed15", function(con, ...) standardGeneric("import.bed15"), signature = "con") setMethod("import.bed15", "ANY", function(con, ...) { import(con, "bed15", ...) }) setGeneric("export.bed15", function(object, con, ...) standardGeneric("export.bed15")) setMethod("export.bed15", "ANY", function(object, con, ...) { export(object, con, "bed15", ...) }) ### FIXME: dispatch will break when 'object' is a UCSCData ### Possible solution: just merge this code with the main BEDFile method? setMethods("export", list(c("GenomicRanges", "BED15File"), c("UCSCData", "BED15File")), function(object, con, format, expNames = NULL, trackLine = NULL, ...) { if (!missing(format)) checkArgFormat(con, format) if (is.null(trackLine)) { ## ensure we do not override existing track line parameter if (is.null(expNames) && is(object, "UCSCData") && is(object@trackLine, "Bed15TrackLine")) expNames <- object@trackLine@expNames return(export.ucsc(object, con, expNames = expNames, ...)) } expNames <- trackLine@expNames object$expCount <- rep(length(expNames), length(object)) object$expIds <- rep(paste(seq_along(expNames)-1, collapse=","), length(object)) scores <- as.list(mcols(object)[expNames]) scores <- do.call(paste, c(scores, sep = ",")) scores <- gsub("NA", "-10000", scores, fixed=TRUE) if (length(scores) == 0L) { scores <- rep("", length(object)) } object$expScores <- scores callNextMethod(object, con, ...) }) setClass("Bed15TrackLine", representation(expStep = "numeric", expScale = "numeric", expNames = "character_OR_NULL"), prototype(expStep = 0.5, expScale = 3.0), contains = "BasicTrackLine") # not sure which fields work setAs("Bed15TrackLine", "character", function(from) { str <- as(as(from, "TrackLine"), "character") paste(str, " type=array ", " expScale=", from@expScale, " expStep=", from@expStep, " expNames=\"", paste(from@expNames, collapse=","), "\"", sep = "") }) setAs("character", "Bed15TrackLine", function(from) { line <- new("Bed15TrackLine", as(from, "TrackLine")) vals <- ucscParsePairs(from) line@expScale <- as.numeric(vals[["expScale"]]) line@expStep <- as.numeric(vals[["expStep"]]) line@expNames <- strsplit(vals[["expNames"]], ",", fixed=TRUE)[[1]] line }) setMethod("fileFormat", "Bed15TrackLine", function(x) "bed15") setMethod("colClasses", "BED15File", function(x) { c(callNextMethod(), expCount="integer", expIds="character", expScores="character") }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### bedGraph (formerly subset of WIG) support ### setGeneric("import.bedGraph", function(con, ...) standardGeneric("import.bedGraph"), signature = "con") setMethod("import.bedGraph", "ANY", function(con, ...) { import(con, "bedGraph", ...) }) setGeneric("export.bedGraph", function(object, con, ...) standardGeneric("export.bedGraph")) setMethod("export.bedGraph", "ANY", function(object, con, ...) { export(object, con, "bedGraph", ...) }) setMethod("colClasses", "BEDGraphFile", function(x) { c(chrom="character", start="integer", end="integer", score="numeric") }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### BEDPE (bedtools paired end) support ### setMethod("import", "BEDPEFile", function(con, format, text, ...) { gr <- callNextMethod() df <- mcols(gr) mcols(gr) <- NULL if (is.null(df$strand2)) df$strand2 <- "*" else df$strand2[is.na(df$strand2)] <- "*" seqlevels(gr) <- union(seqlevels(gr), unique(df$chrom2)) gr2 <- with(df, GRanges(chrom2, IRanges(start2+1L, end2), strand2, seqinfo=seqinfo(gr))) df <- subset(df, select=-(chrom2:end2)) df$strand2 <- NULL Pairs(gr, gr2, df) }) setMethod("colClasses", "BEDPEFile", function(x) { c(chrom="character", start="integer", end="integer", chrom2="character", start2="integer", end2="integer", name="character", score="numeric", strand="character", strand2="character") }) setMethod("export", c("ANY", "BEDPEFile"), function(object, con, format, ...) { if (!missing(format)) checkArgFormat(con, format) cl <- class(object) track <- try(as(object, "Pairs"), silent = TRUE) if (class(track) == "try-error") { stop("cannot export object of class '", cl, "': ", track) } export(track, con, ...) }) setMethod("export", c("Pairs", "BEDPEFile"), function(object, con, format, append = FALSE, ignore.strand = FALSE) { if (!missing(format)) checkArgFormat(con, format) df <- data.frame( seqnames(first(object)), start(first(object)) - 1L, end(first(object)), seqnames(second(object)), start(second(object)) - 1L, end(second(object)) ) score <- mcols(object)$score if (!is.null(score)) { if (!is.numeric(score) || any(is.na(score))) stop("Scores must be non-NA numeric values") } else { score <- 0 } name <- mcols(object)$name if (is.null(name)) name <- names(object) if (is.null(name)) name <- rep(NA, length(object)) df$name <- name df$score <- score if (ignore.strand) { strand1 <- NA # strand cannot be null in bedpe strand2 <- NA } else { strand1 <- strand(first(object)) strand2 <- strand(second(object)) strand1[strand1 == "*"] <- NA strand2[strand2 == "*"] <- NA } df$strand1 <- strand1 df$strand2 <- strand2 mcol_names <- setdiff(names(mcols(object)), c("name", "score")) df <- cbind(df, mcols(object)[,mcol_names]) scipen <- getOption("scipen") options(scipen = 100) # prevent use of scientific notation on.exit(options(scipen = scipen)) file <- con m <- manager() con <- connection(m, con, if (append) "a" else "w") on.exit(release(m, con), add=TRUE) write.table(df, con, sep = "\t", col.names = FALSE, row.names = FALSE, quote = FALSE, na = ".") invisible(file) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Coercion ### setGeneric("asBED", function(x, ...) standardGeneric("asBED")) setMethod("asBED", "GRangesList", function(x) { x_range <- range(x) if (any(elementNROWS(x_range) != 1L)) stop("Empty or multi-strand/seqname elements not supported by BED") gr <- unlist(x_range, use.names=FALSE) mcols(gr) <- mcols(x) mcols(gr)$name <- names(x) x_ranges <- ranges(unlist(x, use.names=FALSE)) ord_start <- order(togroup(PartitioningByEnd(x)), start(x_ranges)) x_ranges <- shift(x_ranges, 1L - rep(start(gr), elementNROWS(x)))[ord_start] mcols(gr)$blocks <- relist(x_ranges, x) gr }) setMethod("asBED", "GAlignments", function(x) { x <- grglist(x) callGeneric() }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Utilities ### setGeneric("blocks", function(x, ...) standardGeneric("blocks")) setMethod("blocks", "GenomicRanges", function(x) { if (is.null(mcols(x)$blocks)) { return(as(x, "GRangesList")) } block_counts <- elementNROWS(mcols(x)$blocks) gr <- GRanges(rep(seqnames(x), block_counts), shift(unlist(mcols(x)$blocks, use.names = FALSE), rep(start(x), block_counts) - 1L), rep(strand(x), block_counts)) seqinfo(gr) <- seqinfo(x) ans <- relist(gr, mcols(x)$blocks) mcols(ans) <- subset(mcols(x), select=-blocks) names(ans) <- if (!is.null(names(x))) names(x) else x$name ans }) rtracklayer/R/bigBed.R0000644000175100017510000002511414614231172015621 0ustar00biocbuildbiocbuild### ========================================================================= ### BigBed support ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Classes ### setClass("BigBedFile", contains = "BiocFile") setClass("BBFile", contains = "BigBedFile") BigBedFile <- function(path) { if (!isSingleString(path)) stop("'filename' must be a single string, specifying a path") new("BigBedFile", resource = path) } BBFile <- BigBedFile setMethod("seqinfo", "BigBedFile", function(x) { seqlengths <- .Call(BBDFile_seqlengths, expandPath(path(x))) Seqinfo(names(seqlengths), seqlengths) }) .defaultColNames <- c("name", "score", "thick", "itemRgb", "blocks") setClass("BigBedSelection", prototype = prototype(colnames = .defaultColNames), contains = "RangedSelection") BigBedSelection <- function(ranges=IRangesList(), colnames = .defaultColNames) { if (is.character(ranges)) new("BigBedSelection", GenomicSelection(ranges, colnames = colnames)) else { if (is(ranges, "BigBedFile")) ranges <- seqinfo(ranges) new("BigBedSelection", ranges = as(ranges, "IntegerRangesList"), colnames = colnames) } } setAs("IntegerRangesList", "BigBedSelection", function(from) { new("BigBedSelection", as(from, "RangedSelection"), colnames = .defaultColNames) }) setAs("GenomicRanges", "BigBedSelection", function(from) { as(as(from, "IntegerRangesList"), "BigBedSelection") }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Import ### setGeneric("import.bb", function(con, ...) standardGeneric("import.bb")) setMethod("import.bb", "ANY", function(con, ...) { import(con, "BigBed", ...) }) setMethod("import", "BigBedFile", function(con, format, text, selection = BigBedSelection(which, ...), which = con, ...) { if (!missing(format)) checkArgFormat(con, format) si <- seqinfo(con) selection <- as(selection, "BigBedSelection") ranges <- ranges(selection) badSpaces <- setdiff(names(ranges)[lengths(ranges) > 0L], seqlevels(si)) if (length(badSpaces) > 0L) warning("'which' contains seqnames not known to BigBed file: ", paste(badSpaces, collapse = ", ")) ranges <- ranges[names(ranges) %in% seqlevels(si)] flatranges <- unlist(ranges, use.names = FALSE) if (is.null(flatranges)) flatranges <- IRanges() which_rl <- split(flatranges, factor(space(ranges), seqlevels(si))) which <- GRanges(which_rl) allFields <- .Call(BBDFile_fieldnames, expandPath(path(con))) defaultFields <- allFields[[1L]] ValidextraFields <- allFields[[2L]] selectedFields <- colnames(selection) extraFields <- setdiff(selectedFields, defaultFields) if (identical(colnames(BigBedSelection()), selectedFields)) { selectedFields <- defaultFields[defaultFields != ""] extraFields <- ValidextraFields[ValidextraFields != ""] } if (!identical(selectedFields, defaultFields)) { defaultFields <- defaultFields[defaultFields != ""] ValidextraFields <- ValidextraFields[ValidextraFields != ""] defaultFieldIndexes <- which(defaultFields %in% selectedFields) extraFieldIndexes <- which(ValidextraFields %in% extraFields) invalidFields <- setdiff(extraFields, ValidextraFields) if (length(defaultFieldIndexes) == 0L) defaultFieldIndexes <- c(0L) if (length(extraFieldIndexes) == 0L) extraFieldIndexes <- c(0L) if (length(invalidFields)) warning("Invalid ", invalidFields, " field(s)") }else { defaultFieldIndexes <- c() extraFieldIndexes <- c() } defaultNames <- defaultFields[defaultFields %in% selectedFields] extraNames <- ValidextraFields[ValidextraFields %in% extraFields] C_ans <- .Call(BBDFile_query, expandPath(path(con)), as.character(seqnames(which)), ranges(which), defaultFieldIndexes, extraFieldIndexes) nhits <- C_ans[[1L]] gr <- GRanges(rep(seqnames(which), nhits), C_ans[[3L]], seqinfo=si) if (!is.null(C_ans[[4L]])) strand(gr) <- gsub(".", "*", C_ans[[4L]], fixed = TRUE) blocksPosition <- which(defaultNames %in% c("blocks")) if (length(blocksPosition)) { blocksPosition <- 4 + blocksPosition C_ans[[blocksPosition]] <- IRangesList(C_ans[[blocksPosition]]) } val <- c() if (length(defaultFieldIndexes) && defaultFieldIndexes[1] != 0) val <- c(Filter(Negate(is.null), C_ans[5L:length(C_ans)])) val <- c(val, Filter(Negate(is.null), C_ans[[2L]])) elementMetadata <- DataFrame(val) names(elementMetadata) <- c(defaultNames ,extraNames) gr@elementMetadata <- elementMetadata gr }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export ### setGeneric("export.bb", function(object, con, ...) standardGeneric("export.bb")) setMethod("export.bb", "ANY", function(object, con, ...) { export(object, con, "BigBed", ...) }) setMethod("export", c("ANY", "BigBedFile"), function(object, con, format, ...) { object <- as(object, "GRanges") callGeneric() }) setMethod("export", c("GenomicRanges", "BigBedFile"), function(object, con, format, compress = TRUE, extraIndexes = "") { if (!missing(format)) checkArgFormat(con, format) con <- path.expand(path(con)) object <- sortBySeqnameAndStart(object) seqlengths <- seqlengths(object) stopIfNotValidForExport(object) if (!is.character(extraIndexes)) stop("The extraIndexes must be character") if (any(is.na(seqlengths))) stop("Unable to determine seqlengths; either specify ", "'seqlengths' or specify a genome on 'object' that ", "is known to BSgenome or UCSC") if (!isTRUEorFALSE(compress)) stop("'compress' must be TRUE or FALSE") seqlengths <- seqlengths(object) bedString <- bedString(object) autoSqlString <- autoSqlString(object) extraIndexes <- gsub("[\n\t ]", "", extraIndexes, perl = TRUE) invisible(BigBedFile(.Call(BBDFile_write, seqlengths, bedString, autoSqlString, extraIndexes, compress, con))) }) stopIfNotValidForExport <- function(x) { elementMetadata <- elementMetadata(x) name <- elementMetadata$name score <- elementMetadata$score itemRgb <- elementMetadata$itemRgb thick <- elementMetadata$thick blocks <- elementMetadata$blocks if (!is.null(name) && (!is.character(name) || any(is.na(name)))) stop("The name must be character, without any NA's") if (isValidScore(score)) stop("The score must be numeric, without any NA's") if (!is.null(itemRgb) && (!is.character(itemRgb) || any(is.na(itemRgb)))) stop("The itemRgb must be character, without any NA's") if (!is.null(thick) && !is(thick, "IRanges")) stop("The thick must be IRanges") if (!is.null(blocks) && !is(blocks, "IRangesList")) stop("The blocks must be IRangesList") } bedString <- function(x) { elementMetadata <- elementMetadata(x) name <- elementMetadata$name elementMetadata$name <- NULL score <- elementMetadata$score elementMetadata$score <- NULL strand <- as.character(strand(x)) strand <- gsub("*", ".", strand, fixed = TRUE) thick <- elementMetadata$thick thickStart <- NULL thickEnd <- NULL if (!is.null(thick)) { thickStart <- start(ranges(thick)) thickEnd <- end(ranges(thick)) elementMetadata$thick <- NULL } itemRgb <- as.data.frame(t(col2rgb(elementMetadata$itemRgb))) itemRgb <- do.call(paste, c(itemRgb, sep=",")) elementMetadata$itemRgb <- NULL blocks <- elementMetadata$blocks blockCount <- NULL blockSizes <- NULL blockStarts <- NULL if (!is.null(blocks)) { length <- length(blocks) blockCount <- lengths(blocks) blockSizes <- lapply(width(blocks), function(x) paste(x, collapse=",")) blockStarts <- lapply(start(blocks), function(x) paste(x, collapse=",")) elementMetadata$blocks <- NULL } extraColumnsString <- do.call(paste, as.list(elementMetadata)) paste(as.character(seqnames(x)), start(ranges(x)), end(ranges(x)), name, score, strand, thickStart, thickEnd, itemRgb, blockCount, blockSizes, blockStarts, extraColumnsString, collapse = "\n") } autoSqlString <- function(x) { asString <- c('table bed "Browser Extensible Data" (\n', 'string chrom; "Reference sequence chromosome or scaffold"\n', 'uint chromStart; "Start position in chromosome"\n', 'uint chromEnd; "End position in chromosome"\n') names <- c("name", "itemRgb", "score", "thick", "blocks", "double", "integer", "character", "raw") values <- c('string name; "Name of item."\n', 'uint reserved; "Used as itemRgb as of 2004-11-22"\n', 'uint score; "Score (0-1000)"\nchar[1] strand; "+ or - for strand"\n', paste0('uint thickStart; "Start of where display should be thick (start codon)"\n', 'uint thickEnd; "End of where display should be thick (stop codon)"\n'), paste0('int blockCount; "Number of blocks"\n', 'int[blockCount] blockSizes; "Comma separated list of block sizes"\n', 'int[blockCount] chromStarts; "Start positions relative to chromStart"\n'), "double ", "int ", "string ", "uint ") mapping <- setNames(values, names) metadata <- elementMetadata(x) names <- names(metadata) defaultFields <- colnames(BigBedSelection()) fieldsString <- lapply(names, function(y) { if (y %in% defaultFields) mapping[y] else { typeString <- mapping[storage.mode(metadata[[y]])] paste(typeString, y, '; ""\n') } }) asString <- c(asString, fieldsString, ')') paste(asString, collapse = "") } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Utilities ### cleanupBigBedCache <- cleanupBigWigCache rtracklayer/R/bigWig.R0000644000175100017510000003233114614231172015654 0ustar00biocbuildbiocbuild### ========================================================================= ### BigWig support ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Classes ### setClass("BigWigFile", contains = "BiocFile") setClass("BWFile", contains = "BigWigFile") BigWigFile <- function(path) { if (!isSingleString(path)) stop("'filename' must be a single string, specifying a path") new("BigWigFile", resource = path) } BWFile <- BigWigFile setMethod("seqinfo", "BigWigFile", function(x) { seqlengths <- .Call(BWGFile_seqlengths, expandPath(path(x))) Seqinfo(names(seqlengths), seqlengths) # no circularity information }) setClass("BigWigFileList", contains = "BiocFileList", prototype = prototype(elementType = "BigWigFile")) BigWigFileList <- function(path) { new("BigWigFileList", listData = (lapply(path, BigWigFile))) } setMethod("path", "BigWigFileList", function(object, ...) { sapply(as.list(object), path) }) .allowedColNames <- list(bigWig = "score") .validateColNames <- function(object, format) { allowedColNames <- .allowedColNames[[format]] invalidColNames <- setdiff(colnames(object), allowedColNames) if (length(invalidColNames)) paste("Column names", paste("'", invalidColNames, "'", sep = "", collapse=", "), "are invalid for the", format, "format.") else NULL } setClass("BigWigSelection", prototype = prototype(colnames = "score"), contains = "RangedSelection") setValidity("BigWigSelection", function(object) { .validateColNames(object, "bigWig") }) BigWigSelection <- function(ranges=IRangesList(), colnames = "score") { if (!is.character(colnames) || (length(colnames) && !identical(colnames, "score"))) stop("'score' is the only valid column for BigWig") if (is.character(ranges)) new("BigWigSelection", GenomicSelection(ranges, colnames = colnames)) else { if (is(ranges, "BigWigFile")) ranges <- seqinfo(ranges) new("BigWigSelection", ranges = as(ranges, "IntegerRangesList"), colnames = colnames) } } setAs("IntegerRangesList", "BigWigSelection", function(from) { new("BigWigSelection", as(from, "RangedSelection"), colnames = "score") }) setAs("GenomicRanges", "BigWigSelection", function(from) { as(as(from, "IntegerRangesList"), "BigWigSelection") }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export ### setGeneric("export.bw", function(object, con, ...) standardGeneric("export.bw")) setMethod("export.bw", "ANY", function(object, con, ...) { export(object, con, "BigWig", ...) }) setMethod("export", c("ANY", "BigWigFile"), function(object, con, format, ...) { object <- as(object, "GRanges") callGeneric() }) setMethod("export", c("GenomicRanges", "BigWigFile"), function(object, con, format, dataFormat = c("auto", "variableStep", "fixedStep", "bedGraph"), compress = TRUE, fixedSummaries = FALSE) { if (!missing(format)) checkArgFormat(con, format) con <- path.expand(path(con)) object <- sortBySeqnameAndStart(object) score <- score(object) if (isValidScore(score)) stop("The score must be numeric, without any NA's") if (!isTRUEorFALSE(compress)) stop("'compress' must be TRUE or FALSE") seqlengths <- seqlengths(object) if (any(is.na(seqlengths))) stop("Unable to determine seqlengths; either specify ", "'seqlengths' or specify a genome on 'object' that ", "is known to BSgenome or UCSC") sectionPtr <- NULL # keep adding to the same linked list .bigWigWriter <- function(chromData, con, dataFormat, append) { if (length(chromData) == 0L) return() if (any(tail(start(chromData), -1) <= head(end(chromData), -1))) stop("BigWig ranges cannot overlap") sectionPtr <<- .Call(BWGSectionList_add, sectionPtr, as.vector(seqnames(chromData)[1]), as(ranges(chromData), "IRanges"), as.numeric(score(chromData)), dataFormat) } dataFormat <- match.arg(dataFormat) if (dataFormat == "auto") format <- chooseGraphType(object) else format <- dataFormat on.exit(.Call(BWGSectionList_cleanup, sectionPtr)) if (format == "bedGraph") lapply(split(object, seqnames(object)), .bigWigWriter, con, dataFormat) else export.wig(object, con, dataFormat = dataFormat, writer = .bigWigWriter, trackLine = FALSE) storage.mode(seqlengths) <- "integer" invisible(BigWigFile(.Call(BWGSectionList_write, sectionPtr, seqlengths, compress, fixedSummaries, con))) }) setMethod("export", c("List", "BigWigFile"), function(object, con, format, compress = TRUE, fixedSummaries = FALSE) { if (!missing(format)) checkArgFormat(con, format) con <- path.expand(path(con)) if (!isTRUEorFALSE(compress)) stop("'compress' must be TRUE or FALSE") if (is.null(names(object))) stop("'object' must have names") seqlengths <- elementNROWS(object) sectionPtr <- NULL # keep adding to the same linked list on.exit(.Call(BWGSectionList_cleanup, sectionPtr)) writer <- BigWigWriter(object) for(chr in names(object)) { sectionPtr <- writer(chr, sectionPtr) } invisible(BigWigFile(.Call(BWGSectionList_write, sectionPtr, seqlengths, compress, fixedSummaries, con))) }) setGeneric("BigWigWriter", function(x) standardGeneric("BigWigWriter")) setMethod("BigWigWriter", "RleList", function(x) { function(chr, sectionPtr) { .Call(BWGSectionList_add, sectionPtr, chr, ranges(x[[chr]]), as.numeric(runValue(x[[chr]])), "bedGraph") } }) setMethods("BigWigWriter", list("IntegerList", "NumericList"), function(x) { function(chr, sectionPtr) { .Call(BWGSectionList_add, sectionPtr, chr, NULL, as.numeric(x[[chr]]), "fixedStep") } }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Import ### setGeneric("import.bw", function(con, ...) standardGeneric("import.bw")) setMethod("import.bw", "ANY", function(con, ...) { import(con, "BigWig", ...) }) ### Consider the use cases: ### - Extract whole genome or whole chromosome coverage as Rle (ChIP-seq) ### - Use coverage() fast path ### - Extract single position coverage for millions of variants ### - Slow to query by position, so extract whole genome/chromosome (above), ### then use findRun trick. ### - Extract single position coverage for a hundred hot-spot variants ### - coverage() should be fast enough, followed by findRun trick. ### - Extract coverage for one/all genes and summarize (RNA-seq?) ### - probably want summarize,BigWigFile setMethod("import", "BigWigFile", function(con, format, text, selection = BigWigSelection(which, ...), which = con, as = c("GRanges", "RleList", "NumericList"), ...) { if (!missing(format)) checkArgFormat(con, format) as <- match.arg(as) if (is(which, "GenomicRanges") && as == "NumericList") { orig_order <- order(seqnames(which)) } selection <- as(selection, "BigWigSelection") validObject(selection) si <- seqinfo(con) which <- ranges(selection) badSpaces <- setdiff(names(which)[lengths(which) > 0L], seqlevels(si)) if (length(badSpaces) > 0L) warning("'which' contains seqnames not known to BigWig file: ", paste(badSpaces, collapse = ", ")) which <- which[names(which) %in% seqlevels(si)] flatWhich <- unlist(which, use.names = FALSE) if (is.null(flatWhich)) flatWhich <- IRanges() which_rl <- split(flatWhich, factor(space(which), seqlevels(si))) if (as != "NumericList") { which_rl <- as(which, "NormalIRangesList") } which <- GRanges(which_rl) names(which) <- names(unlist(which_rl, use.names=FALSE)) C_ans <- .Call(BWGFile_query, expandPath(path(con)), as.character(seqnames(which)), ranges(which), identical(colnames(selection), "score"), as == "NumericList") if (as == "NumericList") { ans <- as(C_ans, "NumericList") names(ans) <- names(which) metadata(ans) <- list(ranges = as(which, "GRanges")) if (exists("orig_order")) { ans[orig_order] <- ans } ans } else { nhits <- C_ans[[3L]] gr <- GRanges(rep(seqnames(which), nhits), C_ans[[1L]], seqinfo=si) gr$score <- C_ans[[2L]] if (as == "RleList") { coverage(gr, weight="score") } else { strand(gr) <- "*" gr } } }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Summary ### setMethod("summary", "BigWigFile", function(object, which = as(seqinfo(object), "GenomicRanges"), size = 1L, type = c("mean", "min", "max", "coverage", "sd"), defaultValue = NA_real_, asRle = FALSE, as = c("GRangesList", "RleList", "matrix"), ...) { ### FIXME: could do with "GenomicRanges" here, but ### coercions generally only exist for GRanges specifically which <- as(which, "GRanges") if (!is.numeric(size)) stop("'size' must be numeric") size <- recycleIntegerArg(size, "size", length(which)) as <- match.arg(as) if (any(size > width(which)) && as != "matrix") stop("some 'which' are smaller than 'size'; ", "consider passing as='matrix'") if (as == "matrix" && (length(size) == 0L || any(size != size[1L]))) stop("for as='matrix', there must be one unique 'size'") type <- match.arg(type) if (!missing(asRle)) warning("argument asRle is deprecated; use as='RleList'") if (asRle) as <- "RleList" if (type == "sd") type <- "std" if (!isSingleNumberOrNA(defaultValue)) stop("'defaultValue' must be a single number or NA") summaryList <- .Call(BWGFile_summary, path.expand(path(object)), as.character(seqnames(which)), ranges(which), size, type, as.numeric(defaultValue)) if (as == "matrix") { return(do.call(rbind, summaryList)) } tiles <- tile(which, n = size) if (asRle) { setNames(RleList(mapply(Rle, summaryList, as.list(width(tiles))), compress=FALSE), names(which)) } else { tiles <- unlist(tiles) tiles$score <- unlist(summaryList) relist(tiles, summaryList) } }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Conversion ### wigToBigWig <- function(x, seqinfo, dest = paste(file_path_sans_ext(x, TRUE), "bw", sep = "."), clip = FALSE) { if (!isSingleString(x)) stop("'x' must be a single string, the path to a WIG file") if (!isSingleString(dest)) stop("'dest' must be a single string, the path to the BigWig output") if (!is(seqinfo, "Seqinfo")) stop("'seqinfo' must be NULL or a Seqinfo object") if (!isTRUEorFALSE(clip)) stop("'clip' must be TRUE or FALSE") seqlengths <- seqlengths(seqinfo) if (any(is.na(seqlengths))) stop("'seqlengths(seqinfo)' must not contain any 'NA' values") x <- path.expand(x) dest <- path.expand(dest) ans <- .Call(BWGFile_fromWIG, x, clip, seqlengths, dest) invisible(BigWigFile(ans)) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Utilities ### ## Remote data are cached locally. Need a way to cleanup. cleanupBigWigCache <- function(maxDays = 0) { stopifnot(isSingleNumber(maxDays)) dir <- "/tmp/udcCache" if (file.exists(dir)) { invisible(.Call(R_udcCleanup, maxDays)) } } rtracklayer/R/browser.R0000644000175100017510000001617214614231172016134 0ustar00biocbuildbiocbuild## central abstraction, represents a genome browser ## Question: is a browser session a database of tracks? No question ## that a browser has a track database. The question is of ## inheritance. Historically, browser session has had all the behavior ## we expect from a track database. But it is so much more. In ## particular, it has a list of views. We want to separate the data ## from the views. It is tempting to have the model (tracks) and views ## in separate objects, composed together in a session. However, the ## reality is that browser sessions are monolithic: UCSC can view only ## data UCSC knows, IGB can view only data IGB knows. Thus, we use ## simple inheritance here, saving many refactoring headaches. setClass("BrowserSession", contains = c("TrackDb", "VIRTUAL")) ## alias for names() for clarity in the session context setGeneric("trackNames", function(object, ...) standardGeneric("trackNames")) setGeneric("trackNames<-", function(object, ..., value) standardGeneric("trackNames<-")) setMethod("names", "BrowserSession", function(x) trackNames(x)) setMethod("trackNames", "BrowserSession", function(object) names(object)) ## a single genome view in a session setClass("BrowserView", representation(session = "BrowserSession"), contains = "VIRTUAL") # create one or more browser views setGeneric("browserView", function(object, range, track, ...) standardGeneric("browserView")) # get the views from the browser setGeneric("browserViews", function(object, ...) standardGeneric("browserViews")) # get/set active view setGeneric("activeView", function(object) standardGeneric("activeView")) setGeneric("activeView<-", function(object, value) standardGeneric("activeView<-")) setMethod("activeView", "BrowserSession", function(object) { views <- browserViews(object) active <- sapply(views, activeView) if (any(active)) views[[tail(which(active),1)]] else NULL }) setMethod("show", "BrowserSession", function(object) { cat("A genome browser session of class '", class(object), "' with ", length(browserViews(object)), " views and ", length(trackNames(object)), " tracks\n", sep ="") }) # close a session or view setGeneric("close", function(con, ...) standardGeneric("close")) # FIXME: what about isOpen? # get/set visibility of view tracks setGeneric("visible", function(object, ...) standardGeneric("visible")) setMethod("visible", "BrowserView", function(object) { trackNames(browserSession(object)) %in% trackNames(object) }) setGeneric("visible<-", function(object, ..., value) standardGeneric("visible<-")) setReplaceMethod("visible", "BrowserView", function(object, value) { trackNames(object) <- names(value)[value] object }) # get/set the selected features in e.g. a view # this can return a list, with a logical vector for each track setGeneric("selectedFeatures", function(object, ...) standardGeneric("selectedFeatures")) setGeneric("selectedFeatures<-", function(object, value) standardGeneric("selectedFeatures<-")) setMethod("show", "BrowserView", function(object) { range <- range(object) cat(class(object), "of", paste(names(range), ":", unlist(start(range)), "-", unlist(end(range)), sep = ""), "\n") nms <- paste("'", names(trackNames(object)), "'", sep = "") cat(S4Vectors:::labeledLine("trackNames", nms)) }) setClass("BrowserViewList", contains = "SimpleList", prototype = prototype(elementType = "BrowserView")) BrowserViewList <- function(...) { views <- list(...) if (length(views) == 1 && is.list(views[[1L]])) views <- views[[1L]] if (!all(sapply(views, is, "BrowserView"))) stop("all elements in '...' must be BrowserView objects") S4Vectors:::new_SimpleList_from_list("BrowserViewList", views) } # get genome range of active view (or default if no views) setMethod("range", "BrowserSession", function(x, ..., na.rm) { if (length(...) > 0) stop("arguments in '...' ignored") view <- activeView(x) if (!is.null(view)) range(view) else NULL }) setGeneric("range<-", function(x, ..., value) standardGeneric("range<-")) ## just the genome, for convenience setMethod("genome", "BrowserSession", function(x) genome(range(x))) setReplaceMethod("genome", "BrowserSession", function(x, value) { if (!isSingleString(value)) stop("'genome' must be a single string") genome(range(x)) <- value x }) # high-level entry point setGeneric("browseGenome", function(object, ...) standardGeneric("browseGenome")) setMethod("browseGenome", "missing", function(object, ...) browseGenome(GRanges(compress=FALSE), ...)) setMethod("browseGenome", "GenomicRanges_OR_GenomicRangesList", function(object, browser = "UCSC", range = base::range(object), view = TRUE, trackParams = list(), viewParams = list(), name = "customTrack", ...) { # initialize session of type identified by 'browser' session <- browserSession(browser, ...) # load 'object' trackParams <- c(list(session), trackParams) if (is(object, "GenomicRanges")) trackParams <- c(trackParams, name = name) session <- do.call(`track<-`, c(trackParams, list(value = object))) # open view of 'range' if (view) { if (!missing(range) && length(range) > 0L) range <- normGenomeRange(range, seqinfo(session)) viewParams <- c(list(session, range), viewParams) do.call(browserView, viewParams) } session }) # list names of available genome browsers genomeBrowsers <- function(where = topenv(parent.frame())) { cl <- getClass("BrowserSession", where = where) browsers <- names(cl@subclasses) browsers <- browsers[!sapply(browsers, isVirtualClass, where)] sub("Session$", "", browsers) } # obtain a browser session setGeneric("browserSession", function(object, ...) standardGeneric("browserSession")) # instantiate a browser session by name setMethod("browserSession", "character", function(object, ...) { class <- paste(object, "Session", sep = "") if (!extends(class, "BrowserSession")) stop("Browser named '", object, "' is unsupported.") new(class, ...) }) setMethod("browserSession", "missing", function(object, ...) browserSession("UCSC", ...)) # get one from a view setMethod("browserSession", "BrowserView", function(object) object@session) setGeneric("login", function(x, username, password, ...) standardGeneric("login"), signature = "x") setGeneric("saveView", function(x, ...) standardGeneric("saveView")) setGeneric("restoreView", function(x, ...) standardGeneric("restoreView")) rtracklayer/R/chain.R0000644000175100017510000001355014614231172015530 0ustar00biocbuildbiocbuild### ========================================================================= ### Chain file parsing and lift over ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Classes ### setClass("ChainBlock", representation(ranges = "IRanges", # start in A, width offset = "integer", # offset to start in B score = "integer", # rle scores space = "character", # rle spaces reversed = "logical", # rle reversal length = "integer")) # lengths for rle slots ##setMethod("length", "ChainBlock", function(x) length(x@offset)) setClass("Chain", prototype = prototype(elementType = "ChainBlock"), contains = "SimpleList") setClass("ChainFile", contains = "BiocFile") ChainFile <- function(path) { if (!isSingleString(path)) stop("'filename' must be a single string, specifying a path") new("ChainFile", resource = path) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Import ### setGeneric("import.chain", function(con, ...) standardGeneric("import.chain")) setMethod("import.chain", "ANY", function(con, ...) { import(con, "chain", ...) }) setMethod("import", "ChainFile", function(con, format, text, exclude = "_") { if (!missing(format)) checkArgFormat(con, format) ### FIXME: use readLines() to read the file, parse lines in C if (!isSingleString(resource(con)) || isURL(resource(con))) { stop("chain import currently only handles local, uncompressed file paths") } .Call("readChain", path.expand(path(con)), as.character(exclude), PACKAGE="rtracklayer") }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Accessors ### setMethod("ranges", "ChainBlock", function(x, use.names=TRUE, use.mcols=FALSE) x@ranges ) setMethod("offset", "ChainBlock", function(object) object@offset) setMethod("score", "ChainBlock", function(x) Rle(x@score, x@length)) setMethod("space", "ChainBlock", function(x) Rle(x@space, x@length)) setGeneric("reversed", function(x, ...) standardGeneric("reversed")) setMethod("reversed", "ChainBlock", function(x) Rle(x@reversed, x@length)) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Liftover ### flipStrandSimple <- function(strand, flip) { strand <- as.vector(strand) flipped <- ifelse(flip, ifelse(strand == "+", "-", ifelse(strand == "-", "+", strand)), strand) strand(flipped) } flipStrandTricky <- function(strand, flip) { strandCodes <- c("+" = 1L, "-" = -1L, "*" = 0L) strandInt <- strandCodes[as.vector(strand)] flipped <- ifelse(flip, strandInt * -1L, strandInt) + 2L strandRevCodes <- factor(c("-", "*", "+"), levels(strand())) strandRevCodes[as.vector(flipped)] } smoothGaps <- function(qhits, ranges, offsets) { congruent_gaps <- width(gaps(ranges)) == abs(offsets) congruent_gaps_rle <- Rle(congruent_gaps) congruent_rle <- c(Rle(FALSE), congruent_gaps_rle) group_rle <- Rle(cumsum(!congruent_rle)) group_ranges <- disjoin(ranges(Rle(qhits)), ranges(group_rle)) ans <- range(relist(ranges, group_ranges)) mcols(ans)$qhits <- qhits[start(group_ranges)] mcols(ans)$offsets <- offsets[start(group_ranges)] ans } setGeneric("liftOver", function(x, chain, ...) standardGeneric("liftOver")) setMethod("liftOver", c("GenomicRanges", "Chain"), function(x, chain) { liftOverSpace <- function(gr, chain, subind) { r <- ranges(gr) ol <- findOverlaps(r, ranges(chain)) shits <- subjectHits(ol) r <- overlapsRanges(r, ranges(chain), ol) rev <- as.vector(reversed(chain)[shits]) starts <- ifelse(rev, start(reflect(r, ranges(chain)[shits])), start(r)) strand <- flipStrandTricky(strand(gr)[queryHits(ol)], rev) r <- IRanges(starts, width=width(r)) offsets <- offset(chain)[shits] spaces <- space(chain)[shits] ind[[as.character(seqnames(gr)[1])]] <<- subind[queryHits(ol)] GRanges(spaces, IRanges(start(r) - offsets, end(r) - offsets), strand = strand, values(gr)[queryHits(ol),,drop=FALSE]) } rl <- split(x, seqnames(x), drop = TRUE) unchainedNames <- setdiff(names(rl), names(chain)) if (length(unchainedNames)) message("Discarding unchained sequences: ", paste(unchainedNames, collapse = ", ")) sharedNames <- intersect(names(rl), names(chain)) ind <- split(seq_len(length(x)), as.vector(seqnames(x)))[sharedNames] liftedList <- mapply(liftOverSpace, rl[sharedNames], chain[sharedNames], ind, SIMPLIFY=FALSE) lifted <- unlist(GRangesList(liftedList), use.names=FALSE) f <- structure(as.integer(unlist(ind, use.names=FALSE)), levels=seq_len(length(x)), class="factor") setNames(split(lifted, f), names(x)) }) setMethod("liftOver", c("GRangesList", "Chain"), function(x, chain) { lifted <- liftOver(unlist(x), chain) IRanges:::regroupBySupergroup(lifted, PartitioningByEnd(x)) }) setMethod("liftOver", c("Pairs", "Chain"), function(x, chain) { Pairs(liftOver(first(x), chain), liftOver(second(x), chain)) }) setMethod("liftOver", c("ANY", "ANY"), function(x, chain) { chain <- as(chain, "Chain") x <- granges(x) callGeneric() }) rtracklayer/R/fasta.R0000644000175100017510000000234614614231172015545 0ustar00biocbuildbiocbuild### ========================================================================= ### FASTA support ### ------------------------------------------------------------------------- ### ### Since we have 2bit, we might as well have FASTA ### setClass("FastaFile", contains = "BiocFile") FastaFile <- function(resource) { new("FastaFile", resource = resource) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export ### setMethod("export", c("ANY", "FastaFile"), function(object, con, ...) { export(as(object, "DNAStringSet"), con, ...) }) setMethod("export", c("XStringSet", "FastaFile"), function(object, con, format, ...) { writeXStringSet(object, path(con), format = "fasta", ...) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Import ### setMethod("import", "FastaFile", function(con, format, text, type = c("DNA", "RNA", "AA", "B"), ...) { if (!missing(format)) checkArgFormat(con, format) readFun <- get(paste0("read", match.arg(type), "StringSet"), getNamespace("Biostrings")) readFun(path(con), format = "fasta", ...) }) rtracklayer/R/gff.R0000644000175100017510000004515714614231172015220 0ustar00biocbuildbiocbuild### ========================================================================= ### GFF (General Feature Format) support (all three versions, plus GTF) ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Classes ### setClass("GFFFile", contains = "BiocFile") ## private GFFFile <- function(resource, version = c("", "1", "2", "3")) { version <- match.arg(version) new(gffFileClass(version), resource = resource) } setClass("GFF1File", contains = "GFFFile") GFF1File <- function(resource) { GFFFile(resource, "1") } setClass("GFF2File", contains = "GFFFile") GFF2File <- function(resource) { GFFFile(resource, "2") } setClass("GFF3File", contains = "GFFFile") GFF3File <- function(resource) { GFFFile(resource, "3") } setClass("GTFFile", contains = "GFF2File") GTFFile <- function(resource) { new("GTFFile", GFF2File(resource)) } setClass("GVFFile", contains = "GFF3File") GVFFile <- function(resource) { new("GVFFile", GFF3File(resource)) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export ### setGeneric("export.gff", function(object, con, ...) standardGeneric("export.gff")) setMethod("export.gff", "ANY", function(object, con, ...) { export(object, con, ...) }) setMethod("export", c("ANY", "GFFFile"), function(object, con, format, ...) { if (hasMethod("asGFF", class(object))) object <- asGFF(object) res <- try(as(object, "GRanges"), silent = TRUE) if (is(res, "try-error")) { res <- try(as(object, "GenomicRangedDataList"), silent = TRUE) if (is(res, "try-error")) stop("cannot export object of class '", class(object), "'") } object <- res if (!missing(format)) checkArgFormat(con, format) export(object, con, ...) }) setMethod("export", c("CompressedGRangesList", "GFFFile"), function(object, con, format, ...) { object <- asGFF(object) callGeneric() } ) setMethod("export", c("GRangesList", "GTFFile"), function(object, con, format, ...) { stop("export of GRangesList to GTF is not yet supported") ## there is a start on asGTF() later in this file ## object <- asGTF(object) ## callGeneric() } ) setMethod("export", c("GenomicRanges", "GFFFile"), function(object, con, format, version = c("1", "2", "3"), source = "rtracklayer", append = FALSE, index = FALSE) { if (!missing(format)) checkArgFormat(con, format) if (!missing(version) || !length(gffFileVersion(con))) con <- asGFFVersion(con, match.arg(version)) version <- gffFileVersion(con) file <- con con <- resource(con) if (!append) { cat("", file = con) # clear any existing file gffComment(con, "gff-version", version) sourceVersion <- try(packageVersion(source), TRUE) if (!inherits(sourceVersion, "try-error")) gffComment(con, "source-version", source, sourceVersion) gffComment(con, "date", base::format(Sys.time(), "%Y-%m-%d")) genome <- singleGenome(genome(object)) if (!is.na(genome)) gffComment(con, "genome-build", paste(".", genome, sep = "\t")) } if (index) object <- sortBySeqnameAndStart(object) seqname <- seqnames(object) if (is.null(mcols(object)$ID)) mcols(object)$ID <- names(object) if (version == "3") seqname <- urlEncode(seqname, "a-zA-Z0-9.:^*$@!+_?|-") if (!is.null(mcols(object)$source) && missing(source)) source <- mcols(object)$source else source <- rep(source, length(object)) if (version == "3") source <- urlEncode(source, "\t\n\r;=%&,", FALSE) feature <- mcols(object)$type if (is.null(feature)) feature <- rep("sequence_feature", length(object)) score <- score(object) if (is.null(score)) { score <- rep(NA_real_, length(object)) } else { if (!("score" %in% colnames(mcols(object)))) ## avoid outputting as attribute colnames(mcols(object))[1] <- "score" } strand <- strand(object) if (is.null(strand)) strand <- rep(strand(NA_character_), length(object)) strand[strand == "*"] <- NA_integer_ frame <- mcols(object)$phase if (is.null(frame)) { frame <- rep(NA_integer_, length(object)) if ("CDS" %in% feature) warning(wmsg("The phase information is missing. ", "The written file will contain CDS with ", "no phase information.")) } else { if (anyNA(frame[feature %in% "CDS"])) warning(wmsg("The phase information is missing for some CDS. ", "The written file will contain some CDS with ", "no phase information.")) } table <- data.frame(seqname, source, feature, start(object), end(object), score, strand, frame) attrs <- NULL if (version == "1") { attrs <- mcols(object)$group if (is.null(attrs)) attrs <- as.vector(seqname) } else { builtin <- c("type", "score", "phase", "source") custom <- setdiff(colnames(mcols(object)), builtin) if (length(custom)) { if (version == "3") tvsep <- "=" else tvsep <- " " attrs <- mcols(object) attrs <- as.data.frame(sapply(custom, function(name) { x <- attrs[[name]] x_flat <- if (is(x, "List")) unlist(x, use.names=FALSE) else x x_char <- as.character(x_flat) x_char <- sub(" *$", "", sub("^ *", "", as.character(x_char))) if (version == "3") x_char <- urlEncode(x_char, "%\t\n\r;=&,", FALSE) if (is(x, "List")) { x_char[is.na(x_char)] <- "." x_char <- pasteCollapse(relist(x_char, x)) x_char[elementNROWS(x) == 0] <- NA } ## FIXME: add option so these become "." instead of removing x_char[is.na(x_char)] <- "\r" if (!is.numeric(x_flat) && version != "3") x_char <- paste0("\"", x_char, "\"") paste(name, x_char, sep = tvsep) }, simplify = FALSE)) if (version == "3") sep <- ";" else sep <- "; " attrs <- do.call(paste, c(attrs, sep = sep)) attrs <- gsub("[^;]*?\r\"?(;|$)", "", attrs) attrs[nchar(attrs) == 0] <- NA } } scipen <- getOption("scipen") options(scipen = 100) # prevent use of scientific notation on.exit(options(scipen = scipen)) if (!is.null(attrs)) { # write out the rows with attributes first write.table(cbind(table, attrs)[!is.na(attrs),], con, sep = "\t", na = ".", quote = FALSE, col.names = FALSE, row.names = FALSE, append = TRUE) table <- table[is.na(attrs),] } write.table(table, con, sep = "\t", na = ".", quote = FALSE, col.names = FALSE, row.names = FALSE, append = TRUE) if (index) indexTrack(file) invisible(NULL) }) setMethod("export", c("SimpleGRangesList", "GFFFile"), .export_SimpleGRangesList_BiocFile) setGeneric("export.gff1", function(object, con, ...) standardGeneric("export.gff1")) setMethod("export.gff1", "ANY", function(object, con, ...) export(object, con, "gff1", ...)) setGeneric("export.gff2", function(object, con, ...) standardGeneric("export.gff2")) setMethod("export.gff2", "ANY", function(object, con, ...) export(object, con, "gff2", ...)) setGeneric("export.gff3", function(object, con, ...) standardGeneric("export.gff3")) setMethod("export.gff3", "ANY", function(object, con, ...) export(object, con, "gff3", ...)) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Import ### setGeneric("import.gff", function(con, ...) standardGeneric("import.gff")) setMethod("import.gff", "ANY", function(con, ...) { import(con, "gff", ...) }) setMethod("import", "GFFFile", function(con, format, text, version = c("", "1", "2", "3"), genome = NA, colnames = NULL, which = NULL, feature.type = NULL, sequenceRegionsAsSeqinfo = FALSE) { if (!missing(format)) checkArgFormat(con, format) if (!missing(version)) con <- asGFFVersion(con, match.arg(version)) stopifnot(isTRUEorFALSE(sequenceRegionsAsSeqinfo)) ## download the file first if it's remote if (is.character(resource(con))) { uri <- .parseURI(resource(con)) if (uri$scheme %in% c("ftp", "http")) { destfile <- tempfile() download.file(resource(con), destfile) con@resource <- destfile } } m <- manager() sniff_con <- connection(m, con, "r") on.exit(release(m, sniff_con)) sniffed <- .sniffGFFVersion(sniff_con) version <- gffFileVersion(con) if (!length(version)) { if (is.null(sniffed)) sniffed <- "1" con <- asGFFVersion(con, sniffed) } if (length(version) && !is.null(sniffed) && !identical(sniffed, version)) warning("gff-version directive indicates version is ", sniffed, ", not ", version) if (is(genome, "Seqinfo") && length(genome) == 0L) { genome <- NA_character_ } if (is.na(genome)) { genome <- genome(con) if (is.null(genome)) genome <- NA } ### FIXME: a queryForLines() function would be more efficient ## Temporarily disable use of Tabix Index. ## TODO: Restore use of Tabix Index! #con <- queryForResource(m, con, which) resource <- queryForResource(m, con) on.exit(release(m, resource), add=TRUE) ans <- readGFFAsGRanges(resource, version=version, colnames=colnames, filter=list(type=feature.type), genome=genome, sequenceRegionsAsSeqinfo= sequenceRegionsAsSeqinfo, speciesAsMetadata=TRUE) if (!attr(resource, "usedWhich") && !is.null(which)) ans <- subsetByOverlaps(ans, which) ans }) setGeneric("import.gff1", function(con, ...) standardGeneric("import.gff1")) setMethod("import.gff1", "ANY", function(con, ...) import(con, "gff1", ...)) setGeneric("import.gff2", function(con, ...) standardGeneric("import.gff2")) setMethod("import.gff2", "ANY", function(con, ...) import(con, "gff2", ...)) setGeneric("import.gff3", function(con, ...) standardGeneric("import.gff3")) setMethod("import.gff3", "ANY", function(con, ...) import(con, "gff3", ...)) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### DNAStringSet from fasta data ### ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Coercion ### setGeneric("asGFF", function(x, ...) standardGeneric("asGFF")) setMethod("asGFF", "GRangesList", function(x, parentType = "mRNA", childType = "exon") { parent_range <- range(x) if (!all(elementNROWS(parent_range) == 1)) stop("Elements in a group must be on same sequence and strand") parents <- unlist(parent_range, use.names = FALSE) children <- unlist(x, use.names = FALSE) makeId <- function(x, prefix) { paste(prefix, seq_len(length(x)), sep = "") } parentIds <- makeId(parents, parentType) values(parents)$type <- parentType values(parents)$ID <- parentIds values(parents)$Name <- names(x) values(children)$type <- childType values(children)$ID <- makeId(children, childType) values(children)$Name <- names(children) values(children)$Parent <- rep.int(parentIds, elementNROWS(x)) allColumns <- union(colnames(values(parents)), colnames(values(children))) values(children) <- rectifyDataFrame(values(children), allColumns) values(parents) <- rectifyDataFrame(values(parents), allColumns) c(parents, children) }) rectifyDataFrame <- function(x, allColumns) { x[setdiff(allColumns, colnames(x))] <- DataFrame(NA) x[allColumns] } ### FIXME: We wrote this but never tested it, and it is not yet ### used. People should use GFF3 instead of this. ### ### KNOWN ISSUES: ### 1) The stop codon should not be included in the CDS (annoying) ### 2) pmapFromTranscripts() does not yet support our usage of it ### 3) Needs to move to GenomicFeatures setGeneric("asGTF", function(x, ...) standardGeneric("asGTF")) frame <- function(x) { cs <- cumsum(width(x)) ucs <- unlist(cs, use.names=FALSE) ucs[end(PartitioningByEnd(x))] <- 0L ucs <- c(0L, head(ucs, -1L)) ucs %% 3L } setMethod("asGTF", "GRangesList", function(x) { tx_ids <- names(x) if (is.null(tx_ids)) { tx_ids <- seq_along(x) } processFeatures <- function(f) { ans <- unlist(f, use.names=FALSE) ans$frame <- frame(f) if (is.null(ans$gene_id)) { ans$gene_id <- "" } if (is.null(ans$transcript_id)) { ans$transcript_id <- tx_ids[togroup(f)] } ans } start_codon_tx <- GenomicFeatures::pmapFromTranscripts(IRanges(1L, 3L), x) start_codon <- processFeatures(start_codon_tx) mcols(start_codon)$type <- "start_codon" stop_ranges <- IRanges(end=sum(width(x)), width=3L) stop_codon_tx <- GenomicFeatures::pmapFromTranscripts(stop_ranges, x) stop_codon <- processFeatures(stop_codon_tx) mcols(stop_codon)$type <- "stop_codon" codons <- c(start_codon, stop_codon) cds <- processFeatures(x) mcols(cds)$type <- "CDS" values(codons) <- rectifyDataFrame(values(codons), colnames(cds)) c(codons, cds) }) ## setMethod("asGTF", "TxDb", ## function(x, by) { ## cds <- cds(x, columns="tx_id") ## cds <- cds[togroup(cds$tx_id)] ## cds$transcript_id <- unlist(cds$tx_id) ## cds$tx_id <- NULL ## txGene <- transcriptsBy(x) ## txToGene <- setNames(names(txGene)[togroup(txGene)], ## unlist(txGene, use.names=FALSE)$tx_id) ## cds$gene_id <- txToGene[cds$transcript_id] ## processUTRs <- function(utr) { ## ans <- unlist(utr, use.names=FALSE) ## ans$transcript_id <- names(utr)[togroup(utr)] ## ans$gene_id <- txToGene[ans$transcript_id] ## ans ## } ## three_utr <- processUTRs(threeUTRsByTranscript(x)) ## three_utr$type <- "3UTR" ## five_utr <- processUTRs(fiveUTRsByTranscript(x)) ## five_utr$type <- "5UTR" ## c(asGTF(split(cds, cds$transcript_id)), five_utr, three_utr) ## }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Utilities ### scanGFFDirectives <- function(con, tag = NULL) { m <- manager() con <- connection(m, con, "r") on.exit(release(m, con)) directives <- character() lines <- line <- readLines(con, n = 1) while(grepl("^#", line)) { if (grepl("^##", line)) { directives <- c(directives, line) } line <- readLines(con, n = 1) if (length(line) == 0L) break lines <- c(lines, line) } pushBack(lines, con) sub("^[^[:space:]]* ", "", grep(paste0("^##", tag), directives, value = TRUE)) } gffGenomeBuild <- function(x) { genome_build <- scanGFFDirectives(x, "genome-build") unlist(strsplit(genome_build, "\t", fixed = TRUE)) } setMethod("provider", "GFFFile", function(x) { gffGenomeBuild(x)[1] }) setMethod("providerVersion", "GFFFile", function(x) { gffGenomeBuild(x)[2] }) setMethod("genome", "GFFFile", function(x) providerVersion(x)) gffComment <- function(con, ...) cat("##", paste(...), "\n", sep = "", file = con, append = TRUE) .sniffGFFVersion <- function(con) { version <- NULL lines <- line <- readLines(con, n = 1) while(grepl("^#", line)) { if (grepl("^##gff-version", line)) { version <- sub("^##gff-version *", "", line) break } line <- readLines(con, n = 1) lines <- c(lines, line) } pushBack(lines, con) version } gffFileClass <- function(version) { paste("GFF", version, "File", sep = "") } gffFileVersion <- function(file) { versions <- c("1", "2", "3") unlist(Filter(function(v) is(file, gffFileClass(v)), versions)) } asGFFVersion <- function(con, version) { if (!is(con, gffFileClass(version))) { if (class(con) != "GFFFile") warning("Treating a '", class(con), "' as GFF version '", version, "'") con <- GFFFile(resource(con), version) } con } rtracklayer/R/igv.R0000644000175100017510000000170314614231172015230 0ustar00biocbuildbiocbuild### ========================================================================= ### IGV Data Server Access ### ------------------------------------------------------------------------- readIGVRegistry <- function(url) { do.call(rbind, lapply(readLines(url), readIGVDataFile)) } handleCategory <- function(x) { paths <- unlist(getNodeSet(x, "Resource/@path")) names(paths) <- unlist(getNodeSet(x, "Resource/@name")) name <- factor(unname(xmlAttrs(x)["name"])) categories <- lapply(getNodeSet(x, "Category"), handleCategory) children <- do.call(rbind, categories) children$parenet <- name resources <- BiocFileList(lapply(paths, FileForFormat)) df <- DataFrame(category=name, parent=NA, name=names(paths), resources) rbind(df, children) } readIGVDataFile <- function(url) { lines <- readLines(url) doc <- xmlTreeParse(lines, asText=TRUE, useInternalNodes=TRUE) handleCategory(getNodeSet(doc, "/Global")[[1L]]) } rtracklayer/R/index.R0000644000175100017510000000603314614231172015553 0ustar00biocbuildbiocbuild### ========================================================================= ### Separate index support ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### queryForResource ### ## There is some question as to whether the import routines should ## recurse through import.tabix, or perform the query ## internally. Currently, we are taking the latter route, because it ## is consistent with (gzip) decoding and it allows the parsers more ## flexibility. setGeneric("queryForResource", function(manager, x, which = NULL, ...) standardGeneric("queryForResource"), signature="x") ## Attaches 'usedWhich' attribute, an optimization hint indicating ## that subsetting by 'which' has been performed and is no longer ## necessary. Probably premature. setMethod("queryForResource", "BiocFile", function(manager, x, which = NULL, ...) { r <- resource(x) ans <- structure(r, usedWhich = FALSE) if (!is.null(which) && is.character(r)) { x_tbi <- paste(r, "tbi", sep = ".") if (file.exists(x_tbi)) ans <- queryForResource(manager, TabixFile(r), which = which, ...) } ans }) setMethod("queryForResource", "TabixFile", function(manager, x, which, header = TRUE, ...) { tabixHeader <- headerTabix(x) si <- Seqinfo(tabixHeader$seqnames) if (is.null(which)) { buffer <- connectionForResource(manager, path(x), "r") if (!header) readLines(buffer, tabixHeader$skip) } else { buffer <- manage(manager, file()) if (header) { skippedLines <- readLines(path(x), tabixHeader$skip) writeLines(skippedLines, buffer) } lines <- unlist(scanTabix(x, param = which), use.names = FALSE) writeLines(lines, buffer) si <- merge(si, seqinfo(which)) } structure(buffer, usedWhich = TRUE, seqinfo = si) }) queryForConnection <- function(manager, x, which = NULL, ...) { resource <- queryForResource(manager, x, which = which, ...) con <- connectionForResource(manager, resource, open = "r") structure(con, usedWhich = attr(resource, "usedWhich")) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### indexTrack: attempt to build an index for a track ### ### This is an obscene hack ### indexTrack <- function(con, ...) { indexed <- NULL formats <- eval(formals(indexTabix)$format) uri <- path(con) parsed_uri <- .parseURI(uri) if (!uriIsLocal(parsed_uri)) stop("'con' must be a path to a local file") original_path <- parsed_uri$path path <- bgzip(original_path, overwrite = TRUE) format <- Find(function(f) { is(con, paste(toupper(f), "File", sep = "")) }, formats) if (!is.null(format)) { indexTabix(path, format, ...) } else { indexTabix(path, ...) } indexed <- TabixFile(path) unlink(original_path) invisible(indexed) } rtracklayer/R/io.R0000644000175100017510000000752314614231172015060 0ustar00biocbuildbiocbuild setClass("RTLFile", representation(resource = "character_OR_connection"), contains = "VIRTUAL") setMethod("initialize", "RTLFile", function(.Object, ...) { .Deprecated("BiocFile", msg = "This class is extending the deprecated RTLFile class from rtracklayer. Use BiocFile from BiocIO in place of RTLFile.") callNextMethod() }) setClass("RTLFileList", prototype = prototype(elementType = "RTLFile"), contains = "SimpleList") RTLFileList <- function(files) { new("RTLFileList", listData = files) } setMethod("showAsCell", "RTLFileList", function(object) { showAsCell(vapply(object, path, character(1L))) }) setMethod("fileFormat", "RTLFile", function(x) tolower(sub("File$", "", class(x)))) setMethod("show", "RTLFile", function(object) { r <- resource(object) if (!isSingleString(r)) r <- summary(r)$description cat(class(object), "object\nresource:", r, "\n") }) setMethod("as.character", "RTLFile", function(x) path(x)) #resource <- function(x) { # .Deprecated("resource", msg = "Use BiocIO::resource()") # BiocIO::resource(x) #} setMethod("path", "RTLFile", function(object) { r <- resource(object) if (!is.character(r)) stop("Connection resource requested as a path") r }) FileForFormat <- function(path, format = file_ext(path)) { .Deprecated("FileForFormat", msg = "Use BiocIO::FileForFormat") BiocIO::FileForFormat(path, format) } manager <- BiocIO:::manager connection <- BiocIO:::connection resourceDescription <- BiocIO:::resourceDescription ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Utilities ### ## First checks for Windows drive letter. ## There are no known URI schemes that are only a single character. isURL <- BiocIO:::isURL .parseURI <- BiocIO:::.parseURI checkURI <- function(x) { if (!isSingleString(x)) stop("URI must be a single, non-NA string") x } createResource <- function(x, dir = FALSE, content = "") { uri <- .parseURI(x) if (uri$scheme == "file" || uri$scheme == "") { if (!file.exists(uri$path)) { if (dir) dir.create(uri$path, recursive = TRUE) else writeLines(content, uri$path) } else warning("Path '", uri$path, "' already exists") } else stop("Cannot create a resource that is not a local file") } uriExists <- function(x) { uri <- .parseURI(x) if (uriIsLocal(uri)) { exists <- file.exists(uri$path) } else { exists <- HEAD(x)$status_code == 200L } exists } uriIsLocal <- function(x) { x$scheme == "file" || x$scheme == "" } uriIsWritable <- function(x) { uri <- .parseURI(x) if (uriIsLocal(uri)) { !file.access(uri$path, 2) || (!file.exists(uri$path) && uriIsWritable(dirname(uri$path))) } else FALSE } checkArgFormat <- function(con, format) { if (toupper(format) != substring(toupper(sub("File$", "", class(con))), 1, nchar(format))) stop("Cannot treat a '", class(con), "' as format '", format, "'") } connectionForResource <- BiocIO:::connectionForResource ## BestFileFormat setGeneric("bestFileFormat", function(x, dest, ...) standardGeneric("bestFileFormat")) setMethod("bestFileFormat", c("GenomicRanges", "ANY"), function(x, dest) { ## have numbers on a single strand, use BigWig if (is.numeric(score(x)) && length(unique(strand(x))) == 1L) "bw" else "bed" }) setMethod("bestFileFormat", c("GRangesList", "ANY"), function(x, dest) { "bed" # need hierarchical structure }) setMethod("bestFileFormat", c("RleList", "ANY"), function(x, dest) { "bw" # e.g., coverage }) setMethod("bestFileFormat", c("IntegerRangesList", "ANY"), function(x, dest) { "bed" # just ranges... }) ## Connection management (similar to memory management) manage <- BiocIO:::manage managed <- BiocIO:::managed unmanage <- BiocIO:::unmanage release <- BiocIO:::release rtracklayer/R/ncbi.R0000644000175100017510000000162714614231172015363 0ustar00biocbuildbiocbuildNCBI_TAX_URL <- "http://www.ncbi.nlm.nih.gov/Taxonomy/Browser/wwwtax.cgi" isNCBISpeciesURL <- function(url) { substring(url, 1L, nchar(NCBI_TAX_URL)) == NCBI_TAX_URL } metadataFromNCBI <- function(url) { html <- rtracklayerGET(url) list("Taxonomy ID"=parseTaxonomyIdFromNCBI(html), "Organism"=parseOrganismFromNCBI(html)) } parseTaxonomyIdFromNCBI <- function(html) { unlist(getNodeSet(html, "//input[@name='old_id']/@value"), use.names=FALSE) } taxonomyIdFromNCBI <- function(species) { url <- paste0(NCBI_TAX_URL, "?name=", URLencode(species)) parseTaxonomyIdFromNCBI(rtracklayerGET(url)) } parseOrganismFromNCBI <- function(html) { title <- xmlValue(getNodeSet(html, "//title/text()")[[1L]]) sub(".*\\((.*?)\\).*", "\\1", title) } speciesFromNCBI <- function(id) { url <- paste0(NCBI_TAX_URL, "?id=", URLencode(id)) parseOrganismFromNCBI(rtracklayerGET(url)) } rtracklayer/R/quickload.R0000644000175100017510000002766514614231172016436 0ustar00biocbuildbiocbuild### ========================================================================= ### Quickload support ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Quickload class ### setClass("Quickload", representation(uri = "character")) Quickload_contents <- function(x) { read.table(contentsFile(x), sep = "\t", col.names = c("dir", "title"), colClasses = "character") } setGeneric("uri", function(x) standardGeneric("uri")) setMethod("uri", "Quickload", function(x) { x@uri }) setMethod("genome", "Quickload", function(x) { contents <- Quickload_contents(x) as.character(structure(contents$dir, names = contents$title)) }) setMethod("names", "Quickload", function(x) genome(x)) setMethod("length", "Quickload", function(x) length(names(x))) setMethod("[[", "Quickload", function (x, i, j, ...) { if (!missing(j)) warning("argument 'j' ignored") QuickloadGenome(x, i, ...) }) setMethod("$", "Quickload", function (x, name) { QuickloadGenome(x, name) }) Quickload <- function(uri = "quickload", create = FALSE) { if (!isTRUEorFALSE(create)) stop("'create' must be TRUE or FALSE") if (create) { if (uriExists(uri)) { message("NOTE: '", uri, "' already exists") create <- FALSE } else createResource(uri, dir = TRUE) } ql <- new("Quickload", uri = checkURI(uri)) if (create) createResource(contentsFile(ql)) ql } setAs("character", "Quickload", function(from) Quickload(from)) setMethod("show", "Quickload", function(object) { cat(class(object), "repository\nuri:", uri(object), "\n") cat(S4Vectors:::labeledLine("genomes", genome(object))) }) contentsFile <- function(x) file.path(uri(x), "contents.txt") ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### QuickloadGenome class ### setClass("QuickloadGenome", representation(quickload = "Quickload", genome = "character"), contains = "TrackDb") setMethod("uri", "QuickloadGenome", function(x) file.path(uri(quickload(x)), genome(x))) quickload <- function(x, ...) x@quickload setMethod("genome", "QuickloadGenome", function(x) x@genome) setMethod("seqinfo", "QuickloadGenome", function(x) { genome_info <- read.table(genomeFile(x), sep = "\t", col.names = c("seqnames", "seqlengths"), colClasses = c("character", "integer")) Seqinfo(genome_info$seqnames, genome_info$seqlengths, genome = rep(genome(x), nrow(genome_info))) }) setReplaceMethod("seqinfo", "QuickloadGenome", function(x, value) { if (uriIsWritable(genomeFile(x))) { df <- as.data.frame(value)[1] write.table(df, genomeFile(x), quote = FALSE, col.names = FALSE, sep = "\t") } else stop("Repository is read only; cannot write seqinfo") x }) setMethod("releaseDate", "QuickloadGenome", function(x) { sub(".*?_(.*?)_([^_]*)$", "\\1 \\2", genome(x)) }) setMethod("organism", "QuickloadGenome", function(object) { gsub("_", " ", sub("(.*?)_.*?_[^_]*$", "\\1", genome(object))) }) setMethod("length", "QuickloadGenome", function(x) { length(names(x)) }) QuickloadGenome_annotFiles <- function(x) { xmlChildren(xmlInternalTreeParse(annotsFile(x)))$files } setMethod("names", "QuickloadGenome", function(x) { x_mcols <- mcols(x) structure(curl_unescape(as.character(x_mcols$name)), names = as.character(x_mcols$title)) }) setMethod("trackNames", "QuickloadGenome", function(object) { names(object) }) setMethod("mcols", "QuickloadGenome", function(x) { files <- QuickloadGenome_annotFiles(x) if (!length(xmlChildren(files))) make_zero_col_DFrame(length(x)) else Reduce(function(x, y) merge(as.data.frame(as.list(x)), as.data.frame(as.list(y)), all = TRUE), lapply(xmlChildren(files), xmlAttrs)) }) setMethod("toString", "QuickloadGenome", function(x) { Quickload_contents(quickload(x))[genome(x),"title"] }) addGenomeToContents <- function(x, title) { contents <- Quickload_contents(quickload(x)) if (!genome(x) %in% contents$dir) { contents <- rbind(contents, data.frame(genome(x), title)) if (uriIsWritable(contentsFile(quickload(x)))) write.table(contents, contentsFile(quickload(x)), quote = FALSE, row.names = FALSE, col.names = FALSE, sep = "\t") else stop("Repository is read only; cannot add genome to contents") } else warning("Genome '", genome(x), "' already in contents; not replaced") } setMethod("toString", "GenomeDescription", function(x) { paste(organism(x), provider(x), providerVersion(x)) }) QuickloadGenome <- function(quickload, genome, create = FALSE, seqinfo = GenomicRanges::seqinfo(genome), title = toString(genome)) { if (!isTRUEorFALSE(create)) stop("'create' must be TRUE or FALSE") quickload <- as(quickload, "Quickload") genome <- normArgGenome(genome) genome_id <- quickloadGenomeId(genome) qlg <- new("QuickloadGenome", quickload = quickload, genome = genome_id) if (create) { if (is.character(genome) && missing(seqinfo)) stop("No seqinfo for genome '", genome, "'") createQuickloadGenome(qlg, seqinfo, title) } qlg } setMethod("show", "QuickloadGenome", function(object) { cat(class(object), "track database\ngenome:", genome(object), "\nquickload:", uri(quickload(object)), "\n") cat(S4Vectors:::labeledLine("names", names(object))) }) genomeFile <- function(x) file.path(uri(x), "mod_chromInfo.txt") annotsFile <- function(x) file.path(uri(x), "annots.xml") ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Import of tracks/sequence from Quickload ### setMethod("track", "QuickloadGenome", function(object, name, ...) { object_mcols <- mcols(object) if (!name %in% object_mcols$title) stop("Track '", name, "' does not exist") md <- as.list(object_mcols[object_mcols$title == name,]) rd <- import(file.path(uri(object), md$name), ...) metadata(rd)$quickload <- md rd }) ## Since a QuickloadGenome can store only a ## single referenece genome, it is best to treat it as a "slot". setGeneric("referenceSequence", function(x, ...) standardGeneric("referenceSequence")) referenceSequenceFile <- function(x) { paste(file.path(uri(x), genome(x)), ".2bit", sep = "") } setMethod("referenceSequence", "QuickloadGenome", function(x, which = as(seqinfo(x), "GenomicRanges"), ...) { import(referenceSequenceFile(x), which = which, ...) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export of tracks/sequence to Quickload ### ### FIXME: check for file URI scheme setGeneric("sortBySeqnameAndStart", function(x) standardGeneric("sortBySeqnameAndStart")) ## Seems not really possible for GRangesList setMethod("sortBySeqnameAndStart", "GenomicRanges", function(x) { x[order(as.factor(seqnames(x)), start(x)),] }) setMethod("sortBySeqnameAndStart", "IntegerRangesList", function(x) { x.flat <- unlist(x, use.names=FALSE) relist(x.flat[order(space(x), start(x.flat))], x) }) .exportToQuickload <- function(object, name, format = bestFileFormat(value, object), index = TRUE, metadata = character(), ..., value) { if (is(object, "Annotated")) { value_metadata <- metadata(value)$quickload value_metadata[names(metadata)] <- metadata metadata <- value_metadata } filename <- paste(name, format, sep = ".") path <- paste(uri(object), filename, sep = "/") seqinfo(value) <- seqinfo(object) file <- export(value, path, format = format, index = index, ...) track(object, name, index = FALSE, metadata = metadata) <- file object } setReplaceMethod("track", signature(object = "QuickloadGenome", value = "ANY"), .exportToQuickload) setReplaceMethod("track", signature(object = "QuickloadGenome", value = "RsamtoolsFile"), function(object, name, metadata = character(), ..., value) { if (missing(name)) name <- basename(path(value)) track(object, name, metadata = metadata) <- URLencode(path(value)) copyResourceToQuickload(object, URLencode(index(value))) object }) setReplaceMethod("track", signature(object = "QuickloadGenome", value = "BiocFile"), function(object, name, metadata = character(), ..., value) { if (missing(name)) name <- basename(path(value)) track(object, name, metadata = metadata) <- URLencode(path(value)) object }) copyResourceToQuickload <- function(object, uri) { parsed_uri <- .parseURI(uri) if (parsed_uri$scheme == "") uri <- paste("file://", uri, sep = "") filename <- basename(uri) object_uri <- .parseURI(uri(object)) if (uriIsLocal(object_uri)) { dest_file <- file.path(object_uri$path, filename) if (paste(uri(object), filename, sep = "/") != uri) ### FIXME: curl_unescape() here because of R bug download.file(curl_unescape(uri), dest_file) } else stop("Quickload is not local; cannot copy track") filename } setReplaceMethod("track", signature(object = "QuickloadGenome", value = "character"), function(object, name = basename(object), metadata = character(), ..., value) { file <- copyResourceToQuickload(object, value) files <- QuickloadGenome_annotFiles(object) ## make sure we have the three required attributes attrs <- c(name = file, title = name) attrs[names(metadata)] <- metadata filenames <- getNodeSet(files, "//@name") if (file %in% filenames) { removeChildren(files, match(file, filenames)) } files <- addChildren(files, newXMLNode("file", attrs = attrs)) saveXML(files, annotsFile(object)) object }) setGeneric("referenceSequence<-", function(x, ..., value) standardGeneric("referenceSequence<-")) setReplaceMethod("referenceSequence", signature(x = "QuickloadGenome", value = "ANY"), function(x, name, ..., value) { export.2bit(value, referenceSequenceFile(x)) x }) ### Not exported yet setGeneric("synonyms", function(x, ...) standardGeneric("synonyms")) synonymFile <- function(x) file.path(uri(x), "synonyms.txt") setMethod("synonyms", "QuickloadGenome", function(x) { CharacterList(strsplit(readLines(synonymFile(x)), "\t")) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Utilities ### normArgGenome <- function(genome) { if (is.character(genome)) { bs_genome <- BSGenomeForID(genome) if (!is.null(bs_genome)) genome <- bs_genome } genome } quickloadGenomeId <- function(genome) { if (!is.character(genome)) { species <- sub("^(.).*? ", "\\1_", organism(genome)) date <- sub("\\. ", "_", releaseDate(genome)) paste(species, date, sep = "_") } else genome } createQuickloadGenome <- function(x, seqinfo, title) { if (genome(x) %in% genome(quickload(x))) { message("NOTE: Genome '", genome(x), "' already exists") return() } createResource(uri(x), dir = TRUE) createResource(annotsFile(x), content = "") seqinfo(x) <- seqinfo addGenomeToContents(x, title) } rtracklayer/R/ranges.R0000644000175100017510000002312514614231172015724 0ustar00biocbuildbiocbuild### ========================================================================= ### Genome-oriented methods for GRanges and IntegerRangesList objects ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### GRanges convenience constructor ### GenomicData <- function(ranges, ..., strand = NULL, chrom = NULL, genome = NA, seqinfo = NULL, which = NULL, metadata = list()) { if (is.null(genome)) genome <- NA if (!isSingleStringOrNA(genome)) stop("'genome' must be a single string, or NULL, or NA") if (!is.null(seqinfo) && !all(genome == genome(seqinfo), na.rm=TRUE)) { stop("'genome' ", genome, "' does not match that in 'seqinfo'") } if (length(seqinfo) == 0L) seqinfo <- seqinfoForGenome(genome) if (length(chrom) > length(ranges)) stop("length of 'chrom' greater than length of 'ranges'") if (length(chrom) > 0 && (length(ranges) %% length(chrom) != 0)) stop("length of 'ranges' not a multiple of 'chrom' length") normStrand <- function(strand) { strand <- as.character(strand) strand[is.na(strand)] <- "*" strand(strand) } if (!(is.null(strand) || is(strand, "Rle"))) strand <- normStrand(strand) if (is.null(chrom)) chrom <- droplevels(Rle(factor("1"), length(ranges))) dots <- list(...) if (length(dots) == 1) { dots <- dots[[1L]] if ((is(dots, "data.frame") || is(dots, "DataFrame")) && !is.null(dots[["strand"]])) { strand <- dots[["strand"]] dots[["strand"]] <- NULL return(GenomicData(ranges = ranges, dots, strand = strand, chrom = chrom, genome = genome, seqinfo = seqinfo, which = which, metadata = metadata)) } } if (is.null(strand)) strand <- Rle("*", length(ranges)) df <- DataFrame(...) invalidNames <- names(df) %in% GenomicRanges:::INVALID.GR.COLNAMES names(df)[invalidNames] <- paste0(".", names(df)[invalidNames]) gd <- GRanges(seqnames = chrom, ranges = ranges, strand = strand, df, seqinfo = seqinfo) if (!is.na(genome)) genome(gd) <- genome if (!is.null(which)) { if (is(which, "IntegerRangesList")) which <- as(which, "GRanges") gd <- subsetByOverlaps(gd, which) } metadata(gd) <- metadata gd } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Automatic seqinfo lookup ### seqinfoForGenome <- function(genome, method = c("auto", "BSgenome", "UCSC")) { method <- match.arg(method) if (is.na(genome)) return(NULL) if (method == "auto" || method == "BSgenome") sl <- SeqinfoForBSGenome(genome) if (method == "UCSC" || (method == "auto" && is.null(sl))) sl <- SeqinfoForUCSCGenome(genome) sl } BSGenomeForID <- function(genome) { if (!suppressWarnings(requireNamespace("BSgenome", quietly=TRUE))) return(NULL) bsgenome <- try(BSgenome::getBSgenome(genome), silent=TRUE) if (inherits(bsgenome, "try-error")) return(NULL) bsgenome } SeqinfoForBSGenome <- function(genome) { bsgenome <- BSGenomeForID(genome) if (!is.null(bsgenome)) seqinfo(bsgenome) else NULL } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Convience constructor for GRanges over an entire genome ### GRangesForGenome <- function(genome, chrom = NULL, ranges = NULL, ..., method = c("auto", "BSgenome", "UCSC"), seqinfo = NULL) { if (missing(genome) || !isSingleString(genome)) stop("'genome' must be a single string identifying a genome") if (is.null(seqinfo)) seqinfo <- seqinfoForGenome(genome, match.arg(method)) if (is.null(seqinfo)) stop("Failed to obtain information for genome '", genome, "'") if (!is.null(ranges) && !is(ranges, "IntegerRanges")) stop("'ranges' must be NULL or an IntegerRanges object") if (is.null(chrom)) chrom <- seqnames(seqinfo) else { badChrom <- setdiff(chrom, seqnames(seqinfo)) if (length(badChrom)) stop("Chromosome(s) ", paste(badChrom, collapse = ", "), "are invalid for: ", genome) } if (is.null(ranges)) ranges <- IRanges(1L, seqlengths(seqinfo)[chrom]) gr <- GRanges(chrom, ranges, seqlengths = seqlengths(seqinfo), ...) seqinfo(gr) <- seqinfo gr } GRangesForBSGenome <- function(genome, chrom = NULL, ranges = NULL, ...) { GRangesForGenome(genome, chrom = chrom, ranges = ranges, method = "BSgenome", seqinfo = NULL, ...) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### score: for internal convenience ### setMethod("score", "ANY", function(x) NULL) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### chrom(): Returns chromosome name vector of length 'length(x)'. ### Not to be confused with 'seqnames', which returns a List for ### IntegerRangesList. ### More or less a pre-GenomicRanges relic. ### setGeneric("chrom", function(x, ...) standardGeneric("chrom")) setMethod("chrom", "GRanges", function(x) seqnames(x)) setMethod("chrom", "IntegerRangesList", function(x) { names(x) }) setGeneric("chrom<-", function(x, ..., value) standardGeneric("chrom<-")) setReplaceMethod("chrom", "GRanges", function(x, value) { seqnames(x) <- value x }) ### ========================================================================= ### Genome-oriented conveniences for RangedSelection classes ### ------------------------------------------------------------------------- GenomicSelection <- function(genome, chrom = NULL, colnames = character(0)) { if (missing(genome) || !isSingleString(genome)) stop("'genome' must be a single string identifying a genome") si <- seqinfoForGenome(genome) if (is.null(si)) stop("Failed to obtain information for genome '", genome, "'") lens <- seqlengths(si) if (is.null(chrom)) chrom <- names(lens) else { if (!is.character(chrom)) stop("'chrom' must be NULL or a character vector") invalidChroms <- setdiff(chrom, names(lens)) if (length(invalidChroms)) stop("'chrom' contains invalid chromosomes: ", paste(invalidChroms, collapse = ", ")) lens <- lens[chrom] } RangedSelection(split(IRanges(1, lens), factor(chrom, chrom)), colnames) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Utilities ### ## Individual sessions/views only support a single genome at a time, ## whereas range data structures can have multiple genomes. We try to ## rectify this here. singleGenome <- function(x) { x1 <- unname(x[1]) if (!all(is.na(x)) && (any(is.na(x)) || any(x != x1))) stop("Multiple genomes encountered; only one supported") x1 } ## normalize 'range', using 'seqinfo' for default genome normGenomeRange <- function(range, seqinfo, max.length = 1L) { ## the user can specify a portion of the genome in several ways: ## - String identifying a genome ## - IntegerRangesList ## - GRanges, the preferred way, possibly from GRangesForUCSCGenome() ## - We do not allow IntegerRanges, since it does not make sense to have ## one range over many chromosomes if (is.character(range)) { range <- singleGenome(range) seqinfo <- Seqinfo(genome = range) return(GRangesForGenome(range, seqinfo = seqinfo)) } genome <- genome(seqinfo)[1] if (is(range, "Seqinfo")) range <- as(range, "GRanges") if (!is(range, "IntegerRangesList") && !is(range, "GenomicRanges")) stop("'range' should be a genome string, IntegerRangesList, GRanges or Seqinfo") if (length(seqinfo(range)) == 0L) { ## hack: need to avoid calling seqlengths(session) here, so use 'foo' seqinfo(range) <- Seqinfo("foo", genome = genome) } else { rangeGenome <- singleGenome(genome(range)) if (!is.na(rangeGenome) && rangeGenome != genome) { genome <- rangeGenome } seqinfo <- si <- Seqinfo(genome = genome) seqinfo(range, new2old = match(seqlevels(si), seqlevels(range))) <- merge(si, seqinfo(range)) } if (is(range, "IntegerRangesList")) { range <- GRangesForGenome(singleGenome(genome(range)), names(range), unlist(range), seqinfo = seqinfo) } else if (is(range, "GenomicRanges")) { strand(range) <- "*" mcols(range) <- NULL } if (length(range) > max.length) { warning("number of ranges (", length(range), ") exceeds limit of ", max.length) } if (max.length == 1L) { if (length(unique(seqnames(range))) > max.length) stop("'range' must contain ranges on a single chromosome") range(range) } else { head(range, max.length) } } spansGenome <- function(x) { strand(x) <- "*" x <- reduce(x) w <- structure(width(x), names = as.character(seqnames(x))) identical(w[names(seqlengths(x))], seqlengths(x)) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Questionable utilities ### # replace fields in 'x' with those in 'y', if given ## mergeRange <- function(x, y) ## { ## if (length(genome(y))) ## genome(x) <- genome(y) ## if (length(y)) ## x[[1]] <- y[[1]] ## if (length(names(y))) ## names(x)[1] <- names(y)[1] ## x ## } ## take 'y', filling in info from 'x' if necessary mergeRange <- function(x, y) { if (!length(genome(y))) { genome(y) <- genome(x) if (!length(names(y)) && length(y) == length(x)) { names(y) <- names(x) if (!length(unlist(y)) && length(x)) y[[1]] <- x[[1]] } } if (!length(genome(y))) stop("Genome must be specified") if (length(unlist(y)) && !length(names(y))) stop("Chromosome must be specified if an interval is specified") y } rtracklayer/R/readGFF.R0000644000175100017510000004355214614231172015711 0ustar00biocbuildbiocbuild### ========================================================================= ### readGFF() ### ------------------------------------------------------------------------- .make_filexp_from_filepath <- function(filepath) { if (isSingleString(filepath)) return(XVector:::open_input_files(filepath)[[1L]]) if (!inherits(filepath, "connection")) stop(wmsg("'filepath' must be a single string or a connection")) if (!base::isSeekable(filepath)) stop(wmsg("connection is not seekable")) filepath } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### readGFFPragmas() ### readGFFPragmas <- function(filepath) { filexp <- .make_filexp_from_filepath(filepath) if (inherits(filexp, "connection")) { if (!base::isOpen(filexp)) { base::open(filexp) on.exit(base::close(filexp)) } if (base::seek(filexp) != 0) { warning(wmsg("connection is not positioned at the start ", "of the file, rewinding it"), immediate.=TRUE) base::seek(filexp, where=0) } } .Call(read_gff_pragmas, filexp) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### sniffGFFVersion() ### .get_version_from_pragmas <- function(pragmas) { attrcol_fmt <- attr(pragmas, "attrcol_fmt") idx <- grep("^##gff-version", pragmas) if (length(idx) == 0L) { if (is.null(attrcol_fmt)) stop(wmsg("'attr(pragmas, \"attrcol_fmt\")' is NULL")) return(attrcol_fmt) } version <- sub("^##gff-version", "", pragmas[idx]) version <- unique(version) if (length(version) > 1L) { warning(wmsg("more than one GFF version specified in the file, ", "returning the first one")) version <- version[[1L]] } version <- suppressWarnings(as.integer(version)) if (is.na(version)) { warning(wmsg("unrecognized GFF version specified in the file")) if (is.null(attrcol_fmt)) stop(wmsg("'attr(pragmas, \"attrcol_fmt\")' is NULL")) return(attrcol_fmt) } version } sniffGFFVersion <- function(filepath) { pragmas <- readGFFPragmas(filepath) .get_version_from_pragmas(pragmas) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### GFFcolnames() ### ### Return the 9 standard GFF columns as specified at: ### http://www.sequenceontology.org/resources/gff3.html ### GFFcolnames <- function(GFF1=FALSE) { if (!isTRUEorFALSE(GFF1)) stop(wmsg("'GFF1' must be TRUE or FALSE")) .Call(gff_colnames, GFF1) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### readGFF() ### ### Returns 0L, 1L, 2L, or 3L. .normarg_version <- function(version=0) { if (is.character(version)) { ## For compatibility with "import" method for GFFFile objects. if (length(version) == 0L) return(0L) if (isSingleString(version)) { IMPORT_STYLE_VERSIONS <- c("", "1", "2", "3") m <- match(version, IMPORT_STYLE_VERSIONS) if (is.na(m)) stop(wmsg("when a single string, 'version' must ", "be \"\", \"1\", \"2\", or \"3\"")) version <- m - 1L return(version) } } if (isSingleNumber(version)) { if (!is.integer(version)) version <- as.integer(version) if (version < 0L || version > 3L) stop(wmsg("'version' must be 0, 1, 2, or 3")) return(version) } stop(wmsg("'version' must be a single number")) } .prepare_colmap_and_tags <- function(columns=NULL, tags=NULL, attrcol_fmt=0L) { ## Check 'columns'. if (!(is.null(columns) || is.character(columns))) stop(wmsg("'columns' must be NULL or a character vector")) GFF_colnames <- GFFcolnames(attrcol_fmt == 1L) ## Check 'tags'. if (!is.null(tags)) { if (!is.character(tags)) stop(wmsg("'tags' must be NULL or character vector")) if (any(is.na(tags)) || anyDuplicated(tags)) stop(wmsg("'tags' cannot contain NAs or duplicates")) if (attrcol_fmt == 1L) { ## Move any GFF colname found in 'tags' to 'columns'. columns <- union(columns, intersect(tags, GFF_colnames)) tags <- setdiff(tags, GFF_colnames) if (length(tags) != 0L) warning(wmsg("trying to extract tags from a GFF1 file")) } } ## Prepare 'colmap'. if (is.null(columns)) { colmap <- seq_along(GFF_colnames) if (attrcol_fmt != 1L) { stopifnot(GFF_colnames[[length(GFF_colnames)]] == "attributes") ## We don't load the "attributes" column unless the user ## requested no tags (i.e. by setting 'tags' to character(0)). if (!(is.character(tags) && length(tags) == 0L)) colmap[[length(GFF_colnames)]] <- NA_integer_ } } else if (is.character(columns)) { if (!all(columns %in% GFF_colnames)) { in1string <- paste0(GFF_colnames, collapse=", ") stop(wmsg("'columns' must contain valid GFF columns. ", "Valid GFF columns are: ", in1string)) } if (anyDuplicated(columns)) stop(wmsg("'columns' cannot contain duplicates")) colmap <- match(GFF_colnames, columns) } else { stop(wmsg("'columns' must be NULL or a character vector")) } list(colmap=colmap, tags=tags) } .normarg_filter <- function(filter, attrcol_fmt=0L) { GFF_colnames <- GFFcolnames(attrcol_fmt == 1L) if (is.null(filter)) return(NULL) if (!is.list(filter)) stop(wmsg("'filter' must be NULL or a named list")) filter_names <- names(filter) if (is.null(filter_names)) stop(wmsg("'filter' must have names")) if (attrcol_fmt == 1L) { valid_filter_names <- GFF_colnames } else { valid_filter_names <- head(GFF_colnames, n=-1L) } if (!all(filter_names %in% valid_filter_names)) { in1string <- paste0(valid_filter_names, collapse=", ") if (attrcol_fmt == 1L) { excluding_note <- "" } else { excluding_note <- "(excluding \"attributes\")" } stop(wmsg("The names on 'filter' must be valid GFF columns ", excluding_note, ". ", "Valid 'filter' names: ", in1string)) } if (anyDuplicated(filter_names)) stop(wmsg("the names on 'filter' must be unique")) unname(filter[valid_filter_names]) } ### 'df' must be a data-frame-like object (typically an ordinary data frame or ### a DataFrame object). .is_multi_tag <- function(df, ntag, attrcol_fmt=0L) { if (ntag == 0L || attrcol_fmt != 3L) return(logical(ntag)) multi_tags <- c("Parent", "Alias", "Note", "Dbxref", "Ontology_term") sapply(seq_len(ntag) + ncol(df) - ntag, function(j) colnames(df)[[j]] %in% multi_tags || any(grepl(",", df[[j]], fixed=TRUE))) } ### 'df' must be a data-frame-like object (typically an ordinary data frame or ### a DataFrame object). 'decode_idx' must be a non-empty integer vector ### indicating which columns to decode. The columns to decode must be character ### vectors. .url_decode_cols <- function(df, decode_idx) { decoded_cols <- lapply(setNames(decode_idx, colnames(df)[decode_idx]), function(j) urlDecode(df[[j]], na.strings=NA_character_)) df[decode_idx] <- decoded_cols df } ### 'df' must be a data-frame-like object (typically an ordinary data frame or ### a DataFrame object). 'split_idx' must be a non-empty integer vector ### indicating which columns to split. The columns to split must be character ### vectors. Split values are passed thru urlDecode() unless 'raw_data' is ### TRUE. Always returns a DataFrame. .strsplit_cols <- function(df, split_idx, raw_data) { split_cols <- lapply(setNames(split_idx, colnames(df)[split_idx]), function(j) { col <- df[[j]] ## Probably the most efficient way to create an empty CharacterList ## of arbitrary length. split_col <- relist(character(0), PartitioningByEnd(rep.int(0L, length(col)))) not_na <- !is.na(col) tmp <- strsplit(col[not_na], ",", fixed=TRUE) split_col[not_na] <- CharacterList(tmp) if (raw_data) return(split_col) relist(urlDecode(unlist(split_col)), split_col) }) ## Surprisingly sticking the CharacterList cols back into 'df' works ## even if 'df' is an ordinary data frame! df[split_idx] <- split_cols ans <- DataFrame(df, check.names=FALSE) ## "show" method for DataFrame is broken if some colnames are the empty ## string so we rename this column (in our case, we know there can only ## be one). m <- match("", colnames(ans)) if (!is.na(m)) colnames(ans)[m] <- "__empty_tag__" ans } readGFF <- function(filepath, version=0, columns=NULL, tags=NULL, filter=NULL, nrows=-1, raw_data=FALSE) { ## Check 'filepath'. filexp <- .make_filexp_from_filepath(filepath) if (inherits(filexp, "connection")) { if (!base::isOpen(filexp)) { base::open(filexp) on.exit(base::close(filexp)) } if (base::seek(filexp) != 0) { warning(wmsg("connection is not positioned at the start ", "of the file, rewinding it"), immediate.=TRUE) base::seek(filexp, where=0) } } ## Check 'version'. version <- .normarg_version(version) ## Get pragmas lines. pragmas <- .Call(read_gff_pragmas, filexp) ## Rewind file. if (inherits(filexp, "connection")) { base::seek(filexp, where=0) } else { XVector:::rewind_filexp(filexp) } if (version == 0L) { attrcol_fmt <- .get_version_from_pragmas(pragmas) } else { attrcol_fmt <- version } ## Prepare 'colmap' and normalize 'tags'. colmap_and_tags <- .prepare_colmap_and_tags(columns, tags, attrcol_fmt) colmap <- colmap_and_tags$colmap tags <- colmap_and_tags$tags ## Normalize 'filter'. filter <- .normarg_filter(filter, attrcol_fmt) ## Normalize 'nrows'. if (!isSingleNumber(nrows)) stop(wmsg("'nrows' must be a single number")) if (!is.integer(nrows)) nrows <- as.integer(nrows) ## Check 'raw_data'. if (!isTRUEorFALSE(raw_data)) stop(wmsg("'raw_data' must be TRUE or FALSE")) ## 1st pass. scan_ans <- .Call(scan_gff, filexp, attrcol_fmt, tags, filter, nrows) if (is.null(tags)) tags <- scan_ans[[1L]] nrows <- scan_ans[[2L]] ## Rewind file. if (inherits(filexp, "connection")) { base::seek(filexp, where=0) } else { XVector:::rewind_filexp(filexp) } ## 2nd pass: return 'ans' as an ordinary data frame. ans <- .Call(load_gff, filexp, attrcol_fmt, tags, filter, nrows, pragmas, colmap, raw_data) ncol0 <- attr(ans, "ncol0") ntag <- attr(ans, "ntag") # should be the same as 'length(tags)' ## Post-process standard GFF cols. if (!raw_data) { if (attrcol_fmt == 1L) { #factor_colnames <- c("seqid", "source", "type", "strand", "group") factor_colnames <- c("seqid", "source", "type", "group") } else { #factor_colnames <- c("seqid", "source", "type", "strand") factor_colnames <- c("seqid", "source", "type") } m <- match(factor_colnames, head(colnames(ans), n=ncol0)) m <- m[!is.na(m)] factor_cols <- lapply(setNames(m, colnames(ans)[m]), function(j) factor(ans[[j]], levels=unique(ans[[j]]))) ans[m] <- factor_cols } ## Post-process tags. if (ntag != 0L) { is_multi_tag <- .is_multi_tag(ans, ntag, attrcol_fmt) if (!raw_data) { decode_idx <- which(!is_multi_tag) + ncol0 if (length(decode_idx) != 0L) ans <- .url_decode_cols(ans, decode_idx) } split_idx <- which(is_multi_tag) + ncol0 if (length(split_idx) != 0L) { ## Returns 'ans' as a DataFrame. ans <- .strsplit_cols(ans, split_idx, raw_data) } } ## 'ans' could have lost its readGFF-specific attributes (e.g. if it was ## turned into a DataFrame), so we restore them and cross our fingers that ## they won't clash with the DataFrame slots the day the internals of ## DataFrame objects happen to change (very unlikely though). if (is.null(attr(ans, "pragmas"))) attr(ans, "pragmas") <- pragmas if (is.null(attr(ans, "attrcol_fmt"))) attr(ans, "attrcol_fmt") <- attrcol_fmt if (is.null(attr(ans, "ncol0"))) attr(ans, "ncol0") <- ncol0 if (is.null(attr(ans, "ntag"))) attr(ans, "ntag") <- ntag if (is.null(attr(ans, "raw_data"))) attr(ans, "raw_data") <- raw_data ans } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### readGFFAsGRanges() ### ### Used in "import" method for GFFFile objects. ### Not exported (user should use import()). ### ### sequence-region => Seqinfo -- by Michael .parseSequenceRegionsAsSeqinfo <- function(lines) { sr <- grep("##sequence-region", lines, value=TRUE) srcon <- file() on.exit(base::close(srcon)) writeLines(sr, srcon) srt <- read.table(srcon, comment.char="", colClasses=list(NULL, "character", "integer", "integer")) if (any(srt[[2L]] != 1L)) { warning("One or more ##sequence-region directives do not start at 1. ", "The assumptions made by 'sequenceRegionsAsSeqinfo=TRUE' ", "have been violated.") } Seqinfo(srt[[1L]], srt[[3L]]) } ### -- by Michael .parseSpeciesAsMetadata <- function(lines) { species <- unique(grep("##species", lines, fixed=TRUE, value=TRUE)) if (length(species) > 1L) { stop("multiple species definitions found") } metadata <- list() if (length(species) == 1L) { species <- sub("##species ", "", species, fixed=TRUE) if (isNCBISpeciesURL(species)) { ncbiError <- function(e) { warning("failed to retrieve organism information from NCBI") } metadata <- tryCatch(metadataFromNCBI(species), error = ncbiError) } } metadata } readGFFAsGRanges <- function(filepath, version=0, colnames=NULL, filter=NULL, genome=NA, sequenceRegionsAsSeqinfo=FALSE, speciesAsMetadata=FALSE) { if (!(isSingleStringOrNA(genome) || is(genome, "Seqinfo"))) stop(wmsg("'genome' must be a single string or NA, ", "or a Seqinfo object")) if (!isTRUEorFALSE(sequenceRegionsAsSeqinfo)) stop(wmsg("'sequenceRegionsAsSeqinfo' must be TRUE or FALSE")) if (!isTRUEorFALSE(speciesAsMetadata)) stop(wmsg("'speciesAsMetadata' must be TRUE or FALSE")) ## Read as data frame. if (is.null(colnames)) { df <- readGFF(filepath, version=version, filter=filter) } else { if (!is.character(colnames)) stop(wmsg("'colnames' must be a character vector")) ## Split 'colnames' between 'columns' and 'tags'. GFF_colnames <- GFFcolnames() columns <- intersect(colnames, GFF_colnames) tags <- setdiff(colnames, GFF_colnames) core_columns <- c("seqid", "start", "end", "strand") columns <- union(columns, core_columns) df <- readGFF(filepath, version=version, columns=columns, tags=tags, filter=filter) } ## Turn data frame into GRanges. ## TODO: Maybe we should be able to pass the metadata to ## makeGRangesFromDataFrame()? if (is.null(colnames)) { ans <- makeGRangesFromDataFrame(df, keep.extra.columns=TRUE, seqnames.field="seqid") } else { ans <- makeGRangesFromDataFrame(df, seqnames.field="seqid") mcols(ans) <- df[ , colnames, drop=FALSE] } ## Set seqinfo. ans_seqinfo <- NULL pragmas <- attr(df, "pragmas") attrcol_fmt <- attr(df, "attrcol_fmt") if (sequenceRegionsAsSeqinfo && attrcol_fmt == 3L) { ## Get 'ans_seqinfo' from pragmas. ans_seqinfo <- .parseSequenceRegionsAsSeqinfo(pragmas) } else if (is(genome, "Seqinfo")) { ans_seqinfo <- genome if (!all(seqlevels(ans) %in% seqlevels(ans_seqinfo))) stop(wmsg("the sequence names in the GTF or GFF file are in ", "disagreement with the Seqinfo object specified via ", "the 'genome' argument")) } else if (isSingleString(genome)) { ans_seqinfo <- seqinfoForGenome(genome) # can return NULL if (!is.null(ans_seqinfo) && !all(seqlevels(ans) %in% seqlevels(ans_seqinfo))) { warning(wmsg("cannot set the seqlengths or circularity flags on ", "the GRanges object to return because the sequence ", "names in the GTF or GFF file are in disagreement ", "with the sequence names implied by the genome ", "assembly (", genome, ") specified via the 'genome' ", "argument")) ans_seqinfo <- NULL } } if (!is.null(ans_seqinfo)) { seqlevels(ans) <- seqlevels(ans_seqinfo) seqinfo(ans) <- ans_seqinfo } if (isSingleString(genome)) genome(ans) <- genome ## Get 'ans_metadata' from pragmas. if (speciesAsMetadata) { ans_metadata <- .parseSpeciesAsMetadata(pragmas) } else { ans_metadata <- list() } metadata(ans) <- ans_metadata ans } rtracklayer/R/tabix.R0000644000175100017510000000336714614231172015562 0ustar00biocbuildbiocbuild### ========================================================================= ### Tabix support ### ------------------------------------------------------------------------- ### setMethod("import", "TabixFile", function(con, format, text, which = if (is.na(genome)) NULL else as(seqinfoForGenome(genome), "GenomicRanges"), genome = NA, header = TRUE, ...) { if (missing(format)) { format <- file_ext(file_path_sans_ext(path(con))) } m <- manager() buffer <- queryForResource(m, con, which, header = header) on.exit(release(m, buffer)) file <- try(FileForFormat(buffer, format), silent = TRUE) if (is(file, "try-error")) { tabixHeader <- headerTabix(con) args <- list(...) if (is.null(args$comment.char)) args$comment.char <- tabixHeader$comment skip <- tabixHeader$skip if (header) { skip <- skip - 1L } do.call(import.tabSeparated, c(list(buffer), genome = genome, tabixHeader$indexColumns, skip = skip, header = header, args)) } else import(file, genome = genome, ...) }) setGeneric("exportToTabix", function(object, con, ...) standardGeneric("exportToTabix")) setMethod("exportToTabix", c("ANY", "character"), function(object, con, ...) { con <- TabSeparatedFile(con) export(sort(object, ignore.strand=TRUE), con, row.names=FALSE, col.names=TRUE, ...) indexTrack(con, seq=1L, start=2L, end=3L, skip=1L) }) rtracklayer/R/test_rtracklayer_package.R0000644000175100017510000000007614614231172021502 0ustar00biocbuildbiocbuild.test <- function() BiocGenerics:::testPackage("rtracklayer") rtracklayer/R/trackDb.R0000644000175100017510000000255314614231172016021 0ustar00biocbuildbiocbuild### ========================================================================= ### TrackDb class ### ------------------------------------------------------------------------- ### ### Represents a database or source of tracks, i.e, interval datasets ### setClass("TrackDb") setGeneric("track<-", function(object, ..., value) standardGeneric("track<-")) ## load a track into a database setReplaceMethod("track", c("TrackDb", "ANY"), function(object, name = deparse(substitute(value)), ..., value) { track(object, name, ...) <- GRangesList(as(value, "GRanges", strict = FALSE), compress=FALSE) object }) setMethod("[[<-", c("TrackDb", value="ANY"), function(x, i, j, ..., value) { if (!missing(j)) warning("argument 'j' ignored") track(x, i, ...) <- value x }) setMethod("$<-", c("TrackDb", value="ANY"), function(x, name, value) { x[[name]] <- value x }) setGeneric("track", function(object, ...) standardGeneric("track")) setMethod("[[", "TrackDb", function (x, i, j, ...) { if (!missing(j)) warning("argument 'j' ignored") track(x, i, ...) }) setMethod("$", "TrackDb", function (x, name) { x[[name]] }) rtracklayer/R/trackhub.R0000644000175100017510000012013414614231172016246 0ustar00biocbuildbiocbuild### ========================================================================= ### TrackHub support ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### TrackContainer class ### setClass("TrackContainer", representation("SimpleList"), prototype(elementType = "Track") ) setMethod("names", "TrackContainer", function(x) { vapply(x, function(y) y@track, character(1L) ,USE.NAMES = FALSE) }) TrackContainer <- function(...) { args <- list(...) if (length(args) == 1 && is.list(args[[1L]])) args <- args[[1L]] if (!all(vapply(args, is, logical(1L), "Track"))) stop("all elements in '...' must be Track objects") S4Vectors:::new_SimpleList_from_list("TrackContainer", args) } setClass("Track", representation( # common trackDb settings track = "character", type = "character", shortLabel = "character", longLabel = "character", bigDataUrl = "character", html = "character", visibility = "character", meta = "character", # common optional settings color = "character", priority = "numeric", altColor = "character", boxedCfg = "logical", chromosomes = "character", darkerLabels = "logical", dataVersion = "character", directUrl = "character", iframeUrl = "character", iframeOptions = "character", mouseOverField = "character", otherDb = "character", pennantIcon = "character", tableBrowser = "character", url = "character", urlLabel = "character", urls = "character", skipEmptyFields = "logical", skipFields = "character", sepFields = "character", ##settings by track type # bam settings refUrl = "character", bigDataIndex = "character", bamColorMode = "character", bamGrayMode = "character", aliQualRange = "character", baseQualRange = "character", bamColorTag = "character", noColorTag = "character", bamSkipPrintQualScore = "character", indelDoubleInsert = "logical", indelQueryInsert = "logical", indelPolyA = "logical", minAliQual = "character", pairEndsByName = "character", pairSearchRange = "character", showNames = "logical", doWiggle = "logical", maxWindowToDraw = "integer", # bigBarChart settings barChartBars = "character", barChartColor = "character", barChartLabel = "character", barChartMaxSize = "character", barChartSizeWindows = "character", barChartMetric = "character", barChartUnit = "character", barChartMatrixUrl = "character", barChartSampleUrl = "character", maxLimit = "character", labelFields = "character", defaultLabelFields = "character", itemRgb = "logical", colorByStrand = "character", denseCoverage = "integer", labelOnFeature = "logical", exonArrows = "logical", exonNumbers = "logical", scoreFilter = "character", scoreFilterLimits = "character", maxItems = "integer", minGrayLevel = "character", noScoreFilter = "logical", spectrum = "logical", scoreMax = "integer", scoreMin = "integer", thickDrawItem = "logical", searchIndex = "character", searchTrix = "character", labelSeparator = "character", # UNSUPPORTED fields # filter. # filterByRange. # filterLimits. # filterText. # filterType. # filterValues. # filterValuesDefault. # filterType. # filterLabel. bedNameLabel = "character", exonArrowsDense = "logical", itemImagePath = "character", itemBigImagePath = "character", mergeSpannedItems = "logical", linkIdInName = "logical", nextExonText = "character", prevExonText = "character", scoreLabel = "character", showTopScorers = "character", # bigChain settings linkDataUrl = "character", # bigInteract settings interactDirectional = "character", interactUp = "character", interactMultiRegion = "character", maxHeightPixels = "character", speciesOrder = "character", frames = "character", summary = "character", # bigNarrowPeak settings # UNSUPPORTED fields #scoreFilter #pValueFilter #qValueFilter #signalFilter #FilterLimits #FilterByRange # bigPsl settings baseColorUseCds = "character", baseColorUseSequence = "character", baseColorDefault = "character", showDiffBasesAllScales = "logical", # bigWig settings autoscale = "character", autoScale = "character", viewLimits = "character", viewLimitsMax = "character", alwaysZero = "logical", graphTypeDefault = "character", maxWindowToQuery = "integer", negateValues = "logical", smoothingWindow = "character", transformFunc = "character", windowingFunction = "character", yLineMark = "character", yLineOnOff = "logical", gridDefault = "logical", # hic settings showSnpWidth = "integer", otherSpecies = "character", # vcfTabix settings minQual = "character", minFreq = "character", hapClusterEnabled = "character", hapClusterColorBy = "character", hapClusterTreeAngle = "character", hapClusterHeight = "character", applyMinQual = "character", ##Grouping tracks into sets and hierarchies # Supertrack superTrack = "character", parent = "character", # Composite Tracks compositeTrack = "logical", allButtonPair = "logical", centerLabelsDense = "logical", dragAndDrop = "character", hideEmptySubtracks = "logical", hideEmptySubtracksMultiBedUrl = "character", hideEmptySubtracksSourcesUrl = "character", hideEmptySubtracksLabel = "character", # Subgroups subGroup1 = "character", subGroup2 = "character", subGroup3 = "character", subGroup4 = "character", subGroup5 = "character", subGroup6 = "character", subGroup7 = "character", subGroup8 = "character", subGroup9 = "character", subGroups = "character", dimensions = "character", filterComposite = "character", dimensionAchecked = "character", dimensionBchecked = "character", sortOrder = "character", # Subgroups Views view = "character", viewUi = "logical", configurable = "logical", # multiWig container = "character", aggregate = "character", showSubtrackColorOnUi = "logical", # Miscellaneous Deprecated Settings metadata = "character", noInherit = "logical", useScore = "integer" ) ) Track <- function(...) { new("Track", ...) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Genome class ### setClass("Genome", representation( genome = "character", trackDb = "character", metaDb = "character", metaTab = "character", twoBitPath = "character", groups = "character", description = "character", organism = "character", defaultPos = "character", orderKey = "character", htmlPath = "character" ), prototype( genome = NA_character_, trackDb = NA_character_, metaDb = NA_character_, metaTab = NA_character_, twoBitPath = NA_character_, groups = NA_character_, description = NA_character_, organism = NA_character_, defaultPos = NA_character_, orderKey = NA_character_, htmlPath = NA_character_ ) ) Genome <- function(...) { new("Genome", ...) } stopIfNotGenome <- function(x) { if (!is(x, "Genome")) stop("value must be Genome object") } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### GenomeContainer class ### setClass("GenomeContainer", representation("SimpleList"), prototype(elementType = "Genome") ) setMethod("names", "GenomeContainer", function(x) { vapply(x, function(y) y@genome, character(1L), USE.NAMES = FALSE) }) setMethod("getListElement", "GenomeContainer", function(x, i, exact = TRUE) { genome <- x[names(x) == i] if (length(genome) == 1L) unlist(genome)[[1L]] }) GenomeContainer <- function(...) { args <- list(...) if (length(args) == 1 && is.list(args[[1L]])) args <- args[[1L]] if (!all(vapply(args, is, logical(1L), "Genome"))) stop("all elements in '...' must be Genome objects") S4Vectors:::new_SimpleList_from_list("GenomeContainer", args) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### TrackHub class ### setGeneric("hub", function(x) standardGeneric("hub")) setGeneric("hub<-", function(x, value) standardGeneric("hub<-")) setGeneric("shortLabel", function(x) standardGeneric("shortLabel")) setGeneric("shortLabel<-", function(x, value) standardGeneric("shortLabel<-")) setGeneric("longLabel", function(x) standardGeneric("longLabel")) setGeneric("longLabel<-", function(x, value) standardGeneric("longLabel<-")) setGeneric("genomesFile", function(x) standardGeneric("genomesFile")) setGeneric("genomesFile<-", function(x, value) standardGeneric("genomesFile<-")) setGeneric("email", function(x) standardGeneric("email")) setGeneric("email<-", function(x, value) standardGeneric("email<-")) setGeneric("descriptionUrl", function(x) standardGeneric("descriptionUrl")) setGeneric("descriptionUrl<-", function(x, value) standardGeneric("descriptionUrl<-")) setGeneric("writeTrackHub", function(x) standardGeneric("writeTrackHub")) setGeneric("genomeField", function(x, name, key) standardGeneric("genomeField")) setGeneric("genomeField<-", function(x, name, key, value) standardGeneric("genomeField<-")) setGeneric("genomeInfo", function(x, name) standardGeneric("genomeInfo")) setGeneric("genomeInfo<-", function(x, value) standardGeneric("genomeInfo<-")) setClass("TrackHub", representation( uri = "character", hub = "character", shortLabel = "character", longLabel = "character", genomesFile = "character", email = "character", descriptionUrl = "character", genomeContainer = "GenomeContainer"), prototype( hub = NA_character_, shortLabel = NA_character_, longLabel = NA_character_, genomesFile = NA_character_, email = NA_character_, descriptionUrl = NA_character_), contains = "List") hubFile <- function(x) paste(trimSlash(uri(x)), "hub.txt", sep = "/") stopIfNotLocal <- function(x) { if (!uriIsWritable(x)) { stop("Repository is read only; cannot write on remote repository") } } getHubContent <- function(x) { content <- readLines(hubFile(x), warn = FALSE) rexp <- "^(\\w+)\\s?(.*)$" contentVec <- c(sub(rexp, "\\2", content)) names(contentVec) <- sub(rexp, "\\1", content) x@hub <- contentVec["hub"] x@shortLabel <- contentVec["shortLabel"] x@longLabel <- contentVec["longLabel"] x@genomesFile <- contentVec["genomesFile"] x@email <- contentVec["email"] x@descriptionUrl <- contentVec["descriptionUrl"] x } setHubContent <- function(x) { file = hubFile(x) cat("", file = file) if (!is.na(x@hub)) cat("hub ", x@hub, "\n", append = TRUE, sep = "", file = file) if (!is.na(x@shortLabel)) cat("shortLabel ", x@shortLabel, "\n", append = TRUE, sep = "", file = file) if (!is.na(x@longLabel)) cat("longLabel ", x@longLabel, "\n", append = TRUE, sep = "", file = file) if (!isFieldEmpty(x@genomesFile)) cat("genomesFile ", x@genomesFile, "\n", append = TRUE, sep = "", file = file) if (!is.na(x@email)) cat("email ", x@email, "\n", append = TRUE, sep = "", file = file) if (!is.na(x@descriptionUrl)) cat("descriptionUrl ", x@descriptionUrl, "\n", append = TRUE, sep = "", file = file) } getGenomesContent <- function(x) { if (uriExists(hubFile(x))) { genomesFileValue <- x@genomesFile if (!isFieldEmpty(genomesFileValue)) { genomesFilePath <- combineURI(uri(x), unname(genomesFileValue)) if (isFileEmpty(genomesFilePath)) { return(list()) } content <- readLines(genomesFilePath, warn = FALSE) content_df <- read.csv(text = sub(" ", ",", content), header = FALSE) genomesIndex <- grep("\\bgenome\\b", content_df$V1) totalGenomes <- length(genomesIndex) genomesIndex[length(genomesIndex) + 1] <- length(content_df$V1) + 1 genomes <- lapply(1:totalGenomes, function(x) { startPosition <- genomesIndex[x] endPosition <- genomesIndex[x + 1] - 1 genome <- setNames(data.frame(content_df$V1[startPosition:endPosition], content_df$V2[startPosition:endPosition]), c("field", "value")) genome <- setNames(as.list(genome$value), genome$field) genome <- do.call(Genome, genome) }) genomes } else message("hub.txt: 'genomesFile' does not contain valid reference to genomes file") } } setGenomesContent <- function(x, genomeContainer) { genomesFilePath <- combineURI(uri(x), x@genomesFile) slots <- slotNames(Genome()) genomesFields <- c("twoBitPath", "groups", "htmlPath", "metaDb", "trackDb" , "metaTab") genomes <- vapply(genomeContainer, function(y) { uri <- combineURI(uri(x), y@genome) if (!uriExists(uri)) createResource(uri, dir = TRUE) genome <- vapply(slots, function(slotName) { slotValue <- slot(y, slotName) if (!isEmpty(slotValue) && !is.na(slotValue)) { if (slotName %in% genomesFields) { filePath <- combineURI(uri(x), slotValue) if (!uriExists(filePath)) { createResource(filePath) } } paste0(slotName, " ", slotValue) } else "" }, character(1L)) }, character(11L)) genomes <- genomes[genomes != ""] genomes <- gsub("\\bgenome\\b", "\ngenome", genomes) writeLines(genomes, genomesFilePath) } getGenome <- function(x, name) { genome <- x@genomeContainer[[name]] if (length(genome) == 1L) genome else if (length(genome) == 0L) stop("Genome '", name, "' does not exist") else if (length(genome) > 1L) stop("Multiple genomes match ", name) } setGenome <- function(x, name, value) { stopIfNotGenome(value) genome <- x@genomeContainer[[name]] if (length(genome) == 1L) genome <- value else if (length(genome) == 0L) stop("Genome '", name, "' does not exist") else if (length(genome) > 1L) stop("Multiple genomes match ", name) x@genomeContainer[[name]] <- genome x } setMethod("uri", "TrackHub", function(x) { x@uri }) setMethod("hub", "TrackHub", function(x) { unname(x@hub) }) setReplaceMethod("hub", "TrackHub", function(x, value) { x@hub <- value x }) setMethod("shortLabel", "TrackHub", function(x) { unname(x@shortLabel) }) setReplaceMethod("shortLabel", "TrackHub", function(x, value) { x@shortLabel <- value x }) setMethod("longLabel", "TrackHub", function(x) { unname(x@longLabel) }) setReplaceMethod("longLabel", "TrackHub", function(x, value) { x@longLabel <- value x }) setMethod("genomesFile", "TrackHub", function(x) { unname(x@genomesFile) }) setReplaceMethod("genomesFile", "TrackHub", function(x, value) { x@genomesFile <- value x }) setMethod("email", "TrackHub", function(x) { unname(x@email) }) setReplaceMethod("email", "TrackHub", function(x, value) { x@email <- value x }) setMethod("descriptionUrl", "TrackHub", function(x) { unname(x@descriptionUrl) }) setReplaceMethod("descriptionUrl", "TrackHub", function(x, value) { x@descriptionUrl <- value x }) setMethod("genome", "TrackHub", function(x) { genomes <- x@genomeContainer names(genomes) }) setMethod("getListElement", "TrackHub", function(x, i, exact = TRUE) { TrackHubGenome(x, i) }) setMethod("names", "TrackHub", function(x) genome(x)) setMethod("length", "TrackHub", function(x) length(names(x))) setMethod("genomeInfo", "TrackHub", function(x, name) { names <- names(x@genomeContainer) genome <- x@genomeContainer[[name]] if (length(genome) == 0L) stop("Genome '", name, "' does not exist") else genome }) setReplaceMethod("genomeInfo", "TrackHub", function(x, value) { stopIfNotGenome(value) name <- value@genome names <- names(x@genomeContainer) genome <- x@genomeContainer[[name]] if (length(genome) == 1L) stop("NOTE: Genome '", name, "' already exists") else if (length(genome) > 1L) stop("Multiple genomes match ", name) else { if (!identical(value, Genome())) { if (length(x@genomeContainer) == 0L) genomes <- value else genomes <- c(unlist(x@genomeContainer), value) x@genomeContainer <- GenomeContainer(genomes) } } x }) setMethod("genomeField", "TrackHub", function(x, name, key) { genome <- getGenome(x, name) slot(genome, key) }) setReplaceMethod("genomeField", "TrackHub", function(x, name, key, value) { genome <- getGenome(x, name) slot(genome, key) <- value setGenome(x, name, genome) }) setMethod("writeTrackHub", "TrackHub", function(x) { stopIfNotLocal(hubFile(x)) setHubContent(x) genomesFilePath <- combineURI(uri(x), genomesFile(x)) if (!uriExists(genomesFilePath) && !is.na(genomesFile(x))) createResource(genomesFilePath) if (uriExists(genomesFilePath)) setGenomesContent(x, x@genomeContainer) }) setMethod("show", "TrackHub", function(object) { cat(class(object), "repository\nuri:", uri(object), "\n") cat(S4Vectors:::labeledLine("genomes", genome(object))) cat("hub:", hub(object), "\n") cat("shortLabel:", shortLabel(object), "\n") cat("longLabel:", longLabel(object), "\n") cat("genomesFile:", genomesFile(object), "\n") cat("email:", email(object), "\n") cat("descriptionUrl:", descriptionUrl(object), "\n") }) TrackHub <- function(uri, create = FALSE) { if (!isTRUEorFALSE(create)) stop("'create' must be TRUE or FALSE") if (create) { if (uriExists(uri)) { message("NOTE: '", uri, "' already exists") create <- FALSE } else createResource(uri, dir = TRUE) } th <- new("TrackHub") th@uri <- checkURI(uri) if (create && !uriExists(hubFile(th))) { createResource(hubFile(th)) } else { th <- getHubContent(th) genomes <- getGenomesContent(th) if (is.list(genomes) && length(genomes) >= 1L) th@genomeContainer <- GenomeContainer(unlist(genomes)) } th } setAs("character", "TrackHub", function(from) TrackHub(from)) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### TrackHubGenome class ### setGeneric("getTracks", function(x) standardGeneric("getTracks")) setGeneric("trackField", function(x, name, key) standardGeneric("trackField")) setGeneric("trackField<-", function(x, name, key, value) standardGeneric("trackField<-")) setClass("TrackHubGenome", representation(trackhub = "TrackHub", genome = "character", tracks = "TrackContainer", levels = "integer"), contains = "TrackDb") trackhub <- function(x) x@trackhub createTrack <- function(trackDf) { fieldToType <- list( track = "character", type = "character", shortLabel = "character", longLabel = "character", bigDataUrl = "character", html = "character", visibility = "character", meta = "character", color = "character", priority = "numeric", altColor = "character", boxedCfg = "logical", chromosomes = "character", darkerLabels = "logical", dataVersion = "character", directUrl = "character", iframeUrl = "character", iframeOptions = "character", mouseOverField = "character", otherDb = "character", pennantIcon = "character", tableBrowser = "character", url = "character", urlLabel = "character", urls = "character", skipEmptyFields = "logical", skipFields = "character", sepFields = "character", refUrl = "character", bigDataIndex = "character", bamColorMode = "character", bamGrayMode = "character", aliQualRange = "character", baseQualRange = "character", bamColorTag = "character", noColorTag = "character", bamSkipPrintQualScore = "character", indelDoubleInsert = "logical", indelQueryInsert = "logical", indelPolyA = "logical", minAliQual = "character", pairEndsByName = "character", pairSearchRange = "character", showNames = "logical", doWiggle = "logical", maxWindowToDraw = "integer", barChartBars = "character", barChartColor = "character", barChartLabel = "character", barChartMaxSize = "character", barChartSizeWindows = "character", barChartMetric = "character", barChartUnit = "character", barChartMatrixUrl = "character", barChartSampleUrl = "character", maxLimit = "character", labelFields = "character", defaultLabelFields = "character", itemRgb = "logical", colorByStrand = "character", denseCoverage = "integer", labelOnFeature = "logical", exonArrows = "logical", exonNumbers = "logical", scoreFilter = "character", scoreFilterLimits = "character", maxItems = "integer", minGrayLevel = "character", noScoreFilter = "logical", spectrum = "logical", scoreMax = "integer", scoreMin = "integer", thickDrawItem = "logical", searchIndex = "character", searchTrix = "character", labelSeparator = "character", bedNameLabel = "character", exonArrowsDense = "logical", itemImagePath = "character", itemBigImagePath = "character", mergeSpannedItems = "logical", linkIdInName = "logical", nextExonText = "character", prevExonText = "character", scoreLabel = "character", showTopScorers = "character", linkDataUrl = "character", interactDirectional = "character", interactUp = "character", interactMultiRegion = "character", maxHeightPixels = "character", speciesOrder = "character", frames = "character", summary = "character", baseColorUseCds = "character", baseColorUseSequence = "character", baseColorDefault = "character", showDiffBasesAllScales = "logical", autoscale = "character", autoScale = "character", viewLimits = "character", viewLimitsMax = "character", alwaysZero = "logical", graphTypeDefault = "character", maxWindowToQuery = "integer", negateValues = "logical", smoothingWindow = "character", transformFunc = "character", windowingFunction = "character", yLineMark = "character", yLineOnOff = "logical", gridDefault = "logical", showSnpWidth = "integer", otherSpecies = "character", minQual = "character", minFreq = "character", hapClusterEnabled = "character", hapClusterColorBy = "character", hapClusterTreeAngle = "character", hapClusterHeight = "character", applyMinQual = "character", superTrack = "character", parent = "character", compositeTrack = "logical", allButtonPair = "logical", centerLabelsDense = "logical", dragAndDrop = "character", hideEmptySubtracks = "logical", hideEmptySubtracksMultiBedUrl = "character", hideEmptySubtracksSourcesUrl = "character", hideEmptySubtracksLabel = "character", subGroup1 = "character", subGroup2 = "character", subGroup3 = "character", subGroup4 = "character", subGroup5 = "character", subGroup6 = "character", subGroup7 = "character", subGroup8 = "character", subGroup9 = "character", subGroups = "character", dimensions = "character", filterComposite = "character", dimensionAchecked = "character", dimensionBchecked = "character", sortOrder = "character", view = "character", viewUi = "logical", configurable = "logical", container = "character", aggregate = "character", showSubtrackColorOnUi = "logical", metadata = "character", noInherit = "logical", useScore = "integer") trackDf$value <- gsub("\\b[Oo]n\\b", "TRUE", trackDf$value) trackDf$value <- gsub("\\b[Oo]ff\\b", "FALSE", trackDf$value) extrafields <- setdiff(trackDf$field, names(fieldToType)) selectedRows <- !(trackDf$field == extrafields) if (length(selectedRows)) trackDf <- trackDf[selectedRows,] args <- Map(as, trackDf$value, fieldToType[trackDf$field]) names(args) <- trackDf$field track <- do.call(Track, args) track } getTabCountList <- function(filepath) { fileContent <- readLines(filepath, warn = FALSE) fileContent <- gsub("^\\t*\\s*#(.)*", "", fileContent) fileContent <- fileContent[fileContent != ""] matches <- gregexpr("^\\s+", fileContent) tabCountList <- vapply(matches, attr, integer(1L), "match.length") indexes <- grep(-1, tabCountList) tabCountList <- replace(tabCountList, indexes, 0) as.integer(tabCountList) } readFileAsDf <- function(filepath) { fileContent <- readLines(filepath, warn = FALSE) fileContent <- gsub("^(\\t)*#(.)*", "", fileContent) # to avoid reading commented tracks regex <- "^\\s*\\t*([a-zA-Z.]+)\\s?(.*)$" field <- sub(regex, "\\1", fileContent) value <- sub(regex, "\\2", fileContent) contentDf <- data.frame(field, value) contentDf <- contentDf[contentDf$field != "",] } getTrackDbContent <- function(x, trackDbFilePath) { if (isFileEmpty(trackDbFilePath)) { x@tracks <- TrackContainer() return(x) } contentDf <- readFileAsDf(trackDbFilePath) levels <- getTabCountList(trackDbFilePath) tracksIndex <- grep("\\btrack\\b", contentDf$field) levels <- levels[tracksIndex] totalTracks <- length(tracksIndex) tracksIndex[length(tracksIndex) + 1] <- length(contentDf$field) + 1 # to read last track from file contentDf$field <- gsub("^(\\t)+", "", contentDf$field) # to speed up, reading track by track tracks <- lapply(seq_len(totalTracks), function(x) { startPosition <- tracksIndex[x] endPosition <- tracksIndex[x + 1] - 1 trackDf <- setNames(data.frame(contentDf$field[startPosition:endPosition], contentDf$value[startPosition:endPosition]), c("field", "value")) track <- createTrack(trackDf) }) x@tracks <- TrackContainer(tracks) x@levels <- levels x } setMethod("genome", "TrackHubGenome", function(x) x@genome) setMethod("uri", "TrackHubGenome", function(x) paste(trimSlash(uri(trackhub(x))), genome(x), sep = "/")) setMethod("getTracks", "TrackHubGenome", function(x) { x@tracks }) setMethod("names", "TrackHubGenome", function(x) { as.character(names(getTracks(x))) }) setMethod("trackNames", "TrackHubGenome", function(object) { names(object) }) setMethod("trackField", "TrackHubGenome", function(x, name, key) { names <- names(x@tracks) track <- x@tracks[names == name] if (length(track) == 0L) stop("Track '", name, "' does not exist") else if (length(track) > 1L) stop("Multiple tracks match ", name) slot(track[[1L]], key) }) setReplaceMethod("trackField", "TrackHubGenome", function(x, name, key, value) { names <- names(x@tracks) track <- x@tracks[names == name] slot(track[[1L]], key) <- value x@tracks[names == name] <- track x }) setMethod("organism", "TrackHubGenome", function(object) { genome <- getGenome(trackhub(object), genome(object)) genome@organism }) setMethod("referenceSequence", "TrackHubGenome", function(x) { trackhub <- trackhub(x) genome <- getGenome(trackhub, genome(x)) twoBitPathValue <- genome@twoBitPath if (!isFieldEmpty(twoBitPathValue)) { twoBitFilePath <- combineURI(uri(trackhub), twoBitPathValue) import(twoBitFilePath) } else stop("genome.txt: 'twoBitPath' does not contain a reference to a file") }) setReplaceMethod("referenceSequence", "TrackHubGenome", function(x, value) { trackhub <- trackhub(x) genomesFilePath <- combineURI(uri(trackhub), trackhub@genomesFile) stopIfNotLocal(genomesFilePath) genome <- getGenome(trackhub, genome(x)) twoBitPathValue <- genome@twoBitPath if (!isFieldEmpty(twoBitPathValue)) { twoBitFilePath <- combineURI(uri(trackhub(x)), twoBitPathValue) export.2bit(value, twoBitFilePath) x } else stop("genome.txt: 'twoBitPath' does not contain a reference to a file") }) setMethod("length", "TrackHubGenome", function(x) { length(names(x)) }) setMethod("writeTrackHub", "TrackHubGenome", function(x) { trackhub <- trackhub(x) stopIfNotLocal(hubFile(trackhub)) genome <- getGenome(trackhub, genome(x)) trackDbValue <- genome@trackDb trackDbFilePath <- combineURI(uri(trackhub), trackDbValue) if (!isFileEmpty(trackDbFilePath) || length(x@tracks)) { tabStrings <- vapply(x@levels, function(y) { paste(rep("\t", y), collapse = "") },character(1L)) if (length(tabStrings) == 0) tabStrings <- rep("", length(x@tracks)) slots <- slotNames(Track()) tracks <- vapply(seq_len(length(x@tracks)), function(i) { track <- vapply(slots, function(slotName) { slotValue <- slot(x@tracks[[i]], slotName) if (!isEmpty(slotValue)) { if (is.na(tabStrings[i])) tabStrings[i] <- "" trackline <- paste0(tabStrings[i], slotName, " ", slotValue) if (slotName == "track") trackline <- paste0("\n", trackline) trackline } else "" }, character(1L)) }, character(155L)) tracks <- tracks[tracks != ""] tracks <- gsub("\\bTRUE\\b", "on", tracks) tracks <- gsub("\\bFALSE\\b", "off", tracks) writeLines(tracks, trackDbFilePath) } }) setMethod("show", "TrackHubGenome", function(object) { cat(class(object), "track database\ngenome:", genome(object), "\ntrackhub:", uri(trackhub(object)), "\n") cat(S4Vectors:::labeledLine("names", names(object))) }) TrackHubGenome <- function(trackhub, genome, create = FALSE) { trackhub <- as(trackhub, "TrackHub") thg <- new("TrackHubGenome") thg@trackhub <- trackhub thg@genome <- genome genome <- getGenome(trackhub(thg), genome(thg)) trackDbValue <- genome@trackDb if (!isFieldEmpty(trackDbValue)) { trackDbFilePath <- combineURI(uri(trackhub(thg)), trackDbValue) if (!uriExists(trackDbFilePath) && create) { createResource(trackDbFilePath) }else if (!isFileEmpty(trackDbFilePath) && uriExists(trackDbFilePath)) { thg <- getTrackDbContent(thg, trackDbFilePath) } } thg } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Import of tracks from Track Hub ### setMethod("track", "TrackHubGenome", function(object, name, ...) { names <- names(object@tracks) track <- object@tracks[names == name] if (length(track) == 0L) stop("Track '", name, "' does not exist") else if (length(track) > 1L) stop("Multiple tracks match ", name) bigDataUrl <- track[[1L]]@bigDataUrl parsed <- .parseURI(bigDataUrl) if (isEmpty(bigDataUrl)) { stop("Track '", name, "' does not contain any data file") } else if (uriIsLocal(parsed)) { uri <- uri(trackhub(object)) import(paste0(uri, "/", bigDataUrl), ...) } else { import(bigDataUrl, ...) } }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export of tracks to Track Hub ### copyResourceToTrackHub <- function(object, uri) { parsed_uri <- .parseURI(uri) if (parsed_uri$scheme == "") uri <- paste0("file://", uri) filename <- basename(uri) trackhub <- trackhub(object) object_uri <- .parseURI(uri(trackhub)) if (uriIsLocal(object_uri)) { genome <- getGenome(trackhub, genome(object)) trackDbValue <- genome@trackDb trackDbValue <- sub(basename(trackDbValue), "", trackDbValue) trackDbValue <- sub("/$", "", trackDbValue) dest_file <- paste(object_uri$path, trackDbValue, filename, sep = "/") dest_file <- sub("^/", "", dest_file) if (paste(uri(object), filename, sep = "/") != uri) ### FIXME: curl_unescape() here because of R bug download.file(curl_unescape(uri), dest_file) } else stop("TrackHub is not local; cannot copy track") filename } .exportToTrackHub <- function(object, name, format = bestFileFormat(value, object), index = TRUE, ..., value) { filename <- paste(name, format, sep = ".") path <- paste(uri(object), filename, sep = "/") file <- export(value, path, format = format, index = index, ...) track(object, name, index = FALSE) <- file object } setReplaceMethod("track",signature(object = "TrackHubGenome", value = "ANY"), .exportToTrackHub) setReplaceMethod("track", signature(object = "TrackHubGenome", value = "RsamtoolsFile"), function(object, name, ..., value) { if (missing(name)) name <- basename(path(value)) track(object, name) <- URLencode(path(value)) copyResourceToTrackHub(object, URLencode(index(value))) object }) setReplaceMethod("track", signature(object = "TrackHubGenome", value = "BiocFile"), function(object, name, ..., value) { if (missing(name)) name <- basename(path(value)) track(object, name) <- URLencode(path(value)) object }) setReplaceMethod("track", signature(object = "TrackHubGenome", value = "character"), function(object, name = basename(object), ..., value) { filename <- copyResourceToTrackHub(object, value) genome <- getGenome(trackhub(object), genome(object)) trackDbValue <- genome@trackDb trackDbValue <- sub(basename(trackDbValue), "", trackDbValue) trackDbValue <- sub("/$", "", trackDbValue) bigDataUrlValue <- paste(trackDbValue, filename, sep = "/") bigDataUrlValue <- sub("^/", "", bigDataUrlValue) names <- names(object@tracks) trackPosition <- which(names == name) trackDf <- setNames(data.frame(c("track", "bigDataUrl"), c(name, bigDataUrlValue)), c("field", "value")) track <- createTrack(trackDf) if (isEmpty(trackPosition)) { trackPosition <- length(object@tracks) + 1 object@tracks[[trackPosition]] <- track }else { object@tracks[[trackPosition]] <- track } object }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Utilities ### combineURI <- function(x,y) paste(trimSlash(x), y, sep = "/") isFileReference <- function(x) { formats <- c("txt", "2bit", "html") tools::file_ext(x) %in% formats } isFieldEmpty <- function(x) { if ((isFileReference(x) && !is.na(x)) && !is.null(x)) { return(FALSE) } return(TRUE) } trimSlash <- function(x) { sub("/$", "", x) } ### Note that prior to rtracklayer 1.63.1, isFileEmpty() was returning an ### error on an empty remote file. Also it was always returning FALSE on a ### local file, even on an empty one! isFileEmpty <- function(path) { url <- .parseURI(path) if (uriIsLocal(url)) { size <- file.size(url$path) size == 1L || size == 0L } else { contentLength <- HEAD(path)$headers[["content-length"]] is.null(contentLength) || contentLength == "0" } } rtracklayer/R/trackTable.R0000644000175100017510000000337314614231172016524 0ustar00biocbuildbiocbuild### ========================================================================= ### Arbitrary track table support ### ------------------------------------------------------------------------- ### ### At this point, this is internal, in support of the tabix stuff ### setClass("TabSeparatedFile", contains = "BiocFile") TabSeparatedFile <- function(resource) { new("TabSeparatedFile", resource = resource) } setGeneric("import.tabSeparated", function(con, genome = NA, seqnames = 1L, start = 2L, end = 3L, ...) standardGeneric("import.tabSeparated"), signature = "con") setMethod("import.tabSeparated", "character_OR_connection", function(con, genome = NA, seqnames = 1L, start = 2L, end = 3L, ...) { tab <- read.table(con, sep = "\t", ...) ans <- GRanges(tab[[seqnames]], IRanges(tab[[start]], tab[[end]]), strand=Rle(strand("*"), nrow(tab)), tab[-c(seqnames, start, end)]) metadata(ans) <- list(genome = genome) ans }) setGeneric("export.tabSeparated", function(object, con, ...) standardGeneric("export.tabSeparated")) setMethod("export.tabSeparated", "ANY", function(object, con, ...) { export(object, con, "tabSeparated", ...) }) setMethod("export", c("ANY", "TabSeparatedFile"), function(object, con, ...) { df <- as.data.frame(object) write.table(df, path(con), sep="\t", ...) }) setMethod("export", c("GenomicRanges", "TabSeparatedFile"), function(object, con, ...) { object <- as.data.frame(object, row.names=NULL) object$width <- NULL export(object, con, ...) }) rtracklayer/R/twobit.R0000644000175100017510000001150014614231172015747 0ustar00biocbuildbiocbuild### ========================================================================= ### UCSC 2bit support ### ------------------------------------------------------------------------- ### ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### TwoBitFile class ### setClass("TwoBitFile", contains = "BiocFile") setClass("2BitFile", contains = "TwoBitFile") twoBitPath <- function(path) { uri <- .parseURI(path) if (!uriIsLocal(uri)) stop("TwoBit driver handles only local file paths") path.expand(uri$path) } TwoBitFile <- function(path) { if (!isSingleString(path)) stop("'filename' must be a single string, specifying a path") new("TwoBitFile", resource = twoBitPath(path)) } `2BitFile` <- TwoBitFile .seqlengths_TwoBitFile <- function(x) { .Call(TwoBitFile_seqlengths, path(x)) } fastaSeqnames <- function(x) { sub(" .*", "", x) } setMethod("seqinfo", "TwoBitFile", function(x) { seqlengths <- .seqlengths_TwoBitFile(x) names(seqlengths) <- fastaSeqnames(names(seqlengths)) Seqinfo(names(seqlengths), seqlengths) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export ### setGeneric("export.2bit", function(object, con, ...) standardGeneric("export.2bit")) setMethod("export.2bit", "ANY", function(object, con, ...) { export(object, con, "2bit", ...) }) setMethod("export", c("ANY", "TwoBitFile"), function(object, con, format, ...) { object <- as(object, "DNAStringSet") callGeneric() }) setMethod("export", c("DNAStringSet", "TwoBitFile"), function(object, con, format) { if (!missing(format)) checkArgFormat(con, format) seqnames <- names(object) if (is.null(seqnames)) seqnames <- as.character(seq(length(object))) freq <- alphabetFrequency(object) unsupported.chars <- setdiff(DNA_ALPHABET, c(DNA_BASES, "N")) if (any(uniqueLetters(object) %in% unsupported.chars)) { stop("One or more strings contain unsupported ambiguity ", "characters.\nStrings can contain only A, C, G, T or N.", "\nSee Biostrings::replaceAmbiguities().") } if (any(width(object) == 0L)) { stop("Empty strings are not yet supported") } invisible(.TwoBits_export(mapply(.DNAString_to_twoBit, object, seqnames), twoBitPath(path(con)))) }) ## Hidden export of a list of twoBit pointers. ## NOT exported (but used in the BSgenome package). .TwoBits_export <- function(object, con) { if (!isSingleString(con)) stop("'con' must be a single, non-NA string") if (!all(sapply(object, function(x) typeof(x) == "externalptr" && is(x, "twoBit")))) stop("'object' must be a list of 'twoBit' pointers") .Call(TwoBits_write, object, con) } ## NOT exported (but used in the BSgenome package). .DNAString_to_twoBit <- function(object, seqname) { if (!isSingleString(seqname)) stop("'seqname' must be a single, non-NA string") if (!is(object, "DNAString") && !is(object, "MaskedDNAString")) stop("'object' must be a DNAString") object_masks <- masks(object) if (!is.null(object_masks)) { object_mask <- collapse(object_masks)[[1]] active(masks(object)) <- FALSE # so we get the real sequence } else object_mask <- IRanges() .Call(DNAString_to_twoBit, as.character(object), object_mask, seqname) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Import ### setGeneric("import.2bit", function(con, ...) standardGeneric("import.2bit")) setMethod("import.2bit", "ANY", function(con, ...) { import(con, "2bit", ...) }) setMethod("import", "TwoBitFile", function(con, format, text, which = as(seqinfo(con), "GenomicRanges"), ...) { lkup <- get_seqtype_conversion_lookup("B", "DNA") sl <- .seqlengths_TwoBitFile(con) sn <- extractROWS(names(sl), match(seqnames(which), seqlevels(con))) if (any(is.na(sn))) { stop("'seqnames' not in 2bit file: ", paste0("'", unique(seqnames(which)[is.na(sn)]), "'", collapse=", ")) } ans <- .Call(TwoBitFile_read, twoBitPath(path(con)), sn, as(ranges(which), "IRanges"), lkup) names(ans) <- names(which) ans }) setMethod("getSeq", "TwoBitFile", function(x, which = as(seqinfo(x), "GenomicRanges")) { ans <- import(x, which = which) rc <- strand(which) == "-" ans[rc] <- reverseComplement(ans[rc]) ans }) rtracklayer/R/ucsc.R0000644000175100017510000016461314614231172015412 0ustar00biocbuildbiocbuild# UCSC genome browser interface # every UCSC session is identified by a 'hguid' setClass("UCSCSession", representation(url = "character", hguid = "character", views = "environment"), contains = "BrowserSession") # gets an 'hgsid' to initialize the session setMethod("initialize", "UCSCSession", function(.Object, url = "https://genome.ucsc.edu/cgi-bin/", user = NULL, session = NULL, force = FALSE, ...) { .Object@url <- url .Object@views <- new.env() gwURL <- ucscURL(.Object, "gateway", force=force) config <- config(followlocation = 1, nobody = 1, cookiefile = tempfile(), useragent = "rtracklayer", ...) ## nobody = 1 seems to be ignored and HEAD() doesn't work here response <- GET(gwURL, config) cookie <- response$headers[["set-cookie"]] if (is.null(cookie)) stop("Failed to obtain 'hguid' cookie") hguid <- strsplit(cookie, split = ";", fixed = TRUE)[[1L]][[1L]] .Object@hguid <- hguid if (!is.null(user) && !is.null(session)) { ## bring in other session ucscGet(.Object, "tracks", list(hgS_doOtherUser = "submit", hgS_otherUserName = user, hgS_otherUserSessionName = session)) } .Object }) setMethod("seqlengths", "UCSCSession", function(x) { seqlengths(Seqinfo(genome = genome(x))) }) setMethod("seqnames", "UCSCSession", function(x) names(seqlengths(x))) setMethod("seqinfo", "UCSCSession", function(x) { Seqinfo(genome = genome(x)) # no circularity information }) normArgTrackData <- function(value, session) { genomes <- vapply(value, function(x) singleGenome(genome(x)), character(1L)) genomes[is.na(genomes)] <- "" tapply(value, unlist(genomes), function(tracks) { genome <- singleGenome(genome(tracks[[1]])) if (!is.na(genome)) genome(session) <- genome spaces <- do.call(c, unname(lapply(tracks, seqnames))) badSpaces <- setdiff(spaces, seqnames(session)) if (length(badSpaces) > 0L) stop("Invalid chromosomes for ", genome(session), ": ", paste(badSpaces, collapse = ", ")) }) value } handleError <- function(response) { msg <- getNodeSet(response, "//span[text()='Error']/../text()") if (length(msg) == 2L) stop(sub(".*? - ", "", xmlValue(msg[[2L]]))) } setReplaceMethod("track", c("UCSCSession", "SimpleGRangesList"), function(object, name = names(value), format = c("auto", "bed", "wig", "gff1", "bed15", "bedGraph"), ..., value) { format <- match.arg(format) if (length(value)) { ## upload values in blocks, one for each genome value <- normArgTrackData(value, object) names(value) <- name genomes <- sapply(value, function(x) singleGenome(genome(x))) genomes[is.na(genomes)] <- "" tapply(value, unlist(genomes), function(tracks) { form <- ucscForm(tracks, format, ...) response <- ucscPost(object, "custom", form) handleError(response) }) } object }) setReplaceMethod("track", c("UCSCSession", "BiocFile"), function(object, name = names(value), ..., value) { form <- ucscForm(value, genome(object), ...) response <- ucscPost(object, "custom", form) object }) setMethod("browserViews", "UCSCSession", function(object) object@views$instances) ## get the list of track names setMethod("trackNames", "UCSCSession", function(object) ucscTracks(object)@ids) ## get the current range setMethod("range", "UCSCSession", function(x, ..., na.rm) range(ucscCart(x))) setReplaceMethod("range", "UCSCSession", function(x, value) { ucscGet(x, "cart", ucscForm(normGenomeRange(value, seqinfo(x)))) x }) setMethod("genome", "UCSCSession", function(x) { genome(ucscCart(x)) }) setReplaceMethod("genome", "UCSCSession", function(x, value) { if (!isSingleString(value)) stop("'genome' must be a single non-NA string") ucscGet(x, "gateway", list(db = value)) if (genome(x) != value) stop("Failed to set session genome to '", value, "'") x }) SeqinfoForUCSCGenome <- function(genome) { tryCatch({ session <- browserSession("UCSC") genome(session) <- genome seqinfo(session) }, error = function(cond) NULL) } GRangesForUCSCGenome <- function(genome, chrom = NULL, ranges = NULL, ...) { GRangesForGenome(genome, chrom = chrom, ranges = ranges, method = "UCSC", seqinfo = NULL, ...) } ## context for querying UCSC tables setClass("UCSCTableQuery", representation(genome = "character", table = "character_OR_NULL", range = "GRanges", NAMES = "character_OR_NULL", url = "character", hubUrl = "character_OR_NULL", track = "character_OR_NULL")) setMethod("show", "UCSCTableQuery", function(object) { cat("Get ") if (!is.null(tableName(object))) cat("table '", tableName(object), "' from ", sep = "") range <- range(object) if (length(range) > 1) start <- end <- chrom <- "*" else { chrom <- as.character(seqnames(range)) start <- start(range) end <- end(range) } cat(genome(range)[1], ":", chrom, ":", start, "-", end, sep="") cat("\n") }) setMethod("genome", "UCSCTableQuery", function(x) { x@genome }) setReplaceMethod("genome", "UCSCTableQuery", function(x, value) { x@genome <- value x }) setMethod("browserSession", "UCSCTableQuery", function(object) { .Defunct("browserSession is no longer supported, instead use genome identifier") }) setGeneric("browserSession<-", function(object, ..., value) standardGeneric("browserSession<-")) setReplaceMethod("browserSession", "UCSCTableQuery", function(object, value) { .Defunct("browserSession is no longer supported, instead use genome identifier") }) setMethod("range", "UCSCTableQuery", function(x, ..., na.rm) x@range) setReplaceMethod("range", "UCSCTableQuery", function(x, value) { x@range <- normTableQueryRange(value, x@genome, 1L) x }) setGeneric("trackName", function(x, ...) standardGeneric("trackName")) setMethod("trackName", "UCSCTableQuery", function(x) { .Defunct("tableName", msg = "track is meaningless now you only go by the table") }) setGeneric("trackName<-", function(x, ..., value) standardGeneric("trackName<-")) setReplaceMethod("trackName", "UCSCTableQuery", function(x, value) { .Defunct("tableName<-", msg = "track is meaningless now you only go by the table") }) setGeneric("tableName", function(x, ...) standardGeneric("tableName")) setMethod("tableName", "UCSCTableQuery", function(x) x@table) normArgTable <- function(name, query) { if (!is.null(name)) { if (!isSingleString(name)) stop("table name must be a single string or NULL") if (!name %in% tableNames(query)) stop("Table '", name, "' is unavailable") } name } setGeneric("tableName<-", function(x, ..., value) standardGeneric("tableName<-")) ### FIXME: we need '...' in the formals due to a bug in R 3.5, remove for 3.6 setReplaceMethod("tableName", "UCSCTableQuery", function(x, check=TRUE, ..., value) { if (!missing(...)) warning("arguments in '...' ignored") if (check) value <- normArgTable(value, x) x@table <- value x }) setMethod("names", "UCSCTableQuery", function(x) x@NAMES) setReplaceMethod("names", "UCSCTableQuery", function(x, value) { x@NAMES <- value x }) setGeneric("intersectTrack", function(x, ...) standardGeneric("intersectTrack")) setMethod("intersectTrack", "UCSCTableQuery", function(x) { .Defunct(msg = "intersectTrack is no longer supported") }) setGeneric("intersectTrack<-", function(x, ..., value) standardGeneric("intersectTrack<-")) setReplaceMethod("intersectTrack", "UCSCTableQuery", function(x, value) { .Defunct(msg = "intersectTrack is no longer supported") }) normTableQueryRange <- function(range, genome, max.length = 1000L) { seqinfo <- Seqinfo(genome = genome) normGenomeRange(range, seqinfo, max.length) } ucscTables <- function(genome, track) { url <- "https://genome.ucsc.edu/cgi-bin/hgTables" if (!isSingleString(genome)) stop("'genome' must be a single non-NA string") # check genome is valid or not doc <- rtracklayerGET(url, query = list(db=genome)) genomes <- unlist(getNodeSet(doc, "//select[@name='db']/option/@value")) if (!(genome %in% unname(genomes))) stop("Invalid genome :'", genome, "'") # retrieve track for a genome trackids <- ucscTableTracks(genome) track <- normArgTrack(track, trackids) # retrieve tables for a track form <- c(db = genome, hgta_group = "allTracks", hgta_track = track) doc <- rtracklayerGET(url, query = form) tables <- unlist(getNodeSet(doc, "//select[@name='hgta_table']/option/@value")) unname(tables) } setGeneric("ucscTableQuery", function(x, ...) standardGeneric("ucscTableQuery")) setMethod("ucscTableQuery", "UCSCSession", function(x, ...) { ucscTableQuery(genome(x), ...) }) normArgTrack <- function(name, trackids) { if (!isSingleString(name)) stop("'track' must be a single string") if (name %in% names(trackids)) unname(trackids[name]) else stop("Unknown track: ", name) } setMethod("ucscTableQuery", "character", function(x, track = NULL, range = NULL, table = NULL, names = NULL, intersectTrack = NULL, check = TRUE, hubUrl = NULL, genome = NULL, url = "https://genome.ucsc.edu/cgi-bin/") { stopifnot(isSingleString(x)) if (!is.null(intersectTrack)) stop("intersectTrack is no longer supported") if (!is(names, "character_OR_NULL")) stop("'names' must be 'NULL' or a character vector") if (uriExists(x)) { # if x is URI and it exits that means it's a trackHub if (is.null(genome)) stop("'genome' is a mandatory parameter and must be a single string") hubUrl <- x } else genome <- x # if the table is provied then it will not try to identify the table from the track if (!is.null(track) && is.null(table)) { warning("'track' parameter is deprecated now you go by the 'table' instead Use ucscTables(genome, track) to retrieve the list of tables for a track") tables <- ucscTables(genome, track) table <- tables[1] } if (is.null(range)) { range <- Seqinfo(genome = genome) range <- as(range, "GRanges") } else range <- normTableQueryRange(range, genome) query <- new("UCSCTableQuery", genome = genome, range = range, NAMES = names, url = url, hubUrl = hubUrl, track = track) if (is.null(table)) check <- FALSE tableName(query, check=check) <- table query }) isTrackHub <- function(x) { status <- FALSE if (!is.null(x@hubUrl)) { if (uriExists(x@hubUrl)) status <- TRUE else stop(paste("TrackHub", x@hubUrl, "does not exists")) } status } dropCookie <- function(object) { object@hguid <- character() object } stopIfTableEmpty <- function(object) { if (is.null(object@table)) stop("'table' is a mandatory value and must be a single string, Use tableName()<- to set it") } setGeneric("hubUrl", function(x) standardGeneric("hubUrl")) setGeneric("hubUrl<-", function(x,value) standardGeneric("hubUrl<-")) setMethod("hubUrl", "UCSCTableQuery", function(x) x@hubUrl) setReplaceMethod("hubUrl", "UCSCTableQuery", function(x, value) { x@hubUrl <- value x }) ## gets the track names available from the table browser ucscTableTracks <- function(genome) { url <- "https://genome.ucsc.edu/cgi-bin/hgTables" doc <- rtracklayerGET(url, query = list(db=genome, hgta_group="allTracks")) label_path <- "//select[@name = 'hgta_track']/option/text()" labels <- sub("\n.*$", "", sapply(getNodeSet(doc, label_path), xmlValue)) track_path <- "//select[@name = 'hgta_track']/option/@value" tracks <- unlist(getNodeSet(doc, track_path)) names(tracks) <- labels tracks } setMethod("trackNames", "UCSCTableQuery", function(object) { # .Defunct("tableNames", msg = "track is meaningless now you only go by the table") ucscTableTracks(object@genome) }) ## returns a character vector of table names for a given track name + range setGeneric("tableNames", function(object, ...) standardGeneric("tableNames")) setMethod("tableNames", "UCSCTableQuery", function(object, trackOnly = FALSE) { if (trackOnly) warning("track is meaningless now you only go by the table") genome <- object@genome if (!is.null(object@track)) { ucscTables(object@genome, object@track) } else if (isTrackHub(object)) { th <- TrackHub(object@hubUrl) names(th[[genome]]) } else { url <- RestUri(paste0(object@url, "hubApi")) response <- read(url$list$tracks, genome = genome, trackLeavesOnly = 1) names <- names(response[[genome]]) tables <- mapply(function(name, response) { if (!is.null(response$protectedData)) NULL else if (!is.null(response$table)) response$table else name }, names, response[[genome]]) Filter(Negate(is.null), tables) } }) setClass("UCSCSchema", representation(genome = "character", tableName = "character", rowCount = "integer"), contains = "DFrame") setMethod("genome", "UCSCSchema", function(x) { x@genome }) setMethod("tableName", "UCSCSchema", function(x) { x@tableName }) setMethod("nrow", "UCSCSchema", function(x) { x@rowCount }) setGeneric("ucscSchema", function(object, ...) standardGeneric("ucscSchema")) setMethod("ucscSchema", "UCSCTableQuery", function(object) { genome <- object@genome tableName <- tableName(object) stopifnot(isSingleString(tableName)) url <- RestUri(paste0(object@url, "hubApi")) response <- read(url$list$schema, genome = genome, track = tableName) rowCount <- as.integer(response[["itemCount"]]) listOfDf <- lapply(response[["columnTypes"]], function(x) { DataFrame(x$name, x$sqlType, x$jsonType, x$description) }) schemaDf <- do.call(rbind, listOfDf) names(schemaDf) <- c("field", "SQL.type", "JSON.type", "description") schema <- new("UCSCSchema", schemaDf, genome = genome, tableName = tableName, rowCount = rowCount) }) setMethod("show", "UCSCSchema", function(object) { if (!is.null(tableName(object))) cat("UCSCSchema table '", tableName(object), "' with ", object@rowCount, " rows and ", length(object@listData), " columns\n", sep = "") show(DataFrame(object)) }) setMethod("track", "UCSCSession", function(object, name, ...) { .Defunct(msg = "track is meaningless now you only go by the table") }) ## download a trackSet by name setMethod("track", "UCSCTableQuery", function(object) { stopIfTableEmpty(object) tables <- tableNames(object) table <- tableName(object) if (!is.null(table) && !(table %in% tables)) stop("Unknown table: '", table, "'. Valid table names: ", tables) if (isTrackHub(object)) { th <- TrackHub(object@hubUrl) thg <- TrackHubGenome(th, object@genome) if (length(object@range) == 1L) { start <- start(object@range) end <- end(object@range) seqname <- as.vector(seqnames(object@range)) which <- GRanges(seqname, IRanges(start, end)) track <- track(thg, table, which = which) } else track <- track(thg, table) track } else { table <- getTable(object) if (nrow(table) == 1000000) stop("Output is incomplete: ", "track may have more than 100,000 elements. ", "Try downloading the data via the UCSC FTP site.") # normalize column names names(table)[names(table) == "chromStart"] <- "start" names(table)[names(table) == "chromEnd"] <- "end" if(!"strand" %in% names(table)) { strand <- rep("*", dim(table)[1]) cbind(table,strand) } if (is.null(table[["chrom"]])) table[["chrom"]] <- as.character(seqnames(object@range)) # create GRange object output <- GRanges(seqnames = table[["chrom"]], ranges = IRanges(start = as.numeric(table[["start"]]), end = as.numeric(table[["end"]])), strand = table[["strand"]]) # remove used columns table[["chrom"]] <- table[["strand"]] <- table[["start"]] <- table[["end"]] <- NULL # add left columns to the GRange object elementMetadata(output) <- table genome(output) <- object@genome output } }) ## grab sequences for features in 'track' at 'range' ## setMethod("getSeq", "UCSCSession", ## function(object, range, table = "gold") ## { ## followup <- list(hgta_doGenomicDna = "get sequence", ## hgSeq.casing = "upper", ## hgSeq.repMasking = "lower") ## output <- ucscExport(object, range, "gold", table, "sequence", ## followup) ## con <- file() ## writeLines(output, con) ## set <- read.DNAStringSet(con, "fasta") ## close(con) ## set ## }) parseResponse <- function(response, tableName, chrom) { results <- response[[tableName]] if (is.null(results)) { return(as.data.frame(do.call(rbind, response[[chrom]]))) } if (is.null(names(results))) { df <- do.call(rbind.data.frame, results) } else { chromosomes <- names(results) listOfDf <- lapply(chromosomes, function(x) { do.call(rbind.data.frame, results[[x]]) }) df <- do.call(rbind, listOfDf) } rownames(df) <- NULL df } ## get a data.frame from a UCSC table ## think about taking specific columns setGeneric("getTable", function(object, ...) standardGeneric("getTable")) setMethod("getTable", "UCSCTableQuery", function(object) { stopIfTableEmpty(object) tableName <- tableName(object) genome <- object@genome query <- list(genome = genome, track = tableName) if (length(object@range) == 1L) { start <- start(object@range) end <- end(object@range) seqname <- as.vector(seqnames(object@range)) query <- c(query, chrom = seqname, start = start, end = end) } if (isTrackHub(object)) { th <- TrackHub(object@hubUrl) thg <- TrackHubGenome(th, genome) if (length(object@range) == 1L) { which <- GRanges(seqname, IRanges(start, end)) track <- track(thg, tableName, which = which) } else track <- track(thg, tableName) as.data.frame(track) } else { url <- RestUri(paste0(object@url, "hubApi")) response <- read(url$getData$track, query) seqnames <- as.character(seqnames(object@range)) output <- parseResponse(response, tableName, seqnames) NAMES <- names(object) if (!is.null(NAMES)) { # filter by NAMES if (is.null(output$name)) output <- output[output$frag %in% NAMES,] # as in some tables `frag` field is used instead of `name` else output <- output[output$name %in% NAMES,] rownames(output) <- seq(length=nrow(output)) } output } }) setMethod("getTable", "UCSCSession", function(object, name, range = base::range(object), table = NULL) { getTable(ucscTableQuery(object, range = range, table = table)) }) ## UCSC genome view setClass("UCSCView", representation(hgsid = "character", form = "list"), contains = "BrowserView") ## create a view for the given session, position and track visibility settings ## if 'tracks' is a character vector (but not a UCSCTrackModes instance) it is ## assumed to name the tracks that should be in the view. otherwise, an ## attempt is made to coerce it to a UCSCTrackModes instance. setMethod("browserView", "UCSCSession", function(object, range, track, imagewidth = 800, browse = TRUE, ...) { stopifnot(isTRUEorFALSE(browse)) form <- list() if (!missing(range)) { if (is(range, "IntegerRangesList")) range <- range[elementNROWS(range) > 0L] if (length(range) > 1) { ranges <- range views <- vector("list", length(ranges)) for (i in seq(length(ranges))) { range <- ranges[i] views[[i]] <- callGeneric() } return(BrowserViewList(views)) } range <- normGenomeRange(range, seqinfo(object)) form <- c(form, ucscForm(range)) } view <- new("UCSCView", session = object) ## new hgsid for each browser launch doc <- ucscGet(object, "gateway") hgsid <- sub(".*=", "", grep("hgsid=", getNodeSet(doc, "//a/@href"), value=TRUE)[1L]) view@hgsid <- as.character(hgsid) ## figure out track modes origModes <- modes <- ucscTrackModes(view) if (!missing(track)) { if (class(track) == "character") trackNames(modes) <- track else { userModes <- as(track, "UCSCTrackModes") modes[names(userModes)] <- userModes } } argModes <- ucscTrackModes(...) modes[names(argModes)] <- argModes modes <- modes[modes != origModes] form <- c(form, ucscForm(modes), ucscForm(view)) if (!missing(imagewidth)) form <- c(form, pix = imagewidth) if (browse) { ## launch a web browser ucscShow(object, "tracks", form) } view@form <- form ## save this view object@views$instances <- c(object@views$instances, view) view }) viewURL <- function(x) { urlForm(ucscURL(browserSession(x), "tracks"), x@form) } # every view has a "mode" (hide, dense, pack, squish, full) for each track ### FIXME: probably should be merged with ucscTracks ### Or just leave it; ucscTracks might become more complex, while we ### need a simple way to manipulate track modes. setClass("UCSCTrackModes", representation(labels = "character"), contains = "character") # get/set track modes to/from e.g. a view setGeneric("ucscTrackModes", function(object, ...) standardGeneric("ucscTrackModes")) # convenience constructor for track mode object setMethod("ucscTrackModes", "character", function(object, labels, hide = character(), dense = character(), pack = character(), squish = character(), full = character()) { object[hide] <- "hide" object[dense] <- "dense" object[pack] <- "pack" object[squish] <- "squish" object[full] <- "full" if (missing(labels)) labels <- names(object) new("UCSCTrackModes", object, labels = as.character(labels)) }) setMethod("ucscTrackModes", "missing", function(object, ...) ucscTrackModes(character(), ...)) setMethod("ucscTrackModes", "UCSCView", function(object) { ucscTrackModes(ucscTracks(object)) }) setMethod("ucscTrackModes", "UCSCSession", function(object) { ucscTrackModes(ucscTracks(object)) }) setGeneric("ucscTrackModes<-", function(object, value) standardGeneric("ucscTrackModes<-")) setReplaceMethod("ucscTrackModes", c("UCSCView", "UCSCTrackModes"), function(object, value) { # FIXME: needs to be more extensible browserView(object@session, range(object), value) }) setReplaceMethod("ucscTrackModes", c("UCSCView", "character"), function(object, value) { ucscTrackModes(object) <- ucscTrackModes(value) object }) ## subsetting UCSCTrackModes ## if not in ids, try labels resolveTrackIndex <- function(object, i) { if (is.character(i)) { missing <- !(i %in% names(object)) matching <- match(i[missing], object@labels) if (any(is.na(matching))) { unmatched <- i[missing][is.na(matching)] stop("Unknown track(s): ", paste(unmatched, collapse = ", ")) } i[missing] <- names(object)[matching] } i } setMethod("[", "UCSCTrackModes", function(x, i, j, ..., drop=FALSE) { vec <- x@.Data names(vec) <- names(x) names(x@labels) <- names(x) ind <- resolveTrackIndex(x, i) initialize(x, vec[ind], labels = x@labels[ind]) }) setReplaceMethod("[", "UCSCTrackModes", function(x, i, j, ..., value) { vec <- x@.Data names(vec) <- names(x) vec[resolveTrackIndex(x, i)] <- value x@.Data <- as.vector(vec) x }) # handle simple track show/hide setMethod("trackNames", "UCSCTrackModes", function(object) { visible <- object != "hide" tracks <- names(object)[visible] names(tracks) <- object@labels[visible] tracks }) setReplaceMethod("trackNames", "UCSCTrackModes", function(object, value) { value <- resolveTrackIndex(object, value) spec <- names(object) %in% value object[!spec] <- "hide" object[spec & object == "hide"] <- "full" object }) setMethod("trackNames", "UCSCView", function(object) { tracks <- ucscTracks(object) modes <- ucscTrackModes(tracks) tracks@ids[tracks@ids %in% trackNames(modes)] }) setReplaceMethod("trackNames", "UCSCView", function(object, value) { trackNames(ucscTrackModes(object)) <- value object }) setMethod("visible", "UCSCView", function(object) { modes <- ucscTrackModes(object) vis <- modes != "hide" names(vis) <- modes@labels vis }) setReplaceMethod("visible", "UCSCView", function(object, value) { modes <- ucscTrackModes(object) modes[value & modes == "hide"] <- "full" modes[!value] <- "hide" ucscTrackModes(object) <- modes object }) setMethod("range", "UCSCView", function(x, ..., na.rm) range(ucscCart(x))) setReplaceMethod("range", "UCSCView", function(x, value) { browserView(x@session, value, ucscTrackModes(x)) }) # only one view per session; a view is always active setMethod("activeView", "UCSCView", function(object) TRUE) # ucscTrackSet # visual properties are specified by a "track line" for UCSC setClass("TrackLine", representation(name = "character", description = "character", visibility = "character", color = "integer", priority = "numeric"), prototype(name = "R Track")) setMethod("show", "TrackLine", function(object) { cat(as(object, "character"), "\n") }) setClass("BasicTrackLine", representation(itemRgb = "logical", useScore = "logical", group = "character", db = "character", offset = "numeric", url = "character", htmlUrl = "character", colorByStrand = "matrix"), contains = "TrackLine") ucscPair <- function(key, value) paste(key, value, sep = "=") # to a text line setAs("TrackLine", "character", function(from) { checkString <- function(str, len) { ## These are more annoying than useful ## if (nchar(gsub("[a-zA-Z0-9_ ]", "", str))) ## warning("The string '", str, ## "' contains non-standard characters.") ## if (nchar(str) > len) { ## str <- substring(str, 1, len) ## warning("The string '", str, "' must be less than ", len, ## " characters; it has been truncated.") ## } if (regexpr(" ", str)[1] != -1) str <- paste("\"", str, "\"", sep="") str } str <- "track" name <- from@name if (length(name)) str <- paste(str, " name=", checkString(name, 15), sep="") desc <- from@description if (length(desc)) str <- paste(str, " description=", checkString(desc, 60), sep="") vis <- from@visibility if (length(vis)) str <- paste(str, " visibility=", vis, sep="") color <- from@color if (length(color)) str <- paste0(str, " color=\"", paste0(color, collapse=","), "\"") priority <- from@priority if (length(priority)) str <- paste(str, " priority=", priority, sep="") str }) setAs("BasicTrackLine", "character", function(from) { str <- as(as(from, "TrackLine"), "character") itemRgb <- from@itemRgb if (length(itemRgb)) str <- paste(str, " itemRgb=", if (itemRgb) "on" else "off", sep = "") useScore <- from@useScore if (length(useScore)) str <- paste(str, " useScore=", if (useScore) "1" else "0", sep = "") group <- from@group if (length(group)) str <- paste(str, " group=", group, sep="") db <- from@db if (length(db)) str <- paste(str, " db=", db, sep="") offset <- from@offset if (length(offset)) str <- paste(str, " offset=", offset, sep="") url <- from@url if (length(url)) str <- paste(str, " url=", "\"", url, "\"", sep="") htmlUrl <- from@htmlUrl if (length(htmlUrl)) str <- paste(str, " htmlUrl=", "\"", htmlUrl, "\"", sep="") colorByStrand <- from@colorByStrand if (length(colorByStrand)) { colors <- paste(colorByStrand[1,], colorByStrand[2,], colorByStrand[3,], sep = ",", collapse = " ") str <- paste(str, " colorByStrand=\"", colors, "\"", sep = "") } str }) ucscParsePairs <- function(str) { str <- sub("^[[:alpha:]]*[[:blank:]]", "", str) split <- as.character(read.table(sep = "=", comment.char = "", as.is = TRUE, strip.white = TRUE, text = str)) vals <- character(0) if (length(split)) { mixed <- tail(head(split, -1), -1) tags <- head(split, 1) vals <- tail(split, 1) if (length(mixed)) { tags <- c(tags, sub(".*[[:space:]]([[:alnum:]]*)$", "\\1", mixed)) vals <- c(sub("(.*)[[:space:]][[:alnum:]]*$", "\\1", mixed), vals) } names(vals) <- tags } vals } # from a text line setAs("character", "TrackLine", function(from) { line <- new("TrackLine") vals <- ucscParsePairs(from) if (!is.na(vals["name"])) line@name <- vals[["name"]] if (!is.na(vals["description"])) line@description <- vals[["description"]] if (!is.na(vals["visibility"])) line@visibility <- vals[["visibility"]] if (!is.na(vals["color"])) line@color <- as.integer(strsplit(vals[["color"]], ",")[[1]]) if (!is.na(vals["priority"])) line@priority <- as.numeric(vals[["priority"]]) line }) setAs("character", "BasicTrackLine", function(from) { line <- new("BasicTrackLine", as(from, "TrackLine")) vals <- ucscParsePairs(from) if (!is.na(vals["itemRgb"])) line@itemRgb <- tolower(vals[["itemRgb"]]) == "on" if (!is.na(vals["useScore"])) line@useScore <- vals[["useScore"]] == "1" if (!is.na(vals["group"])) line@group <- vals[["group"]] if (!is.na(vals["db"])) line@db <- vals[["db"]] if (!is.na(vals["offset"])) line@offset <- as.integer(vals[["offset"]]) if (!is.na(vals["url"])) line@url <- vals[["url"]] if (!is.na(vals["htmlUrl"])) line@htmlUrl <- vals[["htmlUrl"]] if (!is.na(vals["colorByStrand"])) { colorToken <- strsplit(strsplit(vals[["colorByStrand"]], " ")[[1]], ",") line@colorByStrand <- matrix(as.integer(unlist(colorToken)), nrow = 3) } line }) setClass("GraphTrackLine", representation(altColor = "integer", autoScale = "logical", alwaysZero = "logical", gridDefault = "logical", maxHeightPixels = "integer", graphType = "character", viewLimits = "numeric", yLineMark = "numeric", yLineOnOff = "logical", windowingFunction = "character", smoothingWindow = "numeric", type = "character"), contains = "TrackLine") setAs("GraphTrackLine", "character", function(from) { str <- as(as(from, "TrackLine"), "character") type <- if (from@type == "wig") "wiggle_0" else "bedGraph" str <- paste(str, " type=", type, sep = "") color <- from@altColor if (length(color)) str <- paste(str, " altColor=", paste(color, collapse=","), sep="") autoScale <- from@autoScale onoff <- function(x) if (x) "on" else "off" if (length(autoScale)) str <- paste(str, " autoScale=", onoff(autoScale), sep = "") alwaysZero <- from@alwaysZero if (length(alwaysZero)) str <- paste(str, " alwaysZero=", onoff(alwaysZero), sep = "") gridDefault <- from@gridDefault if (length(gridDefault)) str <- paste(str, " gridDefault=", onoff(gridDefault), sep = "") maxHeightPixels <- from@maxHeightPixels if (length(maxHeightPixels)) str <- paste(str, " maxHeightPixels=", paste(maxHeightPixels, collapse=":"), sep = "") graphType <- from@graphType if (length(graphType)) str <- paste(str, " graphType=", graphType, sep = "") viewLimits <- from@viewLimits if (length(viewLimits)) str <- paste(str, " viewLimits=", paste(viewLimits, collapse = ":"), sep = "") yLineMark <- from@yLineMark if (length(yLineMark)) str <- paste(str, " yLineMark=", yLineMark, sep = "") yLineOnOff <- from@yLineOnOff if (length(yLineOnOff)) str <- paste(str, " yLineOnOff=", onoff(yLineOnOff), sep = "") windowingFunction <- from@windowingFunction if (length(windowingFunction)) str <- paste(str, " windowingFunction=", windowingFunction, sep = "") smoothingWindow <- from@smoothingWindow if (length(smoothingWindow)) str <- paste(str, " smoothingWindow=", smoothingWindow, sep = "") str }) setAs("character", "GraphTrackLine", function(from) { line <- new("GraphTrackLine", as(from, "TrackLine")) vals <- ucscParsePairs(from) type <- vals[["type"]] if (!(type %in% c("wiggle_0", "bedGraph"))) stop("Unknown graph track type: ", type) line@type <- if (type == "wiggle_0") "wig" else "bedGraph" if (!is.na(vals["altColor"])) line@altColor <- as.integer(strsplit(vals[["altColor"]], ",")[[1]]) if (!is.na(vals["autoScale"])) line@autoScale <- tolower(vals[["autoScale"]]) == "on" if (!is.na(vals["alwaysZero"])) line@alwaysZero <- tolower(vals[["alwaysZero"]]) == "on" if (!is.na(vals["gridDefault"])) line@gridDefault <- tolower(vals[["gridDefault"]]) == "on" if (!is.na(vals["maxHeightPixels"])) line@maxHeightPixels <- as.integer(strsplit(vals[["maxHeightPixels"]], ":")[[1]]) if (!is.na(vals["graphType"])) line@graphType <- vals[["graphType"]] if (!is.na(vals["viewLimits"])) line@viewLimits <- as.numeric(strsplit(vals[["viewLimits"]], ":")[[1]]) if (!is.na(vals["yLineMark"])) line@yLineMark <- as.numeric(vals[["yLineMark"]]) if (!is.na(vals["yLineOnOff"])) line@yLineOnOff <- tolower(vals[["yLineOnOff"]]) == "on" if (!is.na(vals["windowingFunction"])) line@windowingFunction <- vals[["windowingFunction"]] if (!is.na(vals["smoothingWindow"])) line@smoothingWindow <- as.numeric(vals[["smoothingWindow"]]) line }) setAs("BasicTrackLine", "GraphTrackLine", function(from) new("GraphTrackLine", from)) setAs("GraphTrackLine", "BasicTrackLine", function(from) new("BasicTrackLine", from)) setClass("UCSCData", representation(trackLine = "TrackLine"), prototype(trackLine = new("BasicTrackLine")), "GRanges") UCSCData <- function(ranges, trackLine = NULL) { ucsc <- as(ranges, "UCSCData") ucsc@trackLine <- trackLine ucsc } setMethod("show", "UCSCData", function(object) { if (!is.null(object@trackLine@name)) cat("UCSC track '", object@trackLine@name, "'\n", sep = "") callNextMethod() }) chooseGraphType <- function(from) { if (is(from, "GPos")) { return(if (is(from, "StitchedGPos")) "bedGraph" else "wig") } r <- ranges(from) type <- "bedGraph" ## decide whether compression is a good idea steps <- diff(sort(start(r))) if (length(unique(width(r))) == 1L && # all spans must be the same for WIG (length(unique(steps)) == 1L || # fixed-step makes sense ((3L * length(unique(width(r)))) < length(r) && # makes sense wrt size mean(steps) < 100))) # dense enough for UCSC efficiency type <- "wig" type } setAs("GRanges", "UCSCData", function(from) { line <- metadata(from)$trackLine if (is.null(line)) { if (is.numeric(score(from))) { # have numbers, let's plot them type <- chooseGraphType(from) line <- new("GraphTrackLine", type = type) } else { line <- new("BasicTrackLine") db <- unique(genome(from)) if (length(db) == 1 && !is.na(db)) line@db <- db } } else { metadata(from)$trackLine <- NULL } new("UCSCData", as(from, "GRanges"), trackLine = line) }) ## We want 'as(UCSCData, "GRanges", strict=FALSE)' to do the right thing (i.e. ## be a no-op) but as() won't do that if a coerce,UCSCData,GRanges method ## exists (this is a serious flaw in as() current design/implementation). ## The workaround is to support the 'strict=FALSE' case at the level of ## the coerce() method but setAs() doesn't let us do that so we use ## setMethod("coerce", ...) to define the method. setMethod("coerce", c("UCSCData", "GRanges"), function(from, to="GRanges", strict=TRUE) { if (strict) { gr <- new("GRanges") for (what in slotNames(gr)) slot(gr, what) <- slot(from, what) metadata(gr)$trackLine <- from@trackLine gr } else from }) splitUCSCData <- function(x, f, drop=FALSE, ...) { GRangesList( lapply(split(seq_along(x), f, drop=drop, ...), function(i) x[i]), compress=FALSE ) } setMethod("split", "UCSCData", splitUCSCData) setMethod("split", c("UCSCData", "Vector"), splitUCSCData) setClass("UCSCFile", contains = "BiocFile") UCSCFile <- function(resource) { new("UCSCFile", resource = resource) } ## the 'ucsc' format is a meta format with a track line followed by ## features formatted as 'wig', 'bed', 'bed15', 'bedGraph', 'gff', or ## really any text track format. setGeneric("export.ucsc", function(object, con, ...) standardGeneric("export.ucsc")) setMethod("export.ucsc", c("ANY", "BiocFile"), function(object, con, subformat = "auto", ...) { if (subformat == "auto" && !is(con, "UCSCFile")) subformat <- fileFormat(con) export(object, UCSCFile(resource(con)), subformat=subformat, ...) }) setMethod("export.ucsc", c("ANY", "ANY"), function(object, con, ...) { export(object, con, "ucsc", ...) }) .export_SimpleGRangesList_BiocFile <- function(object, con, format, ...) { export(object, UCSCFile(resource(con)), subformat = fileFormat(con), ...) } setMethod("export", c("GRangesList", "UCSCFile"), function(object, con, format, append = FALSE, index = FALSE, ...) { if (isTRUE(index) && length(object) > 1) stop("Cannot index multiple tracks in a single file") trackNames <- names(object) if (is.null(trackNames)) trackNames <- paste("R Track", seq_len(length(object))) ucsc <- unlist(lapply(object, is, "UCSCData")) lines <- unlist(lapply(object[ucsc], slot, "trackLine")) trackNames[ucsc] <- as.character(sapply(lines, slot, "name")) tracks <- vector("list", length(object)) for (i in seq_len(length(object))) { tracks[[i]] <- export(object[[i]], con, name = trackNames[i], append = append, index = index, ...) append <- TRUE } BiocFileList(tracks) }) trackLineClass <- function(subformat) { subformat <- tolower(subformat) if (subformat == "wig" || subformat == "bedgraph") "GraphTrackLine" else if (subformat == "bed15") "Bed15TrackLine" else "BasicTrackLine" } setMethod("fileFormat", "TrackLine", function(x) "bed") setMethod("fileFormat", "GraphTrackLine", function(x) x@type) setMethod("bestFileFormat", c("UCSCData", "ANY"), function(x, dest) { fileFormat(x@trackLine) }) setMethod("export", c("ANY", "UCSCFile"), function(object, con, format, ...) { cl <- class(object) track <- try(as(object, "GRanges"), silent = TRUE) if (class(track) == "try-error") { track <- try(as(object, "SimpleGRangesList"), silent = TRUE) if (is(track, "try-error")) stop("cannot export object of class '", cl, "': ", track) } object <- track callGeneric() }) setMethod("export", c("GenomicRanges", "UCSCFile"), function(object, con, format, ...) { object <- as(object, "UCSCData") callGeneric() }) setMethod("export", c("UCSCData", "UCSCFile"), function(object, con, format, subformat = "auto", append = FALSE, index = FALSE, ...) { auto <- FALSE if (subformat == "auto") { auto <- TRUE subformat <- bestFileFormat(object, con) } graphFormat <- tolower(subformat) %in% c("wig", "bedgraph") if (graphFormat) { strand <- as.character(strand(object)) strand[is.na(strand)] <- "NA" isStrandDisjoint <- function(track) { all(tapply(ranges(track), seqnames(track), function(r) { isDisjoint(r) && all(width(r) > 0) }), na.rm=TRUE) } if (!all(unlist(lapply(split(object, strand), isStrandDisjoint)))) { if (auto) { subformat <- "bed" graphFormat <- FALSE } else stop("Track not compatible with WIG/bedGraph: ", "Overlapping features must be on separate strands", " and every feature width must be positive") } } lineClass <- trackLineClass(subformat) if (!is(object@trackLine, lineClass)) object@trackLine <- as(object@trackLine, lineClass) if (is(object@trackLine, "GraphTrackLine")) object@trackLine@type <- subformat args <- list(...) lineArgs <- names(args) %in% slotNames(lineClass) for (argName in names(args)[lineArgs]) slot(object@trackLine, argName) <- args[[argName]] if (is(object@trackLine, "BasicTrackLine") && length(object@trackLine@offset)) ranges(object) <- shift(ranges(object), -object@trackLine@offset) trackLine <- NULL if (graphFormat) { strand <- as.character(strand(object)) strand[is.na(strand)] <- "NA" if (!all(strand[1] == strand)) { nameMap <- c("+" = "p", "-" = "m", "NA" = "NA") strand <- factor(strand) name <- paste(object@trackLine@name, nameMap[levels(strand)]) tracks <- split(object, strand) export(tracks, con, subformat, append, trackNames = name, ...) return() } } else if (subformat == "bed15") { if (is.null(object@trackLine@expNames)) object@trackLine@expNames <- colnames(object) trackLine <- object@trackLine } file <- con m <- manager() con <- connection(m, con, if (append) "a" else "w") cat(as(object@trackLine, "character"), "\n", file=con, sep = "") do.call(export, c(list(as(object, "GRanges"), con, subformat), args[!lineArgs], trackLine = trackLine)) release(m, con) if (index) indexTrack(FileForFormat(resource(file), subformat), skip = 1L) else invisible(file) }) setGeneric("import.ucsc", function(con, ...) standardGeneric("import.ucsc")) setMethod("import.ucsc", "ANY", function(con, ...) { import(con, "ucsc", ...) }) setMethod("import.ucsc", "BiocFile", function(con, subformat = "auto", ...) { if (!is(con, "UCSCFile")) { format <- fileFormat(con) if (subformat != "auto" && format != subformat) stop("Attempt to import '", class(con), "' as ", subformat) subformat <- format } import.ucsc(resource(con), subformat = subformat, ...) }) parseFormatFromTrackLine <- function(x) { if (!grepl("type=", x)) NULL else { type <- sub(".*type=\"(.*?)\".*", "\\1", x) if (type == "array") "bed15" else if (type == "wiggle_0") "wig" else type } } setMethod("import", "UCSCFile", function(con, format, text, subformat = "auto", drop = FALSE, genome = NA, ...) { lines <- readLines(resource(con), warn = FALSE) tracks <- grep("^track", lines) trackLines <- lines[tracks] starts <- tracks + 1L ends <- c(tail(tracks, -1) - 1L, length(lines)) makeTrackSet <- function(i) { if (subformat == "auto") { subformat <- parseFormatFromTrackLine(trackLines[i]) if (is.null(subformat)) { p <- resourceDescription(con) subformat <- file_ext(p) } } line <- as(trackLines[i], trackLineClass(subformat)) if (starts[i] <= ends[i]) { text <- window(lines, starts[i], ends[i]) } else { text <- character() } if (is.na(genome) && is(line, "BasicTrackLine") && length(line@db)) genome <- line@db if (subformat == "bed15") { # need to pass track line ucsc <- import(format = "bed15", text = text, trackLine = line, genome = genome, ...) } else { ucsc <- import(format = subformat, text = text, genome = genome, ...) } if (is(line, "BasicTrackLine") && length(line@offset)) ranges(ucsc) <- shift(ranges(ucsc), line@offset) ucsc <- as(ucsc, "UCSCData", FALSE) ucsc@trackLine <- line ucsc } tsets <- lapply(seq_along(trackLines), makeTrackSet) trackNames <- sapply(tsets, function(x) x@trackLine@name) if (!any(is.na(trackNames))) names(tsets) <- trackNames if (drop && length(tsets) == 1) return(tsets[[1]]) GRangesList(tsets, compress=FALSE) }) setMethod("login", "UCSCSession", function(x, username, password) { ucscPost(x, "hgLogin", list(hgLogin.do.displayLogin = "Login", hgLogin_userName = username, hgLogin_password = password)) }) setMethod("saveView", "UCSCView", function(x, name, username, password, share = TRUE) { if (!missing(username)) login(browserSession(x), username, password) ucscPost(x, "hgSession", list(hgS_newSessionName = name, hgS_newSessionShare = if (share) "on" else "off")) }) setMethod("restoreView", "UCSCSession", function(x, name, username, password) { if (!missing(username)) login(x, username, password) ucscPost(x, "hgSession", setNames(list("use"), paste0("hgS_load_", name))) }) ############ INTERNAL API ############ ## every cgi variable is stored in the 'cart' setClass("ucscCart", contains = "character") setGeneric("ucscCart", function(object, ...) standardGeneric("ucscCart")) setMethod("ucscCart", "UCSCSession", function(object, form = ucscForm(activeView(object))) { node <- ucscGet(object, "cart", form) raw <- xmlValue(getNodeSet(node, "//pre/text()")[[1]]) lines <- strsplit(raw, "\n")[[1]] fields <- strsplit(lines, " ") pairs <- fields[sapply(fields, length) == 2] mat <- matrix(unlist(pairs), nrow = 2) vals <- mat[2,] names(vals) <- mat[1,] vals[["db"]] <- sub(".*_", "", vals[["db"]]) new("ucscCart", vals) }) setMethod("ucscCart", "UCSCView", function(object) { ucscCart(object@session, ucscForm(object)) }) setMethod("genome", "ucscCart", function(x) x[["db"]]) setMethod("range", "ucscCart", function(x, ..., na.rm) { pos <- x["position"] posSplit <- strsplit(pos, ":")[[1]] range <- as.numeric(gsub(",", "", strsplit(posSplit[2], "-")[[1]])) GRangesForUCSCGenome(x[["db"]], posSplit[1], IRanges(range[1], range[2])) }) ### track information setClass("ucscTracks", representation(ids = "character", modes = "character")) setGeneric("ucscTracks", function(object, ...) standardGeneric("ucscTracks")) setMethod("ucscTracks", "UCSCSession", function(object, form = list(pix=800)) { tracks <- ucscGet(object, "tracks", form) nodes <- getNodeSet(tracks, "//select/option[@selected]/text()") trackModes <- sapply(nodes, xmlValue) nodes <- getNodeSet(tracks, "//select/@name") trackIds <- unlist(nodes) ##trackIds <- sapply(nodes, xmlValue) nodes <- getNodeSet(tracks, "//select/../a[not(@class='pennantIconText')]/text()") nms <- sapply(nodes, xmlValue) names(trackIds) <- sub("^ ", "", nms) new("ucscTracks", ids = trackIds, modes = trackModes) }) setMethod("ucscTracks", "UCSCView", function(object) { ucscTracks(object@session, ucscForm(object)) }) setMethod("ucscTrackModes", "ucscTracks", function(object) { modes <- object@modes labels <- names(object@ids) names(modes) <- object@ids ucscTrackModes(modes, labels) }) ucscGenomes <- function(organism=FALSE) { stopifnot(isTRUEorFALSE(organism)) names <- c("db", "species", "date", "name", "organism") url <- RestUri("https://api.genome.ucsc.edu/") response <- read(url$list$ucscGenomes) genomes <- response[[5]] genomeNames <- names(genomes) listOfDf <- Map(function(name, x) { date <- sub("\\s*\\([^\\)]+\\)", "", x$description) data.frame(name, x$genome, date, x$sourceName, x$scientificName) }, genomeNames, genomes) df <- do.call(rbind, listOfDf) names(df) <- names rownames(df) <- NULL if (!organism) df$organism <- NULL df } # form creation setGeneric("ucscForm", function(object, ...) standardGeneric("ucscForm")) setMethod("ucscForm", "IntegerRangesList", function(object) { form <- list() genome <- singleGenome(genome(object)) if (!is.na(genome)) form <- c(form, db = genome) chrom <- space(object) if (!is.null(chrom)) { if (!length(chrom)) chrom <- levels(chrom)[1] scipen <- getOption("scipen") options(scipen = 100) # prevent use of scientific notation on.exit(options(scipen = scipen)) position <- chrom if (length(unlist(start(object)))) position <- paste(chrom, ":", unlist(start(object)), "-", unlist(end(object)), sep = "") form <- c(form, position = position) } form }) setMethod("ucscForm", "GRanges", function(object) { scipen <- getOption("scipen") options(scipen = 100) # prevent use of scientific notation on.exit(options(scipen = scipen)) form <- list() genome <- singleGenome(genome(object)) if (!is.na(genome)) form <- c(form, db = genome) if (length(object) > 0L) { object <- object[1] c(form, position = paste(seqnames(object), ":", unlist(start(object)), "-", unlist(end(object)), sep = "")) } else form }) setMethod("ucscForm", "UCSCTrackModes", function(object) { as.list(object) }) setMethod("ucscForm", "UCSCView", function(object) { if (length(object@hgsid)) list(hgsid = as.character(object@hgsid)) else list() }) setOldClass("form_file") setMethod("ucscForm", "form_file", function(object, genome = NA_character_, ...) { form <- list(Submit = "Submit", hgt.customFile = object) if (!is.na(genome)) form <- c(form, db = genome) form }) setMethod("ucscForm", "SimpleGRangesList", function(object, format, ...) { path <- tempfile() export(object, path, format = "ucsc", subformat = format, ...) upload <- upload_file(path, type = "text/plain") genome <- singleGenome(genome(object)) ucscForm(upload, genome) }) setMethod("ucscForm", "BiocFile", function(object, genome, ...) { upload <- upload_file(path(object), type = "text/plain") ucscForm(upload, genome) }) setMethod("ucscForm", "NULL", function(object) list()) # Transforming to a cookie string setGeneric("ucscCookie", function(object, ...) standardGeneric("ucscCookie")) setMethod("ucscCookie", "UCSCSession", function(object) { object@hguid }) # HTTP wrappers # URL constants for UCSC ucscURLTable <- c(gateway = "hgGateway", tracks = "hgTracks", custom = "hgCustom", tables = "hgTables", cart = "cartDump") ucscURL <- function(object, key, force=TRUE) { path <- ucscURLTable[key] if (is.na(path)) stop("Key '", key, "' does not match a known URL") if (force && key == "gateway") { path <- paste0(path, '?redirect="manual"') } paste(object@url, path, sep="") } # convenience wrappers for _initialized_ sessions ucscShow <- function(object, key, .form = list(), ...) httpShow(ucscURL(object, key), .form, ...) ucscPost <- function(object, key, .form = list()) { cookies <- set_cookies(hguid=gsub("^hguid=", "", ucscCookie(object))) rtracklayerPOST(ucscURL(object, key), cookies, body = .form) } ucscGet <- function(object, key, .form = list()) { cookies <- set_cookies(hguid=gsub("^hguid=", "", ucscCookie(object))) rtracklayerGET(ucscURL(object, key), cookies, query = .form) } rtracklayer/R/utils.R0000644000175100017510000000075214614231172015606 0ustar00biocbuildbiocbuild### ========================================================================= ### Utilities ### ------------------------------------------------------------------------- pasteCollapse <- function(x, collapse = ",") { if (!is(x, "CharacterList")) stop("'x' must be a CharacterList") if (!isSingleString(collapse) || nchar(collapse) != 1L) stop("'collapse' must be a single string, with a single character") x <- as.list(x) .Call(CharacterList_pasteCollapse, x, collapse) } rtracklayer/R/web.R0000644000175100017510000000564614614231172015232 0ustar00biocbuildbiocbuildhtmlErrorHandler <- function(msg, code, domain, line, col, level, filename) { if (!length(level)) stop("Unknown HTML parse error") if (level > 2) stop("Failed to Parse HTML [", line, ":", col, "]: ", msg) } htmlParse <- function(str) suppressWarnings(htmlTreeParse(str, asText = TRUE, useInternalNodes = TRUE, error = htmlErrorHandler)) rtracklayerGET <- function(url, ..., query = list()) { verbose <- getOption("rtracklayer.http.verbose", FALSE) verbose <- as.integer(isTRUE(as.logical(verbose))) response <- GET(url, user_agent("rtracklayer"), config(verbose = verbose), ..., query = as.list(query)) htmlParse(content(response, as="text")) } rtracklayerPOST <- function(url, ..., body = list()) { verbose <- getOption("rtracklayer.http.verbose", FALSE) verbose <- as.integer(isTRUE(as.logical(verbose))) response <- POST(url, user_agent("rtracklayer"), config(verbose = verbose), ..., body = as.list(body)) htmlParse(content(response, as = "text")) } httpShow <- function(url, .form = list(), ...) browseURL(urlForm(url, .form, ...)) urlForm <- function(url, .form = list(), ...) { values <- urlEncode(as.character(c(.form, ...))) query <- paste(names(.form), values, sep = "=", collapse = "&") paste(url, query, sep = "?") } # differs from URLencode (vectorized, only encodes specified chars) urlEncode <- function(str, chars = "-a-zA-Z0-9$_.+!*'(),", keep = TRUE) { str <- as.character(str) bad <- chars if (keep) bad <- gsub(paste("[", chars, "]", sep=""), "", str) bad <- unique(unlist(strsplit(bad, ""))) code <- paste("%", charToRaw(paste(bad, collapse="")), sep="") for (i in seq_along(bad)) str <- gsub(bad[i], code[i], str, fixed = TRUE) str } urlDecode <- function(str, na.strings="NA") { ans <- curl_unescape(str) if (!identical(na.strings, "NA")) ans[is.na(str)] <- na.strings ans } expandPath <- function(x) { if (startsWith(x, "http") || startsWith(x, "ftp")) expandURL(x) else path.expand(x) } expandURL <- function(uri) { if(HEAD(uri)$status_code != 200L) return(uri) else { #opts <- list( # followlocation = TRUE, # resolve redirects # ssl.verifyhost = FALSE, # suppress certain SSL errors # ssl.verifypeer = FALSE, # nobody = TRUE, # perform HEAD request # verbose = FALSE # ) #curlhandle <- getCurlHandle(.opts = opts) #getURL(uri, curl = curlhandle) #info <- getCurlInfo(curlhandle) #info$effective.url config <- list(followlocation = 1, ssl_verifyhost = 0, ssl_verifypeer = 0, nobody = 1, verbose = 0) ## nobody = 1 seems to be ignored and HEAD() doesn't work here GET(uri, config)$url } } rtracklayer/R/wig.R0000644000175100017510000002176014614231172015236 0ustar00biocbuildbiocbuild### ========================================================================= ### WIG (Wiggle) support (fixedStep and variableStep, legacy bedGraph) ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Classes ### setClass("WIGFile", contains = "BiocFile") WIGFile <- function(resource) { new("WIGFile", resource = resource) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export ### setGeneric("export.wig", function(object, con, ...) standardGeneric("export.wig")) setMethod("export.wig", "ANY", function(object, con, ...) { export(object, con, "wig", ...) }) setMethod("export", c("ANY", "WIGFile"), function(object, con, ...) { cl <- class(object) track <- try(as(object, "GRanges"), silent = TRUE) if (class(track) == "try-error") { track <- try(as(object, "SimpleGRangesList"), silent = TRUE) if (is(track, "try-error")) stop("cannot export object of class '", cl, "': ", track) } export(track, con, ...) }) .wigWriter <- function(chromData, con, dataFormat, append) { m <- manager() con <- connection(m, con, if (append) "a" else "w") on.exit(release(m, con)) cat(dataFormat, file = con) cat(" chrom=", as.character(seqnames(chromData)[1]), file = con, sep = "") data <- score(chromData) starts <- start(chromData) if (dataFormat == "variableStep") data <- cbind(starts, data) else { cat(" start=", starts[1], file = con, sep = "") step <- if (length(starts) == 1) 0 else starts[2] - starts[1] cat(" step=", step, file = con, sep = "") } cat(" span=", width(chromData)[1], file = con, sep = "") cat("\n", file = con, sep = "") write.table(data, con, sep = "\t", col.names = FALSE, row.names = FALSE, quote = FALSE) } isValidScore <- function(score) { !(is.numeric(score) || is(score, "Rle") && is.numeric(runValue(score))) || any(is.na(score)) } setMethod("export", c("GenomicRanges", "WIGFile"), function(object, con, format, dataFormat = c("auto", "variableStep", "fixedStep"), writer = .wigWriter, append = FALSE, ...) { if (!missing(format)) checkArgFormat(con, format) if (isValidScore(score(object))) stop("The score must be numeric, without any NA's") scipen <- getOption("scipen") options(scipen = 100) # prevent use of scientific notation on.exit(options(scipen = scipen)) dataFormat <- match.arg(dataFormat) doBlock <- function(chromData) { if (length(chromData) == 0L) return() if (is.unsorted(start(chromData))) chromData <- chromData[order(start(chromData)),] starts <- start(chromData) ends <- end(chromData) if (!all(tail(starts, -1) - head(ends, -1) > 0)) stop("Features cannot overlap. ", "Note that WIG does not distinguish between strands - ", "try exporting two tracks, one for each strand.") if (length(starts) == 1) steps <- 0 else steps <- diff(starts) fixedSpan <- is(object, "GPos") || { spans <- ends - starts + 1L all(spans[1L] == spans) } if (!fixedSpan) stop("The span must be uniform for Wiggle export. ", "Consider exporting to bedGraph/bigWig, ", "or coerce data to a GPos object first.") fixedStep <- all(steps[1] == steps) if (dataFormat == "auto") { dataFormat <- "variableStep" if (fixedStep) dataFormat <- "fixedStep" } if (dataFormat != "variableStep" && !fixedStep) stop("Step not uniform: consider variableStep") ans <- writer(chromData, con, dataFormat, append) append <<- TRUE ans } dataFormat <- match.arg(dataFormat) lapply(split(object, seqnames(object)), doBlock) invisible(con) }) setMethod("export", c("UCSCData", "WIGFile"), function(object, con, format, trackLine = TRUE, ...) { if (!missing(format)) checkArgFormat(con, format) if (trackLine) { export.ucsc(object, con, ...) } else { callNextMethod() } invisible(con) }) setMethod("export", c("SimpleGRangesList", "WIGFile"), .export_SimpleGRangesList_BiocFile) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Import ### setGeneric("import.wig", function(con, ...) standardGeneric("import.wig")) setMethod("import.wig", "ANY", function(con, ...) { import(con, "wig", ...) }) setMethod("import", "WIGFile", function(con, format, text, genome = NA, trackLine = TRUE, which = NULL, seqinfo = NULL, ...) { if (!missing(format)) checkArgFormat(con, format) file <- con m <- manager() con <- connection(m, con, "r") on.exit(release(m, con)) ## check for a track line line <- scanTrackLine(con) if (!is.null(line) && trackLine) { pushBack(line, con) return(import.ucsc(initialize(file, resource = con), drop = TRUE, trackLine = FALSE, genome = genome, which = which, seqinfo = seqinfo, ...)) } lines <- readLines(con, warn = FALSE) formatInds <- grep("chrom=", lines, fixed=TRUE) formatLines <- lines[formatInds] starts <- formatInds + 1L ends <- c(tail(formatInds, -1) - 1L, length(lines)) format <- gsub("^([^ ]*) .*", "\\1", formatLines) parsedFormat <- lapply(formatLines, ucscParsePairs) chrom <- sapply(parsedFormat, `[[`, "chrom") if (is.null(seqinfo) && !is.null(genome) && !is.na(genome)) seqinfo <- seqinfoForGenome(genome) if (!is.null(seqinfo)) seqlevels <- seqlevels(seqinfo) else seqlevels <- unique(chrom) if (length(formatLines)) { parseData <- function(i) { ## parse format line formatVals <- parsedFormat[[i]] # parse the data values block_lines <- window(lines, starts[i], ends[i]) if (!length(block_lines)) { gr <- GRanges(score = numeric()) seqlevels(gr) <- seqlevels return(gr) } block_lines <- grep("^#", block_lines, invert = TRUE, value = TRUE) if (format[i] == "variableStep") { ## assume the same white space for every row sep <- sub(".*?([[:space:]]+).*", "\\1", block_lines[1]) split_lines <- strsplit(block_lines, sep, fixed=TRUE) mat <- matrix(as.numeric(unlist(split_lines)), nrow = 2) start <- mat[1,] score <- mat[2,] } else { start <- seq(as.integer(formatVals["start"]), by = as.integer(formatVals["step"]), length.out = length(block_lines)) score <- as.numeric(block_lines) } span <- formatVals["span"] if (is.na(span)) span <- 1 end <- start + as.integer(span) - 1 gd <- GenomicData(IRanges(start, end), score = score, chrom = formatVals[["chrom"]], which = which) seqlevels(gd) <- seqlevels gd } parseInds <- seq_along(formatInds) if (!is.null(which)) { message("For efficiency, consider converting this WIG file", " to a BigWig file;\nsee ?wigToBigWig") parseInds <- parseInds[chrom %in% seqlevels(which)] } resultList <- lapply(parseInds, parseData) gd <- do.call(c, resultList) if (!is.null(seqinfo)) seqinfo(gd) <- seqinfo else if (!is.null(genome)) genome(gd) <- genome gd } else { import(text = lines, format = "bedGraph", genome = genome, which = which, seqinfo = seqinfo) } }) rtracklayer/R/zzz.R0000644000175100017510000000041714614231172015301 0ustar00biocbuildbiocbuild.onUnload <- function(libpath) { library.dynam.unload("rtracklayer", libpath) } setUserUdcDir <- function() { dir <- paste0("/tmp/udcCache_", Sys.info()[["user"]]) .Call(R_setUserUdcDir, dir) } .onLoad <- function(libname, pkgname) { setUserUdcDir() } rtracklayer/src/0000755000175100017510000000000014614353501014706 5ustar00biocbuildbiocbuildrtracklayer/src/bbiHelper.c0000644000175100017510000000126014614231172016744 0ustar00biocbuildbiocbuild#include "ucsc/common.h" #include "ucsc/bbiFile.h" #include "bbiHelper.h" SEXP bbiSeqLengths(struct bbiFile *file) { struct bbiChromInfo *chromList = bbiChromList(file); struct bbiChromInfo *chrom = chromList; SEXP seqlengths, seqlengthNames; PROTECT(seqlengths = allocVector(INTSXP, slCount(chromList))); seqlengthNames = allocVector(STRSXP, length(seqlengths)); setAttrib(seqlengths, R_NamesSymbol, seqlengthNames); for(int i = 0; i < length(seqlengths); i++) { INTEGER(seqlengths)[i] = chrom->size; SET_STRING_ELT(seqlengthNames, i, mkChar(chrom->name)); chrom = chrom->next; } bbiChromInfoFreeList(&chromList); UNPROTECT(1); return seqlengths; } rtracklayer/src/bbiHelper.h0000644000175100017510000000025314614231172016752 0ustar00biocbuildbiocbuild#ifndef BBI_HELPER_H #define BBI_HELPER_H #include "ucsc/common.h" #include "ucsc/bbiFile.h" #include "rtracklayer.h" SEXP bbiSeqLengths(struct bbiFile *file); #endif rtracklayer/src/bigBed.c0000644000175100017510000004404414614231172016233 0ustar00biocbuildbiocbuild#include "ucsc/common.h" #include "ucsc/hash.h" #include "ucsc/bigBed.h" #include "ucsc/linefile.h" #include "ucsc/localmem.h" #include "bigBed.h" #include "handlers.h" #include "bbiHelper.h" #include "bigBedHelper.h" /* --- .Call ENTRY POINT --- */ SEXP BBDFile_seqlengths(SEXP r_filename) { pushRHandlers(); struct bbiFile *file = bigBedFileOpen((char *)CHAR(asChar(r_filename))); SEXP seqlengths = PROTECT(bbiSeqLengths(file)); bigBedFileClose(&file); popRHandlers(); UNPROTECT(1); return seqlengths; } /* --- .Call ENTRY POINT --- */ SEXP BBDFile_fieldnames(SEXP r_filename) { pushRHandlers(); struct bbiFile *file = bigBedFileOpen((char *)CHAR(asChar(r_filename))); char *asText = bigBedAutoSqlText(file); struct asObject *as = asParseText(asText); freeMem(asText); int fieldCount = file->fieldCount; int definedFieldCount = getDefinedFieldCount(as); bigBedFileClose(&file); char *names[] = {"name", "score", "thick", "itemRgb", "blocks"}; struct asColumn *asCol = as->columnList; SEXP defaultFields = PROTECT(allocVector(STRSXP, definedFieldCount)); SEXP extraFields = PROTECT(allocVector(STRSXP, fieldCount - definedFieldCount)); for (int i = 0; i < fieldCount; ++i) { if (i >= definedFieldCount) SET_STRING_ELT(extraFields, i - definedFieldCount, mkChar(asCol->name)); else if (i == 3) SET_STRING_ELT(defaultFields, i, mkChar(names[0])); else if (i == 4) SET_STRING_ELT(defaultFields, i, mkChar(names[1])); else if (i == 7) SET_STRING_ELT(defaultFields, i, mkChar(names[2])); else if (i == 8) SET_STRING_ELT(defaultFields, i, mkChar(names[3])); else if (i == 11) SET_STRING_ELT(defaultFields, i, mkChar(names[4])); asCol = asCol->next; } SEXP list = PROTECT(allocVector(VECSXP, 2)); SET_VECTOR_ELT(list, 0, defaultFields); SET_VECTOR_ELT(list, 1, extraFields); asObjectFree(&as); popRHandlers(); UNPROTECT(3); return list; } /* --- .Call ENTRY POINT --- */ SEXP BBDFile_query(SEXP r_filename, SEXP r_seqnames, SEXP r_ranges, SEXP r_defaultindex, SEXP r_extraindex) { pushRHandlers(); struct bbiFile *file = bigBedFileOpen((char *)CHAR(asChar(r_filename))); struct lm *lm = lmInit(0); int n_ranges = get_IRanges_length(r_ranges); int *start = INTEGER(get_IRanges_start(r_ranges)); int *width = INTEGER(get_IRanges_width(r_ranges)); SEXP ans, n_qhits, ranges, chromStart, chromWidth, name, score, strand = R_NilValue, thickStart, thickWidth, itemRgb, blocks, extraFields = R_NilValue, lengthIndex; n_qhits = PROTECT(allocVector(INTSXP, n_ranges)); struct bigBedInterval *hits = NULL, *tail = NULL; /* querying records in range */ for (int i = 0; i < n_ranges; ++i) { struct bigBedInterval *queryHits = bigBedIntervalQuery(file, (char *)CHAR(STRING_ELT(r_seqnames, i)), start[i] - 1, start[i] - 1 + width[i], 0, lm); if (!hits) { hits = queryHits; tail = slLastEl(hits); } else { tail->next = queryHits; tail = slLastEl(tail); } INTEGER(n_qhits)[i] = slCount(queryHits); } /* need these before closing file */ char *asText = bigBedAutoSqlText(file); struct asObject *as = asParseText(asText); freeMem(asText); int fieldCount = file->fieldCount; int definedFieldCount = getDefinedFieldCount(as); int extraFieldCount = fieldCount - definedFieldCount; int n_hits = slCount(hits); bigBedFileClose(&file); int presentFieldCount = 0, unprotectCount = 0; /* mandatory default field */ chromStart = PROTECT(allocVector(INTSXP, n_hits)); chromWidth = PROTECT(allocVector(INTSXP, n_hits)); /* if any of the default field is present and selected, allocate memory for it */ if (isPresent(definedFieldCount, i_name) && isSelected(r_defaultindex, 1)) { name = PROTECT(allocVector(STRSXP, n_hits)); ++presentFieldCount; ++unprotectCount; } if (isPresent(definedFieldCount, i_score) && isSelected(r_defaultindex, 2)) { score = PROTECT(allocVector(INTSXP, n_hits)); ++presentFieldCount; ++unprotectCount; } if (isPresent(definedFieldCount, i_strand)) { strand = PROTECT(allocVector(STRSXP, n_hits)); ++unprotectCount; } if (isPresent(definedFieldCount, i_thick) && isSelected(r_defaultindex, 3)) { thickStart = PROTECT(allocVector(INTSXP, n_hits)); thickWidth = PROTECT(allocVector(INTSXP, n_hits)); ++presentFieldCount; unprotectCount += 2; } if (isPresent(definedFieldCount, i_itemRgb) && isSelected(r_defaultindex, 4)) { itemRgb = PROTECT(allocVector(STRSXP, n_hits)); ++presentFieldCount; ++unprotectCount; } if (isPresent(definedFieldCount, i_blocks) && isSelected(r_defaultindex, 5)) { blocks = PROTECT(allocVector(VECSXP, n_hits)); ++presentFieldCount; ++unprotectCount; } SEXPTYPE *typeId; /* if extra fields are present and selected * identify the type information and allocate memory */ if (extraFieldCount > 0) { int k = 0; enum asTypes fieldType; struct asColumn *asCol = as->columnList; extraFields = PROTECT(allocVector(VECSXP, extraFieldCount)); typeId = (SEXPTYPE*)R_alloc(extraFieldCount, sizeof(SEXPTYPE)); for (int j = 0; j < fieldCount; ++j) { fieldType = asCol->lowType->type; if (j >= definedFieldCount) { if (asTypesIsFloating(fieldType) || fieldType == t_uint || fieldType == t_off) { typeId[k] = REALSXP; } else if (fieldType == t_int || fieldType == t_short || fieldType == t_ushort || fieldType == t_byte) { typeId[k] = INTSXP; } else if (fieldType == t_char || fieldType == t_string || fieldType == t_lstring) { typeId[k] = STRSXP; } else if (fieldType == t_ubyte) { typeId[k] = RAWSXP; } if (isSelected(r_extraindex, (j - definedFieldCount + 1))) { SEXP temp = PROTECT(allocVector(typeId[k], n_hits)); SET_VECTOR_ELT(extraFields, k, temp); ++unprotectCount; ++k; } } asCol = asCol->next; } lengthIndex = PROTECT(allocVector(INTSXP, extraFieldCount)); memset(INTEGER(lengthIndex), 0, sizeof(int) * extraFieldCount); unprotectCount += 2; } asObjectFree(&as); int count = 0, k = 0; char startBuf[16], endBuf[16], *row[fieldCount], rgbBuf[8]; for (int i = 0; i < n_hits; ++i, hits = hits->next, ++count) { if (INTEGER(n_qhits)[k] == count && k < n_ranges) { ++k; count = 0; } bigBedIntervalToRow(hits, (char *)CHAR(STRING_ELT(r_seqnames, k)), startBuf, endBuf, row, fieldCount); struct bed *bed = bedLoadN(row, definedFieldCount); /* mandatory default field */ INTEGER(chromStart)[i] = bed->chromStart; INTEGER(chromWidth)[i] = bed->chromEnd - bed->chromStart + 1; /* if any of the default field is present and selected, store its value */ if (isPresent(definedFieldCount, i_name) && isSelected(r_defaultindex, 1)) { SET_STRING_ELT(name, i, mkChar(bed->name)); } if (isPresent(definedFieldCount, i_score) && isSelected(r_defaultindex, 2)) { INTEGER(score)[i] = bed->score; } if (isPresent(definedFieldCount, i_strand)) { SET_STRING_ELT(strand, i, mkChar(bed->strand)); } if (isPresent(definedFieldCount, i_thick) && isSelected(r_defaultindex, 3)) { INTEGER(thickWidth)[i] = bed->thickEnd - bed->thickStart + 1; INTEGER(thickStart)[i] = bed->thickStart; } if (isPresent(definedFieldCount, i_itemRgb) && isSelected(r_defaultindex, 4)) { snprintf(rgbBuf, 8, "#%06x", bed->itemRgb); SET_STRING_ELT(itemRgb, i, mkChar(rgbBuf)); } if (isPresent(definedFieldCount, i_blocks) && isSelected(r_defaultindex, 5)) { SEXP bstart = PROTECT(allocVector(INTSXP, bed->blockCount)); SEXP bwidth = PROTECT(allocVector(INTSXP, bed->blockCount)); for (int j = 0; j< bed->blockCount; ++j) { INTEGER(bwidth)[j] = bed->blockSizes[j]; INTEGER(bstart)[j] = bed->chromStarts[j]; } SET_VECTOR_ELT(blocks, i, new_IRanges("IRanges", bstart, bwidth, R_NilValue)); UNPROTECT(2); } bedFree(&bed); /* if extra fields are present and selected store their values */ for (int j = definedFieldCount, efIndex = 0 ; j < fieldCount; ++j) { if (isSelected(r_extraindex, (j - definedFieldCount + 1))) { switch(typeId[efIndex]) { case REALSXP: REAL(VECTOR_ELT(extraFields, efIndex))[i] = sqlDouble(row[j]); break; case INTSXP: INTEGER(VECTOR_ELT(extraFields, efIndex))[i] = sqlSigned(row[j]); break; case STRSXP: { int index = INTEGER(lengthIndex)[efIndex]; SET_STRING_ELT(VECTOR_ELT(extraFields, efIndex), index, mkChar(row[j])); INTEGER(lengthIndex)[efIndex] = index + 1; break; } case RAWSXP: RAW(extraFields)[i] = sqlUnsigned(row[j]); break; } ++efIndex; } } freeMem(row[3]); } ranges = PROTECT(new_IRanges("IRanges", chromStart, chromWidth, R_NilValue)); ans = PROTECT(allocVector(VECSXP, presentFieldCount + 4)); int index = 0; SET_VECTOR_ELT(ans, index++, n_qhits); SET_VECTOR_ELT(ans, index++, extraFields); SET_VECTOR_ELT(ans, index++, ranges); SET_VECTOR_ELT(ans, index++, strand); if (isPresent(definedFieldCount, i_name) && isSelected(r_defaultindex, 1)) { SET_VECTOR_ELT(ans, index++, name); } if (isPresent(definedFieldCount, i_score) && isSelected(r_defaultindex, 2)) { SET_VECTOR_ELT(ans, index++, score); } if (isPresent(definedFieldCount, i_thick) && isSelected(r_defaultindex, 3)) { SET_VECTOR_ELT(ans, index++, new_IRanges("IRanges", thickStart, thickWidth, R_NilValue)); } if (isPresent(definedFieldCount, i_itemRgb) && isSelected(r_defaultindex, 4)) { SET_VECTOR_ELT(ans, index++, itemRgb); } if (isPresent(definedFieldCount, i_blocks) && isSelected(r_defaultindex, 5)) { SET_VECTOR_ELT(ans, index++, blocks); } UNPROTECT(5 + unprotectCount); lmCleanup(&lm); popRHandlers(); return ans; } static struct hash *createIntHash(SEXP v) { struct hash *hash = hashNew(0); SEXP names = getAttrib(v, R_NamesSymbol); for (int i = 0; i < length(v); ++i) hashAddInt(hash, (char *)CHAR(STRING_ELT(names, i)), INTEGER(v)[i]); return hash; } /* --- .Call ENTRY POINT --- */ SEXP BBDFile_write(SEXP r_seqlengths, SEXP r_bedString, SEXP r_autosql, SEXP r_indexfields, SEXP r_compress, SEXP r_outfile) { pushRHandlers(); int blockSize = 256; int itemsPerSlot = 512; char *bedString = cloneString((char *)CHAR(asChar(r_bedString))); struct lineFile *lf = lineFileOnString("text", TRUE, bedString); struct bbExIndexMaker *eim = NULL; bool doCompress = asLogical(r_compress); struct hash *lenHash = createIntHash(r_seqlengths); char *asText = (char *)CHAR(asChar(r_autosql)); struct asObject *as = asParseText(asText); bits16 fieldCount = slCount(as->columnList); bits16 definedFieldCount = getDefinedFieldCount(as); char *extraIndex = (char *)CHAR(asChar(r_indexfields)); struct slName *extraIndexList = slNameListFromString(extraIndex, ','); bits16 extraIndexCount = slCount(extraIndexList); if (extraIndexList != NULL) eim = bbExIndexMakerNew(extraIndexList, as); /* Do first pass, mostly just scanning file and counting hits per chromosome. */ int minDiff = 0; double aveSize = 0; bits64 bedCount = 0; bits32 uncompressBufSize = 0; struct bbiChromUsage *usageList = bbiChromUsageFromBedFile(lf, lenHash, eim, &minDiff, &aveSize, &bedCount); /* Open output file and write dummy header. */ FILE *f = mustOpen((char *)CHAR(asChar(r_outfile)), "wb"); bbiWriteDummyHeader(f); bbiWriteDummyZooms(f); /* Write out autoSql string */ bits64 asOffset = ftell(f); mustWrite(f, asText, strlen(asText) + 1); /* Write out dummy total summary. */ struct bbiSummaryElement totalSum; ZeroVar(&totalSum); bits64 totalSummaryOffset = ftell(f); bbiSummaryElementWrite(f, &totalSum); /* Write out dummy header extension */ bits64 extHeaderOffset = ftell(f); bits16 extHeaderSize = 64; repeatCharOut(f, 0, extHeaderSize); /* Write out extra index stuff if need be. */ bits64 extraIndexListOffset = 0; bits64 extraIndexListEndOffset = 0; if (extraIndexList != NULL) { extraIndexListOffset = ftell(f); int extraIndexSize = 16 + 4*1; /* Fixed record size 16, plus 1 times field size of 4 */ repeatCharOut(f, 0, extraIndexSize*extraIndexCount); extraIndexListEndOffset = ftell(f); } /* Write out chromosome/size database. */ bits64 chromTreeOffset = ftell(f); bbiWriteChromInfo(usageList, blockSize, f); /* Set up to keep track of possible initial reduction levels. */ int resScales[bbiMaxZoomLevels], resSizes[bbiMaxZoomLevels]; int resTryCount = bbiCalcResScalesAndSizes(aveSize, resScales, resSizes); /* Write out primary full resolution data in sections, collect stats to use for reductions. */ bits64 dataOffset = ftell(f); bits32 blockCount = 0; bits32 maxBlockSize = 0; struct bbiBoundsArray *boundsArray = NULL; writeOne(f, bedCount); if (bedCount > 0) { blockCount = bbiCountSectionsNeeded(usageList, itemsPerSlot); AllocArray(boundsArray, blockCount); freez(&bedString); bedString = cloneString((char *)CHAR(asChar(r_bedString))); lf = lineFileOnString("text", TRUE, bedString); if (eim) bbExIndexMakerAllocChunkArrays(eim, bedCount); writeBlocks(usageList, lf, as, itemsPerSlot, boundsArray, blockCount, doCompress, f, resTryCount, resScales, resSizes, eim, bedCount, fieldCount, definedFieldCount, &maxBlockSize); } /* Write out primary data index. */ bits64 indexOffset = ftell(f); cirTreeFileBulkIndexToOpenFile(boundsArray, sizeof(boundsArray[0]), blockCount, blockSize, 1, NULL, bbiBoundsArrayFetchKey, bbiBoundsArrayFetchOffset, indexOffset, f); freez(&boundsArray); /* Declare arrays and vars that track the zoom levels we actually output. */ bits32 zoomAmounts[bbiMaxZoomLevels]; bits64 zoomDataOffsets[bbiMaxZoomLevels]; bits64 zoomIndexOffsets[bbiMaxZoomLevels]; /* Call monster zoom maker library function that bedGraphToBigWig also uses. */ int zoomLevels = 0; if (bedCount > 0) { freez(&bedString); bedString = cloneString((char *)CHAR(asChar(r_bedString))); lf = lineFileOnString("text", TRUE, bedString); zoomLevels = bbiWriteZoomLevels(lf, f, blockSize, itemsPerSlot, bedWriteReducedOnceReturnReducedTwice, fieldCount, doCompress, indexOffset - dataOffset, usageList, resTryCount, resScales, resSizes, zoomAmounts, zoomDataOffsets, zoomIndexOffsets, &totalSum); } /* Write out extra indexes if need be. */ if (eim) { int i; for (i=0; i < eim->indexCount; ++i) { eim->fileOffsets[i] = ftell(f); maxBedNameSize = eim->maxFieldSize[i]; qsort(eim->chunkArrayArray[i], bedCount, sizeof(struct bbNamedFileChunk), bbNamedFileChunkCmpByName); assert(sizeof(struct bbNamedFileChunk) == sizeof(eim->chunkArrayArray[i][0])); bptFileBulkIndexToOpenFile(eim->chunkArrayArray[i], sizeof(eim->chunkArrayArray[i][0]), bedCount, blockSize, bbNamedFileChunkKey, maxBedNameSize, bbNamedFileChunkVal, sizeof(bits64) + sizeof(bits64), f); } } /* Figure out buffer size needed for uncompression if need be. */ if (doCompress) { int maxZoomUncompSize = itemsPerSlot * sizeof(struct bbiSummaryOnDisk); uncompressBufSize = max(maxBlockSize, maxZoomUncompSize); } /* Go back and rewrite header. */ rewind(f); bits32 sig = bigBedSig; bits16 version = bbiCurrentVersion; bits16 summaryCount = zoomLevels; bits32 reserved32 = 0; bits64 reserved64 = 0; /* Write fixed header */ writeOne(f, sig); writeOne(f, version); writeOne(f, summaryCount); writeOne(f, chromTreeOffset); writeOne(f, dataOffset); writeOne(f, indexOffset); writeOne(f, fieldCount); writeOne(f, definedFieldCount); writeOne(f, asOffset); writeOne(f, totalSummaryOffset); writeOne(f, uncompressBufSize); writeOne(f, extHeaderOffset); assert(ftell(f) == 64); /* Write summary headers with data. */ int i; for (i=0; ifileOffsets[i]); repeatCharOut(f, 0, 4); // reserved // Write out field list - easy this time because for now always only one field. bits16 fieldId = eim->indexFields[i]; writeOne(f, fieldId); repeatCharOut(f, 0, 2); // reserved } assert(ftell(f) == extraIndexListEndOffset); } /* Write end signature. */ fseek(f, 0L, SEEK_END); writeOne(f, sig); carefulClose(&f); freez(&bedString); freeHash(&lenHash); asObjectFree(&as); lineFileClose(&lf); bbiChromUsageFreeList(&usageList); popRHandlers(); return r_outfile; } rtracklayer/src/bigBed.h0000644000175100017510000000071214614231172016232 0ustar00biocbuildbiocbuild#ifndef BIG_BED_H #define BIG_BED_H #include "rtracklayer.h" /* The .Call entry points */ SEXP BBDFile_seqlengths(SEXP r_filename); SEXP BBDFile_fieldnames(SEXP r_filename); SEXP BBDFile_query(SEXP r_filename, SEXP r_seqnames, SEXP r_ranges, SEXP r_defaultindex, SEXP r_extraindex); SEXP BBDFile_write(SEXP r_seqlengths, SEXP r_bedString, SEXP r_autosql, SEXP r_indexfields, SEXP r_compress, SEXP r_outfile); #endif rtracklayer/src/bigBedHelper.c0000644000175100017510000003465214614231172017377 0ustar00biocbuildbiocbuild#include "bigBedHelper.h" /* Most of the functions in this file are taken from ucscGenomeBrowser/kent/src/utils/bedToBigBed.c */ int getDefinedFieldCount(struct asObject *as) { int definedFieldCount = 0; struct asColumn *asCol = as->columnList; char *asText = bedAsDef(12, 12); struct asObject *bedAs = asParseText(asText); freeMem(asText); struct asColumn *bedCol = bedAs->columnList; while (asCol && bedCol) { if (strncmp(asCol->name, bedCol->name, strlen(asCol->name)) == 0) ++definedFieldCount; bedCol = bedCol->next; asCol = asCol->next; } asObjectFree(&bedAs); return definedFieldCount; } bool isPresent(int definedFieldCount, int index) { return (definedFieldCount - index >= 0) ? TRUE : FALSE; } bool isSelected(SEXP r_selectedindex, int position) { if (length(r_selectedindex) == 0) return TRUE; for (int i = 0; i < length(r_selectedindex); ++i) { if(INTEGER(r_selectedindex)[i] == position) return TRUE; } return FALSE; } /* following functions are taken from the kent library */ struct rbTree *rangeTreeForBedChrom(struct lineFile *lf, char *chrom) /* Read lines from bed file as long as they match chrom. Return a rangeTree that * corresponds to the coverage. */ { struct rbTree *tree = rangeTreeNew(); char *line; while (lineFileNextReal(lf, &line)) { if (!startsWithWord(chrom, line)) { lineFileReuse(lf); break; } char *row[3]; chopLine(line, row); unsigned start = sqlUnsigned(row[1]); unsigned end = sqlUnsigned(row[2]); rangeTreeAddToCoverageDepth(tree, start, end); } return tree; } void bbExIndexMakerAddKeysFromRow(struct bbExIndexMaker *eim, char **row, int recordIx) /* Save the keys that are being indexed by row in eim. */ { int i; for (i=0; i < eim->indexCount; ++i) { int rowIx = eim->indexFields[i]; eim->chunkArrayArray[i][recordIx].name = cloneString(row[rowIx]); } } void bbExIndexMakerAddOffsetSize(struct bbExIndexMaker *eim, bits64 offset, bits64 size, long startIx, long endIx) /* Update offset and size fields of all file chunks between startIx and endIx */ { int i; for (i=0; i < eim->indexCount; ++i) { struct bbNamedFileChunk *chunks = eim->chunkArrayArray[i]; long j; for (j = startIx; j < endIx; ++j) { struct bbNamedFileChunk *chunk = chunks + j; chunk->offset = offset; chunk->size = size; } } } /* Allocate the big part of the extra index maker - the part that holds which * chunk is used for each record. */ void bbExIndexMakerAllocChunkArrays(struct bbExIndexMaker *eim, int recordCount) { eim->recordCount = recordCount; int i; for (i=0; i < eim->indexCount; ++i) AllocArray(eim->chunkArrayArray[i], recordCount); } /* Return an index maker corresponding to extraIndexList. Checks that all fields * mentioned are in autoSql definition, and for now that they are all text fields. */ struct bbExIndexMaker *bbExIndexMakerNew(struct slName *extraIndexList, struct asObject *as) { /* Fill in scalar fields and return quickly if no extra indexes. */ struct bbExIndexMaker *eim; AllocVar(eim); eim->indexCount = slCount(extraIndexList); if (eim->indexCount == 0) return eim; // Not much to do in this case /* Allocate arrays according field count. */ AllocArray(eim->indexFields, eim->indexCount); AllocArray(eim->maxFieldSize, eim->indexCount); AllocArray(eim->chunkArrayArray, eim->indexCount); AllocArray(eim->fileOffsets, eim->indexCount); /* Loop through each field checking that it is indeed something we can index * and if so saving information about it */ int indexIx = 0; struct slName *name; for (name = extraIndexList; name != NULL; name = name->next) { struct asColumn *col = asColumnFind(as, name->name); if (col == NULL) errAbort("extraIndex field %s not a standard bed field or found in autoSql string.", name->name); if (!sameString(col->lowType->name, "string")) errAbort("Sorry for now can only index string fields."); eim->indexFields[indexIx] = slIxFromElement(as->columnList, col); ++indexIx; } return eim; } /* Compare two named offset object to facilitate qsorting by name. */ int bbNamedFileChunkCmpByName(const void *va, const void *vb) { const struct bbNamedFileChunk *a = va, *b = vb; return strcmp(a->name, b->name); } /* Return pointer to val for bPlusTree maker. */ void *bbNamedFileChunkVal(const void *va) { const struct bbNamedFileChunk *item = va; return (void *)&item->offset; } /* Copy name to keyBuf for bPlusTree maker */ void bbNamedFileChunkKey(const void *va, char *keyBuf) { const struct bbNamedFileChunk *item = va; strncpy(keyBuf,item->name, maxBedNameSize); } struct bbiSummary *bedWriteReducedOnceReturnReducedTwice(struct bbiChromUsage *usageList, int fieldCount, struct lineFile *lf, bits32 initialReduction, bits32 initialReductionCount, int zoomIncrement, int blockSize, int itemsPerSlot, boolean doCompress, struct lm *lm, FILE *f, bits64 *retDataStart, bits64 *retIndexStart, struct bbiSummaryElement *totalSum) /* Write out data reduced by factor of initialReduction. Also calculate and keep in memory * next reduction level. This is more work than some ways, but it keeps us from having to * keep the first reduction entirely in memory. */ { struct bbiSummary *twiceReducedList = NULL; bits32 doubleReductionSize = initialReduction * zoomIncrement; struct bbiChromUsage *usage = usageList; struct bbiBoundsArray *boundsArray, *boundsPt, *boundsEnd; boundsPt = AllocArray(boundsArray, initialReductionCount); boundsEnd = boundsPt + initialReductionCount; *retDataStart = ftell(f); writeOne(f, initialReductionCount); /* This gets a little complicated I'm afraid. The strategy is to: * 1) Build up a range tree that represents coverage depth on that chromosome * This also has the nice side effect of getting rid of overlaps. * 2) Stream through the range tree, outputting the initial summary level and * further reducing. */ boolean firstTime = TRUE; struct bbiSumOutStream *stream = bbiSumOutStreamOpen(itemsPerSlot, f, doCompress); for (usage = usageList; usage != NULL; usage = usage->next) { struct bbiSummary oneSummary, *sum = NULL; struct rbTree *rangeTree = rangeTreeForBedChrom(lf, usage->name); struct range *range, *rangeList = rangeTreeList(rangeTree); for (range = rangeList; range != NULL; range = range->next) { /* Grab values we want from range. */ double val = ptToInt(range->val); int start = range->start; int end = range->end; bits32 size = end - start; /* Add to total summary. */ if (firstTime) { totalSum->validCount = size; totalSum->minVal = totalSum->maxVal = val; totalSum->sumData = val*size; totalSum->sumSquares = val*val*size; firstTime = FALSE; } else { totalSum->validCount += size; if (val < totalSum->minVal) totalSum->minVal = val; if (val > totalSum->maxVal) totalSum->maxVal = val; totalSum->sumData += val*size; totalSum->sumSquares += val*val*size; } /* If start past existing block then output it. */ if (sum != NULL && sum->end <= start && sum->end < usage->size) { bbiOutputOneSummaryFurtherReduce(sum, &twiceReducedList, doubleReductionSize, &boundsPt, boundsEnd, lm, stream); sum = NULL; } /* If don't have a summary we're working on now, make one. */ if (sum == NULL) { oneSummary.chromId = usage->id; oneSummary.start = start; oneSummary.end = start + initialReduction; if (oneSummary.end > usage->size) oneSummary.end = usage->size; oneSummary.minVal = oneSummary.maxVal = val; oneSummary.sumData = oneSummary.sumSquares = 0.0; oneSummary.validCount = 0; sum = &oneSummary; } /* Deal with case where might have to split an item between multiple summaries. This * loop handles all but the final affected summary in that case. */ while (end > sum->end) { /* Fold in bits that overlap with existing summary and output. */ int overlap = rangeIntersection(start, end, sum->start, sum->end); assert(overlap > 0); sum->validCount += overlap; if (sum->minVal > val) sum->minVal = val; if (sum->maxVal < val) sum->maxVal = val; sum->sumData += val * overlap; sum->sumSquares += val*val * overlap; bbiOutputOneSummaryFurtherReduce(sum, &twiceReducedList, doubleReductionSize, &boundsPt, boundsEnd, lm, stream); size -= overlap; /* Move summary to next part. */ sum->start = start = sum->end; sum->end = start + initialReduction; if (sum->end > usage->size) sum->end = usage->size; sum->minVal = sum->maxVal = val; sum->sumData = sum->sumSquares = 0.0; sum->validCount = 0; } /* Add to summary. */ sum->validCount += size; if (sum->minVal > val) sum->minVal = val; if (sum->maxVal < val) sum->maxVal = val; sum->sumData += val * size; sum->sumSquares += val*val * size; } if (sum != NULL) { bbiOutputOneSummaryFurtherReduce(sum, &twiceReducedList, doubleReductionSize, &boundsPt, boundsEnd, lm, stream); } rangeTreeFree(&rangeTree); } bbiSumOutStreamClose(&stream); /* Write out 1st zoom index. */ int indexOffset = *retIndexStart = ftell(f); assert(boundsPt == boundsEnd); cirTreeFileBulkIndexToOpenFile(boundsArray, sizeof(boundsArray[0]), initialReductionCount, blockSize, itemsPerSlot, NULL, bbiBoundsArrayFetchKey, bbiBoundsArrayFetchOffset, indexOffset, f); freez(&boundsArray); slReverse(&twiceReducedList); return twiceReducedList; } void writeBlocks(struct bbiChromUsage *usageList, struct lineFile *lf, struct asObject *as, int itemsPerSlot, struct bbiBoundsArray *bounds, int sectionCount, boolean doCompress, FILE *f, int resTryCount, int resScales[], int resSizes[], struct bbExIndexMaker *eim, int bedCount, bits16 fieldCount, int bedN, bits32 *retMaxBlockSize) /* Read through lf, writing it in f. Save starting points of blocks (every itemsPerSlot) * to boundsArray */ { int maxBlockSize = 0; struct bbiChromUsage *usage = usageList; char *line, *row[fieldCount+1]; int lastField = fieldCount-1; int itemIx = 0, sectionIx = 0; bits64 blockStartOffset = 0; int startPos = 0, endPos = 0; bits32 chromId = 0; struct dyString *stream = dyStringNew(0); /* Will keep track of some things that help us determine how much to reduce. */ bits32 resEnds[resTryCount]; int resTry; for (resTry = 0; resTry < resTryCount; ++resTry) resEnds[resTry] = 0; boolean atEnd = FALSE, sameChrom = FALSE; bits32 start = 0, end = 0; char *chrom = NULL; struct bed *bed; AllocVar(bed); /* Help keep track of which beds are in current chunk so as to write out * namedChunks to eim if need be. */ long sectionStartIx = 0, sectionEndIx = 0; for (;;) { /* Get next line of input if any. */ if (lineFileNextReal(lf, &line)) { /* Chop up line and make sure the word count is right. */ int wordCount; wordCount = chopLine(line, row); lineFileExpectWords(lf, fieldCount, wordCount); loadAndValidateBedExt(row, bedN, fieldCount, lf, bed, as, FALSE, TRUE); chrom = bed->chrom; start = bed->chromStart; end = bed->chromEnd; sameChrom = sameString(chrom, usage->name); } else /* No next line */ { atEnd = TRUE; } /* Check conditions that would end block and save block info and advance to next if need be. */ if (atEnd || !sameChrom || itemIx >= itemsPerSlot) { /* Save stream to file, compressing if need be. */ if (stream->stringSize > maxBlockSize) maxBlockSize = stream->stringSize; if (doCompress) { size_t maxCompSize = zCompBufSize(stream->stringSize); // keep around an area of scratch memory static int compBufSize = 0; static char *compBuf = NULL; // check to see if buffer needed for compression is big enough if (compBufSize < maxCompSize) { // free up the old not-big-enough piece freez(&compBuf); // freez knows bout NULL // get new scratch area compBufSize = maxCompSize; compBuf = needLargeMem(compBufSize); } int compSize = zCompress(stream->string, stream->stringSize, compBuf, maxCompSize); mustWrite(f, compBuf, compSize); } else mustWrite(f, stream->string, stream->stringSize); dyStringClear(stream); /* Save block offset and size for all named chunks in this section. */ if (eim != NULL) { bits64 blockEndOffset = ftell(f); bbExIndexMakerAddOffsetSize(eim, blockStartOffset, blockEndOffset-blockStartOffset, sectionStartIx, sectionEndIx); sectionStartIx = sectionEndIx; } /* Save info on existing block. */ struct bbiBoundsArray *b = &bounds[sectionIx]; b->offset = blockStartOffset; b->range.chromIx = chromId; b->range.start = startPos; b->range.end = endPos; ++sectionIx; itemIx = 0; if (atEnd) break; } /* Advance to next chromosome if need be and get chromosome id. */ if (!sameChrom) { usage = usage->next; assert(usage != NULL); assert(sameString(chrom, usage->name)); for (resTry = 0; resTry < resTryCount; ++resTry) resEnds[resTry] = 0; } chromId = usage->id; /* At start of block we save a lot of info. */ if (itemIx == 0) { blockStartOffset = ftell(f); startPos = start; endPos = end; } /* Otherwise just update end. */ { if (endPos < end) endPos = end; /* No need to update startPos since list is sorted. */ } /* Save name into namedOffset if need be. */ if (eim != NULL) { bbExIndexMakerAddKeysFromRow(eim, row, sectionEndIx); sectionEndIx += 1; } /* Write out data. */ dyStringWriteOne(stream, chromId); dyStringWriteOne(stream, start); dyStringWriteOne(stream, end); if (fieldCount > 3) { int i; /* Write 3rd through next to last field and a tab separator. */ for (i=3; i= resEnd) { resSizes[resTry] += 1; resEnds[resTry] = resEnd = start + resScales[resTry]; } while (end > resEnd) { resSizes[resTry] += 1; resEnds[resTry] = resEnd = resEnd + resScales[resTry]; } } } assert(sectionIx == sectionCount); freez(&bed); *retMaxBlockSize = maxBlockSize; } rtracklayer/src/bigBedHelper.h0000644000175100017510000000427714614231172017404 0ustar00biocbuildbiocbuild#ifndef BIGBED_HELPER_H #define BIGBED_HELPER_H #include "ucsc/sig.h" #include "ucsc/common.h" #include "ucsc/sqlNum.h" #include "ucsc/asParse.h" #include "ucsc/obscure.h" #include "ucsc/bbiFile.h" #include "ucsc/zlibFace.h" #include "ucsc/basicBed.h" #include "ucsc/bPlusTree.h" #include "ucsc/rangeTree.h" #include "rtracklayer.h" static int maxBedNameSize; enum IFields { i_name = 3, /* Index value of name field */ i_score = 4, /* Index value of score field */ i_strand = 5, /* Index value of strand field */ i_thick = 7, /* Index value of thick field */ i_itemRgb = 8, /* Index value of itemRgb field */ i_blocks = 11, /* Index value of blocks field */ }; int getDefinedFieldCount(struct asObject *as); bool isPresent(int definedFieldCount, int index); bool isSelected(SEXP r_selectedindex, int position); void *bbNamedFileChunkVal(const void *va); void bbNamedFileChunkKey(const void *va, char *keyBuf); int bbNamedFileChunkCmpByName(const void *va, const void *vb); struct rbTree *rangeTreeForBedChrom(struct lineFile *lf, char *chrom); void bbExIndexMakerAllocChunkArrays(struct bbExIndexMaker *eim, int recordCount); void bbExIndexMakerAddKeysFromRow(struct bbExIndexMaker *eim, char **row, int recordIx); struct bbExIndexMaker *bbExIndexMakerNew(struct slName *extraIndexList, struct asObject *as); void bbExIndexMakerAddOffsetSize(struct bbExIndexMaker *eim, bits64 offset, bits64 size, long startIx, long endIx); struct bbiSummary *bedWriteReducedOnceReturnReducedTwice(struct bbiChromUsage *usageList, int fieldCount, struct lineFile *lf, bits32 initialReduction, bits32 initialReductionCount, int zoomIncrement, int blockSize, int itemsPerSlot, boolean doCompress, struct lm *lm, FILE *f, bits64 *retDataStart, bits64 *retIndexStart, struct bbiSummaryElement *totalSum); void writeBlocks(struct bbiChromUsage *usageList, struct lineFile *lf, struct asObject *as, int itemsPerSlot, struct bbiBoundsArray *bounds, int sectionCount, boolean doCompress, FILE *f, int resTryCount, int resScales[], int resSizes[], struct bbExIndexMaker *eim, int bedCount, bits16 fieldCount, int bedN, bits32 *retMaxBlockSize); #endif rtracklayer/src/bigWig.c0000644000175100017510000002626214614231172016271 0ustar00biocbuildbiocbuild#include "ucsc/common.h" #include "ucsc/linefile.h" #include "ucsc/localmem.h" #include "ucsc/hash.h" #include "ucsc/bbiFile.h" #include "ucsc/bigWig.h" #include "ucsc/bwgInternal.h" #include "bigWig.h" #include "bbiHelper.h" #include "handlers.h" static struct bwgBedGraphItem * createBedGraphItems(int *start, int *width, double *score, int len, struct lm *lm) { struct bwgBedGraphItem *itemList = NULL, *item; int i; for (i=0; iend = start[i] + width[i] - 1; item->start = start[i] - 1; item->val = score[i]; slAddHead(&itemList, item); } slReverse(&itemList); return itemList; } static struct bwgVariableStepPacked * createVariableStepItems(int *start, double *score, int len, struct lm *lm) { struct bwgVariableStepPacked *packed; lmAllocArray(lm, packed, len); int i; for (i=0; ichrom = (char *)seq; section->start = start[0] - 1; section->end = start[len-1] + width[len-1] - 1; section->type = type; section->itemSpan = width[0]; if (type == bwgTypeFixedStep) { section->items.fixedStepPacked = createFixedStepItems(score, len, lm); section->itemStep = len > 1 ? start[1] - start[0] : 0; } else if (type == bwgTypeVariableStep) { section->items.variableStepPacked = createVariableStepItems(start, score, len, lm); } else section->items.bedGraphList = createBedGraphItems(start, width, score, len, lm); section->itemCount = len; return section; } static struct bwgSection * createBWGSection_Atomic(const char *seq, int start, double *score, int len, struct lm *lm) { struct bwgSection *section; lmAllocVar(lm, section); section->chrom = (char *)seq; section->start = start; section->end = start + len - 1; section->type = bwgTypeFixedStep; section->itemSpan = 1; section->items.fixedStepPacked = createFixedStepItems(score, len, lm); section->itemStep = 1; section->itemCount = len; return section; } static int itemsPerSlot = 1024; static int blockSize = 256; static void BWGSectionList_addRle(struct bwgSection **sections, const char *seq, SEXP r_ranges, double *score, enum bwgSectionType type, struct lm *lm) { int numLeft = get_IRanges_length(r_ranges); int *start = INTEGER(get_IRanges_start(r_ranges)); int *width = INTEGER(get_IRanges_width(r_ranges)); while(numLeft) { int numSection = numLeft > itemsPerSlot ? itemsPerSlot : numLeft; numLeft -= numSection; slAddHead(sections, createBWGSection_Rle(seq, start, width, score, numSection, type, lm)); start += numSection; width += numSection; score += numSection; } } static void BWGSectionList_addAtomic(struct bwgSection **sections, const char *seq, double *score, int num, struct lm *lm) { int numLeft = num; while(numLeft) { int numSection = numLeft > itemsPerSlot ? itemsPerSlot : numLeft; slAddHead(sections, createBWGSection_Atomic(seq, num - numLeft, score, numSection, lm)); score += numSection; numLeft -= numSection; } } /* --- .Call ENTRY POINT --- */ SEXP BWGSectionList_add(SEXP r_sections, SEXP r_seq, SEXP r_ranges, SEXP r_score, SEXP r_format) { struct bwgSection *sections = NULL; const char *seq = CHAR(asChar(r_seq)); double *score = REAL(r_score); const char *format = CHAR(asChar(r_format)); SEXP ans; struct lm *lm; enum bwgSectionType type = bwgTypeBedGraph; if (sameString(format, "fixedStep")) type = bwgTypeFixedStep; else if (sameString(format, "variableStep")) type = bwgTypeVariableStep; if (r_sections != R_NilValue) { sections = R_ExternalPtrAddr(r_sections); lm = R_ExternalPtrAddr(R_ExternalPtrTag(r_sections)); } else lm = lmInit(0); pushRHandlers(); if (r_ranges != R_NilValue) { BWGSectionList_addRle(§ions, seq, r_ranges, score, type, lm); } else { BWGSectionList_addAtomic(§ions, seq, score, length(r_score), lm); } popRHandlers(); PROTECT(ans = R_MakeExternalPtr(sections, R_NilValue, R_NilValue)); R_SetExternalPtrTag(ans, R_MakeExternalPtr(lm, R_NilValue, R_NilValue)); UNPROTECT(1); return ans; } static struct hash *createIntHash(SEXP v) { struct hash *hash = hashNew(0); SEXP names = getAttrib(v, R_NamesSymbol); for (int i = 0; i < length(v); i++) hashAddInt(hash, (char *)CHAR(STRING_ELT(names, i)), INTEGER(v)[i]); return hash; } /* --- .Call ENTRY POINT --- */ SEXP BWGSectionList_write(SEXP r_sections, SEXP r_seqlengths, SEXP r_compress, SEXP r_fixed_summaries, SEXP r_file) { struct bwgSection *sections = NULL; struct hash *lenHash = createIntHash(r_seqlengths); if (r_sections != R_NilValue) { sections = R_ExternalPtrAddr(r_sections); slReverse(§ions); } pushRHandlers(); bwgCreate(sections, lenHash, max(blockSize, length(r_seqlengths)), itemsPerSlot, asLogical(r_compress), FALSE /*keepAllChromosomes*/, asLogical(r_fixed_summaries), (char *)CHAR(asChar(r_file))); freeHash(&lenHash); popRHandlers(); return r_file; } /* --- .Call ENTRY POINT --- */ SEXP BWGSectionList_cleanup(SEXP r_sections) { pushRHandlers(); if (r_sections != R_NilValue) { struct lm *lm = R_ExternalPtrAddr(R_ExternalPtrTag(r_sections)); lmCleanup(&lm); } popRHandlers(); return R_NilValue; } /* --- .Call ENTRY POINT --- */ SEXP BWGFile_seqlengths(SEXP r_filename) { pushRHandlers(); SEXP seqlengths; struct bbiFile * file = bigWigFileOpen((char *)CHAR(asChar(r_filename))); PROTECT(seqlengths = bbiSeqLengths(file)); bbiFileClose(&file); popRHandlers(); UNPROTECT(1); return seqlengths; } /* --- .Call ENTRY POINT --- */ SEXP BWGFile_query(SEXP r_filename, SEXP r_seqnames, SEXP r_ranges, SEXP r_return_score, SEXP r_return_list) { pushRHandlers(); struct bbiFile * file = bigWigFileOpen((char *)CHAR(asChar(r_filename))); Rboolean return_list = asLogical(r_return_list); SEXP ans, ans_start, ans_width, ans_score, ans_ranges, ans_nhits; SEXP numericListEls = NULL; bool returnScore = asLogical(r_return_score); struct lm *lm = lmInit(0); struct bbiInterval *hits = NULL; int n_ranges = get_IRanges_length(r_ranges); if (return_list) { PROTECT(numericListEls = allocVector(VECSXP, n_ranges)); } else { PROTECT(ans_nhits = allocVector(INTSXP, n_ranges)); } int *start = INTEGER(get_IRanges_start(r_ranges)); int *width = INTEGER(get_IRanges_width(r_ranges)); for (int i = 0; i < n_ranges; i++) { struct bbiInterval *queryHits = bigWigIntervalQuery(file, (char *)CHAR(STRING_ELT(r_seqnames, i)), start[i] - 1, start[i] - 1 + width[i], lm); int nqhits = slCount(queryHits); if (return_list) { struct bbiInterval *qhits = queryHits; SEXP ans_numeric; PROTECT(ans_numeric = allocVector(REALSXP, width[i])); memset(REAL(ans_numeric), 0, sizeof(double) * width[i]); for (int k = 0; k < nqhits; k++, qhits = qhits->next) { for (int l = qhits->start; l < qhits->end; l++) REAL(ans_numeric)[(l - start[i] + 1)] = qhits->val; } SET_VECTOR_ELT(numericListEls, i, ans_numeric); UNPROTECT(1); } else { slReverse(&queryHits); hits = slCat(queryHits, hits); INTEGER(ans_nhits)[i] = nqhits; } } bbiFileClose(&file); if (return_list) { ans = new_SimpleList("SimpleList", numericListEls); UNPROTECT(1); } else { int n_hits = slCount(hits); PROTECT(ans_start = allocVector(INTSXP, n_hits)); PROTECT(ans_width = allocVector(INTSXP, n_hits)); if (returnScore) { PROTECT(ans_score = allocVector(REALSXP, n_hits)); } else ans_score = R_NilValue; slReverse(&hits); for (int i = 0; i < n_hits; i++, hits = hits->next) { INTEGER(ans_start)[i] = hits->start + 1; INTEGER(ans_width)[i] = hits->end - hits->start; if (returnScore) REAL(ans_score)[i] = hits->val; } PROTECT(ans_ranges = new_IRanges("IRanges", ans_start, ans_width, R_NilValue)); ans = allocVector(VECSXP, 3); SET_ELEMENT(ans, 0, ans_ranges); SET_ELEMENT(ans, 1, ans_score); SET_ELEMENT(ans, 2, ans_nhits); UNPROTECT(4 + returnScore); } lmCleanup(&lm); popRHandlers(); return ans; } /* --- .Call ENTRY POINT --- */ SEXP BWGFile_summary(SEXP r_filename, SEXP r_chrom, SEXP r_ranges, SEXP r_size, SEXP r_type, SEXP r_default_value) { pushRHandlers(); struct bbiFile * file = bigWigFileOpen((char *)CHAR(asChar(r_filename))); enum bbiSummaryType type = bbiSummaryTypeFromString((char *)CHAR(asChar(r_type))); double default_value = asReal(r_default_value); int *start = INTEGER(get_IRanges_start(r_ranges)); int *width = INTEGER(get_IRanges_width(r_ranges)); SEXP ans; PROTECT(ans = allocVector(VECSXP, length(r_chrom))); for (int i = 0; i < length(r_chrom); i++) { int size = INTEGER(r_size)[i]; char *chrom = (char *)CHAR(STRING_ELT(r_chrom, i)); SEXP r_values = allocVector(REALSXP, size); double *values = REAL(r_values); for (int j = 0; j < size; j++) values[j] = default_value; SET_VECTOR_ELT(ans, i, r_values); bool success = bigWigSummaryArray(file, chrom, start[i] - 1, start[i] - 1 + width[i], type, size, values); if (!success) warning("Failed to summarize range %d (%s:%d-%d)", i, chrom, start[i], start[i] - 1 + width[i]); } bbiFileClose(&file); popRHandlers(); UNPROTECT(1); return ans; } #include "ucsc/verbose.h" SEXP BWGFile_fromWIG(SEXP r_infile, SEXP r_clip, SEXP r_seqlengths, SEXP r_outfile) { pushRHandlers(); struct lm *lm = lmInit(0); struct hash *lenHash = createIntHash(r_seqlengths); Rboolean clip = asLogical(r_clip); struct bwgSection *sections = bwgParseWig((char *)CHAR(asChar(r_infile)), clip, lenHash, itemsPerSlot, lm); bwgCreate(sections, lenHash, max(blockSize, length(r_seqlengths)), itemsPerSlot, TRUE, TRUE, FALSE, (char *)CHAR(asChar(r_outfile))); lmCleanup(&lm); freeHash(&lenHash); popRHandlers(); return r_outfile; } SEXP R_udcCleanup(SEXP r_maxDays) { double maxDays = asReal(r_maxDays); bits64 size = udcCleanup(udcDefaultDir(), maxDays, FALSE); return ScalarReal(size); } SEXP R_setUserUdcDir(SEXP r_dir) { char *dir = (char *)CHAR(asChar(r_dir)); udcSetDefaultDir(dir); return R_NilValue; } rtracklayer/src/bigWig.h0000644000175100017510000000153614614231172016273 0ustar00biocbuildbiocbuild#ifndef BIG_WIG_H #define BIG_WIG_H #include "rtracklayer.h" /* The .Call entry points */ SEXP BWGSectionList_add(SEXP r_sections, SEXP r_seq, SEXP r_ranges, SEXP r_score, SEXP r_format); SEXP BWGSectionList_write(SEXP r_sections, SEXP r_seqlengths, SEXP r_compress, SEXP r_fixed_summaries, SEXP r_file); SEXP BWGSectionList_cleanup(SEXP r_sections); SEXP BWGFile_query(SEXP r_filename, SEXP r_seqnames, SEXP r_ranges, SEXP r_colnames, SEXP r_int_ranges); SEXP BWGFile_seqlengths(SEXP r_filename); SEXP BWGFile_summary(SEXP r_filename, SEXP r_chrom, SEXP r_ranges, SEXP r_size, SEXP r_type, SEXP r_default_value); SEXP BWGFile_fromWIG(SEXP r_infile, SEXP r_clip, SEXP r_outfile, SEXP r_seqlengths); SEXP R_udcCleanup(SEXP r_maxDays); SEXP R_setUserUdcDir(SEXP dir); #endif rtracklayer/src/chain_io.c0000644000175100017510000001451314614231172016626 0ustar00biocbuildbiocbuild#include "ucsc/common.h" #include "ucsc/hash.h" #include "rtracklayer.h" #define LINEBUF_SIZE 20001 /* hash these chain blocks by target and query name */ typedef struct _ChainBlock { char *name; IntPairAE *ranges; /* to become an IRanges */ IntAE *offset; /* starts in the other sequence */ /* rle of spaces and scores */ IntAE *length, *score; CharAE *rev; /* use CharAE until we have a bitset */ CharAEAE *space; } ChainBlock; #define HEADER_SIZE 11 #define DATA_SIZE 3 /* returns an array of ChainBlock pointers */ ChainBlock **read_chain_file(FILE *stream, const char *exclude, int *nblocks) { /* fgets() a line if first or after blank, parse header get names, use hash table to get existing block, ow create one add score, get offsets for starts ow parse a record for width, tstart, qstart */ char linebuf[LINEBUF_SIZE]; char *header[HEADER_SIZE]; char *data[DATA_SIZE]; int tstart = 0, qstart = 0; Rboolean new_block = TRUE, excluded = FALSE, trc = FALSE, qrc = FALSE; ChainBlock *block = NULL, **result = NULL; struct hash *hash = hashNew(6); struct hashEl *hash_elements; int line = 0, i = 0, header_line = 0; while (fgets(linebuf, LINEBUF_SIZE, stream) != NULL) { line++; if (strlen(linebuf) == LINEBUF_SIZE - 1) { error("line %d is too long", line); } if (linebuf[0] == '#') { continue; } if (excluded) { eraseWhiteSpace(linebuf); if (!strlen(linebuf)) { excluded = FALSE; new_block = TRUE; } } else if (new_block) { /* have a header */ void *value; int matches = chopByChar(linebuf, ' ', header, HEADER_SIZE); if (matches < HEADER_SIZE) error("expected %d elements in header, got %d, on line %d", HEADER_SIZE, matches, line); new_block = FALSE; if (exclude && (strstr(header[2], exclude) || strstr(header[7], exclude))) { //Rprintf("excluding: [%s -> %s]\n", header[2], header[7]); excluded = TRUE; continue; } value = hashFindVal(hash, header[2]); if (!value) { /* new block */ int name_size = strlen(header[2])+1; block = (ChainBlock *)S_alloc(1, sizeof(ChainBlock)); hashAdd(hash, header[2], block); block->name = (char *)S_alloc(name_size, sizeof(char)); memcpy(block->name, header[2], name_size); block->ranges = new_IntPairAE(0, 0); block->offset = new_IntAE(0, 0, 0); block->length = new_IntAE(0, 0, 0); block->score = new_IntAE(0, 0, 0); block->rev = new_CharAE(0); block->space = new_CharAEAE(0, 0); } else block = value; IntAE_insert_at(block->score, IntAE_get_nelt(block->score), atoi(header[1])); CharAEAE_append_string(block->space, header[7]); header_line = line; trc = strcmp("+", header[4]); qrc = strcmp("+", header[9]); CharAE_insert_at(block->rev, CharAE_get_nelt(block->rev), trc != qrc); tstart = atoi(header[5]) + 1; /* 0-based -> 1-based */ if (trc) tstart = atoi(header[3]) - tstart + 2; /* start one too high */ qstart = atoi(header[10]) + 1; if (qrc) qstart = atoi(header[8]) - qstart + 2; } else { int matches = chopByWhite(linebuf, data, DATA_SIZE), width; if (matches != 1 && matches != 3) error("expecting 1 or 3 elements on line %d, got %d", line, matches); width = atoi(data[0]); tstart -= (trc ? width : 0); qstart -= (qrc ? width : 0); IntPairAE_insert_at(block->ranges, IntPairAE_get_nelt(block->ranges), tstart, width); IntAE_insert_at(block->offset, IntAE_get_nelt(block->offset), tstart - qstart); if (matches == 3) { /* normal line */ int dt = atoi(data[1]), dq = atoi(data[2]); int tchange, qchange; if (trc) /* width already subtracted above */ tchange = -dt; else tchange = width + dt; tstart += tchange; if (qrc) qchange = -dq; else qchange = width + dq; qstart += qchange; } else { new_block = TRUE; IntAE_insert_at(block->length, IntAE_get_nelt(block->length), line-header_line); //Rprintf("end of %s block, line: %d\n", block->name, line); if (fgets(linebuf, LINEBUF_SIZE, stream) == NULL) /* skip empty line */ error("incomplete block"); line++; } } } result = (ChainBlock **)S_alloc(hashNumEntries(hash), sizeof(ChainBlock *)); hash_elements = hashElListHash(hash); for (struct hashEl *h = hash_elements; h; h = h->next, i++) { result[i] = h->val; } *nblocks = i; hashElFreeList(&hash_elements); hashFree(&hash); return result; } /* parse the chain file format from UCSC for representing alignments */ SEXP readChain(SEXP r_path, SEXP r_exclude) { const char *path, *exclude; FILE *stream; SEXP ans, ans_names, ans_listData, chain_class, chainBlock_class; ChainBlock **chains; int i, nblocks; path = translateChar(STRING_ELT(r_path, 0)); if ((stream = fopen(path, "r")) == NULL) error("cannot open file '%s'", path); exclude = r_exclude == R_NilValue ? NULL : CHAR(STRING_ELT(r_exclude, 0)); chains = read_chain_file(stream, exclude, &nblocks); PROTECT(chain_class = MAKE_CLASS("Chain")); PROTECT(chainBlock_class = MAKE_CLASS("ChainBlock")); PROTECT(ans = NEW_OBJECT(chain_class)); ans_listData = allocVector(VECSXP, nblocks); SET_SLOT(ans, install("listData"), ans_listData); ans_names = allocVector(STRSXP, nblocks); SET_NAMES(ans_listData, ans_names); for (i = 0; i < nblocks; i++) { SEXP block; block = NEW_OBJECT(chainBlock_class); SET_VECTOR_ELT(ans_listData, i, block); SET_SLOT(block, install("ranges"), new_IRanges_from_IntPairAE("IRanges", chains[i]->ranges)); SET_SLOT(block, install("offset"), new_INTEGER_from_IntAE(chains[i]->offset)); SET_SLOT(block, install("length"), new_INTEGER_from_IntAE(chains[i]->length)); SET_SLOT(block, install("score"), new_INTEGER_from_IntAE(chains[i]->score)); SET_SLOT(block, install("space"), new_CHARACTER_from_CharAEAE(chains[i]->space)); SET_SLOT(block, install("reversed"), new_LOGICAL_from_CharAE(chains[i]->rev)); SET_STRING_ELT(ans_names, i, mkChar(chains[i]->name)); } UNPROTECT(3); return ans; } rtracklayer/src/handlers.c0000644000175100017510000000116514614231172016654 0ustar00biocbuildbiocbuild#include "ucsc/common.h" #include "ucsc/errAbort.h" #include "handlers.h" #define WARN_BUF_SIZE 512 static void R_warnHandler(char *format, va_list args) { char warn_buf[WARN_BUF_SIZE]; vsnprintf(warn_buf, WARN_BUF_SIZE, format, args); warning("%s", warn_buf); } static void R_abortHandler() { error("UCSC library operation failed"); } extern int R_ignore_SIGPIPE; void pushRHandlers() { pushAbortHandler(R_abortHandler); pushWarnHandler(R_warnHandler); #ifndef WIN32 R_ignore_SIGPIPE = 1; #endif } void popRHandlers() { popAbortHandler(); popWarnHandler(); #ifndef WIN32 R_ignore_SIGPIPE = 0; #endif } rtracklayer/src/handlers.h0000644000175100017510000000016414614231172016657 0ustar00biocbuildbiocbuild#ifndef HANDLERS_H #define HANDLERS_H #include "rtracklayer.h" void pushRHandlers(); void popRHandlers(); #endif rtracklayer/src/IRanges_stubs.c0000644000175100017510000000003414614231172017616 0ustar00biocbuildbiocbuild#include <_IRanges_stubs.c> rtracklayer/src/Makevars0000644000175100017510000000031514614353366016412 0ustar00biocbuildbiocbuildinclude Makevars.common OBJECTS = $(PKG_OBJECTS) $(UCSC_OBJECTS:%=ucsc/%) PKG_LIBS=-lz -pthread -lssl -lcrypto -lcurl PKG_CPPFLAGS= -DUSE_SSL -D_FILE_OFFSET_BITS=64 all: $(SHLIB) clean: rm -f $(OBJECTS) rtracklayer/src/Makevars.common0000644000175100017510000000124414614231172017671 0ustar00biocbuildbiocbuildPKG_OBJECTS = \ S4Vectors_stubs.o IRanges_stubs.o XVector_stubs.o R_init_rtracklayer.o \ readGFF.o bbiHelper.o bigWig.o bigBedHelper.o bigBed.o chain_io.o twoBit.o handlers.o utils.o UCSC_OBJECTS = \ memgfx.o binRange.o htmlColor.o sqlList.o tokenizer.o asParse.o \ basicBed.o bigBed.o bPlusTree.o bbiRead.o bbiWrite.o bwgCreate.o bwgQuery.o \ cirTree.o common.o dnaseq.o dnautil.o errAbort.o hash.o linefile.o localmem.o\ sqlNum.o zlibFace.o dystring.o hmmstats.o obscure.o pipeline.o \ rangeTree.o rbTree.o memalloc.o dlist.o filePath.o htmlPage.o udc.o net.o bits.o twoBit.o \ _cheapcgi.o internet.o https.o base64.o verbose.o os.o wildcmp.o _portimpl.o rtracklayer/src/Makevars.in0000644000175100017510000000034214614231172017005 0ustar00biocbuildbiocbuildinclude Makevars.common OBJECTS = $(PKG_OBJECTS) $(UCSC_OBJECTS:%=ucsc/%) PKG_LIBS=-lz -pthread @OPENSSL_LIBS@ -lcurl PKG_CPPFLAGS=@OPENSSL_CFLAGS@ @SSL_CPPFLAGS@ -D_FILE_OFFSET_BITS=64 all: $(SHLIB) clean: rm -f $(OBJECTS) rtracklayer/src/Makevars.win0000644000175100017510000000134714614231172017202 0ustar00biocbuildbiocbuildLIBPSL = $(or $(and $(wildcard $(R_TOOLS_SOFT)/lib/libpsl.a),-lpsl),) LIBBROTLI = $(or $(and $(wildcard $(R_TOOLS_SOFT)/lib/libbrotlidec.a),-lbrotlidec -lbrotlicommon),) ZLIB_CFLAGS+=$(shell echo 'zlibbioc::pkgconfig("PKG_CFLAGS")'|\ "${R_HOME}/bin/R" --vanilla --slave) PKG_LIBS+=$(shell echo 'zlibbioc::pkgconfig("PKG_LIBS_shared")' |\ "${R_HOME}/bin/R" --vanilla --slave) PKG_LIBS+=-lcurl $(LIBPSL) $(LIBBROTLI) -lssh2 -lssl -lwldap32\ -lbcrypt -lcrypto -lgcrypt -lcrypt32 -lgpg-error -lidn2\ -lunistring -liconv -lzstd -lws2_32 -lz include Makevars.common OBJECTS = $(PKG_OBJECTS) $(UCSC_OBJECTS:%=ucsc/%) all: $(SHLIB) clean: rm -f $(OBJECTS) %.o: %.c $(CC) $(ZLIB_CFLAGS) $(ALL_CPPFLAGS) $(ALL_CFLAGS) -c $< -o $@ rtracklayer/src/R_init_rtracklayer.c0000644000175100017510000000247014614231172020703 0ustar00biocbuildbiocbuild#include "rtracklayer.h" #include "readGFF.h" #include "bigWig.h" #include "bigBed.h" #include "twoBit.h" #include "utils.h" #include #define CALLMETHOD_DEF(fun, numArgs) {#fun, (DL_FUNC) &fun, numArgs} static const R_CallMethodDef callMethods[] = { /* readGFF.c */ CALLMETHOD_DEF(gff_colnames, 1), CALLMETHOD_DEF(read_gff_pragmas, 1), CALLMETHOD_DEF(scan_gff, 5), CALLMETHOD_DEF(load_gff, 8), /* bigWig.c */ CALLMETHOD_DEF(BWGSectionList_add, 5), CALLMETHOD_DEF(BWGSectionList_write, 5), CALLMETHOD_DEF(BWGSectionList_cleanup, 1), CALLMETHOD_DEF(BWGFile_query, 5), CALLMETHOD_DEF(BWGFile_seqlengths, 1), CALLMETHOD_DEF(BWGFile_summary, 6), CALLMETHOD_DEF(BWGFile_fromWIG, 4), CALLMETHOD_DEF(R_udcCleanup, 1), CALLMETHOD_DEF(R_setUserUdcDir, 1), /* bigBed.c */ CALLMETHOD_DEF(BBDFile_fieldnames, 1), CALLMETHOD_DEF(BBDFile_seqlengths, 1), CALLMETHOD_DEF(BBDFile_query, 5), CALLMETHOD_DEF(BBDFile_write, 6), /* twobit.c */ CALLMETHOD_DEF(DNAString_to_twoBit, 3), CALLMETHOD_DEF(TwoBits_write, 2), CALLMETHOD_DEF(TwoBitFile_seqlengths, 1), CALLMETHOD_DEF(TwoBitFile_read, 4), /* utils.c */ CALLMETHOD_DEF(CharacterList_pasteCollapse, 2), {NULL, NULL, 0} }; void R_init_rtracklayer(DllInfo *info) { R_registerRoutines(info, NULL, callMethods, NULL, NULL); } rtracklayer/src/readGFF.c0000644000175100017510000007600214614231172016314 0ustar00biocbuildbiocbuild#include "XVector_interface.h" #include "S4Vectors_interface.h" #include /* for R_ReadConnection() */ #include /* for isspace() */ #include /* for strtod() */ #include /* for memcpy() and memcmp() */ /* #include static clock_t clock0; static void init_clock(const char *msg) { printf("%s", msg); clock0 = clock(); } static void print_elapsed_time() { printf("%8.6f s\n", ((double) clock() - clock0) / CLOCKS_PER_SEC); } */ /**************************************************************************** * filexp_gets2(): A version of filexp_gets() that also works on connections */ Rconnection getConnection(int n); /* not in , why? */ static char con_buf[25000]; static int con_buf_len, con_buf_offset; static void init_con_buf() { con_buf_len = con_buf_offset = 0; return; } static int filexp_gets2(SEXP filexp, char *buf, int buf_size, int *EOL_in_buf) { Rconnection con; int buf_offset; char c; if (TYPEOF(filexp) == EXTPTRSXP) return filexp_gets(filexp, buf, buf_size, EOL_in_buf); buf_offset = *EOL_in_buf = 0; while (buf_offset < buf_size - 1) { if (con_buf_offset == con_buf_len) { con = getConnection(asInteger(filexp)); con_buf_len = (int) R_ReadConnection(con, con_buf, sizeof(con_buf) / sizeof(char)); if (con_buf_len == 0) break; con_buf_offset = 0; } c = con_buf[con_buf_offset++]; buf[buf_offset++] = c; if (c == '\n') { *EOL_in_buf = 1; break; } } buf[buf_offset] = '\0'; if (buf_offset == 0) return 0; if (con_buf_len == 0 || *EOL_in_buf) return 2; return 1; } /**************************************************************************** * Buffer of tags */ #define MAX_COLLECTED_TAGS 4096 typedef struct tags_buf { CharAEAE *collected_tags; /* used in COLLECT MODE */ SEXP tags; /* used in LOAD MODE */ /* We use a hash table for fast mapping of the tags to their corresponding column in the output of readGFF(). */ struct htab htab; } TagsBuf; #define IN_COLLECT_MODE(tags_buf) ((tags_buf)->collected_tags != NULL) /* Copied from R_HOME/src/main/envir.c */ static unsigned int char_hash(const char *s, int len) { /* djb2 as from http://www.cse.yorku.ca/~oz/hash.html */ int i; unsigned int h = 5381; for (i = 0; i < len; i++) h = ((h << 5) + h) + (*s); return h; } static int TagsBuf_get_bucket_idx(const TagsBuf *tags_buf, const char *tag, int tag_len) { unsigned int hval; int bucket_idx, M, i2; const int *buckets; const CharAE *tag_ae; SEXP tags_elt; hval = char_hash(tag, tag_len); bucket_idx = hval & tags_buf->htab.Mminus1; buckets = tags_buf->htab.buckets; M = tags_buf->htab.M; while ((i2 = buckets[bucket_idx]) != NA_INTEGER) { if (IN_COLLECT_MODE(tags_buf)) { /* COLLECT MODE */ tag_ae = tags_buf->collected_tags->elts[i2]; if (CharAE_get_nelt(tag_ae) == tag_len && memcmp(tag_ae->elts, tag, tag_len) == 0) break; } else { /* LOAD MODE */ tags_elt = STRING_ELT(tags_buf->tags, i2); if (LENGTH(tags_elt) == tag_len && memcmp(CHAR(tags_elt), tag, tag_len) == 0) break; } bucket_idx = (bucket_idx + 1) % M; } return bucket_idx; } static int TagsBuf_get_bucket_val(const TagsBuf *tags_buf, int bucket_idx) { return get_hbucket_val(&(tags_buf->htab), bucket_idx); } static void TagsBuf_set_bucket_val(TagsBuf *tags_buf, int bucket_idx, int val) { set_hbucket_val(&(tags_buf->htab), bucket_idx, val); return; } static void init_tags_buf_in_COLLECT_MODE(TagsBuf *tags_buf) { tags_buf->collected_tags = new_CharAEAE(MAX_COLLECTED_TAGS, 0); tags_buf->tags = R_NilValue; tags_buf->htab = new_htab(MAX_COLLECTED_TAGS); return; } /* The tags in 'tags' must be unique. */ static void init_tags_buf_in_LOAD_MODE(TagsBuf *tags_buf, SEXP tags) { int ntag, i, tag_len, bucket_idx, bucket_val; SEXP tags_elt; const char *tag; tags_buf->collected_tags = NULL; tags_buf->tags = tags; ntag = LENGTH(tags); tags_buf->htab = new_htab(ntag); for (i = 0; i < ntag; i++) { tags_elt = STRING_ELT(tags, i); if (tags_elt == NA_STRING) error("'tags' cannot contain NAs"); tag = CHAR(tags_elt); tag_len = LENGTH(tags_elt); bucket_idx = TagsBuf_get_bucket_idx(tags_buf, tag, tag_len); bucket_val = TagsBuf_get_bucket_val(tags_buf, bucket_idx); if (bucket_val != NA_INTEGER) error("'tags' cannot contain duplicates"); TagsBuf_set_bucket_val(tags_buf, bucket_idx, i); } return; } static void collect_tag(TagsBuf *tags_buf, const char *tag, int tag_len) { int bucket_idx, bucket_val; int i; CharAE *ae; /* We want to store unique tags in 'tags_buf' so we first check to see if 'tag' is already stored and we don't do anything if it is. */ bucket_idx = TagsBuf_get_bucket_idx(tags_buf, tag, tag_len); bucket_val = TagsBuf_get_bucket_val(tags_buf, bucket_idx); if (bucket_val != NA_INTEGER) return; /* 'tag' was found ==> nothing to do */ /* 'tag' was not found ==> add it */ i = CharAEAE_get_nelt(tags_buf->collected_tags); if (i >= MAX_COLLECTED_TAGS) error("GFF files with more than %d tags are not supported", MAX_COLLECTED_TAGS); TagsBuf_set_bucket_val(tags_buf, bucket_idx, i); ae = new_CharAE(tag_len); CharAE_set_nelt(ae, tag_len); memcpy(ae->elts, tag, tag_len); CharAEAE_insert_at(tags_buf->collected_tags, i, ae); return; } static int match_tag(const TagsBuf *tags_buf, const char *tag, int tag_len) { int bucket_idx; bucket_idx = TagsBuf_get_bucket_idx(tags_buf, tag, tag_len); return TagsBuf_get_bucket_val(tags_buf, bucket_idx); } static SEXP get_collected_tags(const TagsBuf *tags_buf) { if (tags_buf == NULL || !IN_COLLECT_MODE(tags_buf)) return R_NilValue; return new_CHARACTER_from_CharAEAE(tags_buf->collected_tags); } /**************************************************************************** * gff_colnames() * * See http://www.sequenceontology.org/resources/gff3.html for the official * GFF3 specs. */ static const char *col_names[] = { "seqid", "source", "type", "start", "end", "score", "strand", "phase", "attributes" /* "group" for GFF1 */ }; static const SEXPTYPE col_types[] = { STRSXP, /* seqid */ STRSXP, /* source */ STRSXP, /* type */ INTSXP, /* start */ INTSXP, /* end */ REALSXP, /* score */ STRSXP, /* strand */ INTSXP, /* phase */ STRSXP /* attributes */ }; #define GFF_NCOL ((int) (sizeof(col_names) / sizeof(char *))) #define SEQID_IDX 0 #define SOURCE_IDX 1 #define TYPE_IDX 2 #define START_IDX 3 #define END_IDX 4 #define SCORE_IDX 5 #define STRAND_IDX 6 #define PHASE_IDX 7 #define ATTRIBUTES_IDX 8 static const char *gff_colname(int col_idx, int gff1) { if (col_idx == ATTRIBUTES_IDX && gff1) return "group"; return col_names[col_idx]; } /* --- .Call ENTRY POINT --- */ SEXP gff_colnames(SEXP GFF1) { SEXP ans, ans_elt; int col_idx; const char *colname; PROTECT(ans = NEW_CHARACTER(GFF_NCOL)); for (col_idx = 0; col_idx < GFF_NCOL; col_idx++) { colname = gff_colname(col_idx, LOGICAL(GFF1)[0]); PROTECT(ans_elt = mkChar(colname)); SET_STRING_ELT(ans, col_idx, ans_elt); UNPROTECT(1); } UNPROTECT(1); return ans; } /**************************************************************************** * read_gff_pragmas(), scan_gff(), and load_gff() */ static double as_double(const char *val, int val_len) { double x; char *end_conversion, c; int end_offset, i; x = strtod(val, &end_conversion); end_offset = end_conversion - val; if (end_offset == 0) return NA_REAL; for (i = end_offset; i < val_len; i++) { c = val[i]; if (!isspace(c)) return NA_REAL; } return x; } static int prepare_colmap0(int *colmap0, SEXP colmap) { int ans_ncol0, col_idx, j; ans_ncol0 = 0; for (col_idx = 0; col_idx < GFF_NCOL; col_idx++) { j = INTEGER(colmap)[col_idx]; if (j != NA_INTEGER) { if (j > ans_ncol0) ans_ncol0 = j; j--; } colmap0[col_idx] = j; } return ans_ncol0; } static SEXP alloc_ans(int ans_nrow, int ans_ncol0, const int *colmap0, SEXP tags, SEXP pragmas, SEXP attrcol_fmt, SEXP raw_data) { int ans_ntag, ans_ncol, gff1, is_raw, col_idx, j, i; SEXP ans, ans_attr, ans_names, ans_col, ans_colname, tags_elt; SEXPTYPE col_type; const char *colname; ans_ntag = LENGTH(tags); ans_ncol = ans_ncol0 + ans_ntag; gff1 = INTEGER(attrcol_fmt)[0] == 1; is_raw = LOGICAL(raw_data)[0]; PROTECT(ans = NEW_LIST(ans_ncol)); PROTECT(ans_names = NEW_CHARACTER(ans_ncol)); /* Alloc standard GFF columns. */ for (col_idx = 0; col_idx < GFF_NCOL; col_idx++) { j = colmap0[col_idx]; if (j == NA_INTEGER) continue; col_type = is_raw ? STRSXP : col_types[col_idx]; PROTECT(ans_col = allocVector(col_type, ans_nrow)); SET_ELEMENT(ans, j, ans_col); UNPROTECT(1); colname = gff_colname(col_idx, gff1); PROTECT(ans_colname = mkChar(colname)); SET_STRING_ELT(ans_names, j, ans_colname); UNPROTECT(1); j++; } /* Alloc tag columns. */ for (j = ans_ncol0; j < ans_ncol; j++) { PROTECT(ans_col = NEW_CHARACTER(ans_nrow)); for (i = 0; i < ans_nrow; i++) SET_STRING_ELT(ans_col, i, NA_STRING); SET_ELEMENT(ans, j, ans_col); UNPROTECT(1); tags_elt = STRING_ELT(tags, j - ans_ncol0); PROTECT(ans_colname = duplicate(tags_elt)); SET_STRING_ELT(ans_names, j, ans_colname); UNPROTECT(1); } SET_NAMES(ans, ans_names); UNPROTECT(1); /* list_as_data_frame() performs IN-PLACE coercion */ list_as_data_frame(ans, ans_nrow); /* Set additional attributes. */ PROTECT(ans_attr = duplicate(pragmas)); SET_ATTR(ans, install("pragmas"), ans_attr); UNPROTECT(1); PROTECT(ans_attr = duplicate(attrcol_fmt)); SET_ATTR(ans, install("attrcol_fmt"), ans_attr); UNPROTECT(1); PROTECT(ans_attr = ScalarInteger(ans_ncol0)); SET_ATTR(ans, install("ncol0"), ans_attr); UNPROTECT(1); PROTECT(ans_attr = ScalarInteger(ans_ntag)); SET_ATTR(ans, install("ntag"), ans_attr); UNPROTECT(1); PROTECT(ans_attr = duplicate(raw_data)); SET_ATTR(ans, install("raw_data"), raw_data); UNPROTECT(1); UNPROTECT(1); return ans; } static void load_string(const char *data, int data_len, SEXP ans_col, int row_idx) { SEXP tmp; PROTECT(tmp = mkCharLen(data, data_len)); SET_STRING_ELT(ans_col, row_idx, tmp); UNPROTECT(1); return; } static void load_int(const char *data, int data_len, SEXP ans_col, int row_idx) { INTEGER(ans_col)[row_idx] = as_int(data, data_len); return; } static void load_double(const char *data, int data_len, SEXP ans_col, int row_idx) { REAL(ans_col)[row_idx] = as_double(data, data_len); return; } static char errmsg_buf[256]; static const char *load_data(const char *data, int data_len, SEXP ans, int row_idx, int col_idx, const int *colmap0, int lineno) { SEXP ans_col; int is_raw; SEXPTYPE col_type; ans_col = VECTOR_ELT(ans, colmap0[col_idx]); is_raw = LOGICAL(GET_ATTR(ans, install("raw_data")))[0]; if (is_raw) { load_string(data, data_len, ans_col, row_idx); return NULL; } col_type = col_types[col_idx]; if (col_idx == START_IDX || col_idx == END_IDX) { reset_ovflow_flag(); load_int(data, data_len, ans_col, row_idx); if (get_ovflow_flag()) { snprintf(errmsg_buf, sizeof(errmsg_buf), "line %d contains values greater than 2^31-1 " "\n (= .Machine$integer.max) in column 4 " "(start) and/or 5 (end).\n Bioconductor " "does not support such GFF files at the " "moment. Sorry!", lineno); return errmsg_buf; } return NULL; } switch (col_type) { case STRSXP: if (data_len == 1) { if (col_idx == STRAND_IDX && (data[0] == '.' || data[0] == '?')) { data = "*"; data_len = 1; } else if (data[0] == '.') { SET_STRING_ELT(ans_col, row_idx, NA_STRING); break; } } load_string(data, data_len, ans_col, row_idx); break; case INTSXP: load_int(data, data_len, ans_col, row_idx); break; case REALSXP: load_double(data, data_len, ans_col, row_idx); break; } return NULL; } static void load_tagval(const char *tag, int tag_len, const char *val, int val_len, SEXP ans, int row_idx, const TagsBuf *tags_buf) { int j; SEXP ans_col; j = match_tag(tags_buf, tag, tag_len); if (j == NA_INTEGER) return; /* 'tag' was not found ==> nothing to do */ j += INTEGER(GET_ATTR(ans, install("ncol0")))[0]; ans_col = VECTOR_ELT(ans, j); load_string(val, val_len, ans_col, row_idx); return; } /* Some stupid GFF files like GCF_000001735.4_TAIR10.1_genomic.gff.gz (RefSeq * GFF for Arabidopsis thaliana TAIR10.1) can contain lines up to 168975 * chars long. */ #define IOBUF_SIZE 200000 /* * We use a heuristic to detect the format of the "attributes" col. * Terminology: * - Chunks in 'data' separated by ';' are called units. * - A unit with only white-space characters is called a "white" unit. * - A "tag-like word" is a sequence of contiguous non-white-space characters * with no '=' in it. * - A unit made of one "tag-like word" (possibly surrounded by white-space * characters) is called a "tag-only" unit. * Heuristic: * (a) If 'data' contains only 1 unit (i.e. no ';' in it), * then: * - if it's "white" -> return UNKNOWN_FMT * - if it's "tag-only" -> return GFF1_FMT * - otherwise -> (c) below applies. * (b) If 'data' contains > 1 units (i.e. at least 1 ';' in it), then the * format can't be GFF1_FMT anymore so we have to choose between GFF2_FMT * and GFF3_FMT. For that matter "white" and "tag-only" units are * considered uninformative so we skip them. If all units are * uninformative then we return UNKNOWN_FMT. Otherwise the first * informative unit is used and (c) below applies. * (c) Now we're looking at a unit that is not "white" or "tag-only" and * want to be able to tell whether its format is GFF2_FMT or GFF3_FMT * (UNKNOWN_FMT or GFF1_FMT are not an option anymore). The rule is: if * the unit contains a '=' and if this '=' is preceded by one * "tag-like word" only (possibly surrounded by white-space characters) * then the format is GFF3_FMT. Otherwise it's GFF2_FMT. * Examples: * data detected format * |ID=4|----------------> GFF3_FMT * | ID = 4 |--------> GFF3_FMT * |=|-------------------> GFF3_FMT * | = 4 |---------> GFF3_FMT * | = ID 4 |-------> GFF3_FMT * |ID 4|----------------> GFF2_FMT * | ID 4 |----------> GFF2_FMT * |X Y=4|---------------> inherently ambiguous (could be GFF2 or GFF3) but * our heuristic returns GFF2_FMT (tag is "X" and * value is "Y=4") * |XY z =|--------------> GFF2_FMT (tag is "XY" and value is "z =") * |; ;ID=4;Parent 12|---> GFF3_FMT (we look at the 1st informative unit) * |; ;ID 4;Parent=12|---> GFF2_FMT (we look at the 1st informative unit) * |99|------------------> GFF1_FMT * ||--------------------> UNKNOWN_FMT * | |-----------------> UNKNOWN_FMT * | ; 99 ; |----------> UNKNOWN_FMT * |99; ID = 4|---------> GFF3_FMT */ #define UNKNOWN_FMT 0 #define GFF1_FMT 1 #define GFF2_FMT 2 #define GFF3_FMT 3 #define FIRST_SPACE 0 #define FIRST_WORD 1 #define SECOND_SPACE 2 static int detect_attrcol_fmt(const char *data, int data_len) { int nsep, state, i; char c; nsep = 0; state = FIRST_SPACE; for (i = 0; i < data_len; i++) { c = data[i]; if (isspace(c)) { if (state == FIRST_WORD) state = SECOND_SPACE; continue; } if (c == ';') { nsep++; /* We came to the end of a unit that was "white" (i.e. current state is FIRST_SPACE) or "tag-only" (i.e. current state is FIRST_WORD or SECOND_SPACE). This is considered uninformative i.e. it didn't allow us to decide between GFF2_FMT and GFF3_FMT (see (b) above). */ state = FIRST_SPACE; continue; } if (c == '=') return GFF3_FMT; if (state == SECOND_SPACE) return GFF2_FMT; if (state == FIRST_SPACE) state = FIRST_WORD; } if (nsep == 0 && state != FIRST_SPACE) return GFF1_FMT; return UNKNOWN_FMT; } static void parse_GFF3_tagval(const char *tagval, int tagval_len, SEXP ans, int row_idx, TagsBuf *tags_buf) { int tag_len, val_len; char c; const char *val; /* Some GFF3 files have a space betwwen the tag=value and the preceding ; e.g. ID=Csa1M000010.1; Parent=Csa1G000010; Name=Csa1M000010.1 We skip those spaces. */ while (tagval_len > 0 && tagval[0] == ' ') { tagval++; tagval_len--; } /* Compute 'tag_len'. */ for (tag_len = 0; tag_len < tagval_len; tag_len++) { c = tagval[tag_len]; if (c == '=') break; } /* If 'tagval' is not in the "tag=value" format then we ignore it. */ if (tag_len >= tagval_len) return; if (ans != R_NilValue) { val = tagval + tag_len + 1; val_len = tagval_len - tag_len - 1; load_tagval(tagval, tag_len, val, val_len, ans, row_idx, tags_buf); return; } if (tags_buf != NULL && IN_COLLECT_MODE(tags_buf)) collect_tag(tags_buf, tagval, tag_len); return; } /* * It seems that embedded double-quotes might be allowed in the value part of * the tag value pairs of a GFF2 file, and that they are represented with 2 * consecutive double-quotes. To handle them properly, we should replace the * 2 double-quotes by only 1, but this would require to generate a (shrinked) * copy of 'val'. So for now we don't do this and just leave the 2 consecutive * double-quotes in 'val' as-is, and attach an attribute to 'ans' to indicate * that we've found embedded double-quotes. We also issue a warning. If we ever * get that warning on real-world files, then we'll revisit this. */ static void check_for_embedded_dblquotes(const char *val, int val_len, SEXP ans) { SEXP has_embedded_quotes; int i, j; has_embedded_quotes = GET_ATTR(ans, install("has_embedded_quotes")); if (!isNull(has_embedded_quotes) && LOGICAL(has_embedded_quotes)[0]) return; for (i = 0, j = 1; j < val_len; i++, j++) { if (val[i] == '"' && val[j] == '"') break; } if (j >= val_len) return; PROTECT(has_embedded_quotes = ScalarLogical(1)); SET_ATTR(ans, install("has_embedded_quotes"), has_embedded_quotes); UNPROTECT(1); warning("the value part of some of the tag value pairs " "contains embedded double-quotes"); return; } static void parse_GFF2_tagval(const char *tagval, int tagval_len, SEXP ans, int row_idx, TagsBuf *tags_buf) { int i, tag_len, val_len; char c; const char *val; /* Trim leading space. */ for (i = 0; i < tagval_len; i++) { c = tagval[i]; if (!isspace(c)) break; } tagval += i; tagval_len -= i; /* Compute 'tag_len'. */ for (tag_len = 0; tag_len < tagval_len; tag_len++) { c = tagval[tag_len]; if (isspace(c)) break; } /* If 'tagval' is not in the "tag value" format then we ignore it. */ if (tag_len >= tagval_len) return; if (ans != R_NilValue) { val = tagval + tag_len + 1; val_len = tagval_len - tag_len - 1; /* Trim leading space in 'val'. */ for (i = 0; i < val_len; i++) { c = val[i]; if (!isspace(c)) break; } val += i; val_len -= i; /* Trim trailing space in 'val'. */ for (i = val_len - 1; i >= 0; i--) { c = val[i]; if (!isspace(c)) break; } val_len = i + 1; /* Trim leading and trailing double-quotes in 'val'. */ if (val_len != 0 && val[0] == '"') { val++; val_len--; } if (val_len != 0 && val[val_len - 1] == '"') { val_len--; } check_for_embedded_dblquotes(val, val_len, ans); load_tagval(tagval, tag_len, val, val_len, ans, row_idx, tags_buf); return; } if (tags_buf != NULL && IN_COLLECT_MODE(tags_buf)) collect_tag(tags_buf, tagval, tag_len); return; } static void parse_GFF3_attrcol(const char *data, int data_len, SEXP ans, int row_idx, TagsBuf *tags_buf) { const char *tagval; int tagval_len, i; char c; tagval = data; tagval_len = 0; for (i = 0; i < data_len; i++) { c = data[i]; if (c != ';') { tagval_len++; continue; } parse_GFF3_tagval(tagval, tagval_len, ans, row_idx, tags_buf); tagval = data + i + 1; tagval_len = 0; } parse_GFF3_tagval(tagval, tagval_len, ans, row_idx, tags_buf); return; } static void parse_GFF2_attrcol(const char *data, int data_len, SEXP ans, int row_idx, TagsBuf *tags_buf) { const char *tagval; int tagval_len, in_quotes, i; char c; tagval = data; tagval_len = 0; in_quotes = 0; for (i = 0; i < data_len; i++) { c = data[i]; if (c == '"') { tagval_len++; in_quotes = !in_quotes; continue; } if (in_quotes || c != ';') { tagval_len++; continue; } parse_GFF2_tagval(tagval, tagval_len, ans, row_idx, tags_buf); tagval = data + i + 1; tagval_len = 0; } parse_GFF2_tagval(tagval, tagval_len, ans, row_idx, tags_buf); return; } static const char *set_data_holders(Chars_holder *data_holders, const char *line, int lineno) { int col_idx, i, data_len; const char *data; char c; col_idx = i = 0; data = line; data_len = 0; while ((c = line[i++])) { if (c != '\t') { data_len++; continue; } data_holders[col_idx].ptr = data; data_holders[col_idx].length = data_len; col_idx++; if (col_idx == GFF_NCOL) break; data = line + i; data_len = 0; } if (col_idx == GFF_NCOL) { /* We've seen 9 tabs but it's OK if the 9th tab is followed by white spaces only (some GTF files are like that). Otherwise we raise an error. */ while ((c = line[i++])) { if (isspace(c)) continue; snprintf(errmsg_buf, sizeof(errmsg_buf), "line %d has more than %d " "tab-separated columns", lineno, GFF_NCOL); return errmsg_buf; } } else { if (col_idx < GFF_NCOL - 2) { snprintf(errmsg_buf, sizeof(errmsg_buf), "line %d has less than %d " "tab-separated columns", lineno, GFF_NCOL - 1); return errmsg_buf; } data_len = delete_trailing_LF_or_CRLF(data, data_len); data_holders[col_idx].ptr = data; data_holders[col_idx].length = data_len; col_idx++; if (col_idx == GFF_NCOL - 1) data_holders[col_idx].length = 0; } return NULL; } static void check_filter(SEXP filter, int attrcol_fmt) { int filter_len, col_idx, nval, i; SEXP filter_elt, val; if (isNull(filter)) return; filter_len = attrcol_fmt == 1 ? GFF_NCOL : GFF_NCOL - 1; if (!(IS_LIST(filter) && LENGTH(filter) == filter_len)) error("incorrect 'filter'"); for (col_idx = 0; col_idx < filter_len; col_idx++) { filter_elt = VECTOR_ELT(filter, col_idx); if (isNull(filter_elt)) continue; if (!IS_CHARACTER(filter_elt)) error("each list element in 'filter' must be " "NULL or a character vector"); nval = LENGTH(filter_elt); for (i = 0; i < nval; i++) { val = STRING_ELT(filter_elt, i); if (val == NA_STRING) error("'filter' cannot contain NAs"); } } return; } static int pass_filter(Chars_holder *data_holders, SEXP filter) { int filter_len, col_idx, data_len, nval, i; SEXP filter_elt, val; const char *data; filter_len = LENGTH(filter); for (col_idx = 0; col_idx < filter_len; col_idx++) { filter_elt = VECTOR_ELT(filter, col_idx); if (isNull(filter_elt)) continue; data = data_holders[col_idx].ptr; data_len = data_holders[col_idx].length; nval = LENGTH(filter_elt); for (i = 0; i < nval; i++) { val = STRING_ELT(filter_elt, i); if (LENGTH(val) == data_len && memcmp(CHAR(val), data, data_len) == 0) break; } if (i >= nval) return 0; } return 1; } static const char *parse_GFF_line(const char *line, int lineno, int *attrcol_fmt, SEXP filter, /* used during scan and load */ SEXP ans, /* used during load (2nd pass) */ int *row_idx, /* used during scan and load */ const int *colmap0, /* used during load (2nd pass) */ TagsBuf *tags_buf) /* used during scan and load */ { const char *errmsg; Chars_holder data_holders[GFF_NCOL]; const Chars_holder *data_holder; const char *data; int data_len, col_idx; errmsg = set_data_holders(data_holders, line, lineno); if (errmsg != NULL) return errmsg; /* Try to detect the format of the "attributes" col before filtering. */ if (*attrcol_fmt == UNKNOWN_FMT) { data_holder = data_holders + ATTRIBUTES_IDX; data = data_holder->ptr; data_len = data_holder->length; *attrcol_fmt = detect_attrcol_fmt(data, data_len); } if (!(isNull(filter) || pass_filter(data_holders, filter))) return NULL; for (col_idx = 0, data_holder = data_holders; col_idx < GFF_NCOL; col_idx++, data_holder++) { data = data_holder->ptr; data_len = data_holder->length; if (ans != R_NilValue && colmap0[col_idx] != NA_INTEGER) { errmsg = load_data(data, data_len, ans, *row_idx, col_idx, colmap0, lineno); if (errmsg != NULL) return errmsg; } if (col_idx != ATTRIBUTES_IDX) continue; switch (*attrcol_fmt) { case GFF3_FMT: parse_GFF3_attrcol(data, data_len, ans, *row_idx, tags_buf); break; case GFF2_FMT: parse_GFF2_attrcol(data, data_len, ans, *row_idx, tags_buf); break; } } (*row_idx)++; return NULL; } /* Stop parsing after 1st GFF line. */ static const char *load_GFF_pragmas(SEXP filexp, CharAEAE *pragmas_buf, int *attrcol_fmt) { int row_idx, lineno, ret_code, EOL_in_buf, buf_len; char buf[IOBUF_SIZE], c; if (TYPEOF(filexp) != EXTPTRSXP) init_con_buf(); row_idx = 0; for (lineno = 1; (ret_code = filexp_gets2(filexp, buf, IOBUF_SIZE, &EOL_in_buf)); lineno += EOL_in_buf) { if (ret_code == -1) { snprintf(errmsg_buf, sizeof(errmsg_buf), "read error while reading characters " "from line %d", lineno); return errmsg_buf; } if (!EOL_in_buf) { snprintf(errmsg_buf, sizeof(errmsg_buf), "cannot read line %d, " "line is too long", lineno); return errmsg_buf; } c = buf[0]; if (c != '#') { /* Skip empty line. */ if (c == '\n' || (c == '\r' && buf[1] == '\n')) continue; /* Stop parsing at 1st FASTA header... */ if (c == '>') return NULL; /* ... or at 1st GFF line. */ return parse_GFF_line(buf, lineno, attrcol_fmt, R_NilValue, R_NilValue, &row_idx, NULL, NULL); } /* Line starting with a single # -> human-readable comment. */ if (buf[1] != '#') continue; /* Line starting with ## -> pragma line. */ buf_len = delete_trailing_LF_or_CRLF(buf, -1); buf[buf_len] = '\0'; CharAEAE_append_string(pragmas_buf, buf); } return NULL; } static const char *parse_GFF_file(SEXP filexp, int *attrcol_fmt, SEXP filter, /* used during scan and load */ int *nrows, /* used during scan and load */ SEXP ans, /* used during load (2nd pass) */ const int *colmap0, /* used during load (2nd pass) */ TagsBuf *tags_buf) /* used during scan and load */ { int row_idx, lineno, ret_code, EOL_in_buf; char buf[IOBUF_SIZE], c; const char *errmsg; if (TYPEOF(filexp) != EXTPTRSXP) init_con_buf(); row_idx = 0; for (lineno = 1; (ret_code = filexp_gets2(filexp, buf, IOBUF_SIZE, &EOL_in_buf)); lineno += EOL_in_buf) { if (ret_code == -1) { snprintf(errmsg_buf, sizeof(errmsg_buf), "read error while reading characters " "from line %d", lineno); return errmsg_buf; } if (!EOL_in_buf) { snprintf(errmsg_buf, sizeof(errmsg_buf), "cannot read line %d, " "line is too long", lineno); return errmsg_buf; } if (*nrows >= 0 && row_idx == *nrows) return NULL; c = buf[0]; if (c == '#') continue; if (c == '\n' || (c == '\r' && buf[1] == '\n')) continue; /* skip empty line */ if (c == '>') break; /* stop parsing at 1st FASTA header */ errmsg = parse_GFF_line(buf, lineno, attrcol_fmt, filter, ans, &row_idx, colmap0, tags_buf); if (errmsg != NULL) return errmsg; } *nrows = row_idx; return NULL; } /* --- .Call ENTRY POINT --- * Return pragmas and detected format of the "attributes" col from the 1st * GFF line. * Arg: * filexp: A "file external pointer" (see src/io_utils.c in the XVector * package). Alternatively can be a connection. */ SEXP read_gff_pragmas(SEXP filexp) { CharAEAE *pragmas_buf; int attrcol_fmt0; const char *errmsg; SEXP pragmas, attrcol_fmt; pragmas_buf = new_CharAEAE(0, 0); attrcol_fmt0 = UNKNOWN_FMT; errmsg = load_GFF_pragmas(filexp, pragmas_buf, &attrcol_fmt0); if (errmsg != NULL) error("reading GFF file: %s", errmsg); PROTECT(pragmas = new_CHARACTER_from_CharAEAE(pragmas_buf)); PROTECT(attrcol_fmt = ScalarInteger(attrcol_fmt0)); SET_ATTR(pragmas, install("attrcol_fmt"), attrcol_fmt); UNPROTECT(2); return pragmas; } /* --- .Call ENTRY POINT --- * Perform the 1st pass of readGFF(). * Args: * filexp: MUST be the same as passed to read_gff_pragmas(). * attrcol_fmt: * tags: NULL or a character vector indicating which tags to load. * NULL means load all tags. * filter: NULL or a list of length GFF_NCOL-1 (or GFF_NCOL if * 'attrcol_fmt' is 1). Each list element must be NULL or a * character vector with no NAs. * nrows: -1 or the maximum number of rows to read in (after * filtering). */ SEXP scan_gff(SEXP filexp, SEXP attrcol_fmt, SEXP tags, SEXP filter, SEXP nrows) { int attrcol_fmt0, nrows0; TagsBuf tags_buf, *tags_buf_p; const char *errmsg; SEXP scan_ans, scan_ans_elt; //init_clock("scan_gff: T1 = "); attrcol_fmt0 = INTEGER(attrcol_fmt)[0]; if (tags == R_NilValue) { tags_buf_p = &tags_buf; init_tags_buf_in_COLLECT_MODE(tags_buf_p); } else { tags_buf_p = NULL; } check_filter(filter, attrcol_fmt0); nrows0 = INTEGER(nrows)[0]; errmsg = parse_GFF_file(filexp, &attrcol_fmt0, filter, &nrows0, R_NilValue, NULL, tags_buf_p); if (errmsg != NULL) error("reading GFF file: %s", errmsg); PROTECT(scan_ans = NEW_LIST(2)); PROTECT(scan_ans_elt = get_collected_tags(tags_buf_p)); SET_ELEMENT(scan_ans, 0, scan_ans_elt); UNPROTECT(1); PROTECT(scan_ans_elt = ScalarInteger(nrows0)); SET_ELEMENT(scan_ans, 1, scan_ans_elt); UNPROTECT(2); //print_elapsed_time(); return scan_ans; } /* --- .Call ENTRY POINT --- * Perform the 2nd pass of readGFF(). * Args: * filexp: MUST be the same as passed to scan_gff(). * attrcol_fmt: * tags: A character vector indicating which tags to load. Unlike for * scan_gff() above, it cannot be NULL. * filter: MUST be the same as passed to scan_gff(). This time we * don't check it. * nrows: Integer vector of length 1 containing the number of rows * scan_gff() said will end up in 'ans'. * pragmas: Character vector containing the pragma lines returned by * read_gff_pragmas(). * colmap: An integer vector of length GFF_NCOL indicating which columns * to load and in which order. * raw_data: TRUE or FALSE. If TRUE, numeric columns (e.g. "start" or * "score") are loaded as character vectors and as-is i.e. how * they are found in the file. */ SEXP load_gff(SEXP filexp, SEXP attrcol_fmt, SEXP tags, SEXP filter, SEXP nrows, SEXP pragmas, SEXP colmap, SEXP raw_data) { int attrcol_fmt0, colmap0[GFF_NCOL], ans_ncol0; TagsBuf tags_buf; SEXP ans; const char *errmsg; //init_clock("load_gff: T2 = "); attrcol_fmt0 = INTEGER(attrcol_fmt)[0]; init_tags_buf_in_LOAD_MODE(&tags_buf, tags); ans_ncol0 = prepare_colmap0(colmap0, colmap); PROTECT(ans = alloc_ans(INTEGER(nrows)[0], ans_ncol0, colmap0, tags, pragmas, attrcol_fmt, raw_data)); errmsg = parse_GFF_file(filexp, &attrcol_fmt0, filter, INTEGER(nrows), ans, colmap0, &tags_buf); UNPROTECT(1); if (errmsg != NULL) error("reading GFF file: %s", errmsg); //print_elapsed_time(); return ans; } rtracklayer/src/readGFF.h0000644000175100017510000000060214614231172016312 0ustar00biocbuildbiocbuild#ifndef GFF_H #define GFF_H #include "rtracklayer.h" /* The .Call entry points */ SEXP gff_colnames(SEXP GFF1); SEXP read_gff_pragmas(SEXP filexp); SEXP scan_gff(SEXP filexp, SEXP attrcol_fmt, SEXP tags, SEXP filter, SEXP nrows); SEXP load_gff(SEXP filexp, SEXP attrcol_fmt, SEXP tags, SEXP filter, SEXP nrows, SEXP pragmas, SEXP colmap, SEXP raw_data); #endif rtracklayer/src/rtracklayer.h0000644000175100017510000000025514614231172017403 0ustar00biocbuildbiocbuild#ifndef RTRACKLAYER_H #define RTRACKLAYER_H #include #include #include #include #endif rtracklayer/src/S4Vectors_stubs.c0000644000175100017510000000003614614231172020124 0ustar00biocbuildbiocbuild#include <_S4Vectors_stubs.c> rtracklayer/src/twoBit.c0000644000175100017510000000753314614231172016331 0ustar00biocbuildbiocbuild#include "ucsc/common.h" #include "ucsc/dnaseq.h" #include "ucsc/twoBit.h" #include "twoBit.h" #include "handlers.h" /* .Call entry point */ SEXP DNAString_to_twoBit(SEXP r_dna, SEXP r_mask, SEXP r_seqname) { pushRHandlers(); dnaUtilOpen(); const DNA *dna = CHAR(asChar(r_dna)); struct dnaSeq *seq = newDnaSeq((DNA *)dna, strlen(dna), (char *)CHAR(asChar(r_seqname))); struct twoBit *twoBit = twoBitFromDnaSeq(seq, FALSE); int *mask_start = INTEGER(get_IRanges_start(r_mask)); int *mask_width = INTEGER(get_IRanges_width(r_mask)); int mask_count = get_IRanges_length(r_mask); SEXP ans; if (mask_count) { AllocArray(twoBit->maskStarts, mask_count); AllocArray(twoBit->maskSizes, mask_count); } for (int i = 0; i < mask_count; i++) { twoBit->maskStarts[i] = mask_start[i] - 1; twoBit->maskSizes[i] = mask_width[i]; } seq->dna = NULL; /* do not free memory owned by R */ freeDnaSeq(&seq); popRHandlers(); PROTECT(ans = R_MakeExternalPtr(twoBit, R_NilValue, R_NilValue)); setAttrib(ans, R_ClassSymbol, mkString("twoBit")); UNPROTECT(1); return ans; } /* .Call entry point */ /* Writes the list of twoBit pointers to disk and frees them */ SEXP TwoBits_write(SEXP r_twoBits, SEXP r_filename) { pushRHandlers(); FILE *file = mustOpen((char *)CHAR(asChar(r_filename)), "wb"); struct twoBit *twoBits = NULL, *twoBit_it = NULL; for (int i = 0; i < length(r_twoBits); i++) slAddHead(&twoBits, R_ExternalPtrAddr(VECTOR_ELT(r_twoBits, i))); slReverse(&twoBits); twoBitWriteHeader(twoBits, file); for (twoBit_it = twoBits; twoBit_it != NULL; twoBit_it = twoBit_it->next) { twoBitWriteOne(twoBit_it, file); } twoBitFreeList(&twoBits); carefulClose(&file); popRHandlers(); return R_NilValue; } /* .Call entry point */ SEXP TwoBitFile_seqlengths(SEXP r_filename) { pushRHandlers(); struct twoBitFile *tbf = twoBitOpen((char *)CHAR(asChar(r_filename))); struct twoBitIndex *index; int i, n = slCount(tbf->indexList); SEXP r_seqlengths, r_seqnames; PROTECT(r_seqlengths = allocVector(INTSXP, n)); r_seqnames = allocVector(STRSXP, n); setAttrib(r_seqlengths, R_NamesSymbol, r_seqnames); for (index = tbf->indexList, i = 0; index != NULL; index = index->next, i++) { SET_STRING_ELT(r_seqnames, i, mkChar(index->name)); INTEGER(r_seqlengths)[i] = twoBitSeqSize(tbf, index->name); } twoBitClose(&tbf); popRHandlers(); UNPROTECT(1); return r_seqlengths; } SEXP TwoBitFile_read(SEXP r_filename, SEXP r_seqnames, SEXP r_ranges, SEXP lkup) { pushRHandlers(); struct twoBitFile *file = twoBitOpen((char *)CHAR(asChar(r_filename))); int *frag_start = INTEGER(get_IRanges_start(r_ranges)); int *frag_width = INTEGER(get_IRanges_width(r_ranges)); int frag_count = get_IRanges_length(r_ranges); SEXP r_ans_width, r_ans; XVectorList_holder r_ans_holder; PROTECT(r_ans_width = duplicate(get_IRanges_width(r_ranges))); PROTECT(r_ans = alloc_XRawList("DNAStringSet", "DNAString", r_ans_width)); r_ans_holder = hold_XVectorList(r_ans); for (int i = 0; i < frag_count; i++) { if (frag_width[i]) { // UCSC library does not like zero width ranges struct dnaSeq *frag = twoBitReadSeqFrag(file, (char *)CHAR(STRING_ELT(r_seqnames, i)), frag_start[i] - 1, frag_start[i] + frag_width[i] - 1); Chars_holder r_ans_elt_holder = get_elt_from_XRawList_holder(&r_ans_holder, i); /* r_ans_elt_holder.ptr is a const char * so we need to cast it to char * before we can write to it */ Ocopy_bytes_to_i1i2_with_lkup(0, r_ans_elt_holder.length - 1, (char *)r_ans_elt_holder.ptr, r_ans_elt_holder.length, frag->dna, frag->size, INTEGER(lkup), LENGTH(lkup)); freeDnaSeq(&frag); } } twoBitClose(&file); popRHandlers(); UNPROTECT(2); return r_ans; } rtracklayer/src/twoBit.h0000644000175100017510000000056114614231172016330 0ustar00biocbuildbiocbuild#ifndef TWO_BIT_H #define TWO_BIT_H #include "rtracklayer.h" /* The .Call entry points */ SEXP DNAString_to_twoBit(SEXP r_dna, SEXP r_mask, SEXP r_seqname); SEXP TwoBits_write(SEXP r_twoBits, SEXP r_filename); SEXP TwoBitFile_seqlengths(SEXP r_filename); SEXP TwoBitFile_read(SEXP r_filename, SEXP r_seqnames, SEXP r_ranges, SEXP lkup); #endif rtracklayer/src/ucsc/0000755000175100017510000000000014614353501015643 5ustar00biocbuildbiocbuildrtracklayer/src/ucsc/_cheapcgi.c0000644000175100017510000000310714614231172017711 0ustar00biocbuildbiocbuild/* rtracklayer took out these little utilities from cheapcgi.c */ #include "common.h" void cgiDecode(char *in, char *out, int inLength) /* Decode from cgi pluses-for-spaces format to normal. * Out will be a little shorter than in typically, and * can be the same buffer. */ { char c; int i; for (i=0; isize = size; fi->isDir = isDir; fi->statErrno = statErrno; fi->lastAccess = lastAccess; strcpy(fi->name, name); return fi; } int cmpFileInfo(const void *va, const void *vb) /* Compare two fileInfo. */ { const struct fileInfo *a = *((struct fileInfo **)va); const struct fileInfo *b = *((struct fileInfo **)vb); return strcmp(a->name, b->name); } rtracklayer/src/ucsc/_portimpl.h0000644000175100017510000000037114614231172020021 0ustar00biocbuildbiocbuild/* Utilities that rtracklayer made common between win9x and unix */ struct fileInfo *newFileInfo(char *name, off_t size, bool isDir, int statErrno, time_t lastAccess); int cmpFileInfo(const void *va, const void *vb); rtracklayer/src/ucsc/asParse.c0000644000175100017510000004265714614231172017422 0ustar00biocbuildbiocbuild/* asParse - parse out an autoSql .as file. */ /* Copyright (C) 2014 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "linefile.h" #include "tokenizer.h" #include "dystring.h" #include "asParse.h" #include "sqlNum.h" /* n.b. switched double/float from %f to %g to partially address losing * precision. Values like 2e-12 were being rounded to 0.0 with %f. While %g * doesn't match the precision of the database fields, specifying a larger * precision with %g resulted in numbers like 1.9999999999999999597733e-12, * which might impact load time. This issue needs more investigation.*/ struct asTypeInfo asTypes[] = { {t_double, "double", FALSE, FALSE, "double", "double", "Double", "Double", "%g", "FloatField"}, {t_float, "float", FALSE, FALSE, "float", "float", "Float", "Float", "%g", "FloatField"}, {t_char, "char", FALSE, FALSE, "char", "char", "Char", "Char", "%c", "CharField"}, {t_int, "int", FALSE, FALSE, "int", "int", "Signed", "Signed", "%d", "IntegerField"}, {t_uint, "uint", TRUE, FALSE, "int unsigned", "unsigned", "Unsigned", "Unsigned", "%u", "PositiveIntegerField"}, {t_short, "short", FALSE, FALSE, "smallint", "short", "Short", "Signed", "%d", "SmallIntegerField"}, {t_ushort, "ushort", TRUE, FALSE, "smallint unsigned", "unsigned short","Ushort", "Unsigned", "%u", "SmallPositiveIntegerField"}, {t_byte, "byte", FALSE, FALSE, "tinyint", "signed char", "Byte", "Signed", "%d", "SmallIntegerField"}, {t_ubyte, "ubyte", TRUE, FALSE, "tinyint unsigned", "unsigned char", "Ubyte", "Unsigned", "%u", "SmallPositiveIntegerField"}, {t_off, "bigint", FALSE, FALSE, "bigint", "long long", "LongLong", "LongLong", "%lld", "BigIntegerField"}, {t_string, "string", FALSE, TRUE, "varchar(255)", "char *", "String", "String", "%s", "CharField"}, {t_lstring, "lstring", FALSE, TRUE, "longblob", "char *", "String", "String", "%s", "TextField"}, {t_enum, "enum", FALSE, FALSE, "enum", "!error!", "Enum", "Enum", NULL, "CharField"}, {t_set, "set", FALSE, FALSE, "set", "unsigned", "Set", "Set", NULL, NULL}, {t_object, "object", FALSE, FALSE, "longblob", "!error!", "Object", "Object", NULL, "TextField"}, {t_object, "table", FALSE, FALSE, "longblob", "!error!", "Object", "Object", NULL, "TextField"}, {t_simple, "simple", FALSE, FALSE, "longblob", "!error!", "Simple", "Simple", NULL, "TextField"}, }; struct asTypeInfo *asTypeFindLow(char *name) /* Return asType for a low level type of given name. (Low level because may be decorated * with array or pointer stuff at a higher level). Returns NULL if not found. */ { int i; for (i=0; istring); if (type == NULL) tokenizerErrAbort(tkz, "Unknown type '%s'", tkz->string); return type; } static struct asColumn *findColumn(struct asObject *table, char *colName) /* Return column or null. */ { struct asColumn *col; for (col = table->columnList; col != NULL; col = col->next) { if (sameWord(col->name, colName)) return col; } return NULL; } static void mustNotFindColumn(struct asObject *table, char *colName) /* Die if column found. */ { struct asColumn *col = findColumn(table, colName); if (col) errAbort("duplicate column names found: %s, %s", col->name, colName); } static struct asColumn *mustFindColumn(struct asObject *table, char *colName) /* Return column or die. */ { struct asColumn *col = findColumn(table, colName); if (!col) errAbort("Couldn't find column %s", colName); return col; } static struct asObject *findObType(struct asObject *objList, char *obName) /* Find object with given name. */ { struct asObject *obj; for (obj = objList; obj != NULL; obj = obj->next) { if (sameWord(obj->name, obName)) return obj; } return NULL; } static void asParseColArraySpec(struct tokenizer *tkz, struct asObject *obj, struct asColumn *col) /* parse the array length specification for a column */ { if (col->lowType->type == t_simple) col->isArray = TRUE; else col->isList = TRUE; tokenizerMustHaveNext(tkz); if (isdigit(tkz->string[0])) { col->fixedSize = atoi(tkz->string); tokenizerMustHaveNext(tkz); } else if (isalpha(tkz->string[0])) { #ifdef OLD if (obj->isSimple) tokenizerErrAbort(tkz, "simple objects can't include variable length arrays\n"); #endif /* OLD */ col->linkedSizeName = cloneString(tkz->string); col->linkedSize = mustFindColumn(obj, col->linkedSizeName); col->linkedSize->isSizeLink = TRUE; tokenizerMustHaveNext(tkz); } else tokenizerErrAbort(tkz, "must have column name or integer inside []'s\n"); tokenizerMustMatch(tkz, "]"); } static void asParseColSymSpec(struct tokenizer *tkz, struct asObject *obj, struct asColumn *col) /* parse the enum or set symbolic values for a column */ { tokenizerMustHaveNext(tkz); while (tkz->string[0] != ')') { slSafeAddHead(&col->values, slNameNew(tkz->string)); /* look for `,' or `)', but allow `,' after last token */ tokenizerMustHaveNext(tkz); if (!((tkz->string[0] == ',') || (tkz->string[0] == ')'))) tokenizerErrAbort(tkz, "expected `,' or `)' got `%s'", tkz->string); if (tkz->string[0] != ')') tokenizerMustHaveNext(tkz); } tokenizerMustMatch(tkz, ")"); slReverse(&col->values); } int tokenizerUnsignedVal(struct tokenizer *tkz) /* Ensure current token is an unsigned integer and return value */ { if (!isdigit(tkz->string[0])) { struct lineFile *lf = tkz->lf; errAbort("expecting number got %s line %d of %s", tkz->string, lf->lineIx, lf->fileName); } return sqlUnsigned(tkz->string); } struct asIndex *asParseIndex(struct tokenizer *tkz, struct asColumn *col) /* See if there's an index key word and if so parse it and return an asIndex * based on it. If not an index key word then just return NULL. */ { struct asIndex *index = NULL; if (sameString(tkz->string, "primary") || sameString(tkz->string, "unique") || sameString(tkz->string, "index") ) { AllocVar(index); index->type = cloneString(tkz->string); tokenizerMustHaveNext(tkz); if (tkz->string[0] == '[') { tokenizerMustHaveNext(tkz); index->size = tokenizerUnsignedVal(tkz); tokenizerMustHaveNext(tkz); tokenizerMustMatch(tkz, "]"); } } return index; } static void asParseColDef(struct tokenizer *tkz, struct asObject *obj) /* Parse a column definition */ { struct asColumn *col; AllocVar(col); col->lowType = findLowType(tkz); tokenizerMustHaveNext(tkz); if (col->lowType->type == t_object || col->lowType->type == t_simple) { col->obName = cloneString(tkz->string); tokenizerMustHaveNext(tkz); } if (tkz->string[0] == '[') asParseColArraySpec(tkz, obj, col); else if (tkz->string[0] == '(') asParseColSymSpec(tkz, obj, col); col->name = cloneString(tkz->string); mustNotFindColumn(obj, col->name); // check for duplicate column name tokenizerMustHaveNext(tkz); col->index = asParseIndex(tkz, col); if (sameString(tkz->string, "auto")) { col->autoIncrement = TRUE; if (!asTypesIsInt(col->lowType->type)) errAbort("error - auto with non-integer type for field %s", col->name); tokenizerMustHaveNext(tkz); } tokenizerMustMatch(tkz, ";"); col->comment = cloneString(tkz->string); tokenizerMustHaveNext(tkz); if (col->lowType->type == t_char && col->fixedSize != 0) col->isList = FALSE; /* It's not really a list... */ slAddHead(&obj->columnList, col); } static struct asObject *asParseTableDef(struct tokenizer *tkz) /* Parse a table or object definintion */ { struct asObject *obj; AllocVar(obj); if (sameWord(tkz->string, "table")) obj->isTable = TRUE; else if (sameWord(tkz->string, "simple")) obj->isSimple = TRUE; else if (sameWord(tkz->string, "object")) ; else tokenizerErrAbort(tkz, "Expecting 'table' or 'object' got '%s'", tkz->string); tokenizerMustHaveNext(tkz); obj->name = cloneString(tkz->string); tokenizerMustHaveNext(tkz); obj->comment = cloneString(tkz->string); /* parse columns */ tokenizerMustHaveNext(tkz); tokenizerMustMatch(tkz, "("); while (tkz->string[0] != ')') asParseColDef(tkz, obj); slReverse(&obj->columnList); return obj; } static void asLinkEmbeddedObjects(struct asObject *obj, struct asObject *objList) /* Look up any embedded objects. */ { struct asColumn *col; for (col = obj->columnList; col != NULL; col = col->next) { if (col->obName != NULL) { if ((col->obType = findObType(objList, col->obName)) == NULL) errAbort("%s used but not defined", col->obName); if (obj->isSimple) { if (!col->obType->isSimple) errAbort("Simple object %s with embedded non-simple object %s", obj->name, col->name); } } } } static struct asObject *asParseTokens(struct tokenizer *tkz) /* Parse file into a list of objects. */ { struct asObject *objList = NULL; struct asObject *obj; while (tokenizerNext(tkz)) { obj = asParseTableDef(tkz); if (findObType(objList, obj->name)) tokenizerErrAbort(tkz, "Duplicate definition of %s", obj->name); slAddTail(&objList, obj); } for (obj = objList; obj != NULL; obj = obj->next) asLinkEmbeddedObjects(obj, objList); return objList; } char *asTypesIntSizeDescription(enum asTypes type) /* Return description of integer size. Do not free. */ { int size = asTypesIntSize(type); switch (size) { case 1: return "byte"; case 2: return "short integer"; case 4: return "integer"; case 8: return "long long integer"; default: errAbort("Unexpected error in asTypesIntSizeDescription: expecting integer type size of 1, 2, 4, or 8. Got %d.", size); return NULL; // happy compiler, never gets here } } int asTypesIntSize(enum asTypes type) /* Return size in bytes of any integer type - short, long, unsigned, etc. */ { switch (type) { case t_int: case t_uint: return 4; case t_short: case t_ushort: return 2; case t_byte: case t_ubyte: return 1; case t_off: return 8; default: errAbort("Unexpected error in asTypesIntSize: expecting integer type. Got %d.", type); return 0; // happy compiler, never gets here } } boolean asTypesIsUnsigned(enum asTypes type) /* Return TRUE if it's any integer type - short, long, unsigned, etc. */ { switch (type) { case t_uint: case t_ushort: case t_ubyte: return TRUE; default: return FALSE; } } boolean asTypesIsInt(enum asTypes type) /* Return TRUE if it's any integer type - short, long, unsigned, etc. */ { switch (type) { case t_int: case t_uint: case t_short: case t_ushort: case t_byte: case t_ubyte: case t_off: return TRUE; default: return FALSE; } } boolean asTypesIsFloating(enum asTypes type) /* Return TRUE if it's any floating point type - float or double. */ { switch (type) { case t_float: case t_double: return TRUE; default: return FALSE; } } static struct asObject *asParseLineFile(struct lineFile *lf) /* Parse open line file. Closes lf as a side effect. */ { struct tokenizer *tkz = tokenizerOnLineFile(lf); tkz->uncommentShell = TRUE; /* Take out # style comments. */ struct asObject *objList = asParseTokens(tkz); tokenizerFree(&tkz); return objList; } void asColumnFree(struct asColumn **pAs) /* free a single asColumn */ { struct asColumn *as = *pAs; if (as != NULL) { freeMem(as->name); freeMem(as->comment); freez(pAs); } } void asColumnFreeList(struct asColumn **pList) /* free a list of asColumn */ { struct asColumn *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; asColumnFree(&el); } *pList = NULL; } void asObjectFree(struct asObject **pAs) /* free a single asObject */ { struct asObject *as = *pAs; if (as != NULL) { freeMem(as->name); freeMem(as->comment); asColumnFreeList(&as->columnList); freez(pAs); } } void asObjectFreeList(struct asObject **pList) /* free a list of asObject */ { struct asObject *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; asObjectFree(&el); } *pList = NULL; } struct asObject *asParseText(char *text) /* Parse autoSql from text (as opposed to file). */ { char *dupe = cloneString(text); struct lineFile *lf = lineFileOnString("text", TRUE, dupe); struct asObject *objList = asParseLineFile(lf); freez(&dupe); return objList; } struct asColumn *asColumnFind(struct asObject *asObj, char *name) // Return named column. { struct asColumn *asCol = NULL; if (asObj!= NULL) { for (asCol = asObj->columnList; asCol != NULL; asCol = asCol->next) if (sameString(asCol->name, name)) break; } return asCol; } int asColumnFindIx(struct asColumn *list, char *name) /* Return index of first element of asColumn list that matches name. * Return -1 if not found. */ { struct asColumn *ac; int ix = 0; for (ac = list; ac != NULL; ac = ac->next, ix++) if (sameString(name, ac->name)) return ix; return -1; } boolean asCompareObjs(char *name1, struct asObject *as1, char *name2, struct asObject *as2, int numColumnsToCheck, int *retNumColumnsSame, boolean abortOnDifference) /* Compare as-objects as1 and as2 making sure several important fields show they are the same name and type. * If difference found, print it to stderr. If abortOnDifference, errAbort. * Othewise, return TRUE if the objects columns match through the first numColumnsToCheck fields. * If retNumColumnsSame is not NULL, then it will be set to the number of contiguous matching columns. */ { boolean differencesFound = FALSE; struct asColumn *col1 = as1->columnList, *col2 = as2->columnList; int checkCount = 0; int verboseLevel = 2; if (abortOnDifference) verboseLevel = 1; if (as1->isTable != as2->isTable) { verbose(verboseLevel,"isTable does not match: %s=[%d] %s=[%d]", name1, as1->isTable, name2, as2->isTable); differencesFound = TRUE; } else if (as1->isSimple != as2->isSimple) { verbose(verboseLevel,"isSimple does not match: %s=[%d] %s=[%d]", name1, as1->isSimple, name2, as2->isSimple); differencesFound = TRUE; } else { if (!as1->isTable) { errAbort("asCompareObjLists only supports Table .as objects at this time."); } for (col1 = as1->columnList, col2 = as2->columnList; col1 != NULL && col2 != NULL && checkCount < numColumnsToCheck; col1 = col1->next, col2 = col2->next, ++checkCount) { // allow reserved fields to become used if (!(sameOk(col1->name, col2->name) || sameOk(col1->name, "reserved") || sameOk("reserved", col2->name))) { verbose(verboseLevel,"column #%d names do not match: %s=[%s] %s=[%s]\n" , checkCount+1, name1, col1->name, name2, col2->name); differencesFound = TRUE; break; } else if (col1->isSizeLink != col2->isSizeLink) { verbose(verboseLevel,"column #%d isSizeLink do not match: %s=[%d] %s=[%d]\n" , checkCount+1, name1, col1->isSizeLink, name2, col2->isSizeLink); differencesFound = TRUE; break; } else if (col1->isList != col2->isList) { verbose(verboseLevel,"column #%d isList do not match: %s=[%d] %s=[%d]\n" , checkCount+1, name1, col1->isList, name2, col2->isList); differencesFound = TRUE; break; } else if (col1->isArray != col2->isArray) { verbose(verboseLevel,"column #%d isArray do not match: %s=[%d] %s=[%d]\n" , checkCount+1, name1, col1->isArray, name2, col2->isArray); differencesFound = TRUE; break; } else if (!sameOk(col1->lowType->name, col2->lowType->name)) { verbose(verboseLevel,"column #%d type names do not match: %s=[%s] %s=[%s]\n" , checkCount+1, name1, col1->lowType->name, name2, col2->lowType->name); differencesFound = TRUE; break; } else if (col1->fixedSize != col2->fixedSize) { verbose(verboseLevel,"column #%d fixedSize do not match: %s=[%d] %s=[%d]\n" , checkCount+1, name1, col1->fixedSize, name2, col2->fixedSize); differencesFound = TRUE; break; } else if (!sameOk(col1->linkedSizeName, col2->linkedSizeName)) { verbose(verboseLevel,"column #%d linkedSizeName do not match: %s=[%s] %s=[%s]\n" , checkCount+1, name1, col1->linkedSizeName, name2, col2->linkedSizeName); differencesFound = TRUE; break; } } if (!differencesFound && checkCount < numColumnsToCheck) errAbort("Unexpected error in asCompareObjLists: asked to compare %d columns in %s and %s, but only found %d in one or both asObjects." , numColumnsToCheck, name1, name2, checkCount); } if (differencesFound) { if (abortOnDifference) errAbort("asObjects differ."); else verbose(verboseLevel,"asObjects differ. Matching field count=%d\n", checkCount); } if (retNumColumnsSame) *retNumColumnsSame = checkCount; return (!differencesFound); } rtracklayer/src/ucsc/asParse.h0000644000175100017510000001462514614231172017421 0ustar00biocbuildbiocbuild/* asParse - parse out an autoSql .as file. */ #ifndef ASPARSE_H #define ASPARSE_H enum asTypes /* Different low level types (not including lists and objects) */ { t_double, /* double precision floating point. */ t_float, /* single precision floating point. */ t_char, /* character or fixed size character array. */ t_int, /* signed 32 bit integer */ t_uint, /* unsigned 32 bit integer */ t_short, /* signed 16 bit integer */ t_ushort, /* unsigned 16 bit integer */ t_byte, /* signed 8 bit integer */ t_ubyte, /* unsigned 8 bit integer */ t_off, /* 64 bit integer. */ t_string, /* varchar/char * (variable size string up to 255 chars) */ t_lstring, /* variable sized large string. */ t_object, /* composite object - object/table - forms lists. */ t_simple, /* simple composite object - forms arrays. */ t_enum, /* enumerated symbolic values */ t_set, /* set of symbolic values */ }; char *asTypesIntSizeDescription(enum asTypes type); /* Return description of integer size. Do not free. */ int asTypesIntSize(enum asTypes type); /* Return size in bytes of any integer type - short, long, unsigned, etc. */ boolean asTypesIsUnsigned(enum asTypes type); /* Return TRUE if it's any integer type - short, long, unsigned, etc. */ boolean asTypesIsInt(enum asTypes type); /* Return TRUE if it's any integer type - short, long, unsigned, etc. */ boolean asTypesIsFloating(enum asTypes type); /* Return TRUE if it's any floating point type - float or double. */ struct asTypeInfo { enum asTypes type; /* Numeric ID of low level type. */ char *name; /* Text ID of low level type. */ bool isUnsigned; /* True if an unsigned int of some type. */ bool stringy; /* True if a string or blob. */ char *sqlName; /* SQL type name. */ char *cName; /* C type name. */ char *listyName; /* What functions that load a list are called. */ char *nummyName; /* What functions that load a number are called. */ char *outFormat; /* Output format for printf. %d, %u, etc. */ char *djangoName; /* Django type name */ }; struct asTypeInfo *asTypeFindLow(char *name); /* Return asType for a low level type of given name. (Low level because may be decorated * with array or pointer stuff at a higher level). Returns NULL if not found. */ struct asIndex /* Information about an index */ { struct asIndex *next; /* In case it needs to be on a list. */ char *type; /* 'primary' 'index' or 'uniq' to pass to SQL */ int size; /* If nonzero only index prefix of this many chars. */ }; struct asColumn /* Info on one column/field */ { struct asColumn *next; /* Next column. */ char *name; /* Column name. */ char *comment; /* Comment string on column. */ struct asTypeInfo *lowType; /* Root type info. */ char *obName; /* Name of object or table. */ struct asObject *obType; /* Name of composite object. */ int fixedSize; /* 0 if not fixed size, otherwise size of list. */ char *linkedSizeName; /* Points to variable that holds size of list. */ struct asColumn *linkedSize; /* Column for linked size. */ bool isSizeLink; /* Flag to tell if have read link. */ bool isList; /* TRUE if a list. */ bool isArray; /* TRUE if an array. */ bool autoIncrement; /* TRUE if we want to auto_increment this field. */ struct slName *values; /* values for symbolic types */ struct asIndex *index; /* Possibly null index description. */ }; struct asObject /* Info on whole asObject. */ { struct asObject *next; char *name; /* Name of object. */ char *comment; /* Comment describing object. */ struct asColumn *columnList; /* List of columns. */ bool isTable; /* True if a table. */ bool isSimple; /* True if a simple object. */ }; struct dyString *asColumnToSqlType(struct asColumn *col); /* Convert column to a sql type spec in returned dyString */ char *asTypeNameFromSqlType(char *sqlType); /* Return the autoSql type name (not enum) for the given SQL type, or NULL. * Don't attempt to free result. */ struct asObject *asParseFile(char *fileName); /* Parse autoSql .as file. */ struct asObject *asParseText(char *text); /* Parse autoSql from text (as opposed to file). */ void asObjectFree(struct asObject **as); /* free a single asObject */ void asObjectFreeList(struct asObject **as); /* free a list of asObject */ void asColumnFree(struct asColumn **as); /* free a single asColumn */ void asColumnFreeList(struct asColumn **as); /* free a list of asColumn */ struct asColumn *asColumnFind(struct asObject *as, char *name); /* Return column of given name from object, or NULL if not found. */ int asColumnFindIx(struct asColumn *list, char *name); /* Return index of first element of asColumn list that matches name. * Return -1 if not found. */ int asColumnMustFindIx(struct asColumn *list, char *name); /* Return index of first element of asColumn list that matches name. * errAbort if not found. */ boolean asCompareObjs(char *name1, struct asObject *as1, char *name2, struct asObject *as2, int numColumnsToCheck, int *retNumColumnsSame, boolean abortOnDifference); /* Compare as-objects as1 and as2 making sure several important fields show they are the same name and type. * If difference found, print it to stderr. If abortOnDifference, errAbort. * Othewise, return TRUE if the objects columns match through the first numColumnsToCheck fields. * If retNumColumnsSame is not NULL, then it will be set to the number of contiguous matching columns. */ INLINE boolean asObjectsMatch(struct asObject *as1, struct asObject *as2) { int colCount = slCount(as1->columnList); if (slCount(as2->columnList) != colCount) return FALSE; return asCompareObjs(as1->name, as1, as2->name, as2, colCount, NULL, FALSE); } boolean asColumnNamesMatchFirstN(struct asObject *as1, struct asObject *as2, int n); /* Compare only the column names of as1 and as2, not types because if an asObj has been * created from sql type info, longblobs are cast to lstrings but in the proper autoSql * might be lists instead (e.g. longblob in sql, uint exonStarts[exonCount] in autoSql. */ #endif /* ASPARSE_H */ rtracklayer/src/ucsc/base64.c0000644000175100017510000000253514614231172017077 0ustar00biocbuildbiocbuild/* Copyright (C) 2011 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "base64.h" char *base64Encode(char *input, size_t inplen) /* Use base64 to encode a string. Returns one long encoded * string which need to be freeMem'd. Note: big-endian algorithm. * For some applications you may need to break the base64 output * of this function into lines no longer than 76 chars. */ { char b64[] = B64CHARS; int words = (inplen+2)/3; int remains = inplen % 3; char *result = (char *)needMem(4*words+1); size_t i=0, j=0; int word = 0; unsigned char *p = (unsigned char*) input; /* p must be unsigned char*, because without "unsigned", sign extend messes up last group outputted when the value of the chars following last in input happens to be char 0x80 or higher */ for(i=1; i<=words; i++) { word = 0; word |= *p++; word <<= 8; word |= *p++; word <<= 8; word |= *p++; if (i==words && remains>0) { word &= 0x00FFFF00; if (remains==1) word &= 0x00FF0000; } result[j++]=b64[word >> 18 & 0x3F]; result[j++]=b64[word >> 12 & 0x3F]; result[j++]=b64[word >> 6 & 0x3F]; result[j++]=b64[word & 0x3F]; } result[j] = 0; if (remains >0) result[j-1] = '='; if (remains==1) result[j-2] = '='; return result; } rtracklayer/src/ucsc/base64.h0000644000175100017510000000076114614231172017103 0ustar00biocbuildbiocbuild/* Base64 encoding and decoding. * by Galt Barber */ #ifndef BASE64_H #define BASE64_H #define B64CHARS "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" char *base64Encode(char *input, size_t inplen); /* Use base64 to encode a string. Returns one long encoded * string which need to be freeMem'd. Note: big-endian algorithm. * For some applications you may need to break the base64 output * of this function into lines no longer than 76 chars. */ #endif /* BASE64_H */ rtracklayer/src/ucsc/basicBed.c0000644000175100017510000007240514614231172017512 0ustar00biocbuildbiocbuild/* basicBed contains the basic code for Browser Extensible Data (bed) files and tables. * The idea behind bed is that the first three fields are defined and required. * A total of 15 fields are defined, and the file can contain any number of these. * In addition after any number of defined fields there can be custom fields that * are not defined in the bed spec. * * There's additional bed-related code in src/hg/inc/bed.h. This module contains the * stuff that's independent of the database and other genomic structures. */ /* Copyright (C) 2014 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "hash.h" #include "linefile.h" #include "dystring.h" #include "sqlNum.h" #include "sqlList.h" #include "rangeTree.h" #include "binRange.h" #include "asParse.h" #include "htmlColor.h" #include "basicBed.h" #include "memgfx.h" #include "localmem.h" void bedFree(struct bed **pEl) /* Free a single dynamically allocated bed such as created * with bedLoad(). */ { struct bed *el; if ((el = *pEl) == NULL) return; freeMem(el->chrom); freeMem(el->name); freeMem(el->blockSizes); freeMem(el->chromStarts); freeMem(el->expIds); freeMem(el->expScores); freez(pEl); } /* --------------- End of AutoSQL generated code. --------------- */ struct bedLine *bedLineNew(char *line) /* Create a new bedLine based on tab-separated string s. */ { struct bedLine *bl; char *s, c; AllocVar(bl); bl->chrom = cloneString(line); s = strchr(bl->chrom, '\t'); if (s == NULL) errAbort("Expecting tab in bed line %s", line); *s++ = 0; c = *s; if (isdigit(c) || (c == '-' && isdigit(s[1]))) { bl->chromStart = atoi(s); bl->line = s; return bl; } else { errAbort("Expecting start position in second field of %s", line); return NULL; } } void bedLineFree(struct bedLine **pBl) /* Free up memory associated with bedLine. */ { struct bedLine *bl; if ((bl = *pBl) != NULL) { freeMem(bl->chrom); freez(pBl); } } int bedLineCmp(const void *va, const void *vb) /* Compare to sort based on query. */ { const struct bedLine *a = *((struct bedLine **)va); const struct bedLine *b = *((struct bedLine **)vb); int dif; dif = strcmp(a->chrom, b->chrom); if (dif == 0) dif = a->chromStart - b->chromStart; return dif; } struct bed *bedLoad5(char **row) /* Load first five fields of bed. */ { struct bed *ret; AllocVar(ret); ret->chrom = cloneString(row[0]); ret->chromStart = sqlUnsigned(row[1]); ret->chromEnd = sqlUnsigned(row[2]); ret->name = cloneString(row[3]); ret->score = sqlSigned(row[4]); return ret; } /* it turns out that it isn't just hgLoadBed and custom tracks * that may encounter the r,g,b specification. Any program that * reads bed files may enconter them, so take care of them * at any time. The strchr() function is very fast which will * be a failure in the vast majority of cases parsing integers, * therefore, this shouldn't be too severe a performance hit. */ int itemRgbColumn(char *column9) /* Convert color specification to internal format. */ { int itemRgb = 0; /* Allow comma separated list of rgb values here */ char *comma = strchr(column9, ','); if (comma) { if (-1 == (itemRgb = bedParseRgb(column9))) errAbort("ERROR: expecting r,g,b specification, " "found: '%s'", column9); } else itemRgb = sqlUnsigned(column9); return itemRgb; } struct bed *bedLoadN(char *row[], int wordCount) /* Convert a row of strings to a bed. */ { struct bed * bed; int count; AllocVar(bed); bed->chrom = cloneString(row[0]); bed->chromStart = sqlUnsigned(row[1]); bed->chromEnd = sqlUnsigned(row[2]); if (wordCount > 3) bed->name = cloneString(row[3]); if (wordCount > 4) bed->score = sqlSigned(row[4]); if (wordCount > 5) bed->strand[0] = row[5][0]; if (wordCount > 6) bed->thickStart = sqlUnsigned(row[6]); else bed->thickStart = bed->chromStart; if (wordCount > 7) bed->thickEnd = sqlUnsigned(row[7]); else bed->thickEnd = bed->chromEnd; if (wordCount > 8) bed->itemRgb = itemRgbColumn(row[8]); if (wordCount > 9) bed->blockCount = sqlUnsigned(row[9]); if (wordCount > 10) sqlSignedDynamicArray(row[10], &bed->blockSizes, &count); if (wordCount > 11) sqlSignedDynamicArray(row[11], &bed->chromStarts, &count); if (wordCount > 12) bed->expCount = sqlUnsigned(row[12]); if (wordCount > 13) sqlSignedDynamicArray(row[13], &bed->expIds, &count); if (wordCount > 14) sqlFloatDynamicArray(row[14], &bed->expScores, &count); return bed; } struct bed *bedLoadNAllChrom(char *fileName, int numFields, char* chrom) /* Load bed entries from a tab-separated file that have the given chrom. * Dispose of this with bedFreeList(). */ { struct bed *list = NULL, *el; struct lineFile *lf = lineFileOpen(fileName, TRUE); char *row[numFields]; while (lineFileRow(lf, row)) { el = bedLoadN(row, numFields); if(chrom == NULL || sameString(el->chrom, chrom)) slAddHead(&list, el); else bedFree(&el); } lineFileClose(&lf); slReverse(&list); return list; } void bedLoadAllReturnFieldCountAndRgb(char *fileName, struct bed **retList, int *retFieldCount, boolean *retRgb) /* Load bed of unknown size and return number of fields as well as list of bed items. * Ensures that all lines in bed file have same field count. Also returns whether * column 9 is being used as RGB or not. */ { struct bed *list = NULL; struct lineFile *lf = lineFileOpen(fileName, TRUE); char *line, *row[bedKnownFields]; int fieldCount = 0; boolean isRgb = FALSE; while (lineFileNextReal(lf, &line)) { int numFields = chopByWhite(line, row, ArraySize(row)); if (numFields < 4) errAbort("file %s doesn't appear to be in bed format. At least 4 fields required, got %d", fileName, numFields); if (fieldCount == 0) { fieldCount = numFields; if (fieldCount >= 9) isRgb = (strchr(row[8], ',') != NULL); } else if (fieldCount != numFields) errAbort("Inconsistent number of fields in file. %d on line %d of %s, %d previously.", numFields, lf->lineIx, lf->fileName, fieldCount); slAddHead(&list, bedLoadN(row, fieldCount)); } lineFileClose(&lf); slReverse(&list); *retList = list; *retFieldCount = fieldCount; if (retRgb != NULL) *retRgb = isRgb; } void bedOutFlexible(struct bed *el, int wordCount, FILE *f, char sep, char lastSep, boolean useItemRgb) /* Write a bed of wordCount fields, optionally interpreting field nine as R,G,B values. */ { int i; if (sep == ',') fputc('"',f); fprintf(f, "%s", el->chrom); if (sep == ',') fputc('"',f); fputc(sep,f); fprintf(f, "%u", el->chromStart); fputc(sep,f); fprintf(f, "%u", el->chromEnd); if (wordCount <= 3) { fputc(lastSep, f); return; } fputc(sep,f); if (sep == ',') fputc('"',f); fprintf(f, "%s", el->name); if (sep == ',') fputc('"',f); if (wordCount <= 4) { fputc(lastSep, f); return; } fputc(sep,f); fprintf(f, "%d", el->score); if (wordCount <= 5) { fputc(lastSep, f); return; } fputc(sep,f); if (sep == ',') fputc('"',f); fprintf(f, "%s", el->strand); if (sep == ',') fputc('"',f); if (wordCount <= 6) { fputc(lastSep, f); return; } fputc(sep,f); fprintf(f, "%u", el->thickStart); if (wordCount <= 7) { fputc(lastSep, f); return; } fputc(sep,f); fprintf(f, "%u", el->thickEnd); if (wordCount <= 8) { fputc(lastSep, f); return; } fputc(sep,f); if (useItemRgb) fprintf(f, "%d,%d,%d", (el->itemRgb & 0xff0000) >> 16, (el->itemRgb & 0xff00) >> 8, (el->itemRgb & 0xff)); else fprintf(f, "%u", el->itemRgb); if (wordCount <= 9) { fputc(lastSep, f); return; } fputc(sep,f); fprintf(f, "%d", el->blockCount); if (wordCount <= 10) { fputc(lastSep, f); return; } fputc(sep,f); if (sep == ',') fputc('{',f); for (i=0; iblockCount; ++i) { fprintf(f, "%d", el->blockSizes[i]); fputc(',', f); } if (sep == ',') fputc('}',f); if (wordCount <= 11) { fputc(lastSep, f); return; } fputc(sep,f); if (sep == ',') fputc('{',f); for (i=0; iblockCount; ++i) { fprintf(f, "%d", el->chromStarts[i]); fputc(',', f); } if (sep == ',') fputc('}',f); if (wordCount <= 12) { fputc(lastSep, f); return; } fputc(sep,f); fprintf(f, "%d", el->expCount); if (wordCount <= 13) { fputc(lastSep, f); return; } fputc(sep,f); if (sep == ',') fputc('{',f); for (i=0; iexpCount; ++i) { fprintf(f, "%d", el->expIds[i]); fputc(',', f); } if (sep == ',') fputc('}',f); if (wordCount <= 14) { fputc(lastSep, f); return; } fputc(sep,f); if (sep == ',') fputc('{',f); for (i=0; iexpCount; ++i) { fprintf(f, "%g", el->expScores[i]); fputc(',', f); } if (sep == ',') fputc('}',f); fputc(lastSep,f); } int bedTotalBlockSize(struct bed *bed) /* Return total size of all blocks. */ { int total = 0; int i; if (bed->blockCount == 0) return bed->chromEnd - bed->chromStart; for (i=0; iblockCount; ++i) total += bed->blockSizes[i]; return total; } int bedBlockSizeInRange(struct bed *bed, int rangeStart, int rangeEnd) /* Get size of all parts of all exons between rangeStart and rangeEnd. */ { int total = 0; int i; for (i=0; iblockCount; ++i) { int start = bed->chromStart + bed->chromStarts[i]; int end = start + bed->blockSizes[i]; total += positiveRangeIntersection(start, end, rangeStart, rangeEnd); } return total; } struct bed *cloneBed(struct bed *bed) /* Make an all-newly-allocated copy of a single bed record. */ { struct bed *newBed; if (bed == NULL) return NULL; AllocVar(newBed); newBed->chrom = cloneString(bed->chrom); newBed->chromStart = bed->chromStart; newBed->chromEnd = bed->chromEnd; newBed->name = cloneString(bed->name); newBed->score = bed->score; strncpy(newBed->strand, bed->strand, sizeof(bed->strand)); newBed->thickStart = bed->thickStart; newBed->thickEnd = bed->thickEnd; newBed->itemRgb = bed->itemRgb; newBed->blockCount = bed->blockCount; if (bed->blockCount > 0) { newBed->blockSizes = needMem(sizeof(int) * bed->blockCount); memcpy(newBed->blockSizes, bed->blockSizes, sizeof(int) * bed->blockCount); newBed->chromStarts = needMem(sizeof(int) * bed->blockCount); memcpy(newBed->chromStarts, bed->chromStarts, sizeof(int) * bed->blockCount); } newBed->expCount = bed->expCount; if (bed->expCount > 0) { newBed->expIds = needMem(sizeof(int) * bed->expCount); memcpy(newBed->expIds, bed->expIds, sizeof(int) * bed->expCount); newBed->expScores = needMem(sizeof(float) * bed->expCount); memcpy(newBed->expScores, bed->expScores, sizeof(float) * bed->expCount); } return(newBed); } int bedParseRgb(char *itemRgb) /* parse a string: "r,g,b" into three unsigned char values returned as 24 bit number, or -1 for failure */ { char dupe[64]; int wordCount; char *row[4]; strncpy(dupe, itemRgb, sizeof(dupe)); wordCount = chopString(dupe, ",", row, ArraySize(row)); if ((wordCount != 3) || (!isdigit(row[0][0]) || !isdigit(row[1][0]) || !isdigit(row[2][0]))) return (-1); return ( ((atoi(row[0]) & 0xff) << 16) | ((atoi(row[1]) & 0xff) << 8) | (atoi(row[2]) & 0xff) ); } void bedIntoRangeTree(struct bed *bed, struct rbTree *rangeTree) /* Add all blocks in bed to range tree. For beds without blocks, * add entire bed. */ { int i; if (bed->blockCount == 0) rangeTreeAdd(rangeTree, bed->chromStart, bed->chromEnd); else { for (i=0; i < bed->blockCount; ++i) { int start = bed->chromStart + bed->chromStarts[i]; int end = start + bed->blockSizes[i]; rangeTreeAdd(rangeTree, start, end); } } } struct rbTree *bedToRangeTree(struct bed *bed) /* Convert bed into a range tree. */ { struct rbTree *rangeTree = rangeTreeNew(); bedIntoRangeTree(bed, rangeTree); return rangeTree; } int bedRangeTreeOverlap(struct bed *bed, struct rbTree *rangeTree) /* Return number of bases bed overlaps with rangeTree. */ { int totalOverlap = 0; if (bed->blockCount == 0) totalOverlap = rangeTreeOverlapSize(rangeTree, bed->chromStart, bed->chromEnd); else { int i; for (i=0; i < bed->blockCount; ++i) { int start = bed->chromStart + bed->chromStarts[i]; int end = start + bed->blockSizes[i]; totalOverlap += rangeTreeOverlapSize(rangeTree, start, end); } } return totalOverlap; } int bedSameStrandOverlap(struct bed *a, struct bed *b) /* Return amount of block-level overlap on same strand between a and b */ { /* Make sure on same strand, chromosome, and that overlap * at the non-block level. */ if (a->strand[0] != b->strand[0]) return 0; if (!sameString(a->chrom, b->chrom)) return 0; int outerOverlap = rangeIntersection(a->chromStart, a->chromEnd, b->chromStart, b->chromEnd); if (outerOverlap <= 0) return 0; /* If both beds are non-blocked then we're pretty much done. */ if (a->blockCount == 0 && b->blockCount == 0) return outerOverlap; /* Otherwise make up a range tree containing regions covered by a, * and figure out how much b overlaps it.. */ struct rbTree *rangeTree = bedToRangeTree(a); int overlap = bedRangeTreeOverlap(b, rangeTree); /* Clean up and return result. */ rangeTreeFree(&rangeTree); return overlap; } struct bed *bedThickOnly(struct bed *in) /* Return a bed that only has the thick part. (Which is usually the CDS). */ { if (in->thickStart >= in->thickEnd) return NULL; if (in->expCount != 0 || in->expIds != NULL || in->expScores != NULL) errAbort("Sorry, bedThickOnly only works on beds with up to 12 fields."); /* Allocate output, and fill in simple fields. */ struct bed *out; AllocVar(out); out->chrom = cloneString(in->chrom); out->chromStart = out->thickStart = in->thickStart; out->chromEnd = out->thickEnd = in->thickEnd; out->name = cloneString(in->name); out->strand[0] = in->strand[0]; out->score = in->score; out->itemRgb = in->itemRgb; /* If need be fill in blocks. */ if (in->blockCount > 0) { /* Count up blocks inside CDS. */ int i; int outBlockCount = 0; for (i=0; iblockCount; ++i) { int start = in->chromStart + in->chromStarts[i]; int end = start + in->blockSizes[i]; if (start < in->thickStart) start = in->thickStart; if (end > in->thickEnd) end = in->thickEnd; if (start < end) outBlockCount += 1; } /* This trivieal case shouldn't happen, but just in case, we deal with it. */ if (outBlockCount == 0) { freeMem(out); return NULL; } /* Allocate block arrays for output. */ out->blockCount = outBlockCount; AllocArray(out->chromStarts, outBlockCount); AllocArray(out->blockSizes, outBlockCount); /* Scan through input one more time, copying to out. */ int outBlockIx = 0; for (i=0; iblockCount; ++i) { int start = in->chromStart + in->chromStarts[i]; int end = start + in->blockSizes[i]; if (start < in->thickStart) start = in->thickStart; if (end > in->thickEnd) end = in->thickEnd; if (start < end) { out->chromStarts[outBlockIx] = start - out->chromStart; out->blockSizes[outBlockIx] = end - start; outBlockIx += 1; } } } return out; } char *bedAsDef(int bedFieldCount, int totalFieldCount) /* Return an autoSql definition for a bed of given number of fields. * Normally totalFieldCount is equal to bedFieldCount. If there are extra * fields they are just given the names field16, field17, etc and type string. */ { if (bedFieldCount < 3 || bedFieldCount > 15) errAbort("bedFieldCount is %d, but must be between %d and %d in bedAsDef", bedFieldCount, 3, 15); struct dyString *dy = dyStringNew(0); dyStringAppend(dy, "table bed\n" "\"Browser Extensible Data\"\n" " (\n" " string chrom; \"Reference sequence chromosome or scaffold\"\n" " uint chromStart; \"Start position in chromosome\"\n" " uint chromEnd; \"End position in chromosome\"\n" ); if (bedFieldCount >= 4) dyStringAppend(dy, " string name; \"Name of item.\"\n"); if (bedFieldCount >= 5) dyStringAppend(dy, " uint score; \"Score (0-1000)\"\n"); if (bedFieldCount >= 6) dyStringAppend(dy, " char[1] strand; \"+ or - for strand\"\n"); if (bedFieldCount >= 7) dyStringAppend(dy, " uint thickStart; \"Start of where display should be thick (start codon)\"\n"); if (bedFieldCount >= 8) dyStringAppend(dy, " uint thickEnd; \"End of where display should be thick (stop codon)\"\n"); if (bedFieldCount >= 9) dyStringAppend(dy, " uint reserved; \"Used as itemRgb as of 2004-11-22\"\n"); if (bedFieldCount >= 10) dyStringAppend(dy, " int blockCount; \"Number of blocks\"\n"); if (bedFieldCount >= 11) dyStringAppend(dy, " int[blockCount] blockSizes; \"Comma separated list of block sizes\"\n"); if (bedFieldCount >= 12) dyStringAppend(dy, " int[blockCount] chromStarts; \"Start positions relative to chromStart\"\n"); if (bedFieldCount >= 13) dyStringAppend(dy, " int expCount; \"Experiment count\"\n"); if (bedFieldCount >= 14) dyStringAppend(dy, " int[expCount] expIds; \"Comma separated list of experiment ids. Always 0,1,2,3....\"\n"); if (bedFieldCount >= 15) dyStringAppend(dy, " float[expCount] expScores; \"Comma separated list of experiment scores.\"\n"); int i; for (i=bedFieldCount+1; i<=totalFieldCount; ++i) dyStringPrintf(dy, "lstring field%d; \"Undocumented field\"\n", i+1); dyStringAppend(dy, " )\n"); return dyStringCannibalize(&dy); } void loadAndValidateBedExt(char *row[], int bedFieldCount, int fieldCount, struct lineFile *lf, struct bed * bed, struct asObject *as, boolean isCt, boolean allow1bpOverlap) /* Convert a row of strings to a bed and validate the contents. Abort with message if invalid data. Optionally validate bedPlus via asObject. * If a customTrack, then some errors are tolerated. Possibly allow exons to overlap by one base. */ { int count; int *blockSizes = NULL; int *chromStarts; bed->chrom = row[0]; // note this value is not cloned for speed, callers may need to clone it. // This check is usually redundant since the caller should be checking it against actual chromInfo names // however hgLoadBed might not always have that info available. if (strlen(bed->chrom) >= BB_MAX_CHROM_STRING) // must leave room for 0 terminator lineFileAbort(lf, "chrom [%s] is too long (must not exceed %d characters)", bed->chrom, BB_MAX_CHROM_STRING - 1); if (strlen(bed->chrom) < 1) lineFileAbort(lf, "chrom cannot be blank or empty"); lineFileAllInts(lf, row, 1, &bed->chromStart, FALSE, 4, "integer", FALSE); lineFileAllInts(lf, row, 2, &bed->chromEnd, FALSE, 4, "integer", FALSE); if (bed->chromEnd < bed->chromStart) lineFileAbort(lf, "chromStart after chromEnd (%u > %u)", bed->chromStart, bed->chromEnd); if (bedFieldCount > 3) { bed->name = row[3]; if (strlen(bed->name) > 255) lineFileAbort(lf, "name [%s] is too long (must not exceed 255 characters)", bed->name); if (isCt) bed->name = cloneString(bed->name); } if (bedFieldCount > 4) { lineFileAllInts(lf, row, 4, &bed->score, TRUE, 4, "integer", FALSE); if (!isCt && (bed->score < 0 || bed->score > 1000)) lineFileAbort(lf, "score (%d) must be between 0 and 1000", bed->score); } if (bedFieldCount > 5) { if (!isCt && strlen(row[5]) > 1) lineFileAbort(lf, "Expecting + or - or . in strand, found [%s]",row[5]); bed->strand[0] = row[5][0]; bed->strand[1] = 0; if (bed->strand[0] != '+' && bed->strand[0] != '-' && bed->strand[0] != '.') lineFileAbort(lf, "Expecting + or - or . in strand, found [%s]",row[5]); } if (bedFieldCount > 6) lineFileAllInts(lf, row, 6, &bed->thickStart, FALSE, 4, "integer", FALSE); else bed->thickStart = bed->chromStart; if (bedFieldCount > 7) { lineFileAllInts(lf, row, 7, &bed->thickEnd, FALSE, 4, "integer", FALSE); if (bed->thickEnd < bed->thickStart) lineFileAbort(lf, "thickStart after thickEnd"); if ((bed->thickStart != 0) && ((bed->thickStart < bed->chromStart) || (bed->thickStart > bed->chromEnd))) lineFileAbort(lf, "thickStart out of range (chromStart to chromEnd, or 0 if no CDS)"); if ((bed->thickEnd != 0) && ((bed->thickEnd < bed->chromStart) || (bed->thickEnd > bed->chromEnd))) lineFileAbort(lf, "thickEnd out of range for %s:%u-%u, thick:%u-%u (chromStart to chromEnd, or 0 if no CDS)", bed->name, bed->chromStart, bed->chromEnd, bed->thickStart, bed->thickEnd); } else bed->thickEnd = bed->chromEnd; if (bedFieldCount > 8) { if (strchr(row[8],',')) { unsigned char colors[4]; char *saveColorString = cloneString(row[8]); int numColors = lineFileAllIntsArray(lf, row, 8, colors, sizeof colors, FALSE, 1, "integer", FALSE); if (numColors == 3) { bed->itemRgb = (((unsigned)colors[0]) << 2*8) | (((unsigned)colors[1]) << 1*8) | (unsigned)colors[2]; } else lineFileAbort(lf, "Expecting color to consist of r,g,b values from 0 to 255. Got [%s]", saveColorString); freeMem(saveColorString); } else { lineFileAllInts(lf, row, 8, &bed->itemRgb, FALSE, 4, "integer", FALSE); } } int tempArraySize = 1; // How big arrays are below if (bedFieldCount > 9) { lineFileAllInts(lf, row, 9, &bed->blockCount, FALSE, 4, "integer", FALSE); if (!(bed->blockCount >= 1)) lineFileAbort(lf, "Expecting blockCount (%d) to be 1 or more.", bed->blockCount); tempArraySize = bed->blockCount; } int tempBlockSizes[tempArraySize]; int tempChromStarts[tempArraySize]; int tempExpIds[tempArraySize]; float tempExpScores[tempArraySize]; if (bedFieldCount > 10) { if (isCt) { AllocArray(bed->blockSizes,bed->blockCount+1); // having +1 allows us to detect incorrect size count = lineFileAllIntsArray(lf, row, 10, bed->blockSizes, bed->blockCount+1, TRUE, 4, "integer", TRUE); blockSizes = bed->blockSizes; } else { count = lineFileAllIntsArray(lf, row, 10, tempBlockSizes, tempArraySize, TRUE, 4, "integer", TRUE); blockSizes = tempBlockSizes; } if (count != bed->blockCount) lineFileAbort(lf, "Expecting %d elements in blockSizes list, found at least %d", bed->blockCount, count); #ifdef NOTNOW int i; for (i=0; i < bed->blockCount; i++) { if (!(blockSizes[i] > 0)) lineFileAbort(lf, "BED blockSizes must be greater than 0, blockSize[%d] = %d", i, blockSizes[i]); } #endif } if (bedFieldCount > 11) { int i; if (isCt) { AllocArray(bed->chromStarts,bed->blockCount+1); // having +1 allows us to detect incorrect size count = lineFileAllIntsArray(lf, row, 11, bed->chromStarts, bed->blockCount+1, TRUE, 4, "integer", TRUE); chromStarts = bed->chromStarts; } else { count = lineFileAllIntsArray(lf, row, 11, tempChromStarts, tempArraySize, TRUE, 4, "integer", TRUE); chromStarts = tempChromStarts; } if (count != bed->blockCount) lineFileAbort(lf, "Expecting %d elements in chromStarts list, found at least %d", bed->blockCount, count); // tell the user if they appear to be using absolute starts rather than // relative... easy to forget! Also check block order, coord ranges... if (chromStarts[0] != 0) lineFileAbort(lf, "BED blocks must span chromStart to chromEnd. " "BED chromStarts[0] = %d, must be 0 so that (chromStart + " "chromStarts[0]) equals chromStart.", chromStarts[0]); for (i=1; i < bed->blockCount; i++) { /* printf("%d:%d %s %s s:%d c:%u cs:%u ce:%u csI:%d bsI:%d ls:%d le:%d
    \n", lineIx, i, bed->chrom, bed->name, bed->score, bed->blockCount, bed->chromStart, bed->chromEnd, bed->chromStarts[i], bed->blockSizes[i], lastStart, lastEnd); */ // extra check to give user help for a common problem if (chromStarts[i]+bed->chromStart >= bed->chromEnd) { if (chromStarts[i] >= bed->chromStart) lineFileAbort(lf, "BED chromStarts offsets must be relative to chromStart, " "not absolute. Try subtracting chromStart from each offset " "in chromStarts."); else lineFileAbort(lf, "BED chromStarts[i]+chromStart must be less than chromEnd."); } // chrom blocks must ascend without overlap int fudge = 0; if (allow1bpOverlap) fudge = -1; if (!(chromStarts[i] >= chromStarts[i-1] + blockSizes[i-1] + fudge)) lineFileAbort(lf, "BED blocks must be in ascending order without overlap. Blocks %d and %d overlap.", i-1, i); } // last block-end must match chromEnd i = bed->blockCount-1; if ((bed->chromStart + chromStarts[i] + blockSizes[i]) != bed->chromEnd) { lineFileAbort(lf, "BED blocks must span chromStart to chromEnd. (chromStart + " "chromStarts[last] + blockSizes[last]) must equal chromEnd."); } } if (bedFieldCount > 12) // get the microarray/colored-exon fields { lineFileAllInts(lf, row, 12, &bed->expCount, TRUE, 4, "integer", TRUE); if (!(bed->expCount >= 1)) lineFileAbort(lf, "Expecting expCount (%d) to be 1 or more.", bed->expCount); if (isCt) { AllocArray(bed->expIds,bed->expCount+1); // having +1 allows us to detect incorrect size count = lineFileAllIntsArray(lf, row, 13, bed->expIds, bed->expCount+1, TRUE, 4, "integer", TRUE); } else { count = lineFileAllIntsArray(lf, row, 13, tempExpIds, tempArraySize, TRUE, 4, "integer", TRUE); } if (count != bed->expCount) lineFileAbort(lf, "expecting %d elements in expIds list (bed field 14)", bed->expCount); if (bedFieldCount == 15) { if (isCt) { sqlFloatDynamicArray(row[14], &bed->expScores, &count); } else { count = sqlFloatArray(row[14], tempExpScores, tempArraySize); } if (count != bed->expCount) lineFileAbort(lf, "expecting %d elements in expScores list (bed field 15)", bed->expCount); } } /* Check bedPlus fields are formatted right. */ /* This could form the basis of an .as-validator independent of BED. I suppose it could go in asParse.c */ if (as) { struct hash* linkHash = NULL; /* Validate as-fields */ struct asColumn *asCol = NULL; asCol = as->columnList; int i; // Pre-scan ALL fields for linked fields for (i=0; ilowType->type; if (! (asCol->isList || asCol->isArray)) { if (asTypesIsInt(type)) { if (asCol->isSizeLink) // save the field value and index for later use in validating a list size. { int listSize = 0; // big enough to hold the list count lineFileAllInts(lf, row, i, &listSize, TRUE, 4, "integer", TRUE); if (!linkHash) linkHash = newHash(4); hashAddInt(linkHash, asCol->name, listSize); } } } asCol = asCol->next; } /* Validate bed-plus fields */ asCol = slElementFromIx(as->columnList, bedFieldCount); for (i=bedFieldCount; ilowType->type; if (! (asCol->isList || asCol->isArray)) { if (asTypesIsInt(type)) lineFileAllInts(lf, row, i, NULL, !asTypesIsUnsigned(type), asTypesIntSize(type), asTypesIntSizeDescription(type), FALSE); else if (asTypesIsFloating(type)) lineFileNeedDouble(lf, row, i); else if (type == t_string) { if (strlen(row[i]) > 255) lineFileAbort(lf, "expecting length (%llu) of string (%s) not to exceed 255 in field %s", (unsigned long long)strlen(row[i]), row[i], asCol->name); } } else if (asCol->isList) { if (asTypesIsFloating(type)) { // assure count = #items in list; lightweight validation (better than none) int ix = asColumnFindIx(as->columnList, asCol->linkedSizeName); int count = sqlUnsigned(row[ix]); if (count < 0) lineFileAbort(lf, "expecting nonnegative number in count field for %s list, found %d", asCol->name, asCol->fixedSize); int itemCount = countSeparatedItems(row[i], ','); if (count != itemCount) lineFileAbort(lf, "expecting %d elements in %s list, found %d", count, asCol->name, itemCount); } else if (asTypesIsInt(type)) { count = lineFileAllIntsArray(lf, row, i, NULL, countSeparatedItems(row[i], ','), !asTypesIsUnsigned(type), asTypesIntSize(type), asTypesIntSizeDescription(type), FALSE); if (asCol->fixedSize > 0) { if (asCol->fixedSize != count) lineFileAbort(lf, "expecting %d elements in %s list, found %d", asCol->fixedSize, asCol->name, count); } else { if (!linkHash) lineFileAbort(lf, "linked field %s was not found; it is required for determining listSize of %s" , asCol->linkedSizeName, asCol->name); int listSize = hashIntValDefault(linkHash, asCol->linkedSizeName, -1); if (listSize == -1) lineFileAbort(lf, "linked field %s was not found; it is required for determining listSize of %s" , asCol->linkedSizeName, asCol->name); if (!(listSize >= 1)) lineFileAbort(lf, "invalid list size %d for list %s must be 1 or greater, empty lists are not allowed", listSize, asCol->name); if (!(listSize == count)) lineFileAbort(lf, "expecting %d elements in %s list, found %d", listSize, asCol->name, count); } } } asCol = asCol->next; } hashFree(&linkHash); } } void bed3Free(struct bed3 **pBed) /* Free up bed3 */ { struct bed3 *bed = *pBed; if (bed != NULL) { freeMem(bed->chrom); freez(pBed); } } void bed4Free(struct bed4 **pBed) /* Free up bed4 */ { struct bed4 *bed = *pBed; if (bed != NULL) { freeMem(bed->chrom); freeMem(bed->name); freez(pBed); } } rtracklayer/src/ucsc/basicBed.h0000644000175100017510000001457314614231172017521 0ustar00biocbuildbiocbuild/* basicBed.h contains the basic interface to Browser Extensible Data (bed) files and tables. * The idea behind bed is that the first three fields are defined and required. * A total of 15 fields are defined, and the file can contain any number of these. * In addition after any number of defined fields there can be custom fields that * are not defined in the bed spec. * * There's additional bed-related code in src/hg/inc/bed.h. This module contains the * stuff that's independent of the database and other genomic structures. */ #ifndef BASICBED_H #define BASICBED_H #include "asParse.h" struct bed /* Browser extensible data */ { struct bed *next; /* Next in singly linked list. */ char *chrom; /* Human chromosome or FPC contig */ unsigned chromStart; /* Start position in chromosome */ unsigned chromEnd; /* End position in chromosome */ char *name; /* Name of item */ /* The following items are not loaded by the bedLoad routines. */ int score; /* Score - 0-1000 */ /* Should be uint but there are still some ct users with neg values, .as DOES say uint */ char strand[2]; /* + or -. */ unsigned thickStart; /* Start of where display should be thick (start codon for genes) */ unsigned thickEnd; /* End of where display should be thick (stop codon for genes) */ unsigned itemRgb; /* RGB 8 bits each */ unsigned blockCount; /* Number of blocks. */ int *blockSizes; /* Comma separated list of block sizes. */ int *chromStarts; /* Start positions inside chromosome. Relative to chromStart*/ int expCount; /* Experiment count */ int *expIds; /* Comma separated list of Experiment ids */ float *expScores; /* Comma separated list of Experiment scores. */ char *label; /* Label to use on element if bigBed. */ }; #define bedKnownFields 15 /* Maximum known fields in bed */ #define BB_MAX_CHROM_STRING 255 /* Maximum string length for chromosome length */ struct bed3 /* Browser extensible data - first three fields */ { struct bed3 *next; /* Next in singly linked list. */ char *chrom; /* Human chromosome or FPC contig */ unsigned chromStart; /* Start position in chromosome */ unsigned chromEnd; /* End position in chromosome */ }; void bed3Free(struct bed3 **pBed); /* Free up bed3 */ struct bed4 /* Browser extensible data - first four fields */ { struct bed4 *next; /* Next in singly linked list. */ char *chrom; /* Human chromosome or FPC contig */ unsigned chromStart; /* Start position in chromosome */ unsigned chromEnd; /* End position in chromosome */ char *name; /* Name of item */ }; void bed4Free(struct bed4 **pBed); /* Free up bed4 */ void bedFree(struct bed **pEl); /* Free a single dynamically allocated bed such as created * with bedLoad(). */ #define bedTabOut(el,f) bedOutput(el,f,'\t','\n'); /* Print out bed as a line in a tab-separated file. */ #define bedCommaOut(el,f) bedOutput(el,f,',',','); /* Print out bed as a comma separated list including final comma. */ /* --------------- End of AutoSQL generated code. --------------- */ struct bedLine /* A line in a bed file with chromosome, start position parsed out. */ { struct bedLine *next; /* Next in list. */ char *chrom; /* Chromosome parsed out. */ int chromStart; /* Start position (still in rest of line). */ char *line; /* Rest of line. */ }; struct bedLine *bedLineNew(char *line); /* Create a new bedLine based on tab-separated string s. */ void bedLineFree(struct bedLine **pBl); /* Free up memory associated with bedLine. */ int bedLineCmp(const void *va, const void *vb); /* Compare to sort based on chrom,chromStart. */ struct bed *bedLoad5(char **row); /* Load first five fields of bed. */ struct bed *bedLoadN(char *row[], int wordCount); /* Convert a row of strings to a bed. */ struct bed *bedLoadNAllChrom(char *fileName, int numFields, char* chrom); /* Load bed entries from a tab-separated file that have the given chrom. * Dispose of this with bedFreeList(). */ void bedLoadAllReturnFieldCountAndRgb(char *fileName, struct bed **retList, int *retFieldCount, boolean *retRgb); /* Load bed of unknown size and return number of fields as well as list of bed items. * Ensures that all lines in bed file have same field count. Also returns whether * column 9 is being used as RGB or not. */ void bedOutFlexible(struct bed *el, int wordCount, FILE *f, char sep, char lastSep, boolean useItemRgb); /* Write a bed of wordCount fields, optionally interpreting field nine as R,G,B values. */ int bedTotalBlockSize(struct bed *bed); /* Return total size of all blocks. */ int bedBlockSizeInRange(struct bed *bed, int rangeStart, int rangeEnd); /* Get size of all parts of all exons between rangeStart and rangeEnd. */ struct bed *cloneBed(struct bed *bed); /* Make an all-newly-allocated copy of a single bed record. */ int bedParseRgb(char *itemRgb); /* parse a string: "r,g,b" into three unsigned char values returned as 24 bit number, or -1 for failure */ int bedSameStrandOverlap(struct bed *a, struct bed *b); /* Return amount of block-level overlap on same strand between a and b */ struct rbTree *bedToRangeTree(struct bed *bed); /* Convert bed into a range tree. */ void bedIntoRangeTree(struct bed *bed, struct rbTree *rangeTree); /* Add all blocks in bed to range tree. For beds without blocks, * add entire bed. */ int bedRangeTreeOverlap(struct bed *bed, struct rbTree *rangeTree); /* Return number of bases bed overlaps with rangeTree. */ struct bed *bedThickOnly(struct bed *in); /* Return a bed that only has the thick part. (Which is usually the CDS). */ char *bedAsDef(int bedFieldCount, int totalFieldCount); /* Return an autoSql definition for a bed of given number of fields. * Normally totalFieldCount is equal to bedFieldCount. If there are extra * fields they are just given the names field16, field17, etc and type string. */ void loadAndValidateBedExt(char *row[], int bedFieldCount, int fieldCount, struct lineFile *lf, struct bed * bed, struct asObject *as, boolean isCt, boolean allow1bpOverlap); /* Convert a row of strings to a bed and validate the contents. Abort with message if invalid data. Optionally validate bedPlus via asObject. Possibly allow one base overlap in exons */ int itemRgbColumn(char *column9); /* Convert color specification to internal format. */ #endif /* BASICBED_H */ rtracklayer/src/ucsc/bbiFile.h0000644000175100017510000004702614614231172017360 0ustar00biocbuildbiocbuild/* bbiFile - Big Binary Indexed file. Stuff that's common between bigWig and bigBed. */ #ifndef BBIFILE_H #define BBIFILE_H #include "cirTree.h" #include "linefile.h" #include "localmem.h" /* bigWig/bigBed file structure: * fixedWidthHeader * magic# 4 bytes * version 2 bytes * zoomLevels 2 bytes * chromosomeTreeOffset 8 bytes * fullDataOffset 8 bytes * fullIndexOffset 8 bytes * fieldCount 2 bytes (for bigWig 0) * definedFieldCount 2 bytes (for bigWig 0) * autoSqlOffset 8 bytes (for bigWig 0) (0 if no autoSql information) * totalSummaryOffset 8 bytes (0 in earlier versions of file lacking totalSummary) * uncompressBufSize 4 bytes (Size of uncompression buffer. 0 if uncompressed.) * extensionOffset 8 bytes (Offset to header extension 0 if no such extension) * zoomHeaders there are zoomLevels number of these * reductionLevel 4 bytes * reserved 4 bytes * dataOffset 8 bytes * indexOffset 8 bytes * autoSql string (zero terminated - only present if autoSqlOffset non-zero) * totalSummary - summary of all data in file - only present if totalSummaryOffset non-zero * basesCovered 8 bytes * minVal 8 bytes float (for bigBed minimum depth of coverage) * maxVal 8 bytes float (for bigBed maximum depth of coverage) * sumData 8 bytes float (for bigBed sum of coverage) * sumSquared 8 bytes float (for bigBed sum of coverage squared) * extendedHeader * extensionSize 2 size of extended header in bytes - currently 64 * extraIndexCount 2 number of extra fields we will be indexing * extraIndexListOffset 8 Offset to list of non-chrom/start/end indexes * reserved 48 All zeroes for now * extraIndexList - one of these for each extraIndex * type 2 Type of index. Always 0 for bPlusTree now * fieldCount 2 Number of fields used in this index. Always 1 for now * indexOffset 8 offset for this index in file * reserved 4 All zeroes for now * fieldList - one of these for each field being used in _this_ index * fieldId 2 index of field within record * reserved 2 All zeroes for now * chromosome b+ tree bPlusTree index * full data * sectionCount 8 bytes (item count for bigBeds) * section data section count sections, of three types (bed data for bigBeds) * full index cirTree index * zoom info one of these for each zoom level * zoom data * zoomCount 4 bytes * zoom data there are zoomCount of these items * chromId 4 bytes * chromStart 4 bytes * chromEnd 4 bytes * validCount 4 bytes * minVal 4 bytes float * maxVal 4 bytes float * sumData 4 bytes float * sumSquares 4 bytes float * zoom index cirTree index * extraIndexes [optional] bPlusTreeIndex for each extra field that is indexed * magic# 4 bytes - same as magic number at start of header */ #ifndef CIRTREE_H #include "cirTree.h" #endif #define bbiCurrentVersion 4 /* Version history (of file format, not utilities - corresponds to version field in header) * 1 - Initial release * 1 - Unfortunately when attempting a transparent change to encoders, made the sectionCount * field inconsistent, sometimes not present, sometimes 32 bits. Since offset positions * in index were still accurate this did not break most applications, but it did show * up in the summary section of the Table Browser. * 2 - Made sectionCount consistently 64 bits. Also fixed missing zoomCount in first level of * zoom in files made by bedToBigBed and bedGraphToBigWig. (The older wigToBigWig was fine.) * Added totalSummary section. * 3 - Adding zlib compression. Only active if uncompressBufSize is non-zero in header. * 4 - Fixed problem in encoder for the max field in zoom levels higher than the first one. * Added an extra sig at end of file. */ struct bbiZoomLevel /* A zoom level in bigWig file. */ { struct bbiZoomLevel *next; /* Next in list. */ bits32 reductionLevel; /* How many bases per item */ bits32 reserved; /* Zero for now. */ bits64 dataOffset; /* Offset of data for this level in file. */ bits64 indexOffset; /* Offset of index for this level in file. */ }; struct bbiZoomLevel *bbiBestZoom(struct bbiZoomLevel *levelList, int desiredReduction); /* Return zoom level that is the closest one that is less than or equal to * desiredReduction. */ struct bbiFile /* An open bbiFile */ { struct bbiFile *next; /* Next in list. */ char *fileName; /* Name of file - for better error reporting. */ struct udcFile *udc; /* Open UDC file handle. */ bits32 typeSig; /* bigBedSig or bigWigSig for now. */ boolean isSwapped; /* If TRUE need to byte swap everything. */ struct bptFile *chromBpt; /* Index of chromosomes. */ bits16 version; /* Version number - initially 1. */ bits16 zoomLevels; /* Number of zoom levels. */ bits64 chromTreeOffset; /* Offset to chromosome index. */ bits64 unzoomedDataOffset; /* Start of unzoomed data. */ bits64 unzoomedIndexOffset; /* Start of unzoomed index. */ bits16 fieldCount; /* Number of columns in bed version. */ bits16 definedFieldCount; /* Number of columns using bed standard definitions. */ bits64 asOffset; /* Offset to embedded null-terminated AutoSQL file. */ bits64 totalSummaryOffset; /* Offset to total summary information if any. (On older files have to calculate) */ bits32 uncompressBufSize; /* Size of uncompression buffer, 0 if uncompressed */ bits64 extensionOffset; /* Start of header extension block or 0 if none. */ struct cirTreeFile *unzoomedCir; /* Unzoomed data index in memory - may be NULL. */ struct bbiZoomLevel *levelList; /* List of zoom levels. */ /* Fields based on extension block. */ bits16 extensionSize; /* Size of extension block */ bits16 extraIndexCount; /* Number of extra indexes (on fields other than chrom,start,end */ bits64 extraIndexListOffset; /* Offset to list of extra indexes */ }; struct bbiFile *bbiFileOpen(char *fileName, bits32 sig, char *typeName); /* Open up big wig or big bed file. */ void bbiFileClose(struct bbiFile **pBwf); /* Close down a big wig/big bed file. */ struct fileOffsetSize *bbiOverlappingBlocks(struct bbiFile *bbi, struct cirTreeFile *ctf, char *chrom, bits32 start, bits32 end, bits32 *retChromId); /* Fetch list of file blocks that contain items overlapping chromosome range. */ struct bbiChromIdSize /* We store an id/size pair in chromBpt bPlusTree */ { bits32 chromId; /* Chromosome ID */ bits32 chromSize; /* Chromosome Size */ }; struct bbiChromInfo /* Pair of a name and a 32-bit integer. Used to assign IDs to chromosomes. */ { struct bbiChromInfo *next; char *name; /* Chromosome name */ bits32 id; /* Chromosome ID - a small number usually */ bits32 size; /* Chromosome size in bases */ }; struct bbiChromInfo *bbiChromList(struct bbiFile *bbi); /* Return all chromosomes in file. Dispose of this with bbiChromInfoFreeList. */ void bbiChromInfoFreeList(struct bbiChromInfo **pList); /* Free a list of bbiChromInfo's */ void bbiChromInfoKey(const void *va, char *keyBuf); /* Get key field out of bbiChromInfo. */ void *bbiChromInfoVal(const void *va); /* Get val field out of bbiChromInfo. */ char *bbiCachedChromLookup(struct bbiFile *bbi, int chromId, int lastChromId, char *chromBuf, int chromBufSize); /* Return chromosome name corresponding to chromId. Because this is a bit expensive, * if you are doing this repeatedly pass in the chromId used in the previous call to * this in lastChromId, which will save it from doing the lookup again on the same * chromosome. Pass in -1 to lastChromId if this is the first time or if you can't be * bothered. The chromBufSize should be at greater or equal to bbi->keySize+1. */ struct bbiChromUsage /* Information on how many items per chromosome etc. Used by multipass bbiFile writers. */ { struct bbiChromUsage *next; char *name; /* chromosome name. */ bits32 itemCount; /* Number of items for this chromosome. */ bits32 id; /* Unique ID for chromosome. */ bits32 size; /* Size of chromosome. */ }; enum bbiSummaryType /* Way to summarize data. */ { bbiSumMean = 0, /* Average value */ bbiSumMax = 1, /* Maximum value */ bbiSumMin = 2, /* Minimum value */ bbiSumCoverage = 3, /* Bases in region containing actual data. */ bbiSumStandardDeviation = 4, /* Standard deviation in window. */ }; enum bbiSummaryType bbiSummaryTypeFromString(char *string); /* Return summary type given a descriptive string. */ struct bbiSummary /* A summary type item. */ { struct bbiSummary *next; bits32 chromId; /* ID of associated chromosome. */ bits32 start,end; /* Range of chromosome covered. */ bits32 validCount; /* Count of (bases) with actual data. */ float minVal; /* Minimum value of items */ float maxVal; /* Maximum value of items */ float sumData; /* sum of values for each base. */ float sumSquares; /* sum of squares for each base. */ bits64 fileOffset; /* Offset of summary in file. */ }; #define bbiSummaryFreeList slFreeList struct bbiSummaryOnDisk /* The part of the summary that ends up on disk - in the same order written to disk. */ { bits32 chromId; /* ID of associated chromosome. */ bits32 start,end; /* Range of chromosome covered. */ bits32 validCount; /* Count of (bases) with actual data. */ float minVal; /* Minimum value of items */ float maxVal; /* Maximum value of items */ float sumData; /* sum of values for each base. */ float sumSquares; /* sum of squares for each base. */ }; struct bbiInterval /* Data on a single interval. */ { struct bbiInterval *next; /* Next in list. */ bits32 start, end; /* Position in chromosome, half open. */ double val; /* Value at that position. */ }; typedef struct bbiInterval *(*BbiFetchIntervals)(struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, struct lm *lm); /* A callback function that returns a bbiInterval list. */ void bbiAttachUnzoomedCir(struct bbiFile *bbi); /* Make sure unzoomed cir is attached. */ struct bbiSummaryElement /* An element of a summary from the user side. */ { bits64 validCount; /* Count of (bases) with actual data. */ double minVal; /* Minimum value of items */ double maxVal; /* Maximum value of items */ double sumData; /* sum of values for each base. */ double sumSquares; /* sum of squares for each base. */ }; boolean bbiSummaryArrayExtended(struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, BbiFetchIntervals fetchIntervals, int summarySize, struct bbiSummaryElement *summary); /* Fill in summary with data from indicated chromosome range in bigWig/bigBed file. * Returns FALSE if no data at that position. */ boolean bbiSummaryArray(struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, BbiFetchIntervals fetchIntervals, enum bbiSummaryType summaryType, int summarySize, double *summaryValues); /* Fill in summaryValues with data from indicated chromosome range in bigWig file. * Be sure to initialize summaryValues to a default value, which will not be touched * for regions without data in file. (Generally you want the default value to either * be 0.0 or nan("") depending on the application.) Returns FALSE if no data * at that position. */ /****** Write side of things - implemented in bbiWrite.c. Few people need this. ********/ struct bbiBoundsArray /* Minimum info needed for r-tree indexer - where a section lives on disk and the * range it covers. */ { bits64 offset; /* Offset within file. */ struct cirTreeRange range; /* What is covered. */ }; struct cirTreeRange bbiBoundsArrayFetchKey(const void *va, void *context); /* Fetch bbiBoundsArray key for r-tree */ bits64 bbiBoundsArrayFetchOffset(const void *va, void *context); /* Fetch bbiBoundsArray file offset for r-tree */ struct bbiSumOutStream /* Buffer output to file so have a chance to compress. */ { struct bbiSummaryOnDisk *array; int elCount; int allocCount; FILE *f; boolean doCompress; }; struct bbiSumOutStream *bbiSumOutStreamOpen(int allocCount, FILE *f, boolean doCompress); /* Open new bbiSumOutStream. */ void bbiSumOutStreamClose(struct bbiSumOutStream **pStream); /* Free up bbiSumOutStream */ void bbiSumOutStreamWrite(struct bbiSumOutStream *stream, struct bbiSummary *sum); /* Write out next one to stream. */ void bbiOutputOneSummaryFurtherReduce(struct bbiSummary *sum, struct bbiSummary **pTwiceReducedList, int doubleReductionSize, struct bbiBoundsArray **pBoundsPt, struct bbiBoundsArray *boundsEnd, struct lm *lm, struct bbiSumOutStream *stream); /* Write out sum to file, keeping track of minimal info on it in *pBoundsPt, and also adding * it to second level summary. */ struct bbiSummary *bbiSummarySimpleReduce(struct bbiSummary *list, int reduction, struct lm *lm); /* Do a simple reduction - where among other things the reduction level is an integral * multiple of the previous reduction level, and the list is sorted. Allocate result out of lm. */ void bbiWriteDummyHeader(FILE *f); /* Write out all-zero header, just to reserve space for it. */ void bbiWriteDummyZooms(FILE *f); /* Write out zeroes to reserve space for ten zoom levels. */ void bbiSummaryElementWrite(FILE *f, struct bbiSummaryElement *sum); /* Write out summary element to file. */ void bbiWriteChromInfo(struct bbiChromUsage *usageList, int blockSize, FILE *f); /* Write out information on chromosomes to file. */ void bbiWriteFloat(FILE *f, float val); /* Write out floating point val to file. Mostly to convert from double... */ struct hash *bbiChromSizesFromFile(char *fileName); /* Read two column file into hash keyed by chrom. */ bits64 bbiTotalSummarySize(struct bbiSummary *list); /* Return size on disk of all summaries. */ void bbiChromUsageFree(struct bbiChromUsage **pUsage); /* free a single bbiChromUsage structure */ void bbiChromUsageFreeList(struct bbiChromUsage **pList); /* free a list of bbiChromUsage structures */ struct bbNamedFileChunk /* A name associated with an offset into a possibly large file. Used for extra * indexes in bigBed files. */ { char *name; /* Name of chunk. */ bits64 offset; /* Start in file. */ bits64 size; /* Size in file. */ }; struct bbExIndexMaker /* A helper structure to make indexes beyond primary one. Just used for bigBeds */ { bits16 indexCount; /* Number of extra indexes. */ /* Kind of wish next four fields, all of which are arrays indexed * by the same thing, were a single array of a structure instead. */ bits16 *indexFields; /* array of field ids, one for each extra index. */ int *maxFieldSize; /* array of maximum sizes seen for this field. */ struct bbNamedFileChunk **chunkArrayArray; /* where we keep name/start/size triples */ bits64 *fileOffsets; /* array of file offsets where indexes starts. */ int recordCount; /* number of records in file. */ }; struct bbiChromUsage *bbiChromUsageFromBedFile(struct lineFile *lf, struct hash *chromSizesHash, struct bbExIndexMaker *eim, int *retMinDiff, double *retAveSize, bits64 *retBedCount); /* Go through bed file and collect chromosomes and statistics. If eim parameter is non-NULL * collect max field sizes there too. */ #define bbiMaxZoomLevels 10 /* Max number of zoom levels */ #define bbiResIncrement 4 /* Amount to reduce at each zoom level */ int bbiCalcResScalesAndSizes(int aveSize, int resScales[bbiMaxZoomLevels], int resSizes[bbiMaxZoomLevels]); /* Fill in resScales with amount to zoom at each level, and zero out resSizes based * on average span. Returns the number of zoom levels we actually will use. */ typedef struct bbiSummary *bbiWriteReducedOnceReturnReducedTwice( struct bbiChromUsage *usageList, int fieldCount, struct lineFile *lf, bits32 initialReduction, bits32 initialReductionCount, int zoomIncrement, int blockSize, int itemsPerSlot, boolean doCompress, struct lm *lm, FILE *f, bits64 *retDataStart, bits64 *retIndexStart, struct bbiSummaryElement *totalSum); /* Typedef for a function that writes out data reduced by factor of initial reduction, and * also returns an array of bbiSummaries for the next reduction level. */ int bbiWriteZoomLevels( struct lineFile *lf, /* Input file. */ FILE *f, /* Output. */ int blockSize, /* Size of index block */ int itemsPerSlot, /* Number of data points bundled at lowest level. */ bbiWriteReducedOnceReturnReducedTwice writeReducedOnceReturnReducedTwice, /* callback */ int fieldCount, /* Number of fields in bed (4 for bedGraph) */ boolean doCompress, /* Do we compress. Answer really should be yes! */ bits64 dataSize, /* Size of data on disk (after compression if any). */ struct bbiChromUsage *usageList, /* Result from bbiChromUsageFromBedFile */ int resTryCount, int resScales[], int resSizes[], /* How much to zoom at each level */ bits32 zoomAmounts[bbiMaxZoomLevels], /* Fills in amount zoomed at each level. */ bits64 zoomDataOffsets[bbiMaxZoomLevels], /* Fills in where data starts for each zoom level. */ bits64 zoomIndexOffsets[bbiMaxZoomLevels], /* Fills in where index starts for each level. */ struct bbiSummaryElement *totalSum); /* Write out all the zoom levels and return the number of levels written. Writes * actual zoom amount and the offsets of the zoomed data and index in the last three * parameters. Sorry for all the parameters - it was this or duplicate a big chunk of * code between bedToBigBed and bedGraphToBigWig. */ int bbiCountSectionsNeeded(struct bbiChromUsage *usageList, int itemsPerSlot); /* Count up number of sections needed for data. */ void bbiAddToSummary(bits32 chromId, bits32 chromSize, bits32 start, bits32 end, bits32 validCount, double minVal, double maxVal, double sumData, double sumSquares, int reduction, struct bbiSummary **pOutList); /* Add data range to summary - putting it onto top of list if possible, otherwise * expanding list. */ void bbiAddRangeToSummary(bits32 chromId, bits32 chromSize, bits32 start, bits32 end, double val, int reduction, struct bbiSummary **pOutList); /* Add chromosome range to summary - putting it onto top of list if possible, otherwise * expanding list. */ struct bbiSummary *bbiReduceSummaryList(struct bbiSummary *inList, struct bbiChromInfo *chromInfoArray, int reduction); /* Reduce summary list to another summary list. */ bits64 bbiWriteSummaryAndIndex(struct bbiSummary *summaryList, int blockSize, int itemsPerSlot, boolean doCompress, FILE *f); /* Write out summary and index to summary, returning start position of * summary index. */ boolean bbiFileCheckSigs(char *fileName, bits32 sig, char *typeName); /* check file signatures at beginning and end of file */ struct bbiSummary *bbiSummariesInRegion(struct bbiZoomLevel *zoom, struct bbiFile *bbi, int chromId, bits32 start, bits32 end); /* Return list of all summaries in region at given zoom level of bbiFile. */ #endif /* BBIFILE_H */ rtracklayer/src/ucsc/bbiRead.c0000644000175100017510000005031314614231172017340 0ustar00biocbuildbiocbuild/* bbiRead - Big Binary Indexed file. Stuff that's common between bigWig and bigBed on the * read side. */ /* Copyright (C) 2014 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "linefile.h" #include "hash.h" #include "obscure.h" #include "zlibFace.h" #include "bPlusTree.h" #include "hmmstats.h" #include "cirTree.h" #include "udc.h" #include "bbiFile.h" struct bbiZoomLevel *bbiBestZoom(struct bbiZoomLevel *levelList, int desiredReduction) /* Return zoom level that is the closest one that is less than or equal to * desiredReduction. */ { if (desiredReduction < 0) errAbort("bad value %d for desiredReduction in bbiBestZoom", desiredReduction); if (desiredReduction <= 1) return NULL; int closestDiff = BIGNUM; struct bbiZoomLevel *closestLevel = NULL; struct bbiZoomLevel *level; for (level = levelList; level != NULL; level = level->next) { int diff = desiredReduction - level->reductionLevel; if (diff >= 0 && diff < closestDiff) { closestDiff = diff; closestLevel = level; } } return closestLevel; } boolean bbiFileCheckSigs(char *fileName, bits32 sig, char *typeName) /* check file signatures at beginning and end of file */ { int fd = mustOpenFd(fileName, O_RDONLY); bits32 magic; boolean isSwapped = FALSE; // look for signature at the beginning of the file mustReadFd(fd, &magic, sizeof(magic)); if (magic != sig) { magic = byteSwap32(magic); isSwapped = TRUE; if (magic != sig) return FALSE; } // look for signature at the end of the file mustLseek(fd, -sizeof(magic), SEEK_END); mustReadFd(fd, &magic, sizeof(magic)); mustCloseFd(&fd); if (isSwapped) { magic = byteSwap32(magic); if (magic != sig) return FALSE; } else { if (magic != sig) return FALSE; } return TRUE; } struct bbiFile *bbiFileOpen(char *fileName, bits32 sig, char *typeName) /* Open up big wig or big bed file. */ { /* This code needs to agree with code in two other places currently - bigBedFileCreate, * and bigWigFileCreate. I'm thinking of refactoring to share at least between * bigBedFileCreate and bigWigFileCreate. It'd be great so it could be structured * so that it could send the input in one chromosome at a time, and send in the zoom * stuff only after all the chromosomes are done. This'd potentially reduce the memory * footprint by a factor of 2 or 4. Still, for now it works. -JK */ struct bbiFile *bbi; AllocVar(bbi); bbi->fileName = cloneString(fileName); struct udcFile *udc = bbi->udc = udcFileOpen(fileName, udcDefaultDir()); /* Read magic number at head of file and use it to see if we are proper file type, and * see if we are byte-swapped. */ bits32 magic; boolean isSwapped = FALSE; udcMustRead(udc, &magic, sizeof(magic)); if (magic != sig) { magic = byteSwap32(magic); isSwapped = TRUE; if (magic != sig) errAbort("%s is not a %s file", fileName, typeName); } bbi->typeSig = sig; bbi->isSwapped = isSwapped; /* Read rest of defined bits of header, byte swapping as needed. */ bbi->version = udcReadBits16(udc, isSwapped); bbi->zoomLevels = udcReadBits16(udc, isSwapped); bbi->chromTreeOffset = udcReadBits64(udc, isSwapped); bbi->unzoomedDataOffset = udcReadBits64(udc, isSwapped); bbi->unzoomedIndexOffset = udcReadBits64(udc, isSwapped); bbi->fieldCount = udcReadBits16(udc, isSwapped); bbi->definedFieldCount = udcReadBits16(udc, isSwapped); bbi->asOffset = udcReadBits64(udc, isSwapped); bbi->totalSummaryOffset = udcReadBits64(udc, isSwapped); bbi->uncompressBufSize = udcReadBits32(udc, isSwapped); bbi->extensionOffset = udcReadBits64(udc, isSwapped); /* Read zoom headers. */ int i; struct bbiZoomLevel *level, *levelList = NULL; for (i=0; izoomLevels; ++i) { AllocVar(level); level->reductionLevel = udcReadBits32(udc, isSwapped); level->reserved = udcReadBits32(udc, isSwapped); level->dataOffset = udcReadBits64(udc, isSwapped); level->indexOffset = udcReadBits64(udc, isSwapped); slAddHead(&levelList, level); } slReverse(&levelList); bbi->levelList = levelList; /* Deal with header extension if any. */ if (bbi->extensionOffset != 0) { udcSeek(udc, bbi->extensionOffset); bbi->extensionSize = udcReadBits16(udc, isSwapped); bbi->extraIndexCount = udcReadBits16(udc, isSwapped); bbi->extraIndexListOffset = udcReadBits64(udc, isSwapped); } /* Attach B+ tree of chromosome names and ids. */ udcSeek(udc, bbi->chromTreeOffset); bbi->chromBpt = bptFileAttach(fileName, udc); return bbi; } void bbiFileClose(struct bbiFile **pBwf) /* Close down a big wig/big bed file. */ { struct bbiFile *bwf = *pBwf; if (bwf != NULL) { cirTreeFileDetach(&bwf->unzoomedCir); slFreeList(&bwf->levelList); slFreeList(&bwf->levelList); bptFileDetach(&bwf->chromBpt); udcFileClose(&bwf->udc); freeMem(bwf->fileName); freez(pBwf); } } static void chromIdSizeHandleSwapped(boolean isSwapped, struct bbiChromIdSize *idSize) /* Swap bytes in chromosome Id and Size as needed. */ { if (isSwapped) { idSize->chromId = byteSwap32(idSize->chromId); idSize->chromSize = byteSwap32(idSize->chromSize); } } struct fileOffsetSize *bbiOverlappingBlocks(struct bbiFile *bbi, struct cirTreeFile *ctf, char *chrom, bits32 start, bits32 end, bits32 *retChromId) /* Fetch list of file blocks that contain items overlapping chromosome range. */ { struct bbiChromIdSize idSize; if (!bptFileFind(bbi->chromBpt, chrom, strlen(chrom), &idSize, sizeof(idSize))) return NULL; chromIdSizeHandleSwapped(bbi->isSwapped, &idSize); if (retChromId != NULL) *retChromId = idSize.chromId; return cirTreeFindOverlappingBlocks(ctf, idSize.chromId, start, end); } struct chromNameCallbackContext /* Some stuff that the bPlusTree traverser needs for context. */ { struct bbiChromInfo *list; /* The list we are building. */ boolean isSwapped; /* Need to byte-swap things? */ }; static void chromNameCallback(void *context, void *key, int keySize, void *val, int valSize) /* Callback that captures chromInfo from bPlusTree. */ { struct chromNameCallbackContext *c = context; struct bbiChromInfo *info; struct bbiChromIdSize *idSize = val; assert(valSize == sizeof(*idSize)); chromIdSizeHandleSwapped(c->isSwapped, idSize); AllocVar(info); info->name = cloneStringZ(key, keySize); info->id = idSize->chromId; info->size = idSize->chromSize; slAddHead(&c->list, info); } struct bbiChromInfo *bbiChromList(struct bbiFile *bbi) /* Return list of chromosomes. */ { struct chromNameCallbackContext context; context.list = NULL; context.isSwapped = bbi->isSwapped; bptFileTraverse(bbi->chromBpt, &context, chromNameCallback); slReverse(&context.list); return context.list; } void bbiChromInfoFree(struct bbiChromInfo **pInfo) /* Free up one chromInfo */ { struct bbiChromInfo *info = *pInfo; if (info != NULL) { freeMem(info->name); freez(pInfo); } } void bbiChromInfoFreeList(struct bbiChromInfo **pList) /* Free a list of dynamically allocated bbiChromInfo's */ { struct bbiChromInfo *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; bbiChromInfoFree(&el); } *pList = NULL; } void bbiAttachUnzoomedCir(struct bbiFile *bbi) /* Make sure unzoomed cir is attached. */ { if (bbi->unzoomedCir == NULL) { udcSeek(bbi->udc, bbi->unzoomedIndexOffset); bbi->unzoomedCir = cirTreeFileAttach(bbi->fileName, bbi->udc); } } enum bbiSummaryType bbiSummaryTypeFromString(char *string) /* Return summary type given a descriptive string. */ { if (sameWord(string, "mean") || sameWord(string, "average")) return bbiSumMean; else if (sameWord(string, "max") || sameWord(string, "maximum")) return bbiSumMax; else if (sameWord(string, "min") || sameWord(string, "minimum")) return bbiSumMin; else if (sameWord(string, "coverage") || sameWord(string, "dataCoverage")) return bbiSumCoverage; else if (sameWord(string, "std")) return bbiSumStandardDeviation; else { errAbort("Unknown bbiSummaryType %s", string); return bbiSumMean; /* Keep compiler quiet. */ } } static void bbiSummaryHandleSwapped(struct bbiFile *bbi, struct bbiSummaryOnDisk *in) /* Swap integer fields in summary as needed. */ { if (bbi->isSwapped) { in->chromId = byteSwap32(in->chromId); in->start = byteSwap32(in->start); in->end = byteSwap32(in->end); in->validCount = byteSwap32(in->validCount); in->minVal = byteSwapFloat(in->minVal); in->maxVal = byteSwapFloat(in->maxVal); in->sumData = byteSwapFloat(in->sumData); in->sumSquares = byteSwapFloat(in->sumSquares); } } static struct bbiSummary *bbiSummaryFromOnDisk(struct bbiSummaryOnDisk *in) /* Create a bbiSummary unlinked to anything from input in onDisk format. */ { struct bbiSummary *out; AllocVar(out); out->chromId = in->chromId; out->start = in->start; out->end = in->end; out->validCount = in->validCount; out->minVal = in->minVal; out->maxVal = in->maxVal; out->sumData = in->sumData; out->sumSquares = in->sumSquares; return out; } struct bbiSummary *bbiSummariesInRegion(struct bbiZoomLevel *zoom, struct bbiFile *bbi, int chromId, bits32 start, bits32 end) /* Return list of all summaries in region at given zoom level of bbiFile. */ { struct bbiSummary *sumList = NULL, *sum; struct udcFile *udc = bbi->udc; udcSeek(udc, zoom->indexOffset); struct cirTreeFile *ctf = cirTreeFileAttach(bbi->fileName, bbi->udc); struct fileOffsetSize *blockList = cirTreeFindOverlappingBlocks(ctf, chromId, start, end); struct fileOffsetSize *block, *beforeGap, *afterGap; /* Set up for uncompression optionally. */ char *uncompressBuf = NULL; if (bbi->uncompressBufSize > 0) uncompressBuf = needLargeMem(bbi->uncompressBufSize); /* This loop is a little complicated because we merge the read requests for efficiency, but we * have to then go back through the data one unmerged block at a time. */ for (block = blockList; block != NULL; ) { /* Find contigious blocks and read them into mergedBuf. */ fileOffsetSizeFindGap(block, &beforeGap, &afterGap); bits64 mergedOffset = block->offset; bits64 mergedSize = beforeGap->offset + beforeGap->size - mergedOffset; udcSeek(udc, mergedOffset); char *mergedBuf = needLargeMem(mergedSize); udcMustRead(udc, mergedBuf, mergedSize); char *blockBuf = mergedBuf; /* Loop through individual blocks within merged section. */ for (;block != afterGap; block = block->next) { /* Uncompress if necessary. */ char *blockPt, *blockEnd; if (uncompressBuf) { blockPt = uncompressBuf; int uncSize = zUncompress(blockBuf, block->size, uncompressBuf, bbi->uncompressBufSize); blockEnd = blockPt + uncSize; } else { blockPt = blockBuf; blockEnd = blockPt + block->size; } /* Figure out bounds and number of items in block. */ int blockSize = blockEnd - blockPt; struct bbiSummaryOnDisk *dSum; int itemSize = sizeof(*dSum); assert(blockSize % itemSize == 0); int itemCount = blockSize / itemSize; /* Read in items and convert to memory list format. */ int i; for (i=0; ichromId == chromId) { int s = max(dSum->start, start); int e = min(dSum->end, end); if (s < e) { sum = bbiSummaryFromOnDisk(dSum); slAddHead(&sumList, sum); } } } assert(blockPt == blockEnd); blockBuf += block->size; } freeMem(mergedBuf); } freeMem(uncompressBuf); slFreeList(&blockList); cirTreeFileDetach(&ctf); slReverse(&sumList); return sumList; } static int normalizeCount(struct bbiSummaryElement *el, double countFactor, double minVal, double maxVal, double sumData, double sumSquares) /* normalize statistics to be based on an integer number of valid bases * Integer value is the smallest integer not less than countFactor */ { bits32 validCount = ceil(countFactor); double normFactor = (double)validCount/countFactor; el->validCount = validCount; el->minVal = minVal; el->maxVal = maxVal; el->sumData = sumData * normFactor; el->sumSquares = sumSquares * normFactor; return validCount; } static bits32 bbiSummarySlice(struct bbiFile *bbi, bits32 baseStart, bits32 baseEnd, struct bbiSummary *sumList, struct bbiSummaryElement *el) /* Update retVal with the average value if there is any data in interval. Return number * of valid data bases in interval. */ { bits32 validCount = 0; if (sumList != NULL) { double minVal = sumList->minVal; double maxVal = sumList->maxVal; double sumData = 0, sumSquares = 0; double countFactor = 0.0; struct bbiSummary *sum; for (sum = sumList; sum != NULL && sum->start < baseEnd; sum = sum->next) { int overlap = rangeIntersection(baseStart, baseEnd, sum->start, sum->end); if (overlap > 0) { double overlapFactor = (double)overlap / (sum->end - sum->start); countFactor += sum->validCount * overlapFactor; sumData += sum->sumData * overlapFactor; sumSquares += sum->sumSquares * overlapFactor; if (maxVal < sum->maxVal) maxVal = sum->maxVal; if (minVal > sum->minVal) minVal = sum->minVal; } } if (countFactor > 0) validCount = normalizeCount(el, countFactor, minVal, maxVal, sumData, sumSquares); } return validCount; } static int bbiChromId(struct bbiFile *bbi, char *chrom) /* Return chromosome Id */ { struct bbiChromIdSize idSize; if (!bptFileFind(bbi->chromBpt, chrom, strlen(chrom), &idSize, sizeof(idSize))) return -1; chromIdSizeHandleSwapped(bbi->isSwapped, &idSize); return idSize.chromId; } static boolean bbiSummaryArrayFromZoom(struct bbiZoomLevel *zoom, struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, int summarySize, struct bbiSummaryElement *summary) /* Look up region in index and get data at given zoom level. Summarize this data * in the summary array. */ { boolean result = FALSE; int chromId = bbiChromId(bbi, chrom); if (chromId < 0) return FALSE; struct bbiSummary *sum, *sumList = bbiSummariesInRegion(zoom, bbi, chromId, start, end); if (sumList != NULL) { int i; bits32 baseStart = start, baseEnd; bits32 baseCount = end - start; sum = sumList; for (i=0; iend <= baseStart) sum = sum->next; if (bbiSummarySlice(bbi, baseStart, baseEnd, sum, &summary[i])) result = TRUE; /* Next time round start where we left off. */ baseStart = baseEnd; } slFreeList(&sumList); } return result; } static bits32 bbiIntervalSlice(struct bbiFile *bbi, bits32 baseStart, bits32 baseEnd, struct bbiInterval *intervalList, struct bbiSummaryElement *el) /* Update retVal with the average value if there is any data in interval. Return number * of valid data bases in interval. */ { bits32 validCount = 0; if (intervalList != NULL) { double countFactor = 0; struct bbiInterval *interval; double sumData = 0, sumSquares = 0; double minVal = intervalList->val; double maxVal = intervalList->val; for (interval = intervalList; interval != NULL && interval->start < baseEnd; interval = interval->next) { int overlap = rangeIntersection(baseStart, baseEnd, interval->start, interval->end); if (overlap > 0) { int intervalSize = interval->end - interval->start; double overlapFactor = (double)overlap / intervalSize; double intervalWeight = intervalSize * overlapFactor; countFactor += intervalWeight; sumData += interval->val * intervalWeight; sumSquares += interval->val * interval->val * intervalWeight; if (maxVal < interval->val) maxVal = interval->val; if (minVal > interval->val) minVal = interval->val; } } validCount = normalizeCount(el, countFactor, minVal, maxVal, sumData, sumSquares); } return validCount; } static boolean bbiSummaryArrayFromFull(struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, BbiFetchIntervals fetchIntervals, int summarySize, struct bbiSummaryElement *summary) /* Summarize data, not using zoom. */ { struct bbiInterval *intervalList = NULL, *interval; struct lm *lm = lmInit(0); intervalList = (*fetchIntervals)(bbi, chrom, start, end, lm); boolean result = FALSE; if (intervalList != NULL) { int i; bits32 baseStart = start, baseEnd; bits32 baseCount = end - start; interval = intervalList; for (i=0; iend <= baseStart) interval = interval->next; if (bbiIntervalSlice(bbi, baseStart, end1, interval, &summary[i])) result = TRUE; /* Next time round start where we left off. */ baseStart = baseEnd; } } lmCleanup(&lm); return result; } boolean bbiSummaryArrayExtended(struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, BbiFetchIntervals fetchIntervals, int summarySize, struct bbiSummaryElement *summary) /* Fill in summary with data from indicated chromosome range in bigWig file. * Returns FALSE if no data at that position. */ { boolean result = FALSE; /* Protect from bad input. */ if (start >= end) return result; memset(summary, 0, summarySize * sizeof(summary[0])); /* Figure out what size of data we want. We actually want to get 2 data points per summary * value if possible to minimize the effect of a data point being split between summary pixels. */ bits32 baseSize = end - start; int fullReduction = (baseSize/summarySize); int zoomLevel = fullReduction/2; if (zoomLevel < 0) zoomLevel = 0; /* Get the closest zoom level less than what we're looking for. */ struct bbiZoomLevel *zoom = bbiBestZoom(bbi->levelList, zoomLevel); if (zoom != NULL) result = bbiSummaryArrayFromZoom(zoom, bbi, chrom, start, end, summarySize, summary); else result = bbiSummaryArrayFromFull(bbi, chrom, start, end, fetchIntervals, summarySize, summary); return result; } boolean bbiSummaryArray(struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, BbiFetchIntervals fetchIntervals, enum bbiSummaryType summaryType, int summarySize, double *summaryValues) /* Fill in summaryValues with data from indicated chromosome range in bigWig file. * Be sure to initialize summaryValues to a default value, which will not be touched * for regions without data in file. (Generally you want the default value to either * be 0.0 or nan("") depending on the application.) Returns FALSE if no data * at that position. */ { struct bbiSummaryElement *elements; AllocArray(elements, summarySize); boolean ret = bbiSummaryArrayExtended(bbi, chrom, start, end, fetchIntervals, summarySize, elements); if (ret) { int i; double covFactor = (double)summarySize/(end - start); for (i=0; ivalidCount > 0) { double val; switch (summaryType) { case bbiSumMean: val = el->sumData/el->validCount; break; case bbiSumMax: val = el->maxVal; break; case bbiSumMin: val = el->minVal; break; case bbiSumCoverage: val = covFactor*el->validCount; break; case bbiSumStandardDeviation: val = calcStdFromSums(el->sumData, el->sumSquares, el->validCount); break; default: internalErr(); val = 0.0; break; } summaryValues[i] = val; } } } freeMem(elements); return ret; } char *bbiCachedChromLookup(struct bbiFile *bbi, int chromId, int lastChromId, char *chromBuf, int chromBufSize) /* Return chromosome name corresponding to chromId. Because this is a bit expensive, * if you are doing this repeatedly pass in the chromId used in the previous call to * this in lastChromId, which will save it from doing the lookup again on the same * chromosome. Pass in -1 to lastChromId if this is the first time or if you can't be * bothered. The chromBufSize should be at greater or equal to bbi->keySize+1. */ { if (chromId != lastChromId) bptStringKeyAtPos(bbi->chromBpt, chromId, chromBuf, chromBufSize); return chromBuf; } rtracklayer/src/ucsc/bbiWrite.c0000644000175100017510000005551514614231172017570 0ustar00biocbuildbiocbuild/* bbiWrite.c - Routines to help write bigWig and bigBed files. See also bbiFile.h */ /* Copyright (C) 2014 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "hash.h" #include "linefile.h" #include "sqlNum.h" #include "zlibFace.h" #include "cirTree.h" #include "bPlusTree.h" #include "bbiFile.h" #include "obscure.h" void bbiWriteDummyHeader(FILE *f) /* Write out all-zero header, just to reserve space for it. */ { repeatCharOut(f, 0, 64); } void bbiWriteDummyZooms(FILE *f) /* Write out zeroes to reserve space for ten zoom levels. */ { repeatCharOut(f, 0, bbiMaxZoomLevels * 24); } void bbiSummaryElementWrite(FILE *f, struct bbiSummaryElement *sum) /* Write out summary element to file. */ { writeOne(f, sum->validCount); writeOne(f, sum->minVal); writeOne(f, sum->maxVal); writeOne(f, sum->sumData); writeOne(f, sum->sumSquares); } static int bbiChromInfoCmp(const void *va, const void *vb) /* Sort bbiChromInfo. Unlike most of our sorts this is single rather * than double indirect. */ { const struct bbiChromInfo *a = (const struct bbiChromInfo *)va; const struct bbiChromInfo *b = (const struct bbiChromInfo *)vb; return strcmp(a->name, b->name); } void bbiWriteChromInfo(struct bbiChromUsage *usageList, int blockSize, FILE *f) /* Write out information on chromosomes to file. */ { int chromCount = slCount(usageList); struct bbiChromUsage *usage; /* Allocate and fill in array from list. */ struct bbiChromInfo *chromInfoArray = NULL; int maxChromNameSize = 0; if (chromCount > 0) { AllocArray(chromInfoArray, chromCount); int i; for (i=0, usage = usageList; inext) { char *chromName = usage->name; int len = strlen(chromName); if (len > maxChromNameSize) maxChromNameSize = len; chromInfoArray[i].name = chromName; chromInfoArray[i].id = usage->id; chromInfoArray[i].size = usage->size; } /* Sort so the b-Tree actually works. */ qsort(chromInfoArray, chromCount, sizeof(chromInfoArray[0]), bbiChromInfoCmp); } /* Write chromosome bPlusTree */ int chromBlockSize = min(blockSize, chromCount); bptFileBulkIndexToOpenFile(chromInfoArray, sizeof(chromInfoArray[0]), chromCount, chromBlockSize, bbiChromInfoKey, maxChromNameSize, bbiChromInfoVal, sizeof(chromInfoArray[0].id) + sizeof(chromInfoArray[0].size), f); freeMem(chromInfoArray); } void bbiWriteFloat(FILE *f, float val) /* Write out floating point val to file. Mostly to convert from double... */ { writeOne(f, val); } struct hash *bbiChromSizesFromFile(char *fileName) /* Read two column file into hash keyed by chrom. */ { struct hash *hash = hashNew(0); struct lineFile *lf = lineFileOpen(fileName, TRUE); char *row[2]; while (lineFileRow(lf, row)) hashAddInt(hash, row[0], sqlUnsigned(row[1])); lineFileClose(&lf); return hash; } void bbiChromInfoKey(const void *va, char *keyBuf) /* Get key field out of bbiChromInfo. */ { const struct bbiChromInfo *a = ((struct bbiChromInfo *)va); strcpy(keyBuf, a->name); } void *bbiChromInfoVal(const void *va) /* Get val field out of bbiChromInfo. */ { const struct bbiChromInfo *a = ((struct bbiChromInfo *)va); return (void*)(&a->id); } void bbiChromUsageFree(struct bbiChromUsage **pUsage) /* free a single bbiChromUsage structure */ { struct bbiChromUsage *usage = *pUsage; if (usage != NULL) { freeMem(usage->name); freez(pUsage); } } void bbiChromUsageFreeList(struct bbiChromUsage **pList) /* free a list of bbiChromUsage structures */ { struct bbiChromUsage *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; bbiChromUsageFree(&el); } *pList = NULL; } int bbExIndexMakerMaxIndexField(struct bbExIndexMaker *eim) /* Return the maximum field we have to index. */ { int maxIx = 0; int i; for (i=0; iindexCount; ++i) { int ix = eim->indexFields[i]; if (ix > maxIx) maxIx = ix; } return maxIx; } void bbExIndexMakerUpdateMaxFieldSize(struct bbExIndexMaker *eim, char **row) /* Fold in information about row into bbExIndexMaker into eim->maxFieldSize */ { int i; for (i=0; iindexCount; ++i) { int rowIx = eim->indexFields[i]; int size = strlen(row[rowIx]); if (size > eim->maxFieldSize[i]) eim->maxFieldSize[i] = size; } } struct bbiChromUsage *bbiChromUsageFromBedFile(struct lineFile *lf, struct hash *chromSizesHash, struct bbExIndexMaker *eim, int *retMinDiff, double *retAveSize, bits64 *retBedCount) /* Go through bed file and collect chromosomes and statistics. If eim parameter is non-NULL * collect max field sizes there too. */ { int maxRowSize = (eim == NULL ? 3 : bbExIndexMakerMaxIndexField(eim) + 1); char *row[maxRowSize]; struct hash *uniqHash = hashNew(0); struct bbiChromUsage *usage = NULL, *usageList = NULL; int lastStart = -1; bits32 id = 0; bits64 totalBases = 0, bedCount = 0; int minDiff = BIGNUM; lineFileRemoveInitialCustomTrackLines(lf); for (;;) { int rowSize = lineFileChopNext(lf, row, maxRowSize); if (rowSize == 0) break; lineFileExpectAtLeast(lf, maxRowSize, rowSize); char *chrom = row[0]; int start = lineFileNeedNum(lf, row, 1); int end = lineFileNeedNum(lf, row, 2); if (eim != NULL) bbExIndexMakerUpdateMaxFieldSize(eim, row); if (start > end) { errAbort("end (%d) before start (%d) line %d of %s", end, start, lf->lineIx, lf->fileName); } ++bedCount; totalBases += (end - start); if (usage == NULL || differentString(usage->name, chrom)) { if (hashLookup(uniqHash, chrom)) { errAbort("%s is not sorted at line %d. Please use \"sort -k1,1 -k2,2n\" or bedSort and try again.", lf->fileName, lf->lineIx); } hashAdd(uniqHash, chrom, NULL); struct hashEl *chromHashEl = hashLookup(chromSizesHash, chrom); if (chromHashEl == NULL) errAbort("%s is not found in chromosome sizes file", chrom); int chromSize = ptToInt(chromHashEl->val); AllocVar(usage); usage->name = cloneString(chrom); usage->id = id++; usage->size = chromSize; slAddHead(&usageList, usage); lastStart = -1; } if (end > usage->size) errAbort("End coordinate %d bigger than %s size of %d line %d of %s", end, usage->name, usage->size, lf->lineIx, lf->fileName); usage->itemCount += 1; if (lastStart >= 0) { int diff = start - lastStart; if (diff < minDiff) { if (diff < 0) errAbort("%s is not sorted at line %d. Please use \"sort -k1,1 -k2,2n\" or bedSort and try again.", lf->fileName, lf->lineIx); minDiff = diff; } } lastStart = start; } slReverse(&usageList); double aveSize = 0; if (bedCount > 0) aveSize = (double)totalBases/bedCount; *retMinDiff = minDiff; *retAveSize = aveSize; *retBedCount = bedCount; freeHash(&uniqHash); return usageList; } int bbiCalcResScalesAndSizes(int aveSize, int resScales[bbiMaxZoomLevels], int resSizes[bbiMaxZoomLevels]) /* Fill in resScales with amount to zoom at each level, and zero out resSizes based * on average span. Returns the number of zoom levels we actually will use. */ { int resTryCount = bbiMaxZoomLevels, resTry; int resIncrement = bbiResIncrement; int minZoom = 10; int res = aveSize; if (res < minZoom) res = minZoom; for (resTry = 0; resTry < resTryCount; ++resTry) { resSizes[resTry] = 0; resScales[resTry] = res; // if aveSize is large, then the initial value of res is large, and we // and we cannot do all 10 levels without overflowing res* integers and other related variables. if (res > 1000000000) { resTryCount = resTry + 1; verbose(2, "resTryCount reduced from 10 to %d\n", resTryCount); break; } res *= resIncrement; } return resTryCount; } int bbiWriteZoomLevels( struct lineFile *lf, /* Input file. */ FILE *f, /* Output. */ int blockSize, /* Size of index block */ int itemsPerSlot, /* Number of data points bundled at lowest level. */ bbiWriteReducedOnceReturnReducedTwice writeReducedOnceReturnReducedTwice, /* callback */ int fieldCount, /* Number of fields in bed (4 for bedGraph) */ boolean doCompress, /* Do we compress. Answer really should be yes! */ bits64 dataSize, /* Size of data on disk (after compression if any). */ struct bbiChromUsage *usageList, /* Result from bbiChromUsageFromBedFile */ int resTryCount, int resScales[], int resSizes[], /* How much to zoom at each level */ bits32 zoomAmounts[bbiMaxZoomLevels], /* Fills in amount zoomed at each level. */ bits64 zoomDataOffsets[bbiMaxZoomLevels], /* Fills in where data starts for each zoom level. */ bits64 zoomIndexOffsets[bbiMaxZoomLevels], /* Fills in where index starts for each level. */ struct bbiSummaryElement *totalSum) /* Write out all the zoom levels and return the number of levels written. Writes * actual zoom amount and the offsets of the zoomed data and index in the last three * parameters. Sorry for all the parameters - it was this or duplicate a big chunk of * code between bedToBigBed and bedGraphToBigWig. */ { /* Write out first zoomed section while storing in memory next zoom level. */ assert(resTryCount > 0); int maxReducedSize = dataSize/2; int initialReduction = 0, initialReducedCount = 0; /* Figure out initialReduction for zoom - one that is maxReducedSize or less. */ int resTry; for (resTry = 0; resTry < resTryCount; ++resTry) { bits64 reducedSize = resSizes[resTry] * sizeof(struct bbiSummaryOnDisk); if (doCompress) reducedSize /= 2; // Estimate! if (reducedSize <= maxReducedSize) { initialReduction = resScales[resTry]; initialReducedCount = resSizes[resTry]; break; } } verbose(2, "initialReduction %d, initialReducedCount = %d\n", initialReduction, initialReducedCount); /* Force there to always be at least one zoom. It may waste a little space on small * files, but it makes files more uniform, and avoids special case code for calculating * overall file summary. */ if (initialReduction == 0) { initialReduction = resScales[0]; initialReducedCount = resSizes[0]; } /* Call routine to make the initial zoom level and also a bit of work towards further levels. */ struct lm *lm = lmInit(0); int zoomIncrement = bbiResIncrement; // lineFileRewind(lf); struct bbiSummary *rezoomedList = writeReducedOnceReturnReducedTwice(usageList, fieldCount, lf, initialReduction, initialReducedCount, zoomIncrement, blockSize, itemsPerSlot, doCompress, lm, f, &zoomDataOffsets[0], &zoomIndexOffsets[0], totalSum); verboseTime(2, "writeReducedOnceReturnReducedTwice"); zoomAmounts[0] = initialReduction; int zoomLevels = 1; /* Loop around to do any additional levels of zoom. */ int zoomCount = initialReducedCount; int reduction = initialReduction * zoomIncrement; while (zoomLevels < bbiMaxZoomLevels) { int rezoomCount = slCount(rezoomedList); if (rezoomCount >= zoomCount) break; zoomCount = rezoomCount; zoomDataOffsets[zoomLevels] = ftell(f); zoomIndexOffsets[zoomLevels] = bbiWriteSummaryAndIndex(rezoomedList, blockSize, itemsPerSlot, doCompress, f); zoomAmounts[zoomLevels] = reduction; ++zoomLevels; reduction *= zoomIncrement; rezoomedList = bbiSummarySimpleReduce(rezoomedList, reduction, lm); } lmCleanup(&lm); verboseTime(2, "further reductions"); return zoomLevels; } int bbiCountSectionsNeeded(struct bbiChromUsage *usageList, int itemsPerSlot) /* Count up number of sections needed for data. */ { struct bbiChromUsage *usage; int count = 0; for (usage = usageList; usage != NULL; usage = usage->next) { int countOne = (usage->itemCount + itemsPerSlot - 1)/itemsPerSlot; count += countOne; verbose(2, "%s %d, %d blocks of %d\n", usage->name, usage->itemCount, countOne, itemsPerSlot); } return count; } void bbiAddToSummary(bits32 chromId, bits32 chromSize, bits32 start, bits32 end, bits32 validCount, double minVal, double maxVal, double sumData, double sumSquares, int reduction, struct bbiSummary **pOutList) /* Add data range to summary - putting it onto top of list if possible, otherwise * expanding list. */ { struct bbiSummary *sum = *pOutList; if (end > chromSize) // Avoid pathological clipping situation on bad input end = chromSize; while (start < end) { /* See if need to allocate a new summary. */ if (sum == NULL || sum->chromId != chromId || sum->end <= start) { struct bbiSummary *newSum; AllocVar(newSum); newSum->chromId = chromId; if (sum == NULL || sum->chromId != chromId || sum->end + reduction <= start) newSum->start = start; else newSum->start = sum->end; newSum->end = newSum->start + reduction; if (newSum->end > chromSize) newSum->end = chromSize; newSum->minVal = minVal; newSum->maxVal = maxVal; sum = newSum; slAddHead(pOutList, sum); } /* Figure out amount of overlap between current summary and item */ int overlap = rangeIntersection(start, end, sum->start, sum->end); if (overlap <= 0) { warn("%u %u doesn't intersect %u %u, chromId %u chromSize %u", start, end, sum->start, sum->end, chromId, chromSize); internalErr(); } int itemSize = end - start; double overlapFactor = (double)overlap/itemSize; /* Fold overlapping bits into output. */ sum->validCount += overlapFactor * validCount; if (sum->minVal > minVal) sum->minVal = minVal; if (sum->maxVal < maxVal) sum->maxVal = maxVal; sum->sumData += overlapFactor * sumData; sum->sumSquares += overlapFactor * sumSquares; /* Advance over overlapping bits. */ start += overlap; } } void bbiAddRangeToSummary(bits32 chromId, bits32 chromSize, bits32 start, bits32 end, double val, int reduction, struct bbiSummary **pOutList) /* Add chromosome range to summary - putting it onto top of list if possible, otherwise * expanding list. */ { int size = end-start; double sum = size*val; double sumSquares = sum*val; bbiAddToSummary(chromId, chromSize, start, end, size, val, val, sum, sumSquares, reduction, pOutList); } struct bbiSummary *bbiReduceSummaryList(struct bbiSummary *inList, struct bbiChromInfo *chromInfoArray, int reduction) /* Reduce summary list to another summary list. */ { struct bbiSummary *outList = NULL; struct bbiSummary *sum; for (sum = inList; sum != NULL; sum = sum->next) bbiAddToSummary(sum->chromId, chromInfoArray[sum->chromId].size, sum->start, sum->end, sum->validCount, sum->minVal, sum->maxVal, sum->sumData, sum->sumSquares, reduction, &outList); slReverse(&outList); return outList; } bits64 bbiTotalSummarySize(struct bbiSummary *list) /* Return size on disk of all summaries. */ { struct bbiSummary *el; bits64 total = 0; for (el = list; el != NULL; el = el->next) total += sizeof(struct bbiSummaryOnDisk); return total; } static bits64 bbiSummaryFetchOffset(const void *va, void *context) /* Fetch bbiSummary file offset for r-tree */ { const struct bbiSummary *a = *((struct bbiSummary **)va); return a->fileOffset; } static struct cirTreeRange bbiSummaryFetchKey(const void *va, void *context) /* Fetch bbiSummary key for r-tree */ { struct cirTreeRange res; const struct bbiSummary *a = *((struct bbiSummary **)va); res.chromIx = a->chromId; res.start = a->start; res.end = a->end; return res; } static bits64 bbiWriteSummaryAndIndexComp(struct bbiSummary *summaryList, int blockSize, int itemsPerSlot, FILE *f) /* Write out summary and index to summary uncompressed, returning start position of * summary index. */ { bits32 i, count = slCount(summaryList); struct bbiSummary **summaryArray; AllocArray(summaryArray, count); writeOne(f, count); struct bbiSummary *summary = summaryList; /* Figure out max size of uncompressed and compressed blocks. */ bits32 itemSize = sizeof(summary->chromId) + sizeof(summary->start) + sizeof(summary->end) + sizeof(summary->validCount) + 4*sizeof(float); int uncBufSize = itemSize * itemsPerSlot; char uncBuf[uncBufSize]; int compBufSize = zCompBufSize(uncBufSize); char compBuf[compBufSize]; /* Loop through compressing and writing one slot at a time. */ bits32 itemsLeft = count; int sumIx = 0; while (itemsLeft > 0) { bits32 itemsInSlot = itemsLeft; if (itemsInSlot > itemsPerSlot) itemsInSlot = itemsPerSlot; char *writePt = uncBuf; bits64 filePos = ftell(f); for (i=0; ichromId); memWriteOne(&writePt, summary->start); memWriteOne(&writePt, summary->end); memWriteOne(&writePt, summary->validCount); memWriteFloat(&writePt, summary->minVal); memWriteFloat(&writePt, summary->maxVal); memWriteFloat(&writePt, summary->sumData); memWriteFloat(&writePt, summary->sumSquares); summary->fileOffset = filePos; summary = summary->next; if (summary == NULL) break; } bits32 uncSize = writePt - uncBuf; int compSize = zCompress(uncBuf, uncSize, compBuf, compBufSize); mustWrite(f, compBuf, compSize); itemsLeft -= itemsInSlot; } bits64 indexOffset = ftell(f); cirTreeFileBulkIndexToOpenFile(summaryArray, sizeof(summaryArray[0]), count, blockSize, itemsPerSlot, NULL, bbiSummaryFetchKey, bbiSummaryFetchOffset, indexOffset, f); freez(&summaryArray); return indexOffset; } static bits64 bbiWriteSummaryAndIndexUnc(struct bbiSummary *summaryList, int blockSize, int itemsPerSlot, FILE *f) /* Write out summary and index to summary compressed, returning start position of * summary index. */ { bits32 i, count = slCount(summaryList); struct bbiSummary **summaryArray; AllocArray(summaryArray, count); writeOne(f, count); struct bbiSummary *summary; for (summary = summaryList, i=0; summary != NULL; summary = summary->next, ++i) { summaryArray[i] = summary; summary->fileOffset = ftell(f); writeOne(f, summary->chromId); writeOne(f, summary->start); writeOne(f, summary->end); writeOne(f, summary->validCount); bbiWriteFloat(f, summary->minVal); bbiWriteFloat(f, summary->maxVal); bbiWriteFloat(f, summary->sumData); bbiWriteFloat(f, summary->sumSquares); } bits64 indexOffset = ftell(f); cirTreeFileBulkIndexToOpenFile(summaryArray, sizeof(summaryArray[0]), count, blockSize, itemsPerSlot, NULL, bbiSummaryFetchKey, bbiSummaryFetchOffset, indexOffset, f); freez(&summaryArray); return indexOffset; } bits64 bbiWriteSummaryAndIndex(struct bbiSummary *summaryList, int blockSize, int itemsPerSlot, boolean doCompress, FILE *f) /* Write out summary and index to summary, returning start position of * summary index. */ { if (doCompress) return bbiWriteSummaryAndIndexComp(summaryList, blockSize, itemsPerSlot, f); else return bbiWriteSummaryAndIndexUnc(summaryList, blockSize, itemsPerSlot, f); } struct cirTreeRange bbiBoundsArrayFetchKey(const void *va, void *context) /* Fetch bbiBoundsArray key for r-tree */ { const struct bbiBoundsArray *a = ((struct bbiBoundsArray *)va); return a->range; } bits64 bbiBoundsArrayFetchOffset(const void *va, void *context) /* Fetch bbiBoundsArray file offset for r-tree */ { const struct bbiBoundsArray *a = ((struct bbiBoundsArray *)va); return a->offset; } struct bbiSumOutStream *bbiSumOutStreamOpen(int allocCount, FILE *f, boolean doCompress) /* Allocate new bbiSumOutStream. */ { struct bbiSumOutStream *stream; AllocVar(stream); AllocArray(stream->array, allocCount); stream->allocCount = allocCount; stream->f = f; stream->doCompress = doCompress; return stream; } void bbiSumOutStreamFlush(struct bbiSumOutStream *stream) /* Flush out any pending input. */ { if (stream->elCount != 0) { int uncSize = stream->elCount * sizeof(stream->array[0]); if (stream->doCompress) { int compBufSize = zCompBufSize(uncSize); char compBuf[compBufSize]; int compSize = zCompress(stream->array, uncSize, compBuf, compBufSize); mustWrite(stream->f, compBuf, compSize); } else { mustWrite(stream->f, stream->array, uncSize); } stream->elCount = 0; } } void bbiSumOutStreamClose(struct bbiSumOutStream **pStream) /* Free up bbiSumOutStream */ { struct bbiSumOutStream *stream = *pStream; if (stream != NULL) { bbiSumOutStreamFlush(stream); freeMem(stream->array); freez(pStream); } } void bbiSumOutStreamWrite(struct bbiSumOutStream *stream, struct bbiSummary *sum) /* Write out next one to stream. */ { int elCount = stream->elCount; struct bbiSummaryOnDisk *a = &stream->array[elCount]; a->chromId = sum->chromId; a->start = sum->start; a->end = sum->end; a->validCount = sum->validCount; a->minVal = sum->minVal; a->maxVal = sum->maxVal; a->sumData = sum->sumData; a->sumSquares = sum->sumSquares; elCount += 1; stream->elCount = elCount; if (elCount >= stream->allocCount) bbiSumOutStreamFlush(stream); } void bbiOutputOneSummaryFurtherReduce(struct bbiSummary *sum, struct bbiSummary **pTwiceReducedList, int doubleReductionSize, struct bbiBoundsArray **pBoundsPt, struct bbiBoundsArray *boundsEnd, struct lm *lm, struct bbiSumOutStream *stream) /* Write out sum to file, keeping track of minimal info on it in *pBoundsPt, and also adding * it to second level summary. */ { /* Get place to store file offset etc and make sure we have not gone off end. */ struct bbiBoundsArray *bounds = *pBoundsPt; assert(bounds < boundsEnd); *pBoundsPt += 1; /* Fill in bounds info. */ bounds->offset = ftell(stream->f); bounds->range.chromIx = sum->chromId; bounds->range.start = sum->start; bounds->range.end = sum->end; /* Write out summary info. */ bbiSumOutStreamWrite(stream, sum); /* Fold summary info into pTwiceReducedList. */ struct bbiSummary *twiceReduced = *pTwiceReducedList; if (twiceReduced == NULL || twiceReduced->chromId != sum->chromId || twiceReduced->start + doubleReductionSize < sum->end) { lmAllocVar(lm, twiceReduced); *twiceReduced = *sum; slAddHead(pTwiceReducedList, twiceReduced); } else { twiceReduced->end = sum->end; twiceReduced->validCount += sum->validCount; if (sum->minVal < twiceReduced->minVal) twiceReduced->minVal = sum->minVal; if (sum->maxVal > twiceReduced->maxVal) twiceReduced->maxVal = sum->maxVal; twiceReduced->sumData += sum->sumData; twiceReduced->sumSquares += sum->sumSquares; } } struct bbiSummary *bbiSummarySimpleReduce(struct bbiSummary *list, int reduction, struct lm *lm) /* Do a simple reduction - where among other things the reduction level is an integral * multiple of the previous reduction level, and the list is sorted. Allocate result out of lm. */ { struct bbiSummary *newList = NULL, *sum, *newSum = NULL; for (sum = list; sum != NULL; sum = sum->next) { if (newSum == NULL || newSum->chromId != sum->chromId || sum->end > newSum->start + reduction) { lmAllocVar(lm, newSum); *newSum = *sum; slAddHead(&newList, newSum); } else { assert(newSum->end < sum->end); // check sorted input assumption newSum->end = sum->end; newSum->validCount += sum->validCount; if (newSum->minVal > sum->minVal) newSum->minVal = sum->minVal; if (newSum->maxVal < sum->maxVal) newSum->maxVal = sum->maxVal; newSum->sumData += sum->sumData; newSum->sumSquares += sum->sumSquares; } } slReverse(&newList); return newList; } rtracklayer/src/ucsc/bigBed.c0000644000175100017510000003161414614231172017167 0ustar00biocbuildbiocbuild/* bigBed - interface to binary file with bed-style values (that is a bunch of * possibly overlapping regions. */ /* Copyright (C) 2013 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "hash.h" #include "linefile.h" #include "obscure.h" #include "dystring.h" #include "rangeTree.h" #include "cirTree.h" #include "bPlusTree.h" #include "basicBed.h" #include "asParse.h" #include "zlibFace.h" #include "sig.h" #include "udc.h" #include "bbiFile.h" #include "bigBed.h" struct bbiFile *bigBedFileOpen(char *fileName) /* Open up big bed file. */ { return bbiFileOpen(fileName, bigBedSig, "big bed"); } struct bigBedInterval *bigBedIntervalQuery(struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, int maxItems, struct lm *lm) /* Get data for interval. Return list allocated out of lm. Set maxItems to maximum * number of items to return, or to 0 for all items. */ { struct bigBedInterval *el, *list = NULL; int itemCount = 0; bbiAttachUnzoomedCir(bbi); // Find blocks with padded start and end to make sure we include zero-length insertions: bits32 paddedStart = (start > 0) ? start-1 : start; bits32 paddedEnd = end+1; bits32 chromId; struct fileOffsetSize *blockList = bbiOverlappingBlocks(bbi, bbi->unzoomedCir, chrom, paddedStart, paddedEnd, &chromId); struct fileOffsetSize *block, *beforeGap, *afterGap; struct udcFile *udc = bbi->udc; boolean isSwapped = bbi->isSwapped; /* Set up for uncompression optionally. */ char *uncompressBuf = NULL; if (bbi->uncompressBufSize > 0) uncompressBuf = needLargeMem(bbi->uncompressBufSize); char *mergedBuf = NULL; for (block = blockList; block != NULL; ) { /* Find contigious blocks and read them into mergedBuf. */ fileOffsetSizeFindGap(block, &beforeGap, &afterGap); bits64 mergedOffset = block->offset; bits64 mergedSize = beforeGap->offset + beforeGap->size - mergedOffset; udcSeek(udc, mergedOffset); mergedBuf = needLargeMem(mergedSize); udcMustRead(udc, mergedBuf, mergedSize); char *blockBuf = mergedBuf; /* Loop through individual blocks within merged section. */ for (;block != afterGap; block = block->next) { /* Uncompress if necessary. */ char *blockPt, *blockEnd; if (uncompressBuf) { blockPt = uncompressBuf; int uncSize = zUncompress(blockBuf, block->size, uncompressBuf, bbi->uncompressBufSize); blockEnd = blockPt + uncSize; } else { blockPt = blockBuf; blockEnd = blockPt + block->size; } while (blockPt < blockEnd) { /* Read next record into local variables. */ bits32 chr = memReadBits32(&blockPt, isSwapped); bits32 s = memReadBits32(&blockPt, isSwapped); bits32 e = memReadBits32(&blockPt, isSwapped); /* calculate length of rest of bed fields */ int restLen = strlen(blockPt); /* If we're actually in range then copy it into a new element and add to list. */ if (chr == chromId && ((s < end && e > start) // Make sure to include zero-length insertion elements at start or end: || (s == e && (s == end || e == start)))) { ++itemCount; if (maxItems > 0 && itemCount > maxItems) break; lmAllocVar(lm, el); el->start = s; el->end = e; if (restLen > 0) el->rest = lmCloneStringZ(lm, blockPt, restLen); el->chromId = chromId; slAddHead(&list, el); } // move blockPt pointer to end of previous bed blockPt += restLen + 1; } if (maxItems > 0 && itemCount > maxItems) break; blockBuf += block->size; } if (maxItems > 0 && itemCount > maxItems) break; freez(&mergedBuf); } freez(&mergedBuf); freeMem(uncompressBuf); slFreeList(&blockList); slReverse(&list); return list; } int bigBedIntervalToRow(struct bigBedInterval *interval, char *chrom, char *startBuf, char *endBuf, char **row, int rowSize) /* Convert bigBedInterval into an array of chars equivalent to what you'd get by * parsing the bed file. The startBuf and endBuf are used to hold the ascii representation of * start and end. Note that the interval->rest string will have zeroes inserted as a side effect. */ { int fieldCount = 3; sprintf(startBuf, "%u", interval->start); sprintf(endBuf, "%u", interval->end); row[0] = chrom; row[1] = startBuf; row[2] = endBuf; if (!isEmpty(interval->rest)) { int wordCount = chopByChar(cloneString(interval->rest), '\t', row+3, rowSize-3); fieldCount += wordCount; } return fieldCount; } static struct bbiInterval *bigBedCoverageIntervals(struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, struct lm *lm) /* Return intervals where the val is the depth of coverage. */ { /* Get list of overlapping intervals */ struct bigBedInterval *bi, *biList = bigBedIntervalQuery(bbi, chrom, start, end, 0, lm); if (biList == NULL) return NULL; /* Make a range tree that collects coverage. */ struct rbTree *rangeTree = rangeTreeNew(); for (bi = biList; bi != NULL; bi = bi->next) rangeTreeAddToCoverageDepth(rangeTree, bi->start, bi->end); struct range *range, *rangeList = rangeTreeList(rangeTree); /* Convert rangeList to bbiInterval list. */ struct bbiInterval *bwi, *bwiList = NULL; for (range = rangeList; range != NULL; range = range->next) { lmAllocVar(lm, bwi); bwi->start = range->start; if (bwi->start < start) bwi->start = start; bwi->end = range->end; if (bwi->end > end) bwi->end = end; bwi->val = ptToInt(range->val); slAddHead(&bwiList, bwi); } slReverse(&bwiList); /* Clean up and go home. */ rangeTreeFree(&rangeTree); return bwiList; } struct offsetSize /* Simple file offset and file size. */ { bits64 offset; bits64 size; }; static int cmpOffsetSizeRef(const void *va, const void *vb) /* Compare to sort slRef pointing to offsetSize. Sort is kind of hokey, * but guarantees all items that are the same will be next to each other * at least, which is all we care about. */ { const struct slRef *a = *((struct slRef **)va); const struct slRef *b = *((struct slRef **)vb); return memcmp(a->val, b->val, sizeof(struct offsetSize)); } static struct fileOffsetSize *fosFromRedundantBlockList(struct slRef **pBlockList, boolean isSwapped) /* Convert from list of references to offsetSize format to list of fileOffsetSize * format, while removing redundancy. Sorts *pBlockList as a side effect. */ { /* Sort input so it it easy to uniquify. */ slSort(pBlockList, cmpOffsetSizeRef); struct slRef *blockList = *pBlockList; /* Make new fileOffsetSize for each unique offsetSize. */ struct fileOffsetSize *fosList = NULL, *fos; struct offsetSize lastOffsetSize = {0,0}; struct slRef *blockRef; for (blockRef = blockList; blockRef != NULL; blockRef = blockRef->next) { if (memcmp(&lastOffsetSize, blockRef->val, sizeof(lastOffsetSize)) != 0) { memcpy(&lastOffsetSize, blockRef->val, sizeof(lastOffsetSize)); AllocVar(fos); if (isSwapped) { fos->offset = byteSwap64(lastOffsetSize.offset); fos->size = byteSwap64(lastOffsetSize.size); } else { fos->offset = lastOffsetSize.offset; fos->size = lastOffsetSize.size; } slAddHead(&fosList, fos); } } slReverse(&fosList); return fosList; } static struct fileOffsetSize *bigBedChunksMatchingName(struct bbiFile *bbi, struct bptFile *index, char *name) /* Get list of file chunks that match name. Can slFreeList this when done. */ { struct slRef *blockList = bptFileFindMultiple(index, name, strlen(name), sizeof(struct offsetSize)); struct fileOffsetSize *fosList = fosFromRedundantBlockList(&blockList, bbi->isSwapped); slRefFreeListAndVals(&blockList); return fosList; } static struct fileOffsetSize *bigBedChunksMatchingNames(struct bbiFile *bbi, struct bptFile *index, char **names, int nameCount) /* Get list of file chunks that match any of the names. Can slFreeList this when done. */ { /* Go through all names and make a blockList that includes all blocks with any hit to any name. * Many of these blocks will occur multiple times. */ struct slRef *blockList = NULL; int nameIx; for (nameIx = 0; nameIx < nameCount; ++nameIx) { char *name = names[nameIx]; struct slRef *oneList = bptFileFindMultiple(index, name, strlen(name), sizeof(struct offsetSize)); blockList = slCat(oneList, blockList); } /* Create nonredundant list of blocks. */ struct fileOffsetSize *fosList = fosFromRedundantBlockList(&blockList, bbi->isSwapped); /* Clean up and resturn result. */ slRefFreeListAndVals(&blockList); return fosList; } typedef boolean (*BbFirstWordMatch)(char *line, int fieldIx, void *target); /* A function that returns TRUE if first word in tab-separated line matches target. */ static void extractField(char *line, int fieldIx, char **retField, int *retFieldSize) /* Go through tab separated line and figure out start and size of given field. */ { int i; fieldIx -= 3; /* Skip over chrom/start/end, which are not in line. */ for (i=0; iisSwapped; for (fos = fosList; fos != NULL; fos = fos->next) { /* Read in raw data */ udcSeek(bbi->udc, fos->offset); char *rawData = needLargeMem(fos->size); udcRead(bbi->udc, rawData, fos->size); /* Optionally uncompress data, and set data pointer to uncompressed version. */ char *uncompressedData = NULL; char *data = NULL; int dataSize = 0; if (bbi->uncompressBufSize > 0) { data = uncompressedData = needLargeMem(bbi->uncompressBufSize); dataSize = zUncompress(rawData, fos->size, uncompressedData, bbi->uncompressBufSize); } else { data = rawData; dataSize = fos->size; } /* Set up for "memRead" routines to more or less treat memory block like file */ char *blockPt = data, *blockEnd = data + dataSize; struct dyString *dy = dyStringNew(32); // Keep bits outside of chrom/start/end here /* Read next record into local variables. */ while (blockPt < blockEnd) { bits32 chromIx = memReadBits32(&blockPt, isSwapped); bits32 s = memReadBits32(&blockPt, isSwapped); bits32 e = memReadBits32(&blockPt, isSwapped); int c; dyStringClear(dy); // TODO - can simplify this probably just to for (;;) {if ((c = *blockPt++) == 0) ... while ((c = *blockPt++) >= 0) { if (c == 0) break; dyStringAppendC(dy, c); } if ((*matcher)(dy->string, fieldIx, target)) { lmAllocVar(lm, interval); interval->start = s; interval->end = e; interval->rest = cloneString(dy->string); interval->chromId = chromIx; slAddHead(&intervalList, interval); } } /* Clean up temporary buffers. */ dyStringFree(&dy); freez(&uncompressedData); freez(&rawData); } slReverse(&intervalList); return intervalList; } char *bigBedAutoSqlText(struct bbiFile *bbi) /* Get autoSql text if any associated with file. Do a freeMem of this when done. */ { if (bbi->asOffset == 0) return NULL; struct udcFile *f = bbi->udc; udcSeek(f, bbi->asOffset); return udcReadStringAndZero(f); } struct asObject *bigBedAs(struct bbiFile *bbi) /* Get autoSql object definition if any associated with file. */ { if (bbi->asOffset == 0) return NULL; char *asText = bigBedAutoSqlText(bbi); struct asObject *as = asParseText(asText); freeMem(asText); return as; } struct asObject *bigBedAsOrDefault(struct bbiFile *bbi) // Get asObject associated with bigBed - if none exists in file make it up from field counts. { struct asObject *as = bigBedAs(bbi); if (as == NULL) as = asParseText(bedAsDef(bbi->definedFieldCount, bbi->fieldCount)); return as; } rtracklayer/src/ucsc/bigBed.h0000644000175100017510000000664414614231172017201 0ustar00biocbuildbiocbuild/* bigBed - interface to binary file with bed-style values (that is a bunch of * possibly overlapping regions. * * This shares a lot with the bigWig module. * * Most of the functions here are concerned with reading bigBed files. There's * two common things you want to do with a bigBed, either stream through everything in it, * or just read the parts that overlap a interval within the genome. The files * are optimized for interval queries, but streaming through them is not difficult either. * * To query an interval: * struct bbiFile *bbi = bigBedFileOpen(fileName); * struct lm *lm = lmInit(0); // Memory pool to hold returned list * struct bigBedInterval *list = bigBedIntervalQuery(bbi, chrom, start, end, 0, lm); * struct bigBedInterval *el; * for (el = list; el != NULL; el = el->next) * // do something involving chrom, el->start, el->end * lmCleanup(&lm); // typically do this after each query * bigBedFileClose(&bbi); // typically only do this when finished all queries * * To stream through whole file * struct bbiFile *bbi = bigBedFileOpen(fileName); * struct bbiChromInfo *chrom, *chromList = bbiChromList(bbi); * for (chrom = chromList; chrom != NULL; chrom = chrom->next) * { * struct lm *lm = lmInit(0); * struct bigBedInterval *list = bigBedIntervalQuery(bbi,chrom->name,0,chrom->size,0,lm); * struct bigBedInterval *el; * for (el = list; el != NULL; el = el->next) * // do something involving chrom, el->start, el->end * lmCleanup(&lm); * } * bigBedFileClose(&bbi); * * The processes for streaming through or doing interval queries on a bigWig file are very * similar. */ #ifndef BIGBED_H #define BIGBED_H #ifndef BBIFILE #include "bbiFile.h" #endif struct bigBedInterval /* A partially parsed out bed record plus some extra fields. Use this directly * or convert it to an array of characters with bigBedIntervalToRow. */ { struct bigBedInterval *next; /* Next in list. */ bits32 start, end; /* Range inside chromosome - half open zero based. */ char *rest; /* Rest of line. May be NULL*/ bits32 chromId; /* ID of chromosome. */ }; /*** Routines to open & close bigBed files, and to do chromosome range queries on them. ***/ struct bbiFile *bigBedFileOpen(char *fileName); /* Open up big bed file. Free this up with bbiFileClose. */ #define bigBedFileClose(a) bbiFileClose(a) struct bigBedInterval *bigBedIntervalQuery(struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, int maxItems, struct lm *lm); /* Get data for interval. Return list allocated out of lm. Set maxItems to maximum * number of items to return, or to 0 for all items. */ int bigBedIntervalToRow(struct bigBedInterval *interval, char *chrom, char *startBuf, char *endBuf, char **row, int rowSize); /* Convert bigBedInterval into an array of chars equivalent to what you'd get by * parsing the bed file. The startBuf and endBuf are used to hold the ascii representation of * start and end. Note that the interval->rest string will have zeroes inserted as a side effect. * Returns number of fields in row. */ /*** Some routines for accessing bigBed items via name. ***/ /** Routines to access other data from a bigBed file. */ char *bigBedAutoSqlText(struct bbiFile *bbi); /* Get autoSql text if any associated with file. Do a freeMem of this when done. */ #endif /* BIGBED_H */ rtracklayer/src/ucsc/bigWig.h0000644000175100017510000001005414614231172017223 0ustar00biocbuildbiocbuild/* bigWig - interface to binary file with wiggle-style values (that is a bunch of * small non-overlapping regions each associated with a floating point value. * * There are several ways to use this module. To create a new bigWig file use the * bigWigCreate function, which takes as input an ascii file in fixedStep, variableStep * or bedGraph format. * * To get a section of of a bigWig for display on a browser, use the bigWigSummaryArray * function, which will fill in an array of doubles with on value for each pixel that * you want to display. * * To read all the data out of a bigWig get the chromosome info with bbiChromList * and then fetch all of it for each chromosome using bigWigIntervalQuery. * * See also the module bbiFile that has a description of they structure of * a bigWig file, and lower level routines used to implement this interface. */ #ifndef BIGWIG_H #define BIGWIG_H #ifndef BBIFILE #include "bbiFile.h" #endif #ifndef BITS_H #include "bits.h" #endif void bigWigFileCreateEx( char *inName, /* Input file in ascii wiggle format. */ char *chromSizes, /* Two column tab-separated file: . */ int blockSize, /* Number of items to bundle in r-tree. 1024 is good. */ int itemsPerSlot, /* Number of items in lowest level of tree. 512 is good. */ boolean clipDontDie, /* If TRUE then clip items off end of chrom rather than dying. */ boolean compress, /* If TRUE then compress data. */ boolean keepAllChromosomes, /* If TRUE then store all chromosomes in chromosomal b-tree. */ boolean fixedSummaries, /* If TRUE then impose fixed summary levels. */ char *outName); /* Convert ascii format wig file (in fixedStep, variableStep or bedGraph format) * to binary big wig format. */ struct bbiFile *bigWigFileOpen(char *fileName); /* Open up big wig file. Free this up with bbiFileClose */ #define bigWigFileClose(a) bbiFileClose(a) struct bbiInterval *bigWigIntervalQuery(struct bbiFile *bwf, char *chrom, bits32 start, bits32 end, struct lm *lm); /* Get data for interval. Return list allocated out of lm. */ boolean bigWigSummaryArray(struct bbiFile *bwf, char *chrom, bits32 start, bits32 end, enum bbiSummaryType summaryType, int summarySize, double *summaryValues); /* Fill in summaryValues with data from indicated chromosome range in bigWig file. * Be sure to initialize summaryValues to a default value, which will not be touched * for regions without data in file. (Generally you want the default value to either * be 0.0 or nan(0) depending on the application.) Returns FALSE if no data * at that position. */ /* bigWigValsOnChrom - a little system for optimizing bigWig use when doing a pass over the * whole chromosome. How it is used typically is: * struct bigWigValsOnChrom *chromVals = bigWigValsOnChromNew(); * for (chrom = chromList; chrom != NULL; chrom = chrom->next) * { * if (bigWigValsOnChromFetchData(chromVals, chrom->name, bigWig)) * // do stuff using the valBuf, or covBuf fields which have * // the big wig data unpacked into them. Can use chromSize and chrom too * } * bigWigValsOnChromFree(&chromVals); */ struct bigWigValsOnChrom /* Object for bulk access a chromosome at a time. This is faster than * doing bigWigInterval queries when you have ~3000 or more queries. */ { struct bigWigValsOnChrom *next; char *chrom; /* Current chromosome. */ long chromSize; /* Size of current chromosome. */ long bufSize; /* Size of allocated buffer */ double *valBuf; /* A value for each base on chrom. Zero where no data. */ Bits *covBuf; /* A bit for each base with data. */ }; struct bigWigValsOnChrom *bigWigValsOnChromNew(); /* Allocate new empty bigWigValsOnChromStructure. */ void bigWigValsOnChromFree(struct bigWigValsOnChrom **pChromVals); /* Free up bigWigValsOnChrom */ boolean bigWigValsOnChromFetchData(struct bigWigValsOnChrom *chromVals, char *chrom, struct bbiFile *bigWig); /* Fetch data for chromosome from bigWig. Returns FALSE if not data on that chrom. */ #endif /* BIGWIG_H */ rtracklayer/src/ucsc/binRange.c0000644000175100017510000001311614614231172017535 0ustar00biocbuildbiocbuild/* binRange Stuff to handle binning - which helps us restrict * our attention to the parts of database that contain info * about a particular window on a chromosome. This scheme * will work without modification for chromosome sizes up * to half a gigaBase. The finest sized bin is 128k (1<<17). * The next coarsest is 8x as big (1<<13). There's a hierarchy * of bins with the chromosome itself being the final bin. * Features are put in the finest bin they'll fit in. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "binRange.h" /* add one new level to get coverage past chrom sizes of 512 Mb * effective limit is now the size of an integer since chrom start * and end coordinates are always being used in int's == 2Gb-1 */ static int binOffsetsExtended[] = {4096+512+64+8+1, 512+64+8+1, 64+8+1, 8+1, 1, 0}; static int binOffsets[] = {512+64+8+1, 64+8+1, 8+1, 1, 0}; #define _binFirstShift 17 /* How much to shift to get to finest bin. */ #define _binNextShift 3 /* How much to shift to get to next larger bin. */ static int binFromRangeStandard(int start, int end) /* Given start,end in chromosome coordinates assign it * a bin. There's a bin for each 128k segment, for each * 1M segment, for each 8M segment, for each 64M segment, * and for each chromosome (which is assumed to be less than * 512M.) A range goes into the smallest bin it will fit in. */ { int startBin = start, endBin = end-1, i; startBin >>= _binFirstShift; endBin >>= _binFirstShift; for (i=0; i>= _binNextShift; endBin >>= _binNextShift; } errAbort("start %d, end %d out of range in findBin (max is 512M)", start, end); return 0; } static int binFromRangeExtended(int start, int end) /* Given start,end in chromosome coordinates assign it * a bin. There's a bin for each 128k segment, for each * 1M segment, for each 8M segment, for each 64M segment, * for each 512M segment, and one top level bin for 4Gb. * Note, since start and end are int's, the practical limit * is up to 2Gb-1, and thus, only four result bins on the second * level. * A range goes into the smallest bin it will fit in. */ { int startBin = start, endBin = end-1, i; startBin >>= _binFirstShift; endBin >>= _binFirstShift; for (i=0; i>= _binNextShift; endBin >>= _binNextShift; } errAbort("start %d, end %d out of range in findBin (max is 2Gb)", start, end); return 0; } static int binFromRangeBinKeeperExtended(int start, int end) /* This is just like binFromRangeExtended() above, but it doesn't limit * the answers to the range from _binOffsetOldToExtended and up. * It simply uses the whole new bin scheme as if it was the only * one. */ { int startBin = start, endBin = end-1, i; startBin >>= _binFirstShift; endBin >>= _binFirstShift; for (i=0; i>= _binNextShift; endBin >>= _binNextShift; } errAbort("start %d, end %d out of range in findBin (max is 2Gb)", start, end); return 0; } struct binKeeper *binKeeperNew(int minPos, int maxPos) /* Create new binKeeper that can cover range. */ { int binCount; struct binKeeper *bk; if (minPos < 0 || maxPos < 0 || minPos > maxPos) errAbort("bad range %d,%d in binKeeperNew", minPos, maxPos); binCount = binFromRangeBinKeeperExtended(maxPos-1, maxPos) + 1; AllocVar(bk); bk->minPos = minPos; bk->maxPos = maxPos; bk->binCount = binCount; AllocArray(bk->binLists, binCount); return bk; } void binKeeperAdd(struct binKeeper *bk, int start, int end, void *val) /* Add item to binKeeper. */ { int bin; struct binElement *el; if (start < bk->minPos || end > bk->maxPos || start > end) errAbort("(%d %d) out of range (%d %d) in binKeeperAdd", start, end, bk->minPos, bk->maxPos); bin = binFromRangeBinKeeperExtended(start, end); assert(bin < bk->binCount); AllocVar(el); el->start = start; el->end = end; el->val = val; slAddHead(&bk->binLists[bin], el); } int binElementCmpStart(const void *va, const void *vb) /* Compare to sort based on start. */ { const struct binElement *a = *((struct binElement **)va); const struct binElement *b = *((struct binElement **)vb); return a->start - b->start; } struct binElement *binKeeperFind(struct binKeeper *bk, int start, int end) /* Return a list of all items in binKeeper that intersect range. * Free this list with slFreeList. */ { struct binElement *list = NULL, *newEl, *el; int startBin, endBin; int i,j; if (start < bk->minPos) start = bk->minPos; if (end > bk->maxPos) end = bk->maxPos; if (start >= end) return NULL; startBin = (start>>_binFirstShift); endBin = ((end-1)>>_binFirstShift); for (i=0; ibinLists[j]; el != NULL; el = el->next) { if (rangeIntersection(el->start, el->end, start, end) > 0) { newEl = CloneVar(el); slAddHead(&list, newEl); } } } startBin >>= _binNextShift; endBin >>= _binNextShift; } return list; } struct binElement *binKeeperFindSorted(struct binKeeper *bk, int start, int end) /* Like binKeeperFind, but sort list on start coordinates. */ { struct binElement *list = binKeeperFind(bk, start, end); slSort(&list, binElementCmpStart); return list; } rtracklayer/src/ucsc/binRange.h0000644000175100017510000000433214614231172017542 0ustar00biocbuildbiocbuild#ifndef BINRANGE_H #define BINRANGE_H /* binRange Stuff to handle binning - which helps us restrict * our attention to the parts of database that contain info * about a particular window on a chromosome. This scheme * will work without modification for chromosome sizes up * to half a gigaBase. The finest sized bin is 128k (1<<17). * The next coarsest is 8x as big (1<<13). There's a hierarchy * of bins with the chromosome itself being the final bin. * Features are put in the finest bin they'll fit in. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #define BINRANGE_MAXEND_512M (512*1024*1024) #define _binOffsetOldToExtended 4681 /***** And now for some higher level stuff - useful for binning ***** things in memory. ******/ struct binElement /* An element in a bin. */ { struct binElement *next; int start, end; /* 0 based, half open range */ void *val; /* Actual bin item. */ }; int binElementCmpStart(const void *va, const void *vb); /* Compare to sort based on start. */ struct binKeeper /* This keeps things in bins in memory */ { struct binKeeper *next; int minPos; /* Minimum position to bin. */ int maxPos; /* Maximum position to bin. */ int binCount; /* Count of bins. */ struct binElement **binLists; /* A list for each bin. */ }; struct binKeeperCookie /* used by binKeeperFirst/binKeeperNext in tracking location in traversing bins */ { struct binKeeper *bk; /* binKeeper we are associated with */ int blIdx; /* current bin list index */ struct binElement *nextBel; /* next binElement */ }; struct binKeeper *binKeeperNew(int minPos, int maxPos); /* Create new binKeeper that can cover range. */ void binKeeperAdd(struct binKeeper *bk, int start, int end, void *val); /* Add item to binKeeper. */ struct binElement *binKeeperFind(struct binKeeper *bk, int start, int end); /* Return a list of all items in binKeeper that intersect range. * Free this list with slFreeList. */ struct binElement *binKeeperFindSorted(struct binKeeper *bk, int start, int end); /* Like binKeeperFind, but sort list on start coordinates. */ #endif /* BINRANGE_H */ rtracklayer/src/ucsc/bits.c0000644000175100017510000000762614614231172016762 0ustar00biocbuildbiocbuild/* bits - handle operations on arrays of bits. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "bits.h" static Bits oneBit[8] = { 0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1}; static Bits leftMask[8] = {0xFF, 0x7F, 0x3F, 0x1F, 0xF, 0x7, 0x3, 0x1,}; static Bits rightMask[8] = {0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF,}; int bitsInByte[256]; static boolean inittedBitsInByte = FALSE; void bitsInByteInit() /* Initialize bitsInByte array. */ { int i; if (!inittedBitsInByte) { inittedBitsInByte = TRUE; for (i=0; i<256; ++i) { int count = 0; if (i&1) count = 1; if (i&2) ++count; if (i&4) ++count; if (i&8) ++count; if (i&0x10) ++count; if (i&0x20) ++count; if (i&0x40) ++count; if (i&0x80) ++count; bitsInByte[i] = count; } } } Bits *bitAlloc(int bitCount) /* Allocate bits. */ { int byteCount = ((bitCount+7)>>3); return needLargeZeroedMem(byteCount); } Bits *bitClone(Bits* orig, int bitCount) /* Clone bits. */ { int byteCount = ((bitCount+7)>>3); Bits* bits = needLargeZeroedMem(byteCount); memcpy(bits, orig, byteCount); return bits; } void bitFree(Bits **pB) /* Free bits. */ { freez(pB); } Bits *lmBitAlloc(struct lm *lm,int bitCount) // Allocate bits. Must supply local memory. { assert(lm != NULL); int byteCount = ((bitCount+7)>>3); return lmAlloc(lm,byteCount); } void bitSetOne(Bits *b, int bitIx) /* Set a single bit. */ { b[bitIx>>3] |= oneBit[bitIx&7]; } void bitClearOne(Bits *b, int bitIx) /* Clear a single bit. */ { b[bitIx>>3] &= ~oneBit[bitIx&7]; } void bitSetRange(Bits *b, int startIx, int bitCount) /* Set a range of bits. */ { if (bitCount <= 0) return; int endIx = (startIx + bitCount - 1); int startByte = (startIx>>3); int endByte = (endIx>>3); int startBits = (startIx&7); int endBits = (endIx&7); int i; if (startByte == endByte) { b[startByte] |= (leftMask[startBits] & rightMask[endBits]); return; } b[startByte] |= leftMask[startBits]; for (i = startByte+1; i>3] & oneBit[bitIx&7]) != 0; } int bitCountRange(Bits *b, int startIx, int bitCount) /* Count number of bits set in range. */ { if (bitCount <= 0) return 0; int endIx = (startIx + bitCount - 1); int startByte = (startIx>>3); int endByte = (endIx>>3); int startBits = (startIx&7); int endBits = (endIx&7); int i; int count = 0; if (!inittedBitsInByte) bitsInByteInit(); if (startByte == endByte) return bitsInByte[b[startByte] & leftMask[startBits] & rightMask[endBits]]; count = bitsInByte[b[startByte] & leftMask[startBits]]; for (i = startByte+1; i>3); int iByte; /* scan initial byte */ while (((iBit & 7) != 0) && (iBit < bitCount)) { if (bitReadOne(b, iBit) == val) return iBit; iBit++; } /* scan byte at a time, if not already in last byte */ iByte = (iBit >> 3); if (iByte < endByte) { while ((iByte < endByte) && (b[iByte] == notByteVal)) iByte++; iBit = iByte << 3; } /* scan last byte */ while (iBit < bitCount) { if (bitReadOne(b, iBit) == val) return iBit; iBit++; } return bitCount; /* not found */ } int bitFindSet(Bits *b, int startIx, int bitCount) /* Find the index of the the next set bit. */ { return bitFind(b, startIx, TRUE, bitCount); } int bitFindClear(Bits *b, int startIx, int bitCount) /* Find the index of the the next clear bit. */ { return bitFind(b, startIx, FALSE, bitCount); } rtracklayer/src/ucsc/bits.h0000644000175100017510000000252114614231172016754 0ustar00biocbuildbiocbuild/* bits - handle operations on arrays of bits. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef BITS_H #define BITS_H #include "localmem.h" typedef unsigned char Bits; #define bitToByteSize(bitSize) ((bitSize+7)/8) /* Convert number of bits to number of bytes needed to store bits. */ Bits *bitAlloc(int bitCount); /* Allocate bits. */ Bits *bitClone(Bits* orig, int bitCount); /* Clone bits. */ void bitFree(Bits **pB); /* Free bits. */ Bits *lmBitAlloc(struct lm *lm,int bitCount); // Allocate bits. Must supply local memory. void bitSetOne(Bits *b, int bitIx); /* Set a single bit. */ void bitClearOne(Bits *b, int bitIx); /* Clear a single bit. */ void bitSetRange(Bits *b, int startIx, int bitCount); /* Set a range of bits. */ boolean bitReadOne(Bits *b, int bitIx); /* Read a single bit. */ int bitCountRange(Bits *b, int startIx, int bitCount); /* Count number of bits set in range. */ int bitFindSet(Bits *b, int startIx, int bitCount); /* Find the index of the the next set bit. */ int bitFindClear(Bits *b, int startIx, int bitCount); /* Find the index of the the next clear bit. */ extern int bitsInByte[256]; /* Lookup table for how many bits are set in a byte. */ void bitsInByteInit(); /* Initialize bitsInByte array. */ #endif /* BITS_H */ rtracklayer/src/ucsc/bPlusTree.c0000644000175100017510000004466114614231172017726 0ustar00biocbuildbiocbuild/* Copyright (C) 2013 The Regents of the University of California * See README in this or parent directory for licensing information. */ /* bptFile - B+ Trees. These are a method of indexing data similar to binary trees, but * with many children rather than just two at each node. They work well when stored on disk, * since typically only two or three disk accesses are needed to locate any particular * piece of data. This implementation is *just* for disk based storage. For memory * use the rbTree instead. Currently the implementation is just useful for data warehouse * type applications. That is it implements a function to create a b+ tree from bulk data * (bptFileCreate) and a function to lookup a value given a key (bptFileFind) but not functions * to add or delete individual items. * * The layout of the file on disk is: * header * root node * (other nodes) * In general when the tree is first built the higher level nodes are stored before the * lower level nodes. It is possible if a b+ tree is dynamically updated for this to * no longer be strictly true, but actually currently the b+ tree code here doesn't implement * dynamic updates - it just creates a b+ tree from a sorted list. * * Each node can be one of two types - index or leaf. The index nodes contain pointers * to child nodes. The leaf nodes contain the actual data. * * The layout of the file header is: * 4 bytes - The value bptSig (0x78CA8C91) * 4 bytes - Number of children per block (not byte size of block) * 4 bytes - Number of significant bytes in key * 4 bytes - Number of bytes in value * 8 bytes - Number of items in index * 4 bytes - Always 0 for now * 4 bytes - Always 0 for now * The magic number may be byte-swapped, in which case all numbers in the file * need to be byte-swapped. * * The nodes start with a header: * 1 byte - 1 for leaf nodes, 0 for index nodes. * 1 byte - Always 0 for now. * 2 bytes - The number of children/items in node * This is followed by count items. For the index nodes the items are * key size bytes - always written most significant byte first * 8 bytes - Offset of child node in index file. * For leaf nodes the items are * key size bytes - always written most significant byte first * val sized bytes - the value associated with the key. * Note in general the leaf nodes may not be the same size as the index nodes, though in * the important case where the values are file offsets they will be. */ #include "common.h" #include "sig.h" #include "udc.h" #include "bPlusTree.h" /* This section of code deals with locating a value in a b+ tree. */ struct bptFile *bptFileAttach(char *fileName, struct udcFile *udc) /* Open up index file on previously open file, with header at current file position. */ { /* Open file and allocate structure to hold info from header etc. */ struct bptFile *bpt = needMem(sizeof(*bpt)); bpt->fileName = fileName; bpt->udc = udc; /* Read magic number at head of file and use it to see if we are proper file type, and * see if we are byte-swapped. */ bits32 magic; boolean isSwapped = FALSE; udcMustReadOne(udc, magic); if (magic != bptSig) { magic = byteSwap32(magic); isSwapped = bpt->isSwapped = TRUE; if (magic != bptSig) errAbort("%s is not a bpt b-plus tree index file", fileName); } /* Read rest of defined bits of header, byte swapping as needed. */ bpt->blockSize = udcReadBits32(udc, isSwapped); bpt->keySize = udcReadBits32(udc, isSwapped); bpt->valSize = udcReadBits32(udc, isSwapped); bpt->itemCount = udcReadBits64(udc, isSwapped); /* Skip over reserved bits of header. */ bits32 reserved32; udcMustReadOne(udc, reserved32); udcMustReadOne(udc, reserved32); /* Save position of root block of b+ tree. */ bpt->rootOffset = udcTell(udc); return bpt; } void bptFileDetach(struct bptFile **pBpt) /* Detach and free up cirTree file opened with cirTreeFileAttach. */ { freez(pBpt); } struct bptFile *bptFileOpen(char *fileName) /* Open up index file - reading header and verifying things. */ { return bptFileAttach(cloneString(fileName), udcFileOpen(fileName, udcDefaultDir())); } void bptFileClose(struct bptFile **pBpt) /* Close down and deallocate index file. */ { struct bptFile *bpt = *pBpt; if (bpt != NULL) { udcFileClose(&bpt->udc); freeMem(bpt->fileName); bptFileDetach(pBpt); } } static boolean rFind(struct bptFile *bpt, bits64 blockStart, void *key, void *val) /* Find value corresponding to key. If found copy value to memory pointed to by val and return * true. Otherwise return false. */ { /* Seek to start of block. */ udcSeek(bpt->udc, blockStart); /* Read block header. */ UBYTE isLeaf; UBYTE reserved; bits16 i, childCount; udcMustReadOne(bpt->udc, isLeaf); udcMustReadOne(bpt->udc, reserved); boolean isSwapped = bpt->isSwapped; childCount = udcReadBits16(bpt->udc, isSwapped); UBYTE keyBuf[bpt->keySize]; /* Place to put a key, buffered on stack. */ if (isLeaf) { for (i=0; iudc, keyBuf, bpt->keySize); udcMustRead(bpt->udc, val, bpt->valSize); if (memcmp(key, keyBuf, bpt->keySize) == 0) return TRUE; } return FALSE; } else { /* Read and discard first key. */ udcMustRead(bpt->udc, keyBuf, bpt->keySize); /* Scan info for first file offset. */ bits64 fileOffset = udcReadBits64(bpt->udc, isSwapped); /* Loop through remainder. */ for (i=1; iudc, keyBuf, bpt->keySize); if (memcmp(key, keyBuf, bpt->keySize) < 0) break; fileOffset = udcReadBits64(bpt->udc, isSwapped); } return rFind(bpt, fileOffset, key, val); } } static void rFindMulti(struct bptFile *bpt, bits64 blockStart, void *key, struct slRef **pList) /* Find values corresponding to key and add them to pList. You'll need to * Do a slRefFreeListAndVals() on the list when done. */ { /* Seek to start of block. */ udcSeek(bpt->udc, blockStart); /* Read block header. */ UBYTE isLeaf; UBYTE reserved; bits16 i, childCount; udcMustReadOne(bpt->udc, isLeaf); udcMustReadOne(bpt->udc, reserved); boolean isSwapped = bpt->isSwapped; childCount = udcReadBits16(bpt->udc, isSwapped); int keySize = bpt->keySize; UBYTE keyBuf[keySize]; /* Place to put a key, buffered on stack. */ UBYTE valBuf[bpt->valSize]; /* Place to put a value, buffered on stack. */ if (isLeaf) { for (i=0; iudc, keyBuf, keySize); udcMustRead(bpt->udc, valBuf, bpt->valSize); if (memcmp(key, keyBuf, keySize) == 0) { void *val = cloneMem(valBuf, bpt->valSize); refAdd(pList, val); } } } else { /* Read first key and first file offset. */ udcMustRead(bpt->udc, keyBuf, keySize); bits64 lastFileOffset = udcReadBits64(bpt->udc, isSwapped); bits64 fileOffset = lastFileOffset; int lastCmp = memcmp(key, keyBuf, keySize); /* Loop through remainder. */ for (i=1; iudc, keyBuf, keySize); fileOffset = udcReadBits64(bpt->udc, isSwapped); int cmp = memcmp(key, keyBuf, keySize); if (lastCmp >= 0 && cmp <= 0) { bits64 curPos = udcTell(bpt->udc); rFindMulti(bpt, lastFileOffset, key, pList); udcSeek(bpt->udc, curPos); } if (cmp < 0) return; lastCmp = cmp; lastFileOffset = fileOffset; } /* If made it all the way to end, do last one too. */ rFindMulti(bpt, fileOffset, key, pList); } } static void rTraverse(struct bptFile *bpt, bits64 blockStart, void *context, void (*callback)(void *context, void *key, int keySize, void *val, int valSize) ) /* Recursively go across tree, calling callback at leaves. */ { /* Seek to start of block. */ udcSeek(bpt->udc, blockStart); /* Read block header. */ UBYTE isLeaf; UBYTE reserved; bits16 i, childCount; udcMustReadOne(bpt->udc, isLeaf); udcMustReadOne(bpt->udc, reserved); boolean isSwapped = bpt->isSwapped; childCount = udcReadBits16(bpt->udc, isSwapped); char keyBuf[bpt->keySize], valBuf[bpt->valSize]; if (isLeaf) { for (i=0; iudc, keyBuf, bpt->keySize); udcMustRead(bpt->udc, valBuf, bpt->valSize); callback(context, keyBuf, bpt->keySize, valBuf, bpt->valSize); } } else { bits64 fileOffsets[childCount]; /* Loop through to get file offsets of children. */ for (i=0; iudc, keyBuf, bpt->keySize); fileOffsets[i] = udcReadBits64(bpt->udc, isSwapped); } /* Loop through recursing on child offsets. */ for (i=0; irootOffset; for (;;) { /* Seek to block start */ udcSeek(bpt->udc, offset); /* Read block header, break if we are leaf. */ UBYTE isLeaf; UBYTE reserved; udcMustReadOne(bpt->udc, isLeaf); if (isLeaf) break; udcMustReadOne(bpt->udc, reserved); boolean isSwapped = bpt->isSwapped; udcReadBits16(bpt->udc, isSwapped); /* Read and discard first key. */ char keyBuf[bpt->keySize]; udcMustRead(bpt->udc, keyBuf, bpt->keySize); /* Get file offset of sub-block. */ offset = udcReadBits64(bpt->udc, isSwapped); } return offset; } static bits64 bptDataOffset(struct bptFile *bpt, bits64 itemPos) /* Return position of file of data corresponding to given itemPos. For first piece of * data pass in 0. */ { if (itemPos >= bpt->itemCount) errAbort("Item index %lld greater than item count %lld in %s", itemPos, bpt->itemCount, bpt->fileName); bits64 blockPos = itemPos/bpt->blockSize; bits32 insidePos = itemPos - blockPos*bpt->blockSize; int blockHeaderSize = 4; bits64 itemByteSize = bpt->valSize + bpt->keySize; bits64 blockByteSize = bpt->blockSize * itemByteSize + blockHeaderSize; bits64 blockOffset = blockByteSize*blockPos + bptDataStart(bpt); bits64 itemOffset = blockOffset + blockHeaderSize + itemByteSize * insidePos; return itemOffset; } void bptKeyAtPos(struct bptFile *bpt, bits64 itemPos, void *result) /* Fill in result with the key at given itemPos. For first piece of data itemPos is 0 * Result must be at least bpt->keySize. If result is a string it won't be zero terminated * by this routine. Use bptStringKeyAtPos instead. */ { bits64 offset = bptDataOffset(bpt, itemPos); udcSeek(bpt->udc, offset); udcMustRead(bpt->udc, result, bpt->keySize); } void bptStringKeyAtPos(struct bptFile *bpt, bits64 itemPos, char *result, int maxResultSize) /* Fill in result with the key at given itemPos. The maxResultSize should be 1+bpt->keySize * to accommodate zero termination of string. */ { assert(maxResultSize > bpt->keySize); bptKeyAtPos(bpt, itemPos, result); result[bpt->keySize] = 0; } static boolean bptFileFindMaybeMulti(struct bptFile *bpt, void *key, int keySize, int valSize, boolean multi, void *singleVal, struct slRef **multiVal) /* Do either a single or multiple find depending in multi parameter. Only one of singleVal * or multiVal should be non-NULL, depending on the same parameter. */ { /* Check key size vs. file key size, and act appropriately. If need be copy key to a local * buffer and zero-extend it. */ if (keySize > bpt->keySize) return FALSE; char keyBuf[bpt->keySize]; if (keySize != bpt->keySize) { memcpy(keyBuf, key, keySize); memset(keyBuf+keySize, 0, bpt->keySize - keySize); key = keyBuf; } /* Make sure the valSize matches what's in file. */ if (valSize != bpt->valSize) errAbort("Value size mismatch between bptFileFind (valSize=%d) and %s (valSize=%d)", valSize, bpt->fileName, bpt->valSize); if (multi) { rFindMulti(bpt, bpt->rootOffset, key, multiVal); return *multiVal != NULL; } else return rFind(bpt, bpt->rootOffset, key, singleVal); } boolean bptFileFind(struct bptFile *bpt, void *key, int keySize, void *val, int valSize) /* Find value associated with key. Return TRUE if it's found. * Parameters: * bpt - file handle returned by bptFileOpen * key - pointer to key string, which needs to be bpt->keySize long * val - pointer to where to put retrieved value */ { return bptFileFindMaybeMulti(bpt, key, keySize, valSize, FALSE, val, NULL); } struct slRef *bptFileFindMultiple(struct bptFile *bpt, void *key, int keySize, int valSize) /* Find all values associated with key. Store this in ->val item of returned list. * Do a slRefFreeListAndVals() on list when done. */ { struct slRef *list = NULL; bptFileFindMaybeMulti(bpt, key, keySize, valSize, TRUE, NULL, &list); slReverse(&list); return list; } void bptFileTraverse(struct bptFile *bpt, void *context, void (*callback)(void *context, void *key, int keySize, void *val, int valSize) ) /* Traverse bPlusTree on file, calling supplied callback function at each * leaf item. */ { return rTraverse(bpt, bpt->rootOffset, context, callback); } /* This section of code deals with making balanced b+ trees given a sorted array as input. * The difficult part is mostly just calculating the offsets of various things. As an example * if you had the sorted array: * 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 * and wanted to create a tree of block size 4, the resulting tree would have three levels * as so: * 01 17 * 01 05 09 13 17 21 25 * 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 */ static long xToY(int x, unsigned y) /* Return x to the Y power, with y usually small. */ { long i, val = 1; for (i=0; i maxBlockSize) { itemCount = (itemCount + maxBlockSize - 1) / maxBlockSize; levels += 1; } return levels; } static bits32 writeIndexLevel(bits16 blockSize, void *itemArray, int itemSize, long itemCount, bits32 indexOffset, int level, void (*fetchKey)(const void *va, char *keyBuf), bits32 keySize, bits32 valSize, FILE *f) /* Write out a non-leaf level. */ { char *items = itemArray; /* Calculate number of nodes to write at this level. */ long slotSizePer = xToY(blockSize, level); // Number of items per slot in node long nodeSizePer = slotSizePer * blockSize; // Number of items per node long nodeCount = (itemCount + nodeSizePer - 1)/nodeSizePer; /* Calculate sizes and offsets. */ long bytesInIndexBlock = (bptBlockHeaderSize + blockSize * (keySize+sizeof(bits64))); long bytesInLeafBlock = (bptBlockHeaderSize + blockSize * (keySize+valSize)); bits64 bytesInNextLevelBlock = (level == 1 ? bytesInLeafBlock : bytesInIndexBlock); bits64 levelSize = nodeCount * bytesInIndexBlock; bits64 endLevel = indexOffset + levelSize; bits64 nextChild = endLevel; UBYTE isLeaf = FALSE; UBYTE reserved = 0; long i,j; char keyBuf[keySize+1]; keyBuf[keySize] = 0; for (i=0; i blockSize) countOne = blockSize; bits16 shortCountOne = countOne; /* Write block header. */ writeOne(f, isLeaf); writeOne(f, reserved); writeOne(f, shortCountOne); /* Write out the slots that are used one by one, and do sanity check. */ int slotsUsed = 0; long endIx = i + nodeSizePer; if (endIx > itemCount) endIx = itemCount; for (j=i; j blockSize) countOne = blockSize; else countOne = countLeft; writeOne(f, isLeaf); writeOne(f, reserved); writeOne(f, countOne); /* Write out position in genome and in file for each item. */ for (j=0; j 0; --i) { bits32 endLevelOffset = writeIndexLevel(blockSize, itemArray, itemSize, itemCount, indexOffset, i, fetchKey, keySize, valSize, f); indexOffset = ftell(f); if (endLevelOffset != indexOffset) internalErr(); } /* Write leaf nodes */ writeLeafLevel(blockSize, itemArray, itemSize, itemCount, fetchKey, keySize, fetchVal, valSize, f); } rtracklayer/src/ucsc/bPlusTree.h0000644000175100017510000001432214614231172017722 0ustar00biocbuildbiocbuild/* bptFile - B+ Trees. These are a method of indexing data similar to binary trees, but * with many children rather than just two at each node. They work well when stored on disk, * since typically only two or three disk accesses are needed to locate any particular * piece of data. This implementation is *just* for disk based storage. For memory * use the rbTree instead. Currently the implementation is just useful for data warehouse * type applications. That is it implements a function to create a b+ tree from bulk data * (bptFileCreate) and a function to lookup a value given a key (bptFileFind) but not functions * to add or delete individual items. * * * The layout of the file on disk is: * header * root node * (other nodes) * In general when the tree is first built the higher level nodes are stored before the * lower level nodes. It is possible if a b+ tree is dynamically updated for this to * no longer be strictly true, but actually currently the b+ tree code here doesn't implement * dynamic updates - it just creates a b+ tree from a sorted list. * * Each node can be one of two types - index or leaf. The index nodes contain pointers * to child nodes. The leaf nodes contain the actual data. * * The layout of the file header is: * 4 bytes - The value bptSig (0x78CA8C91) * 4 bytes - Number of children per block (not byte size of block) * 4 bytes - Number of significant bytes in key * 4 bytes - Number of bytes in value * 8 bytes - Number of items in index * 4 bytes - Always 0 for now * 4 bytes - Always 0 for now * The magic number may be byte-swapped, in which case all numbers in the file * need to be byte-swapped. * * The nodes start with a header: * 1 byte - 1 for leaf nodes, 0 for index nodes. * 1 byte - Always 0 for now. * 2 bytes - The number of children/items in node * This is followed by count items. For the index nodes the items are * key size bytes - always written most significant byte first * 8 bytes - Offset of child node in index file. * For leaf nodes the items are * key size bytes - always written most significant byte first * val sized bytes - the value associated with the key. * Note in general the leaf nodes may not be the same size as the index nodes, though in * the important case where the values are file offsets they will be. */ #ifndef BPLUSTREE_H #define BPLUSTREE_H struct bptFile /* B+ tree index file handle. */ { struct bptFile *next; /* Next in list of index files if any. */ char *fileName; /* Name of file - for error reporting. */ struct udcFile *udc; /* Open file pointer. */ bits32 blockSize; /* Size of block. */ bits32 keySize; /* Size of keys. */ bits32 valSize; /* Size of values. */ bits64 itemCount; /* Number of items indexed. */ boolean isSwapped; /* If TRUE need to byte swap everything. */ bits64 rootOffset; /* Offset of root block. */ }; struct bptFile *bptFileOpen(char *fileName); /* Open up index file - reading header and verifying things. */ void bptFileClose(struct bptFile **pBpt); /* Close down and deallocate index file. */ struct bptFile *bptFileAttach(char *fileName, struct udcFile *udc); /* Open up index file on previously open file, with header at current file position. */ void bptFileDetach(struct bptFile **pBpt); /* Detach and free up bptFile opened with bptFileAttach. */ boolean bptFileFind(struct bptFile *bpt, void *key, int keySize, void *val, int valSize); /* Find value associated with key. Return TRUE if it's found. * Parameters: * bpt - file handle returned by bptFileOpen * key - pointer to key string * keySize - size of key. Normally just strlen(key) * val - pointer to where to put retrieved value * valSize - size of memory buffer that will hold val. Should match bpt->valSize. */ struct slRef *bptFileFindMultiple(struct bptFile *bpt, void *key, int keySize, int valSize); /* Find all values associated with key. Store this in ->val item of returned list. * Do a slRefFreeListAndVals() on list when done. */ void bptFileTraverse(struct bptFile *bpt, void *context, void (*callback)(void *context, void *key, int keySize, void *val, int valSize) ); /* Traverse bPlusTree on file, calling supplied callback function at each * leaf item. */ void bptKeyAtPos(struct bptFile *bpt, bits64 itemPos, void *result); /* Fill in result with the key at given itemPos. For first piece of data itemPos is 0 * and for last piece is bpt->itemCount - 1. Result must be at least bpt->keySize. * If result is a string it won't be zero terminated * by this routine. Use bptStringKeyAtPos instead. */ void bptStringKeyAtPos(struct bptFile *bpt, bits64 itemPos, char *result, int maxResultSize); /* Fill in result with the key at given itemPos. The maxResultSize should be 1+bpt->keySize * to accommodate zero termination of string. */ void bptFileCreate( void *itemArray, /* Sorted array of things to index. */ int itemSize, /* Size of each element in array. */ bits64 itemCount, /* Number of elements in array. */ bits32 blockSize, /* B+ tree block size - # of children for each node. */ void (*fetchKey)(const void *va, char *keyBuf), /* Given item, copy key to keyBuf */ bits32 keySize, /* Size of key */ void* (*fetchVal)(const void *va), /* Given item, return pointer to value */ bits32 valSize, /* Size of value */ char *fileName); /* Name of output file. */ /* Create a b+ tree index file from a sorted array. */ void bptFileBulkIndexToOpenFile(void *itemArray, int itemSize, bits64 itemCount, bits32 blockSize, void (*fetchKey)(const void *va, char *keyBuf), bits32 keySize, void* (*fetchVal)(const void *va), bits32 valSize, FILE *f); /* Create a b+ tree index from a sorted array, writing output starting at current position * of an already open file. See bptFileCreate for explanation of parameters. */ #define bptFileHeaderSize 32 #define bptBlockHeaderSize 4 #endif /* BPLUSTREE_H */ rtracklayer/src/ucsc/bwgCreate.c0000644000175100017510000011315714614231172017721 0ustar00biocbuildbiocbuild/* bwgCreate - create big wig files. Implements write side of bwgInternal.h module. * See the comment in bwgInternal.h for a description of the file format. */ /* Copyright (C) 2014 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "linefile.h" #include "hash.h" #include "errAbort.h" #include "sqlNum.h" #include "sig.h" #include "zlibFace.h" #include "bPlusTree.h" #include "cirTree.h" #include "bbiFile.h" #include "bwgInternal.h" #include "bigWig.h" static int bwgBedGraphItemCmp(const void *va, const void *vb) /* Compare to sort based on query start. */ { const struct bwgBedGraphItem *a = *((struct bwgBedGraphItem **)va); const struct bwgBedGraphItem *b = *((struct bwgBedGraphItem **)vb); int dif = (int)a->start - (int)b->start; if (dif == 0) dif = (int)a->end - (int)b->end; return dif; } static int bwgVariableStepItemCmp(const void *va, const void *vb) /* Compare to sort based on query start. */ { const struct bwgVariableStepItem *a = *((struct bwgVariableStepItem **)va); const struct bwgVariableStepItem *b = *((struct bwgVariableStepItem **)vb); return (int)a->start - (int)b->start; } static int bwgSectionWrite(struct bwgSection *section, boolean doCompress, FILE *f) /* Write out section to file, filling in section->fileOffset. */ { UBYTE type = section->type; UBYTE reserved8 = 0; int itemSize; switch (section->type) { case bwgTypeBedGraph: itemSize = 12; break; case bwgTypeVariableStep: itemSize = 8; break; case bwgTypeFixedStep: itemSize = 4; break; default: itemSize = 0; // Suppress compiler warning internalErr(); break; } int fixedSize = sizeof(section->chromId) + sizeof(section->start) + sizeof(section->end) + sizeof(section->itemStep) + sizeof(section->itemSpan) + sizeof(type) + sizeof(reserved8) + sizeof(section->itemCount); int bufSize = section->itemCount * itemSize + fixedSize; char buf[bufSize]; char *bufPt = buf; section->fileOffset = ftell(f); memWriteOne(&bufPt, section->chromId); memWriteOne(&bufPt, section->start); memWriteOne(&bufPt, section->end); memWriteOne(&bufPt, section->itemStep); memWriteOne(&bufPt, section->itemSpan); memWriteOne(&bufPt, type); memWriteOne(&bufPt, reserved8); memWriteOne(&bufPt, section->itemCount); int i; switch (section->type) { case bwgTypeBedGraph: { struct bwgBedGraphItem *item = section->items.bedGraphList; for (item = section->items.bedGraphList; item != NULL; item = item->next) { memWriteOne(&bufPt, item->start); memWriteOne(&bufPt, item->end); memWriteOne(&bufPt, item->val); } break; } case bwgTypeVariableStep: { struct bwgVariableStepPacked *items = section->items.variableStepPacked; for (i=0; iitemCount; ++i) { memWriteOne(&bufPt, items->start); memWriteOne(&bufPt, items->val); items += 1; } break; } case bwgTypeFixedStep: { struct bwgFixedStepPacked *items = section->items.fixedStepPacked; for (i=0; iitemCount; ++i) { memWriteOne(&bufPt, items->val); items += 1; } break; } default: internalErr(); break; } assert(bufSize == (bufPt - buf) ); if (doCompress) { size_t maxCompSize = zCompBufSize(bufSize); char compBuf[maxCompSize]; int compSize = zCompress(buf, bufSize, compBuf, maxCompSize); mustWrite(f, compBuf, compSize); } else mustWrite(f, buf, bufSize); return bufSize; } int bwgSectionCmp(const void *va, const void *vb) /* Compare to sort based on chrom,start,end. */ { const struct bwgSection *a = *((struct bwgSection **)va); const struct bwgSection *b = *((struct bwgSection **)vb); int dif = strcmp(a->chrom, b->chrom); if (dif == 0) { dif = (int)a->start - (int)b->start; if (dif == 0) dif = (int)a->end - (int)b->end; } return dif; } static struct cirTreeRange bwgSectionFetchKey(const void *va, void *context) /* Fetch bwgSection key for r-tree */ { struct cirTreeRange res; const struct bwgSection *a = *((struct bwgSection **)va); res.chromIx = a->chromId; res.start = a->start; res.end = a->end; return res; } static bits64 bwgSectionFetchOffset(const void *va, void *context) /* Fetch bwgSection file offset for r-tree */ { const struct bwgSection *a = *((struct bwgSection **)va); return a->fileOffset; } static boolean stepTypeLine(char *line) /* Return TRUE if it's a variableStep or fixedStep line. */ { return (startsWithWord("variableStep", line) || startsWithWord("fixedStep", line)); } static boolean steppedSectionEnd(char *line, int maxWords) /* Return TRUE if line indicates the start of another section. */ { int wordCount = chopByWhite(line, NULL, 5); if (wordCount > maxWords) return TRUE; return stepTypeLine(line); } static void parseFixedStepSection(struct lineFile *lf, boolean clipDontDie, struct lm *lm, int itemsPerSlot, char *chrom, bits32 chromSize, bits32 span, bits32 sectionStart, bits32 step, struct bwgSection **pSectionList) /* Read the single column data in section until get to end. */ { struct lm *lmLocal = lmInit(0); /* Stream through section until get to end of file or next section, * adding values from single column to list. */ char *words[1]; char *line; struct bwgFixedStepItem *item, *itemList = NULL; int originalSectionSize = 0; bits32 sectionEnd = sectionStart; while (lineFileNextReal(lf, &line)) { if (steppedSectionEnd(line, 1)) { lineFileReuse(lf); break; } chopLine(line, words); lmAllocVar(lmLocal, item); item->val = lineFileNeedDouble(lf, words, 0); if (sectionEnd + span > chromSize) { warn("line %d of %s: chromosome %s has %u bases, but item ends at %u", lf->lineIx, lf->fileName, chrom, chromSize, sectionEnd + span); if (!clipDontDie) noWarnAbort(); } else { slAddHead(&itemList, item); ++originalSectionSize; } sectionEnd += step; } slReverse(&itemList); /* Break up into sections of no more than items-per-slot size, and convert to packed format. */ int sizeLeft = originalSectionSize; for (item = itemList; item != NULL; ) { /* Figure out size of this section */ int sectionSize = sizeLeft; if (sectionSize > itemsPerSlot) sectionSize = itemsPerSlot; sizeLeft -= sectionSize; /* Allocate and fill in section. */ struct bwgSection *section; lmAllocVar(lm, section); section->chrom = chrom; section->start = sectionStart; sectionStart += sectionSize * step; section->end = sectionStart - step + span; section->type = bwgTypeFixedStep; section->itemStep = step; section->itemSpan = span; section->itemCount = sectionSize; /* Allocate array for data, and copy from list to array representation */ struct bwgFixedStepPacked *packed; /* An array */ section->items.fixedStepPacked = lmAllocArray(lm, packed, sectionSize); int i; for (i=0; ival = item->val; item = item->next; ++packed; } /* Add section to list. */ slAddHead(pSectionList, section); } lmCleanup(&lmLocal); } static void parseVariableStepSection(struct lineFile *lf, boolean clipDontDie, struct lm *lm, int itemsPerSlot, char *chrom, int chromSize, bits32 span, struct bwgSection **pSectionList) /* Read the single column data in section until get to end. */ { struct lm *lmLocal = lmInit(0); /* Stream through section until get to end of file or next section, * adding values from single column to list. */ char *words[2]; char *line; struct bwgVariableStepItem *item, *nextItem, *itemList = NULL; int originalSectionSize = 0; while (lineFileNextReal(lf, &line)) { if (steppedSectionEnd(line, 2)) { lineFileReuse(lf); break; } chopLine(line, words); lmAllocVar(lmLocal, item); int start = lineFileNeedNum(lf, words, 0); if (start <= 0) { errAbort("line %d of %s: zero or negative chromosome coordinate not allowed", lf->lineIx, lf->fileName); } item->start = start - 1; item->val = lineFileNeedDouble(lf, words, 1); if (item->start + span > chromSize) { warn("line %d of %s: chromosome %s has %u bases, but item ends at %u", lf->lineIx, lf->fileName, chrom, chromSize, item->start + span); if (!clipDontDie) noWarnAbort(); } else { slAddHead(&itemList, item); ++originalSectionSize; } } slSort(&itemList, bwgVariableStepItemCmp); /* Make sure no overlap between items. */ if (itemList != NULL) { item = itemList; for (nextItem = item->next; nextItem != NULL; nextItem = nextItem->next) { if (item->start + span > nextItem->start) errAbort("Overlap on %s between items starting at %d and %d.\n" "Please remove overlaps and try again", chrom, item->start, nextItem->start); item = nextItem; } } /* Break up into sections of no more than items-per-slot size. */ int sizeLeft = originalSectionSize; for (item = itemList; item != NULL; ) { /* Figure out size of this section */ int sectionSize = sizeLeft; if (sectionSize > itemsPerSlot) sectionSize = itemsPerSlot; sizeLeft -= sectionSize; /* Convert from list to array representation. */ struct bwgVariableStepPacked *packed, *p; p = lmAllocArray(lm, packed, sectionSize); int i; for (i=0; istart = item->start; p->val = item->val; item = item->next; ++p; } /* Fill in section and add it to list. */ struct bwgSection *section; lmAllocVar(lm, section); section->chrom = chrom; section->start = packed[0].start; section->end = packed[sectionSize-1].start + span; section->type = bwgTypeVariableStep; section->items.variableStepPacked = packed; section->itemSpan = span; section->itemCount = sectionSize; slAddHead(pSectionList, section); } lmCleanup(&lmLocal); } static unsigned parseUnsignedVal(struct lineFile *lf, char *var, char *val) /* Return val as an integer, printing error message if it's not. */ { char c = val[0]; if (!isdigit(c)) errAbort("Expecting numerical value for %s, got %s, line %d of %s", var, val, lf->lineIx, lf->fileName); return sqlUnsigned(val); } static void parseSteppedSection(struct lineFile *lf, boolean clipDontDie, struct hash *chromSizeHash, char *initialLine, struct lm *lm, int itemsPerSlot, struct bwgSection **pSectionList) /* Parse out a variableStep or fixedStep section and add it to list, breaking it up as need be. */ { /* Parse out first word of initial line and make sure it is something we recognize. */ char *typeWord = nextWord(&initialLine); enum bwgSectionType type = bwgTypeFixedStep; if (sameString(typeWord, "variableStep")) type = bwgTypeVariableStep; else if (sameString(typeWord, "fixedStep")) type = bwgTypeFixedStep; else errAbort("Unknown type %s\n", typeWord); /* Set up defaults for values we hope to parse out of rest of line. */ int span = 0; bits32 step = 0; bits32 start = 0; char *chrom = NULL; /* Parse out var=val pairs. */ char *varEqVal; while ((varEqVal = nextWord(&initialLine)) != NULL) { char *wordPairs[2]; int wc = chopByChar(varEqVal, '=', wordPairs, 2); if (wc != 2) errAbort("strange var=val pair line %d of %s", lf->lineIx, lf->fileName); char *var = wordPairs[0]; char *val = wordPairs[1]; if (sameString(var, "chrom")) chrom = cloneString(val); else if (sameString(var, "span")) span = parseUnsignedVal(lf, var, val); else if (sameString(var, "step")) step = parseUnsignedVal(lf, var, val); else if (sameString(var, "start")) { start = parseUnsignedVal(lf, var, val); } else errAbort("Unknown setting %s=%s line %d of %s", var, val, lf->lineIx, lf->fileName); } /* Check that we have all that are required and no more, and call type-specific routine to parse * rest of section. */ if (chrom == NULL) errAbort("Missing chrom= setting line %d of %s\n", lf->lineIx, lf->fileName); bits32 chromSize = (chromSizeHash ? hashIntVal(chromSizeHash, chrom) : BIGNUM); if (start > chromSize) { warn("line %d of %s: chromosome %s has %u bases, but item starts at %u", lf->lineIx, lf->fileName, chrom, chromSize, start); if (!clipDontDie) noWarnAbort(); } if (type == bwgTypeFixedStep) { if (start == 0) errAbort("Missing start= setting line %d of %s\n", lf->lineIx, lf->fileName); if (step == 0) errAbort("Missing step= setting line %d of %s\n", lf->lineIx, lf->fileName); if (span == 0) span = step; parseFixedStepSection(lf, clipDontDie, lm, itemsPerSlot, chrom, chromSize, span, start-1, step, pSectionList); } else { if (start != 0) errAbort("Extra start= setting line %d of %s\n", lf->lineIx, lf->fileName); if (step != 0) errAbort("Extra step= setting line %d of %s\n", lf->lineIx, lf->fileName); if (span == 0) span = 1; parseVariableStepSection(lf, clipDontDie, lm, itemsPerSlot, chrom, chromSize, span, pSectionList); } } struct bedGraphChrom /* A chromosome in bed graph format. */ { struct bedGraphChrom *next; /* Next in list. */ char *name; /* Chromosome name - not allocated here. */ bits32 size; /* Chromosome size. */ struct bwgBedGraphItem *itemList; /* List of items. */ }; static int bedGraphChromCmpName(const void *va, const void *vb) /* Compare to sort based on query start. */ { const struct bedGraphChrom *a = *((struct bedGraphChrom **)va); const struct bedGraphChrom *b = *((struct bedGraphChrom **)vb); return strcmp(a->name, b->name); } static void parseBedGraphSection(struct lineFile *lf, boolean clipDontDie, struct hash *chromSizeHash, struct lm *lm, int itemsPerSlot, struct bwgSection **pSectionList) /* Parse out bedGraph section until we get to something that is not in bedGraph format. */ { /* Set up hash and list to store chromosomes. */ struct hash *chromHash = hashNew(0); struct bedGraphChrom *chrom, *chromList = NULL; /* Collect lines in items on appropriate chromosomes. */ struct bwgBedGraphItem *item; char *line; while (lineFileNextReal(lf, &line)) { /* Check for end of section. */ if (stepTypeLine(line)) { lineFileReuse(lf); break; } /* Parse out our line and make sure it has exactly 4 columns. */ char *words[5]; int wordCount = chopLine(line, words); lineFileExpectWords(lf, 4, wordCount); /* Get chromosome. */ char *chromName = words[0]; chrom = hashFindVal(chromHash, chromName); if (chrom == NULL) { lmAllocVar(chromHash->lm, chrom); hashAddSaveName(chromHash, chromName, chrom, &chrom->name); chrom->size = (chromSizeHash ? hashIntVal(chromSizeHash, chromName) : BIGNUM); slAddHead(&chromList, chrom); } /* Convert to item and add to chromosome list. */ lmAllocVar(lm, item); item->start = lineFileNeedNum(lf, words, 1); item->end = lineFileNeedNum(lf, words, 2); item->val = lineFileNeedDouble(lf, words, 3); /* Do sanity checking on coordinates. */ if (item->start > item->end) errAbort("bedGraph error: start (%u) after end line (%u) %d of %s.", item->start, item->end, lf->lineIx, lf->fileName); if (item->end > chrom->size) { warn("bedGraph error line %d of %s: chromosome %s has size %u but item ends at %u", lf->lineIx, lf->fileName, chrom->name, chrom->size, item->end); if (!clipDontDie) noWarnAbort(); } else { slAddHead(&chrom->itemList, item); } } slSort(&chromList, bedGraphChromCmpName); /* Loop through each chromosome and output the item list, broken into sections * for that chrom. */ for (chrom = chromList; chrom != NULL; chrom = chrom->next) { slSort(&chrom->itemList, bwgBedGraphItemCmp); /* Check to make sure no overlap between items. */ struct bwgBedGraphItem *item = chrom->itemList, *nextItem; for (nextItem = item->next; nextItem != NULL; nextItem = nextItem->next) { if (item->end > nextItem->start) errAbort("Overlap between %s %d %d and %s %d %d.\nPlease remove overlaps and try again", chrom->name, item->start, item->end, chrom->name, nextItem->start, nextItem->end); item = nextItem; } /* Break up into sections of no more than items-per-slot size. */ struct bwgBedGraphItem *startItem, *endItem, *nextStartItem = chrom->itemList; for (startItem = chrom->itemList; startItem != NULL; startItem = nextStartItem) { /* Find end item of this section, and start item for next section. * Terminate list at end item. */ int sectionSize = 0; int i; endItem = startItem; for (i=0; inext; ++sectionSize; } endItem->next = NULL; /* Fill in section and add it to section list. */ struct bwgSection *section; lmAllocVar(lm, section); section->chrom = cloneString(chrom->name); section->start = startItem->start; section->end = endItem->end; section->type = bwgTypeBedGraph; section->items.bedGraphList = startItem; section->itemCount = sectionSize; slAddHead(pSectionList, section); } } /* Free up hash, no longer needed. Free's chromList as a side effect since chromList is in * hash's memory. */ hashFree(&chromHash); chromList = NULL; } void bwgMakeChromInfo(struct bwgSection *sectionList, struct hash *chromSizeHash, int *retChromCount, struct bbiChromInfo **retChromArray, int *retMaxChromNameSize) /* Fill in chromId field in sectionList. Return array of chromosome name/ids. * The chromSizeHash is keyed by name, and has int values. */ { /* Build up list of unique chromosome names. */ struct bwgSection *section; char *chromName = ""; int chromCount = 0; int maxChromNameSize = 0; struct slRef *uniq, *uniqList = NULL; for (section = sectionList; section != NULL; section = section->next) { if (!sameString(section->chrom, chromName)) { chromName = section->chrom; refAdd(&uniqList, chromName); ++chromCount; int len = strlen(chromName); if (len > maxChromNameSize) maxChromNameSize = len; } section->chromId = chromCount-1; } slReverse(&uniqList); /* Allocate and fill in results array. */ struct bbiChromInfo *chromArray; AllocArray(chromArray, chromCount); int i; for (i = 0, uniq = uniqList; i < chromCount; ++i, uniq = uniq->next) { chromArray[i].name = uniq->val; chromArray[i].id = i; chromArray[i].size = hashIntVal(chromSizeHash, uniq->val); } /* Clean up, set return values and go home. */ slFreeList(&uniqList); *retChromCount = chromCount; *retChromArray = chromArray; *retMaxChromNameSize = maxChromNameSize; } static int bwgStrcmp (const void * A, const void * B) { char * stringA = *((char **) A); char * stringB = *((char **) B); return strcmp(stringA, stringB); } void bwgMakeAllChromInfo(struct bwgSection *sectionList, struct hash *chromSizeHash, int *retChromCount, struct bbiChromInfo **retChromArray, int *retMaxChromNameSize) /* Fill in chromId field in sectionList. Return array of chromosome name/ids. * The chromSizeHash is keyed by name, and has int values. */ { /* Build up list of unique chromosome names. */ int maxChromNameSize = 0; /* Get list of values */ int chromCount = chromSizeHash->elCount; char ** chromName, ** chromNames; AllocArray(chromNames, chromCount); chromName = chromNames; struct hashEl* el; struct hashCookie cookie = hashFirst(chromSizeHash); for (el = hashNext(&cookie); el; el = hashNext(&cookie)) { *chromName = el->name; if (strlen(el->name) > maxChromNameSize) maxChromNameSize = strlen(el->name); chromName++; } qsort(chromNames, chromCount, sizeof(char *), bwgStrcmp); /* Allocate and fill in results array. */ struct bbiChromInfo *chromArray; AllocArray(chromArray, chromCount); int i; for (i = 0; i < chromCount; ++i) { chromArray[i].name = chromNames[i]; chromArray[i].id = i; chromArray[i].size = hashIntVal(chromSizeHash, chromNames[i]); } // Assign IDs to sections: struct bwgSection *section; char *name = ""; bits32 chromId = 0; for (section = sectionList; section != NULL; section = section->next) { if (!sameString(section->chrom, name)) { for (i = 0; i < chromCount; ++i) { if (sameString(section->chrom, chromArray[i].name)) { section->chromId = i; break; } } if (i == chromCount) errAbort("Could not find %s in list of chromosomes\n", section->chrom); chromId = section->chromId; name = section->chrom; } else section->chromId = chromId; } /* Clean up, set return values and go home. */ *retChromCount = chromCount; *retChromArray = chromArray; *retMaxChromNameSize = maxChromNameSize; } int bwgAverageResolution(struct bwgSection *sectionList) /* Return the average resolution seen in sectionList. */ { if (sectionList == NULL) return 1; bits64 totalRes = 0; bits32 sectionCount = 0; struct bwgSection *section; int i; for (section = sectionList; section != NULL; section = section->next) { int sectionRes = 0; switch (section->type) { case bwgTypeBedGraph: { struct bwgBedGraphItem *item; sectionRes = BIGNUM; for (item = section->items.bedGraphList; item != NULL; item = item->next) { int size = item->end - item->start; if (sectionRes > size) sectionRes = size; } break; } case bwgTypeVariableStep: { struct bwgVariableStepPacked *items = section->items.variableStepPacked, *prev; bits32 smallestGap = BIGNUM; for (i=1; iitemCount; ++i) { prev = items; items += 1; bits32 gap = items->start - prev->start; if (smallestGap > gap) smallestGap = gap; } if (smallestGap != BIGNUM) sectionRes = smallestGap; else sectionRes = section->itemSpan; break; } case bwgTypeFixedStep: { sectionRes = section->itemStep; break; } default: internalErr(); break; } totalRes += sectionRes; ++sectionCount; } return (totalRes + sectionCount/2)/sectionCount; } #define bwgSectionHeaderSize 24 /* Size of section header in file. */ static int bwgItemSize(enum bwgSectionType type) /* Return size of an item inside a particular section. */ { switch (type) { case bwgTypeBedGraph: return 2*sizeof(bits32) + sizeof(float); break; case bwgTypeVariableStep: return sizeof(bits32) + sizeof(float); break; case bwgTypeFixedStep: return sizeof(float); break; default: internalErr(); return 0; } } static int bwgSectionSize(struct bwgSection *section) /* Return size (on disk) of section. */ { return bwgSectionHeaderSize + bwgItemSize(section->type) * section->itemCount; } static bits64 bwgTotalSectionSize(struct bwgSection *sectionList) /* Return total size of all sections. */ { bits64 total = 0; struct bwgSection *section; for (section = sectionList; section != NULL; section = section->next) total += bwgSectionSize(section); return total; } static void bwgReduceBedGraph(struct bwgSection *section, bits32 chromSize, int reduction, struct bbiSummary **pOutList) /*Reduce a bedGraph section onto outList. */ { struct bwgBedGraphItem *item = section->items.bedGraphList; for (item = section->items.bedGraphList; item != NULL; item = item->next) { bbiAddRangeToSummary(section->chromId, chromSize, item->start, item->end, item->val, reduction, pOutList); } } static void bwgReduceVariableStep(struct bwgSection *section, bits32 chromSize, int reduction, struct bbiSummary **pOutList) /*Reduce a variableStep section onto outList. */ { struct bwgVariableStepPacked *items = section->items.variableStepPacked; int i; for (i=0; iitemCount; ++i) { bbiAddRangeToSummary(section->chromId, chromSize, items->start, items->start + section->itemSpan, items->val, reduction, pOutList); items += 1; } } static void bwgReduceFixedStep(struct bwgSection *section, bits32 chromSize, int reduction, struct bbiSummary **pOutList) /*Reduce a fixedStep section onto outList. */ { struct bwgFixedStepPacked *items = section->items.fixedStepPacked; int start = section->start; int i; for (i=0; iitemCount; ++i) { bbiAddRangeToSummary(section->chromId, chromSize, start, start + section->itemSpan, items->val, reduction, pOutList); start += section->itemStep; items += 1; } } struct bbiSummary *bwgReduceSectionList(struct bwgSection *sectionList, struct bbiChromInfo *chromInfoArray, int reduction) /* Return summary of section list reduced by given amount. */ { struct bbiSummary *outList = NULL; struct bwgSection *section = NULL; /* Loop through input section list reducing into outList. */ for (section = sectionList; section != NULL; section = section->next) { bits32 chromSize = chromInfoArray[section->chromId].size; switch (section->type) { case bwgTypeBedGraph: bwgReduceBedGraph(section, chromSize, reduction, &outList); break; case bwgTypeVariableStep: bwgReduceVariableStep(section, chromSize, reduction, &outList); break; case bwgTypeFixedStep: bwgReduceFixedStep(section, chromSize, reduction, &outList); break; default: internalErr(); return 0; } } slReverse(&outList); return outList; } static void bwgComputeDynamicSummaries(struct bwgSection *sectionList, struct bbiSummary ** reduceSummaries, bits16 * summaryCount, struct bbiChromInfo *chromInfoArray, int chromCount, bits32 * reductionAmounts, boolean doCompress) { /* Figure out initial summary level - starting with a summary 10 times the amount * of the smallest item. See if summarized data is smaller than half input data, if * not bump up reduction by a factor of 2 until it is, or until further summarying * yeilds no size reduction. */ int i; int minRes = bwgAverageResolution(sectionList); int initialReduction = minRes*10; bits64 fullSize = bwgTotalSectionSize(sectionList); bits64 lastSummarySize = 0, summarySize; bits64 maxReducedSize = fullSize/2; struct bbiSummary *summaryList = NULL; for (;;) { summaryList = bwgReduceSectionList(sectionList, chromInfoArray, initialReduction); bits64 summarySize = bbiTotalSummarySize(summaryList); if (doCompress) { summarySize *= 2; // Compensate for summary not compressing as well as primary data } if (summarySize >= maxReducedSize && summarySize != lastSummarySize) { /* Need to do more reduction. First scale reduction by amount that it missed * being small enough last time, with an extra 10% for good measure. Then * just to keep from spinning through loop two many times, make sure this is * at least 2x the previous reduction. */ int nextReduction = 1.1 * initialReduction * summarySize / maxReducedSize; if (nextReduction < initialReduction*2) nextReduction = initialReduction*2; initialReduction = nextReduction; bbiSummaryFreeList(&summaryList); lastSummarySize = summarySize; } else break; } *summaryCount = 1; reduceSummaries[0] = summaryList; reductionAmounts[0] = initialReduction; /* Now calculate up to 10 levels of further summary. */ bits64 reduction = initialReduction; for (i=0; i<9; i++) { reduction *= 4; if (reduction > 1000000000) break; summaryList = bbiReduceSummaryList(reduceSummaries[*summaryCount-1], chromInfoArray, reduction); summarySize = bbiTotalSummarySize(summaryList); if (summarySize != lastSummarySize) { reduceSummaries[*summaryCount] = summaryList; reductionAmounts[*summaryCount] = reduction; ++(*summaryCount); } int summaryItemCount = slCount(summaryList); if (summaryItemCount <= chromCount) break; } } static void bwgComputeFixedSummaries(struct bwgSection * sectionList, struct bbiSummary ** reduceSummaries, bits16 * summaryCount, struct bbiChromInfo *chromInfoArray, bits32 * reductionAmounts) { // Hack: pre-defining summary levels, set off Ensembl default zoom levels // The last two values of this array were extrapolated following Jim's formula int i; #define REDUCTION_COUNT 10 bits32 presetReductions[REDUCTION_COUNT] = {30, 65, 130, 260, 450, 648, 950, 1296, 4800, 19200}; bits64 reduction = reductionAmounts[0] = presetReductions[0]; reduceSummaries[0] = bwgReduceSectionList(sectionList, chromInfoArray, presetReductions[0]); for (i=1; inext) { bits32 uncSizeOne = bwgSectionWrite(section, doCompress, f); if (uncSizeOne > uncompressBufSize) uncompressBufSize = uncSizeOne; } /* Write out index - creating a temporary array rather than list representation of * sections in the process. */ indexOffset = ftell(f); struct bwgSection **sectionArray; AllocArray(sectionArray, sectionCount); for (section = sectionList, i=0; section != NULL; section = section->next, ++i) sectionArray[i] = section; cirTreeFileBulkIndexToOpenFile(sectionArray, sizeof(sectionArray[0]), sectionCount, blockSize, 1, NULL, bwgSectionFetchKey, bwgSectionFetchOffset, indexOffset, f); freez(§ionArray); /* Write out summary sections. */ verbose(2, "bwgCreate writing %d summaries\n", summaryCount); for (i=0; ivalidCount; totalSum.minVal = sum->minVal; totalSum.maxVal = sum->maxVal; totalSum.sumData = sum->sumData; totalSum.sumSquares = sum->sumSquares; for (sum = sum->next; sum != NULL; sum = sum->next) { totalSum.validCount += sum->validCount; if (sum->minVal < totalSum.minVal) totalSum.minVal = sum->minVal; if (sum->maxVal > totalSum.maxVal) totalSum.maxVal = sum->maxVal; totalSum.sumData += sum->sumData; totalSum.sumSquares += sum->sumSquares; } /* Write real summary */ fseek(f, totalSummaryOffset, SEEK_SET); bbiSummaryElementWrite(f, &totalSum); } else totalSummaryOffset = 0; /* Edge case, no summary. */ /* Go back and fill in offsets properly in header. */ fseek(f, dataOffsetPos, SEEK_SET); writeOne(f, dataOffset); fseek(f, indexOffsetPos, SEEK_SET); writeOne(f, indexOffset); fseek(f, chromTreeOffsetPos, SEEK_SET); writeOne(f, chromTreeOffset); fseek(f, totalSummaryOffsetPos, SEEK_SET); writeOne(f, totalSummaryOffset); if (doCompress) { int maxZoomUncompSize = itemsPerSlot * sizeof(struct bbiSummaryOnDisk); if (maxZoomUncompSize > uncompressBufSize) uncompressBufSize = maxZoomUncompSize; fseek(f, uncompressBufSizePos, SEEK_SET); writeOne(f, uncompressBufSize); } /* Also fill in offsets in zoom headers. */ for (i=0; ilineIx, lf->fileName, line); /* Parse out a bed graph line just to check numerical format. */ char *chrom = words[0]; int start = lineFileNeedNum(lf, words, 1); int end = lineFileNeedNum(lf, words, 2); double val = lineFileNeedDouble(lf, words, 3); verbose(2, "bedGraph %s:%d-%d@%g\n", chrom, start, end, val); /* Push back line and call bed parser. */ lineFileReuse(lf); parseBedGraphSection(lf, clipDontDie, chromSizeHash, lm, maxSectionSize, §ionList); } } slSort(§ionList, bwgSectionCmp); /* Check for overlap at section level. */ struct bwgSection *section, *nextSection; for (section = sectionList; section != NULL; section = nextSection) { nextSection = section->next; if (nextSection != NULL) { if (sameString(section->chrom, nextSection->chrom)) { if (section->end > nextSection->start) { errAbort("There's more than one value for %s base %d (in coordinates that start with 1).\n", section->chrom, nextSection->start+1); } } } } return sectionList; } void bigWigFileCreateEx( char *inName, /* Input file in ascii wiggle format. */ char *chromSizes, /* Two column tab-separated file: . */ int blockSize, /* Number of items to bundle in r-tree. 1024 is good. */ int itemsPerSlot, /* Number of items in lowest level of tree. 512 is good. */ boolean clipDontDie, /* If TRUE then clip items off end of chrom rather than dying. */ boolean compress, /* If TRUE then compress data. */ boolean keepAllChromosomes, /* If TRUE then store all chromosomes in chromosomal b-tree. */ boolean fixedSummaries, /* If TRUE then impose fixed summary levels. */ char *outName) /* Convert ascii format wig file (in fixedStep, variableStep or bedGraph format) * to binary big wig format. */ { /* This code needs to agree with code in two other places currently - bigBedFileCreate, * and bbiFileOpen. I'm thinking of refactoring to share at least between * bigBedFileCreate and bigWigFileCreate. It'd be great so it could be structured * so that it could send the input in one chromosome at a time, and send in the zoom * stuff only after all the chromosomes are done. This'd potentially reduce the memory * footprint by a factor of 2 or 4. Still, for now it works. -JK */ struct hash *chromSizeHash = bbiChromSizesFromFile(chromSizes); struct lm *lm = lmInit(0); struct bwgSection *sectionList = bwgParseWig(inName, clipDontDie, chromSizeHash, itemsPerSlot, lm); if (sectionList == NULL) errAbort("%s is empty of data", inName); bwgCreate(sectionList, chromSizeHash, blockSize, itemsPerSlot, compress, keepAllChromosomes, fixedSummaries, outName); lmCleanup(&lm); } rtracklayer/src/ucsc/bwgInternal.h0000644000175100017510000001041314614231172020266 0ustar00biocbuildbiocbuild/* bwgInternal - stuff to create and use bigWig files. Generally you'll want to use the * simpler interfaces in the bigWig module instead. This file is good reading though * if you want to extend the bigWig interface, or work with bigWig files directly * without going through the Kent library. */ #ifndef BIGWIGFILE_H #define BIGWIGFILE_H enum bwgSectionType /* Code to indicate section type. */ { bwgTypeBedGraph=1, bwgTypeVariableStep=2, bwgTypeFixedStep=3, }; struct bwgBedGraphItem /* An bedGraph-type item in a bwgSection. */ { struct bwgBedGraphItem *next; /* Next in list. */ bits32 start,end; /* Range of chromosome covered. */ float val; /* Value. */ }; struct bwgVariableStepItem /* An variableStep type item in a bwgSection. */ { struct bwgVariableStepItem *next; /* Next in list. */ bits32 start; /* Start position in chromosome. */ float val; /* Value. */ }; struct bwgVariableStepPacked /* An variableStep type item in a bwgSection. */ { bits32 start; /* Start position in chromosome. */ float val; /* Value. */ }; struct bwgFixedStepItem /* An fixedStep type item in a bwgSection. */ { struct bwgFixedStepItem *next; /* Next in list. */ float val; /* Value. */ }; struct bwgFixedStepPacked /* An fixedStep type item in a bwgSection. */ { float val; /* Value. */ }; union bwgItem /* Union of item pointers for all possible section types. */ { struct bwgBedGraphItem *bedGraphList; /* A linked list */ struct bwgFixedStepPacked *fixedStepPacked; /* An array */ struct bwgVariableStepPacked *variableStepPacked; /* An array */ /* No packed format for bedGraph... */ }; struct bwgSection /* A section of a bigWig file - all on same chrom. This is a somewhat fat data * structure used by the bigWig creation code. See also bwgSection for the * structure returned by the bigWig reading code. */ { struct bwgSection *next; /* Next in list. */ char *chrom; /* Chromosome name. */ bits32 start,end; /* Range of chromosome covered. */ enum bwgSectionType type; union bwgItem items; /* List/array of items in this section. */ bits32 itemStep; /* Step within item if applicable. */ bits32 itemSpan; /* Item span if applicable. */ bits16 itemCount; /* Number of items in section. */ bits32 chromId; /* Unique small integer value for chromosome. */ bits64 fileOffset; /* Offset of section in file. */ }; struct bwgSectionHead /* A header from a bigWig file section - similar to above bug what is on disk. */ { bits32 chromId; /* Chromosome short identifier. */ bits32 start,end; /* Range covered. */ bits32 itemStep; /* For some section types, the # of bases between items. */ bits32 itemSpan; /* For some section types, the # of bases in each item. */ UBYTE type; /* Type byte. */ UBYTE reserved; /* Always zero for now. */ bits16 itemCount; /* Number of items in block. */ }; void bwgSectionHeadFromMem(char **pPt, struct bwgSectionHead *head, boolean isSwapped); /* Read section header. */ int bwgSectionCmp(const void *va, const void *vb); /* Compare to sort based on chrom,start,end. */ struct bwgSection *bwgParseWig( char *fileName, /* Name of ascii wig file. */ boolean clipDontDie, /* Skip items outside chromosome rather than aborting. */ struct hash *chromSizeHash, /* If non-NULL items checked to be inside chromosome. */ int maxSectionSize, /* Biggest size of a section. 100 - 100,000 is usual range. */ struct lm *lm); /* Memory pool to allocate from. */ /* Parse out ascii wig file - allocating memory in lm. */ int bwgAverageResolution(struct bwgSection *sectionList); /* Return the average resolution seen in sectionList. */ struct bbiSummary *bwgReduceSectionList(struct bwgSection *sectionList, struct bbiChromInfo *chromInfoArray, int reduction); /* Return summary of section list reduced by given amount. */ void bwgCreate(struct bwgSection *sectionList, struct hash *chromSizeHash, int blockSize, int itemsPerSlot, boolean doCompress, boolean keepAllChromosomes, boolean fixedSummaries, char *fileName); /* Create a bigWig file out of a sorted sectionList. A lower level routine * than the one above. */ #endif /* BIGWIGFILE_H */ rtracklayer/src/ucsc/bwgQuery.c0000644000175100017510000001663214614231172017623 0ustar00biocbuildbiocbuild/* bwgQuery - implements the query side of bigWig. See bwgInternal.h for definition of file * format. */ /* Copyright (C) 2012 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "linefile.h" #include "hash.h" #include "sig.h" #include "sqlNum.h" #include "obscure.h" #include "dystring.h" #include "bPlusTree.h" #include "cirTree.h" #include "rangeTree.h" #include "udc.h" #include "zlibFace.h" #include "bbiFile.h" #include "bwgInternal.h" #include "bigWig.h" #include "bigBed.h" struct bbiFile *bigWigFileOpen(char *fileName) /* Open up big wig file. */ { return bbiFileOpen(fileName, bigWigSig, "big wig"); } void bwgSectionHeadFromMem(char **pPt, struct bwgSectionHead *head, boolean isSwapped) /* Read section header. */ { char *pt = *pPt; head->chromId = memReadBits32(&pt, isSwapped); head->start = memReadBits32(&pt, isSwapped); head->end = memReadBits32(&pt, isSwapped); head->itemStep = memReadBits32(&pt, isSwapped); head->itemSpan = memReadBits32(&pt, isSwapped); head->type = *pt++; head->reserved = *pt++; head->itemCount = memReadBits16(&pt, isSwapped); *pPt = pt; } static int bigWigBlockDumpIntersectingRange(boolean isSwapped, char *blockPt, char *blockEnd, char *chrom, bits32 rangeStart, bits32 rangeEnd, int maxCount, FILE *out) /* Print out info on parts of block that intersect start-end, block starting at current position. */ { struct bwgSectionHead head; bwgSectionHeadFromMem(&blockPt, &head, isSwapped); bits16 i; float val; int outCount = 0; switch (head.type) { case bwgTypeBedGraph: { fprintf(out, "#bedGraph section %s:%u-%u\n", chrom, head.start, head.end); for (i=0; i 0) { fprintf(out, "%s\t%u\t%u\t%g\n", chrom, start, end, val); ++outCount; if (maxCount != 0 && outCount >= maxCount) break; } } break; } case bwgTypeVariableStep: { fprintf(out, "variableStep chrom=%s span=%u\n", chrom, head.itemSpan); for (i=0; i 0) { fprintf(out, "%u\t%g\n", start+1, val); ++outCount; if (maxCount != 0 && outCount >= maxCount) break; } } break; } case bwgTypeFixedStep: { boolean gotStart = FALSE; bits32 start = head.start; for (i=0; i 0) { if (!gotStart) { fprintf(out, "fixedStep chrom=%s start=%u step=%u span=%u\n", chrom, start+1, head.itemStep, head.itemSpan); gotStart = TRUE; } fprintf(out, "%g\n", val); ++outCount; if (maxCount != 0 && outCount >= maxCount) break; } start += head.itemStep; } break; } default: internalErr(); break; } assert( (maxCount != 0 && outCount >= maxCount) || (blockPt == blockEnd)); return outCount; } struct bbiInterval *bigWigIntervalQuery(struct bbiFile *bwf, char *chrom, bits32 start, bits32 end, struct lm *lm) /* Get data for interval. Return list allocated out of lm. */ { if (bwf->typeSig != bigWigSig) errAbort("Trying to do bigWigIntervalQuery on a non big-wig file."); bbiAttachUnzoomedCir(bwf); struct bbiInterval *el, *list = NULL; struct fileOffsetSize *blockList = bbiOverlappingBlocks(bwf, bwf->unzoomedCir, chrom, start, end, NULL); struct fileOffsetSize *block, *beforeGap, *afterGap; struct udcFile *udc = bwf->udc; boolean isSwapped = bwf->isSwapped; float val; int i; /* Set up for uncompression optionally. */ char *uncompressBuf = NULL; if (bwf->uncompressBufSize > 0) uncompressBuf = needLargeMem(bwf->uncompressBufSize); /* This loop is a little complicated because we merge the read requests for efficiency, but we * have to then go back through the data one unmerged block at a time. */ for (block = blockList; block != NULL; ) { /* Find contigious blocks and read them into mergedBuf. */ fileOffsetSizeFindGap(block, &beforeGap, &afterGap); bits64 mergedOffset = block->offset; bits64 mergedSize = beforeGap->offset + beforeGap->size - mergedOffset; udcSeek(udc, mergedOffset); char *mergedBuf = needLargeMem(mergedSize); udcMustRead(udc, mergedBuf, mergedSize); char *blockBuf = mergedBuf; /* Loop through individual blocks within merged section. */ for (;block != afterGap; block = block->next) { /* Uncompress if necessary. */ char *blockPt, *blockEnd; if (uncompressBuf) { blockPt = uncompressBuf; int uncSize = zUncompress(blockBuf, block->size, uncompressBuf, bwf->uncompressBufSize); blockEnd = blockPt + uncSize; } else { blockPt = blockBuf; blockEnd = blockPt + block->size; } /* Deal with insides of block. */ struct bwgSectionHead head; bwgSectionHeadFromMem(&blockPt, &head, isSwapped); switch (head.type) { case bwgTypeBedGraph: { for (i=0; i end) e = end; if (s < e) { lmAllocVar(lm, el); el->start = s; el->end = e; el->val = val; slAddHead(&list, el); } } break; } case bwgTypeVariableStep: { for (i=0; i end) e = end; if (s < e) { lmAllocVar(lm, el); el->start = s; el->end = e; el->val = val; slAddHead(&list, el); } } break; } case bwgTypeFixedStep: { bits32 s = head.start; bits32 e = s + head.itemSpan; for (i=0; i end) clippedE = end; if (clippedS < clippedE) { lmAllocVar(lm, el); el->start = clippedS; el->end = clippedE; el->val = val; slAddHead(&list, el); } s += head.itemStep; e += head.itemStep; } break; } default: internalErr(); break; } assert(blockPt == blockEnd); blockBuf += block->size; } freeMem(mergedBuf); } freeMem(uncompressBuf); slFreeList(&blockList); slReverse(&list); return list; } boolean bigWigSummaryArray(struct bbiFile *bwf, char *chrom, bits32 start, bits32 end, enum bbiSummaryType summaryType, int summarySize, double *summaryValues) /* Fill in summaryValues with data from indicated chromosome range in bigWig file. * Be sure to initialize summaryValues to a default value, which will not be touched * for regions without data in file. (Generally you want the default value to either * be 0.0 or nan("") depending on the application.) Returns FALSE if no data * at that position. */ { boolean ret = bbiSummaryArray(bwf, chrom, start, end, bigWigIntervalQuery, summaryType, summarySize, summaryValues); return ret; } rtracklayer/src/ucsc/cheapcgi.h0000644000175100017510000005321414614231172017563 0ustar00biocbuildbiocbuild/***************************************************************************** * Copyright (C) 2000 Jim Kent. This source code may be freely used * * for personal, academic, and non-profit purposes. Commercial use * * permitted only by explicit agreement with Jim Kent (jim_kent@pacbell.net) * *****************************************************************************/ /* Cheapcgi.h - turns variables passed from the web form into * something that C understands. */ #ifndef CHEAPCGI_H #define CHEAPCGI_H #ifndef DYSTRING_H #include "dystring.h" #endif #ifndef HASH_H #include "hash.h" #endif #define COLOR_BG_DEFAULT "#FFFEE8" #define COLOR_BG_ALTDEFAULT "#FFF9D2" #define COLOR_BG_DEFAULT_DARKER "#FCECC0" #define COLOR_BG_DEFAULT_DARKEST "#EED5B7" #define COLOR_BG_GHOST "#EEEEEE" #define COLOR_BG_PALE "#F8F8F8" #define COLOR_BG_HEADER_LTBLUE "#D9E4F8" #define COLOR_DARKGREEN "#008800" #define COLOR_LTGREEN "#CCFFCC" #define COLOR_DARKBLUE "#000088" #define COLOR_BLUE_BUTTON "#91B3E6" #define COLOR_DARKGREY "#666666" #define COLOR_LTGREY "#CCCCCC" #define COLOR_YELLOW "#FFFF00" #define COLOR_LTYELLOW "#FFF380" #define COLOR_WHITE "#FFFFFF" #define COLOR_RED "#AA0000" #define COLOR_TRACKLIST_LEVEL1 COLOR_BG_DEFAULT #define COLOR_TRACKLIST_LEVEL2 COLOR_BG_ALTDEFAULT #define COLOR_TRACKLIST_LEVEL3 COLOR_BG_DEFAULT_DARKER #define COLOR_TRACKLIST_LEVEL4 COLOR_BG_DEFAULT_DARKEST void initSigHandlers(boolean dumpStack); /* set handler for various terminal signals for logging purposes. * if dumpStack is TRUE, attempt to dump the stack. */ struct cgiVar /* Info on one cgi variable. */ { struct cgiVar *next; /* Next in list. */ char *name; /* Name - allocated in hash. */ char *val; /* Value - also not allocated here. */ boolean saved; /* True if saved. */ }; struct cgiVar* cgiVarList(); /* return the list of cgiVar's */ struct cgiDictionary /* Stuff to encapsulate parsed out CGI vars. */ { struct cgiDictionary *next; /* Next in list if we have multiple */ char *stringData; /* Where values if cgi-vars live. */ struct hash *hash; /* Keyed by cgi-var name, value is cgiVar */ struct cgiVar *list; /* List of all vars. */ }; void cgiDictionaryFree(struct cgiDictionary **pD); /* Free up resources associated with dictionary. */ void cgiDictionaryFreeList(struct cgiDictionary **pList); /* Free up a whole list of cgiDictionaries */ struct cgiDictionary *cgiDictionaryFromEncodedString(char *encodedString); /* Giving a this=that&this=that string, return cgiDictionary parsed out from it. * This does *not* destroy input like the lower level cgiParse functions do. */ char *findCookieData(char *varName); /* Get the string associated with varName from the cookie string. */ void dumpCookieList(); /* Print out the cookie list. */ boolean cgiIsOnWeb(); /* Return TRUE if looks like we're being run as a CGI. */ char *cgiRequestMethod(); /* Return CGI REQUEST_METHOD (such as 'GET/POST/PUT/DELETE/HEAD') */ char *cgiRequestUri(); /* Return CGI REQUEST_URI */ char *cgiRequestContentLength(); /* Return HTTP REQUEST CONTENT_LENGTH if available*/ char *cgiScriptName(); /* Return name of script so libs can do context-sensitive stuff. */ char *cgiServerName(); /* Return name of server, better to use cgiServerNamePort() for actual URL construction */ char *cgiServerPort(); /* Return port number of server */ char *cgiServerNamePort(); /* Return name of server with port if different than 80 */ boolean cgiServerHttpsIsOn(); /* Return true if HTTPS is on */ char *cgiAppendSForHttps(); /* if running on https, add the letter s to the url protocol */ char *cgiRemoteAddr(); /* Return IP address of client (or "unknown"). */ char *cgiUserAgent(); /* Return remote user agent (HTTP_USER_AGENT) or NULL if remote user agent is not known */ enum browserType /* How to look at a track. */ { btUnknown=0, // Not yet known btOpera=1, // Opera btIE=2, // MS Internet Explorer btFF=3, // Firefox btChrome=4, // Google Chrome btSafari=5, // Safari btOther=6 // Anything else }; enum osType /* How to look at a track. */ { osUnknown=0, // Not yet known osWindows=1, // The evil empire osLinux=2, // Workhorse osMac=3, // ashion or Religion osOther=4 // Anything else }; enum browserType cgiClientBrowser(char **browserQualifier, enum osType *clientOs, char **clientOsQualifier); /* These routines abort the html output if the input isn't * there or is misformatted. */ #define cgiBrowser() cgiClientBrowser(NULL,NULL,NULL) char *cgiString(char *varName); int cgiInt(char *varName); double cgiDouble(char *varName); boolean cgiBoolean(char *varName); /* The cgiBoolean is a little problematic. If the variable * is TRUE it exists, but if it is false it is simply not * defined. cgiBoolean() thus returns FALSE if the CGI * variable doesn't exist or if it is set to FALSE. To * work around this when need be use cgiBooleanDefined(), * which relies on the fact that when we define a boolean * variable we also define a hidden variable. */ boolean cgiBooleanDefined(char *name); /* Return TRUE if boolean variable is defined (by * checking for shadow). */ char *cgiBooleanShadowPrefix(); /* Prefix for shadow variable set with boolean variables. */ void cgiMakeHiddenBoolean(char *name, boolean on); /* Make hidden boolean variable. Also make a shadow hidden variable so we * can distinguish between variable not present and * variable set to false. */ char *cgiMultListShadowPrefix(); /* Prefix for shadow variable set with multi-select inputs. */ int cgiIntExp(char *varName); /* Evaluate an integer expression in varName and * return value. */ char *cgiOptionalString(char *varName); /* Return value of string if it exists in cgi environment, else NULL */ char *cgiUsualString(char *varName, char *usual); /* Return value of string if it exists in cgi environment. * Otherwiser return 'usual' */ struct slName *cgiStringList(char *varName); /* Find list of cgi variables with given name. This * may be empty. Free result with slFreeList(). */ int cgiOptionalInt(char *varName, int defaultVal); /* This returns value of varName if it exists in cgi environment, * otherwise it returns defaultVal. */ double cgiOptionalDouble(char *varName, double defaultVal); /* Returns double value. */ #define cgiUsualInt cgiOptionalInt #define cgiUsualDouble cgiOptionalDouble struct cgiChoice /* Choice table */ { char *name; int value; }; int cgiOneChoice(char *varName, struct cgiChoice *choices, int choiceSize); /* Returns value associated with string variable in choice table. */ boolean cgiVarExists(char *varName); /* Returns TRUE if the variable was passed in. */ void cgiBadVar(char *varName); /* Complain about a variable that's not there. */ void cgiDecode(char *in, char *out, int inLength); /* Decode from cgi pluses-for-spaces format to normal. * Out will be a little shorter than in typically. */ void cgiDecodeFull(char *in, char *out, int inLength); /* Out will be a cgi-decoded version of in (no space from plus!). * Out will be a little shorter than in typically, and * can be the same buffer. */ char *cgiEncode(char *inString); /* Return a cgi-encoded version of inString. * Alphanumerics kept as is, space translated to plus, * and all other characters translated to %hexVal. * You can free return value with freeMem(). */ char *cgiEncodeFull(char *inString); /* Return a cgi-encoded version of inString (no + for space!). * Alphanumerics/./_ kept as is and all other characters translated to * %hexVal. */ void cgiMakeButtonWithMsg(char *name, char *value, char *msg); /* Make 'submit' type button. Display msg on mouseover, if present*/ void cgiMakeButtonWithOnClick(char *name, char *value, char *msg, char *onClick); /* Make 'submit' type button, with onclick javascript */ void cgiMakeButton(char *name, char *value); /* Make 'submit' type button. */ void cgiMakeOnClickButton(char *command, char *value); /* Make 'push' type button with client side onClick (java)script. */ void cgiMakeOnClickSubmitButton(char *command, char *name, char *value); /* Make submit button with both variable name and value with client side * onClick (java)script. */ void cgiMakeOptionalButton(char *name, char *value, boolean disabled); /* Make 'submit' type button that can be disabled. */ void cgiMakeRadioButton(char *name, char *value, boolean checked); /* Make radio type button. A group of radio buttons should have the * same name but different values. The default selection should be * sent with checked on. */ void cgiMakeOnClickRadioButton(char *name, char *value, boolean checked, char *command); /* Make radio type button with onClick command. * A group of radio buttons should have the * same name but different values. The default selection should be * sent with checked on. */ void cgiMakeCheckBoxUtil(char *name, boolean checked, char *msg, char *id); /* Make check box - can be called directly, though it was originally meant * as the common code for all lower level checkbox routines. * However, it's util functionality has been taken over by * cgiMakeCheckBoxWithIdAndOptionalHtml() */ void cgiMakeCheckBox(char *name, boolean checked); /* Make check box. */ void cgiMakeCheckBoxWithMsg(char *name, boolean checked, char *msg); /* Make check box, which includes a msg. */ void cgiMakeCheckBoxWithId(char *name, boolean checked, char *id); /* Make check box, which includes an ID. */ void cgiMakeCheckBoxJS(char *name, boolean checked, char *javascript); /* Make check box with javascript */ void cgiMakeCheckBoxIdAndJS(char *name, boolean checked, char *id, char *javascript); /* Make check box with ID and javascript. */ void cgiMakeCheckBoxFourWay(char *name, boolean checked, boolean enabled, char *id, char *classes, char *moreHtml); /* Make check box - with fourWay functionality (checked/unchecked by enabled/disabled * Also makes a shadow hidden variable that supports the 2 boolean states. */ void cgiMakeTextArea(char *varName, char *initialVal, int rowCount, int columnCount); /* Make a text area with area rowCount X columnCount and with text: intialVal. */ void cgiMakeTextAreaDisableable(char *varName, char *initialVal, int rowCount, int columnCount, boolean disabled); /* Make a text area that can be disabled. The rea has rowCount X * columnCount and with text: intialVal */ void cgiMakeTextVar(char *varName, char *initialVal, int charSize); /* Make a text control filled with initial value. If charSize * is zero it's calculated from initialVal size. */ void cgiMakeTextVarWithExtraHtml(char *varName, char *initialVal, int width, char *extra); /* Make a text control filled with initial value. */ void cgiMakeOnKeypressTextVar(char *varName, char *initialVal, int charSize, char *script); /* Make a text control filled with initial value, with a (java)script * to execute every time a key is pressed. If charSize is zero it's * calculated from initialVal size. */ void cgiMakeIntVar(char *varName, int initialVal, int maxDigits); /* Make a text control filled with initial integer value. */ #define NO_VALUE -96669 void cgiMakeIntVarInRange(char *varName, int initialVal, char *title, int width, char *min, char *max); /* Make a integer control filled with initial value. If min and/or max are non-NULL will enforce range Requires utils.js jQuery.js and inputBox class */ void cgiMakeIntVarWithLimits(char *varName, int initialVal, char *title, int width, int min, int max); void cgiMakeIntVarWithMin(char *varName, int initialVal, char *title, int width, int min); void cgiMakeIntVarWithMax(char *varName, int initialVal, char *title, int width, int max); #define cgiMakeIntVarNoLimits(varName,initialVal,title,width) \ cgiMakeIntVarInRange(varName,initialVal,title,width,NULL,NULL) /* All four of these call cgiMakeIntVarInRange() and therefore require utils.js */ void cgiMakeDoubleVar(char *varName, double initialVal, int maxDigits); /* Make a text control filled with initial floating-point value. */ void cgiMakeDoubleVarInRange(char *varName, double initialVal, char *title, int width, char *min, char *max); /* Make a floating point control filled with initial value. If min and/or max are non-NULL will enforce range Requires utils.js jQuery.js and inputBox class */ void cgiMakeDoubleVarWithLimits(char *varName, double initialVal, char *title, int width, double min, double max); void cgiMakeDoubleVarWithMin(char *varName, double initialVal, char *title, int width, double min); void cgiMakeDoubleVarWithMax(char *varName, double initialVal, char *title, int width, double max); #define cgiMakeDoubleVarNoLimits(varName,initialVal,title,width) \ cgiMakeDoubleVarInRange(varName,initialVal,title,width,NULL,NULL) /* All four of these call cgiMakeDoubleVarInRange() and therefore require utils.js */ void cgiMakeDropListClass(char *name, char *menu[], int menuSize, char *checked, char *class); /* Make a drop-down list with names and style sheet class. */ void cgiMakeDropList(char *name, char *menu[], int menuSize, char *checked); /* Make a drop-down list with names. * uses style "normalText" */ void cgiMakeDropListClassWithStyleAndJavascript(char *name, char *menu[], int menuSize, char *checked, char *class, char *style,char *javascript); /* Make a drop-down list with names, text class, style and javascript. */ void cgiMakeDropListClassWithStyle(char *name, char *menu[], int menuSize, char *checked, char *class, char *style); /* Make a drop-down list with names, text class and style. */ void cgiMakeDropListWithVals(char *name, char *menu[], char *values[], int menuSize, char *checked); /* Make a drop-down list with names and values. In this case checked * corresponds to a value, not a menu. */ void cgiMakeDropListFull(char *name, char *menu[], char *values[], int menuSize, char *checked, char *extraAttribs); /* Make a drop-down list with names and values. */ void cgiDropDownWithTextValsAndExtra(char *name, char *text[], char *values[], int count, char *selected, char *extra); /* Make a drop-down list with both text and values. */ char *cgiMakeSelectDropList(boolean multiple, char *name, struct slPair *valsAndLabels, char *selected, char *anyAll,char *extraClasses, char *extraHtml); // Returns allocated string of HTML defining a drop-down select // (if multiple, REQUIRES ui-dropdownchecklist.js) // valsAndLabels: val (pair->name) must be filled in but label (pair->val) may be NULL. // selected: if not NULL is a val found in the valsAndLabels (multiple then comma delimited list). // If null and anyAll not NULL, that will be selected // anyAll: if not NULL is the string for an initial option. It can contain val and label, // delimited by a comma // extraHtml: if not NULL contains id, javascript calls and style. // It does NOT contain class definitions #define cgiMakeMultiSelectDropList(name,valsAndLabels,selected,anyAll,extraClasses,extraHtml) \ cgiMakeSelectDropList(TRUE,(name),(valsAndLabels),(selected),(anyAll),\ (extraClasses),(extraHtml)) #define cgiMakeSingleSelectDropList(name,valsAndLabels,selected,anyAll,extraClasses,extraHtml) \ cgiMakeSelectDropList(FALSE,(name),(valsAndLabels),(selected),(anyAll),\ (extraClasses),(extraHtml)) void cgiMakeMultList(char *name, char *menu[], int menuSize, struct slName *checked, int length); /* Make a list of names which can have multiple selections. * Same as drop-down list except "multiple" is added to select tag */ void cgiMakeCheckboxGroup(char *name, char *menu[], int menuSize, struct slName *checked, int tableColumns); /* Make a table of checkboxes that have the same variable name but different * values (same behavior as a multi-select input). */ void cgiMakeCheckboxGroupWithVals(char *name, char *menu[], char *values[], int menuSize, struct slName *checked, int tableColumns); /* Make a table of checkboxes that have the same variable name but different * values (same behavior as a multi-select input), with nice labels in menu[]. */ void cgiMakeHiddenVarWithExtra(char *varName, char *string, char *extra); /* Store string in hidden input for next time around. */ #define cgiMakeHiddenVar(name,val) cgiMakeHiddenVarWithExtra((name),(val),NULL) /* Store string in hidden input for next time around. */ void cgiContinueHiddenVar(char *varName); /* Write CGI var back to hidden input for next time around. * (if it exists). */ void cgiContinueAllVars(); /* Write back all CGI vars as hidden input for next time around. */ void cgiVarExclude(char *varName); /* If varName exists, remove it. */ void cgiVarExcludeExcept(char **varNames); /* Exclude all variables except for those in NULL * terminated array varNames. varNames may be NULL * in which case nothing is excluded. */ void cgiVarSet(char *varName, char *val); /* Set a cgi variable to a particular value. */ struct dyString *cgiUrlString(); /* Get URL-formatted that expresses current CGI variable state. */ void cgiEncodeIntoDy(char *var, char *val, struct dyString *dy); /* Add a CGI-encoded &var=val string to dy. */ boolean cgiSpoof(int *pArgc, char *argv[]); /* Use the command line to set up things as if we were a CGI program. * User types in command line (assuming your program called cgiScript) * like: * cgiScript nonCgiArg1 var1=value1 var2=value2 var3=value3 nonCgiArg2 * or like * cgiScript nonCgiArg1 var1=value1&var2=value2&var3=value3 nonCgiArg2 * (The non-cgi arguments can occur anywhere. The cgi arguments (all containing * the character '=') are erased from argc/argv. Normally you call this * cgiSpoof(&argc, argv); */ boolean cgiFromCommandLine(int *pArgc, char *argv[], boolean preferWeb); /* Use the command line to set up things as if we were a CGI program. * If preferWeb is TRUE will choose real CGI variables over command * line ones. */ void useTempFile(); /* tell cheapcgi to use temp files */ boolean cgiFromFile(char *fileName); /* Set up a cgi environment using parameters stored in a file. * Takes file with arguments in the form: * argument1=someVal * # This is a comment * argument2=someOtherVal * ... * and puts them into the cgi environment so that the usual * cgiGetVar() commands can be used. Useful when a program * has a lot of possible parameters. */ boolean cgiParseInput(char *input, struct hash **retHash, struct cgiVar **retList); /* Parse cgi-style input into a hash table and list. This will alter * the input data. The hash table will contain references back * into input, so please don't free input until you're done with * the hash. Prints message and returns FALSE if there's an error. * To clean up - slFreeList, hashFree, and only then free input. */ void cgiParseInputAbort(char *input, struct hash **retHash, struct cgiVar **retList); /* Parse cgi-style input into a hash table and list as above but abort if there's an error. */ char *cgiStringNewValForVar(char *cgiIn, char *varName, char *newVal); /* Return a cgi-encoded string with newVal in place of what was oldVal. * It is an error for var not to exist. Do a freeMem of this string * when you are through. */ void cgiSimpleTableStart(); /* start HTML table -- no customization. Leaves room * for a fancier implementation */ void cgiTableEnd(); /* end HTML table */ void cgiMakeSubmitButton(); /* Make 'submit' type button. */ void cgiMakeResetButton(); /* Make 'reset' type button. */ void cgiMakeClearButton(char *form, char *field); /* Make button to clear a text field. */ void cgiMakeFileEntry(char *name); /* Make file entry box/browser */ void cgiSimpleTableRowStart(); /* Start table row */ void cgiTableRowEnd(); /* End table row */ void cgiSimpleTableFieldStart(); /* Start table field */ void cgiTableFieldStartAlignRight(); /* Start table field */ void cgiTableFieldEnd(); /* End table field */ void cgiTableField(char *text); /* Make table field entry */ void cgiTableFieldWithMsg(char *text, char *msg); /* Make table field entry with mouseover */ void cgiParagraph(char *text); /* Make text paragraph */ void logCgiToStderr(); /* Log useful CGI info to stderr */ void cgiResetState(); /* This is for reloading CGI settings multiple times in the same program * execution. No effect if state has not yet been initialized. */ void cgiDown(float lines); // Drop down a certain number of lines (may be fractional) char *commonCssStyles(); /* Returns a string of common CSS styles */ char *javaScriptLiteralEncode(char *inString); /* Use backslash escaping on newline * and quote chars, backslash and others. * Intended that the encoded string will be * put between quotes at a higher level and * then interpreted by Javascript. */ struct cgiParsedVars /* A parsed out cgi variable string */ { struct cgiParsedVars *next; /* In case want to make a list of these. */ char *stringBuf; /* Holds strings inside vars. */ struct cgiVar *list; /* List of variables. */ struct hash *hash; /* Keyed by varName, value is just value, not cgiVar. */ }; struct cgiParsedVars *cgiParsedVarsNew(char *cgiString); /* Build structure containing parsed out cgiString */ void cgiParsedVarsFree(struct cgiParsedVars **pTags); /* Free up memory associated with cgiParsedVars */ #endif /* CHEAPCGI_H */ rtracklayer/src/ucsc/cirTree.c0000644000175100017510000004265414614231172017416 0ustar00biocbuildbiocbuild/* cirTree chromosome id r tree. Part of a system to index chromosome ranges - things of * form chrN:start-end. Generally you'll be using the crTree module - which * makes use of this module and the bPlusTree module - rather than this module directly. * This module works with chromosomes mapped to small integers rather than chromosomes * as strings, saving space and speeding things up in the process, but requiring the * separate bPlusTree to map the names to IDs. * This module implements a one dimensional R-tree index treating the chromosome ID * as the most significant part of a two-part key, and the base position as the least * significant part of the key. */ /* Copyright (C) 2014 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "localmem.h" #include "sig.h" #include "udc.h" #include "cirTree.h" struct rTree /* Recursive range structure. */ { struct rTree *next; /* Next on same level. */ struct rTree *children; /* Child list. */ struct rTree *parent; /* Our parent if any. */ bits32 startChromIx; /* Starting chromosome. */ bits32 startBase; /* Starting base position. */ bits32 endChromIx; /* Ending chromosome. */ bits32 endBase; /* Ending base. */ bits64 startFileOffset; /* Start offset in file for leaves. */ bits64 endFileOffset; /* End file offset for leaves. */ }; #define fileHeaderSize (48) /* Size of file header. */ #define indexSlotSize (24) /* Size of startChrom,startBase,endChrom,endBase,offset */ #define leafSlotSize (32) /* Size of startChrom,startBase,endChrom,endBase,offset,size */ #define nodeHeaderSize (4) /* Size of rTree node header. isLeaf,reserved,childCount. */ int indexNodeSize(int blockSize) /* Return size of an index node. */ { return nodeHeaderSize + indexSlotSize * blockSize; } int leafNodeSize(int blockSize) /* Return size of a leaf node. */ { return nodeHeaderSize + leafSlotSize * blockSize; } static bits64 rWriteIndexLevel(bits16 blockSize, int childNodeSize, struct rTree *tree, int curLevel, int destLevel, bits64 offsetOfFirstChild, FILE *f) /* Recursively write an index level, skipping levels below destLevel, * writing out destLevel. */ { struct rTree *el; bits64 offset = offsetOfFirstChild; if (curLevel == destLevel) { /* We've reached the right level, write out a node header */ UBYTE reserved = 0; UBYTE isLeaf = FALSE; bits16 countOne = slCount(tree->children); writeOne(f, isLeaf); writeOne(f, reserved); writeOne(f, countOne); /* Write out elements of this node. */ for (el = tree->children; el != NULL; el = el->next) { writeOne(f, el->startChromIx); writeOne(f, el->startBase); writeOne(f, el->endChromIx); writeOne(f, el->endBase); writeOne(f, offset); offset += childNodeSize; } /* Write out zeroes for empty slots in node. */ int i; for (i=countOne; ichildren; el != NULL; el = el->next) offset = rWriteIndexLevel(blockSize, childNodeSize, el, curLevel+1, destLevel, offset, f); } return offset; } static void writeIndexLevel(int blockSize, int childNodeSize, struct rTree *tree, bits64 offsetOfFirstChild, int level, FILE *f) /* Write out a non-leaf level nodes at given level. */ { rWriteIndexLevel(blockSize, childNodeSize, tree, 0, level, offsetOfFirstChild, f); } static void rWriteLeaves(int itemsPerSlot, int lNodeSize, struct rTree *tree, int curLevel, int leafLevel, FILE *f) /* Write out leaf-level nodes. */ { if (curLevel == leafLevel) { /* We've reached the right level, write out a node header. */ UBYTE reserved = 0; UBYTE isLeaf = TRUE; bits16 countOne = slCount(tree->children); writeOne(f, isLeaf); writeOne(f, reserved); writeOne(f, countOne); /* Write out elements of this node. */ struct rTree *el; for (el = tree->children; el != NULL; el = el->next) { writeOne(f, el->startChromIx); writeOne(f, el->startBase); writeOne(f, el->endChromIx); writeOne(f, el->endBase); writeOne(f, el->startFileOffset); bits64 size = el->endFileOffset - el->startFileOffset; writeOne(f, size); } /* Write out zeroes for empty slots in node. */ int i; for (i=countOne; ichildren; el != NULL; el = el->next) rWriteLeaves(itemsPerSlot, lNodeSize, el, curLevel+1, leafLevel, f); } } static void writeLeaves(int itemsPerSlot, int lNodeSize, struct rTree *tree, int leafLevel, FILE *f) /* Write out leaf-level nodes. */ { rWriteLeaves(itemsPerSlot, lNodeSize, tree, 0, leafLevel, f); } void calcLevelSizes(struct rTree *tree, int *levelSizes, int level, int maxLevel) /* Recursively count sizes of levels and add to appropriate slots of levelSizes */ { struct rTree *el; for (el = tree; el != NULL; el = el->next) { levelSizes[level] += 1; if (level < maxLevel) calcLevelSizes(el->children, levelSizes, level+1, maxLevel); } } static struct rTree *rTreeFromChromRangeArray( struct lm *lm, int blockSize, int itemsPerSlot, void *itemArray, int itemSize, bits64 itemCount, void *context, struct cirTreeRange (*fetchKey)(const void *va, void *context), bits64 (*fetchOffset)(const void *va, void *context), bits64 endFileOffset, int *retLevelCount) { if (itemCount == 0) return NULL; char *items = itemArray; struct rTree *el, *list=NULL, *tree = NULL; /* Make first level above leaf. */ bits64 i; bits64 nextOffset = (*fetchOffset)(items, context); int oneSize = 0; for (i=0; istartChromIx = el->endChromIx = key.chromIx; el->startBase = key.start; el->endBase = key.end; el->startFileOffset = nextOffset; oneSize = 1; char *endItem = startItem; int j; for (j=i+1; jstartFileOffset) break; else oneSize++; } if (j == itemCount) { nextOffset = endFileOffset; } el->endFileOffset = nextOffset; /* Expand area spanned to include all items in block. */ for (j=1; jstartChromIx) { el->startChromIx = key.chromIx; el->startBase = key.start; } else if (key.chromIx == el->startChromIx) { if (key.start < el->startBase) el->startBase = key.start; } if (key.chromIx > el->endChromIx) { el->endChromIx = key.chromIx; el->endBase = key.end; } else if (key.chromIx == el->endChromIx) { if (key.end > el->endBase) el->endBase = key.end; } } } slReverse(&list); verbose(2, "Made %d primary index nodes out of %llu items\n", slCount(list), itemCount); /* Now iterate through making more and more condensed versions until have just one. */ int levelCount = 1; tree = list; while (tree->next != NULL || levelCount < 2) { list = NULL; int slotsUsed = blockSize; struct rTree *parent = NULL, *next; for (el = tree; el != NULL; el = next) { next = el->next; if (slotsUsed >= blockSize) { slotsUsed = 1; lmAllocVar(lm, parent); parent = lmCloneMem(lm, el, sizeof(*el)); parent->children = el; el->parent = parent; el->next = NULL; slAddHead(&list, parent); } else { ++slotsUsed; slAddHead(&parent->children, el); el->parent = parent; if (el->startChromIx < parent->startChromIx) { parent->startChromIx = el->startChromIx; parent->startBase = el->startBase; } else if (el->startChromIx == parent->startChromIx) { if (el->startBase < parent->startBase) parent->startBase = el->startBase; } if (el->endChromIx > parent->endChromIx) { parent->endChromIx = el->endChromIx; parent->endBase = el->endBase; } else if (el->endChromIx == parent->endChromIx) { if (el->endBase > parent->endBase) parent->endBase = el->endBase; } } } slReverse(&list); for (el = list; el != NULL; el = el->next) slReverse(&el->children); tree = list; levelCount += 1; } *retLevelCount = levelCount; return tree; } static void writeTreeToOpenFile(struct rTree *tree, int blockSize, int levelCount, FILE *f) /* Write out tree to a file that is open already - writing out index nodes from * highest to lowest level, and then leaf nodes. */ { /* Calculate sizes of each level. */ int i; int levelSizes[levelCount]; for (i=0; istartChromIx); writeOne(f, tree->startBase); writeOne(f, tree->endChromIx); writeOne(f, tree->endBase); writeOne(f, endFileOffset); writeOne(f, itemsPerSlot); writeOne(f, reserved); if (tree != &dummyTree) writeTreeToOpenFile(tree, blockSize, levelCount, f); lmCleanup(&lm); } struct cirTreeFile *cirTreeFileAttach(char *fileName, struct udcFile *udc) /* Open up r-tree index file on previously open file, with cirTree * header at current file position. */ { /* Open file and allocate structure to hold info from header etc. */ struct cirTreeFile *crt = needMem(sizeof(*crt)); crt->fileName = fileName; crt->udc = udc; /* Read magic number at head of file and use it to see if we are proper file type, and * see if we are byte-swapped. */ bits32 magic; boolean isSwapped = FALSE; udcMustReadOne(udc, magic); if (magic != cirTreeSig) { magic = byteSwap32(magic); isSwapped = crt->isSwapped = TRUE; if (magic != cirTreeSig) errAbort("%s is not a chromosome id r-tree index file", fileName); } /* Read rest of defined bits of header, byte swapping as needed. */ crt->blockSize = udcReadBits32(udc, isSwapped); crt->itemCount = udcReadBits64(udc, isSwapped); crt->startChromIx = udcReadBits32(udc, isSwapped); crt->startBase = udcReadBits32(udc, isSwapped); crt->endChromIx = udcReadBits32(udc, isSwapped); crt->endBase = udcReadBits32(udc, isSwapped); crt->fileSize = udcReadBits64(udc, isSwapped); crt->itemsPerSlot = udcReadBits32(udc, isSwapped); /* Skip over reserved bits of header. */ bits32 reserved32; udcMustReadOne(udc, reserved32); /* Save position of root block of r tree. */ crt->rootOffset = udcTell(udc); return crt; } void cirTreeFileDetach(struct cirTreeFile **pCrt) /* Detatch and free up cirTree file opened with cirTreeFileAttach. */ { freez(pCrt); } INLINE int cmpTwoBits32(bits32 aHi, bits32 aLo, bits32 bHi, bits32 bLo) /* Return - if b is less than a , 0 if equal, else +*/ { if (aHi < bHi) return 1; else if (aHi > bHi) return -1; else { if (aLo < bLo) return 1; else if (aLo > bLo) return -1; else return 0; } } INLINE boolean cirTreeOverlaps(int qChrom, int qStart, int qEnd, int rStartChrom, int rStartBase, int rEndChrom, int rEndBase) { return cmpTwoBits32(qChrom, qStart, rEndChrom, rEndBase) > 0 && cmpTwoBits32(qChrom, qEnd, rStartChrom, rStartBase) < 0; } static void rFindOverlappingBlocks(struct cirTreeFile *crt, int level, bits64 indexFileOffset, bits32 chromIx, bits32 start, bits32 end, struct fileOffsetSize **retList) /* Recursively find blocks with data. */ { struct udcFile *udc = crt->udc; /* Seek to start of block. */ udcSeek(udc, indexFileOffset); /* Read block header. */ UBYTE isLeaf; UBYTE reserved; bits16 i, childCount; udcMustReadOne(udc, isLeaf); udcMustReadOne(udc, reserved); boolean isSwapped = crt->isSwapped; childCount = udcReadBits16(udc, isSwapped); verbose(3, "rFindOverlappingBlocks %llu %u:%u-%u. childCount %d. isLeaf %d\n", indexFileOffset, chromIx, start, end, (int)childCount, (int)isLeaf); if (isLeaf) { /* Loop through node adding overlapping leaves to block list. */ for (i=0; ioffset = offset; block->size = size; slAddHead(retList, block); } } } else { /* Read node into arrays. */ bits32 startChromIx[childCount], startBase[childCount]; bits32 endChromIx[childCount], endBase[childCount]; bits64 offset[childCount]; for (i=0; irootOffset, chromIx, start, end, &blockList); slReverse(&blockList); return blockList; } static void rEnumerateBlocks(struct cirTreeFile *crt, int level, bits64 indexFileOffset, struct fileOffsetSize **retList) /* Recursively find blocks with data. */ { struct udcFile *udc = crt->udc; /* Seek to start of block. */ udcSeek(udc, indexFileOffset); /* Read block header. */ UBYTE isLeaf; UBYTE reserved; bits16 i, childCount; udcMustReadOne(udc, isLeaf); udcMustReadOne(udc, reserved); boolean isSwapped = crt->isSwapped; childCount = udcReadBits16(udc, isSwapped); verbose(3, "rEnumerateBlocks %llu childCount %d. isLeaf %d\n", indexFileOffset, (int)childCount, (int)isLeaf); if (isLeaf) { /* Loop through node adding overlapping leaves to block list. */ for (i=0; ioffset = offset; block->size = size; slAddHead(retList, block); } } else { /* Read node into arrays. */ bits64 offset[childCount]; for (i=0; i>1); char *end = bytes+length; char c; while (--halfLen >= 0) { c = *bytes; *bytes++ = *--end; *end = c; } } /** List managing routines. */ /* Count up elements in list. */ int slCount(const void *list) { struct slList *pt = (struct slList *)list; int len = 0; while (pt != NULL) { len += 1; pt = pt->next; } return len; } void *slElementFromIx(void *list, int ix) /* Return the ix'th element in list. Returns NULL * if no such element. */ { struct slList *pt = (struct slList *)list; int i; for (i=0;inext; } return pt; } int slIxFromElement(void *list, void *el) /* Return index of el in list. Returns -1 if not on list. */ { struct slList *pt; int ix = 0; for (pt = list, ix=0; pt != NULL; pt = pt->next, ++ix) if (el == (void*)pt) return ix; return -1; } void *slLastEl(void *list) /* Returns last element in list or NULL if none. */ { struct slList *next, *el; if ((el = list) == NULL) return NULL; while ((next = el->next) != NULL) el = next; return el; } /* Add new node to tail of list. * Usage: * slAddTail(&list, node); * where list and nodes are both pointers to structure * that begin with a next pointer. */ void slAddTail(void *listPt, void *node) { struct slList **ppt = (struct slList **)listPt; struct slList *n = (struct slList *)node; while (*ppt != NULL) { ppt = &((*ppt)->next); } n->next = NULL; *ppt = n; } void *slPopHead(void *vListPt) /* Return head of list and remove it from list. (Fast) */ { struct slList **listPt = (struct slList **)vListPt; struct slList *el = *listPt; if (el != NULL) { *listPt = el->next; el->next = NULL; } return el; } void *slCat(void *va, void *vb) /* Return concatenation of lists a and b. * Example Usage: * struct slName *a = getNames("a"); * struct slName *b = getNames("b"); * struct slName *ab = slCat(a,b) */ { struct slList *a = va; struct slList *b = vb; struct slList *end; if (a == NULL) return b; for (end = a; end->next != NULL; end = end->next) ; end->next = b; return a; } void slReverse(void *listPt) /* Reverse order of a list. * Usage: * slReverse(&list); */ { struct slList **ppt = (struct slList **)listPt; struct slList *newList = NULL; struct slList *el, *next; next = *ppt; while (next != NULL) { el = next; next = el->next; el->next = newList; newList = el; } *ppt = newList; } void slFreeList(void *listPt) /* Free list */ { struct slList **ppt = (struct slList**)listPt; struct slList *next = *ppt; struct slList *el; while (next != NULL) { el = next; next = el->next; freeMem((char*)el); } *ppt = NULL; } void slSort(void *pList, int (*compare )(const void *elem1, const void *elem2)) /* Sort a singly linked list with Qsort and a temporary array. */ { struct slList **pL = (struct slList **)pList; struct slList *list = *pL; int count; count = slCount(list); if (count > 1) { struct slList *el; struct slList **array; int i; array = needLargeMem(count * sizeof(*array)); for (el = list, i=0; el != NULL; el = el->next, i++) array[i] = el; qsort(array, count, sizeof(array[0]), compare); list = NULL; for (i=0; inext = list; list = array[i]; } freeMem(array); slReverse(&list); *pL = list; } } void slUniqify(void *pList, int (*compare )(const void *elem1, const void *elem2), void (*free)()) /* Return sorted list with duplicates removed. * Compare should be same type of function as slSort's compare (taking * pointers to pointers to elements. Free should take a simple * pointer to dispose of duplicate element, and can be NULL. */ { struct slList **pSlList = (struct slList **)pList; struct slList *oldList = *pSlList; struct slList *newList = NULL, *el; slSort(&oldList, compare); while ((el = slPopHead(&oldList)) != NULL) { if ((newList == NULL) || (compare(&newList, &el) != 0)) slAddHead(&newList, el); else if (free != NULL) free(el); } slReverse(&newList); *pSlList = newList; } boolean slRemoveEl(void *vpList, void *vToRemove) /* Remove element from singly linked list. Usage: * slRemove(&list, el); * Returns TRUE if element in list. */ { struct slList **pList = vpList; struct slList *toRemove = vToRemove; struct slList *el, *next, *newList = NULL; boolean didRemove = FALSE; for (el = *pList; el != NULL; el = next) { next = el->next; if (el != toRemove) { slAddHead(&newList, el); } else didRemove = TRUE; } slReverse(&newList); *pList = newList; return didRemove; } struct slInt *slIntNew(int x) /* Return a new int. */ { struct slInt *a; AllocVar(a); a->val = x; return a; } static int doubleCmp(const void *va, const void *vb) /* Compare function to sort array of doubles. */ { const double *a = va; const double *b = vb; double diff = *a - *b; if (diff < 0) return -1; else if (diff > 0) return 1; else return 0; } void doubleSort(int count, double *array) /* Sort an array of doubles. */ { if (count > 1) qsort(array, count, sizeof(array[0]), doubleCmp); } double doubleMedian(int count, double *array) /* Return median value in array. This will sort * the array as a side effect. */ { double median; doubleSort(count, array); if ((count&1) == 1) median = array[count>>1]; else { count >>= 1; median = (array[count] + array[count-1]) * 0.5; } return median; } void doubleBoxWhiskerCalc(int count, double *array, double *retMin, double *retQ1, double *retMedian, double *retQ3, double *retMax) /* Calculate what you need to draw a box and whiskers plot from an array of doubles. */ { if (count <= 0) errAbort("doubleBoxWhiskerCalc needs a positive number, not %d for count", count); if (count == 1) { *retMin = *retQ1 = *retMedian = *retQ3 = *retMax = array[0]; return; } doubleSort(count, array); double min = array[0]; double max = array[count-1]; double median; int halfCount = count>>1; if ((count&1) == 1) median = array[halfCount]; else { median = (array[halfCount] + array[halfCount-1]) * 0.5; } double q1, q3; if (count <= 3) { q1 = 0.5 * (median + min); q3 = 0.5 * (median + max); } else { int q1Ix = count/4; int q3Ix = count - 1 - q1Ix; uglyf("count %d, q1Ix %d, q3Ix %d\n", count, q1Ix, q3Ix); q1 = array[q1Ix]; q3 = array[q3Ix]; } *retMin = min; *retQ1 = q1; *retMedian = median; *retQ3 = q3; *retMax = max; } static int intCmp(const void *va, const void *vb) /* Compare function to sort array of ints. */ { const int *a = va; const int *b = vb; int diff = *a - *b; if (diff < 0) return -1; else if (diff > 0) return 1; else return 0; } void intSort(int count, int *array) /* Sort an array of ints. */ { if (count > 1) qsort(array, count, sizeof(array[0]), intCmp); } struct slName *newSlName(char *name) /* Return a new name. */ { struct slName *sn; if (name != NULL) { int len = strlen(name); sn = needMem(sizeof(*sn)+len); strcpy(sn->name, name); return sn; } else { AllocVar(sn); } return sn; } struct slName *slNameNewN(char *name, int size) /* Return new slName of given size. */ { struct slName *sn = needMem(sizeof(*sn) + size); memcpy(sn->name, name, size); return sn; } int slNameCmpCase(const void *va, const void *vb) /* Compare two slNames, ignore case. */ { const struct slName *a = *((struct slName **)va); const struct slName *b = *((struct slName **)vb); return strcasecmp(a->name, b->name); } int slNameCmp(const void *va, const void *vb) /* Compare two slNames. */ { const struct slName *a = *((struct slName **)va); const struct slName *b = *((struct slName **)vb); return strcmp(a->name, b->name); } void slNameSort(struct slName **pList) /* Sort slName list. */ { slSort(pList, slNameCmp); } char *slNameStore(struct slName **pList, char *string) /* Put string into list if it's not there already. * Return the version of string stored in list. */ { struct slName *el; for (el = *pList; el != NULL; el = el->next) { if (sameString(string, el->name)) return el->name; } el = newSlName(string); slAddHead(pList, el); return el->name; } struct slName *slNameAddHead(struct slName **pList, char *name) /* Add name to start of list and return it. */ { struct slName *el = slNameNew(name); slAddHead(pList, el); return el; } struct slName *slNameListFromString(char *s, char delimiter) /* Return list of slNames gotten from parsing delimited string. * The final delimiter is optional. a,b,c and a,b,c, are equivalent * for comma-delimited lists. */ { char *e; struct slName *list = NULL, *el; while (s != NULL && s[0] != 0) { e = strchr(s, delimiter); if (e == NULL) el = slNameNew(s); else { el = slNameNewN(s, e-s); e += 1; } slAddHead(&list, el); s = e; } slReverse(&list); return list; } struct slRef *refOnList(struct slRef *refList, void *val) /* Return ref if val is already on list, otherwise NULL. */ { struct slRef *ref; for (ref = refList; ref != NULL; ref = ref->next) if (ref->val == val) return ref; return NULL; } struct slRef *slRefNew(void *val) /* Create new slRef element. */ { struct slRef *ref; AllocVar(ref); ref->val = val; return ref; } void refAdd(struct slRef **pRefList, void *val) /* Add reference to list. */ { struct slRef *ref; AllocVar(ref); ref->val = val; slAddHead(pRefList, ref); } void slRefFreeListAndVals(struct slRef **pList) /* Free up (with simple freeMem()) each val on list, and the list itself as well. */ { struct slRef *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; freeMem(el->val); freeMem(el); } *pList = NULL; } struct slPair *slPairNew(char *name, void *val) /* Allocate new name/value pair. */ { struct slPair *el; AllocVar(el); el->name = cloneString(name); el->val = val; return el; } void slPairAdd(struct slPair **pList, char *name, void *val) /* Add new slPair to head of list. */ { struct slPair *el = slPairNew(name, val); slAddHead(pList, el); } void slPairFree(struct slPair **pEl) /* Free up struct and name. (Don't free up values.) */ { struct slPair *el = *pEl; if (el != NULL) { freeMem(el->name); freez(pEl); } } void slPairFreeList(struct slPair **pList) /* Free up list. (Don't free up values.) */ { struct slPair *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; slPairFree(&el); } *pList = NULL; } void slPairFreeVals(struct slPair *list) /* Free up all values on list. */ { struct slPair *el; for (el = list; el != NULL; el = el->next) freez(&el->val); } struct slPair *slPairFind(struct slPair *list, char *name) /* Return list element of given name, or NULL if not found. */ { struct slPair *el; for (el = list; el != NULL; el = el->next) if (sameString(name, el->name)) break; return el; } struct slPair *slPairListFromString(char *str,boolean respectQuotes) // Return slPair list parsed from list in string like: [name1=val1 name2=val2 ...] // if respectQuotes then string can have double quotes: [name1="val 1" "name 2"=val2 ...] // resulting pair strips quotes: {name1}={val 1},{name 2}={val2} // Returns NULL if parse error. Free this up with slPairFreeValsAndList. { char *s = skipLeadingSpaces(str); // Would like to remove this and tighten up the standard someday. if (isEmpty(s)) return NULL; struct slPair *list = NULL; char name[1024]; char val[1024]; char buf[1024]; bool inQuote = FALSE; char *b = buf; char sep = '='; char c = ' '; int mode = 0; while(1) { c = *s++; if (mode == 0 || mode == 2) // reading name or val { boolean term = FALSE; if (respectQuotes && b == buf && !inQuote && c == '"') inQuote = TRUE; else if (inQuote && c == '"') term = TRUE; else if ((c == sep || c == 0) && !inQuote) { term = TRUE; --s; // rewind } else if (c == ' ' && !inQuote) { warn("slPairListFromString: Unexpected whitespace in %s", str); return NULL; } else if (c == 0 && inQuote) { warn("slPairListFromString: Unterminated quote in %s", str); return NULL; } else { *b++ = c; if ((b - buf) > sizeof buf) { warn("slPairListFromString: pair name or value too long in %s", str); return NULL; } } if (term) { inQuote = FALSE; *b = 0; if (mode == 0) { safecpy(name, sizeof name, buf); if (strlen(name)<1) { warn("slPairListFromString: Pair name cannot be empty in %s", str); return NULL; } // Shall we check for name being alphanumeric, at least for the respectQuotes=FALSE case? } else // mode == 2 { safecpy(val, sizeof val, buf); if (!respectQuotes && (hasWhiteSpace(name) || hasWhiteSpace(val))) // should never happen { warn("slPairListFromString() Unexpected white space in name=value pair: [%s]=[%s] in string=[%s]\n", name, val, str); break; } slPairAdd(&list, name, cloneString(val)); } ++mode; } } else if (mode == 1) // read required "=" sign { if (c != '=') { warn("slPairListFromString: Expected character = after name in %s", str); return NULL; } ++mode; sep = ' '; b = buf; } else // (mode == 3) reading optional separating space { if (c == 0) break; if (c != ' ') { mode = 0; --s; b = buf; sep = '='; } } } slReverse(&list); return list; } int slPairValCmpCase(const void *va, const void *vb) /* Case insensitive compare two slPairs on their values (must be string). */ { const struct slPair *a = *((struct slPair **)va); const struct slPair *b = *((struct slPair **)vb); return strcasecmp((char *)(a->val), (char *)(b->val)); } int slPairValCmp(const void *va, const void *vb) /* Compare two slPairs on their values (must be string). */ { const struct slPair *a = *((struct slPair **)va); const struct slPair *b = *((struct slPair **)vb); return strcmp((char *)(a->val), (char *)(b->val)); } int slPairIntCmp(const void *va, const void *vb) // Compare two slPairs on their integer values. { const struct slPair *a = *((struct slPair **)va); const struct slPair *b = *((struct slPair **)vb); return ((char *)(a->val) - (char *)(b->val)); // cast works and val is 0 vased integer } int slPairAtoiCmp(const void *va, const void *vb) // Compare two slPairs on their strings interpreted as integer values. { const struct slPair *a = *((struct slPair **)va); const struct slPair *b = *((struct slPair **)vb); return (atoi((char *)(a->val)) - atoi((char *)(b->val))); } int differentWord(char *s1, char *s2) /* strcmp ignoring case - returns zero if strings are * the same (ignoring case) otherwise returns difference * between first non-matching characters. */ { char c1, c2; for (;;) { c1 = toupper(*s1++); c2 = toupper(*s2++); if (c1 != c2) /* Takes care of end of string in one but not the other too */ return c2-c1; if (c1 == 0) /* Take care of end of string in both. */ return 0; } } int differentStringNullOk(char *a, char *b) /* Returns 0 if two strings (either of which may be NULL) * are the same. Otherwise it returns a positive or negative * number depending on the alphabetical order of the two * strings. * This is basically a strcmp that can handle NULLs in * the input. If used in a sort the NULLs will end * up before any of the cases with data. */ { if (a == b) return FALSE; else if (a == NULL) return -1; else if (b == NULL) return 1; else return strcmp(a,b) != 0; } boolean startsWith(const char *start, const char *string) /* Returns TRUE if string begins with start. */ { char c; int i; for (i=0; ;i += 1) { if ((c = start[i]) == 0) return TRUE; if (string[i] != c) return FALSE; } } boolean startsWithWord(char *firstWord, char *line) /* Return TRUE if first white-space-delimited word in line * is same as firstWord. Comparison is case sensitive. */ { int len = strlen(firstWord); int i; for (i=0; i= limit) if (*s == c) return s; return NULL; } void toUpperN(char *s, int n) /* Convert a section of memory to upper case. */ { int i; for (i=0; i= 0 && bNum >= 0) { int diff = atoi(a) - atoi(b); if (diff != 0) return diff; a += aNum; b += bNum; } /* Count number of non-digits at start. */ int aNonNum = countLeadingNondigits(a); int bNonNum = countLeadingNondigits(b); // If different sizes of non-numerical part, then don't match, let strcmp sort out how if (aNonNum != bNonNum) return strcmp(a,b); // If no characters left then they are the same! else if (aNonNum == 0) return 0; // Non-numerical part is the same length and non-zero. See if it is identical. Return if not. else { int diff = memcmp(a,b,aNonNum); if (diff != 0) return diff; a += aNonNum; b += bNonNum; } } } /* int chopString(in, sep, outArray, outSize); */ /* This chops up the input string (cannabilizing it) * into an array of zero terminated strings in * outArray. It returns the number of strings. * If you pass in NULL for outArray, it will just * return the number of strings that it *would* * chop. * GOTCHA: since multiple separators are skipped * and treated as one, it is impossible to parse * a list with an empty string. * e.g. cat\t\tdog returns only cat and dog but no empty string */ int chopString(char *in, char *sep, char *outArray[], int outSize) { int recordCount = 0; for (;;) { if (outArray != NULL && recordCount >= outSize) break; /* Skip initial separators. */ in += strspn(in, sep); if (*in == 0) break; if (outArray != NULL) outArray[recordCount] = in; recordCount += 1; in += strcspn(in, sep); if (*in == 0) break; if (outArray != NULL) *in = 0; in += 1; } return recordCount; } int chopByWhite(char *in, char *outArray[], int outSize) /* Like chopString, but specialized for white space separators. * See the GOTCHA in chopString */ { int recordCount = 0; char c; for (;;) { if (outArray != NULL && recordCount >= outSize) break; /* Skip initial separators. */ while (isspace(*in)) ++in; if (*in == 0) break; /* Store start of word and look for end of word. */ if (outArray != NULL) outArray[recordCount] = in; recordCount += 1; for (;;) { if ((c = *in) == 0) break; if (isspace(c)) break; ++in; } if (*in == 0) break; /* Tag end of word with zero. */ if (outArray != NULL) *in = 0; /* And skip over the zero. */ in += 1; } return recordCount; } int chopByChar(char *in, char chopper, char *outArray[], int outSize) /* Chop based on a single character. */ { int i; char c; if (*in == 0) return 0; for (i=0; (i=0; --i) { c = s[i]; if (isspace(c)) s[i] = 0; else break; } } /* Remove white space from a string */ void eraseWhiteSpace(char *s) { char *in, *out; char c; in = out = s; for (;;) { c = *in++; if (c == 0) break; if (!isspace(c)) *out++ = c; } *out++ = 0; } char *trimSpaces(char *s) /* Remove leading and trailing white space. */ { if (s != NULL) { s = skipLeadingSpaces(s); eraseTrailingSpaces(s); } return s; } void repeatCharOut(FILE *f, char c, int count) /* Write character to file repeatedly. */ { while (--count >= 0) fputc(c, f); } void spaceOut(FILE *f, int count) /* Put out some spaces to file. */ { repeatCharOut(f, ' ', count); } boolean hasWhiteSpace(char *s) /* Return TRUE if there is white space in string. */ { char c; while ((c = *s++) != 0) if (isspace(c)) return TRUE; return FALSE; } char *nextWord(char **pLine) /* Return next word in *pLine and advance *pLine to next * word. */ { char *s = *pLine, *e; if (s == NULL || s[0] == 0) return NULL; s = skipLeadingSpaces(s); if (s[0] == 0) return NULL; e = skipToSpaces(s); if (e != NULL) *e++ = 0; *pLine = e; return s; } char *nextWordRespectingQuotes(char **pLine) // return next word but respects single or double quotes surrounding sets of words. { char *s = *pLine, *e; if (s == NULL || s[0] == 0) return NULL; s = skipLeadingSpaces(s); if (s[0] == 0) return NULL; if (s[0] == '"') { e = skipBeyondDelimit(s+1,'"'); if (e != NULL && !isspace(e[0])) e = skipToSpaces(s); } else if (s[0] == '\'') { e = skipBeyondDelimit(s+1,'\''); if (e != NULL && !isspace(e[0])) e = skipToSpaces(s); } else e = skipToSpaces(s); if (e != NULL) *e++ = 0; *pLine = e; return s; } char *cloneFirstWordByDelimiter(char *line,char delimit) /* Returns a cloned first word, not harming the memory passed in */ { if (line == NULL || *line == 0) return NULL; line = skipLeadingSpaces(line); if (*line == 0) return NULL; int size=0; char *e; for (e=line;*e!=0;e++) { if (*e==delimit) break; else if (delimit == ' ' && isspace(*e)) break; size++; } if (size == 0) return NULL; char *new = needMem(size + 2); // Null terminated by 2 memcpy(new, line, size); return new; } char *nextStringInList(char **pStrings) /* returns pointer to the first string and advances pointer to next in list of strings dilimited by 1 null and terminated by 2 nulls. */ { if (pStrings == NULL || *pStrings == NULL || **pStrings == 0) return NULL; char *p=*pStrings; *pStrings += strlen(p)+1; return p; } FILE *mustOpen(char *fileName, char *mode) /* Open a file - or squawk and die. */ { FILE *f; if (sameString(fileName, "stdin")) return stdin; if (sameString(fileName, "stdout")) return stdout; if ((f = fopen(fileName, mode)) == NULL) { char *modeName = ""; if (mode) { if (mode[0] == 'r') modeName = " to read"; else if (mode[0] == 'w') modeName = " to write"; else if (mode[0] == 'a') modeName = " to append"; } errAbort("mustOpen: Can't open %s%s: %s", fileName, modeName, strerror(errno)); } return f; } void mustWrite(FILE *file, void *buf, size_t size) /* Write to a file or squawk and die. */ { if (size != 0 && fwrite(buf, size, 1, file) != 1) { errAbort("Error writing %lld bytes: %s\n", (long long)size, strerror(ferror(file))); } } void mustRead(FILE *file, void *buf, size_t size) /* Read size bytes from a file or squawk and die. */ { if (size != 0 && fread(buf, size, 1, file) != 1) { if (ferror(file)) errAbort("Error reading %lld bytes: %s", (long long)size, strerror(ferror(file))); else errAbort("End of file reading %lld bytes", (long long)size); } } void writeString(FILE *f, char *s) /* Write a 255 or less character string to a file. * This will write the length of the string in the first * byte then the string itself. */ { UBYTE bLen; int len = strlen(s); if (len > 255) { warn("String too long in writeString (%d chars):\n%s", len, s); len = 255; } bLen = len; writeOne(f, bLen); mustWrite(f, s, len); } char *readString(FILE *f) /* Read a string (written with writeString) into * memory. freeMem the result when done. */ { UBYTE bLen; int len; char *s; if (!readOne(f, bLen)) return NULL; len = bLen; s = needMem(len+1); if (len > 0) mustRead(f, s, len); return s; } boolean fastReadString(FILE *f, char buf[256]) /* Read a string into buffer, which must be long enough * to hold it. String is in 'writeString' format. */ { UBYTE bLen; int len; if (!readOne(f, bLen)) return FALSE; if ((len = bLen)> 0) mustRead(f, buf, len); buf[len] = 0; return TRUE; } void mustGetLine(FILE *file, char *buf, int charCount) /* Read at most charCount-1 bytes from file, but stop after newline if one is * encountered. The string in buf is '\0'-terminated. (See man 3 fgets.) * Die if there is an error. */ { char *success = fgets(buf, charCount, file); if (success == NULL && charCount > 0) buf[0] = '\0'; if (ferror(file)) errAbort("mustGetLine: fgets failed: %s", strerror(ferror(file))); } int mustOpenFd(char *fileName, int flags) /* Open a file descriptor (see man 2 open) or squawk and die. */ { if (sameString(fileName, "stdin")) return STDIN_FILENO; if (sameString(fileName, "stdout")) return STDOUT_FILENO; // mode is necessary when O_CREAT is given, ignored otherwise int mode = 00664; int fd = open(fileName, flags, mode); if (fd < 0) { char *modeName = ""; if ((flags & (O_WRONLY | O_CREAT | O_TRUNC)) == (O_WRONLY | O_CREAT | O_TRUNC)) modeName = " to create and truncate"; else if ((flags & (O_WRONLY | O_CREAT)) == (O_WRONLY | O_CREAT)) modeName = " to create"; else if ((flags & O_WRONLY) == O_WRONLY) modeName = " to write"; else if ((flags & O_RDWR) == O_RDWR) modeName = " to append"; else modeName = " to read"; errnoAbort("mustOpenFd: Can't open %s%s", fileName, modeName); } return fd; } void mustReadFd(int fd, void *buf, size_t size) /* Read size bytes from a file or squawk and die. */ { ssize_t actualSize; char *cbuf = buf; // using a loop because linux was not returning all data in a single request when request size exceeded 2GB. while (size > 0) { actualSize = read(fd, cbuf, size); if (actualSize < 0) errnoAbort("Error reading %lld bytes", (long long)size); if (actualSize == 0) errAbort("End of file reading %llu bytes (got %lld)", (unsigned long long)size, (long long)actualSize); cbuf += actualSize; size -= actualSize; } } void mustWriteFd(int fd, void *buf, size_t size) /* Write size bytes to file descriptor fd or die. (See man 2 write.) */ { ssize_t result = write(fd, buf, size); if (result < size) { if (result < 0) errnoAbort("mustWriteFd: write failed"); else errAbort("mustWriteFd only wrote %lld of %lld bytes. Likely the disk is full.", (long long)result, (long long)size); } } off_t mustLseek(int fd, off_t offset, int whence) /* Seek to given offset, relative to whence (see man lseek) in file descriptor fd or errAbort. * Return final offset (e.g. if this is just an (fd, 0, SEEK_CUR) query for current position). */ { off_t ret = lseek(fd, offset, whence); if (ret < 0) errnoAbort("lseek(%d, %lld, %s (%d)) failed", fd, (long long)offset, ((whence == SEEK_SET) ? "SEEK_SET" : (whence == SEEK_CUR) ? "SEEK_CUR" : (whence == SEEK_END) ? "SEEK_END" : "invalid 'whence' value"), whence); return ret; } void mustCloseFd(int *pFd) /* Close file descriptor *pFd if >= 0, abort if there's an error, set *pFd = -1. */ { if (pFd != NULL && *pFd >= 0) { if (close(*pFd) < 0) errnoAbort("close failed"); *pFd = -1; } } char *addSuffix(char *head, char *suffix) /* Return a needMem'd string containing "headsuffix". Should be free'd when finished. */ { char *ret = NULL; int size = strlen(head) + strlen(suffix) +1; ret = needMem(sizeof(char)*size); snprintf(ret, size, "%s%s", head, suffix); return ret; } void chopSuffix(char *s) /* Remove suffix (last . in string and beyond) if any. */ { char *e = strrchr(s, '.'); if (e != NULL) *e = 0; } char *chopPrefixAt(char *s, char c) /* Like chopPrefix, but can chop on any character, not just '.' */ { char *e = strchr(s, c); if (e == NULL) return s; *e++ = 0; return e; } boolean carefulCloseWarn(FILE **pFile) /* Close file if open and null out handle to it. * Return FALSE and print a warning message if there * is a problem.*/ { FILE *f; boolean ok = TRUE; if ((pFile != NULL) && ((f = *pFile) != NULL)) { if (f != stdin && f != stdout) { if (fclose(f) != 0) { errnoWarn("fclose failed"); ok = FALSE; } } *pFile = NULL; } return ok; } void carefulClose(FILE **pFile) /* Close file if open and null out handle to it. * Warn and abort if there's a problem. */ { if (!carefulCloseWarn(pFile)) noWarnAbort(); } char *firstWordInFile(char *fileName, char *wordBuf, int wordBufSize) /* Read the first word in file into wordBuf. */ { FILE *f = mustOpen(fileName, "r"); mustGetLine(f, wordBuf, wordBufSize); fclose(f); return trimSpaces(wordBuf); } void fileOffsetSizeFindGap(struct fileOffsetSize *list, struct fileOffsetSize **pBeforeGap, struct fileOffsetSize **pAfterGap) /* Starting at list, find all items that don't have a gap between them and the previous item. * Return at gap, or at end of list, returning pointers to the items before and after the gap. */ { struct fileOffsetSize *pt, *next; for (pt = list; ; pt = next) { next = pt->next; if (next == NULL || next->offset != pt->offset + pt->size) { *pBeforeGap = pt; *pAfterGap = next; return; } } } int rangeIntersection(int start1, int end1, int start2, int end2) /* Return amount of bases two ranges intersect over, 0 or negative if no * intersection. */ { int s = max(start1,start2); int e = min(end1,end2); return e-s; } int positiveRangeIntersection(int start1, int end1, int start2, int end2) /* Return number of bases in intersection of two ranges, or * zero if they don't intersect. */ { int ret = rangeIntersection(start1,end1,start2,end2); if (ret < 0) ret = 0; return ret; } bits64 byteSwap64(bits64 a) /* Return byte-swapped version of a */ { union {bits64 whole; UBYTE bytes[8];} u,v; u.whole = a; v.bytes[0] = u.bytes[7]; v.bytes[1] = u.bytes[6]; v.bytes[2] = u.bytes[5]; v.bytes[3] = u.bytes[4]; v.bytes[4] = u.bytes[3]; v.bytes[5] = u.bytes[2]; v.bytes[6] = u.bytes[1]; v.bytes[7] = u.bytes[0]; return v.whole; } bits64 fdReadBits64(int fd, boolean isSwapped) /* Read and optionally byte-swap 64 bit entity. */ { bits64 val; mustReadOneFd(fd, val); if (isSwapped) val = byteSwap64(val); return val; } bits32 byteSwap32(bits32 a) /* Return byte-swapped version of a */ { union {bits32 whole; UBYTE bytes[4];} u,v; u.whole = a; v.bytes[0] = u.bytes[3]; v.bytes[1] = u.bytes[2]; v.bytes[2] = u.bytes[1]; v.bytes[3] = u.bytes[0]; return v.whole; } bits32 readBits32(FILE *f, boolean isSwapped) /* Read and optionally byte-swap 32 bit entity. */ { bits32 val; mustReadOne(f, val); if (isSwapped) val = byteSwap32(val); return val; } bits32 fdReadBits32(int fd, boolean isSwapped) /* Read and optionally byte-swap 32 bit entity. */ { bits32 val; mustReadOneFd(fd, val); if (isSwapped) val = byteSwap32(val); return val; } bits32 memReadBits32(char **pPt, boolean isSwapped) /* Read and optionally byte-swap 32 bit entity from memory buffer pointed to by * *pPt, and advance *pPt past read area. */ { bits32 val; memcpy(&val, *pPt, sizeof(val)); if (isSwapped) val = byteSwap32(val); *pPt += sizeof(val); return val; } bits16 byteSwap16(bits16 a) /* Return byte-swapped version of a */ { union {bits16 whole; UBYTE bytes[2];} u,v; u.whole = a; v.bytes[0] = u.bytes[1]; v.bytes[1] = u.bytes[0]; return v.whole; } bits16 memReadBits16(char **pPt, boolean isSwapped) /* Read and optionally byte-swap 16 bit entity from memory buffer pointed to by * *pPt, and advance *pPt past read area. */ { bits16 val; memcpy(&val, *pPt, sizeof(val)); if (isSwapped) val = byteSwap16(val); *pPt += sizeof(val); return val; } double byteSwapDouble(double a) /* Return byte-swapped version of a */ { union {double whole; UBYTE bytes[8];} u,v; u.whole = a; v.bytes[0] = u.bytes[7]; v.bytes[1] = u.bytes[6]; v.bytes[2] = u.bytes[5]; v.bytes[3] = u.bytes[4]; v.bytes[4] = u.bytes[3]; v.bytes[5] = u.bytes[2]; v.bytes[6] = u.bytes[1]; v.bytes[7] = u.bytes[0]; return v.whole; } float byteSwapFloat(float a) /* Return byte-swapped version of a */ { union {float whole; UBYTE bytes[4];} u,v; u.whole = a; v.bytes[0] = u.bytes[3]; v.bytes[1] = u.bytes[2]; v.bytes[2] = u.bytes[1]; v.bytes[3] = u.bytes[0]; return v.whole; } float memReadFloat(char **pPt, boolean isSwapped) /* Read and optionally byte-swap single-precision floating point entity * from memory buffer pointed to by *pPt, and advance *pPt past read area. */ { float val; memcpy(&val, *pPt, sizeof(val)); if (isSwapped) val = byteSwapFloat(val); *pPt += sizeof(val); return val; } boolean fileExists(char *fileName) /* Return TRUE if file exists (may replace this with non- * portable faster way some day). */ { /* To make piping easier stdin and stdout always exist. */ if (sameString(fileName, "stdin")) return TRUE; if (sameString(fileName, "stdout")) return TRUE; return fileSize(fileName) != -1; } char *strstrNoCase(char *haystack, char *needle) /* A case-insensitive strstr function Will also robustly handle null strings param haystack - The string to be searched param needle - The string to look for in the haystack string return - The position of the first occurence of the desired substring or -1 if it is not found */ { char *haystackCopy = NULL; char *needleCopy = NULL; int index = 0; int haystackLen = 0; int needleLen = 0; char *p, *q; if (NULL == haystack || NULL == needle) { return NULL; } haystackLen = strlen(haystack); needleLen = strlen(needle); haystackCopy = (char*) needMem(haystackLen + 1); needleCopy = (char*) needMem(needleLen + 1); for(index = 0; index < haystackLen; index++) { haystackCopy[index] = tolower(haystack[index]); } haystackCopy[haystackLen] = 0; /* Null terminate */ for(index = 0; index < needleLen; index++) { needleCopy[index] = tolower(needle[index]); } needleCopy[needleLen] = 0; /* Null terminate */ p=strstr(haystackCopy, needleCopy); q=haystackCopy; freeMem(haystackCopy); freeMem(needleCopy); if(p==NULL) return NULL; return p-q+haystack; } int vasafef(char* buffer, int bufSize, char *format, va_list args) /* Format string to buffer, vsprintf style, only with buffer overflow * checking. The resulting string is always terminated with zero byte. */ { int sz = vsnprintf(buffer, bufSize, format, args); /* note that some version return -1 if too small */ if ((sz < 0) || (sz >= bufSize)) { buffer[bufSize-1] = (char) 0; errAbort("buffer overflow, size %d, format: %s, buffer: '%s'", bufSize, format, buffer); } return sz; } int safef(char* buffer, int bufSize, char *format, ...) /* Format string to buffer, vsprintf style, only with buffer overflow * checking. The resulting string is always terminated with zero byte. */ { int sz; va_list args; va_start(args, format); sz = vasafef(buffer, bufSize, format, args); va_end(args); return sz; } void safecpy(char *buf, size_t bufSize, const char *src) /* copy a string to a buffer, with bounds checking.*/ { size_t slen = strlen(src); if (slen > bufSize-1) errAbort("buffer overflow, size %lld, string size: %lld", (long long)bufSize, (long long)slen); strcpy(buf, src); } void safencpy(char *buf, size_t bufSize, const char *src, size_t n) /* copy n characters from a string to a buffer, with bounds checking. * Unlike strncpy, always null terminates the result */ { if (n > bufSize-1) errAbort("buffer overflow, size %lld, substring size: %lld", (long long)bufSize, (long long)n); // strlen(src) can take a long time when src is for example a pointer into a chromosome sequence. // Instead of setting slen to max(strlen(src), n), just stop counting length at n. size_t slen = 0; while (src[slen] != '\0' && slen < n) slen++; strncpy(buf, src, n); buf[slen] = '\0'; } void safecat(char *buf, size_t bufSize, const char *src) /* Append a string to a buffer, with bounds checking.*/ { size_t blen = strlen(buf); size_t slen = strlen(src); if (blen+slen > bufSize-1) errAbort("buffer overflow, size %lld, new string size: %lld", (long long)bufSize, (long long)(blen+slen)); strcat(buf, src); } static char *naStr = "n/a"; static char *emptyStr = ""; char *skipToNumeric(char *s) /* skip up to where numeric digits appear */ { while (*s != 0 && !isdigit(*s)) ++s; return s; } #ifndef WIN32 time_t mktimeFromUtc (struct tm *t) /* Return time_t for tm in UTC (GMT) * Useful for stuff like converting to time_t the * last-modified HTTP response header * which is always GMT. Returns -1 on failure of mktime */ { time_t time; char *tz; char save_tz[100]; tz=getenv("TZ"); if (tz) safecpy(save_tz, sizeof(save_tz), tz); setenv("TZ", "GMT0", 1); tzset(); t->tm_isdst = 0; time=mktime(t); if (tz) setenv("TZ", save_tz, 1); else unsetenv("TZ"); tzset(); return (time); } time_t dateToSeconds(const char *date,const char*format) // Convert a string date to time_t { struct tm storage={0,0,0,0,0,0,0,0,0}; if (strptime(date,format,&storage)==NULL) return 0; else return mktime(&storage); } static int daysOfMonth(struct tm *tp) /* Returns the days of the month given the year */ { int days=0; switch(tp->tm_mon) { case 3: case 5: case 8: case 10: days = 30; break; case 1: days = 28; if ( (tp->tm_year % 4) == 0 && ((tp->tm_year % 20) != 0 || (tp->tm_year % 100) == 0) ) days = 29; break; default: days = 31; break; } return days; } static void dateAdd(struct tm *tp,int addYears,int addMonths,int addDays) /* Add years,months,days to a date */ { tp->tm_mday += addDays; tp->tm_mon += addMonths; tp->tm_year += addYears; int dom=28; while ( (tp->tm_mon >11 || tp->tm_mon <0) || (tp->tm_mday>dom || tp->tm_mday<1) ) { if (tp->tm_mon>11) // First month: tm.tm_mon is 0-11 range { tp->tm_year += (tp->tm_mon / 12); tp->tm_mon = (tp->tm_mon % 12); } else if (tp->tm_mon<0) { tp->tm_year += (tp->tm_mon / 12) - 1; tp->tm_mon = (tp->tm_mon % 12) + 12; } else { dom = daysOfMonth(tp); if (tp->tm_mday>dom) { tp->tm_mday -= dom; tp->tm_mon += 1; dom = daysOfMonth(tp); } else if (tp->tm_mday < 1) { tp->tm_mon -= 1; dom = daysOfMonth(tp); tp->tm_mday += dom; } } } } #endif rtracklayer/src/ucsc/common.h0000644000175100017510000010505114614231172017305 0ustar00biocbuildbiocbuild/* Common.h - functions that are commonly used. Includes * routines for managing singly linked lists, some basic * string manipulation stuff, and other stuff of the * short but useful nature. * * This file is copyright 2002-2005 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef COMMON_H /* Wrapper to avoid including this twice. */ #define COMMON_H /* Some stuff to support large files in Linux. */ #ifndef _LARGEFILE_SOURCE #define _LARGEFILE_SOURCE 1 #endif #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #ifndef _FILE_OFFSET_BITS #define _FILE_OFFSET_BITS 64 #endif /* Some stuff for safer pthreads. */ #ifndef _REENTRANT #define _REENTRANT #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if defined(MACHTYPE_ppc) #include #endif #if defined(__APPLE__) #if defined(__i686__) /* The i686 apple math library defines warn. */ #define warn jkWarn #endif #endif #ifdef __CYGWIN32__ #include #endif #ifndef NAN #define NAN (0.0 / 0.0) #endif #ifndef WIFEXITED #define WIFEXITED(stat) (((*((int *) &(stat))) & 0xff) == 0) #endif #ifndef WEXITSTATUS #define WEXITSTATUS(stat) (short)(((*((int *) &(stat))) >> 8) & 0xffff) #endif #ifndef WIFSIGNALED #define WIFSIGNALED(stat) (((*((int *) &(stat)))) && ((*((int *) &(stat))) == ((*((int *) &(stat))) &0x00ff))) #endif #ifndef WTERMSIG #define WTERMSIG(stat) ((*((int *) &(stat))) & 0x7f) #endif #ifndef WIFSTOPPED #define WIFSTOPPED(stat) (((*((int *) &(stat))) & 0xff) == 0177) #endif #ifndef WSTOPSIG #define WSTOPSIG(stat) (((*((int *) &(stat))) >> 8) & 0xff) #endif #ifndef HUGE #define HUGE MAXFLOAT #endif /* Let's pretend C has a boolean type. */ #define TRUE 1 #define FALSE 0 #define boolean int #ifndef __cplusplus #ifndef bool #define bool char #endif #endif /* Some other type synonyms */ #define UBYTE unsigned char /* Wants to be unsigned 8 bits. */ #define BYTE signed char /* Wants to be signed 8 bits. */ #define UWORD unsigned short /* Wants to be unsigned 16 bits. */ #define WORD short /* Wants to be signed 16 bits. */ #define bits64 unsigned long long /* Wants to be unsigned 64 bits. */ #define bits32 unsigned /* Wants to be unsigned 32 bits. */ #define bits16 unsigned short /* Wants to be unsigned 16 bits. */ #define bits8 unsigned char /* Wants to be unsigned 8 bits. */ #define signed32 int /* Wants to be signed 32 bits. */ #define bits8 unsigned char /* Wants to be unsigned 8 bits. */ #define BIGNUM 0x3fffffff /* A really big number */ #define BIGDOUBLE 1.7E+308 /* Close to biggest double-precision number */ #define LIMIT_2or8GB (2147483647 * ((sizeof(size_t)/4)*(sizeof(size_t)/4))) /* == 2 Gb for 32 bit machines, 8 Gb for 64 bit machines */ #define LIMIT_2or6GB (2147483647 + (2147483647 * ((sizeof(size_t)/4)-1)) + \ (2147483647 * ((sizeof(size_t)/4)-1))) /* == 2 Gb for 32 bit machines, 6 Gb for 64 bit machines */ /* Default size of directory path, file name and extension string buffers */ #define PATH_LEN 512 #define FILENAME_LEN 128 #define FILEEXT_LEN 64 /* inline functions: To declare a function inline, place the entire function * in a header file and prefix it with the INLINE macro. If used with a * compiler that doesn't support inline, change the INLINE marco to be simply * `static'. */ #ifndef INLINE #define INLINE static inline #endif /* stdargs compatibility: in a unix universe a long time ago, types of va_list * were passed by value. It was assume one could do things like: * * va_start(args); * vfprintf(fh1, fmt, args); * vfprintf(fh2, fmt, args); * va_end(args); * * and life would good. However this is not true on some modern systems (for * instance gcc/glibc on x86_64), where va_args can be a pointer to some type * of object). The second call to vfprintf() would then crash, since the * first call modified the object that va_args was pointing to. C99 adds a * va_copy macro that to address this issue. Many non-C99 system include this * macro, sometimes called __va_copy. Here we ensure that va_copy is defined. * If if doesn't exist, we try to define it in terms of __va_copy. If that is * not available, we make the assumption that va_list can be copied by value * and create our own. Our implementation is the same as used on Solaris. */ #if defined(__va_copy) && !defined(va_copy) # define va_copy __va_copy #endif #if !defined(va_copy) # define va_copy(to, from) ((to) = (from)) #endif /* Cast a pointer to a long long. Use to printf format points as long-longs * in a 32/64bit portable manner. Format should use %llx for the result. * Needed because casting a pointer to a different sized number cause a * warning with gcc */ #define ptrToLL(p) ((long long)((size_t)p)) /* How big is this array? */ #define ArraySize(a) (sizeof(a)/sizeof((a)[0])) #define uglyf printf /* debugging printf */ #define uglyAbort errAbort /* debugging error abort. */ #define uglyOut stdout /* debugging fprintf target. */ void *needMem(size_t size); /* Need mem calls abort if the memory allocation fails. The memory * is initialized to zero. */ void *needLargeMem(size_t size); /* This calls abort if the memory allocation fails. The memory is * not initialized to zero. */ void *needLargeZeroedMem(size_t size); /* Request a large block of memory and zero it. */ void *needLargeMemResize(void* vp, size_t size); /* Adjust memory size on a block, possibly relocating it. If vp is NULL, * a new memory block is allocated. Memory not initted. */ void *needLargeZeroedMemResize(void* vp, size_t oldSize, size_t newSize); /* Adjust memory size on a block, possibly relocating it. If vp is NULL, a * new memory block is allocated. If block is grown, new memory is zeroed. */ void *needHugeMem(size_t size); /* No checking on size. Memory not initted to 0. */ void *needHugeMemResize(void* vp, size_t size); /* Adjust memory size on a block, possibly relocating it. If vp is NULL, * a new memory block is allocated. No checking on size. Memory not * initted. */ void *needMoreMem(void *old, size_t copySize, size_t newSize); /* Allocate a new buffer, copy old buffer to it, free old buffer. */ void *cloneMem(void *pt, size_t size); /* Allocate a new buffer of given size, and copy pt to it. */ #define CloneVar(pt) cloneMem(pt, sizeof((pt)[0])) /* Allocate copy of a structure. */ void freeMem(void *pt); /* Free memory will check for null before freeing. */ void freez(void *ppt); /* Pass address of pointer. Will free pointer and set it * to NULL. Typical use: * s = needMem(1024); * ... * freez(&s); */ #define AllocVar(pt) (pt = needMem(sizeof(*pt))) /* Shortcut to allocating a single variable on the heap and * assigning pointer to it. */ #define AllocArray(pt, size) (pt = needLargeZeroedMem(sizeof(*pt) * (size))) #define AllocA(type) needMem(sizeof(type)) /* Shortcut to allocating a variable on heap of a specific type. */ #define AllocN(type,count) ((type*)needLargeZeroedMem(sizeof(type) * (count))) /* Shortcut to allocating an array on the heap of a specific type. */ #define ExpandArray(array, oldCount, newCount) \ (array = needMoreMem((array), (oldCount)*sizeof((array)[0]), (newCount)*sizeof((array)[0]))) /* Expand size of dynamically allocated array. */ #define CopyArray(source, dest,count) memcpy(dest,source,(count)*sizeof(dest[0])) /* Copy count elements of array from source to dest. */ #define CloneArray(a, count) cloneMem(a, (count)*sizeof(a[0])) /* Make new dynamic array initialized with count elements of a */ void errAbort(char *format, ...) /* Abort function, with optional (printf formatted) error message. */ #if defined(__GNUC__) __attribute__((format(printf, 1, 2))) #endif ; void errnoAbort(char *format, ...) /* Prints error message from UNIX errno first, then does errAbort. */ #if defined(__GNUC__) __attribute__((format(printf, 1, 2))) #endif ; #define internalErr() errAbort("Internal error %s %d", __FILE__, __LINE__) /* Generic internal error message */ void warn(char *format, ...) /* Issue a warning message. */ #if defined(__GNUC__) __attribute__((format(printf, 1, 2))) #endif ; void verbose(int verbosity, char *format, ...) /* Write printf formatted message to log (which by * default is stdout) if global verbose variable * is set to verbosity or higher. Default level is 1. */ #if defined(__GNUC__) __attribute__((format(printf, 2, 3))) #endif ; void verboseTimeInit(void); /* Initialize or reinitialize the previous time for use by verboseTime. */ void verboseTime(int verbosity, char *label, ...) /* Print label and how long it's been since last call. Start time can be * initialized with verboseTimeInit, otherwise the elapsed time will be * zero. */ #if defined(__GNUC__) __attribute__((format(printf, 2, 3))) #endif ; int verboseLevel(); /* Get verbosity level. */ INLINE void zeroBytes(void *vpt, int count) /* fill a specified area of memory with zeroes */ { memset(vpt, '\0', count); } #define ZeroVar(v) zeroBytes(v, sizeof(*v)) void reverseBytes(char *bytes, long length); /* Reverse the order of the bytes. */ /******* Some things to manage simple lists - structures that begin ****** ******* with a pointer to the next element in the list. ******/ struct slList { struct slList *next; }; int slCount(const void *list); /* Return # of elements in list. */ void *slElementFromIx(void *list, int ix); /* Return the ix'th element in list. Returns NULL * if no such element. */ int slIxFromElement(void *list, void *el); /* Return index of el in list. Returns -1 if not on list. */ INLINE void slAddHead(void *listPt, void *node) /* Add new node to start of list. * Usage: * slAddHead(&list, node); * where list and nodes are both pointers to structure * that begin with a next pointer. */ { struct slList **ppt = (struct slList **)listPt; struct slList *n = (struct slList *)node; n->next = *ppt; *ppt = n; } INLINE void slSafeAddHead(void *listPt, void *node) /* Add new node to start of list. Now that slAddHead is an inline instead of * a macro, this function is obsolete. */ { slAddHead(listPt, node); } void slAddTail(void *listPt, void *node); /* Add new node to tail of list. * Usage: * slAddTail(&list, node); * where list and nodes are both pointers to structure * that begin with a next pointer. This is sometimes * convenient but relatively slow. For longer lists * it's better to slAddHead, and slReverse when done. */ void *slPopHead(void *listPt); /* Return head of list and remove it from list. (Fast) */ void *slCat(void *a, void *b); /* Return concatenation of lists a and b. * Example Usage: * struct slName *a = getNames("a"); * struct slName *b = getNames("b"); * struct slName *ab = slCat(a,b) * After this it is no longer safe to use a or b. */ void *slLastEl(void *list); /* Returns last element in list or NULL if none. */ void slReverse(void *listPt); /* Reverse order of a list. * Usage: * slReverse(&list); */ typedef int CmpFunction(const void *elem1, const void *elem2); void slSort(void *pList, CmpFunction *compare); /* Sort a singly linked list with Qsort and a temporary array. * The arguments to the compare function in real, non-void, life * are pointers to pointers. */ void slUniqify(void *pList, CmpFunction *compare, void (*free)()); /* Return sorted list with duplicates removed. * Compare should be same type of function as slSort's compare (taking * pointers to pointers to elements. Free should take a simple * pointer to dispose of duplicate element, and can be NULL. */ boolean slRemoveEl(void *vpList, void *vToRemove); /* Remove element from singly linked list. Usage: * slRemove(&list, el); * Returns TRUE if element in list. */ void slFreeList(void *listPt); /* Free all elements in list and set list pointer to null. * Usage: * slFreeList(&list); */ /******* slInt - an int on a list - the first of many singly linked list structures *******/ struct slInt /* List of integers. */ { struct slInt *next; /* Next in list. */ int val; /* Integer value. */ }; struct slInt *slIntNew(int x); #define newSlInt slIntNew /* Return a new double. */ struct slUnsigned /* List of unsigned */ { struct slUnsigned *next; /* Next in list */ unsigned val; /* Unsigned value */ }; /******* slDouble - a double on a list *******/ struct slDouble /* List of double-precision numbers. */ { struct slDouble *next; /* Next in list. */ double val; /* Double-precision value. */ }; /******* slName - a zero terminated string on a list *******/ struct slName /* List of names. The name array is allocated to accommodate full name */ { struct slName *next; /* Next in list. */ char name[1]; /* Allocated at run time to length of string. */ }; struct slName *newSlName(char *name); #define slNameNew newSlName /* Return a new slName. */ #define slNameFree freez /* Free a single slName */ #define slNameFreeList slFreeList /* Free a list of slNames */ struct slName *slNameNewN(char *name, int size); /* Return new slName of given size. */ int slNameCmpCase(const void *va, const void *vb); /* Compare two slNames, ignore case. */ int slNameCmp(const void *va, const void *vb); /* Compare two slNames. */ void slNameSort(struct slName **pList); /* Sort slName list. */ char *slNameStore(struct slName **pList, char *string); /* Put string into list if it's not there already. * Return the version of string stored in list. */ struct slName *slNameAddHead(struct slName **pList, char *name); /* Add name to start of list and return it. */ struct slName *slNameListFromString(char *s, char delimiter); /* Return list of slNames gotten from parsing delimited string. * The final delimiter is optional. a,b,c and a,b,c, are equivalent * for comma-delimited lists. */ #define slNameListFromComma(s) slNameListFromString(s, ',') /* Parse out comma-separated list. */ /******* slRef - a void pointer on a list *******/ struct slRef /* Singly linked list of generic references. */ { struct slRef *next; /* Next in list. */ void *val; /* A reference to something. */ }; struct slRef *slRefNew(void *val); /* Create new slRef element. */ struct slRef *refOnList(struct slRef *refList, void *val); /* Return ref if val is already on list, otherwise NULL. */ void refAdd(struct slRef **pRefList, void *val); /* Add reference to list. */ void slRefFreeListAndVals(struct slRef **pList); /* Free up (with simple freeMem()) each val on list, and the list itself as well. */ /******* slPair - a name/value pair on list where value not always a string *******/ struct slPair /* A name/value pair. */ { struct slPair *next; /* Next in list. */ char *name; /* Name of item. */ void *val; /* Pointer to item data. */ }; struct slPair *slPairNew(char *name, void *val); /* Allocate new name/value pair. */ void slPairAdd(struct slPair **pList, char *name, void *val); /* Add new slPair to head of list. */ void slPairFree(struct slPair **pEl); /* Free up struct and name. (Don't free up values.) */ void slPairFreeList(struct slPair **pList); /* Free up list. (Don't free up values.) */ void slPairFreeVals(struct slPair *list); /* Free up all values on list. */ struct slPair *slPairFind(struct slPair *list, char *name); /* Return list element of given name, or NULL if not found. */ struct slPair *slPairListFromString(char *str,boolean respectQuotes); // Return slPair list parsed from list in string like: [name1=val1 name2=val2 ...] // if respectQuotes then string can have double quotes: [name1="val 1" "name 2"=val2 ...] // resulting pair strips quotes: {name1}={val 1},{name 2}={val2} // Returns NULL if parse error. Free this up with slPairFreeValsAndList. #define slPairFromString(s) slPairListFromString(s,FALSE) int slPairValCmpCase(const void *va, const void *vb); /* Case insensitive compare two slPairs on their values (must be string). */ int slPairValCmp(const void *va, const void *vb); /* Compare two slPairs on their values (must be string). */ int slPairIntCmp(const void *va, const void *vb); // Compare two slPairs on their integer values. int slPairAtoiCmp(const void *va, const void *vb); // Compare two slPairs on their strings interpreted as integer values. /******* Some old stuff maybe we could trim. *******/ /******* Some math stuff *******/ void doubleSort(int count, double *array); /* Sort an array of doubles. */ double doubleMedian(int count, double *array); /* Return median value in array. This will sort * the array as a side effect. */ void doubleBoxWhiskerCalc(int count, double *array, double *retMin, double *retQ1, double *retMedian, double *retQ3, double *retMax); /* Calculate what you need to draw a box and whiskers plot from an array of doubles. */ void intSort(int count, int *array); /* Sort an array of ints. */ /******* Some stuff for processing strings. *******/ char *cloneStringZ(const char *s, int size); /* Make a zero terminated copy of string in memory */ char *cloneString(const char *s); /* Make copy of string in dynamic memory */ int differentWord(char *s1, char *s2); /* strcmp ignoring case - returns zero if strings are * the same (ignoring case) otherwise returns difference * between first non-matching characters. */ #define sameWord(a,b) (!differentWord(a,b)) /* Return TRUE if two strings are same ignoring case */ #define differentString(a,b) (strcmp(a,b)) /* Returns FALSE if two strings same. */ int differentStringNullOk(char *a, char *b); /* Returns 0 if two strings (either of which may be NULL) * are the same. Otherwise it returns a positive or negative * number depending on the alphabetical order of the two * strings. * This is basically a strcmp that can handle NULLs in * the input. If used in a sort the NULLs will end * up before any of the cases with data. */ #define sameOk(a,b) (differentStringNullOk(a,b) == 0) /* returns TRUE if two strings same, NULLs OK */ #define sameString(a,b) (strcmp(a,b)==0) /* Returns TRUE if two strings same. */ #define sameStringN(a,b,c) (strncmp(a,b,c)==0) /* Returns TRUE if two strings start with the same c characters. */ #define isEmpty(string) ((string) == NULL || (string)[0] == 0) #define isNotEmpty(string) (! isEmpty(string)) int cmpStringsWithEmbeddedNumbers(const char *a, const char *b); /* Compare strings such as gene names that may have embedded numbers, * so that bmp4a comes before bmp14a */ boolean startsWith(const char *start, const char *string); /* Returns TRUE if string begins with start. */ boolean startsWithWord(char *firstWord, char *line); /* Return TRUE if first white-space-delimited word in line * is same as firstWord. Comparison is case sensitive. */ #define stringIn(needle, haystack) strstr(haystack, needle) /* Returns position of needle in haystack or NULL if it's not there. */ /* char *stringIn(char *needle, char *haystack); */ boolean endsWith(char *string, char *end); /* Returns TRUE if string ends with end. */ char lastChar(char *s); /* Return last character in string. */ char *matchingCharBeforeInLimits(char *limit, char *s, char c); /* Look for character c sometime before s, but going no further than limit. * Return NULL if not found. */ boolean wildMatch(const char *wildCard, const char *string); /* does a case insensitive wild card match with a string. * * matches any string or no character. * ? matches any single character. * anything else etc must match the character exactly. */ void toUpperN(char *s, int n); /* Convert a section of memory to upper case. */ void toLowerN(char *s, int n); /* Convert a section of memory to lower case. */ char *strUpper(char *s); #define touppers(s) (void)strUpper(s) /* Convert entire string to upper case. */ char *strLower(char *s); #define tolowers(s) (void)strLower(s) /* Convert entire string to lower case */ char *replaceChars(char *string, char *oldStr, char *newStr); /* Replaces the old with the new. The old and new string need not be of equal size Can take any length string. Return value needs to be freeMem'd. */ char * memSwapChar(char *s, int len, char oldChar, char newChar); /* Substitute newChar for oldChar throughout memory of given length. old or new may be null */ #define strSwapChar(s,old,new) memSwapChar((s),strlen(s),(old),(new)) #define subChar(s,old,new) (void)memSwapChar((s),strlen(s),(old),(new)) /* Substitute newChar for oldChar throughout string s. */ void stripChar(char *s, char c); /* Remove all occurences of c from s. */ int countChars(char *s, char c); /* Return number of characters c in string s. */ int countLeadingDigits(const char *s); /* Return number of leading digits in s */ int countLeadingNondigits(const char *s); /* Count number of leading non-digit characters in s. */ int countSeparatedItems(char *string, char separator); /* Count number of items in string you would parse out with given * separator, assuming final separator is optional. */ int chopString(char *in, char *sep, char *outArray[], int outSize); /* int chopString(in, sep, outArray, outSize); */ /* This chops up the input string (cannabilizing it) * into an array of zero terminated strings in * outArray. It returns the number of strings. * If you pass in NULL for outArray, it will just * return the number of strings that it *would* * chop. */ extern char crLfChopper[]; extern char whiteSpaceChopper[]; /* Some handy predefined separators. */ int chopByWhite(char *in, char *outArray[], int outSize); /* Like chopString, but specialized for white space separators. */ #define chopLine(line, words) chopByWhite(line, words, ArraySize(words)) /* Chop line by white space. */ int chopByChar(char *in, char chopper, char *outArray[], int outSize); /* Chop based on a single character. */ #define chopTabs(string, words) chopByChar(string, '\t', words, ArraySize(words)) /* Chop string by tabs. */ #define chopCommas(string, words) chopByChar(string, ',', words, ArraySize(words)) /* Chop string by commas. */ char *skipBeyondDelimit(char *s,char delimit); /* Returns NULL or pointer to first char beyond one (or more contiguous) delimit char. If delimit is ' ' then skips beyond first patch of whitespace. */ char *skipLeadingSpaces(char *s); /* Return first white space or NULL if none.. */ char *skipToSpaces(char *s); /* Return first white space. */ void eraseTrailingSpaces(char *s); /* Replace trailing white space with zeroes. */ void eraseWhiteSpace(char *s); /* Remove white space from a string */ char *trimSpaces(char *s); /* Remove leading and trailing white space. */ void repeatCharOut(FILE *f, char c, int count); /* Write character to file repeatedly. */ void spaceOut(FILE *f, int count); /* Put out some spaces to file. */ boolean hasWhiteSpace(char *s); /* Return TRUE if there is white space in string. */ char *nextWord(char **pLine); /* Return next word in *pLine and advance *pLine to next * word. Returns NULL when no more words. */ char *nextWordRespectingQuotes(char **pLine); // return next word but respects single or double quotes surrounding sets of words. char *cloneFirstWordByDelimiter(char *line,char delimit); /* Returns a cloned first word, not harming the memory passed in Delimiter of ' ' will delimit by isspace() */ #define cloneFirstWordInLine(line) cloneFirstWordByDelimiter((line),' ') #define cloneFirstWordByTab(line) cloneFirstWordByDelimiter((line),'\t') /* Returns a cloned first word, not harming the memory passed in */ char *nextStringInList(char **pStrings); /* returns pointer to the first string and advances pointer to next in list of strings dilimited by 1 null and terminated by 2 nulls. */ /* Some stuff that is left out of GNU .h files!? */ #ifndef SEEK_SET #define SEEK_SET 0 #endif #ifndef SEEK_CUR #define SEEK_CUR 1 #endif #ifndef SEEK_END #define SEEK_END 2 #endif #ifndef FILEPATH_H void splitPath(char *path, char dir[PATH_LEN], char name[FILENAME_LEN], char extension[FILEEXT_LEN]); /* Split a full path into components. The dir component will include the * trailing / if any. The extension component will include the starting * . if any. Pass in NULL for dir, name, or extension if you don't care about * that part. */ #endif /* FILEPATH_H */ char *addSuffix(char *head, char *suffix); /* Return a needMem'd string containing "headsuffix". Should be free'd when finished. */ void chopSuffix(char *s); /* Remove suffix (last . in string and beyond) if any. */ char *chopPrefixAt(char *s, char c); /* Like chopPrefix, but can chop on any character, not just '.' */ FILE *mustOpen(char *fileName, char *mode); /* Open a file - or squawk and die. */ void mustWrite(FILE *file, void *buf, size_t size); /* Write to file or squawk and die. */ #define writeOne(file, var) mustWrite((file), &(var), sizeof(var)) /* Write out one variable to file. */ void mustRead(FILE *file, void *buf, size_t size); /* Read size bytes from a file or squawk and die. */ #define mustReadOne(file, var) mustRead((file), &(var), sizeof(var)) /* Read one variable from file or die. */ void mustGetLine(FILE *file, char *buf, int charCount); /* Read at most charCount-1 bytes from file, but stop after newline if one is * encountered. The string in buf is '\0'-terminated. (See man 3 fgets.) * Die if there is an error. */ int mustOpenFd(char *fileName, int flags); /* Open a file descriptor (see man 2 open) or squawk and die. */ void mustReadFd(int fd, void *buf, size_t size); /* Read size bytes from a file descriptor or squawk and die. */ void mustWriteFd(int fd, void *buf, size_t size); /* Write size bytes to file descriptor fd or die. (See man 2 write.) */ off_t mustLseek(int fd, off_t offset, int whence); /* Seek to given offset, relative to whence (see man lseek) in file descriptor fd or errAbort. * Return final offset (e.g. if this is just an (fd, 0, SEEK_CUR) query for current position). */ void mustCloseFd(int *pFd); /* Close file descriptor *pFd if >= 0, abort if there's an error, set *pFd = -1. */ #define writeOneFd(fd, var) mustWriteFd((fd), &(var), sizeof(var)) /* Write out one variable to file descriptor fd. */ #define readOne(file, var) (fread(&(var), sizeof(var), 1, (file)) == 1) /* Read one variable from file. Returns FALSE if can't do it. */ #define readOneFd(fd, var) (read((fd), &(var), sizeof(var)) == sizeof(var)) /* Read one variable from file. Returns FALSE if can't do it. */ #define mustReadOneFd(fd, var) mustReadFd((fd), &(var), sizeof(var)) /* Read one variable from file or die. */ #define memReadOne(pPt, var) memRead((pPt), &(var), sizeof(var)) /* Read one variable from memory. */ void writeString(FILE *f, char *s); /* Write a 255 or less character string to a file. * This will write the length of the string in the first * byte then the string itself. */ char *readString(FILE *f); /* Read a string (written with writeString) into * memory. freeMem the result when done. Returns * NULL at EOF. */ boolean fastReadString(FILE *f, char buf[256]); /* Read a string into buffer, which must be long enough * to hold it. String is in 'writeString' format. * Returns FALSE at EOF. */ void carefulClose(FILE **pFile); /* Close file if open and null out handle to it. */ boolean carefulCloseWarn(FILE **pFile); /* Close file if open and null out handle to it. * Return FALSE and print a warning message if there * is a problem.*/ char *firstWordInFile(char *fileName, char *wordBuf, int wordBufSize); /* Read the first word in file into wordBuf. */ struct fileOffsetSize /* A piece of a file. */ { struct fileOffsetSize *next; /* Next in list. */ bits64 offset; /* Start offset of block. */ bits64 size; /* Size of block. */ }; void fileOffsetSizeFindGap(struct fileOffsetSize *list, struct fileOffsetSize **pBeforeGap, struct fileOffsetSize **pAfterGap); /* Starting at list, find all items that don't have a gap between them and the previous item. * Return at gap, or at end of list, returning pointers to the items before and after the gap. */ #define logBase2(x)(log(x)/log(2)) /* return log base two of number */ #define round(a) ((int)((a)+0.5)) /* Round floating point val to nearest integer. */ #define roundll(a) ((long long)((a)+0.5)) /* Round floating point val to nearest long long. */ #ifndef min #define min(a,b) ( (a) < (b) ? (a) : (b) ) /* Return min of a and b. */ #endif #ifndef max #define max(a,b) ( (a) > (b) ? (a) : (b) ) /* Return max of a and b. */ #endif int rangeIntersection(int start1, int end1, int start2, int end2); /* Return amount of bases two ranges intersect over, 0 or negative if no * intersection. */ int positiveRangeIntersection(int start1, int end1, int start2, int end2); /* Return amount of bases two ranges intersect over, 0 if no * intersection. */ INLINE void memRead(char **pPt, void *buf, int size) /* Copy memory from *pPt to buf, and advance *pPt by size. */ { memcpy(buf, *pPt, size); *pPt += size; } INLINE void memWrite(char **pPt, void *buf, int size) /* Copy memory from buf to *pPt and advance *pPt by size. */ { memcpy(*pPt, buf, size); *pPt += size; } #define memWriteOne(pPt, var) memWrite((pPt), &(var), sizeof(var)) /* Write out one variable to memory stream. */ INLINE void memWriteFloat(char **pPt, float val) /* Write out floating point val to file. Mostly to convert from double... */ { memWriteOne(pPt, val); } bits64 byteSwap64(bits64 a); /* Swap from intel to sparc order of a 64 bit quantity. */ bits64 fdReadBits64(int fd, boolean isSwapped); /* Read and optionally byte-swap 64 bit entity. */ bits32 byteSwap32(bits32 a); /* Swap from intel to sparc order of a 32 bit quantity. */ bits32 readBits32(FILE *f, boolean isSwapped); /* Read and optionally byte-swap 32 bit entity. */ bits32 fdReadBits32(int fd, boolean isSwapped); /* Read and optionally byte-swap 32 bit entity. */ bits32 memReadBits32(char **pPt, boolean isSwapped); /* Read and optionally byte-swap 32 bit entity from memory buffer pointed to by * *pPt, and advance *pPt past read area. */ bits16 byteSwap16(bits16 a); /* Swap from intel to sparc order of a 16 bit quantity. */ bits16 memReadBits16(char **pPt, boolean isSwapped); /* Read and optionally byte-swap 32 bit entity from memory buffer pointed to by * *pPt, and advance *pPt past read area. */ double byteSwapDouble(double a); /* Return byte-swapped version of a */ float byteSwapFloat(float a); /* Return byte-swapped version of a */ float memReadFloat(char **pPt, boolean isSwapped); /* Read and optionally byte-swap single-precision floating point entity * from memory buffer pointed to by *pPt, and advance *pPt past read area. */ int intExp(char *text); /* Convert text to integer expression and evaluate. * Throws if it finds a non-number. */ double doubleExp(char *text); /* Convert text to floating point expression and * evaluate. */ off_t fileSize(char *fileName); /* The size of a file. */ boolean fileExists(char *fileName); /* Does a file exist? */ char *strstrNoCase(char *haystack, char *needle); /* A case-insensitive strstr */ int vasafef(char* buffer, int bufSize, char *format, va_list args); /* Format string to buffer, vsprintf style, only with buffer overflow * checking. The resulting string is always terminated with zero byte. */ int safef(char* buffer, int bufSize, char *format, ...) /* Format string to buffer, vsprintf style, only with buffer overflow * checking. The resulting string is always terminated with zero byte. */ #ifdef __GNUC__ __attribute__((format(printf, 3, 4))) #endif ; void safecpy(char *buf, size_t bufSize, const char *src); /* copy a string to a buffer, with bounds checking.*/ void safencpy(char *buf, size_t bufSize, const char *src, size_t n); /* copy n characters from a string to a buffer, with bounds checking. * Unlike strncpy, always null terminates the result */ void safecat(char *buf, size_t bufSize, const char *src); /* Append a string to a buffer, with bounds checking.*/ /* In case the development environment does not supply INFINITY */ #if !defined(INFINITY) #define INFINITY (1.0/0.0) #endif char *skipToNumeric(char *s); /* skip up to where numeric digits appear */ void childExecFailedExit(char *msg); /* Child exec failed, so quit without atexit cleanup */ void vaDumpStack(char *format, va_list args); /* debugging function to run the pstack program on the current process. In * prints a message, following by a new line, and then the stack track. Just * prints errors to stderr rather than aborts. For debugging purposes * only. */ void dumpStack(char *format, ...) /* debugging function to run the pstack program on the current process. In * prints a message, following by a new line, and then the stack track. Just * prints errors to stderr rather than aborts. For debugging purposes * only. */ #if defined(__GNUC__) __attribute__((format(printf, 1, 2))) #endif ; // SETTING_ON set of macros are frequently used comparisons of string values for boolean questions. // Notice the subtle difference between NOT_ON and IS_OFF. // NOT_ON could be NULL but IS_OFF must be explicitly set #define SETTING_IS_ON(setting) ( setting && (sameWord(setting,"on") || sameWord(setting,"true") \ || sameWord(setting,"yes") || sameWord(setting,"enabled") \ || atoi(setting) != 0) ) #define SETTING_NOT_ON(setting) (!SETTING_IS_ON(setting)) #define SETTING_IS_OFF(setting) ( setting && (sameWord(setting,"off") \ || sameWord(setting,"false") || sameWord(setting,"no") \ || sameWord(setting,"disabled") || sameWord(setting,"0")) ) // Standard bit mask macros #define BITS_ADD( flags,bits) ((flags) = ((flags) | (bits))) #define BITS_REMOVE( flags,bits) ((flags) = ((flags) & ~(bits))) #define BITS_ARE_ON( flags,bits) (((flags) & (bits)) == (bits)) #define BITS_ARE_OFF(flags,bits) (((flags) & (bits)) == 0) // It is sometimes useful to distinguish between 3 "boolean" states: TRUE, FALSE and UNKNOWN enum enumBool { beUnknown=0, // Not yet set ebYes=1, // already set to TRUE ebNo=-1 // already set to FALSE }; #define SET_TO_YES(ebool) { (ebool) = ebYes; } #define SET_TO_NO(ebool) { (ebool) = ebNo; } #define IS_YES(ebool) ((ebool) == ebYes) #define IS_NO(ebool) ((ebool) == ebNo) #define IS_KNOWN(ebool) (IS_YES(ebool) || IS_NO(ebool)) #define IS_TRUE IS_YES #define IS_FALSE IS_NO time_t mktimeFromUtc (struct tm *t); /* Return time_t for tm in UTC (GMT) * Useful for stuff like converting to time_t the * last-modified HTTP response header * which is always GMT. Returns -1 on failure of mktime */ time_t dateToSeconds(const char *date,const char*format); // Convert a string date to time_t #endif /* COMMON_H */ rtracklayer/src/ucsc/dlist.c0000644000175100017510000000622514614231172017132 0ustar00biocbuildbiocbuild/* dlist.c - Doubly-linked list routines. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "dlist.h" void dlListInit(struct dlList *dl) /* Initialize list to be empty */ { dl->head = (struct dlNode *)(&dl->nullMiddle); dl->nullMiddle = NULL; dl->tail = (struct dlNode *)(&dl->head); } struct dlList *newDlList() /* Return a new doubly linked list. */ { struct dlList *dl; AllocVar(dl); dl->head = (struct dlNode *)(&dl->nullMiddle); dl->tail = (struct dlNode *)(&dl->head); return dl; } void dlListReset(struct dlList *dl) /* Reset a list to the empty state (does not free values) */ { struct dlNode *node, *next; for (node = dl->head; node->next != NULL; node = next) { next = node->next; freeMem(node); } dl->head = (struct dlNode *)(&dl->nullMiddle); dl->nullMiddle = NULL; dl->tail = (struct dlNode *)(&dl->head); } void freeDlList(struct dlList **pList) /* Free up a doubly linked list and it's nodes (but not the node values). */ { struct dlList *list = *pList; if (list != NULL) { dlListReset(list); freez(pList); } } void dlInsertBetween(struct dlNode *before, struct dlNode *after, struct dlNode *newNode) { before->next = newNode; newNode->prev = before; newNode->next = after; after->prev = newNode; } void dlAddBefore(struct dlNode *anchor, struct dlNode *newNode) /* Add a node to list before anchor member. */ { dlInsertBetween(anchor->prev, anchor, newNode); } void dlAddAfter(struct dlNode *anchor, struct dlNode *newNode) /* Add a node to list after anchor member. */ { dlInsertBetween(anchor, anchor->next, newNode); } void dlAddHead(struct dlList *list, struct dlNode *newNode) /* Add a node to head of list. */ { struct dlNode *head = list->head; dlInsertBetween(head->prev, head, newNode); } void dlAddTail(struct dlList *list, struct dlNode *newNode) /* Add a node to tail of list. */ { struct dlNode *tail = list->tail; dlInsertBetween(tail, tail->next, newNode); } void dlRemove(struct dlNode *node) /* Removes a node from list. Node is not freed. */ { struct dlNode *before = node->prev; struct dlNode *after = node->next; before->next = after; after->prev = before; node->prev = NULL; node->next = NULL; } struct dlNode *dlPopHead(struct dlList *list) /* Remove first node from list and return it. */ { struct dlNode *node = list->head; if (node->next == NULL) return NULL; dlRemove(node); return node; } int dlCount(struct dlList *list) /* Return length of list. */ { return slCount(list->head) - 1; } struct dlSorter /* Helper structure for sorting dlNodes preserving order */ { struct dlNode *node; }; static int (*compareFunc)(const void *elem1, const void *elem2); /* Node comparison pointer, just used by dlSortNodes and helpers. */ static int dlNodeCmp(const void *elem1, const void *elem2) /* Compare two dlSorters indirectly, by calling compareFunc. */ { struct dlSorter *a = (struct dlSorter *)elem1; struct dlSorter *b = (struct dlSorter *)elem2; return compareFunc(&a->node->val, &b->node->val); } boolean dlEmpty(struct dlList *list) /* Return TRUE if list is empty. */ { return dlIsEmpty(list); } rtracklayer/src/ucsc/dlist.h0000644000175100017510000000425714614231172017142 0ustar00biocbuildbiocbuild/* dlist.h - Headers for generic doubly-linked list routines. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef DLIST_H #define DLIST_H #ifndef COMMON_H #include "common.h" #endif struct dlNode /* An element on a doubly linked list. */ { struct dlNode *next; struct dlNode *prev; void *val; }; struct dlList /* A doubly linked list. */ { struct dlNode *head; struct dlNode *nullMiddle; struct dlNode *tail; }; #define dlEnd(node) (node->next == NULL) /* True if node past end. */ #define dlStart(node) (node->prev == NULL) /* True if node before start. */ /* Iterate on a doubly linked list as so: for (el = list->head; !dlEnd(el); el = el->next) val = el->val; or for (el = list->tail; !dlStart(el); el = el->prev) val = el->val; */ struct dlList *newDlList(); /* Return a new doubly linked list. */ #define dlListNew newDlList /* Add object-first synonym. */ void dlListInit(struct dlList *dl); /* Initialize list to be empty */ void dlListReset(struct dlList *dl); /* Reset a list to the empty state (does not free values) */ void freeDlList(struct dlList **pList); /* Free up a doubly linked list and it's nodes (but not the node values). */ #define dlListFree freeDlList void dlAddBefore(struct dlNode *anchor, struct dlNode *newNode); /* Add a node to list before anchor member. */ void dlAddAfter(struct dlNode *anchor, struct dlNode *newNode); /* Add a node to list after anchor member. */ void dlAddHead(struct dlList *list, struct dlNode *newNode); /* Add a node to head of list. */ void dlAddTail(struct dlList *list, struct dlNode *newNode); /* Add a node to tail of list. */ void dlRemove(struct dlNode *node); /* Removes a node from list. Node is not freed. */ struct dlNode *dlPopHead(struct dlList *list); /* Remove first node from list and return it. */ int dlCount(struct dlList *list); /* Return length of list. */ boolean dlEmpty(struct dlList *list); /* Return TRUE if list is empty. */ #define dlIsEmpty(list) ((list)->head->next == NULL) /* Return TRUE if list is empty. Macro version of above. */ #endif /* DLIST_H */ rtracklayer/src/ucsc/dnaseq.c0000644000175100017510000000307214614231172017263 0ustar00biocbuildbiocbuild/* dnaSeq.c - stuff to manage DNA sequences. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "dnaseq.h" #include "bits.h" #include "hash.h" #include "obscure.h" struct dnaSeq *newDnaSeq(DNA *dna, int size, char *name) /* Create a new DNA seq. */ { struct dnaSeq *seq; seq = needMem(sizeof(*seq)); if (name != NULL) seq->name = cloneString(name); seq->dna = dna; seq->size = size; seq->mask = NULL; return seq; } void freeDnaSeq(struct dnaSeq **pSeq) /* Free up DNA seq. (And unlink underlying resource node.) */ { struct dnaSeq *seq = *pSeq; if (seq == NULL) return; freeMem(seq->name); freeMem(seq->dna); bitFree(&seq->mask); freez(pSeq); } aaSeq *translateSeqN(struct dnaSeq *inSeq, unsigned offset, unsigned inSize, boolean stop) /* Return a translated sequence. Offset is position of first base to * translate. If size is 0 then use length of inSeq. */ { aaSeq *seq; DNA *dna = inSeq->dna; AA *pep, aa; int i, lastCodon; int actualSize = 0; assert(offset <= inSeq->size); if ((inSize == 0) || (inSize > (inSeq->size - offset))) inSize = inSeq->size - offset; lastCodon = offset + inSize - 3; AllocVar(seq); seq->dna = pep = needLargeMem(inSize/3+1); for (i=offset; i <= lastCodon; i += 3) { aa = lookupCodon(dna+i); if (aa == 0) { if (stop) break; else aa = 'Z'; } *pep++ = aa; ++actualSize; } *pep = 0; assert(actualSize <= inSize/3+1); seq->size = actualSize; seq->name = cloneString(inSeq->name); return seq; } rtracklayer/src/ucsc/dnaseq.h0000644000175100017510000000225014614231172017265 0ustar00biocbuildbiocbuild/* dnaSeq - stuff to manage DNA sequences. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef DNASEQ_H #define DNASEQ_H #ifndef DNAUTIL_H #include "dnautil.h" #endif #ifndef BITS_H #include "bits.h" #endif struct dnaSeq /* A dna sequence in one-character per base format. */ { struct dnaSeq *next; /* Next in list. */ char *name; /* Name of sequence. */ DNA *dna; /* Sequence base by base. */ int size; /* Size of sequence. */ Bits* mask; /* Repeat mask (optional) */ }; typedef struct dnaSeq bioSeq; /* Preferred use if either DNA or protein. */ typedef struct dnaSeq aaSeq; /* Preferred use if protein. */ struct dnaSeq *newDnaSeq(DNA *dna, int size, char *name); /* Create a new DNA seq. */ void freeDnaSeq(struct dnaSeq **pSeq); /* Free up DNA seq. */ #define dnaSeqFree freeDnaSeq aaSeq *translateSeqN(struct dnaSeq *inSeq, unsigned offset, unsigned size, boolean stop); /* Return a translated sequence. Offset is position of first base to * translate. If size is 0 then use length of inSeq. */ #endif /* DNASEQ_H */ rtracklayer/src/ucsc/dnautil.c0000644000175100017510000003621014614231172017450 0ustar00biocbuildbiocbuild/* Some stuff that you'll likely need in any program that works with * DNA. Includes stuff for amino acids as well. * * Assumes that DNA is stored as a character. * The DNA it generates will include the bases * as lowercase tcag. It will generally accept * uppercase as well, and also 'n' or 'N' or '-' * for unknown bases. * * Amino acids are stored as single character upper case. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "dnautil.h" struct codonTable /* The dread codon table. */ { DNA *codon; /* Lower case. */ AA protCode; /* Upper case. The "Standard" code */ AA mitoCode; /* Upper case. Vertebrate Mitochondrial translations */ }; struct codonTable codonTable[] = /* The master codon/protein table. */ { {"ttt", 'F', 'F',}, {"ttc", 'F', 'F',}, {"tta", 'L', 'L',}, {"ttg", 'L', 'L',}, {"tct", 'S', 'S',}, {"tcc", 'S', 'S',}, {"tca", 'S', 'S',}, {"tcg", 'S', 'S',}, {"tat", 'Y', 'Y',}, {"tac", 'Y', 'Y',}, {"taa", 0, 0,}, {"tag", 0, 0,}, {"tgt", 'C', 'C',}, {"tgc", 'C', 'C',}, {"tga", 0, 'W',}, {"tgg", 'W', 'W',}, {"ctt", 'L', 'L',}, {"ctc", 'L', 'L',}, {"cta", 'L', 'L',}, {"ctg", 'L', 'L',}, {"cct", 'P', 'P',}, {"ccc", 'P', 'P',}, {"cca", 'P', 'P',}, {"ccg", 'P', 'P',}, {"cat", 'H', 'H',}, {"cac", 'H', 'H',}, {"caa", 'Q', 'Q',}, {"cag", 'Q', 'Q',}, {"cgt", 'R', 'R',}, {"cgc", 'R', 'R',}, {"cga", 'R', 'R',}, {"cgg", 'R', 'R',}, {"att", 'I', 'I',}, {"atc", 'I', 'I',}, {"ata", 'I', 'M',}, {"atg", 'M', 'M',}, {"act", 'T', 'T',}, {"acc", 'T', 'T',}, {"aca", 'T', 'T',}, {"acg", 'T', 'T',}, {"aat", 'N', 'N',}, {"aac", 'N', 'N',}, {"aaa", 'K', 'K',}, {"aag", 'K', 'K',}, {"agt", 'S', 'S',}, {"agc", 'S', 'S',}, {"aga", 'R', 0,}, {"agg", 'R', 0,}, {"gtt", 'V', 'V',}, {"gtc", 'V', 'V',}, {"gta", 'V', 'V',}, {"gtg", 'V', 'V',}, {"gct", 'A', 'A',}, {"gcc", 'A', 'A',}, {"gca", 'A', 'A',}, {"gcg", 'A', 'A',}, {"gat", 'D', 'D',}, {"gac", 'D', 'D',}, {"gaa", 'E', 'E',}, {"gag", 'E', 'E',}, {"ggt", 'G', 'G',}, {"ggc", 'G', 'G',}, {"gga", 'G', 'G',}, {"ggg", 'G', 'G',}, }; /* A table that gives values 0 for t 1 for c 2 for a 3 for g * (which is order aa's are in biochemistry codon tables) * and gives -1 for all others. */ int ntVal[256]; int ntValLower[256]; /* NT values only for lower case. */ int ntValUpper[256]; /* NT values only for upper case. */ int ntVal5[256]; int ntValNoN[256]; /* Like ntVal, but with T_BASE_VAL in place of -1 for nonexistent ones. */ DNA valToNt[(N_BASE_VAL|MASKED_BASE_BIT)+1]; /* convert tables for bit-4 indicating masked */ int ntValMasked[256]; DNA valToNtMasked[256]; static boolean inittedNtVal = FALSE; static void initNtVal() { if (!inittedNtVal) { int i; for (i=0; i= 0) { bVal = ntValNoN[(int)*in++]; out <<= 2; out += bVal; } return out; } static void checkSizeTypes() /* Make sure that some of our predefined types are the right size. */ { assert(sizeof(UBYTE) == 1); assert(sizeof(WORD) == 2); assert(sizeof(bits32) == 4); assert(sizeof(bits16) == 2); } int intronOrientationMinSize(DNA *iStart, DNA *iEnd, int minIntronSize) /* Given a gap in genome from iStart to iEnd, return * Return 1 for GT/AG intron between left and right, -1 for CT/AC, 0 for no * intron. Assumes DNA is lower cased. */ { if (iEnd - iStart < minIntronSize) return 0; if (iStart[0] == 'g' && iStart[1] == 't' && iEnd[-2] == 'a' && iEnd[-1] == 'g') { return 1; } else if (iStart[0] == 'c' && iStart[1] == 't' && iEnd[-2] == 'a' && iEnd[-1] == 'c') { return -1; } else return 0; } int dnaOrAaScoreMatch(char *a, char *b, int size, int matchScore, int mismatchScore, char ignore) /* Compare two sequences (without inserts or deletions) and score. */ { int i; int score = 0; for (i=0; i=0; --i) { DNA b = dna[i]; if (b == 'n' || b == 'N') continue; if (score > 20) score = 20; if (b == 'a' || b == 'A') { score += 1; if (score >= bestScore) { bestScore = score; bestPos = i; } else if (loose && score >= (bestScore - 8)) { /* If loose, keep extending even if score isn't back up to best. */ bestPos = i; } } else { score -= 10; } if (score < 0) { break; } } if (bestPos >= 0) { trimSize = size - bestPos - 2; // Leave two for aa in taa stop codon if (trimSize > 0) { if (doMask) for (i=size - trimSize; i 20) score = 20; if (b == 't' || b == 'T') { score += 1; if (score >= bestScore) { bestScore = score; bestPos = i; } else if (loose && score >= (bestScore - 8)) { /* If loose, keep extending even if score isn't back up to best. */ bestPos = i; } } else { score -= 10; } if (score < 0) { break; } } if (bestPos >= 0) { trimSize = bestPos+1 - 2; // Leave two for aa in taa stop codon if (trimSize > 0) { if (doMask) memset(dna, 'n', trimSize); } else trimSize = 0; } return trimSize; } boolean isDna(char *poly, int size) /* Return TRUE if letters in poly are at least 90% ACGTNU- */ { int i; int dnaCount = 0; dnaUtilOpen(); for (i=0; i= round(0.9 * size)); } /* Tables to convert from 0-20 to ascii single letter representation * of proteins. */ int aaVal[256]; AA valToAa[21]; AA aaChars[256]; /* 0 except for value aa characters. Converts to upper case rest. */ struct aminoAcidTable /* A little info about each amino acid. */ { int ix; char letter; char abbreviation[3]; char *name; }; struct aminoAcidTable aminoAcidTable[] = { {0, 'A', "ala", "alanine"}, {1, 'C', "cys", "cysteine"}, {2, 'D', "asp", "aspartic acid"}, {3, 'E', "glu", "glutamic acid"}, {4, 'F', "phe", "phenylalanine"}, {5, 'G', "gly", "glycine"}, {6, 'H', "his", "histidine"}, {7, 'I', "ile", "isoleucine"}, {8, 'K', "lys", "lysine"}, {9, 'L', "leu", "leucine"}, {10, 'M', "met", "methionine"}, {11, 'N', "asn", "asparagine"}, {12, 'P', "pro", "proline"}, {13, 'Q', "gln", "glutamine"}, {14, 'R', "arg", "arginine"}, {15, 'S', "ser", "serine"}, {16, 'T', "thr", "threonine"}, {17, 'V', "val", "valine"}, {18, 'W', "trp", "tryptophan"}, {19, 'Y', "tyr", "tyrosine"}, {20, 'X', "ter", "termination"}, }; char *aaAbbr(int i) /* return pointer to AA abbrevation */ { return(aminoAcidTable[i].abbreviation); } char aaLetter(int i) /* return AA letter */ { return(aminoAcidTable[i].letter); } static void initAaVal() /* Initialize aaVal and valToAa tables. */ { int i; char c, lowc; for (i=0; istring = needMem(initialBufSize+1); ds->bufSize = initialBufSize; return ds; } void freeDyString(struct dyString **pDs) /* Free up dynamic string. */ { struct dyString *ds; if ((ds = *pDs) != NULL) { freeMem(ds->string); freez(pDs); } } char *dyStringCannibalize(struct dyString **pDy) /* Kill dyString, but return the string it is wrapping * (formerly dy->string). This should be free'd at your * convenience. */ { char *s; struct dyString *ds = *pDy; assert(ds != NULL); s = ds->string; freez(pDy); return s; } static void dyStringExpandBuf(struct dyString *ds, int newSize) /* Expand buffer to new size. */ { ds->string = needMoreMem(ds->string, ds->stringSize+1, newSize+1); ds->bufSize = newSize; } void dyStringAppendN(struct dyString *ds, char *string, int stringSize) /* Append string of given size to end of string. */ { int oldSize = ds->stringSize; int newSize = oldSize + stringSize; char *buf; if (newSize > ds->bufSize) { int newAllocSize = newSize + oldSize; int oldSizeTimesOneAndAHalf = oldSize * 1.5; if (newAllocSize < oldSizeTimesOneAndAHalf) newAllocSize = oldSizeTimesOneAndAHalf; dyStringExpandBuf(ds,newAllocSize); } buf = ds->string; memcpy(buf+oldSize, string, stringSize); ds->stringSize = newSize; buf[newSize] = 0; } char dyStringAppendC(struct dyString *ds, char c) /* Append char to end of string. */ { char *s; if (ds->stringSize >= ds->bufSize) dyStringExpandBuf(ds, ds->bufSize+256); s = ds->string + ds->stringSize++; *s++ = c; *s = 0; return c; } void dyStringAppend(struct dyString *ds, char *string) /* Append zero terminated string to end of dyString. */ { dyStringAppendN(ds, string, strlen(string)); } void dyStringVaPrintf(struct dyString *ds, char *format, va_list args) /* VarArgs Printf to end of dyString. */ { /* attempt to format the string in the current space. If there * is not enough room, increase the buffer size and try again */ int avail, sz; while (TRUE) { va_list argscp; va_copy(argscp, args); avail = ds->bufSize - ds->stringSize; if (avail <= 0) { /* Don't pass zero sized buffers to vsnprintf, because who knows * if the library function will handle it. */ dyStringExpandBuf(ds, ds->bufSize+ds->bufSize); avail = ds->bufSize - ds->stringSize; } sz = vsnprintf(ds->string + ds->stringSize, avail, format, argscp); va_end(argscp); /* note that some version return -1 if too small */ if ((sz < 0) || (sz >= avail)) dyStringExpandBuf(ds, ds->bufSize+ds->bufSize); else { ds->stringSize += sz; break; } } } void dyStringPrintf(struct dyString *ds, char *format, ...) /* Printf to end of dyString. */ { va_list args; va_start(args, format); dyStringVaPrintf(ds, format, args); va_end(args); } rtracklayer/src/ucsc/dystring.h0000644000175100017510000000401014614231172017651 0ustar00biocbuildbiocbuild/* dystring - dynamically resizing string. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef DYSTRING_H /* Wrapper to avoid including this twice. */ #define DYSTRING_H #include "common.h" struct dyString /* Dynamically resizable string that you can do formatted * output to. */ { struct dyString *next; /* Next in list. */ char *string; /* Current buffer. */ int bufSize; /* Size of buffer. */ int stringSize; /* Size of string. */ }; struct dyString *newDyString(int initialBufSize); /* Allocate dynamic string with initial buffer size. (Pass zero for default) */ #define dyStringNew newDyString void freeDyString(struct dyString **pDs); /* Free up dynamic string. */ #define dyStringFree(a) freeDyString(a); void dyStringAppend(struct dyString *ds, char *string); /* Append zero terminated string to end of dyString. */ void dyStringAppendN(struct dyString *ds, char *string, int stringSize); /* Append string of given size to end of string. */ char dyStringAppendC(struct dyString *ds, char c); /* Append char to end of string. */ #define dyStringWriteOne(dy, var) dyStringAppendN(dy, (char *)(&var), sizeof(var)) /* Write one variable (binary!) to dyString - for cases when want to treat string like * a file stream. */ void dyStringVaPrintf(struct dyString *ds, char *format, va_list args); /* VarArgs Printf to end of dyString. */ void dyStringPrintf(struct dyString *ds, char *format, ...) /* Printf to end of dyString. */ #ifdef __GNUC__ __attribute__((format(printf, 2, 3))) #endif ; #define dyStringClear(ds) (ds->string[0] = ds->stringSize = 0) /* Clear string. */ char *dyStringCannibalize(struct dyString **pDy); /* Kill dyString, but return the string it is wrapping * (formerly dy->string). This should be free'd at your * convenience. */ #define dyStringContents(ds) (ds)->string /* return raw string. */ #define dyStringLen(ds) ds->stringSize /* return raw string length. */ #endif /* DYSTRING_H */ rtracklayer/src/ucsc/errAbort.c0000644000175100017510000002230614614231172017571 0ustar00biocbuildbiocbuild/* errAbort.c - our error handler. * * This maintains two stacks - a warning message printer * stack, and a "abort handler" stack. * * Note that the abort function always calls the warn handler first. * This is so that the message gets sent. * * By default the warnings will go to stderr, and * aborts will exit the program. You can push a * function on to the appropriate stack to change * this behavior. The top function on the stack * gets called. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ // developer: this include is for an occasionally useful means of getting stack info without // crashing // however, it is not supported on cygwin. Conditionally compile this in when desired. //#define BACKTRACE_EXISTS #ifdef BACKTRACE_EXISTS #include #endif///def BACKTRACE_EXISTS #include #include "common.h" #include "hash.h" #include "dystring.h" #include "errAbort.h" #define maxWarnHandlers 20 #define maxAbortHandlers 12 struct perThreadAbortVars /* per thread variables for abort and warn */ { boolean debugPushPopErr; // generate stack dump on push/pop error boolean errAbortInProgress; /* Flag to indicate that an error abort is in progress. * Needed so that a warn handler can tell if it's really * being called because of a warning or an error. */ WarnHandler warnArray[maxWarnHandlers]; int warnIx; AbortHandler abortArray[maxAbortHandlers]; int abortIx; }; static struct perThreadAbortVars *getThreadVars(); // forward declaration static void defaultVaWarn(char *format, va_list args) /* Default error message handler. */ { if (format != NULL) { fflush(stdout); vfprintf(stderr, format, args); fprintf(stderr, "\n"); fflush(stderr); } } static void silentVaWarn(char *format, va_list args) /* Warning handler that just hides it. Useful sometimes when high level code * expects low level code may fail (as in finding a file on the net) but doesn't * want user to be bothered about it. */ { } void vaWarn(char *format, va_list args) /* Call top of warning stack to issue warning. */ { struct perThreadAbortVars *ptav = getThreadVars(); ptav->warnArray[ptav->warnIx](format, args); } void warn(char *format, ...) /* Issue a warning message. */ { va_list args; va_start(args, format); vaWarn(format, args); va_end(args); } void errnoWarn(char *format, ...) /* Prints error message from UNIX errno first, then does rest of warning. */ { char fbuf[512]; va_list args; va_start(args, format); sprintf(fbuf, "%s\n%s", strerror(errno), format); vaWarn(fbuf, args); va_end(args); } void pushWarnHandler(WarnHandler handler) /* Set abort handler */ { struct perThreadAbortVars *ptav = getThreadVars(); if (ptav->warnIx >= maxWarnHandlers-1) { #ifndef WIN32 if (ptav->debugPushPopErr) dumpStack("pushWarnHandler overflow"); #endif errAbort("Too many pushWarnHandlers, can only handle %d\n", maxWarnHandlers-1); } ptav->warnArray[++ptav->warnIx] = handler; } void popWarnHandler() /* Revert to old warn handler. */ { struct perThreadAbortVars *ptav = getThreadVars(); if (ptav->warnIx <= 0) { #ifndef WIN32 if (ptav->debugPushPopErr) dumpStack("popWarnHandler underflow"); #endif errAbort("Too few popWarnHandlers"); } --ptav->warnIx; } static void defaultAbort() /* Default error handler exits program. */ { if ((getenv("ERRASSERT") != NULL) || (getenv("ERRABORT") != NULL)) abort(); else exit(-1); } void noWarnAbort() /* Abort without message. */ { struct perThreadAbortVars *ptav = getThreadVars(); ptav->abortArray[ptav->abortIx](); exit(-1); /* This is just to make compiler happy. * We have already exited or longjmped by now. */ } void vaErrAbort(char *format, va_list args) /* Abort function, with optional (vprintf formatted) error message. */ { /* flag is needed because both errAbort and warn generate message * using the warn handler, however sometimes one needed to know * (like when logging), if it's an error or a warning. This is far from * perfect, as this isn't cleared if the error handler continues, * as with an exception mechanism. */ struct perThreadAbortVars *ptav = getThreadVars(); ptav->errAbortInProgress = TRUE; vaWarn(format, args); noWarnAbort(); } void errAbort(char *format, ...) /* Abort function, with optional (printf formatted) error message. */ { va_list args; va_start(args, format); vaErrAbort(format, args); va_end(args); } void errnoAbort(char *format, ...) /* Prints error message from UNIX errno first, then does errAbort. */ { char fbuf[512]; va_list args; va_start(args, format); sprintf(fbuf, "%s\n%s", strerror(errno), format); vaErrAbort(fbuf, args); va_end(args); } void pushAbortHandler(AbortHandler handler) /* Set abort handler */ { struct perThreadAbortVars *ptav = getThreadVars(); if (ptav->abortIx >= maxAbortHandlers-1) { #ifndef WIN32 if (ptav->debugPushPopErr) dumpStack("pushAbortHandler overflow"); #endif errAbort("Too many pushAbortHandlers, can only handle %d", maxAbortHandlers-1); } ptav->abortArray[++ptav->abortIx] = handler; } void popAbortHandler() /* Revert to old abort handler. */ { struct perThreadAbortVars *ptav = getThreadVars(); if (ptav->abortIx <= 0) { #ifndef WIN32 if (ptav->debugPushPopErr) dumpStack("popAbortHandler underflow"); #endif errAbort("Too many popAbortHandlers\n"); } --ptav->abortIx; } static void debugAbort() /* Call the debugger. */ { fflush(stdout); assert(FALSE); defaultAbort(); } static void warnAbortHandler(char *format, va_list args) /* warn handler that also aborts. */ { defaultVaWarn(format, args); noWarnAbort(); } void pushSilentWarnHandler() /* Set warning handler to be quiet. Do a popWarnHandler to restore. */ { pushWarnHandler(silentVaWarn); } static struct perThreadAbortVars *getThreadVars() /* Return a pointer to the perThreadAbortVars for the current pthread. */ { pthread_t pid = pthread_self(); // pthread_t can be a pointer or a number, implementation-dependent. // Test for out-of-memory condition causing re-entrancy into this function that would block // on its own main mutex ptavMutex. Do this by looking for its own pid. // Some care must be exercised in testing and comparing the threads pid against one in-use. // We need yet another mutex and a boolean to tell us when the pidInUse value may be safely compared to pid. // Use a boolean since there is no known unused value for pthread_t variable. NULL and -1 are not portable. static boolean pidInUseValid = FALSE; // tells when pidInUse contains a valid pid that can be compared. static pthread_t pidInUse; // there is no "unused" value to which we can initialize this. static pthread_mutex_t pidInUseMutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock( &pidInUseMutex ); // If this pid equals pidInUse, then this function has been re-entered due to severe out-of-memory error. // But we only compare them when pidInUseValid is TRUE. if (pidInUseValid && pthread_equal(pid, pidInUse)) { // Avoid deadlock on self by exiting immediately. // Use pthread_equal because directly comparing two pthread_t vars is not allowed. // This re-entrancy only happens when it has aborted already due to out of memory // which should be a rare occurrence. char *errMsg = "errAbort re-entered due to out-of-memory condition. Exiting.\n"; write(STDERR_FILENO, errMsg, strlen(errMsg)); exit(1); // out of memory is a serious problem, exit immediately, but allow atexit cleanup. } pthread_mutex_unlock( &pidInUseMutex ); // This is the main mutex we really care about. // It controls access to the hash where thread-specific data is stored. static pthread_mutex_t ptavMutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock( &ptavMutex ); // safely tell threads that pidInUse // is valid and correctly set and may be compared to pid pthread_mutex_lock( &pidInUseMutex ); pidInUse = pthread_self(); // setting it directly to pid is not allowed. pidInUseValid = TRUE; pthread_mutex_unlock( &pidInUseMutex ); // This means that if we crash due to out-of-memory below, // it will be able to detect the re-entrancy and handle it above. static struct hash *perThreadVars = NULL; if (perThreadVars == NULL) perThreadVars = hashNew(0); // convert the pid into a string for the hash key char pidStr[64]; safef(pidStr, sizeof(pidStr), "%lld", ptrToLL(pid)); struct hashEl *hel = hashLookup(perThreadVars, pidStr); if (hel == NULL) { // if it is the first time, initialization the perThreadAbortVars struct perThreadAbortVars *ptav; AllocVar(ptav); ptav->debugPushPopErr = FALSE; ptav->errAbortInProgress = FALSE; ptav->warnIx = 0; ptav->warnArray[0] = defaultVaWarn; ptav->abortIx = 0; ptav->abortArray[0] = defaultAbort; hel = hashAdd(perThreadVars, pidStr, ptav); } // safely tell other threads that pidInUse // is no longer valid and may not be compared to pid pthread_mutex_lock( &pidInUseMutex ); pidInUseValid = FALSE; pthread_mutex_unlock( &pidInUseMutex ); // unlock our mutex controlling the hash of thread-specific data pthread_mutex_unlock( &ptavMutex ); return (struct perThreadAbortVars *)(hel->val); } rtracklayer/src/ucsc/errAbort.h0000644000175100017510000000401614614231172017574 0ustar00biocbuildbiocbuild/* ErrAbort.h - our error handler. * * This maintains two stacks - a warning message printer * stack, and a "abort handler" stack. * * By default the warnings will go to stderr, and * aborts will exit the program. You can push a * function on to the appropriate stack to change * this behavior. The top function on the stack * gets called. * * Most functions in this library will call errAbort() * if they run out of memory. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef ERRABORT_H #define ERRABORT_H void errAbort(char *format, ...) /* Abort function, with optional (printf formatted) error message. */ #if defined(__GNUC__) __attribute__((format(printf, 1, 2))) #endif ; void vaErrAbort(char *format, va_list args); /* Abort function, with optional (vprintf formatted) error message. */ void errnoAbort(char *format, ...) /* Prints error message from UNIX errno first, then does errAbort. */ #if defined(__GNUC__) __attribute__((format(printf, 1, 2))) #endif ; typedef void (*AbortHandler)(); /* Function that can abort. */ void pushAbortHandler(AbortHandler handler); /* Set abort handler */ void popAbortHandler(); /* Revert to old abort handler. */ void noWarnAbort(); /* Abort without message. */ void vaWarn(char *format, va_list args); /* Call top of warning stack to issue warning. */ void warn(char *format, ...) /* Issue a warning message. */ #if defined(__GNUC__) __attribute__((format(printf, 1, 2))) #endif ; void errnoWarn(char *format, ...) /* Prints error message from UNIX errno first, then does rest of warning. */ #if defined(__GNUC__) __attribute__((format(printf, 1, 2))) #endif ; typedef void (*WarnHandler)(char *format, va_list args); /* Function that can warn. */ void pushWarnHandler(WarnHandler handler); /* Set warning handler */ void popWarnHandler(); /* Revert to old warn handler. */ void pushSilentWarnHandler(); /* Set warning handler to be quiet. Do a popWarnHandler to restore. */ #endif /* ERRABORT_H */ rtracklayer/src/ucsc/errCatch.h0000644000175100017510000000375514614231172017560 0ustar00biocbuildbiocbuild/* errCatch - help catch errors so that errAborts aren't * fatal, and warn's don't necessarily get printed immediately. * Note that error conditions caught this way will tend to * leak resources unless there are additional wrappers. * * Typical usage is * errCatch = errCatchNew(); * if (errCatchStart(errCatch)) * doFlakyStuff(); * errCatchEnd(errCatch); * if (errCatch->gotError) * warn("Flaky stuff failed: %s", errCatch->message->string); * errCatchFree(&errCatch); * cleanupFlakyStuff(); */ #ifndef ERRCATCH_H #define ERRCATCH_H #ifndef DYSTRING_H #include "dystring.h" #endif struct errCatch /* Something to help catch errors. */ { struct errCatch *next; /* Next in stack. */ jmp_buf jmpBuf; /* Where to jump back to for recovery. */ struct dyString *message; /* Error message if any */ boolean gotError; /* Some sort of error was caught. */ boolean gotWarning; /* Some sort of error warning was raised. */ }; struct errCatch *errCatchNew(); /* Return new error catching structure. */ void errCatchFree(struct errCatch **pErrCatch); /* Free up resources associated with errCatch */ #define errCatchStart(e) (errCatchPushHandlers(e) && setjmp(e->jmpBuf) == 0) /* Little wrapper around setjmp. This returns TRUE * on the main execution thread, FALSE after abort. */ boolean errCatchPushHandlers(struct errCatch *errCatch); /* Push error handlers. Not usually called directly. * but rather through errCatchStart() macro. Always * returns TRUE. */ void errCatchEnd(struct errCatch *errCatch); /* Restore error handlers and pop self off of catching stack. */ void errCatchReWarn(struct errCatch *errCatch); /* Re-warn any warnings that happened even though no abort happened * to make them visible. */ boolean errCatchFinish(struct errCatch **pErrCatch); /* Finish up error catching. Report error if there is a * problem and return FALSE. If no problem return TRUE. * This handles errCatchEnd and errCatchFree. */ #endif /* ERRCATCH_H */ rtracklayer/src/ucsc/filePath.c0000644000175100017510000000343114614231172017543 0ustar00biocbuildbiocbuild /* filePath - stuff to handle file name parsing. */ /* Copyright (C) 2011 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "filePath.h" static char *findSlashBefore(char *start, char *e) /* Return first slash before s (but not before start) */ { while (--e >= start) { if (*e == '/') return e; } return start; } void undosPath(char *path) /* Convert '\' to '/' in path. */ { subChar(path, '\\', '/'); } char *expandRelativePath(char *baseDir, char *relPath) /* Expand relative path to more absolute one. */ { if (relPath[0] == '/') // hey, it's absolute actually... return cloneString(relPath); char *e = baseDir + strlen(baseDir); int slashCount; char *rel = relPath; char *result; int size, baseSize; undosPath(baseDir); undosPath(relPath); slashCount = countChars(baseDir, '/'); if (baseDir[0] == 0) slashCount = -1; while (startsWith("../", rel)) { if (slashCount < 0) { warn("More ..'s in \"%s\" than directories in \"%s\"", relPath, baseDir); return NULL; } else if (slashCount == 0) e = baseDir; else e = findSlashBefore(baseDir, e); slashCount -= 1; rel += 3; } baseSize = e - baseDir; size = strlen(rel) + 1; if (baseSize > 0) size += baseSize + 1; if (baseSize > 0) { result = needMem(size); memcpy(result, baseDir, baseSize); result[baseSize] = '/'; strcpy(result + baseSize + 1, rel); } else result = cloneString(rel); return result; } rtracklayer/src/ucsc/filePath.h0000644000175100017510000000076214614231172017554 0ustar00biocbuildbiocbuild/* filePath - stuff to handle file name parsing. */ /* Copyright (C) 2011 The Regents of the University of California * See README in this or parent directory for licensing information. */ #ifndef FILEPATH_H #define FILEPATH_H #include "common.h" char *expandRelativePath(char *baseDir, char *relPath); /* Expand relative path to more absolute one. */ void undosPath(char *path); /* Convert '\' to '/' in path. (DOS/Windows is typically ok with * this actually.) */ #endif /* FILEPATH_H */ rtracklayer/src/ucsc/hash.c0000644000175100017510000002602714614231172016740 0ustar00biocbuildbiocbuild/* Hash.c - implements hashing. See hash.h for usage comments. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "localmem.h" #include "hash.h" #include "obscure.h" #include "dystring.h" /* * Hash a string key. This code is taken from Tcl interpreter. I was borrowed * after discovering a lot of collisions and poor utilization of the table * when hashing accessions. * * This function was compared to Bob Jenkins' lookup2 hash function and * (http://burtleburtle.net/bob/hash/) and Paul Hsieh's SuperFast * hash function (http://www.azillionmonkeys.com/qed/hash.html). * Both of those functions provided better utilization of the table, * but were also more expensive, so the Tcl function was used. * If hashing of binary keys is implemented, SuperFast hash should * be considered. * * for an explanation of this function, see HashStringKey() in the * Tcl source file, generic/tclHash.c, available from * http://tcl.sourceforge.net/. * * The Tcl code is: * Copyright (c) 1991-1993 The Regents of the University of California. * Copyright (c) 1994 Sun Microsystems, Inc. * * See the file "license.terms" (in the Tcl distribution) for complete * license (which is a BSD-style license). * * Since hashCrc() is in use elsewhere, * a new function hashString() was created for use in hash table. * -- markd */ bits32 hashString(char *string) /* Compute a hash value of a string. */ { char *keyStr = string; unsigned int result = 0; int c; while ((c = *keyStr++) != '\0') { result += (result<<3) + c; } return result; } struct hashEl *hashLookup(struct hash *hash, char *name) /* Looks for name in hash table. Returns associated element, * if found, or NULL if not. If there are multiple entries * for name, the last one added is returned (LIFO behavior). */ { struct hashEl *el = hash->table[hashString(name)&hash->mask]; while (el != NULL) { if (strcmp(el->name, name) == 0) break; el = el->next; } return el; } struct hashEl *hashLookupUpperCase(struct hash *hash, char *name) /* Lookup upper cased name in hash. (Assumes all elements of hash * are themselves already in upper case.) */ { char s[256]; safef(s, sizeof(s), "%s", name); touppers(s); return hashLookup(hash, s); } struct hashEl *hashAddN(struct hash *hash, char *name, int nameSize, void *val) /* Add name of given size to hash (no need to be zero terminated) */ { struct hashEl *el; if (hash->lm) el = lmAlloc(hash->lm, sizeof(*el)); else AllocVar(el); el->hashVal = hashString(name); int hashVal = el->hashVal & hash->mask; if (hash->lm) { el->name = lmAlloc(hash->lm, nameSize+1); memcpy(el->name, name, nameSize); } else el->name = cloneStringZ(name, nameSize); el->val = val; el->next = hash->table[hashVal]; hash->table[hashVal] = el; hash->elCount += 1; if (hash->autoExpand && hash->elCount > (int)(hash->size * hash->expansionFactor)) { /* double the size */ hashResize(hash, digitsBaseTwo(hash->size)); } return el; } struct hashEl *hashAdd(struct hash *hash, char *name, void *val) /* Add new element to hash table. If an item with name, already exists, a new * item is added in a LIFO manner. The last item added for a given name is * the one returned by the hashLookup functions. hashLookupNext must be used * to find the preceding entries for a name. */ { return hashAddN(hash, name, strlen(name), val); } void freeHashEl(struct hashEl *hel) /* Free hash element. Use only on non-local memory version. */ { freeMem(hel->name); freeMem(hel); } void *hashRemove(struct hash *hash, char *name) /* Remove item of the given name from hash table. * Returns value of removed item, or NULL if not in the table. * If their are multiple entries for name, the last one added * is removed (LIFO behavior). */ { struct hashEl *hel; void *ret; struct hashEl **pBucket = &hash->table[hashString(name)&hash->mask]; for (hel = *pBucket; hel != NULL; hel = hel->next) if (sameString(hel->name, name)) break; if (hel == NULL) return NULL; ret = hel->val; if (slRemoveEl(pBucket, hel)) { hash->elCount -= 1; if (!hash->lm) freeHashEl(hel); } return ret; } struct hashEl *hashAddUnique(struct hash *hash, char *name, void *val) /* Add new element to hash table. Squawk and die if not unique */ { if (hashLookup(hash, name) != NULL) errAbort("%s duplicated, aborting", name); return hashAdd(hash, name, val); } struct hashEl *hashAddSaveName(struct hash *hash, char *name, void *val, char **saveName) /* Add new element to hash table. Save the name of the element, which is now * allocated in the hash table, to *saveName. A typical usage would be: * AllocVar(el); * hashAddSaveName(hash, name, el, &el->name); */ { struct hashEl *hel = hashAdd(hash, name, val); *saveName = hel->name; return hel; } int hashIntVal(struct hash *hash, char *name) /* Return integer value associated with name in a simple * hash of ints. */ { void *val = hashMustFindVal(hash, name); return ptToInt(val); } int hashIntValDefault(struct hash *hash, char *name, int defaultInt) /* Return integer value associated with name in a simple * hash of ints or defaultInt if not found. */ { struct hashEl *hel = hashLookup(hash, name); if(hel == NULL) return defaultInt; return ptToInt(hel->val); } void *hashMustFindVal(struct hash *hash, char *name) /* Lookup name in hash and return val. Abort if not found. */ { struct hashEl *hel = hashLookup(hash, name); if (hel == NULL) errAbort("hashMustFindVal: '%s' not found", name); return hel->val; } void *hashFindVal(struct hash *hash, char *name) /* Look up name in hash and return val or NULL if not found. */ { struct hashEl *hel = hashLookup(hash, name); if (hel == NULL) return NULL; return hel->val; } void *hashFindValUpperCase(struct hash *hash, char *name) /* Lookup upper cased name in hash and return val or return NULL if not found. * (Assumes all elements of hash are themselves already in upper case.) */ { struct hashEl *hel = hashLookupUpperCase(hash, name); if (hel == NULL) return NULL; return hel->val; } struct hashEl *hashAddInt(struct hash *hash, char *name, int val) /* Store integer value in hash */ { char *pt = NULL; return hashAdd(hash, name, pt + val); } struct hash *newHashExt(int powerOfTwoSize, boolean useLocalMem) /* Returns new hash table. Uses local memory optionally. */ { struct hash *hash = needMem(sizeof(*hash)); int memBlockPower = 16; if (powerOfTwoSize == 0) powerOfTwoSize = 12; assert(powerOfTwoSize <= hashMaxSize && powerOfTwoSize > 0); hash->powerOfTwoSize = powerOfTwoSize; hash->size = (1<lm = lmInit(1<mask = hash->size-1; AllocArray(hash->table, hash->size); hash->autoExpand = TRUE; hash->expansionFactor = defaultExpansionFactor; /* Expand when elCount > size*expansionFactor */ return hash; } void hashResize(struct hash *hash, int powerOfTwoSize) /* Resize the hash to a new size */ { int oldHashSize = hash->size; struct hashEl **oldTable = hash->table; if (powerOfTwoSize == 0) powerOfTwoSize = 12; assert(powerOfTwoSize <= hashMaxSize && powerOfTwoSize > 0); hash->powerOfTwoSize = powerOfTwoSize; hash->size = (1<mask = hash->size-1; AllocArray(hash->table, hash->size); int i; struct hashEl *hel, *next; for (i=0; inext; int hashVal = hel->hashVal & hash->mask; hel->next = hash->table[hashVal]; hash->table[hashVal] = hel; } } /* restore original list order */ for (i=0; isize; ++i) { struct hashEl *hel = hash->table[i]; if (hel != NULL && hel->next != NULL) slReverse(&hash->table[i]); } freeMem(oldTable); hash->numResizes++; } void hashTraverseVals(struct hash *hash, void (*func)(void *val)) /* Apply func to every element of hash with hashEl->val as parameter. */ { int i; struct hashEl *hel; for (i=0; isize; ++i) { for (hel = hash->table[i]; hel != NULL; hel = hel->next) func(hel->val); } } int hashElCmp(const void *va, const void *vb) /* Compare two hashEl by name. */ { const struct hashEl *a = *((struct hashEl **)va); const struct hashEl *b = *((struct hashEl **)vb); return strcmp(a->name, b->name); } struct hashEl *hashElListHash(struct hash *hash) /* Return a list of all elements of hash. Free return with hashElFreeList. */ { int i; struct hashEl *hel, *dupe, *list = NULL; for (i=0; isize; ++i) { for (hel = hash->table[i]; hel != NULL; hel = hel->next) { dupe = CloneVar(hel); slAddHead(&list, dupe); } } return list; } void hashElFreeList(struct hashEl **pList) /* Free hash el list returned from hashListAll. (Don't use * this internally. */ { slFreeList(pList); } struct hashCookie hashFirst(struct hash *hash) /* Return an object to use by hashNext() to traverse the hash table. * The first call to hashNext will return the first entry in the table. */ { struct hashCookie cookie; cookie.hash = hash; cookie.idx = 0; cookie.nextEl = NULL; /* find first entry */ for (cookie.idx = 0; (cookie.idx < hash->size) && (hash->table[cookie.idx] == NULL); cookie.idx++) continue; /* empty body */ if (cookie.idx < hash->size) cookie.nextEl = hash->table[cookie.idx]; return cookie; } struct hashEl* hashNext(struct hashCookie *cookie) /* Return the next entry in the hash table, or NULL if no more. Do not modify * hash table while this is being used. */ { /* NOTE: if hashRemove were coded to track the previous entry during the * search and then use it to do the remove, it would be possible to * remove the entry returned by this method */ struct hashEl *retEl = cookie->nextEl; if (retEl == NULL) return NULL; /* no more */ /* find next entry */ cookie->nextEl = retEl->next; if (cookie->nextEl == NULL) { for (cookie->idx++; (cookie->idx < cookie->hash->size) && (cookie->hash->table[cookie->idx] == NULL); cookie->idx++) continue; /* empty body */ if (cookie->idx < cookie->hash->size) cookie->nextEl = cookie->hash->table[cookie->idx]; } return retEl; } void freeHash(struct hash **pHash) /* Free up hash table. */ { struct hash *hash = *pHash; if (hash == NULL) return; if (hash->lm) lmCleanup(&hash->lm); else { int i; struct hashEl *hel, *next; for (i=0; isize; ++i) { for (hel = hash->table[i]; hel != NULL; hel = next) { next = hel->next; freeHashEl(hel); } } } freeMem(hash->table); freez(pHash); } static int bucketLen(struct hashEl *hel) /* determine how many elements are in a hash bucket */ { int nel = 0; for (; hel != NULL; hel = hel->next) nel++; return nel; } int hashNumEntries(struct hash *hash) /* count the number of entries in a hash */ { int n = 0, i; for (i=0; isize; ++i) n += bucketLen(hash->table[i]); return n; } rtracklayer/src/ucsc/hash.h0000644000175100017510000001656614614231172016754 0ustar00biocbuildbiocbuild/* Hash - a simple hash table that provides name/value pairs. * The most common usage is to create a hash as so: * struct hash *hash = hashNew(0); * to add elements to a hash as so: * hashAdd(hash, name, value); * and to retrieve a named element as so: * value = hashFindVal(hash, name); * The hashFindVal function will return NULL if the name does not * appear in the hash. Alternatively you can use: * value = hashMustFindVal(hash, name); * which will abort if name is not in the hash. When done with a hash do: * hashFree(&hash); * * The hash does support multiple values for the same key. To use * this functionality, try the loop: * struct hashEl *hel; * for (hel = hashLookup(hash, name); hel != NULL; hel = hashLookupNext(hel)) * { * value = hel->val; * // Further processing here. * The order of elements retrieved this way will be most-recently-added first. * The hashLookup function is _slightly_ faster than the hashFindVal function, * so sometimes it is used just to test for the presence of an element in the * hash when not interested in the value associated with it. * * One can iterate through all the elements in a hash in three ways. One can * get a list of all things in the hash as so: * struct hashEl *hel, *helList = hashElListHash(hash); * for (hel = helList; hel != NULL; hel = hel->next) * { * value = hel->val; * // Further processing of value here. * } * hashElFreeList(&helList); * One can avoid the overhead of creating a list by using an iterator object * and function: * struct hashEl *hel; * struct hashCookie cookie = hashFirst(hash); * while ((hel = hashNext(&cookie)) != NULL) * { * value = hel->val; * Finally one can use hashTraverseEls or hashTraverseVals with a callback * function that takes a hashEl, or the void *value as parameter respectively. * * There are various other functions involving hashes in this module as well * that provide various short cuts. For information on these and additional * details of the functions described, please read the full hash.h file, and * if so inclined the hash.c file as well. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef HASH_H #define HASH_H struct hashEl /* An element in a hash list. */ { struct hashEl *next; char *name; void *val; bits32 hashVal; }; struct hash { struct hash *next; /* Next in list. */ bits32 mask; /* Mask hashCrc with this to get it to fit table. */ struct hashEl **table; /* Hash buckets. */ int powerOfTwoSize; /* Size of table as a power of two. */ int size; /* Size of table. */ struct lm *lm; /* Local memory pool. */ int elCount; /* Count of elements. */ boolean autoExpand; /* Automatically expand hash */ float expansionFactor; /* Expand when elCount > size*expansionFactor */ int numResizes; /* number of times resize was called */ }; #define defaultExpansionFactor 1.0 #define hashMaxSize 28 struct hashCookie /* used by hashFirst/hashNext in tracking location in traversing hash */ { struct hash *hash; /* hash we are associated with */ int idx; /* current index in hash */ struct hashEl *nextEl; /* current element in hash */ }; bits32 hashString(char *string); /* Compute a hash value of a string. */ struct hashEl *hashLookup(struct hash *hash, char *name); /* Looks for name in hash table. Returns associated element, * if found, or NULL if not. If there are multiple entries * for name, the last one added is returned (LIFO behavior). */ struct hashEl *hashLookupUpperCase(struct hash *hash, char *name); /* Lookup upper cased name in hash. (Assumes all elements of hash * are themselves already in upper case.) */ struct hashEl *hashAdd(struct hash *hash, char *name, void *val); /* Add new element to hash table. If an item with name, already exists, a new * item is added in a LIFO manner. The last item added for a given name is * the one returned by the hashLookup functions. hashLookupNext must be used * to find the preceding entries for a name. */ struct hashEl *hashAddN(struct hash *hash, char *name, int nameSize, void *val); /* Add name of given size to hash (no need to be zero terminated) */ void *hashRemove(struct hash *hash, char *name); /* Remove item of the given name from hash table. * Returns value of removed item, or NULL if not in the table. * If their are multiple entries for name, the last one added * is removed (LIFO behavior). */ struct hashEl *hashAddUnique(struct hash *hash, char *name, void *val); /* Add new element to hash table. Squawk and die if is already in table. */ struct hashEl *hashAddSaveName(struct hash *hash, char *name, void *val, char **saveName); /* Add new element to hash table. Save the name of the element, which is now * allocated in the hash table, to *saveName. A typical usage would be: * AllocVar(el); * hashAddSaveName(hash, name, el, &el->name); */ void *hashMustFindVal(struct hash *hash, char *name); /* Lookup name in hash and return val. Abort if not found. */ void *hashFindVal(struct hash *hash, char *name); /* Look up name in hash and return val or NULL if not found. */ void *hashFindValUpperCase(struct hash *hash, char *name); /* Lookup upper cased name in hash and return val or return NULL if not found. * (Assumes all elements of hash are themselves already in upper case.) */ struct hashEl *hashAddInt(struct hash *hash, char *name, int val); /* Store integer value in hash */ int hashIntVal(struct hash *hash, char *name); /* Return integer value associated with name in a simple * hash of ints. */ int hashIntValDefault(struct hash *hash, char *name, int defaultInt); /* Return integer value associated with name in a simple * hash of ints or defaultInt if not found. */ void hashTraverseVals(struct hash *hash, void (*func)(void *val)); /* Apply func to every element of hash with hashEl->val as parameter. */ struct hashEl *hashElListHash(struct hash *hash); /* Return a list of all elements of hash. Free return with hashElFreeList. */ int hashElCmp(const void *va, const void *vb); /* Compare two hashEl by name. */ void hashElFreeList(struct hashEl **pList); /* Free hash el list returned from hashListAll. (Don't use * this internally. */ struct hashCookie hashFirst(struct hash *hash); /* Return an object to use by hashNext() to traverse the hash table. * The first call to hashNext will return the first entry in the table. */ struct hashEl* hashNext(struct hashCookie *cookie); /* Return the next entry in the hash table, or NULL if no more. Do not modify * hash table while this is being used. (see note in code if you want to fix * this) */ struct hash *newHashExt(int powerOfTwoSize, boolean useLocalMem); /* Returns new hash table. Uses local memory optionally. */ #define hashNewExt(a) newHashExt(a) /* Synonym */ #define newHash(a) newHashExt(a, TRUE) /* Returns new hash table using local memory. */ #define hashNew(a) newHash(a) /* Synonym */ void hashResize(struct hash *hash, int powerOfTwoSize); /* Resize the hash to a new size */ void freeHash(struct hash **pHash); /* Free up hash table. */ #define hashFree(a) freeHash(a) /* Synonym */ int hashNumEntries(struct hash *hash); /* count the number of entries in a hash */ #endif /* HASH_H */ rtracklayer/src/ucsc/hmmstats.c0000644000175100017510000000121714614231172017647 0ustar00biocbuildbiocbuild/* hmmstats.c - Stuff for doing statistical analysis in general and * hidden Markov models in particular. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "hmmstats.h" double oneOverSqrtTwoPi = 0.39894228; double calcVarianceFromSums(double sum, double sumSquares, bits64 n) /* Calculate variance. */ { double var = sumSquares - sum*sum/n; if (n > 1) var /= n-1; return var; } double calcStdFromSums(double sum, double sumSquares, bits64 n) /* Calculate standard deviation. */ { return sqrt(calcVarianceFromSums(sum, sumSquares, n)); } rtracklayer/src/ucsc/hmmstats.h0000644000175100017510000000147614614231172017663 0ustar00biocbuildbiocbuild/***************************************************************************** * Copyright (C) 2000 Jim Kent. This source code may be freely used * * for personal, academic, and non-profit purposes. Commercial use * * permitted only by explicit agreement with Jim Kent (jim_kent@pacbell.net) * *****************************************************************************/ /* hmmstats.h - Stuff for doing statistical analysis in general and * hidden Markov models in particular. */ #ifndef HMMSTATS_H #define HMMSTATS_H #define logScaleFactor 1000 /* Amount we scale logs by. */ double calcVarianceFromSums(double sum, double sumSquares, bits64 n); /* Calculate variance. */ double calcStdFromSums(double sum, double sumSquares, bits64 n); /* Calculate standard deviation. */ #endif /* HMMSTATS_H */ rtracklayer/src/ucsc/htmlColor.c0000644000175100017510000000316214614231172017753 0ustar00biocbuildbiocbuild/* HTML colors */ /* Copyright (C) 2017 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" struct htmlColor { char *name; unsigned rgb; }; static struct htmlColor htmlColors[] = { /* The 16 HTML basic colors, as per //www.w3.org/TR/css3-color/#html4 */ { "black", 0 }, { "silver", 0xc0c0c0 }, { "gray", 0x808080 }, { "white", 0xffffff }, { "maroon", 0x800000 }, { "red", 0xff0000 }, { "purple", 0x800080 }, { "fuchsia", 0xff00ff }, { "green", 0x008000 }, { "lime", 0x00ff00 }, { "olive", 0x808000 }, { "yellow", 0xffff00 }, { "navy", 0x000080 }, { "blue", 0x0000ff }, { "teal", 0x008080 }, { "aqua", 0x00ffff } }; int htmlColorCount() /* Return count of defined HTML colors */ { return (sizeof(htmlColors) / (sizeof(struct htmlColor))); } boolean htmlColorForName(char *name, unsigned *value) /* Lookup color for name. Return false if not a valid color name */ { int count = htmlColorCount(); int i; for (i=0; istring) != '/') dyStringAppendC(dy, '/'); dyStringAppend(dy, url); } } return dyStringCannibalize(&dy); } rtracklayer/src/ucsc/htmlPage.h0000644000175100017510000000053614614231172017560 0ustar00biocbuildbiocbuild#ifndef HTMLPAGE_H #define HTMLPAGE_H #ifndef DYSTRING_H #include "dystring.h" #endif char *expandUrlOnBase(char *base, char *url); /* Figure out first character past host name. Load up * return string with protocol (if any) and host name. * It is assumed that url is relative to base and does not contain a protocol.*/ #endif /* HTMLPAGE_H */ rtracklayer/src/ucsc/https.c0000644000175100017510000001725014614231172017155 0ustar00biocbuildbiocbuild/* Connect via https. */ /* Copyright (C) 2012 The Regents of the University of California * See README in this or parent directory for licensing information. */ #ifdef USE_SSL #include "openssl/ssl.h" #include "openssl/err.h" #include #include #include #include "common.h" #include "errAbort.h" #include "net.h" static pthread_mutex_t *mutexes = NULL; static unsigned long openssl_id_callback(void) { return ((unsigned long)pthread_self()); } static void openssl_locking_callback(int mode, int n, const char * file, int line) { if (mode & CRYPTO_LOCK) pthread_mutex_lock(&mutexes[n]); else pthread_mutex_unlock(&mutexes[n]); } void openssl_pthread_setup(void) { int i; int numLocks = CRYPTO_num_locks(); AllocArray(mutexes, numLocks); for (i = 0; i < numLocks; i++) pthread_mutex_init(&mutexes[i], NULL); CRYPTO_set_id_callback(openssl_id_callback); CRYPTO_set_locking_callback(openssl_locking_callback); } struct netConnectHttpsParams /* params to pass to thread */ { pthread_t thread; char *hostName; int port; int sv[2]; /* the pair of socket descriptors */ }; static void xerrno(char *msg) { fprintf(stderr, "%s : %s\n", strerror(errno), msg); fflush(stderr); } static void xerr(char *msg) { fprintf(stderr, "%s\n", msg); fflush(stderr); } void openSslInit() /* do only once */ { static boolean done = FALSE; static pthread_mutex_t osiMutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock( &osiMutex ); if (!done) { SSL_library_init(); ERR_load_crypto_strings(); ERR_load_SSL_strings(); OpenSSL_add_all_algorithms(); openssl_pthread_setup(); done = TRUE; } pthread_mutex_unlock( &osiMutex ); } void *netConnectHttpsThread(void *threadParam) /* use a thread to run socket back to user */ { /* child */ struct netConnectHttpsParams *params = threadParam; pthread_detach(params->thread); // this thread will never join back with it's progenitor int fd=0; char hostnameProto[256]; BIO *sbio; SSL_CTX *ctx; SSL *ssl; openSslInit(); ctx = SSL_CTX_new(SSLv23_client_method()); fd_set readfds; fd_set writefds; int err; struct timeval tv; /* TODO checking certificates char *certFile = NULL; char *certPath = NULL; if (certFile || certPath) { SSL_CTX_load_verify_locations(ctx,certFile,certPath); #if (OPENSSL_VERSION_NUMBER < 0x0090600fL) SSL_CTX_set_verify_depth(ctx,1); #endif } // verify paths and mode. */ sbio = BIO_new_ssl_connect(ctx); BIO_get_ssl(sbio, &ssl); if(!ssl) { xerr("Can't locate SSL pointer"); goto cleanup; } /* Don't want any retries since we are non-blocking bio now */ //SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY); safef(hostnameProto,sizeof(hostnameProto),"%s:%d",params->hostName,params->port); BIO_set_conn_hostname(sbio, hostnameProto); BIO_set_nbio(sbio, 1); /* non-blocking mode */ while (1) { if (BIO_do_connect(sbio) == 1) { break; /* Connected */ } if (! BIO_should_retry(sbio)) { xerr("BIO_do_connect() failed"); char s[256]; safef(s, sizeof s, "SSL error: %s", ERR_reason_error_string(ERR_get_error())); xerr(s); goto cleanup; } fd = BIO_get_fd(sbio, NULL); if (fd == -1) { xerr("unable to get BIO descriptor"); goto cleanup; } FD_ZERO(&readfds); FD_ZERO(&writefds); if (BIO_should_read(sbio)) { FD_SET(fd, &readfds); } else if (BIO_should_write(sbio)) { FD_SET(fd, &writefds); } else { /* BIO_should_io_special() */ FD_SET(fd, &readfds); FD_SET(fd, &writefds); } tv.tv_sec = (long) (DEFAULTCONNECTTIMEOUTMSEC/1000); // timeout default 10 seconds tv.tv_usec = (long) (((DEFAULTCONNECTTIMEOUTMSEC/1000)-tv.tv_sec)*1000000); err = select(fd + 1, &readfds, &writefds, NULL, &tv); if (err < 0) { xerr("select() error"); goto cleanup; } if (err == 0) { char s[256]; safef(s, sizeof s, "connection timeout to %s", params->hostName); xerr(s); goto cleanup; } } /* TODO checking certificates if (certFile || certPath) if (!check_cert(ssl, host)) return -1; */ /* we need to wait on both the user's socket and the BIO SSL socket * to see if we need to ferry data from one to the other */ char sbuf[32768]; // socket buffer sv[1] to user char bbuf[32768]; // bio buffer int srd = 0; int swt = 0; int brd = 0; int bwt = 0; while (1) { // Do NOT move this outside the while loop. /* Get underlying file descriptor, needed for select call */ fd = BIO_get_fd(sbio, NULL); if (fd == -1) { xerr("BIO doesn't seem to be initialized in https, unable to get descriptor."); goto cleanup; } FD_ZERO(&readfds); FD_ZERO(&writefds); if (brd == 0) FD_SET(fd, &readfds); if (swt < srd) FD_SET(fd, &writefds); if (srd == 0) FD_SET(params->sv[1], &readfds); tv.tv_sec = (long) (DEFAULTCONNECTTIMEOUTMSEC/1000); // timeout default 10 seconds tv.tv_usec = (long) (((DEFAULTCONNECTTIMEOUTMSEC/1000)-tv.tv_sec)*1000000); err = select(max(fd,params->sv[1]) + 1, &readfds, &writefds, NULL, &tv); /* Evaluate select() return code */ if (err < 0) { xerr("error during select()"); goto cleanup; } else if (err == 0) { /* Timed out - just quit */ xerr("https timeout expired"); goto cleanup; } else { if (FD_ISSET(params->sv[1], &readfds)) { swt = 0; srd = read(params->sv[1], sbuf, 32768); if (srd == -1) { if (errno != 104) // udcCache often closes causing "Connection reset by peer" xerrno("error reading https socket"); goto cleanup; } if (srd == 0) break; // user closed socket, we are done } if (FD_ISSET(fd, &writefds)) { int swtx = BIO_write(sbio, sbuf+swt, srd-swt); if (swtx <= 0) { if (!BIO_should_write(sbio)) { ERR_print_errors_fp(stderr); xerr("Error writing SSL connection"); goto cleanup; } } else { swt += swtx; if (swt >= srd) { swt = 0; srd = 0; } } } if (FD_ISSET(fd, &readfds)) { bwt = 0; brd = BIO_read(sbio, bbuf, 32768); if (brd <= 0) { if (BIO_should_read(sbio)) { brd = 0; continue; } else { if (brd == 0) break; ERR_print_errors_fp(stderr); xerr("Error reading SSL connection"); goto cleanup; } } // write the https data received immediately back on socket to user, and it's ok if it blocks. while(bwt < brd) { int bwtx = write(params->sv[1], bbuf+bwt, brd-bwt); if (bwtx == -1) { if ((errno != 104) // udcCache often closes causing "Connection reset by peer" && (errno != 32)) // udcCache often closes causing "Broken pipe" xerrno("error writing https data back to user socket"); goto cleanup; } bwt += bwtx; } brd = 0; bwt = 0; } } } cleanup: BIO_free_all(sbio); close(params->sv[1]); /* we are done with it */ return NULL; } int netConnectHttps(char *hostName, int port) /* Return socket for https connection with server or -1 if error. */ { fflush(stdin); fflush(stdout); fflush(stderr); struct netConnectHttpsParams *params; AllocVar(params); params->hostName = cloneString(hostName); params->port = port; socketpair(AF_UNIX, SOCK_STREAM, 0, params->sv); int rc; rc = pthread_create(¶ms->thread, NULL, netConnectHttpsThread, (void *)params); if (rc) { errAbort("Unexpected error %d from pthread_create(): %s",rc,strerror(rc)); } /* parent */ return params->sv[0]; } #else #include #include "common.h" #include "errAbort.h" int netConnectHttps(char *hostName, int port) /* Start https connection with server or die. */ { errAbort("No openssl available in netConnectHttps for %s : %d", hostName, port); return -1; /* will never get to here, make compiler happy */ } #endif rtracklayer/src/ucsc/https.h0000644000175100017510000000032114614231172017151 0ustar00biocbuildbiocbuild/* Connect via https. */ #ifndef NET_HTTPS_H #define NET_HTTPS_H int netConnectHttps(char *hostName, int port); /* Return socket for https connection with server or -1 if error. */ #endif//ndef NET_HTTPS_H rtracklayer/src/ucsc/internet.c0000644000175100017510000000545314614231172017645 0ustar00biocbuildbiocbuild#ifndef WIN32 /* internet - some stuff to make it easier to use * internet sockets and the like. */ /* Copyright (C) 2011 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "internet.h" boolean internetIsDottedQuad(char *s) /* Returns TRUE if it looks like s is a dotted quad. */ { int i; if (!isdigit(s[0])) return FALSE; for (i=0; i<3; ++i) { s = strchr(s, '.'); if (s == NULL) return FALSE; s += 1; if (!isdigit(s[0])) return FALSE; } return TRUE; } bits32 internetHostIp(char *hostName) /* Get IP v4 address (in host byte order) for hostName. * Warn and return 0 if there's a problem. */ { bits32 ret; if (internetIsDottedQuad(hostName)) { internetDottedQuadToIp(hostName, &ret); } else { /* getaddrinfo is thread-safe and widely supported */ struct addrinfo hints, *res; struct in_addr addr; int err; zeroBytes(&hints, sizeof(hints)); hints.ai_family = AF_INET; if ((err = getaddrinfo(hostName, NULL, &hints, &res)) != 0) { warn("getaddrinfo() error on hostName=%s: %s\n", hostName, gai_strerror(err)); return 0; } addr = ((struct sockaddr_in *)(res->ai_addr))->sin_addr; ret = ntohl((uint32_t)addr.s_addr); freeaddrinfo(res); } return ret; } boolean internetFillInAddress(char *hostName, int port, struct sockaddr_in *address) /* Fill in address. Return FALSE if can't. */ { ZeroVar(address); address->sin_family = AF_INET; address->sin_port = htons(port); if (hostName == NULL) address->sin_addr.s_addr = INADDR_ANY; else { if ((address->sin_addr.s_addr = htonl(internetHostIp(hostName))) == 0) return FALSE; } return TRUE; } boolean internetDottedQuadToIp(char *dottedQuad, bits32 *retIp) /* Convert dotted quad format address to IP4 address in * host byte order. Warn and return FALSE if there's a * problem. */ { #ifndef __CYGWIN32__ struct in_addr ia; if (inet_pton(AF_INET, dottedQuad, &ia) < 0) { warn("internetDottedQuadToIp problem on %s: %s", dottedQuad, strerror(errno)); return FALSE; } *retIp = ntohl(ia.s_addr); return TRUE; #else warn("Sorry, internetDottedQuadToIp not supported in Windows."); return FALSE; #endif } void internetUnpackIp(bits32 packed, unsigned char unpacked[4]) /* Convert from 32 bit to 4-byte format with most significant * byte first. */ { int i; for (i=3; i>=0; --i) { unpacked[i] = (packed&0xff); packed >>= 8; } } boolean internetIpInSubnet(unsigned char unpackedIp[4], unsigned char subnet[4]) /* Return true if unpacked IP address is in subnet. */ { int i; for (i=0; i<4; ++i) { unsigned char c = subnet[i]; if (c == 255) return TRUE; if (c != unpackedIp[i]) return FALSE; } return TRUE; } #endif rtracklayer/src/ucsc/internet.h0000644000175100017510000000224714614231172017650 0ustar00biocbuildbiocbuild/* internet - some stuff for routines that use the internet * and aren't afraid to include some internet specific structures * and the like. See also net for stuff that is higher level. */ #ifndef INTERNET_H #include #include #include #include bits32 internetHostIp(char *hostName); /* Get IP v4 address (in host byte order) for hostName. * Warn and return 0 if there's a problem. */ boolean internetFillInAddress(char *hostName, int port, struct sockaddr_in *address); /* Fill in address. Warn and return FALSE if can't. */ boolean internetDottedQuadToIp(char *dottedQuad, bits32 *retIp); /* Convert dotted quad format address to IP4 address in * host byte order. Warn and return FALSE if there's a * problem. */ boolean internetIsDottedQuad(char *s); /* Returns TRUE if it looks like s is a dotted quad. */ void internetUnpackIp(bits32 packed, unsigned char unpacked[4]); /* Convert from 32 bit to 4-byte format with most significant * byte first. */ boolean internetIpInSubnet(unsigned char unpackedIp[4], unsigned char subnet[4]); /* Return true if unpacked IP address is in subnet. */ #endif /* INTERNET_H */ rtracklayer/src/ucsc/linefile.c0000644000175100017510000007462614614231172017614 0ustar00biocbuildbiocbuild/* lineFile - stuff to rapidly read text files and parse them into * lines. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "hash.h" #include #include #include "dystring.h" #include "errAbort.h" #include "linefile.h" #include "pipeline.h" #include "localmem.h" #include "cheapcgi.h" #include "udc.h" char *getFileNameFromHdrSig(char *m) /* Check if header has signature of supported compression stream, and return a phoney filename for it, or NULL if no sig found. */ { char buf[20]; char *ext=NULL; if (startsWith("\x1f\x8b",m)) ext = "gz"; else if (startsWith("\x1f\x9d\x90",m)) ext = "Z"; else if (startsWith("BZ",m)) ext = "bz2"; else if (startsWith("PK\x03\x04",m)) ext = "zip"; if (ext==NULL) return NULL; safef(buf, sizeof(buf), LF_BOGUS_FILE_PREFIX "%s", ext); return cloneString(buf); } static char **getDecompressor(char *fileName) /* if a file is compressed, return the command to decompress the * approriate format, otherwise return NULL */ { static char *GZ_READ[] = {"gzip", "-dc", NULL}; static char *Z_READ[] = {"gzip", "-dc", NULL}; static char *BZ2_READ[] = {"bzip2", "-dc", NULL}; static char *ZIP_READ[] = {"gzip", "-dc", NULL}; char **result = NULL; char *fileNameDecoded = cloneString(fileName); if (startsWith("http://" , fileName) || startsWith("https://", fileName) || startsWith("ftp://", fileName)) cgiDecode(fileName, fileNameDecoded, strlen(fileName)); if (endsWith(fileNameDecoded, ".gz")) result = GZ_READ; else if (endsWith(fileNameDecoded, ".Z")) result = Z_READ; else if (endsWith(fileNameDecoded, ".bz2")) result = BZ2_READ; else if (endsWith(fileNameDecoded, ".zip")) result = ZIP_READ; freeMem(fileNameDecoded); return result; } static void metaDataAdd(struct lineFile *lf, char *line) /* write a line of metaData to output file * internal function called by lineFileNext */ { struct metaOutput *meta = NULL; if (lf->isMetaUnique) { /* suppress repetition of comments */ if (hashLookup(lf->metaLines, line)) { return; } hashAdd(lf->metaLines, line, NULL); } for (meta = lf->metaOutput ; meta != NULL ; meta = meta->next) if (line != NULL && meta->metaFile != NULL) fprintf(meta->metaFile,"%s\n", line); } static void metaDataFree(struct lineFile *lf) /* free saved comments */ { if (lf->isMetaUnique && lf->metaLines) freeHash(&lf->metaLines); } static char * headerBytes(char *fileName, int numbytes) /* Return specified number of header bytes from file * if file exists as a string which should be freed. */ { int fd,bytesread=0; char *result = NULL; if ((fd = open(fileName, O_RDONLY)) >= 0) { result=needMem(numbytes+1); if ((bytesread=read(fd,result,numbytes)) < numbytes) freez(&result); /* file too short? can read numbytes */ else result[numbytes]=0; close(fd); } return result; } #ifndef WIN32 struct lineFile *lineFileDecompress(char *fileName, bool zTerm) /* open a linefile with decompression */ { struct pipeline *pl; struct lineFile *lf; char *testName = NULL; char *testbytes = NULL; /* the header signatures for .gz, .bz2, .Z, * .zip are all 2-4 bytes only */ if (fileName==NULL) return NULL; testbytes=headerBytes(fileName,4); if (!testbytes) return NULL; /* avoid error from pipeline */ testName=getFileNameFromHdrSig(testbytes); freez(&testbytes); if (!testName) return NULL; /* avoid error from pipeline */ pl = pipelineOpen1(getDecompressor(fileName), pipelineRead|pipelineSigpipe, fileName, NULL); lf = lineFileAttach(fileName, zTerm, pipelineFd(pl)); lf->pl = pl; return lf; } struct lineFile *lineFileDecompressFd(char *name, bool zTerm, int fd) /* open a linefile with decompression from a file or socket descriptor */ { struct pipeline *pl; struct lineFile *lf; pl = pipelineOpenFd1(getDecompressor(name), pipelineRead|pipelineSigpipe, fd, STDERR_FILENO); lf = lineFileAttach(name, zTerm, pipelineFd(pl)); lf->pl = pl; return lf; } #endif struct lineFile *lineFileAttach(char *fileName, bool zTerm, int fd) /* Wrap a line file around an open'd file. */ { struct lineFile *lf; AllocVar(lf); lf->fileName = cloneString(fileName); lf->fd = fd; lf->bufSize = 64*1024; lf->zTerm = zTerm; lf->buf = needMem(lf->bufSize+1); return lf; } struct lineFile *lineFileOnString(char *name, bool zTerm, char *s) /* Wrap a line file object around string in memory. This buffer * have zeroes written into it and be freed when the line file * is closed. */ { struct lineFile *lf; AllocVar(lf); lf->fileName = cloneString(name); lf->fd = -1; lf->bufSize = lf->bytesInBuf = strlen(s); lf->zTerm = zTerm; lf->buf = s; return lf; } #if (defined USE_TABIX && defined KNETFILE_HOOKS && !defined USE_SAMTABIX) // UCSC aliases for backwards compatibility with independently patched & linked samtools and tabix: #define bgzf_tell ti_bgzf_tell #define bgzf_read ti_bgzf_read #endif void lineFileExpandBuf(struct lineFile *lf, int newSize) /* Expand line file buffer. */ { assert(newSize > lf->bufSize); lf->buf = needMoreMem(lf->buf, lf->bytesInBuf, newSize); lf->bufSize = newSize; } struct lineFile *lineFileStdin(bool zTerm) /* Wrap a line file around stdin. */ { return lineFileAttach("stdin", zTerm, fileno(stdin)); } struct lineFile *lineFileMayOpen(char *fileName, bool zTerm) /* Try and open up a lineFile. */ { if (sameString(fileName, "stdin")) return lineFileStdin(zTerm); #ifndef WIN32 else if (getDecompressor(fileName) != NULL) return lineFileDecompress(fileName, zTerm); #endif else { int fd = open(fileName, O_RDONLY); if (fd == -1) return NULL; return lineFileAttach(fileName, zTerm, fd); } } struct lineFile *lineFileOpen(char *fileName, bool zTerm) /* Open up a lineFile or die trying. */ { struct lineFile *lf = lineFileMayOpen(fileName, zTerm); if (lf == NULL) errAbort("Couldn't open %s , %s", fileName, strerror(errno)); return lf; } void lineFileReuse(struct lineFile *lf) /* Reuse current line. */ { lf->reuse = TRUE; } INLINE void noTabixSupport(struct lineFile *lf, char *where) { #ifdef USE_TABIX if (lf->tabix != NULL) lineFileAbort(lf, "%s: not implemented for lineFile opened with lineFileTabixMayOpen.", where); #endif // USE_TABIX } void lineFileSeek(struct lineFile *lf, off_t offset, int whence) /* Seek to read next line from given position. */ { noTabixSupport(lf, "lineFileSeek"); if (lf->checkSupport) lf->checkSupport(lf, "lineFileSeek"); if (lf->pl != NULL) errnoAbort("Can't lineFileSeek on a compressed file: %s", lf->fileName); lf->reuse = FALSE; if (lf->udcFile) { udcSeek(lf->udcFile, offset); return; } lf->lineStart = lf->lineEnd = lf->bytesInBuf = 0; if ((lf->bufOffsetInFile = lseek(lf->fd, offset, whence)) == -1) errnoAbort("Couldn't lineFileSeek %s", lf->fileName); } int lineFileLongNetRead(int fd, char *buf, int size) /* Keep reading until either get no new characters or * have read size */ { int oneSize, totalRead = 0; while (size > 0) { oneSize = read(fd, buf, size); if (oneSize <= 0) break; totalRead += oneSize; buf += oneSize; size -= oneSize; } return totalRead; } static void determineNlType(struct lineFile *lf, char *buf, int bufSize) /* determine type of newline used for the file, assumes buffer not empty */ { char *c = buf; if (bufSize==0) return; if (lf->nlType != nlt_undet) return; /* if already determined just exit */ lf->nlType = nlt_unix; /* start with default of unix lf type */ while (c < buf+bufSize) { if (*c=='\r') { lf->nlType = nlt_mac; if (++c < buf+bufSize) if (*c == '\n') lf->nlType = nlt_dos; return; } if (*(c++) == '\n') { return; } } } boolean lineFileNext(struct lineFile *lf, char **retStart, int *retSize) /* Fetch next line from file. */ { char *buf = lf->buf; int bytesInBuf = lf->bytesInBuf; int endIx = lf->lineEnd; boolean gotLf = FALSE; int newStart; if (lf->reuse) { lf->reuse = FALSE; if (retSize != NULL) *retSize = lf->lineEnd - lf->lineStart; *retStart = buf + lf->lineStart; if (lf->metaOutput && *retStart[0] == '#') metaDataAdd(lf, *retStart); return TRUE; } if (lf->nextCallBack) return lf->nextCallBack(lf, retStart, retSize); if (lf->udcFile) { lf->bufOffsetInFile = udcTell(lf->udcFile); char *line = udcReadLine(lf->udcFile); if (line==NULL) return FALSE; int lineSize = strlen(line); lf->bytesInBuf = lineSize; lf->lineIx = -1; lf->lineStart = 0; lf->lineEnd = lineSize; *retStart = line; freeMem(lf->buf); lf->buf = line; lf->bufSize = lineSize; return TRUE; } #ifdef USE_TABIX if (lf->tabix != NULL && lf->tabixIter != NULL) { // Just use line-oriented ti_read: int lineSize = 0; const char *line = ti_read(lf->tabix, lf->tabixIter, &lineSize); if (line == NULL) return FALSE; lf->bufOffsetInFile = -1; lf->bytesInBuf = lineSize; lf->lineIx = -1; lf->lineStart = 0; lf->lineEnd = lineSize; if (lineSize > lf->bufSize) // shouldn't be! but just in case: lineFileExpandBuf(lf, lineSize * 2); safecpy(lf->buf, lf->bufSize, line); *retStart = lf->buf; if (retSize != NULL) *retSize = lineSize; return TRUE; } #endif // USE_TABIX determineNlType(lf, buf+endIx, bytesInBuf); /* Find next end of line in buffer. */ switch(lf->nlType) { case nlt_unix: case nlt_dos: for (endIx = lf->lineEnd; endIx < bytesInBuf; ++endIx) { if (buf[endIx] == '\n') { gotLf = TRUE; endIx += 1; break; } } break; case nlt_mac: for (endIx = lf->lineEnd; endIx < bytesInBuf; ++endIx) { if (buf[endIx] == '\r') { gotLf = TRUE; endIx += 1; break; } } break; case nlt_undet: break; } /* If not in buffer read in a new buffer's worth. */ while (!gotLf) { int oldEnd = lf->lineEnd; int sizeLeft = bytesInBuf - oldEnd; int bufSize = lf->bufSize; int readSize = bufSize - sizeLeft; if (oldEnd > 0 && sizeLeft > 0) { memmove(buf, buf+oldEnd, sizeLeft); } lf->bufOffsetInFile += oldEnd; if (lf->fd >= 0) readSize = lineFileLongNetRead(lf->fd, buf+sizeLeft, readSize); #ifdef USE_TABIX else if (lf->tabix != NULL && readSize > 0) { readSize = bgzf_read(lf->tabix->fp, buf+sizeLeft, readSize); if (readSize < 1) return FALSE; } #endif // USE_TABIX else readSize = 0; if ((readSize == 0) && (endIx > oldEnd)) { endIx = sizeLeft; buf[endIx] = 0; lf->bytesInBuf = newStart = lf->lineStart = 0; lf->lineEnd = endIx; ++lf->lineIx; if (retSize != NULL) *retSize = endIx - newStart; *retStart = buf + newStart; if (*retStart[0] == '#') metaDataAdd(lf, *retStart); return TRUE; } else if (readSize <= 0) { lf->bytesInBuf = lf->lineStart = lf->lineEnd = 0; return FALSE; } bytesInBuf = lf->bytesInBuf = readSize + sizeLeft; lf->lineEnd = 0; determineNlType(lf, buf+endIx, bytesInBuf); /* Look for next end of line. */ switch(lf->nlType) { case nlt_unix: case nlt_dos: for (endIx = sizeLeft; endIx bufSize) { if (bufSize >= 512*1024*1024) { errAbort("Line too long (more than %d chars) line %d of %s", lf->bufSize, lf->lineIx+1, lf->fileName); } else { lineFileExpandBuf(lf, bufSize*2); buf = lf->buf; } } } if (lf->zTerm) { buf[endIx-1] = 0; if ((lf->nlType == nlt_dos) && (buf[endIx-2]=='\r')) { buf[endIx-2] = 0; } } lf->lineStart = newStart = lf->lineEnd; lf->lineEnd = endIx; ++lf->lineIx; if (retSize != NULL) *retSize = endIx - newStart; *retStart = buf + newStart; if (*retStart[0] == '#') metaDataAdd(lf, *retStart); return TRUE; } void lineFileVaAbort(struct lineFile *lf, char *format, va_list args) /* Print file name, line number, and error message, and abort. */ { struct dyString *dy = dyStringNew(0); dyStringPrintf(dy, "Error line %d of %s: ", lf->lineIx, lf->fileName); dyStringVaPrintf(dy, format, args); errAbort("%s", dy->string); dyStringFree(&dy); } void lineFileAbort(struct lineFile *lf, char *format, ...) /* Print file name, line number, and error message, and abort. */ { va_list args; va_start(args, format); lineFileVaAbort(lf, format, args); va_end(args); } void lineFileUnexpectedEnd(struct lineFile *lf) /* Complain about unexpected end of file. */ { errAbort("Unexpected end of file in %s", lf->fileName); } void lineFileClose(struct lineFile **pLf) /* Close up a line file. */ { struct lineFile *lf; if ((lf = *pLf) != NULL) { #ifndef WIN32 struct pipeline *pl = lf->pl; if (pl != NULL) { pipelineWait(pl); pipelineFree(&lf->pl); } else #endif if (lf->fd > 0 && lf->fd != fileno(stdin)) { close(lf->fd); freeMem(lf->buf); } #ifdef USE_TABIX else if (lf->tabix != NULL) { if (lf->tabixIter != NULL) ti_iter_destroy(lf->tabixIter); ti_close(lf->tabix); } #endif // USE_TABIX else if (lf->udcFile != NULL) udcFileClose(&lf->udcFile); if (lf->closeCallBack) lf->closeCallBack(lf); freeMem(lf->fileName); metaDataFree(lf); freez(pLf); } } void lineFileExpectWords(struct lineFile *lf, int expecting, int got) /* Check line has right number of words. */ { if (expecting != got) errAbort("Expecting %d words line %d of %s got %d", expecting, lf->lineIx, lf->fileName, got); } void lineFileExpectAtLeast(struct lineFile *lf, int expecting, int got) /* Check line has right number of words. */ { if (got < expecting) errAbort("Expecting at least %d words line %d of %s got %d", expecting, lf->lineIx, lf->fileName, got); } boolean lineFileNextFull(struct lineFile *lf, char **retFull, int *retFullSize, char **retRaw, int *retRawSize) // Fetch next line from file joining up any that are continued by ending '\' // If requested, and was joined, the unjoined raw lines are also returned // NOTE: comment lines can't be continued! ("# comment \ \n more comment" is 2 lines.) { // May have requested reusing the last full line. if (lf->fullLineReuse) { lf->fullLineReuse = FALSE; assert(lf->fullLine != NULL); *retFull = dyStringContents(lf->fullLine); if (retFullSize) *retFullSize = dyStringLen(lf->fullLine); if (retRaw != NULL) { assert(lf->rawLines != NULL); *retRaw = dyStringContents(lf->rawLines); if (retRawSize) *retRawSize = dyStringLen(lf->rawLines); } return TRUE; } // Empty pointers *retFull = NULL; if (retRaw != NULL) *retRaw = NULL; // Prepare lf buffers if (lf->fullLine == NULL) { lf->fullLine = dyStringNew(1024); lf->rawLines = dyStringNew(1024); // Better to always create it than test every time } else { dyStringClear(lf->fullLine); dyStringClear(lf->rawLines); } char *line; while (lineFileNext(lf, &line, NULL)) { char *start = skipLeadingSpaces(line); // Will the next line continue this one? char *end = start; if (*start == '#') // Comment lines can't be continued! end = start + strlen(start); else { while (*end != '\0') // walking forward for efficiency (avoid strlens()) { for (;*end != '\0' && *end != '\\'; end++) ; // Tight loop to find '\' if (*end == '\0') break; // This could be a continuation char *slash = end; if (*(++end) == '\\') // escaped continue; end = skipLeadingSpaces(end); if (*end == '\0') // Just whitespace after '\', so true continuation mark { if (retRaw != NULL) // Only if actually requested. { dyStringAppendN(lf->rawLines,line,(end - line)); dyStringAppendC(lf->rawLines,'\n'); // New lines delimit raw lines. } end = slash; // Don't need to zero, because of appending by length break; } } } // Stitch together full lines if (dyStringLen(lf->fullLine) == 0) dyStringAppendN(lf->fullLine,line,(end - line)); // includes first line's whitespace else if (start < end) // don't include continued line's leading spaces dyStringAppendN(lf->fullLine,start,(end - start)); if (*end == '\\') continue; // Got a full line now! *retFull = dyStringContents(lf->fullLine); if (retFullSize) *retFullSize = dyStringLen(lf->fullLine); if (retRaw != NULL && dyStringLen(lf->rawLines) > 0) // Only if actually requested & continued { // This is the final line which doesn't have a continuation char dyStringAppendN(lf->rawLines,line,(end - line)); *retRaw = dyStringContents(lf->rawLines); if (retRawSize) *retRawSize = dyStringLen(lf->rawLines); } return TRUE; } return FALSE; } boolean lineFileNextReal(struct lineFile *lf, char **retStart) /* Fetch next line from file that is not blank and * * does not start with a '#'. */ { char *s, c; while (lineFileNext(lf, retStart, NULL)) { s = skipLeadingSpaces(*retStart); c = s[0]; if (c != 0 && c != '#') return TRUE; } return FALSE; } int lineFileChopNext(struct lineFile *lf, char *words[], int maxWords) /* Return next non-blank line that doesn't start with '#' chopped into words. */ { int lineSize, wordCount; char *line; while (lineFileNext(lf, &line, &lineSize)) { if (line[0] == '#') continue; wordCount = chopByWhite(line, words, maxWords); if (wordCount != 0) return wordCount; } return 0; } int lineFileChopCharNext(struct lineFile *lf, char sep, char *words[], int maxWords) /* Return next non-blank line that doesn't start with '#' chopped into words delimited by sep. */ { int lineSize, wordCount; char *line; while (lineFileNext(lf, &line, &lineSize)) { if (line[0] == '#') continue; wordCount = chopByChar(line, sep, words, maxWords); if (wordCount != 0) return wordCount; } return 0; } int lineFileChopNextTab(struct lineFile *lf, char *words[], int maxWords) /* Return next non-blank line that doesn't start with '#' chopped into words * on tabs */ { int lineSize, wordCount; char *line; while (lineFileNext(lf, &line, &lineSize)) { if (line[0] == '#') continue; wordCount = chopByChar(line, '\t', words, maxWords); if (wordCount != 0) return wordCount; } return 0; } boolean lineFileNextRow(struct lineFile *lf, char *words[], int wordCount) /* Return next non-blank line that doesn't start with '#' chopped into words. * Returns FALSE at EOF. Aborts on error. */ { int wordsRead; wordsRead = lineFileChopNext(lf, words, wordCount); if (wordsRead == 0) return FALSE; if (wordsRead < wordCount) lineFileExpectWords(lf, wordCount, wordsRead); return TRUE; } int lineFileNeedNum(struct lineFile *lf, char *words[], int wordIx) /* Make sure that words[wordIx] is an ascii integer, and return * binary representation of it. Conversion stops at first non-digit char. */ { char *ascii = words[wordIx]; char c = ascii[0]; if (c != '-' && !isdigit(c)) errAbort("Expecting number field %d line %d of %s, got %s", wordIx+1, lf->lineIx, lf->fileName, ascii); return atoi(ascii); } int lineFileCheckAllIntsNoAbort(char *s, void *val, boolean isSigned, int byteCount, char *typeString, boolean noNeg, char *errMsg, int errMsgSize) /* Convert string to (signed) integer of the size specified. * Unlike atol assumes all of string is number, no trailing trash allowed. * Returns 0 if conversion possible, and value is returned in 'val' * Otherwise 1 for empty string or trailing chars, and 2 for numeric overflow, * and 3 for (-) sign in unsigned number. * Error messages if any are written into the provided buffer. * Pass NULL val if you only want validation. * Use noNeg if negative values are not allowed despite the type being signed, * returns 4. */ { unsigned long long res = 0, oldRes = 0; boolean isMinus = FALSE; if ((byteCount != 1) && (byteCount != 2) && (byteCount != 4) && (byteCount != 8)) errAbort("Unexpected error: Invalid byte count for integer size in lineFileCheckAllIntsNoAbort, expected 1 2 4 or 8, got %d.", byteCount); unsigned long long limit = 0xFFFFFFFFFFFFFFFFULL >> (8*(8-byteCount)); if (isSigned) limit >>= 1; char *p, *p0 = s; if (*p0 == '-') { if (isSigned) { if (noNeg) { safef(errMsg, errMsgSize, "Negative value not allowed"); return 4; } p0++; ++limit; isMinus = TRUE; } else { safef(errMsg, errMsgSize, "Unsigned %s may not begin with minus sign (-)", typeString); return 3; } } p = p0; while ((*p >= '0') && (*p <= '9')) { res *= 10; if (res < oldRes) { safef(errMsg, errMsgSize, "%s%s overflowed", isSigned ? "signed ":"", typeString); return 2; } oldRes = res; res += *p - '0'; if (res < oldRes) { safef(errMsg, errMsgSize, "%s%s overflowed", isSigned ? "signed ":"", typeString); return 2; } if (res > limit) { safef(errMsg, errMsgSize, "%s%s overflowed, limit=%s%llu", isSigned ? "signed ":"", typeString, isMinus ? "-" : "", limit); return 2; } oldRes = res; p++; } /* test for invalid character, empty, or just a minus */ if (*p != '\0') { safef(errMsg, errMsgSize, "Trailing characters parsing %s%s", isSigned ? "signed ":"", typeString); return 1; } if (p == p0) { safef(errMsg, errMsgSize, "Empty string parsing %s%s", isSigned ? "signed ":"", typeString); return 1; } if (!val) return 0; // only validation required switch (byteCount) { case 1: if (isSigned) { if (isMinus) *(char *)val = -res; else *(char *)val = res; } else *(unsigned char *)val = res; break; case 2: if (isSigned) { if (isMinus) *(short *)val = -res; else *(short *)val = res; } else *(unsigned short *)val = res; break; case 4: if (isSigned) { if (isMinus) *(int *)val = -res; else *(int *)val = res; } else *(unsigned *)val = res; break; case 8: if (isSigned) { if (isMinus) *(long long *)val = -res; else *(long long *) val =res; } else *(unsigned long long *)val = res; break; } return 0; } void lineFileAllInts(struct lineFile *lf, char *words[], int wordIx, void *val, boolean isSigned, int byteCount, char *typeString, boolean noNeg) /* Returns long long integer from converting the input string. Aborts on error. */ { char *s = words[wordIx]; char errMsg[256]; int res = lineFileCheckAllIntsNoAbort(s, val, isSigned, byteCount, typeString, noNeg, errMsg, sizeof errMsg); if (res > 0) { errAbort("%s in field %d line %d of %s, got %s", errMsg, wordIx+1, lf->lineIx, lf->fileName, s); } } int lineFileAllIntsArray(struct lineFile *lf, char *words[], int wordIx, void *array, int arraySize, boolean isSigned, int byteCount, char *typeString, boolean noNeg) /* Convert comma separated list of numbers to an array. Pass in * array and max size of array. Aborts on error. Returns number of elements in parsed array. */ { char *s = words[wordIx]; char errMsg[256]; unsigned count = 0; char *cArray = array; for (;;) { char *e; if (s == NULL || s[0] == 0 || count == arraySize) break; e = strchr(s, ','); if (e) *e = 0; int res = lineFileCheckAllIntsNoAbort(s, cArray, isSigned, byteCount, typeString, noNeg, errMsg, sizeof errMsg); if (res > 0) { errAbort("%s in column %d of array field %d line %d of %s, got %s", errMsg, count, wordIx+1, lf->lineIx, lf->fileName, s); } if (cArray) // NULL means validation only. cArray += byteCount; count++; if (e) // restore input string *e++ = ','; s = e; } return count; } double lineFileNeedDouble(struct lineFile *lf, char *words[], int wordIx) /* Make sure that words[wordIx] is an ascii double value, and return * binary representation of it. */ { char *valEnd; char *val = words[wordIx]; double doubleValue; doubleValue = strtod(val, &valEnd); if ((*val == '\0') || (*valEnd != '\0')) errAbort("Expecting double field %d line %d of %s, got %s", wordIx+1, lf->lineIx, lf->fileName, val); return doubleValue; } char *lineFileReadAll(struct lineFile *lf) /* Read remainder of lineFile and return it as a string. */ { struct dyString *dy = dyStringNew(1024*4); lf->zTerm = 0; int size; char *line; while (lineFileNext(lf, &line, &size)) dyStringAppendN(dy, line, size); return dyStringCannibalize(&dy); } boolean lineFileParseHttpHeader(struct lineFile *lf, char **hdr, boolean *chunked, int *contentLength) /* Extract HTTP response header from lf into hdr, tell if it's * "Transfer-Encoding: chunked" or if it has a contentLength. */ { struct dyString *header = newDyString(1024); char *line; int lineSize; if (chunked != NULL) *chunked = FALSE; if (contentLength != NULL) *contentLength = -1; dyStringClear(header); if (lineFileNext(lf, &line, &lineSize)) { if (startsWith("HTTP/", line)) { char *version, *code; dyStringAppendN(header, line, lineSize-1); dyStringAppendC(header, '\n'); version = nextWord(&line); code = nextWord(&line); if (code == NULL) { warn("%s: Expecting HTTP/ header line, got this: %s\n", lf->fileName, header->string); *hdr = cloneString(header->string); dyStringFree(&header); return FALSE; } if (!sameString(code, "200")) { warn("%s: Errored HTTP response header: %s %s %s\n", lf->fileName, version, code, line); *hdr = cloneString(header->string); dyStringFree(&header); return FALSE; } while (lineFileNext(lf, &line, &lineSize)) { /* blank line means end of HTTP header */ if ((line[0] == '\r' && line[1] == 0) || line[0] == 0) break; if (strstr(line, "Transfer-Encoding: chunked") && chunked != NULL) *chunked = TRUE; dyStringAppendN(header, line, lineSize-1); dyStringAppendC(header, '\n'); if (strstr(line, "Content-Length:")) { code = nextWord(&line); code = nextWord(&line); if (contentLength != NULL) *contentLength = atoi(code); } } } else { /* put the line back, don't put it in header/hdr */ lineFileReuse(lf); warn("%s: Expecting HTTP/ header line, got this: %s\n", lf->fileName, header->string); *hdr = cloneString(header->string); dyStringFree(&header); return FALSE; } } else { *hdr = cloneString(header->string); dyStringFree(&header); return FALSE; } *hdr = cloneString(header->string); dyStringFree(&header); return TRUE; } /* lineFileParseHttpHeader */ struct dyString *lineFileSlurpHttpBody(struct lineFile *lf, boolean chunked, int contentLength) /* Return a dyString that contains the http response body in lf. Handle * chunk-encoding and content-length. */ { struct dyString *body = newDyString(64*1024); char *line; int lineSize; dyStringClear(body); if (chunked) { /* Handle "Transfer-Encoding: chunked" body */ /* Procedure from RFC2068 section 19.4.6 */ char *csword; unsigned chunkSize = 0; unsigned size; do { /* Read line that has chunk size (in hex) as first word. */ if (lineFileNext(lf, &line, NULL)) csword = nextWord(&line); else break; if (sscanf(csword, "%x", &chunkSize) < 1) { warn("%s: chunked transfer-encoding chunk size parse error.\n", lf->fileName); break; } /* If chunk size is 0, read in a blank line & then we're done. */ if (chunkSize == 0) { lineFileNext(lf, &line, NULL); if (line == NULL || (line[0] != '\r' && line[0] != 0)) warn("%s: chunked transfer-encoding: expected blank line, got %s\n", lf->fileName, line); break; } /* Read (and save) lines until we have read in chunk. */ for (size = 0; size < chunkSize; size += lineSize) { if (! lineFileNext(lf, &line, &lineSize)) break; dyStringAppendN(body, line, lineSize-1); dyStringAppendC(body, '\n'); } /* Read blank line - or extra CRLF inserted in the middle of the * current line, in which case we need to trim it. */ if (size > chunkSize) { body->stringSize -= (size - chunkSize); body->string[body->stringSize] = 0; } else if (size == chunkSize) { lineFileNext(lf, &line, NULL); if (line == NULL || (line[0] != '\r' && line[0] != 0)) warn("%s: chunked transfer-encoding: expected blank line, got %s\n", lf->fileName, line); } } while (chunkSize > 0); /* Try to read in next line. If it's an HTTP header, put it back. */ /* If there is a next line but it's not an HTTP header, it's a footer. */ if (lineFileNext(lf, &line, NULL)) { if (startsWith("HTTP/", line)) lineFileReuse(lf); else { /* Got a footer -- keep reading until blank line */ warn("%s: chunked transfer-encoding: got footer %s, discarding it.\n", lf->fileName, line); while (lineFileNext(lf, &line, NULL)) { if ((line[0] == '\r' && line[1] == 0) || line[0] == 0) break; warn("discarding footer line: %s\n", line); } } } } else if (contentLength >= 0) { /* Read in known length */ int size; for (size = 0; size < contentLength; size += lineSize) { if (! lineFileNext(lf, &line, &lineSize)) break; dyStringAppendN(body, line, lineSize-1); dyStringAppendC(body, '\n'); } } else { /* Read in to end of file (assume it's not a persistent connection) */ while (lineFileNext(lf, &line, &lineSize)) { dyStringAppendN(body, line, lineSize-1); dyStringAppendC(body, '\n'); } } return(body); } /* lineFileSlurpHttpBody */ void lineFileRemoveInitialCustomTrackLines(struct lineFile *lf) /* remove initial browser and track lines */ { char *line; while (lineFileNextReal(lf, &line)) { if (!(startsWith("browser", line) || startsWith("track", line) )) { verbose(2, "found line not browser or track: %s\n", line); lineFileReuse(lf); break; } verbose(2, "skipping %s\n", line); } } rtracklayer/src/ucsc/linefile.h0000644000175100017510000002270314614231172017606 0ustar00biocbuildbiocbuild/* lineFile - stuff to rapidly read text files and parse them into * lines. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef LINEFILE_H #define LINEFILE_H #include "dystring.h" #include "udc.h" #ifdef USE_TABIX #include "tabix.h" #endif #define LF_BOGUS_FILE_PREFIX "somefile." enum nlType { nlt_undet, /* undetermined */ nlt_unix, /* lf */ nlt_dos, /* crlf */ nlt_mac /* cr */ }; struct metaOutput /* struct to store list of file handles to output meta data to * meta data is text after # */ { struct metaOutput *next; /* next file handle */ FILE *metaFile; /* file to write metadata to */ }; struct lineFile /* Structure to handle fast, line oriented * fileIo. */ { struct lineFile *next; /* Might need to be on a list. */ char *fileName; /* Name of file. */ int fd; /* File handle. -1 for 'memory' files. */ int bufSize; /* Size of buffer. */ off_t bufOffsetInFile; /* Offset in file of first buffer byte. */ int bytesInBuf; /* Bytes read into buffer. */ int reserved; /* Reserved (zero for now). */ int lineIx; /* Current line. */ int lineStart; /* Offset of line in buffer. */ int lineEnd; /* End of line in buffer. */ bool zTerm; /* Replace '\n' with zero? */ enum nlType nlType; /* type of line endings: dos, unix, mac or undet */ bool reuse; /* Set if reusing input. */ char *buf; /* Buffer. */ struct pipeline *pl; /* pipeline if reading compressed */ struct metaOutput *metaOutput; /* list of FILE handles to write metaData to */ bool isMetaUnique; /* if set, do not repeat comments in output */ struct hash *metaLines; /* save lines to suppress repetition */ #ifdef USE_TABIX tabix_t *tabix; /* A tabix-compressed file and its binary index file (.tbi) */ ti_iter_t tabixIter; /* An iterator to get decompressed indexed lines of text */ #endif struct udcFile *udcFile; /* udc file if using caching */ struct dyString *fullLine; // Filled with full line when a lineFileNextFull is called struct dyString *rawLines; // Filled with raw lines used to create the full line boolean fullLineReuse; // If TRUE, next call to lineFileNextFull will get // already built fullLine void *dataForCallBack; // ptr to data needed for callbacks void(*checkSupport)(struct lineFile *lf, char *where); // check if operation supported boolean(*nextCallBack)(struct lineFile *lf, char **retStart, int *retSize); // next line callback void(*closeCallBack)(struct lineFile *lf); // close callback }; char *getFileNameFromHdrSig(char *m); /* Check if header has signature of supported compression stream, and return a phoney filename for it, or NULL if no sig found. */ struct lineFile *lineFileDecompressFd(char *name, bool zTerm, int fd); /* open a linefile with decompression from a file or socket descriptor */ struct lineFile *lineFileMayOpen(char *fileName, bool zTerm); /* Try and open up a lineFile. If fileName ends in .gz, .Z, or .bz2, * it will be read from a decompress pipeline. */ struct lineFile *lineFileOpen(char *fileName, bool zTerm); /* Open up a lineFile or die trying If fileName ends in .gz, .Z, or .bz2, * it will be read from a decompress pipeline.. */ struct lineFile *lineFileAttach(char *fileName, bool zTerm, int fd); /* Wrap a line file around an open'd file. */ struct lineFile *lineFileStdin(bool zTerm); /* Wrap a line file around stdin. */ struct lineFile *lineFileOnString(char *name, bool zTerm, char *s); /* Wrap a line file object around string in memory. This buffer * have zeroes written into it if zTerm is non-zero. It will * be freed when the line file is closed. */ struct lineFile *lineFileOnBigBed(char *bigBedFileName); /* Wrap a line file object around a BigBed. */ void lineFileClose(struct lineFile **pLf); /* Close up a line file. */ boolean lineFileNext(struct lineFile *lf, char **retStart, int *retSize); /* Fetch next line from file. */ boolean lineFileNextFull(struct lineFile *lf, char **retFull, int *retFullSize, char **retRaw, int *retRawSize); // Fetch next line from file joining up any that are continued by ending '\' // If requested, and was joined, the unjoined raw lines are also returned // NOTE: comment lines can't be continued! ("# comment \ \n more comment" is 2 lines.) boolean lineFileNextReal(struct lineFile *lf, char **retStart); /* Fetch next line from file that is not blank and * does not start with a '#'. */ void lineFileReuse(struct lineFile *lf); /* Reuse current line. */ #define lineFileString(lf) ((lf)->buf + (lf)->lineStart) /* Current string in line file. */ #define lineFileTell(lf) ((lf)->bufOffsetInFile + (lf)->lineStart) /* Current offset (of string start) in file. */ void lineFileSeek(struct lineFile *lf, off_t offset, int whence); /* Seek to read next line from given position. */ void lineFileAbort(struct lineFile *lf, char *format, ...) /* Print file name, line number, and error message, and abort. */ #if defined(__GNUC__) __attribute__((format(printf, 2, 3))) #endif ; void lineFileVaAbort(struct lineFile *lf, char *format, va_list args); /* Print file name, line number, and error message, and abort. */ void lineFileUnexpectedEnd(struct lineFile *lf); /* Complain about unexpected end of file. */ void lineFileExpectWords(struct lineFile *lf, int expecting, int got); /* Check line has right number of words. */ void lineFileExpectAtLeast(struct lineFile *lf, int expecting, int got); /* Check line has right number of words. */ boolean lineFileNextRow(struct lineFile *lf, char *words[], int wordCount); /* Return next non-blank line that doesn't start with '#' chopped into words. * Returns FALSE at EOF. Aborts on error. */ #define lineFileRow(lf, words) lineFileNextRow(lf, words, ArraySize(words)) /* Read in line chopped into fixed size word array. */ int lineFileChopNext(struct lineFile *lf, char *words[], int maxWords); /* Return next non-blank line that doesn't start with '#' chopped into words. */ #define lineFileChop(lf, words) lineFileChopNext(lf, words, ArraySize(words)) /* Ease-of-usef macro for lineFileChopNext above. */ int lineFileChopCharNext(struct lineFile *lf, char sep, char *words[], int maxWords); /* Return next non-blank line that doesn't start with '#' chopped into words delimited by sep. */ int lineFileChopNextTab(struct lineFile *lf, char *words[], int maxWords); /* Return next non-blank line that doesn't start with '#' chopped into words * on tabs */ #define lineFileChopTab(lf, words) lineFileChopNextTab(lf, words, ArraySize(words)) /* Ease-of-usef macro for lineFileChopNext above. */ int lineFileCheckAllIntsNoAbort(char *s, void *val, boolean isSigned, int byteCount, char *typeString, boolean noNeg, char *errMsg, int errMsgSize); /* Convert string to (signed) integer of the size specified. * Unlike atol assumes all of string is number, no trailing trash allowed. * Returns 0 if conversion possible, and value is returned in 'val' * Otherwise 1 for empty string or trailing chars, and 2 for numeric overflow, * and 3 for (-) sign in unsigned number. * Error messages if any are written into the provided buffer. * Pass NULL val if you only want validation. * Use noNeg if negative values are not allowed despite the type being signed, * returns 4. */ void lineFileAllInts(struct lineFile *lf, char *words[], int wordIx, void *val, boolean isSigned, int byteCount, char *typeString, boolean noNeg); /* Returns long long integer from converting the input string. Aborts on error. */ int lineFileAllIntsArray(struct lineFile *lf, char *words[], int wordIx, void *array, int arraySize, boolean isSigned, int byteCount, char *typeString, boolean noNeg); /* Convert comma separated list of numbers to an array. Pass in * array and max size of array. Aborts on error. Returns number of elements in parsed array. */ int lineFileNeedNum(struct lineFile *lf, char *words[], int wordIx); /* Make sure that words[wordIx] is an ascii integer, and return * binary representation of it. */ double lineFileNeedDouble(struct lineFile *lf, char *words[], int wordIx); /* Make sure that words[wordIx] is an ascii double value, and return * binary representation of it. */ char *lineFileReadAll(struct lineFile *lf); /* Read remainder of lineFile and return it as a string. */ boolean lineFileParseHttpHeader(struct lineFile *lf, char **hdr, boolean *chunked, int *contentLength); /* Extract HTTP response header from lf into hdr, tell if it's * "Transfer-Encoding: chunked" or if it has a contentLength. */ struct dyString *lineFileSlurpHttpBody(struct lineFile *lf, boolean chunked, int contentLength); /* Return a dyString that contains the http response body in lf. Handle * chunk-encoding and content-length. */ void lineFileExpandBuf(struct lineFile *lf, int newSize); /* Expand line file buffer. */ void lineFileRemoveInitialCustomTrackLines(struct lineFile *lf); /* remove initial browser and track lines */ /*----- Optionally-compiled wrapper on tabix (compression + indexing): -----*/ #define COMPILE_WITH_TABIX "%s: Sorry, this functionality is available only when\n" \ "you have installed the tabix library from\n" \ "http://samtools.sourceforge.net/ and rebuilt kent/src with USE_TABIX=1\n" \ "(see http://genomewiki.ucsc.edu/index.php/Build_Environment_Variables)." #endif /* LINEFILE_H */ rtracklayer/src/ucsc/localmem.c0000644000175100017510000000721014614231172017577 0ustar00biocbuildbiocbuild/* LocalMem.c - local memory routines. * * These routines are meant for the sort of scenario where * a lot of little to medium size pieces of memory are * allocated, and then disposed of all at once. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "localmem.h" struct lm { struct lmBlock *blocks; size_t blockSize; size_t allignMask; size_t allignAdd; }; struct lmBlock { struct lmBlock *next; char *free; char *end; char *extra; }; static struct lmBlock *newBlock(struct lm *lm, size_t reqSize) /* Allocate a new block of at least reqSize */ { size_t size = (reqSize > lm->blockSize ? reqSize : lm->blockSize); size_t fullSize = size + sizeof(struct lmBlock); struct lmBlock *mb = needLargeZeroedMem(fullSize); if (mb == NULL) errAbort("Couldn't allocate %lld bytes", (long long)fullSize); mb->free = (char *)(mb+1); mb->end = ((char *)mb) + fullSize; mb->next = lm->blocks; lm->blocks = mb; return mb; } struct lm *lmInit(int blockSize) /* Create a local memory pool. */ { struct lm *lm; int aliSize = sizeof(long); if (aliSize < sizeof(double)) aliSize = sizeof(double); if (aliSize < sizeof(void *)) aliSize = sizeof(void *); lm = needMem(sizeof(*lm)); lm->blocks = NULL; if (blockSize <= 0) blockSize = (1<<14); /* 16k default. */ lm->blockSize = blockSize; lm->allignAdd = (aliSize-1); lm->allignMask = ~lm->allignAdd; newBlock(lm, blockSize); return lm; } void lmCleanup(struct lm **pLm) /* Clean up a local memory pool. */ { struct lm *lm = *pLm; if (lm == NULL) return; slFreeList(&lm->blocks); freeMem(lm); *pLm = NULL; } void *lmAlloc(struct lm *lm, size_t size) /* Allocate memory from local pool. */ { struct lmBlock *mb = lm->blocks; void *ret; size_t memLeft = mb->end - mb->free; if (memLeft < size) mb = newBlock(lm, size); ret = mb->free; mb->free += ((size+lm->allignAdd)&lm->allignMask); if (mb->free > mb->end) mb->free = mb->end; return ret; } void *lmAllocMoreMem(struct lm *lm, void *pt, size_t oldSize, size_t newSize) /* Adjust memory size on a block, possibly relocating it. If block is grown, * new memory is zeroed. */ { struct lmBlock *mb = lm->blocks; // rare case that pointer is to last lm alloc, but still try. // Note this is the one place where the pointer gets reused and it is known to be in this lm if ((char *)pt + oldSize == mb->free && (char *)pt + newSize <= mb->end) { if (newSize > oldSize) // only move the free pointer on more mem mb->free = pt + newSize; return pt; } void *new = lmAlloc(lm, newSize); memcpy(new, pt, oldSize); return new; } void *lmCloneMem(struct lm *lm, void *pt, size_t size) /* Return a local mem copy of memory block. */ { void *d = lmAlloc(lm, size); memcpy(d, pt, size); return d; } char *lmCloneStringZ(struct lm *lm, char *string, int size) /* Return local mem copy of string. */ { if (string == NULL) return NULL; else { char *s = lmAlloc(lm, size+1); memcpy(s, string, size); return s; } } char *lmCloneString(struct lm *lm, char *string) /* Return local mem copy of string. */ { if (string == NULL) return NULL; else return lmCloneStringZ(lm, string, strlen(string)); } char *lmCloneFirstWord(struct lm *lm, char *line) /* Clone first word in line */ { char *startFirstWord = skipLeadingSpaces(line); if (startFirstWord == NULL) return NULL; char *endFirstWord = skipToSpaces(startFirstWord); if (endFirstWord == NULL) return lmCloneString(lm, startFirstWord); else return lmCloneStringZ(lm, startFirstWord, endFirstWord - startFirstWord); } rtracklayer/src/ucsc/localmem.h0000644000175100017510000000346414614231172017613 0ustar00biocbuildbiocbuild/* LocalMem.h - local memory routines. * * These routines are meant for the sort of scenario where * a lot of little to medium size pieces of memory are * allocated, and then disposed of all at once. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef LOCALMEM_H #define LOCALMEM_H struct lm *lmInit(int blockSize); /* Create a local memory pool. Parameters are: * blockSize - how much system memory to allocate at a time. Can * pass in zero and a reasonable default will be used. */ void lmCleanup(struct lm **pLm); /* Clean up a local memory pool. */ void *lmAlloc(struct lm *lm, size_t size); /* Allocate memory from local pool. */ void *lmAllocMoreMem(struct lm *lm, void *pt, size_t oldSize, size_t newSize); /* Adjust memory size on a block, possibly relocating it. If block is grown, * new memory is zeroed. NOTE: in RARE cases, same pointer may be returned. */ void *lmCloneMem(struct lm *lm, void *pt, size_t size); /* Return a local mem copy of memory block. */ char *lmCloneStringZ(struct lm *lm, char *string, int size); /* Return local mem copy of string of given size, adding null terminator. */ char *lmCloneString(struct lm *lm, char *string); /* Return local mem copy of string. */ char *lmCloneFirstWord(struct lm *lm, char *line); /* Clone first word in line */ #define lmAllocVar(lm, pt) (pt = lmAlloc(lm, sizeof(*pt))); /* Shortcut to allocating a single variable in local mem and * assigning pointer to it. */ #define lmCloneVar(lm, pt) lmCloneMem(lm, pt, sizeof((pt)[0])) /* Allocate copy of a structure. */ #define lmAllocArray(lm, pt, size) (pt = lmAlloc(lm, sizeof(*pt) * (size))) /* Shortcut to allocating an array in local mem and * assigning pointer to it. */ #endif//ndef LOCALMEM_H rtracklayer/src/ucsc/memalloc.c0000644000175100017510000002461614614231172017610 0ustar00biocbuildbiocbuild/* memalloc.c - Routines to allocate and deallocate dynamic memory. * This lets you have a stack of memory handlers. The default * memory handler is a thin shell around malloc/free. You can * substitute routines that do more integrety checking with * pushCarefulMem(), or routines of your own devising with * pushMemHandler(). * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include #include "common.h" #include "obscure.h" #include "memalloc.h" #include "dlist.h" static void *defaultAlloc(size_t size) /* Default allocator. */ { return malloc(size); } static void defaultFree(void *vpt) /* Default deallocator. */ { free(vpt); } static void *defaultRealloc(void *vpt, size_t size) /* Default deallocator. */ { return realloc(vpt, size); } static struct memHandler defaultMemHandler = /* Default memory handler. */ { NULL, defaultAlloc, defaultFree, defaultRealloc, }; static struct memHandler *mhStack = &defaultMemHandler; struct memHandler *pushMemHandler(struct memHandler *newHandler) /* Use newHandler for memory requests until matching popMemHandler. * Returns previous top of memory handler stack. */ { struct memHandler *oldHandler = mhStack; slAddHead(&mhStack, newHandler); return oldHandler; } struct memHandler *popMemHandler() /* Removes top element from memHandler stack and returns it. */ { struct memHandler *oldHandler = mhStack; if (mhStack == &defaultMemHandler) errAbort("Too many popMemHandlers()"); mhStack = mhStack->next; return oldHandler; } /* 128*8*1024*1024 == 1073741824 == 2^30 on 32 bit machines,size_t == 4 bytes*/ /* on 64 bit machines, size_t = 8 bytes, 2^30 * 2 * 2 * 2 * 2 = 2^34 == 16 Gb */ static size_t maxAlloc = (size_t)128*8*1024*1024*(sizeof(size_t)/4)*(sizeof(size_t)/4)*(sizeof(size_t)/4*(sizeof(size_t)/4)); void *needLargeMem(size_t size) /* This calls abort if the memory allocation fails. The memory is * not initialized to zero. */ { void *pt; if (size == 0 || size >= maxAlloc) errAbort("needLargeMem: trying to allocate %llu bytes (limit: %llu)", (unsigned long long)size, (unsigned long long)maxAlloc); if ((pt = mhStack->alloc(size)) == NULL) errAbort("needLargeMem: Out of memory - request size %llu bytes, errno: %d\n", (unsigned long long)size, errno); return pt; } void *needLargeZeroedMem(size_t size) /* Request a large block of memory and zero it. */ { void *v; v = needLargeMem(size); memset(v, 0, size); return v; } void *needLargeMemResize(void* vp, size_t size) /* Adjust memory size on a block, possibly relocating it. If vp is NULL, * a new memory block is allocated. Memory not initted. */ { void *pt; if (size == 0 || size >= maxAlloc) errAbort("needLargeMemResize: trying to allocate %llu bytes (limit: %llu)", (unsigned long long)size, (unsigned long long)maxAlloc); if ((pt = mhStack->realloc(vp, size)) == NULL) errAbort("needLargeMemResize: Out of memory - request size %llu bytes, errno: %d\n", (unsigned long long)size, errno); return pt; } void *needLargeZeroedMemResize(void* vp, size_t oldSize, size_t newSize) /* Adjust memory size on a block, possibly relocating it. If vp is NULL, a * new memory block is allocated. If block is grown, new memory is zeroed. */ { void *v = needLargeMemResize(vp, newSize); if (newSize > oldSize) memset(((char*)v)+oldSize, 0, newSize-oldSize); return v; } void *needHugeMem(size_t size) /* No checking on size. Memory not initted. */ { void *pt; if (size == 0) errAbort("needHugeMem: trying to allocate 0 bytes"); if ((pt = mhStack->alloc(size)) == NULL) errAbort("needHugeMem: Out of huge memory - request size %llu bytes, errno: %d\n", (unsigned long long)size, errno); return pt; } void *needHugeMemResize(void* vp, size_t size) /* Adjust memory size on a block, possibly relocating it. If vp is NULL, * a new memory block is allocated. No checking on size. Memory not * initted. */ { void *pt; if ((pt = mhStack->realloc(vp, size)) == NULL) errAbort("needHugeMemResize: Out of memory - request resize %llu bytes, errno: %d\n", (unsigned long long)size, errno); return pt; } #define NEEDMEM_LIMIT 500000000 void *needMem(size_t size) /* Need mem calls abort if the memory allocation fails. The memory * is initialized to zero. */ { void *pt; if (size == 0 || size > NEEDMEM_LIMIT) errAbort("needMem: trying to allocate %llu bytes (limit: %llu)", (unsigned long long)size, (unsigned long long)NEEDMEM_LIMIT); if ((pt = mhStack->alloc(size)) == NULL) errAbort("needMem: Out of memory - request size %llu bytes, errno: %d\n", (unsigned long long)size, errno); memset(pt, 0, size); return pt; } void *needMoreMem(void *old, size_t oldSize, size_t newSize) /* Adjust memory size on a block, possibly relocating it. If vp is NULL, a * new memory block is allocated. No checking on size. If block is grown, * new memory is zeroed. */ { return needLargeZeroedMemResize(old, oldSize, newSize); } void freeMem(void *pt) /* Free memory will check for null before freeing. */ { if (pt != NULL) mhStack->free(pt); } void freez(void *vpt) /* Pass address of pointer. Will free pointer and set it * to NULL. */ { void **ppt = (void **)vpt; void *pt = *ppt; *ppt = NULL; freeMem(pt); } static pthread_mutex_t carefulMutex = PTHREAD_MUTEX_INITIALIZER; static int carefulAlignSize; /* Alignment size for machine - 8 bytes for DEC alpha, 4 for Sparc. */ static int carefulAlignAdd; /* Do aliSize = *(unaliSize+carefulAlignAdd)&carefulAlignMask); */ #if __WORDSIZE == 64 static bits64 carefulAlignMask; /* to make sure requests are aligned. */ #elif __WORDSIZE == 32 static bits32 carefulAlignMask; /* to make sure requests are aligned. */ #else static bits32 carefulAlignMask; /* to make sure requests are aligned. */ #endif static struct memHandler *carefulParent; static size_t carefulMaxToAlloc; static size_t carefulAlloced; struct carefulMemBlock /* Keep one of these for each outstanding memory block. It's a doubly linked list. */ { struct carefulMemBlock *next; struct carefulMemBlock *prev; int size; int startCookie; }; int cmbStartCookie = 0x78753421; char cmbEndCookie[4] = {0x44, 0x33, 0x7F, 0x42}; struct dlList *cmbAllocedList; static void carefulMemInit(size_t maxToAlloc) /* Initialize careful memory system */ { carefulMaxToAlloc = maxToAlloc; cmbAllocedList = newDlList(); carefulAlignSize = sizeof(double); if (sizeof(void *) > carefulAlignSize) carefulAlignSize = sizeof(void *); if (sizeof(long) > carefulAlignSize) carefulAlignSize = sizeof(long); if (sizeof(off_t) > carefulAlignSize) carefulAlignSize = sizeof(off_t); if (sizeof(long long) > carefulAlignSize) carefulAlignSize = sizeof(long long); carefulAlignAdd = carefulAlignSize-1; carefulAlignMask = ~carefulAlignAdd; } static void *carefulAlloc(size_t size) /* Allocate extra memory for cookies and list node, and then * return memory block. */ { pthread_mutex_lock( &carefulMutex ); struct carefulMemBlock *cmb; char *pEndCookie; size_t newAlloced = size + carefulAlloced; size_t aliSize; if (newAlloced > carefulMaxToAlloc) { char maxAlloc[32]; char allocRequest[32]; sprintLongWithCommas(maxAlloc, (long long)carefulMaxToAlloc); sprintLongWithCommas(allocRequest, (long long)newAlloced); pthread_mutex_unlock( &carefulMutex ); errAbort("carefulAlloc: Allocated too much memory - more than %s bytes (%s)", maxAlloc, allocRequest); } carefulAlloced = newAlloced; aliSize = ((size + sizeof(*cmb) + 4 + carefulAlignAdd)&carefulAlignMask); cmb = carefulParent->alloc(aliSize); cmb->size = size; cmb->startCookie = cmbStartCookie; pEndCookie = (char *)(cmb+1); pEndCookie += size; memcpy(pEndCookie, cmbEndCookie, sizeof(cmbEndCookie)); dlAddHead(cmbAllocedList, (struct dlNode *)cmb); pthread_mutex_unlock( &carefulMutex ); return (void *)(cmb+1); } static void carefulFree(void *vpt) /* Check cookies and free. */ { pthread_mutex_lock( &carefulMutex ); struct carefulMemBlock *cmb = ((struct carefulMemBlock *)vpt)-1; size_t size = cmb->size; char *pEndCookie; carefulAlloced -= size; pEndCookie = (((char *)(cmb+1)) + size); if (cmb->startCookie != cmbStartCookie) { pthread_mutex_unlock( &carefulMutex ); errAbort("Bad start cookie %x freeing %llx\n", cmb->startCookie, ptrToLL(vpt)); } if (memcmp(pEndCookie, cmbEndCookie, sizeof(cmbEndCookie)) != 0) { pthread_mutex_unlock( &carefulMutex ); errAbort("Bad end cookie %x%x%x%x freeing %llx\n", pEndCookie[0], pEndCookie[1], pEndCookie[2], pEndCookie[3], ptrToLL(vpt)); } dlRemove((struct dlNode *)cmb); carefulParent->free(cmb); pthread_mutex_unlock( &carefulMutex ); } static void *carefulRealloc(void *vpt, size_t size) /* realloc a careful memblock block. */ { unsigned char* newBlk = carefulAlloc(size); if (vpt != NULL) { struct carefulMemBlock *cmb = ((struct carefulMemBlock *)vpt)-1; memcpy(newBlk, vpt, cmb->size); carefulFree(vpt); } return newBlk; } static struct memHandler carefulMemHandler = /* Default memory handler. */ { NULL, carefulAlloc, carefulFree, carefulRealloc, }; struct memTracker /* A structure to keep track of memory. */ { struct memTracker *next; /* Next in list. */ struct dlList *list; /* List of allocated blocks. */ struct memHandler *parent; /* Underlying memory handler. */ struct memHandler *handler; /* Memory handler. */ }; static struct memTracker *memTracker = NULL; /* Head in memTracker list. */ static void *memTrackerAlloc(size_t size) /* Allocate extra memory for cookies and list node, and then * return memory block. */ { struct dlNode *node; size += sizeof (*node); node = memTracker->parent->alloc(size); if (node == NULL) return node; dlAddTail(memTracker->list, node); return (void*)(node+1); } static void memTrackerFree(void *vpt) /* Check cookies and free. */ { struct dlNode *node = vpt; node -= 1; dlRemove(node); memTracker->parent->free(node); } static void *memTrackerRealloc(void *vpt, size_t size) /* Resize a memory block from memTrackerAlloc. */ { if (vpt == NULL) return memTrackerAlloc(size); else { struct dlNode *node = ((struct dlNode *)vpt)-1; size += sizeof(*node); dlRemove(node); node = memTracker->parent->realloc(node, size); if (node == NULL) return node; dlAddTail(memTracker->list, node); return (void*)(node+1); } } rtracklayer/src/ucsc/memalloc.h0000644000175100017510000000140414614231172017603 0ustar00biocbuildbiocbuild/* Let the user redirect where memory allocation/deallocation * happens. 'careful' routines help debug scrambled heaps. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef MEMALLOC_H #define MEMALLOC_H struct memHandler { struct memHandler *next; void * (*alloc)(size_t size); void (*free)(void *vpt); void * (*realloc)(void* vpt, size_t size); }; struct memHandler *pushMemHandler(struct memHandler *newHandler); /* Use newHandler for memory requests until matching popMemHandler. * Returns previous top of memory handler stack. */ struct memHandler *popMemHandler(); /* Removes top element from memHandler stack and returns it. */ #endif /* MEMALLOC_H */ rtracklayer/src/ucsc/memgfx.c0000644000175100017510000000112714614231172017272 0ustar00biocbuildbiocbuild/* memgfx - routines for drawing on bitmaps in memory. * Currently limited to 256 color bitmaps. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "memgfx.h" struct rgbColor colorIxToRgb(int colorIx) /* Return rgb value at color index. */ { static struct rgbColor rgb; #ifdef MEMGFX_BIGENDIAN rgb.r = (colorIx >> 24) & 0xff; rgb.g = (colorIx >> 16) & 0xff; rgb.b = (colorIx >> 8) & 0xff; #else rgb.r = (colorIx >> 0) & 0xff; rgb.g = (colorIx >> 8) & 0xff; rgb.b = (colorIx >> 16) & 0xff; #endif return rgb; } rtracklayer/src/ucsc/memgfx.h0000644000175100017510000000336614614231172017306 0ustar00biocbuildbiocbuild/* Memgfx - stuff to do graphics in memory buffers. * Typically will just write these out as .gif or .png files. * This stuff is byte-a-pixel for simplicity. * It can do 256 colors. * * This file is copyright 2000 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef MEMGFX_H #define MEMGFX_H #if defined(__sgi__) || defined(__sgi) || defined(__powerpc__) || defined(sparc) || defined(__ppc__) || defined(__s390__) || defined(__s390x__) // BIGENDIAN machines: #define MEMGFX_BIGENDIAN 1 #define MG_WHITE 0xffffffff #define MG_BLACK 0x000000ff #define MG_RED 0xff0000ff #define MG_GREEN 0x00ff00ff #define MG_BLUE 0x0000ffff #define MG_CYAN 0x00ffffff #define MG_MAGENTA 0xff00ffff #define MG_YELLOW 0xffff00ff #define MG_GRAY 0x808080ff #define MAKECOLOR_32(r,g,b) (((unsigned int)0xff) | ((unsigned int)b<<8) | ((unsigned int)g << 16) | ((unsigned int)r << 24)) #define COLOR_32_RED(c) (((c)>>24)&0xff) #define COLOR_32_GREEN(c) (((c)>>16)&0xff) #define COLOR_32_BLUE(c) (((c)>>8)&0xff) #else // LITTLE ENDIAN machines: #define MG_WHITE 0xffffffff #define MG_BLACK 0xff000000 #define MG_RED 0xff0000ff #define MG_GREEN 0xff00ff00 #define MG_BLUE 0xffff0000 #define MG_CYAN 0xffffff00 #define MG_MAGENTA 0xffff00ff #define MG_YELLOW 0xff00ffff #define MG_GRAY 0xff808080 #define MAKECOLOR_32(r,g,b) (((unsigned int)0xff<<24) | ((unsigned int)b<<16) | ((unsigned int)g << 8) | (unsigned int)r) #define COLOR_32_RED(c) ((c)&0xff) #define COLOR_32_GREEN(c) (((c)>>8)&0xff) #define COLOR_32_BLUE(c) (((c)>>16)&0xff) #endif struct rgbColor { unsigned char r, g, b; }; struct rgbColor colorIxToRgb(int colorIx); /* Return rgb value at color index. */ #endif /* MEMGFX_H */ rtracklayer/src/ucsc/net.c0000644000175100017510000003033114614231172016574 0ustar00biocbuildbiocbuild /* net.c some stuff to wrap around net communications. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #define CURL_STATICLIB #include #include "common.h" #include "errAbort.h" #include "net.h" #include "hash.h" #include "cheapcgi.h" time_t header_get_last_modified(CURL *curl) { curl_off_t last_modified; CURLcode status = curl_easy_getinfo(curl, CURLINFO_FILETIME_T, &last_modified); if ((CURLE_OK == status) && (last_modified >= 0)) { struct tm *utc_tm_info = gmtime(&last_modified); time_t utc_time_t = mktime(utc_tm_info); return utc_time_t; } // could not retrieve time if (last_modified == -1) return 0; errAbort("curl_easy_getinfo() failed: %s\n", curl_easy_strerror(status)); } long long header_get_content_length(CURL *curl) { curl_off_t content_length; CURLcode status = curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD_T, &content_length); // could not retrieve length if (content_length == -1) return 0; if (CURLE_OK == status) return content_length; errAbort("curl_easy_getinfo() failed: %s\n", curl_easy_strerror(status)); } CURL *wrapped_curl_init() { CURLcode status = curl_global_init(CURL_GLOBAL_DEFAULT); if (status != 0) errAbort("curl_global_init() failed: %s\n", curl_easy_strerror(status)); CURL *curl = curl_easy_init(); if (curl == NULL) errAbort("curl_easy_init() failed\n"); return curl; } void wrapped_curl_cleanup(CURL *curl) { curl_easy_cleanup(curl); curl_global_cleanup(); } CURLcode wrapped_curl_perform(CURL *curl) { CURLcode status = curl_easy_perform(curl); if (CURLE_OK != status) errAbort("curl_easy_perform() failed: %s\n", curl_easy_strerror(status)); return status; } size_t write_callback(void *buffer, size_t size, size_t nitems, void *userdata) { return size * nitems; } enum HTTP_METHODS { GET, HEAD }; CURLcode wrapped_curl_request(CURL *curl, enum HTTP_METHODS type) { if (type == HEAD) { curl_easy_setopt(curl, CURLOPT_NOBODY, 1L); curl_easy_setopt(curl, CURLOPT_HEADER, 1L); } curl_easy_setopt(curl, CURLOPT_FILETIME, 1L); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback); return wrapped_curl_perform(curl); } boolean netGetFtpInfo(char *url, long long *retSize, time_t *retTime) { struct netParsedUrl npu; netParseUrl(url, &npu); if (!sameString(npu.protocol, "ftp")) errAbort("netGetFtpInfo: url (%s) is not for ftp.", url); // TODO maybe remove this workaround where udc cache wants info on URL "/" ? if (sameString(npu.file,"/")) { *retSize = 0; *retTime = time(NULL); return TRUE; } CURL *curl = wrapped_curl_init(); curl_easy_setopt(curl, CURLOPT_URL, url); wrapped_curl_request(curl, HEAD); *retTime = header_get_last_modified(curl); *retSize = header_get_content_length(curl); wrapped_curl_cleanup(curl); return TRUE; } size_t header_callback(void *buffer, size_t size, size_t nitems, void *userdata) { size_t realsize = size * nitems; struct hash **header = (struct hash**)userdata; char *line = strtok((char*) buffer, "\n"); if (line != NULL) { char *colon = memchr(line, ':', strlen(line)); if (colon != NULL) { *colon = '\0'; hashAdd(*header, strUpper(line), cloneString(colon+1)); } } return realsize; } int netUrlHead(char *url, struct hash *hash) { CURL* curl = wrapped_curl_init(); curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, header_callback); curl_easy_setopt(curl, CURLOPT_HEADERDATA, &hash); CURLcode status = wrapped_curl_request(curl, HEAD); wrapped_curl_cleanup(curl); return status; } int netUrlOpenSockets(char *url, int *retCtrlSocket) { if (stringIn("://", url) == NULL) return open(url, O_RDONLY); else { CURL* curl = wrapped_curl_init(); curl_easy_setopt(curl, CURLOPT_URL, url); if (startsWith("http://", url) || startsWith("https://", url)) { int sockfd; curl_easy_setopt(curl, CURLOPT_OPENSOCKETDATA, &sockfd); wrapped_curl_request(curl, GET); wrapped_curl_cleanup(curl); return sockfd; } else if (startsWith("ftp://", url)) { curl_socket_t ctrlSocket; CURLcode status = wrapped_curl_request(curl, GET); curl_easy_getinfo(curl, CURLINFO_ACTIVESOCKET, &ctrlSocket); if (retCtrlSocket != NULL) *retCtrlSocket = ctrlSocket; wrapped_curl_cleanup(curl); return ctrlSocket; } else { errAbort("Sorry, can only netUrlOpen http, https and ftp currently, not '%s'", url); } } } int netUrlOpen(char *url) { return netUrlOpenSockets(url, NULL); } int netUrlFakeHeadByGet(char *url, struct hash *hash) { CURL* curl = wrapped_curl_init(); curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_RANGE, "0-0"); curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, header_callback); curl_easy_setopt(curl, CURLOPT_HEADERDATA, &hash); CURLcode status = wrapped_curl_request(curl, GET); wrapped_curl_cleanup(curl); return status; } boolean netSkipHttpHeaderLinesHandlingRedirect(int sd, char *url, int *redirectedSd, char **redirectedUrl) { char *effectiveUrl; curl_socket_t nsd; CURL* curl = wrapped_curl_init(); curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); wrapped_curl_request(curl, GET); curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &effectiveUrl); curl_easy_getinfo(curl, CURLINFO_ACTIVESOCKET, &nsd); if (sd != nsd) { close(sd); *redirectedSd = nsd; } if (!sameString(effectiveUrl, *redirectedUrl)) *redirectedUrl = cloneString(effectiveUrl); wrapped_curl_cleanup(curl); return TRUE; } // UCSC Existing Code boolean hasProtocol(char *urlOrPath) { return stringIn("://", urlOrPath) != NULL; } static void parseByteRange(const char *url, ssize_t *rangeStart, ssize_t *rangeEnd, boolean terminateAtByteRange) /* parse the byte range information from url */ { char *x; /* default to no byte range specified */ *rangeStart = -1; *rangeEnd = -1; x = strrchr(url, ';'); if (x) { if (startsWith(";byterange=", x)) { char *y=strchr(x, '='); ++y; char *z=strchr(y, '-'); if (z) { ++z; if (terminateAtByteRange) *x = 0; // TODO: use something better than atoll() ? *rangeStart = atoll(y); if (z[0] != '\0') *rangeEnd = atoll(z); } } } } void cgiDecodeFull(char *in, char *out, int inLength) /* Out will be a cgi-decoded version of in (no space from plus!). * Out will be a little shorter than in typically, and * can be the same buffer. */ { char c; int i; for (i=0; i= sizeof(buf)) errAbort("Url too long: '%s'", url); strcpy(buf, url); url = buf; /* Find out protocol - default to http. */ s = trimSpaces(url); s = stringIn("://", url); if (s == NULL) { strcpy(parsed->protocol, "http"); s = url; } else { *s = 0; tolowers(url); safecpy(parsed->protocol, sizeof(parsed->protocol), url); s += 3; } /* Split off file part. */ parsed->byteRangeStart = -1; /* default to no byte range specified */ parsed->byteRangeEnd = -1; u = strchr(s, '/'); if (u == NULL) strcpy(parsed->file, "/"); else { parseByteRange(u, &parsed->byteRangeStart, &parsed->byteRangeEnd, TRUE); if (sameWord(parsed->protocol,"http") || sameWord(parsed->protocol,"https")) { // http servers expect the URL request to be URL-encoded already. /* need to encode spaces, but not ! other characters */ char *t=replaceChars(u," ","%20"); safecpy(parsed->file, sizeof(parsed->file), t); freeMem(t); } *u = 0; // terminate the host:port string if (sameWord(parsed->protocol,"ftp")) { ++u; // that first slash is not considered part of the ftp path // decode now because the FTP server does NOT expect URL-encoding. cgiDecodeFull(u,parsed->file,strlen(u)); // decodes %FF but not + } } /* Split off user part */ v = strchr(s, '@'); if (v == NULL) { if (sameWord(parsed->protocol,"http") || sameWord(parsed->protocol,"https")) { strcpy(parsed->user, ""); strcpy(parsed->password, ""); } if (sameWord(parsed->protocol,"ftp")) { strcpy(parsed->user, "anonymous"); strcpy(parsed->password, "x@genome.ucsc.edu"); } } else { *v = 0; /* split off password part */ w = strchr(s, ':'); if (w == NULL) { safecpy(parsed->user, sizeof(parsed->user), s); strcpy(parsed->password, ""); } else { *w = 0; safecpy(parsed->user, sizeof(parsed->user), s); safecpy(parsed->password, sizeof(parsed->password), w+1); } cgiDecode(parsed->user,parsed->user,strlen(parsed->user)); cgiDecode(parsed->password,parsed->password,strlen(parsed->password)); s = v+1; } /* Save port if it's there. If not default to 80. */ t = strchr(s, ':'); if (t == NULL) { if (sameWord(parsed->protocol,"http")) strcpy(parsed->port, "80"); if (sameWord(parsed->protocol,"https")) strcpy(parsed->port, "443"); if (sameWord(parsed->protocol,"ftp")) strcpy(parsed->port, "21"); } else { *t++ = 0; if (!isdigit(t[0])) errAbort("Non-numeric port name %s", t); safecpy(parsed->port, sizeof(parsed->port), t); } /* What's left is the host. */ safecpy(parsed->host, sizeof(parsed->host), s); } char *urlFromNetParsedUrl(struct netParsedUrl *npu) /* Build URL from netParsedUrl structure */ { struct dyString *dy = newDyString(512); dyStringAppend(dy, npu->protocol); dyStringAppend(dy, "://"); if (npu->user[0] != 0) { char *encUser = cgiEncode(npu->user); dyStringAppend(dy, encUser); freeMem(encUser); if (npu->password[0] != 0) { dyStringAppend(dy, ":"); char *encPassword = cgiEncode(npu->password); dyStringAppend(dy, encPassword); freeMem(encPassword); } dyStringAppend(dy, "@"); } dyStringAppend(dy, npu->host); /* do not include port if it is the default */ if (!( (sameString(npu->protocol, "ftp" ) && sameString("21", npu->port)) || (sameString(npu->protocol, "http" ) && sameString("80", npu->port)) || (sameString(npu->protocol, "https") && sameString("443",npu->port)) )) { dyStringAppend(dy, ":"); dyStringAppend(dy, npu->port); } dyStringAppend(dy, npu->file); if (npu->byteRangeStart != -1) { dyStringPrintf(dy, ";byterange=%lld-", (long long)npu->byteRangeStart); if (npu->byteRangeEnd != -1) dyStringPrintf(dy, "%lld", (long long)npu->byteRangeEnd); } /* Clean up and return handle. */ return dyStringCannibalize(&dy); } char *transferParamsToRedirectedUrl(char *url, char *newUrl) /* Transfer password, byteRange, and any other parameters from url to newUrl and return result. * freeMem result. */ { struct netParsedUrl npu, newNpu; /* Parse the old URL to make parts available for graft onto the redirected url. */ /* This makes redirection work with byterange urls and user:password@ */ netParseUrl(url, &npu); netParseUrl(newUrl, &newNpu); if (npu.byteRangeStart != -1) { newNpu.byteRangeStart = npu.byteRangeStart; newNpu.byteRangeEnd = npu.byteRangeEnd; } if ((npu.user[0] != 0) && (newNpu.user[0] == 0)) { safecpy(newNpu.user, sizeof newNpu.user, npu.user); safecpy(newNpu.password, sizeof newNpu.password, npu.password); } return urlFromNetParsedUrl(&newNpu); } rtracklayer/src/ucsc/net.h0000644000175100017510000001764514614231172016616 0ustar00biocbuildbiocbuild/* Net.h some stuff to wrap around net communications. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef NET_H #define NET_H #include "linefile.h" #include "dystring.h" #define DEFAULTCONNECTTIMEOUTMSEC 10000 /* default connect timeout for tcp in milliseconds */ #define DEFAULTREADWRITETTIMEOUTSEC 120 /* default read/write timeout for tcp in seconds */ #define MAXURLSIZE 4096 /* maximum size in characters for a URL, but also see the struct netParsedUrl definition */ int setReadWriteTimeouts(int sd, int seconds); /* Set read and write timeouts on socket sd * Return -1 if there are any errors, 0 if successful. */ /* add a failure to connFailures[] * which can save time and avoid more timeouts */ int netConnect(char *hostName, int port); /* Start connection with a server having resolved port. Return < 0 if error. */ int netMustConnect(char *hostName, int port); /* Start connection with server or die. */ int netAcceptingSocketFrom(int port, int queueSize, char *host); /* Create a socket that can accept connections from a * IP address on the current machine if the current machine * has multiple IP addresses. */ int netWaitForData(int sd, int microseconds); /* Wait for descriptor to have some data to read, up to given number of * microseconds. Returns amount of data there or zero if timed out. */ void netBlockBrokenPipes(); /* Make it so a broken pipe doesn't kill us. */ ssize_t netReadAll(int sd, void *vBuf, ssize_t size); /* Read given number of bytes into buffer. * Don't give up on first read! */ char *netGetString(int sd, char buf[256]); /* Read string into buf and return it. If buf is NULL * an internal buffer will be used. Print warning message * and return NULL if any problem. */ char *netGetLongString(int sd); /* Read string up to 64k and return it. freeMem * the result when done. Print warning message and * return NULL if any problem. */ char *netGetHugeString(int sd); /* Read string up to 4 gig and return it. freeMem * the result when done. Print warning message and * return NULL if any problem. */ struct netParsedUrl /* A parsed URL. */ { char protocol[16]; /* Protocol - http or ftp, etc. */ char user[128]; /* User name (optional) */ char password[128]; /* Password (optional) */ char host[128]; /* Name of host computer - www.yahoo.com, etc. */ char port[16]; /* Port, usually 80 or 8080. */ char file[2024]; /* Remote file name/query string, starts with '/' */ ssize_t byteRangeStart; /* Start of byte range, use -1 for none */ ssize_t byteRangeEnd; /* End of byte range use -1 for none */ }; void netParseUrl(char *url, struct netParsedUrl *parsed); /* Parse a URL into components. A full URL is made up as so: * http://user:password@hostName:port/file;byterange=0-499 * User and password may be cgi-encoded. * This is set up so that the http:// and the port are optional. */ char *urlFromNetParsedUrl(struct netParsedUrl *npu); /* Build URL from netParsedUrl structure */ int netUrlOpen(char *url); /* Return socket descriptor (low-level file handle) for read()ing url data, * or -1 if error. Just close(result) when done. Errors from this routine * from web urls are rare, because this just opens up enough to read header, * which may just say "file not found." Consider using netUrlMustOpenPastHeader * instead .*/ int netUrlOpenSockets(char *url, int *retCtrlSocket); /* Return socket descriptor (low-level file handle) for read()ing url data, * or -1 if error. * If retCtrlSocket is non-NULL and url is FTP, set *retCtrlSocket * to the FTP control socket which is left open for a persistent connection. * close(result) (and close(*retCtrlSocket) if applicable) when done. */ struct hash; int netUrlHeadExt(char *url, char *method, struct hash *hash); /* Go get head and return status. Return negative number if * can't get head. If hash is non-null, fill it with header * lines with upper cased keywords for case-insensitive lookup, * including hopefully CONTENT-TYPE: . */ int netUrlHead(char *url, struct hash *hash); /* Go get head and return status. Return negative number if * can't get head. If hash is non-null, fill it with header * lines with upper cased keywords for case-insensitive lookup, * including hopefully CONTENT-TYPE: . */ int netUrlFakeHeadByGet(char *url, struct hash *hash); /* Use GET with byteRange as an alternate method to HEAD. * Return status. */ struct lineFile *netLineFileMayOpen(char *url); /* Same as netLineFileOpen, but warns and returns * null rather than aborting on problems. */ struct lineFile *netLineFileSilentOpen(char *url); /* Open a lineFile on a URL. Just return NULL without any user * visible warning message if there's a problem. */ struct dyString *netSlurpFile(int sd); /* Slurp file into dynamic string and return. Result will include http headers and * the like. */ struct lineFile *netHttpLineFileMayOpen(char *url, struct netParsedUrl **npu); /* Parse URL and open an HTTP socket for it but don't send a request yet. */ void netHttpGet(struct lineFile *lf, struct netParsedUrl *npu, boolean keepAlive); /* Send a GET request, possibly with Keep-Alive. */ int netOpenHttpExt(char *url, char *method, char *optionalHeader); /* Return a file handle that will read the url. optionalHeader * may by NULL or may contain cookies and other info. */ int netHttpConnect(char *url, char *method, char *protocol, char *agent, char *optionalHeader); /* Parse URL, connect to associated server on port, and send most of * the request to the server. If specified in the url send user name * and password too. Typically the "method" will be "GET" or "POST" * and the agent will be the name of your program or * library. optionalHeader may be NULL or contain additional header * lines such as cookie info. * Proxy support via hg.conf httpProxy or env var http_proxy * Return data socket, or -1 if error.*/ char *transferParamsToRedirectedUrl(char *url, char *newUrl); /* Transfer password, byteRange, and any other parameters from url to newUrl and return result. * freeMem result. */ boolean netSkipHttpHeaderLinesWithRedirect(int sd, char *url, char **redirectedUrl); /* Skip http header lines. Return FALSE if there's a problem. * The input is a standard sd or fd descriptor. * This is meant to be able work even with a re-passable stream handle, * e.g. can pass it to the pipes routines, which means we can't * attach a linefile since filling its buffer reads in more than just the http header. * Handles 300, 301, 302, 303, 307 http redirects by setting *redirectedUrl to * the new location. */ boolean netSkipHttpHeaderLinesHandlingRedirect(int sd, char *url, int *redirectedSd, char **redirectedUrl); /* Skip http headers lines, returning FALSE if there is a problem. Generally called as * netSkipHttpHeaderLine(sd, url, &sd, &url); * where sd is a socket (file) opened with netUrlOpen(url), and url is in dynamic memory. * If the http header indicates that the file has moved, then it will update the *redirectedSd and * *redirectedUrl with the new socket and URL, first closing sd. * If for some reason you want to detect whether the forwarding has occurred you could * call this as: * char *newUrl = NULL; * int newSd = 0; * netSkipHttpHeaderLine(sd, url, &newSd, &newUrl); * if (newUrl != NULL) * // Update sd with newSd, free url if appropriate and replace it with newUrl, etc. * // free newUrl when finished. * This routine handles up to 5 steps of redirection. * The logic to this routine is also complicated a little to make it work in a pipe, which means we * can't attach a lineFile since filling the lineFile buffer reads in more than just the http header. */ boolean netGetFtpInfo(char *url, long long *retSize, time_t *retTime); /* Return date in UTC and size of ftp url file */ boolean hasProtocol(char *urlOrPath); /* Return TRUE if it looks like it has http://, ftp:// etc. */ #endif /* NET_H */ rtracklayer/src/ucsc/obscure.c0000644000175100017510000001576714614231172017470 0ustar00biocbuildbiocbuild/* Obscure stuff that is handy every now and again. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include #include "portable.h" #include "localmem.h" #include "hash.h" #include "obscure.h" #include "linefile.h" static int _dotForUserMod = 100; /* How often does dotForUser() output a dot. */ int digitsBaseTwo(unsigned long x) /* Return base two # of digits. */ { int digits = 0; while (x) { digits += 1; x >>= 1; } return digits; } void writeGulp(char *file, char *buf, int size) /* Write out a bunch of memory. */ { FILE *f = mustOpen(file, "w"); mustWrite(f, buf, size); carefulClose(&f); } void readInGulp(char *fileName, char **retBuf, size_t *retSize) /* Read whole file in one big gulp. */ { size_t size = (size_t)fileSize(fileName); char *buf; FILE *f = mustOpen(fileName, "rb"); *retBuf = buf = needLargeMem(size+1); mustRead(f, buf, size); buf[size] = 0; /* Just in case it needs zero termination. */ fclose(f); if (retSize != NULL) *retSize = size; } void *intToPt(int i) /* Convert integer to pointer. Use when really want to store an * int in a pointer field. */ { char *pt = NULL; return pt+i; } int ptToInt(void *pt) /* Convert pointer to integer. Use when really want to store a * pointer in an int. */ { char *a = NULL, *b = pt; return b - a; } boolean parseQuotedString( char *in, char *out, char **retNext) /* Read quoted string from in (which should begin with first quote). * Write unquoted string to out, which may be the same as in. * Return pointer to character past end of string in *retNext. * Return FALSE if can't find end. */ { char c, *s = in; int quoteChar = *s++; boolean escaped = FALSE; for (;;) { c = *s++; if (c == 0) { warn("Unmatched %c", quoteChar); return FALSE; } if (escaped) { if (c == '\\' || c == quoteChar) *out++ = c; else { *out++ = '\\'; *out++ = c; } escaped = FALSE; } else { if (c == '\\') escaped = TRUE; else if (c == quoteChar) break; else *out++ = c; } } *out = 0; if (retNext != NULL) *retNext = s; return TRUE; } void escCopy(char *in, char *out, char toEscape, char escape) /* Copy in to out, escaping as needed. Out better be big enough. * (Worst case is strlen(in)*2 + 1.) */ { char c; for (;;) { c = *in++; if (c == toEscape) *out++ = escape; *out++ = c; if (c == 0) break; } } struct hash *hashThisEqThatLine(char *line, int lineIx, boolean firstStartsWithLetter) /* Return a symbol table from a line of form: * 1-this1=val1 2-this='quoted val2' var3="another val" * If firstStartsWithLetter is true, then the left side of the equals must start with * a letter. */ { char *dupe = cloneString(line); char *s = dupe, c; char *var, *val; struct hash *hash = newHash(8); for (;;) { if ((var = skipLeadingSpaces(s)) == NULL) break; if ((c = *var) == 0) break; if (firstStartsWithLetter && !isalpha(c)) errAbort("line %d of custom input: variable needs to start with letter '%s'", lineIx, var); val = strchr(var, '='); if (val == NULL) { errAbort("line %d of var %s in custom input: %s \n missing = in var/val pair", lineIx, var, line); } *val++ = 0; c = *val; if (c == '\'' || c == '"') { if (!parseQuotedString(val, val, &s)) errAbort("line %d of input: missing closing %c", lineIx, c); } else { s = skipToSpaces(val); if (s != NULL) *s++ = 0; } hashAdd(hash, var, cloneString(val)); } freez(&dupe); return hash; } struct slName *charSepToSlNames(char *string, char c) /* Convert character-separated list of items to slName list. * Note that the last occurence of c is optional. (That * is for a comma-separated list a,b,c and a,b,c, are * equivalent. */ { struct slName *list = NULL, *el; char *s, *e; s = string; while (s != NULL && s[0] != 0) { e = strchr(s, c); if (e == NULL) { el = slNameNew(s); slAddHead(&list, el); break; } else { el = slNameNewN(s, e - s); slAddHead(&list, el); s = e+1; } } slReverse(&list); return list; } void sprintLongWithCommas(char *s, long long l) /* Print out a long number with commas a thousands, millions, etc. */ { long long trillions, billions, millions, thousands; if (l >= 1000000000000LL) { trillions = l/1000000000000LL; l -= trillions * 1000000000000LL; billions = l/1000000000; l -= billions * 1000000000; millions = l/1000000; l -= millions * 1000000; thousands = l/1000; l -= thousands * 1000; sprintf(s, "%lld,%03lld,%03lld,%03lld,%03lld", trillions, billions, millions, thousands, l); } else if (l >= 1000000000) { billions = l/1000000000; l -= billions * 1000000000; millions = l/1000000; l -= millions * 1000000; thousands = l/1000; l -= thousands * 1000; sprintf(s, "%lld,%03lld,%03lld,%03lld", billions, millions, thousands, l); } else if (l >= 1000000) { millions = l/1000000; l -= millions * (long long)1000000; thousands = l/1000; l -= thousands * 1000; sprintf(s, "%lld,%03lld,%03lld", millions, thousands, l); } else if (l >= 1000) { thousands = l/1000; l -= thousands * 1000; sprintf(s, "%lld,%03lld", thousands, l); } else sprintf(s, "%lld", l); } void shuffleArrayOfPointers(void *pointerArray, int arraySize) /* Shuffle array of pointers of given size given number of times. */ { void **array = pointerArray, *pt; int i, randIx; /* Randomly permute an array using the method from Cormen, et al */ for (i=0; i 1) { struct slList *el; struct slList **array; int i; array = needLargeMem(count * sizeof(*array)); for (el = list, i=0; el != NULL; el = el->next, i++) array[i] = el; for (i=0; i<4; ++i) shuffleArrayOfPointers(array, count); list = NULL; for (i=0; inext = list; list = array[i]; } freeMem(array); slReverse(&list); *pL = list; } } void *slListRandomReduce(void *list, double reduceRatio) /* Reduce list to approximately reduceRatio times original size. Destroys original list. */ { if (reduceRatio >= 1.0) return list; int threshold = RAND_MAX * reduceRatio; struct slList *newList = NULL, *next, *el; for (el = list; el != NULL; el = next) { next = el->next; if (rand() <= threshold) { slAddHead(&newList, el); } } return newList; } rtracklayer/src/ucsc/obscure.h0000644000175100017510000000536214614231172017463 0ustar00biocbuildbiocbuild/* Obscure.h - stuff that's relatively rarely used * but still handy. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef OBSCURE_H #define OBSCURE_H int digitsBaseTwo(unsigned long x); /* Return base two # of digits. */ void sprintLongWithCommas(char *s, long long l); /* Print out a long number with commas a thousands, millions, etc. */ void writeGulp(char *file, char *buf, int size); /* Write out a bunch of memory. */ void readInGulp(char *fileName, char **retBuf, size_t *retSize); /* Read whole file in one big gulp. */ void *intToPt(int i); /* Convert integer to pointer. Use when really want to store an * int in a pointer field. */ int ptToInt(void *pt); /* Convert pointer to integer. Use when really want to store a * pointer in an int. */ boolean parseQuotedString( char *in, char *out, char **retNext); /* Read quoted string from in (which should begin with first quote). * Write unquoted string to out, which may be the same as in. * Return pointer to character past end of string in *retNext. * Return FALSE if can't find end. */ void escCopy(char *in, char *out, char toEscape, char escape); /* Copy in to out, escaping as needed. Out better be big enough. * (Worst case is strlen(in)*2 + 1.) */ struct slName *charSepToSlNames(char *string, char c); /* Convert character-separated list of items to slName list. * Note that the last occurence of c is optional. (That * is for a comma-separated list a,b,c and a,b,c, are * equivalent. */ struct hash *hashThisEqThatLine(char *line, int lineIx, boolean firstStartsWithLetter); /* Return a symbol table from a line of form: * 1-this1=val1 2-this='quoted val2' var3="another val" * If firstStartsWithLetter is true, then the left side of the equals must start with * and equals. */ void shuffleArrayOfPointers(void *pointerArray, int arraySize); /* Shuffle array of pointers of given size given number of times. */ void shuffleList(void *pList); /* Randomize order of slList. Usage: * shuffleList(&list) * where list is a pointer to a structure that * begins with a next field. */ void *slListRandomReduce(void *list, double reduceRatio); /* Reduce list to approximately reduceRatio times original size. Destroys original list. */ void rangeRoundUp(double start, double end, double *retStart, double *retEnd); /* Round start and end so that they cover a slightly bigger range, but with more round * numbers. For instance 0.23:9.89 becomes 0:10 */ void rangeFromMinMaxMeanStd(double minVal, double maxVal, double mean, double std, double *retStart, double *retEnd); /* Given some basic statistical properties, set a range that will be good on a wide * range of biological data. */ #endif /* OBSCURE_H */ rtracklayer/src/ucsc/os.c0000644000175100017510000000017414614231172016431 0ustar00biocbuildbiocbuild/* Added by rtracklayer to condition on the platform */ #ifdef WIN32 #include "oswin9x.c" #else #include "osunix.c" #endif rtracklayer/src/ucsc/osunix.c0000644000175100017510000002471614614231172017345 0ustar00biocbuildbiocbuild/* Some wrappers around operating-system specific stuff. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include #include #include #include #include #include #include "portable.h" #include "portimpl.h" #include "_portimpl.h" #include #include #include off_t fileSize(char *pathname) /* get file size for pathname. return -1 if not found */ { struct stat mystat; ZeroVar(&mystat); if (stat(pathname,&mystat)==-1) { return -1; } return mystat.st_size; } long clock1000() /* A millisecond clock. */ { struct timeval tv; static long origSec; gettimeofday(&tv, NULL); if (origSec == 0) origSec = tv.tv_sec; return (tv.tv_sec-origSec)*1000 + tv.tv_usec / 1000; } void sleep1000(int milli) /* Sleep for given number of 1000ths of second */ { if (milli > 0) { struct timeval tv; tv.tv_sec = milli/1000; tv.tv_usec = (milli%1000)*1000; select(0, NULL, NULL, NULL, &tv); } } long clock1() /* A seconds clock. */ { struct timeval tv; gettimeofday(&tv, NULL); return tv.tv_sec; } char *getCurrentDir() /* Return current directory. Abort if it fails. */ { static char dir[PATH_LEN]; if (getcwd( dir, sizeof(dir) ) == NULL ) errnoAbort("getCurrentDir: can't get current directory"); return dir; } void setCurrentDir(char *newDir) /* Set current directory. Abort if it fails. */ { if (chdir(newDir) != 0) errnoAbort("setCurrentDir: can't to set current directory: %s", newDir); } boolean makeDir(char *dirName) /* Make dir. Returns TRUE on success. Returns FALSE * if failed because directory exists. Prints error * message and aborts on other error. */ { int err; if ((err = mkdir(dirName, 0777)) < 0) { if (errno != EEXIST) { perror(""); errAbort("Couldn't make directory %s", dirName); } return FALSE; } return TRUE; } struct fileInfo *listDirXExt(char *dir, char *pattern, boolean fullPath, boolean ignoreStatFailures) /* Return list of files matching wildcard pattern with * extra info. If full path is true then the path will be * included in the name of each file. */ { struct fileInfo *list = NULL, *el; struct dirent *de; DIR *d; int dirNameSize = strlen(dir); int fileNameOffset = dirNameSize+1; char pathName[512]; if ((d = opendir(dir)) == NULL) return NULL; memcpy(pathName, dir, dirNameSize); pathName[dirNameSize] = '/'; while ((de = readdir(d)) != NULL) { char *fileName = de->d_name; if (differentString(fileName, ".") && differentString(fileName, "..")) { if (pattern == NULL || wildMatch(pattern, fileName)) { struct stat st; bool isDir = FALSE; int statErrno = 0; strcpy(pathName+fileNameOffset, fileName); if (stat(pathName, &st) < 0) { if (ignoreStatFailures) statErrno = errno; else errAbort("stat failed in listDirX"); } if (S_ISDIR(st.st_mode)) isDir = TRUE; if (fullPath) fileName = pathName; el = newFileInfo(fileName, st.st_size, isDir, statErrno, st.st_atime); slAddHead(&list, el); } } } closedir(d); slSort(&list, cmpFileInfo); return list; } struct fileInfo *listDirX(char *dir, char *pattern, boolean fullPath) /* Return list of files matching wildcard pattern with * extra info. If full path is true then the path will be * included in the name of each file. */ { return listDirXExt(dir, pattern, fullPath, FALSE); } time_t fileModTime(char *pathName) /* Return file last modification time. The units of * these may vary from OS to OS, but you can depend on * later files having a larger time. */ { struct stat st; if (stat(pathName, &st) < 0) errAbort("stat failed in fileModTime: %s", pathName); return st.st_mtime; } char *getHost() /* Return host name. */ { static char *hostName = NULL; static char buf[128]; if (hostName == NULL) { hostName = getenv("HTTP_HOST"); if (hostName == NULL) { hostName = getenv("HOST"); if (hostName == NULL) { if (hostName == NULL) { static struct utsname unamebuf; if (uname(&unamebuf) >= 0) hostName = unamebuf.nodename; else hostName = "unknown"; } } } strncpy(buf, hostName, sizeof(buf)); chopSuffix(buf); hostName = buf; } return hostName; } char *semiUniqName(char *base) /* Figure out a name likely to be unique. * Name will have no periods. Returns a static * buffer, so best to clone result unless using * immediately. */ { int pid = getpid(); int num = time(NULL)&0xFFFFF; char host[512]; strcpy(host, getHost()); char *s = strchr(host, '.'); if (s != NULL) *s = 0; subChar(host, '-', '_'); subChar(host, ':', '_'); static char name[PATH_LEN]; safef(name, sizeof(name), "%s_%s_%x_%x", base, host, pid, num); return name; } static void eatSlashSlashInPath(char *path) /* Convert multiple // to single // */ { char *s, *d; s = d = path; char c, lastC = 0; while ((c = *s++) != 0) { if (c == '/' && lastC == c) continue; *d++ = c; lastC = c; } *d = 0; } static void eatExcessDotDotInPath(char *path) /* If there's a /.. in path take it out. Turns * 'this/long/../dir/file' to 'this/dir/file * and * 'this/../file' to 'file' * * and * 'this/long/..' to 'this' * and * 'this/..' to '' * and * /this/..' to '/' */ { /* Take out each /../ individually */ for (;;) { /* Find first bit that needs to be taken out. */ char *excess= strstr(path, "/../"); char *excessEnd = excess+4; if (excess == NULL || excess == path) break; /* Look for a '/' before this */ char *excessStart = matchingCharBeforeInLimits(path, excess, '/'); if (excessStart == NULL) /* Preceding '/' not found */ excessStart = path; else excessStart += 1; strcpy(excessStart, excessEnd); } /* Take out final /.. if any */ if (endsWith(path, "/..")) { if (!sameString(path, "/..")) /* We don't want to turn this to blank. */ { int len = strlen(path); char *excessStart = matchingCharBeforeInLimits(path, path+len-3, '/'); if (excessStart == NULL) /* Preceding '/' not found */ excessStart = path; else excessStart += 1; *excessStart = 0; } } } char *simplifyPathToDir(char *path) /* Return path with ~ and .. taken out. Also any // or trailing /. * freeMem result when done. */ { /* Expand ~ if any with result in newPath */ char newPath[PATH_LEN]; int newLen = 0; char *s = path; if (*s == '~') { char *homeDir = getenv("HOME"); if (homeDir == NULL) errAbort("No HOME environment var defined after ~ in simplifyPathToDir"); ++s; if (*s == '/') /* ~/something */ { ++s; safef(newPath, sizeof(newPath), "%s/", homeDir); } else /* ~something */ { safef(newPath, sizeof(newPath), "%s/../", homeDir); } newLen = strlen(newPath); } int remainingLen = strlen(s); if (newLen + remainingLen >= sizeof(newPath)) errAbort("path too big in simplifyPathToDir"); strcpy(newPath+newLen, s); /* Remove //, .. and trailing / */ eatSlashSlashInPath(newPath); eatExcessDotDotInPath(newPath); int lastPos = strlen(newPath)-1; if (lastPos > 0 && newPath[lastPos] == '/') newPath[lastPos] = 0; return cloneString(newPath); } void childExecFailedExit(char *msg) /* Child exec failed, so quit without atexit cleanup */ { fprintf(stderr, "child exec failed: %s\n", msg); fflush(stderr); _exit(1); // Let the parent know that the child failed by returning 1. /* Explanation: _exit() is not the normal exit(). _exit() avoids the usual atexit() cleanup. The MySQL library that we link to uses atexit() cleanup to close any open MySql connections. However, because the child's mysql connections are shared by the parent, this causes the parent MySQL connections to become invalid, and causes the puzzling "MySQL has gone away" error in the parent when it tries to use its now invalid MySQL connections. */ } static void execPStack(pid_t ppid) /* exec pstack on the specified pid */ { char *cmd[3], pidStr[32]; safef(pidStr, sizeof(pidStr), "%ld", (long)ppid); cmd[0] = "pstack"; cmd[1] = pidStr; cmd[2] = NULL; // redirect stdout to stderr if (dup2(2, 1) < 0) errAbort("dup2 failed"); execvp(cmd[0], cmd); childExecFailedExit(cmd[0]); // cannot use the normal errAbort. } void vaDumpStack(char *format, va_list args) /* debugging function to run the pstack program on the current process. In * prints a message, following by a new line, and then the stack track. Just * prints errors to stderr rather than aborts. For debugging purposes * only. */ { static boolean inDumpStack = FALSE; // don't allow re-entry if called from error handler if (inDumpStack) return; inDumpStack = TRUE; fflush(stdout); // clear buffer before forking vfprintf(stderr, format, args); fputc('\n', stderr); fflush(stderr); pid_t ppid = getpid(); pid_t pid = fork(); if (pid < 0) { perror("can't fork pstack"); return; } if (pid == 0) execPStack(ppid); int wstat; if (waitpid(pid, &wstat, 0) < 0) perror("waitpid on pstack failed"); else { if (WIFEXITED(wstat)) { if (WEXITSTATUS(wstat) != 0) fprintf(stderr, "pstack failed\n"); } else if (WIFSIGNALED(wstat)) fprintf(stderr, "pstack signaled %d\n", WTERMSIG(wstat)); } inDumpStack = FALSE; } void dumpStack(char *format, ...) /* debugging function to run the pstack program on the current process. In * prints a message, following by a new line, and then the stack track. Just * prints errors to stderr rather than aborts. For debugging purposes * only. */ { va_list args; va_start(args, format); vaDumpStack(format, args); va_end(args); } boolean maybeTouchFile(char *fileName) /* If file exists, set its access and mod times to now. If it doesn't exist, create it. * Return FALSE if we have a problem doing so (e.g. when qateam is gdb'ing and code tries * to touch some file owned by www). */ { if (fileExists(fileName)) { struct utimbuf ut; ut.actime = ut.modtime = clock1(); int ret = utime(fileName, &ut); if (ret != 0) { warn("utime(%s) failed (ownership?)", fileName); return FALSE; } } else { FILE *f = fopen(fileName, "w"); if (f == NULL) return FALSE; else carefulClose(&f); } return TRUE; } boolean isRegularFile(char *fileName) /* Return TRUE if fileName is a regular file. */ { struct stat st; if (stat(fileName, &st) < 0) return FALSE; if (S_ISREG(st.st_mode)) return TRUE; return FALSE; } rtracklayer/src/ucsc/oswin9x.c0000644000175100017510000000721414614231172017432 0ustar00biocbuildbiocbuild/* Stuff that's specific for Win95 goes here. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include #include "common.h" #include #include #include "portable.h" #include "_portimpl.h" /* for cmpFileInfo */ static char const rcsid[] = "$Id: oswin9x.c,v 1.9 2008/06/27 18:46:53 markd Exp $"; boolean isRegularFile(char *fileName) { DWORD dwAttrib = GetFileAttributes((LPCTSTR)fileName); return (dwAttrib != INVALID_FILE_ATTRIBUTES && !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY)); } /* Return how long the named file is in bytes. * Return -1 if no such file. */ off_t fileSize(char *fileName) { int fd; long size; fd = _open(fileName, _O_RDONLY, 0); if (fd < 0) return -1; size = _lseek(fd, 0L, SEEK_END); _close(fd); return size; } time_t fileModTime(char *pathName) /* Return file last modification time. The units of * these may vary from OS to OS, but you can depend on * later files having a larger time. */ { struct _finddata_t fileInfo; if (_findfirst( pathName, &fileInfo) == -1L) errAbort("_findFirst failed in fileModTime: %s", pathName); return fileInfo.time_write; } void sleep1000(int milli) /* Sleep for given number of 1000ths of second */ { if (milli > 0) { Sleep(milli); } } long clock1000() /* A millisecond clock. */ { return clock() /* 1000/CLOCKS_PER_SEC */; /* CLOCKS_PER_SEC == 1000 for windows */ } long clock1() /* Second clock. */ { return clock()/CLOCKS_PER_SEC; } char *getCurrentDir() /* Return current directory. */ { static char dir[_MAX_PATH]; if( _getcwd( dir, _MAX_PATH ) == NULL ) errnoAbort("can't get current directory"); return dir; } void setCurrentDir(char *newDir) /* Set current directory. Abort if it fails. */ { if (_chdir(newDir) != 0) errnoAbort("can't to set current directory: %s", newDir); } boolean makeDir(char *dirName) /* Make dir. Returns TRUE on success. Returns FALSE * if failed because directory exists. Prints error * message and aborts on other error. */ { if (!CreateDirectory(dirName, NULL)) { perror(""); errAbort("Couldn't make directory %s", dirName); return FALSE; } return TRUE; } struct fileInfo *listDirX(char *dir, char *pattern, boolean fullPath) /* Return list of files matching wildcard pattern with * extra info. If full path is true then the path will be * included in the name of each file. */ { struct fileInfo *list = NULL, *el; long hFile; struct _finddata_t fileInfo; boolean otherDir = FALSE; char *currentDir; int dirNameSize = strlen(dir); int fileNameOffset = dirNameSize+1; char pathName[512]; if (dir == NULL || sameString(".", dir) || sameString("", dir)) dir = ""; else { currentDir = getCurrentDir(); setCurrentDir(dir); otherDir = TRUE; } if (pattern == NULL) pattern = "*"; if( (hFile = _findfirst( pattern, &fileInfo)) == -1L ) return NULL; memcpy(pathName, dir, dirNameSize); pathName[dirNameSize] = '/'; do { if (!sameString(".", fileInfo.name) && !sameString("..", fileInfo.name)) { char *fileName = fileInfo.name; strcpy(pathName+fileNameOffset, fileName); if (fullPath) fileName = pathName; el = newFileInfo(fileInfo.name, fileInfo.size, fileInfo.attrib & _A_SUBDIR, 0, fileInfo.time_access); slAddHead(&list, el); } } while( _findnext( hFile, &fileInfo) == 0 ); _findclose( hFile ); if (otherDir) setCurrentDir(currentDir); slSort(&list, cmpFileInfo); return list; } rtracklayer/src/ucsc/pipeline.c0000644000175100017510000004631614614231172017625 0ustar00biocbuildbiocbuild#ifndef WIN32 /* pipeline.c - create a process pipeline that can be used for reading or * writing */ /* Copyright (C) 2013 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "pipeline.h" #include "common.h" #include "sqlNum.h" #include "dystring.h" #include "errAbort.h" #include "portable.h" #include "linefile.h" #include #include #include #include enum procState /* process state, in order of transition */ { procStateNew, // plProc object created procStateRun, // proccess running procStateDone // process finished (ok or failed) }; struct plProc /* A single process in a pipeline */ { struct plProc *next; /* order list of processes */ struct pipeline *pl; /* pipeline we are associated with */ char **cmd; /* null-terminated command for this process */ pid_t pid; /* pid for process, -1 if not running */ enum procState state; /* state of process */ int status; /* status from wait */ }; struct pipeline /* Object for a process pipeline and associated open file. Pipeline process * consist of a process group leader and then all of the child process. The * group leader does no work, just wait on processes to complete and report * errors to the top level process. This object is create in the calling * process, and then passed down, but not shared, via forks. */ { struct plProc *procs; /* list of processes */ int numRunning; /* number of processes running */ pid_t groupLeader; /* process group id, or -1 if not set. This is pid of group leader */ char *procName; /* name to use in error messages. */ int pipeFd; /* fd of pipe to/from process, -1 if none */ unsigned options; /* options */ FILE* pipeFh; /* optional stdio around pipe */ char* stdioBuf; /* optional stdio buffer */ struct lineFile *pipeLf; /* optional lineFile around pipe */ }; /* file buffer size */ #define FILE_BUF_SIZE 64*1024 static int pipeCreate(int *writeFd) /* create a pipe or die, return readFd */ { int pipeFds[2]; if (pipe(pipeFds) < 0) errnoAbort("can't create pipe"); *writeFd = pipeFds[1]; return pipeFds[0]; } static void safeClose(int *fdPtr) /* Close with error checking. *fdPtr == -1 indicated already closed */ { int fd = *fdPtr; if (fd != -1) { if (close(fd) < 0) errnoAbort("close failed on fd %d", fd); *fdPtr = -1; } } static void closeNonStdDescriptors(void) /* close non-standard file descriptors */ { long maxFd = sysconf(_SC_OPEN_MAX); if (maxFd < 0) maxFd = 4096; // shouldn't really happen int fd; for (fd = STDERR_FILENO+1; fd < maxFd; fd++) close(fd); } static char* joinCmd(char **cmd) /* join an cmd vector into a space separated string */ { struct dyString *str = dyStringNew(512); int i; for (i = 0; cmd[i] != NULL; i++) { if (i > 0) dyStringAppend(str, " "); dyStringAppend(str, cmd[i]); } return dyStringCannibalize(&str); } static char* joinCmds(char ***cmds) /* join an cmds vetor into a space and pipe separated string */ { struct dyString *str = dyStringNew(512); int i, j; for (i = 0; cmds[i] != NULL; i++) { if (i > 0) dyStringAppend(str, " | "); for (j = 0; cmds[i][j] != NULL; j++) { if (j > 0) dyStringAppend(str, " "); dyStringAppend(str, cmds[i][j]); } } return dyStringCannibalize(&str); } static char** cloneCmdVector(char **cmd) /* make a copy of the vector */ { int i, cmdLen = 0; for (i = 0; cmd[i] != NULL; i++) cmdLen++; char **cmd2 = needMem((cmdLen+1)*sizeof(char*)); for (i = 0; i < cmdLen; i++) cmd2[i] = cloneString(cmd[i]); cmd2[cmdLen] = NULL; return cmd2; } static struct plProc* plProcNew(char **cmd, struct pipeline *pl) /* create a new plProc object for a command. */ { struct plProc* proc; AllocVar(proc); proc->pl = pl; proc->cmd = cloneCmdVector(cmd); proc->state = procStateNew; return proc; } static void plProcFree(struct plProc *proc) /* free a plProc object. */ { int i; for (i = 0; proc->cmd[i] != NULL; i++) freeMem(proc->cmd[i]); freeMem(proc->cmd); freeMem(proc); } static void plProcStateTrans(struct plProc *proc, enum procState newState) /* do state transition for process changing it to a new state */ { // States must transition in order. New state must immediately follow the // current state. if (newState != proc->state+1) errAbort("invalid state transition: %d -> %d", proc->state, newState); proc->state = newState; } static void plProcSetup(struct plProc* proc, int stdinFd, int stdoutFd, int stderrFd) /* setup signal, error handling, and file descriptors after fork */ { /* Optionally treat a closed pipe as an EOF rather than getting SIGPIPE */ if (signal(SIGPIPE, ((proc->pl->options & pipelineSigpipe) ? SIG_DFL : SIG_IGN)) == SIG_ERR) errnoAbort("error ignoring SIGPIPE"); if (setpgid(getpid(), proc->pl->groupLeader) != 0) errnoAbort("error from setpgid(%d, %d)", getpid(), proc->pl->groupLeader); /* child, first setup stdio files */ if (stdinFd != STDIN_FILENO) { if (dup2(stdinFd, STDIN_FILENO) < 0) errnoAbort("can't dup2 to stdin"); } if (stdoutFd != STDOUT_FILENO) { if (dup2(stdoutFd, STDOUT_FILENO) < 0) errnoAbort("can't dup2 to stdout"); } if (stderrFd != STDERR_FILENO) { if (dup2(stderrFd, STDERR_FILENO) < 0) errnoAbort("can't dup2 to stderr"); } closeNonStdDescriptors(); } static void plProcExecChild(struct plProc* proc, int stdinFd, int stdoutFd, int stderrFd) /* child part of process startup. */ { plProcSetup(proc, stdinFd, stdoutFd, stderrFd); execvp(proc->cmd[0], proc->cmd); errnoAbort("exec failed: %s", proc->cmd[0]); } static void plProcMemWrite(struct plProc* proc, int stdoutFd, int stderrFd, void *otherEndBuf, size_t otherEndBufSize) /* implements child process to write memory buffer to pipeline after * fork */ { plProcSetup(proc, STDIN_FILENO, stdoutFd, stderrFd); ssize_t wrCnt = write(STDOUT_FILENO, otherEndBuf, otherEndBufSize); if (wrCnt < 0) errnoAbort("pipeline input buffer write failed"); else if (wrCnt != otherEndBufSize) errAbort("pipeline input buffer short write %lld, expected %lld", (long long)wrCnt, (long long)otherEndBufSize); else { close(STDOUT_FILENO); exit(0); } } static void plProcHandleSignaled(struct plProc* proc, int status) /* handle one of the processes terminating on a signal */ { assert(WIFSIGNALED(proc->status)); if (!((WTERMSIG(proc->status) == SIGPIPE) && (proc->pl->options & pipelineSigpipe))) { errAbort("process terminated on signal %d: \"%s\" in pipeline \"%s\"", WTERMSIG(proc->status), joinCmd(proc->cmd), proc->pl->procName); } } static void plProcHandleExited(struct plProc* proc, int status) /* handle one of the processes terminating on an exit */ { assert(WIFEXITED(proc->status)); if (WEXITSTATUS(proc->status) != 0) { // only print an error message if aborting if (!(proc->pl->options & pipelineNoAbort)) fprintf(stderr, "process exited with %d: \"%s\" in pipeline \"%s\"\n", WEXITSTATUS(proc->status), joinCmd(proc->cmd), proc->pl->procName); exit(WEXITSTATUS(proc->status)); // pass back exit code } } static void plProcHandleTerminate(struct plProc* proc, int status) /* handle one of the processes terminating, save exit status */ { proc->pid = -1; proc->status = status; plProcStateTrans(proc, procStateDone); if (WIFSIGNALED(proc->status)) plProcHandleSignaled(proc, status); else plProcHandleExited(proc, status); } static struct pipeline* pipelineNew(char ***cmds, unsigned options) /* create a new pipeline object. Doesn't start processes */ { static char *memPseudoCmd[] = {"[mem]", NULL}; struct pipeline *pl; int iCmd; AllocVar(pl); pl->groupLeader = -1; pl->pipeFd = -1; pl->options = options; pl->procName = joinCmds(cmds); if (cmds[0] == NULL) errAbort("no commands in pipeline"); if (options & pipelineMemInput) { /* add proc for forked process to write memory to pipeline */ slAddTail(&pl->procs, plProcNew(memPseudoCmd, pl)); } for(iCmd = 0; cmds[iCmd] != NULL; iCmd++) slAddTail(&pl->procs, plProcNew(cmds[iCmd], pl)); return pl; } void pipelineFree(struct pipeline **plPtr) /* free a pipeline object */ { struct pipeline *pl = *plPtr; if (pl != NULL) { struct plProc *proc = pl->procs; while (proc != NULL) { struct plProc *delProc = proc; proc = proc->next; plProcFree(delProc); } freez(&pl->procName); freez(&pl->stdioBuf); freez(plPtr); } } static struct plProc *pipelineFindProc(struct pipeline *pl, pid_t pid) /* find a plProc by pid */ { struct plProc *proc; for (proc = pl->procs; proc != NULL; proc = proc->next) if (proc->pid == pid) return proc; errAbort("pid not found in pipeline: %d", (int)pid); return 0; // never reached } static void execProcChild(struct pipeline* pl, struct plProc *proc, int procStdinFd, int procStdoutFd, int stderrFd, void *otherEndBuf, size_t otherEndBufSize) /* handle child process setup after fork. This does not return */ { if (otherEndBuf != NULL) plProcMemWrite(proc, procStdoutFd, stderrFd, otherEndBuf, otherEndBufSize); else plProcExecChild(proc, procStdinFd, procStdoutFd, stderrFd); } static int pipelineExecProc(struct pipeline* pl, struct plProc *proc, int prevStdoutFd, int stdinFd, int stdoutFd, int stderrFd, void *otherEndBuf, size_t otherEndBufSize) /* start a process in the pipeline, return the stdout fd of the process */ { /* determine stdin/stdout to use */ int procStdinFd, procStdoutFd; if (proc == pl->procs) procStdinFd = stdinFd; /* first process in pipeline */ else procStdinFd = prevStdoutFd; if (proc->next == NULL) procStdoutFd = stdoutFd; /* last process in pipeline */ else prevStdoutFd = pipeCreate(&procStdoutFd); /* start process */ if ((proc->pid = fork()) < 0) errnoAbort("can't fork"); if (proc->pid == 0) execProcChild(pl, proc, procStdinFd, procStdoutFd, stderrFd, otherEndBuf, otherEndBufSize); /* record that we did this */ plProcStateTrans(proc, procStateRun); pl->numRunning++; /* don't leave intermediate pipes open in parent */ if (proc != pl->procs) safeClose(&procStdinFd); if (proc->next != NULL) safeClose(&procStdoutFd); return prevStdoutFd; } static void pipelineGroupExec(struct pipeline* pl, int stdinFd, int stdoutFd, int stderrFd, void *otherEndBuf, size_t otherEndBufSize) /* Start all processes in a pipeline, stdinFd and stdoutFd are the ends of * the pipeline, stderrFd is applied to all processed */ { struct plProc *proc; int prevStdoutFd = -1; for (proc = pl->procs; proc != NULL; proc = proc->next) { prevStdoutFd = pipelineExecProc(pl, proc, prevStdoutFd, stdinFd, stdoutFd, stderrFd, otherEndBuf, otherEndBufSize); otherEndBuf = NULL; /* only for first process (read pipes) */ otherEndBufSize = 0; } } static void waitOnOne(struct pipeline *pl) /* wait on one process to finish */ { int status; pid_t pid = waitpid(-pl->groupLeader, &status, 0); if (pid < 0) errnoAbort("waitpid failed"); plProcHandleTerminate(pipelineFindProc(pl, pid), status); pl->numRunning--; assert(pl->numRunning >= 0); } static void groupWait(struct pipeline *pl) /* Wait for pipeline to complete */ { /* wait on all processes to complete */ while (pl->numRunning > 0) waitOnOne(pl); } static void groupLeaderRun(struct pipeline* pl, int stdinFd, int stdoutFd, int stderrFd, void *otherEndBuf, size_t otherEndBufSize) /* group leader process */ { pl->groupLeader = getpid(); if (setpgid(pl->groupLeader, pl->groupLeader) != 0) errnoAbort("error from child setpgid(%d, %d)", pl->groupLeader, pl->groupLeader); pipelineGroupExec(pl, stdinFd, stdoutFd, stderrFd, otherEndBuf, otherEndBufSize); // only keep stderr open close(STDIN_FILENO); close(STDOUT_FILENO); closeNonStdDescriptors(); groupWait(pl); exit(0); } static int groupLeaderWait(struct pipeline *pl) /* Wait for group leader to complete. If pipelineNoAbort was specified, return * the exit code of the first group process exit non-zero, or zero if none * failed. */ { int status; pid_t pid = waitpid(-pl->groupLeader, &status, 0); if (pid < 0) errnoAbort("waitpid failed"); if (WIFSIGNALED(status)) errAbort("process pipeline terminated on signal %d", WTERMSIG(status)); assert(WIFEXITED(status)); if ((WEXITSTATUS(status) != 0) && !(pl->options & pipelineNoAbort)) errAbort("pipeline exited with %d", WEXITSTATUS(status)); return WEXITSTATUS(status); } static void pipelineExec(struct pipeline* pl, int stdinFd, int stdoutFd, int stderrFd, void *otherEndBuf, size_t otherEndBufSize) /* Fork the group leader, which then launches all processes in a pipeline, * stdinFd and stdoutFd are the ends of the pipeline, stderrFd is applied to * all processes, including group leader */ { assert(pl->groupLeader < 0); // should not be set if ((pl->groupLeader = fork()) < 0) errnoAbort("can't fork"); if (pl->groupLeader == 0) { groupLeaderRun(pl, stdinFd, stdoutFd, stderrFd, otherEndBuf, otherEndBufSize); exit(1); // doesn't return to here } else { // parent also must also setpgid to prevent race condition if (setpgid(pl->groupLeader, pl->groupLeader) != 0) errnoAbort("error from parent setpgid(%d, %d)", pl->groupLeader, pl->groupLeader); } } static int openRead(char *fname) /* open a file for reading */ { int fd = open(fname, O_RDONLY); if (fd < 0) errnoAbort("can't open for read access: %s", fname); return fd; } static int openWrite(char *fname, boolean append) /* open a file for write access */ { int flags = O_WRONLY|O_CREAT; if (append) flags |= O_APPEND; else flags |= O_TRUNC; int fd = open(fname, flags, 0666); if (fd < 0) errnoAbort("can't open for write access: %s", fname); return fd; } static void pipelineStartRead(struct pipeline *pl, int stdinFd, int stderrFd, void *otherEndBuf, size_t otherEndBufSize) /* start a read pipeline */ { int pipeWrFd; pl->pipeFd = pipeCreate(&pipeWrFd); pipelineExec(pl, stdinFd, pipeWrFd, stderrFd, otherEndBuf, otherEndBufSize); safeClose(&pipeWrFd); } static void pipelineStartWrite(struct pipeline *pl, int stdoutFd, int stderrFd) /* start a write pipeline */ { int pipeRdFd = pipeCreate(&pl->pipeFd); pipelineExec(pl, pipeRdFd, stdoutFd, stderrFd, NULL, 0); safeClose(&pipeRdFd); } static void checkOpts(unsigned opts) /* check option set for consistency */ { if (((opts & (pipelineRead|pipelineWrite)) == 0) || ((opts & (pipelineRead|pipelineWrite)) == (pipelineRead|pipelineWrite))) errAbort("must specify one of pipelineRead or pipelineWrite to pipelineOpen"); if ((opts & pipelineAppend) && ((opts & pipelineWrite) == 0)) errAbort("pipelineAppend is valid only in conjunction with pipelineWrite"); } struct pipeline *pipelineOpenFd(char ***cmds, unsigned opts, int otherEndFd, int stderrFd) /* Create a pipeline from an array of commands. See pipeline.h for * full documentation. */ { struct pipeline *pl; checkOpts(opts); pl = pipelineNew(cmds, opts); if (opts & pipelineRead) pipelineStartRead(pl, otherEndFd, stderrFd, NULL, 0); else pipelineStartWrite(pl, otherEndFd, stderrFd); return pl; } struct pipeline *pipelineOpen(char ***cmds, unsigned opts, char *otherEndFile, char *stderrFile) /* Create a pipeline from an array of commands. See pipeline.h for * full documentation */ { int otherEndFd; int stderrFd = (stderrFile == NULL) ? STDERR_FILENO : openWrite(stderrFile, FALSE); checkOpts(opts); boolean append = ((opts & pipelineAppend) != 0); if (opts & pipelineRead) otherEndFd = (otherEndFile == NULL) ? STDIN_FILENO : openRead(otherEndFile); else otherEndFd = (otherEndFile == NULL) ? STDOUT_FILENO : openWrite(otherEndFile, append); struct pipeline *pl = pipelineOpenFd(cmds, opts, otherEndFd, stderrFd); safeClose(&otherEndFd); if (stderrFile != NULL) safeClose(&stderrFd); return pl; } struct pipeline *pipelineOpenMem(char ***cmds, unsigned opts, void *otherEndBuf, size_t otherEndBufSize, int stderrFd) /* Create a pipeline from an array of commands, with the pipeline input/output * in a memory buffer. See pipeline.h for full documentation. Currently only * input to a read pipeline is supported */ { struct pipeline *pl; checkOpts(opts); if (opts & pipelineWrite) errAbort("pipelineOpenMem only supports read pipelines at this time"); opts |= pipelineMemInput; pl = pipelineNew(cmds, opts); pipelineStartRead(pl, STDIN_FILENO, stderrFd, otherEndBuf, otherEndBufSize); return pl; } struct pipeline *pipelineOpenFd1(char **cmd, unsigned opts, int otherEndFd, int stderrFd) /* like pipelineOpenFd(), only takes a single command */ { char **cmds[2]; cmds[0] = cmd; cmds[1] = NULL; return pipelineOpenFd(cmds, opts, otherEndFd, stderrFd); } struct pipeline *pipelineOpen1(char **cmd, unsigned opts, char *otherEndFile, char *stderrFile) /* like pipelineOpen(), only takes a single command */ { char **cmds[2]; cmds[0] = cmd; cmds[1] = NULL; return pipelineOpen(cmds, opts, otherEndFile, stderrFile); } struct pipeline *pipelineOpenMem1(char **cmd, unsigned opts, void *otherEndBuf, size_t otherEndBufSize, int stderrFd) /* like pipelineOpenMem(), only takes a single command */ { char **cmds[2]; cmds[0] = cmd; cmds[1] = NULL; return pipelineOpenMem(cmds, opts, otherEndBuf, otherEndBufSize, stderrFd); } char *pipelineDesc(struct pipeline *pl) /* Get the description of a pipeline for use in error messages */ { return pl->procName; } int pipelineFd(struct pipeline *pl) /* Get the file descriptor for a pipeline */ { return pl->pipeFd; } static void closePipelineFile(struct pipeline *pl) /* close a pipeline with a FILE associated with it */ { if (pl->options & pipelineWrite) { fflush(pl->pipeFh); if (ferror(pl->pipeFh)) errAbort("write failed to pipeline: %s ", pl->procName); } else if (ferror(pl->pipeFh)) errAbort("read failed from pipeline: %s ", pl->procName); if (fclose(pl->pipeFh) == EOF) errAbort("close failed on pipeline: %s ", pl->procName); pl->pipeFh = NULL; } static void closePipeline(struct pipeline *pl) /* Close the pipe file */ { if (pl->pipeFh != NULL) closePipelineFile(pl); else if (pl->pipeLf != NULL) lineFileClose(&pl->pipeLf); else { if (close(pl->pipeFd) < 0) errAbort("close failed on pipeline: %s ", pl->procName); } pl->pipeFd = -1; } int pipelineWait(struct pipeline *pl) /* Wait for processes in a pipeline to complete; normally aborts if any * process exists non-zero. If pipelineNoAbort was specified, return the exit * code of the first process exit non-zero, or zero if none failed. */ { /* must close before waiting to so processes get pipe EOF */ closePipeline(pl); return groupLeaderWait(pl); } /* * Local Variables: * c-file-style: "jkent-c" * End: */ #endif rtracklayer/src/ucsc/pipeline.h0000644000175100017510000001324614614231172017626 0ustar00biocbuildbiocbuild/* pipeline.h - create a process pipeline that can be used for reading or * writing. These pipeline objects don't go through the shell, so they * avoid many of the obscure problems associated with system() and popen(). * * Read pipelines are pipelines where a program reads output written by the * pipeline, and write pipelines are where the program writes data to the * pipeline. The type of pipeline is specified in the set of option flags * passed to pipelineOpen(). The file at the other end of the pipeline is * specified in the otherEndFile argument of pipelineOpen(), as shown here: * * pipelineRead: * * otherEndFile --> cmd[0] --> ... --> cmd[n] --> pipelineLf() etc. * * pipelineWrite: * * pipeLineFile() --> cmd[0] --> ... --> cmd[n] --> otherEndFile * * Specify otherEndFile as "/dev/null" for no input or no output (or to * discard output). If otherEndFile is NULL, then either stdin or stdout are * inherited from the current process. * * I/O to the pipeline is done by using the result of pipelineFd(), * pipelineFile(), or pipelineLineFile(). * * An example that reads a compressed file, sorting it numerically by the * first column: * * static char *cmd1[] = {"gzip", "-dc", NULL}; * static char *cmd2[] = {"sort", "-k", "1,1n", NULL}; * static char **cmds[] = {cmd1, cmd2, NULL}; * * struct pipeline *pl = pipelineOpen(cmds, pipelineRead, inFilePath, stderrFd); * struct lineFile *lf = pipelineLineFile(pl); * char *line; * * while (lineFileNext(lf, &line, NULL)) * { * ... * } * pipelineWait(pl); * pipelineFree(&pl); * * A similar example that generates data and writes a compressed file, sorting * it numerically by the first column: * * * static char *cmd1[] = {"sort", "-k", "1,1n", NULL}; * static char *cmd2[] = {"gzip", "-c3", NULL}; * static char **cmds[] = {cmd1, cmd2, NULL}; * * struct pipeline *pl = pipelineOpen(cmds, pipelineWrite, outFilePath, stderrFd); * char *line; * * while ((line = makeNextRow()) != NULL) * fprintf(fh, "%s\n", line); * * pipelineWait(pl); * pipelineFree(&pl); * * To append to an output file, use pipelineWrite|pipelineAppend: * * struct pipeline *pl = pipelineOpen(cmds, pipelineWrite|pipelineAppend, outFilePath, stderrFd); */ #ifndef PIPELINE_H #define PIPELINE_H #include struct linefile; struct pipeline; enum pipelineOpts /* pipeline options bitset */ { pipelineRead = 0x01, /* read from pipeline */ pipelineWrite = 0x02, /* write to pipeline */ pipelineNoAbort = 0x04, /* don't abort if a process exits non-zero, * wait will return exit code instead. * Still aborts if process signals. */ pipelineMemInput = 0x08, /* pipeline takes input from memory (internal) */ pipelineAppend = 0x10, /* Append to output file (used only with pipelineWrite) */ pipelineSigpipe = 0x20 /* enable sigpipe in the children and don't treat as an error in the parent */ }; struct pipeline *pipelineOpenFd(char ***cmds, unsigned opts, int otherEndFd, int stderrFd); /* Create a pipeline from an array of commands. Each command is an array of * arguments. Shell expansion is not done on the arguments. If pipelineRead * is specified, the output of the pipeline is readable from the pipeline * object. If pipelineWrite is specified, the input of the pipeline is * writable from the pipeline object. */ struct pipeline *pipelineOpen(char ***cmds, unsigned opts, char *otherEndFile, char *stderrFile); /* Create a pipeline from an array of commands. Each command is an array of * arguments. Shell expansion is not done on the arguments. If pipelineRead * is specified, the output of the pipeline is readable from the pipeline * object. If pipelineWrite is specified, the input of the pipeline is * writable from the pipeline object. If stderrFile is NULL, stderr is inherited, * otherwise it is redirected to this file. */ struct pipeline *pipelineOpenMem(char ***cmds, unsigned opts, void *otherEndBuf, size_t otherEndBufSize, int stderrFd); /* Create a pipeline from an array of commands, with the pipeline input/output * in a memory buffer. See pipeline.h for full documentation. Currently only * input to a read pipeline is supported */ struct pipeline *pipelineOpenFd1(char **cmd, unsigned opts, int otherEndFd, int stderrFd); /* like pipelineOpenFd(), only takes a single command */ struct pipeline *pipelineOpen1(char **cmd, unsigned opts, char *otherEndFile, char *stderrFile); /* like pipelineOpen(), only takes a single command */ struct pipeline *pipelineOpenMem1(char **cmd, unsigned opts, void *otherEndBuf, size_t otherEndBufSize, int stderrFd); /* like pipelineOpenMem(), only takes a single command */ char *pipelineDesc(struct pipeline *pl); /* Get the desciption of a pipeline for use in error messages */ int pipelineFd(struct pipeline *pl); /* Get the file descriptor for a pipeline */ int pipelineWait(struct pipeline *pl); /* Wait for processes in a pipeline to complete; normally aborts if any * process exists non-zero. If pipelineNoAbort was specified, return the exit * code of the first process exit non-zero, or zero if none failed. */ void pipelineFree(struct pipeline **plPtr); /* free a pipeline object */ #endif /* * Local Variables: * c-file-style: "jkent-c" * End: */ rtracklayer/src/ucsc/portable.h0000644000175100017510000000743314614231172017632 0ustar00biocbuildbiocbuild/* portable.h - wrappers around things that vary from server * to server and operating system to operating system. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef PORTABLE_H #define PORTABLE_H #include #include struct fileInfo /* Info about a file. */ { struct fileInfo *next; /* Next in list. */ off_t size; /* Size in bytes. */ bool isDir; /* True if file is a directory. */ int statErrno; /* Result of stat (e.g. bad symlink). */ time_t lastAccess; /* Last access time. */ char name[1]; /* Allocated at run time. */ }; struct fileInfo *newFileInfo(char *name, off_t size, bool isDir, int statErrno, time_t lastAccess); /* Return a new fileInfo. */ struct fileInfo *listDirXExt(char *dir, char *pattern, boolean fullPath, boolean ignoreStatFailures); /* Return list of files matching wildcard pattern with * extra info. If full path is true then the path will be * included in the name of each file. You can free the * resulting list with slFreeList. */ struct fileInfo *listDirX(char *dir, char *pattern, boolean fullPath); /* Return list of files matching wildcard pattern with * extra info. If full path is true then the path will be * included in the name of each file. You can free the * resulting list with slFreeList. */ char *getCurrentDir(); /* Return current directory. Abort if it fails. */ void setCurrentDir(char *newDir); /* Set current directory. Abort if it fails. */ boolean makeDir(char *dirName); /* Make dir. Returns TRUE on success. Returns FALSE * if failed because directory exists. Prints error * message and aborts on other error. */ void makeDirsOnPath(char *pathName); /* Create directory specified by pathName. If pathName contains * slashes, create directory at each level of path if it doesn't * already exist. Abort with error message if there's a problem. * (It's not considered a problem for the directory to already * exist. ) */ char *simplifyPathToDir(char *path); /* Return path with ~ (for home) and .. taken out. freeMem result when done. */ long clock1000(); /* 1000 hz clock */ void sleep1000(int milli); /* Sleep for given number of milliseconds. */ long clock1(); /* A 1 hz clock. */ /* This structure helps us generate temp names and use * them. Since different servers locate where the cgi * runs from differently, and where the generated html * file runs from - this is necessary for portable code. */ struct tempName { char forCgi[128]; char forHtml[128]; }; void makeTempName(struct tempName *tn, char *base, char *suffix); /* Make a good name for a temp file. */ char *semiUniqName(char *base); /* Figure out a name likely to be unique. * Name will have no periods. Returns a static * buffer, so best to clone result unless using * immediately. */ char *cgiDir(); /* Return directory to look for cgi in. */ char *trashDir(); /* Return directory for relative path to trash from cgi binaries */ void mkdirTrashDirectory(char *prefix); /* create the specified trash directory if it doesn't exist */ double machineSpeed(); /* Return relative speed of machine. UCSC CSE dept. 1999 web server is 1.0 */ char *getHost(); /* Get name of this machine. */ void envUpdate(char *name, char *value); /* Update an environment string */ time_t fileModTime(char *pathName); /* Return file last modification time. The units of * these may vary from OS to OS, but you can depend on * later files having a larger time. */ boolean maybeTouchFile(char *fileName); /* If file exists, set its access and mod times to now. If it doesn't exist, create it. * Return FALSE if we have a problem doing so. */ boolean isRegularFile(char *fileName); /* Return TRUE if fileName is a regular file. */ #endif /* PORTABLE_H */ rtracklayer/src/ucsc/portimpl.h0000644000175100017510000000236014614231172017662 0ustar00biocbuildbiocbuild/***************************************************************************** * Copyright (C) 2000 Jim Kent. This source code may be freely used * * for personal, academic, and non-profit purposes. Commercial use * * permitted only by explicit agreement with Jim Kent (jim_kent@pacbell.net) * *****************************************************************************/ /* Implement portable stuff.... */ /* There is one of the following structures for each web server * we support. During run time looking at the environment variable * SERVER_SOFTWARE we decide which of these to use. */ struct webServerSpecific { char *name; /* Make a good name for a temp file. */ void (*makeTempName)(struct tempName *tn, char *base, char *suffix); /* Return directory to look for cgi in. */ char * (*cgiDir)(); #ifdef NEVER /* Return cgi suffix. */ char * (*cgiSuffix)(); #endif /* NEVER */ /* Return relative speed of CPU. (UCSC CSE 1999 FTP machine is 1.0) */ double (*speed)(); /* The relative path to trash directory for CGI binaries */ char * (*trashDir)(); }; extern struct webServerSpecific wssMicrosoftII, wssMicrosoftPWS, wssDefault, wssLinux, wssCommandLine, wssBrcMcw; rtracklayer/src/ucsc/rangeTree.c0000644000175100017510000001565314614231172017734 0ustar00biocbuildbiocbuild/* rangeTree - This module is a way of keeping track of * non-overlapping ranges (half-open intervals). It is * based on the self-balancing rbTree code. Use it in * place of a bitmap when the total number of ranges * is significantly smaller than the number of bits would * be. * Beware the several static/global variables which can be * changed by various function calls. */ /* Copyright (C) 2013 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "limits.h" #include "localmem.h" #include "obscure.h" #include "rbTree.h" #include "rangeTree.h" int rangeCmp(void *va, void *vb) /* Return -1 if a before b, 0 if a and b overlap, * and 1 if a after b. */ { struct range *a = va; struct range *b = vb; if (a->end <= b->start) return -1; else if (b->end <= a->start) return 1; else return 0; } static void *sumInt(void *a, void *b) /* Local function used by rangeTreeAddValCount, which sums two ints a and b, * referenced by void pointers, returning the result in a */ { int *i = a, *j = b; *i += *j; return a; } struct range *rangeTreeAddVal(struct rbTree *tree, int start, int end, void *val, void *(*mergeVals)(void *existingVal, void *newVal) ) /* Add range to tree, merging with existing ranges if need be. * If this is a new range, set the value to this val. * If there are existing items for this range, and if mergeVals function is not null, * apply mergeVals to the existing values and this new val, storing the result as the val * for this range (see rangeTreeAddValCount() and rangeTreeAddValList() below for examples). */ { struct range *r, *existing; r = lmAlloc(tree->lm, sizeof(*r)); /* alloc new zeroed range */ r->start = start; r->end = end; r->val = val; while ((existing = rbTreeRemove(tree, r)) != NULL) { r->start = min(r->start, existing->start); r->end = max(r->end, existing->end); if (mergeVals) r->val = mergeVals(existing->val, r->val); } rbTreeAdd(tree, r); return r; } struct range *rangeTreeAdd(struct rbTree *tree, int start, int end) /* Add range to tree, merging with existing ranges if need be. */ { return rangeTreeAddVal(tree, start, end, NULL, NULL); } void rangeTreeAddToCoverageDepth(struct rbTree *tree, int start, int end) /* Add area from start to end to a tree that is being built up to store the * depth of coverage. Recover coverage back out by looking at ptToInt(range->val) * on tree elements. */ { struct range q; q.start = start; q.end = end; struct range *r, *existing = rbTreeFind(tree, &q); if (existing == NULL) { lmAllocVar(tree->lm, r); r->start = start; r->end = end; r->val = intToPt(1); rbTreeAdd(tree, r); } else { if (existing->start <= start && existing->end >= end) /* The existing one completely encompasses us */ { /* Make a new section for the bit before start. */ if (existing->start < start) { lmAllocVar(tree->lm, r); r->start = existing->start; r->end = start; r->val = existing->val; existing->start = start; rbTreeAdd(tree, r); } /* Make a new section for the bit after end. */ if (existing->end > end) { lmAllocVar(tree->lm, r); r->start = end; r->end = existing->end; r->val = existing->val; existing->end = end; rbTreeAdd(tree, r); } /* Increment existing section in overlapping area. */ existing->val = (char *)(existing->val) + 1; } else /* In general case fetch list of regions that overlap us. Remaining cases to handle are: r >> e rrrrrrrrrrrrrrrrrrrr eeeeeeeeee e < r rrrrrrrrrrrrrrr eeeeeeeeeeee r < e rrrrrrrrrrrr eeeeeeeeeeeee */ { struct range *existingList = rangeTreeAllOverlapping(tree, start, end); #ifdef DEBUG /* Make sure that list is really sorted for debugging... */ int lastStart = existingList->start; for (r = existingList; r != NULL; r = r->next) { int start = r->start; if (start < lastStart) internalErr(); } #endif /* DEBUG */ int s = start, e = end; for (existing = existingList; existing != NULL; existing = existing->next) { /* Deal with start of new range that comes before existing */ if (s < existing->start) { lmAllocVar(tree->lm, r); r->start = s; r->end = existing->start; r->val = intToPt(1); s = existing->start; rbTreeAdd(tree, r); } else if (s > existing->start) { lmAllocVar(tree->lm, r); r->start = existing->start; r->end = s; r->val = existing->val; existing->start = s; rbTreeAdd(tree, r); } existing->val = (char *)(existing->val) + 1; s = existing->end; } if (s < e) /* Deal with end of new range that doesn't overlap with anything. */ { lmAllocVar(tree->lm, r); r->start = s; r->end = e; r->val = intToPt(1); rbTreeAdd(tree, r); } } } } static struct range *rangeList; static void rangeListAdd(void *v) /* Callback to add item to range list. */ { struct range *r = v; slAddHead(&rangeList, r); } struct range *rangeTreeList(struct rbTree *tree) /* Return list of all ranges in tree in order. Not thread safe. * No need to free this when done, memory is local to tree. */ { rangeList = NULL; rbTreeTraverse(tree, rangeListAdd); slReverse(&rangeList); return rangeList; } struct range *rangeTreeAllOverlapping(struct rbTree *tree, int start, int end) /* Return list of all items in range tree that overlap interval start-end. * Do not free this list, it is owned by tree. However it is only good until * next call to rangeTreeFindInRange or rangeTreeList. Not thread safe. */ { struct range tempR; tempR.start = start; tempR.end = end; rangeList = NULL; rbTreeTraverseRange(tree, &tempR, &tempR, rangeListAdd); slReverse(&rangeList); return rangeList; } /* A couple of variables used to calculate total overlap. */ static int totalOverlap; static int overlapStart, overlapEnd; static void addOverlap(void *v) /* Callback to add item to range list. */ { struct range *r = v; totalOverlap += positiveRangeIntersection(r->start, r->end, overlapStart, overlapEnd); } int rangeTreeOverlapSize(struct rbTree *tree, int start, int end) /* Return the total size of intersection between interval * from start to end, and items in range tree. Sadly not * thread-safe. * On 32 bit machines be careful not to overflow * range of start, end or total size return value. */ { struct range tempR; tempR.start = overlapStart = start; tempR.end = overlapEnd = end; totalOverlap = 0; rbTreeTraverseRange(tree, &tempR, &tempR, addOverlap); return totalOverlap; } void rangeTreeSumRangeCallback(void *item, void *context) /* This is a callback for rbTreeTraverse with context. It just adds up * end-start */ { struct range *range = item; long long *pSum = context; *pSum += range->end - range->start; } struct rbTree *rangeTreeNew() /* Create a new, empty, rangeTree. */ { return rbTreeNew(rangeCmp); } rtracklayer/src/ucsc/rangeTree.h0000644000175100017510000000526414614231172017736 0ustar00biocbuildbiocbuild/* rangeTree - This module is a way of keeping track of * non-overlapping ranges (half-open intervals). It is * based on the self-balancing rbTree code. Use it in * place of a bitmap when the total number of ranges * is significantly smaller than the number of bits would * be. */ #ifndef RANGETREE_H #define RANGETREE_H #ifndef RBTREE_H #include "rbTree.h" #endif struct range /* An interval in a list of intervals. */ { struct range *next; int start,end; /* Zero based half open interval. */ void *val; /* Some value associated with range. */ }; struct rbTree *rangeTreeNew(); /* Create a new, empty, rangeTree. Free with rbFreeTree. */ #define rangeTreeFree(a) rbTreeFree(a) /* Free up range tree. */ int rangeCmp(void *va, void *vb); /* Return -1 if a before b, 0 if a and b overlap, * and 1 if a after b. */ struct range *rangeTreeAddVal(struct rbTree *tree, int start, int end, void *val, void *(*mergeVals)(void *existingVal, void *newVal) ); /* Add range to tree, merging with existing ranges if need be. * If this is a new range, set the value to this val. * If there are existing items for this range, and if mergeVals function is not null, * apply mergeVals to the existing values and this new val, storing the result as the val * for this range (see rangeTreeAddValCount() and rangeTreeAddValList() below for examples). */ struct range *rangeTreeAdd(struct rbTree *tree, int start, int end); /* Add range to tree, merging with existing ranges if need be. */ void rangeTreeAddToCoverageDepth(struct rbTree *tree, int start, int end); /* Add area from start to end to a tree that is being built up to store the * depth of coverage. Recover coverage back out by looking at ptToInt(range->val) * on tree elements. */ int rangeTreeOverlapSize(struct rbTree *tree, int start, int end); /* Return the total size of intersection between interval * from start to end, and items in range tree. Sadly not * thread-safe. * On 32 bit machines be careful not to overflow * range of start, end or total size return value. */ struct range *rangeTreeAllOverlapping(struct rbTree *tree, int start, int end); /* Return list of all items in range tree that overlap interval start-end. * Do not free this list, it is owned by tree. However it is only good until * next call to rangeTreeFindInRange or rangTreeList. Not thread safe. */ void rangeTreeSumRangeCallback(void *item, void *context); /* This is a callback for rbTreeTraverse with context. It just adds up * end-start */ struct range *rangeTreeList(struct rbTree *tree); /* Return list of all ranges in tree in order. Not thread safe. * No need to free this when done, memory is local to tree. */ #endif /* RANGETREE_H */ rtracklayer/src/ucsc/rbTree.c0000644000175100017510000003766214614231172017247 0ustar00biocbuildbiocbuild/* rbTree - rbTreeRed-rbTreeBlack Tree - a type of binary tree which * automatically keeps relatively balanced during * inserts and deletions. * original author: Shane Saunders * adapted into local conventions: Jim Kent */ #include "common.h" #include "localmem.h" #include "rbTree.h" static struct rbTreeNode *restructure(struct rbTree *t, int tos, struct rbTreeNode *x, struct rbTreeNode *y, struct rbTreeNode *z) /* General restructuring function - checks for all * restructuring cases. Call when insert has messed up tree. * Sadly delete has to do even more work. */ { struct rbTreeNode *parent, *midNode; if(y == x->left) { if(z == y->left) { /* in-order: z, y, x */ midNode = y; y->left = z; x->left = y->right; y->right = x; } else { /* in-order: y, z, x */ midNode = z; y->right = z->left; z->left = y; x->left = z->right; z->right = x; } } else { if(z == y->left) { /* in-order: x, z, y */ midNode = z; x->right = z->left; z->left = x; y->left = z->right; z->right = y; } else { /* in-order: x, y, z */ midNode = y; x->right = y->left; y->left = x; y->right = z; } } if(tos != 0) { parent = t->stack[tos-1]; if(x == parent->left) parent->left = midNode; else parent->right = midNode; } else t->root = midNode; return midNode; } struct rbTree *rbTreeNewDetailed(int (*compare)(void *, void *), struct lm *lm, struct rbTreeNode *stack[128]) /* Allocate rbTree on an existing local memory & stack. This is for cases * where you want a lot of trees, and don't want the overhead for each one. * Note, to clean these up, just do freez(&rbTree) rather than rbFreeTree(&rbTree). */ { struct rbTree *t; AllocVar(t); t->root = NULL; t->compare = compare; t->lm = lm; t->stack = stack; t->n = 0; return t; } struct rbTree *rbTreeNew(int (*compare)(void *, void *)) /* rbTreeNew() - Allocates space for a red-black tree and returns a pointer * to it. The function compare compares they keys of two items, and returns a * negative, zero, or positive integer depending on whether the first item is * less than, equal to, or greater than the second. */ { /* The stack keeps us from having to keep explicit * parent, grandparent, greatgrandparent variables. * It needs to be big enough for the maximum depth * of tree. Since the whole point of rb trees is * that they are self-balancing, this is not all * that deep, just 2*log2(N). Therefore a stack of * 128 is good for up to 2^64 items in stack, which * should keep us for the next couple of decades... */ struct lm *lm = lmInit(0); struct rbTreeNode **stack = lmAlloc(lm, 128 * sizeof(stack[0])); return rbTreeNewDetailed(compare, lm, stack); } void rbTreeFree(struct rbTree **pTree) /* rbTreeFree() - Frees space used by the red-black tree pointed to by t. */ { struct rbTree *tree = *pTree; if (tree != NULL) { lmCleanup(&tree->lm); freez(pTree); } } void *rbTreeAdd(struct rbTree *t, void *item) /* rbTreeAdd() - Inserts an item into the red-black tree pointed to by t, * according the the value its key. The key of an item in the red-black * tree must be unique among items in the tree. If an item with the same key * already exists in the tree, a pointer to that item is returned. Otherwise, * NULL is returned, indicating insertion was successful. */ { struct rbTreeNode *x, *p, *q, *m, **attachX; int (* compare)(void *, void *); int cmpResult; rbTreeColor col; struct rbTreeNode **stack = NULL; int tos; tos = 0; if((p = t->root) != NULL) { compare = t->compare; stack = t->stack; /* Repeatedly explore either the left branch or the right branch * depending on the value of the key, until an empty branch is chosen. */ for(;;) { stack[tos++] = p; cmpResult = compare(item, p->item); if(cmpResult < 0) { p = p->left; if(!p) { p = stack[--tos]; attachX = &p->left; break; } } else if(cmpResult > 0) { p = p->right; if(!p) { p = stack[--tos]; attachX = &p->right; break; } } else { return p->item; } } col = rbTreeRed; } else { attachX = &t->root; col = rbTreeBlack; } /* Allocate new node and place it in tree. */ if ((x = t->freeList) != NULL) t->freeList = x->right; else lmAllocVar(t->lm, x); x->left = x->right = NULL; x->item = item; x->color = col; *attachX = x; t->n++; /* Restructuring or recolouring will be needed if node x and its parent, p, * are both red. */ if(tos > 0) { while(p->color == rbTreeRed) { /* Double red problem. */ /* Obtain a pointer to p's parent, m, and sibling, q. */ m = stack[--tos]; q = p == m->left ? m->right : m->left; /* Determine whether restructuring or recolouring is needed. */ if(!q || q->color == rbTreeBlack) { /* Sibling is black. ==> Perform restructuring. */ /* Restructure according to the left to right order, of nodes * m, p, and x. */ m = restructure(t, tos, m, p, x); m->color = rbTreeBlack; m->left->color = m->right->color = rbTreeRed; /* Restructuring eliminates the double red problem. */ break; } /* else just need to flip color */ /* Sibling is also red. ==> Perform recolouring. */ p->color = rbTreeBlack; q->color = rbTreeBlack; if(tos == 0) break; /* The root node always remains black. */ m->color = rbTreeRed; /* Continue, checking colouring higher up. */ x = m; p = stack[--tos]; } } return NULL; } void *rbTreeFind(struct rbTree *t, void *item) /* rbTreeFind() - Find an item in the red-black tree with the same key as the * item pointed to by `item'. Returns a pointer to the item found, or NULL * if no item was found. */ { struct rbTreeNode *p, *nextP; int (*compare)(void *, void *) = t->compare; int cmpResult; /* Repeatedly explore either the left or right branch, depending on the * value of the key, until the correct item is found. */ for (p = t->root; p != NULL; p = nextP) { cmpResult = compare(item, p->item); if(cmpResult < 0) nextP = p->left; else if(cmpResult > 0) nextP = p->right; else return p->item; } return NULL; } void *rbTreeRemove(struct rbTree *t, void *item) /* rbTreeRemove() - Delete an item in the red-black tree with the same key as * the item pointed to by `item'. Returns a pointer to the deleted item, * and NULL if no item was found. */ { struct rbTreeNode *p, *r, *x, *y, *z, *b, *newY; struct rbTreeNode *m; rbTreeColor removeCol; void *returnItem; int (* compare)(void *, void *); int cmpResult; struct rbTreeNode **stack; int i, tos; /* Attempt to locate the item to be deleted. */ if((p = t->root)) { compare = t->compare; stack = t->stack; tos = 0; for(;;) { stack[tos++] = p; cmpResult = compare(item, p->item); if(cmpResult < 0) p = p->left; else if(cmpResult > 0) p = p->right; else /* Item found. */ break; if(!p) return NULL; } } else return NULL; /* p points to the node to be deleted, and is currently on the top of the * stack. */ if(!p->left) { tos--; /* Adjust tos to remove p. */ /* Right child replaces p. */ if(tos == 0) { r = t->root = p->right; x = y = NULL; } else { x = stack[--tos]; if(p == x->left) { r = x->left = p->right; y = x->right; } else { r = x->right = p->right; y = x->left; } } removeCol = p->color; } else if(!p->right) { tos--; /* Adjust tos to remove p. */ /* Left child replaces p. */ if(tos == 0) { r = t->root = p->left; x = y = NULL; } else { x = stack[--tos]; if(p == x->left) { r = x->left = p->left; y = x->right; } else { r = x->right = p->left; y = x->left; } } removeCol = p->color; } else { /* Save p's stack position. */ i = tos-1; /* Minimum child, m, in the right subtree replaces p. */ m = p->right; do { stack[tos++] = m; m = m->left; } while(m); m = stack[--tos]; /* Update either the left or right child pointers of p's parent. */ if(i == 0) { t->root = m; } else { x = stack[i-1]; /* p's parent. */ if(p == x->left) { x->left = m; } else { x->right = m; } } /* Update the tree part m is removed from, and assign m the child * pointers of p (only if m is not the right child of p). */ stack[i] = m; /* Node m replaces node p on the stack. */ x = stack[--tos]; r = m->right; if(tos != i) { /* x is equal to the parent of m. */ y = x->right; x->left = r; m->right = p->right; } else { /* m was the right child of p, and x is equal to m. */ y = p->left; } m->left = p->left; /* We treat node m as the node which has been removed. */ removeCol = m->color; m->color = p->color; } /* Get return value and reuse the space used by node p. */ returnItem = p->item; p->right = t->freeList; t->freeList = p; t->n--; /* The pointers x, y, and r point to nodes which may be involved in * restructuring and recolouring. * x - the parent of the removed node. * y - the sibling of the removed node. * r - the node which replaced the removed node. * From the above code, the next entry off the stack will be the parent of * node x. */ /* The number of black nodes on paths to all external nodes (NULL child * pointers) must remain the same for all paths. Restructuring or * recolouring of nodes may be necessary to enforce this. */ if(removeCol == rbTreeBlack) { /* Removal of a black node requires some adjustment. */ if(!r || r->color == rbTreeBlack) { /* A black node replaced the deleted black node. Note that * external nodes (NULL child pointers) are always black, so * if r is NULL it is treated as a black node. */ /* This causes a double-black problem, since node r would need to * be coloured double-black in order for the black color on * paths through r to remain the same as for other paths. */ /* If r is the root node, the double-black color is not necessary * to maintain the color balance. Otherwise, some adjustment of * nearby nodes is needed in order to eliminate the double-black * problem. NOTE: x points to the parent of r. */ if(x) for(;;) { /* There are three adjustment cases: * 1. r's sibling, y, is black and has a red child, z. * 2. r's sibling, y, is black and has two black children. * 3. r's sibling, y, is red. */ if(y->color == rbTreeBlack) { /* Note the conditional evaluation for assigning z. */ if(((z = y->left) && z->color == rbTreeRed) || ((z = y->right) && z->color == rbTreeRed)) { /* Case 1: perform a restructuring of nodes x, y, and * z. */ b = restructure(t, tos, x, y, z); b->color = x->color; b->left->color = b->right->color = rbTreeBlack; break; } else { /* Case 2: recolour node y red. */ y->color = rbTreeRed; if(x->color == rbTreeRed) { x->color = rbTreeBlack; break; } /* else */ if(tos == 0) break; /* Root level reached. */ /* else */ r = x; x = stack[--tos]; /* x <- parent of x. */ y = x->left == r ? x->right : x->left; } } else { /* Case 3: Restructure nodes x, y, and z, where: * - If node y is the left child of x, then z is the left * child of y. Otherwise z is the right child of y. */ if(x->left == y) { newY = y->right; z = y->left; } else { newY = y->left; z = y->right; } restructure(t, tos, x, y, z); y->color = rbTreeBlack; x->color = rbTreeRed; /* Since x has moved down a place in the tree, and y is the * new the parent of x, the stack must be adjusted so that * the parent of x is correctly identified in the next call * to restructure(). */ stack[tos++] = y; /* After restructuring, node r has a black sibling, newY, * so either case 1 or case 2 applies. If case 2 applies * the double-black problem does not reappear. */ y = newY; /* Note the conditional evaluation for assigning z. */ if(((z = y->left) && z->color == rbTreeRed) || ((z = y->right) && z->color == rbTreeRed)) { /* Case 1: perform a restructuring of nodes x, y, and * z. */ b = restructure(t, tos, x, y, z); b->color = rbTreeRed; /* Since node x was red. */ b->left->color = b->right->color = rbTreeBlack; } else { /* Case 2: recolour node y red. */ /* Note that node y is black and node x is red. */ y->color = rbTreeRed; x->color = rbTreeBlack; } break; } } } else { /* A red node replaced the deleted black node. */ /* In this case we can simply color the red node black. */ r->color = rbTreeBlack; } } return returnItem; } /* Some variables to help recursively dump tree. */ static int dumpLevel; /* Indentation level. */ static FILE *dumpFile; /* Output file */ static void (*dumpIt)(void *item, FILE *f); /* Item dumper. */ static void rTreeDump(struct rbTreeNode *n) /* Recursively dump. */ { if (n == NULL) return; spaceOut(dumpFile, ++dumpLevel * 3); fprintf(dumpFile, "%c ", (n->color == rbTreeRed ? 'r' : 'b')); dumpIt(n->item, dumpFile); fprintf(dumpFile, "\n"); rTreeDump(n->left); rTreeDump(n->right); --dumpLevel; } /* Variables to help recursively traverse tree. */ static void (*doIt)(void *item); static void *minIt, *maxIt; static int (*compareIt)(void *, void *); static void rTreeTraverseRange(struct rbTreeNode *n) /* Recursively traverse tree in range applying doIt. */ { if (n != NULL) { int minCmp = compareIt(n->item, minIt); int maxCmp = compareIt(n->item, maxIt); if (minCmp >= 0) rTreeTraverseRange(n->left); if (minCmp >= 0 && maxCmp <= 0) doIt(n->item); if (maxCmp <= 0) rTreeTraverseRange(n->right); } } static void rTreeTraverse(struct rbTreeNode *n) /* Recursively traverse full tree applying doIt. */ { if (n != NULL) { rTreeTraverse(n->left); doIt(n->item); rTreeTraverse(n->right); } } void rbTreeTraverseRange(struct rbTree *tree, void *minItem, void *maxItem, void (*doItem)(void *item)) /* Apply doItem function to all items in tree such that * minItem <= item <= maxItem */ { doIt = doItem; minIt = minItem; maxIt = maxItem; compareIt = tree->compare; rTreeTraverseRange(tree->root); } void rbTreeTraverse(struct rbTree *tree, void (*doItem)(void *item)) /* Apply doItem function to all items in tree */ { doIt = doItem; rTreeTraverse(tree->root); } struct rTreeContext /* Context for traversing a tree when you want to be fully thread safe and reentrant. */ { void *context; /* Some context carried from user and passed to doIt. */ void (*doItem)(void *item, void *context); }; static void rTreeTraverseWithContext(struct rbTreeNode *n, struct rTreeContext *context) /* Traverse tree with a little context so don't need little static variables that * prevent reentrancy of callback functions. */ { if (n != NULL) { rTreeTraverseWithContext(n->left, context); context->doItem(n->item, context->context); rTreeTraverseWithContext(n->right, context); } } void rbTreeTraverseWithContext(struct rbTree *tree, void (*doItem)(void *item, void *context), void *context) /* Traverse tree calling doItem on every item with context pointer passed through to doItem. * This often avoids having to declare global or static variables for the doItem callback to use. */ { struct rTreeContext ctx; ctx.context = context; ctx.doItem = doItem; rTreeTraverseWithContext(tree->root, &ctx); } struct slRef *itList; /* List of items that rbTreeItemsInRange returns. */ static void addRef(void *item) /* Add item it itList. */ { refAdd(&itList, item); } static void addRefWithContext(void *item, void *context) /* Add item it itList. */ { struct slRef **pList = context; refAdd(pList, item); } rtracklayer/src/ucsc/rbTree.h0000644000175100017510000000641614614231172017245 0ustar00biocbuildbiocbuild/* rbTree - rbTreeRed-rbTreeBlack Tree - a type of binary tree which * automatically keeps relatively balanced during * inserts and deletions. * original author: Shane Saunders * adapted into local conventions: Jim Kent */ #ifndef RBTREE_H #define RBTREE_H typedef enum {rbTreeRed,rbTreeBlack} rbTreeColor; /* Structure type for nodes in the red-black tree. */ struct rbTreeNode { struct rbTreeNode *left, *right; /* Children. */ rbTreeColor color; /* Heart of algorithm. */ void *item; /* Item stored in tree */ }; /* Structure type for the red-black tree. */ struct rbTree { struct rbTree *next; /* Next tree in list. */ struct rbTreeNode *root; /* Root of tree */ int n; /* Number of items in tree. */ int (* compare)(void *, void *);/* Comparison function */ struct rbTreeNode **stack; /* Ancestor stack. */ struct lm *lm; /* Local memory pool. */ struct rbTreeNode *freeList; /* List of nodes to reuse. */ }; struct rbTree *rbTreeNew(int (*compare)(void *, void *)); /* Allocates space for a red-black tree and returns a pointer * to it. The function compare compares they keys of two items, and returns a * negative, zero, or positive integer depending on whether the first item is * less than, equal to, or greater than the second. */ void rbTreeFree(struct rbTree **pTree); /* Frees space used by the red-black tree pointed to by t. */ struct rbTree *rbTreeNewDetailed(int (*compare)(void *, void *), struct lm *lm, struct rbTreeNode *stack[128]); /* Allocate rbTree on an existing local memory & stack. This is for cases * where you want a lot of trees, and don't want the overhead for each one. * Note, to clean these up, just do freez(&rbTree) rather than rbFreeTree(&rbTree). */ void *rbTreeAdd(struct rbTree *t, void *item); /* Inserts an item into the red-black tree pointed to by t, * according the the value its key. The key of an item in the red-black * tree must be unique among items in the tree. If an item with the same key * already exists in the tree, a pointer to that item is returned. Otherwise, * NULL is returned, indicating insertion was successful. */ void *rbTreeFind(struct rbTree *t, void *item); /* Find an item in the red-black tree with the same key as the * item pointed to by `item'. Returns a pointer to the item found, or NULL * if no item was found. */ void *rbTreeRemove(struct rbTree *t, void *item); /* rbTreeRemove() - Delete an item in the red-black tree with the same key as * the item pointed to by `item'. Returns a pointer to the deleted item, * and NULL if no item was found. */ void rbTreeTraverseRange(struct rbTree *tree, void *minItem, void *maxItem, void (*doItem)(void *item)); /* Apply doItem function to all items in tree such that * minItem <= item <= maxItem */ void rbTreeTraverse(struct rbTree *tree, void (*doItem)(void *item)); /* Apply doItem function to all items in tree */ void rbTreeTraverseWithContext(struct rbTree *tree, void (*doItem)(void *item, void *context), void *context); /* Traverse tree calling doItem on every item with context pointer passed through to doItem. * This often avoids having to declare global or static variables for the doItem callback to use. */ #endif /* RBTREE_H */ rtracklayer/src/ucsc/sig.h0000644000175100017510000000625214614231172016602 0ustar00biocbuildbiocbuild/***************************************************************************** * Copyright (C) 2000 Jim Kent. This source code may be freely used * * for personal, academic, and non-profit purposes. Commercial use * * permitted only by explicit agreement with Jim Kent (jim_kent@pacbell.net) * *****************************************************************************/ /* Sig.h - signatures that start various binary files. */ #ifndef SIG_H #define SIG_H #define aliSig 0xCDAB8245 /* Binary alignment file. */ #define alxSig 0xA1B1C1D3 /* Index into binary alignment file, sorted by start base offset. */ #define pgoSig 0x690 /* Index into GDF file, sorted by start base offset. Signature is 32 bit. */ #define cdoSig 0xCD01 /* Index into c2g text file, sorted by start base offset. 32 bit signature. */ #define xaoSig 0xA0B0C0D0 /* Index into xeno alignment, sorted by start base offset. 32 bit signature. */ #define glSig 0xF1E2D3C4 /* Binary gene file, sorted by chromosome and then starting offset. */ /* IX sig is int ixSig[4] = {0x693F8ED1, 0x7EDA1C32, 0x4BA58983, 0x277CB89C,}; * These are made by snofMake, and are indexes sorted by name. */ /* XI - same as IX but on big-endian (or is it little-endian) archetectures. */ #define nt4Signature 0x12345678 /* Signature at the beginning of an nt4 file - 2 bit a nucleotide binary file. */ #define lm2Signature 0x12131416 /* Signature at the beginning of a lm2 file - a 2nd order markov model for nucleotides. */ #define oocSig 0x584155f2 /* Signature of file that contains over-represented oligomers for patSpace * algorithm. */ #define oocSigSwapped 0xf2554158 /* Signature of file that contains over-represented oligomers for patSpace * algorithm. */ #define fofSig 0x13410da8 /* Signature into fof type index file (that can index multiple external files). */ #define nibSig 0x6BE93D3A /* Signature into nib file (4 bits per nucleotide DNA file) */ #define qacSig 0x32b67998 /* Signature of qac file (compressed quality file) */ #define caqSig 0x9879b632 /* Signature of byte-swapped qac file. */ #define twoBitSig 0x1A412743 /* Signature into 2bit file (2 bits per nucleotide DNA file) plus * information on N and masked bases. */ #define twoBitSwapSig 0x4327411A /* Signature of byte-swapped two-bit file. */ #define chromGraphSig 0x4528421C /* Signature of chromGraph binary data file */ #define chromGraphSwapSig 0x1C422845 /* Signature of byte-swapped chromGraph binary data file */ #define genomeRangeTreeSig 0xf7fb8104 /* Signature of genomeRangeTree binary data file */ #define genomeRangeTreeSwapSig 0x0481fbf7 /* Signature of genomeRangeTree binary data file */ #define bptSig 0x78CA8C91 /* Signature of generic b+ tree index file. */ #define bptSwapped 0x918CCA78 /* Signature of generic b+ tree index file. */ #define cirTreeSig 0x2468ACE0 /* Signature of a chromosome id r-tree index file. */ #define crTreeSig 0x2369ADE1 /* Signature of a chromosome r-tree index file. */ #define bigWigSig 0x888FFC26 /* Signature for a big wig file. */ #define bigBedSig 0x8789F2EB /* Signature for a big bed file. */ #define udcBitmapSig 0x4187E2F6 /* Signature for a url data cache bitmap file. */ #endif /* SIG_H */ rtracklayer/src/ucsc/sqlList.c0000644000175100017510000001206014614231172017440 0ustar00biocbuildbiocbuild/* Stuff for processing comma separated lists - a little long so * in a separate module from jksql.c though interface is still * in jksql.c. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ /* The various static routines sqlStaticArray are NOT thread-safe. */ #include "common.h" #include "sqlNum.h" #include "sqlList.h" #include "dystring.h" #include "hash.h" int sqlDoubleArray(char *s, double *array, int maxArraySize) /* Convert comma separated list of floating point numbers to an array. * Pass in array and max size of array. */ { unsigned count = 0; for (;;) { char *e; if (s == NULL || s[0] == 0 || count == maxArraySize) break; e = strchr(s, ','); if (e != NULL) *e++ = 0; array[count++] = atof(s); s = e; } return count; } int sqlFloatArray(char *s, float *array, int maxArraySize) /* Convert comma separated list of floating point numbers to an array. * Pass in array and max size of array. */ { unsigned count = 0; for (;;) { char *e; if (s == NULL || s[0] == 0 || count == maxArraySize) break; e = strchr(s, ','); if (e != NULL) *e++ = 0; array[count++] = atof(s); s = e; } return count; } void sqlFloatDynamicArray(char *s, float **retArray, int *retSize) /* Convert comma separated list of numbers to an dynamically allocated * array, which should be freeMem()'d when done. Thread-safe. */ { float *array = NULL; int count = 0; if (s) { count = countSeparatedItems(s, ','); if (count > 0) { AllocArray(array, count); count = 0; for (;;) { array[count++] = sqlFloatInList(&s); if (*s++ == 0) break; if (*s == 0) break; } } } *retArray = array; *retSize = count; } void sqlSignedDynamicArray(char *s, int **retArray, int *retSize) /* Convert comma separated list of numbers to an dynamically allocated * array, which should be freeMem()'d when done. Thread-safe. */ { int *array = NULL; int count = 0; if (s) { count = countSeparatedItems(s, ','); if (count > 0) { AllocArray(array, count); count = 0; for (;;) { array[count++] = sqlSignedInList(&s); if (*s++ == 0) break; if (*s == 0) break; } } } *retArray = array; *retSize = count; } int sqlUnsignedComma(char **pS) /* Return signed number at *pS. Advance *pS past comma at end */ { char *s = *pS; char *e = strchr(s, ','); unsigned ret; *e++ = 0; *pS = e; ret = sqlUnsigned(s); return ret; } int sqlSignedComma(char **pS) /* Return signed number at *pS. Advance *pS past comma at end */ { char *s = *pS; char *e = strchr(s, ','); int ret; *e++ = 0; *pS = e; ret = sqlSigned(s); return ret; } float sqlFloatComma(char **pS) /* Return signed number at *pS. Advance *pS past comma at end */ { char *s = *pS; char *e = strchr(s, ','); float ret; *e++ = 0; *pS = e; ret = atof(s); return ret; } static char *findStringEnd(char *start, char endC) /* Return end of string. */ { char c; char *s = start; for (;;) { c = *s; if (c == endC) return s; else if (c == 0) errAbort("Unterminated string"); ++s; } } static char *sqlGetOptQuoteString(char **pS) /* Return string at *pS. (Either quoted or not.) Advance *pS. */ { char *s = *pS; char *e; char c = *s; if (c == '"' || c == '\'') { s += 1; e = findStringEnd(s, c); *e++ = 0; if (*e++ != ',') errAbort("Expecting comma after string"); } else { e = strchr(s, ','); *e++ = 0; } *pS = e; return s; } char *sqlStringComma(char **pS) /* Return string at *pS. (Either quoted or not.) Advance *pS. */ { return cloneString(sqlGetOptQuoteString(pS)); } void sqlFixedStringComma(char **pS, char *buf, int bufSize) /* Copy string at *pS to buf. Advance *pS. */ { strncpy(buf, sqlGetOptQuoteString(pS), bufSize); } char *sqlEatChar(char *s, char c) /* Make sure next character is 'c'. Return past next char */ { if (*s++ != c) errAbort("Expecting %c got %c (%d) in database", c, s[-1], s[-1]); return s; } static struct hash *buildSymHash(char **values, boolean isEnum) /* build a hash of values for either enum or set symbolic column */ { struct hash *valHash = hashNew(0); unsigned setVal = 1; /* not used for enum */ int iVal; for (iVal = 0; values[iVal] != NULL; iVal++) { if (isEnum) hashAddInt(valHash, values[iVal], iVal); else { hashAddInt(valHash, values[iVal], setVal); setVal = setVal << 1; } } return valHash; } unsigned sqlEnumParse(char *valStr, char **values, struct hash **valHashPtr) /* parse an enumerated column value */ { if (*valHashPtr == NULL) *valHashPtr = buildSymHash(values, TRUE); return hashIntVal(*valHashPtr, valStr); } unsigned sqlSetParse(char *valStr, char **values, struct hash **valHashPtr) /* parse a set column value */ { if (*valHashPtr == NULL) *valHashPtr = buildSymHash(values, FALSE); /* parse comma separated string */ unsigned value = 0; char *val = strtok(valStr, ","); while (val != NULL) { value |= hashIntVal(*valHashPtr, val); val = strtok(NULL, ","); } return value; } rtracklayer/src/ucsc/sqlList.h0000644000175100017510000000400214614231172017442 0ustar00biocbuildbiocbuild/* Stuff for processing comma separated lists . * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef SQLLIST_H #define SQLLIST_H struct hash; int sqlDoubleArray(char *s, double *array, int maxArraySize); /* Return sum of double values in a comma-separated list */ int sqlFloatArray(char *s, float *array, int maxArraySize); void sqlFloatDynamicArray(char *s, float **retArray, int *retSize); void sqlSignedDynamicArray(char *s, int **retArray, int *retSize); char *sqlEscapeString(const char *orig); /* Prepares string for inclusion in a SQL statement . Remember to free * returned string. returned string contains strlen(length)*2+1 as many bytes * as orig because in worst case every character has to be escaped. * Example 1: The Gene's Name -> The Gene''s Name * Example 2: he said "order and orient" -> he said ""order and orient"" */ char *sqlEscapeString2(char *to, const char* from); /* Prepares a string for inclusion in a sql statement. Output string * must be 2*strlen(from)+1 */ int sqlUnsignedComma(char **pS); /* Return signed number at *pS. Advance *pS past comma at end. * This function is used by the system that automatically loads * structured object from longblobs. */ int sqlSignedComma(char **pS); /* Return signed number at *pS. Advance *pS past comma at end */ float sqlFloatComma(char **pS); /* Return floating point number at *pS. Advance *pS past comma at end */ char *sqlStringComma(char **pS); /* Return string at *pS. (Either quoted or not.) Advance *pS. */ void sqlFixedStringComma(char **pS, char *buf, int bufSize); /* Copy string at *pS to buf. Advance *pS. */ char *sqlEatChar(char *s, char c); /* Make sure next character is 'c'. Return past next char */ unsigned sqlEnumParse(char *valStr, char **values, struct hash **valHashPtr); /* parse an enumerated column value */ unsigned sqlSetParse(char *valStr, char **values, struct hash **valHashPtr); /* parse a set column value */ #endif /* SQLLIST_H */ rtracklayer/src/ucsc/sqlNum.c0000644000175100017510000001205514614231172017270 0ustar00biocbuildbiocbuild/* sqlnum.c - Routines to convert from ascii to integer * representation of numbers. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "sqlNum.h" /* The sqlInList functions allow for fast thread-safe processing of dynamic arrays in sqlList */ unsigned sqlUnsigned(char *s) /* Convert series of digits to unsigned integer about * twice as fast as atoi (by not having to skip white * space or stop except at the null byte.) */ { unsigned res = 0; char *p = s; char c; while (((c = *(p++)) >= '0') && (c <= '9')) { res *= 10; res += c - '0'; } --p; /* test for invalid character or empty */ if ((c != '\0') || (p == s)) errAbort("invalid unsigned integer: \"%s\"", s); return res; } unsigned sqlUnsignedInList(char **pS) /* Convert series of digits to unsigned integer about * twice as fast as atoi (by not having to skip white * space or stop except at the null byte.) * All of string is number. Number may be delimited by a comma. * Returns the position of the delimiter or the terminating 0. */ { char *s = *pS; unsigned res = 0; char *p = s; char c; while (((c = *(p++)) >= '0') && (c <= '9')) { res *= 10; res += c - '0'; } --p; if (!(c == '\0' || c == ',') || (p == s)) { char *e = strchr(s, ','); if (e) *e = 0; errAbort("invalid unsigned integer: \"%s\"", s); } *pS = p; return res; } int sqlSigned(char *s) /* Convert string to signed integer. Unlike atol assumes * all of string is number. */ { int res = 0; char *p, *p0 = s; if (*p0 == '-') p0++; p = p0; while ((*p >= '0') && (*p <= '9')) { res *= 10; res += *p - '0'; p++; } /* test for invalid character, empty, or just a minus */ if ((*p != '\0') || (p == p0)) errAbort("invalid signed integer: \"%s\"", s); if (*s == '-') return -res; else return res; } int sqlSignedInList(char **pS) /* Convert string to signed integer. Unlike atol assumes * all of string is number. Number may be delimited by a comma. * Returns the position of the delimiter or the terminating 0. */ { char *s = *pS; int res = 0; char *p, *p0 = s; if (*p0 == '-') p0++; p = p0; while ((*p >= '0') && (*p <= '9')) { res *= 10; res += *p - '0'; p++; } /* test for invalid character, empty, or just a minus */ if (!(*p == '\0' || *p == ',') || (p == p0)) { char *e = strchr(s, ','); if (e) *e = 0; errAbort("invalid signed integer: \"%s\"", s); } *pS = p; if (*s == '-') return -res; else return res; } long long sqlLongLong(char *s) /* Convert string to a long long. Unlike atol assumes all of string is * number. */ { long long res = 0; char *p, *p0 = s; if (*p0 == '-') p0++; p = p0; while ((*p >= '0') && (*p <= '9')) { res *= 10; res += *p - '0'; p++; } /* test for invalid character, empty, or just a minus */ if ((*p != '\0') || (p == p0)) errAbort("invalid signed long long: \"%s\"", s); if (*s == '-') return -res; else return res; } long long sqlLongLongInList(char **pS) /* Convert string to a long long. Unlike atol, assumes * all of string is number. Number may be delimited by a comma. * Returns the position of the delimiter or the terminating 0. */ { char *s = *pS; long long res = 0; char *p, *p0 = s; if (*p0 == '-') p0++; p = p0; while ((*p >= '0') && (*p <= '9')) { res *= 10; res += *p - '0'; p++; } /* test for invalid character, empty, or just a minus */ if (!(*p == '\0' || *p == ',') || (p == p0)) { char *e = strchr(s, ','); if (e) *e = 0; errAbort("invalid signed long long: \"%s\"", s); } *pS = p; if (*s == '-') return -res; else return res; } float sqlFloatInList(char **pS) /* Convert string to a float. Assumes all of string is number * and aborts on an error. * Number may be delimited by a comma. * Returns the position of the delimiter or the terminating 0. */ { char *s = *pS; char* end; /* used to have an ifdef here to use strtof() but that doesn't * actually exist on all systems and since strtod() does, may as * well use it since it will do the job here. */ float val = (float) strtod(s, &end); if ((end == s) || !(*end == '\0' || *end == ',')) { char *e = strchr(s, ','); if (e) *e = 0; errAbort("invalid float: %s", s); } *pS = end; return val; } double sqlDouble(char *s) /* Convert string to a double. Assumes all of string is number * and aborts on an error. */ { char* end; double val = strtod(s, &end); if ((end == s) || (*end != '\0')) errAbort("invalid double: %s", s); return val; } double sqlDoubleInList(char **pS) /* Convert string to a double. Assumes all of string is number * and aborts on an error. * Number may be delimited by a comma. * Returns the position of the delimiter or the terminating 0. */ { char *s = *pS; char* end; double val = strtod(s, &end); if ((end == s) || !(*end == '\0' || *end == ',')) { char *e = strchr(s, ','); if (e) *e = 0; errAbort("invalid double: %s", s); } *pS = end; return val; } rtracklayer/src/ucsc/sqlNum.h0000644000175100017510000000471414614231172017300 0ustar00biocbuildbiocbuild/* sqlNum.h - routines to convert from ascii to * unsigned/integer a bit more quickly than atoi. * Called sqlNum because it was first developed for use with * SQL databases, which tend to require a lot of conversion from * string to binary representation of numbers. In particular the * code generator AutoSQL puts in lots of calls to these routines * into it's parsers. Other parser in the source tree have come * to use these too though since they are fast and have good error * checking. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef SQLNUM_H #define SQLNUM_H /* get off_t */ #include unsigned sqlUnsigned(char *s); /* Convert series of digits to unsigned integer about * twice as fast as atoi (by not having to skip white * space or stop except at the null byte.) */ unsigned sqlUnsignedInList(char **pS); /* Convert series of digits to unsigned integer about * twice as fast as atoi (by not having to skip white * space or stop except at the null byte.) * All of string is number. Number may be delimited by a comma. * Returns the position of the delimiter or the terminating 0. */ int sqlSigned(char *s); /* Convert string to signed integer. Unlike atol assumes * all of string is number. */ int sqlSignedInList(char **pS); /* Convert string to signed integer. Unlike atol assumes * all of string is number. Number may be delimited by a comma. * Returns the position of the delimiter or the terminating 0. */ long long sqlLongLong(char *s); /* Convert string to a long long. Unlike atol assumes all of string is * number. */ long long sqlLongLongInList(char **pS); /* Convert string to a long long. Unlike atol, assumes * all of string is number. Number may be delimited by a comma. * Returns the position of the delimiter or the terminating 0. */ float sqlFloatInList(char **pS); /* Convert string to a float. Assumes all of string is number * and aborts on an error. * Number may be delimited by a comma. * Returns the position of the delimiter or the terminating 0. */ double sqlDouble(char *s); /* Convert string to a double. Assumes all of string is number * and aborts on an error. */ double sqlDoubleInList(char **pS); /* Convert string to a double. Assumes all of string is number * and aborts on an error. * Number may be delimited by a comma. * Returns the position of the delimiter or the terminating 0. */ #endif /* SQLNUM_H */ rtracklayer/src/ucsc/tokenizer.c0000644000175100017510000001011314614231172020014 0ustar00biocbuildbiocbuild/* tokenizer - A tokenizer structure that will chop up file into * tokens. It is aware of quoted strings and otherwise tends to return * white-space or punctuated-separated words, with punctuation in * a separate token. This is used by autoSql. */ /* Copyright (C) 2011 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "errAbort.h" #include "linefile.h" #include "tokenizer.h" struct tokenizer *tokenizerOnLineFile(struct lineFile *lf) /* Create a new tokenizer on open lineFile. */ { struct tokenizer *tkz; AllocVar(tkz); tkz->sAlloc = 128; tkz->string = needMem(tkz->sAlloc); tkz->lf = lf; tkz->curLine = tkz->linePt = ""; return tkz; } void tokenizerFree(struct tokenizer **pTkz) /* Tear down a tokenizer. */ { struct tokenizer *tkz; if ((tkz = *pTkz) != NULL) { freeMem(tkz->string); lineFileClose(&tkz->lf); freez(pTkz); } } int tokenizerLineCount(struct tokenizer *tkz) /* Return line of current token. */ { return tkz->lf->lineIx; } char *tokenizerFileName(struct tokenizer *tkz) /* Return name of file. */ { return tkz->lf->fileName; } char *tokenizerNext(struct tokenizer *tkz) /* Return token's next string (also available as tkz->string) or * NULL at EOF. */ { char *start, *end; char c, *s; int size; if (tkz->reuse) { tkz->reuse = FALSE; return tkz->string; } tkz->leadingSpaces = 0; for (;;) /* Skip over white space and comments. */ { int lineSize; s = start = skipLeadingSpaces(tkz->linePt); tkz->leadingSpaces += s - tkz->linePt; if ((c = start[0]) != 0) { if (tkz->uncommentC && c == '/') { if (start[1] == '/') ; /* Keep going in loop effectively ignoring rest of line. */ else if (start[1] == '*') { start += 2; for (;;) { char *end = stringIn("*/", start); if (end != NULL) { tkz->linePt = end+2; break; } if (!lineFileNext(tkz->lf, &tkz->curLine, &lineSize)) errAbort("End of file (%s) in comment", tokenizerFileName(tkz)); start = tkz->curLine; } continue; } else break; } else if (tkz->uncommentShell && c == '#') ; /* Keep going in loop effectively ignoring rest of line. */ else break; /* Got something real. */ } if (!lineFileNext(tkz->lf, &tkz->curLine, &lineSize)) { tkz->eof = TRUE; return NULL; } tkz->leadingSpaces += 1; tkz->linePt = tkz->curLine; } if (isalnum(c) || (c == '_')) { for (;;) { s++; if (!(isalnum(*s) || (*s == '_'))) break; } end = s; } else if (c == '"' || c == '\'') { char quot = c; if (tkz->leaveQuotes) start = s++; else start = ++s; for (;;) { c = *s; if (c == quot) { if (s[-1] == '\\') { if (s >= start+2 && s[-2] == '\\') break; } else break; } else if (c == 0) { break; } ++s; } end = s; if (c != 0) ++s; if (tkz->leaveQuotes) end += 1; } else { end = ++s; } tkz->linePt = s; size = end - start; if (size >= tkz->sAlloc) { tkz->sAlloc = size+128; tkz->string = needMoreMem(tkz->string, 0, tkz->sAlloc); } memcpy(tkz->string, start, size); tkz->string[size] = 0; return tkz->string; } void tokenizerErrAbort(struct tokenizer *tkz, char *format, ...) /* Print error message followed by file and line number and * abort. */ { va_list args; va_start(args, format); vaWarn(format, args); errAbort("line %d of %s:\n%s", tokenizerLineCount(tkz), tokenizerFileName(tkz), tkz->curLine); } char *tokenizerMustHaveNext(struct tokenizer *tkz) /* Get next token, which must be there. */ { char *s = tokenizerNext(tkz); if (s == NULL) errAbort("Unexpected end of input line %d of %s", tkz->lf->lineIx, tkz->lf->fileName); return s; } void tokenizerMustMatch(struct tokenizer *tkz, char *string) /* Require next token to match string. Return next token * if it does, otherwise abort. */ { if (sameWord(tkz->string, string)) tokenizerMustHaveNext(tkz); else tokenizerErrAbort(tkz, "Expecting %s got %s", string, tkz->string); } rtracklayer/src/ucsc/tokenizer.h0000644000175100017510000000423714614231172020033 0ustar00biocbuildbiocbuild/* tokenizer - A tokenizer structure that will chop up file into * tokens. It is aware of quoted strings and otherwise tends to return * white-space or punctuated-separated words, with punctuation in * a separate token. This is used by autoSql. */ #ifndef TOKENIZER_H #define TOKENIZER_H struct tokenizer /* This handles reading in tokens. */ { bool reuse; /* True if want to reuse this token. */ bool eof; /* True at end of file. */ int leadingSpaces; /* Number of leading spaces before token. */ struct lineFile *lf; /* Underlying file. */ char *curLine; /* Current line of text. */ char *linePt; /* Start position within current line. */ char *string; /* String value of token */ int sSize; /* Size of string. */ int sAlloc; /* Allocated string size. */ /* Some variables set after tokenizerNew to control details of * parsing. */ bool leaveQuotes; /* Leave quotes in string. */ bool uncommentC; /* Take out C (and C++) style comments. */ bool uncommentShell; /* Take out # style comments. */ }; struct tokenizer *tokenizerOnLineFile(struct lineFile *lf); /* Create a new tokenizer on open lineFile. */ void tokenizerFree(struct tokenizer **pTkz); /* Tear down a tokenizer. */ int tokenizerLineCount(struct tokenizer *tkz); /* Return line of current token. */ char *tokenizerFileName(struct tokenizer *tkz); /* Return name of file. */ char *tokenizerNext(struct tokenizer *tkz); /* Return token's next string (also available as tkz->string) or * NULL at EOF. This string will be overwritten with the next call * to tokenizerNext, so cloneString if you need to save it. */ void tokenizerErrAbort(struct tokenizer *tkz, char *format, ...) /* Print error message followed by file and line number and * abort. */ #if defined(__GNUC__) __attribute__((format(printf, 2, 3))) #endif ; char *tokenizerMustHaveNext(struct tokenizer *tkz); /* Get next token, which must be there. */ void tokenizerMustMatch(struct tokenizer *tkz, char *string); /* Require next token to match string. Return next token * if it does, otherwise abort. */ #endif /* TOKENIZER_H */ rtracklayer/src/ucsc/twoBit.c0000644000175100017510000006057214614231172017270 0ustar00biocbuildbiocbuild/* Copyright (C) 2014 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "hash.h" #include "dnaseq.h" #include "dnautil.h" #include "sig.h" #include "localmem.h" #include "linefile.h" #include "obscure.h" #include "bPlusTree.h" #include "twoBit.h" #include "udc.h" #include "net.h" #include "portable.h" #include /* following are the wrap functions for the UDC and stdio functoins * that read twoBit files. All of these are to get around the C compiler * complaining about the automatic cast of a void * to FILE * or * struct udcFile *. */ /* first the UDC wrappers */ static void udcSeekCurWrap(void *file, bits64 offset) { udcSeekCur((struct udcFile *)file, offset); } static void udcSeekWrap(void *file, bits64 offset) { udcSeek((struct udcFile *)file, offset); } static void udcMustReadWrap(void *file, void *buf, size_t size) { udcMustRead((struct udcFile *)file, buf, size); } static void udcFileCloseWrap(void *pFile) { udcFileClose((struct udcFile **)pFile); } static bits32 udcReadBits32Wrap(void *f, boolean isSwapped) { return udcReadBits32((struct udcFile *)f, isSwapped); } static boolean udcFastReadStringWrap(void *f, char buf[256]) { return udcFastReadString((struct udcFile *)f, buf); } /* now the stdio wrappers */ static void seekCurWrap(void *file, bits64 offset) { fseek((FILE *)file, offset, SEEK_CUR); } static void seekWrap(void *file, bits64 offset) { fseek((FILE *)file, offset, SEEK_SET); } static void mustReadWrap(void *file, void *buf, size_t size) { mustRead((FILE *)file, buf, size); } static void fileCloseWrap(void *pFile) { carefulClose((FILE **)pFile); } static bits32 readBits32Wrap(void *f, boolean isSwapped) { return readBits32((FILE *)f, isSwapped); } static boolean fastReadStringWrap(void *f, char buf[256]) { return fastReadString((FILE *)f, buf); } static void setFileFuncs( struct twoBitFile *tbf, boolean useUdc) /* choose the proper function pointers depending on whether * this open twoBit is using stdio or UDC */ { if (useUdc) { tbf->ourSeekCur = udcSeekCurWrap; tbf->ourSeek = udcSeekWrap; tbf->ourReadBits32 = udcReadBits32Wrap; tbf->ourFastReadString = udcFastReadStringWrap; tbf->ourClose = udcFileCloseWrap; tbf->ourMustRead = udcMustReadWrap; } else { tbf->ourSeekCur = seekCurWrap; tbf->ourSeek = seekWrap; tbf->ourReadBits32 = readBits32Wrap; tbf->ourFastReadString = fastReadStringWrap; tbf->ourClose = fileCloseWrap; tbf->ourMustRead = mustReadWrap; } } static int countBlocksOfN(char *s, int size) /* Count number of blocks of N's (or n's) in s. */ { int i; boolean isN, lastIsN = FALSE; char c; int blockCount = 0; for (i=0; i> 2); } struct twoBit *twoBitFromDnaSeq(struct dnaSeq *seq, boolean doMask) /* Convert dnaSeq representation in memory to twoBit representation. * If doMask is true interpret lower-case letters as masked. */ { int ubyteSize = packedSize(seq->size); UBYTE *pt; struct twoBit *twoBit; DNA last4[4]; /* Holds few bases. */ DNA *dna; int i, end; /* Allocate structure and fill in name. */ AllocVar(twoBit); pt = AllocArray(twoBit->data, ubyteSize); twoBit->name = cloneString(seq->name); twoBit->size = seq->size; /* Convert to 4-bases per byte representation. */ dna = seq->dna; end = seq->size - 4; for (i=0; isize-i); *pt = packDna4(last4); /* Deal with blocks of N. */ twoBit->nBlockCount = countBlocksOfN(dna, seq->size); if (twoBit->nBlockCount > 0) { AllocArray(twoBit->nStarts, twoBit->nBlockCount); AllocArray(twoBit->nSizes, twoBit->nBlockCount); storeBlocksOfN(dna, seq->size, twoBit->nStarts, twoBit->nSizes); } /* Deal with masking */ if (doMask) { twoBit->maskBlockCount = countBlocksOfLower(dna, seq->size); if (twoBit->maskBlockCount > 0) { AllocArray(twoBit->maskStarts, twoBit->maskBlockCount); AllocArray(twoBit->maskSizes, twoBit->maskBlockCount); storeBlocksOfLower(dna, seq->size, twoBit->maskStarts, twoBit->maskSizes); } } return twoBit; } static int twoBitSizeInFile(struct twoBit *twoBit) /* Figure out size structure will take in file. */ { return packedSize(twoBit->size) + sizeof(twoBit->size) + sizeof(twoBit->nBlockCount) + sizeof(twoBit->nStarts[0]) * twoBit->nBlockCount + sizeof(twoBit->nSizes[0]) * twoBit->nBlockCount + sizeof(twoBit->maskBlockCount) + sizeof(twoBit->maskStarts[0]) * twoBit->maskBlockCount + sizeof(twoBit->maskSizes[0]) * twoBit->maskBlockCount + sizeof(twoBit->reserved); } void twoBitWriteOne(struct twoBit *twoBit, FILE *f) /* Write out one twoBit sequence to binary file. * Note this does not include the name, which is * stored only in index. */ { writeOne(f, twoBit->size); writeOne(f, twoBit->nBlockCount); if (twoBit->nBlockCount > 0) { fwrite(twoBit->nStarts, sizeof(twoBit->nStarts[0]), twoBit->nBlockCount, f); fwrite(twoBit->nSizes, sizeof(twoBit->nSizes[0]), twoBit->nBlockCount, f); } writeOne(f, twoBit->maskBlockCount); if (twoBit->maskBlockCount > 0) { fwrite(twoBit->maskStarts, sizeof(twoBit->maskStarts[0]), twoBit->maskBlockCount, f); fwrite(twoBit->maskSizes, sizeof(twoBit->maskSizes[0]), twoBit->maskBlockCount, f); } writeOne(f, twoBit->reserved); mustWrite(f, twoBit->data, packedSize(twoBit->size)); } void twoBitWriteHeader(struct twoBit *twoBitList, FILE *f) /* Write out header portion of twoBit file, including initial * index */ { bits32 sig = twoBitSig; bits32 version = 0; bits32 seqCount = slCount(twoBitList); bits32 reserved = 0; bits32 offset = 0; struct twoBit *twoBit; long long counter = 0; /* check for 32 bit overflow */ /* Write out fixed parts of header. */ writeOne(f, sig); writeOne(f, version); writeOne(f, seqCount); writeOne(f, reserved); /* Figure out location of first byte past index. * Each index entry contains 4 bytes of offset information * and the name of the sequence, which is variable length. */ offset = sizeof(sig) + sizeof(version) + sizeof(seqCount) + sizeof(reserved); for (twoBit = twoBitList; twoBit != NULL; twoBit = twoBit->next) { int nameLen = strlen(twoBit->name); if (nameLen > 255) errAbort("name %s too long", twoBit->name); offset += nameLen + 1 + sizeof(bits32); } /* Write out index. */ for (twoBit = twoBitList; twoBit != NULL; twoBit = twoBit->next) { int size = twoBitSizeInFile(twoBit); writeString(f, twoBit->name); writeOne(f, offset); offset += size; counter += (long long)size; if (counter > UINT_MAX ) errAbort("Error in faToTwoBit, index overflow at %s. The 2bit format " "does not support indexes larger than %dGb, \n" "please split up into smaller files.\n", twoBit->name, UINT_MAX/1000000000); } } void twoBitClose(struct twoBitFile **pTbf) /* Free up resources associated with twoBitFile. */ { struct twoBitFile *tbf = *pTbf; if (tbf != NULL) { freez(&tbf->fileName); (*tbf->ourClose)(&tbf->f); hashFree(&tbf->hash); /* The indexList is allocated out of the hash's memory pool. */ bptFileClose(&tbf->bpt); freez(pTbf); } } boolean twoBitSigRead(struct twoBitFile *tbf, boolean *isSwapped) /* read twoBit signature, return FALSE if not good * set isSwapped to TRUE if twoBit file is byte swapped */ { bits32 sig; *isSwapped = FALSE; (*tbf->ourMustRead)(tbf->f, &sig, sizeof(sig)); if (sig == twoBitSwapSig) *isSwapped = TRUE; else if (sig != twoBitSig) return FALSE; return TRUE; } static struct twoBitFile *getTbfAndOpen(char *fileName, boolean useUdc) { struct twoBitFile *tbf; AllocVar(tbf); setFileFuncs(tbf, useUdc); if (useUdc) tbf->f = udcFileOpen(fileName, NULL); else tbf->f = mustOpen(fileName, "rb"); return tbf; } static struct twoBitFile *twoBitOpenReadHeader(char *fileName, boolean useUdc) /* Open file, read in header but not index. * Squawk and die if there is a problem. */ { struct twoBitFile *tbf; boolean isSwapped = FALSE; tbf = getTbfAndOpen(fileName, useUdc); /* Allocate header verify signature, and read in * the constant-length bits. */ if (!twoBitSigRead(tbf, &isSwapped)) errAbort("%s doesn't have a valid twoBitSig", fileName); tbf->isSwapped = isSwapped; tbf->fileName = cloneString(fileName); tbf->version = (*tbf->ourReadBits32)(tbf->f, isSwapped); if (tbf->version != 0) { errAbort("Can only handle version 0 of this file. This is version %d", (int)tbf->version); } tbf->seqCount = (*tbf->ourReadBits32)(tbf->f, isSwapped); tbf->reserved = (*tbf->ourReadBits32)(tbf->f, isSwapped); return tbf; } struct twoBitFile *twoBitOpen(char *fileName) /* Open file, read in header and index. * Squawk and die if there is a problem. */ { boolean useUdc = FALSE; if (hasProtocol(fileName)) useUdc = TRUE; struct twoBitFile *tbf = twoBitOpenReadHeader(fileName, useUdc); struct twoBitIndex *index; boolean isSwapped = tbf->isSwapped; int i; struct hash *hash; void *f = tbf->f; /* Read in index. */ hash = tbf->hash = hashNew(digitsBaseTwo(tbf->seqCount)); for (i=0; iseqCount; ++i) { char name[256]; if (!(*tbf->ourFastReadString)(f, name)) errAbort("%s is truncated", fileName); lmAllocVar(hash->lm, index); index->offset = (*tbf->ourReadBits32)(f, isSwapped); hashAddSaveName(hash, name, index, &index->name); slAddHead(&tbf->indexList, index); } slReverse(&tbf->indexList); return tbf; } static int findGreatestLowerBound(int blockCount, bits32 *pos, int val) /* Find index of greatest element in posArray that is less * than or equal to val using a binary search. */ { int startIx=0, endIx=blockCount-1, midIx; int posVal; for (;;) { if (startIx == endIx) { posVal = pos[startIx]; if (posVal <= val || startIx == 0) return startIx; else return startIx-1; } midIx = ((startIx + endIx)>>1); posVal = pos[midIx]; if (posVal < val) startIx = midIx+1; else endIx = midIx; } } static void twoBitSeekTo(struct twoBitFile *tbf, char *name) /* Seek to start of named record. Abort if can't find it. */ { if (tbf->bpt) { bits32 offset; if (!bptFileFind(tbf->bpt, name, strlen(name), &offset, sizeof(offset))) errAbort("%s is not in %s", name, tbf->bpt->fileName); (*tbf->ourSeek)(tbf->f, offset); } else { struct twoBitIndex *index = hashFindVal(tbf->hash, name); if (index == NULL) errAbort("%s is not in %s", name, tbf->fileName); (*tbf->ourSeek)(tbf->f, index->offset); } } static void readBlockCoords(struct twoBitFile *tbf, boolean isSwapped, bits32 *retBlockCount, bits32 **retBlockStarts, bits32 **retBlockSizes) /* Read in blockCount, starts and sizes from file. (Same structure used for * both blocks of N's and masked blocks.) */ { bits32 blkCount = (*tbf->ourReadBits32)(tbf->f, isSwapped); *retBlockCount = blkCount; if (blkCount == 0) { *retBlockStarts = NULL; *retBlockSizes = NULL; } else { bits32 *nStarts, *nSizes; AllocArray(nStarts, blkCount); AllocArray(nSizes, blkCount); (*tbf->ourMustRead)(tbf->f, nStarts, sizeof(nStarts[0]) * blkCount); (*tbf->ourMustRead)(tbf->f, nSizes, sizeof(nSizes[0]) * blkCount); if (isSwapped) { int i; for (i=0; iisSwapped; struct twoBit *twoBit; AllocVar(twoBit); twoBit->name = cloneString(name); void *f = tbf->f; /* Find offset in index and seek to it */ twoBitSeekTo(tbf, name); /* Read in seqSize. */ twoBit->size = (*tbf->ourReadBits32)(f, isSwapped); /* Read in blocks of N. */ readBlockCoords(tbf, isSwapped, &(twoBit->nBlockCount), &(twoBit->nStarts), &(twoBit->nSizes)); /* Read in masked blocks. */ readBlockCoords(tbf, isSwapped, &(twoBit->maskBlockCount), &(twoBit->maskStarts), &(twoBit->maskSizes)); /* Reserved word. */ twoBit->reserved = (*tbf->ourReadBits32)(f, isSwapped); /* Read in data. */ packByteCount = packedSize(twoBit->size); twoBit->data = needLargeMem(packByteCount); (*tbf->ourMustRead)(f, twoBit->data, packByteCount); return twoBit; } void twoBitFree(struct twoBit **pTwoBit) /* Free up a two bit structure. */ { struct twoBit *twoBit = *pTwoBit; if (twoBit != NULL) { freeMem(twoBit->nStarts); freeMem(twoBit->nSizes); freeMem(twoBit->maskStarts); freeMem(twoBit->maskSizes); freeMem(twoBit->data); freez(pTwoBit); } } void twoBitFreeList(struct twoBit **pList) /* Free a list of dynamically allocated twoBit's */ { struct twoBit *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; twoBitFree(&el); } *pList = NULL; } struct dnaSeq *twoBitReadSeqFragExt(struct twoBitFile *tbf, char *name, int fragStart, int fragEnd, boolean doMask, int *retFullSize) /* Read part of sequence from .2bit file. To read full * sequence call with start=end=0. Sequence will be lower * case if doMask is false, mixed case (repeats in lower) * if doMask is true. */ { struct dnaSeq *seq; bits32 seqSize; bits32 nBlockCount, maskBlockCount; bits32 *nStarts = NULL, *nSizes = NULL; bits32 *maskStarts = NULL, *maskSizes = NULL; boolean isSwapped = tbf->isSwapped; void *f = tbf->f; int i; int packByteCount, packedStart, packedEnd, remainder, midStart, midEnd; int outSize; UBYTE *packed, *packedAlloc; DNA *dna; /* Find offset in index and seek to it */ dnaUtilOpen(); twoBitSeekTo(tbf, name); /* Read in seqSize. */ seqSize = (*tbf->ourReadBits32)(f, isSwapped); if (fragEnd == 0) fragEnd = seqSize; if (fragEnd > seqSize) errAbort("twoBitReadSeqFrag in %s end (%d) >= seqSize (%d)", name, fragEnd, seqSize); outSize = fragEnd - fragStart; if (outSize < 1) errAbort("twoBitReadSeqFrag in %s start (%d) >= end (%d)", name, fragStart, fragEnd); /* Read in blocks of N. */ readBlockCoords(tbf, isSwapped, &nBlockCount, &nStarts, &nSizes); /* Read in masked blocks. */ readBlockCoords(tbf, isSwapped, &maskBlockCount, &maskStarts, &maskSizes); /* Skip over reserved word. */ (*tbf->ourReadBits32)(f, isSwapped); /* Allocate dnaSeq, and fill in zero tag at end of sequence. */ AllocVar(seq); if (outSize == seqSize) seq->name = cloneString(name); else { char buf[256*2]; safef(buf, sizeof(buf), "%s:%d-%d", name, fragStart, fragEnd); seq->name = cloneString(buf); } seq->size = outSize; dna = seq->dna = needLargeMem(outSize+1); seq->dna[outSize] = 0; /* Skip to bits we need and read them in. */ packedStart = (fragStart>>2); packedEnd = ((fragEnd+3)>>2); packByteCount = packedEnd - packedStart; packed = packedAlloc = needLargeMem(packByteCount); (*tbf->ourSeekCur)(f, packedStart); (*tbf->ourMustRead)(f, packed, packByteCount); /* Handle case where everything is in one packed byte */ if (packByteCount == 1) { int pOff = (packedStart<<2); int pStart = fragStart - pOff; int pEnd = fragEnd - pOff; UBYTE partial = *packed; assert(pEnd <= 4); assert(pStart >= 0); for (i=pStart; i> (6-i-i)) & 3]; } else { /* Handle partial first packed byte. */ midStart = fragStart; remainder = (fragStart&3); if (remainder > 0) { UBYTE partial = *packed++; int partCount = 4 - remainder; for (i=partCount-1; i>=0; --i) { dna[i] = valToNt[partial&3]; partial >>= 2; } midStart += partCount; dna += partCount; } /* Handle middle bytes. */ remainder = fragEnd&3; midEnd = fragEnd - remainder; for (i=midStart; i>= 2; dna[2] = valToNt[b&3]; b >>= 2; dna[1] = valToNt[b&3]; b >>= 2; dna[0] = valToNt[b&3]; dna += 4; } if (remainder >0) { UBYTE part = *packed; part >>= (8-remainder-remainder); for (i=remainder-1; i>=0; --i) { dna[i] = valToNt[part&3]; part >>= 2; } } } freez(&packedAlloc); if (nBlockCount > 0) { int startIx = findGreatestLowerBound(nBlockCount, nStarts, fragStart); for (i=startIx; i= fragEnd) break; if (s < fragStart) s = fragStart; if (e > fragEnd) e = fragEnd; if (s < e) memset(seq->dna + s - fragStart, 'n', e - s); } } if (doMask) { toUpperN(seq->dna, seq->size); if (maskBlockCount > 0) { int startIx = findGreatestLowerBound(maskBlockCount, maskStarts, fragStart); for (i=startIx; i= fragEnd) break; if (s < fragStart) s = fragStart; if (e > fragEnd) e = fragEnd; if (s < e) toLowerN(seq->dna + s - fragStart, e - s); } } } freez(&nStarts); freez(&nSizes); freez(&maskStarts); freez(&maskSizes); if (retFullSize != NULL) *retFullSize = seqSize; return seq; } struct dnaSeq *twoBitReadSeqFrag(struct twoBitFile *tbf, char *name, int fragStart, int fragEnd) /* Read part of sequence from .2bit file. To read full * sequence call with start=end=0. Note that sequence will * be mixed case, with repeats in lower case and rest in * upper case. */ { return twoBitReadSeqFragExt(tbf, name, fragStart, fragEnd, TRUE, NULL); } int twoBitSeqSize(struct twoBitFile *tbf, char *name) /* Return size of sequence in two bit file in bases. */ { twoBitSeekTo(tbf, name); return (*tbf->ourReadBits32)(tbf->f, tbf->isSwapped); } boolean twoBitIsFile(char *fileName) /* Return TRUE if file is in .2bit format. */ { boolean useUdc = FALSE; if (hasProtocol(fileName)) useUdc = TRUE; else if (!isRegularFile(fileName)) return FALSE; struct twoBitFile *tbf = getTbfAndOpen(fileName, useUdc); boolean isSwapped; boolean isTwoBit = twoBitSigRead(tbf, &isSwapped); (*tbf->ourClose)(&tbf->f); return isTwoBit; } boolean twoBitParseRange(char *rangeSpec, char **retFile, char **retSeq, int *retStart, int *retEnd) /* Parse out something in format * file/path/name:seqName:start-end * or * file/path/name:seqName * or * file/path/name:seqName1,seqName2,seqName3,... * This will destroy the input 'rangeSpec' in the process. Returns FALSE if * it doesn't fit this format, setting retFile to rangeSpec, and retSet to * null. If it is the shorter form then start and end will both be returned * as zero, which is ok by twoBitReadSeqFrag. Any of the return arguments * maybe NULL. */ { char *s, *e; int n; /* default returns */ if (retFile != NULL) *retFile = rangeSpec; if (retSeq != NULL) *retSeq = NULL; if (retStart != NULL) *retStart = 0; if (retEnd != NULL) *retEnd = 0; /* start with final name */ s = strrchr(rangeSpec, '/'); if (s == NULL) s = rangeSpec; else s++; /* Grab seqName, zero terminate fileName. */ s = strchr(s, ':'); if (s == NULL) return FALSE; *s++ = 0; if (retSeq != NULL) *retSeq = s; /* Grab start, zero terminate seqName. */ s = strchr(s, ':'); if (s == NULL) return TRUE; /* no range spec */ *s++ = 0; n = strtol(s, &e, 0); if (*e != '-') return FALSE; /* not a valid range */ if (retStart != NULL) *retStart = n; s = e+1; /* Grab end. */ n = strtol(s, &e, 0); if (*e != '\0') return FALSE; /* not a valid range */ if (retEnd != NULL) *retEnd = n; return TRUE; } boolean twoBitIsRange(char *rangeSpec) /* Return TRUE if it looks like a two bit range specifier. */ { char *dupe = cloneString(rangeSpec); char *file, *seq; int start, end; boolean isRange = twoBitParseRange(dupe, &file, &seq, &start, &end); if (isRange) isRange = twoBitIsFile(file); freeMem(dupe); return isRange; } static struct twoBitSeqSpec *parseSeqSpec(char *seqSpecStr) /* parse one sequence spec */ { boolean isOk = TRUE; char *s, *e; struct twoBitSeqSpec *seq; AllocVar(seq); seq->name = cloneString(seqSpecStr); /* Grab start */ s = strchr(seq->name, ':'); if (s == NULL) return seq; /* no range spec */ *s++ = 0; seq->start = strtol(s, &e, 0); if (*e != '-') isOk = FALSE; else { /* Grab end */ s = e+1; seq->end = strtol(s, &e, 0); if (*e != '\0') isOk = FALSE; } if (!isOk || (seq->end < seq->start)) errAbort("invalid twoBit sequence specification: \"%s\"", seqSpecStr); return seq; } struct twoBitSpec *twoBitSpecNew(char *specStr) /* Parse a .2bit file and sequence spec into an object. * The spec is a string in the form: * * file/path/input.2bit[:seqSpec1][,seqSpec2,...] * * where seqSpec is either * seqName * or * seqName:start-end * * free result with twoBitSpecFree(). */ { char *s, *e; int i, numSeqs; char **seqSpecs; struct twoBitSpec *spec; AllocVar(spec); spec->fileName = cloneString(specStr); /* start with final file name */ s = strrchr(spec->fileName, '/'); if (s == NULL) s = spec->fileName; else s++; /* find end of file name and zero-terminate */ e = strchr(s, ':'); if (e == NULL) s = NULL; /* just file name */ else { *e++ = '\0'; s = e; } if (!twoBitIsFile(spec->fileName)) { twoBitSpecFree(&spec); return NULL; /* not a 2bit file */ } if (s != NULL) { /* chop seqs at commas and parse */ numSeqs = chopString(s, ",", NULL, 0); AllocArray(seqSpecs, numSeqs); chopString(s, ",", seqSpecs, numSeqs); for (i = 0; i< numSeqs; i++) slSafeAddHead(&spec->seqs, parseSeqSpec(seqSpecs[i])); slReverse(&spec->seqs); } return spec; } void twoBitSpecFree(struct twoBitSpec **specPtr) /* free a twoBitSpec object */ { struct twoBitSpec *spec = *specPtr; if (spec != NULL) { struct twoBitSeqSpec *seq; while ((seq = slPopHead(&spec->seqs)) != NULL) { freeMem(seq->name); freeMem(seq); } freeMem(spec->fileName); freeMem(spec); *specPtr = NULL; } } int twoBitSeqSizeNoNs(struct twoBitFile *tbf, char *seqName) /* return the size of the sequence, not counting N's*/ { int nBlockCount; int size; twoBitSeekTo(tbf, seqName); size = (*tbf->ourReadBits32)(tbf->f, tbf->isSwapped); /* Read in blocks of N. */ nBlockCount = (*tbf->ourReadBits32)(tbf->f, tbf->isSwapped); if (nBlockCount > 0) { bits32 *nStarts = NULL, *nSizes = NULL; int i; AllocArray(nStarts, nBlockCount); AllocArray(nSizes, nBlockCount); (*tbf->ourMustRead)(tbf->f, nStarts, sizeof(nStarts[0]) * nBlockCount); (*tbf->ourMustRead)(tbf->f, nSizes, sizeof(nSizes[0]) * nBlockCount); if (tbf->isSwapped) { for (i=0; i #include #include "common.h" #include "hash.h" #include "obscure.h" #include "bits.h" #include "linefile.h" #include "portable.h" #include "sig.h" #include "net.h" #include "cheapcgi.h" #include "udc.h" #include "htmlPage.h" /* The stdio stream we'll use to output statistics on file i/o. Off by default. */ FILE *udcLogStream = NULL; static char *defaultDir = "/tmp/udcCache"; struct ioStats /* Statistics concerning reads and seeks. */ { bits64 numSeeks; /* The number of seeks on this file */ bits64 numReads; /* The number of reads from this file */ bits64 bytesRead; /* The number of bytes read from this file */ bits64 numWrites; /* The number of writes to this file */ bits64 bytesWritten; /* The number of bytes written to this file */ }; struct ios /* Statistics concerning reads and seeks for sparse, bitmap, url, and to us. */ { struct ioStats bit; /* Statistics on file i/o to the bitmap file. */ struct ioStats sparse; /* Statistics on file i/o to the sparse data file. */ struct ioStats udc; /* Statistics on file i/o from the application to us. */ struct ioStats net; /* Statistics on file i/o over the network. */ bits64 numConnects; /* The number of socket connections made. */ bits64 numReuse; /* The number of socket reuses. */ }; #define udcBlockSize (8*1024) /* All fetch requests are rounded up to block size. */ #define udcMaxBytesPerRemoteFetch (udcBlockSize * 32) /* Very large remote reads are broken down into chunks this size. */ struct connInfo /* Socket descriptor and associated info, for keeping net connections open. */ { int socket; /* Socket descriptor for data connection (or 0). */ bits64 offset; /* Current file offset of socket. */ int ctrlSocket; /* (FTP only) Control socket descriptor or 0. */ char *redirUrl; /* (HTTP(S) only) use redirected url */ }; typedef int (*UdcDataCallback)(char *url, bits64 offset, int size, void *buffer, struct udcFile *file); /* Type for callback function that fetches file data. */ struct udcRemoteFileInfo /* Information about a remote file. */ { bits64 updateTime; /* Last update in seconds since 1970 */ bits64 size; /* Remote file size */ struct connInfo ci; /* Connection info for open net connection */ }; typedef boolean (*UdcInfoCallback)(char *url, struct udcRemoteFileInfo *retInfo); /* Type for callback function that fetches file timestamp and size. */ struct udcProtocol /* Something to handle a communications protocol like http, https, ftp, local file i/o, etc. */ { struct udcProtocol *next; /* Next in list */ UdcDataCallback fetchData; /* Data fetcher */ UdcInfoCallback fetchInfo; /* Timestamp & size fetcher */ char *type; }; struct udcFile /* A file handle for our caching system. */ { struct udcFile *next; /* Next in list. */ char *url; /* Name of file - includes protocol */ char *protocol; /* The URL up to the first colon. http: etc. */ struct udcProtocol *prot; /* Protocol specific data and methods. */ time_t updateTime; /* Last modified timestamp. */ bits64 size; /* Size of file. */ bits64 offset; /* Current offset in file. */ char *cacheDir; /* Directory for cached file parts. */ char *bitmapFileName; /* Name of bitmap file. */ char *sparseFileName; /* Name of sparse data file. */ char *redirFileName; /* Name of redir file. */ int fdSparse; /* File descriptor for sparse data file. */ boolean sparseReadAhead; /* Read-ahead has something in the buffer */ char *sparseReadAheadBuf; /* Read-ahead buffer, if any */ bits64 sparseRAOffset; /* Read-ahead buffer offset */ struct udcBitmap *bits; /* udcBitMap */ bits64 startData; /* Start of area in file we know to have data. */ bits64 endData; /* End of area in file we know to have data. */ bits32 bitmapVersion; /* Version of associated bitmap we were opened with. */ struct connInfo connInfo; /* Connection info for open net connection. */ struct ios ios; /* Statistics on file access. */ }; struct udcBitmap /* The control structure including the bitmap of blocks that are cached. */ { struct udcBitmap *next; /* Next in list. */ bits32 blockSize; /* Number of bytes per block of file. */ bits64 remoteUpdate; /* Remote last update time. */ bits64 fileSize; /* File size */ bits32 version; /* Version - increments each time cache is stale. */ bits64 localUpdate; /* Time we last fetched new data into cache. */ bits64 localAccess; /* Time we last accessed data. */ boolean isSwapped; /* If true need to swap all bytes on read. */ int fd; /* File descriptor for file with current block. */ }; static char *bitmapName = "bitmap"; static char *sparseDataName = "sparseData"; static char *redirName = "redir"; #define udcBitmapHeaderSize (64) static int cacheTimeout = 0; #define MAX_SKIP_TO_SAVE_RECONNECT (udcMaxBytesPerRemoteFetch / 2) static off_t ourMustLseek(struct ioStats *ioStats, int fd, off_t offset, int whence) { ioStats->numSeeks++; return mustLseek(fd, offset, whence); } static void ourMustWrite(struct ioStats *ioStats, int fd, void *buf, size_t size) { ioStats->numWrites++; ioStats->bytesWritten += size; mustWriteFd(fd, buf, size); } static size_t ourRead(struct ioStats *ioStats, int fd, void *buf, size_t size) { ioStats->numReads++; size_t bytesRead = read(fd, buf, size); ioStats->bytesRead += bytesRead; return bytesRead; } static void ourMustRead(struct ioStats *ioStats, int fd, void *buf, size_t size) { ioStats->numReads++; ioStats->bytesRead += size; mustReadFd(fd, buf, size); } static size_t ourFread(struct ioStats *ioStats, void *buf, size_t size, size_t nmemb, FILE *stream) { ioStats->numReads++; ioStats->bytesRead += size * nmemb; return fread(buf, size, nmemb, stream); } static void udcReadAndIgnore(struct ioStats *ioStats, int sd, bits64 size) /* Read size bytes from sd and return. */ { static char *buf = NULL; if (buf == NULL) buf = needMem(udcBlockSize); bits64 remaining = size, total = 0; while (remaining > 0) { bits64 chunkSize = min(remaining, udcBlockSize); ssize_t rd = ourRead(ioStats, sd, buf, chunkSize); if (rd < 0) errnoAbort("udcReadAndIgnore: error reading socket after %lld bytes", total); remaining -= rd; total += rd; } if (total < size) errAbort("udcReadAndIgnore: got EOF at %lld bytes (wanted %lld)", total, size); } #ifndef WIN32 static int connInfoGetSocket(struct udcFile *file, char *url, bits64 offset, int size) /* If ci has an open socket and the given offset matches ci's current offset, * reuse ci->socket. Otherwise close the socket, open a new one, and update ci, * or return -1 if there is an error opening a new one. */ { /* NOTE: This doesn't use HTTP 1.1 keep alive to do multiple request on the * same socket. The only way subsequent random requests on the same socket * work is because previous request are open-ended and this can continue * reading where it left off. The HTTP requests are issued as 1.0, even * through range requests are a 1.1 feature. * * For FTP, the serial read approach is essential. FTP only supports resuming * from an offset, but doesn't not support limiting the number of bytes * transferred. All that can be done to stop the transfer is to abort the * operation, when then requires reconnecting. */ struct connInfo *ci = &file->connInfo; if (ci != NULL && ci->socket > 0 && ci->offset != offset) { bits64 skipSize = (offset - ci->offset); if (skipSize > 0 && skipSize <= MAX_SKIP_TO_SAVE_RECONNECT) { verbose(4, "skipping %lld bytes @%lld to avoid reconnect\n", skipSize, ci->offset); udcReadAndIgnore(&file->ios.net, ci->socket, skipSize); ci->offset = offset; file->ios.numReuse++; } else { verbose(4, "Offset mismatch (ci %lld != new %lld), reopening.\n", ci->offset, offset); mustCloseFd(&(ci->socket)); if (ci->ctrlSocket > 0) mustCloseFd(&(ci->ctrlSocket)); ZeroVar(ci); } } int sd; if (ci == NULL || ci->socket <= 0) { file->ios.numConnects++; if (ci->redirUrl) { url = transferParamsToRedirectedUrl(url, ci->redirUrl); } // IMPORTANT NOTE: byterange is not a real URL parameter, this is a hack to pass // the range to the net.c functions, which then parse it. char rangeUrl[2048]; if (ci == NULL) { safef(rangeUrl, sizeof(rangeUrl), "%s;byterange=%lld-%lld", url, offset, (offset + size - 1)); sd = netUrlOpen(rangeUrl); } else { safef(rangeUrl, sizeof(rangeUrl), "%s;byterange=%lld-", url, offset); sd = ci->socket = netUrlOpenSockets(rangeUrl, &(ci->ctrlSocket)); ci->offset = offset; } if (sd < 0) return -1; if (startsWith("http", url)) { char *newUrl = NULL; int newSd = 0; if (!netSkipHttpHeaderLinesHandlingRedirect(sd, rangeUrl, &newSd, &newUrl)) return -1; if (newUrl) { freeMem(newUrl); sd = newSd; if (ci != NULL) ci->socket = newSd; } } } else sd = ci->socket; return sd; } #endif /********* Section for local file protocol **********/ static char *assertLocalUrl(char *url) /* Make sure that url is local and return bits past the protocol. */ { if (startsWith("local:", url)) url += 6; if (url[0] != '/') errAbort("Local urls must start at /"); if (stringIn("..", url) || stringIn("~", url) || stringIn("//", url) || stringIn("/./", url) || endsWith("/.", url)) { errAbort("relative paths not allowed in local urls (%s)", url); } return url; } static int udcDataViaLocal(char *url, bits64 offset, int size, void *buffer, struct udcFile *file) /* Fetch a block of data of given size into buffer using the http: protocol. * Returns number of bytes actually read. Does an errAbort on * error. Typically will be called with size in the 8k - 64k range. */ { /* Need to check time stamp here. */ verbose(4, "reading remote data - %d bytes at %lld - on %s\n", size, offset, url); url = assertLocalUrl(url); FILE *f = mustOpen(url, "rb"); fseek(f, offset, SEEK_SET); int sizeRead = ourFread(&file->ios.net, buffer, 1, size, f); if (ferror(f)) { warn("udcDataViaLocal failed to fetch %d bytes at %lld", size, offset); errnoAbort("file %s", url); } carefulClose(&f); return sizeRead; } static boolean udcInfoViaLocal(char *url, struct udcRemoteFileInfo *retInfo) /* Fill in *retTime with last modified time for file specified in url. * Return FALSE if file does not even exist. */ { verbose(4, "checking remote info on %s\n", url); url = assertLocalUrl(url); struct stat status; int ret = stat(url, &status); if (ret < 0) return FALSE; retInfo->updateTime = status.st_mtime; retInfo->size = status.st_size; return TRUE; } /********* Section for transparent file protocol **********/ static int udcDataViaTransparent(char *url, bits64 offset, int size, void *buffer, struct udcFile *file) /* Fetch a block of data of given size into buffer using the http: protocol. * Returns number of bytes actually read. Does an errAbort on * error. Typically will be called with size in the 8k - 64k range. */ { internalErr(); /* Should not get here. */ return size; } static boolean udcInfoViaTransparent(char *url, struct udcRemoteFileInfo *retInfo) /* Fill in *retInfo with last modified time for file specified in url. * Return FALSE if file does not even exist. */ { internalErr(); /* Should not get here. */ return FALSE; } /********* Section for slow local file protocol - simulates network... **********/ static int udcDataViaSlow(char *url, bits64 offset, int size, void *buffer, struct udcFile *file) /* Fetch a block of data of given size into buffer using the http: protocol. * Returns number of bytes actually read. Does an errAbort on * error. Typically will be called with size in the 8k - 64k range. */ { verbose(4, "slow reading remote data - %d bytes at %lld - on %s\n", size, offset, url); sleep1000(500); char *fileName = url + 5; /* skip over 'slow:' */ FILE *f = mustOpen(fileName, "rb"); fseek(f, offset, SEEK_SET); char *pt = buffer; int i, step=1024; int sizeRead = 0; for (i=0; i step) readChunk = step; int oneReadSize = ourFread(&file->ios.net, pt, 1, readChunk, f); verbose(4, "slowly read %d bytes\n", oneReadSize); if (ferror(f)) { warn("udcDataViaSlow failed to fetch %d bytes at %lld", size, offset); errnoAbort("file %s", fileName); } pt += step; sizeRead += oneReadSize; } carefulClose(&f); return sizeRead; } static boolean udcInfoViaSlow(char *url, struct udcRemoteFileInfo *retInfo) /* Fill in *retTime with last modified time for file specified in url. * Return FALSE if file does not even exist. */ { char *fileName = url + 5; /* skip over 'slow:' */ verbose(4, "slow checking remote info on %s\n", url); sleep1000(500); struct stat status; int ret = stat(fileName, &status); if (ret < 0) return FALSE; retInfo->updateTime = status.st_mtime; retInfo->size = status.st_size; return TRUE; } static bool udcCacheEnabled() /* TRUE if caching is activated */ { return (defaultDir != NULL); } #ifndef WIN32 /********* Section for http protocol **********/ int udcDataViaHttpOrFtp( char *url, bits64 offset, int size, void *buffer, struct udcFile *file) /* Fetch a block of data of given size into buffer using url's protocol, * which must be http, https or ftp. Returns number of bytes actually read. * Does an errAbort on error. * Typically will be called with size in the 8k-64k range. */ { if (startsWith("http://",url) || startsWith("https://",url) || startsWith("ftp://",url)) verbose(4, "reading http/https/ftp data - %d bytes at %lld - on %s\n", size, offset, url); else errAbort("Invalid protocol in url [%s] in udcDataViaFtp, only http, https, or ftp supported", url); int sd = connInfoGetSocket(file, url, offset, size); if (sd < 0) errAbort("Can't get data socket for %s", url); int rd = 0, total = 0, remaining = size; char *buf = (char *)buffer; while ((remaining > 0) && ((rd = ourRead(&file->ios.net, sd, buf, remaining)) > 0)) { total += rd; buf += rd; remaining -= rd; } if (rd == -1) errnoAbort("udcDataViaHttpOrFtp: error reading socket"); struct connInfo *ci = &file->connInfo; if (ci == NULL) mustCloseFd(&sd); else ci->offset += total; return total; } boolean udcInfoViaHttp(char *url, struct udcRemoteFileInfo *retInfo) /* Gets size and last modified time of URL * and returns status of HEAD or GET byterange 0-0. */ { verbose(4, "checking http remote info on %s\n", url); // URLs passed into here should not have byterange clause. int redirectCount = 0; struct hash *hash; int status; char *sizeString = NULL; /* For caching, sites should support byte-range and last-modified. However, several groups including ENCODE have made sites that use CGIs to dynamically generate hub text files such as hub.txt, genome.txt, trackDb.txt. Byte-range and last-modified are difficult to support for this case, so they do without them, effectively defeat caching. Every 5 minutes (udcTimeout), they get re-downloaded, even when the data has not changed. */ while (TRUE) { hash = newHash(0); status = netUrlHead(url, hash); sizeString = hashFindValUpperCase(hash, "Content-Length:"); if (status == 200 && sizeString) break; /* Using HEAD with HIPPAA-compliant signed AmazonS3 URLs generates 403. The signed URL generated for GET cannot be used with HEAD. Instead call GET with byterange=0-0 in netUrlFakeHeadByGet(). This supplies both size via Content-Range response header, as well as Last-Modified header which is important for caching. There are also sites which support byte-ranges but they do not return Content-Length with HEAD. */ if (status == 403 || (status==200 && !sizeString)) { hashFree(&hash); hash = newHash(0); status = netUrlFakeHeadByGet(url, hash); if (status == 206) break; if (status == 200) // helps get more info to user break; } if (status != 301 && status != 302 && status != 307 && status != 308) return FALSE; ++redirectCount; if (redirectCount > 5) { warn("code %d redirects: exceeded limit of 5 redirects, %s", status, url); return FALSE; } char *newUrl = hashFindValUpperCase(hash, "Location:"); if (!newUrl) { warn("code %d redirects: redirect location missing, %s", status, url); return FALSE; } // path may be relative if (hasProtocol(newUrl)) { newUrl = cloneString(newUrl); } else { newUrl = expandUrlOnBase(url, newUrl); } retInfo->ci.redirUrl = newUrl; url = transferParamsToRedirectedUrl(url, newUrl); hashFree(&hash); } char *sizeHeader = NULL; if (status == 200) { sizeHeader = "Content-Length:"; // input pattern: Content-Length: 2738262 } if (status == 206) { sizeHeader = "Content-Range:"; // input pattern: Content-Range: bytes 0-99/2738262 } sizeString = hashFindValUpperCase(hash, sizeHeader); if (sizeString) { char *parseString = sizeString; if (status == 206) { parseString = strchr(sizeString, '/'); if (!parseString) { warn("Header value %s is missing '/' in %s in response for url %s", sizeString, sizeHeader, url); return FALSE; } ++parseString; // skip past slash } if (parseString) { retInfo->size = atoll(parseString); } else { warn("Header value %s is missing or invalid in %s in response for url %s", sizeString, sizeHeader, url); return FALSE; } } else { warn("Response is missing required header %s for url %s", sizeHeader, url); return FALSE; } char *lastModString = hashFindValUpperCase(hash, "Last-Modified:"); if (lastModString == NULL) { // Date is a poor substitute! It will always appear that the cache is stale. // But at least we can read files from dropbox.com. lastModString = hashFindValUpperCase(hash, "Date:"); if (lastModString == NULL) { hashFree(&hash); errAbort("No Last-Modified: or Date: returned in header for %s, can't proceed, sorry", url); } } struct tm tm; time_t t; // Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT // This will always be GMT if (strptime(lastModString, "%a, %d %b %Y %H:%M:%S %Z", &tm) == NULL) { /* Handle error */; hashFree(&hash); errAbort("unable to parse last-modified string [%s]", lastModString); } t = mktimeFromUtc(&tm); if (t == -1) { /* Handle error */; hashFree(&hash); errAbort("mktimeFromUtc failed while converting last-modified string [%s] from UTC time", lastModString); } retInfo->updateTime = t; hashFree(&hash); return status; } /********* Section for ftp protocol **********/ // fetchData method: See udcDataViaHttpOrFtp above. boolean udcInfoViaFtp(char *url, struct udcRemoteFileInfo *retInfo) /* Gets size and last modified time of FTP URL */ { verbose(4, "checking ftp remote info on %s\n", url); long long size = 0; time_t t, tUtc; struct tm *tm = NULL; // TODO: would be nice to add int *retCtrlSocket to netGetFtpInfo so we can stash // in retInfo->connInfo and keep socket open. boolean ok = netGetFtpInfo(url, &size, &tUtc); if (!ok) return FALSE; // Convert UTC to localtime tm = localtime(&tUtc); t = mktimeFromUtc(tm); if (t == -1) { /* Handle error */; errAbort("mktimeFromUtc failed while converting FTP UTC last-modified time %ld to local time", (long) tUtc); } retInfo->size = size; retInfo->updateTime = t; return TRUE; } #endif /********* Non-protocol-specific bits **********/ boolean udcFastReadString(struct udcFile *f, char buf[256]) /* Read a string into buffer, which must be long enough * to hold it. String is in 'writeString' format. */ { UBYTE bLen; int len; if (!udcReadOne(f, bLen)) return FALSE; if ((len = bLen)> 0) udcMustRead(f, buf, len); buf[len] = 0; return TRUE; } static char *fileNameInCacheDir(struct udcFile *file, char *fileName) /* Return the name of a file in the cache dir, from the cache root directory on down. * Do a freeMem on this when done. */ { int dirLen = strlen(file->cacheDir); int nameLen = strlen(fileName); char *path = needMem(dirLen + nameLen + 2); memcpy(path, file->cacheDir, dirLen); path[dirLen] = '/'; memcpy(path+dirLen+1, fileName, nameLen); return path; } static void udcNewCreateBitmapAndSparse(struct udcFile *file, bits64 remoteUpdate, bits64 remoteSize, bits32 version) /* Create a new bitmap file around the given remoteUpdate time. */ { int fd = mustOpenFd(file->bitmapFileName, O_WRONLY | O_CREAT | O_TRUNC); bits32 sig = udcBitmapSig; bits32 blockSize = udcBlockSize; bits64 reserved64 = 0; bits32 reserved32 = 0; int blockCount = (remoteSize + udcBlockSize - 1)/udcBlockSize; int bitmapSize = bitToByteSize(blockCount); /* Write out fixed part of header. */ writeOneFd(fd, sig); writeOneFd(fd, blockSize); writeOneFd(fd, remoteUpdate); writeOneFd(fd, remoteSize); writeOneFd(fd, version); writeOneFd(fd, reserved32); writeOneFd(fd, reserved64); writeOneFd(fd, reserved64); writeOneFd(fd, reserved64); writeOneFd(fd, reserved64); long long offset = ourMustLseek(&file->ios.bit, fd, 0, SEEK_CUR); if (offset != udcBitmapHeaderSize) errAbort("offset in fd=%d, f=%s is %lld, not expected udcBitmapHeaderSize %d", fd, file->bitmapFileName, offset, udcBitmapHeaderSize); /* Write out initial all-zero bitmap, using sparse-file method: write 0 to final address. */ unsigned char zero = 0; ourMustLseek(&file->ios.bit, fd, bitmapSize-1, SEEK_CUR); ourMustWrite(&file->ios.bit, fd, &zero, 1); /* Clean up bitmap file and name. */ mustCloseFd(&fd); /* Create an empty data file. */ fd = mustOpenFd(file->sparseFileName, O_WRONLY | O_CREAT | O_TRUNC); mustCloseFd(&fd); } static struct udcBitmap *udcBitmapOpen(char *fileName) /* Open up a bitmap file and read and verify header. Return NULL if file doesn't * exist, abort on error. */ { /* Open file, returning NULL if can't. */ int fd = open(fileName, O_RDWR); if (fd < 0) { if (errno == ENOENT) return NULL; else errnoAbort("Can't open(%s, O_RDWR)", fileName); } /* Get status info from file. */ struct stat status; fstat(fd, &status); if (status.st_size < udcBitmapHeaderSize) // check for truncated invalid bitmap files. { close(fd); return NULL; // returning NULL will cause the fresh creation of bitmap and sparseData files. } /* Read signature and decide if byte-swapping is needed. */ // TODO: maybe buffer the I/O for performance? Don't read past header - // fd offset needs to point to first data block when we return. bits32 magic; boolean isSwapped = FALSE; mustReadOneFd(fd, magic); if (magic != udcBitmapSig) { magic = byteSwap32(magic); isSwapped = TRUE; if (magic != udcBitmapSig) errAbort("%s is not a udcBitmap file", fileName); } /* Allocate bitmap object, fill it in, and return it. */ struct udcBitmap *bits; AllocVar(bits); bits->blockSize = fdReadBits32(fd, isSwapped); bits->remoteUpdate = fdReadBits64(fd, isSwapped); bits->fileSize = fdReadBits64(fd, isSwapped); bits->version = fdReadBits32(fd, isSwapped); fdReadBits32(fd, isSwapped); // ignore result fdReadBits64(fd, isSwapped); // ignore result fdReadBits64(fd, isSwapped); // ignore result fdReadBits64(fd, isSwapped); // ignore result fdReadBits64(fd, isSwapped); // ignore result bits->localUpdate = status.st_mtime; bits->localAccess = status.st_atime; bits->isSwapped = isSwapped; bits->fd = fd; return bits; } static void udcBitmapClose(struct udcBitmap **pBits) /* Free up resources associated with udcBitmap. */ { struct udcBitmap *bits = *pBits; if (bits != NULL) { mustCloseFd(&(bits->fd)); freez(pBits); } } static struct udcProtocol *udcProtocolNew(char *upToColon) /* Build up a new protocol around a string such as "http" or "local" */ { struct udcProtocol *prot; AllocVar(prot); if (sameString(upToColon, "local")) { prot->fetchData = udcDataViaLocal; prot->fetchInfo = udcInfoViaLocal; prot->type = "local"; } else if (sameString(upToColon, "slow")) { prot->fetchData = udcDataViaSlow; prot->fetchInfo = udcInfoViaSlow; prot->type = "slow"; } #ifndef WIN32 else if (sameString(upToColon, "http") || sameString(upToColon, "https")) { prot->fetchData = udcDataViaHttpOrFtp; prot->fetchInfo = udcInfoViaHttp; prot->type = "http"; } else if (sameString(upToColon, "ftp")) { prot->fetchData = udcDataViaHttpOrFtp; prot->fetchInfo = udcInfoViaFtp; prot->type = "ftp"; } #endif else if (sameString(upToColon, "transparent")) { prot->fetchData = udcDataViaTransparent; prot->fetchInfo = udcInfoViaTransparent; prot->type = "transparent"; } else { errAbort("Unrecognized protocol %s in udcProtNew", upToColon); } return prot; } static void udcProtocolFree(struct udcProtocol **pProt) /* Free up protocol resources. */ { freez(pProt); } static void setInitialCachedDataBounds(struct udcFile *file, boolean useCacheInfo) /* Open up bitmap file and read a little bit of it to see if cache is stale, * and if not to see if the initial part is cached. Sets the data members * startData, and endData. If the case is stale it makes fresh empty * cacheDir/sparseData and cacheDir/bitmap files. */ { bits32 version = 0; /* Get existing bitmap, and if it's stale clean up. */ struct udcBitmap *bits = udcBitmapOpen(file->bitmapFileName); if (bits != NULL) { if (useCacheInfo) { file->size = bits->fileSize; file->updateTime = bits->remoteUpdate; } version = bits->version; if (bits->remoteUpdate != file->updateTime || bits->fileSize != file->size || !fileExists(file->sparseFileName) || (fileSize(file->sparseFileName) == 0 && file->size > 0 && fileSize(file->bitmapFileName) > udcBitmapHeaderSize)) { verbose(4, "removing stale version (%lld! = %lld or %lld! = %lld or %s doesn't exist or should not be size 0), " "new version %d\n", bits->remoteUpdate, (long long)file->updateTime, bits->fileSize, file->size, file->sparseFileName, version); udcBitmapClose(&bits); remove(file->bitmapFileName); remove(file->sparseFileName); if (fileExists(file->redirFileName)) remove(file->redirFileName); ++version; } } else verbose(4, "bitmap file %s does not already exist, creating.\n", file->bitmapFileName); /* If no bitmap, then create one, and also an empty sparse data file. */ if (bits == NULL) { udcNewCreateBitmapAndSparse(file, file->updateTime, file->size, version); bits = udcBitmapOpen(file->bitmapFileName); if (bits == NULL) errAbort("Unable to open bitmap file %s", file->bitmapFileName); } file->bitmapVersion = bits->version; /* Read in a little bit from bitmap while we have it open to see if we have anything cached. */ if (file->size > 0) { Bits b; off_t wasAt = lseek(bits->fd, 0, SEEK_CUR); mustReadOneFd(bits->fd, b); int endBlock = (file->size + udcBlockSize - 1)/udcBlockSize; if (endBlock > 8) endBlock = 8; int initialCachedBlocks = bitFindClear(&b, 0, endBlock); file->endData = initialCachedBlocks * udcBlockSize; ourMustLseek(&file->ios.bit, bits->fd, wasAt, SEEK_SET); } file->bits = bits; } static boolean qEscaped(char c) /* Returns TRUE if character needs to be escaped in q-encoding. */ { if (isalnum(c)) return c == 'Q'; else return c != '_' && c != '-' && c != '/' && c != '.'; } static char *qEncode(char *input) /* Do a simple encoding to convert input string into "normal" characters. * Abnormal letters, and '!' get converted into Q followed by two hexadecimal digits. */ { /* First go through and figure out encoded size. */ int size = 0; char *s, *d, c; s = input; while ((c = *s++) != 0) { if (qEscaped(c)) size += 3; else size += 1; } /* Allocate and fill in output. */ char *output = needMem(size+1); s = input; d = output; while ((c = *s++) != 0) { if (qEscaped(c)) { sprintf(d, "Q%02X", (unsigned)c); d += 3; } else *d++ = c; } return output; } void udcParseUrlFull(char *url, char **retProtocol, char **retAfterProtocol, char **retColon, char **retAuth) /* Parse the URL into components that udc treats separately. * *retAfterProtocol is Q-encoded to keep special chars out of filenames. * Free all *ret's except *retColon when done. */ { char *protocol, *afterProtocol; char *colon = strchr(url, ':'); if (!colon) { *retColon = NULL; return; } int colonPos = colon - url; protocol = cloneStringZ(url, colonPos); afterProtocol = url + colonPos + 1; while (afterProtocol[0] == '/') afterProtocol += 1; char *userPwd = strchr(afterProtocol, '@'); if (userPwd) { if (retAuth) { char auth[1024]; safencpy(auth, sizeof(auth), afterProtocol, userPwd+1-afterProtocol); *retAuth = qEncode(auth); } char *afterHost = strchr(afterProtocol, '/'); if (!afterHost) { afterHost = afterProtocol+strlen(afterProtocol); } if (userPwd < afterHost) afterProtocol = userPwd + 1; } else if (retAuth) *retAuth = NULL; afterProtocol = qEncode(afterProtocol); *retProtocol = protocol; *retAfterProtocol = afterProtocol; *retColon = colon; } void udcParseUrl(char *url, char **retProtocol, char **retAfterProtocol, char **retColon) /* Parse the URL into components that udc treats separately. * *retAfterProtocol is Q-encoded to keep special chars out of filenames. * Free *retProtocol and *retAfterProtocol but not *retColon when done. */ { udcParseUrlFull(url, retProtocol, retAfterProtocol, retColon, NULL); } void udcPathAndFileNames(struct udcFile *file, char *cacheDir, char *protocol, char *afterProtocol) /* Initialize udcFile path and names */ { if (cacheDir==NULL) return; int len = strlen(cacheDir) + 1 + strlen(protocol) + 1 + strlen(afterProtocol) + 1; file->cacheDir = needMem(len); safef(file->cacheDir, len, "%s/%s/%s", cacheDir, protocol, afterProtocol); /* Create file names for bitmap and data portions. */ file->bitmapFileName = fileNameInCacheDir(file, bitmapName); file->sparseFileName = fileNameInCacheDir(file, sparseDataName); file->redirFileName = fileNameInCacheDir(file, redirName); } static long long int udcSizeAndModTimeFromBitmap(char *bitmapFileName, time_t *retTime) /* Look up the file size from the local cache bitmap file, or -1 if there * is no cache for url. If retTime is non-null, store the remote update time in it. */ { long long int ret = -1; struct udcBitmap *bits = udcBitmapOpen(bitmapFileName); if (bits != NULL) { ret = bits->fileSize; if (retTime) *retTime = bits->remoteUpdate; } udcBitmapClose(&bits); return ret; } static void udcTestAndSetRedirect(struct udcFile *file, char *protocol, boolean useCacheInfo) /* update redirect info */ { if (startsWith("http", protocol)) { char *newUrl = NULL; // read redir from cache if it exists if (fileExists(file->redirFileName)) { readInGulp(file->redirFileName, &newUrl, NULL); } if (useCacheInfo) { file->connInfo.redirUrl = cloneString(newUrl); } else { if (file->connInfo.redirUrl) { if (!sameOk(file->connInfo.redirUrl, newUrl)) { // write redir to cache char *temp = addSuffix(file->redirFileName, ".temp"); writeGulp(temp, file->connInfo.redirUrl, strlen(file->connInfo.redirUrl)); rename(temp, file->redirFileName); freeMem(temp); } } else { // delete redir from cache (if it exists) if (newUrl) remove(file->redirFileName); } } freeMem(newUrl); } } unsigned long djb2_hash(unsigned char *str) { unsigned long hash = 5381; int c; while (c = *str++) hash = ((hash << 5) + hash) + c; /* hash * 33 + c */ return hash; } char* get_hashed_basename_path(char *afterProtocol) { /*retrive basename and hash it*/ char *name = basename(afterProtocol); unsigned long hash_id = djb2_hash((unsigned char*)name); /* calculate size of url without basename and total buffer size*/ int url_size = strlen(afterProtocol) - strlen(name); int total_size = url_size + floor(1.0 + log10((double) llabs(hash_id))) + 1; /* substring afterProtocol to get url without basename*/ char path[url_size + 1]; memcpy(path, afterProtocol, url_size); path[url_size] = '\0'; /*create buffer and concat url without base and hash_id*/ char *full_path = needMem(total_size * sizeof(char)); snprintf(full_path, total_size, "%s%ld", path, hash_id); return full_path; } struct udcFile *udcFileMayOpen(char *url, char *cacheDir) /* Open up a cached file. cacheDir may be null in which case udcDefaultDir() will be * used. Return NULL if file doesn't exist. * Caching is inactive if defaultDir is NULL or the protocol is "transparent". * */ { if (cacheDir == NULL) cacheDir = udcDefaultDir(); verbose(4, "udcfileOpen(%s, %s)\n", url, cacheDir); if (udcLogStream) fprintf(udcLogStream, "Open %s\n", url); /* Parse out protocol. Make it "transparent" if none specified. */ char *protocol = NULL, *afterProtocol = NULL, *colon; boolean isTransparent = FALSE; udcParseUrl(url, &protocol, &afterProtocol, &colon); #ifndef WIN32 /* force WIN32 to use transparent (local file) loading */ if (!colon) #endif { freeMem(protocol); protocol = cloneString("transparent"); freeMem(afterProtocol); afterProtocol = cloneString(url); isTransparent = TRUE; } struct udcProtocol *prot; prot = udcProtocolNew(protocol); /* Figure out if anything exists. */ boolean useCacheInfo = FALSE; struct udcRemoteFileInfo info; ZeroVar(&info); if (!isTransparent) { if (udcCacheEnabled()) useCacheInfo = (udcCacheAge(url, cacheDir) < udcCacheTimeout()); if (!useCacheInfo) { if (!prot->fetchInfo(url, &info)) { udcProtocolFree(&prot); freeMem(protocol); freeMem(afterProtocol); return NULL; } } } /* Allocate file object and start filling it in. */ struct udcFile *file; AllocVar(file); file->url = cloneString(url); file->protocol = protocol; file->prot = prot; if (isTransparent) { /* If transparent dummy up things so that the "sparse" file pointer is actually * the file itself, which appears to be completely loaded in cache. */ if (!fileExists(url)) return NULL; int flags = O_RDONLY; #ifdef WIN32 flags |= O_BINARY; #endif int fd = file->fdSparse = mustOpenFd(url, flags); struct stat status; fstat(fd, &status); file->startData = 0; file->endData = file->size = status.st_size; } else { char *full_path = get_hashed_basename_path(afterProtocol); udcPathAndFileNames(file, cacheDir, protocol, full_path); if (!useCacheInfo) { file->updateTime = info.updateTime; file->size = info.size; memcpy(&(file->connInfo), &(info.ci), sizeof(struct connInfo)); // update cache file mod times, so if we're caching we won't do this again // until the timeout has expired again: #ifndef WIN32 if (udcCacheTimeout() > 0 && udcCacheEnabled() && fileExists(file->bitmapFileName)) (void)maybeTouchFile(file->bitmapFileName); #endif freeMem(full_path); } if (udcCacheEnabled()) { /* Make directory. */ makeDirsOnPath(file->cacheDir); /* Figure out a little bit about the extent of the good cached data if any. Open bits bitmap. */ setInitialCachedDataBounds(file, useCacheInfo); file->fdSparse = mustOpenFd(file->sparseFileName, O_RDWR); // update redir with latest redirect status udcTestAndSetRedirect(file, protocol, useCacheInfo); } } freeMem(afterProtocol); return file; } struct udcFile *udcFileOpen(char *url, char *cacheDir) /* Open up a cached file. cacheDir may be null in which case udcDefaultDir() will be * used. Abort if file doesn't exist. */ { struct udcFile *udcFile = udcFileMayOpen(url, cacheDir); if (udcFile == NULL) errAbort("Couldn't open %s", url); return udcFile; } struct slName *udcFileCacheFiles(char *url, char *cacheDir) /* Return low-level list of files used in cache. */ { char *protocol, *afterProtocol, *colon; struct udcFile *file; udcParseUrl(url, &protocol, &afterProtocol, &colon); if (colon == NULL) return NULL; AllocVar(file); char *full_path = get_hashed_basename_path(afterProtocol); udcPathAndFileNames(file, cacheDir, protocol, full_path); struct slName *list = NULL; slAddHead(&list, slNameNew(file->bitmapFileName)); slAddHead(&list, slNameNew(file->sparseFileName)); slAddHead(&list, slNameNew(file->redirFileName)); slReverse(&list); freeMem(file->cacheDir); freeMem(file->bitmapFileName); freeMem(file->sparseFileName); freeMem(file); freeMem(protocol); freeMem(afterProtocol); freeMem(full_path); return list; } void udcFileClose(struct udcFile **pFile) /* Close down cached file. */ { struct udcFile *file = *pFile; if (file != NULL) { if (udcLogStream) { fprintf(udcLogStream, "Close %s %s %lld %lld bit %lld %lld %lld %lld %lld sparse %lld %lld %lld %lld %lld udc %lld %lld %lld %lld %lld net %lld %lld %lld %lld %lld \n", file->url, file->prot->type, file->ios.numConnects, file->ios.numReuse, file->ios.bit.numSeeks, file->ios.bit.numReads, file->ios.bit.bytesRead, file->ios.bit.numWrites, file->ios.bit.bytesWritten, file->ios.sparse.numSeeks, file->ios.sparse.numReads, file->ios.sparse.bytesRead, file->ios.sparse.numWrites, file->ios.sparse.bytesWritten, file->ios.udc.numSeeks, file->ios.udc.numReads, file->ios.udc.bytesRead, file->ios.udc.numWrites, file->ios.udc.bytesWritten, file->ios.net.numSeeks, file->ios.net.numReads, file->ios.net.bytesRead, file->ios.net.numWrites, file->ios.net.bytesWritten); } if (file->connInfo.socket != 0) mustCloseFd(&(file->connInfo.socket)); if (file->connInfo.ctrlSocket != 0) mustCloseFd(&(file->connInfo.ctrlSocket)); freeMem(file->url); freeMem(file->protocol); udcProtocolFree(&file->prot); freeMem(file->cacheDir); freeMem(file->bitmapFileName); freeMem(file->sparseFileName); freeMem(file->sparseReadAheadBuf); if (file->fdSparse != 0) mustCloseFd(&(file->fdSparse)); udcBitmapClose(&file->bits); } freez(pFile); } static void qDecode(const char *input, char *buf, size_t size) /* Reverse the qEncode performed on afterProcotol above into buf or abort. */ { safecpy(buf, size, input); char c, *r = buf, *w = buf; while ((c = *r++) != '\0') { if (c == 'Q') { int q; if (sscanf(r, "%02X", &q)) { *w++ = (char)q; r += 2; } else errAbort("qDecode: input \"%s\" does not appear to be properly formatted " "starting at \"%s\"", input, r); } else *w++ = c; } *w = '\0'; } long long int udcSizeFromCache(char *url, char *cacheDir) /* Look up the file size from the local cache bitmap file, or -1 if there * is no cache for url. */ { long long int ret = -1; if (cacheDir == NULL) cacheDir = udcDefaultDir(); struct slName *sl, *slList = udcFileCacheFiles(url, cacheDir); for (sl = slList; sl != NULL; sl = sl->next) if (endsWith(sl->name, bitmapName)) { ret = udcSizeAndModTimeFromBitmap(sl->name, NULL); break; } slNameFreeList(&slList); return ret; } unsigned long udcCacheAge(char *url, char *cacheDir) /* Return the age in seconds of the oldest cache file. If a cache file is * missing, return the current time (seconds since the epoch). */ { unsigned long now = clock1(), oldestTime = now; if (cacheDir == NULL) cacheDir = udcDefaultDir(); struct slName *sl, *slList = udcFileCacheFiles(url, cacheDir); if (slList == NULL) return now; for (sl = slList; sl != NULL; sl = sl->next) if (endsWith(sl->name, bitmapName)) { if (fileExists(sl->name)) oldestTime = min(fileModTime(sl->name), oldestTime); else return now; } return (now - oldestTime); } static void readBitsIntoBuf(struct udcFile *file, int fd, int headerSize, int bitStart, int bitEnd, Bits **retBits, int *retPartOffset) /* Do some bit-to-byte offset conversions and read in all the bytes that * have information in the bits we're interested in. */ { int byteStart = bitStart/8; int byteEnd = bitToByteSize(bitEnd); int byteSize = byteEnd - byteStart; Bits *bits = needLargeMem(byteSize); ourMustLseek(&file->ios.bit,fd, headerSize + byteStart, SEEK_SET); ourMustRead(&file->ios.bit, fd, bits, byteSize); *retBits = bits; *retPartOffset = byteStart*8; } static boolean allBitsSetInFile(int bitStart, int bitEnd, int partOffset, Bits *bits) /* Return TRUE if all bits in file between start and end are set. */ { int partBitStart = bitStart - partOffset; int partBitEnd = bitEnd - partOffset; int nextClearBit = bitFindClear(bits, partBitStart, partBitEnd); boolean allSet = (nextClearBit >= partBitEnd); return allSet; } static void fetchMissingBlocks(struct udcFile *file, struct udcBitmap *bits, int startBlock, int blockCount, int blockSize) /* Fetch missing blocks from remote and put them into file. errAbort if trouble. */ { bits64 startPos = (bits64)startBlock * blockSize; bits64 endPos = startPos + (bits64)blockCount * blockSize; if (endPos > file->size) endPos = file->size; if (endPos > startPos) { bits64 readSize = endPos - startPos; void *buf = needLargeMem(readSize); int actualSize = file->prot->fetchData(file->url, startPos, readSize, buf, file); if (actualSize != readSize) errAbort("unable to fetch %lld bytes from %s @%lld (got %d bytes)", readSize, file->url, startPos, actualSize); ourMustLseek(&file->ios.sparse, file->fdSparse, startPos, SEEK_SET); ourMustWrite(&file->ios.sparse, file->fdSparse, buf, readSize); freez(&buf); } } static boolean fetchMissingBits(struct udcFile *file, struct udcBitmap *bits, bits64 start, bits64 end, bits64 *retFetchedStart, bits64 *retFetchedEnd) /* Scan through relevant parts of bitmap, fetching blocks we don't already have. */ { /* Fetch relevant part of bitmap into memory */ int partOffset; Bits *b; int startBlock = start / bits->blockSize; int endBlock = (end + bits->blockSize - 1) / bits->blockSize; readBitsIntoBuf(file, bits->fd, udcBitmapHeaderSize, startBlock, endBlock, &b, &partOffset); if (allBitsSetInFile(startBlock, endBlock, partOffset, b)) { // it is already in the cache freeMem(b); return TRUE; } /* Loop around first skipping set bits, then fetching clear bits. */ boolean dirty = FALSE; int s = startBlock - partOffset; int e = endBlock - partOffset; for (;;) { int nextClearBit = bitFindClear(b, s, e); if (nextClearBit >= e) break; int nextSetBit = bitFindSet(b, nextClearBit, e); int clearSize = nextSetBit - nextClearBit; fetchMissingBlocks(file, bits, nextClearBit + partOffset, clearSize, bits->blockSize); bitSetRange(b, nextClearBit, clearSize); dirty = TRUE; if (nextSetBit >= e) break; s = nextSetBit; } if (dirty) { /* Update bitmap on disk.... */ int byteStart = startBlock/8; int byteEnd = bitToByteSize(endBlock); int byteSize = byteEnd - byteStart; ourMustLseek(&file->ios.bit, bits->fd, byteStart + udcBitmapHeaderSize, SEEK_SET); ourMustWrite(&file->ios.bit, bits->fd, b, byteSize); } freeMem(b); *retFetchedStart = startBlock * bits->blockSize; *retFetchedEnd = endBlock * bits->blockSize; return FALSE; } static boolean rangeIntersectOrTouch64(bits64 start1, bits64 end1, bits64 start2, bits64 end2) /* Return true if two 64-bit ranges intersect or touch. */ { // cannot use the version of this function that is in common.c since it only handles integers. bits64 s = max(start1,start2); bits64 e = min(end1,end2); return e >= s; } static void udcFetchMissing(struct udcFile *file, struct udcBitmap *bits, bits64 start, bits64 end) /* Fetch missing pieces of data from file */ { /* Call lower level routine fetch remote data that is not already here. */ bits64 fetchedStart, fetchedEnd; if (fetchMissingBits(file, bits, start, end, &fetchedStart, &fetchedEnd)) return; /* Update file startData/endData members to include new data (and old as well if * the new data overlaps the old). */ if (rangeIntersectOrTouch64(file->startData, file->endData, fetchedStart, fetchedEnd)) { if (fetchedStart > file->startData) fetchedStart = file->startData; if (fetchedEnd < file->endData) fetchedEnd = file->endData; } file->startData = fetchedStart; file->endData = fetchedEnd; } static boolean udcCachePreload(struct udcFile *file, bits64 offset, bits64 size) /* Make sure that given data is in cache - fetching it remotely if need be. * Return TRUE on success. */ { if (!udcCacheEnabled()) return TRUE; boolean ok = TRUE; /* Original comment said: * "We'll break this operation into blocks of a reasonable size to allow * other processes to get cache access, since we have to lock the cache files." * However there is no locking done, so this whole splitting might be unnecessary * complexity. */ bits64 s,e, endPos=offset+size; for (s = offset; s < endPos; s = e) { /* Figure out bounds of this section. */ e = s + udcMaxBytesPerRemoteFetch; if (e > endPos) e = endPos; struct udcBitmap *bits = file->bits; if (bits->version == file->bitmapVersion) { udcFetchMissing(file, bits, s, e); } else { ok = FALSE; verbose(4, "udcCachePreload version check failed %d vs %d", bits->version, file->bitmapVersion); } if (!ok) break; } return ok; } #define READAHEADBUFSIZE 4096 bits64 udcRead(struct udcFile *file, void *buf, bits64 size) /* Read a block from file. Return amount actually read. */ { file->ios.udc.numReads++; // if not caching, just fetch the data if (!udcCacheEnabled() && !sameString(file->protocol, "transparent")) { int actualSize = file->prot->fetchData(file->url, file->offset, size, buf, file); file->offset += actualSize; file->ios.udc.bytesRead += actualSize; return actualSize; } file->ios.udc.bytesRead += size; /* Figure out region of file we're going to read, and clip it against file size. */ bits64 start = file->offset; if (start > file->size) return 0; bits64 end = start + size; if (end > file->size) end = file->size; size = end - start; char *cbuf = buf; /* use read-ahead buffer if present */ bits64 bytesRead = 0; bits64 raStart; bits64 raEnd; while(TRUE) { if (file->sparseReadAhead) { raStart = file->sparseRAOffset; raEnd = raStart+READAHEADBUFSIZE; if (start >= raStart && start < raEnd) { // copy bytes out of rabuf bits64 endInBuf = min(raEnd, end); bits64 sizeInBuf = endInBuf - start; memcpy(cbuf, file->sparseReadAheadBuf + (start-raStart), sizeInBuf); cbuf += sizeInBuf; bytesRead += sizeInBuf; start = raEnd; size -= sizeInBuf; file->offset += sizeInBuf; if (size == 0) break; } file->sparseReadAhead = FALSE; ourMustLseek(&file->ios.sparse,file->fdSparse, start, SEEK_SET); } bits64 saveEnd = end; if (size < READAHEADBUFSIZE) { file->sparseReadAhead = TRUE; if (!file->sparseReadAheadBuf) file->sparseReadAheadBuf = needMem(READAHEADBUFSIZE); file->sparseRAOffset = start; size = READAHEADBUFSIZE; end = start + size; if (end > file->size) { end = file->size; size = end - start; } } /* If we're outside of the window of file we already know is good, then have to * consult cache on disk, and maybe even fetch data remotely! */ if (start < file->startData || end > file->endData) { if (!udcCachePreload(file, start, size)) { verbose(4, "udcCachePreload failed"); bytesRead = 0; break; } /* Currently only need fseek here. Would be safer, but possibly * slower to move fseek so it is always executed in front of read, in * case other code is moving around file pointer. */ ourMustLseek(&file->ios.sparse,file->fdSparse, start, SEEK_SET); } if (file->sparseReadAhead) { ourMustRead(&file->ios.sparse,file->fdSparse, file->sparseReadAheadBuf, size); end = saveEnd; size = end - start; } else { ourMustRead(&file->ios.sparse,file->fdSparse, cbuf, size); file->offset += size; bytesRead += size; break; } } return bytesRead; } void udcMustRead(struct udcFile *file, void *buf, bits64 size) /* Read a block from file. Abort if any problem, including EOF before size is read. */ { bits64 sizeRead = udcRead(file, buf, size); if (sizeRead < size) errAbort("udc couldn't read %llu bytes from %s, did read %llu", size, file->url, sizeRead); } int udcGetChar(struct udcFile *file) /* Get next character from file or die trying. */ { UBYTE b; udcMustRead(file, &b, 1); return b; } bits64 udcReadBits64(struct udcFile *file, boolean isSwapped) /* Read and optionally byte-swap 64 bit entity. */ { bits64 val; udcMustRead(file, &val, sizeof(val)); if (isSwapped) val = byteSwap64(val); return val; } bits32 udcReadBits32(struct udcFile *file, boolean isSwapped) /* Read and optionally byte-swap 32 bit entity. */ { bits32 val; udcMustRead(file, &val, sizeof(val)); if (isSwapped) val = byteSwap32(val); return val; } bits16 udcReadBits16(struct udcFile *file, boolean isSwapped) /* Read and optionally byte-swap 16 bit entity. */ { bits16 val; udcMustRead(file, &val, sizeof(val)); if (isSwapped) val = byteSwap16(val); return val; } float udcReadFloat(struct udcFile *file, boolean isSwapped) /* Read and optionally byte-swap floating point number. */ { float val; udcMustRead(file, &val, sizeof(val)); if (isSwapped) val = byteSwapFloat(val); return val; } double udcReadDouble(struct udcFile *file, boolean isSwapped) /* Read and optionally byte-swap double-precision floating point number. */ { double val; udcMustRead(file, &val, sizeof(val)); if (isSwapped) val = byteSwapDouble(val); return val; } char *udcReadLine(struct udcFile *file) /* Fetch next line from udc cache or NULL. */ { char shortBuf[2], *longBuf = NULL, *buf = shortBuf; int i, bufSize = sizeof(shortBuf); for (i=0; ; ++i) { /* See if need to expand buffer, which is initially on stack, but if it gets big goes into * heap. */ if (i >= bufSize) { int newBufSize = bufSize*2; char *newBuf = needLargeMem(newBufSize); memcpy(newBuf, buf, bufSize); freeMem(longBuf); buf = longBuf = newBuf; bufSize = newBufSize; } char c; bits64 sizeRead = udcRead(file, &c, 1); if (sizeRead == 0) { // EOF before newline: return NULL for empty string if (i == 0) return NULL; break; } buf[i] = c; if (c == '\n') { buf[i] = 0; break; } } char *retString = cloneString(buf); freeMem(longBuf); return retString; } char *udcReadStringAndZero(struct udcFile *file) /* Read in zero terminated string from file. Do a freeMem of result when done. */ { char shortBuf[2], *longBuf = NULL, *buf = shortBuf; int i, bufSize = sizeof(shortBuf); for (i=0; ; ++i) { /* See if need to expand buffer, which is initially on stack, but if it gets big goes into * heap. */ if (i >= bufSize) { int newBufSize = bufSize*2; char *newBuf = needLargeMem(newBufSize); memcpy(newBuf, buf, bufSize); freeMem(longBuf); buf = longBuf = newBuf; bufSize = newBufSize; } char c = udcGetChar(file); buf[i] = c; if (c == 0) break; } char *retString = cloneString(buf); freeMem(longBuf); return retString; } char *udcFileReadAll(char *url, char *cacheDir, size_t maxSize, size_t *retSize) /* Read a complete file via UDC. The cacheDir may be null in which case udcDefaultDir() * will be used. If maxSize is non-zero, check size against maxSize * and abort if it's bigger. Returns file data (with an extra terminal for the * common case where it's treated as a C string). If retSize is non-NULL then * returns size of file in *retSize. Do a freeMem or freez of the returned buffer * when done. */ { struct udcFile *file = udcFileOpen(url, cacheDir); size_t size = file->size; if (maxSize != 0 && size > maxSize) errAbort("%s is %lld bytes, but maxSize to udcFileReadAll is %lld", url, (long long)size, (long long)maxSize); char *buf = needLargeMem(size+1); udcMustRead(file, buf, size); buf[size] = 0; // add trailing zero for string processing udcFileClose(&file); if (retSize != NULL) *retSize = size; return buf; } void udcSeekCur(struct udcFile *file, bits64 offset) /* Seek to a particular position in file. */ { file->ios.udc.numSeeks++; file->offset += offset; if (udcCacheEnabled()) ourMustLseek(&file->ios.sparse,file->fdSparse, offset, SEEK_CUR); } void udcSeek(struct udcFile *file, bits64 offset) /* Seek to a particular position in file. */ { file->ios.udc.numSeeks++; file->offset = offset; if (udcCacheEnabled()) ourMustLseek(&file->ios.sparse,file->fdSparse, offset, SEEK_SET); } bits64 udcTell(struct udcFile *file) /* Return current file position. */ { return file->offset; } static long bitRealDataSize(char *fileName) /* Return number of real bytes indicated by bitmaps */ { struct udcBitmap *bits = udcBitmapOpen(fileName); int blockSize = bits->blockSize; long byteSize = 0; int blockCount = (bits->fileSize + blockSize - 1)/blockSize; if (blockCount > 0) { int bitmapSize = bitToByteSize(blockCount); Bits *b = needLargeMem(bitmapSize); mustReadFd( bits->fd, b, bitmapSize); int bitsSet = bitCountRange(b, 0, blockCount); byteSize = (long)bitsSet*blockSize; freez(&b); } udcBitmapClose(&bits); return byteSize; } static bits64 rCleanup(time_t deleteTime, boolean testOnly) /* Delete any bitmap or sparseData files last accessed before deleteTime */ { struct fileInfo *file, *fileList = listDirX(".", "*", FALSE); bits64 results = 0; for (file = fileList; file != NULL; file = file->next) { if (file->isDir) { setCurrentDir(file->name); bits64 oneResult = rCleanup(deleteTime, testOnly); setCurrentDir(".."); if (oneResult > 0) { if (!testOnly) remove(file->name); results += oneResult; results += file->size; } } else if (sameString(file->name, bitmapName)) { if (verboseLevel() >= 4) { if (file->size > udcBitmapHeaderSize) /* prevent failure on bitmap files of size 0 or less than header size */ verbose(4, "%ld (%ld) %s/%s\n", bitRealDataSize(file->name), (long)file->size, getCurrentDir(), file->name); } if (file->lastAccess < deleteTime) { /* Remove all files when get bitmap, so that can ensure they are deleted in * right order. */ results += file->size; if (!testOnly) { remove(bitmapName); remove(sparseDataName); if (fileExists(redirName)) remove(redirName); } } } else if (sameString(file->name, sparseDataName)) { if (results > 0) results += file->size; } } return results; } bits64 udcCleanup(char *cacheDir, double maxDays, boolean testOnly) /* Remove cached files older than maxDays old. If testOnly is set * no clean up is done, but the size of the files that would be * cleaned up is still. */ { time_t maxSeconds = maxDays * 24 * 60 * 60; char *curPath = cloneString(getCurrentDir()); setCurrentDir(cacheDir); time_t deleteTime = time(NULL) - maxSeconds; bits64 result = rCleanup(deleteTime, testOnly); setCurrentDir(curPath); return result; } char *udcDefaultDir() /* Get default directory for cache */ { return defaultDir; } void udcSetDefaultDir(char *path) /* Set default directory for cache */ { defaultDir = cloneString(path); } int udcCacheTimeout() /* Get cache timeout (if local cache files are newer than this many seconds, * we won't ping the remote server to check the file size and update time). */ { return cacheTimeout; } time_t udcUpdateTime(struct udcFile *udc) /* return udc->updateTime */ { if (sameString("transparent", udc->protocol)) { struct stat status; int ret = stat(udc->url, &status); if (ret < 0) return 0; else return status.st_mtime; } return udc->updateTime; } off_t udcFileSize(char *url) /* fetch file size from given URL or local path * returns -1 if not found. */ { if (udcIsLocal(url)) return fileSize(url); off_t ret = -1; #ifdef WIN32 errAbort("udc/udcFileSize: invalid protocol for url %s, only file:// URLs are supported on Windows", url); #else // don't go to the network if we can avoid it off_t cacheSize = udcSizeFromCache(url, NULL); if (cacheSize!=-1) return cacheSize; struct udcRemoteFileInfo info; if (startsWith("http://",url) || startsWith("https://",url)) { if (udcInfoViaHttp(url, &info)) ret = info.size; } else if (startsWith("ftp://",url)) { if (udcInfoViaFtp(url, &info)) ret = info.size; } else errAbort("udc/udcFileSize: invalid protocol for url %s, can only do http/https/ftp", url); #endif return ret; } boolean udcIsLocal(char *url) /* return true if file is not a http or ftp file, just a local file */ { // copied from above char *protocol = NULL, *afterProtocol = NULL, *colon; udcParseUrl(url, &protocol, &afterProtocol, &colon); freez(&protocol); freez(&afterProtocol); return colon==NULL; } rtracklayer/src/ucsc/udc.h0000644000175100017510000001453414614231172016575 0ustar00biocbuildbiocbuild/* udc - url data cache - a caching system that keeps blocks of data fetched from URLs in * sparse local files for quick use the next time the data is needed. * * This cache is enormously simplified by there being no local _write_ to the cache, * just reads. * * The overall strategy of the implementation is to have a root cache directory * with a subdir for each file being cached. The directory for a single cached file * contains two files - "bitmap" and "sparseData" that contains information on which * parts of the URL are cached and the actual cached data respectively. The subdirectory name * associated with the file is constructed from the URL in a straightforward manner. * http://genome.ucsc.edu/cgi-bin/hgGateway * gets mapped to: * rootCacheDir/http/genome.ucsc.edu/cgi-bin/hgGateway/ * The URL protocol is the first directory under the root, and the remainder of the * URL, with some necessary escaping, is used to define the rest of the cache directory * structure, with each '/' after the protocol line translating into another directory * level. * * The bitmap file contains time stamp and size data as well as an array with one bit * for each block of the file that has been fetched. Currently the block size is 8K. */ #ifndef UDC_H #define UDC_H struct udcFile; /* Handle to a cached file. Inside of structure mysterious unless you are udc.c. */ struct udcFile *udcFileMayOpen(char *url, char *cacheDir); /* Open up a cached file. cacheDir may be null in which case udcDefaultDir() will be * used. Return NULL if file doesn't exist. */ struct udcFile *udcFileOpen(char *url, char *cacheDir); /* Open up a cached file. cacheDir may be null in which case udcDefaultDir() will be * used. Abort if if file doesn't exist. */ void udcFileClose(struct udcFile **pFile); /* Close down cached file. */ bits64 udcRead(struct udcFile *file, void *buf, bits64 size); /* Read a block from file. Return amount actually read. */ #define udcReadOne(file, var) udcRead(file, &(var), sizeof(var)) /* Read one variable from file or die. */ void udcMustRead(struct udcFile *file, void *buf, bits64 size); /* Read a block from file. Abort if any problem, including EOF before size is read. */ #define udcMustReadOne(file, var) udcMustRead(file, &(var), sizeof(var)) /* Read one variable from file or die. */ bits64 udcReadBits64(struct udcFile *file, boolean isSwapped); /* Read and optionally byte-swap 64 bit entity. */ bits32 udcReadBits32(struct udcFile *file, boolean isSwapped); /* Read and optionally byte-swap 32 bit entity. */ bits16 udcReadBits16(struct udcFile *file, boolean isSwapped); /* Read and optionally byte-swap 16 bit entity. */ float udcReadFloat(struct udcFile *file, boolean isSwapped); /* Read and optionally byte-swap floating point number. */ double udcReadDouble(struct udcFile *file, boolean isSwapped); /* Read and optionally byte-swap double-precision floating point number. */ int udcGetChar(struct udcFile *file); /* Get next character from file or die trying. */ char *udcReadLine(struct udcFile *file); /* Fetch next line from udc cache. */ char *udcReadStringAndZero(struct udcFile *file); /* Read in zero terminated string from file. Do a freeMem of result when done. */ char *udcFileReadAll(char *url, char *cacheDir, size_t maxSize, size_t *retSize); /* Read a complete file via UDC. The cacheDir may be null in which case udcDefaultDir() * will be used. If maxSize is non-zero, check size against maxSize * and abort if it's bigger. Returns file data (with an extra terminal for the * common case where it's treated as a C string). If retSize is non-NULL then * returns size of file in *retSize. Do a freeMem or freez of the returned buffer * when done. */ void udcSeek(struct udcFile *file, bits64 offset); /* Seek to a particular (absolute) position in file. */ void udcSeekCur(struct udcFile *file, bits64 offset); /* Seek to a particular (from current) position in file. */ bits64 udcTell(struct udcFile *file); /* Return current file position. */ bits64 udcCleanup(char *cacheDir, double maxDays, boolean testOnly); /* Remove cached files older than maxDays old. If testOnly is set * no clean up is done, but the size of the files that would be * cleaned up is still. */ void udcParseUrl(char *url, char **retProtocol, char **retAfterProtocol, char **retColon); /* Parse the URL into components that udc treats separately. * *retAfterProtocol is Q-encoded to keep special chars out of filenames. * Free all *ret's except *retColon when done. */ void udcParseUrlFull(char *url, char **retProtocol, char **retAfterProtocol, char **retColon, char **retAuth); /* Parse the URL into components that udc treats separately. * *retAfterProtocol is Q-encoded to keep special chars out of filenames. * Free all *ret's except *retColon when done. */ char *udcDefaultDir(); /* Get default directory for cache. Use this for the udcFileOpen call if you * don't have anything better.... */ void udcSetDefaultDir(char *path); /* Set default directory for cache */ #define udcDevicePrefix "udc:" /* Prefix used by convention to indicate a file should be accessed via udc. This is * followed by the local path name or a url, so in common practice you see things like: * udc:http://genome.ucsc.edu/goldenPath/hg18/tracks/someTrack.bb */ struct slName *udcFileCacheFiles(char *url, char *cacheDir); /* Return low-level list of files used in cache. */ long long int udcSizeFromCache(char *url, char *cacheDir); /* Look up the file size from the local cache bitmap file, or -1 if there * is no cache for url. */ unsigned long udcCacheAge(char *url, char *cacheDir); /* Return the age in seconds of the oldest cache file. If a cache file is * missing, return the current time (seconds since the epoch). */ int udcCacheTimeout(); /* Get cache timeout (if local cache files are newer than this many seconds, * we won't ping the remote server to check the file size and update time). */ time_t udcUpdateTime(struct udcFile *udc); /* return udc->updateTime */ boolean udcFastReadString(struct udcFile *f, char buf[256]); /* Read a string into buffer, which must be long enough * to hold it. String is in 'writeString' format. */ off_t udcFileSize(char *url); /* fetch remote or loca file size from given URL or path */ boolean udcIsLocal(char *url); /* return true if url is not a http or ftp file, just a normal local file path */ #endif /* UDC_H */ rtracklayer/src/ucsc/verbose.c0000644000175100017510000000526314614231172017461 0ustar00biocbuildbiocbuild/* verbose.c - write out status messages according to the * current verbosity level. These messages go to stderr. */ /* Copyright (C) 2011 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "portable.h" #include "verbose.h" static int logVerbosity = 1; /* The level of log verbosity. 0 is silent. */ static FILE *logFile; /* File to log to. */ static boolean checkedDotsEnabled = FALSE; /* have we check for dot output * being enabled? */ static boolean dotsEnabled = FALSE; /* is dot output enabled? */ void verboseVa(int verbosity, char *format, va_list args) /* Log with at given verbosity vprintf formatted args. */ { if (verbosity <= logVerbosity) { if (logFile == NULL) logFile = stderr; vfprintf(logFile, format, args); fflush(logFile); } } void verbose(int verbosity, char *format, ...) /* Write printf formatted message to log (which by * default is stderr) if global verbose variable * is set to verbosity or higher. */ { va_list args; va_start(args, format); verboseVa(verbosity, format, args); va_end(args); } static long lastTime = -1; // previous call time. void verboseTimeInit(void) /* Initialize or reinitialize the previous time for use by verboseTime. */ { lastTime = clock1000(); } void verboseTime(int verbosity, char *label, ...) /* Print label and how long it's been since last call. Start time can be * initialized with verboseTimeInit, otherwise the elapsed time will be * zero. */ { assert(label != NULL); // original version allowed this, but breaks some GCCs if (lastTime < 0) verboseTimeInit(); long time = clock1000(); va_list args; va_start(args, label); verboseVa(verbosity, label, args); verbose(verbosity, ": %ld millis\n", time - lastTime); lastTime = time; va_end(args); } boolean verboseDotsEnabled() /* check if outputting of happy dots are enabled. They will be enabled if the * verbosity is > 0, stderr is a tty and we don't appear to be running an * emacs shell. */ { if (!checkedDotsEnabled) { if (logFile == NULL) logFile = stderr; dotsEnabled = (logVerbosity > 0) && isatty(fileno(logFile)); if (dotsEnabled) { /* check for an possible emacs shell */ char *emacs = getenv("emacs"); char *term = getenv("TERM"); if ((emacs != NULL) && (emacs[0] == 't')) dotsEnabled = FALSE; else if ((term != NULL) && sameString(term, "dumb")) dotsEnabled = FALSE; } checkedDotsEnabled = TRUE; } return dotsEnabled; } int verboseLevel(void) /* Get verbosity level. */ { return logVerbosity; } rtracklayer/src/ucsc/verbose.h0000644000175100017510000000225614614231172017465 0ustar00biocbuildbiocbuild/* verbose.h - write out status messages according to the * current verbosity level. These messages go to stderr. */ #ifndef VERBOSE_H #define VERBOSE_H void verbose(int verbosity, char *format, ...) /* Write printf formatted message to log (which by * default is stderr) if global verbose variable * is set to verbosity or higher. */ #if defined(__GNUC__) __attribute__((format(printf, 2, 3))) #endif ; void verboseVa(int verbosity, char *format, va_list args); /* Log with at given verbosity vprintf formatted args. */ void verboseTimeInit(void); /* Initialize or reinitialize the previous time for use by verboseTime. */ void verboseTime(int verbosity, char *label, ...) /* Print label and how long it's been since last call. Start time can be * initialized with verboseTimeInit, otherwise the elapsed time will be * zero. */ #if defined(__GNUC__) __attribute__((format(printf, 2, 3))) #endif ; boolean verboseDotsEnabled(); /* check if outputting of happy dots are enabled. They will be enabled if the * verbosity is > 0, stderr is a tty and we don't appear to be running an * emacs shell. */ int verboseLevel(void); /* Get verbosity level. */ #endif /* VERBOSE_H */ rtracklayer/src/ucsc/wildcmp.c0000644000175100017510000000371714614231172017455 0ustar00biocbuildbiocbuild/* Wildcard matching. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" static int subMatch(const char *str, const char *wild, char single, char multi) /* Returns number of characters that match between str and wild up * to the next wildcard in wild (or up to end of string.). */ { int len = 0; for(;;) { if(toupper(*str++) != toupper(*wild++) ) return(0); ++len; char c = *wild; if (c == 0 || c == single || c == multi) return len; } } static boolean globMatch(const char *wildCard, const char *string, char single, char multi) /* does a case sensitive wild card match with a string. * * matches any string or no character. * ? matches any single character. * anything else etc must match the character exactly. */ { boolean matchStar = 0; int starMatchSize; char c; for(;;) { NEXT_WILD: c = *wildCard; if (c == 0) { if(matchStar) { while(*string++) ; return TRUE; } else if(*string) return FALSE; else return TRUE; } else if (c == multi) { matchStar = TRUE; } else if (c == single) { if(*string == 0) return FALSE; /* out of string, no match for ? */ ++string; } else { if(matchStar) { for(;;) { if(*string == 0) /* if out of string no match */ return FALSE; /* note matchStar is re-used here for substring * after star match length */ if((starMatchSize = subMatch(string,wildCard,single,multi)) != 0) { string += starMatchSize; wildCard += starMatchSize; matchStar = FALSE; goto NEXT_WILD; } ++string; } } /* default: they must be equal or no match */ if(toupper(*string) != toupper(*wildCard)) return FALSE; ++string; } ++wildCard; } } boolean wildMatch(const char *wildCard, const char *string) /* Match using * and ? wildcards. */ { return globMatch(wildCard, string, '?', '*'); } rtracklayer/src/ucsc/zlibFace.c0000644000175100017510000000441214614231172017526 0ustar00biocbuildbiocbuild/* Wrappers around zlib to make interfacing to it a bit easier. */ /* Copyright (C) 2009 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include static char *zlibErrorMessage(int err) /* Convert error code to errorMessage */ { switch (err) { case Z_STREAM_END: return "zlib stream end"; case Z_NEED_DICT: return "zlib need dictionary"; case Z_ERRNO: return "zlib errno"; case Z_STREAM_ERROR: return "zlib data error"; case Z_DATA_ERROR: return "zlib data error"; case Z_MEM_ERROR: return "zlib mem error"; case Z_BUF_ERROR: return "zlib buf error"; case Z_VERSION_ERROR: return "zlib version error"; case Z_OK: return NULL; default: { static char msg[128]; safef(msg, sizeof(msg), "zlib error code %d", err); return msg; } } } size_t zCompress( void *uncompressed, /* Start of area to compress. */ size_t uncompressedSize, /* Size of area to compress. */ void *compBuf, /* Where to put compressed bits */ size_t compBufSize) /* Size of compressed bits - calculate using zCompBufSize */ /* Compress data from memory to memory. Returns size after compression. */ { uLongf compSize = compBufSize; int err = compress((Bytef*)compBuf, &compSize, (Bytef*)uncompressed, (uLong)uncompressedSize); if (err != 0) errAbort("Couldn't zCompress %lld bytes: %s", (long long)uncompressedSize, zlibErrorMessage(err)); return compSize; } size_t zCompBufSize(size_t uncompressedSize) /* Return size of buffer needed to compress something of given size uncompressed. */ { return 1.001*uncompressedSize + 13; } size_t zUncompress( void *compressed, /* Compressed area */ size_t compressedSize, /* Size after compression */ void *uncompBuf, /* Where to put uncompressed bits */ size_t uncompBufSize) /* Max size of uncompressed bits. */ /* Uncompress data from memory to memory. Returns size after decompression. */ { uLongf uncSize = uncompBufSize; int err = uncompress(uncompBuf, &uncSize, compressed, compressedSize); if (err != 0) errAbort("Couldn't zUncompress %lld bytes: %s", (long long)compressedSize, zlibErrorMessage(err)); return uncSize; } rtracklayer/src/ucsc/zlibFace.h0000644000175100017510000000164214614231172017535 0ustar00biocbuildbiocbuild/* Wrappers around zlib to make interfacing to it a bit easier. */ #ifndef ZLIBFACE_H #define ZLIBFACE_H size_t zCompress( void *uncompressed, /* Start of area to compress. */ size_t uncompressedSize, /* Size of area to compress. */ void *compBuf, /* Where to put compressed bits */ size_t compBufSize); /* Size of compressed bits - calculate using zCompBufSize */ /* Compress data from memory to memory. Returns size after compression. */ size_t zCompBufSize(size_t uncompressedSize); /* Return size of buffer needed to compress something of given size uncompressed. */ size_t zUncompress( void *compressed, /* Compressed area */ size_t compressedSize, /* Size after compression */ void *uncompBuf, /* Where to put uncompressed bits */ size_t uncompBufSize); /* Max size of uncompressed bits. */ /* Uncompress data from memory to memory. Returns size after decompression. */ #endif /* ZLIBFACE_H */ rtracklayer/src/utils.c0000644000175100017510000000213214614231172016207 0ustar00biocbuildbiocbuild#include "utils.h" SEXP _STRSXP_collapse(SEXP x, SEXP sep) { int len = 0; char *collapsed, *dest; char c_sep = CHAR(STRING_ELT(sep, 0))[0]; if (TYPEOF(x) != STRSXP) error("_STRSXP_collapse: expected a STRSXP"); if (length(x) == 1) return(STRING_ELT(x, 0)); for (int i = 0; i < length(x); i++) len += strlen(CHAR(STRING_ELT(x, i))) + 1; collapsed = R_alloc(sizeof(char), len); dest = collapsed; for (int i = 0; i < length(x); i++) { const char *src = CHAR(STRING_ELT(x, i)); int src_len = strlen(src); strcpy(dest, src); dest[src_len] = c_sep; dest += src_len + 1; } return mkCharLen(collapsed, len - 1 * (length(x) > 0)); } /* Utility for collapsing elements of a CharacterList */ /* Assumes that 'x' is a 'list' */ SEXP CharacterList_pasteCollapse(SEXP x, SEXP sep) { SEXP ans; if (TYPEOF(x) != VECSXP) error("CharacterList_collapse: expected a list"); PROTECT(ans = allocVector(STRSXP, length(x))); for (int i = 0; i < length(x); i++) SET_STRING_ELT(ans, i, _STRSXP_collapse(VECTOR_ELT(x, i), sep)); UNPROTECT(1); return ans; } rtracklayer/src/utils.h0000644000175100017510000000016714614231172016222 0ustar00biocbuildbiocbuild#ifndef UTILS_H #define UTILS_H #include "rtracklayer.h" SEXP CharacterList_pasteCollapse(SEXP x, SEXP sep); #endif rtracklayer/src/XVector_stubs.c0000644000175100017510000000003414614231172017660 0ustar00biocbuildbiocbuild#include <_XVector_stubs.c> rtracklayer/tests/0000755000175100017510000000000014614231172015260 5ustar00biocbuildbiocbuildrtracklayer/tests/rtracklayer_unit_tests.R0000644000175100017510000000013314614231172022204 0ustar00biocbuildbiocbuildrequire("rtracklayer") || stop("unable to load rtracklayer package") rtracklayer:::.test() rtracklayer/TODO0000644000175100017510000000045314614231172014610 0ustar00biocbuildbiocbuild- List subtracks for a supertrack in the UCSC browser - Up-front column selection - Chunked importing (pass a chunk size and callback to import) - Attach to existing saved sessions - Represent formats with formal class in I/O framework, rather than ".format" - Port to track reading and writing to Crtracklayer/vignettes/0000755000175100017510000000000014614353501016127 5ustar00biocbuildbiocbuildrtracklayer/vignettes/example.bed0000644000175100017510000000131414614231172020234 0ustar00biocbuildbiocbuild##Example 5 from Custom Annotation Tracks User's Guide track name="ItemRGBDemo" description="Item RGB demonstration" visibility=2 itemRgb="On" priority=1 useScore="0" color="0,60,120" colorByStrand="0,0,255 255,0,0" group="user" offset=0 url="http://genome.ucsc.edu/" htmlUrl="http://genome.ucsc.edu/goldenPath/help/ct_description.txt" chr7 127471196 127472363 Pos1 0 + 127471196 127472363 255,0,0 3 300,200,100 0,500,1067 chr7 127472363 127473530 Pos2 2 + 127472363 127473530 255,0,0 2 250,500 0,667 chr7 127473530 127474697 Neg1 0 - 127473530 127474697 255,0,0 1 1167 0 chr16 127474697 127475864 Pos3 5 + 127474697 127475864 255,0,0 1 1167 0 chr16 127475864 127477031 Neg2 5 - 127475864 127477031 0,0,255 1 1167 0 rtracklayer/vignettes/rtracklayer.Rnw0000644000175100017510000006634414614231172021156 0ustar00biocbuildbiocbuild\documentclass{article} %\VignetteIndexEntry{rtracklayer} \usepackage[usenames,dvipsnames]{color} \usepackage[colorlinks=true, linkcolor=Blue, urlcolor=Blue, citecolor=Blue]{hyperref} \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Rfunarg}[1]{{\texttt{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \newcommand{\Rcode}[1]{{\texttt{#1}}} \newcommand{\software}[1]{\textsf{#1}} \newcommand{\R}{\software{R}} \newcommand{\IRanges}{\Rpackage{IRanges}} \title{The \textbf{rtracklayer} package} \author{Michael Lawrence} \begin{document} \maketitle <>= options(width=70) @ \tableofcontents \section{Introduction} The \textbf{rtracklayer} package is an interface (or \emph{layer}) between \textbf{R} and genome browsers. Its main purpose is the visualization of genomic annotation \emph{tracks}, whether generated through experimental data analysis performed in R or loaded from an external data source. The features of \textbf{rtracklayer} may be divided into two categories: 1) the import/export of track data and 2) the control and querying of external genome browser sessions and views. The basic track data structure in Bioconductor is the \Rclass{GRanges} class, defined in the \Rpackage{GenomicRanges} package. \textbf{rtracklayer} supports the import and export of tracks from and to files in various formats, see Section~\ref{sec:import-export}. All positions in a \Rclass{GRanges} should be 1-based, as in R itself. The \textbf{rtracklayer} package currently interfaces with the \textbf{UCSC} web-based genome browser. Other packages may provide drivers for other genome browsers through a plugin system. With \textbf{rtracklayer}, the user may start a genome browser session, create and manipulate genomic views, and import/export tracks and sequences to and from a browser. Please note that not all features are necessarily supported by every browser interface. The rest of this vignette will consist of a number of case studies. First, we consider an experiment investigating microRNA regulation of gene expression, where the microRNA target sites are the primary genomic features of interest. \section{Gene expression and microRNA target sites} This section will demonstrate the features of \textbf{rtracklayer} on a microarray dataset from a larger experiment investigating the regulation of human stem cell differentiation by microRNAs. The transcriptome of the cells was measured before and after differentiation by HG-U133plus2 Affymetrix GeneChip arrays. We begin our demonstration by constructing an annotation dataset from the experimental data, and then illustrate the use of the genome browser interface to display interesting genomic regions in the UCSC browser. \subsection{Creating a target site track} For the analysis of the stem cell microarray data, we are interested in the genomic regions corresponding to differentially expressed genes that are known to be targeted by a microRNA. We will represent this information as an annotation track, so that we may view it in the UCSC genome browser. \subsubsection{Constructing the \Rclass{GRanges}} In preparation for creating the microRNA target track, we first used \textbf{limma} to detect the differentially expressed genes in the microarray experiment. The locations of the microRNA target sites were obtained from MiRBase. The code below stores information about the target sites on differentially expressed genes in the \textit{data.frame} called \texttt{targets}, which can also be obtained by entering \texttt{data(targets)} when \textbf{rtracklayer} is loaded. % <>= library("humanStemCell") data(fhesc) library("genefilter") filtFhesc <- nsFilter(fhesc)[[1]] library("limma") design <- model.matrix(~filtFhesc$Diff) hesclim <- lmFit(filtFhesc, design) hesceb <- eBayes(hesclim) tab <- topTable(hesceb, coef = 2, adjust.method = "BH", n = 7676) tab2 <- tab[(tab$logFC > 1) & (tab$adj.P.Val < 0.01),] affyIDs <- rownames(tab2) library("microRNA") data(hsTargets) library("hgu133plus2.db") entrezIDs <- mappedRkeys(hgu133plus2ENTREZID[affyIDs]) library("org.Hs.eg.db") mappedEntrezIDs <- entrezIDs[entrezIDs %in% mappedkeys(org.Hs.egENSEMBLTRANS)] ensemblIDs <- mappedRkeys(org.Hs.egENSEMBLTRANS[mappedEntrezIDs]) targetMatches <- match(ensemblIDs, hsTargets$target, 0) ## same as data(targets) targets <- hsTargets[targetMatches,] targets$chrom <- paste("chr", targets$chrom, sep = "") @ % The following code creates the track from the \texttt{targets} dataset: % <>= library(rtracklayer) library(GenomicRanges) ## call data(targets) if skipping first block head(targets) targetRanges <- IRanges(targets$start, targets$end) targetTrack <- with(targets, GRangesForUCSCGenome("hg18", chrom, targetRanges, strand, name, target)) @ % The \Rfunction{GRangesForUCSCGenome} function constructs a \Rclass{GRanges} object for the named genome. The strand information, the name of the microRNA and the Ensembl ID of the targeted transcript are stored in the \Rclass{GRanges}. The chromosome for each site is passed as the \texttt{chrom} argument. The chromosome names and lengths for the genome are taken from the UCSC database and stored in the \Rclass{GRanges} along with the genome identifier. We can retrieve them as follows: <>= genome(targetTrack) head(seqlengths(targetTrack)) @ % While this extra information is not strictly needed to upload data to UCSC, calling \Rfunction{GRangesForUCSCGenome} is an easy way to formally associate interval data to a UCSC genome build. This ensures, for example, that the data will always be uploaded to the correct genome, regardless of browser state. It also immediately validates whether the intervals fall within the bounds of the genome. For cases where one is not interacting with the UCSC genome browser, and in particular when network access is unavailable, the \Rfunction{GRangesForBSGenome} function behaves the same, except it finds an installed \Rpackage{BSGenome} package and loads it to retrieve the chromosome information. \subsubsection{Accessing track information} The track information is now stored in the R session as a \Rclass{GRanges} object. It holds the chromosme, start, end and strand for each feature, along with any number of data columns. The primary feature attributes are the \texttt{start}, \texttt{end}, \texttt{seqnames} and \texttt{strand}. There are accessors for each of these, named accordingly. For example, the following code retrieves the chromosome names and then start positions for each feature in the track. % <>= head(seqnames(targetTrack)) head(start(targetTrack)) @ % \paragraph{Exercises} \begin{enumerate} \item Get the strand of each feature in the track \item Calculate the length of each feature \item Reconstruct (partially) the \texttt{targets} \Rclass{data.frame} \end{enumerate} <>= head(strand(targetTrack)) head(width(targetTrack)) data.frame(chrom = as.factor(seqnames(targetTrack)), start = start(targetTrack), end = end(targetTrack), strand = as.factor(strand(targetTrack))) @ \subsubsection{Subsetting a \textit{GRanges}} It is often helpful to extract subsets from \Rclass{GRanges} instances, especially when uploading to a genome browser. The data can be subset though a matrix-style syntax by feature and column. The conventional \texttt{[} method is employed for subsetting, where the first parameter, \textit{i}, indexes the features and \textit{j} indexes the data columns. Both \textit{i} and \textit{j} may contain numeric, logical and character indices, which behave as expected. % <>= ## get the first 10 targets first10 <- targetTrack[1:10] ## get pos strand targets posTargets <- targetTrack[strand(targetTrack) == "+"] ## get the targets on chr1 chr1Targets <- targetTrack[seqnames(targetTrack) == "chr1"] @ % \paragraph{Exercises} \begin{enumerate} \item Subset the track for all features on the negative strand of chromosome 2. \end{enumerate} <>= negChr2Targets <- targetTrack[strand(targetTrack) == "-" & seqnames(targetTrack) == "chr2"] @ \subsubsection{Exporting and importing tracks} \label{sec:import-export} Import and export of \Rclass{GRanges} instances is supported in the following formats: Browser Extended Display (BED), versions 1, 2 and 3 of the General Feature Format (GFF), and Wiggle (WIG). Support for additional formats may be provided by other packages through a plugin system. To save the microRNA target track created above in a format understood by other tools, we could export it as BED. This is done with the \texttt{export} function, which accepts a filename or any R connection object as its target. If a target is not given, the serialized string is returned. The desired format is derived, by default, from the extension of the filename. Use the \texttt{format} parameter to explicitly specify a format. <>= export(targetTrack, "targets.bed") @ To read the data back in a future session, we could use the \texttt{import} function. The source of the data may be given as a connection, a filename or a character vector containing the data. Like the \texttt{export} function, the format is determined from the filename, by default. <>= restoredTrack <- import("targets.bed") @ % The \Robject{restoredTrack} object is of class \Rclass{GRanges}. % \paragraph{Exercises} \begin{enumerate} \item Output the track to a file in the ``gff'' format. \item Read the track back into R. \item Export the track as a character vector. \end{enumerate} <>= export(targetTrack, "targets.gff") targetGff <- import("targets.gff") targetChar <- export(targetTrack, format = "gff1") @ \subsection{Viewing the targets in a genome browser} For the next step in our example, we will load the track into a genome browser for visualization with other genomic annotations. The \textbf{rtracklayer} package is capable of interfacing with any genome browser for which a driver exists. In this case, we will interact with the web-based \textbf{UCSC} browser, but the same code should work for any browser. \subsubsection{Starting a session} The first step towards interfacing with a browser is to start a browser session, represented in R as a \textit{BrowserSession} object. A \textit{BrowserSession} is primarily a container of tracks and genomic views. The following code creates a \textit{BrowserSession} for the \textbf{UCSC} browser: <>= session <- browserSession("UCSC") @ Note that the name of any other supported browser could have been given here instead of ``UCSC''. To see the names of supported browsers, enter: <>= genomeBrowsers() @ \subsubsection{Laying the track} Before a track can be viewed on the genome, it must be loaded into the session using the \texttt{track<-} function, as demonstrated below: <>= track(session, "targets") <- targetTrack @ The \textit{name} argument should be a character vector that will help identify the track within \texttt{session}. Note that the invocation of \texttt{track<-} above does not specify an upload format. Thus, the default, ``auto'', is used. Since the track does not contain any data values, the track is uploaded as BED. To make this explicit, we could pass ``bed'' as the \textit{format} parameter. \paragraph{Exercises} \begin{enumerate} \item Lay a track with the first 100 features of \texttt{targetTrack} \end{enumerate} Here we use the short-cut \texttt{\$} syntax for storing the track. <>= session$target100 <- targetTrack[1:100] @ \subsubsection{Viewing the track} For \textbf{UCSC}, a view roughly corresponds to one tab or window in the web browser. The target sites are distributed throughout the genome, so we will only be able to view a few features at a time. In this case, we will view only the first feature in the track. A convenient way to focus a view on a particular set of features is to subset the track and pass the range of the subtrack to the constructor of the view. Below we take a track subset that contains only the first feature. <>= subTargetTrack <- targetTrack[1] # get first feature @ Now we call the \texttt{browserView} function to construct the view and pass the subtrack, zoomed out by a factor of 10, as the segment to view. By passing the name of the targets track in the \textit{pack} parameter, we instruct the browser to use the ``pack'' mode for viewing the track. This results in the name of the microRNA appearing next to the target site glyph. <>= view <- browserView(session, subTargetTrack * -10, pack = "targets") @ If multiple ranges are provided, multiple views are launched: <>= view <- browserView(session, targetTrack[1:5] * -10, pack = "targets") @ \paragraph{Exercises} \begin{enumerate} \item Create a new view with the same region as \texttt{view}, except zoomed out 2X. \item Create a view with the ``targets'' track displayed in ``full'' mode, instead of ``packed''. \end{enumerate} <>= viewOut <- browserView(session, range(view) * -2) viewFull <- browserView(session, full = "targets") @ \subsubsection{A shortcut} There is also a shortcut to the above steps. The \texttt{browseGenome} function creates a session for a specified browser, loads one or more tracks into the session and creates a view of a given genome segment. In the following code, we create a new \textbf{UCSC} session, load the track and view the first two features, all in one call: <>= browseGenome(targetTrack, range = subTargetTrack * -10) @ It is even simpler to view the subtrack in \textbf{UCSC} by relying on parameter defaults: <>= browseGenome(subTargetTrack) @ \subsubsection{Downloading Tracks from your Web Browser} @ It is possible to query the browser to obtain the names of the loaded tracks and to download the tracks into R. To list the tracks loaded in the browser, enter the following: % <>= loaded_tracks <- trackNames(session) @ % One may download any of the tracks, such as the ``targets'' track that was loaded previously in this example. % <>= subTargetTrack <- track(session, "targets") @ % The returned object is a \Rclass{GRanges}, even if the data was originally uploaded as another object. By default, the segment of the track downloaded is the current default genome segment associated with the session. One may download track data for any genome segment, such as those on a particular chromosome. Note that this does not distinguish by strand; we are only indicating a position on the genome. % <>= chr1Targets <- track(session, "targets", chr1Targets) @ \paragraph{Exercises} \begin{enumerate} \item Get the SNP under the first target, displayed in \texttt{view}. \item Get the UCSC gene for the same target. \end{enumerate} <>= region <- range(subTargetTrack) + 500 targetSNP <- track(session, "snp130", region) as.data.frame(targetSNP) targetGene <- track(session, "knownGene", region) as.data.frame(targetGene) @ \subsubsection{Accessing view state} The \texttt{view} variable is an instance of \textit{BrowserView}, which provides an interface for getting and setting view attributes. Note that for the UCSC browser, changing the view state opens a new view, as a new page must be opened in the web browser. To programmatically query the segment displayed by a view, use the \texttt{range} method for a \textit{BrowserView}. % <>= segment <- range(view) @ % Similarly, one may get and set the names of the visible tracks in the view. <>= visible_tracks <- trackNames(view) trackNames(view) <- visible_tracks @ The visibility mode (hide, dense, pack, squish, full) of the tracks may be retrieved with the \texttt{ucscTrackModes} method. % <>= modes <- ucscTrackModes(view) @ % The returned value, \texttt{modes}, is of class \textit{UCSCTrackModes}. The modes may be accessed using the \texttt{[} function. Here, we set the mode of our ``targets'' track to ``full'' visibility. <>= modes["targets"] modes["targets"] <- "full" ucscTrackModes(view) <- modes @ Existing browser views for a session may be retrieved by calling the \texttt{browserViews} method on the \textit{browserSession} instance. % <>= views <- browserViews(session) length(views) @ % \paragraph{Exercises} \begin{enumerate} \item Retrieve target currently visible in the view. \item Limit the view to display only the SNP, UCSC gene and target track. \item Hide the UCSC gene track. \end{enumerate} <>= viewTarget <- track(session, "targets", range(view)) trackNames(view) <- c("snp130", "knownGene", "targets") ucscTrackModes(view)["knownGene"] <- "hide" @ \section{CPNE1 expression and HapMap SNPs} Included with the \textbf{rtracklayer} package is a track object (created by the \textbf{GGtools} package) with features from a subset of the SNPs on chromosome 20 from 60 HapMap founders in the CEU cohort. Each SNP has an associated data value indicating its association with the expression of the CPNE1 gene according to a Cochran-Armitage 1df test. The top 5000 scoring SNPs were selected for the track. We load the track presently. <>= library(rtracklayer) data(cpneTrack) @ \subsection{Loading and manipulating the track} The data values for a track are stored in the metadata columns of the \textit{GRanges} instance. Often, a track contains a single column of numeric values, conventionally known as the \textit{score}. The \texttt{score} function retrieves the metadata column named \textit{score} or, if one does not exist, the first metadata column in the \textit{GRanges}, as long as it is numeric. Otherwise, \texttt{NULL} is returned. <>= head(score(cpneTrack)) @ % Sometimes, it may be convenient to extract the track information as a % \textit{data.frame}. The \textit{trackData} function does this by % combining the \textit{featureData} matrix with the \textit{dataVals}. % It also adds a column named \textit{featMid}, which gives the % mid-points (the mean of the start and end positions) of each feature % in the track. Here is an example of using \textit{trackData} to plot % the test value for each SNP vs. its position. One use of extracting the data values is to plot the data. <>= plot(start(cpneTrack), score(cpneTrack)) @ \subsection{Browsing the SNPs} We now aim to view some of the SNPs in the UCSC browser. Unlike the microRNA target site example above, this track has quantitative information, which requires special consideration for visualization. \subsubsection{Laying a WIG track} To view the SNP locations as a track in a genome browser, we first need to upload the track to a fresh session. In the code below, we use the \texttt{[[<-} alias of \texttt{track<-}. <>= session <- browserSession() session$cpne <- cpneTrack @ % Note that because \texttt{cpneTrack} contains data values and its features do not overlap, it is uploaded to the browser in the WIG format. One limitation of the WIG format is that it is not possible to encode strand information. Thus, each strand needs to have its own track, and \textbf{rtracklayer} does this automatically, unless only one strand is represented in the track (as in this case). One could pass ``bed'' to the \textit{format} parameter of \texttt{track<-} to prevent the split, but tracks uploaded as BED are much more limited compared to WIG tracks in terms of visualization options. To form the labels for the WIG subtracks, `` p'' is concatenated onto the plus track and `` m'' onto the minus track. Features with missing track information are placed in a track named with the `` na'' postfix. It is important to note that the subtracks must be identified individually when, for example, downloading the track or changing track visibility. \subsubsection{Plotting the SNP track} To plot the data values for the SNP's in a track, we need to create a \textit{browserView}. We will view the region spanning the first 5 SNPs in the track, which will be displayed in the ``full'' mode. % <>= view <- browserView(session, range(cpneTrack[1:5,]), full = "cpne") @ % The UCSC browser will plot the data values as bars. There are several options available for tweaking the plot, as described in the help for the \textit{GraphTrackLine} class. These need to be specified laying the track, so we will lay a new track named ``cpne2''. First, we will turn the \textit{autoScale} option off, so that the bars will be scaled globally, rather than locally to the current view. Then we could turn on the \textit{yLineOnOff} option to add horizontal line that could represent some sort of cut-off. The position of the line is specified by \textit{yLineMark}. We set it arbitrarily to the 25\% quantile. % <>= track(session, "cpne2", autoScale = FALSE, yLineOnOff = TRUE, yLineMark = quantile(score(cpneTrack), .25)) <- cpneTrack view <- browserView(session, range(cpneTrack[1:5,]), full = "cpne2") @ % \section{Binding sites for NRSF} \label{sec:binding} Another common type of genomic feature is transcription factor binding sites. Here we will use the \textbf{Biostrings} package to search for matches to the binding motif for NRSF, convert the result to a track, and display a portion of it in the \textbf{UCSC} browser. \subsection{Creating the binding site track} We will use the \textbf{Biostrings} package to search human chromosome 1 for NRSF binding sites. The binding sequence motif is assumed to be \textit{TCAGCACCATGGACAG}, though in reality it is more variable. To perform the search, we run \textit{matchPattern} on the positive strand of chromosome 1. % <>= library(BSgenome.Hsapiens.UCSC.hg19) nrsfHits <- matchPattern("TCAGCACCATGGACAG", Hsapiens[["chr1"]]) length(nrsfHits) # number of hits @ % We then convert the hits, stored as a \textit{Views} object, to a \textit{GRanges} instance. % <>= nrsfTrack <- GenomicData(ranges(nrsfHits), strand="+", chrom="chr1", genome = "hg19") @ % \Rfunction{GenomicData} is a convenience function that constructs a \Rclass{GRanges} object. \subsection{Browsing the binding sites} Now that the NRSF binding sites are stored as a track, we can upload them to the UCSC browser and view them. Below, load the track and we view the region around the first hit in a single call to \texttt{browseGenome}. % <>= session <- browseGenome(nrsfTrack, range = range(nrsfTrack[1]) * -10) @ % We observe significant conservation across mammal species in the region of the motif. \section{Downloading tracks from UCSC} \Rclass{rtracklayer} can be used to download annotation tracks from the UCSC table browser, thus providing a convenient programmatic alternative to the web interface available at \url{https://genome.ucsc.edu/cgi-bin/hgTables}. \textbf{Note} that not all tables are output in parseable form, and that \textbf{UCSC will truncate responses} if they exceed certain limits (usually around 100,000 records). The safest (and most efficient) bet for large queries is to download the file via FTP and query it locally. \subsection{Example 1: the RepeatMasker Track} This simple example identifies repeat-masked regions in and around the transcription start site (TSS) of the human E2F3 gene, in hg19: <>= library (rtracklayer) mySession = browserSession("UCSC") genome(mySession) <- "hg19" e2f3.tss.grange <- GRanges("chr6", IRanges(20400587, 20403336)) tbl.rmsk <- getTable( ucscTableQuery(mySession, track="rmsk", range=e2f3.tss.grange, table="rmsk")) @ There are several important points to understand about this example: \begin{enumerate} \item The \Rcode{ucscTableQuery} used above is a proxy for, and provides communication with, the remote UCSC table browser (see \url{https://genome.ucsc.edu/cgi-bin/hgTables}). \item You must know the name of the track and table (or sub-track) that you want. The way to do this is explained in detail below, in section 5.3. \item If the track contains multiple tables (which is the case for many ENCODE tracks, for instance), then you must also specify that table name. \item When the track contains a single table only, you may omit the \Rcode{table} parameter, or reuse the track name (as we did above). \item If you omit the range parameter, the full track table is returned, covering the entire genome. \item The amount of time required to download a track is roughly a function of the number of features in the track, which is in turn a function of the density of those features, and the length of the genomic range you request. To download the entire RepeatMasker track, for all of h19, would take a very long time, and is a task poorly suited to rtracklayer. By contrast, one full-genome DNaseI track takes less than a minute (see below). \end{enumerate} \subsection{Example 2: DNaseI hypersensitivity regions in the K562 Cell Line} The ENCODE project (\url{http://encodeproject.org/ENCODE}) provides many hundreds of annotation tracks to the UCSC table browser. One of these describes DNaseI hypersensitivity for K562 cells (an immortalized erythroleukemia line) measured at the University of Washington using 'Digital Genome Footprinting' (see \url{http://www.ncbi.nlm.nih.gov/pubmed?term=19305407}). Obtain DNaseI hypersensitive regions near the E2F3 TSS, and for all of hg19: <>= track.name <- "wgEncodeUwDgf" table.name <- "wgEncodeUwDgfK562Hotspots" e2f3.grange <- GRanges("chr6", IRanges(20400587, 20403336)) mySession <- browserSession () tbl.k562.dgf.e2f3 <- getTable(ucscTableQuery (mySession, track=track.name, range=e2f3.grange, table=table.name)) tbl.k562.dgf.hg19 <- getTable(ucscTableQuery (mySession, track=track.name, table=table.name)) @ \subsection{Discovering Which Tracks and Tables are Available from UCSC} As the examples above demonstrate, you must know the exact UCSC-style name for the track and table you wish to download. You may browse these interactively at \url{https://genome.ucsc.edu/cgi-bin/hgTables?org=Human&db=hg19} or programmatically, as we demonstrate here. <>= mySession <- browserSession () genome(mySession) <- "hg19" # 177 tracks in October 2012 track.names <- trackNames(ucscTableQuery(mySession)) # chose a few tracks at random from this set, and discover how # many tables they hold tracks <- track.names [c (99, 81, 150, 96, 90)] sapply(tracks, function(track) { length(tableNames(ucscTableQuery(mySession, track=track))) }) @ \section{Conclusion} These case studies have demonstrated a few of the most important features of \textbf{rtracklayer}. Please see the package documentation for more details. The following is the session info that generated this vignette: <>= sessionInfo() @ \end{document}