#!/usr/bin/env python3 # Copyright (C) 2016-2017 Damon Lynch # This file is part of Rapid Photo Downloader. # # Rapid Photo Downloader is free software: you can redistribute it and/or # modify it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Rapid Photo Downloader is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Rapid Photo Downloader. If not, # see . # This script incorporates (at the bottom) a large binary blob that is a # base85 encoding of a zip file. The zip file contains the .mo files needed # to provide the translation into non-English languages for this script. # When a non-English locale is detected, the contents of the zip file are # extracted to a temporary directory, and the GNU utility gettext() uses # the contents of that directory for translating. The contents of the zip # file are generated by the script generate.py, located in the 'tasks' # subfolder, available in the online Rapid Photo Downloader source repository. __author__ = 'Damon Lynch' __copyright__ = "Copyright 2016-2017, Damon Lynch" import sys import os from enum import Enum from distutils.version import StrictVersion import pkg_resources import hashlib import tempfile import argparse import shlex import subprocess import platform import math import threading import time from subprocess import Popen, PIPE import shutil import tarfile import re import random import string import site import stat import locale # Use the default locale as defined by the LANG variable locale.setlocale(locale.LC_ALL, '') from base64 import b85decode from gettext import gettext as _ import gettext __version__ = '0.1.3' __title__ = _('Rapid Photo Downloader installer') __description__ = _("Download and install latest version of Rapid Photo Downloader.") i18n_domain = 'rapid-photo-downloader' locale_tmpdir = None try: import requests have_requests = True except ImportError: have_requests = False try: import apt have_apt = True except ImportError: have_apt = False try: import dnf have_dnf = True except ImportError: have_dnf = False try: import pip have_pip = True pip_version = StrictVersion(pip.__version__) except ImportError: have_pip = False pip_version = None try: import pyprind have_pyprind_progressbar = True except ImportError: have_pyprind_progressbar = False os_release = '/etc/os-release' class bcolors: HEADER = '\033[95m' OKBLUE = '\033[94m' OKGREEN = '\033[92m' WARNING = '\033[93m' FAIL = '\033[91m' ENDC = '\033[0m' BOLD = '\033[1m' UNDERLINE = '\033[4m' class Distro(Enum): debian = 1 ubuntu = 2 fedora = 3 neon = 4 linuxmint = 5 korora = 6 arch = 7 opensuse = 8 manjaro = 9 galliumos = 10 peppermint = 11 antergos = 12 unknown = 20 debian_like = ( Distro.debian, Distro.ubuntu, Distro.neon, Distro.linuxmint, Distro.galliumos, Distro.peppermint ) fedora_like = (Distro.fedora, Distro.korora) arch_like = (Distro.arch, Distro.manjaro, Distro.antergos) installer_cmds = { Distro.fedora: 'dnf', Distro.debian: 'apt-get', Distro.opensuse: 'zypper', } def get_distro() -> Distro: """ Determine the Linux distribution using /etc/os-release """ if os.path.isfile(os_release): with open(os_release, 'r') as f: for line in f: if line.startswith('NAME=') and line.find('Korora') > 0: return Distro.korora if line.startswith('ID='): return get_distro_id(line[3:]) if line.startswith('ID_LIKE='): return get_distro_id(line[8:]) return Distro.unknown def get_distro_id(id_or_id_like: str) -> Distro: """ Determine the Linux distribution using an ID or ID_LIKE line from /etc/os-release :param id_or_id_like: the line from /etc/os-release """ if id_or_id_like[0] in ('"', "'"): id_or_id_like = id_or_id_like[1:-1] try: return Distro[id_or_id_like.strip()] except KeyError: return Distro.unknown def get_distro_version(distro: Distro) -> float: """ Get the numeric version of the Linux distribution, if it exists :param distro: the already determine Linux distribution :return version in floating point format, if found, else 0.0 """ remove_quotemark = False if distro == Distro.fedora: version_string = 'REDHAT_BUGZILLA_PRODUCT_VERSION=' elif distro in debian_like or distro == Distro.opensuse: version_string = 'VERSION_ID="' remove_quotemark = True elif distro == Distro.korora: version_string = 'VERSION_ID=' else: return 0.0 with open(os_release, 'r') as f: for line in f: if line.startswith(version_string): try: if remove_quotemark: v = line[len(version_string):-2] else: v = line[len(version_string):] return float(v) except ValueError: sys.stderr.write("Unexpected format while parsing {} version\n".format( distro.name.capitalize()) ) return 0.0 return 0.0 def is_debian_testing_or_unstable() -> bool: """ :return: True if Debian distribution is testing or unstable, else False. """ with open(os_release, 'r') as f: for line in f: if line.startswith('PRETTY_NAME'): return 'buster' in line or 'sid' in line return False def validate_installer(installer) -> None: """ Ensure the installer (tar.gz) passed on the command line exists and is a tar.gz :param installer: installer including path """ if not os.path.exists(installer): print(_("Installer not found:"), installer) sys.exit(1) elif not installer.endswith('.tar.gz'): # Translators: do not translate the term tar.gz print(_("Installer not in tar.gz format:"), installer) sys.exit(1) def pip_packages_required(): """ Determine which packages are required to ensure all of pip, setuptools and wheel are installed. Determines if pip is installed locally. :return: list of packages and bool local_pip """ packages = [] if have_pip: local_pip = custom_python() or user_pip() else: packages.append('python3-pip') local_pip = False try: import setuptools except ImportError: packages.append(pip_package('setuptools', local_pip)) try: import wheel except: packages.append(pip_package('wheel', local_pip)) return packages, local_pip def extract_mo_files(): """ Extract mo files from zip file encoded in this script and write it to a temp dir. Delete the zip file. :return: the temp dir if successful, else return None """ tmp_dir = None mo_files_zip = 'mo_files.zip' try: tmp_dir = tempfile.mkdtemp() mo_zip = os.path.join(tmp_dir, mo_files_zip) with open(mo_zip, "wb") as mo_files_zip: mo_files_zip.write(b85decode(MO_FILES_ZIP.replace(b"\n", b""))) shutil.unpack_archive(mo_zip, tmp_dir) os.remove(mo_zip) return tmp_dir except Exception: if tmp_dir: shutil.rmtree(tmp_dir, ignore_errors=True) return None def pypi_pyqt5_capable() -> bool: """ :return: True if the platform supports running PyQt5 directly from Python's Pypi, else False. """ return platform.machine() == 'x86_64' and platform.python_version_tuple()[1] in ('5', '6') def make_pip_command(args: str, split: bool=True): """ Construct a call to python's pip :param args: arguments to pass to the command :param split: whether to split the result into a list or not using shlex :return: command line in string or list format """ cmd_line = '{} -m pip {} --disable-pip-version-check'.format(sys.executable, args) if split: return shlex.split(cmd_line) else: return cmd_line def make_distro_packager_commmand(distro_family: Distro, packages: str, interactive: bool, command: str='install', sudo: bool=True) -> str: """ Construct a call to the Linux distribution's packaging command :param distro_family: the Linux distribution :param packages: packages to query / install / remove :param interactive: whether the command should require user intervention :param command: the command the packaging program should run :param sudo: whehter to prefix the call with sudo :return: the command line in string format """ installer = installer_cmds[distro_family] cmd = shutil.which(installer) if interactive: automatic = '' else: automatic = '-y' if sudo: super = 'sudo ' else: super = '' if distro_family != Distro.opensuse: return '{}{} {} {} {}'.format(super, cmd, automatic, command, packages) else: return '{}{} {} {} {}'.format(super, cmd, command, automatic, packages) def custom_python() -> bool: """ :return: True if the python executable is a custom version of python, rather than a standard distro version. """ return not sys.executable.startswith('/usr/bin/python') def valid_system_python(): """ :return: full path of python executable if a python at /usr/bin/python3 or /usr/bin/python is available that is version 3.4 or newer, else None if not found """ cmd = "import platform; v = platform.python_version_tuple(); "\ "print(int(v[0]) >= 3 and int( v[1]) >=4)" for executable in ('/usr/bin/python3', '/usr/bin/python'): try: args = shlex.split('{} -c "{}"'.format(executable, cmd)) output = subprocess.check_output(args, universal_newlines=True) if output.startswith("True"): return executable except subprocess.CalledProcessError: return None return None def user_pip() -> bool: """ :return: True if the version of pip has been installed from Pypi for this user, False if pip has been installed system wide. """ args = make_pip_command('--version') try: v = subprocess.check_output(args, universal_newlines=True) return os.path.expanduser('~/.local/lib/python3') in v except Exception: return False def pip_package(package: str, local_pip: bool) -> str: """ Helper function to construct installing core pythong packages :param package: the python package :param local_pip: if True, install the package using pip and Pypi, else install using the Linux distribution package tools. :return: string of package names """ return package if local_pip else 'python3-{}'.format(package) def get_yes_no(response: str) -> bool: """ :param response: the user's response :return: True if user response is yes or empty, else False """ return response.lower() in ('y', 'yes', '') def local_folder_permissions(interactive) -> None: """ Check and if necessary fix ownership and permissions for key installation folders """ if site.ENABLE_USER_SITE: owner = os.getuid() group = os.getgid() # 0700 u_only = stat.S_IRUSR|stat.S_IWUSR|stat.S_IXUSR # 0775 u_g_o = u_only | stat.S_IRGRP | stat.S_IWGRP | stat.S_IXGRP | stat.S_IROTH | stat.S_IXOTH base = site.getuserbase() lib = os.path.join(base, 'lib') site_packages = site.getusersitepackages() # type: str perms = [ ('bin', u_g_o), ('lib', u_only), ('share', u_only), ('share/applications', u_g_o), ('share/icons', u_g_o), ('share/locale', u_g_o), ] # add python site packages directory, e.g. ~/.local/lib/python3.6/site-packages if site_packages.startswith(lib): path = '' for p in os.path.split(site_packages[len(lib) + 1:]): perms.append((os.path.join(path, p), u_only)) path = os.path.join(path, p) for folder, perm in perms: path = os.path.join(base, folder) if os.path.isdir(path): st = os.stat(path) if st.st_uid != owner or st.st_gid != group: print( _( "Incorrect folder ownership detected. Changing ownership of and " "resetting permissions for" ), path ) # For some bizarre reason, some users report that # root owns key directories like ~/.local/lib , so need sudo # to fix a problem like that, not python's os.chown -- we don't # have permission given we're running as the regular user cmd = shutil.which('chown') cmd = 'sudo {} {}:{} {}'.format(cmd, owner, group, path) run_cmd(cmd, exit_on_failure=True, interactive=interactive) # reset permissions too try: os.chmod(path, perm) except (OSError, PermissionError) as e: sys.stderr.write( "Unexpected error %s setting permission for %s. Exiting\n".format( e, path ) ) def generate_random_file_name(length = 5) -> str: """ Generate a random file name :param length: file name length :return: the file name """ filename_characters = list(string.ascii_letters + string.digits) try: r = random.SystemRandom() return ''.join(r.sample(filename_characters, length)) except NotImplementedError: return ''.join(random.sample(filename_characters, length)) def restart_script(restart_with=None) -> None: """ :param restart_with: if not None, instead of restarting with the Python that was called, using this python executable, which is the full path """ sys.stdout.flush() sys.stderr.flush() # restart the script args = sys.argv if locale_tmpdir: append_locale_cmdline_option(new_args=args) if restart_with is None: executable = sys.executable else: executable = restart_with os.execl(executable, executable, *args) def run_cmd(command_line: str, restart=False, exit_on_failure=True, shell=False, interactive=False) -> None: """ Run command using subprocess.check_call, and then restart if requested. :param command_line: the command to run with args :param restart: if True, restart this script using the same command line arguments as it was called with :param exit_on_failure: if True, exit if the subprocess call fails :param shell: if True, run the subprocess using a shell :param interactive: if True, the user should be prompted to confirm the command """ print(_("The following command will be run:") + "\n") print(command_line) if command_line.startswith('sudo'): print("\n" + _("sudo may prompt you for the sudo password.")) print() if interactive: answer = input(_('Would you like to run the command now?') + ' [Y/n]: ') if not get_yes_no(answer): print(_('Answer is not yes, exiting.')) sys.exit(0) args = shlex.split(command_line) print() try: subprocess.check_call(args, shell=shell) except subprocess.CalledProcessError: sys.stderr.write(_("Command failed") + "\n") if exit_on_failure: sys.stderr.write(_("Exiting") + "\n") clean_locale_tmpdir() sys.exit(1) else: if restart: restart_script() def enable_universe(interactive: bool) -> None: """ Enable the universe repository on Ubuntu :param interactive: if True, the user should be prompted to confirm the command """ try: repos = subprocess.check_output(['apt-cache', 'policy'], universal_newlines=True) version = subprocess.check_output(['lsb_release', '-sc'], universal_newlines=True).strip() if not '{}/universe'.format(version) in repos and version not in ( 'sarah', 'serena', 'sonya'): print(_("The Universe repository must be enabled.") + "\n") run_cmd( command_line='sudo add-apt-repository universe', restart=False, interactive=interactive ) run_cmd(command_line='sudo apt update', restart=True, interactive=interactive) except Exception: pass def query_uninstall(interactive: bool) -> bool: """ Query the user whether to uninstall the previous version of Rapid Photo Downloader that was packaged using a Linux distribution package manager. :param interactive: if False, the user will not be queried :return: """ if not interactive: return True answer = input( '\n' + _( 'Do you want to to uninstall the previous version of Rapid Photo Downloader:' ) + ' [Y/n]' ) return get_yes_no(answer) def opensuse_missing_packages(packages: str): """ Return which of the packages have not already been installed on openSUSE. Does not catch exceptions. :param packages: the packages to to check, in a string separated by white space :return: list of packages """ command_line = make_distro_packager_commmand( distro_family=Distro.opensuse, packages=packages, interactive=True, command='se', sudo=False ) args = shlex.split(command_line) output = subprocess.check_output(args, universal_newlines=True) return [ package for package in packages.split() if re.search(r"^i\+?\s+\|\s*{}".format(re.escape(package)), output, re.MULTILINE) is None ] def opensuse_package_installed(package) -> bool: """ :param package: package to check :return: True if the package is installed in the openSUSE distribution, else False """ return not opensuse_missing_packages(package) def uninstall_pip_package(package: str, no_deps_only: bool) -> None: """ Uninstall a package from the local user using pip. Uninstall all local instances, including those installed multiple times, as can happen with the Debian patch to pip :param package: package to remove :param no_deps_only: if True, remove a package only if no other package depends on it """ l_command_line = 'list --user' if pip_version >= StrictVersion('9.0.0'): # pip 9.0 issues a red warning if format not specified l_command_line = '{} --format=columns'.format(l_command_line) if no_deps_only: l_command_line = '{} --not-required'.format(l_command_line) l_args = make_pip_command(l_command_line) u_command_line = 'uninstall -y {}'.format(package) u_args = make_pip_command(u_command_line) while True: try: output = subprocess.check_output(l_args, universal_newlines=True) if package in output: try: subprocess.check_call(u_args) except subprocess.CalledProcessError: print("Encountered an error uninstalling previous version installed with pip") break else: break except Exception: break def uninstall_with_deps(): uninstall_pip_package('rapid-photo-downloader', no_deps_only=False) packages = 'psutil gphoto2 pyzmq pyxdg arrow python-dateutil rawkit PyPrind colorlog easygui ' \ 'colour pymediainfo sortedcontainers requests' if pypi_pyqt5_capable(): packages = '{} PyQt5 sip'.format(packages) for package in packages.split(): uninstall_pip_package(package, no_deps_only=True) def uninstall_old_version(distro_family: Distro, distro: Distro, interactive: bool) -> None: """ Uninstall old version of Rapid Photo Downloader that was installed using the distribution package manager and also with pip :param distro_family: the Linux distro family that this distro is in :param interactive: if True, the user should be prompted to confirm the commands """ pkg_name = 'rapid-photo-downloader' if distro_family == Distro.debian: try: cache = apt.Cache() pkg = cache[pkg_name] if pkg.is_installed and query_uninstall(interactive): run_cmd(make_distro_packager_commmand(distro, pkg_name, interactive, 'remove')) except Exception: pass elif distro_family == Distro.fedora: print( _("Querying package system to see if an older version of Rapid Photo Downloader is " "installed (this may take a while)..." ) ) with dnf.Base() as base: base.read_all_repos() try: base.fill_sack() except dnf.exceptions.RepoError as e: print( _( "Unable to query package system. Please check your Internet connection and " "try again" ) ) sys.exit(1) q = base.sack.query() q_inst = q.installed() i = q_inst.filter(name=pkg_name) if len(list(i)) and query_uninstall(interactive): run_cmd(make_distro_packager_commmand(distro, pkg_name, interactive, 'remove')) elif distro_family == Distro.opensuse: print( _("Querying package system to see if an older version of Rapid Photo Downloader is " "installed (this may take a while)..." ) ) try: if opensuse_package_installed('rapid-photo-downloader') \ and query_uninstall(interactive): run_cmd(make_distro_packager_commmand(distro, pkg_name, interactive, 'rm')) except subprocess.CalledProcessError as e: if e.returncode != 104: sys.stderr.write(_("Command failed") + "\n") sys.stderr.write(_("Exiting") + "\n") clean_locale_tmpdir() sys.exit(1) print(_("Checking if previous version installed with pip...")) uninstall_pip_package('rapid-photo-downloader', no_deps_only=False) def check_packages_on_other_systems() -> None: """ Check to see if some (but not all) application dependencies are installed on systems that we are not explicitly analyzing. """ import_msgs = [] if not pypi_pyqt5_capable(): try: import PyQt5 except ImportError: import_msgs.append('python3 variant of PyQt5') try: import gi have_gi = True except ImportError: import_msgs.append('python3 variant of gobject introspection') have_gi = False if have_gi: try: gi.require_version('GUdev', '1.0') except ValueError: import_msgs.append('GUdev 1.0 from gi.repository') try: gi.require_version('UDisks', '2.0') except ValueError: import_msgs.append('UDisks 2.0 from gi.repository') try: gi.require_version('GLib', '2.0') except ValueError: import_msgs.append('GLib 2.0 from gi.repository') try: gi.require_version('GExiv2', '0.10') except ValueError: import_msgs.append('GExiv2 0.10 from gi.repository') try: gi.require_version('Gst', '1.0') except ValueError: import_msgs.append('Gst 1.0 from gi.repository') try: gi.require_version('Notify', '0.7') except ValueError: import_msgs.append('Notify 0.7 from gi.repository') if shutil.which('exiftool') is None: import_msgs.append('ExifTool') if len(import_msgs): install_error_message = "This program requires:\n{}\nPlease install them " \ "using your distribution's standard installation tools.\n" sys.stderr.write(install_error_message.format('\n'.join(s for s in import_msgs))) sys.exit(1) def install_required_distro_packages(distro: Distro, distro_family: Distro, version: float, interactive: bool) -> None: """ Install packages supplied by the Linux distribution :param distro: the specific Linux distribution :param distro_family: the family of distros the Linux distribution belongs too :param version: the Linux distribution's version :param interactive: if True, the user should be prompted to confirm the commands """ if distro_family == Distro.debian: cache = apt.Cache() missing_packages = [] packages = 'gstreamer1.0-libav gstreamer1.0-plugins-good ' \ 'libimage-exiftool-perl python3-dev ' \ 'intltool gir1.2-gexiv2-0.10 python3-gi gir1.2-gudev-1.0 ' \ 'gir1.2-udisks-2.0 gir1.2-notify-0.7 gir1.2-glib-2.0 gir1.2-gstreamer-1.0 '\ 'libgphoto2-dev python3-arrow python3-psutil g++ libmediainfo0v5 '\ 'python3-zmq exiv2 python3-colorlog libraw-bin ' \ 'python3-easygui python3-sortedcontainers' if not pypi_pyqt5_capable(): packages = 'qt5-image-formats-plugins python3-pyqt5 {}'.format(packages) if not have_requests: packages = 'python3-requests {}'.format(packages) for package in packages.split(): try: if not cache[package].is_installed: missing_packages.append(package) except KeyError: print( _('The following package is unknown on your system: {}\n').format(package) ) sys.exit(1) if missing_packages: print( _( "To continue, some packages required to run the application will be installed." ) + "\n" ) run_cmd( make_distro_packager_commmand( distro_family, ' '.join(missing_packages), interactive ), interactive=interactive ) elif distro_family == Distro.fedora: missing_packages = [] packages = 'gstreamer1-libav gstreamer1-plugins-good ' \ 'gobject-introspection python3-gobject ' \ 'libgphoto2-devel zeromq-devel exiv2 perl-Image-ExifTool LibRaw-devel gcc-c++ ' \ 'rpm-build python3-devel intltool ' \ 'python3-easygui python3-psutil libmediainfo ' if not pypi_pyqt5_capable(): packages = 'qt5-qtimageformats python3-qt5 {}'.format(packages) if not have_requests: packages = 'python3-requests {}'.format(packages) if distro == Distro.fedora and 0.0 < version <= 24.0: packages = 'libgexiv2-python3 {}'.format(packages) else: packages = 'python3-gexiv2 {}'.format(packages) print(_("Querying installed and available packages (this may take a while)")) with dnf.Base() as base: # Code from http://dnf.readthedocs.org/en/latest/use_cases.html # Repositories serve as sources of information about packages. base.read_all_repos() # A sack is needed for querying. base.fill_sack() # A query matches all packages in sack q = base.sack.query() # Derived query matches only available packages q_avail = q.available() # Derived query matches only installed packages q_inst = q.installed() installed = [pkg.name for pkg in q_inst.run()] available = [pkg.name for pkg in q_avail.run()] for package in packages.split(): if package not in installed: if package in available: missing_packages.append(package) elif package == 'gstreamer1-libav': print( bcolors.BOLD + "\nTo be able to generate thumbnails for a wider range " "of video formats, install gstreamer1-libav after having first added " "an appropriate software repository such as rpmfusion.org." + bcolors.ENDC ) else: sys.stderr.write( 'The following package is unavailable on your system: {}\n'.format( package ) ) sys.exit(1) if missing_packages: print( _( "To continue, some packages required to run the application will be " "installed." ) + "\n" ) run_cmd( make_distro_packager_commmand( distro_family, ' '.join(missing_packages), interactive ), interactive=interactive ) elif distro_family == Distro.opensuse: packages = 'girepository-1_0 python3-gobject ' \ 'zeromq-devel exiv2 exiftool python3-devel ' \ 'libgphoto2-devel libraw-devel gcc-c++ rpm-build intltool ' \ 'python3-psutil ' \ 'typelib-1_0-GExiv2-0_10 typelib-1_0-UDisks-2_0 typelib-1_0-Notify-0_7 ' \ 'typelib-1_0-Gst-1_0 typelib-1_0-GUdev-1_0' #TODO libmediainfo - not a default openSUSE package, sadly if not pypi_pyqt5_capable(): packages = 'python3-qt5 libqt5-qtimageformats {}'.format(packages) if not have_requests: packages = 'python3-requests {}'.format(packages) print( _( "Querying zypper to see if any required packages are already installed (this may " "take a while)... " ) ) try: missing_packages = opensuse_missing_packages(packages) except subprocess.CalledProcessError as e: if e.returncode != 104: sys.stderr.write(_("Command failed") + "\n") sys.stderr.write(_("Exiting") + "\n") clean_locale_tmpdir() sys.exit(1) else: if missing_packages: print( _( "To continue, some packages required to run the application will be " "installed." ) + "\n" ) run_cmd( make_distro_packager_commmand( distro_family, ' '.join(missing_packages), interactive ), interactive=interactive ) else: check_packages_on_other_systems() def parser_options(formatter_class=argparse.HelpFormatter) -> argparse.ArgumentParser: """ Construct the command line arguments for the script :return: the parser """ parser = argparse.ArgumentParser( prog=__title__, formatter_class=formatter_class, description=__description__ ) parser.add_argument( '--version', action='version', version='%(prog)s {}'.format(__version__), help="Show program's version number and exit." ) parser.add_argument( "-i", "--interactive", action="store_true", dest="interactive", default=False, help=_("Query to confirm action at each step.") ) group = parser.add_mutually_exclusive_group() group.add_argument( '--devel', action="store_true", dest="devel", default=False, help=_( "When downloading the latest version, install the development version if it is " "newer than the stable version." ) ) group.add_argument( 'tarfile', action='store', nargs='?', # Translators: please don't translate the term tar.gz help=_( "Optional tar.gz Rapid Photo Downloader installer archive. If not specified, " "the latest version is downloaded from the Internet." ) ) parser.add_argument( '--delete-install-script-and-containing-dir', action='store_true', dest='delete_install_script', help=argparse.SUPPRESS ) parser.add_argument( '--delete-tar-and-containing-dir', action='store_true', dest='delete_tar_and_dir', help=argparse.SUPPRESS ) parser.add_argument( '--locale-tmpdir', action='store', dest='locale_tmpdir', help=argparse.SUPPRESS ) parser.add_argument( '--force-this-installer-version', action='store_true', dest='force_this_version', # Translators: please don't translate the term tar.gz help= _( "Do not run the installer in the tar.gz Rapid Photo Downloader installer archive if " "it is newer than this version ({}). The default is to run whichever installer is " "newer." ).format(__version__) ) msg = _( "Uninstall Rapid Photo Downloader that was installed with pip, keeping its dependencies." ) msg2 = _( "Uninstall the dependencies installed by pip during Rapid Photo Downloader's " "installation, and Rapid Photo Downloader itself, then exit." ) pip_only = _( "Note: this will not uninstall any version of Rapid Photo Downloader installed " "by your Linux distribution's package manager." ) msg = "{} {}".format(msg, pip_only) if have_pip and pip_version >= StrictVersion('9.0.0'): note = _("Dependencies will only be removed if they are not required by other programs.") note = "{} {}".format(note, pip_only) else: # Translators: please don't translate the terms pip 9.0 or the command starting with Python note = _( "Note: this option will remove the dependencies regardless of whether they are " "required by another program pip has installed. Upgrade to pip 9.0 or " "above if you want to avoid this behavior. You can do so using the command " "'python3 -m pip install pip -U --user'. " "Also note that any version of Rapid Photo Downloader installed " "by your Linux distribution's package manager will not be uninstalled." ) msg2 = "{} {}".format(msg2, note) parser.add_argument( '--uninstall', action='store_true', help=msg) parser.add_argument( '--uninstall-including-pip-dependencies', action='store_true', dest='uninstall_with_deps', help=msg2 ) return parser def verify_download(downloaded_tar: str, md5_url: str) -> bool: """ Verifies downloaded tarball against the launchpad generated md5sum file. Exceptions not caught. :param downloaded_tar: local file :param md5_url: remote md5sum file for the download :return: True if md5sum matches, False otherwise, """ if not md5_url: return True r = requests.get(md5_url) assert r.status_code == 200 remote_md5 = r.text.split()[0] with open(downloaded_tar, 'rb') as tar: m = hashlib.md5() m.update(tar.read()) return m.hexdigest() == remote_md5 def get_installer_url_md5(devel: bool): remote_versions_file = 'https://www.damonlynch.net/rapid/version.json' try: r = requests.get(remote_versions_file) except: print(_("Failed to download versions file"), remote_versions_file) else: status_code = r.status_code if status_code != 200: print(_("Got error code {} while accessing versions file").format(status_code)) else: try: version = r.json() except: print("Error %d accessing versions JSON file") else: stable = version['stable'] dev = version['dev'] if devel and pkg_resources.parse_version(dev['version']) > \ pkg_resources.parse_version(stable['version']): tarball_url = dev['url'] md5 = dev['md5'] else: tarball_url = stable['url'] md5 = stable['md5'] return tarball_url, md5 return '', '' def format_size_for_user(size_in_bytes: int, zero_string: str='', no_decimals: int=2) -> str: r""" Humanize display of bytes. Uses Microsoft style i.e. 1000 Bytes = 1 KB :param size: size in bytes :param zero_string: string to use if size == 0 >>> format_size_for_user(0) '' >>> format_size_for_user(1) '1 B' >>> format_size_for_user(123) '123 B' >>> format_size_for_user(1000) '1 KB' >>> format_size_for_user(1024) '1.02 KB' >>> format_size_for_user(1024, no_decimals=0) '1 KB' >>> format_size_for_user(1100, no_decimals=2) '1.1 KB' >>> format_size_for_user(1000000, no_decimals=2) '1 MB' >>> format_size_for_user(1000001, no_decimals=2) '1 MB' >>> format_size_for_user(1020001, no_decimals=2) '1.02 MB' """ suffixes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'] if size_in_bytes == 0: return zero_string i = 0 while size_in_bytes >= 1000 and i < len(suffixes)-1: size_in_bytes /= 1000 i += 1 if no_decimals: s = '{:.{prec}f}'.format(size_in_bytes, prec=no_decimals).rstrip('0').rstrip('.') else: s = '{:.0f}'.format(size_in_bytes) return s + ' ' + suffixes[i] def delete_installer_and_its_temp_dir(full_file_name) -> None: temp_dir = os.path.dirname(full_file_name) if temp_dir: # print("Removing directory {}".format(temp_dir)) shutil.rmtree(temp_dir, ignore_errors=True) class progress_bar_scanning(threading.Thread): # Adapted from http://thelivingpearl.com/2012/12/31/ # creating-progress-bars-with-python/ def run(self): print('Downloading.... ', end='', flush=True) i = 0 while stop_pbs != True: if (i%4) == 0: sys.stdout.write('\b/') elif (i%4) == 1: sys.stdout.write('\b-') elif (i%4) == 2: sys.stdout.write('\b\\') elif (i%4) == 3: sys.stdout.write('\b|') sys.stdout.flush() time.sleep(0.2) i+=1 if kill_pbs == True: print('\b\b\b\b ABORT!', flush=True) else: print('\b\b done!', flush=True) def download_installer(devel): tarball_url, md5_url = get_installer_url_md5(devel) if not tarball_url: sys.stderr.write( "\n" + _( "Sorry, could not locate installer. Please check your Internet " "connection and verify if you can reach " "https://www.damonlynch.net\n\nExiting.\n" ) ) sys.exit(1) temp_dir = tempfile.mkdtemp() try: r = requests.get(tarball_url, stream=True) local_file = os.path.join(temp_dir, tarball_url.split('/')[-1]) chunk_size = 1024 total_size = int(r.headers['content-length']) size_human = format_size_for_user(total_size) no_iterations = int(math.ceil(total_size / chunk_size)) pbar_title = "Downloading {} ({})".format(tarball_url, size_human) global stop_pbs global kill_pbs stop_pbs = kill_pbs = False if have_pyprind_progressbar: bar = pyprind.ProgBar( iterations=no_iterations, track_time=True, title=pbar_title ) else: print(pbar_title) pbs = progress_bar_scanning() pbs.start() with open(local_file, 'wb') as f: for chunk in r.iter_content(chunk_size=chunk_size): if chunk: # filter out keep-alive new chunks f.write(chunk) if have_pyprind_progressbar: bar.update() if not have_pyprind_progressbar: stop_pbs = True pbs.join() except Exception: sys.stderr.write("Failed to download {}\n".format(tarball_url)) sys.exit(1) try: if verify_download(local_file, md5_url): return local_file else: sys.stderr.write("Tar file MD5 mismatch\n") delete_installer_and_its_temp_dir(local_file) sys.exit(1) except Exception: sys.stderr.write("There was a problem verifying the download. Exiting\n") delete_installer_and_its_temp_dir(local_file) sys.exit(1) def tarfile_content_name(installer: str, file_name: str) -> str: """ Construct a path into a tar file to be able to extract a single file :param installer: the tar file :param file_name: the file wanted :return: the path including file name """ name = os.path.basename(installer) name = name[:len('.tar.gz') * -1] return os.path.join(name, file_name) def append_locale_cmdline_option(new_args): """ Append the location of the locale to the command line options :param new_args: :return: """ assert locale_tmpdir new_args.append('--locale-tmpdir={}'.format(locale_tmpdir)) def run_latest_install(installer: str, delete_installer: bool) -> None: """ If the install script is newer than this script (as determined by the version number at the head of this script), run that newer script instead. :param installer: the tar.gz installer :param delete_installer: whether to delete the tar.gz archive """ install_script = '' v = '' with tarfile.open(installer) as tar: with tar.extractfile(tarfile_content_name(installer, 'install.py')) as install_py: raw_lines = install_py.read() lines = raw_lines.decode() r = re.search(r"""^__version__\s*=\s*[\'\"](.+)[\'\"]""", lines, re.MULTILINE) if r: v = r.group(1) if pkg_resources.parse_version(__version__) < \ pkg_resources.parse_version(v): temp_dir = tempfile.mkdtemp() install_script = os.path.join(temp_dir, generate_random_file_name(10)) with open(install_script, 'w') as new_install_py: new_install_py.write(lines) if install_script: print("Loading new installer script version {}".format(v)) sys.stdout.flush() sys.stderr.flush() clean_locale_tmpdir() new_args = [install_script, '--delete-install-script-and-containing-dir'] if delete_installer: new_args.append('--delete-tar-and-containing-dir') new_args = new_args + sys.argv[1:] # restart the script os.execl(sys.executable, sys.executable, *new_args) def do_install(installer: str, distro: Distro, distro_family: Distro, distro_version: float, interactive: bool, devel: bool, delete_install_script: bool, delete_tar_and_dir: bool, force_this_version: bool) -> None: """ :param installer: the tar.gz installer archive (optional) :param distro: specific Linux distribution :param distro_family: the family of distros the specific distro is part of :param distro_version: the distributions version, if it exists :param interactive: whether to prompt to confirm commands :param devel: download and install latest development version :param delete_install_script: hidden command line option to delete the install.py script and its containing directory, which is assumed to be a temporary directory :param delete_tar_and_dir: hidden command line option to delete the tar.gz installer archive and its containing directory, which is assumed to be a temporary directory :param force_this_version: do not attempt to run a newer version of this script """ if installer is None: delete_installer = True installer = download_installer(devel) elif delete_tar_and_dir: delete_installer = True else: delete_installer = False if not force_this_version: run_latest_install(installer, delete_installer) uninstall_old_version(distro_family=distro_family, distro=distro, interactive=interactive) install_required_distro_packages(distro, distro_family, distro_version, interactive) with tarfile.open(installer) as tar: with tar.extractfile(tarfile_content_name(installer, 'requirements.txt')) as requirements: reqbytes = requirements.read() if pypi_pyqt5_capable(): reqbytes = reqbytes.rstrip() + b'\nPyQt5' with tempfile.NamedTemporaryFile(delete=False) as temp_requirements: temp_requirements.write(reqbytes) temp_requirements_name = temp_requirements.name print("\n" + _("Installing application requirements...") + "\n") # Don't call pip directly - there is no API, and its developers say not to cmd = make_pip_command( 'install --user --disable-pip-version-check -r {}'.format(temp_requirements.name) ) with Popen(cmd, stdout=PIPE, stderr=PIPE, bufsize=1, universal_newlines=True) as p: for line in p.stdout: print(line, end='') p.wait() i = p.returncode os.remove(temp_requirements_name) if i != 0: if delete_installer: delete_installer_and_its_temp_dir(installer) clean_locale_tmpdir() sys.stderr.write(_("Received error code") + " " + str(i) + "\n") sys.stderr.write(_("Failed to install application requirements: exiting") + "\n") sys.exit(1) print("\n" +_("Installing application...") +"\n") cmd = make_pip_command( 'install --user --disable-pip-version-check --no-deps {}'.format(installer) ) with Popen(cmd, stdout=PIPE, stderr=PIPE, bufsize=1, universal_newlines=True) as p: for line in p.stdout: print(line, end='') p.wait() i = p.returncode if i != 0: if delete_installer: delete_installer_and_its_temp_dir(installer) clean_locale_tmpdir() sys.stderr.write(_("Failed to install application: exiting...") + "\n") sys.exit(1) path = os.getenv('PATH') install_path = os.path.join(os.path.expanduser('~'), site.getuserbase(), 'bin') if install_path not in path.split(':'): if distro in debian_like or distro == Distro.opensuse: bin_dir = os.path.join(os.path.expanduser('~'), 'bin') if not os.path.isdir(bin_dir): created_bin_dir = True os.mkdir(bin_dir) else: created_bin_dir = False for executable in ('rapid-photo-downloader', 'analyze-pv-structure'): symlink = os.path.join(bin_dir, executable) if not os.path.exists(symlink): print('Creating symlink', symlink) print("If you uninstall the application, remove this symlink yourself.") os.symlink(os.path.join(install_path, executable), symlink) if created_bin_dir: print( bcolors.BOLD + "\n" + _( "You may have to restart the computer to be able to run the " "program from the commmand line or application launcher." ) + bcolors.ENDC ) else: sys.stderr.write("\nThe application was installed in {}\n".format(install_path)) sys.stderr.write("Add {} to your PATH to be able to launch it.\n".format(install_path)) man_dir = '/usr/local/share/man/man1' if interactive: print("\n" + _("Do you want to install the application's man pages?")) print(_("They will be installed into {}").format(man_dir)) print(_("If you uninstall the application, remove these manpages yourself.")) print(_("sudo may prompt you for the sudo password.")) answer = input(_('Do want to install the man pages?') + ' [Y/n] ') else: print("\n" + _("Installing man pages into {}").format(man_dir)) print(_("If you uninstall the application, remove these manpages yourself.")) print(_("sudo may prompt you for the sudo password.") + "\n") answer = 'y' if get_yes_no(answer): if not os.path.isdir(man_dir): cmd = shutil.which('mkdir') command_line = 'sudo {} -p {}'.format(cmd, man_dir) print(command_line) args = shlex.split(command_line) try: subprocess.check_call(args) except subprocess.CalledProcessError: if delete_installer: delete_installer_and_its_temp_dir(installer) clean_locale_tmpdir() sys.stderr.write(_("Failed to create man page directory: exiting") + "\n") sys.exit(1) cmd = shutil.which('cp') for manpage in ('rapid-photo-downloader.1', 'analyze-pv-structure.1'): source = os.path.join(os.path.expanduser('~'), '.local/share/man/man1', manpage) dest = os.path.join(man_dir, manpage) command_line = 'sudo {} {} {}'.format(cmd, source, dest) print(command_line) args = shlex.split(command_line) try: subprocess.check_call(args) except subprocess.CalledProcessError: sys.stderr.write(_("Failed to copy man page.")) if delete_installer: delete_installer_and_its_temp_dir(installer) if delete_install_script: delete_installer_and_its_temp_dir(sys.argv[0]) clean_locale_tmpdir() print("\n" + _("(If a segmentation fault occurs at exit, you can ignore it...)")) def clean_locale_tmpdir(): global locale_tmpdir if locale_tmpdir is not None and os.path.isdir(locale_tmpdir): shutil.rmtree(locale_tmpdir, ignore_errors=True) locale_tmpdir = None def pip_needed_to_uninstall(): sys.stderr.write( _( "The python3 tool pip is required to uninstall a version of Rapid Photo " "Downloader that was installed with pip.\nCannot continue. Exiting." ) + "\n" ) sys.exit(1) def main(): """ Setup localization, if needed. Setup core Python modules if needed: pip, setuptools, wheel, and requests Setup repositories if needed. Then call main install logic. """ parser = parser_options() args = parser.parse_args() global locale_tmpdir locale_tmpdir = args.locale_tmpdir if locale_tmpdir is None: # if user's locale is other than English, extract mo files to temp dir # and localize this script try: lang = locale.getdefaultlocale()[0] except Exception: sys.stderr.write("Warning: could not determine locale\n") else: if not lang.startswith('en'): locale_tmpdir = extract_mo_files() if locale_tmpdir: locale_dir = os.path.join(locale_tmpdir, 'locale') gettext.bindtextdomain(i18n_domain, localedir=locale_dir) gettext.textdomain(i18n_domain) if os.getuid() == 0: sys.stderr.write( _( "Do not run this installer script as sudo / root user.\nRun it using the " "user who will run the program.\n" ) ) clean_locale_tmpdir() sys.exit(1) if args.uninstall_with_deps: if len(sys.argv) > 2: sys.stderr.write( _("Do not include any other command line arguments when specifying") + " --uninstall-with-pip-dependencies\n" ) clean_locale_tmpdir() sys.exit(1) if not have_pip: pip_needed_to_uninstall() uninstall_with_deps() clean_locale_tmpdir() sys.exit(0) if args.uninstall: if len(sys.argv) > 2: sys.stderr.write( _("Do not include any other command line arguments when specifying") + " --uninstall\n" ) sys.exit(1) if not have_pip: pip_needed_to_uninstall() uninstall_pip_package('rapid-photo-downloader', no_deps_only=False) clean_locale_tmpdir() sys.exit(0) if custom_python(): excecutable = valid_system_python() if excecutable is None: sys.stderr.write( _( "Sorry, this installer does not support a custom python installation.\n" "Exiting..." ) + "\n" ) sys.exit(1) else: print(_("Restarting script using system python...") + "\n") restart_script(restart_with=excecutable) local_folder_permissions(interactive=args.interactive) distro = get_distro() if distro != Distro.unknown: distro_version = get_distro_version(distro) else: distro_version = 0.0 if distro == Distro.debian: if distro_version == 0.0: if not is_debian_testing_or_unstable(): print('Warning: this version of Debian may not work with Rapid Photo Downloader.') elif distro_version <= 8.0: sys.stderr.write( "Sorry, Debian Jessie is too old to be able to run this version of " "Rapid Photo Downloader.\n" ) clean_locale_tmpdir() sys.exit(1) elif distro in fedora_like and 0.0 > distro_version <= 23.0: sys.stderr.write("Sorry, Fedora 23 is no longer supported by Rapid Photo Downloader.\n") sys.exit(1) elif distro in arch_like: print( 'Users of Arch Linux or its derivatives should try the AUR package: ' 'https://aur.archlinux.org/packages/rapid-photo-downloader-bzr/' ) print(_("Exiting...")) clean_locale_tmpdir() sys.exit(0) elif distro == Distro.peppermint and 0.0 > distro_version < 7.0: sys.stderr.write( "Sorry, this version of Peppermint is to old to run this version of " "Rapid Photo Downloader.\n" ) clean_locale_tmpdir() sys.exit(1) if distro in (Distro.ubuntu, Distro.peppermint): enable_universe(args.interactive) if distro in debian_like: distro_family = Distro.debian if not have_apt: if not custom_python(): # Translators: do not translate the term python3-apt print(_('To continue, the package python3-apt must be installed.') + '\n') command_line = make_distro_packager_commmand( distro_family, 'python3-apt', args.interactive ) run_cmd(command_line, restart=True, interactive=args.interactive) elif distro in fedora_like: distro_family = Distro.fedora else: distro_family = distro packages, local_pip = pip_packages_required() if packages: packages = ' '.join(packages) if distro_family not in (Distro.fedora, Distro.debian, Distro.opensuse): sys.stderr.write( _( "Install the following packages using your Linux distribution's standard " "package manager, and then rerun this installer" ) + "\n" ) sys.stderr.write(packages + '\n') sys.exit(1) print( _( "To run this program, programs to assist Python 3 and its package management must " "be installed." ) + '\n' ) if not local_pip: command_line = make_distro_packager_commmand(distro_family, packages, args.interactive) else: command_line = make_pip_command('install --user ' + packages, split=False) run_cmd(command_line, restart=True, interactive=args.interactive) # Can now assume that both pip, setuptools and wheel have been installed if pip_version < StrictVersion('8.1'): # Translators: do not translate the terms Python 3, pip and setuptools print("\n" + _("Python 3's pip and setuptools must be upgraded for your user.") + "\n") command_line = make_pip_command( 'install --user --upgrade pip setuptools wheel', split=False ) run_cmd(command_line, restart=True, interactive=args.interactive) installer = args.tarfile if installer is None: if have_requests is False: # Translators: do not translate the term python or requests print(_("Installing python requests")) command_line = make_pip_command( 'install --user requests', split=False ) run_cmd(command_line, restart=True, interactive=args.interactive) elif not os.path.exists(installer): print(_("Installer not found:"), installer) sys.exit(1) elif not installer.endswith('.tar.gz'): # Translators: do not translate the term tar.gz print(_("Installer not in tar.gz format:"), installer) sys.exit(1) do_install( installer=installer, distro=distro, distro_family=distro_family, distro_version=distro_version, interactive=args.interactive, devel=args.devel, delete_install_script=args.delete_install_script, delete_tar_and_dir=args.delete_tar_and_dir, force_this_version=args.force_this_version ) # Base 85 encoded zip of locale data, to be extracted to a temporary directory and used for # translation of this script's output if user's locale is not English (see the comment at the # top of this script): MO_FILES_ZIP=b""" P)h>@6aWAK007yTI!gcm0000000000000L7003-nV_|G%FHlPZ1QY-O0002lm^w=U00000000000000A0001NZ)0I>WiMfJFHlPZ 1QY-O0002lm^w=U00000000000000A0001NZ)0I>WiMi7FHlPZ1QY-O0002lm^w=U00000000000000A0001NZ)0I>WiMi9FHlPZ 1QY-O0002lm^w=U00000000000000A0001NZ)0I>WiMl4FHlPZ1QY-O0002lm^w=U00000000000000A0001NZ)0I>WiMlMFHlPZ 1QY-O0002lm^w=U00000000000000A0001NZ)0I>WiMo5FHlPZ1QY-O0002lm^w=U00000000000000A0001NZ)0I>WiMo9FHlPZ 1QY-O0002lm^w=U00000000000000A0001NZ)0I>WiMrHFHlPZ1QY-O0002lm^w=U00000000000000A0001NZ)0I>WiMrOFHlPZ 1QY-O0002lm^w=U00000000000000A0001NZ)0I>WiMrPFHlPZ1QY-O0002lm^w=U00000000000000A0001NZ)0I>WiMu7FHlPZ 1QY-O0002lm^w=U00000000000000A0001NZ)0I>WiMuFFHlPZ1QY-O0002lm^w=U00000000000000A0001NZ)0I>WiMuOFHlPZ 1QY-O0002lm^w=U00000000000000A0001NZ)0I>WiM!QFHlPZ1QY-O0002lm^w=U00000000000000A0001NZ)0I>WiM!TFHlPZ 1QY-O0002lm^w=U00000000000000A0001NZ)0I>WiM%DFHlPZ1QY-O0002lm^w=U00000000000000A0001NZ)0I>WiM%TFHlPZ 1QY-O0002lm^w=U00000000000000A0001NZ)0I>WiM)BFHlPZ1QY-O0002lm^w=U00000000000000B0001NZ)0I>WiM-CVlPlj 0|XQR00000*_b*@0000000000000003IG5AY;R*>Y-KNQVlPlj0|XQR00000*_b*@0000000000000003IG5AY;R*>Y-KNQY%fqt 0|XQR00000*_b*@0000000000000003IG5AY;R*>Y-KNQZZA+v0|XQR00000*_b*@0000000000000003IG5AY;R*>Y-KNRV=quk 0|XQR00000*_b*@0000000000000003IG5AY;R*>Y-KNSY%fqt0|XQR00000*_b*@0000000000000003IG5AY;R*>Y-KNSbT3d# 0|XQR00000*_b*@0000000000000004FCWDY;R*>Y-KNSbYDVJFHlPZ1QY-O0002lm^w=U00000000000000A0001NZ)0I>WiN7X FHlPZ1QY-O0002lm^w=U00000000000000A0001NZ)0I>WiN7dFHlPZ1QY-O0002lm^w=U00000000000000A0001NZ)0I>WiNAU FHlPZ1QY-O0002lm^w=U00000000000000A0001NZ)0I>WiNAbFHlPZ1QY-O0002lm^w=U00000000000000A0001NZ)0I>WiNAf FHlPZ1QY-O0002lm^w=U00000000000000A0001NZ)0I>WiNDcFHlPZ1QY-O0002lm^w=U00000000000000A0001NZ)0I>WiNGW FHlPZ1QY-O0002lm^w=U00000000000000D0001NZ)0I>WiNVYUqenWP)h>@6aWAK007yTI!gcm0000000000000&M003-nV_|G% FJ@^kOhaEyMN?BjM@3UFP)h>@6aWAK2mslbI!gk1zTip>000ge001ul003-nV_|G%FJ@^kOhaEyMN?BjM@3UFa$#_3WG!%LZ**@h WN&wFY;R#?WpXZUZ;e+AY-Cj#K8rl0blO6vvn{9`kk!Ry%D#YQfOX4mmv-B3%XTPRQSh{L+PR%O_s-sXZo89!1ee4hMx#a&L@*>( BS8~M1YZ!f7=tm!5Q!uhgeVFozCrO7{Qmp@Go5aCl}XS2&f`D-`QPXC`EySFjKVKLdmGx5Z&B)gpnrx+e=nS=)JEWo!1ICs0A2*_ Yg6hH;BH_qumbD>-U-B?`Yb*<;1_^z1%3zkPT&t@{S|!P1AG;D7Vvz0+JReurvY~XPa*!m(}4qLF`pqIL{QhC#e8m(^*JDkTm@!G A7Cf&7_bZYXRd{1lVb2{5uuHJT*>mnI%1D*}Mrk&**Z)bTA$-cwDQ-P*k)`mh2>5Q`u*@InV1BoEupK|%!G3)hxEJ_%2m5scgxLz*+R6M)C-e6^S&k!}tjC9B {mxF7`x7#Mugrg5=pT~#$2wWx$2-}6-|b|(J|+BrD*K+1^%sQiE5JqIUuAxwi|6Am=6hQg^EuYVarMzI*6VXZ_mwWT_hUl;6QTcE 7xQ}#c>4yWe%;0KU4oG>0M-TX171vWpTl|jTi`n=vAfxx=L7qI{oTxe2$%;Rl=WM?dH>xq{(3k2G5|LJbF%X8f<*Yh&}Qa8*0 2ifzORuE0;}0Q5R%c{>!qg?}04W2a{#Hd@RfP_du58?V&9D=UZ8p=ZCWXOqS1kQO1ADvV8x}^7(Jb`KR@;-#U6&?(QD0 ALsUPd|lYXbbETZt_}C_dAIaPUi3&_$oP&Pw(s47%ROw@$9veHKbLb}?qPZUDEJqV<270Tr<}VX$9&szyq?XmKl^g5*Ht;r+v{XJ lViODp}#H1cKvXU&$%bZ^4}};Ule>K$M$<7$NBl=9NYVsGXH16H*##h%tq$Zy^;N+1xGgW{>6=a?p;6)yniF}djdE}c>>%*e(zy_H+AP{;v>RpaDz*A6pk0PG jy8t2pKLE{2JH}95$$T3yIk;~k~~4XRIzO+Kgfop=M{?I1ye##zNUDXP#h2Rb~qqwH=un$`g_pI(x-Y)xqp-59PE<$KyfX4uZ$0) MQGQcU5B56Ld#V{hL($ehJY^ietzVx_xNdq(6r?B>ndtcg}(!)yH=!em~JKM%%79t~Q}r#j$cTnp0dC =tpruIZ#2nP;tEEWNio9NXuEHE&cNp$9Pq74Y&pE{fhIh@uOU$dZ9LLp7VU`>NR_DtV`ii;D@GUOKa!n4EiPQ!X^dQgK$4)V=S-I #>X=`8PSP3Ce;}m9Z#zUN+q2H-jT#=uVe$~&3QIb1HP|I-n{2x?h2b&&xX|+Hd{4Nvyn?8bP^XS?n1*l`3)y}J0^y)fxCUOO}FBL){R{P`x p=)a9!jh>UKQ5@jz}ZL}9oQv(Ae_;3_6a91(P5-x>y!FM*CHGjCb13!kVg^LhM=oYdJP_}g)vOW5)2-7Hi*eINVIIb}H$(97ayhwpw<0a$F5p%{-0=iF7$~R8#v#Cr*2_ G&O2sr?)pmOGi7_jCQUWrF}KZN{guJ4aJ8j?s%euolxy+L%1JI$WesW`!r$TY0ja5IdMI37nerjy7p4UM>BsChjB!acf#= ;}BipJlxL_p43i2l++*&8%KLVj9jG%n{;6W$2Y`m9ThN)aIhCpiX&HNe5+^6CNeN<1ksY2xzI0>+zCr|CMc0-)zMy!hVs8hvqWSf~)OcTBc>15)DiHX5Odj}>5)f81E{&FI4S2VxT DJMBHYzUpVq}8YHwf;6-bdW@D6!L5 pNREt>#n(>xIe#Zm5yXW#O4Q) UX-8(y=%sEZHM!tCV@aTQ_9n|0DG*}Z~NtX`}V@tovh#C{B;(^i*;-6)SG7#4;ip+*Urm#T-;Qs0N1pweQNkrLtS$Gq%*jvtcMhZ >MlVY{vVHvRURj!0H?*!a|x50lfOMiy?AALWm(rNvFEQm>f?4q-Gl%nhE*fRt5iJ7Iva(qF-*m+z{Gmd_*Kut0Ru^;5~?EaGuouD 4G8JQ$U6vQqH2=Fm9XZ8a1u(db4sHqkjPgjyfRM`c?vF}7@gDP(z237Jv;|p^uz@IMnno39sG)+V9R?K$;x(t6Ga40{?1pk@wZ&cJBdKDLpu$CEYlF(l a!hjgb(q8tod{C&Y$=RgSfleGY-1dFRoKo06LAxi3w`H8s0VW#wEhB)Z!C?FS&dnMl&V<7A3avmFFjVuz8#P{~>{uX^&>3VMJfv#YP`G>8$%TO4JtNqI Y8D%SI+&h9Wf5-`nvr9NsZ<~YcrVT%FS)&z}rA3H*3=szi3(-vMp`6ti0gfdOXRPp>&5Eurv 0P%x&Oa=OI3~h?v1Q$Q7)e^Io_N2t9F(##rZG|c%j2Ih)zOA4(N_aPXP;6Ei&WFZ4{w*l#k>NuJ25=J=Tc1bkvreYPB%^o=BS8`3 Q&ahokvw95YAQ{EH16rsoR)>5B&@<2$RoIPP4V_hW?gAcVrvl6u}1;x;OW+4jW<#3rS2ka62AhU5(!0w3w^s-_sU+-uUu<6t05O~ yHwH~sG=a#k?DuKEvK&=n}$DDd$daY8|+)2NlrmK%2m3~)PDg`O9KQH000000NI#2O8@`>000000000002TlM0Bmn#VQghDWMwZ* LtjlrQ&T}lMN=0Gi1G051Rl0Bmn#VQghDWMwZ*LtjlrQ&T}lMN=hk`@SQx?`uG0Rb&Yg5s0!XiVLX7A_ypo C?M+72mkLm-*ao}=?Ou7?|pv%`J{8IZr!@;+3&fxp7`L~&h+rN{YIX*8Q|Jac;2kHdEOVd^YpJW)AN1-cmUupTRd;~S)NxN<9XwE ^}OwHf9_n*n+W)W-8^pq>2K`rdGEvhzgSbbH?SQQkY3dfw}RKLcC?_|s*c_Z;BKdwSl_0c(4q4zy|B -kx`#-0$moPoSKgzT|m-$NgsedEV!6|Iw`H{So)`dpz&EfIIbi-Uk53Ervq=wm&v1AY{6n|`))dOz>8fFA~2 Y4Bvgk4wAz*`C`0cL0105L4lOFwgh)&9nSkp8Y%*@Ew3R1HKRN+ko!^`~l!Qr5$;;>*+lE^Orp9^9sEGNP+o%gY5<4&5i|@yTstW fbRzk06PFz08Rj04Y-NSH{ja=pRoMT+Wm_K_WRWW`}LvyJ#Q-Dc7PiLRsr8DD{<=trczXiCF%#XqE+I#oy &w2UP{%p_hEdMK3&fft)0=V%2%i9zXWZ`W&z?s>t!0SY-V>7CGL#7g_%oi=4N>p0Bd>lkNSpifq>8FR7Z`?1ddD_9F>z;Q6E{|CO8p8c1L!f!w&s^zwM*)6v7&tC;G)(+_8gP=(0pK~(zg6t_1AtwCKL;EXyf~0}b@+jt *Bb!Adc1D}9uD}%fr_%;;RkshSc3QagE*fH4(7N8fDZr`59a%yJH+$A%Dl;ka2}67g!FSN;8uWN1-wY+$zbVFw)Z`U0S5rv4&(Ul 3HV8&*TY!PL5Fd?j|A+I@js07{U^Xj06%;<>-+uT#D~`o=luT-aBHEvBZ%+Y96@^MvirS{U_FH+Snp9su$+^RApV|n1o2_@5#&=h +k21L^JkABe*XCg*7rK#&VX+}l6W&45G>!@=SaSP$&s9gyN+bPe|RM4>GwwxPd7h`eC;y^ryj-m+Y@jPsRuAC=|_V{NO^!eNq>(f {%wB@$MKG1Sni8}I|BO0vi!Y{W&4*O%XXBGB^@1fEZcMHvE=jD8vLQ}^b4)`gl?|9DJ{>Kx)j<)*?j^{YvdOYXx=YSBQ-ZOyn04JTm^utcz{GE6L +jsT}|a96WFhxoxpi~`~>2|*b_PK+W|tvdItc46uk!lCktJkL_9d`B)0d?lgQtn0K8iI2M7`6U3oI+={=`VPVNE- ()W5!A)kNb6w0%=f0=Z;9pJ7)7hfhmeC^AWkFNoWs`2SlF(!cBfH}c~Q%TQTeudA=Ut#+${|e{h$*kpQ1vol!kHfONj$!8F6_5l1m;DR$aZpWX&dA`!%w+;UE 4AR-}&mi7=XR_Q02B!j!2b^~%`Cjcz&c_XB5}$r>Cdc8?Gl>UJ0d5cY{F#*Zo1Mk^pLQ1UX6{++|KhXwevhRW&*J+-XYsv5&LSRP eir9%?ODXj-<`#I$ehh_nR+(IDStN0s{t;Q_bvU0XLDR0JDctN!`b9#e>t1=_+Soi1H+qj4##)5b4gdlb2+XDoXh?nelFj;>Rgul lXJ_u=IbP%l^LeJjg!4_n*i52hStEA95b^tv!$QdEa@QuV32zL?WKA-q-&iO3ozVpea 9z37@efWI#=a=Vme4jM<-1(FzF9PlZ_>l`ZuLoQ}IrL?~%K%RYoDI0cg_OGoUr7G>oeMcHTU^BY=U>EmJ>(+J=SdfFe9i`hD(J1g i2Z-}#b~pPGvG~tKf0LxI{FgM>t%p@3f*49c22mI`tFx=92Z|s`M3-arh|9js27h7jd3*mam$Tn*T+Vi9Rs*M`J*z1{maS&Fr>^Gn)9wDe)f}e_S96}Ow&ypjW_xZ~ &3XRLYWCyDtBG&FTTQ(ByXDJV!S;OU3gXcgSCF2!yMlPsa|P>JaRuu+@(Rw|aaVA@*Vyy5_Wu2V`wHD$!EyZjl`LoRm86^el`Q|{ D>?pa0gneAJ#!`Xw85)9Z(C{SRn&Jr`8AHywqN7CciH_*U!y(q_phopwbj%)bdwgz{&hWh;!yWi&;j%W57;zjiuw)^mF$QRDOhV*gUHJpb>ui?D>@fyxo%eBBQz;|BDa*n)~?K=bTX_?<^ sRtf*9qIpt>p0%8T}S-h=z8MqyRN4m+Il_vJ8(VgKlpm$_r(TpyPo6plj}(jf4H9X)p7&dwet;Z$D$ipPVWsIpZX1?n+tDXec!%; {ru$(oYz0u{YSnIStoS#b&kjRUuXK&UuQjc0*(WG{p;ilpZNxOFJRv{$R8g22FGcq8zDP@7mIHs|Gw;-%(w2F9RD3}VmZrhB7Plw 6ZO-t+{AvodK26Aj+;5o?Kg9Nx4W6`p9;80=I>_m{p)Y0{qP203GkR(I6i;5g?uM-E6X|cR*uivx3b==EPXBD#nQf8Sx@g8>IbDY mVXV~d(|4!;X`XkA5W|yp8b6d`~A-~q^}R%#`&6Y8~d>@AV|VH0`NQ;-*55#d%neTfBh}u$2)H4ynX0)(#N>l+25UR=kvYozVCL@ $B}mbmD{QBU4J{<@xbjImtWt`_D@>NcF$N#y6Ila_xD}Pc^+6xyj-=GhSlYl?@?{NHnc_;DsjXPP-R(G-8pS_FpIrA>|v*#}AQ{i3YQ@7qle)Qa3 Z12bJrd~VtZjRFdchjCb?rzTGYk=FxeBMnw9k-7Co4Jndn+uo+JlgL6xQ^}J`n%Ly3*RN(ehu(PfDe9``q%~EBV9f6J=%w}?;)SN 4-l%OH|JjJufM#P_&WbS@FKvU-pBszdOzjLiGULUAHJXTw$THW$H4=W5n0)$0!Gmc#QVS_Z}nuyysV(mtB8F Jow75sFyzaD~{Kg$4OtiKW_dggI7LIdjH1boR8ZdC*J=N5T>cO@e|aiPkw@Uf9n&R&u5X^!vjpXRu1{0!$~%V#*w)1M(9_`);fYb%~1pSt%M&fhNqD}XONLpih0 Z#WM>`VHxKmuJa$XFW^&f9hG{#U{^jK0fvw>-p4kly~jVk&dT7$A0CW<9HtU9P2&iIpWW`&ryC{`5f)o>z?Dhjenl{Z0UL8!M)ED f5-op_!Rz@^8cXUa(s^h{Iawca0qa}-*NnZ{yWOKSuc>Ep7R3z6JO~{GQj14o4&|?9rz;Y^zausud4w+13Y~2 Me@5p{gLpMKeAn~{gM57f~&M$Eu7raC~D7-{DdxYgX%kr(Z_iwWDzVj0C^uCu!r$2s) eDAfF$alK_L_YZqz)JvU{F!{@H-9Fd9Q!im&Y3T>KM%c3`gr(dj`KeazU>u`%e!A;|33H%`}Hw{o7?koudrR)So-#_@cqe_KEvMM !_vQC_j}p%FTKM4^jrD?cE92k>fMJ~Jx9GlIy%AXdEyny|7TyJJo~HVd*`cs|GlsB{g1!OdN;H5&%8=J?R=H}o@Mzeud+S0S6R-% _Wa0KS>N>rZ?^nvE#IA1?mhPWM^?_GuaZAL1y}(d{RI$1>-D|H^_ji?3S9{ku>IeG1GxYGKOk2CH~Vk!GNiA19c{<`E-fuy0rz{2 Y4Kjc{W=)q??(e}eS3@dgy6v@E#4=P{?$y2%CEcL)#Bk5@5FbvsK58*_q2Ew{ u@(=a#M>H`%lN(yD0KXOR3h}TC7=&D8&LR8KcL|8F@Pc;F98%e|7}3w3;#5@`6pYHf9>)~=BogTd_MV;EblvjLU&IA3ckN%(-x)E 4+09`JrPj&$jyL4CwFhkdLP-8?faAE+h{Y^-vKD|T-=Q9Jkstj+l=qu1}O9M13;m_rvcSJ1vo|c!lzmk-}VF){(LQ<$e-^53Lk#~ Q1I&Qn{%Ar3n+NtZ_f5_y*bPOtljShDEx8>py;Oqo3lSdfI{a-ZO(R_u{q1V&fv|PbG*I{DDv%>fFid){ArfE@YAe!AG;4e&GIXs W_u3;RJ{UFXFmJ=oX__C(`WnMu?6ox v<3UO`4*g)$y;zd7i__DvRknH{kLGf!+_$KJ{VBs(@y}!AOFuSh(E7y!TyaK%XYVqWxKZ@%W}KMa=iB#%ksZyFc{1EDvjm19BJui jb-~U9?SOKJeK2qzrmjX3g3Dh@H)XGK$uqEsat~H(6HGMB4+}AXnc$M*}t|`i>~`kZ)HDD20U8)0)VFg7PfBjz^c8!ZPVgyi~ASa fscTjcD8uu3O-I?c`pNk)V<>-ws>C?yqVOZ@^tEU#P?&iBfeY#2ouzMay$0_)a_eTpS=uFfyHo%KFSspKDS5=hDw{9De}#4z%O(&v6`{-H~+j!j8o6sh{UO?G7k%s0Jv0vl{`$Pran8h3hAiTU7tqW-{k*`DD&#-(=3;$&=Z> (*Z>fzSy3>3xfku=S`Zz_H4Nm@nO52I6t2S6n%5&ok;&f22a_E<8cL`$kAJOB0fH5@VT8xkAL2Y^pKg_qI%~xQ;8pYPbGd2PGvt2 nM!;+aVq?DQ7zO27*M#eSGE gXNw8D0=dbXK)-pGLz%B=}eB-bU@J~7tJKUsLUk4IBO>Bzr*r94=8%cUuUwv8_y!2{opLt|AkqcpEa{cFW&`JzwIpc>+xBnr{B!t xW71y?RjGs>2BlMgrA&E{GBkH^E7`p$1Rx6b{uc_=gubI`u1${<40$cAH4!7cHMh-Wj&Jt_XC^0lY)L4Zf> L3(%tQ1rF!=CRx&px8B+1ByQUyLs&IXXg{odjMq}_dJ82f^s2t*Ch+s-ajrNUbHRbd>*in^6k)tl+$P1{cQ_b-ot?62iW8b~_*a~F40EDZI>@p(Y;4^Q8d>38hOdLP)6?R;!cmiz3U#FuyN)uR5x9RS7tKWcBbsy4|nd({6F2Beo$P*>FLJ)RzexHF0mYs^`HQUo&M%TqpEo!LO0U?vpW2t@)b}M{ Sh=t1AN!I{kKLF3I?0}&zAxK#?!Fwa@9azbo%|)fw=W<}cdrjn{K_+zQ~$Xh@GQXBmvg+%+^BD&P}<;GT_YoX`9F nEq%V$MH9PEcbap@fUr(pZ%*DJi4EFd{#f{@5+9bv!Z8E5zrmE1Z{w74~z#3dcF9 5byI9)?2EuT|<`dvhj~I{URxope^LbH2{4Q=WXU&VIgBCx3e13f4CZQ2e6(EBO3RD>yIj A8Jv*=#E1i@6(1zA8P=`&-~$)q|-B265rl24E}=tZ$3;uao(yH??k}+R7pL8hez4TDd!x}(|m%8sz<~#i`>Jb+mM*jQb!$?1jqNHBRT(f97#HS@kqAMJBsyuv-CChXS4l{Q24O#MjD+@iW+;FP=#{|Js?<8(%$>^tR1eq^FAjWqs#?vqMEL?BW*nEAI^`e&?S722%ee9OKCrR{IV8r Z@}f3QLp&cWgPduC|*xKcNL)c!+(A~`?voMtnaoPIPcHjK>qTcuao}_eckl4uXCK%eVu&s `LB~-zxNx&r`dp)O1*#*S3m1U(%aBCiPvBIChfkb3~qcA<=xhRvR*jnCbsKBOP_Ev>3H7F)Iah!^Z8SNmjhOBp<)$uB>#hV(sQ4e@sSHI%Ef*05cDYsiPsSwsH!jWy)2x3A&&{&)@N^Kn3l^M3|#Dc}XS(Y}4bxeQHI_CTEI;MYW9r=IjI^x+5>nJZ~uOpr8w~q95u;n{*9r^I(_WrF_-regsPY}ns#`lrGX6|Eo2i(W^hVCOi9(y0h{ha&w{>7H>D!ae_KI+%E-p6rYcOUJ>$F2PL-_Lv>xu5r&-%ovF%lldGqWd}S d)f1>!M^+1&w=|{U)}Bxyr25X(f89|cmoFeZv4QGyj6f-kioY<;s3IxB6gq5k-YzFJbx5$?=f7r+r5SBw!(|%AuWsFx9|fSSNSP_ yLgPH@34DW*WJ;s9}r)zl$oe^2-jdc-f!(*=&&7=I05MoB=WTz6uR3F>8tVk`xwUa3a@>i)$tLeU4~ybem}Idr=&e&7%O~(j86;W F@y)d(89H1;hVp={8t&=3UD907Jl)P$9NC-=Wj%~4e|(|6dg+T9gRi$9)LUIC;sbMfdBNk_dxiV=uR`N+%ZE 3}ZDuiF}>*j_{1XAng*n|3C}ZQ$^=E3+bog_gSQEYtN6y{rOh*p)w9g7k~WI_8jVlcX|tBEy!slipFGQN^*6+1;$vWQ>D+}V& dluJkvpy`BcG$D00YwMM144W#e;3{AbM{>HsOJ*>y>kp>BYxJxy;Jh{Wx*??m+%A2^nL=^*236?UyV_By7zOycZ}h>HrSu8C+;?|3kZ;h3m4t|64$aG4JiN9*X<1(jWXD!}Vbv*URPaZFu)({5BfH7^p>nhv6rFcUcSl#71$yBu4f~ EC2WSZIXBj`<_|w9e1o``xry@iDK0AgnO|t*+WGi1|`0%{9 g>g-7V;HX^F(P6=T#Ngy5^WJ3^O+XLIQ<4cs0-ewY))h!(+>f!8^c(T3+$aI?fo|7J4g7F@Nj!)dt7gU>(|Fq&Jzl`7M_Dp15ht<7Ccu@=EaZa|fF0}f^#u5AA?;>aLdlJ`wlkvj!EqL#z_(7HQVAg0n px7oNKOY;zxDS!VD_a;VBY$7Q^&hP4IhHmCdH;m84_MoLd;T2Y?~(Rlv{P&_dEDN@eNnO|DEkA%_rLi@+-rK7y|*>sVk>L+F^t2w Ix$Wkv3$SA?^9ze9<9aV(Eu-Yc-AlnqF4SH`8Tt1JIT_=Bi}>#-EH?0&#-O`_pjc8Uyqd|em;nO?;{&=&+JmiXLl#;Zb&_qJ%^9$NA9PDI--!n0=+?|%*Vvc`O@(1yK#3epa- =i)E=rpGv9u~id48$_m!VVuoOT#H}o9e92Upsb;v=kOTtuYg@b+me3_W4!(g@Oi6mTfDc8<$qxe V@$8NHkANj{&-I{v~ddZy_Qb$t{lUCE%G-BWj@=&c-xm1& 5@{!l;l7vT-`+CLGFL5(1#^G0zg%>8iBq~C&rcGa#>)M!;1aG^;`epSzn$R=OepV2q<a#P4l=nUi@KuTAqC^ -(u-M-apXNA8lb=w);C=aHWNN;^j|lR9PSR!x+ZhxxZbIXD-tI2>2e9_Yc5tApI_+$-4cot^9Xy#P~6>ZQJpz2$-?H{zh;J*Dodd @!w;(PhVmpU&QYY-0yGs*N$QArTk6D^`Au!;`bx`-nkLU>K1!`vB9VC?8jEV#HGE4-?jLC6q&`3bq=22nxJ>_ea*)6TLJGy`b7L> eeI_$JV)UB_&q*`dpz9V`xDnkC$7ccBr$EePglytd*4Pm1Ng1L^?R*dk0<&szOL)7JvqT0{I0?EZvnq*>0dOsIpFOrjHBJh(zXRW 7-?4kz6bC-GB%0w#WtUkxX;M^B>KO<>yz*>{QiQx?;FEdWbyB*kJ$2@EAq+X{)Q_&?yr7Er<7f{CY!aIz9B>weAp$p{Q8E_KdcaZ)te$x_T@&o)XZQ;Jt Lj>pWJKLU#Pite51t{}?F^oCB$e!)hVll#Ye|Dm+^0zPUKPfyKzm4$zD&#-e>iss-F2QfPj5X56So&!Of7inJ4P=tBA_yx#I|*}#u?Oy8=HNBp&)Zpc?_;XcZ9ql|vyZ*Ix&&4z(r?(?&yVZTx>_Y{M{ u-(u4)gb2=ddnq$s8B5W*-9nIR{d3r(CO*2jwlf8!D7?<)Ku$NGbGYYlTw3pDz#jgHm`CY$@ dIuycDl63dawRC~bAOh;u}I(WQ{}VD&Qw~uXNw!(=PQ1(5Tf>EXZ@hmTdtRCf%Ld1=qp!)c0X6IYKze2K0MLpq{>HGrD8do>-49U kS$y45ByrS09Xv9lhq&$N>YI(U&b0>r!i~hHNQ^XFbJi@4(2H2GL4C46224J#_Dfo&H|sIwlm8Dnlyc DecY=SAuG>P#VCfmeX~}SYymlL;=O4x4B?Np;s!BW=R^RF54ee?xtgp*E)n!+_T?uxvoqUy-dAg4(bY-dinT@(S6m%#?C*YGz8YFm+1L)OqDxp-<5h1GKm>7<5gU&@J1%omG2nBca~DHG5**TNb3pmzXW>aJn3 qt*$@#0@N<{%lop^~tsq6m9?t1$6WgdTNplUlx@sMcRC*DL=1m7rgd xtbmF3xmKW@E2)wrcerN*-~#XveEux;4G`GDK{=gureZ7eNs}Bx85YZ>z8-4*T0kf~2UsJ0c7rBkSS=5_vL^snfO1m4 Wl+SjfeWR!DLqyFWu`@iAj430IJ6-Zx^^$19pIZ%ZLiI1a>m*-@g&spWgR}tUMko8-g>nPMp7L1bA_-{%nmD)>dkVT1I1s^c96l4 vsZYMlksx7$|by93WlsParZ;8W=yy1%FMDqj7c2ImTEG2V2`~4N*XHENa(J?JEur9O{N&L-O4@wjB<|S1TwE_sX;a@pcz3)nJMsw y+k(9Xb+kd1|TR*--!8&Q7dD89u!Uz)_eNO#T-hLtV$7r0mweLLWc)gY+x T7+H^lyB5K*sfK{OJPt9dWGl2Lz?X=*LB?bgIcO!-%8#U1(*Ek*;UzWl__0*1|wFPI=fuQm;m8*0K(vaIwVp6K31%|!W~OgXpNqLrz+DI8BD#wX#UI5*Tw(Wl>>a5G}4sdm5^0 _j@o@AXMqH1IeIcg-X9zl1gK`TT>5%v`^+fFxBixU+p+uPJ1x;47N`>x~X4nu@ERYv;3`*+(*LX7rI_-tJlCAaT<+Vx{b1Bm(4U`sW 6Ui6I$(+J7tUQMAL(kD+3q_iaXsgx^jVr+zVG87}?Z$s+*Q=tb45}XOiiqFM)GLA`ke8thWkN;|1v+*?=cuHlY~BsgzePt{NbuIk XIc^Rx!#|TZ5J9gf^D@9v_|?hK~dIP$XUa1%j^$khtUC*AXy5QZO`>!K?{sD?jvy#RP2K3x925&A_ez2El3(WWtaG5nAWXYm>Ih>%L^{ m^UxcQ1$@4U)if7b}N*ezzm7VILbnCG*Qb++PWI%!U>gx9zX#ovjSNP^}YzE<9hF`1JwdVGY2jjhr`>jNK^&JK#R?mmXxZFI!#|V Lc6~rsET<}6Wb}FyKx3$jEL-_*aBgVfEY6%rGL4vRn^cMPtot+=a&q&EF_d+2BLWgy{o>eBDahf+~I9P!Jlm-;bw6D^lb}{NPYeuS1s+;Cu2y|?v-nb5j X*zLeVm7uIMDS+jlh`6m2xFa9Ft**MSR}}>rV>}FH0UsMK~-i9SDL7)lf4$M;ObA;T_5ktEot< q%T`9){HAOVss;~bMjSjUi6<(mkP0G|`U0f1o0m|mZI;vv?a>A^siUf@0|o^qlj}_OxS{)|RV>m0q!pVjfuOU3 hn!7e=;cyhpen%wDT)k8l9Y9adsShfHQsZ1+N_zP3m-s{2U{D)H#_$&|%n!(U&+L5THQ8HjHT)L8aNbPI(trAd(; >t}`&J^;vZRXzl<{DsO69nTJ`K!iwWT2qyyS#4QZy`eZ5`OG|oreg*m0x$}7O^W`Zc1gV=f~#7tbVzf+u1oc<^>lMd@7Zc*q@H|0@KATM;qY{a>?!tmr74oj#rK;lR(#lmcm30g(8Pp(ZLZaEw!HVK-!Iy7j6x6mR-TBEJDh@^ewX|+`=YVfseRpeK^ J~g*5VX%t5nqec28AT(cL#e(|A=Tlarf!^U?8qG94mEn{QG^?;)cA}(-b~^}ad)f2Z0$@{+Y|H`V2zH_^C(+WG>tqJBN0>eiO8Hu 2((NSB$ft>!%+DZOJrxGTAJatyfxC#I({&h4fB&Xu;FoW+F*68B^pabA!;A=ABf}iX`XJ}bRI`xY@#L$@2n{If#zGN6obfO3(c%E uTX@+u|1X%o3je#8nskGZB;N)RW)Hr43(<`Ad;-EMow3K+*V^E^*b#_BDWJ!I}7D2Lp?sxBF-aluNj);%8Ibs jl(}$rlxaIDlexuOmfWN6_bs}7$(T|a!zXFV=ft6GD#JwG(?z4E{R0y`kwX`3R`0n(+_x=q?F`yC7O5@ug|*NY(4m2d`)>mA(smT `|ScnRkAuOiYgpBZCD6pXSulk+ROu}HEC*0+Nw$7ni$@lopL3bn>T)jggF!eizvn$KeJrg 3QAfy;15PC$0C!m{SYbcv2=Tbo=c+T8Z3mN#Vz$z%LBRsM^m6!=&4FzOz4fD6BH}>U#tstLr=p9ji1|J64gvaBWc7N9|j@8g;@+(N2j~9a@jpls4!C%!b_X8 7%66d&&&>Maf_?N{xpu&k_x(?L$+o4GDv7yxeBBjzZV+R3dLC5>iv-?(>MRD`nZLc0-b8Hh {l)4q4xqt7m8n;_Od3?PVz|AR3*vax%ktci}WyeL6{=69szk|Hu2aiQ5AWyOgR-6bxJ=)8%YpUr!)UZ;o+M)PH- v9MsqPF=?%=YHB3qthU!V*fliv(VV(X$olUw9HP9*YW!fSd%%sB9x73m)4F3%@(55&!K xj9%`90i8-)cakvt?JO!GU6)bEfE^1QzlZXlXo>x&{YvRZ}GxJoLfl>khM(pN`T>LAESyEl(^WaD|z&ks{=uO VPdA_88WKTM7lnqDBC?<>&Me7%;J7Gb%{smrb&jV&S^!p%Oo&D);${dmX0wMp-vgY8PetIV9c{;#u{`IVW&CIg88?jCA-ifov0Np Z&0pNHaT)TU1VoZ!;exWMJ)_`m9^&7(iW#fcXpPRt-k~d{`(gT3bW>jpYUEcUTQTzG q!&C~;foXPFt0&!0ZrXZct0JKQ4RWGmV-7_>2YzRI)l=;?8pXz06I5#C`NQCH5@af=ZwQmS5u&ZRs}Z&_poJf^;EcUHeG}$SNpRP g_HZA8iVyujT?zsD+_&#%jKe~g;~eZk{um|(=$9Qdfnmyqd;L@v~zK&CFdNX+bIfklfD2$brqY8&phK2E?d-?AcoJOq4W`}#7nq| wGWFM*rG15>lpT^&s9V%q+GT{d8-~+4J-J9s 2eJ;KQb%*NApmad6LLork>)FdLNR!)tD@f1>M#97oyoeC;; O^C#YmCUTki07uW^#6~Eu;2q-;P>Ozq%g&nqY=_F3$BvEMA-xg* a8T9SHrS5Kc++w@`8j40N8g!hQdA7=0~dhGk}F!!kVW^`h^FeeQJbdIm1WC}=`y1AhO!Ew#`PxK9+An+5bY?66n55xP8e~*Ex?cm IDuxYpDhr)ZLD9?!dSWf&(s6~oC9{rYEG45pvxx;$u6Jdst5T;v6=Bkr9tIGHHh-087Uc(`;fE_w}KwkBdOvSnx6qd pssaBP{1@UX0-ND@O^)K|5)pFh2-Q%3)uFvp9DG*mnjHz OJ%$zD8iD+&ZbqB@BnZ#srmu~nTO7XDs0n2PimpKAx|9b(`+%80q|Ul?c>gaQ3I6{uNC^}iRlSC{b?F?T6ST1J~uB$hN4Ejr?;Ec Bz}k?+1#`xc{+3ntV6Rd$Km}FR2is?<1G#b$doaxOujmzJUHvZ+a6&NcSXA$8*n(sn~58i}}do>Ui?4U#i !kv|3m#A|k)LNs&Y@;%gazQrTDW=L`m@Fh&MAi(Gdc{la)#aVz9*H-i_NcPk7j2A+N;F;AZMduyD*B3$ApZyXI?9W7)Y+3JG-*$g ;@t5b)sbji)EdKm%{Wf3E9%bJOlE$$7IgV;o@CkDt#L&ArX$lv_?PS`aPq$|+E^ZTHfdN|lM3I8`ZThz|FqH)g&t=uUqTmx&!-MLp6UA#A{ )s>lSiLJ9G+7g>nbv|2vcFQD}jwZ$_x`=@?it%8YAdJgWG{IJmCk^by|J+YN?MZHdAcdYnu}~ZKno`urG%oLzYTk?}%$r7OEEH5& 2xE`4&{}PtB`g;UId@kX_7?(a^-805aU~JXg6kq5tAk=}CAFsH`31_j1U<%uiT6NFRSBh9kwry`jbX9ERZW!bRIiaGWBjYK;*PS_ RVqAb=1lyXH*c@K49EqF>=9;7c`;Ksq5S8!a_3IiX15xz8>)!0B$=Fs9m4SghiD^H;s|*@lg8>*$71zJj8ba+bgl%+SSW78qg1VN G9&X7Z`fYDa>?N={Rc?TB@dkZNJ$t(c{f5aQCbf4gA{~3Dib&K~KHEpF2UhTT3QE#gVw1 n(is;jNaa$jk4kwl$|Vk$4S88^4yK~L<}oN^AJ0W%WEkC~wx5qg&z;aNKg!qI2zfd{wIes^2GsOsxtizq~D#3b5bMRlf| N_)ogFr?B~8$Va}C-~KJSq}-Qc4ijU^+2O|myaY%C{gSaO{kom8COlL;WQ{hX4A*IQkT3Et%0&pS|+9r=m%A8XU}|{5I;g@&ArH? N$=dabWL$1n>~&E+4m^wN|00)!7O*g7G*CQrAG5Q$)BQ~jZyr1)JB&vwme6wwr?qOlcGi5s_o1}D;lWDZG_1)2%143{wpt;>03`_&G;RxO+$9X9kUZ!~%#8oSl^#^fGcGxcu<}0m-FvD)u7S#F}qBGp1hc-{5*Q^S@Au =!&J}K#Z`ZM)fuexk%_-YP^N8jJ1bhJTohQy}bj>t;%Ww`)3}D4R|+Vc2*_V3?zOuO4`xlPqmu<&<;b@@iVKzk962RNal>D+0Cg9s nl2-&JT-Q@B#(fy{lC%rh-&C=jU=5jS>jJ8>iOh9c(isJQVwD=xI#Inq{{tmHv*60dK@KVYh7>PP&(!QIc7>F`!Wu>gqT1ugb >52|>^JXvDW9F{a9mf}4#IXZ;hGy~27#}-F&00zvzNeXzR+iiSqSjVo 6QXo4KF^@h)KD$G>4{BlRXH(t7O&8wq3LF8)=O@=xo6m^*wL=dLN#gqGGbm9^`L7;u{n`3RImWKLGsClMeSkQj|~iLc9V6bL>NyX <6p|@e_~}pY%x0;J?o0VEvL-}e}}LQO8vFGH#>b`ox2zF-LAU~hS5o@f{aBljACM)sxL;Yh8?ix yv#ITDvk=b6=kWdDj^-oP?Ok9Z;A>@PlO&^=Q>)|=;?*%Pd8)8cb)F-s;qaCAM?dsUF5gTRANzK*ElGAeQDZwiIgxaaWGpbC1OqF @KE;}O_t=!1e;LvWebGAKo2t!<{(KLhggo2#EYhKqF3Ba2OcbgBu5i5t{5e!x!0UI_}4LS9{=y??#6}Q&6_9Jfjai$Jr{ZaQG`HY 0|rU3i1~I_NJLLgT|Rb1E-jssoY@oa$&9q8-DEy2 TYpsr&kh7O6XLdxSMF`oOyt?tQ;@_19H_R~EJ9ORNdoV<16fOOPH_#OkRa{O WJP+Y;!RB~jikq5^hG5&+eF4bGHcsMJK=@i*Ep=M@eCg;NcbOWpkHj}{9T*+aZ3`G9_i1P*=<2}>%@sOu431L&;s-4R8zy9`b4D` FXbMcJE;2wl3}+zeFo@J%tgc(Esi+`0ZmMWb~wWC6ur|gLsTo5iyf0XtsXnSCSBDiPM~qERwwD62z44A3a7 NSwOG<0uM84?Xgy)M`^{TTPjOOF2L^T9{2}(5b!D!V~8@M_RFx&$i2%h1s;76BNr8(PG>Jr_pY2a^Y}&>y@3Ej3J#WE0Hnc7D2M9 N~{bHhSp){c{6lOSy0^QX3dKp_E*Tvo4Z{xf^PRos0Eg*q5`@>#gw5X`9dYy@ZIT03v=;9Jw+_XSP~+FEK!8UXUjlE4I~gC^y**( l2m=7j4;WH?s %Zn_=cnPR1t1A(^)hiL!-tN=A-DNX@+2+o|Yg{7VfIM$0v}F%DxptCMi1co|)ZO-}yCq?e*Ms&lZ=N6R3CGRMnfl*edl`@m`hRDZOA(sR6G5%Vf~LIv^Ws2E 6+Maj&=M%qym^JNHz*dfr9gIzjySE|Qe^Lz>}r0~a}nn8WXfz$kLVRy-92n+vKz6@n=dBWe4XWp*4^Nm8+e3oANhym7dtZMCpfn3 oXL6f%jv)-JB&bwMIP9}WyzrXPJe?VlN(D9BhD(1sLLmI+BZoX=?9xH2aXoX(fVLY4!h!G>l@kiG)CJ(UTWAvZVmGoI+8rbmdhWJ YGwMZEorVtGo<|*FJ`*ED^YVHLd0_)1=Dm!fd=B8#?#MtZmY*g>Ump*wDOi+Q7+`z&Yl2f5C$SPkum>aIkA-Ew3)5QZMX9~SiRFE <+@{u-_arHvQ?))O*jAXtWz;#OT!xw932M*p|hilu?FdtQcxn@Ryb5*CZasC^7}v8Ce%&W1`3X%%%by}`$w92$rs|(E^k4}Y-_z* -wA_*<*???Y_^k`b&sip%&8t>9Iqxo;dc?{7D?zNoSGsU__M$*CVRSH9$JD*<>}mXBJ6X4TdvWC|5Qpt P=Losz-;lYu9RwIt!}Py=ju>DY*-U0q?kptsx?(|ilHjx-oj~% =XeXJdt#|{;eSl5w-Cx5O?*9JeE$ivim)6_Gs5_ZaciNBKSKrQ2)c2#NWinp!Fbp0T;m;=q=nWx1O*9Y; JD)swt1^LwRVZ>Pi_5l4Fo+9eXU7I>8|5hN#3CDY!iDIVI;y$rv6Cr9eoteRr4pAz)x_j(F!v-(sxq?8JB**mazVV-m3R;Z6eJVr U(*wr3#;66TYRW-V!0+}$?~>J{zPoGOIqfRjd2MWpekeO7d9S>k_?=V4^N5mCDkAvFQ68cJl~(uloo6)U&0Wnw?w#8^ssqqXsLSU o9;}BbmfJ5oSrI*L!vFHf#y;pjmVCoeiI8u53aQciNUvI&n(o{{74M(wowKxq_Mf3h8jyMg%cK4 HXQ4*QRDS|Mq9brkP3Wn6rvri-Gf{gUH_`Q+e*})+&b4}tzPCxcAxutsGBY=Td02GER9-pl68~)4Z>0egRBs#>Sz(UCr+Y|%GH46 (c=o5pINAH$E09ROU5UJjRzpQeuV`|qV-uE?i_VABX7`#potu=JmRFq&P--WtbNOFu5v|~QLwT%s8AR=Y)slI@&%jGD&^8`IQnB+ Ll(-hDCi9e5-}RDbVwTA3CY;|u1tmsN>^rFt2;F>Bh_7`=%U6`*5hR;u#En) Y~uCoJSYM^wkp0%AH}4eG<%qhmd&D13^nYC*zj1?sK|!hpCgLi&6d_jD|*r9A-7Yq<~}mu0#12|lzhBkJu%^n )4_B4wY-00nHKFU7u7D8OECaciDKZYeHVq|kiHD-T1}Uo*zV9Jgi%k%B|qk1{gPaDF#9O#ZILW?cJwAb@ad@0>+bgCNH>4PF>0eE j~>p`JiqippSdYZi7YTR0BBojZyYpK<>wtt&y-mIZ=Ku0p*USwf(RIgbJ(OK(>uMS3nKPm9r{br~960P(o s$w?GTdFlp8xg(bmL%gxHa5M{P{s}Rx)T;bH$NF_OWrzbkQU6~syY<5& ?v6(NC|R>j4xEmk@e3sl$xV-emJ^HYtA5tZBkZ|AjE`LPHvskYsOCv|l~$ogRjO_Sm<07{ro{H0kuG V?c8{LAGLNXVKT(=>paOGwq@eESez}fBi3|j_Mhi-Rf#gp3ahuqgf-?F(Q*5nHqhDT6_`8c$1$PP2T|%YgJu&>9yURMLjW2Hb5$S jH7Gp?IRmne%aIu?j)V==p=PzWXTXww_}zpxJZ>^yN4EKp0;y^Ba>~+gUu_TO6N!{-#T~ivw|8WUGbdj(+*9oVOUdmGXP7j;>f*6O}jhaxTs{oP9Q~l|sC6 _kf++9=YS&qirFMO-A9N=KD{r?yk2YDY$XHC9e0)-_@mpc>UyGdHv0+w|ArXGjUDPZOR;SXqTN2rLi9R3GikvCkbp-HmiqT)!h*c Z~CoQ`Jj#-!Y9@!Pxu*brd;vE3$^6_N=W;1&Q7tE78m)=Kaq1QRBwr^l2gsup_$F%^jKAN5LWUK9Q|(C2EXYnrok$Vi;s^o (OA}KcK)~Pv+$@w7}*p5TP+|*N}T8K42b{Z`v0#+q?S(}Gx&c|=l@;L8>@^=r6!*#9%nYO?c?Crjnv~6A7-)PWdz~+OOeHDs*s5` HXOVXALkLh!G+u?c$W=`S-Qq;H3@YV-L4@NNcJ_?tD+2-`}*Fjh6L9a4_HIyqF{zvX_hn1e6WLbe90HCQl1DB! Kb#{*MAgl>8qD)Jr8|l5%Lu)w5ny^4dz(CAIcf^Ogv4F``fc_2J4W0(-@JxGXsg~j0_o2mZx!nc5)z(`K9`)-BHURTVO`v=8g4y` *{We$p`PD3qM!zk0i%(9iH()7>*`*7cebB9@QFJW&=L8nj}5Z!1EuD;a@dw(EtnwP?>89|Th(;Coco(@OG%#%l=^nC+tZO4C+Rk^ XGy6bJ_g1vga!RLrdw|fz!l#tQVNQuUbRJEb%*9ILBEBDBiSfb n`)&jUF;|qEu1v{o$a(C#=n*1Tx#q6aMValh)k3=`@WL hI5{bxLS2yG;6*tuhie-9LACPE^0E8{Pj{-LzX6{1y9sTXLAer;y&T2Gtu`YxtP)AA9!#^U(y|7wli$8dFRq{9z%DV@k{LWEc `PcHj`3YR36k~B<$)cL9Z^dsr?_>J#(bN)A6d@KLq_Li(wvuND0H-kEJF~JVN>i$ZEMz!M&U_TYzLLALML71VjE#svoQ%$qkqp~P zQ&HN&$j+|iOrm<4z0$82_JKh+Y+54zjv$X#tow|twcfF`4Rxbh~O}e^+=svk=+0vG2NWWkmmS&z|4$>`hDjF)`rxw_OXz})FlqA 5j8*;PqVeIOh$Z8u_$v(jk=GcFty>J0Tm++J|f4D-RITg!q%sCHPNl2L)XpG2wjN#Zc{qoh$DXet;U60(RrOjJ;%#*L|nWiKSrd( 7-{3FFA{-&IZ>t|iEUwm$MLjpB0>rQM>->WWhjb*E{gILy)6ky$20_8~G!?m^H6}k)mi)A}MXgCB29qbYh0*mS T95HZmXon7++vhEoq~4_^)Tke)e?H6eP}alsF(i!1~=aE+uHMn(+};7+bB`C8rZ^8V=P+3y>10aoJ|}*j-z?wL=+ccm{W#{eTjw0 )Y<3qFiKB;gUnkT$8NUsETt&OE6EDn0Z_^9U?YaVGhLec7>!98tLeyso}K2Gey=df&P{dI7ISaTfcV`EEj)eXPLu7Mi_0VS&$LG; &8f(OG)F-$WRQ%h*0@(dcON$Ij{BZ3?Z!xUsnj2_yG2SD127hG5&)@4)*ee4jD59Ssp^3Pm264&+4F%O#n=(brYW1*^fZY&(IuKg !)KG)C5=%eycKfpnd-#3evL}{A_v+w3&qpzpQQ9TE|J=$BxP2R0#i~nbk0(7e$=W&TRi)>@<&KLS>x{FoY0yv{qEiz#s 7!KPQnW)RuTANw3o&GYOa~wBe#4d0@K`VNar;VO|@ijSk2_-DT@x0p(&*_yjZ5GRit%_vCsB2n!2jpTgRYqBfa62-fPu8p24l#QB `cjKahWrVyOlM>EC_pBT8x$R?ENjML988vqlzmG@B^(%mhRn-x$G|oh1crtQh^n&7$RSS++^`N1^hTkbfRA6%qjcx_P@l(dOH1R!=pMNG_p4F$(*<{ZE*SnUE^Bcl9IRnvXULssK=3$et<^7r$f`Gb@-M#h3PXkL&Yt=HaemM0NGJnP>NBFqoyKQ%iS`Nt*si^99dQ0`_jmD#gqUFOV Uf5e|rkH*u!sC~r8H5^bRZZWzji^jr-&WP7$q%Q+n^Bpp$Nlg!wJ$Yw+_{}dx=j7Xx=I_Zu|yhi^4P>m8YQ=Wif23U}G{E@iXIY(aUk^(Js@b_TT24W~`(5s<4N1e?SMwCfM)jp9ywUEH!F~0TieS}uUBNZy@QGq5H{|1DcB8Y=0q7^0WH7Tv_QAKxYKT-z(DZsy08Rus!|&VzkjQOhym8RX-lS TdtD1$U$Kv+=AAg*nnwPczm+2g|eCrn?Ah5PFD=m9pO=>(mGd%EHYNC-o_TEH`urPY2{_asZFDtXs#q6`0c(e!^%bp&@#So;q)#m=Drw^|aP$nToN5XxBoxJ^FU#P`D*tT}Tli^dzoNA^xp!E#PeWTUycNAn7aUD531tA+{=#U i@!?L$oM8Q0caD|xFpWN`_HmA=-EIhSwyTKh1bw1kd7J}K=n(cKb7fy6~{9rB{<|k)E`#P`lCWdypk5hO#8?xACtpbVV;rSLoAQC&_TJ0{_8A0F40F`Jd(yVN;bYf?i2h_~gHmK9ED@*$VxCvTNStm@N-aCWTJcR!)Y9 m`o&^tk^TTAfLpmO{TgynV2+LFln-9KI4(QnMUkS3bjl6zqTtZtdt+Gqiwp2T~%^iZ$F*ny?W^b3T?v4z@Jv!!v{e@h| ^m>2TvAEpj$DWa0`eDixJAucUg$p_sffD8I4*48cmp^ISiJ$A(_VXPRcl0Mt?3y%bn{Dxzks}s6+`5t+L)|S0AQ!^kdgxDC!q}my $W`jELsjTl9ApQ(U_{H&QvQ@&uuHMfS+4d^&CHuSZ&uvgiJjYKX2>bbB@_;=uFIDLnJ0i17D|&<`+?!N(~`xrJ9dooNh849JLFpn ISp*uv8PbW?Afu0l3pd7>yWeiF#zcfP1?bqG^uOb?b)F{JIutF&O~qet#pq}+;RIIwrh*}gTV_jUh2%Fxr6>}@r?Q_FzL3PT|Ajp Ikikq84Bch^s>YRb`KBsfa<|QsG$nwmy~1qvjd5$tcIzgB?5F6=u{54YX{lucRNwj>>ytZsy#uq&LA~O@1x~y39An$2*L`hL+MNfoR>A%U)IXN0Ll?!}S1bMKqn&gKC)Mf3 ??iGNHkk&`n28TcOx0jHKvzO1U^S Go@IVI;Cgox})Utgmtj3T(&mYrSX8vAh)68NL)uPDEO=DP-9os{Qh9wYRQa(>Q(t-iBw}JnBr(=)7WUFm{ Ij4u{46;P?1Vt}kKrsSgwzjIRbIJs?%Qa4pRV`@i*s#4LGJ{&0Y+%)2cLC_6R?YU;MLVyD{lU<>)p`BgSuI_tzN7v=EputPSPW~@ vx1x>89i+mmVj|C7J_vb7lkBeRfhr@Q`C?yG4X)sYy&-`a!PW*DTGQ*BJ)C-4&8o>QK*1Tgm^Oy^n~FK#(OO&tFBw+|j`E0Q!9IqzdZco13uG71!J{Z5F4iUwNS_YJs8#zH31c}~}H!+p6G*J@H=?iNjhh`7JrGtWe{XNJ4qiRJ=K}|hN Lqa+cdh4KS&Qe`IY+R38r*l~Ak#A(9A@P}i^VZ!Wyx!P*p`pXFga`q-Dk$xoqU|)DV?3wT`{bQaty7&lLmep=o$eD#mkpqD(;xKc aG|Y%jPatNkf)gAe8#9DfngZ0YM^3B%5tm&}6~kS>NwGgS;=u_&FC1r}s3$aJ~Ul7f#ji+voJTzHAq&R0-R>8U_b*CPM`@2%A;Hjn(Fdrm1_BQtHH+7S%~Dq;i>`0N*1aXYqT9254KusO^@mihtjN*_AXrMf@q6t9pL2-pN ih;U`0gl&98J*sIA&{fY`t=x(WUXR`)f7>L*FxhRQ~|EEBB`r{0~d%-!evUzc1(>C8ZTw@N?nayysP=Z%)}7z04oVWjJEiPB1jYd W7||x^GiaI(g2YPk!BuB)(+n?cYv|?OP+y1hDu1h>hI2jV}!^XkOMe9=r6(Kg0~8LWq$I6Bm?Dyg;9I61GT~m-NBL>655bvII18T io~lGxKQga%!&(3c$l`eZZ6yoRwPc#K+c*G2WGh^TQoKS(by-Sq%N5dMPp?e_>zjwqOyr}r$CRYsgy*Ssgfk}n5}x~II?9|eN%c; &lYviYf$P%!8465RhCfltlpPsSoKq|$4LzW)v_@}$Opfdm)y43+amUxRM^MGI&8tFrlGl_LiQy{P&MkzCjk#V(aSYkPfg f>4B7h3)=;=-enR69)2)F?2VixUcba8qsZJsMd4)_L>VWS5N!LY2rF bDR6wo>er1N=i1#hMG)7YScc7%*ZAbw16hR*h+yOfL|C)HleMnVa^lk5vR66SQ;fjH5YLzgf7!<)z`$LM!%Ml0hkJ*>Vs-pb^=m@ `IY=x>ZPa!X>CFAz9TZc7;zm6sg(O_O_X9auA~V$9e#Q;8g)Y$=R#(K#^_w*Gm27~W`&afb_&x}Qrl7^p{3d+2b3Ld|rB40GCN?EG@(gN)^LqRaMQZEhEw9d5VjTtQlsy9K!%*b0**@OXAWlFN@^sPzevQwo)e}P0O r&JHA)@(f1Ow$DtRP}HfKSeM)f&}N2IPHq|_Xva@3rfie6(ogWB9(QwFEq?^q?(asaxO6t%`q*d8GacGXof~g@Il-!BE5}a2T*P25Sb|Ca!q1KsDY%2{Njf9E$VlZ?<`LYPF V?GKc>H5q!;UDDT`w?uqyikEsU(sb>fv{Zslf$NGPk)0g%u3J7GlBG`~ Mp~OlKCESxA&SYv2tW1u%~GvK*jaO)GD6Iy2BL8!rkjz!K#Ks+u0xG&F6z}!unH1Q*QUk#5%q~~g^aXisWEt19w7$`?~6sNt|RGL La2)gh2h#8gwN(vrmK{s7lSTAUbkDCcFrY9AI%5Cp4#p~ev6fhj3uI2dhoj5R{)qjdI&+oVUdt-5|KJ93u@ ^NX9_q`}I5nzjvXp3f8a!bB0Wcv{Uly&lXLh6O~Xdg&y*A0i$WZ&jsLF5S1DtY|oqsR;TMtP%1Ybkl02q4slC7KI0lK{8hZ1zEOg V0xp-vxG`8lZZa5W>`~nQMA{wN}&b4I7vPun3EZee<-fUl&@lU-C9L2`Z?>RoSyAqrKO>2pGE`g2mEA^>Ut!H 7{g&9MiUL2WvjBpufhg+(QTiN >=4_p&?i2+cA{O!K)o6kRktA9AGruBH3sU4XGgVUe0yC7h3S^6tSh|#^Nwu)T079fPGBcXVNKQtkSj9pC ^A8K`YrhosW#8*%>uK~S`z7mk%*@@~BQiy*s(W^^jcSUFtA}6A?Q-l`>chv=$IxE0DcyP}KbYN1@=j|fbajCQVpkvkN{_ri6OuMT sL&Q1!bboYC#qV~5VV&%fW2pX8>X{$sl!gj#$!~M#IYY-D&&LlgQMR4ENTFEC{1L)rT>~BJ !J*K#Z^uzNscM$J>8lW7WGR_EaZ--`@5@|$w%yTM)jSUBY^v=B0+m{3OAJDglene|_Gkh8fg`Ax=FWnnA*2;G!H+c|W~tzbu~R<= NvL5`*+GC$wh{Cp9UlFQ*!pCO&84J@D5YC6uEB}J3QhJ^o3w4)k=-)VsIYk`w1#a)&d+bj^WQ-C7yA?n#uj7V2(ZvBFJ}etocM;9 rMEV`eDL$*yc|Shq@jvP#s;!Gn7`D^!6iR{{08*e*!?tH>qZ~cwvxK$kZy9UX~BU*>dU9ZCGUyG?*;Ftja9L*AkViNr(K#P%dwgN WESWo#nmkhj|zvY@_2R@eV-S5kSYJ=#J{lL%SZa@%Amweys!6{JEty98m?@{R`_;(%hXTf~J`Llh0P01dmhF<}w!##iM cOg^uKA#DIwY>%%;v2>VF3m~5A-*G&oxg;uYEo<85v*Ykes15+YDkmPHy;IaxYhofy$!t3Z|iSu?-Ep04|H77YhAG+OIX#Eu<;Gj >$7M^deR%O&}(__bjQDOho3I*ye3HBPNPo^3`bmRC}?!FrtGNq0>9PqvZ?oHJ<5^Bl6`TOilxVWBE&BP{T2B2I_=lHC<@`i&|&)*6Dbx)m^{C>k|st5%Sy!d(EmgtY W2daV(^kW!t4Mt@3%O(`9GzpyrT^~t?#XhYBMg0`--0wVtLdK1RXP|}lbOKxblT#sFoQ>^kB8mCZ8wMpEQVyz(Rcd4X{U0HY$t=hV{-!^x*U2l8R*n3usskXBDNVko_&s+j&~e#-%%)QF`BwU(#f>kV@xv#E-#CkrQ}f jQUSD+wOted9s*){A>U2vl;taDNx05BM$wzotNc``|1q>5_F*QhrfO1o{9`13DVHX-VTE@{pn-t_;NdM8K2;Gj!Nn8)p)$4PI-Df >l+$lyC`=SR9^A8UXJ~*^hk;tp0alDhe*7#wcMwvvFOU3=90}%w{uoqUc%60um`^5n0uX8?TQCnQnTHYqQ3SY@#f>t3w-G}h1(?@ tOmQd?LD;-%8EX(!N9>XTvB?^emkyKn*kUM277MzCD}W}+~1eG4ENkWxPS1L3}!HzptHe$fz|_9oHxaVy9fE||KYUYd-TEl({E5w EXa`{JMO9IFh}?o+@{hZ9t^Ui^$Wj8rAIs(rHlPdM2ovO_|H@KaQM~3vETE0@8{k&`7d8A%F!2J$rT3=@6xHS;CFafeRWJ}*d@p6 C**U5o8ggQDi@GC0iY;>tELQ&Pu6k^Tl?6NJ_I9pmVQj)cIQisi*&}!cp 1#_$aY8{m$X-dmQxy)dRq>*#aU6eC5g2hk66>;m^7X5vU5eyK(=krOQVXEzlzlGX!0`xZG%AeX5=RG|NPwp=NTamlC_zIqSYPt3F (x=A;T(1OUUhjn_voshPds)65ZxneRB>{UX5=WNCwEWp5bm)ilnnw3U36C+GQQW-5H>hHlmf`Ch4JMP0>@;iQKT?MX*yrCWj8EAcHsMuuX969AV>M0>BgIXk4>2ZK(Jd E!^j%+49WseG^VB+KtCW4A+jYKAa)BZCQQjLQ1rD)`63l1m11;#u`p7e|0rU*VAc*pryJQ1ml6gRQGdOXQUM&s<(`~D4i|;0Ad$k Q^OLht=Gob^BP+(9_(bQPB@LM#4a=Xnp)m^6x|?Q@moHXz`zQ%FM(NN>;d@+>#%Y9nRH!^MTtna&Ys3?>#uE(b2iCI35RnYH7%KF -R#Wf1<53fQMUkpunuECC}YuW!fbk!eG-Cfd4Nzx&3`U~JRgGu)}LZjCP96R;nYvmNj34k`eDx4{xB^8`RHo=y3R3cd+_%g1@bpW d_%``I=TknL-A3K=f0a3j6#H*6O8S&^y+ZUI2S1SL!`AJnke$~|E=K&NtKkuUdHX)cILW0oI~aM1nhS)`y}<{id(c;HI%&4s7p93 Sy*55sh`=QL1Tgr5w!^|^9Llyaghv!Z#uygFB)=RLKg~gp#As^KQ59z8U-kgi`m6A-|Pe9YoTGV-4_}cG0XmW9ow7TfoK>N9vGi6 6uq8tR#?o~A?V4Ba@vDvmiQib?8e=z7xe_$H)D5Ee5-;2t82`B?}xbwD;Gn&1-=EjoLaze75^1o9cH$DD2LRb2$&cZc!KJk4LLLH OsBj5zv{fgdYt?tPEXWnPp~2*bYdJ>tn<*#tcO;>vvq4%B2iC(p~N>cHe-=z_)s9JtiRS_P0pG(N{mbLa`IlVgG-`md85IFDyeIW y&^0FcSGcZ14$U%;bMN}jjFw%&1#MXRJ;$%*&s%A_I0$&%|oeaQ%MVOh#$o3Sf@z g_M}Wf0MPu_x_n&V+*pd?1cw(%Cffe->gsb?;H+r4*_U>TGeDEaf;yf?nT)&ewO&tWLv+*BwIuy>98i4J6h+}e>Sq}EbxXqbw&i- wrJAbIey`4o4C0)$L}vC(#!bvQOUFDQ<;9f?o7Xm_yMTFmqoFN&Yt6-IIABHX%;l)kzSG5iM!j)9t3O58ymR8;gnpNEah@kH5v{e QzjER71K9F^rv%@i#Q_LCcHE#jzI#GRGSIgDij$ddwAeZ);3gf^P+DfIz_gep9t5hF?<&eE)28v)#7uC2yQYupQAGgbcFd&#$``) Q%fRC@ekYwqCoHn7$QHu#iCB^xq*3MEif(fh6u^iXHx&cUER|7S}MX|Yb$8Qny+XLAOFQuq?=ucc%>adA0pexLIXep_iF5CY1%Y3 4(U!hU2-eAD?jymRsDHjqy^2U791}oeiOXb-g>(NvWfPzclTHVy}M7*zheTNWSPkO3ZLUaS*#gdp8m!`cOv9+*Mc24A86+dywNZH xR7blMzXMCwd5!URdJ%7f<9Xq7dWsEclo%SF&sC^b#D;F_nYiu$e+eHHimvdvW$}VazZ3>b12Tx+np>v{!;JZ;xc9xk&Yyc2xV{L wXNMrIUC+(W&=%OZ{_s*jgccXh1ztxi}`YIfEWgTXv~pt{Qfii$d_Z{$zeRde;wx!5VW=NFAQ!Wc8IFQrjv{x?Dr{REUWpCJPl>V 0U{eZ;tNw(a3?5SZcfuLAtBjGiBB|wgT45tNNdKFiY8f@d_ry}V9JyPfC~DG*2JqrUeoeCVpk7tJ3SqPV25=v`<}D>;Lg((M8gWK ARw2Ju(FnfGT{;N)t#foD-_<2A*xC1UbcKXo=&H-4Ni3t__kk%;7iK%-Qhvgyl41xQe_5C@Y<%1-i~cfc#zC1I0`;N)&F!dX$-$BfrrW_eSjCKh3as^j?xdsPGl6C*jM$b11J3*aIso@^v{> `ErX3gG}PFVeQMx@-~(}NJNF<+VqP=|Ad;RhEU=}m5U@M&3j$_@h74W$n->7cLJbpcwf<$4KjhcS#7?d!n{fSjNSIzYoE_zNRqen OlMJ8M|iL7k0+T0~@^xdn7n`mUnxOXltHdL?o5^aJlGnC1=#S4*VmbDmxb_AGG7 Sg)n=M&Gp*EZ3`;NuRi@R_r+hw@V95I+|Zz`kA7iroBPeDGR^UA_^&A++^Co6A{F*1NJ4{_%YP$Dgd_Oq%jHp@i}T$WN)NKtg%R= -^vlo=zA}#8dzjXQgl?(cGP5gwtF_exb(~1%l?YOkelU*JCs3d=`4wcOpRN`-MNg2;3TDydEswzA(>_b%^Z7;k~Uh{j^}fxbaJl& Y+4|($bSz(8G8vCmn3u~8nhtKf^UhrAoOUkM^|)vRIfc37D3WU<04x!kf35hs>7w3jAZOnsttE3U5*4}CsazLe^N8i1?$|ysJVTpiZoeVZtZ4xksRkWEH4y~ rM(+0aNv3w!<*hI|M+A}82hty~`9+usBXdZ3U!e0r$sil??hil0?aWTGEC3Ial&=0u Ngi;12C0mCH$vm`Hr>A$tFc6yWkV+}M(G$#|P!dXNM*BQOH-1Z=sNcrXKjK?`P8`2*=Wz#E0O?xuvY`E;}0G{$Xkm9yZu^meUlC$QmDZrga=~fN%vdln^Ix1F##!6ofv7P1x hW3PbVb)-Xuk{*_F#xg~H{6t%TOIG4So*k>8cN+#Z%BY{M-?Y~O3PQTyp!S{dRToG%k?pS%?v}kMTto}wW@u`#da#t0uHlq!@L-E Y>x`7vAZmlB)#AVAlta@Qx&2+YdfYEzdm9)_`D{Vq5Iq>OiCvHXf*+$>PAA1+TZljH9GyMw0(Nu3_EC~Y=sn&KzalOD-!mCA)|b& fMQF*kE&N{bc^RChMyx8rGO-C!jbz&Gez%xsk78fLMOiIJg3>UrZz2!HQi&M_eiF(70erYHkssjT^hqq?b}R6O2}rQ?RG9mafpd! EGk@Zn1ho>=9DCXT4+Hqc2|+9jag=R+@_R|2k~H7!#INqqw&ta@SUc2F*GzLVRa>j-TpR7RaC<0y(aV;T>ytiBYwpEg-O`@({X3$ jQKPEY+CmYRb=+W_11l*maWjM;Q!#=Pt*0y01P@C4$I7HENsYhSvLpn_{hCB`>rh4?IzF$4s_2{{6q47%7UqCo}MiSSL{QjKSR1U IgQH*SPc>2LTGJUF?W6xLcF4tn2c7z3B$ff195r$1N@7>=o=vU*@_W-{39J5w1yVhW5V 7#I>F_%lP&_Jt5O!i)VqPpdIs%YGrdh3p52$m5U#rXx1UkXX{=truDq{}zuwSoe72|8nXkcip%JnHdR)88L!CeS3P!#_V~P6-dW4 `2w3JTSWBhD{u*_t4)*nr9shmqmAqT$s0kjVeU}^uZTD(wocy`>~7w8Rc+z|Jf}h*fwPV2-;!;K{Sj*zdx>w2Y@_93zPu*Qn+$Zz @O!<&_4|fU%sSeY1eY_fphqe9Sqg|IR ts<1Z6{r2$Gn$W>hoXJQD)fQGZn3)b#yEv{eS%zFZgHw^wd#NIQ*dBKmI%wxKiiDw5iwjKz=@xwJLbOE9!%g)Z2wMKB?9K$W1sW&8{$;+(#xt{Bf~HI-D=wo>>s FIyYD@9mzih|W9>A)K6k+b2(iLuM4R(#1)tawDq_5;N+77*Aq&A#CY~AQmGr(Gj$rgDIN7pU67DDM2)9kbJj0!G@$VfxjAZFVd=^ P4el-pU$ykPYovz$3_P(RuM{l*+gY?&S*CJmgapxv=|L_R5C3OQz!6NhrU!1+_2P4>U53sPjK=o86ZC=ow@xuLQ3X;5J#Gv)?o!_8e?& oq}PLXRVZ?fdGn6*CC@WE}22q&vw|(%Lp?C8VCM-cv}5}Tha&RprX9x{-Ip4!_TqFrQIy6Bq+sL@a6n`4svj;Bm=mI)>)M@9Q`BT rORt(!t6=dNK*SGeq4*s-&}|4XuK0O5hVI{h4k%4E~54m##90_Cq}YJXu=Ac;NOo#>92}&!i4coQcV|nsQ-f5t=U5;w8(R1s1?qW JXGU4;x-D!VIRmr*Ci3j>8H)ISPUlDeJ1BVa3TMwDY~Pn7EVQ4K)6AvP}9?oGMBbK-&C;%*$MY>xhvv5u3i-<8;Yfgk>i5C ?C2BVHg5S8yns-IY6*gF4$|1$ZUeM^jw(I9`$4sq1HVrWl)XQMzu!vPw}83STlfO^oaV8{uCr{Ze)k}W#bEUa(pAKP&nCdYJuQOl JY)@K#fUmpJS{$#_TE&H5Kbow2p;+W?l#V=xi4Pyc7^+8&;N0Dh9BR2Bmekcj!|f%x#W2#n)qmK4YD#~Q<0>@R){^qdw$R(+@DR% +yGA5NA)Ds)&p_dC&~Y$G6v0+b3c8rm+=rOup#Me&yhmpgl5RnJ%kbP+Vur391ZFAV@$WN;oE_GS+3~+Wm?G#heGJW#0W`bP+=41 AI*{7SdkGy97!NJX?4*1oV>W>Mw1sZgmQqBtN3=$qBYRrqu+S89Y5g9$9{{OCQ4bqr9g%4qZbIdaJSa9cr~L`9wxxBG-|T0U4W=Q vQ>i=gu`IJY_DeV`;4yEjrehvd`*P6AFD4Kp(&uy=>Iv)}jn7q+eV z5lw`@2|Y%xzk&&{Iia1*_T57lnubw?F_$`ddp&q%vvZFQZYlyIz9JNdOw=@AjR}LTo_Ayn+c~d>Uy0bW1oGK re}5J!=zY={gif8=&S{-6 YBmE6VF{kpUuXs;fagf4Z&2Pw=GQJ6t%}nQ!fV$#~q9^#WX3sIdGw70@N<4YvAHDQ*LO%Yl;OUT`8H-6z@{4ouO@~ Lfpc|sy}BV_Db7mv3h@=8BOBMb)9r;aWA+%;hO&MDHPHhF|YZTuy7SWeka|U{_nS>T}!E;)2=w_=!)>!TbsG%XwD^=7fqFJ$P3Vm E#KO5NfxL}wUh>hk+Xvb(ojg@vjUkXu;?W{fC}4Qug1kxMOg}cm9kKEV%8|mL~}wFr^yc3VICEb6$|0S;T%L9=w*Qba9!SexB^9( 4GV;xkSYZ_^RX|GyDm8!g1wBv&(2!>UwQ$be@w9MNel=lQ9tGn&!YJjr>>e=k!1zy@vA^<8?Mv@(oVKjPVr;yj7zw9o$7oEw}Ptt A9C$gLaX8+z=P{~vqVz((yH4bdvAqWtnDjrcb>;1mp8~WXSP}|%80(u8(MV&5V2QyrT6A`wPJY`3=U{r7T&sz?cLh>BV6y(JHJVS d&Lf%-``>F9Nyk?xw<6hZ4<)Sp|UE)F_5^rgrMVLO-geHE$*MaVfTH{Z${(`t`^=Vc+V9{y*^64@2A1#AY=(*K&&FlQy7OM2S#wq !7#*f-3`UED9N30*aC{(!_>p&Bh42v?_#%i`o`b{zX3x>j8QVD3^xM?zk+g;Z@d2f@)A)(ZuSaD2Fb6)Tnctjsjf#3yj#s5>t+2H _uLw3wMLPz)HA>AM$!hBfioc(@GVXK5yts#Ablhhr}HUd!TuwzD&mV`d|5;OQ1xt=WWMO rbVltww|fQYt|RIknCo(R{HVdPZLf-!3tr0hX+=Y^v&mUEz_st-D^4UOQ6F(v;nx(m5>k&EyztZ5=0MP>4M~V`L<|v>Naw wfJsOq@@)q>xc>5zTH{cUWOk{wF}iz+%ebtC=FEQV2eQn2V2{_N|wJR)m7-2lI3r09j->zoDLQA3yxrV(jnTb2#WSZ>l4N-o~&S@ czpt%z=f{mfOeVw*(RyZNgm7EP<4@j7TF#TvLW<0$U_co-^jj`zW!IH5+`qr;LGF{^qU2J{0EZnv>VpWfR54T-#h{Ou$`|F=NDjq VUlnzbmz4pg@v-{+FxXoEmFj3v#)F+%x}gy6e^69dcHjH2*jiXpS-mmB)PNfH*+C~fJ-AN&1{{3B_Qz6fm73g^@T-Ocac<5?#a&T DjbPbu&>odJJT1{-H_`~`(drO$nJE%u#qR04_RJg5`_S6nOXv?oAaEY4Jh3f!;AW&fcajCq`w3IKd05v(vQr`u)0&GLJzgnQa&C@ ?iE5ue_Iad_xnG`P*ory&45Cv4QyBHFoAiv(^GddO8&^zdg~k3W0Y_GBvFHJ`I@*+A(gl$W$#Y2=*wl36CR31p-lQ`-|Mb %>~kENh@UDF#oIx%2i0U3I#**)il-Fjju?h?m8b*J0z}z17|%m!THvY;U`@(|I8!-W)ZdS2-ghKjn!wAu@y;;JcTFK%CJhewq+tQGb0Kdb^xZI8Bz;CYkJ4=Ldn0{@JZyukN{ENxMnAj)lPCP^9gfl1w=j|pt~e7nSs L)BvYpqSGxPQqlE@^%hb*7PieCO8@b-)Y|RHg2Ld+Ud8TQchmFqsj@#G6)?x02m0x!g87p dT&>;l-DrOWZj8X-|j?CEQI(34Ft55aR-+sCtMzM2iM*)89rdb_#Ie5avBeJn*5!UezX`z7V9WB2|;^8ajS3ZnO{KtNAq*Ab}%Cd Rvm!-kIH3H&Af0uJ0c5iqO~w@hM{W3gZ&7ijT304?#ye!l#W7j;1M~b0}b{I^@2hCi#E}$FF)nDra@A*w3++0UuFr*q5h|d(=zr% xxVA-Po9T;E`-IQsd2{Gy0`LcvUew`yqnt0cV{8x>}fZ7e`E{V+zPorg7P_n#it(*zv`X&ai*!#dw93!|C}sVmzSNsa#pUN_#Pb1 KuJJoWI#%Qfe}vwU8KSyqKuWqo=XvP!b!~(EE!^zneRGkM)xX1r5q{H6GELD4Z5TqALguJREQx|vhur|cUFWXTUiH^_ve(^-jZK& )Uis4(Z!R>{tZR~EpL8v*}i!nVwZN5F8>ZEPQ`(bwc^l@T)_6UzJ0Ud^)SG1{bqR{xyVBGg;1RSww?I7{lLXr+hu3}{{6DHCI46S Qz({^_sdA$e4}?_oeYcBGEgmr*9Ae}*td0kJ3T120>R$D@#nXDKbsr5Zy?Y{Y&S`zC%Ey+g)I1=M&J*;RpJ#5L3B3xEv u((hLi~Ya^lz45qH|4hdU@@>zjhjv++>lXRlMF}iXhDJlu>dK9l47{-l}Y0yZr;8&XyJdy_O+R6Vgr*&m;Je6o9qn>*6DAxP2qygPaqtEOoQgHTv1WSXOGiDqO5_6Z}CKyZep%EOMNkA&kI1>%NSbjfE!Z^rr>tOQ~m~KAN&2@7jO}PToakI -V&hlPhNr%@g=-)qqIyP_jy1}(aZwziN#XoY*^P4~%3WG03%$70F3xNjJ885V$n1B?ra!PbIRG=Zo)qU%ajf^xKqQ_!;%_ uVhnI9};{G-5>@on9aN*TwWH7Vo7W(1W(jWv?^YAc53mO R31;zCz@Z=diWZH>es)fS{uIi2Fo@V5yU*);B+h* T@h1Wl|Y4@>{IrM`PIZ=q>N3Z^$D9sGPB2G#p$S=@Z(j)Y8r-U1b%IB6zl*W9tCl3vN4S`WAHH8k^tvKrMkc?pQ=go2rZ#k%!e*z{&ENEX2Di*UiJ25e(V=7c7F5 I#CiqI9zpH)qr71YDrUyUlFT^Vm0C4iIFHRp=naI5uej8)4Ow7UEb-+Qqua}NqXRXNwdpKf?aTZlYo#kai^p>LQ^9w$g?SFr^Q+wg`9~yeIqIH%x<{a+dlnw~PM{n{!(GC<$_?rgjr=Q5&UMqJuOl0b)&c*86@4g#A_(Tp6B3 k`HAp%5_ui#g2{sH>;VFZOSvm==*}tgg3>PolCSN}P!11a8Jc>-{I6xq$Ix6$?EqT*(~mzx 2Y6M~<&3s+CLAGsTWV!RW)4vxn*-7l$%98~;y(Qm;gZlCA$j~^tESNjd{#^9t7D+7wP43m92!t(i8;&5DTT^>Na6@gJLOH$-MJ)v lGJ%NzZi<%B676mtgISTIj7TVyaZE@wABCh$K_&%Lwnd|=CKlfu+fkZ%k{3b%e(kbTMQc|0fo+dP$KwNjpwm{Jv%%)e(8ihiK{whm3!uljpTYLNxdMgLhJ&kvr*NVv_CLiN=2cK7E_gYk(4i&Qy2-9U`4oQ{s6pS+zwR|F=lG%bxLHM;imdh _8Bo8qDEADY0DLs-Yk)<;I&g%ic&mU+lI1L6XVXE)YY2(!)R~8Z>op9C=|C#~uFKr~-~aaCl%~yc Vl(Z=bu}qyV~CR0ta%?|YdJUsVBYRv*!2pMN<27`7Zvd=dI9<8m!FFQ(Wyk8c{miD b;tI*YNpJj&@S@UvMvApe{DDa{y)=lfNK(4Kj)&&DTy6$xoM$m#iEEAA~#GRatS=nz}q?=`X3Cq>uAx;EALXe^)bw~;8WyiWR@RprN=sn!k@AySx8sQBGE~Vo`oaegbe0fAN(Z>zRWnep{)Vv46U(X7Rna{^L&z5V;9ugqGLckiYlaXYD1?Xe>mE Et4TJq3d>$IkXo%aA7Hzw~BhhlH>Z}w{Y)?!sM4HE)JRKBhF;-g7V^WJfFhGy^}&J??|NlN}OP;3+o^>Zb0i7voD1UFA|QxyfIof b5Cl)asMb#7O*khw(F4L!|E42e&u)mBe4m91WuVH8$-pL616#HxsDq-9VOhkRNcH084ruo+pzJ-9UXi-1bII|3z(-jFz;|CP@vxN 7f6~6ZgFq8jG0hZq)8>#Xp~USqZ7Dcw1BWy@f#I+9kihB#l#ZHZUml3!epGa?tdXd^iYK)uMyUfhCCqe92(3iI-GNn+{gvmw1v^3 +yrwkRdyM)qDev2HVy=iO3P?%#kFje^YPNZtLz^c=92xWE426eNL2YI7Lns9QJtBaLAuaZ`BM6okZa9Idc*)8~hrF0}@V5ota2jpHiK)$xVZs2Lx0xm?#U~zvm_Uj5VFMv!H}>ibwHCi5ly3vf$GveaByhOfe&?P7DfY rR+tV5<$0tYL(glKo;G9QI0CV@?#u-KM_)5Y(k##9UI_O-)HJ-npbaiztoQ;(K_VJj|5DLwL}9&{u)ZwU)Mje#OLjrd-93qezKRb $kW^j;qQp47P9eQK?#?renn}ECY>??pw3$9eK{{@@PM& >M9fpKz<`v50!ABGHHy1HzWmxu*o%?Yc;9;0NT>XXe2_(=!wN2lo{-SgF`c-%MDJ-G>WBJ8Z`lR&X@B`c0&tOXv(}}>LKTJnmUiD (VpP3D7k*+{|XFjOOkb-qSnIrcKqt-dMbEh$-4mF(hQn*&KR`EoHIv+@sbCrVxW#Zs;oee*z>9*c_tL7GxHyi1bnTGN5K ;iCdOXotl{CO8$S43Qv7sbe#x4ErOd;fI*%kS=e`Hx>_XOimY=C(D*-I~oa2VJYS$-=BsPMg!E5dI@%S&&)mo4H5?oL0Fmou(GvudseX&qA3t@uD$ av@8EH0P7)B8J$g>#CY6jrp~%{Orn6V7spnv2isbl&=-4SzgOYWW0=pGs!#5BrbJe@eB@kcD~V}z)Z__VQsvxJhqnu~sHtC%` ePR3(Y-0ZKembw-mp}G)fA~-=s-j;0xaa;4P)h>@6aWAK007yTI!gcm0000000000000&M003-nV_|G%FK%uxOhaEyMN?BjM@3UF P)h>@6aWAK2mslbI!mS5s)*HG0061>001ul003-nV_|G%FK%uxOhaEyMN?BjM@3UFa$#_3WG!%LZ**@hWN&wFY;R#?WpXZUZ^eBH oE%lPcTL3?u7RJdMD(6X(!b4;aSvnf;-PbJ6Gs?jUWw$b*#d(2!5Q~Jqzu*mmm#^^)kWT2u|7=`S#rz(`gt+IcM<$K !4D9;kKlU={+8goxg9&BU2p7+{=8=w)c28H@IGZ1q~BiQF1ui!7VUy^J%#%c{2;+P!S@h6hTuDSJ~jSSegDBO=;sBypdUXcNL{dg Pw*W)f8Cb#euBAfjNeY(Xvgl|sQ;_oC~vqM>8k|a#^bJVf6aGLH|F7lZnWo2O@F?Ya|yx!Ab72ocOSvG6MRI|J>HFRc}C%1v>olU F>e1c8|8m?Hu7yV8})8WkkHiXA@~J?b7!Oc5rx5Ql)wLM%*Vk5-$(FUv(e5oW@DVrn~i!enT>J1S?hgZHszAGN&W>_a4jI$ob}478POLJ{S1%-g%Zao#58<(5^iRcJX)g01Hn58&YF*O ?^$433%FeiFn%i+08a-NpuRf69KmldKtFCF_(_6yFF<+EFF?OuUV!oZ8^MPOer7k6_u6h4*MAfIBEfep1pZ842>j~ScV{8Wtu918 -&~0NCoKd%oVgI=eBnZ@^Pg(I-)Q`c3o+k+U5NVLv53|z_iGX6V==)V?$;vZKX(zv@AgIL=fjIIu76sD`JcELbYUBXa|nKq;A(=4 xE_MbIeZDN0bV~#FiwvwK{@YUYFRrHoUs(;MN84%{gJMd!b-SIwacg)W!f;1FXUf(a@9rJPB?r6`?cgH&V#qOy0$=%WK KktryylWZe&TTD=Q~$o9DcnL?R|D7+WYQ35WnLdC~w{#sBh&SpxeWHV4M$Ec$&f=?*Tl% V-MiR6I#yuR{?&8;3R?_t1xeUt1yrIu0lT#ScUmGjNtaXzE*(`-M9+#@Vix*zn4~N|1|$Q_eA&y_eB0r?TLI_?Fsyuw6zPLU|wG3-4R)g?{JuLi={!3-n?BUMN2#_;#X$-`fl0cluX>$2WWx<95qe(ccHZihTe0D$1R-H|W6hy^(I` y%D~2Z}fAoy;1L=hDUn?{|{Dp!rs8|AMOo2y_+c65N{L_X+OB ^STe_ZPIGc!AM!5-bor+5vrfmEcbZP8~o$o*_smWVH>VJ$nvfe4IhxnKy{_ aL^#e`HVr(!CMEB|A|42(?17+pC8Mkzqvf{afdwSd#;A}=D{CU<7Ab&40g({y(Gn|Lp>Aw;aNF?MU!w!r#>d51{wo(`0N*&>aRp {?0J^d(klFY;MWOm@X(JPM-V@E1o*bch|>KLlv5Z1e(gJg@jQ71{raJ%KVRV`Barv5(Dw&NFmAsd!92b& g7*G>1ncmFMd0c5BIdofi198IF%SC}k^hh)+H(TIrx@P}dW=scth?t+7|+*Az`M3G`tzPL>iJX|__k9S{a;xIURKMf@9;9}`JU!G zl{D~TL#`fT?U@M%}4ufAM^8Nec#JR|Mu1QgMF-%?+~2GXC5<((ng|Fp*Q;PCqv5%6+~zV8r0p6HKIe>FlskBrdnUqxu|?<3&r-!%W*YM7S~)qo#%4dd8Z!}#o?aCr^* I#NTvY7OIZPz`u~w1%%EcnrbQYLK(H9wlDD=|_?O#!>L^+eRT5{B0Ec{!42JH)#DvYcNjF?g#vOZyn`sS4TU$>sSxHb@a=xLk{?Q 9rR^m9qay2b+qpb`;+cUFt}6}Sbh-3!#xQ7{oX;~KQ|tP_3ZBt3y=ZBDg!x +aYM*PY*%8KR*QX`p6*|r#~J7`ti3zFwPUc0eR~~-+*0UH9=a6)^`c+!|ghh@Py`T=upgS{V>eS*AD|epMIFm$6?T?{zULAJkN(i |EU~~@x1zQ$P@oQ9PRkx5rAJh0(iR15tz5#j==aiM}XcOrQzohB+=Bm;RxXWmPaCd>XD#hbC1M2T1}8dLTe4dBYEDA#QI!$6xQdF N1^>^9ffhc;V6v5<437|;wY@A4%g*{==g&9+w}D{2Pu2z5ChGz^mUJjrRTfX!P@=$Dq8=AA|YX{ut1mZi2J~ toZ~mMWdUj#o#kd~5l$+5tnt&c;yPC5?bc*=30S2rD}dggJc_wM7+uLqAq`ySEoXEfal 8vfdG=oD#+tOFhGU59k}bx0SiL;i29LwU!o!#say9q@JiI;^)_)?xj;n>uqm;}ya6jE~=DNw1MBJDGf>ZOw4B!!{!7!n<4nANBi8C>df7J5cvmWU`v>y2X@%6y3&#YHF*m~7Z)+7Dg_2}=C_2|dS^}rif%UPrFAccpo $9NyR9^-cQdeD(8*JIvqQ+S`&``CK4_sR9JJN{)o`2F9s-ic?S9l5hG4qrYC<;^?`?OAk|>Sqd_v(Ucbvrzy3XQ{pHEX>bIXJOvX )9`E0!noaX7RKWj1kWS*&{?pv97Iay7Syoo34WB|oj;&4rSPYIi1EMqY~af~&cV9){5crEJ@8NSG-#l>+^5xD2 -tR{6B_7{%(T+LiL9W>CJmfq6JjjiwoCkcr>O9bkhtI<}w4D#W_kr_~etU&Goez0sF2Uys*3U=#1};$f{sPD)2VbE33KwAA-+uw{ ?avorU2l0I#%acdXz#oWRerrt?UENluKMPMnBNVWexs(p_d=E1FU0zL`a<-_z6kcMoh}0X`NlQ2QGmevEUMwgDwG{eEkxP$G0xQIz96e(50&sK7I-89PhXk<300I^mDgM(a+@y olDW*@}=O{`(KLwtkv)%E(Ly`cq!)j>`Q@{7bv{`QjF*Qmx7MHbSdUz!euDu3zuR3J1#>z7hZ;O8r1g#FGD*{x(xEh`pZC%Ub+nR {pB*u!#^*>I(pmXDu-RJa@gglXYS>Y^Os(Z_O81e>tQ{?AMkp;9P;g9KZafXl^+9NKKm1_-&sEaof`QG@c-DKK<~TuC$I~D_6q2a (G|esE3d$M`t22{|39x(z2-{vf0rxKUgt{8=e}2>edk_@aeMYkjMv|yb9(1l)x&&o#)m>>9Px >HFX{z~j<2uqOuBU>%)y4a&LU8t}E3t^wcN@>;B?dDo)+1FuDSN9g;yYk{ZV)9|ye1-@N;E!uwYvx4{G+c!zrS-G#^L+dsh#3FrOR60EeapH4(tBe>oERrzaH!HQ`ZB3mnrnG$9g#Cdf?#?uE#pO_j-)e{nw-X UtN!O|Mq&+|E$KpbUoJlpRb49{>d9qZ~X@FtMA?*qJnkm4Z!2B8-a)4x)FGEFTuMA{`*GY%Uw5NTpznh?Qb{1&hzq3z?W4w!;XK- &1nCejlctEBgXCAjmUq=M&RMq8&S`r8-c&?y#?*-xCMB)+bt+(e+qwr_9K(2aF-~W0G@a-M90)Mx>74x>$ t!PK*tr({rZpFCmbSuWU=T^+;yjwA@eYc{&d)$h0om;U!{aaD~p&Ea@rawjVpLr|r=fYco4-aZPp4D`(-->zvyVg7HHl*ABHsHzJ +c57dZ-YE@=xvzKlW#-58wnmjeEcs2Nrkn-+rel5c02gVEYHa?6?#2_vJg$uc14ES2ayvzZ2to(4Cmi!|qf)NYh__zS%6`3vaD-~R>H=?CsZJN)}FFNfcUdM~{X{rVNbJsFSgQ@hmt80X&mf!{0c2c2{7M|lU|5BtFr_k*5n`vB4{cmVzD e*pMWcmU-c@&NGUTMqy~PJ00T-0%R#{W(ql&j*0FAAJ!0{ltUdXWKuB`bQo_yN@O~Oz^S?G0&fT2=sQxhtQ6F9s(YC522j;LzthF 9s-_S@esV;7>S6Sw<6(@;&JQEqDG#GRXFrT`e)2H-b-l*l@i6e>p@)Izzj+wr{_?|^w|D*$c>L*Ks-5JQDv$mW HvbTsJ-je0kPHzdnxoKJx_dW9uhiH(K!o %DeXo)c4{OkYC>SB<5r1C(+&|PXfP>coKdympuu)?LVJ{+%xC5SQlpy{0_nQJ_Wh=`%j_Yk3FUG-qV=BsZV1*x}QdQE1t&qpY=5G @%*RJuG^nRJAU`H+E1PaUi>$~6$IO#LHnF%un%+cGib*ren-p%?(Z?r&hHVwpTgq_evRM-1P|f%`~l;3+#f)XZ&CQnA23gEe*yGy ;tSBTc6tHzR9`^5ZhrxI^Q#xI&L4jP>*6CXB7Ex?k*@Patn-~-MEm!85%luV7tznNUj!as@*>vLjW4QS6v1y0ypP~2g8eT+zWC8g *ysQFA3?_s{Uhev3g+#5uV7uB{tEJ+r|_~@fEU+j{Lfzjzkg7}fBOpX?3Gs_r%!kl {ru>w7{Bdb1wJl+73ubU72|p6tH^)qt0?z^S212!XufM-1%5pCD*V^B`V;msP9k_J!O#5}{lE6lkh3Pe20l}G4dtzS4dZ(9Yv8{> cn#&B`x@rsVujaf_}vO0cn#z8h{7jd!#q5v<-Dxne|`<)_IHi{_iO0SyIxoN|2oor;&r66^?l;&n7&)ZeI4~Y_&WOc*z2Ij&%F*k;9pwrHgBjsG3<>ZkSw#%ombAN&UJ>8Ll*u9Mz?{pL&jAN~DU;Z9V@ JbK=Wesk$}2K`P(loio)Z33Q8vas%+*SP=G@T(}zRDGVTWp3YwwX{*+f3C1V={`u$lL`8oXRr-;%73!IWr0qHZLs6qqIm;N&o)w~ Kl^F;Kk0YC1o$@XU?qQbh3tb6=<`3@u($Jfg2&MBAuZ!zg3GCl9}=8J@Ig&~iiNRcKLw_N6Dj^PZSW7hm&c6Kmg)I31ka}T;|QKe @Kx>?{d%I=%m?Es2}NeWdqGEzsJTZJ>F~S0_%uyf36MA_-!&x_fI6YsfW%befH|h6Y`YqNv SRb0C@gLCfoYMyXBK~`<4Yp_gV;=T5u8V&APr#Zse@u5rHUHrgfQPT8`mu#RI}?(ysay}eA4R{L==m=CJ*IJOsl03pxJ#cOr|{2e 9Lpfzr5~w%;#YX6hBJ>Iq%uitv)(oVH1k}I>(Fvur1xz#tefB!^m`Z27yXWEgPg;EkJ9rrZF8rlCw12PLmO<-ynnZ~hLu!(I*ly_@or h--b4;NAp_THcPSc3!~iRl`|^*s~2fT>Avbmb{P1y!?$e?9H>jFhuZLg8NV!QthqJw?S?uF~pip&(kUV!Zzrz{P#(1&o-&PMNGp} ?`&6PUF`Gv&iGyMb-dXGHCU_{fncy=NcdDi(vB;{o!IyD=dj1l{-$~E!XC6lHyVCpV^gNSbZUSV|Gut4OA5HJ) 6THWQO@Qq+U)TD0&vTX5u{(toc>W1KLGaye@D=%H8+;2$C9*zZc#1;S;Yg*lwx>Lwps?T3&$X~OB;%4A6ZW$pwaz+-(jKq*Z>8S` dj2K-zNcZ=w?S6V>-%n+|A!WQZtk|ATYk%eOnVNc8|A)o-Bk7$nWkx8QoF2v3o@_yWB-BqlLu|U!~_yYrfqz&yxiIq0g*4y+F@>^jo9pe#c`#8$PFy_1kyq^FEaBKKgw^)4fmOb6VdXsr*~g ^Hl`D)&`%J&(r&P1m|d)0|}03KK31D`&NAd>})9=6rT9W=dnA=P7+qFSYn%)LI^JR_Sf#Scx>rBfy#>j)*UVZMRxEoVtl8P@rBR}KuPSt&_KJP;CYWgjv {M%^Qu9}8zE$mOwLE*>J?;4Fij(%&kz8+2cZHoIV!3PQM#%qgyx6zMOM{7$S3;Ml8zZvxNDDQ81-4cAKmU9CAs``A7)^i<~VZjHc D>c{eqGwWltxkdgrFmznU$3^oM#6tbGW~CZ4$psV!)AT?D-?FNhJBFbWcr=ObW7`4(1!hk_vkzC$?ZX5OSPV@==TME{!SatoblfZ N`DZCx7(?|1-?D#gsxo~vK_x}SA)tx$t{N+wqplw-u4D7zP-jPm29V4b)CR=B0Cy(?SV=ZRmz-;-`043zOp7$E`@l5PUQIod$_X3 E_2~-5L5yxwpt0IkTV9Z?F4Sl-nHZn7C9+Z=0$d;>iQCI&ygI>kn3He&lkG2i&1b;C9&g S|BZ=E)P+RG$&I&mF1TzPCjRM`;^S_3$7gn9>J2!oebR2^|>Z{jT87(mKoDQFBqgGIzld|7;?N)jcd)+;P`op8z?!0#pX<9YNZ{z fmf-8CV!Z-S5;~>p){#Hq&%M7?%{gX4N9J0q*1M8>)^4bF{dItDxP|qcSpTJu85n(VKjA4!3~n4ol;n#nw?;9SV}h&S_^r=n#M^} 4pjEzLOHrrSwjO_a)%;=KrQB}acX%wXAaC-=K4WNm5(w^eI%?7>>dOBQju<`_ZRc>)T&wq>zXp#y^XwJK%G2bF3kH^(l!eywZlZcdz>r)s8z _Qc6`Dr-s@hjdU-OfvUN!P6K9$i)DO_5^ywXsCpzkz_+Qv3- (-C8aDo>F#jMS=1_N9!&~~55j1*7rERurYqcxIK*lgW*&FK`5Ms~3eu+}(J(!FWg-eZ%xef|Bd17IgpkLCuU2FrZV?Be!yQ_? 1WxCfh;vPE&NW?gao3v~#H|cn!r43r>Qg#lnO`b?G)!ft@zR7%ob1=iL_r6s;(9|&oY=3-Wm+MDW|YIm;U6ne%en9?s|Se?1rDd! 6;B8Tx`v7g{Ja{I+8Et~Cj?iS5^$)H1PvVZ@~#A~kOxcpI^YJ4P0U8%F}+gK@v>-~QR)+~R?tui9vpTDi`2^@ri`g>zJ+W;6TE!h W$f1nDyr(ptO%-L=%itxx4%ov)fKEKfSM#US=wRb1W{`BxqjX(JrEfKJM3wK{rqnDDL*UWiI>JS#Xk;;mqrRHrzt9OV2qS`BLvVh Q9d_M3ok!Ko=cTMS?@Fm#Mb>vgyk-gM8hP*P_0yA$Q>ls??g0sp*5*{pi+x+xg0%JtEIX%X;;S|bV~$F#LlcqJr#fJh?q)|sJHEK V&b+QEwF;)`6ikhwpsBUsHw_c7^-wM5L9^alPpyToH9vQ1A!BG+`9R0sY?HQh2awYBDlD0*hgLb}tbLYf^9E4w3NY^OE3~Q5K40&N{>^Q;`)QS-HowYUZw8mDcQ>53L*K*N_Nsh80av7BNA>Q~Xb~&tRs$EAmb=xNF4$3?#k5RudFsa?^t(H^`d=#;BcoP`tLL<-Rm*k$^UHh-fIuVWmp2(^e$zZZ&HqQgqFn %2BgKcAM$V>KFN+M%eSi+R%_U=n)gAzC;ewOUC#*i6uTQb`oEB)LDAV*}XCykcU`>NCdQs2nAto=2UMMx1^^c!qggvilq`gU>=vG GA=EpHN#ZHs6hxb0X*$Be`juKi-JPJ5GiJGn1%ijvT{belB_ca0{JZ%lI$g~=%yr2BbNDu9htnmsA|=`>2)lKX5}|icz>!L)Hcph O;!U`H_A`{54fzukuZ{{AuBjRp2)CJ6dD5=NN$?+&1r5Bk)_;b4@Fa#GQ+Ve_nbS_Sd9nj7r6V@JVKlfl4m0st6?G}Qf<+7X$=Mi $0r(}|GzZ`<4=tli8=duL;aOX$sTrCgHv5H-O(`wbw=ILj=( x}FRuHFTH>a9vhiK#R6avNCaY?gN@>=w-}=yEqg=0x!8KA>P4+@eD!DqE$>4%=i4LOUfq!ipG;jGR1Y^5*qcvK~|r9 +jWTKGiB?xhiJqN+3A+?r?nX}a~xCeA(0`R!d;Cej2vav=|Cl7$neL=-)?p1^ZYaVE^!;zmpT=f*kHi**L=dUJj-*EP6Q}U!$>Pk Qg~xd%BuO^zBQt5B)~-85Gep0$~>c6j0sL6@sK9zg~P50#?Zh>pC*;xg#{!c6=}eyo^7oX6Y0@F22RU?Olebg0fWgx=S(Fmq=&UZ Dl{a*YELeZwB%3eAl%Jo73IVxLJ}}*)>C2Gm?FBQinEhxK&Mbwh@aEXR$;b-QPp>WwGmH56bgb$Q$kj~%f#eMLdSu^v>ZW|^HQ3f _X=JV;xWb(LfI;nl?@xG5V!3;|;$CdrD4A%;gWY&dd-@^P9@(R(^+4W=vNf%Moo l#9Dn@vYfxjaps>q@II5N!d!Zn5Wt)jargY%BA4X<~612hHM5jLZyjUOw?B-;faq;Jb7!jN2A7+W7pp06izg{%i5Kw3C%q*2=g2- p-=;Az9UP4HM2O5$rR@(4c1D+pLn%GJ0r?fbmM2nVaup(yC!^3L=>V}Dlp3Q63&f!?i#9SrehBiPugj#iQ!hWSn`=U)tN;V@RAk^ xm;L&D7D6cP9qJBQd~gjChIbpP!S!&bRp>?NVS#(wJH)&%laa!7jH}e8gj(#5uP%{j1b(yl&CC+3X+9a^{SGE#vs7|w6d^(^YPjW HD)l5$v4EL>8`FVaK<&m9{0M@rl!JOT9xGFx%T!YmB{U~%{;NC!pPi$ry{&iGis5N79#(&njGIZswryEwP;wDU4(CjN5s}QM=MB? cTP_t&|s1JRd#}+2!y^oQD0+YZJ5!Vg$kxh(n=42u*I_@E$-#MKZtesWF3j|NXB$`F!TIu;*?;hn`AA9iG# 4K2rF;yg(Im&;6Nz=rshWD;+{D|u1fYKdjBHCU)riWCZoWO9}y5$ZKYlCV|K`G?r($ho#7B614N&!ERFgU<;1f;Bo7b*W|PadvU33J0K`daguS_}2lAZ|}Q2s8&wA>#zYICKGS!^F=>&f&VD8`W0ji3 E?|?L4ZBZ6RHoJ>SoGQ?M;&-Zy>+WBrTT-Ok>4vmt%d;>R9IKfGbtj}tH)fyXbtv2UG+jGh=g`MZp_1b5~gFR`2oQ0<28>Y^3F8C V44Y{nV{8E^l20TduLgAulz0Qe2?{kaeS?;TRd>)Es!J!3 pLGOYp@v8YhEdTl=L-9ewG@-&ymjMIpJ=$DP!MYn;nMN3Le27?e8Ac%kW2IKkW(u~DvOAg!Zcg7>{L6ns9d(GFb8NF82W9IUGo)t svT4)A*oM6u6?|`SkFjuU(&rP#n6ig}FY@YS`MII0YAq;ic0H2#EmXp6#ZM1JlPEH#j>uEVrp(NE ^Q2=pg5=H`uQA=ARvlLJ&`btv0#B_mD(-JaUezLEOC=O)wz$VZJF3NA3Yxa9G1bTMbJdcUSUZ#CD^%8IoNe9dB%8ET2aY$NNP5}i kmZu>h6u)kCww8^qSS3wu4G_Loj_zaRTL#0)Xb<&alJfFer2@`)oMz&I^Id)0?e*RdK5Q5i*D%|+kUnTN7j3yv!tH01+C`ZrZcBf 7*js>D#XUUtIC$Sbb4X=jjS~L-et`(P6@IZo26A02{Qt3JK1v#%}RnH!qAK|TZ@BP4&gu;;p1SYJTZfA6)4JoNO}!P%}%oJNZYrt b3X}N_o2Sd=eF`FruX%E`(+GFm1JGKITHkaMRuaXD3BF3C5&U~X+MXBJQ|z*SbrlxEFe~gM%j~LC|TsgPO|I59gy-GGG%ntSRX+m >3|v-Xu{^~SFMCBC<^|k#@sx0S#y^z>Y205nj7!>iF!Y11ZR;TiA{|%I;0a->oFbAL_m)>QFfjLoWZCP)Vqw~Bb7Mrgf49;38@5z 0;Kqdk(xw?XjN#7JaIA}6G6YedKi(OF35TyS2bVEUJ;g@KQaU5mG{WsAWqGme*Jqt@&nSbD(Zyp$=nu@q)C)fs^OGa+&Qrm3U_$?+uCRI`VW2pbYXdl=P1?)*)aHxTz-U AYim(i!uwgG-Lyedp!PrUjAcIP+fQM4k3g%uo_MMK{qxz3AyA;Y;vlz|+ wID7nU;=FSQl>s^Ld_F`GTlxH#XPfbq+^jX0nJOcl*S8_y4h;20(05%{FMEjJ(Nr~NT6vu5}FX%yaQ@4^;uTu)xtrtmr+TAc)M4K eZ+dFt%2qCKdW`fNaL$M6ULO+|^jHQEZ-QxY` ig40umq!+BYLPRia8QCVlE^lX?%d_QP&^l6WloL1G%X$KI;LB7PGS)@vOpLYla*dmB(=k63=|#;y%&jI{L5%ChNuK6jy+4}@dl|o RjhvT0;kzp+}|4uQ<}I%LPB9K0+d7=NYj(e4N_Ip9;p?HCe0f%JVT1)o)C4-wYM)1UEWeinaX6RlPFr*ZM7pH1WY*_skfDYd73oK G}Cl9FY*fYN6ZS`9V=sDSWp&s!Sq%i9QX*GO8I!P#->kd1hcLj$s@w`LSy_(6l#;Fz((e%QYm##&uKmC0+_984E=fHWUZ8>mjycAw{^0Hm{_-_dT4?VSeuTl)}vu9 m=r1=l~Jce$j~5>$8vRIWvj4-D>e$q6BB=HA@6Pzt*Mrrx@`Eju#PWsNO_xXSfRXamwDSh^G1s^k0%MW7J&yZo;@{m2Q6Y8ix=Cm zZ|{v^vHj!Rw>{Irn?Sdw;vDDVxm^WE(VFRhQe+a>&mqjd*Ps4DmlK(4mgX`WP@#f8UmuT8P1@Kd0Wb!>tr~G&h<9*uu_d2vIu!er+_vHXKTv@QFl~-;Mk`((?Hq7P;Pxsh7jYVLl4uj-oFTGXW7TYDccOa35c#=tx!u{x GqiQi?q(NrYObsDu3z5_M}TA}iaIO4*^3CX_v0lM1s(||u$a*t6q$>tUpt0Z1>~4Tvn-vOi8xKd!~bu#iRy+9Lz)dxjg~Yov-(9k;8Y9PoZ`DAOfC&*BDj9>Zj9ezeRwG^PW&(ZFm}h} DWiJvc8DW-rrIN|rOau?;lb+d?w@b5^wdTF)2v#gEfH=(Fo+%DyqM^~&#=iZgMek~8`AJ<&&hjH#UzUNj%=e9(U@dXB>O$t9Wul= NX=autYvbiG$JFU-3J*&;rkJ3W#?jgY5c>+?CDhyKq@4CUNt~JEbZL2?Q+kl`IDSN=0b6}l`e>?{elO>x 7Du)Y4K2M~#Nuem`zK0g)En2C1F I3Zppr0i8SmH2_gTuqLs#jgFz#z>kI;!<|%P}?0?HKrsb7=~x;Gkl;-L<}fzG$@niFo@rw| +?)z*YYb%H6o(lr0W8I#waguKJ>Kk2EJPeuDTw=P%EP3qy&bf%t9{~Ra~!0-9eYF^W=?~&w|Cd_UWJ1ke&7({I2B&ULR$_!sGC^WcDTy4%kCB*ZVD$}6Kp5|d PYhEu#U^4>lS;!Hi9hj{;W9Sebq=P^#F~M$`uZ$BpI|o~DHtPo>@Anp>A7DLvsu|wMo%`C`s3J2;TYbqJ8ZmUS*RGJnnAG*mg+L& 0n1Cq%9TW^TsCMM$&=60q*584(T9VmYU7lyB4mvm*;vCzHeiP~;k>yjr=vs0w#XZ0N25OMgAwL;nP;?HdBGwTVN7Hnky)NPyg>pQ BdL>iiq!5TaiJ8{5Zt`gicJBb$Gp76!4>u+-UBnI3DPdFyvM+UL36=q2~{FY0!nTaNsV~tn82f{P&-_oD>j_ul{ezl3eneW`|V?^ dVDBaj9py_jJ&E$p7BuRK#r<$^>8P*`n>((vWs3-{!18WUnL0Y9h|h3mlY2qXF_u0^CK{Q2@5nLIx|1tRmSJbMw&NNH+nClTOiDE IEt!a*VL(N)~w0p`LuAU?hg*R%q`L$!)J(m=e@r{Xh!opfrX_Gms07*cT!f4Z;+Q)?bsSmzF%>;F_Ia44+ )y4jHz7kDIXVL9tmQjpbN7`qy2`N)~tFi|j=fvro*7@nFA-mY5QMspnMXEV~Z40^0o9zn~OpRDiQoB*N?JzC=R@- jn2*HpPr2e!v1@!Z2%YKrfggOeYLQjOPrn*TLk3GI7PS(Td$<|Y7^sJnvS2?gnn0H;|=ujc3@FH$zXY2zjD_V{a)r`x#TXL$Q oPvnf@CHAPHVrw+VI-H(%#a+)Y8Njec4NRXoO&y6DI@1Z$+kOhOL&#Mo@L_}mw5N7&J!b>oaw6g;4nHAGt@N=2hC)zLGkhxJ-QP6 I+$E`rIM~6~XPWx59I^E)BEQKJOSyltWz%p0t+v7^o^(mV8#-n-IoS4sZH_Q8Gi2OYoz0K~AuFZ#X_AvR?YqLahk2go*W8?K1U+d;(xtpk Qdp+v=BTIS3R41WY|BrKUu-Er@U$sm{LELZ^z)`ueAF&(tl2xwxI^Ntp&nRtOf4bOP>Xim7HcpErg>ga|&R{HAdY$J3?o tfO@cuZaFi)0S&TeC9$HKG8%f$QUNEGNZ=5E^#er-5owT*UFVx{2{6&8hLzFFMvECr&K#)#})V|O|Iyk4~sf1Ba{b>avh%%of$>5 `i8wBBCGVoG>SuZje-&aif%oe0-K>I+)|s02swKtj#DO0XmVhRS)e%{rOJuiCKOVa3@W9_e~cHy#*+&}!hXX2R83gI_8-;No%LSm XFUQJgfRDE5mAockdPSf!VxE{1=0?dXoiL|0=yzjN^;0GCKs_3TA^`SX6jvGwK+_Teo$9k`0_UtA?u*on~H}byYK#Ha<)Dvn38mw OG;^BR6whvtSpIS&e*jmg@4H{6s8vqIK8b5?hI%$MM_|u02{$C^&GX3)xj6#2B7_L{rQvf0y?naZ#EhYy85fUDMC+lC>}yMnHJ2p9RR;NtB==UdTvMRBurXm1Po@>(Vb$nh 8EZrF2EDaHIh~wbws3n6EU)oqcJ|e5RU>q~&1|G-+O9^hI4R;WvvZv}=cvbgR*EVjmWg<0GbWyuph10u*$EeBl3W*Lw}Ha6MXjQ| R9yJ-#wefAL8(|z+s3p!bt6S`){jaeMJ@DnK^nV})Trg~E*jDPp=b>^3>&L;SenLE&r&Lry4u=9HD3sekXTc2WNrwGk5?Jb!T5ah P_w^#;;qb!y~%Y|ix(eDz49vM(cj=?&rMU0yksO(j2eZ>Zu3f4EOC}f1UPVPG#2rJlgaLHfpV&smwPTw}GN+36vzKG67Yo7=v*46#9ppwP;AXFQZx45^hOkJwj=as!*-s+e8?Zmy6^w)}>jfP{*`8)d2!S1Y1( V3ucgqXk=KA(No=KB{cKIOSO6PVDnr2X3<%talwpm1^d)+U(9|(xTAg9>VuEWx+sMap&XPa>6o^UO32i5b;V}Y9TqKIz6eJcf#Qr PN-KXnQI3^^_Md|0<*!J-`sRIe1qU|1KDvwW=bTkgy+VYv)hIZ=cf}y;FXm4%d;w$QfEt!oPG+l%CsJtzVC_)AM4cVo^DXlqe4dX %doYS*R2v+f`V<9cr;jYrK617G=S+APQ}RoL}@M3&PE9gkc5T%UmjHbYuDgH*B^z=0Vu`7=Dem?WA3VmkwfFoO|chNT)q^LAR(23aUwlK-V$p|>CZ@El+3ki7~h?zp%}GlEp%e`M_bvHNtD ba~z$&shVA}GFHE6ja#BICg4YP0u>802Oil!f3chR^-(b_4-m#T9?zEcIgE>gY;pW0!C >s%ZbynN^ES|RN0uXNeTChaZ-V&0`3A#r=}(#~bHkT`cIUrNzsPv3Uh4xQV6rE}VL_OuE`2QJzSc-h>Npl wkmoS+G%*5WytkPG~?VQhY!*4A-bHskl21v %HkSaIMUHurRqCL@tLyOWH>in*myU}rxGTOrGCJtUb;+jET3fCxPdw?7qi%|Y}bni1$UNB$#Nn291pj~ha+yLk|=PCjvTkq8{~-> Q+|&+67dq?d*od{x=BMxEGHj&X>UBXPtB%g*hL;vN5+(hMRCOS-OQ*G4RO%LOdV7+ HPo>^PQWaQOBt`v#}D%9X_84&tgW)DQTR-UcM)uW{NLu^z(#AM3{WpL@8}NkK}u| K$xYs08uRI|DxqPquh8-iyeLHa$$tzhk7KoW?xz*G?XpMK1ssdv3!kMTB2^X50rQs-6C5-sa!uVBRA^ctX!%VDGX>*a%j*<&!l`_ !K5GmdUV>%BJXd2Gj#KUD5@>9gX*h8g+LOge6YUR= )Jn+$9payy;rC?5c?}dp(gf=NZ*QD0I6?Z#dCKJkO;^r8b?}LA@zQx3)=geIe`3R>^B&=xKmM)rlxdUq&ZFSXzj=O$^F_kBrmN?r_W0)cRJQ3YvW;{1eAIaLe36eK Y{t#=nfvCsCQa1p>iI=xsO>TDmmhZ$#>&%h0ew-P-sJuBO5cNq3+QKia#3fC3+R#be|!VItf1zrt=edErG(Z9bwOZaq &wUG7Tp1d&CM_)!i8;rbG@E#cHK}`aAgD*yq(!wNy)6*z467s*5q~Fzpv)2*qb<`m6OT4In@k}IKowc7=Fja2Zv_Jii@dRI)YbuS pyXAEMp%>PkH~HG%SkmEb(pZ3tLRyLWSLD-nlG5Il8{gcnJstmeeh*!e0k&9Q{mjra!Ev36j+m%)Y0iBYSdR&t{(s`n5N1(-%?+||8luJ&{*FU%clX!<2MG$ #r07fGA#*cc+h+61<$87FM`xVyaf2-`l$8A^&1b@G>uo+_lUxwWY@10_11cl2Wfbz0-Am~8tJOA$&wDOnuw++XRnaMExuo3L@$Wc #p<{mIuV0c}FMz;S%5iT35nD|^#%YYqTyAp)qg5f95!rY+cP*gB(6VOeBzOVNncEYxCSZW5wH?Ywo30L1Oq*Szly((vNDHJMTsR7db)JgwT$h-J2jW_Y*5i(3$f) GKv^Z*7=QZyrTvIR`^);D#Bxqx=hvNQ#ap(1g9wV|IW?#tl3Ab1LErY#A=aL#Mg4ubdXFz&6GvU)Nu}vHb;R-&GBfil%l&lrQ=`T87u&5W;DPw1qPA$?tC#v*d){hhWtk;ivH2stfb^72}nud3v0AEsc%+ax^6_zAD2_TSJmk(pe#WGNGa}Bev9$2nKd7pB@R(GB>fih;=SV)z5Rt{821$eARxY0ucJ3lY~m& $#?QNz*ZaK<}!cM BAM6?y8*8B?;GKXhit4e56a@2Q;}{Xc~6UMt>ie7vw5wi3Q3i~6D|awKONOQS`6yMkoc%xb5gW~2&W_1J_J4(7v!YQD1!pA^Al%+ 4kG`@TBAk!U-q9XE*P}K0r6)5_W|*@{ppKJhQMEi3R1`MZZ{&1defpJvjfZbMJbu87ek&kUGAf@7sK|fz6{fL&C@M}crf=qZ*%_c(TB+ftu)PoV`CEcn7(W2(1F2c)z%LHyn*bVR4 h1lN!g9_ZyQ0y0^$@6&?-$|Xf+qj{KnOMw>aE?r@f>3A*R!+(c3rZ8)la}+QnIU$enISELP-4#ihzeS~>B<){)mU^UB-z=5vCQ*} ?EV+1X`!gAhSbIp*L*fWSVmZNLz2i?RIvGuz 8Hrt}htiNC5y8``QY2b@LyO?dZ2KOwInTS@16Xb>KWDFcqN+7t#9~5xxkj7AMH9)h7AtBOWRFv*q1D=4i51A3}G?sh*B7iUdrQEmz1cJbr7GjR# MOY1)I1Y9-!X?d`yHeDT3NRxdX45;=+4S1&@27wKMFIJrzbMe(FK_swz{U-QycO@7m(o+j7MIK%@pg!Vp7QOAyqHrPQcStrBF}7x 2&Q=^%3D_z5e{yd_Cc*8ZiJ?YyFIfLq KTbtDJ+Jwen=80vH*}f7Q|&~!gf4K;@WiA7xBv4bru{cC%S@(AEVSyF8@ZZ=S@5l#y)bY`v+8$BSZMK`0U;nQ>e{SN4H%ujG~{&R TLYbmWL=9!y<$l=N{qr}7GLNFo3={l_(n;^HQq@ek<|DWaJHu6vEbmtLd%YEWr#XPBrumWwYgC$GDBesGLmo4y_=5o`HzRLkZ3gkj0~$;TF(;1g9t|HGkSS}Fb%YR)k${lCF}6u>Prf!F@r|DwSYD`?ctg?1`Dw4E%u6UZ #hcq>r?KYpSAfLxo|#l@>wTZ7j%?VYRiQ7+PVqM6rCw!?M<$(9l1~rh@#TSH=F0<7>cazK%`^}4GEbCiK1t}y(8<6p=AAue0okt) tSX1D*}GwCV!_>eb3Qa6J8|}8npiH@NkU|6Kt43!TivwQJ+(Rkt<%~=+Tc`)I*oBDXDz8)OPUm@CCMU_{VT;zpZBUawJA!7QE-hO n0Vy23~g3%kxaPc5OpU{+()Q&YQI733Js2n*lg)ZJknx@<75r4HOJ>;x`sI>=2h`5Pgz%G$nX(@^oCO|*-U@|OFu-Q4t~@^N3Na% B^nji0>2>ob;M31Dv6Uct)3vW^D40BU@`;1AbL*fwxNo8&F5r9tf5db9#dC!n1aq1~~ I>Nc^*s~jlq*AWVOvp5DGrUFKYSTy~h#gtty<0bBwl-c!s@%j5a9O!FT}(Eni~V0Bp%v^wqh}DxqCxl~1Gs#=rpQfV(Q__w^EM6B1=1X)BdQaKGidf4jL@*9iCHymCLK49hqgiGSV6o#z_=wQ`Ed+;_Hy-` qETgyK#YhD_H_sxv96KR-6=L#^Eov%jOkDku0v*ZvvH|g#0}|)F`_0s{ L@R3k+<})qfv2Qvvb1uuzIh;@JV+lSrJ`_FH~mx5J+8G{b7mfi$tyw#{|~)#t>z4GNw$2 GRem%r12D`)hCAvi24>s9rf}kf%DVyB~I5wS(`&!&{T6}Stsw(MMMuAkqy|VEA>f*jB|tXy?94a7-rl$HbIe$I>hJhaYA3{6(ea; jxiDOEtvG^WWuIJoy8BN-a98|Tw2&j6aHY#wQPbTUqZ?fM oBXswXA8X!o`$g#)|h?H8qKVQyld~q?mu1a?I6A_zOdi~*-tDis^>EwSYV!*{=Nbq?QoKPuCz}T4@v5=$xS=y>eEi>f^kgql9Mbnza`2P3cK}61M;0vqNB!IKFZ20RX2}q9Z`z}4YW)Ruk)Q!9*0s>^oGr$ fm@7^vc|K(UuKXaIW67m$B7zmb8FmO=V9!st@o-ENaS;p;@LP?D)hWz1f -I+x3)OsmDKChNMrPtR|(k|G#pB8b%W|%MxE;VJ7w8f8AY`RRjtKh78Pq?-6+|)*xNSk~fZ@jNKWX?|H-7p*l(wS2fS-sGKs+#o@ 9>=pn``FrTN!-?@+Xe}Iwbb(#hFSqLY%bTH-AwKiqS=+%p^x1G?8$PnL9Fbx@|3K1K+G^8R2q?{5m(c`0}+lDsU5}<`xEwXX<_gVA 2wBh^0@LwK`|pA?M|!ma6F*+M4xa{;LtiA;6|~gk{DPdoFeMoCik>oTl%*-b#Vo0o9I!N4&j0`nb+cxR3+ &rmGom|?${4|z|_(QiQ1czj#>im`jMZYRotx;hU&Zz(a+Chcn|aru5Wo4?yTgp61xZQZ;s(cn~>JJfT)EtAEDT^X3c9w;yi4 R_Nv^uLs@-&*!JE9nKvjDRmAMeYkX~W#jZwy9kf%U2hbx*ZZcFH$pe@X1) %?Gh^?F(ZeaR~diBSh-D6I&h+E+4mbv*&GP?`vX6D^N$f5c^qR9y92yye?(g8~e)-d^#P6L{nxR-Nfz@BE&0436c0^IjMr>TMtNP KK7v7PPkjG)v5X-i@(&J#t%K*e68GpFH*Sb5R>C3WL?rCgIwn5 TQGNepT#rR9m=md STZx|(ByOcPxijRvgH;+59X}ck=sT4tuv;k{8S++9P_a)R0)RFcsw7N(6-ZL2ie#&imT%TxDRqVYh)=St0Q!K4<8n}z; ZJ*@ATr0lmjJ;%nI?2|xsu*TjAByd}!xg5`4K{nTk?0l*BM{QK$IZ9>7+YbK)d)E;uK&*7In(mU4R&wPAn9~`NYgQQ9<*TEN)CA> *kY2@VaBf!d6N5VQ$21W38Wl=oBWvdm^o>sZo|oE`FMp_N@Q*eRbz)_lcXmjBalSn#7b*2ccH<{^~; iBgZ5aQWax_LaX!kqP00B8{mKmiqWbb8On!)tG&pxYZ2}Se*VlD$XGBH!#@J2lGzG&mql|iux4{%pJNUC(EU6WjS)}ha#7hRV+Z(hhcT=n(v|U9 3|Uk3YT@*T#SZ?~(1;kntcDGC-=lw0%*OLQ-_j`9e NDE5-0Eu}OS@`Qk>{dvjLgSrKmv^0zW*=r*Mj#@5lOQW~|Qk(x_S=}%;I#-GSwu`T7(*YYzN {|8V@0|XQR00000*_b*@000000000000000761SMY;R*>Y-KNUZ!b(kUrj|*Q$a^XQ!h|U0|XQR000O8*_b*@MIjM-gA4!wD;od+ F8}}lY;R*>Y-KNUZ!b(kUrj|*Q$a^XQ!jF1aA{;MaAoo)F@e3|=x_nv$1 x#ymH&Ut5ES$@Xd3eSGDbI_hSU8%#sTRx)F=Z&+J>IS|E{3!6OCZ#R}t_H3F?f~`xZ*JoGZvZ=ij{)&hzrw2v_#$u#@Nd8ifd7*D -la-?0(c=1KQ)e5Gw=rBnZQ}#hk!ot!@zw@SEUV?{#=K>!D!qn=iX4d}~BL8_=|BC4Gs*K+h{oWB=(!$u)!s{<=VfmM|us$1G Sl;C=tjCDVU)#d+b_(7g^DeLtXj^#S+eQAJGQL;#`ECoJ^M@^buRoUko^4?}KQH`$koA9UVf(%<`YgdNcQM^5M? t?Xx$z>9$MLchP2HkN-^8_U19jrF*{jn8pJ<{xWgy?-Y3r-lBU@V_kdSKIi!ueY)N-e_aH zAf@e8CrK{JI}Ybv)tZxjh$K%~F@=7|N;0w#yF7GVo `PC~pUbn8`d!Jsx_Wd02Jc_3ke2(t{w*Vhs!FKp3@G9VG9js5TgYR>92kW)BgYC1ggY}C$SihS)Sl;a&e7>*A`2G%#r-wWEyg%vS {PA=L$La6z(zI^}@7vkQ>vwgszNJoib=+&!b(u-;cUjkEgm=k6(7Ne$NWNB=f%qt^@u_=sn%M|M}f)*8v%Cmho6O-~095ykDi8 ?Gtsge|@=|_5OM{>v_0a;!M^(+0FO!Qa9`W=We#&Tf+Yz;Kjh!9@Z<{!|TgEtj8_D^MPOOVL3;D*HXL*|I%KiHUPKuvK^vcKIg5y tk>Ni?GLF&KEB2p{qs=IefzP5Piv5Hh@(Ze|JjFE<`DwSz QEZG!|7x`Sf_AIH+-8-Va7VjWAv3jTQ@eH>OidOv=+H T+G`z!QJ{En9sScPJFvBG1|JukL`>#p~`ulc5TVV5qD)pq>Dkh0^vsGDkhAR5S=6r%1&&Hj_1v57jwl}PdmlENd=?*wrHXnPvEPq n9-Q3%m#4~X~%cRh`DVzt4HS=K2QlFn2t3VJ`fu}BGb@i`#2{$`%TsSBLNJnF;R+V F-XGNL@})(`f4XidqpCRIZ>?F RaHwz>l;QJ8b)bfjq#zNVm_}|m93w|a9Ip+v-HA+GEm3F4pef~4l>Y=V3CK3-yv$oeKDOH4*@=mH|Ru0jqf+%TxfBq@i`whOAS3i PN;S|73=D>udDZu^TK8YgShaE2KJ9*BFQ*HFSHOXrYV?+Zm>SwPp-@dE}U%T!fZm~V7kPQRly#p@$R*i^i>b+0y*)*u+UBn?+Qw| e)jOBatfxT0(ICp+WHY+5(f &@0nG(9R4UJDxQO)at}(}16Zc0$-SF)_SzFjp8>*HK2|HwOZD<>c2}7j6ru oSLFIgSSpirB0iAD!ppt>V%1KaN2GvNZ<>;o^=r7^Aye}Cqi;<+zY%L4p~mT*dpa>4~c*-5v&oJa9%q|A@y9oMw|Xpzs505NM4Vt bF~{Hl|=n&rkYy3V9ta^3W#)Hen;vgC8`wUEg?iz-z7zMPGp>y)!9g1%urOaMZ4Q#L2C>RH2)0G5W)MqA*fW;2IC1Fc5e_O1#SlSNEv*`HrbC>`m+ytFRC)SpG?KUk +Or40v9VlE0G*-q0H`b~YL89mF7?qP$di?XN}-zW3%W*4g1h0;hZ^k$8O}l5Kowe6jrwsIxJl8F^%Hyok>H@5E;u-l5Bt6!!x|mI `M7X$m?!Zl!50l(vO?t0?Ks+?h@vZDbyHVrqOm9i_$8(L15Jhn2{C1?xG}$W0Is6_b$6Uq1Q5sIua_u_&snpXv)s)`ks6!yti?7mi^j8SKIrp=_B>hDJ)_ Rco)rFOl+NV+)F})fmF1=mk$=K&M`NB~*JQ8kGlvFtTwPCg#0jB=Hh#EyWP(*ATISj|x|2_&!%cCn|>3+e2Mb!2tISRtXs+_1Q>T p4D6sanBW65w%vjt%u?c<`&ZN2Wl2Z^<%387$7o{MaHn|#J8PFY-$GLC`+$!QLH&$5$l3!{NJH`Lkpw&y76*aRnog5h$aGj0>cIx CD#g*ooW%6TIgMPZ8dg?f00qEhl_)Bx5i;s4JOb(wM$WIIJ2O(LsZvRB-3sXr3$A-m4!7Cj5RuKhRR3Bp}|)MbP^eWiF^_DM}jxX yTpfvNrkT8gR8u^ELg9Cat%ts@sMm2D%L*063XeE&5SI{ThDUL8Y%HYQ;+*xgn*;W71U|@-1c3C!Chn3DvyJbix)8o55~xT6e9?M TrM*Y-KNSY%fehUrj|*Q$a^XQ!h|U0|XQR000O8*_b*@dNEnGLJ|M~rY8UZF8}}lY;R*>Y-KNSY%fehUrj|*Q$a^XQ!jF1 aA{;MaAHL*9J`LtG!W^!1{%cf4^pIP8o)r>0BMt;XkZ{|`n`FxcSllcT%ZTee)IF@&71c(GyLb~>z@|*J%_Rd rSE-0d>43UgV4WMepQGz;GY9KfNugH1pXMf4Vb+dbAX=!ZUnw`Gt+$&cmwd?fnX{A3;2HE&w#%IeD6BOn}F+q>w&c7PT&UMJ~KYH j^~{QZUuhW(0vT}Yrw~VU@2Y(-UxgRcoXogb-ey}*YWz_2YvwfL(~6L;B~-X82;Ba@_HX=WV+@?US~@qkM}n6ya7YE4+s^AyMgOS PGBR+*U0jFz*gWz-~jNMMwauh&HQfz_X5Ay$a>t+#QY94@%kf8yq~EirhlM`_nU8G`X|l!D^0xLr6!i+P1FB9gFgh~PrTE_`@ON5 ^>K4E^KAuQ4{UGdeRdh#0c;2E0=^e`5_l9i+01e-HnV=7Z|3#CV)%W%ndN`owBIuH-!b@a27hYizpsVYYiwcp+FF?3rWTf~*NpeI Fuy$p?`&Z{!@w5OlbM$@^CI9TVA8_!JZ0#gHSHH#c>S-ous*(F@UIO1O$*!cZ_WBYXkmT+xP|@u=VrXUmB;tCvit{Hd7Zmj*&d^< yx#q$f4-IdAZlfKKMsT{#1pOTFMnj{UTJ0dUTfw3ylMLX0eBbi?N;`Ktq7i8;PLf5URuxmA70P)`{a7|%P#>B123;wIJbuTuba5+C3J;Ab{)+w|5)UPl{`A8g}&A2;KZZLF{R%(&mi{3>m%zefz+<87?Rr`p)gpEKiMXk+=F H}hXG<1d?a{t|c=_=f2p+Q|L)Ze+gG8=23UjT{eZBkLtJbQd2-?z5#K7V4yuW#q|o7;JRo7$Pb H2u5US?~MXdEW=xS*}Cvyxs{zf2y71z&7}xng5U(zu3;}KHbiK{X9?tUj=pnzXQAj_}^xH|1G?)6TnH}>03C@{pl?{{&%;qpM3uo Uhh8*l2XVHHvzkWdpfv(wu9xhJJ>({4&ML69n9yk4(7Yq!TWuogZ1&{4&Lue9qea+(ZPDS(!uh*(ZO->_Z^%M-vKTFf8N1yo0q)K Lz35dRI(hOmpuPD)BZEbe)qD$*A4!oWO;vJ=--hn-}RlmuNyj9u9i-gYhx$N+hK6Kq1)Zb=k-B@r#g9mMc@(gcSH9I5UwSbI@x~z (#d)BUpsmIpLMdlH*_)orY^o8Y%=ZJyO_^CU7UYLyEuNLF7|^*yIB59UA(_%4Su=H#A_Gp>kY%_+Xmn6;`_jlx;PHrzm@rI+sb;~ yOsApw3YqrIB*_#W-I5jZvY3$@6EjKZM^Pn+nDdsZ9MOO;4z>F+z}MMeqQTl`M=f8 `uwME*6-Vfj+~Y3dt(pVaZ?ZH?~WcGKhneV$9s6)51F>=VLcXmSns7C-hX2FeALXpXvUxD;q@1R3Gj=C&*om%UvDqd?KOC?m-l3foRoBAgOuQ7u1F_bx!&zZ492IAIWqstj|QI4Zng7ZB69z*d2-+$>$eiY?C!TI2`g8l1m!TNgG%psfKFIdN? 1p5x@^){3-Lqq-*pxkcSPuIyqHkw5_kMfK#xe&hxP(CEs$DT8NWZ&O0_1_X4C*;F)FOq`&N}o+AizwSs9!Gf!WryJWTBuulr{J^g 6M|#nlIaiYXd)CJJ%X~^)Ro})$eQ*Z !RI*r$|#>P^&ylZ%4w8g(|3nK$}3%U{KpMa{<|0D3n;&iG9~y-{N1LpgOZObny?x$s?I _O*zvx(6>V&e_3g+LZ%bt*t@hq1-9EL$O<0D#17J#{r<|cyVN-653hcv&4{P$=GuqjBV*ywih|`jva_0*Oiu&bE1%|hH)sfez61@ Y%x@_gD4JA2_h$q#84dhMHM+&<+_QqK$4B*oXQsB5?W`StQ}Tqd`}$0h{RAS??-;9wS5-rqgu|xNa=!(m(!#~8TfOqT@;5^(GHX> !kE>%Z`rPCgyJw-S$s=L;NWysDiM!(L(r(W#%X|GfNzz`mvrqZ~jO3CY6?PAC{FodOTyt=gsp-71jeS=>yIDDU;o$`fBUDVP|>ZiF{<0zagHY?r~@uy$uRE+k<8Y++sM?o7@3!eA7hzN!8fH!W5D=7r0 R4pi6?1U(gHP|&Q?JA)dp_C#i$(X9qZ`E7UN~mjD>KavHBnQ*|>eikWt-UK+x-Ldpi`e(rnB2~ZA>4rmB85H(5C*E)k%CA{j5%S} c3tJ!@J2D_d+_eV_GqeXmvao_pl0WF@Dw#%7FtNjF&ywO*XntudL+O)tm{p#DQ%rFvPQkB`9j0t#OfZ2fMu^>NJ47vTunS|fDLW)5t~Dtt jVY$qIu*Lgh_RABaCAP3OX!Sg4Olw%A~EHht1>7!CH<)#7gHrW>&z#VF?8O^BA<#;kG`#AL|O-eOS TBE@8@p%_KY$TGh1GOnSIDaX**2l^Te5i(E8tF?+W99Dc=6X^z0VEyN9XN%T8z73%uH{=^ZiQcF8gT0CZroz3b=*iW*9lioCFZq> L=)K6)H$7pDm~mVP=)IKd94~8d}3OkVAFx}LRX)N#CoVyavct+fdPmLy&6WRCMJd_4-ZWZi__#a{9PM_+^zE%SB)u8v#ZTG7LpHA %j_(rVC0E^I?%treAxHAbH?#5D5`oj9o+(e5{&vC0z*fcA}MCyEyepdmuNUPoIF25nR%eR)7-- d3ruQ;atCL2U*HfdR_j8VvP`DO@M`|Q`KtK^GmbVbiz=l$2DcI1!SN85v%_+JcRTs1IkzplXeMNq<<{TIadFnI2ZO$`x$7xNT;Be &EJzN!sG)8vxbTB{z=3r&F-h0Peu;z+I@Tft~>g7?~%LrXZ8&4+=X8Q9TEMhH~2vYJ_2rXl-S8Tug3Z=%<*zD4y*oYTNN{M!grkz #3lD0*BS7G++7W0BV)rg;dc-0YB-FL#Vw$J8WEC_5p;fQ$wdqw(3v2#ql2fWkM{4c(UC|9#QtGq4az$ixqr@y8t&^KRWal#DXX6@ Dp1GD?G5gegM*n}dwF~J^&hiwr0~|NGv)TV*g;_L-oJO>o*mWwWMs*05EHIbkO<^hu6S}(e58Qo^Rnd6L9|4ibZi-0=<#LfEG=^X (j#Eu6ymk>>)$7al`ku}<~o$URzFhwtGrR_UnpzdC;r;!$%Gcv)&e=J1;V2uBkSHKv>oimOJH@qljRF~;*}T6zjW&V$E&5{*vl7C $@!>yDt)^s{dOtDo~3Zo-fPQA?yqf9_2X-L55D)0Bg-81wc8g(l<+z t$3g=Cxsxvia}-RqE)dm3pW#4h_1XCkeZ7A@@2GR975m)%NP6-IYLF1ROpwNE>_u9RCYm$Q&AZ+D{IJP#adWe#C(SmLyrBBR)>b#$F%_E6zeE5?%247?(3#Gpem2jfpsc-U6sqS?Nn`5JELtR%|1EI89C(pbDL2BoACF3tdEZL0XV0BTiLS W7pLcxgO-M@XY#6a237CC2CA6>(0+w=i0|2p=9z;K{`$_nbBwuVAlakR4%3o)MaoUi~5 ixaT4>*ugvnlGjkx8TbHcS3F)u!#xG6F6s(j}SQ=*h`Dz*fIRk15JPFfp+YeZs`ZwOcMIg2Xut%Z*b+s2r*Dhpm1aY2XUY;({a_! >8UmYZB`N_dhDc}z!Vp=9KSlG%cQyV{YJ5F=lnj>Kf8=^3Cq_urv&OFPiO<$tAlPpq(17@T-0X2*I}K7jo2)dR4Xw>pYc)Dl3LZ& #&I%4w9ueYSG8l$>W;lDJJ_m7ljOdvuKLGbQuo$FOfyhLUsWOVWWk;|__yO^xRC~ZoIM48rc@Ob1}8r67bB@1-zFs+bi9NR(w=ukAFu__oQ{DNA(jHLrb &PH~Lvw6ShP-?-VbkG%W)aF#V0DiF7r8KrDK!qcjp_Ya0YHsxlflhmvK&t0N-N&|uXE-^mNIITFBE<17LsFGhQDjZZEtR<7P$