sunpy-0.8.3/0000755000175000017500000000000013232563477013110 5ustar nabilnabil00000000000000sunpy-0.8.3/astropy_helpers/0000755000175000017500000000000013232563477016333 5ustar nabilnabil00000000000000sunpy-0.8.3/astropy_helpers/__pycache__/0000755000175000017500000000000013232563477020543 5ustar nabilnabil00000000000000sunpy-0.8.3/astropy_helpers/__pycache__/ah_bootstrap.cpython-36.pyc0000644000175000017500000005177713232323461025662 0ustar nabilnabil000000000000003 ~ Z,@sdZddlZddlZddlZddlZddlZddlZddlZddlZ ddl Z yddl m Z m Z Wn$e k rddlm Z m Z YnXe jddkreefZeZdZneefZeZdZybddlZejjdZejdZeekrejd Zeekre jjd ejej ej!eWndd l"m#Z#e#YnXy ddl$Z$Wne k rZYnXy ddl%Z&Wne k r~YnXyddl'Z'e'j(d ddl)Z'Wn YnXddlZdd l&m*Z*ddl+m,Z,ddl-m.Z.ddl/m0Z0ddl1m2Z2dZ3dZ4dZ5dZ6dZ7dZ8dZ9de:fdefde:fdefde:fde:fde:fgZ;Gddde<Z=Gddde>Z?d d!Z@d"d#ZAGd$d%d%e<ZBejCd&d'ZDd(ZEGd)d*d*eFZGe=jHaId+d,ZJdS)-a This bootstrap module contains code for ensuring that the astropy_helpers package will be importable by the time the setup.py script runs. It also includes some workarounds to ensure that a recent-enough version of setuptools is being used for the installation. This module should be the first thing imported in the setup.py of distributions that make use of the utilities in astropy_helpers. If the distribution ships with its own copy of astropy_helpers, this module will first attempt to import from the shipped copy. However, it will also check PyPI to see if there are any bug-fix releases on top of the current version that may be useful to get past platform-specific bugs that have been fixed. When running setup.py, use the ``--offline`` command-line option to disable the auto-upgrade checks. When this module is imported or otherwise executed it automatically calls a main function that attempts to read the project's setup.cfg file, which it checks for a configuration section called ``[ah_bootstrap]`` the presences of that section, and options therein, determine the next step taken: If it contains an option called ``auto_use`` with a value of ``True``, it will automatically call the main function of this module called `use_astropy_helpers` (see that function's docstring for full details). Otherwise no further action is taken (however, ``ah_bootstrap.use_astropy_helpers`` may be called manually from within the setup.py script). Additional options in the ``[ah_boostrap]`` section of setup.cfg have the same names as the arguments to `use_astropy_helpers`, and can be used to configure the bootstrap script when ``auto_use = True``. See https://github.com/astropy/astropy-helpers for more details, and for the latest version of this module. N) ConfigParserRawConfigParserFTzsetuptools>=0.7 setuptoolsZ distribute)use_setuptoolsZAgg) Distribution) PackageIndex) run_setup)log)DEBUGzastropy-helpersastropy_helperszhttps://pypi.python.org/simpleauto_usepathdownload_if_needed index_urluse_gitoffline auto_upgradec@seZdZdZd$ddZed%ddZeddZed&d d Zd d Z e d dZ ddZ ddZ ddZddZd'ddZddZddZddZd d!Zd"d#ZdS)( _Bootstrapperzd Bootstrapper implementation. See ``use_astropy_helpers`` for parameter documentation. Nc Cs|dkr t}t|tp|dks&tdtrHt|t rHtj}|j|}||_ |dk rZ|nt |_ |dk rl|nt |_ |j rd}d}|dk r|nt|_|dk r|nt|_tj jtj jtj jtd}|dkr| rd}|dk r|nt|_d|_dS)NFzpath must be a string or Falsez.git) PACKAGE_NAME isinstance _str_types TypeErrorPY3 _text_typesysgetfilesystemencodingdecoder INDEX_URLrOFFLINErDOWNLOAD_IF_NEEDEDdownload AUTO_UPGRADErosexistsjoindirname__file__USE_GITr is_submodule) selfrrrrrrZ fs_encodingZgit_dir_existsr,5/home/nabil/Git/sunpy/astropy_helpers/ah_bootstrap.py__init__s*  z_Bootstrapper.__init__cCsL|dkrtj}|j}|j|j||jdd}|f|}|rH|j|S)NrF)rargv parse_configupdateparse_command_linepoprun)clsr/configrZ bootstrapperr,r,r-mains  z_Bootstrapper.maincCstjjdsiSt}y|jdWn:tk r^}ztr<tjdj |t t iSd}~XnX|j dsniSi}xHt D]@\}}|jd|sqx|tkr|jd|}n |jd|}|||<qxW|S)Nz setup.cfgzpError reading setup.cfg: {0!r} {1} will not be automatically bootstrapped and package installation may fail. {2} ah_bootstrap)r$rr%rread Exceptionr r errorformatr _err_help_msg has_section CFG_OPTIONS has_optionbool getbooleanget)r5cfger6optiontype_valuer,r,r-r0s.      z_Bootstrapper.parse_configcCsJ|dkrtj}i}d|kr,d|d<|jdd|krFd|d<|jd|S)Nz--no-gitFrz --offlineTr)rr/remove)r5r/r6r,r,r-r2 s  z _Bootstrapper.parse_command_linec Csdddg}d}xLttjD]>}y"|tks6|jtdr>tj|=Wqtk rVwYqXqW|j|_x:|D]$}t|dj |}|}|dk rlPqlWt dj t|j t j d}yt jj|dd Wn:tk r|jt jjkrt jj|j=t jj|YnXdS) NZlocal_directory local_fileindex.z get_{0}_distzNo source found for the {0!r} package; {0} must be available and importable as a prerequisite to building or installing this package.) precedenceT)replace)listrmodulesr startswithAttributeError_check_submoduler*getattrr<_AHBootstrapSystemExitclone pkg_resourcesEGG_DIST working_setaddrkeyby_key)r+Z strategiesdistr[Zstrategymethodr,r,r-r4$s0       z_Bootstrapper.runcstfddtDS)zc A `dict` containing the options this `_Bootstrapper` was configured with. c3s*|]"\}}t|r|t|fVqdS)N)hasattrrT).0optname_)r+r,r- dsz'_Bootstrapper.config..)dictr?)r+r,)r+r-r6]s z_Bootstrapper.configcCs~tjj|jsdStjdj|jr$dnd|j|j}|dkrVtjdj|jt n$|j rz|j rz|j |}|dk rz|}|S)zm Handle importing a vendored package from a subdirectory of the source distribution. Nz3Attempting to import astropy_helpers from {0} {1!r} submodule directoryziThe requested path {0!r} for importing {1} does not exist, or does not contain a copy of the {1} package.) r$risdirr infor<r*_directory_importwarnrr _do_upgrade)r+r]upgrader,r,r-get_local_directory_distgs   z&_Bootstrapper.get_local_directory_distcCstjj|jsdStjdj|jy|j|jgd}WnFtk r~}z*trPtj djt |jt |d}WYdd}~XnX|dk r|j r|j |}|dk r|}|S)z Handle importing from a source archive; this also uses setup_requires but points easy_install directly to the source archive. Nz:Attempting to unpack and import astropy_helpers from {0!r}) find_linksz:Failed to import {0} from the specified archive {1!r}: {2})r$risfiler rhr< _do_downloadr:r rjrstrrrk)r+r]rErlr,r,r-get_local_file_dists$  z!_Bootstrapper.get_local_file_distcCs|jstjdjtdStjdjty |j}WnFtk r|}z*trNtjdjt|jt |d}WYdd}~XnX|S)NzDownloading {0!r} disabled.zXDownloading {0!r}; run setup.py with the --offline option to force offline installation.z7Failed to download and/or install {0!r} from {1!r}: {2}) r"r rjr< DIST_NAMErpr:r rrq)r+r]rEr,r,r-get_index_dists  z_Bootstrapper.get_index_distc Cstjj|j}tjg}|j||jjt}|dkrtjj |d}tjj |rt t tjj |ddgWdQRXxtj |dD]}|SW|S)z Import astropy_helpers from the given path, which will be added to sys.path. Must return True if the import succeeded, and False otherwise. Nzsetup.pyegg_infoT)r$rabspathrW WorkingSet add_entryr\rCrsr&ro_silencer find_distributions)r+rwsr]Zsetup_pyr,r,r-ris     z_Bootstrapper._directory_importc srddn d|jGfdddt}|rBdjt|}nt}d|gi}y:trb||dnt||dWdQRXtjjj tSt k r}zFtrd}rd}nt krˆ}nd }t |jt|t |WYdd}~XnXdS) Nr|cseZdZfddZdS)z1_Bootstrapper._do_download.._DistributioncsTtj||}|dkrPdk r(df|d<dk r._Distribution.get_option_dictN)__name__ __module__ __qualname__rr,)r~rnrr,r- _Distributionsrz{0}=={1}setup_requires)attrsz"Error retrieving {0} from {1}: {2}rZPyPI) rrr<rsr ryrWrYr\rCr:rrepr) r+versionrnrreqrrEmsgsourcer,)r~rnrr-rps4    z_Bootstrapper._do_downloadcCsRt|j}tjjdjt|j|}t|j d}|j |}|dk rN|j |jdSdS)Nz {0}>{1},<{2})r)r) _next_versionparsed_versionrW Requirementparser<rsrr robtainrp)r+r]Z next_versionrZ package_indexrlr,r,r-rks   z_Bootstrapper._do_upgradecCsF|jdks(tjj|jr,tjj|j r,dS|jr:|jS|jSdS)z Check if the given path is a git submodule. See the docstrings for ``_check_submodule_using_git`` and ``_check_submodule_no_git`` for further details. NF)rr$r%rgr_check_submodule_using_git_check_submodule_no_git)r+r,r,r-rS#s  z_Bootstrapper._check_submodulec Csdddd|jg}y(tjdjdj|t|\}}}Wntk rLdSX|j}|dkr|rd }|jj|stj d j|dSt j d }|j |}|r|j |jd|jdd Stj d j||jdSdS)at Check if the given path is a git submodule. If so, attempt to initialize and/or update the submodule if needed. This function makes calls to the ``git`` command in subprocesses. The ``_check_submodule_no_git`` option uses pure Python to check if the given path looks like a git submodule, but it cannot perform updates. gitrestatusz--z>Running `{0}`; use the --no-git option to disable git commands Frz9perl: warning: Falling back to the standard locale ("C").z.git submodule command failed unexpectedly: {0}zE^(?P[+-U ])(?P[0-9a-f]{40}) (?P\S+)( .*)?$Tz]Unexpected output from `git submodule status`: {0} Will attempt import from {1!r} regardless.N)rr rhr<r&run_cmd_CommandNotFoundstripendswithrjrecompilematch_update_submodulegroup)r+cmd returncodestdoutstderrZ perl_warningZ_git_submodule_status_remr,r,r-r4s0    z(_Bootstrapper._check_submodule_using_gitc Cstjjd}tjj|sdStj}tj|8}x0|D](}|j}|rT|dd krTq6|j|q6WWdQRX|j dt }y|j |Wn4t k r}zt jdj||jdSd}~XnXxH|jD]<}|j|dsq|j|djtj}||jjtjkrd SqWdS) a Like ``_check_submodule_using_git``, but simply parses the .gitmodules file to determine if the supplied path is a git submodule, and does not exec any subprocesses. This can only determine if a path is a submodule--it does not perform updates, etc. This function may need to be updated if the format of the .gitmodules file is changed between git versions. z .gitmodulesFr:;NzOMalformatted .gitmodules file: {0} {1} cannot be assumed to be a git submodule.rT)rr)r$rrvroioStringIOopenlstripwriteseekrreadfpr:r rjr<sectionsr@rCrstripsep) r+Zgitmodules_pathZgitmodules_fileobjflinerDexcsectionZsubmodule_pathr,r,r-rs2       z%_Bootstrapper._check_submodule_no_gitc CsB|dkr dS|dkr6|jr(tdj|ddg}d}nT|dkrZdg}d}|jr|jd n0|d krrtd j|ntjd j||tdSd}d dg|d|g}tjdj||dj|y(tjdjdj|t |\}}}Wn,t k r} zt | }WYdd} ~ XnX|dkr |}|dk r>tjdj||tdS)Nr-zCannot initialize the {0} submodule in --offline mode; this requires being able to clone the submodule from an online repository.r1z--initZ Initializing+ZUpdatingz --no-fetchUzError: Submodule {0} contains unresolved merge conflicts. Please complete or abandon any changes in the submodule so that it is in a usable state, then try again.zUnknown status {0!r} for git submodule {1!r}. Will attempt to use the submodule as-is, but try to ensure that the submodule is in a clean state and contains no conflicts or errors. {2}rrez--z{0} {1} submodule with: `{2}`z>Running `{0}`; use the --no-git option to disable git commandsrzFAn unexpected error occurred updating the git submodule {0!r}: {1} {2}) rrUr<appendr rjr=r&rhrOSErrorrq) r+rerractionerr_msgrrrrEr,r,r-rsL    z_Bootstrapper._update_submodule)NNNNNN)N)N)r|N)rrr__doc__r. classmethodr7r0r2r4propertyr6rmrrrtrirprkrSrrrr,r,r,r-rs( )  % 9  " 7L:rc@seZdZdZdS)rz] An exception raised when a command run with run_cmd is not found on the system. N)rrrrr,r,r,r-rsrcCsy$tj|tjtjd}|j\}}Wnjtk r}zNtr<|jtjkrddjdj |}t ||nt djdj |t |WYdd}~XnXyt jdpd}Wntk rd}YnXt|ts|j|d}t|ts|j|d}|j||fS) z Run a command in a subprocess, given as a list of command-line arguments. Returns a ``(returncode, stdout, stderr)`` tuple. )rrzCommand not found: `{0}`rz@An unexpected error occurred when running the `{0}` command: {1}Nrlatin1rN)spPopenPIPE communicaterr errnoENOENTr<r&rrUrqlocalegetdefaultlocale ValueErrorrrrr)rprrrErZstdio_encodingr,r,r-rs*  &     rcCst|dr$|jr|jjd}qLg}n(g}x"|D]}|jdr>P|j|q.Wdd|D}t|dkr||dgdt|7}|dd\}}}d j||d dS) z Given a parsed version from pkg_resources.parse_version, returns a new version string with the next minor version. Examples ======== >>> _next_version(pkg_resources.parse_version('1.2.3')) '1.3.0' base_versionrL*cSsg|] }t|qSr,)int)r`rr,r,r- :sz!_next_version..rrNz {0}.{1}.{2}r)r_rsplitrQrlenr<)rpartspartmajorminormicror,r,r-r"s    rc@s(eZdZdZdZdZddZddZdS) _DummyFilezA noop writeable object.r|zutf-8cCsdS)Nr,)r+sr,r,r-rJsz_DummyFile.writecCsdS)Nr,)r+r,r,r-flushMsz_DummyFile.flushN)rrrrerrorsencodingrrr,r,r,r-rDs rc cs^tj}tj}tt_tt_d}y dVWnd}|t_|t_YnX|sZ|t_|t_dS)z:A context manager that silences sys.stdout and sys.stderr.FNT)rrrr)Z old_stdoutZ old_stderrZexception_occurredr,r,r-ryQs rya If the problem persists consider installing astropy_helpers manually using pip (`pip install astropy_helpers`) or by manually downloading the source archive, extracting it, and installing by running `python setup.py install` from the root of the extracted source code. cseZdZfddZZS)rUcs@|s d}n|d}|dt7}tt|j|f|dddS)Nz:An unknown problem occurred bootstrapping astropy_helpers.r r)r=superrUr.)r+argsr) __class__r,r-r.qs  z_AHBootstrapSystemExit.__init__)rrrr. __classcell__r,r,)rr-rUpsrUcKs(tj}|jf|tf|atjdS)a Ensure that the `astropy_helpers` module is available and is importable. This supports automatic submodule initialization if astropy_helpers is included in a project as a git submodule, or will download it from PyPI if necessary. Parameters ---------- path : str or None, optional A filesystem path relative to the root of the project's source code that should be added to `sys.path` so that `astropy_helpers` can be imported from that path. If the path is a git submodule it will automatically be initialized and/or updated. The path may also be to a ``.tar.gz`` archive of the astropy_helpers source distribution. In this case the archive is automatically unpacked and made temporarily available on `sys.path` as a ``.egg`` archive. If `None` skip straight to downloading. download_if_needed : bool, optional If the provided filesystem path is not found an attempt will be made to download astropy_helpers from PyPI. It will then be made temporarily available on `sys.path` as a ``.egg`` archive (using the ``setup_requires`` feature of setuptools. If the ``--offline`` option is given at the command line the value of this argument is overridden to `False`. index_url : str, optional If provided, use a different URL for the Python package index than the main PyPI server. use_git : bool, optional If `False` no git commands will be used--this effectively disables support for git submodules. If the ``--no-git`` option is given at the command line the value of this argument is overridden to `False`. auto_upgrade : bool, optional By default, when installing a package from a non-development source distribution ah_boostrap will try to automatically check for patch releases to astropy-helpers on PyPI and use the patched version over any bundled versions. Setting this to `False` will disable that functionality. If the ``--offline`` option is given at the command line the value of this argument is overridden to `False`. offline : bool, optional If `False` disable all actions that require an internet connection, including downloading packages from the package index and fetching updates to any git submodule. Defaults to `True`. N) BOOTSTRAPPERr6r1rr4)kwargsr6r,r,r-use_astropy_helperss:  r)Kr contextlibrimprrr$r subprocessrrrr ImportError configparser version_inforqunicoderrrbytesrWrrZ_setuptools_reqget_distributionZ _setuptoolsZ _distributerinsertlocationactivatereloadez_setuprtypingZsetuptools.py31compatrZ matplotlibZuseZmatplotlib.pyplotrZsetuptools.package_indexr Zsetuptools.sandboxr distutilsr distutils.debugr rsrr!rr)r r#rAr?objectrrrrrrcontextmanagerryr= SystemExitrUr7rrr,r,r,r- s                   K/"  sunpy-0.8.3/astropy_helpers/astropy_helpers/0000755000175000017500000000000013232563477021556 5ustar nabilnabil00000000000000sunpy-0.8.3/astropy_helpers/astropy_helpers/__pycache__/0000755000175000017500000000000013232563477023766 5ustar nabilnabil00000000000000sunpy-0.8.3/astropy_helpers/astropy_helpers/__pycache__/__init__.cpython-36.pyc0000644000175000001440000000132713203277317027135 0ustar nabil000000000000003 ~ Z,@syddlmZddlmZWnek r8dZdZYnXddlZdejkrTejd=yddlZejdddl ZWn YnXddl Z dejkre ejdd re j j ejdjZejd d krejdd krddlZnddlZd e_[dS))version)githashN ah_bootstrapAgg__main____file__cozsetup.pyT)r __version__rZ __githash__ ImportErrorsysmodules matplotlibusematplotlib.pyplotoshasattrpathbasenamer filenamerstrip version_infobuiltins __builtin___ASTROPY_SETUP_rrA/home/nabil/Git/sunpy/astropy_helpers/astropy_helpers/__init__.pys0        sunpy-0.8.3/astropy_helpers/astropy_helpers/__pycache__/distutils_helpers.cpython-36.pyc0000644000175000001440000001475313203277317031153 0ustar nabil000000000000003 ~ Z@sdZddlZddlZddlmZmZddlmZddlm Z ddl m Z dd Z d d Z d d ZddZddZddZdddZddZddZdS)a^ This module contains various utilities for introspecting the distutils module and the setup process. Some of these utilities require the `astropy_helpers.setup_helpers.register_commands` function to be called first, as it will affect introspection of setuptools command-line arguments. Other utilities in this module do not have that restriction. N) ccompilerlog) Distribution)DistutilsError)silencecCsddlm}|ddkr tdttjjtjdtjddd}|j j |dt 6y|j |j Wntttfk rYnXWdQRX|S)z Returns a distutils Distribution object used to instrument the setup environment before calling the actual setup() function. r) _module_stateregistered_commandsNzastropy_helpers.setup_helpers.register_commands() must be called before using astropy_helpers.setup_helpers.get_dummy_distribution()r) script_name script_args)Z setup_helpersr RuntimeErrorrospathbasenamesysargvcmdclassupdaterparse_config_filesparse_command_linerAttributeError SystemExit)rdistrJ/home/nabil/Git/sunpy/astropy_helpers/astropy_helpers/distutils_helpers.pyget_dummy_distributions   rcCsDt}x8|D],}|jj|}|dk r ||kr ||dSq WdSdS)ap Returns the value of the given distutils option. Parameters ---------- option : str The name of the option commands : list of str The list of commands on which this option is available Returns ------- val : str or None the value of the given distutils option. If the option is not set, returns None. Nr)rcommand_optionsget)optioncommandsrcmdZcmd_optsrrrget_distutils_option8s   r!cCst|dddgS)a! Returns the value of the given distutils build option. Parameters ---------- option : str The name of the option Returns ------- val : str or None The value of the given distutils build option. If the option is not set, returns None. build build_ext build_clib)r!)rrrrget_distutils_build_optionTsr%cCs t|dgS)a# Returns the value of the given distutils install option. Parameters ---------- option : str The name of the option Returns ------- val : str or None The value of the given distutils build option. If the option is not set, returns None. install)r!)rrrrget_distutils_install_optionesr'cCst|ddddgS)a7 Returns the value of the given distutils build or install option. Parameters ---------- option : str The name of the option Returns ------- val : str or None The value of the given distutils build or install option. If the option is not set, returns None. r"r#r$r&)r!)rrrr%get_distutils_build_or_install_optionvs r(cCstd}|dkrtjS|S)a Determines the compiler that will be used to build extension modules. Returns ------- compiler : str The compiler option specified for the build, build_ext, or build_clib command; or the default compiler for the platform if none was specified. compilerN)r%rget_default_compiler)r)rrrget_compiler_options r+Fc Cst}|j|}t|dr(||jkr(dS|jdd}t||rPtdj|||xTt|jD]F\}}|d|kr\t j dj|||j|=||j kr|j j |Pq\W|jj |d|f|r|j j |t||dt|dst|g|_n |jj|dS)a Add a custom option to a setup command. Issues a warning if the option already exists on that command. Parameters ---------- command : str The name of the command as given on the command line name : str The name of the build option doc : str A short description of the option, for the `--help` message is_bool : bool, optional When `True`, the option is a boolean option and doesn't require an associated value. _astropy_helpers_optionsN-_zc{0!r} already has a {1!r} class attribute, barring {2!r} from being usable as a custom option name.rz&Overriding existing {0!r} option {1!r})rget_command_classhasattrr,replacer format enumerate user_optionsrwarnboolean_optionsremoveappendsetattrsetadd) commandnamedocis_boolrcmdclsattridxr rrradd_command_options2             rCcCs`tddtjD}tddtjD}|jd|jdtdddd d d g}|j|j|S) aG Returns a set of all the distutils display options in their long and short forms. These are the setup.py arguments such as --name or --version which print the project's metadata and then exit. Returns ------- opts : set The long and short form display option arguments, including the - or -- css"|]}|drd|dVqdS)rr-Nr).0orrr sz0get_distutils_display_options..css|]}d|dVqdS)z--rNr)rDrErrrrFsz-hz--helpcleanregisterZsetoptZsaveoptsegg_infoalias)r:rdisplay_optionsr;union)Zshort_display_optsZlong_display_optsZdisplay_commandsrrrget_distutils_display_optionss    rMcCs"t}tttjddj|S)zm Returns True if sys.argv contains any of the distutils display options such as --version or --name. rN)rMboolr:rr intersection)rKrrris_distutils_display_optionsrP)F)__doc__r r distutilsrrdistutils.distrdistutils.errorsrutilsrrr!r%r'r(r+rCrMrPrrrr s   ! Asunpy-0.8.3/astropy_helpers/astropy_helpers/__pycache__/git_helpers.cpython-36.pyc0000644000175000001440000001024313212200427027664 0ustar nabil000000000000003 )Z@@sNdZddlZddlZddlZddlZddZd ddZdd d Zdd d ZdS)zP Utilities for retrieving revision information from a project's git repository. NcCs`ytjdpd}Wntk r,d}YnXy|j|}Wntk rZ|jd}YnX|S)Nzutf-8latin1)localegetdefaultlocale ValueErrordecodeUnicodeDecodeError)streamstdio_encodingtextr D/home/nabil/Git/sunpy/astropy_helpers/astropy_helpers/git_helpers.py _decode_stdios rc Csjytdd|d}Wntk r&|SX|s0|Sd|krb|jddd}tdd|d}|d|S|SdS) z Updates the git revision string if and only if the path is being imported directly from a git working copy. This ensures that the revision number in the version string is accurate. TF)sha show_warningpathdevz.devrrN)get_git_devstrOSErrorsplit)versionrZdevstrZ version_baser r r update_git_devstr"s rFTcsdkrtjtjjs0tjjtjj|r>ddg}n dddg}fdd}||\}}}| rv|dkrvd S| r|d krdd d dg}||\}}}|d krt|jdSdSn |rt|ddSt|j SdS)a Determines the number of revisions in this repository. Parameters ---------- sha : bool If True, the full SHA1 hash will be returned. Otherwise, the total count of commits in the repository will be used as a "revision number". show_warning : bool If True, issue a warning if git returns an error code, otherwise errors pass silently. path : str or None If a string, specifies the directory to look in to find the git repository. If `None`, the current working directory is used, and must be the root of the git repository. If given a filename it uses the directory containing that file. Returns ------- devversion : str Either a string with the revision number (if `sha` is False), the SHA1 hash of the current commit (if `sha` is True), or an empty string if git version info could not be identified. Nz rev-parseHEADzrev-listz--countcsy0tjdg|tjtjtjd}|j\}}Wn6tk rf}zrXtjdt|d Sd}~XnX|jdkrrtjdj |jddfS|jdkrrtjdj |d |j||fS|jd krrtjd j t ||j||fS|j||fS) Ngit)cwdstdoutstderrstdinzError running git: z>No git repository present at {0!r}! Using default dev version.zQYour git looks old (does it support {0}?); consider upgrading to v1.7.2 or later.rz0Git failed while determining revision count: {0})Nrr) subprocessPopenPIPE communicaterwarningswarnstr returncodeformatr)cmdprre)rrr r run_gitgs4         zget_git_devstr..run_gitr0r z--abbrev-commitz --abbrev=0r () osgetcwdrisdirabspathdirnamer'countrstrip)rrrr*r-r(rrr )rrr r=s(    rcCstjj|r"tjjtjj|}ntjj|rs  fsunpy-0.8.3/astropy_helpers/astropy_helpers/__pycache__/setup_helpers.cpython-36.pyc0000644000175000001440000005173213212200427030251 0ustar nabil000000000000003 )Zl@sdZddlmZmZddlZddlZddlZddlZddlZddl Z ddl Z ddl m Z ddl mZddlmZmZddlmZddlmZdd lmZdd lmZd d lmZmZmZmZm Z d d l!m"Z"d dl#m$Z$m%Z%m&Z&m'Z'm(Z(d dl)m*Z*d dl+m,Z,d dl-m.Z.d dl/m0Z0d dl1m2Z2d dl3m4Z4d dl#m5Z5m6Z6d dl)m7Z7m8Z8ddde9ddZ:yddl;Z;de:d<Wnfedkre j?dWYddZ=[=Xn*e@k rYneAk rYnXejBddkZCge_DddZEd d!ZFd"d#ZGdHd%d&ZHdId'd(ZId)d*ZJd+d,ZKd-d.ZLd/d0ZMd$ffd1d2ZNd3d4ZOd5d6ZPeQdfd7d8ZRGd9d:d:ejSZTdJdd?ZVd@dAZWe&ed$fdfdBdCZdDdEZXGdFdGdGeZYdS)Kzx This module contains a number of utilities for use during setup/build/packaging that are useful to astropy as a whole. )absolute_importprint_functionN)log) Distribution)DistutilsOptionErrorDistutilsModuleError) Extension)Command)sdist) find_packages)add_command_optionget_compiler_optionget_dummy_distributionget_distutils_build_option%get_distutils_build_or_install_option)get_pkg_version_module)walk_skip_hidden import_file extends_doc resolve_nameAstropyDeprecationWarning)generate_build_ext_command)AstropyBuildPy)AstropyInstall)AstropyInstallLib)AstropyRegister) AstropyTest)get_numpy_include_pathwrite_if_different)should_build_with_cythonget_compiler_versionF)registered_commands have_sphinx package_cacheexclude_packagesexcludes_too_lateTr#zunknown localeaPossible misconfiguration of one of the environment variables LC_ALL, LC_CTYPES, LANG, or LANGUAGE. For an example of how to configure your system's language environment on OSX see http://blog.remibergsma.com/2012/07/10/setting-locales-correctly-on-mac-osx-terminal-application/cCstjdtdS)a This function detects broken compilers and switches to another. If the environment variable CC is explicitly set, or a compiler is specified on the commandline, no override is performed -- the purpose here is to only override a default compiler. The specific compilers with problems are: * The default compiler in XCode-4.2, llvm-gcc-4.2, segfaults when compiling wcslib. The set of broken compilers can be updated by changing the compiler_mapping variable. It is a list of 2-tuples where the first in the pair is a regular expression matching the version of the broken compiler, and the second is the compiler to change to. zDirect use of the adjust_compiler function in setup.py is deprecated and can be removed from your setup.py. This functionality is now incorporated directly into the build_ext command.N)warningswarnr)packager+F/home/nabil/Git/sunpy/astropy_helpers/astropy_helpers/setup_helpers.pyadjust_compilerOsr-c syt|dgdd}Wnttfk r2d}YnXttfddd Dr^ttd}nt|}|dk r||krjd}d |_|S) z Determines if the build is in debug mode. Returns ------- debug : bool True if the current build was started with the debug option, False otherwise. debug)fromlistrNc3s|]}|jkVqdS)N)commands).0cmd)distr+r, }sz#get_debug_option..build build_extT)r5r6) r ImportErrorAttributeErrorranyboolrget_command_classZ force_rebuild) packagenameZ current_debugr.Z build_ext_cmdr+)r3r,get_debug_optionis   r=cCs&tdrtdtdjt|dS)Nr&zyadd_package_excludes must be called before all other setup helper functions in order to properly handle excluded packagesr%) _module_state RuntimeErroraddset)Zexcludesr+r+r,add_exclude_packagessrB.c Cstddk rtdStdrPyddlm}m}WqXtk rLt}}YqXXnt}}t|tt||t t t t ||d td<}x|j D]\}}||_qWx$d D]} td| td| qWt||d |S)Nr"r#r )AstropyBuildSphinxAstropyBuildDocs) testr r6build_pyinstall install_libregisterZ build_sphinxZ build_docsuse-system-libraries&Use system libraries whenever possibleTr5rH)srcdirrKrLT)rN)r5)rH)r>Zcommands.build_sphinxrDrEr7FakeBuildSphinxgenerate_test_commandDistutilsSdistrrrrritems__name__r add_command_hooks) r*versionreleaserMrDrEr"nameclsoptionr+r+r,register_commandss4    rZcCstjd}dd}tt|}t}tjt}xt||D]r}xlt |j D]\\}} |j |} | sdqL| j d} | j d} | || krg|| | <|| | j |j| fqLWq:Wx*|j D]\} } t| |j| | || <qWdS)a Look through setup_package.py modules for functions with names like ``pre__hook`` and ``post__hook`` where ```` is the name of a ``setup.py`` command (e.g. build_ext). If either hook is present this adds a wrapped version of that command to the passed in ``commands`` `dict`. ``commands`` may be pre-populated with other custom distutils command classes that should be wrapped if there are hooks for them (e.g. `AstropyBuildPy`). z^(pre|post)_(.+)_hook$cSst|dr|jS|jSdS)N command_name)hasattrr[rS)Zcmdclsr+r+r,get_command_names z+add_command_hooks..get_command_namer N)recompilefilter_packagesr r collections defaultdictdictiter_setup_packagesvarsrRmatchgroupappendrSgenerate_hooked_commandr;)r0rMZhook_rer]packagesr3hookssetuppkgrWobjrgZ hook_typecmd_nameZ cmd_hooksr+r+r,rTs$         rTc Cs8|jfdd}t||tf|t|jdg|jdgdS)z Returns a generated subclass of ``cmd_cls`` that runs the pre- and post-command hooks for that command before and after the ``cmd_cls.run`` method. cSs |jd|||jddS)N pre_hooks post_hooks)run_command_hooks)selfZorig_runr+r+r,runs z$generate_hooked_command..runprepost)rtrrrprq)rttypeobjectrrget)roZcmd_clsrlrtr+r+r,rjs   rjcCst||d}|sdSx|D]\}}t|trny t|}Wqrtk rj}ztdj||WYdd}~XqrXn|}t|std|t j dj|j d||j y ||Wqt k rt jdj|j|j t jtjtjdYqXqWdS)zRun hooks registered for that command and phase. *cmd_obj* is a finalized command object; *hook_kind* is either 'pre_hook' or 'post_hook'. Nzcannot find hook {0}: {1}zhook {0!r} is not callablez$running {0} from {1} for {2} commandsz-{0} command hook {1} raised an exception: %s r )getattr isinstancestrrr7rformatcallablerrinforstripr] ExceptionerrorrS traceback format_excsysexit)cmd_objZ hook_kindrlmodnamehookZhook_objexcr+r+r,rrs,   "  rrcCst|jdtfd|iS)z Creates a custom 'test' command for the given package which sets the command's ``package_name`` class attribute to the name of the package being tested. ZTest package_name)rwtitler)rr+r+r,rP6srPcCsJt|}|j|d|j|dtt||d}|j|ddS)z This function is deprecated and maintained for backward compatibility with affiliated packages. Affiliated packages should update their setup.py to use `get_package_info` instead. ext_modules package_datark package_dirN)get_package_infoextendupdatelistrA)rM extensionsr packagenamesZ package_dirsrr+r+r,update_package_filesAs rcCsg}g}i}i}g}|r$tjdttt||d}|dkrD||d<xt||D]}t|dr|j}x|D]} td| qlWt|dr|j } x| D] } t | qWt|dr|j } nd } | sP|j t jj|jqPWxDt||D]6}t|d r|j|jt|d r|j|jqW|jt|||d gx0ttt|D]\} }|jd krJ|| =qJWtdkrx|D]}|jj dq|W|||||dS)a Collates all of the information for building all subpackages and returns a dictionary of keyword arguments that can be passed directly to `distutils.setup`. The purpose of this function is to allow subpackages to update the arguments to the package's ``setup()`` function in its setup.py script, rather than having to specify all extensions/package data directly in the ``setup.py``. See Astropy's own ``setup.py`` for example usage and the Astropy development docs for more details. This function obtains that information by iterating through all packages in ``srcdir`` and locating a ``setup_package.py`` module. This module can contain the following functions: ``get_extensions()``, ``get_package_data()``, ``get_build_options()``, ``get_external_libraries()``, and ``requires_2to3()``. Each of those functions take no arguments. - ``get_extensions`` returns a list of `distutils.extension.Extension` objects. - ``get_package_data()`` returns a dict formatted as required by the ``package_data`` argument to ``setup()``. - ``get_build_options()`` returns a list of tuples describing the extra build options to add. - ``get_external_libraries()`` returns a list of libraries that can optionally be built using external dependencies. - ``get_entry_points()`` returns a dict formatted as required by the ``entry_points`` argument to ``setup()``. - ``requires_2to3()`` should return `True` when the source code requires `2to3` processing to run on Python 3.x. If ``requires_2to3()`` is missing, it is assumed to return `True`. zUse of the exclude parameter is no longer supported since it does not work as expected. Use add_exclude_packages instead. Note that it must be called prior to any other calls from setup helpers.)excluderCget_build_optionsr5get_external_libraries requires_2to3Tget_extensionsget_package_datanumpyZ skip_cythonmsvcz /MANIFEST)rrkrr skip_2to3)r5)r(r)rrar rer\rr radd_external_libraryrriospathdirname__file__rrrrget_cython_extensionsreversedr enumeraterWrextra_link_args)rMrrrkrrrrmoptionsrY librarieslibraryriextr+r+r,rPsZ+               rccsfx`|D]X}|jd}tjj|f|}tjjtjj|d}tjj|rt||dd}|VqWdS)a6 A generator that finds and imports all of the ``setup_package.py`` modules in the source packages. Returns ------- modgen : generator A generator that yields (modname, mod), where `mod` is the module and `modname` is the module name for the ``setup_package.py`` modules. rCzsetup_package.pyz.setup_package)rWN)splitrrjoinrelpathisfiler)rMrkr< package_parts package_pathZ setup_packagemoduler+r+r,res    reccslxft|D]Z\}}}xL|D]D}|jdrtjjtjj||}dj||ddg}||fVqWPq WdS)a A generator that yields Cython source files (ending in '.pyx') in the source packages. Returns ------- pyxgen : generator A generator that yields (extmod, fullfn) where `extmod` is the full name of the module that the .pyx file would live in based on the source directory structure, and `fullfn` is the path to the .pyx file. z.pyxrCN)rendswithrrrr)rrdirpathdirnames filenamesfnZfullfnextmodr+r+r,iter_pyx_filess   rcCsg}g}xH|D]@}x:|jD]0}|jdrtjjtjj|d}|j|qWqWxv|D]n} | jd} tjj|f| } xLt | | D]>\} } tjjtjj| d}||kr|jt | | g|dqWqXW|S)a Looks for Cython files and generates Extensions if needed. Parameters ---------- srcdir : str Path to the root of the source directory to search. prevextensions : list of `~distutils.core.Extension` objects The extensions that are already defined. Any .pyx files already here will be ignored. extincludedirs : list of str or None Directories to include as the `include_dirs` argument to the generated `~distutils.core.Extension` objects. Returns ------- exts : list of `~distutils.core.Extension` objects The new extensions that are needed to compile all .pyx files (does not include any already in `prevextensions`). .pyx.c.cpprrC) include_dirs)rrr) sourcesrrrrealpathsplitextrirrrr)rMrkZprevextensionsZextincludedirsZprevsourcepathsrrrzZ sourcepathrrrrZpyxfnr+r+r,rs       rcs(eZdZdZfddZddZZS)DistutilsExtensionArgsz A special dictionary whose default values are the empty list. This is useful for building up a set of arguments for `distutils.Extension` without worrying whether the entry is already present. cs$dd}tt|j|f||dS)NcSsgS)Nr+r+r+r+r,default_factory3sz8DistutilsExtensionArgs.__init__..default_factory)superr__init__)rsargskwargsr) __class__r+r,r2s zDistutilsExtensionArgs.__init__cCs(x"|jD]\}}||j|q WdS)N)rRr)rsotherkeyvalr+r+r,r9szDistutilsExtensionArgs.update)rS __module__ __qualname____doc__rr __classcell__r+r+)rr,r*s r pkg-configc Csdddddd}dj|dj|f}t}y&tj|d tjd }|jd j}Wnltjk r}zNd j|d j|j dj|j dj|j g} t j dj| |dj|WYdd}~XnX|j d krdjdj|dg} t j dj| |dj|nx|jD]t} | ddjd} | ddjtj} | |krj| dkrVt| jdd} ||| j| n|dj| qW|S)a Uses pkg-config to update a set of distutils Extension arguments to include the flags necessary to link against the given packages. If the pkg-config lookup fails, default_libraries is applied to libraries. Parameters ---------- packages : list of str A list of pkg-config packages to look up. default_libraries : list of str A list of library names to use if the pkg-config lookup fails. Returns ------- config : dict A dictionary containing keyword arguments to `distutils.Extension`. These entries include: - ``include_dirs``: A list of include directories - ``library_dirs``: A list of library directories - ``libraries``: A list of libraries - ``define_macros``: A list of macro defines - ``undef_macros``: A list of macros to undefine - ``extra_compile_args``: A list of extra arguments to pass to the compiler r library_dirsr define_macros undef_macros)z-Iz-Lz-lz-Dz-Uz{0} --libs --cflags {1} T)shellstdoutrz3{0} failed. This may cause the build to fail below.z command: {0}z returncode: {0}z output: {0} Nz.pkg-config could not lookup up package(s) {0}.z, z'This may cause the build to fail below.r^asciiz-D=r extra_compile_args)r~rr subprocessPopenPIPE communicatestripCalledProcessErrorr2 returncodeoutputrr)rrdecodergetfilesystemencodingtupleri) rkZdefault_libraries executableZflag_mapcommandresultpiperelinestokenargvaluer+r+r, pkg_config>s<        rcCs0x*d D]"}t|td|dj|ddqWdS) z Add a build option for selecting the internal or system copy of a library. Parameters ---------- library : str The name of the library. If the library is `foo`, the build option will be called `--use-system-foo`. r5r6rHz use-system-zUse the system {0} libraryT)Zis_boolN)r5r6rH)r r}r~)rrr+r+r,rs rcCstdj|ptdS)a Returns `True` if the build configuration indicates that the given library should use the system copy of the library rather than the internal one. For the given library `foo`, this will be `True` if `--use-system-foo` or `--use-system-libraries` was provided at the commandline or in `setup.cfg`. Parameters ---------- library : str The name of the library Returns ------- use_system : bool `True` if the build should use the system copy of the library. zuse_system_{0}Zuse_system_libraries)rr~)rr+r+r,use_system_librarysrcCsR|rtjdtdtd<| r2tddk r2tdSt|ttdd}|td<|S)z This version of ``find_packages`` caches previous results to speed up subsequent calls. Use ``invalide_cache=True`` to ignore cached results from previous ``find_packages`` calls, and repeat the package search. zUse of the exclude parameter is no longer supported since it does not work as expected. Use add_exclude_packages instead. Note that it must be called prior to any other calls from setup helpers.Tr&r$Nr%)wherer)r(r)rr>_find_packagesr)rrZinvalidate_cacherkr+r+r,r sr cs tr dndfdd|DS)zw Removes some packages from the package list that shouldn't be installed on the current version of Python. Z_py2Z_py3csg|]}|js|qSr+)r)r1x)rr+r, sz#filter_packages..)PY3)rr+)rr,rasrac @sZeZdZdZdd d!d"d#d$d%d&d'd(d)g Zejd*ejd+ejd,ejd-ddZd S).rOzz A dummy build_sphinx command that is called if Sphinx is not installed and displays a relevant error message fresh-envEr all-filesa source-dir=rz build-dir=N config-dir=cbuilder=bproject=version=release=today= link-indexrwarnings-returncodew clean-docslno-intersphinxnopen-docs-in-browseroc Cs2y tdWn tjdtjdYnXdS)Nz=Sphinx and its dependencies must be installed for build_docs.zDerror: Sphinx and its dependencies must be installed for build_docs.r )r?rrrr)rsr+r+r,initialize_optionss   z"FakeBuildSphinx.initialize_options)rrr)rrr)rrzr)rNr)rrr)rrr)rNr)rNr)rNr)rNr)r rr)r r r)r r r)rrr)rrr)rSrrr user_optionsrirr+r+r+r,rOs"    rO)rC)rC)r)Zr __future__rrrbrr_rrrr( distutilsrdistutils.distrdistutils.errorsrrdistutils.corerr distutils.command.sdistr rQ setuptoolsr rZdistutils_helpersr rrrrZversion_helpersrutilsrrrrrZcommands.build_extrZcommands.build_pyrZcommands.installrZcommands.install_librZcommands.registerrZ commands.testrrrr r!rAr>Zsphinx ValueErrorrrr)r7 SyntaxError version_inforrr-r=rBrZrTrjrrrPrrrerrrrcrrrrrarOr+r+r+r,s                = /% x 1 Psunpy-0.8.3/astropy_helpers/astropy_helpers/__pycache__/utils.cpython-36.pyc0000644000175000001440000005521613212200427026530 0ustar nabil000000000000003 )Zi @sddlmZmZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z yddl mZeeds|dZWnek rdZYnXejddd9krddl mZndd ZejddkreefZnefZGd d d eZGd d d eZGdddeeZddZddZGdddeZej ddZ!ej"dkr\ddl#Z#ddZ$nddZ$ddZ%d:dd Z&d!d"Z'd;d#d$Z(d%d&Z)ejddkrd'd(Z*nd)d(Z*d*d+Z+dd3d4Z.Gd5d6d6e/Z0d7d8Z1dS)?)absolute_importunicode_literalsN) machinery SourceLoader)invalidate_cachescCsdS)Nr r r >/home/nabil/Git/sunpy/astropy_helpers/astropy_helpers/utils.pyrsrc@seZdZdZdS)AstropyWarningz The base warning class from which all Astropy warnings should inherit. Any warning inheriting from this class is handled by the Astropy logger. N)__name__ __module__ __qualname____doc__r r r r r ,sr c@seZdZdZdS)AstropyDeprecationWarningz; A warning class to indicate a deprecated feature. N)r r rrr r r r r4src@seZdZdZdS) AstropyPendingDeprecationWarningzF A warning class to indicate a soon-to-be deprecated feature. N)r r rrr r r r r:srcCs,dj|jtjdd}tjj|jd|S)z Given a build command, return the name of the appropriate platform-specific build subdirectory directory (e.g. build/lib.linux-x86_64-2.7) z.{0}-{1}rrlib)format plat_namesysversionospathjoin build_base)cmdZplat_specifierr r r _get_platlib_dirAsrc Cstjddkr@ddl}t|dr$|`ddl}ddl}|j|n&ddl}t|drV|`ddl}t|y |j }Wnt k r|j }YnX|S)z- Gets the path to the numpy headers. rrN__NUMPY_SETUP__) r version_infobuiltinshasattrrimpnumpyreload __builtin__ get_includeAttributeErrorZget_numpy_include)rr!r"r$Z numpy_includer r r get_numpy_include_pathKs"     r'c@s$eZdZdZdZddZddZdS) _DummyFilezA noop writeable object.cCsdS)Nr )selfsr r r writensz_DummyFile.writecCsdS)Nr )r*r r r flushqsz_DummyFile.flushN)r r rrerrorsr,r-r r r r r(isr(c cs^tj}tj}tt_tt_d}y dVWnd}|t_|t_YnX|sZ|t_|t_dS)z:A context manager that silences sys.stdout and sys.stderr.FNT)rstdoutstderrr() old_stdout old_stderrexception_occurredr r r silenceus r4win32c Csdt|tr|jtj}y*tjjj|}|dks4t t |d@}Wnt t fk r^d}YnX|S)z Returns True if the given filepath has the hidden attribute on MS-Windows. Based on a post here: http://stackoverflow.com/questions/284115/cross-platform-hidden-file-detection rF) isinstancebytesdecodergetfilesystemencodingctypeswindllkernel32ZGetFileAttributesWAssertionErrorboolr&)filepathattrsresultr r r _has_hidden_attributes   rDcCsdS)NFr )rAr r r rDscCs@tjjtjj|}t|tr*|jd}n |jd}|p>t|S)z Determines if a given file or directory is hidden. Parameters ---------- filepath : str The path to a file or directory Returns ------- hidden : bool Returns `True` if the file is hidden ..)rrbasenameabspathr8r9 startswithrD)rAnameZ is_dottedr r r is_path_hiddens    rKFccs^xXtj|d||dD]B\}}}dd|D|dd<dd|D|dd<|||fVqWdS)a3 A wrapper for `os.walk` that skips hidden files and directories. This function does not have the parameter `topdown` from `os.walk`: the directories must always be recursed top-down when using this function. See also -------- os.walk : For a description of the parameters T)topdownonerror followlinkscSsg|]}t|s|qSr )rK).0dr r r sz$walk_skip_hidden..NcSsg|]}t|s|qSr )rK)rOfr r r rQs)rwalk)toprMrNrootdirsfilesr r r walk_skip_hiddens rXcCsjt|tsttjj|r:t|d}|j}WdQRXnd}||krft|d}|j|WdQRXdS)zWrite `data` to `filename`, if the content of the file is different. Parameters ---------- filename : str The file name to be written to. data : bytes The data to be written to `filename`. rbNwb) r8r9r?rrexistsopenreadr,)filenamedatafdZ original_datar r r write_if_differents    racCstjddkrdnd}|dkrPtjj|d}djtjj|jtjdd}t rjt j ||}|j }n,t ||}t j |||d|df}WdQRX|S) z Imports a module from a single file as if it doesn't belong to a particular package. The returned module will have the optional ``name`` if given, or else a name generated from the filename. rrUrN_r6z.py)rrrrsplitextrrelpathsplitsepimport_machinerySourceFileLoader load_moduler\r!)r^rJmoderGloadermodr`r r r import_files"    roc Cs|jd}t|d}|d|}|d}xf|dkrytdj||gd}PWq,tk r|dkrh|d8}|d|}||}d}Yq,Xq,Wx@||dD]0}yt||}Wqtk rt|YqXqW|S)zResolve a name like ``module.object`` to an object and return it. Raise `ImportError` if the module or name is not found. rFr6Nr)fromlistr)r7)rglen __import__r ImportErrorgetattrr&)rJpartscursor module_name attr_nameretpartr r r resolve_names*     r{cCs|jS)N)items) dictionaryr r r iteritems)sr~cCs|jS)N)r~)r}r r r r~,scsfdd}|S)a A function decorator for use when wrapping an existing function but adding additional functionality. This copies the docstring from the original function, and appends to it (along with a newline) the docstring of the wrapper function. Example ------- >>> def foo(): ... '''Hello.''' ... >>> @extends_doc(foo) ... def bar(): ... '''Goodbye.''' ... >>> print(bar.__doc__) Hello. Goodbye. cs8jdkp|jdks4djjjd|jjdg|_|S)Nz  )rrrstriplstrip)func) extended_funcr r decoratorHszextends_doc..decoratorr )rrr )rr extends_doc0s rr)cstttjffddfddfddfdd|||ffd d t|tkr~|SS) aK Used to mark a function or class as deprecated. To mark an attribute as deprecated, use `deprecated_attribute`. Parameters ------------ since : str The release at which this API became deprecated. This is required. message : str, optional Override the default deprecation message. The format specifier ``func`` may be used for the name of the function, and ``alternative`` may be used in the deprecation message to insert the name of an alternative to the deprecated function. ``obj_type`` may be used to insert a friendly name for the type of object being deprecated. name : str, optional The name of the deprecated function or class; if not provided the name is automatically determined from the passed in function or class, though this is useful in the case of renamed functions, where the new function is just assigned to the name of the deprecated function. For example:: def new_function(): ... oldFunction = new_function alternative : str, optional An alternative function or class name that the user may use in place of the deprecated object. The deprecation warning will tell the user about this alternative if provided. pending : bool, optional If True, uses a AstropyPendingDeprecationWarning instead of a AstropyDeprecationWarning. obj_type : str, optional The type of this object, if the automatically determined one needs to be overridden. cs>|sd}tj|jd}d|jd|}|s:|d7}|S)z_ Returns a given docstring with a deprecation message prepended to it. r)rz, .. deprecated:: %(since)s %(message)s )sincemessagez\ )textwrapdedentstrip)old_docrnew_doc)rr r deprecate_docsz!deprecated..deprecate_doccst|r|j}|S)zt Given a function or classmethod (or other function wrapper type), get the function object. )r8__func__)r) method_typesr r get_functions z deprecated..get_functioncsntrt}ndd}fdd}tttjdkrXtj|}|j|_||S)zv Returns a wrapped function that displays an ``AstropyDeprecationWarning`` when it is called. cSs|S)Nr )rRr r r sz8deprecated..deprecate_function..cs(r t}nt}tj|dd||S)Nr) stacklevel)rrwarningswarn)argskwargscategory)rrpendingr r deprecated_funcs z?deprecated..deprecate_function..deprecated_func__add__)r8typestr__dict__ functoolswrapsr)rr func_wrapperr)rrrr)rrr deprecate_functions   z&deprecated..deprecate_functioncs>|jj}|j|j||j|dt|j|j|S)z Returns a wrapper class with the docstrings updated and an __init__ function that will raise an ``AstropyDeprectationWarning`` warning when called. )r__init__)rcopyupdaterrrr __bases__)clsrmembers)rrrr r deprecate_classs     z#deprecated..deprecate_classcsdkrHt|trd}qLtj|r(d}qLtj|s.deprecate) classmethod staticmethodtypes MethodTyper)rrrJrrrr ) rrrrrrrrrr deprecatedTs.   # 'rcsbd|t||ddfdd}t||ddfdd}t||ddfdd }t|||S) aq Used to mark a public attribute as deprecated. This creates a property that will warn when the given attribute name is accessed. To prevent the warning (i.e. for internal code), use the private name for the attribute by prepending an underscore (i.e. ``self._name``). Parameters ---------- name : str The name of the deprecated attribute. since : str The release at which this API became deprecated. This is required. message : str, optional Override the default deprecation message. The format specifier ``name`` may be used for the name of the attribute, and ``alternative`` may be used in the deprecation message to insert the name of an alternative to the deprecated function. alternative : str, optional An alternative attribute that the user may use in place of the deprecated attribute. The deprecation warning will tell the user about this alternative if provided. pending : bool, optional If True, uses a AstropyPendingDeprecationWarning instead of a AstropyDeprecationWarning. Examples -------- :: class MyClass: # Mark the old_name as deprecated old_name = misc.deprecated_attribute('old_name', '0.1') def method(self): self._old_name = 42 rd attribute)rJrcs t|S)N)rt)r*) private_namer r get?sz!deprecated_attribute..getcst||dS)N)setattr)r*val)rr r setCsz!deprecated_attribute..setcst|dS)N)delattr)r*)rr r deleteGsz$deprecated_attribute..delete)rproperty)rJrrrrrrrr )rr deprecated_attributes .rT __version__cCst|tjr|j}n@t|trF|}y t|}WqTtk rBdSXntdj|d|krht ||}ntdj |j|g}yddl m }Wn tk rddl m}YnX|r||||kS||||kSdS)a^ Returns `True` if the specified Python module satisfies a minimum version requirement, and `False` if not. By default this uses `pkg_resources.parse_version` to do the version comparison if available. Otherwise it falls back on `distutils.version.LooseVersion`. Parameters ---------- module : module or `str` An imported module of which to check the version, or the name of that module (in which case an import of that module is attempted-- if this fails `False` is returned). version : `str` The version as a string that this module must have at a minimum (e.g. ``'0.12'``). inclusive : `bool` The specified version meets the requirement inclusively (i.e. ``>=``) as opposed to strictly greater than (default: `True`). version_path : `str` A dotted attribute path to follow in the module for the version. Defaults to just ``'__version__'``, which should work for most Python modules. Examples -------- >>> import astropy >>> minversion(astropy, '0.4.4') True Fz^module argument must be an actual imported module, or the import name of the module; got {0!r}rFr) parse_version) LooseVersionN)r8r ModuleTyper string_typesr{rs ValueErrorrrtr pkg_resourcesrdistutils.versionr)modulerZ inclusiveZ version_pathrwZ have_versionrr r r minversionNs(&    rcsfeZdZdZdfdd Zdfdd Zdfdd Zfd d Zd d ZddZ e ddZ Z S) classpropertya1 Similar to `property`, but allows class-level properties. That is, a property whose getter is like a `classmethod`. The wrapped method may explicitly use the `classmethod` decorator (which must become before this decorator), or the `classmethod` may be omitted (it is implicit through use of this decorator). .. note:: classproperty only works for *read-only* properties. It does not currently allow writeable/deleteable properties, due to subtleties of how Python descriptors work. In order to implement such properties on a class a metaclass for that class must be implemented. Parameters ---------- fget : callable The function that computes the value of this property (in particular, the function when this is used as a decorator) a la `property`. doc : str, optional The docstring for the property--by default inherited from the getter function. lazy : bool, optional If True, caches the value returned by the first call to the getter function, so that it is only called once (used for lazy evaluation of an attribute). This is analogous to `lazyproperty`. The ``lazy`` argument can also be used when `classproperty` is used as a decorator (see the third example below). When used in the decorator syntax this *must* be passed in as a keyword argument. Examples -------- :: >>> class Foo(object): ... _bar_internal = 1 ... @classproperty ... def bar(cls): ... return cls._bar_internal + 1 ... >>> Foo.bar 2 >>> foo_instance = Foo() >>> foo_instance.bar 2 >>> foo_instance._bar_internal = 2 >>> foo_instance.bar # Ignores instance attributes 2 As previously noted, a `classproperty` is limited to implementing read-only attributes:: >>> class Foo(object): ... _bar_internal = 1 ... @classproperty ... def bar(cls): ... return cls._bar_internal ... @bar.setter ... def bar(cls, value): ... cls._bar_internal = value ... Traceback (most recent call last): ... NotImplementedError: classproperty can only be read-only; use a metaclass to implement modifiable class-level properties When the ``lazy`` option is used, the getter is only called once:: >>> class Foo(object): ... @classproperty(lazy=True) ... def bar(cls): ... print("Performing complicated calculation") ... return 1 ... >>> Foo.bar Performing complicated calculation 1 >>> Foo.bar 1 If a subclass inherits a lazy `classproperty` the property is still re-evaluated for the subclass:: >>> class FooSub(Foo): ... pass ... >>> FooSub.bar Performing complicated calculation 1 >>> FooSub.bar 1 NFcs*|dkrfdd}|SttjS)Ncs |dS)N)lazyr )r)rrr r wrappersz&classproperty.__new__..wrapper)superr__new__)rfgetdocrr) __class__)rrr rszclassproperty.__new__cs@||_|ri|_|j|}tt|j||d|dk r<||_dS)N)rr)_lazy_cache _wrap_fgetrrrr)r*rrr)rr r rs zclassproperty.__init__csf|jr||jkr|j|S|dk r0|jj|}ntt|j||d}|jrb|dkrX|j}||j|<|S)N)objtype)rrr __wrapped__rr__get__r)r*rrr)rr r rs  zclassproperty.__get__cstt|j|j|S)N)rrgetterr)r*r)rr r r"szclassproperty.gettercCs tddS)Nzcclassproperty can only be read-only; use a metaclass to implement modifiable class-level properties)NotImplementedError)r*fsetr r r setter%szclassproperty.settercCs tddS)Nzcclassproperty can only be read-only; use a metaclass to implement modifiable class-level properties)r)r*fdelr r r deleter*szclassproperty.deletercs0ttrjtjfdd}|_|S)Ncs |jS)N)r)r) orig_fgetr r r7sz&classproperty._wrap_fget..fget)r8rrrrr)rrr )rr r/s  zclassproperty._wrap_fget)NNF)NF)N) r r rrrrrrrrrr __classcell__r r )rr rs`  rc Cstjddd kr*tjtjj||ddSd|kr|jd\}}|jdtjfr\|d d}tjtjj|||}xJtj tjj||D]2\}}}x&|D]}|tjtjj|||7}qWqW|Stjtjj||SdS) a Include files matching ``pattern`` inside ``package``. Parameters ---------- package : str The package inside which to look for data files pattern : str Pattern (glob-style) to match for the data files (e.g. ``*.dat``). This supports the Python 3.5 ``**``recursive syntax. For example, ``**/*.fits`` matches all files ending with ``.fits`` recursively. Only one instance of ``**`` can be included in the pattern. NrrT) recursivez**/r6)rr) rrglobrrrrgrIrhrS) packagepatternstartendmatchesrUrVrWdirnamer r r find_data_filesAs   "r)rr)NF)N)r)r)r)FN)NNF)Tr)2 __future__rr contextlibrr!rrrrrrr importlibrrir rsrrrunicoderWarningr rPendingDeprecationWarningrrr'rr(contextmanagerr4platformr<rDrKrXraror{r~rrrrrrrr r r r sh             $ ; > D0sunpy-0.8.3/astropy_helpers/astropy_helpers/__pycache__/version.cpython-36.pyc0000644000175000001440000000114513203277317027061 0ustar nabil000000000000003 ~ Z@sddlmZddlZdZdZdZdZdZdZejddd d d d Z d Z yddl m Z Wne k rldZ YnXyddlmZWne k rdZYnXdS))unicode_literalsNz2.0.2Z(d23a53f46dd1c3703e5eee63dca3f53bd18a4e8bTi  F)compilerunknown)cython_version) __future__rdatetimeversiongithashmajorminorbugfixrelease timestampdebug _compilerr ImportErrorr rr@/home/nabil/Git/sunpy/astropy_helpers/astropy_helpers/version.pys"  sunpy-0.8.3/astropy_helpers/astropy_helpers/__pycache__/version_helpers.cpython-36.pyc0000644000175000001440000001537713212200427030603 0ustar nabil000000000000003 )Z&@sdZddlmZddlZddlZddlZddlZddlZddlZddl m Z ddl Z ddl m Z ddlmZddlmZejdd kZd d Zd ddZd ddZdddZdddZddZdddZdddZdS)a( Utilities for generating the version string for Astropy (or an affiliated package) and the version.py module, which contains version info for the package. Within the generated astropy.version module, the `major`, `minor`, and `bugfix` variables hold the respective parts of the version number (bugfix is '0' if absent). The `release` variable is True if this is a release, and False if this is a development version of astropy. For the actual version string, use:: from astropy.version import version or:: from astropy import __version__ )divisionN)log) git_helpers)is_distutils_display_option)invalidate_cachescCstj|}t|dr8|jr2dd|jjdD}qdg}n,g}x&|D]}|jdrRP|jt|qBWt|dkr|dgdt|7}t |ddS) a Split a version string into major, minor, and bugfix numbers. If any of those numbers are missing the default is zero. Any pre/post release modifiers are ignored. Examples ======== >>> _version_split('1.2.3') (1, 2, 3) >>> _version_split('1.2') (1, 2, 0) >>> _version_split('1.2rc1') (1, 2, 0) >>> _version_split('1') (1, 0, 0) >>> _version_split('') (0, 0, 0) base_versioncSsg|] }t|qS)int).0partr r H/home/nabil/Git/sunpy/astropy_helpers/astropy_helpers/version_helpers.py Bsz"_version_split...*rrN) pkg_resources parse_versionhasattrr split startswithappendr lentuple)versionparsed_versionpartsr r r r_version_split)s     ra # Autogenerated by {packagetitle}'s setup.py on {timestamp!s} from __future__ import unicode_literals import datetime {header} major = {major} minor = {minor} bugfix = {bugfix} release = {rel} timestamp = {timestamp!r} debug = {debug} try: from ._compiler import compiler except ImportError: compiler = "unknown" try: from .cython_version import cython_version except ImportError: cython_version = "unknown" a {git_helpers} _packagename = "{packagename}" _last_generated_version = "{verstr}" _last_githash = "{githash}" # Determine where the source code for this module # lives. If __file__ is not a filesystem path then # it is assumed not to live in a git repo at all. if _get_repo_path(__file__, levels=len(_packagename.split('.'))): version = update_git_devstr(_last_generated_version, path=__file__) githash = get_git_devstr(sha=True, show_warning=False, path=__file__) or _last_githash else: # The file does not appear to live in a git repo so don't bother # invoking git version = _last_generated_version githash = _last_githash z, version = "{verstr}" githash = "{githash}" Tc Csttjjdtj}tjj|}t|\}} } |jdkrBd} nd|} d} |r`t |||} n|srt j ddd}| st j ||d} tj | || || | ||d S) NZSOURCE_DATE_EPOCHZastropyZAstropyzAstropy-affiliated package T)sha show_warning)verstrgithash) packagetitle timestampheadermajorminorbugfixreldebug)r osenvirongettimedatetimeutcfromtimestamprlower_generate_git_headerrget_git_devstr _FROZEN_VERSION_PY_STATIC_HEADERformat_FROZEN_VERSION_PY_TEMPLATE) packagenamerr"releaser*uses_gitepochr$r&r'r(r#r%r r r_get_version_py_strs*  r;c Cstjt}|jtjpd}|j}|s4tjddSd}x t|D]\}}|j drBPqBWdj ||dd}t rz|} n |j d} tj d d d } | r| }tj||| |d S) a@ Generates a header to the version.py module that includes utilities for probing the git repository for updates (to the current git hash, etc.) These utilities should only be available in development versions, and not in release builds. If this fails for any reason an empty string is returned. rzMCannot get source code for astropy_helpers.git_helpers; git support disabled.rz# BEGIN rNutf8TF)rr )rr7r!r")pkgutil get_loaderr get_source__name__ splitlinesrwarn enumeraterjoinPY3encoder3"_FROZEN_VERSION_PY_WITH_GIT_HEADERr5) r7rr"loadersourceZ source_linesidxlineZgit_helpers_pyr!Z new_githashr r rr2s(    r2rc &Csfydt|}y |j}Wntk r.|j}YnXy |j}Wntk rT|j}YnX|j} |j} Wn(tk rd}d}d}d} d} YnX|dkrt | }|dkrt | }t j j ||d} ||ks| |ks| |krbdt jkrdt jkrtjtjtr tjtjtjdj| t| d } | jt||||||dWdQRXt|rbtj|dS)z.Regenerate the version.py module if necessary.Nz version.pyz-qz--quietzFreezing version number to {0}w)r9)get_pkg_version_moduleZ_last_generated_versionAttributeErrorrZ _last_githashr"r8r* ImportErrorboolr+pathrEsysargvr set_thresholdINFOrWARNinfor5openwriter;rimpreload) r7rr8r*r9srcdirZversion_moduleZlast_generated_versionZ last_githashZcurrent_release current_debugZ version_pyfr r rgenerate_version_pysH           r`cs@|st|ddgdSt|d|dtfdd|DSdS)aReturns the package's .version module generated by `astropy_helpers.version_helpers.generate_version_py`. Raises an ImportError if the version module is not found. If ``fromlist`` is an iterable, return a tuple of the members of the version module corresponding to the member names given in ``fromlist``. Raises an `AttributeError` if any of these module members are not found. z.versionr)fromlistc3s|]}t|VqdS)N)getattr)r member)modr r ,sz)get_pkg_version_module..N) __import__r)r7rar )rdrrNs rN)T)NNTr)N)__doc__ __future__rr/r[r+r>rSr. distutilsrrrrdistutils_helpersrutilsr version_inforFrr6rHr4r;r2r`rNr r r rs,     H    "+ :sunpy-0.8.3/astropy_helpers/astropy_helpers/commands/0000755000175000017500000000000013232563477023357 5ustar nabilnabil00000000000000sunpy-0.8.3/astropy_helpers/astropy_helpers/commands/__pycache__/0000755000175000017500000000000013232563477025567 5ustar nabilnabil00000000000000sunpy-0.8.3/astropy_helpers/astropy_helpers/commands/__pycache__/__init__.cpython-36.pyc0000644000175000001440000000023513203277317030733 0ustar nabil000000000000003 ~ Z@sdS)NrrrJ/home/nabil/Git/sunpy/astropy_helpers/astropy_helpers/commands/__init__.pyssunpy-0.8.3/astropy_helpers/astropy_helpers/commands/__pycache__/_dummy.cpython-36.pyc0000644000175000017500000000603213232357431031477 0ustar nabilnabil000000000000003 ~ Z| @sldZddlZddlmZddlmZddlmZGdddeZ ej ddkr\e ed n e ed dS) aa Provides a base class for a 'dummy' setup.py command that has no functionality (probably due to a missing requirement). This dummy command can raise an exception when it is run, explaining to the user what dependencies must be met to use this command. The reason this is at all tricky is that we want the command to be able to provide this message even when the user passes arguments to the command. If we don't know ahead of time what arguments the command can take, this is difficult, because distutils does not allow unknown arguments to be passed to a setup.py command. This hacks around that restriction to provide a useful error message even when a user passes arguments to the dummy implementation of a command. Use this like: try: from some_dependency import SetupCommand except ImportError: from ._dummy import _DummyCommand class SetupCommand(_DummyCommand): description = 'Implementation of SetupCommand from some_dependency; ' 'some_dependency must be installed to run this command' # This is the message that will be raised when a user tries to # run this command--define it as a class attribute. error_msg = "The 'setup_command' command requires the some_dependency " "package to be installed and importable." N)Command)DistutilsArgError)dedentcs(eZdZdZddZfddZZS)_DummyCommandMetaa  Causes an exception to be raised on accessing attributes of a command class so that if ``./setup.py command_name`` is run with additional command-line options we can provide a useful error message instead of the default that tells users the options are unrecognized. cCs8|ttfkrdSt|ds"tdt|ds4tddS)N descriptionz;_DummyCommand subclass must have a 'description' attribute. error_msgz:_DummyCommand subclass must have an 'error_msg' attribute.)robjecthasattr TypeError)clsnamebasesmembersrH/home/nabil/Git/sunpy/astropy_helpers/astropy_helpers/commands/_dummy.py__init__0s   z_DummyCommandMeta.__init__cs&|dkrtt|j|St|jdS)Nrr)rr)superr__getattribute__rr)r attr) __class__rrr?sz"_DummyCommandMeta.__getattribute__)__name__ __module__ __qualname____doc__rr __classcell__rr)rrr(srza class _DummyCommand(Command, object): __metaclass__ = _DummyCommandMeta za class _DummyCommand(Command, object, metaclass=_DummyCommandMeta): pass ) rsys setuptoolsrdistutils.errorsrtextwraprtyper version_infoexecrrrr s     sunpy-0.8.3/astropy_helpers/astropy_helpers/commands/__pycache__/build_ext.cpython-36.pyc0000644000175000001440000002637313203277317031166 0ustar nabil000000000000003 ~ ZL@sddlZddlZddlZddlZddlZddlZddlZddlZddlm Z m Z m Z ddl m Z ddlmZddlmZddlmZmZmZddlmZdd d ZiZd d Zd dZdS)N)log ccompiler sysconfig) Extension)get_default_compiler) build_ext)get_numpy_include_pathinvalidate_caches classproperty)get_pkg_version_modulec#Csyt|dddgd}Wntk r0d}YnX|dkrb|dk rby |j}Wntk r`YnXy |j}Wntk rd}YnXd}yddl}d }Wntk rYnX|r| s|dkr|SdSdS) aReturns the previously used Cython version (or 'unknown' if not previously built) if Cython should be used to build extension modules from pyx files. If the ``release`` parameter is not specified an attempt is made to determine the release flag from `astropy.version`. z.cython_versionreleasecython_version)fromlistNunknownFrT) __import__ ImportErrorr AttributeErrorrCython)packager version_modulerZ have_cythonrrK/home/nabil/Git/sunpy/astropy_helpers/astropy_helpers/commands/build_ext.pyshould_build_with_cythons.    rcsXtkrtSddddddg}fdd}x|D]}||}|d kr2Pq2W|t<|S) Nz --versionz --Versionz-versionz-Versionz-vz-Vcsptjtjdtjkd|gtjtjd}|j\}}|jdkrDdS|j j d}|sd|j j d}|sld}|S)Nwin)posix)stdoutstderrrrzlatin-1) subprocessPopenshlexsplitsysplatformPIPE communicate returncodestripdecode)flagprocessrroutput)compilerrrtry_get_versionKs  z-get_compiler_version..try_get_versionr)_compiler_versions)r,flagsr-r)versionr)r,rget_compiler_version@s  r1csGfdddttS)a Creates a custom 'build_ext' command that allows for manipulating some of the C extension options at build time. We use a function to build the class since the base class for build_ext may be different depending on certain build-time parameters (for example, we may use Cython's build_ext instead of the default version in distutils). Uses the default distutils.command.build_ext by default. cseZdZZZejddZejddZ ej ddZ dZ dgZ eddZeddZed d Z ed d fd dZfddZfddZfddZddZddZZS)z-generate_build_ext_command..build_extNF$i686-apple-darwin[0-9]*-llvm-gcc-4.2clangcSs$ddlm}|jdkr|jS|jjS)Nr)core) distutilsr4_setup_distribution _user_options _final_class user_options)clsr4rrrr9s  z:generate_build_ext_command..build_ext.user_optionscSs$ddlm}|jdkr|jS|jjS)Nr)r4)r5r4r6_boolean_optionsr8boolean_options)r:r4rrrr<s  z=generate_build_ext_command..build_ext.boolean_optionscSs$ddlm}|jdkr|jS|jjS)Nr)r4)r5r4r6 _help_optionsr8 help_options)r:r4rrrr>s  z:generate_build_ext_command..build_ext.help_optionsT)lazycstjj}|rFyddlmWqJtk rBddlmYqJXntfdd}j fddj D}t j }|j |d|d ||d tf_tjf|S) z Late determination of what the build_ext base class should be, depending on whether or not Cython is available. r) old_build_ext)rcs@t|}td|}tdd|D|fdd|DS)N_css|]}|dVqdS)rNr).0optrrr szdgenerate_build_ext_command..build_ext._final_class..merge_options..csg|]}|dkr|qS)rr)rBrC)all_baserr szegenerate_build_ext_command..build_ext._final_class..merge_options..)getattrset)attrbaseZours)base_clsr:)rEr merge_optionss zQgenerate_build_ext_command..build_ext._final_class..merge_optionscsg|]}|jkr|qSr)r<)rBrC)rKrrrFszNgenerate_build_ext_command..build_ext._final_class..r9r>)r9r>r< uses_cython)r package_name is_releaseZCython.Distutils.old_build_extr@rZCython.DistutilsrSetuptoolsBuildExtr<r;dict__dict__updateobject __bases__type__name__)r:rMrLr<members)r)rKr:rr8s&   z:generate_build_ext_command..build_ext._final_classcs$t|jj|j}|j|||S)N)superr8__new____init__)r:argskwargsZnew_cls) __class__rrrrZs  z5generate_build_ext_command..build_ext.__new__c s|j|jj}|r|jd}|j}tjjtjjtjj t d}t j tjj|dtjj|dt |jdtjj|dg}|jd|t|j|jryddlm}Wntk rd}YnX|dk r||jkrd|_||_|jrd|_dS) Nbuild_pysrcz compiler.cz _compiler.cz ._compilerr) __version__T)_adjust_compiler distribution ext_modulesget_finalized_commandget_package_dirospathrelpathjoindirname__file__shutilcopyrrNinsertrYfinalize_optionsrMrrar force_rebuildforce)self extensionsr_ package_dirZsrc_pathextr)r^r packagenamerrrps0      z>generate_build_ext_command..build_ext.finalize_optionsc s.t}xH|jD]>}d|jkrB|jjd}|jj|||jjd|j|qWt|jyt dgdd}Wnt t fk rd}YnX|j o|j |kr*|j d}|j}tjj|d}t|d"}|jd |jd j|j WdQRXtjj|jr$|j|tjj|j|d d tdS) Nnumpyr)rrrr_zcython_version.pywz # Generated file; do not modify zcython_version = {0!r} F) preserve_mode)r rt include_dirsindexroremove_check_cython_sourcesrYrunr rrrMrerfrgrhrjopenwriteformatisdirZ build_lib copy_filer ) rsZ np_include extensionidxrr_ruZ cython_pyf)r^rrwrrr!s2         z1generate_build_ext_command..build_ext.runcSsVdtjkrtjd}y t|}Wn:tk rZtjdj|d}tj|t j dYnXxL|j D]B\}}t j ||rdtjdj|||j|d}tj|t j dqdWdS|jdk rdStj}|dkrRtjd}y t|}Wn<tk r tjd j|d}tj|t j dYnXx.|j D]$\}}t j ||r*|tjd<Pq*WdS) a This function detects broken compilers and switches to another. If the environment variable CC is explicitly set, or a compiler is specified on the commandline, no override is performed -- the purpose here is to only override a default compiler. The specific compilers with problems are: * The default compiler in XCode-4.2, llvm-gcc-4.2, segfaults when compiling wcslib. The set of broken compilers can be updated by changing the compiler_mapping variable. It is a list of 2-tuples where the first in the pair is a regular expression matching the version of the broken compiler, and the second is the compiler to change to. CCz The C compiler set by the CC environment variable: {compiler:s} cannot be found or executed. )r,aCompiler specified by CC environment variable ({compiler:s}:{version:s}) will fail to compile {pkg:s}. Please set CC={fixed:s} and try again. You can do this, for example, by running: CC={fixed:s} python setup.py where is the command you ran. )r,r0pkgfixedNunixa The C compiler used to compile Python {compiler:s}, and which is normally used to compile C extensions, is not available. You can explicitly specify which compiler to use by setting the CC environment variable, for example: CC=gcc python setup.py or if you are using MacOS X, you can try: CC=clang python setup.py )rgenvironr1OSErrortextwrapdedentrrwarnr"exit_broken_compiler_mappingrematchrNr,rrrget_config_var)rsZ c_compilerr0msgbrokenr compiler_typerrrrbGsB               z>generate_build_ext_command..build_ext._adjust_compilerc Ss|jdkrt}n|j}xt|jD]\}}tjj|\}}|d}|d}|d} tjj|sbq$|jrt||j|<nNtjj|r||j|<n6tjj| r| |j|<ndj |||j } t t j | ||dkr$|jjddgq$WdS) z Where relevant, make sure that the .c files associated with .pyx modules are present (if building without Cython installed). Nz.pyxz.cz.cppzCould not find C/C++ file {0}.(c/cpp) for Cython file {1} when building extension {2}. Cython must be installed to build from a git checkout.rz-Wp,-wz-Wno-unused-function)r,r enumeratesourcesrgrhsplitextisfilerMrnameIOErrorerrnoENOENTextra_compile_argsextend) rsrr,Zjdxr`rJrvpyxfnZcfnZcppfnrrrrr~s,        zCgenerate_build_ext_command..build_ext._check_cython_sources)r2r3)rW __module__ __qualname__rNrOrPr9r7r<r;r>r=rqrr r8rZrprrbr~ __classcell__r)rrwr )r^rrws  3*&er)rPrT)rwr r)rrwr rgenerate_build_ext_commandls er)N)rrgrr rmrr"rr5rrrdistutils.corerdistutils.ccompilerrZsetuptools.command.build_extrrPutilsr r r version_helpersr rr.r1rrrrrs"     *,sunpy-0.8.3/astropy_helpers/astropy_helpers/commands/__pycache__/build_py.cpython-36.pyc0000644000175000001440000000240513203277317031004 0ustar nabil000000000000003 ~ Z@s,ddlmZddlmZGdddeZdS))build_py)_get_platlib_dirc@sBeZdZejddZejddZddZd ddZddZdS) AstropyBuildPyNcCs2|jd}t|}||_||_||_tj|dS)Nbuild)get_finalized_commandrZ build_purelib build_libSetuptoolsBuildPyfinalize_options)selfZ build_cmdZ platlib_dirr J/home/nabil/Git/sunpy/astropy_helpers/astropy_helpers/commands/build_py.pyr s  zAstropyBuildPy.finalize_optionsFcCsb|jj}g}xB|D]:}x4|D]"}|t|jddj|rPqW|j|qWtj|||dS)N) distribution skip_2to3lenr startswithappendr run_2to3)r filesdoctestsrZfiltered_filesfilenamepackager r r rs  zAstropyBuildPy.run_2to3cCstj|dS)N)r run)r r r r r%szAstropyBuildPy.run)F) __name__ __module__ __qualname__r user_optionsboolean_optionsr rrr r r r rs  rN)Zsetuptools.command.build_pyrr utilsrrr r r r s  sunpy-0.8.3/astropy_helpers/astropy_helpers/commands/__pycache__/build_sphinx.cpython-36.pyc0000644000175000001440000001465513203277317031677 0ustar nabil000000000000003 ~ Z(@sddlmZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl m Z ddl mZddlZddlmZddlmZmZejddkZGd d d eZGd d d eZdS) )print_functionN)log)DistutilsOptionError)BuildDoc) minversionAstropyDeprecationWarningc@seZdZdZdZejddZejdejdejdejdejddZejdejdejd ejd e j de j Z ddZ ddZddZdS)AstropyBuildDocsa A version of the ``build_docs`` command that uses the version of Astropy that is built by the setup ``build`` command, rather than whatever is installed on the system. To build docs against the installed version, run ``make html`` in the ``astropy/docs`` directory. This also automatically creates the docs/_static directories--this is needed because GitHub won't create the _static dir because it has no tracked files. z2Build Sphinx documentation for Astropy environmentNwarnings-returncodewParses the sphinx output and sets the return code to 1 if there are any warnings. Note that this will cause the sphinx log to only update when it completes, rather than continuously as is normally the case. clean-docsl_Completely clean previous builds, including automodapi-generated files before building new onesno-intersphinxn0Skip intersphinx, even if conf.py says to use itopen-docs-in-browsero\Open the docs in a browser (using the webbrowser module) if the build finishes successfully.zself\.([^\d\W][\w]+)cCs&tj|d|_d|_d|_d|_dS)NF)SphinxBuildDocinitialize_options clean_docsno_intersphinxopen_docs_in_browserwarnings_returncode)selfrN/home/nabil/Git/sunpy/astropy_helpers/astropy_helpers/commands/build_sphinx.pyrAs  z#AstropyBuildDocs.initialize_optionscCstj||jrtjj|jdtjj|jdg}|jdkrF|jdn |j|jxD|D]<}tjj |rt j d|t j |qXt j d|dqXWdS)NapiZ generatedz docs/_buildzCleaning directory zNot cleaning directory z' because not present or not a directory)rfinalize_optionsrospathjoin source_dir build_dirappendisdirrinfoshutilrmtree)rZdirstormdrrrr!Hs       z!AstropyBuildDocs.finalize_optionsc Cszddl}trddlm}n ddlm}d}|jdk rtjj|j\}}|dkr^tjj|\}}tjj |d}tjj |rt d|d|j ||j d}d|_|jd|jd}tjj|j}tjd} tjj| j} tjtj\} } tjd j|| |jd } | tjdj | d d7} |jj| } xZtd t| d D]F}| |}t ||}|j!d rvt"tjj|| |<n t"|| |<q>Wdj | } tjdjt |ddt |ddt |ddd}|| } t#t$drd| } |j%r| j&dd} t'j(djt)j*| |j+rt,j-t)j*d| gt,j.t,j.t,j/d}d }|j0LxDt1|j0j2dD]2}|j3d}t4|j5dd|j5dkrHd}qHWWdQRX|j6|dkrtj7j8ddd krd!}nd"}t'j9|n$t,j-t)j*gt,j.d#}|j:| j;d|jd$krr-retcodebasedirZsubdirZ staticdir build_cmdr1Z ah_importerr2ZrunlinesZ runlinenoZ subproccodeiidenvalZoptcodeproclinemsgZabsdirZ index_pathZfileurlrrrrO^s                           zAstropyBuildDocs.run)r r r )rrr)rrr)rrr)__name__ __module__ __qualname____doc__ descriptionr user_optionsr'boolean_optionsrecompileUNICODErSrr!rOrrrrr s0     r c@seZdZdZddZdS)AstropyBuildSphinxz*deprecated alias to the build_docs commandcCstjdttj|dS)NzFThe "build_sphinx" command is now deprecated. Use"build_docs" instead.)warningsrjrr rO)rrrrrOszAstropyBuildSphinx.runN)rzr{r|r~rOrrrrrsr) __future__rrMr"rKrr*r^r\rPr distutilsr distutils.cmdrrYZsphinx.setup_commandrrutilsrr version_infor?r rrrrrs$    fsunpy-0.8.3/astropy_helpers/astropy_helpers/commands/__pycache__/install.cpython-36.pyc0000644000175000001440000000137413203277317030647 0ustar nabil000000000000003 ~ Z@s,ddlmZddlmZGdddeZdS))install)_get_platlib_dirc@s0eZdZejddZejddZddZdS)AstropyInstallNcCs&|jd}t|}||_tj|dS)Nbuild)get_finalized_commandr build_libSetuptoolsInstallfinalize_options)self build_cmd platlib_dirrI/home/nabil/Git/sunpy/astropy_helpers/astropy_helpers/commands/install.pyr s zAstropyInstall.finalize_options)__name__ __module__ __qualname__r user_optionsboolean_optionsr rrrrrsrN)Zsetuptools.command.installrr utilsrrrrrrs  sunpy-0.8.3/astropy_helpers/astropy_helpers/commands/__pycache__/install_lib.cpython-36.pyc0000644000175000001440000000142113203277317031466 0ustar nabil000000000000003 ~ Z@s,ddlmZddlmZGdddeZdS)) install_lib)_get_platlib_dirc@s0eZdZejddZejddZddZdS)AstropyInstallLibNcCs&|jd}t|}||_tj|dS)Nbuild)get_finalized_commandr build_dirSetuptoolsInstallLibfinalize_options)self build_cmd platlib_dirrM/home/nabil/Git/sunpy/astropy_helpers/astropy_helpers/commands/install_lib.pyr s z"AstropyInstallLib.finalize_options)__name__ __module__ __qualname__r user_optionsboolean_optionsr rrrrrsrN)Zsetuptools.command.install_librr utilsrrrrrrs  sunpy-0.8.3/astropy_helpers/astropy_helpers/commands/__pycache__/register.cpython-36.pyc0000644000175000001440000000367213212200430031006 0ustar nabil000000000000003 )Zg @s ddlmZGdddeZdS))registerc@s@eZdZdZejd gZejdgZddZddZd d Z dS) AstropyRegisteraExtends the built in 'register' command to support a ``--hidden`` option to make the registered version hidden on PyPI by default. The result of this is that when a version is registered as "hidden" it can still be downloaded from PyPI, but it does not show up in the list of actively supported versions under http://pypi.python.org/pypi/astropy, and is not set as the most recent version. Although this can always be set through the web interface it may be more convenient to be able to specify via the 'register' command. Hidden may also be considered a safer default when running the 'register' command, though this command uses distutils' normal behavior if the ``--hidden`` option is omitted. hiddenN.mark this release as hidden on PyPI by defaultcCstj|d|_dS)NF)SetuptoolsRegisterinitialize_optionsr)selfr J/home/nabil/Git/sunpy/astropy_helpers/astropy_helpers/commands/register.pyrs z"AstropyRegister.initialize_optionscCs&tj||}|dkr"|jr"d|d<|S)Nsubmit1Z _pypi_hidden)rbuild_post_datar)ractiondatar r r r s zAstropyRegister.build_post_datacCs:d|_tj||jjd}d|kr6|d\}}||_dS)Npypir repository)rr _set_config distributionget_option_dict)roptionssourcevaluer r r r#s    zAstropyRegister._set_config)rNr) __name__ __module__ __qualname____doc__r user_optionsboolean_optionsrr rr r r r rs rN)Zsetuptools.command.registerrrrr r r r s sunpy-0.8.3/astropy_helpers/astropy_helpers/commands/__pycache__/setup_package.cpython-36.pyc0000644000175000001440000000050413203277317032006 0ustar nabil000000000000003 ~ Zx@sddlmZddZdS))joincCsdtddgiS)Nzastropy_helpers.commandssrcz compiler.c)rrr)astropy_helpers/commands/setup_package.pyget_package_datasrN)os.pathrrrrrrs sunpy-0.8.3/astropy_helpers/astropy_helpers/commands/__pycache__/test.cpython-36.pyc0000644000175000001440000000241413212200430030132 0ustar nabil000000000000003 )ZT@sxdZy>ddlZyddlmZWn ek r>ddlmZYnXWn0ek rrddlmZGdddeZYnXdS)aC Different implementations of the ``./setup.py test`` command depending on what's locally available. If Astropy v1.1.0.dev or later is available it should be possible to import AstropyTest from ``astropy.tests.command``. If ``astropy`` can be imported but not ``astropy.tests.command`` (i.e. an older version of Astropy), we can use the backwards-compat implementation of the command. If Astropy can't be imported at all then there is a skeleton implementation that allows users to at least discover the ``./setup.py test`` command and learn that they need Astropy to run it. N) AstropyTest) _DummyCommandc@seZdZdZdZdZdS)rtestzRun the tests for this packagezOThe 'test' command requires the astropy package to be installed and importable.N)__name__ __module__ __qualname__ command_name description error_msgr r F/home/nabil/Git/sunpy/astropy_helpers/astropy_helpers/commands/test.pyrsr)__doc__astropyZastropy.tests.commandr ExceptionZ _test_compatZ_dummyrr r r r  s sunpy-0.8.3/astropy_helpers/astropy_helpers/commands/src/0000755000175000017500000000000013232563477024146 5ustar nabilnabil00000000000000sunpy-0.8.3/astropy_helpers/astropy_helpers/commands/src/compiler.c0000644000175000001440000000573113203277317025111 0ustar nabil00000000000000#include /*************************************************************************** * Macros for determining the compiler version. * * These are borrowed from boost, and majorly abridged to include only * the compilers we care about. ***************************************************************************/ #ifndef PY3K #if PY_MAJOR_VERSION >= 3 #define PY3K 1 #else #define PY3K 0 #endif #endif #define STRINGIZE(X) DO_STRINGIZE(X) #define DO_STRINGIZE(X) #X #if defined __clang__ /* Clang C++ emulates GCC, so it has to appear early. */ # define COMPILER "Clang version " __clang_version__ #elif defined(__INTEL_COMPILER) || defined(__ICL) || defined(__ICC) || defined(__ECC) /* Intel */ # if defined(__INTEL_COMPILER) # define INTEL_VERSION __INTEL_COMPILER # elif defined(__ICL) # define INTEL_VERSION __ICL # elif defined(__ICC) # define INTEL_VERSION __ICC # elif defined(__ECC) # define INTEL_VERSION __ECC # endif # define COMPILER "Intel C compiler version " STRINGIZE(INTEL_VERSION) #elif defined(__GNUC__) /* gcc */ # define COMPILER "GCC version " __VERSION__ #elif defined(__SUNPRO_CC) /* Sun Workshop Compiler */ # define COMPILER "Sun compiler version " STRINGIZE(__SUNPRO_CC) #elif defined(_MSC_VER) /* Microsoft Visual C/C++ Must be last since other compilers define _MSC_VER for compatibility as well */ # if _MSC_VER < 1200 # define COMPILER_VERSION 5.0 # elif _MSC_VER < 1300 # define COMPILER_VERSION 6.0 # elif _MSC_VER == 1300 # define COMPILER_VERSION 7.0 # elif _MSC_VER == 1310 # define COMPILER_VERSION 7.1 # elif _MSC_VER == 1400 # define COMPILER_VERSION 8.0 # elif _MSC_VER == 1500 # define COMPILER_VERSION 9.0 # elif _MSC_VER == 1600 # define COMPILER_VERSION 10.0 # else # define COMPILER_VERSION _MSC_VER # endif # define COMPILER "Microsoft Visual C++ version " STRINGIZE(COMPILER_VERSION) #else /* Fallback */ # define COMPILER "Unknown compiler" #endif /*************************************************************************** * Module-level ***************************************************************************/ struct module_state { /* The Sun compiler can't handle empty structs */ #if defined(__SUNPRO_C) || defined(_MSC_VER) int _dummy; #endif }; #if PY3K static struct PyModuleDef moduledef = { PyModuleDef_HEAD_INIT, "_compiler", NULL, sizeof(struct module_state), NULL, NULL, NULL, NULL, NULL }; #define INITERROR return NULL PyMODINIT_FUNC PyInit__compiler(void) #else #define INITERROR return PyMODINIT_FUNC init_compiler(void) #endif { PyObject* m; #if PY3K m = PyModule_Create(&moduledef); #else m = Py_InitModule3("_compiler", NULL, NULL); #endif if (m == NULL) INITERROR; PyModule_AddStringConstant(m, "compiler", COMPILER); #if PY3K return m; #endif } sunpy-0.8.3/astropy_helpers/astropy_helpers/commands/__init__.py0000644000175000001440000000000013203277317024435 0ustar nabil00000000000000sunpy-0.8.3/astropy_helpers/astropy_helpers/commands/_dummy.py0000644000175000001440000000557413203277317024215 0ustar nabil00000000000000""" Provides a base class for a 'dummy' setup.py command that has no functionality (probably due to a missing requirement). This dummy command can raise an exception when it is run, explaining to the user what dependencies must be met to use this command. The reason this is at all tricky is that we want the command to be able to provide this message even when the user passes arguments to the command. If we don't know ahead of time what arguments the command can take, this is difficult, because distutils does not allow unknown arguments to be passed to a setup.py command. This hacks around that restriction to provide a useful error message even when a user passes arguments to the dummy implementation of a command. Use this like: try: from some_dependency import SetupCommand except ImportError: from ._dummy import _DummyCommand class SetupCommand(_DummyCommand): description = \ 'Implementation of SetupCommand from some_dependency; ' 'some_dependency must be installed to run this command' # This is the message that will be raised when a user tries to # run this command--define it as a class attribute. error_msg = \ "The 'setup_command' command requires the some_dependency " "package to be installed and importable." """ import sys from setuptools import Command from distutils.errors import DistutilsArgError from textwrap import dedent class _DummyCommandMeta(type): """ Causes an exception to be raised on accessing attributes of a command class so that if ``./setup.py command_name`` is run with additional command-line options we can provide a useful error message instead of the default that tells users the options are unrecognized. """ def __init__(cls, name, bases, members): if bases == (Command, object): # This is the _DummyCommand base class, presumably return if not hasattr(cls, 'description'): raise TypeError( "_DummyCommand subclass must have a 'description' " "attribute.") if not hasattr(cls, 'error_msg'): raise TypeError( "_DummyCommand subclass must have an 'error_msg' " "attribute.") def __getattribute__(cls, attr): if attr in ('description', 'error_msg'): # Allow cls.description to work so that `./setup.py # --help-commands` still works return super(_DummyCommandMeta, cls).__getattribute__(attr) raise DistutilsArgError(cls.error_msg) if sys.version_info[0] < 3: exec(dedent(""" class _DummyCommand(Command, object): __metaclass__ = _DummyCommandMeta """)) else: exec(dedent(""" class _DummyCommand(Command, object, metaclass=_DummyCommandMeta): pass """)) sunpy-0.8.3/astropy_helpers/astropy_helpers/commands/_test_compat.py0000644000175000001440000002671213212200427025365 0ustar nabil00000000000000""" Old implementation of ``./setup.py test`` command. This has been moved to astropy.tests as of Astropy v1.1.0, but a copy of the implementation is kept here for backwards compatibility. """ from __future__ import absolute_import, unicode_literals import inspect import os import shutil import subprocess import sys import tempfile from setuptools import Command from ..compat import _fix_user_options PY3 = sys.version_info[0] == 3 class AstropyTest(Command, object): description = 'Run the tests for this package' user_options = [ ('package=', 'P', "The name of a specific package to test, e.g. 'io.fits' or 'utils'. " "If nothing is specified, all default tests are run."), ('test-path=', 't', 'Specify a test location by path. If a relative path to a .py file, ' 'it is relative to the built package, so e.g., a leading "astropy/" ' 'is necessary. If a relative path to a .rst file, it is relative to ' 'the directory *below* the --docs-path directory, so a leading ' '"docs/" is usually necessary. May also be an absolute path.'), ('verbose-results', 'V', 'Turn on verbose output from pytest.'), ('plugins=', 'p', 'Plugins to enable when running pytest.'), ('pastebin=', 'b', "Enable pytest pastebin output. Either 'all' or 'failed'."), ('args=', 'a', 'Additional arguments to be passed to pytest.'), ('remote-data', 'R', 'Run tests that download remote data.'), ('pep8', '8', 'Enable PEP8 checking and disable regular tests. ' 'Requires the pytest-pep8 plugin.'), ('pdb', 'd', 'Start the interactive Python debugger on errors.'), ('coverage', 'c', 'Create a coverage report. Requires the coverage package.'), ('open-files', 'o', 'Fail if any tests leave files open. Requires the ' 'psutil package.'), ('parallel=', 'j', 'Run the tests in parallel on the specified number of ' 'CPUs. If negative, all the cores on the machine will be ' 'used. Requires the pytest-xdist plugin.'), ('docs-path=', None, 'The path to the documentation .rst files. If not provided, and ' 'the current directory contains a directory called "docs", that ' 'will be used.'), ('skip-docs', None, "Don't test the documentation .rst files."), ('repeat=', None, 'How many times to repeat each test (can be used to check for ' 'sporadic failures).'), ('temp-root=', None, 'The root directory in which to create the temporary testing files. ' 'If unspecified the system default is used (e.g. /tmp) as explained ' 'in the documentation for tempfile.mkstemp.') ] user_options = _fix_user_options(user_options) package_name = '' def initialize_options(self): self.package = None self.test_path = None self.verbose_results = False self.plugins = None self.pastebin = None self.args = None self.remote_data = False self.pep8 = False self.pdb = False self.coverage = False self.open_files = False self.parallel = 0 self.docs_path = None self.skip_docs = False self.repeat = None self.temp_root = None def finalize_options(self): # Normally we would validate the options here, but that's handled in # run_tests pass # Most of the test runner arguments have the same name as attributes on # this command class, with one exception (for now) _test_runner_arg_attr_map = { 'verbose': 'verbose_results' } def generate_testing_command(self): """ Build a Python script to run the tests. """ cmd_pre = '' # Commands to run before the test function cmd_post = '' # Commands to run after the test function if self.coverage: pre, post = self._generate_coverage_commands() cmd_pre += pre cmd_post += post def get_attr(arg): attr = self._test_runner_arg_attr_map.get(arg, arg) return getattr(self, attr) test_args = filter(lambda arg: hasattr(self, arg), self._get_test_runner_args()) test_args = ', '.join('{0}={1!r}'.format(arg, get_attr(arg)) for arg in test_args) if PY3: set_flag = "import builtins; builtins._ASTROPY_TEST_ = True" else: set_flag = "import __builtin__; __builtin__._ASTROPY_TEST_ = True" cmd = ('{cmd_pre}{0}; import {1.package_name}, sys; result = ' '{1.package_name}.test({test_args}); {cmd_post}' 'sys.exit(result)') return cmd.format(set_flag, self, cmd_pre=cmd_pre, cmd_post=cmd_post, test_args=test_args) def _validate_required_deps(self): """ This method checks that any required modules are installed before running the tests. """ try: import astropy # noqa except ImportError: raise ImportError( "The 'test' command requires the astropy package to be " "installed and importable.") def run(self): """ Run the tests! """ # Ensure there is a doc path if self.docs_path is None: if os.path.exists('docs'): self.docs_path = os.path.abspath('docs') # Build a testing install of the package self._build_temp_install() # Ensure all required packages are installed self._validate_required_deps() # Run everything in a try: finally: so that the tmp dir gets deleted. try: # Construct this modules testing command cmd = self.generate_testing_command() # Run the tests in a subprocess--this is necessary since # new extension modules may have appeared, and this is the # easiest way to set up a new environment # On Python 3.x prior to 3.3, the creation of .pyc files # is not atomic. py.test jumps through some hoops to make # this work by parsing import statements and carefully # importing files atomically. However, it can't detect # when __import__ is used, so its carefulness still fails. # The solution here (admittedly a bit of a hack), is to # turn off the generation of .pyc files altogether by # passing the `-B` switch to `python`. This does mean # that each core will have to compile .py file to bytecode # itself, rather than getting lucky and borrowing the work # already done by another core. Compilation is an # insignificant fraction of total testing time, though, so # it's probably not worth worrying about. retcode = subprocess.call([sys.executable, '-B', '-c', cmd], cwd=self.testing_path, close_fds=False) finally: # Remove temporary directory shutil.rmtree(self.tmp_dir) raise SystemExit(retcode) def _build_temp_install(self): """ Build the package and copy the build to a temporary directory for the purposes of testing this avoids creating pyc and __pycache__ directories inside the build directory """ self.reinitialize_command('build', inplace=True) self.run_command('build') build_cmd = self.get_finalized_command('build') new_path = os.path.abspath(build_cmd.build_lib) # On OSX the default path for temp files is under /var, but in most # cases on OSX /var is actually a symlink to /private/var; ensure we # dereference that link, because py.test is very sensitive to relative # paths... tmp_dir = tempfile.mkdtemp(prefix=self.package_name + '-test-', dir=self.temp_root) self.tmp_dir = os.path.realpath(tmp_dir) self.testing_path = os.path.join(self.tmp_dir, os.path.basename(new_path)) shutil.copytree(new_path, self.testing_path) new_docs_path = os.path.join(self.tmp_dir, os.path.basename(self.docs_path)) shutil.copytree(self.docs_path, new_docs_path) self.docs_path = new_docs_path shutil.copy('setup.cfg', self.tmp_dir) def _generate_coverage_commands(self): """ This method creates the post and pre commands if coverage is to be generated """ if self.parallel != 0: raise ValueError( "--coverage can not be used with --parallel") try: import coverage # noqa except ImportError: raise ImportError( "--coverage requires that the coverage package is " "installed.") # Don't use get_pkg_data_filename here, because it # requires importing astropy.config and thus screwing # up coverage results for those packages. coveragerc = os.path.join( self.testing_path, self.package_name, 'tests', 'coveragerc') # We create a coveragerc that is specific to the version # of Python we're running, so that we can mark branches # as being specifically for Python 2 or Python 3 with open(coveragerc, 'r') as fd: coveragerc_content = fd.read() if PY3: ignore_python_version = '2' else: ignore_python_version = '3' coveragerc_content = coveragerc_content.replace( "{ignore_python_version}", ignore_python_version).replace( "{packagename}", self.package_name) tmp_coveragerc = os.path.join(self.tmp_dir, 'coveragerc') with open(tmp_coveragerc, 'wb') as tmp: tmp.write(coveragerc_content.encode('utf-8')) cmd_pre = ( 'import coverage; ' 'cov = coverage.coverage(data_file="{0}", config_file="{1}"); ' 'cov.start();'.format( os.path.abspath(".coverage"), tmp_coveragerc)) cmd_post = ( 'cov.stop(); ' 'from astropy.tests.helper import _save_coverage; ' '_save_coverage(cov, result, "{0}", "{1}");'.format( os.path.abspath('.'), self.testing_path)) return cmd_pre, cmd_post def _get_test_runner_args(self): """ A hack to determine what arguments are supported by the package's test() function. In the future there should be a more straightforward API to determine this (really it should be determined by the ``TestRunner`` class for whatever version of Astropy is in use). """ if PY3: import builtins builtins._ASTROPY_TEST_ = True else: import __builtin__ __builtin__._ASTROPY_TEST_ = True try: pkg = __import__(self.package_name) if not hasattr(pkg, 'test'): raise ImportError( 'package {0} does not have a {0}.test() function as ' 'required by the Astropy test runner'.format(self.package_name)) argspec = inspect.getargspec(pkg.test) return argspec.args finally: if PY3: del builtins._ASTROPY_TEST_ else: del __builtin__._ASTROPY_TEST_ sunpy-0.8.3/astropy_helpers/astropy_helpers/commands/build_ext.py0000644000175000001440000004636413203277317024704 0ustar nabil00000000000000import errno import os import re import shlex import shutil import subprocess import sys import textwrap from distutils import log, ccompiler, sysconfig from distutils.core import Extension from distutils.ccompiler import get_default_compiler from setuptools.command.build_ext import build_ext as SetuptoolsBuildExt from ..utils import get_numpy_include_path, invalidate_caches, classproperty from ..version_helpers import get_pkg_version_module def should_build_with_cython(package, release=None): """Returns the previously used Cython version (or 'unknown' if not previously built) if Cython should be used to build extension modules from pyx files. If the ``release`` parameter is not specified an attempt is made to determine the release flag from `astropy.version`. """ try: version_module = __import__(package + '.cython_version', fromlist=['release', 'cython_version']) except ImportError: version_module = None if release is None and version_module is not None: try: release = version_module.release except AttributeError: pass try: cython_version = version_module.cython_version except AttributeError: cython_version = 'unknown' # Only build with Cython if, of course, Cython is installed, we're in a # development version (i.e. not release) or the Cython-generated source # files haven't been created yet (cython_version == 'unknown'). The latter # case can happen even when release is True if checking out a release tag # from the repository have_cython = False try: import Cython # noqa have_cython = True except ImportError: pass if have_cython and (not release or cython_version == 'unknown'): return cython_version else: return False _compiler_versions = {} def get_compiler_version(compiler): if compiler in _compiler_versions: return _compiler_versions[compiler] # Different flags to try to get the compiler version # TODO: It might be worth making this configurable to support # arbitrary odd compilers; though all bets may be off in such # cases anyway flags = ['--version', '--Version', '-version', '-Version', '-v', '-V'] def try_get_version(flag): process = subprocess.Popen( shlex.split(compiler, posix=('win' not in sys.platform)) + [flag], stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, stderr = process.communicate() if process.returncode != 0: return 'unknown' output = stdout.strip().decode('latin-1') # Safest bet if not output: # Some compilers return their version info on stderr output = stderr.strip().decode('latin-1') if not output: output = 'unknown' return output for flag in flags: version = try_get_version(flag) if version != 'unknown': break # Cache results to speed up future calls _compiler_versions[compiler] = version return version # TODO: I think this can be reworked without having to create the class # programmatically. def generate_build_ext_command(packagename, release): """ Creates a custom 'build_ext' command that allows for manipulating some of the C extension options at build time. We use a function to build the class since the base class for build_ext may be different depending on certain build-time parameters (for example, we may use Cython's build_ext instead of the default version in distutils). Uses the default distutils.command.build_ext by default. """ class build_ext(SetuptoolsBuildExt, object): package_name = packagename is_release = release _user_options = SetuptoolsBuildExt.user_options[:] _boolean_options = SetuptoolsBuildExt.boolean_options[:] _help_options = SetuptoolsBuildExt.help_options[:] force_rebuild = False _broken_compiler_mapping = [ ('i686-apple-darwin[0-9]*-llvm-gcc-4.2', 'clang') ] # Warning: Spaghetti code ahead. # During setup.py, the setup_helpers module needs the ability to add # items to a command's user_options list. At this stage we don't know # whether or not we can build with Cython, and so don't know for sure # what base class will be used for build_ext; nevertheless we want to # be able to provide a list to add options into. # # Later, once setup() has been called we should have all build # dependencies included via setup_requires available. distutils needs # to be able to access the user_options as a *class* attribute before # the class has been initialized, but we do need to be able to # enumerate the options for the correct base class at that point @classproperty def user_options(cls): from distutils import core if core._setup_distribution is None: # We haven't gotten into setup() yet, and the Distribution has # not yet been initialized return cls._user_options return cls._final_class.user_options @classproperty def boolean_options(cls): # Similar to user_options above from distutils import core if core._setup_distribution is None: # We haven't gotten into setup() yet, and the Distribution has # not yet been initialized return cls._boolean_options return cls._final_class.boolean_options @classproperty def help_options(cls): # Similar to user_options above from distutils import core if core._setup_distribution is None: # We haven't gotten into setup() yet, and the Distribution has # not yet been initialized return cls._help_options return cls._final_class.help_options @classproperty(lazy=True) def _final_class(cls): """ Late determination of what the build_ext base class should be, depending on whether or not Cython is available. """ uses_cython = should_build_with_cython(cls.package_name, cls.is_release) if uses_cython: # We need to decide late on whether or not to use Cython's # build_ext (since Cython may not be available earlier in the # setup.py if it was brought in via setup_requires) try: from Cython.Distutils.old_build_ext import old_build_ext as base_cls except ImportError: from Cython.Distutils import build_ext as base_cls else: base_cls = SetuptoolsBuildExt # Create and return an instance of a new class based on this class # using one of the above possible base classes def merge_options(attr): base = getattr(base_cls, attr) ours = getattr(cls, '_' + attr) all_base = set(opt[0] for opt in base) return base + [opt for opt in ours if opt[0] not in all_base] boolean_options = (base_cls.boolean_options + [opt for opt in cls._boolean_options if opt not in base_cls.boolean_options]) members = dict(cls.__dict__) members.update({ 'user_options': merge_options('user_options'), 'help_options': merge_options('help_options'), 'boolean_options': boolean_options, 'uses_cython': uses_cython, }) # Update the base class for the original build_ext command build_ext.__bases__ = (base_cls, object) # Create a new class for the existing class, but now with the # appropriate base class depending on whether or not to use Cython. # Ensure that object is one of the bases to make a new-style class. return type(cls.__name__, (build_ext,), members) def __new__(cls, *args, **kwargs): # By the time the command is actually instantialized, the # Distribution instance for the build has been instantiated, which # means setup_requires has been processed--now we can determine # what base class we can use for the actual build, and return an # instance of a build_ext command that uses that base class (right # now the options being Cython.Distutils.build_ext, or the stock # setuptools build_ext) new_cls = super(build_ext, cls._final_class).__new__( cls._final_class) # Since the new cls is not a subclass of the original cls, we must # manually call its __init__ new_cls.__init__(*args, **kwargs) return new_cls def finalize_options(self): # Add a copy of the _compiler.so module as well, but only if there # are in fact C modules to compile (otherwise there's no reason to # include a record of the compiler used) # Note, self.extensions may not be set yet, but # self.distribution.ext_modules is where any extension modules # passed to setup() can be found self._adjust_compiler() extensions = self.distribution.ext_modules if extensions: build_py = self.get_finalized_command('build_py') package_dir = build_py.get_package_dir(packagename) src_path = os.path.relpath( os.path.join(os.path.dirname(__file__), 'src')) shutil.copy(os.path.join(src_path, 'compiler.c'), os.path.join(package_dir, '_compiler.c')) ext = Extension(self.package_name + '._compiler', [os.path.join(package_dir, '_compiler.c')]) extensions.insert(0, ext) super(build_ext, self).finalize_options() # Generate if self.uses_cython: try: from Cython import __version__ as cython_version except ImportError: # This shouldn't happen if we made it this far cython_version = None if (cython_version is not None and cython_version != self.uses_cython): self.force_rebuild = True # Update the used cython version self.uses_cython = cython_version # Regardless of the value of the '--force' option, force a rebuild # if the debug flag changed from the last build if self.force_rebuild: self.force = True def run(self): # For extensions that require 'numpy' in their include dirs, # replace 'numpy' with the actual paths np_include = get_numpy_include_path() for extension in self.extensions: if 'numpy' in extension.include_dirs: idx = extension.include_dirs.index('numpy') extension.include_dirs.insert(idx, np_include) extension.include_dirs.remove('numpy') self._check_cython_sources(extension) super(build_ext, self).run() # Update cython_version.py if building with Cython try: cython_version = get_pkg_version_module( packagename, fromlist=['cython_version'])[0] except (AttributeError, ImportError): cython_version = 'unknown' if self.uses_cython and self.uses_cython != cython_version: build_py = self.get_finalized_command('build_py') package_dir = build_py.get_package_dir(packagename) cython_py = os.path.join(package_dir, 'cython_version.py') with open(cython_py, 'w') as f: f.write('# Generated file; do not modify\n') f.write('cython_version = {0!r}\n'.format(self.uses_cython)) if os.path.isdir(self.build_lib): # The build/lib directory may not exist if the build_py # command was not previously run, which may sometimes be # the case self.copy_file(cython_py, os.path.join(self.build_lib, cython_py), preserve_mode=False) invalidate_caches() def _adjust_compiler(self): """ This function detects broken compilers and switches to another. If the environment variable CC is explicitly set, or a compiler is specified on the commandline, no override is performed -- the purpose here is to only override a default compiler. The specific compilers with problems are: * The default compiler in XCode-4.2, llvm-gcc-4.2, segfaults when compiling wcslib. The set of broken compilers can be updated by changing the compiler_mapping variable. It is a list of 2-tuples where the first in the pair is a regular expression matching the version of the broken compiler, and the second is the compiler to change to. """ if 'CC' in os.environ: # Check that CC is not set to llvm-gcc-4.2 c_compiler = os.environ['CC'] try: version = get_compiler_version(c_compiler) except OSError: msg = textwrap.dedent( """ The C compiler set by the CC environment variable: {compiler:s} cannot be found or executed. """.format(compiler=c_compiler)) log.warn(msg) sys.exit(1) for broken, fixed in self._broken_compiler_mapping: if re.match(broken, version): msg = textwrap.dedent( """Compiler specified by CC environment variable ({compiler:s}:{version:s}) will fail to compile {pkg:s}. Please set CC={fixed:s} and try again. You can do this, for example, by running: CC={fixed:s} python setup.py where is the command you ran. """.format(compiler=c_compiler, version=version, pkg=self.package_name, fixed=fixed)) log.warn(msg) sys.exit(1) # If C compiler is set via CC, and isn't broken, we are good to go. We # should definitely not try accessing the compiler specified by # ``sysconfig.get_config_var('CC')`` lower down, because this may fail # if the compiler used to compile Python is missing (and maybe this is # why the user is setting CC). For example, the official Python 2.7.3 # MacOS X binary was compiled with gcc-4.2, which is no longer available # in XCode 4. return if self.compiler is not None: # At this point, self.compiler will be set only if a compiler # was specified in the command-line or via setup.cfg, in which # case we don't do anything return compiler_type = ccompiler.get_default_compiler() if compiler_type == 'unix': # We have to get the compiler this way, as this is the one that is # used if os.environ['CC'] is not set. It is actually read in from # the Python Makefile. Note that this is not necessarily the same # compiler as returned by ccompiler.new_compiler() c_compiler = sysconfig.get_config_var('CC') try: version = get_compiler_version(c_compiler) except OSError: msg = textwrap.dedent( """ The C compiler used to compile Python {compiler:s}, and which is normally used to compile C extensions, is not available. You can explicitly specify which compiler to use by setting the CC environment variable, for example: CC=gcc python setup.py or if you are using MacOS X, you can try: CC=clang python setup.py """.format(compiler=c_compiler)) log.warn(msg) sys.exit(1) for broken, fixed in self._broken_compiler_mapping: if re.match(broken, version): os.environ['CC'] = fixed break def _check_cython_sources(self, extension): """ Where relevant, make sure that the .c files associated with .pyx modules are present (if building without Cython installed). """ # Determine the compiler we'll be using if self.compiler is None: compiler = get_default_compiler() else: compiler = self.compiler # Replace .pyx with C-equivalents, unless c files are missing for jdx, src in enumerate(extension.sources): base, ext = os.path.splitext(src) pyxfn = base + '.pyx' cfn = base + '.c' cppfn = base + '.cpp' if not os.path.isfile(pyxfn): continue if self.uses_cython: extension.sources[jdx] = pyxfn else: if os.path.isfile(cfn): extension.sources[jdx] = cfn elif os.path.isfile(cppfn): extension.sources[jdx] = cppfn else: msg = ( 'Could not find C/C++ file {0}.(c/cpp) for Cython ' 'file {1} when building extension {2}. Cython ' 'must be installed to build from a git ' 'checkout.'.format(base, pyxfn, extension.name)) raise IOError(errno.ENOENT, msg, cfn) # Current versions of Cython use deprecated Numpy API features # the use of which produces a few warnings when compiling. # These additional flags should squelch those warnings. # TODO: Feel free to remove this if/when a Cython update # removes use of the deprecated Numpy API if compiler == 'unix': extension.extra_compile_args.extend([ '-Wp,-w', '-Wno-unused-function']) return build_ext sunpy-0.8.3/astropy_helpers/astropy_helpers/commands/build_py.py0000644000175000001440000000265613203277317024530 0ustar nabil00000000000000from setuptools.command.build_py import build_py as SetuptoolsBuildPy from ..utils import _get_platlib_dir class AstropyBuildPy(SetuptoolsBuildPy): user_options = SetuptoolsBuildPy.user_options[:] boolean_options = SetuptoolsBuildPy.boolean_options[:] def finalize_options(self): # Update build_lib settings from the build command to always put # build files in platform-specific subdirectories of build/, even # for projects with only pure-Python source (this is desirable # specifically for support of multiple Python version). build_cmd = self.get_finalized_command('build') platlib_dir = _get_platlib_dir(build_cmd) build_cmd.build_purelib = platlib_dir build_cmd.build_lib = platlib_dir self.build_lib = platlib_dir SetuptoolsBuildPy.finalize_options(self) def run_2to3(self, files, doctests=False): # Filter the files to exclude things that shouldn't be 2to3'd skip_2to3 = self.distribution.skip_2to3 filtered_files = [] for filename in files: for package in skip_2to3: if filename[len(self.build_lib) + 1:].startswith(package): break else: filtered_files.append(filename) SetuptoolsBuildPy.run_2to3(self, filtered_files, doctests) def run(self): # first run the normal build_py SetuptoolsBuildPy.run(self) sunpy-0.8.3/astropy_helpers/astropy_helpers/commands/build_sphinx.py0000644000175000001440000002427713203277317025414 0ustar nabil00000000000000from __future__ import print_function import inspect import os import pkgutil import re import shutil import subprocess import sys import textwrap import warnings from distutils import log from distutils.cmd import DistutilsOptionError import sphinx from sphinx.setup_command import BuildDoc as SphinxBuildDoc from ..utils import minversion, AstropyDeprecationWarning PY3 = sys.version_info[0] >= 3 class AstropyBuildDocs(SphinxBuildDoc): """ A version of the ``build_docs`` command that uses the version of Astropy that is built by the setup ``build`` command, rather than whatever is installed on the system. To build docs against the installed version, run ``make html`` in the ``astropy/docs`` directory. This also automatically creates the docs/_static directories--this is needed because GitHub won't create the _static dir because it has no tracked files. """ description = 'Build Sphinx documentation for Astropy environment' user_options = SphinxBuildDoc.user_options[:] user_options.append( ('warnings-returncode', 'w', 'Parses the sphinx output and sets the return code to 1 if there ' 'are any warnings. Note that this will cause the sphinx log to ' 'only update when it completes, rather than continuously as is ' 'normally the case.')) user_options.append( ('clean-docs', 'l', 'Completely clean previous builds, including ' 'automodapi-generated files before building new ones')) user_options.append( ('no-intersphinx', 'n', 'Skip intersphinx, even if conf.py says to use it')) user_options.append( ('open-docs-in-browser', 'o', 'Open the docs in a browser (using the webbrowser module) if the ' 'build finishes successfully.')) boolean_options = SphinxBuildDoc.boolean_options[:] boolean_options.append('warnings-returncode') boolean_options.append('clean-docs') boolean_options.append('no-intersphinx') boolean_options.append('open-docs-in-browser') _self_iden_rex = re.compile(r"self\.([^\d\W][\w]+)", re.UNICODE) def initialize_options(self): SphinxBuildDoc.initialize_options(self) self.clean_docs = False self.no_intersphinx = False self.open_docs_in_browser = False self.warnings_returncode = False def finalize_options(self): SphinxBuildDoc.finalize_options(self) # Clear out previous sphinx builds, if requested if self.clean_docs: dirstorm = [os.path.join(self.source_dir, 'api'), os.path.join(self.source_dir, 'generated')] if self.build_dir is None: dirstorm.append('docs/_build') else: dirstorm.append(self.build_dir) for d in dirstorm: if os.path.isdir(d): log.info('Cleaning directory ' + d) shutil.rmtree(d) else: log.info('Not cleaning directory ' + d + ' because ' 'not present or not a directory') def run(self): # TODO: Break this method up into a few more subroutines and # document them better import webbrowser if PY3: from urllib.request import pathname2url else: from urllib import pathname2url # This is used at the very end of `run` to decide if sys.exit should # be called. If it's None, it won't be. retcode = None # If possible, create the _static dir if self.build_dir is not None: # the _static dir should be in the same place as the _build dir # for Astropy basedir, subdir = os.path.split(self.build_dir) if subdir == '': # the path has a trailing /... basedir, subdir = os.path.split(basedir) staticdir = os.path.join(basedir, '_static') if os.path.isfile(staticdir): raise DistutilsOptionError( 'Attempted to build_docs in a location where' + staticdir + 'is a file. Must be a directory.') self.mkpath(staticdir) # Now make sure Astropy is built and determine where it was built build_cmd = self.reinitialize_command('build') build_cmd.inplace = 0 self.run_command('build') build_cmd = self.get_finalized_command('build') build_cmd_path = os.path.abspath(build_cmd.build_lib) ah_importer = pkgutil.get_importer('astropy_helpers') ah_path = os.path.abspath(ah_importer.path) # Now generate the source for and spawn a new process that runs the # command. This is needed to get the correct imports for the built # version runlines, runlineno = inspect.getsourcelines(SphinxBuildDoc.run) subproccode = textwrap.dedent(""" from sphinx.setup_command import * os.chdir({srcdir!r}) sys.path.insert(0, {build_cmd_path!r}) sys.path.insert(0, {ah_path!r}) """).format(build_cmd_path=build_cmd_path, ah_path=ah_path, srcdir=self.source_dir) # runlines[1:] removes 'def run(self)' on the first line subproccode += textwrap.dedent(''.join(runlines[1:])) # All "self.foo" in the subprocess code needs to be replaced by the # values taken from the current self in *this* process subproccode = self._self_iden_rex.split(subproccode) for i in range(1, len(subproccode), 2): iden = subproccode[i] val = getattr(self, iden) if iden.endswith('_dir'): # Directories should be absolute, because the `chdir` call # in the new process moves to a different directory subproccode[i] = repr(os.path.abspath(val)) else: subproccode[i] = repr(val) subproccode = ''.join(subproccode) optcode = textwrap.dedent(""" class Namespace(object): pass self = Namespace() self.pdb = {pdb!r} self.verbosity = {verbosity!r} self.traceback = {traceback!r} """).format(pdb=getattr(self, 'pdb', False), verbosity=getattr(self, 'verbosity', 0), traceback=getattr(self, 'traceback', False)) subproccode = optcode + subproccode # This is a quick gross hack, but it ensures that the code grabbed from # SphinxBuildDoc.run will work in Python 2 if it uses the print # function if minversion(sphinx, '1.3'): subproccode = 'from __future__ import print_function' + subproccode if self.no_intersphinx: # the confoverrides variable in sphinx.setup_command.BuildDoc can # be used to override the conf.py ... but this could well break # if future versions of sphinx change the internals of BuildDoc, # so remain vigilant! subproccode = subproccode.replace( 'confoverrides = {}', 'confoverrides = {\'intersphinx_mapping\':{}}') log.debug('Starting subprocess of {0} with python code:\n{1}\n' '[CODE END])'.format(sys.executable, subproccode)) # To return the number of warnings, we need to capture stdout. This # prevents a continuous updating at the terminal, but there's no # apparent way around this. if self.warnings_returncode: proc = subprocess.Popen([sys.executable, '-c', subproccode], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) retcode = 1 with proc.stdout: for line in iter(proc.stdout.readline, b''): line = line.strip(b'\r\n') print(line.decode('utf-8')) if 'build succeeded.' == line.decode('utf-8'): retcode = 0 # Poll to set proc.retcode proc.wait() if retcode != 0: if os.environ.get('TRAVIS', None) == 'true': # this means we are in the travis build, so customize # the message appropriately. msg = ('The build_docs travis build FAILED ' 'because sphinx issued documentation ' 'warnings (scroll up to see the warnings).') else: # standard failure message msg = ('build_docs returning a non-zero exit ' 'code because sphinx issued documentation ' 'warnings.') log.warn(msg) else: proc = subprocess.Popen([sys.executable], stdin=subprocess.PIPE) proc.communicate(subproccode.encode('utf-8')) if proc.returncode == 0: if self.open_docs_in_browser: if self.builder == 'html': absdir = os.path.abspath(self.builder_target_dir) index_path = os.path.join(absdir, 'index.html') fileurl = 'file://' + pathname2url(index_path) webbrowser.open(fileurl) else: log.warn('open-docs-in-browser option was given, but ' 'the builder is not html! Ignoring.') else: log.warn('Sphinx Documentation subprocess failed with return ' 'code ' + str(proc.returncode)) retcode = proc.returncode if retcode is not None: # this is potentially dangerous in that there might be something # after the call to `setup` in `setup.py`, and exiting here will # prevent that from running. But there's no other apparent way # to signal what the return code should be. sys.exit(retcode) class AstropyBuildSphinx(AstropyBuildDocs): # pragma: no cover description = 'deprecated alias to the build_docs command' def run(self): warnings.warn( 'The "build_sphinx" command is now deprecated. Use' '"build_docs" instead.', AstropyDeprecationWarning) AstropyBuildDocs.run(self) sunpy-0.8.3/astropy_helpers/astropy_helpers/commands/install.py0000644000175000001440000000074613203277317024365 0ustar nabil00000000000000from setuptools.command.install import install as SetuptoolsInstall from ..utils import _get_platlib_dir class AstropyInstall(SetuptoolsInstall): user_options = SetuptoolsInstall.user_options[:] boolean_options = SetuptoolsInstall.boolean_options[:] def finalize_options(self): build_cmd = self.get_finalized_command('build') platlib_dir = _get_platlib_dir(build_cmd) self.build_lib = platlib_dir SetuptoolsInstall.finalize_options(self) sunpy-0.8.3/astropy_helpers/astropy_helpers/commands/install_lib.py0000644000175000001440000000100013203277317025173 0ustar nabil00000000000000from setuptools.command.install_lib import install_lib as SetuptoolsInstallLib from ..utils import _get_platlib_dir class AstropyInstallLib(SetuptoolsInstallLib): user_options = SetuptoolsInstallLib.user_options[:] boolean_options = SetuptoolsInstallLib.boolean_options[:] def finalize_options(self): build_cmd = self.get_finalized_command('build') platlib_dir = _get_platlib_dir(build_cmd) self.build_dir = platlib_dir SetuptoolsInstallLib.finalize_options(self) sunpy-0.8.3/astropy_helpers/astropy_helpers/commands/register.py0000644000175000001440000000454713212200427024532 0ustar nabil00000000000000from setuptools.command.register import register as SetuptoolsRegister class AstropyRegister(SetuptoolsRegister): """Extends the built in 'register' command to support a ``--hidden`` option to make the registered version hidden on PyPI by default. The result of this is that when a version is registered as "hidden" it can still be downloaded from PyPI, but it does not show up in the list of actively supported versions under http://pypi.python.org/pypi/astropy, and is not set as the most recent version. Although this can always be set through the web interface it may be more convenient to be able to specify via the 'register' command. Hidden may also be considered a safer default when running the 'register' command, though this command uses distutils' normal behavior if the ``--hidden`` option is omitted. """ user_options = SetuptoolsRegister.user_options + [ ('hidden', None, 'mark this release as hidden on PyPI by default') ] boolean_options = SetuptoolsRegister.boolean_options + ['hidden'] def initialize_options(self): SetuptoolsRegister.initialize_options(self) self.hidden = False def build_post_data(self, action): data = SetuptoolsRegister.build_post_data(self, action) if action == 'submit' and self.hidden: data['_pypi_hidden'] = '1' return data def _set_config(self): # The original register command is buggy--if you use .pypirc with a # server-login section *at all* the repository you specify with the -r # option will be overwritten with either the repository in .pypirc or # with the default, # If you do not have a .pypirc using the -r option will just crash. # Way to go distutils # If we don't set self.repository back to a default value _set_config # can crash if there was a user-supplied value for this option; don't # worry, we'll get the real value back afterwards self.repository = 'pypi' SetuptoolsRegister._set_config(self) options = self.distribution.get_option_dict('register') if 'repository' in options: source, value = options['repository'] # Really anything that came from setup.cfg or the command line # should override whatever was in .pypirc self.repository = value sunpy-0.8.3/astropy_helpers/astropy_helpers/commands/setup_package.py0000644000175000001440000000017013203277317025521 0ustar nabil00000000000000from os.path import join def get_package_data(): return {'astropy_helpers.commands': [join('src', 'compiler.c')]} sunpy-0.8.3/astropy_helpers/astropy_helpers/commands/test.py0000644000175000001440000000252413212200427023656 0ustar nabil00000000000000""" Different implementations of the ``./setup.py test`` command depending on what's locally available. If Astropy v1.1.0.dev or later is available it should be possible to import AstropyTest from ``astropy.tests.command``. If ``astropy`` can be imported but not ``astropy.tests.command`` (i.e. an older version of Astropy), we can use the backwards-compat implementation of the command. If Astropy can't be imported at all then there is a skeleton implementation that allows users to at least discover the ``./setup.py test`` command and learn that they need Astropy to run it. """ # Previously these except statements caught only ImportErrors, but there are # some other obscure exceptional conditions that can occur when importing # astropy.tests (at least on older versions) that can cause these imports to # fail try: import astropy # noqa try: from astropy.tests.command import AstropyTest except Exception: from ._test_compat import AstropyTest except Exception: # No astropy at all--provide the dummy implementation from ._dummy import _DummyCommand class AstropyTest(_DummyCommand): command_name = 'test' description = 'Run the tests for this package' error_msg = ( "The 'test' command requires the astropy package to be " "installed and importable.") sunpy-0.8.3/astropy_helpers/astropy_helpers/compat/0000755000175000017500000000000013232563477023041 5ustar nabilnabil00000000000000sunpy-0.8.3/astropy_helpers/astropy_helpers/compat/__pycache__/0000755000175000017500000000000013232563477025251 5ustar nabilnabil00000000000000sunpy-0.8.3/astropy_helpers/astropy_helpers/compat/__pycache__/__init__.cpython-36.pyc0000644000175000001440000000162613203277320030414 0ustar nabil000000000000003 ~ Zp@s ddZdS)csddfdd|DS)z This is for Python 2.x and 3.x compatibility. distutils expects Command options to all be byte strings on Python 2 and Unicode strings on Python 3. cSs|dkr dSt|S)N)str)xrH/home/nabil/Git/sunpy/astropy_helpers/astropy_helpers/compat/__init__.pyto_str_or_nonesz)_fix_user_options..to_str_or_nonecs"g|]}tfdd|DqS)c3s|]}|VqdS)Nr).0r)rrr sz/_fix_user_options...)tuple)ry)rrr sz%_fix_user_options..r)optionsr)rr_fix_user_optionssr N)r rrrrssunpy-0.8.3/astropy_helpers/astropy_helpers/compat/__init__.py0000644000175000001440000000056013203277317024132 0ustar nabil00000000000000def _fix_user_options(options): """ This is for Python 2.x and 3.x compatibility. distutils expects Command options to all be byte strings on Python 2 and Unicode strings on Python 3. """ def to_str_or_none(x): if x is None: return None return str(x) return [tuple(to_str_or_none(x) for x in y) for y in options] sunpy-0.8.3/astropy_helpers/astropy_helpers/extern/0000755000175000017500000000000013232563477023063 5ustar nabilnabil00000000000000sunpy-0.8.3/astropy_helpers/astropy_helpers/extern/__pycache__/0000755000175000017500000000000013232563477025273 5ustar nabilnabil00000000000000sunpy-0.8.3/astropy_helpers/astropy_helpers/extern/__pycache__/__init__.cpython-36.pyc0000644000175000001440000000023313211242144030422 0ustar nabil000000000000003 ~ ZM@sdS)NrrrH/home/nabil/Git/sunpy/astropy_helpers/astropy_helpers/extern/__init__.pyssunpy-0.8.3/astropy_helpers/astropy_helpers/extern/__pycache__/setup_package.cpython-36.pyc0000644000175000001440000000047013203277317031514 0ustar nabil000000000000003 ~ Z@s ddZdS)cCs dddgiS)Nzastropy_helpers.externzautomodapi/templates/*/*.rstznumpydoc/templates/*.rstrrr'astropy_helpers/extern/setup_package.pyget_package_datasrN)rrrrrssunpy-0.8.3/astropy_helpers/astropy_helpers/extern/automodapi/0000755000175000017500000000000013232563477025225 5ustar nabilnabil00000000000000sunpy-0.8.3/astropy_helpers/astropy_helpers/extern/automodapi/__pycache__/0000755000175000017500000000000013232563477027435 5ustar nabilnabil00000000000000sunpy-0.8.3/astropy_helpers/astropy_helpers/extern/automodapi/__pycache__/__init__.cpython-36.pyc0000644000175000001440000000027113211242144032566 0ustar nabil000000000000003 ~ Z@sdZdS)z0.6N) __version__rrS/home/nabil/Git/sunpy/astropy_helpers/astropy_helpers/extern/automodapi/__init__.pys././@LongLink0000000000000000000000000000015600000000000011217 Lustar 00000000000000sunpy-0.8.3/astropy_helpers/astropy_helpers/extern/automodapi/__pycache__/autodoc_enhancements.cpython-36.pycsunpy-0.8.3/astropy_helpers/astropy_helpers/extern/automodapi/__pycache__/autodoc_enhancements.cpyth0000644000175000001440000000662313211242144033647 0ustar nabil000000000000003 ~ Z@sdZddlZddlZddlZddlZddlmZddlmZm Z ddl m Z ej ddkrbe fZn e ejfZeejedkZe e jZdd ZerGd d d eZd d ZdS)z3 Miscellaneous enhancements to help autodoc along. N) LooseVersion)AttributeDocumenterModuleDocumenter) isdescriptorz1.5cGsFx4|jD]*}||jkrt|j|tr0|j|SPqWt||f|S)a This implements an improved attrgetter for type objects (i.e. classes) that can handle class attributes that are implemented as properties on a metaclass. Normally `getattr` on a class with a `property` (say, "foo"), would return the `property` object itself. However, if the class has a metaclass which *also* defines a `property` named "foo", ``getattr(cls, 'foo')`` will find the "foo" property on the metaclass and resolve it. For the purposes of autodoc we just want to document the "foo" property defined on the class, not on the metaclass. For example:: >>> class Meta(type): ... @property ... def foo(cls): ... return 'foo' ... >>> class MyClass(metaclass=Meta): ... @property ... def foo(self): ... """Docstring for MyClass.foo property.""" ... return 'myfoo' ... >>> getattr(MyClass, 'foo') 'foo' >>> type_object_attrgetter(MyClass, 'foo') >>> type_object_attrgetter(MyClass, 'foo').__doc__ 'Docstring for MyClass.foo property.' The last line of the example shows the desired behavior for the purposes of autodoc. )__mro____dict__ isinstancepropertygetattr)objattrdefargsbaser_/home/nabil/Git/sunpy/astropy_helpers/astropy_helpers/extern/automodapi/autodoc_enhancements.pytype_object_attrgetters %   rc@seZdZeddZdS)rcCs\|jttf}t|o2t|| o2t|jdk }|pZt|t oZtj | oZt|t S)Ninstancemethod) method_types class_typesMethodDescriptorTyperr type__name__rinspect isroutine)clsmember membernameisattrparentnon_attr_types isdatadescrrrcan_document_memberPs  z'AttributeDocumenter.can_document_memberN)r __module__ __qualname__ classmethodr"rrrrrOsrcCs|jdddl}|jtt|jdkr|j}|j}zs     1sunpy-0.8.3/astropy_helpers/astropy_helpers/extern/automodapi/__pycache__/automodapi.cpython-36.pyc0000644000175000001440000002437513211242144033204 0ustar nabil000000000000003 ~ Z=@sdZddlZddlZddlZddlZddlZddlmZejddkrLe Z ne Z dZ dZ dZd Zd Zejd ejd Zejd ejd ZdddZgdfddZddZddZdS)a This directive takes a single argument that must be a module or package. It will produce a block of documentation that includes the docstring for the package, an :ref:`automodsumm` directive, and an :ref:`automod-diagram` if there are any classes in the module. If only the main docstring of the module/package is desired in the documentation, use `automodule`_ instead of `automodapi`_. It accepts the following options: * ``:include-all-objects:`` If present, include not just functions and classes, but all objects. This includes variables, for which a possible docstring after the variable definition will be shown. * ``:no-inheritance-diagram:`` If present, the inheritance diagram will not be shown even if the module/package has classes. * ``:skip: str`` This option results in the specified object being skipped, that is the object will *not* be included in the generated documentation. This option may appear any number of times to skip multiple objects. * ``:no-main-docstr:`` If present, the docstring for the module/package will not be generated. The function and class tables will still be used, however. * ``:headings: str`` Specifies the characters (in one string) used as the heading levels used for the generated section. This must have at least 2 characters (any after 2 will be ignored). This also *must* match the rest of the documentation on this page for sphinx to be happy. Defaults to "-^", which matches the convention used for Python's documentation, assuming the automodapi call is inside a top-level section (which usually uses '='). * ``:no-heading:`` If specified do not create a top level heading for the section. That is, do not create a title heading with text like "packagename Package". The actual docstring for the package/module will still be shown, though, unless ``:no-main-docstr:`` is given. * ``:allowed-package-names: str`` Specifies the packages that functions/classes documented here are allowed to be from, as comma-separated list of package names. If not given, only objects that are actually in a subpackage of the package currently being documented are included. * ``:inherited-members:`` / ``:no-inherited-members:`` The global sphinx configuration option ``automodsumm_inherited_members`` decides if members that a class inherits from a base class are included in the generated documentation. The option ``:inherited-members:`` or ``:no-inherited-members:`` allows the user to overrride the global setting. This extension also adds three sphinx configuration options: * ``automodapi_toctreedirnm`` This must be a string that specifies the name of the directory the automodsumm generated documentation ends up in. This directory path should be relative to the documentation root (e.g., same place as ``index.rst``). Defaults to ``'api'``. * ``automodapi_writereprocessed`` Should be a bool, and if `True`, will cause `automodapi`_ to write files with any `automodapi`_ sections replaced with the content Sphinx processes after `automodapi`_ has run. The output files are not actually used by sphinx, so this option is only for figuring out the cause of sphinx warnings or other debugging. Defaults to `False`. * ``automodsumm_inherited_members`` Should be a bool and if ``True`` members that a class inherits from a base class are included in the generated documentation. Defaults to ``False``. .. _automodule: http://sphinx-doc.org/latest/ext/autodoc.html?highlight=automodule#directive-automodule N) find_mod_objsz> {modname} {pkgormod} {modhds}{pkgormodhds} {automoduleline} zV Classes {clshds} .. automodsumm:: {modname} :classes-only: {clsfuncoptions} z[ Functions {funchds} .. automodsumm:: {modname} :functions-only: {clsfuncoptions} z\ Variables {otherhds} .. automodsumm:: {modname} :variables-only: {clsfuncoptions} z Class Inheritance Diagram {clsinhsechds} .. automod-diagram:: {modname} :private-bases: :parts: 1 {allowedpkgnms} {skip} zL^(?:\.\.\s+automodapi::\s*)([A-Za-z0-9_.]+)\s*$((?:\n\s+:[a-zA-Z_\-]+:.*$)*))flagsz:([a-zA-Z_\-]+):(.*)$Tc+ Cs$tj|}t|dkr|rnd}tjj|j|jj}|dkrBd}ntjj|j|}|tjj |tjj |7}nd}|dg} xt t|dD]} || dd} |dkrd} n||dj df} g} d }}}d }g}d }g}d}xt j|| dd D]\}}|d kr$| j|jn|dkr4d }n|dkrDd }nt|dkrT|}nd|dkrdd }nT|dkr~|j|jn:|dkrd }n*|dkrd }n|dkrd }n |j|qWt|dkrd}d }nddj|}|}t|d krd}|r|j|jt|| d }|jdd \}}t|dkrn|dk rndj|}d|d}|rn|j|| t| | |d\}}}} |rdj| d}!nd}!|r| jtj| |t| |rdnd||rd nd!|!d"n| jtjdddd|!d"g}"|r |"j|| r&|"jd#dj| |r6|"j||rd|d krP|"jd$|d krd|"jd%d&j|"}#|r| jtj| |d'|#d(|r| jtj| |d!|#d)|r| r| jtj| |d'|#d*|r&|r&| rd#dj| }$nd}$tj| |d+||$d,}%|%jd-d}%| j|%| j|| ddqWdj| }&|jjrt|&trf|&}'n|&j|jj}'|dkrt j!tjj|jd.d/d0d1}(|(j"d2|(j"|'WdQRXn\|j#j$})|tjj%|)j&|d}*|*d37}*t j!tjj|j|*d4d0d1}(|(j"|'WdQRX|&S|SdS)5a Replaces `sourcestr`'s entries of ".. automdapi::" with the automodapi template form based on provided options. This is used with the sphinx event 'source-read' to replace `automodapi`_ entries before sphinx actually processes them, as automodsumm needs the code to be present to generate stub documentation. Parameters ---------- sourcestr : str The string with sphinx source to be checked for automodapi replacement. app : `sphinx.application.Application` The sphinx application. dotoctree : bool If `True`, a ":toctree:" option will be added in the ".. automodsumm::" sections of the template, pointing to the appropriate "generated" directory based on the Astropy convention (e.g. in ``docs/api``) docname : str The name of the file for this `sourcestr` (if known - if not, it can be `None`). If not provided and `dotoctree` is `True`, the generated files may end up in the wrong place. warnings : bool If `False`, all warnings that would normally be issued are silenced. Returns ------- newstr :str The string with automodapi entries replaced with the correct sphinx markup. rz :toctree: N.rr Tz-^Fskipzno-inheritance-diagramzno-main-docstrheadingsz no-headingzallowed-package-nameszinherited-memberszno-inherited-memberszinclude-all-objectsz:allowed-package-names: ,z7Not enough headings (got {0}, need 2), using default -^zFound additional options z in automodapi.) onlylocalsz.. automodule:: {modname})modnamePackageModule)rZmodhdsZpkgormodZ pkgormodhdsZautomodulelinez:skip: z:inherited-members:z:no-inherited-members:z )rZfunchdsclsfuncoptions)rZclshdsr)rZotherhdsr)rZ clsinhsechds allowedpkgnmsr z zunknown.automodapiautf8)encodingz **NEW DOC** z .automodapiw)'_automodapirexsplitlenospathjoinsrcdirconfigautomodapi_toctreedirnmrelpathdirnamerangecount_automodapiargsrexfindallappendstripwarnformatlstrip _mod_infoautomod_templ_modheaderautomod_templ_funcsautomod_templ_classesautomod_templ_varsautomod_templ_inhreplaceautomodapi_writereprocessed isinstance text_typedecodesource_encodingioopenwritebuilderenvsplitextdoc2path)+Z sourcestrappZ dotoctreedocnamewarningssplZ toctreestrZapi_dirZdoc_pathZnewstrsgrpZmodnmlocationtoskipZinhdiagZ maindocstrZtop_headZhdsrZ allowothersZ unknownopsinherited_membersopnameargsr msgh1h2ZopsstrsispkghasclsZhasfuncshasotherZ automodlinerZclsfuncoptionstrZclsskipZ diagram_entryZ newsourcestrZustrfr?filenamerTU/home/nabil/Git/sunpy/astropy_helpers/astropy_helpers/extern/automodapi/automodapi.pyautomodapi_replaces&                                         rVc Csd}}}xltt||dD]X\}}}||kr|pPs.        `sunpy-0.8.3/astropy_helpers/astropy_helpers/extern/automodapi/__pycache__/automodsumm.cpython-36.pyc0000644000175000001440000004132013211242144033401 0ustar nabil000000000000003 ~ Ze@sdZddlZddlZddlZddlZddlmZddlmZddl m Z ddl m Z m Z dd ZGd d d eZGd d d eZddZdZdeZdedZdedZejedededejZddZd ddZddZdS)!a This directive will produce an "autosummary"-style table for public attributes of a specified module. See the `sphinx.ext.autosummary`_ extension for details on this process. The main difference from the `autosummary`_ directive is that `autosummary`_ requires manually inputting all attributes that appear in the table, while this captures the entries automatically. This directive requires a single argument that must be a module or package. It also accepts any options supported by the `autosummary`_ directive- see `sphinx.ext.autosummary`_ for details. It also accepts some additional options: * ``:classes-only:`` If present, the autosummary table will only contain entries for classes. This cannot be used at the same time with ``:functions-only:`` or ``:variables-only:``. * ``:functions-only:`` If present, the autosummary table will only contain entries for functions. This cannot be used at the same time with ``:classes-only:`` or ``:variables-only:``. * ``:variables-only:`` If present, the autosummary table will only contain entries for variables (everything except functions and classes). This cannot be used at the same time with ``:classes-only:`` or ``:functions-only:``. * ``:skip: obj1, [obj2, obj3, ...]`` If present, specifies that the listed objects should be skipped and not have their documentation generated, nor be included in the summary table. * ``:allowed-package-names: pkgormod1, [pkgormod2, pkgormod3, ...]`` Specifies the packages that functions/classes documented here are allowed to be from, as comma-separated list of package names. If not given, only objects that are actually in a subpackage of the package currently being documented are included. * ``:inherited-members:`` or ``:no-inherited-members:`` The global sphinx configuration option ``automodsumm_inherited_members`` decides if members that a class inherits from a base class are included in the generated documentation. The flags ``:inherited-members:`` or ``:no-inherited-members:`` allows overrriding this global setting. This extension also adds two sphinx configuration options: * ``automodsumm_writereprocessed`` Should be a bool, and if ``True``, will cause `automodsumm`_ to write files with any ``automodsumm`` sections replaced with the content Sphinx processes after ``automodsumm`` has run. The output files are not actually used by sphinx, so this option is only for figuring out the cause of sphinx warnings or other debugging. Defaults to ``False``. * ``automodsumm_inherited_members`` Should be a bool and if ``True``, will cause `automodsumm`_ to document class members that are inherited from a base class. This value can be overriden for any particular automodsumm directive by including the ``:inherited-members:`` or ``:no-inherited-members:`` options. Defaults to ``False``. .. _sphinx.ext.autosummary: http://sphinx-doc.org/latest/ext/autosummary.html .. _autosummary: http://sphinx-doc.org/latest/ext/autosummary.html#directive-autosummary .. _automod-diagram: automod-diagram directive ========================= This directive will produce an inheritance diagram like that of the `sphinx.ext.inheritance_diagram`_ extension. This directive requires a single argument that must be a module or package. It accepts no options. .. note:: Like 'inheritance-diagram', 'automod-diagram' requires `graphviz `_ to generate the inheritance diagram. .. _sphinx.ext.inheritance_diagram: http://sphinx-doc.org/latest/ext/inheritance.html N) Autosummary)InheritanceDiagram)flag) find_mod_objscleanup_whitespacecCs$|dkr gSdd|jdDSdS)z} A directive option conversion function that converts the option into a list of strings. Used for 'skip' option. NcSsg|] }|jqS)strip).0srrV/home/nabil/Git/sunpy/astropy_helpers/astropy_helpers/extern/automodapi/automodsumm.py jsz'_str_list_converter..,)split)argumentrrr _str_list_converterbsrc@sneZdZdZdZdZdZeej Z e e d<e e d<e e d<e e d<e e d<e e d <e e d <d d Z d dZ dS) AutomodsummrrFzfunctions-onlyz classes-onlyzvariables-onlyskipzallowed-package-nameszinherited-memberszno-inherited-memberscsF|jjjj}|jd}g|_g}yt|\}}}Wn*tk r\g|_|jd||jSXzd|j k}d|j k}d|j k} ||| gj ddkr|j dd }}} gd |j krt |j d } x(|D] } | | kr| j | j| qWt| dkr|jd j| |d |rZg} xt||D]*\} }| kr*tj|r*| j| q*Wn|rg} xt||D]*\} }| krptj|rp| j| qpWnf| rg} xZt||D]8\} }| krtj|ptj| r| j| qWnfd d|D} | |_||jd<||jd<|jtj||j|Sg|_XdS)NrzCouldn't import module zfunctions-onlyz classes-onlyzvariables-onlyTrzSmore than one of functions-only, classes-only, or variables-only defined. Ignoring.FrzSTried to skip objects {objs} in module {mod}, but they were not present. Ignoring.)objsmodcsg|]}|kr|qSrr)r nm) skipnamesrr r sz#Automodsumm.run..z py:module)statedocumentsettingsenv argumentswarningsr ImportErrorwarnoptionscountwarningsetremoveappendlenformatzipinspect isroutineisclasscontent temp_data ref_contextextendrrun)selfrmodnamenodelist localnamesZfqnsrZfunconlyZclsonlyZvaronlyZoption_skipnameslnmcontrobjr)rr r0{sd              zAutomodsumm.runcCsd|jd<tj||S)NTzimported-members)genoptr get_items)r1namesrrr r9s zAutomodsumm.get_itemsN)__name__ __module__ __qualname__required_argumentsoptional_argumentsfinal_argument_whitespace has_contentdictr option_specrrr0r9rrrr rms Hrc@s.eZdZeejZeed<eed<ddZdS)Automoddiagramzallowed-package-namesrc CsyD|jjdg}t|dkr dn|}t|jd|ddd\}}Wn0tk rtg|_|jd|jd|jSX|jjdg}g}x>t||D]0\}}|j dd |krqt j |r|j |qW|j}z$t|dkrd j |g|_tj|S||_XdS) Nzallowed-package-namesrT) onlylocalsrzCouldn't import module r. )r getr&rrrrrr(rr)r+r%joinrr0) r1olsZnmsrrZclsnmsnoZoldargsrrr r0s*"   zAutomoddiagram.runN)r;r<r=rBrrCrr0rrrr rDs rDc Cs&|jj}g}x>|jD]4}|j|}tjj|r|j|tjj|dqWg}xx|D]p}t ||}|j||j j rV|rVtjj |j |d}t|d(} x |D]} | j| | jdqWWdQRXqVWxVt||D]H\}}tjj|d} t|dkrt|||j|j|j| |j |j jdqWdS)Nrz .automodsummw r)builderrinfosuffix base_pathinherited_members)rPr found_docsdoc2pathospathisfiler%splitext automodsumm_to_autosummary_linesconfigautomodsumm_writereprocessedrJsrcdiropenwriter(r&generate_automodsumm_docsrrQautomodsumm_inherited_members) apprZ filestosearchdocnamefilenameZlinesssfnlinesoutfnflrRrrr process_automodsumm_generations0          rkz(?:\n|$)z&^\n?(\s*)\.\. automodsumm::\s*(\S+)\s*z(?:\1(\s+)\S.*)z (?:\1\4\S.*(?z*)c"s&tjj|jjj|}tj|ddr}ddlm }y |j }Wnt k rT|j }YnX|j |krtjj|d}|j|j|d|d}n|j}WdQRXtj|ddd }d dd } d dd } d dd } d dd } g} x&tt|| | | | D] \}\}}}}}||dkr*d n|}|jd}g}g}d}}}xttt|D]\}}d|kr|d}||=d|krd}||=d|krd}||=d|kr|jt|jdd||=d|kr`|jt|jdd||=q`W|||gjddkrJd}tfddt|d dD}|jd|||fq| j|d|ddg| j|t|dkr~dn|}xtt||dD]z\}} }!||krq|rt j!|! rĐq|rt j"|! rܐq|rt j"|!st j!|!rq| j#||qWqW| j#d| S)ae Generates lines from a file with an "automodsumm" entry suitable for feeding into "autosummary". Searches the provided file for `automodsumm` directives and returns a list of lines specifying the `autosummary` commands for the modules requested. This does *not* return the whole file contents - just an autosummary section in place of any :automodsumm: entries. Note that any options given for `automodsumm` are also included in the generated `autosummary` section. Parameters ---------- fn : str The name of the file to search for `automodsumm` entries. app : sphinx.application.Application The sphinx Application object Return ------ lines : list of str Lines for all `automodsumm` entries with the entries replaced by `autosummary` and the module's members added. utf8)encodingr) automodapirTFNz rOz:functions-only:z:classes-only:z:variables-only:z:skip:z:allowed-package-names:zdDefined more than one of functions-only, classes-only, and variables-only. Skipping this directive.csg|]}|jdqS)rO)r!)r j)splrr r qsz4automodsumm_to_autosummary_lines..z [automodsumm]z.. currentmodule:: z.. autosummary::)rE)$rWrXrJrPrr^ior_rvrq extensionsAttributeError _extensionsr;rZautomodapi_replaceread_automodsummrexr enumerater(reversedlistr/rreplacer!sumrangerr&rr)r*r+r%)"fnrcZfullfnfrrqrzrdZfilestrZindent1smodsZopssecsZindent2sZ remaindersnewlinesii1i2modnmopsremZ allindentZoplinestoskip allowedpkgnmsZ funcsonlyZclssonlyZvarsonlylnmsgZlnnumrKrfqnr7r)rxr r[s~             "   r[.rstFc 3#s<ddlm} ddlm} mddlm} m} ddlm } ddl m ddl m }m}ddlm}d d lm}|d krx| }|d kr| }tjjtjjtd tjj|d g}|d k r| }|j||dn|r|jd|||}||d}|||d}t|dkrd}||jt||tt|}g}x t|D]\}}}}|d krRq6tjjtjj||}| |y | |}Wn8t k r}z|d||fw6WYd d }~XnXt|dkr|\}}}nt|dkr|\}}}} tjj|||}!tjj!|!rq6|j"|!t#|!d}"z||}#|d k rF|j$|}$n>d}%y|j$|%|#j%}$Wn$|k r|j$|%d}$YnXgffdd }&gdffdd }'i}(|#j%dkr |&|d |(d<|&|d\|(d <|(d!<|&|d"\|(d#<|(d$<|&|d%\|(d&<|(d'<n|#j%d"kr|d k r(|})n|})d(d)g}*|'|d |)d*|(d<|'|d+|*|)d*\|(d,<|(d-<|'|d.|)d*\|(d/<|(d0<|(d,j&|(d/j&|j'd1}+|#j%d>krd1j|+d d?},|+d@}-d1j|+dAd }.|-|(d"<nd1j|+d dB|+dC},}.||(d3<|,|(d<|.|(d4<|+dD|(d5<|#j%|(d6<t|.d7|(d8<d1|,kr^|,j(d1d9j'd9d d }/n|,}/tjj)tjj||/ rtjj)tjj||/j*d9d dr|/j*d9d d}/tjj+tjj||/d:r |j(|d;j,d9}0d all Ncs$g|]}|ks|jd r|qS)_) startswith)r x)include_publicrr r szFgenerate_automodsumm_docs..get_members_mod..)dirr{objtyper%)r7typritemsname documenterpublic)rr)rr get_members_mods  z2generate_automodsumm_docs..get_members_modFc sg}|rt|}n(t|dr,tt|d}nt|dj}xT|D]L}y|||}Wntk rnw@YnX|dks|j|kr@|j|q@Wfdd|D}||fS)z| typ = None -> all include_base -> include attrs that are from a base class __slots____dict__Ncs$g|]}|ks|jd r|qS)r)r)r r)rrr r &szHgenerate_automodsumm_docs..get_members_class..)rhasattrtuplegetattrkeysr{rr%) r7rr include_baserr:rrr)rr)rr get_members_class s      z4generate_automodsumm_docs..get_members_classmodulemembersfunction functions all_functionsclassclasses all_classes exception exceptionsall_exceptions__init____call__)rmethodmethods all_methods attribute attributesall_attributesrFrsfullnameobjnamerr= underline/zreferences.txtrvz..Z referencefile)rrrrrHrHrH)1sphinx.jinja2gluersphinx.ext.autosummaryrrsphinx.ext.autosummary.generaterrsphinx.util.osutilrsphinx.util.inspectrjinja2rrjinja2.sandboxrutilsrrWrXrJdirname__file__initinsertr&r'rr#sortedabspathrrYr%r_ get_templatersortrrisdirrsplitexistsr!renderr`rclose)3rgZsrcfnrRrrQrSrP template_dirrTrrrrrrrrfind_autosummary_in_lines template_dirstemplate_loader template_envrr new_filesrrX template_nameZ inherited_memZimport_by_name_valueser7parent module_namerridoctemplateZtmplstrrrnsrZapi_class_methodspartsmod_namecls_nameobj_nameZ mod_name_dirZ ndirsbackZref_file_rel_segmentsrenderedr)rrr ras                              $    racCsfddlm}|j|j|jd|jdt|jdt|jdt|j ddd |j d dd dS) Nr)autodoc_enhancementszsphinx.ext.inheritance_diagramzautomod-diagram automodsummzbuilder-initedr]FTrbr) rvrsetup_extensionr; add_directiverDrconnectrkadd_config_value)rcrrrr setup|s      r)rNNNNNF)__doc__r)rWreryrrZsphinx.ext.inheritance_diagramrZdocutils.parsers.rst.directivesrrrrrrrDrkZ _lineendrexZ_hdrexZ_oprex1Z_oprex2compile MULTILINErr[rarrrrr Ts2    \'  y j././@LongLink0000000000000000000000000000015000000000000011211 Lustar 00000000000000sunpy-0.8.3/astropy_helpers/astropy_helpers/extern/automodapi/__pycache__/smart_resolver.cpython-36.pycsunpy-0.8.3/astropy_helpers/astropy_helpers/extern/automodapi/__pycache__/smart_resolver.cpython-36.0000644000175000001440000000463213211242144033367 0ustar nabil000000000000003 ~ Z@s0dZddlmZmZddZddZddZd S) aA The classes in the astropy docs are documented by their API location, which is not necessarily where they are defined in the source. This causes a problem when certain automated features of the doc build, such as the inheritance diagrams or the `Bases` list of a class reference a class by its canonical location rather than its "user" location. In the `autodoc-process-docstring` event, a mapping from the actual name to the API name is maintained. Later, in the `missing-reference` event, unresolved references are looked up in this dictionary and corrected if possible. )literal referencecCs>t|tr:|j}t|ds i|_|j}|||jd|j<dS)Nclass_name_mapping.) isinstancetypeenvhasattrr __module____name__)appwhatnameobjoptionslinesrmappingrY/home/nabil/Git/sunpy/astropy_helpers/astropy_helpers/extern/automodapi/smart_resolver.pyprocess_docstrings   rcCst|dsi|_|j}|d}|d}|dkr|d}d}||krd |kr`|jd d \}}n|}|jd r|jd  r|d jS|dkrd |kr||kr|}d |}|dkod |ko||krd |kr|jd d \}} d |}||}|jd d } |j} ||kr| | kr|| | dkr| | d|d} |d r\d|jkr\t|d}tdddd} || d<| | d<| j || S||kr|||} |d rd|jkrt| d}|j dj ||d|j d| ||} | dk r|| d<| SdS)Nrreftype reftargetrclassexcmethr___rzpy:class refexplicit~)textT)internalreftitlerefuripyrefdoc)rrrr)rr)r) r rrsplit startswithdeepcopyintersphinx_named_inventory rawsourcerrappenddomains resolve_xrefbuilder)r rnodecontnoderrrsuffixfrontrprefix inventory newtargetnewnoderrrmissing_reference_handlers`                r9cCs|jdt|jdtdS)Nzautodoc-process-docstringzmissing-reference)connectrr9)r rrrsetupZs r;N)__doc__Zdocutils.nodesrrrr9r;rrrrs >sunpy-0.8.3/astropy_helpers/astropy_helpers/extern/automodapi/__pycache__/utils.cpython-36.pyc0000644000175000001440000001373713211242144032202 0ustar nabil000000000000003 ~ Z@sddlZddlZddlZddlZddlmZddlmZejddkrPddZ nddZ dZ d Z d Z d Z d d ZdddZdddZdS)N)warn)find_autosummary_in_docstringcCs|jS)N)items) dictionaryrP/home/nabil/Git/sunpy/astropy_helpers/astropy_helpers/extern/automodapi/utils.py iteritems sr cCs|jS)N)r )rrrrr sz  z z cCsD|jd}xt|kr$|jtt}qWxt|kr>|jtt}q(W|S)zw Make sure there are never more than two consecutive newlines, and that there are no trailing whitespaces. r )strip SPACE_NEWLINEreplaceSINGLE_NEWLINETRIPLE_NEWLINEDOUBLE_NEWLINE)textrrrcleanup_whitespaces    rFcs0ttjtdr2fddjD}nfddtD}tjfdd|D}fdd|D}g}xTt||D]F\}}t|drt|dr|j |j d |j q|j d |qW|r&fd d|Dfd dt |D}fd dt |D}fd dt |D}|||fS)a Returns all the public attributes of a module referenced by name. .. note:: The returned list *not* include subpackages or modules of `modname`,nor does it include private attributes (those that beginwith '_' or are not in `__all__`). Parameters ---------- modname : str The name of the module to search. onlylocals : bool If True, only attributes that are either members of `modname` OR one of its modules or subpackages will be included. Returns ------- localnames : list of str A list of the names of the attributes as they are named in the module `modname` . fqnames : list of str A list of the full qualified names of the attributes (e.g., ``astropy.utils.misc.find_mod_objs``). For attributes that are simple variables, this is based on the local name, but for functions or classes it can be different if they are actually defined elsewhere and just referenced in `modname`. objs : list of objects A list of the actual attributes themselves (in the same order as the other arguments) __all__csg|]}|j|fqSr)__dict__).0k)modrr Rsz!find_mod_objs..cs&g|]}|ddkr|j|fqS)r_)r)rr)rrrrTscsg|]\}}|s|qSrr)rrv)ismodulerrrXscsg|]\}}|s|qSrr)rrr)rrrrYs __module____name__.csg|]}|jqSr) startswith)rfqn)modnamerrrdscsg|]\}}|r|qSrr)rie)validsrrrescsg|]\}}|r|qSrr)rr"r#)r$rrrfscsg|]\}}|r|qSrr)rr"r#)r$rrrgs) __import__sysmoduleshasattrrdirinspectrzipappendrr enumerate)r! onlylocalspkgitems localnamesobjsfqnamesobjlnmr)rrr!r$r find_mod_objs-s&!  r5cCs"tjd}tjd}tjd}tjd}tjd}tjd}tjd} tjd} g} d } d } d }|}d }d }x|D]}|r|j|}|r|jd } |rttjjtjj|| } qt|j|}|r|jd j} qt| j|}|rd }qt| j|}|rd }qt|jj drt |qt|j|}|r|jd j}|j drJ|d d }|rn|j |d rnd||f}| j || | |fqt|j st|j |drqtd }|j|}|rd }|jd }d } d } d }qt|j |}|r|jd j}| j t||dqt|j|}|rt|jd}qtqtW| S)aFind out what items appear in autosummary:: directives in the given lines. Returns a list of (name, toctree, template, inherited_members) where *name* is a name of an object and *toctree* the :toctree: path of the corresponding autosummary directive (relative to the root of the file name), *template* the value of the :template: option, and *inherited_members* is the value of the :inherited-members: option. *toctree*, *template*, and *inherited_members* are ``None`` if the directive does not have the corresponding options set. .. note:: This is a slightly modified version of ``sphinx.ext.autosummary.generate.find_autosummary_in_lines`` which recognizes the ``inherited-members`` option. z^(\s*)\.\.\s+autosummary::\s*z.^\s*\.\.\s+automodule::\s*([A-Za-z0-9_.]+)\s*$z4^\s*\.\.\s+(current)?module::\s*([a-zA-Z0-9_.]+)\s*$z%^\s+(~?[_a-zA-Z][a-zA-Z0-9_.]*)\s*.*?z^\s+:toctree:\s*(.*?)\s*$z^\s+:template:\s*(.*?)\s*$z^\s+:inherited-members:\s*$z^\s+:no-inherited-members:\s*$NFT:~rz%s.%s )filename)recompilematchgroupospathjoindirnamer rrr,searchextendr)linesmoduler;Zautosummary_reZ automodule_reZ module_reZautosummary_item_reZtoctree_arg_reZtemplate_arg_reZinherited_members_arg_reZno_inherited_members_arg_reZ documentedtoctreetemplateinherited_memberscurrent_moduleZin_autosummary base_indentlinemnamerrr)find_autosummary_in_lines_for_automodsummls                      rQ)F)NN)r*r&r=rAwarningsrZsphinx.ext.autosummary.generater version_infor r rrrrr5rQrrrrs    ?sunpy-0.8.3/astropy_helpers/astropy_helpers/extern/automodapi/templates/0000755000175000017500000000000013232563477027223 5ustar nabilnabil00000000000000sunpy-0.8.3/astropy_helpers/astropy_helpers/extern/automodapi/templates/autosummary_core/0000755000175000017500000000000013232563477032621 5ustar nabilnabil00000000000000sunpy-0.8.3/astropy_helpers/astropy_helpers/extern/automodapi/templates/autosummary_core/base.rst0000644000175000001440000000025213203277317033243 0ustar nabil00000000000000{% if referencefile %} .. include:: {{ referencefile }} {% endif %} {{ objname }} {{ underline }} .. currentmodule:: {{ module }} .. auto{{ objtype }}:: {{ objname }} sunpy-0.8.3/astropy_helpers/astropy_helpers/extern/automodapi/templates/autosummary_core/class.rst0000644000175000001440000000221113203277317033433 0ustar nabil00000000000000{% if referencefile %} .. include:: {{ referencefile }} {% endif %} {{ objname }} {{ underline }} .. currentmodule:: {{ module }} .. autoclass:: {{ objname }} :show-inheritance: {% if '__init__' in methods %} {% set caught_result = methods.remove('__init__') %} {% endif %} {% block attributes_summary %} {% if attributes %} .. rubric:: Attributes Summary .. autosummary:: {% for item in attributes %} ~{{ name }}.{{ item }} {%- endfor %} {% endif %} {% endblock %} {% block methods_summary %} {% if methods %} .. rubric:: Methods Summary .. autosummary:: {% for item in methods %} ~{{ name }}.{{ item }} {%- endfor %} {% endif %} {% endblock %} {% block attributes_documentation %} {% if attributes %} .. rubric:: Attributes Documentation {% for item in attributes %} .. autoattribute:: {{ item }} {%- endfor %} {% endif %} {% endblock %} {% block methods_documentation %} {% if methods %} .. rubric:: Methods Documentation {% for item in methods %} .. automethod:: {{ item }} {%- endfor %} {% endif %} {% endblock %} sunpy-0.8.3/astropy_helpers/astropy_helpers/extern/automodapi/templates/autosummary_core/module.rst0000644000175000001440000000127713203277317033626 0ustar nabil00000000000000{% if referencefile %} .. include:: {{ referencefile }} {% endif %} {{ objname }} {{ underline }} .. automodule:: {{ fullname }} {% block functions %} {% if functions %} .. rubric:: Functions .. autosummary:: {% for item in functions %} {{ item }} {%- endfor %} {% endif %} {% endblock %} {% block classes %} {% if classes %} .. rubric:: Classes .. autosummary:: {% for item in classes %} {{ item }} {%- endfor %} {% endif %} {% endblock %} {% block exceptions %} {% if exceptions %} .. rubric:: Exceptions .. autosummary:: {% for item in exceptions %} {{ item }} {%- endfor %} {% endif %} {% endblock %} sunpy-0.8.3/astropy_helpers/astropy_helpers/extern/automodapi/__init__.py0000644000175000001440000000002413203277317026311 0ustar nabil00000000000000__version__ = '0.6' sunpy-0.8.3/astropy_helpers/astropy_helpers/extern/automodapi/autodoc_enhancements.py0000644000175000001440000001230413203277317030744 0ustar nabil00000000000000""" Miscellaneous enhancements to help autodoc along. """ import inspect import sys import types import sphinx from distutils.version import LooseVersion from sphinx.ext.autodoc import AttributeDocumenter, ModuleDocumenter from sphinx.util.inspect import isdescriptor if sys.version_info[0] == 3: class_types = (type,) else: class_types = (type, types.ClassType) SPHINX_LT_15 = (LooseVersion(sphinx.__version__) < LooseVersion('1.5')) MethodDescriptorType = type(type.__subclasses__) # See # https://github.com/astropy/astropy-helpers/issues/116#issuecomment-71254836 # for further background on this. def type_object_attrgetter(obj, attr, *defargs): """ This implements an improved attrgetter for type objects (i.e. classes) that can handle class attributes that are implemented as properties on a metaclass. Normally `getattr` on a class with a `property` (say, "foo"), would return the `property` object itself. However, if the class has a metaclass which *also* defines a `property` named "foo", ``getattr(cls, 'foo')`` will find the "foo" property on the metaclass and resolve it. For the purposes of autodoc we just want to document the "foo" property defined on the class, not on the metaclass. For example:: >>> class Meta(type): ... @property ... def foo(cls): ... return 'foo' ... >>> class MyClass(metaclass=Meta): ... @property ... def foo(self): ... \"\"\"Docstring for MyClass.foo property.\"\"\" ... return 'myfoo' ... >>> getattr(MyClass, 'foo') 'foo' >>> type_object_attrgetter(MyClass, 'foo') >>> type_object_attrgetter(MyClass, 'foo').__doc__ 'Docstring for MyClass.foo property.' The last line of the example shows the desired behavior for the purposes of autodoc. """ for base in obj.__mro__: if attr in base.__dict__: if isinstance(base.__dict__[attr], property): # Note, this should only be used for properties--for any other # type of descriptor (classmethod, for example) this can mess # up existing expectations of what getattr(cls, ...) returns return base.__dict__[attr] break return getattr(obj, attr, *defargs) if SPHINX_LT_15: # Provided to work around a bug in Sphinx # See https://github.com/sphinx-doc/sphinx/pull/1843 class AttributeDocumenter(AttributeDocumenter): @classmethod def can_document_member(cls, member, membername, isattr, parent): non_attr_types = cls.method_types + class_types + \ (MethodDescriptorType,) isdatadesc = isdescriptor(member) and not \ isinstance(member, non_attr_types) and not \ type(member).__name__ == "instancemethod" # That last condition addresses an obscure case of C-defined # methods using a deprecated type in Python 3, that is not # otherwise exported anywhere by Python return isdatadesc or (not isinstance(parent, ModuleDocumenter) and not inspect.isroutine(member) and not isinstance(member, class_types)) def setup(app): # Must have the autodoc extension set up first so we can override it app.setup_extension('sphinx.ext.autodoc') # Need to import this too since it re-registers all the documenter types # =_= import sphinx.ext.autosummary.generate app.add_autodoc_attrgetter(type, type_object_attrgetter) if sphinx.version_info < (1, 4, 2): # this is a really ugly hack to supress a warning that sphinx 1.4 # generates when overriding an existing directive (which is *desired* # behavior here). As of sphinx v1.4.2, this has been fixed: # https://github.com/sphinx-doc/sphinx/issues/2451 # But we leave it in for 1.4.0/1.4.1 . But if the "needs_sphinx" is # eventually updated to >= 1.4.2, this should be removed entirely (in # favor of the line in the "else" clause) _oldwarn = app._warning _oldwarncount = app._warncount try: try: # *this* is in a try/finally because we don't want to force six as # a real dependency. In sphinx 1.4, six is a prerequisite, so # there's no issue. But in older sphinxes this may not be true... # but the inderlying warning is absent anyway so we let it slide. from six import StringIO app._warning = StringIO() except ImportError: pass app.add_autodocumenter(AttributeDocumenter) finally: app._warning = _oldwarn app._warncount = _oldwarncount else: suppress_warnigns_orig = app.config.suppress_warnings[:] if 'app.add_directive' not in app.config.suppress_warnings: app.config.suppress_warnings.append('app.add_directive') try: app.add_autodocumenter(AttributeDocumenter) finally: app.config.suppress_warnings = suppress_warnigns_orig sunpy-0.8.3/astropy_helpers/astropy_helpers/extern/automodapi/automodapi.py0000644000175000001440000003665113203277317026733 0ustar nabil00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ This directive takes a single argument that must be a module or package. It will produce a block of documentation that includes the docstring for the package, an :ref:`automodsumm` directive, and an :ref:`automod-diagram` if there are any classes in the module. If only the main docstring of the module/package is desired in the documentation, use `automodule`_ instead of `automodapi`_. It accepts the following options: * ``:include-all-objects:`` If present, include not just functions and classes, but all objects. This includes variables, for which a possible docstring after the variable definition will be shown. * ``:no-inheritance-diagram:`` If present, the inheritance diagram will not be shown even if the module/package has classes. * ``:skip: str`` This option results in the specified object being skipped, that is the object will *not* be included in the generated documentation. This option may appear any number of times to skip multiple objects. * ``:no-main-docstr:`` If present, the docstring for the module/package will not be generated. The function and class tables will still be used, however. * ``:headings: str`` Specifies the characters (in one string) used as the heading levels used for the generated section. This must have at least 2 characters (any after 2 will be ignored). This also *must* match the rest of the documentation on this page for sphinx to be happy. Defaults to "-^", which matches the convention used for Python's documentation, assuming the automodapi call is inside a top-level section (which usually uses '='). * ``:no-heading:`` If specified do not create a top level heading for the section. That is, do not create a title heading with text like "packagename Package". The actual docstring for the package/module will still be shown, though, unless ``:no-main-docstr:`` is given. * ``:allowed-package-names: str`` Specifies the packages that functions/classes documented here are allowed to be from, as comma-separated list of package names. If not given, only objects that are actually in a subpackage of the package currently being documented are included. * ``:inherited-members:`` / ``:no-inherited-members:`` The global sphinx configuration option ``automodsumm_inherited_members`` decides if members that a class inherits from a base class are included in the generated documentation. The option ``:inherited-members:`` or ``:no-inherited-members:`` allows the user to overrride the global setting. This extension also adds three sphinx configuration options: * ``automodapi_toctreedirnm`` This must be a string that specifies the name of the directory the automodsumm generated documentation ends up in. This directory path should be relative to the documentation root (e.g., same place as ``index.rst``). Defaults to ``'api'``. * ``automodapi_writereprocessed`` Should be a bool, and if `True`, will cause `automodapi`_ to write files with any `automodapi`_ sections replaced with the content Sphinx processes after `automodapi`_ has run. The output files are not actually used by sphinx, so this option is only for figuring out the cause of sphinx warnings or other debugging. Defaults to `False`. * ``automodsumm_inherited_members`` Should be a bool and if ``True`` members that a class inherits from a base class are included in the generated documentation. Defaults to ``False``. .. _automodule: http://sphinx-doc.org/latest/ext/autodoc.html?highlight=automodule#directive-automodule """ # Implementation note: # The 'automodapi' directive is not actually implemented as a docutils # directive. Instead, this extension searches for the 'automodapi' text in # all sphinx documents, and replaces it where necessary from a template built # into this extension. This is necessary because automodsumm (and autosummary) # use the "builder-inited" event, which comes before the directives are # actually built. import inspect import io import os import re import sys from .utils import find_mod_objs if sys.version_info[0] == 3: text_type = str else: text_type = unicode automod_templ_modheader = """ {modname} {pkgormod} {modhds}{pkgormodhds} {automoduleline} """ automod_templ_classes = """ Classes {clshds} .. automodsumm:: {modname} :classes-only: {clsfuncoptions} """ automod_templ_funcs = """ Functions {funchds} .. automodsumm:: {modname} :functions-only: {clsfuncoptions} """ automod_templ_vars = """ Variables {otherhds} .. automodsumm:: {modname} :variables-only: {clsfuncoptions} """ automod_templ_inh = """ Class Inheritance Diagram {clsinhsechds} .. automod-diagram:: {modname} :private-bases: :parts: 1 {allowedpkgnms} {skip} """ _automodapirex = re.compile(r'^(?:\.\.\s+automodapi::\s*)([A-Za-z0-9_.]+)' r'\s*$((?:\n\s+:[a-zA-Z_\-]+:.*$)*)', flags=re.MULTILINE) # the last group of the above regex is intended to go into finall with the below _automodapiargsrex = re.compile(r':([a-zA-Z_\-]+):(.*)$', flags=re.MULTILINE) def automodapi_replace(sourcestr, app, dotoctree=True, docname=None, warnings=True): """ Replaces `sourcestr`'s entries of ".. automdapi::" with the automodapi template form based on provided options. This is used with the sphinx event 'source-read' to replace `automodapi`_ entries before sphinx actually processes them, as automodsumm needs the code to be present to generate stub documentation. Parameters ---------- sourcestr : str The string with sphinx source to be checked for automodapi replacement. app : `sphinx.application.Application` The sphinx application. dotoctree : bool If `True`, a ":toctree:" option will be added in the ".. automodsumm::" sections of the template, pointing to the appropriate "generated" directory based on the Astropy convention (e.g. in ``docs/api``) docname : str The name of the file for this `sourcestr` (if known - if not, it can be `None`). If not provided and `dotoctree` is `True`, the generated files may end up in the wrong place. warnings : bool If `False`, all warnings that would normally be issued are silenced. Returns ------- newstr :str The string with automodapi entries replaced with the correct sphinx markup. """ spl = _automodapirex.split(sourcestr) if len(spl) > 1: # automodsumm is in this document # Use app.srcdir because api folder should be inside source folder not # at folder where sphinx is run. if dotoctree: toctreestr = ':toctree: ' api_dir = os.path.join(app.srcdir, app.config.automodapi_toctreedirnm) if docname is None: doc_path = '.' else: doc_path = os.path.join(app.srcdir, docname) toctreestr += os.path.relpath(api_dir, os.path.dirname(doc_path)) else: toctreestr = '' newstrs = [spl[0]] for grp in range(len(spl) // 3): modnm = spl[grp * 3 + 1] # find where this is in the document for warnings if docname is None: location = None else: location = (docname, spl[0].count('\n')) # initialize default options toskip = [] inhdiag = maindocstr = top_head = True hds = '-^' allowedpkgnms = [] allowothers = False # look for actual options unknownops = [] inherited_members = None for opname, args in _automodapiargsrex.findall(spl[grp * 3 + 2]): if opname == 'skip': toskip.append(args.strip()) elif opname == 'no-inheritance-diagram': inhdiag = False elif opname == 'no-main-docstr': maindocstr = False elif opname == 'headings': hds = args elif opname == 'no-heading': top_head = False elif opname == 'allowed-package-names': allowedpkgnms.append(args.strip()) elif opname == 'inherited-members': inherited_members = True elif opname == 'no-inherited-members': inherited_members = False elif opname == 'include-all-objects': allowothers = True else: unknownops.append(opname) # join all the allowedpkgnms if len(allowedpkgnms) == 0: allowedpkgnms = '' onlylocals = True else: allowedpkgnms = ':allowed-package-names: ' + ','.join(allowedpkgnms) onlylocals = allowedpkgnms # get the two heading chars if len(hds) < 2: msg = 'Not enough headings (got {0}, need 2), using default -^' if warnings: app.warn(msg.format(len(hds)), location) hds = '-^' h1, h2 = hds.lstrip()[:2] # tell sphinx that the remaining args are invalid. if len(unknownops) > 0 and app is not None: opsstrs = ','.join(unknownops) msg = 'Found additional options ' + opsstrs + ' in automodapi.' if warnings: app.warn(msg, location) ispkg, hascls, hasfuncs, hasother = _mod_info( modnm, toskip, onlylocals=onlylocals) # add automodule directive only if no-main-docstr isn't present if maindocstr: automodline = '.. automodule:: {modname}'.format(modname=modnm) else: automodline = '' if top_head: newstrs.append(automod_templ_modheader.format( modname=modnm, modhds=h1 * len(modnm), pkgormod='Package' if ispkg else 'Module', pkgormodhds=h1 * (8 if ispkg else 7), automoduleline=automodline)) # noqa else: newstrs.append(automod_templ_modheader.format( modname='', modhds='', pkgormod='', pkgormodhds='', automoduleline=automodline)) # construct the options for the class/function sections # start out indented at 4 spaces, but need to keep the indentation. clsfuncoptions = [] if toctreestr: clsfuncoptions.append(toctreestr) if toskip: clsfuncoptions.append(':skip: ' + ','.join(toskip)) if allowedpkgnms: clsfuncoptions.append(allowedpkgnms) if hascls: # This makes no sense unless there are classes. if inherited_members is True: clsfuncoptions.append(':inherited-members:') if inherited_members is False: clsfuncoptions.append(':no-inherited-members:') clsfuncoptionstr = '\n '.join(clsfuncoptions) if hasfuncs: newstrs.append(automod_templ_funcs.format( modname=modnm, funchds=h2 * 9, clsfuncoptions=clsfuncoptionstr)) if hascls: newstrs.append(automod_templ_classes.format( modname=modnm, clshds=h2 * 7, clsfuncoptions=clsfuncoptionstr)) if allowothers and hasother: newstrs.append(automod_templ_vars.format( modname=modnm, otherhds=h2 * 9, clsfuncoptions=clsfuncoptionstr)) if inhdiag and hascls: # add inheritance diagram if any classes are in the module if toskip: clsskip = ':skip: ' + ','.join(toskip) else: clsskip = '' diagram_entry = automod_templ_inh.format( modname=modnm, clsinhsechds=h2 * 25, allowedpkgnms=allowedpkgnms, skip=clsskip) diagram_entry = diagram_entry.replace(' \n', '') newstrs.append(diagram_entry) newstrs.append(spl[grp * 3 + 3]) newsourcestr = ''.join(newstrs) if app.config.automodapi_writereprocessed: # sometimes they are unicode, sometimes not, depending on how # sphinx has processed things if isinstance(newsourcestr, text_type): ustr = newsourcestr else: ustr = newsourcestr.decode(app.config.source_encoding) if docname is None: with io.open(os.path.join(app.srcdir, 'unknown.automodapi'), 'a', encoding='utf8') as f: f.write(u'\n**NEW DOC**\n\n') f.write(ustr) else: env = app.builder.env # Determine the filename associated with this doc (specifically # the extension) filename = docname + os.path.splitext(env.doc2path(docname))[1] filename += '.automodapi' with io.open(os.path.join(app.srcdir, filename), 'w', encoding='utf8') as f: f.write(ustr) return newsourcestr else: return sourcestr def _mod_info(modname, toskip=[], onlylocals=True): """ Determines if a module is a module or a package and whether or not it has classes or functions. """ hascls = hasfunc = hasother = False for localnm, fqnm, obj in zip(*find_mod_objs(modname, onlylocals=onlylocals)): if localnm not in toskip: hascls = hascls or inspect.isclass(obj) hasfunc = hasfunc or inspect.isroutine(obj) hasother = hasother or (not inspect.isclass(obj) and not inspect.isroutine(obj)) if hascls and hasfunc and hasother: break # find_mod_objs has already imported modname # TODO: There is probably a cleaner way to do this, though this is pretty # reliable for all Python versions for most cases that we care about. pkg = sys.modules[modname] ispkg = (hasattr(pkg, '__file__') and isinstance(pkg.__file__, str) and os.path.split(pkg.__file__)[1].startswith('__init__.py')) return ispkg, hascls, hasfunc, hasother def process_automodapi(app, docname, source): source[0] = automodapi_replace(source[0], app, True, docname) def setup(app): app.setup_extension('sphinx.ext.autosummary') # Note: we use __name__ here instead of just writing the module name in # case this extension is bundled into another package from . import automodsumm app.setup_extension(automodsumm.__name__) app.connect('source-read', process_automodapi) app.add_config_value('automodapi_toctreedirnm', 'api', True) app.add_config_value('automodapi_writereprocessed', False, True) sunpy-0.8.3/astropy_helpers/astropy_helpers/extern/automodapi/automodsumm.py0000644000175000001440000006265213203277317027143 0ustar nabil00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ This directive will produce an "autosummary"-style table for public attributes of a specified module. See the `sphinx.ext.autosummary`_ extension for details on this process. The main difference from the `autosummary`_ directive is that `autosummary`_ requires manually inputting all attributes that appear in the table, while this captures the entries automatically. This directive requires a single argument that must be a module or package. It also accepts any options supported by the `autosummary`_ directive- see `sphinx.ext.autosummary`_ for details. It also accepts some additional options: * ``:classes-only:`` If present, the autosummary table will only contain entries for classes. This cannot be used at the same time with ``:functions-only:`` or ``:variables-only:``. * ``:functions-only:`` If present, the autosummary table will only contain entries for functions. This cannot be used at the same time with ``:classes-only:`` or ``:variables-only:``. * ``:variables-only:`` If present, the autosummary table will only contain entries for variables (everything except functions and classes). This cannot be used at the same time with ``:classes-only:`` or ``:functions-only:``. * ``:skip: obj1, [obj2, obj3, ...]`` If present, specifies that the listed objects should be skipped and not have their documentation generated, nor be included in the summary table. * ``:allowed-package-names: pkgormod1, [pkgormod2, pkgormod3, ...]`` Specifies the packages that functions/classes documented here are allowed to be from, as comma-separated list of package names. If not given, only objects that are actually in a subpackage of the package currently being documented are included. * ``:inherited-members:`` or ``:no-inherited-members:`` The global sphinx configuration option ``automodsumm_inherited_members`` decides if members that a class inherits from a base class are included in the generated documentation. The flags ``:inherited-members:`` or ``:no-inherited-members:`` allows overrriding this global setting. This extension also adds two sphinx configuration options: * ``automodsumm_writereprocessed`` Should be a bool, and if ``True``, will cause `automodsumm`_ to write files with any ``automodsumm`` sections replaced with the content Sphinx processes after ``automodsumm`` has run. The output files are not actually used by sphinx, so this option is only for figuring out the cause of sphinx warnings or other debugging. Defaults to ``False``. * ``automodsumm_inherited_members`` Should be a bool and if ``True``, will cause `automodsumm`_ to document class members that are inherited from a base class. This value can be overriden for any particular automodsumm directive by including the ``:inherited-members:`` or ``:no-inherited-members:`` options. Defaults to ``False``. .. _sphinx.ext.autosummary: http://sphinx-doc.org/latest/ext/autosummary.html .. _autosummary: http://sphinx-doc.org/latest/ext/autosummary.html#directive-autosummary .. _automod-diagram: automod-diagram directive ========================= This directive will produce an inheritance diagram like that of the `sphinx.ext.inheritance_diagram`_ extension. This directive requires a single argument that must be a module or package. It accepts no options. .. note:: Like 'inheritance-diagram', 'automod-diagram' requires `graphviz `_ to generate the inheritance diagram. .. _sphinx.ext.inheritance_diagram: http://sphinx-doc.org/latest/ext/inheritance.html """ import inspect import os import re import io from sphinx.ext.autosummary import Autosummary from sphinx.ext.inheritance_diagram import InheritanceDiagram from docutils.parsers.rst.directives import flag from .utils import find_mod_objs, cleanup_whitespace def _str_list_converter(argument): """ A directive option conversion function that converts the option into a list of strings. Used for 'skip' option. """ if argument is None: return [] else: return [s.strip() for s in argument.split(',')] class Automodsumm(Autosummary): required_arguments = 1 optional_arguments = 0 final_argument_whitespace = False has_content = False option_spec = dict(Autosummary.option_spec) option_spec['functions-only'] = flag option_spec['classes-only'] = flag option_spec['variables-only'] = flag option_spec['skip'] = _str_list_converter option_spec['allowed-package-names'] = _str_list_converter option_spec['inherited-members'] = flag option_spec['no-inherited-members'] = flag def run(self): env = self.state.document.settings.env modname = self.arguments[0] self.warnings = [] nodelist = [] try: localnames, fqns, objs = find_mod_objs(modname) except ImportError: self.warnings = [] self.warn("Couldn't import module " + modname) return self.warnings try: # set self.content to trick the autosummary internals. # Be sure to respect functions-only and classes-only. funconly = 'functions-only' in self.options clsonly = 'classes-only' in self.options varonly = 'variables-only' in self.options if [clsonly, funconly, varonly].count(True) > 1: self.warning('more than one of functions-only, classes-only, ' 'or variables-only defined. Ignoring.') clsonly = funconly = varonly = False skipnames = [] if 'skip' in self.options: option_skipnames = set(self.options['skip']) for lnm in localnames: if lnm in option_skipnames: option_skipnames.remove(lnm) skipnames.append(lnm) if len(option_skipnames) > 0: self.warn('Tried to skip objects {objs} in module {mod}, ' 'but they were not present. Ignoring.' .format(objs=option_skipnames, mod=modname)) if funconly: cont = [] for nm, obj in zip(localnames, objs): if nm not in skipnames and inspect.isroutine(obj): cont.append(nm) elif clsonly: cont = [] for nm, obj in zip(localnames, objs): if nm not in skipnames and inspect.isclass(obj): cont.append(nm) elif varonly: cont = [] for nm, obj in zip(localnames, objs): if nm not in skipnames and not (inspect.isclass(obj) or inspect.isroutine(obj)): cont.append(nm) else: cont = [nm for nm in localnames if nm not in skipnames] self.content = cont # for some reason, even though ``currentmodule`` is substituted in, # sphinx doesn't necessarily recognize this fact. So we just force # it internally, and that seems to fix things env.temp_data['py:module'] = modname env.ref_context['py:module'] = modname # can't use super because Sphinx/docutils has trouble return # super(Autosummary,self).run() nodelist.extend(Autosummary.run(self)) return self.warnings + nodelist finally: # has_content = False for the Automodsumm self.content = [] def get_items(self, names): self.genopt['imported-members'] = True return Autosummary.get_items(self, names) # <-------------------automod-diagram stuff-----------------------------------> class Automoddiagram(InheritanceDiagram): option_spec = dict(InheritanceDiagram.option_spec) option_spec['allowed-package-names'] = _str_list_converter option_spec['skip'] = _str_list_converter def run(self): try: ols = self.options.get('allowed-package-names', []) ols = True if len(ols) == 0 else ols # if none are given, assume only local nms, objs = find_mod_objs(self.arguments[0], onlylocals=ols)[1:] except ImportError: self.warnings = [] self.warn("Couldn't import module " + self.arguments[0]) return self.warnings # Check if some classes should be skipped skip = self.options.get('skip', []) clsnms = [] for n, o in zip(nms, objs): if n.split('.')[-1] in skip: continue if inspect.isclass(o): clsnms.append(n) oldargs = self.arguments try: if len(clsnms) > 0: self.arguments = [' '.join(clsnms)] return InheritanceDiagram.run(self) finally: self.arguments = oldargs # <---------------------automodsumm generation stuff--------------------------> def process_automodsumm_generation(app): env = app.builder.env filestosearch = [] for docname in env.found_docs: filename = env.doc2path(docname) if os.path.isfile(filename): filestosearch.append(docname + os.path.splitext(filename)[1]) liness = [] for sfn in filestosearch: lines = automodsumm_to_autosummary_lines(sfn, app) liness.append(lines) if app.config.automodsumm_writereprocessed: if lines: # empty list means no automodsumm entry is in the file outfn = os.path.join(app.srcdir, sfn) + '.automodsumm' with open(outfn, 'w') as f: for l in lines: f.write(l) f.write('\n') for sfn, lines in zip(filestosearch, liness): suffix = os.path.splitext(sfn)[1] if len(lines) > 0: generate_automodsumm_docs( lines, sfn, builder=app.builder, warn=app.warn, info=app.info, suffix=suffix, base_path=app.srcdir, inherited_members=app.config.automodsumm_inherited_members) # _automodsummrex = re.compile(r'^(\s*)\.\. automodsumm::\s*([A-Za-z0-9_.]+)\s*' # r'\n\1(\s*)(\S|$)', re.MULTILINE) _lineendrex = r'(?:\n|$)' _hdrex = r'^\n?(\s*)\.\. automodsumm::\s*(\S+)\s*' + _lineendrex _oprex1 = r'(?:\1(\s+)\S.*' + _lineendrex + ')' _oprex2 = r'(?:\1\4\S.*' + _lineendrex + ')' _automodsummrex = re.compile(_hdrex + '(' + _oprex1 + '?' + _oprex2 + '*)', re.MULTILINE) def automodsumm_to_autosummary_lines(fn, app): """ Generates lines from a file with an "automodsumm" entry suitable for feeding into "autosummary". Searches the provided file for `automodsumm` directives and returns a list of lines specifying the `autosummary` commands for the modules requested. This does *not* return the whole file contents - just an autosummary section in place of any :automodsumm: entries. Note that any options given for `automodsumm` are also included in the generated `autosummary` section. Parameters ---------- fn : str The name of the file to search for `automodsumm` entries. app : sphinx.application.Application The sphinx Application object Return ------ lines : list of str Lines for all `automodsumm` entries with the entries replaced by `autosummary` and the module's members added. """ fullfn = os.path.join(app.builder.env.srcdir, fn) with io.open(fullfn, encoding='utf8') as fr: # Note: we use __name__ here instead of just writing the module name in # case this extension is bundled into another package from . import automodapi try: extensions = app.extensions except AttributeError: # Sphinx <1.6 extensions = app._extensions if automodapi.__name__ in extensions: # Must do the automodapi on the source to get the automodsumm # that might be in there docname = os.path.splitext(fn)[0] filestr = automodapi.automodapi_replace(fr.read(), app, True, docname, False) else: filestr = fr.read() spl = _automodsummrex.split(filestr) # 0th entry is the stuff before the first automodsumm line indent1s = spl[1::5] mods = spl[2::5] opssecs = spl[3::5] indent2s = spl[4::5] remainders = spl[5::5] # only grab automodsumm sections and convert them to autosummary with the # entries for all the public objects newlines = [] # loop over all automodsumms in this document for i, (i1, i2, modnm, ops, rem) in enumerate(zip(indent1s, indent2s, mods, opssecs, remainders)): allindent = i1 + (' ' if i2 is None else i2) # filter out functions-only, classes-only, and ariables-only # options if present. oplines = ops.split('\n') toskip = [] allowedpkgnms = [] funcsonly = clssonly = varsonly = False for i, ln in reversed(list(enumerate(oplines))): if ':functions-only:' in ln: funcsonly = True del oplines[i] if ':classes-only:' in ln: clssonly = True del oplines[i] if ':variables-only:' in ln: varsonly = True del oplines[i] if ':skip:' in ln: toskip.extend(_str_list_converter(ln.replace(':skip:', ''))) del oplines[i] if ':allowed-package-names:' in ln: allowedpkgnms.extend(_str_list_converter(ln.replace(':allowed-package-names:', ''))) del oplines[i] if [funcsonly, clssonly, varsonly].count(True) > 1: msg = ('Defined more than one of functions-only, classes-only, ' 'and variables-only. Skipping this directive.') lnnum = sum([spl[j].count('\n') for j in range(i * 5 + 1)]) app.warn('[automodsumm]' + msg, (fn, lnnum)) continue # Use the currentmodule directive so we can just put the local names # in the autosummary table. Note that this doesn't always seem to # actually "take" in Sphinx's eyes, so in `Automodsumm.run`, we have to # force it internally, as well. newlines.extend([i1 + '.. currentmodule:: ' + modnm, '', '.. autosummary::']) newlines.extend(oplines) ols = True if len(allowedpkgnms) == 0 else allowedpkgnms for nm, fqn, obj in zip(*find_mod_objs(modnm, onlylocals=ols)): if nm in toskip: continue if funcsonly and not inspect.isroutine(obj): continue if clssonly and not inspect.isclass(obj): continue if varsonly and (inspect.isclass(obj) or inspect.isroutine(obj)): continue newlines.append(allindent + nm) # add one newline at the end of the autosummary block newlines.append('') return newlines def generate_automodsumm_docs(lines, srcfn, suffix='.rst', warn=None, info=None, base_path=None, builder=None, template_dir=None, inherited_members=False): """ This function is adapted from `sphinx.ext.autosummary.generate.generate_autosummmary_docs` to generate source for the automodsumm directives that should be autosummarized. Unlike generate_autosummary_docs, this function is called one file at a time. """ from sphinx.jinja2glue import BuiltinTemplateLoader from sphinx.ext.autosummary import import_by_name, get_documenter from sphinx.ext.autosummary.generate import (_simple_info, _simple_warn) from sphinx.util.osutil import ensuredir from sphinx.util.inspect import safe_getattr from jinja2 import FileSystemLoader, TemplateNotFound from jinja2.sandbox import SandboxedEnvironment from .utils import find_autosummary_in_lines_for_automodsumm as find_autosummary_in_lines if info is None: info = _simple_info if warn is None: warn = _simple_warn # info('[automodsumm] generating automodsumm for: ' + srcfn) # Create our own templating environment - here we use Astropy's # templates rather than the default autosummary templates, in order to # allow docstrings to be shown for methods. template_dirs = [os.path.join(os.path.dirname(__file__), 'templates'), os.path.join(base_path, '_templates')] if builder is not None: # allow the user to override the templates template_loader = BuiltinTemplateLoader() template_loader.init(builder, dirs=template_dirs) else: if template_dir: template_dirs.insert(0, template_dir) template_loader = FileSystemLoader(template_dirs) template_env = SandboxedEnvironment(loader=template_loader) # read # items = find_autosummary_in_files(sources) items = find_autosummary_in_lines(lines, filename=srcfn) if len(items) > 0: msg = '[automodsumm] {1}: found {0} automodsumm entries to generate' info(msg.format(len(items), srcfn)) # gennms = [item[0] for item in items] # if len(gennms) > 20: # gennms = gennms[:10] + ['...'] + gennms[-10:] # info('[automodsumm] generating autosummary for: ' + ', '.join(gennms)) # remove possible duplicates items = list(set(items)) # keep track of new files new_files = [] # write for name, path, template_name, inherited_mem in sorted(items): if path is None: # The corresponding autosummary:: directive did not have # a :toctree: option continue path = os.path.abspath(os.path.join(base_path, path)) ensuredir(path) try: import_by_name_values = import_by_name(name) except ImportError as e: warn('[automodsumm] failed to import %r: %s' % (name, e)) continue # if block to accommodate Sphinx's v1.2.2 and v1.2.3 respectively if len(import_by_name_values) == 3: name, obj, parent = import_by_name_values elif len(import_by_name_values) == 4: name, obj, parent, module_name = import_by_name_values fn = os.path.join(path, name + suffix) # skip it if it exists if os.path.isfile(fn): continue new_files.append(fn) f = open(fn, 'w') try: doc = get_documenter(obj, parent) if template_name is not None: template = template_env.get_template(template_name) else: tmplstr = 'autosummary_core/%s.rst' try: template = template_env.get_template(tmplstr % doc.objtype) except TemplateNotFound: template = template_env.get_template(tmplstr % 'base') def get_members_mod(obj, typ, include_public=[]): """ typ = None -> all """ items = [] for name in dir(obj): try: documenter = get_documenter(safe_getattr(obj, name), obj) except AttributeError: continue if typ is None or documenter.objtype == typ: items.append(name) public = [x for x in items if x in include_public or not x.startswith('_')] return public, items def get_members_class(obj, typ, include_public=[], include_base=False): """ typ = None -> all include_base -> include attrs that are from a base class """ items = [] # using dir gets all of the attributes, including the elements # from the base class, otherwise use __slots__ or __dict__ if include_base: names = dir(obj) else: if hasattr(obj, '__slots__'): names = tuple(getattr(obj, '__slots__')) else: names = getattr(obj, '__dict__').keys() for name in names: try: documenter = get_documenter(safe_getattr(obj, name), obj) except AttributeError: continue if typ is None or documenter.objtype == typ: items.append(name) public = [x for x in items if x in include_public or not x.startswith('_')] return public, items ns = {} if doc.objtype == 'module': ns['members'] = get_members_mod(obj, None) ns['functions'], ns['all_functions'] = \ get_members_mod(obj, 'function') ns['classes'], ns['all_classes'] = \ get_members_mod(obj, 'class') ns['exceptions'], ns['all_exceptions'] = \ get_members_mod(obj, 'exception') elif doc.objtype == 'class': if inherited_mem is not None: # option set in this specifc directive include_base = inherited_mem else: # use default value include_base = inherited_members api_class_methods = ['__init__', '__call__'] ns['members'] = get_members_class(obj, None, include_base=include_base) ns['methods'], ns['all_methods'] = \ get_members_class(obj, 'method', api_class_methods, include_base=include_base) ns['attributes'], ns['all_attributes'] = \ get_members_class(obj, 'attribute', include_base=include_base) ns['methods'].sort() ns['attributes'].sort() parts = name.split('.') if doc.objtype in ('method', 'attribute'): mod_name = '.'.join(parts[:-2]) cls_name = parts[-2] obj_name = '.'.join(parts[-2:]) ns['class'] = cls_name else: mod_name, obj_name = '.'.join(parts[:-1]), parts[-1] ns['fullname'] = name ns['module'] = mod_name ns['objname'] = obj_name ns['name'] = parts[-1] ns['objtype'] = doc.objtype ns['underline'] = len(obj_name) * '=' # We now check whether a file for reference footnotes exists for # the module being documented. We first check if the # current module is a file or a directory, as this will give a # different path for the reference file. For example, if # documenting astropy.wcs then the reference file is at # ../wcs/references.txt, while if we are documenting # astropy.config.logging_helper (which is at # astropy/config/logging_helper.py) then the reference file is set # to ../config/references.txt if '.' in mod_name: mod_name_dir = mod_name.replace('.', '/').split('/', 1)[1] else: mod_name_dir = mod_name if not os.path.isdir(os.path.join(base_path, mod_name_dir)) \ and os.path.isdir(os.path.join(base_path, mod_name_dir.rsplit('/', 1)[0])): mod_name_dir = mod_name_dir.rsplit('/', 1)[0] # We then have to check whether it exists, and if so, we pass it # to the template. if os.path.exists(os.path.join(base_path, mod_name_dir, 'references.txt')): # An important subtlety here is that the path we pass in has # to be relative to the file being generated, so we have to # figure out the right number of '..'s ndirsback = path.replace(base_path, '').count('/') ref_file_rel_segments = ['..'] * ndirsback ref_file_rel_segments.append(mod_name_dir) ref_file_rel_segments.append('references.txt') ns['referencefile'] = os.path.join(*ref_file_rel_segments) rendered = template.render(**ns) f.write(cleanup_whitespace(rendered)) finally: f.close() def setup(app): # need autodoc fixes # Note: we use __name__ here instead of just writing the module name in # case this extension is bundled into another package from . import autodoc_enhancements app.setup_extension(autodoc_enhancements.__name__) # need inheritance-diagram for automod-diagram app.setup_extension('sphinx.ext.inheritance_diagram') app.add_directive('automod-diagram', Automoddiagram) app.add_directive('automodsumm', Automodsumm) app.connect('builder-inited', process_automodsumm_generation) app.add_config_value('automodsumm_writereprocessed', False, True) app.add_config_value('automodsumm_inherited_members', False, 'env') sunpy-0.8.3/astropy_helpers/astropy_helpers/extern/automodapi/smart_resolver.py0000644000175000001440000000717713203277317027641 0ustar nabil00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ The classes in the astropy docs are documented by their API location, which is not necessarily where they are defined in the source. This causes a problem when certain automated features of the doc build, such as the inheritance diagrams or the `Bases` list of a class reference a class by its canonical location rather than its "user" location. In the `autodoc-process-docstring` event, a mapping from the actual name to the API name is maintained. Later, in the `missing-reference` event, unresolved references are looked up in this dictionary and corrected if possible. """ from docutils.nodes import literal, reference def process_docstring(app, what, name, obj, options, lines): if isinstance(obj, type): env = app.env if not hasattr(env, 'class_name_mapping'): env.class_name_mapping = {} mapping = env.class_name_mapping mapping[obj.__module__ + '.' + obj.__name__] = name def missing_reference_handler(app, env, node, contnode): if not hasattr(env, 'class_name_mapping'): env.class_name_mapping = {} mapping = env.class_name_mapping reftype = node['reftype'] reftarget = node['reftarget'] if reftype in ('obj', 'class', 'exc', 'meth'): reftarget = node['reftarget'] suffix = '' if reftarget not in mapping: if '.' in reftarget: front, suffix = reftarget.rsplit('.', 1) else: suffix = reftarget if suffix.startswith('_') and not suffix.startswith('__'): # If this is a reference to a hidden class or method, # we can't link to it, but we don't want to have a # nitpick warning. return node[0].deepcopy() if reftype in ('obj', 'meth') and '.' in reftarget: if front in mapping: reftarget = front suffix = '.' + suffix if (reftype in ('class', ) and '.' in reftarget and reftarget not in mapping): if '.' in front: reftarget, _ = front.rsplit('.', 1) suffix = '.' + suffix reftarget = reftarget + suffix prefix = reftarget.rsplit('.')[0] inventory = env.intersphinx_named_inventory if (reftarget not in mapping and prefix in inventory): if reftarget in inventory[prefix]['py:class']: newtarget = inventory[prefix]['py:class'][reftarget][2] if not node['refexplicit'] and \ '~' not in node.rawsource: contnode = literal(text=reftarget) newnode = reference('', '', internal=True) newnode['reftitle'] = reftarget newnode['refuri'] = newtarget newnode.append(contnode) return newnode if reftarget in mapping: newtarget = mapping[reftarget] + suffix if not node['refexplicit'] and '~' not in node.rawsource: contnode = literal(text=newtarget) newnode = env.domains['py'].resolve_xref( env, node['refdoc'], app.builder, 'class', newtarget, node, contnode) if newnode is not None: newnode['reftitle'] = reftarget return newnode def setup(app): app.connect('autodoc-process-docstring', process_docstring) app.connect('missing-reference', missing_reference_handler) sunpy-0.8.3/astropy_helpers/astropy_helpers/extern/automodapi/utils.py0000644000175000001440000001574413203277317025731 0ustar nabil00000000000000import inspect import sys import re import os from warnings import warn from sphinx.ext.autosummary.generate import find_autosummary_in_docstring if sys.version_info[0] >= 3: def iteritems(dictionary): return dictionary.items() else: def iteritems(dictionary): return dictionary.iteritems() # We use \n instead of os.linesep because even on Windows, the generated files # use \n as the newline character. SPACE_NEWLINE = ' \n' SINGLE_NEWLINE = '\n' DOUBLE_NEWLINE = '\n\n' TRIPLE_NEWLINE = '\n\n\n' def cleanup_whitespace(text): """ Make sure there are never more than two consecutive newlines, and that there are no trailing whitespaces. """ # Get rid of overall leading/trailing whitespace text = text.strip() + '\n' # Get rid of trailing whitespace on each line while SPACE_NEWLINE in text: text = text.replace(SPACE_NEWLINE, SINGLE_NEWLINE) # Avoid too many consecutive newlines while TRIPLE_NEWLINE in text: text = text.replace(TRIPLE_NEWLINE, DOUBLE_NEWLINE) return text def find_mod_objs(modname, onlylocals=False): """ Returns all the public attributes of a module referenced by name. .. note:: The returned list *not* include subpackages or modules of `modname`,nor does it include private attributes (those that beginwith '_' or are not in `__all__`). Parameters ---------- modname : str The name of the module to search. onlylocals : bool If True, only attributes that are either members of `modname` OR one of its modules or subpackages will be included. Returns ------- localnames : list of str A list of the names of the attributes as they are named in the module `modname` . fqnames : list of str A list of the full qualified names of the attributes (e.g., ``astropy.utils.misc.find_mod_objs``). For attributes that are simple variables, this is based on the local name, but for functions or classes it can be different if they are actually defined elsewhere and just referenced in `modname`. objs : list of objects A list of the actual attributes themselves (in the same order as the other arguments) """ __import__(modname) mod = sys.modules[modname] if hasattr(mod, '__all__'): pkgitems = [(k, mod.__dict__[k]) for k in mod.__all__] else: pkgitems = [(k, mod.__dict__[k]) for k in dir(mod) if k[0] != '_'] # filter out modules and pull the names and objs out ismodule = inspect.ismodule localnames = [k for k, v in pkgitems if not ismodule(v)] objs = [v for k, v in pkgitems if not ismodule(v)] # fully qualified names can be determined from the object's module fqnames = [] for obj, lnm in zip(objs, localnames): if hasattr(obj, '__module__') and hasattr(obj, '__name__'): fqnames.append(obj.__module__ + '.' + obj.__name__) else: fqnames.append(modname + '.' + lnm) if onlylocals: valids = [fqn.startswith(modname) for fqn in fqnames] localnames = [e for i, e in enumerate(localnames) if valids[i]] fqnames = [e for i, e in enumerate(fqnames) if valids[i]] objs = [e for i, e in enumerate(objs) if valids[i]] return localnames, fqnames, objs def find_autosummary_in_lines_for_automodsumm(lines, module=None, filename=None): """Find out what items appear in autosummary:: directives in the given lines. Returns a list of (name, toctree, template, inherited_members) where *name* is a name of an object and *toctree* the :toctree: path of the corresponding autosummary directive (relative to the root of the file name), *template* the value of the :template: option, and *inherited_members* is the value of the :inherited-members: option. *toctree*, *template*, and *inherited_members* are ``None`` if the directive does not have the corresponding options set. .. note:: This is a slightly modified version of ``sphinx.ext.autosummary.generate.find_autosummary_in_lines`` which recognizes the ``inherited-members`` option. """ autosummary_re = re.compile(r'^(\s*)\.\.\s+autosummary::\s*') automodule_re = re.compile( r'^\s*\.\.\s+automodule::\s*([A-Za-z0-9_.]+)\s*$') module_re = re.compile( r'^\s*\.\.\s+(current)?module::\s*([a-zA-Z0-9_.]+)\s*$') autosummary_item_re = re.compile(r'^\s+(~?[_a-zA-Z][a-zA-Z0-9_.]*)\s*.*?') toctree_arg_re = re.compile(r'^\s+:toctree:\s*(.*?)\s*$') template_arg_re = re.compile(r'^\s+:template:\s*(.*?)\s*$') inherited_members_arg_re = re.compile(r'^\s+:inherited-members:\s*$') no_inherited_members_arg_re = re.compile(r'^\s+:no-inherited-members:\s*$') documented = [] toctree = None template = None inherited_members = None current_module = module in_autosummary = False base_indent = "" for line in lines: if in_autosummary: m = toctree_arg_re.match(line) if m: toctree = m.group(1) if filename: toctree = os.path.join(os.path.dirname(filename), toctree) continue m = template_arg_re.match(line) if m: template = m.group(1).strip() continue m = inherited_members_arg_re.match(line) if m: inherited_members = True continue m = no_inherited_members_arg_re.match(line) if m: inherited_members = False continue if line.strip().startswith(':'): warn(line) continue # skip options m = autosummary_item_re.match(line) if m: name = m.group(1).strip() if name.startswith('~'): name = name[1:] if current_module and \ not name.startswith(current_module + '.'): name = "%s.%s" % (current_module, name) documented.append((name, toctree, template, inherited_members)) continue if not line.strip() or line.startswith(base_indent + " "): continue in_autosummary = False m = autosummary_re.match(line) if m: in_autosummary = True base_indent = m.group(1) toctree = None template = None inherited_members = None continue m = automodule_re.search(line) if m: current_module = m.group(1).strip() # recurse into the automodule docstring documented.extend(find_autosummary_in_docstring( current_module, filename=filename)) continue m = module_re.match(line) if m: current_module = m.group(2) continue return documented sunpy-0.8.3/astropy_helpers/astropy_helpers/extern/numpydoc/0000755000175000017500000000000013232563477024721 5ustar nabilnabil00000000000000sunpy-0.8.3/astropy_helpers/astropy_helpers/extern/numpydoc/templates/0000755000175000017500000000000013232563477026717 5ustar nabilnabil00000000000000sunpy-0.8.3/astropy_helpers/astropy_helpers/extern/numpydoc/templates/numpydoc_docstring.rst0000644000175000001440000000032613203277317032343 0ustar nabil00000000000000{{index}} {{summary}} {{extended_summary}} {{parameters}} {{returns}} {{yields}} {{other_parameters}} {{raises}} {{warns}} {{warnings}} {{see_also}} {{notes}} {{references}} {{examples}} {{attributes}} {{methods}} sunpy-0.8.3/astropy_helpers/astropy_helpers/extern/numpydoc/__init__.py0000644000175000001440000000016513203277317026013 0ustar nabil00000000000000from __future__ import division, absolute_import, print_function __version__ = '0.7.0' from .numpydoc import setup sunpy-0.8.3/astropy_helpers/astropy_helpers/extern/numpydoc/docscrape.py0000644000175000001440000004452113203277317026223 0ustar nabil00000000000000"""Extract reference documentation from the NumPy source tree. """ from __future__ import division, absolute_import, print_function import inspect import textwrap import re import pydoc from warnings import warn import collections import copy import sys class Reader(object): """A line-based string reader. """ def __init__(self, data): """ Parameters ---------- data : str String with lines separated by '\n'. """ if isinstance(data, list): self._str = data else: self._str = data.split('\n') # store string as list of lines self.reset() def __getitem__(self, n): return self._str[n] def reset(self): self._l = 0 # current line nr def read(self): if not self.eof(): out = self[self._l] self._l += 1 return out else: return '' def seek_next_non_empty_line(self): for l in self[self._l:]: if l.strip(): break else: self._l += 1 def eof(self): return self._l >= len(self._str) def read_to_condition(self, condition_func): start = self._l for line in self[start:]: if condition_func(line): return self[start:self._l] self._l += 1 if self.eof(): return self[start:self._l+1] return [] def read_to_next_empty_line(self): self.seek_next_non_empty_line() def is_empty(line): return not line.strip() return self.read_to_condition(is_empty) def read_to_next_unindented_line(self): def is_unindented(line): return (line.strip() and (len(line.lstrip()) == len(line))) return self.read_to_condition(is_unindented) def peek(self, n=0): if self._l + n < len(self._str): return self[self._l + n] else: return '' def is_empty(self): return not ''.join(self._str).strip() class ParseError(Exception): def __str__(self): message = self.args[0] if hasattr(self, 'docstring'): message = "%s in %r" % (message, self.docstring) return message class NumpyDocString(collections.Mapping): sections = { 'Signature': '', 'Summary': [''], 'Extended Summary': [], 'Parameters': [], 'Returns': [], 'Yields': [], 'Raises': [], 'Warns': [], 'Other Parameters': [], 'Attributes': [], 'Methods': [], 'See Also': [], 'Notes': [], 'Warnings': [], 'References': '', 'Examples': '', 'index': {} } def __init__(self, docstring, config={}): orig_docstring = docstring docstring = textwrap.dedent(docstring).split('\n') self._doc = Reader(docstring) self._parsed_data = copy.deepcopy(self.sections) try: self._parse() except ParseError as e: e.docstring = orig_docstring raise def __getitem__(self, key): return self._parsed_data[key] def __setitem__(self, key, val): if key not in self._parsed_data: warn("Unknown section %s" % key) else: self._parsed_data[key] = val def __iter__(self): return iter(self._parsed_data) def __len__(self): return len(self._parsed_data) def _is_at_section(self): self._doc.seek_next_non_empty_line() if self._doc.eof(): return False l1 = self._doc.peek().strip() # e.g. Parameters if l1.startswith('.. index::'): return True l2 = self._doc.peek(1).strip() # ---------- or ========== return l2.startswith('-'*len(l1)) or l2.startswith('='*len(l1)) def _strip(self, doc): i = 0 j = 0 for i, line in enumerate(doc): if line.strip(): break for j, line in enumerate(doc[::-1]): if line.strip(): break return doc[i:len(doc)-j] def _read_to_next_section(self): section = self._doc.read_to_next_empty_line() while not self._is_at_section() and not self._doc.eof(): if not self._doc.peek(-1).strip(): # previous line was empty section += [''] section += self._doc.read_to_next_empty_line() return section def _read_sections(self): while not self._doc.eof(): data = self._read_to_next_section() name = data[0].strip() if name.startswith('..'): # index section yield name, data[1:] elif len(data) < 2: yield StopIteration else: yield name, self._strip(data[2:]) def _parse_param_list(self, content): r = Reader(content) params = [] while not r.eof(): header = r.read().strip() if ' : ' in header: arg_name, arg_type = header.split(' : ')[:2] else: arg_name, arg_type = header, '' desc = r.read_to_next_unindented_line() desc = dedent_lines(desc) params.append((arg_name, arg_type, desc)) return params _name_rgx = re.compile(r"^\s*(:(?P\w+):`(?P[a-zA-Z0-9_.-]+)`|" r" (?P[a-zA-Z0-9_.-]+))\s*", re.X) def _parse_see_also(self, content): """ func_name : Descriptive text continued text another_func_name : Descriptive text func_name1, func_name2, :meth:`func_name`, func_name3 """ items = [] def parse_item_name(text): """Match ':role:`name`' or 'name'""" m = self._name_rgx.match(text) if m: g = m.groups() if g[1] is None: return g[3], None else: return g[2], g[1] raise ParseError("%s is not a item name" % text) def push_item(name, rest): if not name: return name, role = parse_item_name(name) items.append((name, list(rest), role)) del rest[:] current_func = None rest = [] for line in content: if not line.strip(): continue m = self._name_rgx.match(line) if m and line[m.end():].strip().startswith(':'): push_item(current_func, rest) current_func, line = line[:m.end()], line[m.end():] rest = [line.split(':', 1)[1].strip()] if not rest[0]: rest = [] elif not line.startswith(' '): push_item(current_func, rest) current_func = None if ',' in line: for func in line.split(','): if func.strip(): push_item(func, []) elif line.strip(): current_func = line elif current_func is not None: rest.append(line.strip()) push_item(current_func, rest) return items def _parse_index(self, section, content): """ .. index: default :refguide: something, else, and more """ def strip_each_in(lst): return [s.strip() for s in lst] out = {} section = section.split('::') if len(section) > 1: out['default'] = strip_each_in(section[1].split(','))[0] for line in content: line = line.split(':') if len(line) > 2: out[line[1]] = strip_each_in(line[2].split(',')) return out def _parse_summary(self): """Grab signature (if given) and summary""" if self._is_at_section(): return # If several signatures present, take the last one while True: summary = self._doc.read_to_next_empty_line() summary_str = " ".join([s.strip() for s in summary]).strip() if re.compile('^([\w., ]+=)?\s*[\w\.]+\(.*\)$').match(summary_str): self['Signature'] = summary_str if not self._is_at_section(): continue break if summary is not None: self['Summary'] = summary if not self._is_at_section(): self['Extended Summary'] = self._read_to_next_section() def _parse(self): self._doc.reset() self._parse_summary() sections = list(self._read_sections()) section_names = set([section for section, content in sections]) has_returns = 'Returns' in section_names has_yields = 'Yields' in section_names # We could do more tests, but we are not. Arbitrarily. if has_returns and has_yields: msg = 'Docstring contains both a Returns and Yields section.' raise ValueError(msg) for (section, content) in sections: if not section.startswith('..'): section = (s.capitalize() for s in section.split(' ')) section = ' '.join(section) if self.get(section): if hasattr(self, '_obj'): # we know where the docs came from: try: filename = inspect.getsourcefile(self._obj) except TypeError: filename = None msg = ("The section %s appears twice in " "the docstring of %s in %s." % (section, self._obj, filename)) raise ValueError(msg) else: msg = ("The section %s appears twice" % section) raise ValueError(msg) if section in ('Parameters', 'Returns', 'Yields', 'Raises', 'Warns', 'Other Parameters', 'Attributes', 'Methods'): self[section] = self._parse_param_list(content) elif section.startswith('.. index::'): self['index'] = self._parse_index(section, content) elif section == 'See Also': self['See Also'] = self._parse_see_also(content) else: self[section] = content # string conversion routines def _str_header(self, name, symbol='-'): return [name, len(name)*symbol] def _str_indent(self, doc, indent=4): out = [] for line in doc: out += [' '*indent + line] return out def _str_signature(self): if self['Signature']: return [self['Signature'].replace('*', '\*')] + [''] else: return [''] def _str_summary(self): if self['Summary']: return self['Summary'] + [''] else: return [] def _str_extended_summary(self): if self['Extended Summary']: return self['Extended Summary'] + [''] else: return [] def _str_param_list(self, name): out = [] if self[name]: out += self._str_header(name) for param, param_type, desc in self[name]: if param_type: out += ['%s : %s' % (param, param_type)] else: out += [param] out += self._str_indent(desc) out += [''] return out def _str_section(self, name): out = [] if self[name]: out += self._str_header(name) out += self[name] out += [''] return out def _str_see_also(self, func_role): if not self['See Also']: return [] out = [] out += self._str_header("See Also") last_had_desc = True for func, desc, role in self['See Also']: if role: link = ':%s:`%s`' % (role, func) elif func_role: link = ':%s:`%s`' % (func_role, func) else: link = "`%s`_" % func if desc or last_had_desc: out += [''] out += [link] else: out[-1] += ", %s" % link if desc: out += self._str_indent([' '.join(desc)]) last_had_desc = True else: last_had_desc = False out += [''] return out def _str_index(self): idx = self['index'] out = [] out += ['.. index:: %s' % idx.get('default', '')] for section, references in idx.items(): if section == 'default': continue out += [' :%s: %s' % (section, ', '.join(references))] return out def __str__(self, func_role=''): out = [] out += self._str_signature() out += self._str_summary() out += self._str_extended_summary() for param_list in ('Parameters', 'Returns', 'Yields', 'Other Parameters', 'Raises', 'Warns'): out += self._str_param_list(param_list) out += self._str_section('Warnings') out += self._str_see_also(func_role) for s in ('Notes', 'References', 'Examples'): out += self._str_section(s) for param_list in ('Attributes', 'Methods'): out += self._str_param_list(param_list) out += self._str_index() return '\n'.join(out) def indent(str, indent=4): indent_str = ' '*indent if str is None: return indent_str lines = str.split('\n') return '\n'.join(indent_str + l for l in lines) def dedent_lines(lines): """Deindent a list of lines maximally""" return textwrap.dedent("\n".join(lines)).split("\n") def header(text, style='-'): return text + '\n' + style*len(text) + '\n' class FunctionDoc(NumpyDocString): def __init__(self, func, role='func', doc=None, config={}): self._f = func self._role = role # e.g. "func" or "meth" if doc is None: if func is None: raise ValueError("No function or docstring given") doc = inspect.getdoc(func) or '' NumpyDocString.__init__(self, doc) if not self['Signature'] and func is not None: func, func_name = self.get_func() try: try: signature = str(inspect.signature(func)) except (AttributeError, ValueError): # try to read signature, backward compat for older Python if sys.version_info[0] >= 3: argspec = inspect.getfullargspec(func) else: argspec = inspect.getargspec(func) signature = inspect.formatargspec(*argspec) signature = '%s%s' % (func_name, signature.replace('*', '\*')) except TypeError: signature = '%s()' % func_name self['Signature'] = signature def get_func(self): func_name = getattr(self._f, '__name__', self.__class__.__name__) if inspect.isclass(self._f): func = getattr(self._f, '__call__', self._f.__init__) else: func = self._f return func, func_name def __str__(self): out = '' func, func_name = self.get_func() signature = self['Signature'].replace('*', '\*') roles = {'func': 'function', 'meth': 'method'} if self._role: if self._role not in roles: print("Warning: invalid role %s" % self._role) out += '.. %s:: %s\n \n\n' % (roles.get(self._role, ''), func_name) out += super(FunctionDoc, self).__str__(func_role=self._role) return out class ClassDoc(NumpyDocString): extra_public_methods = ['__call__'] def __init__(self, cls, doc=None, modulename='', func_doc=FunctionDoc, config={}): if not inspect.isclass(cls) and cls is not None: raise ValueError("Expected a class or None, but got %r" % cls) self._cls = cls self.show_inherited_members = config.get( 'show_inherited_class_members', True) if modulename and not modulename.endswith('.'): modulename += '.' self._mod = modulename if doc is None: if cls is None: raise ValueError("No class or documentation string given") doc = pydoc.getdoc(cls) NumpyDocString.__init__(self, doc) if config.get('show_class_members', True): def splitlines_x(s): if not s: return [] else: return s.splitlines() for field, items in [('Methods', self.methods), ('Attributes', self.properties)]: if not self[field]: doc_list = [] for name in sorted(items): try: doc_item = pydoc.getdoc(getattr(self._cls, name)) doc_list.append((name, '', splitlines_x(doc_item))) except AttributeError: pass # method doesn't exist self[field] = doc_list @property def methods(self): if self._cls is None: return [] return [name for name, func in inspect.getmembers(self._cls) if ((not name.startswith('_') or name in self.extra_public_methods) and isinstance(func, collections.Callable) and self._is_show_member(name))] @property def properties(self): if self._cls is None: return [] return [name for name, func in inspect.getmembers(self._cls) if (not name.startswith('_') and (func is None or isinstance(func, property) or inspect.isgetsetdescriptor(func)) and self._is_show_member(name))] def _is_show_member(self, name): if self.show_inherited_members: return True # show all class members if name not in self._cls.__dict__: return False # class member is inherited, we do not show it return True sunpy-0.8.3/astropy_helpers/astropy_helpers/extern/numpydoc/docscrape_sphinx.py0000644000175000001440000002510613203277317027612 0ustar nabil00000000000000from __future__ import division, absolute_import, print_function import sys import re import inspect import textwrap import pydoc import collections import os from jinja2 import FileSystemLoader from jinja2.sandbox import SandboxedEnvironment import sphinx from sphinx.jinja2glue import BuiltinTemplateLoader from .docscrape import NumpyDocString, FunctionDoc, ClassDoc if sys.version_info[0] >= 3: sixu = lambda s: s else: sixu = lambda s: unicode(s, 'unicode_escape') class SphinxDocString(NumpyDocString): def __init__(self, docstring, config={}): NumpyDocString.__init__(self, docstring, config=config) self.load_config(config) def load_config(self, config): self.use_plots = config.get('use_plots', False) self.class_members_toctree = config.get('class_members_toctree', True) self.template = config.get('template', None) if self.template is None: template_dirs = [os.path.join(os.path.dirname(__file__), 'templates')] template_loader = FileSystemLoader(template_dirs) template_env = SandboxedEnvironment(loader=template_loader) self.template = template_env.get_template('numpydoc_docstring.rst') # string conversion routines def _str_header(self, name, symbol='`'): return ['.. rubric:: ' + name, ''] def _str_field_list(self, name): return [':' + name + ':'] def _str_indent(self, doc, indent=4): out = [] for line in doc: out += [' '*indent + line] return out def _str_signature(self): return [''] if self['Signature']: return ['``%s``' % self['Signature']] + [''] else: return [''] def _str_summary(self): return self['Summary'] + [''] def _str_extended_summary(self): return self['Extended Summary'] + [''] def _str_returns(self, name='Returns'): out = [] if self[name]: out += self._str_field_list(name) out += [''] for param, param_type, desc in self[name]: if param_type: out += self._str_indent(['**%s** : %s' % (param.strip(), param_type)]) else: out += self._str_indent([param.strip()]) if desc: out += [''] out += self._str_indent(desc, 8) out += [''] return out def _str_param_list(self, name): out = [] if self[name]: out += self._str_field_list(name) out += [''] for param, param_type, desc in self[name]: if param_type: out += self._str_indent(['**%s** : %s' % (param.strip(), param_type)]) else: out += self._str_indent(['**%s**' % param.strip()]) if desc: out += [''] out += self._str_indent(desc, 8) out += [''] return out @property def _obj(self): if hasattr(self, '_cls'): return self._cls elif hasattr(self, '_f'): return self._f return None def _str_member_list(self, name): """ Generate a member listing, autosummary:: table where possible, and a table where not. """ out = [] if self[name]: out += ['.. rubric:: %s' % name, ''] prefix = getattr(self, '_name', '') if prefix: prefix = '~%s.' % prefix autosum = [] others = [] for param, param_type, desc in self[name]: param = param.strip() # Check if the referenced member can have a docstring or not param_obj = getattr(self._obj, param, None) if not (callable(param_obj) or isinstance(param_obj, property) or inspect.isgetsetdescriptor(param_obj)): param_obj = None if param_obj and (pydoc.getdoc(param_obj) or not desc): # Referenced object has a docstring autosum += [" %s%s" % (prefix, param)] else: others.append((param, param_type, desc)) if autosum: out += ['.. autosummary::'] if self.class_members_toctree: out += [' :toctree:'] out += [''] + autosum if others: maxlen_0 = max(3, max([len(x[0]) + 4 for x in others])) hdr = sixu("=") * maxlen_0 + sixu(" ") + sixu("=") * 10 fmt = sixu('%%%ds %%s ') % (maxlen_0,) out += ['', '', hdr] for param, param_type, desc in others: desc = sixu(" ").join(x.strip() for x in desc).strip() if param_type: desc = "(%s) %s" % (param_type, desc) out += [fmt % ("**" + param.strip() + "**", desc)] out += [hdr] out += [''] return out def _str_section(self, name): out = [] if self[name]: out += self._str_header(name) out += [''] content = textwrap.dedent("\n".join(self[name])).split("\n") out += content out += [''] return out def _str_see_also(self, func_role): out = [] if self['See Also']: see_also = super(SphinxDocString, self)._str_see_also(func_role) out = ['.. seealso::', ''] out += self._str_indent(see_also[2:]) return out def _str_warnings(self): out = [] if self['Warnings']: out = ['.. warning::', ''] out += self._str_indent(self['Warnings']) return out def _str_index(self): idx = self['index'] out = [] if len(idx) == 0: return out out += ['.. index:: %s' % idx.get('default', '')] for section, references in idx.items(): if section == 'default': continue elif section == 'refguide': out += [' single: %s' % (', '.join(references))] else: out += [' %s: %s' % (section, ','.join(references))] return out def _str_references(self): out = [] if self['References']: out += self._str_header('References') if isinstance(self['References'], str): self['References'] = [self['References']] out.extend(self['References']) out += [''] # Latex collects all references to a separate bibliography, # so we need to insert links to it if sphinx.__version__ >= "0.6": out += ['.. only:: latex', ''] else: out += ['.. latexonly::', ''] items = [] for line in self['References']: m = re.match(r'.. \[([a-z0-9._-]+)\]', line, re.I) if m: items.append(m.group(1)) out += [' ' + ", ".join(["[%s]_" % item for item in items]), ''] return out def _str_examples(self): examples_str = "\n".join(self['Examples']) if (self.use_plots and 'import matplotlib' in examples_str and 'plot::' not in examples_str): out = [] out += self._str_header('Examples') out += ['.. plot::', ''] out += self._str_indent(self['Examples']) out += [''] return out else: return self._str_section('Examples') def __str__(self, indent=0, func_role="obj"): ns = { 'signature': self._str_signature(), 'index': self._str_index(), 'summary': self._str_summary(), 'extended_summary': self._str_extended_summary(), 'parameters': self._str_param_list('Parameters'), 'returns': self._str_returns('Returns'), 'yields': self._str_returns('Yields'), 'other_parameters': self._str_param_list('Other Parameters'), 'raises': self._str_param_list('Raises'), 'warns': self._str_param_list('Warns'), 'warnings': self._str_warnings(), 'see_also': self._str_see_also(func_role), 'notes': self._str_section('Notes'), 'references': self._str_references(), 'examples': self._str_examples(), 'attributes': self._str_member_list('Attributes'), 'methods': self._str_member_list('Methods'), } ns = dict((k, '\n'.join(v)) for k, v in ns.items()) rendered = self.template.render(**ns) return '\n'.join(self._str_indent(rendered.split('\n'), indent)) class SphinxFunctionDoc(SphinxDocString, FunctionDoc): def __init__(self, obj, doc=None, config={}): self.load_config(config) FunctionDoc.__init__(self, obj, doc=doc, config=config) class SphinxClassDoc(SphinxDocString, ClassDoc): def __init__(self, obj, doc=None, func_doc=None, config={}): self.load_config(config) ClassDoc.__init__(self, obj, doc=doc, func_doc=None, config=config) class SphinxObjDoc(SphinxDocString): def __init__(self, obj, doc=None, config={}): self._f = obj self.load_config(config) SphinxDocString.__init__(self, doc, config=config) def get_doc_object(obj, what=None, doc=None, config={}, builder=None): if what is None: if inspect.isclass(obj): what = 'class' elif inspect.ismodule(obj): what = 'module' elif isinstance(obj, collections.Callable): what = 'function' else: what = 'object' template_dirs = [os.path.join(os.path.dirname(__file__), 'templates')] if builder is not None: template_loader = BuiltinTemplateLoader() template_loader.init(builder, dirs=template_dirs) else: template_loader = FileSystemLoader(template_dirs) template_env = SandboxedEnvironment(loader=template_loader) config['template'] = template_env.get_template('numpydoc_docstring.rst') if what == 'class': return SphinxClassDoc(obj, func_doc=SphinxFunctionDoc, doc=doc, config=config) elif what in ('function', 'method'): return SphinxFunctionDoc(obj, doc=doc, config=config) else: if doc is None: doc = pydoc.getdoc(obj) return SphinxObjDoc(obj, doc, config=config) sunpy-0.8.3/astropy_helpers/astropy_helpers/extern/numpydoc/numpydoc.py0000644000175000001440000002253313203277317026115 0ustar nabil00000000000000""" ======== numpydoc ======== Sphinx extension that handles docstrings in the Numpy standard format. [1] It will: - Convert Parameters etc. sections to field lists. - Convert See Also section to a See also entry. - Renumber references. - Extract the signature from the docstring, if it can't be determined otherwise. .. [1] https://github.com/numpy/numpy/blob/master/doc/HOWTO_DOCUMENT.rst.txt """ from __future__ import division, absolute_import, print_function import sys import re import pydoc import sphinx import inspect import collections if sphinx.__version__ < '1.0.1': raise RuntimeError("Sphinx 1.0.1 or newer is required") from .docscrape_sphinx import get_doc_object, SphinxDocString if sys.version_info[0] >= 3: sixu = lambda s: s else: sixu = lambda s: unicode(s, 'unicode_escape') def rename_references(app, what, name, obj, options, lines, reference_offset=[0]): # replace reference numbers so that there are no duplicates references = [] for line in lines: line = line.strip() m = re.match(sixu('^.. \\[(%s)\\]') % app.config.numpydoc_citation_re, line, re.I) if m: references.append(m.group(1)) if references: for i, line in enumerate(lines): for r in references: if re.match(sixu('^\\d+$'), r): new_r = sixu("R%d") % (reference_offset[0] + int(r)) else: new_r = sixu("%s%d") % (r, reference_offset[0]) lines[i] = lines[i].replace(sixu('[%s]_') % r, sixu('[%s]_') % new_r) lines[i] = lines[i].replace(sixu('.. [%s]') % r, sixu('.. [%s]') % new_r) reference_offset[0] += len(references) def mangle_docstrings(app, what, name, obj, options, lines): cfg = {'use_plots': app.config.numpydoc_use_plots, 'show_class_members': app.config.numpydoc_show_class_members, 'show_inherited_class_members': app.config.numpydoc_show_inherited_class_members, 'class_members_toctree': app.config.numpydoc_class_members_toctree} u_NL = sixu('\n') if what == 'module': # Strip top title pattern = '^\\s*[#*=]{4,}\\n[a-z0-9 -]+\\n[#*=]{4,}\\s*' title_re = re.compile(sixu(pattern), re.I | re.S) lines[:] = title_re.sub(sixu(''), u_NL.join(lines)).split(u_NL) else: doc = get_doc_object(obj, what, u_NL.join(lines), config=cfg, builder=app.builder) if sys.version_info[0] >= 3: doc = str(doc) else: doc = unicode(doc) lines[:] = doc.split(u_NL) if (app.config.numpydoc_edit_link and hasattr(obj, '__name__') and obj.__name__): if hasattr(obj, '__module__'): v = dict(full_name=sixu("%s.%s") % (obj.__module__, obj.__name__)) else: v = dict(full_name=obj.__name__) lines += [sixu(''), sixu('.. htmlonly::'), sixu('')] lines += [sixu(' %s') % x for x in (app.config.numpydoc_edit_link % v).split("\n")] # call function to replace reference numbers so that there are no # duplicates rename_references(app, what, name, obj, options, lines) def mangle_signature(app, what, name, obj, options, sig, retann): # Do not try to inspect classes that don't define `__init__` if (inspect.isclass(obj) and (not hasattr(obj, '__init__') or 'initializes x; see ' in pydoc.getdoc(obj.__init__))): return '', '' if not (isinstance(obj, collections.Callable) or hasattr(obj, '__argspec_is_invalid_')): return if not hasattr(obj, '__doc__'): return doc = SphinxDocString(pydoc.getdoc(obj)) sig = doc['Signature'] or getattr(obj, '__text_signature__', None) if sig: sig = re.sub(sixu("^[^(]*"), sixu(""), sig) return sig, sixu('') def setup(app, get_doc_object_=get_doc_object): if not hasattr(app, 'add_config_value'): return # probably called by nose, better bail out global get_doc_object get_doc_object = get_doc_object_ app.connect('autodoc-process-docstring', mangle_docstrings) app.connect('autodoc-process-signature', mangle_signature) app.add_config_value('numpydoc_edit_link', None, False) app.add_config_value('numpydoc_use_plots', None, False) app.add_config_value('numpydoc_show_class_members', True, True) app.add_config_value('numpydoc_show_inherited_class_members', True, True) app.add_config_value('numpydoc_class_members_toctree', True, True) app.add_config_value('numpydoc_citation_re', '[a-z0-9_.-]+', True) # Extra mangling domains app.add_domain(NumpyPythonDomain) app.add_domain(NumpyCDomain) metadata = {'parallel_read_safe': True} return metadata # ------------------------------------------------------------------------------ # Docstring-mangling domains # ------------------------------------------------------------------------------ from docutils.statemachine import ViewList from sphinx.domains.c import CDomain from sphinx.domains.python import PythonDomain class ManglingDomainBase(object): directive_mangling_map = {} def __init__(self, *a, **kw): super(ManglingDomainBase, self).__init__(*a, **kw) self.wrap_mangling_directives() def wrap_mangling_directives(self): for name, objtype in list(self.directive_mangling_map.items()): self.directives[name] = wrap_mangling_directive( self.directives[name], objtype) class NumpyPythonDomain(ManglingDomainBase, PythonDomain): name = 'np' directive_mangling_map = { 'function': 'function', 'class': 'class', 'exception': 'class', 'method': 'function', 'classmethod': 'function', 'staticmethod': 'function', 'attribute': 'attribute', } indices = [] class NumpyCDomain(ManglingDomainBase, CDomain): name = 'np-c' directive_mangling_map = { 'function': 'function', 'member': 'attribute', 'macro': 'function', 'type': 'class', 'var': 'object', } def match_items(lines, content_old): """Create items for mangled lines. This function tries to match the lines in ``lines`` with the items (source file references and line numbers) in ``content_old``. The ``mangle_docstrings`` function changes the actual docstrings, but doesn't keep track of where each line came from. The manging does many operations on the original lines, which are hard to track afterwards. Many of the line changes come from deleting or inserting blank lines. This function tries to match lines by ignoring blank lines. All other changes (such as inserting figures or changes in the references) are completely ignored, so the generated line numbers will be off if ``mangle_docstrings`` does anything non-trivial. This is a best-effort function and the real fix would be to make ``mangle_docstrings`` actually keep track of the ``items`` together with the ``lines``. Examples -------- >>> lines = ['', 'A', '', 'B', ' ', '', 'C', 'D'] >>> lines_old = ['a', '', '', 'b', '', 'c'] >>> items_old = [('file1.py', 0), ('file1.py', 1), ('file1.py', 2), ... ('file2.py', 0), ('file2.py', 1), ('file2.py', 2)] >>> content_old = ViewList(lines_old, items=items_old) >>> match_items(lines, content_old) # doctest: +NORMALIZE_WHITESPACE [('file1.py', 0), ('file1.py', 0), ('file2.py', 0), ('file2.py', 0), ('file2.py', 2), ('file2.py', 2), ('file2.py', 2), ('file2.py', 2)] >>> # first 2 ``lines`` are matched to 'a', second 2 to 'b', rest to 'c' >>> # actual content is completely ignored. Notes ----- The algorithm tries to match any line in ``lines`` with one in ``lines_old``. It skips over all empty lines in ``lines_old`` and assigns this line number to all lines in ``lines``, unless a non-empty line is found in ``lines`` in which case it goes to the next line in ``lines_old``. """ items_new = [] lines_old = content_old.data items_old = content_old.items j = 0 for i, line in enumerate(lines): # go to next non-empty line in old: # line.strip() checks whether the string is all whitespace while j < len(lines_old) - 1 and not lines_old[j].strip(): j += 1 items_new.append(items_old[j]) if line.strip() and j < len(lines_old) - 1: j += 1 assert(len(items_new) == len(lines)) return items_new def wrap_mangling_directive(base_directive, objtype): class directive(base_directive): def run(self): env = self.state.document.settings.env name = None if self.arguments: m = re.match(r'^(.*\s+)?(.*?)(\(.*)?', self.arguments[0]) name = m.group(2).strip() if not name: name = self.arguments[0] lines = list(self.content) mangle_docstrings(env.app, objtype, name, None, None, lines) if self.content: items = match_items(lines, self.content) self.content = ViewList(lines, items=items, parent=self.content.parent) return base_directive.run(self) return directive sunpy-0.8.3/astropy_helpers/astropy_helpers/extern/__init__.py0000644000175000001440000000111513203277317024151 0ustar nabil00000000000000# The ``astropy_helpers.extern`` sub-module includes modules developed elsewhere # that are bundled here for convenience. At the moment, this consists of the # following two sphinx extensions: # # * `numpydoc `_, a Sphinx extension # developed as part of the Numpy project. This is used to parse docstrings # in Numpy format # # * `sphinx-automodapi `_, a Sphinx # developed as part of the Astropy project. This used to be developed directly # in ``astropy-helpers`` but is now a standalone package. sunpy-0.8.3/astropy_helpers/astropy_helpers/extern/setup_package.py0000644000175000001440000000027513203277317025233 0ustar nabil00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst def get_package_data(): return {'astropy_helpers.extern': ['automodapi/templates/*/*.rst', 'numpydoc/templates/*.rst']} sunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/0000755000175000017500000000000013232563477023067 5ustar nabilnabil00000000000000sunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/__pycache__/0000755000175000017500000000000013232563477025277 5ustar nabilnabil00000000000000sunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/__pycache__/__init__.cpython-36.pyc0000644000175000001440000000113013211242143030422 0ustar nabil000000000000003 ~ Z@sdZdS)a This package contains utilities and extensions for the Astropy sphinx documentation. In particular, the `astropy.sphinx.conf` should be imported by the sphinx ``conf.py`` file for affiliated packages that wish to make use of the Astropy documentation format. Note that some sphinx extensions which are bundled as-is (numpydoc and sphinx-automodapi) are included in astropy_helpers.extern rather than astropy_helpers.sphinx.ext. N)__doc__rrH/home/nabil/Git/sunpy/astropy_helpers/astropy_helpers/sphinx/__init__.pyssunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/__pycache__/conf.cpython-36.pyc0000644000175000001440000001214613211242143027621 0ustar nabil000000000000003 ~ Z.@sddlZddlZddlZddlmZddlZddlmZdZejj dddkZ ddZ dJd ej ej ejed fdLdNdPdQdRdZejddkrdTed<d ej ej ejedfed<dgZdZdZdZd Zd!gZd"d#d$d%d&d'd(d)d*d+d,d-g Ze reejed.krejd/n ejd0yddlZeejjjg7ZWn(e e!fk rfej"d1d2YnXd3Z#d4Z$d5Z%d6Z&d7Z'd8d9d:d;dgZ)d?Z*d@ggggdAZ+ej e)de*dBdCZ,dDZ-dEZ.iZ/dFe/dG<dHZ0dS)UN)path) LooseVersionz1.3 READTHEDOCSTruecCs.ttj}t|}||kr*tdj||dS)NzPAt least Sphinx version {0} is required to build this documentation. Found {1}.)rsphinx __version__ RuntimeErrorformat)Zexpected_versionZsphinx_versionr D/home/nabil/Git/sunpy/astropy_helpers/astropy_helpers/sphinx/conf.pycheck_sphinx_version"s  r https://docs.python.org/3//http://data.astropy.org/intersphinx/python3.invzhttp://docs.python.org/zlocal/python3_local_links.inv!https://docs.scipy.org/doc/numpy/-http://data.astropy.org/intersphinx/numpy.inv+https://docs.scipy.org/doc/scipy/reference/-http://data.astropy.org/intersphinx/scipy.invhttp://matplotlib.org/2http://data.astropy.org/intersphinx/matplotlib.inv"http://docs.astropy.org/en/stable/http://docs.h5py.org/en/latest/)python pythonlocnumpyscipy matplotlibastropyh5pyhttps://docs.python.org/2//http://data.astropy.org/intersphinx/python2.invrzlocal/python2_local_links.invrZ_buildz.rstindexobjz! .. _Astropy: http://astropy.org zapp.add_directivezsphinx.ext.autodoczsphinx.ext.intersphinxzsphinx.ext.todozsphinx.ext.coveragezsphinx.ext.inheritance_diagramzsphinx.ext.viewcodezastropy_helpers.extern.numpydocz,astropy_helpers.extern.automodapi.automodapiz0astropy_helpers.extern.automodapi.smart_resolverz&astropy_helpers.sphinx.ext.tocdepthfixz"astropy_helpers.sphinx.ext.doctestz*astropy_helpers.sphinx.ext.changelog_linksz1.4zsphinx.ext.pngmathzsphinx.ext.mathjaxz3matplotlib's plot_directive could not be imported. z/Inline plots will not be included in the outputFTapibothsvgz -Nfontsize=10z7-Nfontname=Helvetica Neue, Helvetica, Arial, sans-serifz -Efontsize=10z7-Efontname=Helvetica Neue, Helvetica, Arial, sans-serifz -Gfontsize=10z7-Gfontname=Helvetica Neue, Helvetica, Arial, sans-serifthemeszbootstrap-astropyz localtoc.html)z**searchgenindexz py-modindexstaticzastropy_logo.icoz%d %b %Yparta{ % Use a more modern-looking monospace font \usepackage{inconsolata} % The enumitem package provides unlimited nesting of lists and enums. % Sphinx may use this in the future, in which case this can be removed. % See https://bitbucket.org/birkenfeld/sphinx/issue/777/latex-output-too-deeply-nested \usepackage{enumitem} \setlistdepth{15} % In the parameters section, place a newline after the Parameters % header. (This is stolen directly from Numpy's conf.py, since it % affects Numpy-style docstrings). \usepackage{expdlist} \let\latexdescription=\description \def\description{\latexdescription{}{} \breaklabel} % Support the superscript Unicode numbers used by the "unicode" units % formatter \DeclareUnicodeCharacter{2070}{\ensuremath{^0}} \DeclareUnicodeCharacter{00B9}{\ensuremath{^1}} \DeclareUnicodeCharacter{00B2}{\ensuremath{^2}} \DeclareUnicodeCharacter{00B3}{\ensuremath{^3}} \DeclareUnicodeCharacter{2074}{\ensuremath{^4}} \DeclareUnicodeCharacter{2075}{\ensuremath{^5}} \DeclareUnicodeCharacter{2076}{\ensuremath{^6}} \DeclareUnicodeCharacter{2077}{\ensuremath{^7}} \DeclareUnicodeCharacter{2078}{\ensuremath{^8}} \DeclareUnicodeCharacter{2079}{\ensuremath{^9}} \DeclareUnicodeCharacter{207B}{\ensuremath{^-}} \DeclareUnicodeCharacter{00B0}{\ensuremath{^{\circ}}} \DeclareUnicodeCharacter{2032}{\ensuremath{^{\prime}}} \DeclareUnicodeCharacter{2033}{\ensuremath{^{\prime\prime}}} % Make the "warning" and "notes" sections use a sans-serif font to % make them stand out more. \renewenvironment{notice}[2]{ \def\py@noticetype{#1} \csname py@noticestart@#1\endcsname \textsf{\textbf{#2}} }{\csname py@noticeend@\py@noticetype\endcsname} preamble<Nr)r r-Nr)rr.Nr)rr/Nr)rr0)rN)rNNr )rr1)1ossyswarningsrrdistutils.versionr needs_sphinxenvirongetZon_rtdr abspathjoindirname__file__intersphinx_mapping version_infoexclude_patterns source_suffix master_doc default_role rst_epilogsuppress_warnings extensionsrappendZ#matplotlib.sphinxext.plot_directiverZ sphinxextZplot_directive__name__ ImportErrorAttributeErrorwarnZnumpydoc_show_class_membersZautosummary_generateZautomodapi_toctreedirnmZautoclass_contentZgraphviz_output_formatZgraphviz_dot_argsZhtml_theme_path html_theme html_sidebars html_faviconZhtml_last_updated_fmtZlatex_toplevel_sectioningZlatex_elementsZlinkcheck_timeoutr r r r  s    "  :,sunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/__pycache__/setup_package.cpython-36.pyc0000644000175000001440000000053013203277317031515 0ustar nabil000000000000003 ~ Z$@s ddZdS)cCsddddgiS)Nzastropy_helpers.sphinxz local/*.invzthemes/bootstrap-astropy/*.*z#themes/bootstrap-astropy/static/*.*rrr'astropy_helpers/sphinx/setup_package.pyget_package_datasrN)rrrrrssunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/ext/0000755000175000017500000000000013232563477023667 5ustar nabilnabil00000000000000sunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/ext/__pycache__/0000755000175000017500000000000013232563477026077 5ustar nabilnabil00000000000000sunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/ext/__pycache__/__init__.cpython-36.pyc0000644000175000001440000000037513211242144031235 0ustar nabil000000000000003 ~ ZB@sddlmZmZmZdS))divisionabsolute_importprint_functionN) __future__rrrrrL/home/nabil/Git/sunpy/astropy_helpers/astropy_helpers/sphinx/ext/__init__.pyssunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/ext/__pycache__/changelog_links.cpython-36.pyc0000644000175000001440000000376213211242144032630 0ustar nabil000000000000003 ~ Zc @s^dZddlmZddlZddlmZmZejdejdZ ejdZ dd Z d d Z d d Z dS)z] This sphinx extension makes the issue numbers in the changelog into links to GitHub issues. )print_functionN)Text referencez\[#.+\])flagsz#[0-9]+c Cs\x|jD]}|j|rPqWdS|jdj|x$|jD]}t|tsNqFsz(setup_patterns_rexes..)rchangelog_links_docpatternr )rr#r#r$setup_patterns_rexesEsr,cCsB|jdt|jdt|jddd|jdddgddddS) Nzdoctree-resolvedzbuilder-initedrTr+z .*changelog.*z whatsnew/.*)parallel_read_safeparallel_write_safe)connectr%r,add_config_value)rr#r#r$setupJs   r1)__doc__ __future__rr&Zdocutils.nodesrrr'DOTALLrrr%r,r1r#r#r#r$s  4sunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/ext/__pycache__/doctest.cpython-36.pyc0000644000175000001440000000346413211242144031145 0ustar nabil000000000000003 ~ Z@s`dZddlZddlmZddlmZGdddeZGdddeZGd d d eZd d Z dS) am This is a set of three directives that allow us to insert metadata about doctests into the .rst files so the testing framework knows which tests to skip. This is quite different from the doctest extension in Sphinx itself, which actually does something. For astropy, all of the testing is centrally managed from py.test and Sphinx is not used for running tests. N) literal_block) Directivec@seZdZdZddZdS)DoctestSkipDirectiveTcCs:tjd|jdr"|jdd|_dj|j}t||gS)Nwin32r )rematchcontentjoinr)selfcoderK/home/nabil/Git/sunpy/astropy_helpers/astropy_helpers/sphinx/ext/doctest.pyruns zDoctestSkipDirective.runN)__name__ __module__ __qualname__ has_contentrrrrrrsrc@seZdZdZddZdS)DoctestOmitDirectiveTcCsgS)Nr)r rrrr szDoctestOmitDirective.runN)rrrrrrrrrrsrc@seZdZdZdS)DoctestRequiresDirective@N)rrroptional_argumentsrrrrr%srcCsF|jdt|jdt|jdt|jdt|jdtdddS)Nzdoctest-requiresz doctest-skipzdoctest-skip-alldoctest testsetupT)parallel_read_safeparallel_write_safe) add_directiverrr)apprrrsetup+s     r) __doc__rZdocutils.nodesrdocutils.parsers.rstrrrrrrrrr s   sunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/ext/__pycache__/edit_on_github.cpython-36.pyc0000644000175000001440000001143213211242144032455 0ustar nabil000000000000003 ~ Z4@shdZddlZddlZddlZddlZddlmZddlmZddZ ddZ d d Z d d Z d dZ dS)a This extension makes it easy to edit documentation on github. It adds links associated with each docstring that go to the corresponding view source page on Github. From there, the user can push the "Edit" button, edit the docstring, and submit a pull request. It has the following configuration options (to be set in the project's ``conf.py``): * ``edit_on_github_project`` The name of the github project, in the form "username/projectname". * ``edit_on_github_branch`` The name of the branch to edit. If this is a released version, this should be a git tag referring to that version. For a dev version, it often makes sense for it to be "master". It may also be a git hash. * ``edit_on_github_source_root`` The location within the source tree of the root of the Python package. Defaults to "lib". * ``edit_on_github_doc_root`` The location within the source tree of the root of the documentation source. Defaults to "doc", but it may make sense to set it to "doc/source" if the project uses a separate source directory. * ``edit_on_github_docstring_message`` The phrase displayed in the links to edit a docstring. Defaults to "[edit on github]". * ``edit_on_github_page_message`` The phrase displayed in the links to edit a RST page. Defaults to "[edit this page on github]". * ``edit_on_github_help_message`` The phrase displayed as a tooltip on the edit links. Defaults to "Push the Edit button on the next page" * ``edit_on_github_skip_regex`` When the path to the .rst file matches this regular expression, no "edit this page on github" link will be added. Defaults to ``"_.*"``. N)nodes)addnodesc CsHy8t|tj|}|}x|jdD]}t||}q$W|SdSdS)z} Import the object given by *modname* and *name* and return it. If not found, or the import fails, returns None. .N) __import__sysmodulessplitgetattr)modnamenamemodobjpartrR/home/nabil/Git/sunpy/astropy_helpers/astropy_helpers/sphinx/ext/edit_on_github.py import_object;s rcCsd|jj|jjfS)Nzhttp://github.com/%s/tree/%s/)configedit_on_github_projectedit_on_github_branch)apprrr get_url_baseKsrcCst|jjdkrtd|jj}t|}|jj}x@|jtjD].}|j ddkrRq|jd r>|d7}tjj|j d|j j }t |}|jj }||||d<||d<dS)Nz page.htmlr!rsourceZedit_on_githubedit_on_github_page_message)rematchredit_on_github_skip_regexedit_on_github_doc_rootendswithosrBrelpathr)buildersrcdirrrF) rpagename templatenamecontextr9Zdoc_rootdoc_pathr:Z page_messagerrrhtml_page_contextsrTcCs|jddd|jddd|jddd|jdd d|jd d d|jd d d|jddd|jddd|jdt|jdtdddS)NrrTrmasterr%librJdocr&z[edit on github]rFzEdit This Page on Githubr5z%Push the Edit button on the next pagerIz_.*z doctree-readzhtml-page-context)parallel_read_safeparallel_write_safe)add_config_valueconnectrDrT)rrrrsetups   r\)__doc__r.rLrGrdocutilsrsphinxrrrrDrTr\rrrr0s  4sunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/ext/__pycache__/tocdepthfix.cpython-36.pyc0000644000175000001440000000130113211242144032005 0ustar nabil000000000000003 ~ Z@s ddlmZddZddZdS))addnodescCsR|jjjd}|jjj|jdddkrNx$|jtjD]}|jjj||q6WdS)Ndocnametocdepthr) builderenv temp_datametadatagettraversertoctree note_toctree)appdoctreerZtreenoderO/home/nabil/Git/sunpy/astropy_helpers/astropy_helpers/sphinx/ext/tocdepthfix.pyfix_toc_entriessrcCs|jdtdddS)Nz doctree-readT)parallel_read_safeparallel_write_safe)connectr)r rrrsetups rN)sphinxrrrrrrrs  sunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/ext/tests/0000755000175000017500000000000013232563477025031 5ustar nabilnabil00000000000000sunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/ext/tests/__init__.py0000644000175000001440000000000013203277317026107 0ustar nabil00000000000000sunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/ext/__init__.py0000644000175000001440000000010213203277317024750 0ustar nabil00000000000000from __future__ import division, absolute_import, print_function sunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/ext/changelog_links.py0000644000175000001440000000554313203277317026356 0ustar nabil00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ This sphinx extension makes the issue numbers in the changelog into links to GitHub issues. """ from __future__ import print_function import re from docutils.nodes import Text, reference BLOCK_PATTERN = re.compile('\[#.+\]', flags=re.DOTALL) ISSUE_PATTERN = re.compile('#[0-9]+') def process_changelog_links(app, doctree, docname): for rex in app.changelog_links_rexes: if rex.match(docname): break else: # if the doc doesn't match any of the changelog regexes, don't process return app.info('[changelog_links] Adding changelog links to "{0}"'.format(docname)) for item in doctree.traverse(): if not isinstance(item, Text): continue # We build a new list of items to replace the current item. If # a link is found, we need to use a 'reference' item. children = [] # First cycle through blocks of issues (delimited by []) then # iterate inside each one to find the individual issues. prev_block_end = 0 for block in BLOCK_PATTERN.finditer(item): block_start, block_end = block.start(), block.end() children.append(Text(item[prev_block_end:block_start])) block = item[block_start:block_end] prev_end = 0 for m in ISSUE_PATTERN.finditer(block): start, end = m.start(), m.end() children.append(Text(block[prev_end:start])) issue_number = block[start:end] refuri = app.config.github_issues_url + issue_number[1:] children.append(reference(text=issue_number, name=issue_number, refuri=refuri)) prev_end = end prev_block_end = block_end # If no issues were found, this adds the whole item, # otherwise it adds the remaining text. children.append(Text(block[prev_end:block_end])) # If no blocks were found, this adds the whole item, otherwise # it adds the remaining text. children.append(Text(item[prev_block_end:])) # Replace item by the new list of items we have generated, # which may contain links. item.parent.replace(item, children) def setup_patterns_rexes(app): app.changelog_links_rexes = [re.compile(pat) for pat in app.config.changelog_links_docpattern] def setup(app): app.connect('doctree-resolved', process_changelog_links) app.connect('builder-inited', setup_patterns_rexes) app.add_config_value('github_issues_url', None, True) app.add_config_value('changelog_links_docpattern', ['.*changelog.*', 'whatsnew/.*'], True) return {'parallel_read_safe': True, 'parallel_write_safe': True} sunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/ext/doctest.py0000644000175000001440000000364113203277317024671 0ustar nabil00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ This is a set of three directives that allow us to insert metadata about doctests into the .rst files so the testing framework knows which tests to skip. This is quite different from the doctest extension in Sphinx itself, which actually does something. For astropy, all of the testing is centrally managed from py.test and Sphinx is not used for running tests. """ import re from docutils.nodes import literal_block from docutils.parsers.rst import Directive class DoctestSkipDirective(Directive): has_content = True def run(self): # Check if there is any valid argument, and skip it. Currently only # 'win32' is supported in astropy.tests.pytest_plugins. if re.match('win32', self.content[0]): self.content = self.content[2:] code = '\n'.join(self.content) return [literal_block(code, code)] class DoctestOmitDirective(Directive): has_content = True def run(self): # Simply do not add any content when this directive is encountered return [] class DoctestRequiresDirective(DoctestSkipDirective): # This is silly, but we really support an unbounded number of # optional arguments optional_arguments = 64 def setup(app): app.add_directive('doctest-requires', DoctestRequiresDirective) app.add_directive('doctest-skip', DoctestSkipDirective) app.add_directive('doctest-skip-all', DoctestSkipDirective) app.add_directive('doctest', DoctestSkipDirective) # Code blocks that use this directive will not appear in the generated # documentation. This is intended to hide boilerplate code that is only # useful for testing documentation using doctest, but does not actually # belong in the documentation itself. app.add_directive('testsetup', DoctestOmitDirective) return {'parallel_read_safe': True, 'parallel_write_safe': True} sunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/ext/edit_on_github.py0000644000175000001440000001346413203277317026213 0ustar nabil00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ This extension makes it easy to edit documentation on github. It adds links associated with each docstring that go to the corresponding view source page on Github. From there, the user can push the "Edit" button, edit the docstring, and submit a pull request. It has the following configuration options (to be set in the project's ``conf.py``): * ``edit_on_github_project`` The name of the github project, in the form "username/projectname". * ``edit_on_github_branch`` The name of the branch to edit. If this is a released version, this should be a git tag referring to that version. For a dev version, it often makes sense for it to be "master". It may also be a git hash. * ``edit_on_github_source_root`` The location within the source tree of the root of the Python package. Defaults to "lib". * ``edit_on_github_doc_root`` The location within the source tree of the root of the documentation source. Defaults to "doc", but it may make sense to set it to "doc/source" if the project uses a separate source directory. * ``edit_on_github_docstring_message`` The phrase displayed in the links to edit a docstring. Defaults to "[edit on github]". * ``edit_on_github_page_message`` The phrase displayed in the links to edit a RST page. Defaults to "[edit this page on github]". * ``edit_on_github_help_message`` The phrase displayed as a tooltip on the edit links. Defaults to "Push the Edit button on the next page" * ``edit_on_github_skip_regex`` When the path to the .rst file matches this regular expression, no "edit this page on github" link will be added. Defaults to ``"_.*"``. """ import inspect import os import re import sys from docutils import nodes from sphinx import addnodes def import_object(modname, name): """ Import the object given by *modname* and *name* and return it. If not found, or the import fails, returns None. """ try: __import__(modname) mod = sys.modules[modname] obj = mod for part in name.split('.'): obj = getattr(obj, part) return obj except: return None def get_url_base(app): return 'http://github.com/%s/tree/%s/' % ( app.config.edit_on_github_project, app.config.edit_on_github_branch) def doctree_read(app, doctree): # Get the configuration parameters if app.config.edit_on_github_project == 'REQUIRED': raise ValueError( "The edit_on_github_project configuration variable must be " "provided in the conf.py") source_root = app.config.edit_on_github_source_root url = get_url_base(app) docstring_message = app.config.edit_on_github_docstring_message # Handle the docstring-editing links for objnode in doctree.traverse(addnodes.desc): if objnode.get('domain') != 'py': continue names = set() for signode in objnode: if not isinstance(signode, addnodes.desc_signature): continue modname = signode.get('module') if not modname: continue fullname = signode.get('fullname') if fullname in names: # only one link per name, please continue names.add(fullname) obj = import_object(modname, fullname) anchor = None if obj is not None: try: lines, lineno = inspect.getsourcelines(obj) except: pass else: anchor = '#L%d' % lineno if anchor: real_modname = inspect.getmodule(obj).__name__ path = '%s%s%s.py%s' % ( url, source_root, real_modname.replace('.', '/'), anchor) onlynode = addnodes.only(expr='html') onlynode += nodes.reference( reftitle=app.config.edit_on_github_help_message, refuri=path) onlynode[0] += nodes.inline( '', '', nodes.raw('', ' ', format='html'), nodes.Text(docstring_message), classes=['edit-on-github', 'viewcode-link']) signode += onlynode def html_page_context(app, pagename, templatename, context, doctree): if (templatename == 'page.html' and not re.match(app.config.edit_on_github_skip_regex, pagename)): doc_root = app.config.edit_on_github_doc_root if doc_root != '' and not doc_root.endswith('/'): doc_root += '/' doc_path = os.path.relpath(doctree.get('source'), app.builder.srcdir) url = get_url_base(app) page_message = app.config.edit_on_github_page_message context['edit_on_github'] = url + doc_root + doc_path context['edit_on_github_page_message'] = page_message def setup(app): app.add_config_value('edit_on_github_project', 'REQUIRED', True) app.add_config_value('edit_on_github_branch', 'master', True) app.add_config_value('edit_on_github_source_root', 'lib', True) app.add_config_value('edit_on_github_doc_root', 'doc', True) app.add_config_value('edit_on_github_docstring_message', '[edit on github]', True) app.add_config_value('edit_on_github_page_message', 'Edit This Page on Github', True) app.add_config_value('edit_on_github_help_message', 'Push the Edit button on the next page', True) app.add_config_value('edit_on_github_skip_regex', '_.*', True) app.connect('doctree-read', doctree_read) app.connect('html-page-context', html_page_context) return {'parallel_read_safe': True, 'parallel_write_safe': True} sunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/ext/tocdepthfix.py0000644000175000001440000000137013203277317025542 0ustar nabil00000000000000from sphinx import addnodes def fix_toc_entries(app, doctree): # Get the docname; I don't know why this isn't just passed in to the # callback # This seems a bit unreliable as it's undocumented, but it's not "private" # either: docname = app.builder.env.temp_data['docname'] if app.builder.env.metadata[docname].get('tocdepth', 0) != 0: # We need to reprocess any TOC nodes in the doctree and make sure all # the files listed in any TOCs are noted for treenode in doctree.traverse(addnodes.toctree): app.builder.env.note_toctree(docname, treenode) def setup(app): app.connect('doctree-read', fix_toc_entries) return {'parallel_read_safe': True, 'parallel_write_safe': True} sunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/local/0000755000175000017500000000000013232563477024161 5ustar nabilnabil00000000000000sunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/local/python2_local_links.inv0000644000175000001440000000106213203277317027632 0ustar nabil00000000000000# Sphinx inventory version 2 # Project: Python # Version: 2.7 and 3.5 # The remainder of this file should be compressed using zlib. x=O0@w Z!nU bw+1rpKïIiQeI˽w8g"Wf ʬxK%lS(ϭ1 k&Qrp)ɐ.Bi۠3H]a)_ZI>dH, _M_"撠bvIzЀ82b;!I,=Wh_'l!Q%^B#Ô }inuD#e³\:{tu;/wxy. !nX{0BzoH /LxA&UXS{⮸5ߣ\RBiJF?sunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/local/python3_local_links.txt0000644000175000001440000000540413203277317027662 0ustar nabil00000000000000# Sphinx inventory version 2 # Project: Python # Version: 2.7 and 3.5 # The remainder of this file should be compressed using zlib. # python2 only links cPickle py:module -1 2/library/pickle.html#module-cPickle - unicode py:function -1 2/library/functions.html#unicode - bsddb py:module -1 2/library/bsddb.html#module-bsddb - dict.has_key py:method -1 2/library/stdtypes.html#dict.has_key - dict.iteritems py:method -1 2/library/stdtypes.html#dict.iteritems - dict.iterkeys py:method -1 2/library/stdtypes.html#dict.iterkeys - dict.itervalues py:method -1 2/library/stdtypes.html#dict.itervalues - urllib2.urlopen py:function -1 2/library/urllib2.html#urllib2.urlopen - # python3 print() py:function -1 3/library/functions.html#print - # python3 collections.abc collections.Container py:class -1 3/library/collections.abc.html#collections.abc.Container - collections.Hashable py:class -1 3/library/collections.abc.html#collections.abc.Hashable - collections.Sized py:class -1 3/library/collections.abc.html#collections.abc.Sized - collections.Callable py:class -1 3/library/collections.abc.html#collections.abc.Callable - collections.Iterable py:class -1 3/library/collections.abc.html#collections.abc.Iterable - collections.Iterator py:class -1 3/library/collections.abc.html#collections.abc.Iterator - collections.Generator py:class -1 3/library/collections.abc.html#collections.abc.Generator - collections.Sequence py:class -1 3/library/collections.abc.html#collections.abc.Sequence - collections.MutableSequence py:class -1 3/library/collections.abc.html#collections.abc.MutableSequence - collections.ByteString py:class -1 3/library/collections.abc.html#collections.abc.ByteString - collections.Set py:class -1 3/library/collections.abc.html#collections.abc.Set - collections.MutableSet py:class -1 3/library/collections.abc.html#collections.abc.MutableSet - collections.Mapping py:class -1 3/library/collections.abc.html#collections.abc.Mapping - collections.MutableMapping py:class -1 3/library/collections.abc.html#collections.abc.MutableMapping - collections.MappingView py:class -1 3/library/collections.abc.html#collections.abc.MappingView - collections.ItemsView py:class -1 3/library/collections.abc.html#collections.abc.ItemsView - collections.KeysView py:class -1 3/library/collections.abc.html#collections.abc.KeysView - collections.ValuesView py:class -1 3/library/collections.abc.html#collections.abc.ValuesView - collections.Awaitable py:class -1 3/library/collections.abc.html#collections.abc.Awaitable - collections.Coroutine py:class -1 3/library/collections.abc.html#collections.abc.Coroutine - collections.AsyncIterable py:class -1 3/library/collections.abc.html#collections.abc.AsyncIterable - collections.AsyncIterator py:class -1 3/library/collections.abc.html#collections.abc.AsyncIterator - sunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/themes/0000755000175000017500000000000013232563477024354 5ustar nabilnabil00000000000000sunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/themes/bootstrap-astropy/0000755000175000017500000000000013232563477030070 5ustar nabilnabil00000000000000sunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/themes/bootstrap-astropy/static/0000755000175000017500000000000013232563477031357 5ustar nabilnabil00000000000000././@LongLink0000000000000000000000000000014700000000000011217 Lustar 00000000000000sunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/themes/bootstrap-astropy/static/astropy_linkout.svgsunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/themes/bootstrap-astropy/static/astropy_linkout.s0000644000175000001440000001212113203277317033765 0ustar nabil00000000000000 ././@LongLink0000000000000000000000000000015200000000000011213 Lustar 00000000000000sunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/themes/bootstrap-astropy/static/astropy_linkout_20.pngsunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/themes/bootstrap-astropy/static/astropy_linkout_20000644000175000001440000000327513203277317033757 0ustar nabil00000000000000PNG  IHDR[8A bKGD oFFsvek pHYs B(x vpAg\@0IDATXi_SϘ+jfF BHXbOέ}-ZAb$iV#TZCՖ IiUd;?)*Orsyss!LO`[=`3|;1`{Ͷﱽv]mX=lyZjs@30l<,ݒ @+60S϶Gmo t% `4 pX<,1:`R~qP`.0kWJs¶@R>)Nt$S`6p6pTm5Hs8{@` J:v=%``/9`/i~\`b{H7KB݀"Ɠof:/hR' J\"`n*[! `'I} o9#g6 l}mh[lOe~tgE;nkmϳ=^KQ&~* N Nx l30L-'w~u O lOm)ީ`"ױakٚs\"5ߟ[m,fB 9{g[ؓ'(8}';aq^{N:l_q-HZ"x.5kO|[86_Y?-B6m8wDqkׅ (eY5$ʯwdz"D%iZMh1/ѪbmZ۟0] V-_پ9냲1K%)AB089l *N' M/o;GcJ=IÁe:T6ܝ}ʳP F76J}K h,aSΌV`%XU [IWE԰K ? |LYerZJ*<3E X1r=$.C*3^p+7 (! sPf %   i# #"""" yu =!"""""""""""""""""""!!! $$$$$$"m8T%!$$$$$###""""###$$$$$$##$$#!' &j'(&&&&!Nim5 %&&&%%$##""""""##$$%&&&&&&&&%&3)%(*)))(%'IUq'!')((('&#("DPkpmNj!C&"%&'(((((((&'9 +*+*++)*Qo%%++++*'$"Gt}/R'&))******''U+;-.---,)Vt]z('----,$F?`)),,,,,,.,.t@//0000- :z1(0/./,+Zw#L'./////0.-I0%021110/bH)1221.8xTs+/100011/2$@3n3533318Ek,243418q103222320@ 2666655Dl @/65540t\~?e1\,X,X2]?fZ}u335555644X8 5:88877@j08888.Rx:eE1*-..-*0C3]jl168778855:O9<:::8 BM3;:;7O^@/49:::99984.6/]Mu39999;88<{;=<<<;9hc<:<<<2xOy65<=<<<<<<<<<<92 Af!S9;;;<=9;'=?@??=?k7g5>>>;Mc89?>>>>>>>>>>>>?>7:[=<>>>@>>ABBAA?B#[9AAA:U F9A@@@>:6557;?@@@@A;=e>o>@@@AB?<BDCCCADT>CCC9Ev7CCC>4DBssj0f>:BBBBC; FC@BBBDBBhUEGEEEBFOAEED@Y?FC9&a?r?BEEEE=$_4kCDDDDEB@ FJHHHEIxMDGGF OIE?H_bHEGGGEE\EEGGGIDJ4ILJJJGLtNGJJHZpB= ]]BIIIJA ` PGIIIKHJxLNLLLIN{ RILLJ\r;.h+iGKKKHNo5pJKKKKKLOPNNNLOYJNNMR5nFMNNNF9unMKMMMOLPQQQQORbJPPPH\NPPPI!gPNPPPRPRQTSSQT'mJSSSJ}ANRRRM`TPRRRTPV}UVUUSTfFOTUUQ9{_NTTTP Z~VQTTTVRVPWYWWVU0w _SWWVXS:}jPVVVTYj ]SVVVXVZ"X\YYYW^-vQYYYR;bQ9hSYYYWZbeWXXX[Xf X]\\\ZZ~z^W\[[WdOXKNVV[[[Y\e dY[[[^[f_]_^^]\*x<X]^^\_d)wT[Yt4Y]]]Zar`Z]]]`]b<`c```^]oY```][B?ZY`W"ve]___\h`\___b]mbdbbbba/i[abbaZ_;ryWoW[ab_]pYabbb]rb_aaad_Uewdgeeed`yo\bdddc_ZYZ\addda]G9_dddd\(|ebdddgdg%fjggggep3c_fgggfffffff_cGcefffe`GZeefffifihkiiihe5g'}e`dfghhgeabwj5chhhhd p&fghhhkhj0knkkkkjeNi=| qhdflv0Xddjkkkkd*khjjjjmknmpnnnnmgSm_ex|nkmmmmjmlqllmmmmpku%mrpppppoiD~ tkoonjki.#mnoooororgpuqrrrrqljsoqqps~ttnoqqqqqrn`tvuttttttqsR:ortttm%nb0rrssssusryx1vzwwwwwwvup {WTxquuuvs vpsuvvvvvyuw/x[w|yxxxxyyxwtv+ht2wswxxxxxq7vxxwwwyxw|x~{zzzzzzzzzxwux)-)|uwxzzz{{{{v Ovyyyyyz|w|H {~}}}}||||||||{{{z{{{||||||||||wPy{}||||}}z~~~~~~~~~~~~~~~y!}~~~~~}7}b/n;]+u %gL@Mxs&G#Vs]<T%qss wP70W7 &id 8iuE ( @ d W ,uJ>P&:K bs\n +!!!0J +%%%%ps(%%%%%%%%%%%$$$"5+0***>^@_))))$GyPl 1)))))'....0Xv...C{3---*$3#333Xy2228_#N22227t777O77O`K6 =;eJ6667O:<;I;;;@;;;;;;P@;::U@@@Crj@@(^C???????? Fs???ASADDgAtDDjM|DD7lHyDDDTNCCDIII|)fIIW QHHHx\HHHF!MMMo6sMM#e8sLL^LLLMcRRR\YQQhQQQQQQOVVV"mVVcUUUUUUS\l[[ZjZZz[ZZZ]YYWa*___r___G^*y^^^^^^[acchnccce({lccdAcccbbb_i_hhhHqhgggg mhgg zggggfkllljQ8G#llkVkkkip]qqqqN7ppp~tpppowtuuuu~ut ysttttv'y{yyyyy|@lqJ yyyy|yyyw}5~~~~~~~~~~~}}}}"P}}}}{<Ds6i %3a _$;$lw&(0 \&2$1e1i9E Bl{;O " )C!" &&k' g~g##-MTn[tGc<!''&(1+'&Ne!5XE$.*3d411&Mp@e*5187F;g&(X4\2) @Ms1^188D>;8iK2;,C G9,FE=>UB@[>O3j@^S7WO=DC5KFb@]+iJ@oKLIpQNPP W?|?3s YOPVU#n"nFvcD"mbTQ]v__~QdeUL"rhZYa:b^GOUdFR1VB!vU0 ja_q fmgwvb`hQaabjhgnHomt rdr]hqmrzqtXt xjQnytgzwu ~3^eFvqVrwx +}|{{||||'}~s, 6 >4 L;s 9qf$(  * mcmU#1 4E 16G\  'HU'+#!lKi!$0PUAC$v 3 D;->%>4$4"" R6;AJRT0aIx B UW7U-MRX_5A Tt\tOCBNYl-XNKWWG\IVdmd@Nudy_ou%umQ{}qvCU|Pvv totUH NZ: Ul*sunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/themes/bootstrap-astropy/static/astropy_logo.svg0000644000175000001440000001103213203277317033575 0ustar nabil00000000000000 ././@LongLink0000000000000000000000000000014700000000000011217 Lustar 00000000000000sunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/themes/bootstrap-astropy/static/astropy_logo_32.pngsunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/themes/bootstrap-astropy/static/astropy_logo_32.p0000644000175000001440000000353413203277317033551 0ustar nabil00000000000000PNG  IHDR szzsBIT|d pHYstEXtSoftwarewww.inkscape.org<IDATXŗPT?cP  FUBȘ&diI# JhC2nj5tw:۪5Sƪڡ%ZF2VkJF`(Jdqa., ?3gsϏΞ\_ɕ#Hl 2pZ8ԯKLW;ACȋh4z>$?#hJ~`;&y#D b0¤u2RqKJr'7<6.´;`2ҋ@&a$`+Ɲ1WB], w.rM|rh?G6Bm"GïK0#&: WBa˰mL6p+Δxti@D1;z v7zCrׇE9,_Ghby; !,eUėAlO-^;V~;MKxUZK%:L剜"9Tr3WCWa89`p4XW;KxBjwɥׇ.WLD_e5w`DzFG;z9?@ghI^ UԳMl+ās%bZKo@`!8o)!pu4W;U00i'@V \}> u  bdǑY>rzc0iI,\1DX )ׇ__m cB3߬|f̃I.K;NAq!~*r8g)Bď߅;!*'#DrdN;Ql |( Xj[`aPy* ؗԥhbO 9el 0Hia29HRe 5*@)}˱ cU5aIr m0JnARPrj&5+ޝAL:KA\ e'_໩lg'm/!7|p7zT@50 K޹g@/fHN|ׯ@b b8Xl,yf} ڠU; )U1obS j~¦aS2!&A8/ 7hu.@0D=_oo nI/ I70Fާ&%,*}t {#$'@tbʾ?uO j&DK -T㎉E4| )p,;!7ÿ3i06XԾ8nBSjOENi 0-g<0c&T@e] K . ;z硳-TR[t:iy脷,,4EBY8{Z5FAK]?upjL,<" ^?aRe AO/YHKC}K7ټV='N h@$.:4}rsFp"jw^qo?%f$2H̀O675E)iנس\oF̄*j{YUIܹ !bQ[Ǣ&X])WHT] 텟A֭`ЇuWXq;dgڱ "20֯зka:ob3u2p!}rn,TjN$9L࿡k{rAMP*ari.i[ hШ7O$0 ˕Lg$33 G.8<IENDB`././@LongLink0000000000000000000000000000015100000000000011212 Lustar 00000000000000sunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/themes/bootstrap-astropy/static/bootstrap-astropy.csssunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/themes/bootstrap-astropy/static/bootstrap-astropy0000644000175000001440000002744313203277317034007 0ustar nabil00000000000000/*! * Bootstrap v1.4.0 * * Copyright 2011 Twitter, Inc * Licensed under the Apache License v2.0 * http://www.apache.org/licenses/LICENSE-2.0 * * Heavily modified by Kyle Barbary for the AstroPy Project for use with Sphinx. */ @import url("basic.css"); body { background-color: #ffffff; margin: 0; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 13px; font-weight: normal; line-height: 18px; color: #404040; } /* Hyperlinks ----------------------------------------------------------------*/ a { color: #0069d6; text-decoration: none; line-height: inherit; font-weight: inherit; } a:hover { color: #00438a; text-decoration: underline; } /* Typography ----------------------------------------------------------------*/ h1,h2,h3,h4,h5,h6 { color: #404040; margin: 0.7em 0 0 0; line-height: 1.5em; } h1 { font-size: 24px; margin: 0; } h2 { font-size: 21px; line-height: 1.2em; margin: 1em 0 0.5em 0; border-bottom: 1px solid #404040; } h3 { font-size: 18px; } h4 { font-size: 16px; } h5 { font-size: 14px; } h6 { font-size: 13px; text-transform: uppercase; } p { font-size: 13px; font-weight: normal; line-height: 18px; margin-top: 0px; margin-bottom: 9px; } ul, ol { margin-left: 0; padding: 0 0 0 25px; } ul ul, ul ol, ol ol, ol ul { margin-bottom: 0; } ul { list-style: disc; } ol { list-style: decimal; } li { line-height: 18px; color: #404040; } ul.unstyled { list-style: none; margin-left: 0; } dl { margin-bottom: 18px; } dl dt, dl dd { line-height: 18px; } dl dd { margin-left: 9px; } hr { margin: 20px 0 19px; border: 0; border-bottom: 1px solid #eee; } strong { font-style: inherit; font-weight: bold; } em { font-style: italic; font-weight: inherit; line-height: inherit; } .muted { color: #bfbfbf; } address { display: block; line-height: 18px; margin-bottom: 18px; } code, pre { padding: 0 3px 2px; font-family: monospace; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; } tt { font-family: monospace; } code { padding: 1px 3px; } pre { display: block; padding: 8.5px; margin: 0 0 18px; line-height: 18px; border: 1px solid #ddd; border: 1px solid rgba(0, 0, 0, 0.12); -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; white-space: pre; word-wrap: break-word; } img { margin: 9px 0; } /* format inline code with a rounded box */ tt, code { margin: 0 2px; padding: 0 5px; border: 1px solid #ddd; border: 1px solid rgba(0, 0, 0, 0.12); border-radius: 3px; } code.xref, a code { margin: 0; padding: 0 1px 0 1px; background-color: none; border: none; } /* all code has same box background color, even in headers */ h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt, h1 code, h2 code, h3 code, h4 code, h5 code, h6 code, pre, code, tt { background-color: #f8f8f8; } /* override box for links & other sphinx-specifc stuff */ tt.xref, a tt, tt.descname, tt.descclassname { padding: 0 1px 0 1px; border: none; } /* override box for related bar at the top of the page */ .related tt { border: none; padding: 0 1px 0 1px; background-color: transparent; font-weight: bold; } th { background-color: #dddddd; } .viewcode-back { font-family: sans-serif; } div.viewcode-block:target { background-color: #f4debf; border-top: 1px solid #ac9; border-bottom: 1px solid #ac9; } table.docutils { border-spacing: 5px; border-collapse: separate; } /* Topbar --------------------------------------------------------------------*/ div.topbar { height: 40px; position: absolute; top: 0; left: 0; right: 0; z-index: 10000; padding: 0px 10px; background-color: #222; background-color: #222222; background-repeat: repeat-x; background-image: -khtml-gradient(linear, left top, left bottom, from(#333333), to(#222222)); background-image: -moz-linear-gradient(top, #333333, #222222); background-image: -ms-linear-gradient(top, #333333, #222222); background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #333333), color-stop(100%, #222222)); background-image: -webkit-linear-gradient(top, #333333, #222222); background-image: -o-linear-gradient(top, #333333, #222222); background-image: linear-gradient(top, #333333, #222222); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); overflow: auto; } div.topbar a.brand { font-family: 'Source Sans Pro', sans-serif; font-size: 26px; color: #ffffff; font-weight: 600; text-decoration: none; float: left; display: block; height: 32px; padding: 8px 12px 0px 45px; margin-left: -10px; background: transparent url("astropy_logo_32.png") no-repeat 10px 4px; background-image: url("astropy_logo.svg"), none; background-size: 32px 32px; } #logotext1 { } #logotext2 { font-weight:200; color: #ff5000; } #logotext3 { font-weight:200; } div.topbar .brand:hover, div.topbar ul li a.homelink:hover { background-color: #333; background-color: rgba(255, 255, 255, 0.05); } div.topbar ul { font-size: 110%; list-style: none; margin: 0; padding: 0 0 0 10px; float: right; color: #bfbfbf; text-align: center; text-decoration: none; height: 100%; } div.topbar ul li { float: left; display: inline; height: 30px; margin: 5px; padding: 0px; } div.topbar ul li a { color: #bfbfbf; text-decoration: none; padding: 5px; display: block; height: auto; text-align: center; vertical-align: middle; border-radius: 4px; } div.topbar ul li a:hover { color: #ffffff; text-decoration: none; } div.topbar ul li a.homelink { width: 112px; display: block; height: 20px; padding: 5px 0px; background: transparent url("astropy_linkout_20.png") no-repeat 10px 5px; background-image: url("astropy_linkout.svg"), none; background-size: 91px 20px; } div.topbar form { text-align: left; margin: 0 0 0 5px; position: relative; filter: alpha(opacity=100); -khtml-opacity: 1; -moz-opacity: 1; opacity: 1; } div.topbar input { background-color: #444; background-color: rgba(255, 255, 255, 0.3); font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: normal; font-weight: 13px; line-height: 1; padding: 4px 9px; color: #ffffff; color: rgba(255, 255, 255, 0.75); border: 1px solid #111; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.25); -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.25); box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.25); -webkit-transition: none; -moz-transition: none; -ms-transition: none; -o-transition: none; transition: none; } div.topbar input:-moz-placeholder { color: #e6e6e6; } div.topbar input::-webkit-input-placeholder { color: #e6e6e6; } div.topbar input:hover { background-color: #bfbfbf; background-color: rgba(255, 255, 255, 0.5); color: #ffffff; } div.topbar input:focus, div.topbar input.focused { outline: 0; background-color: #ffffff; color: #404040; text-shadow: 0 1px 0 #ffffff; border: 0; padding: 5px 10px; -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); } /* Relation bar (breadcrumbs, prev, next) ------------------------------------*/ div.related { height: 21px; width: auto; margin: 0 10px; position: absolute; top: 42px; clear: both; left: 0; right: 0; z-index: 10000; font-size: 100%; vertical-align: middle; background-color: #fff; border-bottom: 1px solid #bbb; } div.related ul { padding: 0; margin: 0; } /* Footer --------------------------------------------------------------------*/ footer { display: block; margin: 10px 10px 0px; padding: 10px 0 0 0; border-top: 1px solid #bbb; } .pull-right { float: right; width: 30em; text-align: right; } /* Sphinx sidebar ------------------------------------------------------------*/ div.sphinxsidebar { font-size: inherit; border-radius: 3px; background-color: #eee; border: 1px solid #bbb; word-wrap: break-word; /* overflow-wrap is the canonical name for word-wrap in the CSS3 text draft. We include it here mainly for future-proofing. */ overflow-wrap: break-word; } div.sphinxsidebarwrapper { padding: 0px 0px 0px 5px; } div.sphinxsidebar h3 { font-family: 'Trebuchet MS', sans-serif; font-size: 1.4em; font-weight: normal; margin: 5px 0px 0px 5px; padding: 0; line-height: 1.6em; } div.sphinxsidebar h4 { font-family: 'Trebuchet MS', sans-serif; font-size: 1.3em; font-weight: normal; margin: 5px 0 0 0; padding: 0; } div.sphinxsidebar p { } div.sphinxsidebar p.topless { margin: 5px 10px 10px 10px; } div.sphinxsidebar ul { margin: 0px 0px 0px 5px; padding: 0; } div.sphinxsidebar ul ul { margin-left: 15px; list-style-type: disc; } /* If showing the global TOC (toctree), color the current page differently */ div.sphinxsidebar a.current { color: #404040; } div.sphinxsidebar a.current:hover { color: #404040; } /* document, documentwrapper, body, bodywrapper ----------------------------- */ div.document { margin-top: 72px; margin-left: 10px; margin-right: 10px; } div.documentwrapper { float: left; width: 100%; } div.body { background-color: #ffffff; padding: 0 0 0px 20px; } div.bodywrapper { margin: 0 0 0 230px; max-width: 55em; } /* Header links ------------------------------------------------------------- */ a.headerlink { font-size: 0.8em; padding: 0 4px 0 4px; text-decoration: none; } a.headerlink:hover { background-color: #0069d6; color: white; text-docoration: none; } /* Admonitions and warnings ------------------------------------------------- */ /* Shared by admonitions and warnings */ div.admonition, div.warning { padding: 0px; border-radius: 3px; -moz-border-radius: 3px; -webkit-border-radius: 3px; } div.admonition p, div.warning p { margin: 0.5em 1em 0.5em 1em; padding: 0; } div.admonition pre, div.warning pre { margin: 0.4em 1em 0.4em 1em; } div.admonition p.admonition-title, div.warning p.admonition-title { margin: 0; padding: 0.1em 0 0.1em 0.5em; color: white; font-weight: bold; font-size: 1.1em; } div.admonition ul, div.admonition ol, div.warning ul, div.warning ol { margin: 0.1em 0.5em 0.5em 3em; padding: 0; } /* Admonitions only */ div.admonition { border: 1px solid #609060; background-color: #e9ffe9; } div.admonition p.admonition-title { background-color: #70A070; } /* Warnings only */ div.warning { border: 1px solid #900000; background-color: #ffe9e9; } div.warning p.admonition-title { background-color: #b04040; } /* Figures ------------------------------------------------------------------ */ .figure.align-center { clear: none; } /* This is a div for containing multiple figures side-by-side, for use with * .. container:: figures */ div.figures { border: 1px solid #CCCCCC; background-color: #F8F8F8; margin: 1em; text-align: center; } div.figures .figure { clear: none; float: none; display: inline-block; border: none; margin-left: 0.5em; margin-right: 0.5em; } .field-list th { white-space: nowrap; } table.field-list { border-spacing: 0px; margin-left: 1px; border-left: 5px solid rgb(238, 238, 238) !important; } table.field-list th.field-name { display: inline-block; padding: 1px 8px 1px 5px; white-space: nowrap; background-color: rgb(238, 238, 238); border-radius: 0 3px 3px 0; -webkit-border-radius: 0 3px 3px 0; } sunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/themes/bootstrap-astropy/static/copybutton.js0000644000175000001440000000532113203277317033103 0ustar nabil00000000000000$(document).ready(function() { /* Add a [>>>] button on the top-right corner of code samples to hide * the >>> and ... prompts and the output and thus make the code * copyable. */ var div = $('.highlight-python .highlight,' + '.highlight-python3 .highlight,' + '.highlight-default .highlight') var pre = div.find('pre'); // get the styles from the current theme pre.parent().parent().css('position', 'relative'); var hide_text = 'Hide the prompts and output'; var show_text = 'Show the prompts and output'; var border_width = pre.css('border-top-width'); var border_style = pre.css('border-top-style'); var border_color = pre.css('border-top-color'); var button_styles = { 'cursor':'pointer', 'position': 'absolute', 'top': '0', 'right': '0', 'border-color': border_color, 'border-style': border_style, 'border-width': border_width, 'color': border_color, 'text-size': '75%', 'font-family': 'monospace', 'padding-left': '0.2em', 'padding-right': '0.2em', 'border-radius': '0 3px 0 0' } // create and add the button to all the code blocks that contain >>> div.each(function(index) { var jthis = $(this); if (jthis.find('.gp').length > 0) { var button = $('>>>'); button.css(button_styles) button.attr('title', hide_text); button.data('hidden', 'false'); jthis.prepend(button); } // tracebacks (.gt) contain bare text elements that need to be // wrapped in a span to work with .nextUntil() (see later) jthis.find('pre:has(.gt)').contents().filter(function() { return ((this.nodeType == 3) && (this.data.trim().length > 0)); }).wrap(''); }); // define the behavior of the button when it's clicked $('.copybutton').click(function(e){ e.preventDefault(); var button = $(this); if (button.data('hidden') === 'false') { // hide the code output button.parent().find('.go, .gp, .gt').hide(); button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'hidden'); button.css('text-decoration', 'line-through'); button.attr('title', show_text); button.data('hidden', 'true'); } else { // show the code output button.parent().find('.go, .gp, .gt').show(); button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'visible'); button.css('text-decoration', 'none'); button.attr('title', hide_text); button.data('hidden', 'false'); } }); }); sunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/themes/bootstrap-astropy/static/sidebar.js0000644000175000001440000001155313203277317032312 0ustar nabil00000000000000/* * sidebar.js * ~~~~~~~~~~ * * This script makes the Sphinx sidebar collapsible. * * .sphinxsidebar contains .sphinxsidebarwrapper. This script adds * in .sphixsidebar, after .sphinxsidebarwrapper, the #sidebarbutton * used to collapse and expand the sidebar. * * When the sidebar is collapsed the .sphinxsidebarwrapper is hidden * and the width of the sidebar and the margin-left of the document * are decreased. When the sidebar is expanded the opposite happens. * This script saves a per-browser/per-session cookie used to * remember the position of the sidebar among the pages. * Once the browser is closed the cookie is deleted and the position * reset to the default (expanded). * * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ $(function() { // global elements used by the functions. // the 'sidebarbutton' element is defined as global after its // creation, in the add_sidebar_button function var bodywrapper = $('.bodywrapper'); var sidebar = $('.sphinxsidebar'); var sidebarwrapper = $('.sphinxsidebarwrapper'); // for some reason, the document has no sidebar; do not run into errors if (!sidebar.length) return; // original margin-left of the bodywrapper and width of the sidebar // with the sidebar expanded var bw_margin_expanded = bodywrapper.css('margin-left'); var ssb_width_expanded = sidebar.width(); // margin-left of the bodywrapper and width of the sidebar // with the sidebar collapsed var bw_margin_collapsed = 12; var ssb_width_collapsed = 12; // custom colors var dark_color = '#404040'; var light_color = '#505050'; function sidebar_is_collapsed() { return sidebarwrapper.is(':not(:visible)'); } function toggle_sidebar() { if (sidebar_is_collapsed()) expand_sidebar(); else collapse_sidebar(); } function collapse_sidebar() { sidebarwrapper.hide(); sidebar.css('width', ssb_width_collapsed); bodywrapper.css('margin-left', bw_margin_collapsed); sidebarbutton.css({ 'margin-left': '-1px', 'height': bodywrapper.height(), 'border-radius': '3px' }); sidebarbutton.find('span').text('»'); sidebarbutton.attr('title', _('Expand sidebar')); document.cookie = 'sidebar=collapsed'; } function expand_sidebar() { bodywrapper.css('margin-left', bw_margin_expanded); sidebar.css('width', ssb_width_expanded); sidebarwrapper.show(); sidebarbutton.css({ 'margin-left': ssb_width_expanded - 12, 'height': bodywrapper.height(), 'border-radius': '0px 3px 3px 0px' }); sidebarbutton.find('span').text('«'); sidebarbutton.attr('title', _('Collapse sidebar')); document.cookie = 'sidebar=expanded'; } function add_sidebar_button() { sidebarwrapper.css({ 'float': 'left', 'margin-right': '0', 'width': ssb_width_expanded - 18 }); // create the button sidebar.append('
«
'); var sidebarbutton = $('#sidebarbutton'); // find the height of the viewport to center the '<<' in the page var viewport_height; if (window.innerHeight) viewport_height = window.innerHeight; else viewport_height = $(window).height(); var sidebar_offset = sidebar.offset().top; var sidebar_height = Math.max(bodywrapper.height(), sidebar.height()); sidebarbutton.find('span').css({ 'font-family': '"Lucida Grande",Arial,sans-serif', 'display': 'block', 'top': Math.min(viewport_height/2, sidebar_height/2 + sidebar_offset) - 10, 'width': 12, 'position': 'fixed', 'text-align': 'center' }); sidebarbutton.click(toggle_sidebar); sidebarbutton.attr('title', _('Collapse sidebar')); sidebarbutton.css({ 'color': '#FFFFFF', 'background-color': light_color, 'border': '1px solid ' + light_color, 'border-radius': '0px 3px 3px 0px', 'font-size': '1.2em', 'cursor': 'pointer', 'height': sidebar_height, 'padding-top': '1px', 'margin': '-1px', 'margin-left': ssb_width_expanded - 12 }); sidebarbutton.hover( function () { $(this).css('background-color', dark_color); }, function () { $(this).css('background-color', light_color); } ); } function set_position_from_cookie() { if (!document.cookie) return; var items = document.cookie.split(';'); for(var k=0; kTable of Contents {{ toctree(maxdepth=-1, titles_only=true) }} sunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/themes/bootstrap-astropy/layout.html0000644000175000001440000000655113203277317031261 0ustar nabil00000000000000{% extends "basic/layout.html" %} {# Collapsible sidebar script from default/layout.html in Sphinx #} {% set script_files = script_files + ['_static/sidebar.js'] %} {# Add the google webfonts needed for the logo #} {% block extrahead %} {% if not embedded %}{% endif %} {% endblock %} {% block header %}
{{ theme_logotext1 }}{{ theme_logotext2 }}{{ theme_logotext3 }}
  • Index
  • Modules
  • {% block sidebarsearch %} {% include "searchbox.html" %} {% endblock %}
{% endblock %} {% block relbar1 %} {% endblock %} {# Silence the bottom relbar. #} {% block relbar2 %}{% endblock %} {%- block footer %}

{%- if edit_on_github %} {{ edit_on_github_page_message }}   {%- endif %} {%- if show_source and has_source and sourcename %} {{ _('Page Source') }} {%- endif %}   Back to Top

{%- if show_copyright %} {%- if hasdoc('copyright') %} {% trans path=pathto('copyright'), copyright=copyright|e %}© Copyright {{ copyright }}.{% endtrans %}
{%- else %} {% trans copyright=copyright|e %}© Copyright {{ copyright }}.{% endtrans %}
{%- endif %} {%- endif %} {%- if show_sphinx %} {% trans sphinx_version=sphinx_version|e %}Created using Sphinx {{ sphinx_version }}.{% endtrans %}   {%- endif %} {%- if last_updated %} {% trans last_updated=last_updated|e %}Last built {{ last_updated }}.{% endtrans %}
{%- endif %}

{%- endblock %} sunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/themes/bootstrap-astropy/localtoc.html0000644000175000001440000000004213203277317031531 0ustar nabil00000000000000

Page Contents

{{ toc }} sunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/themes/bootstrap-astropy/searchbox.html0000644000175000001440000000042013203277317031707 0ustar nabil00000000000000{%- if pagename != "search" %}
{%- endif %} sunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/themes/bootstrap-astropy/theme.conf0000644000175000001440000000030013203277317031011 0ustar nabil00000000000000# AstroPy theme based on Twitter Bootstrap CSS [theme] inherit = basic stylesheet = bootstrap-astropy.css pygments_style = sphinx [options] logotext1 = astro logotext2 = py logotext3 = :docs sunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/__init__.py0000644000175000001440000000066513203277317024166 0ustar nabil00000000000000""" This package contains utilities and extensions for the Astropy sphinx documentation. In particular, the `astropy.sphinx.conf` should be imported by the sphinx ``conf.py`` file for affiliated packages that wish to make use of the Astropy documentation format. Note that some sphinx extensions which are bundled as-is (numpydoc and sphinx-automodapi) are included in astropy_helpers.extern rather than astropy_helpers.sphinx.ext. """ sunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/conf.py0000644000175000001440000002721713203277317023356 0ustar nabil00000000000000# -*- coding: utf-8 -*- # Licensed under a 3-clause BSD style license - see LICENSE.rst # # Astropy shared Sphinx settings. These settings are shared between # astropy itself and affiliated packages. # # Note that not all possible configuration values are present in this file. # # All configuration values have a default; values that are commented out # serve to show the default. import os import sys import warnings from os import path import sphinx from distutils.version import LooseVersion # -- General configuration ---------------------------------------------------- # The version check in Sphinx itself can only compare the major and # minor parts of the version number, not the micro. To do a more # specific version check, call check_sphinx_version("x.y.z.") from # your project's conf.py needs_sphinx = '1.3' on_rtd = os.environ.get('READTHEDOCS', None) == 'True' def check_sphinx_version(expected_version): sphinx_version = LooseVersion(sphinx.__version__) expected_version = LooseVersion(expected_version) if sphinx_version < expected_version: raise RuntimeError( "At least Sphinx version {0} is required to build this " "documentation. Found {1}.".format( expected_version, sphinx_version)) # Configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = { 'python': ('https://docs.python.org/3/', (None, 'http://data.astropy.org/intersphinx/python3.inv')), 'pythonloc': ('http://docs.python.org/', path.abspath(path.join(path.dirname(__file__), 'local/python3_local_links.inv'))), 'numpy': ('https://docs.scipy.org/doc/numpy/', (None, 'http://data.astropy.org/intersphinx/numpy.inv')), 'scipy': ('https://docs.scipy.org/doc/scipy/reference/', (None, 'http://data.astropy.org/intersphinx/scipy.inv')), 'matplotlib': ('http://matplotlib.org/', (None, 'http://data.astropy.org/intersphinx/matplotlib.inv')), 'astropy': ('http://docs.astropy.org/en/stable/', None), 'h5py': ('http://docs.h5py.org/en/latest/', None)} if sys.version_info[0] == 2: intersphinx_mapping['python'] = ( 'https://docs.python.org/2/', (None, 'http://data.astropy.org/intersphinx/python2.inv')) intersphinx_mapping['pythonloc'] = ( 'http://docs.python.org/', path.abspath(path.join(path.dirname(__file__), 'local/python2_local_links.inv'))) # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = ['_build'] # Add any paths that contain templates here, relative to this directory. # templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. #source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' # The reST default role (used for this markup: `text`) to use for all # documents. Set to the "smart" one. default_role = 'obj' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. #language = None # This is added to the end of RST files - a good place to put substitutions to # be used globally. rst_epilog = """ .. _Astropy: http://astropy.org """ # A list of warning types to suppress arbitrary warning messages. We mean to # override directives in astropy_helpers.sphinx.ext.autodoc_enhancements, # thus need to ignore those warning. This can be removed once the patch gets # released in upstream Sphinx (https://github.com/sphinx-doc/sphinx/pull/1843). # Suppress the warnings requires Sphinx v1.4.2 suppress_warnings = ['app.add_directive', ] # -- Project information ------------------------------------------------------ # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: #today = '' # Else, today_fmt is used as the format for a strftime call. #today_fmt = '%B %d, %Y' # If true, '()' will be appended to :func: etc. cross-reference text. #add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. #show_authors = False # The name of the Pygments (syntax highlighting) style to use. #pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] # -- Settings for extensions and extension options ---------------------------- # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ 'sphinx.ext.autodoc', 'sphinx.ext.intersphinx', 'sphinx.ext.todo', 'sphinx.ext.coverage', 'sphinx.ext.inheritance_diagram', 'sphinx.ext.viewcode', 'astropy_helpers.extern.numpydoc', 'astropy_helpers.extern.automodapi.automodapi', 'astropy_helpers.extern.automodapi.smart_resolver', 'astropy_helpers.sphinx.ext.tocdepthfix', 'astropy_helpers.sphinx.ext.doctest', 'astropy_helpers.sphinx.ext.changelog_links'] if not on_rtd and LooseVersion(sphinx.__version__) < LooseVersion('1.4'): extensions.append('sphinx.ext.pngmath') else: extensions.append('sphinx.ext.mathjax') try: import matplotlib.sphinxext.plot_directive extensions += [matplotlib.sphinxext.plot_directive.__name__] # AttributeError is checked here in case matplotlib is installed but # Sphinx isn't. Note that this module is imported by the config file # generator, even if we're not building the docs. except (ImportError, AttributeError): warnings.warn( "matplotlib's plot_directive could not be imported. " + "Inline plots will not be included in the output") # Don't show summaries of the members in each class along with the # class' docstring numpydoc_show_class_members = False autosummary_generate = True automodapi_toctreedirnm = 'api' # Class documentation should contain *both* the class docstring and # the __init__ docstring autoclass_content = "both" # Render inheritance diagrams in SVG graphviz_output_format = "svg" graphviz_dot_args = [ '-Nfontsize=10', '-Nfontname=Helvetica Neue, Helvetica, Arial, sans-serif', '-Efontsize=10', '-Efontname=Helvetica Neue, Helvetica, Arial, sans-serif', '-Gfontsize=10', '-Gfontname=Helvetica Neue, Helvetica, Arial, sans-serif' ] # -- Options for HTML output ------------------------------------------------- # Add any paths that contain custom themes here, relative to this directory. html_theme_path = [path.abspath(path.join(path.dirname(__file__), 'themes'))] # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = 'bootstrap-astropy' # Custom sidebar templates, maps document names to template names. html_sidebars = { '**': ['localtoc.html'], 'search': [], 'genindex': [], 'py-modindex': [], } # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. # included in the bootstrap-astropy theme html_favicon = path.join(html_theme_path[0], html_theme, 'static', 'astropy_logo.ico') # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. html_last_updated_fmt = '%d %b %Y' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. #html_theme_options = {} # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". #html_title = None # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. #html_use_smartypants = True # Additional templates that should be rendered to pages, maps page names to # template names. #html_additional_pages = {} # If false, no module index is generated. #html_domain_indices = True # If false, no index is generated. #html_use_index = True # If true, the index is split into individual pages for each letter. #html_split_index = False # If true, links to the reST sources are added to the pages. #html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. #html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. #html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. #html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = None # -- Options for LaTeX output ------------------------------------------------ # The paper size ('letter' or 'a4'). #latex_paper_size = 'letter' # The font size ('10pt', '11pt' or '12pt'). #latex_font_size = '10pt' # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. latex_toplevel_sectioning = 'part' # If true, show page references after internal links. #latex_show_pagerefs = False # If true, show URL addresses after external links. #latex_show_urls = False latex_elements = {} # Additional stuff for the LaTeX preamble. latex_elements['preamble'] = r""" % Use a more modern-looking monospace font \usepackage{inconsolata} % The enumitem package provides unlimited nesting of lists and enums. % Sphinx may use this in the future, in which case this can be removed. % See https://bitbucket.org/birkenfeld/sphinx/issue/777/latex-output-too-deeply-nested \usepackage{enumitem} \setlistdepth{15} % In the parameters section, place a newline after the Parameters % header. (This is stolen directly from Numpy's conf.py, since it % affects Numpy-style docstrings). \usepackage{expdlist} \let\latexdescription=\description \def\description{\latexdescription{}{} \breaklabel} % Support the superscript Unicode numbers used by the "unicode" units % formatter \DeclareUnicodeCharacter{2070}{\ensuremath{^0}} \DeclareUnicodeCharacter{00B9}{\ensuremath{^1}} \DeclareUnicodeCharacter{00B2}{\ensuremath{^2}} \DeclareUnicodeCharacter{00B3}{\ensuremath{^3}} \DeclareUnicodeCharacter{2074}{\ensuremath{^4}} \DeclareUnicodeCharacter{2075}{\ensuremath{^5}} \DeclareUnicodeCharacter{2076}{\ensuremath{^6}} \DeclareUnicodeCharacter{2077}{\ensuremath{^7}} \DeclareUnicodeCharacter{2078}{\ensuremath{^8}} \DeclareUnicodeCharacter{2079}{\ensuremath{^9}} \DeclareUnicodeCharacter{207B}{\ensuremath{^-}} \DeclareUnicodeCharacter{00B0}{\ensuremath{^{\circ}}} \DeclareUnicodeCharacter{2032}{\ensuremath{^{\prime}}} \DeclareUnicodeCharacter{2033}{\ensuremath{^{\prime\prime}}} % Make the "warning" and "notes" sections use a sans-serif font to % make them stand out more. \renewenvironment{notice}[2]{ \def\py@noticetype{#1} \csname py@noticestart@#1\endcsname \textsf{\textbf{#2}} }{\csname py@noticeend@\py@noticetype\endcsname} """ # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. #latex_domain_indices = True # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # -- Options for the linkcheck builder ---------------------------------------- # A timeout value, in seconds, for the linkcheck builder linkcheck_timeout = 60 sunpy-0.8.3/astropy_helpers/astropy_helpers/sphinx/setup_package.py0000644000175000001440000000044413203277317025235 0ustar nabil00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst def get_package_data(): # Install the theme files return { 'astropy_helpers.sphinx': [ 'local/*.inv', 'themes/bootstrap-astropy/*.*', 'themes/bootstrap-astropy/static/*.*']} sunpy-0.8.3/astropy_helpers/astropy_helpers/tests/0000755000175000017500000000000013232563477022720 5ustar nabilnabil00000000000000sunpy-0.8.3/astropy_helpers/astropy_helpers/tests/__init__.py0000644000175000001440000001121513203277317024010 0ustar nabil00000000000000import os import subprocess as sp import sys from setuptools import sandbox import pytest from ..utils import extends_doc PACKAGE_DIR = os.path.dirname(__file__) def run_cmd(cmd, args, path=None, raise_error=True): """ Runs a shell command with the given argument list. Changes directory to ``path`` if given, otherwise runs the command in the current directory. Returns a 3-tuple of (stdout, stderr, exit code) If ``raise_error=True`` raise an exception on non-zero exit codes. """ if path is not None: # Transparently support py.path objects path = str(path) p = sp.Popen([cmd] + list(args), stdout=sp.PIPE, stderr=sp.PIPE, cwd=path) streams = tuple(s.decode('latin1').strip() for s in p.communicate()) return_code = p.returncode if raise_error and return_code != 0: raise RuntimeError( "The command `{0}` with args {1!r} exited with code {2}.\n" "Stdout:\n\n{3}\n\nStderr:\n\n{4}".format( cmd, list(args), return_code, streams[0], streams[1])) return streams + (return_code,) @extends_doc(sandbox.run_setup) def run_setup(*args, **kwargs): """ In Python 3, on MacOS X, the import cache has to be invalidated otherwise new extensions built with ``run_setup`` do not always get picked up. """ try: return sandbox.run_setup(*args, **kwargs) finally: if sys.version_info[:2] >= (3, 3): import importlib importlib.invalidate_caches() @pytest.fixture(scope='function', autouse=True) def reset_setup_helpers(request): """ Saves and restores the global state of the astropy_helpers.setup_helpers module between tests. """ mod = __import__('astropy_helpers.setup_helpers', fromlist=['']) old_state = mod._module_state.copy() def finalizer(old_state=old_state): mod = sys.modules.get('astropy_helpers.setup_helpers') if mod is not None: mod._module_state.update(old_state) request.addfinalizer(finalizer) @pytest.fixture(scope='function', autouse=True) def reset_distutils_log(): """ This is a setup/teardown fixture that ensures the log-level of the distutils log is always set to a default of WARN, since different settings could affect tests that check the contents of stdout. """ from distutils import log log.set_threshold(log.WARN) @pytest.fixture(scope='module', autouse=True) def fix_hide_setuptools(): """ Workaround for https://github.com/astropy/astropy-helpers/issues/124 In setuptools 10.0 run_setup was changed in such a way that it sweeps away the existing setuptools import before running the setup script. In principle this is nice, but in the practice of testing astropy_helpers this is problematic since we're trying to test code that has already been imported during the testing process, and which relies on the setuptools module that was already in use. """ if hasattr(sandbox, 'hide_setuptools'): sandbox.hide_setuptools = lambda: None TEST_PACKAGE_SETUP_PY = """\ #!/usr/bin/env python from setuptools import setup NAME = 'astropy-helpers-test' VERSION = {version!r} setup(name=NAME, version=VERSION, packages=['_astropy_helpers_test_'], zip_safe=False) """ @pytest.fixture def testpackage(tmpdir, version='0.1'): """ This fixture creates a simplified package called _astropy_helpers_test_ used primarily for testing ah_boostrap, but without using the astropy_helpers package directly and getting it confused with the astropy_helpers package already under test. """ source = tmpdir.mkdir('testpkg') with source.as_cwd(): source.mkdir('_astropy_helpers_test_') init = source.join('_astropy_helpers_test_', '__init__.py') init.write('__version__ = {0!r}'.format(version)) setup_py = TEST_PACKAGE_SETUP_PY.format(version=version) source.join('setup.py').write(setup_py) # Make the new test package into a git repo run_cmd('git', ['init']) run_cmd('git', ['add', '--all']) run_cmd('git', ['commit', '-m', 'test package']) return source def cleanup_import(package_name): """Remove all references to package_name from sys.modules""" for k in list(sys.modules): if not isinstance(k, str): # Some things will actually do this =_= continue elif k.startswith('astropy_helpers.tests'): # Don't delete imported test modules or else the tests will break, # badly continue if k == package_name or k.startswith(package_name + '.'): del sys.modules[k] sunpy-0.8.3/astropy_helpers/astropy_helpers/tests/coveragerc0000644000175000001440000000125113203277317023741 0ustar nabil00000000000000[run] source = astropy_helpers omit = astropy_helpers/commands/_test_compat.py astropy_helpers/compat/* astropy_helpers/*/setup_package.py astropy_helpers/extern/* astropy_helpers/extern/*/* astropy_helpers/tests/* */test_pkg/* [report] exclude_lines = # Have to re-enable the standard pragma pragma: no cover # Don't complain about packages we have installed except ImportError # Don't complain if tests don't hit assertions raise AssertionError raise NotImplementedError # Don't complain about script hooks def main\(.*\): # Ignore branches that don't pertain to this version of Python pragma: py{ignore_python_version} sunpy-0.8.3/astropy_helpers/astropy_helpers/tests/test_ah_bootstrap.py0000644000175000001440000003511113203277317025776 0ustar nabil00000000000000# -*- coding: utf-8 -*- import glob import os import textwrap from distutils.version import LooseVersion import setuptools from setuptools.package_index import PackageIndex import pytest from . import reset_setup_helpers, reset_distutils_log, fix_hide_setuptools # noqa from . import run_cmd, run_setup, testpackage from ..utils import silence TEST_SETUP_PY = """\ #!/usr/bin/env python from __future__ import print_function import os import sys import ah_bootstrap # reset the name of the package installed by ah_boostrap to # _astropy_helpers_test_--this will prevent any confusion by pkg_resources with # any already installed packages named astropy_helpers # We also disable auto-upgrade by default ah_bootstrap.DIST_NAME = 'astropy-helpers-test' ah_bootstrap.PACKAGE_NAME = '_astropy_helpers_test_' ah_bootstrap.AUTO_UPGRADE = False ah_bootstrap.DOWNLOAD_IF_NEEDED = False try: ah_bootstrap.BOOTSTRAPPER = ah_bootstrap._Bootstrapper.main() ah_bootstrap.use_astropy_helpers({args}) finally: ah_bootstrap.DIST_NAME = 'astropy-helpers' ah_bootstrap.PACKAGE_NAME = 'astropy_helpers' ah_bootstrap.AUTO_UPGRADE = True ah_bootstrap.DOWNLOAD_IF_NEEDED = True # Kind of a hacky way to do this, but this assertion is specifically # for test_check_submodule_no_git # TODO: Rework the tests in this module so that it's easier to test specific # behaviors of ah_bootstrap for each test assert '--no-git' not in sys.argv import _astropy_helpers_test_ filename = os.path.abspath(_astropy_helpers_test_.__file__) filename = filename.replace('.pyc', '.py') # More consistent this way print(filename) """ # The behavior checked in some of the tests depends on the version of # setuptools try: # We need to use LooseVersion here instead of StrictVersion since developer # versions of setuptools ('35.0.2.post20170530') don't satisfy the # StrictVersion criteria even though they satisfy PEP440 SETUPTOOLS_VERSION = LooseVersion(setuptools.__version__).version except: # Broken setuptools? ¯\_(ツ)_/¯ SETUPTOOLS_VERSION = (0, 0, 0) def test_bootstrap_from_submodule(tmpdir, testpackage, capsys): """ Tests importing _astropy_helpers_test_ from a submodule in a git repository. This tests actually performing a fresh clone of the repository without the submodule initialized, and that importing astropy_helpers in that context works transparently after calling `ah_boostrap.use_astropy_helpers`. """ orig_repo = tmpdir.mkdir('orig') # Ensure ah_bootstrap is imported from the local directory import ah_bootstrap # noqa with orig_repo.as_cwd(): run_cmd('git', ['init']) # Write a test setup.py that uses ah_bootstrap; it also ensures that # any previous reference to astropy_helpers is first wiped from # sys.modules orig_repo.join('setup.py').write(TEST_SETUP_PY.format(args='')) run_cmd('git', ['add', 'setup.py']) # Add our own clone of the astropy_helpers repo as a submodule named # astropy_helpers run_cmd('git', ['submodule', 'add', str(testpackage), '_astropy_helpers_test_']) run_cmd('git', ['commit', '-m', 'test repository']) os.chdir(str(tmpdir)) # Creates a clone of our test repo in the directory 'clone' run_cmd('git', ['clone', 'orig', 'clone']) os.chdir('clone') run_setup('setup.py', []) stdout, stderr = capsys.readouterr() path = stdout.strip() # Ensure that the astropy_helpers used by the setup.py is the one that # was imported from git submodule a = os.path.normcase(path) b = os.path.normcase(str(tmpdir.join('clone', '_astropy_helpers_test_', '_astropy_helpers_test_', '__init__.py'))) assert a == b def test_bootstrap_from_submodule_no_locale(tmpdir, testpackage, capsys, monkeypatch): """ Regression test for https://github.com/astropy/astropy/issues/2749 Runs test_bootstrap_from_submodule but with missing locale/language settings. """ for varname in ('LC_ALL', 'LC_CTYPE', 'LANG', 'LANGUAGE'): monkeypatch.delenv(varname, raising=False) test_bootstrap_from_submodule(tmpdir, testpackage, capsys) def test_bootstrap_from_submodule_bad_locale(tmpdir, testpackage, capsys, monkeypatch): """ Additional regression test for https://github.com/astropy/astropy/issues/2749 """ for varname in ('LC_ALL', 'LC_CTYPE', 'LANG', 'LANGUAGE'): monkeypatch.delenv(varname, raising=False) # Test also with bad LC_CTYPE a la http://bugs.python.org/issue18378 monkeypatch.setenv('LC_CTYPE', 'UTF-8') test_bootstrap_from_submodule(tmpdir, testpackage, capsys) def test_check_submodule_no_git(tmpdir, testpackage): """ Tests that when importing astropy_helpers from a submodule, it is still recognized as a submodule even when using the --no-git option. In particular this ensures that the auto-upgrade feature is not activated. """ orig_repo = tmpdir.mkdir('orig') # Ensure ah_bootstrap is imported from the local directory import ah_bootstrap # noqa with orig_repo.as_cwd(): run_cmd('git', ['init']) # Write a test setup.py that uses ah_bootstrap; it also ensures that # any previous reference to astropy_helpers is first wiped from # sys.modules args = 'auto_upgrade=True' orig_repo.join('setup.py').write(TEST_SETUP_PY.format(args=args)) run_cmd('git', ['add', 'setup.py']) # Add our own clone of the astropy_helpers repo as a submodule named # astropy_helpers run_cmd('git', ['submodule', 'add', str(testpackage), '_astropy_helpers_test_']) run_cmd('git', ['commit', '-m', 'test repository']) # Temporarily patch _do_upgrade to fail if called class UpgradeError(Exception): pass def _do_upgrade(*args, **kwargs): raise UpgradeError() orig_do_upgrade = ah_bootstrap._Bootstrapper._do_upgrade ah_bootstrap._Bootstrapper._do_upgrade = _do_upgrade try: run_setup('setup.py', ['--no-git']) except UpgradeError: pytest.fail('Attempted to run auto-upgrade despite importing ' '_astropy_helpers_test_ from a git submodule') finally: ah_bootstrap._Bootstrapper._do_upgrade = orig_do_upgrade # Ensure that the no-git option was in fact set assert not ah_bootstrap.BOOTSTRAPPER.use_git def test_bootstrap_from_directory(tmpdir, testpackage, capsys): """ Tests simply bundling a copy of the astropy_helpers source code in its entirety bundled directly in the source package and not in an archive. """ import ah_bootstrap # noqa source = tmpdir.mkdir('source') testpackage.copy(source.join('_astropy_helpers_test_')) with source.as_cwd(): source.join('setup.py').write(TEST_SETUP_PY.format(args='')) run_setup('setup.py', []) stdout, stderr = capsys.readouterr() stdout = stdout.splitlines() if stdout: path = stdout[-1].strip() else: path = '' # Ensure that the astropy_helpers used by the setup.py is the one that # was imported from git submodule a = os.path.normcase(path) b = os.path.normcase(str(source.join('_astropy_helpers_test_', '_astropy_helpers_test_', '__init__.py'))) assert a == b def test_bootstrap_from_archive(tmpdir, testpackage, capsys): """ Tests importing _astropy_helpers_test_ from a .tar.gz source archive shipped alongside the package that uses it. """ orig_repo = tmpdir.mkdir('orig') # Ensure ah_bootstrap is imported from the local directory import ah_bootstrap # noqa # Make a source distribution of the test package with silence(): run_setup(str(testpackage.join('setup.py')), ['sdist', '--dist-dir=dist', '--formats=gztar']) dist_dir = testpackage.join('dist') for dist_file in dist_dir.visit('*.tar.gz'): dist_file.copy(orig_repo) with orig_repo.as_cwd(): # Write a test setup.py that uses ah_bootstrap; it also ensures that # any previous reference to astropy_helpers is first wiped from # sys.modules args = 'path={0!r}'.format(os.path.basename(str(dist_file))) orig_repo.join('setup.py').write(TEST_SETUP_PY.format(args=args)) run_setup('setup.py', []) stdout, stderr = capsys.readouterr() path = stdout.splitlines()[-1].strip() # Installation from the .tar.gz should have resulted in a .egg # directory that the _astropy_helpers_test_ package was imported from eggs = _get_local_eggs() assert eggs egg = orig_repo.join(eggs[0]) assert os.path.isdir(str(egg)) a = os.path.normcase(path) b = os.path.normcase(str(egg.join('_astropy_helpers_test_', '__init__.py'))) assert a == b def test_download_if_needed(tmpdir, testpackage, capsys): """ Tests the case where astropy_helpers was not actually included in a package, or is otherwise missing, and we need to "download" it. This does not test actually downloading from the internet--this is normally done through setuptools' easy_install command which can also install from a source archive. From the point of view of ah_boostrap the two actions are equivalent, so we can just as easily simulate this by providing a setup.cfg giving the path to a source archive to "download" (as though it were a URL). """ source = tmpdir.mkdir('source') # Ensure ah_bootstrap is imported from the local directory import ah_bootstrap # noqa # Make a source distribution of the test package with silence(): run_setup(str(testpackage.join('setup.py')), ['sdist', '--dist-dir=dist', '--formats=gztar']) dist_dir = testpackage.join('dist') with source.as_cwd(): source.join('setup.py').write(TEST_SETUP_PY.format( args='download_if_needed=True')) source.join('setup.cfg').write(textwrap.dedent("""\ [easy_install] find_links = {find_links} """.format(find_links=str(dist_dir)))) run_setup('setup.py', []) stdout, stderr = capsys.readouterr() # Just take the last line--on Python 2.6 distutils logs warning # messages to stdout instead of stderr, causing them to be mixed up # with our expected output path = stdout.splitlines()[-1].strip() # easy_install should have worked by 'installing' astropy_helpers as a # .egg in the current directory eggs = _get_local_eggs() assert eggs egg = source.join(eggs[0]) assert os.path.isdir(str(egg)) a = os.path.normcase(path) b = os.path.normcase(str(egg.join('_astropy_helpers_test_', '__init__.py'))) assert a == b def test_upgrade(tmpdir, capsys): # Run the testpackage fixture manually, since we use it multiple times in # this test to make different versions of _astropy_helpers_test_ orig_dir = testpackage(tmpdir.mkdir('orig')) # Make a test package that uses _astropy_helpers_test_ source = tmpdir.mkdir('source') dist_dir = source.mkdir('dists') orig_dir.copy(source.join('_astropy_helpers_test_')) with source.as_cwd(): setup_py = TEST_SETUP_PY.format(args='auto_upgrade=True') source.join('setup.py').write(setup_py) # This will be used to later to fake downloading the upgrade package source.join('setup.cfg').write(textwrap.dedent("""\ [easy_install] find_links = {find_links} """.format(find_links=str(dist_dir)))) # Make additional "upgrade" versions of the _astropy_helpers_test_ # package--one of them is version 0.2 and the other is version 0.1.1. The # auto-upgrade should ignore version 0.2 but use version 0.1.1. upgrade_dir_1 = testpackage(tmpdir.mkdir('upgrade_1'), version='0.2') upgrade_dir_2 = testpackage(tmpdir.mkdir('upgrade_2'), version='0.1.1') dists = [] # For each upgrade package go ahead and build a source distribution of it # and copy that source distribution to a dist directory we'll use later to # simulate a 'download' for upgrade_dir in [upgrade_dir_1, upgrade_dir_2]: with silence(): run_setup(str(upgrade_dir.join('setup.py')), ['sdist', '--dist-dir=dist', '--formats=gztar']) dists.append(str(upgrade_dir.join('dist'))) for dist_file in upgrade_dir.visit('*.tar.gz'): dist_file.copy(source.join('dists')) # Monkey with the PackageIndex in ah_bootstrap so that it is initialized # with the test upgrade packages, and so that it does not actually go out # to the internet to look for anything import ah_bootstrap # noqa class FakePackageIndex(PackageIndex): def __init__(self, *args, **kwargs): PackageIndex.__init__(self, *args, **kwargs) self.to_scan = dists def find_packages(self, requirement): # no-op pass ah_bootstrap.PackageIndex = FakePackageIndex try: with source.as_cwd(): # Now run the source setup.py; this test is similar to # test_download_if_needed, but we explicitly check that the correct # *version* of _astropy_helpers_test_ was used run_setup('setup.py', []) stdout, stderr = capsys.readouterr() path = stdout.splitlines()[-1].strip() eggs = _get_local_eggs() assert eggs egg = source.join(eggs[0]) assert os.path.isdir(str(egg)) a = os.path.normcase(path) b = os.path.normcase(str(egg.join('_astropy_helpers_test_', '__init__.py'))) assert a == b assert 'astropy_helpers_test-0.1.1-' in str(egg) finally: ah_bootstrap.PackageIndex = PackageIndex def _get_local_eggs(path='.'): """ Helper utility used by some tests to get the list of egg archive files in a local directory. """ if SETUPTOOLS_VERSION[0] >= 7: eggs = glob.glob(os.path.join(path, '.eggs', '*.egg')) else: eggs = glob.glob('*.egg') return eggs sunpy-0.8.3/astropy_helpers/astropy_helpers/tests/test_git_helpers.py0000644000175000001440000001760513203277317025626 0ustar nabil00000000000000import glob import imp import os import pkgutil import re import sys import tarfile import pytest from warnings import catch_warnings from . import reset_setup_helpers, reset_distutils_log, fix_hide_setuptools # noqa from . import run_cmd, run_setup, cleanup_import from astropy_helpers.git_helpers import get_git_devstr PY3 = sys.version_info[0] == 3 if PY3: _text_type = str else: _text_type = unicode # noqa _DEV_VERSION_RE = re.compile(r'\d+\.\d+(?:\.\d+)?\.dev(\d+)') TEST_VERSION_SETUP_PY = """\ #!/usr/bin/env python from setuptools import setup NAME = 'apyhtest_eva' VERSION = {version!r} RELEASE = 'dev' not in VERSION from astropy_helpers.git_helpers import get_git_devstr from astropy_helpers.version_helpers import generate_version_py if not RELEASE: VERSION += get_git_devstr(False) generate_version_py(NAME, VERSION, RELEASE, False, uses_git=not RELEASE) setup(name=NAME, version=VERSION, packages=['apyhtest_eva']) """ TEST_VERSION_INIT = """\ try: from .version import version as __version__ from .version import githash as __githash__ except ImportError: __version__ = __githash__ = '' """ @pytest.fixture def version_test_package(tmpdir, request): def make_test_package(version='42.42.dev'): test_package = tmpdir.mkdir('test_package') test_package.join('setup.py').write( TEST_VERSION_SETUP_PY.format(version=version)) test_package.mkdir('apyhtest_eva').join('__init__.py').write(TEST_VERSION_INIT) with test_package.as_cwd(): run_cmd('git', ['init']) run_cmd('git', ['add', '--all']) run_cmd('git', ['commit', '-m', 'test package']) if '' in sys.path: sys.path.remove('') sys.path.insert(0, '') def finalize(): cleanup_import('apyhtest_eva') request.addfinalizer(finalize) return test_package return make_test_package def test_update_git_devstr(version_test_package, capsys): """Tests that the commit number in the package's version string updates after git commits even without re-running setup.py. """ # We have to call version_test_package to actually create the package test_pkg = version_test_package() with test_pkg.as_cwd(): run_setup('setup.py', ['--version']) stdout, stderr = capsys.readouterr() version = stdout.strip() m = _DEV_VERSION_RE.match(version) assert m, ( "Stdout did not match the version string pattern:" "\n\n{0}\n\nStderr:\n\n{1}".format(stdout, stderr)) revcount = int(m.group(1)) import apyhtest_eva assert apyhtest_eva.__version__ == version # Make a silly git commit with open('.test', 'w'): pass run_cmd('git', ['add', '.test']) run_cmd('git', ['commit', '-m', 'test']) import apyhtest_eva.version imp.reload(apyhtest_eva.version) # Previously this checked packagename.__version__, but in order for that to # be updated we also have to re-import _astropy_init which could be tricky. # Checking directly that the packagename.version module was updated is # sufficient: m = _DEV_VERSION_RE.match(apyhtest_eva.version.version) assert m assert int(m.group(1)) == revcount + 1 # This doesn't test astropy_helpers.get_helpers.update_git_devstr directly # since a copy of that function is made in packagename.version (so that it # can work without astropy_helpers installed). In order to get test # coverage on the actual astropy_helpers copy of that function just call it # directly and compare to the value in packagename from astropy_helpers.git_helpers import update_git_devstr newversion = update_git_devstr(version, path=str(test_pkg)) assert newversion == apyhtest_eva.version.version def test_version_update_in_other_repos(version_test_package, tmpdir): """ Regression test for https://github.com/astropy/astropy-helpers/issues/114 and for https://github.com/astropy/astropy-helpers/issues/107 """ test_pkg = version_test_package() with test_pkg.as_cwd(): run_setup('setup.py', ['build']) # Add the path to the test package to sys.path for now sys.path.insert(0, str(test_pkg)) try: import apyhtest_eva m = _DEV_VERSION_RE.match(apyhtest_eva.__version__) assert m correct_revcount = int(m.group(1)) with tmpdir.as_cwd(): testrepo = tmpdir.mkdir('testrepo') testrepo.chdir() # Create an empty git repo run_cmd('git', ['init']) import apyhtest_eva.version imp.reload(apyhtest_eva.version) m = _DEV_VERSION_RE.match(apyhtest_eva.version.version) assert m assert int(m.group(1)) == correct_revcount correct_revcount = int(m.group(1)) # Add several commits--more than the revcount for the apyhtest_eva package for idx in range(correct_revcount + 5): test_filename = '.test' + str(idx) testrepo.ensure(test_filename) run_cmd('git', ['add', test_filename]) run_cmd('git', ['commit', '-m', 'A message']) import apyhtest_eva.version imp.reload(apyhtest_eva.version) m = _DEV_VERSION_RE.match(apyhtest_eva.version.version) assert m assert int(m.group(1)) == correct_revcount correct_revcount = int(m.group(1)) finally: sys.path.remove(str(test_pkg)) @pytest.mark.parametrize('version', ['1.0.dev', '1.0']) def test_installed_git_version(version_test_package, version, tmpdir, capsys): """ Test for https://github.com/astropy/astropy-helpers/issues/87 Ensures that packages installed with astropy_helpers have a correct copy of the git hash of the installed commit. """ # To test this, it should suffice to build a source dist, unpack it # somewhere outside the git repository, and then do a build and import # from the build directory--no need to "install" as such test_pkg = version_test_package(version) with test_pkg.as_cwd(): run_setup('setup.py', ['build']) try: import apyhtest_eva githash = apyhtest_eva.__githash__ assert githash and isinstance(githash, _text_type) # Ensure that it does in fact look like a git hash and not some # other arbitrary string assert re.match(r'[0-9a-f]{40}', githash) finally: cleanup_import('apyhtest_eva') run_setup('setup.py', ['sdist', '--dist-dir=dist', '--formats=gztar']) tgzs = glob.glob(os.path.join('dist', '*.tar.gz')) assert len(tgzs) == 1 tgz = test_pkg.join(tgzs[0]) build_dir = tmpdir.mkdir('build_dir') tf = tarfile.open(str(tgz), mode='r:gz') tf.extractall(str(build_dir)) with build_dir.as_cwd(): pkg_dir = glob.glob('apyhtest_eva-*')[0] os.chdir(pkg_dir) with catch_warnings(record=True) as w: run_setup('setup.py', ['build']) try: import apyhtest_eva loader = pkgutil.get_loader('apyhtest_eva') # Ensure we are importing the 'packagename' that was just unpacked # into the build_dir assert loader.get_filename().startswith(str(build_dir)) assert apyhtest_eva.__githash__ == githash finally: cleanup_import('apyhtest_eva') def test_get_git_devstr(tmpdir): dirpath = str(tmpdir) warn_msg = "No git repository present at" # Verify as much as possible, but avoid dealing with paths on windows if not sys.platform.startswith('win'): warn_msg += " '{}'".format(dirpath) with catch_warnings(record=True) as w: devstr = get_git_devstr(path=dirpath) assert devstr == '0' assert len(w) == 1 assert str(w[0].message).startswith(warn_msg) sunpy-0.8.3/astropy_helpers/astropy_helpers/tests/test_openmp_helpers.py0000644000175000001440000000232013203277317026325 0ustar nabil00000000000000import os import sys from copy import deepcopy from distutils.core import Extension from ..openmp_helpers import add_openmp_flags_if_available from ..setup_helpers import _module_state, register_commands IS_TRAVIS_LINUX = os.environ.get('TRAVIS_OS_NAME', None) == 'linux' IS_APPVEYOR = os.environ.get('APPVEYOR', None) == 'True' PY3_LT_35 = sys.version_info[0] == 3 and sys.version_info[1] < 5 _state = None def setup_function(function): global state state = deepcopy(_module_state) def teardown_function(function): _module_state.clear() _module_state.update(state) def test_add_openmp_flags_if_available(): register_commands('openmp_testing', '0.0', False) using_openmp = add_openmp_flags_if_available(Extension('test', [])) # Make sure that on Travis (Linux) and AppVeyor OpenMP does get used (for # MacOS X usually it will not work but this will depend on the compiler). # Having this is useful because we'll find out if OpenMP no longer works # for any reason on platforms on which it does work at the time of writing. # OpenMP doesn't work on Python 3.x where x<5 on AppVeyor though. if IS_TRAVIS_LINUX or (IS_APPVEYOR and not PY3_LT_35): assert using_openmp sunpy-0.8.3/astropy_helpers/astropy_helpers/tests/test_setup_helpers.py0000644000175000001440000004543713203277317026207 0ustar nabil00000000000000import os import sys import stat import shutil import warnings import contextlib import pytest from textwrap import dedent from setuptools import Distribution from ..setup_helpers import get_package_info, register_commands from ..commands import build_ext from ..utils import AstropyDeprecationWarning from . import reset_setup_helpers, reset_distutils_log, fix_hide_setuptools # noqa from . import run_setup, cleanup_import # Determine whether we're in a PY2 environment without using six USING_PY2 = sys.version_info < (3,0,0) def _extension_test_package(tmpdir, request, extension_type='c'): """Creates a simple test package with an extension module.""" test_pkg = tmpdir.mkdir('test_pkg') test_pkg.mkdir('apyhtest_eva').ensure('__init__.py') # TODO: It might be later worth making this particular test package into a # reusable fixture for other build_ext tests if extension_type in ('c', 'both'): # A minimal C extension for testing test_pkg.join('apyhtest_eva', 'unit01.c').write(dedent("""\ #include #ifndef PY3K #if PY_MAJOR_VERSION >= 3 #define PY3K 1 #else #define PY3K 0 #endif #endif #if PY3K static struct PyModuleDef moduledef = { PyModuleDef_HEAD_INIT, "unit01", NULL, -1, NULL }; PyMODINIT_FUNC PyInit_unit01(void) { return PyModule_Create(&moduledef); } #else PyMODINIT_FUNC initunit01(void) { Py_InitModule3("unit01", NULL, NULL); } #endif """)) if extension_type in ('pyx', 'both'): # A minimal Cython extension for testing test_pkg.join('apyhtest_eva', 'unit02.pyx').write(dedent("""\ print("Hello cruel angel.") """)) if extension_type == 'c': extensions = ['unit01.c'] elif extension_type == 'pyx': extensions = ['unit02.pyx'] elif extension_type == 'both': extensions = ['unit01.c', 'unit02.pyx'] extensions_list = [ "Extension('apyhtest_eva.{0}', [join('apyhtest_eva', '{1}')])".format( os.path.splitext(extension)[0], extension) for extension in extensions] test_pkg.join('apyhtest_eva', 'setup_package.py').write(dedent("""\ from setuptools import Extension from os.path import join def get_extensions(): return [{0}] """.format(', '.join(extensions_list)))) test_pkg.join('setup.py').write(dedent("""\ from os.path import join from setuptools import setup from astropy_helpers.setup_helpers import register_commands from astropy_helpers.setup_helpers import get_package_info from astropy_helpers.version_helpers import generate_version_py NAME = 'apyhtest_eva' VERSION = '0.1' RELEASE = True cmdclassd = register_commands(NAME, VERSION, RELEASE) generate_version_py(NAME, VERSION, RELEASE, False, False) package_info = get_package_info() setup( name=NAME, version=VERSION, cmdclass=cmdclassd, **package_info ) """)) if '' in sys.path: sys.path.remove('') sys.path.insert(0, '') def finalize(): cleanup_import('apyhtest_eva') request.addfinalizer(finalize) return test_pkg @pytest.fixture def extension_test_package(tmpdir, request): return _extension_test_package(tmpdir, request, extension_type='both') @pytest.fixture def c_extension_test_package(tmpdir, request): return _extension_test_package(tmpdir, request, extension_type='c') @pytest.fixture def pyx_extension_test_package(tmpdir, request): return _extension_test_package(tmpdir, request, extension_type='pyx') def test_cython_autoextensions(tmpdir): """ Regression test for https://github.com/astropy/astropy-helpers/pull/19 Ensures that Cython extensions in sub-packages are discovered and built only once. """ # Make a simple test package test_pkg = tmpdir.mkdir('test_pkg') test_pkg.mkdir('yoda').mkdir('luke') test_pkg.ensure('yoda', '__init__.py') test_pkg.ensure('yoda', 'luke', '__init__.py') test_pkg.join('yoda', 'luke', 'dagobah.pyx').write( """def testfunc(): pass""") # Required, currently, for get_package_info to work register_commands('yoda', '0.0', False, srcdir=str(test_pkg)) package_info = get_package_info(str(test_pkg)) assert len(package_info['ext_modules']) == 1 assert package_info['ext_modules'][0].name == 'yoda.luke.dagobah' def test_compiler_module(c_extension_test_package): """ Test ensuring that the compiler module is built and installed for packages that have extension modules. """ test_pkg = c_extension_test_package install_temp = test_pkg.mkdir('install_temp') with test_pkg.as_cwd(): # This is one of the simplest ways to install just a package into a # test directory with warnings.catch_warnings(record=True) as w: run_setup('setup.py', ['install', '--single-version-externally-managed', '--install-lib={0}'.format(install_temp), '--record={0}'.format(install_temp.join('record.txt'))]) # Skip this portion of the test on windows systems with Py 2.7 since # it is known to produce additional warnings. if not (USING_PY2 or sys.platform.startswith('win')): # Warning expected from get_git_devstr, called by generate_version_py assert len(w) == 1 assert str(w[0].message).startswith("No git repository present at") with install_temp.as_cwd(): import apyhtest_eva # Make sure we imported the apyhtest_eva package from the correct place dirname = os.path.abspath(os.path.dirname(apyhtest_eva.__file__)) assert dirname == str(install_temp.join('apyhtest_eva')) import apyhtest_eva._compiler import apyhtest_eva.version assert apyhtest_eva.version.compiler == apyhtest_eva._compiler.compiler assert apyhtest_eva.version.compiler != 'unknown' def test_no_cython_buildext(c_extension_test_package, monkeypatch): """ Regression test for https://github.com/astropy/astropy-helpers/pull/35 This tests the custom build_ext command installed by astropy_helpers when used with a project that has no Cython extensions (but does have one or more normal C extensions). """ test_pkg = c_extension_test_package # In order for this test to test the correct code path we need to fool # build_ext into thinking we don't have Cython installed monkeypatch.setattr(build_ext, 'should_build_with_cython', lambda *args: False) with test_pkg.as_cwd(): with warnings.catch_warnings(record=True) as w: run_setup('setup.py', ['build_ext', '--inplace']) # Warning expected from get_git_devstr, called by generate_version_py if not USING_PY2: assert len(w) == 1 assert str(w[0].message).startswith("No git repository present at") sys.path.insert(0, str(test_pkg)) try: import apyhtest_eva.unit01 dirname = os.path.abspath(os.path.dirname(apyhtest_eva.unit01.__file__)) assert dirname == str(test_pkg.join('apyhtest_eva')) finally: sys.path.remove(str(test_pkg)) def test_missing_cython_c_files(pyx_extension_test_package, monkeypatch): """ Regression test for https://github.com/astropy/astropy-helpers/pull/181 Test failure mode when building a package that has Cython modules, but where Cython is not installed and the generated C files are missing. """ test_pkg = pyx_extension_test_package # In order for this test to test the correct code path we need to fool # build_ext into thinking we don't have Cython installed monkeypatch.setattr(build_ext, 'should_build_with_cython', lambda *args: False) with test_pkg.as_cwd(): with pytest.raises(SystemExit) as exc_info: with warnings.catch_warnings(record=True) as w: run_setup('setup.py', ['build_ext', '--inplace']) # Warning expected from get_git_devstr, called by generate_version_py if not USING_PY2: assert len(w) == 1 assert str(w[0].message).startswith( "No git repository present at") msg = ('Could not find C/C++ file ' '{0}.(c/cpp)'.format('apyhtest_eva/unit02'.replace('/', os.sep))) assert msg in str(exc_info.value) @pytest.mark.parametrize('mode', ['cli', 'cli-w', 'direct', 'deprecated', 'cli-l', 'cli-error']) def test_build_docs(tmpdir, mode): """ Test for build_docs """ import astropy_helpers ah_path = os.path.dirname(astropy_helpers.__file__) test_pkg = tmpdir.mkdir('test_pkg') test_pkg.mkdir('mypackage') test_pkg.join('mypackage').join('__init__.py').write(dedent("""\ def test_function(): pass class A(): pass class B(A): pass """)) docs = test_pkg.mkdir('docs') autosummary = docs.mkdir('_templates').mkdir('autosummary') autosummary.join('base.rst').write('{% extends "autosummary_core/base.rst" %}') autosummary.join('class.rst').write('{% extends "autosummary_core/class.rst" %}') autosummary.join('module.rst').write('{% extends "autosummary_core/module.rst" %}') docs_dir = test_pkg.join('docs') docs_dir.join('conf.py').write(dedent("""\ import sys sys.path.append("../") import warnings with warnings.catch_warnings(): # ignore matplotlib warning warnings.simplefilter("ignore") from astropy_helpers.sphinx.conf import * exclude_patterns.append('_templates') """)) if mode == 'cli-error': docs_dir.join('conf.py').write(dedent(""" raise ValueError("TestException") """)) docs_dir.join('index.rst').write(dedent("""\ .. automodapi:: mypackage :no-inheritance-diagram: """)) test_pkg.join('setup.py').write(dedent("""\ from os.path import join from setuptools import setup, Extension from astropy_helpers.setup_helpers import register_commands, get_package_info NAME = 'mypackage' VERSION = 0.1 RELEASE = True cmdclassd = register_commands(NAME, VERSION, RELEASE) setup( name=NAME, version=VERSION, cmdclass=cmdclassd, **get_package_info() ) """)) with test_pkg.as_cwd(): shutil.copytree(ah_path, 'astropy_helpers') if mode == 'cli': run_setup('setup.py', ['build_docs']) elif mode == 'cli-w': run_setup('setup.py', ['build_docs', '-w']) elif mode == 'cli-l': run_setup('setup.py', ['build_docs', '-l']) elif mode == 'deprecated': with pytest.warns(AstropyDeprecationWarning): run_setup('setup.py', ['build_sphinx']) elif mode == 'direct': # to check coverage with docs_dir.as_cwd(): from sphinx import main try: main(['-b html', '-d _build/doctrees', '.', '_build/html']) except SystemExit as exc: assert exc.code == 0 def test_command_hooks(tmpdir, capsys): """A basic test for pre- and post-command hooks.""" test_pkg = tmpdir.mkdir('test_pkg') test_pkg.mkdir('_welltall_') test_pkg.join('_welltall_', '__init__.py').ensure() # Create a setup_package module with a couple of command hooks in it test_pkg.join('_welltall_', 'setup_package.py').write(dedent("""\ def pre_build_hook(cmd_obj): print('Hello build!') def post_build_hook(cmd_obj): print('Goodbye build!') """)) # A simple setup.py for the test package--running register_commands should # discover and enable the command hooks test_pkg.join('setup.py').write(dedent("""\ from os.path import join from setuptools import setup, Extension from astropy_helpers.setup_helpers import register_commands, get_package_info NAME = '_welltall_' VERSION = 0.1 RELEASE = True cmdclassd = register_commands(NAME, VERSION, RELEASE) setup( name=NAME, version=VERSION, cmdclass=cmdclassd ) """)) with test_pkg.as_cwd(): try: run_setup('setup.py', ['build']) finally: cleanup_import('_welltall_') stdout, stderr = capsys.readouterr() want = dedent("""\ running build running pre_hook from _welltall_.setup_package for build command Hello build! running post_hook from _welltall_.setup_package for build command Goodbye build! """).strip() assert want in stdout def test_adjust_compiler(monkeypatch, tmpdir): """ Regression test for https://github.com/astropy/astropy-helpers/issues/182 """ from distutils import ccompiler, sysconfig class MockLog(object): def __init__(self): self.messages = [] def warn(self, message): self.messages.append(message) good = tmpdir.join('gcc-good') good.write(dedent("""\ #!{python} import sys print('gcc 4.10') sys.exit(0) """.format(python=sys.executable))) good.chmod(stat.S_IRUSR | stat.S_IEXEC) # A "compiler" that reports itself to be a version of Apple's llvm-gcc # which is broken bad = tmpdir.join('gcc-bad') bad.write(dedent("""\ #!{python} import sys print('i686-apple-darwin-llvm-gcc-4.2') sys.exit(0) """.format(python=sys.executable))) bad.chmod(stat.S_IRUSR | stat.S_IEXEC) # A "compiler" that doesn't even know its identity (this reproduces the bug # in #182) ugly = tmpdir.join('gcc-ugly') ugly.write(dedent("""\ #!{python} import sys sys.exit(1) """.format(python=sys.executable))) ugly.chmod(stat.S_IRUSR | stat.S_IEXEC) # Scripts with shebang lines don't work implicitly in Windows when passed # to subprocess.Popen, so... if 'win' in sys.platform: good = ' '.join((sys.executable, str(good))) bad = ' '.join((sys.executable, str(bad))) ugly = ' '.join((sys.executable, str(ugly))) dist = Distribution({}) cmd_cls = build_ext.generate_build_ext_command('astropy', False) cmd = cmd_cls(dist) adjust_compiler = cmd._adjust_compiler @contextlib.contextmanager def test_setup(): log = MockLog() monkeypatch.setattr(build_ext, 'log', log) yield log monkeypatch.undo() @contextlib.contextmanager def compiler_setter_with_environ(compiler): monkeypatch.setenv('CC', compiler) with test_setup() as log: yield log monkeypatch.undo() @contextlib.contextmanager def compiler_setter_with_sysconfig(compiler): monkeypatch.setattr(ccompiler, 'get_default_compiler', lambda: 'unix') monkeypatch.setattr(sysconfig, 'get_config_var', lambda v: compiler) old_cc = os.environ.get('CC') if old_cc is not None: del os.environ['CC'] with test_setup() as log: yield log monkeypatch.undo() monkeypatch.undo() monkeypatch.undo() if old_cc is not None: os.environ['CC'] = old_cc compiler_setters = (compiler_setter_with_environ, compiler_setter_with_sysconfig) for compiler_setter in compiler_setters: with compiler_setter(str(good)): # Should have no side-effects adjust_compiler() with compiler_setter(str(ugly)): # Should just pass without complaint, since we can't determine # anything about the compiler anyways adjust_compiler() # In the following tests we check the log messages just to ensure that the # failures occur on the correct code paths for these cases with compiler_setter_with_environ(str(bad)) as log: with pytest.raises(SystemExit): adjust_compiler() assert len(log.messages) == 1 assert 'will fail to compile' in log.messages[0] with compiler_setter_with_sysconfig(str(bad)): adjust_compiler() assert 'CC' in os.environ and os.environ['CC'] == 'clang' with compiler_setter_with_environ('bogus') as log: with pytest.raises(SystemExit): # Missing compiler? adjust_compiler() assert len(log.messages) == 1 assert 'cannot be found or executed' in log.messages[0] with compiler_setter_with_sysconfig('bogus') as log: with pytest.raises(SystemExit): # Missing compiler? adjust_compiler() assert len(log.messages) == 1 assert 'The C compiler used to compile Python' in log.messages[0] def test_invalid_package_exclusion(tmpdir, capsys): module_name = 'foobar' setup_header = dedent("""\ from os.path import join from setuptools import setup, Extension from astropy_helpers.setup_helpers import register_commands, \\ get_package_info, add_exclude_packages NAME = {module_name!r} VERSION = 0.1 RELEASE = True """.format(module_name=module_name)) setup_footer = dedent("""\ setup( name=NAME, version=VERSION, cmdclass=cmdclassd, **package_info ) """) # Test error when using add_package_excludes out of order error_commands = dedent("""\ cmdclassd = register_commands(NAME, VERSION, RELEASE) package_info = get_package_info() add_exclude_packages(['tests*']) """) error_pkg = tmpdir.mkdir('error_pkg') error_pkg.join('setup.py').write( setup_header + error_commands + setup_footer) with error_pkg.as_cwd(): try: with pytest.raises(RuntimeError): run_setup('setup.py', ['build']) finally: cleanup_import(module_name) # Test warning when using deprecated exclude parameter warn_commands = dedent("""\ cmdclassd = register_commands(NAME, VERSION, RELEASE) package_info = get_package_info(exclude=['test*']) """) warn_pkg = tmpdir.mkdir('warn_pkg') warn_pkg.join('setup.py').write( setup_header + warn_commands + setup_footer) with warn_pkg.as_cwd(): try: with pytest.warns(AstropyDeprecationWarning): run_setup('setup.py', ['build']) finally: cleanup_import(module_name) sunpy-0.8.3/astropy_helpers/astropy_helpers/tests/test_utils.py0000644000175000001440000000135713203277317024456 0ustar nabil00000000000000import os from ..utils import find_data_files def test_find_data_files(tmpdir): data = tmpdir.mkdir('data') sub1 = data.mkdir('sub1') sub2 = data.mkdir('sub2') sub3 = sub1.mkdir('sub3') for directory in (data, sub1, sub2, sub3): filename = directory.join('data.dat').strpath with open(filename, 'w') as f: f.write('test') filenames = find_data_files(data.strpath, '**/*.dat') filenames = sorted(os.path.relpath(x, data.strpath) for x in filenames) assert filenames[0] == os.path.join('data.dat') assert filenames[1] == os.path.join('sub1', 'data.dat') assert filenames[2] == os.path.join('sub1', 'sub3', 'data.dat') assert filenames[3] == os.path.join('sub2', 'data.dat') sunpy-0.8.3/astropy_helpers/astropy_helpers/__init__.py0000644000175000001440000000345413203277317022654 0ustar nabil00000000000000try: from .version import version as __version__ from .version import githash as __githash__ except ImportError: __version__ = '' __githash__ = '' # If we've made it as far as importing astropy_helpers, we don't need # ah_bootstrap in sys.modules anymore. Getting rid of it is actually necessary # if the package we're installing has a setup_requires of another package that # uses astropy_helpers (and possibly a different version at that) # See https://github.com/astropy/astropy/issues/3541 import sys if 'ah_bootstrap' in sys.modules: del sys.modules['ah_bootstrap'] # Note, this is repeated from ah_bootstrap.py, but is here too in case this # astropy-helpers was upgraded to from an older version that did not have this # check in its ah_bootstrap. # matplotlib can cause problems if it is imported from within a call of # run_setup(), because in some circumstances it will try to write to the user's # home directory, resulting in a SandboxViolation. See # https://github.com/matplotlib/matplotlib/pull/4165 # Making sure matplotlib, if it is available, is imported early in the setup # process can mitigate this (note importing matplotlib.pyplot has the same # issue) try: import matplotlib matplotlib.use('Agg') import matplotlib.pyplot except: # Ignore if this fails for *any* reason* pass import os # Ensure that all module-level code in astropy or other packages know that # we're in setup mode: if ('__main__' in sys.modules and hasattr(sys.modules['__main__'], '__file__')): filename = os.path.basename(sys.modules['__main__'].__file__) if filename.rstrip('co') == 'setup.py': if sys.version_info[0] >= 3: import builtins else: import __builtin__ as builtins builtins._ASTROPY_SETUP_ = True del filename sunpy-0.8.3/astropy_helpers/astropy_helpers/distutils_helpers.py0000644000175000001440000001736213203277317024666 0ustar nabil00000000000000""" This module contains various utilities for introspecting the distutils module and the setup process. Some of these utilities require the `astropy_helpers.setup_helpers.register_commands` function to be called first, as it will affect introspection of setuptools command-line arguments. Other utilities in this module do not have that restriction. """ import os import sys from distutils import ccompiler, log from distutils.dist import Distribution from distutils.errors import DistutilsError from .utils import silence # This function, and any functions that call it, require the setup in # `astropy_helpers.setup_helpers.register_commands` to be run first. def get_dummy_distribution(): """ Returns a distutils Distribution object used to instrument the setup environment before calling the actual setup() function. """ from .setup_helpers import _module_state if _module_state['registered_commands'] is None: raise RuntimeError( 'astropy_helpers.setup_helpers.register_commands() must be ' 'called before using ' 'astropy_helpers.setup_helpers.get_dummy_distribution()') # Pre-parse the Distutils command-line options and config files to if # the option is set. dist = Distribution({'script_name': os.path.basename(sys.argv[0]), 'script_args': sys.argv[1:]}) dist.cmdclass.update(_module_state['registered_commands']) with silence(): try: dist.parse_config_files() dist.parse_command_line() except (DistutilsError, AttributeError, SystemExit): # Let distutils handle DistutilsErrors itself AttributeErrors can # get raise for ./setup.py --help SystemExit can be raised if a # display option was used, for example pass return dist def get_distutils_option(option, commands): """ Returns the value of the given distutils option. Parameters ---------- option : str The name of the option commands : list of str The list of commands on which this option is available Returns ------- val : str or None the value of the given distutils option. If the option is not set, returns None. """ dist = get_dummy_distribution() for cmd in commands: cmd_opts = dist.command_options.get(cmd) if cmd_opts is not None and option in cmd_opts: return cmd_opts[option][1] else: return None def get_distutils_build_option(option): """ Returns the value of the given distutils build option. Parameters ---------- option : str The name of the option Returns ------- val : str or None The value of the given distutils build option. If the option is not set, returns None. """ return get_distutils_option(option, ['build', 'build_ext', 'build_clib']) def get_distutils_install_option(option): """ Returns the value of the given distutils install option. Parameters ---------- option : str The name of the option Returns ------- val : str or None The value of the given distutils build option. If the option is not set, returns None. """ return get_distutils_option(option, ['install']) def get_distutils_build_or_install_option(option): """ Returns the value of the given distutils build or install option. Parameters ---------- option : str The name of the option Returns ------- val : str or None The value of the given distutils build or install option. If the option is not set, returns None. """ return get_distutils_option(option, ['build', 'build_ext', 'build_clib', 'install']) def get_compiler_option(): """ Determines the compiler that will be used to build extension modules. Returns ------- compiler : str The compiler option specified for the build, build_ext, or build_clib command; or the default compiler for the platform if none was specified. """ compiler = get_distutils_build_option('compiler') if compiler is None: return ccompiler.get_default_compiler() return compiler def add_command_option(command, name, doc, is_bool=False): """ Add a custom option to a setup command. Issues a warning if the option already exists on that command. Parameters ---------- command : str The name of the command as given on the command line name : str The name of the build option doc : str A short description of the option, for the `--help` message is_bool : bool, optional When `True`, the option is a boolean option and doesn't require an associated value. """ dist = get_dummy_distribution() cmdcls = dist.get_command_class(command) if (hasattr(cmdcls, '_astropy_helpers_options') and name in cmdcls._astropy_helpers_options): return attr = name.replace('-', '_') if hasattr(cmdcls, attr): raise RuntimeError( '{0!r} already has a {1!r} class attribute, barring {2!r} from ' 'being usable as a custom option name.'.format(cmdcls, attr, name)) for idx, cmd in enumerate(cmdcls.user_options): if cmd[0] == name: log.warn('Overriding existing {0!r} option ' '{1!r}'.format(command, name)) del cmdcls.user_options[idx] if name in cmdcls.boolean_options: cmdcls.boolean_options.remove(name) break cmdcls.user_options.append((name, None, doc)) if is_bool: cmdcls.boolean_options.append(name) # Distutils' command parsing requires that a command object have an # attribute with the same name as the option (with '-' replaced with '_') # in order for that option to be recognized as valid setattr(cmdcls, attr, None) # This caches the options added through add_command_option so that if it is # run multiple times in the same interpreter repeated adds are ignored # (this way we can still raise a RuntimeError if a custom option overrides # a built-in option) if not hasattr(cmdcls, '_astropy_helpers_options'): cmdcls._astropy_helpers_options = set([name]) else: cmdcls._astropy_helpers_options.add(name) def get_distutils_display_options(): """ Returns a set of all the distutils display options in their long and short forms. These are the setup.py arguments such as --name or --version which print the project's metadata and then exit. Returns ------- opts : set The long and short form display option arguments, including the - or -- """ short_display_opts = set('-' + o[1] for o in Distribution.display_options if o[1]) long_display_opts = set('--' + o[0] for o in Distribution.display_options) # Include -h and --help which are not explicitly listed in # Distribution.display_options (as they are handled by optparse) short_display_opts.add('-h') long_display_opts.add('--help') # This isn't the greatest approach to hardcode these commands. # However, there doesn't seem to be a good way to determine # whether build *will be* run as part of the command at this # phase. display_commands = set([ 'clean', 'register', 'setopt', 'saveopts', 'egg_info', 'alias']) return short_display_opts.union(long_display_opts.union(display_commands)) def is_distutils_display_option(): """ Returns True if sys.argv contains any of the distutils display options such as --version or --name. """ display_options = get_distutils_display_options() return bool(set(sys.argv[1:]).intersection(display_options)) sunpy-0.8.3/astropy_helpers/astropy_helpers/git_helpers.py0000644000175000001440000001450013212200427023400 0ustar nabil00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ Utilities for retrieving revision information from a project's git repository. """ # Do not remove the following comment; it is used by # astropy_helpers.version_helpers to determine the beginning of the code in # this module # BEGIN import locale import os import subprocess import warnings def _decode_stdio(stream): try: stdio_encoding = locale.getdefaultlocale()[1] or 'utf-8' except ValueError: stdio_encoding = 'utf-8' try: text = stream.decode(stdio_encoding) except UnicodeDecodeError: # Final fallback text = stream.decode('latin1') return text def update_git_devstr(version, path=None): """ Updates the git revision string if and only if the path is being imported directly from a git working copy. This ensures that the revision number in the version string is accurate. """ try: # Quick way to determine if we're in git or not - returns '' if not devstr = get_git_devstr(sha=True, show_warning=False, path=path) except OSError: return version if not devstr: # Probably not in git so just pass silently return version if 'dev' in version: # update to the current git revision version_base = version.split('.dev', 1)[0] devstr = get_git_devstr(sha=False, show_warning=False, path=path) return version_base + '.dev' + devstr else: # otherwise it's already the true/release version return version def get_git_devstr(sha=False, show_warning=True, path=None): """ Determines the number of revisions in this repository. Parameters ---------- sha : bool If True, the full SHA1 hash will be returned. Otherwise, the total count of commits in the repository will be used as a "revision number". show_warning : bool If True, issue a warning if git returns an error code, otherwise errors pass silently. path : str or None If a string, specifies the directory to look in to find the git repository. If `None`, the current working directory is used, and must be the root of the git repository. If given a filename it uses the directory containing that file. Returns ------- devversion : str Either a string with the revision number (if `sha` is False), the SHA1 hash of the current commit (if `sha` is True), or an empty string if git version info could not be identified. """ if path is None: path = os.getcwd() if not os.path.isdir(path): path = os.path.abspath(os.path.dirname(path)) if sha: # Faster for getting just the hash of HEAD cmd = ['rev-parse', 'HEAD'] else: cmd = ['rev-list', '--count', 'HEAD'] def run_git(cmd): try: p = subprocess.Popen(['git'] + cmd, cwd=path, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) stdout, stderr = p.communicate() except OSError as e: if show_warning: warnings.warn('Error running git: ' + str(e)) return (None, b'', b'') if p.returncode == 128: if show_warning: warnings.warn('No git repository present at {0!r}! Using ' 'default dev version.'.format(path)) return (p.returncode, b'', b'') if p.returncode == 129: if show_warning: warnings.warn('Your git looks old (does it support {0}?); ' 'consider upgrading to v1.7.2 or ' 'later.'.format(cmd[0])) return (p.returncode, stdout, stderr) elif p.returncode != 0: if show_warning: warnings.warn('Git failed while determining revision ' 'count: {0}'.format(_decode_stdio(stderr))) return (p.returncode, stdout, stderr) return p.returncode, stdout, stderr returncode, stdout, stderr = run_git(cmd) if not sha and returncode == 128: # git returns 128 if the command is not run from within a git # repository tree. In this case, a warning is produced above but we # return the default dev version of '0'. return '0' elif not sha and returncode == 129: # git returns 129 if a command option failed to parse; in # particular this could happen in git versions older than 1.7.2 # where the --count option is not supported # Also use --abbrev-commit and --abbrev=0 to display the minimum # number of characters needed per-commit (rather than the full hash) cmd = ['rev-list', '--abbrev-commit', '--abbrev=0', 'HEAD'] returncode, stdout, stderr = run_git(cmd) # Fall back on the old method of getting all revisions and counting # the lines if returncode == 0: return str(stdout.count(b'\n')) else: return '' elif sha: return _decode_stdio(stdout)[:40] else: return _decode_stdio(stdout).strip() # This function is tested but it is only ever executed within a subprocess when # creating a fake package, so it doesn't get picked up by coverage metrics. def _get_repo_path(pathname, levels=None): # pragma: no cover """ Given a file or directory name, determine the root of the git repository this path is under. If given, this won't look any higher than ``levels`` (that is, if ``levels=0`` then the given path must be the root of the git repository and is returned if so. Returns `None` if the given path could not be determined to belong to a git repo. """ if os.path.isfile(pathname): current_dir = os.path.abspath(os.path.dirname(pathname)) elif os.path.isdir(pathname): current_dir = os.path.abspath(pathname) else: return None current_level = 0 while levels is None or current_level <= levels: if os.path.exists(os.path.join(current_dir, '.git')): return current_dir current_level += 1 if current_dir == os.path.dirname(current_dir): break current_dir = os.path.dirname(current_dir) return None sunpy-0.8.3/astropy_helpers/astropy_helpers/openmp_helpers.py0000644000175000001440000000605313203277317024133 0ustar nabil00000000000000# This module defines functions that can be used to check whether OpenMP is # available and if so what flags to use. To use this, import the # add_openmp_flags_if_available function in a setup_package.py file where you # are defining your extensions: # # from astropy_helpers.openmp_helpers import add_openmp_flags_if_available # # then call it with a single extension as the only argument: # # add_openmp_flags_if_available(extension) # # this will add the OpenMP flags if available. from __future__ import absolute_import, print_function import os import sys import glob import tempfile import subprocess from distutils import log from distutils.ccompiler import new_compiler from distutils.sysconfig import customize_compiler from distutils.errors import CompileError, LinkError from .setup_helpers import get_compiler_option __all__ = ['add_openmp_flags_if_available'] CCODE = """ #include #include int main(void) { #pragma omp parallel printf("nthreads=%d\\n", omp_get_num_threads()); return 0; } """ def add_openmp_flags_if_available(extension): """ Add OpenMP compilation flags, if available (if not a warning will be printed to the console and no flags will be added) Returns `True` if the flags were added, `False` otherwise. """ ccompiler = new_compiler() customize_compiler(ccompiler) tmp_dir = tempfile.mkdtemp() start_dir = os.path.abspath('.') if get_compiler_option() == 'msvc': compile_flag = '-openmp' link_flag = '' else: compile_flag = '-fopenmp' link_flag = '-fopenmp' try: os.chdir(tmp_dir) with open('test_openmp.c', 'w') as f: f.write(CCODE) os.mkdir('objects') # Compile, link, and run test program ccompiler.compile(['test_openmp.c'], output_dir='objects', extra_postargs=[compile_flag]) ccompiler.link_executable(glob.glob(os.path.join('objects', '*')), 'test_openmp', extra_postargs=[link_flag]) output = subprocess.check_output('./test_openmp').decode(sys.stdout.encoding or 'utf-8').splitlines() if 'nthreads=' in output[0]: nthreads = int(output[0].strip().split('=')[1]) if len(output) == nthreads: using_openmp = True else: log.warn("Unexpected number of lines from output of test OpenMP " "program (output was {0})".format(output)) using_openmp = False else: log.warn("Unexpected output from test OpenMP " "program (output was {0})".format(output)) using_openmp = False except (CompileError, LinkError): using_openmp = False finally: os.chdir(start_dir) if using_openmp: log.info("Compiling Cython extension with OpenMP support") extension.extra_compile_args.append(compile_flag) extension.extra_link_args.append(link_flag) else: log.warn("Cannot compile Cython extension with OpenMP, reverting to non-parallel code") return using_openmp sunpy-0.8.3/astropy_helpers/astropy_helpers/setup_helpers.py0000644000175000001440000006635513212200427023774 0ustar nabil00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ This module contains a number of utilities for use during setup/build/packaging that are useful to astropy as a whole. """ from __future__ import absolute_import, print_function import collections import os import re import subprocess import sys import traceback import warnings from distutils import log from distutils.dist import Distribution from distutils.errors import DistutilsOptionError, DistutilsModuleError from distutils.core import Extension from distutils.core import Command from distutils.command.sdist import sdist as DistutilsSdist from setuptools import find_packages as _find_packages from .distutils_helpers import (add_command_option, get_compiler_option, get_dummy_distribution, get_distutils_build_option, get_distutils_build_or_install_option) from .version_helpers import get_pkg_version_module from .utils import (walk_skip_hidden, import_file, extends_doc, resolve_name, AstropyDeprecationWarning) from .commands.build_ext import generate_build_ext_command from .commands.build_py import AstropyBuildPy from .commands.install import AstropyInstall from .commands.install_lib import AstropyInstallLib from .commands.register import AstropyRegister from .commands.test import AstropyTest # These imports are not used in this module, but are included for backwards # compat with older versions of this module from .utils import get_numpy_include_path, write_if_different # noqa from .commands.build_ext import should_build_with_cython, get_compiler_version # noqa _module_state = {'registered_commands': None, 'have_sphinx': False, 'package_cache': None, 'exclude_packages': set(), 'excludes_too_late': False} try: import sphinx # noqa _module_state['have_sphinx'] = True except ValueError as e: # This can occur deep in the bowels of Sphinx's imports by way of docutils # and an occurrence of this bug: http://bugs.python.org/issue18378 # In this case sphinx is effectively unusable if 'unknown locale' in e.args[0]: log.warn( "Possible misconfiguration of one of the environment variables " "LC_ALL, LC_CTYPES, LANG, or LANGUAGE. For an example of how to " "configure your system's language environment on OSX see " "http://blog.remibergsma.com/2012/07/10/" "setting-locales-correctly-on-mac-osx-terminal-application/") except ImportError: pass except SyntaxError: # occurs if markupsafe is recent version, which doesn't support Python 3.2 pass PY3 = sys.version_info[0] >= 3 # This adds a new keyword to the setup() function Distribution.skip_2to3 = [] def adjust_compiler(package): """ This function detects broken compilers and switches to another. If the environment variable CC is explicitly set, or a compiler is specified on the commandline, no override is performed -- the purpose here is to only override a default compiler. The specific compilers with problems are: * The default compiler in XCode-4.2, llvm-gcc-4.2, segfaults when compiling wcslib. The set of broken compilers can be updated by changing the compiler_mapping variable. It is a list of 2-tuples where the first in the pair is a regular expression matching the version of the broken compiler, and the second is the compiler to change to. """ warnings.warn( 'Direct use of the adjust_compiler function in setup.py is ' 'deprecated and can be removed from your setup.py. This ' 'functionality is now incorporated directly into the build_ext ' 'command.', AstropyDeprecationWarning) def get_debug_option(packagename): """ Determines if the build is in debug mode. Returns ------- debug : bool True if the current build was started with the debug option, False otherwise. """ try: current_debug = get_pkg_version_module(packagename, fromlist=['debug'])[0] except (ImportError, AttributeError): current_debug = None # Only modify the debug flag if one of the build commands was explicitly # run (i.e. not as a sub-command of something else) dist = get_dummy_distribution() if any(cmd in dist.commands for cmd in ['build', 'build_ext']): debug = bool(get_distutils_build_option('debug')) else: debug = bool(current_debug) if current_debug is not None and current_debug != debug: build_ext_cmd = dist.get_command_class('build_ext') build_ext_cmd.force_rebuild = True return debug def add_exclude_packages(excludes): if _module_state['excludes_too_late']: raise RuntimeError( "add_package_excludes must be called before all other setup helper " "functions in order to properly handle excluded packages") _module_state['exclude_packages'].add(set(excludes)) def register_commands(package, version, release, srcdir='.'): if _module_state['registered_commands'] is not None: return _module_state['registered_commands'] if _module_state['have_sphinx']: try: from .commands.build_sphinx import (AstropyBuildSphinx, AstropyBuildDocs) except ImportError: AstropyBuildSphinx = AstropyBuildDocs = FakeBuildSphinx else: AstropyBuildSphinx = AstropyBuildDocs = FakeBuildSphinx _module_state['registered_commands'] = registered_commands = { 'test': generate_test_command(package), # Use distutils' sdist because it respects package_data. # setuptools/distributes sdist requires duplication of information in # MANIFEST.in 'sdist': DistutilsSdist, # The exact form of the build_ext command depends on whether or not # we're building a release version 'build_ext': generate_build_ext_command(package, release), # We have a custom build_py to generate the default configuration file 'build_py': AstropyBuildPy, # Since install can (in some circumstances) be run without # first building, we also need to override install and # install_lib. See #2223 'install': AstropyInstall, 'install_lib': AstropyInstallLib, 'register': AstropyRegister, 'build_sphinx': AstropyBuildSphinx, 'build_docs': AstropyBuildDocs } # Need to override the __name__ here so that the commandline options are # presented as being related to the "build" command, for example; normally # this wouldn't be necessary since commands also have a command_name # attribute, but there is a bug in distutils' help display code that it # uses __name__ instead of command_name. Yay distutils! for name, cls in registered_commands.items(): cls.__name__ = name # Add a few custom options; more of these can be added by specific packages # later for option in [ ('use-system-libraries', "Use system libraries whenever possible", True)]: add_command_option('build', *option) add_command_option('install', *option) add_command_hooks(registered_commands, srcdir=srcdir) return registered_commands def add_command_hooks(commands, srcdir='.'): """ Look through setup_package.py modules for functions with names like ``pre__hook`` and ``post__hook`` where ```` is the name of a ``setup.py`` command (e.g. build_ext). If either hook is present this adds a wrapped version of that command to the passed in ``commands`` `dict`. ``commands`` may be pre-populated with other custom distutils command classes that should be wrapped if there are hooks for them (e.g. `AstropyBuildPy`). """ hook_re = re.compile(r'^(pre|post)_(.+)_hook$') # Distutils commands have a method of the same name, but it is not a # *classmethod* (which probably didn't exist when distutils was first # written) def get_command_name(cmdcls): if hasattr(cmdcls, 'command_name'): return cmdcls.command_name else: return cmdcls.__name__ packages = filter_packages(find_packages(srcdir)) dist = get_dummy_distribution() hooks = collections.defaultdict(dict) for setuppkg in iter_setup_packages(srcdir, packages): for name, obj in vars(setuppkg).items(): match = hook_re.match(name) if not match: continue hook_type = match.group(1) cmd_name = match.group(2) if hook_type not in hooks[cmd_name]: hooks[cmd_name][hook_type] = [] hooks[cmd_name][hook_type].append((setuppkg.__name__, obj)) for cmd_name, cmd_hooks in hooks.items(): commands[cmd_name] = generate_hooked_command( cmd_name, dist.get_command_class(cmd_name), cmd_hooks) def generate_hooked_command(cmd_name, cmd_cls, hooks): """ Returns a generated subclass of ``cmd_cls`` that runs the pre- and post-command hooks for that command before and after the ``cmd_cls.run`` method. """ def run(self, orig_run=cmd_cls.run): self.run_command_hooks('pre_hooks') orig_run(self) self.run_command_hooks('post_hooks') return type(cmd_name, (cmd_cls, object), {'run': run, 'run_command_hooks': run_command_hooks, 'pre_hooks': hooks.get('pre', []), 'post_hooks': hooks.get('post', [])}) def run_command_hooks(cmd_obj, hook_kind): """Run hooks registered for that command and phase. *cmd_obj* is a finalized command object; *hook_kind* is either 'pre_hook' or 'post_hook'. """ hooks = getattr(cmd_obj, hook_kind, None) if not hooks: return for modname, hook in hooks: if isinstance(hook, str): try: hook_obj = resolve_name(hook) except ImportError as exc: raise DistutilsModuleError( 'cannot find hook {0}: {1}'.format(hook, exc)) else: hook_obj = hook if not callable(hook_obj): raise DistutilsOptionError('hook {0!r} is not callable' % hook) log.info('running {0} from {1} for {2} command'.format( hook_kind.rstrip('s'), modname, cmd_obj.get_command_name())) try: hook_obj(cmd_obj) except Exception: log.error('{0} command hook {1} raised an exception: %s\n'.format( hook_obj.__name__, cmd_obj.get_command_name())) log.error(traceback.format_exc()) sys.exit(1) def generate_test_command(package_name): """ Creates a custom 'test' command for the given package which sets the command's ``package_name`` class attribute to the name of the package being tested. """ return type(package_name.title() + 'Test', (AstropyTest,), {'package_name': package_name}) def update_package_files(srcdir, extensions, package_data, packagenames, package_dirs): """ This function is deprecated and maintained for backward compatibility with affiliated packages. Affiliated packages should update their setup.py to use `get_package_info` instead. """ info = get_package_info(srcdir) extensions.extend(info['ext_modules']) package_data.update(info['package_data']) packagenames = list(set(packagenames + info['packages'])) package_dirs.update(info['package_dir']) def get_package_info(srcdir='.', exclude=()): """ Collates all of the information for building all subpackages and returns a dictionary of keyword arguments that can be passed directly to `distutils.setup`. The purpose of this function is to allow subpackages to update the arguments to the package's ``setup()`` function in its setup.py script, rather than having to specify all extensions/package data directly in the ``setup.py``. See Astropy's own ``setup.py`` for example usage and the Astropy development docs for more details. This function obtains that information by iterating through all packages in ``srcdir`` and locating a ``setup_package.py`` module. This module can contain the following functions: ``get_extensions()``, ``get_package_data()``, ``get_build_options()``, ``get_external_libraries()``, and ``requires_2to3()``. Each of those functions take no arguments. - ``get_extensions`` returns a list of `distutils.extension.Extension` objects. - ``get_package_data()`` returns a dict formatted as required by the ``package_data`` argument to ``setup()``. - ``get_build_options()`` returns a list of tuples describing the extra build options to add. - ``get_external_libraries()`` returns a list of libraries that can optionally be built using external dependencies. - ``get_entry_points()`` returns a dict formatted as required by the ``entry_points`` argument to ``setup()``. - ``requires_2to3()`` should return `True` when the source code requires `2to3` processing to run on Python 3.x. If ``requires_2to3()`` is missing, it is assumed to return `True`. """ ext_modules = [] packages = [] package_data = {} package_dir = {} skip_2to3 = [] if exclude: warnings.warn( "Use of the exclude parameter is no longer supported since it does " "not work as expected. Use add_exclude_packages instead. Note that " "it must be called prior to any other calls from setup helpers.", AstropyDeprecationWarning) # Use the find_packages tool to locate all packages and modules packages = filter_packages(find_packages(srcdir, exclude=exclude)) # Update package_dir if the package lies in a subdirectory if srcdir != '.': package_dir[''] = srcdir # For each of the setup_package.py modules, extract any # information that is needed to install them. The build options # are extracted first, so that their values will be available in # subsequent calls to `get_extensions`, etc. for setuppkg in iter_setup_packages(srcdir, packages): if hasattr(setuppkg, 'get_build_options'): options = setuppkg.get_build_options() for option in options: add_command_option('build', *option) if hasattr(setuppkg, 'get_external_libraries'): libraries = setuppkg.get_external_libraries() for library in libraries: add_external_library(library) if hasattr(setuppkg, 'requires_2to3'): requires_2to3 = setuppkg.requires_2to3() else: requires_2to3 = True if not requires_2to3: skip_2to3.append( os.path.dirname(setuppkg.__file__)) for setuppkg in iter_setup_packages(srcdir, packages): # get_extensions must include any Cython extensions by their .pyx # filename. if hasattr(setuppkg, 'get_extensions'): ext_modules.extend(setuppkg.get_extensions()) if hasattr(setuppkg, 'get_package_data'): package_data.update(setuppkg.get_package_data()) # Locate any .pyx files not already specified, and add their extensions in. # The default include dirs include numpy to facilitate numerical work. ext_modules.extend(get_cython_extensions(srcdir, packages, ext_modules, ['numpy'])) # Now remove extensions that have the special name 'skip_cython', as they # exist Only to indicate that the cython extensions shouldn't be built for i, ext in reversed(list(enumerate(ext_modules))): if ext.name == 'skip_cython': del ext_modules[i] # On Microsoft compilers, we need to pass the '/MANIFEST' # commandline argument. This was the default on MSVC 9.0, but is # now required on MSVC 10.0, but it doesn't seem to hurt to add # it unconditionally. if get_compiler_option() == 'msvc': for ext in ext_modules: ext.extra_link_args.append('/MANIFEST') return { 'ext_modules': ext_modules, 'packages': packages, 'package_dir': package_dir, 'package_data': package_data, 'skip_2to3': skip_2to3 } def iter_setup_packages(srcdir, packages): """ A generator that finds and imports all of the ``setup_package.py`` modules in the source packages. Returns ------- modgen : generator A generator that yields (modname, mod), where `mod` is the module and `modname` is the module name for the ``setup_package.py`` modules. """ for packagename in packages: package_parts = packagename.split('.') package_path = os.path.join(srcdir, *package_parts) setup_package = os.path.relpath( os.path.join(package_path, 'setup_package.py')) if os.path.isfile(setup_package): module = import_file(setup_package, name=packagename + '.setup_package') yield module def iter_pyx_files(package_dir, package_name): """ A generator that yields Cython source files (ending in '.pyx') in the source packages. Returns ------- pyxgen : generator A generator that yields (extmod, fullfn) where `extmod` is the full name of the module that the .pyx file would live in based on the source directory structure, and `fullfn` is the path to the .pyx file. """ for dirpath, dirnames, filenames in walk_skip_hidden(package_dir): for fn in filenames: if fn.endswith('.pyx'): fullfn = os.path.relpath(os.path.join(dirpath, fn)) # Package must match file name extmod = '.'.join([package_name, fn[:-4]]) yield (extmod, fullfn) break # Don't recurse into subdirectories def get_cython_extensions(srcdir, packages, prevextensions=tuple(), extincludedirs=None): """ Looks for Cython files and generates Extensions if needed. Parameters ---------- srcdir : str Path to the root of the source directory to search. prevextensions : list of `~distutils.core.Extension` objects The extensions that are already defined. Any .pyx files already here will be ignored. extincludedirs : list of str or None Directories to include as the `include_dirs` argument to the generated `~distutils.core.Extension` objects. Returns ------- exts : list of `~distutils.core.Extension` objects The new extensions that are needed to compile all .pyx files (does not include any already in `prevextensions`). """ # Vanilla setuptools and old versions of distribute include Cython files # as .c files in the sources, not .pyx, so we cannot simply look for # existing .pyx sources in the previous sources, but we should also check # for .c files with the same remaining filename. So we look for .pyx and # .c files, and we strip the extension. prevsourcepaths = [] ext_modules = [] for ext in prevextensions: for s in ext.sources: if s.endswith(('.pyx', '.c', '.cpp')): sourcepath = os.path.realpath(os.path.splitext(s)[0]) prevsourcepaths.append(sourcepath) for package_name in packages: package_parts = package_name.split('.') package_path = os.path.join(srcdir, *package_parts) for extmod, pyxfn in iter_pyx_files(package_path, package_name): sourcepath = os.path.realpath(os.path.splitext(pyxfn)[0]) if sourcepath not in prevsourcepaths: ext_modules.append(Extension(extmod, [pyxfn], include_dirs=extincludedirs)) return ext_modules class DistutilsExtensionArgs(collections.defaultdict): """ A special dictionary whose default values are the empty list. This is useful for building up a set of arguments for `distutils.Extension` without worrying whether the entry is already present. """ def __init__(self, *args, **kwargs): def default_factory(): return [] super(DistutilsExtensionArgs, self).__init__( default_factory, *args, **kwargs) def update(self, other): for key, val in other.items(): self[key].extend(val) def pkg_config(packages, default_libraries, executable='pkg-config'): """ Uses pkg-config to update a set of distutils Extension arguments to include the flags necessary to link against the given packages. If the pkg-config lookup fails, default_libraries is applied to libraries. Parameters ---------- packages : list of str A list of pkg-config packages to look up. default_libraries : list of str A list of library names to use if the pkg-config lookup fails. Returns ------- config : dict A dictionary containing keyword arguments to `distutils.Extension`. These entries include: - ``include_dirs``: A list of include directories - ``library_dirs``: A list of library directories - ``libraries``: A list of libraries - ``define_macros``: A list of macro defines - ``undef_macros``: A list of macros to undefine - ``extra_compile_args``: A list of extra arguments to pass to the compiler """ flag_map = {'-I': 'include_dirs', '-L': 'library_dirs', '-l': 'libraries', '-D': 'define_macros', '-U': 'undef_macros'} command = "{0} --libs --cflags {1}".format(executable, ' '.join(packages)), result = DistutilsExtensionArgs() try: pipe = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE) output = pipe.communicate()[0].strip() except subprocess.CalledProcessError as e: lines = [ ("{0} failed. This may cause the build to fail below." .format(executable)), " command: {0}".format(e.cmd), " returncode: {0}".format(e.returncode), " output: {0}".format(e.output) ] log.warn('\n'.join(lines)) result['libraries'].extend(default_libraries) else: if pipe.returncode != 0: lines = [ "pkg-config could not lookup up package(s) {0}.".format( ", ".join(packages)), "This may cause the build to fail below." ] log.warn('\n'.join(lines)) result['libraries'].extend(default_libraries) else: for token in output.split(): # It's not clear what encoding the output of # pkg-config will come to us in. It will probably be # some combination of pure ASCII (for the compiler # flags) and the filesystem encoding (for any argument # that includes directories or filenames), but this is # just conjecture, as the pkg-config documentation # doesn't seem to address it. arg = token[:2].decode('ascii') value = token[2:].decode(sys.getfilesystemencoding()) if arg in flag_map: if arg == '-D': value = tuple(value.split('=', 1)) result[flag_map[arg]].append(value) else: result['extra_compile_args'].append(value) return result def add_external_library(library): """ Add a build option for selecting the internal or system copy of a library. Parameters ---------- library : str The name of the library. If the library is `foo`, the build option will be called `--use-system-foo`. """ for command in ['build', 'build_ext', 'install']: add_command_option(command, str('use-system-' + library), 'Use the system {0} library'.format(library), is_bool=True) def use_system_library(library): """ Returns `True` if the build configuration indicates that the given library should use the system copy of the library rather than the internal one. For the given library `foo`, this will be `True` if `--use-system-foo` or `--use-system-libraries` was provided at the commandline or in `setup.cfg`. Parameters ---------- library : str The name of the library Returns ------- use_system : bool `True` if the build should use the system copy of the library. """ return ( get_distutils_build_or_install_option('use_system_{0}'.format(library)) or get_distutils_build_or_install_option('use_system_libraries')) @extends_doc(_find_packages) def find_packages(where='.', exclude=(), invalidate_cache=False): """ This version of ``find_packages`` caches previous results to speed up subsequent calls. Use ``invalide_cache=True`` to ignore cached results from previous ``find_packages`` calls, and repeat the package search. """ if exclude: warnings.warn( "Use of the exclude parameter is no longer supported since it does " "not work as expected. Use add_exclude_packages instead. Note that " "it must be called prior to any other calls from setup helpers.", AstropyDeprecationWarning) # Calling add_exclude_packages after this point will have no effect _module_state['excludes_too_late'] = True if not invalidate_cache and _module_state['package_cache'] is not None: return _module_state['package_cache'] packages = _find_packages( where=where, exclude=list(_module_state['exclude_packages'])) _module_state['package_cache'] = packages return packages def filter_packages(packagenames): """ Removes some packages from the package list that shouldn't be installed on the current version of Python. """ if PY3: exclude = '_py2' else: exclude = '_py3' return [x for x in packagenames if not x.endswith(exclude)] class FakeBuildSphinx(Command): """ A dummy build_sphinx command that is called if Sphinx is not installed and displays a relevant error message """ # user options inherited from sphinx.setup_command.BuildDoc user_options = [ ('fresh-env', 'E', ''), ('all-files', 'a', ''), ('source-dir=', 's', ''), ('build-dir=', None, ''), ('config-dir=', 'c', ''), ('builder=', 'b', ''), ('project=', None, ''), ('version=', None, ''), ('release=', None, ''), ('today=', None, ''), ('link-index', 'i', '')] # user options appended in astropy.setup_helpers.AstropyBuildSphinx user_options.append(('warnings-returncode', 'w', '')) user_options.append(('clean-docs', 'l', '')) user_options.append(('no-intersphinx', 'n', '')) user_options.append(('open-docs-in-browser', 'o', '')) def initialize_options(self): try: raise RuntimeError("Sphinx and its dependencies must be installed " "for build_docs.") except: log.error('error: Sphinx and its dependencies must be installed ' 'for build_docs.') sys.exit(1) sunpy-0.8.3/astropy_helpers/astropy_helpers/test_helpers.py0000644000175000001440000000100313203277317023602 0ustar nabil00000000000000from __future__ import (absolute_import, division, print_function, unicode_literals) import warnings from .commands.test import AstropyTest # noqa # Leaving this module here for now, but really it needn't exist # (and it's doubtful that any code depends on it anymore) warnings.warn('The astropy_helpers.test_helpers module is deprecated as ' 'of version 1.1.0; the AstropyTest command can be found in ' 'astropy_helpers.commands.test.', DeprecationWarning) sunpy-0.8.3/astropy_helpers/astropy_helpers/utils.py0000644000175000001440000006476513212200427022255 0ustar nabil00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst from __future__ import absolute_import, unicode_literals import contextlib import functools import imp import inspect import os import sys import glob import textwrap import types import warnings try: from importlib import machinery as import_machinery # Python 3.2 does not have SourceLoader if not hasattr(import_machinery, 'SourceLoader'): import_machinery = None except ImportError: import_machinery = None # Python 3.3's importlib caches filesystem reads for faster imports in the # general case. But sometimes it's necessary to manually invalidate those # caches so that the import system can pick up new generated files. See # https://github.com/astropy/astropy/issues/820 if sys.version_info[:2] >= (3, 3): from importlib import invalidate_caches else: def invalidate_caches(): return None # Python 2/3 compatibility if sys.version_info[0] < 3: string_types = (str, unicode) # noqa else: string_types = (str,) # Note: The following Warning subclasses are simply copies of the Warnings in # Astropy of the same names. class AstropyWarning(Warning): """ The base warning class from which all Astropy warnings should inherit. Any warning inheriting from this class is handled by the Astropy logger. """ class AstropyDeprecationWarning(AstropyWarning): """ A warning class to indicate a deprecated feature. """ class AstropyPendingDeprecationWarning(PendingDeprecationWarning, AstropyWarning): """ A warning class to indicate a soon-to-be deprecated feature. """ def _get_platlib_dir(cmd): """ Given a build command, return the name of the appropriate platform-specific build subdirectory directory (e.g. build/lib.linux-x86_64-2.7) """ plat_specifier = '.{0}-{1}'.format(cmd.plat_name, sys.version[0:3]) return os.path.join(cmd.build_base, 'lib' + plat_specifier) def get_numpy_include_path(): """ Gets the path to the numpy headers. """ # We need to go through this nonsense in case setuptools # downloaded and installed Numpy for us as part of the build or # install, since Numpy may still think it's in "setup mode", when # in fact we're ready to use it to build astropy now. if sys.version_info[0] >= 3: import builtins if hasattr(builtins, '__NUMPY_SETUP__'): del builtins.__NUMPY_SETUP__ import imp import numpy imp.reload(numpy) else: import __builtin__ if hasattr(__builtin__, '__NUMPY_SETUP__'): del __builtin__.__NUMPY_SETUP__ import numpy reload(numpy) try: numpy_include = numpy.get_include() except AttributeError: numpy_include = numpy.get_numpy_include() return numpy_include class _DummyFile(object): """A noop writeable object.""" errors = '' # Required for Python 3.x def write(self, s): pass def flush(self): pass @contextlib.contextmanager def silence(): """A context manager that silences sys.stdout and sys.stderr.""" old_stdout = sys.stdout old_stderr = sys.stderr sys.stdout = _DummyFile() sys.stderr = _DummyFile() exception_occurred = False try: yield except: exception_occurred = True # Go ahead and clean up so that exception handling can work normally sys.stdout = old_stdout sys.stderr = old_stderr raise if not exception_occurred: sys.stdout = old_stdout sys.stderr = old_stderr if sys.platform == 'win32': import ctypes def _has_hidden_attribute(filepath): """ Returns True if the given filepath has the hidden attribute on MS-Windows. Based on a post here: http://stackoverflow.com/questions/284115/cross-platform-hidden-file-detection """ if isinstance(filepath, bytes): filepath = filepath.decode(sys.getfilesystemencoding()) try: attrs = ctypes.windll.kernel32.GetFileAttributesW(filepath) assert attrs != -1 result = bool(attrs & 2) except (AttributeError, AssertionError): result = False return result else: def _has_hidden_attribute(filepath): return False def is_path_hidden(filepath): """ Determines if a given file or directory is hidden. Parameters ---------- filepath : str The path to a file or directory Returns ------- hidden : bool Returns `True` if the file is hidden """ name = os.path.basename(os.path.abspath(filepath)) if isinstance(name, bytes): is_dotted = name.startswith(b'.') else: is_dotted = name.startswith('.') return is_dotted or _has_hidden_attribute(filepath) def walk_skip_hidden(top, onerror=None, followlinks=False): """ A wrapper for `os.walk` that skips hidden files and directories. This function does not have the parameter `topdown` from `os.walk`: the directories must always be recursed top-down when using this function. See also -------- os.walk : For a description of the parameters """ for root, dirs, files in os.walk( top, topdown=True, onerror=onerror, followlinks=followlinks): # These lists must be updated in-place so os.walk will skip # hidden directories dirs[:] = [d for d in dirs if not is_path_hidden(d)] files[:] = [f for f in files if not is_path_hidden(f)] yield root, dirs, files def write_if_different(filename, data): """Write `data` to `filename`, if the content of the file is different. Parameters ---------- filename : str The file name to be written to. data : bytes The data to be written to `filename`. """ assert isinstance(data, bytes) if os.path.exists(filename): with open(filename, 'rb') as fd: original_data = fd.read() else: original_data = None if original_data != data: with open(filename, 'wb') as fd: fd.write(data) def import_file(filename, name=None): """ Imports a module from a single file as if it doesn't belong to a particular package. The returned module will have the optional ``name`` if given, or else a name generated from the filename. """ # Specifying a traditional dot-separated fully qualified name here # results in a number of "Parent module 'astropy' not found while # handling absolute import" warnings. Using the same name, the # namespaces of the modules get merged together. So, this # generates an underscore-separated name which is more likely to # be unique, and it doesn't really matter because the name isn't # used directly here anyway. mode = 'U' if sys.version_info[0] < 3 else 'r' if name is None: basename = os.path.splitext(filename)[0] name = '_'.join(os.path.relpath(basename).split(os.sep)[1:]) if import_machinery: loader = import_machinery.SourceFileLoader(name, filename) mod = loader.load_module() else: with open(filename, mode) as fd: mod = imp.load_module(name, fd, filename, ('.py', mode, 1)) return mod def resolve_name(name): """Resolve a name like ``module.object`` to an object and return it. Raise `ImportError` if the module or name is not found. """ parts = name.split('.') cursor = len(parts) - 1 module_name = parts[:cursor] attr_name = parts[-1] while cursor > 0: try: ret = __import__('.'.join(module_name), fromlist=[attr_name]) break except ImportError: if cursor == 0: raise cursor -= 1 module_name = parts[:cursor] attr_name = parts[cursor] ret = '' for part in parts[cursor:]: try: ret = getattr(ret, part) except AttributeError: raise ImportError(name) return ret if sys.version_info[0] >= 3: def iteritems(dictionary): return dictionary.items() else: def iteritems(dictionary): return dictionary.iteritems() def extends_doc(extended_func): """ A function decorator for use when wrapping an existing function but adding additional functionality. This copies the docstring from the original function, and appends to it (along with a newline) the docstring of the wrapper function. Example ------- >>> def foo(): ... '''Hello.''' ... >>> @extends_doc(foo) ... def bar(): ... '''Goodbye.''' ... >>> print(bar.__doc__) Hello. Goodbye. """ def decorator(func): if not (extended_func.__doc__ is None or func.__doc__ is None): func.__doc__ = '\n\n'.join([extended_func.__doc__.rstrip('\n'), func.__doc__.lstrip('\n')]) return func return decorator # Duplicated from astropy.utils.decorators.deprecated # When fixing issues in this function fix them in astropy first, then # port the fixes over to astropy-helpers def deprecated(since, message='', name='', alternative='', pending=False, obj_type=None): """ Used to mark a function or class as deprecated. To mark an attribute as deprecated, use `deprecated_attribute`. Parameters ------------ since : str The release at which this API became deprecated. This is required. message : str, optional Override the default deprecation message. The format specifier ``func`` may be used for the name of the function, and ``alternative`` may be used in the deprecation message to insert the name of an alternative to the deprecated function. ``obj_type`` may be used to insert a friendly name for the type of object being deprecated. name : str, optional The name of the deprecated function or class; if not provided the name is automatically determined from the passed in function or class, though this is useful in the case of renamed functions, where the new function is just assigned to the name of the deprecated function. For example:: def new_function(): ... oldFunction = new_function alternative : str, optional An alternative function or class name that the user may use in place of the deprecated object. The deprecation warning will tell the user about this alternative if provided. pending : bool, optional If True, uses a AstropyPendingDeprecationWarning instead of a AstropyDeprecationWarning. obj_type : str, optional The type of this object, if the automatically determined one needs to be overridden. """ method_types = (classmethod, staticmethod, types.MethodType) def deprecate_doc(old_doc, message): """ Returns a given docstring with a deprecation message prepended to it. """ if not old_doc: old_doc = '' old_doc = textwrap.dedent(old_doc).strip('\n') new_doc = (('\n.. deprecated:: %(since)s' '\n %(message)s\n\n' % {'since': since, 'message': message.strip()}) + old_doc) if not old_doc: # This is to prevent a spurious 'unexpected unindent' warning from # docutils when the original docstring was blank. new_doc += r'\ ' return new_doc def get_function(func): """ Given a function or classmethod (or other function wrapper type), get the function object. """ if isinstance(func, method_types): func = func.__func__ return func def deprecate_function(func, message): """ Returns a wrapped function that displays an ``AstropyDeprecationWarning`` when it is called. """ if isinstance(func, method_types): func_wrapper = type(func) else: func_wrapper = lambda f: f func = get_function(func) def deprecated_func(*args, **kwargs): if pending: category = AstropyPendingDeprecationWarning else: category = AstropyDeprecationWarning warnings.warn(message, category, stacklevel=2) return func(*args, **kwargs) # If this is an extension function, we can't call # functools.wraps on it, but we normally don't care. # This crazy way to get the type of a wrapper descriptor is # straight out of the Python 3.3 inspect module docs. if type(func) != type(str.__dict__['__add__']): deprecated_func = functools.wraps(func)(deprecated_func) deprecated_func.__doc__ = deprecate_doc( deprecated_func.__doc__, message) return func_wrapper(deprecated_func) def deprecate_class(cls, message): """ Returns a wrapper class with the docstrings updated and an __init__ function that will raise an ``AstropyDeprectationWarning`` warning when called. """ # Creates a new class with the same name and bases as the # original class, but updates the dictionary with a new # docstring and a wrapped __init__ method. __module__ needs # to be manually copied over, since otherwise it will be set # to *this* module (astropy.utils.misc). # This approach seems to make Sphinx happy (the new class # looks enough like the original class), and works with # extension classes (which functools.wraps does not, since # it tries to modify the original class). # We need to add a custom pickler or you'll get # Can't pickle : it's not found as ... # errors. Picklability is required for any class that is # documented by Sphinx. members = cls.__dict__.copy() members.update({ '__doc__': deprecate_doc(cls.__doc__, message), '__init__': deprecate_function(get_function(cls.__init__), message), }) return type(cls.__name__, cls.__bases__, members) def deprecate(obj, message=message, name=name, alternative=alternative, pending=pending): if obj_type is None: if isinstance(obj, type): obj_type_name = 'class' elif inspect.isfunction(obj): obj_type_name = 'function' elif inspect.ismethod(obj) or isinstance(obj, method_types): obj_type_name = 'method' else: obj_type_name = 'object' else: obj_type_name = obj_type if not name: name = get_function(obj).__name__ altmessage = '' if not message or type(message) == type(deprecate): if pending: message = ('The %(func)s %(obj_type)s will be deprecated in a ' 'future version.') else: message = ('The %(func)s %(obj_type)s is deprecated and may ' 'be removed in a future version.') if alternative: altmessage = '\n Use %s instead.' % alternative message = ((message % { 'func': name, 'name': name, 'alternative': alternative, 'obj_type': obj_type_name}) + altmessage) if isinstance(obj, type): return deprecate_class(obj, message) else: return deprecate_function(obj, message) if type(message) == type(deprecate): return deprecate(message) return deprecate def deprecated_attribute(name, since, message=None, alternative=None, pending=False): """ Used to mark a public attribute as deprecated. This creates a property that will warn when the given attribute name is accessed. To prevent the warning (i.e. for internal code), use the private name for the attribute by prepending an underscore (i.e. ``self._name``). Parameters ---------- name : str The name of the deprecated attribute. since : str The release at which this API became deprecated. This is required. message : str, optional Override the default deprecation message. The format specifier ``name`` may be used for the name of the attribute, and ``alternative`` may be used in the deprecation message to insert the name of an alternative to the deprecated function. alternative : str, optional An alternative attribute that the user may use in place of the deprecated attribute. The deprecation warning will tell the user about this alternative if provided. pending : bool, optional If True, uses a AstropyPendingDeprecationWarning instead of a AstropyDeprecationWarning. Examples -------- :: class MyClass: # Mark the old_name as deprecated old_name = misc.deprecated_attribute('old_name', '0.1') def method(self): self._old_name = 42 """ private_name = '_' + name @deprecated(since, name=name, obj_type='attribute') def get(self): return getattr(self, private_name) @deprecated(since, name=name, obj_type='attribute') def set(self, val): setattr(self, private_name, val) @deprecated(since, name=name, obj_type='attribute') def delete(self): delattr(self, private_name) return property(get, set, delete) def minversion(module, version, inclusive=True, version_path='__version__'): """ Returns `True` if the specified Python module satisfies a minimum version requirement, and `False` if not. By default this uses `pkg_resources.parse_version` to do the version comparison if available. Otherwise it falls back on `distutils.version.LooseVersion`. Parameters ---------- module : module or `str` An imported module of which to check the version, or the name of that module (in which case an import of that module is attempted-- if this fails `False` is returned). version : `str` The version as a string that this module must have at a minimum (e.g. ``'0.12'``). inclusive : `bool` The specified version meets the requirement inclusively (i.e. ``>=``) as opposed to strictly greater than (default: `True`). version_path : `str` A dotted attribute path to follow in the module for the version. Defaults to just ``'__version__'``, which should work for most Python modules. Examples -------- >>> import astropy >>> minversion(astropy, '0.4.4') True """ if isinstance(module, types.ModuleType): module_name = module.__name__ elif isinstance(module, string_types): module_name = module try: module = resolve_name(module_name) except ImportError: return False else: raise ValueError('module argument must be an actual imported ' 'module, or the import name of the module; ' 'got {0!r}'.format(module)) if '.' not in version_path: have_version = getattr(module, version_path) else: have_version = resolve_name('.'.join([module.__name__, version_path])) try: from pkg_resources import parse_version except ImportError: from distutils.version import LooseVersion as parse_version if inclusive: return parse_version(have_version) >= parse_version(version) else: return parse_version(have_version) > parse_version(version) # Copy of the classproperty decorator from astropy.utils.decorators class classproperty(property): """ Similar to `property`, but allows class-level properties. That is, a property whose getter is like a `classmethod`. The wrapped method may explicitly use the `classmethod` decorator (which must become before this decorator), or the `classmethod` may be omitted (it is implicit through use of this decorator). .. note:: classproperty only works for *read-only* properties. It does not currently allow writeable/deleteable properties, due to subtleties of how Python descriptors work. In order to implement such properties on a class a metaclass for that class must be implemented. Parameters ---------- fget : callable The function that computes the value of this property (in particular, the function when this is used as a decorator) a la `property`. doc : str, optional The docstring for the property--by default inherited from the getter function. lazy : bool, optional If True, caches the value returned by the first call to the getter function, so that it is only called once (used for lazy evaluation of an attribute). This is analogous to `lazyproperty`. The ``lazy`` argument can also be used when `classproperty` is used as a decorator (see the third example below). When used in the decorator syntax this *must* be passed in as a keyword argument. Examples -------- :: >>> class Foo(object): ... _bar_internal = 1 ... @classproperty ... def bar(cls): ... return cls._bar_internal + 1 ... >>> Foo.bar 2 >>> foo_instance = Foo() >>> foo_instance.bar 2 >>> foo_instance._bar_internal = 2 >>> foo_instance.bar # Ignores instance attributes 2 As previously noted, a `classproperty` is limited to implementing read-only attributes:: >>> class Foo(object): ... _bar_internal = 1 ... @classproperty ... def bar(cls): ... return cls._bar_internal ... @bar.setter ... def bar(cls, value): ... cls._bar_internal = value ... Traceback (most recent call last): ... NotImplementedError: classproperty can only be read-only; use a metaclass to implement modifiable class-level properties When the ``lazy`` option is used, the getter is only called once:: >>> class Foo(object): ... @classproperty(lazy=True) ... def bar(cls): ... print("Performing complicated calculation") ... return 1 ... >>> Foo.bar Performing complicated calculation 1 >>> Foo.bar 1 If a subclass inherits a lazy `classproperty` the property is still re-evaluated for the subclass:: >>> class FooSub(Foo): ... pass ... >>> FooSub.bar Performing complicated calculation 1 >>> FooSub.bar 1 """ def __new__(cls, fget=None, doc=None, lazy=False): if fget is None: # Being used as a decorator--return a wrapper that implements # decorator syntax def wrapper(func): return cls(func, lazy=lazy) return wrapper return super(classproperty, cls).__new__(cls) def __init__(self, fget, doc=None, lazy=False): self._lazy = lazy if lazy: self._cache = {} fget = self._wrap_fget(fget) super(classproperty, self).__init__(fget=fget, doc=doc) # There is a buglet in Python where self.__doc__ doesn't # get set properly on instances of property subclasses if # the doc argument was used rather than taking the docstring # from fget if doc is not None: self.__doc__ = doc def __get__(self, obj, objtype=None): if self._lazy and objtype in self._cache: return self._cache[objtype] if objtype is not None: # The base property.__get__ will just return self here; # instead we pass objtype through to the original wrapped # function (which takes the class as its sole argument) val = self.fget.__wrapped__(objtype) else: val = super(classproperty, self).__get__(obj, objtype=objtype) if self._lazy: if objtype is None: objtype = obj.__class__ self._cache[objtype] = val return val def getter(self, fget): return super(classproperty, self).getter(self._wrap_fget(fget)) def setter(self, fset): raise NotImplementedError( "classproperty can only be read-only; use a metaclass to " "implement modifiable class-level properties") def deleter(self, fdel): raise NotImplementedError( "classproperty can only be read-only; use a metaclass to " "implement modifiable class-level properties") @staticmethod def _wrap_fget(orig_fget): if isinstance(orig_fget, classmethod): orig_fget = orig_fget.__func__ # Using stock functools.wraps instead of the fancier version # found later in this module, which is overkill for this purpose @functools.wraps(orig_fget) def fget(obj): return orig_fget(obj.__class__) # Set the __wrapped__ attribute manually for support on Python 2 fget.__wrapped__ = orig_fget return fget def find_data_files(package, pattern): """ Include files matching ``pattern`` inside ``package``. Parameters ---------- package : str The package inside which to look for data files pattern : str Pattern (glob-style) to match for the data files (e.g. ``*.dat``). This supports the Python 3.5 ``**``recursive syntax. For example, ``**/*.fits`` matches all files ending with ``.fits`` recursively. Only one instance of ``**`` can be included in the pattern. """ if sys.version_info[:2] >= (3, 5): return glob.glob(os.path.join(package, pattern), recursive=True) else: if '**' in pattern: start, end = pattern.split('**') if end.startswith(('/', os.sep)): end = end[1:] matches = glob.glob(os.path.join(package, start, end)) for root, dirs, files in os.walk(os.path.join(package, start)): for dirname in dirs: matches += glob.glob(os.path.join(root, dirname, end)) return matches else: return glob.glob(os.path.join(package, pattern)) sunpy-0.8.3/astropy_helpers/astropy_helpers/version.py0000644000175000001440000000102513203277317022572 0ustar nabil00000000000000# Autogenerated by Astropy-affiliated package astropy_helpers's setup.py on 2017-11-16 12:04:31 from __future__ import unicode_literals import datetime version = "2.0.2" githash = "d23a53f46dd1c3703e5eee63dca3f53bd18a4e8b" major = 2 minor = 0 bugfix = 2 release = True timestamp = datetime.datetime(2017, 11, 16, 12, 4, 31) debug = False try: from ._compiler import compiler except ImportError: compiler = "unknown" try: from .cython_version import cython_version except ImportError: cython_version = "unknown" sunpy-0.8.3/astropy_helpers/astropy_helpers/version_helpers.py0000644000175000001440000002303313212200427024303 0ustar nabil00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ Utilities for generating the version string for Astropy (or an affiliated package) and the version.py module, which contains version info for the package. Within the generated astropy.version module, the `major`, `minor`, and `bugfix` variables hold the respective parts of the version number (bugfix is '0' if absent). The `release` variable is True if this is a release, and False if this is a development version of astropy. For the actual version string, use:: from astropy.version import version or:: from astropy import __version__ """ from __future__ import division import datetime import imp import os import pkgutil import sys import time from distutils import log import pkg_resources from . import git_helpers from .distutils_helpers import is_distutils_display_option from .utils import invalidate_caches PY3 = sys.version_info[0] == 3 def _version_split(version): """ Split a version string into major, minor, and bugfix numbers. If any of those numbers are missing the default is zero. Any pre/post release modifiers are ignored. Examples ======== >>> _version_split('1.2.3') (1, 2, 3) >>> _version_split('1.2') (1, 2, 0) >>> _version_split('1.2rc1') (1, 2, 0) >>> _version_split('1') (1, 0, 0) >>> _version_split('') (0, 0, 0) """ parsed_version = pkg_resources.parse_version(version) if hasattr(parsed_version, 'base_version'): # New version parsing for setuptools >= 8.0 if parsed_version.base_version: parts = [int(part) for part in parsed_version.base_version.split('.')] else: parts = [] else: parts = [] for part in parsed_version: if part.startswith('*'): # Ignore any .dev, a, b, rc, etc. break parts.append(int(part)) if len(parts) < 3: parts += [0] * (3 - len(parts)) # In principle a version could have more parts (like 1.2.3.4) but we only # support .. return tuple(parts[:3]) # This is used by setup.py to create a new version.py - see that file for # details. Note that the imports have to be absolute, since this is also used # by affiliated packages. _FROZEN_VERSION_PY_TEMPLATE = """ # Autogenerated by {packagetitle}'s setup.py on {timestamp!s} from __future__ import unicode_literals import datetime {header} major = {major} minor = {minor} bugfix = {bugfix} release = {rel} timestamp = {timestamp!r} debug = {debug} try: from ._compiler import compiler except ImportError: compiler = "unknown" try: from .cython_version import cython_version except ImportError: cython_version = "unknown" """[1:] _FROZEN_VERSION_PY_WITH_GIT_HEADER = """ {git_helpers} _packagename = "{packagename}" _last_generated_version = "{verstr}" _last_githash = "{githash}" # Determine where the source code for this module # lives. If __file__ is not a filesystem path then # it is assumed not to live in a git repo at all. if _get_repo_path(__file__, levels=len(_packagename.split('.'))): version = update_git_devstr(_last_generated_version, path=__file__) githash = get_git_devstr(sha=True, show_warning=False, path=__file__) or _last_githash else: # The file does not appear to live in a git repo so don't bother # invoking git version = _last_generated_version githash = _last_githash """[1:] _FROZEN_VERSION_PY_STATIC_HEADER = """ version = "{verstr}" githash = "{githash}" """[1:] def _get_version_py_str(packagename, version, githash, release, debug, uses_git=True): epoch = int(os.environ.get('SOURCE_DATE_EPOCH', time.time())) timestamp = datetime.datetime.utcfromtimestamp(epoch) major, minor, bugfix = _version_split(version) if packagename.lower() == 'astropy': packagetitle = 'Astropy' else: packagetitle = 'Astropy-affiliated package ' + packagename header = '' if uses_git: header = _generate_git_header(packagename, version, githash) elif not githash: # _generate_git_header will already generate a new git has for us, but # for creating a new version.py for a release (even if uses_git=False) # we still need to get the githash to include in the version.py # See https://github.com/astropy/astropy-helpers/issues/141 githash = git_helpers.get_git_devstr(sha=True, show_warning=True) if not header: # If _generate_git_header fails it returns an empty string header = _FROZEN_VERSION_PY_STATIC_HEADER.format(verstr=version, githash=githash) return _FROZEN_VERSION_PY_TEMPLATE.format(packagetitle=packagetitle, timestamp=timestamp, header=header, major=major, minor=minor, bugfix=bugfix, rel=release, debug=debug) def _generate_git_header(packagename, version, githash): """ Generates a header to the version.py module that includes utilities for probing the git repository for updates (to the current git hash, etc.) These utilities should only be available in development versions, and not in release builds. If this fails for any reason an empty string is returned. """ loader = pkgutil.get_loader(git_helpers) source = loader.get_source(git_helpers.__name__) or '' source_lines = source.splitlines() if not source_lines: log.warn('Cannot get source code for astropy_helpers.git_helpers; ' 'git support disabled.') return '' idx = 0 for idx, line in enumerate(source_lines): if line.startswith('# BEGIN'): break git_helpers_py = '\n'.join(source_lines[idx + 1:]) if PY3: verstr = version else: # In Python 2 don't pass in a unicode string; otherwise verstr will # be represented with u'' syntax which breaks on Python 3.x with x # < 3. This is only an issue when developing on multiple Python # versions at once verstr = version.encode('utf8') new_githash = git_helpers.get_git_devstr(sha=True, show_warning=False) if new_githash: githash = new_githash return _FROZEN_VERSION_PY_WITH_GIT_HEADER.format( git_helpers=git_helpers_py, packagename=packagename, verstr=verstr, githash=githash) def generate_version_py(packagename, version, release=None, debug=None, uses_git=True, srcdir='.'): """Regenerate the version.py module if necessary.""" try: version_module = get_pkg_version_module(packagename) try: last_generated_version = version_module._last_generated_version except AttributeError: last_generated_version = version_module.version try: last_githash = version_module._last_githash except AttributeError: last_githash = version_module.githash current_release = version_module.release current_debug = version_module.debug except ImportError: version_module = None last_generated_version = None last_githash = None current_release = None current_debug = None if release is None: # Keep whatever the current value is, if it exists release = bool(current_release) if debug is None: # Likewise, keep whatever the current value is, if it exists debug = bool(current_debug) version_py = os.path.join(srcdir, packagename, 'version.py') if (last_generated_version != version or current_release != release or current_debug != debug): if '-q' not in sys.argv and '--quiet' not in sys.argv: log.set_threshold(log.INFO) if is_distutils_display_option(): # Always silence unnecessary log messages when display options are # being used log.set_threshold(log.WARN) log.info('Freezing version number to {0}'.format(version_py)) with open(version_py, 'w') as f: # This overwrites the actual version.py f.write(_get_version_py_str(packagename, version, last_githash, release, debug, uses_git=uses_git)) invalidate_caches() if version_module: imp.reload(version_module) def get_pkg_version_module(packagename, fromlist=None): """Returns the package's .version module generated by `astropy_helpers.version_helpers.generate_version_py`. Raises an ImportError if the version module is not found. If ``fromlist`` is an iterable, return a tuple of the members of the version module corresponding to the member names given in ``fromlist``. Raises an `AttributeError` if any of these module members are not found. """ if not fromlist: # Due to a historical quirk of Python's import implementation, # __import__ will not return submodules of a package if 'fromlist' is # empty. # TODO: For Python 3.1 and up it may be preferable to use importlib # instead of the __import__ builtin return __import__(packagename + '.version', fromlist=['']) else: mod = __import__(packagename + '.version', fromlist=fromlist) return tuple(getattr(mod, member) for member in fromlist) sunpy-0.8.3/astropy_helpers/astropy_helpers.egg-info/0000755000175000017500000000000013232563477023250 5ustar nabilnabil00000000000000sunpy-0.8.3/astropy_helpers/astropy_helpers.egg-info/PKG-INFO0000644000175000001440000000760113232323462023323 0ustar nabil00000000000000Metadata-Version: 1.1 Name: astropy-helpers Version: 2.0.2 Summary: Utilities for building and installing Astropy, Astropy affiliated packages, and their respective documentation. Home-page: https://github.com/astropy/astropy-helpers Author: The Astropy Developers Author-email: astropy.team@gmail.com License: BSD Description-Content-Type: UNKNOWN Description: astropy-helpers =============== * Stable versions: https://pypi.org/project/astropy-helpers/ * Development version, issue tracker: https://github.com/astropy/astropy-helpers This project provides a Python package, ``astropy_helpers``, which includes many build, installation, and documentation-related tools used by the Astropy project, but packaged separately for use by other projects that wish to leverage this work. The motivation behind this package and details of its implementation are in the accepted `Astropy Proposal for Enhancement (APE) 4 `_. The ``astropy_helpers.extern`` sub-module includes modules developed elsewhere that are bundled here for convenience. At the moment, this consists of the following two sphinx extensions: * `numpydoc `_, a Sphinx extension developed as part of the Numpy project. This is used to parse docstrings in Numpy format * `sphinx-automodapi `_, a Sphinx developed as part of the Astropy project. This used to be developed directly in ``astropy-helpers`` but is now a standalone package. Issues with these sub-modules should be reported in their respective repositories, and we will regularly update the bundled versions to reflect the latest released versions. ``astropy_helpers`` includes a special "bootstrap" module called ``ah_bootstrap.py`` which is intended to be used by a project's setup.py in order to ensure that the ``astropy_helpers`` package is available for build/installation. This is similar to the ``ez_setup.py`` module that is shipped with some projects to bootstrap `setuptools `_. As described in APE4, the version numbers for ``astropy_helpers`` follow the corresponding major/minor version of the `astropy core package `_, but with an independent sequence of micro (bugfix) version numbers. Hence, the initial release is 0.4, in parallel with Astropy v0.4, which will be the first version of Astropy to use ``astropy-helpers``. For examples of how to implement ``astropy-helpers`` in a project, see the ``setup.py`` and ``setup.cfg`` files of the `Affiliated package template `_. .. image:: https://travis-ci.org/astropy/astropy-helpers.svg :target: https://travis-ci.org/astropy/astropy-helpers .. image:: https://coveralls.io/repos/astropy/astropy-helpers/badge.svg :target: https://coveralls.io/r/astropy/astropy-helpers Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers Classifier: Framework :: Setuptools Plugin Classifier: Framework :: Sphinx :: Extension Classifier: Framework :: Sphinx :: Theme Classifier: License :: OSI Approved :: BSD License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 Classifier: Topic :: Software Development :: Build Tools Classifier: Topic :: Software Development :: Libraries :: Python Modules Classifier: Topic :: System :: Archiving :: Packaging sunpy-0.8.3/astropy_helpers/astropy_helpers.egg-info/SOURCES.txt0000644000175000001440000000642513232323462024115 0ustar nabil00000000000000CHANGES.rst LICENSE.rst MANIFEST.in README.rst ah_bootstrap.py ez_setup.py setup.cfg setup.py astropy_helpers/__init__.py astropy_helpers/distutils_helpers.py astropy_helpers/git_helpers.py astropy_helpers/openmp_helpers.py astropy_helpers/setup_helpers.py astropy_helpers/test_helpers.py astropy_helpers/utils.py astropy_helpers/version.py astropy_helpers/version_helpers.py astropy_helpers.egg-info/PKG-INFO astropy_helpers.egg-info/SOURCES.txt astropy_helpers.egg-info/dependency_links.txt astropy_helpers.egg-info/not-zip-safe astropy_helpers.egg-info/top_level.txt astropy_helpers/commands/__init__.py astropy_helpers/commands/_dummy.py astropy_helpers/commands/_test_compat.py astropy_helpers/commands/build_ext.py astropy_helpers/commands/build_py.py astropy_helpers/commands/build_sphinx.py astropy_helpers/commands/install.py astropy_helpers/commands/install_lib.py astropy_helpers/commands/register.py astropy_helpers/commands/setup_package.py astropy_helpers/commands/test.py astropy_helpers/commands/src/compiler.c astropy_helpers/compat/__init__.py astropy_helpers/extern/__init__.py astropy_helpers/extern/setup_package.py astropy_helpers/extern/automodapi/__init__.py astropy_helpers/extern/automodapi/autodoc_enhancements.py astropy_helpers/extern/automodapi/automodapi.py astropy_helpers/extern/automodapi/automodsumm.py astropy_helpers/extern/automodapi/smart_resolver.py astropy_helpers/extern/automodapi/utils.py astropy_helpers/extern/automodapi/templates/autosummary_core/base.rst astropy_helpers/extern/automodapi/templates/autosummary_core/class.rst astropy_helpers/extern/automodapi/templates/autosummary_core/module.rst astropy_helpers/extern/numpydoc/__init__.py astropy_helpers/extern/numpydoc/docscrape.py astropy_helpers/extern/numpydoc/docscrape_sphinx.py astropy_helpers/extern/numpydoc/numpydoc.py astropy_helpers/extern/numpydoc/templates/numpydoc_docstring.rst astropy_helpers/sphinx/__init__.py astropy_helpers/sphinx/conf.py astropy_helpers/sphinx/setup_package.py astropy_helpers/sphinx/ext/__init__.py astropy_helpers/sphinx/ext/changelog_links.py astropy_helpers/sphinx/ext/doctest.py astropy_helpers/sphinx/ext/edit_on_github.py astropy_helpers/sphinx/ext/tocdepthfix.py astropy_helpers/sphinx/ext/tests/__init__.py astropy_helpers/sphinx/local/python2_local_links.inv astropy_helpers/sphinx/local/python3_local_links.inv astropy_helpers/sphinx/themes/bootstrap-astropy/globaltoc.html astropy_helpers/sphinx/themes/bootstrap-astropy/layout.html astropy_helpers/sphinx/themes/bootstrap-astropy/localtoc.html astropy_helpers/sphinx/themes/bootstrap-astropy/searchbox.html astropy_helpers/sphinx/themes/bootstrap-astropy/theme.conf astropy_helpers/sphinx/themes/bootstrap-astropy/static/astropy_linkout.svg astropy_helpers/sphinx/themes/bootstrap-astropy/static/astropy_linkout_20.png astropy_helpers/sphinx/themes/bootstrap-astropy/static/astropy_logo.ico astropy_helpers/sphinx/themes/bootstrap-astropy/static/astropy_logo.svg astropy_helpers/sphinx/themes/bootstrap-astropy/static/astropy_logo_32.png astropy_helpers/sphinx/themes/bootstrap-astropy/static/bootstrap-astropy.css astropy_helpers/sphinx/themes/bootstrap-astropy/static/copybutton.js astropy_helpers/sphinx/themes/bootstrap-astropy/static/sidebar.js licenses/LICENSE_ASTROSCRAPPY.rst licenses/LICENSE_COPYBUTTON.rst licenses/LICENSE_NUMPYDOC.rstsunpy-0.8.3/astropy_helpers/astropy_helpers.egg-info/dependency_links.txt0000644000175000001440000000000113232323462026270 0ustar nabil00000000000000 sunpy-0.8.3/astropy_helpers/astropy_helpers.egg-info/not-zip-safe0000644000175000001440000000000113203277317024455 0ustar nabil00000000000000 sunpy-0.8.3/astropy_helpers/astropy_helpers.egg-info/top_level.txt0000644000175000001440000000002013232323462024744 0ustar nabil00000000000000astropy_helpers sunpy-0.8.3/astropy_helpers/licenses/0000755000175000017500000000000013232563477020140 5ustar nabilnabil00000000000000sunpy-0.8.3/astropy_helpers/licenses/LICENSE_ASTROSCRAPPY.rst0000644000175000001440000000315413203277317022750 0ustar nabil00000000000000# The OpenMP helpers include code heavily adapted from astroscrappy, released # under the following license: # # Copyright (c) 2015, Curtis McCully # All rights reserved. # # Redistribution and use in source and binary forms, with or without modification, # are permitted provided that the following conditions are met: # # * Redistributions of source code must retain the above copyright notice, this # list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright notice, this # list of conditions and the following disclaimer in the documentation and/or # other materials provided with the distribution. # * Neither the name of the Astropy Team nor the names of its contributors may be # used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON # ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. sunpy-0.8.3/astropy_helpers/licenses/LICENSE_COPYBUTTON.rst0000644000175000001440000000471113203277317022524 0ustar nabil00000000000000Copyright 2014 Python Software Foundation License: PSF PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 -------------------------------------------- . 1. This LICENSE AGREEMENT is between the Python Software Foundation ("PSF"), and the Individual or Organization ("Licensee") accessing and otherwise using this software ("Python") in source or binary form and its associated documentation. . 2. Subject to the terms and conditions of this License Agreement, PSF hereby grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of copyright, i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Python Software Foundation; All Rights Reserved" are retained in Python alone or in any derivative version prepared by Licensee. . 3. In the event Licensee prepares a derivative work that is based on or incorporates Python or any part thereof, and wants to make the derivative work available to others as provided herein, then Licensee hereby agrees to include in any such work a brief summary of the changes made to Python. . 4. PSF is making Python available to Licensee on an "AS IS" basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. . 5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. . 6. This License Agreement will automatically terminate upon a material breach of its terms and conditions. . 7. Nothing in this License Agreement shall be deemed to create any relationship of agency, partnership, or joint venture between PSF and Licensee. This License Agreement does not grant permission to use PSF trademarks or trade name in a trademark sense to endorse or promote products or services of Licensee, or any third party. . 8. By copying, installing or otherwise using Python, Licensee agrees to be bound by the terms and conditions of this License Agreement. sunpy-0.8.3/astropy_helpers/licenses/LICENSE_NUMPYDOC.rst0000644000175000001440000001350713203277317022257 0ustar nabil00000000000000------------------------------------------------------------------------------- The files - numpydoc.py - docscrape.py - docscrape_sphinx.py - phantom_import.py have the following license: Copyright (C) 2008 Stefan van der Walt , Pauli Virtanen Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------------- The files - compiler_unparse.py - comment_eater.py - traitsdoc.py have the following license: This software is OSI Certified Open Source Software. OSI Certified is a certification mark of the Open Source Initiative. Copyright (c) 2006, Enthought, Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Enthought, Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------------- The file - plot_directive.py originates from Matplotlib (http://matplotlib.sf.net/) which has the following license: Copyright (c) 2002-2008 John D. Hunter; All Rights Reserved. 1. This LICENSE AGREEMENT is between John D. Hunter (“JDH”), and the Individual or Organization (“Licensee”) accessing and otherwise using matplotlib software in source or binary form and its associated documentation. 2. Subject to the terms and conditions of this License Agreement, JDH hereby grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use matplotlib 0.98.3 alone or in any derivative version, provided, however, that JDH’s License Agreement and JDH’s notice of copyright, i.e., “Copyright (c) 2002-2008 John D. Hunter; All Rights Reserved” are retained in matplotlib 0.98.3 alone or in any derivative version prepared by Licensee. 3. In the event Licensee prepares a derivative work that is based on or incorporates matplotlib 0.98.3 or any part thereof, and wants to make the derivative work available to others as provided herein, then Licensee hereby agrees to include in any such work a brief summary of the changes made to matplotlib 0.98.3. 4. JDH is making matplotlib 0.98.3 available to Licensee on an “AS IS” basis. JDH MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, JDH MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF MATPLOTLIB 0.98.3 WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. 5. JDH SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF MATPLOTLIB 0.98.3 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING MATPLOTLIB 0.98.3, OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. 6. This License Agreement will automatically terminate upon a material breach of its terms and conditions. 7. Nothing in this License Agreement shall be deemed to create any relationship of agency, partnership, or joint venture between JDH and Licensee. This License Agreement does not grant permission to use JDH trademarks or trade name in a trademark sense to endorse or promote products or services of Licensee, or any third party. 8. By copying, installing or otherwise using matplotlib 0.98.3, Licensee agrees to be bound by the terms and conditions of this License Agreement. sunpy-0.8.3/astropy_helpers/CHANGES.rst0000644000175000001440000003744613212200427017116 0ustar nabil00000000000000astropy-helpers Changelog ************************* 2.0.2 (2017-10-13) ------------------ - Added new helper function add_openmp_flags_if_available that can add OpenMP compilation flags to a C/Cython extension if needed. [#346] - Update numpydoc to v0.7. [#343] - The function ``get_git_devstr`` now returns ``'0'`` instead of ``None`` when no git repository is present. This allows generation of development version strings that are in a format that ``setuptools`` expects (e.g. "1.1.3.dev0" instead of "1.1.3.dev"). [#330] - It is now possible to override generated timestamps to make builds reproducible by setting the ``SOURCE_DATE_EPOCH`` environment variable [#341] - Mark Sphinx extensions as parallel-safe. [#344] - Switch to using mathjax instead of imgmath for local builds. [#342] - Deprecate ``exclude`` parameter of various functions in setup_helpers since it could not work as intended. Add new function ``add_exclude_packages`` to provide intended behavior. [#331] - Allow custom Sphinx doctest extension to recognize and process standard doctest directives ``testsetup`` and ``doctest``. [#335] 2.0.1 (2017-07-28) ------------------ - Fix compatibility with Sphinx <1.5. [#326] 2.0 (2017-07-06) ---------------- - Add support for package that lies in a subdirectory. [#249] - Removing ``compat.subprocess``. [#298] - Python 3.3 is no longer supported. [#300] - The 'automodapi' Sphinx extension (and associated dependencies) has now been moved to a standalone package which can be found at https://github.com/astropy/sphinx-automodapi - this is now bundled in astropy-helpers under astropy_helpers.extern.automodapi for convenience. Version shipped with astropy-helpers is v0.6. [#278, #303, #309, #323] - The ``numpydoc`` Sphinx extension has now been moved to ``astropy_helpers.extern``. [#278] - Fix ``build_docs`` error catching, so it doesn't hide Sphinx errors. [#292] - Fix compatibility with Sphinx 1.6. [#318] - Updating ez_setup.py to the last version before it's removal. [#321] 1.3.1 (2017-03-18) ------------------ - Fixed the missing button to hide output in documentation code blocks. [#287] - Fixed bug when ``build_docs`` when running with the clean (-l) option. [#289] - Add alternative location for various intersphinx inventories to fall back to. [#293] 1.3 (2016-12-16) ---------------- - ``build_sphinx`` has been deprecated in favor of the ``build_docs`` command. [#246] - Force the use of Cython's old ``build_ext`` command. A new ``build_ext`` command was added in Cython 0.25, but it does not work with astropy-helpers currently. [#261] 1.2 (2016-06-18) ---------------- - Added sphinx configuration value ``automodsumm_inherited_members``. If ``True`` this will include members that are inherited from a base class in the generated API docs. Defaults to ``False`` which matches the previous behavior. [#215] - Fixed ``build_sphinx`` to recognize builds that succeeded but have output *after* the "build succeeded." statement. This only applies when ``--warnings-returncode`` is given (which is primarily relevant for Travis documentation builds). [#223] - Fixed ``build_sphinx`` the sphinx extensions to not output a spurious warning for sphinx versions > 1.4. [#229] - Add Python version dependent local sphinx inventories that contain otherwise missing references. [#216] - ``astropy_helpers`` now require Sphinx 1.3 or later. [#226] 1.1.2 (2016-03-9) ----------------- - The CSS for the sphinx documentation was altered to prevent some text overflow problems. [#217] 1.1.1 (2015-12-23) ------------------ - Fixed crash in build with ``AttributeError: cython_create_listing`` with older versions of setuptools. [#209, #210] 1.1 (2015-12-10) ---------------- - The original ``AstropyTest`` class in ``astropy_helpers``, which implements the ``setup.py test`` command, is deprecated in favor of moving the implementation of that command closer to the actual Astropy test runner in ``astropy.tests``. Now a dummy ``test`` command is provided solely for informing users that they need ``astropy`` installed to run the tests (however, the previous, now deprecated implementation is still provided and continues to work with older versions of Astropy). See the related issue for more details. [#184] - Added a useful new utility function to ``astropy_helpers.utils`` called ``find_data_files``. This is similar to the ``find_packages`` function in setuptools in that it can be used to search a package for data files (matching a pattern) that can be passed to the ``package_data`` argument for ``setup()``. See the docstring to ``astropy_helpers.utils.find_data_files`` for more details. [#42] - The ``astropy_helpers`` module now sets the global ``_ASTROPY_SETUP_`` flag upon import (from within a ``setup.py``) script, so it's not necessary to have this in the ``setup.py`` script explicitly. If in doubt though, there's no harm in setting it twice. Putting it in ``astropy_helpers`` just ensures that any other imports that occur during build will have this flag set. [#191] - It is now possible to use Cython as a ``setup_requires`` build requirement, and still build Cython extensions even if Cython wasn't available at the beginning of the build processes (that is, is automatically downloaded via setuptools' processing of ``setup_requires``). [#185] - Moves the ``adjust_compiler`` check into the ``build_ext`` command itself, so it's only used when actually building extension modules. This also deprecates the stand-alone ``adjust_compiler`` function. [#76] - When running the ``build_sphinx`` / ``build_docs`` command with the ``-w`` option, the output from Sphinx is streamed as it runs instead of silently buffering until the doc build is complete. [#197] 1.0.7 (unreleased) ------------------ - Fix missing import in ``astropy_helpers/utils.py``. [#196] 1.0.6 (2015-12-04) ------------------ - Fixed bug where running ``./setup.py build_sphinx`` could return successfully even when the build was not successful (and should have returned a non-zero error code). [#199] 1.0.5 (2015-10-02) ------------------ - Fixed a regression in the ``./setup.py test`` command that was introduced in v1.0.4. 1.0.4 (2015-10-02) ------------------ - Fixed issue with the sphinx documentation css where the line numbers for code blocks were not aligned with the code. [#179, #180] - Fixed crash that could occur when trying to build Cython extension modules when Cython isn't installed. Normally this still results in a failed build, but was supposed to provide a useful error message rather than crash outright (this was a regression introduced in v1.0.3). [#181] - Fixed a crash that could occur on Python 3 when a working C compiler isn't found. [#182] - Quieted warnings about deprecated Numpy API in Cython extensions, when building Cython extensions against Numpy >= 1.7. [#183, #186] - Improved support for py.test >= 2.7--running the ``./setup.py test`` command now copies all doc pages into the temporary test directory as well, so that all test files have a "common root directory". [#189, #190] 1.0.3 (2015-07-22) ------------------ - Added workaround for sphinx-doc/sphinx#1843, a but in Sphinx which prevented descriptor classes with a custom metaclass from being documented correctly. [#158] - Added an alias for the ``./setup.py build_sphinx`` command as ``./setup.py build_docs`` which, to a new contributor, should hopefully be less cryptic. [#161] - The fonts in graphviz diagrams now match the font of the HTML content. [#169] - When the documentation is built on readthedocs.org, MathJax will be used for math rendering. When built elsewhere, the "pngmath" extension is still used for math rendering. [#170] - Fix crash when importing astropy_helpers when running with ``python -OO`` [#171] - The ``build`` and ``build_ext`` stages now correctly recognize the presence of C++ files in Cython extensions (previously only vanilla C worked). [#173] 1.0.2 (2015-04-02) ------------------ - Various fixes enabling the astropy-helpers Sphinx build command and Sphinx extensions to work with Sphinx 1.3. [#148] - More improvement to the ability to handle multiple versions of astropy-helpers being imported in the same Python interpreter session in the (somewhat rare) case of nested installs. [#147] - To better support high resolution displays, use SVG for the astropy logo and linkout image, falling back to PNGs for browsers that support it. [#150, #151] - Improve ``setup_helpers.get_compiler_version`` to work with more compilers, and to return more info. This will help fix builds of Astropy on less common compilers, like Sun C. [#153] 1.0.1 (2015-03-04) ------------------ - Released in concert with v0.4.8 to address the same issues. 0.4.8 (2015-03-04) ------------------ - Improved the ``ah_bootstrap`` script's ability to override existing installations of astropy-helpers with new versions in the context of installing multiple packages simultaneously within the same Python interpreter (e.g. when one package has in its ``setup_requires`` another package that uses a different version of astropy-helpers. [#144] - Added a workaround to an issue in matplotlib that can, in rare cases, lead to a crash when installing packages that import matplotlib at build time. [#144] 1.0 (2015-02-17) ---------------- - Added new pre-/post-command hook points for ``setup.py`` commands. Now any package can define code to run before and/or after any ``setup.py`` command without having to manually subclass that command by adding ``pre__hook`` and ``post__hook`` callables to the package's ``setup_package.py`` module. See the PR for more details. [#112] - The following objects in the ``astropy_helpers.setup_helpers`` module have been relocated: - ``get_dummy_distribution``, ``get_distutils_*``, ``get_compiler_option``, ``add_command_option``, ``is_distutils_display_option`` -> ``astropy_helpers.distutils_helpers`` - ``should_build_with_cython``, ``generate_build_ext_command`` -> ``astropy_helpers.commands.build_ext`` - ``AstropyBuildPy`` -> ``astropy_helpers.commands.build_py`` - ``AstropyBuildSphinx`` -> ``astropy_helpers.commands.build_sphinx`` - ``AstropyInstall`` -> ``astropy_helpers.commands.install`` - ``AstropyInstallLib`` -> ``astropy_helpers.commands.install_lib`` - ``AstropyRegister`` -> ``astropy_helpers.commands.register`` - ``get_pkg_version_module`` -> ``astropy_helpers.version_helpers`` - ``write_if_different``, ``import_file``, ``get_numpy_include_path`` -> ``astropy_helpers.utils`` All of these are "soft" deprecations in the sense that they are still importable from ``astropy_helpers.setup_helpers`` for now, and there is no (easy) way to produce deprecation warnings when importing these objects from ``setup_helpers`` rather than directly from the modules they are defined in. But please consider updating any imports to these objects. [#110] - Use of the ``astropy.sphinx.ext.astropyautosummary`` extension is deprecated for use with Sphinx < 1.2. Instead it should suffice to remove this extension for the ``extensions`` list in your ``conf.py`` and add the stock ``sphinx.ext.autosummary`` instead. [#131] 0.4.7 (2015-02-17) ------------------ - Fixed incorrect/missing git hash being added to the generated ``version.py`` when creating a release. [#141] 0.4.6 (2015-02-16) ------------------ - Fixed problems related to the automatically generated _compiler module not being created properly. [#139] 0.4.5 (2015-02-11) ------------------ - Fixed an issue where ah_bootstrap.py could blow up when astropy_helper's version number is 1.0. - Added a workaround for documentation of properties in the rare case where the class's metaclass has a property of the same name. [#130] - Fixed an issue on Python 3 where importing a package using astropy-helper's generated version.py module would crash when the current working directory is an empty git repository. [#114, #137] - Fixed an issue where the "revision count" appended to .dev versions by the generated version.py did not accurately reflect the revision count for the package it belongs to, and could be invalid if the current working directory is an unrelated git repository. [#107, #137] - Likewise, fixed a confusing warning message that could occur in the same circumstances as the above issue. [#121, #137] 0.4.4 (2014-12-31) ------------------ - More improvements for building the documentation using Python 3.x. [#100] - Additional minor fixes to Python 3 support. [#115] - Updates to support new test features in Astropy [#92, #106] 0.4.3 (2014-10-22) ------------------ - The generated ``version.py`` file now preserves the git hash of installed copies of the package as well as when building a source distribution. That is, the git hash of the changeset that was installed/released is preserved. [#87] - In smart resolver add resolution for class links when they exist in the intersphinx inventory, but not the mapping of the current package (e.g. when an affiliated package uses an astropy core class of which "actual" and "documented" location differs) [#88] - Fixed a bug that could occur when running ``setup.py`` for the first time in a repository that uses astropy-helpers as a submodule: ``AttributeError: 'NoneType' object has no attribute 'mkdtemp'`` [#89] - Fixed a bug where optional arguments to the ``doctest-skip`` Sphinx directive were sometimes being left in the generated documentation output. [#90] - Improved support for building the documentation using Python 3.x. [#96] - Avoid error message if .git directory is not present. [#91] 0.4.2 (2014-08-09) ------------------ - Fixed some CSS issues in generated API docs. [#69] - Fixed the warning message that could be displayed when generating a version number with some older versions of git. [#77] - Fixed automodsumm to work with new versions of Sphinx (>= 1.2.2). [#80] 0.4.1 (2014-08-08) ------------------ - Fixed git revision count on systems with git versions older than v1.7.2. [#70] - Fixed display of warning text when running a git command fails (previously the output of stderr was not being decoded properly). [#70] - The ``--offline`` flag to ``setup.py`` understood by ``ah_bootstrap.py`` now also prevents git from going online to fetch submodule updates. [#67] - The Sphinx extension for converting issue numbers to links in the changelog now supports working on arbitrary pages via a new ``conf.py`` setting: ``changelog_links_docpattern``. By default it affects the ``changelog`` and ``whatsnew`` pages in one's Sphinx docs. [#61] - Fixed crash that could result from users with missing/misconfigured locale settings. [#58] - The font used for code examples in the docs is now the system-defined ``monospace`` font, rather than ``Minaco``, which is not available on all platforms. [#50] 0.4 (2014-07-15) ---------------- - Initial release of astropy-helpers. See `APE4 `_ for details of the motivation and design of this package. - The ``astropy_helpers`` package replaces the following modules in the ``astropy`` package: - ``astropy.setup_helpers`` -> ``astropy_helpers.setup_helpers`` - ``astropy.version_helpers`` -> ``astropy_helpers.version_helpers`` - ``astropy.sphinx`` - > ``astropy_helpers.sphinx`` These modules should be considered deprecated in ``astropy``, and any new, non-critical changes to those modules will be made in ``astropy_helpers`` instead. Affiliated packages wishing to make use those modules (as in the Astropy package-template) should use the versions from ``astropy_helpers`` instead, and include the ``ah_bootstrap.py`` script in their project, for bootstrapping the ``astropy_helpers`` package in their setup.py script. sunpy-0.8.3/astropy_helpers/CONTRIBUTING.md0000644000175000001440000000216513203277317017547 0ustar nabil00000000000000Contributing to astropy-helpers =============================== The guidelines for contributing to ``astropy-helpers`` are generally the same as the [contributing guidelines for the astropy core package](http://github.com/astropy/astropy/blob/master/CONTRIBUTING.md). Basically, report relevant issues in the ``astropy-helpers`` issue tracker, and we welcome pull requests that broadly follow the [Astropy coding guidelines](http://docs.astropy.org/en/latest/development/codeguide.html). The key subtlety lies in understanding the relationship between ``astropy`` and ``astropy-helpers``. This package contains the build, installation, and documentation tools used by astropy. It also includes support for the ``setup.py test`` command, though Astropy is still required for this to function (it does not currently include the full Astropy test runner). So issues or improvements to that functionality should be addressed in this package. Any other aspect of the [astropy core package](http://github.com/astropy/astropy) (or any other package that uses ``astropy-helpers``) should be addressed in the github repository for that package. sunpy-0.8.3/astropy_helpers/LICENSE.rst0000644000175000001440000000272313203277317017132 0ustar nabil00000000000000Copyright (c) 2014, Astropy Developers All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the Astropy Team nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. sunpy-0.8.3/astropy_helpers/MANIFEST.in0000644000175000001440000000030013203277317017041 0ustar nabil00000000000000include README.rst include CHANGES.rst include LICENSE.rst recursive-include licenses * include ez_setup.py include ah_bootstrap.py exclude *.pyc *.o prune build prune astropy_helpers/tests sunpy-0.8.3/astropy_helpers/README.rst0000644000175000001440000000502113212200427016763 0ustar nabil00000000000000astropy-helpers =============== * Stable versions: https://pypi.org/project/astropy-helpers/ * Development version, issue tracker: https://github.com/astropy/astropy-helpers This project provides a Python package, ``astropy_helpers``, which includes many build, installation, and documentation-related tools used by the Astropy project, but packaged separately for use by other projects that wish to leverage this work. The motivation behind this package and details of its implementation are in the accepted `Astropy Proposal for Enhancement (APE) 4 `_. The ``astropy_helpers.extern`` sub-module includes modules developed elsewhere that are bundled here for convenience. At the moment, this consists of the following two sphinx extensions: * `numpydoc `_, a Sphinx extension developed as part of the Numpy project. This is used to parse docstrings in Numpy format * `sphinx-automodapi `_, a Sphinx developed as part of the Astropy project. This used to be developed directly in ``astropy-helpers`` but is now a standalone package. Issues with these sub-modules should be reported in their respective repositories, and we will regularly update the bundled versions to reflect the latest released versions. ``astropy_helpers`` includes a special "bootstrap" module called ``ah_bootstrap.py`` which is intended to be used by a project's setup.py in order to ensure that the ``astropy_helpers`` package is available for build/installation. This is similar to the ``ez_setup.py`` module that is shipped with some projects to bootstrap `setuptools `_. As described in APE4, the version numbers for ``astropy_helpers`` follow the corresponding major/minor version of the `astropy core package `_, but with an independent sequence of micro (bugfix) version numbers. Hence, the initial release is 0.4, in parallel with Astropy v0.4, which will be the first version of Astropy to use ``astropy-helpers``. For examples of how to implement ``astropy-helpers`` in a project, see the ``setup.py`` and ``setup.cfg`` files of the `Affiliated package template `_. .. image:: https://travis-ci.org/astropy/astropy-helpers.svg :target: https://travis-ci.org/astropy/astropy-helpers .. image:: https://coveralls.io/repos/astropy/astropy-helpers/badge.svg :target: https://coveralls.io/r/astropy/astropy-helpers sunpy-0.8.3/astropy_helpers/ah_bootstrap.py0000644000175000001440000010434413203277317020357 0ustar nabil00000000000000""" This bootstrap module contains code for ensuring that the astropy_helpers package will be importable by the time the setup.py script runs. It also includes some workarounds to ensure that a recent-enough version of setuptools is being used for the installation. This module should be the first thing imported in the setup.py of distributions that make use of the utilities in astropy_helpers. If the distribution ships with its own copy of astropy_helpers, this module will first attempt to import from the shipped copy. However, it will also check PyPI to see if there are any bug-fix releases on top of the current version that may be useful to get past platform-specific bugs that have been fixed. When running setup.py, use the ``--offline`` command-line option to disable the auto-upgrade checks. When this module is imported or otherwise executed it automatically calls a main function that attempts to read the project's setup.cfg file, which it checks for a configuration section called ``[ah_bootstrap]`` the presences of that section, and options therein, determine the next step taken: If it contains an option called ``auto_use`` with a value of ``True``, it will automatically call the main function of this module called `use_astropy_helpers` (see that function's docstring for full details). Otherwise no further action is taken (however, ``ah_bootstrap.use_astropy_helpers`` may be called manually from within the setup.py script). Additional options in the ``[ah_boostrap]`` section of setup.cfg have the same names as the arguments to `use_astropy_helpers`, and can be used to configure the bootstrap script when ``auto_use = True``. See https://github.com/astropy/astropy-helpers for more details, and for the latest version of this module. """ import contextlib import errno import imp import io import locale import os import re import subprocess as sp import sys try: from ConfigParser import ConfigParser, RawConfigParser except ImportError: from configparser import ConfigParser, RawConfigParser if sys.version_info[0] < 3: _str_types = (str, unicode) _text_type = unicode PY3 = False else: _str_types = (str, bytes) _text_type = str PY3 = True # What follows are several import statements meant to deal with install-time # issues with either missing or misbehaving pacakges (including making sure # setuptools itself is installed): # Some pre-setuptools checks to ensure that either distribute or setuptools >= # 0.7 is used (over pre-distribute setuptools) if it is available on the path; # otherwise the latest setuptools will be downloaded and bootstrapped with # ``ez_setup.py``. This used to be included in a separate file called # setuptools_bootstrap.py; but it was combined into ah_bootstrap.py try: import pkg_resources _setuptools_req = pkg_resources.Requirement.parse('setuptools>=0.7') # This may raise a DistributionNotFound in which case no version of # setuptools or distribute is properly installed _setuptools = pkg_resources.get_distribution('setuptools') if _setuptools not in _setuptools_req: # Older version of setuptools; check if we have distribute; again if # this results in DistributionNotFound we want to give up _distribute = pkg_resources.get_distribution('distribute') if _setuptools != _distribute: # It's possible on some pathological systems to have an old version # of setuptools and distribute on sys.path simultaneously; make # sure distribute is the one that's used sys.path.insert(1, _distribute.location) _distribute.activate() imp.reload(pkg_resources) except: # There are several types of exceptions that can occur here; if all else # fails bootstrap and use the bootstrapped version from ez_setup import use_setuptools use_setuptools() # typing as a dependency for 1.6.1+ Sphinx causes issues when imported after # initializing submodule with ah_boostrap.py # See discussion and references in # https://github.com/astropy/astropy-helpers/issues/302 try: import typing # noqa except ImportError: pass # Note: The following import is required as a workaround to # https://github.com/astropy/astropy-helpers/issues/89; if we don't import this # module now, it will get cleaned up after `run_setup` is called, but that will # later cause the TemporaryDirectory class defined in it to stop working when # used later on by setuptools try: import setuptools.py31compat # noqa except ImportError: pass # matplotlib can cause problems if it is imported from within a call of # run_setup(), because in some circumstances it will try to write to the user's # home directory, resulting in a SandboxViolation. See # https://github.com/matplotlib/matplotlib/pull/4165 # Making sure matplotlib, if it is available, is imported early in the setup # process can mitigate this (note importing matplotlib.pyplot has the same # issue) try: import matplotlib matplotlib.use('Agg') import matplotlib.pyplot except: # Ignore if this fails for *any* reason* pass # End compatibility imports... # In case it didn't successfully import before the ez_setup checks import pkg_resources from setuptools import Distribution from setuptools.package_index import PackageIndex from setuptools.sandbox import run_setup from distutils import log from distutils.debug import DEBUG # TODO: Maybe enable checking for a specific version of astropy_helpers? DIST_NAME = 'astropy-helpers' PACKAGE_NAME = 'astropy_helpers' # Defaults for other options DOWNLOAD_IF_NEEDED = True INDEX_URL = 'https://pypi.python.org/simple' USE_GIT = True OFFLINE = False AUTO_UPGRADE = True # A list of all the configuration options and their required types CFG_OPTIONS = [ ('auto_use', bool), ('path', str), ('download_if_needed', bool), ('index_url', str), ('use_git', bool), ('offline', bool), ('auto_upgrade', bool) ] class _Bootstrapper(object): """ Bootstrapper implementation. See ``use_astropy_helpers`` for parameter documentation. """ def __init__(self, path=None, index_url=None, use_git=None, offline=None, download_if_needed=None, auto_upgrade=None): if path is None: path = PACKAGE_NAME if not (isinstance(path, _str_types) or path is False): raise TypeError('path must be a string or False') if PY3 and not isinstance(path, _text_type): fs_encoding = sys.getfilesystemencoding() path = path.decode(fs_encoding) # path to unicode self.path = path # Set other option attributes, using defaults where necessary self.index_url = index_url if index_url is not None else INDEX_URL self.offline = offline if offline is not None else OFFLINE # If offline=True, override download and auto-upgrade if self.offline: download_if_needed = False auto_upgrade = False self.download = (download_if_needed if download_if_needed is not None else DOWNLOAD_IF_NEEDED) self.auto_upgrade = (auto_upgrade if auto_upgrade is not None else AUTO_UPGRADE) # If this is a release then the .git directory will not exist so we # should not use git. git_dir_exists = os.path.exists(os.path.join(os.path.dirname(__file__), '.git')) if use_git is None and not git_dir_exists: use_git = False self.use_git = use_git if use_git is not None else USE_GIT # Declared as False by default--later we check if astropy-helpers can be # upgraded from PyPI, but only if not using a source distribution (as in # the case of import from a git submodule) self.is_submodule = False @classmethod def main(cls, argv=None): if argv is None: argv = sys.argv config = cls.parse_config() config.update(cls.parse_command_line(argv)) auto_use = config.pop('auto_use', False) bootstrapper = cls(**config) if auto_use: # Run the bootstrapper, otherwise the setup.py is using the old # use_astropy_helpers() interface, in which case it will run the # bootstrapper manually after reconfiguring it. bootstrapper.run() return bootstrapper @classmethod def parse_config(cls): if not os.path.exists('setup.cfg'): return {} cfg = ConfigParser() try: cfg.read('setup.cfg') except Exception as e: if DEBUG: raise log.error( "Error reading setup.cfg: {0!r}\n{1} will not be " "automatically bootstrapped and package installation may fail." "\n{2}".format(e, PACKAGE_NAME, _err_help_msg)) return {} if not cfg.has_section('ah_bootstrap'): return {} config = {} for option, type_ in CFG_OPTIONS: if not cfg.has_option('ah_bootstrap', option): continue if type_ is bool: value = cfg.getboolean('ah_bootstrap', option) else: value = cfg.get('ah_bootstrap', option) config[option] = value return config @classmethod def parse_command_line(cls, argv=None): if argv is None: argv = sys.argv config = {} # For now we just pop recognized ah_bootstrap options out of the # arg list. This is imperfect; in the unlikely case that a setup.py # custom command or even custom Distribution class defines an argument # of the same name then we will break that. However there's a catch22 # here that we can't just do full argument parsing right here, because # we don't yet know *how* to parse all possible command-line arguments. if '--no-git' in argv: config['use_git'] = False argv.remove('--no-git') if '--offline' in argv: config['offline'] = True argv.remove('--offline') return config def run(self): strategies = ['local_directory', 'local_file', 'index'] dist = None # First, remove any previously imported versions of astropy_helpers; # this is necessary for nested installs where one package's installer # is installing another package via setuptools.sandbox.run_setup, as in # the case of setup_requires for key in list(sys.modules): try: if key == PACKAGE_NAME or key.startswith(PACKAGE_NAME + '.'): del sys.modules[key] except AttributeError: # Sometimes mysterious non-string things can turn up in # sys.modules continue # Check to see if the path is a submodule self.is_submodule = self._check_submodule() for strategy in strategies: method = getattr(self, 'get_{0}_dist'.format(strategy)) dist = method() if dist is not None: break else: raise _AHBootstrapSystemExit( "No source found for the {0!r} package; {0} must be " "available and importable as a prerequisite to building " "or installing this package.".format(PACKAGE_NAME)) # This is a bit hacky, but if astropy_helpers was loaded from a # directory/submodule its Distribution object gets a "precedence" of # "DEVELOP_DIST". However, in other cases it gets a precedence of # "EGG_DIST". However, when activing the distribution it will only be # placed early on sys.path if it is treated as an EGG_DIST, so always # do that dist = dist.clone(precedence=pkg_resources.EGG_DIST) # Otherwise we found a version of astropy-helpers, so we're done # Just active the found distribution on sys.path--if we did a # download this usually happens automatically but it doesn't hurt to # do it again # Note: Adding the dist to the global working set also activates it # (makes it importable on sys.path) by default. try: pkg_resources.working_set.add(dist, replace=True) except TypeError: # Some (much) older versions of setuptools do not have the # replace=True option here. These versions are old enough that all # bets may be off anyways, but it's easy enough to work around just # in case... if dist.key in pkg_resources.working_set.by_key: del pkg_resources.working_set.by_key[dist.key] pkg_resources.working_set.add(dist) @property def config(self): """ A `dict` containing the options this `_Bootstrapper` was configured with. """ return dict((optname, getattr(self, optname)) for optname, _ in CFG_OPTIONS if hasattr(self, optname)) def get_local_directory_dist(self): """ Handle importing a vendored package from a subdirectory of the source distribution. """ if not os.path.isdir(self.path): return log.info('Attempting to import astropy_helpers from {0} {1!r}'.format( 'submodule' if self.is_submodule else 'directory', self.path)) dist = self._directory_import() if dist is None: log.warn( 'The requested path {0!r} for importing {1} does not ' 'exist, or does not contain a copy of the {1} ' 'package.'.format(self.path, PACKAGE_NAME)) elif self.auto_upgrade and not self.is_submodule: # A version of astropy-helpers was found on the available path, but # check to see if a bugfix release is available on PyPI upgrade = self._do_upgrade(dist) if upgrade is not None: dist = upgrade return dist def get_local_file_dist(self): """ Handle importing from a source archive; this also uses setup_requires but points easy_install directly to the source archive. """ if not os.path.isfile(self.path): return log.info('Attempting to unpack and import astropy_helpers from ' '{0!r}'.format(self.path)) try: dist = self._do_download(find_links=[self.path]) except Exception as e: if DEBUG: raise log.warn( 'Failed to import {0} from the specified archive {1!r}: ' '{2}'.format(PACKAGE_NAME, self.path, str(e))) dist = None if dist is not None and self.auto_upgrade: # A version of astropy-helpers was found on the available path, but # check to see if a bugfix release is available on PyPI upgrade = self._do_upgrade(dist) if upgrade is not None: dist = upgrade return dist def get_index_dist(self): if not self.download: log.warn('Downloading {0!r} disabled.'.format(DIST_NAME)) return None log.warn( "Downloading {0!r}; run setup.py with the --offline option to " "force offline installation.".format(DIST_NAME)) try: dist = self._do_download() except Exception as e: if DEBUG: raise log.warn( 'Failed to download and/or install {0!r} from {1!r}:\n' '{2}'.format(DIST_NAME, self.index_url, str(e))) dist = None # No need to run auto-upgrade here since we've already presumably # gotten the most up-to-date version from the package index return dist def _directory_import(self): """ Import astropy_helpers from the given path, which will be added to sys.path. Must return True if the import succeeded, and False otherwise. """ # Return True on success, False on failure but download is allowed, and # otherwise raise SystemExit path = os.path.abspath(self.path) # Use an empty WorkingSet rather than the man # pkg_resources.working_set, since on older versions of setuptools this # will invoke a VersionConflict when trying to install an upgrade ws = pkg_resources.WorkingSet([]) ws.add_entry(path) dist = ws.by_key.get(DIST_NAME) if dist is None: # We didn't find an egg-info/dist-info in the given path, but if a # setup.py exists we can generate it setup_py = os.path.join(path, 'setup.py') if os.path.isfile(setup_py): with _silence(): run_setup(os.path.join(path, 'setup.py'), ['egg_info']) for dist in pkg_resources.find_distributions(path, True): # There should be only one... return dist return dist def _do_download(self, version='', find_links=None): if find_links: allow_hosts = '' index_url = None else: allow_hosts = None index_url = self.index_url # Annoyingly, setuptools will not handle other arguments to # Distribution (such as options) before handling setup_requires, so it # is not straightforward to programmatically augment the arguments which # are passed to easy_install class _Distribution(Distribution): def get_option_dict(self, command_name): opts = Distribution.get_option_dict(self, command_name) if command_name == 'easy_install': if find_links is not None: opts['find_links'] = ('setup script', find_links) if index_url is not None: opts['index_url'] = ('setup script', index_url) if allow_hosts is not None: opts['allow_hosts'] = ('setup script', allow_hosts) return opts if version: req = '{0}=={1}'.format(DIST_NAME, version) else: req = DIST_NAME attrs = {'setup_requires': [req]} try: if DEBUG: _Distribution(attrs=attrs) else: with _silence(): _Distribution(attrs=attrs) # If the setup_requires succeeded it will have added the new dist to # the main working_set return pkg_resources.working_set.by_key.get(DIST_NAME) except Exception as e: if DEBUG: raise msg = 'Error retrieving {0} from {1}:\n{2}' if find_links: source = find_links[0] elif index_url != INDEX_URL: source = index_url else: source = 'PyPI' raise Exception(msg.format(DIST_NAME, source, repr(e))) def _do_upgrade(self, dist): # Build up a requirement for a higher bugfix release but a lower minor # release (so API compatibility is guaranteed) next_version = _next_version(dist.parsed_version) req = pkg_resources.Requirement.parse( '{0}>{1},<{2}'.format(DIST_NAME, dist.version, next_version)) package_index = PackageIndex(index_url=self.index_url) upgrade = package_index.obtain(req) if upgrade is not None: return self._do_download(version=upgrade.version) def _check_submodule(self): """ Check if the given path is a git submodule. See the docstrings for ``_check_submodule_using_git`` and ``_check_submodule_no_git`` for further details. """ if (self.path is None or (os.path.exists(self.path) and not os.path.isdir(self.path))): return False if self.use_git: return self._check_submodule_using_git() else: return self._check_submodule_no_git() def _check_submodule_using_git(self): """ Check if the given path is a git submodule. If so, attempt to initialize and/or update the submodule if needed. This function makes calls to the ``git`` command in subprocesses. The ``_check_submodule_no_git`` option uses pure Python to check if the given path looks like a git submodule, but it cannot perform updates. """ cmd = ['git', 'submodule', 'status', '--', self.path] try: log.info('Running `{0}`; use the --no-git option to disable git ' 'commands'.format(' '.join(cmd))) returncode, stdout, stderr = run_cmd(cmd) except _CommandNotFound: # The git command simply wasn't found; this is most likely the # case on user systems that don't have git and are simply # trying to install the package from PyPI or a source # distribution. Silently ignore this case and simply don't try # to use submodules return False stderr = stderr.strip() if returncode != 0 and stderr: # Unfortunately the return code alone cannot be relied on, as # earlier versions of git returned 0 even if the requested submodule # does not exist # This is a warning that occurs in perl (from running git submodule) # which only occurs with a malformatted locale setting which can # happen sometimes on OSX. See again # https://github.com/astropy/astropy/issues/2749 perl_warning = ('perl: warning: Falling back to the standard locale ' '("C").') if not stderr.strip().endswith(perl_warning): # Some other unknown error condition occurred log.warn('git submodule command failed ' 'unexpectedly:\n{0}'.format(stderr)) return False # Output of `git submodule status` is as follows: # # 1: Status indicator: '-' for submodule is uninitialized, '+' if # submodule is initialized but is not at the commit currently indicated # in .gitmodules (and thus needs to be updated), or 'U' if the # submodule is in an unstable state (i.e. has merge conflicts) # # 2. SHA-1 hash of the current commit of the submodule (we don't really # need this information but it's useful for checking that the output is # correct) # # 3. The output of `git describe` for the submodule's current commit # hash (this includes for example what branches the commit is on) but # only if the submodule is initialized. We ignore this information for # now _git_submodule_status_re = re.compile( '^(?P[+-U ])(?P[0-9a-f]{40}) ' '(?P\S+)( .*)?$') # The stdout should only contain one line--the status of the # requested submodule m = _git_submodule_status_re.match(stdout) if m: # Yes, the path *is* a git submodule self._update_submodule(m.group('submodule'), m.group('status')) return True else: log.warn( 'Unexpected output from `git submodule status`:\n{0}\n' 'Will attempt import from {1!r} regardless.'.format( stdout, self.path)) return False def _check_submodule_no_git(self): """ Like ``_check_submodule_using_git``, but simply parses the .gitmodules file to determine if the supplied path is a git submodule, and does not exec any subprocesses. This can only determine if a path is a submodule--it does not perform updates, etc. This function may need to be updated if the format of the .gitmodules file is changed between git versions. """ gitmodules_path = os.path.abspath('.gitmodules') if not os.path.isfile(gitmodules_path): return False # This is a minimal reader for gitconfig-style files. It handles a few of # the quirks that make gitconfig files incompatible with ConfigParser-style # files, but does not support the full gitconfig syntax (just enough # needed to read a .gitmodules file). gitmodules_fileobj = io.StringIO() # Must use io.open for cross-Python-compatible behavior wrt unicode with io.open(gitmodules_path) as f: for line in f: # gitconfig files are more flexible with leading whitespace; just # go ahead and remove it line = line.lstrip() # comments can start with either # or ; if line and line[0] in (':', ';'): continue gitmodules_fileobj.write(line) gitmodules_fileobj.seek(0) cfg = RawConfigParser() try: cfg.readfp(gitmodules_fileobj) except Exception as exc: log.warn('Malformatted .gitmodules file: {0}\n' '{1} cannot be assumed to be a git submodule.'.format( exc, self.path)) return False for section in cfg.sections(): if not cfg.has_option(section, 'path'): continue submodule_path = cfg.get(section, 'path').rstrip(os.sep) if submodule_path == self.path.rstrip(os.sep): return True return False def _update_submodule(self, submodule, status): if status == ' ': # The submodule is up to date; no action necessary return elif status == '-': if self.offline: raise _AHBootstrapSystemExit( "Cannot initialize the {0} submodule in --offline mode; " "this requires being able to clone the submodule from an " "online repository.".format(submodule)) cmd = ['update', '--init'] action = 'Initializing' elif status == '+': cmd = ['update'] action = 'Updating' if self.offline: cmd.append('--no-fetch') elif status == 'U': raise _AHBootstrapSystemExit( 'Error: Submodule {0} contains unresolved merge conflicts. ' 'Please complete or abandon any changes in the submodule so that ' 'it is in a usable state, then try again.'.format(submodule)) else: log.warn('Unknown status {0!r} for git submodule {1!r}. Will ' 'attempt to use the submodule as-is, but try to ensure ' 'that the submodule is in a clean state and contains no ' 'conflicts or errors.\n{2}'.format(status, submodule, _err_help_msg)) return err_msg = None cmd = ['git', 'submodule'] + cmd + ['--', submodule] log.warn('{0} {1} submodule with: `{2}`'.format( action, submodule, ' '.join(cmd))) try: log.info('Running `{0}`; use the --no-git option to disable git ' 'commands'.format(' '.join(cmd))) returncode, stdout, stderr = run_cmd(cmd) except OSError as e: err_msg = str(e) else: if returncode != 0: err_msg = stderr if err_msg is not None: log.warn('An unexpected error occurred updating the git submodule ' '{0!r}:\n{1}\n{2}'.format(submodule, err_msg, _err_help_msg)) class _CommandNotFound(OSError): """ An exception raised when a command run with run_cmd is not found on the system. """ def run_cmd(cmd): """ Run a command in a subprocess, given as a list of command-line arguments. Returns a ``(returncode, stdout, stderr)`` tuple. """ try: p = sp.Popen(cmd, stdout=sp.PIPE, stderr=sp.PIPE) # XXX: May block if either stdout or stderr fill their buffers; # however for the commands this is currently used for that is # unlikely (they should have very brief output) stdout, stderr = p.communicate() except OSError as e: if DEBUG: raise if e.errno == errno.ENOENT: msg = 'Command not found: `{0}`'.format(' '.join(cmd)) raise _CommandNotFound(msg, cmd) else: raise _AHBootstrapSystemExit( 'An unexpected error occurred when running the ' '`{0}` command:\n{1}'.format(' '.join(cmd), str(e))) # Can fail of the default locale is not configured properly. See # https://github.com/astropy/astropy/issues/2749. For the purposes under # consideration 'latin1' is an acceptable fallback. try: stdio_encoding = locale.getdefaultlocale()[1] or 'latin1' except ValueError: # Due to an OSX oddity locale.getdefaultlocale() can also crash # depending on the user's locale/language settings. See: # http://bugs.python.org/issue18378 stdio_encoding = 'latin1' # Unlikely to fail at this point but even then let's be flexible if not isinstance(stdout, _text_type): stdout = stdout.decode(stdio_encoding, 'replace') if not isinstance(stderr, _text_type): stderr = stderr.decode(stdio_encoding, 'replace') return (p.returncode, stdout, stderr) def _next_version(version): """ Given a parsed version from pkg_resources.parse_version, returns a new version string with the next minor version. Examples ======== >>> _next_version(pkg_resources.parse_version('1.2.3')) '1.3.0' """ if hasattr(version, 'base_version'): # New version parsing from setuptools >= 8.0 if version.base_version: parts = version.base_version.split('.') else: parts = [] else: parts = [] for part in version: if part.startswith('*'): break parts.append(part) parts = [int(p) for p in parts] if len(parts) < 3: parts += [0] * (3 - len(parts)) major, minor, micro = parts[:3] return '{0}.{1}.{2}'.format(major, minor + 1, 0) class _DummyFile(object): """A noop writeable object.""" errors = '' # Required for Python 3.x encoding = 'utf-8' def write(self, s): pass def flush(self): pass @contextlib.contextmanager def _silence(): """A context manager that silences sys.stdout and sys.stderr.""" old_stdout = sys.stdout old_stderr = sys.stderr sys.stdout = _DummyFile() sys.stderr = _DummyFile() exception_occurred = False try: yield except: exception_occurred = True # Go ahead and clean up so that exception handling can work normally sys.stdout = old_stdout sys.stderr = old_stderr raise if not exception_occurred: sys.stdout = old_stdout sys.stderr = old_stderr _err_help_msg = """ If the problem persists consider installing astropy_helpers manually using pip (`pip install astropy_helpers`) or by manually downloading the source archive, extracting it, and installing by running `python setup.py install` from the root of the extracted source code. """ class _AHBootstrapSystemExit(SystemExit): def __init__(self, *args): if not args: msg = 'An unknown problem occurred bootstrapping astropy_helpers.' else: msg = args[0] msg += '\n' + _err_help_msg super(_AHBootstrapSystemExit, self).__init__(msg, *args[1:]) BOOTSTRAPPER = _Bootstrapper.main() def use_astropy_helpers(**kwargs): """ Ensure that the `astropy_helpers` module is available and is importable. This supports automatic submodule initialization if astropy_helpers is included in a project as a git submodule, or will download it from PyPI if necessary. Parameters ---------- path : str or None, optional A filesystem path relative to the root of the project's source code that should be added to `sys.path` so that `astropy_helpers` can be imported from that path. If the path is a git submodule it will automatically be initialized and/or updated. The path may also be to a ``.tar.gz`` archive of the astropy_helpers source distribution. In this case the archive is automatically unpacked and made temporarily available on `sys.path` as a ``.egg`` archive. If `None` skip straight to downloading. download_if_needed : bool, optional If the provided filesystem path is not found an attempt will be made to download astropy_helpers from PyPI. It will then be made temporarily available on `sys.path` as a ``.egg`` archive (using the ``setup_requires`` feature of setuptools. If the ``--offline`` option is given at the command line the value of this argument is overridden to `False`. index_url : str, optional If provided, use a different URL for the Python package index than the main PyPI server. use_git : bool, optional If `False` no git commands will be used--this effectively disables support for git submodules. If the ``--no-git`` option is given at the command line the value of this argument is overridden to `False`. auto_upgrade : bool, optional By default, when installing a package from a non-development source distribution ah_boostrap will try to automatically check for patch releases to astropy-helpers on PyPI and use the patched version over any bundled versions. Setting this to `False` will disable that functionality. If the ``--offline`` option is given at the command line the value of this argument is overridden to `False`. offline : bool, optional If `False` disable all actions that require an internet connection, including downloading packages from the package index and fetching updates to any git submodule. Defaults to `True`. """ global BOOTSTRAPPER config = BOOTSTRAPPER.config config.update(**kwargs) # Create a new bootstrapper with the updated configuration and run it BOOTSTRAPPER = _Bootstrapper(**config) BOOTSTRAPPER.run() sunpy-0.8.3/astropy_helpers/appveyor.yml0000644000175000001440000000246713203277317017713 0ustar nabil00000000000000# AppVeyor.com is a Continuous Integration service to build and run tests under # Windows environment: global: PYTHON: "C:\\conda" MINICONDA_VERSION: "latest" CMD_IN_ENV: "cmd /E:ON /V:ON /C .\\ci-helpers\\appveyor\\windows_sdk.cmd" PYTHON_ARCH: "64" # needs to be set for CMD_IN_ENV to succeed. If a mix # of 32 bit and 64 bit builds are needed, move this # to the matrix section. # babel 2.0 is known to break on Windows: # https://github.com/python-babel/babel/issues/174 CONDA_DEPENDENCIES: "numpy Cython sphinx pytest babel!=2.0" matrix: - PYTHON_VERSION: "2.7" - PYTHON_VERSION: "3.4" - PYTHON_VERSION: "3.5" - PYTHON_VERSION: "3.6" platform: -x64 install: # Set up ci-helpers - "git clone git://github.com/astropy/ci-helpers.git" - "powershell ci-helpers/appveyor/install-miniconda.ps1" - "SET PATH=%PYTHON%;%PYTHON%\\Scripts;%PATH%" - "activate test" # Some of the tests use git commands that require a user to be configured - git config --global user.name "A U Thor" - git config --global user.email "author@example.com" # Not a .NET project, we build the package in the install step instead build: false test_script: - "%CMD_IN_ENV% py.test astropy_helpers" sunpy-0.8.3/astropy_helpers/ez_setup.py0000644000175000001440000003037113203277317017526 0ustar nabil00000000000000#!/usr/bin/env python """ Setuptools bootstrapping installer. Maintained at https://github.com/pypa/setuptools/tree/bootstrap. Run this script to install or upgrade setuptools. This method is DEPRECATED. Check https://github.com/pypa/setuptools/issues/581 for more details. """ import os import shutil import sys import tempfile import zipfile import optparse import subprocess import platform import textwrap import contextlib from distutils import log try: from urllib.request import urlopen except ImportError: from urllib2 import urlopen try: from site import USER_SITE except ImportError: USER_SITE = None # 33.1.1 is the last version that supports setuptools self upgrade/installation. DEFAULT_VERSION = "33.1.1" DEFAULT_URL = "https://pypi.io/packages/source/s/setuptools/" DEFAULT_SAVE_DIR = os.curdir DEFAULT_DEPRECATION_MESSAGE = "ez_setup.py is deprecated and when using it setuptools will be pinned to {0} since it's the last version that supports setuptools self upgrade/installation, check https://github.com/pypa/setuptools/issues/581 for more info; use pip to install setuptools" MEANINGFUL_INVALID_ZIP_ERR_MSG = 'Maybe {0} is corrupted, delete it and try again.' log.warn(DEFAULT_DEPRECATION_MESSAGE.format(DEFAULT_VERSION)) def _python_cmd(*args): """ Execute a command. Return True if the command succeeded. """ args = (sys.executable,) + args return subprocess.call(args) == 0 def _install(archive_filename, install_args=()): """Install Setuptools.""" with archive_context(archive_filename): # installing log.warn('Installing Setuptools') if not _python_cmd('setup.py', 'install', *install_args): log.warn('Something went wrong during the installation.') log.warn('See the error message above.') # exitcode will be 2 return 2 def _build_egg(egg, archive_filename, to_dir): """Build Setuptools egg.""" with archive_context(archive_filename): # building an egg log.warn('Building a Setuptools egg in %s', to_dir) _python_cmd('setup.py', '-q', 'bdist_egg', '--dist-dir', to_dir) # returning the result log.warn(egg) if not os.path.exists(egg): raise IOError('Could not build the egg.') class ContextualZipFile(zipfile.ZipFile): """Supplement ZipFile class to support context manager for Python 2.6.""" def __enter__(self): return self def __exit__(self, type, value, traceback): self.close() def __new__(cls, *args, **kwargs): """Construct a ZipFile or ContextualZipFile as appropriate.""" if hasattr(zipfile.ZipFile, '__exit__'): return zipfile.ZipFile(*args, **kwargs) return super(ContextualZipFile, cls).__new__(cls) @contextlib.contextmanager def archive_context(filename): """ Unzip filename to a temporary directory, set to the cwd. The unzipped target is cleaned up after. """ tmpdir = tempfile.mkdtemp() log.warn('Extracting in %s', tmpdir) old_wd = os.getcwd() try: os.chdir(tmpdir) try: with ContextualZipFile(filename) as archive: archive.extractall() except zipfile.BadZipfile as err: if not err.args: err.args = ('', ) err.args = err.args + ( MEANINGFUL_INVALID_ZIP_ERR_MSG.format(filename), ) raise # going in the directory subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0]) os.chdir(subdir) log.warn('Now working in %s', subdir) yield finally: os.chdir(old_wd) shutil.rmtree(tmpdir) def _do_download(version, download_base, to_dir, download_delay): """Download Setuptools.""" py_desig = 'py{sys.version_info[0]}.{sys.version_info[1]}'.format(sys=sys) tp = 'setuptools-{version}-{py_desig}.egg' egg = os.path.join(to_dir, tp.format(**locals())) if not os.path.exists(egg): archive = download_setuptools(version, download_base, to_dir, download_delay) _build_egg(egg, archive, to_dir) sys.path.insert(0, egg) # Remove previously-imported pkg_resources if present (see # https://bitbucket.org/pypa/setuptools/pull-request/7/ for details). if 'pkg_resources' in sys.modules: _unload_pkg_resources() import setuptools setuptools.bootstrap_install_from = egg def use_setuptools( version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=DEFAULT_SAVE_DIR, download_delay=15): """ Ensure that a setuptools version is installed. Return None. Raise SystemExit if the requested version or later cannot be installed. """ to_dir = os.path.abspath(to_dir) # prior to importing, capture the module state for # representative modules. rep_modules = 'pkg_resources', 'setuptools' imported = set(sys.modules).intersection(rep_modules) try: import pkg_resources pkg_resources.require("setuptools>=" + version) # a suitable version is already installed return except ImportError: # pkg_resources not available; setuptools is not installed; download pass except pkg_resources.DistributionNotFound: # no version of setuptools was found; allow download pass except pkg_resources.VersionConflict as VC_err: if imported: _conflict_bail(VC_err, version) # otherwise, unload pkg_resources to allow the downloaded version to # take precedence. del pkg_resources _unload_pkg_resources() return _do_download(version, download_base, to_dir, download_delay) def _conflict_bail(VC_err, version): """ Setuptools was imported prior to invocation, so it is unsafe to unload it. Bail out. """ conflict_tmpl = textwrap.dedent(""" The required version of setuptools (>={version}) is not available, and can't be installed while this script is running. Please install a more recent version first, using 'easy_install -U setuptools'. (Currently using {VC_err.args[0]!r}) """) msg = conflict_tmpl.format(**locals()) sys.stderr.write(msg) sys.exit(2) def _unload_pkg_resources(): sys.meta_path = [ importer for importer in sys.meta_path if importer.__class__.__module__ != 'pkg_resources.extern' ] del_modules = [ name for name in sys.modules if name.startswith('pkg_resources') ] for mod_name in del_modules: del sys.modules[mod_name] def _clean_check(cmd, target): """ Run the command to download target. If the command fails, clean up before re-raising the error. """ try: subprocess.check_call(cmd) except subprocess.CalledProcessError: if os.access(target, os.F_OK): os.unlink(target) raise def download_file_powershell(url, target): """ Download the file at url to target using Powershell. Powershell will validate trust. Raise an exception if the command cannot complete. """ target = os.path.abspath(target) ps_cmd = ( "[System.Net.WebRequest]::DefaultWebProxy.Credentials = " "[System.Net.CredentialCache]::DefaultCredentials; " '(new-object System.Net.WebClient).DownloadFile("%(url)s", "%(target)s")' % locals() ) cmd = [ 'powershell', '-Command', ps_cmd, ] _clean_check(cmd, target) def has_powershell(): """Determine if Powershell is available.""" if platform.system() != 'Windows': return False cmd = ['powershell', '-Command', 'echo test'] with open(os.path.devnull, 'wb') as devnull: try: subprocess.check_call(cmd, stdout=devnull, stderr=devnull) except Exception: return False return True download_file_powershell.viable = has_powershell def download_file_curl(url, target): cmd = ['curl', url, '--location', '--silent', '--output', target] _clean_check(cmd, target) def has_curl(): cmd = ['curl', '--version'] with open(os.path.devnull, 'wb') as devnull: try: subprocess.check_call(cmd, stdout=devnull, stderr=devnull) except Exception: return False return True download_file_curl.viable = has_curl def download_file_wget(url, target): cmd = ['wget', url, '--quiet', '--output-document', target] _clean_check(cmd, target) def has_wget(): cmd = ['wget', '--version'] with open(os.path.devnull, 'wb') as devnull: try: subprocess.check_call(cmd, stdout=devnull, stderr=devnull) except Exception: return False return True download_file_wget.viable = has_wget def download_file_insecure(url, target): """Use Python to download the file, without connection authentication.""" src = urlopen(url) try: # Read all the data in one block. data = src.read() finally: src.close() # Write all the data in one block to avoid creating a partial file. with open(target, "wb") as dst: dst.write(data) download_file_insecure.viable = lambda: True def get_best_downloader(): downloaders = ( download_file_powershell, download_file_curl, download_file_wget, download_file_insecure, ) viable_downloaders = (dl for dl in downloaders if dl.viable()) return next(viable_downloaders, None) def download_setuptools( version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=DEFAULT_SAVE_DIR, delay=15, downloader_factory=get_best_downloader): """ Download setuptools from a specified location and return its filename. `version` should be a valid setuptools version number that is available as an sdist for download under the `download_base` URL (which should end with a '/'). `to_dir` is the directory where the egg will be downloaded. `delay` is the number of seconds to pause before an actual download attempt. ``downloader_factory`` should be a function taking no arguments and returning a function for downloading a URL to a target. """ # making sure we use the absolute path to_dir = os.path.abspath(to_dir) zip_name = "setuptools-%s.zip" % version url = download_base + zip_name saveto = os.path.join(to_dir, zip_name) if not os.path.exists(saveto): # Avoid repeated downloads log.warn("Downloading %s", url) downloader = downloader_factory() downloader(url, saveto) return os.path.realpath(saveto) def _build_install_args(options): """ Build the arguments to 'python setup.py install' on the setuptools package. Returns list of command line arguments. """ return ['--user'] if options.user_install else [] def _parse_args(): """Parse the command line for options.""" parser = optparse.OptionParser() parser.add_option( '--user', dest='user_install', action='store_true', default=False, help='install in user site package') parser.add_option( '--download-base', dest='download_base', metavar="URL", default=DEFAULT_URL, help='alternative URL from where to download the setuptools package') parser.add_option( '--insecure', dest='downloader_factory', action='store_const', const=lambda: download_file_insecure, default=get_best_downloader, help='Use internal, non-validating downloader' ) parser.add_option( '--version', help="Specify which version to download", default=DEFAULT_VERSION, ) parser.add_option( '--to-dir', help="Directory to save (and re-use) package", default=DEFAULT_SAVE_DIR, ) options, args = parser.parse_args() # positional arguments are ignored return options def _download_args(options): """Return args for download_setuptools function from cmdline args.""" return dict( version=options.version, download_base=options.download_base, downloader_factory=options.downloader_factory, to_dir=options.to_dir, ) def main(): """Install or upgrade setuptools and EasyInstall.""" options = _parse_args() archive = download_setuptools(**_download_args(options)) return _install(archive, _build_install_args(options)) if __name__ == '__main__': sys.exit(main()) sunpy-0.8.3/astropy_helpers/setup.cfg0000644000175000001440000000015313203277317017132 0ustar nabil00000000000000[tool:pytest] norecursedirs = .tox astropy_helpers/tests/package_template python_functions = test_ sunpy-0.8.3/astropy_helpers/setup.py0000755000175000001440000000351613212200427017020 0ustar nabil00000000000000#!/usr/bin/env python # Licensed under a 3-clause BSD style license - see LICENSE.rst import ah_bootstrap import pkg_resources from setuptools import setup from astropy_helpers.setup_helpers import register_commands, get_package_info from astropy_helpers.version_helpers import generate_version_py NAME = 'astropy_helpers' VERSION = '2.0.2' RELEASE = 'dev' not in VERSION generate_version_py(NAME, VERSION, RELEASE, False, uses_git=not RELEASE) # Use the updated version including the git rev count from astropy_helpers.version import version as VERSION cmdclass = register_commands(NAME, VERSION, RELEASE) # This package actually doesn't use the Astropy test command del cmdclass['test'] setup( name=pkg_resources.safe_name(NAME), # astropy_helpers -> astropy-helpers version=VERSION, description='Utilities for building and installing Astropy, Astropy ' 'affiliated packages, and their respective documentation.', author='The Astropy Developers', author_email='astropy.team@gmail.com', license='BSD', url=' https://github.com/astropy/astropy-helpers', long_description=open('README.rst').read(), classifiers=[ 'Development Status :: 5 - Production/Stable', 'Intended Audience :: Developers', 'Framework :: Setuptools Plugin', 'Framework :: Sphinx :: Extension', 'Framework :: Sphinx :: Theme', 'License :: OSI Approved :: BSD License', 'Operating System :: OS Independent', 'Programming Language :: Python', 'Programming Language :: Python :: 3', 'Topic :: Software Development :: Build Tools', 'Topic :: Software Development :: Libraries :: Python Modules', 'Topic :: System :: Archiving :: Packaging' ], cmdclass=cmdclass, zip_safe=False, **get_package_info(exclude=['astropy_helpers.tests']) ) sunpy-0.8.3/astropy_helpers/tox.ini0000644000175000001440000000045013203277317016624 0ustar nabil00000000000000[tox] envlist = py26,py27,py32,py33,py34 [testenv] deps = pytest numpy Cython Sphinx==1.2.3 # Note: Sphinx is required to run the sphinx.ext tests commands = py.test {posargs} sitepackages = False [testenv:py32] deps = pygments<=1.9 Jinja2<2.7 {[testenv]deps} sunpy-0.8.3/licenses/0000755000175000017500000000000013232563477014715 5ustar nabilnabil00000000000000sunpy-0.8.3/licenses/ASTROPY.rst0000644000175000017500000000273013232563447016607 0ustar nabilnabil00000000000000Copyright (c) 2011-2014, Astropy Developers All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the Astropy Team nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. sunpy-0.8.3/licenses/README.rst0000644000175000017500000000035113231613137016367 0ustar nabilnabil00000000000000Licenses ======== This directory holds license and credit information for works sunpy is derived from or distributes. The license file for the sunpy package itself is placed in the root directory of this repository as LICENSE.rst. sunpy-0.8.3/licenses/SIX.rst0000644000175000017500000000205213232563447016106 0ustar nabilnabil00000000000000Copyright (c) 2010-2013 Benjamin Peterson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. sunpy-0.8.3/sunpy/0000755000175000017500000000000013232563477014266 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/cm/0000755000175000017500000000000013232563477014665 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/cm/tests/0000755000175000017500000000000013232563477016027 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/cm/tests/__init__.py0000644000175000001440000000002013203275053017102 0ustar nabil00000000000000import sunpy.cm sunpy-0.8.3/sunpy/cm/__init__.py0000644000175000017500000000032613231613137016763 0ustar nabilnabil00000000000000""" The following colormaps are provided by this module: """ from __future__ import absolute_import from sunpy.cm.cm import * for cmname in cmlist.keys(): __doc__ += "* '`~sunpy.cm.cm.{}`'\n".format(cmname) sunpy-0.8.3/sunpy/cm/cm.py0000644000175000017500000001570513232563373015641 0ustar nabilnabil00000000000000""" This module provides a set of colormaps specific for solar data. """ from __future__ import absolute_import, division, print_function import numpy as np import matplotlib.pyplot as plt import matplotlib.cm as cm from sunpy.cm import color_tables as ct __all__ = ['get_cmap', 'show_colormaps', 'cmlist'] sdoaia94 = ct.aia_color_table(94) sdoaia131 = ct.aia_color_table(131) sdoaia171 = ct.aia_color_table(171) sdoaia193 = ct.aia_color_table(193) sdoaia211 = ct.aia_color_table(211) sdoaia304 = ct.aia_color_table(304) sdoaia335 = ct.aia_color_table(335) sdoaia1600 = ct.aia_color_table(1600) sdoaia1700 = ct.aia_color_table(1700) sdoaia4500 = ct.aia_color_table(4500) sohoeit171 = ct.eit_color_table(171) sohoeit195 = ct.eit_color_table(195) sohoeit284 = ct.eit_color_table(284) sohoeit304 = ct.eit_color_table(304) soholasco2 = ct.lasco_color_table(2) soholasco3 = ct.lasco_color_table(3) stereocor1 = ct.cor_color_table(1) stereocor2 = ct.cor_color_table(2) stereohi1 = ct.stereo_hi_color_table(1) stereohi2 = ct.stereo_hi_color_table(2) yohkohsxtal = ct.sxt_color_table('al') yohkohsxtwh = ct.sxt_color_table('wh') hinodexrt = ct.xrt_color_table() hinodesotintensity = ct.sot_color_table('intensity') #hinodesotstokesquv = ct.sot_color_table('stokesQUV') #hinodesotmagneticf = ct.sot_color_table('magnetic field') #hinodesotvelocity = ct.sot_color_table('velocity') #hinodesotwidth = ct.sot_color_table('width') trace171 = ct.trace_color_table('171') trace195 = ct.trace_color_table('195') trace284 = ct.trace_color_table('284') trace1216 = ct.trace_color_table('1216') trace1550 = ct.trace_color_table('1550') trace1600 = ct.trace_color_table('1600') trace1700 = ct.trace_color_table('1700') traceWL = ct.trace_color_table('WL') hmimag = ct.hmi_mag_color_table() cmlist = { 'sdoaia94': sdoaia94, 'sdoaia131': sdoaia131, 'sdoaia171': sdoaia171, 'sdoaia193': sdoaia193, 'sdoaia211': sdoaia211, 'sdoaia304': sdoaia304, 'sdoaia335': sdoaia335, 'sdoaia1600': sdoaia1600, 'sdoaia1700': sdoaia1700, 'sdoaia4500': sdoaia4500, 'sohoeit171': sohoeit171, 'sohoeit195': sohoeit195, 'sohoeit284': sohoeit284, 'sohoeit304': sohoeit304, 'soholasco2': soholasco2, 'soholasco3': soholasco3, 'stereocor1': stereocor1, 'stereocor2': stereocor2, 'stereohi1': stereohi1, 'stereohi2': stereohi2, 'rhessi': cm.jet, # pylint: disable=E1101 'yohkohsxtal': yohkohsxtal, 'yohkohsxtwh': yohkohsxtwh, 'hinodexrt': hinodexrt, 'hinodesotintensity': hinodesotintensity, # 'hinodesotstokesquv': hinodesotstokesquv, # 'hinodesotmagneticf': hinodesotmagneticf, # 'hinodesotvelocity': hinodesotvelocity, # 'hinodesotwidth': hinodesotwidth, 'trace171': trace171, 'trace195': trace195, 'trace284': trace284, 'trace1216': trace1216, 'trace1550': trace1550, 'trace1600': trace1600, 'trace1700': trace1700, 'traceWL': traceWL, 'hmimag': hmimag, 'irissji1330': ct.iris_sji_color_table('1330'), 'irissji1400': ct.iris_sji_color_table('1400'), 'irissji1600': ct.iris_sji_color_table('1600'), 'irissji2796': ct.iris_sji_color_table('2796'), 'irissji2832': ct.iris_sji_color_table('2832'), 'irissji5000': ct.iris_sji_color_table('5000'), 'irissjiFUV': ct.iris_sji_color_table('FUV'), 'irissjiNUV': ct.iris_sji_color_table('NUV'), 'irissjiSJI_NUV': ct.iris_sji_color_table('SJI_NUV') } # Register the colormaps with matplotlib so plt.get_cmap('sdoaia171') works for name, cmap in cmlist.items(): cm.register_cmap(name=name, cmap=cmap) def get_cmap(name): """ Get a colormap. Parameters ---------- name : string The name of a color map. Returns ------- value : matplotlib colormap See Also -------- Examples -------- >>> import sunpy.cm as cm >>> colormap = cm.get_cmap(name = 'sdoaia94') References ---------- | http://matplotlib.sourceforge.net/api/cm_api.html """ if name in cmlist: return cmlist.get(name) else: raise ValueError("Colormap {name!s} is not recognized".format(name=name)) def show_colormaps(filter=None): """Displays a plot of the custom color maps supported in SunPy. Parameters ---------- filter : str A string to filter the color maps presented (e.g. aia, EIT, 171). Case insensitive. Returns ------- None : none Examples -------- >>> import sunpy.cm as cm >>> cm.show_colormaps() >>> cm.show_colormaps(filter='aia') >>> cm.show_colormaps(filter='171') References ---------- """ if filter: maps = sorted({k:v for (k,v) in cmlist.items() if k.lower().count(filter.lower())}) if len(maps) == 0: raise KeyError('No color maps found for key - ' + filter) else: maps = sorted(cmlist) nmaps = len(maps) + 1 a = np.linspace(0, 1, 256).reshape(1, -1) # pylint: disable=E1103 a = np.vstack((a, a)) fig = plt.figure(figsize=(5, 10),dpi=64) fig.subplots_adjust(top=0.99, bottom=0.01, left=0.2, right=0.99) for i, name in enumerate(maps): ax = plt.subplot(nmaps, 1, i + 1) plt.axis("off") plt.imshow(a, aspect='auto', cmap=get_cmap(name), origin='lower') pos = list(ax.get_position().bounds) fig.text(pos[0] - 0.01, pos[1], name, fontsize=10, horizontalalignment='right') plt.show() # def test_equalize(data): # """Returns a color map which performs histogram equalization on the data. # # Parameters # ---------- # data : ndarray # # Returns # ------- # value : matplotlib colormap # # See Also # -------- # # Examples # -------- # >>> import sunpy.cm as cm # >>> cm.test_equalize() # # Reference # --------- # | http://matplotlib.sourceforge.net/api/cm_api.html # # .. warning:: this function is under development # # .. todo:: finish coding this function! # # """ # dfile = cbook.get_sample_data('s1045.ima', asfileobj=False) # # im = np.fromstring(file(dfile, 'rb').read(), np.uint16).astype(float) # im.shape = 256, 256 # # #imshow(im, ColormapJet(256)) # #imshow(im, cmap=cm.jet) # # imvals = np.sort(im.flatten()) # lo = imvals[0] # hi = imvals[-1] # steps = (imvals[::len(imvals)/256] - lo) / (hi - lo) # num_steps = float(len(steps)) # interps = [(s, idx/num_steps, idx/num_steps) for idx, # s in enumerate(steps)] # interps.append((1, 1, 1)) # cdict = {'red': interps, # 'green': interps, # 'blue': interps} # histeq_cmap = colors.LinearSegmentedColormap('HistEq', cdict) # pylab.figure() # pylab.imshow(im, cmap=histeq_cmap) # pylab.title('histeq') # pylab.show() sunpy-0.8.3/sunpy/cm/color_tables.py0000644000175000017500000023211713232563373017710 0ustar nabilnabil00000000000000""" Nothing here but dictionaries for generating LinearSegmentedColormaps, and a dictionary of these dictionaries. """ from __future__ import absolute_import, division, print_function import numpy as np import matplotlib.colors as colors from sunpy.extern.six.moves import range, zip __all__ = ['aia_color_table', 'lasco_color_table', 'eit_color_table', 'sxt_color_table', 'xrt_color_table', 'trace_color_table', 'sot_color_table', 'hmi_mag_color_table'] # FIXME: Give me a proper name. def _mkx(i, steps, n): """ Generate list according to pattern of g0 and b0. """ x = [] for step in steps: x.extend(list(range(i, step + n, n))) i = step + (n - 1) return x def padfr(lst, len_, pad=0): """ Pad lst to contain at least len_ items by adding pad to the front. """ diff = len_ - len(lst) diff = 0 if diff < 0 else diff return [pad] * diff + lst def paden(lst, len_, pad=0): """ Pad lst to contain at least len_ items by adding pad to the end. """ diff = len_ - len(lst) diff = 0 if diff < 0 else diff return lst + [pad] * diff # The following values describe color table 3 for IDL (Red Temperature) r0 = np.array(paden( [ 0, 1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 15, 17, 18, 20, 21, 23, 24, 26, 27, 28, 30, 31, 33, 34, 36, 37, 39, 40, 42, 43, 44, 46, 47, 49, 50, 52, 53, 55, 56, 57, 59, 60, 62, 63, 65, 66, 68, 69, 70, 72, 73, 75, 76, 78, 79, 81, 82, 84, 85, 86, 88, 89, 91, 92, 94, 95, 97, 98, 99, 101, 102, 104, 105, 107, 108, 110, 111, 113, 114, 115, 117, 118, 120, 121, 123, 124, 126, 127, 128, 130, 131, 133, 134, 136, 137, 139, 140, 141, 143, 144, 146, 147, 149, 150, 152, 153, 155, 156, 157, 159, 160, 162, 163, 165, 166, 168, 169, 170, 172, 173, 175, 176, 178, 179, 181, 182, 184, 185, 186, 188, 189, 191, 192, 194, 195, 197, 198, 199, 201, 202, 204, 205, 207, 208, 210, 211, 212, 214, 215, 217, 218, 220, 221, 223, 224, 226, 227, 228, 230, 231, 233, 234, 236, 237, 239, 240, 241, 243, 244, 246, 247, 249, 250, 252, 253], 256, 255)) g0 = np.array(padfr(_mkx(1, range(17, 256, 17), 2), 256)) b0 = np.array(padfr(_mkx(3, range(51, 256, 51), 4), 256)) c0 = np.arange(256, dtype='f') c1 = (np.sqrt(c0) * np.sqrt(255.0)).astype('f') c2 = (np.arange(256) ** 2 / 255.0).astype('f') c3 = ((c1 + c2 / 2.0) * 255.0 / (c1.max() + c2.max() / 2.0)).astype('f') aia_wave_dict = {1600: (c3, c3, c2), 1700: (c1, c0, c0), 4500: (c0, c0, b0 / 2.0), 94: (c2, c3, c0), 131: (g0, r0, r0), 171: (r0, c0, b0), 193: (c1, c0, c2), 211: (c1, c0, c3), 304: (r0, g0, b0), 335: (c2, c0, c1) } def aia_color_table(wavelength): """Returns one of the fundamental color tables for SDO AIA images. Based on aia_lct.pro part of SDO/AIA on SSWIDL written by Karel Schrijver (2010/04/12). """ try: r, g, b = aia_wave_dict[wavelength] except KeyError: raise ValueError( "Invalid AIA wavelength. Valid values are " "1600,1700,4500,94,131,171,193,211,304,335." ) # Now create the color dictionary in the correct format cdict = create_cdict(r, g, b) return colors.LinearSegmentedColormap('SDO AIA {:s}'.format(str(wavelength)), cdict) eit_yellow_r = np.array( [ 0, 1, 2, 3, 5, 6, 7, 8, 10, 11, 12, 14, 15, 16, 17, 19, 20, 21, 22, 24, 25, 26, 28, 29, 30, 31, 33, 34, 35, 36, 38, 39, 40, 42, 43, 44, 45, 47, 48, 49, 51, 52, 53, 54, 56, 57, 58, 59, 61, 62, 63, 65, 66, 67, 68, 70, 71, 72, 73, 75, 76, 77, 79, 80, 81, 82, 84, 85, 86, 87, 89, 90, 91, 93, 94, 95, 96, 98, 99, 100, 102, 103, 104, 105, 107, 108, 109, 110, 112, 113, 114, 116, 117, 118, 119, 121, 122, 123, 124, 126, 127, 128, 130, 131, 132, 133, 135, 136, 137, 138, 140, 141, 142, 144, 145, 146, 147, 149, 150, 151, 153, 154, 155, 156, 158, 159, 160, 161, 163, 164, 165, 167, 168, 169, 170, 172, 173, 174, 175, 177, 178, 179, 181, 182, 183, 184, 186, 187, 188, 189, 191, 192, 193, 195, 196, 197, 198, 200, 201, 202, 204, 205, 206, 207, 209, 210, 211, 212, 214, 215, 216, 218, 219, 220, 221, 223, 224, 225, 226, 228, 229, 230, 232, 233, 234, 235, 237, 238, 239, 240, 242, 243, 244, 246, 247, 248, 249, 251, 252, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]) eit_yellow_g = np.array( [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 205, 206, 206, 207, 209, 209, 210, 210, 212, 213, 213, 215, 216, 216, 218, 219, 219, 221, 221, 222, 224, 224, 225, 227, 227, 228, 230, 230, 231, 231, 232, 234, 234, 235, 237, 237, 238, 240, 240, 241, 241, 243, 244, 244, 246, 247, 247, 249, 250, 250, 252, 252, 253, 255, 255, 255]) eit_yellow_b = np.concatenate((np.zeros(201).astype('int'), np.array( [ 7, 7, 15, 22, 22, 30, 30, 37, 45, 45, 52, 60, 60, 67, 75, 75, 82, 82, 90, 97, 97, 105, 112, 112, 120, 127, 127, 135, 135, 142, 150, 150, 157, 165, 165, 172, 180, 180, 187, 187, 195, 202, 202, 210, 217, 217, 225, 232, 232, 240, 240, 247, 255, 255, 255]))) eit_dark_blue_r = np.concatenate((np.zeros(206).astype('int'), np.array( [ 9, 13, 21, 25, 25, 29, 33, 41, 49, 53, 57, 65, 69, 73, 77, 77, 85, 94, 98, 102, 110, 114, 118, 122, 134, 134, 138, 142, 146, 154, 158, 162, 166, 179, 183, 183, 187, 191, 199, 203, 207, 215, 223, 227, 231, 231, 235, 243, 247, 255]))) eit_dark_blue_g = np.concatenate((np.zeros(128).astype('int'), np.array( [ 2, 2, 4, 5, 7, 12, 13, 15, 17, 20, 21, 21, 23, 25, 29, 31, 33, 34, 37, 39, 41, 41, 44, 47, 49, 50, 52, 55, 57, 60, 61, 61, 65, 66, 68, 69, 73, 76, 77, 79, 82, 82, 84, 85, 87, 92, 94, 95, 97, 100, 102, 103, 103, 105, 110, 111, 113, 114, 118, 119, 121, 122, 122, 127, 129, 130, 132, 135, 137, 138, 142, 145, 145, 146, 148, 150, 153, 154, 158, 159, 162, 164, 164, 166, 167, 170, 174, 175, 177, 180, 182, 183, 185, 185, 188, 191, 193, 195, 198, 199, 201, 203, 207, 207, 209, 211, 212, 215, 217, 219, 220, 225, 227, 227, 228, 230, 233, 235, 236, 239, 243, 244, 246, 246, 247, 251, 252, 255]))) eit_dark_blue_b = np.concatenate((np.zeros(52).astype('int'), np.array( [ 1, 4, 5, 6, 8, 8, 10, 12, 14, 16, 18, 20, 21, 23, 25, 25, 28, 29, 31, 33, 35, 36, 37, 42, 43, 43, 44, 46, 48, 50, 51, 52, 56, 58, 59, 61, 61, 63, 65, 66, 69, 71, 73, 74, 75, 78, 78, 80, 81, 84, 86, 88, 89, 90, 93, 94, 94, 97, 99, 101, 103, 104, 105, 108, 111, 112, 112, 113, 116, 118, 119, 120, 124, 126, 127, 128, 131, 131, 132, 134, 135, 139, 141, 142, 143, 146, 147, 147, 149, 150, 154, 155, 157, 158, 161, 162, 164, 164, 166, 169, 170, 172, 173, 176, 177, 180, 181, 181, 184, 185, 187, 188, 191, 193, 195, 196, 199, 199, 200, 202, 203, 207, 208, 210, 211, 214, 215, 217, 217, 218, 222, 223, 225, 226, 229, 230, 231, 233, 233, 237, 238, 240, 241, 244, 245, 246, 249, 252, 252, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]))) eit_dark_green_r = np.concatenate((np.zeros(130).astype('int'), np.array( [ 1, 3, 4, 9, 11, 12, 14, 17, 19, 19, 20, 22, 27, 29, 30, 32, 35, 37, 38, 38, 41, 45, 46, 48, 50, 53, 54, 58, 59, 59, 62, 64, 66, 67, 71, 74, 75, 77, 80, 80, 82, 83, 85, 90, 91, 93, 95, 98, 100, 101, 101, 103, 108, 109, 111, 112, 116, 117, 119, 121, 121, 125, 127, 129, 130, 133, 135, 137, 140, 143, 143, 145, 146, 148, 151, 153, 156, 158, 161, 163, 163, 164, 166, 169, 172, 174, 175, 179, 180, 182, 183, 183, 187, 190, 192, 193, 196, 198, 200, 201, 206, 206, 208, 209, 211, 214, 216, 217, 219, 224, 225, 225, 227, 229, 232, 234, 235, 238, 242, 243, 245, 245, 246, 250, 251, 255]))) eit_dark_green_g = np.concatenate((np.zeros(52).astype('int'), np.array( [ 1, 3, 4, 5, 6, 6, 8, 9, 11, 12, 14, 15, 16, 17, 19, 19, 21, 22, 23, 25, 26, 27, 28, 31, 32, 32, 33, 34, 36, 37, 38, 39, 42, 43, 44, 45, 45, 47, 48, 49, 51, 53, 54, 55, 56, 58, 58, 59, 60, 62, 64, 65, 66, 67, 69, 70, 70, 72, 73, 75, 76, 77, 78, 80, 82, 83, 83, 84, 86, 87, 88, 89, 92, 93, 94, 95, 97, 97, 98, 99, 100, 103, 104, 105, 106, 108, 109, 109, 110, 111, 114, 115, 116, 117, 119, 120, 121, 121, 123, 125, 126, 127, 128, 130, 131, 133, 134, 134, 136, 137, 138, 139, 141, 143, 144, 145, 147, 147, 148, 149, 150, 153, 154, 155, 156, 158, 159, 160, 160, 161, 164, 165, 166, 167, 169, 170, 171, 172, 172, 175, 176, 177, 178, 180, 181, 182, 184, 186, 186, 187, 188, 189, 191, 192, 194, 195, 197, 198, 198, 199, 200, 202, 204, 205, 206, 208, 209, 210, 211, 211, 213, 215, 216, 217, 219, 220, 221, 222, 225, 225, 226, 227, 228, 230, 231, 232, 233, 236, 237, 237, 238, 239, 241, 242, 243, 245, 247, 248, 249, 249, 250, 252, 253, 255]))) eit_dark_green_b = np.concatenate((np.zeros(197).astype('int'), np.array( [ 3, 10, 17, 17, 20, 24, 27, 34, 37, 44, 48, 55, 58, 58, 62, 65, 72, 79, 82, 86, 93, 96, 99, 103, 103, 110, 117, 120, 124, 130, 134, 137, 141, 151, 151, 155, 158, 161, 168, 172, 175, 179, 189, 192, 192, 196, 199, 206, 210, 213, 220, 227, 230, 234, 234, 237, 244, 248, 255]))) eit_dark_red_r = np.concatenate((np.zeros(52).astype('int'), np.array( [ 1, 3, 4, 5, 6, 6, 8, 9, 11, 12, 14, 15, 16, 17, 19, 19, 21, 22, 23, 25, 26, 27, 28, 31, 32, 32, 33, 34, 36, 37, 38, 39, 42, 43, 44, 45, 45, 47, 48, 49, 51, 53, 54, 55, 56, 58, 58, 59, 60, 62, 64, 65, 66, 67, 69, 70, 70, 72, 73, 75, 76, 77, 78, 80, 82, 83, 83, 84, 86, 87, 88, 89, 92, 93, 94, 95, 97, 97, 98, 99, 100, 103, 104, 105, 106, 108, 109, 109, 110, 111, 114, 115, 116, 117, 119, 120, 121, 121, 123, 125, 126, 127, 128, 130, 131, 133, 134, 134, 136, 137, 138, 139, 141, 143, 144, 145, 147, 147, 148, 149, 150, 153, 154, 155, 156, 158, 159, 160, 160, 161, 164, 165, 166, 167, 169, 170, 171, 172, 172, 175, 176, 177, 178, 180, 181, 182, 184, 186, 186, 187, 188, 189, 191, 192, 194, 195, 197, 198, 198, 199, 200, 202, 204, 205, 206, 208, 209, 210, 211, 211, 213, 215, 216, 217, 219, 220, 221, 222, 225, 225, 226, 227, 228, 230, 231, 232, 233, 236, 237, 237, 238, 239, 241, 242, 243, 245, 247, 248, 249, 249, 250, 252, 253, 255]))) eit_dark_red_g = np.concatenate((np.zeros(148).astype('int'), np.array( [ 1, 1, 5, 9, 11, 13, 15, 18, 20, 24, 26, 26, 30, 32, 34, 35, 39, 43, 45, 47, 51, 51, 52, 54, 56, 62, 64, 66, 68, 71, 73, 75, 75, 77, 83, 85, 86, 88, 92, 94, 96, 98, 98, 103, 105, 107, 109, 113, 115, 117, 120, 124, 124, 126, 128, 130, 134, 136, 139, 141, 145, 147, 147, 149, 151, 154, 158, 160, 162, 166, 168, 170, 171, 171, 175, 179, 181, 183, 187, 188, 190, 192, 198, 198, 200, 202, 204, 207, 209, 211, 213, 219, 221, 221, 222, 224, 228, 230, 232, 236, 239, 241, 243, 243, 245, 249, 251, 255]))) eit_dark_red_b = np.concatenate((np.zeros(204).astype('int'), np.array( [ 3, 7, 15, 19, 27, 31, 31, 35, 39, 47, 54, 58, 62, 70, 74, 78, 82, 82, 90, 98, 102, 105, 113, 117, 121, 125, 137, 137, 141, 145, 149, 156, 160, 164, 168, 180, 184, 184, 188, 192, 200, 204, 207, 215, 223, 227, 231, 231, 235, 243, 247, 255]))) def eit_color_table(wavelength): """Returns one of the fundamental color tables for SOHO EIT images.""" # SOHO EIT Color tables # EIT 171 IDL Name EIT Dark Bot Blue # EIT 195 IDL Name EIT Dark Bot Green # EIT 284 IDL Name EIT Dark Bot Yellow # EIT 304 IDL Name EIT Dark Bot Red try: r, g, b = { 171: (eit_dark_blue_r, eit_dark_blue_g, eit_dark_blue_b), 195: (eit_dark_green_r, eit_dark_green_g, eit_dark_green_b), 284: (eit_yellow_r, eit_yellow_g, eit_yellow_b), 304: (eit_dark_red_r, eit_dark_red_g, eit_dark_red_b) }[wavelength] except KeyError: raise ValueError( "Invalid EIT wavelength. Valid values are " "171, 195, 284, 304." ) # Now create the color dictionary in the correct format cdict = create_cdict(r, g, b) return colors.LinearSegmentedColormap('SOHO EIT {:s}'.format(str(wavelength)), cdict) lasco_c2_r = np.concatenate((np.array( [ 0., 1., 2., 5., 8., 11., 14., 17., 20., 23., 26., 28., 31., 34., 37., 42., 44., 47., 50., 55., 57., 60., 65., 68., 70., 75., 78., 82., 85., 88., 92., 95., 99., 102., 107., 110., 114., 117., 121., 124., 128., 133., 136., 140., 143., 147., 152., 155., 159., 163., 166., 170., 175., 178., 182., 186., 189., 194., 198., 201., 205., 210., 214., 217., 221., 226., 230., 233., 237., 241., 246., 250., 253.]), 255 * np.ones(183))) lasco_c2_g = np.concatenate((np.zeros(52).astype('int'), np.array( [ 1., 5., 11., 17., 20., 26., 32., 35., 41., 47., 52., 56., 62., 68., 73., 77., 83., 88., 94., 100., 103., 109., 115., 120., 126., 130., 136., 141., 147., 153., 158., 164., 168., 173., 179., 185., 190., 196., 202., 207., 213., 217., 222., 228., 234., 239., 245., 251.]), 255 * np.ones(156))) lasco_c2_b = np.concatenate((np.zeros(78).astype('int'), np.array( [ 0., 7., 19., 31., 43., 54., 66., 74., 86., 98., 109., 121., 133., 145., 156., 168., 176., 188., 200., 211., 223., 235., 247.]), 255 * np.ones(156))) lasco_c3_r = np.concatenate((np.zeros(77).astype('int'), np.array( [ 5., 13., 25., 33., 45., 53., 65., 73., 85., 94., 106., 114., 126., 134., 146., 154., 166., 175., 187., 195., 207., 215., 227., 235., 247.]), 255 * np.ones(154))) lasco_c3_g = np.concatenate((np.zeros(39).astype('int'), np.array( [ 4., 7., 12., 15., 20., 23., 28., 31., 36., 39., 44., 47., 52., 55., 60., 63., 68., 71., 76., 79., 84., 87., 92., 95., 100., 103., 108., 111., 116., 119., 124., 127., 132., 135., 140., 143., 148., 151., 156., 159., 164., 167., 172., 175., 180., 183., 188., 191., 196., 199., 204., 207., 212., 215., 220., 223., 228., 231., 236., 239., 244., 247., 252., 255., 255.]), 255 * np.ones(154))) lasco_c3_b = np.concatenate((np.array( [ 0., 4., 6., 10., 13., 17., 20., 24., 27., 31., 33., 37., 40., 44., 47., 51., 54., 58., 61., 65., 67., 71., 74., 78., 81., 85., 88., 92., 94., 99., 101., 105., 108., 112., 115., 119., 122., 126., 128., 132., 135., 139., 142., 146., 149., 153., 155., 160., 162., 166., 169., 173., 176., 180., 183., 187., 189., 193., 196., 200., 203., 207., 210., 214., 217., 221., 223., 227., 230., 234., 237., 241., 244., 248., 250.]), 255 * np.ones(181))) def lasco_color_table(number): """Returns one of the fundamental color tables for SOHO LASCO images.""" # SOHO LASCO Color tables # LASCO C2 white light IDL Name # LASCO C3 white light IDL Name try: r, g, b = { 2: (lasco_c2_r, lasco_c2_g, lasco_c2_b), 3: (lasco_c3_r, lasco_c3_g, lasco_c3_b), }[number] except KeyError: raise ValueError( "Invalid LASCO number. Valid values are " "2, 3." ) # Now create the color dictionary in the correct format cdict = create_cdict(r, g, b) return colors.LinearSegmentedColormap('SOHO LASCO C{:s}'.format(str(number)), cdict) # Translated from the JP2Gen IDL SXT code lct_yla_gold.pro. Might be better # to explicitly copy the numbers from the IDL calculation. This is a little # more compact. sxt_gold_r = np.concatenate((np.linspace(0, 255, num=185, endpoint=False), 255 * np.ones(71))) sxt_gold_g = 255 * (np.arange(256) ** 1.25) / (255.0 ** 1.25) sxt_gold_b = np.concatenate((np.zeros(185), 255.0 * np.arange(71) / 71.0)) grayscale = np.arange(256) def sxt_color_table(sxt_filter): """Returns one of the fundamental color tables for Yokhoh SXT images.""" try: r, g, b = { 'al': (sxt_gold_r, sxt_gold_g, sxt_gold_b), 'wh': (grayscale, grayscale, grayscale) }[sxt_filter] except KeyError: raise ValueError( "Invalid SXT filter type number. Valid values are " "'al', 'wh'." ) # Now create the color dictionary in the correct format cdict = create_cdict(r, g, b) return colors.LinearSegmentedColormap('Yohkoh SXT {:s}'.format(sxt_filter.title()), cdict) def xrt_color_table(): """Returns the color table used for all Hinode XRT images.""" # Now create the color dictionary in the correct format cdict = create_cdict(r0, g0, b0) return colors.LinearSegmentedColormap('Hinode XRT', cdict) # Stereo Secchi COR colour tables stereo_cor1_b = np.array( [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6, 6, 10, 13, 13, 17, 20, 20, 24, 27, 27, 31, 31, 34, 37, 37, 41, 44, 44, 48, 48, 51, 55, 55, 58, 58, 62, 62, 65, 68, 68, 72, 72, 75, 75, 79, 82, 82, 86, 86, 89, 89, 93, 93, 96, 96, 99, 103, 103, 106, 106, 110, 110, 113, 113, 117, 117, 120, 120, 124, 124, 127, 127, 130, 130, 134, 134, 137, 137, 141, 141, 144, 144, 148, 148, 151, 151, 155, 155, 158, 158, 161, 161, 165, 165, 168, 168, 168, 172, 172, 175, 175, 179, 179, 182, 182, 186, 186, 189, 189, 189, 192, 192, 196, 196, 199, 199, 203, 203, 203, 206, 206, 210, 210, 213, 213, 213, 217, 217, 220, 220, 223, 223, 223, 227, 227, 230, 230, 234, 234, 234, 237, 237, 241, 241, 241, 244, 244, 248, 248, 248, 251, 251, 255, 255]) stereo_cor1_g = np.array( [ 0, 27, 36, 43, 48, 53, 57, 60, 64, 67, 69, 72, 75, 77, 80, 82, 84, 86, 88, 90, 92, 94, 95, 97, 99, 100, 102, 104, 105, 107, 108, 110, 111, 112, 114, 115, 116, 118, 119, 120, 121, 123, 124, 125, 126, 127, 128, 129, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 147, 148, 149, 150, 151, 152, 153, 154, 154, 155, 156, 157, 158, 159, 159, 160, 161, 162, 163, 163, 164, 165, 166, 167, 167, 168, 169, 170, 170, 171, 172, 172, 173, 174, 175, 175, 176, 177, 177, 178, 179, 179, 180, 181, 181, 182, 183, 183, 184, 185, 185, 186, 187, 187, 188, 189, 189, 190, 190, 191, 192, 192, 193, 194, 194, 195, 195, 196, 197, 197, 198, 198, 199, 199, 200, 201, 201, 202, 202, 203, 203, 204, 205, 205, 206, 206, 207, 207, 208, 208, 209, 209, 210, 211, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216, 216, 217, 217, 218, 218, 219, 219, 220, 220, 221, 221, 222, 222, 223, 223, 224, 224, 225, 225, 226, 226, 227, 227, 228, 228, 229, 229, 230, 230, 230, 231, 231, 232, 232, 233, 233, 234, 234, 235, 235, 236, 236, 236, 237, 237, 238, 238, 239, 239, 240, 240, 240, 241, 241, 242, 242, 243, 243, 243, 244, 244, 245, 245, 246, 246, 246, 247, 247, 248, 248, 249, 249, 249, 250, 250, 251, 251, 251, 252, 252, 253, 253, 253, 254, 254, 255, 255]) stereo_cor1_r = np.array( [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 8, 11, 12, 16, 17, 20, 22, 24, 27, 29, 30, 33, 35, 37, 38, 41, 43, 45, 46, 48, 50, 51, 54, 56, 58, 59, 61, 62, 64, 66, 67, 69, 71, 72, 74, 75, 77, 79, 80, 80, 82, 83, 85, 87, 88, 90, 91, 91, 93, 95, 96, 98, 100, 100, 101, 103, 104, 106, 106, 108, 109, 111, 112, 112, 114, 116, 117, 117, 119, 121, 121, 122, 124, 125, 125, 127, 129, 129, 130, 132, 132, 133, 135, 135, 137, 138, 138, 140, 142, 142, 143, 145, 145, 146, 148, 148, 150, 150, 151, 153, 153, 154, 156, 156, 158, 158, 159, 161, 161, 163, 163, 164, 164, 166, 167, 167, 169, 169, 171, 171, 172, 174, 174, 175, 175, 177, 177, 179, 179, 180, 180, 182, 183, 183, 185, 185, 187, 187, 188, 188, 190, 190, 192, 192, 193, 193, 195, 195, 196, 196, 198, 198, 200, 200, 201, 201, 203, 203, 204, 204, 206, 206, 208, 208, 209, 209, 211, 211, 213, 213, 214, 214, 214, 216, 216, 217, 217, 219, 219, 221, 221, 222, 222, 224, 224, 224, 225, 225, 227, 227, 229, 229, 230, 230, 230, 232, 232, 234, 234, 235, 235, 235, 237, 237, 238, 238, 240, 240, 240, 242, 242, 243, 243, 245, 245, 245, 246, 246, 248, 248, 248, 250, 250, 251, 251, 251, 253, 253, 255, 255]) stereo_cor2_b = np.array( [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 19, 31, 43, 54, 66, 74, 86, 98, 109, 121, 133, 145, 156, 168, 176, 188, 200, 211, 223, 235, 247, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]) stereo_cor2_g = np.array( [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 5, 11, 17, 20, 26, 32, 35, 41, 47, 52, 56, 62, 68, 73, 77, 83, 88, 94, 100, 103, 109, 115, 120, 126, 130, 136, 141, 147, 153, 158, 164, 168, 173, 179, 185, 190, 196, 202, 207, 213, 217, 222, 228, 234, 239, 245, 251, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]) stereo_cor2_r = np.array( [ 0, 1, 2, 5, 8, 11, 14, 17, 20, 23, 26, 28, 31, 34, 37, 42, 44, 47, 50, 55, 57, 60, 65, 68, 70, 75, 78, 82, 85, 88, 92, 95, 99, 102, 107, 110, 114, 117, 121, 124, 128, 133, 136, 140, 143, 147, 152, 155, 159, 163, 166, 170, 175, 178, 182, 186, 189, 194, 198, 201, 205, 210, 214, 217, 221, 226, 230, 233, 237, 241, 246, 250, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]) def cor_color_table(number): """Returns one of the fundamental color tables for STEREO coronagraph images.""" # STEREO COR Color tables try: r, g, b = { 1: (stereo_cor1_r, stereo_cor1_g, stereo_cor1_b), 2: (stereo_cor2_r, stereo_cor2_g, stereo_cor2_b), }[number] except KeyError: raise ValueError( "Invalid COR number. Valid values are " "1, 2." ) # Now create the color dictionary in the correct format cdict = create_cdict(r, g, b) return colors.LinearSegmentedColormap('STEREO COR{:s}'.format(str(number)), cdict) # Standard TRACE color RGB triples, as defined by the SSWIDL program # trace_colors.pro. # See http://hesperia.gsfc.nasa.gov/ssw/trace/idl/util/trace_colors.pro trace_171_r = np.array( [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 5, 7, 8, 10, 12, 14, 15, 17, 19, 21, 22, 24, 26, 28, 29, 31, 33, 35, 37, 38, 40, 42, 44, 45, 47, 49, 51, 52, 54, 56, 58, 59, 61, 63, 65, 67, 68, 70, 72, 74, 75, 77, 79, 81, 82, 84, 86, 88, 90, 91, 93, 95, 97, 98, 100, 102, 104, 105, 107, 109, 111, 112, 114, 116, 118, 119, 121, 123, 125, 127, 128, 130, 132, 134, 135, 137, 139, 141, 142, 144, 146, 148, 150, 151, 153, 155, 157, 158, 160, 162, 164, 165, 167, 169, 171, 172, 174, 176, 178, 180, 180, 180, 181, 181, 182, 182, 183, 183, 184, 184, 185, 185, 186, 186, 187, 187, 188, 188, 189, 189, 190, 190, 191, 191, 192, 192, 192, 193, 193, 194, 194, 195, 195, 196, 196, 197, 197, 198, 198, 199, 199, 200, 200, 201, 201, 202, 202, 203, 203, 204, 204, 204, 205, 205, 206, 206, 207, 207, 208, 208, 209, 209, 210, 210, 211, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216, 216, 217, 217, 217, 218, 218, 219, 219, 220, 220, 221, 221, 222, 222, 223, 223, 224, 224, 225, 225, 226, 226, 227, 227, 228, 228, 229]) trace_171_g = np.array( [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 4, 6, 7, 9, 10, 12, 13, 15, 16, 18, 19, 21, 23, 24, 26, 27, 29, 30, 32, 33, 35, 36, 38, 39, 41, 43, 44, 46, 47, 49, 50, 52, 53, 55, 56, 58, 59, 61, 63, 64, 66, 67, 69, 70, 72, 73, 75, 76, 78, 79, 81, 83, 84, 86, 87, 89, 90, 92, 93, 95, 96, 98, 100, 101, 103, 104, 106, 107, 109, 110, 112, 113, 115, 116, 118, 119, 121, 123, 124, 126, 127, 129, 130, 132, 133, 135, 136, 138, 140, 141, 143, 144, 146, 147, 149, 150, 152, 153, 155, 156, 158, 159, 161, 163, 164, 166, 167, 169, 170, 172, 173, 175, 176, 178, 180, 180, 180, 181, 181, 182, 182, 183, 183, 184, 184, 185, 185, 186, 186, 187, 187, 188, 188, 189, 189, 190, 190, 191, 191, 192, 192, 192, 193, 193, 194, 194, 195, 195, 196, 196, 197, 197, 198, 198, 199, 199, 200, 200, 201, 201, 202, 202, 203, 203, 204, 204, 204, 205, 205, 206, 206, 207, 207, 208, 208, 209, 209, 210, 210, 211, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216, 216, 217, 217, 217, 218, 218, 219, 219, 220, 220, 221, 221, 222, 222, 223, 223, 224, 224, 225, 225, 226, 226, 227, 227, 228, 228, 229]) trace_171_b = np.array( [ 0, 1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15, 16, 18, 19, 20, 22, 23, 24, 26, 27, 28, 30, 31, 32, 33, 35, 36, 37, 39, 40, 41, 43, 44, 45, 47, 48, 49, 50, 52, 53, 54, 56, 57, 58, 60, 61, 62, 64, 65, 66, 67, 69, 70, 71, 73, 74, 75, 77, 78, 79, 81, 82, 83, 84, 86, 87, 88, 90, 91, 92, 94, 95, 96, 98, 99, 100, 101, 103, 104, 105, 107, 108, 109, 111, 112, 113, 115, 116, 117, 118, 120, 121, 122, 124, 125, 126, 128, 129, 130, 132, 133, 134, 135, 137, 138, 139, 141, 142, 143, 145, 146, 147, 149, 150, 151, 152, 154, 155, 156, 158, 159, 160, 162, 163, 164, 166, 167, 168, 169, 171, 172, 173, 175, 176, 177, 179, 180, 181, 183, 184, 185, 186, 188, 189, 190, 192, 193, 194, 196, 197, 198, 200, 200, 201, 201, 202, 202, 203, 203, 204, 204, 205, 205, 206, 206, 207, 207, 208, 208, 209, 209, 210, 211, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216, 216, 217, 217, 218, 218, 219, 219, 220, 220, 221, 222, 222, 223, 223, 224, 224, 225, 225, 226, 226, 227, 227, 228, 228, 229, 229, 230, 230, 231, 231, 232, 233, 233, 234, 234, 235, 235, 236, 236, 237, 237, 238, 238, 239, 239, 240, 240, 241, 241, 242, 242, 243, 244, 244, 245, 245, 246, 246, 247, 247, 248, 248, 249, 249, 250, 250, 251, 251, 252, 252, 253]) trace_195_r = np.array( [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 5, 7, 8, 10, 12, 14, 15, 17, 19, 21, 22, 24, 26, 28, 29, 31, 33, 35, 37, 38, 40, 42, 44, 45, 47, 49, 51, 52, 54, 56, 58, 59, 61, 63, 65, 67, 68, 70, 72, 74, 75, 77, 79, 81, 82, 84, 86, 88, 90, 91, 93, 95, 97, 98, 100, 102, 104, 105, 107, 109, 111, 112, 114, 116, 118, 119, 121, 123, 125, 127, 128, 130, 132, 134, 135, 137, 139, 141, 142, 144, 146, 148, 150, 151, 153, 155, 157, 158, 160, 162, 164, 165, 167, 169, 171, 172, 174, 176, 178, 180, 180, 180, 181, 181, 182, 182, 183, 183, 184, 184, 185, 185, 186, 186, 187, 187, 188, 188, 189, 189, 190, 190, 191, 191, 192, 192, 192, 193, 193, 194, 194, 195, 195, 196, 196, 197, 197, 198, 198, 199, 199, 200, 200, 201, 201, 202, 202, 203, 203, 204, 204, 204, 205, 205, 206, 206, 207, 207, 208, 208, 209, 209, 210, 210, 211, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216, 216, 217, 217, 217, 218, 218, 219, 219, 220, 220, 221, 221, 222, 222, 223, 223, 224, 224, 225, 225, 226, 226, 227, 227, 228, 228, 229]) trace_195_g = np.array( [ 0, 1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15, 16, 18, 19, 20, 22, 23, 24, 26, 27, 28, 30, 31, 32, 33, 35, 36, 37, 39, 40, 41, 43, 44, 45, 47, 48, 49, 50, 52, 53, 54, 56, 57, 58, 60, 61, 62, 64, 65, 66, 67, 69, 70, 71, 73, 74, 75, 77, 78, 79, 81, 82, 83, 84, 86, 87, 88, 90, 91, 92, 94, 95, 96, 98, 99, 100, 101, 103, 104, 105, 107, 108, 109, 111, 112, 113, 115, 116, 117, 118, 120, 121, 122, 124, 125, 126, 128, 129, 130, 132, 133, 134, 135, 137, 138, 139, 141, 142, 143, 145, 146, 147, 149, 150, 151, 152, 154, 155, 156, 158, 159, 160, 162, 163, 164, 166, 167, 168, 169, 171, 172, 173, 175, 176, 177, 179, 180, 181, 183, 184, 185, 186, 188, 189, 190, 192, 193, 194, 196, 197, 198, 200, 200, 201, 201, 202, 202, 203, 203, 204, 204, 205, 205, 206, 206, 207, 207, 208, 208, 209, 209, 210, 211, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216, 216, 217, 217, 218, 218, 219, 219, 220, 220, 221, 222, 222, 223, 223, 224, 224, 225, 225, 226, 226, 227, 227, 228, 228, 229, 229, 230, 230, 231, 231, 232, 233, 233, 234, 234, 235, 235, 236, 236, 237, 237, 238, 238, 239, 239, 240, 240, 241, 241, 242, 242, 243, 244, 244, 245, 245, 246, 246, 247, 247, 248, 248, 249, 249, 250, 250, 251, 251, 252, 252, 253]) trace_195_b = np.array( [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 4, 6, 7, 9, 10, 12, 13, 15, 16, 18, 19, 21, 23, 24, 26, 27, 29, 30, 32, 33, 35, 36, 38, 39, 41, 43, 44, 46, 47, 49, 50, 52, 53, 55, 56, 58, 59, 61, 63, 64, 66, 67, 69, 70, 72, 73, 75, 76, 78, 79, 81, 83, 84, 86, 87, 89, 90, 92, 93, 95, 96, 98, 100, 101, 103, 104, 106, 107, 109, 110, 112, 113, 115, 116, 118, 119, 121, 123, 124, 126, 127, 129, 130, 132, 133, 135, 136, 138, 140, 141, 143, 144, 146, 147, 149, 150, 152, 153, 155, 156, 158, 159, 161, 163, 164, 166, 167, 169, 170, 172, 173, 175, 176, 178, 180, 180, 180, 181, 181, 182, 182, 183, 183, 184, 184, 185, 185, 186, 186, 187, 187, 188, 188, 189, 189, 190, 190, 191, 191, 192, 192, 192, 193, 193, 194, 194, 195, 195, 196, 196, 197, 197, 198, 198, 199, 199, 200, 200, 201, 201, 202, 202, 203, 203, 204, 204, 204, 205, 205, 206, 206, 207, 207, 208, 208, 209, 209, 210, 210, 211, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216, 216, 217, 217, 217, 218, 218, 219, 219, 220, 220, 221, 221, 222, 222, 223, 223, 224, 224, 225, 225, 226, 226, 227, 227, 228, 228, 229]) trace_284_r = np.array( [ 0, 1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15, 16, 18, 19, 20, 22, 23, 24, 26, 27, 28, 30, 31, 32, 33, 35, 36, 37, 39, 40, 41, 43, 44, 45, 47, 48, 49, 50, 52, 53, 54, 56, 57, 58, 60, 61, 62, 64, 65, 66, 67, 69, 70, 71, 73, 74, 75, 77, 78, 79, 81, 82, 83, 84, 86, 87, 88, 90, 91, 92, 94, 95, 96, 98, 99, 100, 101, 103, 104, 105, 107, 108, 109, 111, 112, 113, 115, 116, 117, 118, 120, 121, 122, 124, 125, 126, 128, 129, 130, 132, 133, 134, 135, 137, 138, 139, 141, 142, 143, 145, 146, 147, 149, 150, 151, 152, 154, 155, 156, 158, 159, 160, 162, 163, 164, 166, 167, 168, 169, 171, 172, 173, 175, 176, 177, 179, 180, 181, 183, 184, 185, 186, 188, 189, 190, 192, 193, 194, 196, 197, 198, 200, 200, 201, 201, 202, 202, 203, 203, 204, 204, 205, 205, 206, 206, 207, 207, 208, 208, 209, 209, 210, 211, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216, 216, 217, 217, 218, 218, 219, 219, 220, 220, 221, 222, 222, 223, 223, 224, 224, 225, 225, 226, 226, 227, 227, 228, 228, 229, 229, 230, 230, 231, 231, 232, 233, 233, 234, 234, 235, 235, 236, 236, 237, 237, 238, 238, 239, 239, 240, 240, 241, 241, 242, 242, 243, 244, 244, 245, 245, 246, 246, 247, 247, 248, 248, 249, 249, 250, 250, 251, 251, 252, 252, 253]) trace_284_g = np.array( [ 0, 1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15, 16, 18, 19, 20, 22, 23, 24, 26, 27, 28, 30, 31, 32, 33, 35, 36, 37, 39, 40, 41, 43, 44, 45, 47, 48, 49, 50, 52, 53, 54, 56, 57, 58, 60, 61, 62, 64, 65, 66, 67, 69, 70, 71, 73, 74, 75, 77, 78, 79, 81, 82, 83, 84, 86, 87, 88, 90, 91, 92, 94, 95, 96, 98, 99, 100, 101, 103, 104, 105, 107, 108, 109, 111, 112, 113, 115, 116, 117, 118, 120, 121, 122, 124, 125, 126, 128, 129, 130, 132, 133, 134, 135, 137, 138, 139, 141, 142, 143, 145, 146, 147, 149, 150, 151, 152, 154, 155, 156, 158, 159, 160, 162, 163, 164, 166, 167, 168, 169, 171, 172, 173, 175, 176, 177, 179, 180, 181, 183, 184, 185, 186, 188, 189, 190, 192, 193, 194, 196, 197, 198, 200, 200, 201, 201, 202, 202, 203, 203, 204, 204, 205, 205, 206, 206, 207, 207, 208, 208, 209, 209, 210, 211, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216, 216, 217, 217, 218, 218, 219, 219, 220, 220, 221, 222, 222, 223, 223, 224, 224, 225, 225, 226, 226, 227, 227, 228, 228, 229, 229, 230, 230, 231, 231, 232, 233, 233, 234, 234, 235, 235, 236, 236, 237, 237, 238, 238, 239, 239, 240, 240, 241, 241, 242, 242, 243, 244, 244, 245, 245, 246, 246, 247, 247, 248, 248, 249, 249, 250, 250, 251, 251, 252, 252, 253]) trace_284_b = np.array( [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 5, 7, 8, 10, 12, 14, 15, 17, 19, 21, 22, 24, 26, 28, 29, 31, 33, 35, 37, 38, 40, 42, 44, 45, 47, 49, 51, 52, 54, 56, 58, 59, 61, 63, 65, 67, 68, 70, 72, 74, 75, 77, 79, 81, 82, 84, 86, 88, 90, 91, 93, 95, 97, 98, 100, 102, 104, 105, 107, 109, 111, 112, 114, 116, 118, 119, 121, 123, 125, 127, 128, 130, 132, 134, 135, 137, 139, 141, 142, 144, 146, 148, 150, 151, 153, 155, 157, 158, 160, 162, 164, 165, 167, 169, 171, 172, 174, 176, 178, 180, 180, 180, 181, 181, 182, 182, 183, 183, 184, 184, 185, 185, 186, 186, 187, 187, 188, 188, 189, 189, 190, 190, 191, 191, 192, 192, 192, 193, 193, 194, 194, 195, 195, 196, 196, 197, 197, 198, 198, 199, 199, 200, 200, 201, 201, 202, 202, 203, 203, 204, 204, 204, 205, 205, 206, 206, 207, 207, 208, 208, 209, 209, 210, 210, 211, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216, 216, 217, 217, 217, 218, 218, 219, 219, 220, 220, 221, 221, 222, 222, 223, 223, 224, 224, 225, 225, 226, 226, 227, 227, 228, 228, 229]) trace_1216_r = np.array( [ 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254]) trace_1216_g = np.array( [ 0, 1, 2, 4, 5, 7, 8, 10, 11, 12, 14, 15, 17, 18, 20, 21, 23, 24, 25, 27, 28, 30, 31, 33, 34, 35, 37, 38, 40, 41, 43, 44, 46, 47, 48, 50, 51, 53, 54, 56, 57, 58, 60, 61, 63, 64, 66, 67, 69, 70, 71, 73, 74, 76, 77, 79, 80, 81, 83, 84, 86, 87, 89, 90, 92, 93, 94, 96, 97, 99, 100, 102, 103, 104, 106, 107, 109, 110, 112, 113, 115, 116, 117, 119, 120, 122, 123, 125, 126, 127, 129, 130, 132, 133, 135, 136, 138, 139, 140, 142, 143, 145, 146, 148, 149, 150, 152, 153, 155, 156, 158, 159, 161, 162, 163, 165, 166, 168, 169, 171, 172, 173, 175, 176, 178, 179, 181, 182, 184, 185, 186, 188, 189, 191, 192, 194, 195, 196, 198, 199, 201, 202, 204, 205, 207, 208, 209, 211, 212, 214, 215, 217, 218, 220, 220, 220, 220, 221, 221, 221, 222, 222, 222, 223, 223, 223, 224, 224, 224, 225, 225, 225, 226, 226, 226, 227, 227, 227, 228, 228, 228, 229, 229, 229, 230, 230, 230, 231, 231, 231, 232, 232, 232, 233, 233, 233, 234, 234, 234, 235, 235, 235, 236, 236, 236, 237, 237, 237, 238, 238, 238, 239, 239, 239, 240, 240, 240, 241, 241, 241, 242, 242, 242, 243, 243, 243, 244, 244, 244, 245, 245, 245, 246, 246, 246, 247, 247, 247, 248, 248, 248, 249, 249, 249, 250, 250, 250, 251, 251, 251, 252, 252, 252, 253, 253, 253]) trace_1216_b = np.array( [ 0, 1, 2, 4, 5, 7, 8, 10, 11, 12, 14, 15, 17, 18, 20, 21, 23, 24, 25, 27, 28, 30, 31, 33, 34, 35, 37, 38, 40, 41, 43, 44, 46, 47, 48, 50, 51, 53, 54, 56, 57, 58, 60, 61, 63, 64, 66, 67, 69, 70, 71, 73, 74, 76, 77, 79, 80, 81, 83, 84, 86, 87, 89, 90, 92, 93, 94, 96, 97, 99, 100, 102, 103, 104, 106, 107, 109, 110, 112, 113, 115, 116, 117, 119, 120, 122, 123, 125, 126, 127, 129, 130, 132, 133, 135, 136, 138, 139, 140, 142, 143, 145, 146, 148, 149, 150, 152, 153, 155, 156, 158, 159, 161, 162, 163, 165, 166, 168, 169, 171, 172, 173, 175, 176, 178, 179, 181, 182, 184, 185, 186, 188, 189, 191, 192, 194, 195, 196, 198, 199, 201, 202, 204, 205, 207, 208, 209, 211, 212, 214, 215, 217, 218, 220, 220, 220, 220, 221, 221, 221, 222, 222, 222, 223, 223, 223, 224, 224, 224, 225, 225, 225, 226, 226, 226, 227, 227, 227, 228, 228, 228, 229, 229, 229, 230, 230, 230, 231, 231, 231, 232, 232, 232, 233, 233, 233, 234, 234, 234, 235, 235, 235, 236, 236, 236, 237, 237, 237, 238, 238, 238, 239, 239, 239, 240, 240, 240, 241, 241, 241, 242, 242, 242, 243, 243, 243, 244, 244, 244, 245, 245, 245, 246, 246, 246, 247, 247, 247, 248, 248, 248, 249, 249, 249, 250, 250, 250, 251, 251, 251, 252, 252, 252, 253, 253, 253]) trace_1550_r = np.array( [ 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 190, 190, 191, 191, 192, 193, 193, 194, 194, 195, 196, 196, 197, 198, 198, 199, 199, 200, 201, 201, 202, 203, 203, 204, 204, 205, 206, 206, 207, 208, 208, 209, 209, 210, 211, 211, 212, 212, 213, 214, 214, 215, 216, 216, 217, 217, 218, 219, 219, 220, 221, 221, 222, 222, 223, 224, 224, 225, 226, 226, 227, 227, 228, 229, 229, 230, 231, 231, 232, 232, 233, 234, 234, 235, 235, 236, 237, 237, 238, 239, 239, 240, 240, 241, 242, 242, 243, 244, 244, 245, 245, 246, 247, 247, 248, 249, 249, 250, 250, 251, 252, 252, 253]) trace_1550_g = np.array( [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 4, 6, 7, 9, 10, 12, 13, 15, 16, 18, 20, 21, 23, 24, 26, 27, 29, 30, 32, 33, 35, 37, 38, 40, 41, 43, 44, 46, 47, 49, 50, 52, 53, 55, 57, 58, 60, 61, 63, 64, 66, 67, 69, 70, 72, 74, 75, 77, 78, 80, 81, 83, 84, 86, 87, 89, 91, 92, 94, 95, 97, 98, 100, 101, 103, 104, 106, 107, 109, 111, 112, 114, 115, 117, 118, 120, 121, 123, 124, 126, 128, 129, 131, 132, 134, 135, 137, 138, 140, 141, 143, 145, 146, 148, 149, 151, 152, 154, 155, 157, 158, 160, 161, 163, 165, 166, 168, 169, 171, 172, 174, 175, 177, 178, 180, 181, 181, 182, 182, 183, 183, 184, 184, 185, 185, 186, 186, 187, 187, 188, 188, 189, 189, 190, 190, 191, 191, 192, 192, 193, 193, 194, 194, 195, 195, 196, 196, 197, 197, 198, 198, 199, 199, 200, 200, 201, 201, 202, 202, 203, 203, 204, 204, 205, 205, 206, 206, 207, 207, 208, 208, 209, 209, 210, 210, 211, 211, 212, 212, 213, 213, 214, 214, 215, 216, 216, 217, 217, 218, 218, 219, 219, 220, 220, 221, 221, 222, 222, 223, 223, 224, 224, 225, 225, 226, 226, 227, 227, 228, 228, 229, 229, 230, 230, 231, 231, 232]) trace_1550_b = np.array( [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99, 101, 103, 105, 107, 109, 111, 113, 115, 117, 119, 121, 123, 125, 127, 129, 131, 133, 135, 137, 139, 141, 143, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 181, 181, 182, 182, 183, 183, 184, 184, 185, 185, 186, 186, 187, 187, 188, 188, 189, 189, 190, 190, 191, 191, 192, 192, 193, 193, 194, 194, 195, 195, 196, 196, 197, 197, 198, 198, 199, 199, 200, 200, 201, 201, 202, 202, 203, 203, 204, 204, 205, 205, 206, 206, 207, 207, 208, 208, 209, 209, 210, 210, 211, 211, 212, 212, 213, 213, 214, 214, 215, 216, 216, 217, 217, 218, 218, 219, 219, 220, 220, 221, 221, 222, 222, 223, 223, 224, 224, 225, 225, 226, 226, 227, 227, 228, 228, 229, 229, 230, 230, 231, 231, 232]) trace_1600_r = np.array( [ 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 190, 190, 191, 191, 192, 193, 193, 194, 194, 195, 196, 196, 197, 198, 198, 199, 199, 200, 201, 201, 202, 203, 203, 204, 204, 205, 206, 206, 207, 208, 208, 209, 209, 210, 211, 211, 212, 212, 213, 214, 214, 215, 216, 216, 217, 217, 218, 219, 219, 220, 221, 221, 222, 222, 223, 224, 224, 225, 226, 226, 227, 227, 228, 229, 229, 230, 231, 231, 232, 232, 233, 234, 234, 235, 235, 236, 237, 237, 238, 239, 239, 240, 240, 241, 242, 242, 243, 244, 244, 245, 245, 246, 247, 247, 248, 249, 249, 250, 250, 251, 252, 252, 253]) trace_1600_g = np.array( [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 5, 7, 8, 10, 12, 14, 15, 17, 19, 21, 23, 24, 26, 28, 30, 31, 33, 35, 37, 38, 40, 42, 44, 46, 47, 49, 51, 53, 54, 56, 58, 60, 61, 63, 65, 67, 69, 70, 72, 74, 76, 77, 79, 81, 83, 84, 86, 88, 90, 92, 93, 95, 97, 99, 100, 102, 104, 106, 107, 109, 111, 113, 115, 116, 118, 120, 122, 123, 125, 127, 129, 130, 132, 134, 136, 138, 139, 141, 143, 145, 146, 148, 150, 152, 153, 155, 157, 159, 161, 162, 164, 166, 168, 169, 171, 173, 175, 176, 178, 180, 181, 181, 182, 182, 183, 183, 184, 184, 185, 185, 186, 186, 187, 187, 188, 188, 189, 189, 190, 190, 191, 191, 192, 192, 193, 193, 194, 194, 195, 195, 196, 196, 197, 197, 198, 198, 199, 199, 200, 200, 201, 201, 202, 202, 203, 203, 204, 204, 205, 205, 206, 206, 207, 207, 208, 208, 209, 209, 210, 210, 211, 211, 212, 212, 213, 213, 214, 214, 215, 216, 216, 217, 217, 218, 218, 219, 219, 220, 220, 221, 221, 222, 222, 223, 223, 224, 224, 225, 225, 226, 226, 227, 227, 228, 228, 229, 229, 230, 230, 231, 231, 232]) trace_1600_b = np.array( [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 11, 17, 22, 28, 34, 39, 45, 51, 57, 62, 68, 74, 79, 85, 91, 96, 102, 108, 114, 119, 125, 131, 136, 142, 142, 143, 143, 144, 144, 144, 145, 145, 146, 146, 146, 147, 147, 148, 148, 148, 149, 149, 150, 150, 150, 151, 151, 152, 152, 152, 153, 153, 154, 154, 154, 155, 155, 156, 156, 156, 157, 157, 158, 158, 158, 159, 159, 160, 160, 160, 161, 161, 162, 162, 162, 163, 163, 164, 164, 164, 165, 165, 166, 166, 166, 167, 167, 168, 168, 168, 169, 169, 170, 170, 170, 171, 171, 172, 172, 172, 173, 173, 174, 174, 174, 175, 175, 176, 176, 176, 177, 177, 178, 178, 178, 179, 179, 180, 180, 180, 181, 181, 182, 182, 182, 183]) trace_1700_r = np.array( [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28, 30, 31, 32, 33, 34, 35, 36, 37, 38, 40, 41, 42, 43, 44, 45, 46, 47, 48, 50, 51, 52, 53, 54, 55, 56, 57, 58, 60, 61, 62, 63, 64, 65, 66, 67, 68, 70, 71, 72, 73, 74, 75, 76, 77, 78, 80, 81, 82, 83, 84, 85, 86, 87, 88, 90, 91, 92, 93, 94, 95, 96, 97, 98, 100, 101, 102, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117, 118, 120, 121, 122, 123, 124, 125, 126, 127, 128, 130, 131, 132, 133, 134, 135, 136, 137, 138, 140, 141, 142, 143, 144, 145, 146, 147, 148, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 162, 163, 164, 165, 166, 167, 168, 170, 170, 171, 172, 173, 174, 174, 175, 176, 177, 178, 178, 179, 180, 181, 182, 183, 183, 184, 185, 186, 187, 187, 188, 189, 190, 191, 192, 192, 193, 194, 195, 196, 196, 197, 198, 199, 200, 200, 201, 202, 203, 204, 205, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 214, 214, 215, 216, 217, 218, 218, 219, 220, 221, 222, 223, 223, 224, 225, 226, 227, 227, 228, 229, 230, 231, 231, 232, 233, 234, 235, 236, 236, 237, 238, 239, 240, 240, 241, 242, 243, 244, 245, 245, 246, 247, 248, 249, 249, 250, 251, 252, 253]) trace_1700_g = np.array( [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 5, 6, 8, 10, 11, 13, 15, 16, 18, 20, 21, 23, 25, 26, 28, 30, 31, 33, 35, 36, 38, 40, 41, 43, 45, 46, 48, 50, 51, 53, 55, 56, 58, 60, 61, 63, 65, 66, 68, 70, 71, 73, 75, 76, 78, 80, 81, 83, 85, 86, 88, 90, 91, 93, 95, 96, 98, 100, 101, 103, 105, 106, 108, 110, 111, 113, 115, 116, 118, 120, 121, 123, 125, 126, 128, 130, 131, 133, 135, 136, 138, 140, 141, 143, 145, 146, 148, 150, 151, 153, 155, 156, 158, 160, 161, 163, 165, 166, 168, 170, 170, 171, 171, 172, 172, 173, 173, 174, 174, 175, 175, 176, 176, 177, 178, 178, 179, 179, 180, 180, 181, 181, 182, 182, 183, 183, 184, 184, 185, 186, 186, 187, 187, 188, 188, 189, 189, 190, 190, 191, 191, 192, 192, 193, 194, 194, 195, 195, 196, 196, 197, 197, 198, 198, 199, 199, 200, 200, 201, 202, 202, 203, 203, 204, 204, 205, 205, 206, 206, 207, 207, 208, 208, 209, 210, 210, 211, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216, 216, 217, 218, 218, 219, 219, 220, 220, 221, 221, 222, 222, 223, 223, 224]) trace_1700_b = np.array( [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 7, 11, 14, 18, 22, 26, 29, 33, 37, 41, 44, 48, 52, 56, 59, 63, 67, 71, 74, 78, 82, 86, 89, 93, 93, 94, 94, 94, 94, 95, 95, 95, 96, 96, 96, 97, 97, 97, 97, 98, 98, 98, 99, 99, 99, 99, 100, 100, 100, 101, 101, 101, 102, 102, 102, 102, 103, 103, 103, 104, 104, 104, 104, 105, 105, 105, 106, 106, 106, 107, 107, 107, 107, 108, 108, 108, 109, 109, 109, 109, 110, 110, 110, 111, 111, 111, 112, 112, 112, 112, 113, 113, 113, 114, 114, 114, 114, 115, 115, 115, 116, 116, 116, 116, 117, 117, 117, 118, 118, 118, 119, 119, 119, 119, 120, 120, 120, 121, 121, 121, 121, 122, 122, 122, 123, 123]) def trace_color_table(measurement): """Returns one of the standard color tables for TRACE JP2 files.""" # TRACE color tables try: r, g, b = { '171': (trace_171_r, trace_171_g, trace_171_b), '195': (trace_195_r, trace_195_g, trace_195_b), '284': (trace_284_r, trace_284_g, trace_284_b), '1216': (trace_1216_r, trace_1216_g, trace_1216_b), '1550': (trace_1550_r, trace_1550_g, trace_1550_b), '1600': (trace_1600_r, trace_1600_g, trace_1600_b), '1700': (trace_1700_r, trace_1700_g, trace_1700_b), 'WL': (grayscale, grayscale, grayscale) }[measurement] except KeyError: raise ValueError( "Invalid TRACE filter waveband passed. Valid values are " "171, 195, 284, 1216, 1550, 1600, 1700, WL" ) # Now create the color dictionary in the correct format cdict = create_cdict(r, g, b) # Return the color table return colors.LinearSegmentedColormap('TRACE {:s}'.format(measurement), cdict) def sot_color_table(measurement): """Returns one of the standard color tables for SOT files (following osdc convention). The relations between observation and color have been defined in hinode.py""" try: r, g, b = { 'intensity': (r0, g0, b0), # :todo # 'stokesQUV': (), # 'magnetic field': (), # 'velocity': (), # 'width': (), }[measurement] except KeyError: raise ValueError( "Invalid (or not supported) SOT type. Valid values are: " "intensity" # TODO, stokesQUV, magnetic field, velocity, width." ) cdict = create_cdict(r, g, b) return colors.LinearSegmentedColormap('Hinode SOT {:s}'.format(measurement), cdict) def iris_sji_color_table(measurement, aialike=False): """Return the standard color table for IRIS SJI files""" # base vectors for IRIS SJI color tables c0 = np.arange(0, 256) c1 = (np.sqrt(c0) * np.sqrt(255)).astype(np.uint8) c2 = (c0 ** 2 / 255.).astype(np.uint8) c3= ((c1 + c2/2.)*255./(np.max(c1) + np.max(c2)/2.)).astype(np.uint8) c4 = np.zeros(256).astype(np.uint8) c4[50:256] = (1/165. * np.arange(0, 206) ** 2).astype(np.uint8) c5 = ((1 + c1 + c3.astype(np.uint))/2.).astype(np.uint8) rr = np.ones(256, dtype=np.uint8) * 255 rr[0:176] = np.arange(0, 176) / 175. * 255. gg = np.zeros(256, dtype=np.uint8) gg[100:256] = np.arange(0, 156) / 155. * 255. bb = np.zeros(256, dtype=np.uint8) bb[150:256] = np.arange(0, 106) / 105. * 255. agg = np.zeros(256, dtype=np.uint8) agg[120:256] = np.arange(0, 136) / 135. * 255. abb = np.zeros(256, dtype=np.uint8) abb[190:256] = np.arange(0, 66) / 65. * 255. if aialike: color_table = { '1330': (c1, c0, c2), '1400': (rr, agg, abb), '2796': (rr, c0, abb), '2832': (c3, c3, c2), } else: color_table = { '1330': (rr, gg, bb), '1400': (c5, c2, c4), '2796': (c1, c3, c2), '2832': (c0, c0, c2), } color_table.update({ '1600': (c1, c0, c0), '5000': (c1, c1, c0), 'FUV': (rr, gg, bb), 'NUV': (c1, c3, c2), 'SJI_NUV': (c0, c0, c0) }) try: r, g, b = color_table[measurement] except KeyError: raise ValueError( "Invalid IRIS SJI waveband. Valid values are \n" + str(list(color_table.keys())) ) # Now create the color dictionary in the correct format cdict = create_cdict(r, g, b) # Return the color table return colors.LinearSegmentedColormap('IRIS SJI {:s}'.format(measurement), cdict) hmi_mag_r = np.array( [137, 140, 142, 144, 149, 151, 154, 158, 161, 163, 167, 170, 172, 175, 179, 182, 184, 188, 191, 193, 195, 200, 202, 205, 209, 212, 214, 218, 221, 223, 226, 230, 232, 235, 239, 242, 244, 248, 251, 255, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 199, 181, 154, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, 197, 194, 191, 189, 186, 183, 181, 178, 175, 173, 170, 167, 165, 162, 159, 157, 154, 151, 148, 146, 143, 140, 138, 135, 132, 130, 127, 124, 122, 119, 116, 114, 111, 108, 105, 103, 100, 97, 95, 92, 89, 87, 84, 81, 79, 76, 73, 71, 68, 65, 63, 60, 56, 52, 49, 45, 42, 38, 35, 31, 28, 24, 21, 17, 14, 10, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) hmi_mag_g = np.array( [ 0, 1, 2, 4, 4, 7, 8, 10, 11, 14, 14, 17, 17, 20, 20, 23, 23, 26, 28, 28, 31, 31, 33, 35, 35, 38, 40, 42, 42, 45, 45, 47, 49, 51, 52, 54, 56, 56, 59, 61, 63, 65, 67, 70, 72, 75, 77, 80, 82, 85, 87, 90, 92, 95, 97, 99, 101, 104, 106, 108, 111, 113, 115, 117, 120, 122, 124, 127, 129, 131, 134, 136, 138, 140, 143, 145, 147, 150, 152, 154, 157, 159, 161, 163, 166, 168, 170, 173, 175, 177, 179, 182, 184, 186, 189, 191, 193, 196, 198, 200, 202, 205, 207, 209, 212, 214, 216, 219, 103, 111, 120, 129, 138, 147, 156, 165, 174, 183, 192, 201, 210, 219, 228, 237, 246, 255, 200, 181, 154, 129, 120, 127, 135, 143, 151, 159, 167, 175, 183, 191, 199, 207, 215, 223, 231, 239, 247, 255, 200, 198, 196, 194, 192, 190, 188, 186, 184, 183, 181, 179, 177, 175, 173, 171, 169, 168, 166, 164, 162, 160, 158, 156, 154, 152, 151, 149, 147, 145, 143, 141, 139, 137, 136, 134, 132, 130, 128, 126, 124, 122, 120, 119, 117, 115, 113, 111, 109, 107, 105, 104, 101, 98, 96, 93, 90, 88, 85, 82, 80, 77, 74, 72, 69, 66, 64, 61, 58, 56, 54, 52, 51, 49, 47, 45, 42, 42, 40, 38, 35, 35, 33, 31, 28, 28, 26, 23, 23, 20, 20, 17, 17, 14, 13, 11, 10, 8, 4, 4, 2, 1, 0, 0, 0, 0, 0, 0]) hmi_mag_b = np.array( [ 20, 17, 17, 17, 17, 17, 16, 16, 14, 14, 14, 14, 13, 13, 11, 11, 11, 11, 10, 10, 8, 8, 8, 8, 7, 7, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 1, 1, 0, 0, 2, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 42, 45, 48, 50, 53, 56, 59, 61, 64, 67, 70, 72, 75, 78, 81, 83, 86, 89, 92, 94, 97, 100, 103, 105, 108, 111, 114, 116, 119, 122, 124, 127, 130, 133, 135, 138, 141, 144, 146, 149, 152, 155, 157, 160, 163, 166, 168, 171, 174, 177, 179, 182, 185, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130, 166, 167, 104, 14, 18, 23, 27, 32, 36, 41, 46, 50, 55, 59, 64, 69, 73, 78, 82, 87, 92, 255, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 246, 244, 239, 237, 232, 228, 226, 221, 219, 214, 211, 207, 204, 200, 195, 193, 188, 186, 182, 179, 175, 172, 168, 165, 161, 158, 154, 149, 147, 142, 140, 135, 133, 121, 109, 96, 84, 73]) def hmi_mag_color_table(): """ Returns an alternate HMI Magnetogram color table; from Stanford University/JSOC Examples -------- >>> # Example usage for NRT data: >>> import sunpy.map >>> import sunpy.cm >>> hmi = sunpy.map.Map('fblos.fits') # doctest: +SKIP >>> hmi.plot_settings['cmap'] = sunpy.cm.get_cmap('hmimag') # doctest: +SKIP >>> hmi.peek(vmin=-1500.0, vmax=1500.0) # doctest: +SKIP >>> # OR (for a basic plot with pixel values on the axes) >>> import numpy as np >>> import matplotlib.pyplot as plt >>> import sunpy.map >>> import sunpy.cm >>> hmi = sunpy.map.Map('fblos.fits') # doctest: +SKIP >>> plt.imshow(np.clip(hmi.data, -1500.0, 1500.0), cmap=sunpy.cm.get_cmap('hmimag'), origin='lower') # doctest: +SKIP >>> plt.show() # doctest: +SKIP >>> # Example usage for science (Level 1.0) data: >>> import numpy as np >>> import sunpy.map >>> import sunpy.cm >>> hmi = sunpy.map.Map('hmi.m_45s.2014.05.11_12_00_45_TAI.magnetogram.fits') # doctest: +SKIP >>> hmir = hmi.rotate() # doctest: +SKIP >>> hmir.plot_settings['cmap'] = sunpy.cm.get_cmap('hmimag') # doctest: +SKIP >>> hmir.peek(vmin=-1500.0, vmax=1500.0) # doctest: +SKIP References ---------- * `Stanford Colortable (pdf) `_ """ cdict = create_cdict(hmi_mag_r, hmi_mag_g, hmi_mag_b) return colors.LinearSegmentedColormap('SDO HMI magnetogram', cdict) hi1_blue = np.array( [ 0, 1, 2, 4, 5, 6, 8, 9, 10, 12, 13, 14, 16, 17, 18, 20, 21, 23, 24, 25, 27, 28, 29, 31, 32, 33, 35, 36, 37, 39, 40, 42, 43, 44, 46, 47, 48, 50, 51, 52, 54, 55, 56, 58, 59, 61, 62, 63, 65, 66, 67, 69, 70, 71, 73, 74, 75, 77, 78, 80, 81, 82, 84, 85, 86, 88, 89, 90, 92, 93, 94, 96, 97, 99, 100, 101, 103, 104, 105, 107, 108, 109, 111, 112, 113, 115, 116, 118, 119, 120, 122, 123, 124, 126, 127, 128, 130, 131, 132, 134, 135, 136, 138, 139, 141, 142, 143, 145, 146, 147, 149, 150, 151, 153, 154, 155, 157, 158, 160, 161, 162, 164, 165, 166, 168, 169, 170, 172, 173, 174, 176, 177, 179, 180, 181, 183, 184, 185, 187, 188, 189, 191, 192, 193, 195, 196, 198, 199, 200, 202, 203, 204, 206, 207, 208, 210, 211, 212, 214, 215, 217, 218, 219, 221, 222, 223, 225, 226, 227, 229, 230, 231, 233, 234, 236, 237, 238, 240, 241, 242, 244, 245, 246, 248, 249, 250, 252, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255], dtype=np.uint8) hi1_green = np.array( [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 5, 7, 9, 10, 12, 13, 15, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 34, 36, 37, 39, 41, 42, 44, 45, 47, 49, 50, 52, 53, 55, 57, 58, 60, 61, 63, 65, 66, 68, 69, 71, 73, 74, 76, 77, 79, 81, 82, 84, 85, 87, 89, 90, 92, 94, 95, 97, 98, 100, 102, 103, 105, 106, 108, 110, 111, 113, 114, 116, 118, 119, 121, 122, 124, 126, 127, 129, 130, 132, 134, 135, 137, 138, 140, 142, 143, 145, 146, 148, 150, 151, 153, 154, 156, 158, 159, 161, 162, 164, 166, 167, 169, 170, 172, 174, 175, 177, 179, 180, 182, 183, 185, 187, 188, 190, 191, 193, 195, 196, 198, 199, 201, 203, 204, 206, 207, 209, 211, 212, 214, 215, 217, 219, 220, 222, 223, 225, 227, 228, 230, 231, 233, 235, 236, 238, 239, 241, 243, 244, 246, 247, 249, 251, 252, 254, 255], dtype=np.uint8) hi1_red = np.array( [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45, 49, 53, 57, 61, 65, 69, 73, 77, 81, 85, 90, 94, 98, 102, 106, 110, 114, 118, 122, 126, 130, 134, 138, 142, 146, 150, 154, 158, 162, 166, 170, 175, 179, 183, 187, 191, 195, 199, 203, 207, 211, 215, 219, 223, 227, 231, 235, 239, 243, 247, 251, 255], dtype=np.uint8) hi2_blue = np.array( [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 6, 7, 9, 9, 10, 11, 12, 13, 14, 15, 17, 17, 18, 18, 19, 20, 22, 23, 25, 25, 26, 26, 27, 28, 29, 30, 32, 32, 33, 33, 34, 35, 36, 37, 39, 39, 40, 40, 41, 42, 43, 44, 46, 46, 47, 48, 49, 50, 51, 52, 54, 54, 53, 53, 52, 54, 56, 58, 60, 60, 61, 62, 63, 64, 65, 66, 68, 69, 70, 71, 73, 74, 75, 76, 77, 78, 79, 80, 82, 82, 83, 83, 84, 85, 86, 87, 89, 90, 91, 92, 94, 95, 96, 97, 98, 99, 100, 101, 103, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 115, 116, 117, 118, 119, 120, 121, 122, 124, 124, 125, 125, 126, 127, 129, 131, 133, 134, 136, 138, 140, 141, 143, 144, 146, 147, 149, 151, 153, 154, 156, 157, 159, 160, 161, 162, 164, 165, 166, 167, 169, 170, 172, 173, 175, 176, 177, 178, 180, 181, 183, 184, 186, 187, 188, 189, 191, 192, 193, 194, 196, 197, 199, 200, 202, 203, 204, 205, 207, 208, 209, 210, 212, 213, 214, 215, 217, 218, 219, 220, 221, 222, 223, 224, 226, 227, 228, 229, 230, 231, 232, 233, 235, 236, 237, 238, 239, 240, 241, 242, 243, 243, 244, 245, 246, 246, 247, 248, 249, 249, 250, 251, 252, 252, 253, 254], dtype=np.uint8) hi2_green = np.array( [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 6, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 10, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 18, 19, 20, 20, 20, 20, 20, 21, 22, 23, 24, 24, 24, 24, 24, 25, 26, 27, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 61, 62, 63, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 107, 110, 113, 116, 119, 122, 125, 128, 131, 134, 137, 140, 143, 146, 149, 152, 155, 158, 161, 164, 167, 170, 173, 176, 180, 184, 188, 192, 197, 202, 207, 212, 217, 222, 227, 232, 237, 242, 247, 252, 252, 253, 254], dtype=np.uint8) hi2_red = np.array( [ 0, 0, 3, 6, 10, 13, 17, 20, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 85, 86, 87, 88, 90, 92, 94, 96, 97, 98, 99, 100, 102, 104, 106, 108, 109, 110, 111, 112, 114, 116, 118, 120, 121, 122, 123, 124, 126, 128, 130, 132, 133, 134, 135, 136, 138, 140, 142, 144, 145, 146, 147, 148, 150, 152, 154, 156, 157, 158, 159, 160, 162, 164, 166, 168, 169, 170, 171, 172, 174, 176, 178, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 198, 200, 202, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 222, 224, 226, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 246, 248, 250, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 253, 254], dtype=np.uint8) def stereo_hi_color_table(camera): if camera == 1: cdict = create_cdict(hi1_red, hi1_green, hi1_blue) return colors.LinearSegmentedColormap('STEREO HI1', cdict) elif camera == 2: cdict = create_cdict(hi2_red, hi2_green, hi2_blue) return colors.LinearSegmentedColormap('STEREO HI2', cdict) else: raise ValueError("Valid HI cameras are 1 and 2") def create_cdict(r, g, b): """Create the color tuples in the correct format.""" i = np.linspace(0, 1, r0.size) cdict = dict( (name, list(zip(i, el / 255.0, el / 255.0))) for el, name in [(r, 'red'), (g, 'green'), (b, 'blue')] ) return cdict sunpy-0.8.3/sunpy/coordinates/0000755000175000017500000000000013232563477016600 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/coordinates/tests/0000755000175000017500000000000013232563477017742 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/coordinates/tests/__init__.py0000644000175000001440000000000013203275053021013 0ustar nabil00000000000000sunpy-0.8.3/sunpy/coordinates/tests/test_ephemeris.py0000644000175000017500000000771213231613137023327 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- import astropy.units as u from astropy.tests.helper import assert_quantity_allclose from astropy.coordinates import EarthLocation from astropy.time import Time from sunpy.coordinates.ephemeris import * def test_get_body_barycentric(): # Validate against published values from the Astronomical Almanac (2013) e1 = get_body_heliographic_stonyhurst('earth', '2013-Jan-01') assert_quantity_allclose(e1.lon, 0*u.deg, atol=1e-12*u.deg) assert_quantity_allclose(e1.lat, -3.03*u.deg, atol=5e-3*u.deg) assert_quantity_allclose(e1.radius, 0.9832947*u.AU, atol=5e-7*u.AU) e2 = get_body_heliographic_stonyhurst('earth', '2013-Sep-01') assert_quantity_allclose(e2.lon, 0*u.deg, atol=1e-12*u.deg) assert_quantity_allclose(e2.lat, 7.19*u.deg, atol=5e-3*u.deg) assert_quantity_allclose(e2.radius, 1.0092561*u.AU, atol=5e-7*u.AU) def test_get_earth(): # Validate against published values from the Astronomical Almanac (2013) e1 = get_earth('2013-Jan-01') assert e1.lon == 0*u.deg assert_quantity_allclose(e1.lat, -3.03*u.deg, atol=5e-3*u.deg) assert_quantity_allclose(e1.radius, 0.9832947*u.AU, atol=5e-7*u.AU) e2 = get_earth('2013-Sep-01') assert e2.lon == 0*u.deg assert_quantity_allclose(e2.lat, 7.19*u.deg, atol=5e-3*u.deg) assert_quantity_allclose(e2.radius, 1.0092561*u.AU, atol=5e-7*u.AU) def test_get_sun_B0(): # Validate against a published value from Astronomical Algorithms (Meeus 1998, p.191) assert_quantity_allclose(get_sun_B0('1992-Oct-13'), 5.99*u.deg, atol=5e-3*u.deg) def test_get_sun_B0_array_time(): # Validate against published values from the Astronomical Almanac (2013) sun_B0 = get_sun_B0(Time(['2013-04-01', '2013-12-01'])) assert_quantity_allclose(sun_B0[0], -6.54*u.deg, atol=5e-3*u.deg) assert_quantity_allclose(sun_B0[1], 0.88*u.deg, atol=5e-3*u.deg) def test_get_sun_L0(): # Validate against a published value from Astronomical Algorithms (Meeus 1998, p.191) assert_quantity_allclose(get_sun_L0('1992-Oct-13'), 238.6317*u.deg, atol=5e-5*u.deg) def test_get_sun_L0_array_time(): # Validate against published values from the Astronomical Almanac (2013) sun_L0 = get_sun_L0(Time(['2013-04-01', '2013-12-01'])) assert_quantity_allclose(sun_L0[0], 221.44*u.deg, atol=3e-2*u.deg) assert_quantity_allclose(sun_L0[1], 237.83*u.deg, atol=3e-2*u.deg) def test_get_sun_P(): # Validate against a published value from Astronomical Algorithms (Meeus 1998, p.191) assert_quantity_allclose(get_sun_P('1992-Oct-13'), 26.27*u.deg, atol=5e-3*u.deg) def test_get_sun_P_array_time(): # Validate against published values from the Astronomical Almanac (2013) sun_P = get_sun_P(Time(['2013-04-01', '2013-12-01'])) assert_quantity_allclose(sun_P[0], -26.15*u.deg, atol=1e-2*u.deg) assert_quantity_allclose(sun_P[1], 16.05*u.deg, atol=1e-2*u.deg) def test_get_sunearth_distance(): # Validate against a published value from Astronomical Algorithms (Meeus 1998, p.191) assert_quantity_allclose(get_sunearth_distance('1992-Oct-13'), 0.997608*u.AU, atol=5e-7*u.AU) def test_get_sunearth_distance_array_time(): # Validate against published values from the Astronomical Almanac (2013) sunearth_distance = get_sunearth_distance(Time(['2013-04-01', '2013-12-01'])) assert_quantity_allclose(sunearth_distance[0], 0.9992311*u.AU, atol=5e-7*u.AU) assert_quantity_allclose(sunearth_distance[1], 0.9861362*u.AU, atol=5e-7*u.AU) def test_get_sun_orientation(): # Not currently aware of a published value to check against, so just self-check for now # Check the Northern Hemisphere angle = get_sun_orientation(EarthLocation(lat=40*u.deg, lon=-75*u.deg), '2017-07-18 12:00') assert_quantity_allclose(angle, -59.4*u.deg, atol=0.1*u.deg) # Check the Southern Hemisphere angle = get_sun_orientation(EarthLocation(lat=-40*u.deg, lon=-75*u.deg), '2017-02-18 13:00') assert_quantity_allclose(angle, -110.8*u.deg, atol=0.1*u.deg) sunpy-0.8.3/sunpy/coordinates/tests/test_frameattributes.py0000644000175000017500000001146113231613137024543 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- import datetime import pytest import astropy.units as u from astropy.time import Time from astropy.tests.helper import assert_quantity_allclose from astropy.coordinates import ICRS, get_body_barycentric from sunpy.time import parse_time from ..frames import Helioprojective, HeliographicStonyhurst from ..frameattributes import TimeFrameAttributeSunPy, ObserverCoordinateAttribute from sunpy.coordinates import get_earth, frames @pytest.fixture def attr(): return TimeFrameAttributeSunPy() def test_now(attr): """ We can't actually test the value independantly """ result, converted = attr.convert_input('now') assert isinstance(result, Time) assert converted def test_none(attr): """ We can't actually test the value independantly """ result, converted = attr.convert_input(None) assert result is None assert not converted @pytest.mark.parametrize('input', [ Time('2012-01-01 00:00:00'), '2012/01/01T00:00:00', '20120101000000', '2012/01/01 00:00:00' ]) def test_convert(attr, input): result, converted = attr.convert_input(input) output = Time('2012-01-01 00:00:00') assert isinstance(result, Time) assert result == output @pytest.mark.parametrize('input', [ Time('2012-01-01 00:00:00'), '2012/01/01T00:00:00', '20120101000000', '2012/01/01 00:00:00' ]) def test_on_frame(input): hpc1 = Helioprojective(obstime=input) output = Time('2012-01-01 00:00:00') assert isinstance(hpc1.obstime, Time) assert hpc1.obstime == output def test_non_string(): output = datetime.datetime.now() hpc1 = Helioprojective(obstime=output) assert isinstance(hpc1.obstime, Time) assert hpc1.obstime == output def test_on_frame_error(): with pytest.raises(ValueError): Helioprojective(obstime='ajshdasjdhk') def test_on_frame_error2(): with pytest.raises(ValueError): Helioprojective(obstime=17263871263) # ObserverCoordinateAttribute def test_string_coord(): oca = ObserverCoordinateAttribute(HeliographicStonyhurst) obstime = "2011-01-01" coord = oca._convert_string_to_coord("earth", obstime) assert isinstance(coord, HeliographicStonyhurst) assert coord.obstime == parse_time(obstime) def test_coord_get(): # Test default (instance=None) obs = Helioprojective.observer assert obs is "earth" # Test get obstime = "2013-04-01" obs = Helioprojective(observer="earth", obstime=obstime).observer earth = get_earth(obstime) assert isinstance(obs, HeliographicStonyhurst) assert_quantity_allclose(obs.lon, earth.lon) assert_quantity_allclose(obs.lat, earth.lat) assert_quantity_allclose(obs.radius, earth.radius) # Test get obstime = "2013-04-01" obs = Helioprojective(obstime=obstime).observer earth = get_earth(obstime) assert isinstance(obs, HeliographicStonyhurst) assert_quantity_allclose(obs.lon, earth.lon) assert_quantity_allclose(obs.lat, earth.lat) assert_quantity_allclose(obs.radius, earth.radius) # Test get mars obstime = Time(parse_time("2013-04-01")) obs = Helioprojective(observer="mars", obstime=obstime).observer out_icrs = ICRS(get_body_barycentric("mars", obstime)) mars = out_icrs.transform_to(HeliographicStonyhurst(obstime=obstime)) assert isinstance(obs, HeliographicStonyhurst) assert_quantity_allclose(obs.lon, mars.lon) assert_quantity_allclose(obs.lat, mars.lat) assert_quantity_allclose(obs.radius, mars.radius) def test_default_hcc_observer(): h = frames.Heliocentric() assert h.observer is "earth" h = frames.Heliocentric(observer="mars") assert h.observer is "mars" def test_obstime_hack(): """ Test that the obstime can be updated in place, this is used in the transform pipeline. """ h = frames.Heliocentric() assert h.observer is "earth" obstime = "2011-01-01" h._obstime = obstime assert isinstance(h.observer, frames.HeliographicStonyhurst) earth = get_earth(obstime) obs = h._observer assert isinstance(obs, HeliographicStonyhurst) assert_quantity_allclose(obs.lon, earth.lon) assert_quantity_allclose(obs.lat, earth.lat) assert_quantity_allclose(obs.radius, earth.radius) """ These two tests are to make sure that during the transformation stack the value of observer is correctly calculated. """ def test_default_observer_transform_hcc(): center = frames.HeliographicStonyhurst(0 * u.deg, 0 * u.deg, obstime="2017-07-11 15:00") hpc = center.transform_to(frames.Heliocentric) assert_quantity_allclose(hpc.y, -48471.1283979 * u.km) def test_default_observer_transform_hpc(): center = frames.HeliographicStonyhurst(0 * u.deg, 0 * u.deg, obstime="2017-07-11 15:00") hpc = center.transform_to(frames.Helioprojective) assert_quantity_allclose(hpc.Ty, -66.04425197 * u.arcsec) sunpy-0.8.3/sunpy/coordinates/tests/test_frames.py0000644000175000017500000003223613231613137022622 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- import numpy as np import pytest import astropy.units as u from astropy.tests.helper import assert_quantity_allclose from astropy.coordinates import (UnitSphericalRepresentation, SphericalRepresentation, CartesianRepresentation) from ... import sun from ..frames import (Helioprojective, HeliographicStonyhurst, Heliocentric, HeliographicCarrington) from ..representation import (UnitSphericalWrap180Representation, SphericalWrap180Representation) RSUN_METERS = sun.constants.get('radius').si.to(u.m) DSUN_METERS = sun.constants.get('mean distance').si.to(u.m) def init_frame(frame, args, kwargs): if args and kwargs: return frame(*args, **kwargs) elif args: return frame(*args) elif kwargs: return frame(**kwargs) """ These are common 2D params, kwargs are frame specific """ two_D_parameters = [ ([0 * u.deg, 0 * u.arcsec], None), ([0 * u.deg, 0 * u.arcsec], {'obstime': '2011/01/01T00:00:00'}), ([0 * u.deg, 0 * u.arcsec], {'representation': 'unitsphericalwrap180'}), ([0 * u.deg, 0 * u.arcsec], {'representation': 'unitspherical'}), ([UnitSphericalWrap180Representation(0 * u.deg, 0 * u.arcsec)], None), ([UnitSphericalRepresentation(0 * u.deg, 0 * u.arcsec)], None), ( [UnitSphericalWrap180Representation(0 * u.deg, 0 * u.arcsec)], {'obstime': '2011/01/01T00:00:00'}) ] """ These are common 3D params, kwargs are frame specific """ three_D_parameters = [ ([0 * u.deg, 0 * u.arcsec, 1 * u.Mm], None), ([0 * u.deg, 0 * u.arcsec, 1 * u.Mm], {'obstime': '2011/01/01T00:00:00'}), ([0 * u.deg, 0 * u.arcsec, 1 * u.Mm], {'representation': 'sphericalwrap180' }), ([0 * u.deg, 0 * u.arcsec, 1 * u.Mm], {'representation': 'spherical'}), ([SphericalWrap180Representation(0 * u.deg, 0 * u.arcsec, 1 * u.Mm)], None), ([SphericalRepresentation(0 * u.deg, 0 * u.arcsec, 1 * u.Mm)], None), ( [SphericalWrap180Representation(0 * u.deg, 0 * u.arcsec, 1 * u.Mm)], {'obstime': '2011/01/01T00:00:00'}) ] # ============================================================================== # Helioprojective Tests # ============================================================================== @pytest.mark.parametrize('args, kwargs', two_D_parameters + [(None, {'Tx': 0 * u.deg, 'Ty': 0 * u.arcsec})]) def test_create_hpc_2d(args, kwargs): hpc1 = init_frame(Helioprojective, args, kwargs) # Check we have the right class! assert isinstance(hpc1, Helioprojective) rep_kwarg = kwargs.get('representation', None) if kwargs else None if rep_kwarg and rep_kwarg == 'unitspherical': # Check that we have a unitspherical representation assert isinstance(hpc1._data, UnitSphericalRepresentation) else: # Check that we have a 2D wrap180 representation assert isinstance(hpc1._data, UnitSphericalWrap180Representation) # Check the attrs are correct assert hpc1.Tx == 0 * u.arcsec assert hpc1.Ty == 0 * u.arcsec # Check the attrs are in the correct default units assert hpc1.Tx.unit is u.arcsec assert hpc1.Ty.unit is u.arcsec @pytest.mark.parametrize( 'args, kwargs', three_D_parameters + [(None, {'Tx': 0 * u.deg, 'Ty': 0 * u.arcsec, 'distance': 1 * u.Mm}), ([0 * u.deg, 0 * u.arcsec], {'distance': 1 * u.Mm})]) def test_create_3d(args, kwargs): hpc1 = init_frame(Helioprojective, args, kwargs) # Check we have the right class! assert isinstance(hpc1, Helioprojective) rep_kwarg = kwargs.get('representation', None) if kwargs else None if rep_kwarg and rep_kwarg == 'spherical': # Check that we have a unitspherical representation assert isinstance(hpc1._data, SphericalRepresentation) else: # Check that we have a 2D wrap180 representation assert isinstance(hpc1._data, SphericalWrap180Representation) # Check the attrs are correct assert hpc1.Tx == 0 * u.arcsec assert hpc1.Ty == 0 * u.arcsec assert hpc1.distance == 1 * u.Mm # Check the attrs are in the correct default units assert hpc1.Tx.unit is u.arcsec assert hpc1.Ty.unit is u.arcsec assert hpc1.distance.unit is u.km def test_cart_init(): hpc1 = Helioprojective(CartesianRepresentation(0 * u.km, 0 * u.km, 1 * u.Mm)) assert isinstance(hpc1, Helioprojective) assert isinstance(hpc1._data, CartesianRepresentation) # # This is not actually valid, it should be re-purposed to be Heliocentric # # cylindrical Assuming that that is a vaild representation. # cylindrical_parameters = [ # ([100 * u.km, 25 * u.deg, 1 * u.Mm], {'representation': 'cylindrical'}), ( # [100 * u.km, 25 * u.deg, 1 * u.Mm], {'obstime': '2011/01/01T00:00:00', # 'representation': 'cylindrical'}), # ([100 * u.km, 25 * u.deg], {'distance': 1 * u.Mm, # 'representation': 'cylindrical'}), # (None, {'rho': 100 * u.km, # 'psi': 25 * u.deg, # 'distance': 1 * u.Mm, # 'representation': 'cylindrical'}), # ([CylindricalRepresentation(100 * u.km, 25 * u.deg, 1 * u.Mm)], # {'representation': 'cylindrical'}), ( # [CylindricalRepresentation(100 * u.km, 25 * u.deg, 1 * u.Mm)], # {'obstime': '2011/01/01T00:00:00', # 'representation': 'cylindrical'}) # ] # # # @pytest.mark.parametrize('args, kwargs', cylindrical_parameters) # def test_create_cylindrical(args, kwargs): # hpc1 = init_frame(Helioprojective, args, kwargs) # # # Check we have the right class! # assert isinstance(hpc1, Helioprojective) # # Check that we have a 2D wrap180 representation # assert isinstance(hpc1._data, CylindricalRepresentation) # # # Check the attrs are correct # assert hpc1.rho == 100 * u.km # assert hpc1.psi == 25 * u.deg # assert hpc1.distance == 1 * u.Mm # # # Check the attrs are in the correct default units # assert hpc1.rho.unit is u.km # assert hpc1.psi.unit is u.arcsec # assert hpc1.distance.unit is u.km # Test HPC Calculate Distance def test_hpc_distance(): hpc1 = Helioprojective(0 * u.deg, 0 * u.arcsec, observer=HeliographicStonyhurst(0*u.deg, 0*u.deg, 1*u.AU)) assert isinstance(hpc1, Helioprojective) # Check that we have a 2D wrap180 representation assert isinstance(hpc1._data, UnitSphericalWrap180Representation) # Check the attrs are correct assert hpc1.Tx == 0 * u.arcsec assert hpc1.Ty == 0 * u.arcsec hpc2 = hpc1.calculate_distance() assert isinstance(hpc2._data, SphericalWrap180Representation) # Check the attrs are correct assert hpc2.Tx == 0 * u.arcsec assert hpc2.Ty == 0 * u.arcsec assert_quantity_allclose(hpc2.distance, DSUN_METERS - RSUN_METERS) def test_hpc_distance_off_limb(): hpc1 = Helioprojective(1500 * u.arcsec, 0 * u.arcsec, observer=HeliographicStonyhurst(0*u.deg, 0*u.deg, 1*u.AU)) assert isinstance(hpc1, Helioprojective) # Check that we have a 2D wrap180 representation assert isinstance(hpc1._data, UnitSphericalWrap180Representation) # Check the attrs are correct assert hpc1.Tx == 1500 * u.arcsec assert hpc1.Ty == 0 * u.arcsec hpc2 = hpc1.calculate_distance() assert isinstance(hpc2._data, SphericalWrap180Representation) # Check the attrs are correct assert hpc2.Tx == 1500 * u.arcsec assert hpc2.Ty == 0 * u.arcsec assert_quantity_allclose(hpc2.distance, u.Quantity(np.nan, u.km)) def test_hpc_distance_3D(): hpc1 = Helioprojective(1500 * u.arcsec, 0 * u.arcsec, 100 * u.Mm) assert isinstance(hpc1, Helioprojective) # Check that we have a 2D wrap180 representation assert isinstance(hpc1._data, SphericalWrap180Representation) # Check the attrs are correct assert hpc1.Tx == 1500 * u.arcsec assert hpc1.Ty == 0 * u.arcsec hpc2 = hpc1.calculate_distance() assert hpc2 is hpc1 # ============================================================================== # ## Heliographic Tests # ============================================================================== @pytest.mark.parametrize('frame', [HeliographicStonyhurst, HeliographicCarrington]) @pytest.mark.parametrize("args, kwargs", two_D_parameters[:2] + two_D_parameters[4:] + [(None, {'lat': 0*u.deg, 'lon': 0*u.arcsec})]) def test_create_hgs_2d(frame, args, kwargs): hgs1 = init_frame(frame, args, kwargs) # Check we have the right class! assert isinstance(hgs1, frame) # Check Carrington first because it's a subclass of Stonyhurst if isinstance(hgs1, HeliographicCarrington): # Check that we have a 2D wrap180 representation assert isinstance(hgs1._data, SphericalRepresentation) elif isinstance(hgs1, HeliographicStonyhurst): # Check that we have a 2D wrap180 representation assert isinstance(hgs1._data, SphericalWrap180Representation) # Check the attrs are correct assert hgs1.lon == 0 * u.deg assert hgs1.lat == 0 * u.deg # Check the attrs are in the correct default units assert hgs1.lon.unit is u.deg assert hgs1.lat.unit is u.deg assert hgs1.radius.unit is u.km @pytest.mark.parametrize('frame', [HeliographicStonyhurst, HeliographicCarrington]) @pytest.mark.parametrize("args, kwargs", two_D_parameters[2:4]) def test_create_hgs_force_2d(frame, args, kwargs): hgs1 = init_frame(frame, args, kwargs) # Check we have the right class! assert isinstance(hgs1, frame) rep_kwarg = kwargs.get('representation', None) if kwargs else None if rep_kwarg == 'unitsphericalwrap180': assert isinstance(hgs1._data, UnitSphericalWrap180Representation) elif rep_kwarg == 'unitspherical': assert isinstance(hgs1._data, UnitSphericalRepresentation) # Check the attrs are correct assert hgs1.lon == 0 * u.deg assert hgs1.lat == 0 * u.deg # Check the attrs are in the correct default units assert hgs1.lon.unit is u.deg assert hgs1.lat.unit is u.deg @pytest.mark.parametrize('frame', [HeliographicStonyhurst, HeliographicCarrington]) @pytest.mark.parametrize( "args, kwargs", three_D_parameters + [(None, {'lat': 0 * u.deg, 'lon': 0 * u.arcsec, 'radius': 1 * u.Mm}), ([0 * u.deg, 0 * u.arcsec], {'radius': 1 * u.Mm})]) def test_create_hgs_3d(frame, args, kwargs): hgs1 = init_frame(frame, args, kwargs) # Check we have the right class! assert isinstance(hgs1, frame) rep_kwarg = kwargs.get('representation', None) if kwargs else None if rep_kwarg == 'spherical': assert isinstance(hgs1._data, SphericalRepresentation) else: # Check Carrington first because it's a subclass of Stonyhurst if isinstance(hgs1, HeliographicCarrington): # Check that we have a 2D wrap180 representation assert isinstance(hgs1._data, SphericalRepresentation) elif isinstance(hgs1, HeliographicStonyhurst): # Check that we have a 2D wrap180 representation assert isinstance(hgs1._data, SphericalWrap180Representation) # Check the attrs are correct assert hgs1.lon == 0 * u.deg assert hgs1.lat == 0 * u.deg assert hgs1.radius == 1 * u.Mm # Check the attrs are in the correct default units assert hgs1.lon.unit is u.deg assert hgs1.lat.unit is u.deg assert hgs1.radius.unit is u.Mm def test_hgs_cart_init(): hpc1 = HeliographicStonyhurst(CartesianRepresentation(0 * u.km, 0 * u.km, 1 * u.Mm)) assert isinstance(hpc1, HeliographicStonyhurst) assert isinstance(hpc1._data, CartesianRepresentation) # ============================================================================== # ## Heliocentric Tests # ============================================================================== @pytest.mark.parametrize( 'args, kwargs', [((10 * u.km, 10 * u.km, 10 * u.km), None), (None, {'x': 10 * u.km, 'y': 10 * u.km, 'z': 10 * u.km}), ([CartesianRepresentation(10 * u.km, 10 * u.km, 10 * u.km)], None), ([CartesianRepresentation(10 * u.km, 10 * u.km, 10 * u.km)], {'obstime': '2011/01/01T00:00:00'})]) def test_create_hcc_3d(args, kwargs): hcc = init_frame(Heliocentric, args, kwargs) assert isinstance(hcc, Heliocentric) assert isinstance(hcc._data, CartesianRepresentation) assert hcc.x == 10 * u.km assert hcc.y == 10 * u.km assert hcc.z == 10 * u.km # Check the attrs are in the correct default units assert hcc.x.unit is u.km assert hcc.y.unit is u.km assert hcc.z.unit is u.km sunpy-0.8.3/sunpy/coordinates/tests/test_offset_frame.py0000644000175000017500000000352513231613137024004 0ustar nabilnabil00000000000000import pytest import numpy as np import hypothesis.strategies as st from hypothesis import given import astropy.units as u from astropy.tests.helper import assert_quantity_allclose from astropy.coordinates import SkyCoord, SkyOffsetFrame from sunpy.coordinates import NorthOffsetFrame @st.composite def latitude(draw, lat=st.floats(min_value=-90, max_value=90, allow_nan=False, allow_infinity=False)): return draw(lat) * u.deg @st.composite def lonitude(draw, lon=st.floats(min_value=-180, max_value=180, allow_nan=False, allow_infinity=False)): return draw(lon) * u.deg def test_null(): """ test init of a frame where the origins are the same. """ off = NorthOffsetFrame(north=SkyCoord(0*u.deg, 90*u.deg, frame='heliographic_stonyhurst')) assert isinstance(off, SkyOffsetFrame) assert off.origin.lat == 0*u.deg assert off.origin.lon == 0*u.deg @given(lon=lonitude(), lat=latitude()) def test_transform(lon, lat): """ Test that the north pole in the new frame transforms back to the given north argument. """ north = SkyCoord(lon=lon, lat=lat, frame='heliographic_stonyhurst') off = NorthOffsetFrame(north=north) t_north = SkyCoord(lon=0*u.deg, lat=90*u.deg, frame=off) t_north = t_north.transform_to('heliographic_stonyhurst') assert_quantity_allclose(north.lon, t_north.lon, atol=1e6*u.deg) assert_quantity_allclose(north.lat, t_north.lat, atol=1e6*u.deg) def test_south_pole(): s = SkyCoord(-10*u.deg, 0*u.deg, frame='heliographic_stonyhurst') off = NorthOffsetFrame(north=s) assert_quantity_allclose(off.origin.lon, 170*u.deg) assert_quantity_allclose(off.origin.lat, -90*u.deg) def test_error(): with pytest.raises(TypeError): NorthOffsetFrame() sunpy-0.8.3/sunpy/coordinates/tests/test_transformations.py0000644000175000017500000001055313231613137024574 0ustar nabilnabil00000000000000import numpy as np import astropy.units as u from astropy.tests.helper import quantity_allclose, assert_quantity_allclose from astropy.coordinates import SkyCoord, get_body_barycentric from astropy.time import Time from sunpy.coordinates import Helioprojective, HeliographicStonyhurst, HeliographicCarrington, get_sun_L0 from sunpy.time import parse_time def test_hpc_hpc(): # Use some unphysical values for solar parameters for testing, to make it # easier to calculate expected results. rsun = 1*u.m D0 = 1*u.km L0 = 1*u.deg observer_in = HeliographicStonyhurst(lat=0*u.deg, lon=0*u.deg, radius=D0) observer_out = HeliographicStonyhurst(lat=0*u.deg, lon=L0, radius=D0) hpc_in = Helioprojective(0*u.arcsec, 0*u.arcsec, rsun=rsun, observer=observer_in) hpc_out = Helioprojective(observer=observer_out, rsun=rsun) hpc_new = hpc_in.transform_to(hpc_out) assert hpc_new.observer == hpc_out.observer # Calculate the distance subtended by an angle of L0 from the centre of the # Sun. dd = -1 * rsun * np.tan(L0) # Calculate the angle corresponding to that distance as seen by the new # observer. theta = np.arctan2(dd, (D0 - rsun)) assert quantity_allclose(theta, hpc_new.Tx, rtol=1e-3) def test_hpc_hpc_sc(): # Use some unphysical values for solar parameters for testing, to make it # easier to calculate expected results. rsun = 1*u.m D0 = 1*u.km L0 = 1*u.deg observer_in = HeliographicStonyhurst(lat=0*u.deg, lon=0*u.deg, radius=D0) observer_out = HeliographicStonyhurst(lat=0*u.deg, lon=L0, radius=D0) sc_in = SkyCoord(0*u.arcsec, 0*u.arcsec, rsun=rsun, observer=observer_in, frame='helioprojective') hpc_out = Helioprojective(observer=observer_out, rsun=rsun) hpc_new = sc_in.transform_to(hpc_out) assert hpc_new.observer == hpc_out.observer def test_hpc_hpc_null(): hpc_in = Helioprojective(0*u.arcsec, 0*u.arcsec) hpc_out = Helioprojective() hpc_new = hpc_in.transform_to(hpc_out) assert hpc_new is not hpc_in assert quantity_allclose(hpc_new.Tx, hpc_in.Tx) assert quantity_allclose(hpc_new.Ty, hpc_in.Ty) assert hpc_out.observer == hpc_new.observer def test_hcrs_hgs(): # Get the current Earth location in HCRS now = Time(parse_time('now')) earth_hcrs = SkyCoord(get_body_barycentric('earth', now), frame='icrs', obstime=now).hcrs # Convert from HCRS to HGS earth_hgs = earth_hcrs.transform_to(HeliographicStonyhurst) # The HGS longitude of the Earth should be zero within numerical error assert quantity_allclose(earth_hgs.lon, 0*u.deg, atol=1e-12*u.deg) # The HGS latitude and radius should be within valid ranges assert quantity_allclose(earth_hgs.lat, 0*u.deg, atol=7.3*u.deg) assert quantity_allclose(earth_hgs.radius, 1*u.AU, atol=0.017*u.AU) def test_hcrs_hgs_array_obstime(): # Get the Earth location in HCRS at two times times = Time(['2017-01-01', '2017-06-01']) earth_hcrs = SkyCoord(get_body_barycentric('earth', times), frame='icrs', obstime=times).hcrs # Transform each time in separate calls (uses scalar obstime) earth_hgs_0 = earth_hcrs[0].transform_to(HeliographicStonyhurst) earth_hgs_1 = earth_hcrs[1].transform_to(HeliographicStonyhurst) # Transform both times in one call (uses array obstime) earth_hgs = earth_hcrs.transform_to(HeliographicStonyhurst) # Confirm that the two approaches produce the same results assert quantity_allclose(earth_hgs_0.lon, earth_hgs[0].lon, atol=1e-12*u.deg) assert quantity_allclose(earth_hgs_0.lat, earth_hgs[0].lat, rtol=1e-10) assert quantity_allclose(earth_hgs_0.radius, earth_hgs[0].radius, rtol=1e-10) assert quantity_allclose(earth_hgs_1.lon, earth_hgs[1].lon, atol=1e-12*u.deg) assert quantity_allclose(earth_hgs_1.lat, earth_hgs[1].lat, rtol=1e-10) assert quantity_allclose(earth_hgs_1.radius, earth_hgs[1].radius, rtol=1e-10) def test_hgs_hgc_roundtrip(): obstime = "2011-01-01" hgsin = HeliographicStonyhurst(lat=0*u.deg, lon=0*u.deg, obstime=obstime) hgcout = hgsin.transform_to(HeliographicCarrington) assert_quantity_allclose(hgsin.lat, hgcout.lat) assert_quantity_allclose(hgcout.lon, get_sun_L0(obstime)) hgsout = hgcout.transform_to(HeliographicStonyhurst) assert_quantity_allclose(hgsout.lat, hgsin.lat) assert_quantity_allclose(hgsout.lon, hgsin.lon) sunpy-0.8.3/sunpy/coordinates/tests/test_transformations_comparision.py0000644000175000017500000000710213231613137027173 0ustar nabilnabil00000000000000""" This file is a stop-gap test file that compares this implementation to the old implementation in sunpy.wcs. The idea is that sunpy.wcs will be deprecated and removed, so this should not be relied on for actual testing of the transformation framework. """ from ..frames import Helioprojective, Heliocentric, HeliographicStonyhurst from sunpy import wcs import astropy.units as u from astropy.tests.helper import assert_quantity_allclose import pytest @pytest.mark.parametrize('Tx, Ty', [(0*u.arcsec, 0*u.arcsec), (10*u.arcsec, 0*u.arcsec), (-100*u.arcsec, -1000*u.arcsec), (40.0*u.arcsec, 32.0*u.arcsec), (1500*u.arcsec, 1500*u.arcsec)]) def test_hpc_hcc(Tx, Ty): hpc = Helioprojective(Tx, Ty, observer=HeliographicStonyhurst(0*u.deg, 0*u.deg, 1*u.AU)) hcc = hpc.transform_to(Heliocentric) d0 = hpc.observer.radius x, y, z = wcs.convert_hpc_hcc(Tx.value, Ty.value, angle_units='arcsec', dsun_meters=d0.to(u.m), z=True) assert_quantity_allclose(x*u.m, hcc.x) assert_quantity_allclose(y*u.m, hcc.y) assert_quantity_allclose(z*u.m, hcc.z) @pytest.mark.parametrize('Tx, Ty', [(0*u.arcsec, 0*u.arcsec), (10*u.arcsec, 0*u.arcsec), (-100*u.arcsec, -1000*u.arcsec), (40.0*u.arcsec, 32.0*u.arcsec), (1500*u.arcsec, 1500*u.arcsec)]) def test_hpc_hgs(Tx, Ty): hpc = Helioprojective(Tx, Ty, observer=HeliographicStonyhurst(0*u.deg, 0*u.deg, 1*u.AU)) hgs = hpc.transform_to(HeliographicStonyhurst) l0_deg = hpc.observer.lon b0_deg = hpc.observer.lat d0 = hpc.observer.radius lon, lat = wcs.convert_hpc_hg(Tx.value, Ty.value, angle_units='arcsec', b0_deg=b0_deg.to(u.deg).value, l0_deg=l0_deg.to(u.deg).value, dsun_meters=d0.to(u.m)) assert_quantity_allclose(lon*u.deg, hgs.lon) assert_quantity_allclose(lat*u.deg, hgs.lat) @pytest.mark.parametrize('lon, lat', [(0*u.deg, 0*u.deg), (34.0*u.deg, 45.0*u.deg), (-80*u.deg, 70*u.deg)]) def test_hgs_hpc(lon, lat): hgs = HeliographicStonyhurst(lon, lat) hpc = hgs.transform_to(Helioprojective(observer=HeliographicStonyhurst(0*u.deg, 0*u.deg, 1*u.AU))) l0_deg = hpc.observer.lon b0_deg = hpc.observer.lat d0 = hpc.observer.radius Tx, Ty = wcs.convert_hg_hpc(lon.value, lat.value, angle_units='arcsec', b0_deg=b0_deg.to(u.deg).value, l0_deg=l0_deg.to(u.deg).value, dsun_meters=d0.to(u.m)) assert_quantity_allclose(Tx*u.arcsec, hpc.Tx) assert_quantity_allclose(Ty*u.arcsec, hpc.Ty) @pytest.mark.parametrize('lon, lat', [(0*u.deg, 0*u.deg), (34.0*u.deg, 45.0*u.deg), (-80*u.deg, 70*u.deg)]) def test_hgs_hcc(lon, lat): hgs = HeliographicStonyhurst(lon, lat) hcc = hgs.transform_to(Heliocentric(observer=HeliographicStonyhurst(0*u.deg, 0*u.deg, 1*u.AU))) x, y, z = wcs.convert_hg_hcc(lon.value, lat.value, r=hgs.radius.to(u.m).value, z=True) assert_quantity_allclose(x*u.m, hcc.x) assert_quantity_allclose(y*u.m, hcc.y) assert_quantity_allclose(z*u.m, hcc.z) sunpy-0.8.3/sunpy/coordinates/tests/test_utils.py0000644000175000017500000001766313231613137022514 0ustar nabilnabil00000000000000from __future__ import absolute_import, division, print_function import pytest import numpy as np from astropy.coordinates import SkyCoord import astropy.units as u from sunpy.sun import sun import sunpy.map import sunpy.data.test from sunpy.coordinates import frames from sunpy.coordinates.utils import GreatArc # Test the great arc code against calculable quantities # The inner angle is the same between each pair of co-ordinates. You can # calculate these co-ordinates using the inner angle formulae as listed here: # https://en.wikipedia.org/wiki/Great-circle_distance # @pytest.mark.parametrize("start, end", [((0, 0), (0, 45)), ((0, 0), (45, 0)), ((0, 45), (0, 0)), ((45, 0), (0, 0)), ((12, 13), (12, 58)), ((-10, 6), (-10, 51)), ((-20, -50), (-20, -5)), ((10, -50), (87.53163324626676, -55))]) def test_great_arc_calculable(start, end): c = SkyCoord(start[0]*u.degree, start[1]*u.degree, frame=frames.HeliographicStonyhurst, observer=frames.HeliographicStonyhurst(0*u.deg, 0*u.deg, 1*u.AU)) d = SkyCoord(end[0]*u.degree, end[1]*u.degree, frame=frames.HeliographicStonyhurst, observer=frames.HeliographicStonyhurst(0*u.deg, 0*u.deg, 1*u.AU)) gc = GreatArc(c, d) assert gc.start == c assert gc.end == d np.testing.assert_almost_equal(gc.inner_angle.to('deg').value, 45.0) np.testing.assert_almost_equal(gc.radius.to('km').value, sun.constants.radius.to('km').value) np.testing.assert_almost_equal(gc.distance.to('km').value, sun.constants.radius.to('km').value * 2 * np.pi/8, decimal=1) # Test the calculation of coordinates using varying numbers of points on # initialization of the GreatArc object. @pytest.mark.parametrize("points_requested, points_expected, first_point, last_point, last_inner_angle, last_distance", # Test default [(None, 100, (600, -600), (-100, 800), 1.8683580432741789, 1300377.1981272686), # Test int as an option (3, 3, (600, -600), (-100, 800), 1.8683580432741789, 1300377.1981272686), # Test equally spaced monotonically increasing numpy # array (np.linspace(0, 1, 43), 43, (600, -600), (-100, 800), 1.8683580432741789, 1300377.1981272686), # Test unequally spaced monotonically increasing numpy # array (np.asarray([0.1, 0.2, 0.6, 0.67, 0.99]), 5, (604.68091703, -468.64217597), (-88.83212616, 792.76284375), 1.84967446, 1287373.426146), # Test unequally spaced monotonically decreasing numpy # array (np.asarray([0.93, 0.78, 0.3, 0.001]), 4, (-21.28208654, 743.58866798), (600.1512768 , -598.78376614), 0.00186836, 1300.37719813), # Test numpy array that increases and decreases (np.asarray([0.94, 0.73, 0.8, 0.21]), 4, (-32.5852606 , 752.45507707), (585.45829119, -305.26965043), 0.39235519, 273079.21160673)]) def test_great_arc_coordinates(points_requested, points_expected, first_point, last_point, last_inner_angle, last_distance): m = sunpy.map.Map(sunpy.map.Map(sunpy.data.test.get_test_filepath('aia_171_level1.fits'))) coordinate_frame = m.coordinate_frame a = SkyCoord(600*u.arcsec, -600*u.arcsec, frame=coordinate_frame) b = SkyCoord(-100*u.arcsec, 800*u.arcsec, frame=coordinate_frame) gc = GreatArc(a, b, points=points_requested) coordinates = gc.coordinates() inner_angles = gc.inner_angles() distances = gc.distances() # Ensure a GreatArc object is returned assert isinstance(gc, GreatArc) # Test the properties of the GreatArc object assert gc.start == a assert gc.end == b assert gc.distance_unit == u.km assert gc.observer == a.observer assert gc.center.x == 0 * u.km assert gc.center.y == 0 * u.km assert gc.center.z == 0 * u.km np.testing.assert_almost_equal(gc.start_cartesian, np.asarray([428721.09135385, -428722.90519236, 341776.09102756])) np.testing.assert_almost_equal(gc.end_cartesian, np.asarray([-71429.52293813, 571439.07124801, 390859.57978693])) np.testing.assert_almost_equal(gc.center_cartesian, np.asarray([0, 0, 0])) np.testing.assert_almost_equal(gc.v1, np.asarray([428721.09135385, -428722.90519236, 341776.09102756])) np.testing.assert_almost_equal(gc._r, 696000.00000451738) np.testing.assert_almost_equal(gc.v2, np.asarray([-71429.52293813, 571439.07124801, 390859.57978693])) np.testing.assert_almost_equal(gc.v3, np.asarray([56761.62657985, 466230.70058902, 513637.08158833])) # Inner angle assert gc.inner_angle.unit == u.rad np.testing.assert_almost_equal(gc.inner_angle.value, 1.8683580432741789) # Distance assert gc.distance.unit == u.km np.testing.assert_almost_equal(gc.distance.value, 1300377.1981272686) # Radius of the sphere assert gc.radius.unit == u.km np.testing.assert_almost_equal(gc.radius.value, 696000.0000045174) # Test the calculation of the SkyCoords # Coordinates method # Number of points assert len(coordinates) == points_expected # Start and end coordinates np.testing.assert_almost_equal(coordinates[0].Tx.value, first_point[0]) np.testing.assert_almost_equal(coordinates[0].Ty.value, first_point[1]) np.testing.assert_almost_equal(coordinates[-1].Tx.value, last_point[0]) np.testing.assert_almost_equal(coordinates[-1].Ty.value, last_point[1]) # Inner angles method # Inner angles assert len(inner_angles) == points_expected np.testing.assert_almost_equal(inner_angles[-1].value, last_inner_angle) # Distances method assert len(distances) == points_expected np.testing.assert_almost_equal(distances[-1].value, last_distance) # Test that the great arc code rejects wrongly formatted points @pytest.mark.parametrize("points", [np.asarray([[0, 0.1], [0.2, 0.3]]), np.asarray([0.1, 0.2, -0.1, 0.4]), np.asarray([0.3, 1.1, 0.6, 0.7]), 'strings_not_permitted']) def test_great_arc_wrongly_formatted_points(points): m = sunpy.map.Map(sunpy.map.Map(sunpy.data.test.get_test_filepath('aia_171_level1.fits'))) coordinate_frame = m.coordinate_frame a = SkyCoord(600*u.arcsec, -600*u.arcsec, frame=coordinate_frame) b = SkyCoord(-100*u.arcsec, 800*u.arcsec, frame=coordinate_frame) with pytest.raises(ValueError): dummy = GreatArc(a, b, points=points) with pytest.raises(ValueError): dummy = GreatArc(a, b).coordinates(points=points) with pytest.raises(ValueError): dummy = GreatArc(a, b).inner_angles(points=points) with pytest.raises(ValueError): dummy = GreatArc(a, b).distances(points=points) with pytest.raises(ValueError): dummy = GreatArc(a, b).distances(points=points) # Test that the great arc code properly differentiates between the default # points and the requested points def test_great_arc_points_differentiates(): m = sunpy.map.Map(sunpy.map.Map(sunpy.data.test.get_test_filepath('aia_171_level1.fits'))) coordinate_frame = m.coordinate_frame a = SkyCoord(600*u.arcsec, -600*u.arcsec, frame=coordinate_frame) b = SkyCoord(-100*u.arcsec, 800*u.arcsec, frame=coordinate_frame) gc = GreatArc(a, b) coordinates = gc.coordinates(10) inner_angles = gc.inner_angles(11) distances = gc.distances(12) assert len(coordinates) == 10 and len(gc.coordinates()) == 100 assert len(inner_angles) == 11 and len(gc.inner_angles()) == 100 assert len(distances) == 12 and len(gc.distances()) == 100 sunpy-0.8.3/sunpy/coordinates/tests/test_wcs_utils.py0000644000175000017500000000516613231613137023363 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- import numpy as np import sunpy.map from astropy.wcs import WCS from sunpy.coordinates.frames import Helioprojective, Heliocentric, HeliographicStonyhurst, HeliographicCarrington from ..wcs_utils import solar_wcs_frame_mapping def test_hpc(): wcs = WCS(naxis=2) wcs.wcs.ctype = ['HPLN', 'HPLT'] result = solar_wcs_frame_mapping(wcs) assert isinstance(result, Helioprojective) def test_hgs(): wcs = WCS(naxis=2) wcs.wcs.ctype = ['HGLN', 'HGLT'] result = solar_wcs_frame_mapping(wcs) assert isinstance(result, HeliographicStonyhurst) def test_hgc(): wcs = WCS(naxis=2) wcs.wcs.ctype = ['CRLN', 'CRLT'] result = solar_wcs_frame_mapping(wcs) assert isinstance(result, HeliographicCarrington) def test_hcc(): wcs = WCS(naxis=2) wcs.wcs.ctype = ['SOLX', 'SOLY'] result = solar_wcs_frame_mapping(wcs) assert isinstance(result, Heliocentric) def test_none(): wcs = WCS(naxis=2) wcs.wcs.ctype = ['spam', 'eggs'] result = solar_wcs_frame_mapping(wcs) assert result is None def test_wcs_extras(): """ To enable proper creation of the coordinate systems, Map sticks three extra attributes on the WCS object: * heliographic_longitude * heliographic_latitude * dsun """ data = np.ones([6, 6], dtype=np.float64) header = {'CRVAL1': 0, 'CRVAL2': 0, 'CRPIX1': 5, 'CRPIX2': 5, 'CDELT1': 10, 'CDELT2': 10, 'CUNIT1': 'arcsec', 'CUNIT2': 'arcsec', 'PC1_1': 0, 'PC1_2': -1, 'PC2_1': 1, 'PC2_2': 0, 'NAXIS1': 6, 'NAXIS2': 6, 'CTYPE1': 'HPLN-TAN', 'CTYPE2': 'HPLT-TAN', 'date-obs': '1970/01/01T00:00:00', 'obsrvtry': 'Foo', 'detector': 'bar', 'wavelnth': 10, 'waveunit': 'm', 'hglt_obs': 0, 'hgln_obs': 0, 'dsun_obs': 10, 'rsun_ref': 690000000} generic_map = sunpy.map.Map((data, header)) wcs = generic_map.wcs assert wcs.heliographic_observer.lat.value == 0 assert wcs.heliographic_observer.lon.value == 0 assert wcs.heliographic_observer.radius.value == 10 assert wcs.rsun.value == header['rsun_ref'] result = solar_wcs_frame_mapping(wcs) assert isinstance(result, Helioprojective) assert result.observer.lat.value == 0 assert result.observer.lon.value == 0 assert result.observer.radius.value == 10 assert result.rsun.value == header['rsun_ref'] sunpy-0.8.3/sunpy/coordinates/__init__.py0000644000175000017500000000026513231613137020700 0ustar nabilnabil00000000000000from __future__ import absolute_import, division from .frames import * from .offset_frame import * from . import transformations from .ephemeris import * from .wcs_utils import * sunpy-0.8.3/sunpy/coordinates/ephemeris.py0000644000175000017500000002133513231613137021123 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- """ Ephemeris calculations using SunPy coordinate frames """ from __future__ import absolute_import, division import datetime import warnings import numpy as np import astropy.units as u from astropy.time import Time from astropy.coordinates import (SkyCoord, Angle, Longitude, ICRS, PrecessedGeocentric, AltAz, get_body_barycentric) from astropy.coordinates.representation import CartesianRepresentation, SphericalRepresentation from astropy._erfa.core import ErfaWarning from sunpy.time import parse_time from sunpy.time.time import _astropy_time from .frames import HeliographicStonyhurst as HGS from .transformations import _SUN_DETILT_MATRIX __all__ = ['get_body_heliographic_stonyhurst', 'get_earth', 'get_sun_B0', 'get_sun_L0', 'get_sun_P', 'get_sunearth_distance', 'get_sun_orientation'] def get_body_heliographic_stonyhurst(body, time='now'): """ Return a `~sunpy.coordinates.frames.HeliographicStonyhurst` frame for the location of a solar-system body at a specified time. Parameters ---------- body : `str` The solar-system body for which to calculate positions time : various Time to use as `~astropy.time.Time` or in a parse_time-compatible format Returns ------- out : `~sunpy.coordinates.frames.HeliographicStonyhurst` Location of the solar-system body in the `~sunpy.coordinates.HeliographicStonyhurst` frame """ obstime = _astropy_time(time) body_icrs = ICRS(get_body_barycentric(body, obstime)) body_hgs = body_icrs.transform_to(HGS(obstime=obstime)) return body_hgs def get_earth(time='now'): """ Return a `~astropy.coordinates.SkyCoord` for the location of the Earth at a specified time in the `~sunpy.coordinates.frames.HeliographicStonyhurst` frame. The longitude will be 0 by definition. Parameters ---------- time : various Time to use as `~astropy.time.Time` or in a parse_time-compatible format Returns ------- out : `~astropy.coordinates.SkyCoord` Location of the Earth in the `~sunpy.coordinates.frames.HeliographicStonyhurst` frame """ earth = get_body_heliographic_stonyhurst('earth', time=time) # Explicitly set the longitude to 0 earth = SkyCoord(0*u.deg, earth.lat, earth.radius, frame=earth) return earth def get_sun_B0(time='now'): """ Return the B0 angle for the Sun at a specified time, which is the heliographic latitude of the Sun-disk center as seen from Earth. The range of B0 is +/-7.23 degrees. Parameters ---------- time : various Time to use as `~astropy.time.Time` or in a parse_time-compatible format Returns ------- out : `~astropy.coordinates.Angle` The position angle """ return Angle(get_earth(time).lat) # Ignore warnings that result from going back in time to the first Carrington rotation with warnings.catch_warnings(): warnings.simplefilter("ignore", ErfaWarning) # Carrington rotation 1 starts late in the day on 1853 Nov 9 # according to Astronomical Algorithms (Meeus 1998, p.191) _time_first_rotation = Time('1853-11-09 21:36') # Longitude of Earth at Carrington rotation 1 in de-tilted HCRS (so that solar north pole is Z) _lon_first_rotation = \ get_earth(_time_first_rotation).hcrs.cartesian.transform(_SUN_DETILT_MATRIX) \ .represent_as(SphericalRepresentation).lon.to('deg') def get_sun_L0(time='now'): """ Return the L0 angle for the Sun at a specified time, which is the Carrington longitude of the Sun-disk center as seen from Earth. .. warning:: Due to apparent disagreement between published references, the returned L0 may be inaccurate by up to ~2 arcmin, which translates in the worst case to a shift of ~0.5 arcsec in helioprojective coordinates for an observer at 1 AU. Until this is resolved, be cautious with analysis that depends critically on absolute (as opposed to relative) values of Carrington longitude. Parameters ---------- time : various Time to use as `~astropy.time.Time` or in a parse_time-compatible format Returns ------- out : `~astropy.coordinates.Longitude` The Carrington longitude """ obstime = _astropy_time(time) # Calculate the longitude due to the Sun's rotation relative to the stars # A sidereal rotation is defined to be exactly 25.38 days sidereal_lon = Longitude((obstime.jd - _time_first_rotation.jd) / 25.38 * 360*u.deg) # Calculate the longitude of the Earth in de-tilted HCRS lon_obstime = get_earth(obstime).hcrs.cartesian.transform(_SUN_DETILT_MATRIX) \ .represent_as(SphericalRepresentation).lon.to('deg') return Longitude(lon_obstime - _lon_first_rotation - sidereal_lon) def get_sun_P(time='now'): """ Return the position (P) angle for the Sun at a specified time, which is the angle between geocentric north and solar north as seen from Earth, measured eastward from geocentric north. The range of P is +/-26.3 degrees. Parameters ---------- time : various Time to use as `~astropy.time.Time` or in a parse_time-compatible format Returns ------- out : `~astropy.coordinates.Angle` The position angle """ obstime = _astropy_time(time) # Define the frame where its Z axis is aligned with geocentric north geocentric = PrecessedGeocentric(equinox=obstime, obstime=obstime) return _sun_north_angle_to_z(geocentric) def get_sunearth_distance(time='now'): """ Return the distance between the Sun and the Earth at a specified time. Parameters ---------- time : various Time to use as `~astropy.time.Time` or in a parse_time-compatible format Returns ------- out : `~astropy.coordinates.Distance` The Sun-Earth distance """ return get_earth(time).radius def get_sun_orientation(location, time='now'): """ Return the orientation angle for the Sun from a specified Earth location and time. The orientation angle is the angle between local zenith and solar north, measured eastward from local zenith. Parameters ---------- location : `~astropy.coordinates.EarthLocation` Observer location on Earth time : various Time to use as `~astropy.time.Time` or in a parse_time-compatible format Returns ------- out : `~astropy.coordinates.Angle` The orientation of the Sun """ obstime = _astropy_time(time) # Define the frame where its Z axis is aligned with local zenith local_frame = AltAz(obstime=obstime, location=location) return _sun_north_angle_to_z(local_frame) def _sun_north_angle_to_z(frame): """ Return the angle between solar north and the Z axis of the provided frame's coordinate system and observation time. """ # Find the Sun center in HGS at the frame's observation time(s) sun_center_repr = SphericalRepresentation(0*u.deg, 0*u.deg, 0*u.km) # The representation is repeated for as many times as are in obstime prior to transformation sun_center = SkyCoord(sun_center_repr._apply('repeat', frame.obstime.size), frame=HGS, obstime=frame.obstime) # Find the Sun north in HGS at the frame's observation time(s) # Only a rough value of the solar radius is needed here because, after the cross product, # only the direction from the Sun center to the Sun north pole matters sun_north_repr = SphericalRepresentation(0*u.deg, 90*u.deg, 690000*u.km) # The representation is repeated for as many times as are in obstime prior to transformation sun_north = SkyCoord(sun_north_repr._apply('repeat', frame.obstime.size), frame=HGS, obstime=frame.obstime) # Find the Sun center and Sun north in the frame's coordinate system sky_normal = sun_center.transform_to(frame).data.to_cartesian() sun_north = sun_north.transform_to(frame).data.to_cartesian() # Use cross products to obtain the sky projections of the two vectors (rotated by 90 deg) sun_north_in_sky = sun_north.cross(sky_normal) z_in_sky = CartesianRepresentation(0, 0, 1).cross(sky_normal) # Normalize directional vectors sky_normal /= sky_normal.norm() sun_north_in_sky /= sun_north_in_sky.norm() z_in_sky /= z_in_sky.norm() # Calculate the signed angle between the two projected vectors cos_theta = sun_north_in_sky.dot(z_in_sky) sin_theta = sun_north_in_sky.cross(z_in_sky).dot(sky_normal) angle = np.arctan2(sin_theta, cos_theta).to('deg') # If there is only one time, this function's output should be scalar rather than array if angle.size == 1: angle = angle[0] return Angle(angle) sunpy-0.8.3/sunpy/coordinates/frameattributes.py0000644000175000017500000001220713231613137022341 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- from __future__ import absolute_import, division import datetime import warnings import astropy.units as u from astropy.time import Time from astropy.coordinates import TimeAttribute, CoordinateAttribute, get_body_barycentric, ICRS from sunpy.extern import six from sunpy.time import parse_time from sunpy.util.exceptions import SunpyUserWarning __all__ = ['TimeFrameAttributeSunPy', 'ObserverCoordinateAttribute'] class TimeFrameAttributeSunPy(TimeAttribute): """ Frame attribute descriptor for quantities that are Time objects. See the `~astropy.coordinates.Attribute` API doc for further information. Parameters ---------- default : object Default value for the attribute if not provided secondary_attribute : str Name of a secondary instance attribute which supplies the value if ``default`` is ``None`` and no value was supplied during initialization. Returns ------- frame_attr : descriptor A new data descriptor to hold a frame attribute """ def convert_input(self, value): """ Convert input value to a Time object and validate by running through the Time constructor. Also check that the input was a scalar. Parameters ---------- value : object Input value to be converted. Returns ------- out, converted : correctly-typed object, boolean Tuple consisting of the correctly-typed object and a boolean which indicates if conversion was actually performed. Raises ------ ValueError If the input is not valid for this attribute. """ if value is None: return None, False elif value == 'now': return Time(datetime.datetime.now()), True elif isinstance(value, Time): out = value converted = False elif isinstance(value, six.string_types): try: out = Time(parse_time(value)) except Exception as err: raise ValueError('Invalid time input {0}={1!r}\n{2}'.format(self.name, value, err)) converted = True else: try: out = Time(value) except Exception as err: raise ValueError('Invalid time input {0}={1!r}\n{2}'.format(self.name, value, err)) converted = True return out, converted class ObserverCoordinateAttribute(CoordinateAttribute): """ An Attribute to describe the location of the observer in the solar system. The observer location can be given as a string of a known observer, which will be converted to a coordinate as long as the ``obstime`` attribute is valid on the instance of the frame. Alternatively a low-level frame class *or* a `~astropy.coordinates.SkyCoord` can be provided to specify the location of the observer. If a `~astropy.coordinates.SkyCoord` is passed it will always be converted to the low-level frame class when accessed. Parameters ---------- frame : a coordinate frame class The type of frame this attribute can be default : object Default value for the attribute if not provided secondary_attribute : str Name of a secondary instance attribute which supplies the value if ``default is None`` and no value was supplied during initialization. """ def convert_input(self, value): # Keep string here. if isinstance(value, six.string_types): return value, False else: return super(ObserverCoordinateAttribute, self).convert_input(value) def _convert_string_to_coord(self, out, obstime): """ Given a value and and frame instance calculate the position of the object given as a string. """ # Import here to prevent circular import from .frames import HeliographicStonyhurst from .ephemeris import get_body_heliographic_stonyhurst obscoord = get_body_heliographic_stonyhurst(out, obstime) if out == "earth": rep = obscoord.spherical rep.lon[()] = 0*u.deg obscoord = obscoord.realize_frame(rep) return obscoord def __get__(self, instance, frame_cls=None): # If instance is None then we can't get obstime so it doesn't matter. if instance is not None: # Get observer if the instance has one, or the default. observer = getattr(instance, '_' + self.name, self.default) # We have an instance of a frame, so get obstime obstime = getattr(instance, 'obstime', None) # If the observer is a string and we have obstime then calculate # the position of the observer. if isinstance(observer, six.string_types): if obstime is not None: observer = self._convert_string_to_coord(observer.lower(), obstime) setattr(instance, '_' + self.name, observer) else: return observer return super(ObserverCoordinateAttribute, self).__get__(instance, frame_cls=frame_cls) sunpy-0.8.3/sunpy/coordinates/frames.py0000644000175000017500000003643613231613137020427 0ustar nabilnabil00000000000000""" Common solar physics coordinate systems. This submodule implements various solar physics coordinate frames for use with the `astropy.coordinates` module. """ from __future__ import absolute_import, division import warnings import numpy as np from astropy import units as u from astropy.coordinates.representation import (CartesianRepresentation, UnitSphericalRepresentation, SphericalRepresentation) from astropy.coordinates.baseframe import (BaseCoordinateFrame, RepresentationMapping) from astropy.coordinates import Attribute, CoordinateAttribute, ConvertError from sunpy import sun from .representation import (SphericalWrap180Representation, UnitSphericalWrap180Representation) from .frameattributes import TimeFrameAttributeSunPy, ObserverCoordinateAttribute RSUN_METERS = sun.constants.get('radius').si.to(u.m) DSUN_METERS = sun.constants.get('mean distance').si.to(u.m) __all__ = ['HeliographicStonyhurst', 'HeliographicCarrington', 'Heliocentric', 'Helioprojective'] class HeliographicStonyhurst(BaseCoordinateFrame): """ A coordinate or frame in the Stonyhurst Heliographic system. This frame has its origin at the solar centre and the north pole above the solar north pole, and the zero line on longitude pointing towards the Earth. Parameters ---------- representation: `~astropy.coordinates.BaseRepresentation` or `None` A representation object or None to have no data. lon: `Angle` object. The longitude for this object (``lat`` must also be given and ``representation`` must be None). lat: `Angle` object. The latitude for this object (``lon`` must also be given and ``representation`` must be None). radius: `astropy.units.Quantity` object. This quantity holds the radial distance. If not specified, it is, by default, the radius of the photosphere. Optional. obstime: SunPy Time The date and time of the observation, used to convert to heliographic carrington coordinates. Examples -------- >>> from astropy.coordinates import SkyCoord >>> import sunpy.coordinates >>> import astropy.units as u >>> sc = SkyCoord(1*u.deg, 1*u.deg, 2*u.km, ... frame="heliographic_stonyhurst", ... obstime="2010/01/01T00:00:45") >>> sc # doctest: +FLOAT_CMP >>> sc.frame # doctest: +FLOAT_CMP >>> sc = SkyCoord(HeliographicStonyhurst(-10*u.deg, 2*u.deg)) >>> sc # doctest: +FLOAT_CMP Notes ----- This frame will always be converted a 3D frame where the radius defaults to rsun. """ name = "heliographic_stonyhurst" default_representation = SphericalWrap180Representation _frame_specific_representation_info = { 'spherical': [ RepresentationMapping('lon', 'lon', 'recommended'), RepresentationMapping('lat', 'lat', 'recommended'), RepresentationMapping('distance', 'radius', 'recommended') ], 'sphericalwrap180': [ RepresentationMapping('lon', 'lon', 'recommended'), RepresentationMapping('lat', 'lat', 'recommended'), RepresentationMapping('distance', 'radius', 'recommended') ] } obstime = TimeFrameAttributeSunPy() def __init__(self, *args, **kwargs): _rep_kwarg = kwargs.get('representation', None) super(HeliographicStonyhurst, self).__init__(*args, **kwargs) # Make 3D if specified as 2D # If representation was explicitly passed, do not change the rep. if not _rep_kwarg: # If we were passed a 3D rep extract the distance, otherwise # calculate it from RSUN. distance = None if isinstance(self._data, SphericalRepresentation): distance = self._data.distance elif isinstance(self._data, UnitSphericalRepresentation): distance = RSUN_METERS.to(u.km) if distance is not None: self._data = self.default_representation(lat=self._data.lat, lon=self._data.lon, distance=distance) class HeliographicCarrington(HeliographicStonyhurst): """ A coordinate or frame in the Carrington Heliographic system. This frame differs from the Stonyhurst version in the definition of the longitude, which is defined using an offset which is a time-dependent scalar value. Parameters ---------- representation: `~astropy.coordinates.BaseRepresentation` or None. A representation object. If specified, other parameters must be in keyword form. lon: `Angle` object. The longitude for this object (``lat`` must also be given and ``representation`` must be None). lat: `Angle` object. The latitude for this object (``lon`` must also be given and ``representation`` must be None). radius: `astropy.units.Quantity` object, optional, must be keyword. This quantity holds the radial distance. If not specified, it is, by default, the solar radius. Optional, must be keyword. obstime: SunPy Time The date and time of the observation, used to convert to heliographic carrington coordinates. Examples -------- >>> from astropy.coordinates import SkyCoord >>> import sunpy.coordinates >>> import astropy.units as u >>> sc = SkyCoord(1*u.deg, 2*u.deg, 3*u.km, ... frame="heliographic_carrington", ... obstime="2010/01/01T00:00:30") >>> sc # doctest: +FLOAT_CMP >>> sc = SkyCoord([1,2,3]*u.deg, [4,5,6]*u.deg, [5,6,7]*u.km, ... obstime="2010/01/01T00:00:45", frame="heliographic_carrington") >>> sc # doctest: +FLOAT_CMP """ name = "heliographic_carrington" default_representation = SphericalRepresentation _frame_specific_representation_info = { 'spherical': [ RepresentationMapping('lon', 'lon', 'recommended'), RepresentationMapping('lat', 'lat', 'recommended'), RepresentationMapping('distance', 'radius', 'recommended') ], 'sphericalwrap180': [ RepresentationMapping('lon', 'lon', 'recommended'), RepresentationMapping('lat', 'lat', 'recommended'), RepresentationMapping('distance', 'radius', 'recommended') ] } obstime = TimeFrameAttributeSunPy() class Heliocentric(BaseCoordinateFrame): """ A coordinate or frame in the Heliocentric system. This frame may either be specified in Cartesian or cylindrical representation. Cylindrical representation replaces (x, y) with (rho, psi) where rho is the impact parameter and psi is the position angle in degrees. Parameters ---------- representation: `~astropy.coordinates.BaseRepresentation` or None. A representation object. If specified, other parameters must be in keyword form and if x, y and z are specified, it must be None. x: `Quantity` object. X-axis coordinate, optional, must be keyword. y: `Quantity` object. Y-axis coordinate, optional, must be keyword. z: `Quantity` object. Shared by both representations. Z-axis coordinate, optional, must be keyword. observer: `~sunpy.coordinates.frames.HeliographicStonyhurst` The coordinate of the observer in the solar system. obstime: SunPy Time The date and time of the observation, used to convert to heliographic carrington coordinates. Examples -------- >>> from astropy.coordinates import SkyCoord, CartesianRepresentation >>> import sunpy.coordinates >>> import astropy.units as u >>> sc = SkyCoord(CartesianRepresentation(10*u.km, 1*u.km, 2*u.km), ... obstime="2011/01/05T00:00:50", frame="heliocentric") >>> sc # doctest: +FLOAT_CMP ): (x, y, z) in km ( 10., 1., 2.)> >>> sc = SkyCoord([1,2]*u.km, [3,4]*u.m, [5,6]*u.cm, frame="heliocentric", obstime="2011/01/01T00:00:54") >>> sc # doctest: +FLOAT_CMP ): (x, y, z) in (km, m, cm) [( 1., 3., 5.), ( 2., 4., 6.)]> """ default_representation = CartesianRepresentation _frame_specific_representation_info = { 'cylindrical': [RepresentationMapping('phi', 'psi', u.deg)] } obstime = TimeFrameAttributeSunPy() observer = ObserverCoordinateAttribute(HeliographicStonyhurst, default="earth") class Helioprojective(BaseCoordinateFrame): """ A coordinate or frame in the Helioprojective (Cartesian) system. This is a projective coordinate system centered around the observer. It is a full spherical coordinate system with position given as longitude theta_x and latitude theta_y. Parameters ---------- representation: `~astropy.coordinates.BaseRepresentation` or None. A representation object. If specified, other parameters must be in keyword form. Tx: `~astropy.coordinates.Angle` or `~astropy.units.Quantity` X-axis coordinate. Ty: `~astropy.coordinates.Angle` or `~astropy.units.Quantity` Y-axis coordinate. distance: `~astropy.units.Quantity` The radial distance from the observer to the coordinate point. obstime: SunPy Time The date and time of the observation, used to convert to heliographic carrington coordinates. observer: `~sunpy.coordinates.frames.HeliographicStonyhurst` The coordinate of the observer in the solar system. rsun: `~astropy.units.Quantity` The physical (length) radius of the Sun. Used to calculate the position of the limb for calculating distance from the observer to the coordinate. Examples -------- >>> from astropy.coordinates import SkyCoord >>> import sunpy.coordinates >>> import astropy.units as u >>> sc = SkyCoord(0*u.deg, 0*u.deg, 5*u.km, obstime="2010/01/01T00:00:00", ... frame="helioprojective") >>> sc # doctest: +FLOAT_CMP ): (Tx, Ty, distance) in (arcsec, arcsec, km) ( 0., 0., 5.)> >>> sc = SkyCoord(0*u.deg, 0*u.deg, obstime="2010/01/01T00:00:00", frame="helioprojective") >>> sc # doctest: +FLOAT_CMP ): (Tx, Ty) in arcsec ( 0., 0.)> """ default_representation = SphericalWrap180Representation _frame_specific_representation_info = { 'spherical': [ RepresentationMapping('lon', 'Tx', u.arcsec), RepresentationMapping('lat', 'Ty', u.arcsec), RepresentationMapping('distance', 'distance', u.km) ], 'sphericalwrap180': [ RepresentationMapping('lon', 'Tx', u.arcsec), RepresentationMapping('lat', 'Ty', u.arcsec), RepresentationMapping('distance', 'distance', u.km) ], 'unitspherical': [ RepresentationMapping('lon', 'Tx', u.arcsec), RepresentationMapping('lat', 'Ty', u.arcsec) ], 'unitsphericalwrap180': [ RepresentationMapping('lon', 'Tx', u.arcsec), RepresentationMapping('lat', 'Ty', u.arcsec) ] } obstime = TimeFrameAttributeSunPy() rsun = Attribute(default=RSUN_METERS.to(u.km)) observer = ObserverCoordinateAttribute(HeliographicStonyhurst, default="earth") def __init__(self, *args, **kwargs): _rep_kwarg = kwargs.get('representation', None) BaseCoordinateFrame.__init__(self, *args, **kwargs) # Convert from Spherical to SphericalWrap180 # If representation was explicitly passed, do not change the rep. if not _rep_kwarg: # The base __init__ will make this a UnitSphericalRepresentation # This makes it Wrap180 instead if isinstance(self._data, UnitSphericalRepresentation): self._data = UnitSphericalWrap180Representation( lat=self._data.lat, lon=self._data.lon) self.representation = UnitSphericalWrap180Representation # Make a Spherical Wrap180 instead elif isinstance(self._data, SphericalRepresentation): self._data = SphericalWrap180Representation( lat=self._data.lat, lon=self._data.lon, distance=self._data.distance) self.representation = SphericalWrap180Representation def calculate_distance(self): """ This method calculates the third coordinate of the Helioprojective frame. It assumes that the coordinate point is on the disk of the Sun at the rsun radius. If a point in the frame is off limb then NaN will be returned. Returns ------- new_frame : `~sunpy.coordinates.frames.HelioProjective` A new frame instance with all the attributes of the original but now with a third coordinate. """ # Skip if we already are 3D if isinstance(self._data, SphericalRepresentation): return self if not isinstance(self.observer, BaseCoordinateFrame): raise ConvertError("Cannot calculate distance to the solar disk " "for observer '{}' " "without `obstime` being specified.".format(self.observer)) rep = self.represent_as(UnitSphericalWrap180Representation) lat, lon = rep.lat, rep.lon alpha = np.arccos(np.cos(lat) * np.cos(lon)).to(lat.unit) c = self.observer.radius**2 - self.rsun**2 b = -2 * self.observer.radius * np.cos(alpha) d = ((-1*b) - np.sqrt(b**2 - 4*c)) / 2 return self.realize_frame(SphericalWrap180Representation(lon=lon, lat=lat, distance=d)) sunpy-0.8.3/sunpy/coordinates/offset_frame.py0000644000175000017500000000777013231613137021611 0ustar nabilnabil00000000000000import astropy.units as u from astropy.coordinates import SkyOffsetFrame, SphericalRepresentation, UnitSphericalRepresentation __all__ = ['NorthOffsetFrame'] class NorthOffsetFrame(object): """ A frame which is relative to some position and another frame. Based on `astropy.coordinates.SkyOffsetFrame` Coordinates in a NorthOffsetFrame are both centered on the position specified by the ``north`` keyword *and* they are oriented in the same manner as the ``north`` frame. Unlike `~astropy.coordinates.SkyOffsetFrame` a `NorthOffsetFrame` allows you to specify the position of the new north pole rather than the new origin to centre the new frame. Examples -------- A common use for this is to create a frame derived from Heliographic, which has the north pole at some point of interest. In this new frame, lines of longitude form great circles radially away from the point, and lines of latitude measure angular distance from the point. In this example the new frame is shifted so the new north pole is at (20, 20) in the Heliographic Stonyhurst frame. The new grid is overplotted in blue. .. plot:: :include-source: import matplotlib.pyplot as plt import astropy.units as u from astropy.coordinates import SkyCoord from sunpy.coordinates import NorthOffsetFrame import sunpy.map from sunpy.data.sample import AIA_171_IMAGE m = sunpy.map.Map(AIA_171_IMAGE) north = SkyCoord(20*u.deg, 20*u.deg, frame="heliographic_stonyhurst") new_frame = NorthOffsetFrame(north=north) ax = plt.subplot(projection=m) m.plot() overlay = ax.get_coords_overlay('heliographic_stonyhurst') overlay[0].set_ticks(spacing=30. * u.deg, color='white') overlay.grid(ls='-', color='white') overlay = ax.get_coords_overlay(new_frame) overlay[0].set_ticks(spacing=30. * u.deg) overlay.grid(ls='-', color='blue') Notes ----- ``NorthOffsetFrame`` is a wrapper around the `~astropy.coordinates.SkyOffsetFrame` factory class. This class will calculate the desired coordianates of the ``origin`` from the ``north`` keyword argument and then create a `~astropy.coordinates.SkyOffsetFrame`. Using this frame is equivalent to using `~astropy.coordinates.SkyOffsetFrame` with ``lat = lat - 90*u.deg`` for a position of the north pole in the original northern hemisphere. This class will only work for Heliographic-Stonyhurst and Heliographic Carrington frames, and not helioprojective. If you want to rotate a helioprojective frame, it would be more natural to use the `~astropy.coordinates.SkyOffsetFrame`. """ def __new__(cls, *args, **kwargs): origin_frame = kwargs.pop('north', None) if origin_frame is None: raise TypeError("Can't initialize an NorthOffsetFrame without origin= keyword.") if hasattr(origin_frame, 'frame'): origin_frame = origin_frame.frame if not isinstance(origin_frame.data, SphericalRepresentation): rep = origin_frame.represent_as(SphericalRepresentation) else: rep = origin_frame.data lon = rep.lon lat = rep.lat if lat > 0*u.deg: lat = lat - 90*u.deg rotation = None else: lon = lon - 180*u.deg lat = -90*u.deg - lat rotation = 180*u.deg if isinstance(origin_frame.data, UnitSphericalRepresentation): new_rep = origin_frame.representation(lon=lon, lat=lat) else: new_rep = origin_frame.representation(lon=lon, lat=lat, distance=rep.distance) new_origin = origin_frame.realize_frame(new_rep) kwargs['origin'] = new_origin kwargs['rotation'] = rotation return SkyOffsetFrame(*args, **kwargs) sunpy-0.8.3/sunpy/coordinates/representation.py0000644000175000017500000001145313231613137022204 0ustar nabilnabil00000000000000""" SunPy specific representations. This submodule extends `astropy.coordinates.representations` with two Spherical representation classes, primarily for use with the Helioprojective coordinate system, due to the convention of Longitude going from -180 to 180 degrees. """ from __future__ import absolute_import, division from collections import OrderedDict from astropy import units as u from astropy.coordinates.representation import (SphericalRepresentation, UnitSphericalRepresentation, CartesianRepresentation) from astropy.coordinates import Longitude, Latitude __all__ = ['Longitude180', 'SphericalWrap180Representation', 'UnitSphericalWrap180Representation'] class Longitude180(Longitude): """ Quantity class that represents Longitude. It sets the default wrap_angle to 180 degrees. Parameters ---------- angle : array, list, scalar, `~astropy.units.Quantity`, :class:`~astropy.coordinates.Angle` The angle value(s). If a tuple, will be interpreted as ``(h, m s)`` or ``(d, m, s)`` depending on ``unit``. If a string, it will be interpreted following the rules described for :class:`~astropy.coordinates.Angle`. If ``angle`` is a sequence or array of strings, the resulting values will be in the given ``unit``, or if `None` is provided, the unit will be taken from the first given value. unit : :class:`~astropy.units.UnitBase`, str, optional The unit of the value specified for the angle. This may be any string that `~astropy.units.Unit` understands, but it is better to give an actual unit object. Must be an angular unit. wrap_angle : :class:`~astropy.coordinates.Angle` or equivalent, or None Angle at which to wrap back to ``wrap_angle - 180 deg``. If ``None`` (default), it will be taken to be 180 deg unless ``angle`` has a ``wrap_angle`` attribute already (i.e., is a ``Longitude``), in which case it will be taken from there. """ def __new__(cls, angle, unit=None, wrap_angle=180 * u.deg, **kwargs): self = super(Longitude180, cls).__new__(cls, angle, unit=unit, wrap_angle=wrap_angle, **kwargs) return self class UnitSphericalWrap180Representation(UnitSphericalRepresentation): """ Representation of points in 3D Spherical coordinates. This representation allows for a negative Longitude. It does so by setting wrap_angle=180 degrees. Parameters ---------- lon, lat: `~astropy.units.Quantity` The longitude and latitude of the point(s) in angular units. The latitude should be between -90 and +90 degrees, and the longitude is allowed to have any value between -180 to 180 degrees. These can also be instances of `~astropy.units.Angle`, `~astropy.coordinates.Longitude`, or `~astropy.coordinates.Latitude`. distance: `~astropy.units.Quantity` The distance to the point(s). If the distance is a length, it is passed to the :class:`~astropy.coordinates.Distance` class, else it is passed to the :class:`~astropy.units.Quantity` class. copy: bool, optional If True, arrays will be copied rather than referenced. """ attr_classes = OrderedDict([('lon', Longitude180), ('lat', Latitude)]) recommended_units = {'lon': u.deg, 'lat': u.deg} class SphericalWrap180Representation(SphericalRepresentation): """ Representation of points in 3D Spherical coordinates. This representation allows for a negative Longitude. It does so by setting wrap_angle=180 degrees. Parameters ---------- lon, lat: `~astropy.units.Quantity` The longitude and latitude of the point(s) in angular units. The latitude should be between -90 and +90 degrees, and the longitude is allowed to have any value between -180 to 180 degrees. These can also be instances of `~astropy.units.Angle`, `~astropy.coordinates.Longitude`, or `~astropy.coordinates.Latitude`. distance: `~astropy.units.Quantity` The distance to the point(s). If the distance is a length, it is passed to the :class:`~astropy.coordinates.Distance` class, else it is passed to the :class:`~astropy.units.Quantity` class. copy: bool, optional If True, arrays will be copied rather than referenced. """ attr_classes = OrderedDict([('lon', Longitude180), ('lat', Latitude), ('distance', u.Quantity)]) recommended_units = {'lon': u.deg, 'lat': u.deg} _unitrep = UnitSphericalWrap180Representation sunpy-0.8.3/sunpy/coordinates/transformations.py0000644000175000017500000003141713231613137022375 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- """ Coordinate Transformation Functions This module contains the functions for converting one `sunpy.coordinates.frames` object to another. .. warning:: The functions in this submodule should never be called directly, transforming between coordinate frames should be done using the ``.transform_to`` methods on `~astropy.coordinates.BaseCoordinateFrame` or `~astropy.coordinates.SkyCoord` instances. """ from __future__ import absolute_import, division import numpy as np from astropy import units as u from astropy.coordinates.representation import (CartesianRepresentation, UnitSphericalRepresentation, SphericalRepresentation) from astropy.coordinates.baseframe import frame_transform_graph from astropy.coordinates.builtin_frames import _make_transform_graph_docs from astropy.coordinates.transformations import FunctionTransform, DynamicMatrixTransform from astropy.coordinates.matrix_utilities import rotation_matrix, matrix_product, matrix_transpose from astropy.coordinates import HCRS, get_body_barycentric, BaseCoordinateFrame, ConvertError from astropy.tests.helper import quantity_allclose from .representation import SphericalWrap180Representation from .frames import (HeliographicStonyhurst, HeliographicCarrington, Heliocentric, Helioprojective) __all__ = ['hgs_to_hgc', 'hgc_to_hgs', 'hcc_to_hpc', 'hpc_to_hcc', 'hcc_to_hgs', 'hgs_to_hcc', 'hpc_to_hpc', 'hcrs_to_hgs', 'hgs_to_hcrs'] def _carrington_offset(obstime): """ Calculate the HG Longitude offest based on a time """ if obstime is None: raise ValueError("To perform this transformation the coordinate" " Frame needs a obstime Attribute") # Import here to avoid a circular import from .ephemeris import get_sun_L0 return get_sun_L0(obstime) # ============================================================================= # ------------------------- Transformation Framework -------------------------- # ============================================================================= @frame_transform_graph.transform(FunctionTransform, HeliographicStonyhurst, HeliographicCarrington) def hgs_to_hgc(hgscoord, hgcframe): """ Transform from Heliographic Stonyhurst to Heliograpic Carrington. """ c_lon = hgscoord.spherical.lon + _carrington_offset(hgscoord.obstime).to( u.deg) representation = SphericalRepresentation(c_lon, hgscoord.lat, hgscoord.radius) hgcframe = hgcframe.__class__(obstime=hgscoord.obstime) return hgcframe.realize_frame(representation) @frame_transform_graph.transform(FunctionTransform, HeliographicCarrington, HeliographicStonyhurst) def hgc_to_hgs(hgccoord, hgsframe): """ Convert from Heliograpic Carrington to Heliographic Stonyhurst. """ if hgccoord.obstime: obstime = hgccoord.obstime else: obstime = hgsframe.obstime s_lon = hgccoord.spherical.lon - _carrington_offset(obstime).to( u.deg) representation = SphericalWrap180Representation(s_lon, hgccoord.lat, hgccoord.radius) return hgsframe.realize_frame(representation) @frame_transform_graph.transform(FunctionTransform, Heliocentric, Helioprojective) def hcc_to_hpc(helioccoord, heliopframe): """ Convert from Heliocentic Cartesian to Helioprojective Cartesian. """ # Propagate obstime explicitly. if heliopframe.obstime is None: heliopframe._obstime = helioccoord._obstime x = helioccoord.x.to(u.m) y = helioccoord.y.to(u.m) z = helioccoord.z.to(u.m) # d is calculated as the distance between the points # (x,y,z) and (0,0,D0). distance = np.sqrt(x**2 + y**2 + (helioccoord.observer.radius - z)**2) hpcx = np.rad2deg(np.arctan2(x, helioccoord.observer.radius - z)) hpcy = np.rad2deg(np.arcsin(y / distance)) representation = SphericalWrap180Representation(hpcx, hpcy, distance.to(u.km)) return heliopframe.realize_frame(representation) @frame_transform_graph.transform(FunctionTransform, Helioprojective, Heliocentric) def hpc_to_hcc(heliopcoord, heliocframe): """ Convert from Helioprojective Cartesian to Heliocentric Cartesian. """ if not isinstance(heliopcoord.observer, BaseCoordinateFrame): raise ConvertError("Cannot transform helioprojective coordinates to " "heliocentric coordinates for observer '{}' " "without `obstime` being specified.".format(heliopcoord.observer)) heliopcoord = heliopcoord.calculate_distance() x = np.deg2rad(heliopcoord.Tx) y = np.deg2rad(heliopcoord.Ty) cosx = np.cos(x) sinx = np.sin(x) cosy = np.cos(y) siny = np.sin(y) rx = (heliopcoord.distance.to(u.m)) * cosy * sinx ry = (heliopcoord.distance.to(u.m)) * siny rz = (heliopcoord.observer.radius.to(u.m)) - ( heliopcoord.distance.to(u.m)) * cosy * cosx representation = CartesianRepresentation( rx.to(u.km), ry.to(u.km), rz.to(u.km)) return heliocframe.realize_frame(representation) @frame_transform_graph.transform(FunctionTransform, Heliocentric, HeliographicStonyhurst) def hcc_to_hgs(helioccoord, heliogframe): """ Convert from Heliocentric Cartesian to Heliographic Stonyhurst. """ if not isinstance(helioccoord.observer, BaseCoordinateFrame): raise ConvertError("Cannot transform heliocentric coordinates to " "heliographic coordinates for observer '{}' " "without `obstime` being specified.".format(helioccoord.observer)) x = helioccoord.x.to(u.m) y = helioccoord.y.to(u.m) z = helioccoord.z.to(u.m) l0_rad = helioccoord.observer.lon b0_deg = helioccoord.observer.lat cosb = np.cos(np.deg2rad(b0_deg)) sinb = np.sin(np.deg2rad(b0_deg)) hecr = np.sqrt(x**2 + y**2 + z**2) hgln = np.arctan2(x, z * cosb - y * sinb) + l0_rad hglt = np.arcsin((y * cosb + z * sinb) / hecr) representation = SphericalWrap180Representation( np.rad2deg(hgln), np.rad2deg(hglt), hecr.to(u.km)) return heliogframe.realize_frame(representation) @frame_transform_graph.transform(FunctionTransform, HeliographicStonyhurst, Heliocentric) def hgs_to_hcc(heliogcoord, heliocframe): """ Convert from Heliographic Stonyhurst to Heliograpic Carrington. """ hglon = heliogcoord.lon hglat = heliogcoord.lat r = heliogcoord.radius.to(u.m) if heliocframe.obstime is None: heliocframe._obstime = heliogcoord.obstime if not isinstance(heliocframe.observer, BaseCoordinateFrame): raise ConvertError("Cannot transform heliographic coordinates to " "heliocentric coordinates for observer '{}' " "without `obstime` being specified.".format(heliocframe.observer)) l0_rad = heliocframe.observer.lon.to(u.rad) b0_deg = heliocframe.observer.lat lon = np.deg2rad(hglon) lat = np.deg2rad(hglat) cosb = np.cos(b0_deg.to(u.rad)) sinb = np.sin(b0_deg.to(u.rad)) lon = lon - l0_rad cosx = np.cos(lon) sinx = np.sin(lon) cosy = np.cos(lat) siny = np.sin(lat) x = r * cosy * sinx y = r * (siny * cosb - cosy * cosx * sinb) zz = r * (siny * sinb + cosy * cosx * cosb) representation = CartesianRepresentation( x.to(u.km), y.to(u.km), zz.to(u.km)) return heliocframe.realize_frame(representation) @frame_transform_graph.transform(FunctionTransform, Helioprojective, Helioprojective) def hpc_to_hpc(heliopcoord, heliopframe): """ This converts from HPC to HPC, with different observer location parameters. It does this by transforming through HGS. """ if (heliopcoord.observer == heliopframe.observer or (quantity_allclose(heliopcoord.observer.lat, heliopframe.observer.lat) and quantity_allclose(heliopcoord.observer.lon, heliopframe.observer.lon) and quantity_allclose(heliopcoord.observer.radius, heliopframe.observer.radius))): return heliopframe.realize_frame(heliopcoord._data) if not isinstance(heliopframe.observer, BaseCoordinateFrame): raise ConvertError("Cannot transform between helioprojective frames " "without `obstime` being specified for observer {}.".format(heliopframe.observer)) if not isinstance(heliopcoord.observer, BaseCoordinateFrame): raise ConvertError("Cannot transform between helioprojective frames " "without `obstime` being specified for observer {}.".format(heliopcoord.observer)) hgs = heliopcoord.transform_to(HeliographicStonyhurst) hgs.observer = heliopframe.observer hpc = hgs.transform_to(heliopframe) return hpc def _make_rotation_matrix_from_reprs(start_representation, end_representation): """ Return the matrix for the direct rotation from one representation to a second representation. The representations need not be normalized first. """ A = start_representation.to_cartesian() B = end_representation.to_cartesian() rotation_axis = A.cross(B) rotation_angle = -np.arccos(A.dot(B) / (A.norm() * B.norm())) # negation is required # This line works around some input/output quirks of Astropy's rotation_matrix() matrix = np.array(rotation_matrix(rotation_angle, rotation_axis.xyz.value.tolist())) return matrix # The Sun's north pole is oriented RA=286.13 deg, dec=63.87 deg in ICRS, and thus HCRS as well # (See Archinal et al. 2011, # "Report of the IAU Working Group on Cartographic Coordinates and Rotational Elements: 2009") # The orientation of the north pole in ICRS/HCRS is assumed to be constant in time _SOLAR_NORTH_POLE_HCRS = UnitSphericalRepresentation(lon=286.13*u.deg, lat=63.87*u.deg) # Calculate the rotation matrix to de-tilt the Sun's rotation axis to be parallel to the Z axis _SUN_DETILT_MATRIX = _make_rotation_matrix_from_reprs(_SOLAR_NORTH_POLE_HCRS, CartesianRepresentation(0, 0, 1)) @frame_transform_graph.transform(DynamicMatrixTransform, HCRS, HeliographicStonyhurst) def hcrs_to_hgs(hcrscoord, hgsframe): """ Convert from HCRS to Heliographic Stonyhurst (HGS). HGS shares the same origin (the Sun) as HCRS, but has its Z axis aligned with the Sun's rotation axis and its X axis aligned with the projection of the Sun-Earth vector onto the Sun's equatorial plane (i.e., the component of the Sun-Earth vector perpendicular to the Z axis). Thus, the transformation matrix is the product of the matrix to align the Z axis (by de-tilting the Sun's rotation axis) and the matrix to align the X axis. The first matrix is independent of time and is pre-computed, while the second matrix depends on the time-varying Sun-Earth vector. """ if hgsframe.obstime is None: raise ValueError("To perform this transformation the coordinate" " Frame needs an obstime Attribute") # Determine the Sun-Earth vector in ICRS # Since HCRS is ICRS with an origin shift, this is also the Sun-Earth vector in HCRS sun_pos_icrs = get_body_barycentric('sun', hgsframe.obstime) earth_pos_icrs = get_body_barycentric('earth', hgsframe.obstime) sun_earth = earth_pos_icrs - sun_pos_icrs # De-tilt the Sun-Earth vector to the frame with the Sun's rotation axis parallel to the Z axis sun_earth_detilt = sun_earth.transform(_SUN_DETILT_MATRIX) # Remove the component of the Sun-Earth vector that is parallel to the Sun's north pole # (The additional transpose operations are to handle both scalar and array obstime situations) hgs_x_axis_detilt = CartesianRepresentation((sun_earth_detilt.xyz.T * [1, 1, 0]).T) # The above vector, which is in the Sun's equatorial plane, is also the X axis of HGS x_axis = CartesianRepresentation(1, 0, 0) if hgsframe.obstime.isscalar: rot_matrix = _make_rotation_matrix_from_reprs(hgs_x_axis_detilt, x_axis) else: rot_matrix_list = [_make_rotation_matrix_from_reprs(vect, x_axis) for vect in hgs_x_axis_detilt] rot_matrix = np.stack(rot_matrix_list) return matrix_product(rot_matrix, _SUN_DETILT_MATRIX) @frame_transform_graph.transform(DynamicMatrixTransform, HeliographicStonyhurst, HCRS) def hgs_to_hcrs(hgscoord, hcrsframe): """ Convert from Heliographic Stonyhurst to HCRS. """ return matrix_transpose(hcrs_to_hgs(hcrsframe, hgscoord)) __doc__ += _make_transform_graph_docs() sunpy-0.8.3/sunpy/coordinates/utils.py0000644000175000017500000002440313231613137020301 0ustar nabilnabil00000000000000# # Calculates the co-ordinates along great arcs between two specified points # which are assumed to be on disk. # from __future__ import absolute_import, division, print_function import numpy as np import astropy.units as u from astropy.coordinates import SkyCoord from sunpy.coordinates import frames __all__ = ['GreatArc'] class GreatArc(object): """ Calculate the properties of a great arc at user-specified points between a start and end point on a sphere. Parameters ---------- start : `~astropy.coordinates.SkyCoord` Start point. end : `~astropy.coordinates.SkyCoord` End point. center : `~astropy.coordinates.SkyCoord` Center of the sphere. points : `None`, `int`, `~numpy.ndarray` Number of points along the great arc. If None, the arc is calculated at 100 equally spaced points from start to end. If int, the arc is calculated at "points" equally spaced points from start to end. If a numpy.ndarray is passed, it must be one dimensional and have values >=0 and <=1. The values in this array correspond to parameterized locations along the great arc from zero, denoting the start of the arc, to 1, denoting the end of the arc. Setting this keyword on initializing a GreatArc object sets the locations of the default points along the great arc. Methods ------- inner_angles : `~astropy.units.rad` Radian angles of the points along the great arc from the start to end co-ordinate. distances : `~astropy.units` Distances of the points along the great arc from the start to end co-ordinate. The units are defined as those returned after transforming the co-ordinate system of the start co-ordinate into its Cartesian equivalent. coordinates : `~astropy.coordinates.SkyCoord` Co-ordinates along the great arc in the co-ordinate frame of the start point. References ---------- [1] https://www.mathworks.com/matlabcentral/newsreader/view_thread/277881 [2] https://en.wikipedia.org/wiki/Great-circle_distance#Vector_version Example ------- >>> import matplotlib.pyplot as plt >>> from astropy.coordinates import SkyCoord >>> import astropy.units as u >>> from sunpy.coordinates.utils import GreatArc >>> import sunpy.map >>> from sunpy.data.sample import AIA_171_IMAGE >>> m = sunpy.map.Map(AIA_171_IMAGE) >>> a = SkyCoord(600*u.arcsec, -600*u.arcsec, frame=m.coordinate_frame) >>> b = SkyCoord(-100*u.arcsec, 800*u.arcsec, frame=m.coordinate_frame) >>> great_arc = GreatArc(a, b) >>> ax = plt.subplot(projection=m) # doctest: +SKIP >>> m.plot(axes=ax) # doctest: +SKIP >>> ax.plot_coord(great_arc.coordinates(), color='c') # doctest: +SKIP >>> plt.show() # doctest: +SKIP """ def __init__(self, start, end, center=None, points=None): # Start point of the great arc self.start = start # End point of the great arc self.end = end # Parameterized location of points between the start and the end of the # great arc. # Default parameterized points location. self.default_points = np.linspace(0, 1, 100) # If the user requests a different set of default parameterized points # on initiation of the object, then these become the default. This # allows the user to use the methods without having to specify their # choice of points over and over again, while also allowing the # flexibility in the methods to calculate other values. self.default_points = self._points_handler(points) # Units of the start point self.distance_unit = self.start.transform_to(frames.Heliocentric).cartesian.xyz.unit # Co-ordinate frame self.start_frame = self.start.frame # Observer self.observer = self.start.observer # Set the center of the sphere if center is None: self.center = SkyCoord(0 * self.distance_unit, 0 * self.distance_unit, 0 * self.distance_unit, frame=frames.Heliocentric) # Convert the start, end and center points to their Cartesian values self.start_cartesian = self.start.transform_to(frames.Heliocentric).cartesian.xyz.to(self.distance_unit).value self.end_cartesian = self.end.transform_to(frames.Heliocentric).cartesian.xyz.to(self.distance_unit).value self.center_cartesian = self.center.transform_to(frames.Heliocentric).cartesian.xyz.to(self.distance_unit).value # Great arc properties calculation # Vector from center to first point self.v1 = self.start_cartesian - self.center_cartesian # Distance of the first point from the center self._r = np.linalg.norm(self.v1) # Vector from center to second point self.v2 = self.end_cartesian - self.center_cartesian # The v3 vector lies in plane of v1 & v2 and is orthogonal to v1 self.v3 = np.cross(np.cross(self.v1, self.v2), self.v1) self.v3 = self._r * self.v3 / np.linalg.norm(self.v3) # Inner angle between v1 and v2 in radians self.inner_angle = np.arctan2(np.linalg.norm(np.cross(self.v1, self.v2)), np.dot(self.v1, self.v2)) * u.rad # Radius of the sphere self.radius = self._r * self.distance_unit # Distance on the sphere between the start point and the end point. self.distance = self.radius * self.inner_angle.value def _points_handler(self, points): """ Interprets the points keyword. """ if points is None: return self.default_points elif isinstance(points, int): return np.linspace(0, 1, points) elif isinstance(points, np.ndarray): if points.ndim > 1: raise ValueError('One dimensional numpy ndarrays only.') if np.any(points < 0) or np.any(points > 1): raise ValueError('All value in points array must be strictly >=0 and <=1.') return points else: raise ValueError('Incorrectly specified "points" keyword value.') def inner_angles(self, points=None): """ Calculates the inner angles for the parameterized points along the arc and returns the value in radians, from the start co-ordinate to the end. Parameters ---------- points : `None`, `int`, `~numpy.ndarray` If None, use the default locations of parameterized points along the arc. If int, the arc is calculated at "points" equally spaced points from start to end. If a numpy.ndarray is passed, it must be one dimensional and have values >=0 and <=1. The values in this array correspond to parameterized locations along the great arc from zero, denoting the start of the arc, to 1, denoting the end of the arc. Returns ------- inner_angles : `~astropy.units.rad` Radian angles of the points along the great arc from the start to end co-ordinate. """ these_points = self._points_handler(points) return these_points.reshape(len(these_points), 1)*self.inner_angle def distances(self, points=None): """ Calculates the distance from the start co-ordinate to the end co-ordinate on the sphere for all the parameterized points. Parameters ---------- points : `None`, `int`, `~numpy.ndarray` If None, use the default locations of parameterized points along the arc. If int, the arc is calculated at "points" equally spaced points from start to end. If a numpy.ndarray is passed, it must be one dimensional and have values >=0 and <=1. The values in this array correspond to parameterized locations along the great arc from zero, denoting the start of the arc, to 1, denoting the end of the arc. Returns ------- distances : `~astropy.units` Distances of the points along the great arc from the start to end co-ordinate. The units are defined as those returned after transforming the co-ordinate system of the start co-ordinate into its Cartesian equivalent. """ return self.radius * self.inner_angles(points=points).value def coordinates(self, points=None): """ Calculates the co-ordinates on the sphere from the start to the end co-ordinate for all the parameterized points. Co-ordinates are returned in the frame of the start coordinate. Parameters ---------- points : `None`, `int`, `~numpy.ndarray` If None, use the default locations of parameterized points along the arc. If int, the arc is calculated at "points" equally spaced points from start to end. If a numpy.ndarray is passed, it must be one dimensional and have values >=0 and <=1. The values in this array correspond to parameterized locations along the great arc from zero, denoting the start of the arc, to 1, denoting the end of the arc. Returns ------- arc : `~astropy.coordinates.SkyCoord` Co-ordinates along the great arc in the co-ordinate frame of the start point. """ # Calculate the inner angles these_inner_angles = self.inner_angles(points=points) # Calculate the Cartesian locations from the first to second points great_arc_points_cartesian = (self.v1[np.newaxis, :] * np.cos(these_inner_angles) + self.v3[np.newaxis, :] * np.sin(these_inner_angles) + self.center_cartesian) * self.distance_unit # Return the coordinates of the great arc between the start and end # points return SkyCoord(great_arc_points_cartesian[:, 0], great_arc_points_cartesian[:, 1], great_arc_points_cartesian[:, 2], frame=frames.Heliocentric, observer=self.observer).transform_to(self.start_frame) sunpy-0.8.3/sunpy/coordinates/wcs_utils.py0000644000175000017500000000325613231613137021160 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- from __future__ import absolute_import, division import astropy.wcs.utils from astropy.wcs import WCSSUB_CELESTIAL from .frames import Helioprojective, Heliocentric, HeliographicStonyhurst, HeliographicCarrington __all__ = ['solar_wcs_frame_mapping'] def solar_wcs_frame_mapping(wcs): """ This function registers the coordinates frames to their FITS-WCS coordinate type values in the `astropy.wcs.utils.wcs_to_celestial_frame` registry. """ dateobs = wcs.wcs.dateobs if wcs.wcs.dateobs else None # SunPy Map adds 'heliographic_observer' and 'rsun' attributes to the WCS # object. We check for them here, and default to None. if hasattr(wcs, 'heliographic_observer'): observer = wcs.heliographic_observer else: observer = None if hasattr(wcs, 'rsun'): rsun = wcs.rsun else: rsun = None # First we try the Celestial sub, which rectifies the order. # It will return anything matching ??LN*, ??LT* wcss = wcs.sub([WCSSUB_CELESTIAL]) # If the SUB works, use it. if wcss.naxis == 2: wcs = wcss xcoord = wcs.wcs.ctype[0][0:4] ycoord = wcs.wcs.ctype[1][0:4] if xcoord == 'HPLN' and ycoord == 'HPLT': return Helioprojective(obstime=dateobs, observer=observer, rsun=rsun) if xcoord == 'HGLN' and ycoord == 'HGLT': return HeliographicStonyhurst(obstime=dateobs) if xcoord == 'CRLN' and ycoord == 'CRLT': return HeliographicCarrington(obstime=dateobs) if xcoord == 'SOLX' and ycoord == 'SOLY': return Heliocentric(obstime=dateobs, observer=observer) astropy.wcs.utils.WCS_FRAME_MAPPINGS.append([solar_wcs_frame_mapping]) sunpy-0.8.3/sunpy/data/0000755000175000017500000000000013232563477015177 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/data/__pycache__/0000755000175000017500000000000013232563477017407 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/data/__pycache__/__init__.cpython-36.pyc0000644000175000017500000000047413232362547023574 0ustar nabilnabil000000000000003 c!Z@s$ddlmZddlmZdZdZdS))absolute_import)download_sample_datazSteven Christezsteven.christe@nasa.govN) __future__rZsunpy.data._sampler __author__ __email__rr,/home/nabil/Git/sunpy/sunpy/data/__init__.pys  sunpy-0.8.3/sunpy/data/__pycache__/_sample.cpython-36.pyc0000644000175000017500000001066413232362547023457 0ustar nabilnabil000000000000003 _gZY@sdZddlmZmZmZddlZddlZddlZddl m Z ddl m Z ddl mZddlmZddlmZdd lmZdd lmZd Zd Zd/Zdddddddddddddddddd d!d"d#d$d%d&d'd(ZeZd0d*d+Zd1d-d.ZdS)2zSunPy sample data files)absolute_importdivisionprint_functionN)ZipFile)move) download_file)six) url_exists)get_and_create_sample_dir)configzSteven Christezsteven.christe@nasa.govhttp://data.sunpy.org/sunpy/v1/9https://github.com/sunpy/sample-data/raw/master/sunpy/v1/z#AIA20110607_063301_0131_lowres.fitsz#AIA20110607_063302_0171_lowres.fitsz#AIA20110607_063302_0211_lowres.fitsz#AIA20110607_063303_0335_lowres.fitsz#AIA20110607_063305_0094_lowres.fitsz#AIA20110607_063305_1600_lowres.fitsz#AIA20110607_063307_0193_lowres.fitsz#AIA20110607_063307_0193_cutout.fitsz#AIA20110607_063931_0193_cutout.fitsz#AIA20110607_064555_0193_cutout.fitsz#AIA20110607_065219_0193_cutout.fitsz#AIA20110607_065843_0193_cutout.fitszeit_l1_20110607_203753.fitszhsi_image_20110607_063300.fitszBIR_20110607_062400_10.fitzswap_lv1_20110607_063329.fitszaiacalibim5.fits.gzz20110607_EVE_L0CS_DIODES_1m.txtz"lyra_20110607-000000_lev3_std.fitszgo1520110607.fitszglg_cspec_n5_110607_v00.phazswpc_solar_cycle_indices.txtz predicted-sunspot-radio-flux.txtzhsi_obssumm_20110607_025.fitsztca110607.fits)Z AIA_131_IMAGEZ AIA_171_IMAGEZ AIA_211_IMAGEZ AIA_335_IMAGEZ AIA_094_IMAGEZAIA_1600_IMAGEZ AIA_193_IMAGEZAIA_193_CUTOUT01_IMAGEZAIA_193_CUTOUT02_IMAGEZAIA_193_CUTOUT03_IMAGEZAIA_193_CUTOUT04_IMAGEZAIA_193_CUTOUT05_IMAGEZ EIT_195_IMAGEZ RHESSI_IMAGEZCALLISTO_SPECTRUMZSWAP_LEVEL1_IMAGEZAIA_171_ROLL_IMAGEZEVE_TIMESERIESZLYRA_LEVEL3_TIMESERIESZGOES_XRS_TIMESERIESZGBM_TIMESERIESZNOAAINDICES_TIMESERIESZNOAAPREDICT_TIMESERIESZRHESSI_TIMESERIESZNORH_TIMESERIESTcCs(x"tjtD]}t||tddq WdS)z Download all sample data at once. This will overwrite any existing files. Parameters ---------- show_progress: `bool` Show a progress bar during download Returns ------- None T) show_progressurl_list overwriteN)r itervalues _sample_filesget_sample_file _base_urls)r file_namer+/home/nabil/Git/sunpy/sunpy/data/_sample.pydownload_sample_dataHs rFcCs|d ddkr|dd}n|}| rLtjjtjjt|rLtjjt|Sx4|D]*}|}|jdrp|d7}ytjjj ||}t |} | r@t tjj||||d} tjj | \} } | dkrt d j| t| d } | j| t}WdQRXtj| t|tjjt|tjjt|St| tjjt|tjjt|SWqTtjtjfk r~}ztjd j|WYdd}~XqTXqTWtjd j|dSdS)a Downloads a sample file. Will download a sample data file and move it to the sample data directory. Also, uncompresses zip files if necessary. Returns the local file if exists. Parameters ---------- filename: `str` Name of the file url_list: `str` or `list` urls where to look for the file show_progress: `bool` Show a progress bar during download overwrite: `bool` If True download and overwrite an existing file. timeout: `float` The timeout in seconds. If `None` the default timeout is used from `astropy.utils.data.Conf.remote_timeout`. Returns ------- result: `str` The local path of the file. None if it failed. NzipZgithubz ?raw=true)rtimeoutz.zipz Unpacking: {}rz?Download failed with error {}. Retrying with different mirror.zFile {} not found.)ospathisfilejoinsampledata_dircountrmoves urllib_parseurljoinr rsplitextprintformatrextractremoversocketerrorrwarningswarn)filenamerrrrZuncompressed_filenameZbase_urlZonline_filenameurlexistsfZ real_nameextzip_fileZ unzipped_ferrrrZsJ       r)r r )T)TFN)__doc__ __future__rrros.pathr r.r0zipfilershutilrZastropy.utils.datar sunpy.externrZsunpy.util.netr sunpy.util.configr sunpyr __author__ __email__rrr$rrrrrrsX         sunpy-0.8.3/sunpy/data/__pycache__/sample.cpython-36.pyc0000644000175000017500000000117713232362547023317 0ustar nabilnabil000000000000003 _gZ%@sdZddlmZddlZddlmZmZmZgZiZ xReD]JZ eee eZ e ej ee e eje e je e iedje 7Zq:WeejddgZdS) zP SunPy sample data files The following files are available in this submodule: )absolute_importN) _base_urls _sample_filesget_sample_filez * ``{}`` file_dict file_list)__doc__ __future__rsys_samplerrrrr_keyfsetattrmodules__name__appendupdateformatlistkeys__all__rr*/home/nabil/Git/sunpy/sunpy/data/sample.pys   sunpy-0.8.3/sunpy/data/__pycache__/setup_package.cpython-36.pyc0000644000175000017500000000042213232361016024627 0ustar nabilnabil000000000000003 _gZl@s ddZdS)cCsdgddgdS)NZsunpyrc*z*/*)z sunpy.datazsunpy.data.testrrrsunpy/data/setup_package.pyget_package_datasrN)rrrrrssunpy-0.8.3/sunpy/data/test/0000755000175000017500000000000013232563477016156 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/data/test/EIT/0000755000175000017500000000000013232563477016577 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/data/test/EIT/efz20040301.000010_s.fits0000644000175000001440000042350013203275053021103 0ustar nabil00000000000000SIMPLE = T / conforms to FITS standard BITPIX = -64 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 128 NAXIS2 = 128 DATE = '2004-03-01' / Date of file creation TIME-OBS= '00:00:10' / DATE-OBS= '2004-03-01T00:00:10.515' / UTC at spacecraft ORIGIN = 'Rocket Science' / Rocket Science = NASA GSFC DATASRC = 'LZ file ' / TELESCOP= 'SOHO' / INSTRUME= 'EIT' / OBJECT = 'full FOV' / BUNIT = 'counts / pixel ' / WAVELNTH= 195 / 171 = Fe IX/X, 195 = Fe XII, / 284 = Fe XV, 304 = He II FILTER = 'Al +1 ' / DATE_OBS= '2004-03-01T00:00:10.515Z' / SCI_OBJ = 'CME WATCH 195 ' / OBS_PROG= '195_10S_AL_1.000 ' / CMP_NO = 1 / Unique campaign instance (1 = synoptic) EXPTIME = 13.000 / s (total commanded + shutter close) EXPMODE = 'backside ' / FILENAME= 'efz20040301.000010' / CFTEMP = -66.71 / CCD cold finger temperature (C) CCDTEMP = 7.34 / CCD temperature (DN/100) CTYPE1 = 'Solar-X ' / CTYPE2 = 'Solar-Y ' / CRPIX1 = 64.5 / Sun center x, EIT pixels CRPIX2 = 64.5 / Sun center y, EIT pixels CRVAL1 = 0.00 / CRVAL2 = 0.00 / CDELT1 = 2.63 / Pixel scale x (arc sec, fixed) CDELT2 = 2.63 / Pixel scale y (arc sec, fixed) SOLAR_R = 372.27 / Solar photospheric radius, EIT pixels SOLAR_B0= -7.22 / Degrees SC_X0 = 0.00 / s/c yaw (arc sec) SC_Y0 = 0.00 / s/c pitch (arc sec; -109.14 after 1996/04/16) SC_ROLL = 180.00 / s/c roll (deg., Solar north + CCW from nominal)HEC_X = -139130208.00 / s/c heliocentric ecliptic x (km) HEC_Y = 46576272.00 / s/c heliocentric ecliptic y (km) HEC_Z = -94896.31 / s/c heliocentric ecliptic z (km) CAR_ROT = 2013.00 / Carrington rotation at earth COMMENT CORRECTED DATE_OBS = '2004-02-29T23:58:20.443Z' COMMENT COMMANDED EXPOSURE TIME = 10.000 s COMMENT SHUTTER CLOSE TIME = 3.000 s COMMENT LINE_SYNC = 'no' COMMENT CAMERA_ERR = 'no' COMMENT IMAGE_OF_SEQ = 0 COMMENT READOUT PORT = 'B' COMMENT NUM_LEB_PROC = 3 COMMENT LEB_PROC = 26 (no ROI) COMMENT LEB_PROC = 27 (no occ mask) COMMENT LEB_PROC = 12 (Rice) COMMENT BLOCKS_HORZ = 32 COMMENT BLOCKS_VERT = 32 COMMENT P1_X = 1 COMMENT P2_X = 1024 COMMENT P1_Y = 20 COMMENT P2_Y = 1043 COMMENT N_MISSING_BLOCKS = 1 HISTORY Version 4.0, 2001 December 10 HISTORY Image linear resampled to (128,128) for SunPy END @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@p@@r@@@r@p@r@d@n@t@j@V@h@b@j@j@\@^@d@L@^@l@F@\@F@V@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@"@@@@@*@@@4@@@@@@@@"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@z@~@x@h@t@z@f@x@n@v@r@Z@X@b@j@h@^@^@Z@X@b@R@`@J@F@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*@@$@@@(@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@~@@|@@@@|@@@r@v@~@p@v@j@h@f@d@r@Z@^@`@j@R@^@`@L@V@b@b@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"@@@@@@"@@@ @@@ @"@ @@0@@*@@@&@D@:@P@<@N@B@<@F@0@>@@0@6@ @(@@"@*@4@*@@@@@@@@@@@@@@@@@@@@@@@@@@v@@@x@@x@t@`@~@^@j@^@Z@n@^@`@V@T@X@L@f@h@^@T@\@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@0@@@@ @*@ @@@@0@H@@T@F@:@`@H@h@@R@X@L@F@T@R@@:@:@4@2@0@6@@@@@ @@@@@@@@@@@@@@@@@~@@@@@@@@v@v@x@j@h@|@z@h@\@l@Z@b@^@d@X@R@R@L@J@N@V@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@2@@ @2@@$@$@ @@6@,@,@2@@$@ @v@@h@@`@@P@H@z@V@:@h@,@@.@.@H@2@R@@.@@@@@@@@@@@@@@@@@@@@@@@z@@@@@@v@@p@t@p@|@j@f@^@f@^@f@j@p@\@\@R@R@T@\@T@P@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&@@@4@ @@@$@0@"@$@>@@R@B@<@h@,@.@H@>@T@l@(@n@b@x@@@@@@@@@p@V@b@l@b@@L@N@^@@@F@`@L@H@@ @@@@@@@@@@@@@@@@@@@z@@@@z@r@z@x@@l@f@n@f@\@p@h@v@n@h@T@b@X@f@`@\@T@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@"@@$@*@.@d@*@@L@T@B@L@F@L@J@>@f@|@@@@@@@@@@@@P@@@@@|@z@@l@B@:@B@6@@ @$@ @4@6@@@@@@@@@@@@@@@@@@@@@@v@l@p@t@t@v@x@r@p@X@b@l@\@`@\@^@L@X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ @@@&@@@@@:@>@@L@@$@^@H@P@T@T@l@h@X@@z@@x@r@~@@@@@@@L@$@@@@@@~@@@@@@@n@X@t@x@l@8@P@x@X@6@,@@$@@@@@@@@@@@@@@@@@|@@@r@f@l@z@|@d@f@V@~@j@v@h@Z@`@`@X@D@D@`@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@,@$@$@@,@F@:@2@H@N@<@l@V@@X@p@@@@@@@@@@@@2@@@@@`@@@$@@@@@@@@@@@@@@h@r@X@@h@6@`@\@6@ @@@@@@@@@@@@@@@@@@@~@r@x@v@r@t@l@x@t@h@h@l@d@h@`@d@\@T@Z@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*@@@J@"@8@<@2@l@<@H@b@b@`@@t@@@@@@@@@@@@\@>@@@~@@d@L@b@ @@.@@@:@@@.@@@@@@@@@|@^@b@X@ @@@ @@@@@@@@@@@@@@~@@@@@t@@@v@h@@f@d@d@^@V@`@V@X@Z@V@Z@@@@@@@@@@@@@@@@@@@@@ @@@@@@@0@B@@2@@B@2@H@N@j@x@~@@@@@@@@@@@@@@,@@&@B@@f@N@@@@@@@N@@@@@@<@@@@@@R@@J@@@@@@@@@x@.@*@6@*@@@@@@@@@@@@@@@@@@@@|@@z@f@p@x@|@t@d@`@Z@h@n@`@H@`@@@@@@@@@@@@@@@@@@@@@ @@@@@&@@@.@@"@@@L@<@H@@B@z@p@@@@@@@@@@ @&@F@R@H@|@>@p@@z@@@@T@@N@@P@0@@@:@t@@T@P@@ @@l@h@R@8@P@L@6@@@@@@n@x@>@@@@@@@@@@@@@@@@@@@@@@@v@@|@h@r@h@b@b@b@T@N@\@`@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@B@@*@@@:@R@T@`@@p@~@@@@@@P@@@@@h@f@x@@@@@@@ @ @^@@@@@^@@@@r@@@@@b@R@@@@@@@@h@J@8@@@@@@r@Z@:@@@@@@@@@@@@@@@@@@@@@n@r@t@x@t@r@r@j@`@d@p@Z@`@T@@@@@@@@@@ @@@@@@@@@@@@@ @$@8@>@8@V@r@<@V@Z@r@@~@@@@@@@L@\@@@@@@@@@@,@@B@v@d@~@@@@@@}@@~@@@@@@@@@@@R@"@@@r@x@d@@@@p@H@@0@@@@f@H@f@,@@ @@@@@@@@@@@@@@@@@v@p@@x@|@v@@~@~@@X@\@f@@@@@@@@@@@@@@@ @@@@@@@@@,@@:@<@,@l@.@b@x@|@|@@@@@@@@6@@@@@@@8@@$@*@,@@@L@@@2@@@@~@@@q@@@@@:@<@z@)@*@@@ @H@@@@@@@@@$@@@@<@@@@@@@r@N@ @@@@@@@@@@@@@@@@@@l@@~@z@|@x@n@d@h@~@\@b@d@@@@@@@@@@@@ @@@ @@$@@@&@(@*@B@F@@T@`@X@@p@l@@@@@@@@"@@@z@t@@@@Z@@J@2@@@j@@@@@@@p@L@r@@0@@@@a@@@@ @@@@6@@c@@@@z@t@@4@b@,@t@(@4@B@@@@@@@@@p@8@(@ @@@@@@@@@@@@@@@@@v@@@@~@j@b@h@b@X@`@l@@@@@@@@@@*@@ @@@ @@@0@@.@2@@T@P@F@@N@|@@@@@@@@>@z@x@@@@@R@@@@(@@@@l@@@@@@&@@@@@F@@r@@c@@@@G@d@@@@@@g@@@@@@@.@@~@@@@f@@@@@P@`@(@@@>@L@4@@@@@@@@@@@L@@@@@@@@x@@@@p@f@`@@@@@@@@@@@@@@@@$@@ @&@@,@6@8@>@h@H@@@@@@@@@>@~@b@@@@X@T@@@@L@@@@B@@.@v@@@@@@@,@8@@@@@@@@ @p@@@@@@@j@o@=@@ @-@3@@&@ @@h@@b@@@\@@@t@<@0@@n@~@H@R@$@@@@@@@@@@@@@@@v@@@@@t@`@z@v@d@t@@@$@@"@@@4@(@h@*@$@:@ @H@Z@:@j@Z@h@~@V@@z@@@@@"@@T@X@r@@@@@@@:@h@@@@@n@\@B@F@h@F@@b@@:@@@N@@@@@ @|@@@@t@@@$@@$@v@\@F@@3@@@@b@@T@d@@b@X@&@~@@@@@@@h@<@@@v@~@6@J@&@@@@@@@@@@@@@@~@@@@@l@@h@R@n@@@@@ @ @@@@@@0@ @ @(@F@"@\@f@v@h@T@z@@@@@@\@(@J@@@"@F@@@@,@.@|@t@T@@@l@@j@j@R@,@@@@@@@@R@p@&@@@@ @@@:@V@L@@@n@@@@@@@@@L@5@@@!@@@@@@>@@@@X@*@@Z@@@@j@`@N@0@2@@@@@@@@@@@@@@@@@@@|@f@d@l@@@@@@@$@ @ @.@>@@(@@T@J@(@L@Z@^@@@@@@@@$@@@@N@R@@J@L@@@@|@t@.@V@@@@<@@@@@@@&@@@h@h@@j@@@@6@@r@&@@@2@8@@@v@@@@@@@@l@&@@@@5@@@:@|@<@@@@@T@@@@@@@x@X@6@ @@@@@@@@@@@@@@@@@n@z@t@~@p@x@"@2@(@2@J@$@J@P@0@`@.@H@@V@n@|@|@@@@@@@@@8@x@@:@2@d@@V@p@@@@@ @(@@@@@(@@@@|@@b@@@@@@@@L@J@@P@h@T@4@@P@N@f@@@@V@@@@`@@R@@@@@$@x@.@@B@@@v@V@l@@`@$@@@@N@@@@~@@@@:@@ @&@@@@@@@@@@@@@@@@@x@~@@ @@$@0@@4@ @0@@@@F@@@6@T@^@Z@@v@@@@@@@P@z@@@"@@@h@@@@@@@@t@L@@@@@R@l@<@D@@\@@d@j@$@@N@X@b@0@@`@@@@$@8@@@<@^@L@@ @@T@d@@@@@@8@z@4@4@h@R@D@8@@D@@@0@ @0@@t@p@(@@@@X@.@$@ @ @@@@@@@@@@@@@x@@@f@~@z@@@@\@@@\@"@4@L@`@j@b@^@@R@\@@@@@@@@@:@@@@@@@@Z@@N@@@@@*@R@~@@^@@@@@f@8@(@@p@@@@@@h@F@@,@@@@@@6@@@.@X@|@@@@@@@@@@&@@:@ @@@@@B@h@~@L@@:@@@,@`@(@@@@@@@\@b@D@(@@@@@@@@@@@@@@@|@@@x@x@@8@ @D@P@ @2@4@F@n@T@t@n@h@|@@@@@@@@v@@x@@@l@@@h@@@2@@6@ @@@@@@@@p@z@@h@@v@@@@@@@:@"@@@&@2@$@@@@~@\@@@@@@@"@@F@\@\@t@@h@\@@@@@@n@@@@@@@8@$@@@~@@@f@`@@@@@@@b@<@$@,@"@@@@@@@@@@@@@@@@@@@ @>@0@4@F@^@:@b@Z@X@p@P@@@@@@@@@P@@@@@r@@@@@@@@@<@@0@@@@@^@@@@d@@@@@D@ @@@@`@8@@@*@@@@X@@&@@@@@@@@@@@,@@@@@q@@V@(@@n@@t@@@@@@@@6@@@P@ @@&@@@z@j@Z@>@@@@@@@@@@@@@@|@@v@l@~@>@@V@`@@V@b@@|@@@@@@@@@X@ @D@@f@@@@@@@@@@<@@@~@ @@@@@@@n@t@@@@@@@@@@p@@@~@"@@@@h@j@X@@@@@@B@J@@x@V@r@@@>@@T@@F@@z@6@@&@@,@@`@@<@@@&@*@L@@J@@@@@^@J@@@@@x@F@N@.@@*@@@@@@@@@@@@@@@P@>@Z@X@:@j@f@H@@@@@@@@@H@@@Z@@@@4@@@,@@@&@@"@@@v@@@@x@@@b@T@@@@@ @@@@p@@ @@@@@4@8@@@t@@@@@.@@@r@@@@/@@@@@v@@@T@@@ @@@@@@t@4@@@N@@p@@~@@@@^@@@@@@@t@`@L@@$@(@@@@@@@@@@@@@$@L@2@,@N@X@\@t@`@@@~@@@@@@*@D@0@@@@N@@@P@@2@@@@h@n@@@b@@@@@@D@P@@@L@@@@J@@@@@@@@2@@@ @@@@@x@@f@@@@f@@@L@@@^@@@@d@.@@@V@@@@@n@0@@@@6@ @@@@@@D@@@@@(@@@@b@\@.@<@@@@@@@@@@@@@@@p@@f@@@@@@@@@@2@@(@^@<@@@@:@:@n@>@R@8@@(@@@Z@>@<@@`@@ @@@@@@@@ @6@@@@@@^@@|@@(@@@@@@8@@@<@,@>@@0@@D@t@@@@@@@@v@@@@R@b@@N@@*@@@@,@@@@@@@@@@^@@L@@|@z@@@@@@@j@b@2@(@@@@@@@@@@@@.@d@^@V@z@^@@@@@@@@@\@V@|@@@@b@J@@@@J@n@@n@@$@p@,@@@@@@@~@@@@@@@@J@@@@&@>@\@@@@x@\@@:@.@6@@0@@@@X@@R@@@ @@@@0@@p@@0@R@@@@4@@@@~@@~@@@0@@@>@@@z@@2@@@.@@@@@@v@b@<@@ @@@@@@@@@@@@:@@|@|@@@@@@@@@L@V@@@@@@@B@@@r@@@@@r@@@ @&@J@@@R@@@@@@@@@@@b@@@@@n@P@@@@@@R@@@@@@ @@@v@h@@@:@2@@@^@L@@l@@V@\@@L@|@B@$@@@ @@@@@@@ @@\@@@t@H@@@@@@@P@V@.@(@ @@@@@@@@@@@V@@x@@@@@@@P@@.@L@V@@ @P@p@r@@@@H@@@@@@@@@@@8@4@@@@@ @@@@<@,@`@@H@@`@@H@@H@J@b@@@h@<@~@@@H@@N@@@@8@@"@@@@2@@@@8@@@@@4@@@@@@@D@@@$@@H@@d@@*@@@@@j@F@B@@@@@~@J@@B@$@>@@@@@@@@@T@@x@@~@~@@@@,@"@B@@Z@@ @<@@@@@f@,@`@@h@L@T@@@@@@@@@@@@@@~@6@@@@p@j@@T@X@@@@8@@@@(@,@@z@@T@$@@@T@n@@@@p@4@@N@@@@0@@@@@@@p@@D@x@,@0@@@z@@ @@ @@d@@@X@2@@@@@x@l@L@<@,@@@@@@@@@@@v@@@@@@"@<@*@@@@@@8@@@|@@4@l@@@@@@5@@R@@@4@m@r@^@>@@6@4@@@@@@@@(@@6@@@@@@@@@@@@p@@@@@@\@~@N@0@@@^@2@@$@@8@@@@@p@@@@@@@@@F@@X@@@@@b@`@@@@^@R@<@@@@@@t@d@d@B@@@@@@@@@@@@@@@@@@2@X@~@z@@t@:@T@@@@$@Z@@`@@@@@v@v@@.@@@@@T@h@J@@8@2@@@@@8@T@@@@V@r@@@ @@@`@@z@,@@ @@@@~@p@h@T@*@@\@(@Z@l@t@@@@h@@@|@n@@@@`@@.@&@,@&@@@@,@@@@6@@@v@@@@@N@D@@@@@@@@p@l@V@@@@@@@@@@@@@@@@@4@@@@2@@@@@l@@@@8@@$@b@@R@B@@@N@$@@@@@V@@@v@@P@@8@@@t@X@@@@@@@f@n@@@r@p@*@@@<@@6@@@R@@@&@&@@@X@@8@*@@@@@@@(@`@@@@F@@@@@B@@@@l@@0@@@@@@P@T@D@@@@@@@@b@>@D@@ @@@@@@@@@@@@@j@@@@@:@z@B@@@:@@n@,@|@x@@,@H@N@@,@4@j@@R@ @@@@@@@x@~@@@@@@@@@@@ @@@ @8@L@t@^@@l@$@@@ @@@@@@6@d@4@@@@n@@l@`@@@F@@@*@ @@@@ @T@@@@@n@4@@R@@@@@@@0@@@@t@"@@@@@@@@@l@V@*@@@@@@@@@@@@@*@@@@@@t@@@@(@ @@R@@@@@@l@\@p@@@~@$@ @@@6@@&@P@,@@:@@@@@@@@@@@@ @B@@@*@B@ @@@@@8@h@V@@@@@P@F@f@@v@@Z@<@@@@@@(@@@@D@Z@@@@|@@@@@@h@@@4@@@@@@~@(@@@@@@@@@b@R@$@<@$@@@@@@@@@@:@@~@@@@@>@@@@@@P@R@@@@*@T@@<@@0@@@@@@@*@@t@@&@@@@@@@@@@@@v@p@T@@$@@R@@ @ @@@@@ @*@>@@>@2@@@@@@J@@@6@@@@R@@T@*@@@^@@j@@@@9@@`@@j@@b@ @@@@@@@l@`@@@@@@@@@@@@@2@@@@@@@@@@@2@ @n@@@2@@<@@@N@@@d@@n@@4@r@,@@.@.@@N@0@@|@L@@@t@X@@@@@@@@@@@z@@@.@@|@@@@@@@@@@@@@@@@`@@J@@T@0@@R@`@@@@@@0@^@>@@`@@x@@d@@@v@@x@@h@X@@@@@@@&@@D@@@@d@B@P@<@@<@>@R@@@@t@n@d@@@,@ @@@~@@@@@ @Z@@@@@@X@f@@:@1@@@i@p@@@@@Z@h@*@@|@2@@@`@r@@T@@x@h@B@H@z@@p@@r@D@.@N@8@@@@@@@@X@ @@@@@@@B@@@@R@@>@6@@2@"@@@@@@@@ @$@@@@@@@h@@@@@m@@@d@@@@@6@@@@d@v@V@>@Z@.@d@<@@@@@L@T@:@@ @@@@@@@T@h@@@@@.@2@@@@@b@@G@@@@@@@n@0@ @@ @@f@@@@@@@L@`@H@"@@8@@@^@ @@8@@@@@@@@@@@@@@@@@@@.@X@t@`@@*@n@&@"@@@@@@@v@D@@&@@f@@@ @\@ @@n@(@b@@K@@@@@z@@*@@@@@n@r@Z@n@@d@,@@@@@t@Z@d@6@ @@@@@@(@V@Z@@@@@@@@@\@E@@@@q@@@6@@@6@l@@r@,@@@@@@@@n@ @@@@@@@@@@@@@@@@@@@@@@@@@@@ @"@2@>@l@r@d@@L@@@F@@@@L@@:@4@@Z@@f@@@@@l@L@;@@$@@.@V@B@@@@@@j@@@b@@@@@@@@h@$@ @@@@@`@\@@@@@4@ @@|@D@@@@&@8@`@ @@@@@@r@@a@-@@@D@@@@@X@<@@@@@@|@@v@@@@@@@@@@@@@@@@@@@@:@@@@@@@@@$@H@@X@@B@^@@@ @8@~@@@*@d@@@6@@*@@@@@#@@@@@3@ @@@@@@@:@ @<@L@@@@@@@@@Z@R@:@@@@~@<@@@@@@@:@4@h@@@@*@@@@@@N@Z@@2@@@@@@@@@@j@@@@<@L@@@@T@@@@@@@@@@@@@@@@@@@@@@@@@B@@@@@r@@.@@@@\@z@@|@j@.@Z@@@p@j@<@@@@@@@v@@i@@@@@@@@@Z@@@v@@@l@@v@@@@@F@@@@@@@@@@@@|@@2@@ @@.@@8@@Z@@@@N@b@p@@@@,@V@l@M@@@1@Y@@@"@ @@@@@8@@@@<@@b@4@@@@@@@@@@@@@@@@@@@@@@ @@@0@$@@@$@@@@@>@*@6@&@d@ @~@@@.@@r@@.@@@x@@@@p@1@=@r@@@X@p@@@@~@@@@@@@@@,@@@@@@@@n@@@@@d@2@@@ @j@6@r@@@@@@<@N@@2@<@4@l@@X@S@%@@@X@4@@@"@@ @@@ @@@f@.@\@h@&@@@@@@@@@@@@@@@@@@@@@@@*@@F@@:@t@@@@@@@h@D@*@@6@(@Z@@@$@@@@@@@@T@@@@?@@J@9@@ @@@@@@@ @@4@ @@@p@*@@ @"@@@h@h@>@@@@T@T@@@.@^@H@@@@@@2@@@@H@@@@@@J@&@@@9@@@@@@j@@~@@@@N@`@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@N@:@b@@F@@@L@@@@l@,@:@h@@@ @ @@@@@@@@>@W@W@[@@@@@@l@@N@@@<@@@@@t@@@@@@@J@0@*@@@l@F@@@x@T@F@&@@t@.@z@@@@@@r@z@@@L@@,@@@F@w@@v@M@@@|@d@@@B@@@x@P@@@@@@@@@d@@ @@@@@@@@@@@@@@@@4@h@Z@:@@D@N@@@@8@@@h@@(@ @@@f@@@x@@@@@@@@@@b@f@8@@3@@@@@@z@@^@@@@L@@@@@^@D@ @H@&@@@^@$@@|@v@D@@@2@@@@@@d@@@V@@@@@@@$@@@j@@@n@/@p@@@@@P@@@^@@@@@@@@L@@@@@@@@@@@@@@@@@@@H@N@@,@X@@@B@8@>@@@@2@@,@@>@@@@@@@@.@P@j@@&@@@@@@@@$@l@@^@@&@@@@@r@@t@b@F@@@@T@X@P@@T@@@@Z@@@@\@$@@,@@@@@@r@@@@@@@@,@@ @(@@@@@T@@\@@p@|@@@b@@d@@@@@@@@@@@@@@4@@@@@@@@@@@@b@d@H@@<@@@H@*@"@ @@@@@@@@@@@@@@@@@>@@@~@@+@6@@@@@@2@@@x@@P@h@@&@@@&@@@D@L@@@@z@v@b@$@@@"@@@p@@.@4@@@@@@d@@@@@@@T@@@.@d@@V@@i@@@@P@@@@T@@^@@D@@@\@@@@@@@@@@@@@@@@@@@@@@@@p@@@l@@@@<@H@F@,@>@h@@X@@@@@@@@@@>@L@*@d@b@j@@@@@x@6@@<@d@0@0@l@n@@&@@@@@@@2@B@R@@@@P@@>@@@J@@@@F@(@:@t@@@P@@@@@@0@R@@@@@@@@@@v@@@@@2@@@@@l@d@@@6@@@0@@@@@@@@@@z@(@@@@@@@@@@@@l@@`@@@@@@@@H@@r@T@@F@@@l@@@@@N@@@@@X@@.@@@g@@@@@@@@@L@@r@.@,@f@@d@,@R@@@@@@@Z@@@<@@h@@@@@L@j@F@@@@>@@X@@@@@@@@@8@R@h@@@2@-@~@ @@P@@]@8@@@@@@@@@@@@@&@@@@@@@@@@@@@@@@@J@@$@@@@t@@@@@@@@@^@@@@@@@@@^@0@@@L@L@@X@"@@R@@*@@@@f@4@@@@V@.@@@@@@4@d@@@@ @@0@@~@t@@@V@ @@@R@8@@@@@@@f@@@@@h@"@@@@@@@>@@@t@@S@@@@@@|@@j@@@@@@@*@D@@@@@@@@@@@@"@@@:@L@@ @@(@@@\@@@@@@@@f@ @@@@@0@J@@@@@@6@@@@@@@@@@@^@*@@p@L@,@F@H@@@`@@J@@j@@@@@@F@(@@l@@@@@F@@@@j@t@@@@@@@@@.@H@T@@@~@6@@F@0@x@&@@A@@:@@@@i@@f@@ @f@@@@@@@@ @:@@@@@@@@@@ @@T@V@@:@@@@@n@@@@`@v@@@@ @@J@d@@@$@r@P@$@v@@@@F@@4@@@@@@@@P@@@b@h@N@J@@@@@@@@p@@@@:@6@b@@@v@,@@|@@@L@2@@@@@`@@@@@ @`@ @@@@@L@z@~@@@@*@@@@\@@@@@s@h@@@x@@@@@@@@@2@@@@@@@@@@@.@@@b@@@H@@@R@@^@P@N@@@@^@@@l@@@X@@@@<@@t@@@<@@N@@@>@d@:@@"@@@@:@@@&@ @@@@@N@G@(@@ @@<@p@@@@V@@@8@@b@B@@@@@@@@@l@x@@@@@@<@@.@@@@@t@@@v@@@@@@@@@@@ @@f@0@,@@@@@@@@@@@@@@@@^@`@@@@@p@@j@@@@@ @n@@b@p@@@@@@@@@z@F@@j@d@d@@@@@r@r@B@X@B@@@@@@@@@@>@@@@@@-@@@@@D@4@j@@@@@D@@r@@@@X@@@@@z@~@@@$@@t@@@@@@B@H@@@ @$@@X@@@@@S@p@@@@@@@@@<@@j@@@@@@@@@@@4@.@@@@@@@@\@@4@D@@@@P@D@@@@@X@@z@ @@@@X@@@x@"@@@B@@@@B@@@L@@@@@v@@"@@x@@@ @@@@;@@x@@s@i@x@@@@^@@(@@`@@@x@@@@@r@f@@@@8@b@@@@V@`@8@@@@@H@@P@@@r@@@_@,@@=@@@^@J@z@@^@,@ @@@@@@@@@@@@t@|@@@@@@@@@@@@R@r@@,@@@@@@j@@0@@@@@8@n@@h@@@@@>@t@@T@$@@@@@H@@@@b@@@*@@@@@"@@ @ @@d@@b@@@@@^@@@\@`@@@@@@\@@@ @@@@$@x@@.@^@@P@@\@d@h@@{@d@@@@g@@y@@@@z@r@|@ @l@@@@Z@ @@@@@ @R@p@@V@@z@@@@|@@@@@@@~@|@@Z@@@R@@@F@@@@@@@@@2@@@@~@@@x@t@p@@@v@@@6@@@@@@(@2@@$@@@@>@@@@J@@@@@@@B@@@B@@@@F@@@@F@>@@@@J@@@0@@@@D@d@"@@@@@@w@@@@@<@@@@h@@@@@>@@L@@@6@0@@@@@@@|@8@@@R@0@@6@x@@X@@@@@@@@@d@@@Z@@@@d@@6@@@@@*@@@f@V@l@@4@@<@@@@D@@H@.@|@4@`@z@@0@@\@@=@U@@@ @)@5@T@@@X@0@@@^@@|@z@ @@@@Z@V@@@@d@@@z@@@@J@:@t@@j@@@@:@@@@9@@]@*@@@n@@8@@@@f@2@@J@@@@@@@@N@@@B@ @J@ @@@@B@@&@@@:@@@f@r@P@@@@@2@x@@@@~@@@@@@F@@ @@@@r@@@@@@@@@@@@@J@@J@X@n@;@{@`@r@@@@H@@@D@@@@d@@x@V@@@@@`@V@@@@@@h@@@@B@@@@ @@@p@@@@@)@@L@-@@B@@z@@@@@@\@u@@@F@@@<@@8@@@@ @@@`@@P@,@@@@&@x@0@@@@@@j@~@@B@R@@@@b@@@@@B@@|@@^@r@ @8@@ @@@@4@@@r@@@@@`@@*@@@@S@@@@1@@@@@@@@@|@@@l@@@@(@d@\@@$@ @@d@@@,@@z@@@(@@6@r@@|@N@@@@@R@M@@@~@@@@@@?@@@Z@@B@6@@@@@ @@r@H@@@@r@@@8@@@@ @@@@@@@~@n@@\@8@p@@j@@@@@l@x@@@ @N@`@@@@@$@@@F@@@@@@@@@@R@8@X@@l@9@F@3@@@@@@@@@@&@@@8@D@@@@@T@d@@&@:@@@@@@@@@@@@@F@@@\@@@@@:@@<@<@@@@@@ @@@x@@@j@4@B@p@@@@@@@p@@@@@@@@@@@@@x@|@j@@@@@"@f@ @F@@%@@z@@@@@@@$@F@r@4@`@@@6@@@0@@@@ @@@@@@@e@@t@@v@@F@\@>@@@@r@@@@@2@D@@@@@B@>@@@@@@@@@ @@j@@=@9@r@9@@@X@@@@O@&@Y@@(@@@@J@f@@v@@@|@@\@ @@"@P@j@@S@c@@@@L@@z@P@@(@@J@@@6@B@@v@@6@@L@,@>@@Z@@L@@@5@.@@@@n@@@ @@F@\@@ @@@n@@@@h@@@|@:@@@@;@@@@V@2@(@N@@@@N@"@,@@@@@D@F@@@@@L@f@@@@`@@@`@z@@@@@@@@@!@Y@@X@@|@=@@ @@2@@<@@t@@@@@@@@@X@@@@@@h@@@p@>@p@@@@ @@@@f@ @@0@`@@@@@@@P@@6@@@@@-@@@ @@S@%@@@z@t@@@@@@@d@"@@p@@@@0@@@a@F@@@@^@@"@j@X@r@@@@D@:@"@@@@@@@B@<@@&@@@@@@@@@@@@*@@@@@@8@1@@@@:@B@t@@@@@R@@@!@@@@@V@ @@@x@@.@@|@:@|@@@@@@p@@@@d@@x@r@@@r@@2@@@@@x@@B@@k@@=@@@@@@@@@:@f@@@@Z@"@@ @@r@P@<@y@@@@@@@\@N@ @@@@@@p@V@*@.@@@@@p@@@<@F@x@@@^@@@@@@@@@<@@2@@}@@,@@7@@@\@@@@@@@@@@@@@@@@D@@@@@ @^@@@@<@@z@@@ @@@@<@t@@R@\@t@@@@`@@Z@>@@@@&@@@@@@@t@o@@>@*@ @@@@@@*@@@@`@^@@z@@@m@@:@@v@@8@@@@@@j@0@>@@@@@@l@`@Z@@@@:@@@Z@@:@@h@@@P@`@@ @&@H@h@.@8@@X@@@@@@v@@T@:@d@\@@:@t@@@n@@B@@@@@@@@@@@N@~@@@@@*@@h@@@n@B@z@j@@@@@@@@@(@@$@T@ @@g@D@@@@Z@@@@@@@B@$@@@0@@8@~@@@@@@@|@@@@6@@@@n@b@>@@@@@@@@P@B@B@@@B@z@@>@@@p@@@@@@@@D@@R@@@@@7@@@@@>@&@@4@6@X@@@@@W@Z@t@@D@@@@@<@@@@@j@@@0@@@@@v@$@@@6@N@`@n@@@@"@z@@b@@@@@@@@@@@J@@@@@@@~@,@B@ @@ @Z@p@@@\@d@@@f@z@,@`@@@@@@,@J@@@@@@@t@@R@D@:@@Z@8@@@6@@B@@@@@@@@<@@@ @r@@@@@b@@t@@@@<@d@X@@b@@B@@@@@@D@2@@@@B@@@@@@n@@R@@@@L@2@.@@@R@r@|@h@@@@@T@@@@H@@@@@A@6@1@@@@v@v@@@@x@@|@@@"@@@d@@0@L@@n@@d@@8@&@D@@@z@"@@@@@@@@|@R@N@,@0@@H@^@@@8@@(@J@R@d@z@@@$@v@z@Z@0@@L@6@@@@@@@@@4@@@@@j@R@@@@@,@j@h@@@@n@$@@@@@*@@@@@@@@L@@@@:@P@@d@@n@@@@@d@@+@@u@ @9@V@@K@A@@f@X@@@@@@P@@@@z@@@@(@*@$@@@~@@j@@ @@^@j@:@@@@@z@t@n@J@@<@@ @@@ @@@"@@@@:@z@@@@@@@~@@@@ @@d@@@8@@|@@@@@@@@@@~@T@@&@@@X@>@*@@<@@@@@@h@@@@@@@@.@@j@<@2@|@X@p@v@@@@4@@@8@@h@p@@@~@@@@t@@6@@&@@@n@@H@@n@@@@<@@@@P@<@@@@h@@@@T@:@@@@@@t@L@@D@2@<@@(@:@@@@@@ @@&@8@@@"@@@@@@@@@@@.@@T@@@@t@R@4@@@@.@@(@@@@v@t@P@\@@B@$@@@@@@@@F@@J@~@@@@h@R@>@@H@J@T@x@x@@@r@>@4@@@@&@@@@H@@B@t@<@@@@@d@4@@@>@L@@L@@>@J@ @@@0@@@@@@p@2@(@@@@@@p@:@@@(@@@L@*@b@@@@@T@h@z@@N@@@@@@@@@@6@L@@v@d@@@@h@z@@@@@@@@@R@6@@@@@@F@^@t@P@@@@8@0@@@r@@@@@D@@@@@h@>@@*@R@L@@*@@H@@@@@>@@R@@N@<@v@@@|@@@@@@@@@@@@<@@,@ @@@@@T@X@@@@@x@$@@@@@@@Z@@@<@:@@@@@@f@@@@@@n@4@2@R@@+@@B@@z@@@4@@@0@v@@p@,@@@@"@@v@4@@.@@@@@@@@P@d@n@~@R@@@@H@@0@@@@@@@@@@l@@@@>@2@\@t@p@@@@8@@@@b@@@2@ @ @@<@@$@@H@@@v@@L@@@@@|@@ @@@X@@@@@@|@@@6@Z@@@@~@@<@<@Z@"@@@@@@B@@@R@@@@@@@@@@@@@d@@r@@ @^@@F@T@@@&@L@@@@H@Z@^@@@&@@j@.@L@2@F@V@d@V@@ @@@@ @@@0@@@@@6@z@@@B@ @>@8@@@x@@@&@@>@@@@l@@@@z@@@~@@X@@@@@2@@@@:@@@@@@@@@@@@^@4@@n@B@@@@@f@t@H@X@(@@@@@@<@@@~@@@@@@0@@@@@R@@@(@@@@@@|@@R@@@,@8@@@@@@@@,@@n@p@b@N@^@~@|@T@8@@@@t@(@V@>@ @@(@@@(@@@r@@j@N@b@H@t@@@@@2@@@@@x@@8@@@v@j@@@8@@j@@@@R@@@@L@f@@@@@@2@@@@V@@@@r@H@@@@x@@F@<@@@4@@,@l@@@@@@N@z@~@@@@R@@@@ @@@@b@R@@@ @@@(@@@>@$@Z@@@@f@@$@@b@@@ @B@P@,@@@h@8@Z@@@@@@@@H@@V@f@@ @N@ @t@\@x@D@0@@@@h@@@@@0@|@@@@@P@`@T@@H@@<@@^@\@.@@@@4@D@J@P@@@<@@@@@@(@@@x@v@J@@@@r@x@V@\@:@@$@@@@@(@v@@ @@>@@@@.@@@@N@@\@v@@@@@@@@B@@l@ @@@N@@@@@@D@@`@j@&@<@@"@,@n@X@2@<@`@@@@@@@@@(@@V@@@8@x@`@^@@z@@@t@@@@T@L@@8@@@@n@4@\@@@@`@p@:@@@x@@@@@@H@D@*@:@@@@@*@@@@F@,@ @@@@@z@>@V@H@@@@b@@@ @F@n@@@@@@@@@@n@f@B@@@@@@8@l@F@@V@@@@@@b@J@@@@d@@L@L@ @@&@2@ @@@@,@H@j@@^@@@@@@@@@$@@@@@@@r@@@@@D@V@@ @D@@h@0@@@@F@:@@j@@@@@ @@@N@@@@@@d@B@H@@@@@@z@@@d@V@@0@@@@@@T@h@T@4@@,@@@@@@\@@@@@P@@@L@@@@@@p@@ @h@@$@@ @@@@@@.@h@@@@@b@@@@@@b@@J@t@p@@@@@@@@.@@d@@@@@@<@$@8@d@@@@b@8@@@@@(@@@Z@@@x@(@h@l@`@4@@@j@@@@@x@@n@B@B@@,@@v@@X@@@@@@@$@@d@P@:@@ @@@@@r@P@.@J@@@@@@@@F@H@@@@@@@N@@ @@B@@\@@@@@@6@@@@@@&@`@D@@@@@b@@@^@r@~@@X@@@@@@@@@@@(@@@@@@@D@@@@\@@@@z@@@@@@@l@`@@@@2@@@.@4@J@T@*@@~@@<@@@@P@"@@@@@@@0@.@@@@@@l@@@@@@@@h@l@B@8@.@ @@ @Z@~@@@@@r@@@v@@@@@@8@R@@@@H@f@@@@@(@@$@,@@@@@@*@@@z@Z@Z@r@@@@@D@>@@0@V@@@@@@@@@@@ @J@@@@@J@@@@@@@@@@x@f@@4@@@@@@:@@&@B@@@@@@@@>@@@H@j@@@L@@@@8@@@@@B@,@@@@@@@J@r@H@L@8@@@ @R@@h@@@@`@@@@@@@@<@T@<@^@@~@X@@O@p@@H@^@0@$@j@@@t@:@x@2@@@l@h@@@,@@,@@@@@@@x@>@@@@>@@@@@@@@ @(@8@@&@@`@,@ @@@@@4@@@2@f@@@@,@@@&@`@V@@~@@@@@B@@@@~@j@d@@&@@@:@@@@z@P@"@@@@@@r@n@x@h@>@4@@@@X@z@~@@@$@@@@@@@@@,@j@<@@@@'@@H@@@@@@@<@@2@n@J@@@@@\@T@@@P@H@&@@h@@T@@@t@@@@T@H@@B@@@@@@x@x@N@@@@@ @@X@d@h@L@@@@@@>@:@v@@@6@@@@@P@@@h@@@@ @@@@@@>@@@@@@@@L@@@@@@z@@~@`@Z@,@@*@.@@@,@^@n@@@@|@|@@4@^@@@:@ @B@~@@@@@@ @@U@@@@@@@@@~@@@@v@@@@@N@X@F@Z@@@@@@@@@6@ @N@p@@*@P@0@v@>@T@P@@@@ @@@@@^@4@v@H@V@R@@D@@@@T@8@@@ @^@@@@@@@|@b@@@P@@F@N@@"@@l@@@8@@@@@@@@d@P@V@$@$@@@@@@@b@x@@@@@L@x@@@@@@,@H@x@,@@@@@?@@@@`@6@@@@0@@@@@@@@@t@@@P@v@v@L@@@@@p@V@z@ @@@r@@@@@@@@@@&@ @@@8@@@"@@@@@,@@@@^@@@h@@"@>@x@@@@8@l@`@@@@@@@z@0@@(@@z@@L@@@@@@@@@d@2@N@*@0@T@"@@@@`@P@@@@2@ @p@@@@@H@@@6@b@@@^@l@A@@@@@@.@@d@~@>@.@0@@ @@h@@@@t@@&@^@@@@l@$@J@X@@V@@@@@4@$@ @4@"@@ @H@.@<@@n@@@@@@@@@@@F@@@r@R@^@@0@@F@@@@@@v@^@x@.@@@@@@@@@@@Z@@V@,@@@@@@@@n@B@l@$@0@<@@@@@<@h@z@@@ @*@@ @@@@@@@@@R@@@}@J@@@&@n@@@@(@ @>@L@"@@@@@J@l@@Z@@@@6@@ @8@<@@@@:@l@D@l@@@@@@L@V@@@@@@2@@0@@Z@@@@@@&@@@z@Z@@@@4@@@r@@@@@@@@N@@@T@t@^@L@@F@"@@j@:@@@@@@@x@f@F@b@(@2@2@@@@@<@6@@@@6@@`@@@@j@@@v@@@@@H@@@@@2@@@`@"@0@@8@@l@z@f@@0@@h@6@@@H@@@@@@@@@@@@D@.@d@@@@P@@J@>@@@@@@@@p@|@l@Z@@6@@@0@@@@@@@@@0@@H@~@x@@@@@@@0@@h@@@N@@@@^@.@@@@@@@@Z@d@<@:@&@@@@@@@@ @b@@@ @ @$@~@Z@@@@@@.@@@@@t@~@ @@@,@O@@@@@\@@j@l@l@@@@@@@@@@@@@0@@@@@z@@f@@:@@@z@@@@B@@@@(@6@@@@@@$@@@@@r@J@@@@@@@@@@:@@@@j@@@@@0@@@@@@V@<@@@@8@$@@@@@@@@Z@f@6@R@ @@<@@@@@@@B@r@x@@@@@@N@@@@@l@T@D@@@@@@@/@A@s@@V@@@v@@@@@@@@@8@@@@@@.@@8@@@@$@@@@@^@L@@@r@&@@@@`@B@@@@p@@@@@@b@@@@d@@@@@@@T@@@@t@H@~@@(@@8@@@@@@@R@@`@Z@&@@@@@@@@r@n@^@H@(@>@*@$@@@@@ @@*@(@<@F@@@@@V@@@@@D@@@@@@@:@V@@g@@@`@B@@@@ @@@@l@ @@R@F@@6@.@t@@@(@D@@@@Z@J@\@@@@,@,@$@,@@@ @L@p@4@@L@@D@b@@@T@b@@@@X@l@h@@@$@@@~@T@.@`@@@@@v@>@@@@z@@"@@:@V@@ @@@@@@@n@d@N@@8@ @@@@@@@@@@z@@@@T@p@@@@@ @@@@6@P@@ @@t@@b@M@L@@@@$@J@@@@<@@@|@Z@4@v@x@B@@@@@@@@@@@J@@@@@@ @@@ @@@x@@@P@@H@@.@(@2@F@@@@@ @@@j@v@@@@@2@$@@@@@@@@f@@@@@@@@L@$@>@@@@@@@v@@V@X@R@0@&@@"@@@@@@@@@@@@@H@x@@@@@@@@@@~@@@x@@@3@]@k@@@@j@,@@B@v@@@@~@@@.@x@@@@@@@P@@6@@P@@@@@@@@:@@@j@n@V@@@@6@@@@@4@P@@@@@R@t@2@*@@P@J@@t@Z@@@@@@Z@@@t@@@t@@@@N@,@@@@@@@@\@\@p@<@2@&@L@@ @ @@@@@@@@@@$@@6@P@T@~@@@6@.@@@@v@@@Z@ @V@z@@@@@@@|@B@@<@|@Z@@@@@@^@6@r@@@H@@@@@@n@"@@@@<@n@@@@ @R@@.@@@2@@@@@@ @@T@@v@@l@@<@4@b@~@@$@H@X@`@b@@l@@@F@@p@@f@@@@@,@@,@@@@@@p@x@@V@:@$@.@:@@*@ @ @@@@@@@@@@@0@@R@l@@@@@@0@*@x@@@@*@@@@@@@@>@V@@@n@@|@@@`@@f@@X@$@"@6@>@*@@:@@@@@v@@@@@@@4@,@@F@N@\@@@@H@@@@@@ @@@d@@@x@@@b@"@@@@T@:@ @@9@@n@@ @@H@ @@l@F@ @.@@@@@~@@h@J@f@D@6@$@(@@@@@@@@@@@@@@6@@(@H@8@^@@v@@@@@@D@@@z@@@:@@,@R@@(@J@@:@@7@2@:@@@@@@2@x@@ @@@@@x@@~@@P@F@@B@@@@ @@@@@@@@ @@@:@j@&@@@@@@@@R@L@ @8@@$@R@V@@@@@U@<@@.@@T@@r@@@@@@@@@@|@z@^@d@:@8@P@@ @@@@@@@@@@@@@@@@@@@@&@H@8@@@@@@@ @6@N@@@@@Z@@@r@@@@@@@(@@z@n@@>@@@@\@@8@N@@6@~@d@@4@z@V@@@@|@@@@D@@@@@@ @&@@@j@2@D@6@.@>@0@@@ @4@F@@2@@@@L@@@@@@,@"@@@`@&@@@@@@@@@@@p@@z@F@f@6@>@B@@@2@&@@@@@@@@@@@@@@@@@ @@2@@,@p@d@`@@@@@H@|@>@b@@@@@*@@D@D@0@4@r@@Z@@D@@v@Z@"@@&@@@T@@T@2@&@@@@@@ @@B@p@@R@J@@,@@@@4@@@ @ @@J@0@@&@@@N@ @J@@.@@@@@@@6@@@f@@j@ @@z@:@P@@@@@@t@R@l@(@Z@(@ @@*@@@ @@@@@@@@@@@@@@@@@@@$@(@@b@J@@@@@@2@n@4@X@@J@@@@@@@,@@@(@d@0@@@&@6@<@@@@"@@@@2@x@@@@@@@@@.@,@@@@@@J@&@V@@4@@&@*@l@<@@@@8@$@&@x@$@\@Q@@@@@@\@@@@@b@@@4@@@@@@@@h@Z@<@R@f@8@@*@@@@ @@@@@@@@@@@@@@@@@@@@@@8@@F@v@h@@@@@@@@&@L@\@P@~@@@x@x@@(@2@4@H@&@p@@@X@@2@@@@@@v@@@@@@ @@*@F@2@`@@@@4@*@@@@@@:@@(@@@^@D@b@@\@f@@\@@>@I@@@X@@@0@@@@|@r@,@@@@@@@x@@2@Z@J@(@4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@j@^@@p@|@@@@@@(@$@@N@T@h@b@x@@@@@f@ @E@@@@@@@J@*@H@@@@8@@@@@@H@D@@6@@@@@@@@ @@@*@@@ @R@$@@D@j@@@@@@j@T@@@N@$@@@@@j@@@ @@@@@@v@p@`@j@J@@@.@@.@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@&@@@D@4@p@j@^@t@N@@@@@@@ @@4@@@@@ @X@,@$@@@@@@@@t@@~@@@@@6@@@@@@@ @@ @F@b@F@*@$@:@@d@@@ @l@@@R@j@@@8@@@&@H@@2@@@$@@n@.@@@X@v@.@@@@@@Z@@J@4@d@<@:@2@@P@@ @@@@@@@@@@@@@@t@@@@@@@@@@t@@@@@@@@ @6@2@H@6@N@r@f@@@@@@@4@@z@@@,@@F@@@.@@@[@@@&@2@@^@@x@6@@l@@@P@&@@J@|@(@J@"@*@R@.@P@x@j@`@^@@X@@@@f@@@@n@~@@Z@ @@L@@@~@&@@@@@@@d@@R@v@0@D@<@@@"@@@@@@@@@@@@@@@@@t@@x@@@@@@@@@@@@@@@@@$@@@P@V@8@p@b@@@@@@@ @@b@@L@6@@X@@^@@@@@@@@@@.@@@^@v@@@@`@6@j@v@@@T@F@@@@@@@p@@@@@p@@f@.@@>@f@v@@@j@@R@@D@@@@@@@@T@\@t@@@L@D@@@@@ @@@&@@@@@@@@@@@@@@p@p@r@@@|@@@@@@@@@@@@@@@@@(@@*@.@.@h@x@n@@@@@@H@J@@@r@@.@@4@#@@I@@@@@b@:@0@@N@B@@@@@@@@@@(@$@N@\@b@@@@K@*@ @@^@@@@4@@P@@@@@@@@@8@2@@@@@@~@J@Z@p@D@F@8@$@$@&@@@@@,@@@@@@@@@@@@@@@r@t@n@|@@~@@@@@@@@@@@@@@@@@@@@@@H@0@0@B@N@@@@@N@b@@@,@"@v@j@@+@b@z@@@^@@@@z@@@@@B@"@@@@W@@m@\@@@@@G@,@"@@@@b@Z@"@@L@@@L@\@f@$@D@n@ @ @@@@@@p@B@R@@@<@ @6@@@@@@@@@@@@@@@@@@@@@@@~@|@@@x@@@@@@@@@@@@@@@@@@@@ @@@@.@.@F@f@@@@2@2@ @\@F@@@x@t@@@X@`@@F@&@@@<@@@d@N@@@@\@l@<@@@V@@8@"@@Z@@@@,@@r@@@<@^@@@@D@@@@@@ @@@@@@l@|@L@L@P@6@6@(@0@*@@ @@@@@@@@@@@@@@@@@@@@@t@r@n@v@z@@@@@@@@@@@@@@@@@@@@@@@@@@8@ @T@~@n@@@@@@L@R@@@@@|@@@@@D@X@@@@@@@@|@@@@"@p@@@@F@@2@@h@@@<@@6@@@@@6@,@ @@@@@@@@@r@`@f@x@l@0@@$@0@@@ @@@@@@@@@@@@@@@@@@@@@@@d@~@x@@z@x@|@|@t@@@@@z@@@@@@@@@@@@@@@@@H@&@6@T@8@b@n@@@@@@@f@@@l@@@r@<@J@@@~@@@^@@@@@R@x@@Z@`@,@n@6@L@B@J@@@@&@,@p@:@@@B@"@,@@@@@@@@@@@V@l@6@,@T@*@,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@f@l@r@z@|@@@t@@@@@@@@@@@@@@@@@@@@@@@ @@$@N@D@L@n@l@@@@4@@X@L@@t@B@@@@@@Z@@X@4@j@X@.@@@@d@@h@p@ @@@@@@f@@@@@@b@ @@@@@@@@@~@p@`@l@h@f@d@J@R@F@4@H@@@@ @ @@@ @@@@@@@@@@@@@@@@@@@@h@n@l@p@p@r@l@z@@@@@@@@v@@@@@@@@@@@@@@@@@@@@ @:@6@Z@>@@@@@@@@@@@@@@@@@@@@@@"@0@@@@@b@ @4@8@@@@@@@&@@@@@@@~@r@h@d@2@f@$@:@4@@,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@t@n@v@p@x@v@z@@x@@@@@@@z@@@@@@@@@@@@@@@@@@@@@&@&@d@^@z@@x@p@@@@l@@@\@@@@@@@@@@@@@@@"@,@(@@@@@@@@@@@@@@@@Z@d@T@l@2@P@.@8@@@$@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@x@h@X@r@h@t@@f@|@~@v@z@z@p@@x@@z@p@@@@@@@@@@@@@@@@@ @@@>@.@P@b@:@T@D@X@n@D@h@h@B@v@|@@@@@|@@@@@@@@@@@@@@@@@~@~@@x@@@@@Z@z@^@ @<@L@:@b@<@$@(@ @@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@^@h@V@t@T@n@~@f@n@n@h@z@n@b@n@r@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@.@8@"@P@F@N@X@0@@@`@f@f@l@@d@F@Z@@t@|@|@@@@^@d@V@>@f@R@X@P@@b@4@<@<@"@@$@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@^@d@R@v@x@n@v@x@h@~@t@|@t@@@@@@|@@@@@@@@@@@@@@@@@@@@@@@ @@(@$@@F@4@@V@8@B@R@L@r@>@n@f@L@<@b@h@|@T@L@@^@`@@|@x@X@z@P@L@>@H@*@p@6@P@X@>@.@2@@ @@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@h@v@Z@x@b@d@@X@h@p@b@d@f@f@@x@~@@n@@r@@@n@@@@@@@@@@@@@@@@@@@@ @@@@@@@ @@@ @>@@@F@$@*@@,@.@ @0@4@J@:@*@J@2@D@&@V@@@2@@@B@@@@@@@@ @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@X@`@j@j@^@V@^@b@t@`@d@h@^@n@v@r@r@@n@@@x@@x@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"@@@&@(@@@@@@@<@"@@@@&@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@P@X@^@r@\@l@t@\@n@^@r@n@p@n@j@t@n@x@j@|@p@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@2@ @@2@4@@(@8@0@4@@F@@&@@8@0@@@:@@@$@@$@ @ @"@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@X@J@^@Z@D@Z@f@`@d@N@T@\@X@\@v@l@~@p@p@t@d@@~@|@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L@f@T@X@f@`@b@R@\@n@\@n@f@h@r@X@r@n@n@t@x@n@|@r@@@r@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@F@F@R@Z@T@H@P@\@^@Z@^@V@X@j@@d@t@t@`@v@n@z@@t@@@@@@@@@@@z@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@sunpy-0.8.3/sunpy/data/test/EIT/efz20040301.010016_s.fits0000644000175000001440000042350013203275053021112 0ustar nabil00000000000000SIMPLE = T / conforms to FITS standard BITPIX = -64 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 128 NAXIS2 = 128 DATE = '2004-03-01' / Date of file creation TIME-OBS= '01:00:16' / DATE-OBS= '2004-03-01T01:00:16.178' / UTC at spacecraft ORIGIN = 'Rocket Science' / Rocket Science = NASA GSFC DATASRC = 'LZ file ' / TELESCOP= 'SOHO' / INSTRUME= 'EIT' / OBJECT = 'full FOV' / BUNIT = 'counts / pixel ' / WAVELNTH= 171 / 171 = Fe IX/X, 195 = Fe XII, / 284 = Fe XV, 304 = He II FILTER = 'Al +1 ' / DATE_OBS= '2004-03-01T01:00:16.178Z' / SCI_OBJ = 'FULL SUN 171/284/195/304 ' / OBS_PROG= '171_5_284_90_195_10_304_30_AL_1.000 ' / CMP_NO = 1 / Unique campaign instance (1 = synoptic) EXPTIME = 7.597 / s (total commanded + shutter close) EXPMODE = 'backside ' / FILENAME= 'efz20040301.010016' / CFTEMP = -66.71 / CCD cold finger temperature (C) CCDTEMP = 7.34 / CCD temperature (DN/100) CTYPE1 = 'Solar-X ' / CTYPE2 = 'Solar-Y ' / CRPIX1 = 64.5 / Sun center x, EIT pixels CRPIX2 = 64.5 / Sun center y, EIT pixels CRVAL1 = 0.00 / CRVAL2 = 0.00 / CDELT1 = 2.63 / Pixel scale x (arc sec, fixed) CDELT2 = 2.63 / Pixel scale y (arc sec, fixed) SOLAR_R = 372.27 / Solar photospheric radius, EIT pixels SOLAR_B0= -7.22 / Degrees SC_X0 = 0.00 / s/c yaw (arc sec) SC_Y0 = 0.00 / s/c pitch (arc sec; -109.14 after 1996/04/16) SC_ROLL = 180.00 / s/c roll (deg., Solar north + CCW from nominal)HEC_X = -139130208.00 / s/c heliocentric ecliptic x (km) HEC_Y = 46576272.00 / s/c heliocentric ecliptic y (km) HEC_Z = -94896.31 / s/c heliocentric ecliptic z (km) CAR_ROT = 2013.00 / Carrington rotation at earth COMMENT CORRECTED DATE_OBS = '2004-03-01T00:58:29.646Z' COMMENT COMMANDED EXPOSURE TIME = 5.000 s COMMENT SHUTTER CLOSE TIME = 2.597 s COMMENT LINE_SYNC = 'no' COMMENT CAMERA_ERR = 'no' COMMENT IMAGE_OF_SEQ = 0 COMMENT READOUT PORT = 'B' COMMENT NUM_LEB_PROC = 3 COMMENT LEB_PROC = 26 (no ROI) COMMENT LEB_PROC = 27 (no occ mask) COMMENT LEB_PROC = 12 (Rice) COMMENT BLOCKS_HORZ = 32 COMMENT BLOCKS_VERT = 32 COMMENT P1_X = 1 COMMENT P2_X = 1024 COMMENT P1_Y = 20 COMMENT P2_Y = 1043 COMMENT N_MISSING_BLOCKS = 1 HISTORY Version 4.0, 2001 December 10 HISTORY Image linear resampled to (128,128) for SunPy END @@@@@@@@@@@@@@@@@@@@@@$@ @@@@$@@@,@$@@@@@@@@d@@@2@"@,@0@(@6@@4@0@R@8@4@&@J@B@D@Z@,@B@V@@^@"@@@(@N@"@@"@&@@@B@@@@@ @ @@@@@@@@@@@@@@@@@@@|@@@@@~@x@@@z@f@n@n@l@f@|@p@f@h@n@p@V@h@Z@`@Z@h@^@j@l@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@ @@&@@@@&@@@@0@$@@@0@0@R@.@F@P@<@<@@0@r@*@J@<@$@B@*@$@@@(@@"@@6@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@~@@z@|@v@v@t@l@@x@l@z@v@b@b@Z@r@d@h@T@T@T@h@^@Z@^@X@d@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@ @@@@*@@*@2@R@@@2@0@>@@h@<@&@:@ @H@V@&@T@:@L@:@V@D@p@&@n@0@.@j@4@4@@@@B@"@@R@@@@@&@@@@@@@@@@@@@@@@@@@@@@@@~@@@v@|@~@x@l@|@v@n@@X@b@b@d@T@\@T@\@^@L@h@Z@X@\@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ @ @@@@@@"@B@@(@@D@6@(@:@>@<@@@.@<@0@~@@L@R@J@j@@@Z@p@.@H@B@>@~@<@8@h@6@@@@@@<@*@"@8@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@~@p@l@~@@z@t@p@t@j@z@r@X@N@^@b@N@f@b@j@p@`@@@@@@@@@@@@@@@@@@@@@@ @@@@@ @@@@>@.@@@,@@"@0@V@$@H@:@(@0@B@6@l@N@J@L@@D@d@"@|@Z@V@f@J@z@@j@v@X@X@j@,@T@@@<@L@"@8@<@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@~@@|@v@r@x@v@z@r@l@n@l@f@n@d@X@T@h@b@\@d@^@\@`@@@@@@@@@@@@@@@@@@@@ @@@,@@@"@.@@@ @>@2@.@H@H@H@D@,@J@t@H@L@T@^@x@l@v@~@z@j@D@d@@\@@d@`@@v@@@n@@|@@@v@j@d@8@r@R@F@^@,@"@"@ @>@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@|@@@p@|@n@@n@z@d@t@b@d@N@l@`@X@^@^@^@b@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0@0@,@0@6@ @4@8@Z@,@0@V@L@R@J@h@~@@l@\@L@n@l@d@@p@~@@h@@@@@@@@@|@|@N@n@\@\@V@T@^@V@"@$@@@6@@@@@ @@@@@@@@@@@@@@@@@@@@@x@t@r@@t@j@x@@z@t@f@j@p@n@b@^@V@b@`@f@\@@@@@@@@@@@@ @@@@@@@ @@@@@ @@ @&@@@@:@D@B@4@R@`@D@2@j@T@@T@l@x@@x@@@@@@@@@@@@@@@ @@@@@@@@@@@@n@@r@P@r@>@~@@@0@@@@:@@@@@@@@@@@@@@@@@@@@@|@@@@~@|@@x@x@|@j@r@p@^@f@h@^@h@x@^@P@X@j@l@@@@@@@@@@@ @ @@@@ @@@@@@ @F@@@@@ @@J@(@P@F@:@N@4@H@T@j@l@\@f@D@@@@@@@@@@@@@@@@@@@@`@&@@^@0@@@@@@@@@@@X@@\@6@N@@L@<@,@0@@@@@@@@@@@@@@@@@@@@x@@@x@x@z@|@x@`@n@|@`@n@|@l@^@X@n@b@l@x@J@@@@@@$@@@@@@@@@@@@ @@@ @$@@$@@@2@&@@@R@"@6@6@4@.@>@6@Z@^@h@h@J@z@x@l@@@@@@@@@@@@@@8@,@@:@`@`@@@ @@@@@@@@@@@@j@H@`@J@<@8@@4@@@@@@@@@@@@@@@@@@@@@v@@@~@@@|@p@l@x@d@z@l@p@p@\@R@x@p@n@d@@@@@@@@@@@ @@ @@@@@@@8@ @ @0@@"@@:@J@@4@d@^@8@V@V@N@L@J@@t@h@@@@@@@@@@@@@@D@@:@@@b@d@N@@@@@|@p@d@@8@@@@@@@@@@@@j@L@R@B@@8@@2@@@@@@@@@@@@@@@@@@@@|@z@v@@@|@r@@l@p@h@f@v@p@Z@V@h@~@Z@@@ @@@@@@@@@@@@@@@@F@ @@@"@ @8@@>@>@P@F@P@\@P@R@z@@Z@^@|@@@@@@@@@@@@@:@h@,@`@4@l@V@N@@@@@(@V@@@@@p@@P@(@B@@ @@@@@p@@v@@V@.@h@@"@@@@@@@@@@@@@@@@@@@@@@@@@@@|@@z@n@f@f@h@t@h@^@b@`@f@b@@@@ @@@@@@"@,@@@$@(@@(@2@"@H@0@\@0@L@F@^@d@V@H@`@~@n@@@@@@@@@@@@@@@>@>@@@F@`@@p@p@@V@@@@@8@@x@@@b@t@@@@@@D@@4@(@.@@@@@@@@p@b@h@*@@@@ @@@@@@@@@@@@@@@@@@@t@@@@p@r@~@x@t@l@p@n@n@v@X@Z@x@f@@@,@0@4@@@@$@@(@(@*@4@8@@F@2@4@,@>@,@<@V@b@`@p@f@R@b@x@@b@@@@@@@@@@ @*@F@0@d@b@@n@@@@@@@@@@v@@~@F@@L@0@@x@z@@h@@@@@z@R@@(@@@@@@r@P@p@l@R@t@@@@@@@@@@@@@@@@@@@@@@@@@h@~@v@@p@z@r@|@|@\@^@^@t@`@ @@@ @@ @@@@@@@@@"@@@*@"@>@@.@N@J@@@@@b@Z@X@b@`@h@@h@@@@@@@@@@@\@t@@P@@@@@@@@@@6@@@@@b@@6@@@@@V@@R@>@h@@@R@0@@@@@@@@h@@\@8@x@@<@ @@@@@@@@@@@@@@@@@@@@@p@@z@z@f@p@@`@x@l@z@r@|@`@h@@@ @ @@@0@@@@@L@$@@2@@:@8@2@\@D@N@N@P@.@n@x@v@f@@@@@@@@@@@6@@ @D@t@z@@~@@@B@^@@@@ @@B@<@@@|@<@@y@m@@"@@@$@@@@H@@@.@@@t@F@t@.@@@@@@@@p@l@@&@@@@@@@@@@@@@@@@@@@@@@v@@f@@@v@x@z@p@l@l@^@j@ @@@@(@@@@,@*@,@0@,@:@4@:@J@L@p@P@Z@>@b@`@p@l@v@@@@@@@@@@@*@j@Z@@@t@@@@@@@\@V@$@<@\@&@@@@@@@|@@@@U@n@@j@@B@@2@<@V@>@@@"@>@@@@t@l@>@@.@@@@@@n@ @z@4@@@@@@@@@@@@@@@@@@@@z@x@@v@x@x@~@@X@h@h@d@`@@ @@ @@@@&@$@(@F@<@R@6@2@8@P@X@<@d@l@t@\@@@x@d@f@@t@@@@@@ @@@L@j@@@r@@@@@L@@@@@@@x@Z@@@@@@@@>@p@@@@@@@@@@@@@@V@@F@@t@@^@^@@@@@@@@@p@T@V@,@@ @@@@@@@@@@@@)@@@@@~@~@@@@x@l@r@n@@v@@r@h@@@.@6@"@D@&@ @"@4@8@J@,@L@b@f@H@\@@@Z@^@z@@\@@v@@@@@@@ @L@<@D@@@@@@@L@6@.@@@ @H@@@@@@:@@h@ @9@@@@;@T@@.@+@|@@@Y@@@@@"@<@@F@ @@@@@V@@@D@<@@@@@@@H@F@@@@@@@@@@@@@@@@@@@@v@@@z@~@@x@r@z@@@@@,@@"@b@F@6@B@@B@D@,@l@V@H@@P@@~@Z@n@b@v@t@|@@@@@@@0@ @J@@L@@@@@@p@@r@@@@r@H@@@@N@@@@@@@@@V@B@@<@@@ @@@@@@@ @v@)@4@H@@@@@ @@@ @@V@@@@@@@@N@n@@@,@@@@@@@@@@@@@@@@@@@z@@@@@r@@~@f@t@ @6@@*@>@>@,@6@0@V@H@|@J@R@n@@d@@@@~@X@@@@@@@@@@@~@b@@@@ @B@R@@@8@@@@@@@@@B@@ @@@@@@@4@@@@@8@@b@@l@@L@B@@@@P@@@@2@@F@~@v@(@@T@x@@@@@@@@@x@P@4@@@@@@@@@@@@@@@@@@@@@@t@v@t@r@@|@@@H@*@0@d@8@*@F@P@P@Z@t@~@r@b@@@@b@@@@@@@@@@(@@&@R@`@p@@@X@@h@@2@,@@@@@@@D@@j@@F@l@B@D@@@@N@@2@@^@@@@:@@@@@@8@2@F@@@@>@N@h@0@@@@@@(@@@v@0@@@@@@@L@8@>@@ @@@@@@@@@@@@@@@@@@@@@v@~@@@t@"@,@>@8@H@>@@B@J@b@p@<@\@f@l@r@~@Z@@@@@@@@@@@@@<@V@@X@@@@@ @@@@@t@b@@@@@@@@@@@B@@v@@@@@@@@@*@@N@@h@@D@@@@.@0@l@ @@<@@$@@@p@F@@@@@@V@8@@>@@@@n@L@,@(@@@@@@@@@@@@@@@@@@@@@@x@@@~@r@8@$@(@T@>@:@N@B@B@d@d@p@V@X@@@@@@@@@@@@@@J@.@~@@@"@ @@@@H@@Z@8@@@@@@@@@@@@@b@@@@*@@@@b@@@V@H@@@@@@z@*@9@@@R@z@$@\@@@@@f@d@(@@8@@@P@@@@v@@J@:@@@~@@`@b@@@@@@@@@@@@@@@@@@@@@@@@@z@P@X@j@`@X@P@r@d@j@Z@r@@z@@@@@@@@@@@,@$@@n@@^@@@d@@@@@2@j@@6@@@l@@@X@@@2@ @@@@@@"@L@@@@@@b@@ @@F@@@D@x@@@t@@ @:@@^@@@@@@@ @@d@@@@(@@@@|@,@(@@@|@F@~@:@ @@@@@@@@@@@@@@@@@@@|@~@@v@t@D@h@L@H@F@n@r@b@~@`@@@@@@@@@@@@@<@@@(@b@p@z@@P@p@@@Z@&@@@@P@6@@Z@@@@@x@"@@@@@@@@f@d@b@@ @@2@b@t@@6@@@ @l@@j@N@@@@@@@@@d@@@@@B@@v@@P@@@@D@@@@@@h@X@:@ @@@@@@@@@@@@@@@@@@@@@@@@<@F@<@R@@@V@d@@@@@@@@@@@@@@@@:@@V@N@@@@$@@@@.@@@@P@$@@\@@@@z@\@D@@@@@r@*@v@@r@@@V@@@6@@~@@@b@R@H@*@@@~@d@$@P@@@@@@@V@d@@@@@6@@@@@@@@@@@N@@@@@p@$@:@@@@@@@@@@@@@@@@@@@@@@@4@V@\@`@J@d@l@^@@@@@@@@@@@@ @@@$@,@D@@@@@\@@@:@*@@@@@L@@@@v@ @@z@@@@@@@@@,@@ @@0@@@@@@F@@f@@^@@@f@@:@@@l@f@@@@@@@l@h@L@@j@L@@@@@"@p@@,@@H@ @@@@Z@V@4@2@@@@@@@@@@@@@@@@@@@@@j@V@j@r@^@t@l@`@@R@@@@@@@@@@8@@$@@N@|@v@@@|@@@@T@@@@@@@@*@@b@@j@@@@@@@@@@@V@@:@<@v@"@@N@@ @@@@@a@@@@F@@[@@@3@@7@@^@@Z@`@~@@p@@@@@@@@@@@@0@@@@v@Z@@@@@@@@@@@@@@@@@@@@@@z@p@P@f@@@@@@@@@@@@@@@@J@B@$@v@`@@@@@>@J@4@J@@@@V@L@@@r@$@L@0@ @@@@(@t@@@@ @@@l@r@ @"@@J@F@@@@@@@@@@@@@j@@T@@@@@@l@@@@@@v@@F@r@@@@@u@@P@@H@"@@@@@h@>@6@:@(@@,@@@@@@@@@@@@@@@@@@b@\@@@b@@@@@@@@@@@@@@@P@@ @0@@@4@@f@&@j@@@*@@@*@@@@2@H@@*@@@@@@\@b@@@@@@F@(@@@F@~@@@d@@@@b@@^@^@,@@@@@l@`@<@P@@@@T@@F@@@j@@@@@f@@|@J@@@Z@T@@@@^@V@B@.@@"@6@@@@@@@@@@@@@@@@@@X@H@z@@x@@@@@@@@@@*@*@@@`@P@^@@@2@@(@@@@@@@@F@@^@@@@@&@4@V@@V@@@@@@.@0@b@ @@@@T@@@@@@@V@8@4@8@@@ @@f@|@p@@@@@@@ @v@p@@@@@L@@@<@@@d@@ @@@@@@@:@$@@@r@j@r@2@D@@@B@@,@@@@@@@@@@@@@@@p@|@@@@@@@@@@&@D@z@@@b@>@~@@@D@h@@R@2@@>@@Y@<@R@@n@@@@6@@2@@,@@z@@,@@b@@`@@@b@@@@@@@@@@<@@@@@@@j@z@@d@n@@@v@@v@@@x@@P@@n@@@H@@@@@@@@@l@@@@@@t@ @@~@@N@V@D@B@B@.@@@@@@@@@@@@@@@@@v@r@@@v@@@@@@6@N@@@@@@,@@0@*@R@@@@@@A@f@@@R@@@@@@@.@ @~@(@F@@@@@2@F@@B@4@@P@p@t@~@@@6@@F@P@@@|@`@<@P@j@X@@@v@`@@@ @:@@4@f@@@@.@@@@r@r@@@@`@@4@J@@"@*@D@@@z@`@D@:@N@2@>@(@4@@@@@@@@@@@@@@@@@@@@@@@@@@X@@@ @t@@@~@@@P@p@z@@@@.@@1@@@@8@@@@@@@@@@@j@.@x@@@@@(@,@@(@@@@^@@@.@@@l@@@@@@@t@@V@@h@@@@N@@"@@@L@P@@@@D@@<@@@D@@@v@@@@r@@$@X@@@d@h@l@8@6@H@2@8@"@(@&@"@@@@@@@@@@@@j@@@@@@@@@@@@@@<@@@t@@@@@@T@@@@ @ @@@@@%@>@f@ @@@@z@@0@@Z@@,@@@2@F@@@@6@@@@@f@@@d@F@j@"@^@@@R@@@X@z@@,@"@\@@@h@@z@@@V@@D@@@@2@@h@n@l@@@ @&@@0@@@ @@@`@^@X@r@@L@N@X@.@(@&@@(@@@@@@@@@@@@@@@@@@@@X@@@N@@@h@t@@@@@T@@@L@@E@@l@@@@f@@h@2@Z@@@@@@@(@@@`@@@@@N@,@z@@P@&@@@@ @@n@@@r@@@@@@8@@8@v@R@@@Z@@@.@@@@n@(@@L@@@@4@@:@@@@@@<@@@@D@<@D@&@0@R@@@2@N@6@$@@(@@@@@@@@@@@@@@@@@,@8@`@n@@@@@@@@@@V@@p@H@@L@f@"@@h@@@@@L@~@@J@@@&@@@@@@P@`@@@N@@r@l@@.@p@@@@v@@@$@j@L@(@@@\@@p@B@v@@@@h@@@@B@ @@@6@R@@T@@J@ @@@@@@@@@v@6@@@\@@`@^@P@T@:@z@>@D@V@<@@@6@@@ @@@@@@@@@@@@@@@@8@:@8@@@@@@@*@@@@@ @@@B@@V@@T@h@@j@@p@r@@@@<@z@&@@@@@F@@@t@@@@f@b@@@R@2@@@@@@@F@@@l@@@@\@ @@@@F@@@@@@@d@f@@@@@|@x@@@@@@B@@B@B@8@N@@@@@d@B@:@T@Z@Z@>@P@F@@@>@:@N@8@@@@@@@@@@@n@@@@@@H@J@B@@@@\@@8@@@r@h@@@@@L@f@@@@@@@@H@~@@@X@@@<@r@@@@ @:@@@@@@@@@,@4@B@@V@@@@@V@@Z@@@@@@@,@@~@4@d@.@@@n@@@@@@r@@D@@@|@@@@2@B@p@@T@@@@&@@^@h@l@x@z@\@z@b@T@T@T@^@B@:@&@"@ @ @@@@@@@@@@&@ @\@V@@@@@f@@l@&@@@@B@@@@h@@@@@@|@@@@@@`@@~@@@&@@<@V@<@^@@2@@>@T@d@@ @b@d@@L@b@@@@l@@@@@@<@@4@@@@@n@@`@|@p@*@B@*@@@@z@@@@@@@@(@@~@:@@@&@H@@t@@@h@r@d@D@@j@h@f@x@V@b@^@@@@@@@@@@@@@@@@@@@@h@*@@@@@J@n@d@F@@@l@@@@@@@$@0@@@@@2@8@@@@.@`@@^@Z@@<@@6@@@@@@8@@@@n@@@(@t@,@`@@>@@@.@@P@@@&@P@@@@@@@j@t@<@>@@v@@@j@V@@2@@@T@@@0@@@8@>@@@@4@@@@J@X@f@^@v@@@@@h@t@0@@2@@@@@@@@@@ @@D@X@h@@r@@@@@@,@L@:@ @@#@@P@@8@X@@@@@@@r@@@R@@j@@@h@@J@@~@@:@@|@@@@@$@@R@f@l@@@2@8@@@L@@h@@@@@@p@@@@@H@>@4@@*@@@N@<@D@@@@r@^@@@@x@K@@@^@@@@:@r@H@@@|@@@@@@@@@@|@H@@@Z@"@ @@@@@@@@@@H@T@~@@R@@v@@@@@t@@*@@@@@L@@P@@@@@"@@T@@@@@@@@@@2@2@V@@@F@@@J@@@@@@@@j@d@@@n@B@@@@x@B@@@@@@*@@r@@@@@@@@@@N@@@@@@@@x@@@@C@@@@Z@~@$@@~@@@@@@@@@@ @@@@@@@j@T@J@H@@ @@ @@@@@@@&@@4@b@0@@@@J@@@@@@~@@:@ @L@@@@@b@B@T@ @@@@*@ @@@@@@@@@|@:@d@@@d@@@|@|@@@@@@@f@@@@~@V@@@@@f@@@ @@J@@R@@$@(@t@V@@V@x@@@@"@@r@P@*@@@@\@@$@@B@f@@H@2@@@@@@@@@@~@@@j@b@H@ @*@@@@@4@@>@:@D@(@^@@@@@@@6@@Q@ @@[@@@d@@@V@"@&@ @@@$@x@@P@@|@6@$@@@@l@@0@<@,@"@"@"@:@>@@@@@@@@@@@@@@@N@h@Z@ @@@L@@ @@@z@@@@@2@@@@@@@_@@@@@@A@@@t@b@.@T@d@@@ @<@P@@x@>@ @@@@@@@@@|@v@h@N@"@@J@@@H@@p@b@:@R@8@z@@r@@@@h@V@@@R@@k@@@@@:@@H@$@@B@l@@n@@@@@8@@P@@@@P@@,@@ @ @@@@@r@@@@@@L@@@8@@@|@p@H@f@@@$@H@2@B@@@d@@H@@@f@@\@@@'@@@@@1@"@b@@@2@:@@@R@@@@t@@@:@B@`@@@@@@@@.@@@@@b@T@ @8@@N@(@R@D@B@ @6@J@n@p@@@@@@z@@2@@;@@-@h@F@@@z@@p@@@f@V@@@@@V@@f@|@@@@D@@f@f@*@*@(@T@j@@d@@@@@@@@@@@@@@@@h@>@@@(@@@|@r@2@@@@@T@@&@@@@@U@T@x@@@@H@@@@@6@X@0@@4@0@@F@T@J@@@@@@@@@@@n@J@J@<@@@@@j@@@@@@@@@@ @F@@B@@@@@@k@/@ @Z@"@(@@@,@4@@\@L@@,@v@@>@@@@R@@>@@j@@@@J@T@@@R@>@l@@@@@ @(@@N@f@@@@@@@x@@@@h@R@p@@0@F@@@@@@@`@j@@@@'@@>@8@p@@@@$@D@N@@F@h@@@@@P@2@ @@@@@@@@@@@^@>@@@@l@D@@@l@@@@@@@@n@2@L@@$@@L@!@@E@@@&@@@@@@L@@@@@@z@L@@@@@@@@@@@@L@F@@d@@4@p@@@@d@>@@@*@@@@@>@@@@@*@@@@@\@@@h@@^@~@V@R@5@n@-@]@@E@@ @z@T@@j@@@@J@*@r@@@$@@@d@H@@@@@@@@ @@@@@h@H@8@@@@@@@@@@@@@2@@@@@@@@@J@@@g@-@@@@(@P@P@@@l@D@@@@@@@*@@@N@@@@@@@@r@@x@@@b@@@@@@@@Z@:@@@@V@@F@:@@@@@@@x@@>@x@@@>@@C@@@S@T@b@@m@@@@q@L@@@@~@@t@L@@@~@@@j@D@ @@@@<@F@@@@@F@R@@8@@@@6@f@0@4@&@D@N@@t@@@"@z@@@@@@x@`@,@@@P@t@R@.@@x@@0@l@@@h@N@$@@ @@@@x@@@@@@@@j@@@\@@l@@@b@z@F@4@B@ @@@t@@@@@|@B@@`@J@@@@@@@*@@@u@5@@7@(@2@k@@N@B@@@@&@^@f@h@@:@@@@j@ @j@(@@@@@z@B@@Z@8@@@@@b@F@"@@@@>@V@ @@$@>@V@ @R@j@@@@l@@*@ @N@P@@@:@$@@4@@@@@@@<@@2@@6@@~@@6@$@>@n@@@@@@|@T@@@@@@@@@@(@@@r@@(@@@Z@V@6@b@z@@@@4@@f@@@@@`@B@@@@@R@?@@@l@3@8@J@@@@@r@@\@@|@@$@@@@@B@,@n@L@ @h@b@"@@@@d@N@0@6@@@@L@@@@@@@6@@@^@@@@@&@6@@@@@B@@@@@@2@@@@<@R@@@@@4@f@@8@~@n@@@t@@@R@Z@0@8@@@@@@@@ @"@@f@@@@~@f@@@@j@P@@L@2@X@@@p@@@@@@@|@h@@@@@@@@8@@@j@@f@@@@>@J@\@@@@@@@@t@B@@@4@@@@@\@F@L@@@@r@@@@<@T@4@@@h@J@@@@f@@@3@@@B@@R@@@,@l@@@j@@,@H@@@@@@^@ @2@@@n@@|@x@8@ @F@ @@$@&@z@H@@(@@@@@@@@@@@@@L@@@@@X@r@L@@.@R@h@@@D@@8@J@@@@T@J@@@@@@p@l@z@@@@@@@:@$@@@@@@@ @@@@@@@n@j@n@8@@@(@^@X@n@v@@@T@@@8@@@z@@@6@@w@Y@@@@@@@4@@@@D@@@.@p@@@@b@@&@@@~@@f@B@@@&@x@n@v@>@@4@d@@@~@@@@@@@\@@@@L@n@@@t@p@\@x@V@l@@R@@@F@*@@@@@@@@@@@@~@@@0@(@ @T@<@@@@J@.@ @@@@@L@@`@ @@@@@\@F@N@@@2@@@@>@(@@@B@@@6@@@@@4@n@@@@R@@@@7@@|@@@@@X@l@>@"@(@@@b@P@@:@r@@@f@,@&@@@@@@@x@<@@t@@@@@*@@@@@@@R@@@@@f@@v@,@L@H@0@@@@@@@@Z@@`@8@F@\@@@@4@@@ @ @\@6@v@@@@@@ @$@@@@@@@H@2@@@@x@j@6@B@@@z@D@@@@J@@b@2@@<@x@@@@@N@,@B@@@4@@@A@@2@o@@@@@(@V@*@:@,@@n@8@@@@@^@p@J@&@j@@&@@@@,@z@@0@@@@@n@@@@@@@x@@&@:@T@2@@@@T@@@|@@@@@@@t@@ @@@@@0@@@@@@L@D@~@Z@d@ @]@$@p@D@(@@@@@@@@B@4@@@@v@^@X@,@@@@@@@@z@j@v@@@b@@@Z@V@r@@@@@@@:@v@@@e@N@2@H@>@h@t@H@@\@\@@@ @p@@@>@d@0@@@l@@L@N@@@@@N@6@<@@@@@f@T@@@Z@0@l@@@ @@@:@@@t@@H@@2@@@@@@@@b@~@@ @ @6@J@@&@@.@@d@@@8@@v@@t@@$@0@@@@@@R@F@ @@@\@j@d@0@@D@@n@@@@@,@@ @d@%@(@@@@@n@|@.@@@@|@@@@@a@@t@L@@@@@$@@@@@j@D@@F@@@@@@>@D@(@L@@@@R@@@.@l@z@x@n@@@Z@@@j@N@@@@@@@@@b@@,@F@@@@2@@(@@@@@@@@@@@4@@`@X@@j@@j@@@@@d@R@H@@4@8@j@@(@@@@@r@F@@ @@&@H@@@@@@.@@ @:@@@z@@@>@P@@X@@D@@@V@@@ @@@|@h@@"@@@N@@V@f@@*@f@@@.@@@6@@@@@@@@2@"@r@@@@@x@@@@J@~@@@@@@@(@@*@@@F@@@@@@@@@@@@@@@ @@@R@v@@@x@H@6@@@@@N@@~@@D@<@@@@@T@r@@@@Z@@Z@@@@@:@@.@@@@"@@@@t@@@B@ @@@X@@@@0@@@j@N@@R@n@X@@T@$@@@@p@@@@L@@@@@@<@@h@4@@@@@@@@<@@@6@T@\@@@j@T@@@@|@@z@:@j@h@@@@x@@@d@~@@l@@~@@@P@H@@@V@$@@@@ @@@@@@@m@6@\@$@@J@T@R@"@@@X@F@@@@@@Z@@@J@@@@@b@@ @@@P@@\@x@@$@@r@@@@@!@=@@@c@{@)@/@@R@n@@@@@@@@@@>@@@f@@@@x@x@4@D@x@@@@@N@@@d@@@@,@&@n@@@@@@@ @@@*@0@@@4@0@*@@@@L@.@@@@v@@ @@@@@ @@p@@r@@&@@@@@+@@\@@@"@~@B@@@h@n@"@@@@x@H@@$@>@@@2@4@@&@@@@`@@@@@@Z@@@9@@U@e@ @@@@F@ @O@@r@@B@@r@ @@@@@x@@@@@J@@x@@J@@P@@@V@@J@@x@j@@@@@R@@@(@@@@>@@@@@X@X@H@@@@@@0@@@8@@L@@@@@@~@@@d@@Z@@Z@ @^@,@s@=@@N@@j@l@ @@@@x@8@&@@@@@J@@@@@@@@@N@@Y@@@@V@@K@@@@~@@@@@@@$@U@]@@@@@3@@@@p@@@@@@@@2@@@<@@@@@@@ @@|@6@l@ @@@@p@@ @N@@`@@l@@V@z@6@h@@@t@@@(@@@@@@J@@t@@2@|@~@T@@@J@@@@@b@@^@@3@@@@@@@`@"@.@z@@@x@@@@@@@@j@d@@.@X@h@:@@@@@@*@@@|@@@`@@&@(@@u@[@@@@@j@@;@t@A@b@*@v@@p@@D@v@@@@@@@@@@@@9@@<@v@@@@@@@@@&@.@v@@d@J@f@@@@@j@@@P@@0@@R@K@@@@@6@l@0@X@@@0@>@@X@@h@@@>@@@@(@@n@.@@k@@c@@@@@@J@v@@X@<@@@@@b@:@P@@@@@$@@@<@>@@@0@@@@@@@@@5@@]@@@@@4@Q@@a@@@4@@@@@@@@@@@@@J@(@0@@b@@r@@@@@@@@8@@,@<@ @,@@r@@D@)@@@p@@@@@@o@~@,@@R@@x@@x@@@@f@@@@l@@:@b@@@@@@@ @@@@G@@ @@@@@t@X@@@R@*@@@@p@0@@@@X@@V@L@@@B@x@@h@@h@2@@@@1@I@@Z@;@;@j@ @@@@@@@@@@@|@d@@Z@@b@t@@D@@@X@@@Z@ @@@R@2@2@@@4@&@@@\@.@@@ @@z@b@@@p@@@@@@@@G@"@@@@@Z@N@"@0@4@@B@<@@@@@@(@v@@@@V@c@@@@p@A@ @ @@f@.@@@@@T@"@@@@@d@.@@@@T@@^@@.@@@B@ @J@@@,@f@ @@@h@@f@@t@t@@!@@r@l@6@.@@@b@T@@(@@R@@4@@@8@@@@P@@t@@j@\@@@@@ @V@H@V@$@4@@@6@@@@@@@@@@@@&@@t@@@@@@@@T@@@@,@f@Z@~@@@0@@n@@@(@g@@@@@@<@@@.@@@@@D@H@&@@@@@f@@d@@@@"@n@@@N@@ @@@@@@@@@|@@@s@&@@@ @@b@@P@ @*@&@8@M@8@@f@@@@@x@@@@C@@@@@@ @r@V@@,@@@@$@,@@@@(@@@@>@@@@@(@@@}@ @C@@i@.@@b@@ @@@X@@@@@@@@L@@@@o@%@@ @r@@@@@\@@@`@@@Z@8@&@@d@H@@@@@@b@@@@@@@ @z@@B@@b@@@@j@T@@{@H@@@@@@@@@@@.@@n@D@"@@8@n@j@@@@*@@`@@@@@@V@@6@@p@l@@@>@@2@@n@D@@,@\@@@@h@@z@.@@@$@\@@@@@]@@@@<@@*@@Z@@@@@@@@@.@d@|@@z@y@W@@@Q@6@n@|@@@.@@`@@"@@@@V@p@@@@@@@@.@V@`@@@ @R@@@@@D@@@@@@(@@|@@@@t@@@@@\@^@@b@@@@@@@@@@p@B@8@@ @@@@@z@@@@@@L@@@N@N@@2@ @@f@@@&@0@@@"@6@@@@@@@@@@@J@@z@J@@@@@T@@@@@@@@@@@t@@2@d@@@~@N@@@@T@@p@:@@@@@n@v@^@@@@@h@@@@@f@@*@t@@@ @@@@@@a@@M@r@@9@@n@@@R@n@B@:@D@@,@@@@@@@@@>@B@@@@@@@<@D@@6@@x@"@V@@p@:@@@0@F@r@@@@@X@@@r@@@6@W@@@@A@@9@@R@ @^@@@,@@2@@@@@@ @]@@(@r@@&@|@^@@@@`@*@@@N@T@@@@@@@@X@h@b@T@@@@2@h@j@n@@@h@@@@L@H@@t@@r@j@2@@@@@V@@@z@(@@@@@@x@\@@y@@8@@@@@4@t@@n@6@ @F@@@,@@@@R@@,@@@ @@@H@h@j@n@@f@@:@@@@@@(@2@@<@@(@@M@^@@@@@@@@@6@@@@@z@Z@l@@O@@@D@@@:@@R@@>@R@@`@b@`@@@@@@z@z@~@Z@@@@@@@@@@~@z@@@"@x@@D@4@@@@@@F@@@>@>@r@<@ @$@@<@@t@@@T@@@@@@(@0@r@@P@6@@@l@6@@D@@X@.@:@@@@D@@$@>@@ @b@@R@d@ @@@@@c@@@N@@@@\@@@@@@@@@ @0@@ @L@$@`@V@@@@@d@@r@Z@,@@@P@@@@@\@(@@@@@@^@N@N@(@@@@@@B@\@@&@|@@@@@@@@,@@@@@b@@@@@@@z@@8@|@4@@p@.@@@@@@(@R@@x@@@@X@B@*@@V@@@P@n@"@T@@@@@@D@@v@8@@@Z@@t@@l@@@u@@@@@>@@@@@@|@@@D@@~@@6@.@@@P@x@@@@>@@N@:@@ @@@@h@$@V@n@l@@@@@@N@H@f@T@@@@@@@>@@x@$@`@H@4@@@@@@@>@h@^@X@j@@@@@^@@@@@@@@ @0@@@@X@@@@@@@,@@r@@@d@^@@@0@@@*@@@@&@@X@v@@8@0@B@"@@@@,@@@t@@@\@@T@b@~@@ @N@@N@@.@r@@@@@@@l@@@@d@n@ @4@@$@B@@@@@@>@"@@@@@@Z@H@\@"@~@z@@@@@:@`@x@*@N@P@<@d@r@\@@@@@"@@@@@@z@V@@@@ @@@@@&@@@@@@@r@@z@@Z@F@v@f@h@@@@@@@@N@8@&@@j@"@@ @@*@@4@"@6@@@@@@@@b@ @@>@@@,@T@@d@@ @@@(@@n@@@:@n@6@@@l@@@@@&@*@@@@@@H@@@@@@@v@2@H@J@0@V@h@@@@@@p@^@@:@N@,@R@@<@@@@@<@v@b@@J@^@@2@@@@^@p@D@@@@@ @z@@L@ @@j@@@@D@@@@@\@P@@@@x@@V@@@D@J@&@@.@\@R@@@l@@@@@^@@@L@F@@.@@@j@@@8@@@j@4@@@@@@@@j@L@J@@@@@j@@@&@@@@@@R@@T@@@@@@Z@t@X@6@X@b@R@@@@@,@B@@@@4@P@@@^@@r@@@>@4@@@@@@v@Z@&@Z@@@@V@@f@@P@D@2@l@@@@n@z@z@@@@*@@@~@@^@j@~@@*@@@$@^@&@L@@@ @@8@P@N@ @@@@@@@@T@@:@@@ @@@*@@@ @@@@@@*@@Z@@z@ @ @@@@x@b@@@d@n@F@@ @@@@v@@n@V@8@`@6@@L@@@@@@(@p@F@f@|@v@@\@@n@@@@@@@@@@@t@@@@@@@@@|@@|@,@@@@f@r@@h@n@@@@@@@~@@0@X@@Z@@@x@z@>@X@Z@l@@T@@@@@@@@T@@F@Z@@L@@@@@@>@@@<@@@P@@@@@@@@x@@*@@V@@z@n@@@@x@P@@@@@@@l@@j@.@:@J@@B@:@H@p@z@@@(@@@V@@@B@@z@@,@@@V@R@@R@d@@@L@H@@@@@@@t@r@(@@@`@@v@~@B@@\@L@t@.@D@@@@@@@@@@@@F@@@,@@@N@@l@z@@H@j@@@@@@d@x@@@@@@@@@0@@B@@@@@\@@@@@@@D@H@@@@@@L@@@L@~@P@@@@@@@@|@Z@j@n@P@ @6@N@@v@@@@@@@@@B@@6@4@@6@@@@n@t@@@x@Z@~@(@2@@@&@@@@ @@4@@@@\@@@0@@@h@B@:@x@.@@l@@@@@t@@@"@@@@@@@@f@0@@V@`@@T@@@@@@@6@@@@@@f@@J@@@d@@l@@@@2@&@J@<@2@@@@n@X@@h@b@$@,@@@@@@@@@@J@8@8@0@6@"@T@`@~@@@@ @@"@(@@h@@8@F@@>@@@J@@@~@@@@@@@^@@@,@8@p@,@:@@@p@@@v@X@b@@@>@H@@@@j@@(@t@x@@r@@&@@@@@@@@N@@@@@@@@@@*@>@z@8@H@$@B@@ @@@@H@@@*@@:@z@(@b@,@2@@v@@n@@@z@Z@@@@,@D@:@@@@@@@@l@P@T@P@<@"@@@@F@r@~@r@@@@@@v@*@@@@@@@@@R@h@@~@@|@R@@@@@@@@@@@@@`@j@h@@*@0@b@@@Z@@@N@@@@@@N@@@@v@P@@0@@@@ @@@@@@@J@ @@@&@D@@@@@@b@@@d@N@@@@r@*@@@@@,@B@D@n@@^@@@@D@@@@@@@@@@|@@r@*@\@P@J@@@ @J@L@`@@@@@@@ @@@ @@@@@J@@@j@@@@&@@X@@@@@@@.@T@@@@@@@@&@@@@@B@D@@@@@@@@ @<@@@@@@@@@@@@@@@<@@@@@"@>@@4@@@@@6@j@@@@P@@.@D@@@B@@@*@V@@j@@@"@@@v@.@@@@@@@@@@b@p@F@J@,@,@(@@@4@B@D@P@z@@@@@@@@@@@@@ @T@t@@v@v@@@@@@@x@d@@@@@@@@@@ @@h@.@@@@@@@:@@@B@@@@@@@F@@D@@@@h@0@@@b@>@@:@@@@N@@@@@@,@^@b@n@@@z@@@2@@V@J@@@@@@@>@@ @@@@h@@R@@@@@@@@@@@@\@<@V@0@@@@"@:@6@F@`@@@@@ @@@&@@@@@*@@F@@$@@@`@v@@@@@L@~@L@@@p@@@@@x@@@h@@@@^@@@@@@f@L@p@T@@p@"@@6@4@@@@@@*@@P@@p@@h@@4@@@&@@D@@@@~@R@^@@6@@|@@@,@@6@@P@@@b@@@@T@&@@@@@@@@@@t@p@`@h@d@,@*@2@@@@&@4@T@d@V@@@@@ @B@R@@d@L@@4@\@@*@@@@@8@ @^@@@`@$@@n@@@@@`@@@<@@P@@`@@@@@@p@@\@@@@@@f@.@D@@<@T@@@@@8@h@8@@@\@T@`@@@@|@@J@@.@@@@`@@@@F@@R@@8@@@J@@@@@4@@Z@@^@ @@@@@@@t@r@@p@d@T@R@2@*@(@,@@@@ @6@:@<@R@n@@z@@@,@@@@*@ @@,@\@@2@N@@@@@V@@N@@z@@@@@@@@$@@@@@V@@@@l@F@@t@@@@d@@@@l@6@@(@@@z@<@@@@@b@@@@@z@@n@@N@*@@b@@@@z@@V@&@j@@@@@@l@Z@J@@\@ @@@@@@<@J@@@@@@@@@@v@z@d@n@R@D@T@8@@@@@(@*@&@J@Z@@n@@@@@@F@F@@F@@D@@@@F@"@h@@@0@@J@@@@,@@@@@@~@@\@@@@P@@@@@@@@:@@2@p@D@l@X@@n@@@@@r@@@:@d@J@@@(@ @X@@@@@B@@J@@@@@r@&@@d@@@@p@*@@@R@@F@@@0@@2@@@@@@@@h@@@Z@T@X@J@@@@&@@@@"@,@.@,@V@X@@v@@@@@@@(@h@@@ @@N@h@V@H@@ @@r@@J@@l@@@^@6@B@\@2@@4@@\@@@>@@@@@@@@P@F@&@@@@@@@@@t@f@@Z@@@@L@@@@j@@@@@@N@@@H@f@6@H@h@@@@@2@@l@@@ @@ @@@T@@@b@@f@2@@@@@@@@@@l@>@<@D@^@&@6@*@@@@@@@@@Z@X@v@@@@@@@P@&@@@@@@@@@@@4@r@@@@@@@@r@@@@@@6@@@@B@@2@z@@*@@W@2@8@@>@:@@@@@@@@.@P@@@f@@,@X@:@@@@@`@@p@@X@V@@@^@$@@@@@@@@v@x@@@(@@0@@@@T@@@@@@@|@@z@@|@\@H@4@2@2@@"@@@@@@@@$@@,@b@L@^@@@@@$@2@@@@@@F@r@@@r@r@@p@P@@d@@@:@@@@B@@@@@@B@>@2@@@@N@@@@j@H@@@@@P@@@@@@ @H@@(@@n@@@@&@@4@@@@@@|@@@@@@|@@ @*@@4@@@@@Z@@@,@t@@v@^@ @@@@@@h@@h@h@Z@B@V@D@4@&@@@ @@@@@@@@@ @4@d@j@p@@@@@@L@@8@@@r@>@\@@.@@D@R@@6@@*@@@@H@@@@@H@@@0@ @@@@@@@@@@@t@@@@@r@D@@@@@@@@@x@@@@@@@@@@0@@@@@@@@@$@@@|@D@@>@.@@ @@@p@ @@^@F@8@@@@@@@@@@@@x@<@F@8@F@2@6@6@@@@@@@@@ @:@ @H@8@~@N@t@@@@@"@*@@@@~@F@ @@@@@@J@p@@t@~@@@@ @@@@@@ @@j@@X@j@V@@@@@@@@F@r@@@@@@@0@@@@@@J@@@@J@@@@@@@@6@2@@ @r@@6@@@X@~@@@n@@@f@@f@@@@@@@@@~@@r@P@n@\@:@:@,@.@@ @,@@@@@@@@@@@.@0@ @F@n@H@h@@@@@*@6@ @@B@@X@@@b@@@0@,@@F@@@@2@@v@~@@@@&@@@T@$@@@@(@@@@@d@@^@B@.@.@@ @@@B@@@d@8@@@N@J@@ @@@@@@@@@@@@@`@@@@@@&@@M@:@@@@@@@@@@@@@@@@@B@`@b@\@<@4@*@<@@@@@@@@@@@@@@@(@.@R@N@<@d@@p@@@@@@@@@@@@h@@@v@N@@@&@@@6@2@@@@j@@,@V@@V@@2@>@v@&@@V@<@@@8@@@V@@X@@,@@@@@@@@@~@@@@&@B@@H@R@@@@@t@<@*@@@`@@@@~@M@@@@\@^@@@@@@@@@@@@d@J@v@b@T@H@$@H@*@2@@@@@@@@@@@@@ @@*@ @*@n@x@p@@@@@@@D@R@@@*@|@@ @@X@@@F@8@@b@0@4@.@b@:@(@T@@@@@`@@@@@@@@@@b@@@0@@@L@@@f@@@@4@@V@@@@j@d@@@@\@@@@@ @@@@p@P@@@@x@"@@|@@@@@@@@r@@@l@v@\@<@"@P@<@8@@@@@@ @@@@@@@@@@@@@@&@@*@L@x@t@t@@@@@*@b@V@@@@@.@N@4@&@@@@@@@@@@6@<@l@@@@@@X@@@@@D@@@b@@@@V@@@@d@*@8@@(@@@(@P@p@@@ @@N@@@,@&@4@b@@v@@:@$@@:@@@@0@@@n@6@@@@@@@@@@`@`@@`@0@Z@V@>@B@V@@"@"@@@@@@@@@@@@@@@@@@ @0@L@0@<@R@l@f@@@j@2@@~@t@P@<@@4@n@@@<@@@@@"@"@z@p@@V@@@@@@0@T@@@@|@@@Z@6@@n@@@@t@@@@@p@$@@@@@Z@$@l@@R@@t@b@@j@>@&@"@@8@@V@ @D@|@@@@2@<@@@@@@@@@@|@f@F@l@Z@:@6@(@@2@@@@@@@@@@@@@@@@@@@@ @@@@@@F@N@F@\@@@8@@B@2@@@ @@@p@@@$@@n@@l@v@n@@ @2@@`@r@j@"@|@@@@B@L@@@*@@|@@@^@f@@V@@~@@@@^@@@d@@L@@@j@@v@@@\@p@2@@ @$@@p@@.@@@@l@&@@@@@@@@@~@@T@d@R@N@4@6@@8@.@@@@@@@@@@@@@@@@@@@@@@@@@&@@@B@R@b@x@@@@@@@@@@2@f@\@@&@@@"@@@@@@@"@@@@@v@@@4@z@&@@@@@@@ @@@@@@@R@D@r@p@@&@@@@@@@@@v@@@@n@X@@T@>@2@@|@h@@@@f@8@@(@@@@@@@@@l@j@d@J@T@D@8@6@>@6@$@@@@@@@@@@@@@@@@@@@@@@@$@@@>@<@F@Z@x@@@@@@@@@@@4@@@,@ @@@@,@v@@@@@*@(@@|@@<@0@@@|@@@@@@@@f@@@@@.@@.@@&@h@ @@@@@@@@8@J@v@@@ @@@@@p@@@<@.@*@@@@@@@@@@T@F@f@F@:@F@@@@@"@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@(@2@<@D@\@@@@@@@@@@@@@@@@@p@@@@>@@@@@f@@@@@@`@@T@d@l@X@@@h@@@@6@@ @@ @`@@@@@X@@X@@4@$@ @b@@X@f@@@@2@@j@@p@@\@L@@4@@@@@@@@@d@`@d@@H@J@F@<@,@@8@<@@@@ @@@@ @@@@@@@@@@@@@@@@@@@@"@ @@>@:@\@N@b@j@p@@@h@@@@d@@@@@ @@@\@ @@<@.@t@@D@@D@v@j@^@F@@:@Z@n@@@ @~@*@@z@@@8@x@D@@@@@j@@@&@@@@@@@@@|@H@@,@@@<@*@@@@@@@@@t@@@@d@\@F@J@N@<@Z@ @:@ @ @$@@@@@@@@@x@@@@@@@@@@@@@@@@@@"@@@@L@\@n@p@|@@@@@@@@@@@@@@*@@p@2@@@@$@@@@d@@@@@v@@@@@@@p@@@@@@@@p@@@0@v@@(@4@l@$@@@J@@@n@@8@@@@@4@@@@@@@@z@v@d@V@^@h@0@6@>@.@@&@2@@@@@@@@@@@@@@l@@@@@@@@@@@@@@@@@@@ @@@,@P@6@r@n@v@l@d@@@@@@@@@@@.@b@&@v@@>@@@@@@d@t@@@@@@@@L@>@@&@.@B@R@@@@@@~@@@@@L@(@@R@0@@@@j@@f@ @@@@l@H@@@@@@@@@@x@d@T@|@p@R@P@.@F@"@ @(@$@ @@@@@@@@@@@@@@x@@@@@@@@@@@@@@@@@@@@@@:@(@J@>@F@N@`@>@@v@@@@@@@|@ @@b@d@@@'@D@@@@t@0@@@@@@@@@@@@@@@@@@V@@(@@ @@@@@v@@@@@@@@@*@ @0@$@@@@@@@@@@n@N@N@N@V@l@:@@4@<@ @*@@ @@@@@@@@@@@@@x@v@@p@@|@@@@@@@@@@@@@@@@@ @@ @&@$@>@"@*@0@B@t@h@@@@@@@$@@*@@:@@@U@@@@@@@@@@@8@:@D@ @@@4@@@@@@@4@@T@@F@ @@@D@@@@@8@@<@@@b@2@N@@@@@@@@@@X@n@N@0@.@D@P@H@@>@.@@&@@ @@@ @@@@@@@@@@@@@v@@@|@|@@@@@@@@@@@@@@@@@ @@@@&@@&@H@T@|@n@n@@@$@b@p@j@@>@@@@f@@L@"@>@@@>@ @@v@V@@ @@"@\@@@@T@@@@V@@Z@@@@@@@l@.@@@@@@@@@H@R@d@@@@@@@@@@t@x@`@B@4@>@X@@8@8@4@@$@@@@@@@@@@@@@@@t@@@@x@@@@@@x@@@@@@@@@@@@@@@ @@@@"@"@*@n@:@n@@@@@@(@@H@@@@J@@ @@(@>@@@z@$@\@@j@@V@`@@@V@~@\@<@@@@T@:@J@@@@@@@@@X@@@@@^@2@2@@@@@@@t@@@r@f@L@H@>@:@,@8@"@@@(@@@@@@@@@@@@@@@@@@@@@@r@r@v@x@@@@@@@@@@@@@@@@@@@@@@@ @0@@R@*@D@@`@@@@@@$@@ @@@ @L@@@@@v@@@(@@@@@@@@ @4@b@Z@@9@@H@@@@@@@\@@L@x@@@@@P@@@@@@@@@@~@^@j@X@^@N@^@P@,@@@(@@*@ @(@@@@@@@@@@@@@@@@@^@p@r@@~@@t@|@@@@@@@@@@@@@@@@@@@@@@@@@(@ @<@F@l@x@@^@@@@>@@@@@@@@|@@:@N@B@@L@2@@:@@0@B@@@ @x@@@@h@R@@D@@@D@@@t@@@@@@"@@@@@@@@@@R@n@j@d@r@>@8@F@&@@*@D@*@ @@@&@@@@@@@@@@@@@@@@@@t@v@p@v@@|@@v@@|@@@@@@@@@@@@@@@@@@@@@@$@0@2@h@\@@@@@@@^@@@@@6@@@T@@@@B@`@V@@b@@@b@@@@@@@l@@@@@L@@@`@@@\@@@r@@@@ @@@@@@v@z@n@V@B@>@L@B@@@.@ @@@@@@@@@@@@@@@@@@@@@@@@@t@f@z@t@x@z@~@@~@z@z@@@@@@@@@@@@@@@@@@@@@@,@@4@P@ @N@@d@@@@@>@f@@p@@P@z@@@@@@@(@@@*@@v@@@@@@@@@r@@@@@@@@@8@`@*@V@@@@@@@p@@^@j@d@@8@B@<@V@4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@n@@l@|@@j@h@t@@~@@@@@@@@@@@@@@@@@@@@@@@@@@*@D@8@.@f@T@@@@@@@*@@@F@@@f@`@~@@@@\@r@@h@@@@ @@@@@@@4@@@R@$@@@@@@@@@x@f@b@X@N@b@<@6@2@(@@*@8@@&@@@@@@@@@@@@@@@@@@@@@@@@@@@p@r@@x@n@l@Z@n@j@j@n@v@@~@@@@@@@@@@@@@@@@@@@@@@@@@.@*@L@Z@r@@n@v@@@@@@@@8@@@V@F@L@@@@r@&@@@d@@@\@@D@.@@@@@@@@@@@@@@@h@j@^@j@`@V@P@N@,@*@>@H@4@ @@@@@@ @@@@@@@@@@@@@@@@@@@@@@d@f@@h@r@d@@r@l@x@z@z@t@@@~@@v@@@@@@@@@@@@@@@@@@@@@@,@l@(@B@@j@@@@@@@@@@@@@@@H@@@@@L@<@@`@@"@j@@@@@@@@@@@@x@@@@@b@T@h@4@T@2@<@N@<@@<@X@@@@0@@@@@@@@@@@@@@@@@@@@@@@@@@d@h@t@j@v@V@d@l@v@x@@@@@@t@@@@@@@@@@@@@@@@@@@@@@@@@"@,@@R@J@T@z@T@@r@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@v@F@t@V@^@`@Z@J@F@H@B@0@8@B@0@@$@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@`@X@R@b@p@j@v@p@n@f@~@X@@n@|@@@@@@@@@@@@@@@@@@@@@@@@@@$@@ @Z@@(@<@2@J@J@@@v@t@@f@@@@@~@@@@@@p@@@@@@|@t@f@h@j@^@@N@`@P@6@@@8@.@.@6@"@&@.@4@*@@ @@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@f@d@^@V@l@`@b@Z@~@p@`@r@r@`@j@z@l@~@p@@@@@@@@@@@@@@@@@@@@@@@@@@@@2@ @N@.@<@l@.@b@V@J@@~@x@@^@f@@X@@v@x@@\@v@@j@@L@>@l@j@@j@f@<@6@8@B@6@D@4@$@.@@"@&@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@b@b@f@`@^@X@j@f@p@b@d@z@v@h@t@v@@|@n@@p@@~@@@@@@@@@@@@@@@@@@@@ @,@@@&@@@,@ @n@`@4@h@N@@t@P@f@H@^@t@4@@z@V@@Z@@@v@r@Z@0@@P@@@L@B@4@,@$@0@@*@>@@6@"@@@@@@@@@@$@@@@@@@@@@@@@@@@@@@@@@@@@@@@@j@z@\@h@f@t@n@n@r@p@t@z@z@t@@p@z@v@@@~@@@@@@@@@@@@@@@@@@@@@@@ @@@0@@2@,@ @T@*@*@B@6@@@@,@T@P@,@:@>@F@Z@H@X@*@8@h@B@^@F@D@N@>@2@8@@@@@*@@ @@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@n@d@j@f@X@P@b@j@b@h@^@@h@r@|@@@h@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&@@ @@@B@4@ @>@@&@ @$@<@@@J@@0@,@*@.@@@(@@ @@@&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@`@f@h@\@^@`@d@Z@n@h@l@r@r@l@n@n@z@r@~@@x@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(@@2@@@,@$@@@ @,@@@&@&@@.@(@8@.@ @.@@ @6@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@V@V@^@^@r@\@^@`@h@b@h@r@h@d@z@p@f@j@@n@~@@z@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@"@@@ @@(@*@@4@@@2@@j@@@6@@&@>@(@D@@@(@@.@@@@@@4@@ @@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@V@Z@|@D@T@^@d@d@X@l@b@`@z@z@@|@z@r@@@t@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@,@@@@@,@@@@@8@$@@@@@(@@@@$@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@sunpy-0.8.3/sunpy/data/test/EIT/efz20040301.020010_s.fits0000644000175000001440000042350013203275053021105 0ustar nabil00000000000000SIMPLE = T / conforms to FITS standard BITPIX = -64 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 128 NAXIS2 = 128 DATE = '2004-03-01' / Date of file creation TIME-OBS= '02:00:10' / DATE-OBS= '2004-03-01T02:00:10.642' / UTC at spacecraft ORIGIN = 'Rocket Science' / Rocket Science = NASA GSFC DATASRC = 'LZ file ' / TELESCOP= 'SOHO' / INSTRUME= 'EIT' / OBJECT = 'full FOV' / BUNIT = 'counts / pixel ' / WAVELNTH= 195 / 171 = Fe IX/X, 195 = Fe XII, / 284 = Fe XV, 304 = He II FILTER = 'Al +1 ' / DATE_OBS= '2004-03-01T02:00:10.642Z' / SCI_OBJ = 'CME WATCH 195 ' / OBS_PROG= '195_10S_AL_1.000 ' / CMP_NO = 1 / Unique campaign instance (1 = synoptic) EXPTIME = 12.598 / s (total commanded + shutter close) EXPMODE = 'backside ' / FILENAME= 'efz20040301.020010' / CFTEMP = -66.71 / CCD cold finger temperature (C) CCDTEMP = 7.34 / CCD temperature (DN/100) CTYPE1 = 'Solar-X ' / CTYPE2 = 'Solar-Y ' / CRPIX1 = 64.5 / Sun center x, EIT pixels CRPIX2 = 64.5 / Sun center y, EIT pixels CRVAL1 = 0.00 / CRVAL2 = 0.00 / CDELT1 = 2.63 / Pixel scale x (arc sec, fixed) CDELT2 = 2.63 / Pixel scale y (arc sec, fixed) SOLAR_R = 372.27 / Solar photospheric radius, EIT pixels SOLAR_B0= -7.22 / Degrees SC_X0 = 0.00 / s/c yaw (arc sec) SC_Y0 = 0.00 / s/c pitch (arc sec; -109.14 after 1996/04/16) SC_ROLL = 180.00 / s/c roll (deg., Solar north + CCW from nominal)HEC_X = -139130208.00 / s/c heliocentric ecliptic x (km) HEC_Y = 46576272.00 / s/c heliocentric ecliptic y (km) HEC_Z = -94896.31 / s/c heliocentric ecliptic z (km) CAR_ROT = 2013.00 / Carrington rotation at earth COMMENT CORRECTED DATE_OBS = '2004-03-01T01:58:31.604Z' COMMENT COMMANDED EXPOSURE TIME = 10.000 s COMMENT SHUTTER CLOSE TIME = 2.598 s COMMENT LINE_SYNC = 'no' COMMENT CAMERA_ERR = 'no' COMMENT IMAGE_OF_SEQ = 0 COMMENT READOUT PORT = 'B' COMMENT NUM_LEB_PROC = 3 COMMENT LEB_PROC = 26 (no ROI) COMMENT LEB_PROC = 27 (no occ mask) COMMENT LEB_PROC = 12 (Rice) COMMENT BLOCKS_HORZ = 32 COMMENT BLOCKS_VERT = 32 COMMENT P1_X = 1 COMMENT P2_X = 1024 COMMENT P1_Y = 20 COMMENT P2_Y = 1043 COMMENT N_MISSING_BLOCKS = 0 HISTORY Version 4.0, 2001 December 10 HISTORY Image linear resampled to (128,128) for SunPy END @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@z@@@@r@|@@~@z@r@v@|@x@r@x@x@b@V@P@Z@d@T@b@^@Z@b@R@V@`@\@R@\@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(@@@ @@@@@ @$@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@~@@~@@@|@r@p@l@t@n@v@\@r@f@\@^@`@`@\@\@`@L@L@V@X@`@`@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"@@@F@ @2@$@@$@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@x@@@|@@|@x@l@j@n@`@b@b@b@\@`@n@Z@^@`@\@\@F@V@\@\@J@N@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @@@"@@$@@<@@@"@:@@>@<@.@@@6@0@.@0@*@@@*@@@@@&@@@@@@@@@@@@@@@@@@@@@@@@@@z@p@~@v@z@t@l@v@t@j@h@j@b@f@V@l@X@T@\@X@F@V@V@B@V@R@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@,@@@@@6@@ @.@*@D@0@@F@@@(@^@D@^@f@n@R@J@D@^@2@<@6@4@@*@F@B@@@@@@@@@@@@@@@@@@@@@@@@@@@r@|@p@z@@n@h@v@j@t@^@V@r@v@\@d@\@X@\@R@J@T@X@F@X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@$@@,@\@ @$@,@@B@6@<@h@\@n@^@H@N@D@T@>@.@@@2@>@<@*@6@0@@@@@@@@@@@@@@@@@@@@@@@~@@@n@x@@x@^@r@r@j@z@l@f@d@j@j@h@h@V@d@d@P@J@L@N@f@X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @$@ @@ @ @F@ @D@"@(@F@B@"@|@ @^@b@F@^@d@h@@@@@@@v@r@v@2@\@b@H@r@D@R@R@V@$@D@2@@@@@(@@@@@@@@@@@@@@@@@@@@@@@h@@p@z@t@b@b@j@<@j@X@d@T@b@Z@Z@J@V@X@N@X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@ @@6@@>@.@.@H@N@<@P@8@R@@@0@^@f@@@@@@@@@@@F@n@p@n@@X@T@f@^@L@R@N@J@ @<@@@@@:@@@ @@@@@@@@@@@@z@@@@@@|@v@x@@l@n@d@p@\@`@`@b@V@Z@P@T@R@P@N@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@ @@@(@@:@(@,@\@:@^@\@\@h@D@n@@z@@@L@z@@@@@.@>@@@@@@~@@@@@@@@@t@@P@4@@@6@H@ @ @8@8@@@@@@@@@@@@@@@@@@@@~@2@t@l@v@r@V@r@f@x@j@f@h@F@P@X@b@V@V@V@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@P@@.@F@L@@@F@H@h@N@@`@b@@t@h@@t@@@@@@@.@>@@@L@D@L@@(@@@@@@@@@@@@@p@j@f@~@X@N@P@T@"@@@ @@@@@@@@@@@@@~@@@@@x@@z@@h@l@v@t@l@~@f@P@`@Z@b@R@h@l@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@,@ @@0@ @ @2@:@v@6@B@^@Z@@~@d@@@@@@@@@@@@$@Z@@@@@x@@@ @@@@@&@@@@&@@@@@j@~@@@T@R@V@2@@@@@@@@@@@@@@@@@@@@@x@`@x@r@j@`@j@j@f@d@^@j@h@^@\@T@`@\@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@(@@@@ @6@>@$@Z@t@^@t@f@@@~@@z@@@@@@@>@@@@@.@@H@@2@@@@B@@@@@v@@@@f@@x@b@@6@@@@@@@@p@P@8@(@@@@@@@@@@@@@@@@@@@@@@~@@|@z@l@n@t@d@h@Z@b@h@`@`@h@^@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @&@,@@:@:@8@z@^@r@@h@@@@@@@@@@&@@R@@>@h@j@@^@@@z@@@(@@j@@,@ @@@X@X@@(@<@@b@r@L@@$@@@@@t@~@X@X@F@H@@&@@@@@@@@@@@@@@@@~@~@z@f@@@v@l@j@r@h@b@p@n@f@h@n@Z@@@@@@@@@@@@@@@@@@@@@@@@@@4@&@@H@@@(@"@R@T@H@@@d@@@@@@P@@@@@b@4@N@@@@@@@@@|@@@\@@L@@t@@@@(@@@j@@@<@@@@p@r@^@2@@@@@@@b@<@,@@@@@@@@@@@@@@@@@x@@@~@@r@@@l@l@f@l@f@d@b@h@d@\@@@@@@@@@@@@@@@@@@ @@@&@@8@@@F@B@H@b@J@f@~@p@@@@@@@@@>@z@b@@@@j@|@@@@F@@@R@0@n@@@@@@`@@@(@f@@D@@2@@@@@@@@t@~@h@~@B@@@2@>@ @@@@@\@<@B@*@@@@@@@@@@@@@@@@@@@l@t@|@~@r@v@p@b@j@f@j@h@`@@@@@@@@@@@@@@@@@@@@@@@@@@0@@D@J@2@^@V@f@@t@@@@@@@D@R@p@@@4@@V@@@F@J@@T@@l@@@@@x@@@I@@@@@@N@@@d@@@:@@@@l@ @@@z@@@@@L@<@@@@~@Z@J@&@@@@@@@@@@@@@@@@@@@@@p@p@l@p@f@h@v@h@V@d@@@@@@@@@@@@@@@@@@ @@@&@@ @&@@P@L@8@v@T@@@@@@@(@@D@@@p@v@@@@@@@@X@@|@@@@`@@@@(@Z@@`@@@@5@@H@|@@ @^@o@@@j@z@@@b@@P@ @F@ @\@@@@@v@4@@ @@@@:@*@@@ @@@@@@@@@@@@@@|@z@v@@r@r@t@v@f@n@d@n@v@@@@@@@@@@@@@@@(@ @@*@@@.@&@T@8@0@T@N@<@@l@@@@@@>@Z@V@@@@N@"@<@@@0@f@@@N@@@@@@@`@@d@@4@@q@@)@H@$@@@F@@@@@@c@@@@@@@@@X@@ @@n@@@@@*@(@@@^@V@@@,@@@@@@@@@@@@@@@@@@@t@t@~@j@j@l@`@v@@@@@@@@@@@@@@@@0@$@&@ @@>@,@B@J@D@z@@b@@r@@@@0@t@^@@@@4@2@@@@@@@@8@B@@f@@@\@`@J@r@@@@@&@@@J@r@J@@~@@@@@@Y@I@@@"@E@)@~@@@@N@@@f@@@@@@D@&@@@j@T@B@,@@@@@@@@@@@@@@@v@@@~@@v@l@t@p@n@\@r@@(@@@@@@@$@@@$@H@@,@0@,@x@H@>@x@f@~@p@|@@@@@@*@d@b@@@@@@@,@T@@@@@`@L@$@@H@@l@@@@@@^@@@@l@4@@N@|@^@J@@6@@F@D@@@;@@@@t@@/@@P@&@@@@@@@F@X@@@@N@@@@^@d@@@6@ @@@@@@@@@@@@@@@@x@@~@j@x@|@r@h@@@@@@@@@,@@@@ @@D@v@@b@>@X@h@b@n@@t@@@@.@@R@@@@.@h@@@@:@N@>@@<@F@@@@@D@@@r@v@@@@(@b@<@@r@@@@@@@@@@@@p@@@@@@@@8@@@@@@J@T@r@@@@@x@@@@L@@@@v@Z@>@8@@@@@@@@@@@@@@@@@@z@v@@n@p@|@@@@@@@@2@ @*@@(@$@(@@<@.@X@R@v@|@@@@@@@@|@@@@N@@@@@@@h@8@@p@@@&@"@@@,@@@@@X@(@&@@@@p@@@d@@D@>@@ @@@@:@@@@@<@$@r@@@@@@@@@@@6@@@~@@<@F@@n@@@@@n@Z@N@@ @@@@@@@@@@@@@@z@@v@v@|@n@l@j@@.@>@@4@&@4@>@@R@6@,@T@F@n@p@p@@@@@@@@@J@6@x@@@@@@Z@~@@T@@@@@@@@@@@@@@<@L@@@.@B@ @(@@@@@j@@@@@@<@F@@@@@@@@@~@~@@j@>@@V@p@@@$@@$@@@@>@B@@@@@@0@@@@@@J@@@@@@@@@@@@@@@@@@l@@@v@z@@@ @@@@@&@$@@@2@&@@@,@j@f@J@@h@@@@@@@T@z@@ @ @@@6@@@@D@@L@4@0@B@@ @@@@b@@$@@D@@t@@l@ @@T@<@@@@@x@@@@t@>@@@@Z@@@v@:@@@,@@@@6@@@@2@@@@@>@V@$@@@@@^@J@@@@@*@@@@@@@@@@@@@@@@@@|@@|@p@v@@Z@>@@:@@L@6@8@\@l@j@t@t@@@h@@@@@@@@H@@@@t@@ @@@p@@@@@ @@@P@ @@@@@6@@@@j@@@"@@@@@@@2@@@@@@r@@@|@@@@~@@z@@@~@@ @@@@@@>@@2@@,@@@@F@4@@J@@@n@@@@@@`@F@>@0@@@@@@@@@@@@@@@x@t@x@@@@@@.@(@(@&@6@T@>@n@T@F@j@D@z@@@@@@"@@n@@t@@@>@@@`@@@:@@@ @4@@^@\@@@r@@@@B@@@f@@@@$@@@@@@@@&@@@@@F@@@@@@@@@@&@H@@h@@@<@@$@@.@@@@@@@@@@J@@@4@ @@@f@@@@V@P@ @ @ @ @@@@@@@@@@@@@@@|@@$@4@:@"@ @B@B@&@R@N@T@\@J@@@n@@@@@@T@@@@:@Z@@*@z@@@@^@\@@@@ @@@@@R@@@&@D@@@\@v@@@@@4@&@@@<@B@@@B@b@@@@@@~@@@@@@\@@D@@@h@T@@@ @@v@>@@@v@@@@@:@@H@@@X@ @@@x@b@B@@&@@@@@@@@@@@@@@@z@z@@@@P@j@l@~@n@p@@@@@@@@@@@@@&@@x@@@@Z@@@P@@@@p@@@ @@@@$@@@@@@@X@@@@@@@z@@@@@@n@l@d@@@@@@@@@@@@@@@@\@4@@@(@@@@0@@@\@>@@@@@@4@@~@@@@@@^@(@@@@t@V@4@*@ @&@@@@@@@@@@@@@@@"@6@ @R@b@8@r@d@|@@@@@@@@@@@@@t@@@@f@@@<@v@~@d@@@@@@@(@@@@H@r@@@@@ @@@@R@@@@@@6@@"@@h@:@~@@@@P@@z@@@.@8@@@D@&@"@@@V@@@@@@4@@@@8@@@H@@ @@p@@@@"@@^@(@@@@p@d@@(@$@@@@@@@@@@@@@@@*@X@P@4@T@H@Z@@@@@@@@@ @@$@ @D@@@@@T@@@@@@,@@L@R@@@@@@@@@l@j@@@b@@>@@@@@@x@@X@R@@&@B@@@@2@r@@@@@@@@@@|@@@6@P@@0@@@^@@@@@b@@p@@0@@@@@L@@@D@@@@b@@@@|@@V@P@R@H@@"@@@@@@@@@@@@@n@~@d@v@@x@@@@@@@@@@8@>@`@b@@@@t@@R@@@@@@@@@p@^@@@@@r@|@@@@^@@@@@@~@@@@@B@@@0@^@>@,@>@@Z@ @@@<@d@@ @ @@@@@@@@@(@@@0@@4@^@@@@@@t@4@@X@@t@ @|@>@@(@@~@2@@@@@@@b@z@<@@@@@@@@@@@@@,@n@V@b@f@(@z@@@@@@@@*@X@t@r@v@@@r@n@@\@@@@@b@l@^@ @@@@@@@^@x@@.@@X@@D@@@@@<@8@r@r@@,@`@@<@:@B@T@@@@Z@@@F@@b@@@d@h@Z@@H@@J@,@@@@J@v@6@@@ @^@@@t@@@@D@@@6@n@@@b@@@@@@@j@N@R@(@@ @@@@@@@@@@@f@@@@@@@@@@@@.@P@@@@@@@ @@@`@@@2@@4@@@@@ @@@@@@|@@@x@H@@~@f@@H@@@R@r@ @@@*@~@@~@@@@l@@@@@@@j@*@>@D@l@J@@@@@L@@@@j@T@@@~@@P@@v@.@@R@@@@@@@@@@~@X@2@@@@@@t@H@:@@*@@@@@@@@@@@^@v@t@@@@@@@,@ @@@L@@<@>@R@8@@@@@"@x@@d@@@@@@@@@@@@@@@@@T@@@@@p@@@X@@(@n@@@@0@@@@z@@@@d@@@ @@h@l@@@@@@@@@@"@@@@@@@@@t@@@@v@@@@@@@@6@@@@P@@@P@(@@@@@@@X@8@F@@(@@@@@@@@@\@@~@p@@@@@@@@@0@t@~@@@J@@@@@b@@Z@@>@@$@@@@@@.@@b@@@@@X@N@@@@@z@T@<@f@J@b@@L@@@@L@ @&@@"@@,@x@@`@@@@n@2@@@@@8@>@@,@@h@z@@0@^@@\@ @@@@f@t@@ @F@@<@@@@@@N@@~@F@8@@@@|@|@\@H@X@L@ @@@@@@@@@@@@@@@@@*@:@l@~@@@@6@@@6@@@@@@@@@:@@@@@3@@@Z@@6@`@@@@p@@@@l@F@B@.@@@b@ @@@^@&@@@d@@@\@@.@|@@l@@@r@@8@r@@ @(@ @@(@p@H@t@@@@@@@Z@@V@*@@@V@T@@@H@@@8@@L@@l@<@*@@@@@r@j@r@n@j@J@@@@@@@@@@^@@@@@@@T@\@@@@:@B@H@@@@@~@@@@@@@4@(@@@@@ @`@l@,@@@@0@L@B@@@H@J@&@8@@H@@@@@p@@$@B@l@2@@@@@@v@8@R@B@4@,@>@@X@H@(@N@(@@@R@f@j@h@d@n@@j@<@@@@v@@H@D@@@@h@b@@@@D@^@@@z@D@P@@@@@p@@@p@h@N@ @@@@@@@@p@@@@@@6@"@6@@@ @d@@h@@@:@@@@@@@>@$@V@p@@@@@p@V@h@@R@@@X@@@(@@@T@@V@@|@L@@^@.@d@ @n@8@r@8@@@@P@@@@&@@@@@@ @R@@@@@@@@@@@@R@@@@@r@0@8@@L@d@@t@f@d@@@@j@@|@N@ @,@@@@@@@@z@H@8@@@@@@@@@@@@@*@J@F@@@@*@@@"@N@(@>@f@,@0@@ @@*@@Z@@@@@8@@D@@@8@B@@\@x@@@@@@@(@@ @n@@@>@*@L@"@,@@@T@6@@@@@@@@l@x@@<@<@@@@@@@j@\@:@@R@@@@@D@@R@@@@@@.@@@@|@j@@@P@@@@@d@@@@@@@@@@@Z@f@L@@@@ @@@@@@@@@@T@@@@@\@@b@@p@8@@D@4@p@0@@@@|@D@@@@<@@@@@,@@@@*@@R@@@@.@@@@@@@z@@8@@0@0@@@@@@@~@4@P@v@@@@l@<@ @@@@@b@@6@@@@@@@@$@2@@X@z@@j@l@@&@@r@@@@@b@r@@P@:@T@@@@@@@@@@n@T@>@@@@@@@@@@@@0@$@v@@@>@ @<@@j@N@@@ @@@&@8@,@@P@P@@@@@@@X@@h@r@@@@@@@@@@@@@<@@@N@@@@@@@@@@@@@2@,@@@<@@0@@D@J@d@@@@@(@@&@@.@@@@.@@@@V@@)@d@t@@@ @ @@`@@R@@@@>@@*@@@@@@@@@@N@6@*@@@@@@@@@@@6@B@v@@@@@l@@*@@@N@@Z@@@5@0@L@t@@@@@@@@v@@@0@J@@z@@@@@@@@@@r@F@@,@@R@@@@@@@@@@F@.@T@@@@f@@@@4@6@@@@,@@8@@@@@z@|@@@"@@@@l@=@J@,@@&@^@j@@@@@ @@^@h@&@@\@ @*@D@(@6@@@@x@f@<@@*@@@ @@@@@@0@p@@@.@ @|@@@@@#@@C@/@@S@@@0@"@@@(@@@X@r@R@>@@@z@&@X@l@f@f@@@^@0@l@J@$@@@@@@@\@ @@@@@@@Z@2@@T@^@@@B@8@ @2@T@@8@J@@@^@@@@&@@@@N@@@@@@@x@@2@@N@@h@8@@@l@f@H@\@>@>@F@*@n@,@@@@@`@^@6@*@ @@@@@@@,@@t@@(@ @@@@2@Z@@@@@@@J@d@@ @<@ @@D@@V@@@0@@,@@z@@L@<@ @>@@n@@@@$@&@@@@@@@@@@@@@@@@D@@,@8@H@f@@@P@8@ @2@@@@ @@.@.@@@v@@@~@@(@@P@N@@@@@^@@@@H@0@@@@@@@j@b@@`@@x@8@@@@x@j@d@R@,@@@@@@@0@\@n@@@@*@x@ @@@:@=@5@@@@Y@@r@@@,@$@\@n@@@@@(@@@r@(@@@@@@@@@@@@@@(@@@@@@@@@@@@@@@t@:@N@b@0@L@6@@@@@@@@@@@@@@V@:@@]@6@$@!@@@4@H@O@z@@D@@@T@@V@\@@@@@@@@@@X@(@@@@@n@h@J@&@@@@,@@@H@`@@ @.@h@t@@ @n@R@@ @@|@@@|@@D@(@@@@@@@@@@~@@@4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T@<@t@v@:@@@`@@@R@@@@n@@@@Z@@@@J@@@@.@i@C@@@@B@H@@@@(@@@@2@&@@@@@@@|@^@@0@@@@~@X@>@@@@@:@>@b@@@@ @B@@@ @ @@@@%@H@:@@\@,@@@p@@@@<@@L@ @@@v@n@@4@@@@@@@@@@@@,@@"@@@@@@@@@@@@@@V@ @4@t@@@@p@@*@J@@8@@@D@@@@&@@~@@D@@@@@@6@h@P@@n@@@@@@^@L@@ @@@x@x@(@@@@@@@ @@@@@r@d@.@ @@@&@4@&@@h@@@@x@@B@@@ @@@g@@@<@@P@@~@P@@@@@\@@@@R@D@n@2@@@@@@@@@@@@@@@@@@@@@@ @@@D@@@@@T@,@@@\@4@@0@@@@@|@@P@(@@@@@@/@@@@@@@@@@4@@@@@@@@@@@@V@0@@@@@@@@B@2@@@`@@@@ @@@@B@"@j@@@(@\@@@@@@4@!@@@ @m@@@@@@@&@@@@0@@@*@@@0@"@@@@@@2@@@@@@@@@@@@@@@@@p@@b@@$@.@@@@@@@r@2@@F@@z@@@@$@@@@@@-@@@{@@j@@6@[@+@@\@&@@@@@@@@@@@@L@*@*@@@$@@@r@@@@z@h@<@@@"@N@P@@@@@@l@@@~@@^@@h@@@@M@@"@@@b@@J@@p@@@@@@`@x@@n@2@V@@^@@@@$@@@@@@@@@@@@@@@@@.@4@t@ @4@@@@P@@@@@@@X@@@@@(@@@@@Q@@@@@@j@$@@Z@k@B@@@@t@z@J@@@,@~@@@@t@@@@(@@@@`@(@@@@V@(@$@@N@"@@@@@*@@@@@@@@@@@@s@@O@&@@@@@h@@@.@@T@D@@@@^@b@@h@@@@@@@@@@@@@@@@@@@@@z@d@@(@@@@@.@@@@R@@@@@@@P@@*@H@@<@@N@h@@3@@@ @ @@@3@@@Z@@@@@@ @"@@@@@@h@,@"@@@@~@,@@@@f@(@@ @^@@@@@@0@x@@@@@v@D@@@@@2@'@@1@T@@@"@@@@2@@@@@@@@@<@@@@@@@@@@@@@@@@@@@@.@@@@|@@@F@@@@@@@,@@@@@@@@@p@N@,@>@@@r@u@G@\@:@@C@@@@@@@@V@@&@@,@z@6@@X@P@@@X@R@^@Z@L@.@@@H@2@@@@2@@@>@@@@>@@t@@@@@ @@@*@h@@@(@@@@|@@@]@@@>@@@p@@@@@8@@@@@@@@@@@@@@@@@@@@@@@@@X@@"@^@@@@@@@@@@V@@@@@@@@F@h@@@.@j@V@B@L@@@@@"@@H@>@@@@@@@@@@@B@@l@X@N@@@@@4@@@@H@ @@@@8@ @H@@@@r@@t@@@@@@@@@~@$@D@@e@@-@R@^@@P@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@|@@@f@@\@8@J@*@6@@L@V@@P@@@@@@@@@ @*@ @2@8@@@@h@L@@6@J@@V@j@@v@4@b@$@@@@R@@ @@ @"@F@l@@t@^@P@@@@`@@@@@>@@<@z@@@@@t@@ @@@@^@v@@@@@^@@@@@H@@L@(@@h@X@@@p@@@@@@@@@@@@@2@@@@@@@@@@@@@^@@v@@@@@@@@@@@ @@@@@@@@@@*@@@@R@@@r@@*@@@,@@\@6@x@@@d@@@@@@@R@b@8@D@@@@@@@@<@@@@<@@@@@J@F@2@@b@@@ @`@@|@@@@@4@@^@(@@@@@F@@x@@D@?@@,@R@@@@@@@@@@@@@@@(@@@@@@@@@@@@.@@,@@@v@z@@J@j@@@@@@@@L@@@@@@@@@6@T@@>@@@@>@@@@@n@@@ @0@4@J@<@P@@@b@@@@@R@@@@@@@@N@6@@X@,@@@l@>@@@@~@h@|@@@,@:@"@@@L@@@F@4@@@@@v@@@>@W@c@x@<@@@@@@@@@@@@`@@@@@@@"@@@@@@>@ @ @@@@@(@(@@T@@@|@@d@v@@@@L@@@<@4@@Z@r@@@|@@@@@@@X@@:@@@&@H@4@@@4@0@@V@^@0@T@@@V@@<@Z@v@@@@@X@@@:@@h@.@@@@x@2@"@@X@@@@v@@|@@@x@@F@@@L@@@z@~@@@@@$@@@@@J@@@@@@@@@@0@&@@@@@ @@@@@@d@&@b@@@@@,@@@@F@@h@V@@@@@0@X@@@l@@@@"@@&@@F@@t@t@@@:@@t@@@@@@@z@@H@@@@t@@@l@-@Z@`@@@@ @&@(@p@6@@@@@8@@@@`@@@V@P@@ @D@@@@,@@"@ @@X@v@@@@@X@L@@@@@:@@@@B@@$@@@@@@@@J@@@@@@@@@@@@@@l@R@l@@ @(@8@x@@r@d@0@v@@r@Z@@@h@@@@@@(@@V@@@@4@@,@@@@@.@@@@<@@@N@@@j@@n@@@@@@@(@@@J@\@@f@\@@@@@@@@@@t@^@@z@J@@"@J@@@@ @@@t@J@@@@@@`@$@@@ @f@@P@@@@@@b@@X@@@@@@L@@@@@@@@@@x@R@@2@@@@@h@v@@8@@6@b@@r@<@j@@@T@~@@@@@x@X@8@B@L@@@@@R@P@@@@@@@@@@@@ @,@@<@h@@n@@@@@@~@N@L@|@@@v@H@@@`@@@.@@@z@j@@^@j@@@8@@@@@*@t@@@@r@>@@@<@@@2@N@@B@@@@b@N@8@@@@&@@@@@@@@@@@ @ @(@@@@@@@@@@@`@@@t@*@@@@@h@@t@F@2@@L@@b@p@@@$@@@@@@x@@@z@v@@@@@@ @@@z@>@"@2@@@@@@@@&@r@@ @@@@@~@,@@@D@@@d@Z@@@@@l@@@@*@p@x@@@ @@~@@@@@@@P@X@j@@@@@p@~@@z@<@`@*@@@@V@(@(@@@@@@@@@V@@L@^@P@@@@@r@@@@n@@@<@X@@ @@@@\@@x@@@P@:@N@@b@|@d@@"@F@@@h@>@|@:@(@@`@@@@@@@@@@@@0@@@@@v@c@@@@@@@@@@@@@@@*@@@@@p@h@@ @@X@x@@@6@p@:@0@@@@@@z@@@5@@`@@@ @@^@@~@V@@@@@v@@@@@@@@@@@@@L@@4@@R@@@|@@@@@N@@*@n@8@*@@@2@@@@@R@@^@@@@@@@@@~@@N@@@@@@@@@d@n@@@@F@@T@@v@@@@@D@P@C@@@@d@6@@T@@@n@@@@@@p@F@n@@@@z@@,@@0@l@>@@@^@@|@@@t@2@@@7@w@@@M@s@@$@@@D@@@@D@(@@@@@b@^@@@@(@v@@@&@@@4@@@@@z@@B@@@@@N@J@h@P@P@,@@@@@v@@@@@@X@@L@@@@@@@P@@\@<@@,@@@@&@@@@@j@@@@@@@R@@@L@@@@:@@z@f@@@@@>@:@v@@@.@v@@@@@:@@@@8@@@8@ @@@*@@@<@@9@@ @Z@@0@@p@@.@@@t@@@@@@@@8@r@@@`@@@@@@@@ @ @@@@@f@@@@@@@@L@@J@@R@@@@@r@@@H@:@@V@@@@@@@f@r@T@H@0@v@@@@@@@@@1@[@@`@@@@@L@@@V@@@f@0@@@@@N@h@@@@@@8@|@@@@@@@@H@@@@@@]@ @@U@@@9@@@P@r@D@@@ @@@@r@x@@@6@@@@$@@@@~@P@@@@@@@b@@@@@@@>@@@@x@x@@X@@0@@@"@@j@d@x@@@j@L@!@N@@P@@@n@@t@8@@@^@.@@@@p@R@@@@ @r@e@2@@@@@$@@@@@l@L@@@@@b@F@@"@<@@@d@@@@F@@@@@:@F@@@t@@@k@@j@@E@@@@@@@L@@x@@z@d@@@@ @@v@f@$@P@^@X@B@@@:@@@@@@@@@~@@@0@4@f@@@A@@J@j@@R@@@T@`@l@ @p@"@J@@\@8@d@@@~@@T@<@v@@@@@@@@@@"@@@C@.@:@D@@@\@@@@@@@@2@,@@@t@@*@\@@@$@@@@@@|@ @@h@@@ @b@@%@Z@H@@@;@@f@E@!@@x@@~@a@;@@@@@f@@@J@2@@@@i@l@H@@@\@@@@@ @@@ @@@@H@ @ @t@@&@N@,@@n@t@@!@@[@@Z@3@@@@@"@8@,@@@@@@@@@@@2@@@@@@@@8@@@\@ @@@@l@@@`@@@@v@J@,@@@@@0@2@@ @@@@ @d@@@@0@@@@@@@*@@@@R@@D@}@@@~@@@@@@l@ @b@@@@6@B@@@"@@T@<@@6@@j@d@@@@@@t@>@@@t@@>@V@(@<@@4@`@@@@@@@@@e@J@@@d@@@r@"@@@Z@ @x@p@@@@@b@@@@@@@@@*@J@ @D@@@0@@x@@@@@N@$@6@@@@@@:@n@@"@@@@r@@@@@@%@j@@@@J@Z@@ @@@I@S@@@ @@@@t@V@F@*@@@@|@@@d@8@@@@d@n@@@@j@@@J@v@H@@@T@J@p@v@P@@@@@@l@@,@&@@@@@@@#@@n@@H@T@P@@@@@@@@L@r@f@"@@@@&@@@|@>@@V@p@6@z@@@B@@@@@<@@@@@@@b@@h@"@@ @&@@@P@@@|@@@|@@@@@@0@@@@b@@:@r@R@@@@@|@@@@>@@@@l@ @@@0@@2@<@@v@&@(@,@@@:@@ @@@@@Z@l@@@ @@H@@@X@@@@@i@@@@h@@@(@|@b@@R@@@@>@@@>@2@@$@@@*@@z@@V@I@~@@P@B@@@@@@@`@B@h@@@@@@x@Z@n@@4@(@@@@x@@@@@@@@@@L@L@@@@@^@z@@r@,@x@@@@@~@@V@|@@d@@@@Z@@@@@@0@D@@z@@@@@@@,@ @@T@@@L@h@\@@@@v@@@z@@@@@@@*@@P@@!@@@,@&@@@@@@8@@@@ @H@@@"@@@@@@ @N@@@@@@@|@@Z@@:@@@@@@l@P@L@@@8@R@@@T@@2@h@^@N@8@$@8@x@@l@@@@@@@z@@@@@x@X@@@D@$@@@\@@@@@<@@@@@@@@@@:@N@@@@@@"@@@@@h@l@~@~@Z@@@@@@@6@j@z@@T@@@@@=@@@@N@@B@\@@b@@@@@@6@@@@@@@@|@@@w@@@@@~@P@.@*@@@@@@@@b@*@@@@@@@@@@>@@^@R@8@@J@@J@|@F@@@@@@:@N@|@@@ @P@(@8@@@@[@@@@r@X@@@@@@@@@@@@@@@@@@X@R@@@H@\@f@|@@@@ @@P@ @@@@@)@+@@@x@@9@@@@l@R@@J@N@<@@@@t@@Z@@'@@!@Q@@@J@@@@N@@Z@P@(@@@@@@@@@h@N@,@8@@@f@@4@ @@@j@@n@@@4@T@"@ @@1@@t@z@v@@(@@@@@ @@j@P@@@@@@@p@@@P@0@ @@@@@@@@@X@@@@@f@@6@b@@@t@2@j@@@d@@@@@@@@d@N@@@b@@}@k@@[@\@@@@(@@V@@@@B@@6@@L@@@@@@N@@X@~@@@@@d@J@ @ @@@@@@@F@~@8@2@@@,@J@~@@J@@@@@f@T@p@2@V@@<@@h@@@^@@@@@h@@@@@@0@@$@@@T@@3@@j@@V@@@@p@@@@@@"@@@@R@@@2@V@*@@@8@@@&@B@X@@^@@@@<@4@@@q@I@)@r@@@r@@F@4@@x@@f@@X@R@^@@6@@>@J@@t@@@T@@r@@<@ @@@P@R@@@@@@r@@@R@Z@4@@@@,@@@@ @@@@@@@2@P@@@h@N@d@@4@@@r@@@@@ @@J@@@\@@@@@@@L@L@@@~@F@N@@Z@@@@@@@d@@@v@V@@@@@@@@8@j@\@b@h@d@@@f@*@h@@q@|@@@@>@h@@@@v@@@@d@@@&@ @@B@t@^@d@@r@@X@$@p@@f@@@4@@@@,@.@@@@@@H@J@z@@@8@@@@@j@@&@n@@@ @@@6@z@@F@j@@F@N@@@Z@@@@@b@@ @j@@@@@@l@@@X@@@@@@~@0@f@4@"@"@@@@@^@@@~@&@@@@@h@`@B@0@`@R@P@N@@$@@.@6@@@@@L@@@@d@p@@J@@x@@x@^@@*@D@@@@>@l@d@@@@@@Z@4@@@@@n@@$@8@@@@t@@h@>@F@@,@ @@4@@z@@@@@@x@"@R@`@^@@@$@@P@@\@@@@@@@H@@@ @@@@n@@@h@.@@@@@@f@4@Z@:@L@N@8@8@@@D@@@v@@@x@N@@@^@Z@$@@r@\@`@@@@~@@@@P@l@J@@@0@\@@@:@@>@@@.@@"@@@@@B@b@V@@@@@@*@@@@V@f@@R@ @@@@@r@v@Z@*@D@@ @@@ @ @X@@@@@@^@(@|@X@\@@@(@@v@@f@.@@@<@v@b@@4@R@@d@@@@@&@(@@@@@@@f@P@<@J@d@F@@l@R@@&@@@F@@@@h@@,@@@@@@N@@`@@@ @@@@@@H@<@@D@@@@@p@@H@@@@@Z@@@@j@@0@@@@r@v@$@@ @@@l@D@@z@$@0@@@@~@v@h@:@P@2@@ @@@@4@x@@l@@@&@@@n@@v@@@0@@@N@d@@@@(@\@@@@@@N@@f@4@8@@@@@@^@&@L@4@H@D@x@d@@2@@$@@@@@@:@h@@@@v@>@v@@:@R@T@@@l@@@@P@z@(@@@h@@@@@@8@|@B@@@t@@@@@@@@@r@@@v@@@@@@t@`@8@@@b@&@@@@@R@l@>@H@*@@@@@@&@@@@@@@@@@`@d@@X@@@d@*@@>@@.@P@f@:@7@@@#@@@@@D@@@@@@@T@@@@@@@D@6@@@@@6@@<@@@4@@@|@@@r@D@\@~@`@@@@@@@@@@@@.@Z@@ @@b@@@D@@\@.@h@|@@@@@@0@t@N@p@v@P@~@@@f@(@@@@@L@@@@@|@@D@H@P@4@@@@@@@@@P@F@@@@@@x@T@z@@@@@@@@@@f@@@@@@9@~@@~@@@@@@@@B@@@@V@R@F@@@&@@N@|@@@@J@@@@<@@r@P@@6@@x@n@t@P@d@x@@@@@0@@"@@l@@@@@@R@N@v@@@@@@@"@l@@@@@d@H@@@@>@$@@@@V@B@@@@n@>@4@@@@@v@B@P@H@@@@@@@&@~@@@8@"@@@@@>@F@@@p@P@j@@@@@`@@j@@@@:@@z@@@@x@@@@`@N@&@"@@"@J@p@^@@@N@L@@@@@@@@@@@x@@\@.@@X@<@^@@@@N@@v@@@@b@H@@@p@@,@.@v@@@ @@@@f@@@@@@@&@(@@@&@@r@@@@@@<@<@@@@@@v@r@L@(@0@@@@p@@@&@P@d@@@@d@@@@`@@h@4@r@"@@@@x@d@d@@@@@6@@J@@>@@@*@V@ @@8@>@@@@@4@6@`@B@V@@p@@@@@@@@@@@p@f@@@@@P@@@z@@@^@V@@L@@@@@@@b@ @@0@ @@@@J@@D@@@V@@@j@:@B@0@@4@@@@h@2@,@@@@@0@@@@@@n@@T@P@2@@@@j@@@@N@B@@@@z@@@@4@@@@P@@P@ @@@@@@l@@@@@ @@@@@@@@:@L@(@@`@H@@h@N@@X@p@@@@@@@@@@@J@@@:@@,@@x@@>@@@Z@H@@@@2@@@ @@H@V@2@X@@@@@R@@B@@L@ @@@0@Z@@p@l@N@@@@@2@@@\@H@@@@@@@@d@6@8@D@ @"@@D@@@@<@.@@@@@@@@8@@@@@\@@>@@@@:@@@@$@@@$@@@@@@`@@@d@@@@,@@@@@@@@L@@@n@@@@@@@@@@p@@@@@j@@@@D@2@@R@(@@@@ @@l@(@&@\@b@@@@@@@4@@@@@(@@@0@@r@@@f@@@@8@@@@@r@|@f@`@\@H@@@$@@@D@@@@&@ @v@@@@@@f@@@@@@@@4@|@@x@@(@F@.@r@@(@l@J@@@@@@\@@z@@@r@@(@@ @@@B@@@@b@r@@@@@|@@@@@@@X@V@^@@@@@0@.@@@ @*@@R@*@@R@2@@@ @x@@@l@@@@8@H@ @@.@@@N@B@@@x@@@@@b@B@&@@@@@@j@:@X@6@2@B@ @@@$@@z@@@@F@@@@@.@t@Z@@8@ @ @ @x@E@@(@@@"@0@2@@@@&@@@@<@@@@@@j@2@@>@@Z@@@v@@@@@@@@@@@@@@ @@@@@N@@D@F@F@$@,@@@@@n@B@@@@8@@@@F@"@z@@@z@@@@~@(@@@@J@@@@@@R@@@|@B@&@@@@@@@@V@\@8@<@F@@@ @*@@\@@@@l@V@@$@@ @@ @P@<@@@@i@@@X@@t@@B@@@@@@D@@ @@@h@@@@P@@v@@@@@&@(@@@Z@<@*@T@|@<@ @@@@ @r@^@@r@@@$@ @@@j@@@@@@@N@V@:@@|@L@,@@@@@@ @@v@d@@8@@@L@F@@j@2@@ @@@z@8@@ @@@@@@z@t@b@>@@@@@@@@@2@J@n@@@@0@h@p@@d@@@,@@@(@@3@@l@`@@@@@@T@8@<@|@@@V@@@@@v@@x@@@@J@@:@@@@@@R@@|@@4@v@:@@@@(@0@4@@f@@"@F@@@@@(@&@@@2@b@L@@@@h@d@j@@@@f@@2@@F@@@@V@x@@6@ @n@"@J@@@@~@@@H@@@@@@@p@N@6@f@(@@H@@@ @@j@r@@@@:@h@t@@@@@@@@@@@6@u@@a@@@@@@$@@@b@@@@@@@@8@@@n@T@@4@P@@|@@@B@L@@n@@@@@@R@4@@@@@ @@<@@@X@@F@@@@@@ @@@@X@\@<@@F@@h@@@"@@@(@@@@@@@:@0@@@@@p@@@@@@@@@t@l@F@ @.@@@ @ @@@@(@:@@@@*@@>@@@Z@@@@@@(@@@~@@@@N@@f@@@f@~@@@D@@0@@@~@@@\@@F@@@~@@4@ @@@@:@:@@H@(@b@@@\@b@@$@@ @@<@@@B@J@P@@<@@@@@@@f@@Z@t@,@@@j@@@@@ @@@@x@@@^@@@R@@@@ @z@@@l@@@@@@@@Z@\@*@j@6@@,@ @&@ @@$@8@@@@@2@R@@@D@@@@@@@@p@r@9@@@h@@6@@b@`@@@N@\@@@@@P@t@p@@v@d@(@ @@@@@r@@@*@@4@^@@@@@@@j@@@@@@H@@@@n@H@@@@@N@@@@b@@@t@@x@@l@l@@@@@L@@@&@B@@>@R@T@@@@@@D@@ @@@@@x@@H@6@B@0@@8@@@@ @0@R@@@@:@(@n@@@,@@@@^@@@@o@X@@@@@)@@@@*@@N@V@@,@<@b@@*@J@@T@@^@"@@@@@F@@@@@@@J@@@F@@@@ @@@@@@@@@d@@d@@@(@@@@.@@@@@@@@0@:@&@l@ @n@@@@x@@ @@@@z@:@@@@N@6@@@@@v@@h@H@N@@B@@@&@@@@@@@\@@~@@@.@p@\@@@@@@@$@@@@@@@@@F@b@$@@@V@V@@@h@@@@@@@@@@@ @6@h@@X@@@@@:@@n@v@@@@@@@@@@(@@@@@@(@@@@@ @@@@ @@@@@@R@T@\@J@d@Z@@D@@@@.@@`@@n@&@@@P@8@ @@@@@@@h@|@F@8@F@@ @(@ @@@@@@@T@t@@@@(@&@8@@@&@8@|@P@@@"@.@~@@@@+@b@u@@@@@@v@@D@@@@@@@@@@@(@ @@@@@@@@J@T@<@z@@@$@ @@@^@@"@@@\@t@@@h@@@@@Z@@@N@D@@r@@^@@@@@ @^@@J@@@d@@@@v@@@@@@,@@@@@@@@^@z@<@,@>@$@@@ @@@@@@$@F@>@@@@@@$@x@l@$@@P@@@@@@@4@4@ @K@~@@Q@^@@ @b@@@@2@ @@@F@d@.@@L@z@@>@@@ @@f@X@H@T@@@@6@@@"@@(@:@ @>@@@p@X@X@@P@F@^@@@@ @@@@^@\@ @@r@@@@N@@T@@@@@@@@@@@@n@6@@@@@@@~@~@j@n@P@:@D@@ @ @@@@@@@ @@@H@N@Z@@@@@ @@r@@P@|@@@@R@@~@ @@8@@#@@(@t@@t@@@@Z@@f@@J@@@\@@4@@@@x@@D@@@@b@@@N@@@@D@"@@8@@j@V@@F@0@@@6@@@p@|@x@~@@0@@@@@@.@@@@@@@l@0@r@@.@@@@j@@@@`@$@J@@@@@@z@t@n@4@6@"@@&@@@@@@@@@@@@@ @0@Z@@@@@@@@@D@.@`@@@"@@2@(@7@e@@@T@ @@H@@@@l@@|@@@^@^@@@@@@@@@ @@H@@|@@@j@@V@X@@@@L@z@@D@D@@@@@@R@@@X@:@ @@@N@@"@6@&@@v@@@@@@@@@@@@@@@@N@@&@@@@r@~@n@\@>@Z@8@B@@4@@@@@@@@@@@@@@@ @P@J@@@@@@0@@@@@@@8@@@@@6@@@z@ @@N@R@@L@@@&@@P@>@>@@:@v@P@F@@@^@n@x@,@@:@@h@L@P@@@@@T@B@@V@@@8@"@@@@ @@H@.@D@@z@R@@@@@|@P@ @@@@@@@@ @@:@@@@@6@@@@@@p@@`@t@h@8@(@@@.@@@@@@@@@@@@@@@@*@@\@@@@@@@$@@v@ @@*@@,@@@@x@v@ @~@X@$@,@@z@@@@@@`@ @h@@J@@,@l@6@@@@@@R@@@@@J@>@@@@@@@@@(@&@@@@@@@@<@@r@@@@@@6@@@@@@@@@\@@@"@@@@:@@@@@@@|@@h@Z@Z@2@0@*@&@$@@@ @@@@@@@@@@$@ @@:@:@l@~@l@@@@@@d@@@@@@>@@ @*@R@B@@@@X@@N@(@@@@@b@0@T@@@@@z@@^@t@v@n@Z@Z@@@@R@`@l@`@@v@@@f@@ @x@F@:@@@@@@@@@6@p@4@V@@&@@@B@Q@0@.@0@@@@@Z@8@@@n@@@@@@@@@H@0@0@(@D@&@@@@@@@@@@@@@@@@@@@@@*@>@T@*@@@@@@2@L@@2@"@F@l@:@|@@@*@@@@@@@@@@@@@T@@@.@"@@@z@X@b@@D@L@@ @b@@@&@@@8@t@@@@@@H@&@D@.@2@&@@@@@"@@2@@d@@h@@X@@@@@@%@<@@$@@@@l@@F@@@@@@@v@l@8@J@X@4@@@"@@<@@$@@@@@@@@@@@@@@@@@@@@,@R@^@|@@@@@0@@R@@@@@@6@R@@b@T@@d@@>@@@\@6@@ @@@r@@@@@@,@@ @@@@@@@:@@@f@@@@@@d@h@B@@d@@@@v@@\@B@J@N@4@$@:@@@@x@@@@e@@\@@Z@@N@@@H@@ @@@@r@@V@v@R@0@>@,@*@,@@@@@@@@@@@@@@@@@@@@@@@"@@.@j@@@x@@@@@@P@@8@@d@@@@@@@"@@z@@Z@ @@@@@@$@@X@R@@H@:@@$@@@@@@@@@8@6@@@@<@P@X@@0@@>@@@@D@X@@@@L@@ @j@@ @(@]@~@@@@B@@j@@@@@@2@6@@@@@~@@X@v@6@0@B@(@@@@@@@@@@@@@@@@@@@@@@@@@ @@@ @"@F@Z@`@@@@@@@2@@\@ @@@P@@@:@@@@J@*@.@@@@4@j@@N@@$@@h@R@@@@@@@@4@T@@T@@@~@@@@@@B@@@ @d@<@&@H@v@j@*@\@ @\@r@F@.@@@|@@@*@@2@@@p@<@@@@x@@@p@n@F@F@X@@0@"@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@R@`@t@@t@@@@@@@.@0@B@@Z@p@F@@@J@@4@3@^@@@@@@@@H@@@@X@@@@@@@2@>@@6@@d@T@@@ @@@:@@@@@@@@@H@@2@@@@@@ @@@@@Z@D@@@@@@@@@@l@|@Z@L@@@4@V@@0@$@@@@@@@@@@@@@@@~@@@@@@@@@@@@@@@@@J@@j@<@X@@F@r@@@@@@@@@F@8@N@@F@"@8@@@l@@I@@=@%@@`@Z@@L@@@@@&@@@@&@@@V@X@&@@*@6@(@B@@`@ @b@@@<@P@P@V@$@T@@@Z@R@@@"@@f@@@@x@<@4@@@@@@b@@Z@4@V@2@F@:@(@$@@@8@@@@@@@@@@@@@@@r@@@@@@@@@@@@@@@@.@ @0@h@(@B@p@V@@@@@@@@@L@@$@@*@@@b@@K@@*@W@@(@@x@6@n@^@"@@f@V@@J@@ @P@@>@@@.@T@@@@t@`@@@F@r@$@|@@z@@Z@@@@@f@@@@X@@@X@$@@@@@@j@@^@h@l@@J@.@@,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@2@@"@<@6@F@@n@@@@@@@:@@Z@@@@@h@@@V@D@@R@t@i@@@@@@,@d@D@@f@@d@6@*@r@@b@@@b@@@@@@@@@@@@b@@@r@@@B@<@@V@b@v@2@@&@@@@@@@x@N@p@\@6@X@>@,@@@@@@@@@ @@@@@@@@@@@@p@@t@@@@@@@@@@@@@@@@@ @@@ @@@<@<@`@X@p@@@@@@2@p@@@@@@@@@p@.@@@@p@>@`@.@.@@@v@d@@@@@@"@@&@V@@~@@@@P@%@@@@@@\@R@@V@@@@@@@@p@6@@@@@@|@v@f@6@\@B@$@J@@@&@@@@@ @@@ @@@@@@@@@@@@x@|@j@@@@@@@@@@@@@@@@@4@@@@@@(@@8@6@4@|@H@n@@@6@,@h@@@@@.@<@<@@g@J@d@@@@@@@@@@@t@@^@^@R@@@@@@@@@@'@,@@4@@@@@@@D@@@Z@0@h@"@<@>@@@@@@|@|@r@8@H@8@8@8@*@@ @ @@@@@@@@@@@@@@@@@@@@@@@@@@|@@@@@@@@@@@@@@@@@@@ @@.@ @.@V@P@X@z@@@@6@@F@@@~@@@@@@@@@:@@&@@@:@|@`@x@@@6@ @`@2@@y@E@ @@"@.@`@ @@$@4@@h@N@t@@$@@@~@`@@@@&@@@@@@@|@@^@V@T@8@8@6@@H@@@@R@@@@@@@@@@@@@@@@@@@x@h@p@r@@j@p@@@@@@@@@@@@@@@@@@@@@@@@B@6@b@@j@@@@@@@@@t@|@p@@"@ @(@@V@b@F@p@@@@@@@@@@P@@@@ @@"@@@@T@@@@@@@@@v@@@0@@@@@@@@@@@z@L@\@:@L@&@@@@@"@@@@@@@@@@@@@@@@@@@@@@@@v@v@x@~@p@@|@@@@@@@@@@@@@@@s@@@@@@@@<@@N@8@(@T@x@@@@@@p@@@h@t@x@`@(@@ @@>@@@v@x@n@R@@@H@@@@@\@@z@@@@@@@"@@@F@*@@@@@@@@@@@^@V@j@d@6@0@4@(@2@$@,@@@@@@@@@@@@@@@@@@@@@@@@@@@b@@|@@l@n@@@@@|@@@@@@@@@@@@@@@@@@@@@@$@<@$@T@V@r@@@@.@@t@&@@j@,@ @@@@@>@p@t@@@B@l@@f@@@|@`@@@@@@@@@@@z@@@@F@@@@@@@@x@|@@r@v@F@@@J@H@R@$@2@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@\@r@t@|@z@n@@d@~@@t@@@@@t@@@@@@@@@ @@@@@@@@@@@@ @@X@`@@@@@@@@@@@@@@@@@@@@@@@@@@d@@p@$@4@@@@@@@@.@@@@@@X@X@P@d@X@:@N@B@@@,@$@B@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@p@|@n@v@~@n@z@n@@@|@@@@@@v@@@@@@@@@@@@@@@@@ @@ @>@,@j@`@@@t@~@z@V@@~@@@@@@@@@@@@@@@@@@&@@@@@@@@@@@@@@@@@@F@Z@@@D@J@.@R@@ @&@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@l@r@T@@h@v@p@z@n@l@n@@n@f@@n@@@@@@@@@@@@@@@@@@@@@@$@8@4@B@*@$@:@:@:@f@Z@L@d@6@T@z@~@@P@@@n@@p@@@@@@@@@@@@@@f@n@^@v@@@|@@f@N@L@,@6@0@D@6@ @.@@@(@@ @@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@V@t@X@R@T@V@t@^@p@p@r@@\@l@~@@n@~@x@@@@@@@@@@@@@@@@@@@@@@@@@@@@&@@:@@@8@J@:@V@:@D@N@2@J@V@n@l@J@*@j@@T@r@@@h@T@R@R@N@D@0@@<@*@.@R@@@,@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@j@v@j@Z@t@`@@l@l@r@@~@x@@@|@@@@@@@@@@@@@@@@@@@@@@@ @@"@@@:@.@@$@ @,@V@@X@>@B@^@0@P@R@<@:@H@`@b@J@L@V@f@`@b@p@p@n@p@@R@4@B@,@8@B@@>@B@@@@@ @ @$@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@^@^@\@j@T@j@x@v@f@h@^@t@f@r@@n@x@|@~@@~@@@@z@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&@F@@ @@@(@&@,@4@@,@H@(@@$@0@>@,@*@H@4@$@@ @&@@@,@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@H@V@V@d@L@\@d@V@Z@f@^@@h@d@h@^@n@p@@p@@@@|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"@@@@2@@ @x@ @@ @@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@b@\@X@x@^@X@d@X@d@`@^@b@^@p@@x@h@z@v@v@p@|@@|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(@ @@@ @$@@@"@@@@@@@@2@&@@ @@<@ @@@@@@ @ @@@@@@@@@@@@@@@`@@@@@@@@@@@@@@@@@@@@@@@@x@@@@@@@R@l@F@`@^@Z@r@T@^@d@P@b@^@b@l@p@l@j@v@|@t@v@r@r@z@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@^@^@l@X@T@\@f@^@`@p@f@^@`@j@j@l@p@p@j@x@@p@@@n@n@t@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@R@F@Z@^@R@Z@f@R@r@^@\@`@^@f@z@V@t@l@l@x@n@l@z@^@@@r@@|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@sunpy-0.8.3/sunpy/data/test/EIT/efz20040301.030011_s.fits0000644000175000001440000042350013203275053021107 0ustar nabil00000000000000SIMPLE = T / conforms to FITS standard BITPIX = -64 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 128 NAXIS2 = 128 DATE = '2004-03-01' / Date of file creation TIME-OBS= '03:00:11' / DATE-OBS= '2004-03-01T03:00:11.405' / UTC at spacecraft ORIGIN = 'Rocket Science' / Rocket Science = NASA GSFC DATASRC = 'LZ file ' / TELESCOP= 'SOHO' / INSTRUME= 'EIT' / OBJECT = 'full FOV' / BUNIT = 'counts / pixel ' / WAVELNTH= 195 / 171 = Fe IX/X, 195 = Fe XII, / 284 = Fe XV, 304 = He II FILTER = 'Al +1 ' / DATE_OBS= '2004-03-01T03:00:11.405Z' / SCI_OBJ = 'CME WATCH 195 ' / OBS_PROG= '195_10S_AL_1.000 ' / CMP_NO = 1 / Unique campaign instance (1 = synoptic) EXPTIME = 12.596 / s (total commanded + shutter close) EXPMODE = 'backside ' / FILENAME= 'efz20040301.030011' / CFTEMP = -66.71 / CCD cold finger temperature (C) CCDTEMP = 7.34 / CCD temperature (DN/100) CTYPE1 = 'Solar-X ' / CTYPE2 = 'Solar-Y ' / CRPIX1 = 64.5 / Sun center x, EIT pixels CRPIX2 = 64.5 / Sun center y, EIT pixels CRVAL1 = 0.00 / CRVAL2 = 0.00 / CDELT1 = 2.63 / Pixel scale x (arc sec, fixed) CDELT2 = 2.63 / Pixel scale y (arc sec, fixed) SOLAR_R = 372.27 / Solar photospheric radius, EIT pixels SOLAR_B0= -7.22 / Degrees SC_X0 = 0.00 / s/c yaw (arc sec) SC_Y0 = 0.00 / s/c pitch (arc sec; -109.14 after 1996/04/16) SC_ROLL = 180.00 / s/c roll (deg., Solar north + CCW from nominal)HEC_X = -139130208.00 / s/c heliocentric ecliptic x (km) HEC_Y = 46576272.00 / s/c heliocentric ecliptic y (km) HEC_Z = -94896.31 / s/c heliocentric ecliptic z (km) CAR_ROT = 2013.00 / Carrington rotation at earth COMMENT CORRECTED DATE_OBS = '2004-03-01T02:58:26.121Z' COMMENT COMMANDED EXPOSURE TIME = 10.000 s COMMENT SHUTTER CLOSE TIME = 2.596 s COMMENT LINE_SYNC = 'no' COMMENT CAMERA_ERR = 'no' COMMENT IMAGE_OF_SEQ = 0 COMMENT READOUT PORT = 'B' COMMENT NUM_LEB_PROC = 3 COMMENT LEB_PROC = 26 (no ROI) COMMENT LEB_PROC = 27 (no occ mask) COMMENT LEB_PROC = 12 (Rice) COMMENT BLOCKS_HORZ = 32 COMMENT BLOCKS_VERT = 32 COMMENT P1_X = 1 COMMENT P2_X = 1024 COMMENT P1_Y = 20 COMMENT P2_Y = 1043 COMMENT N_MISSING_BLOCKS = 0 HISTORY Version 4.0, 2001 December 10 HISTORY Image linear resampled to (128,128) for SunPy END @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T@@@@@@@@@@@@@@@H@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|@r@@v@l@x@l@j@^@h@n@p@j@N@d@V@V@n@X@X@^@X@X@T@P@Z@^@N@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@p@@r@~@@t@l@v@~@l@Z@p@f@f@l@Z@h@N@z@Z@T@j@R@\@N@J@X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @,@@$@@@"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@~@z@|@@@h@h@j@|@d@x@Z@d@n@b@`@Z@X@V@d@X@Z@J@T@`@T@R@N@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&@@@@@0@@@@@4@,@ @\@4@&@(@$@8@D@@@.@8@<@@ @.@@$@@"@@@@@@@@@@@@@@@@@@@@@@@@@@@z@v@x@@v@z@n@v@r@l@x@d@`@j@d@^@Z@V@H@X@^@R@\@R@L@R@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@&@@@ @@@@@\@>@F@^@4@@b@P@8@D@<@N@>@:@D@2@"@@@,@ @@@@@@@@@@@@@@@@@@@@@@@v@@z@@@@p@z@d@h@l@r@d@f@T@^@d@d@j@`@Z@n@V@b@V@L@P@b@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@ @@@ @@&@@.@@ @8@$@@$@@@@$@H@J@@r@V@~@d@X@v@Z@<@0@ @"@&@$@4@,@@"@@@*@ @@@@@@@@@@@@@@@@@@@@@@@n@@@x@n@z@v@x@|@h@Z@b@V@v@`@`@V@`@`@\@`@R@Z@F@X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@ @@@@@@.@X@@*@,@ @J@>@@R@8@.@J@>@`@x@@@@@@@@@@l@l@d@d@P@b@p@X@J@H@H@^@R@Z@ @@@@@@@@@@@@@@@@@@@@@@@@r@r@@r@j@n@t@j@r@l@l@h@h@h@`@V@j@V@d@F@R@B@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @H@.@*@R@:@(@X@2@@:@(@D@6@@d@`@p@@@@@@@@l@@Z@f@@|@~@t@h@~@R@L@v@b@$@@H@&@@@@8@@@@@@@@@@@@@@@@@@@@v@@t@~@d@z@n@d@f@h@b@d@f@j@^@P@^@X@V@T@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@$@@@@@"@8@@D@N@T@^@8@@`@N@v@X@@@d@@@@@ @>@@@@@@@@r@@@@@t@@@@f@^@V@H@.@@@2@@@6@@@@@@@@@@@@@@@@@@@@t@|@v@l@@v@N@t@h@j@^@d@V@b@h@l@X@L@\@d@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*@@$@B@@H@B@(@l@@T@r@`@z@@p@n@@~@@z@@@@@@@.@,@@@8@N@2@@"@@@"@@@@@@@@@@@l@h@^@v@P@`@L@@@@@@@@@@@@@@@@@@~@@@@~@@f@r@^@j@n@r@f@b@`@p@`@`@d@X@\@\@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@$@@ @@0@R@B@R@D@8@r@@@@j@v@@@@@@@@@@@@f@P@@@|@@v@4@@@@@@@@@@@@@@@v@@@j@`@h@j@*@@@@@@@@@@@@@@@@@@@@@@@@j@p@n@t@f@R@^@p@T@n@V@\@X@T@P@@@@@@@@@@@@@@@@@@@@@@@@@@0@@@8@@@@@^@,@`@`@J@h@@@@@v@@z@@@@@@@*@@@(@@N@@@@@@v@@(@(@@@@@@@@@z@`@z@f@@$@@@@@@@~@@@^@6@ @ @@@@@@@@@@@@@@@@@@@@@@n@f@j@p@d@l@d@p@P@d@^@f@N@b@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*@@ @>@@@F@v@N@`@@@@@@@@@@@@@@@X@@:@^@~@r@~@@6@b@J@@@@d@@4@@@X@ @N@@@N@@@@j@0@&@Z@"@@@@|@t@@d@,@>@@@@@@@@@@@@@@@@@~@@z@|@@h@l@h@v@l@b@x@l@L@j@b@V@V@@@@@@@@@@@@@@@@@@@@@@@@ @@6@@@D@@@0@$@Z@R@B@@t@@@@@@ @:@@@@@x@T@X@@Z@@@@@@@`@@@|@f@2@@r@@h@@@@|@Z@p@@:@@@@@n@b@\@@@@@@@t@6@@@@@@@@@@@@@@@@@@|@@z@@@@@^@j@l@\@d@f@Z@^@`@X@h@@@@@@@@@@@@@@@@@@@4@@&@8@@@@L@<@P@`@2@D@\@X@@@@@@@@@J@X@@@@@H@@@@"@@@8@T@:@V@Z@@.@@@`@@L@@|@L@r@@@@@@@p@ @@<@@x@@@j@@H@:@"@@@@@t@4@0@@@@@@@@@@@@@@@@@@@@v@t@@j@@t@t@p@d@b@X@Z@b@@@@@@@@@@@@@@@@@@@@@@@@@@B@@&@L@D@`@v@Z@@@@@@@@@2@n@@@@<@@d@@@d@n@@@Z@@@@@@@@@@@@@@@,@@@f@Z@@,@@@ @@:@@@@@@n@@F@@@@@f@T@2@@@@@@@@@@@@@@@@|@@@@v@@z@@d@j@r@t@j@N@b@t@@@@@@@@@@@@@@@@@ @2@@@*@@*@F@&@J@`@D@@f@p@@@@@@ @@>@@j@@@@b@@@@*@@F@@@@@@@D@@L@@T@@@@@@X@@@@y@~@:@@<@@@@p@@f@@x@@@@2@@@@.@(@ @@@b@>@ @"@@@@@@@@@@@@@@@p@@|@@p@z@z@r@v@d@n@Z@^@\@@@@@@@@@@@@@@@@.@ @>@ @@(@,@>@<@4@p@X@b@@@@@@D@@ @n@~@@@@ @@Z@@@@@b@H@@v@z@"@@@@@@l@l@@d@@y@@@\@~@@@6@@@@@@2@@@8@@A@@@@T@@ @@R@@@@@8@@@@j@^@>@.@@@@@@@@@@@@@@@@@|@@|@@n@b@b@z@Z@v@@@@@@@@ @@@@@@ @@:@@@ @@,@ @6@F@6@v@p@z@@r@@@@0@f@R@@@@P@$@r@@@@@@@0@d@@|@@ @,@Z@2@2@@@@@*@@*@\@,@\@@@X@ @@@@5@U@@@@c@Y@@@@@b@6@@@P@@@@b@X@@@j@\@L@@@@@@@@@@@@@@@@@@@~@z@r@h@b@p@l@f@p@@@ @@@&@@(@@ @ @"@6@0@$@D@(@j@*@L@t@p@@@`@@@@$@@8@>@H@@@@t@X@@@2@@@@@p@Z@@@R@@l@@@@@@p@@@@@X@r@T@@:@6@@v@@$@6@t@@E@@@@y@@9@@@&@@ @N@@6@@z@J@<@@z@V@ @@@t@J@(@.@@ @@@@@@@@@@@@@@@@@|@v@t@Z@Z@t@@@ @@@@@@@@ @*@$@@,@N@ @F@D@H@`@X@|@z@v@@@@,@"@2@@@ @8@n@@@@8@`@^@@4@"@@@@@>@@@@@@@N@F@@@@Z@@@@@@H@@V@@@6@@b@@@@@@@i@ @@@&@@^@@z@|@ @@@X@ @@@h@@@@j@Z@@@:@@@@@@@@@@@@@@@@@@|@@z@p@p@x@@@ @@@@(@@@,@@ @@$@4@Z@,@X@N@\@~@@@@@@@"@z@@@6@ @@@@@@@$@.@@j@@<@@@@@@F@@,@@B@@@@@@@@@D@@@@@.@z@@@&@@h@@@@b@@@d@@@@'@@@@t@@@@@4@6@N@R@ @@@@p@\@F@"@@@@@@@@@@@@@@@@@v@~@@~@n@t@@(@<@@*@@,@F@$@:@H@2@X@<@`@d@F@l@v@@@@@@ @H@8@x@@@.@@.@4@r@@@@t@@@@@"@p@ @&@,@@B@@"@@X@@:@@:@<@L@V@@@@^@@@:@@T@@@@@@@@@@x@@r@@@4@@,@@@@z@@@D@~@@@@@z@T@@@@@@P@@@ @@@@@@@@@@@@@@@@@x@v@|@@D@&@@@@@@(@H@@(@X@8@F@n@>@@j@j@@@@@@8@B@@@.@@@^@@@@"@@(@@@N@@@@@@T@@>@>@@t@@ @@@@@"@@@@@&@@|@*@d@(@@N@:@@@R@*@@@@@@@@@@6@0@V@@@@N@b@&@@@@@@$@@@@r@\@@@@@@@@@@@@@@@@@@@r@x@|@@@&@@<@2@2@\@D@X@Z@\@0@n@\@@@~@@@@@@@D@H@@@@|@@@@@.@d@L@@D@@4@:@P@z@@@@>@@t@@ @@4@,@@@t@*@B@@@@@@>@8@@@@@@@*@n@@x@@@F@@@@@@@@@@>@*@@2@@@@|@@T@L@@~@b@@@@^@6@<@.@ @@@@@@@@@@@@@@@@@~@n@@(@@@@(@(@>@F@d@H@T@b@L@n@@@@@@@@X@ @z@@@T@@@>@@@v@(@B@V@@.@h@v@J@(@@@@@b@T@"@2@@@@\@@@@@P@L@@@@@t@@@@@@@@@@@@@@@@@@$@@@@N@@@@@@@@@@h@ @@T@@@@$@@@@\@<@J@@2@@@@@@@@@@@@@@~@@r@&@.@"@,@.@:@>@D@6@`@@@P@l@V@~@@@@@@&@@H@@p@@@f@@L@@~@@@v@t@b@@@@@@@`@@@F@@t@@L@@@@@N@$@@@@@@@@n@x@@~@l@@@@&@f@@h@@@@@N@@&@`@B@@@@@b@@@@@@@@@f@@L@@ @~@ @@@v@f@L@,@@@@@@@@@@@@@@@@@~@t@6@F@4@^@b@b@@@@@@@@@@ @@(@ @@@X@@@@`@@@8@D@b@@@@@0@@@@@@z@@ @@@\@@@x@@@@@@@x@f@Z@X@@b@&@@@@@@@@@@@@@@@H@^@@@@R@@@@@@@p@@@@@@B@*@@@@@@@@@@@@n@D@.@>@ @@@@@@@@@@@@@@x@@,@n@6@P@@@H@b@Z@V@@z@@v@@@@@@@$@Z@`@@@@J@t@@"@,@<@@@@@@@@@@@h@@F@@@@@@@@@Z@T@ @@@@l@*@@ @$@V@X@@@@@z@P@@@n@@@@@@Z@@b@@>@:@2@@@@@@,@@p@@ @R@,@b@B@r@b@@@@R@@@@~@d@X@T@$@4@@@@@@@@@@@@@@@,@H@`@X@x@N@t@@~@\@n@@@@@@@F@&@.@@p@@@<@@@@@@(@@\@@@@@@@j@v@R@~@@@X@@@@@@@@@@@@@@8@@^@4@@@@<@@@@@@B@R@@@.@,@@@X@@@ @@@@6@@Z@@@^@@ @@@@@F@@@>@@n@@@*@@@z@@h@^@8@6@2@@@@@@@@@@@@@@`@~@|@^@@@@@@@@@@@<@ @:@v@@@J@@H@@@@@@@@@@@@@@2@@@@f@@@(@@8@@@@v@"@J@j@@@H@\@@|@t@Z@@P@0@@*@6@@@@@@@@@@@@@@j@@n@@@2@ @@@4@v@@@@2@@@@@H@@@4@@T@@@@Z@8@@@@@@v@j@P@@"@@@@@@@@@@@@@@Z@L@Z@v@X@b@@@@@@@@2@r@L@@~@@@X@X@@P@@@@@8@@@@ @@@@@@@f@@@@@@@8@2@l@@@0@@@@@@ @$@@@&@|@@@@@@@@4@Z@@@@8@R@&@6@@l@"@8@@@@F@x@Z@@@@r@8@@x@@R@@,@@@b@@@@l@@@@@@@f@Z@@ @"@ @@@@@@@@@@@@~@n@@@@@@@@@@4@r@@@@@@@@@ @f@@@f@@0@@@$@@@@@@@@@@@@@@@n@L@x@N@@@@(@@@@V@b@z@ @@@h@@$@ @\@@b@*@\@f@:@r@@@@@@@v@@<@@\@n@@@@@@@@ @@N@*@@@@@@@N@@@j@@@@@@n@N@N@(@B@@@@@@@@@@@@j@@t@@@@@@@.@@&@X@r@@@8@X@0@ @H@@0@@@@@@^@h@@@\@@@@@@(@@@@z@h@@@@b@^@@@ @0@X@@<@@b@@H@p@@@@j@@@*@L@ @H@@.@@ @$@@@ @@@@@T@@@@@&@@@@@@@@@@|@@@<@@@@<@@@^@8@"@@@~@@x@P@H@8@&@2@@@@@@@@@R@@@@@l@@@@@ @@Z@l@@4@x@^@@@@V@,@r@@^@@@|@@ @G@v@>@@n@@@@@R@D@@@P@ @<@6@*@R@r@D@@0@@@@@@4@@H@(@@H@`@P@@@@^@T@@@@ @,@R@@L@@@P@@\@<@@@@@@@Z@@@H@2@h@^@@@@"@@:@@f@@@@@@@f@P@f@:@*@(@@@@@@@@@@@@@@@@@*@2@@h@@@@P@@ @ @@@@@n@@@ @,@@@@@J@@@p@@:@@@@b@@@@@@0@X@*@X@\@@@@@d@d@@@@@@@2@@@N@z@`@@@F@^@R@@@@"@B@&@4@j@t@@@@@@@@X@@F@@@@(@@@@@@@@@V@@Z@@j@0@*@@@@@@v@H@|@F@6@$@@@@@@@@@@t@@@@@@ @:@@@@:@,@~@@4@B@@@>@@@l@&@@j@j@4@z@@`@J@@v@R@"@@@@@8@ @@@@6@@(@ @.@@@"@@~@.@@h@@ @@@X@@l@8@.@F@d@D@$@@n@d@$@P@@@&@@v@@p@`@@z@@h@"@p@@D@@b@@@@@L@Z@@@~@@@@@h@(@<@@@@@@v@@@p@Z@.@@@@@@@@@@@@@@@@l@>@~@@,@@@@ @@N@@@@@L@@X@@@@Z@@0@<@@@`@@@@@V@@@@@@H@@z@l@@h@\@@@F@n@@^@@B@@@@ @ @@@@@@@@2@@@@@@@6@h@@@@@@h@d@@"@@T@ @*@@@@L@@L@@n@ @h@@R@@v@L@&@@@@@@@`@@d@L@(@"@@@@@@@@@@@@B@.@z@@@ @@@@h@D@@ @@@@|@@@:@t@b@V@~@^@X@@@@@@@@l@n@t@@@@$@@@@J@4@"@@@T@H@@@@0@`@L@@@@@*@@@@b@@@,@@@@@@@@@~@@f@4@@@@~@(@@@@R@@@@@@@@.@n@@"@d@`@@@X@R@D@@@@@@@@@x@b@.@>@@@@@@@~@@@@@@l@X@@@@P@L@@@@V@@8@@j@@|@@@@j@ @|@p@|@l@@@@@*@,@h@\@0@@@@@@@@@@@z@F@v@*@@$@"@ @@@@@6@2@V@Z@@@0@@`@0@@j@@v@r@@8@~@@@@@@n@@@d@@,@@$@@~@@@L@6@2@&@@ @R@@@@R@:@@,@@@@@@@@@@B@"@@@@@@@@@@@@.@.@n@@@4@&@@8@&@n@ @@(@@@@L@@@8@X@@@@"@@ @@@@>@ @ @@@D@@@@@ @@@`@@n@T@R@ @@X@@N@@@@@@,@&@J@@ @@@@@2@*@"@@@|@@@@H@@ @@@,@L@@@@@@3@#@ @.@`@@@,@@@@@@@@@@@@@@@@@@@@`@F@:@@@@@@@@@@@4@$@@@@t@8@@@@@@0@n@X@:@@@@@|@@@@>@@@@@@R@"@@@@@@@@@@@@@d@,@ @6@@@@:@@@@@@@@@D@|@@@@@@@V@*@v@@@0@@@L@@h@L@@@p@l@@L@D@@@@N@@@x@@H@~@@@h@@@@p@p@8@.@:@<@@T@:@4@@@~@x@r@L@,@ @ @@@@@@@6@@@@@4@:@@@@@9@@@@@j@@@^@@@@@$@@ @@@P@v@"@@@`@*@j@@^@@@v@t@v@h@(@@@@@:@@@@@@@@@@&@H@2@6@*@@@@@@@&@@@L@@@@v@@@@@@F@@@@ @@@/@w@@R@@@4@@2@@@@0@n@L@p@H@0@2@:@@ @@@@v@t@@@R@2@(@@@@@&@@D@@n@@6@Z@@@z@@@@@B@R@f@q@@ @8@@N@J@@@r@J@@@<@@@@d@T@@L@,@8@`@@h@ @@"@ @@@@@@"@@@@@@@@@@.@2@T@J@J@@@@,@@@@@ @@@@@z@@T@@6@@t@@@@z@n@@@@w@T@@@t@Z@@x@@@@@@f@`@n@t@@R@$@@@@@~@j@<@6@@@@@@@@`@N@@ @@@@@@@@@@@@@@@ @0@(@@@L@x@@@@@&@@p@b@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6@d@4@V@b@6@\@Z@p@@8@@@@@f@@ @F@@@t@@@K@@'@b@'@@@@R@X@@@@j@V@&@4@|@@@@@@@@@@T@&@@@@@@`@H@$@@ @@ @@@@L@@@H@@@@@Z@@N@|@@@@;@"@v@@@@t@@t@@@@@@@@X@@@@@@@@@@@@@@@@@@@@@@@@@@@0@@@H@b@@@.@`@@6@ @@@@@F@V@@@ @l@@\@ @@@@@ @@v@@@@@@@@@"@@@@@@@@@@@@@T@:@(@>@@@v@<@*@ @@@(@@z@l@@@@0@b@@,@X@n@@@@@@@d@@@@J@@B@*@@J@@>@@@@x@@@2@@@@@@@@@@@@@@B@@@@@@@F@@@@@0@*@@$@&@@b@~@@R@B@l@@t@@@~@f@@@N@^@@@@/@d@n@@5@p@@ @@J@@@@@@h@B@r@&@@@@V@@@@@@@@@@@@@@~@0@@@@@@"@z@z@@J@@@@@@@@J@$@@@y@@ @@@@X@@8@@^@f@@@@<@`@N@ @@@@@@@@@@@@@@@@@@@@@@@@*@V@v@h@@@8@x@@@.@@*@X@@P@@2@b@@f@@(@@@@v@@@1@@@!@@@ @@@@@@@@@@@@@@0@>@@@@@@@@^@@@@Z@V@ @@@@V@L@h@@@@d@B@ @l@>@`@P@@H@@@@s@=@@@@b@ @@@8@@@@@@l@:@h@"@@@@@@@@P@@@@@@@@@@@@@@@@@B@@@@@@@@@@@ @@@<@~@@@@6@@@J@D@@@!@f@F@ @7@@@@o@:@@@"@@@@"@@@@@.@@x@L@*@F@ @*@@@n@d@@@@x@B@ @@@@h@>@z@@@@D@@"@z@@@#@3@@@o@@@@@4@X@l@@@n@@@|@@@@<@ @L@"@@@@&@@@@@@@@@@@@@@@@@@H@z@@B@H@F@ @f@@P@R@H@@@@~@@B@@@@R@D@x@@@n@@@@Q@@@i@Q@6@e@@*@Z@@@@`@V@d@@@@n@@@@@@x@@ @"@@@z@X@@@@H@@@@H@b@N@@@0@@N@@8@@@@*@6@@@2@@@x@o@@$@@@B@@r@@>@@X@6@@@@@@@ @4@@@@@@@@@@@@@@@@@@^@@R@@~@>@@@@@\@@@@X@*@@@@x@@L@v@@x@@(@@@@@@@8@v@@K@@@N@@*@j@@@@@@0@L@@@@@L@@@*@.@@@t@4@<@@^@H@@6@@V@@@@@@@@@@@@@6@d@@@@@@@B@d@@@@@(@.@:@N@@@@@@@@V@@T@@@@@@@@@@@@@@@@@\@T@@@^@@@N@<@8@@@x@@@@@F@@@@J@@@v@D@>@|@@6@C@@@2@@@@@@:@@@ @@@@@"@x@@@N@h@@n@\@P@T@r@X@@@@l@@@r@p@B@@@@@@@@@|@@@ @@p@l@4@@v@@T@@L@@@@@@X@>@R@@:@@R@@@@@V@@@@@@@@@@@@@@@@@@@@H@@@@x@h@@@N@"@*@@@B@@@&@@<@@@@@@@@@<@H@@@@b@@z@@@Z@@@@@@@@@@@ @@@@R@@|@@@>@@@@f@4@@@l@6@@@@P@@ @8@@@@f@@X@@@@@@f@@@@6@@@@!@@@@@@D@@>@&@@@@@@@@@@@@@@@@@@@@(@@@@@@@@@>@@@@@@F@@@>@@8@>@V@@j@h@J@@@@@@@@0@&@(@,@@0@@@@@`@4@@Z@Z@@@@&@n@@D@@@@P@D@@@@D@l@l@`@>@B@~@@@Z@@@@@H@ @ @b@@@F@@@@@@@6@V@@@@@@V@@@@[@(@@@@@@`@@~@R@@@@@@@@@@@@@@0@@@@@@@@@@@$@@v@@@@@@@@@@@`@@@@@@t@@@@@Z@@@h@@@@@@@@@@@N@D@:@z@p@"@2@x@<@@@@J@0@:@,@f@r@@n@@@@<@v@@@8@ @@@T@:@>@@@@@F@@x@@@@@4@t@v@8@H@d@@@@@@@@@@&@@`@@@x@@@@@@@@N@@,@@@D@@@@@@@@@@@4@b@@@@@@@@@@@x@@@@@@2@ @D@,@@@@N@@@x@.@@@@@B@@B@@p@(@V@@&@@@8@8@@D@@L@@@<@@8@~@@@@z@@@(@@d@,@@@@L@B@R@@@p@@@@H@l@x@@@F@@@V@X@@@@@$@@@@@@@&@ @@ @f@@@@@@@@~@@@@@ @@@@@@@ @&@6@@@d@@@@P@@r@@@@@p@@X@b@|@@@@`@@L@v@@@@@@@"@@@x@@@@"@@>@,@@@p@@>@r@@,@2@x@@@@@T@z@@@@@&@@@@@N@,@@@|@>@X@@@@@$@B@@@~@@@@v@@@@\@@@f@ @@@@@@D@@@z@n@T@@"@@@@@@@f@@@@@@T@@@@*@@R@F@@@@@@`@N@@@@2@j@@@@ @@n@@@@:@@p@:@~@F@(@@@@6@@@>@h@@@@@J@@@|@T@*@ @@@@@@@x@@@@@>@@@"@(@Z@"@@@@@@@@@v@X@@p@@@@:@@@@@@@J@@D@@@@@@F@z@@@J@7@A@:@z@@@`@@@@@@@@.@@@@@@@@@@v@@@@@f@@@V@@&@"@@*@f@D@@@6@Z@\@@@@@@@@ @,@b@X@@@@@"@@@@@D@@@@,@@@(@@0@^@$@v@@@@@@@@@@P@z@j@d@h@@@@@^@@@@@p@V@@x@@@ @X@@@@@@@@@@@@@@.@B@T@f@@n@@@@@@@@@N@P@@@@@@@D@@@@@@@@@@f@b@@@@@@@@@@p@,@`@r@@D@F@@@j@@@P@@@@(@L@2@@@@@@l@v@@@@>@x@r@@f@@@@@2@ @@@@p@@@@@@8@@@4@@l@j@6@@r@N@@X@@@@@V@@`@X@@@ @b@@@@f@@@@@.@F@@*@,@@9@@ @@@7@@l@$@~@@@@x@@@@@@@@@@@@$@@@@N@`@@@@@4@(@@\@@|@T@@@@@@`@p@@@(@`@$@@|@B@x@@>@@ @>@@"@@B@h@@@@@@:@@0@@@.@L@j@@@@?@@@@j@L@@@R@n@X@R@T@@@N@@@@0@ @@@@>@<@b@@@`@`@x@@n@@@R@.@@j@`@.@?@@@@@@H@@f@[@@@p@@@@\@R@X@@@@@@@@@@F@@8@(@@@@@@^@@\@@@T@@@2@@@b@@@@|@ @p@@@^@b@@"@@@(@~@&@F@@@@j@d@@X@>@@0@@@@~@@@@B@@ @@\@#@%@@*@H@B@^@@P@D@`@@@@L@@@6@@@@@@|@@@@@L@x@~@ @r@n@@<@j@@@@@<@@@@@@?@n@@j@@"@n@@&@@@6@@@H@@@.@@@@@@@@@@@@@D@@`@@@z@@@@$@ @@@@@@^@\@@@t@B@@^@@@@@@@@@@@@t@R@@@@@@@@x@F@\@z@J@@@@@5@@t@@@@@@>@@D@@@x@@@2@v@@@@@@@:@@@@<@~@@@@h@@L@@@n@@@@@@@@J@@@&@P@@@T@@@@@@@B@8@4@@@@@Z@0@@6@@@@"@@V@@@V@@@@@@@@@N@@@@,@@\@.@@@@&@@@@@@@@f@@F@ @2@@@$@x@@ @@4@4@2@v@"@@@@@@/@@w@@0@@T@x@@@0@@@:@ @@\@N@@@@@.@H@N@@@X@N@@|@@8@d@J@!@H@.@@d@X@O@@@@F@@E@_@@@@H@@@X@f@@D@@d@D@4@@@@ @@@V@@@@V@B@`@6@@r@@@6@@@@ @l@@@@@2@@@R@@X@n@2@@@~@@0@4@z@@N@@ @@@f@@@@H@:@@f@.@P@@&@@@@@M@@@ @@@@@J@v@:@@@V@@@0@@@@r@ @R@(@@@ @@@R@@@~@@@@@~@@Z@)@@@n@w@@G@ @@@@@@@@@#@@@Z@@@P@&@4@@.@p@@2@2@@j@@@@@@@L@@d@@@@.@J@@Z@@@@@Z@@B@V@@@Z@j@@@%@@@@0@@@,@@~@@(@@@L@T@H@@@$@@@B@@d@@U@@@@@@@n@:@J@@.@j@@@,@`@@@@@~@j@@@,@@@@@ @@J@@ @@@@@@@@@@@@@@@@z@@@@@@J@@z@@@~@8@@$@>@@x@&@ @@<@D@`@2@@@@ @@V@@@@@@@@b@:@s@R@@@@@@@@@z@F@:@j@@<@(@C@)@@^@@@@@@0@\@@@@@B@@@~@1@t@)@@z@n@B@@@*@@n@n@@>@@@$@$@@@r@@R@H@@@*@@@@@@@@6@@@E@@@@@Q@@@@@N@@B@@@@@d@@I@@@@j@B@8@f@F@D@@@@@|@@@@z@.@$@@@@@@@@r@"@@@L@@:@8@:@@@@x@ @@@@@L@<@@O@&@@@l@V@L@`@\@@ @@@@&@@@@H@}@+@@@@H@@@f@T@@@>@@r@@(@@@j@T@@@@@@@@X@@@,@@@@@@@@2@@*@@0@@,@ @(@@v@@"@z@o@@@@$@@@%@@@4@@x@@N@<@2@@^@`@@@@>@@t@j@:@@ @@@,@`@@@@t@@@@@@\@n@~@@@@@7@]@Y@@!@I@/@@@@@l@@H@h@H@@@f@@@@@@f@@@z@@J@@@@@$@@6@J@b@@@R@@@@r@`@<@&@@@@@(@D@|@@@r@@@@@@@@@@d@@@R@@@@@d@@8@<@@j@d@P@p@D@@@v@f@@@@(@@@@@@@@@@d@l@@@@@@@F@\@d@J@8@@@4@@@<@4@@@@Z@4@@_@h@k@@@j@@@@@L@F@@ @@@@@X@@~@<@L@@@#@@o@I@@@@@`@,@p@@@@@@~@|@@@@@@@r@d@@D@B@@@0@v@@0@j@@t@@@T@@,@@@@z@h@X@V@F@V@@@@@@@@@@@@@>@@@N@@@@@@@j@@@@@@@@@H@@@ @@J@t@X@d@@@@@T@\@@@v@B@@@i@ @@@@@0@@@@@b@@f@@@@*@@@@@F@@f@A@ @@H@ @@@J@<@@@@@@@F@B@D@@@@@@@L@V@@.@8@@@@@@@@@@@@@@Z@d@@7@R@U@@f@@4@^@@R@@@@@H@n@@ @@@|@@@.@@@@@@L@l@~@@@4@@@d@D@^@,@~@@@@\@\@p@@@@@@,@@t@@v@@;@S@@@@2@@@@.@@@@@@4@@$@@@@b@@F@@Y@i@@@~@@@@@@@@r@>@@@@@@@@@@J@(@F@@@@V@@@b@@:@@l@H@:@ @~@@Z@@|@@@@@@Z@@@@@@r@$@V@@@@@.@@@@$@@@@@@@@@@@v@@@@|@R@6@@@x@n@R@R@r@|@@@P@~@@@d@@@@@@c@@@@@@y@>@@ @v@@@l@\@@@@@@f@@@@2@@z@@@$@L@]@@@@x@T@@(@@@@@@@r@V@D@ @.@@@@@@@@@`@@~@@@8@p@@<@@@@@@@@"@@:@@@@B@.@H@@f@@@@@@z@V@@@@@@@@@@Z@@2@@@@@@@0@@@>@t@@z@@@@P@@ @J@@:@$@@g@*@@@]@@%@T@@@T@B@~@t@F@N@@@@@@@ @b@&@`@@@r@<@ @@V@p@@j@4@@J@@@@@@@p@@F@B@&@@J@D@@@6@@B@@@r@4@@*@6@ @@@^@@@@ @<@@@@@@@n@@@B@@y@@@<@@n@@@R@@@@0@@@@@@z@@@@z@\@B@@@@@F@.@r@*@j@@@@@@@"@ @@@@@@@S@@@z@ @V@@@@p@@z@@@@X@x@.@@@@@@x@@v@@@@6@@Z@4@@@@@@@@T@L@B@.@@@@@>@@@8@@@@p@h@T@@:@@V@@D@@@p@@ @@@@.@@@|@@@@@@X@@@ @@@p@P@@@@^@ @@@@@H@@@@~@@X@F@J@@@r@@B@H@B@@@@@@@@ @t@@8@@@:@@5@Y@@ @@@@N@@\@@0@2@<@@8@`@6@\@@~@@j@@z@R@@t@@@@2@\@@@@@@r@@j@0@T@*@@@@4@&@@@"@@@@2@ @R@^@@@j@n@b@@@@@@F@@@@@@n@(@@x@@@@b@@R@h@@@@>@@*@z@.@@@@@@@@@@ @X@@z@@@6@<@@V@2@f@n@t@@@@@@z@H@@F@2@`@"@@P@@@@@J@@@l@@@@0@@@@Z@@@^@$@@6@@n@@@2@@@j@>@"@@@@@@t@V@J@4@.@.@@@P@Z@@@n@@@2@@@4@|@@h@t@@D@N@@@:@@@@@z@8@N@@@@@@T@t@H@@"@@z@@h@N@B@p@:@N@$@ @@@H@@@ @@@@R@@t@P@L@0@@@:@|@v@Z@@@@@@@@!@z@@@@ @@@@j@@(@@r@@@@@@@@@@L@h@@@@@|@R@6@@@@@n@b@ @@@@@p@p@R@B@H@(@@@@2@&@x@@&@@@@V@@@0@z@@@@@!@@f@@@@b@@ @z@@@>@@@@\@@@0@$@@@@@@N@V@`@Z@h@B@L@@@@Z@@@@8@@@h@@n@j@8@@"@d@B@f@@@@&@L@@8@@0@@@n@v@@@@4@@@@d@@@@@@@@.@4@@@@@@@.@@@@d@&@@V@@@@@@v@d@F@.@0@&@ @@@@@@@@@~@~@@D@@,@J@f@@@ @@&@@R@.@@@\@@@@@@@@@@ @@.@@@@@f@@@N@V@P@z@d@<@@&@*@@r@@`@@@@4@@@@@@$@2@2@0@~@@ @2@@@.@@(@@@@@*@@@@.@l@@p@t@h@@b@^@@@@R@@d@N@@@Z@v@@@@@@@T@@@ @<@@@@@\@Z@.@P@@@@@@@@@@h@\@@ @@@:@@j@^@@V@@@4@F@4@@@D@t@N@@@@@@@b@6@X@@@@@@d@L@p@0@L@~@f@:@@@v@@@@@@@@@@@@@\@@:@ @>@>@x@@"@@@@@Z@~@ @@x@@@@@@@@@^@@@r@t@@@@@@\@x@@t@J@@@@@@J@@@D@ @@^@"@@@@T@b@4@4@ @&@@@@@@B@@@F@(@r@@@@@h@N@d@d@@@h@ @@X@t@,@>@@ @@@@@@@@6@<@@@@@t@@@@@@x@X@<@d@@@|@6@\@@<@@@\@L@6@`@*@n@n@D@v@l@@.@@@@>@@@0@@p@<@@@@@b@@@P@@b@@B@h@F@@@@@V@|@6@z@T@@@@@p@@@@@|@^@"@@@@v@@F@:@(@&@@@x@@@<@@@X@X@@@@@@d@|@t@@@@@$@^@@@L@@@&@0@d@@n@<@@x@@@@(@J@@X@,@H@Z@j@@p@.@x@j@r@@@@d@@@@@@@B@@@@r@^@@@@@@@@N@@@T@,@@4@@@@@b@F@p@x@<@B@@@@@r@@@@0@@ @f@@F@@@@@@Z@@@@X@:@2@@@@x@v@N@:@@@@@@t@@@@f@@2@@6@@d@@ @H@`@Z@@`@F@X@@@@@^@*@@@@@@f@@@@@x@@@@t@4@ @0@@@P@@B@L@\@N@@@@@@@@@@4@@@*@@@6@l@^@@@@@ @l@@@@@x@@@@x@b@L@8@b@@@x@@@@@@@@@@~@@*@.@0@0@@@@@@@@@V@,@@ @@@@d@`@(@8@2@ @@@|@@@@D@D@ @@@j@@@@(@z@B@:@6@ @6@.@@@\@@$@@@@@@@@B@*@@@*@@@.@>@@N@T@&@X@Z@B@j@@b@@@@@@@@@@(@@@@p@@@H@@@@0@(@0@@@z@D@L@ @@@@p@@@@@@^@@R@\@&@J@@@D@@J@@2@j@@@@@`@@$@@@>@@@@@@@l@p@P@@@H@@@@J@@@@P@B@@@@@@@2@Z@D@X@@V@@H@@ @@@@@@@j@@@@@@@@@@@@V@B@@Z@p@@f@x@v@@@@@@@@@@@@@6@@@*@@@@`@@d@@ @\@4@@@@x@@@@N@@F@J@"@@@@@R@`@v@J@@j@@~@@J@:@@p@Z@j@d@@@@H@@@\@P@@@@@@@v@t@2@"@4@ @@@d@@@@<@>@@@ @@@@@6@@@Z@@@@@@ @@.@@@@@@@<@@@@@@~@@@@|@@&@$@@@@@@@@4@@@@@@@@ @@@@@"@@@@@@@@,@@^@@B@@@@@@@6@.@@@@@@,@@@d@@@@@@4@:@@@d@@@,@@~@@@n@X@ @@@@@r@@b@f@6@<@ @@@@p@@@ @ @"@@@@@@@@@@@@@@8@@@@ @@@@@@`@@&@@@@@@@b@@`@@@@@&@@D@P@@@@@@@@@@@@@@@@@F@@F@4@\@@@@@(@H@2@B@@^@\@b@@@&@>@t@.@@@@@X@@@$@t@@@P@H@@@P@&@@@@@@@N@$@&@@@@@@j@N@:@6@&@8@@@@T@@@@@@@d@@@@@@~@@>@@>@.@V@ @j@&@V@@6@*@f@@@d@(@@@`@@@@@@@>@:@@@@v@@@@<@"@@ @@@@@@@@@@@ @@@@@@@@^@"@(@*@@@@@z@<@P@ @@$@@@,@@$@@$@P@:@|@@R@H@@@T@f@@@@@@b@@$@|@R@@@@@@~@l@r@b@h@@@$@$@@@ @.@f@v@@@@P@l@@F@@@|@@T@X@@@@j@@@Z@@@@0@b@@N@B@R@\@(@@@T@@@*@@<@@2@~@@@(@@@@.@@@0@n@@@@@@@ @|@,@@N@@@0@@@@,@@@@@@T@X@T@@@@<@@@@ @@@<@@@@@B@R@~@(@@@H@ @L@@@@@@@6@@@@@@|@n@@J@N@@@2@@@,@@`@`@@@@6@`@@@L@@$@r@@@@@@@h@l@K@@+@@@@@d@@@@.@@@@j@@@@~@R@:@.@r@@@@@@@@0@@@d@@,@@@@:@0@>@@@@@J@@F@@@D@@@\@$@8@^@@@@h@J@h@@@"@r@@t@N@@@@@@@@@*@X@l@<@&@@@N@@@`@@ @@@@z@f@b@D@D@@@(@@@@6@R@@@@@6@^@V@@2@f@D@@@@@ @^@^@@5@@2@h@@@@\@@@@@~@@@@@@@@@R@T@@:@f@@l@@@@@@@@@@@@r@.@@@@@>@@2@@@@@H@@@@@@@@j@@^@L@v@@\@@@@~@<@@f@(@Z@@@@R@@j@D@@@@@d@@b@@@@@@@@t@V@`@(@@(@ @@@@@@6@h@@@@$@@J@@@j@@D@@@6@?@^@@@7@Q@q@n@]@@@@@@@@@"@@@@@@@@z@@@@@R@@@@@@8@J@@@b@@ @$@6@ @"@@6@6@@@p@ @4@(@l@.@@@(@@@j@j@@t@d@&@.@:@r@@@@@^@\@J@@@@@r@&@@`@@@@@d@,@@f@@@@@@@r@v@H@<@V@@@>@@ @@ @F@d@@@@@0@P@@@B@@@@@@,@@@@8@$@@~@@@@D@6@@@V@r@ @@@@f@@r@@@@@@4@@@@@x@@:@0@Z@,@@@@0@@V@p@@@@@@R@0@(@J@F@j@@@@@>@@@@v@@v@@r@@@@~@@@@@4@@@&@L@~@<@L@`@@@2@@p@H@<@@@@@@~@|@X@2@4@ @@@@@@@>@H@@@@ @"@@@@@,@@@@@@@L@y@4@@@@@@@@@@$@b@X@F@@L@h@4@&@"@@@J@@:@@@@@@@@@@@@@0@@@n@l@"@n@@@@@@@2@@@@X@Z@@@,@@@@*@@@@@@@@^@J@@@~@$@f@@@@$@@@@2@@v@X@ @@@D@@@@@@@@r@D@&@2@,@@@2@@@@@$@<@|@@@@@"@@8@@@ @@@P@@@@@@@@ @@@P@.@@v@@ @@@@@@@@@@@@@@ @&@|@@p@@@@@@&@t@@@@@r@@h@@b@@ @@@@,@@>@@@@*@:@@@@@"@@v@@~@@b@@R@~@V@p@h@@@@@@F@@>@@@@@@@@@@@@@@h@F@h@4@8@4@$@(@@@@@@ @.@p@n@@@@@@x@@@"@@@@@(@l@,@@@@ @@}@@@@@b@@@@@@@@@@*@@@@@@x@j@2@@@t@@@@J@"@b@@@n@f@@@@@.@0@@@<@r@@@@@h@@8@V@>@@@n@@@@@@@V@@>@Z@@0@X@@~@@@@b@@@@@@@@@@@@@x@P@Z@h@>@*@"@@8@@@@@@@@.@D@@@@"@@V@`@n@@&@t@@6@@@@@F@B@@U@r@@o@B@@@D@@@@p@@@@@J@p@0@@`@@@@/@@ @@@n@F@@@@ @@B@h@:@0@@@,@ @B@@@p@J@@f@D@T@@@@@@@@v@@n@ @@@@@@h@@f@>@@@@0@@@4@@@@l@R@$@@@@@@|@@f@R@2@<@.@4@@@@@@@@@@@@J@V@@@@@*@8@@@@z@@@0@x@@x@*@@;@\@5@@ @X@@@@8@@@\@@v@@@z@@>@@@@@n@@@ @@@@@@@|@@8@@@@@z@J@@8@&@@@H@n@J@@@z@@N@@@@@@Z@@@@V@@@@>@ @@@d@@@r@@@v@~@@@(@@@@@@b@^@@8@$@.@"@@@ @&@@@@@@@@@@Z@0@N@@@@@@@@@Z@@l@@@p@@"@(@J@V@@@f@@t@@v@$@$@@@@@@P@b@@@@@>@v@0@^@@@B@@@ @@z@@h@@@@@z@@@@@@@@"@@H@b@@N@$@&@@0@d@@ @@`@@v@@@@ @@@@@@z@b@@@@@^@8@@@@@@v@@t@X@R@>@2@&@@$@@@@@@@@@@@@@@@@B@R@@@@>@@^@@@@@J@@R@B@@@@:@@@@@@8@t@\@V@@@@@h@L@@@@x@6@8@@~@h@`@<@@@&@L@h@<@:@@@@@R@B@@@@x@@@@@@@$@@@@@V@ @0@@@@@@@@Z@@P@@N@@f@@L@@@<@@@x@V@@ @ @@@@@@t@T@@<@(@0@@2@@@@@@@@@@@@@@@@<@D@t@@@@@@@@@@@@J@@&@@@@<@@*@F@@&@@&@J@@@@@~@<@@@@@.@@@$@@@@@@@@@@@H@^@@@@@@*@|@@^@@@@@@@@@P@@<@@@@@D@@@@@@L@@@ @B@@r@\@@@j@*@@@@@@@@n@B@P@d@4@H@@ @6@@@@@@@@@@@@@@@@d@@@@@@@@@@ @h@v@@f@f@ @H@@N@@@*@X@@@@b@\@6@ @d@@@@@@@4@@6@@@D@@@`@b@`@p@d@@ @@d@F@@@@@@@L@@@ @>@.@ @@@@@@@@6@@@@@@p@@@S@*@@)@@@^@@@4@@@P@@@@@@@@@R@H@.@$@V@*@6@@@@@@@@@@@@@@@@@@@@$@\@@@H@@z@@@@"@B@@>@$@F@j@j@@@@@@@@@@Z@@@"@@@4@T@@(@.@@@v@J@B@P@@@\@<@*@h@@@0@@@@t@T@@$@@@<@&@8@ @:@"@$@*@@@@@0@:@Z@ @z@@R@@@@@@@@@@Z@@@@R@>@@@@@@z@X@`@@@>@>@6@2@ @@ @@@@@@@@@@@@@@@@@@@@@6@L@^@Z@b@@@ @@@@6@n@@@@$@0@F@j@@@@j@@B@o@@T@@@@@@n@@@d@B@@@ @@@@@@@L@@@F@P@@@@@x@@ @j@@@ @@ @j@z@P@,@@@"@^@@d@@}@@@@h@@x@@0@@h@@@T@:@,@@@@@@t@Z@Z@D@`@@"@@@@@@ @@@@@@@@@@@@@@@@@@@@@T@H@l@@@@@@B@2@L@@n@@@@@@@@@@6@v@:@@@@@@@@<@@@@>@@@@0@@@@@@@b@b@@@@X@L@X@@:@F@8@t@@*@D@R@@h@&@R@&@(@|@@@=@f@@@@@@@d@@@.@@@J@@@@@@d@@j@Z@F@"@,@,@(@,@@@ @@@@@@@@@@@@@@@@@@@@@@@@@P@n@l@@@@@@@@@4@>@f@@P@j@l@T@@@@l@b@;@@@@@B@@L@@P@@j@@ @@@@@@@\@z@b@^@@@p@@ @&@@ @@H@@@T@@4@z@L@`@6@V@@_@@_@,@@@@@@6@@H@@@@@@@@@@@r@T@L@.@F@@B@"@@@@@@@ @@@@@@@@@@@@@@@@@@@@@(@@ @T@6@v@@@@@@@@"@@*@@@R@h@.@@@p@@6@2@@@@@@n@@@@ @@@J@@@ @@@ @B@@ @Z@@J@B@@@@@@*@@@@@:@@@d@@ @@@@@@b@@@D@@@8@@@@6@@@@@@@@|@T@b@B@,@6@ @@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@D@D@P@p@d@@r@@@@@@@@@ @L@$@h@@@*@*@&@-@@ @B@@@@L@j@^@@4@L@@.@@@@@@ @@"@^@N@$@@$@4@@X@@H@@f@@@8@n@d@H@<@V@@4@~@~@@@@@>@@@|@j@Z@@@@@x@@j@@>@N@d@P@0@@4@4@@ @(@ @@@@@@@@@@@@@z@@@t@@@@@@@@@@@@@@ @(@.@f@*@R@@p@@@@@@@@@B@@ @@6@|@@\@@.@@@V@@@ @@@@b@n@6@@\@Z@@.@@@>@J@,@@ @,@<@2@F@j@l@>@0@@@@`@@@`@@@T@@@(@$@@f@@@@8@@@@@@@@d@`@h@@@2@F@@<@@@@@@*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@P@4@`@L@4@~@^@@@@@@@@@X@@@@@@@@@J@@'@t@Y@@@z@@h@@x@N@H@@@&@@.@@@J@X@`@@@@@@@@@@@\@X@@@@@h@8@P@j@R@@p@(@@>@@*@@@@|@@\@v@R@4@<@@@4@@@@@@@@@@@@@@@@@@@@@t@z@z@@@@@@@@@@@@@@@@@@@ @@ @H@,@`@F@@@@@@@@f@@@@@ @@@@F@@@T@@@F@h@@,@@@N@@,@@@@@@ @@@;@I@w@{@]@s@J@@@@@@>@V@@@6@@@@@@@|@H@$@ @@@@@z@|@D@V@B@6@*@@:@4@@@@@@@@@@@@@@@@@@@@r@@r@@z@@z@@@@@@@@@@@@@@@@@@6@4@@"@:@6@d@V@h@@@@H@@@@@0@@>@ @@I@@T@@@@@@ @@@@@V@@\@@@~@@@@X@@@@=@%@@@@@@N@@@d@@@f@x@X@6@L@<@ @@@@@z@x@N@Z@D@$@8@*@*@.@@@@@@@@@@@@@@@@@@@@@@@@@|@@@@@@@@@@@@@@@@@@@@@@@@@.@2@>@@V@x@@@@H@@V@@@@@@@@@@@F@@(@@@L@@x@|@@@2@@2@@@@\@8@@@ @>@*@@v@N@@@t@|@@"@X@@@@B@J@@@@ @@@@@@@l@d@F@0@@L@8@@ @@@ @@@@@@@@@@@@@@@@@@@@h@j@|@z@@t@@~@@@@@@@@@@@@@@@@@@@@@@@P@$@b@@r@@@@@@8@@@4@z@N@,@@@@V@~@2@r@@@@@@@Z@@@r@f@@@2@@@*@@@0@@@@@*@@@@Z@6@4@"@@@@@@@@@@@j@N@J@6@0@@8@@@,@@@@@@@@@@@@@@@@@@@@@@@~@t@d@@v@@~@@@@@@@@@@@@@@@@@@@@@@@@$@@P@l@R@@z@z@@@@@F@@@n@z@@`@&@@@@P@T@@~@`@@J@@@R@@@@@@@L@@@8@&@@@*@@(@@4@@@@@@@@@p@@@N@r@`@f@H@<@0@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@v@h@p@~@t@@@@@@@@@@@@@@@@@@@@@@@@@@$@@@@P@.@h@R@h@@@@&@@B@"@@B@(@@"@@@@L@l@\@F@V@D@"@\@@@b@f@@@@@@@@@@@@r@@@n@H@@@@@@@@@z@n@x@^@h@^@\@N@<@N@V@&@"@,@@@@@@@@@@@@@@@@@@@@@@@@@@@f@z@|@@b@d@x@r@d@@@@@@@@@@@@@@@@@@@@@@@@@ @@@D@*@H@\@@@@@@@@@@@@@@@@@@@@@@@@@@p@`@F@T@<@@@@@@@@@@@@@@f@`@Z@r@h@`@\@4@2@*@@2@.@*@$@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@|@t@|@p@j@t@~@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@,@@ @L@V@@@p@@N@t@@@@@p@N@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@V@V@F@*@8@&@@N@@0@@@@ @@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@`@d@l@j@p@d@x@r@l@@@@n@r@|@l@|@x@v@@@@@@@@@@@@@@@@@@@@&@$@H@Z@ @<@(@b@d@B@>@@<@X@L@|@@@@h@~@j@@@@@@@@@@@@@@@@h@v@@@@@@@D@:@$@6@0@F@ @<@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@P@l@`@d@n@\@z@d@l@t@v@r@b@@~@r@|@v@@@@~@@@@@@@@@@@@@@@@@@@ @@@@@@(@@D@"@*@@H@8@H@B@8@n@P@J@P@j@Z@L@2@T@n@p@n@|@j@t@H@`@L@F@@@@@@@R@D@R@<@@"@@@ @ @&@"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@r@p@^@p@t@n@@@t@@v@v@v@r@@@@~@@@@@@@@@@@@@@@@@@@@@@@@@@@$@@6@ @@L@&@&@@@L@h@:@n@R@R@D@H@b@r@l@Z@j@f@n@d@j@^@L@X@p@R@>@:@T@<@@>@4@T@ @0@@@0@@(@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@b@Z@Z@b@h@p@j@V@f@h@\@^@l@h@n@n@z@t@@@t@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@8@ @0@:@@@ @6@P@@"@*@2@@ @*@2@@&@V@@4@@,@0@(@0@ @@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@h@d@V@Z@`@`@X@b@j@\@p@j@n@p@r@Z@r@l@l@z@@z@z@x@@@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@r@b@`@^@T@r@X@f@l@b@b@d@d@|@t@^@|@j@d@|@@@@@@|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@(@ @@@@@@@@2@@@@@@@ @@@,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@b@b@X@`@T@\@^@b@`@b@j@j@d@\@t@x@n@z@x@r@t@|@x@f@@p@|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T@b@V@^@b@Z@b@b@f@f@d@j@f@j@x@j@x@x@r@@p@@l@h@@z@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@V@@@X@P@^@X@T@`@`@l@b@l@Z@Z@@n@p@h@j@p@f@z@@n@t@@x@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@sunpy-0.8.3/sunpy/data/test/EIT/efz20040301.040010_s.fits0000644000175000001440000042350013203275053021107 0ustar nabil00000000000000SIMPLE = T / conforms to FITS standard BITPIX = -64 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 128 NAXIS2 = 128 DATE = '2004-03-01' / Date of file creation TIME-OBS= '04:00:10' / DATE-OBS= '2004-03-01T04:00:10.568' / UTC at spacecraft ORIGIN = 'Rocket Science' / Rocket Science = NASA GSFC DATASRC = 'LZ file ' / TELESCOP= 'SOHO' / INSTRUME= 'EIT' / OBJECT = 'full FOV' / BUNIT = 'counts / pixel ' / WAVELNTH= 195 / 171 = Fe IX/X, 195 = Fe XII, / 284 = Fe XV, 304 = He II FILTER = 'Al +1 ' / DATE_OBS= '2004-03-01T04:00:10.568Z' / SCI_OBJ = 'CME WATCH 195 ' / OBS_PROG= '195_10S_AL_1.000 ' / CMP_NO = 1 / Unique campaign instance (1 = synoptic) EXPTIME = 12.595 / s (total commanded + shutter close) EXPMODE = 'backside ' / FILENAME= 'efz20040301.040010' / CFTEMP = -66.71 / CCD cold finger temperature (C) CCDTEMP = 7.34 / CCD temperature (DN/100) CTYPE1 = 'Solar-X ' / CTYPE2 = 'Solar-Y ' / CRPIX1 = 64.5 / Sun center x, EIT pixels CRPIX2 = 64.5 / Sun center y, EIT pixels CRVAL1 = 0.00 / CRVAL2 = 0.00 / CDELT1 = 2.63 / Pixel scale x (arc sec, fixed) CDELT2 = 2.63 / Pixel scale y (arc sec, fixed) SOLAR_R = 372.27 / Solar photospheric radius, EIT pixels SOLAR_B0= -7.22 / Degrees SC_X0 = 0.00 / s/c yaw (arc sec) SC_Y0 = 0.00 / s/c pitch (arc sec; -109.14 after 1996/04/16) SC_ROLL = 180.00 / s/c roll (deg., Solar north + CCW from nominal)HEC_X = -139130208.00 / s/c heliocentric ecliptic x (km) HEC_Y = 46576272.00 / s/c heliocentric ecliptic y (km) HEC_Z = -94896.31 / s/c heliocentric ecliptic z (km) CAR_ROT = 2013.00 / Carrington rotation at earth COMMENT CORRECTED DATE_OBS = '2004-03-01T03:58:25.284Z' COMMENT COMMANDED EXPOSURE TIME = 10.000 s COMMENT SHUTTER CLOSE TIME = 2.595 s COMMENT LINE_SYNC = 'no' COMMENT CAMERA_ERR = 'no' COMMENT IMAGE_OF_SEQ = 0 COMMENT READOUT PORT = 'B' COMMENT NUM_LEB_PROC = 3 COMMENT LEB_PROC = 26 (no ROI) COMMENT LEB_PROC = 27 (no occ mask) COMMENT LEB_PROC = 12 (Rice) COMMENT BLOCKS_HORZ = 32 COMMENT BLOCKS_VERT = 32 COMMENT P1_X = 1 COMMENT P2_X = 1024 COMMENT P1_Y = 20 COMMENT P2_Y = 1043 COMMENT N_MISSING_BLOCKS = 0 HISTORY Version 4.0, 2001 December 10 HISTORY Image linear resampled to (128,128) for SunPy END @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@x@v@~@l@x@r@p@p@~@v@f@r@l@V@f@R@T@Z@V@h@X@^@d@\@V@T@R@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@ @@@ @@@@@@@@@@@ @@ @@@@@@@@@@@@@@@@@@@@@@@@x@@@@@x@`@t@l@l@r@j@t@p@b@`@j@`@R@p@V@R@\@\@Z@J@L@`@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@0@@@$@@&@"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@~@v@l@d@@r@f@~@l@v@b@^@\@V@H@d@T@d@P@R@T@V@X@^@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@4@@@@@@@@$@@"@@@H@"@2@B@F@N@>@@.@(@"@&@@@$@@@@@ @ @@@@@@@@@@@@@@@@@@@@@@@@@z@@@x@r@|@h@\@v@h@f@b@h@d@h@X@^@b@\@d@`@X@^@T@V@b@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@$@@@@@@@@ @8@@@0@0@>@@@L@<@(@L@F@J@j@6@D@*@2@0@4@(@@P@R@@@,@@ @@@@@@@@@@@@@@@@@@@@@@@@z@@@@l@n@h@x@h@t@r@d@^@d@p@l@f@L@R@\@^@^@X@N@J@X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@ @@ @@@@@@0@@*@4@ @0@H@4@Z@N@J@j@R@L@Z@B@F@:@L@>@(@4@4@*@(@@@&@(@@@@@@@@@@@@@@@@@@@@@@@@@@r@p@~@r@r@t@n@X@b@h@`@Z@V@N@f@f@\@l@Z@`@b@b@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@,@@ @@ @h@@@L@:@@@>@@R@0@8@P@D@T@J@@@l@r@@@@@@@@b@t@F@d@^@\@r@:@L@h@T@:@L@4@@@@@@@ @ @@@@@@@@@@@@@@@~@@z@t@@~@@z@@v@~@x@`@j@p@`@d@d@T@^@P@`@\@Z@d@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@F@@B@.@&@H@:@N@R@"@\@b@<@j@^@@@@@@@@@@r@t@@@~@@R@f@v@X@d@t@R@H@@&@<@@@@.@@@@@@@@@@@@@@@n@@@|@@@@n@@j@t@b@^@l@f@v@d@^@b@\@X@f@`@T@T@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@,@@,@8@@2@V@L@d@D@:@P@P@V@x@f@t@d@`@@@@@@@6@@@@@@@@@@@@@@~@@@@B@.@$@J@F@,@B@.@&@ @@@@@@@@@@@@@@|@@@@@z@@p@t@r@r@d@d@f@Z@f@^@@J@f@f@`@b@`@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@:@@(@@@*@0@@@B@D@h@d@8@r@@V@@~@z@@z@@@@@@@.@H@@@2@\@,@@@@@@@@@@@@@@@@H@x@@f@h@`@R@"@@@@@@@@@@@@@@@@@@@x@z@~@@z@x@f@@r@b@l@b@f@h@b@\@T@V@f@Z@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@ @ @.@4@H@h@4@0@z@p@j@@b@@@@@@@@@@@@P@|@@@j@@4@@8@@@V@"@@@@@@@@@@@@@j@Z@b@@@2@@@@@@@@@@@@@@@@~@t@@@@@~@l@n@~@v@p@f@x@`@\@d@j@X@b@Z@R@R@@@@@@@@@@@@@@@@@@@@@@@@@@4@@@"@@@$@"@0@:@@@N@Z@N@j@n@@@v@@@@@@@@@@ @@"@@,@D@Z@@@@@@$@@@@v@p@@z@@n@@p@@ @8@@@@@@@@@n@R@*@ @ @@@@@@@@@@@@@@@@@@@@x@p@f@l@n@p@T@T@X@`@l@f@n@T@Z@H@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L@0@P@l@\@f@@@@@@@@@@@@"@0@0@@@@@R@r@v@@@@\@@@@X@<@@@J@x@`@B@&@@@@@@v@0@ @Z@B@@@@v@h@b@N@@ @@@@@@@@@@@@@@@@@@z@@v@@@x@x@r@p@f@`@d@b@h@X@Z@\@@@@@@@@@@@@@@@@@@@@@@@@@ @.@@@J@4@ @8@@\@F@D@j@d@v@@@@@@>@@@@@`@@n@Z@v@~@@@@@@@@,@x@@@T@@d@@P@@@@@p@^@x@4@@@@~@@p@Z@@@@@@@|@>@8@@@@@@@@@@@@@@@@@@@@@x@~@h@v@`@X@f@h@j@v@`@`@^@^@@@@@@@@@@@@@@@@@@@@@@ @$@$@"@\@<@H@B@F@b@X@b@v@|@@@@@@@d@\@v@@|@@j@@@@@0@@0@L@b@~@f@@(@@@@$@X@@@z@@@t@@@@@Z@ @@@@@@z@(@@*@P@<@@@@@x@D@2@@ @@@@@@@@@@@@@@@@@@@|@x@~@h@l@x@|@f@^@h@t@h@@@@@@@@@@@@@@@@@@@@@@@@@@&@&@@h@<@N@X@Z@@@z@@@@@@B@L@@@@@@h@@D@H@@ @6@r@t@@@@@@@@@t@@@@@h@@ @x@@@n@@@@@@0@@@@@@@T@@@@@j@R@T@(@@@@@@@@@@@@@@@@@@@@j@t@@r@d@l@t@`@d@f@l@@@@@@@@@@@@@$@@@@@@@@<@@"@4@&@Z@P@P@@h@@@@@@@ @@@F@(@@@@@@@@D@@r@@@@@@@.@*@@2@@@@@@4@`@@@@6@h@}@@@?@c@f@@@@@"@@@@@f@@@@,@@@@@x@4@*@&@.@@@@@@@@@@@@~@@@~@@|@j@r@j@l@@r@x@L@f@`@@@@@@@@@@@@@@@@6@@@@@0@*@@(@F@$@V@X@h@@b@@@@@*@@d@x@@@@@@*@@@f@T@@@@@,@@@@@j@F@6@&@(@@@@~@8@l@@@F@@@@@@)@/@@U@2@u@@@@`@@@@V@ @@@@H@2@@t@^@>@@@@@@@@@@@@@@@@@@@z@@x@@z@z@l@h@f@T@f@@@@@@@@@@@@@@@4@@@@@@<@ @H@<@4@p@N@~@@@@@@@*@j@@@@H@@@v@r@@@@.@@4@@@@ @H@b@r@d@ @@@t@@f@b@F@@f@Z@p@|@i@@?@@C@I@$@@1@@b@@>@@j@@X@8@@F@@@@\@@@@d@f@H@B@@@@@@@@@@@@@@@@@@x@z@l@p@j@p@^@Z@j@@@@@@@ @4@@&@@"@2@@6@2@ @d@4@d@@R@L@f@p@@@@6@@@J@R@@@@@@@@$@@@P@@@&@J@F@B@@@@X@@@@@@v@@\@@p@h@@`@f@F@$@@Z@@N@,@@@x@@@ @@@S@@@N@@F@H@@"@@r@X@(@@~@j@ @@@x@b@D@@@@@@@@@@@@@@@@@@@~@z@j@~@~@r@\@@@@@@@@ @@@@@ @@*@N@.@>@h@>@l@L@t@f@@@@@,@@4@<@@@:@@@@@,@@D@@ @*@@@@@.@>@@@n@@@D@^@2@@@@@@@,@B@@L@@@@@@J@@@@@@@u@3@ @ @!@@f@@@l@@@p@l@:@@@,@@@@v@R@*@ @@@@@@@@@@@@@@@@@@x@@|@p@v@@@@@@@@@@@ @@2@*@0@\@2@B@^@4@L@@@@@@@@ @@@@@8@@@@H@@@ @>@2@t@@>@@Z@@b@@N@@@@8@<@@@z@,@@@@@@@@@<@@@@:@P@@ @@@@@2@@@)@@>@@@@\@@@@@&@8@@D@@@@@^@X@R@ @@@@@@@@@@@@@@@@@@~@n@j@l@@@4@@(@@@@6@H@ @F@2@@@.@B@v@~@l@@@r@@@@@@$@b@>@@@<@@*@*@@@<@$@@@@@>@@@@p@@@>@@$@^@t@4@[@"@Z@\@n@V@|@:@:@@ @L@:@p@@@`@@@Z@l@@^@@@@H@@z@@@@@@^@z@@r@@@@t@@~@:@4@@@@@@@@ @@@@@@@@@@@@@@@@~@@r@z@|@@@*@ @"@@&@@ @@@2@N@2@,@^@N@L@@N@p@@@@@@L@J@@"@@v@@R@@@@@@N@@@@n@@@@@f@@F@V@@@@J@@$@4@@ @@@r@z@@@@$@R@@^@|@@@@f@@@@ @@@@\@F@@p@4@Z@>@@@B@@ @@@@@~@z@@@@@8@@*@@@@@@@@@@@@@l@@@~@@@p@x@@B@(@>@ @@X@Z@@@Z@.@H@v@T@d@~@z@@@@@@@,@T@@@@@@ @D@@N@z@B@@.@@@P@&@@f@@@D@~@"@@@@@@@@"@@ @@6@@@@@T@*@V@j@@@@@h@@z@@@N@|@@@@@@>@0@@B@@4@D@@@ @0@@H@ @@@p@@@@\@L@*@@@@@@@@@@@@@@@@@@p@z@@2@:@0@8@@@@2@R@:@N@L@@j@\@@@r@@@@"@@@@n@@@X@@@V@@@2@8@h@|@S@@@B@@@@@@@B@@@@N@l@@@@~@6@@@h@T@@@@@|@V@"@R@@@@@@@@@@@@@x@@@@P@&@@@@@@@@@@@@@D@(@@@T@@@h@N@>@<@@.@@@@@@@@@@@@@@@x@z@@.@@ @$@@>@L@:@J@@@P@d@l@@@z@@@@"@@R@@@@p@b@@@L@x@@@r@@x@@@@N@@@^@6@@p@@@@V@@@@@L@^@L@@@n@@@:@&@@@@@@@@@@@r@@@@N@@`@@L@@:@@f@D@@F@@f@@@@@8@@@*@8@@@@@n@V@D@.@@@@@@@@@@@@@@@@r@@@6@l@@@`@^@L@t@@|@@@@@@@@@,@@@@~@x@@@@R@@@4@R@,@@@|@H@h@~@@@@l@v@@V@@@p@L@@V@j@@@@ @X@z@@b@>@@\@P@@@H@@@@@@@h@>@@@@@p@2@@@B@"@@@4@@>@@@@@@&@@@@@@.@@@@@x@D@@@@`@B@@*@ @@@@@@@@@@@@@@@@&@>@T@<@F@>@n@l@P@@L@@@@@@@@@6@@D@@@@ @\@@@@J@2@@@@@@\@6@n@h@V@r@@@@@@@@@p@@@&@@@@.@:@\@@6@@@@@@@:@@@.@@v@@8@@z@@@T@L@|@0@B@@@ @@@@@@@Z@ @~@z@@*@@@@X@@@@@b@P@@"@(@@@@@@@@@@@@@@@@T@J@H@\@T@j@@T@@@@@@@@@ @@D@@@@@0@@@@@^@@@>@l@@@@@@h@@@z@@@@@`@@@@@B@@@ @@@@@2@@@<@ @@0@@r@@$@@@@l@*@@z@@@@@@@@@D@@@@@ @@@@@@l@@@N@@2@@D@@@@@@^@H@>@*@,@@@@@@@@@@@@@@H@b@@p@@h@@@@@@@@@:@@@6@^@@@@@p@@@@@@@@@|@@V@@@@@@n@@@ @@@@@@@J@@@@@@@@@6@@@@@@@@@@r@p@B@@@@@@@@t@@@>@@&@@@*@@@@@@h@@@ @j@x@@@*@@b@r@&@@j@@@@@@@r@L@X@.@.@@@@@@@@@@@@<@F@F@h@@T@n@@@@@@@@<@J@.@@@ @X@f@@ @D@@@@@(@$@t@@|@@@@@v@N@|@6@t@@@n@V@j@v@&@@@@@@@B@@@@@:@@@&@@t@@"@@@\@@@@@V@\@R@@8@(@@@|@x@`@@@@@@@@@P@@@@L@@@j@@@@n@@@@@@r@n@d@@@"@@@@@@@@@@@@@@@@@@@@@@@@ @D@p@@@@@@D@@@@T@@@(@@@@@@@@@@@@@@@@@@@`@@|@Z@:@@@@@@@ @ @@@@B@@Z@@@@@@@@T@N@:@f@@T@6@|@,@@@@r@Z@@@,@@@@@@$@@2@4@@@@@@@\@@@j@"@@@@@|@V@J@2@@@@@@@@@@@@@l@v@x@@@@@@@@@>@@\@@8@@L@<@Z@p@@F@@<@@^@@@@@@@N@"@@@@@@@@@@@@p@@:@B@&@.@T@F@@.@@@@h@@@@@@P@@@l@@@@@$@@@8@@@.@@@@@@@@@@n@@ @@.@@@@*@@~@@@@@@@D@@@F@(@6@@@@@`@\@T@j@$@@@@@@@@@@n@l@T@@@@@@@@ @@@@@ @L@8@@:@@"@F@@@@@@r@d@@0@*@.@.@@@@@@@@x@@@f@@@@(@4@H@v@h@@L@4@@@@J@^@t@@&@@@\@@@@@R@L@@t@@@8@d@@v@p@X@.@@@@@@@H@@@,@@@F@,@f@N@@@@@@$@@j@<@@@@@@b@*@L@R@>@ @@@@@@@@@@@@@@@@6@2@,@v@v@@@@2@@@@@@\@v@v@@@@b@@@@@@b@@@@p@@@@`@J@@@0@@:@@F@t@(@N@@@f@6@@@@@@&@"@@ @8@r@H@@x@F@0@d@@@n@n@`@X@"@d@\@@J@@@Z@@@F@@B@@$@@>@P@@@@@@\@@.@@j@4@F@@@@@l@f@j@t@B@&@@@@@@@@@@~@@@@@@@@d@@@@t@D@|@@H@@@\@\@N@>@V@@@@J@@@@v@X@@t@@D@@@z@\@@@@@@~@ @"@6@@f@@Z@L@@@(@@@ @F@@@p@$@@6@T@D@@@V@@@J@@,@R@@@@@<@@@@b@d@d@@x@f@&@B@@@d@@d@@@@(@@@@b@P@f@2@ @@@@@j@@@F@8@@@@@@@@@z@@@@@@@@n@x@@@:@@@@@@0@@@@@@@@:@@@T@@`@F@@@b@@@@@N@@$@@@@B@@>@@V@H@@@@n@ @@P@0@<@@@@ @@@@l@@ @@@@8@ @j@@@@@@*@@@@@@N@@@h@@@@*@@>@ @N@T@T@@2@@L@@@@@f@&@&@@@@@x@l@@n@L@@@ @@@@@@@@@@@@.@4@|@@@@X@@@@F@>@@L@8@ @n@@"@@@@@@@r@@@@@@@@b@r@z@@@@@@@t@.@&@@@4@F@J@@f@0@L@8@@@@@H@@t@@@@b@.@@~@~@@@H@F@~@D@@Z@P@@@@@T@@@:@B@@@@@t@@0@2@@@@\@^@@@n@P@<@ @@@@@@@@z@^@0@ @@ @@@@@@@@@@@X@@@@@@@@@@@@@@r@@t@J@@V@@@`@@@^@@@H@@L@ @*@x@@@@@@@@@@@r@@@@@p@@@@@@@@$@ @D@l@@@@@b@J@@Z@@h@J@@@@@.@@@@@$@@@@@@J@@@@d@8@X@@@.@@@X@@@@*@@@ @@@@@@@z@X@\@:@@@@@@@@@@@@F@8@t@@@0@L@@@@@Z@@@@@@j@@@(@@b@@L@(@@@@@@@@@@H@f@@@@"@@@@X@@P@@`@@@@@f@@@@@@>@&@P@@$@@@@:@*@(@R@$@@@@@|@*@@@@@z@@@@t@&@X@c@@.@@.@@|@4@@@@X@@x@@@2@(@@@@@@@@|@d@0@@@@6@@@@@@@@2@^@@@@@v@@@(@@@@@b@@n@@^@@@\@:@(@@d@@@@@@\@@@@@@@@@@@z@@@f@$@,@V@~@@x@@@@@@@@,@@@@@@@@@r@$@(@^@,@r@@@H@*@@`@@D@@@@@@@@@c@ @@@2@@@@@@f@@@@8@b@*@@4@@@J@:@"@@@@v@v@b@0@P@"@@@@@ @@N@*@@ @@Z@@@h@@@O@@@@0@\@l@+@@@>@@f@@@@@z@t@@@t@@Z@D@@@n@@@@<@P@>@@ @@@@@@4@@@@@@@@@>@@h@t@@x@@r@L@ @N@@@p@@@@@H@@~@@.@@Z@@@@@@@@v@@*@@\@@@@@@J@l@F@@@,@:@@(@F@ @@@@@r@d@4@0@@@@@@2@ @T@x@@@n@d@@@8@*@@,@@7@ @@@^@@@@*@^@@@@@@@d@z@@@@J@D@@$@@@@L@@<@@@@ @@@@@6@@@@@@@@@F@4@,@b@@@L@@@@N@@@@@@r@B@@@N@n@t@@@@@@X@@@@@'@@@b@@0@@~@v@@@~@@^@R@@d@@b@@@@@~@@`@D@D@@@@@@ @@n@@@V@B@$@.@@@@@@~@@@\@a@S@@L@@@@N@D@@@@@@@l@:@,@&@@@@@@@@@@@@@@@@@@@@@@@@@@@8@@@J@@h@\@n@@*@@`@@@@@@@$@h@@*@@n@q@6@ @0@@I@@`@;@@@2@@@p@`@@ @@@@@@@@@@@R@,@@@@@|@d@L@8@@@@$@@6@@@@@Z@@@@@;@@@@@@T@@@b@@X@@@B@h@@@@@@@v@p@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@@@@@@V@@@ @@"@@@@@@@@@N@*@@@ @@@@'@I@@@^@6@@r@@@t@@*@@@D@@@@ @@@@@z@.@>@.@@@@l@,@@@@@D@f@@@@L@@@P@@@@|@@@@@@$@e@&@@@@0@@t@@D@$@@@@@@|@@@@@@@@@@@@@@*@@@@@@@@@@@@@ @V@@@@6@@@z@@`@v@4@p@@@H@@"@@@H@@R@~@@@@@@@@ @@T@K@J@@j@@@r@Z@h@V@@@@z@|@&@4@@@@@@@@@@@@v@:@@@@@(@d@@@@h@@ @\@@L@@@/@P@A@@E@@@@@@@@@d@|@$@@@@2@V@P@@@@@@@@@@@@@@@@@@@@@@\@@@d@8@@@@@*@@@@ @@@j@@@@R@@>@`@@@@^@}@#@&@@@@@@^@<@@@J@@B@@@@@@r@ @@@P@B@ @@@@@@@P@@@@j@h@.@@@@P@P@l@@@@@@@@@@@@@k@0@D@[@z@#@@x@`@@@r@@\@@@@\@@@*@@@@&@@@@@&@@@@@@@@@@@@@@@8@@F@@.@@@@@@@~@\@@@@@@@@@@@@@@c@@@W@t@@o@@L@/@v@r@D@@.@@@@@@@@Z@@p@F@H@:@@B@@@~@`@@@@@F@(@@@(@l@j@x@@@@b@@@*@0@@t@p@@@@@H@@^@@@x@@@|@@@^@@@@@@@@@z@@@@@@@@@@@@@@@@@@@@f@@T@d@P@$@8@@@@@@@@t@6@ @@@@ @J@0@@n@@@@E@ @@E@@@@!@ @@z@@@@@d@j@@@@@@ @@@@@Z@^@@@@@V@*@@@~@H@@4@@J@P@V@@@@J@f@$@@@@d@@j@@K@w@@]@*@o@@@R@ @r@@@R@@z@r@@ @@@@@@@@@@@@@@@@@@@@@@@@B@@@@@@4@@@@6@@:@@@@,@@@@F@@@\@:@\@@@V@$@R@@L@U@]@@:@@@@@h@@T@|@v@@@@(@4@*@@@@~@*@&@@@l@p@@@@@j@@@@@@@@@@8@@p@@^@@6@d@@@@@@Z@@@@T@@@@N@@@@ @V@@@@@@4@h@@@@@@@@@@@@@@@@@@.@2@@@@@@@@@@@ @@@L@@@(@@@@@@x@|@.@ @@@ @@@@@-@@@@@@@@@@@@N@ @p@L@@2@L@@~@^@b@X@2@$@@@@R@@@@@&@@ @n@@@@2@2@@@t@@N@@@@@@f@@4@v@@<@@>@@D@l@@@@@ @@@@4@@@@@@@@@@@@@@@@@@@@@n@@@@T@l@@@.@@ @@@@@@@R@8@@@@@@@H@L@6@@<@@@@E@@@@<@@@n@@@@@@f@@ @0@@@d@@\@<@J@v@~@n@$@@@@`@@@@@h@,@@@@@@@N@6@@@@6@@6@@@&@f@$@@@@@8@J@z@@@"@H@ @@@@@@@@@@@@@@@@6@@@@@@@@@@@@@@@@@@ @@@0@4@(@.@j@@@@@@T@@@@@4@2@@,@&@2@@8@|@@:@4@6@@@Z@T@@@@<@@@@@@@"@h@@@@@N@L@n@t@6@R@v@@@<@@@@~@0@@ @@@@@p@z@@@@@n@@@Z@.@L@@2@@@S@t@@@@ @@@\@@@@@@@@@@@@@@@@@@@@@@@@@@@@@J@@@@@@@@@@@ @@@@&@@r@@f@@@@@@@L@@@@@@:@@@@@@@@4@@@@Z@@d@H@@ @:@B@:@0@4@n@`@x@@@@@T@V@@^@4@@@@r@>@"@D@@@@ @$@@@@@`@@(@\@2@j@4@@@@ @@@@@@@:@@@@,@@@@@@@@j@@@@@H@@@@@@@@@@@>@@(@@@@@@f@j@@@@@@@@@0@@@@@@@r@@~@@f@@@l@@@@`@,@r@4@@@@>@>@F@B@d@`@@@@@h@@R@@@@@@@@@@`@R@@@@j@X@>@"@@@@@@,@@h@@F@@4@@.@t@@$@@"@@@@@@@4@h@@\@@"@@@@@@@f@T@@@@@@@@@@@(@6@:@*@@@@@N@@@l@|@@T@@@@@l@@@@F@@@@@@@t@@z@@|@|@@~@@@@@@ @@b@@@.@@@@F@|@j@d@N@@@\@@@^@t@@@@@D@@r@@@D@,@@@@>@D@4@t@l@@ @@r@@@@,@|@^@@H@@@@@@S@@N@4@@@e@@H@z@@D@@@@@@@@@"@@@@@@@@@@n@R@>@r@0@@@\@@@@R@@`@V@@`@@@@@*@ @@@8@<@h@@@@@@@Z@@@@`@d@@z@@@j@@@h@2@v@2@@@@@@@@@|@@@@H@P@F@@@@x@@@b@*@@@@^@@~@@@@ @^@ @@6@@*@@@H@x@@"@@@B@L@4@@@@@@@@@J@@@@@@@@@@@@@@@@@@j@@@P@B@x@@4@@P@l@@t@d@T@X@@@J@@@@@@@@D@:@,@\@@Z@@p@@6@@@@@(@n@x@@@@@@@@t@p@@@@@ @@@@@ @@,@"@B@x@J@@@`@@@@@@@h@J@@@@@J@Z@@@@ @j@0@@@J@@@@@@@@@@@@@+@v@@@@@2@@@@@@@ @@@@@@@@@@R@L@@@@@@@*@d@@v@X@@@@l@N@V@@@@D@N@@@@B@@@6@@@@@@@r@6@@@z@x@@@b@r@@(@ @$@@@@@@@@@d@@H@ @*@&@Z@z@T@@@@t@@@H@@@@@z@@f@:@@ @@^@@@ @X@@@@@,@,@@2@@@X@@@@#@ @]@h@@d@@@v@4@^@ @@@@@@@@@@@*@ @@@@@@@@@J@h@@@@,@@@@@l@t@~@*@@~@@@@@@$@j@T@@ @@@@@(@@@@@@@l@@Z@8@@@@6@@@@@@&@@`@^@@H@t@@f@j@Z@|@@@&@v@R@4@@@@@T@<@@@@d@P@p@@0@x@v@@@@b@@.@O@@l@6@@z@=@@@X@@@@@@2@Z@2@@@@@@@@@@R@@L@8@(@@@H@~@t@@@l@B@8@D@b@@B@d@v@@z@@L@@@D@\@@@@2@@8@D@>@z@ @@v@,@ @@J@\@@(@"@@@J@@@@b@@@@>@@@@@@T@@ @$@b@r@h@@@@(@@~@ @@@@`@@L@l@@"@,@>@@@n@B@@T@d@R@@@@j@4@1@@@@f@3@`@@@@H@8@@@@@@~@@@@@@@@~@@@@@@@L@^@v@@J@@@f@@N@@@$@>@@@@@@@@|@@t@6@@@@Z@@@@@@@x@@D@Z@@|@@L@@d@D@@b@@6@@@D@:@@@@v@B@Y@:@@n@@z@@*@@@B@@@T@B@@@@@h@N@~@@@Z@|@@@v@L@x@R@@~@@~@@h@`@@3@@@@\@@@@@@@@@j@@@\@,@@@@@.@N@@@J@@@@@,@@@L@@@@@j@@@@@ @@P@h@R@*@@>@ @@@@z@@@@0@"@~@&@@(@"@@@\@@@@2@@@T@ @:@@J@@@|@ @@@b@@J@@~@@~@z@@6@@@D@@@L@N@@@@@8@F@f@@@F@@@.@R@@`@H@@H@@*@@@@@@@t@5@@@E@@@b@@@@8@,@@n@X@>@@ @@@x@@\@@@2@x@@@@@@@l@@.@@@@@@@@@@@ @@@@@ @@l@>@^@@@@@j@@@@@@ @@@@@,@@8@@<@:@f@@@,@@@G@C@@@@@2@@@(@@8@@@@@@p@,@@@@@@Z@D@@@@p@@D@@@@@@@@@d@@;@@@@@@@@@@@@@r@/@@@@@@@@`@@&@@@@@>@@|@@6@@@@@@@@p@@r@@@D@@@L@z@v@@R@@@@@6@.@@@(@c@@@@ @r@@@@@@h@@`@L@t@@@@T@@@r@@@@^@@@@z@@@P@@<@@@2@@z@^@<@@@@@D@x@@@\@@@.@@@@T@@@"@@@@n@@V@j@@=@@v@D@k@U@h@l@@@@@@@R@x@@@@B@@`@@j@@>@@^@@@@8@@@@@@@@@:@@b@0@@@n@B@@@>@@@V@@@G@N@K@@@.@@@@b@j@@B@h@@J@@d@@@x@.@@z@@@@@@@@B@@@@@@@@@@6@@r@(@ @@@|@@Z@~@@@@@@ @@@0@4@r@@@+@@@@@@@O@@=@V@@@5@@@@@@}@p@@@@@$@^@R@@$@X@@F@@L@@N@H@@@@@@@@@@@T@@@h@@@@4@H@@P@@@@!@@@U@@v@@@@@p@,@@Z@>@v@@ @p@@@p@@@@Z@@1@@@@@Q@0@,@P@~@R@@@\@ @@@@@@&@@@@@6@"@h@@@@@&@@b@@ @b@@$@@@>@0@ @X@x@ @@@@T@N@@@@$@=@@ @@.@@"@h@:@J@@@Z@@&@R@X@R@@4@`@ @(@@@@@`@@@@@@D@"@@@X@@@ @@ @@@F@@@w@-@@>@@@@@R@@@@~@J@@l@B@@F@@@P@@@G@@Q@@H@@@@P@@@^@ @@@l@@B@@@@@@@@ @@@@"@@@@@@@D@@@!@T@@$@1@@@@!@O@@@@@@,@@@z@@@v@j@ @@@@@T@@$@@.@~@@@R@@@F@@@@@@J@@L@^@`@^@P@,@Z@@H@@@l@@f@@@@~@"@!@@@b@4@@p@\@p@@&@@@@X@,@"@R@@n@@%@@@@@a@@@@&@@Z@ @P@@@@@T@6@@@@@@t@~@@@R@@@6@@@@@@@4@@|@@2@@u@@@@i@@@@@(@@"@@@t@@P@@@@@@d@@<@@@2@ @@@@@.@@~@@@@@@@@x@@X@T@x@@@@&@@@F@@@d@@@_@@ @@!@@l@@@@~@b@@@@@@0@@@@@@n@@@c@X@}@X@@@ @(@@@@X@|@v@8@@$@@@@@@x@@`@@.@@@@@@@H@@@@@@@$@|@t@@@@@@>@p@n@Z@D@@,@@@@X@P@@@@^@@l@@@@@@8@F@@@B@@@`@N@@@@@n@@@D@R@b@~@@z@0@H@"@\@@@.@@J@/@R@R@b@<@@@@@@@@@@(@@h@(@6@@@@B@@,@v@R@n@9@Z@@@@~@@@@P@J@@D@@@@@@@@T@B@V@@(@.@d@@@f@@@@@`@@d@@@@4@7@@X@@f@@X@n@@@@@d@D@t@ @$@@@f@@@D@ @@@@@@@@@B@J@@@'@`@V@@@@@v@<@@@@@@@@"@@f@@:@@&@@.@@@@@:@=@@T@@@N@"@@2@@@@@@@L@@@@@R@<@b@@(@F@l@6@@p@R@<@,@@@@@@@l@X@:@2@"@@@(@@@@@@H@@^@<@&@:@~@@z@@<@9@9@%@@@@@B@@@@H@8@@@@b@@@@v@t@<@@@@@@@@@@@@@~@4@@V@@h@@@b@J@@ @@@@B@@@@@f@@@`@i@@@@@I@@@:@@Z@@@\@B@ @@@@@@@!@`@T@o@@@T@L@4@@/@L@J@@P@@@@@@@@@@l@X@B@$@"@@>@>@@*@"@@\@@@b@T@F@z@X@@ @Y@@@X@@,@0@@D@@@@@n@@@@@@@@&@@v@@,@@@@(@@@@@B@@@2@@N@h@ @@@@J@0@L@@(@~@@ @@@@ @n@^@@@@@@@]@@@d@@@2@@@`@j@0@@r@@@Z@@@@@@@2@@@@@@4@@f@@@@@@@@@^@F@b@:@@@@T@V@@@V@@@@\@@<@@F@@@@H@@@@@l@N@@@8@@@@@@@n@@@@z@@@|@X@:@@@D@\@@@@@@@@@^@f@n@4@Z@V@@@0@.@\@N@J@@@@@l@@<@@@@|@q@y@^@@@@f@@@@ @^@@@@`@@@`@@$@b@@@t@Z@@@@@`@@@@.@H@@@@@@@@r@F@^@<@@.@@(@&@@@@@@@@@@@$@r@@R@t@x@@@@2@@f@@,@ @@@Z@@@@(@>@@@ @@T@@p@d@0@@6@\@"@@@@@D@@H@@H@@@@@@@:@.@@6@H@@n@@@X@>@T@@\@@@`@@X@|@@d@@8@@@@@`@B@@@@&@*@@d@x@@ @V@@@8@@>@@@>@@@@<@ @@@@@@b@`@f@R@@$@@8@:@n@@@~@@@@ @@@@@4@@@$@z@@.@.@@@@$@@`@N@4@@@@@v@@n@@@@@f@@^@\@T@j@L@@@@@@@@$@@@`@@@z@N@6@@X@J@@d@@@@F@^@H@x@@@(@@@@(@@$@@@@$@x@T@R@h@@@@@@Z@&@Z@@@@@|@@@*@@@@@@R@@@@@@d@z@R@<@8@"@@@@0@D@@@@@@@@@@@N@\@@l@@@@@@@@@l@@T@@T@@@P@@@@@@@0@@d@@@~@b@d@T@L@@>@N@$@@ @\@@@,@ @v@B@D@@x@T@*@ @6@|@t@@h@b@@@@(@z@@ @@@@X@d@@@ @N@@@@@*@@N@@@@@L@*@@@@@@@,@l@@@^@*@@D@ @@@@t@h@R@T@$@8@@@ @@@@d@@@h@@@@(@&@H@^@@@ @@@B@f@R@@@~@@@@@`@z@@f@t@@D@@@@@@@@|@j@X@h@~@@&@h@@ @@@@@@@@V@8@@@@@D@ @F@f@@@,@@|@*@@@h@@p@b@l@D@H@@$@@@@@0@t@@J@$@ @@@$@@D@`@@@j@r@@@@@@@L@@|@6@@@@@t@f@B@@@(@@@@@@@4@d@@@6@@@&@@p@r@z@r@@T@@t@4@@@@@V@@@@@@@@V@R@&@z@@@@N@@h@|@@T@@@n@0@J@N@T@@J@@@@t@@@@(@@@@@.@X@v@@z@@z@@(@r@@4@T@@t@&@@@@@0@\@@.@@@r@@>@@@@@V@X@@n@:@@p@@@@6@>@"@@@`@*@@@@@@@`@B@8@@@@@@@4@@@"@$@@@@@@z@~@@j@@@j@@@@@@r@@>@@@l@@@@@@@@ @@@@$@@\@@@x@>@N@@@@:@\@@@&@<@ @@@P@@@f@~@Z@d@j@@X@@@@T@@@@@@@<@b@@@@`@j@@@t@@@@l@@@@@@ @R@j@@8@F@@@@f@@4@@@@@h@D@@@@@@F@&@@$@ @@z@@@r@@@"@B@@@@@8@@@@@@@@@d@4@h@@@@@t@@@@(@@@2@"@@@V@r@@^@j@X@@@f@B@@@@@@@@@@@@p@@`@"@@x@h@^@x@`@@@l@t@@x@j@@@z@@@@@n@X@v@j@@>@@@@H@@@@@@@B@@F@ @6@@@@@z@X@@@@6@0@@@@@@x@X@L@F@ @@@r@@@H@@@ @@R@v@@@>@v@@Z@H@N@B@P@@$@.@>@Z@@@@@@\@d@@@@@@@V@@@>@@:@8@*@@d@>@Z@|@@@@@@@@@@@@@J@ @@h@J@@p@@H@@@@@z@V@<@D@@@@h@V@^@X@@@@@.@@^@@b@@@@T@8@@@&@,@:@@^@@`@@@@X@"@@@@@@Z@V@V@$@8@@@@h@@@@p@@@@@\@@@@L@@@@L@ @ @D@@@0@^@t@`@@z@@@ @ @@V@l@@\@@R@*@:@&@d@8@@@~@V@N@~@@@@@@@@@@@@d@>@B@@@@2@v@@@P@x@n@l@@@@ @@@@@@b@F@"@@@@@D@@@N@r@@@,@@*@@ @f@@@@@t@(@@@r@R@@@@@@@@@^@D@L@*@@@b@@@ @L@`@@@@h@z@@@>@@@ @*@J@@\@h@<@@@h@@@@"@@`@@@ @"@0@@x@V@h@*@r@|@l@@@@@r@@@@@@@@@@@@,@0@@,@"@2@@r@j@@8@@(@@@p@,@X@@0@@@@0@H@J@ @@@@@z@|@@@@:@@j@(@@@@*@D@r@@@h@.@@@h@2@@@@@@@j@l@0@.@8@@@@h@@@>@@H@@@@^@@@H@X@h@@@@@@@F@4@*@t@@@@V@D@z@$@@@@@@@@z@n@@@@@@@4@@@@@"@@@@@@@@@@@@ @ @@@@@`@@@"@`@r@n@\@@@@(@@p@:@2@0@@@@L@@@t@x@ @@@@@@>@l@ @@@H@@v@@@j@$@$@@@@@@@l@n@<@@"@@@@b@@@@*@ @`@@$@@@@@@@@@@ @P@t@@@@@@t@@@h@@<@V@h@@@@b@@@@@V@@<@,@@R@@B@@@V@@@~@@@@ @D@@@@@4@4@@J@@@@@@ @@@@@@@@d@@~@@:@,@d@^@@,@@@@t@X@@@@N@@@t@~@4@ @@&@@@@:@4@@@@@x@z@t@R@t@*@2@@@ @@@P@@@@@@B@p@@|@@@`@d@ @@@@>@@@H@@@@*@@@@@@,@@@p@@@@t@@@N@@@@@@@@(@T@@@J@@@@@@@@@@@@@@@@H@@p@(@F@@2@@@@d@j@<@@P@$@@@P@D@0@@J@@@|@@@@n@t@@@t@<@@@ @j@@<@@`@4@@@@@@@h@\@\@"@.@ @@@@@@|@@@@@N@b@@b@@6@@@N@4@@h@@F@@@`@h@@@@@>@b@@@>@@@@n@@@&@@@|@@@n@@V@@@@@ @X@l@z@@2@P@@2@z@r@\@t@@@@@@z@@@h@@@@@@@l@@@@8@@@ @@6@@@j@@@,@@B@@N@V@@h@@J@>@@>@@@@>@@@@@@t@^@N@Z@H@@*@$@@@@6@h@^@@@@F@V@v@@^@@@b@@@@@@T@b@@?@@@\@@(@@@@@v@@ @@@p@@x@@h@2@@:@@\@ @@@@@@@$@@<@@X@*@ @L@@@@F@@ @@@@j@@6@(@ @@@`@R@B@@@@d@<@N@@@ @@^@@H@z@j@$@@@f@@@D@@`@@.@@@@@@0@@@@@@^@b@@@F@V@@ @,@@@@&@@@@@@`@4@f@@6@@L@@ @@2@@/@5@@@[@|@g@@@@@@@>@@@@@@:@@@@@@d@j@@:@@x@@@@R@@&@@p@V@@@ @@ @@@@@@@@@:@@n@@@@@@@@@x@Z@B@l@@ @>@.@@@@|@@@0@@@@f@:@@@.@^@@>@h@,@@J@V@@@@@@@h@V@D@:@.@@ @@@@@N@j@@@@@@\@@@@@V@@@>@ @H@@@ @@@@@@@z@x@@ @@@@@@@@@n@@h@@@@@*@.@@@h@@b@Z@>@@,@@&@@Z@ @@@"@@^@@@@.@(@ @"@@@@@@X@@@r@F@ @0@@@@@@@@V@V@@@@@l@`@J@@@@@l@@@v@4@@@@@@@d@^@D@<@6@@(@@@@ @ @:@@@@ @@^@@ @>@@&@@@@@'@@@a@F@ @@@@ @,@@@@D@@@@@@@@p@@@t@@R@@ @@@@@ @0@@R@"@@@@T@@@>@@@@x@J@@@d@\@@@@@@@0@n@@@@@~@@@@|@@@N@@@@@@@4@@@:@\@>@&@@@@x@V@@@@@@@@t@D@F@J@$@@8@@@@@4@2@@@@@@f@@@N@@@@@@@U@p@@@ @@@@7@@@@@2@6@*@v@@X@0@ @6@ @X@^@ @,@T@@@@$@@@@@@@H@@@B@P@:@2@@@@@@@@@@@@@@$@@@@@@@L@@@@@@@\@x@@L@@H@|@@@@@$@@@&@@@,@F@@@J@*@@@@@@@j@V@<@@B@@@@@@@@@4@n@@@@ @`@@F@@<@>@@@@@@@@@@@*@M@#@D@`@r@N@@@@@V@@@@@@@@@@@@>@@L@v@\@@@@@@@@@8@@<@@@@h@@@@@@t@V@`@@@@R@8@@@P@@F@@N@t@@@@z@t@@@@@ @@@@ @@^@@\@@@@R@B@@@@@@@@r@N@R@*@0@&@@@@@@@ @@4@~@x@@@@(@ @J@@@2@@@@0@8@z@@@@@@ @x@v@@@@@@@@@@@@@,@@@@@@@d@@@@@@@D@V@6@@@@@@@@@@@&@@f@4@@"@@~@@x@P@@@@2@D@^@@@@@L@@x@@`@6@@d@@@r@@@(@n@@"@@@@@@@@@@@p@J@f@2@"@ @@@@@@@@@@D@6@R@@@@4@@d@@@@4@p@@4@@@4@@@.@@G@u@n@B@6@@@R@@@@J@V@@.@T@@&@4@<@@@@@@2@@@|@@x@@H@@$@D@ @@@@2@.@.@r@@D@"@@|@Z@^@@@@@ @@@@.@h@L@ @@|@@@@@6@:@@@@,@z@@X@@@@p@f@@ @@@@@v@v@R@D@D@2@&@ @@ @@@@@@@@@6@H@P@~@@@@P@.@@@@`@@@@j@@@@@B@e@1@@"@@@J@j@@@|@~@J@j@@@@@R@d@@@@@L@@@@@@@ @@,@,@V@$@@@@@@L@@N@@@@B@n@J@@@@@p@@@ @@@^@4@@@@@@@@@^@@<@@@@@@@l@N@@@@@@@n@P@@2@H@>@4@.@ @@&@@@@@@@@@(@<@N@J@@@@ @"@@@@`@X@@@@X@@j@+@2@U@@@Z@@@@&@"@@@@h@@,@^@J@@@4@@@@:@^@*@@z@@@@@<@@N@@@@@b@@8@@B@@@@@@x@@@x@@>@@&@v@@*@@@v@`@@@,@F@@@n@@ @@@>@@j@Z@:@2@@@@@@@d@T@R@J@*@"@ @B@@@@@@@@@@@@@@@@H@j@@@@2@@J@@x@@@N@@<@j@@@@T@@@@@@@d@j@X@@@@@`@X@@@,@F@@@@@z@V@r@n@@ @@r@z@L@2@@<@@@H@0@@@@@$@@,@@@<@d@>@X@V@:@@j@@v@@ @`@\@@(@@|@@@"@@@@@@@@h@(@.@@@@@~@@t@V@@R@2@@@&@0@@@@@@@@@@@@@@@@>@L@@@@@@@D@@^@@*@@@@"@@@@X@b@ @<@@*@.@<@V@z@@@@@L@ @@,@@R@ @@@@@@@@@@@@p@T@D@$@@@@@@F@@@@@@ @@ @@@L@@@@@R@@T@@R@@@@N@@@@`@@@L@@@d@n@(@@@@@@t@@J@N@V@:@H@"@@@@@@@@@@@@@@@@@@&@V@J@`@@@@@@@@f@@@@@@@@@2@\@:@:@ @>@@H@P@X@*@@h@@L@0@@L@@@@X@,@@^@p@\@l@f@f@2@@@v@z@b@@@T@@@H@ @z@.@2@@@X@@@@@@.@*@@l@@4@f@z@t@@l@B@H@+@@@N@@@D@@r@x@@ @@@@@@x@T@J@,@N@@@*@@ @@,@@@@@@@@@@@@@@@@@@8@Z@t@|@@l@@@@@Z@@"@0@H@@j@@@@8@@@@@|@8@@@ @@@F@@<@,@@r@@j@x@$@8@`@T@4@J@@@@@N@@@@x@V@J@@@>@@T@,@,@4@@@@@@@@F@V@@@@P@ @@@@@2@z@@B@j@<@@@@ @@@@@@T@@V@L@Z@2@*@>@@@@@ @@@@@@@@@@@@@@@@ @@@F@:@6@V@n@@@@ @R@@@@@@@@t@X@\@r@@0@h@@^@@*@D@$@@@L@@>@@@n@4@(@@@@@@0@ @"@l@@@P@@.@<@@^@R@T@@X@@@@@@\@R@h@@>@@\@ @@@@@@p@Q@@`@b@D@@x@@@D@@@@@@@l@b@h@N@B@N@@,@ @@ @@@@@@@@@@@@@@@@@@@@@&@@N@V@:@j@@@@@@@4@J@@f@@ @@@@@@@@T@N@$@@@t@@"@@@B@,@@@~@@@@:@@@@@@V@D@@@@&@(@L@J@@`@@P@d@ @J@L@@@`@@4@,@@4@@t@!@j@h@@@ @@ @|@,@@~@:@@@n@@@@@p@z@@f@F@V@@P@@D@(@@@@@@@@@@@@@@@@@@@@@@@@@ @"@*@d@h@P@@@@@@@@D@R@2@f@@n@@@`@@@@J@d@L@@@@@H@@&@@L@@Z@(@@@@@@@@@@p@.@h@@@j@@@@@@ @@@@@@0@Z@t@X@ @N@@W@@m@O@@@V@,@@&@@t@@@d@X@ @@@@@~@l@b@V@\@R@@D@@ @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@(@j@P@@p@@@@@@@@ @@:@F@2@~@^@@@D@@@@>@@@@$@@.@@"@@@@@J@@@@@@@6@*@@l@@^@F@ @@@@@*@@@@@b@ @@P@@D@@@@@@p@@@L@@l@n@ @@@R@@@@@@t@z@`@8@\@F@6@8@@"@@@0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*@@@j@t@@@r@@@@@@@*@@"@l@@@@@"@(@E@K@@ @\@@@+@Z@@2@@@p@0@@@@@@.@$@@F@J@F@@ @2@`@@4@t@R@@:@@@H@n@@|@:@r@@h@j@z@@@*@@v@@@@b@|@*@@@@@@@@D@^@V@4@V@ @@B@@@@@@@@@@@@@@@@@|@@@@@@@@@@@@@@@@@"@@V@B@8@X@p@@@@@@@@@@j@n@@@T@@*@@ @@@@^@@@H@@F@b@@@@R@N@t@B@@@>@z@.@@@@@@>@v@R@6@<@p@ @<@P@@@\@@@@N@x@$@@:@@@@~@D@@@@@@@@P@j@X@D@T@0@@6@(@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(@4@&@0@L@b@h@@@@@@@@@@ @@@ @@@@@@[@@'@r@d@@@d@l@P@@n@Z@@@l@(@6@<@@@D@j@T@@@*@ @@@X@@@@@@@@@@@R@r@@j@@h@P@@*@@@@@@@z@\@`@`@X@X@0@@&@@ @@@@@@@@@@@@@@@@@@@x@|@@n@@@@@@@@@@@@@@@"@@ @&@ @(@J@2@@\@h@@@@@@@.@@@@@@@X@@d@@@@^@|@R@z@@$@@"@L@@@@@@@@<@v@@F@@@@~@p@m@O@@@@@@J@6@@@>@@@@@@@@:@4@@@@@@@\@8@n@T@&@L@,@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@D@2@H@N@p@b@L@@@@$@|@@@@$@ @@N@@1@D@L@@@@@@@@@@@p@@H@4@v@@@[@Z@x@@@2@@K@@V@@ @h@@@@`@@@N@l@\@6@6@(@ @@@@@@z@b@\@B@,@4@$@@@@@@@@@@@@@@@@@@@@.@@@@@|@v@z@@@@@|@@@@@@@@@@@@@@@@ @@ @@B@&@:@p@F@@@@@6@&@V@6@x@@@@@ @@@@@@@@@@@@@@b@@ @@ @^@Z@G@@@@@D@t@ @z@.@@2@@t@@J@(@@@@.@@@@@"@@@@@@~@v@h@8@V@0@V@$@ @.@ @@@@@@@@@@@@@@@@@@@@@@x@t@x@|@n@@x@|@@@~@@@@@@@@@@@@@@@@@@@@N@@X@@V@@@@@@@@@@H@|@f@@@@l@f@f@P@\@@ @@@@@N@@@l@F@@@@@@@ @@@@@@@D@@@@4@N@B@*@@@@@@@@@@b@|@Z@>@<@$@@(@"@@@@@@@@@@@@@@@@@@@@@@@@@z@v@r@|@p@|@@|@@@@@@@@@@@@@@@@@@@@@@@2@&@X@b@T@@@L@@@@@X@@@f@v@T@f@ @@@ @B@T@@@@@l@@@n@@@@@t@&@0@t@r@@@@@<@(@@@J@4@@@@@@@@@@b@h@x@^@H@.@<@2@@ @ @$@@@ @@@@@@@@@@@@@@@@@@@@@@@j@t@\@x@r@p@@~@@@@@@@@@@@@@@@@@@@@@@@,@"@R@N@>@L@r@t@@@@@@8@2@@@@@@@@@,@:@b@n@Z@Z@ @R@R@@v@^@"@@@@@@@@@@2@@@@N@@&@@@@@@@@@d@^@Z@Z@b@J@H@<@,@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@f@f@f@t@f@t@@f@t@@r@@@@~@@@@@@@@@@@@@@@@@@@@ @"@*@$@>@2@@@@@@@@@@@t@@@@@@@@@@@@@@@J@\@j@<@.@"@@@@@ @@@@@@@@@V@P@p@x@R@p@X@@@@&@8@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@l@~@p@h@n@v@@x@@@@@@@@@@@@@@@@@@@@@@@@@@@@"@2@8@H@~@@P@@d@v@v@n@@@R@p@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@F@R@6@6@P@(@8@@@ @ @@ @@@0@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@`@x@b@t@d@r@@b@t@p@j@~@v@l@@@@@@@@@@@@@@@@@@@@@@ @@@*@&@2@@@N@2@:@@@j@H@X@z@b@b@X@f@@p@@@@z@x@@@z@@@@@@@@@@@@z@n@f@@d@|@@v@Z@@(@<@&@.@ @:@4@ @@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@`@n@n@X@n@n@@h@l@Z@@h@|@j@|@~@@z@p@@@@@~@F@@@@@@@@@@@@@@@@ @@@@@@>@@@F@0@@4@F@d@8@F@x@X@0@p@p@j@J@<@V@@b@n@d@p@|@p@b@^@2@H@@@,@L@6@>@@@@@@@"@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@t@l@d@@p@\@t@p@@p@|@@|@x@@@~@@@@@@@@@@@@@@@@@@@@@@@@@@@2@@ @8@"@>@,@@@.@^@b@N@6@d@J@8@^@V@^@\@^@\@@l@`@~@z@V@h@p@J@H@D@@@X@D@@D@8@@@$@ @@&@$@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\@l@N@b@b@^@\@b@r@j@`@v@z@n@x@x@n@h@p@~@|@x@@@@@|@@@@@@@@@@@@@@@@@@@@@@ @@@@@&@@@@@@@@@&@B@(@&@>@$@&@ @.@6@@@@,@@ @@@&@@&@(@@@@"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@R@t@\@`@j@Z@d@b@p@^@b@v@~@b@x@h@v@h@n@t@n@r@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@ @@@@@@@@@@0@@@@.@@@ @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@b@^@Z@`@J@Z@b@P@j@f@`@j@^@p@n@h@@j@v@|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @*@@@ @ @@@ @$@ @@(@@&@@2@@ @&@&@@@@@$@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@V@d@b@`@H@Z@f@\@h@`@`@b@`@r@v@n@\@f@l@t@t@@@t@@r@|@@|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@`@b@T@V@Z@h@h@R@p@f@d@|@f@l@h@j@p@r@d@@@@@t@@@@@v@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T@L@V@^@\@^@X@P@P@T@d@l@`@h@j@V@t@`@h@x@V@z@@@t@x@@~@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@sunpy-0.8.3/sunpy/data/test/EIT/efz20040301.050010_s.fits0000644000175000001440000042350013203275053021110 0ustar nabil00000000000000SIMPLE = T / conforms to FITS standard BITPIX = -64 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 128 NAXIS2 = 128 DATE = '2004-03-01' / Date of file creation TIME-OBS= '05:00:10' / DATE-OBS= '2004-03-01T05:00:10.532' / UTC at spacecraft ORIGIN = 'Rocket Science' / Rocket Science = NASA GSFC DATASRC = 'LZ file ' / TELESCOP= 'SOHO' / INSTRUME= 'EIT' / OBJECT = 'full FOV' / BUNIT = 'counts / pixel ' / WAVELNTH= 195 / 171 = Fe IX/X, 195 = Fe XII, / 284 = Fe XV, 304 = He II FILTER = 'Al +1 ' / DATE_OBS= '2004-03-01T05:00:10.532Z' / SCI_OBJ = 'CME WATCH 195 ' / OBS_PROG= '195_10S_AL_1.000 ' / CMP_NO = 1 / Unique campaign instance (1 = synoptic) EXPTIME = 12.599 / s (total commanded + shutter close) EXPMODE = 'backside ' / FILENAME= 'efz20040301.050010' / CFTEMP = -66.71 / CCD cold finger temperature (C) CCDTEMP = 7.34 / CCD temperature (DN/100) CTYPE1 = 'Solar-X ' / CTYPE2 = 'Solar-Y ' / CRPIX1 = 64.5 / Sun center x, EIT pixels CRPIX2 = 64.5 / Sun center y, EIT pixels CRVAL1 = 0.00 / CRVAL2 = 0.00 / CDELT1 = 2.63 / Pixel scale x (arc sec, fixed) CDELT2 = 2.63 / Pixel scale y (arc sec, fixed) SOLAR_R = 372.27 / Solar photospheric radius, EIT pixels SOLAR_B0= -7.22 / Degrees SC_X0 = 0.00 / s/c yaw (arc sec) SC_Y0 = 0.00 / s/c pitch (arc sec; -109.14 after 1996/04/16) SC_ROLL = 180.00 / s/c roll (deg., Solar north + CCW from nominal)HEC_X = -139130208.00 / s/c heliocentric ecliptic x (km) HEC_Y = 46576272.00 / s/c heliocentric ecliptic y (km) HEC_Z = -94896.31 / s/c heliocentric ecliptic z (km) CAR_ROT = 2013.00 / Carrington rotation at earth COMMENT CORRECTED DATE_OBS = '2004-03-01T04:58:14.631Z' COMMENT COMMANDED EXPOSURE TIME = 10.000 s COMMENT SHUTTER CLOSE TIME = 2.599 s COMMENT LINE_SYNC = 'no' COMMENT CAMERA_ERR = 'no' COMMENT IMAGE_OF_SEQ = 0 COMMENT READOUT PORT = 'B' COMMENT NUM_LEB_PROC = 3 COMMENT LEB_PROC = 26 (no ROI) COMMENT LEB_PROC = 27 (no occ mask) COMMENT LEB_PROC = 12 (Rice) COMMENT BLOCKS_HORZ = 32 COMMENT BLOCKS_VERT = 32 COMMENT P1_X = 1 COMMENT P2_X = 1024 COMMENT P1_Y = 20 COMMENT P2_Y = 1043 COMMENT N_MISSING_BLOCKS = 0 HISTORY Version 4.0, 2001 December 10 HISTORY Image linear resampled to (128,128) for SunPy END @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@x@f@t@@p@h@l@d@b@f@V@l@f@b@j@b@d@b@T@l@\@P@L@R@P@L@Z@b@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@0@@@@@@.@@(@ @@4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|@@@x@@z@t@b@|@r@h@h@x@X@`@Z@n@f@X@h@X@`@^@`@^@X@P@P@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@*@@$@0@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@~@@f@r@r@l@l@r@p@r@\@f@v@l@h@X@\@Z@N@J@V@R@^@@@Z@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6@$@ @@@*@@&@J@:@.@H@ @@8@@@@@*@@@@@@ @@@@@@@@@@@@@@@@@@@v@@@@@@@r@|@r@f@z@^@j@r@f@X@f@p@l@f@\@Z@b@P@X@X@R@Z@N@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@&@@(@@@&@@@@*@@:@<@@4@0@\@f@8@J@>@\@X@4@@"@.@.@0@(@"@,@@$@@@@@@@@@@@@@@@@@@@|@@@@@@@z@x@|@t@x@t@b@l@b@^@l@h@t@f@`@\@P@Z@T@T@T@X@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@B@@0@$@@8@0@&@@@N@ @l@r@n@n@:@&@H@&@@@ @ @:@*@ @$@ @8@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@|@j@x@|@x@b@n@x@h@Z@h@^@\@^@^@T@V@H@R@R@X@^@Z@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@(@J@:@@@:@@<@@4@X@,@H@@8@^@L@t@@@@@@@~@p@Z@p@n@l@X@b@.@h@R@F@2@b@*@.@4@"@@@@@@@@@@@@@@@@@@@@@@@|@|@|@n@r@h@r@r@l@n@|@f@h@\@V@`@P@b@N@\@^@j@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@B@@@@@@@L@N@@@X@<@N@>@<@b@P@@@@@@@@|@h@~@\@t@@r@@r@:@b@b@T@T@V@@"@"@4@@&@@(@ @@@@@@@@@@@@@@@@@t@v@@z@@~@n@r@v@l@\@h@Z@b@d@J@X@d@T@\@V@d@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@,@@@"@@"@*@*@(@B@X@L@8@`@b@4@h@b@j@@D@@@@@@@.@@@@@@@@@@@@@@@~@@T@:@J@B@4@@@*@<@@@@@@@@@@@@@@@@@~@@~@@~@x@v@x@f@j@t@f@h@Z@R@\@P@\@d@N@f@^@j@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@8@@J@ @@`@0@N@h@L@x@X@j@@@V@@@@@@@@@L@b@@@"@L@4@@@@@@@@@@@@@@@N@x@j@@~@p@p@V@@@@@@@@@@@@@@@@@@@@@@n@t@v@p@r@~@n@n@j@j@X@r@\@d@b@n@R@T@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@,@ @B@ @>@F@@R@H@V@@l@z@@@v@@@@@@@@ @r@@@@z@l@N@"@@@&@R@@@@@@@@@@@@f@h@@@@@V@l@8@@@@@@@@@@@@@@@@@v@@@@@@r@z@z@t@v@`@j@`@X@d@h@Z@d@^@`@X@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@0@@@.@N@X@|@b@j@z@@l@@z@@@@@@@ @@@@@.@`@^@@L@|@@@ @ @@@x@@@@@@r@@\@@2@@@@@@@@@x@D@8@@@@@@@@@@@@@@@@@@@@~@@@@z@v@b@l@`@f@^@b@b@`@b@l@T@^@@@@@@@@@@@@@@@@@@@@@@@@"@@ @@@@ @2@@@8@ @<@^@J@r@@x@@@@@n@@@@*@@@V@$@J@H@^@r@`@@@@ @@@@Z@"@6@@l@@@@@@@@@@V@@.@J@>@ @@@@\@f@l@6@@@@@@@@@@@@@@@@@@@@@h@h@@Z@@h@v@l@`@^@j@\@\@Z@V@@@@@@@@@@@@@@@@@@@@@@@@@@:@@@*@ @@"@,@T@T@P@@l@v@@@@@@0@@@@J@\@t@j@@B@@@@@@ @D@@@N@R@@@|@\@@@@@@n@|@@&@@@@@@@@ @@@@@@^@Z@0@@@@@@@@@@@@@@@@@@@@@t@@l@~@v@j@R@j@Z@p@Z@f@Z@b@@@@@@@@@@@@@@@@@@@@ @@@@@@2@,@<@j@J@F@`@N@@l@@@@@@@X@`@j@@@@L@@@@@B@@4@4@V@@@@B@@@a@4@*@@@R@|@R@Z@0@@@@6@@@p@@@@@H@@@:@N@@@ @@@j@.@6@@@@@@@@@@@@@@@@@|@@@@@r@|@x@f@p@f@\@r@j@\@`@@@@@@@@@@@@@@@@@@@@@@@@(@ @R@@:@J@@@@F@d@@@t@@@@@@D@n@@@@@@@@@D@t@*@j@@@r@@~@$@@@L@@@<@@@@$@@@@n@@@z@@@0@@@v@@@@@@@\@@@@@f@@@@@@@@@@@@@@@@@@@@@@@@|@~@l@v@v@ @Z@f@l@l@h@t@@@@@@@@@@@@@@@@*@@@@@@@"@*@2@Z@>@T@~@b@@@@@@@.@@@X@d@@@@X@@@@@@v@@@@t@@@4@@t@@@Q@@t@@>@B@N@@ @N@n@@@B@|@~@@@@@@@@@@p@2@@@L@ @@@@v@N@,@@@@@@@@@@@@@@@@|@@@@@p@t@p@p@b@d@x@`@j@@@@@@@@@@"@@@@@.@@@"@@@ @0@8@D@6@`@2@X@@l@@@@@@ @t@|@@@@@@@@@*@F@"@@v@@@$@@@@R@F@H@@\@@@@P@@|@@@G@@@@@@3@@@L@h@@@@@@ @@@|@@@@@$@@@z@R@R@X@4@@@@@@@@@@@@@@@@@@x@@r@z@l@X@d@^@d@@@@@@@@@@@@@@@@@@,@@@:@@6@r@V@^@Z@p@@@@@@B@N@b@@@@ @@V@:@`@@@.@b@@D@@z@@@T@n@@@^@@@@@b@H@@L@@>@X@Z@@@@@@R@=@@@1@@B@@,@@@@p@@R@ @@@@&@(@@@x@`@L@4@$@@@@@@@@@@@@@@@@@@x@@p@n@h@h@b@j@@@@@@@&@,@@2@@*@8@@R@N@<@f@6@>@z@8@~@@t@@@@ @@@0@`@@@@\@r@@@$@j@@X@0@.@@,@.@>@ @h@@@@Z@|@z@@R@@`@b@@8@>@r@6@@T@ @2@,@@$@@d@@9@@@1@@@D@@X@@@@@d@&@@@b@&@@@@x@j@@@8@*@@@@@@@@@@@@@@@@@z@t@n@z@t@h@r@@@@@@@*@@@0@"@@@ @@F@0@<@L@H@>@H@n@@@@@@@@@@L@p@ @@F@@@@P@H@X@@@@@@x@@@,@@@R@D@@.@ @6@@@@@@@@<@@@@$@`@@^@@@@@@@r@/@@@#@ @^@j@$@@@@@b@@@@0@@@@@j@R@R@@@@@@@@@@@@@@@@@@r@~@|@b@p@l@@@@@@@@@@@$@@(@"@F@H@N@<@ @@@@@@@@@@ @x@h@@@N@@@@`@@@@(@:@^@@>@@V@@^@@@@@T@j@ @@j@\@>@@@@@@@@&@@@H@@~@@&@<@@@@@ @,@@-@@.@\@j@@&@@@@@6@@@J@@@@@p@l@@@$@@@@@@@@@@@@@@~@@z@@t@t@@n@n@@(@*@,@:@@ @D@$@H@<@H@d@B@`@l@d@@@@@@@@@@T@@@@:@x@0@\@@@:@`@@ @@@@N@@*@^@|@@@X@"@\@@@@8@@J@:@@P@N@@.@@@<@F@@@@*@@@l@<@v@&@@@r@\@@@@+@|@@@>@`@@f@@@@t@@f@N@"@@@@p@,@,@ @@@@@@@@@@@@@@@@z@@@x@x@@@@@@@$@@@.@N@0@N@4@t@j@\@t@l@N@@@@@&@`@j@@@6@@@,@@@@$@:@B@@@@@|@@@>@V@@@>@$@@@@@l@z@@:@@@(@D@@@@p@4@N@.@@B@@@@:@4@@@,@@@r@b@&@@D@0@@@@@@f@@@@@@@8@@@@@L@@@@@@@@@@@@@@@@@@~@@|@z@@*@:@B@.@2@2@<@4@8@T@>@B@n@@@@@x@@@@@@@N@H@@@@@@(@|@@d@@l@@2@@N@:@ @t@.@@ @4@@(@H@@@@@@r@@@$@@&@@@@@b@V@n@@@^@@@r@@@x@@:@z@@@@L@@*@,@@@@@N@@@@@D@@>@@@@T@@@t@N@L@.@ @@@@@@@@@@@@@@@~@@@@|@@&@ @@D@*@:@@@,@h@@@N@n@^@@@@@@@@@@@T@@@X@@@L@@@J@V@T@@D@@j@F@@@z@@<@N@@@@@<@@@@>@@@@H@>@@@@`@z@@@D@@@@@@@4@@@@@@@(@@p@@@@@@@@@@@@@V@ @@,@ @@@.@@@@X@D@(@@@@@@@@@@@@@@@@@z@@$@@F@&@$@"@@N@@X@P@X@h@R@@@@@@@@@0@@n@@(@r@@@^@d@@@@@@@@@x@@f@Z@D@@Z@:@@@@@x@@@0@B@@@@h@@@@@@@f@@f@@.@@@z@@F@@@`@@*@@@@@@F@p@@f@@j@@@@@@@ @4@&@b@ @@@h@V@D@*@@@@@@@@@@@@@@@@@@n@*@r@d@L@h@T@v@@t@@l@t@@@@@@@@2@@L@@@ @*@@@"@R@b@@@@X@@r@@@@T@h@@4@@@Z@@@@@@@@2@t@@@l@b@@@6@@@@@2@$@@@B@$@^@@.@\@<@2@@@@T@(@@@@@@T@@@@@@@@@@@@@@@@x@@@@@h@B@@@@@@@@@@@@@@@@@@@4@H@6@>@H@@@h@f@n@@p@@@@@@@@ @@x@F@@@@F@V@@@@X@@@@@@@f@@@P@"@~@@@@@:@j@@@@@@@@6@ @F@&@@r@.@@@@f@@&@L@@@"@@ @@@@@@@ @Z@@L@L@@@.@@@@@@@<@@>@D@@@@@@T@@@@z@^@8@<@,@$@@&@@@@@@@@@@@@@8@T@:@:@`@d@p@@z@@@@@@@@@@8@Z@|@@@@@@@@@@@@@L@@@@@@Z@@~@\@@@>@j@^@D@@@@T@4@@>@@@@T@@(@@R@T@l@@@@f@.@i@@4@@@@@2@@h@@@@j@@r@:@@@T@@@h@@@@@@@@@2@@F@@@@~@X@P@R@>@@*@ @ @@@@@@@@@@@@N@j@@@@@@@@@@@@@L@@@@v@@@@,@>@@@r@V@x@@@@D@V@V@@@@@@@@@@@@~@h@`@|@H@@@>@P@@@@^@6@@@@p@@R@ @@P@ @@@@@ @@@@@@n@@@&@H@@@@N@<@@@@n@*@F@@@@v@P@@@@B@h@@@b@,@@@@@@h@V@F@@&@@@@@@@@@@@@Z@^@X@j@v@T@@@@@@@@@L@N@F@v@~@@@6@@@@@@@^@>@L@|@@v@@@@@z@|@@,@B@@@\@"@:@h@@@N@@Z@<@N@(@@4@|@@@@@`@j@@@ @@2@@v@b@@J@f@T@d@*@8@@@N@R@@@@@x@@V@@@X@@6@@(@@@&@h@@@J@@@@@~@d@j@F@2@"@(@@@@@@@@@@@@j@@@@@@@@@@@@p@l@@@@@.@@l@\@@z@@@@@@~@&@@@@@@@@@@@F@@@@@@&@2@j@@b@@ @<@f@~@@@@p@@H@@@@H@@4@n@@4@:@F@@ @@@$@V@@P@@r@n@@@T@@@0@@@@@@Z@v@@@@l@@2@@f@d@:@@@@@@T@d@$@"@@@@@@@@@@@@n@@h@@@@@@@@@8@@x@@$@:@"@P@@@@F@@@@@$@:@F@@@@@@@@@@@@d@@@@@l@(@0@$@6@x@.@x@@F@@@l@@@@X@@@@"@@@\@@2@@@@@ @*@@@@\@@@ @@@@@@@^@@B@@z@@@ @@@@@@<@@@N@H@2@@@@@@Z@f@R@@@@@@@@@@@t@@^@@@|@@@@@ @@|@@@0@4@B@4@$@H@ @6@@@b@L@.@l@@j@E@R@v@@@@@@@@>@@@f@@@*@2@x@@@X@:@&@4@@.@D@&@X@V@@@@L@@@@@t@*@^@@@@@R@J@@`@@@@,@@@@@@@@4@B@ @@@$@V@:@@@@@@@@<@"@@@@@@@V@T@Z@.@"@@@@@@@@@@@@@@@@@D@B@@@@@@@@@@~@@@@r@@*@8@s@@6@@@t@\@@@@ @@@@*@@@@D@<@@@R@@@@@v@j@@0@@@@@T@r@D@@@V@F@@j@T@0@@l@@F@T@B@n@:@@l@X@h@x@@^@@B@@"@@@@@(@B@@@@~@@L@@ @@R@.@*@$@@@@@x@z@d@N@*@ @@@@@@@@@r@@@@@@.@*@\@@@@H@8@@@>@@@P@@ @H@b@@@@F@@.@@X@,@@@@6@@h@`@4@@@0@@`@@@ @@j@@@>@.@@x@4@@@@@@~@B@@0@@4@$@@B@X@*@@@@P@@@\@p@@.@@@^@@z@@@x@@@ @|@z@@r@@z@@@@@@@^@2@:@ @@@@@@@@h@L@D@@@@@@@@@@@@@@@4@h@@@:@P@@V@@F@,@@@@@@\@.@(@H@~@`@@@@@@@"@^@@@J@@6@@@@@>@@@V@J@@@\@B@@x@ @@.@@@&@@P@r@H@@@ @@ @@r@|@@@@,@@@@@@@@@@@@Z@@@@.@@@4@@@@@@F@@@@@R@@F@@@@@r@T@@f@:@"@@@@@@@@@@@@2@T@.@@@@p@@@@X@V@B@@j@ @ @v@@@@(@@@@@n@@@@@@@F@@*@@@6@@@@@@@ @@@@@(@f@"@@:@N@<@@@@@@v@t@<@@r@@4@b@@@@@r@@@D@Z@@d@@@@@@N@@@@P@@>@@@l@x@@@@$@@ @"@@@<@<@6@@@@@@@@@f@T@(@@@@@@@@@@@@@@p@@@>@n@$@@@@@@@@@J@@@|@@f@@@@@@@@2@ @Z@.@@2@@@@@@@@@@@@@ @n@&@@0@@@@@@@@*@@^@@@@@:@@,@^@@@@@@(@ @Z@"@@@2@@,@*@@<@@@@R@@P@@H@@$@z@@@@@@*@(@6@@@@@@@@@@p@Z@"@@@@@@@@@ @@F@L@N@@@@@@"@<@@r@@X@@@@n@ @@@6@@@@ @P@@@@ @^@@@@@8@@v@@@@@@p@@@J@@@@T@@,@@@@@@@ @@@,@@@@&@ @8@ @n@@@@0@@@X@J@@@@@@@@@0@@Z@@@:@@@@@@@@@B@@N@@@ @@@@@@@@@r@d@(@J@(@@@@@@@@@@R@>@@,@*@@@@ @\@ @ @@@Z@@1@@@@,@0@6@@@@@@@@@@@@@@@@@@@r@@~@B@2@(@P@l@z@D@@@@@@@@\@&@@@@@@@@4@@@r@@@@@z@(@r@@@H@@X@@@@@D@p@<@T@f@@$@~@@@@@L@@@|@>@.@L@2@J@@@B@@@@@@r@b@R@:@8@$@@ @@@@@T@B@@@*@@@@@@&@=@@@~@@@@(@@(@@@X@@@f@l@@J@@j@~@,@p@@\@|@@x@@"@D@4@@ @@@@@~@@@@@@@@@H@$@@~@r@@v@@8@:@@z@@Z@@@@@6@@@@0@B@@@X@@^@@@@@i@:@@b@@@@@@@ @@@<@B@$@$@$@,@F@0@@@@t@j@X@J@8@$@@@@@"@@&@@@@@@*@V@@@ @O@@@@@"@`@@@@@(@ @@@@@4@f@V@@b@l@$@D@@*@@@X@8@@.@@@@@@@@@@@@@@@@@6@@@f@,@\@@@,@@@ @@@@@@@@J@b@@@V@@@V@@`@@L@ @@@@@6@@H@@p@T@@H@@@@@@^@R@j@h@@h@:@@@@l@@b@>@H@&@@@@"@@$@f@@@@@F@@@o@g@2@@v@K@@g@M@@@@,@n@@(@@@@@@@@h@*@$@@@@@@@@@@@@@*@@@@@@@@@@@@@@"@J@J@~@@@|@~@@@F@T@@@@~@@$@h@.@@@^@&@x@@*@@@@@@@d@,@T@N@@^@4@@@z@@@@r@@@@@@Z@ @@@@@@\@J@&@ @@@Z@@@@@.@@z@V@@F@G@@r@@@@o@_@@@@@b@ @@@6@@@@@@@@*@@@@@@@@@@@@@@"@@@@@@@@@@@@@@*@L@@@@f@Z@@@@@V@@@D@@@@.@v@X@@L@@m@@@@[@@h@@N@$@6@n@@@J@@@@@6@"@@@@@@v@@f@F@J@ @@@|@X@F@@@@ @f@d@@@@@@@@H@@@@S@@P@@>@@@h@b@@p@r@@@h@@@"@@@@r@@`@@@@@@@@@@@@@@@@@@@@@>@@@@@<@`@@@`@@ @@p@@H@n@@ @@@@@@@B@@@@7@@@@@/@@@>@@b@@@@@@,@f@r@L@@@@@V@2@@@@@@@@@@@@@`@6@@@@H@H@V@@@f@@@^@:@L@@|@[@K@@|@E@*@@|@@^@@@@@@V@,@@@r@<@H@L@@@@@@@@@@@@@@@@@@@@@@@@4@|@,@R@ @@@@4@@N@@@@D@*@@@p@@@@@@@@@@Y@@-@@@@@@@@@@@@@@@@x@@@@X@@@@@@ @|@@R@@@@b@T@"@@@,@L@T@h@@@>@@@@@@j@*@$@@@@@+@@ @@X@@f@@@@@@@@@@@6@ @@@@@J@@p@@@@@@@@@@@@@@@@@@@@@ @@ @@@@@l@T@@&@@@@@h@@@@@@@r@@@r@`@h@@v@@;@@~@@@@@ @@@@@t@$@@@f@H@D@@ @@@t@J@@@@z@P@6@ @ @@n@,@@@@j@z@@`@r@`@@X@v@@@)@@!@@@0@x@ @x@"@@@n@@@@F@v@@z@@0@@&@@@@@@@@@@@@@@@@@@$@@(@n@`@T@@h@@@@p@@@@v@@@`@@@J@Z@@@@@@@@D@@@0@@@@@@0@@@@@6@\@@@@4@|@@,@@@@@@T@@@@@*@H@@@@:@2@@@L@H@p@@@@R@@@@^@&@@@C@@@@}@@@@@@|@~@R@6@N@@p@`@"@@@@<@2@X@b@@@@@@@@@@@@@@@@@@@v@@@@Z@(@@@@D@x@@j@@\@@@@@@r@P@@Z@j@@5@@@@d@X@@F@U@@ @A@*@~@@B@,@@0@@@ @@&@0@@@@H@f@*@@@d@Z@H@@@Z@F@@@@V@@@@,@&@|@@@L@@@@8@@(@6@h@@u@@"@ @b@@@@t@2@D@@:@@@@@@@*@@~@@@@@@@@@@@@@@@@@,@,@d@@@@@@4@"@>@@@@@(@@@@@@@@@@@>@&@z@n@@@@@N@@u@@z@@@@j@h@@@@@$@z@@@J@4@@~@p@~@b@:@2@@@@F@@@n@^@>@@ @V@@@@>@:@@@@2@d@ @@@@@@@F@@/@w@Z@@K@f@@H@`@@l@@@@@"@@@@@@@@@@@@@@@@@@@@D@@|@@^@L@@@r@ @@@@0@@@@L@@@@@@$@@@v@B@$@X@@:@ @+@n@@@@@@"@@@@@ @@&@@@f@H@$@4@@d@.@T@`@`@V@L@@@@P@.@@@@`@"@@p@@@@@ @@@@B@@r@@:@@@@@x@@@@@|@@@@@V@@@@@@D@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Z@(@*@&@F@@B@@@f@@@@@@@@@N@$@@@x@@`@\@@Z@@@<@@V@@@@4@N@(@@@@@@@2@@@"@\@P@p@^@*@6@R@@v@F@@@@x@2@@@@@@L@@@@ @@:@@@p@@\@p@@n@@@@@J@ @@.@@@@^@x@@@@@@@@@@@@@P@@@@@@@@@@@@4@T@`@@@X@@@@@@.@8@R@@@@@@|@@ @@@:@@@@@@@@X@@x@T@@@@@@4@X@@v@@@L@@@4@6@ @`@>@@J@@@@@@@@4@@x@2@@@@V@,@.@@@@@>@4@@@@*@@@@@@@r@@r@@@@@@@@@@@@@@@@@@@@&@@@@@@@@@@@@@@@@@X@@@@@v@z@@@@ @R@@l@@b@\@@@@(@@@@@|@@@F@:@@@@h@@@@@\@D@$@&@X@&@B@.@P@D@@P@@Z@@p@@N@|@@@@@@@@@J@D@@@@j@6@(@,@@@@@&@f@X@r@@`@@8@@`@@@@@@@@<@x@;@@@@^@ @@f@@@@@@@@p@@@@@@ @@@@@@ @@(@@T@@@@@@X@v@@@@@@d@0@@@b@V@@D@@@l@N@@L@d@@H@:@@@|@@@@@@V@@@@$@6@@f@f@4@>@r@f@@\@B@@n@z@@@@@@@8@@@:@@@@z@6@F@T@@l@@@@~@r@@@2@l@@@@@@@@@@d@I@@@@z@h@@,@@@@@@@@@j@F@@@@@@v@@@@@r@6@H@@@.@@@,@@@@x@,@h@@@X@@@@$@@@8@@T@Z@@8@@@@ @j@@@B@n@@@@@@@@^@r@0@@@@@@@@F@'@@t@@@@&@D@L@r@@@\@@@`@@@@@z@ @@@@@$@@@@@@>@D@@@@@@@@@@x@@@@@@@@@,@@@@@@@(@ @P@@@@@@@@@d@@\@H@R@@$@z@@@@@0@J@d@@@v@f@@@n@@@@@@B@8@d@@@|@@@(@ @@@@2@x@|@ @R@@@@&@@@@T@b@@@<@>@$@@|@@"@@@*@<@D@F@@@,@@z@ @@@@l@L@,@@@@4@L@@@@@8@@@@&@@@@t@L@@D@[@N@t@@8@h@@~@@f@@4@@@@@@@@@@@@@@@@4@>@@@@@@@@@@H@0@R@@^@L@P@H@@@@@@@"@@f@@j@@@@@@^@@F@@@@~@4@@@@@@@@@6@@@@@@@@d@@n@6@@V@4@`@:@"@@@@@P@@@@|@t@@f@X@@@@n@@@8@8@@@@@:@@X@~@ @@@@F@@<@@@@@L@@@@ @\@@@@@@@@@@@ @"@@@h@@@@@@@@X@@@N@N@@@@@d@t@@:@@B@@@@\@H@&@@@*@2@@@@L@J@@ @@~@@@@@@@@@~@0@@@@@@@2@@X@z@d@@@b@J@@h@@@@@L@.@@@@@@h@@@@f@d@@l@6@@ @@@@z@@@=@@@ @@@ @>@@@@@V@@@@B@"@ @@@@@@@@*@@b@ @V@@@@F@`@8@@@<@@@,@v@@d@@@b@@@2@^@R@P@@x@@@@,@@@J@@@@@@@@d@Z@@@@@l@.@@@@b@@@P@/@@@@I@>@@V@^@@@r@@@`@@@f@@@@|@^@8@h@|@@@@d@@@d@N@@@X@l@@<@@@b@@0@@@@@@Y@@*@.@b@@@8@@@8@@@ @@@@@@@t@@@@F@@@@r@@@@@@v@@@@z@@@@l@x@@@r@\@p@@@@@l@@@@@@n@x@4@@x@@@@@@@l@r@@@@t@@@@V@k@@8@@@x@ @t@@@@"@@@J@@@@R@@@@@@,@@@@4@@@6@6@2@@@@@z@@@i@@@Z@V@;@@-@@@@M@@@@.@@@l@L@@@@@@|@@^@@:@J@@(@@D@@@<@ @@@x@@@T@N@@@@@@@X@@@@@@@|@@@:@t@ @@N@B@@<@@@@@@p@@B@D@"@@F@@@@@@)@@b@z@|@@@@@@2@p@@@8@@@<@J@@@~@@6@6@@@@j@@ @@@@@Z@!@l@Z@U@@@@@@@5@O@5@@y@@-@@Z@@@>@@@P@@h@@@@@@@T@@@@&@@(@@l@n@@@@@@@@$@@h@@z@L@@@Z@@R@@@$@@@@@@@@@n@@@@@@@L@n@l@V@V@@@@@,@@@X@@A@@+@@ @@@@@N@@H@@@*@@v@2@@@@@@\@@@@@j@@$@J@t@@$@@@#@@@D@`@/@@+@m@@@@-@@b@@@@@6@c@v@@@@@^@H@@@@@<@z@@@@@@@@@@@ @@@t@@@*@@@@@6@@V@@L@d@@@x@I@ @@@<@@@@@@@@@`@@@4@$@@@|@@"@@@\@@q@@@@@@@@@z@d@n@@@z@@b@<@(@@@@@|@`@@@@>@p@@@@@@@@@*@@R@@@@@@@@@@@`@@@ @}@@@@8@<@@@p@@"@@z@@@@@@@@@@@@@@@@@@@X@@F@@@@@@@M@n@`@@7@J@@@@ @@@@:@@:@@,@@d@@@@@@ @@@@@H@J@@v@@@@@0@@p@@\@@6@@@@&@@j@ @$@@@`@@6@V@@@*@@@@@@@@@@@@@@L@@{@@ @@@@@%@@@@@@@@@@`@b@2@h@:@*@@B@y@\@@@@,@@@@@@@@@@@&@@@@n@@@~@@~@ @@@2@@i@@Y@n@@@'@@@@|@T@@:@D@@v@@@@@@@@@g@@@@@T@h@r@@@@P@@@@@0@@@@H@@ @@@@@(@0@r@@"@@@@@@@@b@@+@@N@@L@@@@E@@z@@@@@@@@"@(@ @@f@@@ @8@f@@@v@I@@@@@@^@@@@@@X@@:@@b@@h@t@@ @@@@@@@r@.@@N@@@6@@7@@@@@@6@ @<@D@@@R@@|@J@f@@Z@@@@@{@@Z@@(@*@@R@@@@V@P@*@@@@v@h@$@4@@@@@\@@@@@0@@@2@@@@@8@@H@i@@@2@@@@3@@@>@@2@0@6@B@Z@@V@Y@@@@@&@@@:@@t@@p@h@h@@@@ @@@@h@@@`@x@R@p@H@.@H@d@L@@@@@@@@@q@@@@l@@&@j@@@|@d@@@~@@@B@L@@@2@d@6@@@~@E@@@X@f@@@@@@@@@@@L@"@@@@@@~@`@@8@j@@,@V@@@@@@@@&@t@@^@l@D@@@@X@@@~@ @@@@@:@@@@@@@@@X@@@@r@z@@@@@@@\@@@:@@@"@@T@@@@h@x@@@@h@@@@*@@@~@@@@@w@@p@@@@@@@F@@@@@@&@@@@@@@@@@@!@@p@2@@@@@@8@h@X@@ @.@@@@@@@v@t@@6@B@@@@@@T@@@@>@:@@@@@?@@@@ @r@@@@@@@@@@@R@@6@@V@^@H@@@@@@8@@Z@z@@@@@@`@F@H@@@@d@@@@L@r@@@@@&@@j@@@@@8@@X@4@h@!@@@@@@h@ @@@@@@4@@@@@@@@ @@H@@@@X@8@6@*@@`@@L@.@v@(@@@@@@@@^@H@Z@@&@@v@@@@@4@@@t@@`@@@@Z@@@@@s@@@@|@"@2@X@D@T@@6@`@d@&@@@@0@@@@@@@@@"@@@@p@@@@@@@@@2@B@b@@@@f@@@@@@:@r@@@@Q@@j@_@@@@@@@@@b@,@@@@@@h@@[@@@@@@@b@@t@@@n@`@.@@"@@@@@@@T@`@X@ @.@@@*@@ @P@@0@@@j@\@@@j@@J@@@(@L@G@`@<@@Z@@r@,@@J@@4@p@@T@P@F@@@@P@@@@@@@@@@d@@r@@@@@@(@@@@N@0@@@@@@l@@\@@@X@|@-@D@@B@@@@@@n@@@`@@@X@R@@@@0@l@@@@@@3@@@ @@D@p@@6@@>@@@@@@@@@v@n@d@X@.@@@l@f@@2@2@@P@@@r@F@F@t@@@@@@\@?@@<@@@D@@@@t@z@@>@@@@.@@,@@<@&@@@@@@@@@@l@@@@@8@ @@@@z@<@@B@.@@@@D@@@`@0@v@*@@~@@@@@D@ @p@@@@@@Z@d@@@6@v@@@@X@6@L@v@@@@@@H@@@~@@@2@ @@@@@@|@@\@N@h@8@@@@@@d@@@@@@@x@&@H@@4@@@@@@@@l@@*@@@@@@@@@z@@B@@@@@@@ @R@B@@@@r@@@@@@&@@@@@@h@H@N@@@j@@2@<@T@D@@@@@`@f@@ @@(@@|@@@ @!@:@4@@,@p@@F@@>@4@@@@h@4@ @t@ @@,@ @@@@@^@@@@@@@@@@@`@j@p@Z@R@8@@@@@X@@@2@@@@2@@&@@x@@J@@:@@@@L@@Z@@n@B@$@.@ @@h@@@@@@@.@@h@@0@8@*@j@H@@@@@@@$@@@`@:@@@@@z@$@t@@.@H@@@@@@@(@@@(@@@b@>@@@@|@@@h@@Z@@ @@4@@@d@@:@@@ @@@@@@8@@@@@@`@@@@@@~@@b@6@>@0@.@*@@@8@j@@@j@@@,@@@@d@@\@@@@b@@@>@@@@v@@,@H@@@@@@@@"@@@@@@@f@L@X@`@@.@@@@N@@@@l@@@f@@@b@D@8@,@J@L@@p@@^@@@h@@@@e@8@4@@:@@@@@@@@@@@r@@@D@ @@@R@@,@@@@0@@@L@N@@@@X@@v@:@@@@@@p@@P@0@\@$@@@@2@8@@@@@@*@@@@6@n@@n@@@J@n@x@@@@@,@x@@@8@@~@@X@@@@@@@0@@@z@p@p@H@@@8@R@@@L@@@@@6@@@@|@N@T@@*@H@>@@@|@@Z@@"@@@@@B@~@@f@@@@X@@@@@ @ @n@@@^@@8@@x@@@@@@0@|@@@D@@@j@,@@@@|@>@D@F@:@*@@@@@@@,@@@r@@@:@@>@@J@@~@@@@@.@x@@@@@@X@*@W@b@@@(@@@<@@@@t@@@Z@X@L@r@@~@L@B@@@0@@@@@@t@@~@@@@&@<@V@d@t@@4@t@@@@4@@`@V@@H@0@@@@@f@@@@@@@@>@L@@"@,@@0@@V@@X@@@@@r@`@@D@@@(@ @@@@@t@<@L@.@@@ @@@@@@@@8@B@@@@@j@@d@@@(@@@@@\@B@@@~@@@@>@n@J@@@b@Z@2@@@@r@@p@t@@d@@@n@l@b@@N@@v@"@@P@@R@@0@@R@B@F@@>@\@n@@v@\@@.@@@@@@@4@@@@@@4@N@0@ @@B@@@ @@@@@p@b@@N@b@@H@P@@V@6@,@"@@@d@@@@@p@&@n@:@4@@@@@@@x@@@$@@@@@@@$@@j@@@@@Z@@j@@@@b@b@>@@4@@B@@@@@N@@@@@@&@P@@^@@p@R@@@@@ @@@@F@4@@@@@l@@n@F@f@b@@@@n@@^@@@D@0@@p@@&@@@l@@@@@n@@V@8@@@@@@"@p@B@:@>@@@b@@@@L@@@@@f@b@0@@@@|@^@@&@8@*@@@@@@*@@@4@P@@@@$@f@@T@T@~@@@@"@d@@@@@@@@:@@ @@@@D@"@@(@@@ @J@d@@@ @F@\@@@@@j@@@@@@@@@:@@@~@b@Z@r@@@@@<@@@@@@X@@@@@Z@p@@@@x@@b@@4@P@@@@@N@@>@V@P@@@@@@@@B@@x@@B@J@@@@@n@r@F@H@&@@@ @p@@@@@@B@0@@@@@0@D@d@d@@T@V@~@@P@@@F@ @h@@@2@>@@h@@@@.@d@:@@D@4@@@d@>@@J@D@@|@@@@d@@@@@@@@@@@t@d@F@@@@@"@@@@,@@@@@@@@@@F@:@@@@*@@@@H@L@>@@@@@@@*@@T@L@@|@n@b@@@r@N@@@@@@z@j@r@>@0@H@ @ @$@v@@@B@T@@@@@p@~@@@l@@$@@n@@@F@@@B@"@t@0@@@l@@@X@@@@@J@@@@@@(@P@&@N@x@F@|@@@@@@|@@@@ @@@@@@@@@(@x@@@h@@j@V@@P@@F@@@@@@T@@&@@@@@j@@@6@@@@@z@6@:@@@Z@6@@@@@ @@@j@<@@@@@@@t@x@F@:@B@(@@@l@@@@D@\@@@@@@@@&@@@>@@@*@h@8@@@@@@B@@n@(@@@@@@@@H@f@0@@@@@@@@v@@@@ @@@@@@@@8@@@@b@@@T@~@@0@@@*@@L@r@@@:@@,@@,@T@|@,@@@@@z@$@@@h@,@@@@@6@@Z@X@@@@@H@@@Z@(@@@@@@@l@R@"@&@*@&@@@@@@@@Z@@@@@@@0@H@@@T@@@@ @ @@@F@@@h@@t@@@@@@@@@@@l@t@@@@@@@(@@@@X@@@@@@@@@@ @@@@@@@@@d@@@@@R@P@F@@@\@|@@J@(@^@H@@@0@@ @@@@@@@@d@@n@X@@@ @:@@|@@@R@$@@@@@p@@^@H@h@0@@@@@@b@@@&@\@*@@@@@@@@@@@@@@Z@d@@@.@@@@@$@2@@.@@P@@@@Z@@@@@@@@ @ @f@@@@@@@@@@@"@V@@@@@@0@8@f@X@@@@@@,@@@.@<@n@@@@L@@0@2@@n@@Z@@n@@ @@@@@@@@P@r@(@@@@@ @@`@@@@@@@h@z@R@t@.@H@"@@@@^@@@@@@D@@@t@@@V@@@H@@d@V@@@:@@@@@@@@@H@@@@v@@@n@n@@b@d@@@@8@@@@@@@@>@@j@@@@@@@@@@@@*@.@F@@@@@@J@f@F@@@@@@,@@@$@z@B@@@j@@>@^@@$@B@^@z@@@@\@@@@@@@$@@P@@@@@@@~@T@b@J@4@$@"@@@@8@@@@@@P@\@@T@@@8@@@X@@@b@@@w@.@2@@@,@@@@H@@Z@ @@~@\@@*@0@@p@@@@B@@p@@@N@@Z@,@@0@*@(@F@@@@`@@R@@@@@@J@@@@@r@@@d@@D@@~@<@.@(@@ @ @R@d@@@@@@:@:@,@n@@@n@@4@(@l@@@@@@@@@@@x@p@d@T@D@@0@4@@@@D@^@~@p@@@0@|@|@D@@@&@x@@@@@@a@;@=@@@@L@@@@:@0@@D@@@>@@Z@@@@~@x@,@N@N@@@N@@@z@V@@@@J@@@@|@:@@H@*@L@@@@@@0@H@@@@ @,@2@@T@*@@@@"@(@@@@,@@l@J@@P@@|@@@\@6@@$@@@f@.@@@@@@6@@@@@@~@^@J@*@D@@ @2@@@@2@@@@@@<@@x@$@6@@8@l@@@P@@ @@@@M@v@@@@@@@^@@@"@@@@@:@@@@`@@,@j@@@@@@@@4@@@L@ @@8@@@@@@@ @@@@@|@@ @@@|@@@@@@@h@h@@b@,@0@>@@@@@@p@@@@V@6@t@@V@@@@<@<@@@@H@@@@@@@@B@L@@F@@@@ @@@@N@b@@@@ @@F@@@B@@@@@"@B@=@@@@A@x@@:@B@@@@@@@@@@@@@@z@@@@@t@4@(@p@$@@h@*@&@J@@@@.@B@b@F@@@@H@l@B@@@@&@n@J@@@@@ @@p@@@@@>@ @p@@ @@f@@~@@@N@@@d@@@F@@@@L@^@@@~@*@@@@@@@h@n@<@@@@@,@"@@@@@@N@@@@@@L@@@$@@@@@@@@@@@l@@h@@@@@@R@t@P@@@@@@b@@Z@@Z@<@@:@@@T@@@|@<@@@.@@@@@@@@@8@@@^@v@r@@@@N@@@@@@@@ @@@@@@p@@@@@\@:@R@@d@l@@@p@Z@@@N@@ @@@@@V@@@@@@@@@v@\@T@,@T@.@0@4@@@@@.@0@l@@@@4@@@@"@@@@@@@@T@>@@@@@L@@@@L@@H@@@@L@:@@p@@d@8@@2@z@@@@x@@@@@@@j@z@@@@Z@@@@@@@@@*@@@v@@@@@@F@H@ @@d@@@@@@@~@@@@h@@@>@@@@@@4@@@@@@|@L@"@@@@d@|@@T@Z@L@<@.@ @ @@@@@@ @8@x@@@@ @P@@~@@@N@@@@@@@@@@@@%@+@;@>@@@@@@ @@@@@@@@@@@@@D@@@R@R@|@@@@@@@@ @@@@@@v@6@@@@@@@@@@@z@@@@@@@@@H@@@@@x@@|@@@T@@@@@V@P@@@@@@j@ @&@@@@@@@|@^@T@@@(@ @@0@@@ @@ @@P@|@`@@@@4@@4@x@@@^@@@@6@@@@@@@&@@^@@|@@@@@@@@@@@@@@@@@.@X@@@@@@@>@j@@@n@@`@ @@@T@@>@@@X@N@@8@@n@x@@@2@@ @8@@:@@`@,@@ @@@@f@\@@B@n@f@|@@z@@8@@@@z@r@$@@@@@@@@p@P@X@"@4@@@B@ @@@@@@:@<@\@@@@@@`@@@h@*@V@2@N@@@H@@F@>@@T@p@F@-@ @D@@@@@@p@@@@P@@ @ @T@~@P@ @L@@H@@x@p@^@@@P@@@ @@@@0@@@@@@~@\@0@@@X@b@@@@@@r@@@D@@:@ @@@@@@@@@<@ @@@V@v@f@@@@b@P@@@@@@@x@v@T@R@,@4@4@ @@,@@@@@@@@H@B@\@@@@@@@8@@@@z@@@2@@@@@@X@b@@@@@@>@"@J@@r@@F@r@@@d@@Z@(@@@@p@@@@@@@d@@@@@@@@@@@@^@&@ @@F@@r@h@f@@4@@@@@@@@:@P@@@@@@@ @@X@@@@@B@@@@v@Z@&@@@@z@@v@P@z@F@H@"@@@@@@@@@@@@@@@8@b@T@@@@&@@@@@f@J@@@@2@@$@4@O@9@@@J@@@@,@2@@&@ @f@@@@T@@@v@@@@`@@V@Z@@@@@v@6@@ @@@"@@@f@@@ @@@F@@@@*@f@\@@D@@,@@@@*@@@@@@f@,@@@@N@@Z@L@ @@Z@Z@"@@@@@@@|@p@P@P@B@H@6@@6@@@@ @@@@@@@@@ @@@V@J@@@@@ @R@@@@@l@>@h@L@@@@:@@@d@@@t@d@v@v@@@@@V@R@@@@\@@.@@@@@@8@@@@@d@@.@@@d@@R@F@f@@V@@:@@@@@V@J@T@4@~@N@N@@@b@b@@@f@@Z@@@@H@@ @@n@$@@@@f@.@@@@@@@@b@@b@F@.@$@@2@@@@@@@@@@@@@@@@@@J@@@@@@@@4@@@@@8@@@@@@@`@f@@N@@*@0@ @p@r@@@@@@@@.@F@@@@@ @@@@@@@@@V@@2@N@ @|@R@@@@@@@@@@@@@@.@@@B@D@@@@,@"@@.@@@@@|@@v@@@4@ @@R@F@&@@@@@@l@@b@2@<@(@&@*@&@@@@&@@@@@@@@@@ @@*@X@J@@@@@@@"@ @h@@@@@"@@&@2@^@H@Z@@(@@2@@>@@Z@Z@@B@@,@,@@@@X@@@J@|@d@v@n@@ @@4@t@d@8@@@@@@^@@b@@@@@0@@@$@@@ @(@@@@x@J@@N@@n@A@G@1@@@@8@@h@@@J@@@@@@f@@@H@d@(@H@<@@@@@,@ @@@@@@@@@@@@@@@2@$@J@r@z@@@@@@@F@z@@$@X@@@@@@@@z@@@@@ @@X@@@J@l@2@$@@j@@n@n@,@.@R@V@J@L@@@ @L@p@:@l@@:@H@@@@ @@<@@@6@4@@@H@@ @@@T@@@:@F@@@@@@M@p@@V@@d@@@z@J@ @@@@@p@h@L@^@V@D@<@4@ @"@ @@@@@@@@@@@@@@@@@@@@0@2@8@~@\@~@@@@@@@j@@@@@"@@@f@x@@h@@@r@C@@@@@@^@@\@@@f@:@ @,@ @@@@@$@.@@ @V@v@@@ @r@f@(@@@H@V@@,@@@`@`@@8@<@@Z@J@ @h@>@@@@a@ @@6@V@@r@@@B@2@ @@@@t@@n@j@X@&@@@@.@*@@@@@@@@@@@@@@@@@@@@@@@"@@6@4@@n@@@@@@@@@@@|@@@@@@@@@@@X@@@@D@@@@@N@^@~@ @@@@@@@@@@@<@R@@@0@@0@6@6@@T@b@@2@ @Z@0@T@@p@2@6@@ @@@>@J@Y@@@@@@@"@@@@@@6@2@@@@@@h@>@F@6@B@P@.@@*@@@@@@@@@@@@@@@@@@@@@@@@@@@@H@d@d@@@@0@@@R@ @4@.@R@|@B@@@@@@@Z@$@D@@@@@@@@@,@@ @@@@@@ @@@r@B@(@|@@@j@@@:@@@@@@@ @~@"@@n@Z@*@V@@@@X@F@@@@4@@ @v@.@@@j@*@@@@@@t@R@r@:@Z@:@0@>@@@"@@@@@@@@@@@@@@@@@@@@@@@@@@@@,@v@Z@|@@z@@@@@@@@ @*@*@z@~@L@@@f@@@)@@;@@@@F@@@@@@v@R@@@@@@@D@@@@@~@@@@@ @"@6@@@@@*@ @@P@@d@@@@@@Z@@@L@@@l@@@@\@ @ @@@@@p@Z@V@p@:@D@&@@,@@@@@@@@@@@@@@@@z@t@@@@@@@@@@@@@@@.@&@v@\@L@@l@@@@@@@@@ @n@@@t@@P@H@@y@@@ @@l@@!@<@F@@@l@4@0@ @@@@@ @@.@@4@:@D@@@,@@@N@v@H@@2@@@P@b@@@b@j@@J@@@n@8@@@@v@,@@@\@F@$@@@@@@@x@6@@@6@8@>@.@@6@"@@@@@@@@@@@@@@@z@x@@@@@@@@@@@@@@@@@B@0@.@F@*@B@@l@@@@@@@@ @X@`@(@@@@@x@@@@ @D@@ @X@l@B@@Z@$@"@6@@v@<@@@,@T@2@@ @@X@@@@H@X@B@@@j@l@N@`@@@@@@@D@^@&@.@@@@@t@@@"@@@@@@@T@r@F@:@0@4@@@@(@ @(@@@ @@@@@@@@@@@@~@@@@@@@@@@@@@@@@@ @(@@*@2@J@2@b@n@h@@@@@@@@@*@@@@@@@ @@T@@ @@X@@@^@@D@@b@J@`@>@f@0@ @.@@@J@N@L@@@@@@@@@!@@@@@@@@l@B@^@@n@@z@.@@B@@@@@@@~@R@d@F@>@R@$@@4@@@@@@@@@@@@@@@@@@@@@@@@r@l@@@@@@@@@@@@@@@@@@@*@X@2@^@Z@h@@@@@@@R@@@@@ @@*@@Z@@@@ @z@"@v@@@@@\@@@@@@@@@^@\@j@@@@W@@(@@@@@@@D@@@N@.@@@@@@@2@0@&@@@@@l@f@V@R@N@"@B@@@@ @$@@@@@@@@@@@@@@@@@@@@x@@@|@@@@@@@@@@@@@@@@@@@@&@2@<@.@(@D@d@x@@@@@~@ @@@"@,@(@ @@D@@@@@@"@@@@@>@~@h@z@@>@@@@j@@`@@@@@V@@F@@@~@6@@@|@@@f@D@N@4@8@V@F@@@@@@@@`@N@:@:@6@(@@@@@@@@@@@@@@@@@@@@@@@@@@n@@@@@@@@@@@@@@@@@@@@@@@$@@<@F@D@>@N@@|@@@^@L@N@Z@v@@@@z@ @@@@b@@@@@@@@@f@@@`@<@D@@-@'@@@.@@`@@b@@ @:@@@@h@0@@@@f@v@@@@@@@@@@@@~@L@@@:@P@0@N@*@(@@@@@@@@@@@@@@@@@@@@@@@@v@`@~@t@x@@@|@@@@@@@@@@@@@@@@@@@ @@@>@&@@@t@V@@@@@@:@6@v@.@h@H@@@@@4@n@0@Z@@@@@@@.@@@x@*@@@2@@2@<@H@@2@@@@@z@@@j@P@L@H@@@@@@@@@@@h@^@J@8@\@:@"@>@ @@@@@@@@@@@@@@@@@@@@@@@@@h@@j@|@|@@@@@@@@@@@@@@@@@@@@@@@@ @@.@"@N@h@^@v@p@\@@@@@^@@@l@<@@J@@@@@@l@@@@z@N@@@B@@@@@@.@@\@@h@ @@@B@@@@J@B@@@@@@@@@@n@@X@F@R@\@>@,@ @@ @@@@@@@@@@@@@@@@@@@@@@@@@@@f@v@p@@x@t@~@p@@@@@@@@@@@@@@@@@@@@@@@(@@F@p@@V@X@|@@@@@:@8@&@@@&@@@@@@@T@B@R@Z@*@ @D@z@@R@.@@ @@@.@@@@@z@x@@@@N@V@(@@@@@@@z@@@b@b@f@b@V@@@\@:@&@8@@@@@@@@@@@@@@@@@@@@@@@@@@@@t@X@f@z@b@j@~@v@@j@x@@@|@@@@@@@@@@@@@@@@@@@@@@@ @6@F@:@z@@@@@j@@@@@t@@@@@@@@@@@.@6@@@R@^@Z@0@l@(@ @ @ @@@@@@@@@@@Z@n@N@D@4@\@>@F@(@,@@@ @@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@t@|@`@@p@z@~@v@x@z@x@@@@@@@@@@@@@@@@@@@@@@@@@@$@ @\@.@@x@z@v@P@@z@p@T@n@p@T@\@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@R@H@B@4@8@<@L@4@&@@(@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@h@l@h@~@Z@n@r@d@z@~@l@@r@@@@x@@@@@@@@@@@@@@@@@@@@@@*@B@<@d@.@0@*@F@v@6@j@P@4@@@f@@@@@@`@|@r@@@@@@@@@@@@@@@j@T@@@@p@@z@^@@<@>@@6@B@@,@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@d@f@b@h@`@\@l@j@f@z@|@n@z@@t@n@@x@x@@@@@@@@@@@@@@@@@@@@@@@@@ @@@F@@&@:@@*@<@4@f@N@Z@P@l@B@N@b@~@n@2@X@p@P@l@@|@j@j@@^@R@8@@@J@R@(@<@J@@@@@@@ @@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@n@j@h@b@^@n@@t@x@@h@@n@x@@@|@|@x@@@@@@@@@@@@@@@@@@@@@@@@@@@&@@@&@@@@F@*@T@P@N@L@l@L@V@^@\@X@F@T@t@f@R@j@v@l@|@l@@<@.@2@8@N@(@D@<@H@8@"@@@@.@&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@^@R@j@b@d@`@r@b@f@n@l@x@T@n@`@@z@|@n@@r@@@~@@@@@@@@@@@@@@@@@@@@@@@ @@@ @@@@@*@$@"@6@$@ @@2@<@@@"@&@&@@&@4@ @@J@,@0@4@@,@@ @@@(@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@P@Z@X@^@X@Z@@`@b@j@n@`@f@r@r@v@x@r@z@|@@|@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(@@@@ @ @"@@2@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@^@n@V@`@X@l@\@X@x@r@z@~@\@p@x@T@t@v@t@@v@l@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@&@@@@$@"@*@@:@*@@@6@.@@ @@@@@@@&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@f@f@V@f@Z@V@^@^@b@R@\@d@h@p@`@\@l@f@r@@h@~@@n@@@@@x@p@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@R@Z@N@T@V@V@T@T@l@^@h@b@l@f@|@f@d@@v@@j@b@@p@@x@t@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Z@J@V@V@R@N@\@\@Z@^@Z@n@^@L@r@P@j@n@v@~@l@n@@x@|@@x@@@@@@@@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@sunpy-0.8.3/sunpy/data/test/EIT/efz20040301.060010_s.fits0000644000175000001440000042350013203275053021111 0ustar nabil00000000000000SIMPLE = T / conforms to FITS standard BITPIX = -64 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 128 NAXIS2 = 128 DATE = '2004-03-01' / Date of file creation TIME-OBS= '06:00:10' / DATE-OBS= '2004-03-01T06:00:10.495' / UTC at spacecraft ORIGIN = 'Rocket Science' / Rocket Science = NASA GSFC DATASRC = 'LZ file ' / TELESCOP= 'SOHO' / INSTRUME= 'EIT' / OBJECT = 'full FOV' / BUNIT = 'counts / pixel ' / WAVELNTH= 195 / 171 = Fe IX/X, 195 = Fe XII, / 284 = Fe XV, 304 = He II FILTER = 'Al +1 ' / DATE_OBS= '2004-03-01T06:00:10.495Z' / SCI_OBJ = 'CME WATCH 195 ' / OBS_PROG= '195_10S_AL_1.000 ' / CMP_NO = 1 / Unique campaign instance (1 = synoptic) EXPTIME = 12.592 / s (total commanded + shutter close) EXPMODE = 'backside ' / FILENAME= 'efz20040301.060010' / CFTEMP = -66.71 / CCD cold finger temperature (C) CCDTEMP = 7.34 / CCD temperature (DN/100) CTYPE1 = 'Solar-X ' / CTYPE2 = 'Solar-Y ' / CRPIX1 = 64.5 / Sun center x, EIT pixels CRPIX2 = 64.5 / Sun center y, EIT pixels CRVAL1 = 0.00 / CRVAL2 = 0.00 / CDELT1 = 2.63 / Pixel scale x (arc sec, fixed) CDELT2 = 2.63 / Pixel scale y (arc sec, fixed) SOLAR_R = 372.27 / Solar photospheric radius, EIT pixels SOLAR_B0= -7.22 / Degrees SC_X0 = 0.00 / s/c yaw (arc sec) SC_Y0 = 0.00 / s/c pitch (arc sec; -109.14 after 1996/04/16) SC_ROLL = 180.00 / s/c roll (deg., Solar north + CCW from nominal)HEC_X = -139130208.00 / s/c heliocentric ecliptic x (km) HEC_Y = 46576272.00 / s/c heliocentric ecliptic y (km) HEC_Z = -94896.31 / s/c heliocentric ecliptic z (km) CAR_ROT = 2013.00 / Carrington rotation at earth COMMENT CORRECTED DATE_OBS = '2004-03-01T05:58:19.798Z' COMMENT COMMANDED EXPOSURE TIME = 10.000 s COMMENT SHUTTER CLOSE TIME = 2.592 s COMMENT LINE_SYNC = 'no' COMMENT CAMERA_ERR = 'no' COMMENT IMAGE_OF_SEQ = 0 COMMENT READOUT PORT = 'B' COMMENT NUM_LEB_PROC = 3 COMMENT LEB_PROC = 26 (no ROI) COMMENT LEB_PROC = 27 (no occ mask) COMMENT LEB_PROC = 12 (Rice) COMMENT BLOCKS_HORZ = 32 COMMENT BLOCKS_VERT = 32 COMMENT P1_X = 1 COMMENT P2_X = 1024 COMMENT P1_Y = 20 COMMENT P2_Y = 1043 COMMENT N_MISSING_BLOCKS = 0 HISTORY Version 4.0, 2001 December 10 HISTORY Image linear resampled to (128,128) for SunPy END @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@x@p@@v@b@j@l@f@j@t@l@h@f@Z@d@b@\@p@X@^@b@j@X@R@R@^@b@T@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&@@@@@@$@@ @@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@t@|@x@t@v@t@n@t@n@l@v@T@h@r@^@N@b@Z@j@h@V@T@B@J@P@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@4@@2@@ @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@z@t@@t@x@v@x@~@z@t@z@b@^@d@\@n@N@h@h@d@P@Z@\@P@h@R@J@R@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@ @@@@@@@@@@.@@@*@@B@ @&@6@D@J@\@@@@"@@@@@ @,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@~@@~@x@r@p@@`@r@f@V@f@d@j@^@X@\@L@T@V@V@P@T@X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @@@<@,@@&@@*@*@@.@<@<@n@:@J@>@R@T@F@"@B@<@&@J@8@@@ @2@@@@@@@@@@@@@@@@@@@@@@@@@@@r@@@`@l@|@p@j@`@h@`@`@l@r@h@h@h@Z@\@\@H@V@D@V@Z@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@ @@0@@0@@"@<@@$@"@@:@\@<@z@P@z@`@6@B@B@Z@H@0@B@0@&@2@@$@&@$@$@$@@@@@@@@@@@@@@@@@@@@@@@@@@n@t@~@v@v@n@^@h@n@f@V@t@j@X@\@n@T@T@f@J@J@^@R@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&@@@*@@@.@@^@0@B@H@<@4@`@<@>@V@`@V@Z@P@@\@@@@z@l@Z@@T@p@n@v@^@J@b@F@4@6@V@<@8@@@(@@@@@@@@@@@@@@@@@@@@z@@@~@@z@z@x@h@p@l@h@h@f@p@^@V@^@`@N@b@H@\@Z@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@8@@4@@:@D@F@<@P@@@*@T@0@@d@~@@@@@@@~@|@@H@v@@t@b@f@N@@D@6@V@R@8@ @@.@@ @@*@@@@@@@@@@@@@@@@@x@@@f@@r@t@n@j@b@l@z@f@`@f@f@X@L@X@^@\@h@N@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(@@6@"@(@V@8@P@\@B@b@|@d@n@d@^@^@R@@@@@@,@ @@@@@@|@@@@@@r@@r@R@|@\@N@*@$@>@D@>@>@(@ @@@@@@@@@@@@@@@@@@@@@x@v@j@p@^@p@`@T@R@\@d@p@`@f@V@P@`@T@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@4@ @@6@@B@@D@V@:@:@r@V@@~@t@@|@z@@@@@@@@@6@J@@@0@B@$@@@@@@@@@@@@@@@x@L@X@v@`@^@z@@0@@"@@@@@@@@@@@@@@@@@~@@@@@z@p@p@v@j@\@f@b@`@R@R@^@P@\@Z@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@H@.@,@@.@j@F@@\@L@l@h@|@@~@j@@~@@@@@@@@@@@b@@T@@(@@6@@@ @@@@@@@@@@@@@h@p@x@"@@@@@@@@@@@@@@@@@@@~@@|@@v@x@l@x@t@@`@^@X@h@V@Z@R@f@R@R@@@@@@@@@@@@@@@@@@@@@@@@@@@@@8@@,@6@@@@0@*@f@X@X@t@`@@r@z@@v@@@@@@@ @@@@@V@V@@@$@@@@@@@@@@@@@@r@@\@@L@@@@@@@@@x@^@H@(@@ @@@@@@@@@@@@@@@|@@@@@z@@n@j@n@d@|@\@b@^@Z@b@X@\@J@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@B@N@B@p@D@n@l@~@@@@@@@@@@@ @8@@N@b@R@\@@@@@h@b@@@8@@@ @l@p@2@(@@@@@@@X@H@<@8@4@@@@@@b@h@,@@@@@@@@@@@@@@@@@@@@~@@r@x@h@b@|@v@R@n@p@T@V@b@Z@`@@@@@@@@@@@@@@@@@@@@@@@@@@2@@@6@@"@>@2@b@@@d@@X@@@@@@@@@@@@l@d@D@@V@h@@@@@@@@@@@@@6@@@@@@,@@@@l@@F@@@@@@@x@@@@@@@@@"@.@@@@@@@@@@@@@@@@@x@@x@|@v@@t@@l@@n@\@h@^@z@R@d@n@@@@@@@@@@ @@@@@@@@(@ @@@@@F@&@X@&@8@B@B@^@L@F@@v@@@@@@@6@b@@@@^@f@@@@@@@@@*@@t@@@@@F@b@ @@@n@@@T@@@@@j@.@@@@@@@:@@8@ @*@@@@~@Z@.@.@@@@@@@@@@@@@@@@@@@@v@@z@t@f@x@V@l@h@^@b@\@`@@@@@@@@@@@@@@@@@@@@@@ @@@@Z@@*@X@6@L@X@Z@@r@@@@@@@D@(@@,@@@@v@@b@J@^@@,@j@@@f@D@@@4@r@@b@@@@J@n@@@8@@@,@@@@@@>@@@ @@@@~@@@@@Z@h@N@@@@@@@@@@@@@@@@@~@@@~@|@l@x@~@@d@r@`@l@X@z@@@@@@@@@ @@@@@@@@@$@ @@ @@,@@(@P@R@B@@<@r@@@@@@@@2@j@@@@@h@@@|@@@z@@@X@@@@6@@@@@P@@<@@>@:@@@@X@@@@]@$@J@@8@@@4@z@H@@:@d@2@@r@"@@@@@t@0@*@@@@@@@@@@@@@@@z@@z@|@@@h@l@h@z@h@b@`@x@^@@@@@@@@@@@@@@@@:@@$@@ @$@$@6@6@@@x@Z@\@@|@@@@@,@"@@j@@@@ @&@ @@@@@6@@@R@@@@@@ @H@8@@N@@@@@2@6@@@@B@@@@@@'@@@5@@~@@ @@@@@@@V@@@@z@ @ @@r@d@Z@L@"@@@@@@@@@@@@@@@@@|@~@~@x@z@r@z@l@l@l@@@@@@@@@@@@"@@@@@@@@ @N@@(@@@6@~@T@J@@@@@@*@`@4@@@@@@P@|@x@@@@R@@@@p@@@@N@@J@@@@@.@Z@0@>@@@P@^@@@@)@@@(@@@U@@R@@2@@@@@@f@@@@@:@ @@@t@^@.@@@@@@@@@@@@@@@@@z@~@@r@r@r@f@l@`@b@n@ @@@$@ @@@"@$@$@*@@&@,@*@T@,@n@X@\@d@J@z@@~@@@@@@@0@R@@@@H@@X@@@\@t@x@:@@*@x@@@@,@@@@@f@`@@J@@x@2@@r@@J@F@"@p@D@H@h@@@@m@@#@@@_@ @@4@ @J@@r@@@`@Z@@@p@L@@@@z@P@F@$@"@@@@@@@@@@@@@@~@@@t@|@d@d@r@b@d@@@@@@@@ @@@@@:@@.@H@"@j@H@P@f@N@v@@@@@@J@@B@b@p@@@4@@@@4@>@h@@@@X@@~@2@@@@@,@@l@(@@>@@@@@@@2@@@@@@r@@ @@@@@@@j@#@@@0@@@F@f@2@@@@<@@@@4@@@@~@~@V@0@$@@@@@@@@@@@@@@@@x@@@l@j@d@v@@@@ @@@ @@ @@@8@@@6@&@8@J@B@L@~@@t@@@@@*@L@~@@@@N@@@@@@@@b@R@@0@@N@.@@@@@@b@@@,@@8@t@^@@@@ @@@(@|@@@@@t@F@,@$@@@x@@@@@E@ @@^@j@@@@@@@@@@`@ @@@@h@L@L@@@@@@@@@@@@@@@@@@@x@@^@t@t@@@.@@8@@^@2@$@P@<@X@^@@@Z@f@l@@@@@@@ @@@@V@@@@4@@@\@@@2@\@@@@@@T@,@P@@|@@ @@|@X@@@D@@*@T@f@@@@@@@@@^@@h@@@`@@\@^@H@p@@@p@@@@@D@@@Z@4@@4@P@@@d@@h@J@4@@@@b@B@"@@@@@@@@@@@@@@@~@@|@~@p@r@t@@@@@ @@@.@@P@(@&@2@@^@D@\@@t@@@@@@@<@X@@(@2@@@`@@@@2@2@.@@ @@@@.@@@:@&@z@@v@@@@Z@@r@@@@@8@@@D@\@ @@x@@@@@B@@b@R@@@j@@.@@P@D@n@0@@@@@@:@V@@@@@@t@F@ @@@X@<@(@ @@@@@@@@@@@@@@@@@@j@z@|@(@R@>@6@4@@0@P@Z@\@L@V@l@J@n@@r@@@@@@@*@:@@@@@@@H@@T@@h@@x@@@@J@@P@@@F@@@~@0@z@@@@@@@@@@@@|@@@@&@@@l@X@@@@z@@@@@@@@L@~@<@$@4@@,@@`@@\@@2@@P@.@@\@B@ @@@j@>@:@@@@@@@@@@@@@@v@@x@@p@x@t@$@8@0@6@@4@F@B@@@p@b@`@L@>@f@@v@@@@@@\@@b@@@@@@@d@@@\@@x@@@ @@V@ @@@r@@@:@@@@@@j@@F@,@@p@0@ @@@@@@@@ @@@@@@@@R@:@@@@ @@@j@@@V@n@@@@@@Z@@@@@ @@,@@@~@2@@@f@T@:@@@@@@@@@@@@@@@@@@@@@@.@ @.@&@D@J@8@X@F@V@h@Z@@@@@@@@@@@r@@@@@@(@L@@@@L@`@@@d@@@h@@@@0@@>@@N@@@@@@,@@@4@@@@@V@@@X@@@t@@j@@\@^@.@@@d@@@@@<@@@H@@@$@@@@@@@@@d@J@@@@@@P@d@>@4@@@@@@@@@@@@@@@@@@@2@n@h@N@\@P@d@@@@@@@@@@@@@@b@\@@@@6@@@F@t@H@@4@@>@@n@@@@(@`@@ @@\@b@@@@p@@@@@f@R@L@@v@z@F@@@@@@O@n@@@@@@ @Z@@>@V@@@@@@J@"@@R@v@@n@@@ @@.@@T@@@@@@@@@@@:@P@,@ @@@@@@@@@@@@@@@|@@@2@H@Z@N@@@z@r@`@@~@@@@@@@@@@@@V@@@@:@r@@@@4@@@@@@@b@:@h@:@j@@@@@@@@@@p@"@@@@@@v@@B@.@V@@@B@@@@&@@ @@@$@@@@^@h@@@^@@2@v@@@@@&@@@@@@.@Z@l@@&@@@@@@@@@@Z@8@"@8@L@@@ @@@@@@@@@@@@@@R@d@B@X@J@p@r@v@@@~@@@@@@@@6@@@@@@@@@@^@@@@h@v@@@@d@L@n@@@@@F@@L@l@@@@r@(@@J@@@P@H@ @@@@z@v@(@@Z@f@@|@@F@H@@v@@@"@H@@@\@@@$@^@@@P@"@V@v@@@|@@@@J@@2@@J@@@@@z@`@B@6@4@@@@@@@@@@@@@@@n@v@@@@`@@@@@@@&@@*@@@^@`@@@@\@@@b@.@\@@@@@x@\@@@@~@@@@ @@@@@@@@$@@t@@6@Z@@ @b@@@@D@@ @n@@@@<@,@@@@@@@@@$@v@@@@@@@@@@@P@h@@@@L@j@D@@@@^@@@@t@,@@@@@@D@P@V@@@@@@@@@@@@@@J@x@H@Z@r@D@@@@@@@@@T@R@H@~@@@@>@@@,@@b@@@\@&@@@@@@@@J@@@@@@@\@d@J@@@@J@,@@@D@@@:@P@@F@@@@@@@@j@@@p@>@@4@j@@H@(@J@@@X@n@@ @@@@4@~@@@<@@V@@2@@@H@f@@@P@ @@@@@z@N@j@"@ @&@@@@@@@@@@@@j@@@~@@@@@@@@@X@@@@@@@n@@@@l@@@4@*@@@@@j@@@@@@@@|@@@@@@@^@:@@@@.@@@@@@@@@@@:@@@@~@V@@V@@B@@.@@$@.@"@B@V@@"@@Z@@@@@@@r@@b@0@@f@~@`@@@@@@ @@x@F@@@@@@Z@x@\@*@ @@@@@@@@@@@@b@@@@@@@@@2@@H@@@ @V@,@*@@@@@8@@@@@@+@<@@@@@@@@@@@@z@|@@@\@>@:@8@@<@v@L@^@P@@@`@z@@@R@6@@@ @ @@@,@@p@@@@@6@&@@@@@ @@@@@@@@h@<@.@@@@b@@Z@@@@@@@@@@0@@@@@@@t@V@L@@@@$@@@@@@@@@X@@@t@@@@@@@0@R@@@@F@P@@2@,@@ @@@@@@j@~@@@@@@,@@@@@@@@@@x@B@(@"@&@T@v@>@Z@(@@@@:@@,@x@@@@N@.@@@f@@<@B@f@@@@.@r@\@@2@d@@@X@$@@F@@@@*@@F@@@J@@4@x@@@@@@@@F@L@@@@@@t@b@4@N@@@@@@@@@@@@@@@@@@*@B@T@@p@@@"@@@@@N@@@@@@&@@@@@6@@@"@@B@@@@@@&@@@D@.@4@2@>@@@@\@@>@@@"@@ @@@L@`@L@@@<@F@|@4@@:@@D@@P@@@@B@@X@^@@@@H@@4@x@@@@,@2@H@ @@@@@@L@@@@R@&@@@@@@@b@l@n@X@D@&@@@@@@@@@@@@@@@@0@\@@@*@b@n@@ @ @@@D@@>@f@@b@@@@h@ @r@@4@@t@@@@@z@:@@@^@r@ @@ @@@@@@v@D@@@6@ @@@0@@h@@,@@2@ @B@@@>@~@R@2@@&@@@@@r@@:@@@P@@h@@p@D@@@@@@|@@T@@t@z@@@@L@$@0@@@@@@@@@h@T@N@@@@@ @@@@@@@@@@"@@@@@b@@@*@^@:@@^@@^@@V@f@V@X@@T@@|@@|@\@@.@@@@p@v@@@@@@.@@L@4@v@@X@@@@F@@@@@"@@@V@D@J@d@@@@T@@P@@@@@@@@@@@@@@@@@@@@@^@@@.@@z@J@@@D@@@N@^@*@@@@@@@t@x@@d@.@,@ @@@@@@@@@:@@$@2@\@@.@F@@$@8@@@@@@P@@(@T@@(@Z@D@@@@d@@@@@@@@@4@4@@@@@@@ @@@@@@Z@j@ @t@@*@:@@@@@6@@t@L@@h@x@@n@|@@@@@@r@"@@@0@ @@@@,@@@@\@@ @H@@@^@@@@@@@@@@l@(@@@:@@@@@@@@@\@^@<@$@&@@ @@@@@@@@@@z@@@@@@@@@@@@@N@j@@@h@@<@<@h@\@@@@@4@@@@@@R@~@@@@@@@@@f@@@$@@v@@@@@@@@@4@>@@@@>@x@X@~@p@l@@"@l@@<@@*@$@&@@.@@@>@@@@@@@D@@@x@.@@@@@@@@@ @@@@@@@@@@@@F@@@H@@@@ @@@@@@@.@j@V@@ @d@@@@V@@@@@|@@l@@B@@ @`@@@@j@ @>@@@0@B@@@@@F@@@@@@p@@`@@L@@@p@@8@@ @@@@@@@@L@@@@@@@ @@R@*@@p@@|@&@@@@@@d@@@@b@@@@U@:@@.@@<@J@.@@0@@N@@T@@@ @@@@@@@@@x@^@8@&@@@@@@@@@@@Z@D@@Z@^@@@@r@@@@@ @Z@ @@@@@@@@6@@@@@@@@@@@@@@@@@@t@@\@>@6@:@@n@p@@@@@@@@@j@v@@z@@@@r@@4@ @@@@@@@@@V@@R@r@v@@@@j@@@@@@@@@@@@@z@@@@@@f@>@0@H@@@>@ @@H@@@@@@z@X@Z@6@D@"@@@@@@"@N@L@@D@N@@@@P@@@ @@*@*@`@'@T@@"@@@@@@>@v@@@@@x@@8@X@@z@@@R@t@N@6@,@H@@@n@v@@(@@@@@@@@@@@@,@@@@@z@@J@D@@@2@>@j@@@"@@d@F@J@@@@x@@@@Q@@@@@Z@:@<@@x@@@@@J@`@P@"@@@4@l@@@@@@@V@J@B@@@@@@<@(@b@@@L@@@@@@@e@@@@@@h@d@%@@P@@@@@R@@@V@@@@@@l@@6@.@$@V@f@F@@@&@@@@@@@@@@@@@@@@@ @D@\@@@@@6@T@@0@@@,@@@t@6@z@@@@@l@@(@@@@n@@ @@~@@@r@(@>@@@2@x@b@@@@:@>@l@d@@B@ @@@@@b@v@V@H@@@@@0@.@B@@@~@@6@D@^@F@@@A@@V@@@@@@(@t@0@@@@@@@@@@@@H@:@&@@@@@@@@@@@@R@@@@@@@@@@@@@@@$@`@z@@@@@@ @@L@j@*@@R@D@@,@@@@.@@(@W@@>@2@@@(@@@f@@@@@6@L@@@j@@@@@@@@@@P@@@@@@@b@X@@@@@F@6@r@@@(@@@8@@j@@F@z@@@@@\@H@@@@Z@@@@@@@@@@z@X@@&@@@@@@@@@@@@8@@@@@@@@@@@@J@:@@6@@"@@@@@n@6@@(@@@"@t@ @@$@Z@6@@@@e@@-@Y@@@@5@@@@@@@@:@$@@@`@^@0@@@@@@@@~@"@@@@@@l@V@6@ @@@<@@x@@@@v@"@<@8@@f@)@@@X@D@@@2@@@@@@@>@r@n@.@@@@r@@\@@@@@@@@@@@@@@>@*@@@@@@@R@@@@,@@2@&@\@@p@R@@@P@4@$@"@@@@@l@@@@Z@@@@t@9@2@!@*@@@&@|@@"@@@@@@0@J@B@@@@@@H@:@@@@@@@@@@@@\@T@(@@@@n@:@@@@@@@@@z@@@@@@@ @6@>@@@^@@V@@j@@@f@@@@L@l@j@@@@@@@@@@@@@@@@@@@@@@@@@@f@B@@@@@,@R@@4@@@@@l@@@8@.@*@@0@Z@F@b@@@@9@@@@@@@@@@@@@@@^@@b@@@@6@$@@@@@@@@r@@@@N@d@*@@@@l@.@@@@@@@4@@,@@@6@@@0@C@m@@r@X@B@@b@@@@@4@@@^@D@@@@@@@@@@@$@@@@@@@@@@@@@@@L@>@@ @2@@@@:@@@@z@>@@ @V@@$@@@@@@@@@@(@@q@H@4@@_@@@@@@@@0@ @@@@j@P@4@@T@B@N@H@D@(@2@@j@N@@@@x@P@6@@@*@v@>@@@@^@@@@@+@@@u@@X@r@s@@@@l@r@:@@0@@@^@@@@&@ @Z@@b@"@@@@@@@@@@@@@@@@@@@@r@@@@p@Z@<@@@J@@@@@@l@ @X@@B@@@z@@@(@ @@@/@`@@@@B@@M@@@@v@@Z@d@4@@@@$@T@~@2@@@@@@>@@@@@^@@@@p@2@ @@@b@N@@@@:@p@@@ @@@@,@@@8@@^@@1@@@@$@@>@@(@z@@D@@@@0@@@@@@@@@@@@@@@@@@@@@@@@@@@"@@@@@@@&@@@@@@t@@@@l@H@d@@Z@c@)@@@L@X@u@@@@-@x@@F@@&@,@x@@\@@@@@@@@@X@<@@@@@H@"@@@4@N@@@@p@@@@(@0@@@@@K@@7@@|@@@@@w@w@@@@@@p@@@ @@@@@@@@2@&@~@@@@@@@@@@@@@@@@@@p@@J@z@@@^@@@ @@@z@@@@:@@@@@@v@@,@<@@@|@@b@@@'@=@Q@@\@@@@@@@@@@@@@@@ @@p@l@`@8@@@@n@@8@@@Z@f@"@@@T@@@@$@@@ @@F@ @P@c@R@?@#@@@@2@a@(@j@T@@t@@@@<@J@:@@@@@@@@@@@@@@@@@@@@@@@ @@@x@@@Z@h@@@d@@ @@@l@@@@N@L@@@@@@@0@F@$@`@@@@f@1@@l@r@B@@n@@@@r@@@@@ @@@@z@D@&@@h@b@n@T@J@0@&@@@@L@@@@@P@6@@j@@@@J@n@@@@l@@@@p@@@b@\@f@ @@@@@@@@@r@,@@>@@@@@@@@@@@@@@@@@@@@@@@@@T@t@@@@@@@@ @8@8@@<@x@:@@@@@@@@@@@,@6@,@@@@@f@@@@@B@@@@:@*@@@@@@ @@@@l@@@H@f@P@H@@@L@@`@,@@@n@t@(@ @@@@@v@@@@"@<@f@@J@@@@@ @~@@@@@`@@@@R@@j@@D@@@@@@@@@@@@@@ @@@@@@@@@@@>@H@T@ @@@@@@@@@R@@@@6@@(@@@@@@R@@|@@@@@@@@@8@@@T@:@Z@&@ @X@@v@@ @8@N@,@H@@@@8@f@@@@@@@8@@d@@@@@@X@"@:@X@@@@Z@R@@@@@@@d@@X@@@L@@$@@@&@T@ @w@@@@@~@@@@@@@@@@@@@@&@@@@@@@@@@*@@@@@l@t@@@h@@@@@B@@<@p@@@@@@@@T@@@T@@@@R@6@V@@@8@@B@p@@"@@0@L@@F@@@"@@@@@@P@@@@@@@p@@@H@6@@@@>@F@<@2@@@@"@@x@v@@@z@@@@x@@R@@@@@@@<@ @n@@f@@@2@@@@@@@p@@@@@@B@@@@@@@"@@$@@@@p@j@@@Z@@@r@@@@@t@@|@n@@@@n@@\@@V@@\@@@l@@@@@@@.@@@4@@ @&@z@@@@t@&@2@r@@v@@2@@d@@@@@@@@@@v@$@@@@P@X@L@T@@L@@@@@@@@@X@@@@@@@r@@h@@ @W@@@@h@@L@b@@@@@@@*@@<@@@@@@@@@@`@8@*@^@N@@~@<@@X@@z@@@V@@@r@D@n@6@@T@|@|@:@@j@@@@@@2@H@@@@^@^@@@@@@T@@^@,@P@@@@N@$@@ @@k@@j@@@@2@J@@b@@@>@@@J@@@@J@|@(@@@@@*@@@@0@H@N@@0@@@@@@@@g@@?@@@@@ @ @p@@@@@@@@@x@@@@@@@@@J@@b@6@B@l@@r@@J@:@@p@P@.@d@@@`@x@@8@@p@d@@F@@ @l@@@@@@$@@@@@@J@V@@@L@|@@R@@@L@8@R@@@p@J@@@z@@0@@@ @ @.@@@|@@@Z@4@@@@V@D@*@v@X@@F@b@@@@@*@@@>@(@@@@@@6@@@H@l@n@@@@ @@@F@>@@@@@@@@@@@@@@@@@B@@@@@@l@@@@Z@v@@@@^@p@B@p@@@@@\@@@ @*@@(@@@*@@@@@@@@ @@@@D@@@@@R@@@@@~@@t@@ @@@@@x@p@@@ @@@T@@@D@@@R@@@@~@v@.@.@H@@@@r@@@&@Z@@>@@@@@@@Z@V@@|@@t@0@@@@@@@@@@@Z@@@@@@@@@@@.@@@h@@@"@@@@@@@@@Z@@ @@@|@h@@@@@,@@@X@@@$@T@@*@.@t@z@X@@6@@J@@@@@h@,@@@.@@H@@@@@ @y@@@@<@@@@@h@.@ @@@@@j@$@0@@@@@T@n@@@@@v@n@@p@@@@"@x@h@ @~@@j@@z@(@W@\@@@@$@@B@v@Z@j@r@ @ @@@@@@@@ @x@@@@@@@h@@F@@@T@l@@z@b@@P@ @@@^@@(@@@l@@@\@@@x@0@R@2@j@@@~@@@@@^@j@@@@@@@@p@@@$@@@@@h@@:@]@6@@@@@@t@@@<@@@`@ @@@@@"@R@^@@@@>@@@@>@@@@~@@@@@@@T@@@@|@T@@@@@,@@@@@@0@@@@@@@.@@ @@@j@r@@H@@@<@@@@h@h@@@^@"@J@@@&@@@@t@@x@T@@@@@@@@@@@P@\@P@D@@@p@@b@f@,@X@@@V@ @@@R@@4@w@`@@(@N@@~@@@@0@@@"@@@N@@@@@@T@F@@@@@@@0@@B@8@@@@l@ @@[@C@c@8@@@@@r@i@@@ @@@@>@@@,@@@@@@T@8@@@2@@@@4@^@@H@@@@@b@@@j@@2@@l@@@f@@@@@b@L@@@@P@r@@X@@@@f@4@z@@2@f@@V@@8@@<@@r@@@@t@0@@@>@@@@@6@@@@@6@0@@:@@@H@4@@@x@@@@8@\@@@f@t@@@@@|@N@@t@@a@@^@@}@@@@ @p@@@@@J@@@@@J@@@@N@@@@<@@@@.@@@@@@@@@^@ @@~@z@@@J@@@@@F@@@N@@,@@@@@@@@@@@@@@"@@@~@@@*@p@@@@ @^@@@F@.@F@@U@@I@@@@P@@@@j@@Z@@@@@@0@ @@~@^@@L@L@t@*@@@@J@@F@>@@ @/@@@@ @}@K@@@@;@@@z@@@@@L@*@@F@"@@@:@@X@>@@@$@@ @@@.@@8@@@@@@H@"@@~@l@@@B@ @ @j@:@8@@@@@@H@l@@ @@t@@}@@V@@I@Z@ @@@@@@^@@@>@@@$@:@@@@@@e@@y@d@*@:@@@h@v@^@@@@$@v@J@ @@@@@B@@@<@ @@@ @@@L@@@@E@@@.@@@;@^@@9@@@P@m@l@@@@@$@L@@@z@^@~@,@<@N@`@@Z@@@^@@@@@@@p@@@F@x@r@@`@"@`@@@@@@Q@@@@@D@T@@L@G@@@@\@@b@@@@@@@@@@D@@@@@,@,@:@@@@@o@@@|@6@@P@@@@@~@@@j@@@@@~@@8@J@@@@L@@ @@@@@@@@`@@@@G@@@@@k@@_@@8@@@@>@$@b@@Z@@H@z@`@t@"@\@@@0@V@@X@@@@@@^@@@@@@@@@@@@8@@@@x@@@@@@@l@D@@@{@@@@@X@@r@D@"@@@(@~@h@@@@v@@p@e@Y@@k@@@@(@@@@@@@@"@>@@@H@ @@@~@x@@0@6@@@6@@@@@^@@>@j@@0@@T@@!@@@d@p@@@@@,@@6@@@W@Q@8@P@@8@@@:@|@@@l@B@0@ @D@ @4@@@@@@@L@@@|@h@@\@*@@@@@@@J@z@v@W@@@>@@@-@~@@@5@@@V@z@@p@t@,@r@\@(@@T@@j@@@@@o@@@@@@P@@@`@@@F@<@@@@R@V@@@@@@@D@>@@@2@@@B@@@@`@|@@V@G@@z@@6@'@@c@@w@j@`@&@r@@@D@@i@@@@l@@@@2@>@*@`@f@ @@@@0@@@@D@b@T@~@@h@X@P@@\@<@Z@z@@@J@T@@(@@@@?@:@@@@@<@^@b@@@@@@X@~@@@@ @D@.@@@&@z@?@S@@T@J@ @j@@@@~@@@@@^@j@@$@@@@@j@~@@N@&@@@@@@@@@@@J@N@z@@@@@W@@"@ @@@@l@@N@p@ @r@@@#@7@@@@*@@@@$@Z@@@b@l@$@@@@@@ @@@@*@z@@D@<@@@@@@@@@@^@9@ @@S@H@ @@m@@@6@@V@@@@D@l@@@|@@ @ @@@@@@2@@@q@H@@@ @@@@@@0@l@Z@(@@@@@@@@@T@r@@b@h@@>@@@@b@@@@@@J@Z@@Z@@@G@@@@@@ @@@,@@@@~@j@@.@@ @>@@@@@ @@<@l@P@T@V@v@@@v@@@@@@l@`@H@f@r@@@@@@@X@@@ @@@e@e@@@@E@D@T@@:@<@@n@@l@&@(@@@@B@,@@k@@@@@ @@@,@@>@@\@h@&@"@d@@@@@@@@@2@J@P@@@(@h@@@@@n@@b@t@@@@&@@8@-@s@@@@@j@@,@,@@f@<@X@@@@@@@@h@@@@@@@@@@2@*@@h@@&@@@ @.@x@`@b@8@j@T@~@@@@<@@R@@@@j@ @@@T@*@@@m@t@T@~@@R@@@(@T@@@@@.@D@@@@@@@@@@@ @@@@V@P@(@@@@@@@@~@>@v@>@@@@@(@@@.@@:@@@8@D@L@@@@@@ @@@@g@@:@@@@@P@*@d@l@l@8@K@@z@~@@0@@@@@@@@@ @@@@T@@@@>@@@@J@>@r@@@@@X@(@@@J@@@@@i@@ @@@@C@D@@@@<@@@.@@@@<@X@d@@j@8@@@@@@ @@@8@@0@b@8@@@$@@@@@@@`@h@6@@2@@J@V@@@H@@h@@@*@@2@@@@ @@~@P@Z@L@@@@X@d@@@Z@p@@@@@w@-@@:@@8@(@@@@*@@@@@J@@@@@@<@>@*@@@r@4@B@@v@@@@@@N@@@p@f@@q@@@_@Q@ @@@@@8@@@<@@ @@@@(@X@0@X@L@Z@r@@@@@0@@d@<@@z@.@ @@@@@@v@@P@F@j@*@@"@@N@>@@@N@@6@@V@*@,@@ @@@@@@p@@@@@@@4@@T@@@@@@@@@6@l@@>@@@@.@J@.@@@@@v@b@@@P@f@@v@\@z@@@@ @4@R@X@R@@@@@H@@@V@b@@@@@A@-@@@J@@8@@J@D@@ @F@@<@@P@,@@>@@@h@@@@d@@@r@@@@ @@@@@@@B@@J@"@D@*@@@@@ @@@@@@@6@@@D@f@@`@B@.@@@x@H@@@@@H@@4@@@@@@@:@8@B@@@`@b@j@ @0@L@V@@@@@ @P@@@t@@@@r@@p@@@F@f@D@j@@@@B@v@@@,@@@@>@N@@@@J@@@>@@d@D@"@$@@:@@@x@@*@l@@@@@@@@d@@H@0@@@j@*@@@@@|@@j@H@V@@.@@@ @x@f@@@f@@@@@@@^@@*@h@@6@T@@8@(@@@@z@@@@@r@@@@@n@@@@p@@@l@d@L@r@P@0@@@@@"@@@@@@@@b@`@2@6@L@J@p@x@@@D@x@,@n@@@p@@@R@@d@z@@@@@@v@.@@4@@ @@@l@p@,@@@@@@@>@\@l@@N@h@@@V@@@@@@P@X@N@D@6@@@@@2@@@@ @R@@@@@@@x@@z@@v@@h@@"@@@@F@@@@@@@@n@L@@@ @@@@@@x@V@t@R@V@@8@0@@@4@L@@@@*@@@@@n@p@2@@@b@@@@@f@@@@:@@@@@@p@n@@@@@z@@@@v@@@@@@@f@&@ @@@@@@x@B@@@n@8@@@^@@@@@@|@n@b@>@0@@@@@@@H@@@j@@@4@@N@d@R@@@@@%@@*@@@l@@@@@@@"@@v@.@@@@@@@@@@h@b@^@@@l@@@f@@@@@@l@@@@@@@:@@T@\@@^@@@ @F@h@@n@@@d@`@(@4@@@d@z@@@z@@@|@ @@|@@4@$@@N@@^@B@:@@^@@@R@~@`@<@@~@:@@@@@n@~@P@J@F@@@@@@@*@r@r@ @j@@@@"@x@@|@@@@@V@&@H@@B@@n@@@,@[@#@r@j@h@6@@@@@@l@|@@@^@@x@@h@@@@@8@@6@@h@@"@@H@@@@0@"@&@b@@ @@R@r@(@@@t@@@L@,@@@@@&@@@4@$@@P@>@@@@@@ @@^@@@<@<@@`@@@`@@8@@@@F@@@@@@B@L@8@8@@@@@@@F@@@ @8@@@L@.@4@@~@j@@@@@t@j@@@H@^@@k@@@U@@@@@@@@@@@@,@@@<@@j@N@@@@x@n@@@@@@@@@0@@j@P@H@P@`@@@@@r@|@@@@@\@@.@@@z@@@@ @@ @@@@@@@@@`@d@F@P@B@@N@@@@t@@@@@@8@H@@@@@h@(@*@B@@@@@@@0@@@(@N@@ @@@J@@l@p@b@@@@ @v@@L@@V@v@@@@d@@@@P@@(@@@@6@l@b@@@2@@N@@@@@@`@@@@2@@@@@@@@@h@^@X@\@@@ @@8@@@t@@@,@@@@t@n@@b@@@@@@@@p@@@@@.@4@6@@L@@@ @@@@@`@@n@f@L@ @$@@@@v@@^@V@@@@@ @@@@D@z@t@ @(@"@@|@@@T@<@.@:@:@8@@@^@@|@f@@@p@@p@@@@*@@@@@d@@@4@&@@@\@t@`@`@@@@.@v@d@@@@@0@|@@<@@@@N@^@p@@@2@@@D@$@@@^@@@@@J@F@Z@@f@@D@@@V@@&@@@@ @@@:@@@ @j@(@@@v@@@@@<@ @@@@@|@@z@N@(@"@8@@@d@@@0@J@@@@@v@@@@0@v@&@$@T@0@@@@@@@R@ @@>@~@r@@@B@j@@D@@z@,@@@.@J@0@@t@V@@@@@@@@@@@@@h@8@|@h@@@l@<@@@@f@@d@.@@T@d@@@@@@n@F@@@@@$@L@@@J@@@@@@r@&@@z@R@V@*@@@@@>@@@@N@@@@@@@`@t@<@@@V@ @(@"@x@@@@p@R@@@@@~@@@"@Z@L@D@@@ @4@@@@@@@\@^@(@*@@@V@@ @2@@@N@$@@~@@z@@@@@@@(@@@@@@@@@b@@.@2@F@@@F@@@,@$@@t@@@@@@@.@@@@`@@2@@@6@@@N@&@@n@H@v@@@,@.@n@@^@l@@@@@<@@@B@0@@@@@@x@f@\@"@N@ @@@@v@@@@V@j@@@"@@@@ @Z@@@N@@@@@$@@`@@@J@@V@@J@@@@@@@@2@@`@@@@@@@@@@@@@@@~@@@@@r@@@@@@@@~@@@@@d@@@@F@@@@N@b@@.@"@V@@@@R@@F@P@@J@@V@"@@&@ @t@@.@@?@@@@@@r@8@@@@@v@~@v@D@2@4@@V@@@@P@@@@,@V@@@@@@@@@@@@@@@@@@@@@@@4@4@@`@ @@@@@|@@@@@@@@@@ @@z@@@@@@@@@@@@@@@@@0@6@,@@@@@@@p@N@@@&@@~@&@@2@P@"@0@x@@@N@@L@@<@x@@ @@L@@@@b@h@Z@@D@@@f@6@4@@@@@@@P@@@Z@0@*@(@@@@J@@@@@@P@b@@@@@R@f@@"@@<@@@@@@@3@@@@T@h@@@@"@@b@@@|@r@@@p@@<@@R@@@@@@@:@@@@@@>@(@@@@@@@N@@@@^@h@(@6@@@@@v@@d@@@@@@:@T@D@@@v@D@@@@,@:@X@@@@@R@@@@F@@P@@8@@@@@@@t@Z@T@l@B@(@"@ @@@D@p@@@@@X@`@@d@@"@d@@d@$@@@@@b@@8@X@@@>@J@f@@@@@@@@"@@@&@"@@@z@~@f@@F@@@Z@@:@,@j@<@$@X@n@p@h@r@@h@"@@@@t@@&@r@ @@@@x@b@B@N@,@@@,@@*@@@,@x@@@@@@@T@@<@4@@4@p@ @n@\@@@@&@@8@@@@@@@l@B@V@B@2@@8@@@ @&@f@L@p@@@T@B@@>@x@@@l@@,@ @d@@9@@@0@@@P@@J@@N@ @@6@@@8@@`@L@@b@L@2@J@\@f@@@@@@|@@@@n@ @D@@@@.@@f@@@@@@F@N@@V@@@>@@@@@@@n@(@0@@@@t@@@v@@@@@@*@@^@0@2@@@b@&@@@l@ @@p@@@@@@@\@J@>@<@$@@@@@@6@X@l@@@@8@(@t@@6@@@@@@>@@@@@(@@7@@@@@J@@@@@>@@0@@@@@@@<@@&@2@@@@@~@b@@B@|@\@B@@@V@@@@ @@@@@@`@@@ @@@@@@@@@@d@l@@@t@4@D@@@D@@@@@@@L@&@`@@P@@@(@Z@b@@@@6@@@@r@@p@t@l@4@J@*@@@@@@6@*@b@@@@@@N@@@j@@@@2@@0@ @H@@@@q@@@,@@@@@T@J@@@@@@@@@@@j@@@`@.@H@b@@@@f@@$@@H@@6@@6@@@@@p@@@@B@R@<@ @@@@@@@@v@@@@&@F@<@@@"@@@@B@@@:@@@@@@@@:@@d@t@@@~@@@@@@@@Z@j@>@6@$@0@@@@"@@<@d@@@@@*@@@@@@*@@@&@@9@@ @@y@@@z@N@@@@@@T@`@@@@@x@@f@@h@L@4@@@@:@@@@,@@@@@`@@@P@@@:@@@|@@@@ @@@@@@@@:@@@@@@x@@@@@@&@P@z@@ @@@@@L@@L@h@@6@.@@&@@r@\@6@@@@@@z@l@^@*@P@@@@@@@@"@>@@@@"@@^@@@6@@@@@@@=@S@w@@%@@@6@@"@@@@@@@n@D@T@@X@^@D@2@@@*@@@@x@@6@@@@@@@@@*@J@@$@@~@@@@"@@@ @@@@@@@@\@@@@@@@@@@f@@@@@T@@(@@@@@@@r@x@v@@@l@4@@"@@@@p@@f@R@X@&@ @@@"@@@@@4@"@T@@@@@r@~@h@@,@^@@@@@@@@@@@@.@@-@r@(@@*@@@@@@@@ @@@@@@@@p@@@@J@@@@@v@@T@F@:@@@@@@&@@@@@$@@@@@@X@@@@@*@@@\@@@@@@@@@@@F@>@@@>@^@@@j@<@.@@@^@.@(@@@@t@@@B@\@R@,@>@*@@@@@@@@ @2@@@@@@0@$@<@@@@N@@$@(@B@n@N@@ @@@,@h@f@@Y@b@@@@.@@@@@@@@@@@<@@P@@.@@@@Z@N@@d@6@@@:@@@@d@R@4@@n@F@f@@8@@v@f@@b@@@@@r@t@@@@@@@@@@Z@@(@f@@@@P@@.@@@@~@@@@@@@@l@@f@l@R@2@,@@@@@ @@@@ @<@b@X@@@@@@8@x@@,@T@v@*@2@@@h@2@@@ @u@@P@I@@ @&@@@*@@b@@@L@R@`@,@@N@@@>@@^@&@@@N@N@~@@@@@0@@@@Z@@@@@Z@p@N@@|@j@f@\@|@@@@@@@@@@@@@@b@@@~@&@@@@@@@@X@@@@@R@@@@@@@z@@T@>@.@6@@@@@"@ @@@@@@@@"@j@\@@@@ @(@0@@@@~@@,@>@@@@:@:@b@q@?@v@@@@b@p@(@@Z@@@`@|@@*@@`@@@@~@@@r@@@&@@$@@@@@@@@p@t@@@d@0@*@@J@>@h@b@@@ @@@@@@@n@2@^@@@@@@@B@<@@@@@@&@ @@@N@d@&@@@@@@v@l@t@>@B@(@@@@ @@@@@@@@@@@j@D@`@@~@@@@@@@2@d@@@@`@@@;@F@.@@^@@@@v@@@^@@@ @@,@@@6@@@@@@@@&@@@@@@@t@@@@@@N@F@ @V@r@@@*@$@@"@@@@p@@`@@b@@@R@0@@@@@n@B@@@@@J@@L@H@@@d@f@T@$@@@@@@@r@H@p@D@@&@ @@@@ @@@@@@@@@@.@@@~@H@@@@:@ @`@@@@@f@$@6@@@@@@.@@@@@@@L@f@@*@@$@R@(@@@ @@4@@@V@6@@*@@@@@P@>@T@@@x@@:@j@@@Z@@@@H@@@`@@@T@D@z@@@@2@@j@d@d@@@d@Z@@ @v@@ @@d@"@@@d@f@@@ @@@@@|@@f@R@n@N@<@$@@(@@@@@@@@@@@@@@@ @d@X@l@@@@"@ @H@4@Z@@@@(@@N@4@@@p@V@6@|@@@0@:@@@@l@@:@<@@@J@P@J@@@ @@@@@@@@@@"@2@X@@@@@@~@~@,@@@@@@@@@@4@@@@(@Z@@X@*@"@T@p@@@@@@@@@H@@|@D@T@@@@@@@@z@Z@\@`@B@<@*@@0@@@@@@@@@@@@@@@(@F@d@@@v@@@@ @4@H@@@@@*@@$@F@x@d@J@@@@8@@ @"@~@P@@D@@@@@P@@j@@@6@p@j@l@b@@ @@4@V@(@@@<@@@l@D@@6@@@@@,@@@@@@@J@@@@|@J@@n@@D@C@V@F@@,@@@@X@@@@@@@@@@z@v@J@n@<@0@:@*@@@@@@@@@@@@@@@@@@@ @$@8@h@\@@@@@@@>@,@@@@p@@t@@@@@@@@@\@@@@&@@@@8@:@@@L@@R@H@@6@N@D@:@V@@@@@@z@n@@8@`@@@V@ @@N@@ @Z@4@ @@@@(@@|@f@b@@^@D@@@@@@7@@@X@@>@@@@B@@@@@@r@h@V@6@J@D@&@<@.@@,@ @@@@@@@@@@@@@@@@ @@@ @8@8@h@h@@@@@2@T@@`@@@@@B@f@@@J@@L@z@@@@@@f@@@@^@@.@H@@d@J@@@@@@@@N@B@@,@F@@@@n@n@T@*@@@z@@@T@@B@J@n@p@"@0@@v@d@2@@`@@@{@]@@@@`@@@@@z@>@@@@@@@h@@@T@*@N@4@@@$@@@@@@@@@@@@@@@@@@@@@@6@ @>@p@@@^@@@@@@p@0@V@@@@@@"@@<@@@@@@@@D@F@@@z@T@^@*@@@4@f@@@@@@@@@`@f@|@$@:@0@@@4@"@x@0@@.@@@*@\@n@N@>@D@ @F@l@@?@4@_@@@@@@@6@@@T@@@H@ @ @@@@@|@x@B@P@>@6@@@"@@@@@@@@@@@@@@@@@@@@@@@@@@(@@N@L@<@@@@@@@ @ @R@B@p@n@j@@@@@P@@f@"@N@@@@@(@@.@ @P@~@:@@@@@@@@(@h@J@@@@@.@@@@&@@@"@@@@b@@@l@\@,@T@@s@@g@B@ @@d@:@@&@@ @@@@F@@@@@@v@~@p@6@N@,@,@>@@ @F@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @6@B@Z@@@@@@@@@@(@&@8@ @~@@r@@F@r@@F@J@@f@@@@6@@@@@@d@,@@@@@@@>@@@@t@h@@@@@@@@@@@@R@(@@0@@@~@@@@@@@@@,@\@@@@ @@@N@ @@@@@@@d@Z@@@j@@J@ @.@@ @@@@@@@@@@@@@@@~@@@@@@@@@@@@@@@R@D@`@J@d@@l@@@@@@@>@@@@>@t@@>@$@@@K@@ @V@v@^@i@v@ @H@D@4@"@ @@@@ @@@@@H@8@D@@"@8@@@J@`@>@@4@"@@F@j@@@x@@@>@N@r@@@*@@d@@@@\@h@D@@@@@@~@@J@@@B@@@.@J@*@4@@ @*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6@$@L@@@^@@n@@@@@@@ @D@@@@@@@f@@ @@@@S@@@f@@B@V@~@$@@N@,@Z@:@@@H@N@L@0@@.@P@@N@P@h@V@<@^@&@ @@@@@@@D@@@@@@@@@|@N@,@@@@@@@z@v@@B@6@<@(@@@@4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@,@@6@.@@D@0@T@@@@~@@@@@@@(@v@@@(@@@@ @@@"@t@.@X@@>@@P@$@~@d@z@f@d@6@"@4@@R@@.@V@@@@@@8@d@@$@@p@@@@@@@p@b@@n@f@@@@^@&@"@@@@@@p@D@\@T@V@@*@,@0@@@@@@@@@@@@@@@@@@@~@x@p@@@@@@z@@@@@@@@@@@ @@@,@@@R@6@X@\@T@@Z@@@@"@@@@@@<@@$@@#@@@<@@@@,@@@@@T@@@@@@&@@@@&@ @@@@8@@o@ @ @@@@:@P@@@^@@@@@@@@:@@@@@@@j@\@p@R@`@R@d@4@@4@@@ @@0@@@@@@@@@@@@@@@t@~@z@@@t@@@@@@@@@@@@@@@@@ @@@@ @(@<@8@T@H@l@@@@@@@@@@@@@n@ @@<@@@@@@@@@Z@@B@V@ @8@@@@q@@l@@@H@@E@@@@@@F@@~@V@N@@N@`@N@6@2@$@0@@@@@@v@j@D@|@@0@D@&@@@@@ @@@@@@@@@@@@@@@@@@@@n@@f@@@@~@@@@@@@@@@@@@@@@@@@<@,@2@:@0@j@V@@@@@6@`@d@\@n@@@@&@@`@@@n@@@@@@V@@@@@@@:@@4@@:@@@@@"@@`@$@,@D@@@@L@"@@@@d@X@.@ @(@@@@@@@x@@@D@D@$@D@(@@@@@@@@@@@@@@@@@@@@@@@@@l@l@p@t@|@x@@x@@@@@@@@@@@@@@@@@@@@@@@2@@<@x@@@@@@@&@:@B@0@J@>@@@@x@6@h@(@>@~@@"@ @@@@@@@@r@@ @@>@@f@@ @@@@@b@@@@>@@ @.@@@@@@@@@@@T@@B@^@&@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@j@t@f@@j@@@@@|@@@@@@@@@@@@@@@@@@@@@0@4@J@^@@@z@@@@@.@@p@T@J@^@R@.@@@"@@T@@@@@z@@@8@@@p@@r@H@\@l@@N@4@@@B@@@@V@D@@@@@@@@@@X@\@f@b@X@:@B@@@$@@"@@@@@@@@@@@@@@@@@@@@@@@@@@p@x@z@x@v@p@@@@@@@@@@@@@@@@@@@@@@ @@@(@&@>@h@F@x@p@l@@z@@@@,@@@@@@@@ @@ @@R@j@\@Z@4@^@@@\@^@@@@@@@@@@`@`@@~@@|@8@N@@@@@@@~@@l@b@t@f@X@6@J@T@@8@0@@(@@@@@@@@@@@@@@@@@@@@@@@@@@r@t@t@z@f@l@v@`@z@r@@@@@@@@@@@@@@@@@@@@@@@:@@@@@@J@4@@@@@@~@@@@@@@@@@@@@@@@@.@ @@@B@J@4@R@@@@ @@@@@@@@@@x@h@P@p@T@(@`@4@F@8@0@4@"@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@z@~@x@`@x@x@@v@r@@z@@z@@@@@@@@@@@@@@@@@@@@@@ @@@.@Z@V@j@@R@j@d@`@@X@@f@@l@v@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@~@N@R@@@"@8@@L@@@@$@@@&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@h@v@b@r@^@L@p@r@l@z@n@@n@|@@n@@@p@@@@@@@@@@@@@@@@@ @@ @D@0@8@6@>@J@>@L@Z@2@P@v@@@F@X@~@j@b@@@h@~@@@@b@R@@@@@@@@@@@t@^@@@~@@~@@P@^@@,@&@>@R@*@(@"@ @(@.@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@f@b@h@V@Z@^@r@`@n@d@t@t@^@f@v@j@|@|@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @&@"@ @@@@@V@\@X@2@Z@8@@F@`@v@>@X@v@V@v@f@@T@@R@j@p@.@D@P@4@D@6@P@@@$@"@.@@@ @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@l@p@f@j@x@l@t@p@p@~@v@@@@@t@v@r@|@@@@@@@@@@@@@@@@@@@@$@@@@@@@@(@,@(@R@@D@@@L@f@B@>@z@J@L@@@Z@@J@2@r@|@|@v@@d@R@(@h@^@B@@.@4@D@*@N@$@6@&@@@*@@&@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@^@H@h@~@d@j@p@b@b@`@V@^@X@v@n@f@@~@n@@|@~@@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@ @@@&@@@@<@ @@@4@.@*@@@2@"@@*@@@.@(@@*@.@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@f@\@N@\@V@f@h@\@j@n@V@j@n@x@p@\@n@j@v@@z@@@j@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ @@ @@@@@@ @"@@@@@@@2@@@ @@@ @@ @@@@ @@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@^@T@^@X@`@X@d@^@b@p@`@t@|@f@n@f@t@x@n@x@|@x@@|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@ @ @,@(@@@@"@.@:@@@@@.@@@ @@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@P@^@R@N@X@Z@V@J@t@f@N@d@l@^@@\@n@`@b@@t@p@|@n@x@@t@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@h@V@`@\@\@v@h@l@Z@l@n@f@f@@@n@z@r@n@f@x@x@z@|@@x@@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@R@Z@P@B@`@P@N@N@b@V@b@d@P@f@T@h@\@Z@V@p@j@@r@@j@@|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@`@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@sunpy-0.8.3/sunpy/data/test/EIT/efz20040301.070014_s.fits0000644000175000001440000042350013203275053021116 0ustar nabil00000000000000SIMPLE = T / conforms to FITS standard BITPIX = -64 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 128 NAXIS2 = 128 DATE = '2004-03-01' / Date of file creation TIME-OBS= '07:00:14' / DATE-OBS= '2004-03-01T07:00:14.658' / UTC at spacecraft ORIGIN = 'Rocket Science' / Rocket Science = NASA GSFC DATASRC = 'LZ file ' / TELESCOP= 'SOHO' / INSTRUME= 'EIT' / OBJECT = 'full FOV' / BUNIT = 'counts / pixel ' / WAVELNTH= 171 / 171 = Fe IX/X, 195 = Fe XII, / 284 = Fe XV, 304 = He II FILTER = 'Al +1 ' / DATE_OBS= '2004-03-01T07:00:14.658Z' / SCI_OBJ = 'FULL SUN 171/284/195/304 ' / OBS_PROG= '171_5_284_90_195_10_304_30_AL_1.000 ' / CMP_NO = 1 / Unique campaign instance (1 = synoptic) EXPTIME = 7.596 / s (total commanded + shutter close) EXPMODE = 'backside ' / FILENAME= 'efz20040301.070014' / CFTEMP = -66.71 / CCD cold finger temperature (C) CCDTEMP = 7.34 / CCD temperature (DN/100) CTYPE1 = 'Solar-X ' / CTYPE2 = 'Solar-Y ' / CRPIX1 = 64.5 / Sun center x, EIT pixels CRPIX2 = 64.5 / Sun center y, EIT pixels CRVAL1 = 0.00 / CRVAL2 = 0.00 / CDELT1 = 2.63 / Pixel scale x (arc sec, fixed) CDELT2 = 2.63 / Pixel scale y (arc sec, fixed) SOLAR_R = 372.27 / Solar photospheric radius, EIT pixels SOLAR_B0= -7.22 / Degrees SC_X0 = 0.00 / s/c yaw (arc sec) SC_Y0 = 0.00 / s/c pitch (arc sec; -109.14 after 1996/04/16) SC_ROLL = 180.00 / s/c roll (deg., Solar north + CCW from nominal)HEC_X = -139130208.00 / s/c heliocentric ecliptic x (km) HEC_Y = 46576272.00 / s/c heliocentric ecliptic y (km) HEC_Z = -94896.31 / s/c heliocentric ecliptic z (km) CAR_ROT = 2013.00 / Carrington rotation at earth COMMENT CORRECTED DATE_OBS = '2004-03-01T06:58:29.583Z' COMMENT COMMANDED EXPOSURE TIME = 5.000 s COMMENT SHUTTER CLOSE TIME = 2.596 s COMMENT LINE_SYNC = 'no' COMMENT CAMERA_ERR = 'no' COMMENT IMAGE_OF_SEQ = 0 COMMENT READOUT PORT = 'B' COMMENT NUM_LEB_PROC = 3 COMMENT LEB_PROC = 26 (no ROI) COMMENT LEB_PROC = 27 (no occ mask) COMMENT LEB_PROC = 12 (Rice) COMMENT BLOCKS_HORZ = 32 COMMENT BLOCKS_VERT = 32 COMMENT P1_X = 1 COMMENT P2_X = 1024 COMMENT P1_Y = 20 COMMENT P2_Y = 1043 COMMENT N_MISSING_BLOCKS = 0 HISTORY Version 4.0, 2001 December 10 HISTORY Image linear resampled to (128,128) for SunPy END @@@@@@@@@@@@@@@@@@@@@@@ @@@@@.@@ @@@ @ @2@&@@&@@@@8@@@2@"@,@&@0@ @@4@6@B@@@H@4@&@>@2@>@V@>@T@@@>@P@ @4@@&@"@"@@@@0@@@@@@@@@@@@@@@@@@@@@@@@@|@@@z@r@l@p@@f@|@@p@p@j@v@f@`@V@f@`@Z@X@d@R@`@\@b@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*@@@@@&@@@0@@@@@ @&@@B@@,@@@&@$@@ @X@,@$@:@@"@>@.@P@H@4@0@@6@@@(@@@$@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@p@~@t@n@~@j@v@r@v@l@x@Z@^@f@n@\@r@^@`@T@\@^@f@b@R@@@@@@@@@@@@@@@@@@@@(@@@@@@@@@@@@@@@ @ @,@@4@@F@"@@D@$@@N@N@T@H@*@H@:@6@V@.@<@`@L@V@b@8@h@6@6@Z@J@@N@(@P@$@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@~@x@r@r@h@v@p@.@j@r@p@l@p@n@X@V@d@^@X@f@p@X@R@d@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@@@$@8@$@@@<@4@@"@6@0@@@H@P@L@2@>@6@L@J@B@f@H@T@j@H@N@Z@B@N@.@,@^@ @R@>@@@@@@T@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@~@@@n@t@r@x@v@r@p@h@h@h@l@v@`@`@^@V@\@V@`@f@\@R@@@@@@@@@@@@@@@@@@ @ @ @@@@@@@@ @@@,@"@@ @>@,@@>@(@@@:@8@,@L@L@8@r@B@:@d@,@N@T@D@l@N@^@B@h@r@h@<@P@`@j@f@4@v@@@B@P@8@@r@@&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|@t@@r@l@v@t@^@`@\@^@h@d@T@f@V@^@\@j@b@P@@@@@@@@@@@@@@@ @@@ @@@@@@@@$@$@0@@ @"@@2@"@,@T@0@@@V@T@&@`@2@4@Z@v@^@~@j@b@J@n@@n@@@h@@@r@@b@@@@~@`@h@d@^@~@^@$@d@@N@V@@>@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@l@x@p@z@n@j@^@t@^@`@v@b@p@`@`@`@R@n@^@T@L@@@@@@@@@@@@@@@@@@@@@@@@@ @@ @@@@@@N@@@@0@&@J@J@.@.@N@6@H@R@L@l@h@N@h@8@l@|@@@@^@@|@@@l@@j@@@@v@@p@@b@@@H@6@:@T@@>@0@@@@@@@@@@@@@@@@@@@@@@@@@@|@~@v@z@v@@z@p@r@x@h@h@l@l@T@n@b@\@f@f@`@x@Z@@@@@@@@@@@@@@@@@ @@@@@ @@@@*@.@>@ @&@.@&@@0@@@Z@@@P@h@J@X@p@d@n@h@\@@@@@@2@@@@@@@@@@@@@@@@@@@@@t@@j@T@\@4@p@D@8@L@2@@,@@@@@ @@@@@@@@@@@@@@@z@@@@|@v@@z@v@x@j@l@n@h@\@f@d@j@n@b@`@j@R@T@@@@@@@@@@@ @@@ @@@ @@@@@@@(@@(@&@8@ @&@4@&@B@:@R@<@>@B@t@~@@Z@b@@@@@@@@@@@@@@@@@ @@@H@@@>@@@@@@@@@@@@T@@f@8@h@L@.@(@@@@@@@@@@@@@@@@@@@@|@@@@@v@z@v@@z@x@b@t@j@b@f@l@n@h@b@Z@^@x@X@@@@@@@@@@@@@@@"@@@ @@@@@@@@ @ @.@@&@<@6@,@"@6@*@4@B@V@F@^@X@L@f@x@@@@@@@@@@@@@@@"@T@@V@$@*@P@@ @@@@@@@@@@@@D@B@\@D@<@*@@^@@@,@@@@@@@@@@@@@@@@@x@v@@@@|@r@v@r@@j@n@p@b@`@v@d@j@b@V@\@^@@@@@ @@@@ @@@(@@@@(@@@.@@@ @ @<@@@&@(@@8@8@J@@@R@p@<@:@T@@f@h@n@n@l@@@@@@@@@@@ @@@@@$@z@6@@l@@@Z@4@@@V@@@*@@@@@@@N@|@b@8@Z@B@b@6@ @@(@@@@@@@@@@@@@@@@@@@v@@@@t@|@v@z@l@l@h@p@h@j@Z@n@d@X@h@@@@ @@@@@@ @@@@ @@@ @@*@.@@&@@*@@&@8@B@@H@0@T@J@N@Z@n@<@t@@|@@@@@@@@@@@@X@@@N@@d@f@T@l@@@@@ @\@@@x@:@@D@@H@ @@@@@@~@@d@^@r@d@J@ @@B@ @@@@@@@@@@@@@@@@@@@@@@@@@~@|@j@@@l@j@h@d@r@d@`@R@@@@@@(@@@@@ @@ @@@@.@@@ @*@0@ @X@F@P@F@T@P@<@^@V@V@l@l@@@p@@@@@@@@@@&@6@@@*@<@@@X@@p@@@j@ @@@v@@@@@@@|@@~@L@@B@D@@@@@@@d@h@`@:@f@B@ @*@@@@@@@@@@@@@@@@@@|@@@v@z@~@@v@l@`@r@|@x@t@T@f@l@t@d@p@`@@@@@@@&@@"@@,@*@.@,@4@ @*@ @N@B@*@(@B@4@B@R@X@N@V@R@r@@b@n@~@@@@@@@@@@@F@N@x@@@@@@n@@@@@@j@T@H@~@@@@Z@X@@@@@@,@@t@H@@6@@@ @@@@h@@\@2@d@ @@@@@@@@@@@@@@@@@@@@@@@@t@b@r@~@n@l@^@j@r@`@\@n@l@Z@@@@@"@@@@@@,@@@@$@@ @&@2@B@>@0@4@B@L@(@Z@p@B@Z@b@v@@X@@@@@@@@@@$@"@B@d@|@~@@@@@@@@"@.@@@@@@@@|@@@~@Z@@.@"@R@@@@2@h@@@&@@@@@@J@F@f@J@N@@@@@@@@@@@@@@@@@@@@@@@@t@@z@h@p@d@z@Z@j@x@~@h@`@@@@@@$@@&@@&@ @.@@2@0@:@F@@N@<@.@N@@@J@T@R@@j@x@@@@@@@@@@ @@@,@@@@@@@@B@j@@@@@@@@@@@v@*@@@@z@@@>@Z@\@@>@@@@@@@l@@b@2@B@@@@@@Z@X@D@@&@ @@@@@@@@@@@@@@@@z@@@x@v@@`@j@x@t@r@x@h@b@j@z@X@@@ @ @&@&@B@8@@@,@>@@@F@V@D@@@B@L@^@*@T@p@b@j@r@r@@@@@@@@@ @@.@H@V@@X@T@@@^@@x@4@x@@ @@,@@ @@@h@@t@~@e@1@Y@@@@.@@7@&@H@4@@d@@6@d@@@@@x@Z@@T@@@@@|@\@<@&@ @@@@@@@@@@@@@@@@@@@~@x@|@x@@@@~@z@v@h@@f@`@@"@*@&@8@,@>@2@.@$@F@D@\@P@T@@@F@R@F@P@:@@@@d@P@h@@t@@@@@@@@@@*@<@<@>@v@@@@<@@@@B@R@@@X@*@@@@@R@@@k@@}@r@j@ @@@S@@@@@.@4@v@V@>@@@.@~@V@&@@h@@@@@~@V@<@>@ @@ @@@@@@@@@@@@@@@@@@@~@@@@@x@z@x@n@z@@l@@@@>@$@ @,@@6@B@B@j@D@@@P@@L@R@Z@z@P@J@l@d@r@@@@~@@@@@@@<@P@T@@@@@ @ @@,@@J@@@@N@V@@ @@G@b@@@@@@R@K@}@Z@'@@@@&@@5@@@F@@.@@@@@@@@@P@@@@@@p@@J@L@ @&@@@@@@@@@@@@@@@@@@v@z@@v@@@v@|@z@~@@f@&@@4@F@"@6@<@,@&@@B@h@>@2@B@P@P@R@t@r@p@V@Z@l@x@r@@@@@@@@@ @Z@@@@@@@@@,@@@@@@2@@@v@@@@@@@@@@@@@x@@@@;@@ @u@@@@,@D@@^@@2@D@@.@>@\@H@@@@@@@n@N@\@&@@@ @@@@@@@@@@@@@@@@@@@@@@@x@z@~@t@(@0@H@L@"@*@L@H@H@>@Z@p@>@X@p@@l@L@@x@l@@@@@@@@@@@@@N@@H@@f@@@n@@@2@@|@@t@@W@@@@&@J@ @@@@@h@@ @@@v@<@6@j@@@8@b@@@@@@@@@@@@@@B@2@D@@`@@ @@@@j@v@N@0@ @@ @@@@@@@@@@@@@@@@@@@@@@@r@|@@h@H@6@B@@@X@:@X@L@P@H@R@h@d@x@p@t@x@v@@@@@@@@@@@@@,@ @L@@@@@(@f@@@@@@@@@@@@@N@@@b@t@@@@@@@@@@@@$@>@l@@@:@@@@@@@X@@ @@~@@6@@@@@@0@0@@@@@@@^@@L@ @ @@@@@@@@@@@@@x@@~@@@|@z@v@@@x@~@p@<@:@*@B@<@N@Z@*@>@6@b@v@r@J@n@Z@|@l@@@@@@@@@@@@@@.@j@\@@@@ @p@(@@@@F@@8@p@r@@@@|@@@c@@ @|@<@Z@d@@@Z@\@@@@@@@@@@@@@&@@@6@B@@@@X@6@@~@@ @@:@@.@@@@Z@H@D@.@*@@@@@@@@@@@@@@@@@@@@@r@@|@@h@.@`@2@B@(@V@V@n@X@`@~@@z@`@@l@@@@@@@@@@@@H@@V@@@"@ @X@@F@@@B@@@@@@@@@@@"@@@@<@@.@ @@@$@b@(@@ @@@d@@0@v@0@D@@@H@ @@ @,@@@@f@@@d@6@@ @~@@@f@z@@@@@@@r@^@B@$@@@@@@@@@@@@@@@@@@@@@@~@x@F@&@b@V@V@r@h@R@<@l@p@@@@@p@@@@@@@@@@@`@t@T@@@v@@.@@@(@v@@@@@R@@p@@"@@@@Z@<@@@@@@@@@@@&@@n@@@,@Z@@@~@f@@@`@d@@@@@>@r@@J@@@@@@ @@@~@@"@&@@@@@h@h@"@ @@@@@@@@@@@@@@@@@@@@@@@z@\@F@Z@@P@X@t@X@V@n@@@@@@@@@@@@@2@@:@@Z@@@@@@b@@@@@t@@.@@@@@(@@h@z@d@f@"@@@t@@@@@l@Z@^@v@@@@@|@@N@@@,@@&@@@@z@T@@@2@t@L@@b@P@@@@@@*@x@ @x@.@$@&@@@@H@B@2@ @@@@@@@@@@@@@@@@@@@@@@@r@8@R@Z@Z@@V@@@l@@^@@@h@@@@@@@@@@Z@H@$@h@z@t@@ @j@@@@@@h@(@@@ @@@p@ @@@@<@@@@J@|@x@@@@r@f@@R@@0@@@@@@@t@V@@@@H@<@@h@@@@@@@@@ @@ @Q@@ @@@@@@$@@@@@f@4@>@@ @@@@@@@@@@@@@@@@@@x@@z@D@Z@`@l@r@@@b@@z@@@t@@@@@@@@@@8@ @F@@@@J@ @:@@@@f@@j@<@R@\@@@j@f@@@R@b@@<@@@@8@(@@\@@"@@@@@@@d@@ @@^@@@&@@@v@@$@@$@B@V@&@@@@@F@@.@>@@@@@@d@~@6@@N@>@@@@~@<@b@<@@@ @ @@@@@@@@@@@@@@@@@@V@\@v@j@F@t@@@@@@@@@@@@@@@@&@*@b@j@x@@@@@x@@@@@@R@@@@T@^@@@F@@@@@8@0@@@@@@@T@v@ @@@ @h@@d@@@@<@X@@@@@@@*@<@x@@@p@@p@@@@p@6@f@@@r@.@@@@ @@l@@@x@@@@j@N@H@@ @@@@@@@@@@@@@@@@@@@@@@`@@@@@@@@@@@@@@@@@*@V@@d@d@@@@6@@@@@@@@@$@@8@@D@L@2@X@@l@@@@@x@^@@@@@Z@@@@@t@N@@N@@@)@n@&@@J@@*@@"@@@@@F@^@@@H@Z@@@@@@`@@:@\@j@t@@@.@@Z@@@t@b@`@*@0@@@@@@@@@@@@@@@@@@@@@l@x@@~@|@@@@@@@@@@@@@@@4@@.@b@j@v@j@.@@l@P@t@@@ @n@@@@@@@@@@@@P@@@4@@@@j@@0@@*@@t@ @d@@@@@B@B@@j@@T@^@.@@ @@@@@@@@@@@@r@z@@@p@@L@@@@l@@@@V@@@h@V@V@J@@4@.@<@@@@@@@@@@@@@@@@@@t@@@@@@@@@@@@@@"@@@@J@z@6@@@@@@b@p@@b@:@@>@`@@@b@@z@@@@@@ @@r@0@@@@$@@@>@J@@h@H@@@@@j@p@9@F@8@@@x@@&@@@@@@*@@@.@4@@@t@@b@N@@@@@R@@@@@@@@@T@@@@p@V@n@N@J@8@"@>@@@@@@@@@@@@@@@@|@^@@@@@@@@@$@*@@"@l@r@b@@@@h@@F@p@@@@@\@<@^@@@@@b@b@.@6@@@@@z@^@@P@@p@@Z@4@\@X@,@@@Z@@J@@@@@@O@@b@@@>@@N@@\@\@@~@@@*@,@X@@@H@@@@ @(@R@V@@@@@2@ @@@Z@@@@N@V@J@8@6@L@(@:@ @@@@@@@@@@@@@@@@@@@@@@@@@P@t@X@6@X@~@^@"@@@@@@@@@@@@@@r@@n@*@@$@@,@@j@@@@ @@@@J@0@@t@L@@~@B@@@2@D@@H@z@@ @R@4@&@@P@@b@@8@@@@@@@@2@x@@@@n@@@F@@@@@@@@@|@,@@@@0@@@^@L@4@8@@@>@@ @@@@@@@@@@@@@@@@x@@@@@@@@6@ @`@@x@@x@@@@@@,@@p@@V@@@@@@@@6@@@@@@d@@>@<@@\@D@N@r@p@^@@@:@p@@@@0@@Z@v@@L@@(@@@@@ @.@.@@@@@,@@<@@P@b@0@&@"@8@ @L@@@@@j@H@@\@@t@H@@"@ @@T@@@f@J@&@:@P@D@6@T@*@*@@@@@@@@@@@@@@@^@@@@@@@0@F@@@@@@@@@@@@6@n@@h@@@@b@@@@@@@@@@@@&@d@&@j@f@@$@H@@@z@@@@@@@@@@@r@@@@@*@@,@8@|@@j@@@@H@l@^@ @<@J@@@@@@z@@@@@j@@@~@@@@n@~@N@@@@@r@F@L@8@D@r@\@B@.@6@0@@@$@@@@@@@@@@@@@@@@@@J@f@@@ @.@@@@@r@@@@@@@@@@@@H@^@@J@@$@@@@@@*@@@@@@@@H@t@@x@n@@@@0@@@@@r@@@2@>@@@$@@@@@R@b@J@@@^@@@*@Z@h@h@@@@@@D@@@B@@@@H@@@@@@@@D@8@>@$@8@@@@@J@.@@0@"@@@@@@@@@@@@@@@@@0@,@l@@@@@@@@@<@:@@@b@@@@ @t@@@ @\@@@4@d@@@@@@@@@t@@@>@@@P@@h@n@*@@@@&@V@@@@B@@"@@@@@f@@@@z@@@@@@,@@@@@@@@@@,@(@@@@z@@@>@@ @@@b@@L@.@@J@<@8@6@@@P@>@J@L@&@&@<@.@B@@@@@@@@@@@@@@$@*@@@h@@@@@@@@h@(@@@@@h@@@@@@@L@@@"@H@@@@@@*@@@j@B@V@@N@*@z@@@@@@@0@@@@@@@@@@T@V@@@X@@@@@@@@@@@&@^@p@@2@@@@@F@@@@@@ @@v@$@@`@@@@P@@N@"@6@(@6@J@@@H@R@L@R@,@N@P@@2@@@@@@@@@@@@@@(@T@@@@x@$@0@@@@@@@@@@@@@@@\@@@@@0@z@@$@@@@ @@@@@@@@@~@@@@$@v@@@@@@@@<@*@d@@@@R@@@@@@@B@@^@@@B@@P@@@@@d@@@.@@@@@@n@T@@@R@0@:@^@@j@H@J@D@@@n@`@h@n@z@n@@@Z@z@,@@*@@@@@@@@@ @@@Z@|@@@@@2@j@@X@Z@p@@@@@@h@@@@@.@@@"@@@F@Z@*@V@@@@*@"@@@@F@@z@v@D@4@r@@@@@D@@@~@@6@&@n@:@@0@t@@@@@d@@v@@.@@~@@@@@@@@@@@@@@@@p@@@@@v@2@@|@@6@@^@r@6@J@p@x@\@@@`@^@j@p@@@.@6@ @@@@@@@@@@@.@j@@@@b@@@l@`@V@x@@@@@|@t@@B@@J@@@@@@h@8@@@p@@J@,@@@V@@@@z@@@@R@@`@@0@@@v@.@<@@@h@@f@^@@@\@@\@@@@@p@@\@"@@@r@z@x@v@@4@@>@@@@z@6@@@@@@@@@@@@@@@,@L@l@J@r@^@@@~@@n@6@T@@@@@@@@@@@Z@8@^@x@z@@@@@@@@6@@@@@@@@@F@6@@P@~@r@@@@@@l@@@@P@@d@@@@4@^@F@@N@@@@(@>@l@`@L@@8@Z@V@(@ @@@|@p@@@@@8@ @@@@@@@p@P@@@@@@@@d@@@J@@e@ @@@P@@@.@@<@@@D@@@v@@@@@@@@@@@r@:@.@>@@@@@@ @@>@N@h@@@@Z@T@h@Z@6@@f@@@#@@@@Q@@f@@@@j@@@l@l@|@r@t@@@@@"@@2@@d@|@r@@ @@@@@@@h@J@`@@b@f@@@@@@@n@F@@@@v@@@@"@H@R@@@V@,@t@8@@@$@J@@j@@@@@T@s@@@6@@@@|@@^@@@@@@@@@@0@@@@@@@^@h@^@R@,@ @@@@F@D@6@@@@@z@@@d@@:@V@\@@K@S@F@P@R@@@@@@@@@@@8@@@@@@@@@.@@(@t@~@N@@@@z@v@@@@@@@x@@@@:@t@>@@@@@@f@f@f@d@@@@P@*@@2@@@@o@h@@S@@@@@@5@@@z@@@@4@@@@@@\@ @@@@@@@@@@@`@^@p@d@f@(@@ @@X@J@@@@@@@@@@@@@h@@v@@A@2@@@@.@2@@@@@@@@@2@ @F@@0@@@@@>@*@0@@&@@8@N@@@@@@@@v@@@@@@j@@@P@@@n@@@J@x@@@@j@@F@@"@@N@J@E@ @(@@@'@@@]@`@z@r@P@@@r@@&@@,@$@,@@t@@@`@@@@@@@@@@@|@b@D@(@:@@p@h@@@@@P@F@t@v@@@@@R@@N@`@@@@@V@@@@@^@@v@@:@@@Z@4@@@l@@v@@@ @@@@P@@@@@@@@`@t@@@@@,@@H@ @@@F@n@`@v@@<@^@R@@@@@&@<@@@D@8@@@@@@U@@@@N@~@@@@@@N@@@@@@@@@@@ @@@@@@\@ @@@@f@R@ @4@@:@@@x@@@@L@@@ @@@@@;@@x@@@~@[@@0@<@\@@@@0@P@0@@@j@@@@@@z@ @@T@T@b@@@h@j@v@t@n@L@~@F@X@@@*@@@&@@@ @@@@@@,@@@@$@@@@@@z@@@B@@@@@Z@Q@/@@d@@@@@@$@@J@N@6@@@F@8@<@@@L@@@@@@@@@@@@x@j@>@R@8@@@@V@z@@z@@@h@@F@@@\@@$@:@0@@@k@@@@<@`@@>@^@@@@8@@@@<@@@ @@J@@t@@@@.@p@n@h@8@h@n@|@T@@@@|@H@0@@F@@@@@@`@N@@@@H@@b@@@@l@@\@p@ @A@@@7@ @X@S@@@@J@@@@L@@@@@@^@L@@2@@@L@@@ @@@@2@@@@@@X@X@H@@@@@"@@.@D@J@ @0@,@v@N@@@1@@4@@d@@@@P@@l@@@@@.@0@>@@@@@V@@@@N@@@@X@l@f@@@4@@f@b@@@X@d@@@@.@@@f@F@@l@@@ @@F@@@:@x@@.@@@@6@@r@ @h@@F@@@7@@@@@@@@@@@@@2@~@0@@(@@@@@ @@@@@@ @@@@@@J@<@>@@@@@L@N@@@@@P@x@@@C@3@@e@[@@@(@@@@@z@D@J@@@@V@@@@@6@T@v@p@@~@T@Z@@@@@R@`@@@@@@@@@@@@@ @t@8@@@@@p@x@2@2@@@@R@(@@@@@ @~@@@@2@]@@@#@@ @u@<@@@@$@4@@@@@D@@@@r@@@R@@@ @4@,@@@@$@@@@@@V@@@"@@ @@j@@@@@@p@@@ @ @@@C@@,@@P@@@@.@j@N@@@d@V@B@@@@@@@X@p@@n@z@Z@@@@@@N@^@t@@@@X@H@r@@@@@@ @@@@@,@2@H@@@@d@B@@@@@@@H@@b@b@i@@@s@@K@@f@4@V@@5@@ @@@@@@@@@@@@ @V@@@l@d@l@r@2@^@t@"@,@@@@f@~@0@@@@0@J@,@n@p@x@@@G@@?@-@p@L@@Z@b@@@q@@@@@N@@@@@x@l@@@@Z@@@N@L@&@6@@@@f@H@4@@j@@v@@(@@@@@4@2@@4@@@r@`@@D@L@@@@d@ @8@$@@@@@@@@0@,@\@@j@@0@@l@&@R@@:@d@@@@p@@@@l@@@@@@r@h@(@ @@@2@0@@@@@l@f@V@<@@@@@@@@@@@@<@@@@@@@@@@!@@N@@$@@h@n@<@@@v@@L@@B@"@H@P@Z@p@4@h@B@@@@P@8@2@@@@@T@@2@,@ @J@4@@D@<@@@R@@:@^@@@@@>@:@@0@@@@@@@@V@M@F@@@V@t@p@R@@t@@p@@B@l@8@@@J@p@@@@@@@x@|@\@Z@@z@N@"@@@@@h@@@:@@$@@@@@@@@@@@@4@@V@&@@@H@@-@z@@@j@@@@@@@V@@`@@@6@f@6@h@@N@@@|@v@@@0@@@@0@t@@@@.@X@@@@,@@@@@@@@d@@@n@L@F@@>@@L@@@@@@P@@@Z@@@@f@6@@B@@@X@@@@@@:@@@2@@@@ @@@@@n@b@@@>@@@@@@X@d@*@@@@@@@@@@@@@@\@@@@@@@@T@ @@@ @@F@V@@@>@2@@@@F@@@@@@@@@D@<@@4@f@B@L@@@h@@@@@@@&@@f@@@@@P@ @@@@@@@j@^@Z@@8@@&@@@@@@@@@@6@@@@@@@@@@L@@@z@@@@@@@@@@@|@6@@N@ @@@@@j@X@L@@@x@@J@*@@R@@@t@@3@@]@D@@@@@@Z@@@P@@t@ @f@@r@.@@f@&@D@4@@@8@>@|@R@@@@L@6@&@@@@@r@~@@R@@@@x@V@L@@|@@@@@>@@`@@@f@8@@@,@N@@@@:@T@,@@@@@B@f@b@@@@@\@@@B@ @@@@<@@0@-@@j@@F@@@@@@r@@@2@(@@@@d@@^@"@4@4@@ @@N@H@p@@@@@@@n@@@@@4@@:@ @@@!@b@L@@@@@V@@L@8@@v@@@@@f@f@@@@<@@@@@@@@@@@@N@*@@@@@@J@\@@@@@@&@"@@@P@@@@@@@@@(@^@"@.@"@@@@@@@@@@@p@,@@@$@@\@@~@@J@<@ @@@@@@>@@@@@r@d@@H@Z@@@2@ @@Z@*@v@v@B@@W@m@@@6@@@*@o@K@4@#@@@@@<@2@@@@X@l@F@f@@@@:@@@4@2@"@D@@@@@@@l@@4@@@ @ @@r@@T@@@|@8@@@@ @@@@@N@@@@@,@@ @@@@@@@ @.@@@@@.@@@^@|@@@@@J@`@@J@+@J@\@(@.@R@@@ @@@@>@ @@@@@T@^@4@h@@0@@@@@;@d@@@@@@@@F@z@@^@t@@@@@@@t@@@@@<@n@@@@@*@@@V@@.@@r@b@@h@>@@@:@@@8@@"@^@@@@V@@@@L@@P@@@,@@@/@,@@V@L@ @@Z@@@J@@@@0@L@@@|@2@@@@@@h@@h@V@@P@@@\@0@p@@@@@@p@@$@@2@@@@@2@@@|@@V@*@@@\@Z@@@@@@|@@X@i@ @h@(@@P@B@F@@J@@@@ @@"@f@H@@@4@@4@|@l@@F@h@@,@p@@@@@@h@$@b@"@8@B@ @@@@:@V@b@@@H@>@,@F@6@@B@@`@@@@\@@@@b@@@,@@@@:@@@@@`@@@2@@r@@2@z@@B@@<@9@@@@@@B@@@@*@@.@@p@<@0@@@@@@p@@R@@x@j@@Z@@9@v@@@@T@@@@ @@a@@@ @@@@@@+@@@.@@@`@@@@@@@B@R@@@@@@@ @ @@v@@@@@@@@j@>@v@@@f@t@@@d@@~@@@@@@X@~@@d@F@L@@@^@@z@@8@@h@@@@h@B@@@@@*@@@@@@Q@@h@@:@@@@@@h@@@@|@H@ @@@@@<@@@@@@@@n@P@ @[@Y@,@@@@(@@f@"@@@@i@4@@+@C@@@@d@@@n@@j@@@@@h@@@@,@@n@@@R@@H@@@t@@p@X@@T@@@@T@@@@@@@@@@@`@@6@l@T@L@@ @$@@@@@@@@@0@^@@@*@@@@@x@ @@H@d@@@@'@@@R@f@ @@l@r@j@@|@~@x@@@@@X@@@H@@@@@@@@@@@@@@@@N@4@@ @=@u@w@@@ @@@@@0@@@V@`@\@@H@&@@|@\@@@2@*@@T@R@p@@@p@J@@@$@@@`@@`@@@@@@.@B@@@@@@@@@ @@@@@@(@@@@@x@&@@@@@@@@L@@@@@ @@@,@<@B@h@z@@@j@@(@@@@<@@~@x@@@t@$@@@@v@@@@@2@@,@@D@@0@t@@@T@@@0@@@@$@@u@Q@d@a@d@@@@@@@ @@@p@@@~@@@*@@@@X@^@h@@@X@@X@B@@@h@v@@r@"@L@v@@@@F@@@@N@@v@@X@X@n@L@@D@@@@>@@@\@@@@@@4@@@:@0@@@@@@|@@@@@@2@@@@A@f@D@@V@4@@@n@@@V@@@@@@4@@@R@@@D@t@@^@l@@@R@V@@@(@\@@d@@@@@]@@@{@@K@U@l@@@:@D@"@f@@<@@@@@z@&@@@@@@@@@n@z@|@X@@@$@0@@@*@@@@@@F@@4@@@F@@b@@4@d@.@@@@@@.@@@*@x@N@v@8@@2@|@@@ @$@@@X@y@@%@@@@p@@6@p@@@@@@@p@0@@@@@t@x@@@l@@@@z@n@@2@@@@@@,@@@@X@@@@@@@@@@>@x@d@@@@@@N@@Z@@@@@@%@@N@,@@@@(@@P@@@@@ @6@@@@4@p@@8@@0@^@@r@@@@v@^@@@@n@@l@@@@\@@n@@@8@@L@x@x@@@@@@0@]@@@@@@@.@@@@V@@z@@@@L@@@@x@@4@@@"@@@`@,@@@D@*@*@2@X@@:@V@@@@}@@@@@@@@@@@J@@*@@ @X@"@@R@j@@N@@@@`@|@8@*@@@.@@,@@@P@@@@>@n@@Z@@d@@@@f@@@@T@@@@@@!@@4@X@@^@@v@,@@@@z@@F@4@@.@,@t@@Z@~@@@`@R@@@8@@@@T@`@$@@>@@@@2@@p@P@@@@@V@@@p@@^@2@@@@@@ @@@@@*@@h@@@@@ @@@z@(@@@@@P@L@@$@@x@0@@n@ @>@@@@B@{@@@f@@@@@@F@f@@r@>@@\@<@n@@@@&@@ @@l@Z@@@@e@@@@@e@@~@ @@@B@@@J@@"@@b@L@@t@R@@@@@@@M@@'@@@^@2@P@&@@@@@@@@&@8@@@@@j@@@@<@@@h@@@4@P@@@@0@2@@@@@@f@)@@@@,@@"@0@@@@@@@@@@x@@@@@X@>@Z@H@@@&@,@@@@~@@@@b@@8@>@(@J@@@@h@x@@@@@2@@#@@@k@@D@h@@"@@J@H@@@X@@r@b@d@@@@ @R@@@@X@)@@@@%@@"@ @@@@d@@@@@<@4@B@$@@@@@L@.@T@@@@R@H@@@@@@"@@@>@@@@@@@8@@@@v@@@@@@D@@@@@@T@@@z@@@@@$@@f@@p@@N@@>@@&@b@~@0@@D@"@j@@@@@z@@ @@@@@D@-@@a@@r@@@@@@@@@@@ @@n@,@@<@r@H@0@2@@@@@r@l@ @@V@@f@N@@@ @@@@b@\@0@(@8@@@@@@@l@T@@@@l@@<@@@@@@@@@@@@@@@n@l@p@@@@@@j@4@@@@@H@@@D@D@@@@@x@@@t@,@^@j@@.@>@.@l@8@:@ @.@@B@@@@@@@@@@@@@@x@@@@@@@@d@ @p@F@B@6@@@D@@@<@t@@@@,@8@@@@l@@@@(@@@@j@n@R@V@@@@@@r@t@X@4@\@:@@@@J@6@@(@@T@@`@8@|@#@h@ @h@@D@-@g@@J@@@@@@ @@@ @T@@@@@j@@T@@p@\@@v@~@x@@@@"@@(@n@@@@T@$@@,@@<@n@|@@@@@@*@B@X@@@r@\@%@j@@@D@@@b@@@@>@@>@@@@>@@@~@ @@@|@@@@@@@<@@@@@@@8@6@V@@@@@@@L@@@@@P@T@^@@@8@^@@T@@x@@@@0@~@@@Q@~@@"@@@@@@@@@@P@@>@@j@0@0@"@H@*@@T@P@6@@$@@@@B@@@v@@@@.@ @@@N@l@l@L@@@H@|@@@n@@@n@@Y@@-@8@@p@v@*@@,@"@T@f@>@@@@@@,@@@'@@6@@^@@l@*@x@ @@@@8@H@@j@|@z@"@&@@@@|@@@F@@@@@B@j@J@@@F@@ @.@@"@X@@&@@@,@@N@@@*@P@@z@b@X@(@N@4@F@@@\@v@@$@|@@&@p@@0@@@X@b@@@v@Z@L@ @@ @P@\@@@@@8@V@@t@.@*@@@@@@`@@@@@@@@x@&@B@@b@@@@@"@@6@\@@|@@@j@@@|@.@@h@|@6@@@@B@&@@j@2@J@@@@@@N@V@B@:@@@@X@d@@b@@@f@@@@^@@ @@@ @@@@@@@P@>@&@Z@@"@@*@@@@=@S@R@p@$@h@@n@@@@@4@j@>@@@J@8@@r@,@\@*@@H@N@8@,@<@$@>@@@@d@@l@~@@@@@@<@@t@4@@b@@@V@@.@x@@@@@l@P@\@@@@ @@@@h@@@@j@@|@@@~@@@@@ @@@@@@b@j@P@@@@@@"@<@@@f@f@^@n@@0@@@@@,@\@Z@@@P@z@J@@@D@@r@@^@N@@\@,@@@@@@@@@@d@<@@8@@T@@@@@b@*@@@@$@ @L@0@@@,@J@@@*@z@@ @@@`@@&@@@@4@@@x@ @@@@@@@@ @@n@@@@@8@@*@@@@d@@@(@@@@@6@0@,@ @@@@@>@Z@Z@F@@@@@@@^@|@j@L@X@R@<@p@@t@@@@X@@B@@@@h@*@p@Q@J@v@`@@|@j@@J@@@@@^@^@@@|@@@@0@@~@@@@.@l@@6@2@0@@@@@@(@j@ @$@@@n@@@@(@T@r@@L@@@P@@$@h@@@@@@@@@@@4@Z@@@z@@@Z@D@@@L@@@.@@@@@^@4@*@@@@@|@P@@X@$@@|@@@@@@@T@@8@@@R@@T@@^@@@v@@@@@ @@@ @u@@@@@@@@R@ @>@@@@@@@@@@@@f@@"@@F@@@@@@D@@@@@<@~@R@X@(@@*@p@&@(@@.@$@@b@"@@@@d@@@Z@|@B@@@v@&@@ @*@J@@4@@@@@Z@@@@b@@6@&@@@@N@@@4@D@@@@^@@@@@6@J@@@@@@ @B@*@6@\@8@>@@@D@@@@$@@t@@\@@@R@@@@@,@f@f@@N@@n@@@x@@@r@~@p@@@@2@@$@@B@p@@D@@H@f@@n@p@d@(@@Z@T@X@"@@@@b@,@@X@F@@(@P@B@6@L@@@@@L@@@.@@@@@@@@@@`@@@N@b@X@l@@T@L@@@6@|@<@@&@@@@@@@D@j@\@4@p@f@@@@@@f@@v@@@@@@@@$@@@@@@D@D@ @@Y@-@@@(@ @v@@*@@@V@@@@@@@f@@@@@F@@@@@@@@@@@@@Z@@@@@@@@@@@@@@D@@ @X@N@d@@@@@`@@Z@F@@V@@z@,@@@@@@r@@@@@ @@h@b@@F@@b@V@l@<@@@@@@x@@z@l@6@6@6@f@X@x@@@@@4@R@"@t@Z@$@p@@@@@@@@@@z@P@@@w@@@@@J@@@X@(@>@\@@@.@\@b@@@@B@@@@@@$@ @@@6@b@@@@r@V@@@r@@@@@Z@@@@@@\@^@@@@@@@@@*@@H@@@@@T@@D@@@@@@2@@@@@x@@f@B@@t@@L@Z@^@@@@@@@@@@t@l@b@R@4@R@@@@ @>@@@4@@,@T@@T@@@f@B@@@~@<@@@@@"@B@ @@@@@B@@@*@@z@@R@<@@@@n@,@@@@$@@@(@@"@@@@@@@@@r@@@@@@@F@@v@@@^@@@\@@@@@@@@@@@@d@B@@0@@&@R@ @@6@&@@@4@4@>@@b@@:@ @@@@@@@@@@@j@N@.@6@ @@b@@@@@@8@2@@b@b@4@d@@B@`@@J@@@@@@,@@@@@@@j@@t@J@@n@@@@@v@\@@J@@`@@@@@@@n@~@2@^@V@@@@@@h@>@@@@:@@@@@@.@@@@@l@,@6@@4@@6@.@@ @@4@<@V@@@@$@l@(@@j@@@@@@@^@B@6@@@T@ @.@@@@@@@@@@H@^@j@H@2@J@J@@@@@@@@@@@@@@(@@@D@@@ @@@@@@@ @@@@@@R@@ @@~@d@>@@,@2@@n@:@@@@@b@@@@@@@N@@@@@@@@@@ @@@@@^@x@@@r@"@V@X@2@@@@@@V@@ @6@@v@D@@^@*@@B@<@@d@@@@j@@@@~@@@@@@@@@@@z@@\@>@D@\@@"@ @`@@@@@@@@@.@@8@@@@@@@*@@@N@@@@J@@@@ @2@@@(@@@@@@@@@6@@@@@d@@"@B@p@@@@@@@@2@8@@V@@@d@T@@(@@@@@@@@@x@@l@\@@J@@@@L@x@@@@@6@l@@@D@@f@@@@n@@@@|@@F@@t@H@@@@@@@@@@@h@@D@:@&@0@H@0@@J@j@h@@^@@@@@@@6@@ @ @@@@(@@@`@"@@@@@(@@@@@@@@@@ @@@8@L@@@`@@@v@Z@@@@@x@@@@"@|@@@N@@@0@x@@@@\@0@l@@@@@@@H@@@@@@@Z@@@@@@@J@@@@@@@@@@@@@@@@@N@@@@@ @@@@@@@@@@@@@N@T@\@N@,@"@>@`@@@Z@`@@@@@@>@@@ @@@@@@z@~@@8@8@@d@*@\@<@ @@@@@@@@@@r@@@@@p@@F@@@|@@Z@@T@@@2@@@@`@P@@P@f@@@4@@P@@@@@@@@n@8@@@@ @*@@@@@(@@@@@@z@@z@^@@@0@*@@0@X@p@@8@@@@@@@@@@@@d@P@V@.@0@,@(@,@@@@@p@n@z@@@@@H@b@@V@p@@@L@@@@H@@@@@@ @ @@h@@D@,@N@@@@@@@$@@@@ @@@@t@@@@@@z@@@6@@^@ @b@@>@$@j@R@@@6@@,@@N@@@@@@|@@f@@@@@@T@@@@@@Z@@@@@@@@H@@@@@t@@Z@@@@@@@@@z@x@\@L@:@L@@"@"@@@@"@@:@V@P@|@@@@@>@`@<@J@8@@B@R@@~@R@0@$@@0@@@@@@@@@@@@n@J@@@0@~@t@@@@@@@@l@@@.@r@@@@@@@@@,@N@@@@D@@@X@|@@@@@@f@@$@"@@@@@8@<@0@h@,@@&@ @0@T@@@R@2@r@@l@@@ @@v@R@@@@@@r@@@@@p@h@h@J@$@P@8@@@@,@D@D@4@\@@@@@ @J@@l@F@@<@>@@@R@r@@@Z@$@,@@@@@@:@@@f@@@@4@B@2@8@6@@@@@@@p@b@@X@n@@@~@@^@@@0@@F@@B@@P@,@r@@@|@@p@d@@@n@l@f@x@@@@J@@@@@d@8@0@p@@0@@4@@@f@@@0@@l@\@@@@@@@|@t@f@J@F@N@J@.@(@@$@@@@@"@@4@T@b@@@@@,@ @@f@@,@l@@^@@n@h@j@8@@@z@@@@@@R@@T@ @@@z@@@@@@@D@d@@.@@@@V@@@@@@$@@@@@@V@@>@\@@&@@J@@,@0@@@@@@@`@@@@X@@ @@@(@@,@8@@@@2@@X@{@@4@:@@@^@`@*@@@@ @@@@@@Z@R@D@J@,@@.@(@@@@@ @,@(@N@\@b@@@@@@,@j@j@@@J@L@@f@<@@T@d@<@@@@@@H@t@b@@@@P@@@.@@d@&@@@@.@@v@f@@X@h@@@@h@@@@@@t@@@@@`@@@@@@@0@@n@~@@@"@@@@@@@@@2@t@@@d@@@@4@K@@@@0@@R@@@@@@z@@@@~@z@|@p@B@$@6@ @@@@@@@@@@@<@D@H@v@@@@@,@p@0@@@@@@@ @@@@@t@@v@4@^@@h@@@@@V@,@*@@$@L@4@:@P@t@@P@@x@Z@@(@@b@@@l@@F@@@@X@H@@N@@@@@@@@@@@@8@$@:@@2@@<@J@@@h@h@.@@@~@4@l@r@@2@t@@@@@@@@@@@t@@@t@X@t@\@B@ @@$@@@&@@@@@@@2@@`@r@p@@@@@@@H@@~@@@@:@|@@@t@@P@@@@@R@D@,@@h@@@@ @@B@@@@@@|@|@@@@B@@F@ @H@@@@@@@@@@@@@@t@@@T@@@@R@@@@@@8@@x@@@@@@@@@p@@@`@@@@@,@@@z@@@@@@@@@@z@@Z@j@X@f@R@B@ @@@@@@@@@@F@P@<@0@v@@h@@@:@@v@L@<@ @@0@@H@@F@^@@@@@p@f@T@@@@@@@@@@@^@@@@@T@@ @@h@@r@@j@*@v@@@@F@@@(@J@@@@@@6@@@@@@@H@P@@z@@@F@b@|@P@@:@>@N@b@x@l@@@@\@@~@8@R@.@@@@@@@@n@f@@j@f@J@H@B@.@@ @*@@@@@@@@@ @\@&@@@n@@v@@@@@\@f@n@T@B@@@f@@@J@@0@@L@8@2@@@@ @@@|@@@@@D@@@@@@@@X@@@@@r@@V@@@@@@B@V@@x@n@2@@@@p@@b@L@@@@*@@@ @@@@@@@@@|@,@@@@@X@@ @d@@0@X@@@@@@@@@h@H@x@@Z@<@0@&@,@@@@@@@@@ @@@@@ @&@D@V@Z@z@@@@@@F@6@@:@B@$@@@p@@@B@@~@@r@@@\@4@@@@@j@@@@n@v@@^@@B@j@J@v@@@"@>@b@&@@@f@j@@@@@*@@@@@@@@N@@F@z@d@@|@`@@0@@2@@@@@n@@@@6@@4@@@@&@@@.@@@@@@@@@\@@t@h@r@&@\@(@.@@8@ @@@@@@@@@@@@$@\@4@N@z@@@@@@@@@P@t@@@@D@@@@x@P@@@@\@ @H@@r@@@@@@N@2@0@@@@6@@T@t@n@@L@@@@@|@@"@@x@@@f@R@:@4@@@@b@j@@@:@\@@@@@@@@@@@`@@b@@@@@f@N@@@@@@@@r@@^@r@@:@H@J@@@@ @"@@@@@@@@@@@@@@@@@@B@8@F@d@@t@@@@@@ @v@@@@@@@~@@@d@B@@@H@@(@@F@@@@r@p@@Z@@@@@X@Z@.@~@b@@@@ @@@@@@:@@~@4@6@&@@@@@U@@@j@@@@@8@ @@*@@@j@j@@x@@@@@@\@n@Z@"@@@@@@@@@b@r@@@R@J@D@@B@@@2@ @2@@@@@@@@@@@@@@@@@@*@(@@@>@X@|@@@@ @@T@@@2@V@J@@@@T@@Z@d@@@T@t@~@@@<@@&@@@@4@j@@@D@@@n@L@@@@z@@@R@X@,@@@@@@@@@@0@P@@@@^@$@@|@X@@@@@@@ @h@2@h@@~@@@@@@@@@@@@|@@r@`@X@4@T@8@:@2@B@&@@@@@@@@@@@@@@@@@ @@@@@4@$@L@V@@@@@^@.@D@R@@@@4@@@@f@R@@@@4@0@@@@@r@ @N@@j@d@@x@@@b@@@@@@:@r@4@X@@@p@@ @:@@@@@@@@@@x@@@8@@(@@@h@h@@@)@@@>@@\@b@2@$@@@@@@@~@x@@t@F@0@:@D@"@<@@@6@@@@@@@$@@@@@@@@@@@@@@@@@@*@"@"@.@b@b@@@@@@@@@@@f@8@*@@H@@@@z@@@@@@d@@b@b@>@@@H@l@@L@B@@$@H@@@@@@@@j@>@(@@@@@@@@@@@@"@X@@b@@@2@@v@@,@ @@@2@@@~@H@,@@@@@@@@~@@t@Z@x@l@V@2@@@t@F@*@,@.@@@@$@@@@@@@@@@@@@@@@@@@@@@4@d@D@@@@@@@@@@@@(@@@4@@@@p@n@p@@v@@&@@@@@@`@p@@@@@ @@@d@@j@@@`@<@@@@h@@\@@,@@@@@@@@n@L@@X@@@@@l@@@@@r@|@(@@@@@@@@@j@v@\@N@`@<@`@V@@(@ @@@@ @@@@@@@@@@@@@@@@@@@@@@@@@D@ @.@x@Z@|@@@@@@@@@@@@@D@@@@z@4@f@b@@:@@@ @@@@@@n@~@l@x@@@@@@f@@ @H@@@@@J@@@@@,@@:@@ @@@H@@:@j@@@@\@4@@^@@@0@L@2@@@@@@@@@t@d@r@^@B@D@D@<@@:@6@4@(@@ @@@@@@@@@@@@@@@@@@@@@@@@@8@@F@&@.@z@L@@t@@@@z@@l@@h@x@^@@@#@@"@@@@R@@@@H@@@j@X@T@V@N@L@@ @@@@@@@@(@@D@@@@@@6@@@D@R@@@@ @*@@@@@@@@@@>@D@@@@@@@@l@x@@|@l@f@\@R@(@>@J@6@(@(@@@$@ @@@"@@@@@@@@@@@@@@@@@@@@@@@@ @ @@@@@f@b@@v@n@@h@@@@@@@@&@@x@R@@@@R@^@@x@@@@@@@t@B@@@4@T@@@B@@@@@,@@@@@@@@"@@@@@6@V@ @@'@ @Z@@0@@@@@^@"@@@@@@@@@t@v@H@\@8@X@8@<@@0@ @2@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@@@>@@^@`@l@X@^@@x@@@@@@@@P@@@@@@e@@@ @@2@ @@@@v@@@@r@l@@@P@@"@@@@@@@*@@@@@v@@@D@@@@@@:@t@.@@@@f@d@@@@@@@@@@@@p@V@@b@F@P@N@H@&@@*@ @@@@@@@@@@@@@@@@@@@@~@@@@@@@@@@@@@@@@@@0@4@<@D@H@\@H@h@@@@@@@@@@@@x@@@@Y@ @@x@"@@@@@@@@@@@P@8@@@@@@@@@@@@x@@@@H@$@@@@@@@@&@$@6@@@@@@@@@@@r@D@r@N@T@n@>@P@@H@8@@*@ @@@ @@@ @@@@@@@z@@@@@@x@@@@@@@@@@@@@@@@ @ @@@L@R@8@6@N@J@V@@r@@@@@$@V@@R@@@@@@@@@@,@@n@@@@D@@@@@T@@@@@@B@@@@@@J@@@J@p@,@@@@8@:@@@@@`@d@@@@@@@@@z@^@@b@R@^@f@B@,@,@,@ @@@@@@@@@@@@@@@@@p@|@@v@@@@@@@@@@@@@@@@@@@@@"@@ @(@ @6@B@4@x@~@n@z@@@@~@@l@@@@:@D@@*@@@B@@ @P@@H@@@@@@*@@@@@<@@@@@@@@@@@@@@:@8@@@@@@@t@<@R@@@@@@@@@@@l@@f@`@L@P@D@F@@0@,@ @@"@"@@ @@@@@@@@@@@@|@|@@@@@@@@@@@@@@@@@@@@@@@@@"@@@(@@L@b@B@@@@,@2@D@,@L@~@@l@f@<@@z@r@$@@@@@H@H@@@>@X@@4@@@~@&@r@+@x@@j@ @@@b@v@@@l@z@@@^@@@p@J@$@6@@@@@@z@t@f@@f@Z@^@X@J@L@@H@"@@&@@ @@@@@@@@@@@@@@@@@@@x@@@v@@@|@@@@@@@@@@@@@@@@@@@@ @@8@@R@D@<@@@@@@@@@X@@*@@@X@@@@@@@@@.@l@@@2@N@0@^@@9@J@+@7@@d@f@@@@*@@@@@d@@@@<@L@@@@@@@@@~@v@r@^@n@j@B@V@:@:@@@@,@2@8@@@@ @@@@@@@@@@@@@@@d@~@h@x@z@z@|@|@@z@@@@@@@@@@@@@@@@@@@@@@@4@.@F@L@L@`@@@@@@<@2@@*@@@@*@^@@@2@r@@@@@@@@V@@@@x@>@d@@~@j@@f@r@@@@@ @@@@`@@@@@@@@@@@@T@^@h@^@x@@@$@H@T@J@(@8@4@@0@@@@@ @@@ @@@@@@@@@@@~@j@f@n@~@v@@z@v@@@@@@@@@@@@@@@@@@@@@@@@6@8@J@v@T@@@h@@@@@<@@@@N@@@"@@@L@<@@@@@@@ @@T@b@@@@@L@@@`@@@B@@@t@@@@`@$@@@@@@@@@p@z@P@D@<@H@L@<@"@0@ @@@ @ @@@@@@@@@@@@@@@@@@@@@n@d@d@@@|@v@x@@@@@@@@@@@@@@@@@@@@@@@@@0@@*@H@B@x@p@P@@@@@@@d@J@@x@@@@@@@\@@N@@:@@@&@@@@@@@@P@>@@@z@@@@@0@2@ @R@@@@@@@@@p@@\@L@.@.@(@B@@ @@4@@"@ @ @@@@@@@@@@@@@@@@@@@@@r@@j@~@l@t@t@z@@@@z@@@@@@@@@@@@@@@@@@@@@$@@@@0@@6@*@l@V@@@@@@@@@@b@@P@b@H@@~@@@\@P@@L@@@@@@@@@@8@j@@4@.@ @@@@@@@@@@~@t@V@@H@6@D@:@*@8@2@0@4@@@@@@&@@@@ @@@@@@@@@@@@@@@@@@x@n@`@t@r@p@x@~@|@z@@@@~@@@@@@@@@@@@@@@@@@@@@@@@ @@,@0@T@H@@R@@@@@@@8@@@@@B@B@:@@"@@@@@p@L@@r@@@F@Z@@@l@@@@@@@@@@@@N@~@v@n@^@N@0@f@,@ @8@0@ @(@@ @@@@@&@@@@ @@@@@@@@@@@@@@@@@r@~@n@|@v@x@@l@z@z@@@|@|@|@@@@@@@@@@@@@@@@@@@@@(@@:@@$@^@6@H@L@X@p@@l@@@@@@@@@:@@2@F@@@@@ @"@*@<@$@2@\@@@@@@ @@@@@@@@@t@@@\@@N@T@b@R@F@6@D@.@2@@"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@n@@n@t@@@f@j@@d@v@@@@@t@@@@@@@@@@@@@@@@@@@@@@@@@J@(@@R@6@Z@H@^@@h@n@@|@@@@@@@@@@@@@@@@@@@@@@@@@@b@j@t@X@Z@d@L@J@@@*@@@<@L@@@@@,@,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@p@x@f@f@x@t@n@\@@f@@x@@x@p@|@@@@@@@@@@@@@@@@@@@@@@@@@ @$@"@@@@H@>@n@f@H@~@r@L@@N@@f@l@@h@d@@v@@@j@@@@@v@@@v@@|@j@~@X@6@8@J@.@6@J@B@(@*@F@"@@@ @@@$@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@b@\@\@V@T@d@Z@p@l@x@d@@r@n@n@x@@x@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<@"@P@<@8@b@L@T@@~@@x@j@@:@@v@l@@X@n@l@r@x@@r@~@Z@l@l@h@V@L@2@P@4@@@2@4@$@@$@@0@<@@@@"@@@@ @@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@f@f@T@^@j@h@h@~@l@h@f@v@z@x@z@~@@b@@@@x@@@@@@@@@@@@@@@@@@@@@@@@@B@@^@F@2@@@Z@6@|@J@R@R@d@t@L@N@P@X@r@h@r@|@^@x@@p@p@:@B@@@b@J@R@<@*@"@.@2@@*@ @@@6@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@j@v@d@h@j@p@\@d@p@d@^@l@r@t@v@t@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0@@@&@,@`@@8@(@>@`@B@6@z@0@6@D@@b@@@@x@T@Z@j@>@f@R@*@H@N@<@:@8@@@@ @@"@@@@&@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@b@^@H@d@Z@b@f@^@b@l@n@^@|@x@@r@@x@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"@@$@&@@(@@@2@&@<@@@*@@(@<@0@6@<@@4@@@ @@@ @@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@\@d@^@f@h@v@Z@j@|@f@n@d@l@@n@@n@t@p@@r@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"@@@:@@@0@@@@ @>@ @6@*@ @4@6@@ @@ @@@4@@@@@ @@@@@ @@@@@@@"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@n@f@T@d@`@f@P@l@b@f@j@v@|@l@|@b@@t@@z@@@@@@~@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@*@@2@"@@"@@.@.@@,@&@"@H@0@$@*@@8@4@ @,@ @0@"@@@*@@@ @@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@R@b@Z@X@\@h@d@`@`@n@v@l@p@n@~@r@@n@n@@r@@v@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @.@@@@@2@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@H@@@@@@@@@@@@@@sunpy-0.8.3/sunpy/data/test/EIT/efz20040301.080010_s.fits0000644000175000001440000042350013203275053021113 0ustar nabil00000000000000SIMPLE = T / conforms to FITS standard BITPIX = -64 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 128 NAXIS2 = 128 DATE = '2004-03-01' / Date of file creation TIME-OBS= '08:00:10' / DATE-OBS= '2004-03-01T08:00:10.622' / UTC at spacecraft ORIGIN = 'Rocket Science' / Rocket Science = NASA GSFC DATASRC = 'LZ file ' / TELESCOP= 'SOHO' / INSTRUME= 'EIT' / OBJECT = 'full FOV' / BUNIT = 'counts / pixel ' / WAVELNTH= 195 / 171 = Fe IX/X, 195 = Fe XII, / 284 = Fe XV, 304 = He II FILTER = 'Al +1 ' / DATE_OBS= '2004-03-01T08:00:10.622Z' / SCI_OBJ = 'CME WATCH 195 ' / OBS_PROG= '195_10S_AL_1.000 ' / CMP_NO = 1 / Unique campaign instance (1 = synoptic) EXPTIME = 12.597 / s (total commanded + shutter close) EXPMODE = 'backside ' / FILENAME= 'efz20040301.080010' / CFTEMP = -66.71 / CCD cold finger temperature (C) CCDTEMP = 7.34 / CCD temperature (DN/100) CTYPE1 = 'Solar-X ' / CTYPE2 = 'Solar-Y ' / CRPIX1 = 64.5 / Sun center x, EIT pixels CRPIX2 = 64.5 / Sun center y, EIT pixels CRVAL1 = 0.00 / CRVAL2 = 0.00 / CDELT1 = 2.63 / Pixel scale x (arc sec, fixed) CDELT2 = 2.63 / Pixel scale y (arc sec, fixed) SOLAR_R = 372.27 / Solar photospheric radius, EIT pixels SOLAR_B0= -7.22 / Degrees SC_X0 = 0.00 / s/c yaw (arc sec) SC_Y0 = 0.00 / s/c pitch (arc sec; -109.14 after 1996/04/16) SC_ROLL = 180.00 / s/c roll (deg., Solar north + CCW from nominal)HEC_X = -139130208.00 / s/c heliocentric ecliptic x (km) HEC_Y = 46576272.00 / s/c heliocentric ecliptic y (km) HEC_Z = -94896.31 / s/c heliocentric ecliptic z (km) CAR_ROT = 2013.00 / Carrington rotation at earth COMMENT CORRECTED DATE_OBS = '2004-03-01T07:58:25.547Z' COMMENT COMMANDED EXPOSURE TIME = 10.000 s COMMENT SHUTTER CLOSE TIME = 2.597 s COMMENT LINE_SYNC = 'no' COMMENT CAMERA_ERR = 'no' COMMENT IMAGE_OF_SEQ = 0 COMMENT READOUT PORT = 'B' COMMENT NUM_LEB_PROC = 3 COMMENT LEB_PROC = 26 (no ROI) COMMENT LEB_PROC = 27 (no occ mask) COMMENT LEB_PROC = 12 (Rice) COMMENT BLOCKS_HORZ = 32 COMMENT BLOCKS_VERT = 32 COMMENT P1_X = 1 COMMENT P2_X = 1024 COMMENT P1_Y = 20 COMMENT P2_Y = 1043 COMMENT N_MISSING_BLOCKS = 0 HISTORY Version 4.0, 2001 December 10 HISTORY Image linear resampled to (128,128) for SunPy END @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@v@@z@~@@x@v@Z@l@r@l@h@\@`@b@`@\@h@V@`@^@Z@`@Z@V@X@X@T@X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@ @@ @@@@@@@@$@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@z@|@@t@@n@\@t@v@p@v@b@b@l@X@l@\@R@V@P@P@Z@\@V@P@V@T@R@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@~@@r@@v@x@|@v@x@t@h@h@\@t@p@l@P@`@h@`@X@Z@`@`@h@V@L@T@R@V@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@$@@@@@@@@(@@H@6@8@B@@@@ @,@@"@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@x@v@z@b@t@z@@j@p@d@l@d@X@b@`@T@`@V@`@T@N@P@J@N@D@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&@@@@@(@@@ @@@@ @4@@ @(@ @6@@@F@B@*@X@L@P@B@ @L@2@"@2@@@(@H@2@0@@@ @$@@@@@@@@@@@@@@@@@@@@@@@@@|@t@t@x@b@@|@n@j@^@r@`@X@b@f@T@n@f@V@\@R@N@R@N@L@P@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@&@@0@"@@>@0@J@@@ @8@6@T@n@^@r@f@*@P@B@F@H@R@0@4@,@(@>@@.@@@@@@@@@@@@@@@@@@@@@@@@@@x@@@@l@h@z@~@h@b@p@h@V@p@h@b@l@X@`@V@L@^@P@V@V@F@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@ @@@@,@,@2@,@*@J@V@$@J@X@<@P@p@p@@@@@n@@@d@t@8@V@@`@p@L@V@X@@@@@.@(@.@ @@@@@ @ @@@@@@@@@@@@@@@x@@v@@x@@z@@@f@f@`@n@z@n@Z@h@R@Z@N@V@T@^@V@V@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@8@@@@:@8@@@6@$@L@4@B@X@<@T@n@@@@@@@@~@f@@t@l@@z@@X@d@h@f@\@p@B@@@ @@2@@@&@,@@@@@@@@@@@@@@@@z@@x@x@@|@x@x@t@v@j@\@h@b@~@\@P@X@d@Z@R@P@N@X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@(@@*@ @&@>@H@R@X@V@p@d@>@@T@~@n@L@@@@@@@@&@@@@@@@@@@@@v@f@|@d@r@Z@H@@T@4@<@0@Z@@@@@@@@@@@@@@@@@@@@l@@v@@@t@|@|@Z@n@^@j@`@V@Z@f@X@V@j@H@^@J@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L@0@>@@.@l@.@P@p@0@n@v@P@r@f@@@~@@@@@@@v@^@@z@@"@@@@@@@@@@@@@@@@@D@d@\@v@h@t@H@@@@@@@@@@@@@@@@@@@@@@@x@@~@x@t@p@f@V@h@v@\@\@V@^@X@b@V@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"@@@@@:@4@B@2@2@4@\@J@p@z@p@@@@@@@@@@@@j@@@@f@d@4@@N@@2@l@.@J@@@@@@@@@v@@@@p@p@<@"@ @@@@@@@@@@@@@@@@r@@@@@r@n@p@|@p@f@p@h@d@b@b@T@^@`@X@F@Z@@@@@@@@@@@@@@@@@@@@@@@@@@@@@V@@ @D@@>@6@B@X@>@\@@n@@|@@@@@@@@@@@@@ @@0@D@x@@&@@@@@@@@@@,@@@0@:@@`@@R@@@@ @@@@l@|@F@D@ @@@@@@@@@@@@@@@@@@@@@t@@n@j@p@X@l@\@r@T@R@T@T@`@f@^@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@ @@@@@P@(@(@J@T@t@b@p@@@@@@@@@@@@8@@@@v@@v@@@@@v@d@@@H@$@"@"@@L@,@ @@@"@@p@@8@\@.@^@N@@@@@@p@6@F@@@@@@@@@@@@@@@@@@@@@@f@x@|@f@|@n@d@f@Z@Z@`@\@H@h@@@@@@@@@@@@@@@@@@@@@@@@@@@@@4@$@@2@:@P@H@R@@^@j@@@@@@(@@@@@^@l@H@j@@@@@@@ @T@@@f@f@@@@:@@@@@@r@p@@@@@@@@@l@8@@@@@@l@8@,@@@@@@@@@@@@@@@@@@@x@v@p@z@v@p@z@j@n@`@X@^@`@^@d@R@@@@@@@@@@@@@ @@ @ @@@@@0@@.@.@@@6@F@d@F@R@L@`@@@`@@@@@@*@@^@@~@H@r@@@@@<@@.@$@"@n@@@N@@ @E@D@@@@F@@:@$@@@@n@4@@@@@@@@@@P@L@P@b@@@v@v@.@4@@@@@@@@@@@@@@@@@@@z@|@@~@r@|@v@p@f@r@T@f@X@h@@@@@@@@@@@@@@@@@@@@@"@ @@@@:@@@H@@R@h@`@~@b@@@n@@@@R@:@@@@@z@@,@,@@@@@N@X@@@@@@@:@S@@@@@@@P@V@@@.@@@>@@@4@@@4@@f@@@@@R@@@@@J@@@4@ @@@@@@@@@@@@@@@@~@@p@@@t@x@p@x@l@n@f@d@d@Z@@@@@@@@@@@@@@@@ @@@@@F@ @ @6@@:@4@B@@F@@@@@@@@T@8@F@4@~@@@L@@@h@@6@@@@@|@@@N@@@@@U@@B@@.@@~@@@:@B@.@@V@^@`@@r@@@@H@@@<@@2@@P@@@@@@L@*@@@@@@@@@@@@@@@@@|@@|@z@h@r@d@p@p@b@l@l@`@`@@@@@@@@@@@@@@@ @@@@@"@@(@(@<@N@P@P@H@@p@@@@&@@@d@@~@@@j@@0@@@6@ @@h@t@@(@@@@*@X@R@h@z@@@@Z@@&@@@@ @@@@@@/@@@>@@@@@@f@@@P@@@@@l@h@ @@@@R@4@@4@@@@@@@@@@@@@@@v@v@@@l@@~@j@l@n@f@h@@@@@@@@@@@@@@ @@(@@:@ @@B@6@:@.@(@x@f@N@@x@@@@6@:@L@@@@@@x@x@@@@@(@@ @*@r@@@$@"@,@6@@@@b@J@@ @>@T@@@@@@@@@5@B@@@j@@I@@8@@,@@h@@2@@@@@*@@@@h@`@8@$@@@@@@@@@@@@@@@z@x@@v@@t@t@f@l@^@j@f@@@@"@@@@ @ @&@$@@:@ @*@L@,@P@F@6@f@V@~@@x@@@@@@@0@<@@@@l@@h@@@2@>@R@H@>@0@"@4@@@L@@@@@D@l@r@@@@@@X@>@@@8@@0@J@@@@@F@@@@@P@@@@#@b@@>@@@4@8@@~@b@@@@@n@Z@@B@@@@@@@@@@@@@@@@@@@x@f@n@x@l@h@@@@@@@@@@@@ @@@J@J@@P@L@>@t@L@t@@@@@@(@@(@`@d@@@@v@:@@J@:@6@@@@p@@r@,@@@@@@v@@@@@@P@D@n@@@@ @@@@@@j@@@@@X@@@i@1@@#@J@@L@K@"@ @@@@B@@@@ @@@@f@\@:@2@@@@@@@@@@@@@@@@@@~@v@@v@f@j@ @@@@@@@ @ @@@*@8@@8@D@6@d@d@T@@@@@@@@@6@@@ @ @@@@@v@@@@0@N@@p@@@@@T@@@@*@ @@n@"@F@N@@h@b@@@@@h@l@D@@@@8@@@@ @@p@*@h@@Z@8@@R@^@@0@@@@@@$@@P@@@@@t@X@B@@@@@@@@@@@@@@@@@@~@@t@~@h@l@,@2@,@@@@8@8@&@^@<@$@n@0@^@b@X@@@@@@@@@V@^@J@@@V@@@V@l@@@@@@@@@<@^@B@2@ @@@@L@V@p@f@~@@f@@J@|@@&@*@@@@@Z@r@@@@@f@@b@@(@R@@~@B@@ @@@:@@@@@@N@D@@@<@@@H@0@@@@l@0@ @@ @@@@@@@@@@@@@@@z@|@~@@|@@@ @@@@@"@>@@:@6@T@*@D@T@Z@l@t@j@@@@@@@@`@@B@"@@@@@@@l@6@d@<@@@*@Z@@@@@@@@@@@@X@|@h@@@@@@@(@@X@@F@@@@j@@@D@@|@@j@@@@v@:@<@t@@@@@@D@,@@@@@@f@@@@@`@@@@@@@@@@@@@@@@@@@r@@@t@z@x@<@@8@@D@@6@f@>@d@F@`@F@n@n@h@t@@@@@@@V@h@@@@@@2@@@@@@@@@T@@t@`@@@:@@j@@<@@p@@@@@ @~@@ @@@@z@~@@b@T@@@@@X@`@@@@@<@@@@$@.@(@,@T@"@@@@d@J@D@@B@@`@@@~@@@@@V@*@@@@@@@@@@@@@@@@@x@z@r@d@~@@"@"@@4@@4@0@H@f@R@P@f@>@v@@@@@@@@P@@~@@@f@@@@@@@(@@@@@@J@@@h@@@@`@@@H@@l@@ @@V@@@@v@@@r@@h@@@@|@@@@@@@@@b@~@@@@v@@@@`@@@@h@V@@@@@@@@@@V@8@@@p@Z@@@J@ @ @@@@@@@@@@@@@|@r@p@@@,@,@@0@ @R@F@2@^@H@0@f@L@z@@~@@@@ @@h@@@@@`@@,@`@2@@|@@"@$@@v@:@l@6@Z@@@@2@,@\@@@@@@@@@@@D@D@@@~@@@@@@@@p@:@@@@@@@$@@@@@@0@N@@J@@@@<@@@@@@@@6@Z@@r@@@@x@f@2@>@@@@@@@@@@@@@@@@z@|@|@P@X@X@\@Z@D@p@@l@@|@@@@@@@*@@D@@^@@@@@@@N@j@j@d@P@@z@@@@l@@@8@@@@b@@@:@4@:@@@@@<@@b@@@@z@@@ @&@@I@F@@@@@~@@@@N@R@J@@@@@>@ @@@@@J@@v@ @@@@N@@@@X@@l@$@@@@b@V@@8@@@@@@@@@@@@@@@~@~@(@F@@@>@6@X@X@v@V@p@x@x@@p@@@@@@@@L@@@@B@@@@@@@n@@^@n@@z@|@~@,@@@@@@V@@@@@@|@p@0@ @@~@~@@@N@p@@@@@p@@@@@@`@@@@r@@\@2@0@@@@@N@@@@$@@@@@@@R@@@@n@@@L@@@@x@j@.@.@@.@ @@@@@@@@@@@@~@@@H@J@>@Z@8@h@@@@@@@@@@@@@@N@|@@@@ @@@@h@V@@@@T@f@@@@T@~@d@@@ @@@^@@@@*@@@n@@@@:@H@@@@@@@@@@@@H@@@$@@@|@@@@@@@L@@@ @@@@@L@`@Z@@~@f@@@|@2@@<@@*@@@@@@<@@@.@"@8@@@@@@@@@@@@|@@r@@r@@@@@@@@@@@@ @,@0@@@@@"@n@@@f@X@>@r@@@@:@J@6@t@l@@@@@@@j@@@@@@L@@@ @`@b@@@$@\@@@Z@@@@"@@@@X@@@@@@@@@@@@"@@@@d@@@ @@@^@X@@@@@l@6@j@@@6@N@@@X@*@@@@@@d@l@F@(@@ @@@@@@@@@@@F@\@<@b@j@X@v@@@@@@ @(@2@V@@@D@@@D@8@|@@(@@|@N@p@N@D@t@@@@@@@@@@V@@@@f@@@6@@r@0@@@@2@@`@@@@p@@@@2@L@@D@@n@@p@0@x@Z@@l@@@&@@@@h@V@@@F@@>@X@(@ @@@@@@@ @@@"@R@@@V@@@@@@\@R@d@8@@@@@@@@@@@@@@@@@h@@@@@@ @@@b@@@@@@H@r@@@(@~@@@b@@"@@@@H@@@j@@@@@@@@@@@:@@f@.@z@ @@L@@ @R@@ @.@@f@@@@@@@L@f@"@@@@@B@&@P@L@@j@@p@^@@h@@@@~@Z@`@@@j@h@D@@@@@`@@@@z@H@@@@@@@^@N@@(@@@@@@@@@@@@n@@~@@z@@^@@@@@@@@@2@@@f@@@@@x@@\@@@B@T@.@@2@@@@@@@@@@@@@Z@@@@P@|@V@z@ @@ @T@@J@`@@@$@d@@*@^@@@$@@@@@@@@@V@"@@@4@@@@@,@R@@@@|@b@ @@@@@D@@@@b@@\@ @@X@@@@@@~@@r@H@P@,@*@(@@@@@@@@@f@@@@@@@@@(@4@r@@@2@T@ @0@t@@@@0@P@@B@@t@.@@@@ @>@@@@@r@b@@@@@@D@@@b@@d@@:@$@@@@J@@F@T@V@@@(@n@(@@~@t@V@@@`@R@@@@(@@J@r@<@L@@T@*@@2@`@@z@@@@@@@2@@F@@@@j@@N@@P@B@"@@@@@@n@J@"@P@@@@@@@@@@@@@@@@@@@~@`@@@@t@l@@@@@b@@@@@Z@~@@#@<@@j@@@@@J@@*@@@t@@4@j@.@@@@*@@@@@t@@@ @@h@@@f@P@@@^@@H@@j@t@(@~@&@b@@@@$@r@(@@T@@v@@D@Z@T@@@@f@L@d@@@,@`@r@@h@@.@@@@ @$@.@@@@@@p@J@`@@@>@@@@@@@@@@h@@@@@@P@@r@@@^@@@@@@@f@@@|@t@@@@@@@f@j@X@@d@8@&@@p@@@@@ @@8@@@@@@@@P@@@f@@@@@@X@f@B@@@"@<@@@B@L@@l@J@,@@@@@F@@^@d@@f@P@D@@V@(@@@R@@Z@@@<@f@@@L@@@|@(@@@4@0@@@@@@n@@b@F@0@@@@@@@@@@@@@ @ @P@@@@@x@@@8@d@@@@@J@@z@J@@6@r@@8@d@@@@j@&@@z@d@l@@@@@@@@@@@@v@L@>@@>@@@@@$@ @@@@0@@l@@@@@r@@@@@^@@@@@@@z@b@@@l@*@J@@ @@@@@>@@r@@^@H@4@@@h@T@@@@@@@@@v@b@N@J@"@@@@@@@@@@@@"@J@X@@8@F@V@d@@@@@@\@Z@@@@L@4@l@@@R@t@@x@@@@@"@@@@@@@@@@@@@@@>@ @0@V@0@@4@@@$@@@@@@L@~@V@L@@b@(@d@@J@~@@@@@"@6@@@*@l@@@@@@@@b@@@6@@d@l@h@@@@@ @@@@@\@@$@.@@@@@@@@@H@X@(@4@.@@@@@@@@@@@2@@6@@@@@@@@@@@@@B@&@@@@@@@@F@,@d@@@R@@@*@@j@@@@@@$@@@~@v@@@@l@@,@@@@@@@@@@^@@H@@R@0@D@0@@@@J@@@>@@8@@&@@J@"@@@@F@@@L@1@@@@@@@@@@@@@@@@@@@ @@@@@R@l@>@6@@@@@@@@@.@@:@x@@@~@@@@@@>@^@@>@&@r@@\@@L@@$@T@@@@|@ @4@ @@~@@@@@p@@@@@@@n@ @@\@n@@@@N@@h@@@@@@0@@Z@r@@@@F@@@@@D@@@T@@@T@@R@@@T@@>@@@@R@<@@6@@@d@@@@@N@@@@&@@2@@@@@@@@@@@@@j@X@D@8@@@@@@@@ @@L@@@@@b@@X@@|@ @@@@@@ @V@^@@@:@r@@@@@@@(@@t@@@@@@@@@z@r@v@:@8@@@@\@@@@@@@@@b@<@@@@@@@@@n@X@@H@"@@@@`@^@@f@n@@@|@Z@@\@@@X@@*@@ @@@@8@@J@v@.@@@@:@Z@@B@@@@@@@ @@@@@@d@>@.@.@@ @@@@@v@\@@@@@@@,@@@@@@@@@@@h@@@<@@6@p@@@6@@@|@>@t@~@@p@@~@l@.@0@@(@ @@`@`@@T@@@@@@@@@L@@8@j@@@@@@@@@@~@R@@8@n@@T@@@B@@@@@@l@z@V@@q@A@@j@ @@h@$@0@h@@@@,@F@v@>@@,@<@6@@@@@@~@V@:@@.@@@@@@@\@x@@@Z@@L@@@@@@@]@@@@s@@@@*@ @"@@8@R@@<@@0@@:@@>@P@(@H@8@p@x@@@@\@@@@@@$@@@@@@@@@@@@8@@@@4@@`@,@B@@.@F@@@@@r@@|@.@^@@@@J@@.@@X@q@8@~@l@@l@&@j@@@d@@b@@@@@J@^@@X@@:@*@ @@@@x@^@R@@@@@@@H@"@(@@@J@@8@f@@@@+@@2@@l@@*@@"@@@.@@@.@T@@@@@@@@@2@>@@@@@@@@@@@@$@@@@@@@@@@@@@@@&@0@@@@@@@J@T@@@~@@@d@@@@@:@@@r@@@@J@@@@@U@@`@@@4@@@@@@@L@<@@@~@@@@@@d@^@ @@@@@T@V@*@@@@@$@\@@@j@@$@@H@w@f@[@*@@Y@@@z@@@N@L@~@@@0@@@@@@@@$@@@@@@@@@@@@@x@<@@@@@@@@@@@@|@@ @@@(@@T@@B@6@8@@@f@*@@@@@>@~@j@@P@I@@d@@@@@@$@@@@@d@X@R@@@@@X@r@<@@@@@@@x@@R@0@>@@@z@>@6@@@@@z@n@@8@H@@@@p@@@@@@@@@@@t@@@@@@v@@F@B@ @@@@t@.@@@6@@@@@@@@@@@X@@ @@@@@@@@@@&@T@ @\@4@@@d@b@.@0@r@@d@@ @j@>@@@@ @b@@z@@@z@)@@ @P@@"@ @@@v@@P@ @@@(@@@@@~@f@@@@@@@@@@@@@@X@@@@@L@X@r@@@z@@@@@@@@@:@@@ @F@@@@@@@@D@p@(@@@@@n@t@@@@@@@@@@@@@@@@@@@@@@@@@>@@D@"@@ @@b@@@@@@@@p@@:@d@@*@@@@@@@t@@e@@#@@@@@@"@@~@8@@@@0@@Z@t@L@@@H@@@@@@(@@@v@@@x@V@D@@@@@@J@~@@"@|@@@@v@@@@&@@@1@?@@u@z@@b@@@R@@@@@ @z@@8@$@@p@@@@@@|@@@@@@@@@@@@@@@,@@@j@,@@@@N@d@@@P@8@@@l@@@@@@@@t@^@@@@@@@@@>@@P@@@@@@@@@@h@@@z@h@@j@H@V@,@@N@@@Z@H@@@@x@.@:@@@@@H@@@@@@ @@@@@z@@@@@@@=@H@@>@@@@^@f@ @@@,@&@@|@@@@ @@@@P@@@@@@@@@:@@@@@B@@@@@t@V@@@2@@X@N@@@l@@|@@8@T@@@@@@@@]@.@@@@@@@3@T@ @@@@z@d@(@P@@@@@@~@@@@@@d@<@@@@@:@*@@@p@F@@@8@z@h@@.@@n@@@~@@@^@e@9@I@@j@K@@4@@@@@@t@6@@@@@@@@@b@V@ @@@@@@$@@@@@@@@@@@@@@@V@$@@h@$@@@T@@@@.@8@T@@@8@@@@@@@@@v@7@@@@@@@@o@@@)@N@f@@@@R@*@>@@@B@@@@@@@l@.@@@@j@<@*@@@\@T@$@@@@@@@X@F@@@2@@@N@@Y@u@d@g@@k@@q@X@@@<@\@@H@@@<@@@@@@@H@@@@@@@@@@@@@@@@@@@@b@@@d@f@@@0@@@(@@d@F@@@D@@@@Z@L@@@P@6@p@\@@@G@@n@\@@\@@^@~@@h@@L@z@@8@@@>@@&@@@@@j@r@Z@>@@@@X@r@(@@@p@d@:@@@2@@@@\@:@@@\@@@p@@@Z@/@*@<@@K@@@@"@^@Z@@:@@d@@@@.@ @@@@ @@@@@@@@@@@@@@@@h@~@@@@^@@@@@@@@@@@@@P@@@@@"@@@@@2@@@.@@@@@0@@@_@@ @4@ @@@0@@@&@@@@@@P@@t@Z@\@\@B@2@@@@@@,@B@@@|@Z@ @@b@@@@@~@@T@@@@I@Y@@@@@@@@@r@@`@@@@@@\@@@@@@@@@@@@@@T@@@@@@@@@@@,@@@@@@@@@T@@@6@"@h@@T@z@@@@@@@@@@@6@&@@&@L@@@@@@@@x@H@@@P@F@@t@@@@T@@@~@f@@@>@f@f@.@@@@@X@0@@@L@\@&@@@@6@@P@@@@F@L@@@&@I@@%@@>@@@@W@l@@@4@>@@X@@h@@@@@@@@@@@@@@&@@@@@@@@@@@L@b@^@@@@V@&@@@@d@6@@@@ @@D@^@@@@@*@@L@@@@@@@l@p@x@@@@r@|@@@h@Z@@H@@@,@@@t@@@@`@@@@@>@\@n@@@P@@@@~@X@@,@X@@@@@|@@@ @@P@@ @@@@@@t@ @@@&@&@@ @F@@@@@@@@@@@B@@x@@@0@@@@@@@@@@@@t@@@@@j@@@j@@@@L@~@@4@@@t@F@@@@@@|@@@@@@@`@@z@F@@@@@@,@@z@:@V@8@@@@0@@@@@@@H@@@@@\@0@ @@@<@ @@@@@@2@8@:@@@@L@<@@@@@@@@4@&@@b@Z@@@@@F@@X@e@+@@@@@@@@@@@@@@@@@@@@@@@@@,@&@&@@@R@@@@B@x@@Z@@@@@4@@@n@^@X@@x@~@|@@@*@@@@@@@@@@@@@R@@@@<@@@f@b@@@L@|@@T@J@l@@l@r@|@z@t@(@R@@@@h@@@@@d@V@R@Z@@@@V@@@@@b@@@@@@V@@h@@@@b@A@-@@@@@d@@@@@@@@,@`@@@@@@@@@@@b@$@B@P@p@@2@ @N@\@@p@@X@\@@@@x@"@@@@>@@ @"@@V@@p@@@>@2@(@4@@4@@@@@f@@ @N@|@,@@@@@@|@b@@X@@@`@,@@D@@ @@@@@0@@v@L@6@@@@@d@J@r@|@@ @L@@@@d@8@@T@\@"@@@@n@B@@<@4@{@@@:@@R@@4@@@@@@@j@ @@@@@@@@@@@j@,@F@@@L@@:@,@@H@>@$@R@n@@f@@@h@D@@@@h@4@@@@r@@@@@@@@@.@:@p@@(@b@>@@@@@6@>@@@v@@x@@^@@@@@@@@@@@@@j@@@R@@@@@N@N@:@@@@f@l@@@@8@N@@@t@@@@@`@@@@@D@@@Q@r@@@f@D@@@@@ @@@@@@@@@@@@@@@@@@@.@@@@B@ @@Z@X@@@@@b@|@,@@v@p@@@F@@@8@@@t@@@@d@,@f@@@8@@J@r@@@@@@@.@$@@@n@@@@@@@@v@J@L@@@@ @@T@@@@<@@@@@b@@@\@@(@H@@@@v@L@@@p@<@<@@h@@@@@@4@K@@+@>@(@&@@`@@H@@@@@@@@@@@@@@@@R@@@@@@@@4@@@@@@@@~@v@Z@T@ @@@@x@@@@@@@@ @l@p@@$@@@ @@@@@@@@B@@@@~@@d@@@9@J@J@@@\@@@@@@,@@@<@,@@@l@@@@@@@n@Z@@@*@H@d@@d@@@@0@0@@@(@@@@@@@z@<@>@*@@@P@@l@@Z@:@@@@@@@@@D@h@P@@v@@@@T@@x@@>@@@b@r@@@@@@v@@j@@v@@@@@L@@@@"@:@F@@^@@@@@&@j@@t@@@@d@h@@R@6@@@*@@@@@@@J@n@X@P@Z@@f@0@N@P@(@@j@6@@@@z@p@"@r@f@@:@@l@@>@@@@@@@j@N@@@6@v@@b@h@@"@<@@:@@@@@@@@H@@@ @@@@N@L@@h@@2@T@@f@@@@@@z@@F@@@8@4@t@@@P@t@@@@@h@@r@@@@d@@6@@@@@J@l@@@@4@,@@@4@@@@R@N@@@X@@$@@@0@@@@@@@@v@@@Z@ @@l@@(@@@@@@@V@@@@,@@n@&@f@@)@@@@@@N@]@O@@x@1@*@@@@=@@\@@L@@@@@~@J@@@@@@@@@@@@@@4@@@n@N@@@@l@@@@@@@h@@@J@@ @@@@J@@@8@v@@@@@@2@v@@@~@@4@@\@@@,@@X@4@@@@X@X@#@~@'@1@v@@@@@@@@@@Z@@@f@"@@@@t@@*@F@v@@@@@4@`@@@Z@@%@^@&@@)@g@@X@v@@@g@@@@@p@@x@@<@@@@:@@@@@2@X@@R@8@@6@@@ @t@j@r@@@.@r@@@@@T@@@@z@@@@@R@6@Z@@H@@R@Z@@@8@\@@t@@@@@ @N@@0@B@@ @@B@z@@d@@@@:@@ @@$@@@@@@N@@@@v@@@z@@@@|@b@@N@X@@@,@@@J@@@@@-@A@0@@S@I@@ @<@/@@h@@@@@@ @@@(@@F@d@@Z@@@<@ @|@`@@@@@@@d@@@@f@@@@2@@@@@N@<@D@@@@>@@@@h@@@@@3@@@*@@@@@a@4@4@@@@h@@@@@@z@@@@@"@@@P@@@@@"@n@@@@6@R@0@@@@@V@@@@@@@r@r@@,@@~@@@@<@@7@E@7@p@@@@^@H@r@@@z@@@@@P@c@@8@@@@8@@@@P@@H@@@$@@8@F@@d@@@@|@`@6@@D@r@@@d@@l@~@ @@@@V@@@&@@:@@G@@k@@@@@`@@@z@@@ @@@@@@@@@@@@@@@^@+@@@@(@@@@>@@2@@@B@@@*@@@@z@N@@p@V@@ @.@@@$@ @>@@@@ @@@$@@8@@@(@@-@W@@@@"@ @@@@@:@@j@@f@@j@<@@@@ @@@@@R@@@@@p@@@@@@@@@@@@@8@@@<@d@@@@+@z@.@n@@@@@@d@@N@@@<@<@@2@J@@*@@@L@@K@@c@@z@@S@/@@@b@J@>@^@@@@D@@@Z@*@@@@@r@@@0@@@@@@&@@@z@\@@*@8@@@@@{@}@@@@i@@g@d@@@@@@@>@@b@@L@,@@ @@@L@@h@@P@8@@@@@@@n@P@@@@@D@8@@r@|@,@@@V@@ @d@@@l@@8@@@@@2@@@x@X@@v@P@@N@@0@B@@r@@4@@@@@:@@@@@ @@@6@@@@@@@z@p@$@@ @@@~@@b@F@@$@(@@.@v@6@@@@@"@X@h@@h@z@@.@@:@ @@q@ @@p@z@4@@@'@@@@@<@@<@ @%@@h@@,@@6@L@@@@@8@@(@@l@@H@@ @L@@@`@n@P@@@@@<@@-@@@@@@@2@b@v@@@@n@@,@@X@@$@$@ @@@@@O@@@@@@@~@@j@@6@@V@f@^@(@@(@P@@@@@@j@"@r@@@H@x@@v@@@0@j@@n@@!@@J@|@6@|@@~@@V@=@@@ @@<@@ @l@@@@>@&@R@ @@0@@f@@(@V@f@V@@j@@@z@V@:@6@@n@@^@@@@@@@@@ @~@@@@@P@@@@=@@@@.@@@8@@F@@@@@@@@4@@J@A@T@@@@@@@p@@@j@<@f@(@2@"@@@@@@@@@@p@r@@:@R@@,@&@@6@@@@*@@`@@@4@|@Y@@@@@~@b@~@@@(@@@@@@@@l@ @@@@@@,@@@ @Z@@@@\@@@@z@.@,@r@@@v@\@V@@@@@@@j@j@@@@@@@@c@|@ @ @/@@4@@`@@@@@@@@@@@@@@@@?@@R@@J@T@@@@t@N@R@ @@x@@@@@@x@d@@X@D@L@@@L@@@0@@@x@@@@2@@h@d@@@@@<@@c@@@z@<@@@B@H@@@@@"@@p@d@(@@@@@@@@@,@,@(@b@@@@j@@@@\@Z@J@N@t@@@@V@j@@H@,@@@@@@6@_@@@B@@@@@P@h@@@l@ @@@@@ @@@@ @2@@a@6@Z@R@@@@@@L@@@@@ @@@@@x@X@l@N@@&@@ @"@@@`@@:@R@z@F@t@@@h@p@@(@@@@@@@t@F@@@n@2@L@@j@@@"@@p@z@B@@@@@@@@@@@@@@v@6@@@@@@N@*@h@@@@@@N@@@@@0@0@@P@v@@}@@B@@~@@*@@ @@@(@@@@@@F@&@@@V@>@@@@b@@@@@@@d@ @ @@@@@@@@z@v@b@.@@@@f@@@Z@@@h@@@J@*@n@&@-@#@|@@(@+@@Z@@@@H@@|@~@n@@$@@ @@@@@r@8@@@@@*@@@@@J@@@(@@@@R@@F@x@R@2@@<@@@@@@@@@@@$@)@@#@_@@@@)@@@@@@@r@0@@@@@<@,@R@@6@@@l@@@@h@@4@V@@z@@@8@ @@@@@@@|@X@H@`@0@@@@T@d@@:@T@@2@@@l@.@@p@n@@@r@R@@@@@@@@"@@@@@@8@@@@@@(@<@Z@@@@@l@$@@@@@@@@@@j@r@Z@f@@p@d@@8@@@^@t@@@@@@<@@@T@h@@n@ @@O@@Z@R@@@4@F@ @@@2@.@@<@,@"@@b@ @.@6@@@z@@@@R@@,@@&@6@@@@@@\@l@J@:@F@:@@(@@L@L@@*@(@@0@<@@,@<@*@T@@j@L@@@@@p@@@@@@"@^@@@@@@@ @*@@@@:@V@,@@h@N@@@@@@@@@r@:@@@@@R@"@$@F@Z@Z@d@~@@@@@@@@\@#@@@@@|@@@@d@b@@@>@6@@@@@@(@@p@>@@|@V@@@@@@@n@h@2@@@r@@$@@@@@z@\@N@b@8@.@ @@,@H@h@0@ @x@@@@@@"@d@@@z@@8@x@ @@$@@@"@v@@@@@@@@@@@$@@@R@T@@J@~@z@@L@@@@@@@@v@@z@N@@@@@,@(@X@B@l@n@@@@@@r@ @"@@@@@@@d@H@@@@@@`@&@(@$@@J@@@@@@j@@@@@^@@@h@@@@N@8@@@N@@@@@h@n@b@H@*@F@&@@ @@4@@@@ @4@@@@@@@@6@@j@@l@@@@@@@@@@@@X@ @@4@@@*@ @@@@^@@~@\@l@r@@@@>@X@@@@@@@T@ @8@H@@l@X@>@@H@^@<@@@4@@t@R@~@@@@J@ @Z@h@N@t@@@"@@@@^@@@v@@@@V@@@ @@~@n@@@N@t@<@@@&@@@@@@@@@f@P@:@@@&@@@@@@z@@@&@Z@@B@6@&@@@@@@@@@@4@@@@@>@n@<@@n@@@@&@@@@@@h@@@Z@b@P@f@@@@@j@8@p@@@b@@P@>@@b@@@^@@^@r@d@@@@P@@@@@@@Z@b@ @:@@@ @@|@@@@\@J@d@"@|@@@,@L@@R@@@F@T@@@@@v@@@@4@@@.@@@@@Z@v@N@B@V@@@@@@@2@@@H@|@@4@@ @@@@@@@@$@@@@>@@@0@@@@b@@|@&@"@Z@@@@|@l@@Z@@x@@t@@@@@j@:@@@(@@@p@@.@t@@@H@"@:@T@~@^@@b@j@@@R@@p@@J@"@@@@@@&@r@@@@@d@@@@@ @F@N@V@`@<@:@\@@Z@"@@j@@&@@@@f@@@@@@6@J@B@b@@@@@@@P@@@P@j@@@:@B@j@@@v@H@@@@x@@@f@f@@_@@@@@@@@n@X@0@.@@@@@D@@@@X@`@@@@@d@@@@@@@(@@p@@@z@X@f@l@@@@,@@b@:@@@@@n@@@@~@f@@@@t@\@@@8@(@@@@@4@V@J@*@2@B@@F@@@@h@<@@@@^@@"@@@@@x@,@@@*@@@@@@@H@@@&@L@@6@@8@*@@@`@F@t@@@0@@@ @@R@L@v@@@@*@@@@@V@(@@`@@@p@@ @@t@l@@@@@@@@@@@:@@@$@@@v@x@@f@@@H@@4@@@$@E@@:@@@@@L@n@@@@@F@@@l@<@@@@@^@X@H@*@>@@@|@>@@@ @@T@@|@d@4@@@@@@@@\@J@.@@@@@ @@0@|@@@(@R@@@@:@f@@@@>@T@`@@@x@@@~@@@@@@X@@\@@@@@@@X@.@,@ @\@@x@J@@@@@@@@@@@@@@z@V@@@r@R@|@\@@@@@@@J@H@@@@@@@@>@r@@Z@@@@@@@<@Z@@@@^@B@@&@@D@,@D@J@@@$@@@@:@@@@@@@f@X@T@@@B@ @@@f@@@0@r@@@@R@@@@@.@0@@6@@$@"@@@@@@|@@@@@x@x@J@@:@@ @@V@2@@@D@"@f@@p@@@@@@@@@@@@@@ @@@(@"@@P@Z@@X@t@@.@v@@@0@P@@@@@@f@@b@@@@@r@@@Z@T@@l@@~@X@l@r@X@<@L@@@0@@,@4@@~@&@ @@@@@|@n@x@N@<@>@@@@r@@@@@z@@@(@@@@@h@z@@j@@@$@@B@x@@@R@@v@@X@@ @@@@8@P@@`@(@@z@@@N@@p@@@@@@@@@@@@@&@>@@@,@@@f@@@@@@F@@@@@@@ @@@^@@@@@@@@@2@0@@@,@@v@@L@@T@@@`@@<@&@@V@@@F@,@@@@@@t@\@l@J@4@J@@@ @x@@@@Z@d@@@@@@@@>@z@@@@@@@@@@R@@@@@@z@@<@ @@@@@@@`@p@@@@@@@@@@@&@@@@@@n@@X@,@@@@@@@@@@@@@@@@@@@@@^@b@8@N@&@`@@@@@@L@j@@@@r@v@@:@@z@@@H@$@@@T@ @F@@V@2@@@@@@r@z@b@`@:@.@.@@@ @n@@@@P@6@@@@z@@$@@@&@ @@@@@&@x@@$@@Z@l@F@@@\@X@Z@@@@f@x@@@ @v@@@>@@t@R@2@@@@@@@@@,@@F@@@@@@R@@@@@@@@r@@|@.@X@@@j@@V@@$@$@@@@2@@$@F@L@@D@@@ @@~@@@@@ @@t@*@@@r@ @@@@@@@p@d@V@8@@4@@@ @B@@@@@@`@N@@j@V@@@@ @<@&@@@@@@c@L@,@@@t@>@8@@@@@@@@\@@0@*@@@t@F@@@@@P@@@@@@@@@@@@@@@@@@@@ @^@^@@\@l@@(@@@@ @@^@@@@d@P@p@@Z@Z@:@$@x@.@F@<@@@j@p@r@z@N@@@F@@n@@T@@@@@@@v@Z@d@l@D@,@$@@@ @L@@|@@@@h@\@@f@@@@@@:@<@@@@^@@@d@@@f@P@T@,@@p@@ @|@@@@,@@R@r@F@*@d@@@.@@@@<@h@T@(@@@V@@f@B@H@4@@@@@@B@D@@@&@@@@@>@@@@`@@@@@*@R@@@0@@@@@@^@H@2@0@@@n@&@\@D@@@@@@@@F@@>@@@@@@r@j@Z@T@N@.@(@$@@ @ @B@@d@~@@@2@h@@>@P@@@@<@L@j@@@,@@@@@.@@<@^@@X@R@@@4@@@@>@v@@@2@@$@@@@@@@z@`@@@@@&@@@@@"@ @(@@@@@@B@@j@@ @@0@@v@x@*@@@@T@F@<@@@&@@@(@@@@@@D@@@p@T@r@8@@@@N@H@@@P@@@@@@@@^@f@d@&@\@@@8@@@@B@z@^@@@@"@P@@@@v@@@P@&@Z@@@@@@C@@@@@Z@@@@@z@^@@@@@@@~@P@ @@n@B@@@@@@@"@@@@@@@J@,@@@@@@@@@@@@@@0@@@@6@@@l@b@@@@,@@*@@d@@L@@@L@@x@@@@ @Z@@@@F@2@R@@@@f@(@@@@@@t@@L@ @J@(@@@@@ @@D@R@@@@@@p@@@v@@\@8@@|@@`@>@ @@@@@@@@@@D@@@r@@@@@@@@@l@@j@@b@V@@f@@@@@@@@B@~@8@:@@@@@@@@|@b@@@@@@@@@@@@@@X@<@D@@@@@R@|@B@0@<@h@@@@j@@>@@@@@^@@@@x@^@@@@@@@Z@l@@F@@ @<@ @@ @@4@>@@@@@@:@@@@@`@@.@n@.@5@@@@@d@@@T@@@0@@@d@f@@@@|@@@@@`@&@X@@@F@@^@@ @"@@@@@@@$@@@@@@r@@"@R@ @@2@@@@@@@.@@@@@d@@ @@@|@@@@@@@@@@@b@@@F@@@ @@@N@@@v@>@@@@@@h@`@P@.@<@@@2@@@@ @.@2@@@@(@"@l@@@r@@@@@b@"@/@@>@@3@@@%@Z@D@B@,@z@"@@@x@j@B@`@@x@*@:@@6@@@@\@@x@@@@@@@@T@H@"@@@@f@l@@@@@@@\@@P@@@@n@@@@4@@@@@@$@@@@@@@@@@@J@@4@^@@@h@J@J@@@p@"@ @@@@@@N@P@X@"@@"@@$@@@@@@,@^@@@@@N@@b@@&@(@"@ @@@@@@@@@"@/@@i@@P@T@*@@:@,@@@@@@@@@@@@N@:@&@@@`@"@@~@l@@@@@@@@@@@f@@@@@@0@l@@@@@l@@@@@@@@r@@n@@@@~@\@t@@@@@@<@h@@@v@V@"@@@@h@<@@@@v@|@@f@B@T@:@X@@@(@@@@@@ @:@~@p@@@@,@ @x@@@`@@ @@ @L@4@<@@@@@W@@M@h@Z@,@@x@@&@@@@@@@@@@@@,@$@<@@@@@"@P@L@@@@x@@@@@n@@@@@:@@@&@@t@t@@"@Z@@@@@L@@@@@@@@@x@z@@@(@@@@Z@@@@.@@n@r@.@ @@@@@@@X@t@B@:@B@"@@@@@@@@@X@x@z@@@@@@t@@@@@4@@P@:@@ @T@,@@b@@u@@+@$@l@@@@J@@@&@@@f@@2@J@"@x@@@@8@@@@\@j@@x@@@0@\@@@@@\@@@@@@f@V@@@8@d@z@@@@Z@@@.@J@|@@@@F@*@@@@R@@T@@@@@@,@@@@n@z@@@@@@@@z@D@P@^@>@2@@@6@@@@@@@@8@H@`@^@v@@@@D@T@@@2@@@6@T@@(@@@H@u@V@(@@@@n@h@@@v@T@N@@@@f@@X@@\@@@@@@@@@&@H@H@@@<@@@@@T@&@@@X@>@`@@ @V@d@t@@@@@@@@@@&@l@6@@@@@@@@|@@@D@@@@@l@@r@l@@@@@@@@@@@~@D@B@@@ @*@@@@@@@@@@@@$@F@F@@@@@@ @@@@:@n@@@@@@@z@f@<@@~@"@@@F@@ @4@@.@6@@@@@@@@@J@@v@h@@@@@@@@@&@@@@@J@@@N@D@@*@@@@@@v@p@`@>@2@F@D@@@F@d@@@@@V@f@@@@@r@@J@B@2@@|@d@^@<@ @@@@v@@n@X@@4@:@$@@@@@@@@@@@@@@@@(@<@X@@@@@V@ @@@@@@^@n@@@,@@@^@@@@@@^@h@"@h@@@@@X@\@@"@d@@"@"@@V@@@8@@@@@V@0@H@@^@`@@@X@q@@@D@@@@@@0@@V@$@@@@Z@@@4@Z@h@R@2@@@@@@@X@@|@L@@@@X@B@&@"@@@@@@T@j@^@J@N@>@@(@@@@@@@@@@@@@@@ @X@V@@@@@@@N@.@@@@@@R@@2@@@@t@z@"@@@@@@@~@@@@@r@"@R@@X@@@@@l@6@@@@@@@X@@@@ @@@F@*@@@@B@*@@@@@ @@@@@n@@@@@R@z@ @,@@@@'@Z@@@@@@@@@@@b@v@@@@@@@@@F@R@z@@2@*@@@@@@@@@@@@@@@@@0@`@D@~@@@@@@@@d@@@@@J@@J@@@V@@@"@J@^@@@n@8@@@@x@H@,@@ @@@r@*@@v@D@\@r@h@@@L@@X@n@,@@@(@F@"@2@@p@&@@@ @@@@@@@@@L@@@@@X@&@@@/@I@J@4@@@@@@j@@@t@@@@@@@@j@N@f@@@:@F@@ @"@@@@@@@@@@@@@@@@@@@8@B@P@r@@@@@@&@2@@@6@Z@@@@@@@(@@@$@@@@@@@r@@P@,@@z@@@Z@v@ @:@`@Z@P@X@@@2@@@p@@@@4@@2@<@@6@@D@(@@@ @(@@@@ @J@@N@@@@@@@@@@b@@&@@P@@@@:@@@@@@r@z@h@:@n@@H@0@ @@&@ @@@@@@@@@@@@@@@@@@ @,@"@&@>@H@j@@@@@P@@6@@@@0@V@p@@Z@.@@@@@@@@n@@@@@@B@2@@j@J@@@@ @(@ @@X@P@,@^@z@Z@V@@@x@z@*@@n@@@ @@@@8@R@B@@@ @p@@@r@@@@@S@@@f@>@@b@@@n@V@*@@@@@@p@>@J@6@H@8@.@@@@@@@@@@@@@@@@@@@@@@@@ @@2@h@N@v@@@@@@t@<@r@@@@ @@R@@&@@H@@@&@@@R@8@@@p@<@4@@@F@@R@@@@@@@@@@z@@(@N@2@@@p@D@@2@f@@@<@@d@8@8@<@:@ @`@@,@-@@Q@@@@@ @:@@T@@\@&@@@^@@@@@@@@Z@<@J@4@J@<@ @&@@@@@@@@@@@@@@@@@@@@@@@@@@@@L@f@f@@@@@@@ @(@@V@@~@@*@2@@:@@P@@@$@@@@@@^@N@8@8@@@@@@@@@@8@^@f@>@@@@,@@@@ @@@@@*@@<@$@Z@@n@@j@B@@@v@N@@@ @^@@@@@@4@@@n@>@@@@@@x@d@b@`@D@8@(@0@@ @ @@@@@ @@@@@@@@@@@@@@@@@@@@@ @@@`@b@@@@@@@@ @ @.@(@`@B@@@@@2@b@@:@<@@L@B@2@@"@@@@@P@~@8@@@@@@@V@"@$@@@P@@@@@ @0@@@@@$@.@@@4@@@@@@@@b@@@@@@@P@:@@@n@ @@@@@@t@T@P@f@*@4@,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&@J@&@@j@t@@|@@@@@@@<@@8@@@@@"@$@ @'@^@@+@m@l@@@@@0@@@@@@@ @ @@@ @@B@J@$@ @@R@*@@J@X@2@@"@@@`@|@@@H@@.@b@f@@@@6@@p@@@@@@@@@@@@\@h@H@H@b@(@(@(@0@@@ @@@@@@@@@@@@@~@@@@@@@@@@@@@@@@@"@@F@F@8@>@D@Z@@F@@@@@@@h@@@@4@@@@@@@-@@@n@@@$@\@@@Z@@@Z@H@.@(@@@V@$@@&@@<@B@@^@V@X@f@`@r@@@Z@@@@@.@2@@p@h@N@@@@@^@L@@@@@@@@v@f@f@6@H@<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6@ @"@8@&@\@2@N@@|@@@l@@@@,@$@^@v@@@@@r@@b@@@;@X@@D@@,@`@(@@h@H@@@8@"@@F@@`@F@0@N@@@@@@@@@;@@@@@@@@@x@v@n@|@@@@@F@:@@@@@@j@h@v@Z@*@`@@<@ @@@@@@@@@@@@@@@@@@@@~@@@@@@@|@@@@@@@@@@@ @ @@@6@ @$@^@:@L@R@x@~@r@@@@@8@@@@@@@V@@H@@n@H@X@h@@@@@@@D@@@@@@0@@@@@d@-@@@2@@H@!@:@@@@H@@:@@B@0@@@@@@@j@@@@@@@n@n@D@Z@B@8@D@@6@@@@@@@@@@@@@@@@@@@@@x@x@l@@@@@@@@@@@@@@@@@@@@ @@@@@@8@Z@d@T@@@@@ @p@@ @@@.@@@`@@x@ @@@@@@@T@@0@@2@@@@@@9@\@@@@@M@@g@ @@@Z@@`@@x@`@H@@d@t@f@4@:@@@ @@@(@L@@@@R@X@F@4@ @"@"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@*@@0@<@@R@H@@@@@@@@@@@&@@z@@@@@@@@@@@:@@@j@@@V@@t@"@@:@6@@ @@H@"@@@@@@@@@@@@@b@V@L@@:@@@@@@@@@z@h@D@8@2@,@<@8@(@@@@@@@@@@@@@@@\@@@@@@@r@@@t@|@|@@@@@@@@@@@@@@@@@@@@@@ @@@2@$@V@|@Z@@@@@@P@t@H@@T@p@@@@@@6@F@L@@@&@@@@ @v@@@0@*@@N@@ @@@@@@@@@@@f@@@@@D@2@B@@@@@@@@@@@@d@Z@F@<@@8@@@,@@@@@@@@@@@@@@@@@@@@@@@^@t@p@@t@@@@@@@@@@@@@@@@@@@@@@@@@@4@@<@^@,@@@@@@@@*@@v@@F@^@N@(@@@@@T@@@@h@@@@@@@@@P@X@B@6@@@H@6@@@@@@@`@V@>@@@@@@@@v@~@z@|@8@Z@F@:@@@@@(@@@@@ @@@@@@@@@@@@@@@@@@@@@@r@n@f@~@n@@x@@@@@@@@@@~@@@@@@@@@@@ @@@8@"@P@^@.@n@r@f@@@@@*@,@@@@@@@@@@@*@D@L@F@*@&@B@t@@@R@@@@@@@@@@@v@j@@@p@,@Z@@@@@@@@@@\@f@l@f@B@8@Z@*@,@@@&@@@@@ @@@@@@@@@@@@@@@@@@@@@v@j@v@d@r@@@l@@@@@@@@@@@@@@@@@@@@@@@@@@.@@&@8@6@0@P@@@@@@@@@@@@@n@@@@@@@@@ @2@@@@6@@@>@R@ @6@<@4@@@@ @@@@@@|@`@\@p@V@d@T@J@6@@"@@@J@@0@&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@n@x@n@@r@@@l@n@r@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@T@<@~@@f@f@@@l@~@v@z@v@^@p@Z@@@@@@@z@@@@@@@@@&@@@@@@@@@@@@@@@h@J@H@D@d@$@F@@@,@@(@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@X@p@p@`@v@n@z@p@r@x@v@@x@@@t@|@@@@@@@@@@@@@@@@@@@*@@@6@D@B@F@@>@@>@h@2@Z@n@H@N@J@j@b@x@@@@@@@@@t@@@@@@@@@@@p@j@@@j@r@@f@@b@4@T@2@"@8@B@$@2@@$@@ @"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\@t@\@t@`@v@@h@r@l@j@@`@z@@p@v@@|@@@@@@@@@@@@@@@@@@@@@@$@@@@ @@@@@"@ @@B@8@N@R@X@R@@.@F@R@p@B@T@n@8@p@v@t@@\@P@R@@6@@@<@6@8@*@<@F@@@@"@@*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@d@~@j@h@n@l@r@v@x@@r@@@@|@@x@@@@@@@@@@@@@@@@@@@@@@@@@&@@0@@@"@ @@B@@$@H@2@d@L@@@L@<@P@T@V@T@X@8@p@@@J@l@j@@N@P@T@R@6@4@B@6@N@.@F@R@.@@@*@,@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@`@h@R@n@`@`@X@X@j@P@\@f@\@d@n@v@|@x@t@@|@@@@@@v@@@@@@@@@@@@@@@@@@@@@@@@@@@*@@@@,@ @ @@$@,@ @@(@"@@&@8@*@@"@.@P@@@,@(@@*@H@@@@ @ @@@&@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@:@l@P@`@\@V@p@f@d@Z@f@h@z@Z@d@n@j@v@~@~@@t@@~@v@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ @ @@@@@@ @@@ @@@@ @@@ @@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@`@h@L@n@\@j@r@l@r@b@X@r@h@x@n@`@~@t@@~@@@@v@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@"@@@@@@@"@ @@@@ @@@.@,@@@@0@*@@@(@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Z@R@L@T@^@^@d@\@X@d@n@l@\@f@l@h@f@x@r@@d@r@z@p@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@P@^@b@L@Z@b@b@X@b@`@t@b@\@n@v@b@t@h@v@@@v@@z@@x@|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@V@X@N@^@F@R@n@L@h@P@`@j@T@h@r@\@f@j@~@@x@n@@d@@z@p@@t@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@sunpy-0.8.3/sunpy/data/test/EIT/efz20040301.090010_s.fits0000644000175000001440000042350013203275053021114 0ustar nabil00000000000000SIMPLE = T / conforms to FITS standard BITPIX = -64 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 128 NAXIS2 = 128 DATE = '2004-03-01' / Date of file creation TIME-OBS= '09:00:10' / DATE-OBS= '2004-03-01T09:00:10.585' / UTC at spacecraft ORIGIN = 'Rocket Science' / Rocket Science = NASA GSFC DATASRC = 'LZ file ' / TELESCOP= 'SOHO' / INSTRUME= 'EIT' / OBJECT = 'full FOV' / BUNIT = 'counts / pixel ' / WAVELNTH= 195 / 171 = Fe IX/X, 195 = Fe XII, / 284 = Fe XV, 304 = He II FILTER = 'Al +1 ' / DATE_OBS= '2004-03-01T09:00:10.585Z' / SCI_OBJ = 'CME WATCH 195 ' / OBS_PROG= '195_10S_AL_1.000 ' / CMP_NO = 1 / Unique campaign instance (1 = synoptic) EXPTIME = 12.594 / s (total commanded + shutter close) EXPMODE = 'backside ' / FILENAME= 'efz20040301.090010' / CFTEMP = -66.71 / CCD cold finger temperature (C) CCDTEMP = 7.34 / CCD temperature (DN/100) CTYPE1 = 'Solar-X ' / CTYPE2 = 'Solar-Y ' / CRPIX1 = 64.5 / Sun center x, EIT pixels CRPIX2 = 64.5 / Sun center y, EIT pixels CRVAL1 = 0.00 / CRVAL2 = 0.00 / CDELT1 = 2.63 / Pixel scale x (arc sec, fixed) CDELT2 = 2.63 / Pixel scale y (arc sec, fixed) SOLAR_R = 372.27 / Solar photospheric radius, EIT pixels SOLAR_B0= -7.22 / Degrees SC_X0 = 0.00 / s/c yaw (arc sec) SC_Y0 = 0.00 / s/c pitch (arc sec; -109.14 after 1996/04/16) SC_ROLL = 180.00 / s/c roll (deg., Solar north + CCW from nominal)HEC_X = -139130208.00 / s/c heliocentric ecliptic x (km) HEC_Y = 46576272.00 / s/c heliocentric ecliptic y (km) HEC_Z = -94896.31 / s/c heliocentric ecliptic z (km) CAR_ROT = 2013.00 / Carrington rotation at earth COMMENT CORRECTED DATE_OBS = '2004-03-01T08:58:25.510Z' COMMENT COMMANDED EXPOSURE TIME = 10.000 s COMMENT SHUTTER CLOSE TIME = 2.594 s COMMENT LINE_SYNC = 'no' COMMENT CAMERA_ERR = 'no' COMMENT IMAGE_OF_SEQ = 0 COMMENT READOUT PORT = 'B' COMMENT NUM_LEB_PROC = 3 COMMENT LEB_PROC = 26 (no ROI) COMMENT LEB_PROC = 27 (no occ mask) COMMENT LEB_PROC = 12 (Rice) COMMENT BLOCKS_HORZ = 32 COMMENT BLOCKS_VERT = 32 COMMENT P1_X = 1 COMMENT P2_X = 1024 COMMENT P1_Y = 20 COMMENT P2_Y = 1043 COMMENT N_MISSING_BLOCKS = 0 HISTORY Version 4.0, 2001 December 10 HISTORY Image linear resampled to (128,128) for SunPy END @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@t@@@l@|@@t@x@t@j@f@f@`@p@r@^@d@Z@r@X@`@b@`@h@X@T@Z@Z@X@N@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@ @@@@@ @@"@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@p@@^@l@@v@x@^@l@r@l@b@\@l@P@R@X@`@`@R@V@`@j@^@Z@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@2@@@ @@2@ @@&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@t@v@@v@@p@t@z@@v@v@^@l@f@n@Z@n@H@\@Z@`@Z@^@`@b@Z@\@T@`@J@R@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@ @@@&@@@@@@:@@@$@@.@.@H@@@B@@4@4@@ @@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@z@t@@n@~@@j@z@n@j@x@l@t@^@T@l@^@T@b@`@T@T@V@P@R@T@R@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @@@@@@@F@@*@@@B@@@>@*@B@V@L@^@J@&@`@&@@L@6@D@@8@,@.@@"@@@@@ @@@@@@@@@@@@@@@@@@@@@@v@@@z@h@x@r@h@x@l@x@Z@^@V@f@X@\@R@f@R@d@Z@@@L@V@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @@ @@ @@4@,@@0@$@T@\@6@V@P@p@B@B@N@6@@8@,@0@<@B@2@@,@ @2@@"@ @@@@@@@@@@@@@@@@@@t@@@@@@x@z@v@z@f@~@|@|@n@p@l@f@b@f@^@X@V@Z@\@\@^@V@P@V@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@,@@@8@@(@*@V@J@,@ @6@Z@^@<@$@Z@~@v@@@@@@t@n@`@x@T@f@@Z@n@`@d@J@h@H@F@D@@@ @@@@"@@ @@@@@@@@@@@@@@@@@@h@|@@n@t@n@n@h@n@b@l@z@l@^@^@T@\@Z@X@P@N@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @6@*@@@>@"@h@"@H@d@2@L@P@(@~@p@@@@@@@@@@@T@f@@@@@H@h@`@>@Z@D@J@@ @H@@@*@:@@@@@@@@@@@@@@@@@@z@@x@x@@@@n@t@^@j@b@l@f@h@V@\@Z@P@`@`@T@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*@@@$@0@l@F@`@d@B@`@x@X@|@x@l@v@P@@@@@@@L@@@@@@@@@@@@~@@@@l@B@h@&@\@&@8@@b@<@@@@@@@@@@@@@@@@@@@@r@@v@v@~@n@j@f@h@b@n@b@d@X@p@P@^@X@\@h@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@2@@@"@@$@L@:@Z@8@2@f@>@@v@R@@@z@@z@@@@@@@L@d@@@@B@@@@@(@4@@@@@@@@@@x@d@v@z@n@L@p@D@4@@@@@@@@@@@@@@@@@@@v@x@@@@l@t@b@l@~@d@`@p@l@`@X@x@`@Z@X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@2@ @@(@ @@4@@Z@6@4@j@b@n@d@@@@@@@@@@@@@@@@@<@>@H@@@@*@X@"@@@ @@ @@@@b@@@@@D@\@<@@@ @@@@@@@@@@@@@@@|@@@r@@@@x@f@p@l@r@\@x@`@j@T@d@b@b@P@T@@@@@@@@@@@@@@@@@@@@@$@@@@@@@@(@@@6@@<@B@T@Z@D@^@p@t@@b@|@@@@@@@@@"@@@@@*@d@p@@T@@@ @@@@@@@ @@@r@@v@F@@J@@@@@@@|@@H@f@&@.@(@@@@@@@@@@@@@@@@@@@@~@p@t@n@v@v@b@d@b@f@T@Z@f@Z@h@X@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@F@D@<@d@<@Z@@@@@@@@@@@&@@ @H@ @b@`@*@X@@@J@@p@@@@L@B@@6@l@l@B@,@@ @@@@@t@T@4@^@R@@@@z@@H@N@P@*@@@@@@@@@@@@@@@@@z@@t@|@n@r@n@x@\@R@n@n@j@r@j@\@T@l@@@@@@@@@@@@@@@@@@@@@ @@@@ @X@@@<@@&@&@$@Z@(@8@8@b@~@@@@@@@@@4@8@r@d@n@@Z@@@@@ @R@@f@@Z@@@@@d@@@@@@p@F@:@F@@@@@@@x@ @@@@@@n@P@6@@@@@@@@@@@@@@@@@@@v@x@`@r@j@r@n@f@j@f@\@V@^@d@Z@h@@@@@@@@@@@@@@@@@@@@@2@@@F@4@$@(@6@X@X@N@h@h@@|@@@@@@@`@@r@@@n@@@@@@@@ @P@X@^@@@4@@@K@<@@@@f@@@0@@@@|@^@@@@@@@@0@@P@b@^@@2@@@N@B@@@@@@@@@@@@@@@@@@@@@x@p@h@l@r@|@t@v@n@l@T@^@n@@@@@@@@@@@@@@@@@@@@@@@ @&@@0@"@@Z@@@V@`@>@@@@@@@@@4@`@r@@@@~@@T@ @D@N@&@~@b@@@@`@@@G@@@@@J@@|@t@@@@@@@0@@@@@@F@@p@$@@@@@@@@x@X@@@F@@@@@@@@@@@@@@@@@@t@|@@t@x@j@v@j@f@f@t@\@`@`@@@@@@@@@@@@@@@@ @@@@ @.@@@6@:@V@`@T@@P@@@@@@@@@*@L@D@@@@p@|@@|@@h@@@@@@@@X@@@,@@=@@@b@H@@@@@E@S@ @@O@[@@.@@@@F@@@@H@@B@@f@@@@@~@`@8@"@@@@@@@@@@@@@@@@z@n@z@v@p@x@x@^@d@j@r@f@f@^@@@@@@@@@@@@@ @ @@@@ @ @@&@$@2@R@<@p@J@Z@@j@@@@@@&@N@,@@@@*@&@X@@@@>@@r@@@*@@@@8@z@v@z@l@Z@@@M@@D@~@@@4@@@@@v@M@2@@1@@@@T@@l@@@`@@*@@@~@z@2@@@t@L@:@6@@@@@@@@@@@@@@@@@@@@x@@p@f@r@X@b@h@@@@@@@@@@ @@@@ @@0@@@@0@&@.@0@V@F@R@t@f@@@@@@ @$@b@@@@ @@R@p@v@@@@B@@.@(@P@@@@t@T@2@@@@@*@@.@L@@@ @@@@@@@!@O@.@@n@@}@@l@ @T@@@@R@@@@@@ @@@R@^@<@4@@@@@@@@@@@@@@@@@@n@@r@@t@t@Z@v@n@@@(@@@@@(@@@@4@F@0@D@B@F@j@B@F@@Z@j@@x@@@@@@8@ @ @@@@B@N@@@@@V@h@@@P@<@<@@@@@@@@@r@@@n@@@@@R@L@~@@\@@4@n@@@@@9@@%@@@j@E@@@ @@@>@@@>@F@@@P@@@@@h@b@0@$@@@@@@@@@@@@@@@@@|@|@@j@r@j@p@d@@ @@@@@@@@@@@@@,@L@8@V@X@J@b@N@T@p@f@@@@(@@@@@V@@@.@@@@4@`@X@@@@>@@@@@@@@@@@@@F@@@D@n@\@@@@$@ @@@0@z@p@@:@@@t@@@W@,@@:@@@-@H@M@>@"@@@@N@@@@@@@@t@d@P@:@2@@@@@@@@@@@@@~@@@@@v@h@v@b@^@@@@@@@@@@@,@@@@2@*@2@Z@D@Z@h@@v@@@@@@z@p@@@@@@@,@@@@@6@v@@R@l@@&@@J@@ @@@`@v@@@D@6@@@X@@@@>@@2@<@@@@@@@4@H@@Z@@@@V@D@&@&@@@@@@@@ @ @@8@@@@@|@R@L@@@@@@@@@@@@@@@@z@@~@v@z@t@^@d@@(@&@@>@ @6@6@"@N@>@X@r@@@f@|@f@@|@@@@@@@B@X@@ @@.@@&@@B@@$@Z@@@@z@@@H@L@8@~@@@@`@v@"@@h@@@0@H@@@z@@@@J@@@@@@@j@J@h@@(@R@@@@@8@@@ @@@ @@@r@@@@>@@|@F@ @@@@X@$@@@@@@@@@@@@@@@@@@t@@z@n@@@@@@@@&@*@<@8@@,@N@,@F@Z@f@t@^@@@@@@@X@j@@L@H@@@@@@@:@4@L@,@<@@@@@@@@@N@@@@@@l@@r@@@@H@@@N@@@:@B@@@@d@@@@@r@\@F@,@j@ @N@\@\@Z@@@@@@b@@@@@@@Z@&@@@@`@P@@@@@@@@@@@@@@@@@@~@@p@r@p@@R@N@H@B@@T@l@:@b@H@\@h@z@v@r@H@@@@@@,@h@f@@@@@@"@@@j@@@@F@(@ @@v@@@@ @@@f@<@@@@@B@N@@@V@@@@@@@@X@f@@@@.@f@d@^@b@@h@R@@@b@D@(@T@@\@@@@@V@B@2@@n@@|@@@f@p@@@@8@6@@@@@@@@@@@@@@@@@@@@p@|@@*@ @N@:@6@`@H@@@r@@@^@\@B@n@@@@@@ @@f@@x@@*@>@@@j@@@d@^@@@<@@ @4@@@@z@@*@@~@v@@B@<@@F@@@t@@P@@@"@@@@@@@@@@@@@@d@`@@@r@@@@@@@t@@:@@@@T@(@@@@@@b@@@@R@ @@@j@J@R@@@@*@@@@@@@@@@@@@@l@@|@@,@@6@4@&@6@P@ @`@L@d@d@n@p@@@@@@@@@@@@L@~@@@,@f@@@>@*@@@j@@@P@|@@@V@&@\@.@&@D@@@ @@@@@L@l@~@@@@@@@F@@@8@@@f@@@@8@@X@@\@@@\@N@@p@@@@@D@@@@@@V@f@P@@J@@@@d@\@D@@ @@@@@@@@@@@@x@@@@@@6@T@X@J@t@l@v@@t@@@@@@@@@@@.@j@Z@@@@P@@@4@@\@:@0@>@@@@@r@t@@N@@@@@@`@@@@@@@@T@@p@ @@@@v@@@ @@W@@4@@l@d@@@@@r@H@H@@@,@,@.@@@.@@@l@@@@z@@@N@2@@@N@@x@@@@@b@J@&@@@@@@@@@@@@@@@@v@@,@H@@@h@H@@@V@~@b@@r@@@@@@@@@`@@\@@@@v@@@@@8@"@@@@v@@@T@d@L@Z@@@@@,@@@@@@@,@L@*@@@X@f@@@@@ @@@(@@@@@d@@h@@@t@ @@@V@@@@ @@.@>@@ @@@@@@@@@@@@@@0@@@@@Z@>@J@$@2@"@@@@@@@@@@@@@@4@F@J@:@N@t@j@|@V@@@@@@@@@@0@V@@t@@ @J@@@@p@<@@@$@8@J@h@@@D@~@~@@@@@@^@@@@@@.@x@@j@@n@0@@@@&@@@@z@d@@@P@@n@p@@n@x@:@@L@@@&@Z@@@@@@@@@b@t@z@^@d@@6@f@@@@@H@@@@@z@^@D@@@4@@@@@@@@@@@@@@@b@@r@z@@@@@@@@@<@@@2@@@@@@(@T@@@P@J@@@T@p@@L@\@@@@@@V@.@6@P@@^@@@@@@d@@@f@@@@P@@@z@>@@h@@X@@@<@D@@@@@@@@@`@@@@@@n@@@@@@*@~@@@@@@8@p@@@ @T@@@R@$@@@@@@\@P@>@4@ @@@@@@@@@@@@P@X@@@~@p@r@@@@@@@*@@L@0@4@:@@@@@l@@@<@@@@P@h@@4@\@@@j@j@@@@@ @H@@@@@@@@p@L@>@L@@"@@@N@:@@L@@@@@j@B@@l@@@L@R@T@@@D@h@@ @@@h@X@@@h@@@@@2@@@@@~@@@@@@`@@@F@@@@@@~@L@V@(@@@@@@@@@@@@@@l@@@x@@@@@@@@ @@z@@@@@n@d@@@@h@@@Z@@@@@@P@@@@@@@@@L@@@@@@p@j@F@@0@2@\@@@p@@^@\@@6@@H@@@4@|@R@d@@ @@@@@L@2@ @@"@@@x@@D@X@@ @B@T@ @@@P@@v@@@\@@J@@*@@V@*@@@@@@\@`@T@@ @@@@@@@@@@@@T@@@@@@@@@8@@@@@$@@@,@@@@@(@@l@@l@@X@6@V@@@@@p@@@@@@@@@2@H@@T@F@`@@@@ @@@b@@@@@<@@@t@@J@@@>@@@@@@<@@J@@@d@@@@@<@j@@n@@@L@@@@@@l@@@@x@@@@z@B@@@ @@@@|@x@d@Z@@@$@(@@@@@@@@@j@@r@@@@@@@*@>@\@@@J@F@@@@4@P@ @\@@V@@R@*@@@@@@@@@@@@@@t@$@.@@@|@l@@^@|@@$@@@(@@Z@P@@2@@l@l@@@j@R@N@"@\@P@@@(@@@N@B@X@ @ @B@@ @r@@@@@@@@&@8@T@@X@@@@@@p@@Z@6@@@@@@@d@H@<@:@&@@ @@@@@@@@@@@@@@@L@p@h@@@@@~@@@@@@@@@@D@@@@@@r@@@@@@@@~@@~@@*@@@@@@B@t@@x@&@x@L@@@@@@@@@j@@@8@@`@@z@@(@@@@n@^@@@&@J@@b@@X@@P@n@l@P@@@R@r@@@@*@@p@@@@J@@@@N@(@J@2@@@@@@^@V@H@@@@ @@@@@@@@@@@@@Z@\@@@@@@@@8@@@x@*@@r@@@@@@L@<@@H@@@@@@L@@`@h@X@@@.@@@@@N@@@@B@&@@@@@"@@@@J@L@R@ @@@l@@"@<@@@ @@@t@@@@@@@z@@P@@b@@>@H@@@@~@$@r@@ @L@@p@:@@@v@X@&@@D@@@@@@|@@p@>@J@(@@ @@@@@@@@@@@@P@@@ @<@@@"@b@@@@z@@ @@|@b@@@V@@J@@@n@@v@@@D@P@@@@@@@@@@<@@@:@@@@@@@@@*@@@"@B@.@6@@@@@@n@@@@@v@@z@@@@@r@@@@@@@@@@J@ @&@R@@P@:@@N@4@@@|@D@,@@@@@@@@x@@R@@6@@@@@@@@@@@@@@d@@X@r@@@V@@@,@"@n@Z@@ @@B@Z@X@@8@T@@@b@@@@D@@d@H@`@@&@@@@@@@@@@B@.@L@@R@@`@@@@@@@L@n@@@\@@"@V@@@|@z@@:@`@@ @2@@@<@B@@@@`@@@P@@@L@@@@n@@@@@@@@@@Z@@@@@@@@@@@v@T@H@D@@@@@@@@@@@@P@Z@@2@r@&@@F@@@@@@@B@@8@@@@R@@@+@@N@2@@@@@@@*@@@@@@@@d@@@@F@@@@d@H@@@@@@@@@@D@@@l@z@ @@D@X@h@@@@@@@@@@$@@@@@2@R@T@b@@@1@@@@@@@@@P@@@@@ @@@@@@@@@@~@Z@v@:@*@"@@@@@@@@@"@d@@ @@@@@@b@@@@@@@(@@@@@H@p@x@@L@@@@@8@@@@@4@@@@@@@@@@`@@4@*@@@.@@@@@@@@ @h@@V@@@B@ @@(@@>@@<@X@@@@@*@@Z@@B@@@@^@r@F@0@@p@l@@@@@D@@@@$@@8@@@@@@@@@@@@x@F@P@L@>@@ @@@@@$@@4@z@v@"@@@@@R@@@?@C@%@@t@.@@N@@@ @x@@@@@@@`@@@j@@@@@@@@@x@@\@l@0@@@p@N@ @@@@@@@@V@d@p@@@n@ @@>@"@@@0@D@@@x@@@@6@@@@@@H@P@@@@<@#@@@@@b@@@T@@@@@(@T@ @h@N@>@ @@"@@@@@@@p@@B@P@@@@@ @@@p@V@@@T@@@@L@@ @@@@r@c@@@@@@ @@@z@@@d@@@@p@\@@@z@@@h@<@8@@L@P@ @@~@L@r@@@@@@@@@`@`@ @V@@@@@x@@:@.@@,@t@t@f@P@@@,@v@@@*@2@@f@:@@@#@@t@6@`@<@ @@f@@D@f@@@@*@x@@$@"@*@4@2@@@@@@@n@L@0@"@@@@@(@Z@X@@@@0@~@@*@@@f@@Y@A@>@@g@@@@6@@R@4@<@@@6@@@@`@x@T@@.@B@X@@<@@@@\@@@@@@ @@@@@@@@Z@@@.@F@@@ @@@T@.@z@@@@@@X@ @@@@"@J@X@8@@@@X@@L@P@@@r@@ @@*@@@@@@(@v@@@@j@:@v@F@@0@@@@@@@Z@t@J@ @@@@&@@D@@@L@@ @@*@@@@@U@@@T@!@X@@@@@@(@@@@@@@@J@.@*@@@@ @&@@@@@@@@@@@@@@@@@@@L@B@@Z@~@@@b@@B@(@@J@b@@@@@@@z@@@X@@ @ @@W@@@;@@|@@@@\@|@j@@@@j@@@@@D@B@@@@@@@@~@n@4@,@ @@@@v@^@.@@ @@H@ @`@@@z@@:@@%@@@u@@)@@@@@@L@^@0@@,@@@@@@@@@`@@@@@@@@@@@@@@@@@@@@@@@@@@l@@@n@8@@@@B@8@@(@@<@@@@@(@@D@h@*@@@@ @@T@@@@@@J@@e@h@@@n@\@:@@@@@D@@d@@@@@@t@@@L@T@&@@@@T@F@ @@@4@X@R@@@&@@z@p@,@@j@H@@+@8@E@"@@3@@@@@8@`@@B@b@$@@@@@x@@@@@@@@@@@@@@@@@@@@@@@@@ @@@ @r@*@@4@@:@B@@\@d@8@@@@@@@@@@@@@R@@@p@@@@@J@ @ @@@@F@ @@ @ @@@@@@\@@@@@@@@@@(@@@h@H@&@@@@X@6@x@@@@@@@@+@@@@@U@c@a@@{@r@@@@V@@@t@6@@@N@@P@@@@@@@@@@@@@@@@@@@@@@@@*@^@@|@@@*@~@@2@@0@.@@(@@j@@@@@@@6@@P@V@@L@@@@,@@@@@@T@@b@@@@@<@*@J@@j@@@L@@@@@@8@@@h@@@@^@p@@@@"@@J@@@@@@"@@@p@i@@K@)@@@@>@@I@|@l@@@@0@@@@F@b@@*@@ @x@@@@@j@@@@@@@@@@@@@@@@@\@@l@@@@@@.@@@`@@@@N@x@<@@@@~@@*@>@@@@@@w@'@>@A@@@@Z@@@@F@@@@@~@@T@j@@X@X@h@^@>@.@@@l@X@@@@8@r@(@@@F@@l@@@.@x@*@P@@@@ @%@@@@e@@@@E@`@j@@@@@@*@@@0@@X@@h@@R@@@@*@@@@@@@@@@2@@@@@@@R@@@4@@@ @@@J@R@@p@@@|@@z@"@@0@@@N@J@@@@*@@@@@@@b@F@@`@@>@f@.@2@Z@Z@@@@@@@@@@Z@>@@@j@p@@@@@j@&@ @@@v@@n@@@b@@@P@@@@$@@+@@N@I@D@L@O@@@@@L@@@@@@&@@@D@@@@@@@"@@2@@@@@@@@@@@@:@@|@@b@@&@@@@\@B@@@2@@@@@d@b@4@@@<@H@@V@x@@@ @@Z@2@@@@8@@@@@@@@@4@@@D@p@@@@@@Z@4@@@z@@@L@@@@J@B@@@@@@@@r@b@@@@@@D@@@>@ @ @q@E@@U@ @v@ @@&@@4@h@@*@4@@@@@@l@@H@@@@@@@@@@@@@@@@$@@\@p@r@@6@@@@@@H@\@8@h@0@6@@@@@N@@@@H@.@4@@j@@@@@6@@@@@@@V@X@@@Z@t@@@@n@@@@0@&@@@@X@N@@@@z@F@@@@V@j@4@@@r@@@ @$@X@@0@|@ @@@@@@@@@@@R@@@@h@*@@8@@B@@@@@P@@@@@@@@@@@@@@@@@@@@@@@@j@@p@@F@@@@$@@@@@@@@@@@&@@B@*@>@@@,@z@@r@V@@@v@@@@@@@@`@N@@@@@<@@^@@@d@h@R@X@X@ @@@@@8@&@@@@4@@@@@@@@l@@F@@F@ @@,@@@@@@@@I@v@$@F@6@@@@@J@@@@@@@@@@@@@h@ @@@@@@@@@@(@z@@@@@n@@P@@H@^@@@"@f@@X@@@B@@@@@@@@X@@@@@@f@@@P@@@@@b@@ @"@.@@@@@@@p@@*@t@J@@@<@R@`@&@@@@p@R@@ @@`@V@@@@@`@@r@@@@D@l@B@@'@G@4@/@@@ @@@L@!@@@@^@p@@@0@8@@@@@@@@@@@@@@@@@@@@@@@@&@h@t@j@@v@@@@D@@@N@@@@@ @@>@ @@@@@:@@@@@@>@n@@@.@N@@@n@j@D@@@L@@Z@4@@ @@@@@@@@^@z@@n@h@@@N@@@r@@@@@P@$@(@Z@@@X@@@@ @R@@0@>@@@@@R@a@.@@@@@@@L@B@N@>@h@@@@@@@@z@@ @@@@@@@@@@@@@ @d@@@z@^@F@z@n@@@@b@@@@@@@@X@@*@@@@$@@X@`@D@@T@@@@@L@@@@@@:@@h@V@8@@@(@N@f@(@@L@&@@4@f@@@|@&@@@@@@@@@@B@.@$@`@@@@@r@@@6@@@(@@:@@~@@@<@@N@@@@@@x@@@R@@@@@@@^@@@@@@@@@@@@@@l@@@@@@@@F@"@@@@@@p@`@*@Z@@`@@@@:@@@@@6@@@@@@P@,@@@@@@x@<@@H@ @ @ @ @|@f@@@`@@N@@T@f@@.@j@@N@N@"@&@@@@<@(@@@@V@2@.@F@@@ @@n@@&@,@j@@@@(@@.@@@@t@ @@:@@@)@@@@f@@@@@@@^@L@@@@@@@@@@T@@@J@@@@@@@@l@T@@n@@@@@@@2@F@@@F@@@6@@@@@0@*@@@@ @h@x@@@@l@@^@.@|@6@@@@@@z@@f@v@n@L@e@<@@@@@@@@@f@@@l@H@@@@@r@^@@@@@r@D@@@@2@@@@@|@@@@.@@@@@/@@@@@.@<@t@@ @@@@@Z@~@@@@@@@@@@z@@V@@r@@@2@Z@@@@@f@J@@@v@@@@@@~@8@@@@B@@@@@@@N@(@@@ @$@N@@@@p@@@@@H@Z@&@,@0@d@@@@@@@@.@@@@@@@n@ @@f@L@@@@@h@6@>@@@@x@f@@@@z@@@r@@@`@@@`@@1@@@@@o@@8@8@@`@r@@@@@@@@@@@@@@@@j@@@@r@@ @@@r@@d@D@h@@H@n@v@X@@@j@@r@@@$@@@n@@@@@<@&@@@@@@r@@6@z@@@@@Z@@@ @@$@h@@:@@@@@@@\@L@$@@@@@L@@@@T@@@@x@D@0@X@p@@&@P@@@@@@>@P@J@l@@.@X@O@@@@@+@l@@b@@@@@@@@@@@@@@@@@@@@@@@@ @@@@2@@@p@@@~@V@@@`@x@h@~@@@<@@@@@@B@@4@@@@@@@@^@ @@@@@@J@@@J@$@*@@0@"@T@@L@@@@@@@@^@@@^@@@@>@<@@@.@@ @@@@.@@L@@,@6@@~@@@@@z@@V@@@>@W@1@X@H@$@@@A@5@@2@@@@F@~@n@@@@@@@@@B@j@f@ @P@@@@T@\@D@@@:@@,@D@@@@@@@x@@@@`@@:@p@@@h@@@4@R@>@z@@@@@@@@<@@@*@@J@@"@8@H@@`@@t@@@}@@@k@R@L@B@(@\@p@4@8@@@@@@z@"@@@@R@z@.@z@@@T@ @@@r@@@@@&@@L@:@J@!@@_@%@@@@@ @@@@>@ @@@>@^@D@ @@@@@@j@d@D@v@@@@H@r@@j@p@ @@@@d@@V@@@ @@ @F@@@@@v@p@@X@@@@@@V@@@@@`@`@F@4@ @@f@@R@f@Z@@x@ @*@@@Z@@H@3@H@@"@Y@@@t@@R@Z@$@@P@*@@p@$@,@@@@@L@D@@@@b@@@V@@@?@@t@@@@@@@V@@6@@@@#@@@4@ @@@@@@d@B@@@@ @T@@@@,@@@@l@@@:@@@@@@@:@Z@@@(@x@@<@t@@@@@@ @@@@@,@@@:@~@@v@@@@,@^@@2@@@@@(@l@@@@@@f@@b@_@|@@@@@@@@@@X@@@z@"@@@p@f@@N@2@n@@@.@@l@@@"@@$@T@`@r@@M@@{@@ @@@@v@@@@@@L@ @ @@@@@@@@@@@ @@@R@"@@@@N@r@@@@@X@@@(@@@@$@@ @@@J@@D@~@@@%@@@d@ @@&@P@@D@@@@@@z@@@2@@@@$@*@0@@D@@U@@@r@@@@@b@@j@r@@@(@@@:@@@@x@R@@,@Z@@@@@2@\@@@0@@P@[@/@@@Z@%@R@i@a@@@@A@@@@@@h@@@8@ @f@@8@J@@@@@:@t@n@@@D@@@@v@f@@@@@t@@@@|@.@@^@z@$@r@@v@@@N@d@6@@@@L@6@@d@@@H@0@v@@4@@@~@@@~@@@@0@@@l@@@@@F@@@2@j@p@@&@2@@@`@@@2@@@@@~@@@t@@L@F@@@@@D@@h@o@i@@-@@@@@>@@`@T@j@@G@@@2@@@P@@@@@l@@`@"@@@@@@,@@@@@@:@@@@@4@@@@d@v@P@^@@f@@p@F@Q@&@@@n@@@@T@ @@@@P@:@ @E@T@@@@J@@@@@@@@@b@%@@@@@@@@@@@@@@@@@j@4@@z@@@@@L@f@@t@\@@D@4@@@@@j@@@ @@&@E@4@@d@g@z@(@]@@@@@@d@9@@@@P@N@D@0@j@@N@@@@^@@@@@>@@@@@@@v@@@@@@@@@@@@@@d@@j@p@@N@Y@@K@E@@@@@@&@x@R@@@@@@F@n@h@@$@@@T@Y@ @r@@3@@1@@@@$@(@V@d@V@@@ @@z@b@,@@@@|@L@@b@P@@0@@@@p@B@@@@ @T@f@(@@1@@@<@@@d@D@@D@@v@@@4@@^@@@@@T@F@B@@P@@J@@@@@*@@@@@8@"@l@@l@t@b@@H@v@@ @@@8@H@@ @e@u@@@@ @@[@P@@@@@@.@t@@`@H@*@@@>@B@@@4@@@k@@@@@&@@@@@@@@@ @@@@`@h@&@@@@|@x@@@@@@>@<@@<@Z@@4@@ @!@/@p@g@@@@)@V@r@"@@@@,@@@@h@<@x@@l@.@@z@$@@@R@^@n@j@R@@2@@@t@@@@@r@x@@F@z@p@N@~@T@@@@R@~@|@@`@^@@@:@@@@A@@@&@B@@@@@@f@(@@V@@H@*@@@T@j@V@@@@@Z@`@@j@@l@@*@`@.@B@N@.@"@ @>@@@@@b@^@@v@Z@@T@@(@@@ @V@@@@@@@@@@2@@(@@@ @@ @@V@@@@@P@@@@(@0@&@@@@<@f@@@@@"@@2@@t@@p@@@j@p@j@l@t@@@@@R@B@0@@@@@<@@@@+@@@g@L@@@@@@@d@@@X@@.@@ @n@@@S@J@@4@@2@@4@^@@@<@:@^@@ @"@@@@@@@@@~@b@H@@@6@@2@\@@\@z@@(@@@@-@@D@@@@@@@@x@@@@@6@@@@@@@~@@@n@@@@@*@2@>@@l@n@@@@ @0@4@l@@D@@f@n@d@d@@@@`@@@@"@@R@z@~@O@@@@ @@@@@@@N@@@r@L@@@T@@0@"@@ @@@@@<@@@ @4@*@@@P@&@*@@@6@@@@@@@t@z@P@Z@D@@H@^@@*@B@@@F@@@@:@T@@@@`@@@2@@4@6@@@@@r@:@F@@$@@@@z@@b@@@@@@@@@@@N@x@@M@t@@@@l@h@T@Z@.@P@r@@@T@2@@ @@@:@@;@@@a@@p@y@@3@@j@@L@@@`@2@ @@@@@&@2@F@\@ @H@@ @@@*@@@@@@T@@@@@@@@@@x@`@Z@@@"@@@@$@@@(@6@"@:@|@@,@p@&@@@@4@@k@@@&@@R@2@@ @@@F@j@6@j@x@(@D@@X@@.@@@@@@@@@P@@@@,@@D@@@@~@p@6@B@t@~@@@@@@@@@\@4@[@@,@@t@@)@@ @@@ @(@@n@v@(@*@ @@@T@$@J@F@@@ @&@N@|@"@@@N@@$@@V@@@@@@@@@x@P@@@`@F@.@4@@b@j@@n@@"@@~@@J@B@@l@s@7@z@`@@@T@@@@@@P@@b@|@@@@J@@@@@j@6@@@@@@@@@@@@@@@2@@$@@@@D@@$@\@@@\@@@@@@@@'@%@@@Z@@@@@@@@@@\@@8@@@6@@"@D@@N@z@@@(@@@R@@@X@@@@@ @@@@@@@@x@J@B@b@6@@@@f@v@@B@@8@j@d@@@@@j@@&@4@@@,@ @r@t@@@8@@@@@@@~@@@2@@@@T@@@@.@D@@@@@ @@ @@@X@@F@~@@p@f@@@.@t@@@@@@@@@B@@f@@@E@X@@@8@^@4@v@@@H@H@n@@n@@@.@.@J@ @@@X@f@$@@@@@@(@@@@2@.@@@@@@L@d@N@6@^@:@@@@T@`@@@~@@d@N@@L@R@@2@j@F@2@@@@@@@@@@@@@@@@@@@B@B@^@@^@6@P@@L@J@T@@@@@R@@ @6@@@V@0@@@0@,@@@H@b@h@@@@@@@n@@*@@@@@@@v@@(@~@@n@@l@:@h@6@D@:@,@@B@@|@8@@@V@@@@@@J@@\@B@@@f@@@@@@n@@^@B@f@6@@.@@f@R@@2@ @@@@8@@@@X@@@J@@@@@ @R@@@R@@@@@@@@:@@^@@@@j@v@@@`@p@@D@"@@@@F@z@@\@@@:@@@Z@:@<@(@H@\@f@v@@@T@@@@`@@@:@d@@ @@z@Z@@@@@@^@<@@@@@@@,@@@@@@@@@.@H@f@@@p@F@@@Z@@@@@@n@R@V@&@&@@@@@$@6@@D@@@R@@.@@@L@@@@t@@t@@~@@@@@@@@,@@@8@j@*@@&@@P@@@$@X@@l@@l@@@l@@@@>@@@@@@F@@@@t@8@(@$@r@V@J@@@,@&@@@@h@d@"@@|@R@b@J@@@@@n@@@f@@@@@@@8@r@ @d@@~@~@@@v@@(@@@2@@@r@ @@@@@@f@8@&@(@@@@@"@D@|@@@@@@"@@J@r@@@@ @@@@@@@@@@@@@<@@h@*@@@@@@|@@n@@`@d@d@@@@@l@&@@@@@@@@f@"@@@F@D@@n@@@l@@@@@@@@@@@,@4@@&@@@@x@@@@t@V@@@@h@B@@@*@0@@N@@d@.@b@@l@@@l@z@Z@@@@H@*@@@@V@|@V@"@F@ @@@@@@h@|@@@x@@@:@@@@@@@@@@.@x@@\@8@@@$@@$@J@t@@8@4@@@@@f@P@p@@r@@@t@\@@@v@n@~@@@`@@@@@b@T@l@v@@@N@L@P@@$@@@J@r@@t@@j@L@@<@@@~@@ @H@B@@@t@@*@,@@@@@<@D@@@P@V@@l@l@@@V@F@$@@@@v@*@@@@t@Z@L@N@F@@@ @@@@4@@@0@R@@@@@b@@@@@h@@@@@@Z@@T@@@@@@@@@@b@L@@@@@ @@@8@@@b@v@@@l@`@r@@@@2@@@@@@@@@T@V@@@@@ @\@@@@@@6@@@@@Z@r@@@@@<@@@6@2@@@@@v@L@@@:@L@V@@H@ @@@@2@@@@X@X@8@@@@@j@2@P@4@@@ @@ @@T@@@4@Z@@@$@(@|@@~@@^@|@@@T@,@@ @b@@l@@d@@N@@@@@d@.@@@@@t@r@@~@@|@|@@ @@@^@@@@*@@@6@@@@@r@@@Z@@@>@@@@j@&@@,@@@@@@r@x@n@|@@:@@h@`@@2@R@@@@@J@@>@4@,@L@@J@@@@@>@ @@X@@@0@@@@@@`@<@f@0@ @@@@@@D@@@@`@p@ @@@@@@@.@h@r@@@F@@$@<@@@@@@V@8@@>@j@@l@@@N@8@R@4@J@@P@T@@@@@@@@@@@@,@@@ @@@`@@@n@@@@@@>@:@@@p@@@@@l@r@f@@@@@@@@^@D@J@@@@@@@@H@>@\@f@@@p@4@@@@L@@@@@@@R@p@R@"@.@@@@n@@@ @@|@@@>@@@@@@@@J@"@@"@@@@@z@@.@@@@@J@@@@:@r@@~@F@0@@,@@@@t@r@@@@@@@@|@@@@@@*@@@V@ @@t@N@@@N@@@,@0@@@H@H@@@@@@p@@ @l@@@@\@@@@6@@@@`@D@D@\@@D@d@@@*@@6@$@@@R@@@@@@@~@p@V@6@J@(@@@@@@@x@j@@@@@@@@$@`@<@\@R@@F@@p@@Z@@X@@@@@*@@ @@X@J@@l@h@8@@@@@z@@@@@@@@@@@@@@@*@@ @@$@@@d@@@@@D@z@@^@@@@B@B@@@~@2@@@@@@@,@J@J@@V@ @@@@\@@:@@@@@p@4@@x@@@p@X@@@@@@~@d@h@8@"@>@@@@v@@@ @@\@@@@@@2@x@n@@@@@@@@@@d@@@@$@@z@Z@@@@@@ @@@z@@@@@@@@@@@@@@@@z@@@&@<@"@@@@@@ @@^@r@@@@r@@@$@@@@V@@@D@@z@@@@@@v@@@T@@8@@@l@@f@@@:@N@X@@@@j@@t@H@@@@@@@n@N@n@@"@@@@@D@@@@(@^@@@@@@"@@@ @@ @F@@.@@X@@N@@@@@@@@6@@@@@@@@@@@@@@@>@@@ @@@@@@@@@r@@@@@@@@~@@j@@@@@F@@@@@@|@@@@@:@"@*@6@@@@@@X@@@@@@@@2@@@@@@b@@d@ @X@@l@$@@@@@@@@b@L@8@@@@@@>@@@@@@Z@@@z@Z@@|@@L@b@@@@@@l@@@@6@@@4@ @6@@@@@@@v@Z@@b@d@@@@^@@d@@@@@@X@@@@@@@ @@@@@@@@@F@@@@<@$@x@5@@h@@@@@@(@@@H@D@B@d@@@@x@@~@t@H@b@@@d@x@T@z@^@@@8@@v@@X@@@@@@x@@^@:@f@J@B@,@@@@D@@@@@@\@@@@@@~@@@h@B@@@S@[@@'@D@ @|@n@@@:@@ @@2@T@V@@@B@@p@@p@h@@@@@@f@@ @p@j@@4@:@H@(@@@@ @@@@D@@H@B@\@0@@@@@@@v@4@@p@D@&@@@@T@@@@@:@H@@@@@@ @@F@@@@@@8@@\@@R@@@@@@n@d@V@D@H@@@@@ @@@V@@r@@@@2@Z@@,@P@@^@@@@@@ @>@x@d@@@6@@H@@p@@P@@@@@@r@@@@H@*@$@N@@@ @@@N@t@@L@@t@@@H@@@@@*@@@@@@@@Z@x@ @<@H@D@l@@@@@@B@d@@@@J@@x@:@@ @@R@@@F@n@:@@>@@@j@r@x@@@T@@j@@@@@@@d@R@V@V@.@@,@@@@J@p@b@|@@@T@$@~@@@@r@@@@@'@/@@@@@@@@@f@@@N@@L@N@@@@@^@@@L@@d@@|@@@@@@@@~@@2@@@0@>@@@"@@@@ @@2@@d@@@@@@@<@@@f@f@@T@@z@@f@@@@2@@T@@@X@v@<@8@r@@@@b@4@\@@@@t@J@@@@@@z@^@T@<@2@@@@@@@>@B@4@@@@@ @J@@@@@v@B@@@.@m@A@@v@-@P@@0@@t@r@j@8@@@@@@@@@@@@@@@.@J@r@Z@0@@:@@*@@@@@@@B@@@@ @@@@@B@@@@@@n@@V@@@@@@<@`@`@@@@*@@X@N@T@@ @$@@@@\@D@@@@@@8@@<@@@>@@@@@@t@v@b@(@D@4@$@@@@@@4@8@x@@@@$@b@@@X@@@@J@@b@g@@5@@@<@@@J@@|@@@v@@L@@@@@@@@@>@0@.@@T@@@h@@F@(@@@@B@<@@@@@"@X@@d@@@d@@@8@@@@@@L@@@@,@@T@@@@@@@@(@*@@@@@@j@L@r@~@^@<@ @.@@,@@@V@:@@@@@@n@^@d@2@H@@@ @@&@@@@@p@@@@@ @\@@@n@@@@@6@+@b@@i@@@@@!@(@&@$@$@@@@@@@|@,@@@v@>@H@@@@@"@@"@|@@@@@@@0@~@D@2@p@*@@p@\@@@@@ @"@@@.@@@@@b@@@d@@@@@@@@@@@@@@@@@d@@@t@,@@|@R@B@@@`@ @@@@@t@@d@6@H@.@>@@@ @ @@@@@8@X@~@@@@<@r@~@@<@X@ @R@@@@%@@@@@@;@@h@@&@0@(@@<@@@ @@@@@@@@@@v@Z@ @@@@<@T@@^@@@d@p@8@@@@@@N@@z@@@>@@@@@*@@z@@@@@@@@^@X@l@@@@h@n@b@@@@@@@d@@@4@.@@@p@ @8@@@@v@@@H@b@J@2@0@@"@&@@@ @@@@$@v@v@@@@R@@@X@@@l@@@@@L@R@Z@@ @@@h@@Z@@@@@.@@p@@@@@*@ @@@@@D@@H@P@@@@@H@T@@@@@H@@@@F@J@(@@@f@P@@@@@@@~@@@@@@@@@@@@@@@@^@8@&@@@X@@@@X@z@@@@@@~@L@@@@@@@@l@h@^@@,@@@"@@@@@@@D@T@v@@@@@@b@@@D@@@b@@*@N@@@p@T@@b@@@"@4@ @@.@>@@@J@@.@T@@@.@8@@@@@N@4@@@F@f@@@8@@@@@@@2@>@.@@@@@`@@@@P@T@@,@@@Z@@@@@V@@@@P@.@@@@@*@.@ @@@*@@@@@@@v@"@@@@@l@x@@P@H@F@.@4@ @@,@@@@@@@@$@D@R@d@@@@@$@2@@@:@@@Z@`@@.@@N@(@@E@@@@@t@@X@@@@T@:@@@@@X@2@2@:@"@@@L@.@@@@N@@@@@@@@@N@@L@@Z@,@4@@ @@@T@@@@@@@~@@Z@R@@\@@p@z@t@@@@x@@:@8@@@@@@@l@f@F@@@@@@|@^@|@*@8@4@@6@@@@@@@@@@@<@@r@L@p@@@@.@@|@@@`@v@@0@@@@^@I@@*@@@,@@@ @@ @J@<@H@@@@@@@$@@@P@@|@@@"@@@@@@|@@@@@@@f@@@ @@@@@@L@@*@@D@.@P@@@x@H@>@|@@f@@@2@r@@@@&@,@@p@n@@@@h@`@"@ @@@@@v@j@f@v@T@$@2@@@@@@@@@@@@@@@8@@.@n@d@@@@H@@@h@@@@@J@:@V@@@@@L@2@@@@@@b@J@^@@@@(@F@@@@@@B@(@|@^@@^@2@@@@$@F@Z@<@@(@@@@d@@h@@@@F@@@@0@ @4@,@<@@@@@|@b@t@V@R@@r@@@@b@@@@@>@@@n@p@$@@2@@@@@@P@j@@R@:@@ @8@ @@ @@@@@@@@@@@@@T@P@z@@@@@.@X@>@@@@@@@@@@@n@@@@\@@^@r@@@"@@@x@0@`@@8@f@2@@@L@@@@@@:@x@@@V@@x@@b@v@@@@0@@@@@@@@@@@|@0@@p@@@&@@Z@@<@@@@@@@0@ @@8@@@V@0@@@@@@@t@z@X@N@R@$@4@@@@,@@@ @@@@@@@@@@@@$@d@R@@@@@@@ @2@d@@@@@D@@d@z@@h@8@@>@T@x@H@f@6@@@r@t@@@@@@@J@@T@J@V@@|@@@>@@n@t@j@:@>@@@@@:@@\@&@@@$@J@@@@@@@ @l@@@@@@@@ @R@W@q@O@@@v@@@z@@@@@2@@@@@t@Z@`@T@J@2@<@&@@ @@@@@@@@@@@@@@@@@@*@@^@N@|@@P@@@@(@6@@8@h@@@@@@@B@@@@@R@@@@@@@@<@<@@@@@B@$@*@J@~@H@~@^@@"@6@d@\@p@@@@0@@@"@@h@@@T@@"@,@@@@@@B@@r@@x@@@@@@d@@d@@>@@d@@@@V@@@@@@v@\@R@H@t@@@"@J@ @@$@@&@@@@@@@@@@@@@@@@@@&@&@.@>@J@|@@@@@F@@.@@@@8@D@@@@T@@@@z@@@@\@@@f@@@ @@|@X@.@@@@@2@@*@>@n@@n@t@`@|@v@@d@N@R@@@@@&@@P@@8@4@\@&@ @.@@@"@@@ @@@@@@@B@@x@@@T@@@@@@@@v@`@R@@h@8@"@$@@ @@@@@@ @@@@@@@@@@@@@@&@4@@8@h@J@X@@@@@@@,@h@@@@@@@@@@f@L@8@N@@p@P@ @@@~@b@>@@@4@@@@@@@@@@@H@@@@N@4@@@@@R@@@d@@@(@2@^@P@,@@@$@ @R@@@@@]@@@ @+@z@@v@@@B@@@H@Z@&@@@@@@d@B@b@@(@*@@>@ @@@@@@@@@@@@@@@@@@@@@@ @@ @6@"@X@`@j@@@@@@@6@@^@j@b@@@@B@6@@@@@@@@@@@@~@>@\@N@@@ @@@@@0@@j@J@\@f@@@|@L@@@L@ @@@@@:@@.@ @@x@l@@f@v@@@n@^@@@b@V@@2@@j@2@@@Z@ @@@@@x@@j@D@J@,@&@N@@@ @@ @@@@@@@@@@@@@@@@@@@@@@@@8@4@$@P@V@@@@@@@@@<@@@`@T@@@@n@V@@@@.@@H@E@3@@J@@@@@^@d@d@@@@@6@@4@@,@@X@v@@@@@@F@@@@@$@ @@ @.@@@@@%@@@@@@Z@(@@^@L@@@P@"@@@@@@@j@f@6@H@ @*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @F@D@^@h@r@@t@@@@@@@4@ @J@@@@@8@@@@t@@,@{@n@@2@@@@@@@@@(@@@*@@ @*@\@v@(@"@4@@8@@P@Z@ @&@F@@0@P@@@@@j@@@\@@@@@@@@f@@@@@@P@@@@@@@@@@P@^@J@&@L@@ @@@@@@@@@@@@@@@x@@@@@@@@@@@@@@ @@@@@L@4@@@d@B@Z@@@@@@@@@@B@@@@@@@@@-@0@@@@@`@@`@Z@n@h@@,@>@B@,@$@@,@P@(@ @.@"@*@^@@Z@`@D@N@@@@*@@@@@&@@8@~@v@@h@$@v@@@d@R@ @@@@@@@|@b@f@:@<@6@2@.@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @,@>@4@N@V@6@`@@d@@@@@@H@d@@V@@@@@@|@@(@@@K@E@/@n@@V@.@@@t@P@@@P@@ @^@@v@n@^@>@@@@@@@@,@8@@L@@@@@@@@@@z@@ @z@@J@,@"@@@@@@@^@T@V@@@6@&@D@ @@@@ @@@@@@@@@@@@@@@x@@|@@@@@@@@@@@@@@@@@@@@D@@:@J@0@^@h@b@@@@@@ @2@@@@<@T@@@x@L@@@F@&@B@@@@@j@@`@ @@@r@@@@@@d@@F@@@@@:@@/@$@L@@$@@4@x@ @@*@>@@@@@@@t@8@@@@@t@~@@Z@\@J@F@`@8@ @ @@@@@@@@@@@@@@@@@@@@@v@@@@@@@@@@@@@@@@@@@@@@@@@@<@F@0@b@^@@@@@0@b@@@@@@@@`@@@H@@ @p@@@@L@@"@@@@@@@@L@u@@@@@@ @@@@ @j@@@@@X@X@@l@@h@2@N@>@8@@@@@@h@l@h@0@"@2@4@ @&@@ @@@@@@ @@@@@@@@@@@@@@@@t@t@@~@|@@@@@@@@@@@@@@@@@@@@4@@L@H@F@X@D@X@t@@@@<@@@~@@@@j@@@@@$@@@@@@@@@8@@@R@@@@|@+@n@@@&@v@T@@ @@@@D@0@@$@@@@f@T@T@@D@@@@@@@@@l@h@D@0@D@(@@,@@ @@@@@@@@@@@@@@@@@@@@@t@x@v@t@z@x@@@@@z@@@@@@@@@@@@@@@@@@@ @0@@>@l@^@@@@@@"@^@@@@t@X@@@@@@@$@^@ @|@@ @D@@(@@@@@p@@@R@@J@D@6@:@*@@@@@@B@@@b@6@:@:@@@@@@@@@@@r@@R@0@X@@&@(@>@@@@@@@@@@@@@@@@@@@@@@@@z@p@t@@j@@@@@@@@@@@@@@@@@@@@@@@@@@"@*@.@n@`@@@@@@@@@@@~@B@V@6@ @@@@@V@n@@@d@@@@F@@@&@z@@d@h@b@H@x@8@@@@H@@@l@@,@@@@@@@@@z@n@f@`@<@@@V@R@F@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@r@z@@x@@r@@@@@@@@@@@@@@@@@@@@@@@@@R@(@6@&@*@n@z@@@@@@2@4@@@@@@@@@@@@B@V@|@ @6@@z@@@J@@@@@@@@@@@X@@h@@x@|@Z@$@@@@@@@@@~@x@t@Z@T@H@<@@@"@@ @ @ @"@@@@@@@@@@@@@@@@@@@@@@@@p@n@l@j@z@r@@n@z@@@@j@@@@@@@@@@@@@@@@@@@@@&@@@(@@<@B@~@@@@@f@@~@@@@@j@@@@@@@@@@0@@@@@d@@@L@T@@F@ @@@@@@@@@@@@f@v@p@h@^@R@*@0@0@.@.@@:@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@v@j@Z@z@@z@@@z@~@@@@@@@@@@@@@@@@@@@@@@@@.@@>@@@R@6@Z@n@l@b@\@`@@@@@^@v@T@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@z@f@\@X@F@\@2@4@*@(@$@$@@@@ @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@f@r@d@f@t@t@|@r@@@~@t@p@x@~@@@@@@@@@@@@@@@@@@@@@@@ @(@0@>@h@(@l@2@4@\@j@V@f@Z@`@`@v@@@@@@j@r@@@@v@@@@@@@@@@@@f@|@~@~@@@@@@@8@b@F@4@2@L@\@>@$@*@@@0@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@\@^@r@h@V@|@v@h@@d@t@~@t@z@l@@@v@|@@~@@@@@@@@@@@@@@@@@@@@ @@ @@@ @*@ @&@8@,@&@"@@@L@J@V@h@L@*@f@`@n@\@@@R@@@N@\@p@p@V@j@@`@L@@@H@:@.@L@d@R@(@@@@(@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@h@t@b@r@d@j@@n@|@@Z@r@p@|@x@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@4@@0@ @"@(@(@@@&@B@V@T@J@P@B@H@L@L@d@<@Z@l@Z@:@R@f@h@^@@@Z@d@>@L@2@F@D@J@F@:@8@<@@ @ @@6@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\@R@X@`@j@^@l@z@j@^@\@z@n@t@z@p@x@@v@~@z@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@ @ @@@@&@@@@@*@@0@@&@(@,@&@*@:@2@4@*@<@@@"@0@@@0@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@`@r@Z@b@b@h@t@X@b@j@r@f@h@j@t@x@|@b@x@@r@@@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@$@ @@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@V@P@X@b@R@j@f@b@b@^@n@f@^@l@r@v@x@v@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@ @@@.@@@@@(@@ @@@"@ @ @@"@@ @&@@@@@"@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@`@T@Z@f@b@^@N@R@V@p@Z@t@d@b@p@j@h@h@r@z@@|@~@v@z@@v@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@P@p@\@j@`@`@P@^@n@d@n@n@h@v@@r@|@|@x@z@z@r@@r@x@@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L@V@`@J@Z@n@f@V@V@J@h@^@p@\@p@\@l@~@p@l@t@p@@n@~@z@z@~@v@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@sunpy-0.8.3/sunpy/data/test/EIT/efz20040301.100010_s.fits0000644000175000001440000042350013203275053021104 0ustar nabil00000000000000SIMPLE = T / conforms to FITS standard BITPIX = -64 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 128 NAXIS2 = 128 DATE = '2004-03-01' / Date of file creation TIME-OBS= '10:00:10' / DATE-OBS= '2004-03-01T10:00:10.548' / UTC at spacecraft ORIGIN = 'Rocket Science' / Rocket Science = NASA GSFC DATASRC = 'LZ file ' / TELESCOP= 'SOHO' / INSTRUME= 'EIT' / OBJECT = 'full FOV' / BUNIT = 'counts / pixel ' / WAVELNTH= 195 / 171 = Fe IX/X, 195 = Fe XII, / 284 = Fe XV, 304 = He II FILTER = 'Al +1 ' / DATE_OBS= '2004-03-01T10:00:10.548Z' / SCI_OBJ = 'CME WATCH 195 ' / OBS_PROG= '195_10S_AL_1.000 ' / CMP_NO = 1 / Unique campaign instance (1 = synoptic) EXPTIME = 12.595 / s (total commanded + shutter close) EXPMODE = 'backside ' / FILENAME= 'efz20040301.100010' / CFTEMP = -66.71 / CCD cold finger temperature (C) CCDTEMP = 7.34 / CCD temperature (DN/100) CTYPE1 = 'Solar-X ' / CTYPE2 = 'Solar-Y ' / CRPIX1 = 64.5 / Sun center x, EIT pixels CRPIX2 = 64.5 / Sun center y, EIT pixels CRVAL1 = 0.00 / CRVAL2 = 0.00 / CDELT1 = 2.63 / Pixel scale x (arc sec, fixed) CDELT2 = 2.63 / Pixel scale y (arc sec, fixed) SOLAR_R = 372.27 / Solar photospheric radius, EIT pixels SOLAR_B0= -7.22 / Degrees SC_X0 = 0.00 / s/c yaw (arc sec) SC_Y0 = 0.00 / s/c pitch (arc sec; -109.14 after 1996/04/16) SC_ROLL = 180.00 / s/c roll (deg., Solar north + CCW from nominal)HEC_X = -139130208.00 / s/c heliocentric ecliptic x (km) HEC_Y = 46576272.00 / s/c heliocentric ecliptic y (km) HEC_Z = -94896.31 / s/c heliocentric ecliptic z (km) CAR_ROT = 2013.00 / Carrington rotation at earth COMMENT CORRECTED DATE_OBS = '2004-03-01T09:58:25.473Z' COMMENT COMMANDED EXPOSURE TIME = 10.000 s COMMENT SHUTTER CLOSE TIME = 2.595 s COMMENT LINE_SYNC = 'no' COMMENT CAMERA_ERR = 'no' COMMENT IMAGE_OF_SEQ = 0 COMMENT READOUT PORT = 'B' COMMENT NUM_LEB_PROC = 3 COMMENT LEB_PROC = 26 (no ROI) COMMENT LEB_PROC = 27 (no occ mask) COMMENT LEB_PROC = 12 (Rice) COMMENT BLOCKS_HORZ = 32 COMMENT BLOCKS_VERT = 32 COMMENT P1_X = 1 COMMENT P2_X = 1024 COMMENT P1_Y = 20 COMMENT P2_Y = 1043 COMMENT N_MISSING_BLOCKS = 0 HISTORY Version 4.0, 2001 December 10 HISTORY Image linear resampled to (128,128) for SunPy END @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@v@@x@@h@~@p@@@@l@`@\@z@^@b@^@h@\@l@f@d@^@`@X@f@\@\@`@V@X@R@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@$@@@2@@@@@@"@@ @@@*@@ @@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@r@|@h@r@f@|@~@r@r@n@^@l@n@t@J@^@Z@\@b@D@h@X@V@`@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@,@"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@~@@@n@z@z@t@t@n@l@p@^@b@^@`@f@`@h@\@`@^@R@X@X@P@h@B@P@T@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@4@@@@@2@@@8@@4@"@ @Z@,@X@R@@ @ @@$@@@0@"@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@x@@~@|@r@n@z@r@z@~@t@`@d@\@b@T@b@h@V@R@l@T@T@R@H@V@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@,@ @ @@ @4@&@@@@.@6@@0@8@,@T@L@L@8@:@\@@4@J@@@@8@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@~@@@@@l@@|@n@v@b@r@X@`@n@\@^@R@`@\@X@Z@N@\@P@P@\@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @@@0@@@@@,@@@>@$@D@<@T@p@P@R@b@R@4@:@0@:@&@F@8@@4@@ @ @,@@&@ @@@@@@@@@@@@@@@@@@@@@x@l@@@@n@r@t@j@p@t@z@b@`@\@`@\@\@`@Z@^@`@R@Z@Z@N@T@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@,@F@$@@0@6@2@\@F@`@N@*@j@p@r@@@@@@@@r@t@V@v@l@^@R@"@N@R@N@*@H@,@,@,@@@@@@@@@@@@@@@@@@@@@@@@v@z@@@^@@|@b@l@n@h@d@d@d@`@r@\@T@@Z@L@b@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*@@@2@2@F@8@&@R@@<@J@D@X@d@N@~@x@@@@@@x@@~@v@@f@@@@@~@b@v@t@b@T@>@$@,@0@D@@@ @*@@@@@@@@@@@@@@@@@@v@n@@@|@z@n@l@`@j@b@@`@X@^@l@d@b@`@L@b@T@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@$@@@@@<@@,@L@@@f@@@\@d@^@J@n@F@@|@R@@@@@"@.@0@@@@@@@@@@@@r@@j@f@@H@R@.@R@8@(@<@8@4@@@@@@@@@@@@@@@@@@@@@@t@@@r@h@n@d@d@^@^@T@d@Z@Z@T@R@V@j@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@$@@4@*@&@V@@0@@Z@p@t@>@@@@@@@@@@@@,@T@@@@@@@@@@F@@@@@@@@@@@T@j@@@V@b@B@2@ @@@@@@@@@@@@@@@@t@@@@@@x@z@n@~@l@f@\@d@d@n@t@Z@b@^@X@V@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@6@@@@D@8@l@8@*@^@n@@~@x@@@@@j@@@@@@@t@@@@<@R@(@@@@$@\@@@@@"@@@@@@~@@@v@f@p@:@@@@@@@@@@@@@@@@@@@@@@@@x@r@f@p@d@r@b@`@^@\@T@h@b@X@X@h@@@@@@@@@@@@@@@@@@ @@@@@@@@@ @@@@@ @@L@6@"@@@h@l@t@v@|@@b@@@@@@@@@8@@@J@ @0@|@@@|@@@@@@x@j@@@@@v@@n@@`@@(@@@@@@@@x@P@T@0@"@@@@@@@@@@@@@@@@@@@@@|@l@~@j@j@d@j@b@b@d@X@^@j@\@X@N@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @"@$@6@@>@\@2@f@n@v@@~@z@@@@@@@@@0@@f@j@^@|@@@l@@n@N@v@@B@"@@<@f@T@8@&@@&@4@@p@@`@~@R@@*@@@@@@|@\@,@8@@@@@@@@@@@@@x@@@@@z@@@l@v@@p@j@v@h@r@`@`@b@P@Z@`@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @4@@&@.@@H@:@@@@@p@v@@@@@@@@@.@@p@d@B@@^@@@@@ @p@@Z@ @@@,@@v@v@@@@@@@\@6@<@@@@@@@j@@@@@@@@B@&@@@@@@@@@@@@@@@@@@@@@x@@t@x@j@p@h@j@l@Z@`@V@`@b@@@@@@@@@@@@@@ @ @@@@@@@@@(@ @2@@@B@T@P@6@V@F@v@n@@@@@@@F@J@`@@d@h@@@@@@@ @D@N@H@l@@@@J@!@-@@@@`@J@@@@@@@@l@(@@@@@@@@@t@|@z@F@@@@b@Z@R@6@@@@@@@@@@@@@@@@@@t@t@@~@v@|@j@|@v@`@f@b@f@^@@@@@@@@@@@@@@@@@@ @@@@@@$@@ @@@v@*@J@N@@@@x@@@@@@@N@B@@@@@@@J@D@ @z@@@t@@@@z@@@1@`@@@@@@\@j@@0@@@@!@0@@@@@@@@@2@@@@t@@ @@l@P@F@"@@@@@@@@@@@@@@@@@@t@v@t@r@l@@p@p@`@f@Z@h@t@T@@@@@@@@@@@@@@@@@ @@@@ @@$@4@*@R@J@l@@Z@@@@@@@ @@@@@F@@@@V@r@\@@@V@@@@P@@@ @B@@@@@B@@+@X@*@P@4@@@Q@.@,@@Z@v@@v@@@@d@@@@B@@L@@V@@@@@@\@8@@@@@@@@@@@@@@@@~@@@@r@|@l@v@`@x@d@p@f@^@j@@@@@@@@@@ @@@@ @@.@ @&@@&@H@@<@(@2@J@T@b@@@@@@@@8@`@T@@@@ @ @$@@@0@@@`@@@@@@@>@t@d@@2@@#@s@,@@@@@ @ @@@@@{@;@D@@M@@@@z@@v@&@Z@@4@@@@D@@@@h@f@0@6@R@@@@@@@@@@@@@@@v@@~@@v@v@p@h@p@f@h@b@@@@@@@@@@@@@@@@&@@$@"@@*@H@@J@J@j@n@p@@@@@@4@Z@\@@@@@@h@h@`@@@@*@@@Z@f@@@@(@`@X@@@@@@@N@6@@@@@@@@@~@@;@j@+@@G@@r@@@@*@@T@@,@@@@p@@@@@L@X@f@ @@@@@@@@@@@@@@@@@|@r@@@p@n@j@j@h@f@@$@@0@&@@.@$@*@"@@@F@@F@T@$@|@:@6@@`@Z@@Z@@@@(@ @.@`@Z@@@@^@p@v@@@8@H@6@B@X@<@@@@@@ @@@@^@n@@t@@ @@@Z@$@@@@^@&@z@@@@@/@@<@@@T@9@@@@@@T@@@n@*@@l@b@,@@@@n@N@,@L@@@@@@@@@@@@@@@x@@l@@n@@p@f@l@p@@@@ @@@@@@@@@"@ @.@N@@^@F@H@l@P@z@@z@@@@6@ @2@F@~@@@@t@@ @T@p@`@@@@J@(@@@@@X@@@@>@@"@2@@$@H@@@@@@@@@@@@@@@|@b@@@}@@!@@U@9@P@>@0@@@|@@V@@@@@@@@@L@P@@ @@@@@@@@@@@@@@@|@@~@@@v@n@p@@@ @@@@ @"@@$@@"@.@$@$@H@.@T@^@L@@@@@@@@@Z@^@@@"@b@@@X@n@@@@H@T@@\@@@@@@@^@@@@@@B@6@ @f@@0@@@@@~@@n@@@b@@ @n@@<@@N@@D@@I@_@<@0@@@@@@@@ @@@n@@@@@r@D@&@@@@@@@@@@@@@@@@v@|@z@@~@r@p@t@@2@&@*@@ @$@"@*@V@:@V@V@P@P@x@`@@@@@@@@$@l@8@@@@z@@<@j@|@x@@@@@@@p@@@^@V@B@@@.@l@@@@@,@@@>@@:@ @@4@@@*@v@@@@@@Z@T@@@H@:@@@@@&@@@@@@@@@|@h@@@L@@N@"@@@@@Z@@ @@@@@@@@@@@@@@@@@@z@@t@p@@"@@ @@@4@ @@0@.@>@J@,@,@>@`@@X@@@@@@@X@z@@@@z@@@@@@@Z@@.@@ @@n@@@$@@@@@z@|@@@8@B@`@@@T@@@@@@b@6@B@&@@^@@@P@@@@ @\@@X@@Z@D@@*@@@@@@@@@@@@@V@&@@@@Z@8@ @@@@@@@@@@@@@@@@@t@l@h@p@t@ @b@@@J@:@@>@`@2@P@L@\@t@^@|@@j@@@@@@@2@<@@@@v@@.@p@@2@@Z@@@N@@@P@@@@@@R@@0@@L@@@`@@@@D@@@@`@@@@z@@@r@@F@Z@$@4@@@,@V@@@@:@@@@@ @@@@f@T@J@@@@|@@@J@b@@@@R@4@B@@@@@@@@@@@@@x@@z@@@j@z@t@@>@@<@&@.@,@X@@@Z@V@j@b@X@@@z@@@@@@R@@~@@@@@@@`@@@V@d@@@F@f@@@@z@@*@@@@ @@@0@@@h@@^@@6@$@T@,@@@@@@@@@@@@\@b@"@@@@@@@~@@@@@<@@@@D@(@@@@X@@\@&@ @@@@D@@@@L@L@L@ @@@@@@@@@@@@@@@z@@@@(@"@J@0@(@F@H@<@l@R@X@z@X@x@@|@@@@@@6@@t@@2@t@@@@`@@@:@@b@@ @@@,@@p@@F@@n@@@T@t@@@@@@ @@F@H@T@@@R@@@@@j@@d@@@@@@@@|@f@@@@F@D@4@T@@@@@,@x@@l@@@@f@"@@^@@@@^@X@D@*@@@@@@@@@@@@@@@~@z@@|@Z@z@\@@@L@j@@v@@@@@@@@@@@@F@8@@@@@@@$@6@p@Z@v@@@@@@@R@@X@^@@@@@x@h@d@@@*@~@@@@@@@@ @@@@@@@0@@L@0@@@F@@@|@2@@@@L@P@ @@@@@@^@P@z@@`@@@2@@@x@:@@F@@@@t@x@J@(@@@@@@@@@@@@@@@@@@$@:@J@Z@F@D@V@@J@@v@x@@@@@@@@@z@v@@@@\@@@2@@:@@@@@b@@@D@B@D@j@@|@@ @@@@@@@l@ @&@"@@f@H@@^@p@@@@V@@4@p@~@@@@@@@@@@@@,@B@@@@@@@@@2@.@$@@^@@@@|@`@@t@@@@@.@@@@@b@H@.@$@"@@@@@@@@@@@@@@@H@R@@@B@b@f@p@n@v@@t@@@@@@@@*@b@@@@@D@@@@@:@@@@^@\@`@@@p@@z@@@@&@@@@@@@@L@n@l@p@@L@@ @@@(@@(@F@@<@@@@@@p@@@|@@x@@@@@@`@@@0@@ @@@.@v@x@J@>@@@@$@H@ @@@@<@>@@@d@@H@L@8@@@@@@@@@@@@@@@@R@@l@@v@v@@@@@@@B@@(@0@"@j@@@@@@@@P@*@T@B@2@@H@R@H@@@@@@@$@0@H@@@@@@@@d@$@@@|@@@R@@@@@"@@&@@@X@@@T@@@@@@@@@@@@@@@ @4@@@ @@$@f@*@@@@@4@@@@:@n@@@@"@@@@@r@p@R@^@&@6@@@@@@@@@@@@H@h@n@f@@@@@@@@@*@@L@>@F@h@@@6@L@@,@ @@R@*@\@@@.@@~@z@@@@@@>@\@@@@x@r@@@J@@B@~@@@@@Z@T@@n@(@@R@@<@@l@h@@V@@@P@j@@>@f@v@@ @@@v@@@,@n@@@@@@@@@@X@@@@@@j@@@x@@@@@@h@b@F@*@*@(@@@@@@@@@@@@t@@@@@@@@@@@R@@@@@@@@>@@@"@r@@@@@@@@@@@@@@@@@@T@@p@@@6@@D@8@@@@@@@@@@,@@@@@L@J@@@J@X@@@@@@:@4@>@X@h@@@v@@@&@`@@@.@@D@<@@.@@F@@@@@$@@@@X@F@@@@@@|@p@X@8@0@ @@@@@@@@@@@n@@x@@@@@@@(@(@@@@@*@@J@"@@@@j@@h@@N@@t@@H@@@d@@@@@@@@ @@@@z@:@D@ @d@f@@>@@@h@@@x@2@2@L@@@<@<@h@@@@L@@@@@@<@|@ @@^@N@@"@@@R@~@8@^@@@@@@P@N@@f@@@@@@h@@\@~@@.@@@@@@@P@`@V@ @@@@@@@@@@@@@@@@@@@.@D@@@.@2@r@@.@@.@(@@D@@t@@8@F@@@@N@@@@@@@r@@f@@@ @&@@^@`@~@,@N@@@@:@F@$@X@`@@.@@J@T@@@p@*@J@N@J@@@@@@h@h@6@6@@@b@ @@X@@ @@@@@@^@@@@@X@@@t@@f@@b@&@@@@@@@D@X@L@N@@@@@@@@@@@@@@@@@@J@@t@@@X@@@@@@@@@f@p@n@"@@@@J@@@J@@@h@2@@@@@N@@@@l@ @@$@P@p@V@@:@t@"@@@@@@@6@@8@@@2@@@N@@8@@@@@n@N@@@,@@@@@@x@B@@n@^@@@.@@@*@@B@0@$@@@@@@@X@*@@4@4@@@@@r@H@@r@4@0@ @@@@@@@@@@@@ @@H@@@@@(@@@&@@@@@l@@2@@@@@6@@D@@.@J@@@@@@J@.@$@@@R@h@ @@f@@@@@8@@@B@@@@@@<@L@N@d@B@ @4@,@@V@@@*@@@@~@@x@X@l@@@J@@F@ @F@@@@@@@@@Z@@@^@p@^@.@@@h@F@B@@*@@@@@@@@t@6@J@*@ @@@@@@@@@@@@@j@@@@@@@@b@@@@d@@@@@l@@@@X@:@@@|@@$@@@@f@B@@@@$@@@@:@.@0@n@t@@@x@ @@@@6@ @@@\@@F@J@r@@@@ @,@@@@@@@@@@@r@@@@@@@*@@4@ @@@@@b@@$@Z@@8@@h@@b@H@@@@@@@@@x@@`@ @8@@@@@@@@@@@@>@@@@t@@@@l@@@@8@@6@@B@@l@*@@@d@P@@<@@@@@J@\@^@J@@@@@~@@@6@@@@@L@D@,@@2@@@@@@@@@^@`@@@@@@@@f@n@@X@@&@H@"@,@@2@ @@`@@@@@~@(@&@B@@@@@l@@@X@@@@@@@>@2@@*@@ @@@@@@@b@j@*@2@L@ @ @@@@@@@@&@\@@@@@@T@@@@@,@@h@@@@@@@@@@d@n@b@@@@@@@@@@@@@V@@@@@@@@@N@*@@@@@@@@,@@j@@\@n@R@L@@@h@@J@@R@@@@Z@@@@@@@J@@@@^@!@O@@.@@v@@@@@l@@@@~@@@@ @@@@@@@@d@Z@`@2@L@@@@@@@@@@(@@@v@@@@@@V@@@@@@@@@L@@@@@@@@@$@t@@z@X@@@*@F@@@@@@@@@@@^@@f@@r@@@@@@@@*@.@z@@@@@D@*@ @@0@@@@F@j@J@b@>@@@@z@@@@@d@@@@@@f@@$@8@h@@@@@@@@@2@@@2@@@@@@@@@n@z@>@L@*@@@@@@@@@@<@t@@z@@@@@@@@D@*@H@@S@e@@@@`@@@ @@@@@@z@@r@@@@@@@@@@@b@t@X@V@@@^@R@@@@@@@@v@N@@@@@@@r@@2@6@@@F@z@^@@@@@@@@@@@b@@@@@@c@@0@8@@F@ @t@@@@@@@d@>@L@P@D@@@@P@@@@@@@@h@D@<@0@@@@@@@j@@@@@`@@@r@@G@7@%@ @h@@8@x@^@x@@$@`@@@@@p@@@@R@X@@@@@@p@@@@Z@"@@^@n@@p@@@@@@@@@@p@N@R@@@@z@@,@@j@^@@n@@@@@@@"@@@@J@N@@8@J@@@.@@@@@@@ @j@@ @f@@@@R@L@@J@@@2@@@@@@@l@z@J@6@N@@@@@z@D@T@@@|@@@@@ @@@@@S@@@d@@ @@@@t@>@@@@j@@@H@"@V@T@<@B@V@Z@@@@@@:@@@@@ @@@@@@@@@@\@@r@@@v@@N@@<@X@@@`@>@ @@@@@@b@N@ @2@@@"@>@@0@@!@@@\@z@l@@@@@@@@@@@@R@Z@t@&@n@(@ @@@@@~@h@>@H@@@@@@2@r@@@r@@n@@<@(@,@p@@@@@@@@@\@@P@V@F@@@@@@@@X@8@2@@@@@,@@@@@@@@@@@@@@@@@@@ @@L@@@@@z@z@8@$@L@`@f@@@@@@@2@6@@n@0@@@&@S@@@@>@8@^@@@@v@V@@\@@@@@R@L@Z@@@@@@v@@r@V@"@&@@@@X@f@<@@@@ @\@@@@L@@>@@ @@|@\@@@@@7@T@@@V@J@@ @N@@@@@@@@f@ @@@@4@@@@@@@@N@@@@@@@@@@@@@@@$@@X@|@b@P@P@8@@:@4@d@@@@@@@@0@V@@@@J@@@@}@V@]@`@@_@x@@d@@h@@@@@@D@@L@@@@@@|@x@@N@V@H@@@t@`@F@&@@@@h@r@@@V@@>@H@@@e@@@U@s@@&@)@K@@@@@@@.@@H@@@@@@L@@@@ @@@@@@@@@@V@@@ @@@@@@@@@@@2@@@@@@x@$@D@p@n@T@@@4@B@@@`@2@@,@)@"@_@@,@U@|@@@@p@@`@@@@J@@@@6@2@@@@`@"@@@@@@ @@@@@@@r@Z@@@@@8@ @x@@@v@@@@@@@h@@@c@@~@3@@<@@@V@@@`@v@0@@@F@@@@@@@@@@@@@@@@@@@@@@@@@@:@~@@"@@ @`@p@@@@V@8@@@P@@@@@@@@F@@@@@;@@@@"@@@@@@@@@@@@`@.@@&@@\@@+@$@@@>@ @@H@|@@\@@@@N@`@@@@(@l@N@@@@@@@@@@E@U@N@`@]@@@1@?@@x@@ @D@@@@@@@d@l@N@@"@.@@@&@@@@@@@@@@@@@@@@@@v@<@@\@@@@4@@@@@~@@@>@n@x@@@@@@|@@@@@@@w@8@F@@V@}@@H@@ @@@|@@@@@@@X@@@N@H@t@@@X@@@@D@F@@@@R@J@@@@,@f@`@@ @*@@@@@@B@@@@@@@ @ @:@@@l@@@@@f@@@`@Z@@@6@@@@@@@@@@@@@@@~@@@@@@@<@@8@@L@6@@@4@f@@@4@@z@@0@@@D@*@@@@@@o@@?@@3@@@j@|@a@@@D@@@@@F@T@@ @.@@@@@@@@@@T@$@@@v@t@*@@@t@j@6@@@@l@X@@ @ @^@@@d@@L@@@@@@@@@%@@@@h@ @N@@X@@@\@,@@&@4@t@p@@@@@@@@@@@@@@@@@@@F@@V@@@b@@@$@@(@@@,@,@@2@@@4@x@`@T@ @@Z@@N@@d@q@@@8@)@L@@f@s@m@R@@.@@@@x@H@@@~@Z@p@@@@@@X@J@@@n@H@D@@@@X@N@@@@v@@@@<@0@@2@l@@@N@#@ @@@@d@L@u@@r@~@,@v@@@$@b@z@@@"@&@@t@@@@@@@@@@@@@@@@@@@@$@l@p@`@@@@>@@@@@@@t@T@z@@@@*@h@ @R@@2@@@.@@N@@:@,@@@)@@E@@*@@@P@@@@:@@@@@@@T@ @@@p@l@.@@@x@^@V@@@@j@V@&@@@z@@@@h@V@@ @\@\@@@@@@@@@@@@@@@d@x@@@@@@@ @@@@@0@@@@@@@@@@@@@@@@D@@@@|@@@"@@4@@@@@@@@@l@@@@@"@@@@,@$@Z@L@ @z@@@@R@@@@@"@@@@@@J@@@@h@@ @h@@z@l@`@n@J@.@@@@l@h@@@@@l@P@@ @n@@@@@l@@P@@@@@&@@@@@@@@@@@@@@@f@@@@@@@@@@@@@@@.@@@@@@@@@@@.@@@@@@T@@4@N@P@D@ @R@d@l@@(@@@@@@@@@@h@ @@B@0@2@@@,@@@@@@v@@@(@@@@@@@@@ @T@P@@@0@H@ @@@@@\@(@@@@d@4@0@@@@,@@l@@@ @@@@a@V@V@@@F@@@@@3@ @@Z@ @@*@@@@@@@@@@@@@@@@P@2@@@@@@@@@@@|@t@@B@@@@<@@@@@(@@@@z@@@@@@@@@6@:@.@0@@"@@@$@@@@@@0@j@@p@6@V@$@H@*@8@.@@@H@@@@@`@p@@b@F@@@2@@~@J@@@@@Z@6@@d@@ @`@@@@D@\@@@+@@@@@,@f@@@@2@r@@l@L@@@@@@@@@@@@@@@@@@@@@@@@@@@H@@@@T@@@@h@@@@8@\@@@@@v@@@(@&@@@"@8@@T@t@@@X@$@@@\@d@@f@j@|@@*@.@@.@n@@@$@4@@L@@@@@*@f@@@Z@@@@@z@8@@@@@:@$@ @V@@@R@@@@8@R@@(@@@Z@@6@@J@@,@L@L@@@@A@@ @@@@@@@@@@R@@@@@@@@@@@@T@D@@@\@N@@@~@Z@z@@@@@\@f@Z@|@@@@@@&@@@@@@r@@@@@Z@@@F@@@@V@@ @\@:@:@@"@@X@@N@@j@@_@@6@@@d@l@Z@F@@@@@@H@@@@|@f@2@*@z@@@@r@@@@z@@4@@f@@@@"@@@T@@@@@@@@@@<@@@@@@@`@2@@@@@@z@@@@p@ @b@X@N@@R@@\@&@@\@@n@X@@0@@@ @T@@@0@@@D@@*@@@"@@ @x@@@@>@t@@@@@B@ @&@@t@.@j@@@@@@@@@@`@&@@@@@@@@X@&@@@x@J@@@@@f@R@t@@@@@@@.@.@@@>@?@^@@@P@\@@@@5@G@@@^@\@@@>@@@@@@@@B@@@@@@@@@v@@X@,@\@~@@,@@N@@@@F@@\@@@|@@@@@@@@D@6@ @2@@n@@J@@R@^@d@@@6@R@b@@\@@v@@&@d@@ @Z@@V@P@`@@@@d@@@@@@@@@@@F@@@@4@@@@@r@@@:@@@@z@@@@8@@Z@@@@@r@@N@N@^@@@@@@@\@0@@z@^@F@@@@@0@@@@@@@@@@4@l@@@@N@@@0@@z@@b@>@@@l@R@R@d@@@N@@@f@@@@@@@t@@*@"@@@@@@"@@V@T@v@@@@@@@@@@@h@@I@1@@@@@@B@h@@@@@v@@@@X@D@@@@r@P@4@@@@"@$@@@>@x@@q@w@@@@X@@@@b@@@@@8@7@@@r@@8@\@<@P@@@@@@@@@@@@@@2@D@@@@@,@@L@@@@H@~@@|@v@^@\@R@@8@"@@@@ @@\@@@@@:@j@@4@n@<@@@@@@@@@@P@b@@@@@&@@ @@@@@{@@@@@l@F@@@@@@@|@D@@@@@@@@h@@4@^@@@@@@v@@@@v@@@@W@@@@@@n@l@6@(@,@@d@@>@@4@@@@@@@@@b@R@@@l@|@@|@X@x@|@@\@`@@z@b@@@*@@@r@T@@&@v@P@@@@j@F@@@L@H@\@l@@@@l@@@l@t@@Z@@@j@@^@@d@@@@@@f@@`@@@@@p@z@f@\@N@@@@N@@@l@@@@@x@@r@@@@^@`@@@@@@r@~@@@8@@l@@@`@@@@@k@@ @@H@@@@@x@B@H@ @@@@@ @f@F@6@@H@N@@d@h@@F@@@l@@\@@J@@@V@@@@@x@@r@t@X@p@|@x@@@@@@@@@@@Z@@@@F@@4@@$@@F@@@r@@@@|@@@@@@S@k@@@@@ @&@@@`@@@p@H@@@z@@@t@x@@&@@@@@v@@~@ @@f@@D@@@-@@@@@ @@@`@@r@@@v@@@@@@@@@@@ @@@@@ @@@^@@@Z@<@@@@|@@@@@B@@@z@@V@@~@@@@$@@@@@H@@@@0@@V@@p@@2@@^@@,@@D@@@@~@@`@@^@B@@@@@@g@@@x@@j@@@X@.@@@r@@@@x@h@@H@N@@@ @@@@,@<@z@2@ @p@D@w@T@@,@@@@@^@x@~@@[@X@@@.@*@ @@"@@V@L@@@@@@@x@@@*@@ @@P@r@|@@F@z@z@@@@T@@@p@@Z@\@r@L@@Z@@:@@@Z@v@@@@@@@0@@`@@ @@@l@@ @@@0@^@@@"@@&@@H@.@h@@@R@@@@(@,@@x@@@@<@@@@h@T@@8@H@@ @Z@@@@@4@~@@`@A@;@.@N@@@k@@j@3@ @@@@@d@@@@@@v@@z@B@@^@@N@v@@@@@P@@R@@@d@@2@"@(@@V@@J@D@j@@@2@l@@@@b@@@@@@]@@6@@@@X@P@j@n@@B@@@n@@4@@@@@d@@f@n@@@7@|@}@@@j@@@8@r@@V@$@@d@B@@@@@@@@@@@d@@,@L@@@ @@@@P@@o@@;@@=@0@@@@@@_@@%@@@/@8@ @D@@*@@@@@h@F@@@@@z@j@@b@@@&@f@f@@@H@@@@@>@V@@@`@@@@@N@@P@$@@d@a@9@@@@@L@z@a@@@@*@@6@H@@@@@d@@@@v@~@@@{@@@t@d@@@z@@@@@r@H@(@@@:@@@|@J@t@@@h@@b@"@@@@$@@@A@&@*@D@`@n@@@@?@T@@K@t@@M@@@@C@@0@@@@@@t@,@@@@@@@P@&@@~@&@@@@x@@@ @@@@@@@@@ @@@0@@4@@l@x@@@@@@n@D@0@P@@@@P@@@@@h@V@@@@@@@@@u@ @@@@@V@@@ @@(@2@Z@@v@@@@X@@@@@@B@@>@D@@@2@@@b@@@@@@w@q@Q@@k@@d@@J@@-@&@@@0@ @@:@<@@Z@@@@~@p@N@@<@@@@@@@@@@@ @@@@X@@^@@v@6@6@2@4@@@z@@@P@@@B@[@@$@6@@@@@@@0@,@n@@@l@(@r@@@p@@v@@@@(@@@ @v@@@z@@@@@@@@@@@@H@b@@@@@R@@@>@B@@"@<@@X@@@@@*@8@L@@@n@B@W@@]@%@1@B@>@^@@@@@T@@^@@@@@@R@@@@@B@s@@@@@@@*@@@@@@@^@V@d@~@@"@@@<@@@@x@@\@A@@T@6@t@7@@@=@"@ @@@z@@v@@v@p@x@@$@j@.@@@@V@@@@@@ @L@@d@@4@Z@ @Z@:@.@L@ @@@$@ @@@@h@P@@n@l@@B@@6@@@@H@@@@@@Y@,@@0@@@q@@@h@@n@ @@T@@D@d@@@Z@z@2@@@@8@@@@F@@@@J@@@b@N@d@@\@@b@p@Z@~@@@(@@@@@@@@@j@_@@@@@@k@@@@@z@@n@@2@@@R@@@@ @ @@@|@@r@@*@@@l@@l@x@@B@<@D@@@@@@@@@@@@j@l@^@@.@B@@$@@@@@ @@x@@@3@<@@@H@n@@ @@@@@@@@@@@L@n@@@@l@|@n@@@@@<@B@X@@@@^@ @x@@@@@t@@x@t@r@N@f@@@@@P@R@@B@@@@A@@@D@@@@@l@@@@J@@@@Z@@@^@@@V@@@@ @@@@F@@@(@.@:@@@h@,@,@,@@(@@@@@@@v@|@J@<@:@@.@4@@:@4@@@b@@@@H@@@@T@@@@@@@@~@l@@>@j@@@X@@Z@>@@@x@@<@@@@@@@@@2@$@@@@S@ @@@@@X@D@`@>@X@@@@L@@@(@@@@@z@p@N@w@@}@5@w@@l@8@@@@<@ @@@@@@@`@l@@@>@@!@;@f@H@.@@@@V@@F@@@@@@@@@@f@l@^@@@@"@@>@v@@@@r@@D@@@<@@<@N@@@J@:@@@E@@@@@@@@@<@@@@,@ @"@@\@@2@@@@@@@@@@@@@2@@@@@@@H@J@P@d@@@@*@ @@@@@@|@P@@2@@@U@D@j@T@p@@@@p@F@ @@@@@@J@@@ @P@f@@$@8@p@@@@@l@@@|@@@@@@@@@@h@j@`@2@@4@ @j@@@X@b@@z@v@x@D@X@@@~@U@@u@b@n@@@&@b@H@(@@@|@z@@X@@@s@ @@@H@(@@@@@@@@@*@@@(@@@H@@@@d@^@D@@2@@|@@n@@@@T@f@@+@{@@@L@@@@ @n@R@@@@r@2@@@@V@@ @B@$@$@@@@@@@@@f@@>@p@@@F@R@"@@@@@@t@x@^@4@Z@@@@@^@@@0@@2@x@2@N@@@ @@@?@ @@r@$@@@@@f@@@>@@@@@@@@@@<@v@@@@@V@4@@@@@@@@@@>@@r@Z@v@\@@@@D@<@l@@@@J@@"@@@@@;@]@@@@(@@@@*@P@@ @@b@@2@ @@@4@B@J@0@r@@R@@@@@@@@@@@@$@$@@@@@N@@d@>@F@B@@"@@B@@@@T@p@.@*@T@@2@N@D@B@R@$@ @@@@@@@4@@@@@@@@>@@@@'@8@`@@B@.@>@@b@P@@@@@@@l@@@@|@H@@@F@,@"@H@,@:@@@@@@@@@@@@@J@6@@b@@@.@@z@@@@n@p@f@@@@@@@@@P@$@@D@@@@@@@\@F@"@@d@T@@@@@@j@@V@4@@,@@@@b@H@@.@@@@@8@:@@f@@@@>@`@@@L@@X@ @@R@@@@@@@@@"@z@@@@v@R@(@T@v@d@r@B@@@@|@B@@@@@@`@@@&@2@@>@P@^@v@x@@2@6@@@@`@@@@@@@ @z@n@@@d@4@@.@(@<@@@@@,@@H@@@@@@@>@@L@@@V@@@@F@@@@@@p@@@6@2@4@@@.@@X@J@@@Z@@ @@>@@@D@B@@r@@@ @@@@@@@@J@j@@@x@B@@@2@@@@@@@@d@@j@@D@X@@R@@@@@V@@@@(@@@\@(@ @Z@@d@z@@@@R@@@b@@@4@$@p@d@~@@f@~@@@ @@@@H@@,@@@@@R@V@@@@h@r@@@X@h@@@@*@@@`@$@@@@@@r@R@"@@@@@@B@4@`@@@t@@@D@@H@D@@ @@@@@@ @@@@j@@"@@(@$@z@f@J@@@@@@@@n@r@L@J@r@@@@@*@0@@@@ @@@@R@@@@@6@,@@@v@B@@@0@@@@&@@H@`@@(@4@ @@@@@@$@@p@<@@@|@0@@@<@T@@X@N@`@0@l@R@`@@l@Z@@4@ @@@ @ @@@@|@l@B@2@V@@@@@@@:@@@0@T@@@@.@@@@@@(@@@P@@@`@`@@a@@{@=@*@@l@.@z@@@@f@J@\@p@@|@@r@z@r@@`@H@@@@@@ @@`@8@j@@L@6@4@4@`@f@4@@@@@@@@@@@N@z@@@@n@@@@@@@@@@@@@@:@N@P@@@"@^@@n@@@@j@(@4@@@@H@2@@@@@V@.@D@8@.@@@@@@N@@@4@@@@D@t@~@@@j@@@@@@@@@b@@@@@@@@4@@z@@@@@@4@p@N@@@f@X@@@@P@V@@@@J@B@ @d@@@@@@`@j@p@~@$@d@@@Z@@@@@~@H@@@@@Z@@@@@@@x@@@:@@@@@@|@f@L@2@J@X@@`@@@@@*@@@@t@@ @@@@~@@<@ @V@&@`@@@@ @<@@@D@t@@8@L@@@@v@r@&@~@@|@V@*@@@@<@@@@@r@Z@@L@@@,@@|@@@@v@~@@x@@@@,@@@@@@ @X@f@@4@,@@@h@~@@@b@@R@@N@@@@v@@N@@@@@n@n@@@@V@^@@@d@B@@@@@@8@~@@@*@"@f@@j@@*@@@\@@@p@$@0@(@@@@h@h@N@>@@@&@@@@@@.@n@@@<@z@@(@:@@@J@@ @`@@n@D@@~@S@@@>@d@@@\@n@@@\@@@@@<@.@.@n@N@@Z@d@@d@@@@@@@@@@D@@l@@@@J@@@h@@@L@@@@(@@@8@@@@@t@p@r@:@@@B@$@@@@L@@@@@@|@@@@8@b@^@V@@@@@@@`@@@@@@@h@f@H@(@4@@ @@z@@@(@@@ @@@@@B@@@X@H@@|@*@6@@@@p@@6@@@@@L@@@d@*@N@@^@X@"@$@<@$@H@@t@@@@@ @@@@@@@@@@@@Z@@@@^@t@@2@@F@`@@&@@8@@@@@@|@r@d@@@@0@b@\@N@@<@2@@@@@p@*@T@b@F@\@@J@,@@>@0@@@d@@@@@@t@t@x@b@P@@@,@@.@n@@@@@@@@,@@@@@<@X@f@~@@@>@ @N@@R@@d@@@@(@ @@N@@@@@Z@*@\@p@|@@~@l@@|@@@@@@@@@@@@@@@@$@@@@z@@@@@@@@$@@@@<@0@@@V@&@@@@@T@@@8@J@@@@|@@ @R@@*@B@@@@~@8@"@@@@v@@@@@@@@R@P@<@B@ @@ @@|@@@$@@p@@@(@@@L@Z@z@@@@@`@@@@@@6@p@Z@ @@ @D@@@@@@@@l@@@"@@@@F@@@@@@@@p@@@@ @<@@@@@@@@@d@@@@D@@@H@@@@N@T@@@F@@\@@ @4@F@@@@@@@:@@@@@T@@T@b@v@x@@@,@x@@n@@@@@@@x@x@^@6@*@@ @@@@n@@@D@f@2@@@@@@@@@@:@@@@$@@^@@b@4@@@@@b@X@@@@@@^@z@@@@@@@@t@@@@@@@@@@@@B@P@@@@@@@@l@4@@@@@N@@@f@@@@n@0@@,@@@\@@@@0@@@@@@p@@@@@@@@@@@@@b@ @j@@b@@@@@@@x@@B@F@2@@"@@@ @V@z@@@@@@@@v@Z@@n@@>@l@@@@@@@s@@"@ @r@0@@@@@\@h@@@n@f@@"@@@@b@@@@@*@j@@@@@@@@@@@@@@@@B@@@@H@v@@J@$@X@@@@l@@@T@*@@@T@P@Z@@@@@@@V@j@@~@@@T@@@@e@@@N@@8@@R@ @@@@@@@r@^@j@ @@:@@@@p@@@@@@l@@@h@@$@z@"@@\@j@@@M@@@e@@ @v@@@(@\@2@.@@@b@,@@@d@J@@|@@@(@@@@@@T@@@@ @4@F@h@@@@@@@@@@N@ @N@p@F@d@@z@@@@@@@@h@@@@,@ @@F@@@,@@b@@@@@@Z@$@@@@@@@@"@@z@*@\@@@@@@@h@J@L@:@:@ @@@@ @Z@p@r@@@@,@*@@"@@@t@@@@@!@J@X@@|@&@@,@2@N@@@6@@T@@0@@@^@6@@@h@@d@l@@@@@@@t@@^@@F@@@B@@@@@@@@@@@@l@N@l@@@&@p@T@F@ @@@@T@d@@@ @P@@@@@@n@l@@J@B@@H@ @|@@@@J@@@@J@@p@@@@@@x@f@H@8@N@@@,@@@@D@f@r@@@@8@`@@$@6@@@@@@@@@@n@@@p@@@@@@j@@4@@b@t@@@@Z@@@`@|@@8@@L@@@@x@@@@@l@@@D@@@@@ @@ @@@@@6@@@@@@@@X@@@T@\@@6@@d@F@z@@@$@@@@@n@@:@D@^@@@@@v@@\@X@ @@@6@@@@@@@l@^@>@Z@@@$@@@@@6@F@z@@@@$@L@@@v@ @@H@@R@P@@@@\@N@W@4@@@^@\@:@Z@@@2@@@@@@@@@@@<@(@h@@@@@D@@@@@j@>@@@@@@@@@"@@@t@l@ @@\@@@@@@@@@@@2@f@@@@n@@d@@v@@@@D@@@x@r@@t@@@@F@@"@@x@$@@@@@@|@t@P@8@D@4@.@6@@@@@D@>@@@@2@@H@@@h@@R@"@F@~@s@}@@ @@@O@@@V@@B@~@@p@@V@@@@@@@@@<@T@(@@,@~@@(@@@@@@@@P@@@0@ @,@@@@@@@,@@8@@@@@@T@P@@@@@J@@@ @@@,@h@@@ @n@@@@\@|@j@@l@J@*@@@T@@@`@:@@@@@@|@@V@B@`@$@6@4@@@@@H@H@@@@@,@d@@@T@@@@"@~@0@x@@?@@@@@@@@@@@@@@@@r@@X@v@@T@@@@@@@4@\@@@@@(@.@@j@B@P@@V@@f@t@@@@@ @"@@H@@@@@@8@@@8@@@@n@4@@v@@@j@t@@@@~@@@@F@L@.@@@h@B@@@j@.@@@@@~@@r@B@Z@@L@"@@@@@@@@@@n@@@@@@@@@6@x@H@\@@@@0@@@@@@D@@>@@@@*@@L@@@@*@2@@@@@@@<@@@@@@d@@@@@@>@J@L@H@@@@@@Z@@@@@@@@@l@@@@@@@@@@.@@,@R@@@@v@t@"@@@@@@@@N@@@@B@@@@J@:@@@@@n@@f@J@f@@@@@@@@@@@@@`@^@@@@@R@@N@@@r@@@6@@@$@@@@@@F@|@j@@@@@@@@@@@@0@@@@@@@@@R@@@@@0@J@@ @x@@ @@@@6@$@@@>@z@@H@N@@@~@@:@z@@@@@@@@@@@@@@T@<@@@@@@,@@@@<@v@B@@@@l@@4@@@@@@~@@T@v@D@8@.@@@&@ @@@@@@@*@X@@@@@@X@@@8@F@@n@r@.@F@&@F@@f@@W@h@'@+@d@@@@`@@@6@@@l@@ @"@@z@D@@@l@4@@@B@X@@@@t@@@@@@@>@(@@@@@@Z@@j@8@L@@@@@b@@v@@@X@@@@@@@@@@4@<@@@@$@f@&@@@@l@~@(@@@@@@^@z@@@:@<@8@V@"@@*@ @@@@@@ @&@&@\@R@@@@ @*@f@@@@@@z@l@@4@@@0@\@L@@@@Z@@@*@@@@6@l@@@n@@@6@@@4@@@,@@@@@ @B@@r@@@@@,@B@ @*@@P@X@@D@H@@<@`@@@@Z@@@p@@^@b@@r@@@d@@@@@@p@L@H@@@8@@@r@P@R@Z@@@@@@@d@f@>@J@@@,@@@ @@@@@@@@ @.@h@P@@@@@@@x@@@N@@@@@.@@@h@W@-@@@r@2@@@@$@4@J@b@f@2@(@@@ @@@@@<@ @@F@@@@@@@T@@@@@P@6@|@H@@@@@@@@@6@(@X@@`@`@@@@D@B@ @@H@@@@L@~@@@@D@t@@V@R@@@~@t@@@@4@@@@@@@h@z@B@&@@"@,@@@@@@@@@@@@@@@2@V@d@@@@J@J@p@@@@@0@>@@@@B@@J@@@@@@@0@@f@@@@@z@@@@@@h@@@D@n@@ @B@@B@@V@P@@@t@@L@@\@x@P@@@@@@@$@@V@H@<@\@8@*@N@@@@@@@x@@@P@p@@P@ @@@@>@@@@p@>@@.@@@@@@z@^@t@B@F@,@@&@$@@@@@@@@@@@@@@@L@V@v@@@ @@ @~@N@@@(@@@@@@@@@@@@2@@@R@|@@&@@@t@8@V@@l@@@@@8@@@@@@`@.@@f@@.@@ @0@~@@j@@"@@@L@@@@@@@@@@@D@@Z@D@@@@p@@ @@d@F@@@@@@"@@@x@f@@@@@@~@@@D@>@L@H@4@.@ @$@@@@@@@@@@@@@@@@R@N@@@@@@@@ @v@^@@@@@@V@@z@P@2@6@>@P@N@@6@"@@@l@p@@ @.@@@@6@@r@:@j@@@@@(@:@R@@@@H@x@@@@@B@@@@@P@@@@@@@"@z@@@@@@(@@@R@J@^@Y@@@@@~@6@@@@@@@@@@@@n@n@L@<@<@@@$@@ @@@@@@@@@@@@@@@@"@@L@J@n@@p@@@@@0@@2@P@@@@@*@@@$@@,@T@@h@@@@@@V@p@(@@@@f@L@@@L@@R@v@d@@@H@>@J@p@@@@Z@@@@@@@4@r@@@4@@@@@&@Z@@@@@@@@@@m@ @r@@"@v@,@@@@&@@@@@@t@r@X@@@X@<@:@J@"@2@@ @@@@@@@@@@@@@@@@@@$@ @0@(@V@T@@@@@"@:@|@l@@,@@X@X@T@@@\@@@@@@@ @.@@@N@@@@@|@N@.@@&@,@@$@@@@D@@ @x@@@@V@@N@>@L@@@@@.@@z@:@P@<@4@<@$@<@@@Z@*@@@&@@@*@@j@l@@N@@@|@V@&@@@@@v@h@L@P@:@\@<@@@@@@@@@@@@@@@@@@@@@@@ @@,@@,@>@b@z@@x@@@V@@\@@@@@@@@@B@D@@R@&@ @@@(@@@@@L@V@@n@@@@B@@@@@@@@@@|@@@b@4@@@@@:@@>@~@4@@@,@4@\@P@*@P@@ @J@@@@7@t@@@@5@@@@@@|@@@X@(@ @@@@@@V@L@<@"@J@B@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@@H@\@d@@@@ @@@<@$@N@^@j@@@@@8@@@@@ @ @@@@@@n@R@@4@@@@@@@@ @@F@4@6@@@@R@@@`@J@@@ @"@@@@D@@@l@^@~@r@h@@@r@d@3@@r@D@@H@@\@@@@H@*@(@@@@n@r@f@@@V@@@ @*@@@(@@ @@@@@@@@@@@@@@@@@@@@@@@@6@@&@H@P@v@@j@@@@@@@@>@z@`@@@@\@Z@@@@@@Y@N@ @@"@@@@@(@R@.@@@@@*@@<@@6@@J@@@@j@@"@4@@4@@@*@.@ @.@@@v@@ @@@@@@@*@4@@~@J@@@l@ @>@@@@@@j@R@Z@<@@8@@"@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@V@P@`@`@@@x@@@@@@@@@T@@@@@r@@@@@@;@@r@@E@T@@@@@@@@$@@ @$@$@@4@l@6@@(@$@.@8@@H@b@"@@$@"@@P@@n@@:@@<@N@@@f@@@@@J@@@@t@>@@@@@@n@@V@:@R@L@N@@@4@@@@@@@@@@@@@@@|@@@@@@@@@@@@@@@@@$@@<@>@\@n@T@l@@@@@@@@@@$@~@@@@|@@@@0@1@@@@@f@l@`@<@@z@*@&@T@6@@@@F@r@ @@@&@*@@@@`@R@D@R@z@@@@\@@@@@ @h@b@@n@@@@@@f@:@@$@@@@@@T@X@b@@@<@F@&@*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@J@>@@@X@J@\@@@@@@@@@T@ @N@@@@@@@\@@@@C@~@[@@@8@@@@n@x@@@8@$@@^@@D@:@@P@@@@@@z@"@H@d@@,@@@@@&@@@@@|@@@@@P@@@.@@@@@@h@d@L@2@P@,@:@2@ @@&@@@@@@@@@@@@@@@@@z@@x@@@@@@@@@@@@@@@@@@@ @,@@Z@l@R@r@x@P@@@@@@@D@@\@@@@V@@@z@Y@@@~@Z@J@@@@@@@@V@@@@@@@@@.@@n@d@@@R@@5@/@]@@x@@Z@X@F@@H@@@@@@@@@D@0@@@@@@n@X@^@l@8@R@&@ @@@@ @ @@@@@@@@@@@@@@@@@@@|@@@@~@@@@@@@@@@@@@@@@@@@(@D@F@:@l@h@@@@@8@F@@@@@T@@@@@@8@@@~@@@@$@@@*@@@@@@@=@E@@@@@"@@D@@@ @r@&@t@@@j@4@@\@@X@>@<@B@ @R@@@@@@|@d@\@<@6@.@.@*@ @@@ @@@@@@@@@@@@@@@@@@@@@z@@@@@@@@@@@@@@@@@@@@@@ @,@ @4@@@T@f@n@@@@2@,@@|@@@@@@@@@@@@@@@@0@@@@@@@@@@@@L@/@N@@@@2@l@~@ @&@P@@D@N@@,@@@@@L@ @@ @"@@@@@@@x@z@d@F@>@8@J@@@(@@@$@@@@@@@@@@@@@@@@@@@r@|@`@@r@@~@|@@@@@@@@@@@@@@@@@@ @@@@@4@ @4@X@Z@@@@@@@n@:@@\@J@@@@v@>@4@`@V@j@@@6@@@@t@@@R@@@X@@D@ @8@B@.@@@@@@@@@@^@ @0@@@@@@@t@@@@@x@P@H@6@.@.@(@@*@@ @ @@@@@@@@@@@@@@@@@@@@p@j@|@x@@t@@@@@@@@@@@@@@@@@@@@@@@@@:@@J@x@<@z@@@@@@@.@@l@@(@p@"@@@@ @ @"@l@@@V@f@r@@$@@@&@f@J@0@@Z@.@T@t@@@@$@4@@@n@@@@@@@@@~@@t@N@b@`@@@8@@@*@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@v@z@|@v@t@~@~@@@@@@@@@@@@@@@@@@@@@@@@6@(@4@v@B@@~@n@@@@@@@@,@@@@@@@@@@@P@n@x@@@6@`@@@f@@@@@@@@@@x@$@r@r@@z@P@Z@@@@@@@@|@@h@h@L@Z@F@:@T@J@L@,@@"@@@ @@@@@@@@@@@@@@@@@@@@@@@r@\@j@@t@b@@~@@r@z@@@@@@@@@@@@@@@@@@@@@@@ @@2@2@6@<@>@v@@@@@r@@~@@@N@@|@@@@@@@@@@@@@@ @*@>@V@D@@ @F@@@@@@@@@@@@z@^@V@L@R@B@P@2@:@>@0@@8@ @ @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@f@@l@@v@p@@@t@|@j@@@@@@@@@@@@@@@@@@@@@@@@@@.@@<@T@@@b@@n@l@@R@@H@|@r@x@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@d@|@V@F@D@8@@@:@.@:@@@4@ @ @ @@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@n@j@n@x@v@v@@@v@r@@@v@p@@x@z@@@@@@@@@@@@@@@@@@@@@@:@@@@H@,@,@@^@h@H@V@8@<@:@T@V@@@@@p@r@x@@@@h@@@@@@@@@@@l@p@r@t@p@@@@@`@0@N@4@8@8@F@@@@0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Z@h@\@v@j@`@x@b@h@n@t@v@b@|@@@~@@v@@@@@@@@@@@@@@@@@@@@@@@.@@@@@@@*@4@*@2@6@:@F@P@b@d@:@<@<@\@j@:@R@R@^@l@z@@h@J@h@@z@>@@@@0@ @n@.@(@@@"@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@z@h@t@~@x@x@z@@l@@n@l@@z@|@@@@@@@@@@@@@@@@@@@@@@&@@@@@@@"@@@@<@ @(@B@X@$@T@R@x@8@X@F@L@\@P@d@D@H@@@R@d@@D@R@t@>@@@J@@F@X@,@L@:@:@>@@"@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@b@h@d@h@V@X@h@\@T@h@n@p@`@r@|@l@@r@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@8@ @D@B@@@@@6@,@@@@@2@(@,@"@ @ @@@@@(@@@*@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@P@v@^@h@h@^@b@j@n@n@V@^@\@\@p@T@h@b@f@@t@@@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@ @@@"@@@@@@@@ @@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Z@d@V@f@^@j@r@p@d@`@Z@p@v@z@@t@@z@v@@t@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@0@@$@@@.@@@ @<@*@@@2@4@ @@@@@@@ @@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@`@L@T@N@R@^@`@l@N@V@f@d@b@~@h@z@b@j@j@l@@@@z@~@x@@@~@@@@@@@@@@@"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@p@N@d@f@b@T@p@X@b@d@d@`@f@n@j@V@h@@v@z@@@@@@@v@@p@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@`@\@J@^@F@X@d@V@^@b@`@x@f@t@j@j@h@t@l@v@x@p@@n@~@~@|@@@@@v@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@sunpy-0.8.3/sunpy/data/test/EIT/efz20040301.110010_s.fits0000644000175000001440000042350013203275053021105 0ustar nabil00000000000000SIMPLE = T / conforms to FITS standard BITPIX = -64 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 128 NAXIS2 = 128 DATE = '2004-03-01' / Date of file creation TIME-OBS= '11:00:10' / DATE-OBS= '2004-03-01T11:00:10.612' / UTC at spacecraft ORIGIN = 'Rocket Science' / Rocket Science = NASA GSFC DATASRC = 'LZ file ' / TELESCOP= 'SOHO' / INSTRUME= 'EIT' / OBJECT = 'full FOV' / BUNIT = 'counts / pixel ' / WAVELNTH= 195 / 171 = Fe IX/X, 195 = Fe XII, / 284 = Fe XV, 304 = He II FILTER = 'Al +1 ' / DATE_OBS= '2004-03-01T11:00:10.612Z' / SCI_OBJ = 'CME WATCH 195 ' / OBS_PROG= '195_10S_AL_1.000 ' / CMP_NO = 1 / Unique campaign instance (1 = synoptic) EXPTIME = 12.594 / s (total commanded + shutter close) EXPMODE = 'backside ' / FILENAME= 'efz20040301.110010' / CFTEMP = -66.71 / CCD cold finger temperature (C) CCDTEMP = 7.34 / CCD temperature (DN/100) CTYPE1 = 'Solar-X ' / CTYPE2 = 'Solar-Y ' / CRPIX1 = 64.5 / Sun center x, EIT pixels CRPIX2 = 64.5 / Sun center y, EIT pixels CRVAL1 = 0.00 / CRVAL2 = 0.00 / CDELT1 = 2.63 / Pixel scale x (arc sec, fixed) CDELT2 = 2.63 / Pixel scale y (arc sec, fixed) SOLAR_R = 372.27 / Solar photospheric radius, EIT pixels SOLAR_B0= -7.22 / Degrees SC_X0 = 0.00 / s/c yaw (arc sec) SC_Y0 = 0.00 / s/c pitch (arc sec; -109.14 after 1996/04/16) SC_ROLL = 180.00 / s/c roll (deg., Solar north + CCW from nominal)HEC_X = -139130208.00 / s/c heliocentric ecliptic x (km) HEC_Y = 46576272.00 / s/c heliocentric ecliptic y (km) HEC_Z = -94896.31 / s/c heliocentric ecliptic z (km) CAR_ROT = 2013.00 / Carrington rotation at earth COMMENT CORRECTED DATE_OBS = '2004-03-01T10:58:25.120Z' COMMENT COMMANDED EXPOSURE TIME = 10.000 s COMMENT SHUTTER CLOSE TIME = 2.594 s COMMENT LINE_SYNC = 'no' COMMENT CAMERA_ERR = 'yes' COMMENT IMAGE_OF_SEQ = 0 COMMENT READOUT PORT = 'B' COMMENT NUM_LEB_PROC = 3 COMMENT LEB_PROC = 26 (no ROI) COMMENT LEB_PROC = 27 (no occ mask) COMMENT LEB_PROC = 12 (Rice) COMMENT BLOCKS_HORZ = 32 COMMENT BLOCKS_VERT = 32 COMMENT P1_X = 1 COMMENT P2_X = 1024 COMMENT P1_Y = 20 COMMENT P2_Y = 1043 COMMENT N_MISSING_BLOCKS = 0 HISTORY Version 4.0, 2001 December 10 HISTORY Image linear resampled to (128,128) for SunPy END @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@r@@x@@v@p@b@z@h@t@`@t@^@j@l@j@\@d@X@f@`@P@b@X@^@N@b@^@P@r@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@"@@.@:@@*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|@@@x@z@|@p@l@|@|@|@v@x@d@`@d@f@j@j@j@L@Z@D@Z@`@L@Z@^@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@\@@@ @ @@@ @@ @@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@z@@~@x@z@z@j@l@@h@h@p@`@^@f@h@f@^@f@T@Z@T@N@X@P@P@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@ @@@@@@@@@@2@@(@8@<@&@N@@@@&@@@&@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@z@~@@@@t@|@V@|@b@l@p@l@h@h@h@h@|@`@d@j@X@X@T@N@T@V@R@T@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@@@0@ @@ @@@@@0@"@,@.@@B@>@,@\@T@b@\@,@J@<@(@:@@@>@$@j@&@&@0@@ @@@@@@@@@@@@@@@@@@@@@@@@z@@r@r@@p@h@^@v@n@r@\@j@d@\@j@R@X@X@^@T@X@V@Z@P@L@Z@@@@@@@@@D@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@,@@@@@ @$@"@,@&@,@&@ @6@2@N@h@Z@x@V@@@@8@D@@(@*@@&@*@@@ @:@@@@@@@@@@@@@@@@@@@@@@@@@@~@x@@~@z@|@r@n@l@n@@d@h@f@b@^@d@V@V@T@X@\@P@T@X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*@J@ @$@0@(@F@2@2@X@D@T@d@D@@`@|@@@@@@@l@^@z@F@@b@t@^@B@N@^@h@n@:@J@"@@@@@@@@@@@@@@@@@@@~@@x@|@@@@v@@|@r@v@p@^@f@`@h@`@h@j@X@^@X@P@^@T@^@f@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6@"@&@2@ @N@0@&@^@6@\@X@D@n@@@@@@@l@@|@^@@X@r@@@r@V@l@`@p@\@Z@Z@0@@@4@.@@"@ @@@@@@@@@@@@@x@@@@@z@z@|@@@~@@@\@z@r@Z@p@n@T@\@l@X@^@R@N@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@$@ @*@@:@H@F@X@N@J@h@J@f@@V@r@@8@@@@@@(@.@@@@@@@@@@@@z@@@l@j@V@P@J@4@4@2@(@B@"@@@@@@@@@@@@@@@@z@@@@z@@n@v@z@h@n@`@p@d@h@d@L@f@f@X@^@X@X@N@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@D@"@:@,@ @Z@:@b@n@Z@@f@b@@p@@@~@@@@@@@h@h@@@@ @@@@@@8@@@@@@@@@@n@J@\@^@x@b@H@6@&@@@@@@@@@@@@@@@@@@@@~@@~@r@r@r@`@r@z@\@`@h@b@T@^@Z@R@L@X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @*@,@4@&@8@V@D@B@l@X@|@^@~@@@@@@@@@@@@@@@@8@J@@@ @@H@V@<@@@@,@@@@@@@@@@^@h@6@@@ @@@@@@@@@@@@@@@@@@@@@n@@^@t@`@x@`@h@r@Z@f@\@P@f@X@^@\@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @.@ @.@*@J@V@6@@@x@b@@~@@@@@@@@@@@@(@,@@l@f@@B@f@@@@@@~@x@Z@@@@D@~@@@R@@<@@@@@@@j@~@h@\@*@.@@@@@@@@@@@@@@@@@@@@|@@l@x@d@p@l@`@^@v@b@h@j@d@R@N@`@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(@@@ @@8@4@0@d@N@Z@@@@@@@@@@@@@@B@B@R@l@,@^@@@@@f@|@^@f@,@@@@@0@@@ @@.@@l@|@@@b@P@t@|@@@@@@^@(@L@@@@@@@@@@@@@@~@@@@@|@t@x@t@v@p@z@t@b@x@b@Z@\@l@f@V@f@@@@@@@@@@@@@@@@@@@@@@@@@@"@@@ @4@@@ @N@&@R@n@r@v@@@@@@@@ @(@@f@:@b@@~@@@@@X@@~@@@ @@@@x@R@@@@l@@l@n@z@H@@@@@@@@@@@@@@f@B@&@@ @@@@@@@@@@@@@@@@@r@j@z@r@t@v@j@f@d@^@f@x@`@n@Z@Z@@@@@@@@@@@@@@@$@@@ @@@@@@>@.@N@@8@j@H@H@>@2@@n@n@@@@@@h@T@r@@@p@t@@@@@@4@V@J@j@h@@ @(@F@ @-@@@b@6@8@@@ @t@@@@@6@@@@ @@@(@@b@~@t@T@@@@f@>@>@*@@@@@@@@@@@@@@@@x@~@h@@~@r@p@h@f@d@d@l@l@x@T@p@@@@@@@@@@@@@@@@@@@@@@@@@@P@@.@Z@2@P@H@T@|@r@@@@@@@D@*@l@@@@@@0@$@4@2@@j@H@@@@H@p@@)@e@@@@@@@z@@@J@@ @@@@6@@@@N@@x@B@@@@@@@@@t@N@:@6@@@@@@@@@@@@@@@@@z@|@x@@z@r@t@l@d@V@h@z@^@^@x@@@@@@@@@@@@@@@@$@@8@@@8@@@*@ @B@N@6@@\@l@@@@@@@@@:@@Z@@@D@V@z@f@@h@@@@x@@@@2@&@@ @@G@@"@0@@@@@@@E@/@%@@k@w@@@@ @@P@@j@@@\@V@@P@@@@@@l@,@$@@@@@@@@@@@@@@@@@@|@l@@~@n@@r@^@v@l@j@d@@@@@@@@@@@@@@@@@@(@@@@@6@0@"@Z@J@x@@@@@@@@@j@R@@@@@@0@@@"@@@n@@@@@@@,@x@,@@p@@!@b@(@Z@"@d@@@M@@@@@y@s@F@@Q@~@@@@@@*@^@@@@@l@f@@@@j@f@V@2@.@@@@@@@@@@@@@@@z@@@@v@r@@f@~@@t@j@@@@@@@@@@@@@@@@(@@@@*@B@ @$@f@J@|@@\@@@@@@"@(@h@@@@@@@@f@@@@ @@@F@@@@6@@T@^@@@@@@r@L@@@b@@@@@S@+@@\@V@F@@_@@>@@z@b@ @@n@@@@@@h@@@@n@^@Z@<@0@@@@@@@@@@@@@~@@z@@@p@n@t@f@v@d@p@b@x@@@@@"@@"@&@$@@$@$@$@B@@T@B@r@N@H@@P@j@@J@@@@@@&@0@*@@@@:@:@@@@8@J@B@J@(@"@"@@@@@2@h@@@l@z@@l@p@@@@8@8@d@@`@b@J@@&@r@@@U@@8@@@Z@<@@z@(@@@$@@@,@@@Z@V@@@@@b@X@*@8@$@@@@@@@@@@@@@@@x@@r@x@p@@`@r@r@@ @ @@@@@ @@.@ @@"@@6@L@2@0@H@b@j@X@v@n@z@@@@:@@@\@l@@@$@h@~@@>@`@"@@@@V@@@@@@@@z@@h@@@@@@0@d@@8@@@@B@&@@6@R@@@@p@n@@@Z@/@@ @Y@?@\@'@ @@@@@,@@@j@@@@@x@b@f@D@@@@@@@@@@@@@@@@@@r@l@|@x@x@v@@4@@@*@@@@@*@@.@6@$@"@F@8@f@H@R@|@@@@@@@@z@^@@@@l@@@V@b@@@@V@d@@D@@@@x@@@h@@@@d@Z@X@$@@0@@ @@\@@@*@T@@@@v@@@l@D@@b@(@@@@A@Y@)@0@4@z@@@@@@(@@@n@@@~@@@N@.@@@@@@@@@@@@@@@@@z@@l@r@j@f@|@@2@2@4@*@@&@D@2@R@T@Z@^@>@f@@^@@@@@@@@@n@t@@@@2@@.@t@@@@&@@@@J@ @X@@@@@@@B@J@@$@y@@0@@@B@@@x@@@@@@~@@@b@@@@T@@<@@P@v@@@@V@@@@@h@@@@2@D@@@\@@&@@@@@@x@.@@@@@@@@@@@@@@@@@@@@|@x@~@ @ @@"@@@$@0@@4@V@P@>@4@L@^@n@@l@@@@@@ @t@t@|@0@8@@ @|@@@@t@Z@@p@0@(@@@@@D@@@N@@p@@v@@.@B@.@@v@t@@@@$@@R@H@@@@X@n@@@2@@@@J@b@@@@V@2@l@@@@b@@@@@@@@t@@*@T@ @@@@T@D@@ @@@@@@@@@@@@@@@@@@~@t@|@@@@:@L@@@0@F@R@>@r@J@d@X@J@z@@@@@@@@@B@b@@@@@@@r@@d@@>@@t@P@@@@@@@@@Z@@L@@z@@@l@,@@ @x@@@@v@@@z@^@@@@@@:@,@ @ @`@@F@@@@v@d@@@@@@@@z@,@6@B@D@@@@@N@~@Z@@@v@n@@@@@@@@@@@@@@@@@@x@@l@l@@2@6@*@@<@L@6@X@V@J@V@F@\@l@@@~@@@@@@b@@x@@@Z@@@(@@@.@@@@@T@@D@r@j@@@@@<@@@@0@@@x@@`@@.@$@@@@@|@@H@@@J@p@d@@r@`@@@\@d@@@x@@@"@@@@ @@@@8@@@@@F@@Z@.@@@D@@@@x@L@\@:@@@@@@@@@@@@@@@@@|@@ @<@4@2@$@$@2@H@:@l@b@^@@Z@@@@@@@ @@L@@@@*@2@@@,@4@@@@@z@|@@@@*@@n@@4@@D@@"@V@@@@@ @@@@`@@D@2@@@@n@@@.@@:@@x@8@@ @@@@@@@@d@*@@@@@@@>@|@@R@8@@^@^@*@@F@@@@d@R@<@@$@@@@@@@@@@@@@@@|@z@@P@|@\@~@@H@v@x@@@@@@@@@@@@>@f@@@@@@X@@@P@@^@@@@@@@@T@6@@Z@L@@ @@r@@:@T@T@@@@J@d@:@@@@P@@@(@@@@@l@@@@@@6@@Z@L@ @@@@f@P@>@@@@@@x@@|@@@@n@4@@@~@F@@D@@@@@t@P@@ @@@@@@@@@@@@@@@x@@ @P@F@n@N@F@@x@@@t@@@@@@@@@(@b@^@@@@p@@@F@@@D@:@6@@n@@@R@2@l@j@@@@@@@@@@@L@@@$@@6@z@@L@@@l@@@@(@@@@d@@h@@@T@@@@@@@d@@@@<@Z@D@@@Z@@v@@l@R@@@@@@@<@@@@r@`@:@ @&@4@ @@@@@@@@@@@@~@@F@P@V@L@p@P@@@l@@@@@@@@@@6@V@@@@,@2@@@@v@,@@@ @`@t@R@@@@@v@@@@@@@@b@@@@Z@@@H@@,@@@@*@^@R@@@@@@*@@>@h@@@t@@J@P@@@@z@h@@@@@@@(@R@@@f@$@(@@@F@@@@@$@ @@@v@j@j@D@@@@@@@@@@@@@@v@v@@`@@`@@@@@@@@@@ @@:@8@*@@@@@@@@@>@<@X@T@@@@~@@f@@@@ @@@Z@@@@|@@@@@@@@P@:@L@@@@h@0@*@@P@@@@ @L@@@@@@@@@@@@@@@@@v@@@@@0@z@@@@&@@&@\@@@ @.@@@X@$@@@@n@@j@R@2@2@@@@@@@@@@@@@X@f@f@n@@t@@@@@@@@@t@@8@j@@@8@P@@ @@@:@(@J@@T@H@@\@r@@*@@@@@@L@`@@`@@@R@,@$@F@@@@@:@>@Z@X@p@@@0@L@<@@6@@p@8@@^@X@@.@\@&@@@@~@`@@@j@@ @@@V@@@@N@8@6@@@@@ @b@@@Z@@@@@@x@d@^@@@@@@@@@@@@@@@@@@@@@@@@@6@0@2@@x@@@@@D@^@@@T@@@@@@@f@@@@@@@@r@@@2@h@.@R@@n@j@@@@D@@F@@@P@v@@@@@@@@h@ @@@`@4@@@@@&@8@2@$@f@@@`@|@@D@(@|@@@x@|@R@@@R@@@v@@@@$@@N@@>@2@@@@@@@X@^@&@@@@@@@@@@@@@P@@@@@@@@@B@F@@@@@$@@@@@@@T@@T@@Z@@@d@@@@Z@@@@@@@@ @@@@@(@@@X@&@@@`@@,@v@@>@@~@@@@@@@@@4@@@@@.@@\@p@h@d@ @@`@@ @@@&@@$@@@@ @8@x@@@ @@@h@@^@@x@:@0@@@@@@@@x@p@r@P@&@@@@@@@@@@b@@@@@@@@0@Z@N@@"@@,@D@@>@@@$@@L@@r@@@@@@@B@@@@@@l@z@@.@@@@8@@2@0@Z@@$@2@@@@d@@@&@^@@@@h@p@.@@`@p@@2@6@H@@@0@@t@@@:@@@&@@@L@@@@F@@@@@@|@@ @@T@T@@~@t@@l@@.@@@ @@@@@n@b@Z@T@@ @@@@@@@@@@@@@@*@@T@X@@@@4@F@@@@P@@@@@P@@8@@ @@*@P@@@@@H@f@@@@`@0@@@x@.@@ @*@z@@~@@B@@@@ @@@&@j@d@"@@@8@@V@8@D@8@,@d@@@Z@n@@@F@@@@@h@L@@@@@@V@@@@@@@@@@x@t@@@@x@V@<@ @@@@@x@@b@`@H@.@@ @@@@@@@@@@@@@@R@d@p@@@r@,@@@@@~@@l@r@8@p@<@@@ @(@@@J@~@@@@@Z@h@,@@@@@t@@@@"@@x@@0@@@ @@@@N@^@@@f@@B@8@@Z@@@L@6@@@@@D@@@L@@t@@@b@^@^@N@.@@@@@@@@n@6@@@d@@n@@@@x@^@.@@*@@@@@@l@@(@B@D@@@@@@@@@@@@@@@\@@@@x@X@@"@R@P@@@d@@@$@@v@@P@J@@`@@@n@@ @N@@@,@@@@@T@L@@@@J@F@F@@@@(@@@@@"@@@@b@@>@$@\@@@@H@@@@@ @h@@@@@r@@"@@@@L@@@$@@@Z@&@$@ @@ @v@@@@h@@b@.@ @@@@@@@@@@J@<@$@@@@@@@@@@*@0@"@n@@.@@J@@@r@@0@L@@@ @@@@P@0@@4@(@0@@r@@@@^@@0@@,@B@&@.@@@@@@*@D@@.@R@P@X@@8@ @@@@@@@&@p@z@z@r@@ @@@Z@b@@l@@@@B@z@P@@X@@@@@R@@@`@V@@@@@@@L@@8@@@@r@@@@:@@@2@,@@@@@@@@@@d@B@>@0@@@@@@@@@@@`@N@@@@@@@@ @@@@X@0@@@@@@"@@@@d@@N@ @@@|@@ @B@@@@@@l@@@@@@\@8@@@$@@@@@@@B@\@\@@@p@T@@D@"@6@z@@@z@@@@@b@D@@@@@ @@>@@@@@@@"@@:@@@@@@r@>@@@@@@@@@@@@@@@~@f@V@,@@@ @@@@@@2@@>@@@`@@8@$@@@@@@@@@@@2@@@@H@@@@@@L@@Z@&@@@@x@@@@@@@@@@@@B@@@<@ @$@@@@@,@@@Z@@@x@@@@@ @ @,@@d@r@@F@@h@@*@@@@<@>@@@R@@@@~@z@@@@@B@~@N@@@@L@@@@@*@$@@@@@@@z@b@v@V@$@@0@@@@@@&@@6@@@@@@X@j@@0@@ @;@@h@@@@@B@^@@@@@@@@@X@@f@@@@@@@@@@@L@^@6@v@0@@^@:@@@@@@@@@Z@N@@@@@v@$@@D@@@@N@N@@B@@`@N@~@@@@$@@D@V@@p@^@@@?@V@@@@"@ @@@@@@@@B@T@X@J@>@@@ @@@@@@@p@x@R@P@&@@@@@4@@Z@@@&@@@@@a@?@@8@@'@@ @H@F@@p@@(@@,@b@.@@6@d@@@b@@@n@j@@@`@*@@2@H@@@n@^@b@0@@@@@@@(@f@$@4@T@\@@@j@H@@@x@@@@<@j@@@@@X@@4@@@@@:@p@@@@1@@@t@f@@.@@Z@@@@@@N@@@h@@&@8@ @@@@@@@b@<@@@&@@@@"@x@X@@@@z@x@@@K@@@@@@@@@@H@<@>@&@@@X@@@@p@l@ @B@@R@D@"@`@J@@R@@@@@(@@@@ @:@@@@@@@@.@ @~@J@@@@@<@@b@@@z@@@@F@&@L@@@@@@@J@r@@6@D@Z@@@@@@@@@@@@@z@@@@@@@@X@H@z@@\@"@@8@@@@@t@4@H@@@@@T@(@@@@T@@b@@O@@7@@@@@;@K@i@i@@j@@4@@\@@@@0@ @@@R@*@$@@@@@&@@@@@@@@@@@@@@@@@@n@@@@@@@@"@j@@@$@.@@j@@@j@@P@@@"@@@@j@K@8@@@H@J@@6@@-@<@@T@@p@@h@@@@@j@`@@@@@v@l@@@H@>@:@4@@@@R@T@2@@@@6@@@@@@@@l@@@@@@ @C@{@@@!@@@V@v@@@,@@>@@@@@@ @@ @@@@@@@@@@@@L@@@@@@@@@@@@:@@@Z@@@@V@B@@@>@:@@@@@@@@8@ @@@O@T@@}@@@ @@@@6@.@l@@@@N@"@@@@@l@@T@@@@@@|@@@\@`@.@@@X@L@F@"@@@<@@@@@@@j@@t@@N@$@@v@@@@@m@@n@`@@.@@@,@d@@@@@~@ @@@@@@@@@@@@@$@@@|@@@@@@@@@@ @@p@@@n@@@@V@2@@:@@@@@2@@@@@@@@@g@l@@@@@@l@r@,@.@j@`@d@@2@@@@6@@@@\@@@@@@@@@@@@@@x@V@@@@@@\@~@@@p@"@2@@x@@r@}@^@@f@@ @r@@ @@@@@@~@Z@b@@@@@@(@@@@@@@@@@@@@@@@@@@@@@@@V@@@@@h@p@@@@\@x@ @&@@l@@@@@(@@@h@T@@S@a@@@@H@@@$@@@l@@@@p@@@2@@D@>@@^@@@@@@@@*@@*@@x@*@@@@^@N@@@@@v@|@~@@@h@@@@@p@]@H@b@@D@@@@@@j@L@@x@2@@@@r@@|@t@(@.@@@@@@@@@@@@@@@@@@@@@@@@@X@b@@@@@@2@@P@@@p@L@@@n@F@@@@@@@@@I@A@*@R@@7@@@z@@=@@@@@@@^@@@|@@@@<@l@@h@D@Z@X@ @@@@$@8@@@@L@D@@@@@n@R@@@@@ @@@@x@@+@t@@@Y@P@@4@m@@@d@@@@@@4@@n@`@<@<@@@@@@@@@@@@@@@@@@@@@@@@\@@`@@R@0@@@@@D@@0@`@:@@^@@@@@>@@@j@@@@@@@@@@@@@N@ @@@@@@2@@@@@@@@n@@@@@|@T@@@@L@4@@@@h@r@,@$@@*@@z@@ @@@@@2@@@@x@@b@@@@Q@F@@@@@@2@@@@@N@@@"@D@P@@@@@@&@@@@@@@@@@@(@@@@@@T@@Z@@@@|@8@5@@@@@@@"@ @2@@&@,@F@@4@@@ @b@@@@@q@@1@'@@h@^@@@@@@~@x@D@N@P@@@@@h@>@.@@@v@D@@@@@h@.@@@@b@@@ @F@P@@@X@@@$@@@@@@@@@@@@j@@@@@@d@@&@ @<@@p@@N@@@@@@@@@@@@@@@@@ @@@|@`@@@@z@4@@@8@@@@@@@@@@@@H@@"@(@@<@v@@@@*@@@@@@l@`@@@,@@@@@@@R@@@@:@@@@j@n@F@@@r@B@<@@@@z@T@&@@@L@@@ @b@V@@R@@8@@ @@@@@@@@'@@@@p@@@@@@@@@@@@@h@@@@@@@@.@@@@@@@$@@@n@"@@l@@D@@z@@@@@@@@@4@@@@@@@"@@@@.@@2@@d@@@>@Z@V@@n@@@@@@@@@@@@@z@h@@@~@t@X@F@Z@.@"@@@j@b@V@@@@@@2@@@x@@@@j@@@P@F@@@@K@$@ @@@@o@@-@@@@@z@@@@@@@@@@@@@@@@@@@.@@@@@@@@@n@@@@@r@@@@6@X@$@.@J@@j@@<@0@@@@@@@@H@n@@B@t@@.@@$@@f@"@Z@@@Z@@F@$@B@N@ @@@(@@@@J@@@@$@@ @@@@@8@0@@@@@^@&@@@@@@r@@@ @|@@1@@T@.@@@D@*@@@@@4@S@@Z@@f@0@@@@@@@@@@@@@@@@@(@@@@@@@@,@|@R@@@h@@D@@@@@@@@@@@b@8@0@@@@@(@r@b@@*@6@d@$@<@B@L@@@@x@2@z@0@d@2@|@@(@@@@@@h@@@x@@R@\@|@T@ @@@@@l@$@.@@@@L@&@.@t@@@@v@|@@:@t@@"@c@@ @@t@@@J@8@u@@*@+@@@@2@D@~@@@@@@@@X@@@@@4@@@@@@@ @@@@@@@|@<@>@`@@@@@@\@v@@@@@@@@2@@@@"@X@@@|@@H@@@@@@j@@@4@V@ @@@J@@,@.@@@@@@`@d@@@@@@N@\@^@(@@@@@d@2@@@@v@X@@$@J@@@@n@@ @\@z@@@@9@@@v@@X@0@@@@@y@@@`@,@@@@@@@@$@@@@@@@@@@@@@N@@.@R@D@Z@:@@@R@8@@@@@@|@@@@@@@@@@*@2@@@@@@@@J@@@@4@@@@D@>@^@L@8@@@2@@@L@n@4@@@2@2@6@J@*@X@j@:@@@@@@@@@@@@|@J@(@<@N@@@<@@@F@<@@@@@<@v@@ @>@T@@@d@@@B@@@@@@ @@@@@@@@t@@@@@@@@@@^@@F@z@@(@@|@ @@>@R@@\@@@@\@@`@ @v@@@@@@@@0@@t@@@8@ @v@<@@t@@@@@@r@@@R@@d@@Z@@f@T@@@@@@@@@@@@@|@@@$@@@v@T@@@@@V@`@ @@@$@j@@@8@*@@@@$@v@@@@<@0@@@y@@?@@g@@@@<@4@@@@@0@@@@@@@@@@@ @@X@,@@@*@H@6@@@p@@d@v@@@@@ @@@@@@t@@@@H@@@>@@@$@0@N@@T@"@.@x@p@@.@t@@F@@L@@@6@@@@@ @@@<@@@f@@@@@@@@`@<@@@@8@@@@z@R@P@`@@@@@@@@@@@2@U@@@\@@p@@@@@@"@b@@@@@@h@`@8@@@@@@@@@@@@@@@h@@@@@@@N@@@@F@`@8@@Z@|@V@l@@@H@V@<@T@.@@@@4@@@@@,@>@@@@4@@n@~@2@<@B@@@@@@L@@@@ @@@@z@f@@@ @@:@&@@@@@V@,@@@d@(@@@@H@d@8@@@@.@>@@@H@@'@B@@@@@l@@5@@>@@ @@@+@ @@6@@@@,@2@@@@@@@@@@@@@@@@2@@@R@@~@d@n@@@`@@@v@@H@@@`@~@@Z@@V@@@@8@@T@>@8@@@`@@0@ @>@@@@@@p@@@@@l@@@@@@@@@ @[@@@@d@p@ @@@@*@N@@`@J@@@@@@@@@@F@v@@H@@@d@$@\@ @@@@@@X@ @(@@G@ @@@@H@*@@p@T@@@@@@@B@@@@X@V@@*@@@@f@l@@@@B@@@@h@@ @@@@@@@@>@@@@@@@ @@@@@@@@@@@6@ @(@J@@@@@v@@@N@@4@@@@,@@9@@3@@@@v@@`@@@@@@`@V@(@@L@<@@@@@n@2@@@0@@@@@@@<@@@@@F@@@@@@@@F@@ @^@@@@@@@ @t@h@8@@@@@@0@`@ @h@@@@x@L@@@@@|@`@@@@@@@@@ @@@@@F@.@0@@@@@~@@@ @r@@@@@N@@@x@@B@@@@z@@@@@@@~@@@j@@@@:@@ @@@@B@@@x@@@@d@@@@@@@@@@<@t@n@@@@~@@@@@@B@@,@M@S@r@@=@9@@)@@J@6@@*@@n@@@@@@ @@ @@@d@@@@*@N@0@@@6@@@@@@@@:@T@@@@@r@@@j@v@@@@@@J@R@@@@@@@@@,@@@@@@0@@ @ @@@`@d@@P@b@@@@@@@@D@@v@@@4@j@@8@D@@@H@@"@@@|@@P@V@t@@@@@J@d@z@@H@ @S@.@@*@@>@@@@@@@:@@@X@P@@@@@@@@@r@8@@ @f@@@n@@@H@@@@d@b@@@@&@@@@L@j@@@&@N@@8@`@~@>@@V@@@@@(@)@@b@|@z@6@@@\@@`@@@R@4@@@@@0@@l@@@@l@@@@@@@L@@@t@J@:@@D@ @@L@N@@@@j@X@@J@6@@@B@@@R@@F@z@@[@R@"@@:@@@q@@[@@@ @w@@<@@Z@@@@@ @D@@,@@.@(@@@8@@.@@b@@@@@x@@4@@@0@h@j@@8@r@8@@@@@l@@j@@@@b@@V@@ @@J@@@@'@@@@0@@@@@@@@F@@@@@@@ @@@@@@@@@"@@@@@<@@h@J@@@4@@@@|@p@(@@t@@.@@@@"@@<@ @o@j@U@@@@K@@@l@@P@`@@e@L@@@/@@@@@$@B@@@@D@@@@@@@@@@@d@@P@@|@@*@v@@@t@"@V@@@@@@@@8@@@@8@@@g@@@.@:@n@@@r@@@F@@@F@z@f@J@@n@@@@@)@@@x@@8@p@@@b@t@@@@@J@(@@@P@@@@@X@4@@X@l@@:@8@@@@@(@@@@@(@R@@0@@"@,@@@@@@@@@@+@`@ @v@@@@@@h@@<@@@@@~@@6@B@@T@@@@@@@@@@@@n@@@f@ @,@&@@@D@@@@%@Y@@@@.@@$@!@@`@@P@@ @@4@l@@@r@@@@^@&@ @@7@2@/@w@:@ @n@ @@.@@2@Z@2@@@z@V@@@@@t@4@@T@X@@"@T@@@f@(@t@@@3@@{@g@@"@@Y@@@@@V@0@ @8@@'@E@ @@*@@@@l@@t@ @@0@@@F@~@4@,@@@@@&@@B@"@@r@n@@T@V@@P@ @ @@@^@@@@@F@@#@@@@@_@@@@@@@@~@~@,@j@@f@H@@b@@@@@@~@@p@@@Z@|@@x@@@@@@@@@L@T@@@@@~@@@J@@@J@D@@*@F@@@@ @/@F@@@@_@@@@@@@5@r@T@@@@\@@ @y@@@@@$@@@@m@@@,@@|@@B@~@@@.@@@@@n@X@v@@0@f@@@@@t@@@@@@@x@"@W@@@@@@@@@@@>@|@N@8@:@@"@<@@8@@@d@U@M@@(@@@f@@f@@<@B@&@J@.@@0@*@ @@@@@@t@V@2@@4@4@@H@@,@@@@@@@(@]@@D@@@@n@@@@2@@@|@@@$@n@@N@@@@ @6@@@f@@@@@@@&@@x@@d@@@j@@@|@8@x@x@@@@j@h@:@,@4@J@@@@7@6@@@~@@@@X@@>@@@@@@@8@@0@@@V@@t@@@@@8@$@4@V@@@n@p@x@F@8@&@@@@@@@@@@@@@D@V@@6@F@@@`@@>@@@@f@@@I@7@@+@_@@@>@@\@@@@@@@@@@@@@@`@,@@@@6@`@^@|@x@P@@@@@z@V@@@p@@^@D@F@X@v@@@"@@R@H@>@@D@@@B@[@@O@}@!@!@@~@@r@(@@x@d@&@@@|@@@<@@F@@@@@@B@@Z@@$@@t@@v@^@L@@@@@@@@@^@t@v@Z@:@*@@H@v@@@X@@@"@l@@@6@|@@@~@@@@@ @@@@@@@n@N@@@@@@@l@j@@@@@@@@@@l@r@(@F@R@n@@@\@@r@2@0@(@n@^@@@@&@@@:@@F@@@Y@3@@@@9@@/@@4@@:@@Z@(@$@@@@@@&@@:@@@@@@@@"@>@@@>@:@@z@@ @@@@@@@@^@R@l@$@@@@F@b@@ @4@@.@T@@6@j@@r@@@@1@.@:@ @@@@@,@@x@z@d@@@@@@@@X@F@ @@@@@@@@,@@L@(@@b@*@t@N@N@@b@4@:@@@v@@@@@@@&@@H@@@@U@@@@@@@@@8@F@@P@N@@@@@@@l@@@@@@*@z@@@2@@@@<@@>@@b@P@@@@@@@@@z@@@h@@$@,@@V@p@@h@D@@`@@@ @|@@@i@'@<@b@K@@ @@-@@@^@@@@@N@@:@?@d@@@@$@@@@@@@@@@@@@@"@v@p@@@@r@X@"@@F@B@@@H@@@@@@@O@.@@@@@<@u@@@@@D@@@F@@ @2@@@^@2@:@@@l@F@>@@@@@@X@@@@@@f@R@ @@@@@@x@@R@*@X@@@@@:@j@@.@j@@@6@2@ @@H@@@,@@@@R@p@@@*@@@|@@@@H@x@&@N@?@ @Z@@@@@@@@4@@@@@@@P@@p@@@@h@*@D@^@0@@0@b@^@@@v@@@@z@@@0@@&@I@@@@@|@@l@@@N@6@@@@ @@B@<@J@(@@<@@@l@@@@@@z@@@@@@@@@ @@@@L@b@F@6@8@"@@(@@2@~@@H@N@$@\@d@@*@4@4@"@n@L@@@@@@d@@0@R@@:@Z@@@@@@*@@L@@@f@X@:@<@.@b@8@@@@@F@@T@\@@@h@^@"@@ @$@(@8@j@r@@@p@@@@$@:@0@,@@@g@@@z@@@@@@@6@D@6@h@@@@@@~@@^@p@B@|@H@@@@@@@h@&@>@@@R@B@@@@@@@d@L@B@"@@@@L@r@@0@h@@T@0@@v@n@@@.@b@^@<@<@@V@@@@@@ @@@@@@*@@t@p@@@X@h@Z@@R@h@@V@B@@@@*@@@V@@@H@,@@d@@&@&@v@^@@p@t@@Z@@@B@@@,@@F@@@"@L@n@`@@4@$@@@*@@@@ @@$@B@@8@,@@@@@@8@@@@@@B@"@@@F@(@ @@@v@d@\@8@(@"@@@ @@4@V@@(@"@@h@@P@$@"@v@X@@`@@@@@$@@@@@@H@@@@t@(@@@,@@@@@p@x@J@T@P@@|@@R@@@8@@@@@@@"@@@B@B@"@*@@b@J@6@@@"@@@d@~@@@@@|@@@@@@@@@@z@@@.@@@@\@Z@$@@@@|@x@@@`@R@@@@,@@@l@&@@@@@v@P@4@$@.@@@@@2@"@@@$@@h@@b@,@L@x@@@@@@@@H@z@ @>@@@@d@@@@@@@,@@@@@@h@X@h@Z@@@@@z@@>@H@@@*@@>@@:@@@@|@"@`@T@z@L@@@@@4@@@@T@8@.@B@,@@@@H@@|@@b@F@,@@@@@@@\@0@@@h@b@.@@V@r@z@$@B@`@.@@@@8@6@@@@x@f@(@,@>@&@@@@@@<@@@@N@@ @@@@@@@@@@@T@@@x@l@j@@@@h@@@P@@R@@@@`@V@n@h@r@@@@n@@@\@R@@@@@@@@R@@@F@@<@"@2@R@z@&@@,@@8@@@@,@^@f@r@@@@~@@B@`@@@@@>@f@@@@@@n@H@n@@<@N@@b@@@^@r@&@@@@@B@@@@@@H@P@H@@@@@ @@@@:@@@H@j@@@@\@@@@v@f@@@X@@@@@d@@@@u@@@T@F@@>@@@@~@ @$@P@6@@@f@@@@@B@@@@@T@<@@@@@@x@@B@f@b@@@@@@@@@@@@>@@@@@Z@@@@Z@B@t@@@@@@@@@@2@"@@@*@X@@@@6@@@p@6@@@v@@B@0@@@@@j@&@J@@@$@@@@@@@@@ @Z@@@<@N@@@b@h@@R@@^@j@J@@6@@@Z@@@@d@D@$@\@@d@D@@@@@v@@j@@d@t@@@(@@@@@@@@@@8@@@@b@@z@@@@4@@ @@@@@f@@@@@@n@@@@@R@@@@^@@@@@@@J@(@@B@8@j@.@l@@@@t@,@@@@4@ @@@@@t@@B@^@.@@@@@@@B@t@@ @@t@@@B@>@R@*@"@@<@`@j@J@@v@&@@N@@@@@H@@2@@v@n@@@@@@@$@@@@8@p@@t@@"@@@@@@@H@J@@@@@@@@@t@@@f@@|@@h@L@@@@@@@v@d@@@@@n@$@@@*@z@@@@@@8@@@0@>@@F@@@@2@@@@`@D@@@@@@b@x@b@,@"@ @@@@@@@x@|@@ @@@@@(@@@@@$@@@@,@@@@F@,@@@@<@f@"@@n@@@@B@Z@.@*@$@@R@~@t@@@@@@@@@@@@@@@p@N@@l@@j@n@x@@d@@@.@@N@.@(@@@@@@f@@@@@@@@*@@@@8@@@@P@~@4@@(@D@|@$@@.@,@J@ @@@J@@@@@@@j@n@N@@2@2@@@x@@@8@t@@@@@@@@ @@*@x@Z@f@@&@D@@@H@@8@@|@|@@@@@@@@@$@B@<@~@T@@@@@@r@@@@@@@@@@@@@@T@@@@@@@@@@@@z@@2@@@@@@@z@D@@@@n@@@@@8@@@d@V@L@@@d@|@&@(@p@@@~@B@@~@@@R@2@@@@@@v@N@\@(@.@&@@@@j@@@@@j@@@@@@@L@J@@@J@x@\@@@@"@@Z@V@@@@0@*@@@@@@@d@f@@@4@@@*@@@h@@@@@@@v@@@&@&@@@@@x@@@@n@@@@j@@@8@@@ @p@@@~@@@6@@@@J@b@ @t@@@@@@@F@@ @f@`@D@@@@J@@v@@`@@n@>@@@@@@t@^@:@H@4@@,@ @@@@@@ @L@<@@@@@@@p@@@@@@@@@(@ @^@F@@@@@v@V@@@@@|@Z@@@@@@@H@^@@@`@*@@@@@@@@@.@@@@@@@@@&@@@0@@@@@z@@6@@h@N@@J@ @@@@@@@\@@@@@(@@@@@F@j@@\@t@,@f@@*@ @N@@@ @@@@@@~@^@@@N@@@@@@@b@@@@D@@>@@@P@@@d@@@&@:@@F@@@@O@@h@@z@@p@@@@v@H@@@d@r@@$@|@@@"@@@@@@@@@@@@@@ @@@@@@@@v@J@@@N@@\@@@@B@@@N@4@@ @@@@J@4@\@@@@@@@^@4@@@p@@P@b@l@$@l@@@<@@N@@n@@@@@@|@@x@4@\@,@@,@@@@f@|@@@@@f@x@@r@|@@|@@@r@6@@@@_@@5@@,@B@@@@@@@@@@@@@F@d@l@x@:@h@r@@@@@.@@(@@>@j@N@F@@@@$@$@@@@@"@@T@@@@@P@8@\@z@@t@@t@B@ @@ @@@h@@@@@D@ @@@@@x@6@@@@@@@@@@\@@X@@@@@@t@r@d@4@P@8@ @&@@@@2@z@@@@@0@<@@:@@@@@r@n@@/@A@H@@F@@g@@ @@@@@@@@B@@@<@X@@Z@j@@\@|@@@"@@@@d@,@P@t@@@P@,@@@@ @@@@@@@@h@h@@ @ @>@@|@:@@@|@>@8@&@@@:@@V@0@@4@@f@*@@@@@@@@@@F@t@@@\@"@@l@@@@@@h@x@n@2@:@@@@"@@@B@J@H@@@@@D@@@@@`@@,@t@@$@@m@@@@/@@@L@T@@R@@:@v@j@@@@@@@@X@@@.@@T@@Z@@@@@@ @p@@@X@$@@@@T@@@@@@@J@@@@@@@0@@@@6@@@@@X@t@@ @@h@@@@$@`@:@ @D@<@@@@0@f@^@@@@@J@ @@@@z@@n@T@Z@"@*@.@@@ @@@@R@P@~@@@@@@@@l@@@<@@H@.@]@@@@:@F@B@@@V@p@0@V@@@ @@@@@@@4@@@>@&@@@@@@L@@(@T@@N@B@h@T@@@@@*@@@@2@@:@@R@@@@@@@@@@@@0@J@@@@v@D@@@@r@$@@4@@@p@@@@@@@d@@8@@T@@@@@@@@b@>@,@:@,@&@@@@@@B@D@@@@@"@r@@@V@ @@@N@j@@@x@@+@@@9@@~@X@@,@P@@@@@@@@@@@@@d@^@(@@4@@@@@@@@@@@@@@@@@@b@@(@@@ @@.@@@@@@R@<@@@@z@F@~@@@@@@"@z@@@&@@@b@@`@@@@@t@@T@@H@"@@`@$@@@@@@^@X@d@8@8@"@@&@@@@@0@Z@@@@ @0@B@@@F@@@@*@J@@@|@s@@7@@z@@V@X@.@@@@@@@@h@@@n@8@f@@@@@J@@,@@ @@@@@@>@@ @.@(@X@@x@@@@@@.@`@<@J@@@z@P@@6@@@@@@@*@@F@p@@@n@h@@@@@@R@@@X@@@r@x@d@@@@ @@@@@x@@@b@N@.@&@@@@@@@@@@@N@@@@@*@~@@@D@r@Z@F@@@@@@@@@@0@@!@@@@@@$@@@@@J@@@@@@@4@@ @@B@@~@@@@@@B@\@@^@@@@@@@@Z@@@B@H@@d@n@@@@@@z@@@b@b@p@n@@@@T@l@ @@@@@@@@>@@@B@,@@@@D@ @@@@z@z@@h@8@N@8@2@"@@@@@@@@@J@R@~@@@@T@6@r@@@@@@@@N@&@:@@@@ @ @E@`@r@@@@@@@@@@@@@@@@@j@@@j@@@@@ @Z@@@r@@@@@0@@@@@0@`@@@0@@@^@@@>@@@@D@@@@@@@@@@b@4@v@@@.@@@@p@v@P@z@@@@@@@@@@@@@z@^@B@F@ @0@@@@ @@@@@ @(@B@@@@@@0@d@@D@\@@v@j@@@R@2@r@j@@d@@1@#@P@@@@j@@@\@@@v@@ @$@N@b@@@@@@@z@Z@\@H@@@Z@r@ @@@ @@@@@@@@@@v@d@:@@@@@@:@|@P@b@\@h@@@@@@@@@@T@8@@@@"@@@@@z@@r@"@@@@@~@r@@B@h@(@0@4@&@@@@@@@@@@@@N@f@@@@@6@@@@"@@@>@Z@@H@@@;@j@:@@@@h@@$@ @@@v@J@@@$@f@@@@@4@P@D@@<@2@4@@@@z@@.@@@@@@@@@\@n@\@@@T@d@@T@P@@@N@@@@@f@@@<@@J@b@@@@d@@@@T@x@R@@R@@@@T@D@L@@@@@@x@`@v@H@R@ @@@@ @@@@@@@@@@(@J@H@d@@@:@@@@@@X@.@@@ @@&@@]@ @@@J@:@E@x@@@<@@|@@.@@,@@N@@@@@d@4@@.@@@@@@@v@\@@@@H@@@2@B@T@6@j@$@@@@4@@t@@P@@t@@@@$@t@@&@@@@@@@@$@x@`@@@F@(@@@n@H@@@@@@@@r@V@@F@@@@^@ @@@@@@@@@@@@@@F@Z@n@@@@D@4@~@@@@"@h@b@@@@@p@`@@@@@&@r@J@@z@@@@@Z@@@@@@:@ @@&@@@@b@@@@>@L@@(@(@D@N@@\@~@B@ @@@@@@@@"@&@.@j@\@@>@@@4@@^@X@J@@^@@@@ @@@@ @@@@j@@@@L@@@@@@n@l@r@2@6@6@"@8@@@@@@@@@@@@@@@@\@X@X@@@@@,@l@.@@@<@@ @@@@8@@~@@*@@@@T@Z@@@@@@J@`@*@H@@@@@@@@@@@@@@@j@@:@@@@@x@@t@@@@@@@@@@@@@@@@@f@P@@ @@ @@@@@@@@@@j@j@@f@h@.@@@@@@@@^@R@R@&@2@:@$@$@@@@ @@@@@@@@@ @ @*@D@@@z@@@@@@@@@@@@@@N@L@@@d@\@b@@@b@@:@@@@8@d@,@@L@@@@@@N@L@t@@x@@ @N@@@^@@h@@6@@@@@0@@@@@F@@@@@@@@@N@@@@R@:@@@W@@s@R@@@@@v@x@ @@@@0@@@@`@V@l@N@H@6@P@D@@(@@@@@@@@@@@@@@@@@@@ @2@N@J@\@@@@@@ @2@@@&@@@@@@@@V@N@\@@ @@@@@@@T@`@ @@f@@p@0@(@@P@@:@^@b@@@J@:@X@4@@J@@L@@\@@@@@@n@@@T@@@@ @d@D@@@@@B@@@@@X@@@@V@@R@@@@B@$@@@@@f@@h@N@R@:@,@N@@@@@@@@@@@@@@@@@@@@@@@@B@2@F@^@n@@@@ @$@l@V@@@@p@>@h@ @@@@B@T@@@2@@F@@@\@>@@@@h@0@@@:@@@@@H@T@@*@b@@"@z@Z@@4@D@@N@@R@@J@@\@@\@&@L@8@<@.@@@X@@@@'@@@i@@@@@Z@@@8@,@<@@@@@~@b@~@L@(@L@"@F@*@@@@@@@@@@@@@@@@@@@@@@@,@ @"@P@8@f@@@@@ @\@>@n@@@@@b@@:@H@@@d@t@@@@*@:@@@@F@X@@\@\@@$@@@@@@.@@j@@@@^@@@@ @@@@J@@t@^@@,@Z@X@:@J@>@@b@@X@o@F@@@@5@U@@2@@@@*@@@n@,@@@@@@r@`@@@P@@N@(@8@F@ @@@@@@@@@@@@@@@@@@@@@@@@@@2@>@\@T@@@@"@@@@@@8@B@n@@@@ @ @@@@~@z@@@@@@@@@@@v@@@@@@@B@@b@@@F@\@@@`@@@@6@@@@@@@F@6@0@@p@L@j@@@@@c@j@=@@@@@4@@`@@@@^@8@@@@@v@@f@T@>@(@*@2@@"@&@@@@@@@@@@@@@V@@@@@@@@@@@@@0@@"@^@b@@@@@@@@@@.@N@d@@@*@@j@l@@@@@@L@.@G@@@~@@@@@J@,@@@@@@@"@@@@<@@@r@@@$@@@.@@@@@4@(@@2@&@@\@@@@"@@b@@8@@ @@@6@@@z@*@@@@@@@j@T@f@D@*@"@0@:@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@P@6@f@Z@@@z@@@@@@@T@@f@@@@@f@@@@l@ @A@v@h@@@@@@@J@@$@@&@@@@@@4@l@@@"@@$@ @@N@H@@@(@&@@:@@@@`@@@@@@n@@^@@@@@@@b@R@@@@@@r@@d@H@Z@.@ @$@*@B@@ @@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@`@@@@:@d@@@@@@@@@@$@@@ @@n@h@@@1@4@@@@@@@N@B@F@~@2@@:@D@ @$@@8@V@@.@@"@>@V@*@n@>@Z@\@P@@@@@@@@4@V@^@\@@@F@@@@@\@l@*@$@@@@@@@P@z@>@R@*@@@@@$@@@@@@@@@@@@@@@@@z@@@@@@@@@@@@@@@@@0@8@@Z@L@6@@`@@@@@@@V@@H@@@@X@@@d@@@_@@@{@U@@@@@@@"@@@@V@(@$@$@J@@X@J@R@8@@@@*@ @R@ @7@Y@@@@@@@$@@@@@n@@@l@@H@6@$@@@@@~@R@t@j@@@B@6@0@*@@@@@@@@ @@@@@@@@@@@@r@@@@@@@@@@@@@@@@@@@@@@@8@@@T@,@x@b@b@@p@@@@@@@@@H@2@@v@@_@@@p@@@@@@@&@@@(@@@@(@@@@h@(@&@A@@@j@@\@&@^@@N@@:@Z@2@@\@$@@@@@@@d@2@,@@@@@@n@>@h@N@B@`@@@&@@$@ @@ @@@@@@@@@@@@@@@x@v@v@n@@@@@@@@@@@@@@@@@@@@@@,@@@@Z@*@r@P@@@@@*@F@@@@(@D@@@@@@>@@@~@@@@@@:@p@@@d@@@`@O@$@@d@@v@@@H@@@@@@@@@B@@@r@~@~@J@$@F@$@@@@@z@@^@Z@\@8@@B@&@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@|@@@@@@@@@@@@@@@ @@@@@B@D@8@\@:@f@@@@@@@r@\@@D@t@@@@@@,@@@@@@@@ @@@ @@@|@@|@@t@@ @@@8@P@4@j@@@@R@:@@h@@@@@>@,@@ @@@@@@@@@t@N@J@,@F@ @@ @.@@@@@@@@@@@@@@@@@@@@@@b@@`@@~@p@@@@@@@@@@@@@@@@@@@@@ @@(@@@.@@D@\@^@@@@@@@r@R@"@@L@@@@^@@@b@6@z@@.@`@@@ @@@@N@@@2@@N@2@@:@>@@>@@P@@@ @@~@L@V@@@@@@@@@@@r@j@r@`@F@Z@0@0@@@2@"@@@@@@@@@@@@@@@@@@@@@@b@~@n@@p@z@~@@@@@@@@@@@@@@@@@@@@@@@@4@(@F@Z@4@@@p@@@@ @@@@p@4@T@<@@@@@@@r@@@\@@t@@@@@@@p@$@>@V@R@T@H@@@@@@@@j@@@@@@@@@@^@|@X@@D@>@V@N@"@@@*@*@ @@@@@@@@@@@@@@@@@@@@@@@@@r@r@x@~@@@@@@@@@@@@@@@@@@@@@@@@@ @>@D@h@R@P@t@d@x@@@@@@F@&@@$@@@@@@@@*@<@T@p@ @@&@@@~@b@x@@@@@ @@@@@B@L@@@~@N@N@:@@@@@@@@@v@j@L@4@\@P@,@D@:@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@j@p@^@b@p@p@@x@@@x@~@~@@@@@@@@@@@@@@@@@@@@@"@@4@.@"@T@R@l@@@@@n@@@@@b@@@@@@@@@@@@@(@@@@$@P@&@8@@(@F@@@@@@@@@@@d@p@@*@Z@l@P@\@B@,@:@>@*@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@V@@f@t@@@@z@@~@@@@@@@@@@@@@@@@@@@@@@@@@@*@&@ @*@4@j@@d@x@l@X@d@j@P@z@@@z@~@@@@@@@@@@@@@@@@&@@@@ @@@@@@@@@@@j@J@V@P@.@@@@@,@"@ @ @.@@ @ @@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@d@r@d@l@|@l@@n@@@r@x@n@x@@@@@@@@@@@@@@@@@@@@@@@@@4@@V@J@$@>@@>@@6@^@:@&@d@:@N@h@l@@@d@@p@@@|@r@|@@@@@@@@@@@R@^@d@Z@@~@z@l@Z@L@P@H@.@D@.@8@0@$@@$@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@f@\@j@n@\@p@t@h@@l@h@|@x@v@@r@@~@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@&@0@,@2@@:@\@V@>@F@J@6@N@r@h@d@0@b@V@.@t@@~@P@l@@p@P@@@P@&@0@J@V@D@>@0@@@&@@(@ @$@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@f@b@f@x@z@r@~@@x@x@x@l@z@@@@@@@@@@J@@@@@@@@@@@@@@@@@@@@@@@@,@@@6@@8@(@.@F@L@R@V@X@R@@j@t@n@:@B@T@8@\@h@@H@>@\@F@\@:@J@:@$@Z@<@D@@,@ @@@ @@@,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@n@`@Z@n@z@b@l@d@n@h@v@|@\@l@~@h@t@@~@@@@@t@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@*@0@ @8@@4@0@4@@D@@"@(@(@>@4@*@J@>@2@"@@@@@@$@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@R@Z@V@\@Z@^@f@\@\@x@n@n@X@b@p@v@x@z@|@@|@r@@@@@~@@@@@|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&@@@@@@@@ @@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@`@^@\@V@^@p@j@n@n@b@`@r@V@f@j@x@|@v@h@|@~@|@@x@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @&@@ @B@@@ @ @$@@@@0@@@ @2@@@@4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@H@T@N@b@Z@b@Z@f@Z@b@d@f@\@\@n@t@b@p@t@@v@@@@@@x@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@R@`@L@R@V@T@f@`@V@b@X@~@\@^@v@`@z@r@n@t@x@v@@r@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@h@V@R@\@T@T@Z@X@r@\@d@^@^@n@j@f@`@l@t@v@`@j@v@@z@~@x@@@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@sunpy-0.8.3/sunpy/data/test/EIT/efz20040301.120010_s.fits0000644000175000001440000042350013203275053021106 0ustar nabil00000000000000SIMPLE = T / conforms to FITS standard BITPIX = -64 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 128 NAXIS2 = 128 DATE = '2004-03-01' / Date of file creation TIME-OBS= '12:00:10' / DATE-OBS= '2004-03-01T12:00:10.575' / UTC at spacecraft ORIGIN = 'Rocket Science' / Rocket Science = NASA GSFC DATASRC = 'LZ file ' / TELESCOP= 'SOHO' / INSTRUME= 'EIT' / OBJECT = 'full FOV' / BUNIT = 'counts / pixel ' / WAVELNTH= 195 / 171 = Fe IX/X, 195 = Fe XII, / 284 = Fe XV, 304 = He II FILTER = 'Al +1 ' / DATE_OBS= '2004-03-01T12:00:10.575Z' / SCI_OBJ = 'CME WATCH 195 ' / OBS_PROG= '195_10S_AL_1.000 ' / CMP_NO = 1 / Unique campaign instance (1 = synoptic) EXPTIME = 12.595 / s (total commanded + shutter close) EXPMODE = 'backside ' / FILENAME= 'efz20040301.120010' / CFTEMP = -66.71 / CCD cold finger temperature (C) CCDTEMP = 7.34 / CCD temperature (DN/100) CTYPE1 = 'Solar-X ' / CTYPE2 = 'Solar-Y ' / CRPIX1 = 64.5 / Sun center x, EIT pixels CRPIX2 = 64.5 / Sun center y, EIT pixels CRVAL1 = 0.00 / CRVAL2 = 0.00 / CDELT1 = 2.63 / Pixel scale x (arc sec, fixed) CDELT2 = 2.63 / Pixel scale y (arc sec, fixed) SOLAR_R = 372.27 / Solar photospheric radius, EIT pixels SOLAR_B0= -7.22 / Degrees SC_X0 = 0.00 / s/c yaw (arc sec) SC_Y0 = 0.00 / s/c pitch (arc sec; -109.14 after 1996/04/16) SC_ROLL = 180.00 / s/c roll (deg., Solar north + CCW from nominal)HEC_X = -139130208.00 / s/c heliocentric ecliptic x (km) HEC_Y = 46576272.00 / s/c heliocentric ecliptic y (km) HEC_Z = -94896.31 / s/c heliocentric ecliptic z (km) CAR_ROT = 2013.00 / Carrington rotation at earth COMMENT CORRECTED DATE_OBS = '2004-03-01T11:58:29.038Z' COMMENT COMMANDED EXPOSURE TIME = 10.000 s COMMENT SHUTTER CLOSE TIME = 2.595 s COMMENT LINE_SYNC = 'no' COMMENT CAMERA_ERR = 'yes' COMMENT IMAGE_OF_SEQ = 0 COMMENT READOUT PORT = 'B' COMMENT NUM_LEB_PROC = 3 COMMENT LEB_PROC = 26 (no ROI) COMMENT LEB_PROC = 27 (no occ mask) COMMENT LEB_PROC = 12 (Rice) COMMENT BLOCKS_HORZ = 32 COMMENT BLOCKS_VERT = 32 COMMENT P1_X = 1 COMMENT P2_X = 1024 COMMENT P1_Y = 20 COMMENT P2_Y = 1043 COMMENT N_MISSING_BLOCKS = 0 HISTORY Version 4.0, 2001 December 10 HISTORY Image linear resampled to (128,128) for SunPy END @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@.@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@~@j@@@@v@t@n@v@t@l@\@d@r@`@r@b@^@d@d@X@h@d@\@d@H@R@\@J@f@N@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @$@&@@,@@@@@ @@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@~@@z@z@l@p@v@@@`@f@v@d@b@r@N@`@f@^@X@j@P@P@N@N@T@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@ @@&@&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|@@@|@@|@@@h@n@j@l@p@t@j@f@^@b@d@d@Z@b@f@L@Z@R@L@T@^@V@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@ @@@@@(@@@@@$@"@@"@@&@"@.@T@@@@ @@@"@ @@(@@@@@ @@@ @@@@@@@@@@@@@@@@@@@@@@@@@@x@l@|@x@t@l@n@l@n@X@l@j@X@j@`@H@Z@X@J@n@T@T@R@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0@@@8@@ @@@(@&@@N@:@0@t@Z@N@`@$@D@H@(@H@(@&@B@<@*@,@@ @@@@@@@@@@@@@@@@@@@@@@@|@@@@z@@~@t@t@p@l@t@h@^@h@^@`@b@\@j@p@Z@N@L@N@d@N@R@N@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@ @@@"@@.@*@ @@@@0@@F@F@F@\@R@n@|@F@^@N@0@<@4@B@J@,@F@ @@@@@*@@@@@@@@@@@@@@@@@@@@@@@@@v@@@@v@@|@p@h@b@b@`@f@h@V@`@R@Z@`@\@^@R@`@R@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@&@$@@(@>@ @>@@@4@V@.@X@\@B@v@r@t@@@@@|@j@@^@|@F@@p@R@@<@B@V@^@@P@@:@@@ @@@@@@@@@@@@@@@@@@@@@n@@@@z@z@v@j@r@h@b@f@r@f@l@\@X@\@Z@\@D@R@h@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&@@&@@@ @@@@2@ @T@R@*@h@:@l@x@N@|@@@@@@@x@@r@@z@P@x@@@@`@b@@j@L@R@N@\@@,@*@ @@@ @@@@@@@@@@@@@@@@@@|@@@x@@x@@j@j@t@x@d@n@h@Z@h@\@R@`@R@H@P@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0@@6@*@$@D@ @>@8@N@f@6@D@t@T@d@@p@f@b@^@@@@@ @*@*@@@@@@@@@@@|@r@@@t@n@R@F@ @,@&@N@@.@@@@@@@@@@@@@@@@@@@@@@|@r@@@|@Z@t@p@l@j@j@Z@`@L@V@^@j@N@V@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@$@ @@.@(@L@8@@Z@.@,@z@J@@f@b@@@z@@p@@@@@@@|@Z@@@@&@@@@@@0@@@@@@@@@@V@l@x@@@J@V@L@ @@ @@@@@@@@@@@@@@@@@@@@x@l@@r@r@v@r@l@d@d@h@b@\@V@d@R@P@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6@@2@6@@V@2@D@v@^@~@@^@@@@@@@@@@@@@@@@h@D@4@@0@@<@T@@@@ @2@@@@@@@r@@l@L@N@:@*@@*@@@@@@@@@@@@@@@@@@@@z@n@@t@r@p@t@v@X@Z@d@X@l@`@\@`@Z@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@(@ @@@ @ @6@.@F@l@L@@f@p@z@|@@@@@@@@@@ @2@2@ @4@l@@@@@@@@@@v@@@@l@j@@x@@X@@@@@@@@@@@l@`@:@,@ @@@@@@@@@@@@@@@@@@|@z@@l@t@p@z@h@l@d@l@d@d@T@R@T@\@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@,@@@@6@8@@,@f@R@\@@@@@@@@@@@*@@@^@0@@@J@@@@@@@F@@6@@@@8@~@p@@@@@@@t@^@`@v@j@@j@ @@@@@N@L@P@2@@@@@@@@@@@@@@@@@@@@@|@~@|@h@X@p@Z@d@h@^@f@\@Z@h@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@.@ @@,@<@<@0@l@B@V@r@@@@@@0@@@@@@J@X@@r@@@@@Z@R@@@@N@D@@@H@T@@@@@l@@@z@@@@@@@@p@@@@@@@h@6@8@@@@@@@@@@@@@@@@@@@@|@r@h@r@|@p@n@d@n@b@j@l@^@`@`@@@@@@@@@@@@@@@ @@@@@ @4@@(@"@@@@"@&@V@H@R@V@h@@z@t@@|@@@@:@b@h@@V@x@@@@@@@@R@:@T@@@:@\@p@R@?@8@@@@.@*@@@@@@@@@>@@.@@@@@@@N@t@@&@@@@^@*@,@<@@@@@@@@@@@@@@@@|@|@r@v@z@@n@x@l@\@l@d@b@h@h@h@@@@@@@@@@@@@@@@@ @@@@@@@@ @8@@H@L@@\@j@T@@v@@@@@@@B@p@v@@@@@@T@*@@N@8@z@@@@@v@@*@?@x@@@P@z@@@@@\@\@@@H@Z@@@@@n@@^@@@@@@r@ @@@t@V@J@J@@@@@@@@@@@@@@@@@z@t@~@x@p@v@r@z@f@^@r@d@\@j@^@@@@@@@@@@ @@@@@@@@"@"@@:@"@"@H@@T@8@J@@@l@@@@@@@@<@Z@@@h@@@\@F@@\@@@@@@n@@@F@n@4@(@6@@Y@@+@@@@v@@*@(@@c@@G@w@@@@@@@X@@@X@t@@@j@@@@@@b@&@4@ @@ @@@@@@@@@@@@@~@@@z@@p@v@f@p@b@r@b@\@Z@@ @@@@@@@@@@@@@ @"@@@@@B@6@8@0@H@x@F@x@@r@@@@ @@0@X@n@@@@6@0@P@@@@@@`@@@@@@@`@@P@@@@@j@@^@8@v@@@J@@@ @@@V@D@@a@@@@2@@n@@@@6@@@@@@@@@@L@\@:@0@8@@@@@@@@@@@z@@@@~@@@t@z@l@d@f@f@n@l@@@@@@@@@@@@@@@@0@@&@ @$@4@2@j@<@J@@j@f@@@@@@T@8@X@@@@6@ @V@@@@@@@@@D@@@@@F@@Z@@@L@@@r@J@@8@@@x@ @@R@$@}@I@S@l@@"@@=@@n@R@0@@@@"@@@@V@@@@j@f@V@N@R@ @@@@@@@@@@@@@@@@@v@@@j@h@j@^@d@d@@@@@@ @@@@ @0@,@4@$@@@J@,@^@(@>@@\@^@@|@@@@@@.@N@`@@@@D@^@@@ @H@B@H@p@8@T@@0@@^@@@>@r@r@@X@@j@@@@@@R@|@@>@@~@@@@*@:@`@@#@@@\@-@@`@@@@0@@@H@8@@h@v@8@@@@@d@*@ @"@@@@@@@@@@@@@@@@@x@z@x@|@v@x@l@@@@@@@@@@@@$@@ @@X@ @P@\@B@@<@T@@@@@@8@@@h@x@@@<@@@@@@@@2@@@@*@@D@@@@@@^@P@8@@@@@ @P@@@@6@@@"@@`@@H@@4@@|@@@@E@>@-@@H@.@F@9@@@@@@@@@n@@@@@p@j@d@$@D@@@@@@@@@@@@@@@l@l@@@t@j@j@n@@(@@@@@@ @ @@ @4@0@.@D@F@@j@<@v@@@@@@@@.@t@@@@@j@@@P@H@@@@@2@@@@@@x@@@J@@ @@@>@6@@@@@"@@@@@@~@@@@@@@J@@@<@@@@@F@G@M@F@.@~@ @@@@@4@ @@R@@@@x@z@X@*@@@@@@@@@@@@@@@@@|@z@|@|@h@j@x@@*@@6@(@@4@B@.@Z@H@R@b@8@l@h@f@@@@@@@@@Z@Z@@>@@N@@0@@@@J@@@ @@B@*@n@F@@@@@@@@ @@@@@@ @@@@@@@@@*@@@@@@@,@@@>@@6@~@L@@4@`@@@@@:@@@@\@,@@@|@@n@@@@@@L@6@@@@@@@@@@@@@@@@@@z@|@p@n@z@@,@0@(@ @@*@,@@8@4@(@Z@8@V@Z@l@@j@@@@@@$@V@@@@@2@@@@ @@ @@@f@f@@B@|@@@@p@@@@j@P@@@@@@@2@@@h@@@@@@@N@@@:@ @@^@@@@@.@\@@@@8@@@@@@@@@(@@@@@@(@(@@@@@l@F@@ @@@@@@@@@@@@@@@|@~@@n@@v@2@P@L@@2@2@4@`@<@X@^@D@j@B@v@@@@@@@@&@L@>@@@@@@@@@@@@@|@@(@@,@@@2@@2@@@T@|@t@@@@@|@6@@@@@@@@>@@@@@@$@0@@0@d@@\@@@l@b@P@@@@$@@@@@B@J@t@:@>@@,@@@r@b@@@|@@@6@:@ @@@@@@@@@@@@@z@@@~@|@z@~@"@@@,@B@F@B@T@4@`@H@z@P@d@r@@j@@@@@@@@t@@@Z@@@\@@@H@`@@@@t@@\@@r@@@@@@@j@z@2@@@z@|@@@@4@>@@@<@@@@@T@8@f@j@@@<@~@@r@H@@"@@@@@J@v@P@@@@@@@@@>@@R@@@@.@6@@@@Z@B@@@@ @@@@@@@@@@@@@@@~@@@6@@&@>@,@H@\@J@N@\@\@\@Z@r@@@@@@&@@J@@j@@@Z@@@N@L@@@6@@:@^@@B@Z@"@@@@R@@6@x@@&@@@@@@@6@L@b@@@r@@@@@@@ @@v@~@B@ @@@@&@@@@@@J@@@@@@@@H@@@b@2@@@t@@@B@@@@:@R@.@,@@@@@@@@@@@@@@@@@p@@,@@@R@z@x@\@@d@@@@@@@@@@@$@@\@@@@b@@@6@@v@@@@@V@@*@J@"@F@f@@@(@@ @@@(@B@@*@@P@b@@@@l@@ @@*@@H@@@>@j@@@ @2@@"@R@F@@@@@T@@@@@n@@@@@@@@@@>@6@@d@D@@Z@d@@@@X@L@ @ @@@@@@@@@@@@@@@~@@P@H@D@H@J@`@\@p@j@@j@~@@@@@@@@@j@R@@@@t@@@,@@\@@@@@p@@@h@>@f@@@@@ @@@@@@@N@@.@@d@@@@R@\@ @@b@N@r@@@@@0@@@ @@@x@`@@@@@@@@@@F@~@R@@@P@@j@@@j@@@@@@@*@@@@@`@>@P@6@,@@@@@@@@@@@@@@@8@N@d@H@@R@b@r@@@@@@@@@@(@@J@@@@@N@@@@v@2@@@@X@p@r@@@@@l@@@x@@@@@d@@@@p@8@z@@\@P@@@@@@@6@z@n@@@~@@@D@@@~@@@.@@@@@@@@@@@@@t@t@v@0@@N@@"@<@"@@@@X@6@@@@@N@B@L@ @@ @@@@@@@@@@@x@@p@@@@@@@@@@@@ @@.@@@F@T@`@@@@|@@@B@@V@V@D@@@@T@@@@@<@@@^@@@@@@@@V@@ @@4@L@@@@@@@b@@h@L@@b@@@@@@@@@0@@@T@@@@@@8@\@@@j@@j@t@@D@@@@@J@J@@v@ @6@@@@@@@@@@^@l@Z@4@@ @@@@@@@@@@@4@X@b@`@|@b@@@@@@@@@2@@@ @@@@(@.@@@<@@L@2@<@(@@T@@d@~@@@@@@@b@@V@@,@@@<@@B@@@@@@p@&@l@(@`@$@@@@@l@.@@N@@F@@>@@@@@@@@t@p@@@|@@@@*@0@@@@6@@@@@@^@@B@@@N@:@@@@@@j@`@:@@@@@@@@@@@@@@j@@n@@@@@@@@@B@x@h@@@@@`@(@v@@h@@@@N@@@|@@@@@@@@|@@@@R@@@@D@x@@@@@@d@@r@@@l@@@4@@@@@P@z@^@P@@@@@ @V@@4@d@.@H@@n@@@>@|@z@@<@@,@t@@@:@@@Z@@@@@@@@(@@@@@@@@z@H@,@.@$@@@@@@@@@@@b@@d@@@@@@@N@\@@@@@@@@ @@@@L@.@P@@H@@@.@J@$@@@@@@@@@@ @@@@(@H@l@@2@"@@@R@v@X@|@D@@@@@@@n@z@ @@@,@<@n@@@@@@@@@@@.@:@@@@@@^@@@@@0@@v@@@d@@@H@@@@t@2@@@"@@@@|@x@Z@J@6@@.@@@@@@@@@z@@@t@@@@@@d@~@@@@@@@ @0@@@@@<@@~@@@N@@@@&@@@@@@x@|@N@@@@<@ @@@2@@l@ @@@@@8@@H@n@@@@D@V@$@@*@@(@:@(@N@@.@x@@@@@@@>@V@&@@@@@@@@@z@@v@B@ @@@L@@d@L@@T@@P@@.@@&@@@@`@Z@>@J@ @@@@@@@@@@@@@@@@ @8@Z@~@@@n@*@@@x@X@j@@@@L@@r@@ @@t@<@0@@@V@@@@@@`@ @@v@t@.@ @@(@@@,@`@.@@@@@@@@^@@@@@.@@,@(@&@<@^@@@p@@@@@^@D@@@:@j@ @@V@@@@Z@@v@@@@@@<@@z@|@@z@@`@N@ @2@&@@@@@h@\@p@\@.@@ @@@@@@@@@@@@@@J@h@@@@J@z@@@@r@@@L@v@ @~@Z@@;@@^@@@@@@@&@@l@^@@@@@@t@&@@*@X@@@L@@@h@@@@@~@:@b@J@$@L@>@@<@@2@.@P@8@@@@L@ @@H@@@@L@x@&@@x@v@b@@@@@@@@J@@@x@@P@@l@@l@F@(@(@"@@@@@@@@`@>@0@ @ @@@@@@@@@@@&@@N@@v@@ @@@:@ @6@@`@@@@@x@@@,@@@f@@@@@8@6@@F@D@@@@@.@2@@@,@V@~@v@@@@ @@@@@:@@@<@D@@*@@T@@@@X@d@ @@@t@@@@@@@@\@@@@@@@>@&@l@f@@4@ @@.@@@@@p@@@P@ @(@@@@@@@@V@n@ @0@@@@@@@@@@@@@z@x@@r@B@@@:@@H@@z@@@@@@N@@F@@@@@@@@@@ @@@.@@@@@@@*@ @@4@B@H@d@r@$@v@(@@ @@@$@@@j@R@R@R@p@R@&@@@b@@P@@\@<@V@z@@2@N@@@@@@@@<@@@@>@@v@@ @@d@@@@@@@@J@@@"@@@@@@@@~@d@r@,@,@@$@@@@@@@@@R@j@@@@@@@(@@@@@@:@@@@@@@@@4@d@F@:@@@@L@@@ @@@@@@@@@@@@@Z@X@`@@@@@@@ @,@@@@@l@.@@,@@8@,@L@@@D@T@@@,@@@@@@@@j@@@>@@@E@@@j@@@@@@|@`@ @@@@@@@ @ @@@@@@@f@p@f@>@,@@@@@@@@4@ @B@@@f@@b@@h@@@@@d@@@@@(@@@@@@\@@@@<@@B@ @@@@@@@@@@@@@@n@@@@x@$@@@T@@@@@Z@@V@@N@@@@@:@@^@@B@B@h@^@8@ @D@@@@@p@@6@j@R@6@@@:@^@@@@@@@v@Z@@@B@@@@@@@@@@@@@@@x@@F@,@2@@@@@@@ @@V@@@@<@@@2@b@@@@@@(@@@@@<@^@@@@@r@@@p@<@@@@4@@@@@@@@j@.@x@.@@@r@j@@@@@@@@B@@@X@@@@@<@@@h@@@l@L@2@<@@@@@@$@@@&@B@@@@@6@3@@@^@@@:@@@z@ @@@@@Z@L@@H@P@@"@ @@@@@@@`@p@P@4@@@@@N@@2@x@@<@@@n@b@@A@@!@3@@@Y@L@@@@@@@`@@ @|@<@@@f@@@N@@@j@@@@L@ @ @,@&@@(@4@j@x@@@@@@@ @V@P@@B@h@@@@v@ @@&@@0@@@@@@@<@@@D@@f@@@@N@|@@~@@@@-@R@6@@@8@@p@@z@@@(@H@|@~@F@,@0@.@2@@@@@x@@j@*@N@0@@@@@R@v@d@@*@@x@@"@-@@@@@@@@/@d@@Y@@ @J@@2@ @.@ @|@@@*@6@@N@Z@P@Z@F@j@X@@@>@|@@@@@@@@@@@@@,@@@0@X@|@@@ @@f@n@8@@@ @@@@@@"@\@@(@@f@@v@`@l@4@@@@4@@@z@4@X@@@@R@<@@@@@@@h@d@@@x@@@8@@@@@h@j@R@Z@@@@@(@.@@@@z@@N@@S@@@@@@+@@@@d@x@4@4@@d@^@@@L@@@@@X@*@@@ @@@@@@@@@B@@@@@@@@@@@(@f@D@,@J@@@@2@B@D@B@P@6@~@@@@@@@@6@@@4@@@E@@2@@J@@#@@1@>@@@T@@@~@@@z@@j@^@(@@@@@@~@@t@J@@@@@@T@V@ @@@@P@F@@@@d@@h@@@@@@q@@@@@ @`@@`@@@@V@@L@@@@@~@@4@@@@@@@@@@@n@ @@@@@@@@@@@@n@@@@@@P@@@@@>@:@f@~@@n@j@@@@:@"@@@@@1@@@@D@B@ @@@F@@*@@@@@@@@@P@@@@ @@@@x@z@@@`@z@@@@j@4@T@@@@@@@@@D@@T@@@@e@@@@r@ @@@@b@@l@@@@@j@@F@@@@@x@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@L@@@d@L@@@>@@@ @@@@@N@@@'@n@z@@ @0@\@@@@@@@@p@ @,@`@B@@@ @r@>@@@n@@@@@@@@@@@@@@L@^@@@@@>@6@@@@j@@*@@>@@e@G@@@@@@Y@y@@@@@@@@`@@@^@v@r@@@@@@@@@@@@@@@@@@@@@@@@ @>@@@@@`@@@r@p@L@(@@@&@@@@@@,@(@@v@@@@p@@@@B@@@<@@@@@@@@@@ @@@>@f@@f@ @@B@ @@ @@@ @d@@B@@@x@P@D@@@@:@|@^@^@@@@@@@@@<@J@U@&@@@@@@h@Z@@p@@h@z@@b@@@@F@:@@z@ @@R@@f@@@@@@@@@@@@@@@@j@0@6@@>@@@:@(@@@@R@@@"@X@@@@@@@|@4@@@O@@[@@@@@@@u@@F@^@@@@L@@F@n@@@Z@D@Z@@x@j@j@F@@@@@>@@@@@b@T@@@@.@@x@@@$@@@@@@R@@@N@>@z@@&@@@@@j@@(@@X@R@@@R@@@V@@@"@@@@h@@@ @@@@@@@@@@@@@@H@J@@Z@@@H@N@@@d@@H@@@j@@@<@n@@@@P@@t@@@|@@@@@@B@@@n@@@@2@@@@@@@@@@@@@@j@B@@@@V@4@@@@x@@&@"@@@@@@@@@@@l@@@@@@$@@#@)@@@@@@@@(@@@@@L@$@6@@@@@@@@@@@@@@@@@@@@@@@@@@@j@P@ @@$@@@@6@@6@@@<@`@@@@@T@`@@=@x@@}@@@@@w@u@@X@@ @@>@@@"@@@@@P@p@f@"@@ @@h@D@6@@@v@@@@@@r@@@@@@z@@@@T@v@@b@`@@x@@b@~@@@=@@@@2@@@@@@4@z@@6@4@P@6@@@~@@@@@@@@ @@@@@@@@@ @@ @X@Z@d@@@@F@ @ @@@@@@3@b@@@@ @@@z@n@$@B@@@@@@@@r@@@@@d@L@\@@@@@@@@@@Z@"@@@h@@@@|@N@ @@@D@8@,@@@@f@N@@@@@@@@@"@N@@Z@0@.@@:@@@@@@@@@H@x@z@@^@@@@h@@@@@@@*@@@@@@@@@@@@@@@@@Z@|@@@@v@@ @@0@@@@@ @@@@@@@@@@@@@2@8@.@j@@@@@@8@@@@@@@@@@@T@ @@@@@T@&@@f@x@.@X@@@@@@@x@H@<@@@@@@8@@@|@@@@v@~@.@b@@!@@@+@"@>@@@@@@@@F@@@r@@@b@@@@@@@@@@@@@ @@@@@@@@@@@L@@@@ @x@H@@T@N@D@4@&@H@h@p@@@@B@@@@@@@ @b@\@n@@@x@@@J@@j@@^@`@@<@ @@@ @@@@@t@@(@@@@@@@@ @@@r@v@,@@@@@v@d@.@(@"@@@@@F@@@ @@@0@k@t@8@@@ @@@ @@@H@}@@(@T@@@\@@@@@@@@@@@@@@@@ @@@@@@@@r@@`@@ @r@@B@@@J@@*@@@@@n@@@@@@@@8@P@@(@&@z@@@(@.@@@X@@6@(@F@6@"@>@@Z@@@0@Z@@@@@@@@P@n@H@*@@@@@@X@^@@@@@`@&@(@v@@@ @@x@@r@@@@@l@M@!@@@~@.@@@@@@@@@v@@:@@@@@@@@,@@@@@@@@@@@@*@R@@B@@@@Z@p@X@@@@@@L@@@$@>@n@X@0@@@6@@^@@f@@@2@P@,@@@V@V@B@@@l@(@(@*@@@6@@@@@0@@6@(@@@@@@@(@B@:@@@@@x@N@4@@@@@N@*@@d@@@@@@@N@@R@@P@@"@F@@@X@@|@@&@g@@M@"@@@R@@@@@@@@@@@@@@@@@@@4@@@@@@d@J@"@@n@F@@@@@t@|@@*@@@@"@@@@@(@@@@@H@r@@@@@@@B@@@@"@(@@$@@@@@@@$@R@@@<@@.@$@P@@X@X@N@@@@@j@`@.@@@@@^@&@,@v@@@z@@@^@J@@@ @2@<@@@@@P@@&@J@@8@I@@@@@@@@@@@@@@@@@@@@@@@^@@.@Z@l@@X@@T@2@f@R@@@t@@4@@|@@@\@^@@@@b@@@@@@@0@B@@&@@B@@d@@@@@@v@@@6@"@@@(@@@D@@4@@@@@@@@@@t@.@,@@@@l@^@ @@@@f@`@^@@@@@@@|@J@@@@?@L@@@ @@x@]@@|@@D@@V@J@z@@F@@@@@@v@@~@@@@@@@@*@@r@<@j@@@n@@B@@@ @@&@T@@@@@@@0@@\@8@ @r@@@@@@@@@>@@@ @n@B@v@Z@@@@@J@<@@@P@n@4@@X@@@d@@@@,@@@@@@@v@:@.@@@@Z@@@@v@6@V@N@@@ @^@|@@@d@@@@E@ @@^@ @v@@@@7@h@@@@@X@@p@V@ @@@@L@@@@@@@@@@@x@@@@@@@v@@@|@|@6@P@@d@T@^@J@@6@"@@@8@@@z@@$@ @@@@r@P@@@@8@2@@v@<@V@@@@\@@@@H@b@@@@@Y@@L@(@@>@@@"@@@@@P@@@@z@$@@@@b@F@ @@@@l@r@@*@@@@@B@8@4@@@L@@@@@@@6@.@@@@@@d@<@@@@@@@@@@@@@@@$@\@@,@6@r@@v@@f@@R@@@@n@@L@@@n@@@@@@@@@z@@h@T@@@@@@6@@@@@@@$@@Z@@2@H@@@@@@@@@@ @@F@ @@@@\@d@@@@R@ @$@@b@J@@@@@@:@h@@@L@@"@\@@L@@@"@@\@@@@@@g@@@@s@@@b@$@^@0@^@d@@@(@@@@@@@@@N@@$@@^@~@p@|@@@>@L@<@@r@@@@@@~@@@@d@"@@@|@D@x@j@^@@@0@@@@@v@@D@@P@@x@@@@r@@*@0@L@@v@p@@@@-@@@@&@b@@@@ @@@@T@H@@@N@@@@@p@f@@@@@@@ @l@@@@4@@@@@@N@ @@@M@q@@@Z@@@@@D@*@@@@F@T@@ @@@@(@L@@&@@@@@N@@@r@@@d@@@@&@@@.@@@B@@@@@Z@6@f@@@@@@@@(@h@@@@@@2@@ @ @0@@ @`@h@@@~@@@B@P@ @@@|@ @v@@`@@@f@ @@@@B@$@@j@d@@ @@r@@@@@@$@"@@@@@@@@@8@@$@H@@*@@6@@~@@@1@@@@V@@@(@2@@@>@$@@@ @\@@f@@@@@6@x@@f@X@@@@@@@&@@$@@N@@@|@@@T@@@@@@@2@@@@@R@|@R@@"@d@@@&@@B@n@x@@6@@@\@@ @*@R@@@@@@s@P@@@r@h@|@v@ @b@@D@D@@@(@@@@z@j@@V@x@@@@Z@@t@b@@@K@@-@V@@I@@_@@@@@:@@@@F@@@@x@v@^@@@@@*@@@@n@@@@@@@"@|@6@p@@$@@@@@P@4@@@D@@@$@p@~@~@ @@j@@@5@@@@@B@H@@@@b@@@@@:@l@@@@@|@@@@n@@&@;@R@i@@@:@4@@@Z@@@"@@B@@@@4@@@@X@T@@~@T@@@2@@@0@@x@@G@T@:@'@D@k@@@Q@@@@@@[@,@@E@6@(@v@B@@H@j@@l@p@ @D@@@@R@@@@@@@@@@X@.@@|@@@v@@@@@@p@l@@@T@@@@*@R@@ @@@t@@@@@@X@d@&@@@@@@~@|@@@@@@ @G@@@@0@@@@@@@J@@@@V@@@@@T@ @@@r@l@@L@t@@J@ @@H@@@<@:@X@s@w@@@@@W@9@@@!@@@$@T@|@}@@q@@$@.@@@@ @@P@@@@@@ @@@@@&@@t@@@@@@@@ @8@J@2@@@@@@@.@@@b@\@?@@n@@g@(@\@ @@@@@@@~@@ @&@@@ @@@@@v@1@ @c@8@@S@@F@@@@J@@@@@N@@@@d@@@@~@\@V@@p@6@@@ @@@,@@@%@,@@>@m@N@j@Z@@@@2@q@@}@R@@@~@@@@n@@@6@@@@@@@@@V@@@@L@$@@@@@@@@@@@@@@j@@@B@r@k@@@f@@{@@#@@@q@@@$@@@@@R@@@@@@R@d@@ @@@@@*@v@e@@@@@@@@@@@@@@@@>@<@@@@B@@@@@f@N@@X@H@@2@ @t@@ @@h@@@!@r@c@{@@!@P@@@>@@B@@@@@I@@@@@@@@x@n@@@@=@@z@x@\@&@R@@@@@@@@@@@v@v@@V@@D@@:@X@h@@l@@@[@+@6@@/@;@?@0@@0@@"@$@@@@^@>@0@@@@L@b@x@@z@@@@@@@+@@@X@Z@@Z@@@@@@@@@H@$@@@@@@v@@(@"@@@F@@(@p@@@@@1@\@@@z@V@@Y@@@z@@W@y@|@@@D@v@@@@@t@p@@ @&@"@@@z@@@@d@@F@@ @@@@@@r@D@b@@@@@@@@@@@@@@@@?@U@Z@@@@.@@@$@v@@@0@4@J@@D@N@@@H@@`@N@f@@@x@%@@@@6@@F@@ @X@@:@,@X@@@ @@@@@@n@^@`@@D@\@@J@h@&@@@@:@@@+@~@@x@@@@R@D@z@@2@ @F@@ @@R@@!@%@@z@@@@@@@X@|@R@@@@l@@@L@@@@l@@P@@J@@@@@@@6@@@V@@:@x@@@@@@@|@@@@@"@@@@ @@v@@@@@ @p@@@@@@@@t@@b@@@@|@@@@@@@@@@@@@@@@|@@@J@Z@@.@D@@J@p@@p@r@@@@@$@t@\@@}@s@'@@h@@0@@|@@@@@ @@@@ @.@@J@@@@&@2@D@X@@P@@@@@@@@R@@@L@N@:@J@f@@@@@@$@P@b@@h@@@@@'@h@@@@N@@@X@@@l@z@&@@ @(@@N@@@@@2@@x@@@@(@6@*@@"@@t@@@:@@@@@@@@@h@T@@B@@N@@.@b@@8@@@@@@@@T@@ @#@z@@z@g@@1@@\@@@@`@<@P@z@@@,@.@@|@4@@@@@@@@@@@@@@R@!@@0@"@h@@d@H@(@6@|@v@@@4@"@@@@H@b@@@@2@@|@@7@@|@@ @@@@j@0@@@@@@@L@@F@T@@@@w@@@ @@@@@b@@R@@@@@@@@@@Z@b@R@ @@2@@V@l@@@@j@@.@6@R@h@@:@@@@@d@d@@@@E@f@*@&@$@f@@@T@B@@`@@@@^@`@T@@@@@@@@@@@@@@P@@@@@R@@@$@>@N@@@@@@@t@@F@@@@@e@@@ @@a@@@@@2@@D@@@@@@@<@J@B@N@ @@"@>@@p@>@@@@@@L@@@@@@@@@@@@@\@6@Z@.@@@@l@p@@\@@<@@H@~@@@D@@f@<@l@@@_@@@@@@@{@.@d@h@@:@N@g@@@H@@f@0@@@@@@@@@$@@@<@@@@@t@@b@Z@ @@@Z@@@@.@@@f@@@_@g@ @@@r@@@g@J@@X@N@@@.@@@@@N@@,@*@0@ @@@@ @6@@r@@V@@r@@@@@N@,@@@@@@x@@2@0@N@@@@@Z@j@@p@n@<@X@@@N@@&@@@@E@@@@<@@@z@@@@@@@@@@@z@@r@@@$@@@@:@4@@@@@L@@Z@@@@ @@<@~@P@\@ @ @D@N@z@@@@@\@@N@x@@@@@@@@@@J@$@d@B@@@:@z@@@@@@"@@\@,@@J@@@l@@@D@@@z@F@@@@,@B@@@@@@t@n@l@$@D@0@@ @@:@X@@$@R@@>@P@@,@$@N@^@@8@@@@@,@t@@x@,@@@@@~@@r@d@@F@>@@@F@2@2@ @4@T@(@@@@@@@2@@@l@@&@@8@@@@<@4@@@n@@@>@@@@@@y@@@@"@@@@@@0@@b@@@R@D@@@@B@@@@V@@@b@2@@@@@@@d@B@2@@@@@@@@@d@x@\@>@D@0@@@@h@p@@2@:@@v@8@@@@@@\@d@p@`@@@T@@@ @f@@*@H@@t@@@T@@z@@@@R@L@N@j@P@Z@2@H@.@@@.@@\@4@@N@@t@@@@"@@@J@@@n@l@"@~@@V@@D@@.@T@@@0@"@.@@p@@>@:@~@@@@@@@@@J@h@&@p@2@@@@@@@@H@@@P@:@@@P@(@2@@@@p@`@<@@&@@@@@^@L@@F@0@@h@@|@L@V@V@@@x@@t@@@l@@@@@P@`@@@@Z@@@@2@*@@@@@p@b@@v@T@@@t@:@v@@@x@ @@@@@@x@f@n@4@@@t@V@f@`@@h@@B@>@@@@@F@@@R@@@j@@@@@0@@&@@N@@@@@j@&@4@@@\@@@@F@@~@@l@@@@t@.@@@@@V@Z@H@0@ @*@@@@ @@f@@&@@@@l@,@N@D@@@@@@@@P@@@^@@@@@>@@@*@@@@@@@@z@\@h@L@@@@@@4@@@4@>@@x@@@&@@@@@d@@N@v@H@@@@@@h@@ @@N@@@R@,@ @@@f@@@@H@@&@@@@@@@N@@@@@N@V@@d@h@r@4@>@z@B@@@@(@,@@@z@P@r@P@J@$@@@@@@@F@@@4@`@@@@ @@@@@@@@@^@@@V@f@n@p@@+@@v@j@@f@.@@@z@D@<@B@@R@@@@d@@t@@t@@@@X@`@Z@@l@@~@@\@.@2@R@j@@@@@@~@@@@@Z@@^@@@@@@@Z@@v@@@v@@@@@@8@@*@H@t@F@Z@.@|@d@@6@@@@@@@j@2@@@@@@8@>@:@P@@@@@@@@@@@4@X@@L@J@h@@@@n@T@@@@@N@@@|@@@i@@@@4@@@ @@>@@@@@@@@J@@X@@@@@.@@@@@@@@@@@l@:@@f@z@@@@@@@@@@@|@@@@@@@d@@@@@\@8@@@T@@@@@@@@2@@b@P@h@@Z@@@@B@(@@@z@t@L@<@@@@t@V@:@4@<@@@@@@@*@@@*@v@@$@R@@@@d@H@F@D@@b@@@@@@.@<@D@Z@@@@J@@@H@2@:@@@@@@2@@z@z@@@@"@n@@@B@@@@@>@@@^@@@r@@@@@@@@@Z@@T@@@@@@@r@@@ @f@ @@@:@.@@@@@@@@@^@\@l@>@Z@@X@@b@8@@@t@8@&@@@@@@x@F@P@*@@@@x@@@<@v@@ @Z@n@8@ @,@@4@@@@ @@z@@2@@@@@@F@@@Z@@@~@6@T@@@@@@*@H@d@@\@L@P@@@4@@@@@@@@@h@@t@@@n@@@t@@@D@n@@@X@@:@@$@@@@z@@p@@@@@@@@B@"@x@@@@@*@@@@*@>@\@J@t@@@(@@@@r@@@@@@@t@~@b@:@R@@@@`@@@@\@J@@B@2@@@@@@@@@R@&@<@*@@@@X@@b@ @@h@|@@z@.@~@@@2@2@@4@@D@h@@p@@@@@@@@@@@@@6@@@V@@b@@@|@@@@h@@@@&@@@"@@@@@l@@:@@@@@@@@@@B@@@@>@@8@@0@8@^@@@*@@D@@@@H@6@@@@@t@d@h@T@B@D@@$@ @z@@@@@>@@@@@@@@@0@>@@@@@4@@@@l@@@@@|@@@@:@@@@z@,@2@@x@@@@\@@@@@@@@@@@@@@&@@`@*@@t@@@@@@D@@@j@ @ @@@@@@@p@Z@&@@@@@@@@B@@@@@~@@@p@@@@z@@@@@@ @@@@F@6@@@@@@@L@^@"@"@$@.@@@p@@@D@h@@@@,@@@@n@D@.@@t@j@<@@@@@@@@@X@@@@@@@@@"@n@f@@@@@@,@@@z@ @@@@@t@@@@@ @@@@@@@@@V@@@@@@h@@@@(@n@@@r@2@@@f@@@X@F@@r@@R@@@@@@J@8@@@@@`@i@@@ @~@@`@@@@@@@d@`@R@l@0@@ @@ @@n@@@@B@\@@@@@@@@@@@@@@@@@@h@@B@@@@^@\@ @@@@`@@@@@z@@b@@L@@@$@@@@@@@@@@R@@@@@@@@@@@@@&@@@x@@@N@@~@@@:@$@ @@@t@@@z@"@@P@@@@@@@p@@p@l@@@@@.@@j@@`@"@@@@@@j@|@H@Z@*@@&@@@@Z@@@@@@@@@<@b@@~@@@@(@8@@l@X@r@h@@`@*@z@h@@@@@t@@@@L@@B@8@@@@<@@@@@@@ @l@@@@@@@@@ @@@@@h@@x@@6@@B@@@@h@@n@f@ @@@@@@&@6@h@@h@.@@f@@B@\@@@j@@x@`@@f@/@@@Z@@6@@T@@@@@@l@b@\@t@>@2@@L@@@@>@p@r@@@@h@l@@T@@@@@@^@"@@@&@G@~@@@@<@@@@@@@ @z@b@@@@4@@^@x@n@z@@@@@t@2@@6@@0@@.@@@@@@.@@@@@p@@@.@@@R@|@@V@@@0@@~@@@p@@ @@"@t@@N@V@@|@@@f@@6@T@.@@@@@@@@@@@@6@@@@@@d@\@X@4@<@2@@,@ @@@,@|@@@@@6@L@@*@|@@r@@p@P@@=@o@p@@@@@@@&@@@@6@@@ @@b@@@@p@X@4@T@@<@@$@@@@:@(@v@z@@\@@@@@@L@@@@@@H@@V@*@@@0@@@@x@>@@@T@<@P@@@@B@@f@l@@@.@*@@L@:@*@@V@@@(@@ @@@@J@@@L@@@@@@@t@d@4@4@@@@@@@&@\@@@~@@B@@@.@B@@@@P@Z@@@@U@@@@@e@@ @p@@@N@@r@@@@@@@@*@@T@z@j@p@@&@@@@j@H@@Z@@@Z@@@@@8@@@@@|@@@@@@@@@@$@@l@j@Z@@@@@F@h@@@X@l@@@ @@.@@0@4@H@.@.@@@^@Z@@@ @@X@$@@@@@@@P@H@(@4@"@@@@@@@B@j@@@@@@n@@@@ @@R@@~@:@7@@w@@@@X@>@@~@x@@@@@"@@@@@@@@@@`@@(@@v@P@@`@@@@@R@@Z@,@@@ @@ @ @@N@@@@H@@@@@@*@@^@@@@@@J@@@8@@r@ @D@~@6@@@@@|@@@@@@@@@@(@@R@ @@@@@@@`@\@@@V@*@@@@@ @$@B@B@@@@@ @F@@@t@@P@@@@@6@@@@@1@@@n@@@@@@@@@@$@@@v@@@V@D@"@@h@@@@@@@@@@4@:@@@@@@,@@v@@@@@@4@ @@@@@@^@.@@@@l@@@@@@@8@\@@@@l@@h@@n@@@@r@L@@@&@@,@@>@F@@@@@@@`@D@D@6@@ @$@@@@@0@F@@@@@ @V@@@h@@@@F@T@@@r@q@@,@@@@*@d@@@@@@@@@@@@r@B@*@@@@@\@r@L@$@@@@ @@<@<@|@D@@F@ @t@N@@@@@@d@4@@@@@h@@@(@@@@@@(@J@B@@@@@,@@@@@@@f@@4@T@*@@@@`@H@(@@@@@@@@z@@R@f@"@(@4@@@ @@@@@ @&@n@@@@@@j@@@h@@@<@@@|@@@@@@@@@/@@@(@@@P@L@@,@@D@@@@@@ @b@@D@@@@@@@@@@>@@b@R@@@@@@z@@`@@@@@@p@f@4@@ @@@@@@z@@j@n@@@@B@z@@@@&@@@@@2@Z@@z@ @@@@@T@.@@@@@@@b@B@>@.@(@@@&@@@@@@@R@b@@@@@R@6@r@@@@@@@@D@@@@@ @@ @K@q@@n@@8@@@@@@ @@@@@@@@Z@@@@@@@Z@8@d@@@~@@@@@.@@0@*@@@<@@@@@@^@@r@@J@@@F@@`@@@@@@@r@N@@N@6@ @F@@@@0@@>@z@@@@@j@B@@@@@@@@Z@p@$@H@0@@@@ @@@@@$@0@T@@@@ @@H@@@6@T@@v@\@@@J@ @@H@ @m@@?@+@ @@"@@@@@R@@@@n@(@6@R@@d@@@R@0@@v@F@p@@@@@@@@@@@@6@@@@@$@@@X@@@@@v@@@T@n@@(@t@2@@@,@@t@@@@,@V@@@@@@@@@@@T@d@@@@@@@~@@F@<@H@@:@@@@@@@@@@@@,@P@d@@@@@2@*@@@@@@@@@4@&@@=@n@[@@@@n@@@@@@X@<@@@D@ @@2@4@@<@"@@\@8@$@@@V@@ @@@@@@@(@h@@@&@@D@@@p@z@@T@@@@t@n@t@z@@z@z@@@@V@Z@@@6@@@ @|@@x@@D@0@@@f@8@.@@@@@@@`@n@4@8@&@@(@@@@@@@@@@@@@B@V@`@@@@(@@z@@@H@f@@@ @@@p@Z@*@@@P@J@3@h@@@J@@@P@@>@@n@@@@,@~@r@.@R@$@@@@@@@~@J@@@@P@@@@6@,@0@@@@@0@l@6@R@@R@@@@@@B@T@@@@@0@Z@@@@<@x@@@@\@(@ @@t@6@F@ @@@@@@@n@p@4@,@@@2@@@@@@@@@@@@@0@ @J@@b@@@@\@(@@@@@@@>@@@@:@@j@@@@@(@p@J@d@@@$@@@<@@J@@@@D@@r@L@@@@@@@^@ @B@@4@(@p@>@@$@@@0@@@ @@@@@@(@@@J@@,@@@T@@T@d@B@@@@@h@@@@@Z@(@@@@b@@@@@@x@@r@T@r@P@H@ @*@$@@@@@@@@@@@@@@@@<@.@x@@@@@@8@L@@@4@@@@@@P@@@@@@@@@@^@@@Z@@@H@p@Z@Z@b@L@@@@@@@@@@@`@@@T@T@@@@t@D@\@\@p@@@@@@@@@@@@@t@@@@<@P@@n@@x@X@ @@@<@@@@|@v@@@@J@8@@@@@@@@N@Z@`@<@4@4@(@.@@@@@@@@@@@@@@@@8@V@r@@@@@@$@@@@@@@N@z@@@@@b@Z@@@@@*@ @@@@@\@T@@b@@@@@@P@H@n@@@$@@@D@ @@@@@@@@@@0@@@@@N@@@@@@@2@@,@f@@@@@^@@U@{@]@S@@@@@t@l@@@@@6@@@@@t@n@V@P@P@*@H@.@@$@ @@@@@@@@@@@@@@@@@*@@d@f@V@@@@@@8@(@f@@&@j@@@@@@@@@~@@@^@p@@@@@@l@H@$@@@@@h@0@6@.@B@@J@Z@@@ @@N@j@^@@ @t@D@@N@@ @@:@6@J@(@0@0@@@>@@~@J@@@@@.@@@@@U@@@@^@@<@@@l@L@@@@@@|@@|@T@v@j@B@R@B@*@$@@@@@@@@@@@@@@@@@@@ @&@<@2@N@J@t@@@@@T@@@@@@`@,@b@@@@.@"@Z@@@^@@8@@@h@.@@@@X@ @@ @"@@.@@@h@T@@0@ @@@~@@@n@@l@j@T@"@@@@@t@v@v@R@T@"@ @8@@@|@Z@@(@,@@@t@@@@@N@@@n@6@@@@@@@f@f@8@8@.@0@<@,@.@@@@@@@@@@@@@@@@@@@@@@4@ @6@N@L@@@p@@@@z@J@@@x@@@@b@f@@@@@r@(@@@@(@@@j@X@@@@@Z@@@@@@@@@@,@$@X@x@@@V@@@@(@@@@8@@^@@@:@~@D@2@P@@@z@@&@@I@@@@C@R@@b@@ @@J@@@@N@@@@@@z@R@B@P@(@.@@$@$@@@@@@@@@@@@@@@@@@@@@@@ @@@ @4@>@R@`@@@@@@@D@@6@X@@@@@D@>@@@@@r@@@@@@~@F@@(@&@@@@@@@@ @8@T@R@:@t@@|@@@ @@@Z@.@@@ @ @@@*@@n@t@T@D@@@@@y@q@F@@@@@\@@x@@@@@H@.@@@@@v@f@l@2@H@(@@V@ @4@D@@@@@@@@@@@@@@@@@@@@@@@@@@@0@$@X@T@P@n@@@@@@@6@@$@\@p@@@@@~@@@@@@n@@B@@@@@@@@J@@@@@@<@@0@@R@@@D@@@,@@$@&@@@@@@@@:@"@@<@@@.@@ @~@@@z@"@@@X@@@@(@@@@@@@j@b@`@V@R@>@$@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@$@4@@h@X@@@@@@@@@@T@@R@@@@@@R@@@\@ @A@m@@@@n@@@ @p@@@@,@@ @0@ @@"@v@@@@@ @"@@\@>@<@.@@@@D@@@@r@~@@@@@^@@>@@@6@@@@b@b@@@@@@t@@J@h@B@8@(@2@*@,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@$@@D@H@L@T@`@@@@@@@@@@2@@@2@@@@@@@ @+@@ @@@@2@f@B@t@@0@"@H@R@@&@@J@r@(@@@*@&@H@0@t@N@d@n@@@Z@ @@@@@L@2@B@@@@@@@@@~@F@8@0@@@@@@@p@t@<@4@<@$@@@@,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@J@D@<@^@<@L@n@d@@@@@@@n@@D@p@@@@@@F@ @@E@.@C@3@@v@ @@ @X@p@b@@d@*@0@"@^@@l@>@b@V@@@@@@f@@'@`@&@V@@@@@@@d@@@z@@@@@V@(@&@@@@@@@n@X@P@f@.@@6@ @@@@@@@@@@@@@@@@@@@@@t@@@@@@@@@@@@@@@@@@@@^@*@P@<@:@V@\@@@j@@@@@D@@~@@T@D@@n@@r@@@B@H@L@@@@@ @@@@@t@@$@l@@@4@@@@\@@u@@N@G@^@@@@|@b@*@@h@@@@@@@@H@0@*@@@@v@~@@`@l@d@:@Z@@@@ @@@@$@@@ @@@@@@@@@@@@@@h@@@v@@@@@@@@@@@@@@@@@ @@@&@(@X@"@:@`@h@j@@@@ @@@@@@<@@@@@@Z@@@t@@@@@d@*@R@@@v@*@N@@%@(@@p@@@@@A@@@@b@<@@@@z@@@8@x@`@*@R@n@,@@@@@@@^@r@L@<@J@"@.@,@(@"@@@@@@ @@@@@@@@@@@@@@@r@x@@@@@@~@@@@@@@@@@@@@@@@@@<@*@:@6@,@j@2@`@@z@@@@@@j@@@z@@@@@@P@@z@@@@ @X@ @@@@@2@@@~@@X@@@(@N@4@8@H@@@@@T@@d@@@@@T@H@@"@@@@@@@|@@^@h@F@J@.@@@@8@*@@@@@@@@@@@@@@@@@@@@@@~@j@@@p@@@@@@@@@@@@@@@@@@@@@@@0@@ @@ @H@z@r@@@@@@@l@T@@^@v@@@@j@@,@h@6@h@@@8@@@@N@@@T@@H@@@@&@@@0@@@@@@@ @@@.@4@@@@@@@@@@@x@`@@T@Z@R@.@@&@ @"@ @@@@@@@@@@@@@@@@@@@@@@@@r@r@@@@@v@@@@@@@@@@@@@@@@@@@@@@<@@2@b@>@@@@@@@@@n@@@2@F@R@ @@@@@4@~@@@P@p@~@@H@6@@@@6@d@T@j@V@@j@@@@@(@@@@:@@@@@@@@@@l@\@Z@b@L@H@4@,@ @@.@@ @@@ @@@@@@@@@@@@@@@@@@@@@v@r@j@p@@l@@~@r@@@@~@@@@@@@@@@@@@@@@@ @*@@6@d@H@^@@l@@@@@@.@ @@ @@@@@@@@&@<@.@8@@@8@B@@@@@@@@@@@@@@@N@4@r@f@t@Z@R@0@@@@@@@@@X@L@f@d@N@@@`@2@8@4@$@@,@ @@@@@@@@@@@@@@@@@@@@@@@@\@j@f@`@l@x@@v@v@v@|@@|@@@@@@@@@@@@@@@@@@@@@.@@"@$@@d@T@j@@@@|@`@@@@@d@@@@@@@@@@@@"@.@@@@"@L@@V@*@*@B@@@@@@ @@@@@@p@r@@b@P@X@6@6@&@<@.@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@h@j@l@x@x@@@~@@@@@@@@@@@@@@@@@@@@@@@@@ @ @&@@@*@B@N@X@@x@@N@H@@l@f@b@V@x@f@@@@@@@@@@@@@@@@@@@@@@@@z@@@@@@@l@n@R@B@J@$@4@(@"@0@$@,@@@$@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@z@p@^@@x@r@@t@z@@@@f@@@~@@~@@@@@@@@@@@@@@@@@@@@@@*@R@:@*@R@(@H@Z@B@6@:@<@t@V@X@@Z@@@r@z@v@|@@@@@r@@@@@@@@@@H@b@n@@|@@x@Z@D@.@N@B@<@8@,@N@"@@ @&@(@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@d@^@n@\@d@Z@@p@v@h@v@@~@x@v@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@ @ @$@ @@(@@"@`@@@H@\@J@ @6@"@P@T@@@@@4@V@n@b@@^@D@@B@T@8@2@6@@6@4@Z@2@*@$@"@@@ @ @@@@@,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@f@h@V@j@|@z@@z@x@|@@@v@~@@@|@@@@x@@@@@@@@@@@@@@@@@@@@@$@@@@@@@@F@@>@H@6@b@L@D@Z@>@>@L@R@R@\@2@\@H@n@h@l@`@d@f@@H@<@2@,@0@@0@`@R@<@>@0@@@ @@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@|@V@^@n@b@f@`@~@j@p@l@h@d@z@l@l@n@l@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&@,@.@,@.@@@@6@4@@@@8@0@@8@:@@ @>@*@@@@@@@:@.@ @@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@f@Z@P@d@J@`@f@h@p@l@b@p@b@j@l@p@v@h@l@p@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@$@ @$@@@@@ @@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\@R@X@r@P@l@l@d@z@b@^@|@b@p@@`@l@n@z@@x@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@,@$@@@(@*@@@&@ @@@(@ @@@@<@@&@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@J@T@R@f@V@H@f@b@d@\@\@l@\@^@j@p@r@@@n@@|@@x@x@v@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\@V@X@^@`@P@h@l@l@n@f@r@n@v@@d@b@t@|@@n@@@@@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@H@V@R@T@d@H@b@`@j@d@f@b@b@j@v@n@X@Z@h@d@j@x@@z@@p@@x@@|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@sunpy-0.8.3/sunpy/data/test/SWAP/0000755000175000017500000000000013232563477016730 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/data/test/SWAP/resampled0_swap.fits0000644000175000001440000026400013203275053021661 0ustar nabil00000000000000SIMPLE = T / conforms to FITS standard BITPIX = -64 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 100 NAXIS2 = 100 DSUN_OBS= 149633248102.0 / [m] s/c distance from Sun TRAPELEC= 0.0 / [ct/cm^2/s] AE-8 MAX > 1MeV @ 725km model OBJECT = 'Sun EUV ' / object observed COMPRESS= 'jpeg ' / (off,lzw,jpeg) on-board compression algorithm GSEZ_OBS= 2536247.26889 / [m] s/c Geocentric Solar Ecliptic Z PGA_OFFS= 59 / PGA offset DATASUM = '2077501251' / data unit checksum updated 2011-10-05T02:30:23 CREATOR = 'P2SW_PREP.PRO v1.3' / FITS creation software DTPLAR1 = 2000.0 / [s] predicted time to prev large angle rotationDTPLAR2 = 2000.0 / [s] predicted time to next large angle rotationREADRDIV= 0 / read-out rate divider GEOD_LON= 85.381345181 / [deg] s/c sub-point longitude SWXCEN = 502.53 / [pixel] axis 1 location of solar center in lv0 LEVEL = 1 / data processing level SWYCEN = 515.01 / [pixel] axis 2 location of solar center in lv0 IS_PROC = 1 / on-board image processing LED_SEL = 'a ' / calibration LED selection TEMP1DET= -0.7299870000000001 / [Celsius] detector temperature (SW HK T CF) CD2_1 = 0.0 / WCS coordinate description matrix GSEX_OBS= -621653.022027 / [m] s/c Geocentric Solar Ecliptic X CD2_2 = 3.16226783969 / WCS coordinate description matrix NPRESCR = 0 / # preserved pixels - cosmic rays NPRESLZW= 0 / # preserved pixels - LZW decorrelation CAP_MODE= 'CDS ' / (DS,CDS) capture mode TRANTIME= 993437023037.0 / [OBET] transferring time HASBLACK= 4 / HAS detector black level CTYPE2 = 'HPLT-TAN' / WCS axis Y CTYPE1 = 'HPLN-TAN' / WCS axis X EXPTIME = 10.0 / [s] commanded exposure time RECODING= 'fixed ' / (off,fixed,adaptive) on-board recoding CDELT1 = 32.3816226784256 / [arcsec] average pixel scale along axis 1 CDELT2 = 32.3816226784256 / [arcsec] average pixel scale along axis 2 P2_ROLL = 90.0057133278 / [deg] s/c roll SWAVINT = 15.4555 / [DN/s] average intensity in calibrated image GEOD_LAT= 44.372787237 / [deg] s/c sub-point geodetic latitude DATE-OBS= '2011-10-04T23:56:41.222' / UTC time of observation HEEZ_OBS= 2536247.26889 / [m] s/c Heliocentric Earth Ecliptic Z FILENAME= 'swap_lv1_20111004_235641.fits' / FITS filename INSTRUME= 'SWAP ' / instrument name PN = 130 / on-board priority number EACQTIME= 993437023037.0 / [OBET] end acquisition time HEEY_OBS= 6602941.95096 / [m] s/c Heliocentric Earth Ecliptic Y TTEMP1 = '2011-10-04T23:56:22.000' / UTC time of detector temp 1st sample TTEMP2 = '2011-10-04T23:56:52.000' / UTC time of detector temp 2nd sample OBS_MODE= 'Variable off-pointing' / sun_cen, fix_off, var_off, cme_track LANG_ROT= 0.7071067819 / commanded large angle rotation component LAST_ROW= 1024 / last read-out detector row FILE_TMR= 'swap_00993437023037_6c84e974.fits' / SWTMR filename LAST_COL= 1024 / last read-out detector column CHECKSUM= 'ZTEahQBRZQBXfQBX' / HDU checksum updated 2011-10-05T02:30:23 FILTER = 'Al ' / Aluminum filter LOS_ALT = 706128.127756 / [m] s/c LOS altitude (1000000=no atmosphere) OBSRVTRY= 'PROBA2 ' FIRSTCOL= 1 / first read-out detector column RECBIAS = 10 / recoding lower limit FIRSTROW= 1 / first read-out detector row CD1_2 = 0.0 / WCS coordinate description matrix CD1_1 = 3.16226783969 / WCS coordinate description matrix HGLT_OBS= 6.54332476965 / [deg] s/c heliographic latitude CUNIT1 = 'arcsec ' / WCS axis X units TEMPDARK= -0.7299870000000001 / [Celsius] temperature used in dark subtraction CUNIT2 = 'arcsec ' / WCS axis Y units ORIGIN = 'ROB ' / Royal Observatory of Belgium P2_Y0 = 0.00585828077518 / [deg] s/c pitch DATAMIN = 0.0 / minimum valid physical value ARTEFX = 'on ' / (off,on,cosmic rays) on-board artefact removal SOLAR_EP= 356.865318403 / [deg] s/c ecliptic North to solar North angle LED_POW = 'off ' / calibration LED power CRVAL2 = 0.0 / [arcsec] reference point WCS axis Y CRPIX1 = 50.5 / [pixel] reference point axis 1 CRPIX2 = 50.5 / [pixel] reference point axis 2 CRVAL1 = 0.0 / [arcsec] reference point WCS axis X TELESCOP= 'PROBA2 ' / satellite name WAVELNTH= 174 / [Angstrom] bandpass peak response LONPOLE = 180.0 / [deg] native longitude of the celestial pole TRAPPROT= 0.0 / [ct/cm^2/s] AP-8 MAX > 10MeV @ 725km model DATAMAX = 361.969 / maximum valid physical value HASSTDBY= 0 / HAS detector standby mode RSUN_ARC= 959.407562559 / [arcsec] photospheric solar radius WCSNAME = 'Helioprojective-cartesian' / aligned with solar North P2_X0 = 0.00320431118842 / [deg] s/c yaw GSEY_OBS= -6602941.95096 / [m] s/c Geocentric Solar Ecliptic Y HASOFFST= 11 / HAS detector offset level DATE = '2011-10-05T02:30:22' / UTC time of FITS file creation REBIN = 'off ' / on-board rebin (2x2 pixel average) SACQTIME= 993436794655.0 / [OBET] start acquisition time HGLN_OBS= 0.00259454778033 / [deg] s/c heliographic longitude FILE_RAW= 'BINSWAP201110042356540000419623PROCESSED' / raw telemetry filename LZWDECOR= 'off ' / LZW decorrelation CROTA2 = 0.0 / [deg] axis 2 to WCS rotation angle CROTA1 = 0.0 / [deg] axis 1 to WCS rotation angle PAV_ROT1= 0.0 / commanded paving rotation component 1 GEOD_ALT= 732832.136552 / [m] s/c WGS84 altitude PGA_GAIN= 1 / PGA gain TEMP2DET= -0.7299870000000001 / [Celsius] detector temperature (SW HK T CF) SIZCOMPI= 634864 / size of on-board compressed image WAVEUNIT= 'Angstrom' HEEX_OBS= 149633247935.0 / [m] s/c Heliocentric Earth Ecliptic X RECNUM = 3600 / recoding upper limit PAV_ROT0= 0.0 / commanded paving rotation component 0 DETECTOR= 'SWAP ' / HAS CMOS detector 1024x1024 pixels FILE_TAR= 'BINSWAP_5894_SVA1_2011.10.05T02.11.39.tar' / raw telemetry package BUNIT = 'DN/s/pixel' / unit of physical value COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT $Id: swap_fits_template 3732 2010-09-28 20:42:23Z bogdan $--------------COMMENT ------------------------------------------------------------------------COMMENT ----------------------------------------------------------This is a leveCOMMENT l-1 SWAP FITS file produced by p2sw_prep v1.3 at the Royal Observatory COMMENT of Belgium. If you have difficulty with this file or wish to make suggeCOMMENT stions for improvements, please contact the SWAP Instrument Team via emCOMMENT ail at swap_lyra@oma.be.------------------------------------------------COMMENT ------------------------ HISTORY SWTMR 147831SWEDG 147835FITSHEAD2STRUCT run at: Wed Oct 5 02:30:16 2011HISTORY p2sw_hdrchk v1.3 Computed detector temp.: -0.72998700 Celsiusp2sw_pmcdiHISTORY v v1.3 Reverted wrt swap_pmc_20100308_164500.fitsp2sw_pixrep v1.3 ReplHISTORY aced wrt swap_satcds_20100113_152800.fitsp2sw_drksub v1.3 Subtracted moHISTORY deled dark with coefficients inp2sw_drksub v1.3 swap_dark_coefs_201101HISTORY 01_000000.save usingp2sw_drksub v1.3 T=272.42 K, dt=10.0000 sp2sw_pmcrHISTORY ep v1.3 Reverted wrt swap_pmc_20100308_164500.fitsp2sw_ffcorr v1.3 FlaHISTORY t-field: swap_flatcds_20100308_164500.fitsp2sw_despike v1.3 Despiked atHISTORY the 6.0-sigma level (6852 pix)p2sw_imgcor v1.3 Image centred on solar HISTORY disk centrep2sw_imgcor v1.3 Image scaled to square pixelsp2sw_imgcor v1HISTORY .3 Image rotated to solar North upp2sw_expnorm v1.3 Exposure time normHISTORY alized data (DN/s/pixel) END ?ԏ?dtS?p9X??߬T?{6?aXr ?{ I?ݰ?kS?ᄓg??Z/;d?)m\?p?un?Nl z?,?R?ڠ="?]c?ZW/*? =p ??ڽGKƧ?1IkD?n\(?nvȴ? H?{K?`oiD?JNW?ۗzW?6$ x?$[7?a?qP`A?-O;?Z?.BZL?Y'0?ffg!?O?WE8?W?䣾F?₽<66?̡zG?׶XtX?p{?ظ0l?ȚƀKu?ə?_?#g]?>7? "?"?ћ&a?Ќfffx?}W+j?аr?3@N?Mj?e+?,/{O??|?ڑvE?_?ׄ?ӏ?e\&?TɅ?|PH(? Zv?V#S%?=Ձ$? qi?Q{D'?]ěx?1?@ov?L?u?[^S?ߤ?|?h\D?AS?~4?Dw1i?$/:?D^c?'+#?hr:?ű?Z?,ka-?i&?Xj0?!?ᇙ?9p?ÎXf?埵ԃ?UK I??CI^?˟K] ?h6z?6w?vE??R!-wN?{g?[J#9?ȉ3?; Id?_n?0im?-ڹH?K =q ?XbM2?Љ333'?j~?蟲?p?7xN?8$Z?W =pG?Nv?ǜ?2?;ƸQ\?q+?ޠ Y?\)?Fě?m/?ȸiH?? =z?r--$?..$/?yvȗ?⏝,?]@ ?gjv?416?Ő?ۀkC?T(A?`?q/?Q?`>?B?\(?֓?g4zG??G2? dzG?NV?(?l`?ލ=p?)1? n?Sn~?L9Xy?}pW?SZ?ٻ"\)?ظ?弔9Xw?TzHH?GD(??pbM ? Ƨ?(3338?~+"^?Kb`V??E6+p?\(!?ļ$0?^5?|J?6ȴ7?4(?fWz?ȴ9'?{kl>?u\C?~?@|(?j~?w ? O ?`A?z ?vY?9Z?ҽ+@?5̬14? ?+=- ?͐>vȴe??, =?Q\?ٗ17K??T9X?"?өڹ?RT`?t0ě?F]c?T"h q?%;p?8:)y?;dx?zv$/?ёf?P81&u1?S8Y6?ՌVfffh?֮_o??۲g?)u$?4Eo?nvȴ?XbP?N;?Jxl"_?/KƧ?X͞?ծ ?z6?Vf%?9W?J?Ǽ? I7Kƿ?ڱ;UI?V?JlI]?X ?/{J=?ܥ#?EzG?Zc?!TɅ?l~?](?7"?[2 ě?"Y?tj?䐒@?k =?fu?9'?ۿȴ9V?z?-;"?-Vz?݃O?l̀?D5?.5?z?Ԫ?_خ?6r?ؚ=?L?ص+K?fQ?\Z?ڤѶ?`V?sl?k:-?t-??TX?۬_?OZ?MO ?R2n?a =q-?ĆA?5Y?КS >9?gquV?lgL?֤?>?^ߤ?7!-Z?ę?|DC?|@^?[;6?jg-?v%$I?Kauk? +C?`?#?^r ?֚G?5 '??{J(??ގ-Q?̿!"?ލKS??x?!%?`B\(?,5?1&?3'8}?לkJ#:?ܞ?ܔT`s?\"\(?6{?+ۋ}?qN;8?몛C,s?N+ d??'?[b?C>쿱?䎂^5??p4a?J?(?FsT?ߠ I?朥=?=h ??Âݗe?7#?/PQ녞?ӻC,?ڝa?4'0?D?c =o? p?7KƳ?PIR?҈΂?N`3?g}Vo??ԍʅ?7K?ءl%?h9X(?ҮR?~vF?ߚkP?w[W>?јщ7K?cT?:xG?L?a?X >?:)?Uqu?ᝃw?Ҝw?덕 ?Ԙ_?ΕXy-?ߤ0?i7KƧ?ۆj~b?L8}P?%^ߤA?~R?m?bM?\?r}?֑tzG?}v_?Eں5??!u?4zH? [?iqi\?o;c?Dj?ڼm?սcJ? I?Vf?,Xy=p?̜1(9?מ$tS? qs?Ԝ1%?/;e?8Fs?%Ov_?یݘ ?u3331?;?Mo?Mj?+i?`;dZO?h+?m&?Ǥ&YJz?iDe?䎊r ?/?ւ\(?Jxl"d?N;dj?JMx?3??tS?ؒ ě?ƍ?iC?55\-?ԇS333?o!?sN;-?po?t?\ߢ?,3?TZ?dZ3?C?J.ߤ8?ڊu?w1? b?3Z?}T`?*,? L?c~?@z? =p?࢏4m?<6L?nϪ?ʢG+b?kwlC?ɥ?g#a>C?ө/S?˒:BZ>?ӲMb?C?~Q?`?OKƧ?'wz? b3l?à|h"?C-w1?42a{p?ԧ@#=?DTɅ~?X\(?7K?3331?Мj~?ؑ1&u?Ҭ333,?'6E?@?֝fffc?ZG ?f$/?̈́??MG9?b ??B['?" I1?A?̥&v?@-F?u(?zbC*?_0 ?{"v?cn.?V9?Դl~($?\3?HSE?w'kP?˓?ES =Y?%2a|?粨 >? 0 6?>?-E??? I?qRT`??|(>BZ?^IQ?cأ 4?-*0?ѣu?5b?o ?A$?-*&?䴓S%?| xZ?Jd7?K{tjz?^n?kVϭ?iڏ\(?䲄63?% =p?⠠T~?vȴp?)?\5R? z-V ? ҌL?C:u%F$? L?zx|Q?+?>I7?6?d? zxl?{O.?a5?|?aE!.?.G?ą%F '?7MY?2l?ᬡ[W>?PU2a?ߢP*A?⟽\,?ݛ>BZ?Z?r~?/{h?٩?kP?h9X? ~(?X! [?ҝO;'?{J#8?e+?~b?S hrs?3n?ȯB?2B^?ʈAG*?ѣn.?|*? غ?SAXp?DG?BC0?0%\1?g8?z@?8At?sE?-2-X?1rqg?қ/vT?c?å!.??NXy=?ԕB?oVh?!n?rxl"g?A{?]'Rp?"M?8G?;{Ƨ?e+?HYK?ޒnQe? i?)|?)^?NvȴN?=?PtW?la[W>W?%>?"h ?9W?.?e2e+?LY??SXb2?u%F8?/?Mj)y?;dZ(?Iě?2di?iղ-?cq [?ߍ^@?I?+ Xy^?Xv?%?MW?bM?ӥsS&,??շX?ZS^? =p?TɅ?Um\?Vϣ?zCw?yP?+i?815X?M?e?N5?}/?~}V?Ɇot?-[W>?y?^Qv?詃U\?A4?e+V? %[w?t?ɴ)'J ??ধ L\?ݤQ?1'KƧ?͏䎩?$%?تߐ?N;?fffj ?ظ}C?SIBb?_?&"?t0 ĝ?@ ?Ó]c?Қi ?Ys?z>?L0U2m??p A??o.6?oZ?IƧb?zt? +Z?XH?@5s곤??֜ x\?ѭPH"?&TtS?奘[ ?! L?^H? x2?ԮS =L?>T쿩?DG?ln?s|?Obi?w1?G ÷?.j?}V^?`9X ?焝%F ?oz?sNz?\(?hL?a9?ӖP?ۅ?Ůz?^6z]?Ҁ?z{?JQ?J? S =?ffc?9?`?\B\*?P ?޸Qz?l?-{l?J=p?l?ljWO?/1?۹}?^5e?3]cy?}?ӬAk?&[]c?Q?Q ?=VlI?m?Յ^?i}V8?_ح??v)?yԕ?^bM:?_G.H?>H?Q?w?l]?C?zL/^?y>($ ?&?6`?aa?~c?8j~?(?ZN?ݙB?`AR??o+ a? R5?}?+?'ަL/k?z|?%="?"ԓt?A?37?#?zJ#9?;dm?^??@7?=p?oqk4?l%?O)^?*g?zJk?=?h?鷰A78?efA?!:?Yk??3Up=?J7KL?ӭ I_t?U=W?N@?S*06?,?޲'/T?`4n?B?㡔Fs?yԨT?Zqi?z֡a*?ݞW?ҏə;? ?z?%?Mf?}!.2??.HD?*$?ĝ]c?}O?[ڹ?ң9s?uA? q?8,0?Ns?T["k?tW?1m:?&z#?D|푋?+"?h?W [R?62W?Ԇ ~?AG?).H?o}Wr? "?B_v_?گlC?D5Xb?\N?>W4֡?( ě??e?v:0?cu%F?VOv_?\F?-e?b_?Y? u?`/?ٰѷh?쑹.H@J?:kP?G*?824? tX?yu?Rf?7"?hO;`?7e@JxJ?x1&'@dp1?jbM?!R?|A Z@-}2S@Mn@xg8G?YM-w1?iB?O *?lj?":H?irGE?8?]`? =p?Ll?ړSΰ?S&¸? ?v?S%?/'{I?b ??C\?ZF"f?A;g?R!8?㼦?-DX?7$?^ xm?aB?&?f)?^?>쿱 ?&[?ɳ|?[i7KƎ?Z=p?)#9?摝1?ׂ?ۊ6?Xt?b ?8)]?աʽ?K7Kǐ?=8\?q?d(†?1'/?k"Z?![W>?)?@bM?=\?߈F?ޛ4l? BZS?9Gy?DQ? PH? ur?m ^5??e$R?݄݃M:?mES&?"Pn?`N]c?//?[@*0?81&|?L`d?g+j?x ?Xߤ??4쿕?bQI?QjN?H1.?q"H?G?:)w??0 =p?YJ@"+@i\(@Cu@ x@DbM@^q [@L64@]L/?MG?x҈@_@ '@e@Bnt@$<;@ۋS&?6@)S.?WSX?=e@yA@t?C;dT?{!\(?(%?ztoiDc?䴴`e??d?z[W??)Z?͑Y?qrGF?ᵝ/?^J0?\!-?t?\# ?ư\?V?褥(?Քti?X?|?]cf?*@hۋ?o&?޾%Xy?8Q?ԑԢ3?͆?L ?@7?*\h?.+5U?}`IP?'*6?f=(h?͢ir.?eX?G  Io?\ߤ??㟶iB? ז?T˒*?׌\`? ֍?a$B??4m?xQ@?X{?v*0T?ғ-!.?!-C?Nzi?/C?a|?d7V?H6?TS?x?ttN?S?,!-b?:vȴ=?3W>?&^5??7-?wZY?M?Q?s]??$tJ?u"h @zG@s@>($ x@J$|@ >P@䶃n@+ȴ9X@ qu@b@2a|@{^5C@h ԙ@ lħ@B H@nR~.@ @+RT`@gԕ@ u8@wȟv@Jz@z@~.@]NG@@`A/? }Q?$?uHp:@`+j?jϪ?(Y&x?ͨ)^?&r?#i?,A?c'?ƞ($ <?ƼR??ڏ\(?A7r?0bM?k1?EA$ݢ?8J?&y*?⤿KƧ?1?ᅤCT?#333?^?zJ-U?'\(?`w;d??}G??|?Rg?e5?|? |?$Q?6@!-Hˏ@(7@.[K$f@("$/@&}f@%UmƧ@(h@*0 @++@&\#@ A@ O@"X֡Q@ O~@rGEM@}Vl@L/@ )q '@3336@6bD @UP?!@m>?bz+?1?JQ?01'?ᑷX?!G?)^?Ϫ͢?=L?t?0`A9?9U?7au?J?iS&?}j\)?:"&X?׌?N?WQG?ÛQ>?IrGE ?Fȴ9?wN?@ ?hd?952?e&At? 7Kz?د# < ?V^}Vl?z|?Q\(?1R ?7Q: ?v=?ᰉ?zG? x=?/V?;dZ$?Y}Q?333(?Vp:?/V? G??䛥?ﲮO?vaB?!?rGG?uO?c+ a?18W?_{n?-Ow?H9XL???NƧt@Q@-@rn@S@w@5b@6Eʿ@@v1@!0P@(\*0U7@)7:@*lI@.lp@._Z@5͸@5!s@93S@5_U;@5fK@7R@99[@:a hr@2ib@2,1)@1LV@2fA@*shp@'0$tP@"@ g @ `d@ш@ }@:@_ح@&?S?z2{?Nz?0?C[a?7?m쿱[C?0%(?W;d?峌,$($@94­@5_S˒C@1G_o@+z@%&@ ʅR@A7OB@&uQ@K2N@ |7D@EF=p2@-H@n-KƧ@L0L/0? I? =p?k?V?;XDF?#{?Rfff}?-?ԕ"?5C?"?s?މY~(?X&?w*? Eq?:_ =p?Ѵ:~?Y? ?c <`?o|풊?m=p?х+jV?FRTb]?dL^?~'p?ߟ?Xy=?•\j~?%3S&?ڰHˡ? (}?6a?F|I^'?mKU?:~?hQ?l?VzD?Ϗ =p?`Ab?il֡a?ʽ<6?9Xb?/o?L/?D?aw1?C ?j%E?+PI?O ?.P@RE?hۺ@V=p@ 2sb@\`ߤ;@JS@ ,zw@$\)@1z)o@6lzw@8_G@C7s@C Ę@A{!$@GBYTO@B)dZ@;>C@;ՠhی@4sU2c@4 uXu@3hu|j@7䎾ߤ@8P:Hˑ@5'@;We@CH X@3MqZ@3Bͥ@= }!=@=PH@C;vqhr@A<4@?OKM@88@3WO@.TL@%O;d@X@Z\@?!Ϫ@R+ &@~Hu<@ 'YK@9@mA A@D???w,ۋr?"YJ?W䎈?Ct?th?-QB?BI84?o?SO? "h ?^1?*0??Rfl?- :?g?ԂQ? W?_?W+ ?1L?h1&F?6{\?Q.H?F+?@W =py? ?ʝfff?l5?|?ԾP ě?;cy?Eʵ? \V?Xb\?tja?Bt?pO;w?30?M~vȴ?B-V?eG?旍O?t d??Ԗv?14?.\(?ǬQ?-V?!hr?qXbP?@O;H@ =@M\@ I@wtjy@BG@#^ G@- C@5Y@Arhp@MlB@VG@U-/@<)E@3( bM@?*o(@:E\(@@N$0@DidZ@@\֣ @7*"{l@<p@6+ @? FzF@D@CI*6ȴ?@3RQ@6?(n?dC?w+j6?'ʶ}q?ei?qp*?$&?>g? ?}]?iC\(?\7?{J#V@wk@@\IX@$/@PH@ p@`Ay@(%F@2?|@CcW>@M!qu@U۩N;@Z<@K pffa@Cha.H@A@=9Y@DhKX@@mOF@9w;/O@84@BQn.@Ah!a@D 9C@>S߻dZ.@BN9@HSc@Am9=@BSnI@@_F@95a #9@@=:}@GP3حk@D6U'g@B-@Ad\Z@@7!@>i @9ҙ@A4@B+YJ@?YPbM@:E8@3@O7@,&j~@&+e@5 @G䎘@uQ@ Ϫͬ@Ob@?]c?KǍOR? ?~?H 0 ?AXb?5?z?1?q?:=p?ޕMW?(‹?^*?9X?)^?G+ ?<"?骏$tS?\?L?8[?ޅ~څ?e?ƄrS@?߀/?3zZc?[?dO ?x- %?jM?#b ?|}Hf?ۛe+?4? >?%oi7?\hۋ?K>6l?? bMҟ?3oݗ@???PXSy?]ᰉ? ě?Wf=@$'W@!>B@m*1@_>O@ E@,",4@!|b?@9YXPF@G(@S7N?@\$3/Q@Q3i0@Kٚ@A >Q@Bsϝ*@<D@;8=@7x @95hr$@:yM #9@D$@@Qwr@:M(@;"M@=ï@=̎_k@Arz{@F?n.@C^@@i@>ϵ@Bf@;`6!@@\V@=_'f@<g @A]f@B8bh @H8Q@G#*)@Fiѷ@Vl7?@Nf@A@6lJ@0 Hϐ@)/ŕ@ E@ml@0U2Y@9Xa@A&@/҈c@@?2a|???kH?6I?ǪMj@?REj?V?% ? QR?٥?&c3330?p'O?=o4֡d?޸}w?zC?`A7x?yP?ۅg?|O9?+n?cG+ ?Vx?q#?ȴ9[?>r=p?tt?z`!?>cn?!?1xF?ޓ.I?Ңq?,7K?\(?/|?N+j?꿽5Xo?:Fu?A7Z?zl?,B@$a?GhbM@5+@Q$tS@$@Z/ I@ [S&@#zG@p:@2_f>@2u|PH@J'@\ɬ(@Rkb@L|@B#\@Eև*@=@BK ^7@G:)@CO@A5KU@A쌋C@FF%ʸ@C_tFs@?i4&@A`-@@l@B @An@>@@O7@CR&L/@FJ9ER@D/? @DX9s@D[aR@He2g@Qq +@Du x@=e{$%@2OB@'-1U=@"v;dZ%@ s@/[@rz@K[W_@ x@e@=~:~y?i=~?u!@n9Ƨ!?m6?g.?xQ?kxQ/??|aP?ֆn2Q?lܷ?`A?:tM?%v}R?]~5?Ʌ?ӪM??᫽ϪͰ?୸?DiG?Ӑ ck?s?z{?a%? S?js6?%B?7?jjfs?t;333/?xhۋ??;dF?ꀃtjY?]c?333H?584?dZ@Q{J7@!n@t@ &?@NϪ@ސ-@f*@@'S@'$.@97,=@DoЁ [@[U 2a@RVKj~@Hoi<@@.R>@8?cS)@Fr6l%@@€@3W&D@53@>NMt@5@?oWY8@@(@E[N}-@Dچ?@G @Gw|(@EG@Du@@.5@A?1@I@?:xl@8F@av@<\"3@C&Iv_@@ԕ@Ap- @Dl@>c@DwB!)@?W@?[U@E- @[Drw@KY~@@_l@4OrO@.J7=p@(֡e@#5x4@"B ԛ@YJQ@ hv@:PH@>:%K@ Mj2@ӝ)#?/tjx?@N?F!^5t?}j? ԕT?5[? _H?!>?f??̰Vt?Ѓn?bW ?ٛ8r ?Y333p?@.jh$@4<+e@:;F$!@@C@>/ ]̪@Q{W>b@MMZ@A2 \j @5I+@-qA [@(W(s@"gq@&x@u*0U2@ bM@ O/.@"M-.@S\(?jn?he?_s*? Ƨ??߮?R ?6ސ?8l?/;dZ?l*/?ʖc?}wi8?đY?+V ?jf+ju?T`?:0 ?灳{J#?X?#iB?90V??g ?;RT`?na?k06B?6A\?$N$/?u^ ?3e?m;S?sO;dZ*@M#@ RE@:Vl@S.H@YC@3-@ yn=@,1֡a@6EN@G/@Sl[@F88@BܑJ@B;NU@=%@FMho@N&@aj@9Ջ+j@A .z@I7K@G8Xy2@Q,䎑@PV@Gv7O@KM@IcQ[W>@I{Mj@UPz@@Y%ktx@]WYo@Rݿ{@J#7ʙ0@@V($@6p@8&~@B)##9@;Tf@Gxa7l@C5̋C@?Y@<j@=<q@Bwe@6Z@0,Us@1څp@5W& @8QM @5Vݲ-@@8.@Gɓ @D#>KƤ@PėN@KQyPbM@ARs@: dr@2lK@&i@zG@.@ yc@ *Mj'@ 5?|N?oMk@B%?($ ?4mŠ?Vk?q?#}G?W?m?CK=?o;c?j~?n@?ZƀIh?ϋVv?͝ě0?9$.?*#9?֙ȴ9B?Y =p?  I?݆-?&?~A?R p?6 =p? ` qg?&?^ qx?-Q\*?>Q!H?>zxm?ZH?+UM?ؒzL@V)~@ \(@ L<62@|@;v@ [j@'@ ԕ@4~vȸ@CTwn@Xf6@OK@Nl4@Cљ@B4iB@B7U7J@@뿁 [@AyJ @RiZm@Gm\@HTzH@Q6&@`M@cFtp@^jW@KT@XB&@Sos@TU@c ˒K@h;33@eWJ 䎇@a,p@^aLn@Dն3@6QbM@2w54@5B8 @A; =@8u@6 =p@8{a@9{<~6z@5> ȴ9X@:쿤@7Q@3>e@AdZ!@FP?o$@E*BM@1M@;@;֮@FEtq@C C&@TM@L04m@Bg/@6ICY@)'/@cx@LHr>@"@ x@u#@nc@KKXy/?@N?xe\6?[W>??333+?e?qdO p?6z? ;c?ߓ3n7?#J#:?Ü?_B_?l_O ?qXbJ?\zG?\zG?lC?g =p?jT쿷? E? ֤S?( I?)U? Q?mb?͐>n?)5?HlC@.H@z+@ (@j/@ Y@ ,ě@?@PH@f(@#AbO@1k@AdUX|@VTk@Gk4W@HKܛJ#3@S3K@>@9T^5>@8Zb@CtِbM@@ݕ,"h @ZIᵲ,@Q1v3E@SƸQ@NIRg8@_FU@a X3@_a @P*M@Qe(@`M\@]Gw@a<$:@VS@T76z @IaA@A@4MS7I@/qT@D R@/I@4[@<|=@4Ψr3@7|푝@9!ƍ@6 ( @Bҽ<5@@Gz@4Rjd@2r_u@=K0)@>S&@;8ne@:N$@Ap (T@?@H˧@I F@X蠐1@K۟K:*@?vL@2Ir q @'^jx@d@X,@{@wZ@  9@rGE@7#?+dZn?Mj?7?*`A,?ۧҶ|?>?g8W?Ycl?x!-?-d?7K@02-L@1=@4U@@z@6 Oa@3KC@@Q^+@< Ƨ@>:G@>@G_/(@G-Q@H7:B\'@Vϙ]4_@0k@ iY>9@6٠@2*@31&@@.yn@Qw?v_@46E@6KƤ@:)@1` 7K@-`N;'@1@,Dܽp@3V(@;u:G@*} @;-@7.ys@JJ@A8bX@8 Z@GȳMj@@Yoz@Trj~@K1 .@G[@K(~e4@T[k~쿭@M5 @SnM@Bn@K1@^wt9X@A474?@JYO @UjlG@4˳+@*v,7@5aI@G}9Qhr@O((G@NN;d@"\zG@?M@:@7VqA @6VWO@9S@364B@3Zt@.TΌ@>NIr @AA89X@CYD?@6,?}@21#@9%.@6Y1&f@B#v @5ES&*@I_k@Htě@Ij@=-`.@F4I@?kEw@C?M*@FU\FffK@Bքh‹@YSR!Xq@HĤRo@=DX]@3"(@+p7@#F5@i_Y@`x@b@ W>@@afO@8H? =pz?]+V?D?Q ?䔎($ ;?;䛥Y?%a?~5?|?6R@?aoi6?RO0?zJ?U"?pX?˼Z?Rsn?CBZA@]c?m =\@?@Q@q @|@#˚v@-u@4ӖY@@X^@H-D@MQl@T,<@QYhe'@Lx@Sf@N@^nq@oz@bȚ`T@VBCc@F` j@DB{r@@p8@>H@@@T7T`P@DE o\)@9@?OvP@>|x@K"(@9 3hr@1xSa@0쭚U@Gs 2@GM\@8 W@' 'RJ@2̪g@,E3@8%f7@2Lc A@4$ xA@(g"@37|^@;]}@;u^5c@@^a@B$R@1^ @6b ^@?;J=p@46+j@>Dra@5/@Bu@DQ@I ~@HO,0@=~k=p@B gL@Eos\)@;x.@FX@R8n<6@R5x@@Y0ě@6Z@+^k8Q~@"J#9@͞@`9@9}@ )B@ր4ֱ@(?|g\(?1?6C,?Dg81?-?`t,?āo;?# Be?HK]?s?e?|\?ܸQ? ?9X?K%+~?GQ0 ?1b?7q?#)hr?KS?Uk?C@Ϫ͢@m@ Mj@=$@fPC@4@#^5?@-[hr$@5d2GE;@ALqN;@M#wg@X I^5@[ d!$@UpL|o@Xֶ @RVd@SC@rp*m@g*@eճxA=@Kt3@:ʹ@'^]cT@-!ZQ@B/Q@=ȣ[@<+@A-3@62rG-@@W)Q@9a:@,&h@,}!(@0>t֡f@,\?@/u%E@5'@ߣ@/9n@9C\@AJD@1B(@$n7]@,q@.K j~@3Q@3EC@7u !@4i*0b@0a ]e@1|Ւs@(G =p@1쿫@+5N9@)5XD/@=7@7eɺ^:@@S_@M !O@G:x@@=Vl@7!3338@>G @R`Mof@I1 @Rk`s@ISE@;PP_o@0 9 @&3ј@I++k@2%x@3F V@:4`@]d ?1Cf?> =p?9 Xb? ?Fsi?ZGE8?7K#?'.H(?n_qE?(( ԕ?1?/?;R?6ffff?ڊP?Q?_ =p?\)?nzI?l?G?!@ =n@S@vf@ II@ @Q@G@#ffg@+]O(@3:(ٙ@>G@J=p@Xffi@`!)z@\8@[QE =r@HP u]@fvffl@f:%U@dz\"@bG@P(w =o@.\333@4t}p@, L@0 aG@E@“@@@>@D =@FIv =T@?˜@5\@/8Q@+.Q@?S@.vffffm@.ff`@"YH# /@$k8Q@7z >@@nG@RT̻@4333)@'z@%`F@%ff@5@:iL@>5+@6\(@,;G@6k@-sKzG@=zG@87c -@5Ǯ@8@@p@B~\(@E@Dop@QQ陙@Fj'G@Ub@NP @H;~p@Qtu33-@D%A|(@6"^Q@*9 @@fffm@ ˣQ@80zG@?I\"?4?zC?\(?<(?

E@j_0'@eoe@ed<@Uk@IgQ@06o4R@9;m(@4@|@D9 k@GK?(@W<ʏ\3@OCQ@GK\Z@E#'@55U.@2f'P@*ױ@1y@0w@#w @' @vc333*@-.7@.cb@1G?@:YeZu:@'@!j~@.Ѥ3@71&@.`{l@=㯾ߤA@:Ʌ@>"@@>\,@?R:)@:G4!(@2>\@6:@2? I@/곐@4@BcJB I@9W@@%g@Ejcm@>@H@QL)@H&kK@SW$vȹ@H:@7&?@&P:@4=p@ bL@u@3V@o2@urR?PaQ?zl?,mᰐ?4$1' ?0v ?׊3N?oq N?8V?}a@XD@IA:&@AbdZ#@BVn@BEF @7ɤ%@Jb5?}@R(33336@iw=D@M !_@Z1p@[Wȴ4@HcS@4l@4RC@1n5@-ɻ5}@x h@K]@ @.8F@/A7/@&"Ԙt@*o@*1XO@/X@))Ek@4T @8:G_o@8%`Aq@?Cl@.“ @4JZfffo@7c"@M_o~BZ@ANϷ@7a @.tY @2ca@4rʌ@(=uU@9E:@=`$$@G>,V@GhL/@A1 oh@R#hې@H K@K|a|@:˩jd@.uoe+@!z @j~@jOB@ @w@S.@?z?!-w.?i@N{?ӧ?YC?@ qu@?cC,z@$3x@)2-a@AyJ@PmL@b2@pe@[7QQ @_Je/@Y*@_Xg@q;L4@tuf`5@Ggffa@>?yXR@4jG @4\V@2_n@4F@7.)y@>=p@BY@8 @ez3U@`)4~@V->*x@.\]c$@1 J=p@3wv_@7 C@4\М]c@)̖Oj@. @&qu@_o@+MKƧ@!e@" 0w@4oY@@ؒ/ @Er"Zo@E0;%zxw@C6`A@GT@Q&@K@N@;vw@-辐@ɭ$O@M @dZ@7zG@ %Ss@ )(|@ Ԕ@?mm(?L"??ï?ح?䉬n?xFy? %RG?Ws?Sna?bO?@z?k =?nT?\S?E?H?>G@~@+l@s$@ fffH@!|l@_a&x@ě@"59X @*=p@5TKƦ@C`C@Ws+33;@p=+@V ;@Uu]&@] A2@_$~@Y(lj~@VbNR@Wzk@?Q|@/C@3. @1Q@*Cě@,T P`W@$\V@-D1&@*T(fff@1{8Q@<"+.@7l-k@94Jx(@0!G@3/%^1@0,Zq@/@1Ph8@3O޸Q@1@2j~@ M@=;d[@W(´@N-V6@w@'tL@5@< =/@+^$1'@@$7Z@#ft@/=@2Kƨ@3+g@2C@83/@Aa燐r@I#bN@Gq@F=B@C1&l@? Ǯ~@9<*~@>?|@EqENz@F;"@A`pzG@H:7K@S$K'O@@1Cn@1mU@%U_n@NNE@r̙@-K@ ě@Mqfff^@ ~'@x@D8 "?gl%?Q?`\(5?Q7K?0R?ZT?Y\?ɑ? '?s?r"??GX? IX?v4m?C\?Q@y=ن@L@"h @\n@ \@@ ԕ@$tS@p@%0+a|#@+Xp@5|@E>s@Zo/|@U9;5@UԤR@X%[U@]*@E@@;Ek;f@Q}Zz@C @D@/@4+@.WHˌ@(wH˚@0|@(G@=0".f@3V?b@J#ɖȴ-@@<@0:Yl@9QW@31@3QL0@=a@; '@2W!-y@9m2m@*dh@/.~(.@1%@ ?tp@#jw@!_B@#dN唯Z@)!@!su!@'p@E@3Eof@9oN_u@5MڹV@. x@6eֻ@)s@s@5Ψ|@4 @4oO =q@25?@3*6@@?!-z@;lD$@4šʼ@5p:@</@;-@7(i@9/@9h>B]@/|PH@3p2䎆@5(r@8+@(KR@-|D@-!1@'@#9Fn@#OA [@uB@#f8Y)@(KOn@*@Z=p@.b@+bs@1Hi@8p [@Bۛl@FX.FU@AA'@AE@DZ@FPp`H@BLA [@Fl^R@EE@FMߕ2az@H6lIh@Q?r%Ϫ@\1@H6{Mi@6f̲@&޿ ě@$G)j@"^Fs@1ۋw@$ߧ@b@ jQ@ q=>@H/{3@'$?I7Kf?A q?@t?YK|?㙀ě*?Q? +X?rGE?\$M?~`??? o|g?mS?[E@_ =v@} L@z~@XXy9@dW>;@333%@ mN0@RT`@/=p@($@6 `@DE5 @Rd_O@^ Bc @Pu@N6+@M5؀N@D߾v@:K@6e(@5uL{l|@1p:@8@8sx~@7_@2MO9@0 @0($@8hN;@6\l@9XD@=u)o@;T˒H@3N!-o@0Yj@0_ع@7#f@7 CZ@% ?@5@7b\Fs@8 z3@<>i@;U@6*q&@A;dZ&@@H[DgE@E(s|@5hO;k@6:9E@9R@/Cm@)yXbG@0Ƨ@/"R@2ᵕs@3j@1J@*-Ȍ~("@${E@+~sE@-vrB@*.z@.]K:B@/lc&Y@9 :xl8@@*d@?v@ADDnc@F~kP@I|@G̡Dn@MC p@Ia|65@D7ez@D <n@D$@N9e@HR Է@Y߲=p@M ϕ@??hx@8Қm@4Pntx@+\|@" ~((@N^k@Q@:}Hp@ =\@;?B@Ƨ?nfff?D'RS?vo?[5?䧤?[? ě?^5|?)Gv?ˤZ?Rp?z+?9X ?kC@@4\Qr@L]@>JEʹ@{ՅJ@݉7K@ AJ@`Q@ =p@ |@)L$p@8ڴ3334@Dɽp@SdZ@T ?@M"@N0W*@EyX]@Cs33>@Fh4?|@AY @Eff@>~F@B>@=%ٙ@3KƧ@+|8Q@.`&x@5o33V@B[dZ,@0#7K@(333@8{l_@:mՁ@8Lf@:~@3Trz@BUO@=lRn@A71&@,C+ @2zn@4XO@9<[@9äS@5|B\7@9rY=p@3xכ"@-mJ@+ ;B\C@7:^5&@/aG@2!$/@,;r#@.oɺ^:@1@j )@8@7k F@99f@:k ,@:D޸Q@;GC@> (š@Grj @Fff^@F<@Nм(@GG @?z0@>Bl@DVȴ%@PP!M@Vv@T9S@QEQz@HZ@B@6RS@. +@"@ XbO@{fffl@&"@L@ ~@/@x?6z?hr?kE? =q?z\(?q+?o3P)?S|t?'$H?8!w1?w ?p:Z?2?=e^5)@tS@$N @ՠ@ N@ /3334@ HJC@jS@r@)[O@7ٳN@GtFs@V&4m@U݉P@NQ6@J@D Y@)9Y@)TɅ@3$IG@5~*@)/4m@,dj@'."w@$K@,̙@7)@(_ L@1J.c@4t$@5}xl,@7 d D@5\j@2%Tɒ@4zUz@9j~@8=ڬ@5bUG_o@A.H@>׸7@D"q<8@L+17@A@DviDl@>@BKQbM@?xJ@;%`A@@%@NB:T@J5oh@I+N_@Uk&@Lpjy=@D &@9l0D@,Mm@%כQ@ 8@T @@{J#>@·+0@ Y%F ?`7?`D~?(-?Je,d?]Y?𔸢3?Z\)?˂&?7Z?A?[񙙙?_ح?vȴ>?O;j?@9XX@&C@#@@ót@Sb2S@* >@&:&@jv_ة@ zE@%}H @3n9Xk@A@TBˡG@VfH@OTG@NQ@F@AxV@JjBe-@Ju*@4m@FQOD@B+)w@Gy@L Z@=@*͞@9ݕ$@3X@.O@>&-9@7;`K@="z@3$`A7@0kK@5乿$r@8L.1@1@#Bc@0C1@4㢜t@=sOhr@2 @8HZz@1v? @.T@3>X@.h49X@:rZa@.d~@5w|@6m($ a@4+<@A2R@KDtSw@@ۊu@4a:@@@8333@5Vz$/@8{_o3@C!1A b@H@OU;5_@G@E/Q@GkM7@B`Gr@KP@C@9#+C/@?K1A Y@F\@H -@F XQ@X@a@U$rE@G8 ~@5@-r{@%fz@!Y}@$Gx@Uzxl@i5@[݃@>M@h$/.?Sd?V? 3Xv?RU2?<?Cc =?fz?F??.ڗO?A [?=Hq?HQ0 @bM?^bM@'MG@:~@^g6@vݕ@W =p@s1@3 jP@ $O5?|@( hr@3g& @?a@Pw+@RbnA@LMj@J~Q@G0}@B덌V@Cb@I::u@KPa@D}`b@CiB@D]p @E)}@:=#S@:y@1V@0,V@5G@3FR@:lb@>,/@?T\@3ިT@,d:ffZ@5mtD@2sp:@6ڼɺ^2@.@*y+ 9@.pD@=+h@4cn.@:2LIm@A 4zH@Jp @DYW@<fH@B@7m@07慡@;c6*@3;3p@>ѕ#@7݆O @Jj=p@@=@8'6@A:9Q@Bѷ@GkƧ@EkPbM@B-w?@H5|@Xh*8@Lq#S@QjKqTɉ@DxAC_@?YJ@@iP@:8fx@BΧ@FAC,@];f~@S@Kx@=(-V@4i" ~@0yfffk@(D@$i_>BZ@!,Ǯ{@y$$s@ @@U&7@ n.@( ĕ@ɲ-G?$k?&Q?%|?n?,"h ?6.?e'?fx?>"?^@]?j;V?M@Qv@m?@Ghۑ@EJ@en@7}V@d7K@/@S=\@(Z^@3*bM@@緰U2b@QmF@X[=p@NG1}@NU;f@GW(@E]P@@Ǡ@DW&v@Hh1&@Ep5@B>:x@@G@F,p}p@CwҰ @:\ө*%@6*F@6hۀ@8rXy=@8X(@2e!@N@6'@;L2@- O@'"a@5ӕ:@5]c@/@4TwO@0+@4\w`@;ݲ-@C6R@9ݕ@TKI~x@N^?|@Q5&Fi@B,-@8{cѡ@0\Br-R@/=e#@79oT@0@72(@@a.@27@:lح@I 3Y@9qjN@GNHv@>mK@>*6F@Uϑ^@R-!Y@XFT @^j@Q팟v@G9b@C˔@K=$mV@Bd@T?@^a@J @@~@=+@4VWX@.b@&;g@ h8Q@*T@x@>@ &@Oz@ߒ`)@pb@'r? O?1'z?!$%L??zv?簮z;?5Q ?q?ϣ"k@?E@ә@]-O@+l^@ S&@ aC,@Yfffi@C4 I]@aDO;d@̕@'3331@21@<;~@MLn@T$+@O#ؓt@J뇮u@D!@CA'+@A]6@L+|`@N  @G.C@EOi@=fZ@5a6E@9'!G!@2Ã9"@DSE@GmX@:.z@,_33P@)m9XT@3ZG@?=p@5l?@5Ǯy@7V|K@DO X\@4ә3@)R@0F n@/'uO@%(@%9X@0@*x,@@,YX`@E2@Dl `@Ap@F̻@a7 =@mpo{@U^^U@bI@\hvȮ@QXTvȾ@E Ġ@@ Dr@6p@G@N@^'B)7K@W=p@H%;@E=p@:T4@1W׈1&@'9hr@"+ @Y333?@bM@ Ƙ(’@ *1@@ =p@F\(@ I]?b"m?$t?U`An?s=p?R`A?西1Z?ڞvȴY? ě?ح? x\?F r?&@Zz8@,s,@ Pz0@+@/{@ /9@p >@c'n.@ ̣2-f@!*q@'  'd@0Chr@8Gؓt@JG+@Z=h@LqD@L@M @GJ)]F@FU=@SF2@Ks$@E>7Mqh@EWA!@?ޏA#@@ՐX@3{|@@L0@:gn(@A@3`ě@;S޸Q@%t+@/߱@C9ol@2נP|@9bM@G@EKt@@ AH@Fm`ě@A`A@[2`c@IFP į@MJl@a1:@D ~@2u @1NTw@2t[;6@;cR@9&b^Q@:Q[A@BD*@WrSO(@i.).@X-@I_1s@\~n^@jBk@Z̉=@f_@\TD {@]q_@MRzG@Gح@Aן|;@Xs @hUw@R~1@Mϐ@Anx@=g@1p@*$9ѷ6@#)@t333,@feN@ 9@"@Y@tj?C/:? e?)YJ?"h4m?Ed?W?8c?DPHp?2\(?ӊ ? (?M~7z?en@< |푃@ *0G@ ܲ@ 4oiD@˝@In@0s@"7@&֘5?r@,˒[@3NV&@=.oy=@JB0m@X8+@N%L\@J1&u@O-a@JVϪ@UH@WMg =c@HMU@H,<@AUr?@> }Hˏ@5rwY@:C =h@2+j@6O @E@?@?G@0;@*\(@5]@3&q,<@5br@3nb@2I@hۛ@Dv@CM gg@7ut@n**@Y .쿦@Jn<@P݁6@GNٙ@E(,<@F^i@C[p@S{@EI\@6uiC@-͉wg@)^<6!@51 p@L~C A@=Bh/@AT)@kȴ%@hc5@S,=ٶ@[;dV@P:33 @FNl@7"~@'Yp @$ix@\G@@Xb?@`Xy=@ A6z@|'lCF@ ^5?t?f\? b?m[?il4?뿷;d?6g?"P?x-w1 ?ˇ!}?⎣= ?!|1?Ii??r0U2_@WT @=@N@A>@ mv_@D @j @2 q@! @&i+n@/1@p@3pq&|@=0h@J2Dg8|@YJ'v_@L3|PH@R;@Qѫl@Q we@P{@M{?@GuU@K<'@CZ#>D@>&i{@G |*I@@;VR@9N;@C*@BA"@V'@P#I@`ȴ@kJ=Up@RKAsǼ@\g}Œ@Qݗ@Iyح@ST5-6@lf'@pET@f'@@VYX\@M^ ě@CC,@9W>@*B7@#6v@Q@K@rGD@N;@J:)@}OKƧ@2-{J#C?En.b? 1&w?F?t,?ԟ?.a?\'?o=-l?/qu?($ k?XCk?Bڹ@`Aa@:OvP@ RW@TL@c@o@Kƨ@"=b@'q5@-h @3Õ@8@Cq[Q@S2n@Q[WY@Pʮ@Tyz@T`tS@S1Գl@Y׬@9 Ƨ@AhA@FɅ@Ohې@PmhJ@P^?|@:lϪ@5{qu@8u 'Ry@'M@/V@(4m@&$x w@'N@.D@zxl@2v2->@9~ @\|Evi[@=n# @+P|@Q] IP@MD2@C|@U4Zw@PA@:2n@7uY@7e+@C R̿@JS_@RX¥@G"ѷn@L &v+j@Jd@V +@;\(@b%j@HW87@Rqu@;bf@@;O;@` Iv@K;Q@O9@O)@pX95@ei;d@I(S @Nlo@P @r>(@u 96@qn.@b*:)@R@G5?b@>ɀ @4"*0@,O$n.@#@=p@?@_ح@ ~S@ Ó @ g@t}?閍?ed?#=5XH?zF?hrT?Ž?gpR?\?O?/ ?*? S?XzG@iH@@ sKƨ@y?|@\|333k@r @YI^B@#;fffa@(\(@0z=@4t@@DV@QD(@Xdz@MQ@Tߦ° @\Vvt@Y!LzK@]vQ@:z@CaJ=p@J ^Q@]ěh@g*s'+>@\|M =@Q]$z~@8^)@$u(¦@#&@$&ff@F9@B^@RX p@avu@S>E@F(@]ƿ}p4@u!p@oWA㕁@f].@Vo M@MTfn@5 1&@+NzG@$ȴ<@fffZ@gx @o@ F?|@ tj@2zB@TbCh?Q/?Y7KP?$(X?=]?NR?Įܬ6}?ol64?j N;͠?RZ?*6|?Ice?`)^?f?~7L5@Z(@}T{@ &x@ ^BZU@qx@JW@.H@"+m@'s@._Y2@3x1&x@= a-w7@Gh1&@Y+y=@FpbM@GO@UI-p@T@J.@[,@DhUs@YO3@d;+Ӷ@n|@g"@S*@=v*@#Ӷ0@$qj@">@*k L@0GS@@*B\3@8ݏ>E@@ +@5:@:)B@LS@?tҽ<@*HKvȴ'@7uBè@C @Whr@hTCL/7@7&gl-@<11$f^@A~Q@C#{|@8l@7}@A%D@0B9@5rw҈@D`B@6 =V@E@I٢_v@E w@9B1@2fffW@2:e@1#1&@=DTFsn@CXѷl@Mܶȴ @G͞@T`J@MըXc@M^i@pjS@p,”!@cg8@S@KVaw@CT@8ft3@2r@-.UqA o@%J|@\(@}Hw@@+(@ #vȧ@?Q@ezG@s?$/6?H%&x?RxYJ? \)P?6yb?Zw?׌?#MV?Z?8l?)Q?jՔ?%(?wl>?E@KƧ@p:q@Tq@\@Ϡ-@"وh @%K@-e!.`@2-"@;*K@H@Auz@M@m@[7K@SG-?|@D$X4@STs@M,z}@JYH@H\)@U#@\aZ@n\Vʳg@hLJ@R6DIk@Ss0U @RrZj@;-`@&H9<@1T.z@BcT|@;2 :)@5u-w1@;<@1$@>O@?}B I@$*y"@8K>($@2l@,Sk@ h@P@#"Y@ _w@ 3@+@-dZw?!?ȯ?^G+k?KƧ??ܞnѸ?[#>?*I?-U2a??š?}?!-wA? _?yt??A@ ^@!:@ bqi@% :@ Id@#%qg@-,0S@0\? @2z^5E@B|Xy<@K@OҲN@`Ls/R@b@c_ؐ@HpH@PZSh}@T؀bM@Zy8@_ [@aBU:@ghq@WK@Jo@Dg [@C%@CF @4F_@7|G@6n@@hۆ@/y;`@=z$e@-8=p@-L9@G |@"]h@ 8j5@%0@1xa|(@:-4@?lu@B>\@Cu@AY%o^@:_o1@6|h_ @4}p@+\ @-qu@4RN;@3:@B?@5aΨ‰@EG_o@HlcK@ALvFu@23b@+SsE@2'*ξߴ@7A@:?c@Ie@?W =@=]7@4H@1;@J3ѷ>@b r6@`4#9@X6^@P~zxY@B@<*z@5@/Qr>v@$pPH!@ȴ9V@=p@IcA ^@Y%F @K\(@kb@3b ~?bq O? IQK?D x?X!R?t?>K?m_?PH(?\E@dsC @th@dM!@H.tS@PcT:@W\@Tf@TfJ#5@kdO6@RSIQv@PΌ@]edZ@?LS\?@FK|k@:/D@8ѥS@7U@7SV'@>a.@5w4!G@'X0F܅@6 ?@2tm@3Oݲ- @*?36Eʢ?tj?(*?,S?\?z?fffg?g\(?"IGx?Wffff? =r?&fffc?DzG@3R@l\(@ Q@8@ ffff@p @!nfaG@,Q"@8ffl@EWQ@Qcmp@^ I@d7z@p6@Rҳ;@A\Z@C =p@NeR@Ms330@Trb\D@V`;j=p@P3336@N@O|(ffY@8ğ .@;m W =j@:lp@3O=p@6M@0 =p@9(@(|(@$vG@$p@$ZN@5+ =r@)Mfffy@? s32@333<@7`zH@7J{@6U3(@'ҏ\(@'@9oG@A/,@=Fp@6 =p@7l@F,@6aG@90332@@hG@BV3 @BQ(\(@LBٙ@?3333#@;rs33;@B6 S332@C9&ff@@/p@AjK@C3z>@AFfff@: Q@4[炏\(@IV"\&@`@lkffU@WލW\(@I ȺG@?TzH@@|33*@8p@2`(@'OU@#nG@J\(@f@U@E(@3333 ?fffl?fff?!p?'mSW?v=p ?YYQ?\?b\(?hup?r^N?ɱR?꫑G?.=p?iİ{?i V?okP?S@5TɅ?Y@@ "h @u@zG@"Ft@ a~@#N L.@&przG@,_o.@9&7kR@H7K@XJqN@] 0@^!@\KJڹ@@nM@AFJ@I%Us@AMOB@G%+@c<xl@^@K7쿳@BY@6o@3刂@=WNj@7vd?@1PM336@,(Ϫ͟@8{*~@/yϪ@"n@Bn@$/j&@31A i@: AɅ@5@J)\0@Aw1@>ff@=h0 Ą@6iDgD@=W@4;l@:@Bσ{<@3IS@Fb+@XY[Wa@A9Z@?SIԕ@qGKa(@deO-@SM2@/@>a4@7 hr@9#u@5%V@0K~S@%@!7X@ F6ix@3332@{W>6@#":@N64)@-y!??1? ?QX$ w?Y?lj~?YK?X k?!K?'?Iyg?Fgg? u??-Vl-?σݗ?W =p?훁?6bM@ ˒@Ve@o =p@\@@p@N@Y@%q@2?;Ϫ͝@D45Z6@M:<4@CJ9@IQG@T*\ w@_ Lw@?h"@B"{O'C@AiWKƦ@NT(@d3Y2@cb@Q ˕@DY1@5F<@7jq@1a[Z6@+ (@;f-&ff^@.:8z@6bQ1@%ʅ8@&RK?H@)bM@)u@?y w@@I@.z@3 ~@3@0TI.H@5c@,E^@6%c H@9P@8%3@7F$%@5*1w]@8H@;t{@8N@8rZ6@>8@Eh@D}mB@@gkJ@A(z,@1N@;׍PA@7beL@@VD =p@h ě@%@™1@>4@8!E?d=$?1u!?JnI?)x?_R,?@4m֗?/Ĺ#?=?L6?H?Ofx?t_X?L%x?|i?xZ?D?fO\?w@lUd@0 0@1\(@ C\@yzG@v!Z@"a@1oJL&@0}@1ءG@4P3Mj@; '@K/[5@h0^Mq@E.Mz@H61V@8Y^U@SNHD2@d09P@c馵@KR@'R8@1?N_;d`@6cɅv@)jr @-z@4bsu@8$@:_@+'z @' ˊ@-S@5\(r?@(82k@2in@:P<@6(XyM@-Ǯ@j@2qoO @%UQ@1汦@0̶@4l@6r@3wX @B@q@DBffX@AEHp8@@z{@^ š@T7.I@^_(@SIa@Drݗ5@IStk@Q`j@X:"c @X `A@;787@72 @5>5@)!<}@1 k@/4"R@&Q@)]fhۋ@'p@( @(Xѷ@2C@0dT@8Ed\(@4ۥW@9%Rï@2bM@jk@M@O h@FHrs@P,0d@Hۏ\(@ArstZ@<>H@2Q@*BF D@&hj~@$Ќ*3@$+Q_@BoT@/xF@z@ wfGE9#@ v4@aX,@vSn? ~P?O\_2?%ԕq?Y ?K]c?C2G&?̣ It?Zs ?\?+"?ZzG?&E?8%/B?3S?px?霪=p ?S?h`B ?N9X?Ĵ9X>?@PA7S@ M(|@/@ t~@AW =p@YA7%@yr @Q@*Ǻ^5b@G|(@QBNQ@KN\(@`t4" @Lw@N\(@PI7K@Pf^C@Pǔ@A9U@7j}p@8r|@-՗ =\@,v@.(n@2n=@2;@0>S,0@%0+ 5@0eo*@(zG@1'-|j@29"@3?At@4Lx@6jzp@6pWO@:y@?q&@7@AEK@=F@KzG@Ev @R \@>&:G@Ed/ @Ca =n@4eS@> ^4@2R I@+j~@%32@#$Eʰ@%/@ܣ B@})@'\fff`@ zG@ cO|@ifC}@a^5'?lIpf?z?6A79?#tj?T?θQ??|?a? Xb?]Zc?1hr@?`>BZ?ky 5?S|?·kQ.??ΰ?-?ל?܊ P@-\@bM@v3@J6F>i%@\5IQ@KaO^58@O #@NTf@GYV@@8@Bv@CAU2o@7AWXA@4bg8@0es#@.j5B\'@-үXy=@#,J@-ZO @! !@2az@)ae+@7$ [@8SqF@:^Jc>@82˛"@8@;%RT`@0D7@1^R{@1ZffH@1o9@=Zݲ->@>{@5cb@: u?})@>dW@7߾?$q@5k -@7{J@=b@?@A_@6PDz@5@@T1&@9Q}p@8Ph @8B'@A[㼽@@@_of҉@J>q @7Ƨ@=f+H@AI1Tz9@:[K@3K7@2v]cy@&ts@")x@#Qix@%s@"$@6ɶE@ @S_o@׬q u@!@_l?GS@Pn?xԕ%?8|?0* Li?|?5?~?ۓB_?ݼ·?8\g?ꙴj{? xe?N?T x ?hU=?ꖋE?JL?@+jJ? I?*1?|̸@%F @Y @2Zu@ ?O;b@ tJG @1'%@^#bM@]ps@7\e@=x@2ePv@7*Z`0@@1[@OiW@VdD:@C# B@GG 4@A\r<@@@:lU@=`0=@BW<<@= 5@>`@-Z .z@,B.#9*@2E9@$@ k@-3aG@+9@1A :@9pC@0T=<6@9P9@/DKFs4@, Rq @9tb@)E#R@'9[@0aA@;BeP@500:~@,Lt @Dnx@;7\@;r@6mح@+US@68Q@0-x7@)# -@0!A\?@+l k@/›@@0f@;E@Al@Gw%+@aQV@Y1B@C16_س@@Koi@@9z)u@=E@4rʱ@.]E@)p6@"[&y@HtS@!4@$Khr@ @Q M@@0aGw@_o%@w@N?/0\:?6?P ?K]?uC?BeF@?FE!?e|풉?Y@Qy?!K]dB?Ӎ|?ڼn.|?=?N!Rx?\Z4?qN;=?G?`A}?6.fff1? .?>-_?332p?ZGx@  [?"/{@d @oiDe@FlV@ #ۋc@ jl"h@xl"[@2~n,K@.JME@'x@0ʼb@8Hqi@Affm@P}֧@Sef@H{O@K/B@Al_o@A;cnu@@7oe@CvA@='-@;p-B@6`\(@,Z@0@0 ę@1KYJ@0u@b@6PbM@-]u7@20"3@39Qtm@5+@7\H@5)y@5sMj @6~@*>vȴ@+7@43@72;@3H@5]&@6Q@;VJ@1&x@)tS@ Gz@2R@49@0s]bh @2=n0@.` w@$.H@3#g@Aj<@] U2@]|0 @Rs|ahr@C~@9J%F @7*OD@7CNV!@-2@(X@%;ڹ@b{J,@w@7v@1/@|e@ N|QL@A@v<5?ͣUV?fffd?xԏ@׊A?XzG?q/,@QB@1&@?@Ql`@>^5^@i̸@O@(um @++‘@2U9X@:R@Qtu@X(I@]88V@I>l@G11@Hf`A@J)޸Q@F}p@D@A\333@=Cn@;LIZ@>i|@?̺G@B n@449X@22@1&NV @8j~@7h(@+:$1@4ˠ@4 I@?K5;d4@2(@6W@9G2 @8xXO@=AV @1j@9h@8pg@3Nl@<|~@8332@<#Gvȱ@@jt@@e+@DZg+&@E\–@Ař$@XoB@RbM@E-R @B333@<+@6ik X@10Z@,z 7K@'T=p@!pZ @!@Rtjz@nj@@VCT&@̔b@|@,j@efffp?-V%?=hr?Q?򕙙?G\?&?燾Qb?5hp? I?ٕQ?P]?Ct*?$g8?[ ?\H?\??=8M?)>Bb?=k"?!l'?mR?^0 ?FW?2+z?:~d?ǣaD?ᰉ?TC@N@zv@s@pB@4w1@mrGE:@^@~B @!fH@&&@1#j0@<%18@A `M>@L<O@Z"ܑR@\J+J#;@J1y@KE9_b@HC@FDmD@B*~@Bz@=z@;QIFb@?mVXy<@?Z'@Asq@4n'?@32<@0zx`@5T,z{@/7,@'"B\@@SU@7~=@@ET@>PQd@@ԡq @@ק@:%lzh@<U~@7@By@; @> Ϫ@@D0@BA@F4@CCH@7Zh۠@F)Vl,@GܞE@[e2c3@LT'@AGC j@:_UC@77@+ԩ @1jbd@+ 4@&uA@# ~$@ CA@y{zx{@?P|@yǭY@ hr@!G/@lH@4m?Gu!? p?4mŚ?6͞?B?>6?Sv ?b#9t?J (?Fs&?tM::?Q\(?Ҹ#E?v?MRJ?!?S??ޫ`A? ѷ!?j4?!h?~[333/?$S??4E?{e?$zG?2a|?]O =p?7?zG?ʥVX?dZ@O N@ @t>BZ@7K@'hS@;*0@ &p@&}.z@-O@6@BF#kj@Lݗ@Pժ j@VgbR@Mq @J%V7$tR@H<9@F ]@G ffd@@4@CwDn@DG='/@C?@@V@<@M@8 _ѷU@7?[a@.yATw@4cEʲ@1O@<<u@:d n@>O|@Ee@CZ?D@<=5c@JL@@C)У@=te@Nߨ@@J0@D|@AS@@&#e@BbZI@Ax}@DL* @DsUe@BHHW@A)S(@Cr C@AƬ@E:I?@Ogl@Xd-qo@H] /s@8ȹm@6xl@2eA@(EHK]@" @"|T@?@N;@U= @$/@@+ O@N;@z:@AɅ@ rwR,?pa@Ac?-5?} ?a^0U2f?@J??&Xt\?mp?[T ?]H?_|?歞[??Ⱒ?֢c?nY?֢7X5?Yд?#aL?iB?9Xc?} Y?ᡸPH??i? ?墻6z?c)^2?xK]B?@{?zE?4??$"h ?c xl"w?M?NVL?xd?»?.Ӝ?1`A@u%Q@Q@:_r@Jd@ )33.@$Ī쿳@)B0S&@,2@3-w+@7:@Dc@OqGRT[@Uz=@Wfp;@O޸Q@P\1'@O@B9N@B2QVa@AT+/@CډXF@BT! [@7TW/@7YQd/,@9j~@?'F@A1@C @C΢b@:Sx@C"@B@Ehۃ@EG!@BsDBM@B"@C#@B \&@@rZ@HFδzC@TpoiW@S70D@C]c@7.11@)/z@(K/`@'xA@!n@N%@9Xc@̭~ @Nom@P'@0@|f@ eoiDh@ y?)@ 2$PH@X($ R@#S@*u&?l"h/?zc?+ =p?|'\(?H?8 O@P(T@Udȸ@Pffff]@F  :@@l=@1{`A~@%R@"Ĩ”@ /t@#`A5@>XbY@ .@@M@t|`@&p@ G O@fff@ȴ9u@KƧ@,t@S?lQ?@?!x@\nh?tS2?A?򳛝,?g?Z?N5?|?'332?2(ě?m?ڂbG?–?ݟ ?ٝL1'?ݺL1&?p+mS?ݤ¶~?՝?ĺ(t?᩺0?w1TɅ?+W>R?lGVY@A-P:@C#@Fc%OF@GFffW@JD@H@H,T@GH"@E_ؽ@I2@J7@J7K@Q#rS33'@S+%Z@Vԕ @P:K)^ @C?yu?בS&?X[?#?ԕ?uԯO ?i:)?Gʿ?ep?ycK?[W=u?ߤA2?( t?؃g?ĥ*W?L=?u3?~z?V?5ᰔ?]vfff?< s?' =|@@N|?ĢYJ?'zb?of?p?I|?/0M:@%@kڹ@c@BG@ J=@:L^@n?@v@&X7@&uѷ@-q唯<@/_%@45T@A@ElJ?@E;ezxc@Gq\(@NbMha@RUi-@Wأʈ[@W50 [@WfLj=@H;d@L-@B?U<@A U2az@?}@E ļ@SOSf@SЉF@SV]Y@P>ם @GOj@AѼ@>x@7c%+ӿ@0GC@&ߔz+@!ے@;d:@=@/@cEʷ@`\^5?@}N@ JS@ - @̦@; ?(-r@Hh[;@%u@;dF?׎xl#?s($ ?C,P?I=p?"?/;d?w >?T?mu?᫅QP?8_?p#?^?g'?j n ?ԛ333?x@K]0?(SP?T`d?lB?ّ?U&B?G ?C =W?.H?PHv?fGh?Y?n5?|p?8 [?Ej?J#:3?yN?\)?ި?E8? Fۻ?$WO?15?}*?^Ii?P?ろzxk?x??&Q?Oo?ݡ0?* (?@+W?:@{K]@@::+@/_ح@J-U@#{@ RT`@ A7@$+\@)^L@1'|@0wwe@1h>@7@;g϶E@@$-@AM/4@CstL@FtZC2@E{?v@B{!@B\7KƗ@D?ü5@F)Ԕ@DߝN(@A&@?aa@>ɼ@8@3iw@3 @-e@%E)u%0@"R&=;@(f@\)8@,7@ s Q@#T@w@ -;@e@ 3(@2I^:@E{@@8 ڹ??euN@i (?,A7?#:C\3?5XR?]*?#s?$\Q넣?KA ?x?%F ?;+j&?fff?P5VlV?a^5?ަffg?2ߣ?F[?֔Fs?ESv?)^5?ϦD??B]n?'R ?Dg7?&^H?让q@}@ @/y@nvȈ@eu%E@Lݗ@n@ (@!(@W@!|C@$Oҽ<.@(m@)8Qb@.k|R@.@3Xy @0b*w?@1J:^5#@) -@.+Y@1SVh@1 <3׽@0L@,)K]@';O @+P@$gG6@#vO@!#}ڢ@ݕo@Zy9X@`}Vl@B=Q@ M:@ GE8@]@Z?3?-V@ӳ|@qu?y$@>ʳgw?5gdZi?BYC?L-?H? ?JC333A??W>?󤧟U?E.?tx:? I?%4M?ӟU ?a@?b??30?co?뾺gB?hp; ?LCPV?䖹hr8?>?5zxl?ݳ}??]hq:?fx?s?J$.?ڨz?;dZ?Ջ$.?ޡ-V?3S?̾Q8??Χ?hr?6p ĝp?B&xԓ??k(9X?(?zE?zJ?h񙙙G?W[nV?* ?B?&y?6d?NH覠?1|?½b?ٞx?\7KƗ??ŔL?r ?(?yy?kŔN?'{?6+?TOn? {?FxGB? kj?Kg?I1?q{?5F?JWE8O?\?z+?qj=?@B]c?hr@ zG@҃n@ tj*S@ A [@Mj%@ mᰣ@ / =p@ n.@DM@Z{@y.S@ ƀffft@'/@QL/@*@@kj e@Yn@a!@݊@u@n@q @  @hۋ@g\@dZx@ $IJ@ @+ =p@U~&N@ZQ0@i@Nf?)y?rFs?1T'RT~?=5?|?=H @}Vl?s?{.H? ?"?X}m?ٚ|?F䎊&?# =$?Za|l?te.H?ڒp?gqE?~xQX?X{n?ŔOJ?X>B[?[J?H,zG?PHN?V\? ?nܖ?őhrN?.Ċ??㽑?N?d`d~?ແG&?KƧ?ݒh?Q?2^5>?ԇ?̾+j?iWD?M3?h+S?@0U2aB?}?(oir?…?S =? ?.0x?? '?xn$/?_:c?S}w?<7K~? ?۶E?dS;?o,?U/?N?; =p?}g?]]?#@W@;5@}rzG@ݡB@ ${@@O d@2 \)@4m@tRT`@G͞@s@t@ -V@ bM@ vS@ _av@(j~@ U@C@ NZ@ t@F9XZ@25?}@̂>@8@ A\7@ Tvȴw@Y"@>J#9@d!@4ۋd?^(º?L'RTV@RP xH? 7K@)y?٣ =p?ju%s?M$ݦ?j5?:?dž'c??nU?z ?F,?2Zc4?YK?Pj~? ?8u?!"W?j{J? \)Y?y78}?ȴ9?{MD?k2W?ŬzG?Ϯz?pXy>3?Xy=?H?Ba ?ٚP?ػ~?>!R?$3?+ X??ż?h4?eYJ0?S4?%?G.??+j?؃S,?sa@n?Ѹ( Ԕ?RJ?c?7Q$o?G&m?lZh ?/\?E?A (?ˑ?l:Zc?ʩC%?_8Q3?"?1?1u?*?+ `?Ų-K?l,?Ta?F~(#?{W?IQ? G,?0:)n?-2?i^?=.V ?/O_?G$?"h?5Y??j:? $ x"? [ ?`|Q2??ջO:?+Mj.?"?jm?k I?6_ح%?gg8?dA7K^?ҀB?a? 8.:?I^%?ш*W?!-wM?Ձ%/?Z,8?s_?Hl^?rY?Qs =V?ϲ:)w?պ09?D}8?%"i?M$?'?_?𩔕*?EB?vȴ9?EI?5b?zL?D?߀(}?.T}M?}_!-wN?+×?W<6t?9X?SQ? :,=?Y?ky?!hr??D7K?C?t7?;dY?'g?lB?5oi ?M:0?B\)J?xA7?,?D_?db?ꝲ=p?-U?ڈp1x? ?܋C? 9W? ?"{?P6h?Xy>?=P?gXH?O L?&+Ƨ?V?Ӝj?/??ye+P?9b?މkPE?ち^5?Dg8?ۋ?Qoh? L??x)^?hr?j~?7M ?ѵ *?@&?$ܲl?Н"A?Dt?P$ w?+%?^59?/D?|C,?i^4?f`?( ?* k?Dg7?ԮǴ?2Vl?f[n?5P?;ju?h*? k?̼j~?DNFsT?ߕX?tS?OzGz?B 333? ty?T&?fȴ9=?af?lC?zg ?n?I)?뙱>?no? 3?? 4N?{"v?`A7?_Ϫͨ? p?m*?ǐ[\?_;dZ?Ω0bMӲ?՝quk?שԕ?׫?^/\(?Ԍh?̳7X?&?a3N?ϕRP?`'RT?4l?ൂv??̪Mi?@ ?y?..?ٴf@?=^5?{?/;f?CB?nfff? ?C?I^,??fB?۫Ҭ??ݘ@?V ?*0? T{?Sg??9M?L!.w?ѭB?$ 2?"*0f?Q^5?7]]?¤u?Nd?fE?JGC?~(v?#?եb?򅇓?Nz? Q?r5}?$zxl"? '?&ep־?N?'(?ݽ-/i?;7K[?ؼ?&}V?P??< )x? ]c?܃$&?Z+]cy?]N?ں9?B} ?pZ,?$,B?o~Fv?L%?D}?h ?\ PH?YrT?A~(4?l?"Vմ? W?Xa?Dg8?gC?ԑNV?W!?_Ov`?nK)^?w|?%F ?ǩ'R?jv?(p^?M hsa?!?n:=p?"ա?7NQ?%;c?ʊ$ݬ?+?ˏ6Eȟ?ؽvfff?ɣ  H?Qj?"9X?ؼM?ffg3?ě? I@?b1&?81&?dP ?;ěD?vȴ?hr?AZnc??ex ě?0snM?fffI?X"Ф?]+333? ?t/H?L~?ڬ?H?#`(?NQ?T?P9X?h4?u\'?t ?ad?dC ?213??ӝ?$0?f`A?[ ?M}`As? ě?ԮQ? ĚN?%陙"?X~? 1(?9z\(?_ܬ1'?8Ia?\H`A? ?Ytj3q?Qhr?z?|?5=~?s\?_'RS?Z+?X4?W?ܮ?AH?G ?ق0 ?P?e0~?|C,a?8Kti?Ž?^⒣?ę"?ۖ{??u\(?̥zxs?]Mj(?p;L?BÎ?JEp?H_.H|?T\wl?㈅b?o?b? hr?@N#?9)ohD?=(o?1$?@!A [T?g@?;B?݁i??OX?i>B?7 =?љ|?p?EC?㚚?%qu}?;ȴ9X?,g?9?݆tS?y ?;^?؂;c?":??#?~RtE?̻GT?'?Ӂ?$sw?rn$?ⲉN:R?/q?R}V$?ґ5?{?Ϛ,>[?m??)Dg=K?z? j?a@?DڦL0?XGO?_ح?ΎQ2?/;f?6CA.?pěV?Û?&??m\?jb{;?eQ@?^{?b?KCn?Ct?+ ?_O ?xH? \j?3r0U1?n?s#:*? l?֩%F r?G_o(?>,?'>7+?8$/T?繞?p?K^Vz?j ?!^?֨ϩ?[ *?TzG?DI^0?[$tSj?K1'Z?ܱ!+?\(6?񳊗O^?\{J?&q??Ff?h?X(L?驩^n?_? rGD}? D1c?mKƧP?޹X`? ?Lj?A?7K?twkK?,>B?`3l?ffe?Y? 3?fA?7BZ?+?Q?DE?h*~"?_9hr ?lx ?*J?X4՘?43v? Yq.?‘?:){h?5o?Bt,5?ާ#S&?N IQD?NR?۝:G?}Wv?ؓv?/"3 ?p(?#t!+v?՜?_ح?q'{`?ڧm(?%?P?Kȴ9W?ؾě?6R;6?4mĤ?{?&$?s333?M* ?w =p&?ѷ/?$ x[?0O?N#F]?IJt?Vc!$?N<?TlC?ru?mB?Y~)%?̰?i,S?ِm]B?˅G?Xb?մxS?B?P-?p?l?[U?W?%fffz?F(K]?Ss?14<?,'/-?(?=3?ݗ ?̢-UP?[0?I333l?ӌzy6?F c?1ϧF?? |?C\x?]?{پ?Ѱv?r!? &?+hی(?4"h ?/b{?Qf?δ?9?ṉ~(?G$tJ?*m?TYb?ۗA [?m?+?۱V+^?ڢ@[$?FOv?Pp?aR^?.$ܶ?S}c?dܞj??}cg?r ?fH?ٮ(? ?4?Ո33332? Q.G?[/W?׆_o!?Ҳ Q?օ J?u?$bS?/j?DN?+ \?\H?(h Ռ?߀ ě+?A|?6+? ?. xz?_Xa?η =p?ͣ1'j?pפ?pO߉?Pěy?333?Dž?KO|?Tj ?,Tp?ݫG?il?@ě?B\Ͱ?.O? =p?tM?i?Զx?ɺ^3@?1-Q??1&?-p?1e/?7\(?:;dZ0?_5?}%?EƧ?e 333?L?j? }?%?.z?3 = ?L@r ?zl0?AO;_?T,/?_{T?. ķ?TM?+?l?]zG?[?赣Ƨ)?* I5?A^4??^;dZ?kx?u"?vȴ2?Y333?Y^Q?Gn?K"?th?'333H?YX_?Ȍ ?ת?Q냄?l?)UXbV?ԓ7K?,@bM_?\i?ɣz?\(g?BQ?dC?LdZ?Н\(?f*f?b?NS?fx?̸Y? ?ڿ:?׻G?1&?s331?dFQs?sti?Z?6KƩ`?333X?fff?5?}? l?m8}#?ħYJ>?Z^?񗧆?ɻT? ڹ(? (b?1=?r?Q`?HB7L?TTJy?\RT`??gC?QE?[ĵ?",ߔ?+U5?}B|?¯?ՆE* 1MeV @ 725km model OBJECT = 'Sun EUV ' / object observed COMPRESS= 'jpeg ' / (off,lzw,jpeg) on-board compression algorithm GSEZ_OBS= 2536247.26889 / [m] s/c Geocentric Solar Ecliptic Z PGA_OFFS= 59 / PGA offset DATASUM = '2077501251' / data unit checksum updated 2011-10-05T02:30:23 CREATOR = 'P2SW_PREP.PRO v1.3' / FITS creation software DTPLAR1 = 2000.0 / [s] predicted time to prev large angle rotationDTPLAR2 = 2000.0 / [s] predicted time to next large angle rotationREADRDIV= 0 / read-out rate divider GEOD_LON= 85.381345181 / [deg] s/c sub-point longitude SWXCEN = 502.53 / [pixel] axis 1 location of solar center in lv0 LEVEL = 1 / data processing level SWYCEN = 515.01 / [pixel] axis 2 location of solar center in lv0 IS_PROC = 1 / on-board image processing LED_SEL = 'a ' / calibration LED selection TEMP1DET= -0.7299870000000001 / [Celsius] detector temperature (SW HK T CF) CD2_1 = 0.0 / WCS coordinate description matrix GSEX_OBS= -621653.022027 / [m] s/c Geocentric Solar Ecliptic X CD2_2 = 3.16226783969 / WCS coordinate description matrix NPRESCR = 0 / # preserved pixels - cosmic rays NPRESLZW= 0 / # preserved pixels - LZW decorrelation CAP_MODE= 'CDS ' / (DS,CDS) capture mode TRANTIME= 993437023037.0 / [OBET] transferring time HASBLACK= 4 / HAS detector black level CTYPE2 = 'HPLT-TAN' / WCS axis Y CTYPE1 = 'HPLN-TAN' / WCS axis X EXPTIME = 10.0 / [s] commanded exposure time RECODING= 'fixed ' / (off,fixed,adaptive) on-board recoding CDELT1 = 32.3816226784256 / [arcsec] average pixel scale along axis 1 CDELT2 = 32.3816226784256 / [arcsec] average pixel scale along axis 2 P2_ROLL = 90.0057133278 / [deg] s/c roll SWAVINT = 15.4555 / [DN/s] average intensity in calibrated image GEOD_LAT= 44.372787237 / [deg] s/c sub-point geodetic latitude DATE-OBS= '2011-10-04T23:56:41.222' / UTC time of observation HEEZ_OBS= 2536247.26889 / [m] s/c Heliocentric Earth Ecliptic Z FILENAME= 'swap_lv1_20111004_235641.fits' / FITS filename INSTRUME= 'SWAP ' / instrument name PN = 130 / on-board priority number EACQTIME= 993437023037.0 / [OBET] end acquisition time HEEY_OBS= 6602941.95096 / [m] s/c Heliocentric Earth Ecliptic Y TTEMP1 = '2011-10-04T23:56:22.000' / UTC time of detector temp 1st sample TTEMP2 = '2011-10-04T23:56:52.000' / UTC time of detector temp 2nd sample OBS_MODE= 'Variable off-pointing' / sun_cen, fix_off, var_off, cme_track LANG_ROT= 0.7071067819 / commanded large angle rotation component LAST_ROW= 1024 / last read-out detector row FILE_TMR= 'swap_00993437023037_6c84e974.fits' / SWTMR filename LAST_COL= 1024 / last read-out detector column CHECKSUM= 'ZTEahQBRZQBXfQBX' / HDU checksum updated 2011-10-05T02:30:23 FILTER = 'Al ' / Aluminum filter LOS_ALT = 706128.127756 / [m] s/c LOS altitude (1000000=no atmosphere) OBSRVTRY= 'PROBA2 ' FIRSTCOL= 1 / first read-out detector column RECBIAS = 10 / recoding lower limit FIRSTROW= 1 / first read-out detector row CD1_2 = 0.0 / WCS coordinate description matrix CD1_1 = 3.16226783969 / WCS coordinate description matrix HGLT_OBS= 6.54332476965 / [deg] s/c heliographic latitude CUNIT1 = 'arcsec ' / WCS axis X units TEMPDARK= -0.7299870000000001 / [Celsius] temperature used in dark subtraction CUNIT2 = 'arcsec ' / WCS axis Y units ORIGIN = 'ROB ' / Royal Observatory of Belgium P2_Y0 = 0.00585828077518 / [deg] s/c pitch DATAMIN = 0.0 / minimum valid physical value ARTEFX = 'on ' / (off,on,cosmic rays) on-board artefact removal SOLAR_EP= 356.865318403 / [deg] s/c ecliptic North to solar North angle LED_POW = 'off ' / calibration LED power CRVAL2 = 0.0 / [arcsec] reference point WCS axis Y CRPIX1 = 50.5 / [pixel] reference point axis 1 CRPIX2 = 50.5 / [pixel] reference point axis 2 CRVAL1 = 0.0 / [arcsec] reference point WCS axis X TELESCOP= 'PROBA2 ' / satellite name WAVELNTH= 174 / [Angstrom] bandpass peak response LONPOLE = 180.0 / [deg] native longitude of the celestial pole TRAPPROT= 0.0 / [ct/cm^2/s] AP-8 MAX > 10MeV @ 725km model DATAMAX = 361.969 / maximum valid physical value HASSTDBY= 0 / HAS detector standby mode RSUN_ARC= 959.407562559 / [arcsec] photospheric solar radius WCSNAME = 'Helioprojective-cartesian' / aligned with solar North P2_X0 = 0.00320431118842 / [deg] s/c yaw GSEY_OBS= -6602941.95096 / [m] s/c Geocentric Solar Ecliptic Y HASOFFST= 11 / HAS detector offset level DATE = '2011-10-05T02:30:22' / UTC time of FITS file creation REBIN = 'off ' / on-board rebin (2x2 pixel average) SACQTIME= 993436794655.0 / [OBET] start acquisition time HGLN_OBS= 0.00259454778033 / [deg] s/c heliographic longitude FILE_RAW= 'BINSWAP201110042356540000419623PROCESSED' / raw telemetry filename LZWDECOR= 'off ' / LZW decorrelation CROTA2 = 0.0 / [deg] axis 2 to WCS rotation angle CROTA1 = 0.0 / [deg] axis 1 to WCS rotation angle PAV_ROT1= 0.0 / commanded paving rotation component 1 GEOD_ALT= 732832.136552 / [m] s/c WGS84 altitude PGA_GAIN= 1 / PGA gain TEMP2DET= -0.7299870000000001 / [Celsius] detector temperature (SW HK T CF) SIZCOMPI= 634864 / size of on-board compressed image WAVEUNIT= 'Angstrom' HEEX_OBS= 149633247935.0 / [m] s/c Heliocentric Earth Ecliptic X RECNUM = 3600 / recoding upper limit PAV_ROT0= 0.0 / commanded paving rotation component 0 DETECTOR= 'SWAP ' / HAS CMOS detector 1024x1024 pixels FILE_TAR= 'BINSWAP_5894_SVA1_2011.10.05T02.11.39.tar' / raw telemetry package BUNIT = 'DN/s/pixel' / unit of physical value COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT $Id: swap_fits_template 3732 2010-09-28 20:42:23Z bogdan $--------------COMMENT ------------------------------------------------------------------------COMMENT ----------------------------------------------------------This is a leveCOMMENT l-1 SWAP FITS file produced by p2sw_prep v1.3 at the Royal Observatory COMMENT of Belgium. If you have difficulty with this file or wish to make suggeCOMMENT stions for improvements, please contact the SWAP Instrument Team via emCOMMENT ail at swap_lyra@oma.be.------------------------------------------------COMMENT ------------------------ HISTORY SWTMR 147831SWEDG 147835FITSHEAD2STRUCT run at: Wed Oct 5 02:30:16 2011HISTORY p2sw_hdrchk v1.3 Computed detector temp.: -0.72998700 Celsiusp2sw_pmcdiHISTORY v v1.3 Reverted wrt swap_pmc_20100308_164500.fitsp2sw_pixrep v1.3 ReplHISTORY aced wrt swap_satcds_20100113_152800.fitsp2sw_drksub v1.3 Subtracted moHISTORY deled dark with coefficients inp2sw_drksub v1.3 swap_dark_coefs_201101HISTORY 01_000000.save usingp2sw_drksub v1.3 T=272.42 K, dt=10.0000 sp2sw_pmcrHISTORY ep v1.3 Reverted wrt swap_pmc_20100308_164500.fitsp2sw_ffcorr v1.3 FlaHISTORY t-field: swap_flatcds_20100308_164500.fitsp2sw_despike v1.3 Despiked atHISTORY the 6.0-sigma level (6852 pix)p2sw_imgcor v1.3 Image centred on solar HISTORY disk centrep2sw_imgcor v1.3 Image scaled to square pixelsp2sw_imgcor v1HISTORY .3 Image rotated to solar North upp2sw_expnorm v1.3 Exposure time normHISTORY alized data (DN/s/pixel) END ?ԏ?dtS?p9X??߬T?{6?aXr ?{ I?ݰ?kS?ᄓg??Z/;d?)m\?p?un?Nl z?,?R?ڠ="?]c?ZW/*? =p ??ڽGKƧ?1IkD?n\(?nvȴ? H?{K?`oiD?JNW?ۗzW?6$ x?$[7?a?qP`A?-O;?Z?.BZL?Y'0?ffg!?O?WE8?W?䣾F?₽<66?̡zG?׶XtX?p{?ظ0l?ȚƀKu?ə?_?#g]?>7? "?"?ћ&a?Ќfffx?}W+j?аr?3@N?Mj?e+?,/{O??|?ڑvE?_?ׄ?ӏ?e\&?TɅ?|PH(? Zv?V#S%?=Ձ$? qi?Q{D'?]ěx?1?@ov?L?u?[^S?ߤ?|?h\D?AS?~4?Dw1i?$/:?D^c?'+#?hr:?ű?Z?,ka-?i&?Xj0?!?ᇙ?9p?ÎXf?埵ԃ?UK I??CI^?˟K] ?h6z?6w?vE??R!-wN?{g?[J#9?ȉ3?; Id?_n?0im?-ڹH?K =q ?XbM2?Љ333'?j~?蟲?p?7xN?8$Z?W =pG?Nv?ǜ?2?;ƸQ\?q+?ޠ Y?\)?Fě?m/?ȸiH?? =z?r--$?..$/?yvȗ?⏝,?]@ ?gjv?416?Ő?ۀkC?T(A?`?q/?Q?`>?B?\(?֓?g4zG??G2? dzG?NV?(?l`?ލ=p?)1? n?Sn~?L9Xy?}pW?SZ?ٻ"\)?ظ?弔9Xw?TzHH?GD(??pbM ? Ƨ?(3338?~+"^?Kb`V??E6+p?\(!?ļ$0?^5?|J?6ȴ7?4(?fWz?ȴ9'?{kl>?u\C?~?@|(?j~?w ? O ?`A?z ?vY?9Z?ҽ+@?5̬14? ?+=- ?͐>vȴe??, =?Q\?ٗ17K??T9X?"?өڹ?RT`?t0ě?F]c?T"h q?%;p?8:)y?;dx?zv$/?ёf?P81&u1?S8Y6?ՌVfffh?֮_o??۲g?)u$?4Eo?nvȴ?XbP?N;?Jxl"_?/KƧ?X͞?ծ ?z6?Vf%?9W?J?Ǽ? I7Kƿ?ڱ;UI?V?JlI]?X ?/{J=?ܥ#?EzG?Zc?!TɅ?l~?](?7"?[2 ě?"Y?tj?䐒@?k =?fu?9'?ۿȴ9V?z?-;"?-Vz?݃O?l̀?D5?.5?z?Ԫ?_خ?6r?ؚ=?L?ص+K?fQ?\Z?ڤѶ?`V?sl?k:-?t-??TX?۬_?OZ?MO ?R2n?a =q-?ĆA?5Y?КS >9?gquV?lgL?֤?>?^ߤ?7!-Z?ę?|DC?|@^?[;6?jg-?v%$I?Kauk? +C?`?#?^r ?֚G?5 '??{J(??ގ-Q?̿!"?ލKS??x?!%?`B\(?,5?1&?3'8}?לkJ#:?ܞ?ܔT`s?\"\(?6{?+ۋ}?qN;8?몛C,s?N+ d??'?[b?C>쿱?䎂^5??p4a?J?(?FsT?ߠ I?朥=?=h ??Âݗe?7#?/PQ녞?ӻC,?ڝa?4'0?D?c =o? p?7KƳ?PIR?҈΂?N`3?g}Vo??ԍʅ?7K?ءl%?h9X(?ҮR?~vF?ߚkP?w[W>?јщ7K?cT?:xG?L?a?X >?:)?Uqu?ᝃw?Ҝw?덕 ?Ԙ_?ΕXy-?ߤ0?i7KƧ?ۆj~b?L8}P?%^ߤA?~R?m?bM?\?r}?֑tzG?}v_?Eں5??!u?4zH? [?iqi\?o;c?Dj?ڼm?սcJ? I?Vf?,Xy=p?̜1(9?מ$tS? qs?Ԝ1%?/;e?8Fs?%Ov_?یݘ ?u3331?;?Mo?Mj?+i?`;dZO?h+?m&?Ǥ&YJz?iDe?䎊r ?/?ւ\(?Jxl"d?N;dj?JMx?3??tS?ؒ ě?ƍ?iC?55\-?ԇS333?o!?sN;-?po?t?\ߢ?,3?TZ?dZ3?C?J.ߤ8?ڊu?w1? b?3Z?}T`?*,? L?c~?@z? =p?࢏4m?<6L?nϪ?ʢG+b?kwlC?ɥ?g#a>C?ө/S?˒:BZ>?ӲMb?C?~Q?`?OKƧ?'wz? b3l?à|h"?C-w1?42a{p?ԧ@#=?DTɅ~?X\(?7K?3331?Мj~?ؑ1&u?Ҭ333,?'6E?@?֝fffc?ZG ?f$/?̈́??MG9?b ??B['?" I1?A?̥&v?@-F?u(?zbC*?_0 ?{"v?cn.?V9?Դl~($?\3?HSE?w'kP?˓?ES =Y?%2a|?粨 >? 0 6?>?-E??? I?qRT`??|(>BZ?^IQ?cأ 4?-*0?ѣu?5b?o ?A$?-*&?䴓S%?| xZ?Jd7?K{tjz?^n?kVϭ?iڏ\(?䲄63?% =p?⠠T~?vȴp?)?\5R? z-V ? ҌL?C:u%F$? L?zx|Q?+?>I7?6?d? zxl?{O.?a5?|?aE!.?.G?ą%F '?7MY?2l?ᬡ[W>?PU2a?ߢP*A?⟽\,?ݛ>BZ?Z?r~?/{h?٩?kP?h9X? ~(?X! [?ҝO;'?{J#8?e+?~b?S hrs?3n?ȯB?2B^?ʈAG*?ѣn.?|*? غ?SAXp?DG?BC0?0%\1?g8?z@?8At?sE?-2-X?1rqg?қ/vT?c?å!.??NXy=?ԕB?oVh?!n?rxl"g?A{?]'Rp?"M?8G?;{Ƨ?e+?HYK?ޒnQe? i?)|?)^?NvȴN?=?PtW?la[W>W?%>?"h ?9W?.?e2e+?LY??SXb2?u%F8?/?Mj)y?;dZ(?Iě?2di?iղ-?cq [?ߍ^@?I?+ Xy^?Xv?%?MW?bM?ӥsS&,??շX?ZS^? =p?TɅ?Um\?Vϣ?zCw?yP?+i?815X?M?e?N5?}/?~}V?Ɇot?-[W>?y?^Qv?詃U\?A4?e+V? %[w?t?ɴ)'J ??ধ L\?ݤQ?1'KƧ?͏䎩?$%?تߐ?N;?fffj ?ظ}C?SIBb?_?&"?t0 ĝ?@ ?Ó]c?Қi ?Ys?z>?L0U2m??p A??o.6?oZ?IƧb?zt? +Z?XH?@5s곤??֜ x\?ѭPH"?&TtS?奘[ ?! L?^H? x2?ԮS =L?>T쿩?DG?ln?s|?Obi?w1?G ÷?.j?}V^?`9X ?焝%F ?oz?sNz?\(?hL?a9?ӖP?ۅ?Ůz?^6z]?Ҁ?z{?JQ?J? S =?ffc?9?`?\B\*?P ?޸Qz?l?-{l?J=p?l?ljWO?/1?۹}?^5e?3]cy?}?ӬAk?&[]c?Q?Q ?=VlI?m?Յ^?i}V8?_ح??v)?yԕ?^bM:?_G.H?>H?Q?w?l]?C?zL/^?y>($ ?&?6`?aa?~c?8j~?(?ZN?ݙB?`AR??o+ a? R5?}?+?'ަL/k?z|?%="?"ԓt?A?37?#?zJ#9?;dm?^??@7?=p?oqk4?l%?O)^?*g?zJk?=?h?鷰A78?efA?!:?Yk??3Up=?J7KL?ӭ I_t?U=W?N@?S*06?,?޲'/T?`4n?B?㡔Fs?yԨT?Zqi?z֡a*?ݞW?ҏə;? ?z?%?Mf?}!.2??.HD?*$?ĝ]c?}O?[ڹ?ң9s?uA? q?8,0?Ns?T["k?tW?1m:?&z#?D|푋?+"?h?W [R?62W?Ԇ ~?AG?).H?o}Wr? "?B_v_?گlC?D5Xb?\N?>W4֡?( ě??e?v:0?cu%F?VOv_?\F?-e?b_?Y? u?`/?ٰѷh?쑹.H@J?:kP?G*?824? tX?yu?Rf?7"?hO;`?7e@JxJ?x1&'@dp1?jbM?!R?|A Z@-}2S@Mn@xg8G?YM-w1?iB?O *?lj?":H?irGE?8?]`? =p?Ll?ړSΰ?S&¸? ?v?S%?/'{I?b ??C\?ZF"f?A;g?R!8?㼦?-DX?7$?^ xm?aB?&?f)?^?>쿱 ?&[?ɳ|?[i7KƎ?Z=p?)#9?摝1?ׂ?ۊ6?Xt?b ?8)]?աʽ?K7Kǐ?=8\?q?d(†?1'/?k"Z?![W>?)?@bM?=\?߈F?ޛ4l? BZS?9Gy?DQ? PH? ur?m ^5??e$R?݄݃M:?mES&?"Pn?`N]c?//?[@*0?81&|?L`d?g+j?x ?Xߤ??4쿕?bQI?QjN?H1.?q"H?G?:)w??0 =p?YJ@"+@i\(@Cu@ x@DbM@^q [@L64@]L/?MG?x҈@_@ '@e@Bnt@$<;@ۋS&?6@)S.?WSX?=e@yA@t?C;dT?{!\(?(%?ztoiDc?䴴`e??d?z[W??)Z?͑Y?qrGF?ᵝ/?^J0?\!-?t?\# ?ư\?V?褥(?Քti?X?|?]cf?*@hۋ?o&?޾%Xy?8Q?ԑԢ3?͆?L ?@7?*\h?.+5U?}`IP?'*6?f=(h?͢ir.?eX?G  Io?\ߤ??㟶iB? ז?T˒*?׌\`? ֍?a$B??4m?xQ@?X{?v*0T?ғ-!.?!-C?Nzi?/C?a|?d7V?H6?TS?x?ttN?S?,!-b?:vȴ=?3W>?&^5??7-?wZY?M?Q?s]??$tJ?u"h @zG@s@>($ x@J$|@ >P@䶃n@+ȴ9X@ qu@b@2a|@{^5C@h ԙ@ lħ@B H@nR~.@ @+RT`@gԕ@ u8@wȟv@Jz@z@~.@]NG@@`A/? }Q?$?uHp:@`+j?jϪ?(Y&x?ͨ)^?&r?#i?,A?c'?ƞ($ <?ƼR??ڏ\(?A7r?0bM?k1?EA$ݢ?8J?&y*?⤿KƧ?1?ᅤCT?#333?^?zJ-U?'\(?`w;d??}G??|?Rg?e5?|? |?$Q?6@!-Hˏ@(7@.[K$f@("$/@&}f@%UmƧ@(h@*0 @++@&\#@ A@ O@"X֡Q@ O~@rGEM@}Vl@L/@ )q '@3336@6bD @UP?!@m>?bz+?1?JQ?01'?ᑷX?!G?)^?Ϫ͢?=L?t?0`A9?9U?7au?J?iS&?}j\)?:"&X?׌?N?WQG?ÛQ>?IrGE ?Fȴ9?wN?@ ?hd?952?e&At? 7Kz?د# < ?V^}Vl?z|?Q\(?1R ?7Q: ?v=?ᰉ?zG? x=?/V?;dZ$?Y}Q?333(?Vp:?/V? G??䛥?ﲮO?vaB?!?rGG?uO?c+ a?18W?_{n?-Ow?H9XL???NƧt@Q@-@rn@S@w@5b@6Eʿ@@v1@!0P@(\*0U7@)7:@*lI@.lp@._Z@5͸@5!s@93S@5_U;@5fK@7R@99[@:a hr@2ib@2,1)@1LV@2fA@*shp@'0$tP@"@ g @ `d@ш@ }@:@_ح@&?S?z2{?Nz?0?C[a?7?m쿱[C?0%(?W;d?峌,$($@94­@5_S˒C@1G_o@+z@%&@ ʅR@A7OB@&uQ@K2N@ |7D@EF=p2@-H@n-KƧ@L0L/0? I? =p?k?V?;XDF?#{?Rfff}?-?ԕ"?5C?"?s?މY~(?X&?w*? Eq?:_ =p?Ѵ:~?Y? ?c <`?o|풊?m=p?х+jV?FRTb]?dL^?~'p?ߟ?Xy=?•\j~?%3S&?ڰHˡ? (}?6a?F|I^'?mKU?:~?hQ?l?VzD?Ϗ =p?`Ab?il֡a?ʽ<6?9Xb?/o?L/?D?aw1?C ?j%E?+PI?O ?.P@RE?hۺ@V=p@ 2sb@\`ߤ;@JS@ ,zw@$\)@1z)o@6lzw@8_G@C7s@C Ę@A{!$@GBYTO@B)dZ@;>C@;ՠhی@4sU2c@4 uXu@3hu|j@7䎾ߤ@8P:Hˑ@5'@;We@CH X@3MqZ@3Bͥ@= }!=@=PH@C;vqhr@A<4@?OKM@88@3WO@.TL@%O;d@X@Z\@?!Ϫ@R+ &@~Hu<@ 'YK@9@mA A@D???w,ۋr?"YJ?W䎈?Ct?th?-QB?BI84?o?SO? "h ?^1?*0??Rfl?- :?g?ԂQ? W?_?W+ ?1L?h1&F?6{\?Q.H?F+?@W =py? ?ʝfff?l5?|?ԾP ě?;cy?Eʵ? \V?Xb\?tja?Bt?pO;w?30?M~vȴ?B-V?eG?旍O?t d??Ԗv?14?.\(?ǬQ?-V?!hr?qXbP?@O;H@ =@M\@ I@wtjy@BG@#^ G@- C@5Y@Arhp@MlB@VG@U-/@<)E@3( bM@?*o(@:E\(@@N$0@DidZ@@\֣ @7*"{l@<p@6+ @? FzF@D@CI*6ȴ?@3RQ@6?(n?dC?w+j6?'ʶ}q?ei?qp*?$&?>g? ?}]?iC\(?\7?{J#V@wk@@\IX@$/@PH@ p@`Ay@(%F@2?|@CcW>@M!qu@U۩N;@Z<@K pffa@Cha.H@A@=9Y@DhKX@@mOF@9w;/O@84@BQn.@Ah!a@D 9C@>S߻dZ.@BN9@HSc@Am9=@BSnI@@_F@95a #9@@=:}@GP3حk@D6U'g@B-@Ad\Z@@7!@>i @9ҙ@A4@B+YJ@?YPbM@:E8@3@O7@,&j~@&+e@5 @G䎘@uQ@ Ϫͬ@Ob@?]c?KǍOR? ?~?H 0 ?AXb?5?z?1?q?:=p?ޕMW?(‹?^*?9X?)^?G+ ?<"?骏$tS?\?L?8[?ޅ~څ?e?ƄrS@?߀/?3zZc?[?dO ?x- %?jM?#b ?|}Hf?ۛe+?4? >?%oi7?\hۋ?K>6l?? bMҟ?3oݗ@???PXSy?]ᰉ? ě?Wf=@$'W@!>B@m*1@_>O@ E@,",4@!|b?@9YXPF@G(@S7N?@\$3/Q@Q3i0@Kٚ@A >Q@Bsϝ*@<D@;8=@7x @95hr$@:yM #9@D$@@Qwr@:M(@;"M@=ï@=̎_k@Arz{@F?n.@C^@@i@>ϵ@Bf@;`6!@@\V@=_'f@<g @A]f@B8bh @H8Q@G#*)@Fiѷ@Vl7?@Nf@A@6lJ@0 Hϐ@)/ŕ@ E@ml@0U2Y@9Xa@A&@/҈c@@?2a|???kH?6I?ǪMj@?REj?V?% ? QR?٥?&c3330?p'O?=o4֡d?޸}w?zC?`A7x?yP?ۅg?|O9?+n?cG+ ?Vx?q#?ȴ9[?>r=p?tt?z`!?>cn?!?1xF?ޓ.I?Ңq?,7K?\(?/|?N+j?꿽5Xo?:Fu?A7Z?zl?,B@$a?GhbM@5+@Q$tS@$@Z/ I@ [S&@#zG@p:@2_f>@2u|PH@J'@\ɬ(@Rkb@L|@B#\@Eև*@=@BK ^7@G:)@CO@A5KU@A쌋C@FF%ʸ@C_tFs@?i4&@A`-@@l@B @An@>@@O7@CR&L/@FJ9ER@D/? @DX9s@D[aR@He2g@Qq +@Du x@=e{$%@2OB@'-1U=@"v;dZ%@ s@/[@rz@K[W_@ x@e@=~:~y?i=~?u!@n9Ƨ!?m6?g.?xQ?kxQ/??|aP?ֆn2Q?lܷ?`A?:tM?%v}R?]~5?Ʌ?ӪM??᫽ϪͰ?୸?DiG?Ӑ ck?s?z{?a%? S?js6?%B?7?jjfs?t;333/?xhۋ??;dF?ꀃtjY?]c?333H?584?dZ@Q{J7@!n@t@ &?@NϪ@ސ-@f*@@'S@'$.@97,=@DoЁ [@[U 2a@RVKj~@Hoi<@@.R>@8?cS)@Fr6l%@@€@3W&D@53@>NMt@5@?oWY8@@(@E[N}-@Dچ?@G @Gw|(@EG@Du@@.5@A?1@I@?:xl@8F@av@<\"3@C&Iv_@@ԕ@Ap- @Dl@>c@DwB!)@?W@?[U@E- @[Drw@KY~@@_l@4OrO@.J7=p@(֡e@#5x4@"B ԛ@YJQ@ hv@:PH@>:%K@ Mj2@ӝ)#?/tjx?@N?F!^5t?}j? ԕT?5[? _H?!>?f??̰Vt?Ѓn?bW ?ٛ8r ?Y333p?@.jh$@4<+e@:;F$!@@C@>/ ]̪@Q{W>b@MMZ@A2 \j @5I+@-qA [@(W(s@"gq@&x@u*0U2@ bM@ O/.@"M-.@S\(?jn?he?_s*? Ƨ??߮?R ?6ސ?8l?/;dZ?l*/?ʖc?}wi8?đY?+V ?jf+ju?T`?:0 ?灳{J#?X?#iB?90V??g ?;RT`?na?k06B?6A\?$N$/?u^ ?3e?m;S?sO;dZ*@M#@ RE@:Vl@S.H@YC@3-@ yn=@,1֡a@6EN@G/@Sl[@F88@BܑJ@B;NU@=%@FMho@N&@aj@9Ջ+j@A .z@I7K@G8Xy2@Q,䎑@PV@Gv7O@KM@IcQ[W>@I{Mj@UPz@@Y%ktx@]WYo@Rݿ{@J#7ʙ0@@V($@6p@8&~@B)##9@;Tf@Gxa7l@C5̋C@?Y@<j@=<q@Bwe@6Z@0,Us@1څp@5W& @8QM @5Vݲ-@@8.@Gɓ @D#>KƤ@PėN@KQyPbM@ARs@: dr@2lK@&i@zG@.@ yc@ *Mj'@ 5?|N?oMk@B%?($ ?4mŠ?Vk?q?#}G?W?m?CK=?o;c?j~?n@?ZƀIh?ϋVv?͝ě0?9$.?*#9?֙ȴ9B?Y =p?  I?݆-?&?~A?R p?6 =p? ` qg?&?^ qx?-Q\*?>Q!H?>zxm?ZH?+UM?ؒzL@V)~@ \(@ L<62@|@;v@ [j@'@ ԕ@4~vȸ@CTwn@Xf6@OK@Nl4@Cљ@B4iB@B7U7J@@뿁 [@AyJ @RiZm@Gm\@HTzH@Q6&@`M@cFtp@^jW@KT@XB&@Sos@TU@c ˒K@h;33@eWJ 䎇@a,p@^aLn@Dն3@6QbM@2w54@5B8 @A; =@8u@6 =p@8{a@9{<~6z@5> ȴ9X@:쿤@7Q@3>e@AdZ!@FP?o$@E*BM@1M@;@;֮@FEtq@C C&@TM@L04m@Bg/@6ICY@)'/@cx@LHr>@"@ x@u#@nc@KKXy/?@N?xe\6?[W>??333+?e?qdO p?6z? ;c?ߓ3n7?#J#:?Ü?_B_?l_O ?qXbJ?\zG?\zG?lC?g =p?jT쿷? E? ֤S?( I?)U? Q?mb?͐>n?)5?HlC@.H@z+@ (@j/@ Y@ ,ě@?@PH@f(@#AbO@1k@AdUX|@VTk@Gk4W@HKܛJ#3@S3K@>@9T^5>@8Zb@CtِbM@@ݕ,"h @ZIᵲ,@Q1v3E@SƸQ@NIRg8@_FU@a X3@_a @P*M@Qe(@`M\@]Gw@a<$:@VS@T76z @IaA@A@4MS7I@/qT@D R@/I@4[@<|=@4Ψr3@7|푝@9!ƍ@6 ( @Bҽ<5@@Gz@4Rjd@2r_u@=K0)@>S&@;8ne@:N$@Ap (T@?@H˧@I F@X蠐1@K۟K:*@?vL@2Ir q @'^jx@d@X,@{@wZ@  9@rGE@7#?+dZn?Mj?7?*`A,?ۧҶ|?>?g8W?Ycl?x!-?-d?7K@02-L@1=@4U@@z@6 Oa@3KC@@Q^+@< Ƨ@>:G@>@G_/(@G-Q@H7:B\'@Vϙ]4_@0k@ iY>9@6٠@2*@31&@@.yn@Qw?v_@46E@6KƤ@:)@1` 7K@-`N;'@1@,Dܽp@3V(@;u:G@*} @;-@7.ys@JJ@A8bX@8 Z@GȳMj@@Yoz@Trj~@K1 .@G[@K(~e4@T[k~쿭@M5 @SnM@Bn@K1@^wt9X@A474?@JYO @UjlG@4˳+@*v,7@5aI@G}9Qhr@O((G@NN;d@"\zG@?M@:@7VqA @6VWO@9S@364B@3Zt@.TΌ@>NIr @AA89X@CYD?@6,?}@21#@9%.@6Y1&f@B#v @5ES&*@I_k@Htě@Ij@=-`.@F4I@?kEw@C?M*@FU\FffK@Bքh‹@YSR!Xq@HĤRo@=DX]@3"(@+p7@#F5@i_Y@`x@b@ W>@@afO@8H? =pz?]+V?D?Q ?䔎($ ;?;䛥Y?%a?~5?|?6R@?aoi6?RO0?zJ?U"?pX?˼Z?Rsn?CBZA@]c?m =\@?@Q@q @|@#˚v@-u@4ӖY@@X^@H-D@MQl@T,<@QYhe'@Lx@Sf@N@^nq@oz@bȚ`T@VBCc@F` j@DB{r@@p8@>H@@@T7T`P@DE o\)@9@?OvP@>|x@K"(@9 3hr@1xSa@0쭚U@Gs 2@GM\@8 W@' 'RJ@2̪g@,E3@8%f7@2Lc A@4$ xA@(g"@37|^@;]}@;u^5c@@^a@B$R@1^ @6b ^@?;J=p@46+j@>Dra@5/@Bu@DQ@I ~@HO,0@=~k=p@B gL@Eos\)@;x.@FX@R8n<6@R5x@@Y0ě@6Z@+^k8Q~@"J#9@͞@`9@9}@ )B@ր4ֱ@(?|g\(?1?6C,?Dg81?-?`t,?āo;?# Be?HK]?s?e?|\?ܸQ? ?9X?K%+~?GQ0 ?1b?7q?#)hr?KS?Uk?C@Ϫ͢@m@ Mj@=$@fPC@4@#^5?@-[hr$@5d2GE;@ALqN;@M#wg@X I^5@[ d!$@UpL|o@Xֶ @RVd@SC@rp*m@g*@eճxA=@Kt3@:ʹ@'^]cT@-!ZQ@B/Q@=ȣ[@<+@A-3@62rG-@@W)Q@9a:@,&h@,}!(@0>t֡f@,\?@/u%E@5'@ߣ@/9n@9C\@AJD@1B(@$n7]@,q@.K j~@3Q@3EC@7u !@4i*0b@0a ]e@1|Ւs@(G =p@1쿫@+5N9@)5XD/@=7@7eɺ^:@@S_@M !O@G:x@@=Vl@7!3338@>G @R`Mof@I1 @Rk`s@ISE@;PP_o@0 9 @&3ј@I++k@2%x@3F V@:4`@]d ?1Cf?> =p?9 Xb? ?Fsi?ZGE8?7K#?'.H(?n_qE?(( ԕ?1?/?;R?6ffff?ڊP?Q?_ =p?\)?nzI?l?G?!@ =n@S@vf@ II@ @Q@G@#ffg@+]O(@3:(ٙ@>G@J=p@Xffi@`!)z@\8@[QE =r@HP u]@fvffl@f:%U@dz\"@bG@P(w =o@.\333@4t}p@, L@0 aG@E@“@@@>@D =@FIv =T@?˜@5\@/8Q@+.Q@?S@.vffffm@.ff`@"YH# /@$k8Q@7z >@@nG@RT̻@4333)@'z@%`F@%ff@5@:iL@>5+@6\(@,;G@6k@-sKzG@=zG@87c -@5Ǯ@8@@p@B~\(@E@Dop@QQ陙@Fj'G@Ub@NP @H;~p@Qtu33-@D%A|(@6"^Q@*9 @@fffm@ ˣQ@80zG@?I\"?4?zC?\(?<(?

E@j_0'@eoe@ed<@Uk@IgQ@06o4R@9;m(@4@|@D9 k@GK?(@W<ʏ\3@OCQ@GK\Z@E#'@55U.@2f'P@*ױ@1y@0w@#w @' @vc333*@-.7@.cb@1G?@:YeZu:@'@!j~@.Ѥ3@71&@.`{l@=㯾ߤA@:Ʌ@>"@@>\,@?R:)@:G4!(@2>\@6:@2? I@/곐@4@BcJB I@9W@@%g@Ejcm@>@H@QL)@H&kK@SW$vȹ@H:@7&?@&P:@4=p@ bL@u@3V@o2@urR?PaQ?zl?,mᰐ?4$1' ?0v ?׊3N?oq N?8V?}a@XD@IA:&@AbdZ#@BVn@BEF @7ɤ%@Jb5?}@R(33336@iw=D@M !_@Z1p@[Wȴ4@HcS@4l@4RC@1n5@-ɻ5}@x h@K]@ @.8F@/A7/@&"Ԙt@*o@*1XO@/X@))Ek@4T @8:G_o@8%`Aq@?Cl@.“ @4JZfffo@7c"@M_o~BZ@ANϷ@7a @.tY @2ca@4rʌ@(=uU@9E:@=`$$@G>,V@GhL/@A1 oh@R#hې@H K@K|a|@:˩jd@.uoe+@!z @j~@jOB@ @w@S.@?z?!-w.?i@N{?ӧ?YC?@ qu@?cC,z@$3x@)2-a@AyJ@PmL@b2@pe@[7QQ @_Je/@Y*@_Xg@q;L4@tuf`5@Ggffa@>?yXR@4jG @4\V@2_n@4F@7.)y@>=p@BY@8 @ez3U@`)4~@V->*x@.\]c$@1 J=p@3wv_@7 C@4\М]c@)̖Oj@. @&qu@_o@+MKƧ@!e@" 0w@4oY@@ؒ/ @Er"Zo@E0;%zxw@C6`A@GT@Q&@K@N@;vw@-辐@ɭ$O@M @dZ@7zG@ %Ss@ )(|@ Ԕ@?mm(?L"??ï?ح?䉬n?xFy? %RG?Ws?Sna?bO?@z?k =?nT?\S?E?H?>G@~@+l@s$@ fffH@!|l@_a&x@ě@"59X @*=p@5TKƦ@C`C@Ws+33;@p=+@V ;@Uu]&@] A2@_$~@Y(lj~@VbNR@Wzk@?Q|@/C@3. @1Q@*Cě@,T P`W@$\V@-D1&@*T(fff@1{8Q@<"+.@7l-k@94Jx(@0!G@3/%^1@0,Zq@/@1Ph8@3O޸Q@1@2j~@ M@=;d[@W(´@N-V6@w@'tL@5@< =/@+^$1'@@$7Z@#ft@/=@2Kƨ@3+g@2C@83/@Aa燐r@I#bN@Gq@F=B@C1&l@? Ǯ~@9<*~@>?|@EqENz@F;"@A`pzG@H:7K@S$K'O@@1Cn@1mU@%U_n@NNE@r̙@-K@ ě@Mqfff^@ ~'@x@D8 "?gl%?Q?`\(5?Q7K?0R?ZT?Y\?ɑ? '?s?r"??GX? IX?v4m?C\?Q@y=ن@L@"h @\n@ \@@ ԕ@$tS@p@%0+a|#@+Xp@5|@E>s@Zo/|@U9;5@UԤR@X%[U@]*@E@@;Ek;f@Q}Zz@C @D@/@4+@.WHˌ@(wH˚@0|@(G@=0".f@3V?b@J#ɖȴ-@@<@0:Yl@9QW@31@3QL0@=a@; '@2W!-y@9m2m@*dh@/.~(.@1%@ ?tp@#jw@!_B@#dN唯Z@)!@!su!@'p@E@3Eof@9oN_u@5MڹV@. x@6eֻ@)s@s@5Ψ|@4 @4oO =q@25?@3*6@@?!-z@;lD$@4šʼ@5p:@</@;-@7(i@9/@9h>B]@/|PH@3p2䎆@5(r@8+@(KR@-|D@-!1@'@#9Fn@#OA [@uB@#f8Y)@(KOn@*@Z=p@.b@+bs@1Hi@8p [@Bۛl@FX.FU@AA'@AE@DZ@FPp`H@BLA [@Fl^R@EE@FMߕ2az@H6lIh@Q?r%Ϫ@\1@H6{Mi@6f̲@&޿ ě@$G)j@"^Fs@1ۋw@$ߧ@b@ jQ@ q=>@H/{3@'$?I7Kf?A q?@t?YK|?㙀ě*?Q? +X?rGE?\$M?~`??? o|g?mS?[E@_ =v@} L@z~@XXy9@dW>;@333%@ mN0@RT`@/=p@($@6 `@DE5 @Rd_O@^ Bc @Pu@N6+@M5؀N@D߾v@:K@6e(@5uL{l|@1p:@8@8sx~@7_@2MO9@0 @0($@8hN;@6\l@9XD@=u)o@;T˒H@3N!-o@0Yj@0_ع@7#f@7 CZ@% ?@5@7b\Fs@8 z3@<>i@;U@6*q&@A;dZ&@@H[DgE@E(s|@5hO;k@6:9E@9R@/Cm@)yXbG@0Ƨ@/"R@2ᵕs@3j@1J@*-Ȍ~("@${E@+~sE@-vrB@*.z@.]K:B@/lc&Y@9 :xl8@@*d@?v@ADDnc@F~kP@I|@G̡Dn@MC p@Ia|65@D7ez@D <n@D$@N9e@HR Է@Y߲=p@M ϕ@??hx@8Қm@4Pntx@+\|@" ~((@N^k@Q@:}Hp@ =\@;?B@Ƨ?nfff?D'RS?vo?[5?䧤?[? ě?^5|?)Gv?ˤZ?Rp?z+?9X ?kC@@4\Qr@L]@>JEʹ@{ՅJ@݉7K@ AJ@`Q@ =p@ |@)L$p@8ڴ3334@Dɽp@SdZ@T ?@M"@N0W*@EyX]@Cs33>@Fh4?|@AY @Eff@>~F@B>@=%ٙ@3KƧ@+|8Q@.`&x@5o33V@B[dZ,@0#7K@(333@8{l_@:mՁ@8Lf@:~@3Trz@BUO@=lRn@A71&@,C+ @2zn@4XO@9<[@9äS@5|B\7@9rY=p@3xכ"@-mJ@+ ;B\C@7:^5&@/aG@2!$/@,;r#@.oɺ^:@1@j )@8@7k F@99f@:k ,@:D޸Q@;GC@> (š@Grj @Fff^@F<@Nм(@GG @?z0@>Bl@DVȴ%@PP!M@Vv@T9S@QEQz@HZ@B@6RS@. +@"@ XbO@{fffl@&"@L@ ~@/@x?6z?hr?kE? =q?z\(?q+?o3P)?S|t?'$H?8!w1?w ?p:Z?2?=e^5)@tS@$N @ՠ@ N@ /3334@ HJC@jS@r@)[O@7ٳN@GtFs@V&4m@U݉P@NQ6@J@D Y@)9Y@)TɅ@3$IG@5~*@)/4m@,dj@'."w@$K@,̙@7)@(_ L@1J.c@4t$@5}xl,@7 d D@5\j@2%Tɒ@4zUz@9j~@8=ڬ@5bUG_o@A.H@>׸7@D"q<8@L+17@A@DviDl@>@BKQbM@?xJ@;%`A@@%@NB:T@J5oh@I+N_@Uk&@Lpjy=@D &@9l0D@,Mm@%כQ@ 8@T @@{J#>@·+0@ Y%F ?`7?`D~?(-?Je,d?]Y?𔸢3?Z\)?˂&?7Z?A?[񙙙?_ح?vȴ>?O;j?@9XX@&C@#@@ót@Sb2S@* >@&:&@jv_ة@ zE@%}H @3n9Xk@A@TBˡG@VfH@OTG@NQ@F@AxV@JjBe-@Ju*@4m@FQOD@B+)w@Gy@L Z@=@*͞@9ݕ$@3X@.O@>&-9@7;`K@="z@3$`A7@0kK@5乿$r@8L.1@1@#Bc@0C1@4㢜t@=sOhr@2 @8HZz@1v? @.T@3>X@.h49X@:rZa@.d~@5w|@6m($ a@4+<@A2R@KDtSw@@ۊu@4a:@@@8333@5Vz$/@8{_o3@C!1A b@H@OU;5_@G@E/Q@GkM7@B`Gr@KP@C@9#+C/@?K1A Y@F\@H -@F XQ@X@a@U$rE@G8 ~@5@-r{@%fz@!Y}@$Gx@Uzxl@i5@[݃@>M@h$/.?Sd?V? 3Xv?RU2?<?Cc =?fz?F??.ڗO?A [?=Hq?HQ0 @bM?^bM@'MG@:~@^g6@vݕ@W =p@s1@3 jP@ $O5?|@( hr@3g& @?a@Pw+@RbnA@LMj@J~Q@G0}@B덌V@Cb@I::u@KPa@D}`b@CiB@D]p @E)}@:=#S@:y@1V@0,V@5G@3FR@:lb@>,/@?T\@3ިT@,d:ffZ@5mtD@2sp:@6ڼɺ^2@.@*y+ 9@.pD@=+h@4cn.@:2LIm@A 4zH@Jp @DYW@<fH@B@7m@07慡@;c6*@3;3p@>ѕ#@7݆O @Jj=p@@=@8'6@A:9Q@Bѷ@GkƧ@EkPbM@B-w?@H5|@Xh*8@Lq#S@QjKqTɉ@DxAC_@?YJ@@iP@:8fx@BΧ@FAC,@];f~@S@Kx@=(-V@4i" ~@0yfffk@(D@$i_>BZ@!,Ǯ{@y$$s@ @@U&7@ n.@( ĕ@ɲ-G?$k?&Q?%|?n?,"h ?6.?e'?fx?>"?^@]?j;V?M@Qv@m?@Ghۑ@EJ@en@7}V@d7K@/@S=\@(Z^@3*bM@@緰U2b@QmF@X[=p@NG1}@NU;f@GW(@E]P@@Ǡ@DW&v@Hh1&@Ep5@B>:x@@G@F,p}p@CwҰ @:\ө*%@6*F@6hۀ@8rXy=@8X(@2e!@N@6'@;L2@- O@'"a@5ӕ:@5]c@/@4TwO@0+@4\w`@;ݲ-@C6R@9ݕ@TKI~x@N^?|@Q5&Fi@B,-@8{cѡ@0\Br-R@/=e#@79oT@0@72(@@a.@27@:lح@I 3Y@9qjN@GNHv@>mK@>*6F@Uϑ^@R-!Y@XFT @^j@Q팟v@G9b@C˔@K=$mV@Bd@T?@^a@J @@~@=+@4VWX@.b@&;g@ h8Q@*T@x@>@ &@Oz@ߒ`)@pb@'r? O?1'z?!$%L??zv?簮z;?5Q ?q?ϣ"k@?E@ә@]-O@+l^@ S&@ aC,@Yfffi@C4 I]@aDO;d@̕@'3331@21@<;~@MLn@T$+@O#ؓt@J뇮u@D!@CA'+@A]6@L+|`@N  @G.C@EOi@=fZ@5a6E@9'!G!@2Ã9"@DSE@GmX@:.z@,_33P@)m9XT@3ZG@?=p@5l?@5Ǯy@7V|K@DO X\@4ә3@)R@0F n@/'uO@%(@%9X@0@*x,@@,YX`@E2@Dl `@Ap@F̻@a7 =@mpo{@U^^U@bI@\hvȮ@QXTvȾ@E Ġ@@ Dr@6p@G@N@^'B)7K@W=p@H%;@E=p@:T4@1W׈1&@'9hr@"+ @Y333?@bM@ Ƙ(’@ *1@@ =p@F\(@ I]?b"m?$t?U`An?s=p?R`A?西1Z?ڞvȴY? ě?ح? x\?F r?&@Zz8@,s,@ Pz0@+@/{@ /9@p >@c'n.@ ̣2-f@!*q@'  'd@0Chr@8Gؓt@JG+@Z=h@LqD@L@M @GJ)]F@FU=@SF2@Ks$@E>7Mqh@EWA!@?ޏA#@@ՐX@3{|@@L0@:gn(@A@3`ě@;S޸Q@%t+@/߱@C9ol@2נP|@9bM@G@EKt@@ AH@Fm`ě@A`A@[2`c@IFP į@MJl@a1:@D ~@2u @1NTw@2t[;6@;cR@9&b^Q@:Q[A@BD*@WrSO(@i.).@X-@I_1s@\~n^@jBk@Z̉=@f_@\TD {@]q_@MRzG@Gح@Aן|;@Xs @hUw@R~1@Mϐ@Anx@=g@1p@*$9ѷ6@#)@t333,@feN@ 9@"@Y@tj?C/:? e?)YJ?"h4m?Ed?W?8c?DPHp?2\(?ӊ ? (?M~7z?en@< |푃@ *0G@ ܲ@ 4oiD@˝@In@0s@"7@&֘5?r@,˒[@3NV&@=.oy=@JB0m@X8+@N%L\@J1&u@O-a@JVϪ@UH@WMg =c@HMU@H,<@AUr?@> }Hˏ@5rwY@:C =h@2+j@6O @E@?@?G@0;@*\(@5]@3&q,<@5br@3nb@2I@hۛ@Dv@CM gg@7ut@n**@Y .쿦@Jn<@P݁6@GNٙ@E(,<@F^i@C[p@S{@EI\@6uiC@-͉wg@)^<6!@51 p@L~C A@=Bh/@AT)@kȴ%@hc5@S,=ٶ@[;dV@P:33 @FNl@7"~@'Yp @$ix@\G@@Xb?@`Xy=@ A6z@|'lCF@ ^5?t?f\? b?m[?il4?뿷;d?6g?"P?x-w1 ?ˇ!}?⎣= ?!|1?Ii??r0U2_@WT @=@N@A>@ mv_@D @j @2 q@! @&i+n@/1@p@3pq&|@=0h@J2Dg8|@YJ'v_@L3|PH@R;@Qѫl@Q we@P{@M{?@GuU@K<'@CZ#>D@>&i{@G |*I@@;VR@9N;@C*@BA"@V'@P#I@`ȴ@kJ=Up@RKAsǼ@\g}Œ@Qݗ@Iyح@ST5-6@lf'@pET@f'@@VYX\@M^ ě@CC,@9W>@*B7@#6v@Q@K@rGD@N;@J:)@}OKƧ@2-{J#C?En.b? 1&w?F?t,?ԟ?.a?\'?o=-l?/qu?($ k?XCk?Bڹ@`Aa@:OvP@ RW@TL@c@o@Kƨ@"=b@'q5@-h @3Õ@8@Cq[Q@S2n@Q[WY@Pʮ@Tyz@T`tS@S1Գl@Y׬@9 Ƨ@AhA@FɅ@Ohې@PmhJ@P^?|@:lϪ@5{qu@8u 'Ry@'M@/V@(4m@&$x w@'N@.D@zxl@2v2->@9~ @\|Evi[@=n# @+P|@Q] IP@MD2@C|@U4Zw@PA@:2n@7uY@7e+@C R̿@JS_@RX¥@G"ѷn@L &v+j@Jd@V +@;\(@b%j@HW87@Rqu@;bf@@;O;@` Iv@K;Q@O9@O)@pX95@ei;d@I(S @Nlo@P @r>(@u 96@qn.@b*:)@R@G5?b@>ɀ @4"*0@,O$n.@#@=p@?@_ح@ ~S@ Ó @ g@t}?閍?ed?#=5XH?zF?hrT?Ž?gpR?\?O?/ ?*? S?XzG@iH@@ sKƨ@y?|@\|333k@r @YI^B@#;fffa@(\(@0z=@4t@@DV@QD(@Xdz@MQ@Tߦ° @\Vvt@Y!LzK@]vQ@:z@CaJ=p@J ^Q@]ěh@g*s'+>@\|M =@Q]$z~@8^)@$u(¦@#&@$&ff@F9@B^@RX p@avu@S>E@F(@]ƿ}p4@u!p@oWA㕁@f].@Vo M@MTfn@5 1&@+NzG@$ȴ<@fffZ@gx @o@ F?|@ tj@2zB@TbCh?Q/?Y7KP?$(X?=]?NR?Įܬ6}?ol64?j N;͠?RZ?*6|?Ice?`)^?f?~7L5@Z(@}T{@ &x@ ^BZU@qx@JW@.H@"+m@'s@._Y2@3x1&x@= a-w7@Gh1&@Y+y=@FpbM@GO@UI-p@T@J.@[,@DhUs@YO3@d;+Ӷ@n|@g"@S*@=v*@#Ӷ0@$qj@">@*k L@0GS@@*B\3@8ݏ>E@@ +@5:@:)B@LS@?tҽ<@*HKvȴ'@7uBè@C @Whr@hTCL/7@7&gl-@<11$f^@A~Q@C#{|@8l@7}@A%D@0B9@5rw҈@D`B@6 =V@E@I٢_v@E w@9B1@2fffW@2:e@1#1&@=DTFsn@CXѷl@Mܶȴ @G͞@T`J@MըXc@M^i@pjS@p,”!@cg8@S@KVaw@CT@8ft3@2r@-.UqA o@%J|@\(@}Hw@@+(@ #vȧ@?Q@ezG@s?$/6?H%&x?RxYJ? \)P?6yb?Zw?׌?#MV?Z?8l?)Q?jՔ?%(?wl>?E@KƧ@p:q@Tq@\@Ϡ-@"وh @%K@-e!.`@2-"@;*K@H@Auz@M@m@[7K@SG-?|@D$X4@STs@M,z}@JYH@H\)@U#@\aZ@n\Vʳg@hLJ@R6DIk@Ss0U @RrZj@;-`@&H9<@1T.z@BcT|@;2 :)@5u-w1@;<@1$@>O@?}B I@$*y"@8K>($@2l@,Sk@ h@P@#"Y@ _w@ 3@+@-dZw?!?ȯ?^G+k?KƧ??ܞnѸ?[#>?*I?-U2a??š?}?!-wA? _?yt??A@ ^@!:@ bqi@% :@ Id@#%qg@-,0S@0\? @2z^5E@B|Xy<@K@OҲN@`Ls/R@b@c_ؐ@HpH@PZSh}@T؀bM@Zy8@_ [@aBU:@ghq@WK@Jo@Dg [@C%@CF @4F_@7|G@6n@@hۆ@/y;`@=z$e@-8=p@-L9@G |@"]h@ 8j5@%0@1xa|(@:-4@?lu@B>\@Cu@AY%o^@:_o1@6|h_ @4}p@+\ @-qu@4RN;@3:@B?@5aΨ‰@EG_o@HlcK@ALvFu@23b@+SsE@2'*ξߴ@7A@:?c@Ie@?W =@=]7@4H@1;@J3ѷ>@b r6@`4#9@X6^@P~zxY@B@<*z@5@/Qr>v@$pPH!@ȴ9V@=p@IcA ^@Y%F @K\(@kb@3b ~?bq O? IQK?D x?X!R?t?>K?m_?PH(?\E@dsC @th@dM!@H.tS@PcT:@W\@Tf@TfJ#5@kdO6@RSIQv@PΌ@]edZ@?LS\?@FK|k@:/D@8ѥS@7U@7SV'@>a.@5w4!G@'X0F܅@6 ?@2tm@3Oݲ- @*?36Eʢ?tj?(*?,S?\?z?fffg?g\(?"IGx?Wffff? =r?&fffc?DzG@3R@l\(@ Q@8@ ffff@p @!nfaG@,Q"@8ffl@EWQ@Qcmp@^ I@d7z@p6@Rҳ;@A\Z@C =p@NeR@Ms330@Trb\D@V`;j=p@P3336@N@O|(ffY@8ğ .@;m W =j@:lp@3O=p@6M@0 =p@9(@(|(@$vG@$p@$ZN@5+ =r@)Mfffy@? s32@333<@7`zH@7J{@6U3(@'ҏ\(@'@9oG@A/,@=Fp@6 =p@7l@F,@6aG@90332@@hG@BV3 @BQ(\(@LBٙ@?3333#@;rs33;@B6 S332@C9&ff@@/p@AjK@C3z>@AFfff@: Q@4[炏\(@IV"\&@`@lkffU@WލW\(@I ȺG@?TzH@@|33*@8p@2`(@'OU@#nG@J\(@f@U@E(@3333 ?fffl?fff?!p?'mSW?v=p ?YYQ?\?b\(?hup?r^N?ɱR?꫑G?.=p?iİ{?i V?okP?S@5TɅ?Y@@ "h @u@zG@"Ft@ a~@#N L.@&przG@,_o.@9&7kR@H7K@XJqN@] 0@^!@\KJڹ@@nM@AFJ@I%Us@AMOB@G%+@c<xl@^@K7쿳@BY@6o@3刂@=WNj@7vd?@1PM336@,(Ϫ͟@8{*~@/yϪ@"n@Bn@$/j&@31A i@: AɅ@5@J)\0@Aw1@>ff@=h0 Ą@6iDgD@=W@4;l@:@Bσ{<@3IS@Fb+@XY[Wa@A9Z@?SIԕ@qGKa(@deO-@SM2@/@>a4@7 hr@9#u@5%V@0K~S@%@!7X@ F6ix@3332@{W>6@#":@N64)@-y!??1? ?QX$ w?Y?lj~?YK?X k?!K?'?Iyg?Fgg? u??-Vl-?σݗ?W =p?훁?6bM@ ˒@Ve@o =p@\@@p@N@Y@%q@2?;Ϫ͝@D45Z6@M:<4@CJ9@IQG@T*\ w@_ Lw@?h"@B"{O'C@AiWKƦ@NT(@d3Y2@cb@Q ˕@DY1@5F<@7jq@1a[Z6@+ (@;f-&ff^@.:8z@6bQ1@%ʅ8@&RK?H@)bM@)u@?y w@@I@.z@3 ~@3@0TI.H@5c@,E^@6%c H@9P@8%3@7F$%@5*1w]@8H@;t{@8N@8rZ6@>8@Eh@D}mB@@gkJ@A(z,@1N@;׍PA@7beL@@VD =p@h ě@%@™1@>4@8!E?d=$?1u!?JnI?)x?_R,?@4m֗?/Ĺ#?=?L6?H?Ofx?t_X?L%x?|i?xZ?D?fO\?w@lUd@0 0@1\(@ C\@yzG@v!Z@"a@1oJL&@0}@1ءG@4P3Mj@; '@K/[5@h0^Mq@E.Mz@H61V@8Y^U@SNHD2@d09P@c馵@KR@'R8@1?N_;d`@6cɅv@)jr @-z@4bsu@8$@:_@+'z @' ˊ@-S@5\(r?@(82k@2in@:P<@6(XyM@-Ǯ@j@2qoO @%UQ@1汦@0̶@4l@6r@3wX @B@q@DBffX@AEHp8@@z{@^ š@T7.I@^_(@SIa@Drݗ5@IStk@Q`j@X:"c @X `A@;787@72 @5>5@)!<}@1 k@/4"R@&Q@)]fhۋ@'p@( @(Xѷ@2C@0dT@8Ed\(@4ۥW@9%Rï@2bM@jk@M@O h@FHrs@P,0d@Hۏ\(@ArstZ@<>H@2Q@*BF D@&hj~@$Ќ*3@$+Q_@BoT@/xF@z@ wfGE9#@ v4@aX,@vSn? ~P?O\_2?%ԕq?Y ?K]c?C2G&?̣ It?Zs ?\?+"?ZzG?&E?8%/B?3S?px?霪=p ?S?h`B ?N9X?Ĵ9X>?@PA7S@ M(|@/@ t~@AW =p@YA7%@yr @Q@*Ǻ^5b@G|(@QBNQ@KN\(@`t4" @Lw@N\(@PI7K@Pf^C@Pǔ@A9U@7j}p@8r|@-՗ =\@,v@.(n@2n=@2;@0>S,0@%0+ 5@0eo*@(zG@1'-|j@29"@3?At@4Lx@6jzp@6pWO@:y@?q&@7@AEK@=F@KzG@Ev @R \@>&:G@Ed/ @Ca =n@4eS@> ^4@2R I@+j~@%32@#$Eʰ@%/@ܣ B@})@'\fff`@ zG@ cO|@ifC}@a^5'?lIpf?z?6A79?#tj?T?θQ??|?a? Xb?]Zc?1hr@?`>BZ?ky 5?S|?·kQ.??ΰ?-?ל?܊ P@-\@bM@v3@J6F>i%@\5IQ@KaO^58@O #@NTf@GYV@@8@Bv@CAU2o@7AWXA@4bg8@0es#@.j5B\'@-үXy=@#,J@-ZO @! !@2az@)ae+@7$ [@8SqF@:^Jc>@82˛"@8@;%RT`@0D7@1^R{@1ZffH@1o9@=Zݲ->@>{@5cb@: u?})@>dW@7߾?$q@5k -@7{J@=b@?@A_@6PDz@5@@T1&@9Q}p@8Ph @8B'@A[㼽@@@_of҉@J>q @7Ƨ@=f+H@AI1Tz9@:[K@3K7@2v]cy@&ts@")x@#Qix@%s@"$@6ɶE@ @S_o@׬q u@!@_l?GS@Pn?xԕ%?8|?0* Li?|?5?~?ۓB_?ݼ·?8\g?ꙴj{? xe?N?T x ?hU=?ꖋE?JL?@+jJ? I?*1?|̸@%F @Y @2Zu@ ?O;b@ tJG @1'%@^#bM@]ps@7\e@=x@2ePv@7*Z`0@@1[@OiW@VdD:@C# B@GG 4@A\r<@@@:lU@=`0=@BW<<@= 5@>`@-Z .z@,B.#9*@2E9@$@ k@-3aG@+9@1A :@9pC@0T=<6@9P9@/DKFs4@, Rq @9tb@)E#R@'9[@0aA@;BeP@500:~@,Lt @Dnx@;7\@;r@6mح@+US@68Q@0-x7@)# -@0!A\?@+l k@/›@@0f@;E@Al@Gw%+@aQV@Y1B@C16_س@@Koi@@9z)u@=E@4rʱ@.]E@)p6@"[&y@HtS@!4@$Khr@ @Q M@@0aGw@_o%@w@N?/0\:?6?P ?K]?uC?BeF@?FE!?e|풉?Y@Qy?!K]dB?Ӎ|?ڼn.|?=?N!Rx?\Z4?qN;=?G?`A}?6.fff1? .?>-_?332p?ZGx@  [?"/{@d @oiDe@FlV@ #ۋc@ jl"h@xl"[@2~n,K@.JME@'x@0ʼb@8Hqi@Affm@P}֧@Sef@H{O@K/B@Al_o@A;cnu@@7oe@CvA@='-@;p-B@6`\(@,Z@0@0 ę@1KYJ@0u@b@6PbM@-]u7@20"3@39Qtm@5+@7\H@5)y@5sMj @6~@*>vȴ@+7@43@72;@3H@5]&@6Q@;VJ@1&x@)tS@ Gz@2R@49@0s]bh @2=n0@.` w@$.H@3#g@Aj<@] U2@]|0 @Rs|ahr@C~@9J%F @7*OD@7CNV!@-2@(X@%;ڹ@b{J,@w@7v@1/@|e@ N|QL@A@v<5?ͣUV?fffd?xԏ@׊A?XzG?q/,@QB@1&@?@Ql`@>^5^@i̸@O@(um @++‘@2U9X@:R@Qtu@X(I@]88V@I>l@G11@Hf`A@J)޸Q@F}p@D@A\333@=Cn@;LIZ@>i|@?̺G@B n@449X@22@1&NV @8j~@7h(@+:$1@4ˠ@4 I@?K5;d4@2(@6W@9G2 @8xXO@=AV @1j@9h@8pg@3Nl@<|~@8332@<#Gvȱ@@jt@@e+@DZg+&@E\–@Ař$@XoB@RbM@E-R @B333@<+@6ik X@10Z@,z 7K@'T=p@!pZ @!@Rtjz@nj@@VCT&@̔b@|@,j@efffp?-V%?=hr?Q?򕙙?G\?&?燾Qb?5hp? I?ٕQ?P]?Ct*?$g8?[ ?\H?\??=8M?)>Bb?=k"?!l'?mR?^0 ?FW?2+z?:~d?ǣaD?ᰉ?TC@N@zv@s@pB@4w1@mrGE:@^@~B @!fH@&&@1#j0@<%18@A `M>@L<O@Z"ܑR@\J+J#;@J1y@KE9_b@HC@FDmD@B*~@Bz@=z@;QIFb@?mVXy<@?Z'@Asq@4n'?@32<@0zx`@5T,z{@/7,@'"B\@@SU@7~=@@ET@>PQd@@ԡq @@ק@:%lzh@<U~@7@By@; @> Ϫ@@D0@BA@F4@CCH@7Zh۠@F)Vl,@GܞE@[e2c3@LT'@AGC j@:_UC@77@+ԩ @1jbd@+ 4@&uA@# ~$@ CA@y{zx{@?P|@yǭY@ hr@!G/@lH@4m?Gu!? p?4mŚ?6͞?B?>6?Sv ?b#9t?J (?Fs&?tM::?Q\(?Ҹ#E?v?MRJ?!?S??ޫ`A? ѷ!?j4?!h?~[333/?$S??4E?{e?$zG?2a|?]O =p?7?zG?ʥVX?dZ@O N@ @t>BZ@7K@'hS@;*0@ &p@&}.z@-O@6@BF#kj@Lݗ@Pժ j@VgbR@Mq @J%V7$tR@H<9@F ]@G ffd@@4@CwDn@DG='/@C?@@V@<@M@8 _ѷU@7?[a@.yATw@4cEʲ@1O@<<u@:d n@>O|@Ee@CZ?D@<=5c@JL@@C)У@=te@Nߨ@@J0@D|@AS@@&#e@BbZI@Ax}@DL* @DsUe@BHHW@A)S(@Cr C@AƬ@E:I?@Ogl@Xd-qo@H] /s@8ȹm@6xl@2eA@(EHK]@" @"|T@?@N;@U= @$/@@+ O@N;@z:@AɅ@ rwR,?pa@Ac?-5?} ?a^0U2f?@J??&Xt\?mp?[T ?]H?_|?歞[??Ⱒ?֢c?nY?֢7X5?Yд?#aL?iB?9Xc?} Y?ᡸPH??i? ?墻6z?c)^2?xK]B?@{?zE?4??$"h ?c xl"w?M?NVL?xd?»?.Ӝ?1`A@u%Q@Q@:_r@Jd@ )33.@$Ī쿳@)B0S&@,2@3-w+@7:@Dc@OqGRT[@Uz=@Wfp;@O޸Q@P\1'@O@B9N@B2QVa@AT+/@CډXF@BT! [@7TW/@7YQd/,@9j~@?'F@A1@C @C΢b@:Sx@C"@B@Ehۃ@EG!@BsDBM@B"@C#@B \&@@rZ@HFδzC@TpoiW@S70D@C]c@7.11@)/z@(K/`@'xA@!n@N%@9Xc@̭~ @Nom@P'@0@|f@ eoiDh@ y?)@ 2$PH@X($ R@#S@*u&?l"h/?zc?+ =p?|'\(?H?8 O@P(T@Udȸ@Pffff]@F  :@@l=@1{`A~@%R@"Ĩ”@ /t@#`A5@>XbY@ .@@M@t|`@&p@ G O@fff@ȴ9u@KƧ@,t@S?lQ?@?!x@\nh?tS2?A?򳛝,?g?Z?N5?|?'332?2(ě?m?ڂbG?–?ݟ ?ٝL1'?ݺL1&?p+mS?ݤ¶~?՝?ĺ(t?᩺0?w1TɅ?+W>R?lGVY@A-P:@C#@Fc%OF@GFffW@JD@H@H,T@GH"@E_ؽ@I2@J7@J7K@Q#rS33'@S+%Z@Vԕ @P:K)^ @C?yu?בS&?X[?#?ԕ?uԯO ?i:)?Gʿ?ep?ycK?[W=u?ߤA2?( t?؃g?ĥ*W?L=?u3?~z?V?5ᰔ?]vfff?< s?' =|@@N|?ĢYJ?'zb?of?p?I|?/0M:@%@kڹ@c@BG@ J=@:L^@n?@v@&X7@&uѷ@-q唯<@/_%@45T@A@ElJ?@E;ezxc@Gq\(@NbMha@RUi-@Wأʈ[@W50 [@WfLj=@H;d@L-@B?U<@A U2az@?}@E ļ@SOSf@SЉF@SV]Y@P>ם @GOj@AѼ@>x@7c%+ӿ@0GC@&ߔz+@!ے@;d:@=@/@cEʷ@`\^5?@}N@ JS@ - @̦@; ?(-r@Hh[;@%u@;dF?׎xl#?s($ ?C,P?I=p?"?/;d?w >?T?mu?᫅QP?8_?p#?^?g'?j n ?ԛ333?x@K]0?(SP?T`d?lB?ّ?U&B?G ?C =W?.H?PHv?fGh?Y?n5?|p?8 [?Ej?J#:3?yN?\)?ި?E8? Fۻ?$WO?15?}*?^Ii?P?ろzxk?x??&Q?Oo?ݡ0?* (?@+W?:@{K]@@::+@/_ح@J-U@#{@ RT`@ A7@$+\@)^L@1'|@0wwe@1h>@7@;g϶E@@$-@AM/4@CstL@FtZC2@E{?v@B{!@B\7KƗ@D?ü5@F)Ԕ@DߝN(@A&@?aa@>ɼ@8@3iw@3 @-e@%E)u%0@"R&=;@(f@\)8@,7@ s Q@#T@w@ -;@e@ 3(@2I^:@E{@@8 ڹ??euN@i (?,A7?#:C\3?5XR?]*?#s?$\Q넣?KA ?x?%F ?;+j&?fff?P5VlV?a^5?ަffg?2ߣ?F[?֔Fs?ESv?)^5?ϦD??B]n?'R ?Dg7?&^H?让q@}@ @/y@nvȈ@eu%E@Lݗ@n@ (@!(@W@!|C@$Oҽ<.@(m@)8Qb@.k|R@.@3Xy @0b*w?@1J:^5#@) -@.+Y@1SVh@1 <3׽@0L@,)K]@';O @+P@$gG6@#vO@!#}ڢ@ݕo@Zy9X@`}Vl@B=Q@ M:@ GE8@]@Z?3?-V@ӳ|@qu?y$@>ʳgw?5gdZi?BYC?L-?H? ?JC333A??W>?󤧟U?E.?tx:? I?%4M?ӟU ?a@?b??30?co?뾺gB?hp; ?LCPV?䖹hr8?>?5zxl?ݳ}??]hq:?fx?s?J$.?ڨz?;dZ?Ջ$.?ޡ-V?3S?̾Q8??Χ?hr?6p ĝp?B&xԓ??k(9X?(?zE?zJ?h񙙙G?W[nV?* ?B?&y?6d?NH覠?1|?½b?ٞx?\7KƗ??ŔL?r ?(?yy?kŔN?'{?6+?TOn? {?FxGB? kj?Kg?I1?q{?5F?JWE8O?\?z+?qj=?@B]c?hr@ zG@҃n@ tj*S@ A [@Mj%@ mᰣ@ / =p@ n.@DM@Z{@y.S@ ƀffft@'/@QL/@*@@kj e@Yn@a!@݊@u@n@q @  @hۋ@g\@dZx@ $IJ@ @+ =p@U~&N@ZQ0@i@Nf?)y?rFs?1T'RT~?=5?|?=H @}Vl?s?{.H? ?"?X}m?ٚ|?F䎊&?# =$?Za|l?te.H?ڒp?gqE?~xQX?X{n?ŔOJ?X>B[?[J?H,zG?PHN?V\? ?nܖ?őhrN?.Ċ??㽑?N?d`d~?ແG&?KƧ?ݒh?Q?2^5>?ԇ?̾+j?iWD?M3?h+S?@0U2aB?}?(oir?…?S =? ?.0x?? '?xn$/?_:c?S}w?<7K~? ?۶E?dS;?o,?U/?N?; =p?}g?]]?#@W@;5@}rzG@ݡB@ ${@@O d@2 \)@4m@tRT`@G͞@s@t@ -V@ bM@ vS@ _av@(j~@ U@C@ NZ@ t@F9XZ@25?}@̂>@8@ A\7@ Tvȴw@Y"@>J#9@d!@4ۋd?^(º?L'RTV@RP xH? 7K@)y?٣ =p?ju%s?M$ݦ?j5?:?dž'c??nU?z ?F,?2Zc4?YK?Pj~? ?8u?!"W?j{J? \)Y?y78}?ȴ9?{MD?k2W?ŬzG?Ϯz?pXy>3?Xy=?H?Ba ?ٚP?ػ~?>!R?$3?+ X??ż?h4?eYJ0?S4?%?G.??+j?؃S,?sa@n?Ѹ( Ԕ?RJ?c?7Q$o?G&m?lZh ?/\?E?A (?ˑ?l:Zc?ʩC%?_8Q3?"?1?1u?*?+ `?Ų-K?l,?Ta?F~(#?{W?IQ? G,?0:)n?-2?i^?=.V ?/O_?G$?"h?5Y??j:? $ x"? [ ?`|Q2??ջO:?+Mj.?"?jm?k I?6_ح%?gg8?dA7K^?ҀB?a? 8.:?I^%?ш*W?!-wM?Ձ%/?Z,8?s_?Hl^?rY?Qs =V?ϲ:)w?պ09?D}8?%"i?M$?'?_?𩔕*?EB?vȴ9?EI?5b?zL?D?߀(}?.T}M?}_!-wN?+×?W<6t?9X?SQ? :,=?Y?ky?!hr??D7K?C?t7?;dY?'g?lB?5oi ?M:0?B\)J?xA7?,?D_?db?ꝲ=p?-U?ڈp1x? ?܋C? 9W? ?"{?P6h?Xy>?=P?gXH?O L?&+Ƨ?V?Ӝj?/??ye+P?9b?މkPE?ち^5?Dg8?ۋ?Qoh? L??x)^?hr?j~?7M ?ѵ *?@&?$ܲl?Н"A?Dt?P$ w?+%?^59?/D?|C,?i^4?f`?( ?* k?Dg7?ԮǴ?2Vl?f[n?5P?;ju?h*? k?̼j~?DNFsT?ߕX?tS?OzGz?B 333? ty?T&?fȴ9=?af?lC?zg ?n?I)?뙱>?no? 3?? 4N?{"v?`A7?_Ϫͨ? p?m*?ǐ[\?_;dZ?Ω0bMӲ?՝quk?שԕ?׫?^/\(?Ԍh?̳7X?&?a3N?ϕRP?`'RT?4l?ൂv??̪Mi?@ ?y?..?ٴf@?=^5?{?/;f?CB?nfff? ?C?I^,??fB?۫Ҭ??ݘ@?V ?*0? T{?Sg??9M?L!.w?ѭB?$ 2?"*0f?Q^5?7]]?¤u?Nd?fE?JGC?~(v?#?եb?򅇓?Nz? Q?r5}?$zxl"? '?&ep־?N?'(?ݽ-/i?;7K[?ؼ?&}V?P??< )x? ]c?܃$&?Z+]cy?]N?ں9?B} ?pZ,?$,B?o~Fv?L%?D}?h ?\ PH?YrT?A~(4?l?"Vմ? W?Xa?Dg8?gC?ԑNV?W!?_Ov`?nK)^?w|?%F ?ǩ'R?jv?(p^?M hsa?!?n:=p?"ա?7NQ?%;c?ʊ$ݬ?+?ˏ6Eȟ?ؽvfff?ɣ  H?Qj?"9X?ؼM?ffg3?ě? I@?b1&?81&?dP ?;ěD?vȴ?hr?AZnc??ex ě?0snM?fffI?X"Ф?]+333? ?t/H?L~?ڬ?H?#`(?NQ?T?P9X?h4?u\'?t ?ad?dC ?213??ӝ?$0?f`A?[ ?M}`As? ě?ԮQ? ĚN?%陙"?X~? 1(?9z\(?_ܬ1'?8Ia?\H`A? ?Ytj3q?Qhr?z?|?5=~?s\?_'RS?Z+?X4?W?ܮ?AH?G ?ق0 ?P?e0~?|C,a?8Kti?Ž?^⒣?ę"?ۖ{??u\(?̥zxs?]Mj(?p;L?BÎ?JEp?H_.H|?T\wl?㈅b?o?b? hr?@N#?9)ohD?=(o?1$?@!A [T?g@?;B?݁i??OX?i>B?7 =?љ|?p?EC?㚚?%qu}?;ȴ9X?,g?9?݆tS?y ?;^?؂;c?":??#?~RtE?̻GT?'?Ӂ?$sw?rn$?ⲉN:R?/q?R}V$?ґ5?{?Ϛ,>[?m??)Dg=K?z? j?a@?DڦL0?XGO?_ح?ΎQ2?/;f?6CA.?pěV?Û?&??m\?jb{;?eQ@?^{?b?KCn?Ct?+ ?_O ?xH? \j?3r0U1?n?s#:*? l?֩%F r?G_o(?>,?'>7+?8$/T?繞?p?K^Vz?j ?!^?֨ϩ?[ *?TzG?DI^0?[$tSj?K1'Z?ܱ!+?\(6?񳊗O^?\{J?&q??Ff?h?X(L?驩^n?_? rGD}? D1c?mKƧP?޹X`? ?Lj?A?7K?twkK?,>B?`3l?ffe?Y? 3?fA?7BZ?+?Q?DE?h*~"?_9hr ?lx ?*J?X4՘?43v? Yq.?‘?:){h?5o?Bt,5?ާ#S&?N IQD?NR?۝:G?}Wv?ؓv?/"3 ?p(?#t!+v?՜?_ح?q'{`?ڧm(?%?P?Kȴ9W?ؾě?6R;6?4mĤ?{?&$?s333?M* ?w =p&?ѷ/?$ x[?0O?N#F]?IJt?Vc!$?N<?TlC?ru?mB?Y~)%?̰?i,S?ِm]B?˅G?Xb?մxS?B?P-?p?l?[U?W?%fffz?F(K]?Ss?14<?,'/-?(?=3?ݗ ?̢-UP?[0?I333l?ӌzy6?F c?1ϧF?? |?C\x?]?{پ?Ѱv?r!? &?+hی(?4"h ?/b{?Qf?δ?9?ṉ~(?G$tJ?*m?TYb?ۗA [?m?+?۱V+^?ڢ@[$?FOv?Pp?aR^?.$ܶ?S}c?dܞj??}cg?r ?fH?ٮ(? ?4?Ո33332? Q.G?[/W?׆_o!?Ҳ Q?օ J?u?$bS?/j?DN?+ \?\H?(h Ռ?߀ ě+?A|?6+? ?. xz?_Xa?η =p?ͣ1'j?pפ?pO߉?Pěy?333?Dž?KO|?Tj ?,Tp?ݫG?il?@ě?B\Ͱ?.O? =p?tM?i?Զx?ɺ^3@?1-Q??1&?-p?1e/?7\(?:;dZ0?_5?}%?EƧ?e 333?L?j? }?%?.z?3 = ?L@r ?zl0?AO;_?T,/?_{T?. ķ?TM?+?l?]zG?[?赣Ƨ)?* I5?A^4??^;dZ?kx?u"?vȴ2?Y333?Y^Q?Gn?K"?th?'333H?YX_?Ȍ ?ת?Q냄?l?)UXbV?ԓ7K?,@bM_?\i?ɣz?\(g?BQ?dC?LdZ?Н\(?f*f?b?NS?fx?̸Y? ?ڿ:?׻G?1&?s331?dFQs?sti?Z?6KƩ`?333X?fff?5?}? l?m8}#?ħYJ>?Z^?񗧆?ɻT? ڹ(? (b?1=?r?Q`?HB7L?TTJy?\RT`??gC?QE?[ĵ?",ߔ?+U5?}B|?¯?ՆE* 1MeV @ 725km model OBJECT = 'Sun EUV ' / object observed COMPRESS= 'jpeg ' / (off,lzw,jpeg) on-board compression algorithm GSEZ_OBS= 3260687.32487 / [m] s/c Geocentric Solar Ecliptic Z PGA_OFFS= 59 / PGA offset DATASUM = '2176922697' / data unit checksum updated 2011-10-05T02:30:30 CREATOR = 'P2SW_PREP.PRO v1.3' / FITS creation software DTPLAR1 = 2000.0 / [s] predicted time to prev large angle rotationDTPLAR2 = 2000.0 / [s] predicted time to next large angle rotationREADRDIV= 0 / read-out rate divider GEOD_LON= 82.8116337307 / [deg] s/c sub-point longitude SWXCEN = 503.46 / [pixel] axis 1 location of solar center in lv0 LEVEL = 1 / data processing level SWYCEN = 517.61 / [pixel] axis 2 location of solar center in lv0 IS_PROC = 1 / on-board image processing LED_SEL = 'a ' / calibration LED selection TEMP1DET= -0.65 / [Celsius] detector temperature (SW HK T CF) CD2_1 = 0.0 / WCS coordinate description matrix GSEX_OBS= -802363.143401 / [m] s/c Geocentric Solar Ecliptic X CD2_2 = 3.16226783969 / WCS coordinate description matrix NPRESCR = 0 / # preserved pixels - cosmic rays NPRESLZW= 0 / # preserved pixels - LZW decorrelation CAP_MODE= 'CDS ' / (DS,CDS) capture mode TRANTIME= 993438825472.0 / [OBET] transferring time HASBLACK= 4 / HAS detector black level CTYPE2 = 'HPLT-TAN' / WCS axis Y CTYPE1 = 'HPLN-TAN' / WCS axis X EXPTIME = 10.0 / [s] commanded exposure time RECODING= 'fixed ' / (off,fixed,adaptive) on-board recoding CDELT1 = 32.3816226784256 / [arcsec] average pixel scale along axis 1 CDELT2 = 32.3816226784256 / [arcsec] average pixel scale along axis 2 P2_ROLL = 90.00505410709999 / [deg] s/c roll SWAVINT = 15.4684 / [DN/s] average intensity in calibrated image GEOD_LAT= 50.8624323792 / [deg] s/c sub-point geodetic latitude DATE-OBS= '2011-10-04T23:58:31.224' / UTC time of observation HEEZ_OBS= 3260687.32488 / [m] s/c Heliocentric Earth Ecliptic Z FILENAME= 'swap_lv1_20111004_235831.fits' / FITS filename INSTRUME= 'SWAP ' / instrument name PN = 131 / on-board priority number EACQTIME= 993438825472.0 / [OBET] end acquisition time HEEY_OBS= 6255916.82254 / [m] s/c Heliocentric Earth Ecliptic Y TTEMP1 = '2011-10-04T23:58:22.000' / UTC time of detector temp 1st sample TTEMP2 = '2011-10-04T23:58:52.000' / UTC time of detector temp 2nd sample OBS_MODE= 'Variable off-pointing' / sun_cen, fix_off, var_off, cme_track LANG_ROT= 0.7071067819 / commanded large angle rotation component LAST_ROW= 1024 / last read-out detector row FILE_TMR= 'swap_00993438825472_f1a90915.fits' / SWTMR filename LAST_COL= 1024 / last read-out detector column CHECKSUM= 'YZEZaYCYSYCYYYCY' / HDU checksum updated 2011-10-05T02:30:30 FILTER = 'Al ' / Aluminum filter LOS_ALT = 689898.6411679999 / [m] s/c LOS altitude (1000000=no atmosphere) OBSRVTRY= 'PROBA2 ' FIRSTCOL= 1 / first read-out detector column RECBIAS = 10 / recoding lower limit FIRSTROW= 1 / first read-out detector row CD1_2 = 0.0 / WCS coordinate description matrix CD1_1 = 3.16226783969 / WCS coordinate description matrix HGLT_OBS= 6.54354038558 / [deg] s/c heliographic latitude CUNIT1 = 'arcsec ' / WCS axis X units TEMPDARK= -0.674593319694 / [Celsius] temperature used in dark subtraction CUNIT2 = 'arcsec ' / WCS axis Y units ORIGIN = 'ROB ' / Royal Observatory of Belgium P2_Y0 = 0.00621535807393 / [deg] s/c pitch DATAMIN = 0.0 / minimum valid physical value ARTEFX = 'on ' / (off,on,cosmic rays) on-board artefact removal SOLAR_EP= 356.865170612 / [deg] s/c ecliptic North to solar North angle LED_POW = 'off ' / calibration LED power CRVAL2 = 0.0 / [arcsec] reference point WCS axis Y CRPIX1 = 50.5 / [pixel] reference point axis 1 CRPIX2 = 50.5 / [pixel] reference point axis 2 CRVAL1 = 0.0 / [arcsec] reference point WCS axis X TELESCOP= 'PROBA2 ' / satellite name WAVELNTH= 174 / [Angstrom] bandpass peak response LONPOLE = 180.0 / [deg] native longitude of the celestial pole TRAPPROT= 0.0 / [ct/cm^2/s] AP-8 MAX > 10MeV @ 725km model DATAMAX = 363.675 / maximum valid physical value HASSTDBY= 0 / HAS detector standby mode RSUN_ARC= 959.406763065 / [arcsec] photospheric solar radius WCSNAME = 'Helioprojective-cartesian' / aligned with solar North P2_X0 = 0.0037807148592 / [deg] s/c yaw GSEY_OBS= -6255916.82254 / [m] s/c Geocentric Solar Ecliptic Y HASOFFST= 11 / HAS detector offset level DATE = '2011-10-05T02:30:29' / UTC time of FITS file creation REBIN = 'off ' / on-board rebin (2x2 pixel average) SACQTIME= 993438596904.0 / [OBET] start acquisition time HGLN_OBS= 0.00247626951733 / [deg] s/c heliographic longitude FILE_RAW= 'BINSWAP201110042358440000419658PROCESSED' / raw telemetry filename LZWDECOR= 'off ' / LZW decorrelation CROTA2 = 0.0 / [deg] axis 2 to WCS rotation angle CROTA1 = 0.0 / [deg] axis 1 to WCS rotation angle PAV_ROT1= 0.0 / commanded paving rotation component 1 GEOD_ALT= 734855.288813 / [m] s/c WGS84 altitude PGA_GAIN= 1 / PGA gain TEMP2DET= -0.7299870000000001 / [Celsius] detector temperature (SW HK T CF) SIZCOMPI= 635104 / size of on-board compressed image WAVEUNIT= 'Angstrom' HEEX_OBS= 149633372630.0 / [m] s/c Heliocentric Earth Ecliptic X RECNUM = 3600 / recoding upper limit PAV_ROT0= 0.0 / commanded paving rotation component 0 DETECTOR= 'SWAP ' / HAS CMOS detector 1024x1024 pixels FILE_TAR= 'BINSWAP_5894_SVA1_2011.10.05T02.11.39.tar' / raw telemetry package BUNIT = 'DN/s/pixel' / unit of physical value COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT $Id: swap_fits_template 3732 2010-09-28 20:42:23Z bogdan $--------------COMMENT ------------------------------------------------------------------------COMMENT ----------------------------------------------------------This is a leveCOMMENT l-1 SWAP FITS file produced by p2sw_prep v1.3 at the Royal Observatory COMMENT of Belgium. If you have difficulty with this file or wish to make suggeCOMMENT stions for improvements, please contact the SWAP Instrument Team via emCOMMENT ail at swap_lyra@oma.be.------------------------------------------------COMMENT ------------------------ HISTORY SWTMR 147831SWEDG 147835FITSHEAD2STRUCT run at: Wed Oct 5 02:30:23 2011HISTORY p2sw_hdrchk v1.3 Computed detector temp.: -0.67459332 Celsiusp2sw_pmcdiHISTORY v v1.3 Reverted wrt swap_pmc_20100308_164500.fitsp2sw_pixrep v1.3 ReplHISTORY aced wrt swap_satcds_20100113_152800.fitsp2sw_drksub v1.3 Subtracted moHISTORY deled dark with coefficients inp2sw_drksub v1.3 swap_dark_coefs_201101HISTORY 01_000000.save usingp2sw_drksub v1.3 T=272.48 K, dt=10.0000 sp2sw_pmcrHISTORY ep v1.3 Reverted wrt swap_pmc_20100308_164500.fitsp2sw_ffcorr v1.3 FlaHISTORY t-field: swap_flatcds_20100308_164500.fitsp2sw_despike v1.3 Despiked atHISTORY the 6.0-sigma level (6797 pix)p2sw_imgcor v1.3 Image centred on solar HISTORY disk centrep2sw_imgcor v1.3 Image scaled to square pixelsp2sw_imgcor v1HISTORY .3 Image rotated to solar North upp2sw_expnorm v1.3 Exposure time normHISTORY alized data (DN/s/pixel) END ?HZV?zxm@?!-w?^ 1'Q?M:?Kl?"њ?ːK]?7z?"Y?ИbM?`=Ԃ? M>?țɺ^6(?S334E?2?Ücn?ג =? =?uo)Y?;/iDf?,b:)ǒ?пy*?ϯě!?͝J?{J#z?0RB?e?nV?vYJ?pXQ?"?TɆA?l ?֫1?lzH7?ԒzK:?D3?yŽ?~Ԉ?."?p?U2a{?(\?׉?ܵca@?,]p? ?2_L?ʎk?wmqz???|?C'A?ƺ\?i?Go?&ye+:??bTzG?{SϢ?r]p?]E?A<9X?aD?l?d?/ȴ9]?8h?(?- ?$htD?S?bM?G=p?? ۥS?W.?? ?ME8?|(?~vȴ9'?!Ͳ-R?izG?7vȿ?$-\?˅y?Z?3331??z^5??i*?/"=?\(??ҢMV1?ClC?z1?ׯhr?P׮z ?,/?⌕Q?*=p?h9X#?ޗ ?f-??M?c ^5?;?E?ܓmpՎ?+e?/?SE?Vaf?NC{J"?W|푎?Ǐ)ԕ?$zG?ML_D?C%?,V??ۃg? ~?sE"?ɓ h?5]?| U"?h?,\(?:)?ՎE8N?cFI?=p?Ӥ73?$!?4mG?_IYL?Ƨ?Π?ђ5?}P?Y?͞?Mp?ÔrF?w1? T?N;?o;dY?YLC,,?Ѻ0U1?qml?[/W$?||?hr?P3n?Վhr?؛W>5?6?h?çG5?nH?ղ?fXy.?hb IX? \(?ۼ&?ۜ<?Jwj??t?Mc?֢5S&?iBT?Ф0{?؊^5?j??yP?ׁt?k/V?Ɉ x?Ѿ_o?PH ?ܬ)^??w?ז4g?Y"w?~? (u$?qL?Qy ?D>҈H? ?SyA [?ӛߝ-*?UA [?ܭtN?ۄf&?|3?י?#?|SS?Yl?! ?ě?㇗暃?4!-?f7K?z?ȰP?߳ k?)?!?EQ?J?!?'RT\?3tj|?gA?%Fs?U~(?{J#9?Ώ\(?HW?=8}?]cet? /͞?_\(?۰?z?ސ?땁? =n?ӥ ?_oB?4m?M5X?Z?p;,?;5?P?4M?Ձ =?6JV?בP?&C?i[?iw =p?zm?2T?dN1?Զ"?=p?v ^?/o? )^?4-??RlC?`/V?-ᰅ?$`dS? =r\4? _O ~? "? Z?i*0U1?mn0?a-w1.?6p?.Pm??H;?րH?3ן?R<5F?8ښ?@+?Q=p?OQ?!fff4?٤tZP?ԡI?ٸ6J?Ч333?n?OO ??V?LG$tS?س&?FV?C3 =`?3Mj)?,?-?cp?XH?߾vȜ?_ ~,?{$?j~?6T`?"nZ?ۊڹY?TwkN? l9?U--?M =P?ԉ ?v! k?CzG?C\?'R\?Ӱzu?;C?1?! k?@`d?m I?ru+?l/>?&??|?؃s#?d?\ja?Vȴ8?CIQ?cA?|C]e?r m?Q{C?〫?́@?0Xy=?>zn?qe?eC,?ͣxl"jH?Rva?:Qx?C*0?6+k?Љы?o2#?ٯZ?V?JMp?z@;?$? \?m[j?ԣA7K?Cnz'?Q[W>>?.L?ө*0x?޿ ڹ?Я?=8?ظ\?ru%F2? ?QBZ?0<?Z?r ?LgX?^t?4K?(~vȴ/?LB I_?1?ʵ ěp?hG?@l@?9&x?jG?8;dq?ͮtj~?8ON? dt?fff?u5?|?E?Z?f2M?̽p(?v ě? ~vȵ?0P`A?5';d?ӋX?ؿ?Nvx?Xq?TI+(?L(?ܾAhr?L =?zP?b S?ۊB\)L?$?⌅hr?4nfff?W(?֞333*?%;dY?eStj~?bM? 1'?}Q?S?歬1&?uXa?絠A6?G?JG ?KƧ?KC?slS??hr?P\(?4Q?$?zG?^ļj~H?ӹ7K?r ?ތS?̴?5?|?U^5??O`?l\?%pא?v?9W?ڼV?ๆQ?bG?-r ?-V?xQ.?ȴ8z?.Q?$/?ߊ$?e:^5>?K5?ģ @W?ԯŽ?ȵz?1Xbn?+ ? @?\(?\)B?YD/A?i?5TzC0?ʻ?Ӷhr}?ȞS~?56ȴ8?!-w@?9#?ԱQ?#xG?惛xF?Eoi?$tѶ?u<6?个g?]\??υO&?c@?15?f? S?oY?C9?N+j?.x?"-V?_2?ً\S?ߐ?< *l?ިz?^E?|?b?- ?۹y?e߰? <:?͞??\)?C# ?i5<6?]~ȴ9l?"#9?`PH?n?溵+A?p馵 "?~?4GR?Le?Ii ?5Ͳ-?Va??H? G?K]?ᏹᰉ?}?`4n:?-?ٽL?;9߻??!ru?Cm4?ەi7KƠ?. LW?c?FN;;?"u%E?X1&?r,I?@M?:g?OVk?y0ě?4<? Il?ҳg?GǮz?[cY?1[W>?ݾ|?39=}?Z?M;E?:0?*Ov` ? ?Yԕ$?M쿫?@$?ּ5+I?j?Ҽx? Ǯz?wZ?ɜԯO (?R,z?Fs?y\q ?мxp?Xz?jm?G]S?၁$@??'kp?ԙ܋Ch?簚kP?`bM??}(?I]?a;"?蠆YJ$?ݘ{?;5?=fA?| ě??=t/?޵XF܇?پ Im?XjF?`Q+5?C?ޅp??%F ?߳ B?ݱ?΍ ?Ԣ3?Gf쿱{?ɝq??nS*0?nXYJ?s??V?C\?ق 'RT1?N_?ΗO?9_\(?O=p?ޮ,?~z?ʼ?ɶ# =o?ݜ3333?z?ըG?Q޸Q?33333(??fff?ճ0?:=p?6H 1?q%Q?틅4?֮fff|?Q+?+?z?z_?fffr?߯# =?Q?>{G? ??:\(?m Gf?@?Ǯz?aAu?Nfff`?p\B?,?dzG?f`?K?f?~Q?rQ?]o333"?L(’? =x? =pr?VH?!K333D?b\(?O?p\*?=p?h?cz?jz?G??޴k?\\(?ޱ`?곬̳?7NzJ?fh?^fff? 333?TzG?5?+332?œ(€?aAG@?D?/ =p?=i?fff@?Ú=p?O =T?%QL?zᙙx?إzG?ȲNzQ(?spװ?6fff?vffd?|Q?‚\(?fnz?y$ x?.64?ʎv?V(?B?&Hۋ^?a7?yGn?( ԕ3?u%F?Qf ?@N??KVs~?c?r<6V?⩓ ?SS333(?M878?-uX?TO?ҦL/w?5?|?Վa?s?eEb?X ?'h? M?x[?SDh?5?vȴ?? q ?U?M+Q?> =?Q?qjO?Zcy?R5?<M?yOQ?kߜ???|?s' =E?GD?M??47?>,7?Շ?a/@?Ros?akh?߈'RT?*#?Iau?P.?5(?Wo ?R?P?a*?ZFs?@N0??|?B6?u}H?7ZxH?\4?X" %? J@?_ح?Oq$^?R|?b-U?o{K?m?o?Z>?ْ_/?\_:?sB?DL?">A?mzGM?_2rV?ϲ&6?ֻ{?Zfffe`?ڰ ?Uqu?VlV?@U2am? ʦL-?ا?̯v4?=p?۬h4? a:?=V?p- ??jN5?} ?똤?4n??Edt?BH?nߤ@?g*C\v?N>E?q ?Eʍ?1e+?݋C?=uE?Ǿv? /?G?՝oh?b}T?Чhے?"?c?r=p?:?LA S?dO;?b?PP?~(#?T?9W?%#??;e? =?FM?Nz?Pbڹt?;RT`@ZD? +@y '@pg@?r!R?$Il?hNs?SK?ABu%Fl?SH? I?q[;?mg"b?}H{?RT`?i \?/V?ÀW?`t1'a?H?/$?${J#F?qi?J \?ٵ4^?gr?'m?.a|?☱hr?;5?5p?Fe>?ߖY"?H₤?~YJ?`A:?u?I5X]?*Fs?r-V:?۵E\8?y**?ԁϪ?ծ1g?Ifϸ?܋C?Ւn?Z7M?Нp:?w Ԕ?ow?ϱ[W=?G(?U2a|??⊦ (?d?Ә/?Y֞?`A?D?-픯N?У @?312?X"d?b!z?# ޴?=p?a?k̾? Ԕ?;f?uz\?{xF?$t?Q|?5?|?EXb(?{?T~?2#9?+?u)G? ?\ѷt?F*0M?iI?? y=t?A7*?-@^5?@G@Y{J @aF]a@I[W>@4sl@ N/<@b@-@.H@@@ě@ME@v>6?KV,<@Mxc ?h`@1Bm?LL^?, ԕ3?ݗG?@8- @L@&@!Q@2^5?}@PxF@ G[W>@ mL~@ +z(\@FI8}@=pf?JNL/r?d0?.=p?8#?xҦ?U?l!@?$(7?߰*0f?l?0'RU?j?䲝- ?H m ?z?Dǵ?3j[?ٮ{ ?8Eoh?ۚ?B2?4D?Ղ;dZ ? m\?R<>k?xoiC?1???ڢu2?eA7C? :G?Eʬ?'TɅ?Z^[?e?k^?ʬ7?n6z?A7B?nfffh?C\?YA?SlS?ᰉ?dn?hz?Z?n?@?x+?$[&?#?e4PH?Kz?=@GE8@Wb@ fTɅ@ilC@zv4@Og@$*G@1Wf7@5LUf?@8 p@De@Cp@A@G6@AJ=p@<@<(zZ@4Ā@5~($@3@7ȳ33/@8b@46V@:)i9@De@4(׍O@23=Vl@@Q1?jE?9Xg?U0 ?vL?t?w\(?fG+j???c+j7?#.]cM?Ձ%?u/?ژu=?a^?iR? =p?ge?~1? 'RSv? C :bM@3ីQ@?vG@8*G@?0^5@@E!G@@Qa7T@8hp@<0z@8"M@=i7j~@C^ I@C @3g330@61;di@;Z Ī@=O@@e)@B xQ@CV@@3@:^Q@=qIW@9 @3(=F@0k5?|@*S5?x@@Fa|@F@BQ(@A ,(ˑ@?L@BY@6~@!/]/@ڍON@ @O@8U@ J#9@ob@MXba@ q ? $tSt?ֆF?V>1"??]ɽ?oU?qiv??-}H? Gr?ce?^j}L?!?Гw?Cp?цʒ?~(#$?ƏTQ?tKQ?R??UVl?gUF t?Ƨ?ʄ2W?i#9?yQN;?T/?(X1'?原1?sM?Փ? I?R\(?{?/]d ?OOI@N@Ez5?|@Fs@1*@_q@ F-@n@ 5@N@3E(r(@2r_v@JlC@]&cx@RBZ@L\WX@CXo@EjJ#7@;S\(@8H~@9@_!-o@21&@<9үh@1񘭑ht@A>s@@n@CX*5@?rn@B@kě@Gg%F @C/"@A:u$@A?@G>"]@Du@@#6_ؗ@B?~(@?a74u@A>|@BA _[V@>m޸Q@?2Uf8@BRe@G;b\(@DWa@E'J@EUFP@Hf@Q4gO@E=~oi/@=]_!-u@2[ @')\@"@f@]$@vaG@ݘ @s@UOZ@KdZ@辶 ?s?1qi?Ų-;? y=?9C,?鋛xF?VQw?l?(K]O?K?@n.W?*?rVU?Yr? 5?G>6B?ۧ_?Z?yrw?I?tA7K?ζ?s84P?6uYЇ?+p?\) ?8?_ ?6&? 쿟?EG ?P'8?4nL?؋F]d?Țu0?܏b?țS?~@F?mᰉ@UpI^4@ JD@ {@ A(@ۇiY@lbM@%=xl<@8:C[@Cn/@[,V @R+f@Hȴ(@@ ?`A@8&h@F,5ԯO@@G@2A S@7@?$@6k.-@?Q@AVC@D@Epn;8@GXy@F!2-S@EP(@DXa [@?yZ]@ATeσ{N@H"@@,c1@9sOvk@<0al@<ʧ&@@*33 @=_%@DStQ2@Ap,@AD@BhW =n@=A:@Dzi@>Ίq@>oh@Fv@ZĀ@L6v@@ q{@4}Q@.5`L@)u!@$ԉe@!@q%@HQ{@t^5K@ @kEʾ?v0?C,? 2?Vh`d?󣅅o?L`d?"\(?'??m84?R3?(l"h?bL?\zH8?אz? pd??;C`?(C ? #??vn?ng?332?z^5??334u?h5?|?^5?~?KƧ?ȟKƨ?333?\?(j#7?򳶗P?PhbO?I\(?,A7w?S;dZ@WS@x1&r@ G@ ~{ @E@  I@!Xd@(? =p@2+f?|@E+cS@WPt@O{K ;@NW@N1 U@@D wKƶ@BX'@B9@2fffa@4@O@@fD@5A;df@;:S@AIG@Bf9 F@EߗO@KYXi@Ke:@L@Hm@Ehv@@15@@@:l@;K@7~@<yKƦ@9@8p;@C,R@@wg@C]y@?te@J@5NƧ@6Kƭ@7:@:'$te@Cz\@EJ@UJFE@M19X/@A@7|Ǯ@/clC@%=r'@#H9a@ "@ (Ž@bM@9+@7Xa@Ctj@#Q? =p?cp&?W5?|?S??'=p?Ɓ7K&?v+?[?רpշ?m/s?E|?̘l,?˯j~?U]0?)ش9Z?̰h$ z3?ٸ~?⃵Xx?MfB?Ȓg?Fs?l*@G@F( @8: @G9OS@>a̘_F@2\(@;ɧRTn@:1$.@;jZ@Gu@GB@G?1e@K`[@AZ4֚@LG@ORu@VNL_@OQA @G@{J/@E%i@@Ap`8@AT}@; t@3q@:/@@:ui@Aچ2ׇ@A9S@:~6{@:yhr'@8ffp@7OY@3H'Q@/ 8:@2jC%@:|(@@¬~($@?B[@QFc{I@NA:@AمT@4  @,p [@)wZn@#f1@ؙXb<@w-&@v˒:-@ ,tS@NTT@&x?_o?Qx?,/i?w?_}?a?N7?䦇+?Ԃd|?޸Q8?2?ᓗ!-w?cC,?OX?FS??[9?1҈^?ԃ`?pSخ?3h?J7@?d!7?I"?ܾ?>C\?Z9!h?\҈?C?FP?E`,?P64&?I^:@^5?@3F]c@lM@,<@YC,@0t@vVEʼ@!i >@+*@6vFX@H}G@Sp8?>=@E8l"s@C6,@B.'ݖ@=]"@GW+e@OZh9U@aB xl@:+B@A/@I>U@G 7@Q3.~Z@P O@H$X-W@KXy=@Ihq@Iku@U?7v_@Xx@]@SN͞@JϪ@@@6]b@8^:Lz@@q|6.@;_&L/@G5;=@D3z;W@?m\@;@>Y`@Alx@6j,p@.5kP@2P"e@6--w"@7p@5Mz@@)@Gg\@Dc+C;@P_@KS@A&L/@:7G@2>4e@&@ʣm@g,:@hQ;@s0 @IbX? r ?.\? 6?Av?<{wR?أ 6?N;*?fA>?"e,R?Q?ctj?&₾?7 ?O#M?iDf?ᩓ?DIk?' k?+?OE+?;"?C@?k?=p?" ?h6Fp?zG?4qTɅ?Qx?\7@(iB?&g?״3@Ƨ@S$ x@?|@m@T`^@0΍O<@}Vl@)gW@4 =~@CC,T9X@W%[@P$Y滘@ME8@C6^\@B!.ߞ@APȴ6@Ah҈@@+u2a@Se@G0 `Az@Iwȿ@Q`>X&@`f؆YK@cSs@^[3\n@Kl1&@W#V5?|@Qݗ$tX@U` >}Y@cS~@hxy@cA I@`U)@^20@E[@7&ږ@2!-@4:@@Y~+@8GA.@7^b/@9W@:5 =p@5@;@8\\(@2iD@@^Tl"i@G$}@E@:@11@W^?ڎ??j~?؛Mj?U2a{?ě ?=aN;? s h?k?hr7?!vȴ9H?j?uf+j?z0"?<n:?nfffg?fff}@ @\ݗ@>@ `A@@ ϭ @YW@ϟ I@S@MƧ@#NrGE<@0`A@ApD@UCR `A@G_;dU@HW:p@Tc6z@@uY@:2V@81W =q@B;F@A`y=ـ@YW>3@Ql|wn@T%L@Mzxg@[ Ն@aor @^",;@PhyY@Qs @a;@^SCI2@aַJ@VL1&@T,x@K|@@6}U@4oo W@/`A@D"g@0,@4ViB@;PO@4PCև+@6PPj@8\LLy@7gۋ@B2(@@0 o\(@5 I@1z>@=m`@?5@>_@9~%@AZ^5C@@ M(@I2J3 @IG!`f@Xs9aB@K?j~@@ \j~@1kO')@(F~@5m\@ól"h @) (@j4m@ =S@"7X@? @Z9X?r ?BzD?鄈?Ƨ?jL0?G5j?εD?hYJ?XYJ?j6v?hEv?qd?#XQ@?o\(?z=p?!US?9^5O?ׯKƨ,?𐁡?!fffY?ěM?/lhy?x??fff^@&@=p@A333U@m =x@V\(@vȴ<@Sm^5?z@:n@g]|q@"g337@+@:Ƨ@QkT1.@Lh^vȠ@F-h@Hh-c@Gup@BVh-@:01"@B @CDR@L@QӘV@[ 4jv@]S33.@AD@J @WC@`+U`AN@Rz+ <@Mل/@Av a@7u !G @1|XA7P@/ֳ33@:9nz@8S@3Z@4bP@/B\>@2{l@>~G@1E*@1=p@1dB\@67=ٙ@0kꯝ*@5tq@.+@1{ffd@3kʻdZ@@9X@7K%`A@4$ ^3@Affq@=2@>//@>9K@GV@GXffh@H6C|@W @GZ@@Jƨ.!8@Dv'@P ~@QW@E|@O0l%F@ER4LC@Hx^=@P6r"@Bv^vȺ@Eue+@\a+ .@^5h9@d@cz1@ScV@TP1&@6fp6@?ji@;3@@vD @07;X@ =p@70U=@2AϠ@2<4!'@@ҥʾ@Ry@5Ba|@6݃0@<͔i@2s5h@10@3X0U=@-*D2P@3x6!@:@+kP@:u*0t@6X_ @L .@B`+޸Q@7pe@H@=Ik@@svFj@EBeI@HUα*@MoR9@Rᦵ@A/\(@7 (r@1>Zi@(.Eg8 @ A@N@1#@ h Ԗ@َMt@: V?+Y?xNQ?_o"?@k?+\(?쿱?hr?ɂ _?iȿ?j?%n ?zG?&h?F\?x+?Dg8? <6)?"a|? N? V?3.iB?MjN?9;q.?["e@Sv(‰@ 6@ ")^@J@l˾ߤ6@"}M@(qu@0W0@4ƨ @6fW@8&\4@@fX@ZQ֤@T&6@J\#@H st@ZzTV@U0ȝIM@L;ܡu@Fzn}V@Jap-1@Ty:c@N +Ƨ@TF^B[@By,@L#ć\@^[zg@BMLc@J`Fs@Tx1@5Na|@*c~<6@6J@G/@PG.c@M(²@"3 =t@=煰oiO@:H_@5F]m@6I|j@9oU&@3`PA/@2m\@.Q@>7HK@@!G@Dȝ}k@6$=@1'($ l@:˕@62@C+@5W_䎊n@H׬@Hg B@H|U !@=_!-i@E[W@?4@B7F@F_@By=@YCe@H#Dg8!@;Knz@2@,14O@$s-[@6Mj@v@Q܇+@ LR@*X($ K@/T ?z=p?-U? ԕ?U?cjg?/lo?/暚?͂?~(w?WV?y?ჭڹ?_r?g?&1?հ/?4p|?a?u^5W?A ?^ ?ohۋ?]c@V@0U2e@>BZ@TdZ@L@#+$3@,c\(@5#@?,8@G~@L>vȦ@UO(@Q@Le(@RZ I@^ffft@o7<@c)8@X%09@GVϲ@Dz I@?*a|@= !@BF@Sݞ@B =}@8~@=,c@?y"@J߉^+@9iui@2b*@16z@HϝY@F}p@9@)8 (@1ǚF@-7@82 ?@357KƧ@5@)f3@2 g@:^@=`MO4@@yo/@BV@1 y<@5{9A@=" @4j'@> Yb@31 =p@CT=V@D-O,@Jw&) @Iv_@=pF ^@A&@D z@;X>!@FjJ0@R/ſ$x@S0ہ&o@@TzA@5Bc|@,LQ@#-v}Vl@ ^@Pvȟ@C"M@xt@nux?+2L?=p?/<6?A ?{6?⟻/@?У ?T;8?.ݗ?X)_,?3Fs?wpA6?OCZ? ?z?ꔌm2?T(@X!-w9@#o49X@,2ɢ3@5).@A=QlH@L^e+@XX웥@[05w1@V~n@XXNWo@R]JkP@SNx@sw z@f@e 8_@Lj<@: A-@(w@.}\-w1@Ay˥8.@;ɅN!Y@;@Az@5 n6@@<$%@9A@*B\@(b+U@+~@-lK)^@.!kqq@3vv@;a@0Pv*@9RkQ@@S/@2)3ny@%$/@. ȴ93@,Ufi@3c{@38n@7ļ I@49W@143@0Zj@(ٲk@1D+f@.ڲ@+ [UfN@=>@6z3@@;@L_@GdZ@?ux4@7}49X@=@i@Q2e0oi?@I@RAx˟@Il\(@;#v!@.UzG@'@ tZv"@ "9@? @@4?N֡a?K?XXy=? tjF?E#T6?&_خ ?BK0?hE!?Fޮ}UF? :?Ae1? b`?u\(?X?333334?늺=p?(?zH?p\(?? ?3332?Q&\(?FzC@@@2@Q@I\'@хR@zG@$lR@+yQ@4 ^Q@?p@J) =p@WY@_K @\H >@ZzI@Hp@g58Vffi@fٜ@cօQ@affff@Qdc@.@475]@,\$@Bh‘@Fܙ@>P(@5^ٙ@0h@*.k@>wc 9@-pk@.Dz33@ @#`zE@8/xQ@A>(@S{B@4Yxz@'z@% I@%M̵@5&ff@;b# ;@=B\@6z@- @7f@@,,z@=\(@8&=p@4zG@7R&ff]@A1Uc@CXQn@F ^@@Dzz]@QB@ER’@U"a@OzH@F3\@R V@D@|(@6@@*5=@fffa@<̼@ օ333@Q$@%W?j\(?fh?(}?\(?:\(?nz?٣332?!G? ??G\({?\(w?”w?'N;?m=/?O?8? ?+k?c}? ޱ?9;dZ?wiDg.?~?PQ?Nح@[z@ hۍ@ zy=ٜ@2b@]_@#V@-)*0Z@6j8Y@B@<@PM|C,@`V`n@bJLC,@ay@X-&@Us "@W|-c@ipy@ew@fAƫ6@VuB@JN U@/½N@:K|#@46M@D/n@GibTzB@V 6ߤH@N5 @G%@E*Wh@5@38h-V@+}Vl@0) @0j͞@+A9X$@$+k@~($@.X#@-8z@15?x@9ˁ|@(YK@"Nw@.\A T@6݁7G@.J:݋@=r@9v@>JK@=ظQ@@7,<@;Xt@3(ԥ@5->P@1hB# X@.L(Xyq@2P)@A״'@;?l[W-@>>vȵ@Dmz@? IQ@Rr @Gd1@SsA^=@GN_d@6pңF@'1l8@1*0T@@ ߛ@Gq @?jb?F!E? =p?HN?J#9?Ú͞3?ï?b~i?͂䎊9?J ?H?3tL?bM?ӳ@N?M"?}!*?z+h?X=Y?􉶤^?ڽy?@?r$/)?~p*?pJ?3?*@s?@=p@ ȴ9H@84@tj_@ %\K@(o|A@0Q X@;/~a@E?@T5OFvȵ@YtfQ@aM@b#@b@a@`I@V0(1&@S?{_o1@`:7P@Z1@IC@@AQ-@BF@B0x4֡@4H@KDK]@Q` @hDXC@NDbwl@[Q@[n [@J;^@4Zm d@2@1Z@-@ &i 7K@!kW =@)l'RTY@,<8!R@ | =g@'abT@)}u@)\M@0S` f@(ϴ\@3-?|@7(@6@?kD%@-ac@3@6Y0 @Lv;@BIu?|@7T&5@,I\(@3 eNp;1@2I^@']/n@8x ^H@<%}p@Fx_>@G;@DJn@PPFs@G @K*8@:Mν@+4{h @!8d@ =p@ >p:@t @z[$?A[@J}p?6Pu{? Kb?GdZx?Y^5??: I]?@2nn@4M%@/ο*@5ܽH@EhK]@41&v@>@Bě@8@Dt$5@G@S-w_@BӼR@7:Y\@(r+/@.@ᰈ@ ؆YK@ @@&FG3@ };?1'?kMj>?1E|?j~?9'Q?Y{I,?T`c?Fs?1'?(?kC? _حU?IG&?2W`?r$L2?D?۷j@? .\(@ŨXyR@"n~($$?8B @0 K.@1AC @3z&1@8,.c@4NiDk@*J6ٳЂ@.8;dZ@'-nl@YnZcN@.My=m@#7(@#z#cS@F@@XJA@@"Э@, J@-*0@#UQ@%;R#9@.iHK]@3p 0@4ڀIH@4ݹXK@1RcS@?өy@Bl@B|RyZ@9-p@7#_?@>0Xb@4Qhr@Aqа~@Ep@ErUs@B9@G8y"@Q- @KzZn@;܍1@.'Y>@ _}Q@F|푆@툵Q@'@R@ | I@ @bE?9XZ@XJ?P*0u?^?H?·o?t2Z?磍="?Y9X?D#8?У %?gz?G?[*?/??>f?2Xbz?%@$@*@&o'@`Ɵv@ fffh@^n@(Ut@75+@"`C@%.z:@3@Bvȼ@WX4+@pxZ-\@W6>s336@U׷@]nx@^ä/$@Y@Um$z[@WB%`Aw@?~@.%S@2O;d@0G@+2\(@+7޺^5M@& @-1 T@*뙙@1[@;_~@6FzQ@8"M*@0:nz@3*w,1'@/1^V@/CE@2,$@2|\(@1f߾v@2}b[@!e0@ I@G@ E@7K@'(@^5@p:@-7ě@7O;j@#AA@#fffe@0@4Õ@6QFbM@3h^'@8\nz@A =w@NZ@G6t@G)x@B<@>Ԯz@8{mU"@@4Z@Ecp@F#b @A\(@HQ@R5p@@hr@0{V@$|Q@&^5@rх]@ޚKƧ@\j~@333:@ Z @ԟv@* I_?7L8?o =?:E?ȴ9?}- J? &y8?"Ϯz?}O;?7KƧ?>B]?n?ʞ-V ?%0?@/#9@"bM@+@cA@~:)Dž@,?@p @ He@~ce@ $qu@$?@+фV+@5- @EX@Z`PR@U[~@Ul@XEu\@^G䎊@Dbu%G@9hۅ@Qě@C`eZ;@8b*g@.K]@0iKrGF@0p@3fbM@.N.}Vr@(̖Ow@/EW@' Q@8Ĩ\v @5Q3]/@L.C@@q@1*sh@8du>@3Ca?@29}<6@=yf@;G8Q@2@9ߤ@@,rC@. O/@2F$&@!x A@"v@"'5u@$᭣S=@)\@ h @&Cj~@0vȠ@>BZ@>GǮz@0tɺ^5@09т@19Qݗ@B{ᰊ@E<-V@E-8y=@Cὥ @C@L@@D2{@6w1u @E]IQ@E){@OA [@Sg@Ni<(@YBV@E1@4;f@)2=p@ YZc@J79@ @|>I@ȣ =o@Dx@DelCv@rN?ta@?b7"?'?rC,?蛹n?^5k?S1?> ?H ?>2Ϫ?4(˜?mF}Vl?rc?M?q6?7K@,z}@A@i$/$@傩@Gx@zxl@s|@!:&ⶮ|@'ffi@0]zK@:l1&@P^S@`n@QU @Q_@S;d$@Kk8F@Bwo2@4S&@Chh_@<óa@4bM@86ϐ@4xsg@.Zn@7U@(+? @76!W@46/@3@@3_b@2e+@@OC@;pS@4ݲ-@39 k@LC@/@0@NzH@A7L@ *L/@b8p:@h?-?,m?,=?7?^}m?7$0?AyB?~?%?n.?\9X[?Ov-??(C,Q?Z@vlZ@&C\@^Jě@EA,@a? @z 4@ Z G@>=a@ Tɂ@)@@6Ǯx@D@e+@S)ߡZ@^>:@OI@@O&x@LTA \@EJS@;bU@63@5t9X@2G@:L@8%GE6@8y=@2eʻ@/YCY@0*Q u@3m u@*- k@1bQ"@43=@;!Zg@9*k@H8*@>X@16҈@=ܬ5@@%{@5>J=p@5譝-@:r@<@N@2xw1@2qi@*@&@릀Q@*f4@0ihr@&?^@"e`A@#nj~@,_{L^@#3ҽ)@ @J@QS0@M @q@+kAQ@6gn@B@T@YʒVշ@OCA5@Mi;db@Hz,@BIi@A؂@8N AH@8d\yX_@9Ʌm@=1=ِ@9&@3p@0R"Kƭ@1*r{@6)^ ě@7"g@#^ѵ@4🂏\ @6go@7$P@:@@;p'~@7d㴼j@C^҈@@e"\2@FXFs@4os$%@6m&@75<@=E r@1n6@%v`W@*A]/@0q^Ѭ@-n0@3ʦL @3n6@0 O@@+[:@$䣶@,_@-J@*NzT@.@.Ei@8=>%`A@@@)a@?nz@A!F@F{@Iy[`@Fz@Ly@H&h @EW(@D@E ߤ>@L0v@GA9@Y$&@My@?)}Lg@8벰 @3۞̲@+tB&@#V@D@Qp@Z:A@2@7@#lCu??n=?BR<9?=?t]c?ߝ-I?[W=?n?: If?fff?#??Lr ?*~@?5@;\@27K@ ?|@ s@-*Q@/@zg@*`O;m@7Q@Dj"^@S_KƩ@T|l@M=n@L<(@EH5C@Cg@Et4@A]I@Cb:G@?|h@BKƮ@P`5@Eփf@P5\@VI@T0&@Q eT@HFffH@B@6i*~@.,1U@"A/@֍I^3@4{@pȴ9`@ԭz@ ,"@F+?Q?7/?;dZ_?@ěK?AW|?-\I?W5?|?ԧ =p?␀҈?eQ?@?\?`|e%?£6@ ;dp@y@v*@Q c@ `7@ @ IcI@IQ@=p@0r{X@7q_@GﰧE8@VҰ#@UZ@N>@K/K@Ea@C,9>C@I)@Jie@GP(5?w@F]ҬT@@p 0@< ~( @< s@2ۣ(@4L@1]Vp;@FG@BiTz@/!WQ|@(ЭJ@0/(( @3l6c7@1WVqu@4dZ@>&x@60@)y{@*ix@33+@5)X!@(~"3@-@[6@) 6E@% @-N@7y=@*;Xa@1/OF@5>_;d:@5y=@7鬶}+@6{0@2ZCST@V&`Q@NCnMF@DVp`,@9eOͧ@,ƅ@$%!@ 3@F3338@lk5R@}e#@l*@*bߤ?@7Kƨ?!-w?X?tS?7C ?*?~(?z@"?Ce?̝V?74`d?<$h?~ѷ"??/@ ԕ@ C@ 3 @,zz@ &Q@a4@0 @+@'Z@3:bc@BD~6y@T-@V* -@OÜ@N. F@E0%m\@AS@K65@JUa@FZG@B` f@H1@@L`H@<_@:V/@2a!G@.۽@@4/@9M@=וzP@3@1$O@6 "G@9$H@2V_ȴ5@#PG>@0:SN@4W5@>hXPM@2/)T@9UϪ@2N@.(Vl"@3VhS"@-Iɺ^8@;A(K]i@.ѿ@5MI ,@8N~@3F@Av@J%"@@{wv_ط@4cU*@@j=p@8!3@5$@; K]@B "\2@H+@N&AG@E^@Er@GAkJg@BF@K^ţn@B\@9h\*@?K_o@F9S@Hi1LIZ@EM ᰊ@XUd@U+ahr@GJ@5=@-k@%'@"BI@zG@U@N@$1dZ@0YJ@?a#@\(?Y8?gJ#9b?SRT`'?gb? TN?n.?ޟ&+%?P{?<5?|?-ݗ?Q?s?LT?IM@u@@v4g@ s\@ @lG@l[W>@X*0T@y @)Z)q@3Tr @?U͞@Pz(+@R hn@M6+j@J{l@FX@CWT`@CGP@GF@K#O3@DiW@Cª x@D@DH~ (@:@9g1@2["IU@0ڄ_o@4Pj0@2w;nz@:J@=H@@(۷Kƨ@3>ě@+v @60U.@16+j@8QN4@/N/@+|@/E8.@=ą@4|k6z@:0#~@@l@KW4m@DOn_}@=+~\@B=_@03P"@:t<@2v4@>n`@84֢@Gly@@8}@8sMj@A+7C@B @F p@Dhu@B^J@H{@X@9@Mtj@QnGe+@DM>B]@?rp]@?흣e@< oDN@Bm[l@G=jD&@]u[WI@R}@>cS@4n5@0j˒=@(R@$#9@!G@O@ Dg8@ZOvS@e@@&$@@oiD[?#R?_G'?^50?TɆ?64 ?dW-P?hc?|RѬ?<?a+q ?a?@@CZ@ Ǯz@ ۜȴ9\@Oݗ@BGr@;@rO N@ @'^_n@4kA<@@Y+:,=@Q9CD9X@X`JG@O@N͢ I@H;O@F66z @@wm@D>m\@Hv]/@E&@AsNN@@lc?@Euhی@BC=/@;m쥮(@6%F@7TP@8,',@9 \(@2ou@6'@@?Y@3/c:G@;^A r@Jq]W@:I8Q@F9A@>׍O@=߈x0@V7d@Q!B@XrNE@` APt@Q{,#@H>x7@C\/V@Kh--ON@AIRxQ@9 @2t5?@D$@G俾w@:(@+="@)h{(ˆ@2b`A@>n(@65 fff\@4кG@6XTzB@D5@4no)m@<bOw@?^\(@>vQZ@Ck*%@@gJ~@BtƧ@I-Kp@PsR @R? =*@9(-@Ab̝@=Ȋ=p@05gn@-E /@&?i`A@$%M\.@0cffi@*glO@?RO\(@DOE@DV2 @A^@Go!]p@`&(@l0Q2@V@cB7\)#@]|{@R @FQhS@@H|(@8°@Fd1wP@^$Q@W\(@HP_@E 'X@8M73@2@*3Hɺ^<@"U,@fffl@Vfff]@W@ׯ;ds@C\@332?(?*Q,?z ?I?̍?Gj~?aS&?݁$?I"?B#9?fjVt?fA@Ǭ:)}@M|@{@6 @ @[c@b@@ n@" {T,<@&т@.¢@5uD@I]g8@\! U@LVǮߣ@LldZ"@L{-:@GewS&@F q@T`x\(@L|H1@Cй5@F Q5@@(~iO@A;@37V@=(@9hۀ@A4vO@3iu@<ާ =a@&@/?@Bc8@2- @:b\)@; ^@822@?Kt@B'p|@:yz@N4 .@F*@A1Kj@Erd@Azgl[@\Bn@Hjᰉ@Or- @a勖_L@D<,0@36iy@0hXyo@2/@:)33@@9\J=p@:L@BT҂@V4j@jMw1]@Y) @JbL8@[$>]@jz@[Ub@gAdY@\nex@^ےX@M)@HC!@Z@AGp@X,֫6zb@g@R]~@OC@BaO@>_@1o!@*7g@"DRx@̼z@ }>@G@# ['@!ޯO @333=@iU^5@,q Y?c{J#\?.s?Qhr?\T?ߊ4?rh?=?;?˼wk8@@N? )y@,y@ kv@8@MVմ@[7Xy=@YQ@quM@!o@'~n@@+PBYK@4E_@>\2@JCo@W>g8*@MmӎX@I;c @Oݜ@K UY@U^5I@WI@I-u?|@HRPOz@@2,@=-YK @5jpS@;#ڟh@2Q@5?(r$@E6e@@RlU2z@?ӮaG@1s"e@@*KB@3\m@3C@69K@4>cXt@2,,@D I@CV^vk@6)x@mav@Ybڈ@K @P$z@GX_`Au@Dpb@GGTxF@Cpy@R@3@E$S@6 d1@+'@)L"3@6`A@M7Ak@>{p@ENg@TGMj@M3Z@Rp@P5oiC@mwczڹ@b-SdZ@Qp7y@Oy).t@5jz~@@@'݇@Ic`'Q@;P@88`@NC @?ύOw@7 ?|Z@@l@MfG |@Da4!<@;@8dOL/w@DJC@DC|-:T@Vl /@P@N@`QȲ@kDMӗ@Q{?@\& @QX @I*m@Rn@k8F @qE@@ed@V$f<@M`AW@D+j@9Wk@P݄QR@s@uW`|@qc@b0@SfTi@Hg`A#@>!@4],@-0@@"U/{i@ =p@@V^5V@mD@J @x?[*&C?i?[CR? D{?s?6+?Zg?G{nV?[?2=p?C >4?hr?ptjk?Uͽ@+8@Sú^5u@9Xt@ ^A7@ZVQ@r@]C@ 4+@"=@&+ Z@0r +@5Bc-@@;dX@RPn@X0@N(ٙF@Tk@[o@Xt9X@\Q/@9:G@B׫}@J1U?}@]0U@g!ZG@]O(@Q!&@:S;<@#t@!~@x@$Hfff@"$@#DE@0 c\v@)+@0 =@6oO;@F{@@QdZG@>@n@*?ffm@3@և*@E @^A* I_@I% @B8ٙ@L{@6"@AS˂M@CF$@?hp@A)x@?ȁ6@BS@A@FkQhr@B^Q@Qj =j@aEX.@SnLO:@F:@\<8@vL@oQx @f!70@Vw]@M%w =4@FjaG@>Q$Z@4Z@@+j =p@#>H9@@Љv@B2@qw I@O@bn*?ݰ?@t?)?Vb?ٖzb?ϫn[?ݵ7Kb?[G?Sż?zG?cI?a?Y?[W>q@"@ ~@7K@%Yc@ K+@f@y>*@=%y=@#8@'23Z@-Õ@3;]@<@GwF@XA"@E_|@FmO?@TӸ$ ~@UNa^@J+S@[⼼ja@DNk<@X3@d3 Ԅ@n=<`G@gkkP@U^PN@? Mj @%Ŀu@%g"@#C333;@*% @/TV@@0N;@8z@A;l~@5їs@8Gnck@MsYy@?hAc92@*tjw@7шr!@BܑP@Xs@hz@7{Ca@;eT:@Aj@D1?@8j0@6>G@A`Z@0ߤ?@5kj@D~Jd@6 }p@E1j\)@IDA@G rE+ӷ@9J_(@3Les33?@1A+@1ibN@Zb@>څt@;?T@%Oڅ@0;dh@4C,<@>g @F޲ (@Ev_@Ffȴ-@E(r@>@8,"g@.u%@0C @1]`>@.g@0Ψ@6O>sMj@85b@A:^5A@Fl@Nq @i3Mj@,IU@/Xq@EW.@#E L/@#(@&~@0,sMj@:J1`@>c$p@Am2@Ct@@lN@;=@7}Hx@4K@) =b@, o1&@3䎒@3 `-@AM'rm@5ȳ33.@E @G,֡h@B!vl"@3'9W@,q;d@0Mf@8=qx@9s$O@Jj/4֣@?L@Bd@ (”@&m@1 @:fC@ICS@UỈe@Z @dRL@txp@nDW˒@H15_@Pdd@V"|%@TFųS@U4Wح@k] @S& =@Pc'@]-@>u =p@D49X@;S v@9M}@7"@7B@<+ X@6olE@%Dt @65Z@3=> 4@3ma@@(5X@0P@4z&@07e@39~)@AVd@6]^@2nO@7aquv@2Rs!@=DTu@7 @DE\(@8\2 @1ġ A+@I;!@H:@@];ZG@CݼIX@QՎF@5t@F'/w"@,$@1<4@7/RT`@>s@Eў}V@P]KC@6!@3U7Ʌp@Ee@A,<@pר C@a3Z@P~c@M9$L@C0@7@2:)@,8$hr@$Ȃ2a|@~|O9@VG@5+K]@ -UrGEb@ 1@Ұhx??gVf? n?Ec{??!X?V+?}"?ua@X??*\(?ᙙ? zG?S? L\?}G?fffi?  =@ffff@؏\(@ Q@d@ E@Y(zF@"L\)@,v@8 3337@Eu{ @Q^)@_ꀣ@d,/ =p@p0H@k?@Ae78Q@D+p@ME\@N)y@Ta4>R@V Q@P@M# @@P<@9T@:n5xQx@:l# M@2)\(@6o3@1# 8@8/# ?@(?̯@$Ǯa@#Ff@"\(@5W+@(WT@BH‡@2B@7Lf@7`+@73\&ffn@)aG@(R@9\%@BþUX@6z@fr@" @&> @,lk@:3DJ@G2a|@X#Ÿ@\%"@\"f@TV"@@͑hp@Aw@H=wO@ArXi@G4@i@dO>9@^$@K9 :)@A7\U@55?{@3Ѕ@<5) @5bXt@1`L@,.8@7?tS@08F@"%@lC@%%F @4{ @xA̲@:F8@@b\!@;w @7ǖs@8a!Ж@HU@BI!R@>#@=/h@6su,@@O"@4!n0@::Q|@A+~@4E^@Et@Xv@A+ Dg9@@A|@qy@cG@Sa@>5@6E4jw@9l>@5K@.@#o~@#pe+@Ez;dZ@9=p@y=م@ltS@  R?q_ح:@x`Aj@J?ybM??y=ُ?M1'?(2U2@B qu@ARtS@Msb@dN5@c_ըX@Og@Et<|@6D@7E0D@0pYJ@,݂ I@:n =n@,u˒)@6Q8@&eI9#@&ژ_@*ϧ@*s@?`P1 @@{Q@-iMq@3Mn@3=_o&@.hd@52뾫6@*/1[W6@56@;|Ko4֜@6S.4@7+.}VR@5cvᰖ@8m|A@<l{@7 F]b@8^EYe+@?2,@FAa@Ey/W+l@ABXc@AbV@39xqu@8t@8/I@<"Z4@-; @3@G):@Q& A9@E"ޫ6@M,@`9Oo@YX{t]@K4@5?|?qG[W ?Ibc?uE?𩠃n?1?f@u?*0,?7$@P`*?bfff?8cr?ohۺ?7lE@FFG@@0؀Iz@f*|@Z I@$yq@05@0]M@2L'.@4_r*0@<{|@Jf|D@gO@EfyЎ@HdZ.@8"=p@R,M-8@d:ѭ@dœ+j@KwqL@/Yj~@6$/@)|$tSx@.v+j@5%-@8x\)@9`3@'JS@&9Lz@+J@5օ@)2P`D@2kqv@9^@7}@/WUL̽@16\d@$}/@24?@1U8}@3;dZ@7gH%F@3'@<k6z-@1A9Y@Epi@<3<@:_ح@9= @<8?+p@Cp@A L/{@A(ɩx@@ dž @7)kP@:*+@6M@2gi@0s@7䎉@D6B@I"Լjz@OWD@b~OvM@R#TL@KTD@G5A R@9<޸Q@2pAn$@-F]]@.I]@)ey@%F@`d@P @g\(@T2@ !F]f@[$@xd?GH ě?Mr?3q?I^?(tSp?קv?8QP?ۋ ?,ORT`?8)_?Qu? *Z?=[?SC,?Me"Ь?#p'?+H-?5X?1ZiB?e@\\6@cS@ 6E3332@f#@ *0b@ :dT@6@$0@%0T@*ݗ@>~@TB3 @_hZ@SL @D$v@J!Q@Q@H@Wǀ^@Xߪ͛@R47@':PEm]@2a\&@0Omn.@7}D@3#ʌP@9-Pv4 @1>@> :)@5l\KƧ@3{@52Np:@4@6_7K@2{ME@7m=ڽ@67k@<dZ@7> [@3@KU= @8H-p@0lF? @<{h„@:Fk@=Բ-@=0U2@E@ i\O@oil?`@h? ?.uOG?u!-?M?W?zh)]?8rGY?CO?VRL?\)w?\}? bMҡ?J ?j$j?|fff?wE;?*$/T@d ?@뙙@X=pG@ WA@ *LI^*@.\(@\(@^5(@2O@+@(1(@H}Ǯ@QB @Kx#D/ @`=O~@Kx}I^@N\(@Pt{"@PAK@PbͰě@C @7,~ =@7T2@-c| ē@,%K@/|(‘@2HQ33H@4r;l@0S@)oě+@1/ܢ\@)^C@1]-@2R^Q@2q4jz@4S<7=@7݅333U@6Ϥ@:"1&@@aW5@=A@4چC@4@3׽@529p@4T\(@? \@9LXx@@:VE@6qo:@4*b=@3R?@8b@=k@=Fև*@@UV@;"@=ɯO@=[~@A=@;c=E@K3AG#@ECN-@RJ@?ܗX@D$@C|(@5@t{l@=dZ@2Z@*6O;G@$O(@$v'.@'\(@%bM@-`B@vf@~l@ ?! =p@@*W?̝@ȴ9?ix?[S?"?NQ?ZwF?ߓ㕁? k?*?)*Q?4%?(gOQ?B~ߤ??L0- r?嚌j~?(?M@C?U?0ۋ@?{@ I|@n@  +j@ 6@O =(@Tn@ᆶE@C,@8l1E@Dٙ@Bg.H@>I3|Y@JrW@\wQj0@M;PA8@MOv_@Nu?@FdN@@{G/8@B@CŔ]@86Ϫ@35KƔ@1 sE@-\(@0sbw@!ո^@.[@#@m@2X =a@'nvȴ,@8C}.c@8~\@: uiDZ@7@8"@;pˬp@1Oa-w@18&N@0' =\@1]cv@<匹~\@=F87@5u4m@:z ƨ'@='cT@8M©@6PM@7c2W@@^|@ r?".?S332N??^K]M?z SG?yVffg??&?O?: ?؃o*?4M?SLo?%}H?!,?uS1? &w1?u=zxn?nu?]oh?O$tSL@PD(!@a @upwj@QE@k@,ȴ9'@qn.@ m\@ׅ@7偰@>%`@2K]IQq@6j@@ N@O|G@VZ@C븺@GH @A}F@A1@9ʏ\) @>~\/@Au2ay@rG,@.9Ǯ~@-p`A@1#@ ZQ녬@Z_C@,?*@){w@1R<@8bV8+@0kj@:Y@0P k@-}@8@\@)D}*0@'|&@0e6@\@7 q@-&Z@6I/# \@1kd@(!Iȴ9p@0Wlv@-O5@-]lf@?Ls@"c|@?CT@P@# =p@EϪ]@,7?viDf?~Τ?ߴ3?~9Rh@U?@O@Xb`?M͐@ZbM@y쎊q@S@t؇ݵ@1He@0;@'^5?@0qRTe@7=P`K@A*%@P Q@TQBC@H@Lvg@@ @AEx@@:|@CxA@<ffL@;g@6ݑ@@.J+@1w'@0R@1%@/jo@6C!@I@,J@3e@2Q@5 ;@7;=ګ@3"o)@6sϪ@6 @)B;dE@+2_@47X@6jd @1Ϫ@5v@6ٙ@;T@1 P@(|wk5@ֈ332@2~Dl1@3W =@@0ʙe+@2眙@-l@%'@2-#@Ax@])|@\/@RqJ@B=S@:i=!J@7@7@ k T@-6C\@)g@%Dj&@9rGE,@h@Ca@&@,<@\Fsy@ +a@/:̥@X6O@qZ?}w1?*BC?0R?LO?6_حL?KU?%?aV?5m\?}1x? ěn?ԣb I?+?杯͝?'@?J?B ?ހ*v|?"^AH?a0?!{P?Om%?P~?V?w]n.@hq@QnA@ooXbV@ (ȴ9`@ ) @oh@'h@ MI^3@"v+@+74@0k @8&t@E|@U`X@Z2c@N5#n@GV4 @DR@C;vx@G㥔H@=_UG@;BZd@>=l(@թJW@9o@?r@w@2Gh ԙ@;3t@5}R<6M@0E@)>6@.ך9@&@-m\@=[X@8ᰁ@Qfffu?y ě?x?bmv? (@II^i@Q*@ f@ ڥ]d@6]c@ =p@ťT@!Os@&kk@1@=̆/2@@Qv <@K ]@Yٍ7;i@[˃qu@JG·w@Kx5h$ u@GHoiE@E}=j@Bqk@B|\+@=U:@:OR@?,@?j.S@B>Dffn@4Ca@3fL@1 @5hO'4@1 -V@&;Q@@bR@7 hT@Aä/h@>sH@Bq6z@?;͸@;]J@:JP@8A˺^5-@A ,"h@:mYb@=-@AN@C2G@E{@AG_o@7L,@F.\C,@H9v|(@[{߻/@Mj\$@@ ԡ@:tu@7\1&@+q@1]@N@*}ɺ^5@'[Ђ@&FPy"@ s.D@He@q @J)^@ě@o@71}@{@Z{?333? _c?V?`O m?s:~R?Xn?ٚ!)D?(?hGkP?Q?1'?[T?၉ot?ۈ_?0?$zG?ٶZ~?xv,.? hr? :?1&?2PH?_͞?_;dS?MT[?\(?"h ?a?##s?#Y-w1?bM?7y@'E@f'P@|k@ ME@.%8@QL@LV@%hʌO@,;dZ#@75@Be@KO I@P^s@V>Z@MaJR@KL@GM@@x@=NXC@8cS@7iQ4@.FP`3@4ܬ+@2gf@czF@>@?9>6|@Df@~@Ln9s@N?9W@G>Ϸ$@@ }@3"y@2f@/)v@"7@!iF]e@# x ~()@ L1g@ l@/{J@1@9@q@fGP@;?bݷX@ (?($ n?_3338?C8?U2ah? *A?{ޗO?[;dZ?ڨKq ?IY}?Vap?Mԕ ?⠢?%8V?& b?:p?xn2?>bM?nݗ!?}N?@s?'3|?xr ?巡J?!l?E83?R3?z\(?v L?-=s?!Xy8?xl"h?/@ߤ?@T`j@@aV@ Ģ@ o@xl"k@x@*$+@$^5H@.e@8P4k@=U<@C@FO=p@RyQ@[$@O^vϾ@IT@LQ@L$1@Gd@EYJ@@@ o@@p!t@?PË'@A{q @7sˌ@9NK@>>LE@>H@= @>,<@? @DT|@AuW@@i@C&n B@Bzq4@D@D .ߙ@BFLV@AU>@Ct@AEP@DuS&@PBX3@Y@/@H_e @9_}p@6>BZ@2f@)]ci@"AToiP@"1Tk@R5?|@ l@I埾v@A7N@i*@hj@?^5B@?Q|@n__z?`֧@0;5?=FQ?q:?yEʺ?6D 6?1a?"ߑ?>?Bݗ?%hqj?~l"g ?Mj?0#w?%s333#?9Xt?#P?ӲpG?C\?aݗ~?u`Af?ѨA?.?س۬q ?bY?xC?u 'r??f-?ŴZ?Q?2cƧ?ej~?9? O ?9X ?ޕv?:)?3@ nY@m9X@?/V@ W =@(,zx@XJ@ š@%`Ҋ@+oh@/ f!@2.T#@6% @C?fx@Ol!-k@T8@W!z-$@N =w@PqP5@O%m\@Bu@A\@@9\#@ClA@Bs7@8o@6RZQ@9@EeS@>9ʌH@ARa@Cۡ&ffi@CjL/@8=p@C|x@C&@DE@Dx@Bl"@C`Whۓ@Df@B,@A僯@G炏\'@T!ۼ?,@SeN 8@CƧ@6>^5*@*hC@)KƧ@(`@!YE@'IX@V;L@E9u@p+f@17KƧ@*Q @r@ JBZ=@ mXyJ@$q @PV!@P+?p$?"S?\?u9W?3 ?gQ7??5p֝?(2`O?hQ녘? VVw? E?/v? dZ?Q333(@NP5?|? =B?$_;dZ=?pP?333?Ur?E tv?C/?"^5?p@e!@w"@[@@hu@U@LbM@ϥT @vȴ1@&V@.ʧ 3@5٣TzE@;hr@CHޣS@Ke@T37@WaXe@Po;f@EIl@Pvȣ@B1Q@CM@;v H@;>5@?N}p@?@Eȴ9@Ka;<(@Ky7Q@K^5:@OD+@Uij@Pǹ@GUcS@@msz@@2#<@&"iÕ@"̳33)@n@ 9X@vȴ@er=p@?Q@v@ r @(j~@ Ӳ-S@ p3@ Q.@ƒnJ@" Im@ Xb @x?<bM?9X?Yl?=/? ?HA79?̋C?ñ`A?\;? ? ??)%\[? ě?Ԥ~D?B\)p?bn$?vp?A kF?ҽqG'?̮w?a4?4?%`?قZi?=+l?8X?.6z?OK|?xG?42V?H9Xb?ZL?"u?LC\? M?v%?YK]b?Sι@2ě@?&@>G@vȴI@<z@ 2$.@ 3@L@Uc@"@$ArN}@0;4m@1A&@5c=@;h@C…@MFy8x@Tޓ@Y@TJO/v_@F0bM@@W@<ݢ7@@+?!-@D lrGG@FLC @H`zE@J_H@I&@O@HQdw@F!G@E+@IR@JJmB@Kf>@Pig@S-!>@U @P|s@C(e@77Tz2@0X[$J@)݊@"AZ@64@yV @S7@o@@c1@ khr@ k@ 8IH@ 4@U暸@,}/@$.@/o`@%F ?RrGEJ?`A?]R(?g*??:rh x?ȴ̷?CN)?0N!?4pużp@7!@/+IQ@%r33*@!Xhr@;d@|_V@Ϫʹ@ i`A@ QU<@,Qx@ n/@ F1&}@"O@O@M@K]~@{J#?hrv?']c?쿱?Ks?Jw:)?b?DQDg8?CH?M#?T/M?Q?bяt?2Gg?s3??A+$?H"h ?%2a}]?dZq?MڹF?Vxa?۩x?OPě?{qT?5?|{?ZzGg?U}?[W??`A ?r ?T1N;?˒?/&?<\~($? :G?/kQl?1bM?牢ߤ??PZn?Gsn?WH?B~D?*0W?;f&?}B~ڕ?+ B?)y?cB@d@:n@\;5f@k'@]c@6{'RF@ܸQQ@{=@ )lp@"*3@$UXn@)^ =p@1%J#9@32V@2@7,IB@:m!G@@\%cw@Bys@D6[@Fcf@EnV@APH@AGBZ@DZX c@Fc~,c"@Dև*@A' S@>?|@>O.@9.>@3RXY@25@,!R@%k@"\$@أfffl@iDg1@ufx@ PD@ vȴ@Ep?:QF@ʌQ ?.@tS@k@8?W>?cQ??I-7K@W(kP?j}?ҹ?;%?̟?ObH?[W>?v0?X$?d$?戠-?PhۋJ?עW?f )?+S?@u?^5?ڛC.?Ԣi)?oѩ ?R?,l?RJ{?cn6?੟.H?РɅ?ᕧ L?؛dre?72f?s ?cSz?Ә&?PH~?TzGp?KF\? 83?_?&Ϫ?j e+t?G,?퇓?(?]\H??S+ h@zG3@T`d?ʱ3@@ xKMn@MG@WC,@/G@g@[u%E@iyz@@!F!R@%@) !@({/@.PG@.U2ao@2BCN;@0*ʌ3@1O4 3@*; @-lj@1FwX@1lm@/šʑ@+|mh=@&ja@,/@"Z}I@%@ kP@;@c@Vl_ح@u#o@`Gg@ HQ"@RT`@׊?6?%\@:#9@f>A@)/@: ?p@]?aP?,C9?n?j&?kHc?{A [?S{J#G?wU#?XI^ ?2I ?ڹ?ŝ*?s_?H T?p(?{"?"h L?xl# ?L(º?x?;xF?W#F?gJ#8?Q @j~@2@@\(@ ("7Kƫ@">O@! z7@fff9@2*v@ \(@ 9Vn@t@iQ@ě@A7-@Qb@`A)@ _333P@7KƤ@ahr@K#G?$/?Ip4@T1&@?dZ?ŧ;dZ?͉7K?Yffe?(1'B??t =H?z?,?$?쑛 >L?|?cKڔ?S*?_?8v?듏v?334?#333?)c?2?9W?\R?׌L?^ Ƨ?Hl?+"?qlD?\(?dZ?ۋ1??"?򧆗N?~?0(N?JkƧO??ffff@?V,?jB?`V?o!-x? =?m%$K?~Fs?"G?ߠU=?↌zG?sj?]+j?霃?4?o?}Y?|s?}\?Mye+ӡ?ffg? K]?V?2G0?Cqu@y@ѷ,@ ]dZ@ `64"@Ĭf@T*0@ 7K@ o\C@RuN@䠑NK@6|D@WA@ {1@|j~@rGU@a@S]]c@[;ds@W(@Xbp@7K@'@Jd\(@T`L@c =p@iDgK@ %F z@ 1',@ =&;@5K]@?ڹf@ ԕ@.@tS?3sY@RT`~?Es/?vȳ?PH?@G:)?TIQ?in?Vn?9Q?ck?7- /?I;dZj?3Ƨ?e^L/?wkB?s}0?O?u?6_خ!?}Yu?ݘ1&?@?s?ㅣ'?)n,?9M?-=?Ou/?SJ?KPH?թhT?q?z=p ?ҙu?C+?MM?b?A ?"@5?O+xG-?αs?D+8?s%?ݗ? ?ۥUs[?C\?J'?#|Z?G͞?.c@N?$?tѷg?ܾA [?ռ?XbM?8? A?]JL/?BZA?%F U?K~E?BW?ݝXy*?G|@7@@ h ěl@]o@#e+ӵ@PH @mQ@E@HF_o@˲->@F"@-|@ ~@ #iDg@M@ `A@ȴ9{@TYJ@ 7T8YX@B;d@ {T<@wdZ@E@@ߤ?@qL/r@zH@~/@o@m#9?XU?dQ@$tSS?,hۋ?Itjh?\j"?ID?&"?$Gqu.?{\(?f3%.?o?ep?cy?RN?L~? V?E?2k?|?댥Q?"/?H|4?lQ?з4?S?,(?,?7@?[@N? tS+?N333^?*?H9?Ehr?!7L*?c'?-+ $?g?ƞXQ넀?ڟ?ߕe?gP?0 R?á!-w? Z?:)yz?تKC,?tj?Vl$? 5?*GN?U2?N?c?wt?W'09?!-wG?H?n~?+tG?lҟv?q^5{?@Qx?;dY?}?Fs?1&? x@B[%@h? @?r?1O;}?r#9?dZ4?pH?YDg7?w14?U2ba?)Xb??vH?}Vl;?9Q? AG[?}j?Ju%Ff?Ex?@m?5y*?:T,z ?t>B??M*?CaU?ؠbM?67?7Z?B%?vpd¹@n&#@/hے@ 5?|?rGEe?'0? .?1-@cQ?]c?^5??I$tR?- Y?fU?ح@@<@;Y?0(•?U= ?WZL@#u?!?s$@?3A*?I㼊?\W?W?)n\)?Fs}?X??t333-? ?Mi?Mڨ?hW?I?Ek?zx ?t?z?e?GS?u84?K?nx:~?B@v??U2`?z ?N$Y?#%?ܾ5?|?TD? B?8h1&Y?󭸺?3&fff?VH,?,<@? ŒK?dm?՞W =q?n?c O?\?Q6V?}(bNd?Ud?=n?ײ*=p?S3332? =v?NQ?htzG?!?zGB?ֵ;P?w q?@?Ձ$?ܼm\?-w1?JڹY{?Cw?Q?c=p*?:L/x?~sPu?#:??k׍O?QB?Vl?4J?g+?*nH?պOv_?q*0U-?&B?ca+?? s?-Dg8?Ul?$?=?O ?[WD?2Dc@?@ۮz?P̠?xw*0(?0 ?rs?שV?3?IQI?oh?` `?y[L?yS?q[W>?s고?;a?+ 8?&ffff`?괟!-w?'0???=sx?Õ?*3*09?1Fl?K,??Xb"?ѾV?h?<@&?pl"g? l ?:bM?I/sO?ۓO?blH?5Y?+ G?J?kFtd?@?OU<8?Q??.q7?u%FF?Og8?R-T?Q#9?P?܊K]?1|ٖ?:?O??=JH?vE?)@??ՙ}V?ȓ?&Xt?>z?u9Yz?ם%`?8?♓333?F i?m?UB[?&?;?E?i A [?9=?n^5??͹4?|]c|?NƧ??a?5͜?u7?[ I??[J#9?{?o+k(?7?1n.?|Z?3O;? Ca;? :)Ǿ?vOv?¦L/?Ӌ U6?X?sɅ?u%?rw? =?3IYF?zx!?F唯SS?l"g??5bK?G?Q&$-?ke+?Ὶ?S&?! U?+j?p;D?nb?~0r?W%?t<7?oh?M[h?`^?к0U2|?F_?΅9X?!|Z?ԥdzH?\(?ua7?N(©?,?[&xc?@]c ?!L?iq6?$N<?ʔ%? M:I?ɂ)&?sƧ?у&?Ԑ{?۷ZN?ԥzw?r?s?SG?] qU?okH?Xj~P? ?q7Kv?R8Y ?~M?7K?:#jV?oᰉ?ؖI/?Ec%?\(?R?(DT?왘PH?ӋqK?,S?N _?&2ߤ??TɆ2?~}?X? pti??9??AO3?5 '??|UE?oW ?ZGH? hۍ,?@U2a,?qs-?;dYv?E\(?=s?ڀ+³?>d?> I5?@?0?S?p:?]"䎈?PaG[?RB? _?#h?3d?1?S6?n}Vl?tȪd?z?ߎH1&=?U?WOI?:ڹA?𖻙-? ` ?f N?%i?? ?334?誛]c?c0 l:?$xl"j?\m\?׍O@?s?4s*0?ؿB IJ? =p^?a KN?Ҥo;dZ ?el?+Ƨ?I?|폔?8V{?C?ӌi?PpV?dzH?ifff ?Ķffg`? o?UPbN?u]l?| I?:G? I^q?/+X?]p֫?+?Pn?"?֢?Tu\-?n8??}?އ5?{?0ffg"?pnEʏ?~ȴ9?́#?B? ;?+?씧-S?妙k??uQ?vȵh?6M?,I^?'=[?vQ?̄/?ȓt?L1&H? =pC?\?y"?h&?9i7K?k >U?釬?i7K?n7?nZ?K=-?[zg?l;d?sn?!l2?q?ed?@;a?z7K? Q?C$ݵ?\zGQ?n9?|?޼Eɪ??ٲ,D?ׁ5]N?B.V?ˌ~vȯ?ş?vȐ?2?%5?}$?n? =qj?՚\(W?I\(?nzB?G?݋ȴ8?Լj ?# >?A3?Ʋvȱ?-Q?D|t?ᡭ"p??ъ!-?'t?Ȗ??E ?p?hu?O64? ?3L/?ݗ?մ/|r?$6#?c;?wzG ?yQ;?x >?բu? A?_d? l?$}LX?X3_?,ռx?ay?Ŷ334[?ř?|ޣ?ӂව6H?A??$OfI?^?Pb?χ;e)?$a$?缋C+%?s{*0?Ҍc\?-k/V?ĔI^K?X/?R?@k6z?ڊͥ?Ue?E%F ?AiG$?Dn.z?墄_?Ƨo?hE? 7m? -BJ?20?s Be?ڻX??x h?B\'d?ۦ㕁D?$L?֛ 'm?ѡP?ΰH?=?B3X?8IZ?թ8}?Q?¬M?mZ=p?HQ?#*.?s?9X-?׏fy?௫A!,? C?䂡j?? ?xs/V?e?A4R?=}p֊??!-xZ??C?%R?V4c?ݹ?֡c.?R<2?iy&y?K2C\$?⁇\(?عS?ۈe"?Id?K?݂~?2ci{?ڦ?%+?"d ?Gk?|e %?߉n?t3?rs3? n*?ꄄ#?ѷ??0?Ge?+U?A-??8*^?N/N?ף3 #?Hm?;+ e?Kl?C]d?)^4?~Ne?@us?!q&x.?0d?Zt%4Y?i ?ƟFfff&?1\?S? ?Y~?zG?RCE?珄(?׌Gr?Й|1(?ՉG? fff?Op?uhr{?G?k?ڳQ?7J`? $?Xb?"=p?#ilx?ާ hr(?O>5?|?MO:?N?ח`AB?-U?Sl?&y`?hQ*?6?K?9V?{?DW?ە?`A?z@]0 ?̡?ȃhr?y49X?Gۅ]?ϧ+Ƨ?ΏJ=p=?N1&!?Ԓt?= 7K?o\(I? zG?~l?Y+L?bM?J=~i?N_p;??Jv4>?Z.?aH?c񂩒?˪^5??^@0?ܻo\(?3]b?c˻?WYJx?,,x?ƚ͑hp?ݯ+?ΣU=m?ήH触?ժL/?ԸbM?QT`>?%FN?s*?"?(bM҈?G*?Unu?cY?hA?y!?ub?@`B\?*uN?neb?gc =v?I?m4_@?Ğ?b)y? =pJ?)fA?ݮtS?ܔs@N?aa?A7??Y,?O?:%?6`A?A?*14?ؿ`ě?ߕ9yX?1~?nG?ɂ??s|??P?zk?ON?p*?C?;d?1}VF?ג~?ěk?2}I?^W?=㕁?#n.?rW?WI*?L:@?HCn?͞?:TɅ?S@O?i?uF?we?'7͞U?ЖJf?l"g?bJ=p?LW2?y*?̕R?Xew?{J#v??iq7K?ѐO?ϼK?Ξs?&IQ?Vl?u\3?fA?~A ?yn?p쿱X?!\(?ͷ#?g8}?""?F V?+ I`?6a?:@9?ڄZxl"l?/?ףS?L?#a@?@wX?3,zS?ưj~?t9X?慔#?y? OX?v?Y1 ?%fB?ҶL/G?}Hc?ݛ">?7ݫU?㎠H?U*u%E?*CV?zwB[?i[W>?P4mů?r.?5ffi6?3S&/?ɦ ?dm~?Qxe? +dZ?dC?Ֆ+?ȸBw1?YJ?6Qx?9X?\(?o?Ҭ9?̹-hrD?C5b? I?{?`sunpy-0.8.3/sunpy/data/test/SWAP/resampled3_swap.fits0000644000175000001440000026400013203275053021664 0ustar nabil00000000000000SIMPLE = T / conforms to FITS standard BITPIX = -64 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 100 NAXIS2 = 100 DSUN_OBS= 149633372797.0 / [m] s/c distance from Sun TRAPELEC= 0.0 / [ct/cm^2/s] AE-8 MAX > 1MeV @ 725km model OBJECT = 'Sun EUV ' / object observed COMPRESS= 'jpeg ' / (off,lzw,jpeg) on-board compression algorithm GSEZ_OBS= 3260687.32487 / [m] s/c Geocentric Solar Ecliptic Z PGA_OFFS= 59 / PGA offset DATASUM = '2176922697' / data unit checksum updated 2011-10-05T02:30:30 CREATOR = 'P2SW_PREP.PRO v1.3' / FITS creation software DTPLAR1 = 2000.0 / [s] predicted time to prev large angle rotationDTPLAR2 = 2000.0 / [s] predicted time to next large angle rotationREADRDIV= 0 / read-out rate divider GEOD_LON= 82.8116337307 / [deg] s/c sub-point longitude SWXCEN = 503.46 / [pixel] axis 1 location of solar center in lv0 LEVEL = 1 / data processing level SWYCEN = 517.61 / [pixel] axis 2 location of solar center in lv0 IS_PROC = 1 / on-board image processing LED_SEL = 'a ' / calibration LED selection TEMP1DET= -0.65 / [Celsius] detector temperature (SW HK T CF) CD2_1 = 0.0 / WCS coordinate description matrix GSEX_OBS= -802363.143401 / [m] s/c Geocentric Solar Ecliptic X CD2_2 = 3.16226783969 / WCS coordinate description matrix NPRESCR = 0 / # preserved pixels - cosmic rays NPRESLZW= 0 / # preserved pixels - LZW decorrelation CAP_MODE= 'CDS ' / (DS,CDS) capture mode TRANTIME= 993438825472.0 / [OBET] transferring time HASBLACK= 4 / HAS detector black level CTYPE2 = 'HPLT-TAN' / WCS axis Y CTYPE1 = 'HPLN-TAN' / WCS axis X EXPTIME = 10.0 / [s] commanded exposure time RECODING= 'fixed ' / (off,fixed,adaptive) on-board recoding CDELT1 = 32.3816226784256 / [arcsec] average pixel scale along axis 1 CDELT2 = 32.3816226784256 / [arcsec] average pixel scale along axis 2 P2_ROLL = 90.00505410709999 / [deg] s/c roll SWAVINT = 15.4684 / [DN/s] average intensity in calibrated image GEOD_LAT= 50.8624323792 / [deg] s/c sub-point geodetic latitude DATE-OBS= '2011-10-04T23:58:31.224' / UTC time of observation HEEZ_OBS= 3260687.32488 / [m] s/c Heliocentric Earth Ecliptic Z FILENAME= 'swap_lv1_20111004_235831.fits' / FITS filename INSTRUME= 'SWAP ' / instrument name PN = 131 / on-board priority number EACQTIME= 993438825472.0 / [OBET] end acquisition time HEEY_OBS= 6255916.82254 / [m] s/c Heliocentric Earth Ecliptic Y TTEMP1 = '2011-10-04T23:58:22.000' / UTC time of detector temp 1st sample TTEMP2 = '2011-10-04T23:58:52.000' / UTC time of detector temp 2nd sample OBS_MODE= 'Variable off-pointing' / sun_cen, fix_off, var_off, cme_track LANG_ROT= 0.7071067819 / commanded large angle rotation component LAST_ROW= 1024 / last read-out detector row FILE_TMR= 'swap_00993438825472_f1a90915.fits' / SWTMR filename LAST_COL= 1024 / last read-out detector column CHECKSUM= 'YZEZaYCYSYCYYYCY' / HDU checksum updated 2011-10-05T02:30:30 FILTER = 'Al ' / Aluminum filter LOS_ALT = 689898.6411679999 / [m] s/c LOS altitude (1000000=no atmosphere) OBSRVTRY= 'PROBA2 ' FIRSTCOL= 1 / first read-out detector column RECBIAS = 10 / recoding lower limit FIRSTROW= 1 / first read-out detector row CD1_2 = 0.0 / WCS coordinate description matrix CD1_1 = 3.16226783969 / WCS coordinate description matrix HGLT_OBS= 6.54354038558 / [deg] s/c heliographic latitude CUNIT1 = 'arcsec ' / WCS axis X units TEMPDARK= -0.674593319694 / [Celsius] temperature used in dark subtraction CUNIT2 = 'arcsec ' / WCS axis Y units ORIGIN = 'ROB ' / Royal Observatory of Belgium P2_Y0 = 0.00621535807393 / [deg] s/c pitch DATAMIN = 0.0 / minimum valid physical value ARTEFX = 'on ' / (off,on,cosmic rays) on-board artefact removal SOLAR_EP= 356.865170612 / [deg] s/c ecliptic North to solar North angle LED_POW = 'off ' / calibration LED power CRVAL2 = 0.0 / [arcsec] reference point WCS axis Y CRPIX1 = 50.5 / [pixel] reference point axis 1 CRPIX2 = 50.5 / [pixel] reference point axis 2 CRVAL1 = 0.0 / [arcsec] reference point WCS axis X TELESCOP= 'PROBA2 ' / satellite name WAVELNTH= 174 / [Angstrom] bandpass peak response LONPOLE = 180.0 / [deg] native longitude of the celestial pole TRAPPROT= 0.0 / [ct/cm^2/s] AP-8 MAX > 10MeV @ 725km model DATAMAX = 363.675 / maximum valid physical value HASSTDBY= 0 / HAS detector standby mode RSUN_ARC= 959.406763065 / [arcsec] photospheric solar radius WCSNAME = 'Helioprojective-cartesian' / aligned with solar North P2_X0 = 0.0037807148592 / [deg] s/c yaw GSEY_OBS= -6255916.82254 / [m] s/c Geocentric Solar Ecliptic Y HASOFFST= 11 / HAS detector offset level DATE = '2011-10-05T02:30:29' / UTC time of FITS file creation REBIN = 'off ' / on-board rebin (2x2 pixel average) SACQTIME= 993438596904.0 / [OBET] start acquisition time HGLN_OBS= 0.00247626951733 / [deg] s/c heliographic longitude FILE_RAW= 'BINSWAP201110042358440000419658PROCESSED' / raw telemetry filename LZWDECOR= 'off ' / LZW decorrelation CROTA2 = 0.0 / [deg] axis 2 to WCS rotation angle CROTA1 = 0.0 / [deg] axis 1 to WCS rotation angle PAV_ROT1= 0.0 / commanded paving rotation component 1 GEOD_ALT= 734855.288813 / [m] s/c WGS84 altitude PGA_GAIN= 1 / PGA gain TEMP2DET= -0.7299870000000001 / [Celsius] detector temperature (SW HK T CF) SIZCOMPI= 635104 / size of on-board compressed image WAVEUNIT= 'Angstrom' HEEX_OBS= 149633372630.0 / [m] s/c Heliocentric Earth Ecliptic X RECNUM = 3600 / recoding upper limit PAV_ROT0= 0.0 / commanded paving rotation component 0 DETECTOR= 'SWAP ' / HAS CMOS detector 1024x1024 pixels FILE_TAR= 'BINSWAP_5894_SVA1_2011.10.05T02.11.39.tar' / raw telemetry package BUNIT = 'DN/s/pixel' / unit of physical value COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT $Id: swap_fits_template 3732 2010-09-28 20:42:23Z bogdan $--------------COMMENT ------------------------------------------------------------------------COMMENT ----------------------------------------------------------This is a leveCOMMENT l-1 SWAP FITS file produced by p2sw_prep v1.3 at the Royal Observatory COMMENT of Belgium. If you have difficulty with this file or wish to make suggeCOMMENT stions for improvements, please contact the SWAP Instrument Team via emCOMMENT ail at swap_lyra@oma.be.------------------------------------------------COMMENT ------------------------ HISTORY SWTMR 147831SWEDG 147835FITSHEAD2STRUCT run at: Wed Oct 5 02:30:23 2011HISTORY p2sw_hdrchk v1.3 Computed detector temp.: -0.67459332 Celsiusp2sw_pmcdiHISTORY v v1.3 Reverted wrt swap_pmc_20100308_164500.fitsp2sw_pixrep v1.3 ReplHISTORY aced wrt swap_satcds_20100113_152800.fitsp2sw_drksub v1.3 Subtracted moHISTORY deled dark with coefficients inp2sw_drksub v1.3 swap_dark_coefs_201101HISTORY 01_000000.save usingp2sw_drksub v1.3 T=272.48 K, dt=10.0000 sp2sw_pmcrHISTORY ep v1.3 Reverted wrt swap_pmc_20100308_164500.fitsp2sw_ffcorr v1.3 FlaHISTORY t-field: swap_flatcds_20100308_164500.fitsp2sw_despike v1.3 Despiked atHISTORY the 6.0-sigma level (6797 pix)p2sw_imgcor v1.3 Image centred on solar HISTORY disk centrep2sw_imgcor v1.3 Image scaled to square pixelsp2sw_imgcor v1HISTORY .3 Image rotated to solar North upp2sw_expnorm v1.3 Exposure time normHISTORY alized data (DN/s/pixel) END ?HZV?zxm@?!-w?^ 1'Q?M:?Kl?"њ?ːK]?7z?"Y?ИbM?`=Ԃ? M>?țɺ^6(?S334E?2?Ücn?ג =? =?uo)Y?;/iDf?,b:)ǒ?пy*?ϯě!?͝J?{J#z?0RB?e?nV?vYJ?pXQ?"?TɆA?l ?֫1?lzH7?ԒzK:?D3?yŽ?~Ԉ?."?p?U2a{?(\?׉?ܵca@?,]p? ?2_L?ʎk?wmqz???|?C'A?ƺ\?i?Go?&ye+:??bTzG?{SϢ?r]p?]E?A<9X?aD?l?d?/ȴ9]?8h?(?- ?$htD?S?bM?G=p?? ۥS?W.?? ?ME8?|(?~vȴ9'?!Ͳ-R?izG?7vȿ?$-\?˅y?Z?3331??z^5??i*?/"=?\(??ҢMV1?ClC?z1?ׯhr?P׮z ?,/?⌕Q?*=p?h9X#?ޗ ?f-??M?c ^5?;?E?ܓmpՎ?+e?/?SE?Vaf?NC{J"?W|푎?Ǐ)ԕ?$zG?ML_D?C%?,V??ۃg? ~?sE"?ɓ h?5]?| U"?h?,\(?:)?ՎE8N?cFI?=p?Ӥ73?$!?4mG?_IYL?Ƨ?Π?ђ5?}P?Y?͞?Mp?ÔrF?w1? T?N;?o;dY?YLC,,?Ѻ0U1?qml?[/W$?||?hr?P3n?Վhr?؛W>5?6?h?çG5?nH?ղ?fXy.?hb IX? \(?ۼ&?ۜ<?Jwj??t?Mc?֢5S&?iBT?Ф0{?؊^5?j??yP?ׁt?k/V?Ɉ x?Ѿ_o?PH ?ܬ)^??w?ז4g?Y"w?~? (u$?qL?Qy ?D>҈H? ?SyA [?ӛߝ-*?UA [?ܭtN?ۄf&?|3?י?#?|SS?Yl?! ?ě?㇗暃?4!-?f7K?z?ȰP?߳ k?)?!?EQ?J?!?'RT\?3tj|?gA?%Fs?U~(?{J#9?Ώ\(?HW?=8}?]cet? /͞?_\(?۰?z?ސ?땁? =n?ӥ ?_oB?4m?M5X?Z?p;,?;5?P?4M?Ձ =?6JV?בP?&C?i[?iw =p?zm?2T?dN1?Զ"?=p?v ^?/o? )^?4-??RlC?`/V?-ᰅ?$`dS? =r\4? _O ~? "? Z?i*0U1?mn0?a-w1.?6p?.Pm??H;?րH?3ן?R<5F?8ښ?@+?Q=p?OQ?!fff4?٤tZP?ԡI?ٸ6J?Ч333?n?OO ??V?LG$tS?س&?FV?C3 =`?3Mj)?,?-?cp?XH?߾vȜ?_ ~,?{$?j~?6T`?"nZ?ۊڹY?TwkN? l9?U--?M =P?ԉ ?v! k?CzG?C\?'R\?Ӱzu?;C?1?! k?@`d?m I?ru+?l/>?&??|?؃s#?d?\ja?Vȴ8?CIQ?cA?|C]e?r m?Q{C?〫?́@?0Xy=?>zn?qe?eC,?ͣxl"jH?Rva?:Qx?C*0?6+k?Љы?o2#?ٯZ?V?JMp?z@;?$? \?m[j?ԣA7K?Cnz'?Q[W>>?.L?ө*0x?޿ ڹ?Я?=8?ظ\?ru%F2? ?QBZ?0<?Z?r ?LgX?^t?4K?(~vȴ/?LB I_?1?ʵ ěp?hG?@l@?9&x?jG?8;dq?ͮtj~?8ON? dt?fff?u5?|?E?Z?f2M?̽p(?v ě? ~vȵ?0P`A?5';d?ӋX?ؿ?Nvx?Xq?TI+(?L(?ܾAhr?L =?zP?b S?ۊB\)L?$?⌅hr?4nfff?W(?֞333*?%;dY?eStj~?bM? 1'?}Q?S?歬1&?uXa?絠A6?G?JG ?KƧ?KC?slS??hr?P\(?4Q?$?zG?^ļj~H?ӹ7K?r ?ތS?̴?5?|?U^5??O`?l\?%pא?v?9W?ڼV?ๆQ?bG?-r ?-V?xQ.?ȴ8z?.Q?$/?ߊ$?e:^5>?K5?ģ @W?ԯŽ?ȵz?1Xbn?+ ? @?\(?\)B?YD/A?i?5TzC0?ʻ?Ӷhr}?ȞS~?56ȴ8?!-w@?9#?ԱQ?#xG?惛xF?Eoi?$tѶ?u<6?个g?]\??υO&?c@?15?f? S?oY?C9?N+j?.x?"-V?_2?ً\S?ߐ?< *l?ިz?^E?|?b?- ?۹y?e߰? <:?͞??\)?C# ?i5<6?]~ȴ9l?"#9?`PH?n?溵+A?p馵 "?~?4GR?Le?Ii ?5Ͳ-?Va??H? G?K]?ᏹᰉ?}?`4n:?-?ٽL?;9߻??!ru?Cm4?ەi7KƠ?. LW?c?FN;;?"u%E?X1&?r,I?@M?:g?OVk?y0ě?4<? Il?ҳg?GǮz?[cY?1[W>?ݾ|?39=}?Z?M;E?:0?*Ov` ? ?Yԕ$?M쿫?@$?ּ5+I?j?Ҽx? Ǯz?wZ?ɜԯO (?R,z?Fs?y\q ?мxp?Xz?jm?G]S?၁$@??'kp?ԙ܋Ch?簚kP?`bM??}(?I]?a;"?蠆YJ$?ݘ{?;5?=fA?| ě??=t/?޵XF܇?پ Im?XjF?`Q+5?C?ޅp??%F ?߳ B?ݱ?΍ ?Ԣ3?Gf쿱{?ɝq??nS*0?nXYJ?s??V?C\?ق 'RT1?N_?ΗO?9_\(?O=p?ޮ,?~z?ʼ?ɶ# =o?ݜ3333?z?ըG?Q޸Q?33333(??fff?ճ0?:=p?6H 1?q%Q?틅4?֮fff|?Q+?+?z?z_?fffr?߯# =?Q?>{G? ??:\(?m Gf?@?Ǯz?aAu?Nfff`?p\B?,?dzG?f`?K?f?~Q?rQ?]o333"?L(’? =x? =pr?VH?!K333D?b\(?O?p\*?=p?h?cz?jz?G??޴k?\\(?ޱ`?곬̳?7NzJ?fh?^fff? 333?TzG?5?+332?œ(€?aAG@?D?/ =p?=i?fff@?Ú=p?O =T?%QL?zᙙx?إzG?ȲNzQ(?spװ?6fff?vffd?|Q?‚\(?fnz?y$ x?.64?ʎv?V(?B?&Hۋ^?a7?yGn?( ԕ3?u%F?Qf ?@N??KVs~?c?r<6V?⩓ ?SS333(?M878?-uX?TO?ҦL/w?5?|?Վa?s?eEb?X ?'h? M?x[?SDh?5?vȴ?? q ?U?M+Q?> =?Q?qjO?Zcy?R5?<M?yOQ?kߜ???|?s' =E?GD?M??47?>,7?Շ?a/@?Ros?akh?߈'RT?*#?Iau?P.?5(?Wo ?R?P?a*?ZFs?@N0??|?B6?u}H?7ZxH?\4?X" %? J@?_ح?Oq$^?R|?b-U?o{K?m?o?Z>?ْ_/?\_:?sB?DL?">A?mzGM?_2rV?ϲ&6?ֻ{?Zfffe`?ڰ ?Uqu?VlV?@U2am? ʦL-?ا?̯v4?=p?۬h4? a:?=V?p- ??jN5?} ?똤?4n??Edt?BH?nߤ@?g*C\v?N>E?q ?Eʍ?1e+?݋C?=uE?Ǿv? /?G?՝oh?b}T?Чhے?"?c?r=p?:?LA S?dO;?b?PP?~(#?T?9W?%#??;e? =?FM?Nz?Pbڹt?;RT`@ZD? +@y '@pg@?r!R?$Il?hNs?SK?ABu%Fl?SH? I?q[;?mg"b?}H{?RT`?i \?/V?ÀW?`t1'a?H?/$?${J#F?qi?J \?ٵ4^?gr?'m?.a|?☱hr?;5?5p?Fe>?ߖY"?H₤?~YJ?`A:?u?I5X]?*Fs?r-V:?۵E\8?y**?ԁϪ?ծ1g?Ifϸ?܋C?Ւn?Z7M?Нp:?w Ԕ?ow?ϱ[W=?G(?U2a|??⊦ (?d?Ә/?Y֞?`A?D?-픯N?У @?312?X"d?b!z?# ޴?=p?a?k̾? Ԕ?;f?uz\?{xF?$t?Q|?5?|?EXb(?{?T~?2#9?+?u)G? ?\ѷt?F*0M?iI?? y=t?A7*?-@^5?@G@Y{J @aF]a@I[W>@4sl@ N/<@b@-@.H@@@ě@ME@v>6?KV,<@Mxc ?h`@1Bm?LL^?, ԕ3?ݗG?@8- @L@&@!Q@2^5?}@PxF@ G[W>@ mL~@ +z(\@FI8}@=pf?JNL/r?d0?.=p?8#?xҦ?U?l!@?$(7?߰*0f?l?0'RU?j?䲝- ?H m ?z?Dǵ?3j[?ٮ{ ?8Eoh?ۚ?B2?4D?Ղ;dZ ? m\?R<>k?xoiC?1???ڢu2?eA7C? :G?Eʬ?'TɅ?Z^[?e?k^?ʬ7?n6z?A7B?nfffh?C\?YA?SlS?ᰉ?dn?hz?Z?n?@?x+?$[&?#?e4PH?Kz?=@GE8@Wb@ fTɅ@ilC@zv4@Og@$*G@1Wf7@5LUf?@8 p@De@Cp@A@G6@AJ=p@<@<(zZ@4Ā@5~($@3@7ȳ33/@8b@46V@:)i9@De@4(׍O@23=Vl@@Q1?jE?9Xg?U0 ?vL?t?w\(?fG+j???c+j7?#.]cM?Ձ%?u/?ژu=?a^?iR? =p?ge?~1? 'RSv? C :bM@3ីQ@?vG@8*G@?0^5@@E!G@@Qa7T@8hp@<0z@8"M@=i7j~@C^ I@C @3g330@61;di@;Z Ī@=O@@e)@B xQ@CV@@3@:^Q@=qIW@9 @3(=F@0k5?|@*S5?x@@Fa|@F@BQ(@A ,(ˑ@?L@BY@6~@!/]/@ڍON@ @O@8U@ J#9@ob@MXba@ q ? $tSt?ֆF?V>1"??]ɽ?oU?qiv??-}H? Gr?ce?^j}L?!?Гw?Cp?цʒ?~(#$?ƏTQ?tKQ?R??UVl?gUF t?Ƨ?ʄ2W?i#9?yQN;?T/?(X1'?原1?sM?Փ? I?R\(?{?/]d ?OOI@N@Ez5?|@Fs@1*@_q@ F-@n@ 5@N@3E(r(@2r_v@JlC@]&cx@RBZ@L\WX@CXo@EjJ#7@;S\(@8H~@9@_!-o@21&@<9үh@1񘭑ht@A>s@@n@CX*5@?rn@B@kě@Gg%F @C/"@A:u$@A?@G>"]@Du@@#6_ؗ@B?~(@?a74u@A>|@BA _[V@>m޸Q@?2Uf8@BRe@G;b\(@DWa@E'J@EUFP@Hf@Q4gO@E=~oi/@=]_!-u@2[ @')\@"@f@]$@vaG@ݘ @s@UOZ@KdZ@辶 ?s?1qi?Ų-;? y=?9C,?鋛xF?VQw?l?(K]O?K?@n.W?*?rVU?Yr? 5?G>6B?ۧ_?Z?yrw?I?tA7K?ζ?s84P?6uYЇ?+p?\) ?8?_ ?6&? 쿟?EG ?P'8?4nL?؋F]d?Țu0?܏b?țS?~@F?mᰉ@UpI^4@ JD@ {@ A(@ۇiY@lbM@%=xl<@8:C[@Cn/@[,V @R+f@Hȴ(@@ ?`A@8&h@F,5ԯO@@G@2A S@7@?$@6k.-@?Q@AVC@D@Epn;8@GXy@F!2-S@EP(@DXa [@?yZ]@ATeσ{N@H"@@,c1@9sOvk@<0al@<ʧ&@@*33 @=_%@DStQ2@Ap,@AD@BhW =n@=A:@Dzi@>Ίq@>oh@Fv@ZĀ@L6v@@ q{@4}Q@.5`L@)u!@$ԉe@!@q%@HQ{@t^5K@ @kEʾ?v0?C,? 2?Vh`d?󣅅o?L`d?"\(?'??m84?R3?(l"h?bL?\zH8?אz? pd??;C`?(C ? #??vn?ng?332?z^5??334u?h5?|?^5?~?KƧ?ȟKƨ?333?\?(j#7?򳶗P?PhbO?I\(?,A7w?S;dZ@WS@x1&r@ G@ ~{ @E@  I@!Xd@(? =p@2+f?|@E+cS@WPt@O{K ;@NW@N1 U@@D wKƶ@BX'@B9@2fffa@4@O@@fD@5A;df@;:S@AIG@Bf9 F@EߗO@KYXi@Ke:@L@Hm@Ehv@@15@@@:l@;K@7~@<yKƦ@9@8p;@C,R@@wg@C]y@?te@J@5NƧ@6Kƭ@7:@:'$te@Cz\@EJ@UJFE@M19X/@A@7|Ǯ@/clC@%=r'@#H9a@ "@ (Ž@bM@9+@7Xa@Ctj@#Q? =p?cp&?W5?|?S??'=p?Ɓ7K&?v+?[?רpշ?m/s?E|?̘l,?˯j~?U]0?)ش9Z?̰h$ z3?ٸ~?⃵Xx?MfB?Ȓg?Fs?l*@G@F( @8: @G9OS@>a̘_F@2\(@;ɧRTn@:1$.@;jZ@Gu@GB@G?1e@K`[@AZ4֚@LG@ORu@VNL_@OQA @G@{J/@E%i@@Ap`8@AT}@; t@3q@:/@@:ui@Aچ2ׇ@A9S@:~6{@:yhr'@8ffp@7OY@3H'Q@/ 8:@2jC%@:|(@@¬~($@?B[@QFc{I@NA:@AمT@4  @,p [@)wZn@#f1@ؙXb<@w-&@v˒:-@ ,tS@NTT@&x?_o?Qx?,/i?w?_}?a?N7?䦇+?Ԃd|?޸Q8?2?ᓗ!-w?cC,?OX?FS??[9?1҈^?ԃ`?pSخ?3h?J7@?d!7?I"?ܾ?>C\?Z9!h?\҈?C?FP?E`,?P64&?I^:@^5?@3F]c@lM@,<@YC,@0t@vVEʼ@!i >@+*@6vFX@H}G@Sp8?>=@E8l"s@C6,@B.'ݖ@=]"@GW+e@OZh9U@aB xl@:+B@A/@I>U@G 7@Q3.~Z@P O@H$X-W@KXy=@Ihq@Iku@U?7v_@Xx@]@SN͞@JϪ@@@6]b@8^:Lz@@q|6.@;_&L/@G5;=@D3z;W@?m\@;@>Y`@Alx@6j,p@.5kP@2P"e@6--w"@7p@5Mz@@)@Gg\@Dc+C;@P_@KS@A&L/@:7G@2>4e@&@ʣm@g,:@hQ;@s0 @IbX? r ?.\? 6?Av?<{wR?أ 6?N;*?fA>?"e,R?Q?ctj?&₾?7 ?O#M?iDf?ᩓ?DIk?' k?+?OE+?;"?C@?k?=p?" ?h6Fp?zG?4qTɅ?Qx?\7@(iB?&g?״3@Ƨ@S$ x@?|@m@T`^@0΍O<@}Vl@)gW@4 =~@CC,T9X@W%[@P$Y滘@ME8@C6^\@B!.ߞ@APȴ6@Ah҈@@+u2a@Se@G0 `Az@Iwȿ@Q`>X&@`f؆YK@cSs@^[3\n@Kl1&@W#V5?|@Qݗ$tX@U` >}Y@cS~@hxy@cA I@`U)@^20@E[@7&ږ@2!-@4:@@Y~+@8GA.@7^b/@9W@:5 =p@5@;@8\\(@2iD@@^Tl"i@G$}@E@:@11@W^?ڎ??j~?؛Mj?U2a{?ě ?=aN;? s h?k?hr7?!vȴ9H?j?uf+j?z0"?<n:?nfffg?fff}@ @\ݗ@>@ `A@@ ϭ @YW@ϟ I@S@MƧ@#NrGE<@0`A@ApD@UCR `A@G_;dU@HW:p@Tc6z@@uY@:2V@81W =q@B;F@A`y=ـ@YW>3@Ql|wn@T%L@Mzxg@[ Ն@aor @^",;@PhyY@Qs @a;@^SCI2@aַJ@VL1&@T,x@K|@@6}U@4oo W@/`A@D"g@0,@4ViB@;PO@4PCև+@6PPj@8\LLy@7gۋ@B2(@@0 o\(@5 I@1z>@=m`@?5@>_@9~%@AZ^5C@@ M(@I2J3 @IG!`f@Xs9aB@K?j~@@ \j~@1kO')@(F~@5m\@ól"h @) (@j4m@ =S@"7X@? @Z9X?r ?BzD?鄈?Ƨ?jL0?G5j?εD?hYJ?XYJ?j6v?hEv?qd?#XQ@?o\(?z=p?!US?9^5O?ׯKƨ,?𐁡?!fffY?ěM?/lhy?x??fff^@&@=p@A333U@m =x@V\(@vȴ<@Sm^5?z@:n@g]|q@"g337@+@:Ƨ@QkT1.@Lh^vȠ@F-h@Hh-c@Gup@BVh-@:01"@B @CDR@L@QӘV@[ 4jv@]S33.@AD@J @WC@`+U`AN@Rz+ <@Mل/@Av a@7u !G @1|XA7P@/ֳ33@:9nz@8S@3Z@4bP@/B\>@2{l@>~G@1E*@1=p@1dB\@67=ٙ@0kꯝ*@5tq@.+@1{ffd@3kʻdZ@@9X@7K%`A@4$ ^3@Affq@=2@>//@>9K@GV@GXffh@H6C|@W @GZ@@Jƨ.!8@Dv'@P ~@QW@E|@O0l%F@ER4LC@Hx^=@P6r"@Bv^vȺ@Eue+@\a+ .@^5h9@d@cz1@ScV@TP1&@6fp6@?ji@;3@@vD @07;X@ =p@70U=@2AϠ@2<4!'@@ҥʾ@Ry@5Ba|@6݃0@<͔i@2s5h@10@3X0U=@-*D2P@3x6!@:@+kP@:u*0t@6X_ @L .@B`+޸Q@7pe@H@=Ik@@svFj@EBeI@HUα*@MoR9@Rᦵ@A/\(@7 (r@1>Zi@(.Eg8 @ A@N@1#@ h Ԗ@َMt@: V?+Y?xNQ?_o"?@k?+\(?쿱?hr?ɂ _?iȿ?j?%n ?zG?&h?F\?x+?Dg8? <6)?"a|? N? V?3.iB?MjN?9;q.?["e@Sv(‰@ 6@ ")^@J@l˾ߤ6@"}M@(qu@0W0@4ƨ @6fW@8&\4@@fX@ZQ֤@T&6@J\#@H st@ZzTV@U0ȝIM@L;ܡu@Fzn}V@Jap-1@Ty:c@N +Ƨ@TF^B[@By,@L#ć\@^[zg@BMLc@J`Fs@Tx1@5Na|@*c~<6@6J@G/@PG.c@M(²@"3 =t@=煰oiO@:H_@5F]m@6I|j@9oU&@3`PA/@2m\@.Q@>7HK@@!G@Dȝ}k@6$=@1'($ l@:˕@62@C+@5W_䎊n@H׬@Hg B@H|U !@=_!-i@E[W@?4@B7F@F_@By=@YCe@H#Dg8!@;Knz@2@,14O@$s-[@6Mj@v@Q܇+@ LR@*X($ K@/T ?z=p?-U? ԕ?U?cjg?/lo?/暚?͂?~(w?WV?y?ჭڹ?_r?g?&1?հ/?4p|?a?u^5W?A ?^ ?ohۋ?]c@V@0U2e@>BZ@TdZ@L@#+$3@,c\(@5#@?,8@G~@L>vȦ@UO(@Q@Le(@RZ I@^ffft@o7<@c)8@X%09@GVϲ@Dz I@?*a|@= !@BF@Sݞ@B =}@8~@=,c@?y"@J߉^+@9iui@2b*@16z@HϝY@F}p@9@)8 (@1ǚF@-7@82 ?@357KƧ@5@)f3@2 g@:^@=`MO4@@yo/@BV@1 y<@5{9A@=" @4j'@> Yb@31 =p@CT=V@D-O,@Jw&) @Iv_@=pF ^@A&@D z@;X>!@FjJ0@R/ſ$x@S0ہ&o@@TzA@5Bc|@,LQ@#-v}Vl@ ^@Pvȟ@C"M@xt@nux?+2L?=p?/<6?A ?{6?⟻/@?У ?T;8?.ݗ?X)_,?3Fs?wpA6?OCZ? ?z?ꔌm2?T(@X!-w9@#o49X@,2ɢ3@5).@A=QlH@L^e+@XX웥@[05w1@V~n@XXNWo@R]JkP@SNx@sw z@f@e 8_@Lj<@: A-@(w@.}\-w1@Ay˥8.@;ɅN!Y@;@Az@5 n6@@<$%@9A@*B\@(b+U@+~@-lK)^@.!kqq@3vv@;a@0Pv*@9RkQ@@S/@2)3ny@%$/@. ȴ93@,Ufi@3c{@38n@7ļ I@49W@143@0Zj@(ٲk@1D+f@.ڲ@+ [UfN@=>@6z3@@;@L_@GdZ@?ux4@7}49X@=@i@Q2e0oi?@I@RAx˟@Il\(@;#v!@.UzG@'@ tZv"@ "9@? @@4?N֡a?K?XXy=? tjF?E#T6?&_خ ?BK0?hE!?Fޮ}UF? :?Ae1? b`?u\(?X?333334?늺=p?(?zH?p\(?? ?3332?Q&\(?FzC@@@2@Q@I\'@хR@zG@$lR@+yQ@4 ^Q@?p@J) =p@WY@_K @\H >@ZzI@Hp@g58Vffi@fٜ@cօQ@affff@Qdc@.@475]@,\$@Bh‘@Fܙ@>P(@5^ٙ@0h@*.k@>wc 9@-pk@.Dz33@ @#`zE@8/xQ@A>(@S{B@4Yxz@'z@% I@%M̵@5&ff@;b# ;@=B\@6z@- @7f@@,,z@=\(@8&=p@4zG@7R&ff]@A1Uc@CXQn@F ^@@Dzz]@QB@ER’@U"a@OzH@F3\@R V@D@|(@6@@*5=@fffa@<̼@ օ333@Q$@%W?j\(?fh?(}?\(?:\(?nz?٣332?!G? ??G\({?\(w?”w?'N;?m=/?O?8? ?+k?c}? ޱ?9;dZ?wiDg.?~?PQ?Nح@[z@ hۍ@ zy=ٜ@2b@]_@#V@-)*0Z@6j8Y@B@<@PM|C,@`V`n@bJLC,@ay@X-&@Us "@W|-c@ipy@ew@fAƫ6@VuB@JN U@/½N@:K|#@46M@D/n@GibTzB@V 6ߤH@N5 @G%@E*Wh@5@38h-V@+}Vl@0) @0j͞@+A9X$@$+k@~($@.X#@-8z@15?x@9ˁ|@(YK@"Nw@.\A T@6݁7G@.J:݋@=r@9v@>JK@=ظQ@@7,<@;Xt@3(ԥ@5->P@1hB# X@.L(Xyq@2P)@A״'@;?l[W-@>>vȵ@Dmz@? IQ@Rr @Gd1@SsA^=@GN_d@6pңF@'1l8@1*0T@@ ߛ@Gq @?jb?F!E? =p?HN?J#9?Ú͞3?ï?b~i?͂䎊9?J ?H?3tL?bM?ӳ@N?M"?}!*?z+h?X=Y?􉶤^?ڽy?@?r$/)?~p*?pJ?3?*@s?@=p@ ȴ9H@84@tj_@ %\K@(o|A@0Q X@;/~a@E?@T5OFvȵ@YtfQ@aM@b#@b@a@`I@V0(1&@S?{_o1@`:7P@Z1@IC@@AQ-@BF@B0x4֡@4H@KDK]@Q` @hDXC@NDbwl@[Q@[n [@J;^@4Zm d@2@1Z@-@ &i 7K@!kW =@)l'RTY@,<8!R@ | =g@'abT@)}u@)\M@0S` f@(ϴ\@3-?|@7(@6@?kD%@-ac@3@6Y0 @Lv;@BIu?|@7T&5@,I\(@3 eNp;1@2I^@']/n@8x ^H@<%}p@Fx_>@G;@DJn@PPFs@G @K*8@:Mν@+4{h @!8d@ =p@ >p:@t @z[$?A[@J}p?6Pu{? Kb?GdZx?Y^5??: I]?@2nn@4M%@/ο*@5ܽH@EhK]@41&v@>@Bě@8@Dt$5@G@S-w_@BӼR@7:Y\@(r+/@.@ᰈ@ ؆YK@ @@&FG3@ };?1'?kMj>?1E|?j~?9'Q?Y{I,?T`c?Fs?1'?(?kC? _حU?IG&?2W`?r$L2?D?۷j@? .\(@ŨXyR@"n~($$?8B @0 K.@1AC @3z&1@8,.c@4NiDk@*J6ٳЂ@.8;dZ@'-nl@YnZcN@.My=m@#7(@#z#cS@F@@XJA@@"Э@, J@-*0@#UQ@%;R#9@.iHK]@3p 0@4ڀIH@4ݹXK@1RcS@?өy@Bl@B|RyZ@9-p@7#_?@>0Xb@4Qhr@Aqа~@Ep@ErUs@B9@G8y"@Q- @KzZn@;܍1@.'Y>@ _}Q@F|푆@툵Q@'@R@ | I@ @bE?9XZ@XJ?P*0u?^?H?·o?t2Z?磍="?Y9X?D#8?У %?gz?G?[*?/??>f?2Xbz?%@$@*@&o'@`Ɵv@ fffh@^n@(Ut@75+@"`C@%.z:@3@Bvȼ@WX4+@pxZ-\@W6>s336@U׷@]nx@^ä/$@Y@Um$z[@WB%`Aw@?~@.%S@2O;d@0G@+2\(@+7޺^5M@& @-1 T@*뙙@1[@;_~@6FzQ@8"M*@0:nz@3*w,1'@/1^V@/CE@2,$@2|\(@1f߾v@2}b[@!e0@ I@G@ E@7K@'(@^5@p:@-7ě@7O;j@#AA@#fffe@0@4Õ@6QFbM@3h^'@8\nz@A =w@NZ@G6t@G)x@B<@>Ԯz@8{mU"@@4Z@Ecp@F#b @A\(@HQ@R5p@@hr@0{V@$|Q@&^5@rх]@ޚKƧ@\j~@333:@ Z @ԟv@* I_?7L8?o =?:E?ȴ9?}- J? &y8?"Ϯz?}O;?7KƧ?>B]?n?ʞ-V ?%0?@/#9@"bM@+@cA@~:)Dž@,?@p @ He@~ce@ $qu@$?@+фV+@5- @EX@Z`PR@U[~@Ul@XEu\@^G䎊@Dbu%G@9hۅ@Qě@C`eZ;@8b*g@.K]@0iKrGF@0p@3fbM@.N.}Vr@(̖Ow@/EW@' Q@8Ĩ\v @5Q3]/@L.C@@q@1*sh@8du>@3Ca?@29}<6@=yf@;G8Q@2@9ߤ@@,rC@. O/@2F$&@!x A@"v@"'5u@$᭣S=@)\@ h @&Cj~@0vȠ@>BZ@>GǮz@0tɺ^5@09т@19Qݗ@B{ᰊ@E<-V@E-8y=@Cὥ @C@L@@D2{@6w1u @E]IQ@E){@OA [@Sg@Ni<(@YBV@E1@4;f@)2=p@ YZc@J79@ @|>I@ȣ =o@Dx@DelCv@rN?ta@?b7"?'?rC,?蛹n?^5k?S1?> ?H ?>2Ϫ?4(˜?mF}Vl?rc?M?q6?7K@,z}@A@i$/$@傩@Gx@zxl@s|@!:&ⶮ|@'ffi@0]zK@:l1&@P^S@`n@QU @Q_@S;d$@Kk8F@Bwo2@4S&@Chh_@<óa@4bM@86ϐ@4xsg@.Zn@7U@(+? @76!W@46/@3@@3_b@2e+@@OC@;pS@4ݲ-@39 k@LC@/@0@NzH@A7L@ *L/@b8p:@h?-?,m?,=?7?^}m?7$0?AyB?~?%?n.?\9X[?Ov-??(C,Q?Z@vlZ@&C\@^Jě@EA,@a? @z 4@ Z G@>=a@ Tɂ@)@@6Ǯx@D@e+@S)ߡZ@^>:@OI@@O&x@LTA \@EJS@;bU@63@5t9X@2G@:L@8%GE6@8y=@2eʻ@/YCY@0*Q u@3m u@*- k@1bQ"@43=@;!Zg@9*k@H8*@>X@16҈@=ܬ5@@%{@5>J=p@5譝-@:r@<@N@2xw1@2qi@*@&@릀Q@*f4@0ihr@&?^@"e`A@#nj~@,_{L^@#3ҽ)@ @J@QS0@M @q@+kAQ@6gn@B@T@YʒVշ@OCA5@Mi;db@Hz,@BIi@A؂@8N AH@8d\yX_@9Ʌm@=1=ِ@9&@3p@0R"Kƭ@1*r{@6)^ ě@7"g@#^ѵ@4🂏\ @6go@7$P@:@@;p'~@7d㴼j@C^҈@@e"\2@FXFs@4os$%@6m&@75<@=E r@1n6@%v`W@*A]/@0q^Ѭ@-n0@3ʦL @3n6@0 O@@+[:@$䣶@,_@-J@*NzT@.@.Ei@8=>%`A@@@)a@?nz@A!F@F{@Iy[`@Fz@Ly@H&h @EW(@D@E ߤ>@L0v@GA9@Y$&@My@?)}Lg@8벰 @3۞̲@+tB&@#V@D@Qp@Z:A@2@7@#lCu??n=?BR<9?=?t]c?ߝ-I?[W=?n?: If?fff?#??Lr ?*~@?5@;\@27K@ ?|@ s@-*Q@/@zg@*`O;m@7Q@Dj"^@S_KƩ@T|l@M=n@L<(@EH5C@Cg@Et4@A]I@Cb:G@?|h@BKƮ@P`5@Eփf@P5\@VI@T0&@Q eT@HFffH@B@6i*~@.,1U@"A/@֍I^3@4{@pȴ9`@ԭz@ ,"@F+?Q?7/?;dZ_?@ěK?AW|?-\I?W5?|?ԧ =p?␀҈?eQ?@?\?`|e%?£6@ ;dp@y@v*@Q c@ `7@ @ IcI@IQ@=p@0r{X@7q_@GﰧE8@VҰ#@UZ@N>@K/K@Ea@C,9>C@I)@Jie@GP(5?w@F]ҬT@@p 0@< ~( @< s@2ۣ(@4L@1]Vp;@FG@BiTz@/!WQ|@(ЭJ@0/(( @3l6c7@1WVqu@4dZ@>&x@60@)y{@*ix@33+@5)X!@(~"3@-@[6@) 6E@% @-N@7y=@*;Xa@1/OF@5>_;d:@5y=@7鬶}+@6{0@2ZCST@V&`Q@NCnMF@DVp`,@9eOͧ@,ƅ@$%!@ 3@F3338@lk5R@}e#@l*@*bߤ?@7Kƨ?!-w?X?tS?7C ?*?~(?z@"?Ce?̝V?74`d?<$h?~ѷ"??/@ ԕ@ C@ 3 @,zz@ &Q@a4@0 @+@'Z@3:bc@BD~6y@T-@V* -@OÜ@N. F@E0%m\@AS@K65@JUa@FZG@B` f@H1@@L`H@<_@:V/@2a!G@.۽@@4/@9M@=וzP@3@1$O@6 "G@9$H@2V_ȴ5@#PG>@0:SN@4W5@>hXPM@2/)T@9UϪ@2N@.(Vl"@3VhS"@-Iɺ^8@;A(K]i@.ѿ@5MI ,@8N~@3F@Av@J%"@@{wv_ط@4cU*@@j=p@8!3@5$@; K]@B "\2@H+@N&AG@E^@Er@GAkJg@BF@K^ţn@B\@9h\*@?K_o@F9S@Hi1LIZ@EM ᰊ@XUd@U+ahr@GJ@5=@-k@%'@"BI@zG@U@N@$1dZ@0YJ@?a#@\(?Y8?gJ#9b?SRT`'?gb? TN?n.?ޟ&+%?P{?<5?|?-ݗ?Q?s?LT?IM@u@@v4g@ s\@ @lG@l[W>@X*0T@y @)Z)q@3Tr @?U͞@Pz(+@R hn@M6+j@J{l@FX@CWT`@CGP@GF@K#O3@DiW@Cª x@D@DH~ (@:@9g1@2["IU@0ڄ_o@4Pj0@2w;nz@:J@=H@@(۷Kƨ@3>ě@+v @60U.@16+j@8QN4@/N/@+|@/E8.@=ą@4|k6z@:0#~@@l@KW4m@DOn_}@=+~\@B=_@03P"@:t<@2v4@>n`@84֢@Gly@@8}@8sMj@A+7C@B @F p@Dhu@B^J@H{@X@9@Mtj@QnGe+@DM>B]@?rp]@?흣e@< oDN@Bm[l@G=jD&@]u[WI@R}@>cS@4n5@0j˒=@(R@$#9@!G@O@ Dg8@ZOvS@e@@&$@@oiD[?#R?_G'?^50?TɆ?64 ?dW-P?hc?|RѬ?<?a+q ?a?@@CZ@ Ǯz@ ۜȴ9\@Oݗ@BGr@;@rO N@ @'^_n@4kA<@@Y+:,=@Q9CD9X@X`JG@O@N͢ I@H;O@F66z @@wm@D>m\@Hv]/@E&@AsNN@@lc?@Euhی@BC=/@;m쥮(@6%F@7TP@8,',@9 \(@2ou@6'@@?Y@3/c:G@;^A r@Jq]W@:I8Q@F9A@>׍O@=߈x0@V7d@Q!B@XrNE@` APt@Q{,#@H>x7@C\/V@Kh--ON@AIRxQ@9 @2t5?@D$@G俾w@:(@+="@)h{(ˆ@2b`A@>n(@65 fff\@4кG@6XTzB@D5@4no)m@<bOw@?^\(@>vQZ@Ck*%@@gJ~@BtƧ@I-Kp@PsR @R? =*@9(-@Ab̝@=Ȋ=p@05gn@-E /@&?i`A@$%M\.@0cffi@*glO@?RO\(@DOE@DV2 @A^@Go!]p@`&(@l0Q2@V@cB7\)#@]|{@R @FQhS@@H|(@8°@Fd1wP@^$Q@W\(@HP_@E 'X@8M73@2@*3Hɺ^<@"U,@fffl@Vfff]@W@ׯ;ds@C\@332?(?*Q,?z ?I?̍?Gj~?aS&?݁$?I"?B#9?fjVt?fA@Ǭ:)}@M|@{@6 @ @[c@b@@ n@" {T,<@&т@.¢@5uD@I]g8@\! U@LVǮߣ@LldZ"@L{-:@GewS&@F q@T`x\(@L|H1@Cй5@F Q5@@(~iO@A;@37V@=(@9hۀ@A4vO@3iu@<ާ =a@&@/?@Bc8@2- @:b\)@; ^@822@?Kt@B'p|@:yz@N4 .@F*@A1Kj@Erd@Azgl[@\Bn@Hjᰉ@Or- @a勖_L@D<,0@36iy@0hXyo@2/@:)33@@9\J=p@:L@BT҂@V4j@jMw1]@Y) @JbL8@[$>]@jz@[Ub@gAdY@\nex@^ےX@M)@HC!@Z@AGp@X,֫6zb@g@R]~@OC@BaO@>_@1o!@*7g@"DRx@̼z@ }>@G@# ['@!ޯO @333=@iU^5@,q Y?c{J#\?.s?Qhr?\T?ߊ4?rh?=?;?˼wk8@@N? )y@,y@ kv@8@MVմ@[7Xy=@YQ@quM@!o@'~n@@+PBYK@4E_@>\2@JCo@W>g8*@MmӎX@I;c @Oݜ@K UY@U^5I@WI@I-u?|@HRPOz@@2,@=-YK @5jpS@;#ڟh@2Q@5?(r$@E6e@@RlU2z@?ӮaG@1s"e@@*KB@3\m@3C@69K@4>cXt@2,,@D I@CV^vk@6)x@mav@Ybڈ@K @P$z@GX_`Au@Dpb@GGTxF@Cpy@R@3@E$S@6 d1@+'@)L"3@6`A@M7Ak@>{p@ENg@TGMj@M3Z@Rp@P5oiC@mwczڹ@b-SdZ@Qp7y@Oy).t@5jz~@@@'݇@Ic`'Q@;P@88`@NC @?ύOw@7 ?|Z@@l@MfG |@Da4!<@;@8dOL/w@DJC@DC|-:T@Vl /@P@N@`QȲ@kDMӗ@Q{?@\& @QX @I*m@Rn@k8F @qE@@ed@V$f<@M`AW@D+j@9Wk@P݄QR@s@uW`|@qc@b0@SfTi@Hg`A#@>!@4],@-0@@"U/{i@ =p@@V^5V@mD@J @x?[*&C?i?[CR? D{?s?6+?Zg?G{nV?[?2=p?C >4?hr?ptjk?Uͽ@+8@Sú^5u@9Xt@ ^A7@ZVQ@r@]C@ 4+@"=@&+ Z@0r +@5Bc-@@;dX@RPn@X0@N(ٙF@Tk@[o@Xt9X@\Q/@9:G@B׫}@J1U?}@]0U@g!ZG@]O(@Q!&@:S;<@#t@!~@x@$Hfff@"$@#DE@0 c\v@)+@0 =@6oO;@F{@@QdZG@>@n@*?ffm@3@և*@E @^A* I_@I% @B8ٙ@L{@6"@AS˂M@CF$@?hp@A)x@?ȁ6@BS@A@FkQhr@B^Q@Qj =j@aEX.@SnLO:@F:@\<8@vL@oQx @f!70@Vw]@M%w =4@FjaG@>Q$Z@4Z@@+j =p@#>H9@@Љv@B2@qw I@O@bn*?ݰ?@t?)?Vb?ٖzb?ϫn[?ݵ7Kb?[G?Sż?zG?cI?a?Y?[W>q@"@ ~@7K@%Yc@ K+@f@y>*@=%y=@#8@'23Z@-Õ@3;]@<@GwF@XA"@E_|@FmO?@TӸ$ ~@UNa^@J+S@[⼼ja@DNk<@X3@d3 Ԅ@n=<`G@gkkP@U^PN@? Mj @%Ŀu@%g"@#C333;@*% @/TV@@0N;@8z@A;l~@5їs@8Gnck@MsYy@?hAc92@*tjw@7шr!@BܑP@Xs@hz@7{Ca@;eT:@Aj@D1?@8j0@6>G@A`Z@0ߤ?@5kj@D~Jd@6 }p@E1j\)@IDA@G rE+ӷ@9J_(@3Les33?@1A+@1ibN@Zb@>څt@;?T@%Oڅ@0;dh@4C,<@>g @F޲ (@Ev_@Ffȴ-@E(r@>@8,"g@.u%@0C @1]`>@.g@0Ψ@6O>sMj@85b@A:^5A@Fl@Nq @i3Mj@,IU@/Xq@EW.@#E L/@#(@&~@0,sMj@:J1`@>c$p@Am2@Ct@@lN@;=@7}Hx@4K@) =b@, o1&@3䎒@3 `-@AM'rm@5ȳ33.@E @G,֡h@B!vl"@3'9W@,q;d@0Mf@8=qx@9s$O@Jj/4֣@?L@Bd@ (”@&m@1 @:fC@ICS@UỈe@Z @dRL@txp@nDW˒@H15_@Pdd@V"|%@TFųS@U4Wح@k] @S& =@Pc'@]-@>u =p@D49X@;S v@9M}@7"@7B@<+ X@6olE@%Dt @65Z@3=> 4@3ma@@(5X@0P@4z&@07e@39~)@AVd@6]^@2nO@7aquv@2Rs!@=DTu@7 @DE\(@8\2 @1ġ A+@I;!@H:@@];ZG@CݼIX@QՎF@5t@F'/w"@,$@1<4@7/RT`@>s@Eў}V@P]KC@6!@3U7Ʌp@Ee@A,<@pר C@a3Z@P~c@M9$L@C0@7@2:)@,8$hr@$Ȃ2a|@~|O9@VG@5+K]@ -UrGEb@ 1@Ұhx??gVf? n?Ec{??!X?V+?}"?ua@X??*\(?ᙙ? zG?S? L\?}G?fffi?  =@ffff@؏\(@ Q@d@ E@Y(zF@"L\)@,v@8 3337@Eu{ @Q^)@_ꀣ@d,/ =p@p0H@k?@Ae78Q@D+p@ME\@N)y@Ta4>R@V Q@P@M# @@P<@9T@:n5xQx@:l# M@2)\(@6o3@1# 8@8/# ?@(?̯@$Ǯa@#Ff@"\(@5W+@(WT@BH‡@2B@7Lf@7`+@73\&ffn@)aG@(R@9\%@BþUX@6z@fr@" @&> @,lk@:3DJ@G2a|@X#Ÿ@\%"@\"f@TV"@@͑hp@Aw@H=wO@ArXi@G4@i@dO>9@^$@K9 :)@A7\U@55?{@3Ѕ@<5) @5bXt@1`L@,.8@7?tS@08F@"%@lC@%%F @4{ @xA̲@:F8@@b\!@;w @7ǖs@8a!Ж@HU@BI!R@>#@=/h@6su,@@O"@4!n0@::Q|@A+~@4E^@Et@Xv@A+ Dg9@@A|@qy@cG@Sa@>5@6E4jw@9l>@5K@.@#o~@#pe+@Ez;dZ@9=p@y=م@ltS@  R?q_ح:@x`Aj@J?ybM??y=ُ?M1'?(2U2@B qu@ARtS@Msb@dN5@c_ըX@Og@Et<|@6D@7E0D@0pYJ@,݂ I@:n =n@,u˒)@6Q8@&eI9#@&ژ_@*ϧ@*s@?`P1 @@{Q@-iMq@3Mn@3=_o&@.hd@52뾫6@*/1[W6@56@;|Ko4֜@6S.4@7+.}VR@5cvᰖ@8m|A@<l{@7 F]b@8^EYe+@?2,@FAa@Ey/W+l@ABXc@AbV@39xqu@8t@8/I@<"Z4@-; @3@G):@Q& A9@E"ޫ6@M,@`9Oo@YX{t]@K4@5?|?qG[W ?Ibc?uE?𩠃n?1?f@u?*0,?7$@P`*?bfff?8cr?ohۺ?7lE@FFG@@0؀Iz@f*|@Z I@$yq@05@0]M@2L'.@4_r*0@<{|@Jf|D@gO@EfyЎ@HdZ.@8"=p@R,M-8@d:ѭ@dœ+j@KwqL@/Yj~@6$/@)|$tSx@.v+j@5%-@8x\)@9`3@'JS@&9Lz@+J@5օ@)2P`D@2kqv@9^@7}@/WUL̽@16\d@$}/@24?@1U8}@3;dZ@7gH%F@3'@<k6z-@1A9Y@Epi@<3<@:_ح@9= @<8?+p@Cp@A L/{@A(ɩx@@ dž @7)kP@:*+@6M@2gi@0s@7䎉@D6B@I"Լjz@OWD@b~OvM@R#TL@KTD@G5A R@9<޸Q@2pAn$@-F]]@.I]@)ey@%F@`d@P @g\(@T2@ !F]f@[$@xd?GH ě?Mr?3q?I^?(tSp?קv?8QP?ۋ ?,ORT`?8)_?Qu? *Z?=[?SC,?Me"Ь?#p'?+H-?5X?1ZiB?e@\\6@cS@ 6E3332@f#@ *0b@ :dT@6@$0@%0T@*ݗ@>~@TB3 @_hZ@SL @D$v@J!Q@Q@H@Wǀ^@Xߪ͛@R47@':PEm]@2a\&@0Omn.@7}D@3#ʌP@9-Pv4 @1>@> :)@5l\KƧ@3{@52Np:@4@6_7K@2{ME@7m=ڽ@67k@<dZ@7> [@3@KU= @8H-p@0lF? @<{h„@:Fk@=Բ-@=0U2@E@ i\O@oil?`@h? ?.uOG?u!-?M?W?zh)]?8rGY?CO?VRL?\)w?\}? bMҡ?J ?j$j?|fff?wE;?*$/T@d ?@뙙@X=pG@ WA@ *LI^*@.\(@\(@^5(@2O@+@(1(@H}Ǯ@QB @Kx#D/ @`=O~@Kx}I^@N\(@Pt{"@PAK@PbͰě@C @7,~ =@7T2@-c| ē@,%K@/|(‘@2HQ33H@4r;l@0S@)oě+@1/ܢ\@)^C@1]-@2R^Q@2q4jz@4S<7=@7݅333U@6Ϥ@:"1&@@aW5@=A@4چC@4@3׽@529p@4T\(@? \@9LXx@@:VE@6qo:@4*b=@3R?@8b@=k@=Fև*@@UV@;"@=ɯO@=[~@A=@;c=E@K3AG#@ECN-@RJ@?ܗX@D$@C|(@5@t{l@=dZ@2Z@*6O;G@$O(@$v'.@'\(@%bM@-`B@vf@~l@ ?! =p@@*W?̝@ȴ9?ix?[S?"?NQ?ZwF?ߓ㕁? k?*?)*Q?4%?(gOQ?B~ߤ??L0- r?嚌j~?(?M@C?U?0ۋ@?{@ I|@n@  +j@ 6@O =(@Tn@ᆶE@C,@8l1E@Dٙ@Bg.H@>I3|Y@JrW@\wQj0@M;PA8@MOv_@Nu?@FdN@@{G/8@B@CŔ]@86Ϫ@35KƔ@1 sE@-\(@0sbw@!ո^@.[@#@m@2X =a@'nvȴ,@8C}.c@8~\@: uiDZ@7@8"@;pˬp@1Oa-w@18&N@0' =\@1]cv@<匹~\@=F87@5u4m@:z ƨ'@='cT@8M©@6PM@7c2W@@^|@ r?".?S332N??^K]M?z SG?yVffg??&?O?: ?؃o*?4M?SLo?%}H?!,?uS1? &w1?u=zxn?nu?]oh?O$tSL@PD(!@a @upwj@QE@k@,ȴ9'@qn.@ m\@ׅ@7偰@>%`@2K]IQq@6j@@ N@O|G@VZ@C븺@GH @A}F@A1@9ʏ\) @>~\/@Au2ay@rG,@.9Ǯ~@-p`A@1#@ ZQ녬@Z_C@,?*@){w@1R<@8bV8+@0kj@:Y@0P k@-}@8@\@)D}*0@'|&@0e6@\@7 q@-&Z@6I/# \@1kd@(!Iȴ9p@0Wlv@-O5@-]lf@?Ls@"c|@?CT@P@# =p@EϪ]@,7?viDf?~Τ?ߴ3?~9Rh@U?@O@Xb`?M͐@ZbM@y쎊q@S@t؇ݵ@1He@0;@'^5?@0qRTe@7=P`K@A*%@P Q@TQBC@H@Lvg@@ @AEx@@:|@CxA@<ffL@;g@6ݑ@@.J+@1w'@0R@1%@/jo@6C!@I@,J@3e@2Q@5 ;@7;=ګ@3"o)@6sϪ@6 @)B;dE@+2_@47X@6jd @1Ϫ@5v@6ٙ@;T@1 P@(|wk5@ֈ332@2~Dl1@3W =@@0ʙe+@2眙@-l@%'@2-#@Ax@])|@\/@RqJ@B=S@:i=!J@7@7@ k T@-6C\@)g@%Dj&@9rGE,@h@Ca@&@,<@\Fsy@ +a@/:̥@X6O@qZ?}w1?*BC?0R?LO?6_حL?KU?%?aV?5m\?}1x? ěn?ԣb I?+?杯͝?'@?J?B ?ހ*v|?"^AH?a0?!{P?Om%?P~?V?w]n.@hq@QnA@ooXbV@ (ȴ9`@ ) @oh@'h@ MI^3@"v+@+74@0k @8&t@E|@U`X@Z2c@N5#n@GV4 @DR@C;vx@G㥔H@=_UG@;BZd@>=l(@թJW@9o@?r@w@2Gh ԙ@;3t@5}R<6M@0E@)>6@.ך9@&@-m\@=[X@8ᰁ@Qfffu?y ě?x?bmv? (@II^i@Q*@ f@ ڥ]d@6]c@ =p@ťT@!Os@&kk@1@=̆/2@@Qv <@K ]@Yٍ7;i@[˃qu@JG·w@Kx5h$ u@GHoiE@E}=j@Bqk@B|\+@=U:@:OR@?,@?j.S@B>Dffn@4Ca@3fL@1 @5hO'4@1 -V@&;Q@@bR@7 hT@Aä/h@>sH@Bq6z@?;͸@;]J@:JP@8A˺^5-@A ,"h@:mYb@=-@AN@C2G@E{@AG_o@7L,@F.\C,@H9v|(@[{߻/@Mj\$@@ ԡ@:tu@7\1&@+q@1]@N@*}ɺ^5@'[Ђ@&FPy"@ s.D@He@q @J)^@ě@o@71}@{@Z{?333? _c?V?`O m?s:~R?Xn?ٚ!)D?(?hGkP?Q?1'?[T?၉ot?ۈ_?0?$zG?ٶZ~?xv,.? hr? :?1&?2PH?_͞?_;dS?MT[?\(?"h ?a?##s?#Y-w1?bM?7y@'E@f'P@|k@ ME@.%8@QL@LV@%hʌO@,;dZ#@75@Be@KO I@P^s@V>Z@MaJR@KL@GM@@x@=NXC@8cS@7iQ4@.FP`3@4ܬ+@2gf@czF@>@?9>6|@Df@~@Ln9s@N?9W@G>Ϸ$@@ }@3"y@2f@/)v@"7@!iF]e@# x ~()@ L1g@ l@/{J@1@9@q@fGP@;?bݷX@ (?($ n?_3338?C8?U2ah? *A?{ޗO?[;dZ?ڨKq ?IY}?Vap?Mԕ ?⠢?%8V?& b?:p?xn2?>bM?nݗ!?}N?@s?'3|?xr ?巡J?!l?E83?R3?z\(?v L?-=s?!Xy8?xl"h?/@ߤ?@T`j@@aV@ Ģ@ o@xl"k@x@*$+@$^5H@.e@8P4k@=U<@C@FO=p@RyQ@[$@O^vϾ@IT@LQ@L$1@Gd@EYJ@@@ o@@p!t@?PË'@A{q @7sˌ@9NK@>>LE@>H@= @>,<@? @DT|@AuW@@i@C&n B@Bzq4@D@D .ߙ@BFLV@AU>@Ct@AEP@DuS&@PBX3@Y@/@H_e @9_}p@6>BZ@2f@)]ci@"AToiP@"1Tk@R5?|@ l@I埾v@A7N@i*@hj@?^5B@?Q|@n__z?`֧@0;5?=FQ?q:?yEʺ?6D 6?1a?"ߑ?>?Bݗ?%hqj?~l"g ?Mj?0#w?%s333#?9Xt?#P?ӲpG?C\?aݗ~?u`Af?ѨA?.?س۬q ?bY?xC?u 'r??f-?ŴZ?Q?2cƧ?ej~?9? O ?9X ?ޕv?:)?3@ nY@m9X@?/V@ W =@(,zx@XJ@ š@%`Ҋ@+oh@/ f!@2.T#@6% @C?fx@Ol!-k@T8@W!z-$@N =w@PqP5@O%m\@Bu@A\@@9\#@ClA@Bs7@8o@6RZQ@9@EeS@>9ʌH@ARa@Cۡ&ffi@CjL/@8=p@C|x@C&@DE@Dx@Bl"@C`Whۓ@Df@B,@A僯@G炏\'@T!ۼ?,@SeN 8@CƧ@6>^5*@*hC@)KƧ@(`@!YE@'IX@V;L@E9u@p+f@17KƧ@*Q @r@ JBZ=@ mXyJ@$q @PV!@P+?p$?"S?\?u9W?3 ?gQ7??5p֝?(2`O?hQ녘? VVw? E?/v? dZ?Q333(@NP5?|? =B?$_;dZ=?pP?333?Ur?E tv?C/?"^5?p@e!@w"@[@@hu@U@LbM@ϥT @vȴ1@&V@.ʧ 3@5٣TzE@;hr@CHޣS@Ke@T37@WaXe@Po;f@EIl@Pvȣ@B1Q@CM@;v H@;>5@?N}p@?@Eȴ9@Ka;<(@Ky7Q@K^5:@OD+@Uij@Pǹ@GUcS@@msz@@2#<@&"iÕ@"̳33)@n@ 9X@vȴ@er=p@?Q@v@ r @(j~@ Ӳ-S@ p3@ Q.@ƒnJ@" Im@ Xb @x?<bM?9X?Yl?=/? ?HA79?̋C?ñ`A?\;? ? ??)%\[? ě?Ԥ~D?B\)p?bn$?vp?A kF?ҽqG'?̮w?a4?4?%`?قZi?=+l?8X?.6z?OK|?xG?42V?H9Xb?ZL?"u?LC\? M?v%?YK]b?Sι@2ě@?&@>G@vȴI@<z@ 2$.@ 3@L@Uc@"@$ArN}@0;4m@1A&@5c=@;h@C…@MFy8x@Tޓ@Y@TJO/v_@F0bM@@W@<ݢ7@@+?!-@D lrGG@FLC @H`zE@J_H@I&@O@HQdw@F!G@E+@IR@JJmB@Kf>@Pig@S-!>@U @P|s@C(e@77Tz2@0X[$J@)݊@"AZ@64@yV @S7@o@@c1@ khr@ k@ 8IH@ 4@U暸@,}/@$.@/o`@%F ?RrGEJ?`A?]R(?g*??:rh x?ȴ̷?CN)?0N!?4pużp@7!@/+IQ@%r33*@!Xhr@;d@|_V@Ϫʹ@ i`A@ QU<@,Qx@ n/@ F1&}@"O@O@M@K]~@{J#?hrv?']c?쿱?Ks?Jw:)?b?DQDg8?CH?M#?T/M?Q?bяt?2Gg?s3??A+$?H"h ?%2a}]?dZq?MڹF?Vxa?۩x?OPě?{qT?5?|{?ZzGg?U}?[W??`A ?r ?T1N;?˒?/&?<\~($? :G?/kQl?1bM?牢ߤ??PZn?Gsn?WH?B~D?*0W?;f&?}B~ڕ?+ B?)y?cB@d@:n@\;5f@k'@]c@6{'RF@ܸQQ@{=@ )lp@"*3@$UXn@)^ =p@1%J#9@32V@2@7,IB@:m!G@@\%cw@Bys@D6[@Fcf@EnV@APH@AGBZ@DZX c@Fc~,c"@Dև*@A' S@>?|@>O.@9.>@3RXY@25@,!R@%k@"\$@أfffl@iDg1@ufx@ PD@ vȴ@Ep?:QF@ʌQ ?.@tS@k@8?W>?cQ??I-7K@W(kP?j}?ҹ?;%?̟?ObH?[W>?v0?X$?d$?戠-?PhۋJ?עW?f )?+S?@u?^5?ڛC.?Ԣi)?oѩ ?R?,l?RJ{?cn6?੟.H?РɅ?ᕧ L?؛dre?72f?s ?cSz?Ә&?PH~?TzGp?KF\? 83?_?&Ϫ?j e+t?G,?퇓?(?]\H??S+ h@zG3@T`d?ʱ3@@ xKMn@MG@WC,@/G@g@[u%E@iyz@@!F!R@%@) !@({/@.PG@.U2ao@2BCN;@0*ʌ3@1O4 3@*; @-lj@1FwX@1lm@/šʑ@+|mh=@&ja@,/@"Z}I@%@ kP@;@c@Vl_ح@u#o@`Gg@ HQ"@RT`@׊?6?%\@:#9@f>A@)/@: ?p@]?aP?,C9?n?j&?kHc?{A [?S{J#G?wU#?XI^ ?2I ?ڹ?ŝ*?s_?H T?p(?{"?"h L?xl# ?L(º?x?;xF?W#F?gJ#8?Q @j~@2@@\(@ ("7Kƫ@">O@! z7@fff9@2*v@ \(@ 9Vn@t@iQ@ě@A7-@Qb@`A)@ _333P@7KƤ@ahr@K#G?$/?Ip4@T1&@?dZ?ŧ;dZ?͉7K?Yffe?(1'B??t =H?z?,?$?쑛 >L?|?cKڔ?S*?_?8v?듏v?334?#333?)c?2?9W?\R?׌L?^ Ƨ?Hl?+"?qlD?\(?dZ?ۋ1??"?򧆗N?~?0(N?JkƧO??ffff@?V,?jB?`V?o!-x? =?m%$K?~Fs?"G?ߠU=?↌zG?sj?]+j?霃?4?o?}Y?|s?}\?Mye+ӡ?ffg? K]?V?2G0?Cqu@y@ѷ,@ ]dZ@ `64"@Ĭf@T*0@ 7K@ o\C@RuN@䠑NK@6|D@WA@ {1@|j~@rGU@a@S]]c@[;ds@W(@Xbp@7K@'@Jd\(@T`L@c =p@iDgK@ %F z@ 1',@ =&;@5K]@?ڹf@ ԕ@.@tS?3sY@RT`~?Es/?vȳ?PH?@G:)?TIQ?in?Vn?9Q?ck?7- /?I;dZj?3Ƨ?e^L/?wkB?s}0?O?u?6_خ!?}Yu?ݘ1&?@?s?ㅣ'?)n,?9M?-=?Ou/?SJ?KPH?թhT?q?z=p ?ҙu?C+?MM?b?A ?"@5?O+xG-?αs?D+8?s%?ݗ? ?ۥUs[?C\?J'?#|Z?G͞?.c@N?$?tѷg?ܾA [?ռ?XbM?8? A?]JL/?BZA?%F U?K~E?BW?ݝXy*?G|@7@@ h ěl@]o@#e+ӵ@PH @mQ@E@HF_o@˲->@F"@-|@ ~@ #iDg@M@ `A@ȴ9{@TYJ@ 7T8YX@B;d@ {T<@wdZ@E@@ߤ?@qL/r@zH@~/@o@m#9?XU?dQ@$tSS?,hۋ?Itjh?\j"?ID?&"?$Gqu.?{\(?f3%.?o?ep?cy?RN?L~? V?E?2k?|?댥Q?"/?H|4?lQ?з4?S?,(?,?7@?[@N? tS+?N333^?*?H9?Ehr?!7L*?c'?-+ $?g?ƞXQ넀?ڟ?ߕe?gP?0 R?á!-w? Z?:)yz?تKC,?tj?Vl$? 5?*GN?U2?N?c?wt?W'09?!-wG?H?n~?+tG?lҟv?q^5{?@Qx?;dY?}?Fs?1&? x@B[%@h? @?r?1O;}?r#9?dZ4?pH?YDg7?w14?U2ba?)Xb??vH?}Vl;?9Q? AG[?}j?Ju%Ff?Ex?@m?5y*?:T,z ?t>B??M*?CaU?ؠbM?67?7Z?B%?vpd¹@n&#@/hے@ 5?|?rGEe?'0? .?1-@cQ?]c?^5??I$tR?- Y?fU?ح@@<@;Y?0(•?U= ?WZL@#u?!?s$@?3A*?I㼊?\W?W?)n\)?Fs}?X??t333-? ?Mi?Mڨ?hW?I?Ek?zx ?t?z?e?GS?u84?K?nx:~?B@v??U2`?z ?N$Y?#%?ܾ5?|?TD? B?8h1&Y?󭸺?3&fff?VH,?,<@? ŒK?dm?՞W =q?n?c O?\?Q6V?}(bNd?Ud?=n?ײ*=p?S3332? =v?NQ?htzG?!?zGB?ֵ;P?w q?@?Ձ$?ܼm\?-w1?JڹY{?Cw?Q?c=p*?:L/x?~sPu?#:??k׍O?QB?Vl?4J?g+?*nH?պOv_?q*0U-?&B?ca+?? s?-Dg8?Ul?$?=?O ?[WD?2Dc@?@ۮz?P̠?xw*0(?0 ?rs?שV?3?IQI?oh?` `?y[L?yS?q[W>?s고?;a?+ 8?&ffff`?괟!-w?'0???=sx?Õ?*3*09?1Fl?K,??Xb"?ѾV?h?<@&?pl"g? l ?:bM?I/sO?ۓO?blH?5Y?+ G?J?kFtd?@?OU<8?Q??.q7?u%FF?Og8?R-T?Q#9?P?܊K]?1|ٖ?:?O??=JH?vE?)@??ՙ}V?ȓ?&Xt?>z?u9Yz?ם%`?8?♓333?F i?m?UB[?&?;?E?i A [?9=?n^5??͹4?|]c|?NƧ??a?5͜?u7?[ I??[J#9?{?o+k(?7?1n.?|Z?3O;? Ca;? :)Ǿ?vOv?¦L/?Ӌ U6?X?sɅ?u%?rw? =?3IYF?zx!?F唯SS?l"g??5bK?G?Q&$-?ke+?Ὶ?S&?! U?+j?p;D?nb?~0r?W%?t<7?oh?M[h?`^?к0U2|?F_?΅9X?!|Z?ԥdzH?\(?ua7?N(©?,?[&xc?@]c ?!L?iq6?$N<?ʔ%? M:I?ɂ)&?sƧ?у&?Ԑ{?۷ZN?ԥzw?r?s?SG?] qU?okH?Xj~P? ?q7Kv?R8Y ?~M?7K?:#jV?oᰉ?ؖI/?Ec%?\(?R?(DT?왘PH?ӋqK?,S?N _?&2ߤ??TɆ2?~}?X? pti??9??AO3?5 '??|UE?oW ?ZGH? hۍ,?@U2a,?qs-?;dYv?E\(?=s?ڀ+³?>d?> I5?@?0?S?p:?]"䎈?PaG[?RB? _?#h?3d?1?S6?n}Vl?tȪd?z?ߎH1&=?U?WOI?:ڹA?𖻙-? ` ?f N?%i?? ?334?誛]c?c0 l:?$xl"j?\m\?׍O@?s?4s*0?ؿB IJ? =p^?a KN?Ҥo;dZ ?el?+Ƨ?I?|폔?8V{?C?ӌi?PpV?dzH?ifff ?Ķffg`? o?UPbN?u]l?| I?:G? I^q?/+X?]p֫?+?Pn?"?֢?Tu\-?n8??}?އ5?{?0ffg"?pnEʏ?~ȴ9?́#?B? ;?+?씧-S?妙k??uQ?vȵh?6M?,I^?'=[?vQ?̄/?ȓt?L1&H? =pC?\?y"?h&?9i7K?k >U?釬?i7K?n7?nZ?K=-?[zg?l;d?sn?!l2?q?ed?@;a?z7K? Q?C$ݵ?\zGQ?n9?|?޼Eɪ??ٲ,D?ׁ5]N?B.V?ˌ~vȯ?ş?vȐ?2?%5?}$?n? =qj?՚\(W?I\(?nzB?G?݋ȴ8?Լj ?# >?A3?Ʋvȱ?-Q?D|t?ᡭ"p??ъ!-?'t?Ȗ??E ?p?hu?O64? ?3L/?ݗ?մ/|r?$6#?c;?wzG ?yQ;?x >?բu? A?_d? l?$}LX?X3_?,ռx?ay?Ŷ334[?ř?|ޣ?ӂව6H?A??$OfI?^?Pb?χ;e)?$a$?缋C+%?s{*0?Ҍc\?-k/V?ĔI^K?X/?R?@k6z?ڊͥ?Ue?E%F ?AiG$?Dn.z?墄_?Ƨo?hE? 7m? -BJ?20?s Be?ڻX??x h?B\'d?ۦ㕁D?$L?֛ 'm?ѡP?ΰH?=?B3X?8IZ?թ8}?Q?¬M?mZ=p?HQ?#*.?s?9X-?׏fy?௫A!,? C?䂡j?? ?xs/V?e?A4R?=}p֊??!-xZ??C?%R?V4c?ݹ?֡c.?R<2?iy&y?K2C\$?⁇\(?عS?ۈe"?Id?K?݂~?2ci{?ڦ?%+?"d ?Gk?|e %?߉n?t3?rs3? n*?ꄄ#?ѷ??0?Ge?+U?A-??8*^?N/N?ף3 #?Hm?;+ e?Kl?C]d?)^4?~Ne?@us?!q&x.?0d?Zt%4Y?i ?ƟFfff&?1\?S? ?Y~?zG?RCE?珄(?׌Gr?Й|1(?ՉG? fff?Op?uhr{?G?k?ڳQ?7J`? $?Xb?"=p?#ilx?ާ hr(?O>5?|?MO:?N?ח`AB?-U?Sl?&y`?hQ*?6?K?9V?{?DW?ە?`A?z@]0 ?̡?ȃhr?y49X?Gۅ]?ϧ+Ƨ?ΏJ=p=?N1&!?Ԓt?= 7K?o\(I? zG?~l?Y+L?bM?J=~i?N_p;??Jv4>?Z.?aH?c񂩒?˪^5??^@0?ܻo\(?3]b?c˻?WYJx?,,x?ƚ͑hp?ݯ+?ΣU=m?ήH触?ժL/?ԸbM?QT`>?%FN?s*?"?(bM҈?G*?Unu?cY?hA?y!?ub?@`B\?*uN?neb?gc =v?I?m4_@?Ğ?b)y? =pJ?)fA?ݮtS?ܔs@N?aa?A7??Y,?O?:%?6`A?A?*14?ؿ`ě?ߕ9yX?1~?nG?ɂ??s|??P?zk?ON?p*?C?;d?1}VF?ג~?ěk?2}I?^W?=㕁?#n.?rW?WI*?L:@?HCn?͞?:TɅ?S@O?i?uF?we?'7͞U?ЖJf?l"g?bJ=p?LW2?y*?̕R?Xew?{J#v??iq7K?ѐO?ϼK?Ξs?&IQ?Vl?u\3?fA?~A ?yn?p쿱X?!\(?ͷ#?g8}?""?F V?+ I`?6a?:@9?ڄZxl"l?/?ףS?L?#a@?@wX?3,zS?ưj~?t9X?慔#?y? OX?v?Y1 ?%fB?ҶL/G?}Hc?ݛ">?7ݫU?㎠H?U*u%E?*CV?zwB[?i[W>?P4mů?r.?5ffi6?3S&/?ɦ ?dm~?Qxe? +dZ?dC?Ֆ+?ȸBw1?YJ?6Qx?9X?\(?o?Ҭ9?̹-hrD?C5b? I?{?`sunpy-0.8.3/sunpy/data/test/__pycache__/0000755000175000017500000000000013232563477020366 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/data/test/__pycache__/__init__.cpython-36.pyc0000644000175000017500000000454413232362560024550 0ustar nabilnabil000000000000003 iZI@sdZddlmZddlZddlZddlZddlZddlmZddl Z ddddgZ ej j ej j e jd d Zejej j ed Zd dZd dZdS)zSunPy test data files)absolute_importN)get_pkg_data_filenamerootdir file_listget_test_filepathtest_data_filenamesdatatestz*.[!p]*cKst|fddi|S)a Return the full path to a test file in the ``data/test`` directory. Parameters ---------- filename : `str` The name of the file inside the ``data/test`` directory. Return ------ filepath : `str` The full path to the file. See Also -------- astropy.utils.data.get_pkg_data_filename : Get package data filename Notes ----- This is a wrapper around `astropy.utils.data.get_pkg_data_filename` which sets the ``package`` kwarg to be 'sunpy.data.test`. packagezsunpy.data.test)r)filenamekwargsr 1/home/nabil/Git/sunpy/sunpy/data/test/__init__.pyrscsg}ddtjjddgdjddDp0dxTtjtD]F\}}fd d|D}fd d|D}d d|D}|j|q>W|S) a Return a list of all test files in ``data/test`` directory. This ignores any ``py``, ``pyc`` and ``__*__`` files in these directories. Return ------ get_all_test_filepath : `list` The name of all test files in ``data/test`` directory. z*.pyc*z__*__z*.py|cSsg|]}tj|qSr )fnmatch translate).0xr r r >sz'test_data_filenames..z$.csg|]}tjj|qSr )ospathjoin)rf)rootr rrAscsg|]}tj|s|qSr )rematch)rr)excludesr rrBscSs g|]}|jttjjdqS))replacerrrsep)rfiler r rrCs)rrr rwalkrextend)Ztest_data_filenames_listdirsfilesr )rrrr0s )__doc__ __future__rrglobrrastropy.utils.datarsunpy__all__rrdirname__file__rrrrr r r rs   sunpy-0.8.3/sunpy/data/test/eve/0000755000175000017500000000000013232563477016735 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/data/test/eve/eve_01.txt0000644000175000017500000001007713231613137020546 0ustar nabilnabil00000000000000; DATA_list: 20160610_EVE_L0CS_DIODES_1m.txt ; Created: Fri Jun 10 15:58:11 2016 UTC ; Origin: SDO/EVE Science Processing and Operations Center, LASP/CU ; Units: W/m^2 for irradiance, dark is counts/(0.25s sample), quadrants are unitless, solar lat & lon are deg ; Source: SDO-EVE ESP and MEGS-P instruments, http://lasp.colorado.edu/eve ; Product: Level 0CS, 1-minute averaged SDO-EVE Solar Indices from broadband photometers ; Version: 4.0, code updated 2014-Jan-02 ; Missing data: -1.00e+00 ; Column descriptions: ; HHMM: hour and minute in UT ; XRS-B proxy: a model of the expected XRS-B 0.1-0.8 nm value, calculated using two-component method ; XRS-A proxy: a model of the expected XRS-A value ; SEM proxy: a model of the expected SEM 26-34 nm value ; 0.1-7ESPquad: the total irradiance over the ESP quadrant diode 0.1-7 nm ; 17.1ESP: ESP irradiance measurement near 17.1 nm ; 25.7ESP: ESP irradiance measurement near 25.7 nm ; 30.4ESP: ESP irradiance measurement near 30.4 nm ; 36.6ESP: ESP irradiance measurement near 36.6 nm ; darkESP: ESP dark diode count rates (background) ; 121.6MEGS-P: MEGS-P irradiance measurement at H I Lyman-alpha 121.6 nm ; darkMEGS-P: MEGS-P dark diode count rates (background) ; q0ESP: ESP quadrant 0 fraction (q0ESP to q3ESP add up to 1.0) ; q1ESP: ESP quadrant 1 fraction ; q2ESP: ESP quadrant 2 fraction ; q3ESP: ESP quadrant 3 fraction ; CMLat: Latitude centroid of ESP quad diode irradiance at the sun in degrees ; CMLon: Longitude centroid of ESP quad diode irradiance at the sun in degrees ; x_cool proxy: Cool component for calculating XRS-B proxy ; oldXRSB proxy: XRS-B calculated using the version 2 method ; Format: ; YYYY DOY MO DD ; HHMM XRS-B XRS-A SEM 0.1-7 17.1 25.7 30.4 36.6 dark 121.6 dark q0 q1 q2 q3 CM CM x_cool oldXRSB ; proxy proxy proxy ESPquad ESP ESP ESP ESP ESP MEGS-P MEGS-P ESP ESP ESP ESP Lat Lon proxy proxy ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ;END_OF_HEADER 2016 162 06 10 0000 2.18e-07 1.84e-10 4.98e-04 3.16e-04 4.82e-04 2.64e-04 5.83e-04 6.68e-04 4.97e+01 -1.00e+00 4.03e+01 3.26e-01 2.15e-01 2.64e-01 1.96e-01 -11.3 -27.0 5.89e+02 1.01e-07 0001 2.31e-07 2.00e-10 4.98e-04 3.14e-04 4.82e-04 2.64e-04 5.83e-04 5.84e-04 4.97e+01 -1.00e+00 4.03e+01 3.23e-01 2.15e-01 2.65e-01 1.96e-01 -11.1 -25.6 5.89e+02 1.05e-07 0002 2.37e-07 2.07e-10 4.98e-04 3.14e-04 4.82e-04 2.64e-04 5.83e-04 5.05e-04 4.98e+01 -1.00e+00 4.03e+01 3.22e-01 2.18e-01 2.64e-01 1.96e-01 -10.9 -26.6 5.89e+02 1.07e-07 0003 2.27e-07 1.96e-10 4.98e-04 3.13e-04 4.82e-04 2.64e-04 5.83e-04 4.32e-04 4.98e+01 -1.00e+00 4.03e+01 3.23e-01 2.16e-01 2.67e-01 1.94e-01 -11.3 -26.2 5.89e+02 1.04e-07 0004 2.27e-07 1.96e-10 4.98e-04 3.13e-04 4.82e-04 2.65e-04 5.83e-04 3.64e-04 4.98e+01 -1.00e+00 4.03e+01 3.20e-01 2.14e-01 2.68e-01 1.97e-01 -11.3 -23.4 5.89e+02 1.04e-07 0005 2.21e-07 1.89e-10 4.99e-04 3.11e-04 4.82e-04 2.65e-04 5.84e-04 3.02e-04 4.98e+01 -1.00e+00 4.03e+01 3.20e-01 2.17e-01 2.64e-01 1.99e-01 -10.6 -24.8 5.89e+02 1.02e-07 0006 2.22e-07 1.90e-10 5.00e-04 3.09e-04 4.82e-04 2.65e-04 5.84e-04 2.45e-04 4.98e+01 -1.00e+00 4.03e+01 3.23e-01 2.15e-01 2.67e-01 1.96e-01 -11.3 -25.0 5.89e+02 1.02e-07 0007 2.40e-07 2.11e-10 4.99e-04 3.14e-04 4.82e-04 2.65e-04 5.84e-04 1.93e-04 4.98e+01 -1.00e+00 4.03e+01 3.18e-01 2.14e-01 2.70e-01 1.98e-01 -11.2 -22.1 5.89e+02 1.08e-07 0008 2.37e-07 2.08e-10 4.99e-04 3.16e-04 4.82e-04 2.65e-04 5.83e-04 1.45e-04 4.98e+01 -1.00e+00 4.03e+01 3.19e-01 2.14e-01 2.68e-01 2.00e-01 -10.9 -22.4 5.89e+02 1.07e-07 0009 2.38e-07 2.09e-10 4.99e-04 3.15e-04 4.82e-04 2.65e-04 5.83e-04 1.02e-04 4.98e+01 -1.00e+00 4.03e+01 3.20e-01 2.14e-01 2.67e-01 1.99e-01 -10.9 -23.0 5.89e+02 1.07e-07 sunpy-0.8.3/sunpy/data/test/eve/eve_02.txt0000644000175000017500000001007713231613137020547 0ustar nabilnabil00000000000000; DATA_list: 20160610_EVE_L0CS_DIODES_1m.txt ; Created: Fri Jun 10 15:58:11 2016 UTC ; Origin: SDO/EVE Science Processing and Operations Center, LASP/CU ; Units: W/m^2 for irradiance, dark is counts/(0.25s sample), quadrants are unitless, solar lat & lon are deg ; Source: SDO-EVE ESP and MEGS-P instruments, http://lasp.colorado.edu/eve ; Product: Level 0CS, 1-minute averaged SDO-EVE Solar Indices from broadband photometers ; Version: 4.0, code updated 2014-Jan-02 ; Missing data: -1.00e+00 ; Column descriptions: ; HHMM: hour and minute in UT ; XRS-B proxy: a model of the expected XRS-B 0.1-0.8 nm value, calculated using two-component method ; XRS-A proxy: a model of the expected XRS-A value ; SEM proxy: a model of the expected SEM 26-34 nm value ; 0.1-7ESPquad: the total irradiance over the ESP quadrant diode 0.1-7 nm ; 17.1ESP: ESP irradiance measurement near 17.1 nm ; 25.7ESP: ESP irradiance measurement near 25.7 nm ; 30.4ESP: ESP irradiance measurement near 30.4 nm ; 36.6ESP: ESP irradiance measurement near 36.6 nm ; darkESP: ESP dark diode count rates (background) ; 121.6MEGS-P: MEGS-P irradiance measurement at H I Lyman-alpha 121.6 nm ; darkMEGS-P: MEGS-P dark diode count rates (background) ; q0ESP: ESP quadrant 0 fraction (q0ESP to q3ESP add up to 1.0) ; q1ESP: ESP quadrant 1 fraction ; q2ESP: ESP quadrant 2 fraction ; q3ESP: ESP quadrant 3 fraction ; CMLat: Latitude centroid of ESP quad diode irradiance at the sun in degrees ; CMLon: Longitude centroid of ESP quad diode irradiance at the sun in degrees ; x_cool proxy: Cool component for calculating XRS-B proxy ; oldXRSB proxy: XRS-B calculated using the version 2 method ; Format: ; YYYY DOY MO DD ; HHMM XRS-B XRS-A SEM 0.1-7 17.1 25.7 30.4 36.6 dark 121.6 dark q0 q1 q2 q3 CM CM x_cool oldXRSB ; proxy proxy proxy ESPquad ESP ESP ESP ESP ESP MEGS-P MEGS-P ESP ESP ESP ESP Lat Lon proxy proxy ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ;END_OF_HEADER 2016 162 06 10 0010 2.42e-07 2.14e-10 4.98e-04 3.18e-04 4.81e-04 2.64e-04 5.83e-04 6.35e-05 4.98e+01 -1.00e+00 4.03e+01 3.18e-01 2.14e-01 2.70e-01 1.98e-01 -11.1 -22.2 5.89e+02 1.08e-07 0011 2.55e-07 2.30e-10 4.98e-04 3.20e-04 4.81e-04 2.64e-04 5.82e-04 2.89e-05 4.98e+01 -1.00e+00 4.03e+01 3.15e-01 2.17e-01 2.68e-01 2.00e-01 -10.4 -22.2 5.89e+02 1.12e-07 0012 2.50e-07 2.24e-10 4.97e-04 3.19e-04 4.82e-04 2.64e-04 5.81e-04 -1.00e+00 4.98e+01 -1.00e+00 4.03e+01 3.12e-01 2.16e-01 2.69e-01 2.03e-01 -10.1 -20.0 5.89e+02 1.11e-07 0013 2.30e-07 2.00e-10 4.98e-04 3.15e-04 4.82e-04 2.64e-04 5.82e-04 -1.00e+00 4.98e+01 -1.00e+00 4.03e+01 3.15e-01 2.17e-01 2.68e-01 2.00e-01 -10.4 -22.1 5.90e+02 1.05e-07 0014 2.18e-07 1.87e-10 4.97e-04 3.10e-04 4.82e-04 2.64e-04 5.81e-04 -1.00e+00 4.98e+01 -1.00e+00 4.03e+01 3.17e-01 2.16e-01 2.68e-01 1.99e-01 -10.7 -22.4 5.90e+02 1.02e-07 0015 2.14e-07 1.82e-10 4.97e-04 3.09e-04 4.81e-04 2.63e-04 5.81e-04 -1.00e+00 4.99e+01 -1.00e+00 4.03e+01 3.17e-01 2.17e-01 2.69e-01 1.97e-01 -10.9 -23.2 5.90e+02 1.01e-07 0016 2.24e-07 1.94e-10 4.96e-04 3.09e-04 4.81e-04 2.63e-04 5.80e-04 -1.00e+00 4.98e+01 -1.00e+00 4.03e+01 3.18e-01 2.17e-01 2.68e-01 1.98e-01 -10.8 -23.5 5.90e+02 1.03e-07 0017 2.11e-07 1.79e-10 4.95e-04 3.08e-04 4.81e-04 2.63e-04 5.78e-04 -1.00e+00 4.98e+01 -1.00e+00 4.03e+01 3.21e-01 2.14e-01 2.67e-01 1.98e-01 -11.2 -23.7 5.90e+02 9.99e-08 0018 2.00e-07 1.68e-10 4.95e-04 3.07e-04 4.81e-04 2.63e-04 5.78e-04 -1.00e+00 4.98e+01 -1.00e+00 4.02e+01 3.19e-01 2.14e-01 2.69e-01 1.97e-01 -11.3 -22.9 5.90e+02 9.69e-08 0019 2.16e-07 1.84e-10 4.95e-04 3.06e-04 4.82e-04 2.63e-04 5.79e-04 -1.00e+00 4.98e+01 -1.00e+00 4.02e+01 3.19e-01 2.16e-01 2.69e-01 1.96e-01 -11.1 -23.5 5.90e+02 1.01e-07 sunpy-0.8.3/sunpy/data/test/eve/eve_03.txt0000644000175000017500000001007713231613137020550 0ustar nabilnabil00000000000000; DATA_list: 20160610_EVE_L0CS_DIODES_1m.txt ; Created: Fri Jun 10 15:58:11 2016 UTC ; Origin: SDO/EVE Science Processing and Operations Center, LASP/CU ; Units: W/m^2 for irradiance, dark is counts/(0.25s sample), quadrants are unitless, solar lat & lon are deg ; Source: SDO-EVE ESP and MEGS-P instruments, http://lasp.colorado.edu/eve ; Product: Level 0CS, 1-minute averaged SDO-EVE Solar Indices from broadband photometers ; Version: 4.0, code updated 2014-Jan-02 ; Missing data: -1.00e+00 ; Column descriptions: ; HHMM: hour and minute in UT ; XRS-B proxy: a model of the expected XRS-B 0.1-0.8 nm value, calculated using two-component method ; XRS-A proxy: a model of the expected XRS-A value ; SEM proxy: a model of the expected SEM 26-34 nm value ; 0.1-7ESPquad: the total irradiance over the ESP quadrant diode 0.1-7 nm ; 17.1ESP: ESP irradiance measurement near 17.1 nm ; 25.7ESP: ESP irradiance measurement near 25.7 nm ; 30.4ESP: ESP irradiance measurement near 30.4 nm ; 36.6ESP: ESP irradiance measurement near 36.6 nm ; darkESP: ESP dark diode count rates (background) ; 121.6MEGS-P: MEGS-P irradiance measurement at H I Lyman-alpha 121.6 nm ; darkMEGS-P: MEGS-P dark diode count rates (background) ; q0ESP: ESP quadrant 0 fraction (q0ESP to q3ESP add up to 1.0) ; q1ESP: ESP quadrant 1 fraction ; q2ESP: ESP quadrant 2 fraction ; q3ESP: ESP quadrant 3 fraction ; CMLat: Latitude centroid of ESP quad diode irradiance at the sun in degrees ; CMLon: Longitude centroid of ESP quad diode irradiance at the sun in degrees ; x_cool proxy: Cool component for calculating XRS-B proxy ; oldXRSB proxy: XRS-B calculated using the version 2 method ; Format: ; YYYY DOY MO DD ; HHMM XRS-B XRS-A SEM 0.1-7 17.1 25.7 30.4 36.6 dark 121.6 dark q0 q1 q2 q3 CM CM x_cool oldXRSB ; proxy proxy proxy ESPquad ESP ESP ESP ESP ESP MEGS-P MEGS-P ESP ESP ESP ESP Lat Lon proxy proxy ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ;END_OF_HEADER 2016 162 06 10 0020 2.16e-07 1.84e-10 4.96e-04 3.07e-04 4.82e-04 2.63e-04 5.80e-04 -1.00e+00 4.98e+01 -1.00e+00 4.02e+01 3.16e-01 2.17e-01 2.71e-01 1.97e-01 -10.9 -22.4 5.90e+02 1.01e-07 0021 2.12e-07 1.80e-10 4.97e-04 3.08e-04 4.82e-04 2.63e-04 5.81e-04 -1.00e+00 4.98e+01 -1.00e+00 4.02e+01 3.16e-01 2.17e-01 2.70e-01 1.96e-01 -10.8 -22.7 5.90e+02 1.00e-07 0022 2.16e-07 1.85e-10 4.98e-04 3.07e-04 4.82e-04 2.63e-04 5.82e-04 -1.00e+00 4.98e+01 -1.00e+00 4.02e+01 3.16e-01 2.18e-01 2.68e-01 1.98e-01 -10.6 -23.1 5.90e+02 1.01e-07 0023 2.10e-07 1.78e-10 4.98e-04 3.07e-04 4.82e-04 2.63e-04 5.82e-04 -1.00e+00 4.98e+01 -1.00e+00 4.02e+01 3.17e-01 2.16e-01 2.71e-01 1.96e-01 -11.2 -22.9 5.90e+02 9.97e-08 0024 2.24e-07 1.94e-10 4.96e-04 3.08e-04 4.82e-04 2.63e-04 5.80e-04 -1.00e+00 4.97e+01 -1.00e+00 4.02e+01 3.17e-01 2.16e-01 2.71e-01 1.97e-01 -11.0 -22.4 5.90e+02 1.03e-07 0025 2.10e-07 1.78e-10 4.97e-04 3.08e-04 4.82e-04 2.63e-04 5.81e-04 -1.00e+00 4.97e+01 -1.00e+00 4.02e+01 3.16e-01 2.16e-01 2.72e-01 1.96e-01 -11.2 -22.2 5.91e+02 9.97e-08 0026 2.04e-07 1.73e-10 4.97e-04 3.08e-04 4.82e-04 2.64e-04 5.81e-04 -1.00e+00 4.98e+01 -1.00e+00 4.01e+01 3.17e-01 2.14e-01 2.68e-01 2.01e-01 -10.7 -21.4 5.91e+02 9.82e-08 0027 2.12e-07 1.81e-10 4.97e-04 3.07e-04 4.82e-04 2.64e-04 5.80e-04 -1.00e+00 4.98e+01 -1.00e+00 4.01e+01 3.19e-01 2.16e-01 2.68e-01 1.97e-01 -10.9 -23.9 5.91e+02 1.00e-07 0028 2.00e-07 1.69e-10 4.98e-04 3.06e-04 4.82e-04 2.64e-04 5.82e-04 -1.00e+00 4.98e+01 -1.00e+00 4.01e+01 3.19e-01 2.17e-01 2.70e-01 1.94e-01 -11.4 -24.4 5.91e+02 9.72e-08 0029 2.11e-07 1.80e-10 4.98e-04 3.08e-04 4.82e-04 2.64e-04 5.82e-04 -1.00e+00 4.98e+01 -1.00e+00 4.01e+01 3.18e-01 2.16e-01 2.69e-01 1.98e-01 -10.9 -22.7 5.91e+02 1.00e-07 sunpy-0.8.3/sunpy/data/test/eve/eve_04.txt0000644000175000017500000001007713231613137020551 0ustar nabilnabil00000000000000; DATA_list: 20160610_EVE_L0CS_DIODES_1m.txt ; Created: Fri Jun 10 15:58:11 2016 UTC ; Origin: SDO/EVE Science Processing and Operations Center, LASP/CU ; Units: W/m^2 for irradiance, dark is counts/(0.25s sample), quadrants are unitless, solar lat & lon are deg ; Source: SDO-EVE ESP and MEGS-P instruments, http://lasp.colorado.edu/eve ; Product: Level 0CS, 1-minute averaged SDO-EVE Solar Indices from broadband photometers ; Version: 4.0, code updated 2014-Jan-02 ; Missing data: -1.00e+00 ; Column descriptions: ; HHMM: hour and minute in UT ; XRS-B proxy: a model of the expected XRS-B 0.1-0.8 nm value, calculated using two-component method ; XRS-A proxy: a model of the expected XRS-A value ; SEM proxy: a model of the expected SEM 26-34 nm value ; 0.1-7ESPquad: the total irradiance over the ESP quadrant diode 0.1-7 nm ; 17.1ESP: ESP irradiance measurement near 17.1 nm ; 25.7ESP: ESP irradiance measurement near 25.7 nm ; 30.4ESP: ESP irradiance measurement near 30.4 nm ; 36.6ESP: ESP irradiance measurement near 36.6 nm ; darkESP: ESP dark diode count rates (background) ; 121.6MEGS-P: MEGS-P irradiance measurement at H I Lyman-alpha 121.6 nm ; darkMEGS-P: MEGS-P dark diode count rates (background) ; q0ESP: ESP quadrant 0 fraction (q0ESP to q3ESP add up to 1.0) ; q1ESP: ESP quadrant 1 fraction ; q2ESP: ESP quadrant 2 fraction ; q3ESP: ESP quadrant 3 fraction ; CMLat: Latitude centroid of ESP quad diode irradiance at the sun in degrees ; CMLon: Longitude centroid of ESP quad diode irradiance at the sun in degrees ; x_cool proxy: Cool component for calculating XRS-B proxy ; oldXRSB proxy: XRS-B calculated using the version 2 method ; Format: ; YYYY DOY MO DD ; HHMM XRS-B XRS-A SEM 0.1-7 17.1 25.7 30.4 36.6 dark 121.6 dark q0 q1 q2 q3 CM CM x_cool oldXRSB ; proxy proxy proxy ESPquad ESP ESP ESP ESP ESP MEGS-P MEGS-P ESP ESP ESP ESP Lat Lon proxy proxy ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ;END_OF_HEADER 2016 162 06 10 0030 2.22e-07 1.93e-10 4.99e-04 3.10e-04 4.82e-04 2.64e-04 5.84e-04 -1.00e+00 4.98e+01 -1.00e+00 4.01e+01 3.15e-01 2.15e-01 2.71e-01 1.99e-01 -10.8 -21.2 5.91e+02 1.03e-07 0031 2.11e-07 1.80e-10 4.99e-04 3.08e-04 4.82e-04 2.64e-04 5.84e-04 -1.00e+00 4.98e+01 -1.00e+00 4.01e+01 3.13e-01 2.17e-01 2.71e-01 1.99e-01 -10.5 -21.0 5.91e+02 1.00e-07 0032 2.09e-07 1.78e-10 4.99e-04 3.06e-04 4.83e-04 2.64e-04 5.84e-04 -1.00e+00 4.98e+01 -1.00e+00 4.01e+01 3.15e-01 2.17e-01 2.69e-01 1.99e-01 -10.5 -22.5 5.91e+02 9.97e-08 0033 2.12e-07 1.82e-10 4.99e-04 3.07e-04 4.82e-04 2.64e-04 5.84e-04 -1.00e+00 4.98e+01 -1.00e+00 4.01e+01 3.14e-01 2.15e-01 2.70e-01 2.01e-01 -10.5 -20.5 5.91e+02 1.01e-07 0034 2.17e-07 1.88e-10 4.98e-04 3.07e-04 4.82e-04 2.64e-04 5.82e-04 -1.00e+00 4.97e+01 -1.00e+00 4.01e+01 3.13e-01 2.14e-01 2.71e-01 2.03e-01 -10.4 -19.1 5.91e+02 1.02e-07 0035 2.55e-07 2.34e-10 4.97e-04 3.15e-04 4.83e-04 2.65e-04 5.80e-04 -1.00e+00 4.97e+01 -1.00e+00 4.01e+01 3.10e-01 2.16e-01 2.70e-01 2.04e-01 -9.9 -18.9 5.92e+02 1.13e-07 0036 2.79e-07 2.66e-10 4.98e-04 3.27e-04 4.83e-04 2.65e-04 5.82e-04 -1.00e+00 4.97e+01 -1.00e+00 4.01e+01 3.07e-01 2.17e-01 2.67e-01 2.09e-01 -9.0 -17.7 5.92e+02 1.19e-07 0037 2.49e-07 2.26e-10 4.97e-04 3.20e-04 4.83e-04 2.65e-04 5.81e-04 -1.00e+00 4.97e+01 -1.00e+00 4.01e+01 3.09e-01 2.16e-01 2.68e-01 2.06e-01 -9.5 -18.7 5.92e+02 1.11e-07 0038 2.40e-07 2.15e-10 4.97e-04 3.16e-04 4.83e-04 2.66e-04 5.80e-04 -1.00e+00 4.96e+01 -1.00e+00 4.01e+01 3.15e-01 2.14e-01 2.67e-01 2.05e-01 -10.1 -20.2 5.92e+02 1.08e-07 0039 2.42e-07 2.18e-10 4.98e-04 3.13e-04 4.83e-04 2.66e-04 5.81e-04 -1.00e+00 4.96e+01 -1.00e+00 4.00e+01 3.15e-01 2.14e-01 2.68e-01 2.04e-01 -10.3 -20.1 5.92e+02 1.09e-07 sunpy-0.8.3/sunpy/data/test/eve/eve_05.txt0000644000175000017500000001007713231613137020552 0ustar nabilnabil00000000000000; DATA_list: 20160610_EVE_L0CS_DIODES_1m.txt ; Created: Fri Jun 10 15:58:11 2016 UTC ; Origin: SDO/EVE Science Processing and Operations Center, LASP/CU ; Units: W/m^2 for irradiance, dark is counts/(0.25s sample), quadrants are unitless, solar lat & lon are deg ; Source: SDO-EVE ESP and MEGS-P instruments, http://lasp.colorado.edu/eve ; Product: Level 0CS, 1-minute averaged SDO-EVE Solar Indices from broadband photometers ; Version: 4.0, code updated 2014-Jan-02 ; Missing data: -1.00e+00 ; Column descriptions: ; HHMM: hour and minute in UT ; XRS-B proxy: a model of the expected XRS-B 0.1-0.8 nm value, calculated using two-component method ; XRS-A proxy: a model of the expected XRS-A value ; SEM proxy: a model of the expected SEM 26-34 nm value ; 0.1-7ESPquad: the total irradiance over the ESP quadrant diode 0.1-7 nm ; 17.1ESP: ESP irradiance measurement near 17.1 nm ; 25.7ESP: ESP irradiance measurement near 25.7 nm ; 30.4ESP: ESP irradiance measurement near 30.4 nm ; 36.6ESP: ESP irradiance measurement near 36.6 nm ; darkESP: ESP dark diode count rates (background) ; 121.6MEGS-P: MEGS-P irradiance measurement at H I Lyman-alpha 121.6 nm ; darkMEGS-P: MEGS-P dark diode count rates (background) ; q0ESP: ESP quadrant 0 fraction (q0ESP to q3ESP add up to 1.0) ; q1ESP: ESP quadrant 1 fraction ; q2ESP: ESP quadrant 2 fraction ; q3ESP: ESP quadrant 3 fraction ; CMLat: Latitude centroid of ESP quad diode irradiance at the sun in degrees ; CMLon: Longitude centroid of ESP quad diode irradiance at the sun in degrees ; x_cool proxy: Cool component for calculating XRS-B proxy ; oldXRSB proxy: XRS-B calculated using the version 2 method ; Format: ; YYYY DOY MO DD ; HHMM XRS-B XRS-A SEM 0.1-7 17.1 25.7 30.4 36.6 dark 121.6 dark q0 q1 q2 q3 CM CM x_cool oldXRSB ; proxy proxy proxy ESPquad ESP ESP ESP ESP ESP MEGS-P MEGS-P ESP ESP ESP ESP Lat Lon proxy proxy ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ;END_OF_HEADER 2016 162 06 10 0040 2.24e-07 1.96e-10 4.99e-04 3.10e-04 4.83e-04 2.67e-04 5.83e-04 -1.00e+00 4.96e+01 -1.00e+00 4.00e+01 3.17e-01 2.14e-01 2.66e-01 2.03e-01 -10.3 -21.2 5.92e+02 1.04e-07 0041 2.29e-07 2.02e-10 4.99e-04 3.09e-04 4.83e-04 2.66e-04 5.82e-04 -1.00e+00 4.96e+01 -1.00e+00 4.00e+01 3.16e-01 2.14e-01 2.67e-01 2.03e-01 -10.4 -21.2 5.92e+02 1.06e-07 0042 2.40e-07 2.16e-10 4.99e-04 3.13e-04 4.83e-04 2.66e-04 5.83e-04 -1.00e+00 4.95e+01 -1.00e+00 4.00e+01 3.15e-01 2.14e-01 2.68e-01 2.03e-01 -10.3 -20.6 5.92e+02 1.09e-07 0043 2.30e-07 2.04e-10 4.99e-04 3.14e-04 4.83e-04 2.65e-04 5.83e-04 -1.00e+00 4.95e+01 -1.00e+00 4.00e+01 3.13e-01 2.15e-01 2.67e-01 2.06e-01 -9.9 -19.8 5.92e+02 1.06e-07 0044 2.18e-07 1.91e-10 4.97e-04 3.09e-04 4.83e-04 2.65e-04 5.80e-04 -1.00e+00 4.95e+01 -1.00e+00 3.99e+01 3.15e-01 2.14e-01 2.68e-01 2.03e-01 -10.3 -20.1 5.93e+02 1.03e-07 0045 2.10e-07 1.81e-10 4.95e-04 3.07e-04 4.83e-04 2.65e-04 5.78e-04 -1.00e+00 4.95e+01 -1.00e+00 3.99e+01 3.18e-01 2.13e-01 2.66e-01 2.03e-01 -10.5 -21.4 5.93e+02 1.00e-07 0046 2.33e-07 2.08e-10 4.95e-04 3.11e-04 4.83e-04 2.65e-04 5.78e-04 -1.00e+00 4.95e+01 -1.00e+00 3.99e+01 3.19e-01 2.14e-01 2.66e-01 2.02e-01 -10.5 -22.4 5.93e+02 1.07e-07 0047 2.37e-07 2.12e-10 4.96e-04 3.14e-04 4.83e-04 2.65e-04 5.79e-04 -1.00e+00 4.95e+01 -1.00e+00 3.99e+01 3.18e-01 2.14e-01 2.67e-01 2.01e-01 -10.7 -22.2 5.93e+02 1.08e-07 0048 2.42e-07 2.19e-10 4.96e-04 3.15e-04 4.83e-04 2.65e-04 5.79e-04 -1.00e+00 4.95e+01 -1.00e+00 3.99e+01 3.17e-01 2.16e-01 2.69e-01 1.98e-01 -10.8 -22.8 5.93e+02 1.09e-07 0049 2.63e-07 2.46e-10 4.97e-04 3.17e-04 4.82e-04 2.64e-04 5.80e-04 -1.00e+00 4.94e+01 -1.00e+00 3.99e+01 3.19e-01 2.18e-01 2.67e-01 1.97e-01 -10.8 -24.6 5.93e+02 1.15e-07 sunpy-0.8.3/sunpy/data/test/waveunit/0000755000175000017500000000000013232563477020020 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/data/test/waveunit/__init__.py0000644000175000001440000000061013203275053021100 0ustar nabil00000000000000import os.path from sunpy.data.test import rootdir as testrootdir waveunitdir = os.path.join(testrootdir, 'waveunit') MEDN_IMAGE = os.path.join(waveunitdir, 'medn_halph_fl_20050501_074655.fts') MQ_IMAGE = os.path.join(waveunitdir, 'mq130812.084253.fits') NA_IMAGE = os.path.join(waveunitdir, 'na120701.091058.fits') SVSM_IMAGE = os.path.join(waveunitdir, 'svsm_e3100_S2_20110625_1856.fts') sunpy-0.8.3/sunpy/data/test/waveunit/medn_halph_fl_20050501_074655.fts0000644000175000001440000000651213203275053024102 0ustar nabil00000000000000SIMPLE = T / Written by IDL: Sun May 1 10:24:17 2005 BITPIX = 16 /Integer*2 (short integer) NAXIS = 2 / NAXIS1 = 1500 / NAXIS2 = 1340 / CONTACT = 'Isabelle.Buale@obspm.fr' / DATE_OBS= '2005-05-01T07:46:55.000' / DATE_END= '2005-05-01T07:46:55.000' / FILENAME= 'mh050501.074655.fits' / INSTITUT= 'Observatoire de Paris' / INSTRUME= 'Spectroheliograph' / OBJECT = 'FS ' / OBS_MODE= 'SCAN ' / PHYSPARA= 'Intensity' / NBREG = 1 / NBLAMBD = 1 / WAVELNTH= 656.280 / WAVEUNIT= -9 / POLARANG= 0 / THEMISFF= 3 / LONGTRC = 227.924 / LONGCARR= 227.924 / LONGITUD= 227.924 / LATITUD = -4.13011 / LATIRC = -4.13011 / INDLAMD = 1 / INDREG = 1 / SEQ_IND = 1 / SVECTOR = 0 / ORIGIN = 'Meudon Observatory' / END   sunpy-0.8.3/sunpy/data/test/waveunit/mq130812.084253.fits0000644000175000001440000001222013203275053021516 0ustar nabil00000000000000SIMPLE = T / Written by IDL: Mon Aug 12 08:48:08 2013 BITPIX = 16 /Integer*2 (short integer) NAXIS = 2 / NAXIS1 = 1500 / NAXIS2 = 1340 / CONTACT = 'Isabelle.Buale@obspm.fr' / DATE_OBS= '2013-08-12T08:42:53.000' / DATE_END= '2013-08-12T08:42:53.000' / FILENAME= 'mq130812.084253.fits' / INSTITUT= 'Observatoire de Paris' / INSTRUME= 'Spectroheliograph' / OBJECT = 'FS ' / OBS_MODE= 'SCAN ' / PHYSPARA= 'Intensity' / NBREG = 1 / NBLAMBD = 1 / WAVELNTH= 6563 / WAVEUNIT= -10 / POLARANG= 0 / THEMISFF= 3 / LONGTRC = 258.780 / LONGCARR= 258.780 / LONGITUD= 258.780 / LATITUD = 6.50107 / LATIRC = 6.50107 / INDLAMD = 1 / INDREG = 1 / SEQ_IND = 1 / SVECTOR = 0 / END SIVLTEKV][DOLORNJONODNXWSXQGKSRRDFMXMKJQTO?MNP[OLGMJGLOPOEJVSOLFGWOCBWYG4IMGMTURYVRTV_QZ`WUXM\FJ>DEKWJMMLFWKHPIDKOQ`SKLEHKACHFPHXUP?XiKEEILOJRPPMMRHIDPKRXIJKKIOOIFCEFF>CLHSIDDHVGCGAJDHGSAAUA??<EEGAJJEDH<EH@9>GKNN@FN;D;MG7?QH>@AHJD@:;7>F>Q<CFD;NACM=7;DB@>D;7;:9@>EC8;45=-=?DF=9>?FB212596:<.::7=5B4A:;459%D3E<299G>16::351=5B;),D7:70A1816#27658=3.**58255:46%&/+06)*+/26,,+-2&112)(-$,0(37).</,(+5&,210234403)&+-.6-#!,((-/"+4/+'*%&'$,"-)%,$,').$#( '010.***##%'& #%' $'''2&#(!!$"%+ #)#"%$&&"$%$& sunpy-0.8.3/sunpy/data/test/waveunit/na120701.091058.fits0000644000175000001440000001346413203275053021507 0ustar nabil00000000000000SIMPLE = T / BITPIX = -32 / IEEE 32-bit floating point values NAXIS = 3 / NAXIS1 = 256 / number of columns NAXIS2 = 256 / number of rows NAXIS3 = 1 / StokesI DATE = '27-OCT-82' / Date of file creation DATE-OBS= '2012-07-01' / DATE_OBS= '2012-07-01T09:10:58.200Z' / DATE_END= '2012-07-01T09:10:58.200Z' / WAVELNTH= 1.98669 / WAVEUNIT= 0 / in meters PHYSPARA= 'STOKESI' / OBJECT = 'FS ' / OBS_TYPE= 'RADIO ' / OBS_MODE= 'IMAGE ' / LONGITUD= 0.0 / LATITUDE= 0.0 / INSTITUT= 'MEUDON ' / CMP_NAME= 'ROUTINE ' / CONTACT = ' A. KERDRAON' / TELESCOP= 'NRH' / Nancay Radioheliograph INSTRUME= 'NRH2' / Nancay 2D-images Radioheliograph FILENAME= 'nrh2_1509_h80_20120701_091058c02_i.fts' / NRH_DATA= '2DB ' / ORIGIN = 'wrfits ' / FREQ = 150.900 / FREQUNIT= 6 / in MHz BSCALE = 1./ BZERO = 0./ BUNIT = 'K' / Brightness temperature EXPTIME = 1168576512 /in seconds CTYPE1 = 'Solar-X' / CTYPE2 = 'Solar-Y' / CTYPE3 = 'StokesI' / CRPIX1 = 128 / SUN CENTER X, pixels CRPIX2 = 128 / SUN CENTER Y, pixels CDELT1 = 0.0156250 / pixel scale x, in solar radius/pixel CDELT2 = 0.0156250 / pixel scale y, in solar radius/pixel SOLAR_R = 64.0000 / SOLAR RADIUS, pixels END 88 8{b888.%8{OP8v8px8j8dy8_8Y8TT8OZ8J8F%8A8>#8984R$8.G8(8"Q8 8r/8*8a8§7>77l77V777j77.7h{7J/%70!7 {76 sunpy-0.8.3/sunpy/data/test/waveunit/svsm_e3100_S2_20110625_1856.fts0000644000175000001440000243060013203275053023324 0ustar nabil00000000000000SIMPLE = T / Written by IDL: Sat Jun 25 12:20:49 2011 BITPIX = -32 / number of bits per data pixel NAXIS = 2 / number of data axes NAXIS1 = 2048 /Number of positions along axis 1 NAXIS2 = 2048 /Number of positions along axis 2 DATE-OBS= '2011-06-25T18:56:07' / Observation date & start time (UTC) DATE = '2011-06-25T19:20:49' / file creation date (YYYY-MM-DDThh:mm:ss UT) TELESCOP= 'solis ' / Telescope INSTRUME= 'vsm ' / SOLIS instrument OBSERVER= 'unknown ' / Observer name OBS-SITE= 'NSO/KP SOLIS Tower' / Instrument site location OBS-MODE= '10830i ' / Observation mode OBS-TYPE= 'full-scan' / Observation type STARTIME= 1309028167 / Obs-start in seconds since Jan. 1, 1970 STOPTIME= 1309028822 / Obs-stop in seconds since Jan. 1, 1970 WAVELNTH= 1083.00 / Observed wavelength (nm) ENDSTATE= 'NOMINAL ' / Last DHS state ORIENT = 'SE ' / Orientation string of (0,0) OBS-ID = 'oid113090281061856' / CAMTYPE = 'sarnoff ' / DARK-ID = 'oid113090277441850' / FLAT-ID = 'oid113090278321852' / PROVER0 = 7.0511 / Level-0 processing pipeline version PROVER1 = '1.73 ' / VSM level-1 processing pipeline version DDARKVER= 4.0831 / Dark-change cal-image version NFRAMES = 96 / Total number of frames per scanline NSCANS = 2048 / Number of scanlines of observation SCANINIT= 0 / Initial scanline offset BITSHIFT= 3 / DAS Bit offset GAPCOL1 = 954 / Spatial gap in Cam-1 GAPCOL2 = 1034 / Spatial gap in Cam-2 MODSTATE= 0 / DAS/Camera modulation state (0-2) M1-STAT = 1 / Window cover position M2-STAT = 15200 / M2 focus position M3-STAT = 45764 / Calibration position M6-STAT = 36999 / Modulator position M7-STAT = 10045 / Littrow lens position M9-STAT = 999 / Beam-splitter position GR-TILT = 2543 / Grating tilt position FOCALMSK= 1 / Focal plane mask: out(0) or in(1) QUALEND = 0 / Completeness: 0- complete, 1- partial obs. QUALSEE = 0 / Seeing: 0-unknown, 1-bad, 5-excellent QUALOBS = 0 / Obs quality: 0 good, nominal QUALCHK = 0 / Qual-check method: 0- automatic QMAXLEV = 3 / Maximum processing level: Level-3 (Nominal) IMGUNT01= 'pm ' / Image units IMGTYP01= '1083 nm EW Classic Processing' / Image type description IMGSCL01= 1. / Image scale factor to get IMGUNT units IMGUNT02= 'pm ' / Image units IMGTYP02= '1083 nm EW New Processing' / Image type description IMGSCL02= 1. / Image scale factor to get IMGUNT units IMGUNT04= 'pm ' / Image units IMGTYP04= '1083 nm EW New Processing' / Image type description IMGSCL04= 1. / Image scale factor to get IMGUNT units IMGUNT05= 'm/s ' / Image units IMGTYP05= '1083 nm los velocity' / Image type description IMGSCL05= 1. / Image scale factor to get IMGUNT units PUBLISH = 1 / 0 - do not publish to web, 1 - publish to web SITE-LNG= 111.600 / Instrument site longitude (deg) SITE-LAT= 31.9800 / Instrument site latitude (deg) SITE-ALT= 2120.00 / Instrument site altitude (m) EPH_P = -5.21780194699 / Solar P-angle (deg) P_OFFSET= 0.00000 / Instrumental P-angle offset OBS_P = -5.21780194699 / Obs P-angle: EPH_P + P_OFFSET IMG_P = 0.00000 / Equal to zero for level-2 (FD) EPH_B0 = 2.23010207042 / Solar lat. of obs. disk centr (deg) EPH_L0 = 95.5164549253 / Carrington long. of obs. disk centr (deg) EPH_R0 = 944.071389480 / Solar Radius as seen from Earth (arcsec) EPH_RA = 94.2330629423 / Right ascension angle (deg) EPH_DEC = 23.3804219486 / Declination angle (deg) WCSNAME = 'Heliocentric-cartesian (approximate)' / CTYPE1 = 'SOLX ' / Coordinate axis label CTYPE2 = 'SOLY ' / Coordinate axis label CRPIX1 = 1024.50000000 / Reference pixel CRPIX2 = 1024.50000000 / Reference pixel CRVAL1 = 0.00000 / Reference pixel value CRVAL2 = 0.00000 / Reference pixel value PC1_1 = 1.00000 / No coord-trans. PC2_2 = 1.00000 / No coord-trans. CDELT1 = 0.00105924 / Plate scale (solar radii/pixel) CDELT2 = 0.00105924 / CUNIT1 = 'solRad ' / CUNIT2 = 'solRad ' / IMG_X0 = 1024.50 / Solar image x-center position (pix) IMG_Y0 = 1024.50 / Solar image y-center position (pix) IMG_R0 = 944.071 / Solar image radius (pix) IMGMN01 = 22.9029 / Image data mean IMGRMS01= 39.6194 / Image data rms IMGSKW01= 2.73977 / Image data skewness IMGMIN01= -353.840 / Image data min IMGMAX01= 1062.68 / Image data max END C'C C)CyCCĿCfCdC CʔCZC4$CTCUCvCYCéC 1 16 2 4096 4096 1 2013-06-24T17:31:30.84 SDO 2013-06-24T17:44:14 SDO AIA_2 2013-06-24T17:31:30.84 2013-06-24T17:31:31.84Z 1.0000000 1977.01.01_00:00:00_TAI 2 LIGHT 1.9996370 0.00011100000 2.2734380 193 angstrom 193_THIN 70068679 0 1.5000000 0 1073741824 16777216 16777216 0 100.000 0 15311 171 326.940 510.340 4.26000 -16.5300 nan nan aia.flatfield[:#160] HPLN-TAN arcsec 0.0000000 0.60000000 2048.5000 HPLT-TAN arcsec 0.0000000 0.60000000 2048.5000 0.0000000 1571.9764 sdo.master_pointing[:#578] 0.057789000 0.60071400 2041.6500 2047.4100 nan nan nan sdo.lev0_asd_0004[:#26837141] -2.2376990 8.8222050 8.1000000e-05 SCIENCE NO YES NO GT3 sdo.fds_orbit_vectors[2013.06.24_17:31:00_UTC] 1.4959787e+11 1.5202748e+11 6.9600000e+08 944.30828 nan nan nan nan nan nan -807.98415 26227.485 2785.9046 181.29062 2.1540880 2138 -2147483648 -2147483648 -2147483648 -2147483648 -2147483648 -2147483648 -2147483648 -2147483648 -2147483648 -2147483648 aia.lev0_isp_0011 2013-06-24T17:31:28.00Z 001.197 453 1750786326 1143810503 1 70068679 70068671 1527 0 6 241 37677 55 0 3120 40960 7 0 1705976 6417439 8388588 270 2000 0 ON CLOSED 1 0 41.535999 26.691999 55.664001 69.655998 2041.3199 2026.1760 2055.3479 2069.2520 0 137 201 236 1 2 0 3 0 0 0 0 0 0 0 393 457 748 6 -10 0 -7 1 3 8 -40 4 64117782 -32768 NKWROKTPNKTPNKTP 3826175390 0.00000 0.00000 FITSHEAD2STRUCT run at: Mon Jun 24 13:49:25 2013 FITS (Flexible Image Transport System) format is defined in 'Astronomy and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H FITSHEAD2STRUCT 0.00000 0.8 No valid revision number found. Bazaar not installed? Using HV_WRITTENBY manually included revision number: 84 [2011/01/10, https://launchpad.net/jp2gen] : % SPAWN: Error managing child process.: No such file or directory hvs_version5.pro 5.0 JP2 file created locally at Lockheed LMSAL using hv_aia_list2jp2_gs2 at Mon Jun 24 13:49:26 2013. Contact Helioviewer LMSAL Franchise (slater@lmsal.com) for more details/questions/comments regarding this JP2 file. HVS (Helioviewer setup) file used to create this JP2 file: hvs_version5.pro (version 5.0). FITS to JP2 source code provided by ESA/NASA Helioviewer Project [contact the Helioviewer Project at webmaster@helioviewer.org][NASA-GSFC] and is available for download at https://launchpad.net/jp2gen. Please contact the source code providers if you suspect an error in the source code. Full source code for the entire Helioviewer Project can be found at https://launchpad.net/helioviewer. TRUE jp2cOQ)Rwwwwwwwww\5"⎯↰~~~vvvoongLgLgdPPPEWWWadKakadu-v6.4.1 WX15$#$e`fgBpS04NNq+vFGl^n8oAtNY9q;k1 @@=&(36gjsL%qdeNH&p/t_L4C /L}Uss ~AO6@AZxi E5020.N#u?]fv.0CkUy*M,K)T\?2[=;%]x157 /VA /Q+GWP^-vrS~ "!IR8E8cVT CQ!Wz 4+C "yT0/{7[99NZ8,Q,T yOJ`Ae_F*T(H^E< kB[h7Fvv|y+>FwK/dWl?.h)SEodeBf&fxT'f,ccKqDhE8}H [#/2(]tC 05hya>3*88NWiMQ1w[6oz@m T=R~L /hv_**#;H?ov`MY=JBJT0  M M4ssLCi$Q00o4r#Q7 &KT? \ =WL% /N; 0 "[fe^A4_ieM 7\B%,FI/4@1'IbxwMFop))SuO wMu2XE4;hx.7 )):I~-u5pA( dE ,~+^%hJ(M5O '6rv$;l_3 {P9&oE yA G%WP$ j8 A8 W<#Cq[*F>g!'E;e) *+f>+CQ" T}&!7 UT C.EXZNC pgM0P 1N(<L(ui' .BN@@dJ6<7>oL .$:f3 Z^": +uNgc[T #(\SX9|;TN3A Ua-2M9 '.X *.: {$xY=Sg>XM CtW<;D#!;f17 Vs yAeX32"k> vCG"HCv;`* /N 0:d}T+_ M0)+U2GG5 'Lxd,a8=Vr r 8bvl&(x@Jc{0 #Ro GL)=/m GU diSI 65p5IrD +20'][3 ' hx  #R k [ X06 RpB.v % :(J+HC%5c*,@AT 784P\t%rA $ ]*W#s #&%4 #y %_:Ae.F,[4"8Q;< lzR= b4 Z w< #(TF3GD2- r#R@9+RI+B  &H:7Fq' ^8 e+\u4XQ/6R0<AqEr    i)b|3 [  c|wU|*zgr(S"N (j`s g9$ CnG${E' 5 UIFI/H%$O[  r%Y md -ky$g ) (  (  $ ,TX//J9$CZ )>qHtU3Hgzzh9\   ' `]K%!#  !A ]q<Z]"$P [Tc~]>d9 '+( %p$v7 J,  n '' P _* gX1  nlB n3 *'&3 1,    ^j'gr  :3$2w&"sow"p@,LHO"Tx5D $" , 6C#/ #3V"|T^ noYI4 /e @/KQV9 !  T(r LX+&rWJ Ai"Ke3#! (3 +%! 2  SG  fL 7) h?#  FE7+wl!;Q"Z8p Kj`g.: Ka(~(  5G?%D+s  #8/,KJ S( 25* : "h ,TY77  CzN v#t` U`i G  ,: sF:F G0my "+ YNKd"  Z:>.}3  :Q]E(5 pq ,N K9  1M%HC=# ~A<%'= 1!k: `     c U%%0e&' B :gF7Hm/:  ", ' 0  ; 1<  _J3hq F.   %     +q}/, $o %vEQd -    #  &  "  :\~t  :9" Jk(L&*f`-C` ,!>6 3BAB*  % q4  &#!5  0 "#y@t__T2i-0+(&7J :/ _1D-.    S kZe#j % Wl ,#O   &"G2 {-Pp    "   5vOKxF# & &D $Ss+l#;K   &  *+ !# [ ;B=.+ bY}@h$  @ut,!C;jg3cI.)t! V@ n<`E| ;`  "#92 " % )E' 7S6<%w6 !2 N?1$o>W eEf[H{: 32# !  #/$ + ?Hq&8e"EnO& 4H SC 2&qJ T* $ )  8jE +MWGZ`v^ X   ,Q I(|Vu  #A``h $& +XfN b OK0A_:N jM d?D tu/ p5'U!_(a|`*:v`;.'%U+k)Dm) ,-|Q\es    | ߮P=7~O=x0j5cIUNTMF-8NMse<Cy9+A<=nߞ978 MKC[_yЏһG{y6]g0[5FpyEhhVfaQ.ΆqR&ePoZޣ'*wEY5JS/qXW=?ѧp.SXtjV傠ip'.?AxQo;{M뼧օf,L4DΞ>G 4Pk{ u/A=bte'#laeCVH4 T:n5{۹;B7tpoDOp&=I!ۿjKȝWb E)kj%oU2aiZiyӁj ⵂZ#LyqgMMñ*ap`dbq:/d\NI'5PwSŐt-hˀކ*JV,+(eY6`k* -@2 *s§bW`#7tVӻйPs!٩3pmg&e'!A67dΝ̏i3N A1H=7v"5 6 YZ:hf3{hSpÿ=HfH 7sG$aGrz OG<8ݕ~& i@Eٯwo/$sLj_h8ءEAr@/ 0 Ko jIR,vՏ+p?EiPtk uK3NU{CW_SNz$D?G%VfOcvrvT,-8?ܩw=ǀ _MދR#Ks1 ̕ /.(Hpurj![*߮i+Ѯ.a`*ە9pr5ѵE k+F<inY1DLMl|8 ᱀;TlWd H. o1WE#C"ϨE :!γޑ3n4Pl6n_IV0x?[8@=cL))6 @Ź|-zdz2/Ns BX>&wX HG>d()E nȾ bLq~BM_xovFI!G(X9"%y.!־D2I}'BiTtʦ&\d]Kh}|ÌZ9ގƈ ú\Rf4IPror~}dϑ7#E/2oQPEPQ%zyåkj1ݴ}"EUޜ8wVRf4NqbʜXu g"b1E%,6zLX>)'d͟]|3yXf) YӒ Jx">-sg,b)HK6cs(L 0 EJa&y*KErwxa1nԤk -TPpT[9 {1&V7Ab=/+BȐZRIRH1GRV4>[Ƃu3X?vה\-yMڭЋwPW}1"&$qFc|Yٖ4ޠhx Є-״K)Y]>¦IuԻ)L5".Ŭ$ !՘1S;&,!K4jpc4;"B' `R" ɰJ} OspF"ٚ {ݝ;.F%h6Y02Ix$IiunuQ5ZY=G2.U֭jaʳ& 6x\1<7ht9N o8Y4DeŬ* q"{e$ ݟeqr[Z~Dl|`oH uT~35][h]$@G:ē6`U X؎Glh%60,61܄$Qi.$n_Ec;ųj2=}#9{ş20k۳9dpGkjurWًݭiN ((M E zk}9~p V}sXw֜QjntvڋYlHaC!`w LxB+G٘r @;JݭębמX81DR}\ZD#F7ߜX }_KI ;[O `O'*^TyC粄Z&܅ ʟ0n3zˆ=^_`.oRa.I$:~v G"-Lίu_e8{s{nq`v;<lʨc("7~[Y/>fdd>Sg1[5])ŮCD>w@3fzZfhфM yHXMu_p@pFm?qp5fI"W!xJOX e.Y隀Zyx4ZW2|biS`!鷡 "I׌&9]&iI&E2ò7%tВk E$lUt oYvϢBT}[\$3?(J\) [Tlgf O P@Wa5If+I-2IJiD4mV¥+G G- _oPN }t M,Z6*RȨM3d[q>;\o_Vky?[J("0/gcvoM9JKb xe>oxg[E{π־&`^C5<É*47ɁHc,F%"CQ@_9 cqoV,0u`sBVxD ڹrygbD3*apݦDn>LS¢K nǟ'U$O~$'_i?n% ^#ih[r[uwBgI!Ւ Z9 I_Z#kIbaG8DAͳjBۓqc,/A+]*wk$o5Bf]3y7B,Xmr; 4 a{'vdatJT +@ 3Vlm}%duҼ'WRCVN\T-mI[{+ۻ7-d3iFѴ0\7n7$@HBݽ'bt ]أ(&e/<>,s] E X:ݱҺ@"%!!9H=\,n0>OdAAW~u7\7W泿;H'EQ's.uHo,v}r] ;Y)׋} 'Z_o@qPԘfL0eHSt}g a f!,`agGUo"A7̶cm)(|; G*9K~ M2#jQUd'zhnǢSU1CX4 ד̰@OĻ;WHXCl?s?W>qIybӎipt$ _S _xo9i2OSVx7| G5XKDزz__67FϡeTe43*.Bn):s}7![Im"VxKH^|5gakٕqXE!|_"c =o hn( B}| 7\V?yza{K"TcIlJy?5OFn!5rb=> ? .|,Ϻ7'75X޳mŐ6ޭ{ԟ,h˔ oSqwq֧(MydڈI ҽHa5$ط)ށS${Jl]+r=l{yĵұ1˶w2y9 `CKOJi$ ƲTx[!fh)A~X,U}5sru ua Q bpuӰM$ClzZ".D,8fĩ ~5ݼwn3.`zgo+`.Kmdx)/.[:p`Fޝ u*e0;=52SWA=*|-DӠjdC(iR7EZ*¾6T1D7vU,? Fz d2|Օ>jʫrZZoD6&x^+o<m|CTԯH-;a[8:WzIvی /v CfzM., GE7rh h5MVo >ӸqbB5)( w)3Ƣ#R;vWM!.( N][$o) 㯳X2Opq?/*Re@ncWSHZA|f/^FLj7?hh!7oL:L]?PX~%2> Ⱥ]By7yaM׆O*$6Mz,${O# *_B ի^&bQ_iAoϽӴztJvR᛹&qRg]W̖t*=)lD7_Iqo˔DTX35 ,_0GOv}L۹[`f$ppr,ήJe?urXIŧZ+mGFCrlQ&%h9[L I,9&}}9=sw)n(*TiW R8X}ba*aFvMTnKffB/ȉEҶb=2ƒRE ҚzᷫϮ¯.OB\AEVnX pΐvww9f+98\{+$fj3A⡙ ]vU_ąٴcضc&M+bx/3NiX'@C]W fZ k1YHtPU(w Kv-L!U{ RO,)H8Y#^~I};oGҞ2,/Z?ӎbJ.oͽq6*%D1$+Kp-Ou+׭eőd5/S4ݔ أ3(I3fl̳\gQR0 -~;F'o}ږ]!Er~j$+~Ekx|pc9s^t3; l 3)n6*.uTXOiP3q2Nq_ Jsu̟+Zʗ%a|3X,3иz}uVp:tdjmKk[2ĘmИ~.z7׿9u+B׊ 闈uu __`>;;*iHJw?a$r-N(&em"6J f;pTxSQ26mVAMyK™Օ Qգʵ6};Pbl :Cݐz}܀TM%Ћ K{XTA3+r8hǭjǿ&.F^ZebƧ>Fq)]FHPJ/_K#oCøS߅ 9+Zm_u aqak(5)K@WnREfOczUE`oXYU&3pFeulS;(fٱ͠Je"m?ƽ(0kc/X~hIJ Ua؜D|ֆ"ڌamw&4ȘDJ!F௖Qofeᳯt]_Z+ m?uMn( GDxl"?]*ݪuG0eO/1=6i%RK)tʒ(iDBjRm*xn,MZ]=0-+\gGgL+hRUUڻ96WOb麞!atzXڳRCwAI7TƺXt!sN/ngJ_AYo_CMb\ȣ6p~8 N0uuD !8mmԥM}ޔٚ!8MڅI*bC;5u?ڋ^ ?uV5B|dwifdF+U&c4"Ѡ>`,gKY͎"(dҲ2S5%^CQ_&<{0iēp՜XhY8Z%Rc` uU`hv!"t@+Bhu2&UfuD* B b`L y'qʔuƜЉ',v/o&,nwaGa1y4b }&lVxi{:L) } .(; 9\I ,u{{P8V48"҂/\{@kigDV4h({~5YNJ~b.mɊئ8Nn064TYM_6b*ŵIY-8Uc/FǟYa¸,3F Xk0IԦ:tp:K-oag4 Ϊ7x͗v+2qp鼬>݆g-0 _nf˫m{a>< kfghJ^f/},!O2HuM:!"Ed QO=. (jAczgߤ`8 Or$.:0cVqu^) %`~ WQɑُpQ? Q^pMIHgi9KzR9 >"&*mWOAHHzn} ۢŗua q8H6/҈XQQZ٧7q[y%P'f XUu4)3rS+y2xI(`Ð5_YcQbAUi,EqH_O{pwkF})I kb/ۡƇZ&ٮ<ν Pf.pLj rܠaGx>-`T7绋p8DGة0>$Z6K$X0a0.<D%%(5r?~'5"ĕ NVl#Iuut˰f=Jyʨ8 .4+g⽛nP-߯p\0{;5976VpVdLk` {Ɏ{zH.բ#ҲqCB pH1"?)*oS _اQωFbͧp)'}HxK!@ȫ5q2]+ZD{շޘXf(8ӌBSt?&+;ZܓVQ# `E40]Ϝ02A#Dru"'r8ai 8"Αy hd ZS3S; K &:57t`p5݉1m6탆\MbCs'Qi g㱽;?M}jkPՃ !"+Wf$1) A *t"@Frb<`ZIlYwR3/utwg:Lt΅YadE:-C8w;TeR]D]H׹4VmtOV ۂmBb"f/܍g[쾐b*U6kVVVE}7ooӋ7Hj׫MԺxVfX4U)WV1"&}t7l^3w~77aqk*=qU:uß1QXMGC5 Au"Pp؄$+A&~vQ TE ߜA"d "Anw"uS 3I9 `%bla]?" es 9 %ѽ ]̀~t|e|7'Mư)HUVg##a]'#Lri0ctu t ~/P2?I }P_ZgW)3o&o6Do#e6Š!S:@ZN|MpNb;]pES|eӣc=;xIDO1TH"ļu9f pv+zO~cǕM/b&\Զiҵ?)f6nK9a}VROHtbd `ld1&,?zw'JM">1o TP@in͹-$kdXz;h^ـh?I;vķk@.Vz!,vЃ=?B2?SƼ c*-`\WؗC8?J">/t=L v+! Jgy=bz!)-Ϟ{Nd#RMs; hBapc.A|-h2p3ErG՞)lp۞Q'As 0*bA1 i'3嵥3Q]L#>@8wJZm&fa+R?c-s)LoiK2$5 X#VΡ#__sEtY5{Q{8qj=0xCﳸcuQh [6Gȃ߅Ό:-gx\t4`Tv@4"C/k|y,6i5Rጇϯ/, =]!=) } ']vPvekLW pFKƃVFx˵26VPxӄYAhq41.ce0q/!Z p벊71 EO ~> ;=dX ma)!&RzULf̒9,JY$Z"58h5 f_v8̙>gԣYm~]Kd̤c)T{)F\'{`7m7WRaJ<)FP_D +!`Ùj î2}} g7ZN0ߴ脁x1eXX [Kql-Că`EX 8wʪe^\K{y-ߵ/*m@c&"ǨwlUbA%TJp | H鮴G:sqԴ L*Z43rNftgU|1Z L*̥ؑ.vPAY3h!w$VA/4CDf 8GVzNSSzj7~` ZtOƆ3F4xܰTr#i2Ûz4@\YgWxDX|8JP(BJHg0'UHؗ%_rkV%yv]%x~4ia_P[i ?y/85uN=Qb=QIIw_?t٦I 򡰀4ja(c1~:A>%x%4Qˇw%A(xXc$u^2FI0fCζ.W3zM kg_YjKvev?pE= \>)j%:N%^Eê8>hdnb[ujKO2ŕmdw5"Od*~C;S mJ =Nn+E ~wIb0b },W :RR EE*(T8rsOm"`˿{j P:P>Z܍A_1ǿ"ߩ>I;}0K#M\KN?EF>_W'ĴԼ~ceWbzEnm-O"-[4~XS7ASArDky7t]*#J;Vf]fh_BWs` mKMA邶PzbpmDe0>K< %|tvb7?4Ex6؈Y27}4#8+S{usJ L8Uj$q{q:C #M*w(8.,WNcF,8{n( ].p(!y]{SAWz@_h~V_pj(TD?x꧈r;* bd6?CtW$I*6+,ɩ|GDA'ˇaPE&S(%Rvj%w$r<{H3$WsSa\27pSZ!T9]l؝x=VwSTO^pe0oޏ"a&HQ]7bz~}uaKAm# /6M\:x4@/0?ҁz(Z nEw' ꪸOF["c8OsB˩SwJ?1mUߞ4=[]!7XX-3>>6@cr\`(ɱR7c#P5xq-ZҠÛ$f-4&Sb-jXYǽ)CR0coˋ^Ū1QUs^AJ)4*{gLĆCs R[T҉-Ҽt֧޲&&23|8V2lW4j<$T] aV|7cm_r.ՌGl s -G݇2X&:魙':o?pHmC__@4v=-:d('v"_{r5\䎉㒭Ⓔ4l9 t E!u]K=xfHxbhp#dѫh[IiUMd`~l\ 5}K+=ŏusK(H(ѓR]/4`1shm-IRB] Sel I͇\2nH|Y s6@{SٱHހ Qz-|qM\ɤV@F?Vd =t)$bvJ2G4?bʫ]G. 5¹7]`fL=%7{Tv,1-EFs}$S?ёrM^7@ϐr@%u&޸`y2 DwzllcnIG=GO`9g5xku]3K? y-؅ GN>%n_W@ʸ#?'nY܎\s =)ƹ@e.N#"# >Af1&lY%{飑8DDX]Ny+$*}yS>kу^@yYzcm# eLպ'N5f ""j#C/R)7:Cў u.է0E ZnQTp*?8msVSJ"3 P`ޭqο'[@YiݼE@e?{|$}FX(H 3Ӓ[49K3>#y3(``<(L"gе)|-(i=+BYf&>s=!SQB| Iqljʙi̻W`W  ~o{GwBeqZ~yd#Weu.* }3bm\(D<@mZYʸPIn/鑪Ѿjn۳+B. z!d ҉jFy"yǐ[|>8;Qz=AIr dj"~Xj枂WѤJDJ".siY+<#H g"^ThЉHAx߮>Rdwxz,g޾Лpŋӣiҕy krt{e 8P0׌_Yb/h>/B_۽ "\4qtIJ_tAfwm+"V}uQhpO: M60ń-GcFXionNp@)ju tcU_ ɲ>7s8І <&E]` 34jM7%^W"4^مWxu@LZA46XDL cIR"OvڧpÜ H($gB]֓?{Zp+?3WѤv+8thp\n3[췛 !;bX.k!LԮJ8ވw !4'k[ژ (DfiSא?w);S}rsgMg .Zd |لgjhҟ <#xؙ^Oĵ~:3-L{tIU\zJoҝ@ v`-org~9 rȸ闳ݺ@H7O/3:M0E!<*#Gqt2]ʲ|bR%6K`! E& ;h:= $h4dUw35<;b9C|M!P6J/ӐB,i1K g)oI=E2j3Vk)@)Rjԁ{yMӂy - -Y0Ƃ (ckkI йH-!iDBZHl2ء;qq>xF6]FWDF ;֥R|M@"cngbUጀ>xGN-2d+'ƿ#s9n-2ʠh {2T lWtoD5JE{;gSV5ECg`KTԧ58~=JSJ!-ӄ/c؇0 4R"Xݠ ;RlzmOB׆7FqOK,reexh 5H N'J-,)꜑L Ct0jp?AGcޠ=(s[rrr4Lj.I.ʿm ̣ !z$uѳm= /-UK8?Tl6N88E,5 sP4 %g}3RC[ jփ^)Ͷif-+H|n`\;܊c(KtHc ߭6-_Ķ~*e]D  o}gUfU#1jɕܬT3?7R~ejۆ^NyLa{W<˞a$a@ēAeQʠB 0{|M[C٥N0q@p+*J#`^?vAI朾 Տ4~SG)2>]x:^+5M4?rL=a,=\vrX(݋m7Ov&1&jlV?", ru`e2k@0ycYhjf8anX0t iox(L98^ڦb/OG ֯ t71Pth.iDs)"sJ9%(oy46T%@(T3gLQSψhˍK.LlX7?fZ""=O߁%ZۂV YDcR&7E>D*?x'$D 7_. u `Cmt/jsZWE/3 M¹wh`6n:xX^Sċ{=Hθp&5}30UM<~baq>m|bu溎E@0aW]TVi>xabqR\CdєV!h<VdTNuF\]E34y y ;t bT)O˄x>K B}"R8!Fx6o(*?/><$ ݼ?9k~`6Q.a"ܐ" 5k//{U3MQpԍ )~UT`8rHZ+ʲ =tx .=9@[~(2AviB+"X0n%h 2 ucݽc9Цjt/BU2l+!yW#ÖgyBCUQQ9p(G6[!Ӊ-$4xC빀':mLȺ /F?9Kᾱ3!-k/Uق^ Ii#4s46LDD4B>ōRO:Fl@po,*㕯&{?M$= UG@r(D2?t9o4dXL*juiO[C h\;2GΜ7:z.kKuG$&'t?Vf !yǤTE¡fMO׫{>V -(̹EF=㪹|M?S-o3+%إPLzOJi SR4DVYGqGFMaVCgr2Ml@,1ܴ*>%$@uWi)rt|pYM Sx9iQk t%iA3fԞ^mhL:cpt_!;DJz}t#]v ] ;JNK9Mz|%%4҉ IxjFXO Q*G@fd[ JE^tZXr`K{ ҵXT4/M/o§z u+MOq-Q6)lp2|¸y@S7JT~Vʡp92b=B=-/\+( x dx1hҘ$ #ggQ{N$l[:XJOUrZ䛵d|g5t,+dAձX8dHJ=}g]5o !;eG5#u6rY v7/;R1apL!2L@\Y&:iW'&*5EaSݳj EZ'yy"=J9_1?1)QVԝˈrUz_ntAT\*_phn;4`}"l=3_9@<b^vj_x2~{HV1M@za_n]t!`Bk4 A %I"']{z7O&$ vCK~8MbΤb,g%M8E׏Yq 2hȉ -M/+^c*\Fso]Fp(plejuԓ0q =0VeA&ꈍ<<.1%أ edj{+;%%> qͫ 9d5L0DdXxk pr#izhPp/(CM8g֑ ~HaQ݅O]%gS=N Gg8YFJibd.GԲ kKGCIˉb$s@7H}#7-G<3"UO;.lC)Q:R⦅=ŘpP: zVڥ'Oz 0p6=2YH qGXPy'b2=x"( 3×q)d@Qrxm9e-!igF`nnȅY^lhhE*fڊH\3iڄ§@ nK|Ld Hb|o?XqnV[dǐj%4FUPqg)_QrHt' ;߫l͂)OqHbE G\^ ;`t.≳ Nn2C`,Ԋ׬`Vǹ̪CrVMZ8V3(0^y+/[E1G t I]Ħ@Zh/hr!lMJ *|k[%xcC7Pkz=Rdzl)2Sh_0Jn~T<)9#F->qYõW0E>R`Bbj@c9k{xmݲ=IN cmA`g8Vm.} 7kkW(sLF׶`KrBe _\=pt4זthLmwّf cdG< |2,I4hufl#Ԝ\)խ}D;i ұb%Y݄mÂS~nJqiyB#mwqSQ/2owfBǖY<'ʯ(&,Mk9@/ +឵=|9& ‡5ܓb#Oಊz]4X9rwٲ̢BhXZ.%Ьo(^. 5|ch>8dɪ/*2B&FA\鯲Odˀ 0@}(.F:C\7hwB[fs}D-/ njGvP:7Ʉ:cD'ؤoqQ)KJhrB' FƷ ETGl6ƴc٫Iu.&%k9:g7D_v:JrWhpgQb+t3PWI<0ejXJ9XMn?I ioj[ Ʀ=OL>|wYnD'v̐L9VvW;*B%17Nr(~ǁ:t?#mDtBBnl8t,eS 1F#q: d5X,xfH\Nt8s?a6Ny-:-8^P1]TuY"Nߊ' M V5orsJ@sڲ /aՈխX>4OSQ wUF~`D7e;)11ՃtTLe֧;J[@d&JvVw:Dõ<@0R_^|cHOJF{Ϻdbk|wՐx3YЪM$갮g~!ޓ4_Xbofs\mjOe5J"W@ *B_O @j&ěѦ+]+t_g6ƬROkD3"mD!"?$z{fo&u_kϰ!|$4Ƞ"RW۫ԅc]H7%isɎV'*t/*Gq Tr楆[]Ko-`>;LFF:yb^92@rfJejz(B{|9pE14k:[RsEo먹~E"$bXb>>OKZݽ`spWU\NKOh,mhHڰ!*/PrṇJ9LxDUmU}ZbA׿M?_v)[#Jm~F8ðU@9ޒwИcCsǍ)*0Z =f[㲊qߥ#f?c gKŶG/(b88xO #ҍ;?dAm|z.ӱLɴQiV+xy@3.x/o&_`ޠ\`E 9ei4 +, 5xx_M(F#*i O. )nNYIUs% a_ߴy BuMUJ*g :~(ڎc F"Y)C8hHqF؆3fz cBr 4(Vv63sUJ֠R"Ύ +zI"T }3Qa+dR[^)[ɴm,2Xq,ۘեNXɏ fXBӿߨ'#N tsA'cG] A+"E)XB՞MJyMh1f>`2ՑJB\xX1$B쥥2^Eβ)t46:cW3QRJeba|7*f}48wS "\ZguJ+qE pV= m?܌OjuIrWvMed-8gjI"l.e?%cy'(UR2v!ڡ$Ig*ILc&*n?%j,R(?Z :Y8s4l K5bӈsv!)z_׫Sdy'呁j~l0K鎆y$ȁ}_B6k[&`㻬zd~5׏*\.Kgn?:Sz-D5*x}ʫ=e*oIy͙å`x7\n旅(T74O0d]l\~ut1 JًHOap2n:(YK9{cc$Tz&|-j3` =[BPAn_2'R6~ 8ʊ|PS?k6l)kR#Ɍ^ت CƁ'$F>Dt\  C֕\|Ҽ߫$U#cՎVo =\`NyɮLȧ{`Wh`t𧽸o9P-B $;0.,H)sز/ʫ)_`< L eXW͂HYE;'xv=illKJKDEv֯d K eqbՕKG]i0P9JM#zG"].4mKhrܗ\^¥o'hXe/)r~2Q#2!Pg9@=x7SRmSJى &֏w q MTXMq'}&%fuգF3)v`FRyc.;O[dh! PH}}0k B^^g՞^-u 7;|#cD!+_NbypF0RGorV^5!"!03^Jfu O5}g->"\.{l|[t{=Qͱ~Sw<76)Z&ǀk7W`Pѷ#n9yunѴuQ%h ļ*R -bGAS3l|~^ U&F0r#5-HGPF?Mrϖ]@%/{ ."Ņˡ^`ScX4t ͺ˯XI~V+RX R!E@H1e%98k7n#sΥ6eŏhU' $}3iP$FA;),"t[,xDP0iaqb&4k/]|yDX?.,eg:W 21-A&ĔL˫\"qxO T~~pq`*bLddU#p=2l䢂H>QypX&txU3-c<_6*uC_8jLUKӓ)lU *a^ X\ 8n)O]rB9 "zjpz>0Vĸcj9/«خpRk;c$,(!dY,MXߊ(AqTY^?6qRxt^xRSKn^ݾ1 %{^)9ns)G1 @@l26N`^tt+CZ|&c?އ[mڞ|k`^ʇs/)aQyl8DL"#?C׀ p H `_=OrPD5WJ4%,@eA5(πt5|@6D"A&0"SWȩelA.԰7׋CႁiC}+6JA9HCꗇv15NDR/8(˭mc ,)D})#lBТ^Yɿ*YoS8"ZuF6GcEEx =+a,]'鴴֟ڢZ;v} *5#d炋8lF)wMZ ,\i"* E~vx#l]ʹ WUhsٳ(XwJzhM]o(\j)uddר0a)a:j)kB} nD(z#++S-IҔt^U G\TJ^yE3fH^-]r2F2+O4Iu0_y GvK걼KЌrZlд3 G ~'ԻghDUkrDv`sbeT*]9@RҦϒmz呯o.޵(Typ9Q+AiLpb0Ջ xn,3fwBhXnI_#4ޥx i?+fkA/xs}3[PAUB=!Nú*?,z SQhv"{GPPS!tC}GWT28b#&S~mG# fP HpY r=^!Ew]qM2wxsEx9?(e{O/#GNC7,65R`!nP ihI\0[0%X]JBZaSh&AP;h{Rw` /0y'w&̫5+MЬߒa&:Ti"{ \Ha&}#~lB4E,EC$:f.=`ͻnh2dK߀}lQ0(1p#xq]uF0T!W6PcG~@ תrߕ6:nq85W7 ,btY+}pw!Vc+# &Tbfs%Qc ?݇}c Q8vJ{FommVTw.nu7%(8? P-fZzlffm W[k*9Ge?f m'-ƮXz,_Ra@a{#`Kɟ#T6p}2WGt60 8>vLBQ&C\ '؆51ipu=oκq΄m, Ƥʹ{7$@\j<;p{~CD|LzB:EFu'Wh>FXHM^.T5\QמiȰ@]_IΠwSЇ8"(;f 70e6B/]OB툊zM>` _Wϭ,n(LHq@ZtPvƧ!v] r=|2BDGبHn:_C(?)\Pp`f" 6Oub99ؗoR+,RHǀl،-P$-HFNMr3)A9A5qQMe^ID!RsxӱUCwͩz<Ӎ8eK]t;G)9Z=P}N>%%%$ɵ…qy ߶MK/ۋu$z1="̢[Щyw~ {VjGː!ҕjd;&NhS] {! s뀸QAuOBڷU7s˦W>,qWR_&I{MJ4ԏ1f)OwC'ўc6uermB7d51oazx Ӱއ}$+e9 'Ukļjf`C WVB4W5~}WG?W8m)9D k D}Kb.QXvAO]I7;i*[7/YbK5VQ! eTq I "imUUEͥR6bPmR@W?5Z+A0CCc;6L.JoܩM8X"DAFoH=StKۥ]@w[zk0`QVΕkRQ{rT&_eTM>"@1ԤF`6#Z܌^wioK>tj&R]eV]Y2FEߎ! LYK>4"1YΑ*mq,m7Qݶ60ϼ^!-g~t=GI $'b 3ATykS$iK< Hӑc{g`/- QGZY 2h& 7{ct5xU{t2n2 ɇ&Xhܿȕ$x~c7@H:x[Ws/Rs QhU>=A=NůeIQ%OF{d3̫c o&Fb`F~DS629tSvf1خVjr+ؐ~YMtˆnzh}P | Lq4JR鿦鲗MHKB=>^O}.K[kh~;?pA!9`N!֒bB8 r3!DjP>&A*r]Ubl'0dg OXD4FuM߈WNl=<'ՑTiaxԺVQ^Z'7 rF))S\GR'jd|0R/uGP63N٭6:y{c[tXZ?0z8zFvz|sܶSR27v Qb,c iV[æFS-ND]kVARKK[cz \.tW 0M2)}qF /{c3QYfBVkC: Z^/d,%'' \pëLwE{S{"2 ݉ nqV@fDdEX]A뾹A~E6vVT\|%dM=Dh.+~/xlIc$n] `~ENCK/?a'_:5i!Yw@z+kb5q ɘ`)gzSCRрa^Tϛh=(im㪾xv*+zȏ@*wdom>C0>ϱCn dT;sg-ta9צ"^_?$j6ߍPWQ-Q~D 2qhR첈#?# w_Zaǯd_(G#לC.ub塴=k`HF3EVu|(#놣y Ce YA:#WQǕ)(~m>4qLF@m-}DA!H&->G}8;%$b'7|8֫eӔ nQ z㚴h47`t;0 @#y w RҀQLb4.G؎!zA}8A/Yvb:GI_8ld@2p .*:#Z| RXǮ&&XX! Q"_)AȈr65Ȍkr,:P݄RhJ?TiʱیwORD@OS,qkxo_Z!#vg`)<ԺjR|!"k6 "RJv7>-&!^"_涒J Ac,S3O` PoQٸ: M"4^Bߚی5@"r2]ޅ8F>0x4{2ͮN#?/fPX\'X$l<@qlS|>6- :Jx)2c̾u̲PØG}c^/YNfS$y Z$z`WVgzIdf↺.CNs$7 Yķ8&u/Ѕ "|{Ph|u랉Rv[ア1ikăHZΆ w!3bQpҝ ]KDv"Q]Ѭx1,9SLISp=쿠q"91]p'tc6dYT] z=}8"0oCm>lͥ"2#S +-Auzbé`N*k"3QGI❙Q 8Id ڕNp5r֨:;R\t#o+{s3?P@^EckCn`=! ]EGZ h&p̦@z?.{ʂ lBi y rk2ReF$yzP_F8]SA 4$̄ڇ10YKdӤf|Z! Ė`7oX/!أJ%!pd::]omA@zY,B?dqvsm7Te`)}/įc5笷ä #O6ğ"r>7Vt+ƣhvt'|'G`u~cd߁8mM:-KC$B =\ d3 H'h~ǂjEz( ץi:Kv;Gɵx~F/Ǹ5Ve@M$[Y0^](aE/yt ]A[8X鉅׆NdO-q-7xJZ*F+'OK*)[}A 7"L |}E?XA˿yFRO]$%{$w6wczAy(p%b_`<(i&F{" ar_O)i])&㌠ S,bfǢ_83yxso),Ƽ9X])eg2`-3!̗]#v(zLxfX>umZ=}:.)`z5% ZJ#0T&U2TEzIceJMB0iu3Ш;#DBoT bZgARN+DsxOf GFN\Yڦc;ړ0\GC\^n( )b {rphVw@(jqS%VKr[|\|m㥊&(fv m(#3?粵^M"sDeCFcC`O cհF{]=ouz֎Yg,@|kʒ)9 >[!!|#gWcӑC`RjB{[~?u:<W:ZJ]MYݹ}MkF$NC6 !*{G@O8 ʧ8iVk27$X؊/Hm(=dLm+ZP˕_u&BfnGbwV.{aevPsfZޭH?$}kRAH=mG7$闂Pb͞_,XFl|_|`= >2TZo )0lj?ֺh ᅍ.> (RQawDvԤǬR1#J%6$7 De_1G_fW 71aΰwJ+mEB2:Mj*}? tF=*,ؒM ~}9dRFMSeFf_UO/ ͇vٻTN,;ؼ)I)W"CHk:t7]dm.?mjY9SqI?V^uBM<8K]؎.4Dbm["Wypx[o',m):GLYwrJvy htC$7cIuNiu/&`'$tt:^‚AE PVT؈yd>7EL\W<(I)1£DYjڠ_3!"]Rqj(ҭ]=gDX)YO2`tG.UJoCo-UUcafHlѠU (tVKXch v*U'Xk8p)@*yuN{s76ERT,UǶ,8Ϯf!H|y>ϔmJ"g.l,*PGN$nL';_9pFFC=r276V5Uw7_jc5PV6Mu.t[#=~x/`UX",i]o")6H5IWܙ9辕7`l&~UvP}GR&hn(9\%Db჆V-{3;x 'M0LFݨBf]}='T" I-gQRY#uC fW;= H !o]ݴWw'G9#cf TFa]ly.˄ J)Й]@2`Z{{9M;nkM,*cr?^zn7D˖=hnkP~u͆MII)-=e NWj"H%z]ƅ]ŇlɖpVjdv-v-vVm_م,s7Xz㥷8s*OHK85xuu3fqkU 茑ЇY\DΨHVaōy !׵n? b S,a`bvREĴ.棄8 2~zܖY|]ViA8$ZWq7ep* l~z۸٩EJ;I]+$r 1:D>+&̷ ߦkNHLʊu}nU]Vs8P=} ˰ W8`©0J*z.dI>`@P)0 -Q!bG&XZR8t֭05Syj_Wߝgz"hp^;Dta?luv^2PiƌR5Oz4mB7/[ЍB)NTCEWlKc2EYy6y>1?CYyWJV.’ ,r՟beN sXlύm݁xgz)Vk&Lf a%do#[M ,a~K [Zps`J-f^LOw{R%/&;^,٭Klyb(% 8?pٳhN~7e"Ȥ, z(5zuܴZPŒ>Py@F]8져4 o:>'oB)> ŗ{%) "y7,^ BΘ`eQrɭoQl;q1C6_Z""{| [ n\6ۓH?A>x<~?2$ xՀ{~~3剓Qbm/q_B{@K0ɛ*.yH rEћr.3o_l6 '$\$kS]{^38gAͳD:L1NG]Pv<0nb6' * ţ-3]j[#0]K9љGƋTPG|@^>`r5bc@6mzm~.-_LJ8vNNxi,ܱVC%$3""cEШ7fL0 ^>^ ^`u(r#U1)Wy QiW‚ivwY j~;oF.8_`'rid:/Q1aDB8J-|5K)p=Jh8)a`r!9zߩ#{FU2BV<@-tqI[3QdKlmW]k?%^x`wɓ&V6CN5B@ܠu'߬᧡4.KJZ'r B@LP"d3uij(-Z.yzķN8{kHEu8Fլk2 5Xz i]c\SGRd|b29@|"oRwOu1ϊVM .av@]D@&v˕:-st$+ۀ&:mq̎vO 0'> vH [U#q0*x,EOA4د cc߼e uy3ɞ\/0Hπ@@ Lƈ/ 8ɐ2'fW;'i xLL:,]@iLLL!|@Bas.ؘ{/K盈>sX1VQh8dX #kɤ 0@tȄI<+CeǠJܖ]5,rL6YH(HF|QsIR>8L 5X&M h/(lj^IHs}^yzZPCOHfg9BgUFcM5'K ?aa%Kd SC(j1.\Ap9oEWX$ZrAqIl`]YoPòJy#K{mH3s @*IEw {A#FkGn<[9");na2YUiEA3$6F\cck1%DBQ"<.SW en/ )'jЉC=:э"FX-.pr <[h28UZܵjrP=*fR7NڑҊ]tK~MtRxpKfNƦ0j)8i*k4q~JSwZ'BoD+<5Bc7`pP /XLS=kCU\-Yw hfcf'y r/?S"!z#'&HKtԹ9:8XӱcMK&nܭ=E=:7aR€ͫ`db-!5\r S^qVY M-u ոŏs7} L 1y~ǮA`3k-Ɛ1Pey_&mTL5G}q TZwnفWebO{ + V< ϼymc5 -] NqgՍZ(aM-=ثq2v"ZS)H ,AuOY+x\ݘ#RWboܥC9-U_v}0ґ}W2{s;֮=$ \-f 'Lq8PԞ$H`݅tLVVRccݐ2IΜ{dC7yUv]lj2G"V<şFO/a 0/8#{29-^1JZ }@+vu|ݩ m0-sӘKHUԸZ6b@&n4U]L뵴jxStJr 9惩Yz_s}1P^az{L8Cby8K7֜W8(LQދs `KF|+gz06?Ƶw+/1Q ]m F{Mjah@-YHXЈ7bӕww=pR:LSE4jGr:[Ԡ}`eyr @azswɣੜ"9T$۶.Ŕ>T01,s嶍QjrhMJ r7#MK@KS`o&UG5¥C ٱC'W20;Z*)o'c~j%_78ס4Qy%/JڤMqw]/4&ÀPFL:"-:I{=2C/>{PGA=[? r1`F=eӬIw^lO$x8,C=Anx1wYy 5E(k MoGaIo!\xP>wKR콗2]ɥq< /ĐozTOP]E[cG)hRe,uyS:B3 | E*_=uHtˡOp=Dni ~tF[Ḽh5_/ w]a-( .Y_nd/$jnfGS*Koig#'u}|KA=0SPq܏,ܶ(a?_<'jNԤ 9e^6V0*[W),3 o sP iy+E-Yfdb6啲d8_wyylK:r.sx8ըG!W?nwgMϞ`LO@Bu"h+96k*Rj*d,9L$kmy l}Grzlýof2Diް,GbV.xޖZBҰy8&qoL @MvD-Ƨ\a;DVjH)oK;5vZ98]n^g4 8UZ \]ǴZ"!nU) s^oeԇdPZ2[ݶ@i̅[6vD+fTSݞVVbV%.HF_hΣeŸ IMo;&NR6RG- XοIa VG5w\Jk$^E];5bc"6zlXZSu# 0&NYb%hJ<(k} Kďb S7Èk0Aϱ7X L+tN?mnjzC*42}2?ao] TT&ygꩬiKB*TP^TL-uzWڀjS'8ϳ,U*EX\I1 S -Rs((}60&Hq6ZH!tH֕_7\́{|n\e / P 6i]mU^bz>=Ȗ[EX>ȴj4KzF ɯ.vLDJD=!m|ך/ߎGc3>hv zs^\pWL5/bndOӞ2bfHjG @% uxE:bwŐH Q^^À`/s?^_wtU' [sK+=WJ;ϼޤEIܺLʅID]2t l 7sa`D~QtG!7ו(s e4jfA&=Fcټ̅5u&djj{eT%}@PQ9ysH!S= yVl8m'rJ\xXCSz7y< *vz*ٟjpQ%wp𗓥Wz7) ]h|_a}~Pn;LMs Ĩ:ںMɊTI:}1JBEEZ\'#M %89"{ˎjv?DTh&^TVlE(/k\:UK}xI.`r{S-I Zɬh$o>b4 wRVt;.4 ϋLjD>w {E2))NW,/8Pc"wU"=fZ|A@"zrr5úJy;]jݚj$"=4!?~QE ~w_ziޓ("=Id옲 =[7 /n.%suL&SԘSW; Az%ATq.٣zK]Eota5&lH| /v]#;3o=+;3es {(bN fV-qIi.Ίf+Hl؍|{z 1UpmEnUhFWL>,f\P i{U&a%%\X>}u=9O[PLT@ԡ|VjГz]f1"=V||mv_]ݵųjԹQQ/| 0b≠HoŅz> ̈́L,:RHq2Id⪌HW鍶7;Ju2zo~b:j̆z5)Y(ũj{/@(S!ټkA5KýѵT]V6i>m;wfIw5:91KW¼1EzJ[K⋎B r0j(8x w3ݩ<-e⎜#E/;Cr,x'f~\vqڅS,@ iѕHT&(ދG!'Zd+NX!-}gf0CRht.aѻ"?l HI (R9XF?+ "2Aۆ 4eho{lMQBszgэ| $qEkl?u~@ik@H#(ф Xp\ (R6}v`>4[&I&Zdkkg#-%M `b_=>~Qd hɔaMOod[<RC Y۫8Ii\3{$*2nwc?t%xA4 + 22tޡ4co0 n}m$w1+ޟ(׭?/u (G 7T/")75&`H4$풘QS1D-ɴ1^&@GXBO[>*6ϺIحǼqK``)KN$]gI|GS?;!0Su8IZk M5{-11V-sEU ӝwp/;31bwk^_*MD4/$|]3QCC<ד#+dVm b<8^ 1sv`1$[N:^[NbxD T>>k !5oKdA;1I[ %x}Tx*&R1j` T2}cTZ旼KU[B,";*MiuuЖ1ߠ^,> s}3si=mS \U:5].kHkwǂzUtԻ*u1ed*_2~=oY>/Y'D2Pg$ eMdqޮ>a#h't֝34LiZ,G_Q~!8"nI[si@t;M48CDu2퍑OBT|=Fm˿}2LԸ6hk>qKߺtovUKYq|DKX3axĵ;B"uۯuwO0r3A'"'WWFsQ+w?͑|1-*2 Rw9!2-$-kK\$Xp굣|&IgVl LG4(|~/p Ͱ7(Ko?nWO{͚1ʷgr(ܸR b9քMHXfGmhՋ8܀QC1+h0XFj<wTʼn\GRSD"U=,Fl`+IV4(fwiLJRtGK l}S2}J %n5KCA ~?yVG|(SK|m;z[dI [q繦yp(z/[1 IwU&I&T`?ʏgeᏃ`Us 6쭖)=߭PHT 9a+:c1;![;Ebn*e=Sb('A 4ED$k^R\ՌAk0 )R8x2NqM! }Xv(M7}7jg~ ϗېoL4GE pdK^`.-nqug{d5[;Xg+|@d-ӧ/! wǸˆ)Ƹl/I/"fx< =] nkޭq)qRCWFFKmlheĕUNR[XvَjNmr:c!UJ[v-! /7~ͥXTjVhZ£b68*VwXr-P*yXϮ޻n-o[9 +/aLUs&A r eLj>pEӂ0z[}u`i?YînĬyz k ܗ0{ۿy*?%hoV,ei%o/25ZκmZOA7~O od8('bg33fSۺdzXTh6j?}s$L(Fe~ů/9:5HV5KW3V FG4S9͖jYךED2E x-sY9GkЂ)sa-#/xȭ%=4ׯI?KJv8zx'jNRKU{0jW> iIR,ѥ%a fM M%::W *&LP^oﺞyk;j3ht#s+4ܱTOR${럴G BNI|Hi¡m.;Di3tz&r o{a\%B(NڬɊ Y詯'= kR1^d2*c/6L[2[q@s~vMI.$:-h>&۶}YL@}дM͕= )7ʸEi6Z%S8^9^~t`QB9'KRz"J8I[hg WI\>;"SfB눎70{qmR6~5d_|s{qE;8J z*E%h Xcw%0DOSf5͖VZ-cߎya.ƿ7 vXLH5V?͡|hanL]hGR_S7tΜA33hWPBCؐ]E3d Q̈́[5-:Ǘ@BGrk$dv&蔐_(~@R5Lv0#F,SS: 1*<e삡@"iфCmI*q 9eV8v7/l{gy uH.Q\T֭-ws-LW v̷}yO*LQܒ;TGw.|ψ xro^ Zr9:*rd-Df{ nl3sj<]{9Ufoi^ 'Y)ݲ [&T?0"ɶr"Q+jkOr^i5ba{^I|AݥH%;샃}ۉឥ@9}EA<J<ɫnY BvJ?C$LQ)Xj2<&Όb1K8V)ϓu1ϯy@HlW+x(xH))jE5r-Weu;Rx,xd=tp+&Bk9(A}\U߇c7S4'貉6:`[XTX#?p_@!pN@<,e5ʂ<ٽ9Z\b+`.'{qa9ęVYهNp4hѿ"̸șkf`7ffEoUg' 73s[O=E[äR2Z'|D{:_է>}TV \ⲫQ&]&nqzw`v}@K_B޷yP}oZee%J<5=V=jǘCc=ef\{ockm܏Hoqzy;bd]1pX+$XڋKUMuN2SKiq1=v5J)6ŕX3(Ol|W }p󟻛%@%JHR(SJ#?zilyuݿHd?Ssi.B4 I!d1`*p((W,63B۾|VSy9'4lc7NKľ1NN??Ṇ +s/ϥf m ethžPGVHj+-^MK!5Xa[,J% J~Өe7"ܸajv!I6l<_xHK4e^3xUb_c,?zSdy=oJmp?Z+pVwHzS: g_M~J ۣ"+S1<}8jҗiI&;>m@E%~4^ o|TvoU?CRKޣ@oǐعb P$?kjwE7)b<'Ԡt{u#[#NbV *T4`KFAi "T93i+U?qX.o}F| K'U8_Y&;$^=\?•iTF0:tYt 1W,3?z /&Bv}"CW aN$7:dACZ .ɥ>Ø0S`sp>lS>Pc[IO\j2l>D:{DCx|{F)Az6j}OjM"/er>CբZ;%X9"2ª~o&ѰYWY)09k6@_c ǻ=ܫCtݪmti*c.OO+4-}EUll8q]3n޵ܪR=qc+ r"Z*P"-y\*@4_WT1'E֠o;J/F(v;j!T蒫bYNCL 8ѻ#[! 0!0 d΄6!Od3r'sp^W Z۪Yp²ᅵ>1-hD`#HhLӹeTƄܱ2^%:pjЇ`]Bt EΧ!aO|1IGbVG8aMXx/Dbp-b.Z] 6Oy|&NsK-qyډ'1 ;8Y-v:Y!t & *6*+^y973)o$W2 |V2VFod_w)<&U ;daVeF* /J>hY3H[Zr?#jA΍O3ϴ5TMF=|p.t%Ur9kzfaZBqr `d}IG3'&$ >>`^"l ꃠϼ(5c5caϨIgwr:֎}0ߙbD7 T*lN+oW۟ ᇝT6^.11|K$V؜}!ld&%{о'b ~=W9yjǫH:Av^2zP*X"Ws!)YTrKq^F߂`4nɠX4yѩ CA k+h4YOZ!O2O**eZLo^8~^[GBR gSSR0~sFʕ-IɰBZuR.c[ Wh/#tpT "@OT#ufc?rs61k4C8])Zc3Od/)Jj #,mp4>+B}n%՚_̈~C6zk ޫtW`I\X;1g 6 ,n҇721~V+Ii7kѤ.(``>}G}K7^I^q137TCoԮl@ l1\Ò>4LQ7ofPS&Ywd< {1v~^Rv7/UL;P-;%魱1h@rbg:΃ dvi{kC%y鲎|dvG=^mxvwxduo4#Ԣ6a; ơGMI˒dr h%Cˑt5fu6ReE@4ڿov@플S4*r5,9v/]gRbs4#' Fqvb.&rƬU{_`cd% ٮH{ xp{Kv wA_RQj!?Hv ?|RݛIWZ\TvrF}3eJ_N~C  Y:Cc=ߞ=XiVͣehK#Y3, a\Uݮi% u_Pi3eK (lp($`Q·ǐ+?^pWn!t 5Oo- p[Zp`$q$lW냼g*o2.C`M9v/w}<=fѬe\ @7m-6M$`sG l]pr |ej~CqM^o}mK$RG 7g a`YfvF:݅evaǥ:Ί:H򭚪m} l ހ 9\D&KmqD'b)LMU=\߄.X*"xJ0jpGQؙx$]Fihu 1AO`򊱉˂@AۍTY9P!Ш1K.s|,xvUW"RH1V^xܕ3SN_xvfxIۏZ@SDCvyD[ X뚑ڲc8W$MSb]ӷẽԎw}U3^>&@> 0=eV;$rLe:C]=%M(oI[i[lomgjOTfU׃zzd6浙[b'G1c{M3FEdܫj>ƫ(\kDl}zWt@h[:޸DiQ(b[#9oYO5 N-^m1=y uXt}J3gi1PQpC5(zNT'SdC} DTJl98:ᆴqf[RhZż(?cc*L8V3'bYfn

j ,ݒAB.)M#K(بKP4dGl}Qá-ӼPeIWLD+qGF]@Kv >qٌ:z42e8^B8O&d yڼB{*:!\JcmwyRҗ6hnE 8u= נ[tK=/mZ+ll~^r0zDԒh[,'e8#tA/R7'D2 ."(5«y $:xSĭ5{!9V+qJ Og5]gv`jg 5+cu٭u\=ݩʵﮕ\h768gǟ `-<6yV 9wE7; M )%YN:J?&B&&6c\BLՏkLß]lɏDwWd$b@yIFNRMEb#A@'a[ioĦ %"(;ʈ=W^Hm%> {q*?'wL ȳ޸eHu|ۊic%3*)GVaۊkN a↌H͘Ŝ|ֻi|hJ|qhO;XD=N]GAkr˿5mk W3}",U{sN2 @e \10(yRRp3]A#?5Lvqy@tϏ?ۯ}tWI,Ud0uT]_cLAp? ?c u-uxP!Ix!J+c}6e=jQ4űJkFKF }0}TS>?GɷFwU|>;hG%ˍ#YKK VY,[5P|(iqFp:[Fa?# sy%ĔLȞm9D -WC|Պl0h[ծÔ>,̘aBib-ǫ>pm ke<ˤ&jv9{:iOwr+xQ_ԬHKGf]?be?]xGd*U^KxĈv|b)5KՊQ%fäOI(ñh(Z^6Ipl/]QƖ lynP /4T@vkVm[zڋɫ;XZӨ(xe}JƑ`2? "IԾ|d(V):yybzeBF}&DesLͰ!-#JA㚪S:Cr3(qՒ۾" ;M9:wĢ8pNwF^ }xb\5W{Xr"x:[Ob1VXE]]fЊnF eW R'dnԧ?RE\N"*P6 ٓI{ܺۃ},Q'S!hkeLJtԶ 4PSGs=25#ݖUPWt@Vݴ"ڬNTWeS(0p'$tϯHMFKm&p"ީ2?{O_2AQge_-ЁUɼ7(nkEyTU` U&ރDA,/ rZ7F`:#ѐȅ'' N[QZ$lMk$p%ۆ~{=q,;怜abœ-H7$0<-2w U'HP1x,mU-#׋$G83fYtYZ|%j>Bl$X|q%+X/<*yӨ". Eޮ-D%ݢ.6L-`7jޮAXފxk:D ;'tw .o,FfC\_=Tg^>Az(ZB ,ԝ& MLSVӤ5yw6U1O+s&ʙ"DS\Sw7VP y_pYaeFQqVS#$ۍS$Ƭ0)'@R`^DN UP[R@\B6)0޿q(1)P_:~AХZeУr4qAD:ͤ.l,--մ6YPw'dq7nvi w΋M|?=%?u+ ZQX/3B@G_aSXNh@: e2.FEt4k@o++=Okes ~:6ּn8RsƼ* RqnOHVFU˪b%КB6vh`!6MpvDARbӄ _g,oA772~oi.6a8R/fAKu|3I{v=IQ Kk Bwrز@UueKx^q2q9|P8)WkMEVɌLT=_w)MȜUwȏk}ᰎPX{$|§,Q3 w"Z,(X 2ؑfн^шM5+꒪ \p.!/8Ņ"R!9FxN+h(LC)Cs̪cʶ+&&yv5 qoY>`dyqr%MBOVN4lѦCK3O + \MH0(3" Z`i#. T3& 3d@Lh@ tL4@Z;'\ +}֩o]HpZ7= K dq?y[Zcr,r 9vŝ 83?iT_[[Nl=9k+c=ï:gڵznrg Hp0fG-<򈅽[1 DI\qE^>DWjwnx|uq\},B3YN~ȢzL,@k(Q|;)moqVswG1%:2;昀ۅ$R"%٣u0.:-ǎ@̋hRwVWq%Ji/ }±'1DZ0Z|P@W=G=GFo~H`N`?Vb'6~;fOQ;7`v/O1<*FV~fJYAa6j[DwJj{^+qp/Qb?qysub2;Ybѝz+yq޿h 7qb&9A6/4:%>?sy/WF4Ջma02,(bh@󜥬Q+cY O[ZE8}DI9sW+)spܓʆ1ZzgQsurt?wL7u dӂ8r]ȺmSޞ`Cj`+̃tѶrЗFf5|gi G` Y7#x_K/S_g\>w3VWIEx]oRYST67VC I?:iɼ*%!uY7}@o.ekҩV|,@$"_pӍ_k`մ[9 *B[ぞnǦG&$vㇽ/x. ZؚfFgj5cFs-l%beWxîV{?]K|CݒɆ|W<]LU.04sxW,Be Mno?NZ M k/s<_D%,S> k}K8OdN1o C[MHr,ř1Yn]0ɞZ13r3LZ)`;w L:oK=?KA cʺqڌ IOJKs3<~0Oɢ_*P@ [ ^Ju1ӹqCꀄh0|ֈtP@ l'׷Ó-Lbu݂J>L94`>Ș*95׽G}ߌRSQ2*V4ЋWޚ7Cj\r"pJD(({337uBLrL$XN^05-*28!`GC±mž|G˵w"^qpRbnA)*XHcNzB/̞ ̌k opQcE9i+F_Gs5=)U6īۆZs Kˮsx(FM7tkl*yxoc@ܻ xg։wP lk?{,%nƍB~o?]. in+ qjƽ86?-OԶ!AbB@7 YXb4%J;$'J^Ef4#:@6 3xCt0W0m' 5YoPOEJt[g^&P#A Eֹi3Dx ۭ XU2}~ȭC. Ë~R#jFC`т^:'cKfŞQh҈:b(hfY"$_)/$:wnU**tuwL 3A!xk %rSJc^:/2'EW kȮ&$15Xj FA9zMj s] cd)Ռ ^̍uYז}ie{Nm✎>X {:қ9{y@a%hRs#jQQm/2Sl M0U:SZ۠hEd}#;;J>D(1.oӚsI`^53_M 6/FM N`۝hTO C idž2t 8r2Yć6L۲fD )8hv.]LTS%@]!C!YuZPv$ f""փ=omV.)2 sb(>j?|jn:ケ Ǩn w<cBRt#D;NG=ņhX.AIꡈ w:Yc tynG-xY*x#+ 3 .€V_H LrFdLOUl6b\y#3LVGr[NVD O%B`4:UЬ@ZL9Z>Cc/}'kWͬg- 9S+52yI&c)sQbQi9Jn۽ݽzq [WEH0BJKsL6VƬh6Eau2ܾ;jiąlDyKRڴG͐7W=de++}Th $T졟īcX: @X4_=1=}ZN!U9~HƣRD,Ʒ6N\]5AVo1!܄iؠt nHڥ?|-tƀvR} 6#AX#y1o{9Ң~7m'[fDNktƖ"3XّmH"n5\x'r;e"H9.R NL}6)Kx&&/H8i.)f T*p{js1AK%'P֯OhpI v5ja!(S@< %6~Mts!q~BZx;Byi ܹ1s_% 8AŵaJs Q 9<QPT|g&Mg3"L]rNZQʖvT`78~ncjCaMw=G<՜P>ga+Sx}UR^ZC^ c i2wџ]EwJQD$ `IrRz4)PcX 10u|мИ*XU< >-CvD.A9kð,krB}<(SEkWHMͦ1g'p,¹k]䜝c|YFzTٱ^,i[͢ư/%j 肍aB֜8epknFkJt/ <՚yK6(,H2YH.ߥW6ԚR to>9934N5~80"hyWhxX*8RŮe +?[u8l4[V F*(v5B8t"@f3:B8*,9 gqB;O&L'xiUÚZ L!צCLoVs{"o[:O(.dF;?@h<J^@#;& m`H홰j6;Vȅn,Y UzlcfЄ " lt:,RNb>K/DxĄ~QGdN rR-1v pC4ߖ  >9kUE\n5׫*6Wv8H:!'c 48p}ht<ŝrEK'ɷ ?y7I햤%QK+5\^vN!E)C{%:Т= t` YUM"d!&l`LvWq@w:_̖Z%2 )bx:+0n4!sUg4般^4˞ J *F׃U37p rB3F;j aT5S;l$q*+qZԵE5v-VחqGD+!&Գ//LS~fA., Phz#LGҽIӧJ~NaJ8r/ZT%88 d46H8?j`GeEI5,dY<˅k};NlFt%RVBikN!gwͽˠ qfs}!>f+ jtuqkK rE`@W\]9.(Y_)U ;kNb[oa{JbsWf oNhCۂ'R䓲;|#:.泯\G' R#. An|w_r̗ '~ZGLG5 {84tH3v 8?$;6polZ&YfgWtPZPo3U#L1)/aCMF<<H2Αj/RV6m_ii}?xK;E>4T jPY ~s,a`+4%*o,Tҋ: x2kΧj?+U2.r[ )U\TB٪Gj68UͶnݡI\Y·'ܳiC ,-#}5vg GwAS/MJsV{ݷs6sxY!$\+}'}aQ_vc%yGi|S\M]ǦCh0@6#Af PiXN>i@cT 'onoD@b-3"CINQ|ͳ߶A ڭHj*4o!|`s(/KQW !DԊ/,VJ:wfUs,'3vհW|?sLRv: [XK^e`%1O̶rbfO"QhD~1e[;պoÄ#(7Ta׺1DgG<|Ḭ{ i07T﷏D %=|1v+*[ŷڡ+oC%E߶*U3m`ܾFi0ae zb~=_2Ċލ! }96Hcjظؤ!0)zvȰ 8w]aؘe o\]|- yfZWT~<u99ؓ/bp~)@SG&%Ź`*5Pď6۠l+qdށcKpK}~Y#l1s=1:V Uܨ.AލezoW@CtA w`5jH8FT6EWl\ >'R˨b2^{4P/suӛ4cݾ[*G(I;bbh͹nHfV㭠cmtvR(p+^J_Nrc,?Һ8gJk DZrd 7t3&ؗDu-jix 1EC0 4fy77ӧЏ1zj^6W<Wr w<2 G :&5cܯpZ?&`̅WYL"B! ^,SWM!lv[Te]RάAPMվ?vOfԍ)i`0dL/{em?|W?.ĉ]a{EE g+-V7{F^§nelKy|DIu}NL bι AcFp3 tpFȪ56UK eıR^$ٴ*M?Qwg@{4B(IvQiL1,AFAR7*ȥeMy#yb/ #O!pP[3ýy7cW?<|{?"ۿ:cұw}мi|-2UCGdk|c?[krGJZՒbiz@xsaȣt5ۜ+uV23 G+ X@=QI#jf {iY.}!m-d`i0 _}+q ?KB~;F% >t~ptV,61 `;M(;"KK;"y"qjpBǯmgU:LQF@D=Zx?@WRl Ǟ;uP<;<'tqG OogriTwnաT1Gl``G:dLKLSBMötw}0¤o?t]Z)<DbZ@qؤNl H ML`ldчK2okϾZ/pٰbgJN㺘) ^Q V9iO?i%qDnj>>Fb8T\@l/[|{cTՁA Oi =JpfLڀ5s 1/-%i.es6\_;iby!3@C`:DRĘ*T* 5ƅijWlC5PWӈa$6Ly't>U 7GU<ƊiugVVz߄wO!g!\ПEBGX2uNưA7!{qɵV\^$*Tj)WWGy2(ģ-0zs*gfi\&رFth4h 8M,%`JQ A;D;R9a׏Y//\(@^< .njlxGj :BIBuN\P(@oHh7Qiw"to$TТ64!*<wBU55I<"Gcg"Snƣix[L.8 $QJKod.ZQ}m ̴ןp(]I4wljl ^縱e))]|9v9C> 7yn4}N^b ^ۼS*Do5N&DM>(ß~_KS"4?)ۦ@l?~&5o5!U[ߵX8Ku/G"=^*]@J/7m=hcX$բTuNSuZ4NPpVPZ?WW+j t0w=x:f ȬkP!}1t@qYK(SW~@ñvNy@Fgs܊0\hQ<6x'y&U|kYĘ.O 'A:K8nf"Pbc(j)vpZ@̻XMѪ$zVRm08<, [_i&'O uĴ8nm"ŽXiCFYl|wqgo;KTIU]4@msU[H+B%W(S :dݲA nh\ +3 {@=40 ?O;y`SIg$F]"8ҔʮSYE] ٫Fĭ[NyxyT6`$ǐbeԗaS-^5^e.sp6KLv%Rb{4f hK] k1j OH yˑd}4Wj6/K6]p˯LJ6AHT 'q~Yye3Oi3xG.xB{=Pݛ)7bI\j2-:̥ctI=ce֜;8 O( h jmų,x `R+imk)kovx^ &>VC0UrsY~uOu!= 0ϞbUy")d\4J&>>Am@ܨ]H٫}[~33>؀Ek >8O';g31= 5W^ H)Dyŏ[V>22ǸK&!XFzȌMe@`u0Il .2y݀ A ؋P!RL5 =;v7#" pV(AxlM |b\Wsb,I)`My&{FȄTD剔 H+=")@hB*TL{y=2H (SMf oKEC:i4Ȏ&EWR\]`mBXzL X_p#~hz릨PF^w\g\&9ZЬ&b H 1+̰nΆ $Ә@v-tY""EG6|#6] Ni f{Jwm-gG&y9nگLdœKCG_Afc ie^,Sbw)c25buT@6B5A?| S`*BNxE_2}JsLoƸ {;sNA!P!*+Fңk11U"?<Ġ16IKt7WM0`Er9a/"D=m!c>zo® t? b_qD} xwIȫBb Ee[(/yt|WӍ2ؓE(}mtڸ6-w`FE+ YFaZxh*e{9-0 zA)P#ixytmxuWHD? INnh?ZlcMD^FGD.T@wtMEs8wq7~O|>V3-J$e}WpC05 7\x2`+z>+uə3.!堔gYr\ G\F.C}^SJ%FbCXYaܩ.]6t0}"2UYГ:L\T婤")Adl 1ڐ) I{BoX_92OjVlcuHOY*3 odhNp̜Z@e{4ZI2}<0A,RUӖY~4 }戯zNn$e} O2YViPk?xPJO;PKpDTgQM3b_Nkˠ7ЅH]Ҫ]De=LR;ߒ)KSz@=ǍdYq h) V[,i Afeq5(6f,|m?.jmB.M]>O'3TOB4p|hG4O I/]f}nDvϛ2˓{(3b"[K2CfAM0} "PCݼZU-C/I2a2s:M  dN+jAj`7!:HA$Β) =Vxn?=UjȫZ)G}n*+sN:NUJy7 I#]uM޹va+ـ:YЂ(.F/`$n ~QC]XAcH-1ڣC+PO&N2+6oKEd!}Ѣ:G Ky첧Ie࢟^2k*2џnPs@ D 77E I;p N3.a>:gcXD x "3-{d[ _{$"|]9Qs1ژywE!U6~3/p#o+_:mEZcMV/9)`dS?~K0EazDzxfJQM  -ݝ#ti[_֦GĈ`ƭX+udCR@|MN.+"[OOB@%B8-jD^λZ@ԋKM]y^T6'1eG$ՠTpŞGC(.9&o,P%׼9l'uw~6dmNZ%΂9Cק\c~UnުG-8DC־BY9}Zi:(a#8%)T꣋M77++ *T|8k:P06 qfRBef}5ʜު>$eY'Gm2c}ތj\!72kzZrk[uEm D'~8xW'u&(2qNaUzRF3JGfz\F~mPű͘MDL~pZ2x4sd7o3glGMkATP􅹫,ʅT*pg1M?8^2)[TPFcD^W;U/,jDPH>ង]Г^ P9ff" _ ޿;uڒRg 6J KP{9f]epjJb;%eeU-34RѪ2Q_sn6=t"ݙ"^Ù_ : %zL}V?ER|zS`+{%RX-BC@T?ǟj*Dѱ2+JLeL!W̒(- :.hvGw,nn8&21CocBT<\Jž{(pDV ЖQVYf}t&o4+<1ʊ>/FLw3E . ,ޣhH)];~5R 8_l]!oh+aHLՅ;ފ3JrKMj QzT%!h'6%D&2Lca!wMǀW,\c);cv^U*ᰞ Mm69VK W]\xvn/M)°h]tH4J"ӇŽqmO5 iLM]EOm=4 DLk*HuQ0&@dbI4Ȉ*^ uP8VE~<,s˅7WI0ƓE/2I^@ۯfBˋ VBiھ$), VD ZRd}Cm?? <.HvA?:$5`ێCDK~jsSON^IQ8tqto\^\e`r9w;[5b!׿#/]򰹗Jߩp0:mgo\poeJsyΤWDACD`@_hׇܠWvm_ XPoc)da0d}YGGyc%Q WqmGc{[ZGHW—M$8j~JFFPc\?'w,t=B.:'!8smxV:pzr~A58XUݍ\B君V׀ᵠ c|8NXU\ġI͸`Ǹ;ñ>O Ck B@|Z|}{yXڇ$)mėo)ͱSOL"O;@&5ۘ@ZC.xv0H#Q3E7_ "ys>zp;`~]S꽋{V~(Rʝnn0v cg!PmLnxѲ/hQǔ#F*NNy!r 150"]a&8Gh)]"$O.R ܿ1FbPR]jQm~>YDE"e!Έ;DkDzv4v&O!0b}+IەnGZ9Xk&ǺTc̔Ϝ dR=)-Y>_# =Ƀѻ}4=_sC2kk %pxİ\4H$8vflc1ޡԀv)&Tj>nw[<>Ѵ6CėN:my$O @[#-lkBA&RGj@TU\;$+/D(_$K18hHedVm<&2׺9V){ X1->/D!"ʨ? C!Gh@gc ƛ ȏ_ -n|ysX&XuojcR>x^ 'i ` JdH֝Óȏ:Y뀰XJS ᰠ+ .(NR&u{0|`L{cc-LYhUK>'F_*U/SyDf|`Q٥9{*X6%b6u`Ӝl&l/`~T@̫ʖJiSE? $'@C'D<-gK,53IDyw$4 W5QfԒU~58PQĿiI%<*V1KVsn k?= ?%*'͞5?յO8E+=P82Z=bg15a1N\Iw+* UkiZWզ>(hB0qO`#qO=! H,iпPCWAȰ(ajlՙoO!z aP ,6|י<||},>OQ M&ZˉݶڢtP^J_3/Y`{sf^|b0[xp 64LwDt;QHHj:߿f>nܩ 0G5zԍ=&*1bvbFKDF(=!ĜO1Ϋ£~ AzH`) vڨSY0:SXCR*FqKrE#lkD S%;YaӳFՀk ) R'%Z jmdK,]Ze O0l0#֠N`X4-3w=ȸVC'}z0Z@YuwC0ɴbo5"VR. U[ yz) ԣ`Ÿ =˺|G אb3IZfax3v/H6zE*q40>"Kf(HV3CVH-6J-7-dżMrQG>(UZrРV3:Ĭ/EѴSzf ,s_7c j;LaAbݦRfu9QWUosT,9 ExAq] Jӈ&#Fs{cGN۴F4n] 9S&aZ$ICKsIuS4ʁt U$;D|ts:BP<$%8c58EOg{)i;;k{P:hzWQ%o'q3F!2, ꘧υ`CțfNU\bv;V#&Ң/FaHrS|n)F7*{<]d}0)[kTk#ay g4JF@htm\b Zq[l51[2]eB/接+m.;+ */OTzUd;#juuX,ݦZ\E8J#Pl=)KG-g"Ƕ=&wf{2PBI>b-U;A^KDd#aYPɵ J%nQ;J{AeS.=g` :>|r]/e*QL^ Fp (F&xLш|Fa|L B0p{kдضS\[>~W4ڛ Rp'/{v'.{d\ U2s%@TzaB`HH9o?چb\ >3xq$\j%>6[[lv sX{޺IzG^)0|\Z#8Ke=9w]cy*d.{ۙG'+Ij"A ~"asPy]s/tSڛ<GUEF6-aQ< 1%^ s9j`F-aO[ll;~l !eQ nsIPVO'$H$Ɵ/)hXK-X,;g;sb) ]5Z+:xNzwK>\ lקc$yl1g6kmYH&=o5$W˧Gq ]Cx}9X#:D eű.|rIbpDMdՏvݿk㱟;+kP ;}QIoMK/@vŧ*3ĎӀ7ê4 …~X(u֨l?t6N@{3bFj:DEY$1Qm'A&p#WN7Jtm/ˬ_ӡ|zyo1-~/ HV$۳+'фoG 7n$jKo}J6*ǘp/7+U,+ETZ*iL7зA̞k8%Uoˊ^>F_Q{)U7f_Ee;,AUfoțBloTNpxJ`2ǾnMrSL[~]PpR^3_Tnkz=\R-[̘ZJ]LKST)=wgKYy΀wrl#KpkM:+EcL/HZ$VJн_Q%l[Vh)QΞ<MQ.CMr^~=AgZ[ kӸ%bvךQ> Y@l &EC>u`6⼼>;Ւh-h'Ѕt=gtⅵ7n`æTz<0]!sLwaG\܆ajg ^ &gpP:aN{,%]aж@ VTmu gU.D;Q' v骔vKHbǏ iYȸ3! 2yvzi򐥒);9>k2s3|qa!ҶUU}8{y.](ً<O!a8ռ9:룈'&o@OF˗FeSXI $TegaљȪrY]ju-q# 'Cd(r͗i0b=Pq S#xLۢ!)BGֻ-+OܮgKrN xlh)RBZҖTTxy)unKfb.rgoCEM܊dDB_cV5Zrʸ&ldpOHk[9K @ Tc *5崌"ɘrLS%~ǻf?H)=pvQ( +.H7'}Q#3vƚa@Qvg/(= It>'y3i*0 |)ǿ7fxVHYuaЍœykQ6y6.SLkw~|Š/u])w(Pb]Oѭm X>XXBe;[*O&̳/]$ PKy\^\} Ulgә"J3{7 KR<@.ܣ(y᪡r7H Qjo?*Wgb#%m%#(.v!>;tq'B%n- v"rJf db*' lF&{ѸWwqS쓻TКY|ʍ$L.ZX`ōdVm2l9aM俿}$ܙ@KX<.f}hTby&'xT[/NǗg'P-l=`o^ Wz$&ݽKǹ7e>"ʽ.]y;`KVmU9yKtYKX. AuuLJ 0 -p(9s߮QJW VJٖ_ă.Hq>_qhxȉE4Ύ] [c}Ds=,|@:J`)k+}b][Ƶ[R};Wi˪utdgZk:R3gDӫ+sn" "r%dt9z][\h€> ĎCjE *xOAAo)ufE :N#}Bk~S^&VVX*^bo wRf{Z<\m2MPÔJIα%hiWa#k6b⿔q6 *aB:IN ٔcЖZ&+UG;G|eoiE&2$S-1{ Jh0SаQemK"^yDb QmgDmdB|1 (.Kxa𖮹(ewRo]%>U,8HDQ ,+0C k["52{Bv=޷YB)^{?[{3 iAˏؚ܃y~}\P pAf },j.|Hh%Y#ާ [Ь &ezz\%H:%MĴ~~` py}ϱL0Ap /`gNxvBxZ$fܯfM0i4/Y°/A,ch'\,+n?Ls8gxכ1+o\'_K`Z^}BiڍR,"knuW׽zbiip*͌'^/El+@6]> tY40D콰猱jB5|u6 FvgjG&('E1J?&J~^jֆ#_"ac͙3 K8ܮϵ$s`I2 2 Tdc@xhv@2C9"sE qn_42WL)0-p{z{Z~j\0&\3i:tķ3dVTaZY-aR ` i+FNl 5+/g9}i=o/B 4&59ң`jN]3%zekyOޯJi1XafI;HMt[;$јap=qLjVt˳PA9 }CxsDeRĒ#҃t7;?+rERx,A{(R<BP͚ehi%pėC1ԕVp,PzW toul8.ItPlh-m(sO:hN_϶ob_=4O1[g?+ؽ'G0;6Rޢl\Uٙ- ޚPT.Xeabfxh->Z^5 ż%H w&;?C\g/es CllDc/0Ep'ޜ skt!kqE]ηm{_7vbȣޏ]GD+ "HG{#/`}q!1F_0w/Wv}C(3ASp)oIRT]ZYv>.byCn)A*զ'O'Q3 ֣ bnkbGO%V,Jא!tA[)4WGOѬ__ŷ<0XJRꕻW]iLf́ N>BJ . JO恌>$O{]u}ƀ|}wzRnINwo:7+oUHXt5Dr}/R1V ICfٗ=WE5L@IEVvgQI^vPu+ve9K@;e cޭKsZUYLW6ߴkXTӖq_W!g:T,l5S~M:J {sZl_=86bu*/kL%C98͆<OOn܇Hӛ.c4vc]17B3kqr,饣s<@ ;}fوH:)d|*K4'9$89޷CHi3"'s .aRb|=C~Xгu|.Jw>wK4. 6_XT-aAH .{d\Üd%)s]4>j{u*1'5Jh #_?,C< f;ڹ XCkcmA]!FZNJ  `j xE2 ux&:u_+VX׎fZgStG*_|}o`>%}E8J}bfwgڻw2Vh},ۂKAqR!YgE=VmAJKdDž&$"0K^ MX, {[CLr \6eydsd%XiņX5HKg>} iI)OI9N)zQ5JZCC?5 d;J1_HA5I\1dP0!8۳#dӪwNpQetԼ2w >y{嶜mw\>"1y wZ ;}? }]|6$ ax>Q)CE_kʅ6 " K;0pM`Qbz2O, 4.@lxJf6{8+!s=mTg^$lstn }">P]*\9B, 2Ο8^MH #Lɭ#x‰%Y}%[@s&t~m)s+b1,Twi BF/cyw𝠣{#AUq9B,|'6.a%Gr]DTzE_䠷xI.tIu*[d0x tmN`[2T@"̕ZPWhvǷA@^^6}n7_!{f]HF3S=`.5zB:Q$VgyvY=j6[?%!W]͇}#FpI[@2𰛥RZZ3abB1Ժ=pDmIZLAy>ђ`CgD 1GؑmٌW(ZV}hrB N)2}HR5Ei>̷D8XMHT9fu 0]4 :;J(yWGIT9|64EqAQ]_V׍fC "QU୤^ "nդ ImJgo+눂.`>~Z>8d@ED4<;aQ S{R@ov=8$ؒ5ZNJQ|^Z( 8#x,4("wPv/͎Xڋl5/5UQ}c*@vP dw{gMuKkjNEߙ$ {IxGUA{(%y/Vj!Iћia[JPgִޜQ%6\=t[V f$iөV!4_&y1IL^jRfgAme )KO?"{EEmF,I!v!.y,1nTÐw\?e|5,"@O;MV] Z8deo,v3rFRlIz#FF%8=z S}nċ6J*0fO{eqQ/g*nuJł%H oL\e09kIyυR>( d$izr2pu?ۗ9 ryNg:sJB21W@!4wo6)QB vOyإ)$B3 '&(ATJOcҡ^ AJ.r|"_j.aѢ0d҆x|;+xիT x{NYv3Ixtp#}-M./FxcW:sge*1S|N #4+KjUoJG̔uِ| RG1 Q;+&`5yCVIalo9V2`;T#ر#7逸<>;ޔH~JyX=fؿI~{_R51H 6|74O-t#DmaaOm6LM#%9%Yn4d @(Bhsh G'ㇼBe_Qm I #A:1i #H ]E')^M}, 92fFQno0OzݻM.̶fO)۴TS0:&MB ʬ}2'=dw%EZJv{7S#Iu[4e%Fɺ}2Ej 2II!өeHZ44 ׶gHTӚ6Q6zGc'{3,Sr V|w4U LHO؂8UHaI'TVI>[d$a+9Yd7X*AF`kʼyxRX}mR(D{cN|AA%;VHrkWݎ" CL$ S%JǢۡޥalE `>|54fWߘ+$\V' QO[Qz>(jy=:[e( `\{D0N`>s^O aZ7)ynrWa*{l9%IK n2 aNnmP۩]12|掬,=UkZ hR|/RyT(O]xo{袰]X+zˢVf9yi{ZD Ijxq;{nr U|t dArgWwA+Evξr ~k5]^8u&SV6kéS'{^ ukPkpFse|xIwa3QVV_03?1mdVǏ $;">hզ4Vj~R῍ kMEZx55>U|zcnԃ$e-blMv1&]`=SB!`0Fa.>3 $=> F"zG֦:DS΁ۣ QŘa[7ԥAwDNzyDydo*H>*>IoF;;j6Z]"9G Q8" ^ļf XWw%kQ?]""p+@ =>#+f ==thk.h9af,32X\s9آ=1hfɥȚI4یj,5TZq.JsJ1g=çSkn5<_cNP/EXFX7QB1Yر~`'/ӊDn*d]6χ3qQ0O3g~fo$xn7W%rOs bY(:>3 3%P+ 9z:׆Y:qgwBbH|𰉬(1tU8W R=q : :/wD7A`p_??ZWzLKĖ"v fkqX>*orRqYQPiZEf}]]t.M* P[' gϸVcQ85r!OXX#)A5.bg-XEHSsDr-gR`'fH?9[w#Q]0s+| '蟇CLD'W=Ԑx_΅KجRY+G+6[Ȼ?}v cUɞΉ-M=Mezrj [ApWGA5ęȆo'qq,H *ie4\)X`ӇS _Xo~zBV+_r3t.F\h W|N"ٹERĩW{cl}ww?Q̢iu7/2zE&utHrG_,nC* (nќ$5* J) )wTF#aeCAt?r~:Ӳju;.sXGUbS@Kk5'G|1^l $>cU7)E]}~bvk z0qB[UGxnxISglL8]դ}iŐ׉$ޭ `Ku/Gf?>-K;p<.Xؐ4K["g ŽCLLY! hzAŽ9SCEUW0캢B'yn$5-%۵%dVsmюTP LF*mD7fFvJʝ D(*MȱjuϼkVXm^Z 24-pOLi65xFuªaA8;]k*gʀ̘.JG*vGqT^z8Lf@@OKQZ.gKwYx({fYkvP`umGڦod[P+]tHoE;5C(s a42=8f8uB˩ΗչN4,X9$2:7)+zI4rNBڎ#-%lEN?[RSL%.4"فH./5$v M-ک !K>)_ ںj͋ΐg-hv SjӲ\Z7,7ŒK .g' /1p~3T]߲rX-.CJhiH9e mnEOArQ\!q+:ZYSK鮤?ӝl0f ˶̥ii+i;y&Qo/;ՇeI39A_6,d/|l;Nu.;DmTJ>nN +kC::Z!%Q Auo8UEJBɘYFJri[j.lOD 8FGAZ%L(6>2)6>r*;$˪S$~#ʯ = ))S#ءOk_=[nt~t6^ (,ҽEtZ:j*W Ko{$ qSj$kZ.;}'4V)hD4_,WoNigϖ+>Uб-a>>u։!{|6mc/HҤ/d*=!BoΓN<1i/qͰlKԚK>65-sgtGQ?nQm _0N#X@w_x)4UZt9l.V9=+b,@Xo^؁" _(ZK8"M8(b{ <WJ~!Gcq@*S: RX꥟itfdAgcۯ,Bf=Si@I+k]_{sQHýY ;'AU5B{@pSԙᑌfi3Π;ףVjHzw,]$`d/Fͻˋ-R,8TR54~E@ qN@E{7lk DlR =, u,CK>@&gUy6n0iXX~LWcNF@R7Z)1ObP%`g2wf/kw`8!9{7\(-.AB 7R~q` v|] mʜ/*On.&L#6n5x gΎb FS;9RuM+2XUm9FDhЖK:P TR.׽ï64_H`eG7 ;-OΎZws\ CkD7.En^ *4%aq'DX[5td1yޑ+#3 =AktٳҵaV/'-՗/MiH =,g5էIEWP_s=]o7J$΅S+cx4p1Ϭ2Cb'JP柰΢EFgrGo}ŋ^##b,o1m^bh;P2OvO6~T>j&6ޑe w*W\BA̓-p*י'^,O 5mԊXU9Du>DP8. GB !nY,ɪT(Q061ވ5@L}-WA|*JPzIJǽpeЦ)X`Fѧ1<Ns r2 ظFg%sy&CRqvᘒFv$؄"Ԭ>?˅?LγXí \Fˠ.@Xy <C#mٺi=},a `-t)Gc2Ct_0(d 3{°eZI$>p=dHC/$:0>#V7;J.3Hgn->6[(/ ruDqo 96"ѓ5y"s>i/h*U.]k0 >ݫMx|J٪PdXNvTj#p P4,"+q^}ϳW2sX,UB4=|X|㖯SaI֖dFaTijuna3kA`'J?lY]cCY3kc=uN٩م70. |pn]Viwj{٨x؍H,fZQJ5.KAP,s@r*MhBR!˂pY CE. zIHX╬5zI0P8];|ͧOy{ ~0{ZMw(A]`\p!hdzv0fA[6c7\o+Dl3|i-٥:۹tՁ̿ʸ֭a2L֘ E@S0ϝ=T@U/J? ;\Gaq0dS@謁G taYo#3vӃX.hb*7-Mm"BLOUۤ!NTl*NA1U#"35Lj M]._b/cV5sL5,-K1UH9( TD9;!yA 4a#h'z $E{\RL 쐕hߠɞʹ-j'M_  %TEDU̯4GЀɑrg,XV\É:e8~)F jA< F[` xox̯h Du\{ojpj|NMzՓYBǁ=6sdyage,E츑I?%͗lN1L`"}gk"i<| LY/ 8'ٔ W܆Kz[.ٕPOO>0݃"Yǯ~Bp&6gol6MR>-͑zR>;XFd;R"Z"8[4 Hj+"Vld"`*CP8l &3<*p{ Ueь6 y@ӻ5J*O~b^5InTb] wQzIqF1li>l.>Ф;G@,ɀQhfÖAg {n V=1J[s!oqDSr[09jҘ9bߘ?D_π8ltNp35>Ps36))H:VvSGZ+ׂػH_voS@ZP@QȔ|R|۵IYӪ ]1"a] >q_ 8Yֵb2eNJxrA_+42~~JyBZzۤ+Doǝʰ|.msm {հS`S (b7] =e8[wy, CaU Bƶ3IU U.kCWƙ-gk4n=?ǖ" [L9ooӆ$ ?㖇Iyx*^S OUOcj5ofoI$yps{[ [ZuL8[w*#o+:Q VMZ iVt_ӄk%w*eEER cyQ%GB\wam(5 o"Vx%OP6FeS#qvzM9xMǗOˀ B& nE4vjv{Idэx4Fd=I>O-B|͑rGt@_INó4p%}`Ƭ|l7X-=$t{>ǣ8km؊ K-ٹݦ,f mkC^u}&`M'YJ *6w6ąOLF)N`:Hslmϗ w-k@ {jWH.X|hr 6zB0JvTڬٚQu:LuDܼ/H-*R[#M\2EKbwۄս`K7z賈%7 H;^P?6)7üJ)02P\U;Y1jŧز 6orB)qe~kRU.}ױ0r2J6_yUfR?І >iy{={k:8Y5[6ݤ7Aɟ݀l Y^KYbNj>ig{%K+BA{wr:: jX\:q'%$ cQɆeent< ś'>nƮ Q"a{#,̢}=2?x8#GpK`rdeXl( Գb彍9o0m]é:60 7MAL6=#M쿑۞$bay 7`҆J6ɐ9 s4D]0)2 }_Y>sWE)6!d?KK%: 4rBM ߝp3"0e5zy66|L ףWZ| و5l8Uؐ-XUM3LQMZ7Ow ]Bv/_?`K4 PEDN >}?g'ÔrJ?'؟XG='#zo5T c96ǸV,r'_h0G5rtKSQ/ n E)*W塊d$ȼcs҈_>=P+{6ߪkQN~:6BӘy7ye~љ[b.zu!WqC:Ȯ?/ H4♶BZ*wAmі#$d۫z}Tv-pGp +?`&;7giLJmS]=@sx菣^KvhIP65.A){CŹ "&EӵaDbv"eE!e~jDG@3x:@oXeҘЇ5qtCh P0p,W-Rp`Q 핾J1E/O 4p,7q}قfl%5g\$58/\K^9H4lT_8jw1I*dʃ` *Xd1Ik.Gx# :e?B!" mtV8{{B uHР5Yz.җb{mͼ짔WɇsBե=AzU 8JSpP&8Yˈ€~ ӞtI$;D@sNOɉRtoSHT$z%0Zf8U0=~c.Fz BWVL?3bRvˎKAguOkᚣgҘ%ÂCHB-7J- C,O>]Q%/ۋqv3@#<.0[4P`4=; 9=] w{[B?s<43ZJh!9` *b-i ̾.-LU|e.K\+/>v{Te=և`:~vOUvQp0^$h#iTi+CԾO:e?O+ ӂFFkBqoyNK /o&nt{- &B:YMQЗ&Wr'**" ]qKvV.80ad}+È͟&˵NhRH Of,;Bqg)(n͢.nc/DLs-Rg/%DtRՁÈ u'~?13%`UtUUXTR]H ~{Zӳ  L 'It+hA <}SB09NI􄀠U95-0#<6|Hf+O\#k`ƍͲHTs(Na`3U 3.O]EgrqEzM:kO( 57J5*BtpY#/[\X:%[a"fP{#Xw\vi{pk@{y(GSgՉqni_#q5uy@hp;-U\ܴ]Sqʖ8V|!:+Y /0ofpь)z.=DYXl6^BH|i]nH5aI:k$Gc2iJYwzŢ nM5KJvڤpA?*k? }v6KŻxuC1c~}|Fcmi ;k!cEӲaadHQ -%.0;R& G gH{rqTzph Kc(AalW*),~9S^e0+ArފcԣV̌ؠr>emщRO /ph Aˑh8'WF%4Bx'9mW*b D mMj$KCou|n&""{\ rKRa*E΅%^dzaP𫵿f`1ի]?m8df1v7gU EfM5~Q)H} "A:\j{0&x:+do9;a0{.FiѬ8N5+c ,m+Y]Z=7!f7Mٹ]38%ނRq9+DŽvH8|F `Bs5m}B /6_e"=#nj.jux_u-jhS~2&.Y:J~+F n3Ss/6;;9w|xMl!0#BW[Λ=ٽ (iDzP̄'ݍ05uk}}EFjqWLV(Ŋ}ݴ)<ڹn2L9/iUydrX0Krs7nV.*$P&X7:ʿ.dbpEhd :|̭חʏboIpܬ2h6 hwbY:_LGN&exEe[lwnQ5៏GycW!|Z Mw{{Y?V~oV9ކ Xc8&Q.:SEX ځFGuXUcQ4OǗ  LxW2ѣ "6;a{ c1yܝ)dgMBDu }>3; ]e!hc{>j(F'O8zM@].%\SˁA@}k d zJXaWrr\2A: FQ-XhgC[xYXf8>& DVXAwmOy%gm=y-Bǹ_'w10J#:Cf!z+1E;no;)Hv55,@찋;$|Dtk!)^K+0Z%ŦPnB_7c.+ 6[Tzp$*)[6;?Ԧ`{&wmtLSq=^T钥OA]%PA!;$:5@%JqXu_][89VAx:c4 g"..OmzYiyn\wV.)d]cҚ5S`w߸9բhۯP-w PcuȕȋAM2z, .B! m m$_mtbSRo->^XVs BR[g?пbr}fXw0TZ]N;kд jhfm BB՛iЖ-ˀJT+80.=-eǀ hOs%v&` L{b*[ȚfM EU۸5E$ɢQt#d@ ^)}-lS&Tژ9zm,$b:09)5tٟ`q}%"D1b&Op-m6]XҒ'9-cuHQT\wؑYE| sPs`8+hU˧.G/ _>4n`5jy0`Ay ۷GS$.Ncܟ"ck-ˡ+[|˽ =U]/6)b ]TS]'ֵiM'u@Frczno0'~$!$[|t·rQ2ՁHEQcļ41@r;[{ve9u>4knW>UFdϯvIm}"*]ol%涅AA2G'LP|tSxb@Ite]RnJeܵg7A{Dq.dRBSe}a媄~G ~6i;㼈Lo&&C\ԡu-K7)2~=0 iPBp99JE׮I~ϸf`{Ok#<,gϮi{=F@3TՉ7 f~:/LԀhdfk:oa̋S5ICInTd1ITd2oZB#F3`S۸EmoQSF8PbN1}}3&tDS&A֧+GӀ^B zF۠0D Wbffߎ`q`结-6E"u@](l7?+- ݊7%&bUq =[`1\oVcdi5!2'@uH`2T=x1Z,/p,^Uj9Z8 cһE7!kqO\HO&te fb #J]] z8ٿ&&_tLAv\¬~,ZMh (b~%mx ȉ-@ 9ڳVPGrېqHȭS~A $u$[$:4cH_d5Im KOX rzp4*wɨ\Z$NRrW'QJ?UG 'LT 9Gӂm}m^Q A ePsOˤ1rPzjézz @M"0h S ;!At`ȆUVUhFPkI2QWD*J|ZhȦ_)̫]@J=]NEIP߀ZRmj GWOZ`US[5RrԉJ" S17{ u78_8,hcdc%-B"۟]i+";>+)=4>/E[eAJ^[N&$CrQ2TR;2Ǚ}ï+>yMM]nvw}Tf)Z<  Ja|!vbfU Gc0""hCwvW[l}t)[Q@NUqJ #4~c$4z =¹Ac6~S+}׎l'tMkCZ+8:>|}I tdcY@b\b^VR H:b0%pGػ[iδtr *eF,yH?Zڱrfp&"纠:Կkr h>'6{%([ J]Cr6|T<)a.zmJ}ocA`.'z( IغP TMx;k*Z kV!]ǩ;l%WzhbZV`u3(萡V~=Q8+N=SwuQ6qj_|/I {i.@{5Sb{@OngeY?šyE#c0ns1t_ذzBݭnM/ AkUmEG\QH; RPIckE`tj- xgurjEu{`,jN6)ǚZ٭\:EW#,o%Ari6C)VJHW;|a-yly CvoD$锥[6YP&z"ǵY~4wizBwg'īQH͒๾ NSznOǴPQpQY8y ^#h+1)s-j V!}AZ\s _ %nw:jg\xbt_[l)0KpHВCtv@ ϔL;bIg4Šp(d^Æ5?3_1?cc*=/R4=LڂH_CgXD[ gk-:J7u6GJI'6B5/DJ]HJXo5oGIF8s`sueKbV'_vb)+}qBDj9I%g3iؘCbTxu*ݫF|}XGп>Vs{enRGzH#)0S.eJǵ(]06Dg%uzR!J0~K` CYmͷaav[i+"vJ6;u_(*7O6$qjjegǠi>qiE\O29YY9Y'=+NbaEm&7Oݼ>ˠe#×/k6Cogà8|_AVz9]EGҼd*!=.[~Qd%2V0ӹ)z򗵎LLqX{c Sr* ʹOwnW<4M{ ߊG$}?T?Wҵ*UРhf'kXK(u͖Ɂ"i%1ȜL ́[K*XcO`I{qVgK-ś 6ٙӐ4){y~޵Lo'tS͎-в{Ј@Eitޠwږp~+#\*Mk+TĤȶ $r^p+khD9] eW8u,f[zQ+ 6$C2.OmPE:yZs-ŌқF_kD/W]LաYx: jj\8+wzH\];dU px%*5~rv|oeYDBf/7 ߺ{ `GeT7=6oR"HƵ#E)YsW4QEddW8%zY3bK>bJ%'y] H9`Y=7 ,d"/C#nsuV)L/@AI1ӻ3¢~q"yxx327B*vDnTAJO N2x?;V|zyxGYZeT4_ɋ.[Q}Tp[`lNB*'V1k5LlnF ֝9IڠJ+cqEnvGE-e, _G7Yd dpvR$Wlޖabc]j֠U*ʳ|)G2+zĝ̽ P:^,4\dϳ5:pxj=WcU༶q2Sl_E\ﵕFcnEР.!? F; 9> }hWId7N#. ?VӦ@Տ*fCA6 A8!` K8#dl@TH>\W[kv @X)$ƿB}8P7ڼ(5̥u8!:H߮g @m j"38kiFNIWv4r\]73@B ֎*aکs9q(HF#AhSғ_\C^Ld~@T﫿_Vp$\ uo@8pӆu޾B}M"tfOr招߄k`ҁsm({-?؋gT2  qogVf"A)M W;rrw}F ;C6ΒTn?F^ 85!\䕪 1ݹ+x2E|b]2ACNsfsXBr\kfxhhsTJ]ʁoR2ƪ#ުBF>1 *:R"oFm;'OaDFdAAلRBAKy%Y /-kocٽ, zI.ևNMEZ9Й<cٍq!$jU 6wz>GW;S&4tc8.NwRx t.-`jؑҤc GHH >¡v8R{S75!cVO? foj;sHH3H*brN/QR˾`z a$ Y@(|4k\KoM y{3v1T_? C;D=yt*rK'8dh:wQ*]\4rZ 0=y8c-VFƫ+)6:k> 0ǃď$~yX²Z8!W#F]v—\E3lqi$C5ZCQ̔xV?YYȑp h__sJ>f&0q:KLNAĀN'/'hCXyvg(ŽRC49eMd D4] p VBDZ@ yWZbË%t$FBN_znMzw?R"y=N&(hBBQ0_M5q%^L"/γ)[`Z- 0o"}(rO'9uGYdƭJq6YAbF`_SՀ)ڄ+3ZU<;1 ]dj_Xmqu_\{N`؃) נẘ -:DAGa/j a;na,n+ݙw V-#IPnB{xxs)pۜMܡӼo&.x|sUlQ=ZK0g_Ci$Mhn */0^i=b ,,v&+&v&*CM{YG#gs-x(Fb,-3c<`<4¾*.oEu½,jXv҂qQ B/Ӊkp?-tۑ(]]sjܵg͕> &O.;J0A{$p[Uygn)l5ToH=W /Ps /(5;<Ɏtv4̽t~W}埾s|ZF(г"ꂄ;1qU675oPNQ֒SXT=7˖w3;ϑr3< m&$3D7wZ͇PWڥR%_.l1/ k_ 1(\(m\B? (cEi u[J{7Й":G"xD-TVqKoU)jq+/jRz,}ɑx9N.GӚ8tJQ!T^{" `,kb .Hf;fՠwS*{Lrlٱ;+gfi5{G/\)̒]1?w$<dA e* +Ӱ9 !\Ɏ*+:R5?M.NbZIi8bZRT%~fдT2tn_Gx؟ L F^'S &D^,pR tx7_PFƁZI-'z:ܪFəтnﳇUvyeK7&qNdz$ }VmFAQ`|JBͺZ|^Rq`.}3&Tj7AxfO7(ɹbE65+nyVU3VBR#rIWSq?>+悔n]4WF]^1-v~4dygG9s6Ac5ǚAI]3#b95!BkR^:pƗD-?} >~b|Lj Og7#A3_{{8kI:admlZlU. ^D'\jfq"40t/g8&(g9^g=eVPNAJ& hX~/y 0.?Fka{Hq8GY7!~XsZa<֒BY Z6E/PHzݸX}LH!G-83K94)߹, VÞ3e,ltO3GHQ4kmN]R;uN(qƩ yvhZ{;!?cl< -zī>!xO FWvt48BbnQ s?K)w0t)h/hfb,HaL$}d Æ̅]Dw2|AYT#մ8x8.&ua6]"GR1Q=Q1+A/:1#Fqv$39 ЃmoϞ© 8ie.a{] "Ŋ GQ/̳~#DYtNtucO)\"9FM+af)Qr+|U;Ġ*> u 8(VQOii DX{C/}IH{-8@tn_K:>U`R!tq$7mmf8Uh-Edl $'Yy =]ޖp)pTd/>Sf2]!deMmr{}z 7ូQWƮ&'J_IISHNOjcq޹pof'xOX#7v(So]xr(3_?e1ŵ룏·gt&Viʽei#wmbc?wbcFVcuq;oHhgrw.*g@PT6MƐE"3vyDE=Kx|O*g "o}^!7stg"";n۴G5Ԍxk s\NmܠikDb:.#fX/G@m ќgz9b+'x9śDC@- p(·.'?)}~h,B8'ϴ{:c/>I/wlE "&= &-(4 6ј.:.ҐS8{+Ek*P5i0& TSڍ7d%oN5cWҰҺ(TE>O,⹎h \(?ox^e@4_XdH_󱹯 j?gd!+I'e Z<ߛ91V/%T&8bq4k!=>lv)`?TBēM,,w {l,S(#ߞ.7`w r: t$MגWb4jЧ>!XGs}'D,Rnlk拏!!Wa:57wĀ }YM`Pؑi؏'^U}_#2ŵgu&aݾA&&?rɽ E b'vVj(<]EoOqs ̢zcd,ڃLjBXt~~[J]\u3 r3&lk|$37x䝐z]@X!VCx񝌧z}K cos1,{{0yn5 T<^Z㛅HY^ٮAJ NIb_]ux?#[~C:FerICZIOA],PbNL2 $j_رZ-48PPg鰹d;EMe[슝Vʑ$<|`VkK;`φg,"2I>O5zvx#RA:L%8o(c>y6XFtبz34s4dP6v+>`'Vi,~nᐾE'Ėk^tmrxteR孟1wRI_G2Qug=P"ZT*ܾ Gˆ?JX.t5ɋ(VO~fQsHziEH)6vq_A@G%BpX~xY7gK.QP>F'V4_6q 6vĴCQmmS:0\ŻiВZr؛Pd8',_S;ωpOyPW3uGj@oprSm@I ^Tdg/66Qս(vq*G1gpÿD4,a+As2=[]e֬cr+W.nz~tTIo"Zv$E>'ԗ:^$tȓM_gۍ<̲* B4%t 6oDIƓi/S&Wo1m$hbcR.0$OK ;m0C\U]vZ_ &?噳Q:[8M0Ճl%(ܓV +3k>|l..K\J>|t Tعxhh1@i0ch\oYױ v|#b㕪K[1.|c7q9x'Q7W|S6M&(@%YiE솮g2tF\(O`\^C֒{gKH4y?lcW(]\òGHZGb0QlN8:Ze Ϟ7 B V&H\[5g0WvˬA*&9;Q7DI6ۚoz'EH.}Ed2"04~?M{D~I: Mx 51`Nן5ZӬ%Շ6mx b%`Qk"/&$ҁߙ ;pX, KnlBD|7cau=hy/RI]X0#.l[x'IqĊ#lxXN=. t^-I,A O(3b,7F7"/+ZOEjyEDBjYɄSIvD!aZ7LՇۓ1p A;Cv$0;3*8IRh̩p2q4hv÷Hƴ k$\gREǰ1?4D.jU7߲:^Bd*',,*#W0 C^Tv߀d3xQQ[Js|GpJ)e1K$AyYq/A6iv#yxgŹ˱ h߁{4>PRZ; )j |W uMV#!ҽ*ΞZ4TEcBЫLqQKGHr<0F5cQ"5̿C4tjt'ALz=לzu*Y 3 "ۑF4*TAÅ͞27dHP^oLcNgԃO_=q=gZKl)6KV+c׳AhS A˒=)<3sOCFF@8?9nEn1\P_{`bXWY,gs[}3a,tBr:)10rd$]N Ėr^ (PV77ԄEN!O=fg05Ȟʰ;4f(ZLiDIOR ȄalϗY"'z7 rQYZPN a}³ {ʎgaa:i)*صʻH2\1+D*g  k<e*l,s=g \Rўehlc.zkPi'υȖsE=yr)qkE5wmR-j9;`5cƔbZ;-)ɤu n2"ߋǎƙ' ~~[.N2' Uu2g#Ya^N';aqSA{ⶇDۄSj6&E "u͝n*[v84-VQUjBfsYe]2u0jtCFۚҲR#)83 $< .i^vj(LݙV3zK#x b -"\lN;XAr#ǑǛN@Ú~DkkWTh6!} ev[( ]`]B%,Tz%u`lHFKt'N{HcY}x o6{=v/hj3F ஻4x@&w3ze;l%E/Nnk4] ??USd$%8x`{txSBy2% I)ST!" c1 ?JjX2 "+U`SK*r Qggnw$n5zۜ*Q:ҝ"$#. Vh+0f-D% 6"wGl__6 }F·504+g0$}LG"dWfu.:3R?<:Rb%1u9gWm:Βb 7 ZKiC)B *`VIj8I M;?QW=/vY@lsxg!=@I_r_VbfLR(BJ,CXpɠw$)&ڇ 1crj*a7th:pD^ŰrudB`#\v\¢j}谷;hu࣠pHb(kU@s= •TEcow 4D#d8A8 ̑a|s2'-}J\oJJȪ@TGMQ:qqD-P:W}EL֎Uei#@2wD?j=}8l ecCQƼ-{WWz޵=r`U%Mst,ER, CQn _9m^*{FԆQz3ƗЊ< _R hg A=s`p"vuOGXкJy(i\ho@[2rN^N-k~&W&/ 43ݼ3Ɓ& M(3'+$jšT},ncNj4|:Gd7> f">}y罙 f?5tG Wq\=0ڥg45c[*)<}D"3 2YERb3/%ܧL A<%R˫}4;8OS7+;k cGc)-H;q d;6/|h$Zʺ2e%#n4U4&A+{|qr8o#>9R.Ъ3all M!+8$OCc />eE +QYѿ|R3DAjdKzs+ AEJ Z=JݾKF ѺL!c@:Mp=jnnKč_'.j}0S0fK5'ty!>`y0'o<{+=͟Xڣ>03C/Z䈜IDg Օ~YYSȌ](O]SY\W+׃ހ>0Q&lk?5OP_KS xe{BmGd.i7V7}kѯKJ1 6%#}ϱL#NJZPKaF\@b*4HcSIcDN,掿%9.FEc #kʤ[\4yPcBtFq+|ul !ͺ3_(qG[2D9TQ#5 ~^*s+ٚ}WJc*D:#C{-U7UW'r/oAC;ᑆ`6/UTc{n} Jx9TՑ;eKhrZ'&bHq';g8u\1(#oZSW( Ne :ڏK o24Yp㩏DT*t]/S1,!袼.SC@SJ#j8CGlnU >2e!Mh2!X T"Q^V+H‘gE=>V6},@KLBAiG)yܧ|ѝHBF[^̿ _RsDZ?n:>wR'T8 v x{+J;󨸞dku=72x8EAm*)WkkJ9$b[rO~_[ e] 7`ʮd^- i#P /fyX;K&wrA10zqnԀ({(]96nr{|w9쪈<ʻD 4Ąf7'\߯T7dah?~o$+xa"#LM;>lHi Z=i>80 E(G79L|DAyD&Dvн%L@ꗷ!x~ZĸphrmJ6nYzvlUq՞X"j}N#ߑΐ+cec,u= Aqe%UY<1)`=ceج\աz-FnG|<?5Zc2aTuRy۔D x*b<' ~/̱ӈՌ crAsHDxd>f#l%-r, E :ThzV [ })o$^(Y_fq $]1sXMeVX4gR-58Igڟy6Q"H. VnGp'Qt(F]Pu>l*Bǘs᣶VMʺr{:h"G0{GժVAӐ5V>dԌ1 ]KpiT*_]15RŞm=7|z;Fi+Zjrey߷'KmOkHJR3PKPbM_0PuΣ9SQ1!e!ݠ\o|gK*[urgq[y;kc4k[Ul(azBv쨆4eKu&{< [bҧd"?ZC#Tco~PkavA7|`/p*jj PE(0 *:3$+VDX2dE°ay?S>CA~P)^D%A_GBi%k9ƷIo!?+a:>^+ FǨA?-sO}$M djTYpJ k5Ȧl+TL[+tzژ. mHYp`ȘE*vzP1c`G|tY5Q[]DĿs9e%(SgY~o_ń*e h(S="X\_*$T IӋXG p" EB6+K]J 487|%ZHQ^f|襁A^QkQC]n"~RBI.NuR='<}(byff0t+ϝhU}& `@,ީ5]DH)K7(PIx9(^.[}yjIR<Č_ZvτۤCo; [Ɠ;J_lFlob0ppu k)w1̫VKu6'e"e6Jte#'NmZ5mCM}33ŗ+^}W]8;1|'at KY֌2\@ )֡RGXRʎ]L=s;lĵd;5$} ʟ&$Շa2Ttnh[EPDzd4idNGԿvyl:ΤϏ`aǮyߟj/W*fZj+M ]Ep/1F+9TyڍibDQ_J)=p6(moRnvTEAG8K>Vi8h4 3$ON(Zc ܏ FT=ic5D_TB@ٯWWudn0V hV[ͫ(t U}']RX1>81˦{;)ls-p^xxF6{V{t>#G)|\ 7]CSyM+E]")4^2&-!҅3z 7imZ|ŏti0).jFa[2-#Üj׆VT;w`J ttMmUz|\]vb%Za$'gj\=|paZ9 B</yF'u&1|ͪRP,uv+)Dfir5KeS j)5'W`~ AQek#PV,U2W=XK&Coڧ6 !׻@(J ߡbihXuo8!X 7S<@d+dgg M3Imn~K*}c$XL=[Sfөp,~wDE_*R%.i'#z{Ur861ꖇoJ" 2YsZVґBIAՉ vԩ&TpfmӇ!zdb|׻/zB!󁨫[9PmT׻cM8 }x2/H?UItJ%$ ɏ Q P2{ _g9j)wNZ̻ MgɖB7Jl;v}AgKflf%"KRO@5|R uԹxCS#`F-]':x>/^egؽǛ?!=b]N9<^B]iMYЌ TyȊW뾫0Ed%X^\C[Å4`/քBlvf; ٧uǩ"0F"@+@;O}1 i݇nSzSAM:I;A7JzDS~"?5쟻L+4'\w ML;+ZV}Sݙ?}N\ cBiLhܯg A#/6aht_BwwYnλt!y ,66 o7y41@W'H*yzy_9vCàK¼6zm[6`%Z-}c셩Mc(GخխU_3cG e@LB=_P{TEb.z8}w$g{˪wjOsG:@U bJ5ՏemZ"I5]?-Rq,~HU7q{ȷӐD? lB5aQjEErld8,CXLfw`sԬ9G þ3z1_LN6+:bd@Nֹi/40De%WM[O2]6 *%g|f-1FW_ނ{: ﶼLHx]=R@H<;%`[i-~@?ܙ#嘆 x2)Tק= ް+BwY0oa1P|2n脟.|#0z0{\˅Cq[}JЕP:~Ƈ![&6VuSY^H]F#7s JjBG(.(*5XL1ȍpH2T%9qi,L>!Ʉ~u2>ZV0I9}Rͯ.R: NT $B%.;zKEEGDtJG|cư# %*O( FXfG# |U¨4؟r3 %Ej=hbVʹNmm|bfOIn4R -VP *@C3%=u}x5ﬤʬ]w`˳H"cţp[C£Jd '@u4ZJm3D3T=Ս9ZcCONA5&\0:)3ܷ SҚo-U<+AUr\1-66L~Zaj 1] FQXJ1,Ȁ;M@޿'K1 lGe&^@!8?Þ]@c**p?fM(1PytQ?RK?C""]SxYCm%%+h.-M|Ed+f( r\7caMYUgk} %<*dO]w<МV? Q6p!4fY#+NzC d6FR \v(Hbgd;Y9aݩXc=чZ1~YL 6 *Mu z bz7DJ~B>XIE`Øf.P<5Ͱ0B3y7~!?PEN&,S 3iT*ɟmPTK*R6L4;YXtwzש0}aץ<2a:՗VՑ TcdMplu(YqvXԙ}+ĴHrhRD)eivcgo\fo=-V$I9-Q.#ݾ[zx"& Cmޔ`p~􂪷4 ZxRmZP2jJove:,soZichX,?7 LKR3)ClXzxrfb|*-^a9,GH/l.#YxgoyR07`4>SR9|\ 62wwwR%RV~YF̬+|(%V  zLRl̹`EOcھIZ.AίbB2{D`]3/6Z̷a /D9(Sq۸|mSjx!H7u_FNLEnGMb _lMzP.3pʋ2;G62a hڙ!łg Ő0@[Y0;լ'c=,4aV~ 0*1rs|%C2j)zng, R׉\]'gS Hb.\ɒ# R,_t/nbg=Z8؊u֨PޖsJM E џy| KCh1Yu{@`3!`VDqAr q:ݪKY!yש𛕇 ؜j8z>})| x)-`e3&`@gUoCBA2]Vh~<HCd$ݯK+J@DV7؃8e\0byBQtʈ4 25e*i{7 |wf vw>/=q9uH~Gc0pVUUP!KN};cv =A݇7:[.-EKiVA Y;>P@L2/&[J^Li#}E? r95D ;&P6 嚻͚∖H| !JKM S Dn,`qQB:;6͖&3~uA׭He^wITR'ixhEc K;'cjdч!'7,+)(dS5ãpr[FG%J^ZsX$O`bьg'G@M]XMcD %:JhT2A;74H@֬%ZVZK'We!nu(?#z0|@զX XX;Lv~!i3k>Y$aol9arΚM;KtVtm2;Xvꨌ'H|f '`DlgKƦ?X`P*[E䘁@%0 v tV҆ !O\I@7Dūc^H@Г>g.zaQMɬn`=%/f3LZ[Bj$\Fw|=',:S8kQkkԟ#CQ62)o'Dmuq굷h+5Ge?ʪ Hɥ\#4`>5$1~ȷx|Z`T΍ Ov -@$iWեݰSpʓ,s8"U@S<[O^&R ?" %M˲x"RLG$Q8PХz_ XG15qls}XKmn)QI kuJt̃Po99"%+ft" ;-U?w ,}'r,&vi))5]jQ`uك&rc/B YIJv'ުېKxeh'E }@7 Qًde\&xq%A{t?ey&‹ 0{^~̈́Œ [EPL7Y@7s) 7([Ad z]kM1ďp࿘/G,I.uvmKdT`T(293'Q3 w+r G{, Aަ+ګeӶsm @z帓a#T3sF+7[KfCW)~t=o2?]l!iA(h-;8aT9zᚈH ud&GR: "s]r5ׁa;݆!?/bso|8K=+pTҍϟz/[?Enb2~Yz ăIvkǘ۵}6OlŁWϟJ]ݏ2 *B)Y !aMl *tH$sz|2 WI[_iXUۦ{y(pF@Y\_彮z}ExP*]+B[0 mbcDx86ѭ__~W^ᗻW\4_@g9'ނ|R{0B`|h"d5(`~ KaPrtE]kUDtIb x MB2 l&feqsx~rky&ך?2ITz1PZ[꫷\ųf;Wvb]Rx6 ;c+Lq~!A퇄-n;5%!v'kv𼆔tZx(9J݀Dw固Lv(h'reB1*jaE9TZVp}cb|?wF20[ُŁ_ҿWc{Xqn,:ٓa|̎z/*Fwvn.R"q8VhXȵ6AsSͫ؝ v~kwN2o}mIOȰBW[K (}*H)lEz+7X' 쮔b>:F-d}a^*(Ϧ5>uSdK7g nC$m=\wRɹ\bmIXCnŝJhRCRaWe}o>FNd4Hǿj5\PUGE%RQ`u8(_#&i1!l>=@o@A, /h<I4Y~-|[[ȹP,i7@_}y{S(]~: Wy<[V jm -=\joQJ+=7Zt\&~l#z/x9uP AQ5GW6x-A fF\/;mO,&_%n;'HK` ԓu3tTn FK!#)5zS˜m9 Wke|O(Ǵ빸P4]*?N@U#QoWnB/]<.ygI⅏"uv,} "̓]ָY{Mjrެ7yK2l.X0R瓑sNI0~o4F᏿|tC_x K1^1=,9X<ɯ_4sS .A՟~rm~;VZmţ#vه[:Q4t 큐>w gE."lq+d@  %7$_Itʺy~L;-5QO]&tt"5nH1L iؘ}?-nW!k!/bȠ?e嚿k |r {fP⍟P!V˗IH,$'ݨՅ@ԧQS搇4N8>ǔyqkίUy , I9+>3w w-F̉bFby} 5\g9j&}qMqVmb> ofpQcfjOz@clZ'd׳|h٫;-k[lB`(u0G ֩U7gn(nH|wb\'M,Y`Ј+_e (t5S"a1 Cx R:Kkw4[ jX;=l( E3%j!o5H S)8:jLKE~'@n։ W2%r°ڄͪ.; nvw{AblkE̓@}էzTwEMK+p50(_pC-@e~OPtl&YJr+Pe{7EI Umy{7s3vnT7b( <̫o2Cxju>"S x߷j۴n>n3҅r0}0 fϳ绖9٥-)u N-R>6=m$A(7+oϦ g{7m$>@}_q}9tmxnMqF~Tߖ8rN(LWm-qXgSosvx`, otԛl _\ۢʣQlmQP5UU(3B ⻵Â48|ġÎ4WcZݑ,3^[>ޮNjcŕU.{ywxW^.Zgm[8a|:f;|/UDiFe9UtyiW5E#ҚnzKup`9' Pw`14q~ΑX n4fL:S'6y|>Nq@,ŢjL!&QҪTY{ɫk]I3&O}ulv9Ei+Yi"L0W[i(φC޼FO\LYoUP*ŻEIG`dtU9`tz9}X[fQCS4!ŸP[ƗU ST#%g]P`Tfd)hz)]=j :" >WpWRK!dz8 C[u:p XfC^霺:mIݰܝ%WFt1| 0Rʍ_n61c̅0sR|#YG Lʼn+S˘&)3)4_{#FV6C-,Qn$}am,A3\'0l;'a )ˎ6%b=X=e*mv-Q-\BX'RI1ʴC(o{n61zWgh-'[dzUpO懖_X5s=JcSQ'g;i&:4@r\*=*u~1jPҎs"y^>uWG3sE&,;I|lppD)/;q9g{/ 76w@ҲHdWpխ`Zj2g?RHr Nk^IZ;v46[rCS} _]B3KJjNQ@"S@ wPEMȰ=D1C^K tm?)|UY惶 >5cWCR$VDa-O L_d~T\w}aX y9w]dzۆJ:_믝D蛑C*Pq >,}]xZx|+R0r0sΪ)>C,i:4O~2T7P6 U$֥W ;%2H4>^-[EF1&6wKa-"t@ͶYHBP[@D<2^ZC,*{R)f;(/crP=ϒ9LBMڧ\+wX߹6MWI~P9_1],7[e4!\΢wd)UQ)&f|"f=,ț[_HߺYܟ^Qoi4ӎ&X`;k0bNj3.Jln'~=G ߌ6h8GlT3O]Ƽ!@ʔt&nqPv ǁt7hoFk{fs4HNvv<`^5՜Qd \(UeS !L*pwF6*rj^>o Iv&)Et^6b0udha}~Wtǧn?9ȿ@>T 8'"1XdкA*'p˜J2\W`3w̟Ν]@DLߞ?R2{BjĸMR[Eyhi\7fIF@ QtYl4+bie\6!,wˁ0L^Sulq:DGP$j7, o gb_JkġP-N5D^OPteAvV_:v  1H5g%j%j*>bm\"%q jY]a[.dF@Ese\vzg#_+!v >aSg  Ϡi4l]Wa|vC!Lה£`V-n_Ɵ\ [7(7{%+Ge 􄰵JA⓻)æadPlYӜSzbi8o'rg2WoZWT ֊]Jwq)\T6jf$ۋ ?+}X'*͋KYKc@K\ָUFAo^]gߙj {$8]o{FxoN+vM}hGL;tޗ#f-fej Wf`^6Ql'UO%3H!+Ye2Osntteb7_`"N[ꊂ+2a18 fdAE0ppT4=]?޻KռQN!goX"tYn1!ٜDK \)p`NـԠh)6 2d}+NbƐ0xF'ĸe)ye6Os@~ubs neG)B<]1Jw_XRHaLAK!Cpd+16LjC`?ʭy@҅Q;`^ rrN۫ gC9OB{5H2UԃDڀיo@}y٩x6W5wB[BG3[ve ;Ecs]Uq根hrGҝUؽi:0{1EioXm7bӕI(џ~̕mF# 6|8yN=f !,ezdئfdi_nJ4j1f^.Z5 W!-#mpJ;tդ]`{G>6t=}Jo n2ކDL?`$a=zX?`Vx$n@\g 6u@fqpw[,r&~ӧ s5̉ȝ~鈟khmB0{Ovs } XÜ=!Pņ(h 1Dz=Tr{G^ׯ1-Kf&S8zܕkƉm2Ȃga{D7?H.SVXj~,C5Isoj2 /hLukƿ'bE5(! ''eR֧ CW^V(tgqvϯ+m\v. $4ۦWmֵVM!t-Ep~ΪE `TDgB?ְbWu2>Dz04 hۯYh lIA1t' ݮmn\Ȁ$Ԍ@ًrl즨,0MH+xm9{Lx&o6-ݡS1Q?` Y\'%[3w "dN)xߍ |8/JPFmlﶶPS ~9"한yL7 \#ƔRP~y2܉_+?)Z9GT[H^CLf{QMmbL׀Rmwc+.zE @rvEK >.&߂W2]e>{pQi`%٥Gn ͨ =u&\م_|EVN삦5Z3]}6!p9c/9x$?"L i[ˠ$]xQTީ<"huclFIe @H|qQZ/_3HqʘZ}y9N]t~~ӬIjto'Pr Qh]S:|8 ec/gӌ[%0iS9R_- $6QZ WN"L-Q.,l?e6=M-@$2ĸC[ .=oh&QD+ ң 1 $B+ < D+=u/SEZP9D1]T{ PdPeF#T%`p;H0[?9͸ych#O'cBiӦqj& 8qy-7cL>mNG^?8js:p7V \4dn-4n\"iī_"#.Ϗ$IѾ#7D YÛR.$ʢƿS>E[;4]C2++3@6 i\ߑ4@7ͤ/jJ̵;{i2m\фD NLJoS%)l#g$h-p@ rv蠧˾"^-MPva~8q#K_1:s dT.zH"5o]yeC(ji3jI_(*ʎt$S/>W3H҂jk嵮0"e|l7pt8mBBEN8J!QjcEeûңj>еJ&A $?8 |OHZ`W4?.pD!* FS8z7 eqܩWT3*Z<ED)նwٛ ,h(2$eȼB x珦Pv2< xjs)jՅfz& ^pn'-RiS$qXyp^x:="`ڻ'LABWlgvh NBZ9 f6)άG0˨rFŀ\_ye4Lg[v|gq^HFQA{(g/apNRK[h!Ӥ钇eE xKlLR . )RE<5tl]QL-rvms@/q| LhebbY5ӑvÃr.+0XFOgAz΋o7@k(.@V=;6NņAf&"(s\.*g:=a)=rkYNkFeUe oYbMD&3^䶤cHo9< iw6+m1K$y}] ofʬ"F*|-EXzpb\nj@\yD8Ե9&i&إ> =}GHiA]UZާ?yZ0;To7jyf``kf,R~Y󓧿ד̽R$з /!d^뼑281 n 1]5 .1,piH 7L(YLb!/OҊXcϖ?xvTTJAtmh? 7MGdWv3X%jᣆy̍-!H4!C+xu!]e-5Daao=! mgEt nzu/)r\L,6Rz L\tVnO|l Wd i^62٩Ͷ睡x9x?M/T2dт/ג^?h XgGa^g$#4 0p6.CSo1F8 ML #gT皪Nk`qeLLKC%S/') >υ'2%=K(e]-]a_24gԴ~j埨h[:exA6 }Y:. %n|5|'uI#t2JDӡLK{ϑu!иŇiBp{` v/ݞARi?H2@_כZ,S{M`f'0i~X壉i0Ԓ VZycPdR6>LS!ɲ/S|p㰷i agƶt_DZi#itDnh8!_q:.@oJ=OhrY^ oZ03a/!ŭMeOhD(ET ddhjA¨f4g߼_)SBhSbxMDsٰӃ1>3%GR9 =H5;n g8,9|sOqxãbi >f{ta,k#}:P.j&?(7Q7P2`'z@(PIk2Qsn vgyk`W)|6՟胰e >\E_fq2%4o'=QM@*,ڭB 8p}AiQs(j.sd, ,e+EH,y3o!=ГCq 9\*GgkZ{BƝKl04ևPTw5.+K&4q}ǽQX'-j"|>z.ܳ"hix(nC^h˷2! }s0ϣ[v"9v Kp*¬n KFo! I&ڵx0 7vhM̾ZZY p> tb)gxx*d9pqc)Ĕ =ac+8 sC('xdmq_wEؚ6Is`KTB~+EҕїF:xh1,O:ԊB+%WJ[`C#W͖DŚ%gEB$f{4#ID+,:V1.R,9ĂXvVZ+ٙ t ]&7VR$Cg zُ{pHKCrD 'L-f>L~?Ffr1ۀyR.a\g(]}՜Q3~-z$2l6FKB^FtOh-d?Koho=ot+E\cq-1f%w2]>*5P< 0U:ETHY1U Tcxv׈̨Y<\+nl6#M*ВUy8ZZDD iAW^2> * Gb-1M(0v\\lO!SOXpuE| 9aZ DOcf዆VI͖vq4^anqHi5+EV,Q־1ne!(:֣,A9#:n'ս.zY؉fpԾHlgp\dNOߠib^"6{8.k쀾--}-@GlO33-˴u>j$}# ^Yͱh "^5j(6H9W']ISwS+\ * ++,$:Q?xɾ܈ A[euPNJCJj١ S8{۩^7ؓ귽 2[#8(7Јİ( .ñxuS%nmEؓ 6۝Q F8 Iw[vL4u$:HuY_ |Pu(ĥ^1W4K^eRg7n: s0Tފi|ĠtΟ@Z`վa^'ʻӕ"N bP h?Pp {EBz:~E8"%Y)E<IM%/t=_[qF]7c:le*(@ !uU-Z@Ȇe Ie̞f!|srVz#8 ˘Lb.Zqv= Q  P&M/i3FϹ&t7|Rv1s]TGL8hN !UvH03XLsr^(2xP>DMC+;H#H@qH;,_+L=͏U8)e PPY5W<ҁpahވB;*kU1ώkY9::&*E;/FթIfXP\c jY:"͏m{06|=|MU ۿGnv$`ёV}9-Ig="ܘO3xd6i GբRȔ0`ĚU#DP3yu aZCwiP0ax]l.ȳ:N2.g4XGΖE8+VPL 8Fr $K-ݣ0K [n,Q`.J|^< 1g _ccAg4Kڌ۽-m wXk\^Kn/ qUuTEƪG^ /)xk~mE{){i,`FrO'VnJʠAyu<S} <0ɥ։v" RdS7jd}/Y_,U2,S KwڝT2-;uNصh%w/:C_^#$ 1ǒBeD'Titup%GUEgw8Rg@qDroXW223PK}KK=]PHZ բ kM,/>2KtP$'[Ԋu yڃ [%:*mrZ`INuzOPd ܘO#kiyǕHޞ8J ETiAÕ4B! >( .oVS(F¿F Ųy"id4/@Sm~ [)A9v |91|p)W `cږ? Eg8qh{*LŔǂRfO3w/L+„JY`򕀃q=3Z0̈vm?(6S`NjP47)&(Ug6]HHY:NMfk:)ZawOzyub dTL6.ƹ{x8AI1)w8_BUK{V충dj,zv8߀(&:oR XS1-֭T4f wº},%b [6a_.Xx6N_rg |{-R}q0a \ QrE '$&.+FhA%Sy:%7C0)`ha? fQMOh\NJ+5i6mީS>} Q"GSƦ]ږWIe/~ɰ!&epe(o-Zڈ7I `܌ [E5̝ޥG[%Q TwĿ ej) $o.Mmotj>5 ON$|T]}H8:Ct}7HdY}pb!Wd9Ӹӿ=\tk}&(`N!2p"ms;mwZ_vǂ"V1p)nŐxUZt{\VʐjL6T|ݑj?BzZ". NV}y(J سCM?R. ?}p3MwmĠz*To@CD#G[#SgTea=bnU^$n$Ӯ+Ī[-68PÂ(O,3O. ~ݝ ⠘bxL[+~yFldhNvxkv 6xW[_(w0ƦZ繈Z*e|;`},5[5m %q1Rn~˫Wn3g".UDKÜh7/}\]ulL@#d>AsA%g\K8y͕@8xoPeLrB\OԃK"R/cVỆ@wFA0NR)! P5bǔ*;}RԢL)6Nk=Wc~ Dqo)1܋LZJ^qL1~^yG&]E(q= DCA|>-S.gFTˋ~' +OdAMFŎM٧g|>ЧiУHΠј_z`e=&l-;y.A/h=e+-=/L)jy\w0HF>FX3IN9G#k'g֕:ǫ]٭a.oi5S3@/>xh_~kW(8힫]"_|b%惹֝qJD-C] *9nd;?ܒ:RT5C]p7(j##_#Jfnw6`QHus9*'9K%АI["/g +]+s e!-yrBh+3с8F =Cᶦ{5HrG dV9~=GTz|bUSSe/>O?_唡]$s!Zpxj`b_E$4{[#)*ǂT֒Ԗ0E9RFC,AX"xi-ᨉ'^RC"*0'+A0nQH<(+< 2i~)+%6Fq[j R G{h[n?|p7X)R4ꉠ6y@GM;V@[ϸ [ bӠ2]nCԒ>ou%n.#K Yuh0Ẕ&-;Z lFns<ʥ^. ,ƎK6p+~W=PҰݼ1x 4"J~W-U PYZ鋚z?51);ɨ$z [%:@.3ZEᶍ3d[NcК"J̋p/ڶ7Snx]kW;3M[a1ِzc56zj*Uؓ@EӴ'F1Xp (Dtdچu/p~[\D)=@& EeE=c8C*n7_qyFb'C*n&v>g],ֺ g d!n+H" AsKICH.6udׯq#KYg${79rf[~+b;?&>ΒP[8pM*Sݑad\ c 5Sć͔p7wñli/i|{L\긼25] Ђo RWQh'/5ӛJN _ Igw8*:ᲅy7Fb ?yOo!X0B!B>)d_xU V\U7eAyy[HfCxYD3Q~Ϛ褬D_U7&<37m۵)[ -ث3}7B [9HH}ePuS<"[$Bskm,R&+ 'R2Hd׬dѿ<͇d2h&lGc:eɟuqcf>pw;du7FggD""gZZ_u2FNAQ]R["9%tk+j 'r|P k 24i*<j,*86GP 4f-%toa1渎&Wamwq s @qVண1fƿ,}&TcFc# (n hSl'jn禯Lis jRwM?Tfƭg(N'U/׀ 3z}O5O<.Eij3Cr DM@1zh*{aǪhyZ>~D鍶ߠqӧ ^r[ b_p][;Y݇RG+0/Iub `_"m}R)n BbSM) z 2bjZ `*uVɎDVd҈lGv<JΆuF Ng=JBcgǤ#k؍5uL0bG7¯q1n%-F!Q ' 8GaBrVJjMBkᓤ[5JP p jm@'!cD/$9c7-K2ᚧߢa no?J Odca!2}[ΜR,YigMpB?ˈXo4}NOO E@+ǹok,9MXa r]qCy4.iW(mqkqQh)u<ź~g"5X\9mMz&oO]xm0 =\8^s]/u;'#<>(&mҶV&]JhԁGgՆET ~qZS$^PXӐ0ɚ\TI4.\9 M38fSpA58}e9Q/0_x4)aɧ0u!ok<ÔKbC.#C|X ]ө5|d,n21 [pSj$MN{ƞUmC#+9[P0 ; d`C !7-mtP rN2^+M0| ﺳυyOu1$@N:3rȭ y=vsGY=5L~#-:7x`M do71P_ }`港sС/x[)r#t3,;uHiJ^yܘ0* ƧO"=Z -㟭*TLpt_<VU5m^ۑ DHӶ{8x fupM)2qEt!_ڋz+ep]Rd6=$޷(WgK,Xɝn)jw,P{nuCreDy/b9K(&dL$K6w!pc ]Y>Nī%Ie1Ցϓ@NM^! HM CV~Zn S?/Gt`r80 Cw߬wsXÌiB _!Gj#Mǩa"hX$D(|&]gA$UAr:qEF&{W 0BΞrMNB?ᵴz9'㳉Iˠ xj5>$@ }=Ӂ׃.JJB*GI[ZfcTHzjP {_}~{lY!MY< _Ǻ:/5]97 ])N@ȯ3QO"cUۿ_[Ø&=oBgx~=;~":,J\mȮi?)_&ie ѧz=VOlo {+擔D<)]-@h 8E=*3Eeպ+RubE7ٸR gl|Z5lh/ o!kxJ.5X\LU,B`?uWhAǼ߂᳇@y ZKJ;'] h+p&CNד>fK*N V( ,[h-l}sm nB Ae~&p$}dRG'#QU<\>pH DM3fE&A++̯9+(;C &c'؍c8O/V 4-(?&D4s Tv"LCoĞ@sN2A\exVjJѮ=;*YՊ e!zJܮJv >Yj$6S# ' suyb3~2HUAs f%EWy)M4P\q+j!Q6f( 77 =TQ6 =@XB 2b쑛r]K9Nth XI!ȋ GmBPO@wy8,ar-\x\o߯kHt#ѹIZ9 p?΋bJzDZ˘sO":c9ѝ_PɌ,"Ӆ=.4+PYX)Skٱy`ґE@գBK8Xy `864٦ղj!anI}ᇁ4shś@~Sޞ1\2Aa/Xzr =+wM@{4 >,#D[Sk-|f9jjw{ |ISO}oc7.!{;Q|6@& 7 ^(ⅻ3yHvA7ChF8]Uߝ`$7O&_Bb5.όMw.eo53P mRU{=W|z>x[%->(6m_xŌ*K~tMf.?z eq_6}ǂ5 qZQ"%5I*nshiEmjۮ/zCπ~Dpjdm խYn˃0Ȓ#-8(zFgRU$ƚXM_Xm}"L6` O_KU l?^mUy|rڕ@/d@6j[lC׆CVc=r+O>tW1̬6+Nf.C)nF H5k+ٷ6mbx_wmaY`0Cva( UAY_yxtPnivؕ) 2Ԭ*g͟MԎl/'guIՕ*1Ğ.0w9e#7q~`]H W/th]p &~]Iʃ+QsvF,~}MOܓEi_PP0vgh;,`ʳ @w7ŋ8 o'=B ֒u9&,0Eފ3g0X䞋.)PICInM`<0ԷE[>候|Lxtm Ȼ7$Nwzp%*Yy%JqęxaK;o5wSy#V8bs"^֟יssf.=L∓A JSQlm&! @sH3^4t%**07=Vف {|b~VoΥ^G>dӳ}vR&,5VaAn>sj!PG6 4<)|_S?JKkA^[@J}/q!,3ܕB v夡딸uD`uK i?b3iGe娔iϢ36(6o.J'ˈi\]tp򉞽}5d?cVe{<=8mU^q ;xz YЖ]}#"mvk *FM^{IVOaZ#?UviXi,A\8Gl'x[FoXĸ-G;b1V+0S4SSaC5HE}?=3py@2zd>$uQ3l~=,z`>b_MJ"Ck;4l3a窍(CfvU,Ǟpxd]OsFHRAn)TqAёE@Gއ{5=8T-,y䞛fhb+%I+2'TW%&XoxYy6_|тG2v1 MȠ"m\!fYv Ag<gU3vX* ;D$h.ZDPfc3(7qzs3TnU-'ݤ] X=&)%҈n5oG9`@,2zWANnXT LB%oIʈyT?|cIʭ镽{6 ЏMuAA!+GvVUt @h=Qh6n=g"+z(7K^)?Jm?C<>Mf; _5LAn$vs3c&аCmNsf?h)rʣtryɖijj_ sHX߲{N2橪4[=9IbXs};J;`{s7}.cl 9îcqįq[%W*T0m($ގ7/V}L}%!ĕ" 8!zqW7as3>5%V +@.[f5a?Wf1Y~pw9)Y,Hܯy!̢CReNm"&ֆz 1FYx|\Z_&F ^|)ɼy+v 3iYh9\.,眗7Rq5(@W,gbDPf2Jd`Qف5^.1cx~mjUՂޫt1PY0AeD~={$͇1 1)Y-m+"(DOujɊ)a-T$U db0M hhq_ņ #IrfϜ6,%csS( o7k~Oء }@i#fWX6+IVvZAe$>E۽xp W:ᝅXjf ېPg؁چxM ͊/1jQC8`CrnVyh/ %eSBrL~4\*~7{9zE{ƹ}\`Q`3BxdPCMA:e$`(]5FU}ƈ\{nu ;6CDEpϿ+9o<`F'S&s!$tANPTa GG+7@c.9xcNlJXBRج@ԃV?h7[I6˫ S*^U2;K\+3` [ t%00Dʔ~O:-JO/Ε:PwuGer@)ENr?lIIJ@i(hymḁmJzυ;cVԶDq}oCb#} Wg9V%n%5~1*'B3u>ӤކRobRs@^udARKWIV!K(!k_8C]z$՛)]v̗sx;λ'*4#o` "7$6nH+.knq18!eJ auuX R逡#=:g [.Tz7c-Ljcb6CMJKqk͜ 7lC^hghxyuctn{L4a8w|k^=,-'",[j}7Jf5יgVÛyV/GqtWfz9o)1!:h݌Tpo9sGqTxIݹ3o+-s:l ƹ/P=/u#'&<][ G7þߜhKY͋U]R cj|x˜D"N;]Î(&Zb 5UOZ 2ٍP:{czG.J*+V[`Y7'c:˳q廙ktӗAsT-,}>7z5/++DG&^x9Hgw'~ ]bf( =d8mF%=*$D]TI> M`VRTa8[pL }{-9QO8`i}C_Ibg#VV'U)2Q8hN~${.v ďDZ]`Ec`%|4N_% Hʫ< ,tt-yb"_-=5k`2^ä́Cl2/%s.ƼxRV=Z{_j;$?Czփu~n~'so"eD6rtS S'̯?M;̔t|{Y`re˪Ҧ+v!iUgB.v;X*Υ/f2?d1끂({:G>'pJͅ7uvIFa ~6[ZSF@#ni)SPC8OԒ,W'6 Uf6=%/jK~U͝msxׇvy*|Y)]~(^HVݣ 1K Jr. _DZ Zi"W;7-*Cɴ7cHOnC-e=vQ;릏 a$'ct_B)muA_'/Uز$Mr85Ӫ LSFLwWKB3.H,hycrS:nYP+A- viyOZo#Bi[3t'{wRIepa9g#^ @$>1$ Bw:oEJtVǹ3MA@}w>_JXL^}0"٤^!o=k։VC=:8,aIAg0>y +^>@ImLJ΂!Ku '@Pjbך|dxMPzKNT2eXX kX2_4#$ğeH[ ٥Hox/`{yf5imZG,V؇ru:أXXBDP]: $&b#,FƝ$U_IɎ+#Pwh6Qg‹aKgS_.W =,-^{ccp,hD/xd.epIK~8,h t!!5"MHancSMuw_Wjo-YqY]/JTvfF ,_/6 \WiYxv4Å:pP.#ExYsSc/_8(&)ԨaS{.`\]E_;~8.E*Lc" m̕(~Ko,qkl* o.2.פFqO/;DvCR^F+)F"XȠ+'{OMUvZ]mynH$QmzzSrT40C@sCJI\E ݁E֘ ̇M(TB5Iv:WPq2cdh_`LwzQ?-!F:'t)бPN*oH{NwAAbgC{ /[_<酲VԲS+)BKrrix#C7fژ ՙ֒\j1k\В9(qw4?ETk/QzǐD#^OPD7̅y@طCvn#Vv()yBA\llJ7'x+ƕ&Rqj#!O^DN.#A6 *,q /w]ˬChq6*bqsprNƕS,?g? ;-$uLtXH^7ݭw< vV+!{ax7CWhKnWŊG/(@BUggzUrݳo\oYym6)}?X͞S魘NIFNziʦ1t_/{ꙙ "Ueڦ[̑[@\gf=ײ%PA-vQ[-䢳6u֝ZAyK^Eq)0Px'xڌJ;-x̒WyȪ,,돈G~3 sȠ j"Vl-$P)]~']eh kf5:.:M.EPS+C稺90k`Ы~7t6% .KDSV7ihB팜(Sk]Glˎ-HDI2$Ffx!*v)n(,4)g q䫹 +zs.dߣ/!J0p_rqaPo$g%dqf\:XЦ97/X="y}VBokM v<+4М$(~/V6 8h=pxttUpOIS:o-yM:vc&S5#&Os3?9Q ʒpYTz9%~p(!&v?'\!իjovZyYaf_xULg좔.f ? lK_JE`X2 cR,eVLF`hL5=5s`w=ο*0?5Z4eO=T-xqdj0#M4dly< Lӕ*-EUi{>Xw&T| *|Nۉ^mtzlRZVJ$O|űOY&t^`vZ3'"@{f~BH go^..^^'-J]Kꃁ:aLQi:[D_7LC-ܐ4e|J!ߐ>(67 $F,M@2\&+Sj6+K 2DL#!!7q9ގܾV$?}KWa8QfX X9Ž/VgALoطWI_*RX\HfOe^>[ 39ά@Fk+> Q~9T2Dоxo;\Sd5, c.m͵ދz!9 y猞w 08p\b$1qJ 諉5Ёk2Vyt  Qxٛh r)=:}!^e/ݧzNh[[h)vKvCT7 "fԬQ|$5Ad3ڷg)|ǖh\JDr6,H+oEÈ]z?Pp३i]vbS4~ ¿fYtqm/ o ) 5E״#l"\ެ!dvv&wV"i+o $ӵG%ŢSp s*>cм}Q-/!zW`q HunA:fDCψX2%]AM6w*ϝIVn>s.2ʾKliDe6$y|fC>]j iGtTC^ u"uNID$M(ƭ'fKkY{4S ~7 1 _ Rސ~U[ZFK. PЂNO6M=+@ԬQ`C~I=f-'ٗ1*`5"a=ڵ$‘=8/aZUahDŽޏW +/[ό+ޣ$@X>f0aߓ/~:Dwмula@MP5Ah}͢Hɦ&GG{}k.\ߖ?ؠx :4D $ǘ!Ծ#]DQM8XK_o~k[u!#۽K6\-܃[WjLι)2r$"Uh@l{Ȧ"עq~DQzvxL7ׄNt:.hZ:i>F]gFgkJ}KH qawRDfoerj=8:eQ hYV*R?p;AҍU@yWH WbXL !Յڠ (tdwt1H ? nD$ڏ>fG*`G:TD); u6D.ԉI&!_ ,idXiQU *lxO'j:hv|B}.^JNO,K0 V46 JȟXkWonKd7%:- uc]K[f=ٟYe9o7+eIu8{ jXAȧZdo;Şk\jT qERwFKmmHݓDirڕ('*R  SZVY8w"σsͤO%'?" .;GasԦӭX ٍr"XAT KmlLTWͱoZQ`*c5lϛ("oЈMOI?K畞v)BjJ_ m業/Xjvnt-{uQbζ|~B_Dc= <`9M*"ˊW9UХAb T#diiƗAx_${׽*?3:N~ERϔ,j!aX|Ȗ=-kh`>afC5CQLkjT=V  =Ii*Θ~I35;!ue4Si6-4(_aٵ_ëBGU?3w\8 ^"g*vn~)VVqU`6HQq<ז[_(}шazʀ+ Y|]fP|Tv\9zB~G%5FvbLHaQh9?[Dhim{Kn]9*:sZJtWg9b߬)GE> 11!c\,Iog90Nfr Xΐcͻ3L5&|z]*a?}&l`OJdaB;d?mMZUQPj'`oDk$Uccn! ݈3Ͽ}:%|?ۑxw ft͉f/4\nsZ͜Bu9 JRumr=eiOn[ & d+mqKҕڏZ]Q( 4<"27eɩGUKmeG|A4)+a5o2fpV/u6Yg}b.@ +g!K1~u @ƄA Ɗll !R|dV%#ZWFwWd90>!j7Aȯ^ O}yh6;0ycݧ'BP lMnE4CMp|ph5M&JyGJeU>[+%hQLwV^x<)"K8}C)WE>Ā(MW[Sc^]* K%_G94Gr:>Rڰf; de_!5o|{Q4`UQ) jB ~sؘ G7\E/4Vem@ymGYr6}  3,O+@ .˜Ջ_8 +;dc5kIoO4$:kbt%? }ȎIiE(MF!JJhs?~uޠV#%ݭL~r`tk.j?t-{wOg-}}mFc!dǿ<y~aYҢ]zĂuz6 /Uts%f#p:WCABUFe. _ udՒjueȧI[o{0Qŝl=Žɯ3FZ%ŗ!ˢ9<$!bd,UZq(U,J6|Aڿuu\{\&^' 鶎,GW/8GaΓ1D\HCʝVJx|` Z+\jư$F6IQ*k|UCė4->e7u L{, LpwrQf,#$3}|;鋷 ZUl>$gԁiyu kPN@rdjBeXqI4j^%WZdMIr잱rJqu 6<},C\/c}^~:9}ݿ|L u5l+pս𹮉|-)s+-PL#^G+:3@S 5##z?z-tM'B*.VmkyC=*@"*Tт>}3j@|cTb՗)Eiقh~BQ(ЛR GV0:e~?3*+)hd-2oozm$ɓ Q/lkxrDG.ݝCf_J|éBu*U# ˕e_&K-֫F_"^\ue'zajdP` h+pwZik4/:!}7Fxb^-#h&ќJ k|S򲀚â PſHPH"'ԾIp2;qh_| S!(P5tHY}Ds (GWlSp1׮hb)N k"$4޸tigXe-'VrG(,7[Za"3ۖmS EZN B*:|a9ڒ}BRF) ۀH;ۑ-=ɒ{T = uY,( ``8 wBX'9x] L 8JDw tX]Mi v׎[-> 'wDҩF!./?X~]Y\84c)̾K 0a}IXQԂQ!:GEׄVqԤ,Q>7 ggBĿ,@}9L^bB'/yQ4VfyNf*.2֋lfҪ# +IagR< Bn($Y G>u:-TҨ\߾w%exE r:x%b5 .xJz+qRN9# >ᩇ6r*DL')vCo<_p1Ng?4#w^IPAB񼩑 WNqn42W" )%qHa0 9?e0}B( 3/^CtLCj feEƵZvCSQ*= E 6̶g¡ƭl:X?f_Ak!hc ن~(uzC%$19 2c_u_FHɽ531~PK[t9C ؉i$!3Yo*_3ܭh+&HD 0҅Oq$",[,7{,!&vbSC͚֐=wڄYy 'DWfMp{NJdGPk2"w׎<ҩ`{#2OLM|0Kwny]]6~XxvWu;b(̙,6, $;^:KEW\G [CYs 'l v]͛ ?Y9^TP2{\|RAAZ,h.JRQaj,Ct`>k"mLvwёdHgo3%t;k) n0PiۚqPlMRly|8jF ]&oWдtDz uU`S{YeF#J* |cJS u}?# }'\f442iOx茛܎ZF@߈ssnQpY9>@F*t7$*j9N;Ym#fV&O> `2m$ZRu)1{q!zVj{&6P5|\)ۀ; j<ie1PM*9œMgs8w$b .v?y_B+~}Bt-Zы)b-cs~-X%֕%.\?2 1t So㐳tTÎE`N4Ur)_q ~UGg,BE ZBgO]3:ƛ4#,o)O,82O l?~oO162zUXNO3%MF 8GrõNDų$_|Zr Dc'{09YT=5ل$>\ͶOO6u[IwΆ ٶt&fı*$8X2)23Q3CSQ凰&e'$24)&JOěK_S4Ҋ꠪Li9C=x*{6'W$ZGY]oX?W n_^R^:E # t!γW9k+U3l(BhD>@=nsesNWokvD9uzr1uyU#7^<~Wqo^ʾ`NeAwf<ʾL>A^n|ΡܙY?A,S,Ǭ^ꉋXcv!K_ΏxcM[\zmrimYcnFyd&0ڛ8Avėй }[Q%!e#9<qU.HaJ]Bٯϳ%} ޏT۝ᓆ8]o5/25qfElSc;nQr)|#!c쓭#h_./O̭ /zq5JkIaU<5˲=4uD?s?==, 3UZ>9fWTvo.Ǹxp J.F&Eb 7D? b7*+I,>yaV}+2-|\ݥ\-@a?0T DČޟ$p1B~#|fzњ{44m%{ o"767,uuFy hVY#E~E@gz9ʳ%ţVjjqNe[CL,Vg|ypJ?G`04p*(֥ɐnoi tgV=a9+?+unhqcx[' !`V8'!`_Gg ax桦G8pRz5p_ ݤ*[g&E(½ ~V"y>HlK0p[&v4'9W̿6t3iF,7} ב8dBg1K1OF"$uvf=Qu4e7)6~a|wC#:c?1<\5,@~u@`iƌ^ЎoxɎS߁׿O͕wǗ5CQTi/F[ q9< w{xEǣG־I]lB:2wdd7L;MP #.%9r4FOFE^Ȏ'3GJKINMΰ9/ P)GYtVF?^QM\gq@ ]݇1@dz.rV>`4r$qK="/7N많=&ҭ#~(6nĘ>h!7soٞGaђUe=ȴ]z1S :@8ȇ+_3+/pW,@u4GbzΛ`+ϩvo雖u}ޒ<0iI{^}U9[ĪZ-%JoJfy\,A3)B uCMu4ڛD[rYȈa̤[ `}MBvV]_iV UTctK0j3~IC38v+Z@}J#/Y}el] =SѨ* _}Jz˗dպ:^T>Qw=^E %Fە "d_ jL?WU4kwZ X, ae & t5NnħXq֯^ Mݯ5Ӧ:ȿ$,>1aBA+;cId+l`E/سJD?[o:E'GREV ѷD_KeImW $8d蕎0{e{ x9(4W%7G!c?/`K<ƚWDUuao븛dTD()롰ܚRS7ـVf%C1 4k}hDt]SC<Νl ^4rjg³@ fW D(18m|7P`̪y+m MV0Tfp^:eoKsԭQ"V-Ч=eId[5q4- !Vh$i[ѻq t4g[*V[)"]|dOAtnkI̸1y6CH@0_S"h< ?ebF][oا9qMŒ ] ě}~CӳM *mX' _BÊtدG0uF\RzHr<rn~ZF$dn;w#N%H)FvmGCK؛-7hw:K dXfUc \[N`Sc)emӡ/UUg88˛O Q%E,] P#PxK.ˤgؘF̄p1@v {) D--@\'uωGN댖) ^0T;EaީSU%GùUU'r3fc@``a;(Jid,zt0GTY tʸRk:mY?׵YI4PZa&y^ 3Q]kQɸDn6$+#?kO@J,}@UU6zwvbQa-$vN0'ʕ֣,E$: vUr7MWgz3Ĝ kXdApl {^ G 10sc\$#7_ D FZf +槲2n lչSċM7φ@0S98 C4V ̗9m($" Ɍ 8du ܏~ Ң\;,I;sۈ!3):/#^e幪,<))VJG&@5o8WKRxc2kIs FLݗG=ǻB &FV 2 ]xR;fY F zꈳ#8>q a}sZ<O*،u.AʗyE(PFLOhUޯ?!:wmŗomxkǽ(zt17%ް,! ht i "sOѺM`?/>ɛD Y/5:Z䊏N4J>i-<\w&#,f]ќ4(4[QbW5}"/WVk(TZ7Lٲқ6` /($x剓gVy[34KŚNÍVͳ,jehyx,3oV/~-5֥죓ܚ`h@{Is}EBK-`pi,pNsss{"w᧓` Szx;~&F3Va` Fk^ jpN`6wVGRq/]J̔U*U!yV iΤa׳ؙTLu혉;х*t .z MsAz8ڋq *k`MWeN|AIGFS_5e{s aBN}deh}ap>hoIr4hj+֒HI(I:7m 7r7)x !ЋS8_۬$ruKc}b89-e՗@R'{-;*v(oS kѼ97GVJj%*)rLHz6Ƙc:݂PIVs03`S"Kbm톧Qkv+(QFw`GGv[kq_X_S X&uvhiIq\)U!|LYf3?ϝ[LL sk2!9G}Pvϓ/6ޅ6{SdzNǰL 8ʆS-OQ @RoNA|dId#쇘p=$nC0g|q iL8;(*gTONg~onp-c9qS&eRs"LZ8gߍҐ%)x9~-݆GjU HKJ*KzvM8jwTK%+U"ֶ3 4!SaiZLneUm };0@08'װ=%qkGƓ#S-[T9>c bUWFaug[U#L n aM9zcώ$\K@N54f-lѧсI&ѷ*R I|r%wt&_HePʢ* Fs0{y$b(4^uQUiv!589Zi6'";|L~ o1ro2Z*~8;+:j4|.1: u)? "w>4i']GǥY;f"V$B,DkD^%tFJR}}]ZQTdq;\B&+y mJ)O(iR^^ZFbbPm4Smg.~XuƆhYZ@D|\I$i*lO"{+otnZ_8Êm\Ç6D|q'FȬ]`\0T6@Ƚ;+ޡ|epUu1LϤy1ZHaUo{r_%!z`ِyEpȒ}c*- wx{TÕ\}94 @&=١#|Xrw V.rn9Qt``kF&ގ\h -5]x^/.3Vxŷr?5VR&w7Z=xk|'@B^A#M:壛o`-}˚Ǹ`.6eH6eFxA'4Ӭsk_g *T4'V/k~uTMpt nHƃd7qmOPuEHA?ihR>a1Jssj0JeVB݀zGZeҙ:?qrZ#0Xx!N^`V7>,АTo( Ki a/ca7r-Y̶mVȃ*9L;!Er/ۍ\[Om[38`qiϺ(}T::_$!Gci¥ ~oE;o&q5k^(6i7TTV$wHr_h+(wTH;\Bz+w߭| -M@`ڒ:γSv'3у c0Hķ8$vOR2?0 {ї#ePa/R4oeWI70Qy tXy!ꁻ;oA1*3u𷵞02b<.2>stTVBN ЀJǹI#ːk؀Q! -ttLt2L7u5b-ơsi#GC-,eO8Y)$vDfw m +(l'ƇU̞5ݚtS )4=ѯX|lH SK㮫!LKmY,D!0p*Ƙ( e:[B?% !ܨi#Vxd96$KS)$:&ޙ\?6)划 E7S-3UaCv_V<>=?ȪX_یa-M[nWW`!l(J?EfI?\fV6otgo{oo$Mve񉖡a}PEP#߁P¾ρTv 0[AqKޝX>E 5-a#k^0fq|gnu}:%b}¾k^kXa4}~B3fv!2vu$XDaC}ATUFR)못Tpw)kYuJLv -J HG-[rkeԢY8Px&z6s-/qG4Gnr)NQ(BNtXp1ō03&_R$.2rp;#U:pA?A.@<,6W)@% c&SL:`QOC_$/ȢMRU𙨩Oh97Gd%"=A6`u,2gq`whSp7"w\WtM>&J #qt$_T@c3diŶirl}x`mc9'duo(,OlQ>de\籮oKc=h4D{J_ l Μ70޲0-&2RK] };K*xcjr;q?kPy:Unˤ/ه^sW*o.P4o%_tGtxgW ;0<ѫ!<ɥq~C+f b+e;4hS)alsuLW!CU.Fvs%qFS @A+/^c"9 -`hSj),@Tuu`6cI8zS4#~[rʻI-0Di&Gl1YT4 w&b!h uewϕo'xGؙ5w.Rg;%S{PP -'v{GY7i%X:9., ))qsWfOHfy9Ȁ0 CtUkcXe;Y̩?`X2Ua\pSAW@{AFT>xܾ?i5eL d0a0{pNX_y357 4ND_2bnXPd i,]?ܸD{t~He3W`X ^ u[3=ۘxLl2 ]W=s%ڙ5XS FND6* ¿gn)pfP‡=Ia34,*Jy(˜ g֭'ePJ)`>dph2?b5&$Y_x|yYԿ¬rc?gX{ݐDlMm-}{g;;m1~M; ij n|A =cUGZVͽp|C'4Kz9I)"(С㒜:|k?q風ԃ,h5FN=ܻj0ZEW{}n䘫T0MrX-PCKKtt혷ng"Ą_OCp1H>B%}a?ϙW;yQ5S){kww?P;<CՁh@HQEӆf3ݞt.v݁I`-Sn=W@#j5RK8!eS_l&2MӰ)&_dGZxP 0vd>u>7z r ]nE.lc鈍 tૼ`_ e$ h8 ia J߸gV3ABZt[h}b(RvOmyl9{~j=(GO?஬ MH\.&^č C:vJ֨ *gcb^9NS+5p`Bt1U>; TlX07=Odz;%l Lr|[`ĹʆFԈ6!-5Jˋ3q~10PCn1ӨcՈA}# 2r,gBP bqUbThӄ'EG2']_wZ[S_M`qp}leiR1xrY ?9(fȗu=n ipS_DqDT:-OvA ێ=\f].ЍqZBԳ7a "s4Ks0bA:;wa\|a˸g:΢tv_yi3MܵXLAa< Iy)KXa T*W5=4Vţ!-wm֊NZwL;ECcd*nifvCl$BoA w/ըq lŗk39#6ɿG]2m*py1d'JsGB{\Bn ֒g^OYQֆu.ꅙug)rAt-z!`6  dMzFbD,o yzv!"|ZEwphdW]S^ǡvZ1U'u¹kEXpU@ezY~Y!*"Y #8 jy=uqMF4r$ -z2f&FU9%fE#!ݺż9 5Vz&Sjhv$)^F8r\nlƝE*T߮ʻb?bgneRuXbcƳ zhj=9"IZ)Roůr$Q'*>S̤~"(P@RP"ƼT'%E_!vЎ%MC*X CpAc0L1\Ug̸(V,HS{yzJd:{bN:ztLj!Xh&,  7Ra{F!)T?}$rSyxmSw_E_!]a}Wj!kBeX?WtI/'D#_Yz#jhLS%wbNcb1Ilm~8@m,j~ߘ/I7BKe{.vh0j%<捌J#z>a(JIzG+Bȶz6uC K;:au6 `vi$%<u*ʴ7eZY!=K 6}F2>$3G66k&z]d}L?L6#܆,QFRxky>'BB?DRUUG7)_ބ,+yGN^?{ff(SNP>F,m1,Iۚ,B5X |n^4A.Uafɝm`˛rQD4_*RYѿ(RWaNDϯW-}fgϦ3kmlyTkJiw $ɩ>oC`U+Fm:F?%E(Ÿ W+R$\`z"( [s2Z3\FD VE+٦Xb3D*HEBcV_RGe05Hf^{Wj@e pѓTP<g I*8Y@9Iz8"ŗtba策h4,Ps /g^$C:TEf+Ү?<~̽9 LnZ֑" ̩j*E5p i׽ |Z@T;5"!sMr:߫Ayj ~mJ7JRٸ'*,D3=THqTY95֨f !$z}WjqXZ4+q'xI1hJe ҡR Au%~A mm@tU"k@:LUۅ)jh!ud`F4e );?aWOk{\mpE:44ںU1v9gѨslĹێ)Yo~&3;BG GRKd'w!4s:~uKv0\62eIȝm, +f]“UreZof ґaJҴ:Sij*I]ފIRsSxBU3f^󅟺GK4;-n0/[tx%,"m"3|8 2tԋ;ͯ1R*Γf%)w\fpd^Wa} Ey@˾r)(&icz[W /JQ/B1N[T]%^W4\ vL˯@fAWQm'm9# _,kTEKd 4>l30`7)id%޵/~6%O6 =eI\P,bh _D`̦Rγ^Ln.3˦d0+0%cϣw`Oe&)#D.aRYvqE@f;gC\}Gs)ЕO<|&Ck^VKxiSRV)XF_œ:v$3&zױ˪{\v(: g;p{d Cp 1]3w੷oY_f* l̛]@&wTDHWTqf=(a@?hW_^U0bmȼwvJkuYhmQ*Bp%rMBͧNo~o+Yɱn# Nhq45+a= ‹r&#ǀ-gH*y5p LRYˆ8Ȥ,BM:vd e,Xf^h҈~V.`3{uM !:ȑh0rqr59_ĭ իslxF~Ȃ[ȅ:b9ɭ]|L|f GiCY~%mS6cz\NGwk6;Nruy^QHuTw깦5~;͋s| ?@"~ߊ^ iYUsTļMIebcF%Du~T1_PQ$_0!h=`&`Y԰%erv$VVw&UvtrϩٵZ oTƺwI~!BqA<2ܨ@.ZZ tMLTUyOC//7?D6P,R!T&/,֖ 㡏TQ-(ر~EA.[AЦu~t9N#4 nK _%``@yXZO{~ƌp%2yOK+MdA'֍*MJI^C#u ǂ?!bow:ٝ.pob9HZ3<"ܩDBX{}SXo6gZ1uגG7Y*d+3lMt1wh-mYՑ0TLl~*G}S ڱ}vwݔƟԟ:c|2t'὇| \ֶo>у8LV.f '9R8I8i՜iϏ @7#yɷb]~%O-_Œ@ӨV$z#䖱*U/L~PF z%ڨgtj^CѪl)3^B4X!uè#ښ7kI,*_p6*-_15!Cow8:gLkjF{laj'RA;1J_>;]VuN򵙾OK>]/UQb0Uxz>.@e@0~hl ~d:;~6yq xxB'?72E2~~/W?vRݨyTXqX$i3`(B@`y_ %L"?,>wqqfx`Pa0_7O^'}[!O d,TM8Gu9iVc5A'U#r &xy&r1AmRϲ*+gṪ,xEI0BĘtE|;gS|cv 9;)ϧFM}@~Z^D?LM9Zy56<6tn\)ۀtjUk@)e :U Gdey6A(-1؟l=,V"]`"7OWs(3ww;?{ceJM%+LLtD,VGmjj @K4mc|Nd5A'aJybxfoyAjQH-އnA*PKɖ j6 ] an6wZK͙9U* ;OըMț"×kd=v!';sE+u%D[Dt l]kķ-R4-Ei>h>,^Fsm1Ix\M#M c h}:AN(eRG#hoꑂ- h#ː񎬗>c?H)4Oi5 -=P$IPSEs^nvNs#D2E w؟7UkVy+6;~#<ѽ[8gyEU,oۖ'е=&鋠=Uo>0Ԍ<&@S1;20S7¼ 7174k[PxEqn#AUY9X=Ӫ?hTkG=S &vjw/TTl0X  U=o*;/8Rlѕ#ޞݹTVAWB~utP?uфbLĊ?X%cͪq5:>K9v!s^ru'v wl /w9>Fʁ]ZA6 ᤥ"6}FGÝZU ]4(,fFR'x+K -&S h X-AxNF,7II1L(bڕ6!Aiת@2> W΁xυZQm([8lk=Gg4\G gY 8F *M"5 ک!%`T64'(dȝͫ [l<?aVY[&0k{CfJsg.07DptҨKkTGO9ks,Mᑅ~EQ)ٰpbV&L93ly_j>͖ 2SsRU >k_;IzY$(>Q..d\ O'#ܺEe&lWCm.*ҮWvYbaimޓ ][gJ~ʳnga2p({fhL۽n7y7"Omt#G&ƞlHNGknygE<85*qV"Ӈe0 s HM\3Q \f˦W$/U3t..cNj3\y/q2n:w֓b!AAƥ @Ct7o!tY6tk¨Sl1EvZ>Rop G>GֻH'>ī / 0RSz*?UŔ*I@Z^AziގVUtb?]v&ni &LqⴭA {؞O QrH]ژv\Ay̶zιd`X8X ыF~Ui?T"ҽ`*۽6z1\e40f"gJ ŧR@R>`y>PQJfL:$t8gc (HZy$zcgϮ>s9O'B~Nb=6<{Rwe0qK<vLz(%;}{Ԍ2+uq~UBjx\YTα_k] D贬o=MqYH)=ढKPj_@]&OQZ7{Q$k"@g -U*֮]ǦG+K0Gp6N8ԛwaJ~b-/:#73W5S@pέ2m EaQ&&0K7؜Ș-ڎ{GEp?Aa:II'Ά-0?$Jg( @(G9+ }fQl˪Ŷ6jj^hK(*⽭X& q5ΧQ($aj" YW4OR]Nsk uIH.aA{?]8#-~N4 ,Winv6'f6R3a}(=Ae9r?L+ÖM`:EBu5X)EFjBq\6ϰJ~wDϫTLqTQ6ZH 5[epG-/~iDiF쇆HOAjx{Ō&sEKzqO{|rPtD^>,G|8Th;-lm*Y 6m!4&^5YxQd֔#^Moeڊ KPa< ? ~V{;ͥ.?"9xc$h[ցOj~3پc1Z;uwS>Ȁlt޸>ϭk\; l/QoQ"%k5\fP']G&U_#1|M@ã9kh S$|v*(&qN(Y8clݿ@E,0䠽➛î;XfS5KvUMMKNg2Fyr^f}& W)/YD +&avr) "I ݋\F&Ar@uV= EtS›R(-~*tQ)KPo)_VBGsp@z^a7pr RiYj1{lʰ<'*d h7d7K@3%Uc..a]uǪ/@\ C~5/P=o#9e2ܲgq T8=`.,{9l:,灒Ę*YVip}Q':CSطv} ȧLxSO~%i~bby4!L[D;ʴya*܅w!NKX5܍GB[/0F(ńTuYX d篶: [d~4JN=!/m!?$:RB-϶ٌw+=3iݝq*-8kJQ*VyMi@OK-l'ܹdƫ0~1t6q=8PDzJUj9-Fé2w)1x񇮧n|_iR> ٣ }w}:99C` J*MZcYI[TWh >杆ȳiYY;vFl8JcF0%ڱyQ W*$ AQ5) ͂QzYec]wɭù'ȄG"Kw Q'9Sc$ fQ0♾eWteN76CZ-mlxnf{'I9$S&TF=aWw΍qyRP,g2Av7]֬6æ᫂s L.q)-, Wѝ+MM!YY?qoOWLl39E~1vۻZ0RR$@-W*!P8|޳ag LSww U+EzISkT16 MeoSۢnzm%a1F L+ $@tfSyS1nYC,}=Қw{Z:/qu{oռ@$辩PJ|OD^$hJfʖRdHʥáv^9/اϊl O*pΎɦJBsl=)u}u@4@%rx;sIIlb/Q"%߷}׽> q j!cN[r+AEvY@A9YS5j6L_%uJ.f\:QZѴ4}gW| h'y禭c+Yz @;ɥ|0|=jFn,uKuPao1Í YˡWϯLbQP_foKACBeUNɠ#=0vA=nٺ~Q ~0<e 0٠r_\ۗѝ'ߨd<A(wt J01SiZNnGE|Yk߭ uaLj@ܛ }2wT7uncm* e6P -2ta 7UUDΟ;1i 'Ǚ[P(4w8٧J]LJ ԲڵrBfozNtG+,&2>vFK:Da +Ffh K k76,_p8'y]0@Ӑ+tD,l[#R}j! Ñv0ʴ39)ju{+79zw¾?XeXR#^7q WYBkZ6{K%ER֣G77s3, bҀ\Ӎ) ATh;DXL`x']Jüf :6hJ?!GZ<%bRڠI?}'ӆu[C䋭Y*Cֹu!Uam?/OPℕ} 4e,0nyy;c6Ҏ{όYhe~>1i}`2nI6K!O펻 >zKվCؓ݅Gu Z*0L OőKZ-G=0v[^>ݟwcjdQ"@ QYb:PEF]1 λPWr,O (n66 JbqGi.]8"(`"6Ze"15HS =/ Dl!n:jX|Ii^/N0x(jPw>ҭZՐtN >]0hߥlU,r`TDyUy7n n gwBXl3}~b 1RYMm(ƨ5yKzz[s2rf1#7K <КSIb̝3Yo2J6AC,<'xkU9lm7|Ab +3=.MS?5a) ӋNMviE佡'89 KvWt^nFB {F ݬ]*%(L=BV'%Ho8 35q$-XF`pt?k饖aH 3CC&TRDb<P(lj,,ݜZQj"WYj4l1g̻a̴AЫ􊍖t(R@1fgUc]\Z+}̟%l+.u뢲`]yZ$^dR9GMF޼)l?cx{pQҜ\n ֎J%Dl'd-{ÈqQh̅AGU~^'FӃбb9vVd5YaQ :E2ҌD ~њ- ?c$O;5x$׀傧$ >旅j"-DuB7,TDHa*:Tw|‡6MrPY#&{Y*OR{d:=޺˰ZG5\|AQڬ`ƞL!TD k9=7+8 txe|t pC,{<~ ߩQD*f]< i-zk=-)Y '%T(s{L_ZtaJ@q'yK.@ xXdM67+8*”U\g*:LFLJ/_^a&n^jL0P [ r5jJGk!om"2UG@<*;:"#V"K}eԓqJo`+yԌ pDW>@M$ݫEEB8% 5,JZΌ9̑旾s3_iawe[0`3.E<չČ d]u^P#;&ȉUOuCۘF G; O3/ΨȨAT*wEKHKLYV #&vQTf j0` $QZTH6 !R$EQ1tR8=I|$4Hh.<i QY1.51m#M= 4Ke#_3;4H%*m2VYxx9\:[XT\K[&dyZ|ۊA" &'^Z![Ky q$k;/;Z22ti(DrWƓ'*eD KINorTI*PʥAb.;sxpvC8wZM߁OB51|/6vQ^& 4e8tebWX!P8BZ,%[4X9a3s +8ByW`Os;jv(AB `UcmK 8Eji[>K9T﷝|{hU‡yN䃋k>kx5$]X9X, A\rl} r.y)R?M{;n2l +n)ccB`Ai=K0dJwFnY m$?ɹFcO| ܮIrW GDn|0Bzᗊms `͡J-HOJ%r557s[>jiҲ Jr,F%րQ}ߌB@Κ "F3)ʎ7 , ⦸Y"xRu)~; Q9D-t y*ÉHu8mAՍbጝ~Nl]S8(`)dFB K}4>p'2 +ZQ 9>=M@~ >Jٺ7w:dsIkh OU%WnHG 1wDdSx/BŲgs0LcXUs+hxa+ >u'w$w1SA 5ʩXv+4sf,QMmSDXiXЇk6d™jt0t@3>fb{0t tui r#Gr7XUuY9k\ّv) KPHX;^k>39$=B^! 9%h,+}q>UtNOps:x3 {m5w_|uz ]VvpKÎ`YpUJ[:фDodTouia_l7_D-Dl(?%B2ϧPh_EL6>r 4ܣ[G6|E#cճ %p1ZA}A&YQ^"z6u-jXU6q/{ !MP7ΧS"a-DzrkzΠiE p!fsj&C_/&s1p_We*C N%~p9_<~8G/]Aʗ]xZ|J$3+Pַ#%bLjaC c8;H6>Y,(bCIkne\E.-l clYҫ:3T/`"phnS<뙮>tw7ryWB} HSQ,,{FSuVGS٘mֲUJo<'f ԑ(F![ ߍ}Fhf`Y#w6 .s(GKbx ovU 3il  ʽ(4"Z#HD+f=tun#> L܇&wS(@=43SHBۙdogUYb,f2i*1dQAje pfJ ! =Q )g}f+) ]E8Cjϼh"Sl'ԆjMͮb3;Rɋ2bK+VD鶯Ԛ_6o.[{,y̩ݱHbIjYq2uś0FiOX] 9g +`IO7x7os3=q6A"KmZgߩ<>yVgFb!gt^/>;8e[rۓ@ ZWI5@ox8|yPV`3"`Q5c/EݰIidddk$ [ lTQ?eKd' wv{x.]|Ps3}v$(Gեzd5k$t/ '^+*yNfa0S0PƏԟ\m $eçj͇}-w;9 U뼭q@[L uޏ ̶q[ܲ%W,nD!WظD]6DIR:ZG; \%g$sjR/-IXK-N"\i8êd|+R/vt@߳8pfPoڭ]}١ו}[/ى=c<лx!o$v)#EI?+63Czt=<z ^U wQhsl P0g5| 20 :I9eA.B<0"GRI/ .Q2-Pʆ}i!MVbosvuk{117/q+P0>O8+F'R0=.Y'?>hoc%7׏Ltn#"L;YZ23Q"~GkpOS}=RhL酬.D*bA gU4$*v-|9Z%ӌ[WsvƦR#-%xetL5/G3{\u&w7;9+^пφH)޹r8Ѽ/VWMCsu ʩ%\sg)C=jn7j-0>D/OIX-ajRLλ@hۿ&Vhw.~` tP8ju"/)EoX75_FD7U(@|E_`gд{y7`p.`O{n 4aIη8fA+"wglͨ5-/~§/%% ,G2ֱr8.L:׎-QWi4ml\+*j@?5ZPw:1z@ݍj G2",jXЈ K?AZUo u[.]D:;P~]F q7-yI`莍VQ cD>c=:l%(Ԋ:9r?7uɱ0\HRHG 6~Ƚv"1P|x6j ^ykO}g"=|w>o Ji?//=:Ū%t|iee*f~ALS-_v.Zťy2(T"P.kly_:6BjpG}w3:³)WA^5/GqMxcyJ}Kڰd 1ZIziKnKgukUHd5hH*i`aAYgY&l+b7g^B;}|U jZӘ{ m?疥wKs8IQ2=L]Y-S6]{1C= ChzbB9[(pϱZZ=4tq% ,H6 2KO  ⠋uϝ O'JCbr &G?#2I0㭣61#k֐GC / Fbo$WwO;5F4nP C䅏VA-jf?~ zGnxi@1^jd88!N͑Ճ\B.Lk;KfCPȀNjf,\fpo8x Mbtg#~Ċ&<1gsHE6r:S%~aKYzvH8GW08$\ uBK38Xx乓_w[ (AhrVLԭgZ(7gyK t!cSWY6a~bspŶ%svE1I`ec :EQKI9bR1VIm$J:^P}e 6aC"l!ph]l73AҜo}PHtyԘT5/hIO+R(w%ۆXCxikE݇hr .gc9 /)@&_26{BHPJ+Mm:6M 0ELn_Z:ܘb #씢SLz0@imp(ƣ!gĀV/r t?7H&Xy*rI<~ ׂ?"?s $ly}`td/ejGIc"BXߊJA\ʬHT[gמ`P36_Ep-R`^B,7 8E 2B:z j&);JZ5t䈅л r*™8B)/]7RqBs9 j*HϞ.Gk̅x =gd$2`U+ObMA$Q6S&{>@ipe@M3e.Ȳ'`ƶ ؓ,U* :W |5F0}F@& 'SvF&,i)!:{Baeo$pp]-2$D c 50w  )r]7҉o`s41ޯq`,^j:'ݽ1Ҥͪu] 0e'5dޚ~sEyTNWA[q-Q _KLÝ7 i\<Hm=Ip}m8{q/ `$g(b8Pmv(֎f핧Nh`Uw"Uf~E ϰ9$1|]2ፅ TrW7J`(Qcv˒Q`-2O n:#ev:3*JOĜȟAG#JX,R;z{u6TUsh'Ϋ{KǾГGtp+*kV>3Q0H 3J}7z>hQlcx.u_QaR-0ir_YVQǘݵ&o\Ź1r 1N)厁(i7*<ˆx!tVaҺL"R>]4|"8v(AUЧ06k}\yU=e FSiecШ+TO~*$cr os8P,K_q*^jT.\vd5F pŞ @5*cĪ ʟQz5kY%Ouyןev\X?p8Bd ]uR,2b,xrX@!cwem)` $Lt~x:&jmmD+d#o˟3zlFC-;?R!6`nTl^)Ez清Į.WujE}4í\e7_Kd!Cyʬ὘Led 2ȶjZuj5<R^iAJ10 Դe']UŬj<dMz><{'eԵsIמDIo,Ξfg}ٰ42g T]jnx cRbKklNfr{O^cZࠤWPZ>4ABd, ~H`}pʃt9;ۊFg*VܳxKT8NYhБ.P3FtߵC\J'0B6VQV'k^#@ҹ"MBƨQܩ˛:~d%]ӐJI@ i >;RU%>W,^n$y{0@@)5uӥqd}U_p@^0`ħ50%[oW_4ii+ߟoBsd@ PBY6ӆm_KuD; a"ëDn,q&>*g/#A{TXC[ߞ6s^f1-MGԽix\GjI;;j`#JGf$Bʘ3 lPQ0d2N% # 흼gb|i _jVacLw誳¼YU1<-Ta iyUZhXEGj #4m.:҉rbB;8I^EOc]K G-ߴ-w#*6_|Pi,w*Ҭ缲V֝ŊGM<{ nAoK}%2=gNx{Bl>AlD:K`@!||D tj&e@8FȉW7#q3=fl' rx[&/Rp9L!u|>htO1OU Nw+`u$RqZ3d'`=EUu)PS2JE>WD=۱Y>S:ZziC!EƖ94vi)M01vw3R i X#IZ8 %ueiqe~>))#Q sa+d8 roQ55h| hUkwlȚp+6iC'MG *W:@Sktχ^52%ǩ^|Ŝw+9^REHTY5Fж_-gT 8 5lEt6WF,p`nʥ ӿj_(ffowM,/|*0O"-̣A Z?$ɴmv\"EOO"S`zIA)ok~?a%x;> Ta*3L ,C2x\QBΥT@; /zMQ"NF]ɮ`hjNbY*9~y̠տG6:k85zuĴF835;j8"q)2ܡhPM!HtpHi74豸tuNra_ʛ~#:)` ]m%a+di c#hÓv?Aa0|^14ich¯BJRffn[ X AY hV@qLBKwg`=\i2e2'&?(.rZROF7TemvU Af`k+pk1PuYE aDfAOfaj,aI3yل"R U ̎l9O)ުcL; 8hjU&^^6yGR|T h'± @(pAj8=fNq)qeM*9 RH 룹%#q9Єg`֌%ŐEb7*oHZT(`ݮ9f:e.y 3Xdă w =.}D& lq\w$TM( Qi5ّ3Г_l;y[FuOo6_>TG@#[uQ'ϊv""]9=H`~sl K7+?X*<buMRͶϠӵ Ӷ9.ˉ$0XuяJ4=8 7LHU᪸x U BtX BgO`fW=$6%,r@]VK9oۉaQpyZy⢥;^eΪE? U,htb=yGCf@6 wJ?ԮW@tV=nDxD-sDM?_[P mKYPyY<=a u%"̀Vض W9y. ӪAe @$&q ; D+1ؿI_/rfJ`#\ᙊ)$@,I\yYPz?׳ x5>.L1r cnYi녔qn Iny/im~77ǵ רF}TN,¶kE& ɜj< vOQ.bq@Y7uɌ"/YYqj}KGDGrvi&3Za.[^v č D 41[݃ "z>M`&$a`&%|Ĩ1y*XVKYJw@.lgV=K/1 ͌.0Xڔ 0<;,mpfUj}wT䯹y afQ^4WDJI=0ole})H5H *M ]9-!!(p#=ckhȁ8D BGEOz0I3mr"̡AnW"Ãmb)T2p ̏ǁ[q7|&h ѦL=ev"YUF<޼n?e6xts`+d}`@rrAfk88^eKZ~`?e*5uV֧F40M)7̨֬\ aW$e:P^Dn|zC)&Jg>{MuH" }*B"noU NP$$~4;lCcqPGbX$†9*C `+hUEtkk,b_6tTUflE ʲC8V{]e1ݪ: 4CT BhHbW-MGOC? V8P((KgNtp=Hf*= A#6f֣"ff )4+1]!-Ӕ~J{ n*iJF[S}Dfn9f/s$  ^;"F]xIg;L+!y *[$ZJ,֒h?/{'[h]F|lЩRoH[ azMt-pV *D~Q2YqkjƿǍ)g 9Nޡ[\m ~˽nލ yUA)~N:@X.^?OCj t]BMgbGGެ2H(.)͙]ggOeYQ$>Qx E_0l]FG6 ܻFn_k)o9|G7W%FT@rII[8ǫD6" M#%h 凉ovqЭҷ[Y}o~іyfQP|H ps2AI4UwunX|6tTGT޹ RږBV?^Siyƿc$7yZ&ks;L7&"="EbAE$1b}MeǬ*11c R= oSDj+>/Xxll!nj%i9kKe;vqFAK+vX+oޜ!{LtJ!v)7R9RFZ~>9mI?0ԭq%{*RB5Wf#^@6>4%wJxI00õ[o$3 Ȣlf95b6".1x|Idv=*e9|APD{9N`({rLgdVj>#sF e 9JVj-cטz aM*vW](/<=GRc1lrƯj# ccWX=7f棰إp4ց/Wlb'[c>2kȡ$HE&K;IxhN9Q9[lr;I}zY!G4v=9c.BC&C6cim308۔cٷ;pPrk7qlʤb`"1!:dhs\ư-ek2$ha!=iPՕJׄS&*]uõucQ*_g(ܑԋ ]!bw,^R(M/MF`̩f5o0dXS.=n{7R5=:-F5(=|BWoqLY!q'A0Ni/ac;8]T4_#B@12GJ- ~Hͧx\?iÈJYDX nYyV{uC'gLn[Qs"\iRoAvHRd1.)A5^G" w3WgFĺhC;9a.e^}$RK2/b _|1[ys_+@3lgB:p?jϾweaTiV(c/Q*gt)C^T^\d^ 3RCGoryVe4ҋʚok,0K^یMo:/c +'J388-:x/j1R)>{ ]e}Ur; .'52!)$cv.sO!k \R`+C[l']80rGrh\ʈ(gVg?mI& uHNY T\\ ,MDКpp]\fc> QL**uq> A/D^??1wSp2D@AIzjo3c0'x\^k&Y#CgUy ƣDG|$܇x7I]αG勺1Kj$]D?MopNs^_S |UAc!E`{i63P|5!qFiߗ]}=L~q-Xvpm'֧jN %9 N8e<vk㵊ww= wOVFjY|;RN<7R5:?wZ$i`NQ :?R5y:}z\JXQ4 ݰ|G3勧 74aU*ge q1ݎUyQO?/ ;v pPR=EEōQݻo.GQ$um~kcR&ɿ7h~0 7_ u^0dɷHgZǝ4^7e4=4oQ?"evћ]`T`cF`1_hx4bPe/V)m!~yQʝAAL9oD]ey7z+`ݐa bε}`HO3obx;ڵ&WlO:xNǸ% ;!$>;Z&(jNoQorjU1/^jnHW~.6ӱ(٠%@)?݆Q.vY2f?xHQ-0oJ8OSK;'ߩӺw\xWb πȪh>wX8OʘV6zHؖ gYъa]G"9Q5'2j!t8ߣ.즞RWJY (޶t'@fre83te(8pȫIӄ燑Sc$P<3$iKjgtDgOHr)3.59&=$\rN)ND"c ͪ]Y6'_ *.Lky' `6ZWmLQ P$ѕ$<ҭLą;'K;etY-ye{?:=cX( Lp,0({1B>CK m:ޯ,؝T }Bh#8͒ D 1Y~3jl eͯUc-:7{2*<lzV"}GP%x&gZ rOrQcMf;[裖~ފVom2z>.r%4ohw5ҭR i6AʣGĆg3*TC;Iȗ?wort&/+]]FyJ$(bAMt \XCaV&C  5NmRQ~lz`^3Q#A -XF~{"@_t$(.;#?蹣sч~SCfpUnm(KG6P  ?:nUuoOpi6c>Ft779neRTaPhJmllc(nQ߸5#HVH<U9ΝS}P h]DH1A tC<׳ޡ B6ٺ!.H9d#՛ sdREIJ>2<~b۱"bc ݕTkj?ʰ.7vwHL$HUU Y gx`Yh9H[4`&F4([ؚj)û2MUN̲5:b[dg/LYuYUr ˦-fG# Xjgf]? MoGUg\t"Psα|jM@{|6+OA!qhITM8A/f4ۢ 210PTV~!4[D]O¯dzn+=-6${_=8`c w,Q TM֌ٷ,臲g \X,IYҵ#L t" vA2 D+ fSq>F= &wI&͘8r* k,zۇgqX't To`> =lIvnMBI4w^(_2&.R@jE`ĝ %yZ\envV1^GTϸar[WYkѰ abYi QCzKTkn82_<؝ G\MBżin8XP,J3ndB=I€!I/M T֋sE?DQ EHWa@tjݿ[cs=*}uj,c͢dpV]8uCB;5+j\,Io ;R' $l6.4| a Cy5\\>ķqf?*=yI1+BfXW6ɅПeK~Oge5\ m[G -j ehgφ[sz'~OX ΗJ*.3Gs@6NbRַ𕅣#^Pb-Fx6bLJtP3>{֕apmvdx\&;HϏ*U-fK::5Y{g'>Z.Ҝ`ԀujDIS7ԎMyQ`8CyR,vӰ|:GF4x.yĹIHkɅ?f=* Ag]x)n}wb2WY]S&b iSX.s5J/EEFfk!+FvMQ|l&+'%Ph,MoCxT%7Gu]pᰡzo!FiP*vXP\1"v:y.: sUbͨU;ư:9ۆg|?$}bq2>ņ3*jXioƗE*T> pȿtV6ɢqX$ o݇b*chO 13\Ai0L'~cCYy}t@DmlDF3X ވapw]|& 8Zg߯N9e4G98T#qui S[%pi* =m[0*T z>T0(3*mhNPw#_ev۵{(9RZg=<{ -0HUaA7V}^y`*s{;k IRrc;[FOcvJy1Hv-nvݟ٤uRרML6wN%h,2I6X_;pHq1$D8&7Ң(JN;?hphTu}ňkH]wv"mAe[:V$:(E +˴-8#^<}nvUj1?V.5.2Qc?d7weg#M*)k= f1[3*e0}.W-{ؑъCZ共E_bGuoiØƗ@ q"-G _bo.7T5c2?Rfܼ|gTꮢwi(txK)G8#TQ@e6<5Vid$J!a:S">čܥ#eXQ jjHUhՄi:f/I_ z(QNf¬k)$) R~׏c'j㼞ݳ%9uN[vgmm=>/.tҪ qmݛ.z\ŬQ۽&B= n&ʗF 篪:2`me [+P5O#H*D?dpֲS|x50,zj} F1\ֈ +5d#~C`Dϟ`$CT=oU CA꘍,54dz!"`6ɌKpt}o!ow`L1t:`*\b b M EobEvNY̩4B;_P&K]DHaWeQ F969W~f#&-q (~vmv>tq8.Fլt+2 lיvJDc:29:VG湂->F}όu+/ŒᫍXD:ڮpO3N"N0Ii35_:5gc7[! ':q9~sdQK((+ɣ7SXʩ1գykWFFp.2D]0{:a4gjoU}5n95o< 'ôxNHvzwgw~W/v)) GE@^h!q7PƃvÑr83l'dP IB;Ɨ!xno{p-ސb;v[ \,~{7|NV d+C݃B9WgQu݋мblKI80V`3ony D,PwRL(OIN,|g,%%ܣtqgw;7!=8ԏr8jݝv;:>}Ni:XK[C9#$ډs)<TC$D]=?Rc@&p&t9,CjM]2LewY5$Y*X5;M;j])AXN)XT/)!f΍̶ZwI e16ܡ!.29͌|]褅Zc /{5:Eei (g {Mz$O:16إ-Kkz9 検mR*8 mDcYQpPH ߛЅ.t*,Yd^ˍ澹/Ն57V=r5x⨥6VsGuN+eˋJ\"Q@C= xy$5p*5P-bKR5u47p A݉ U7Z$9 ._>!'m+s-%*}']΁$vbЖ-,"14HжÌ Jm%b;r*FgZKHt0pZj3Ns[?[=9u[GƏ1%tm2ٯ~JRO?v~hyᵇNI桞5zGtܵ2Pû Ȃr{;&:}N7"vdIЇn4#+= - 5PuT i3|蚝/YE:4g[!H5/ʓ`1jm1H/U &NP%:mpv#;w= ^gvxѩFv)6Buie(<п*}`7݆DzVZDPwsPOE{c9!9k$r{ eUћx7ħ/ q$r>4F#c Z 9-B^*&,4@,G!5-'VΉT UO*# nMzY 6!brВIm(A Zz˄CLj}"*a؞o C-wj!vi%7ua|N26೏"#@bxWebjrE.Ta.ϙX`X~[XV Z~ չ~dy8ۦxekrfuNz_)MUs2JӞI až)~*Up8 ¤ ӕ?6UO,iж$gqw~5NGuϮK-6XɥGdy99@Bw\L! tEӏ]0`%ne FvIiM{w\Ub9eq%CADp02/[lh.qa%@-6u῟uL!ML0꾉 XU,~vF6 #vGm% {Kmr}Q/篺NcS+`F_ yp:Q.UzQDȓ(-]tI)5;Xi[A؊_ ,}Co{5+lSy5r'|G 7BE. S~Eؙ"1i i3j!OzUn*&Ym蚬[,`,K\ !!͇,|9dP @쉷-퇛fX\F&k=)|N9a|.H$[eɬXS)Toh7 e-2 yNV}`K}ceV(}D(^߆"=)*S٫ks )z\?RdB8l_Ksy . ?4\mQ9->^TOZ]rƭR\u؏3O#T Ƿ1 &Z38zzΑ=͂y;Yj- lӋ?-b ʄ 7r>7u%9)IϲˇT&NDR V,Zc¢[2()Ɗ5?,xyWn$iˑ;r_ 5nQ:kis^Ή|8o*lDc4 8D 99eEv{L֮M`.@ pḤ(/|^ 4("pҜVݪBn2Nu/{e_vו;CjUN6%8Hx哤jdysy"7D]KXcGIUG.4E0pڍv`bNnyܙxuG~3LDb_J Uw+ZK4X4؛S8{B(MD⾣NLߌXVqiDSVuO@kM aʌ:/"8j.kvU>J YZ5o*^m f7E ڼm<*s}uTG_ljn@TvF좥]"/~]Qة1CnxciJvJKAuN_)ؙۋ@-J%\K8 ePgP#_bw9f&$4n31^AZ$SvoǹGV:(ε"?+~=qb_/Mjfhľ-& ֎q{ZG+r-BN t/*L3+LF ugvHE)^[T)"N|R2ef6p߹[N`WP6] 0ώΘ`:л\P5w滏řJW7һ 唫27J<tjwj\rӝp*K?Ɣ,RϰϡtB`O:KD.iqB8jVgq h%>N%Lv+)w'NIIvMC;8( eO Kiq.bz #)̢O2n ~6+o bfz𳚼y_:j<2f C~(L|HL3 SMyq% "D6R;pXDA&~703CJS=>!b=ԺlnIqS?;!m&珎ԔI6Sk;ܠ5`V\5C='}`]Kr*AVҷ8ؔqKݿ/IN\^%8O2V)ln)4aAnC<~542?16H'{V z-cD- Q [mkiZ7/lV xH 2wW'Ғ'i&h9O%wnљoס^T]weLT 2e`Omr7_JszY 750CGH!D ?w<b/(ti^4pp#8{i&DPً=jA_u_ ngIi''nTR<8be}T#nKdlC޸O Ұ3l]ED]m|1oO{v#U^3]*l Q8Ń#P^}Dꋗe#4`L=0XۤC\W T`WYTγVk vxN R/O [?!~ċ'R>gs@ۈ%/4I Ke.*sw`-3zGYû j'dt0룰;j )cL?hόc֑AA4n" wEb*0RS0F?9ך/G=Ăū }LW]*CFz:͑1A%f!e3 A:' pΓYSO*mR|JwY{laxб>rNDڑWl^: g<Z?j֠]LPCVJ]>/Ϣ05 ؍hdǹ4 >Ǐ7KXHR R?y ( Ŝt+~DdnϙUe;\(ߖg*-Di.qR[Aj$A]X GG}1P?&$c't*jg]pOoGÎNyQF#һ`GX%z"ĵdDL3y{ŐIl\VmкD@gnq α4yS9C{(?0l\t ٚJ`ةmVas *6je^7nJ ?dnXzaW Fzj?Cd{=NܚP̲-ahlZx_T >zDQN$iy5>Gv ;ƨW~=d9M%>8>| 7dDhп˶NZ'8}!n &_?8A nb3zec6 DpߎX)` xhyzeWtb Tkl%3<RD #1恗; }I0?}Z Cg ZKX!MDpUe@oZhfQ*q֞Qyr Vc!k^_aRڶKҤ>-I!* k2IiEcsk@L_k:,`jRj a2מjPWIZ7Vmyj5@grBeŚ9UVF+PH1]baOsw904U\jﺍJ͵Vv+3(knh YwX9SuS:*rd+WuNy3cT&ji׭巚c3~ڡ6"݊Iԗ7o Y ,!@I$2KLLA&B9aŃ:2h75X=C7T葀?gf?)OZޮݒ\ 8WNf52pE/}Kt &3uB%oHLU)-0GtfL|pΫ?Km|a%`o)"j-%!vRsDYWo}+Zp~(1mAG#E{ɋq۾USŪ ϬìC ˯ibIx *o-G()U˜_6]Th'IQ}1$M$]l>33]׆?"6JENEaQp+A3tjEȡEZ&}ƍaf'ϔ(ud<,qΖ`Fx5ԚcWbR}h_9,Bb޲=s7LϠQ:zk7JOӅ,Xzi% E{+-傟Gge ѯ7(9:<l `jqL)`Սq>2ݖQqm4₎b[$!Fi52 'ՠGkI ;wymPXVNUOG*H!Oe,؋t! H }r ħvkw\ 4̲Eat F+d aORŽV8u45M0Ley *׺mp[lG˳#T,~êcm0!/r@gxߍaYp)gn1Q/ͅg,ĞeD.bඨ3x {*,z1w1S-&}5W䀰{^LYڑHĮ*um6?qF$$NJLVйP/iShݫ],F1-jڐuOojxY{R'W 6&lgVay4;pHU @Pl6$-i x vCȦKᤌN)åu'CѭCe^fh:Zڋd o8}h:~1:sC-aĕЮ#IZe;l L| 8.ף}d 䫣`EjN>mF]xd̜G6Fu$٣6$G<9=r1i-ᘶRn62X9 e]. UDxX̝h/ac0Zv ZZT4ɚRD[tפnv9v7)y\ql1w[gY<午l$9ڪT+dz9H1'r>긍I&/+Wƒx~+k}Ytr\!qnn9AَImB(2 GʦEc!5sHį4)*?ǰswֹWS*tCl{ c<5`%,6:*X`Vwur1%Y˯Eu&fnyݤ%[I81B7PM׽P iy<ke An(͂ r&4ڜ =\kGZC ɜؚ7w?Җ6סt[nM6@GOSݪB_@Ѻ i;D2g(VAY`!xի"`Tare Sn(buOXLCmCyL)B̨x*İ5 $^Q=G \= Q+| Rˎa3="H~sQaw7BaM(Cu6\s)V.$@fYC[mBY10Tڶ8w|)}܂Ġ<9\  YmgZ4kKj[p4Ӓ2ّk`|p.]~rUzol_hxSJImoK H(Os?1”Ix]鼞rd pA,SKN&Q/<ܣҖ`l횚o`_%vk&nEIRrـt)6'%# ѿrɶ4((д@ wPg7)yQFLh!yĬ=ۇ'Rce$+ 2˒];+g |l$夫C-f! YLHke{17R#A_@.ou֫oc&jɄi%Aҹy-\2{ju^M:&:Z"oE=8izFݧyot3&'d#D:>g)BͰDTfpN_AIQw'cB9J ;:{3NŒY$wTP5J c7(\_@!AfRc#P3S4liFZa{۵9;z0 #DT"r I-D1/vfa{?ksA7jaV|f 9+Nhe$6BډT:wY̆&F/DOh#_ہU?WÄ¥ral"n#=$t>F%Fg!r\ClE 'G1kCA7`Q5AOxt8OX4#I"~LeDxeW=3;:lT5\uNND KW@g7n%Z](i-ߵRlۂ.џ! 9x_4cS)VO${bw ->IT샶5lDyCrvlG,6OA_ՓYan 0M;8:1\2ׂ*; .TMC6gՈy1 x2oxV#^gQ\*'_\$s4^ay.9ra@yaPwT~ħz=~Hp.2Bg*59Nj`UZ!g_EaqwɠDxgœ. OCz,gG _kE1/HLk|@?| `EvZzf]`*ht笍[`IRb:i!X?m_o.KaqvJ7=]-]M{}L YL9Rnc~=92I ZeLC}~q5z?_;j;BapX$^y0 C$t,'m6ZW H1rކ:Э=_q"3ԍX5}/ѰGt=#ü#׷t_5r4Y5Oh|ަZB=ctu5P0{sK-TxqF,CjSB鶯۾?ϥcB 'ˍzT}m#ƺA@^|k|z? )eN (r~m!p&.ϋ=+riߍj2@:F3jEV*1iA9@bE1(^yNݘhQ4 |5wDBUZW`8%xշx_|]qgaLp<+obuAOfr?~*|v'A #)EuS3c%l֕Ҟ׭|ᨳ2C>6\^MiC0Lf/n`뾯(G{,uyL70[Fa]yؾ:-T^Y$#tE_tP$Ѡ c kO`0N 5G R]LxT A^*ƃ 1b$sEja(>֫1oeh|CgfdWɯ7\T`V SƓl-za~r6c39F"&Xs\+m;]U7eZq96!_j a?v Uze9S *uZY sj"!%8}hdf^վB_vV) 7fc!5ۆ9<"g eU*vd#hn}؀osXCb-S.ŷ`xghJjf̲]12< U0ݕ6?4;Ws?\Gՠsky.qhqw0wp?NS^X0<(]&J G> ur׈|4 >,IRdߟs0JBō {KA^b kRR=t$Y,4~.q܂Rs]q !$y1+h OH(GsnĦ)+U(˗b:CZߚ׺MFm){ފ}MbclrqʃO;\<] . f3)44*6F҇w>J)q+yXkVKJP+]*F ӫP]01eSSdZe !<@@z%`❤5@NۭA&*-N\jZ x24a9L eW{?3hDƜwᡆTxk!LX Oqem!x<4f p2H«MLt?kv̄ 0?(=vDJbz{h]& [~բmVsAw7_F_.YRZZQp`-ϢCOw% bA3 qb !VըrWRO?Z Gyl4G' cl8j[~g7S}zw&L# oUn?`WǿBB0:1Q'CUuVg~SߚkD('G]oGKrcR੗!Jxv\>ފ!h|kT왾!\e}Zt %E`-@e1JWx1 \A/6@啯P'*j.7jf@-T׋;s?Jǂ( "o.IM-6k m]| \ V'IU)"I~/TV6+,wGԅcdJ@/!7( X""EbMO[Qؠ"&ƄJŘZsuC-$y:1u}o/T!Prl-X CːN (z緣)%Cz$.b>*3aS}4%)e{;zοd( f'tr1@BCt/\duIQ+\lO O-AlkGH\y hgN٠ ў>~/R# K[zBfIK[dGJ~8"b%6'maeh_{E"MspRlAOddW%^OAtPn֌qj5vCTc[146z8NEZYDV}:A[7ބIessL(4I2rt eVQnv oBb9ئO/y4~[.>rE}ޓE"iZ}h]7IU.L |j=tǮ;/s 5`xhTF ]p SB7YDn):ʼn8#m6 [zc//#?z4\*طs;V¥:Z>i/d@t/,CLl۳}CH{{V i}qe/ @'iw#Um(|R<tiJHU $Hܪ`CcD~4e4WDZ3L_FW$ySGM%gDZՄΑA-7*;}[A{WrIBMLM煓뤄-+Zm5-,)\:h &B0`]\BAZnM(`WU~P(.=,fƳve9-P<^#Sq+nn[Q>H:U 7Bt=Y92;08u 4f29fw|1I [>dq"e T kX gnmlb}i߁%AAjjx]v/iE^0#E?6GWʤI2@.++;וg;[XF_A$gq;$V> Uyt Z.RRltkΐ|@Z4$^~6}!*1=:MSЖ?V)HU ة4F cÆM9P]O?gr֩S:|H"?N2䈂!T)g\6N~ y]eiQGjd0-ǶB =aC'PG"B(7bX;p73;1Zq,N \#Lm1F*FHVf`3b)>یj8[Nᐣ/E'ȷ31D:Y.|*Lۄ|iUݛ7ͦ7"rFI6BFrfa@aDe~a87rPICH&sw]oތ8,T_VƂdX Jx)i#(xJģY:qm/"w~`˸7n:JY>JUCDC+m(ta K_?J&Q9}]H>iKT-Ԙ:-p~'s;(TeL:))Y`U8 X\kNw  2#j2Ӳ I F5NwOrJm̈́~QqJdVG( \OcJLڽ%+ѻ^`_\(=;Eg#O>ؒ('l%n8e\ &dpm("Y]P}8l:\?E2o)%QwLHkGПdcq\x=U_Op% ls5nVGd;53,&9\i (%.;& .X֪ʹ*lDf &׊F5ɚV7HȻ80qeO,Vҩ?Ey ~8$ER`jëA8]CXe&Z(}&ʼn0DRm wc|]FU7Y+'o"ptNgsHVj)e`1î80.3T4*5G8*LAP!fK{Sɩ㕴'GGU @Q=R mC1^G30\nB%27͛crS1M^-&\yܺIS=J{Т}$pK{?`%bhN/Վ58&q [usTlFtM}-U :p-bJ`p. U@wyzP8lfNͅ 3K۾3Q`TZ)O0M .C<+FEVٞϡSDa!EPeN뚷rJSmL<x&t4DD,=?6 T^5 v)z; bsC<QD1W O8tOwyQP~ SI>8%C^]_쩬fGc4$}т}f g+d;׽xR /ٝ0"j2L:7sŊ@f)uФ\M H{QPJ:z )I+)` *@ӹ>Cqũ؊\鉦7+԰OU g֤UEUG~髤'nə1ΈIڙs U0~% }@#+g InPZϔc6f-Bl-h0CJT-ڵJ\j{K+hy3>C>YRK:v_v_Wτspm'$oO=-uO' FF#vσEMJr,qr涰e'+DTRfY<٣gU"\\,t>[uTYdBx)\"NoؿUnѯ7~c96D?)jYu&=ќ+Tׅ 4[(I8xf۰L$_ "Y655vxy|LIW\ܽ*%}^h<+&^WM]靲3 uMK@2)w%\8" !߶~iNŃVq [+ٛzJ3&,SY^'Z-:3ݪE4xRCHiQ/ćSv,i@H. (jd@?NeGR~26%G@t{e:'⌬’){:=Fu;^EV>eG3!՛Y*DΟ0a ղ* dwR?ע`h|a@h<+ɏ|kWO^_@a2+w|Nݴa4#4+ +iݘd*e/D6@ˢO6dbyxHE]/|)468VOLdU]MVWXmD|!dQJ`',j0>)L34O}@0Z)@tљmf(VɊ1ybzj9˙VO(]֊əeǰJ`2ssiihƋƒOڳ=X YN"w\9`%VXv|V6w7œrƠ^ ދ]TcUD2Ѱ!g 9C1UV`v˸K\$yZ˧uVy邐? ’rxĤdF/'5=fA =Su3['݂B$NrsKhTݕC <[/0W6}.VoSf* c俄`sXear>/ h#]oXƝΕ֡ޑGtzP~huכO@SݡU#.r q|E/㛆+ !on3^5̎V2mCyypk}l 67,<9yg"\ K)b. ș.HPbܙƟ6{iQؑyί(5ИqU4]h β҄9,1#| xuqKޠ(QO'sEEzk"$|뵋C5RJ z u%)YCQ9?~zL'7fQHd+W,nT@*ЦQ@ }[EX>ҊY$YaȬ9QDT\; q[;FBv]  UZs#7*"xX=ndK 8#+pәu-vC;WSũ?"2EB;GW>k׈!2^s2;PܗCE+Nek}Sr=-4B4۳: RS.͡ su_`%( [U:_Zd8b+%N3u: MYքHmsO>}2=6 ɫ@#)yO,!q KS<\J !$NĬsLB[)[N}!N$_蚑ktz{2S6RQ^W7K+tL\qIw.ᤘ،NO$(7_70a21y3zg鏅|IM, R^{pKT Pzjn9* jcnZa]+o:HW`(볟Hv95-wz4$ ep{} ٝﰚ\TgLŠ^L")մGPp8iքk~Ո LE)`,tow`[1ɀ5hGo8‚dmm \w\r{(b1KRF1f: laKΧO ĮXl,Dos0,,NU":a`G&9klRD J6^&vؤPCXWh6MhW~"-4O7ra#q2Ir)˜1Ipy!u'FeDWH5x=Xn2 5 CY|)P'rF} vu> щRL< " XU{_iy:L@`01 nvW&+ᎣWG 4D;}Vl+p"{@zx Mn+ JFRL DSOPjVZwA3le^[fI_տIf \ٚY`+(k'*Ot)Ñ Jd w뒶 @~ n^P-ϛJ9﵌ M=#%Σlq{E#R7$j~#\{l܂q/$ ϟ`NƶL_9e?xԦ+d2D/Zl]l Ѣ*g6C}&99ć8?[#VlYq4Rk&-#9~d.AVأh@F{ |~+q= >`_G.H4X9@6^o+NT kΉER¶"zߣ'r x#P.rwC#Gpu[wSΖ \Pi[0=QǝKV Ǹx4Ba )ӿNUH.p Ա:> 5'G4[sYÖjHaJ[.4$E1Wvj'ę1|[rxb/g*' ە6\YK[|P ;nq,k􍡋Q27p5l|[ V}ٝh֍:M ˫e:*',gn&?Iu!s[1-],f1.bO ڋy㬤WNDqv>7tVnŮj|qVשr%oaiv:]12]7QfR pFkLr[R}ve ƛT6 MC53!ON-]yk yݐ/8UO cbխmudkbhG%W<.*.怵8P|9Dy;8sVvF_kxP{ %$}w=1Sf7}2l͸`J|#/kUZt}mT2ZZ1uE\5v:ߎa{}Ai@z&&^0(~̹ELNL[?vYs;2w_- .'m$4BOAb: nX${2g xx$zmYXK?GOa{,1ܡxQף!ro]3Dbd}jaެ+T, )JpD! W&Z1<˿I$ִڛVWFL J=KPs,Ȉ=pʂf7|[~R7nq, ?R{iUHLm_8őU3u)bz$*?Qlh^w.0z]k{cߡ muwҸIH=@c0، *6ۦ<5OfdC䵙 BtI|M<~QҼTUnNSū=9WfEU݄B{񝙘uk_CL#|FhELmbRxWI=# njhq^7_[+s`iaXN[ބ2vh[O7@"SAk`) <W]w!"r]eBh@PpOy& Qމ +e2U/MJtp'᳆8MG\K!ˏ6'$G $A!ZciJ{ސ\ANKkf9ة#r;J̞AMgj,t(gA(U QXC㪙 ~sϰ5 ,Dcmsοu^_ANaȋ˶u:{"v4OD>dR9 .)9#ŒT:ktjM)u9K6'o=8- ݋k Ma5Y}{1Ֆ[ƆOX@&7Ss׻P=L9bL@n0+U(21bDkuNŶ\DY\y,sSFI4 cRy5sXeW2ms 䦫Dž@r1KH|EVɁkJ/=( hoުj݅A%xFŽZ&|bPQ?;;.Y7.F_q6ktFa3e];,;ؗNf/6*빠p :sF&q$bïwܧORTV)/699L+PUw~ju6{ݕ}6:hypmL0Jvַ,P#jH;󂦿N)2ςLZF=j~9 b;藣@Lp:@-2bR^р(?6և=m[L};c]Xzvik"®;J !5r؏=GD+ID-l@`Sꝺ]`GR;J mxx@ PyK4ׁi3nQ4 2YX[A Cڎ {&O6/JϜ8wFsҰ`phMu̺6˨d沇Q6vieĎ1팔" Y.5/Tٓ 3|WHjH'eAP5G8$m;"|4cng|<|+OFPZEXvݚRx@'/(?i#!S<J9AYAIamf/PQK ^ ʘu\1Y uX+B/9_f"tky쏒w+@EH7(ųLOg˶ ze&B]JcbM!@`Df " C7ņ\Z+kDJ26I\cyQUQ]biz0'6sI51&UVͿ3cZRO7-`S|<)xX&,P .O@W1ۛȊgMۏY۔W#4uY%ĔooU^{(T\YGHMu+ e[Ƭf.qKsԄ+ixPZ,hE.A黰*1Ϙcyҷۓ9o kƧ/v$X`^PP0gy.*}JOh'Jݞ,jpw,Y t@b2Ό\~Lna[wkF{S9+:߻w&6o0XrTtt!Cl\zd0׽.*TiQAW:GWFp*;B;-i4pMJmx=ʵdݯfs* 썻a%1wq+^y)Nàj}Zd/|Gfp91<0S _;TۻkgA4C?nM+P76#:?uF)p|(7e}>0 6Uh&w+SvK^`"q ~-:DzirP#7T2?t"¥|WQFa"ˈs]%U^dtƿ 3AƎnxiPw-i~zɋEe(jshk_A[(:`V<148Ļ;%tܬʨ6M<2yov惟݂nB ӡf'u g>ؼQwV˫cL\eMTs>^x0) U8c~<(NZaIipFh3<)F{țGf(1qC,ú =S/҆G`%{c<4_l`j) ~%Qq{ߐh`/Ȟ2<ܠR r9c:ɰެ~t0NX$][]NɟjXsূ Xe2$ bt6`bcx3DvzE[XC:xEmGoȿϢ=| S18uK6]P#oAeˏ)Fw|MU[" !X8k6UP*,Ph_a `-& ;Ly^'unn?k|OVVZ uV:#{,S](kWǯsG48ABF6f%"qpaPC,,K$5F?P/r)mFS+,I'4\}R[Ԍnr岜e)iܔWW@W@Z )d^YmS|0&u%W 4lw-&qˈVxD9e90.pAs.Tw(h" 0*ĉZ;m{O~ ["ޚyJݞ.ޒDl8B[PR(XsHتJM3V4۞Xԏujb`uBuXjI^ &@+%OY󎢗G#YO#J1%Ļb@Tv@჆<\߱f+5U#+\>0Mv+qcRƅd7F=\D&%D qzb Ǧ UxH`g1'NuI&\ njljjnZTV*I͢CkI4ZeTXI _*u -JaX;XH\(,!%["t f̿kNݰU_$5=ɶh%r|yCGVW0S}>k/thFD>_E'я>\=z>%pmsatͯЂ_4 PNcv߹R_P`+sR~41G\y1re)}+L)K $m!+g]0:rcM*FirMu<Ƕ6Dd$vl,vnSMA;!A 4ݡz9b4psL,޸h읪xA1<*;ZZ{UvR~k5U9)dž;.5KnTYlWdr@Z7>0`YVg%y064 OLj $ m5E凄 [GB_&xdix,v z*ifhn$pz].r! ~p*DST58+Nn7S̗q9Yre3 ˫0τw&UPAU`YgpflJq~r2B$7%JE^ V8 k#q`HE1gl$կ !d/ML63)צ4n4ttPH"mă\w-f5ϓE Úоha.,RW PqC#'F.iւD43KX rHu5R͹sG-f@~JJtfgF#)hUJԍ߸Y=2K!3g9% 2BJA'g{Η'52 ^NԛRUK>i`]kP[5,\SV@!+'{rt)ng\¤^ev tU7fvjQb`w!mA:PHD AS2`3~<X1ds)WF<(Bb z`@.`QMͱEGI! }T`R@`?g z}G>Q4I<\հӣId=#mB>1cnf˸h`7lJ_zG-Y{TkF'[>>m؛4+ұc3Ȗ˶W 9k<+l!ԐB [Q-zCՔ8} WdR-j##;:~cDm;@IY%ۂp{ßNT-w~JJ%<UKB~V3 ,΃g d]4_;k`6KeAتǪT ŢJkުKa+㔘{#ZgtL…bDMD>S%|'<8b.fA3I~wn=|.]+Jo^LvUL(yW#;,K=d- @ 7=<$,RCk^[lF+bUoۙɟNXWPwX~MS4 %)[?2/9@$hHhZ ǏX/'VfN,0~,5p/S+uVʟ`U\)E98ʻq fmH7p%'ƉzqڞeQ9"4vЁj@>M1&VbѴw<O}VYUBz&R S^#)[ 5՗ȁv qLjYp["~aj ;@~ڄtg"'_:Ձ#"qNaHvߖXC >sZ](_//I\9Z*Ugq3P>J`"qkEw>g .C'cipXng: 8;!lXoK~K0 o{c8ԠsX)sL`k`s2bz*qG(&,zTҾggc$Rlt'%3yrm`^&Yty-j,/3TX9K @\)S> KPP!DzlJiq0"=l<2b6 B0!0#Xgޤ#"QAK5^`)@lII. W߭6Bː"KkbQ4՛?HKrurt;yL)\`꟬%KlH9`eQ#?<;ӖfQ G;DoyyI*5Hjpcp YwDVw3QԈp3?ZnY8ӨvT#H(Myr:dk0fV9Se1eӕeʮ >"=_W ւ>L#E P ԑo}O+`c3Xݽu# Cl0C Z~(j7n_IC9m^-5}(*ԅZ67j$8L^F%4! 45Rsп'2+6Nh7+ pAXRz)4W54>)keS]XsR}Aemxff-; 3I<|@(ʦr rNi<3'v B3z~%@Wl0l.k*Xk)*4H~,,odlm|ֱ#HB0{J/rą5.T^DDCab,Vo3ޝ ̱IbIVLlb (+NkA]KJ\~/ I9g <eNhZ^*-J7׎j8@*aӤ-(9f* RB VH'@y^sB < טbR?Bw0M- #oNP*_}_b0%Dž\|v!aAJAQH|uk윶?[+żZ'Ӽ7ĉ.gI>݂^/kS`mrHXKZՊx:ɼ-nQźv3eJj!,};#[xoCVyv=mӚaZhisftnhLKSlShqEEE4Fn,qK{\sO/ Jah5v46@K-:s5|'GbuԈv$Vhs,{ n:!9q$gi%V+]_sGyHzo߆[d/RyHJ5 T,M>˜[&6~)A#5ؤr}|#i- p>SE$PGqwZ% CgCs"uS2w/0[2e6eiލ(?յ]"IZpD b.et畚e_pG708^v1k`ܽA±ZCdrϕKYՅm=Dk-]WwPTvx[kcz,glM b^!NUEQp_֥$zPP^kX ;z3TČ@VUg514 rU !s$7? ^տC(`4$s1[L:&j[7@d[u>O U,Lo[=BBYD0.WBHcr0HkpTbCkG𔨞➳Zhփ>ᨂYif "\q+ݧ?1:*iRR$Q4w0/@"ɮz!"ᏚQI]yTx]ez0T`1D*$6Ⱥ$ar6KƢMO|mC-ϟ!YZN㗝[2 aȬ]U]FORQ 0;Lpmwe,3Q7Ҝuj`:A-fBc MC̊_CjڜD#Ⱦv$. rY,as0&ܣAarQMvZ2](;+m"A`ZA6Et,~;]]&{vPr(u ]7hJ+1aj <*P98Xg ZDu &A>&@·ӅԇI E]륐UB*}e{1vpD9Ϧ:c_`Py4'!厑GohT(VVN{_:!n:L)5/Em %kn(lCe#Xp̤lRUnHF` 5w.5;|ė ^JhqgDmv/朼6%P*sL]>ĜQPEfwdGG@u]!WЛ hSyjdq~shd n5 5GhHr*K,Sd8w%i`1<oXsMXZIr%.*hÑ`y U3XXHɛmAp웥cnb%s;g-D$P:nO OA mC0Q9QYCiT$k6|vKH2ͯ7$*"qR_ \{3CQhәȄmn̈nŽ[o7p߉<{ :F4/S1.wYb:4# _>yHs@[VSۈDU7 xfC:IB?K|uҏdV0EșE8f7Fs%&$'X1PS$ Obxȧ\28qh=B2gK$ZDZSt(`P1ڋWHRQ7(}KkzEPT}Z@U0CCX"y,U`E#4L,Iȃ`\;T]F2H v@T]エ0 w31s;X (dW]$s_&ZB\[a/.A5U$,\X6Gs =)`ef P:ZQ"B$BH ަYU~vQVAӒsP : W_/ bEhr#ڿeZקx_>JI ]4=zGa:^ N8sR4bh{vwT.N$C^WuQ}NpfD _]~,]<3j6trefjsbkT!ΐ'cԏa@I ۻٌ̞pQL!ZvsLg#w@Oӑk'Ntz(F8>sMi#hnv_946͓M:r)f}up2)\"} w_ g I`@ϊ#}ڟ %*!>m] cld< h7 b▯޴ +H'ӡj'Pu՜|dE&k$ُT ؜ HS`׶^k>D|ݤ[gr8{r-ݳ^J2F8$̶;϶7Wor]JCVϨ|j[R|)ہ{Unr揝9 sB*ҡ5f$H+8B?7q;?"223*7L[p=,p ݟּu p8UׇSco`YpS7tQ)dd^)kKaPsJn#<]G Hb`Ŝ{c8:{UxP܅xʚ|F>^!(?qG[lɪwmާ-JGmgI(pǺZ`,@DI«6Ś-r_R0:A x˼%j0.|=vNq)*Թ}xNci0jWmr &/nXʳ;c]P0ɧ:uZ떈q9cϭ`̳ܶgG̗Ws}KY[ r6ˑڲŕRh%v2!ݳ.z97itZ2d-B$e f,''cC8&SSJ SP+8}"| dIQGڞNK[(k ađk; /ttp2sERskT ,ο8i"ABAL- YOyZ˂o}C`Qx6}pYIcgצO`RyRyb| frm#"5(ߦI>'Wa\6Mb_VkLS@P Wx0u7D)tfVH-q9-lkC_,a0k^D)J{iz=h]&raφLɏ%6dZ(|EPW)t53~hKs#=rX*E齾0F) DGcj2˱рG iل)ND0h0x2)oRZb늻"l'sP _ ր` gڻ`BXz+ m|{(i%${z P?#\i$\$3_ ^[lN Vr#|@wf Z3FInd3o5vB ;nE- ll$jA<񝖐m"^ SݏwtEQZwrؗ+l8m0eBIXB♚GÕM? @06< -)$H9g;uHqn.J 2C'Мl=݉ <)Կ̀ͅp.J}hxp]ZC>׉Fdߓ)ʰrTFZ_9&1z Ai9ie5.DYҎ$YmFӢdDK ,#'F2~بe 1V%5=<)Р3 pcG\UZ\O [\ZcUX6.YB'zh° @:xn]4& 45)؀SSx*)NLx̍fPw֘oǢ`aҼpF&2ӭN#I&x\ f}„rs2D a3=x> <z[*ye+hl#E)[v!Iҡ?\FZN"~f1^00;`@l>v>J`t^ںd_䯐 QF]:8u@ jn= !"[42W +&!zh5)lAkRtr=,P)XVq"O7ՐGvRoYsfA޷Gk/P4#Ȅ&Hs mEFެr5lt˧.f5>S276.>LAlbׄYRaLaI|Z 4..jf9蓼̮P 6m ȝq ;Y-mG=>wxWiGE-K,r(Dl Q:a-(X=4} Ŭ`>OJS$ o%en@aENc,L5콀Uxi8B$@E'4.S;eBhXƀt&Cu`L Z5$2;^ʍ邊(xYq[ 96R3SfƂ(R\rV>u97T$ږv.'8cleΕFv((?0z$fZd񆧴8_nx'.,>;,,AݏT*/di{-&wpڳCZ|ݢ[^?n^3j2`)tIQ}Dsw^۞!A Q3(su9˗6ÄR- PAq[SPv8Fp:&ciHx@oUC4:v}h]sR?5pl&%HuиDKEG(FR:=Xqnp]$7pnbC?ߗ꽟IoHk O%׵+`&>fdWJ 8J>#_>.WB(p m6UdM\^ě$|  U 5Wz'& ~,{ClV&-Or_N*K#)= y wcQ'uvZ?7%fs!51}|Ʃݚ#ķϲ|q%xF)|u7Tr~ʸnܫ9w70.~\ǰ r](|+Ƹn81 ʅ)Z1<9m3I$qeMpv5"J) j~!]uIX ؃;YbvJ[~)`7nI9/0L-dK;Mx3qܹ|j:DZ:GT{Κ.!7'RY r8Uм˕_6GؑXjLgk)BKc0Xn0ʣ zVQTZrQו΀3wY Ot{6ߎ_Pczxχ3Mvr#.uz7}A۹&LgNWcVsrڈAe6XXbtk7 dkSoBW fFdžFmwS`ti#q,Pz~njKGoWo4յ^v(q+f")kq,*C>怞$KV ?\'giQ5@ػgCvɺ 8&ʤDLgk3$n6vVumvRa-) d5[L㛥f2%r\[VJ&+VA "rZ n@AS_٦p]Û3C̸<-D@qbC[<fOMBSp,f)pE~\j5>bY^Doamw'/(jjPK ԛEM"+S1Ӄ&@ zD;Ex"#yFfUs`P\>1^& ¼Ρw ?&_DT#]t[t!rPѬ@f%I=7 \%4$sDW"{5e3YaomyCjEѽ~Z CW !P ZI`,~QߖMfhhPf6GuH/^)<LebMb@׼-6'!Ŕ"\0*CϤ \d%pIdu9rW>|-Ų/̊jP#fe->,]j$$\E/sU .:W{}Fn`R{vې?*`vSpĻ:Km+),K5|qL;qO-qOT stS4$Q/1J HU${FFg﬜-rs,Qt 40so6V<`N?pV:<V@A.Ak!`[ryi DBK?)< 3-eR~H\ÿ%z Eiiщ<'E"rQLK{ sW8y+ZmKXjdN6JRc CmTn!VIW%?G.EH0^&|!L G:̬˓3AN t9 U"/.܁QʣRjoH0Z]]j Y91PZfZ8UWtHy]yS LZa<I-CFb!bG_;n˽UsBջu}^7"aQf,ScǁY(_Ym#*c+R0 oj&1 鏭9tt7F+\VV0LJ֓%O An@YP_k GhԛRĕ]8sts)&,v/Dhj?wVD-g@cg1oٯHQ;L^9_S 8T9Ҹ9;Q ѐ1d+QDCncdm,U&L}􅪖EֲW0kew.PM@be4f`\n7+ N+ui. @M[2&Bu[ԛsXz.[],dVO,*Y|tnsHPcW$rT -:=fbh&,9|lxQE"%WFg'ԀJ#o`2L|lOLJ q3E!qdAAb@KwզM5#x%9’?ğu(DêJ^=˭i(Bv_,]}lXdȘmZCo|RQCZM ZVa2*}ͭXM2La4_-RKƒƤ$,3Md_A~(m \AzMϫtp 8@D7۷dD(2wg&*b<{TgBdfم5{饼^*%~ Nf$uߗQP)M$}|s!˅vv2_Z_N[txb lC: z|[k:Tk*EŁWmKߊ|uPH2Bw-2[js1{ 7m."<^}ǘY8Bh9TĠxeGsYayY, ֌;':/ZWhIa7:Lu2 xJ$|8%{ց 8ӱҨKS!]žeotq `!7)@ !,j>ߏO6^&bVi6{RU!h$ks!Qݿ{۵."EK97V}E16dE+S o&C v^sr e'BF?PZ PiYg<}gfYqK;6^֪ȣq;Oc΋8Hh)纠u}gK*AA.3{xPegc&xFA2)௓20a!k 5ТS})&^BM]O=(8Z9pV kh@<?;ήb zxwÕ+sگB6i.EH:z۸zoa+=Yk')Q^C˭`K':Nxt!6Q7?̸HL7@"рRP\ʝvKi *1{U_WK~C7$ c_dUz.Hrd>& )ym%XqQHm#UXmh."_#b ?WI(Ϣ{˨H>27tI[r4}"Sd#pgg~oa}]4+R#'Im4H|]6 >>4>5Cp؈'T#Q}bX(>M~F׼66y|z!l9cw9B= pOA9Rc6 ְ뿻=+' Atw -(FYvnOMf2Xg虧biK~2sJͤFEPb"Gъq sT2Ѧc24N+UP"Rs_ϫ11'g%iJ%wu n!NEy"MWq0q: m%J/<'ԂWL<nQfc)+0B[':4|Lq[,Q/TDΪ&ED˪"ٌH#R%EU35 ­gO *߱o15._oԥH pGzs l [=M?ʶjiDo&f7qg0p4JOav1Ix@2GKu;=F9Zx$<0lD8tATn+`/RO--q`N8 BNa͹y%uX?ZҜ)0zVКkaq0?:g!]1lj@G],4x)957F{ߵ='l_DGRd̸/ PE ,@VhJ.aWn ]$nrC6CPdh4@ K/6 QYׁeQjP) _0q OpD e"_X0PlH2F4D0%k- &I1Nnڽ|y-ulQ,8jCƝl餿Y,vB|[TMcQ=/zO~(xKu`'GC@T;^yIZOln "gʘ gȘ~$,%^}K"Õr5ACKFDϻ4&~G{M8uvL4'\> x"sQ-c |w`c2 ƞ)&E8bXҊ ?~?RqzLx6 4j ֘>gp+׍h{&=뵋Q}ε n~Wk0'Ѷzݛ;g\V=Z07 \+{e*N}"ĩPM6pB[ %;lk Zb05Q`ue9,(f,aw? / y|er?EB^iD흊e,d1:GQ[A)/#3N$R.`G5~TϔG߶g0{H^My+M~06;qkH:oq0MI{'%xků*}F%&S(P {h cX0.٪jޅcMs-B¼L. ߃3&U%ֺo}XwBz{/}:I &Y,^*s4Q'wp@-kE3' tKʹmI`&Ӓw$'뇆#,0x|#{ۀqq`5iʓ *KUUM,Oaq^IcިءZՎ8^[)㪅DaOp|`,ZffVgL[ѲK]'aTTryzF%1(OǢ-Ay;h?QkYur"6ʴ9jf)$Iewf~ݚ.\Fmf|8L<_*Pu/Ār`#Jļ3 tG[T#Buͦ* n6Xn7;z|8?C8[0  2j.%5:d:gTf b J"9P ~0k ά!X6Iһ(!5; h"ɊX!)Q=:!3CHXu⺏զR WKCC'y?$]3~!:6w1z5[P npFw_K@g/Htr]9b +a# wLv\lpJ79 #e UBa=VT3˵6=1+r[LTq,B&bۄ ;Ce }䮊bj*_ J|B6য়X:c}Y8@TRpd l6ac9d+؛ǂhi)&^pzM U+i{ ;ݷ62be)2|&.I[y0s2pjB/6 yVO"-P ];RH@D64:x7GE4$^& 1Q&6ew#.+:]o(|O,MO[!Jf?o^3F.MÚyH: ~la㋙Pu(Y *ﺲ߮ ˉEj: i/vH~:G<ǻ9 2݀S2c}z,*j"tS%qSCgesrBrXM 4ҽ ^uXj_czP'$!6eD=7"<OIxZ. ހZ=I[='+f6]E5XO@F_  \fGɒ酪#X%|)FsE>>U0|w+qSkȧ˘15

0-#S)w~m4,,B8>PB&;qbc.wM:hK"]dt!p*w$o ^HdT $8C4&uX]y@j+Ԕ)i?F;v! QjpSq/3ƳJrI㐛| "=_56+i;$m*D s-Q]fcIFAvu\B5OA}2BjJ9lo3s3U\ԃt T+j .yC'^BW{+j /[Ւx4T3quFWSxqx14aB z Chx}(~ +1r0 wi yp1ދw/+ȍ7%&=DB! znSKrh ЋQǟF{564]tاǝE[Jjߕ*Bw)>,chPa(9rZ$c++J?“͗b?SӜ:eE n':F53eF$BU` 3Lۊ(ƮR$}w h~mZ+PL}Čx.I.}}&^Z[h, ֚/_}D|BMW"&\ nB;F浜+Bg2wan~$9<7(ImX7aBxw`třGATP $lp%Vzeɾ*="F!oo'{dV?Ȭs-&3BG9"iLcvܵvmr?< C*6Q;LWUcݢ4h(\.9udfhQ] djUOWj N E[  }U~eW5ѫ3l@ /CfR55c`<dn,WjۙXB+"2L$rf䛲mn,m٥SO5Ň"1TKe7U?0Dȥ8fz׳mG 嗹VH'JoO^A($ (? 1`E.c$zl#/*Rl5;DVq9qK)hMo@K 0MzC6M ajb)7m:T]xvO4BrҰ.4fr{ @-1|,0Ɛ3so;oc! )}ӉZKK@7ڥb4)?a߰].LL-sorəKt}߀T R{$,yo RJ~T6.ǴqϝHGGطdx6Gs5Y;>87%wxǸe4OA͂2~6x#B+ <e5Qhdr}7|FB24WʂJ<.Q^C{[><l9{QLb:$"p5YrLti5{ u==ⵆ5~s ujv82 =ߏڮR᯦fc>v>kԩ!ؑկ$W!Y L`h3" |ru9(m[-ִOtJpj5\\PW5lSNx87s`V&L 텟S-ssV|A3QV2і/^N\÷GTo<p[K9c@nCjȪPBXg|v)~T[nɡ/mUلsg[T'[tVMӓ1عx(اu EE$'XO;%y2яnTײի˂D S~bOa4Qĸpo* T);+?*L0!i!R1"Y}|fa3^3 /sȓS<.X%pC5Cɨ#NuS*B'th#_]٭J?aՅVڧ+_}T2ASwFse.=y^ ⴦ D#I% 5ղ9/3띷H!Dg W9z+A2^XKd3?.- ޡu%>b=Siz 3so%90 @ _ywz`X֑)Q8Wbr@U.cjz"F7 "%Xt ﮹cS0!\ 9`N_H|z~(=V&ۥ6T0!b$E{Ɣɜ12OW _E9Al5@kЖW}Dk1猛1iXn1\N/l"A{ܼDaenuJ{Ԑ[7cy^ )sCʋHʩP3Xp7T/8Ax e<4.~AB@cwn2JƮ$m$NHl $-)n;͋mMȏW4Yޖ«Gl~Q 7DVlZoߘx>p]3fy,#g7E#9D!.ڲ.׊2 'fv䱥F:Y۞ @Q)l)ο˄ `%$q^pO'ePQn+uh?Wqߥå),M昚",-M)zJ73}|n$.෸V?!M-+%4 @4; )4MHHjwPm@iܱP@W}+iSmdg˖v(Ee(J@ފw;i "^5opr)8=xvhPHUBe|WmX?<+ݱR"sn$e 揫ӂ AS L.KEX$yxWKCV?"]Ni'R,jbY~:z 4WkXPex"!"O)bD)$G^ȷG"{;<̊*D)"N3RJĺzĭS~I)Lh~o!LkORhbwM?BBXZZ>t:X+4BmAtv@M !⸕\0>h&[{y*5{BVJufiRhIsq1] weTde^K'NAT[O,'oXpAzy7l+@9:: yV#d;}$pl]ᮕ" U&eanjLNQ=PY?.Pnh1Exm@K>c2Y\Uj:=~)T˞">?9:m2#\/c]<ݥiq2΁2̞&ԁs`lldD= Y`RIq3n,l3֊4yAB3pf$L{na}4 "Pc^b@ XRM5O +%t"@Bk<_3?c5u8Oh02Z*|B,r0X@tɁH`3 mkd>;󮷌upp̚%@!eB(U)Fܼt J :L⳴-+"q?%o^heDŽnVf@2ߌex$QHHu|;$/٣o>).BXEnAQ2Lv֛=K<(?bXU0r”th-TIn0v#(D' ϳko{X"rUbS=mƲ&+ 7 zO9iw\IbCЍLcvd_;i;b=!O}W$Ȩ{1ICH~$iv#,zhS{a(PۙP5j Q汎Lʴ7\2m hǑSm4rm1%,t`4n0SV7"mG»hwXcվ?42XS@6AC^U Gz -&HQVpY%$6Ko+-y0{@Ȅ/E "F8x+m 3j\Eޕq5O|j|^El?W,h%ql>sO3B66U xQ X9l&%84 s}lv'ȜLB\%a zg]{EOiERE"sD8X}kMTXt^iQX?Zw³UT=Bzӯj1ǨF #ȃURCl#)Z'x~e-r֌hv$)p;A4aLNI=)1H}6dVY2 a셻#Iٻݴ F\;mދ0zv&=Q)ȕqDT/KM;QNu MǺѼI$:`ݹI7IL^Q_o8sv,9s8c+ɄmSR5x%c1;ReenF8| Ԥ\,ݩ'Ҧ d=zXEG a`8~yׇ)q67՛n)N،i:  X(аB|+'9pES\fP*Ң3B.KGS!Fl,GBvSxK ܛLi Fmv2Vt2mK>b' nbm N1/* ZEiF2ѫ[`cYs))='R"MlǑbxΫ[tP)w(% 'V|RM*vb0;v }SK!3ޛ˕lJ-H̫x%t/RJdG `w}4sȧ( TlUo9z߲0˺径7T?u™E832ۈsOEByQ1Dd,,-bJE+1%~KUj5Wp$v'Ë<y6"Vweq&'۶қ3PƥcU}΃ލDLrÌWό4e W}^i&N _Y@u;H`]i:ދ2Ed}sJ}T+Od'4FL^"}PJYOe5p b/1a3WA w|Q< 3(7O~/l|#13ġ2nl@bA(j$!&o kL@Q3鹻W' Uv- }0;F+j[L>_6kʦZ'lRiTU oKg|ʬ^ykI<8x$;N{?)[f4Q<*UaFtQvȚ ֍%/c2O$Y7PQTm詍PL"< A Kȭvfep/Kc%٥QwU%b g -_8}LHZ13xM*ʆ b9a\ic&^d,mˮ/^ Dv^K+-O ?Q:Øe^Nm Jz/.dSېAJϙ (pJnh*VL^wv.p6Bhq[@s2gVq)0WP :c*-) Vҍ6[ 2!\:8k7Nskȁ\תQP&Nk1oi5MbalGO[=k8[◩(z 1x #OL֠NhYTg,WZifNgς?InU/|"/N29kGv&$%)QTMUrrx|=)KH#xÄ?o*iiwBk-vIkvw[FPӏF%iOYݩ*0&нoW&4cZf}Ou#2PBĒ[sK,eg9I9`3U"Cڮg=qdF ?1S{LhBj>T"$ д,^ҞT@QTh_ P*r|ir5q!O~1[R>wN8y{`rhhߢ"( sѡzrD椎T~` no8xߝKhGHEg=,iWJ.*MyK$f'u3JJ? 7Mz7ߧ@tQ$|GLYqGVTQwk"R$ji.erRa5pWUQunhp' v:u8iFr96Wpy+aSƛH\MT,C5 1[xo)@&dL;=;$2Յd|ZApaGz/cE_Tcӆ槻mc>]֤,&pV yk(TB@Pgzf-G/د/UZ а/HZe`+`,Q yO}ѫ 3--!C &$xdSOX@43KLj6LMFKOlw/N3aE$d"Ri3.|~quA%MoD[H(d-vNC#_:3+榰Tib 85R*ya}ܱۆ~ȍO0HoKjRWEw0\d`0H|3˩w :؏z mi)b3~&x< \W"+ 3 *xr2Sn3չ{^Wf*<}\9g_ؗZCE*fBc2:16T*=6˱f,TT;ӎ˂ۍQ#zޑ$y7$oZ ۟|HiW&8h3,~ \JO,3lmE|7W!psgXNx[O%ngښ/Oz@T^M6"$}FU((&&+1B{ %btQBBEjȽSt"5͇ȶ#A[Q^' 5f܀#!As/6;Lr6DPrZ| C:O<^kҽD?M 1EQ"퀆=kx`ٳGՆZ}:VPfH<ݾgm\[0G4Bn˞+&8:#5BD7GϖdU0ΡL}Nj- 6) 2&xGJ<]TNkgbf h}iF觥$u/25E>c]y3bLET9#j+,JlK[t/K~}]ҋ [яx꼅(`ySH2@LoG/]h ᛁN ZqH~glī#X7(6 D?^R7۬5⇣Y#pG՚bR-+BEl!{pYA~2/tɲy#\ 5XLVh$D5 l }':r(;8j(ZqK\[-{!*5EӔVH6"kP0vl.Iϡ1 4mŖ M8#4Nvܛ*5eЭRl|9+;b o00b ?ayJt$(ّMsE ;=l<,*O^KeP qE=Tu9%$gAe~>XDV5B mRhq~@~w+|x ﺀ"-KVѩ#(tEjȉ;;ϗ5Rz٠7y&y,joZF=| @ܙrF0 ЋQT${)>V0$RKCxسXIM D1D1 \iRy=SJ]PXnƖ4. A[h[B[P[C*-Ւ1niܳ(n 8(wnnс`Ggs J+5a`HYbyA CW w jݘpv0Aҹhs_,zYа\}aVGQyQ}#Zf%WmuX "iC69Ȼ R h}fnAh# XaD<(-](ӢU/\r'$ Na  4s?Tj^QI{O_x52/'2C+2@%6a1l5,%Cf;8nWCpY!6cAo-NѬЈy=ga;5|:ΈS~Rrx9_P=x䚥X q>U)h)v*tdFoUKR@oFc'+R̡f[To=2N$=W0/)O #_U%e Gc+),YvdSqN=?ϵ g@ P:8E[ dұ+I=Ǯr&Z@SsAm/zruPFVҢf&MB\V`0!lebe0ݬMM׀/+?.^VpBFbPK">DI̓Mb=Pxz+d(%.JZcX^78?׿_- nB hB Ϛ9ҕ0kNw/z{BY?/-gy<]nW\ܥ΋,Fbu.놸 `lCF.+>$DMo[>4ɸś`o"'79 xgtc:{,YE 7bȇߴ?!P"WMͳPZҁs"ȓ/$?^%P~땠XX8}5Kj@h+!ŷ¬Iq`@M U6IF#֫rm^%K:WOB9=ɕ<-oF;D$i X0%:bxk߉jե/;oL_+7ICԜ` y_w+QʴEx^OB ecƋ~@_ї(f+GA’7;keŽl Jp럁wt&@:U'j9tvEҌd] RoR쩡rbr:Xln8̟%u9p # E󖫬eKh ppusDޒHʐr=Gto slS"p<e1.ȾOU3.ޠ3wzg3YkrA!0N5뻦/!6_S@ΥuNYS5O`ugFncMlJ6Y9N6=35 s)|-65.ě"*uFfV6c,.>-D=MY50,UH?JJG\ G=D@Ӥ 9PgB4l/R;Jt9=?hN%%x>'fIҷ&}6[ꀱ8 &'"[!Mou60JOdSF $k| ;ʒfwǭd ;3h~;8q]" P:2SW:_5,K1tF Jx7'g=Q__LkcJEzD!&/EQdtA6{4M( un2!%,k}൅o$>Gl8wp}M $/@71x"Z炩l;K(KG c{V% N/K\qNש~-K1穬]J*ʱPXN$=)Ҍʷ&Gݖ]js:"aECfbBQQ=)c"}N韝ȅ>OI[/Ju".EC*(,'L$*=ʲA1dʚzw*OL)>}'eq.V"uKgUW$pk8"nJGptqQv藭mn0I?q<>%cK,ƫXv[}ʀMP#Dn7~MAI6p+KK4|o_LHd|;7?Ss//~NF}/ƅP [/9k2z fhvԝOby2(B QWb9,h0ҍg@r~)?e1MRoJӗSyym/%bB2ʮGcν7K<ZB@c8xy<9IOG2|'=4%ҟTE*uTLWZ*2q:7؉U,lRZ⊖gsr=HqQa2^386ΐc2jiWLZDLMp@! C!;2[~%*NqY|)>{@6_Z>Ɂ TONH)Y)="|{C(ͯ~Dϡ͕n] :׼%{osr-~.GM422k .>eceww(W#/B$z&A^TyxF1 -%KH+b2KNcLՐs;ŐkeK< =C 770ce3oω.JqO_[$7d o1i(hwa=0}(9 ^22SZwfո%J+Kzh7s__C9U knCйN-aÏdKj/eS'"=Ysi5T=rs] Ta{^oϻ?2gq;^SY/2Dn51g_K;iAQ یEz4mU+MjF<ꭼ8N.;GfZ]wK@xdg9ȊEA%:-x?X@9')`v 7>Vz:q 2 gJr$2EŜ\Zo/Kp"i!aO >r69O\Kٛ~ b˕?Oy@sƫsk~,`p \q4q`/MԾݫ:`:j/ISԵaOŎپ>BP&i2F\L_>[ˌ>% qܜ*ۧȔ sxB6:_[^׿pExĤ RZmY2%ZЭhh<?O<zggxGːi2Ł'wZnM]+GehPሙ{U),=UUW2sT=LAP!MaUv)>a#ksvWn<#6ě%>1 Ĉƚ|.`jG>J:nJ'[(뷉qȰJeqӽqulbț:E QDߡ1(^nVzʑjAl!+pL]E;0!3j!Jq&ɜ ?ԞrE3b9mVrG`qZX9nAQI.宖?jMJcχ q6i\蝾F rt{p1*lPGjwӗҌm!Vq_̉o l5#RYa[9 zmCTa!S0ԇD%BK3/(LZ&S6u RzcsQ-kMYX^l`2[ȂGIwE媱/!8ڑt<6R!hPpqt.Ft{=|d'XHifbEH.k6)ٙrxFixkr,U#"e!/wċbE-z1]F!Z `0:`*nKd֨_xZ@sߥܺ:yGJI]̼F"A{԰e*AS!3DNɁǜ$b5p4IU3ԉdN.+`e6_ 7fRW)EvQ;s@ˬxyp0*]eQlP{?5&uZy`ibJ[=*.5#ĆpK,OXhFʌk6WXC>UWknW_nyK8FM8k6dب;vlEG u>GZV7>q*ÄNSq X(~a_GluggP F4DN@,lWeq,"n?K;dv|A< LY-X/-Tdr:ö #>/52ة ٝS_`{h-,AI :Uq j%S$ zTko/:=E}+9N QYKY/`U=,t8_ߗP+]g3W=:o;_*tPQ>j=D/0) A_Ox.RpMCgO4JjσyX<8bE9Cs+[i9VN@\zm} Nh҃3:?B[`+&D| jrPr0NoAAⷷ*>7GVjFLyʝ[An()!HM#Dt!o$4 8X.r7t/:YS{ ٖu .v@b D;EU}$8?6P]u٦ v<o@ W]\dw6}wY=ġ;!' U?cDOVtZVF x$|4ȕ>Y$ٱ3KJeM MLId̰[,FIwr+)SI  荈>Hȵ(Aק~ÔYj|v9:&_"zٔG蘿I0MvrNFZ+nClelWA@x /J9Q$ǂl/cބMBƣeQxa~t[ݡJ J |"U"pW翦à.h)"&?;Tqu"TP55i0Lí_$1Fk0sԫ>1G*y*<~ᮭ~3vR#eQ<9&Ԑ{e; sv匐&?#A4R6+UbΝ /h!` ]919?`+dJ$"٬q_WеQn+>6ܵkD ҼSrӯA~|MaVέbPd?M{I$|0kk>Y7y">sQ_uzoyFʜQPX'S֮tZК㥵 Àzuҥb*͗`c]OEoאb—!Vv?G{qJ+͘fV)#DbIM7T4zqo6uJhI)CqtRå./5:ˍ8_"&sή)FB VOWe5Xbؓ%D}FA$tP^ 3]S(SdTj?|Y3СH@ 6-e٤ZzZL7ZC0(%UP%ŴUXOuظ_ zylah]>cv[QMNFnJ{^o*\zk2SC9 Gqݗ&}òNժ0+Q/%-_ʅVBvq=%5Сo 3 jm`e[Z *Z,#)YIHxo%gG61(q(-KP'RA*("JmQ>;@aweOkPA*v0,CqH)(wh`PtC/8nn!da`a299 5gwoh8L {؝~\X nidРJCAv.X1EE%hf+ɾ7b\ UҜq tBg(Q06xM)wZӖv  ց\|b,/`Rc+AlcT0 ƢP1deCy*UkqBItyS9ŧ*+[g4t8`jѰ{`j'yD< x(M5GF2'lDoHDQ~)npv:o7t-k&ܗg"eIc)4öi%$,4X%V?y QwhV9ڏM>O%1'b\{83:|\ݱ^~"-f})~fN5"A!W -Hcu:Ȕ}IU4\6@N]'ܗ8xCJ Z暣9ӿt^J6ΦП;*cM,[E6H7 Q.dMz9f::7yN ٽN~Y fiɱ(vKyP5;,cW\IvK|ǨcYb&8L?!5qߛi,}?#z?AԺ>׆n`۷_ ?C(ơQ9>bV/1BO6#; ` 4"+|+\"b3,pmx9S1B"̤7U^O'P:t>{f;ZZijI.U`OF cR1\<'boޜM'j¥˓DltKF:z=\~*#HhP?3)b8J)`T vbLq1J_=B5GLNmfFfd3RXӃ׵AZm-DQ$zT1.aֳ5VQaKRXiG-ZKo۔Ϛ@-j݀qTruԘN)]-wd.NaA= }{K̀2Bl@3C83wSKCs=Dٗ@ l6EA%!ù.jRuQ :S8LĞ S ,L鰺Z䉦fw+9d Wh=uRMoh=e2ITMBNo:d9-c'h64>A`f聸Z N  f )R{TDa1/Q)Mg'J )2Nt<g}`Ux U\iéR8j5x'(ߝT`VυiF2'wbIJA@෬Ks,/"E}{w Q3(T0/0]Ҁyg6z3V#LS˻^ԴWǷg_֤ISld) S, s5|dz鎐A7^&؆TX4-Kw [=<o/!SA4~AX\6ܜ@u@cZ `i NxP%1.EJu4^ CQ~ ܮnñ?y6D8Z%R!QGhwሽ"z.nFiGE쬍sB`pd̃u8Jw7tYKO }!iv T$qjjD , \Bcp>s_%_iY2͎_ޡҗW*!I5`a(bH: N"Qo6'v4YA* =@xT=mAo玨1-OMNc:̄M".t]>|դ%*`_y)_Ua[`^%f(ּL(]1՜yH d3~tnn -"f]x97Dʸ 8#msğM2'[õv q@&v\@72GVb`^f%Ly U]cv׉*j/)g`eq9K@X(^%RHuexO2yTnrgf? QWuC]8ιc2*q?g/|԰&lBAm.=FrR h) Hr@(f% JДfKs!k\MS;&VH:Rk6#5`\7JeCKRX4Wӹ1*-oaW{OC]W^`*6W(jH^UzlfJaЅ}rI)L;%SݬEnt*J}3絮m!fwNky"ILua7;-*SǜH{qC{* 7lu)#$$;;e_ %E }>1.%wږaYOopfq1j|181m"BI(g>ah){NEpUo.mrC~bOnjetstzڶ{R0҇7PFS+:ZN_o_*6bKf ͧaH(AsG9 AU/c%AwRN= q+Ӣ1Oq(]FHpLSdM Bv`EZuoM^Q,xma7):7Z[hyYFUQvek7t'u:Xn>#xDMW9R#Y`˘;3;tpkx*YRϔ3gcυ:64'J5ܓ8!T|Uؓha*GNwg"|A3W8^rOl|J|-м.Vs1wp${i]&CJ` )Vu(>$_Bv:rd aGge>8<(xtJ8%<5/@# ^&}ARuiڐcL3g陞X/rvg<$>9~@0/#nh 4~Svf!ZlRIELZh\+td.?8[~M`a7ds-\EZQ":%g"5"Q?yZ( rrE]Н0j\ uCL|渜3L'\R8Ű>q=.i9j9@ rU[`PZo."U8+00WHE*RI 8RdA Ai[oA'P1m5סh'cƞy ļRA;'SOQhP=8vkˬFUDq.4g J z}^l]>4oF=?#M>+Gj2$1ui៎Нذd@y;>N (w|9q+v%.aԜ;@ËK_QPr:ԩ隽2A1cMn0فH jDp]cΐ9ڀ yEEBNi/8^s3.rq{djMs]Y^}NO THzIŚw^nynpz ;n6T2ESyrk -Ƀs5)oWE/=߼023_d9Ujް Fۦ#eTv]޹0 *K^H(er_  ve Rk=4_(YVը3n((:u~qCOaAI~w,lo9غ@zDB|-K'Wֈ~ jgSD?4Cq @!=,,,}ϷP\Mf孴7I5ppvf?/c[Jh, 7Dz,'uVy(`kIu.A#7`9>mt_~Q=+sbdZz"- OkWF)mw1/Ps/O`7|l ^esCꀄ2@NsBERVU&pz }ePyAx;7>G 13+f‚Rji]6$Ln"cS ԥ<ܙCdvz5^+:Hx(A=5 ת6Ka3}&tZ^Ʒ'f @yR.c?7HhFw\q 3Ok@1z4F6.ʦ͚㏎tNv]_{Bز\6'1(;Ϭ؏i`?ͽ-a5vWc/.x\hų쉉77‡YZ촚ejIĹVG[cɚ8[Q[oJsL] euhgIdZ.Yti{ԊᣪD:1A B yb?Wy] n>\/&S0Vɛ]lLXdRdޏMܼ$VHl,{y jaD$ԟoyU[IyIfX_Y{4 @d_#8B0->Gʭ#Ֆֶ R 95+KZS$5~VZ{ [0Ss h)@^%A9 TtF+llOk;AR[xk>GF ZJ"pT.r(*v6jH`P=|#*ȁ?꛴=mP~GqxL*YG:f<7#\o% }坞4ݙ]~ĻKg՛JP*݊DI>Ɓ NGC.c^oK[{+6*3Yk%N}2sͯgo{s@b< tfg$oVeh)< A-N*I"Y>i->maV%os_%@A">EtM#ݷpPA%NpdX=&p`%h(x  իƒDǤǧûڃ oIfitc>܃ô&$c\Lr/4Fof")p-_Ȅjg 8=t>:~&HNsqЦ> %;(Zfg%O/Fޠz9A<]phjSZ]t"+2VPf B"(GXhyߢYRY1YSՌf5vM9 e=?$H<ܳ%4r(u{nfX.oe ߃חQ84s9U57kr%5390{@cdROFxP#Ilaz0XQd:'p=F~ag.0-4{)RW3I\xx-ٵk;h0.X,B9thq3sPDhB`>ҖC0Es`G$7&ل]0jBnto aʛ'2X) 1R:M9a7.6HPt Pmj{pP70 ?{ڛj7.kR4@9ޣ4oaLiUѧLg\z Ę =P\kW 1#vk'L٢C<>i;QOԂlH.D0T\; Ѻ ,uzz&|̕; g67 D.WS /lU\ %}o=EfB$:ˈIT/]څNx_2ՙ%lIH D1K ɟbO2Of7!\8 coK͓̀Ѿ\b9x+k)KP>Gz"Yr(g@탮0`N 8NF;kpBnI'x''5s*S4+H09!BNXQ[OTXj@nUaP8tҲ1J 29̆ w+5B@nW2b9ð䗹e8-gtOQPkqOrTmgpςfkH+HQrLA:սeNF.5qsoic4n¼Ԯ .lf }]քy.9[5m@u%H1v?1Ks E$&3CY,Ğ-hYʆ[b w':U@hZ[VUx#DVvM && T)%t-CF 㐜KuoJ^A7y^ߦM'7^HdA;3%mAҝ䍪90+!Wa2tXNMVVr>bkY2F(V"D}`|?j 5^ӡ=̧FY15_dvx CsBnj,'l&*;1֤ .1(7[tZ'هۋb^6Z./ t{Ph[ܴDhi:Eqjץ'aofYI.0lys;UiyYҜπ$eԸmY;W]]afQpv@#cmaEn)Lg7羓#,@U9ăr<a' v!HLwD-w]zB%=ZZ[m NiuלaM5}v8Ql{$X=HT8"@(m򊝚M>`#("N"ӶTUECmcW׺ljT] b&N.-9P p6ߡceGccr&^MɌ{aWBG2U(l`wwi#%@U'"]A#S7~x䷬fZ9~C^>92\yòñE‰-Xnxfb c2^f/)ԭ?#ӝ>E_r-(+#b]%,shViiӓydun C\B-,sœ+^1T F q~]5ͥ/BO^[-hO >)gvWyQ>Gb#L&x 9闧lnG( Tj w-:}7besh隂ˤ~L}+ƾA3x UEU>e:\zyurўI&^uQz 1xZӲ}Q {}xxahأ b(}נu85i |f%\mz䥞mlqzbX\8rgj' Qw'@ Hz͔wpb 9u]`Zv侀 |bA>,vp5n?> b)AcF&K1'(@ @ǀ ȡTmt VWGA0 Tm}>]p!8+oUjTn$2eֽJ)GBGsCg^4R01w_^*d˫ɏkã30>:xz$m*vZ-#Lm)p?_SU^"3m @QEMI$w?GI/x2u]6NBt>)UU ZW:5<@X R$蜫 ~+Ӝ,)"4|0F7m,}QVi7/\(b%eQَB̸'9BPFQjbnt8qStLc}7VkBvtkŨQȹNxq?9(䭯QdFl:Y)_">)NɉF s't.P6=1kIHȗ CC€al 謹6g`y9adxSjPqnߪK_|AB) 'rG7qP=y57=rN,>/ÐqOP*rXxhg{xaO1!RpN;FeBh:2L:v[8XW^bY}1$r{Q̧ no)j3GJ'yFux /G/}(mH}FN9ՃI˅ Sh4ƃF==H ۫ t x>}=E"cgj_O&%6xk[-G b\mtZba'>wj ԋDK ӇHF:w tID2Z0R<,":yi!c#Y X^_%=bj|ņƢ(Vʾb5Lsmk`_b;7ԛ?8ª`ik߹*NṲb 0ډ҇S̏Jj;.0ލRF駇鿧{ ] hޡ}'K2/4\nH}J( ɋAN lvEf?ugŮMQL\7$O!+<ʨZ5#sE[;1nD8f=C}<2^}q¹4;6R?K1;Gj[낑O,V 9Ld}'5ѕlG_e[س@A+6=@tW9ۗp'YV1acrP]8lb&UD8vۘͼ Y,n7NCr"*kc[UbȊ2d=G\pܾ^ҽ2"9׺זq._q5cʛl.z0 -Ǧ6!~v؍A}~ZxfۆD]OU@vhQMJ u"@w1V\Q 1K#V |ڝjo%msg:_K&TpԿ9.T<`;\+!Pr#!W%*(:"jwIEBr }ހ5 Oe~ _룋n*Kmt ׁ?m;͖941gi_iƌfO;)5FQ$2oB 4[ 'ᒍ]M +l˖}}ZÚ XsAA@\ڰ::P\p![KTcnv2ĩx4l%VDRd'F oTC{i!W7KoiWtF3Ds.ba*U3ުuk¬uͽm1Jv֕!yvrN|y-E"Z"b|pDVPX㤅̯r %0VW5޹Nd2y{|T-fNUEX3jKC6xAǘocM t8N8Be~v&_!<|t9xox/KDoo%x>v^3 t*=՚3-Ks6jE="S:"́Y[a8~#رyۻʇB>ﱐhJu`9;ߘ!⛑-u~Ʃ- Mc/:J _ glXMЙ_uD_L1\i >zvdU)H.u@(##s()I R!wY/{ikDD}o93%ȐO@k‚#B7&h(RnW-;W7x<6*JvS]W3ށ8TD (u{ o/q_C8ӆ=/k,=Ijw zIË녃^>ge!,ƌ~o^ AiZJ7̘{ѕ=D@sMc`+N%!]x]`$F(v@$贌#_ް\*5גtm>WRD4*J3A\Jc/ғu`lTuB]@NF'_vM!ƒh'D}ᒘ7Ê'k?|w)xaƗX 0]6^t;Un!aZ'y2/ruSNjجCB>E CJL`gLZe#w>R 7"O4}f-X&< 6 )UY"%ˮsn DŇo9Wъ?,ɬr"EreiAM۟%Oq\\cCH%i: YcRrK\8tےN'-Ej^0L;mS %__zX] =Vg(bU_9[2rs&^-W ȽIoR=YQ# X!5k K,e<^*}?{X;{ʱϲ;Te`Iy+:u1~+oA %cmd#*v1D0 /; U;E;//Xr]Vݧ2zI׈+ [w?[IȄ)Æ ?p.!ќT+XaZ5 2 |h@{D %("yrNjeo!Ez*:2hv9dhv@4sQ\7|žxY,0 υP,C섖!Lt1<$}a2S.ύe3t7wץlW^)'.ZBI3YV}BP|m> }h;u;B0HڠV kQp19zOUHE*8XmsHHX3 "6{C^)C9bYd]WcK_z9w9װ k>4=DK\J6 L}qM27%eVL\ķqYCqbg9ǦeqL'#!!}9OѸͩm??8bm2ǂϗRygaU*YFե #*~70Bv.ab}_ڳ  v]*;S8<{#!L8ke~w^ 8n? J<91UP2Itp:IIHh 0YrʀҽA4q6h7љe y0ᱫ5:d/BgmtұpӹT>{FPְQ[k0N":kV(0ގJ|`7Z(0;^ /'$ʍUx@b&M㤒5U'jSWہ+ֳWx`aAٸut߷ z#z+M2/+껖Gt+wwWWz2]0^DJ6oDߐI4i5nL^Ϩ;o-!&MFhDt@H dྭ3avK kT*"s ѡ ŊGCVN.qkGAc4 waX'Xݮ ֊p˝$N#@) $PWG;'YzDΦ9@t$G9wp_1$$f=Kx; t =Ӎp] -EI߽UTY (> rw8UIM' 3ޟL 8I&k"nI|C2HCRC! Q?e#CB0\Tw=^ Wڦ{Kܑp.d2o&Xx.}8VcCJ"N6|['kQ[AJ,lj$Ch)Q6*m).Ka$p->se>px#?̖= MCO]X0] mmJ{2Lq m_Rƛ+"gu/p<|7ztHo|sm7.S1ߪ`6hd烝bFW'$A"(H\^tS;{h~ }a}|.s3).YTmzTѪzI? mFCMZHR0/d.'ZKᰶ@G B$hx릓N.„Gvɜ qxGÄdZ˭#l[)SgN LH>Xd% a痭*"ueD,~@Q U[1>wAK^<\/hY[ijp6;'}%̭]9+TZښ:ۉ{cO)/*&7#_j:}\MttTt2)H_6r{ عB8}W3ڍr/H=lD* 2L cOl@}"]59ª"9B'F 'Fր0NjPL9d,ں̓M ,0hR|fGeрD臛whlS -,N96vq@GJۄmH o\pZdPLj]HZ2 \JrМyAV6F|bN{ AQ%z lZLFwSPC/û߰hrsM\bZ .5ҽFbJu׏#7z7dv]vY\ԝmIozJ'$ǵKKJ/`C _ ,fת T>ʥDk`Н:7^H ZD֫?WYv-uӎ[jTRCSNVtaQ"r%tC/Xk9w'HfQa.X8 1 r/:Z<-f%G-u0mO$J Z;2 b1>uG–|ظͅa-d“fGJddEmϠZCZJF#%>$AXRjMb"%W5Mu)3>{.IxQ@y}*{ 0E-.-Yk75S]feo~Yuh27cZ'>kݙQZ):aDj-,F*SZX6,tDr|ȲWaxȄƁ&6껛b< IJ\g~K#x뼕, j "fxҨwOÏBÍjjj,An"7k3JXޢT#x֟.mOx)]W 75-Dx&iãA=[wb'gLm,j^'ʡ/nieϘ%!Ɩd ֻ' vYʼnkU_w-~o:ڒ'EvIXfVTXgi,6*(}%ݙЄӲid ~([E :g-n܆cW @5x]FJ4\.xfdp uّ[tF{L\)c^~%R}SsX [ɐ̺~ 3Ŕ_JjQz~!,ϪX aS|eso} %kX% bODvk`m\? h-{9LT+PVTHSGv;:rD^]{fkd#J 䳱~6TPyχ8(TB^ubۜ2\"(fbepb XSFSS;ptVRWX(/1ڋHpWԫqq\u)ƽU7/4+5#aAkJuȍy*#D'9|_2HIoؔDs קb[VQx&,4:z}0c6n` 4Dq3 Q3O.MMҽ?~(2RpV+d IZ3RgiM,pg[ Fgաa"lnd'-rAVoFLn@7> Q!R$<( feJgVc!-I,4&0S֫ (ϩ6ĩRhK®G1 aԿ;aAO$e*?+Ggk,٤tcdNp-2 *3|qc6OC\m yg6:pU QkXV/0g ) [>M̈́+{w0ʮ5gJY\`n{X;ŀeh~H*Bͭ ɣ j0XBUl3Hl* [܆M|6%쪞175<ŎT5<í'u8YeA b=Ce"2?-Jx?9:GDX3TlF)1S;BՁ˞2c{N m%clZ`6ttNk|:=Ay?HV?۬2cVFۦJ"fpK^$>p ZUy,Jن h" l&ie"G^ 2bf?imxXrNpV^E+rvP~1R+%,tM ^|i0jBmLm"b]y|[)Rm~_o_G5E}9F_8PaS_,:M,g+wqahʊ(ߣ_ugŌy.]H,7 '.x2 b28z- zN G~vI1 >S\NhaO g)޻xK.GDzjgOt!yCFQvs.V]) 'Č1vZ Z |^GO0 O8X0z`7;&㦏 ^zvl0 lԂ"uBA۵N҄R z.'GVW)-L-5yIg^ |XgZKb09ខq[h?H0ld`'.z0a9"9ۯTPVtgg2E"Ks󁳣rӮYu9m"mO'])HSClu . `,S1|E)C-9ǖusjeڼcˇ9.G5Oo9`{wܭQsqע'+NVp>V4) 8MӳY/O+I^K\ ln<`)rgWn9Q΅^KE"3z=85vj*K%Ŝ/9JkǺt{C{ǸqfuDPCЌUS76_͍nN[]ꢪe UJ3bE /hI$%hixůO)bpk6*)e~lke*M$-Sq_D7Xߕc|v@_4B=?*x EwNDpz^ 4_&gA1ϒ8{'>$.!\z$E}eֽN=kWb+12!涑~ڡ?h:9cPLy$Rtqv=p/Fuբ%Ǥ-je5~Bqdکє)|B@cHq jqx_RL͇x砐GPnX7S /ĵCo.+49}F 聯bUNLLU̜c,ZJ|xNv^#o^T5`pgh%Hop`v^^8e;cgWh/Ke /PU>bjGI~5FWW^T%..) j;;Oo.IМѺ!v|+d|4QH\sԣ(5Cet80qaӨRTOGECg.a9 鼝`:4 5J4x(;Q1We<Ԡw#K1(1tvIN wML_g1M@ ס|繼8Dׄl#Ӡs`믷BU?q27e6f/ ]vi"hMPuIX?M6#s-?RQ찥Gz1/inT.v,dXa&G6 0BOok cQt  o'ѱp\=(&kŰ{8d :oj*wr-pbbKtpc!*.FoI):Th.BS7sb^!jRדz}z YmI4}`o<4?zS!Huk> %ki4v8ѠV}m{z|A:` d/k4 O(|C>9;MP4:ˈY o ",1Л$]0ya= x+]Vq/ ]=ck h//~ 3eCzBD좩*k1􇀡0~It} Zyzk/`D̖S 艨ev,F<>xAZ='$y@-Za=朱gVVln <_&6L%;X~*D"1+\[PE^zL v3 " oa#|6 "2NUY"$L<㓪03|H;@8u}#rBH'06ӑ~9ZU!xN;iϓ' :veC?(b=Q,ڏ6&ݕ!ؗFЕx[q_%9݈XE'0@DTL5'#"WXpo;oP"ro׳c l%:?q8r$UoFK[1O  H \%zrϥ'B;  fmr*0WAfa;Ȯ\ݒKP2fu&wW@iaw:8pm܄CIGD"lA;=w4ğ*hN*c}9n;'E Xm<RGQݞS|C$ga&=G1!ӛ "XR#t~m\ _Sytha_ !v%+6x-m]|y!{hɊl ʋ !^U3)la|2DNdٴ adQ|^ ]3;EaUx(SN8NJ J7쭐G`73wFaj~ڈ?/nA~6>Wi|"%7W5W VIJ0\-vE;o?uPAv4xZs⶷˴l^ |ɧ-!lyGoSpsu(ybф/tdA(9-Q$hN9)m\ =%QvFB`mu:Xh |Lx! FF*Q\ a XKKԑRИd8Þ8E?{P2٬QsD1*m^xy[ߚNy5j糌ORa#I>'6dk an%B OEn 0a[/Sl4Rx {Ë6p(@b]Bn3f٦i/Ž>öQp#F`1h&na$RRfm'}ĸMA2*pCk Tbhyb},cjbb󯎒hlǪHE% ~hdʋl~TgU 8zt'I<7O@TeBZGĤvbk!eё0u\QPt 14oepW8ZӁʵ++rJ뀅V O_16|@]~,3BCt΁\"]Lbd-K|7$ &21'2ЦҮ1UPD`qe^kEa6H 9=ֽɂF:o>Ĥ%f\'PviXf|PnEFnFY(~~Ǖ-E쌩/OYBF_|.f~PLK꾂$($=$a\;G 婙f&D$8e%zԐlfUB"q]o?9~/1wݚ&nymH.f K)6d(ź?|OC`\ w$ cP.z6tzbtPwyB`2w#xreʀ$fB۸lW`]} lM%2}農Cd=K^GZc$3]ӓgd:\~~?28#Z>T쪰fX/ NH ٺP(|J=+D%$" &1lѦD6܋FmfB?5dw$6Sm6` xV)P0?UΞqږъ7u 2{܃yKZ Eg~s#I ^Y{,Ӯd@o5#SX<b=Dư*ڢW؀}Ig*ۏS֊#*LR q ?57ɤٰGmj a;/#%߳g\iG!`lxA,R#k*Az~]>%fqʪ;5W )cx9 9hI )v;9R\N@?)6freक़"a (p[*-9:ؚPd#a[OY2{>ջXG'CE n8cV3=,[7~7@n-95Em=˹hw{ "s',4^W,ƀMoPT.0927V>շYvjմP 'fePiUT72RywR=>Ev8Cy)GD^οF~ɥ,Wfc9sPyO6_*P%!у@ +4"W顿g>H} cNimK Y[vu0'qn?1SXTKS:ݮ[r2)natSAlp&*n|2D쨔ˋOϹ}U<>aF"GawA"3xެvέta{V3qcHՈ TZ\8sUuwpCu8vWAlgPyt SLtwU$|L믥 Gy(Cn ܸz6]@s at|IMP,bX+N; sj b흙]>x(u\ZϴCƪDJ\3f]kd.:mA9/#'š 3 i&1#P,}sS38xo=ܙ'w?Y 'Rߺ *pP 몚VdSy(<0WX?8&kcK' ݬ* & y*Cx@߻"l ʾcEɂiqV5 w:~Zխ:5pgЬpġ1kev= ^%0J5hLrE%I+mv\޲e gT'e_O)@]W@IL>G_@򋩒"Zc]XBM/|' 8t?yJjy\[fLi~z`}bM%ܒ,+ڼId/vmx10=JL M_!T~J&[BӃ#N_`WXIsPב[_{0ɍh$V׍F>$]6?]6w qF$#ibZM4Q˟RE*cF L$X3s_QZwTQ_}f_ 8bGbv?CSt KNs,1_/KG)=I6 )@Zfpy`HNҁ.XDS 0tJ]od=ّf)n0(> ndid!lep?)Lfe2؏+pT{F)9c*|f_Ց<Сj_:|JژL,}?^,w\BiW5q+(ik'aU/-b"69y*,鷋1 lQfnbXC ӵ/ח…CZЦfN\E^>+mg P |cIRD~ai:BH׻cX0f;EĚ< v?6ŗ3l[)U^"נ;}Wx͔4ΏF )e9;P(T/] a&AuE ⼄|mFęJFa+hýKg&wZ T nC b && $M^B][`e"'tAu?:u,k ]!,B8TC~n NAcŘgC_9jST8|[d]A%Fn ʹm:)dd|sU#Gj=Ԃˇ臞k*`yBTh>Ac7d,]_XVb0M;kRT c8_R6NHMX3΃_?@ˇ'/_<U*h1E<Щd{zzaWbGSoLr|%[AQݐ=)"sT6$s$K{Oct YWYo$Љ"?7o}NG"u٥;Y<nƢ>$LkKx#bсBuo :~BN,kIWd*<T)dz'=+v@;+:ny6Yz \B@SҬ ܹod_e ud: >L|(%69y![h3WX[kZ⍃ ]]EgTGőP*ʪ/>73wQ4C:l IP(;< 1D&ʭX|{\-nK%QfkrpI(؎$R~sSՉd ?|tzMLt-!D>*=` ;`q~Ϋ[*8(:I>;_*e<)y1[GΕprBML~~]Y"`vRʺ[7֪ ]6ndJN e."i5Ȍ\b^H&t} '!cݑI%>~_N_/|Pϧ5D8AG^tm]%lmH/ HEy6 }ZTWӚ]gZH`-}Ż8Lḳl)t%D=ΉFGi|FflȪEN|]J qH>DܔZƳ(|\ْN҂@8aebY8K`!`/4RtpA#R2t _o."d1>iu(#FWSeΩkPT71F.)[t8_Uf^xRǺ$3y͘ C+UQ&9tNllX44u]Lvդ]=aݭ4h3=nkϲlo~WMUbەB,C$L+:[wJ\^j9~H~XZ뱬͋޴Τ-9j[Fu6AɈ*qL&O{moD~%&*P\(PB3ˈD} 3k<l섕|m35_hA\P7 9Sx&h1k8o. 鞘*zv Bau4MSI"U{93i.Cqu箳Ұj PHC-d^SpB}<{,,[շ2<*kPX/ԉ轚f]5+~?2q<σKȰpBw 둯ZDqb3#C6Q57R޻N+Eh8Yڋο)Ml@-g{]ǭC"UxE4DCE@W15^J a;#%x=CH) $+boNn.tm{6D]GX{yZ> /:O!pL~r=Vq^+jIYXOIw;l uu%݉zP2[A{`6b01H |r]ؐ4%[9~} lH|]o3hwvEEfpGb:V:K&i56||}`(W17 juL^Qr堢1oViy1WM. Lm7Ro$`i7Tk4#DGFcC=e޿{Uc5 z eT0ܿ,!GR[ M`R͟gCe[DF݇q_FB`y:j]񀸫!ݴ}?]ИhMR܏ 90RRXPkY|8DNÆ*\eJ1̡Jܔ*ƀWv{rhAjq6|:j&Pw" *bB<ݝYJ>Uj1B~ T433,ӏvaM9# 0Xc1Oj=̱U_2vTiG**JB#lA2r2mC3/_SȑDHK G,> IFy/UɝDx-HNS UfZ^Ë],$Rc\O>n?aA[i.,ҝXyԦ0X(K0kH!mdUƄ.#Bʹ>OO߷Go|nEvo4qU(DLo 8W 2ѓ8!E]w >eԧ&dHi8BڎQ?p{;|jQ, yXܪ̎-FxZ>h$Knxb[ Lk@W)HT3Q\j񐡊JXkb`Lll n֏H~r"B]&ێ)ű$2' @(J/3,"^|t2GhCA(v ?-nj@w5_AW ܐ2=U9p?|ռKN<s>@9{ů7տ!I{WK#%$:395p}gհPO#T*g[UE&\?IUzQ-cQyn6Uas΅sʇBڶSb I^+d}]Qp Ÿd5^pCtSgKm8CNKtw! ι M%kS2SVUHޯ )9mw[!= 4D{T|(zxad{nv&!b8]9Ɂf%V%M&T$G3U:-ޕ֘Gs#1iC7w>{O2*S/6OaΦ;lf_ac'sqv\gL@L$Y͏E&e3a&hR';BJm ٔ?5<]W"B!O [Tziʘt }NQw1Đ?D!Uƀp`ݮ[?W!FJomY1'- ?&P]!-BP1 e,W2V$x΃8 HUY?y?dv8yܭT϶8V+#EvMܴY{=45U(f2-^Ҩ6YY8>@J'dTٮx apWR [Er/VZ1]/5*KBg/|4X3- vGm!˻E`1 rY=ΩxJwa5)S^8Ռsv^DcGF ;~BV+6-4I o?Bw6VF9#}JKc~eN儇5](cmzFt4ZF3I:py%$P;m[}%r?cfq}(P}cb8,C(dU>k~-9=L;&[ޭi-y '[ˏ 2:%tw-hٕ 4Nܪ]MuPAP=ƸR6q k:VK *P\Ƭ6|L pdخJYؠ)Tw(zղ>iNaap>+% Tݰ BkhfѶ Kb!p2KIdB1Mн1eGsN%~C]%,.!`U|;[I_orجfHg[[O~RWA'ui* =:}?f_N6m#VyY}~L3H>ezSUAfHc[$?ۢuyf[\D8fEpsy,j8Ovom1EŇp4T1XfQ5u {.h}"|BO@VR1T=hϱ+Gdg>/ZPM;A[/T* EQi"BQh{~M|`$V$U#NU _Sqd mmydyzwl:5/[IO2Wc:K'jd\ŗwg-/i ?HVɮµy3DmX 变)pNb]6$Tb̫;Fѷ'Klu,t.*{qDc[2 XQ`'_b9`BǐuI#CV^dtM e+TuHezp]/i(WñmHy])?tmIر-?Ϫ_XUMlf|W>^R oFM6u!p7cgzHQuA/ҰӠsXX/K }ZEC%}OYc!^Vd,D}>}MﻭiR 8݊.M _ :W$탯EwK¤+f`PLnd;0|N +fO2ʊ]_z }*n&[, %: ^H8}dtm/Θ>U)KrFmᙠ5^|Ӛ")("_6fן>Ay&IκD FPZVoY' gӨn\[-|;RtӀhZ04"L l.8ha<{/]F5][2Zןpߒ#*hIW]ZAzI ׯ]vdݗ]enk-rdzд5lCb$,DQ^$J^ /Go{1XZ&m>< 3Af[cy kȏ8_X?NuE96|Uƾ-Ru&YiRU'x\m;H{mW\pd!U^L}|:Sa` Sg;7#N ]Zs-:h*߬RZh<;H/I忘 j9#iq1 c"M=5{ J淢}۔ԏՠ4“pv a&郭N:NyuA.C u$*m9:Ԋo 5}'Τcnf(֕( 'ڦ_=s*_Gh܋QSnɀ9#Ět(3bcmX'QN_ð:Vd:P}vco9Ja[ؚ~%g;OnLWS|ȬWVI1dl;Z7/(N!vEܵ%c@JK]%)F#ضr9Ce7Vg)qg!wP`>F_d$*O]KlUb'EI0-axиHX[ D- h k'̞c}I+pkQtn~ qt1*aw*k(~lAըcOXCH膞ԋ>vs#N$0:C#O =DsO,9(\ix;T?op~h]Cre#B%40dHxl(xD9hS&Xl-~5:$.%Nʕ4p&zC9Lgoh1sw BPKCVfwc:sEE`n,!{L;Ntǀ;їsEnftᧀJGf J_͏`A&~u#/ 6yzlGOyi!HxȝDϒKj q̯@j>/qg?Q\{Ңܕ#}U>f*sq[jo‚3t;Gv஦l{";Dk(QsPeh_-n]^X7̀q̞ q7*hXpcH8ZkH`j]&X%9smShS#iXz qK#HS7ɍ␡=%ŸVq9X9S MN2J˝-$HZI0 LMJN&p 6hi^ljFr"I ޣOKsרb?fR 4, /Ե3Šǒ_nJ;nږ'/Zwai%@ (BB4ΞM<<{W/>R`4l,W晁i#dmKy|@H);y?TNjV "&oNCShD-.޶|$]ƹ_QT)< |p37 `@%Y؎}g$Yl`Uйцau -_ q8Q0A$]y\|eޟ4Bv*zT !S ٙ@(4ˌE!Ͱ T .v9Vu3OQDo^rAl .p r 4"DsаĮuEϖL5&=1Ph?*N#ui׆/ Ll6zIv'}5}ϊW@ȅ!QFvqv6!s (+ܠ q0F%kp:^+/y)k&5` |YB8rwҪ`>7I5-Rfn_ 鎝<\?Ľi2Ez+ďP:}ka[{&Fn&l4op ^[HAjPR/Zt#fVX0֌_i37GCrVh ʮ=>bi_l_)@Ц`Ja[.PEnu_8,{ÑQGBlP!}!yDOuϸ7aQmE8Qb9.9UW~=j5+@Js{QH%>_N^Hcd̬ %C1wf꧕%ڢ"BbB[9+ߴc/L-ź6?% :NJA90R!0VW{N!EF_/!dXp!QۆRsɳ~WyG+59JBb]7ZuTr,gS%x׷-.T^.'3Ǣǒ39ƘM1or|䮋!|yƜ )=hj`KIr^|D Qh0J@$tpƽKFnl>q1Ğ/ ǻvM]$ʘCK~2bZR\Z>X-h'6 Dd4Ǟ/0)E;=)y@I8Y`V_3=H Fęr+4j=w ݓcUⱷ8 .ZU.P?ʌw/VYbyZh4eufXcUٜײ2>K%@@ifpQm<¢S/!Jwʃv* XJK]g Qps񀀀ôp]i3>gRAVQ`fHQgU[w6roGԋC̑&,+m.iDӶy~S0. 㥫/w7uJyl`PoQe|~A7BEMqTҺ]ě17E+$u^7D<|rǥV$٤k֠釜WG"_í2u=g-I2۔5"'w>n2Rp۟?ݲKZtDqN~]|f7R#UTyOgE[첮.ySΩ]E.~ Y.*jBRê#d4[Rj\n5Hґ)K09 EU?;1p-\EǞ Pzo _i}a|dp-"7oaUk8|o O.>T[\iK$cUKr~By8PisT) Zk <dV,'PrZ|l &Q~DqOp2iSY9tor BFirCuXzrN{Q2.j vcO+|4A'[ռAsL"=YI/q.ʃ?\ov%N: :m:,ǚ ^aViX>gmkXMɆ @XS+[(Zd{'>pakjG&JA7`V^ >1"ԯ.5 Hx7̚5|ٻŰ*w!&փ+Q\㝠hCq[~sBF*q5&V\Zsx /z('򉶫'άj\NUc̑;UsgMwkk7zWHr_IF^!٦P cmJ/,i$Hvv'Vf:x@̋'FH5*A mo"/@uC"jő%wDK%`0p$yNctmYk膁熬ۯ&nVxܹ$Nfl[Hߑvı99[D ^:Pz7HnZ5{W2$YC~e"&uc#QV֊Os0v& bjC6,}5kral NbC!U_7&g _ NuAiiĶ`RkK阓bxĬݏIU<b>d`Y%}hH{^I^I+Wy7 ӣ1L`} 5umy * 3D75F2{p%!glVXQbgL l/QW]aA)<iA\s8'pÎ3'" i6BL8AGElIQ[!kWdc?~;Q<D~ .}2읦Q쳴y;ӴM>p7c[*`ޅNҳ"Rx|zP`l^L~%Tjy:I:~HIh_VE{1})O,YPrPhۋl& L*˞Ú лU==r8?Fk,rğ2gO '.`bսibp?cdG@%F✴~K8GiE];==Δ[Iag$S-i@mm!1: Cjj&LMf֊{jaYMl[;އC$&cQƲmU;׈S6jXP3i.rtRrymTeL{k9e3l9349[@S;a{.t}S럝Έ@]p:\jD}l|T퉚JEdCniƌzZ[mLrǷMI|Pyç6}`%FY^zÉMU=S21I(B3<4[# o\Go80*G#N<~Dݼnc&➶}Bk),FB?4K'SbD{6;7Iu3vP~| c%Q^.2lRtRfcC@~IZwJ3k)9Ṯb2o_3\RxA(g[^?^Qq'[٩0g;oUE.| F 8I@'6=zk6)l5d7C摴T_Pk|V6|/xҨ;PNR Z$ͨFУjM)ӱ5t bL§q?]HTr3bBJeC&f PEv3{5궮cӯ:ԊOw!ү,ɹ5$95]}Ɍ9eLjLjF0M #qkI.;&f~zBV<-,p^C0 xzoO5!^aߌn,Kq1-5tB2!P*cfoe退YhR(+\}~n\uމ t}r`X#m5(.piF{tj8o̧ \‎L)q۰Xer?pkg⯣DLf} !GOuVlۉnP :V9wAHO w !ژ ޖ0F]F򄹠vr. pWKi5~w?Bw22b.%f6{ 岳y0H3>aBQ+YM,qᘞX?vvϏ}r*hMƏ.A{;A.m R!On:ӫ0]Џ1.wbO7\c)2hiEņ];EW,doZ~%;O vPo)sBϬyjn !aOPI1F3qcxSƟDk07Ai؎r'$x+S +MwŸ(ei5JZV `L0GGꝈЫ̾lעf ٖ쪙<~{U^.B9H%GHLJx2+[-Fio'[6р<-#O5ǣ~M;^1l!mKzȂx%w8TGuNX/=3Q)g切gX7m&|*xaRr?1{?rπ9' v}uJ,=>s|KհlTΨN(>.(`}2Tk%E866gh?m?@!'sHEZ]Wc-`dk2Oeڪ{ sFqsL{Y0Cq$z~(^h+Plw\Bfoiib ge"&>lf*95|fQ~G~6gqyts=s$χ Z2e k~Ϟ=Θ"0.Mz_okq~LKpCS [KҺ!I&õ#+l*owW݆uUz;>87[9L锑=Qp5NJ/&}b:{a٨S7Mfģmpa|;4k<'3KJD 0A*?5%]Ad vZB x_w.ܺ_bhBΐzl%L#7[nL'w~ɽA&r(tAQq A fDA,Kn*<=ª3.eU+Ιu{YQ}G"p_r<wj^3#2K9q o ][~)ICa^ʜL>HnlE ʹn4BxḂm56P2d*zo፱2exAMާT95yxkmjĠo4eFurH 2,Y[GbH^6v^B/Lxm*NhS˄E}C@~2pV>lP"6]F;[=[RI*)iܝnKEwN0N.{p4ws7FfbWk=d9@|Y Dey8<>ԿWuq#AyrG}͑ݹk[Pdxȴ /PrL<)50}:͑h5սI1Hށ~:&)mxj8zݱ{Jxd. ?s݆j]V5 |' zXVOҨE~;2BYVjYI C;s__< FЀmqm]{E-"@=! , ,v}&c$80(2S}դxo{teTlv /ĀN@\@ۏ6?V)ҥK7&0@r{Ij>XŽ~;n"a4.`4=u9oV ƾ"[)G'wUlt&їu,$s:T1,!cy9X{ZcśA(.n 1 {DgOz1F"\ QЇwUx33-8^ ?l,3%2,* y>@Ι$Ƌ X =I.,C>HrKjT{T0:|D4zPh3IkS75Ra 7 /⛁l-c=)S m‘'L Y:"cH׋r?$rw`&8_p0YTY*Suצs@iX:MvB*Ҍ=yQB=שZ]#,8$[ny_*{Rd056@*<2<'RfΣp>lQ>рCJAB輸 ɩ'd'&} -\+Fڊq8Q  Z/TFPE>lN$dw ;QD`"jtș"CL)P$Šϔ 'nNz8Ȗ_G*sp6.gHL)F~^[ b"_ cKj/&k9qzk"m h&@.gv9N_![-'B@4"wxq͠ƎUo]0O1,f}zCX)C8FGQh̓ $?G.,{-)jU8}̎fjG&NJk&2?aU}߸8U({G5xp9qbs#f#E<L!C1kt&7_9#*rEq(f7JuEAp"֔Zߌ9 $v%kPy14'+vGW#EsR9-ϣo˱>.m&6ӣ=w%nŲŨᅰ)zELQM>P`"I0w‘._~h2%[(#oϿq wqd%6, J P}ZFL\LJ2XwտR;Fb pYGahw8n"/5 $kpa<6,E_4w5G!p] <7$}܈Ô‚>J){ǥUR\śPTUTUG]@dWsO"Z1RÂ/&9rZap+0Kmoт15ݩk4i(YSjQTuj̼>2(pF,ʆn-Ӝo#mv 0C'nl'z '- 8]'(O: %.Ui|BLSN :=OLg%z>&هwe/c?0 fV͂j(KR! ?E 1^N(k~U7J0HEu ^_ό0+nFjU"S;nz̰W~ B[Jy‹Yy[x+* s]䟇P:dc1j#Ã0?y ӰU Ubn)g+NhsC5+* aFH2ýz8ю_<#h=^;,( -Ӕ}jzm+/b4y/&<|/-ߠ !" m64/HԾryr"4|M_iTקּ` ۉ䜅b-?U'\R8}B"$+aPwz  {~చX3Eҧ'"dʴJIr4[_a24m.vBŚѠ}Ŏ[yciheSgdcA&L0oCPJ!O/1(s'/ãpdTlgM r6CXsLȜyIɦTp|ɌE~o<\?Fq>`c'l)0ڙ)}Ut"Iƪ(?DI%?-2qSII bTix93x{df3M ݁KQkWa.FeBWk Wt`FvVUBpƏS΋g.~ 6dTFF?Y,4hΟb%,d@p{QUT9UNF@υh~=ۭ79xnOw<_F#8ތsPb :u.D%VU" iI췜rp+Q;x dNiy;cfC2? oX;y˄YR֜;Uv)i6XR+({HMO`'JKc6n]j|GDԱ@hu{? s2 ʴb4q=d 1\4Eq٪hɩ0J|;[_(E/7Kv'ŖsS-ā Ҥ"Co^P6ewRԁ%|R!gz\/׽U+ga"֚-uڨHstƲz5L/[ oHͺJF킷O' IW@[jpǔ4ͦ@Vl\'Xμh?&lnF."i| GoZ'2gTP𪄆w;i4O"?ݧ}yzww߅`E )ΔrZK~~N{C[4aCEhbƿHy X):Kd!(m8QsXԇvd{ Wg68A.ŬKJ`OhA;hnh >DZ(d.v™g+AFRKܼ:[oo%(r^H|s!5r~5W̎IOqI;_dO"7r6sDt.5|(Yc D׋ݟG `>mp{jRO6Eធz?+#{w:s.žu̔0XEyc>a8gN]NX^oܽ\;l7jב²ҟR\PMv 5ɢEIo$Ǽ<[ë`,dU7rK( In{b~kLҌJ>eP GRCu U2nKͣr8lթ(K u2 | |Vk{tjL'59 ⴳ'A݀S7:# \pY4,\9;~o nl;'EeQH)6H|$KAZ=Tb#^JaŰ>?x5U(\$HYY!D}v[s$ՓV%tala}TM^ƕ\V=QQ#xQ?g (ojm&ʝYՃаS$NCE9l{o倌2P+NkR^}ku~^e 7˃%NQ|71 >=;IT#p` dDy~l(51L 0DO>@}%?n1L۪m30Tby7-M:HWպA; =KĞMޮpvBZjļaj٥LԦ\dyqTnk$Cвy䣌,X1}}7PMFyB3M wzn-BHL&135γʵ\e|_E}F7#AdE0ԆX^C^EG#d=)6۪qZz>:ֲv*u`˲b[B|G' : eQI$. %C^^b9q! H+v̛#.N9o*7.WMŒ.A-[BP ^ntP-@e4PP]*1~;_H(>("RTT@ "ɡTȂgy ]7pOM"S/;_ mT78Gp ØqR%r8쩇JawSd !]Pgi,q#\>ɕ4 ├މ˺JE<ړ2]:@ڀà jy|@ͯ㸧wAW"u ؐp!B^{(g"!Fmل]uP|һgzeԘ/~}Jm` WU"g޵E@?!kr,ff4ʬ`r>[ LE<}!d.na@ I]m*e6\:3ׄr!* +}>VA|ث?%>T(|Of->E3r^M#,[d'; ޙ<7Kf`8g"64Qm WA!J:b*. ;&^{3A_6 @stv)j+L}K+<0c3S]o95Śz~<'p;⧯j/v/@ŐiyN[ȎX2Xe X9,?V 3{nR%so{Cut.cLRo1TR?kmgTuƒfXZF/n@50u,hN] >Gw~dX$z0`wEɧxnsUaf\խ/w) z |h>It͆qR]Nwr5f}FLqi#]_r׏l*[RDQtw?XY|g[BT]~`L5wV>ͫ=ZΖ.,E0NSĽ=4mq|mrG# -‘:L$0ZhupYKb/w sW*By8O̦3ŖGX5 xWseo-EIx>VyUbU/=άN:)IUtjө 5ڣ+kpB{Q%NZV_BqrEu+=!BW"‡mśB= 6\M]+ulyW%ᯒ;)~? $XNL#-SƸzm ׼{2ua(8Ř$tzm@)ܣr4fľ#byDJ),DŽ YfԠ|`)/~ KÏG+ӆMZ棏M*|$0!Db/Ļ\nߊu R pBDN_jrُu#L˸X}HXXM2QvϢKd"铉ʆF뾹8f]!)*Vs \BX-t]DŰ]z~$U (vn{;coCUK|71>uT$ a<Spg6QEFo8>3bA Me0NT$% sêy'T8`T[R`Ж/dq^UR"m$!!)w+AXf[h&r?zڏ"ę(\ʥScmO nB^I(L0v@Iv njXNYczyV(&ϦNyٌ&qZ)0*}%龥?NɆ>!gŧ͚@ItN^]])u{DhYΊf,[tt8<3 v&z,'*1r(m5vYkRac+tﺬ6TR;ÄJ:DgD9}&kUG`0MZCD3 G)(3<ˮ }RUV0-aChP#"wdOW47A(ސf4D7Ea_J:֞u]e3͎}-;%/WAQ\zuNU"}d<!6q=tP%cZu1|X l9R L;&wg9 Z*J+͈Nh D[4\pMFCqC7 .Wx%Fϭ oe]u'NA9M^e7dޣzBq>+4hО#-m(4Lg"REgh&.unijZ*&^ 7JۡQ+/E?*4bl:V4%#)D`0 Z)?!.Ρ@>7hIoX(/9 հ'vlGLD9ĩn~GQz$] uWkr 4޼W N,]0 4@acVEL͢ o- L ,C}#t{u#Wxze!a/p&'ZNϣF0.o~~a K]/Ts`[1,[5~Ym֩7~oM y FcDaR`4cL e׃V?z s<&׋N=b4(*&sdʫl7܈ 9'5c 2[ 4DD3YWGFc]u/-J'ຎش1zW8O|yGW7E秭ߐ3 ='bc}8?du-2бʻbXG[ )~9B wr= Eb^^䎒F 4L(h}b`j wEH3,W[atvba9o8 MTpjqG2΍Db"<50wpa)ڇhp( {fHz<4 r3И0/Oըm̀CszRKuJ$O#GeXT5ϔ"m)M+|>0b!k֪l]*J/,!njoJT.6J;cO ͲD6Ȫs6n E#Rb);֕-:kd5Y:Mh؎X2ͫ$Q+X|03jűW;8[Jsȫ@dVX`\(lL`^ջ%YË_<ذRc`{/?CGӸB]}ơ,"aw[0C|GenQ{@iJԣ[PN/[WEܐR )%]] |1eiʽa6a<} UDBZ~ tDG] [MkZx]5.NǓޜ07ۜc c"4r_Є7t?b@+ЪT`?,5J6V;:޵0j%~8{Μ2,30 a93,qU:Uz2 X*B{x^dȓh("ŴH%#-}i5V\Üj+VgD&S{:R8>yvghT]X2%[͊e 잼C3?⺭ ?TAg22ݯmߌUavڀPwl q[3Wb1Rڴ\^s>Td%.p 6us;Ci:RH0]n?j6 ҕIT~aYsv_Vӷ+)wPdSI{_ٍ;ܰ)< z?kZi,ltTؘZh :eZ mw,[V)Qg5hzu |[DJ2y2I]AvE rKK)S1E* IdzdٕK.RVW;́Dѻ'+3)wUqع]AOPMS2Q~vLiQc}[{=ѭ[NJA|h6(_!Ex6~F]\08̸3]Y#K62y\`Hܢb5/Z#-ط~`eN^io{ἮD""n=nʾΉeJZ{vz_I9hvQV{-'M1VQ[Vr2Lu⢞>x,XL py;t>Z[GEz_` [@ a՝ TUd2 +js[ߨ& N47\:E( olc\%]mr^F )S~ x/"xJ|xUhQ)ՙK/y>z}ln)AA<(֚ذ> V`b#jq1v=^m'yPKwazgv̄g8ݩϱ\zV+Q.sGK<2gP0Z/&w0KRy.CN; I߫ZBOzVjYd֌!'ua$;[BO<ܔ`= sٳ/`IZb15nx VI.>3-/J:C(ݔcZZ\gkaAoqPߛ Ãr3 . %5/~J$Ύ3aƮߤWirieN(: o{Fh\AdĞHVݱG=YaϏ#ZI8}XGFY=t/!^$'9*8jX~ED8:ϓij,/T 7oh5S#\rA1Dl/F9ftɈ  _yeuSVD> A y7Э츟d+(gLmB演VE'Fs: ui)Eh:|V*72T3o9[YiLDJ5&pԇ Ye>2)]F+qղOvj CDҒiSnzҁU&<$ Z *6Wd*3䯘њ>6|É(;%ސЀI9Hy/q8<EC*h@_N,~~B&7 f">1]`$EqrڌHZ+:!oxj4&}M/@ؐf !/RЎy9SrL=$jR#e$5uKK?GY(y]eXAroh(Z'8/eOӜZyzB%;GN >] AWu1c)WIEuE%m =2˘#5`ׯ`;\*d#Q2;V$/lvXx}?D4h&Mzm]j^7S>##Q~dΜ[Y jR8tT{^R941L1͠RV}ё㐹f隺y;Ȅ#-ۅqC/Dy)f G mgS翏~DʺٯĿ)15S8KmڤqB}(Y>sK@, Tҟ +3 ׍}H9!֒guշ,Gغ%@ӯ?Ad}К;{5v0ް٠L@Z|TZnx ?OeTzk maPc}M䅥-Pyo%s<6jE?:bw<\HR Wp EZ7Pw/, sѕO,)Bb8ޟ*d]~2rU-E5gL;;A[3| 1OS(ilX.|j8fF'so9\E.t1DMigzjizsp2J UG[UҽA,I)R8U3CTz>Z=A<}rPge8eI ~dn:j|;_4ϒbU)"DyW r돸6 z>A}m- ,2tA:}XKrnf}ͫ8';h~)ʁNtO@ E~/-A⥠]; 90K'0 TN[' 6ZZVVuOi2!W] 4RZ."{/Mٴ.jG{tNP~n0rV$s @z۲5G&?%p!η_F}#u hOz $JAļO烇夎۳Wrj^4k@m:@yv ?hQp>Q 9%ܝ=Kh.B $"J&y[@l&NLԑfk6ȽLr2{֘.z ,GJ ("8í}<Ȍ7Sl7@ܴ9\es)1sP.LcbaU^v m*n2֭srQE'}R .,?dd=1hs X@;| n2+mPLkB(ө\4N kZbS=);եZإjO'døH ~/sJRvdO֜#w}$Q/q& UL!6.|0wXogUyӾf@D`ťl`ҩ.;#R5MEB~|iTHޤ՟}[kd"U[Ǚgtњ/@ms%]-:aqVWjn޸GIuXg!b\'ףq9E8 9;(1+JJzq#2!5&ԆJq2{)oOrKؗZAu*M.5_2C`zGu@Z\PB~ &'2L_Fƙok'%dY,KXg,3~oeJJcލ˫wwi+'[GrsjF'. F3ێ n.H0V^+P]Vw YC1E`F5HEzNf "/jYJ<. =<%VLV_VV|~4ȸ'P@PjsȒ֨ Y@uX uSZKOGϚnp)l0dJ!@+Ł(=> Op<-#cdKy7beN?q߭:QTTQC$JI5Tɖ͹dk务6_ͱՍ$򁉼"f`Ҵ=63Ǵ);oh -ɰy 5L6/{Z/f[WK1x{Ǣ4%.fBhm2l} IACO+Lbm wwAm6pɐedEZaeDil b6dU\!du*1y~k`SW+ ؇m<1r2օ_ЖP?6(,C6Hy,C`aBd[i?jUR:&*៷ 'H3C!TEIdԯN񉭧M9 @U,)yj㞿N+69N~}n5.͙w</â"3_, #(pyTy?~,_֨ !18Ihb+G/2^Tee-ʂ rחZRRw#;pکxTUuٛÉw=el2uᛖRBvR]-TG$gq<|;8~sGY{/nQ^JoQSIkFBzh"$qm"sGڙ7ڱ.᪄jJRfCgWuEW)@3,g}t~+i}' z)&Cmxatjr sJJӛ!x׌]Mg*Ki.vbjJGD{] 9q4 @m˅Pv퇂կ(W@0jVΒ ishX[e $snfG߁ wS{f@ؤվ,kAg\qM2H=Hg+~/nx{X[.(ɀgfpdGvXSsv-iݝ{ᓖ!3L}1dG uLY Nx >t20=_8'@YC}m_ܪz?5UAdغ_m7o;r֒Pގc:ڒ&2Vn.1]HA7ѥא:9MgFq+ \ .5&|:i8`5=lǸiaZi̊-Đ^Tƴoa:&%l‚'3s'% њ8(w-ڦC\$F/q9*k#0ޜa\XR:l`a<0Q&{q49`>]`/tc1y=FGj`PÞW@_<<>QNqXGn.ہ w5";W`\ A /f  H%osG qY`=~&&?iA~iMb<h% 'ﵰ7:#[+@(le> u[ fc??@a.f HΕv12B.;3S :8\.U6Wtyj bid"CH'%mfJc5r0\hɋވ9i U[ /gؚ7yM.̘ä;3cfdYb<]'<ۦX`fG-8@PYqrQѴ|L&@No)u) [X#wy$ݰh X?Z Χ}8[ Ak S9^'kʀ.62]A^6dA`Qʲc h|U$C ozpH6ε9-9>g ?6:K3I( +<6N|UsaKz^k KB:?2Eⅴe%"+3LEAT TިmbW6#'f|ҺlA"+A)fE)jX /T؂9RGVJDT~S Bw]#m-lRf(^Eȿ8fE0J=sb)t2/ǖDa>o+6'J'Io\L#O7$ جQhK5'5?{š@ɟID |œF4I>]zCy"D~%; 8zJ$i|W5.׵6nR݋XIc H5WWH'gpʼ:" obLWESw_ô]pz=]ӌHbYoQKT}nYy{O^&oC$5s89oMF#1m5/ods~{j,Z>9 _:JؔLKQUИlRۊnY%&r U:3]M`=25{&HMY?H]xRDC4f"-$O9˲FK{ޝ %&n[#eB;Y>˜9;JTxeX޽|0bVN&Dx٧l!={M0bS^ ̀:ѱ8>@PW+H: hQuOexʫr)EZ0+69y X@"%2$M?o{kW 2&%KZe4/!/K`MJ1"To׿G3WR@F g"y9'E8W\!]bw&BQ"Rj5XOȈ촫U3; _y&C̩8੧eeLnm.~j9֮Ė%8-p-Gbt.DJB]L^@Sepdû dZ`_4A՝ E W(RO(sּݾz}ua *=|M⼇F/ռ}g"xfR))djżsV46{WyLEwf\2hXX6HQ(tGj<[څ\Oj~JpE:6jves~\F Ǽ5X|_Judd5bMn/ۈJWYbt&x vX"9.հ]SotK@hcm-]K]A/p:S`u?vnf4BMU`㗠p:%jxw;Iԣ$4~dz̢գ[q%'7Q_o22vjqȆ9RyTzp C|z^L[K69%-zѵt\pXl){ۑ9RnBʾHt0?fi H!?ӓW4n4:tǭ@FRU p45=3hE#qƔ|T5/fm }+o }DKFQI; 6 LrUIɩ$LJSljQuV)oiX(|Yn.t!n-yl[rg}&=$V_u}V^fؠ`'XhB}՛CQSFD6a*i`Y^dqv+F VY߻J2YQ\9{A4ѯ,SBN0UUIFp6sYme)"= zSW[+-vS3vSh\ݺֲ\4GHYPʹs7`J !}^dǦ0NlQ='+wC: nQqY 01ߌA}R! @I]ؚuc|v =JiG$*=9+/(22A%Moc IbK9J9v$Ep~*mLvAsKGOd$d_tX ™ ?8U&T8-(tw} $Ij|Rk"uEYTCsO%}y׾Ȕ7(faAz&kB.槠 A%"Kg@ -9}D=2TGk8X kPS|J+Ak̝k>@)|`ͿjkB7Y zX≼fXYN#2vi9;kSNQ0j d3R~T8>^"Aiz ݛiY_kA _|n#Si.{qߗ+\"w六-c{'q%NW(7? :tpt&4_4T\[nY_BC 4põ0]<CO*K/>6dXAz'o{@* *#f)t1G>^{%иM d$dœ:Ld4N29/L?yeRvT㵃u[Z.NA ~a4$.]+o#;(}(Pm&Si"哘ɕkZ4;zy@z1'eHAH5p %ądA^Вs#&0>[C <,"t 3;1#OBu@}oeI}42H( U ӈH>XQ߈bz[z@pP9`Aƅ&F!PGPGi|ZۋdWNj d~ORDa*5G b?&-=fo:*Agf,& XjvH9 qӼ?uwui][jufX1K7>Y4gԺ*(.pZ0VgcP`:t je($)\H%B7A Msx!uWy E2鹶_1V ͑c<@2 FƑ*]>W7l9#J)O-'H!I]umq*,<ȕq ?73ck;ޏ,Y "9욺/2Ղ_(DCűv;QbE#^)hN4ڒs&6޴Y?|[c9G4 ubk>z^Wo<.9OmѼ@_0I!QvljXQ ʈ;h$/% /6P/H Vw<2{&u>pw{lz fom JO/FԆnRWIY#f5Q͢[_{Hqw&CxB螓})?^@3yO}`ݧq)70QKD!}wA+]fz?1AU}^y";JNU\MNG=S\M!sT {nj:C,'ﭲ"q:[ӈ"I38!d|63M^ىQ8XwcIfSԵÿ٭ji֊,s 9㪎<;͍b2Y+}PV]fEUn{hwnڒxr ,@o(73cK0z~;OL(u$+\s5his#-x}qn8QVYXN0gň7 &->01[Es 6(4ĦZTA!⁗+`QO}7+x(P5rq(#'߭D-=!F֞v\ i^%@77ٿ՗|{oWdܖ4Q&wdUmAo:|r^:ZFhN~Fpa=/cldF8ZRt#YBΆ74؆js{_U>Ay2d"@V ʥ Q75)Nn֡(yM;qs"S81ϰVrX2@M ;d8~d3"SSL'P#7<3e}og#RUv,\x# *zLAA*B}1 TΊZ2J+d.rgx8Ǽon}1]㢵.й4v%#lQT~+K\m4RI.Dh`~ R88G;6'H 5.-T S.0ڝMIޱ2@; [!-fP/>~PY k vlg|6hjoZngNZ<+Mgq(2)OgRnN۩B'2h[펾wQ f8 -&38!c$LE`~(Tmt_a_U ^7&= )+J;Jx+hp˯%L>ig-R$Ύf5,iB6B i=Hr<[KYMvb`ucLK ] è^{k|(#v` 0|&D%Xډ[Ȯ oh(gq݀p1ls|@!6yRņǮBDCR,΋d;ע3%o-|Կzi-:[TU#qp:7kpb R}k`ζw]vmEٕ #QK!zω͋M*56CE,'/Em ;ڒhcp  Op5rVNߞl ֚yc&|HʠM&ǖspdmpX鸗]=Nƿ.{yrg |È m2DMwlK(/oNŒ%W -Sʐpl>k# b^ :ӹ+.x;->o҅5`۫&8/@ق2;QkyI9qe6.XUA4Ybp(!rd3@7jHN0I+@N U:_* OڔK!g"Xy2W:Jo \ FB-IpOhƲv9[JxAͪ]]>~c:r0 NzsNۃj<ܠߠܤ,oUc8e:Eg$JtoD zy.탼b1rk- >\5> mʝM"k- bTMJƙ_{'4D]h\/=F|/=yjOwNYЬ ʕ݊pZN4=){_w"LhЯq6k[S QtMN>4ULD oU5A`^pUMO?賝lǑ'4-H>K/WۉX6nGb 2B|Kf2%BTbs7;uQBqg?H _`”tLuMOhD"z@IDLVn_fcKFx˦]3(5ԅo qy4/#jw%L'0NWRH[BnIL]DK)f~0ԣ%Y~җogy@ɔhzşJ>? Nw }k]9(viw_^I۪}x)L LyDq-iL\ Xɲe-0}qP:2X+9T'l5{-*e~_]NX ؿA°#? _=xTAmsNJw4׈W_?ȩ(5RYE]x3oZvٞ,1 _kHJVSY^Z|0?ƥ[^4AH;VcJy`aXMUu]F֠gv4{ly, <ñY_A nWi؀5;~ӃLe#dn8kdfv>CQ+8 eȬ@k7( rs4"$rܽgY;Ҹ)y7nm|S1ht\|| 45I55Fhi^\j稽vMp;Ԥ͙ԉĨ o)f!@?W*̬P̶Ћ/l- y.9t2$ l~4h*wI0dƪë̎J𰻌aIsUXXu)s9lmEFܿmH" :3T: ۢ H ˚i xZekS>uG ąlt44V\Sf_-B/GH:&bZl[^h퍂*7R P{Y;U$644"bWE/lå~5"N;c7^Q $W"iQ܉Ʀp^|2Sz_v&Tx +lߺnvn;$۩EScVt\!<(n")C) )\̢~2D B7)c͐^FFO51HHk[SG{|X,J37IXE+\SǙ^4OGc;;hwK܁waQϏQICF 4']#i*jl&FJR6Xw'=D1PAj]^觫hnyΙnKw'o,E#&lD~HC/D*EQ p 4Kgp &}އLc$^jW 2rtUJ~N< 1q#SE _$/Uc&df2Yͧe @R:%"c"dITi䈅|MX|m VJr*\ur=B -^ސT.2䬨dUKNv?ϝ># tx[B$]*~y :Kc" |uңZDQ5ib'sF,"|AaŰv#3 czKuGҥj|ZV.τsVf~&*31 Y؂0x1'vx-MNtkq"l? GQ '4zyʅBTu\#s:eCQ8{>&;2C;DD{o{e^V дA_&-n[ K(-8pJ\8X9|z d{ ;a'A< Cᇝk@{x&DǪA 38l־~2OTk1{k\ YgfnxKQ, ۢ:HtyxLclzӭ$ Qwnb@j5V7ˇV $ހloAPop) b]E'9zj7l؉OPq;9? Kެ0A#sΝS^e98N|.m\=Ff۳_{һ>һX[ҍfbGo!=>|'Vs"7lL݉u7&8ZwaCLʌIly(3YAT#*l{jԸt8Asd}oQOR\& _7aB7/.ݲ~nVbsT ># ;-=NA[I96N_#lԡRXZ R?it MBĚ;ځhNu0BVbj G0s3C0'Q4A O9]]]ޒcRgh:5 H<(Ғħ/23qk>wdb2-V脪} \q1S$oϔP$6#t{ *z7!1*JP9 "K3,uu||2+cpPzeo4Oi|9S*l?y??CG  BʕFER_OM+mY$0a8%mbDw01%3s:=1݆L^G5`W?@T%f|ʗ%0a TYПlJpmLb.M*>rc `_12f:bMsFs"`B0\I/Z% DE}xz,,VѐxMO*Ve{ VÔ[Hn"ZՑU,3:GvǮ>% jHE(q3KfGzSߑ+*ɦ{=CM"T4v?(Nd-r?݈*shm\{v۟86N(A}FI* ⫈8#٢K# #lW2=H7rV+KpDS"q6*Q\\ɎK\m3"B 8TH.z= Ȉu?|M%/"X=Z]1%L/d8BZ}GX'74?{`rGcEj=wup\ TjݕO! }v=.1 ~V'eƣJynQdAt-ɨ\a+ՠ P* r oRJoE@O/~pTEEU%'kaW`&Z>8]I{̟-b'h Ҋ?AI u _4Jq $! Ʊ|`K( ެ~/K[N<rIjRq9ɋhĺw6m$w>gE~E(: A`3] 4j;Ulߴ|4IP]pc[YFMj𪼅4" Ilܼ feߧtX&ڧ‡LGZxؽ` Ɣs~`@ї-e8qc M$f=t10sZ'ϖ-}nFޟ$a( {˲TS82u2z7\I(WM+oKXT8`Wݾ]?*GݳxFGʌۋ()uxi*;Tfq9O!U7+ eZߺNBQwWÉ>7?j6(W{!5. fP%"4z{D8ώ0},7$Le@s'\gn{zp5RY˝M$+j_idQQ/! /[.iɉǒmϚcehZ`Ȋƥ_e쟩WԨӤ1o…@ΦRZ y-)$v̹*`ɯEz"SfL aW_\"OOfC;RQNH<xw# Zhܳ yfiIRs>n)1"M P^{-Ok_d&ک7 ܝ@#ҥN']8|J,9&Gŝo\=MPBm?"݆Ey;q8VPT[(lH5/8f.gw{-9a"ѿ> -ojI?Sn7SE@eMJе^(oYq釴yJ<0hP0L~E8n*%! JBlvW({Gq&r ➈rkW|\r["w>yetuMVp]a5 뾪gv#藰mq% C}_%E4Xzp?aO)ˊ6YuIVQ&Ѣ7MwF|5sAլY_!O$F}>bp|}|ǠFdb߰۶jx0AZceX2c{2q@"I`=OZ= i! :V2ڔB՞ڦYnGe{ceL*;\TQ9)'HGWV:4DTA72ujB&̮U7_ 5ʧSg&,Z~SZz¼ sS YeCI9@qur)8k|`򐟀xMI;m5:-Yyq<?1k-^ #L|rLb=c^ZU5rA{Oy )L6'!}&jkI~ 'Z,]quSu3aa jw&84g)Kq,1@*!CMBrz 5o٤_Enh17 \k8Ļy-4V1̸7ONuFҸ ̩֗ 畣mAp.&o䚘HWmǫ$ACVF7Z륺/Z6ʧhtNFop&*ҍ&D}jUעyWhKxVP*z7wU?_Rsh %<*<L-EAPE2^F3~!ə)ԿEÍYH!x2mEyC4JXf›Z0g,CUA ח}1ihە`Ҭ$9wvV$[;? :c<ef \OLds.䐙, -@hڧr!)TXV@㞸D-U$+5tG[jP>u`# ikQ̃ŽZl&?hc%,d?EДsJOz<>VCkx}êA@]j.P%YC@d,-ґ[vl+i7YXޜx)/eS,g<%[d>Bx!-r]klt7TUI&j&1 #K?DexQQdK⑆J[:j)) MvWrHQS+Pr7^M5'C6e1ʌɯdrxbW>k6m>_717Y.jj<˝C0$!TA=idY ::U/(2W!WApto&d{f8W/Ȩ8iJh&Y5;uU=.'iO¢nZ('C)F01|%eL^ѰğHɴ6U5i^z8A@KC]o)7g)|]8,k)ﶢh:ZA[zkzXId֬.%}u3yu<ptI:U;2R`|WyL*GMv|G"oaNwqɑ}a0ޢ"!8P!^]Yġ[xngƵq@mܷ\L0W5(3>IDϨ;-osDpP|Q`XbL /bXi`WPӀ%Mk6{Aרl&#Q7)բsc4 9U"\ ~:U? vAUα SQ(>ӱHb!љ0jUp%v@ۊzuTr)ZBكB'T'btōo?`^h +&Y]DLhЅ%_Y<+X-'HWR>(LnA|VOSsU3`ғ/ۣ\ w.A;ϭq/,kt֢M=Y;#p^g{gՖoG7t)T?d6eTPaMhgi"R\DYxɺ(M NrA*rawIsmZߣXً'.@ȣ7lo+F2%|^vM|1) `h{b׽-TkY T=`tI\h t}!';do_8~ncz<3JJ˱6! GA2{#z=,1Kf>-&^&ͬ6[*T4^'!^H,,!RcA/{\#58h:t\^ `~iúKjQyW"cWfsg+TߴߏPA?k-r!zP/58g,OahkEVo4Rm]%@yEԝ*>_7¿q@'NiC "KK]m>W;WjuxVhVЖ5_]pv $:ƩplĐ4>6/=}nm8g!+o;MMK⿯2,>Εuny C=FLjq&S̖pGLvv;:[yp7EIcx/ &fex-2j* q=Z0莊eZ_{Y0iܚA'Tw -:v6f_JaXr39y\wxͪ~~]>bcN(Ldϲvekn>C\Ks~ymtf:ߋbE#[؈P iq=mo|8>$gAJ`;]LJ@ȑ^b{aZzBGc;ot!Wڢi]a]E I{B0{ ݇Kdd}>]PIifR'4J^zXTxVZj~o-,u$ka|<ǯjqjE\+䔜' yO w/2LҘ?ؘ8PhnƻO\T\7s?z`+I^0R=؇qt {F$3DPũ766k`/ .HeX.6AᧈpUYv(RU>t3G G@z|hɹz fbqg,q^ $Y3dsIjk=пDJ(sgB )CkX<_Yesi3Tt{y =>$u (Se4 sgrFqȁAkYu?kw-UcB^Ƚ ʼn eI|!=|w{۠U9n~!CNa`hqxa,qK a5}4APJ##Qk5y#1yufs^*дS> y6S`CYjDdyz:4KV|d$5pU#pS,sq]-UĤvo7OUvLl H3;KcP?g-* V) !󘗪6x֢ YMlPR; /3И TE:=vpz-^y4Tz(+«>fQEt<l*x<[c܎i}A a%cH%#}y*ufv#[C^|zmzb5@yLv5JF%6ek1E(Q C0Ifz&CjJ-yX)'P;VjQZ'dfdnpgHQMsCIXU)/Ј^F;c4(0W5S Oު-̒*SfSZ5ܸłQֿl* 6fas47t6fz>,Yq>$qf&Vo3ޟ<n:E y#)fef|)rJ<]3ߞ5MT;>;[k4A̵\867mm,*hYVRhiSj ϛ'L9, Da* QN3#- \9j!;7z{:=Qj6{^ SG-Aʶ`. 8bjH_^HsͯO릭N쭼]x漚Ilck쐬'2j["M4zԎ` +T{yyFd J"!~Mݸ+HV"㾁E薠1a{NW_پo*/F5AR](t„] kNt[/pzpa]Q*UKb]2%o5'?G<4-P~}y|'/zGEчDf` nTظY2!2maFu'&xjwvݦE1o4 1/p*t_r/wC;3fA7į{{+a%Z"@3i7LE30#0/0 :}÷53tG GIQyATED@ɥD5Y[vǟ'?0+9!{.MK#㥂 eM#x`0Q gBѰ\m@ Ơw= π~Ie]|.p ߿p1vZRQhW#,qL0:rLf6Au.W' 2^P[AwA5-P<'U:'E*`.Ҁnw@b/?E58e֊D%Mz_d|5q(g|O57&?qorY7^^v`QHHm f0մMJ}Z"U ޽8gk_)g3E[>Widu$C$u9,M9*9`/V˕LP[h2TbH0*;F펨fH͙\EY}EŖ*pL(9P? \]R @cq 컆Qׄjt?.UxT;Uy:}LIĆs}CJ3ߒQSŕLiό;E? |vdC6 5- OSqxX MJ Au7hk_b91 O %>mvSN22K}Pgd{m7dp BN;.GbK3+›E4MV]Lo\aFfO'08~)@mO0 ;Su,=Y,v>ˢ ?>C!"L LhF=/W6?tЙ)l ei 'Z%cr m23jZQLN2fh-[v+'+XJŎg:bاR9?*Z{ru*I%ގ&pCN[Vljv=b?{MK/<dw$H)>|v ۛ\π$LN^ rq( i8 +>@tj4VW՘Lʂ^iVy>cBjh͓tzoh01䡐"EAJAdԶBCq¶6[F⦄ )<6}ȧZXAQ:ݒA/z Gۇߎ C˔.D|3󴄁ӊlSRGT 46 ,"=vaNɝ.B6Þ׼8t@\H.yט!މe`Z [,i!%Z .NJVM !WU#j:̉>qGPoVʜFiZW"_|{ؙlD>M߼}z=r_5rM#^PSq'*|90񛄰~=N)C#. 29r(fXrOO LZX! `F~xW|jG&%/գZ_J o_s505-$)G X9[&l"]n wp~Dz ?@Ѩw7č8Ո lwu\%$^].Ď+'0ž0   9e/,g49fT=׺=1GٳTGPSڃf{"hAzG8WEm0,V=]$>>B|:.Vkˎ 蹯} ў끤{t{}PA[{r1U/cC|,et F$N5 C<}-O45K_ɣ[ӥ $QazE(GgA/ \Fzڐn1}#*< ARN]YZJ]]"]S٥t_gd} VӜxu!1C$ <9ƫ5KJ}=re*wŴ@/aD= ~U;mv"ƁҿO=nɸXue$̠pf2~p&A5ۊ & W7j<|qMs"Yy~ sOy;>o3!-s +1ԪpPp}8*߈- uZnȟOPwZdݙ o ?q{.:FS d 83 g=P+1~t yPXZB%DClKEd"Xe{aGR]B6/bP$&kMCǍ7 Y+n)G2h6;?&F1hJj~E&7xgYTenOԩȯb۷%.đ.\'tuO$SKK2Z64 ż@?l,'NL:RM~q_Τbwl⛊"+cc隷HpX8*jE]@>;" }|ɂDmT F} {Dvndn˞`=sF: nɦ߆m5w\x{$iB)"HS;{EQԊbg>C¿u5eAkS h*XA,nky$59N E,i2 O$&m6W^Dvh})7zgf(?*Jfx#N}gҴ "ljuN; !;6T}`tτPo{ú4%ÃL:0򉨒U.2NV.ƒ>ʱ!tt'_W?[Pm[;^8/Px" "4=4ӟ픆>yM3: K]A_@;cw|߹v=Ds.I-@ v5dKwɀڬ{QM`"EZrrrãV-7سnZEUj(rAʇ#Lh"`h{@qf&gڣ}T3QCy%b/Ui~u}ϜI^)RQ̹Џ%5SrK : Ye!wQ-|y$i7q|{j-O|3 @{юElJ-zd:2.O>JL0WfWN\dq.ρNGaH*ū%ESʤHFǑE*n^Or>᥾)kŗ~#QFSچ oh^΅S!˥AI9%Y"ChǀlZ"iJGm7!SEn!6 AJJNqQtaUZ)r KYEYuuÕGlP`16D\AHԣ1T0:H-X4'A*׌! 26CV7l~cDi=iL|R}|*"hTzg,H7|U&LdR-y*7\#NQuȽ|QxȔMі\,L% {ә0DTKF8T6b:;;޵;Vbh|Yvqú?ih{#5ydO5IFU3TGhtgܹLewT1@,Y.=dvW"=W#R~q=͗O-f0!`ͧu*N9,OHDzńzPcRu[ Hm'jZ7h)*t;"|41X|˵L]HG}nϴDS VYdaa,7w0:,gHoZsHfs%戀j+_9}FR,k`g0=ۉ~!6EFxPi~!?|!**+%{]%~iOQ|6VnI>ld^nDwѶd)2&t܃e&ٶ m=}IdP\,;OQVW<+e r숸*S|o8G%T)PKg"x2ZԦ%%QrIhn[?I#\ sZ_ 5;9hxoTe@~FDzQzMAcl mZQg6x/;4@, L\Y>U_}E;m!&|>{H ]]H`r(toj$ps2Jj޼F$rC?p\6:Z DZ=ef&ÆtR ~^!{yFn8J#N"ZlaPhR]l~@~X s8!~]%So f*U,mn]&7tꍆto7~4Ϊg!R3WC({e ֕M#m1  OyGdg C|ZpCțgᆙ."yUO70SBĞUu9I]MQql&`a Y1j7 p9)q>\m v@+ 2 IKPrd a$\ڪqwN)p[-afHɫ*JpqmKk ~&p(({#.G S|m$Jo]n͊hZ%W?mEstPjfS&n,^ݥɴ_kυ?Lɗ+`QlUhNҊ6D qӼ@-ƸjC Zl]aOQZUhjPk`Y;FV3`IS+FĚ~ikѭ} )̛w5}OdxUɸ3xZ~/6$ȦL`-!*iٺ9D8vd}I0<I%Gk5WֱHnwd -Fh4H ە2d ;~( >nꀵ1Ȉ8rW彐Pem”;=]TTF[բH5S'Woi9R%Xv.-m 5 )ONu#B"r酕> Dod97kOffIs |1м,}}zwP~a. ;e]1>s<0Ňeb`i7/֚J p`1EfkPD߻Ŧ- L<qj X#E}ȿ[WÂf!L0ϵbAVB /},s pRfI# +q5 ig"h9l` eL ٰʷe篼oūJ4.D[Bk!So7'>.HFRqi3pf>`CҨw9. 1V5[ 4hT9Ag3j" y8f(0 B׮3Y),yajOUxx]^[@W"uWUꇽb n6%ޟ35EI@iqIQǗ{?Jfj&KAMh*H2 XtoA*#_fgĐg0Y*eV e y g;Df:ݭ͡Τ昈`Ra8e?YT37K:)^w#G0 5dΥ6u9a<ؠtN=L3o|XӇsv̋&-P:)l7$7 dpA*?& >\hܱ.pj+ E?<$~W.Yd|캫kTojvNq;zKtkZ%,`xS'(=PI规ėAsa~^(D6c '32(4]\"[:ʇCT;+ȁD 3{QԮ%8(~ H~fsDbJNQAE0uq(bS9~?a!_`gų343ꎂH$F qK O9Z+Q-u^AYźCsAO7En9&!ߥ$Gl|e V 1u?_a#tpˠuQe{iĠuIq}M"23wEUq-RבЏЯTly$+A*@P#J{H.IgWGk1w~[-'A3 y+[6ʝI#In#"DDi5#vH>2Dj@q83b}*CY-bىO gS2欳c!zH9#RIR!KzS=&FB|zցW.Fp%uU׍{=C2(zX 1Wa4 ^J!sY5  IiRcG 8f/)24XkTk_[P0[/!*&a߹x84aq:!3%hJW\X m0V`@phP=,a~CZʔ KN,0YJ Mΰn*{mCY}씟5 wy Xdvl iq;wb.>lK )ÆK ~z'|j̫/p}g_G bw8R'}EǗj\/cUi<[z͑uΖxiXR넿W,oٟBFߏ4QtJRV޹3p~kXKS8[!OG &tlLD2V +BtC'\@} &q{VZÌ;F9lq ȕFdEonޠ4Lb7 bF2+JSo=lHl R5X#w}Kf}r%{8P`H 9wފivNð"s_MI%d$*k"%cL,&gʼ&pf% 5%#z~H{4XH-4$S֫#uqt %{+۬bԳ+#NWOpP A4 ('G;c.y̠G1V<0X~aaW|I{ ,~d9͙R%:Zہ^ ^iy^'dQKzFمSDT|k2#E4&Ag08 s>-h?u+;ވRˬre^x:}'iVxZi0S6໭M =ƌ\,x@GCڵ"A{ Yvg#l2~RD-UdD.n \YFʺz@l5WR#qrD]/ .DLV7X']M-*5 SpD~i`A6"H:a-7pvUV C96/xM5 qAMt(oN`a+ޞGs1: ksk$I^@Rdrs`%̓d"moxauF5 $=*#GQbAD6RN<_d=Q*+PC r愷W[f^{f]zЀ|aif`l^A#Qk>P7ZXB+^mTW>!X0;UJAWnr+!h@̗Y>9b|]/*R:.)2ˇAnfWR%On®X/d Nc{Ù9 +|}kdPn\e#Rti`cz.0UDD3yL%_@;S`P)M ^Fh(QNK=G>;Ny(A3u<Ǥl L$Uq39KbLJ8{l/*LV v ]Jf]q_3hC)K4V];ۭF9ˈDqX~|נh97X{agbzڱ,WsҠ9M@&QR2@jg3}8"Fl1|FVANΩa qmZc:g x*3UP~rt'Gç}&/ד33]j&yZ]1?.p`0^u׵ǴZK+ A+vy)NT\ $~0K .k%&YDB!DܝvD/ppQ\r,,HKVͼH-k4I!9(LA?w- PJ_#ұl:9= fy}*?e+y(~U jpikj~T :';m]Ib-k0y v\O9c:K49X[3g~VB1ni_3uN<3lq&)DTU 0Po鈍wN&{m"e̜ͱH_T9,J>љ<,G)`5,j7蠏s'&Y\㟡loQfvPoPFU9HNeOO E",/pf2u-ًdqs! 8^A8)$C0w5F/nR͢X@) A OTi( 1t#fw:^W}kjjRr`}Uشv(MpîסW?8qH? >(X?j iL8wj UmFע3qW9j *a1#pK.D}#D—х$C1o%=ȈYT80*hi:2Qjp2dQ.cоc_@|}]]~Q_NHQ59eh:lPsҝ]'a2;7.PbQYWO]{ Ja|Gu-'< $ZH \nyvn-SؖK8K28kxm:+h#ƺuuq ;mVUkϵ2k| jI}mK\/4/ A1ʠjq2&f'ٓI niETN~OZ˰2ʎx99NVĻ7T US ?dzH/UD<]j)j?A$`}swE*_ iKmDR4N\;)z6uK)^VK7X0k7 >{x100t&"`oPIcX6ϭiƩcJ8`3!Z|֮&:{G1V{/g%Yљlun_1yB,;'IRep4ta)~YspH9v+¡/;q"#!ƲDJ[lX3eC~հz>~_Ơv!0=*>,K&e=N . G;P|[U?7F͏!SxeYJR;Hs N֗ sU5) ]~fOEgp &6*[ @&Z2~bOHøM̦V|LUE3ZwVa~%9 +Z^hdi -c;EWmPӸPiM9%᳔>pg$(dT~:M9`ڍCSӚd[ OEF3H4Nr֍ؤƉ4LOS V8!C[qG{vC@ME  q '' c?7Sy])v߆u 1_I3>t> Ars-]4[wk8?d"fEzm:=8 =6}:yjGB]z5 )L\MǥUeEUSzəvS-. jgȅ^;\ΈG٫Tv[5J3} [XC:*8CJu,=Sm%Um3k׋łjt+Ja@Jɥd|>0\C֚Pɳ=g߀wkೌŲM EB!*ҁ@;+ob_)u7EUvE~nϻ[vRu4{ZEd+!USNv aOlMS3 (Xb|>#캋~YJ3t|a'o Zs}sMǮ-syp^PP" ]P/ca\ ˜&5 p{?/R.:I *cDRA3ݛ b *` 96i<տ;򇀀R \ #V֋E&;<A=()O9 c0Ѥ jANˈ~dc s^+:9ʩ +#{ SArZh4c tߠdo2!w*C1S>K:-nŞaʋI Y]6E4S /: ([/O|{fu^r ְ}xn*ϫ`ڦ N5lʇc8,消X?VV~} N)ֻV[AGYu3 kgpfk;>_hDr1F 7euR$O_ΌΒ )Sқ x^#fTCOù'7T Zh~LUa/eMg-ْ|ш#n/ ⁶0 U dz (^Iސ~DOHۭnD4J+ީwKqPVAWNkVGXIxip=gV_ Q0K}d]Vf$$@5WF:Q;脭SZ&xvxTf==N! $mrYdpFF &96%1q=Aʣ ܣnCx̷kd#on1h>%Z ;2TNaǑt0IeL  E $!l9?$S91>1ظ_"JD& i.Cp!f>B;0Ns?hѺBxc`jsm|JN \,S3}\ts_˨>u/qs2>a|SUxxچBR2z15J<_/2tTSpp1=zI_inb 1%hQ.ä?s $8;dB_q|d ?"z|^Ѯ·1:NZ(Az=otś*0@ƴ!P06W'bpٺ{WySڸb-G5:8z-!H kjTţ: nX:{A,[NRŌѦܨr?$h)~Bj8kP"PaCc5M7N8i#s0,=QEvWu>ـL bT/Fnv q5x@z.lNJͣy'Y{T}ZzsƠPE)ck_ OQķ!Jh7_&*ڸn@ؕ9 @%G"է=Uryz3GHfݐ%`Q[gr>K^?frZKBkͰ%vڼQgK^b&nWwwuS(͂g GnM;Tu$wr2ϳJXn@P@Wy= 'RƓaX)Շe~Y2`\&OXVǭobsjMF\#Ȑc urzNG[h0x4e,]su&i|,KQ$Ts-&c 5KH-J=eLi :\a븤Q%~V `i@U v甑Npb.ˈ\i\2UPڐI|OW@dž# ud]RRW.Gz4>m8" ȋE|Be1 s>gya'FsPr“hT}Q<5 urÔs^Klz!{ Qa4a, ~r]_7'6<%%X:i=/K)d5K*txũFOe=(#Fy'j?!i,/Â]b F*I7e`gS~h/^AuuQJkc7E\6"Bie1Vw!IQ 2zea5n?=*Ц^B_0N(jM9BFk\ tW%tN2 c.iӶ[Zc}H7F\zpȁ*1 {j\63xfNa6MZ$g ^hd6EGյb>ZQ9KW٪r1zWJiY,A}V rmyJ\׼ _xTcTwG%[=)U/4_~A3"@^4籘L𳪝@9E0`p+m#.-"=B-Pr} \W0aiaطE64[[]F.؀r{h @h r`zpcs KW DBz:iÝkw~/ Lg7g`##D|.׳L0G4-K|u7YXY}_e*m c5 f&^{ 163+B,;[(Pق @; [r5Y6ׯk_uFmMKV݃TmOv)O&83l7~+UR&\g0µ(L>|d%+oA;NbKE{<ڎ,ҡz+z kz4`w/}>X\&)MFBy:E_N m2ZCzdV Q!/0ߡ/\}Kmn}/K)S%3SU؅ c3BFf( &jwO`y Pè.#S H>v eg*3/iB `/ƴ~ gG4wS %N5,ʃ@U? fw$+\Keӆ 2ǭ%j CGew8^;OBbu8_i-Ԝd{a;UkgxNnd85 +}CDb#,˧5UQ O '-"_!,rqk{ȏk 3_]CUQxоQfE%d@\sP3}M.G|3% ]UkHnrJLL~"y 2W+~?di~lz+]-q &%Bߐ$`]6e| t og_ x reoI)[;.R2]νلݿ/JFƦ%I&dAyJg ,2,܎KE1zx{w`7 ہ8y^xV+v/0|"L`'|ȅmLJ^0aP0A*BEײrs/+QW7}\և ea:j.L{UN@4 M |Fo?D,_+ wPNܞ6<^5 rHicZ%.V^H=9^ʇ>[ n?F!0@lmDÌ g<0C$idJr VFn+{Rzw?Aa+~$DA/vA}?<}$fi ~vw ]O *.$`ăgAI%B4xH>/EO3U2:r|\hmHVZ!Fr&! ;^FfugAh'4=cSEW ;9bÛsO+m⇍Յb2D6*]&nd8qhBgEfhQr3r|Tx37oBi[+P6b!CW:Sy&a+4*1JL'ہMf  G*[Y:ݨ)wq-dtKndݯ\gWC0m0ƯrGYwærɖ(c[/+Y5U\;l7[Ng|tl> [qZJ̩ؒ)yIڔE8Ա74?DcP>C~;87hyl~0]G~DNz!rRD %|v6*'sxav/r ng8XJNMvJQ(٣a fl K@qTtvX%\_F}ё?8-lFFk*;x:9ĹBox4rY-u[n3pbiVIڇdvS7h%([ƶDU;坃\%i]9QXNܞ+M,o65HmL>ht5 +[«)Z xY:Pm[߀l{rZBS܎§QbfNE6'7¡L&ofĽ+;'`=ݚ=Iz že[vx+V!6߃ kkA ' ]0^]5ۇN n42DTfVxZMY_;$VBŭH$lCĒ LKiwP~K!ҩ۔nc/ioe.Qo0҈װ|2LcXpkXG$ЀI;v%2\%K|g}qN1$C>RȽ H (Z. EZHCGFYʗl=4]ᢥ\Ҙ=VYa.JڸoT8w]kI14z.!p>D2 q],ҕ&HOl[0s )x_ a)T ۬)!k tFȝq;AxfB æ&鶹a'z#} \ s.*uB97~T=SWB=%?l|>yķE6Z {6є밴_3 ק2VKxjE+QSHh.\qlƔ#O NJ- z@`J.#)ՔGMmZ%皤ّ6خÝY,ZA< "^SGTǽ*,D+B|!̱V(1|ll@_Dp16crP  te8[{w%;Ʊ͌vO6h> 5Ri:GDș.q蜱eSwHJ2Ab~+鎈< w 燫qSoh/EPѿ۵ @z~Gde!N%].۲ɥZU"<:^J_"rAKd*xhƞ$=V1_X0j}cXJ7>μFenL~)`n%ʃS@ %'V=)c/ۻ.@z50?>r;յE%h+gXOPyIȜ9* .s|lI*q[!NS&`7jOҤI/Ƞ7eaJ0Ee R~6.L 8=Ym @boF-S@f"kmD8Fl2,l X1 DF2%6  Tvߥ (]z~| ~Ls H3d+ڇKt1([*j`>|4b1Nm%)a9( Qx|KᲢt> )"(M4dǏ-~nߜW .B/Ig'٤\g# ܙūLWĎu"b|[H1w z{7 Z@ 6lN7Zx ;q@뛡ulIx-ٽov^^dH{G B>_d *NJ#Zd_L9IxfI3rSj&0D^rN7}TF[Q>%FsJ(Yg&hmc \h[$WyN<ŋOM(9S%fr]0H ^R &{F:7#б|+1~-sin̈eS!Iy87p'e.YCՏb !71 CF#—XKL.X<1tД`$B>&pFq˄Rbu]6Z~']?hO 2 ,څ&C]) yx+ XVbRPhۙy+5 'B[[G*c"ݝM*'f~?]tШia㵅mD#gÄ ,eES^^6(([hUP[In@T*? hzzR:Hyx9ʚjeFB*c.dz7ʿs",3|([F ~ !z %ec=#7KLGoԓcSKYhOcqvͭI9f#BfU}ó| ^ ڀ;-PhA)"vh4UDhNhj7@܃@rD6&}`P~SeSl{ NKt>ء7.{x>j>y/'4.!Av،=A3E%-\!O^+la3VrY&VqA֫}25I&=b_uB*m%sǼ6l;RͳH8 1c jۂc:5w5lT 8eRcxE Z +J3ꭚT4)5"ҚJ%)d7R$$TlF؈v`zL?vtSU,z?ECZsTA0N@Ǥ yf`go4\;س&ˇs$@/5 v,j{)F%ҾG\:[9\Q[ #F ]i9AwtN9JǶs[s }}K^hB?AĆϮ/8#X ~r/Bg3POݩ D j]MuQ{}XJ@v5ػ/ц]&Д?Z]]"c\[vw;>-e`a-ky|a7TɆtcF~:/W`g?=T[ g0VE>I`yrvƤc D03ז0~4ROʈ5~lMUBf8Ϸ@bMrQkp(19)'WkxW ߂ ^:X՝jvgժN=v |Qôgs@'(#M*}>Y<L뇠qXUCpQu<0 rmc3ufzk-]+k=N$+L;ʅe͢A֘j}Fş]6Mߡ?c h8[K!x5i3ǔ,ZORͤm[#^+,V M(gG׬%۰4)Lי|KcChQS_mĵ(=A7edz9Uɝh頢c^9(v<OX}%z|pte> S. .6` ,j`Hȗt cEF‰c]r.Jo1$nu2~?ߚ-7eg}3+tb?;{|f[7(q( W5!%lKV^"C xd$(f* za6D^+z>ua=Cdn?6WVdoȥ4̯˻a;&[!C47|m#NC8H~|C8fEeSS1r3ܛaңMPl x[¨\! /Ƈh@珋)(ޫ k?MBsHNB~BZl՝vO] & Õ;\2#n{a40)&,e逤7yu&ӊ1KTNͦ_Մ8fϹuܕ/5/V ׹#r4m @T"՞w dzw?ەp4 S 읜C31pyr& 3*.D@]صm*C9uby=C.`!\G7a\uNsƕ&{lv^aI?9*^ a۸Lشs⅍("9s֎$n]:(0X~Hp;CWJńGU[N,=<hU]ġUFE8DbR9L7$YqSdL OeSѽV:HQNĎ~rS,n3Q-X&Ӡ@ʝf4\&xLw6@8]k9wٮE 09$,d'DVx\A;3P\<-2ȟ\{7/Īwk^*O\- +7_.\zi ;9vl`L Em$`|-[ɭ9w˘mq@[v2bmV1[ l;s3 `9d Mb!`~Mt(3/0Օ3@׵&VK^pTR [:{?π u?[$`f@N6߹4NvDlҳ9ӜyzbZL{ }.YHFPLŅXUx}VgbR"jXˡ̽@3dU͇  c{*!z\FQ{a˄( 4\*Ec"2kx)vIM,`sNpt%K:xix:% ?Vڀڇȗ.{?`;Kqp@ *$G[~pE7x媾p `Dc8 j!ߙ^ nZj~,27nR Bk)@Z3A/${dV7:}ʖf M"/-N p(+Aމ61Y8.V&Gܙ]:*>%YSmx{vS8j8;|)8cs7AR5d F0XCjGBh@Ωv?oAc l;1t ϪPX'wM&A%w%d S>޺:3-'u55x ק2-K!i`uO1ne1Fr_-"(A1o-}O}EI^0Ɣ‹FV-08x=) 6ie*pR;KVi-<",H@{gOObdnJZy q F%2͙KW7KN>GY;SaP)Ce>swj>G(,cs5T $vwd Pbm5xX5gx\zXVB7SުP7xC2?–"`X` ȳd{:rFAoHU.(Rc2~&BT.jR0^yuP`b'bVgh a?4ȠfT2Y>SN(D{3?Y3>y`_Nm7EУg%]$fےA`@yKg8(6Õkw|xUSʪ#O>!Zk< ܘdpNGolR$䎑!t +#2.sZ\!]Pqg0y0vl ҋ(!5~$`j5'Oo+?@S= $)nɀ=dK#1jEHtō „b7YNv%&[[b%F $br9!&Y_nJE<`}3iocg֨o; kMoY#ZkBNz=+o>uތꘋ2@/jeUFOZgS1$`H*O`SrFJB>+Q?v~VP0_~:s="%еnG=]\"Ĭ%=C|\93\3!|Lyk[Y=G*dLn4ϰW01~ɍYnF8;~wqKCg̓HVZqo;-`F|*yDKEulrΠqΩc_JFx6UK]""dfd"U:|Ωp%ˑsG>162p\YUvU]J濬Iڏz?`1:6a+4SN{w_\fw{4+v{ 7SN5É$Hįf0#\Hܿ9fɃ4 l,N,h(iUg)ݼ8$E)*΢zzhU>h%@xqјr!;:w̞)46nw ZJ7'=L&𙈶$o^;!Kt{يJ|WMV+j3X<,тM61.aV#)D2i *.6Le|GtH p$<25U $7(T7VLS|]!΅]Cx0ۚZtH~PȄi{e 3VTn2 a9Zȑɕn<|J0Cn^RZʸZ1nckD]a+(f6e΂"oRi>MYN`Kg4V8ogƹ"CnhGJ$(A )u8œ oQ;Զ?ɩ5&ȴsnцџx(VdGV;j|͓izNSPt5\3ѧ sN\@5 Dt:Ykc&ʉUD Fa>mA·uYht{1jErF Pid*Eh-u|;{S( eف)Ǟkrͣ AU{حgץ ërS8-|9!IBKv?+#kz#3*ڻvzPiܣ:vBI|KhQ"{5vSK`.e`nv:пN渱%\;:c΄DA8?^17~r{I& P]{J 8@P"<9\i>s9EN=Z;m <-R?2kL;WpԻm,Qʄ} ɘ9kd;'*2ڜf=uPn`EFÿX, RqgǷf/ZLaQ̕H:6FB8^w%u9-"'>AɏGkH-7jIٗt늵>V3I\Mo@-v$ΪJ,UIMәd4nq^F,PI쇛,gcK{0Ȅ 5GzZQ5K%=mnئ\^y|ل٨pmh^kCn?1QLAt ykRn)z^ <\23%Ք?%ڈ%[G}e g2<ɍ% ~~och Kl5X6d]Z\6 #xq-^jXxnQf=5 8lHnҍ38o-_xι: 43Ї'wWcU" Jރv[h>,|5Ի.T=<-X~J}9<ɆS񠘣,7Hƚ\lXjynRx_q}wO)NEk#M~} 8t_3PiJH"3ޱz>F.'u3~F$W[B£]1x(fpP L+B.UCHoVXv5=gVt1o𱮓̮ϟg+rc^rDvYL bCXM6s֡7yD]LYH' 8.満g:PM&/cL<@ßi "erAێL~i ]w~w O(#Ɣ W0(bׇDTX( bmԉC\¾Cv0V]sy8v~]oiACh&SaRqSSЂ#}_2!iGT^C8=&-U{/cTE]bbyw jYJy`dq8:ȈNq.I/&yPj՞?8M:(Hfns'+(Kȹdhf*{ zH1,[_;Hu3>dMqCpqJܥ0byNE0xSO@)o420i$My.cU >KD}s6Kݮbr`*pQm&DD3r`sLd&9, B˜Ö(_Qä3_ݏ[w[[v5b.eoauM` KGEFhW[YT  i2+>kG!|w[F`(WfQʦy:>]G*ؼ糯M3#dy>E.ï*ɳ1Ifj1+-l`Vr;֩HփWvV~$Wb毮OlKcCj9+~3bXl⟂ě-83ǥ9ɋ0XzBχ)t A -]")`@ Z]ԉ:B>IeUN+?N8SP \+叐P^&X n4tj#ZP٩+ƻ]sY[?ΡӺg0|crxuz{P Oy;j,@RĆ;@\9OHնCϦ1@d[ewRp[{Ad?fb3` oMUTO|mHfUȑqRxsH|Ät |Jx'uC9!sxVs6/K U Ω!?i>;(U~] 5}Fְa` `Sgv}ekmУZEk{22@4(.+U>d+ v:픤Ws[fInkH퓥F }TXs3F?6z3gb(Ҵ4!F^6:nL-}cLWS˻5ӾT/cF$0clk.qÕbehްH{ (4$@내@ZtQ1|DBp:lץ܃T0ɚvdaڊqfWh|uUnD$Um.l"܇ u,M'ȷ?M.d᩶jG ('?nF4 /NE#`|LQfe1[Ģg G$X}wQruYO[)OJ܆C8!lnvk(}f/K޷d=XgqdYSV6:f)JH\B{8^߿hQW){( AU0H -K-<0I,u]\<"bPa@P2Ry0Z4a9-X7 \3"Ff !Lt1FhV~ߞLZ<R"W?u:IGc'ٖ.hªbyS"ػto6Y<#o6-LZeEȥҜ9D&㿀r۶YchxVl GpzXɏ gLK`>j8ĈC\n9!xzo3\# <*'|%r嬇@neVM}E=IŃ~ȷ>`8biw~ҁ(YdX=+ k`9n-Ͳ-?ւ{{u%)2G_ >'Q,:G B({vE  r~#VJˀl"JenU0:UCb$i}c e1IN/^ BahN '^g2L=]J3ƫ&/'! a6$ ޠ!a`.UӀ&P=LY"vviN%˿F\NOUnwj-xUN(ECq87h_L!LzS9=== LL:jgBF&9 |L^Tю*~uqxX1QvM)S7h;A:8 Enzxybyo<13Z;)DmQ@iga*t69RkOiDo WvEtDFiλdGp]ҨބfekHMV[ }jH5740TeG| &?(͜@i11uI.&:OT5PUB{m ~$ 9{?1 #Y-nkR<~h4Mtyf.TAlV#ʇ>?(.ftu@m4j4Ӛf$<e=.8Lvtb`r׻( 0X|&*+/Sjtb[|A4Pl0ayz9DGE))CyA;HqՄJ-t;Y3٫I`9HeEaXAؖXeO ?q$liT'cvkpIޚe9ZHtI(p tPqr0R=)s<ܗ`wKᳪ H5֚(Y[ 2aѩe=w\$U_I@RQ9JjF &!܃\O;7Ql6L^X;2[r&M4k;;u0_!wM;hࢃ}崔`Sxo;TWɥg9(0 zyQq'iܖF0?QSV9c+nȃFoXlj1𢹛-oģ -  8'Fp S!a;p}U{l*TqJ]u @5;!!aw_zŗY|i/j$t&Q:-&/[wY9k{;uWf;c_ڔN&K9a'Z}LJ)y`8]fnqJ |[E'%ķ!6@IP8WkeEu4 uH΅S?9XH~E/u?jy͑_.4Fu;MLdM̄})OlU>zpsA(T$N͕SqDXٹ2GiC+la6xy)ӤBJwO7\=όwhfe$u<~NȺCKU1 =O0ɅV34+}CYi[aۊ혘"1FAe ʙno0g5 ҿ^G-5^gwPAxwV‡3fߨ5E'sy.^Q|ɻ,M OR<1N0qmR 2)RdND-H!H/*˳78Œ=`A)XyUw~=І]_~X;Ә0\fݪ(CFX$#N4i}i NKB{bJ4Qv?^*{zєG7? NvSw2:,/MR^YK~ !7F%p:%/Ɋd%9E1ÐI#|@n9Cb_`N'i?{ކʫ d}sA# ِIDn`:QU#bBo9]O60KN{GA$V)gɸež_=n Kf6ﭝ;x\c|]k90t4a_1 <5`{ls|S&`P#VAC }!# 9P`F4e-e)ZJ qت 0{9PԐ2淳D߶c~VTGY?rr򍼧Far):3p+-bw,/ 2wVl!!uuůM@RJj&ˇ\?IRo7:SۃR, G'҆)Nge}\Dg;ےgw:qgu\ QNF" |Tbr8be.ȝ:`D~bӎPGמh&πB߂œW|LÊ4lHY9(7}<2#WT%&gV#yoA ȀX|'YF8fI?)okJH>3H4Gi61OPǷ9s8WR1E+@.UץĖ}E9ю6MuZZWxǯxAݙ*NWZt칏Z뀤Y}5/*JY"_jtr6|c,-vIgoJ9wѰ_3`Y@rN}/hvOLq2ip"|q1?Lj֩]PWZQVߋVvj/aߊm&]QTZQzJItE^qx Njo]RcOPP^"cfTgY6wKkS&4.0! |ߩx[KDopZO;^C$;[8׏=5~9=jB{  &,&c((%,1gףP+Tu." =v;h\S$Z&1bT']DHҍtMl,>57 ?kl#_Ubz)n9,,MS i6o/4R$&dwMBxh{i"R/`wŎf<ԏ>]kT,M ac0WdKXSe`>do̞vT7Yk,% ѷVuT{AB{EK竹'FE\L|7ywd^ZqAhXMwl֟ `{(7 BX')-N-y<\йpOg %/e*eg Л#Kژѫp|"gTK8l@fK+`ge^W@.TC(6 Zeonae+ܴk-y6XumB (S3oD/WX1>J_ٖ31qx_TBdca;lo~l)i!c)FnVgHa(ۮ{9/^{K4y 6l5ؔ7YXE0M#A7z7-%ȫMuRK6ʑ[V`S qܢ}աQ$"*.8SƽVYf)J9$tm&yD<̨o# MWLiXF0c%DRzޜd νs mT_wAk4B:ic4Aa_#[S'o|m|'RCeսfbPF(q7P_=xaYr9zumW$BV6VTdEۧCR+9L#BsPrD4#v]$(!W#ijX4@jv@+[Dn@dzۦNDҦL4 QsL/zFůO~#}x_$O^_-pV)x,%ן!Q'w&Qwc/cg Thkv Kes1Tzj΍: I!ARKMZѐ9bc:`}hSִ#x]d?dz YcF|LCkMtL9} I$EwMT3cNtREh$+Q^yt5 ⥭5gS[CŀW`vxlIle9. e[z{xᰐT@ JY(Mr9+fn݂켮rH1m@G+YIX/-aᯀSCfK謠`%H]@kP eO l0hRiVA F- 2j; *ËsGq-"o9z h;q[Ƹ@fE&c#䌫Lf#NW̖ڠjW$RR]s?Ow^W-@Fnu>] 49n{t#'ɑ+牟"-Y"̔2ܑy9Uf҈^u2iF5>KW)VY/6,j0h4$0RLeKN+כ#/7ڼI^yloK.U8 EF _}NB{ODYmdof;3 Xp(3(0F xϵΗ> d"R i\O_hH[\Þ\{O!J bw&3z7$9Ns3rFiuTX N0-\vejs ݿhA0Po$G <^ӿg{s,0Fjidn[0}Qz wC)3\bu9k~ODbZe?(Շ}ol _2(b6-xݚ?ڢWU(J\cGڛ:LZ=,MoQULQ"ج#ڗ2 &^waׄ ƺ0-.G]n l=!y'v4OX-XI^FG%VOI(O1ұA-6ǯ檗]KHƬbgfpg'eNR3wInY;+pM{%6Vi+8 )z (DtFeʕ}݇ є{J1j|l?MհHUj_s^jS-tmw.K]ZNjVrl ׻CqjDrtkf?#O.~⛳2qrxh?' %"L%h !T1N 򳱃kB<^O682(;WMVqTúnWy q|b3NJUxJ&f,A ؿYA=ُp&Cd'~+՘JQ*4;Z~w7 8 ]QBH"PhBR$  A4'%2Y c1Mf1:o}V-'ÑLsb/3gajȻƮy&6)P(eNP/%HΕk(*K7Iuփ?IÒ )Y!7;a/;@^k…|V2hHz0ԛA'wCuԶm(blC#"5IVqkLCiE18!["_^}-;kTZHGo|'3 Cb~"4gLR3Y/)"OyxM&F +S-^0BB>M>d\|Qː1Ft*}dQJHXGquT֣,*eA3JtoQt*Uޭ GL>`4I2tKT[t)!a;$TT3֥flGJ'a>)l̎ء%@x`+^!I%_8qXP xXt?b-HXԔ>9&;T|; a~pMs˴zSt~(mɲNE)}-3G[,Nw'#/?sŽ^ܢ{,k{z@~ JN "{_$H(uyWSzizj06'/GO[է.KBy1Ujx?QHXD6>ؔ^iʁ{|R;쥆NoRVn-ޓS#"Hj ;@^MRTypS^LU~ЋV\seEܓ3BSMlKs&OMz{6Q)JZ[9stH?)pp[2v<A<3l jddz*nA9]ޝMcNw܂ ް'y[{``dΘcZE쮋aY}UR_} %P iD[NlYEE=GP1E-];߿ ZK_E7Aֺ>3$:ѸJ#Xl0 y#qѧ N o'e2CBo@㷛irр)\Nt݁`G:L٨ ӝXY)Y6 Ab~4}Uފ@ږv밢Нw2ؼov%&u'iV^VX n݇8iAr@Y"Ch.9{!3=\,&klA nXؽHIl6 n>i+-Va/&Tηg~Pv(.y7MP|a8h.waVS'Y)1e|f~~qVu!JU>LߥJMKwP:%$G5&$rR$Y~h 4t. 5&dLTZm)g' cŴ^تi`:){E])5l`-L b6o3"ss K)~cYXN3.3 :n~ߡ0oi;րMmY SZӘܷ5W $A٘(]|B'`3! =4DYN0nuuGѓjyae f qa0K"ˈ[ =qD 4dkPbf_聀%bk> oVp$:QS!I/Xv2&S\o및FiR _/FnM0y8fvND8#m3:>LG$`im>=?|x\GҁVKJ |3@+x23O+dHֻ/q#=n궊չaE0 @ P`UM%*PWJa3~mQqe. z IFP)/ۜ,خ3cgmbq@p}{wf'3?o{m.<:l}](nHzG4 8D*[eVN1(FHK@JY + fR|}?/R/3庑W oXWQ5t=Nƛ6΄!_+&QpR=WvWz+0ēDĻpd~:*i1upt*SL,z鯪'I B]弼%9aʘYdMQ$SmU:IlfOzc~V9QXL4)>lT3Tᡄ3A9攼p`޹r|0EM283wIP %Ktclm~JOE i_Q?._1R[gpWr?~~,@F CoimiSaϐ%hZ9Gt;*_Z]y7&y噼T!7{8\JM$߯ό#]v MM 8sآsWD-D+D%76r7LL-xklmU< iV4t d@2lkA;Q>jB {!չw֩`D( x36LGDž2aRӅ!еA#Z8P?7Nf%Ⱳ8£csƠZz K~B Rs3EZnRdAS|(! Ϝ.eC+Gv5BL7}Οs_yV<*Up; sGxQU>[y\0몛Qe? {a=k[ (]8IVɐվe$p%؟b}Vy;5AٷOw`@J҄*\4><$ѡefi/%e701:1ͯ4P,_3*P8\EEݢMbkgOm4y`9x,7#:!eotZKzUΜ>E9 X. GzV$KP=Rb!\J_ƛgvm wq%Ue@.ĂļNinGa LolJ?]CۣS,v^t9&r:)RlWM%eA_'"!XPMLJ5M گy!=ΗqX*ULjj)˞~q箬Ne0U2g\ԓε%~^.i5tl3n@VE=2Or[.Gw[=pXB8 LzQA)% C_UhʊTZEUqؗl^4ISiAG>rE/7,48b.Xv:0Mf|&w(yX7yL'c#o`qlEZY%qDA~G6 `h (0M؜LCʸC4;2,BDH\h:ne?GΣ*dRmyxcF;KW2K8OGi.3,TrN)9&%'Mַ_a"ӭn'_Z=^Bisu!FuRX{(iDz١ o߾C0GhȻ{~Ef3wfjA,+g!?(<>6ѤtK'a1U W 2}/m O: Y&WQ)D%YPp.G]5ōhO*J}$,~9M呕OsVsneG?uJQ WaX|7Io(1iN]qbLpZ6lrN8؜Bf,l@n</3 榼6i$h(vS8)17 pG8W+PjazbRH8`xV/Pډ(a/ I?e\BW~hlΩnJNd\TFٛ>f?tguo)ҋk"["7%K?TwY}Hg Kԩ0rbF8_<ngmW}7H-c@q\[ӯP!C c/3ӧ0mdmj )[i7*" af=)آUàKeZ7: x=eR2&nY[ѱr$nOZ1*朆CW>;sf.'z"JK8{itIc "Jq'C<"ڨˆ%miN8̿o C{LXbtAvrvmolMkNlo VYՎ$%I5<0a()3@M~{"+ ##VY1^, 5٭)<%hxhSVo4+o­偙Së=X!) 9|*.uB(R$MVu4(I^#O^Mc_p9Ngx,{,ލSSIKmAt鴨a>sM{iERs/xl8IF픏V ktNႌrIQHCpS@$H2un)}=r~'Ge̿'%c|mGYTʃq IX#QYtclz7_.2J/Q4(Ĭa|4faGIDx0myԥ}obK-EwJ_NJ &zޫ:'^4E\Q_ή*exkOxx'ظ%mY}(eP^&BƉC훧̘|TcVB,"N[47>!^0E4ĄJ5 m~zh%)Z>g#׈s]@N=5»}uH[-Ƹq3~J$?ňyݺ)cjnvHv5Ȉe?Q+ r& cE !Y. )ݺOl5)3x %܀4-؞j_n}bhItpׄV¢;>] #S$k}~[d)f|Ol!r2!YΦP~xdGe@ΖNt0NbೇGτ+}Sޟ.8W?>dc F Qn %;?RsrP_CBAqw'Uj-+6É\@Cy]NuKD5MeJ,h3hDW<^I2FxdQ*x}g ѣ_T~mU ĤmjTcFCɷ})C(|-QZMd!x9?6ܗ-Vn.]JZHwE)bz3~"ȣbah>n~uK'c[2(yo4 kE.[Ζ Ðq׌ +cZ7ZB" q؍aq=I d"G($Q\+yU 8k1Tz\ҋ؎/{|։N$7Hc=^LzN |W$O=1m',K|󬪁oJ}-Gy'fbX upӈMK,2<n쟌YhQsH-2 N?l2M ,~W_zvƲkP=>L;Ynd0(xW17ʘ_k\X%^JquTF(s`u>3ddWvawCC]y68 +6"\D]9Az KD}kvf=mG#D#nUF#q}dk+7-?VN n5>Q2 *Sh{% U>$q0*@B\f Nv`eDga,4NaMOf3yGsd͐p*_;3o僆 ײϬ,Q»+i(?_5hB\G^q?ڨUB{[(>>6x )cgM6)Y$j9l"CIeT4"˨YL3I:- &|: #vnĥ DdJ-g(("NtJU8[-+Z/AgJw7&-l2 FdzK0i9-0tUGʗA+kK`)C#7R+zЀÉ z/̑=@@XI5Ec6Z K* uI|*"iżND7q<eBECzzWlGʣ1Y7 ,d{5t1"~q/E"xbF;f`WYJ_1]>cv@+WQs~KteV|I_38zlq ؁g;cljcTDUGZl炤GZ Nŏ)ȋ j;9}+ᨪwj3N|8!$fU Ed/)гv 0wծ= ߎZ{F}{uNɍ=mջq [-UHKaf!xMt휐aP$NH SU K Ys2Cfت/{M=o3 [@‹ETs}InԺ@3S&?HOf<1a^=wϹ79ĸYVZs,&p1-pҌKBHYf6d6X;_S;CUhݾ!e!UMt\FA TH 84QX@ ua0E ʭ:?$77l=JM"A,QTtC2"N֗=BI'߮ՔFg%;'rdR/۬5OC9(\N7iYb50˙קi@Lw_'cՔY.v`m ;]m^>K+|5!}1]%MlTI{$HOfQ%yTvߥxR76כd,\ao0 F'_~b^Bv?bsb+O+oЌ|g.\%oEd:Ln!fܮ=) D+k[8Xe2ɅguU,TꅱSBn0Xenv{λ˚3u,xjoOߕT*z@3#_ >Ѫ5EBd ;Ib^uvӌ.74V/BltCCtAON7@*å8(fL9뀻#!S3TÄ?9ڐ[ XfJ9O]MsC|H:޶qr YCk+pw:ZV[⸤  Tz.h9-RTP!łGU9no4{2}vӠ&PQ~Lwq$Ԙ6$aW_H*3o8G ?8_|_;zy18zRoG:ANYE< .ٛe~zStQ_y\z`ۦN=u3k+!OKfIH(I T8RYÕ(Px*>!C]b3#~WQ1V @P9[iqZ\y;^r=Xᴯ[NV's~ 2.=ˡ)D8zOsU@&&|[ :N>\_'Wf8=+CZv{SyOZj/Pl6Y°dij6}JOB'CJ.ڃ`QRC1nyxz n-!hT'?=mJ:A . .p֌67v_334KAwU ˸/Vśv|wLhPqxxja0spFiJ7{A~La*|JYF[]Xٓt!+w0d ^|M(R}|:Qܫ5f2fz=zSAeVAΟA04P#H"ig?Usii?qXX}g/R9]oh2qX|ۚ-&l).o_!&-電yYpg|֮me%b߄?aO*B}Vy,Cv GV`o_-eA+Έ3$u@|qoAu3vq#ZPΨJA+?Joj=ת[Ģb ʏZӐ#lt#F@A,s#|vLiɊ) N+ MeSBGbif tihS0&bpcS/+3reP?_3+A{,Dqlxxt<#u}w`?/P~"G,ЪtJI(ٱ|+WjhFd~l ;L^WJZ=jGWib>`,ae `K$FcH#^O53OIe7V%ʹ^**q)BH{m(s*u穈7#L9D /"됛z {Cv15EVZ(yqLFSʢoW)ث/ q?O}=DfWLҟaFߒqbŗ}=My\]*Nlʣ[ ۉ`RG`oΞ㰨 YnF /`Q3]F; \ݴ!2_I;\w8Lҩ[N(ў{sW4X_䢧 M afok!xb28H4&THBL+BdȉZ YZ2  p2ԛiLB]z~jVxA.%\P,J 0C25ruQ|,9b5Ȓ "LA .mytT-Tz I%\-!b#˷>7yU/%Lӹ`3]>sتoMD&a?B͒gRë_9I8kSMɠ=iXL48%(Sh)=}Iʾo4Cz t¨$ nhj8l89yI`c.#&캡@7$[eS9n"b{e*6]9ʳ"`-Ţ>^ߑ%d}fUMj[ pjv͙†vB+;5N: M}@s'D7{m&{ A8 ͔{``J>1`k23u]O1T 더LV'o>ߴ`LEό:tk'gn=]%vP^S& :k2 d%$3=hG68LWWĽ6 5v/zT $ TҟQ:X/To;vGWZ\}G.|ivD8 _j -0 Iݞnn .TKLK'IH+'j at wQ>$o'kῈt>ṡq (Ji9;<ձV `F 67] Ե˥chm4_.ZbQ]8iH=Ŕbaҡ$Jo@1's{5&(5xܼߝIYh>a0yC `A: `ˆ9?xaۖƾt-67-^LTyRz{be a6'Buk!T$eBڽZ{%pY нЏ{j  u9+mڼv~SU ktS[t~=O/Ub2l-^ϝ,_C$wgխ˫1z.<%r2TVt;~^T1=u"y?zrHKV7oU (+7~t81>Roព?"$fXhT>l>'>WTuœc=;y]xw=-=^3, \M=wU'y8G\飜׮FSj뗙sFы iuUcAQi* Z(t%i\g-798b u:+ 6ft1ߕpona~h5#ypk80%KK'Ik{E4 cMP(3d6[[^?FϳuYp}jFTN<*ًܮSmG,`8y*Ƨ@~Mb;oy+M1l'A 4|GfCU$>z\:}sgV@Z ]тݾT4W*MQs# TS{Lg.Љ} *C͸`ȒQ= F,Ϡݕ(:9N34.8X\R0A;Hmi:y-JP59L6 0ʫb:4?=/AV^姸x$̭w>3M9N y87UOVCvcNdžD3I7UuˇOZ~5r*x]R(wVW\")(xf6}.,s^a.Biʿ&o/QwJ40>L}R3sEM2BlȘ0,Emwb!|Gg w7Q-j@dA P0ZVqnpP^8v8ay-,<1ƿ%dln!6ٻ-q Sb21- ar,4hfNye|5kV ? ϗY;+{^ e+dTkdŻ9T6Z'펆ey[c4oeG8p\OZ',uLŶpUtسaezf ~Ow FS$Um[}8~PCQUw]{ނKqض2v;@A5O5qݦm"YxMeOP$E %R;AgZrtn6;u?z6{ |cDGAwUfʉ}9H]_3p !m-7kqu<؏KzOi3z´7 f  "|`@m+~0 p~Y 7lj1 =o1 I"ϊ6E*}6vB {k]s Osr!=$BTfNF8&wX]"B.^KuH+%^vfuڲؿ*3XuAm02( f*S鞚LM sΓʜ雕8XD q)_/T f B'X-&raE2*96 ôҮ̦gS;!dpO^g$OcD?;v`fXgv?VAJs_b49l3|Z5OM ZNowG+IZ^zIV8_uVbyBk9֠o宵1i™KJne+z E# HAO Top/UBIT2i.|xƧR.IzK%)y(^Hrj ?͹kA QNOEV3yZIk-pzx/?ϗ'`jPiEa yz`SWjo!&Be% M>3R}i/eZɋ]@//vA#f:d*4jϦ (pwmgK?8A w63vCr)T6 \fm^TJzGq0Z?ƃ$2?-^h Gc2c40yΪ2\[",RTo98'dnɷɍ J=C,2p+7jFmrOj[M?+RX?>P{/Pbũq׫ׅV2B&-Ӂ)MW5>A?gUa7i7w](k- aÕ㇑oA67mn4fD'V<`?X-/P!"گzwFC&{݅$cN%#bkUNu 5Nc2mͫ9KnQ`qYxKILj1s) >dZ,ԖR(& +̸ci)ؖ\xIv M$W\>3DqG$&MA+qO'ޜb: koyW:*0t}+pHEQ^! BO,3$WCNŹˬHvN/t~Q΃Ư9*$U@Vc!柵ed 2ywM&/*ƍCȳx 8;~[Z<lKvży N;6t(7e]kN_KMj@0Br$|ʓW$W>r iئ݋G"qi`{Qv2Z<ݞw5.vݛ_#rm8Q&Uiyl(>Cum4ޝݓ$XUJJzW )0eI  \nɄI?i /а7D^(y!G:J`Ev(1֕B9DzsYI/} /Y"s4haVZ+gVC!*`/MʽW$Asl<_DP Q%X:oإkoxGg)n?Un"XU/I⁻7[8hEP:h2]abK!c _ϟ/tUk 4qhݨp;h vfquIeUcCGZ2!Ї^u[a8:N`'"^CqT%*}֚gCF*E@@< :4/k*Q7"RO֘e(x# !Ljn[Y$gV|ŦN4L rMi]1,zW ()01AيYS,xsb #H~r޵ߨoqsӀU .Mkݯ#GQRl4EXb WڊBn+&"I~ZZd?|H<[X`)") .2wԻ/ul-t}/ QKf2^`Kԛ3vʏ; +Uy7Ya`H5i*D+!&>r*"U;b1}m29H~@-MH+iM=9~VX w;S.uw2"8$CԪ(ureJH&S0$ C+!PY5`"궓O1p@!WпQ4ʇ)p'V=퀁ѡ  C_=LIan} ]/7z1 hsUXMkAlC:ΰ_ʻf AVs]v~SZj&"ʝdc[7g$ GPFBBxw33.’r+N~t;.ߜ1 ~~}N[ucDk"${9{T B i*<t{diJ&dHb FpPpOtrVÜQQPl6r&oKu}ݿjXxzAufRVb4"piHQ"]0RB_Omy^!1Mf;sMfìcxʟ;.Exk["O쵎C=**W^hۉOcJ*XҦ~~6@GoI1o]oʣR$U9^K &ZP:D^M$An~;T.ga}3M9G R>\6>e@ɑiEq2pf7S I[cR ޠH$[ J΁G*X6۰ZgPyn|p2J&X˯7?Ā4S&{ h\麭ȏEh>Um]&$*ۙ Ý .ր3ҹP~Z&%xw:aPar:!dg'=!k,ɤ-F`fYï%@ǀʰc?XP)QI {&I 7Rr=\ -rsG lON 0RD%yF^ZH |(ض7& ~z O A/e3 U0G `w Ų`K0M.Y|l(z`@(|iq񏒺нyHBX;e*xfi)퐟e"c`Ob?Ya`s+28wOZ~fi b͝~(ŵoZ\%R_ToȿdXJ{c x>s:9Զ_ܦ ;(;1Zuo&_SXXoLlb$ǰEXg\lhfh78&mn<ۀd_e0Bf, !#1-% Tk;TFSllp\DYZ+SX\}xr6A]<:"G+*|{weH80g)7G የEZptIxPD)@'N<8TaX;%]Rד4][/ufČQxfyzm$-1 h OOYhTqXV|&Xy|}P]t5qbS]ݻ+274VAu:>d v3"YAeZF):m7妁1":.(c/T2m ^'bʂVʘt=kULBhP5 N\=b>.N9ۿI6x:u \5ݢK.|d_'$~bf?Ӵt4 irA=|ӗAl#SQ8-W V n">vOO7qbUKj/˝ᦷF= N}6POk{n`JъO>ߦՇnu[}QKW!JnnY}\IkKq2vLG}vI.HCK-.}LQ(pΊE<_%-w:׶KcAZ#C&t;ͧ/ګ8T']zPA H;-cKPEvgɜ)֏\詶S@ <4&1a" q2)C1=x䡫\}}"Edw5s.װŨ,h&E([W K^4Fr={+s,M;+@]vԩRTȳEI4*D0ؼf.ٻ@$-?<42S|†{iN穀nlTy/3X&j9BWKxy[}ȉ{9aD;9Cqa-4q\<[0婀R/^kB$7wb^]b/iU xa CCn }^uĖW X,V8lK2$+, YLÏK)fЭ )HJ.)}?%,tۅCҎO$CŸ4/zLUDhuwqV1 4v-~%g$#8hcqp(`/$fbN l-l0(vCݾb~x7ItԀ*Ҳ/yPMSeWJcմBʛiDBDAKSH&a (2-J`GSEV{R8_,i2~LF ذ!SշE}ޯNM~]2gQ?:> fY_(j\J/vCٓZW4 n?Q! %z;#' Pq=}j[yOF YJpom'ת-[GX2C(lB/-Wc>d'd!@$8|`#(Ը5lO|iaέaSAy`f]!K< O+T I3T#uǠz4]R3T^ dt뜥.D\+\ R71j?sB]Gɶ ]ETICjh8[lM *:2|1}H&赵 7AA;OD =*,L>8׶k#x,(^sJƨ+3PD$-T妕1oͳ<׾MY>!2.K8!z._\&,h\C4h14d+1kEz/.g #WR}+/-^G^i8sr2TwJDL2רj۴}!"' h! Ě qL􇢂F%>U=8)k=@(^ݣ kY}^)!(nA 3<042)[jZ-Iz'h  x_#:0g;K}s[UrnRydpՠk}L3 oV͟`uڱx׮ YOçŋsYf HxXvu3$0kI yffm9mM^~8Yei 6H |y;,N;4sqTzÑEj(-en% pP::$-7kXNg!QSͩG &?rn qSeɼwK"f~G=ܻI)?m]x=): =wGgDUnX v.+7;#Wi$x=I{BŊ C/؂ _RD@66h.'b8p R:5oAVRډ7% z>kMJ.`y rR0-M J$5zy5@TS%UTׯo<8nG3] #\/zrCaE!ⴺmiuZ98|iA"8$eCܡ5J0GHNufİ9x@g#@ԁ1 CY[܈ ֹqFn7"-Aƫ'k=`:}ϛ$XmXC4;2 u;>-eH$TS$"_ԟt o '7ڠO`qM'VJϘ𬕻Lfed3 v߁|neRڤ 2oM4TIk:=qm]V'{\vdգ%tG@4GBĸZo$N6ǃZr# gu: +Hq? kK>r(vRI1X-D1̘_" "WA䤥> E^''XX\oQ0{O#cjF ѴoiTlK=ٍ 9(5Pi%I>~e]$,af-s[]<ʬCF>,'㹎UL_Ft4 mq.M|C@ LOǚS-E.uiGUòS Kla8jڄ&)5y[=D<;/wUK 9NzV\!IG: " I< ̓DΨeƤW =wPƤvՓ"fA5:X dD|ԕW'@c+4D3ha'rIU(0g҆;﨎[BA9{D#ZWLZ|,7&% o %RkSPvW'=`i,!?| ˿t,GU7wiOoDLar+$jC\ )Nyǡp6]3guLGnݭR+ֲhN6o6).he"Z - '4T7L2H'I'*; [%}U}2nѺ\ʃd'x?XrIm!_5%c Ts*Duqv[ eWQj@Ǎ;V -A`ҳBQh"7heMզ9,Ĥ٢=|mW#%wϗdl~k.32uXd'6Xx9>ph=opQ+>pa֧`g l ߞYo`׻ O( oPX?~p`,o dathײiTX6"BO>S42K EA'^!L%ACk|F\'=b8Cv1f؀!v+inh$4xj)*jQ_)*T{^-^jذLEp#FAAX?*qٍ.!pwvPQ苯Z6BYYt^g%Yy9~r"\031|Ӓa7)M8 N+&HAH *=d(I7N:%eQ\R{lQOz,y]L"=yٺ,lŏE(.psBV}}{ű1B-I\M1ADzD.Lzͪf ?85"c J"!.NhXu w Io1l! ^f֮pwa[ /prVa Y uu6]!00..˧^}O6t'ʩmA쭀hYK4Exhb!#JIESi<ރ S @B~#>=SB8g If5E{3]·#]&4+p#u-&*1 ©hlV!ܒ'X8LS3d "'{B]`oWFAݼ !w<mr+d>6!,Np}n$x-9@|k|N/FaA'JJMtBB2d,( 7q2&3fSO$OInkС֘VO]38˸iU(~! ``#$AXնS6d&<?S$Yui6 ^|wmö'$EQx Mv,S fߋ V VI7s)!- 7'9D8ц~-p,ī=ބ!l9vli 7ˆ#D#MP= ™Z:cYI&\ mީFξv[0:gg"(<5$-`7AU:d@P1rM[LnL  YAdJv&9̌Ҟ09[9 f!2*Ds"<*cZfT "ЁJ@5mFM~jriõ d΃-_G1DV~Kۗd $+[K ^-D{> 3`6ngl Y5?+/(G⾆AЁpnbRƄ[S< +hr)< `U9m#"ZD rO>vYPlSf;,ɋ1˗@: ^[3Ϡ`sJ[,=1@ r ϗ`p8c(0'\p # 5q4lOP|2ZLT䂱Ot'# a1Å BԢ 𴤌7'sa`˼k![EkʔQAUޢSa2q)@VDow;K!4@5)3wR10!h"AucIYB/? Մ\glCŠvbϛ 4+Q>$+a90S?EeJ6y1Y3Иkw@N5sL:Ĕx;2u~4C_}Xwg.Vy[yWHQ8n"AwښIbD*f285IңJѬ=-܍R, KM-־ǭ]l8PYw{*a\#. Ma|~Yl^X oYGi rU?)g gx֟659bĮqQVd{'1o,`?Bw&]&p})le9oFIEOMKo 긵YsE\n|P G/pHph/4%|8IHvNGu 6]8_m.Œͤ\D}cI2vC3l,2ۈB1v[ѼPT~Lt,`vqZ8Mviex@66-6)"ĕG)- $L&u[;VZPv"V=`?%*ܒsґ%uHyWE4VQ"^.w!5:H-G'@$\ H`҉ԡͿyIysE&0zU]F'ڪ][wᾯL%je.l1ͥ-H/ށ E>w1z\w= ϛbgQ*~9(U.VD4T&F,cv>|~}*檸o0'j칿UNs=)Bbyl[\}S7Ӊu`gU=f#Dg[~M(n6i(m 23mȾ*`A;|%4w^h=]?ԅe޳m.I[Ͽ4!4LjTQ&'8̚#Ǻ09 X;`K-"˨!B̮5T :yY*O`!u4DqɐJui}f _yyږo8:}Mܥlt0~Jrcj޲'ߢ xgCyJ$XïyDh4/v&}W 4`"Ӿ`Hj7V/ZTa:" 羐eΊ$J~#Z{OB!-`-UQ"t'%)KQ cƃ$?Uؚe``^XuZHǗ\{ v/`ź]V,Y"mjuƏSZDB:߽cO7Jxk %=?|6n]4Mp2 nE 8kM"[qAd}v&x'_ f6pLt |9g\ vK *` S' 2gⅷtw'UEg"#Nf=h aNΥcDg uhq^(ZI6YY*Jp8g"dmE^ ${ j<~b;a3Q;}"/&?Tݚkx$ǡiJ<ڥ3R8v'e[vre)bz |o 8bF"Rt "DMCIHHue䇜ǿ*5ʔJ{}5זr=׏6;KUc;zvF'ȷ~WaA*]m ¿L03"nXx@1EIo+fx;i#qC^&oȧ} ^0jK>I@[k ̗3+dng2bI{BOE~fpMn3Zdé7tk1W>:tUS /`0ȟkR04x]gi C~Բ6a՗b#ņ){CDs)jYMmatrRTv:DX3#8 .qxz X ԇ + Q|}boꪣ}FK&,0"Z.E[}_P&_8#1xV<~3{m7y^SHOs$(/H5OdsgY@Gn@%vxk,I7@Nm.*sf  3iSg#1.kK>hs"Å$SAPٷvejN4]ռ.^e]>6*䒺Gm%*dAޣX .y YTzġnz.F/S_mKsTחuTΨpuߛNB20Pu6^Mڠ-qRTOBr8=MŲhhG+q2]8Jx&nӔ,;8)o@>%g?::>J\-%G1͛-!cgUjy;ب7VYG= +nœ:u,!ȏ}I M m4ad_Im{# g;Hf3;м8kWW:ۜL(1ȶ3H#XZ**e R VvТDםz ZDyE;Ku"jCӾ(S<|˿tN7# tL'yoip1GZ/HF F+ 507C#QHm7cZFӍX~m$;HFBիu^]y֥0Cj@ŝZX!n ӯV[ђ& փ-?=_MШ0%_KdHj2PRz|{ۧǹe*9ыU P5ȇ;)$m,hiyYۈF1}ǐ+?rIBE/F2lCWi+Ğ?;kgCS52 ~*3SOF%.ǟ+$ # :bp_dg%1O'&gȲ+9@`R2]*fz04g?`t)M.iCRȈd!içD܄AJ& E{:m3yJ9'ꨕjEjap/1WbۅX mW{~s0#A=Ne)jC]7b*Bm]bBpۭٵc< rrXfjª7]vl-j"Xk? j*{t$zr7eTtWzkjsb9*8'f(U&2l!HJ_&]\eD#@}AO:sdF9p`*LQ3Jp8ˤDLI.mEJuAtB/. v׉j u Js3h-X;vV}-z& N]~ rFNaj!tMTۚ 2dF+LaF0^TaC}aN.[yIѥˤ~jaLּbLj >}C\*EN'ZKlӜ|m+"-%@qd[I:@ Wx QBp5 y60F;E~sCa5{Jl;BŜΡnNpb5:1كA}V}aGAsvÞd/&!N -n!F䃞N4-X2[lĬ'<:w Lb/Ѽ3aoY'aqÈ4T@zTz GGzQ:TeI4{ey41^ܶ(BLOECTE',ªrN$M3նSa`"3a;;y}d0{ː&;'SJO5º9=_TT[f@_*L x!OĎ#л8Ҩ {L㴥n{Bu8r89   .՘_&@sK9Ej88wBF>!w]$H \P\$;2GDؗ(gu^m{ `ڋE55v+$u; B3qWuJ ml_N잨tsr=$:"$ڌ0?oF* 5 xgܷkme,ݙu3Yt %%mEį&lԌ՞>+3b/arlFsC -mDzwX^ЄHuTO#2iyHT/!'T2)xcw+?Y:P7%?Ub.vղŢ.Xi*T HZǕj1>ú'g /uK> Gyco)DU9 RݞN02Dﯔ>{,l.>AGeQ φY ~lrϝ./aPܴ*ĬD .*S0ۈDd1%xڳsVDndn_ DZzdb:[`zCć"ض~KDzk^ 2@ݱ Ծo߶|SI 2!3HZU1}+ߍĿun&_Dhd/aLӿ`EO> ;jݐw#Ȧ>2krL"lfEA"J<܊ !N8ƅ94Jĥ{?JЋYyIa0OY3şYߓ&ͺD)V?&N :B57?FuC3e%H4{d^R%Q sg6 k幺iwJ򲫭}W3LH{yqU.iC'*}(F]SjK 2f}+q _W YcM!Y+ݒizuwVL=oZ]ryr{)_fDѵGNKA¼gq ۭNbD1an@%ϋ320j=-D*O(3ljAmK4I& d80% j8 !τVif[".[iy Y 7zy]@s~F]qNHV5Wx+J hd0Վ]z.îa{%oO;ߡ:R*$A]tsPyڲb3Ib zy;r H$C5d0sJLq^ K@zh)ZLcHx>p`gA;I*Dkӎ.ݍӀEڸqath"`n?[]c3þb8U?sJ j.sa79:)9FBCpgE<4lHÖ S-:]9Eu`nS]FR5Rdk^Mzj/9/ fy^lOrc@i$j׷>쪩"ZΣ:^TgD cŋrr%yf"]ehvCǝ?F/iѶ8n> H]hOtf@RdJ{/P}FPX}]U]fYt$NY%fw02 sjMd.TxdieV(+˶Tϳ~mלYB-oTX&a MNAsZڐRTH AJOYO<5p뭰tqQ&`4 e BC݆a왈OJ4[L*z/* rjmF_d΁&D\GqJ_pN:aF$QEr#HFei͜it&r@!A2CwbG>U'OMBFٷ?`Ȩ lw{ IdG93>Nu45! r0x&q\b%No>?Ĭjprbm>:1f0%XY]d|t"[.f_7 ǀK$sۨ H,ZFN@GOLp]#bmD$i5 n Ӹ};z=Q$OEAԫHi>卆Y/N͗0QXU[Zff/? #\w8usHu`RFOK90K洖-E ۷?n?K]⾩1ёT?]Oh.*Njɸ9Mo>`a5 {d7ŷ cA! EO 7g-w}[9vATГY 脝Kʄ/G:${SnՈTbQGic5ErOH/eN"L fԈIju] vDOI吰HK8YڇR# eե^ +*ʡbH,!Ŭ`7ׇdT:z/~z:qzI=ќ?]P pަhʀQM~ciF֎0٤E0P! ,5,,ڵ)jsr{>Gv*?h; z$uK~ehe@ #<5İ{#LI1*z~u]>*8 bY"l/p!Вd :BӐg(Bh}!T(P֍SS]!T`U%shـdIDt ֋]@+јqpdn WD x = .$/fAǭi#yлk`KgǞ5TKP|*z2:œ;LvnNj#js Qkl;3s}rN?DE$}hpہN*uCINt2tupFFwX|,H<2Џq P nso-iglR^]=AŝAsAX\oH-X1[MՍt|y0#dP2#VF|a * ( @Av0f@ $ǜ?W|ąT惚0*0^R%"dt2;ai7ݤHbojYz`߬#YɶQ[د'U ip3"4B%0AH:kEcd$z1iOq/b"T `mu,0c,Manh!]u Б$H66ÕKV #3Cg۽xf֡T;)l XMfoh&xV.&}v.Լ!z*)ˋ vs%x.^;b7y3N"Ǣbe^+@DH5PK HD$^ }Y"}S<^58P t.^DX@`@X"r_ l FjsAP|RXryi^-{!rVM9|t`Bw 29e烫$tqy-;1ˋwպPzz']Zb-b?{^m7f[!FeSbc [UDm2"7˭3Jj=v# 9"/$G쯪E@Ulf"e'u38ᥲɄ) 8J;rSL׊a5(H7YfC9>Fetp˞̞;!!_~aH ,zJ?43 A !_4/'^!vޤ$Voei5cZk`í5Lld%iO7* Sw _' z9ƗS &"?T^3 MqBw®!V5 w✟}lv;ɒ. T%HئD痷~C16_ݑQnPsgx9y9Y#s&Ab ҁ ZXh_; EҗUӳFt,Tmkd#ǟoTEj-w`6<;ǢY׾F?G .}YLivoq,]Ṅ^ٺBzPʕd1փ6YMI&u#|pTGL:3#c)"ݯtsiVUy7~}{4^F;QO{;H#ǐFf"yTX2BfkGR0N^}MB;Kȸ)#G$[NtU'nfYl73-̢,JP-C ׾90h\8"#@o m뗴\ PgQZ1Q/yZJHA >KWdu]7_i fDžl`B-u6ĸLKHcC1G.o QZZU+;OzriK _'5(|E%H<&Ǭ0l1N)p پ]ɼ,K|al=p---Z>6OmcVAӛRn1&$̓;p/.ThrT?է?3& +%\Q`:Τ %~Wn0%BtGs]袪4W,ZHu%V-̔fѥ]@0я< Suh6 (xA+OK:FY0Nh@ ?5a^2ˬ\~26$#Ԅ@aߨʵ/v1z~Jee /.e[ib*}`Y2B/Z]}3 'eYQLڧąW_Sol_*ig)xbgz4B<]5mylŻ J'ݹ@O3`iĩ V|Z4ZO)!0G]ۆXaeP=6e*H== n.tښU\=r:>| bs%+]h*QDϪ_رWZ[6iO֖Jp:nk1moAT 1pc?$_ fn#s*9Ck;RJMSetV*ѽܥ8|Ql,X3HWS^-[y FiPmM>XWxB?<|Z#u  t2 (9J(,U$ bĸ TJQ>^٩\z M,SXO}螂L ]^>Ad5pl'1àAThhwPR< U6#wJK.v淹]]L@]y4`ߙaB|>"@V>Nxa*;h)U'TQ}hE:Xl8~!GH=&~ka[(U8/(Xr$in_{.a߉63e\[D&KLC"4!x 1SLOb:Y^b'zi4; ]DJFnoz/ mb9=ę8 Rh›L݉0}sl?}xό O`TwwO }^?dĦak 7ͭn</&t| d&~h]]hI S1.ۨ3ҭ:"h8͢r{=|aL/IkWt$]_/ €XI(L*6ƈ.È .4HQ"^75ԤtOEXp8B,u5ݞ(ݩJgnT^Q`KX[] V_^68GfMDJ6"ؽȷ+焭7p01q2wyVt 19ݐ R--,c# !R4Yȉ=-C+ 2ɫCiWc]Ek[ln@r֮ĿtM NP!aFN : S]vw^XЦ67ǡSU>=PCEogg ׭xtɌm7RՑɯG;Ht[A0GfɆI\A(5N/ep䭞ʝ7V mL纘)cٶeoL9UJ[{]eDWC$D5RZM?{p#F!3H3L4`bǯPWͬ^Rqژ+4+l0pȁ>6N7 %-XOhz)ߪ8<㶵#'\7@*_/. DRu/}+fq'@6 ~_z@IC:?`!R+V݃vC~ DτWUxVe 9`Rg/mi1dv~0]n6^3!>z7:g *& u z}pݿw]`m#@‰e\?Vt#)m<}=Ε0kt r\Aѫ#ǹCSgwlW*Ҟ,$NpCF.t&ADRW^~BtlV{j[u{=J܂mg#O|;t#/6il֡^S"Z*jmVgZKc8%sWݡITXNC "D_OF{Cl:FRȀH~ƿ,pqe$^ߥl0җs$t\g7`@`VU5R!x5W=A0X_U4_U ChݓBNtHPtd,l %XWJ}?[9]M[O K;ߗH8/\>:8w*~g+Ccu֗\#wI ~հ;\Gy\~YUf㬾)pʺ=T|fLQ$t~oLer>W#>2FiGϨbw'4rI_e334tV0U׫{ ޱ֘bֆ4L:2 P?"PM.q-)}J),UU'ω7U'ѨCxzX!z.ϖ3R kh>lFh˃2umGr<|0.C#`|F%6%D͍d."xIfix <䆧sْ<`£P>̗m<)xA8@pYqۘ=@1C#-lm3nkRLK0f5/ZLNG7jx}訉LϢJ>JO~\ʀZ8ݱn.Nև:V0lk`EemVz'J# {VQ8x m_.- 8M77Л&ڦ#<zEC}BCMI;6r_7oMx67 G,%<O"aQruAI'mErÞ\gK`qw[BCs9mR|O:[g{ԓ)..)$ ~gzeXúl${rLX`?(f n&lblKSs؎`27|##a7et"qSbj13@3hꧺhV$MJԻ9U?g65R8> xa 4#[|^ɰP|КiU*VFIlPk #ڢ~o3"8[}۾+8ݗIv'm6# @GY2$e{f1 zx{g~#ZmuP`-ocq0JyvAI18dd >Muo5GQue~M@˜iI&ժ_7\cyLvȐUONWO UG8gȈL\L(TBG4Lt*v^7S=!ywX@lgG ՛I@iAq:uY YV-qZ)!e(4@)tA<%Z C.3wd 'JeYv_ԧ_56ԉDDvs\ZN;XA"4l#",2ɋIJ(ћ8E>(0A?/'5v|B )$!?oڟN'L$RCDz8p5 4t/XiV}֯m^ʺ?g0Vmt#M%'Y6.rB@1.5R_ۆu$'Q:B9쥤 /–[nEV ryX,х =:ZK p@[BnHDwY6MeM J!f`tXId{jY]B5'|슛d:ҋ %wk{םYl_:Y$ⱅCTrLA#?]I#BF"N`V0Q!d2UyZMj,l`00JbPԂ6Op%{{p \;~&L!YGs^CJ k|#rws"@)+fsK fLGcr !:ZƁ?]u.;$BZ%Wl9 :cILDWJ6usL\6W2ն3[~MzswztA=_6Rn;aﱋ}\ANX;6tbop~ߎ}J #j/'~o褾5ANB2&BAGÕC7Jsʸ:Rq $r? 3 PCZCOmT+X/{rd i^R,QUX%rgcAB)WZk+BgQ.b̔FW+3] [&k+"BɳNЀc>XkPQl-8_18tP[B{/.r*6f ⺡tf@EĴv]0K7tB1Jm0DA7 GCD縁@##*,7CT[壽Q_u,KN?qU/gƢ3vj#1nhK[8/[WlgB];Q`ݛN֗$1;hاm~jiN0e^0o)Z֤&&TcDFk^Q9UfjiIr*6BWFm忌ZW 'pے gI?#kg(  &UL3m&ͯ]MyA 1T!%#|-,<$VP{;hw=@]L"IHw&|BDn>Nm0YI27P GW+ bϡYD*Aܡ oꫭ솢$IC<!љ Y8l* 1Y/Cr^uu=©k4񳌣'Ȉ7[L ;>+O[L+Vn#s}>C#ާ%2_aG: :9*Ctq$*\&(F47\_k,cC uʓCKtFF;5NF8Z"#T ַI3+ Т5x ZǕN[,fr,bB&A+(҅4_|;I sއm&1ɰ AR&yP5q @Y>*x#7>ͮ t 6x~`d^.A54-U,ϥ QCO=^{#RKC`T,~_ejJTY% Xxkwv&ZڤLy4Uh̥r;%,!krmz X|>M@]`3u) #GdGlmB2h,@:«*h /F"*B)툨+u&)->Vډ|OPvZ]3[qUS$䝝0MMxUn`r7"HޡQFMh)s'87y0 IH=hI VS%]YbBOwCV띴j| s̵U.J'Եm't.ǹ{Y户r?]EV]{<\K #.xOOrDSD 6y$I.^b}I!erhQyJVpI000 bZp0ςH Vꆏ Mj!_z,SDNY[?*3:Ő ^S;|0#>ܝKRTFFD.$ lgxTԿm]H 1/}Sg/XXU#Brv]xUGIJ.|_!aSz \nžRe"/{_(OJ )B"hh#c\@ip`J}D):yu9DKرxEߝNqŽuhqp-J]cK%u,g9J>ygޖS'-;SDcJ̼֏7)eONص`_i@HٟvڰR7|sM=cXX}£3dVRqUK -mq7~FaMsC].}: #)"$9O̸8;QRK3"xD{)vX QՅ4 ASQlWÖ̯ ..HVn [Ƭ7&*JaDBWsjp,K|x 2v\jj|6+Q+Spz#XOLWZSC0f;Qfhzg4\}f,ۓ8|X$hgjЌ*'AV0?cO D*z6;nWE@k(@I pòoӰcjA{-9ZK8Opq{4d~zl}nmzE R[/Yæwh\i]\\K!O]hftP\sgoH|];גԇqO;M( >WW/0'!?/؏]}gL+fBwa>_l iAoM\4ٕdIɌ6[^RF |VªbLe$YxbF5`*V["kwf0o{r7AUF#ֱj{pj.m3|o4U!S?2?v#EIo+5jz̔ =v܍1( CJCܷaA%D*:ǟb+|V(K6,@ò')Zi#<5EpG*1'3,!AfW6H8eH; B6U&ycl5/L*EڴN{d.MЗvX(,j 'H)[1)@rV4]"|Hmыt[ݑȸƺc ^ 1Z涭cAxi2f5wnl+`_jLbʐ.@t.E½k%(m"7Gi giʼ{?# u^ڹIu ؼ4 /ʞ /qY eDՁbDŽ@L ްNd ﳕ$2S'k l>Εh}7w;1#TFR%7Hڣy^+$iXVڅB^Tj>XX榭U$)MZ|zMZkeBwGQ٨Xн>{30ë~2~:;HйՅ[9>EYQ&$qL ѡMmV\Dխps_M`E*uqO芤dpl#8 Nai VNbģ᷵)u0`X# f4.h~Eh|wݛ~љ0ʛԽ2F#^=>bL}-$yY%S,xv'2anBZyhN_ JN=['N_ٍHOkr%7^"?@nfFf0Ckp$:*"ȶOH[Jh|J13슴lͮ|;_X 饳Xa =c#x9fm&NA!/oW%nuɿҹO PUש&4J-t wte_4  9% wY;&dN_bcHE#x# >\mOɃ1/­15kXtOjm+A+SZ2.6GF2XA%1 p[J{b/1v;A?MD=-x,zC- oj]2waT亠@L/lJIM Ѡd";s,J !aͻ>l>Io&h3h?<dB#)SFe3S,Kg"Ä:)zlďVŽΊQ&O: hb3t,r2 1~ }Iɯ;l O-0]B.Gy`I BL:r󼭽0dRk$hB !Ȕh5j4S㧟-6zU4OX2O?;nl1'sc8PwΏI+ê~eb,] K/}p$ij|"9Vc̹X3S vEw^hP|udd;DI}.b 04i>pj|Kb6bk6? )f=[wY,SfTCT*›y(2GK[Oְ[Xb 9W-:DŽfӨvIVFcgE#aU9[ѿd%e„1MSHGֆG!?c!)"CK] dړ*Ĉ|kDЀb^nbhKz>'jg$CNq;ԤC@/-M@e)P8L5}5@r "(pLl7tŐNif/AO޶t*1LK;hv,Diti).hb vM,F 7`%EwE`&B⒞uW %2@;-N)|ݝAK8 -u(u{A#3moo%.O!]w1ƘWycQP| 'Q؝)tbE2{V3؜| yB@[=; .SHfxo' oYHQEAqSZ)NnaY.shvէfݤpEWк'|Y7+ҫe:=}};cm/w,g/RkBfE@#@Ti)ȣ_t윕> ֣T72\… Sl6ǰ:)QP{w=A*"\8&SDqLPi+دh="S N opA}ҥM(npzUf[ x0sYN|mǜ]W]xl[vjc$ֿwoKO/ /%gaiVHaTDܞf07v[ qіtBJ*$<( |j"M; PyaGEFc!^SjG]Gw21lǎxTY@vƳGʬ_@@hmڥn=mZ tul)6!&Sh4W=|rp 2x> ~%W)T=1!zC3p^K ].m%m5rVSh0lj'nZÖ=u6.;}'pjX ܉dE޼fro 9Ȉ{t(!z>с &.<|7&\T((y}gJ-8CWR'D&~r8n8^7&/a~zUme>1Zq޴c+&:fĬ?$y1 YhD=Uc õ]hW?r|y-NA/ITP! Mb:UTl' p];(hhz[O,#= FV͉5H/x<e%o0838ߛ%Ew1ae>ƭJh?8OKԉUի'߫62풹򄹠~m`'A֍DY K;00rխ_-T'CumT<Gp`JNm 5sX !`Z2#ub#j.R$3 &+מKDڸjzo:!i]D s uubn9Ն;3DTfqoUtcz-Bw1HgNscDW,V 1+Fi wlq[vظ7b"MՀ(Y2n p@m,Ia>h0?#f- XtH`ˎϳPpêu"N 7BVX|W4_<# PE.&$'Th'KT`ꚬR/t,v+'&yn qSX ُW@,p+E$a:H_N)? [c p^_mĢ}x;,Y>VˣuGeEqz!Tvyڳir8JS%^hatӪJ`8܎Z r (2/u7GRۃ݅(^1ryYQeychFNB0 3˶Oݦ],|#>rn03C}Xapуܯ|ƇL"]YO}Jek+78ja}GxHS .KÜ%vki kGDt.=<k?8âɔr0 {JDP1" T*M[TZ%J +Pe & ZɉX>;FuL)xwZ J%bj+ܪ@KvٝDЂ^] w(?|>me5J\kzɯD^j<ÎfQs^-N] 6wl݅_R}xQ~.hTGď\Pub5[e]ZWZu\bYs ù]c@S *";аKU 6DTT"O!2Rp`sH@Ωx[c@X%kJwlʮhHkz hɂ8GY/u$qBt/G8.G[Atڰ?iIgNu־'5`f:ob aal 8I ׆o_{QX(pֲ ɤFh68Z[tW; <88凋Q_3>bUN{@!<Up.y]QsDG#-њ?l5:bѴb7ZO2L]MVui,*(n {* Y5aM *"sB^* e_ZwӒY/>4 )>DP]VdAg2{[$-78dh=v;2{0 }o~JE,̀&qUbXkLE| 7Gڥ-pVMXcPg68YF`c,[ݳ?I{k/6osz >bt<68"WfeULtUM3"W::P }V,-4x+ 啷us Saq ]|E!GTp2] ʾqr^%zq[6jOΨzLṘ G;a`n56Yn*`%8,5_Nc A叐"Gz].AVi::\\Wѿ& Z6bǒJVo8Yo¸6IgNM&:]7J3Wk3Ӛ8 Xf0zʱ#aLa~wцsV57 ]F1aGΝ;f. @Za-@^#^9 c"C% pëa[SO kipFZ3zx&h#5;k<\ лm% [6.FSAv+_)\]x_]E۫O֝k").ԭo@|u{8V~qES/L=2_L0 iI α C6ڢ?p bǨQ WCm-'ia nbĎq65H-Yb@gU^dROɠeJ˔$PwC,~\QuħnVѐ;g ;97S)u,SԨ&9or]uI<۹0 uCX.Is{CDS#BV7`RNLV|߇]/I% x b9 G,=ţby.@ #o_Jt@dAy=Wrԫìnٿ^Q\G81a\ruN /[9mXy`NbMND|ˠ7/JW?CJegܝ+E|ekFP`3RaMcIzTbܐaFtgHkTR{]Pf'Rn7[d[^y/<_S r?/M3M5_r`k9QYcڞpvm\8 @L<洑ww;?>Rz̎V u&`U[PL~uhOo4 6&,FY5@C<,Wx,E6>^ *PI-{CbHA;;*TE" mB^Fvik\8[!hRH_HHC&LUw#0([2`[b[IP~u85xveթHVFXn%Hz2Arb6I=dZZ6yy(%'J2̔UD4`L}j;8Wt4l,~%j_7[_h's>$л$ͬz*ƽљ+Lf&.ko3ZU<b{Љ^L÷U0?I9[*LNZ_J>pMq 'YhE}yO  קJ$9Mcf"r\ROTfkh//f,Lz^jQJRpE;D)"DW[^/8Rః򦢫>+O NT 1MBeg36Cf;wڏ|x bY5yDRpݱ:Mކҍ{N[î]=A"x ת*r=,G|(wc齍Ok4vuhᑁj?NIlLGv. G5DC/a"Zbe;!L-%Gڶ! FI VI&Ejs]0wjuzz THPd &(S4sK@ Wg=C0\ _U4!-CcE$=AJ2ޑ7ER~ODNNǚh(0Jq x:5S D$Xaofq;%pFjEɯѻB_@>EۻH*Iw 6p4>S#_Cjg3g`-DQVFǣۮc8B wH)D]bgS`D^ž8^IA}AR ($D.I7.A1= 6xCdGΟvͽXw5VmpUT/WSѝF6^Qłqm5`˜V}L4[&rB:.vn,j$c 5hQu)ЇP=ąP3tLlѡ(k!n6E\oܨ@LxIrEwv~lo|n"9Z14Zwf,#j Yrյ_}څ{V-[UbΏ4Xo9zC! 5G*Ku_ -0r?]kpэ|J;M`⴫bRd}j0sR,_n}Y5H|tıXdP>@F7àÄ--Oox#k2rtӅM# Vy{7d 1\4ڊ&ǹ5#艌F'@G^k⸆`S(ZIqėer'9׼,^\x<‚uRʓt޴Lh [F΀(rG} ut7zBW[#:%EKM+.5˒E ^rDX3MUF>= ɀW_'`o.z=W'  t]|#QK:Yb~++`O)HF?)l^W?{Zvq#qC/x1JsM_/Vun /r5Nlwp[)sixMUà;VTr*|>{%XGƁ}%a;4Z)HÉ4'bȠޚogeg4T@sШj&E,lفtN(T&&<;EMxD…@3)(\P;F.חZʉFp} F?8֥m'"aqoD(CJ@غR ^,PY]R!B%ÎVXh{Q"W~6G`,qE7^)evT2uTkoD?tP ǃki4c˳MPRAl_\xm5 (@dDVZ'%Y=%%X0Ȝ*8Xl?}iu>4uRHa/+OBT>N\׆k1r&8%GK\T^}};5-Sp1^1 n0uŸ\n躷4`Rw<Ԝ6R$ !^z&wv`` Zn вl;,겏|] p?oR'Y* W'WTHBX!Mb㽒v-;-<]{K7eTYK[d7&MG$\PΡ7c|)Y|"JZ|J(ycr,ݰ!m̼?oKK`n;K ܃' |EB1-3ak!% y` i!\9x9݂&uo\N6/,i{#X֬?EV-&G+y O7z@:1&(d֦L{rS8'?c؊;)K9 `lﱏrqK4 (V(D3"sn@ꎊ eFݝ>yP*?П!!P[ܨٌ녹WӇIvunwAMTYV_`@\l'ɓJ'U-mٚm{v,c;5>:GELkcʼcxX RLϽf:$Ԉéx ܄>vOV%) dރ9ڢ:AdیYg&ܢGW9L0H^,ݮwyD0i_nd tߙ;c^D`L':uG oVoz^<^6cRgGUVP y:ф MI%k'f#pBǵNQ{qޢ,<: Wcәk$BٗH FHοtR lbOH/rL(SaUy4GF@VڛեA|K.|^|B]?I;U͞ :q5SyHo"':"wA*ǭ{ä6.uVɃ}W2 Gyg /|-'2so,X_E4l^}*`Cl3| zh%U6 j<W7cah#gt/&Nc}PWg?CBUxWqnK+Cl}X?qY?C}sW1LM'p!&vU!_&j$|@46~lZ0,+\54o[Ġ(&ʐ4`;#=^>$v~ +䩊ŘF9Fz@xj =E"bSۍ;vNL咳CGb[@н<6c|Z ۏM Vfj05f{96h\>J_K}?(hI/>xhT0Qȼ|WآXN'JPnΉ $]eex9/[[곚{\>ID 1=wօ ZgcMgi GHw76}^'RP[pP&ti#Si>uSv| 4l:`7mx"jpC}eaџ LnZ a*w+8cim T~t'Bxdַ6\n:`%x.:n}VM.5~?WD+o 1$y63r$.d lm_ʾe _X&{ՆUÙ1N7#-}Gvrk{yX@υDܛ <7WBhƀC 9GYppBH fT` նܥ`JzZ+kqPMLW ƃxoa!ZHN')AȐiюXn'}ֿ|)s/PD!v7EÖO)EJeemFbg|.}N;,=_̺ úlܑɏGTqo H/.jH10 \J`H5hՠ)~]g.*-y>/fI8GlEc:na&WMۍ,}"Z ȜRP,46U\rt"~&T#7"*=`9"#' uG S+P湆5ಐ$Q.ńsA(_5gUY¹$A"fU0$.g&8`㻸I׏ }Xtc'2KL2ry(~w@ٽ1^ k; GƜ-~ >{iSbx[Ӗ!E}v*k$FaRܫ1]S )A:ߚ%[22ZtKwQYp^Ex=r$ՕtNpz'ݬ4:# 9ɋ$lio=.(kǟ&bAj!&&%.*[4Ow'?^B˾6 |ua\ -U#vbǑ--Xn^?oPd vQg^>z8B0\lĀuҹrޣt8@ {Z,BxG{ӐE^= 7n-YZ?DxqW'rي=_ڑ=.Яz".b#jrw\/0ch`&!H"gME?0uGS`Z~#( ?h,{|wj!F('pƺ"@+ژET^GOS:h-3W@#R1 *י"h>v6:y}r1 F[Jlnʁ`Db]J{c+oʑ2']l?U:_[z 0pF_\ ]և#Ŀ5M=~ߋiAvVQG@8AsrU4~2cyɵa~tWbz·C5lW*ߡtFKJNEJ|=do)s x/Kk$mf?|8yc5vB *+z\XNө-.uD7؈,*Notv]< ;LAY8wrn8_\4hrԒ#ٹw~Bqf)˸?BZgS_8<m:sRP[udjrm8C')~Zg)Ldp46޴EW'phhAJߍb On`) ۞Z~ JApF;i$!7nr)'(TZ(4ptole#WÐΉ$63JmHa tlxr1DZ֮;V)*;]K]I4͕v:ɱGZ;V9T[H6Lq=VEUjc)[haWqy|$!X<ّ`°yUê˪3|*C?΀rwG̨w *f$j9m-޳1D s:"וx8Ps"A%vzb{jMܡsD#9+sJlw]ib!h9bͫQկ "DK&Wgi-Oa f2{d5{]{Y*zk峂 f߽U |osB+ܘ=s?5𕝟Mh'\7 ]j@u!tBY0`demfծNORZAWÆN[?Hv~Z.%eJ);^e_z.o%qZ; O-0}JȘ'tXtEr[fK/E3T1jD qB/2Ŗ֥@rnpPEΒm6绘ic}S4ԧ;w1dYu)G4I rPax H\T^N-9Yur9Jcp7:t,$Hzy2{jY,*VB``w6/?`a# m <ퟺoI*Ű:8&>5+y,N=$QFыS>F̯AS."Ӥ͓&(u'V8:?6GFm+<&|U4)lܘv6QCUDi~= l lW&W-_σEڛ&T͉8LNK3&0# n^f R ]!8}֣C]Unxcn =_$t񜤶f߿Oc\u 60o5Jg셮Fa!ϰxL'a;\/ K9B!wRa A{{.w.Y@@=c`Y KIn0rf#mk XM#J>ܝ[Ю♯$@:9Ҙ|];7#M ];='[8$rآINnS~~Q5u,hv(',L0↸Szyuj1-€cg`U E k˘}/6)wD`]Ҁ"LMU)\*jI7 Y| t$;/lAΦA@EA ȝlix&хи.Epj#5B?ྞq h6Z~|ɝK&Ӽ)sbyq|B!1b;+xKBVO7'"R3hˌ+3SVsaq~?v5&`]m4l.%Iw ^!;]fO<>d?K1|h% \Y)"R?2m9J!ڦQy%P7>FY;V c+Mb*?pՠ( Odp\@[Ԑun[?x'%]vB_K ATo_Gr6c%\|DN$-u8O8-)żxVe 9^кuP{%N=[oMq[ݴ%F{l$$gl ( WGۗ16x8.o 97830S⺋jOꚄx"NNv%?v@ٍx*t5LbR/T$F>F^JAoǙ]7~FxMX7O7Ue"^kNPȠ!38ΧT-¨i gqICI b ߚz>X?>Uq=jq 3󉦟wֿo2#zr6ZMˆ" E $*ʏ-`llW/D%_H 6kHbMfn_ͽ;Yb>TI]$=_֥@\y%LS`eVVO$c8> i椊оᾭ}lxӚr&U)i:OprUhܻ9ҘŊ#h]7̈́TkWuaD⡾:Howo *3%0 7a @דlSqE&`}_nnj{+&KR.v,]#< Cy8l6±ZVMBM/B7|~nyR ˯ ++ҹb5~),_. ͅZ)HG J9"%]Orq%riFWuX/Ue|lfՌ i ?Mi6AD HVhO4򥛝1MSgc!k r%%C**e{TM>XEWFGųb$7oyܬ= =񏩧X8\ ~ߐ'61=+kٚ 4Œ:gm y{kcR g6u~$Z8 W#r!h+ḩ cPō.g CdOk㐥>M/&=pXr#j@=![LJ+i E`}Ɵ9#,pYN%sXOtŹ[ߧx wV 4Rv)*r8UzZQ ]-Ph]!Ssel#~#oϷkMy&5ǕqU}z#^E4(ZhĒN,hQ%MSvOH%o(qLȧhT-eb}3'§7>w:F}D<.Nu@!Ip! Ews}G$;> @ȡfDT&ɤ- "Hڮٓk) mrȇZpcn_stI1R0JNP -Ҍ1ԞrwiËhvQmഥr1(fk07HS3%'&Al@ief!0DJYfv-0>w.I>'Z jm6S\Il~"B9EbP:9 "n\>#l-%:޲WiHR'AC <.ƫ.'? (!%a=T]H!)3+giJ@a5!.,uAf܀e jX Oqb]h((yռ#`֊rCU,V:l@t,ᦵ U\_7f0Ѻ51[v֝C-qΗe"| O$eW/].s/DI9>۟WN] ɝyVevdCb_+!O;;re <=xs>Bq%Tyk ƭo%9>FԢ"ulCj}5B;dR7`rt ̹nĭǖ!ZEӰ|,!ڻ<UH$~ _-_@PaXDBB4X6@4 \K]q(ɳ{*5؀}$| I|rl5{B ~wZ2Dg#LW^ؕ3z 9J@FP6~aS*-peE#rf^ @^֚L22 ?U'7rNT9-շe`+Z+bUi.Xm AYd`9 ]vsGKp fT!e- U+xAY\ "S%h2V}3 6[0)kD ~V9Y^rkGm՗/)4&x^$j:).y>8k$_oE$f=Chg~{ͤt"}2f(POa~Tאax;Cvh=6m_q),/^>#H ⥬$!JS/):~DޑTo/Ta.ŧ0;f-d坙ƻFfuuM I1\}w/S ?t Y$a MwL*x!2S`GkoiBCR_"=+>bߋeuUќcgqYxb( F%#'#kEFg19g4ƹky'b'P9p3Cdt1KpF)APe $68]qD~9y2 ~ݭm{+>CԔ Ä.gbGڠJ.|{/9EX{76n^OL~S–pObseY%.k >B)_mOmPW`gPG#<U$>0ʬ]ؽ8Va{t=B? w`|H(- vJKIiQ~I/&oR¿s@h k8 W;v_D:%iv̶p㉗%;t_4\]ųV!eTxcsZ@(Pnhr0^|Èhc(EV'1vgu]ZQ?bcM8>ewbU9;ǩ%# N{{ޫ436VTjtm3 ` /ك./uQK)?GW3GKӜmmH@2L6r~ZӋ,<ɛZg7 vHAM 5I}R߳+Xmxw@^N.)\V@tj:3kh> u^b"*lFX Jtp5=UWNfe#Ն+%,]TXd9jӮ Ü $ >J]X9kvZRaQg-Kx䫰qtD,Bb?.qZhrUjn鳓Li`m3:2}j9CB%#UڑR;0֭oo޺WgƎiۓ^6!}2B/PݬT֕| 聰oh@*e:`'6%o݌!7co>\5np>E ғ0O|?Y>g+15bv-R=u!sJ{on3߽$C(5st=t%Cb*84su~w ? YS )-2߫!k+hЍ3CaC$x'53S\還P#͙6ŃlM.*&@M#,kEE4VK`ż K|ќuoB> 2tk,}ҶnA_$+E5XN2[q%gBStWG69Ex%Éz0/R [bXB@7y"8UfǾw&)>Ý%V duZI~Yd`IXPmو`+wȬVwܤnLLzI}ϰ)K% Wa\ABl33‚a*q|kAV#߆;{ՈOC@D)#s[=D!dsww ٛN> $yIWM=)2ѤԁEoslrh4sa=u9%㸚I $T-@IndByIo"B4*s^)fEF*ο9V:G/?sxƎט'l^bK1p,Ӭ֙rK|a5%8bq| &RaG5~qDec֜pXijd;f޻JvnL޴ Ҋ=wU\ȷnZ#-Gu>}}U0nm6bE肧cfHL0WyCp'@̲8,r텏5~Ï/$FѠ FBn}hȠ0c5 BY$i*ǜPf+p5CLVw_}aM*qknYa()YZšB ˩%pQv- Q p-#Pke;oJw' RL{B{<L;Ťׅǂ؎v5+ A#hQ GO1bvSXgV MS#.ligqԞ&oK\Wc$@gUeZ^(H =& E݋Ozz#Y-)doOcr!CeBʨXYPue^|2}яHj0IfvЄs0ثѴ 𘨟pkW;wmC9pIz屗 ^οٚ_>OiQD;47xzDS93.G8NU@n}w$$m#j.Z0 I7ɀdGl6G \^h<`3=#Se0,M՝RM^0a3ȗT%-rOvT ^赌燬=&jC0$RjLX*Tϲ+@_>lwFQ{4L 5nOΟ-,:J0AdWx쐪S %㛩Dז$F/ʲQMP>筷X f+>w5;|iEm%Iz]yhiWП^wp6)#3_) |_G* ]`h-+cPW@Q bB[\'хE><=m*grZueg yVPVJ> tTB:ZLңlmumX~WV157ZF 95{pt((d)NU:LV̘0 8mÅ&j0VO/D֤KىA ~1~%߼BBj\ey@zַ!kri9Sۧp\/\7-> !:4"E@3g"U)s@9/AEAj&[q5t׽S*9=ca&+h벏ex M+KRQ=O*i& y30/"? ӄћp07MBl=eMhٜdŕ?#Ϋm:׃KSf >.(~w AzՀKAgCCQ@+ԖH&hǼ`^~=!jzw)\`0HvҭT|Z aBkE^5+^W‚1Tވ.]ιP"FJS)$'_UYsIB,ɴI(Gћۺy9L$$CgTbH侐 MtLR p'&N[3y8W+S<`t_>%C\}qa> Pq"GJD d'4`۶1bI3J֑r%K΢[yPa5gH pk<a]'_{ji#.W:8Jèk8JYĽGXԀmʠEnEBQYr&?vn+jWl(ٶdd=v !MP<ۍ%eѕͨåw{⅞C-մ e;IPj銋aKcEnQ3}-[5/0F x3 l{ikѫq+ jr5GhڝU*o0@@-yDf̚"ː,q()Z2jX΅ /nbk5P qL-zӓWcXe1@hCyNY ~|Ż`U>՟E'hpq'3b^2bT 7كQ\hFi|eF/jI|; A_M$1Y<ǖuoE">lsJ^K`NZ[AmrȭŵAŖ;y%R偵$@UH{wx:ݹ,@{*rVK/w呱,K?R"!3ASܒEܬV᪁,$${CBH۞UQzh3LkGI؂+!ߛz9C.*>ӋgʒsO}&%8'=Y H Mħ gQ fM%?l9;\d m>SsJB\ك7F‡w 'fb V $9َW}"5>q&@ j !yF_布REۛI"@t ֢)l;uxeܧM6M~TqqB?Y+ctq*Iק'1S>*8+"kY*8v6l(y1v9*ϵ03CsxT&?07.Dz[OW{YYlűSk {*v}t" %ESŽF!doh=Utq2U9BH]5fֺu#/b?N>QB0_p &&5Xh1m}$,}Jϥ讉\~sNarZ]"Tص , r% Y#Q8*-͒u@TYP|d^"Z+L9@H{o>%Qt.QA"fWQiҚOpNg3>%FѲPQ1{wG5= ݩbʚf:vjFlb^2/יl ;]пFb>v5 xؾ=F5~`E}U3~Wcou{ssl2XְT`xCT& kv guRio#|kL: *`I5 o3=L*(ę#hXG *I RFePM]fH{/P-\csMTOF.A-nʿ P-薾e4!W?_o9Ìl@cUJtw| C%>^(ȯoAFifHoMKݝh؎@T$NIy{l܇j"G%"H.92b.tfF 0ߕϺEڬXX{@%_MK7h9 1=EM[9P3Q $'o*ŽG0f%|mda+>5>r_"_2'zUYC9Nח6gVB%B_3khgtM= }F5m1A.^n',k ͟'8 %fKqֵg%^usm9%Ft‹#]]`Sꎂomvyô $'y %g1inu/`cϒ8d2 լ%DW%"G{aJ=G[D9P`hA6,t@Hz[]\),b&"Dx\D̊2`rմ"z223T}Po!GPZ qYDUN| BksB4rɇGR̷)UWufN/\uaW4p JoUjolD;GyLi{#+b-]į.7?{y{ɍWw^l{]ZK}*OMyp֪tǓr:ȏu22ԑmmڎ2[5Wsw>=sw,i}l|/yh.hǦي{)b[ہpă}Uf2yE:c½$?:x%Y_`Lr@辁Hxvl L:/]UFN}_” -}C4قp<#eMnJ'}@?`¢-kD0[};+}8:}xM`u#ȝF%R|Yr9`a#u(p+ZB`Ovk\{T|HpI\7`HR=⾨yj:#6oɠpeMԹE%Ne@w7skY k"k_f tx0F1Ly( {G̾k.02ΙCC$j7ΡSLǙoS]q) '*:;'Agɺ$ :O}&\ >y^ۊCZ%tA0?yeE%j1F"9uwlBgBŴI][1%Yk~C"ۊ1i/<+OTTYH(X|;|+{Si#h2Җ jc?k2*ա;p1+e @w$_Ї7LH耀Dà@+(69ө`q0]a;QvnEvS,T[듨W@܊Zɥs(sQH*9HŊ@V&0Pbfڇm2@cںnn' nyudA{3y.׷e፾1ڠ^s]!.%jlbE@k5 #ftgF$G*"rڣlfq8/ve](j8E`l8*G& ;^n2d? nO\~e~z+ '坑 8SSҶ.?c7G8/tڰ*I88@ ,qyʙn{HWVqk LrPrjаqU/Z4v2w10BhetG] e4V)@?6jJTY= RrtZl?)TH u=̰ eު\ B8zBi~qQCEdj~Y6|)nSa{&۷!&duIK})RBx"ҩAȇ.ۃ7nH7]<%¢6'}Fp ?M&TuK!JȰw2_^oZUW`>ihjs CddWbb^pkB>nV##nX3Ȑ(YFRZ`QrJ= Q-S|&T=&XlNHފrOi߽V#sq1 EE'}BwbB҂9yzio n#Դ&[Wܿ8AVgz?k0<;zK"=a ^7!CevU}6֏KLsG"6. Zsk!~)G7gQ7\\:P~ *=`xtP5|)e5/˼fsT/ϔ0/.T]H Ð JJwQ|aqd|6so~vLIXI-$8^z#uy2=M Wt ~4Dr7L؈[pHw&FrحLZ$'91\zoc(ErQqY2˒ja8a*5HufZΐ"0 Uo * @?`MV8!-'D;H.94_L(s*@o7}W,o-POL|rz4/,[,rDBudԣZ8v C}!="Upqpש'e) N )Ԙl_b!{,m^4,՗o%-9.UtӇr}Tlqu0z\Ŋf:3W ­aeVnXr8 #D9DjCA 뒃B|nY^sTCǞDآ4Z!guo 㓷TVBiO<O+vq?s<0r9jZz29eo-%yГ M^Þ'nTXD٫tp]@gnPk |bj;26@+$%`_`T[QY> E,hG8avIYM rCJ3J:E{1. v\m>M7m%> ]px5'[`nUFaVqIRQq@;Evtlj^ŗ:# {EBB"=6Lᡴj504[|ܸ+uX C_凍C4Ҏ q8b4Bd STՁaꬓn_9iy" kǐ`/ KZXnٵQd& <ݰM+K8Ҟ ZVu W R ۚޓ_JQZ'g+iB@s+ńiZq>*KXYcF NS;*ήJ"<|nQt^oY4g߽&ό?EzUxpCdƇrޥwtorE|nYp5Gl{GTvVP&Yo>Zj6XiD'{$0Ld'֏ ,5JSU^ lq= '[_V7ίҚkڋ2cÛ1."Qw&A3цW(lo[]=E F~!k 4^Ti49I1.lX{өLE sV *dGa3 H-0J:Ps~ܐ0%*c<WR"O0hPzPi& ݩٮ\4?p9۠&z[Sf*t蜱 f2~+Oq|%,"-AAJ17ne 'Sd0O6aiCPqUdMs\N #U$5ָ͞ >h_;hyVR8;s_%ffw*8z Ds, ѱKPڢO<|_ӳYrV#^SLS_>]ĵ t2e3I -.Mw[ B <S\,mÌfƣcY&2wª5bY+@оH6mfAJz~YWUX]u^rju8p ٻsiZxU-io)՞s-Y0a5"$j]|̜|P1BOajj} SB 's#zi͝bk`&3ePHsk4iwPv 5~: Qra 6WhQ^y1UʲuX3O'mP$(C)(BH_ES-b4v_V+>h$ t"+)ۊo X }ֱYO]-dZ ؓڍ%͙% %*2[̥sWq%fB Nmy]-pJ3cS Z 1({JQ rWr fB+\McuFn~ Fӱo^9@}}̯Ye NcF2BgGɴ CR%4ݑ1"i1kDw?M^mSުϩ}//,+zPJm|3$@nnGUp8ӋͿ]#fRMT^?c2`Pba! h<%4Lzeh@( <i/82 }<֨kv"ƼfGoY) r5|tTXpRʘNδom6AHbmyO ,B:A8$0?rO Y΂\=h+a2`†s 3j1&[nr\N)iԛH:5}uKߺ#  X: `UpH%Ch}KqPa4Aȸ!I?ud^GliɺN0O1񗟰3k[- MyBgJ"П4]ieM{j۔)SGbneitKq$b? ~XpDj.v%~ yYW ,x25 #t{W8N)l!_ӄYWޑ{!HP*qW;(H:0>B&%R7UD ,laE9:(R?A-f>MP6:&TC NdS*$ nwd;~|i.Зuִ-G< KD(SY~PLW|_j{!JΈ-{%:-iX>ze U;;Hsc|1 &pT0utK*aTfHRSWA|;g R!D3j8L& j8,y@v4xlT6m;O dd&" uhldO3m]Yj};`JH昻tT` Is`Mf_ٝr!xq.O*'',@^6)dij!Ņ%0{K9 P;0O*d"Q(Scp;a+GF x*ՇRoW)-g:'غmCj#cv JqLZV_]&5 #iVp(cqIİd#/*ov1$=gX.=|\ uf;Ot;'E}>̬V} 0iweZs '.lo>ݠAÚN,pb"v46JQvџKv#ISQ)4V2KNʊїiؙK@w]^%aB@/˴ovglaS]|/".X0u$ڊOdS`}_.v SRjÀD1/`}Yx41WGF&g /ZGSa.o\t[-Lm .J0 "SqOR;а>0F쫟/ ZRȝnARLdSc{rS:zpvh,G҆yG;Uč\t~zrz|y\xr ujbQjӈYXlta絯yV~W6N8-M+ _'9Apf iɧ}=2 Vd&,c $j7鷒?vHAl7ߑs{ymPVk"ϔz~j /r  lL_!nٌ0>k$N\0H2rh>ъK{hDI9%RTܥCWMf+eИ'0*=R{G`2)[Gb۪tFd (7yU\fLgraĤzPU[w%RYo0)UedkKskf8fSWG2pOnXn%55<@geVi'㈌VEm~ɋ7LhY+qPRqPk΂~ Kߜz:̏=4 -G"OVc|vCJZ#;kH7(Gc:"lܶ wɠC ٕ,MGYujd!NB~%S;O}d'@RM{]Jq c)3f5md19Z{i'F |9:DYG^6&nQxҩzދA;mLͻP"pU+6fJ5﬎$j[ʖpIcuy^]U0I_.ml S{uY|X>+!q60OIc@='NjDB!-A,!%m0#@!Փ\I}([\䜷]t,ӗv*hʩ@gPl%eNu8s3xg8x/g!RD׋8F%' c=ʗ H83udؠSjV|sP d58q`6tgU|4_V)wUh P0 rbE!)vYNc|ȦMHmUYǣDfws&/vua)sceI| F;9ʹff7AE_k0+"bTnQ} W⪼.|tɱ9h skvbRIyvԢw4FPhdoiI8p.^`II .G?G,n8jX! +4AUҠa%6*e)tNo,53 o`HgK^M.J&mu Ä /W|E<qRgA8QoH#񀾈kM`7+p Tp^:r 0-u+77Yo*w}]% bT> U/ƹ6`PrMKz mzw'g 틕d킿|CS DKT -ZoC5}>f'lƻ Yz8#`g5_܅` gD[6XnXzJntbP^7e[ɮ s %*{tSop5 2 {RRWE?0eG_\/Z[:@d)!0iN <C&j-,rXzs2+,0#IP gU} m?k@zH-ܝ2{QvZ3TuӼsd\#V2bYŋMVzڮމpCG{S@KhTAe N @};!;5Y?7]'fH%[-RҶ[Y O= r y ҁl{׫7͋}㖔[ŰP2HV+k3WiG>'2eKk[)_fPj'`u\]X,P8IR@wWT8gА V}zmf]OդKW78OHAIpmb~^,Ny^0 +'V9Md1ޚZt.MkǨ>´`S5 ޓT>OheΚ]Kҗ-c{ےVʨ,B**K;p:bɩj0yE~;dyKebɧ=976ʊ6 h  KN*"Ń~P6W AÀM-4)!ʞp|?ĝ870S@)Z4[4[-)"8n!ݤl6.I]+W \oV*A"xqk#+ׅihr eiBhaߘ$0CR [o#rXf W#[f/c ھ#K iSLCCBMj&X XSkh O snD^հc-{Db>`-XtPX"u;vX'9&mOy9> ru|9<%mFo= |vl+<`1"g_vlf=4!ҧ=n.ju~Dj!D!\w`Zؽʲ,La s0EOCAuZڿk! Pc> 3!m͹y[k3Yr24JZK^M@)GÇ 1Bspęlݻω>ȴ_rY^F_\Z"^a[ w L~kDmt_:1XQdCT~cR[o:h: \[xDLp9wX4܍."ۍ1J$rz*˽Qϰ"%_XWC Tfq&(bB,܈! N VE.sW?{N# g[*?2ȘQr.o.1趱౤^d,)Q~ZX1g>է[6lu${P9O#i^~#$m&H*?м(!gkK}3[Vu0Xp|OBx$a%^| oIz _>ޤ,wnvs|&1;bCh~>?k;А7@Xp3(uIOS*M3k2)Dg<~t]"VMqx'Yt؍f{krsxox挄u'g#KkLg_ 6 'r+ƠySCxdڱnS4'|I K-)6t}8/ ib-[> _kWvE{%f/`(C"y۩KBd*<0ԽknMnw$0MR 2#?H-L=ybk B9wX[޷ 9AԁU9忔 Zlxҕx8"=Ao SHLW3o}5¸$:Q",Z AfBjZq=IoPԮU-9JˀÄˌh\DFـ.V1-\tI~"/M 0"+]znhK7JGc$kK%Թ%tP ACPaK/t{Ǻ+2h$XH+N 5WB{Dnхބϙ ~&kmr*B0&хr\W[2~2r@mJIBwju O2g!ېhQg@XvN n)y%ZX _Y&ORk/Y1ǫ ˈJrZpR'_.F>DW\3S50MT#Z{AE7(%!`b;y 2#1vg67:lb"B#8r"HGwZg䓒r9,&Ӎ'Mk%,yS^w/)8YˆnaoHq*t(q kzU)f3hmgQ!lP iMb1cP跥櫑tŪਔ=A7|:wM̟ͣi{ q$$kvCTJh.CD&J)gן!L03wΆ7pP?D$)LKTz6[;c{}lR_6[(fTcDaES.cigVw&Zu钿#"'ү̥ wb (Y"ޔʹDAiSqKFװ3T N\7#]1o-T XQ*?V0ۏ;|TSM"b8L_ , Q3#vEu&KD 9:T3L-0G1(dh)$ fK`eRճ#X%xqHWk059Jl!k6U;ƜL%Y4RYhq}hOM44Qr 4IzTQ 84}x{|z:>%qgYFO#UfsT"l-+O?)M#=ϓTٰ񾓗ϕrF5|$PVF n1Uq`ziކ߱[H$Pj Ey7h+H&RbytppKGIB}n!5W}#D{TG؍ll@nw`>'¯^$H~첤m$ZvOܕ_o=~57\2/Ag48*[v-~V̔'A:0-KʶSLREE2n6 :W|p}K dҚcXy0@Q>tn8h OSI&~;МmQC^["o<\sN&ӋaIM# b~Oul:gEA^7fEX10 Nl/c¥܆O#+%^ಏ 1AFU{85tI;2̅0WGm.h2*,zI?}u6F;U00ˈzhATdEs-C<\m72y" Ÿ3٩NkJ-j5|=6F&r{LaNzkB-/xs 8d4,#nY+~j |T4lgoa.VơrrqQNZ<狶ڝP$x 4m$٥jB_kT\0芝3?3/ SPx~(,P[p1P=v;bc.zp62_9&#dߓ Ŕ'2y-?Jsuz 1m `wR^լMh?bx=>z!m`C 1Jԭ kD B@ KXDb8W:( `X_VR-ISN]U/= ס[ݱFh:oT3Hna^o%peKA2I;qCy#S+Luؘ\ukc@ 0VhfVFʠ:h& Ƶ!gG{.6z%t hPm Us.^õ֢D.h!6!h+6}Z ;8KSlCi,r\_+=-d;Z~Ndnzh8EkcOUuL#Y4Lc5y%+*[`fиY nA]5ↇuZ 1qz69J0j7P<i≢9箛/6{4\ $$ SBH)frZko7U>I(ۚv9 P*bVyK\8b٣5l}|Y"ٱ󈜘6J|HsY5E'6zhmJP=4a@ԙc?y) DYu-HLz-VGBհ0a+k: @ZZ2=G((8$˒% [)=O@q!(_[H _%URܸQ_Fڦdu /?oSpD;|*5'+i˹ ]Wi""kUcզ)'mcM]j{n`\qWyg\qљ>:T,6օr0Qt9ݾpˏ\"јWR[~v5}nfi;F?Pl\ WXk2"YX<ҥ}o)zm(4[E{ϱQXRjrY)vq">-^ƑLy%|R;d_ 1{oA?Nml`F KSpɭmRM|b8Ā,Tnj*~'eǤ #"83:X=!qްs!^Gj՗om T!¬fek䞸ژTwa7;'w` zL @%)n ut%aRz /0sPVļXO8WM@bqKDbZɲXÃTeztrkk,_T]_M8#j[:"2X-rjN&Se~IvW I5>36Ng}D{ qs 97ȅ^Cƌ;8rSfbqhoowʂ@c` j$Ð{`x.3%R"nspQ1.h)N9N4^xfKfQM u$¾GQOD>Ʌ,k[ OdZT=/cj#I׽BNUZBX0$hlZad4\(1=r ev%(OAda݈(g߃0*m\dTF2t:_G^<^ B70 JISnO! %۴|2ghue  ;Iv/'ςjK9sP^xWȲ% ~O_UYy[q&tnO8&@4$1x* oyݐәY\ Gk"2 kka)Uh.+G1vyX5[. g'N[PT1&xsB-Py$dN6oxjsaSٽR@ToLT~[̜N=6iR P\D׻ӟ/lHٱ$L@UL8f1 f1{S͊Mq!wO@Hh)n.zND:הtm៹i >Dv:5 -e,\#MI <%cSc=Gf7KЙ)lJȯ{2|U5z/ZnƆde4t4~yvG?ӛl%Z0<7&4DAb: 6PGK.Fјqf<Sű͊Gz_0TQ 蛉xΥT FV&5M:Fri("d'D^â(D=q7k]YRH\L TD> 'UKM!=yO|DPvlJګ "}goZi)J0OÚ*&M2Lf֡6 1:6{iNMˡRE{}p'sewcX8 ~=62.zL3(iCg0C‰ ?!(b RP0mrLR)fwWRدNg,qr:t]+Xs_,j*sD&.f+\ڛa/6iT iT3@})@:Igp߇*-4w G@#'=..]JހrspX|33j9=Ä<#Ed+"lvhRvpvnzP}!H>4A€e߹!mR:>T -[<%.T`SB}є@NpmQk9m-UǞ͆Q#Maz"rԶ+>T?Mzv9V ~m6L@,1Xώn9nq 3 U kE(>0O`Φ˕S±œ)d{ĕ}ѯkD̒ CYސ(M{ƃq|Cs5sO! {W7x5:+FK!|W7 4 owP]7T%v7{a而!=73H _BW{j\|f4 ZV8j{d֠T.?6Vr,K&@f^৑}V$\è߶q}׫$e h%8AOPjuB@~nS)Hn=KV,g KDY|Љ~T¡bfやՎdo=&Iu-q q i9MLeyِ=HK &S'f0 LEՁw>%9i+P^_=E"-$@睤WP P|ǧh&s E ,k?ULt\'aLU|DŽY尀kjg.2ʶRb ֽ\ &0Kh) AQBUc4 ]5]*es3502nHU5&gsUv^ߍ_&5Jo>f)fUUQ-h D,Y6gF;n. ^P[mp/{_ 9ٹhա5Lkf-kV+z21tfEl :^pQX@_ذ& +1Q N̬$Eh(9 >#KッՈdLmiƒmӡ-Ld/Gz|^ccbn[X8>"..4 x%t=ñNQ |-^-~R5! |8mUƯYɶ @YN2Df\K, n3R+뚴̭-dzC T S:D3[rv@.ݷJJkͨ_/6_qC&q%u PlCD%#0 1ٕIc1ﲣZȂg -_MVj +%"aeK@b5 oO0"LDBtඦw1Aj*b2h~l&/#㥣^ kQW"Lkԩgߚ!&%7qh_a/OD~/}-9m;{&wG˝IsӨ|5EJC=wh zDioӲ42>عg eHکt#1' YxשVĥ( N2)vA60xܷb~8( 23g:qn?TEF ޽4+lHT0Xi[Ljth^EyQ#{VVNJ^actZŴOH2Uk_oG5FD*U-;=xcwZg Zk?%\n]p€/wo "]g?WrA:?!W IC ~FomgNwJl'4!R:%r<@[Kd#ܟ#秜 4<.rq<Y-iJϟW֣z8;s2CJp-ܾӎpLu1.SCIkZ. J LG pM[ju!p.{Y?OX}s~XYZuN|'y@S@'A;ՋRX]8;$t1=XƣF4~W\z4 zxtȹY!b3o|O0mIH8|?CIcN5Pxjfϙ[=j,clھC:bpsÜH[]1N:miuI犒2ڲ0uQ )(Y48 9=1Sa7 [~'"N?* Ҝdt6$K2C\ͬ-Luv*)c_NlE%#&h i:%XS0q8Djt6+W<__Êw\uʌL<ﮘ h[܆>}Z| eh:qC4mA5%FyfR4.j6*|{Lus`F2EhR7gb/} 4$$;-n'ΓUe}qz"^|TJ©|Gy 蔜h#2-\ԱެLYcu%TG8&Hb-zKzmCAJMY-ɚrэ$P^i36\ +gu4:(n*H9Evl]t Ĭ 6a ߜ̅TyHvs]l(bݡ:9[3>`5DQ`mlf`Z SU|Y3Gl.3DE*[`:t-3sKz 0P"FzOAOW :?v,1l[11JLRτa=h6)*pp@:Q`rmS-׃Qb/U~^ aϣ)|,kO!K/n=e=UpbIŦFHf6۬Q^frw=3woSg. |{R8Q+N;'xࡩۢEB#2XtT%8TQT 8fxe%0JԤҲ*sL\6mr&j)90,G+cfŰb\M:#ꖂ))8hܗ_vozT +lZ䉙ᐱbXV>/s[ TIZGNic1h8`6dV&B3*$bA7"Cn9rj h R3b:iev^Ej&zTHgI@iu~]j.j!ָ`&$wmtJ6EltADjo@͋0*OxP.n \@yJ.t7BwNL~?Bc7DE\8MÛze($Lq{A+MV_uۺAlC~_1P>2U۸#bͽJmWEv=L0ɵ1/-B_v|U9TaHT0K4rJ- z[3Sa*:n ?b[lfSMj)\_X{M|!*Jj\ˆw}pOaV̛dHV$ Nr[j),6&{ש٤3Mm ûGMsKZ`{]2¤FRtt([SD/7kNƲv9}S&`vs=)6E%oNJ`&x úx7:+Iv`~J:?HhF ŐA7s;-`X0fWf|dyF*=ou&اV+ ε Io'%k7.,om.m/۔ qZ8j7ؔd$uwiDZa zDhgeD,Vi9 J CZtd׼W$i}mw0}%wG 5qgT.'馰n{!*J|HO. ;%ԠtIi21(je[53^-ePQiBS+Fn]2j(̂e{ӊ%;L߿Uřɩkg}̷;mZ"۳3,ˀgMwYikvR$3r6Ţh7zEP2z&>Y|ܚ +'RV }+c韔m]sO[?Edёh;sf 0W5 gFlմ\7HdhF[`4;W Y˯@ }wp41I{L}9Y~c(,CKS8X2L^, M!U~2#LO*uSq7I:_y"$(lj֬MKwMGE:#Uw;zD"~R9&Z#uk/Y"J^d*yTsbԳRInImd)2/CI<^W͈M MhG#apNp>vaon%шDv8k杩*bwUҾdOV¶&i Fv2xC8pts7Id_.70D<)S6;$9 'vXR\Vk` z h1ɾe4*/,AO`OY8BK/E[qS'c.pi4JelcMu cWڪ>*s {`o6 ")j>ϔ_W 8gGp.ޠY8`)25J^'+SL3PaįQ 2<6)]%aw,y|KÀx0V #*И(EhcTS0"gnd0^XJ/gǒ=Le50}gtE mZ*iI; 쨼v&.jmx|ia}>MEf, ֘2j3 JDS$?&]GmvX:)9&5l,YC)]rlOv 7>d;eFPl7MYUF) toDoe%¤s3[_w&Z:|uwIZr5ek"Ay+*9gچҚC %Uzvn0fN2T| ׼t؄T&u?օ ~BRE?mvAKXﳐwj*4bSd\M5` Ql`H]ӜCI2B2y:eº&3cY/MHxJ,d>tL$XF*{L!6ϑS>Jl Y\+/#opЩm^l]d+Ǽ{ٚG P 14Ɗ] I+nTc5T.}jawyKmF4iD}Fg5DzSe-H}3"(ྜྷʃH Y*7|s 98LdK[V\(+E"+DFAkL7n8tR3/W/lT($W)ؠeR`JQk%#[O_hsLK'gy ^[{h|Ig*wLuq/BOg=a"ݴDZkC5Qzp%#1a un&u-43뱚x @bByVjŊĩ[^ؖGEl|?&}C?/INw~&\T={L2A#ß4) AG-<Aiÿ6 9roe%wv#&,*3 [9#+f yGG!;2 s~d.IWhf@g&yn F4D2#ӌ zkzpy>@ݕ. yD wo!i'q$:%< + %i@4$;#v@~7yd "*HR1 jPjw+5@40"RFAFۀ713A )6*X$bs/:K12۸SKZwœ8B/vgJ ̼Ⱦ¢ iФ[9ҔԚn*JsӸ%B 9j<(s(F<4 +\օ' 2ϋAOb:<~]~t|o2r lݡX}pD9T@ųX:/ bS8{?obiQ׶*;9~[Sսa &եxl:hz  C?*S% \<+8{Yp#g~@.!'lԲº+.i5PJ})A3}r5~vպU8C{4 S|e ? K.%L&9K"i^]q@[ľpdl`isUÂ6Y; .-<0_Twc`rVKn?w>WyM `9]*.K­5 ObuP `5Գ9l}Cܤ$dVyMrD{xihsSG{zI*KQq\߰8z@ymQqLyY4M/gPA$p0ʂ+|xE! r  FfGC Tf @;de\VphpxWyju,B`z뒘 #\ͧoh!M@eЉ- J 9HGǜpJmyf;)ƹ_0Mk%8M% +}tE1N6Vex/]hމVʃ}Z;$wC  =SO }ѪÕ{7OCrM6&X:SzhƹVEZ(AbOMlB:ҍpx!(~dO}Ӕ3T9G2y?ugø3y2!Bs?G,0ft1f'011l.n[<`.hhHmJ"c#`82Y~%8+(ukSLʪ7Wk D 'rk! W"?yX@_^ t nѭh?z9=_U))榱)+]a ly[\ǵ\~[,\ ς:VObmM&wIpW; ([ :u`aK?;!`&̞7%zb~1%AhU(iEx #2, lj` B9QR ,fCythBRjmf&׫= IP26_:&e4H39sh9၍3V- F|[҅tߧGYaRNT<\W@qH#u8~t&nBpf7xPAR7N<6[b{z,BTLa(4oͯ s0NWrKD8|p1AI~^P04,6g^H#V';ʅL~I0hOUS Y\taq 6Rv<-ՠ Z#@8Rl(IG<m@~SΓUTr Y @PM]e^ca%w][ AN_)TthᬮWj [sZd_(Ə"Q(NhDPmLQ` Z_/aJ4`+KD`/ql 92(u>ʞM+mT7{2#t6ɫ'84bF).b\_CXN̙ҧ|EEy-EVWK@lc5ZL":զuHЈ#,[K_XiM|-ê"i-Lflr/X<*nxK<>Rws``jމDcxV.!KZX=d X`)n)S@:X3k (5U;B~`V6vp2ne,-\KG*%YmT \TM@>g㵦/Uz=^ڨD%o|8 j:/) AJI:jRNpR;UNlRI/:WexUL7RwT$GKOjR .a.B+k')K!9~osB~¦ָ=ۅ ,<3:U5t  JЭCa)-Emb{/"9hG@C o#>߳o^HNsc),3)A$6ꀠֹcmdN04ȕ`R,{#xX/L~@Oޠ.pD .k8RT21`,^~@ͤvDWLv32q8Da|JL NEWRc6Lm[ =y5םG#d((8:@ .*Z=ez퇈DYG258Ah$jn0Ǫ99.2TT!&`-rR!Pp4'.!m!J? Ϙ}ŲQo|n6`[ (ِVZL+ u<//X׎|tܽwRS}!rȜ;'/lQ-ؕVZ̍gUmG d;.;U@K0HGߡFa͗HbA;5JiZTM\Dh߀^n+WK:ZnKLO΅2fxa)O7}!O"qk6L Yu%K`@E:z4tԵ^YxiVw~ ð&-@a}D#S*m[g5.-fhl3dqAq_̈q,/&Oh4Cb] KD`PiH^m &=Fcb:޸f}:0dTe:ۂ:Ř5}' N/" K)),`q_6 vSW9>x-y?\CIPÿR|6- M˩至\of s9ՎIݔLlKRaǡXU{RK넗3$HuMެn҇ 6(pHmP[b6 c]į.in@BQ}+reˏyˆO&hNЗ *4A c@#®^WPVH_;l%^{H܌ۉ{w"W X8ٹ{]Mieo%k/N}oVA鮸6hd\62fgXEwj-]uJOҖX".SK/zkQn<ݮJǛ24m-yvKH1!%Z[J+"zH"]nLu;~)Tz`%@xP$@al+.v`opi,qO=3RƾQF&2h^׀qpRfs֓qv(ٽ+ǸNѢSz9ޥ}#eᶹƩK1j Y˂Z/gKn8LigdZxdpj *TBN`yLGO:eƍ<\tad)@>T2mjCX\=)sHs;,3 1Nb13ݺ|13EB\BH:B>ͺQE3sTqQ#V<<\2l}n)>clL'sz ςè[,"W٤"H-ڇjD)(,JFw&DdVܗxmHrquWs}[%zm3D_Z"Oeɾ1IN$8'5<ĭ\ș+uxΓ[ 6|w kE0 ״*GˎS[@?V)p#N[px{ ~6q;[?˙^UJ113ϓ߄c1>)䰠`f1)yb:slC]bUR S(}mX۳Ι{} 0r\VgG^yA G~?Ta?;u3Ӱˆx\b;#t`~iAejv˓ͮ `MGJN<dKl| Ms~(:G .4 Z#\6`]hx6sXTEauFGh ۖF \?m9!dwxĺS6" ^+XIOxL^FJ< k T1- 9MP^c1;lhANNt(j2g. ꨻|'nެ HsA>MX[3\XP!d4:"GA=?0*|::/ PV|i i*|N+HJeMp!Wuze[<Vڦv"ˆ=iԪ)ҀjGkXx !iŒ);V3[a'0søn,Zsx ßVJ3X2I·(ӎ 9G0X,>Q;V3=h <ݵ^nSf/'RJEi6!muPV$]0(#v,0lt_OZ_NmԟɱlTIs$^yh}z ؾŦ|b'笍.b'%ͽz2ɇNG׽'L$FxQ+K/}jgK9@%.w$|ij>o ҏ:SڢKY⭔VExEK3\vj4:>g->L.<*^B|2n@Ҵ(rJ9+gb %9v2$jHyڝnmHMY$oK@Yƌܶh]C@꧓+ft ؇` ^xDEV$ɋa#ie@h%g)A -;D.RkZm,KЙԴrKCo7JjaLzȸM.Jmٝ A=ֽbiי&EӘGjpW'}H[KmҍqŸq7>$iM+dkD;ozo2ʶ>3QgsA#r 643W'7KhƳD.^=O=}dIQ~%%} j شEhd!(;c,}<8J c*e]Ham r{l`;'_}bœɟo]zl Jk0=%*.*/Qqjܵ?O*vEolTKd@A9zqkោ+7:I»3qɪ]Íxw$EFE1xDL[MdF:ZC2x+8bMI;Aj;ql͗C%ƪ+Y*93<0, $A7fMﴞ|i e32#&4o|%!~r4K\aYttCf)8pʁK%!_1HqrK=&Nϐ 3aiwP26$+C9s(sk3!A#i jpS%)pZbD+a\Ь&B*qVaIg=_J8`߳2 ).DU~ t.âC>kTd3eʃPS@o/g0!8?,74Krˇ%p+ڻ^ԁkcv39Lss0D-]S#q:8sy$mnroK [`Hpwj.,S-U•ϙMߕn<#{Z!zTcCiꚌ_ ⪓s/} k,4rʿgiTwA4L-!D ת\/ Z4ZWlEkBѓ@P8?P yv6NwpJ[I wRC||+O| I>ҙLQZ0J. DaˌCfl&*a,AP^õ u: ȑ.bglL4!hKF",Bn׫Roe(<٤1jhNa 2VlҬƓ )TxU.#8b}yxv9ά@Eyg9vĆ]woͯs}%/[`k|fL2,of`GFVs9,-HIPZXĶ_E#߻7"!9%Y:mÄ8%p1.5ԁA3/ЄHu|׋f{]D QzAi!,Ox @c8.MDa PR(E-Ti[j4P܀ Y>]\{tԀCgDE[3))HdoRXh`YUk)3~K*sJ_~9cNi}Im&8rN9dW=ƌzB5ТtԪF . fS]kS&CdK 9i@j_G+1F"r8q3./!Hx2qwGŘ7:vA D^*4~O~8?'T^Bp2#*7f] ] hB*gOZeha۩G_$ryPKf6 ֯TW};np9F%|'Pt>$UhGؘlizmPDwL+MU =jAb3Q*X^‚G{fkCPr%4|UDϢNbo$* Kx0$P6EN C2얓ǝa5Wbm˹< T897-[KbrLety=~TLrܣl)ܠ1d+D8L7nF3LHj{R""`bL/> eO~-L:/Zh3x|z$?==d=(KK,o%%JPZ !dLlݛb<3r fͰ1n'xHlh{ bKRˢs>veHpI6 &w2xW xσb'py.oS`D1}20f<[c(C檹dE#֞kژ51+I`7vpi$q\jn)Tjp%tM*A\yW FE ja N1~3"ƜCpa_~MB):rR:Fq&FZ }eQ^jn&LHJ :e# 6I&ʉd" ^XDk]_iٕw5 biҋ Ub3΂Dz2na\kxj'$|G6Buj3뼽c>ՈT6*< |9:1:YT ߊh)ۢhmԡ(-{7vvÄ4EhA6>$k۰)θPBF,bKJHzH:b(^mJaEڇ(F]tt޸{...B0 hQ.z6;+1}?2+B tn\+]InWKK δD|Kg47=l*x$J٩3yaʣ||'clg0S*_po\#+EqHt]y?_E!Gj2v[aZ#Qkws$Jb聩6}]Kri%4APa e2C ii]P|Hˋy(N{Umrbt7v.i3s{;;З&Y#^R򶈌>̲FD~);dyljkq7)@ґW9gk'S JmvrHHNZ dޞ+!IZtrȶBA2# |%9:CAm;BShϸ>^e˕f8Ç6p9?°=,[N~JmD6st@v|zH5(qd=T҈flRqmzZJI`5J)D#tԆF|@wwqgonIw 껦Օa,ɚ &6?!sڅ#l 7ד@JW[DKZUeN]UrLRm`E[Й/ HC;?9l<BfUt1t/}pJ&IH+ ?Rj G콮Ӗ1C"NLͧrEjh +QDK3ԸK:ֆU.]Ctp*v ƒw#f‚ˡ<()6+s|OQ?ꀭ<1 von3B*1qZ/ 1 ߦ|`$oag[W5ZˬhY-͡Q䒏\L/]yY(CF+;˕{Yoؙ.źYf fuUؗiiE.:NC| 4 Dsq3IإN֯O3a5)}7X}e l&ϭEaK<{>Cby< k2e+NT`!][Cetc4xr276B M$tu'{ T I2p S{f JXozMEB$i՜ڋ%=뷔d.LX2:{hA:8<s]:I6z-"W JwbpM"菱 fh6>"$e審jjj²iX&OovMhKZWd+o˂tlG|\SRT97[c3bz8yW LB@FuNJ⡿&3 L5Buy0Ŏ;D:#1#JޮVWܯ|BfEilXʴou =aI5_}af49ABf5OUN!JOJ[(n( :h.e#*v{u&'yP,a7mq{A`/oahS-R-\.BT+Cme"/$I1 CY p^!,D͂3q _D@F{W7HJ @omcd? Pb΅/7XDp i9F.x{&SD8M\9+I6toVP׊}J)d KrWDoV ;;Kg:ފ.,Jb3Mg}06Yff|'k1̧*ߘ8Kq{')%}i,]ªkb+g O܉+(.-. m@Etp:􃏅nc&1s1ȰRY..KrFEw eG2AT*=Bl.[V=į}tK2mļ̔⇌H2#cPh tkێGy2 8ْcZ#f;W5++`ZWypˀSK8ugS:vƇܫ~7|z\VyScoQJV8~.yP*\ `0:d^=FY%= v{7/[ Iȵ=I.NSC&wKrf27?/"r/mpJqè{FLGRnП\/;OtBΊsQO I5ŖO_qлfN#7ד*]CLYBrH `*(w9Yp39eJ$q#dR7)Rpe2ҋZ'J Q9 'oVuof4qcMY%U( ~$-{N*mJ>qy+s)HOʵ'9m&cG)ahu KL;F>n8T؏^ît=ײuA*6@՗#a+S$p]/~8_t0qOzlsϘOb/+mߴ]~n+Jp1[Ϸ#`#!Fsyex@IE=|I_? dgc?Gt:5֘C LhDs^@o}hة&1+b>ǯ˅7sBcס#*W7&-vl9{S1Y_͇WĤʳ!+VdaH"pfBNjBB >9հ*3xCʉہ"@Jfqo'[HO1>M%'=FȓG- :5 & "LM :sX;`47|4GF.ȹ~n)RQGq bFnԿ gjo c\DU-c Uք/?@htRnNLXE50!: >܇ZDI(^SЌGFL! LkxP\@| fdQ鷫&G-l(H}D͖ Ke'Y#~΀À;TK<0ӶV[7nvpD} &~)>tB7|2p=ע-@Ʋk]XP <)G`wWO>^-ـ,06q1p򢰇AUMe,SAjHҊ9o C" %dO;n-.٢l'eҕbfqoC Pv/Uj.@ǹBl.ޙް{XlJ1p2WYoICt]YLG *6KQ.qqBS3=]#30LNb~+MOC8GSp(o(] >S79ey}'RE:9DeSw)b|,<0zKaj@,EJ --:wːw=#Saj,Gٟen8 Qɩ z`!yŌG&g5o__?@_ІǻK@ѽ\X/J' lϛFhp$;U+x@'Aqu[8%~K{(.8]bCPŜ 9Wkc^0A瘟65rN7WDGIA7;~+3q[&x);/SŌuߪ\mYCd/V*l=\*R9,붆0Oz0|zׂ ?zݞ/ %QCoOg~}ɏyn:籠AT8 V`qdMB.^̂zsG{c#]t6zQ,%W|;Ss*kx:u%:d$V9H*xֈ,Ө:VJ$-eN/`/$=\R<>mSSZwvD9ttiQ3L&NL)mܝ0Eo{!!fs}{- Z74 BKsc%t쿛AmVb-釫esm:?H4xo&hhX'$7ex{ϲ:* kZ7ۓ&7D;ƛ4<9)Qy]2$qC/^F6CS׆R"얟5e*rԽSUiZЎE*t D0oQ.e[lpM2 È{2X-L[/x64%6&{pEbhk=fH !98+V8ug\s,`"~R ѓiWDL?ioH @T?mJTl99lH"+ga'z:>tX$!2$Ym wjֿf$" ,qW3)$JH@{3@PS5rht Os̉-P ʦ#Mv1ҜS{ves|Idi$ܩemTBnc?JW&Gv"4eyr[CX>kűXb? A|q25K0Dsw{2w>iR_'ţn>N>i֣bnki<Ũ d WbCnDce}Sy,2H+rrHD n4t*pf+Y#a-fO/Z2OqR =g 1QkKT+;"DOSK4 :,r5 &mRk+nTGO"xf^ Kgk' ۛlVɏi P#= vK0,%«>|$F{UcGRA VԬ51`&5l: ^lU"Z=Fc)_o{vT[A7t7 +^5{݈1d-s@ [;z` B hS^Xe;lJ">n+ܽ Ig9)خV 6(`B-kKtpX,ov/]y2$ʚzV8;?^Oݕ8`/\|}mSzZ HzPxx/y8d=j{(u/L+KIȣ Sm7Κ@dJ)z9igc{;B,àh^@{ ]\8e M]| ©lJ<>Wsиm~g}: +uE֡SYyWTص<3}뻣ۡE#͕70@iׁ( -00l rRC ;Ȏ7Ib`07j왘f7!1xhMq$eTaD̈P#&Pqj~ ~P9 T Tw06s +ɹĩM%~&"&‡;#m*0pkˣM\mkꮥ [nխulξ!6F3ӁױHT\q31ٝۍJ"S~P~nۘr (~Lcr[.DPS:8uE׭#?#?Ի`XF pe$&1dFAUQKnIyf[cԳ|ғ^i:V܁ڬh|c/_ai\!"vI(Щ @Xj!iKɭ;R$eAsBYk6^ȟb8 Z(<ԙ֟[6O8V|W;Y̾ TKMKzPMk>݂9z|B$D:2OI6{g?w!61HH g%/e u%JDM(G; R:[ rFq6TdFTc@nتF q: *e1zmٻB&/A$ĝXW#O~+w1ޥ`4MG(tmD?d|sBE*JQfun-2#`6LHߨGyqa+I]wZ NS}x)D+L[  r7c{ޅ|e^ʄ|nT,! ^a-M"6DJ}D22v#-*]XBy ̽c^O*VhB 1q"G 3Z>j0AK +-s,YVjNđ!a3:Wveig:l=%% P pL$=If@<:<;\l()#~#Y1-uX7FqWH(L$V/_ UlD; c/};G /t31oQar7|ŒYFuLk|ώ2ǖ:IGº H0&YIwKL(aAd#+m *rfm]~ VL%V/Le7E\X]*^hڶZ:^pB7ȇWLyy+uPaBHsxշ oTN>Ƙ@1p?$bW58juI0lcA;m6<}[ֳYp5#oQQBΞ~{v70~&&tsdOܨۖΧ,iY<_Q_IBz-P_?\,RmA4;pRT#㰼e8t=.jF״{~6*݄,֤*G]CS}-ʜ:C( Us`.kˏCr7Jŗx;ƶkT[l?n{:^dTpf pLyNϪ -tn%\P^ ]=21مuW2;Τw311lJ0ۇBA4Aۗy}JC#`>Pk@ Sx^I%J޲xf>xg OE~ߎDdkM)P\^vCGlϿAѪc:{S^+ v?d`Fg)4nRxSOEm7Tè]g*Sˬ׀gDv߅;)NllӝDuJ3vP~ˍd_ڪYAj}.85R]t@QZ$Oaj?[b\{tϕ|γa+m?פ#)m 9O_A\栬 ̹@U = CeZh%׃y4Nd K"SDZ$_%' sFe}6%m/| ,-߸W<6Vxيuz*)(mD:W}̏{w ǙnըkM-%yi#EG!=aپa aFmK5L%=qRpAh(vHBB#?ݎQmTL[:WcU끈pnwR&џaE_Wxూ w]qp>*'pЅ ɿ.fU]=iwK){<& D~SObǗj)WJe2` NY,ѧheV;0P3\!ǷcXE6 y7QjqqLdL ݫEO,"}>K\;r*=k?cl7s>\&?d44CXDI$CU$ ꮼC /:yX`ـXANVGKCK;aTǨЁp9XCVљ߸_U̘gʥ{럸YyrT yK`e /itG>oU3JtblL*ܤӜkP4T،nU#f~DϬ{30W|!=*T\4ľ{b't6%Lz#VG(j @D g*JW}(Qٻ`vIPFoja] tx'!J߶O6adpj*҈Z̖gkި| =yDǀ;W*x!T !Mob?$-ʩbbpG 723\z ?Ma`*n-NzRXNQ#wv^N/s|E+!eANzw*3A7D{Dn6|C-GŻǥr*ּSm%b[VtAejkA+( :9%I>YTI9]'B)lYiA0JwlX03zzɕ dx,.>qQ'!}ud_a/XKC"OV:(P8d6r7t[}X*Z¤gx%s Gx?~k~KĬ(&ZBSZMqUiJgcf7ȋGHd 4! ̋[o%]<9 w߽wycT ^m%.+ 57]Š̟ͯb>εhv^NW.jԲ!+3H]VTl:nz1R2KM!) "%l[]8 X%l%Ƭ7j)&*S'ȯDa2֡u , =zJ[ ^QOdRXx5yp7Xd14?25HI9~…ZSzk0m_NW@`@AҹEHntee\F6@z.:湾`QY=\| ii E!=2H@5 06=[fU4o* .u4op┑҂R~h#J$OHF0/Y\ {2l-=,ZYgkւUUϤ+c4zBXb"j(Ż1w!+Y{<T:XWVr>1 % hO[6w3}6&_wGbZ_M|i9bYO'NHb<`yGk3OsXKŀuf$iEv.jų#0_Gf$"P1M&S0c*W0Nͽ;Js#吔3O})Pb@t8ʸ0_m=̃A~25e=Ͱܦu "Q\Ϟs15uZJ}*($"Y@L@Ec8ZNļh˻3etI^ ^[+ծk{>pMbڔ rH'Lq-=:ƛ\[~ $֮28}2 ٦^dfB,i271u/rȘA+kLQӭpĦM䧃xzoGoH%Q?e"ILwUTjp$Yy/k,OSSdYL{-Sǧ pѼM;zذarJٶx%2F;QAV6FaBD2\SDߖAv`DYB~6m\rie4,הIF>Dۜ,VKRauC{Eo$mNⷣ[adFu1̋"ZvS8*yzN :]^>'|ϵE({Q'[X3>FcmHzr_Ө%gѡЇ}MkhzRZ\ٸ4G Ѽ I7-U&49U9'2odK\noNT`C;&ab& b_' rNJ% R#g݆ؔK78a6Y9 4q)ׯ> d+T'|4\1KtTBN$vu>\We#3!-}c ֿ]p8^OusPhiP,l5~ ap6C HMGzepֳu6c+]o[{hJm^@0J=\< u>| hé=Ʉ\ҦXa)YdC:<6r.#WeaGi)"\4_Z6R4X|oʁ3 XWYQo4" ]ɳ<`YϜ/ ˗,:0ĥ$$΀l{mOO>P,"I+Ro{QL1eM-F?ILj[[քÄ LMCUAnu &|5p.7rAuBƗaX-p<\Q# WyGHKk܂Y$frDQ|ZQ2kO6=1]y8"]#~Ō4a:H4\|! #?G~A 7C7P\4H]ys_ ;6շ»@ <ՅHBc$|~rwՏS~1N%_${ݓH$Ok'A>ߑ?So?LKM7 5e e'r^ME$f=`*d?O_hдy+i5LEHC|?U?6 TVp4 ec>m_NP`;7HAF;p(' D!EWѥ?-C=]-5VP)FTrK{UAq;RPM{k$Jmssdvɵ໴W}/e3:b,4\ֈaFC'\YTx-qEy5H%%Ij'TAaiS5䬏: 1~&ShCy'ݸ8#jHMRXKbCYkS|^_`tjSƋ4TV I6#tXb-0?0l A%eNJ=8d\jf Ħې|WV\7ᗥ dr,YQ 58-•WWNm[S <#gg_zdws8͂1PH :oyS#Zi9u>'p_EW1 .`>MZñ:#E:K\69>NQb9?EŎ4@wLD!%p3$سV ђ BBPm7IB5u^Sbx칠̨`?jF uD>ak2?aרLYcm|b]Ow[VXi`e-!v\tZ 04-&"V5|ϛuC3j!J]Dy5W^JՅ ߁:놎KYv<#S$`[xA~Hfe~aZڸ!}2$\K7B܄wX1R+"+A'7*qʡ &F"7@V@<ӰTc!XS=g'p9W6 x Q4VFtM݊]@KSD.{CK!+JȐ`몽-J \SŠy?T OZTBҫ̫q_-:/-'j^'۶'D(1Ϊ Z DwN}VZkDˈΉ\kGL+t3d9acVc(RbBT.\nخ-Epj";ShB >ft&Xb3kx w0Ii0k[Ȃs.ES¼ʴvb(DXT OvF&=6e}A?NTH*7OILvdf7*5A5c 橳0Q<.qCR|2cG'5b/=Y2-TCih1cnUie7VcvcaZʈފ-EU g/}5醉SnǶFv厜GL(oقdK5+Ӕv_kk?0 @}gT rFJwH䳣~j͕ dz"S6^]tԬ#8D\Z47c|h\ZV92}^%bZs$}`b˦zR„7 ,) =5Ƈ2Tv LONX%(U&NfU6PbP&3}慬{)j0[Bz$$dEHO"m3lɧKY8IrY8_mhYpXҍ~84$qDL\Vw'}2|#. #i2ʬ+r+9U=|ԅ:MXL]o?>J2#{q&[eclNFK|ݰ?^BO. wEν["z=G*Ea* ' ϴ}LB;]hEܚP\#PuRJ>/9RFy+fLjZh˚쀯WwD5D&@$0#(ũ0,Rْq\GJgQQ)wgt$cs(AZs^WC{K‰㹖}%A$KVRLwUb\;0m:.SUs% W3!8vh AS>U,_bːK{,^pqƄ)8pQq,ov!H3{N{7CK㝢j_6qTBISKҶ(zR,8CQ nWˀ 8!ۓmT8O.٢$As5IVO5g]\X?zJV3`ɭWՒ_F̞hlIęL rBC;޻j^SPƋё X.IOU.G\^O\[uF E*ޮŃڠ+H}g[E@q cpq_p*/5\zI"B;eZ J7== ׽tLx݉ɬ2 ,7/{-Ֆn*5G5cCZT3s4K,J/y CfӴr3~hrpX7$gG}>VW2o -EZsvFQb^X,C,*bMM<1X i3A¥Smߩ #ϔDgEfG5)¦; !>˾1 ;`%̙ӆpK»K-|1ԨpȮ_;EzkA/P"*Q-E@ /;b kyD *nݓVMm/Yw3#Sg2ڡ^kͥ~>'{(DIsavP; 3uS,/l0j/k!0,>:^sԓzCM6%yN9c*1"!yb(nD=5K`àLzKu_$:0x?rümp$pb#b%s[/OK^x[(Y̯M`{럃.F/-c/Fܔ*ohX::]LwʧI{/:x7m஢O& mtQ^H8%@VlJ }(- =^ܳC&S]Em&Kq۪9C~.0z2Bϛ$W՗B.[ijdw#dg)vq]Vo07>w"~Y1wIߩd-6 ؗ,n# :9O?Lh*{ʌ4'#ɐEbR<>,tˢIb$?!:do UBkl` <]@\<c1%ȕ~'Emh].%aSzCG<(`؎-O\d 3kKCDN?O.fԄ'TOSCa2DLvڹh6qtZ( =dʰiP0p;z(qk>g"K"B lfBϸXjc@էʭH!zQ~l|DhPU$~2/j_S~kAcv1hH1ⓝ%E b8YQŗ_Ⱥp*Js&/i5 eNxo.q6KkhpfN||=*k)6[KyЅK "2ob[_cX*sY*Ԝ=HUc͢d6wL[1oGQX[jBF * V':_׷kA6+u/6Z]=,eV̇ vib@k+ɟfcfVаר5$ݬe?,Α!,6/fFv"M1Ձqq@c^U q62 m¶$mE`X2lx( p oڋ`1^_kӳT3#@QA֋Λ8`  0l}|tT7{quW= 0\6'#|ӡ16GKZ{YhCU[>1C 7"g$+J!n4[8dlX\>Z_C ;-Mҹ[%&ΏvFX$og96HzYp4a!de{ۘ>/A+g9-Iե]+l 8'Ow֤nq!Ab6^3-_V tc ƼCw!Cby \-c~5ۿ+b@"Ldy4+ ;df =JZpnE:W :x"?bX|6P "D))ʐ 'Iz:ePWA18u ׺01wp`q;0u_GlP ޖ;cw)/LO%+Z*U\~1·X"=}r=r%%OfM穳첮@ި)Id٭7TK€OB>d{SH퉣k5.oiG+$ OscyXjWX-g$4v>qB' 65<]"(/Ehb4G5|m4:O 6 -Ɲ9rf!VR_Gxc=y]"I)ĥj9 /[vh8eA-;@M}#YI( hP ?gNʢG nD]X^wRC_W:qo rG: H=hf*" 0ӹU6gHXJCa`%o_W %/^X.us9ݢ7F" Bi\Ubq-gD<7՜33mc&8%:S¯u ۛ8e]F#K}m]8=ž+[E\pH!T  X~RllgxJT^z2/, O;6ț 6znP)u<^L`}.ʅ=[ `^e>l8XM(HK{ }ҕU,f >6Y 3_ +=J^mVFh߫ U%ɹ }$2&`I ,fߧ OS_aکs OŦou@yM/`+vtuZbnaaH|7!1QG0p2iteFLs$ygL 6MFB&M5RaT_הi1| ug=a"M&/IF8;-HZDxkwZO&k֐SS fSs͕5ԡY0AH[qy[Hv [8V\i/BJ8!i 9wjMjWۼE Я0?"ݻȂW5OcXo/8^noت,TƷQaF,[H.XD[]]㟀ED)h'N]LLEVn|„Ћ@[n"W~`Ge:Jҿ&/9Pe|،Eﴼ@1qb>3@!ۮ2Óz[4-ݒ2[;lGjrt7cf0TmwfIs:VKWf>| p2,. 4O,pkAu˰uuGAc PYrlŸ;qD/vI m(4:v/nom8>bw .Ms=7ф7\m*׺(rtFCRƬ߳|wh \Qa(p219@Az~sݍRXsν^C3ypOP}Q٫rw{!kKǾ~\;e"=>aXz)ş=&koi7ۋnCM'ݟ5 o&}#٭#P)mG%! vXh P #9T?##ݫK TgҠH ~"&]mvt@n,c-LX&7 Gnqj^ST*,{8 TS*\MKB_1)#m׌C햄Y(P/}X߄ZuAVH8ؖEA=$ro=3 '|ٔS~nRjƤ}rw#wf2Ub3P_ȸ *TL׉\!p9V<Ps:9Z_iGbDKSdE"SVp9".Ѱ#h`ٟ@`phKY4-V?tZ)6Z7ycItjoR=-̺L]dj0QTG~`3W= \Rmu6&uW@06%޹vsjoml# ["YAy.#Ƃ֭ۙv8$/h|z߫n[**Q agDHUK)M %w\"of1OcGCa`¸vc RA*_PF 1!P h6E765#;XCRK(ѷLFu9$´>)⢯rj>9<+]^pZ.!,7k9SK@!_5/ km0]c⁵ MYJ7P^J4M(ZTo|̭ic ap:1"*݈!6_a籗Ksjz"zBi. R,I| ^ڍ u*hq5;/M?L!f_&Q93kڣFFkjF 2m攙HE?^4R#STD6]!7;u{ r–H.#2Is%rrzG59&ĵv9h.懵Gxиܯ|UQ>,zߌ/"O<7"fuU)0u< +|@+8KNl;6ةu'܂z.©aÐ݉ȸM{5!e* &m J.,™U8IMO9LWC%^݉Tyڑ]_Ѹ(:uMIlhM`4؞Y,[Lp89A mXO~~s]ؒF+<('z.4>T ،`46{M_/17 Uhtv0x~xkj򊘭3o)J*HkXR2K2Rx(R?&S?XވEN+ܹੈ5l**MYl zqVc” Ɨ&yv x+FxSd<,KM;I o䉎_Ӌ0F\ Rpp#@OzD; 7`NNˉ>}i#ڶ0Iv( q+Yjtt^ ːOB\*u4pCXE!~SYQ*iBt!9@RlNKj2Saf,~PBtZW}r 6^8JBHfGjVrvbb$QAہ{?isUn5({ اSg.J9ԱFQT JXo?o ()KTt56Ρ,yv݆9Z-~̩hʘl 7>~CԆngm} Ta879xPlQůݭ)ЗM6T.:a{gs 'ֽ@SwlfC5^dg-Cm-4DzY>[|kYG6|}%qʗ ܯ&1YbK&~9[]x}`E>&/xЙCAᚾ^>5&}G: vD9 u i׽6;0w( 3Iӣ?` JL_i ڣJsmQ=/ t?afZ8_vKշ~3<M[#$τ{ˠ\-/Rdy3U֡/72}_Z6=4AIV]fɿzQp} hrĵť[?g9 _ 7vVgU T"Ɲ?*8ۓ1*@M+9?3 濩~M$pmmB|?KWǬ펜|QY|nXMFQxLB2ĈIb YR]YʤSIV]m9ngYmn XH1.%/V#MS:26i%-3RJc+V6O{3P?!!nD!mv=t.beGQ7OOwZ@Tx/E m_kfVx:x㦜,f#Mna-#,늘;iP2ڋѯ_j(P1"@mFOJ.ŖMJS:ko! sof5 AI0B`) +Q, Qժ#&k_ ^jm]E)q7JўDTM |4iRs>D*H2Kt@`IΦD,2ijٮ$-w& Ի^0RB۵ʛٕ6!tA ;*44T[ߓ5ucZS6VXFcrbY Xg|U3 /**-ͺEmH}ndžjO7,П"Gs+>T۩W}\q0V?>kxf@r \MmKQKO#+h:%Y1 1zc3 RJ!sg-sUީ(SY-l0@ E]=.NW>  Z. awiKmkm94 GR[ L :9r5[4|/VA`! Mmz& TɽU3t2zQz~Fx@4ZJr0^̩Lhe ~]cH"}2`K5\?HLsXiY^.4?S%^?K}+VT[P,[9ϩsB.пg$ )fߟuD1 l ԔOTUG(ܬNXJZCVx!VeeO E!-95Ca葕\5 *^=ʾbSooL)Icq;񳴊%؈42`sHƾe+\\0G=+f\amz#U$,tuP '8i7|os:1lz (lJj*uA=Q8ʞ#%j$䙚3t?פ1c)D"o1$VJ= 脶}P:>@{/X}EVK'/L ŏ,78xJΪDBJm̵2TGj_8bא$J262;$ /?m2[X (DՁ{Y\?kOV鳹MGS+-ln =^doj5ߎ, :1(%T7\uj7FMj`%l돫(\IlEb^.4sC;1¾as<>_gjK z_QcMs S^u!x쬈߱M`S{zoKp$NnuEx-h004ū3> te5X<}wL>>'/=*p70!z3^>Xj@"?zƜo~[uV+QP1}&AezR v9>쑐p3ڮ" ‹.Q~'Eu%$O=Q0ѲZY= 8a |e }}M[3a_whcz؋%,qЪ1@2Pg~<_TB5H\܉=ey5Lf` M3>h $2b.l_7t-&__!_1ā@k6Z1,^c♬,bdS싍Cqʖsu1&|nM?(29e5M .B)◭=bPp6g={^oNv4B?MV!O30۠ #7+A%T;OC} e%vCbU(t߫Ix)tlUW L?s3Xǖj_+C) Lc×zV$VKB ˭ƣO?I/IR';Y-I'pܪmqyQ3&MrG> ( m, 6}dӐ G[sXVpc r`VZg^9#c`NLݹ Q܋z*Eƙbe̝.I,vtgx#BgĶJ3#Lύͯg>XP鹵i* Ql٥y;w;@E3VUh3IzZ-|~2{fWdŗx *0mlPQ$͕74X5PN7[b MBDT9%AZ jzr0BtҮ$Zx)7iO+9 VtH*tSʾ!mƟrW2!ABbD2q(ε+ 8ET7— 5IDM}A7Fا= {1q,nTiZ.g}Va@y@XEw'lpBtBnFhgphƯk> =y(>[{B^ QтcaN [{|>S Fc0T>8Vm '" šZlKXܘTB =K@Ovs_tJх+f &;+R9J@'~HS rI0x>5?GHGGocE΂o [)1 q_3"MZ䨉!RzH=+kph @3cP B.aL=r,_2Ɗ&-cVQE)b*ŔZ1͐ 7$hNG@AUI.nd?$Fȍ0}._.1OwJ w84p[Kϥw#3:(V%_v#~R15v n\%#p;y[Pt.2Fd7N/hHU SY?ڹ;OƴK-V\' Zi j&эH3qm+`7̈)9qTAi|D'i^:1A/ʓP3.L+xܪAl!WJ,ZyX(I([Ҩ`Z RܗO H2i w$ny%K1V YIK+Nla}r2c1( \d/{:kpn/d.;\2yE]FG8ǥ,xPP`nvuj18)I͵e .i5ђ|p@,]n=&}¡yL84eR7ObJ?ms!eBH}0S;ǜ$bH]iV6uZn4d@*?-%UC`CJ^y~n?q>^CK!ynfyi 47ا)mK~xGDMxg>RrٳRho.' `Jd'Ο"!#Ie 㼵rÉ1BXz(CzǣW]Jv0C+` :I-ˌ7c4!j|U`ELC$<,!D 4vmP'p8itM^=%P`B+wkAP)+%G,@b)˧m37+l'&QJB?NG_\5 Ū9 -GG@ Gs7wjK(Jht0] 4D#,JĠ '>&+g-k 6r˽D-!эt>MĶUCC__;`Yf-Pyw}K[&w&Ʀ+Sp{0PژmY?gnYBw9iGf5o^j.f3HPX+{<Aq3O]3cՓ8hxzYvSр=B%|Qq0z6)quٗ2㑎zg?_aol,2 |f4/ld+/%V}X,p51iF WpҊUGxX/VQ2WK-3Dɾ|qza_ː% q:""&GRl;v r[-X,UtI',*xSBHu)&5_ >T3xEnR7,_, lUlDx %&%TrkoTO[(9%`%0@,IJ矍}U ub3#|G˪"3*..zX:6o0SZ#84{.N^9Q1hJ}z=ʗ Tw#q{݁2Tq~yyiS 174gg̑ }_x=[X -q*s:K]I2S|Y6>vG OqBp}^♶^VQq$%{eQƢupFq"vn"VDY6R&d@hra|ŢRKj.5SM:Ҡ¡C/6rgTwpmf~vOwh'6,'#YLkrܦ} 7B,<@\` p$ KrʲI?q/!r˃\ riiJam3'?51 0mECp!ݦr.䑟dBKLZ!fBLor蘋Ϋ YUkJ`eZ'Vg ,{:&\#{cݐ< Z#LУtz{;~vހ׮ak/RyBM@Gs~ v;DPNHv^k*h3xrs9EiyǛ'gj[+#ɃH4#;Ju !^]QeH^叨 pdV[Veu5-ll4t]$y s"[]@ԧ`p6^rn>a5@Y^K Cq͌77zg"-\4]܅7ܺ ֢skϛc0GQsH1w<&v3IP'9,IPO@|?ivěvK@Oi!۸"3k#;m %YPD VhM0Kw: h5f,еgW(3e8 Ie <؆s)1]O$d&b0vVC}k6&1tZP\Sy %vCQ IwLYǔJ YX]tYyW~$b'IsVFi|KH fƙF먎rTmmڝTܤN맷 6HH2\<(k%x.7}h-gVP0CK0$} I2&&򩣷_ Z8\#Ŏ{bDk.Ķ1unهt6b\B/zy|%7lF""k̕wĤ;WT.9!иƪ6 3nY pTm\ >.lHh'º]\I|(氻MOy1S兼`e!ϼ:F5$#O\G7,Z?H'@ev/mG\E/7y}zLgVd0{gFRI @t?XkעN p\ ]C5VҷImW)+ ?wjRm4z?RB).@{4Jw$@ĖH;Vl62SlZ=*,h TMW o ߆.xi;^u:2 AG-ȉ~PH2`㱎bIv+eAn zIPC EHY&mX\~I&BڿB妈38<73/~KhJMloFخЙ@ЬRe@*9o =S(s9|U/GF 3ґafF9SĒvTv@U)G(ݨHAM ?i,Mrk襛=Gq* ksUU;5nBպ@mܸ6JRZL?!o_aۤ6/`f7Db8ǟs!gU&_ٺr'G_#S*&+ z^h߲N{v勷;AQ_g: sJhex>qJ3To&Bɓ%`H{}iI}5$},,Gl%s<:;d`H" r~/j"21Pf=qbUv,'wČJL ~ꍇsqd_؛V-vsx9~!˕?Vjˍ7[}M7iZ}%MYq y]*Wme7.}r >rT5|QL2jեBtՁnJ |o"<KlO-qPb$4nTo$><᥃ 5)U3U9olf ʐ H|*!XυA m88xF)f ,It׽:ӁMb;G".:>w#A>)[hoZ,3TlW~Z@ >tJI=YAcRlG]p w Bw-+b~t@w8_Krf &Sf'x]WD2%/.>"t>/$^ jVm G .yvHr iV>Bft|բf{B+YLނ1v`7RtSi{c|%2`|y,,d.._ɠ[.HN9jtqO egR$†xW!U((Ar^gbg0?:G>T?⽯ !S})ʋ(x?+b"2 Uw; 5Aܘf4t΋2TJNHĢhK4HLƠ lwqJ 8A~m8/~.pW 9<@cv·e4 E!r/Ll$mz8`nq*!x-1 u&`HòaƂ\w3KU9A{\+t.-.ʧ;.S>[8zԪw"ؽ24TV2m2T1uC˩;CK(Ж#C|bʑ\2!`S}Ry^nJj_uv3^d|3R:uèŸ#U2 yC;[8, EcK 9NOƀǛ$v N:J/Jho &`,M}ƞf?<|{;V<+pv.T+[X,H5\j[5&j)"Y(ԼUL'!~yB3I(sⰍpѪ#ވle\[TT,h/HmUKu`Q&aʈKt>Hz28s}g'x℁(i9}3"' $P)h4|`| 9VI(T~ 'apTKOru/ڵDlC(V qWJ_~kA{;~0P8wѤ>:MXS$ב>b-G\[W0$ I jKx̗vԱn-91FTLH)c$9MjC3K:xVyyL|HRs _+k&]¢ ڽW UWBȩ:_B'*z1 H%g9krvmJђ8s0}KPn06Yt2Ө(`qv&F^\I~-ժ/4f+]lcE1enQI{e\?WЙ辄M'3yX*Iu ]#yV^0.{Sf 0=ydFtCP%0/W1fv.i% dU"РB7~+=Z*:X֔)9$gf8w<[YlIG[/q a=jP;[KA̻e7zQnj`aBP }Moݚe _eW]-pgA©*][C{U,E>g姣gj)vv΋muwxe 6 Rݓ0(Uvyj~D*8hyXH_%Vn0Swg9\P*ìѧ]G~$> tD3E[1,ұObF:9N1z` V4;'4dk\Jj%&"7id.bOm/XZ4wGg\q:bHKHTɢ-Lw\8srxvS8L驹ڍcRit]V],ވN=K+Y[f~{n2Ƀ7Q@VMTvgzb0U&7fdf8U2BsDGH4> C(ex6(OW=!J 4)9$j<]ToKT6"7M0HQ&8"8Adtu.O0FrVaB֙r7t@;٩m?ݮ/G e+5r@߷e=³i3@Vɷ)Vf:[I =@"j&Dc~3lGT1~PZo&qktNi|KC!2XgUF?2 62%hvXS_#&;]DD5P99.Wtm0`٠1HW_$ XzE%>rG0^-S⽟CX,ˆIgrt=g$aL% +.ϫly-3!厈JQ>ϷMyqBm؅ZʜuLu=x4gN_pң+Tͥ=zVe *<> j8_U| u N뭽A~t nQx7[DS 1 ,[`iz!Zu`E }z>o(eR*ky~ Y&yb/4ݵ` CUi=~.-Lkdӳ9a NG>xZGE#<:d >JFha %Gx_J҃hZ|s5ΰ# PJt MשOwbk1>9U9aצA=|.>$LY vɴ"G_fDG,cX;.] Z?b0!xp)) 8O.tCkM/r*5V {!} Uն,qNP[DrͪET>3\~D3gğEAV?k.XE&_qKuOTCm:%ߨU.2`NrL揰#t倱닰ʄ7BUu%,Ox(O~2wm6;N YͭW}tHo2]\#{,c%ٕx rԺ7$~Au Ix,Aݪ(bRzXJe%bx56{vF8/ JԒo(S_9-~Q ͡nb|r ",O|sk2U?I$IHyuv}| :t Dd"I:5/S=Ƙ.z1sXyzsTnʟ\?xy2*R I,ߐvE"h )r*E'4@"li+u>J13Rt_ @WV1!;3Moo 8ǟf~`XG)wQڑV\~#`GS5r Rضo_(a|flQA] ;GD$!&`i[ / TU%mc͞}L(+Wp2IR6ã?e-`o)oBxSh]|!(E:ODn ~q9Qp\XJ?k螽nU1!jO~\ W\d-G<0n|mK7zV7h:5/i >VL|NO)Meu/)J+&das[H74E~f'PswdyaRmG-4Qk61Ջi|CZcփuy)$/ڋA(.QueUt>S {P Savڍq[W5:dN+>*:VD~c qˋAyX5֥ _:FCe˷[_ATMf'F`#\J*eK\wT:85j_ VRܧ>cN~v}f Gsu+k@JPzZg?B )T 0}ER<2 ; ˱F18cOEj]˲]<.\9c /vO@lp.(>ޤNݏU|DK/\{kH-ʹ N?\9h/5ٞv/O,i%xI^ o-Nh"nf{'Ԋ:c 7ojyVT.l^MQ-u}A8{Yz^ؑ+Ͽl8 }Xof3uNJ 1Z6%Rq1Mm`bP=82"[ߩ6VYʍFFVMz9 2ka zoܐrLF5 dVqʱV)% ՝- hKM?!m'Cm~ob2MgU M@rIK `@_-Xj⨻L{RM%2*9vJCqx0y(@sb<yqF& ׅuAlCTHjy-ɒK=*3 HFk nO:4qNg S=N\B/oVe垯}kSt)BůF>tt"90<|X/xJ,]o*0V`Lx|4% 3a?KFzi2J@B̻%}1AhvqQ9(&\͌_'`'ϙptۄֈ=]Dy4sP&H v{9`{wXG*Z Y=% |UWMe娉č&takNcsGɀGD똵LrwÎ>JgHvoKh :$AP.`OG!Jm <[{ǻij72KKM:G| m"l}lDseϱLMr-v&e8B)GhNC{.&3wej -bǚG$=nu vB@r{:glȫ&WaY?)xvKU %G`3zmlY*z5b\!)G};{}IN;%5=kntPyi g;Ep׈C$&S 5xIgw ,s9IL~+*gfyY^A1#wi1^{(z R,gk~0eN޾a]EM+2q=}9y`an LVZ`ȩAB9K8W2\lBiҳI0-!<\7ӣҿ,R %.i"b}*uMDw4vC!Oٹ@E!;=ENKokғdCw=b fİک݃X'0̞wtn >\=e^=1Wi TwH_KP} `AйVZtBBO9rWȟ [9k%` /od֜́>ާA J^+Ӏ@j+mo="{Mi2B !vT `j g۞4ۗ!&2LN/*Xn jψӘ"Y]92ǶV%o;st8 UIPS'i/8|mm m{߸>V2r^`(Hm}D0<^5w0e6=&/&XrHRnkU Zg@8s4{8Ywoj P_e\՚<}{*TЛVPFKRoÀe8ϯ5:f8( ݅yn9 } 1z?c-0XrF=O)@yq1lI^<}q 7$;xF;B = @Q6cYI-=BHd!SG21Hl;v p7te aK䔏MtbLa Ȱ nbcZ0rK U?JJTNPuq3Ȟ&t>Rִόlzֻ/SwXӡ찲?ׄbzXbBVٵwmɠbobPRC { ;bhY(vQ]f&E;X'Ev掲9ͫ|獵֗/Œ<4ߴMfxK`E\YI_!nInvꂧTuqiTFİΞBWw?t'&v%ꆜ-^'RGXט Hj-eFMM e8tM_@pf Rez]b9og[Vc4P]FR&wS; u56 Ъp`|z>+prcZ/Hw,;XԮQѷT 1Ò G|<5GW ZrK{(4fzi;U 5Yy ^iXR )i8Sw' 3_V<G'T3J)G *0 hՙۈ1x;z[ z8W3x@]}L}@5g)hK*(Kk1DR͐١'K[hjQbԥ:⒳9B]rϭZT1Ybn([#PEs͘Tm yɕS܅bwX6v=pYV%v4ȝ|d2.8g:{>4va;PZo~Q@AGַ"?D1uKp|>RK s3fTO b&O~K@KqܭJ6ZP$^ ܾ>HDl347gEnBYS1];,N PD2*$qk/-%ߵ`jv d EJ6A]}^KnG>aG9,L(u@[9WV )Ŏ|^. xH+]bU@Sk / Ԁ8e,T糽=&h'N}b})̳kY1h㚅~;opJR C? v Ntԭ+GBt-)R껮q (*iH&iX̨l9aDBm^.d3+ij_5dk`qU!]?WrF 'ICG ٽf:qt7CBKwsj[/A@nU|ScbP}AD_p^_I ޫAy,!n 9އS9wSy9Guk3֙=e3*ˆ+#Q@`ѵUZV#T*y1̕@x]C0K VW䛦6|ZD&|:@K. _A#^G*petM'z\ɉ1lWӮ{ل,2;\}sF҅z`؎?9gGh&2ߍnQ>.K=yK(Ab@mye9hAk3KD&&]o˽4lɤ8<%q,7n7oL6/,.htDe+ ד3Ӗ 1O&||AzE"kGDHjVH99j0̽^:Ƭ*LJ'd>:dޖbj𻔷%ڔ?JJfM>}M4&o*0w|0OL+EY))<7~LU "tՠܾשOYRGr;nmbϗ.{x՚ΏIAe5uKܫ'g WcqLkoHd/%a Wf`i=`շ {*| 7-4f2ꪄoIyBW УqۇPW7]ZJC$JfLзN_j$>1 䇗G]kR\n81DkXKth x>O$C&e7kYjGk6Y;4oa$YM/w~@uN[&bݽfw-ƥPuv D _oz .xYP<uS&2<HpMj,CPUD`A~T#;{0] ;'G80EFPe$P8l:4Ys$WSv C }"667|b;U +?Jzӡcgk%'[1bSyz;2WbD Z!d+9z$l !ya vC.Q5[I!~`9a< SiHېchf (w|8ԃЫfc/Mi⦩c{ԯ~'])Ftb8])w[J$IIdW(f T*?C%?jqꧠ,7E Y b7P>XA0X ~bFد݇]omֿYUj"v(ڌ^$ܓ{AD+t }*GAB!ۆF Ժ)US'=_gT?εw1jYPUNZa6*x+I. U䁌Gw*֣VR܁(%mX>x0PBP0P- @~@ρ@․ ,|bkΡݺawv:up.jo"}1eʪl > sI=M;S&< <_T#v&Ձ.vkgX_s)CK JLNL5PAtJ(f[}]&5j/NRgsGOw.1P<-D!ګrepU]OfwqDأ,v.eޮ|`,RBXՈg1"ǔfeQ;[]Co j!\XPEC_8ζv@S<.trdp^81eרXV9WA@?WnV Рҵ0s\mse.j˱h[S<OXm~4W k*5 :A6^ F{ۋh쥎pxdz-|NBD_ ;XUhmI"E S"͎YI"e%?5<4.s}\c:Å `lf|Ȫ-/[bx{i>ȋ{ U*ZťTPbbe-*)x\= %!#1SLfTb2W&lׅ뀥ڲ/3eV|'ߠu܆Zas[)J[w蔝8G3ķQ t-0H1_/ѹv3 9o׼(K)wbWAoyw1Ѵ RN vE.DIwq$nYAxİ>5tvz#ްκ/D_"&VznҸU{J*pd&q)=6c16YH)h(y6ycb@ ^$;r5ž!)Me%Ro<~ Bw#(qg9AHkʈK૦̐4r+юJSyph"gy=X'IxtMJg@>g2`nac9@~%E*4F!;:)hlti|yWewYo1BvGț߸e%bo nCԹCe*'M%v1eCai;]Τ+F>*u=@ Fwx{/ܺ5xʊ4LE~=Ŷȉ3Xa^cRu[iJBFSD%i| u89)Cs uJ*uU})4%5J5p$Hs$EN `ԦϭeTq+MqƝWR:%TM0ÄCکJAmFHAt<1<?%sVDžd%@&JXTY]l%g (WJ)ckB.r$hcB@fqs9lT_b U'>_h ,+dH^5~\D~{ȟų"_D+Mӫ-OB^ TvHc &UuJ;{" iSI ׳Ua yu%"k\CkqD f%9Eku5=~2^h?Qk@]Rt3k}?bSrw$!:/Z I. oRHX 7}bH\ih(iؽy^U\:86[H?CJ]84 v}SMr~zKODBa賰dyvtxk v'9 F S d.lS}AeIuc㎚&F>5n/C(FhV1ؤMjؐ6cy %e~YlЅ u?5F-!$$}R(l[6[kqDۻv&!o<3T p6-֠zɧ, S¥!pߑ^5= *% J0o5=Roō(ey@KnlZ C٧irT}yil{JW0ӥ,T>,23l_'߷s4rwɤLG?w?$JM}R<~1XtBG3]=6) Y0Abu{̶c.&7nҬEp'T,`..qo稧eJv݋FP lhSĚURU$q)%5OpOm\c3ԑRYvx"~;z$*TË?\@>`b?j~kY߻GF#n +Ζ*YQ]6ܗ*U)|$.eQ1iT5j_d ԍmh BT ΤQs5OwPQSۇhV9K)~\j lon4L֫0mN|4J8Na;=2S9l |t6EcjBBAAŤ2(9@8F+ϊ6 p/* Fn.sp%+=kZ| ipkUEȕWuri['IWVi[;Cri~WmHm'5h^!Z=H7+A8WtPם|4}FE4GeӛX'HFy + ,$Le̘X֖B~CCe.c>"5}bX6NͅKfZ.q] ٣Oo[KB@$C8'`LAlUՋf !dRWI(͈ـ]7caϢ]V!xX[C[V8uھ|G986Fb>|bc!!lTl@2\̳-U֙7APK2Y5Th&I;ik9dK E/LyW8DGXW:"YJ~b|4,M/j *Abo>êj0xRD2Y˸?WRRYG_ F5VxXe3=:= ʨF7\'@6M% )p3Dnm,=zk) תE!td[Sw #iqP" Mh>5JVol(ƪ#WG̉6ՃB*,GY*uNsYP``hE 4mU@dF =\جOϣn&U ޒ}>~?G;Gtw*-o :?ٙd(2/ݘF;mlΗYɸ"1G (*Xi=:1x &s2dCws礟Fdn@lA,HFj@| HVI 2z~FS"&ƋeEZ=+{rQɞ:V,m͢+ˆ VIZ5ByR$| pHm,C߻EY?2  > ]9~H8OXa'=b [$#A@!b [hwFz 0 X'g*zL$s<|ؔ%F  x3)@&U3!!6;!|A[^< k3U,QleKѷs=p&(EQŁ3,y#!k {Y SxɯpNepPN, D.*vd=@ ?Y``ӬhG\ ~^_7!p[ru`<|ށ#<&Lo6_h/nup`# p'Y *F-2Cfzh*-8ǴibaE1fFe%}҂0T|+x :mW {B6thY;a@DXGDmx˩rG!+QI]Uj(zD2j0c12CGW4 "#8zfo\ŋs1jgs񕊡|Nb16$ 9V >r0ڎ2(R&k-=[8Qi^Āp6က] E6*8egF:XJ"r|;T~My `+g3&2a\6HlAX*6'0.0. "+P_eW|.*]X?$E(~3_H'V[eHcm>oWtN.QDߞ f} N*y;Tt%wDcH;7YXqQwc+[m f/?gڋD;|$fnxi|<$ 2QLH~Fy1WDg<*v)ÎN=WCxccAD8г7 ceS=At`a6bÀD(7Bb#婢׿l%y4N'X>ղxDTOpۻI3FK+*q:!$_Jѵ ֛9C-+do(k)gW elnX%gGݷU4K k[ ȍ4.Q1;_) UTfSD3LaJDjЦ4YQsRfѤ+, Ó.M.&,*A)ŚR1\C-bќSlRKa#8ĥ'ӫ^Ðd€=JlhN֥tϘ~-i@642+TiEx>LfZ[GaޒO.h p6+MC)w\; h B" .r{{aMTXné hnوPe.tu`{TXw#(q30(#5ѸݚcSBu{2˵A`cM?FDm $m2T `zԺ%;_\tr ~S }m.ҋ^,b{ @Gx̬/=s ᘲƐOǜlx)|'^@\+LN.Fϵ_/GrXaPRB`ȍc"q؉]:{b崧;FOPO[NK7!6A+, ݣJγKYmJ %[Tni?LdjAa Az`#!jZE;+] 4jxD18ϐ`2Bv(*^q84D;#AOdX*, eاf'atᑄy~ꩢf1j=]??_# sK] k؛o녇^i{L Qfs9 *02*)iT9JSF n\y 'IݫB앐(:Oh)c SxxTUk X ೂL%>fVSn5+֬];~2 tG:>XއM/觯BPV S.$u&!2x=oY"޺2)؅d n*h* e)EΧxW;x[nEkcsGZN/:݄کmئLqK-xo ,٫*" n="8Ó3;Cx`o)>^ť[zqpri;71癩+ЀnۿP yO#Aa ֟CI>{͉6ХtE םX<_yڒ;tFv(^!\~%/f;Ӣ+ @Tq zUȉ Grd X WЊ/>hΏ<) lgƿR.%GL_,;'J3IF1 (ֺ . >SV̅nmDlGV"[Ş tS-&_ܟA{ơ+Snfw>{|XPSm Lݕt#Z*%?DRnP89zܴIJ5DYmy!s}c Ǯ 7ʋd0v`"!4u@}A[ !$ _ @OC)c1F;s9x1Ov8?P"W˴Ist,Y1q{ F'<٣g#| {v'mgU~>&|A">mPE/S1NOHVRѢ¬mKm^ |x!\( Ѿ]fwҖLc'pu݀py 'd&O `dO&5+du(A倀%^8P<9/5?+o˸`1h ZP[iusZQwFPyi%D)8;.m=8%)ÄȐ Ck91>=տId98=W7A9p2*weسNrIq\:>#YӰ݀ u:0+#S W8l\U+1MlqfmUnԐ5s('XIK. )"382 "~3 cJҙsUȴe̎m}^> [CY̴D}HL6$PIJ *+iR@o|%fif~c_ٔ:7ЩkꙈ 5T<-$lPǾ'm6hbOg{;f ,+ fe)jۭԌNa6y tu&{/<9'/`իoKWP'.ISMfd[x[{ [~HW5r , nf=Z7Az;]cֳv(v'<zN.}]Z;s:ZE`9dMY'(&M{iO7^!q>w$ q2oL/Ƽ'Gy'/ PFB&H`1 wcBвV`|!q2$fDo9P;mLpEW 8=d0L&L!eRc(jlaZm 4#W}p=yCr@-}xMRLp #tEA gAr!_An81tO ̭j\Ïg+v|4 bJA*n3 '13dF x=3FN0pũw1-/b]-Q?$l ><2yH"myGl?)2P۵[6MATv;Dk5Sm$M98G=/.G}'߁8Z~t $/X5'Sɔo˒tb$%_JS*&sshtA,d ?FltC $5޽Ƈi~<`qF 9Fs0)zF]C/OZ飤-|$n H(䬑\7ʗ/[deR+8FN!wӅձgc`_bN:%-,`K*ᙐ=pQsG ԭQo@n!F Uճ풴> T"}TR f J?4NpbFl! ӻII^W4+ccwTOOWu%;4-FzX9g"o|.q'G&Rޚzį{}a+RVm\ b Pf&>:0WD'@X9DB~zK d Ӧ#aMnO㸚?Ҏ9#` =/VE`3ja N_h71# )U>HjɞtlCrTwߞT]Kg4 Q+l8"Qp,bf%xH#J,wh:=ۊYW # dK2 "p45h4;R(ڢ&?SQ**=#uȘ7䛆64{aUxw̭`F(2]ˢ+A-gkU%X1ak|朢J|GHq>*3D$> D?E+{qK˨W(gJsȿӁ qe:Pn=VJX @ԥB*lԈM^1@._dx>PPU|XT9S|XXnfBN\$^>%%2v4`v%7:|3*uQ}Q,tT EՆ#\l4?Kqް^0d$6$GWٞ,soXx/_o$_~mgؒ Onq\+ Ѵ'.#2oX>MH|ilq::άNG~ ~g lwE˃ٴa`CDٔrappW'0\1P+VLړ9E 5eئC H^#~E%&:[jۣ D"b|u\+䬻<'SVx'GbMgVnER`9\#usъ Ӿ̶}˰>bE¯@ȹZf` Oaۯζiak2RqL?D9x=n-"Ĕ2[TkΰCX% L%gW}G)HWŪGMN֦)3cOhmD.A'{9ad'8څW18(ُ9m ʳ'uŏ"qD(ZQ=3d0^1Q Eu_9bәL ̥)7u_j6"!3`4w~)Vˬ sXg{WF35݊ rzư4vBci+U@.¦D/^v- LP~4a΍+|"2p" I5Jg2[8;fR5;! R9Aun]J:/BrƁzs Vc50M];Ofˬ7IS\ĩ6 V-)7;Í{8d{ ]GPǀᚉofјUEL Ehy>mG؛=;MgVmkkjY!@da@aWXr|Ђ 2KY.O(ĭYHqOW^4R %qW4v6WHqJrD`SQ\I a+CtYJgHcg#R Ēs?N E!s=Gh>)0Aiph'car->:O4Jf..w.̴[^܋BQrVZJ1٭Zx*0hg@nO3 <1= scҪt1җ#҇Q@`+4s,Luھ[JN%#&\v!W0UQߜ๩DJ**|9:$HbP2_4ݗԀ.Ǔ|WFpqk1akKn3S{_'4 2B0jv`b##,z(.mR 4Oi \>wQAD;Y;SQ8f w C L>inʀh}+ (ef|ѣ#|1ca`O| Y!86=<kCxJHpsͿ B.ķ dŢ@VBwG+;an 5T| 7Q+9ε& ,<(x !oATT)etAwş\x91ĈNZBi0f."?8I  *4=YVb*10 ɍI:-s߆Xi+Mx&?Vµd\2H۰` JsKT7WctH PE;hFQ3a ^gf{rusѫZUBmI3631(2VڹjU^=0Pyǯ"ecد;hG C@m6GO,=-['ٟLtTdZ[j,j6O曆~3?q2sRk3iFoFK ʎ)V2|^Ldt8:/;[ylRx;[+7Wl͜i<Z]?B :WS~nS`4x导e ntyl]-|j䖲bY[lIC{Ѫ6=S91xJ㾕F#(U߹ANOQwlO J+gsS?J̄z^)HB6o~!Jfs=Y\]QYˠMؠ,wQS +9_wr;` )K3> ɠ7^ w8WTGO3vB CJ q2shY_W= i! #\[F2Tg~AF%2&LDpPa\XIMab5֟E}>eyл|R!ؓp/yuXR#\?@Nv6".z Ra1d"f[!at(#ς+1[ZUĎ% )RthZdSiJS5c7/r 4aҨ܁Yh]ZSe71Fw[["2OHRdO/xzZ~k?hb"~ -{pRLt 'J;ERcò2Sςp&oc߭cp cRn5lX0J;Ԯ]y ?`1Jnr@ڸ+>gkM6GVq 1>w2յ)LdYn.5[,Ut(;Il# b<댁v .p#Τr7jxEz-S]Nwq/Mo(\ $:{^,T_usQj!XmV7F5"l5I!i@_9i}wAK3AUoR զ:0 dmL@HQE|y>:E3fDpѱJn2=9O:h19Su=Y3~ɪxR dG}&^_*S^}?mh<]e4Bwm}x*)Lƹ1]lQR u_[FGw)j3]PJ L ~>@r1ϕΛ1ZwF2]~XLO~C }l=gA+ v5Dq^䩷u`U^KUpTaow% Tw6xu. ="<T鰇MRET]u#&Jynrxw<8%odD,mĠ6z?WZNe^Ou}P#Lp ؙGnk+zR2?}H_?eBrjzl4>j R.( Y\$__ZYAzfeEX7@LF3p[aMj%q1!̛,I W(9I#ݰkWrYN!Ғ8!U32iJ]D_7B`;u"AoA² d9K )U2.kޜ`,#Eվij`dato"RZ(Ü^~.C#pG#OG66zC'!Wo&tYnxgv̵QWS_p XJ8QFyz*θ%5Xg٩ L"r0:F8?>tql=IJm2OT  u =3r Py%r H*h=Q7L$L/}{ԅYk[z&`7$&]KCZŐIN'ƖE(e5w#.1GB6?Kj:a|$("7wn:x&p&fDՠ)zBt}.A&v[ ЩT elV|XLr'y舯ž3rAoX??@?[tzK:<Lpn/L_F[cb]hMNw)nEz3*R3dHK];l;IL}m3!Q4A էhQ"'FJAZV3 0{HmĐ ʱ0+؃({|!; ;# ,8+^Z$#ՙOHUx#7BtNrw]oxA? 3y<܌5daBc?[~bؾ__>@|:GLFqHs{p0w_jο?yE煸ڶpY TNJzYd C86*i bcoP6w9HB!JMPV%:f."ZN$Pz2'UJDcb3ԷbF_ǽ_{xlщ M3~9bXF7Jg@QocXu%)V#r 4HSYa[Fg "FS%|~fbN8%x Fg# f-2 `McBm]^!8ȡyJe| 2rDCc߁ƍ~4Ӂ-s/A|!,[T(ř#E @tOQ-,./giڟC?C!jT)p `&~'p"ˁe'l?z2bIV%7|dSᅇin7BKNCr'~`2`܃g-fjRۙL60dٰl#җAl]xS9"4ĠU cR.ekȣ[D2t-t̪>3Lx5[5M@^'vd1X=b]*x.SN뛽,JKMk.|vh3bUC %kt |#?ZBldD7C*78?eKm` _r/L{rLTbRkzĝ:99ǿ3,`[ 7Z-u%p;`t,Jutߟ'6rU{0{#5GK\HvJ7=bZr;P_D}Gg[8+F<SqV$NM(JX ~{Ź=n=z@Ho*v Iyf8D`b.2Ic_5EhKyʃ\358Z*A_Oơ`IJ_yg]$eqA(,UDk P0o!qugC :bF,)JǼRЊ~蕱e.Bd?!e8gT8>]Qaeer_=黚cO`}hw0jiP"ع@խjrt_I 3։"Yݜ; M]mTЎWv9̰=_24)@ҐJyv*$(TJ0y:S#}ߢ1:4 -Pg=!C*VY?IJX%]J*թ%ўi5rgOh*hfuv]6_/++@VF;]W1†bFDUXyrax#4Oѭ$T~C^':Do 7 u¡AīI-OJdЍ,NTZ1<-e(Hyxk#ʼsS9]w{EKWXK]n.wY+B+b6ZNg&h),^LxR,с7η L(0H&j OJꟆվW,Ƀ[5tzW *3pWi`Kmij+ms=/vWFe`JZk Zs(vǍ;ŘF^bTȸFڧuL?8ŵ'G" Q;S =s~&E?A kʊbOݏ1fvfɷ <p`.𞓺 ۅe=HeYǃ{ҽPmgovtii(z79PHDw]O˅15e=ڶ B60gXcya 7paʋ`F@_ْ-ZQBwg  7`lOЫfNKQ %- v`pUp5ꆱΉ.X㌠'8ڑ>5ȱLhyʩ"NQ{h'YNM=AߗʝiOw/借- (ՆFSjq3k9( qc 4MAS.sS|c]p} qgkA\xfNiDxX_-~C-Ň(v{SҚ5pYSډ`g6Z YX5!|g&J z H0Y72xV6~6=a\ (sV-19:?}\`eF|ǎA36k2,;p$@#z=%=GL}r5 q:o2|{] JU1ސ*R)ے?{Y?pשeHvM!zyeOh cF cA0rNIɹ p}v61T`!ڇv|Rd>0_P 64ث;HKʟzwIn@(={!|+YzG5 0OlllbLhQۚ:BZ?H C{j}a#f~ɿt1&JZvI_ٿaGt k DilҒ=3RޣOr-$@OÜv素d)_x' j?ax9|nPGs?hlhHP85QXYeB7`rY1 )2^pt(rq(R65=A /~&nc23 "8 %PI1E†HCHR_CvsQS2ey٥ӷvpz#seg* | ݻhc,GoϤvO^g?qU4unH2Z)0J4o-(_,$-ЮlAѼ 8/5{ԁnȋsq , TN5X$_6iJU + < iWp0Oh.S~m}з@+ā+*L<~*mשb+sD ޏ =N@?̊ hκ(e690NA|Xpoty n"5yF怜A$%AH],楬.T+@Jsc4j ,rK OE)Ytɚ\:^w'ypzvoWOsg9Pg0ƹ0<Į'2wƠyP<ǖoC\O5DDJ]?S%ر=^= Ǎ<8r( &uŒx*;'f@tLzL;ʩp"?ZYXj7h>XIqK4Q)YgH,Qwnp@ktqW%h?vTTl;u<,jIĚX5i( D9^2c7( Si-XE տDua@qu0LnAOC}Is/WEfpʁ#H102#Xr@1ڪ~M| J^Ѫ$nE+Zp{Nm0@`^hYC^^èD7(xlXQ J/Id,ey٬Hy-u~ASVͦH%V*=hwpP4.>t)aKdl dOO1bc̨|x~NG4njd 䞲4zrH{$RiHU~"U'sݩ-L*?%K[cV!jϴ1r|A.'C3;a>.j'.wÀ *IblQ[ύw6l#>1H`ލvQ?~V_Ar$؊[J]nMS߽l$p = |ڸr\[6_T]NtVG2-!~ـt]=ͦ=L@\ Z[rpwr0$LTLsj1ԭꞋ ӋNP[^b 8yh/ͳ,{ mE)|S1;ARӫ$X;0~u])Zx04CVjHHD?f/ޘwR٩T$lw@K1MwF]L,l2axĒ1ظMRݿCPP5͋(#%esTol֢,MEb0ꛣ'leuGTbfC9 =+ˆ(1iv0yuC2mWKOݴ.8%JL^0gi7˱?{8&QuX}(V2yLLs%#sTAi34FzѭOP^]$㲢,R@$cStEaPZq.ina[4K"˛My';vƺ*]6*blj9Bx#\P|ZJ^^*x]Xʆ'+N9 .Hg}N!6~iw,TǴ9!3!V\@ŭԓdƮ(**0E$Sk>E{b:)3ՙOОvO`l$\PHzhfXL6O@vWWv@TN<0*0> -͝FѝWz|e&+.kêNbt(vfgH& ] Etg3M1\s|P߳*gp<>h[*rZHHRuqg|%zEw#oƘJVmanY[aϛWvWѦhwN"I`ͥ)q_W6cu;~4M{(-ܹuW( yryj}*B!q;Gk<B2d 5wge9BGTI6 ewf6%uʃ÷Uΐ+0g&< ,fBu'~?:=$J 7`3!mxʅ鷲m4Ԭ-h2 `/Gt'@ܘ`;[%/I>Uku;˱FODVqϛ:<;S9\|WF*' ɢ u'K;ߧq`P{=KR.PCDJRs@j1ik`#}N!I^<{,Y欕ʃzNm]-)GR#@ F)vń\7}mQAQ|uB)̌4:"UiiC^cf C~jۉkWNO ?1р3,Y(KwU6b9 (دW;h+i8) {Fh >\Ϊsc#~/֣/$Kٿ'k\Pۭ#1~GUIWŬw?J:lI;krS (?3Lo{~k*"i8R/͸ϹpAgq]*bF9@'B8~|(2uIԿ%H h5\3nr)_Iּ0(|A, @Of`06a`?c˰iq e۵i߿lA5뙖ۨߣ>9n>NgMTl]A?t Bcն}-8Bϟ!xKш~4&ԔЋJkwn<+Q#p*! grNnLGXp=/xYx`oKk%!"V~tS7YA܁tW`SUOl;8|mߨبqxM|PYĐWBͿ27R|721s̀V-c)_B*zTQk%),,幏YЎS[!0(HƼt,lCQQô؈;U&tѣL%O"?jY16|uI hH"4J*6.^ /}Ã}y}; Kz׌(42 A6c-"6rq!Q,J?E-6W" B*٣,Ɩ'yIhUb/{o$'|Q,kL.X_N@ɖ& Njvb5_J,,}p`IK ȯs,ri\NTva._(JwMDt*3OSOr D6M4+b,cM6pSg ċgupypsaĤ5 ǛCWdu$b0 I=5AJ}0{z}Mvs!QVlLW35>s_DAηd^юngv)ǝ!|n8൹~o8c16B1]p6vqK/c;%˪H3#η YpLR'I$@2 \R)،x5 '_ɲF:~bئBސaë@2 `a^B Q٫LX۾63;.u05j53!6O >ͼ>}gCum=}3eaŤh$vBҘ$"BanEDz4?%ǵlgm6H"fni=loa D .:.Я}UR?[cqv &.}/B`aZ}?ur*?܆ c݄Tḉ3$dB=S|^s7؍>+2췻 , vv`s‚d(븐b BBL׋F+54-%\ϱEїƬ0D~ʷȪmC_=vMb[5P(ȹr.I!obXCHe\y>T+?)n[f) 돸1IF!\+{ڗEe;ulyu ;xGګ .yCrm!}u;J,XsJ]{А6̒yw.vAoć g#eUtTzL H@- EBm(W%bԅGa#@/g*mg@B5*è`=^#MU9]z#qd2|@a KB4%<'iRMB8!8kNAG=qܻ&%+UybTb9pVro-^zUVjJTU1!*XF9ȰUfu[p3fꮽ| `D3~"-O`{~lbgR*JM%5, tIa43LݪKW~@ 75]exeq{VՖ\wlۭtF<+G +ūp rw1F(KBF mŸ0&a2!*I1t4 =y (F N9?g3^""[=Yqk[%>.HOjgϪZjSKjTOvFonھhaO"-F h!aDv{M@b ҜV(&i] mԋJ!DQ>le/HF7e˔_ %ym(֡ߒ6!MH1e}|+rBXɖEtp֖)&0$~jMa_3Zl0C*v{1UqzUy%.jx{K2qtx3TiJ^XvTO_%ѩ" ELD~nͩ5Ag)(`̇I8mۇOWGI_Ĕ![;f!kRˑ6[?Z ѿF[3a-rp8"Yiyux횭c@HxC>TNKy}e{+;Bxtd8@f6oTGeURI*5;t&<J/:'ۈ0k{TsALIL;-s(xwҦLd5K%&Y_P<&@<Ԡkz"@9)gNÒW2pa5k ,*s),[`'!49NT^+ FQpI5f8]!mA7IP!*!m^b{蜎7!A_rbfrnW5p1+b5o_,9ܡ4MҲYƢ &IIX䶫kek0W4!<4}8A8,AJa;8$ӿXBK(m s" \S[14;dS &sp[A łJ^բ bXO x9Db9;C唌}.A%cGB^ k1/~}X2R.7wd>MvxuՒdƍिHx{q {qka`ul\Fı#\Ѣ6렞rr2R$<.Ul*ex0Ķ Iψ 茐}$ ٟpe7LD:7p$m XDY; d1ρV87 kL*aԖ_V۝kl- 0YmP&A]KP@X^'IX ^]WE^Q ebcmx, Za-iZh ;(`c(gK*S'ڜțRu{5Dm sU}ƺdnD'BMy95xS;պa}bigїlde@ L7LAm5yϞVCx~~: \ k"مzjBdtϽjd:ǕҕncQVb\,_u&"Qmx1^-;O{ts_{c)#]<1Uɗ8RH/@LբLS9AOE^=?uZZocEX(ekOO aw5(V/$A:#v5sf-:DٞakIV3XMƑ_I%0uO;'SizGr =|ЊZgYx_^jr E7 ߭Ʃ$ ư3Z-HJ\F2'VufQ6i>6Pi xw/JojwAŦ'|N4~Wz)d-SObgYKP)yc3S)8.Z+)(隶ZXلA$ڥ-V$v(KsU|-(^֞vO}84W-P{}P4sĝIf9xJ%1x(e~H7$Lo4S:,ɝ䱺mZv7f3ź.VEn =g$VN#PpiF *$mkJ k е Ixl(N@K {lly0+7ߋ1SVlmS+gȓr8ԌKVoj-iצD C2PS떴OG#T#Wa$X<.nf9dB ELP †wFƿ !UՄ fy{YOA/{[4PBK-M ]%1 ܽfv/֩d u&{Bn3;,ֶp.6}ԗ=UK~uYH׼IfΪh9X0AO6Lo!Tnǧ16چA'C YPb F6rڱz!U"Sǚ;0yj&ƵﺀSg7N` }5Mgn^.3D^QyL! oN#6j֎ AV(A$Z)nZW֭SsD,a O7)NH 1E:v)ÔWdږ" Ҥ|#0Qu惚r*ѹԥ!IVĐ(0] T g4e F=?0 A@' " *M Y#-fA썥`ƙX1=Qqy칉Cl.ġl܊K@P.M MHyLfNszD']ulBȰ$6>LJ&̀J.eZrjUizS6nb;+ quĀz>sޱ8v Wۑ6wL"0ckѼ>;F(|zfBр'Tpz+_t-h%jFS8'0XJpixjZ~'=q006-3f#K@Y;j38Vē)0|PT*WS$;,@4k D!*A3L[+{c)wD9Z_{ޛ$: ĈmPOyDI-էjHWY`%KL*=R;>P.lOn$W5VL70u j|~@܆K&=8X6ːV6ҳ#S*0 O(W#~?Dh SzyAޏ+7[.[^g]2$v>0׌;r7o+'Y3*JoU&/9Y⛍(b:bOVGZ[Ogˠ'gR ʘfx@'*X4YU/\_Ho8U9dbn񫄪Z"ϰBbI-$#~,a@ɬ0]~S#D.j"́slO$e\`3y+(%Єn52wph52 iw!W^R#Lz<`+a;2`?bxQ S)q+v(C*,]ÃOq;O᡽a9L HaՋR`竺  KUb]\MO;4=&x%Bpk4MƼ$61:Ԙ%#qtEX/^ХRɊ9ndnm,z/]XSc&A*dHnؗ@?@ƫl{|Լ>/!orzӾ%OHX-]v:̸rC%-A@ey r' <K}#{ZxLPX}!$J Plcndg;a.;J[q߿F)gW\Y)]j| iRXːE]"D6NYNØ Zh2H3K J1 o6*Pz LϤ A{T6gS1W7?}p.`G6\gDt))L:O ,[p4\&PRjcuJ݇.0u^1lpIJJaL%Tf-i\, ,+>-~h; 61ID&ҹRj%둜sTI%i-IIe2NV(\V/zwCFJzR82{%681!kIcU%~:ytxquRjdIcXyPnotE}_Wx8T3xǜ9]1WT2y^3Ob\(r7r?s-yؤʹGG@0~`هB&kA{sTFr ),]YX38*Qw k*94:e/]n3lV!{% jټ22fMkP95)kqrN uo3y.-[7$I"xJgͱhy .*Qvh% \Q9r~+_33 %p?h4$s]q|8?U<-+&Ytg/ n2#$aIT2K+M%?os[S18ѩ1RrT}"iH 6yٻu~p3qP\SFdEBaUw!_&cVàAAsgr].!?N cqWŏgF(Z'Lz-K̇T' "-to-{ij&fa)]y8hvVvWiFD~5$12+sEZ3ٕ*2gIx]Yt})>7#DOg->ǒmizWfB4ƾ3Wt[]ؘ-"TUzU*`_ǔo,C`#D?(= 7\=u}t;Uz+1r< l% ps IV " piU܅a1~L[Bh2+ Тx#y~z&8][q:)lt~k_rPvu|9 d5uU[ i3P=oƳ+ũ@1R9e^l]o M\l$q36&GE{6UvozQ8WKK -W˲nqiK}!̯Gi4Q)Jt6,+oc#/iMPRǫ=%"1AO#q/܂ 5yܨJxa[KU!""f& ;~&&{T&=a_홷e_ gQHrPTi;Ez^1kGqD Dufu$qⴊY2&mr͍oY`8Szu΂3sn5J zL>{^Ӏoy "9SޛU=H~+]Qw!$FTOŖ9[qMS,L?HST& /$8t&$ݬa^oe͆VZlL:ي*6<[ xz*(o1j&u8О*xq!M{xƌiL`=kKOߔ=,5=IlNi^7m$#1lXD~M3talCx<(5S#C0x3{$tqs vrjKv쓁v~>M׮X>?%INuD|El$[J3{fL?e=\nj`\x4dH" k_ߩ"Ŀ~ _39qҗp__Wh5:qL͹g|튦&^U\ wt[CIxu K7han[B$^ybYVc "cM~g Jbi iw=7?ns5P-Z7t˲1k|c8|~ۨsYZV*H;bԛv+vb8P˜tmGRWƹ]C0͈,\: qۅR*isDςv&0՚*3حq\|5a]]\bX7mttj{P0.="}O)[}rK`,:fejW[:~݄j!+uh:+5'h*@ 0Bf\͍wf+erf77X2&Bba+>:P \* ({;m#| sǟN2e&FjVQߺ|"ND^N3"̻6{E5kL5/NP %g8;O%xu B 1 v?t<B5ޒ`yc^.M='n}r^V*mW{9V$/z[F?Rr!Ǒe>6Lj ʷh E52a$'E#oqΙQSFc8VSUPR0GDgBۛEݖ2wz㸨2ı O,% OV0@N&\M!;4*dn@|#Ӏ^7}$ f.bgD^E, `M>$v Uj*U uP~{|@f4y8Cٚ@i^ʦkB3 &__fz XBwT}D٥$r T^)f4:;lTϦE&8og1]F+V|:ǂ&rKo5?Дϔ!@#`q`PpeJg3ϔv!Fz|q T.|/puq3s?@ ՀTVHsM#)jUp8)#3g0XΝ`!UR"drjalf M?*YΑmoq@^RV m/ͬ dZ*"jn:ަnԳjjkf^t ':% -#-lJ=T)*NZJqᰜenY4kF1\cdx/Xݩ;}"] QXfh1TDžj8k gīg"EڕC aRsK7䵟j[b_0T 97>G5$~IRU LK̊xK'ULHaIw<f+|#hdHbCKCYb MK9PI¥D"';A՟&TFԺ ݐ`{j,6@E^!B).AB⥕ee5KkB;u{Z<(X``) \4$ިL\&B^t/O@6n#e @0 r$ ǏM^*[eMM ;2Z8>ӑ۞] d5Y+>:W@lT~E!{ {m紝4sO908-c._K*N(ILQo1얱Fb}VҨ)Kl_Βݻ/"C}%fȞg25(N^IA_ASv*' [T =q˩ޙn:GLH,I|8ޮ/ (Zd"J3t-ψP=[f^G"X%]rB1C6`EV=i0Ksn!VLJ 'X,{EK a@Rխ wL\H3\(K)]?Ҷi3WxQ4fl79p|} A} 酊݈Ԁmb_S;- \𩶼=SƾsN2HoJk+̏>6k`TC! 46lc%64G~w}o?`57QC۪mٌ*sjQ՞? f{Td{mxڨdkWkH MDn{,+p!,hKJB3ű0C&}WE0 :?Yr3'\Ij&UV3ѴrȊp * =E&ݺ<  nXE~{EY5t[JϿQK$c~7' 3E;AJ<ލk[<@Z@y?l3sEqEɝ( }t0D蔻.bO* Ɉ= B6E'U-'L+|L@n;%T9=4-ʫ{cƼv V#F_ZA~+!ӓV&R0=w+[ >dt{[ &FtxrVwJSRlr͎n[Zrdcó+ pV3#ef,bH*?=Cݣ~bpUmtZbؿ=2޶ WgGͶ%B&4aKUc6% ? dGq}3pyӈ$ L,X Gtmz%ODOH_{nV8C՘ uSKY({ēF~zR1 57 T2)uF.:[" /i%`d(X[l33zel,`+fUVr/'i<6{j<-cChl>4*c -.pz;so.onHiǗ8Ok/Zv\oT 3sao^djIAI+~aEtPzj.TϳF;A|Vܘ2g{Ơ5!<@s#$R(E P8[x E(īy\-aŠTV+鬫\Siheb68 \.9,zՌ1 O}`K®ͽWCH5cWC O;  l^~5 Gm?t0 83g$e0M>d,(x(tp]{ㅝځbil'^\a&C=_y TFOkωX+REù?͢W#Qe[1B O6|}pC1{U"+1]qy4HM-ٹ B3Qkv+q7|g¬OqY+'),c{X[.[ۊdFׁYtom@CpBvHr9,M݁!ƶ]y*|9W]bө笟=3*YA K\k oZ٭;Heʯ< ^>\`zFX :`uGUuy['?GdΆ~4Qh ZIx鴱ȩ(c{"4TZE|̄34)zhd=+۾\ۊl"`"gS^Uj#~K"h\ZV̈\xvx֟~Lרx #)Dn^< q&Ҷz&jDh~k.o3+7/\ì=~1%b7l=jel,B !~}bi Mp:8ʶMy1m]Hnsr.QZ5堔yqz3/%Œ`ȄJ=Ҭ01/|_ƾ*A02RsŜ9)iIz>_zZd_K)yr*ϩ*]:$ f70msSWO=C{z/:=Lrwͨ%WEca2{C0H>^6w6yg:SFљt3ƀDʍ- %xj2>_sGŎKdgbGY #v[UH$?lޟDxqxb@MDC6HFH b^i??]۠NeLn NO0 y4|ٜacI8׏B|-=wJ7uab7H_Wbj> 7VAɿŢchţ" SG֒4UGnV ~Gਢ?`#nZYge WJVt*dɟ0ߛ)X"oGr>&AߺCfG(+kA%!a9`[u|T_/\yN6 PO!o+j>/4I=L-voF /`]"5sl10XTeWo醗d24컨H<ٍjB&X~}v`-zKϙ9(!Y㥥ӹ'2>櫨1;< '_ؚu}eҤW 8o.ůֹ G#DVuQ0[~݁Ӵ!- vĥ/Nk]eINЍ8V]HCJ&GT߽`[}YI7xꏇ N mZY*O鋌G'w-`dg@ED}x/C\J洚`o<~<-a7(EcAZ3Ha=KQ;mʉk%/v!,{!!lʳ-e.&u~>!i=,Za;ѓ{! ŖPeoz;q@;4Q*aTÈ:U-:G 49w1p?Rs*}3/lVN[iFɒ=6g]e_(K*]5/rb] o sKs؅,0vr`2'ᆚ1!QtnO5Ԕ0(ٓWJP= kDu" m$h#֢_Wh%_‰S~MtEOZBWV>50hѴNDFɝ&Y9N/54+ާ\{nvݓֵu"A1%޺[Lr~A J;,n'?. ul<9Abqgc<"fR o5[ۗo_ Ay"y5Y) c^ƛJ KAܟse<-64,6yQ2ԎRM7(-3#t*OYD--Z{Bx&ϟPX =B4ڔŀ1OĪ 8=]]U~4t.DCw/4j0yY,ݞ-<eljFi}ߵl@s>`F yXĔ\g> a0H[@לz7? 8傅hIL!ku Nĺ%?7~K:jY I#/=OO+=‚yRiPwW)f.jk/:({(DS_]vP*y-`ud00O.?/0ӤW#zu;e7~%2^AGoRSѹ*uzgxU9#/9%DQ½#(UXR^T7s~]1llyξaËpeg-~9;?v};I'rba1ldygd)P4<[lD|*"^]V# \ j-)n7FnЇіi'j]_0延*!Iz\-Z<$ϫgaL4"+vތɽOBHHJ#Ɉ=v$j]Gs*J_ g\Vq hi_ܘEU\ KyEϐDge:y>ڃcG|8y! ԶvF$ݩqu,:9U4 }da'nmS@eݮN}>Y?8) 4 (p.4zȐ>4+F3>x>O.ku#4J|`S8z>}go標?Tms*Ē1bj|͖zgld*#HKbgAtcGYy=Y3Rmz*7p=k6@Ol_dže1&^B]G`N>6ͪ,NޤGw* jZ0/BگpC<.֯}~#*g|'^'-߬/mU xcVڴr>̡+Ba}A5"%x{uO'#Lk>E!:XVldo:%^K$g eWDgbI[[ .h=ej9^+9,SM9ZN@p6X^o-'_BH^؉϶hHnSzyTPwyzQ'H+ 29s(z:-c1ZP=MDRSV"WP;ztOC#^N) 7[5 H],NMC͵ĒfO9HZCYyn[Y+'`u~6MZ0:*EYRX^UPw1!^ 9QGШEB;bC7tKLn K7y¡ci Kݙuj8d/rW%]ĞW_Oz|R# `-~+R4 md C}õm UQ;Ze_΢WL]%r)xlk ["ӯ*1%ׂEXH7dVޤa /P$@VYʅKqc@A,MJKVa/k ر ~ؤbB?5Iy سssNFdfQnS˯(b6CX J)*q"z3.@kDڙpC׿T031 A\:x tV*-Ԯ B,7DH退ÄW[%%Жm4F9מq_B\'p@L&a.I{8;WN} aJ^Q/>Tc\X#?>i~Wo\'TvW}:f:'N}=EV1Q 9 ^tq][@QCgz2_}s`/iaAjr=Z,,-^6WjMax(.A]*Au}sE ۉ`0epL#y{oEL Z+htrAmt@L2HQZƊ0f"` 15Ƀo׽ p@Vd6JF,fiuyava@I ]k}--7fQU8vya\6'} R ve T2nG6΋ڿYg!J٣pAw5H4j#K1瞩@A:@MR6KIqLsb@وӮѵdk̞o6bp m.@ŸFɭGhXqB*n nj-d5POL7)WY"reEub`2c=?9m,ew2TYwͦ/ChH3! [l5)cAڭ"_"߼TkP U]e ^ᤐ"_qs0:mSX!S]Ahy9<5wm/ E;Q4w֚Ss˭!R Iq$ˇ3rәMSX#G=fمj&wl|\i Q(1[^8Ud;!m,ald`*uit]$FEطcG3vCf4%eʽiyp^c=85۴#o1/gt[rzjm^)-=o* OUf?{9H >ҭ5DOoc'tKYϾ <9a;#MeNU&m!ҜGM WSޮNA |O{$ɗ8O.JP n O!=Z2̏;,]ٵ:f]RXAl n\U^JpM捦?k ʤ #q;gB*KV.`("=zYz<A9(89Z+O{+ (1x=.O+q- l=yΆ5G&ZN;Z̽lyV <6S"웠0*2\el ێNtKKi] 'o$=U{PϹoU:5ܪ"}, _L]N]M]C}k/="ݺ!Z1{,)7O>jm%H6w֏ݟ4+4j1fps_Po!,6)Sl8+ںLTd>~#ry|h|;=SEt`$a=cq򭝅Lps۵yueJ?ٍ}Hxp"[J X C,08TK-N2H %vsg3KCHuT.tl O>옴w\MWK*1bN-3+Cן>2~#SØܴq'7y9xKPo-&R{Ϗt.1h{L%{xl:awꤙx[]ׯ>s3xS76xS3i_-%J2,H`K^T'Bz1Η<փX]ծYh\UFb *bqSDfTe^'4U.M8{‘>+"кp# hR Y>U?eѺ9t{%;T*S)EO,$'~9s:2S"z> Йlo?SΫc}DZs3< 4+!`^=ϋhh죶4'ͭRlF? NV'h&7HZ1V=,,=g@>,~?K5^yl?]kxċs5A2!2b@u)NӮ؛ho/x :f$ ^WbZH(1O7n>v7KqaGZn >0 CeȐ8ոO|e(QmJj8{L#;U{*[/t"e >R]IGh!%Pv h6\.Uk>[d H&qmJY2͏ ,[+t & IɽG^U=zML9~$skJ)%ɋ`fÞRu^)z慜msUkLX qWq&=WFI[ z{D61/F36S bK띴ܵCz!cr5brkdqXNn(NrFA{^ gU6K Vbյ`_ɾ#~hF? q\䠶z1Ѕɗv])&?a[GWmMjX:X߀aj'Cru}{[i9"v{ ӰV=PSuڨ[}Q] \vO:󘳩߇y^Ń& P΢{1-JHWX/QMh\R ч׫\6T'%Sd87teE gB)T(Ǘ_f>^Ju .WjX n̜+QWc`ZQUDwIufPscrq?j(5lB =C_8c$7@?@qFn! :. s CAJ]G [2q6>GhWuAq3^o;5}'grI'G@ed3Z-7&330$nN41 ;E4IBduuGeQnSaICl݆%,9G}}Q-+Urc } (NHUl}ĸpa%!(%_*VkTiUV^7oۙ x xj ?QU˽Ze2z?A8 a:[%AOv`8Լu]aj-§lY7{:0\N'6nOE!s`~k`Y*Wg_sap~gXJ_bqONohYVŌX[ wyҰ]퀀@$Wo2[fӀ1?XaDxRY]30A $@ҝVTF!s3jJA۶vH c8$K.ր;Ivu9q8`&++~[2͠7נ H\%!j(Ƀڠ`*1bjncidL490*܈<^'6IrKGFɿX.u=HA :~2ٙZSBo~)rp#&KŤ^@ބTC>fb ںBfzF )Iʜ ,tsu;mIˠmtO\p K~}2.@[4d炂ņ@nИ>U&v *Uue >Upq4n*)K $[W#_(*xm@yDbb[~N}W+]:v xnkEGԕP>& R0 $# 9(0 1=7:j*ɨT3ųn[I#.\g" (x3IgA2gR՛V>Q=&?$Wڇ^Xc/ F\A/-d~˳[<1'_ c@$Bo?*y6{`N69 !߶,V?ş)^(5< )z۩}M('Z@Vi yǨthLi5 'v_nz?h &D=L?W-tqOjMR!uqDixݍ5koR!H{AbJk0/S{.ܫ=$u[r8n󓽲HST<2ċ X0Z#՜Sɂ>n` h' *w}lΨzx/]Q ,%Op}BH|CPO5ϣLq($xa|Ӹ؀4`R'CkoUF"6s84;i~XɯnZnSkqGeBaqvêz0_k`> V\(.a,Nä┠8GWDܤ@9ޯO|exeĒ?smG;| m]aƣl_U2"ph3x`;v6&A?2۾#.dڄK/EgQEuX/^a[&_o_''9H8<^vR*v0r^SE[S"ݨ!q=SxC۰KoBp)dLΐ7aًκ x@Q%0Tʹ![,:/!j\E<[k *Q6痨lm}c!+q8;~PL?pBUM >lxH gzN<1g[tN)UBLLBJ(@rQQ{ d#H4]c[w]Kg 0 mN٦ cuvdؚ(.7D@OF?Bqq:p#y]+S/pQJ !8W' z;y%1Hxw# P?gE[FFH?v`l󷴻iS( *C$h]n~T+BTt7s:G7{K<K؈k^L΅ձDR:Qec`1d%Og8b '(qL\[|c@!QVteg[Vq0_Q>. Fbv'r*s2L-0Qde0Ri$DIqN{aUeRsELV2`:mLIݩ l~CB{ꔚ0k(Xoŋh2U5, pgsQ=J1tmU#<2SSrJ +--a\gy܋M84&+ve;. v[yz{(˗; a!AV[7Pj^KO?o L[+,SDN(oov`Wۚf<]rTP]ﴉ]#9x:_#!e(N뚄Y$X@! IS :ym;|<3V' wXZ&)Ub.Pn}՗\ @)*l7U ^xrHnaS"5dw@O :@qRBU ՏBoW7Ze cf*չS~R0'YܰڕEm&*NHKT٨Zb!liv!w;L![m+?pnd8)O:5ad+#Z2.\5 wp:S)< iiўrgL&p-^}U=0o9RZwxJdhޮ|EV(S^{Y"X.-/ˊr^lػٴt )^% x]:c8~:i˴.n fh7k Y TEW"v!׫6 :j}N320@cǫ}y_ov[.72& '[X4.DɝDˇ{ǹ_D^Q ,yc?M#n@E/-xp{/3q;jS [!(J m)N >umn#m|c% HL%?-Ռ(4N~;)]'mp%>İyL}3!IBJI.J%[ZwGx8S5FW ^05 uh#UH 7@|Bٞ.z 9J KPDFI-@I[НbV wvr_h݂ ^d_~'{e_G\}+Zmlm*CF˖M)ͱ\7MT_@of~&@ 5Rmp2*51~d{8K{1Lp^-$ۣ=9_Y &[j\lO&4\΋%rWƞܬ+ij`,ӽ `YyDl@W5Ʊ}mE9=Z=3Bd9ֱ -}xGF٩Q^gTT.X)fդ|K [ؤkO5ű+?e&i|#UIPž@68*TrDe>Pdk\ӌ D"/tG:&MJk$:%H z fGZ?Վw1ic|R)7~CF3&Gv16ɋRw@C}KI!1RT 5X`mSGԈ҈Նsj)GR$^U w2عOKJRcj USׁ}߯ m IVY(qxG"b! /m{*;z xykx%D"WܭdV\@0jns~+KTIs=I9x;PoQv;w# J&Әe+)q Ɖ>Y++{cy"y9G%̀K">K߫|.ns"L7؄ z,hZxet6:%b $53UzF<7Iښ|hI\NT”oLsVx',iaBN2v~%::KzgcX46ߢ|yd@[T v%T boLmA~#S FEb6}aUx-*<&x5: X<*M#rQ6 uosn}eq 35 ю o氂9ĺ  3&6;zG#.IݏMev8`xKBz@<z׽s+o}Z'\ix~5d9p9Ywȍɸew2LS4ƣiԈcHHŋKnsX;U=6ݫfL3nUݎ4hwǯގZzBBex,-`?gzLh[QXc&>ܾTV9lDG J0 MGOTȅ+_5Z\tH=Bx*_W2ڐH&ZͷV>8Da<&d& ޑ%sQ$r]GVñ Z\%`lj 鹐6n&$}&#O5d< Q2-F*O S{&1j4+U ]%H`y>F!y}%gR +\o EKF.s cdھ hlͅį6 Z}sO!^lnL3(Č*jdknξṱ둈- w6.Ur1~ 4AF%0ZLMz,a0:p/۰.%'-V}OX 9Spu㜲ץQK^!gFnʮ̋tl =Ǿv: Ѐc=$'nVuiq>-q{٥ut-5~ˆD<'ޖ;*8; t!hb_;iŧاs;Cʞ }[7S=~q">Yl}!s=)G eBf%u_Iwן.S_NI tRj-1gMwSfH#\~ȞhJ15 y]Wo?6j`U[|˰@*Sن: ykUp{LёZ YBa*Xmjzj1Y88]X2Qe7ъQ0ǘAS\ D7=7Xv ooȶ-d0&M/@-v{͙l+šwC\| ih %3g| Sk؎<\ "^AV{׾yt;$#f/g}&C$):01?Xܡl;}R-•aWЍ+"XFzǗLj_>g;Ʊ ىnȮkXWt7 @RZn8isQmH&VHhB#( gG-γ:K"! 6|C+`qH/B}I!lyfM*(/FEpEHA@i@ZvYlzF.l-pʁEk2*ak8z "gt !--&l,Yɇc,r@٤'ި!Ŏ]RqSi!wIr z3>n W3uMDQt^;/BO 쾡PZM쑲yoskekL[u.񎧽M8'(A핥ekDC=6Ej,WL6IUjw@˄P"`lձO) O jB^"*+x<(@2b*tڟ#[ũω^'&P+]hc)$SDJ+ r^ۜUbJ&ޢ:W8ꑯ ny9eOG Z$AY(=x3NPYed,O1c\@HrԵNܠWEWfI۷SFSJm577LfA pXzq}EZ>^P2yڟd(NteѤ̴4c+xJ- `8Vm9+A5KL]h7uaLfILX}j"X^Gj!ɋ#!rF̧O ՚+OA辏/yWAg*S*piGR-f[.ZʞajHFnːG5>7zG Dǣg֗ mck~LXޞx s6^Y:qf*ꀱBIW\ߥ3mMSRr |W.M߀Q胸f>2Hp ^I۾kzmz{>_\"}u%@Q;`B_)MѢu8hwiȠ5+LYF弫`eݿpԓ74; 1aWy}hpNi#}{Dm ,z^6r/eDW08_SGDY6ݩ9@Zspb̾/A|:).^VͶpx=-\kAP+<.~Ǚ _Djb^pĵ#7Q_/U^(Cz%%m u;BGn^n]?䲻ˏPM[5; Аf GRz?+0]oT&R&LZH'PI3qJWٌ)>)n, $c4 誧Tu-TuOȁ*eفKʐ5|4 Mqmo}^')/Bxm%H/YzbD^?.L'&z٧`{qJ#h=KńN"̓f-J}Fm#|7n&G&FՎnzE%uAk4Pd3 a__g;3&6q7&ʆyfbpf\,ziXf~oW2"w c,4U9FBdJ2B(Ξ: p#+$TЊq+Ol2TH\pFRbܹ!Oz&e^W2QUOُو7# XG{]CL6N5Noᰠ.e}S~=Ƈp5 0pA5Dؾ4;U7Å-=Jnށ_apfEgyrF<.m]UIy|ZCŅkhG/F!μHs].{ڑ'd0a-`Wߏ3 ~;zN^hS`)-QT"W2%$x gtm3^GpdL 5{>Pٵcɣ6M"v¿i ~V ;XPIrm00> f x`b .4\bv;_u3*!)ȟͧbG(hjJrR)XLk5h#덣pK6<,3rN'>zDCr|aC!wA<}t걪xoj=υ{wY2ց\;a-ʸM^d4{ ;d+ ;QY Jm#*7 aKQ)Q)RNޞbed]xc$#3e?0zN Սis\FgGom=:Zk]41 lYۋKJ،< iPCJ"C ȍr>|C݄|1zJI{sl_Y2_=遑2R]ŬNw#qwm6^ש?6rX|wI+`Y%l7TֲҶ bɣ`Hz8d M"|yR rP&p?.KofxߪA? o|,iUPZWvӄ" lb%pJV]>)o]M?Øv=ՆZz")vk4Y2.EY\rٜ傷Y ufQy )$4w$WdG̾ cWaͻ}PKIR /b%~#]tU,B;;BB#};~@mhUt4^1}NŰ: mJ|'!&Grw֧vZg22!%Ãinm]vɸJ蛋#iVV$Xbߴ=OT5JgZ>6k(N 2(ȇ2Dv8iAWl$lʡO)[d*PK8+uZ3egy9Eg\KLu ӨPP0g.T^di_ :͢t}%;l;Q֖<yj1FiЦ,VRnmwr?R5Bh'M9wrRᖰ /j[S㓐r=l2kЕ9my !/I {b8zO#7r[؊PtbUV5M@㊕nBV\l4wkX/fUBm]Xr9~ijS0cq`iھ8UUg^bs|Pi*i!@F3?SSi_Ve#b_T| 2NdJs̟tgQ 󻛡*9ڦS-zЩ{];H *¦C˓[š/i]TK]E8)oB-sxXd bi~83h}՜\\°$LK}HazO+\g5k&Q#dq3 j(ZHL@qD%t&Lϔc)6deP`!~ljx+$S ,DC46%?ڝ[]_Dl0="LȒL'Ee<ySyH'p G0߽n#7-P{}hknFv=%h_tw6k=XӟjFWnxvMk|)PkcieEz*0$y' #a*^:]/bjbcTy8| )-X?)z^Ts˗k%)f+a<sH6E_`u׹P"C}eƷc`']NpkxSnل)26k:`_f'HfkE:]O0?21޺v 2EIP8^^NMO% }&,!ˀH*8ܩ;C-'~!c 3I4o?l濆uѪ$!(F|1z4\S16AƐF}mGdDo1`}sY=w:8Kz'2Ba"Q#o7oal?`(Qg?| P Aw.:ɺ-e,A4?Ǖ!GݟcpB/DF=/SR _T;΄UIdئm`N${u#`;;M BOo~w^C#RȂq t)}~8k;]WתvӜC}5o۪rsjuvM1g0FC~ 7 `L\ 7.l'm9/gușXI! JEaCD~%sIp ''`;%Ae#Q|p(v!Ä*M,BX&'L u *S>6ORcԉF:s"Ъ-~Z12gaHLp=FAʒ0bnL$KھqqZC["aMax K$.;y95 5AN Z!_*0!ܐvX3X3`x6*]?C/o  ;Bs`?^SD=)3΁:1W!'k( bHiu`]f^a7YooyA+7˅s` fDLR@N1_.}2@rK_T}<2`!=TR/bNˣH*~F1>ĂbijؖJmBKaNvP5̪wٳmqGğ:dLrvG׍Lq}ā_SEVG.}!<&`D^6u{KƎ0rBeVI{K5u;7o3Fx(ZhZFNk'NFT=.I}7fQz("O0 {4 ˯)RT]ɔh%T{k,'UB]|*|4]- nςpA?sWĹI*Qy x3h p_?(pb<cLI+ϧv/)|5~/4O_qU\{ߪF`V]sTE*m3M>H| Ź~Dc8.HPir¹Q1R&~T8?RNX'8Klחoӧ3<(WC.-2,@#7kT$5~q-R@ćٌ<]`(K gY߰N!40v]Erx~"CRcHL}0{K5Br -O"B߭?P,[뜒\քڃ'QI]MJ>)>j;|iKFY [CGZXOɱF霌E*|h.kVAظsBV$~T8*N.{HHU4:lkW{?tW v@?Z/%[>u[PI&;[K=0_+:tYkHrd\U}p2UOj9QB/)''9JS⺁3TȏIBIwxq'XbW~kw1{M/;^wMI)~Fʖ3aY}]H/W6V׃pj/'>j%Ey\5RuRLԠOE ݮ$󧶽J3}@, .5 )#5 Mq%"tG'|3CM,\9n36gVΥ\ItJ1 Xds0U%If7.?՜K [+6G+;vh]r^m: [h+6gFL)cƗ H1`B}༭0iEb_S~q L` MC~uUrׯdbԟ|\bG\uГdz4ɩ)Q*'z'SeNN6R%)٫E+(` {hPScuUfdѰN`ˋ=%ŋYJ?@4 ρ.$XvYO%#S óB"(F* ֝1?.A$vW߄%y_Ppw=)2pr@W{"Gq~t)ou:l/"F-wuɇaEͿi_c["[CZ'WP4G5I)9(̖th`QLZnFZ1_z-ROש?٠`X>|\DqSk$W|)|r -܌`}ʪ ʻ9pXloW~a%U2ꟻ~`J78u?ʈ\#cN>| v-:YTH SV^~ysSV߽ɶ`.I%RJ[`}RDԏ=L<@*-SHrAZyɀ@+cdHQM5@9\l\n*=gTcRea=`{b~Fcb>(P G7CZktmx"w:ײ^7T!wž2hΎ1~~,(;rRWY y%BP*3eڲܨ{|̚ [P]{bF#1 ^u$!lf'8ai!ȼ^T+Iw9ɢOH5ݛB|spLw]X:b;BcNMӼQ*g$xV Fs o[ޟFϵͦ£=ʝݻ$)X2W2r?3WqlY&ݵIٞ^/FAϼj!ubI54[yDmճZ=ecU8/n~@ezgs3.ƪTȶ"͚ X%(Sꖈ3 =GSA]B%0E$;^Nם%ۄ 6D;V\.vvGB+HBk^e U>{k.8qC7s1(ZH^tYkQF/[bq$2^,f) K bM+2x-Jˏ6˴cޞ4uayH3(G=XdE<2#·3/<f<(|=d3yPdR:F(GHF@K¦WQzv_^#'4(_(;̀L2)ܽxoGgf,􀀀f'71T߸,]f*qy_s@fT -1ʆ2YY@oSN$Y >YehE&R`ofy*qLmOĥ*O#&A~ =$3K&gwbQW棫t֒Gd#AWoSA0{"qG'r7Gt/#-40S(8e,ִ!6c9`bkE>NJFÉKAg \Y=N_G`~K>d⠪6A -s?}jpXJNVOqjP{rQ=tjˏ<Wȓa+E|AKT/m)ީ9u!P LD U62柚@kF[}ICzmivCBkڑ?MT3xo6 zvR"9o;h!CBJ~T'G[ 29I!cRGwc)fThH'? ct:r.dzXҞ[YhZUZ1[gj_s 8tV mb0>Ԙ]ʐ`֘i6k/(qQ453ipςyhe|r^ { w,)3>殖@!<ɒ^='UwPvRŹ*n>.h ٞlDPJjw JK춄Dǫv>uVZ$tԯ>iP%c *tk.DԄjRsą iŤwo[%J[Zǹ2xZ-cs@$@]- ÌH"S}V훝M+l2¢ڂВ2I4O&#T 4qojK+'#*gXꟃPېty%̎AWrFhr \!26}MN^Cua7V+AcE/ Ƅ! ~sszr^zo_4qkdw8Z/G_>RƁ .iהM 2OTEG:1庍 t"C~AYr{sPvX&)ާbo!8EC}Zk#kWǒuXU+1V. \<i-=0z\1Dgiøh%f o;̗dnP 3p͚\L'[g$A`c%C.hڕ3lG@ѷGnE[ “TS\E<ם:C”0)K[1|H ԰l(BeÚR7DSLq΀ B3ZtBU{6mݕ>CuBcqSfP:]$1xqa` eOFz<}Ka"%ZW;?'4rB ^;MsO W LRȊW/"6Y҈FOL#vb77fPacdJ]Mg_k"&I4.) M#Z!Ҿ|+t!i3-7å.5J%A,nl4ppjӳWmB3HmlTL&/;|-Ֆe5ƏhasS5oMwpnOẄg2]_ \onY/G^q[!( ^uuDjt'6֚ߕ|W.$m%}e C5H7adX\ҍ[eq~diOA1(Wr,D6b.phkfe@=8y=lZvfwξhqumP~iTjdF0*^/֫u5xlބ;4P(VW&77 wH?KLRD 3aܭI^};`@<$.ػ V_/Oy-&G)1;SպPe5W( NO HN_Pf嗀b ,:$^]ьq]{9]3B)Qry[@1nxw ۓ[ףm2˦i$r9@kvvṕF.q~X}F뙶^-bX̓|B򏰬v {Evi#UtqV/%uZ$H|j{qYB{ͭҔh(n:qVG*ʎom)P: SXr.Ìws@O&+vgRψM>e1 a(>7Iunr/Ǫk^m<"&z%c? |F-fe_L[QXpNW#K13mlXMP*꾝bQy[T"x_@度hb5~4tEF)?ˋIwo Bz-7p"@]Y `h=J/ޑ7c:x *|`ˌbr5ZIMwHI”#g'C؀;-Dx0yR|7{a}8s^"s}{h\l"k+/K=%T։Կ$&`a1e kjEeb.F)J;32U=i# HĀށ@ ht(<ߟx6 Onța1Q::-HLL+Ck*/ (u|ڝ_H` /@}MflNE0|z/+>x|+g 73-wFhUީ8w?%;f'dǁ2B۷/dYa4|6H <L~RGK#[*,H ܆CWxC-!8=eM!8|z|%WBw@f'R$ۀtA{8!f v̘zQ k\! w:˕i*-HCgYy qVDmU#<"Ig2Nd6hҦxsohy)/)ղ Зr$oUpZYI22 ^>I7s~Q4\1"k7`¡sEjmg}!ę] }m6|]@(kI Ae,#N(Ǡ-%/L tnͫ9J5D&L[ܸ=yTUَ1^^!}]h6loy-RN(n JGy@a<%tx]G]St8Tg-7Z!]hH$`A(n0Z3ӏ"!"D`nI{CӒQ]d>[?Fa^DɈ%mv?]fo]T.Nk&ŗV2ijwk04GOC8_R٬w!|q48 _}&ke;ُȟ,;nP=cP?.ɒ;`yo)9o{FO R$a\ʋg/mLxQG8*LjՄ1Ihp+BUM 2^fzS%̟bD<#F@#A 1Eֳ@ XEV{n{i70>0+ceE_Ra5zv%1L̩)$ [b 1x涔NG8>[ ݉!? (\rn mu-Uw[ש8'ܝGg@W ; XEhtXf1H(qΕ05q7~)7bY( 6TѠ?`6k>V j 5yJ4}.,伥z\PCˣ6kHt-xua2 4Ejq/7ڙ\d%Jz5\+w]ı(2|'Ҵ|wnUe|@%W@cΜ#\2fq˕G_:Lw(`B%h~MRN-agND b-st$ +CQy@WΌ&L;3 X̤pm2aoVl~ab )&8>=?5yud'խ`sY ^oV@qP{ <: ;S`9R܈wr u_Ogk?KM0n'cw~-h:; sxn)F"WR&/GqK4fV'DA!GMMo(G(0H%9HؠZ%֧n/v͋_ᑐ\VSЏ8 1~{إhlONMV'pdUvٜ _{=y WV4x/[%/Lʳ7Dl Վ- VS6 n'69)jG F |6e:='P!fίFBG.[|EI 5pqAR>乸O8}tj{ގS(-KKH9c*MS^nޫ -Y;"vB!M78w/Kk`%jÅfJb#hItj# hu*B]WfnoD+̋RأXir 25cid84#/fS>T>O8ڨ'#U>hfsRfshrPkդQfD m[}L='N+">cSaCgrS4$p%!"Vz?NG9peL9x4rI#&&xcH𰘭'pB+Uv3ݟO|wsQ#},Gs48߁sv謊w^ٚXYEYs|8NRDU(/ZV#Lcc*0d{pw$qXLzx'{lYܽIrh@V iHAB52@"@UаS(vz@,ՀU<eÁRnE"Wڀ@_@7< 2 InUZqŁ@:h=z @.>ƆDV)" hxΡ\3ݺh\WY'J婔i:BC@#2< (g5jhgY5p T Xȗ!֕g?7lcC> C@1xRq c@&__E6#AjvmBlO=oaC+M'_Vc3^wr4U Na4u3JczPMd{*۝U4 )WL2r yOFXK;dy Q;JiX]@E\2Snz6^t,GN:zvKjrʵ$؀{ʵ+ 72gGQYc -EDlnCG%lOՄ[u%:[PoEp%_ܢ)@|E6i O RǼ xCB<:xgxF\I-nVOM0J7+m A K Y{[`5Pz'*w۱|'9#-rxZVdMjF /4 C;yv"4kʇ J_P0l9=.P\/[*˹ULC,<$Jd[]8٘} ĈT"uH*4lѷk~O}VNOy׃*zn+L2 E"يTek1 9my(Hw;e,$w7|3A؍;HUk 4#u\Ɏv(/թZ%fx B%=D\HV0Pvymn$8ͪLÈYaX5KHNg<}{g}:Wv']Ą̆:ئ# 1e,YBUŀj2ȧC|+~ aO/8NkKyl|wHpc2/.(]fbDWTx{4I?dmMhlU4sv@TNђ3G+u2=jH+쿏wc{2y`%7?J q. hk-\aNnhvRb0cF%{W 縢C~+v$pV)9e׶d5% I-a*/i/_ԔF!l4-~1|Jv)֬c).lUt=1{Q!sWUV[\WcmPtuR'J|Se-Ʃ,~k+@=CyL06JWAJz'ujJ|3kZ5mED*0#Λn{jٻ(Z]V1a5W w @ 7chUп?<U? [=3<[<X&_*YziPzA ^е Bn5~) CcWBK5EDmSÅ=?ˤ2ӧAMsWH c9Վ2f}7:PH!@Ajr< J _^34!\QtpkI<)Pw= YN]NDG%3?1u>XH%݃F@34+)mQAq1[>* ^&0D>a瘟fvbJD.A"zH IJL4J6&?sv4.Iue7ԅKh^c ()F><7m֊Fޕ(eI ݭ!euc݈"80cς%+dhl=yeG x|A Ҧ|&W)5 U'P|f1.9@]2cLły:ŗqG7Bz2e! z*2Jz\_2.T&쳮])gTEVN2E+ cLbG# ?pLj= =:n KF#_Y^0S'*]lnwgZNc7)Ōש$!qڮ`V8;L;2ֺu ʝ]vD;NGATY(i=X!M1|8D_ԟke08\+xG R{ \,hkt"݅ȡvȡ91,e+2=kCS{]xγ\d%^v|HuDk: ANv8XQPzic*zUz&HZTtD',Di<-r`uJK^\!1$gS\5&*`D+[VSmW@dd8];U^[@PmbOUxY|VL%:/f EWr)vt,q`xJˤi23=Bܦl<~L.P$SJK UwRUv (>W@9m)^f ДM<3C~;c5DLY(2 y' lǩHLHʢ.Cm/ʘZRe-ܸ&R2@R)4|I[' ZpF4`BfJ7Y\ ~F5=`0D?ֈ>}rb Pm!:3{V}Q ˆZ@ n܉_`%$!5(DK~Kt_.oI1ijT?'_ FW̟{h"*z!)ŤfA1E߉L#.~L2ZH7!ls_pejJ`roTinSzޅ_az x N5eYEPژ̓S Drc|n=n$4E%!'[@̋TLW_zQw-!"1] נیY`Т'!Bᒂk*5uÂJy#NQ;*׸&pMR,le_:m =^=DrIqhɶWDAǏԏ?-"lFXBxͱO$|aDm,Ie <78H@zǦýYWl,^mk38^!*qlEmmGؒkQK WA" |W#A"I3(˿>CBXb'@"2y4@}9ƌeVׂ_L}x1OBWQbN ??qYwNGuǟIHO"8I7ᢶkZ}bGLIXWmIn +`Dݑr`7+n?n4cNE?ECshŹ;O͛LpKPdӼi?`؞;ǧeQ8&oN|`Δ'j)Pjv?:zQ5V 1dPPմ;__) %Á:,?`zrCeW1Jb@/'foKz=Br:v'jt=t)ʯ$wZhF L7G黸>g+ Ți/*E#b_9Л •y:D p*prT7DZix~G4_ehm*v= KX,B|6 WtUXê\L\hԵ/H۟<lvÃ< 1lׂMAʀ쒪RQNQy3% Sz8fts Tkmukȷfp}ɇvvgFҽC\-y`Jr\BӫQѵIJJvIߘ* ;~T^k(Kng޸`r-:}x2kvzo6GPjs$9<8JPd~P~H?O 0 y9Ct]KzH:֭G ( Vɜorӛ΢tY?JC~;?#`%7FSP_9~ uƝ϶z˙pHD~ތ쏃Z`@/g+6 :%F<[_TƏ'/.Jn^` aVvV҈6dw[ pc&n4I3ގG|Œg`~ j~$ (%EgGZt;rQ(삡5t*fnD ʡs@h_|uްSLI՞+--H?>pĎ4 ^:&@ 훐O>:./TB5u05Jw.U^Aw?cX(+npV:  ۫ZK^`K ]*F2`O6#bW/b,,kR, d7'"ϖqG&PxН6&L#ddZi:I0V}- :E?tLOl f*\ޫ<7qӌY|je::nHX6>HXgckuWKxaP{ܕnPKrFSsݨ'>@SD},5xa {/5{8~`L߉KǏPF.a y:IyVf{4z/H FLpnJRp!OM2>d? 6354MlD81L"V;K2'u)ADh(rF .hF&gZ v&g\Y0kDcW7㰲p + Tm\3o~ 'e{J)$A% ݶGE(}Jg86ɠ@oYI1J%S58Tb⌻Wrh5'gS jH_u;ֲ߉v|)*5 wCl߂ 2fr5#XTma`>&\Ov1?2Y6 ±vNv]t0޹%77\A^v~f=so1eh_Hqr6=_5m=(+ Bp־Ή '.!׬TTIkB˵ϐOh޳ԲCGHaIMZ⠙NS̀MJܓv? %Xu8r㼟\!QQ {ɒ6QG Ydy6G]SU{d/5 ڿHb/()Ϧ{y7=& %>`S>0&rܾ۪U!i! ۘnKInҬgoPYq~ ׽LޜM?rȥ ;:XycH{-4rYJaM}P;j4̂8-:Ǡ!Aٰ{@e?= L(Y8)w 9 Q'EV&yW0 T7蟸v?Aqv(8R fzJIᐞ_5R{(yo7KlY[:/|?B]w`]we`)>'&B,Mc㈽JT+r߄z;u#dӂ4΁r8׹{ĉe_dNʤ W^PeD5<+ _D}!7}3C) pm۱-˟4Y;sSP#=zP{DvrkB֧4U{I <]6ȩIz5XJjL"?Ua/"~_Pߩf/c>w x6tFN-$yq~ 1q|B`p* [O'o\ )*O`A@Su}1!:썯^,k|dV#{ >Y,re vl?<?CÊy檆 ɺJ>+I>?![{W91{"apPQx:yXĄ[pRj5L=n p2#_Vpp2 D{lXaSmIr~]V0WյGS"2" A.>V'y$cw*kr7Z%^NɽZuӆ@]L}E"͘ao yWG_=ΰ)~/cԚ!jς=*D_I )_S=$] Fkަ-Ɍ߷geVlOquLԏ ;z:P֨t! *BCmv9sĤ钆W#Yg<bHphS([@} m0裹l4:BgՄSsh p|s 0櫷,~Ĩ*[ÛXDƣ}܅An'!vx.y]=D'*tH D\1aqA/+Ys&_ŪmVc 1xȰRJ椿 N])E-&M:Ii腡=6+ DrqvuGHhetM [͆5 gI:";]7uM硘GfЕ;Wf!1D-`COE:_?!9^g&N^ã4B88ߺXZףa1`Ĺv#KD/"Fމl9~ ޔWyק¿͛oӳŅ?-'yRk0-U$ i8dRo7_:hZ!* |q=z._._XeF>dkq0Q3}oǵZ`2<2U>w[8'[衾VJ~^E_'+&-ѥ"t/RAL u6GigE"rq7ɦ}I.{Nhb!cl7kq.wdsEu|&nGH#P+uΆpku8듅X]սcUV;H,RF,#Qm.m6C8DB daA+m R\g@&INlez o#7!]=$+hGa"`JTY}C6`Gy4:hzOIQӾSQp"K+Pp\+Qƺeu;-em)HӥHDu*9Lk(.`Å\c,o_܂M9pJlު;oa[R4^j.2|+071Nnk|h 5ß@rG-\vZQ%cTŘ`v7dun $Utό@_z.oLP#._< 4N95`: 3zA : .Sc/9XKŦnWkl݊Mzfk2V&0fwT,T=;ƦVU(< @8&A!Z)xc@ i;)F'[7m~.۪UV$sHp"6h|w3/'?^'/ a p[Q>i`DvC lzwڨ@β3?R3ͭ|TK;p`?X!AG1ߐ(\a ugAqUV=pL_yBs50U2RsjcB< M&:`sR)PI` nD#]ڂ.r0%Sj!"T/kV6y%sy+z1z2;p[tQÁ/,}hzpUZ=H^T[#]E)Kp{PQbz(_Y][|F]r.ZPyhǹԮ]aUwH4oP'm^w$S\?յ΍**LS*VeҏJ01[C^3$PEU =U;9!dg`"#noe "#V{% iu%veu{abڑqpL3YRᑂA:"Y~p]mZ,f J֑v3h*'T6 $!" o\K0 &-3 o+ZJgAv؄} Nti@f[֭t*ڥi6ij9Uf-`H@8;r1Zn gDزMFZ(FrN`gZjﻲ֢*^ۣQd P+dH)viiZX{v>ԝ:(/:woi?Yd 4B{ Cq+tھp2pURxk` WKE*4~m&WV[ukb"2wa?/?V6ء8??!/A0uq{i Td[Ml`E% )VēCa6*!Ɇ{Gի9̙t$HKeÚ%N_zU)-)c6A.qMdaB4iE1j߆PY4  UY٧9  JZr|1t&8741CX>PV!6*O0@N8#|:c *+]k7IG,0kq-iՀQR0ּ ѡ$K썋sk\)a1l퉖ΙZ3P Nioq2e.oP827w>z mȍu:rULqA;V  ⽥A2RJGjv⳯~}_z vjB%؇#-Z=3Ȑ/;%9' dVR&.AgPW M5R {ZUޯSme%MpP]Lt53;NR薰"-X[ 3ҿkE|ɯܢ\XH8Bz,*`Qȑ{/T%[D eN"<`f>0;L5|zmᢺn8"HSR|}WP>D/&Qj26]Z4sF/eĿ1=y`d8_gLx@ݞT_# jQP;O--QzSJ9CVӫd`FI@^'Cncu6?>jbS^mr~6I>mb=*ycA_ 9> 'Oˎt$Oԫ>$t#z1=Nն>(carVlctz8w"wEUO t5pvy]T;dh.nC!y#{`Q#c gYy@oLMhh\L[4W$qTTtvGܮ[@5WLM!Y 畏X{|H4Drܞ$ٙ%-s/c׏+Wnӫ ed` PtV* D cL i`&[W1}4oͶ=&kVUt/Z+fK/L(Yv[Z^Ot)ѱ썢Iҧ?4諮̼bjοPJ>AjaIuuD-]i~y5^<Pb *mi4@D-/e ^~{v=Ą._A=ćd{C#ܷ}uk& 3ԇMixx*xg6_ F)x0|g5?ErHJzTfޅ&[48KN~Ԁz r5x%2 G.HXebvxPESme( er=cL[px:/F{:JT,}M֯#륾!ڔfŗB2S0[w<ơw!GjDʂ1X4U1[\= vb^P=יﯽ#vɮts/8Ju<1W RHb*al.nڜ^bP%1ɚ9ޅgr:.(:lW.FJtV2+.2-X0¯Qݸ%Tr'~KB %1 Hw_]&*]|ɢ2<.0cڪ$V* ]<Hۛ?Z+!F*vQÅ@W7R׿Ŀ34>u_l8Wרּ =9؆eZ u ]^]WzCsԀ}:U#:lgio EF!`-M7IT/<ֻ 3j\JoBv.`x%}&oq Gk< lpjmG@~~!]zpL|JP$Tvus +V bl\tY!5 H5}L䖓wXÜ;NSt `:$DBoU{0mJ>ش|˩p֗V|+ er3 *,/;f|//]fn_$Ahg}R=i8\H/BИy\̺a&1|;L g?h$3mKïb3qN@㊟୧(<}#PV_DE:Rboe2D`I7MR"Ŷz=zvZ}tB,حUlq[/57GX,nEe3Q;G4zʸtR c{7@$Mo;3 jPWfGR22eCN8Qo?6PE;8t (t[ M1Ե(IA"D 22Us1!e,JJv/G}Co9V ߢPVBӓN@dPRPֹA9fB4!Y2\Y ֮V$ }+xo;Ċ%0Vw1y\@iږ$rAIK3 krYԙLq_JrrG𮘺 ]}k؊c=ME s謷B"to4_SG#uK9޸GLyq.SAFdBevRFψȉ;7Xr狃|}qs/AißL>Z@$BZ~pny:pƩAL]I[bLPegj=Q窝1TFV`]$Y-HarKx.'e}Dژ%!`ߓgё2˟o+=%?/Fn+#L |ʧ,d0$N>/0 =v$KOȨǿb1wq''& e[|<ҵ7-o15 kjnTQ]AB%k f dΧ%:P# n"([`N X,':C" { r:mк~m ^]Se¬<ȴT1p9 !oig`6ПjIbss\f77-).W]3>Rcx# R@/SUz٘[XZM6KKXr-vNjqɖ[l.z&dSuD \ - DN=ۦ+` CLa&QMjo`Ky (rI@CZ XxtD yS}K "h3*1400 )£re3a.QdkJ:'&-@& >aP%tDŔE_t(~m A$ϥ""T d/5y4yE>esT}PTR 724<3&HsVu/m@C ֪ (-0 Ty*hq rgk$w_퓏xWb<7hSÍZI+Rf=Z^3aȨ{[⺏vtlzg_Yy ⍡l2aF{|pa#P S%++Z'k0Ik+JPcO}$~lX6 ':z7Kv$OW DCD+3^Ta!Ræ>&Yt*q۪;*Z^Yu A^G&lYpTI~䯫7 lC_2ҡr0[Y07Th(,/(+A op=9<veآ8r^f&?_/\>6'?SEW:#N2px vMQo*F uH;*/3Ǝ|1xSr<hZj" 9H@&_lvQ?n"K-Ai ; ˧o3x_o:4w~Kjoy-޸{kָG-.њ1jߞy;d18JiCDkwڸ'sN bZ'"a_kXqo׏|X@"ճrO\pk5X9`z[= B-fKtV1M8Sa@#?` I/e 1-Lh^"^G;:MZYjr6_hX/el"#n"G#@q +BFDHǎ虶>k[>#7fuNhWmbWW::'߁S.-o2p% (djǐƭ5Z,)()$?$=vG1iH? G}&S8B@cEi}.2r@Dwɏ"F+Rc[\=ҮX^x1EkW|ȍYFzbms `XA{LZc{i06ce(%:Mi*'aQ6CC^y(]ccB2I yEfcpU(ՍAxlAN3=2aǕ4_kq~ .k|R^ RIsDt^&ɐZ@{oWJr#Ȑ5!1g)噙"6~r]vZ$B?71r7TC~-]Fؽ? b*P1DùQiP(_Mb[/{ K[ckM&'kwMElÂWGՐ&y b%V ` }8RXxڏF:6%1*c7~vfqkÕJGeMτ\cA?xJZHbobSU*?݄\noD|ez 8mu4r1 $@ʁ YD 2?vܻWm.KKiΔH[L(39mgcP\Adp*QIuGf4<3r, +b1C+Zuyyg!ن t -ඪ1#o}hCX6Q 4~N'Ɉ N 3=/̲{}fH6Qe"=}D =N1zÿ]cZt.u'&q;T+ON emCrݭҥ:-UŰP !TŵIWI.@n[Oޅ7uؕ_7ApPEn p:>rR-:n*|Q#fzʟ?\T얻MR1k237(~K2S8P:U[" AÈXɌt?)uXQH$E;޳R:anRP=2isX. A4<48mĭ-cwE7j g\NG#S=3c~U 8FX-&&qA,z''C$h b*z~ZCQx%t7yuA}řrɟeȫ},̗tIcI@kPNς$7[6ZW=TrG,n+LT;Y~q/`ct9HS9JeE^qkϼFb_:]; 1I.ߒ%3q_1Dz}F[oeÑtl^o#wj\bq 4&_ᑀ8 -'Qg·,jw Ss|AQyjs) X!%.3޾l@4k rJBDM}L*;/W tb^k8>H-\ ,7켑>&l+29r. P¹)ZmaRᆴ7]@ -,Imfea[qKcM@O hVlVҕ73e:'zE/T vU= @6~ ed\CK @eVa5=hsࣗy㤑:aVF>wK,1's)"uEuei; ;۲HMv}WiO:^z7dS.Xx̠~(w~U w]:ľ<4MRɴ-⑺4|w)F嬞|.)0v GB x׷)ϻb޷v%9Zd6 瘮o2 2*`8tهPe7<o49C5K4M,s!!8 _ ˻x\FY@wfe߹&jY.dܯ|[ќK-Xګ|n~󪳍p s@ې ަ1-AG 'əIP-$1U.~:g>?+KO-mֹy((5[f$2=?p> *}]}:ʐK9HaZge7#qCVB^mTww␅ lt _-0[,epNʔDoͦ,F|nAbPG8"9C\n=(ur2tI|٩adSx8ij} .^SjS͠W>@I*EI ;gSۈE؀Jhkp3nIҖwLGf5-`Jui~}&Ɯ% uE+x1ikSa]Py4'e<2wFL--fxłpT=>@hȣE{o" a:jա$T]p(VN =jɪzͣ$+q^s v #9l8LʯPS%$Q@ =dv󍈁Ձ^!wH[;QmXE-nCG1Ɨs"KC#GCR=e"BO8~iOUwBMLE^'~aͨS/}Ҹ,m?iYDm?8 \X}鶦P_ӈ֬uq& Nbdh| >S Vg5V91iǟ.j>Vf:Xfն=kKQZ0J`|yn1njR;HR"{^]){Oebؘ^ jk8,t OB`@ϿRb`b1 kٕD$.ɛp>=8\n#/R8O6!R DɘoӫO4[1Q?2N|Iz6%݌NJ.ڶǀW*ZXL'o3~Mz$-(cA|-$>;%@*/PB|A-fwd+}"0~rx7ڤWQZT'7yG01b'CxP_Z5(*^*ZΥ F0`kI.Sְ暈!8ty I^*Veo"3q g|YTz~.2$L_СEkEfanbfIc$v.hHzK13+Ϲ/V %xn.[˭}j{<~#]:h[z-=c /$Z0pd:(Jmw|Z-=a^cp+HE HClNТtR һ3yVͳ'?4[PdӼTvEc7e\~v=QH#Jbgǎf;N7;r P.c<e,@,c/W'–D\^ <Ǯ U4o aD3)kܐ;geS#ֽ07Ʉ/.,OI):Eo =j% )^+=5,\f_]]3̳OJq2G zQSU0WٶQx((`D"BUKzkiAϛ g77d-vRi3 ~-VO^rJ RD&:$z^-l7x< y5Ky(IU_w/g**4x`]2"LI:C)B;[wMA=SУ,;@e ߧUfuRֱw?Sd ìHB(Izv`W3]@{ uczoeI$-ldmiɮ̦$)<8C.;r|)}uȆJ_}vQk* -DGxAqMpJ [5p#qk8w.y`]z:g&h>/y3Ml@[e hFGb$#xi_Ȼ>l@%5BIp,v3?7Bd<<~D,b`oum_'9TF3v!#.RSw7q{S0@%he,4B5X"Tm9kza+gkJcRU{*1KI( C`DCPA^3svx2D?ɥr zS0.&CBS?F$F`` }n]M;D%ϻe,Ma}0N%^w) Ư lqcJe _ a! ]wQ8Q!6ib!悾&_/ @^iZqĬfq=t<7 (Pz[*tGDֶS6xMW3 l9cզ__As;dj%!?e*:v0sÔ]44Iuj~RӋx>/iڙ4g4YMUXUFAs8d́Yގ>^J?}BźNHYRh( m+ZGz؏J-zJMb;>ؓ<޳^ X 4%LY3/zyQB#?3auB{;QI5U?cۆl NzhtpwoAXܡҳAm?UrTdZ42Sp`xL |^JQc PI?ICIڀ@竵 Wg"*]K{\9\6ޣXTH'o&OEJL &<2ղ;Fo1! q U.fbJC꛰-G4R*BEp[]GE3Ǒ4;K=w]E8nX+A`bGדs _Pij5DG[hQ]?>,:HȔK$3Ý-uhlL_Q#O3ys l_yѡx- pD-ab~g _֩T^Dq\C=|BwQ V܈ҷ9I"e,;gk jH2~Xs4?̄>@Sw5G?,lQ P+9H9 ,tv c8m׋ٳi$lX>!r:mg!% 18s% 165[; w=̫4`R!&Ky3]p-[xXSB.~SSS'8jlI F+ } Dq\ٽR"cx>\Owy ̨wEincVIo j3DbLόII=~tkm;n&_x ٙzn!wu81YyU3WIFl3 ^*PVCAidWxAgUtp t'UqMnZv&3E_ՠ>Y;U"S"F M,ddXZVS>ňDw{(L@嫖Uu]t'?Q4Q XK.IklsE^`H^eyt+xNo.;YD'A'bj1hX$DL}Xh34'HMv*52W8!9DTa>Ztuh"@qVxcpsdp|/3ie![|܆^XQbF{㭌ó%{]=dX1DqwLn{,7cm[gs.@ţ<(cB9ة B]lAYUt V&W¼pR #UFf P-9XRgǏŜ$v5>o\E=㩆=YMu| .n*Ɔ Ʊ[e "E9 gdfTMUu5ְz/q{(a=Jf힁8\(Wɝ^wJaRo3S"?38ihͻe¾xKcR'& uTʰ` ^Z2!5[ $Y)RFfvNц6;`g\a )D,W#t:^#/=ϱϣu.(yiQՁ+'w4S<8o_Ώ Pȋ3K0agjm>#z?kHzw]d>Q/Vwxԛ'&I[r>4\x E@FHi`:6޶pqGއ\R-'Ӓ=Hq^&LwkJhBz-:U.T=; 1|k b%pt'YaSc-;+OޗM ,bf ;45OA}89c<3g!\vvsuq;oFѿqs)Lw/:]\sҝu K^T2QAM)}*NSK/1RSSCEن+e?Jdل.u6 .~&t2v|tbz ŭhpOyS?yHl -WTl0X6~Gf* vm`V2+pi -M`,5ioKHV\`v!;ŕ! }l+N҅,7,ؚ8o8wtCd m,ŗbHгvށ)&200n@$W@ $ֲ#Htt^nQT\lO*,&oq$PDX7Kyɔly#Eʱ?=6 lJp:+pk@u 8j x)E,UKyQc#]83)pApZmzPq+ҟV:doD6q!TK6X)l` xL+ƨ45A9`cI.)7qrw+@t7$)eN [y3 ԥpV7}eH~] s<U} V,n b~ Y#ňKU|Vp~C?62 rZѓYt"{BdԀɝ*@+ eS'I‰%@Jjŝ?gByc0 KކUeˬk{ (4Ή]KQlԥyоEs~D>Aրi.h*@I~DM7z8ğrqeԾX˴\gX:|@q]0k T`cdaqE'}r ݿ6.+Fnz]X7oIETPPM&IB@X1NTHv3NHM0*)m)'*~"./,Lf 國⊇w/Ξ#Bt&)-|@=\օp[DsØ ^' e'p 7 *ĭw<]٨vV0ex YPQRn|Vy_0򒏠, iV̉ { D rkQ=8eR4'zHX h%_-*Y4 Z uk d/8)$i5px|Ԋw@ũ"?Ga`xf5^&z1Rۯfq^6Kї|F੔8:Db&e:h GJ:k;Է2,S tKTz-*;,8N͡* Coy&#\pk7IYXއ1>!o#=|Sw~cF _!b̀l' su9}2i:Cu[f~5pW3 +h3TqzdUVgʇImQFAje?[5JZ2N+=k AFT1/ KV NR;3e *OHܹS0F!UY-,WhYݯ bۡLQ#EfED\XQK1>}4LҞ9˒5'*‰#|Iâ78b(ӏ =P5WcLL'PfŋډΛT1gԥGȱFuC7vU֐Fݫh0  IJh\"f÷ Â'U> =}$|QituՏh+}T;Wz|IsjCñ>͝i7B \%š!,<ԋSӇc@#>L3xg8"<}`V8qV?HZŏLR0hˋȿܰ8fѭ2U<;)P%`879&L J~~ sIDO+@CSWS@;-O*MD48haH/Bn1L- 'y5Vp0= kd{ =\CyÀGr:] um;cniܒQ{2 ).#H+EO2ǣOaO&":EzBnͻS|[uy ޝ=qh-\Hފ/v(.6-6zA3qv3ObY ݱO!`rg<TH-z\?F*œcj!dqh$KSF{%#Rtn\u( "i4+9G0?F*)Ҽocu%[ob S%q;ƒL̚򿸽,ƉPv 1g:^4}spQscVQ=BtO"{9~ڹM/M).n/~V.qpo4e)|Qig┿g q-ۤ*_ sFs9$`xQ͒a%DJ{Az){^\H/TwMI:E}̇ Eߒ9l( pP>'`Nf-C>c -8-֯ 7RF3)bn9ܾPV\}-vf5<š )qߴ}.@8(,;L 3b^-HPRئԸ?龎3JE큏@NΜ:29&y;*& Gsr\X`)%r`.pfkyyOrC;Yc`ا5(FkcieuKa4YAw|!`Czb}ޙm)]ծ]RH毦du_ѼQnB[F e[/ޤ+J0]5G\mU|2eQ%5=A0[J9 ;)"a~RĶb ȱC'L~L1Aqڰ'u]-VL ;u"H CroO p쌭C ԭl)ub`κJu^E;:Ig얙S셀491U+*f0BvZ {rYCAT=ÿzͿ(.[zO8\iFQb(R .vs8`cr D9j[pmu-%:CGl|UG`/ _pƅṱAL!i.AV*Uxzz:wd,5a:zX6w1vSro" Hugi,qgn*stn"* >%+~NApuOy!;ݴ.;-yJЃTt~5zT'R'kʀbhFpp݊.<[ / fbq]d^UvY(Gj]?~ߋK6VPd[)r8,'cy'(uQ_ G?gLpDK#~薐Io9C)QO.̳8G4P0Y*X(T/> KBX@\ڼ!exe/ X1%;p Zrha֜Tj ;I@ɥ;9K{ZT~A&>h4NF39] mGP+0Ѥn$.}?-CSXR䣣(4!DW?췷Z՛EOĒ@6N w1;.1ISrpؔv"y:íPKjvV4pQ)@J8iyHڈU@쪀X* 9^,;aNC&oИ^r}U@r(,1  ^)h0miB:&4`j:bNlRZ4ڔ'v"<\+l`ʼn~&e|ֹF'ǡ{.CO=ԵeTG(r #vy;_#G^lF"'I2|\ Vܳ9jAlPbuբ *V DVG Ǹ4c`ym%a],n2'Jڡ% .{U,< =eM%˧ɒ  -0~g{m3:8S@%“)]ӿA2$ҏqk(W1Oy!w&Jb%s 1z j|WXNz*+$?>D0A3a#C~vVk>+-2NhX=Ė yDRIi==)ޟ\S= HہMjQid_2<.?8[z>~ Z堸Kd" w 0.d1m/uOPìlRѲ93" (D}InyRN 6xsaŌqHh0oO$p8Ώ΍C ˅g+bagg0Eijeމm+H6/BK l%moGT]Nd{\­]C`uS}BuA+m,wk&s㔏.}N3J '<{t^#h`ӼKKQ-mc+#2C@J]a0â7ZjW*G[C$R ~Z7q!g mܦ&l!9~~ueWC+C,{u$X28)"7Ǎ> /d:"HhYH?/6O xwȝ8J#`5Jed( 8u[yo2t 5S1<װG"(~-OG4L {g*=Ys%Ue.`cy`NvX=ΎLLfp-Z$ Xd7$ ߇U$>{j3r'/~(R5,Іd`(Dʹƒ'&,ck⇈qu&U8$5nKc/w3џX~뷚Q>&GMqD,Jciv-;dc =|ۀWDO ϱ7Z@z{*(>H^ׄnֽU a5ŎzW/5ө1! (xnȷ,刴r15f;~ ayk?N/Ŋ.Ԝ [+1@"ë#wLN+ݓYܾ@NʧBvgZoN5e3H tꁍnګFrcVi?mu`zfW/e p7hIOG,㠳|7'-p!?o`p0Vֿ@Q4JʂV<%F8:Auk~MaQq@3^u2R'䂋_䷖艕5^c Hƅ0X\˾k}vEBv)9s 颸d%N~j]qZsYrGGcB-v骶oP>"K#`PDE.v-WE_{"F lӭxkn1w=,]4`w`ub6Oǭ[w܅nsv`;$+N( {vAnPkJSt@7^gYP-AK籷ѿR\AbCsK6f![t1'ȝe5w |$0b9c vaßFHxͽ(RV &U+1^T{[U(a< ^] A]6Ia|c=@c"Z |8/s1"poMM1&uD_?]s"~ t7!8AꋛA͒VEsX;da0l- 2D叨)QAx dJ{d۩{7 H!KL6cbg\|YTs7lP хY0|}^ W'9w ^ }f'{@2.tF'A?*5\N -M 3@sOIRG kmY^kgAՃ,`@ ]tΖ>݃q"3IcÚ^Yv08RŢM +G*HJȴn\z'ZA/xoLt=٧ ,E,D+An(2#ҟ(q'Ϻvb]di|,LSF_e8x銝vH)])ˆf@ @Mg\<"T%<neFjXW4NCkfEэ[4^fJEAIDbwJRr=]r`#m%M!N `oPD.՜05~tNDXD"x0GgvB=Μ0ecρ66d呖JQe5ٽA*P-;Qi湉%F~7$eN'|f$ C0)4 &b AgǮazVȁW0* *Tat jL?(wc='[ETI寗u(5@F.mкQTt\bɵÜy >"53N>:尺&jL~B{`~"L,.}\7b6_=帍IC܃ >hh`b*I?^eƝr{mǷ =0tȊP 1Mj)w5WF5ӵ7XCTVKTu|#?UMt&̦߲U@`]|KFqslDoCvOi9bxiac!8ݾ>hh#HԆޟ$G]2軵Nmr[D#pA' = "H0(OnO> 2Q#; sߨkʌ(>Çݙ֓C]]= -1ZK8aMQ'Y;yZ{` XJU]I{@sm诮`+Ѳ:7jE)b 3z8ڵ]Ҫd:bh9 Jk]; B)5ذ:7H;` V4ehpbGJDQB1#.|ҥ),D ĚBSHVel+0Di5KRݓI$(Sv˧G+,^,ca 9u1.r@]،qta0V <(56/Vv/~9Ȍ@,AW!a6;B+( aO )vg:(~!d@'2γo:PL}"+ ?u3~2o0,JSlb ق!;Ôjq\ ]>RԋC.?ag7b˼ȕlZU_f7f:/-^|#β,5Bu!GH0}ߞ}4)lN{G_Zi+b$# MV$<~T, =^l~D_u3T`SL'EBu)HVY4\~RW%Lq ?#:hq"C6$jEUk뭪3GҎYL2M'F&$cҝ[uV]aF53XXA .o nҸ"d࢕=qmyyxMZ3~w@9Iuu#O.UZi=>Zͬe"k34+fjىj7  ĭ=vלOU#(#[vZȯmVkgqV?7KAߌy>QL\-VpK288y5˭ 3f Ϟ$-nА%ǘK+,$o#d38v4qҥ  2]D*- -F(a ͳKf4h"BDk9P5ʀ`R湼qD`cg<{/k,j;7) ;BeD8kSN9S+6Kݻ'[jc#cS&Wgj ?rKJn)V9YB0x~Pr;OX &w(&ʨT6bұ9`aZ,B$iFY0%wT A(-a 1HռXlu.I:{:JE㯮(S<7LQkhg A.8ӛ IEG~2[3M)m®2qeF q.^\ 1lOU%؁n򈑝kyC쥮`\*+- 7^%UԿ7օFWeLJPzH!IK| VHQ ؙ0N^cB%IĕŎu%^Y.KqH{OUvmhgS,7Nx֣Uy+O^Cp2lSCVz^tm,l3 b:<4 Cx':sf&S1[@n}`1KȌmE v1qiP"~1P.InמEz-A§p7~1\kӤ7K$ Ed߽#GI$ej47κynAN~Fk|O:e~itDk66c,g}tG-Җ؅9sV~L 4vآIa!=>|K7 REΚ^S3AM@ k8ς)C twX|u4$3iq8ӂ6j o]}F`n9FFgD&]#3b"֞Z-_^xt]sP_s#[p{!P'\JݫFQ ta&j+q*?&;E[K76 O-@rA5Q/:.HG g\Pp8ŵ3kD6H۶r{33d»jYtou;$'3@)TTY>`B u"B<ͧ\ձ#X|;(3W\"cǿ#'r<*bA3icQnĈќ:@􇯰ȳ3,q66oIk8=' x[u;h"pTD hgID"i;cTO"=۞*%&ujݯ=6 X Jqc xy0 3v{s ;xB[=ߣ|\SΖ}-=#u!cdr#BP/ {TmY+q1N6%ˎ˜oVsra9䙛C;kP޽,v0 rh9Vȵ zՄzc~|f駉Kf?p C _)٬ π Gvtd!d#NV<|VGY0 k_剮 fBx߰$;ܒdҝ`)4@g84/ؙ~Mw!ltS*\oHVDzeKZɚqT Kۦc y}[%Wժ*?@0S欘9s'7{X72HOoVAq` ſ]N 풫>rj:; ͑3?0K#ށ3KI.br[ [Y}\ ]4~{f*l^@ GK*(Ŵ]H:vM>M,^c5 ɓ&.MtRANrRح&e)`pՂ,X&ذ- *^Iq/T"5[y7 ܽH8Ԉ!?xs[WП_*zLͷ! Dk0*1%< UZじ 2bqޏT@Nn>؆l4V7 4A8ɚ,i~=?덉`96d? >\{臙2|%OƎ!E(bP#(ߜo'F'E#)e#QsOhD6"#ϋ? =CϠb3y0;<"5aN <Ѣ=\8\v{KaVHˆ~~jϋ 4ub1B<凧>^a(Ho ݈ŌR-A٣:R<)neJIɔ^>Z)K$p#3|"3sI4qb$3Tϗ޷I 1tVnTt+)Ԗz_w$^Ӌբ0Z ^Ll!s!C /f0>(@SvDgCQ#`[6GU|8 k..Q_b꺋22VxDlFݧa9 @.ZER,.| sVg BXQdfv}p:Z+f<}H.(5vx>EM-Tڭ+%g[]mRv0G `+ėypB(wS2G'=qd:wǕ]''(uJ~C.{9~pH񎀀]3ST 5ޖ`E!w{f)u%cg *1"^Պڼt 5fFZ'eqYoՙdd*dx,pT6Лkc!Ql$ˬ iha4K5xި%e/ox dN؏*Sfn۾N_UX#v6Ƨ-`q@)[e*J&Ւ#LdB[R:))ۑs"HqH,B\ ]A t:;:}M ~ZMe ws%kMmguvEF_o\c}'e`eACҀ4&Odaj<&7')hC&S(bx lL7كYz2]njZ:1lqP7}m AY9<Ëgh#8jϪ v_Wjt aR]* xE/Ywnn ix2֔@8a}C6Jwu0_BO~oR/NNnx.?dJ[fpba!fY#e@@q{%˾e32H񸵀n)d$yBݿΏrHǗ)ިRD3@[!x^/?o.i7" KṔ|SaUg]KkIn`+Ai"<7WOrQ]_3L9 L:Huk߻唭@_(ODD$k D/ {{G,Ub2yBK-O3XO{,!;!`vM8a}?1Dk3)wKz-!?}tx )V! ՝V++x뇷 ~% ]~VP3]8.y5drI)_ mlpZlew5~D o´9^KP$ Ã$oQtG Rv\goUQxcbR67rS 綁a+BĉLl,|'!ڼ1zNh :*ȲIq'M_ O6nrx$پĶ^N{A]` f<  ^l\.@˿' }1(V$Zmވqo`a;H ;&e K04|cÊ|r E?榗4ά!Fr L.4$-]wm a Us>"y#Y^Z 'O5awP284]&8D1KJ8YѴrkHjsAԀpq* ٭( `HaBΎ=O)8+_&nv(Y_w8Л3~:KD_g-+d v:&#|ȯ05%  p<~hfA;7t#|gmS˱Mۢvx ԌgOG3q9C zW 4SjK֎R(5Œ .u]U C.`xgq=HN3T}IkJlG^ ԅ]/>@a:Y2HN CPp~ߺÙYjXk.F s}Lu^s> '@y~3y2~V:mlm Wܙ?͗`/z?r(-xY:*w|;Y|MpQJ??6inS }z#Qv߲DtYd|_g_I?jn&PCC#HzxCPHH[hKv Wl6Xej3ZoTZ@^ߌul+i `|rGtsW>T/YpO*}WUpI!FV}IYFf&"ԩdL,]>5s+["h1.k(-gD;{6&nWHUсM܃"b{|py {QڮKO Ϝ -EeE *bTΞ.k)}ȬDg. eЯ.p*]A-; L /F(A.n^;הf6Mj!P6 mTD$sd,d- 1*WY,U?.te#Yޒ+ 541:쟣Hh,5E{I?r}L:O*I.c !qs2\kEy4wz]KHH͛rۊ+bxU478`fz! { <=S]ևZWi/]~67!uˀv<7}}7~4j$ 9T K<欿wf.e| {vzH1Iq^8 )$3Z2QL>UmFNUM_HP1haMZϴeR%Mey\k2>n_Jl7rsF^nvx{H1qa$flG@QwvGa DzLpț;F JbdnrB^?q PwTFxZ˂ #YON M-TCB!MzDH/?Ü.Xܱ:#ȱIOȮX|1`B0~ٍ?fhh Z8KU?=$" 1V.]#h5`t>M)hMiG0us^ٻg~>pMۛ5"#xb>'kU-S н+Ԃ:\0{H4[T`|R;9nn+l&>Q vKv5"Ii/''l= jPI "?;P qNzLr 7k0#{"kA9i3U6Vh-|;Ce p:pxm(jDJ*Gu!pi_1 TPL  N\~k_z֞8.ejr u[11epu~DyAPa15FxK2tz)BQj?/A;t3k?4).<iT?o+fofG 3KG\Q@]]Q&D`a3_DgAUz>ӣޢZ>R&$/1*t+bkd`F Zf4L:٘ .<7 w/..{fT'4ʾӪ L],Aܖ^<KL"{)d'rлR؋{ ޴bV}ڑ:٦Nĥп\[C*=nuޞDcБ15 H+`# |A) §ݽSu2O%E{i(Z͘?{${g&F 7~ZC/OGN/(hH^YK@ֹKۑB[ՁAoͱV 0|0eU0Ki%SlBub.>#bc%I(ͭu6!*PbWWi)%:ɛ5a3 Ԁ%>S@Y6DX{LH"6L¢I&HcWr~KDxVq Pnd`ySir +_0|{C 8Ž)_V];AD.yІr=]gI+:_F+wĪ 4Ȏ_3r'K{1֔^ Sz(t?P㉁|ΧTfsL;k u`{ [vJ)Gע*q *7i"՟h]Ц&3_9鯸gռ f! ⴡfUO-ʕW91MΗ})lmQ'$-,t7! cعES.>Ԁ4+|8R~ڀq <{"s!怀k VNYZt@/#4>P̂+}`RlӬ3qoƉF/k߯ѫNwhoɡz[<ޛ1z}R ˲vϲFb)"K=: zwxf yQѤOqO7X'P,ZP0D9`ȷTf4Un \-\HDɐ{A0EYQꭄ.#}90,H l8wŕlxJR>$@-ߠد"YTDmlkV%l[kBY=@7|8Ax]PúQɫG fάtEggSZ^GEG$Gم\+ksw4۱yA;: ꗭԳ|kQf_$lYfmZ)5a¤S~&Os1?Ț{SNEPJg|;1ݾD«;Qk5㷠 p3NW?'!|tm&Q L~Wn&G=$7Bz|<yō|^n8Q GEϛ׉tucKbD[c8:lѝc!l>%oe=2Y"D-3l%uUh%ՠȇV6*:J$k>tPV߭HP:ouDje;\xƤ!R /_;EDZ(R oqC-F1PH#&^F? K9\w,!(lIn}~xΦ*y@8js3W6;-OjqW"uvX56? .$%^MpYg~3s`ε^fMCǭct8oPo>H#Sǂ NFL+)6'gyU[`2io(_Bn(].ΧL>ѯiV\@7𘗍f6mp0Tl;d4 ,K2xEۧkܡU"#ϕ(aZ0f?"5 ]Wcԯ:>vkU6 w\&`L2hgwҁ4sb7jJH Kw^9 ]U>ٰYfk>=@b%~&733ME.#A PNq'BJ I ,z ~Fb?RS81`]X}+Pe'skdjev[:q%L`P5- `=\q}RGp#yyXp'Ȁ@۟A}[ݤ$Tb@ jQzG{><n] yn!ǾB%wLD1Ё 08۱/}OXI2D{Mp:aFqPxmow'\0*+ OG#BдL+G "!q˟Th_'cߎp&sXRY9W%<xp<u Zfb!{ U'T` 'f9 p?,+AaZjŋp&@?>s@,8۲΋I[s)lqmG\.)bWUYfitрcJ?~=>sd@*1|mEaOA^4_)g Jsb^b,6U3;zNmX6:@ǃ]C?4VͣJ OB}@qEXˀT'^zFhNv#aFb:[W_`09fTkr@#uC\`'q&|(~"}aun LG4A^'N[*=C.j3P$gz>M74˖Pg,[neݾdG.2H?lIW옻CR?`qy~^Qb7zn6"RxQ+NB(5Oc$[-< k@IV X| jaXE4̻oWzVb1讂J!93ߝ-) Mn=B 0gFvo`GnpjAS 2e *@V]Sf /P>ZC% E WѭHZ˥@)|r-Wc,I; !4 [#8 $etw=0?y.~ f}pg{N<@: O-ABdDmWJ6,a(7hj| j B}Xc=My"Qb,PlJMy&6pe ME ']SZsg]Co9KV,6򿟎3rbr Pn][4.j}6X5ZZ^=UܢǼ9Z㋇ h>eY_$%rjT> 8YْRMOMOҡ2x9׎^BSOOt"PѰ>R7sBL=L֦n d1Tn(댥3KC!U,'"~ UIzt=3F4b_}tGCm֨"kaC>sgG~ˌo*3%'V'hX?'n<{ɭ_q-9{f ˀm lRK@[ n!4|(OV TI"3IO}^Xdk,;z2B^-j1`R Jf1Ĭ5P.BsB(G@xYϚu¼κvwЌZt8yB_D-dg{'ĭ)( ch ]dA FP12kC^ oo`@y|bysxgF gˋ+<8Fހi|yn1}D^S`\M`?l_b[sBڍ$χRӠω–ݰ>|YGK '`*Nj5Ѡ =`tB#TtW]5d9a҅<霔a@: c ~dB(U207 yB6&7dlx}:&l\[FV| [#Jml#0QΩ|r aTg-N[O%jqջ&*=jiYbݯ9V4T)'YM! #]ޏn pA2x>A4;\66k.WfH$DtX8y tۓ&vJ;/+D9dg Q.A_7 @C }< +Bi3Dqͪpfx&A+`n{=9|XXɿPbXxr1e~+S퓭)6tT]=57]2EID{@lȺ!dKVДbԃ3xks'+rAT/Ƞ":HC[K)ngə҉,x yTͰ$2ə.v‘V4^y}:!u kje h{j 2@؈ĆƝ^[:#;Y52S 0};gNPi:lɪ cߨ$_eڸwP歠X4< z&ya@i8 /] Socp_XP΄=9HH_"7U9}h5z:}hGW%/Տpj? *i+z&*QH>Ms~-v= %;{,@wB9ĆRKHu%9IVU!?{턤\WfO^|҃+! ލ{as"v4)OFg-Mg*N`n@ݻo1.+"z4՛-?3f9 ESmAa:> mF)] Qh!N~KJWNH4hҳ.DCJ-t3M`v>{ Ļap%!{J4"3E@*(RII2 u?[!>u2JBm']ȕ@}r1HVJ"gP&o`C#qkZd-9Ӑ"= N~k*ag1p= \mzMD/1H\XE=W>+4: =(lYrʒк@[$\edT= PN4H,*ǂjLa:xOoo^ Iw4U(c('4<jQ"cӆ(`Γ4G`DaM}ϹۖiMjcTb`nLu4V$:BX`rQi# eok}oX<#9`.5|hD\9iؼ6Vuq3qEܐz#c4}j2Eo\nU2Gwv\ā*z}M|ohyZ76ԣU\Q=@+IΏ[ .qZbXbE 'uo@:P ,PPMY$̈ܔzWOӶ ]M ޭorSpǨexg5=E?14*#^xP]k%pt'R}Ш7{%XtڀId`A|ޮ4+o:tv @ ݽ@`K-.?3*2* a"uݵ'_E!EoY—ju ,nfaTۗ|_m6<G.Q HaHޗeǣxWUFR]( n98p=5zRW9 #Hb`K/ ǔilG8vڲ'HwDBT(W2_I%wq%.e>AtNhugsMO6=ʳ@7B1݌m?W{6@Å%,8eMwۛ&Qqayϗ3~UM,(zmps0/$z %Л?mE'[S`wx14|Bό8=$&&-x#@e8><'倅19C^ x>E0"ѲvIleIQG_luE9?"ikF,u;tӱ7lz9,1,Kn&d&A-:l}Vod7%! oܙ۾*BCi&i8f O, +X4kԑ(e)x=WP6GXL, .. uf:!IU*hZ'V{AJQ2(n3ۮ3NJbEwOtX+FFQjӒsnNʖ| Yx]}57qÚf1*F? ]!jjHjRN`PpeIx˗yB-A>ņT=q9+ UV=]s'2ܪ$݆ 9TKLq>HLpCrIx % 1G F%馀Ju>[XQZ!i6+bDҐ'5sꡭY;;e-"Kt7@`2bC{OfL".<]|$$qYJf'* f, +F}"aYBS'^W*و5i j*isuƒwNߎ)Qp#ֵ+Ȃot MZs()2+]/}--3?}l` 2E-KN顫g4+-͛E’kIɔQ ;39 EfzH9Ta";]AxEiYY|+](taЇӸA= m4GYl<$i I*|(7ۍGK.|+5q8,MtAj șՍ0O"ơ` cY nDtk)7X# q&髀2N1j=5HK4Gx|& 8C#EVMY? '-a(57 ` 0FcSG*ۓVThX zzxxiM+A\psꋬ( ͞o)uf@ع>#MZ1_҂; ᚪFso%[J크Ğb3t_C!pBL>̋ Tո?pevFuԡS @Gw3^1S037#~+.9yDXye4ҩҭlŤo+ټn(?a YiZqLHP{ҘbGӰUM/;2]zC}hWt>mqYú1Eo;N[ą\>ZϨ&[ l2`ٺi =I0%čޱ$d w<\Y#+\*)ᜑ=]vY]ބ rĚN6f%GѰ)Jqk8.7o l kMTő.l;:`%/'L|nt?:Ft$^/r5)-yHIBpպ4LNIFW]fu (d'0(>S'LJ=aύ[\ZQ}C:'*@@T@ȤGEI3.(ۮTN/4LuSCrM_g!j+K{N9jnao3xaFwFx2q {L^V˻[.wi,zE; L̊ ޙ({[2{ڥ~;6gkReQBs`zwMAe,u0pGsL'iӶAL{KiJ /9v\3%r-X@0k2(X^UpOrGɏgy͹m?(0^mԟ_B! Quw*îTbr3ʷ賘|J hp,1ߗ"O/o^4qh8zU:TBu&t#,S"#Yo/- L+LOp,4iK65CIu]>"[21 ݪT *-u|8:s[6 db"h|rIs[)@M ZjڦzE#txbڥqAS Dױ|P8׼L!ɾrW_rKy1 d}$*2#qvF8Sd֧Q";odl%Z na_-yo6p5,;bHǸz7f[: K-4>F"VPedT^C`jAqߨU8Rj& { Got7t^uZXQU`̾H4"mg'b|/]_MDmlgZ\ž+yMKq ϔ9zkdc"~6yjC=lgJj8H#Е0wohrD/K| 0#,׌7Lsy ' =[Od]Wd :\n;@A62 nU+\"R UxؗNyK_zӝ2T=^R 111xtZ-b7tL6a\6RDvi0Q~oƒOIlo1Zl:$\Yvf|yË+Z@.NKC^QIDI~?M]G N6\1[:)w P?H°yQpJJLD{xsұSHTYb.rJ Pt/L=t$<ڗs[{e[I[K&EϗՖs[K0|9Yo8:¬KN'#0Åfڶ#2,zH^(f˳w+rlEᆉQ[p]5K?4Z$bC @B ȬfUk-S9\gtEg,zL{T Ssgl%BM Bg5*C /xCq}5 !$vh3!^E1GRpZKOái/(IpץveE}[Tp0 gm{Y$`yH,[xb嚱2 a ,z]h:'(d[ZCT6]3uU<3u4bCxQkG)ϙ!Zp]26mŶ9rQBLwk4@JxI.N˞Hx tV갭>#uGq3郑IW5Ձ ’OX(IMݡ nr(n?观 Fr[0y,LZٸ } =jz줙øE0.x صnibu_ESdYP5j;4vvsFݍ譅[n:5NmXݎTJx|+y[BEyT* JCU`&:ZŸV0_f ԰/6{o4'ht@dj2 dk_7;wyw56ig?7 3,`b ڣ) P%6\ۋ)DKz73ٴY|ȥ2/wNoSy1LjgNT7t!jL!nʧ-5ɉnΧVWG7BkpfGlMˉΆݚ#V+!aчgAsr-^,w*)j[9 M+ id xBvABH+tYQFʨ?BO<^m`q_Lr:Fh\&bVߴU9;Kr+zOňd+Nn""``hZ9fczۃ Qf[pm[z7&a[%-§/F0 >@zfWkE+~w8S:?vfB,z-!nD{?8`7a}_GH-M_wT'zl0<]Q>W;͗VK^zoe^Ipc7>'^~/)D~q(L;l?"J؍%d .`y#yT24ONj%~#cHpm07I79ͶnAhF2 =SbpH@msqW=vڡpt9/BjQ禌J+d2$n5z 5vx;K y''|YXHKA9Ф;L'x 5UXZvxn2P|'ŗ2:# ! }B7MM?䗋m&+Ƞ 3Ub-{wۀbDt5E3"f6v2~"}DvKE&0EB;HC/@S}sB*?&5Nf/Czrwk#Vr TJAɻ%9OL|'=:I(usosqh IaG#0jG,\g$ qJM?Γ He=3͢ٶQ<4BgA̒=Rĩh? vB=b~Lnz>Bs8C2I=Hc#Zȱz[r2UQ: 9e*= `ηU`aOCfzH]3zFLp1 ݠ]4LZϕoj4C#H ?++WVG/(* O~wɳJٮTB'qJAodC#_Bn=Ph,`2 |M}@sfioG@P\ ]%e<@[=U%CU#L{@Rnw-2f[ae[Ǿ[WnF o48g?ˋnm-տx>fB"$̶V(saueu@epM>n$_[9 S]ȿN"3؟x{o7ɄL5SvA,W fJ%ūL TZ22$ofxtF5s1vX!~]>S)/x\(=k?}/c8v#<4X(Ew%ܓpѥ[8Aߞ=,lK{}4f׀ށ^ #QD=':EVz-I>]+*+[kBvpKX6$FKTK{(;l]GYoeS}>"%/=̃wf:wϭ5z˾,? C=҄ eyw&,;'dDD0X:Zn`&57wf;uZc$0mz0Rmyx[Ghte`bGp5\*y5m|ӫnmɂ:p|;׺e4 4 +=0ݥ^[(Z&:Eʧ{hq ./5f#_@>/UӅ=fmʹCsˀV俙#jx>ojgdx)e ʪrG?(%G?10I,`ǭT=vz)p}Cу@B qF;bbR[n06;/ ZH5;%ʐ?<ޮQaUios[k̘L-J}@n6ѧjd&ӽb?fMFR%a9Tcs1:b?UjbO t)28LÇ1gY"^b>' x*Nٶj5'>8M*S, ") Uݪps8aӦA,ߴ:ɒMg ^S- y Xg#} 5hGEGR#"Gd1Hcb=^<h}1葁"LA&L*3:?M+iؚYg ]~-u=/'o V dB 3zfc ? E@殡̿+UI[ػYLC,3832y>>%D?K#$X]XX1'F 7ȮƣI{DTiPtGSuz$J@ HМ}'üi8D{4Q>螬E쩕 XliyRÿBvnjSkà\'D7AYƬ+%e2Miw%o;ZRiO,MݟBO4י~+CD⃋ip|\۷I$L,[!azпڵ*iQV Pkβ0ibĖ1j3HJBy0VsDLYK䏝Vxe\&%KI5 BN!BP:+@Cza~ kjQwIl2u'@>Qym@>$ýH򎵂gΩ=,7{?Kp vqh#FN|_(]g\?7vqf hq@ Ѫ=6gW^ 5UFF,8_$ u1oҵw}l]') L٧{M~nEdF"<~2"vmmږX-_ԍAiM̺ }Hkg0K,ev躀E25v%I]b^Ko#|P|_XXSr.16wVyv[*Jh*mXS'.l8/62`E861dpUlC5󖹧(d<" S%Gkf{o@UA͢&{3WòM+A<-TYCs;v>(cH[W/qiB-׈][IcP#mծYݖ\" fsg4*(XaJrSJ[}ftP*iOnldkjs%ŤKu2Zh[^=q{m;ۓ1UQk}=w:]Ãe〷!G(Y) K(8`<x&&YWQXP" `Ŭ:}1LTR&g;B,rXu @6kQ}6G4BK3)WN,G]}.ê(2٨}*n/9`H~b PB-z ~yql6abMy$BL[}K%6Ϟ!6eg5,#\݌G(LƘ6𶴯\D4[y]K63dٮ4(+sB f 5^a=i.v~x=l K53u P֭mO)$Jg%rs?'_YzfK)<#Gh`<:6OEa q$IjfUYuQ9*SϘtsc"BKv^w#ܶ@]~yBrx^7#Mn^.erP<|ҡ%餺5m'6ҫqVG, cfыy% #QTWukKTPVOSd+BCYqtViu q<&j `s3󽺖$:!ĽEfs Dq7\}{A:D =>|9 { I{6xԱ@a֤ 6JwB"+lr E@sp4aO ܧ~j>&'ZHOnD`v$Z |iD| YJ目x⻋3^Pn>&;0['' )7(sgyw7NU&mz ١̟'/ ,R^шxoʗb9D.[=Wޙxg khbd3b2#X*T;'ip8+t{@QU?/ Yԣ}ne)@˻\WzR=~>aʡV!WȉoɰG}1UYVO҅|Yʕ1iulP՞C;tʑżu$M;fk@DLB.blT!@49Ҥf2cfeep?& 1 ($&ѷF(hh5p6:10,mp!ZӼ.Ռ+3FqAc]r¥-1g5uۢndvh.cgW;^룥:Mn_ ~fpgN};Dgd[?5xiA()%3"R!&H^,ϦK/䩣VQuL^sbzw^8U%ArР2`_iY, Y/*@>]Q2c θX*u:,SƋ}H(;r?媅<3ſ 2 0KG됈d/Pb$aC<ה0w?-:{1 3g KJQnP},SG3@i9)9ɽjjF9&E>,ivP[Y{̠6"<1Q-+ow]n:jA!B} `j2KЀr]_09 +>,kK6HgݛH#2źC\xA:'6Y; ~Nƀھ6.nrn\o ZYZYk]\4X"3ݍ}>v3V\Q%Ԯ{BYL!mXta$u٢/wЈ4`t*E?!ЄDtChijtA(B;ͅ-xѣ=@R>JH:~I! c j<"WgVb\et{qc %MA⶗$w`nh,Ks@^AUCymXꦝ?cͺּN*!9p!iP)8$>b -eԥۇTR$<>1EәCI LɢcU@z3!b#_6qʓw? b|4;;Wpj&T偻+~+:?Urf 2U32ptZez:0HTEXeqԣ%c$ M+9jW[Uw*3VmSC-0 J9ʠxY>Ocu첞uxLEo<0xu u]V&;xΓXU\:홌mKyT5 A &n! AHմM^֏$CĶ2KR>R,])r؊iKH`xk\z\oA{!ORIp*cU&R!i$6p2Sw}R0g▀*ABjľ:xf^_"dwzNOzMe򊍞/q~C=2dA꺲$K_||9ki%crJ_}PRM6W%./H?6-yƯ MOOqV[4ؽ}4y mhwnb쩠Y0u؂ի.Wsg]U\ Q_HWb.W˜j>1Wg3V2וkV/ϲ|5V,p 8]^]G '$ϩ>A_Hߨ 7+\6 njvH܌6p*'K+Ct(]ޒq z(a#%`Lk~e oyi(Uh<4,z;pW!k_X'cϷlnuidEU,vQT1 kp6CȏK|G_.{?{Y9Rp-;fk1fk۟.=X ]0`^WC1eNh^S%@j;_M@G|0CcޠFi?ط&r4[=V|GGbiP'ˋ#wiF7vB8ye';b>!acuw>V:X0;~` ђc^Wq2`Czh \ 8 oձT݋jC#i˯\* Xf$_xשu=X8͈3wj1Hb+z]'LWϰc _=/d^ KoI(5-Hi( d"lt|=K\]1b/HkO,[Cb}->p$fȟ]?tEwQq<" zW$EtG{VitMHs?<*dr _X 5Dz ÎNAvjun?6jAߔt5-Z݃Rۮi\%?9)=˚4)ƙqhD0~TiV?981آޡD{\F<wmmr0Ԓ?8kANA箙ĀIO =%BgRP [.ֹ`q&k\hz}!K%x(vT7ٓ@X?8`ѶEk7-5e] (ʶpfmؼ28`ׂQ`Ĉ[tt[L_h1 p4j-KMsc|Q#sCKpSԷgly Aq_D\|C>gߓu\/EOm jjI8S@o6ㄌu4?+9щWAp{@O,!nߞYE&t^pN+9tr+`4qF iX$CT@#d[_ +@*>)B 0ʐ .݄ ^7 Pj7)!Ͽ)w0T pN_iFۘv-SQq {d-WÆ[G|ѠCGbjbASWV}b_ ^˜Ľ=N6;!g`!w`jv|K(&`"=zo+ܽκ!؛(:\^}Uzd{ ]y09<ǘ9#l'3|a]#S+vIgüGy奨1}Nҟw2$fA! RJ7طyICߍ]MǻlTKOt=tK[Q]|ݨb$Ʈbeh:ړ z|"m:9Ӳzkvj,T8m-5 u苾)[.b `x1@9ertZ܀ϚԀxtϮ$YavX,q@G! ^mlT̗ٚSJJUr ǒrq o/=4t^M.(W;€ o‰q*XShsڈWlLgcm>2B3&h0 [G 9z(Yw^p*l[¼]@o3:.m{ ѯT-?1_"N&=`Tm f{GF`}Bw7@/) q(r6Zq+ ]hHit:Wy,HLC+H)x'rP;ϸ{)"Oddz{źE ӓ}ҿnA;=>޴Ud]_ە~M{XiJ1Bk0C=5=zUtP I{ǯ-C_CHDheթ5aM|6S"F_>GƠ /V> f !op/]F'ekpnQPrvXj{)K 'ف&$!Wg(Vĸ@1GMu (B Ky/,vF>8>b7z5}ӎҠtW\vi.cVR(Ra;s#)"K'L&0U0U #f-^\+ J۰?-W0P.s0@Y2ׂ+P f,` WGP~LRhoۉ~ڂ<0:ytI_eא8\C#=qT] t 4?}2ZC {qio~8fjp~06w*CHn&z-W# .}Jna1EC%s"5c|Ƀ64YZ%_i &N_3RFkѴJ 63PM &)k&ip%O#_XCl=,]-h}eGn3spV7cǾED+ bX g0~4tqC'#ɑ5+LС1o5KQmϕLSHv GSP[JЀh3G 5p+wU {]ݚTXpgRL؍-$swSRB߱pw'Ac&2W_jsk&%qWH?S=38Nu0$%(e b,uva39*Mb~f}L`fIt:}e̊>>J=c':K " "pŭ@yXR >W;-'ͫtXp."ZGGT{*l]J *k;{Y!~Wv1S^x155eD 53'É&w DבEGc kJB ֳ hܢN hJE,a$h&w9ddE)9Cnm@O,]Z9Hy*}OACtfNHs X-芒p_"-oH JL\|`;%PIٗf]$LxMӉSu5 `𰌛H:ĊVnJ1%%OƷ~ ZZ`rI=tkFǴYЧiR"xK3Qb\ټ&oIArI  pannDumyBnB}ު;1sljT4.Hy˪v s'ƩD I12cFqQrڼi%RBfO$F@d6w;͏BAQ?=v8wj]OX$I u.[w\"!i;^X˺3FpGĬMAPϙ; 9OݐpCWEVXG5pem] 0ʵ$ _>m>wׅ77AD@V(DJ\H3NɆp>'TQU<ۑh^s*H]=PH/O?/qƒ(~D@ I5,DcF&^%4a P Pc}%=CG`vxk`Np4FҠDD[(eY,9^׿^ŭ#ie_&`ScE+K^*:fX O_S),tQ*G!K0IMņN\O;(*¾a(JpяgwR QcbSyCOܮi]čNךTb\8~qdLZȵ7Zw`Z 5Zf[iiҒn qe,@Cyep ,dJ1 Eq@kV@@k+_pt10.S3&x"s:}|:a,)MEb* kw{c*85"ǀ{𚃠; Qu*J/At/!Ҍ} Hvٱl3?|&#a,qm1{gW Jv;Y^Ti*e@M煌VVz{9W8b=O!;(-Eg'Rt\aT3XAlT+CV OKy='jzF>'k5[2 4Enҷjds $彎9Io"WZ؉~DΓQgl_Q2֚(3g {)T<'E=c[юjs{!¦Љn,K z:wMj/QJ5SޣdR4ln2Ꮝ@ӂ{ ͢iYDhAꏘa7M~Ebbߘm>II΀ Qһ,5 f[Wд5Q~ YaM/^frGpZJgunV$9]r(='S͹2 Ybf2ؐY)ݣȖNftH/*`ooæ6D4T麌0L҉ b>k_b/D+7M2J@Jd} ^ `YLeab B5EQcb|].^ALJ_iշ"9psFpn"^J{d#^&J'K!#}0ҳe*5ޕC# *aDCKT0%Q犂kbwƗ L #=D94aͶHU:r'CgsG^wbOlɸ9\u߰dDfEJ MLZx|EI '5%8UD8RL12'n-&R>91Fk`݋l-#6H8oT[2um%/cz^mo許Ԯ%Z/|lVwk#'E,fb {4͕^#5w'\6K H'qVLʐGv(rۚ^xg>ON#A)wBw@7)vчU!i @u*^NaF4,#YOZ^ZPrtcCqDe|)4Y=V\aAShN*:Ð`)rg ?lwRrܚY>"fo:sIuu~t ⏵dp|@ B4x7 -瞽k(A'e"%M!|~AXnrQZ\^ v+<EVF]&*GE*ojo~Pb@^X¿Om\a(VNF ed"1NY37{I]\f gh?$q/a'dkX50%榲Umm>-3&3Kbu_ Dt)t>pԫ0U=l9eRgɀqԲ9L%iu,\Y%DcpRWm{VyT,ņZ"2in[/Qu7˄5SW(PyUmp'MFj9?N-d[) MDsg#檡 -dW t COzPd[u1؛}=fV'0ZX:8in$Sf?[xۍU`6B]HYq=pZdkB`Vpf|FמbܪO?$m0{΄DXGvwD1(mp)`m\Jv@{%Q"5> Ž Ͽ݀g {+#'yU]xc(X><bYMB)I cS5 %K]H(1;Ȉ罟#'`r֙b7Ph/>(ĺZ f㙼}1F#o՝; q1~iGr98pG"ROǿ],hђq&u $:9sg|f'b3i r$:/4V0Y Zk 3e N߶ݼ[!("kcWG/$d{a%zȶ16,!1)l7)=Z(z97krrb_]4' !v1;(Վ ]2&9:$Ky/)3ԧ1lnH> F#U}}M bXmB#)Bq Cdj‚u џ0dVK}YEkI[-d? ).(uu?iJ HA2Jve7L?I#-+"[*Z$ *e yɢiPJE~iFWh.2āY}g#vh{mJ0-+R1w$6QC?'Zg0p`Ƥ\;g I"4؍7O%fjF/֊BPè^6K&_>9Rje+緲fqJ}=0V`hYGXJ(OoGz:%(1xhC *}NzIIz}u_½Zڦ6p@cp7^ EntccMqdŖ'Z $^dDOb}:5 W~׀>'DQAzo|dk$kx'Cb# l>Ww5TS;`gu Tign[wnPJ.Q7~%7Ԃ!0Ez;YM)Omn#&5wh@^r0\pR'X$_cIwM^2ppIj~Nhbmy!Y!xf&D+ٖ6/W"̚ JDEvּ yv5NOVx 6V*鍤?0:W|}ѷcQ9qhǜuQ^ުԩ Ι{zIj^@[swCQ$%QM,&(nQ&\][əC{&eUni'iBn| hsՅ Y*ybTP#姶ոprsc;JE@ .gdf\$ aKrE.qq`ĔrV{V3^kF%!1iD4{GPi/lD9ߏ}̓s'+kvS9HcYa~Wroe{%07(~>jk]Yni H?ޔUy՚KL87 ߎ'Iͫq^nuϋ̯UTX?0?|.{\2"('SSr9UEJNYmK's?i'eIKnmv61O3<~~xh A~(P ,}h_`#Px?ģ7ų':#!3H5pvD8fsLB٧ hVTӀysmS:D'K2+$4_kRI-۞oOd[!v@&ƍ{I- 5aq*VnQg Nȗ|fD rx uO.P0ӹ8\JI *L=uK"ǔ-GeOA< wer ,)kN[T~WmkƉ E} u‚ӫ֪x?s*D,2s_nj$R_rL,+S[vR(4W 3B0+k0,˜,īnn쏯rS@KJ4 iRbO·|=OW4 EnŐ/lSFk\-rn3󳪰|j)뎴XEeWC_!)[kv..Y*Hdmַ3+1B%TGzzptAJ2@w)}REJepӄlPezM#J?X'l (h2E* VD7RrԊ •L>-p^|47wAMY8<0@T?֔D)fdlY¬['yRn#;G1C#;ANE{ srllr-5BucxC.1E䏧{?U657.TפE e^Rck5 ڹ4BC- ]42rSCy4!,^ɄrODrnĢj2_w3.n]rRTeRhx$w2)b׷0xZHi  R.>*Suدe{vPU~^Átl3-|l,( <r!OLN:q W; ]; z4C^HL51~VNa"܊s*8+5I({\1x7ϭZqpV||%'kϋ.'E .K, 赱N9XaMiOPѓ!nRMfh x)lDC~K|Wfd`THSVKMJpVm ࠑD]T_s$F4KAfB@y.rkIQE\_.v6f=tNV"@CfpUQns\V.{rt$4캛JXI6=~?Xew?Ry@wnIXRmQf\{Xߠ(6~46A/Q/΁}~}Hm>pq5pb_ON|_K#|so%m>Ri$#ئl[CN2%mI̗/]\N&۞[xpX?5T.VMcÊkJzrˤQڋHV%}߶np~U.(-Asr51*EtCp ֐wDZ ^Be85cyELn3P]/A%D0}ͤ2°q[Ct\q/5X|xbךzzYI`֯Dθ\ ex[ t}WZm*W$&*)BY[9 鳳O:piK75d\9DҴEQSCbrYMB+4ou?$a z@J$~vqNku4pj^qxǧBS_mDV w}!K|k2Mo#~ӧQϵCýG[+'D3r/.ty0Lpb٪1{XC^ݗ *wr[C"biܕS}U^]\FS2 Cᷰ(z FI6ȪUO||KXz2^xssFPA0uߝ_e9RIBKtɳwŐj(u$0Z ,2/z*]*\np"D/uG}Ʃ &'}1x/꣛W33`h՞',".z_AYI[b{9cԠ4#UEj"(eTG.Bk֖?iŭjZë9!{p|x$ '_Iq/X &)AMVy] !+*0N`Ap{qQ͵Vs[:P~,+\7o&=HTOE+e܎ g\|]sNe@?l @ hzDH|7b?5飍v}M\Xܩq%CkeS5_NTMJo7nl|ܙ5@pdBQ|m$ yeurڹ S9' ʖFfmP{otgoI"rg ^S'IڹĻHvJ(7A.ж"Mm@BB4a%M Rzzrbtˡ"0RV_}CdBx|eӍ'd?eN\}K^7Elv׀X5DOAwbvJ˽V |}=E]ju9P-YAkǕZd,+ЀX $>u=ܕ-x0uS*b1T4}3I]߀eQ(.M:ײcV3n6;,ߗ  (u# غ Sl϶BZ\`)u6DV.6z}ߝB_yz"maL Rp(O>ِۜs&$WJv-d_M6aO]n (d ّ =Wf&5ƻHkKע2fПBʔY7d{ L$i^'$:Rq `CTy& &/vuq 8tq\J$[ku<-yg;A'P;I芃$zM<7`V{o~zeh1@gyGk9PÄd^h9A.,#p/ p:pUVE,WV|ǝ CTdj#BHscxЯNb/x">yHh&oy2L9H8k7c51acɡ 2 R"i'.ɯVhE7C3eZIV!ȢDᾹ lֈUT-A$ :PWM(AV̫oh: (F":ߑz1 mN|U,p:l535Rkٮ]9P|ʣo,I!jB+!נ:?_,"Hr L;뙖%P;d&={k]bV 1[O%QiB#OJ6kn96,;E0b COojr $vPATtgѹ%q.s*@o*0r̸&]C/m)`n4X~!A$%g N]`]XYɌcVg‡xӽyjg2{+FWtJP`Q,*f3^]7 `j^m9Cy;6cA 0 ^& :DNHT y5h:FX}$d&2G KHٟ&럓b7\!*D/+uБ,x?I4k^.A󋄌u܏3E\`"YCfg q`+ŌB& eq"aP eG(3w7@3(L_ohOG, V3ߚ`B> DG&Hz[P%l].ǹHl6<#: 9R $vG\xv#|~Ua:+'Qq4JSgNop FQNUq:\nCa P7t`,fs ľ 93 } 84~x=Eq*,͘@':|,k^>iiFԄsI?$S"O?|HxJb>`s  V'>;5'+t&n?t%N@ H;4eS_)CExʔ-a;Sہ)zJeH _>wCߨ(@%~7<Q~ p,??>EC>j/ؖL]UuP*"WpBw}&?y1zT$5쐝no蛏ԨIAЇDEbM>YÝ}(&TpsCso"ʧԚ6Ic(ȩ8W^Kg"*,}=_Oˡܱ7˻X*,3ˉ ߝÀLeZOjpښTO:淮qOGDrp}x;ʓ)^?U0+оnlD*MV;f#]Xq=t} 0˿-f"̢¤ ꈦ ^9aKttN Pm!U:<~&pa5i@քdP6ϵލJ^(nzdLWoMUFͺJ9U_+)T%p*Td\C"΍J ɱ,xݟ,(1B%x?xB1iEH]5]+M6m | 0pW5>Bi5 ܜ sx⦶SuwH-crGd»&I::ҝPC!U[.Vlt|:'Mx :,G'P~uawoB~?o k ܔyu'Lo-F*8/0 i1(q@쀀$\ߧR%.- usUW n:xmWMqGiR%ie&wHj0~r BF(.& 6z;.9 3.9h0m-{a_XParîۋ +16KdMȠv&S]7)V\jܷ7J8FM*mC"N^go X?[;M҉DF!{f]Rn-,Zk:/}\> h ƷbcE!xsR9X#s@e)ȳw6LYf1` 8>AgĆ"g_ ɵ<knzj"ZV\b߻GD e:K1%H̍NS|1K>R8fdnh-͹k; U5 Ư>0v)sj{qR$ȌcxpU@ӱ^-M(]*q|r Bto٢f'1+25axJ{)1^w'?PA\5] &5C<>qE]U) #~VIq ֺ[,9U;zek:5=JǕI (|LyʀO[^R `ӤaVj}c_%:g*Zr+Sf1$a W6O rܦ6*&,98U3)~Tr]5H2vPy/xs$8Q<4_c{ܗ/%!V :NsaYJz 맭W [-F>q| ]?(HbGK*#g ~J#i<-ieպy"3j,Ѩ|&K৒K> )@I[xoMW. ž#K/3R|65{'ExB8-Y// |~Dm -qmu=Yj*b6J0SeV+,`u7_SZ Cxd$Q=􍁰uTW;6~󳁴ԭV#-%ͮӳjV|aly˞!YYCZ1L~EX @,`GaP].PD:*~vS (g/!5PbSvn t"#2DH͗-| .o=G0Zkv x R;N$.5Zga/"9)?q=; L&?E\(M-@_g(sלgxẫ'4}8&JeORv.};T~2rqӲM۫LTL )ڸ|se}!dQ"OieoDܝVޞbh0_^ysƺ ÔO˰؇#U6}.pyH{_3fEt~ 3z8gCC[2GqoЧ`N&+ނ"N9~K0%AN40o!~|e:2lp%ŵP.rne!?Z>g8WS|K9ȫW!4&sI6+ 3@"KPekaΞtk^Ц@LNfZ!c!PxH.Q]+Y`#}g_!4gt-Oc=]IԃܜK#!Um?bWXǰ\FWl'-yd5Q;iVE,}IǢd˻k4^Đ,.f,}ɔ+soH ޺O:X$vڴ_gb6'4 Q48%: )$9t~dĝ"{0U+3e=pb-J}Ȣ;(imꡖV!&_ـ<@-*{Gs)7АDe儠oNiGιcy2 ƌ`":tLn{m U+8'(n䷳/[LNv;ig\y)]P|qotʧjAm tJD^0~nMw*w;$ߠL +JeNmmiOb;[l!v5W2a_:MY$D3$mwȠ#;QeOGQ.^y%U.c aOd; Ϊ1)P`KWu@҉܀"+Jj~Xl`#J{= ۴ ˆ+Wˊ=9vlAvRAkH'"vbCM5qvysq4ȟ߹@4*o\kJD}7v,Ѽq:acSH3 3y jjQ%rMCބ 2ڼN6Z]<_Z\ԮP)=,|F.e6ݾy"^kBCq!xgܲ~Ŵjٷ2#CwXK<1OoА!,ݧ\@8BHD9v~9O/&:/D Gm9ew0bs` }8! `k:5/\iT/6DVu1 +Ղ9t\ÐJ)e`$191î buLr0_DVe0#ְO]^Hs 0QSz&@bzxʘw>%\Xld9cV:ѝdo u>2>E\`$DjWEi?LQ7-R\] >V~0Ezٻ}6ُmxO/'Kqe&nr%O~S5܆Cǁ;.OqK}թ<(ܤN|+;6a@džm츑llAM`5⎀vCGx1ӼRf8@uDC 3G:7Q?-2t k8lmM80MKT:{Ŋ_`Ce1~7$3DU1Mۄ^Ȱ|c`%by$1Ɣ afQ7ؽO2;מN\.CfyV\-[Y*H*j(*jeY:c㿶O+b:+[yeļ#}S=ɘ:MM341l'۳5Ѹ}m4xZ Eag`ڹތ}vȃ:.6=_pUr2/3Dx^4SH`IQ .sEA++_&fK ]OazX:23'K4@W.Xzө̓n=~23lP q0"N q17Q %IZ)H^𬀁\l8%V`vWnduRIp Sx8 ACN{8}~$d.F  R]g Ȃcz:VKdmĔ=ujTEaT D_Fah*61d Njͬ_B{ǣPȭ !tPC8f̟=amuXޛhJ6gf"qӧH" ۻtƀ8ĺx.@j<G,EnڗN&Mm@f-d54lX䬣9ہ*0EXy5Z4-)꥛Wtu(/ yP'|~1ܙa?ƃ?p-fπg{tIV2v!Wf#G.z=€mj#WԀ(|L c+|XWSGmA, 8,N l%ߵot.v>@x8,,^Q)2zJj$A(hr.UڧF`V ,Xd6YRڲCOY;i6(O0us͞gDHyev4<]&` 4MOHl7Cɤ/P =<`TćH-J^OŷklC01˕y܁b1 t5(.\&IjwG.=ܘa"zTYl_K>hn6|)S-w_o_*+PUh->a(JEK\(ÎAd, Vzw+oW B٠VyM'[7$>,$@$9 ±`}Qо^jiT]%5v};܊+)/I*dcE#bë^{I"]S@d-(orԕ_ p+Z!W}lP~Zlw=^N*1^B({6;$S)X5Uh8#t_(S֮h*Id:nϺT۹̇g$s+@?تуurp= @(*.=ZW`Z= Tn|B=b5Sa'Ÿ^t8\"SZ m k=pEf^4*hf(#7Nb%.G @UlBvYtg]:1P[b簙@^,߮yP V'~(( |0jTy%U=PQhpmA￑|{e(O6='R>$Gth`t49 noE!P JǾCj=sH ~/ў@yepi- ^1ޔ"-LoԷ7}WS*=+WS;۸qN#W~h17b%]&2dK7nԲPAz4(ilrY L(6g1>>wF;uL4 Q\f=Rh~.VʗFTzMIg~l  !}_{(z}tei_΀(d%PK`c*N;рuŭe4jvo/)n<K9,.h*>vٷwgr.xc[*!ccc @Fh;4}jDm* #VaA k#TXGӘ_~`"TKvRYxl<̽Bh"v?Q* gдqeZTRd /B(sSkjnQ0QMHdU[aޤ=N,0DX7j)2zl0i8Fe1eRszLEyMk8jUߦð ,JvL ٲϷ3fDXIAFKL@겈Jb^ˣi*9%D) k .k1soUJZI7ꄦ^*G_k WnAAhF$8Vj0*>NḩL%*`IvG|b 9 30Kؖ`JMFT^V={Qz%eYdr@ivuJޑ1ݘ<XB2€}2P*q{e,c/ؚLC]WuLHM@}#* ƀ 3\>t읋}ȡ_k`hX,Nf!p.x8pm|\C5Coަ3}cĀ8ӵu,4Ϙהda>f R`-W$9g[-f8q{}22""#Pqe켶pgRʈgrr|6h(YŚz$}"ݒuG^)XL]A\<=7 Gl?e\GdEx#3gQi$5Quۊ!f7z/F)l`&\zݮMͭyۿX1|9BN x~=Wh0% ^.w('&ATľ*6,P~]?Wb!0% O6#4oUT%B[Ls@uʩͽ H E}Gb΋;:D"2LiVO4B$VQ|@B+QR̫uJ4~Wqe.8Kfm @rDRA -dƙ,8H =Y+Ԗ;t9+AnP)\LYtXqQDd) bfd6N,yAUZf=W7du2%*7QW7f9wL4Ĥ:;s0/8 \c喬o)^],8~ĉ \^svg^ׅ'ؠU `, ۅQ爂;p]ϣO!HE9\]o_ ȑ\󇣌XvO=͠Sz{XWG m~m{\ZH#Ȧ`| f [hhSȫGa t1yvsݟ*Z'UNt [ ,L1ҝ.9 hSQҝe7Pq?Cl+ E$@G a=ǜp&hNZQtQ}/rA˶_[%]@1&Ě%O}ĽS<ϐI @i*P{/HVM E jlO]`õP"ނL=[)G%.نX'RDcog> 8s{@ˮ@)UDƒ(!y{d'v#?dGjU6 G*FqњCl@0j\Xfn/KCT0Hj`#tƲ^%hɰUlb7S.u4WΤHJ` yS(lW!*!@5®_OR֩2Ī4kN &YMJγw͛d#mF[Mp JPnn1![h0;|kt5!ҹ54+&5~{>IV.ZuX&Jeb -b2COAa!T"lWɭ6쇬0#+vRjޔ=vZ|{C :~`dx yBpgb>r UB޽"_]̶^Č$I+Q3».FEKPA ]ӘH}$*< 53Npf'gH@ ]яQyepSPDމ76 %r=j -O~A'ùY`9$ɒD1 "=>QDm$p>bpL.ާy~hq^Úw(L5‡=xm 5"yH*87AF4b>wZc~TT>Br5,QgEi?xaE( s^h<9d;R&R4="d&*܊ŇRW|*9bW< T;V$v(b{qgo-SR/C@z++ YeCˑ,BEQ<٪ph(TK|@IIMS 'aOb͍=wrC8E2}kBzJ=y\TDgBO)ɁX.L«N?*h'3yn&?, ? ~ȱV fMU.]V p`wBQZj wUyrj(N kKk?#ic񲦤05}yY;#=3̴cjN^ZDZ9!FkiOIF;]h6M0CE [p66bYz$Gs7z`1ߠ?/Hmχف*35B^,rI1 6$-RL!'y_ed]X+wiCL lEɕj7ao'BW -s癗iG2aަt=-BaӞeg ҈^1}>&wYz[: Q@*:ϜZk@(v$ѩd%1ZJJr&ːNդc5;2瀀48ȿ%kEvځ '] qk,Oi0ҁ|MpLjOzH[ݏEr|gN9m4uOAU |1n8P淰H>96#ODמm8Ǫ>oǾRv+F="By.5׻5*P1!g\u -N7uɝ tƂJDvMv ^d1[vYD8 FN!)eReo+,mTc-`Y詵>}:HOW z\ħMTXe*_m'UYiKYyUD0ohZa"{JuN`ou#UYy{ d2-pd(Fo8!k9>ǮF"PHb1Я#VfǬs|} m-)=jUpDz2RlYhj̻w1x[ӟ/y9GŔ6y" 1i+"dM6W`UV;Mw~huƪPXY>- %B LTؘ٭a.=?6j<>/)Y;t[Qn!Ra@%2)e7dnL@R0td@Ľc%, QIX!vM}-h3*4E3(dx?yh;*Jj j۰Lڹtv(>4\ܴgxc0I ֱqx(Qgh$y.pfg{<6g:@OUx?ݫQ0+5R3H3lOH˹ϔ;0wʏZL%,lͬw7 Y´&L/)'ڪ}i8V ,,Wn2:Уf=Ta5̣M8ZfצOAzRWe>!Y6P;ԇAV[l#+o_d:fm 5rvHMCV4} oe% @32k6+]tܿ|e- (= 6' :>)5x6:qq/):[ tgvϭлI42d7 kjO^ C~:Yby}WQL"R’Y0H 4 JLwfֺ"A"  Q,G<ֳ̱kF3#^R 9d֪іk0_{#5^ow;U&-<-H م#n?,,4QQ'_ٺ!̰$%=Ѷ/F =^$y xN_x:[ͼ"qjcɈ . NGڲ)EPcumiU?Bujngy00lwIqAg= @_s˻+}j_uI  95D |&B;vMb;E R9dz((;1}IНwrHJ fjTӴ )bgK]b|yK|SwFiIX/G/ YwT%ɜЕtئ pgqK|kϳ,N 7rKIAuJ_VjѼuiSHրiՆYҔnvs7|ডeLI"Uul~ )(ρQ\ql mwRJוJsmeS? sU2 ^1xxQj;PJ~ )0E\\M߀4lsUFc[-p;b ^DOWU"=UY`VFډߗ!SBiQq"0-⏸2CNs J=9u7M!El2KmYƮ!=D>7|`%t0{{6 n~ D6[Z{?,`e_H+NѶcd0/Wxhjj񡅷_=lTMO?B@lR>!fusjBI"(ylwf, x{DHtd}ًۮ詘8G}nEl vaް L4s#)X%'["/Zm` z%CH(ZW.BNRp\Hp|ƛYOni_Z$y?I <2I47>vx~ չRaL| 脓j:*4 뀛s8h]RtQ;'L,Q"NI{&,̪Rޏ^T#)|"qWN!GcՎ_5屢;Ú$V-@=y`5l/( mJb4ZJ}[7ƣL,3,y18nLwIM<[9襆'v̩{ǚG^>uTC--mԖQ4kv8 n2&S#ŋD4J$<=0:)h4@ҦM27>כE$ƴV{5N@}Ӊ ^ٔ3U gedU턞I)!^f*3|N?=[nN˙8{.-]4BH6sJ8/c'3wy4og 5ޛʩ8:H'҇DrLMF]EWON򶧏4^-[1 D9v0 TiQcL鱾܄U.'d0=56E=tA=7GF\#e4wWR}k"CxBX\F ȄE lF\Ĩ.}WƵ,pzjh̷#>)̓+I&䨿Bj* 흁[.&xշH"#+Xd"HP-=`I2K޼eH_"3֫utP0nja}\0'YyJXFKd(xk ~foxvll@oa@B4עGSז_dѩ€@ڀ⸰4+&m5簁E#x̦@CJKiTUQ1s^l6)1iO'R=Zy3d'|Z(7R۱aWGk\-KA"uR: vn6rBvj>? +)Ev/RfN \ylf4жf; AZG!;s;PLYvZi<&sVzKfFGjoEE:XJ!` uio7kwB\-t.[z;9G߽܆8=&۹|p{Ф0T^J-:0L$++xA73U݈4urpK n۰q շˊ.x 0$3r&ɗ AeGP WU_W])S*[KCqx#Y]JL0w!V=ư,;rprC0-PXm>\TR͜sǰwqU!Xj25Db5+JQepY2׈c[xLm;M+a5j UR iP*ށQ?Qj[ኬᔥbQ 7jrY4)J|8yr| 9BqB~#Y^g^&d;yi'x3v͡\ʍlX|v闐 *%O:y}8nMA }x$r%Hi 1sj4FVV/]8V0KC!ST,P P^El>*mV x~PqM%@#Ш(.UOF*ݪ!x_A!&*º;>H*͢i~Yv#C0yCݓٻ¿{eJ=E)e&ڛ4#39JKl E/o}?G#<%Cp̫Vҥb U  sͧ}mٍĵ !a]1Pi`cgt?8BQU .#g (rI.N ("8UgVЈcO'đ5 H؏C?7lטK:xӂbZI bmaAڼu} bJsf[i\}- ߮Zd(aKyL]f0X:ǘ8OjHY&qyYh=ϐx@-d 4IwQ,VX 8ތda|`{V]4+c,Z _P%:xN.H\oɓT/hDeID< Fg zBzsVp/q'8[b#SL"Q`Q"QIjg_'!DxjG~|ez,xx#uU7>4-~K2vXP u- CU 28xZTx4 V_|7ftB C14}(:q޾߷SO,Vs7`&H2zS#LjāYf-2u0)c5 7疖`|I?ǝM+O+ t9qyXϠ9k?jeCM"?knO ! ĚPzy5,}e%әX;d\`o8]p0YL.[$55'ǥC!$̤q7mLPK^S)vgjko-DU, ,Jʾť#3%,9bU%Q,.0 =v`DXPRksF`hJ]j9<ŸhGAnbZ" MYoDt4gU8HY/U,ds^c*QQg ~TQěyyu- $.$$\5t 911ֵ X7/Yrvtt-OxL Q9&ͪу:E#6kDs A]͆] fY+En2#A#nLUW:Aʠ'=k~tUkUP $|ϘWޕIӧmA5)P_2 _(\=#8O=O|\g͑ ,bMGқ3@v)w%Au($m0S(V䀶VMO/ &=.Zҗt֤uwFxh)QFXѷ<Ъ={ 9Lyrva0-}ΪQogFeN:rs\NqW tCc^dlH[}@_պ‹tSr3sO%`."ȹxp2G"Wڏ԰Wd1Xy}>%Ës.!s-f3$_׏ˆMVf!h[@>Gq~f{8:Et[~{ֈCf/SA0I7I˓δY2s%GDx ]DF>OjF"P>>f lnhU*ɅLugFo 1k0{ @7B U"oiO_ʬUAS:g{G.HVD'/ZRwyHLcKl USY 9+F& l)aϙz >㌴{ߪ%[g6-eoI, ݼd ܲi&plSlA lҺlAɇ8& ʢy TO8$ۮD3+࿁ՏIFQ*TH}^A_34| ?TF;w/ }gVeG3>!x/ dė,pR% OX&md"[O&N233ʆ-Z4[^Gb E-+n +֨8~S,ي]|}Kةs}ZR{<(q6dn'&7,iy GIQf9 >|!Q1 }ʛ!/Q('Bt6YqBez GM9QQƀ\iJFvk'24&J 81ep`gɖ_&܉mڜ y)B9g|19>LD-1Kiy- N+efKc TV:guL?FM3] <.+ҕ%_@^fHuG\%? %5>M[$4EE6K% pߔ}9B!m5TV'`UzҬ^Ѿ>r(% XoRImP{MM# '3B9Es1fL^pEA> ݏ}(74_(*Eofl,[pVGsk)ԸK?ţ{/^k\ueG{Tne=nqtہ FxN 21pa琞Lڅz8$yF|#OaU:6bAm& O $pUjݒKqi (W~o,~յ'gT`0o;Md[dRiLO@ 橒4g͜ 羾ԝL=L$ eđW<^-r/#'73}2wX1 pm9mNv=]n;#Чڊf =/EN'6N@ſ}.-D $23Znk?Lsu:ZF-1bqdJ*c-bPRM9*o؏i8>r|d*Sc%"B9ə ʐ&"f۵"GN;0âU3pN\U rrB2>5Rw"kHu(.' ' }+AcwC#)o܎!]q4?]k+6=S8 Yv$A^"O@?nRJEO5|t`sVa;4ƌXدLnvhL28?| ^02,''}A@Y3'u5';&\9b@Bz/|S <(Qݮ*h `k@MRwo/l(Ej,83c!ɭfhQ[&e%=^~m&zɡެ9VG򀀀0,A@RW]CvĒW`6VZ!BxaJDS-5w}[nފ ˓ U,YcMD)/QW pټN8]7n!}GC]G}ʪu:XtV۪βa0jJ%'dTCW  ZKr؏y+EYRlAZUlHPM oKrlU?^Fv<8_x=f~ɋ?p;e\ kN k5ָA<j T ,> ߤ[p\9A AoeS7*q oBeP8\}uD1_D}dJhC,'];>k۹M=.專KIS&mXҗ E2G_nw,qLo=-k42slw1Į+4%Qm{[:~ehBAiy@:d⌖Юk B?MPprg&|h|&PC!\-=IJۖʏceOB2qeSʌY^bFiz/ ET|DH6cCz:*db sF7?nSJˬȶE:mN.&ʊS%vla ur!DLVPO<3Vš5m u[>'2ubבLې"HMD _v-q-?8h .r y) ~ EQz5J i$Ql0Eտͧ +TqmZ5Ph8Yp) =f::\bןX>eD \7+5 /m +#nRklZ<bJV2 "S{-(e-.5ȤXb%#h%uRߤt\Qts BX.d}p noT=+δwb=9ޖX:q)u/͆HTj];q)@*@c3`@!k ƯO[/f&„GDqẅ́}?s:a]ԀHf'+`8 s@zi=ڀL$]]9_c&ÅM@֙D95u\o 0l E?uw`\? ظ4avxu>:'}n:c8_s 0&QU(dܠ %.͠%L3Y]`*Ȏ6 ,LMdMc]R c&B2RϾ^98Vo9Y#9a`]d94*9(Zp={{`#KPta5рA隙<_)s/rbT-"{V@HA3,뀀hPw1j20KVRl`˱'KDѕJ$2Jƨ-h_V:BlhZfnwfʅVx>[3Tҥr3WF8rAmQӣYM= gPƏL9SGBZ8~,!Q0Z֓A󻟽c4 ͂J~ +* S,`|oT" />lOàVؒt1#rF=q"B5(#pFL ̓ƀFtls@ȃy8B[˛ ;̋_€κנZ`krLD3`Sz΀ԜH% NME8Wa8Vy_m]ns?spP4@!Ţa}%vof#}`rS&=aጷݒָd8uoگXhe)/9).ٸ~4D&ĔvҔOMFdjޖ|;@Oy}LYVWYjO%4;ӚL1:bU2éɗBypʝ'2g3^\,ۭ X-H/Q4Wac1UӎJr|:<gu`ՒR.:>@9N:Ri=&0Ǚtk?f647ֆ{g}ֿ j`ֵ0=~} b@]|] Һ;OCk8=?8bW) :OD<_&哪z5 1=q =?9-᫁4eg$NlbB+jQ[gXw{y_o4(EU^v׌yd>||sh*dt*K0pr>YHXt(z) ;ژlE0 R1d…I53:o;t7l8. in zUx7^^ ל|;Y'nyLBF[fa o6D`>\/:|xu3kޜQD&+řqobҾRn88%t"m%W*+bAv.U-B&i5#vMmUS{CQG_81G"Vʾ'Uf= WRDA~c ;9ǣR/)sI[4Q @}j1jǸ3~;^F oD [MJp:V@VeЭxu`+Pwm}?gK% \_ulrQA͇GL{KX5 ^zSf08)~Gd@N܅̥%(jEb ~{ ~d1Gi,\ P1oW7rZӿ-NQs)@vnٶ˴-Z!Sa0T G"Ajք^c <؊:b-r œCY>eϨ HӰNJx)P*u{*Ht8~!֘M6;;PxlE%B1p;6B.k`+vdO쎏eTLEz^I٠dŸ A]-\eg]Ᏽ-6~wɻ‘CLTGTIF?\j9GXEݤjq^Dm~}H(ҩ(pV̂OG I{1,0ijhӏo?঴+=#y\>ܣ$~T~:r6R9Cӛ% iXIƔ(rAQ`%_ WBg<40w*@XG, :0kw'AjW8ʡ'NW'Ư^ m;˩"V !IS2Udݸ2' ^1Sr#=OuTY6q!06G("7VgfũX5ru9h;9lXܚt8t J>I_Q_iJ-{XYE}ԏ!w;Wi1/ܖ)xl < 0d^آ|T a~+֭*'2iZ*+jͬpWOdN{MaxPޚC8 C.qa~G؆ߒR5fз,LT~FKe* 7C“NJ HIj){A-Ax k?1^AD0FT <QD9]c#9RASv nᴢLuC;[`!Ќ* z?\_[+7'+ϸ6N~ 6! :aW}ފJii>`8|M`}BȃLTAa7r酿5t;vX!?-C-צ9}'g401e}7ZfϤ *-+H,EpbuZ),t3-Wh&U*4dO\NfĔmAƳ,ȢX`W<D;VCŅlp2$\M/Qb?I! kZc8Whه~`؂G[(j[{y@ Œmg36wq)7e'Wh՛=@>%'g!N`r ;ـQ 6ȧ?%ɪ̿rڨ:_kت50;3"9%cau0` >3d0BHpIؿw5 nv?e`D7oTIf|Nboʍ^܀}="ao58`sk21Ua2\#H`'nYLܚ7C"nJ?b RfғovϤL8LBKP:Xxm,倀g c;#c`d.-poBC`%‚ 1܀1N'šWxFq?%QMh wL)4 8.tIW ~~0LV_| C:q {A謴ᘽ ͺYCFOf?KӮl?uFuO2,` \%<1IY+|j$On_*sH +`}r^'825?l#81QY%Qgd6ݵ5D@10[Be% iyA4OV$ Dizb{k >rqLd1t0wl9CMVl+TDܼJB#MnAFj^-QZeu~G{ZfjiHu2 PdqR8kQ*:Z q7tIbb2XoҾVDFv<eD \u>zI1kUyV! #&Rs _Uw5n %w"pB8r`nL&`,:`/uf+_}dQ ]9C K'nR?N¹ho)= ,G]L袖E}yjz,bqh,''b1 Rλ"+ߩwoevo:<B4~vMB 6L DMS"ss>u_-sTaD q*+]{IckKcȫYʧ3[? wՀAA^Y}DߝcDaXqS&'e*^Tc+f#`jOZ(` A!PB̼KU7&[9NYR3QB6jQg.!p5`=3<*2zZR3to7ծ!1s4?EJ3.UV՟ȓNKGUjaaNn]$3͂Q< O3 JkYMvr|akM!tBlp0G~`C ^Hŝ;(>Z/PKZ9gVïo}ͦuh]FK␺`{3<4 2,9{O8A}2-5{0fg|HP]H J_,;OgOIż`O %.tK;NOb'{v5 ^SU¦& &ıro|h߻B֍ E-(N7N^I~ː`|K^L))']IGUϠeg&0Q mf.mCr1 ].U>l[S2}/%0`P1 {pjjpZv:(wو bLԼ^jmh- esvV/?n' ݚ *aKmU2 y}MZ2$SGPžц {YQS{=23sbds9{Aid6FS\|ĝT3JcOV2 }X}sݓɗ''}GwS=-b StmAk.Xl2&]Xr[XDxvDe #Z` 93M9쀟1ڢ\keC7 tuUn]h\#'GmRnIF:/. (L;:Nʲ$ՏY1 .}-sznغ;Ohpsy+awr.*6[o40rTX4>ֵFK[)€JO M˞IN=Z^mmi`-IwF/vN1 `x`[ >B.Ǣtڤ[{wx`ҷfPQ*%&DBE쵒dJ F:Xt<1yIje4mrB\Va@t0(VsH$qqm'i%7lqL\Q,!/:a䂼 [,<8V3n( ;z$xվ!:\iyyHpa&8O]׿l#VGajY3QBxL-xzY:q}Q۞=[45q̀O˵S L|'kfcPXB_PIDRɪUؑ"B+:`s.בn=3J ul U#B6R1@֪ 1KvR,ČhlR(*jwzmmX,j埖^{(&Cz!| rF$75#.'KE xZw,in-Φ&_~.\hdmq'_!2\Ib)e\Qt: #4׋!GO8a5RHTq-GCd}NOT9&\g^qF'/ ĖFX:p-x}$hoSY81#/Bj_o~ _% qf'T?j!Hcqb7acq?_e.D ;|Zա@r6=E\?Sş:y,Iv?UhХzՄSE2N P71Y;znwM8/E&7jmN$'ж'j$HM'·!TyXbB'MGCf>pS }JEYg |#bw4n[LU뎮6]ZENhj7jF f:PSG-T'I˯jRIjWUNغ.VI&"1*Iu;ǀ_l̂6 P: T'U҉p:0ŔZSVj@V 3z>e}џo~+SjM ' - 4R_i G_#!kwF#$_prps>l^m* zڛ,0Yo*;ݑ{kp"{S (©OL\E^ Y) Uzr|rmf*/2SI^XKdAZz[Ⳓp(+bm}- OPʣFʭ{NK8 +9`XE@DK| pI[xԁ?~)ZIVP;`TuWʹ  -'l=]@Y8* 4z>k/Co,\ lGPex(xk+tiKF펣(|0ہuQU.:, ^r%NÞsW9y$1_i\Oag2{JNYRz8&{k8|)|5Š|$=ߥ޳10=2ѯ7 e@<nAC,*%1WhMh\m#6b@dyNFUm$3:򻄤Y\zEm5Cơo,׬(vP)V:HwJ?0 vOR*:ǻ|H`ѠJKr##b^8" La@>73L@ T&}ܜ{s܊H42|UƧ ?eVtE*2fqnOJ(.KLrG:yP?_;l͍p$g,OEH^[N~#jR3o۴8X eE6 |eɋ^@e *)r.<ٵDKඑ_+;! F#(#%xH*iA=y8ncz 8\KJScah7W1M,l Qķ0$#D\G'Ro/ouȗ){襝OW[eYd~vu}#~NA=u'2.cb}hxuOI8LT\hkAjw\,xvcԑEM.5S[jh6#%qiUz7X#^#f29 4RȗIkXI!mv]xa^%/Kġ6X6]c/"Nۧa݈:1wUڟcǪ?6s[WvHv mRˡ  R$ tLb>Il )[}9w׈&, rfz#7ox¶Ps?!ca5Fv+,N"/.b)Dn{ q+Zp W6$Ȱs)ˬ+&i$շK(I#3W/pt8ݦ}:jQB\jcҘP1pbEځ<;̘ ]8IY0?e U q@A]|y佀,M/|Rw!TItT~v8)Q)QP8;ĺ1}8ꔨFdzGb.V$K)8>#R,0uӋN')EgعXJOeԸr&H%Uւ!Gy3㱥lyqʛj{oE)XH}&Ç*]9lGN7C'DM|Cgq~d3߮Gr0~["/ >T#91~V:rm\u!VG>x”ļ{5t 7!Jr9q]۪NYvܢw0Lv3kyk?KE ( bWlWjJYOɱ(11!ST QF 2+QW$rf00{z|1n*luP|~\S]L +(NN먪*%Hp"o#ww M ekp(ZԠz)."q1{ =VD\D^H29/+eICMIi. r8%HhWfcW[E?Oԗ[`;:CBl5;bU G='/ܻ("D)S a@/7!v.ȯ'-}|hռdH$Iﺧ;|xe9环&Q?&l?I6xMڳy@MW>{mCմOD3)]7(״MN&%Ҏ3-oifhOg3WP$uPTf"5 |wֻ$l8i!oYt(I;=h=VyHtችxnl2"2\0qq1S0=Nװ x\^,w,”ZhT=5W>rUgxPV|\H"X@L(7#]ߥ{y(%Zc[}˃q80Ң50ɗ7mvG 8􀀀m=8FTIϗ-?CĪoDSt01 j*U怀A!W(r fLpvcFf2 S9=p9DAR@wگ?2dOy7;1vycqMPIXɀ_ Y3N@qǍϿ4a>܀p`&NڏׇIm^;0 U)h>o8LU4d ?:I1'rHk{kz-ɒ$n(/[_qec}G? Lz+0x3ԣws^|'3ɾ$ސi |el 'W^ #؞ xh 7V =wf@#sp.lqOfv> }( ]"CS:_a##xq$ȋ`}A𫹠B~;Ed4k eZ  | 3h\RfHCjϼme xXLlp0>uhr|5Y%j1(z |@[@6\R{nr,g_:UT繂AFz+N[5緡3[wb: KfV?* +ӟ&+(F(nRWgMM>#j]tئ0 ~*dOv"]}OJ l5 ^ïG9k<+\Ҍ"pא 釵}|.*?9AJRG$l䎜N|{xkGtUkDT[')+ra`J;{y%h?oûx[ ܤq|q|kLl+vwJhc I޵kd6&O&ORIyſTwL_f#̯}xa*r}X%e @e=nQz<汁{ID$12C0-u7b}rgKzƾPlDqDt+-,5(HAy 9Bv dǫ&Fmj}eR$Im2IੀR[k@=&r,/I Ampݘ󋑟vB9ZZ')ޤHB9ڿNk%X!kF®':%Ti1Ler!RڏK@.(+W"%tD ۾~'zѮn&}ؼtꂍB&X'* `҂2G_Chl00: v~wK+>_ 0fҹZv93PtF&Pf4] #ay6hi&,d$ =a "}(^bXuv4gŽ[[t]eP5: D.DGa{aph4;ez;ٽ'}pUp+VCջ^NRe>Kgj'qKR+>tM}|dsahgBo-B"TsɑRMHQx1S8|ipU(SS,x]y:%G~RDJ3(:@>_2J9h*rc`6] 8h Y!;B1$3y٫r0ŵ`OE'B / u3(~%8ʳ< QЯWkYܯ5}XGMҀ*#6y׈ѢrHX3s6wbE]@3.jAf{XiR. ƿW_ Z֐{=5V:26e$<`} eyC^mz(E(8a9KB0샜%/QJ fWw$هPOeURX76* KKXЬwPeej>S-*HǤx)KFMnQNh.sw*ȇ*bBF=B܀pcȃDA^+R~y! O9Ї,_@m)j:=ipl ;;KEz= *K~Eo=?{IY$S]5$k}m1-aJToCYyȢ±mvc8 @?޺S#8aH5?ޑo[w0_. ?fq1ʽ'ѩO ^qBR9P"ЖE;nT.8ad O>! 2eO8!FwΚ#Qf16ɗm?7]j |ej\WVd XfwK)n c;Z. =y#s&EbO{.*/+2 ɪ&3(*().Q^)C_~Z Qm.Σ˲E4uȉkOJAnڂ-g/^Tu SDx!=ᰠLZH R€yVA@j S=zW1ֳ |O pLY*ǀdnPp`KpDQNS WAIcB &|&EAE@ӆu q Ѣ֩IJlL}C9&Cv= jXوq0KM=Wbү&M6EVl16&O&xq˯nJЕSɑ;؍D^ -ޱef3r⫢ΠM؜r&w@є7͜Y-:Y2PMP€3e|A5ʜVK6VoyGqN2Sƛ׼(t]2'RbJZ\BTOHQVG/24SIP;0QHX3IPBb^xH ZCiZ4"c:(6yj̴`VŸ]9V 셒{!pޓQSŎ<}á8T"Q}u˨é:51C4^%zQq 3 /B|!̲0y>ʾ=$: (1HwZgS)c^fra vcR!9Jfx2ND|ِV6Vic{AV"CKkhjh݋c|Dr|nlR-P!ׯsE$?7G .:9OqlWMb_X#C"\L˰NΝbf }KQ$ YyV 'S硠^RC "t~>ukggIu@xDu9dݫ\ tv1 `DoY\IB7fs8pƏ/+j^ˮC&O%Twi ^-0Va@hJ}h/*rwF`JB/1Oȕ^kJU%ⰥN{40'h9Xu1St-&9^&Zb9SLI,sQDWkRG*YnQULԻCQxn;ܥZIx&ӬT%+p^xW/l]ґ#*~+/}$ӿc 8>cIl? 42WJ]36w`} bl[<>K nh}x*EE}[I"`͘&JE[R@azv/~"e8;+Eh!~o2,sazYL 3h9@fl'򋿛ceG\ 0vܽ- Qzw+3ju<5VH]g 'hp<"<쫑EФA m| r?7 nU=lT$]P!am㽊D+ؗ _ȏ$*-k4!|!옦GC W R;+P tqb kBo}t-PcvxG y~9T+q0+I$[?'c B!cްtʯb ~ز$2x *0s84#0S`)v8}'vGɝLlɹ[b8+78یh+jY8Y~ NM&OA%-+/*uADΐ$>]&$(neSRQ ː8o 0Y2~!|1,)&>kBRŊ9e잰d^9~ad?v$_)XP4ӢTJ5,zj?`3?Zs|Fu[3;SV# #gd8c%9űt+IrbRYũѡJXjzRaد,z?CRij Xuې _ Ϝ:{?j+.n. Jr&t(NEhn(>r;8h Dͦ7gbZ O"fH0sᅥ=mq8=a++#P-}Ny~h25+ݐ@_Dq|=`E3W^o>*BDltxͱ vgҾc9nye(ݎ-miYz,4цIx`9=35lٹn`!G_vKÉ98MȢ;av's0kt #pIr4MK*)+tM\ݦuIdokIŐ/ڠιLUv8|Bv&)<"91xn(?Ca{|u9zKK;19زYKLYZZY<ݪh ` mq=l0knN4ݡ&VcF'HbYS`HP07*Pᰥ7cWDo%Xq-fHq z`W]tdoOF'҉c^Vߙ-KI ?]#^J{%@s('a3FvFiU9 nz@VQ~kک^lsu& {RG&TQi8 w e>\̖,goO_^8Rm ͐pmb1#%-3{aƫ~'JFio&1Ve "}G#`umB_ Fx%~-Z\!EL;n&. K-_<s~&d,1CD" /PyJwcv@`9R605d=^Id>V%^(e %6$L.l<̹V7If?%cs4,3&j\cTgM@UtqjQrfl2k%I:ꪽ~A0T&ҷ `-`߈7L6W=PZl9W xxr[5W ls$b"=0Ve;*&JcTV'*,%>yLW&gȿ1O%(gbB6qxÖ"y'ᖴ<q5>9W(69e|@X#nx\ύg52s_ j~ oOL jH^fTm;wIo >+b+⟌PyD8~nW`ޱ`x@uuc|_%-$u 㣏 1ʥc#İ9~}.i5W=©V2֘Ջh@S VhRN'neYu5ԉ>>:+ɻ+e%;<'> fM%VˮUy 7O=7ogC\[5p* Ԝԇi ؓ$A'KX˶8lJrWhƐ'$Pu^_XhʼuĊZ9YF<dxZ*ٶ+$5J5DdDqrr O|gm9έbqAf"xDE^!2 bp>Kd G]hFEYt呯3y*9 w?KÓ\.c/R>fϸn>PQmZ=PmBd#l?s[:6 eR8%cmrL {v9OfhdbLD8lے|={%x#i*''%5V`mKЕ\qaDHTa UZWV,o\I6vFd ^BQU+l*Y߁#)w+(V'ךt}^C".fda?'h`H.N < pqս8 $f@y #+Դ[OQ_n7)<)tGG(xVl7Q\3ڍ֒[]d64Cqgz>=yI|504W,91SmvqF8Q"uR8_*!k|UD1n`ф Nclk/<+t8؛!nw@wKɩ86C^* Y8o9I?o,6@:|ud*4X7o.i'ݠ頹DJ`$`Mo)p ~Ak.gRN/ [ɢ#Q``mEH RrB q哰.BOx<1Dɍ' (i4@A wy尸ۆIln]k mlc*6r$PAz&\efLU:sq2>b؊ɒZۦA`,- :`f:oda$^wڠ@$W5%:isAXm5i[y hz>3R˟KqAO,8J?[X f*efv/u3} 1 ]!Y*c*.k㮇yHKӘNnP!'tXk桓,nj1 K}}j`<|0sZulH\C!fR# e0,[1gNjւUh.8H)7P}u4e;3<Mn0;9w׷D6S[4yւi{1>/jW|҄Zk%&~&^#mF6˟`Պ{t/W}^F>=D2mӧܸ Zi3 c!qG L"FX1#zl=T=T"6#Bjx;]Dϱh;]]Qވ.OCȬls$D#,+x"zf9˔R!ٱxm²8sZa+ {A^pTo %62xJ5_ı?,&wE0.p>}j) _-Y(H4+b&Ĥ'F1,c Opӌ_fț!e;#^ȉ z('kL2 8=+!gYc@VmsEߥĹòʝNA~x; igCFEb#x[WSJ*MAxQ@r(\`*ܞGb`l9;Bfh1w  ~%mBz/0 ⹝rU]'[EPKW3jߠ^yUZEþ>tr5fCu >o:Բs~|c bh(!|PwY60 SIN,4sg=ф;Eob&nELUx=`4#h/\S"Z7R"lZ@Agsq B4'ƥZ WdDeP?Ùk7`%no25-*Ł?>m.2O?7WԂkj\V՘'lǨ MOƟAg_1L579B4\lwhDiK-t oA|`4TRe(\&ڨ}jsᢽe1J媆Њ*W]FJ="3qB3r2rs tpaoU'sfjFSf6'C֢pun7 D٧_RqHHsYj[Z+ޖǑ֟nh% (혲s@/Ltc$J04O&Ŷk S&l8\)~7n^R.|=9ASĽ8U~Je_Q;ѦĀlj8ı@m|ݠCf(@(z$Ë6.^fY0;e2[q`t{2g~nݦPEA/W+OJkq/١Xb&sJdmg:ir㥄#Cu t/ΔV5-e5wf !1UwA߫xd[J Y kR;>mA+R˰l%OH ~J F6/"sң3y2td^o\ޣF5y&M\Ed^GFC+phaҋ1)pSg}Ia~Nh[c´’jd ̜k18~y_ㆽL$O a/كGi^t0ԡ|ehh):P`*!9 "Ț- ֽ词&#=U_(oh\ $! &ɐ+y4U%`v NiZ L"^RIk0m_mư;6 {N=a)hpm!U!E ;l#=k3w6r^A`Mk@+LCK­?洼y*m 98Y σ5 '_nMA~5l`(NyM^sLrHKvFzTh.׃>CO¬b/׶ 0%؝Lo$&xCŶJ J,o{^Lu"RkJ5ͱƏBgG?Wp ًYbp`z;}whZІhL3;dҵ#/>ObX AJ^!dOW%72$@ hL  ee-mn ; YylOl8" <Dj6u2,Ӡ1y+9K*8dCid&ҫ+ +WG"^W,7*s,MWpR6zA*wl~V{p>dWŀWF7¦eBqut)t<NO; uFJ?`Q#^yorY0@Ādepy)2r5hC秀Dd܂(@>p61<^h</  Vˁ0#}aq*2r 'XG\ڡ eg,~Ä 80ݢCˠɀݽ;[.ƧO^r&6 )|-ӂ.U^ xe&m=OuojVqdruS,WѶȼ`͒`JXiyHڇPO Yϟ}33v{ 2jFiB@+If.Ni3^\,dN45G@48I(IP)v[m:0~0: Ewmf| /5S^~/u/AvY-PǯghUr:d2UwR޷8:ڑ6yI׃6""|Om15I݄ /zy^CI%PlJv=DY:n3/oDNOzH `!y@΂yXA8,IGWU^j'[Zuaߘ"u"g*S>_89al`갇Y[awޠnWgzY*&$xXN|u*hmVӆ\ذsON_+e;JQUMgV{ ꟽlEZiOl]){w~Eگ>-dT-.KDW97L0p|`t?D-lwI2̄_tyq] b\AÀ o>;} 8"qL`RQlr! i¦8LD9cĪQ`:P"I]wtdĎ Z'xwlء;jWYA^ PLquCj0f{Sf7?7pG6S);O%$А)zO;cm: kd"ؚ~4 J#zf׍END?m@^߁PqkR2Q򑉕"s|1ڠav*wr?rËEYuao$%/ߐ*.YT09.fA8߫':7,FS7p}aͬ^K3S]n˧F+(\#8N, |v&=w$ތ?'X-ʯ2+$i|n,ŋ]gpzȞrPUTCA(Xύf;ⱊU_yX̍~it!M<݊!\'3HLf^V}f9BND_,bOh%., nW^ԡلB/ׁi]~i ɳӌ;U/2E-TVQ ,^]~l =(!+K[]$-sg+O{Lf%ItuQ/Kݺj[dKHI`5u╳#nی?_]pTz,2(sFV;"&ʐutԬ2bI30RN&Pu̼Qo~uú0I4nc$O5^j~7L+4BZ{s_y4ԹMl5LUބ6|?}:ݕS\e'si+=wZ Z$ \$y.ˢF!OOI8)fV[ݷ$ `O%JP!PAs2/zX e_/Tr#z7D +jQ-7* bS;T徉| ?"ll3c6e&N|a7&z wgQCP`{ '4-dC3j в4Eǰ5(P ݸȽجL=&Y*'Kg[fַt;3Wka/"pi hKI2>R7]G0OMV 5rZ +eq3!EM&,0arw@r؎G~v48%_A6~u"0d;-c:R2$iSE1*v3 YOkt#:!k{CP3)F{Yט `,~b{)(_-PqǢįx0kʼnʘAS&0h\HYxF/C9õ=W^ۦnj +EI4tv 8kK$pz|U)kX*Pwz'|:<5onFگPicM>Мd?D6MVHIR=؛|[2{:HGڗ`ct!Z,Keb$^h̲4\Њ1?hRӻ,T6=I>>1}]Q}t5"s[u5 HwGB:[0mPa,v㫐uZ=S,:H3PitTEX!u1I0AY4R2a߭f_$"w?Z(a;}M](0<2^KB.`Vs>A"l5v҂P.Jp mQݯyh ?7OZFGh\C1 8. %hvϭ}^ӫGO6pkmDA>דvwqЙlm?.Sp5*]kv/"U12\A'4ml ,OHTZ)@P-мwE/B}h~1XY/(a;Ґx>aF{vI%&eZIրCz~DDQknKEAT<̀ٳ@Bc3Wu'pmjh0CEEOE>"l]Ucrr[5"ըfJZݐ#dd~tpwB ЌHQ(.ێҪd(].XaHϺj %{YgʧR:m/'F\/+UOs) I/n&e?Bx 7{ґ[?Ou^x\5b:%Fu&+#kTX{MKn9PvM J0sj W7Xػ,hEW"|9 C/5^Dr㛟7mH9dz89dbmnu]c{i*+l[`>v,q)& iEX蔨Vf{_q`:M=30{p` }4K'NJy̎ ^R Zk;PAm8/fט=1%s"H#6f ^S8TJ MpY"K4=8 SuJl)JeL+=~?d 9yW$ o}ڝ+spt_&xH}Lu'NxoQP.ġოԎ GFտo ~"xx,_R"ujXdR0[o.AANQZ.]r-n?c mI4:8yn @0c"#3F*7hQjH[o 6N >F:Y8kZ2OGګ;ba&g/p qJ4Խ ?a{xUF p$x?w|)Lv5~UL4QR~8w,|O|PwG^.ǑqzD<]?WߡށFc7+!c(&~jU+lE663rS4% 7mkS EQyEgqI95,<,Y/.}V;x᠞p}oG,8+-ޟhƨC){:&p]+ }yx[5A5Ga?ރl<}ڙ1SAMoE_wՕ/|nK[v/1EaҰ1a5!ס$XJ3lɗnz=7tDڬXf+2|q9{]3Mͬs ]4)x(|T"uow֡zQt sw^5]wN@}`ZgV *pN$Фpr|{"q&24o̐ɐNmUЭ'w \7{vbl/)*ɝ%Ȩ|XJD Z}qUS9q͗,eBOu *Kq1nT9e0p:8S A>ƨcOA~ĭpusQh-95 9yc ͈?1.n8,iћdf%g4( ؤۀYǞSYŸ~,('bz8NܔLԔ/0عV}xu3Sng:b"jN]~mUY8^? mO^yw]wgi7Yш'g/,A5֋a [M§ʸd &ͺKzAhc+_rCֶV6U.؏nwd3'JVb(}ʀ\ʙnq*%W['J0צ?UqvGYG:o#1|^=SԪr(m35LJݾdQ|@vd>BC89O͡-L[A`mv9STAdp3dP hIFRV>eH) :ngh.ɓ|!?oaS?όLXW_ë!< ; 5[T& % SE܋ aҹ8Pj@(G)¦U "*f{ -i+8!tnMFH ]gvm1(O\0oB+j9A7 J\)띹~ɅȞȤVJ_ߥ{jB#ڰO\OVׇ3_&nb-zJa /%آ:ID0<~] :i22zxWܹ|*jf~Z__d ,7,J>+٪@|CCA*X'ESF@E=0~wF#mDxS)D%*cxC," hxkپPwvOޤIXf70 ƗNαLc^#]y:f? 2^A5$3ΞdM? @O8 #C(I_FKc}UY\"س |x}62dDjE G HY)ʘPh^>$Er{憚-"3[-=~"bՀw k :v%ķ2buŗ)|o(H5tF5;.&j̞gJ6=>x~€wx@OÝ9Uɷ"i6ۉo08sF1CxێJ2i*b_{^€Hl[V45UGzR޾6ac̆&,1f ]-XCw) χ͐Ui@;I@פ;}[k)he-;/ezbf Ē>iv&.n@ͭ tmn6-yJyzwh䙋.LVͧXw]oqu u9 _J+/>KlSvF3jzV0.S-R-+)QP~d5%B;mP:Ģ \kRd0+h>-g7(=-5J`Yr\E;(}e^P[oe#zK~ٗLЀ3:5OSs]"3Dsϝ'|^LIOL*R=ӉE i@#x]ɊqJ_rƠV9_}w=tܪ7d2!TT/efm;X.{}`dʖqJkpe5'C|CXyR{t{~+ȏ#2f1ԋ=]ivvC^q܏u +ɧӍֲ`1_ސ6~ɔ15`{~D9vtqS2lY" j+`3~$-`j@I|)$ƨD UYjc,L hZɧ֛N1xCw$#)eeI:S; > )$w1>$H07vIf,ג.k\U ҀR R(vhvbcxzZvbYݝ;#eS(P KO N/% M㔱OO%%l!Ҙmo] QO񠰾p|ipfrޡQ8yo y߹ ^3F v.f@~:9099?NQ!~Pu;g-^뺘kwdnA[xYl*'r_%wߚWwI7EEC+x{Hܚ;+UZ!vqP@_  xwmjUUܐ㑶';ر iz1iIB.f~j'hSh tLPi\]gbf{H7uV5nBeWAY*!<7ؼ |,\j)ZPi'KאQ6Cȡ 9ډ_E黍`U"%E1~[ADI9hOj*Ԋ"cJ6M~? A-梆TU$V O떭Abƣ:Np%rro2Btϟ4 sEjg\X%u[,G_@%>8$X DU5e 5:z}9M'=8Rd~$&Yʉ]xkfH ͣ랜Fq;1N<9Uۨ9ljhϝWe _@Bb- h$}bpOq(jv4G^̈^+ՀeJ@#CHl~ź 89Kt0%?8˅~d}%KVos z9* sUPE툎F3d5UOxܗ6hFTڧ9ːXqE2EU˶ 9R{#SES"E=̻?KޒӯzO"?U(>`S G~@17#!ƑltKaZlׂ;ǚ̃JVJI-km_1,Ö*~_י (wKQewW=;ƨEZ`W"D5(=͊uݝo>m asoسZ @>+vhLV̴>b}πҀ;(&򘥓SèDI=P]f[x@_AwwmiZ[Z92(<.W'60.=uB}`ߛLp{דOo1N {S\3aqswiF8[PE'S7 U_"͚,l"%4,zR9UKw(kp!}^g .qkIsX7ԂCi2xH&R-YLͯ+.Y{Dۯ/zߌn] 5ǂ{x쎖BCb{~QX20MU@<÷|u\{;ڃTA ? #r_/]qw8fi@2ubAj3b5Nb v30#+Y- J˂p<6y*@<[fIp2?!N jƴmA1PnݯX\ ʧMzÙn[ukßUٚ$<43nF3-E7g5QBai$H`6sx5_Sfǿlu\Ve9tc$:#ƿj 4U 6aUYk39˲OvZj6]&蠨be{'csd.5sXlwkJyj Q@k WwiV_N!cLuؠ? A;R=ze'P"-f*'̓mYAx揅'b CF6>')%#4WqzDv9, ^P[n[w>rF.7u!]A]B}e#}= Drk\H]ǮafߞRKYf XIg6r<#TA&x:Gw8»!V kFiϮ hnzT +Y,6<#Yc_ˌxuh5j;A"  S;56[+<ʧ8!ג$fRtPSᴴYG\_{0H > ie@,L2(jHrΓ%q:=zķ-\/j…pPl}ڒP{ݝh ~C5ϞJ%><)=??GHVL螐WU| u+aY״,MÜ {mLU al/1H'=>7_upEG5:"ca>YS\lXK*yFH| 68 <"$ZGBE_0LίR7E5/I*1; Nn1OJDLL_jt2TZ.9WW:\4v=^yeIdzoȺ.Sqi&Hv{0K+8()gW I7Yf"o91мadOW4?*V4Iͮm\`$?xju;,-a9^+ZS]+$G(A74+Cd]h̡,XI- BU?<}KC51\X-U{D=݉ILjqtԐ& slG[IPNXtx;l䚘raxUPo觺R<#k/D}DiHUhG1yNkp%v.uPIvyEc*1bzY\Dv)}tBikvLH/YDBU)Qh=UCW*lPq,w97._h"ms pB~Fk?cSXTyGeZM~ٹ'w0!c# ^WU mcXeu&B.0[rz9G{ JcJTD-9T_[b餹 IrBVONTPuAU:w*Ѿi9GG$yMw[-n hp wz=%ZXA[]€?o'X@u}^;U[3$s1,zksf ԠU بvPCt\ `Odպ/V-f_A2^e r7òHLa͠q08P b\ 쀀CH;od\ׁb>AbS$6_˷$;s@+%Ih$T_OqQ=D.i)RBOI~@Ɩ _SG P)F߭-}lWNH5p&'j pO1UڀgScq ktF7Df B'ra σ5XN,8R.Hz%!::cq`}Q`~lB_Ke@U@Ś ]aQvez7g8^sAX09sy7*?&Drg) iBoV >?mqI/k] E:mAS߂`1Jq d+FWlCѡ#iPte ֬ f'; ?빺{C|a@~C _.d|ݘV4 ?S@lcKګ]/&w1:̷ 7%3`3E^ g&mU8[rn/Nq F<r֓`UV=]F'SsakMT/Bo*+fctfմ.{x^;Q?zzCOZl]O_(Ǯ %zQ݀Yg&z N"0ٓ*? P7D7)>hzʻIm#`0[pBU -H7(9os-ЃD.6Ҝ5![EO  #0xO{M3ldzsЇ'nQ U;޺wlnxd܇^ᨘHOGlb>maC%`Zb,]`tfxΏ+nS$*fDT}wCxg,sUpJ;Ùa'bSƢ"I* )`1_Dޙ 2U+ U==L˳THA+ ,f!9-o7~Djؘx" (рWI(5<7TGi.DX\4VI;63K.VP#637k8h<5mG`RrjwsSS\Ig"gxF3 ;)P{q*^95~p;Hd,41PMWX#%8OM\CنIlYHpâ %hڌ\YPQ)4.]:?X ͳoA )k :vN` kH zQכڒMdm\ "?ʽ:(ǃWJltɦMCkl* \ Wxx:>kv_[ڢ9қXL? !EcT'> ]`Ofju i:`f7Gx 5xz~ںER,M?V;n]PD 7q;~e5Mˆ+'N1ƷPJ4htm[9vu V',Bޚ~x|P֊>=uVRyv0bj!#`5 7c'B},'rW9=%[Ka*af2{r:3'66'I%3vZntㄲˏ,3"eVzlDa?;ݜ鰙u>yR\@Kenܤ 2G(> ",]hv}:rk97w)|"x I v[b*uЩ)9m[djxD*n}#dpkqѽ X% VhzngFAA1cj! J#uzl|&φ$=EPD^mg7Y}z {uG3#\jfsNi BM65;Ri1{$6@9>S&=8Ş<|]!8Jh9s1BgܾoaOdL5rpA8?WZǠ X%[AjF8Neq#tuB(붯k ; NibFz ƌY],d/=39+q>>ۙz<cxP"DWucN EC3OL9X$Lg[dK,#"P;gP { PF]EӦ[U)j>SWۖŸAPZOA(U蚙M]E=+~/=|0%^Xz$M;atFͦ:B;ZHN,{E ]Ԛg6=g_LĐ-EDkjT# BYs_ Zm_?=qr,,yaKLMްĐ7.8;C`gL|Y=iLac2!nPѣbeđ7Nrwtyu3| YLӢp_{=.y]&Jҙ5o2 CU *N"<K ?*._P$8Nln ,Y!|-@T !&IEBۼ@roJ֔Ѱ&7}2s4౑?D,1%0;T$5B'q)jkBSiW' ,М8nHU/S叻R._mUrR ^8DCʲ%_׀孋vE̴O4.j>FMg|CgÉO4mBn(Aȿ~1 ʞutwv׉i-S ÅB2$sym{,aǀ:E)$ui]|Ыt ^cM38G|\ae@L8S:W0 e4 Ғ/d#7u0΀AK#(<7z." vz `#k,ԩq b0rҝGL}"7Stsŀy.@H7塂 q?=kNE3ku.Nn~cT!l^Z3O L {U-hH$Kvl[(}lE(vEZFvdCQ<,aRgl &+Z>4HR*cחHU7-WՒNU)=6FxNI2`,\$ -]]oN}-zC2͐H ۮh].o,4%?EL2@.9Vr$Λ6(jwp]Z m4γP>\fS>1t+WļūP hxw+ToNHD,X`(N!ch߄:ZfjGdƻPy wcXwZr9OC@r# `U_n7څ50Ї#An " KwzZ1WZn2 y)΍Q>V#q!a_7 !  >[bf)\;EsFSM=H7kvy F[Ho2kj7-Һ}?`Po[Cݳ d;/j<ΰ%ȯe'9Z+86* W=D18ʃ?~@KovNA!D2s2}q (RcT`2\{:Ie lR0z7"6o܊y{ŻMCHbH~!"-:no?2sdts`:Xa~V &'%+ IJ ̍ć"u#HNoV&ӽ( )p 7r1_5@RNZ,{ >>^~'N/^T O䇣L>̹Jsdc8ۊN`2_~% d!.L 3Kg\Am[a5W>O( A׸9Vd I+Dž-ㅪ} ]AߗӑN(:3y$/++WBVA;x*"%6+2s6,=n ~kb+}vM(:]FGktL{y+ evjn,)9V M$tjzD5; [\w! H | ;tSqlc|bWg xSpIJkwb}ׁ}S tTZׄ/ }&7-wEalO_u@*<²,pCbʚIFEwhTuRe廨lN V˃8`UfY_(y5} zìw0)ʞP>u)~>6f!]tau*?f>׺OJ/hrxpL{3S$}q8npOoa?yPY w%"fcpl%>;e#uH0LF?UxEVW}TƄKOIs-Y6&ΪAIa%7-:&PGXz#<9`@&@^I|{BIx$;ӔCo%_RR99|$ ZwФP,L9[;1Le[qҕ 3GjG6=Ab(T^ⱶy8=&H58x|f"B,rc`\7mb?2€~c|{vfdLZ s \lM F^t1Ck"4PkeOh$^otimT^gDǢq2 B+$Ov=1T II[#4O&/QVNһb|tGQ"M%R&+y ŻK ^.z;2^WUcw#P|w٨qVȤ&,9*հgvyN]Nd (]CwC#E(Œ:kSzx}OcǶMv&"9Z2p5-T4 u^[ij|@ʔJ kov22V@fU g@0X^fZ1)835#v Js*MAz۸ U,}H_]Xy[u~l3F8 !2)i-~seV8nOtp,}vsI_$(d8qo/HuU4e7 V0X^Z'daiܾ佞 mʚa)@j*6` 0hVLāQysaP:(NdHC{ìA€|GJpZ sTfAݍ/V$PxYտӀra3DeKHѵk#d^!'*&SD@Mp`{UnS71^guTpj &oWp@S5/Hsw8r=~@;qJ/UΆo28FR5(4ձ496,אMwC[5M| ֆwiLr*9=XI|Q=9$ ) À[x:٢ MIh4{,O :Ƨ22a`Az=^85ct5G $r8ᅛ@geA ǽƚaxA[/08 <6~F \yq~JryA4eu˩vYL39#YM8*fG/F4&{Ey0_`I1ҟۓ^di4s-0Fb2-qg"9(gq!r徺Ji ZG,9kH:7LR RVr%bۄ70\TXwDЏe&##LP\3݂F>2g`.`<ae 9.r}JC gXDr:}_Vr@͏**B!m߳h(LLw$-]ΨG _{S"r¶@Gf[W>bOxw9*;ɵ*Ϛ &P.y|6 ߵ!k)I6tݎKpE!E/Ii)N^C} 4M*C?YA(U .2\AqQ]4fa8h:qA? !>[`$Y)MޟH"XIE:( yTCm԰x'x͌5¶=:7㿀zw_9D>ǍGET35t'9nzy`s?Um|<2X^B?cpUXwg%Vg|^":zHplv^yܽ*qn/GVB\ԅ@dZOW]s  4πI#UWeؘ$叔ڙbY0(# $hϐWHO{g(|]D QX&)ZTlB9 0:Ljܭ 7ũ8z\m߅j@=j:9XKWa6ig |Ci|l"x3i.YfֵX|h IP&,Rg*iڡǢ,|ME颡JX7D~#R'?%@6_sg+pןaͥ^" \}]SҧrB*.@È]rjmOɞ!}؈z,&tSR{N!X>TGJ>Koъ$!2S~cMQpګ'DFu qrb <Ձ7:сf ߀%[Cǐظ%#VjL>R+ g;+`Wo]61ffS&n.67 '" dNDH5r.]FS"F}3f{{uj7;j֊XI(MQP 1)ed! ,{i5l {pT.5LWqP9/^ ZSjf\R_O_n)s)TmwSiT],8IAOSw0R[1jG8BMMfHQ(sTS~hQ+ #FT&I _]Q2(J =d:яMͲ=b]N;ض.ls+u|A5C=1NiLI ѵr$8Sڪ!U#f7ȫ}7aMfB3 ߏ `ocn@U!R))S9q\BׂMdQQ゘1z{GA:Z Hު߉%{ @12ե)+4|+DY9? FCmuAA-J6ߑ"9 |ٳ"T)wf,lyRWtzf*n5EϾx{zL.i'_ ΋ G0 :pl.qdj}3?[c+R^^,>3#n3"Z`f 7$K#Y~1qFT|DW)0D-ʬР~zP#r>5k E's1{nyBH˧ 7B_3.`ّiyۮk/mJ|rًs>"Ly!h hOa|9pd<Tl40fb M9|3)\l<86-+ x_)Cse@"}NpĪY7RvVl`8&9Pu+g-7 \} ^Tȩ)¨tp]/M1@SUoڿ8CpWߑ{S.GB_'D 8#u& XKqIzWcH,J=VƨMoZԍqc"YLU=O5ϫwyķbEnVq}i[gQqeLxuu65$~qF s8@aY$gWE1d7[#^̼=p1~kQs8h1m²_z6 ͚ {sMe‰ v=L;X2ϋ ÏCIT,HY;Eed t!{U9mj"64بRxg^{ํc>#PQqX]L m*.Či.Q78L7~~ , iv| 3ĞD8\z8_C˭P K[xaKgQP UgT!*6Wq;.91o.g=hr UQ8B s#4HҘt/m1JIzh'.xc1E7.m)-Jyu jf6u7vVGiy(S.\d2LBXwU;AS'OSo=dvuZ׎I"s-ց q$K?m0Ttd♮ͧP誆T8Z}g!Qsi %yԭ*AQR"([I,/ۂ\|hnjWPfgq%Cq˽셍Ty3qە~IЭ138m^8M߲9~._RزrK ]N^CLrXu<_X}S8܌PYu'is4 Y^cv{8=!t$ΡTTQ03K|rYͱ 5{Pɐy *Q ~H-d"B%JqyѨĭU3I qU] %ACYcP+@UtW5b>^d?2MX”~U8\ydnPvǡ{({A€cĽ݅ր:1(& JAi x "@hEWbMh `j2N/7~]1D6$mg'6iXw<{JkQvo7t}IkcG|bЅDjkׅ:X%E@WL$ٖwGpA`Q?' 3RZޏ}P-d~v_22qY0}Zoa <Ȣ.q)h'--dT1@b/Rպ;>0U tDO5[%`/) 44qt_]+g= :I-ɑTtAdk BmJnMfe"h D X84 kYXZH}XUH^rkډލh)q9sf V*XV॔~HW,.uNe˲B ܾ4H(fTI/y!7Uix VeRWokQ6-:)FC:zseE ]Ĺفxz֑ߠ\˜ua&b/p50SB)O8pT)EyZdrz\AjNB&\LMißT{Е֭1.?# _}? U]9v,p/5fsFk:DcZC#i\r zI^8#29>֟6*>fpN%~ǭH#3BW KSF%f|le[UXVVHi jI viުjMH*:|a p`/ϖu MP5Q9h?n:+/^2rJ3.%fb|c(T$OglH n5[<Ӎ,&~z*fFܓRheeVu~.|=ۭ3d#$6RfW/ +5G)\HѬl(a.\Ya =K=„מt1h> 9~BHCy7y|Pr+o@ňuU"tuVNwʏMC\_wf8,.PR=C,\bLKG0GϪa!HM8!Gꏎbo= <9c}sڠʹ7qd0yr#JE% @E_V"MlM=z6b9f"zx9l_E5be}"V|F€90RqhSQ9T'"&3-ɩV?fx·־;Ht( aF 3~)M9i&, eo.m&{{"0 ͿE%zUF68yme=ebFCT@ ʷRii{MI%k`5p yFyLz>.bVmI9ZFJ ΂bj^#W$1ж\ :` -d\cVA{?1OەjEWwZ   ~O/N75LF_c-3X|u(9cHd)lS@I^P.@.;J#cCpز1yg i:-R%TdhZGv^aUmſ=n*RcLőuߘTբgg0U'Fx#ڶG*Պq13 Qةn1.QiLuV~jdLѝ$eܷcޝwfNu \??\4[L¶ҏZPƵk#8@{KG VQSMchkI*!%mdR|)臕(rkCUaUm[ƕa_68).6d8fr{.z,z0%ҁ:S;VvsPm>V71`K+$Ǹʒ,)ԹJORJsh&2Wr$$p@LM;!oFFz1"HoFDݬhQVٻqGI$b\;o,U~]ہ}BnE|uB9'9eއ&-r/@ed`D՞,QyP(z/ qj|QD=-Mc{K5!`Fʿ WvY[5Dj{=06Ğ@)zER> bN%_?z+y zgMkX^ ( BDu*IF ʮJz8B 2ΊR߁*|C0kZqTo"BPn ;D SM=Qe' lE=׵yAQsĄ}r hs+8iw@s"$O4YhwM@*ƂD nQuFwxhZBv+o1/H>c.O1^K6vi?PMA&h͚Nb8,'`Ɖ% M(Qt006WYޏWX \kEcV#B =P$·(|E'v_ <$M&y+XjhOi\s ٧S;ٮҿ[GĀ3ZnU?G ~nY3Y0@Zv폕€efD3tOowIhiyvƴTj9 /.#v2sw]z\{+Ll4WeÀ>1 9X#/0m0vAk@F3k7B-쒱%tVS'ظtB4]nj&_0`+c;x׀ل`Bbq?Ł=vnV3 e`Y;CM(nG9%k iZK"$u p1԰bklY/M6bA89|`T sjU$kE/$kp?ri$X_.{ai{zx8ni75np9׳(#悲]K7_r/RT*7h0t.;Xӹ8e;P%X̹Zv>^" <].G]pwH`X*KLlJ% ml5"2c1ik&o6h˖|xVmX4 i}+bul-epp)0T[(5M/NAZY\럣u9*hOwwb&zדI_ vaBZr6aMp/fl1G/ج@f%lzW4wTZOu$UĻS^^wB%F*Ii̳Uʰ~ niU ح4r;7u6ɹ:Q ϰ 0x9o\yvkg_bt܁L*`HZv G r$I3+wF{w=7{].dYOyЗqk.-GMo}j;oyT'1sK%IbE5ql{nW{, LVHZ0׀XRPшrQƗD2] SM[s-cv"q` >̣`63ޅ8ՉhԤbrYA*wᦗV>L1?XZ:R]/S!7z0c}o*TyY>>uE1Koʾwb(T(0- DԿph@59t1;PDVb<.5͙ B>{tK9Tߠl @+׊qy5\P H:D8X K0q$:oO_eރ՟Y87:`F]f* LC,^@ı^h hLi2M &7#JWc9~*w>< ] qPDLvSIܑ\{2[萀* m.q9\≡:b5]0=8.nҪL9{BφqR{W#RqUY.t,򾦖 p0yQҥ[hU@i'׋ի8@h-"M@Aݫ6/T`_`q eGOTN; 2YRސxIJfрk`UxCl"C\؊GΘܔePupa=@7ap=U%tW'J܀AfAC85hqlԛǁ0AVfCeༀ8䢺6X}j]ڙr <)4lzUZ8#qJc;rFV~ 0t |Cx|hd+NRpsXM}ގ)FQ(*zi 99"dU]fh( )SQ0kf4Q㽁n^]/u O#_޺$A5䓒Z{ê|<7N.;kNW507DBjQ.Xc]ןko%g z㮗 _)s˟!c"(L>[v+,+Tk @=⃰)`4<[$<-CA^<~y !AZ1yeE%ҞXty8D 􂋄+(uH)J(u~YsJcB6iTzWU6813 8OŬu4b{g1 2u2-`?[dfH>@*`q5h`"A~4 H@AiZ:t}Yb~bs[+8'GOB:@֥ X?Q}Dud]'Fjm^> rSX O-|Cm3uoI|ڇs} e x06XYFyՀ_Cd CRc9ôi Phx}CWԆaʛI@@`pBW~;Ĺmi~$~退Z`CcBL4F`F9z\Pڢ8X80]qh}nk48PŦzv;\5π$.Q;?X}a2< ܟ4Ƀ=볟JZ֠VPr.g(ЩUvvMZs+V%`&W pwlwg^1]'2Cd]WZ EtlY^s)b?;jQ̚LmnEг1T:`Z@gm;s_NLvH*g]`tL7ra{-8jFŕhqiF? _=GT}wHWd, #st^ #+@*v7*w! iz}>GΨ5%T#/*.x`q p(4u1<'(+T)50&\P * zeŒ^#;թ3 ER {m^J} $Y⭥_J l:O׌V*@nlUww݅AP#| xaGƦZp'xíwQ^ƴE@"exC)؉~J5cA%?Քn655º .$lnK򴳇\7^Qă k~k aS1n! dǜTܦabQnP1Vt6hd ZcfH /!-rۦ`v^ڞ)jF‹?.`&ë3**NU,dOȼW#häBZrk+g]_<sJ̵ iTmxcZ2RXSaGt|-fbo؟+\wԊǬvX@+DTzlECmf 'uصFqXZmXnc(dl+ņ뤨]yy)u);iICE)% a?C֠4֤E# o"O9en:U) οBC-zKyPUŎaFX#Z\zJIR.1`r#Dv +tA9핡bVԈVA8vaB8dy"+)D iXw M/J5aa}!adI.c/7TQnkWҗhyr ǻ!E;/ObxzxO.2 ;No8kPG#^"kTNKZS_KMNr Z6Q.Vkm j,8;ӯ5 fm"[Vz drv)бY[l_Ft2#YAo-XɅ" BP$ -M`sLY6* g>̿;borF"ð$a޳EANwDΣLrOޕQ$)*BjBd{w_)̫ ̉Z4X>‘p9ӇlJ bi',E;^" ˔M<ոaK?;VALS2>Lgl %݈&ޫh;VȈ"ՍΌ xy)yv|υg}yQj֢Yk]m-Nr.{Z/guдGMڬw;1^mIT\!K{*\W6EKI#zakZd(YjYw$yh]yЊ? lJ=zHϋr7:PYM _YՃ/n玞+ >3H=QMc_:Tؽ  =DC`O t$Lܻ( f?\~+WltKmr`HpFǙ DPa^|r\{2ƀ3Ʌc? %;VqA[R;zԛA@wBFzȡ]p889DCY8 Z(/UȦ( ٌt0^iv,p^Fπ:q00׈1:۫K^1gƼY+%8Qhݔ"ꔃ288ƭE簀Ɂʐ8p`spjc9CuBø@4䦭 : 'WJPPQepyEbzޙ3lJ3E,)KuAk}fw\ €]*@yWn^8)v#ZOﭧ2guKz\60 ',O,F mAp2QiWgw>Mp8P!/TZxۍ|mp&oCfpEh,؏4&#i [K=;l8FzLI{v/Thp|ĀJ€xSsb*6:ޠZ0*k#dݘ:o@am.niXa@Z5`ihѰE*0# σuVGA׌ʉD / 8O2q JYD TI +\tqj`Cjl!<}ku06q~A)v̀A[ |րր演 =4̅BZ'ˇ~0G'DT[qkH|;JWX|83t>3ȠglRֺj2[Q' <bV]7+Ϛ4V3axTbK֐# @HSOiv0 O 4D~ #[VKaN1?*VR0C8GolTq ε?CcƻᵚzKX,xٔBDPgJ+z/ 㩻oR9GN)._L@hw6@KJ^q<`TZ:694I-mP_ JN -3!ICBA*c(.Qׇn["*.ŌtMIv;A>܏ΫpSf}πDh[3'w4p-~;ҲIyZO^ LEv)I#07Qؾ]#c`^]iRTSLXp 5#o؉Myl$> uBӼ=00̺g8:%*1mWC}i6hi>)TOLBʄcu\# vVcS"h 6i8W^=|,.f:aJ]K=`b)|k}s ̖6Dyv#ʆﻩrzll#~m 1I#Ku%v{t Tj<)pr'!i+*\D#°i8C ұ"5$gi(:S]ש rw${E(S X5l ma_>q]s6B.UR.W|Cp<8ש]R{MAǫ\Z^k`5(n[yK/c'_Yfø><2Qm`9СX8̮g[>3סbLmt1[0dh} Qn U^GM3lN[6Hp#Sg@v.9MOOsIA b<0f܃\O!';#QıwO_#Dr:.W!ԑYf냭bH˾4Acff9.>u1S(o\z ;a!2c<`dL JOϰǕFnuj4,/$} 0L+1kV.?̘LVJ+d)>ck#$xi[4{3ez^bFjxfMRrƴ1ʿal Fs$zὟEEZleUD neVc}gZ{6|F7 o߱4P tdXo 0i">#LĖc ŀ]e/gmr8kMPKΧGss z1H MP6ZߩN6JՀ񀀀/x9{U&DkRQ"%!00 MЭpo(! P vOao<4 "ݔ J@7=?k7@optPϿ6~U$E{TRtKJpC P5 yv! [P?&3Q(Tp*πoB[̄ᇾF>G ,[ñh2:poܤZn8a.ATOt ! `׻bl.?Svdenё1 p\^s04Rh*_:bwa.d_Jof4@҂f?+[Sg'Ų͡f1Cִul9I\ UZ=ا/) "}ɷ@#>3b _B$[z]Ȕs槆C? t7N:Muv]~E3e3>xUp_a?Ke ~Nl0b5)09A1ċc"OAlލ|T1sM4B&0&n3B$&(M? ۔_*s& S,XKle Kmn!AJl IJ2t } E@ƮH\2 `WE7ÅK!#SppE5 <)ŀU'lFB=md-SAf㒲nt"1Q*n$a 3-{*>S>|p`r#:S6Nu0a)!^#%E<`n2籀#1>E-xӗ_4KGHK݌NDU?/$uZDIKTypIMg~]؋?V##\EQaun@𯸝WƓ( K}F[J`e]}5%.[b6*ϴ&b: 1Ăt:~umA橻r)cWx"!dxrNǯNx׏NfqDe.[E1 |lA^L6vR.%8$)Fu,m-H őgcF bW}q4amg؝' 54ȘkoU*e罺./W繉[χi >ݥz x}"Ύ m'RGϧW CAE`W0ӫj\^A|y R:%bj.8ixlNe5~j._Y$6ˠȓxJL1+EWiRYuO9ʻ5y!5=6msFԓŷ$KEveeP P-r9߶R ػI VkhsjKf;SW`{uf-rVG|4wiCZ¡&g‰ "ɾ%ADW uL2=ڭz/?tW}$M@;TP fI W<rR|X-5ܭ;lJHHlNCi%=aN_+=YMzDn/ŎE-} \8yU!wWIXSYCeFmABq X!@}mEtM"jJ=mM؛gloKdw͹7!&0ppQ‱AP-z/|}8օNgQ>!x0g}P.{=H!IAZ$ˑ;*M"c$jw/lwK$' K 1,wBa=Z?)3iV曕(nhXx8LP9À;)h}jXbNjVށPƦn_!s{AT*]5W殁d1p4Ghf}ܺ@~agGoR#g\$Um1H; dȤfZҺnT45If*.;RZ$:2Ni-L .  Ph"nUKO,ֽ{Kaq[܈j;kt^>{>EmN0*A?T=<&'ÚrpsGX"Խ+o!:ϙLN]TԌ/0YlJoV~{" <ÒJfx= 4hNM{ 8rZ t2ILj32O|v ,:eŀzoW,yѩhmƔap`c:wVJ%^VN ]1Гhl' G FJu}.5G5 خ 1 k/R2 GDV BGq%$PJ0mK瀑V:|gRg.q@b퀀qhxoI NQxk/]@ǤR_\-|'6"̓p`p Je:mqx|`☪wq9 8,Tt󑿎ȴI |PA8.)8֠TPJ6t׊r If5B6'yc _|}0}k|W\+4G'2Z@|Y=o@ߣ=4mS;Ptp$+;aTV$ÊFȐWبN%owɰ`#.TPw#b;]30`h%m9r`79`YY@? @cg"%%%ໆ4Z0cPu7II U ~ݷ(Iim$RHT_Q!dSG8^L3in ,0mcoĆ`u _dm_VW5ZgU?G y09\KRK^#ы~z(O-Wʒnn=olv˹ S['  ~@F4~oGнEu/8ۿ˭ N Yb:`Z{^YSoހs`v9Rt[(y,lud5ik1EЋxzj[άtf19yAe2 E;xC/ޛq XwXz:XHAϸTpE[`MŀU \!> EZ @bh#H {MG1hUFȨm`9R o vNntᐕ3o Y\GzÄC a _f7j@ÄBt~7u 1*OּE"U*ҚMPj(O޴ lcTCXu?F)ՒC~"SB)9AUkP9]SV[`Vrb y~w2ǫwG0&x  }=k" 7'-[Z~ APg#E)>jk++FU1m61ρp^ cb,̶?jv6Qg>c;Q'y: 1hkązgYJ@ǩ(KU0g1M4CW\ \|Yf EٖB2z 5:Vuv  Gj싹SD9r4 Tuo`,P tI;z k9$D -'9VYb 1U^2Z;:ѝObBGiIihxVGcz>x;>fPKA Y`'`qJiݓ!eELs"u'П.3:0Jsr(EޏDǬ ̣cb.%n8F@O2̜eK*DvcRif&gd=5t!t쨫v%uRĿGV8J$+z?Ca'@P/*Y^!bؔK(% ^xӲBf3NtfynTg F\|*|attNqb1J>6{R֡5ە8DƉGɣYI)«"p!( L;=[1&HH5l+#%SVTxmKpNvۀ5naE*qg<0Dm.7E\i5<|/𘩝<$<;ֈ|9AbK9Yü좪N )G\hШJf&c8l]Gjg.wyŹN^<+"zΓ:7o*"%G7f1y"*0K+d1.:QL+Mޔr^vW$QtyF]bF,A&X+g${#(*a\vֳ՝26|s_8bF#SCJF=!;sKM=[?"T6ombIZ[H+X{I?'EQi \Tsv~^AX9 Z i`PŎz@X *t[QP'nĕ:>{GgN?r)=8s7?lX>@gSϢ<2[k7O8Qruܥ#dop8 Pj9pb{s&VC]_5Xv~9sȑwJ3RğkO /[ ldxOL{}KެNUL:ch|Z\ilV1, w OX6Ț O}ShK?2z2t֭)@Z(p\?:w[9k,WWu#]Ļvt}?X'tEDKrˉ/m,HYuR"l(HBY#֭oJgj#?*y~Lei9 veSgmnyTO fJӯ"DKs8;ٮ2L ^)Qٸko l3s`݀b|Tk4ׯmxL+l:w>21$ގb˪XIa WPiBaXmvr$I"K!X͟.┩$Ur͋⢀pMId7Sn9c_Ԏŋ5@>++qpc ZCB}S4`f%-ʱ]F]7ЅOߛu @7ZZ#B,GZH }Zq1Tx&\AH$.嗀&4FBI<ƻ€~G 0F8SGU(k/[ BZH0dx?LxaQOp$O!`&8pyqM€be}eh%wz]){6af|ޓظ*h@ #JV?MY֍YȧK8=4U[T@c6BM͠Wl&)E(圏 @li `T-m~Wv,q#co6~5"ʣZY>ϏuW~'P飯{.T(/'uX~A@W͞^M&sQ` 9 8x 'F|h˓z !TV#VSСc:sG%r[;/sMx?Xқ OP @+`i81`!t;](OǑI3Ҹ{$-YE#<0ϝNʤ 䆮s{Crl*c9>:J ´k.[SdTI)bn**k>o!’nڛb Z} x!2[?#b#=&)c|7Z|5€= ӾaNcC@qڣl%gnʋh [풄OC̪࢔f =/)i,(vO L>n9?qeS'3d`Zb, Uy,,.EL )E@]lT {P wqҦ7oP\T =)W TRHsΊQ.L.sMF9l>׸311VvE8;$@Gbc+DpYB!܆ s\rIS3UMC~3& vC-^P)+ #y鑰t ޵7= VL Bc Y|ԥ$P\Z5#g a&'3s]6-`Ntu8Hڣ(MklŹ,ciu%eɭ 1"-W#bNC;h4zN=˂,NN]S}*gMl^Ja pM L'΋/pV񜔞8/_q*VU#vsQ ЅbTn+AcxvI%r.󙲬?zDN޳NQ0HBR u%lDQճNppz)8_ŦcE50fϹ03+0\{ OFrvgrps@:#RAOkSPԐBWa0˄ףQzt:^ʎnIJm;*h?$Q=+4Hm4 ~"fBGYRpa+ͭh*97Ktqz3yQ XL3BKR+K#×Gb¶zjjamcCAݹX o7H Skj8:Ag[މ8X1cFfRly+^!/V@5hM#Ӷ R2)śt{\ .Eξ-`]mwYL8(8!_х_z(f޽ /1yXzIoxFgx {MdE Ҟy(z2w#^2ZID8MT%U1]OxX`bB+2zI*l&tV.N͊&.??u'ƒUl]d@x0ץȈ i}V, ԞK$%zVW|]% N@ْۖ9U9PMo -̈@MJz1v71Kmj́X4\XpkQDI"Qz>uRX9ݚq* wujl-QQ Ucb3kd#?IcokeD?J Vל*z$&B]oJЎlσd"NƔK 5Uo/Tc\(O!n(D =42grc&;n'E=!6˳QPdT'.԰ j*pQP<;ެ6tSLטy̅.<-y W4XW[(7 ̈́ h0ģ><.뀀@ɇiFc܍-{bh 1Cgڣ$ڗu'l"AnUۄAWڢ?z|3-5kn¶o喫wG- J.41K#ԓKToOϖ=5FT+ \E" _$R@Hm5 |/ ?^d!$_pF w<销[ʍ>]nAh&FBeSDQ(8Oo۴`q~0"ؽp_54M: NHq VP56vf})j(Pw骉i#)Uԓ5>W!wag y"iq$P+(s  Q6 l+ ݒo8~U-(=9Tz4[hplCahPxP.$Ȍ hQW0(gP!r.Do9PSWY(b8LHt<3>Q LOXI}+U6 3T9 bIs^p9 `ҩښiOF!P;X 1Վ-!f\D=$d 5nPx%*©sajii g\ۗ0( O}zҳl͘i>Л23ZApql4v6i1E: ~'d3 ~} pƓڙEz݇j`L'zC\ {;//8ޒ:0r=A)J~oWzl>=3'qկ/csk vU&;!KHq7!dxћg%*a⮉+$+ɥ2DVC鮀~ 67oNF6+pwW\]oC<2L\eZ- (xXĜ'bSu0At2 _)24Ä&*C,2.)0{Di7;)BOԹ+b]DGEou"424[5_T (Lԍmbrp8=6{FyOQE#⎭Hi e+/ <-cZ_L5WC}/4<< x3<,ARz)XQGךwYkiBgVdFD«&0i~pT5ix,O^_3 HnVoq&LwѶ62mVZ*sS2 b0OGWGм㈱S# q#)<>ĵ]>kl3q']֢-CƑϔ;f[BpVyרu_FnTAGL0WAGv2,C;iL[b+ tkanکn*WhVg CXPA|]&U1K uB%%K`7xt+Cx}PhyPxCnI$ )݃r "à#axݣg= qi藢U RyDHڮI5vo-~.6&|C9qi9ԛ+?w6ƅXlx*V\' -D2,7A{sS_B5/dK<jSC.ޣ7՝(q@c?ɥطI][5Yotkx* lK瀀r$ive0b.(Ŀb m=spͲPxpz$e}3>U6a省_&I9#5}$=O?۳)"iFb$g%#bHgg;Ϛ~[NmcyaWג4tB2M[ܤM8~&26x3g/L~ .ir8xܠ 6u4`IMр0K$- tˬHCc-7=h#0L,ʔ mOS,+ivh"=E D_p|ۀJdaBjI*6_p"MuE NɗJkV_l1v ҤGH[0 d!F@i謯:4ФD(x5sj֎S}`s"K/X6tTֹá$6<pc12W@1&$4 Q@jp>\\{n_*=;tYsr'w\Gy'/)^딈mbbTI  qiƕn_²0b?}mؙk>.oe$df.5*^i 鮣TT7.IQ]xƯkz^/"!jQ)E3L7yS5v.Eŵ<'[#wy1;Kݓ~UlӬxQ1cKZ.CfUVp[c!cډP@v q7I#->ꗱba#Uj#4> JaQ&u;&DɡlɯUmƞ5/Y:l ԮO5EyPkg")++e||)9G ~@8@U#boGQy[aꒉ41 ly 5HI Cd JJu|~lE;(r3F4$a5jKt?6 qb Uf;;N@pp7r۲@zNNMS3(خryB7!e3XF/ x_d+ҿ%\ԛ f赤P|yF+##s9mڃd̢:9٘)ʥ ΒpK[-5? .#de82ED*^; )} ((;hDܟ .L\b`U(,ɂ'̰XCPw>:AcX7c(V8Zᄉ*Z- _K6lYkP 5bB$[9M>cZXɿK8BIqྗʸKlKд8`Щ_f{I 2$n@ Ԗ=N9O[p Fր1cm >NW` !oKX9jd`Mξ@便nElqQr HӀ2 +xNs1V\M*an「rVd8%fO۰5B]o=$=y9]W!)# 胙` `r1ATX5HȺKE1K9J ?#JP: 5N֓RWI>2i_L._(,"쮕Xy^}Z_xKV)tN5 i3c$/P>.!u|@⧟D!1"S YI!2R% :.SJ9v-XCvF5d4*,& 0@7]J:1ܳI{C§8"`%v;M;5m"] ~HbO55 psUF^x/bl^;r#mdܬ]u68K޸LDVe2<rl"+~ݬuڕ{.˿,ڠmG4 ?D4+K9RU~1.2 u2H: S`kt4Ahd7[${ʖnQo"h}mFer;E)iNWߐ'{ghAq^DG5jrD57#i @|NW&#ԃ8# 4mQtr.d!떥P'h #5'P8enmm #NR1< KeiҀ7ʮ$'gdtMm9j٥KvC_Ssw8 ӓ0k5vp351:Fi Zl}Xh7smj.jp4HXtOTˑO ͂oMj fC]4-I0N;j`;3CdqEHdƓbZi !QlFbilt '_".ʘc(\P@幪5ԝgΓvc"xuU(IOȴX._սviS 6QH~ Rm}Ǜ@pN`LD":"ѱu_uUI"՜vꕑ*߾&;(!n}`73Pi~녱?I(w'k7 8ƞn7A~ƹ9 ,j#]~vЦgS ٴ9Jঋ]Ǚǀ?nLgO~s,?5ϱ y5S0RBuXri̼ #5$ހU=n_yD1^>8RW=l2t6;1ۑIy!lKGbqܜG}Vjp|#LsphRCj!:^F V[g?l-(Ʌl|Z?q^%6l w4%!!7;Ul%uU=fM*F 7*[ lI2RєUq \!6 M4y#3kB/Z>/CZNJ|*׌ثQfq)H\f`ϽN2n> `{ ;4Zv }E9 ([FwI+y>D#S<ݺE,9`~m3if,2C\Zmhufx/h9ZζgPS]j1p.0ڄҩ'wZŒ̝:O7I$= cI o_puM`"|Į5KPM}ӿA(邘zKR#f[L !̴GN\S0Fglb|4pp"P6̶ ZZ _fQRtG*PRª%6[1P@^b'={ a5<;3*x%Cqk |`]Ă E v>V'j9Cv|\ks_7+)H.EK#VcVAB_2Cy_rB+,QrXUdRvV>cC#rFɗ[`EݐYkV-[nqi}ە@q#uZ/a`'F '=3B0:K8Ƞ§5wZ+,0oCr -&Q?nX'Gh8(޳D?T=8 ,BHM[=sGGW[Yl&pM.[W;sGM򍆉H1D^sg ?Ԃ`9p&25fާ̔^^מقetJ[&CXRl ?T"3õN)F| UM~GzEIXO4jdy܄**`d-DQlH<y$}o7[^V Y9U_{K .s>양d !@d%j~xM*:I8dCCda.l!/#̭\d˓]ɶawTfN`;]WE6"ȸU]T Jޚ3EMp2ۦٚ/̱Sy,jO~L8w wX43ok':s>~;aMT3R^ZtHoH#'nW]Hڼg+`2LpZ֛/XXhfL7jhI+^X'Rp{ls!ZڼQe/>ҝgQɛL061N H8AA-tHVu6۳C $A|4X){O}\\I V1yE|.ؐkJNS 0tY{v^&.\ M>ZyA$jmh=d/q),X8bf@ߐĦeNq,_̽s ׿ [紁 6mjR 0V+~<S7`Z!9WДɖ’-:SF:C\.#{c3׆Έ4!o3 8!,6AP`j[򐣔&*?K4|?qfώͦ 0MxA Z^2"BíxrΗ!f܈Oߍ N<N3TkAE%L,*ض1}̀\,О_{Nj`t~I #20$_(OɁTdXJK,ֻDh'%oPBĨ0+~d`́g;8:W;g=S&? 8dła#YwpA]ff$VЃwdhRO6Z@䅞{IfFap'aHQۭMFZc*Rוғ7#^k5K' %gLb|6y3/?<-%BPG+2;0bnVy]Jg$tY&1F]: qtp8(ebXX`bƋ4Y9 %r]Kisٮqƿ!zyTInbzA8.)o4ftq[b[BNS9"a28xb!3NWrWOS@~_=O[稓b(p rh!^X 7{5R[36㦁_Kg}+b8de}h1f&IAʔ5ޱ bu,BRb%;VJ"m''z I/2Y#*Et,@x4..Z/y$~k6X%(n6NQog<@p"$tlσC): ]hMڄ}B%C5c_h4y/:7oR>[tE$('cDJRehDEGvcr~v|4HqҠ\"!qa~d ڮ|+8L9ϔaݸme7'$km׹chJnGHعfτl [IfX[P[x}!bGm f;{Zn1u'%Τٕh5 lO 4r/fz%&J6*nc<,5atW<]fb{ 2ՅUwxV[4mNQxB H'KvkQ,'R ḡ-v3O @-$Q SEdYPavvb%N R_my1H70B'6~$yW߮gʈ_K\_JAVӘ $%.Fsdz?Mӛ셟0=D`9)5M7Sq޸4ا@|.58\Q LѬ)N=]1mdXcݐQUӦDCV%׸0kiaFqBj2|ZU dXW"m@0/YRynʟK]fCT!^o&)<A &rkZEb`CYsb\IxTU1Ƴ@ G@C@u) FxTzF4Bt/7* ¼~Fjz S#!e{iKd Tޝa'V@,tRpڦG7AT`<fu}JRF|ޛ4#n%*!]f!Y$jfυեbk(ÖfzyGPM@p,H)2ŝpML(S23U%lE7MTQ/kPHuRz331OcV_π_6lLەV|<l}oB˼l[>i}i(9?"]f54eHE4p;Nh0:t (& :/m^?g{=Cɭp70_؃mu=heՎs9[VUˑwvb7HaGZH )G#Gu?X'coh1fcfA9HAY 3i"H J帾hm,q'xXA}6L_aK%'8p3KUXϕ#]"Q+e9=:D~Vq>sb/? >itew7 E;b^ 'Ma }еh8~%Ru 8T˶`0 i-Bۍs^ރ^J Fr<$Ce$v) S'!KN#Opig{|+zHE j_o,fps?8~"> 忊nCW1Mw+AKe.nw u|ݍH%o˨*֓p֏l -A6 FPG Pr)}SBd}sD9gPr)IW-u WzԹd5)-`Ԅ_y} taAG.Ew2\tK0j66-Gƅ@N|Y.Q̊Q'4lF۱ S7 ;a4 cПm1<&ͥHc,g? T.LUh%>=mjkq}[Mg`R_;;ٴ'aaCE1q- }yn#4>wKzE8g=`[9L' A Nuond Bin 1:2lO!#_*^kJj[hy>(T*^ǧNVy &ro{*.Gp#pl88"&EYS{XtI 5DM6CD r+"fm3˥՛/m܉-oĆ\e%QT9(+[Ȓ/IWfCs%{}&=d .g+~Cz"Z3fW.M>oАvrCe,] n<&RÖLNpf2qF$-`E!)/r ;Gɞ5i47+\Psa>2wǻNͨ;P 5IZ94/kص^35ddǻ)#5؜R]KC)hcXOC, >+ s젤Vm 5X lk(Ml{EAW3J~y@8]XF ŋAb'˖.Yn2= Eռ@k;; MZb?de6 ![د]FQϒ+ϵEW }4CXI'w'<뀺S :=aߋ$kܮBe"ݾyKaJ0N`3z{eˋYu(g̈ ˙vwVRXf jb{NhD'9.ېA9w h"-N}m'9\`[פT` z?B~YrxX{yl|z@ވ: *Vɪ0kF[GZ-_Pjŷ>FEu|8?Xqb ;s}}t_c:p܊f-#k髰ۿVN87# /_ydp!I6`?&* PNsYY!e'H z$Cei]e/% XXDn0#-Mcf3\-$ ;0iA5%ߦHJOFw|;?JN]"yw}Ь[@f68-f/O@g;zq ``x6Xb  sv}TiC?*Ïfu.{; Fϛ,N?8f5%vM5K@48tZΰ?ʅe7j?F%P` H'/U^0*C:1_v\LhP)JN,}1!i41TjƓ"ͼ.Պ_|7%Ѽ&$Ckb(RHn 2hZlDž"JbF}0@42s%` eXE|t\VW߹Kl;g4TT;Udo/J?8 IK?={H XL .4Sa9"nxc)>s*(kI;?řU ]C/6!AۂMX?i@zijrR9\\=SɆ!AXd:аLz@oS%Ip LY5YTYZ_IEOM1K<9QOc 9w=o@8s. HzFӟPu= ~RPΘ$eL~| 0?Q ĺڪNJVґt*HZܢt+p/{l:av`ܻ=kmw!6{xف&Ūv劔qbӺifg/F3E`B1,Zb T}(&7M LQA>pT#R$Z<0߃̿T!@}{6BIenԁ`>3r 4ȶ`؜v$ <zŃ߹c\A{%\r֚:]8pLdE7$~Z'ybM}:zS7:KGqW:*MgR1b\}T Švھm/&O T krޣ\D K,|v~}%B5C//4fG1=zTޏ92rgjԽpv%UL, > 5rOǔb !w\I-+QwZPMyZ5vr[m޽2Pm%ojjeAinAoDf89,+cyCdՈ9s!D%,[m'gѠ|ef!IwW~| cUD![h>mD?= j4ٓ咍W\)KfTw 5r$gf OF+b r*XRn8AOW@uoq#YKm剮wݚ=r@O\{+=$r},:Vc[G)!DQGB$@AbZ ̴Z&A[`@SՅ 90LsRS \;PCc mQ I̿VGRw-ۋKE :*j(!l5cI$?EGb`Nn$.Fȏ1|JW tq\[afޭrZe$qUSٯaխOov:_~A2ׄTb* Vbn j7~Èp`W:Ǡpt&BH uĔAD!4 mЙ\{1:SjP(6`k%|R/:9`Ұqm&n|>ϵZ Wc;9-LMܠ[i2G cmZ+NX!Pn9xEye{uҽ@kF9iH@/^B>Őݡ̺2FiŠ,5BhpEBx=m o!.YL,P_$1w= 0BG%qZ6IZPUɳ3"x~$LN(Ö*lbao}ל|8a1Eq hUбW;KM-rYaPR;Z[Jo]cXY }I-/y_aLF8ė1?]cnl<q`u\1C]Ry@"{A|O6y/f}Q5blCD^R-P(N%mO-q넥FM'S։xI2⇾m=܄;I dE]6 ?EA-SRt{B[}OF{Ʋ Ɍq`ŕ R44kr+~v^{}HYeBsHz}bd#xF3 UYp;N p] 8elЦ;np'\2_!8pbyt#PeKfՀѩUKkāP<_[< .XT@.a-qҖkiLŘ#ۭVT2T䀀vAo*p(!*]/|n_Rz@:p!zPp*:ѾddȃPN.SNȼ xV`oEwۈ ]+ k*`ܘ'Q֜!!¸*ܱU ։\(MsYkZvAًr}-A'0@8b1g!uվVpcA?gKZ΂օƤb H0y* 4<41NUٛP/H|i P v˄guZ"q- }Ynr)4XW_ 6$Yw5-Ǵ%n]k}b$cσ%Utwm4k26܈Yꡃ4!yxd+4 Gn>D rRrm.QjM*QOQg! ~#2k! dOq/)m$K]׳g\[kVܚC?9#R!vdnt7wy/r\E@N{iVNSj 7Pnس_fuH\i[(9yaȨkSquJP\cتY>e]Lk K(o= %#CƦzkR^ _eZ0D-Fz.dz3d'/nRFG5aSGb5,ߪy :ۚ>|>ttI1hT*=<݀9#> Țxm^.Șy+ wv=c>娿w;1` Tu$ :[m?CA3w?-$^U'JGi_ 7NC'qF rhӤ[;Ӡrҋ/l \o>&jNg '.ϼ24r64VbW zkU JieK+C4򨲡y_*_4XU4#*I RJ2 = R±ӆpT4<8__?I*@5R廯wKond!/iŒM$4zJMGi&[[ A=0 YiƯFi:Q("m %Wʤ,ԫgv^߸>mw%**aa?G7o&r)vvAb4k *aW:\o~K΍8YM_p9~?(oFׄa˓ƨYb37d9PTemBb}zsΧFsJ=j9݌v-ècaV1즬L΁0PI{Ķ[ be~U$4WK-ǀhH֢Ӳ9Aw=Td^*E~ڒX4 ?<U$cҜU:ckuJA+DA<Hi@[gU\.΢qPދ|涜D`"]р7y1s)ҩY(\]=- k: yڃrr [_/ G>Уg\7K(27/hԴ*^O^W癭:TO×| K+aՎ,5g[F.յGyY{H iwHpxNwm|l,gfuPQ@@kfQEWv8wgCI+ʋ'>;B?;3#R0ʢ|uАōEoi::?oy[:"R+r1@GR FR.htѤ $4yizAS5L lOCO^Y,Ո}-yB0Mb0eshbؤ5vFӫD>5*n;)#T>r8u7罝uC!X.J7F)_k'zD۱/E<$+a˰()K3o8O| !qZ!40 }U{(Eg֭x&ooRԳ>[dFpV_,s2S\f)uS5r5^^Asb+P}HD{aR\)Ւf#ΨCϬ +^3Zy |;tr"[Ǎ@<=44waDo1s^A&Ipu#7/g2vY 2 } _tuNܱQ[#^1Om vPtyg2)xfTLij^pYSу,vH kCEv ):U(Ђ9?da (*& 2z Ht+9[˜I ~E-;PRjc/kWv ӝ7ϽYo VN$ѲK:e|@]PҗP _2A04n4<ˈ4ZO_SU*7k1$RdG/S6w-;A?5&+C,;'K9/jN[q>}*f_1AF)%iJ%c@n1x @cEr*DNNa}$AURN{sCXX)֩,'&*bEuzK1dD=O>&yx#sh4` hrh6znٜY5 Psv`n Rf1 M1 6{?4i ԫhHe?p+RhqYăQ}u]kvQ~yI(jY &:6 >qpGםOa- ͆UP˱568}-PjAOCjDFO#+XcL𤫴dbKU?ҫNan`%  )"g<\b`0r Tn|€Nk Ӈmhރť|K#q%nAѫe }jWyv(Nh{Pj-DEǏb`lO E!;f' tZJTt_q,$nU.K:L'C&zשe3灄|߇Vy]Q<@mX,lr(\lƃRe$bY=2 |Vy66ZmvjPfh[J%Uz' Vv"e›+K=p6ɦ;Zq%)`~ 1xGeOTӵ..}풭? ORvyc@[?{Ps&?HϞppEZImkhjmV1<cӁm@Qk\SAtD-*EŞ/y7?gj#?Qu`AAp^f~9L_W1N/mipFr<&6, lɀ q`鱒D#=k zpޫ#%6=\NԠ a+@ςQIO1j IBK h))0YPFq |YjY(j8@80q@IQPFT1UHNpH`ҩ6A ƀ.CuRm68$ak{gGTMDGs MBbGbOfE]Idj*kPXr6V䕲"w C%3mUD%ݩY "* wl LWw3*I4 TA!"0B$ʇkI%c=_3Z=ydfq*'7r^ J|$e`!\sZ̖o#A7xfN9N*vRӖnԝ]MD-+KvхԫK <}qz֐VP{n/v6hAMIv>PɁ7уvW*a UP \H: LHTd'd!-ރ/-0L' U<c&*w#$~KalW^AɊV9k$(|`$nV$ܪSnK1A';X#Č! TYUh~n;k %$j@5NQš«Xt~FbWk++c8_^5v u%}dz}ME,؏\kL ݃y57cӊAnlcoeݍ12w U i]9V4dsR+Jf/M Sa@a14<[wC4O {Dn~J)\Z-C< u]i./݋B _=JaZga﫺`D YC㷢Fe?p0GݍVkV(lԘr=ǽa%- GI@Ggw :B/we&g~ﲰH~*HȔ/sW7j! uyF?7h=qg핒r׹(g+^̀ {9*jJZ^޷t 랯 OEsGHra֍0^폫e(Ѹi[I_BÚfϐ?%"UAVRLp~@UrTB[4u 9 .08 #U;^v7 d V bS̢)Ҥu%O.ݵx;$=}5!O} S菱z*g@1-]fjfҥ#5u!q9<*m_ɸ$IZwdx_ųfWNnp]Y Y`c^ܶq=8*؀Q/;;ֿױ$펬PPy5ㄗ%Ę󾯢w͕xW1(6>٬;PUEqR Gt(#>l6Ts!O{7ᘃܨH :H=*.|^}*si]I;opU/PUܳt9v/0&T.e2pax '2znC[G:L$'QH7@ )zX{M5p6{G}qnZg>FME\ژYu"+!٭ضEB 5K;XdžtߏCJjX4( }H̆~L"%$aq6}Z~*U/G@aJPxe*bv+ĪoD f:љ=",U8O(g8Wχh;ȥeE W(Gxa^dPDTfPkT%L>۶7 EQtD^*FUxϴlI-"=@`A~sx8"( E-)qj 10a4Dׂ1=~>M08HUY\v 6'=`J7PL;3(P.>z5PȔ"? Z>o *ͩjcL.FHuV-ib+2\+ӌ2^U`^tU٥TG4R scUzfRl+S}t,u u0raֻ"͈nOl veC +5,SsE]; $OԙKRL(ReƊW̜U{TɵIү?aovi37S75HQ*02R&ڹ[yxdHd̝Z,9V;~ϳ~j[8h[U}9}L7+z־sjH.Җ.8;1RCrХ2Q `UKx'8Hx' ^!NV]mZMmhi8ar%tn&O!=ȕ)t}\D|GV%B :oҦa!αunA!I1z$Uw>ڮ]^A0X `nD%iZ.Zlaa ǔÚ^rG!,h3;*66LVIsSLK0!4jGg32v^ċ"&8SW{õP Pbzydz:Ra]~ [y Jo`Ql]̱hǬCœ8ENzH-WLBҪx׸r}$+PyfR3NFB xogU3=- XF{fZ#j^娱 oz [ m?A4A/0e|{/a~ .hꕉQ2qk13HExW7Rjbn(I:!J@z _H"+zP+Cժ gI.4G545pڋ<5 Ú9bĴ)97K[&0pڬKbػɧy^: 02oS6Q>TSB oq&t5, ike޿zY)6BH6`<J PzO5|R1{(Btzz0d^EO_jXP?}<+!ڐCb̒F|XʉP7͙Y?]-yE#~VSi}-jYaKoשM73*iޕp<&}C)D`V;< IgDX”mV}8yQTg]nhv9~{+&z*P8Hmku7FggXuo1rSx9-5<2@y}Uw 5F؉I)=&j4) N((}ۃcZaQ,4_v ߘ/gL_K߷`ardD{f @Ȉ3F)倡8dhÄ͒ٚfD9mx* 3{û.:& %w W33BXZԹ*X K u«B4&v(uBpc=0 a0^Tdyə-vkpU/Ԅy i9*lT29i#X!'yabLL2;`+[ XPqZ4]L% (%;?%fb5;-%¦'.c YY ƺп@?!:L6u?\{uDZs J7u%NjWp~@B;fϕW }jh_TX) ^s@YuTi.>F῅`^ǣJoUsTU2'Se.Gz߈M/"Bg[ 42P:zuxw%k0CX{ oS5s%aՍe#;"T|f C j8\ÇEMANpVQCy8. ;3Py?IZ9nѬ<9&kO{_9EǠJ5,4Zgf*&@ŞjmV43$2XEƞ~ۃ_16^(:sPkZs05uیZf7!H:o˄<0Bxim(29͊F>{w؄]cj@=eA6_Y0 b5lߩ/wk5I;"B"lLs!Ҽ`VlG1ű*Gڷ#f(8P"$J ! (`^iTyQk=K<.9CڶW[L_n >M*Z]60-2a NJыBMb) n{mDf'!g<˟  #p\Lx<XuS5 Lh4]nCI^_WrM1SXG#?yNrhE5EKx ~%NJ'%<]F$4h~=qfn53K$.1Rʀ̓U v8O8%+ZYFIwOު3CUI6T ]5j>k_,roh`à9O >2 9]a}0U'#]F_`:'Hal|Jr.ɳC?u)Ƈhe3?2H`+0׌@K]Ր *1= Rұ%z44CW]I0QlHO ytYCt MD>gRFzG4 \6vlՉv&贐H#0'<0J#C_`).zy7CMRnuc)X"`24W#l,w4Zb(sē?h&|g_"pj4҉oaE׹LVȌL :RU>[2Jen:'Enau\i+φԦl?ջqyH&KZ.+b<3[ ;Z\)Ȥ{*,dyԊ9vMqIy;tz^ -?<vLb@{遼[PTNF j)zEyŢ &t8B){Pv Ѳ.p̏M49 Xzy'2rd۫ـ\I ,Zar4D%%$ MFm8̗)^ϲ&VPg ]ZhH8V_>5~$"Ȯ6M B*BcowlT K i ףV;UxML"*[Hm%6  iR6@zQ4#[2/7qc3[nKhOfV Mb+~yÁL)s[!z;v̠fuն}deۚ!űXe 0F Cz4l4iZgk-Cvk|':^~XVqͳI"m¾'}(r®%%)|1BcSo}9}@d8a'g(e9=k0t7NckVThaCx+" GQV?ɟ%v` fVd;-9cةsJs6̭xd j{ƚAħt='ӹ91{E/.O/1.O{tl>jP.>.;Gi.4 Kco\:r:tm2 N:_Yy_Ps)~$O>7RGb W%74:>r$׳/W4ѹ@Jdiuu8,/Twk^i%מAU?:O1W0#hFe+JxVseMBixhu 揀<U~rkfGE#˰+?f]cL<.x%D$:HҘrˠmQȰ|v~VӚlp\y\EDywmZ/ewUy~!ͰW..͵&1N{krxlN  ̃O{35 8:%ǀ7P. 4Z92(jʜAOQؗ`ʍU&Y3I5@.=đCzg*͋Mx,+o.P~+T7֞mt|%8? U)h݂><|C#FT*3Z6qz"MM UټQL}7+UR(^C+SBMp5w.ђ+!uEd(o&Zǡ)[~ܞ۞a •Ȩ&ͷM/d|0ES~aygχq@Z$=u pwھ ´u*b}bf&YL?t|mH1<=gS gKNur3a DŽR!lt̀T]yU\#TB uVoxgNVYV$c汔֓!ws`m@k~L#$-NFM%vӲ{=ߴH$ 'XG!?|wwoev38+w99VDvR8_D",fu<ǘ/Au1r%R"}W[xxՓYhfx;,?S ԧ(ڪBMSkq18BErC`+]'ON:tPw9IreMlF`8Q.<]3VV2s'4}9.,ȭ,@DP}x &r5Jv@X-tAi,5Rbкl<D48c()G`}aDfh=*B0H(|خTG>h j?u9ڑKơֶʿR:1>CƆ7 e,xccd5?>WF\P_h,Ŋ vCN5Bc`5:rawOXZc)c`J_~z-Me9?4V݆j(aܡF?i5k@64WxLYB^w faԂTD_ib[50cִ%%}?Fכ6Vxo,0qy_C E13[VV6CxeK$T{$!iMgQ&M }lJ0@VI揿l jNh[9|՟jFY TIGFw1˯rDKllM2Fa 馍?-)gW?,so ` dw×2rL~-8CpXn7nsja(I{bhT]‘ʂ;.DsS.҆k֬}tmmրL5'Q' vo=c$\%]d^̭ bBKػmor7P4zwL7VH?>>hHuQA$Op/!i L |Zb&lय祻 j8k͵+PaKZ휆ឿ /m= bCqקwY)ۿcFlhk%?JV'h ^w ҡoGQܹ1s&lJq%,lbb'6I'ʧ֖ XYԦDT}Ѻ(aSTm- FDiz;L}?-bDp? ?~C5)s AzR ިf&Z\1b=+/]/{CV{-}tퟁ ;M i= ,1,ܚ F/5m;Րd9 XZ|?'ԃ%W**•V;LGjHkS5} 'M &S¡?rƛ`-@W |%9I_Y{p~ !{Yb&XϨw"Y$F{ؚP߾-(R=Mn'w8spD\N<|Uۘ@^Lo2HⱓoM 3٫3~ c1Ӆ{-7cq|6ٻYvER7*!U.+(+g]r-.9зfKny8ܺ$|rGH$$` LKHrk`ket5mda`L;F#TZ/gd%@c%߉* %qk.=|Il "r/BTI{ؽ[grs)Dh3|NR0!LW4Ҡ(iqQ Hcz=|kHر/ٛ3.LM̋UPgZ(PysЏ?.GD VO4|ʖKbHB*R=3/Ǒ>BCpFHkG!fpX1w Nyej rq! ܫV#AmᯍQ6I1nEqz'2^!B¢qa2ʉ9\rgRf\ƐGJcObe(I{ X*>4}Q*XП'>DޒVNM2#w0^4otQsjq7O`*@dSΉH̳-z2[}tK8eCNw5rH0͐2Žm&}FRbc6`VlC%KBB1"oQEM*πQq p`N.]Gٮ[xICV ok=o*qt0w+58Ğч}MMLdE&,>쥫{~q6;hG:J7Wgb 64r[%o)Iu-8</)͖}>b`=َ)dNyI$2ZO4lM>No>cDl_pcxqz0۬OPl!>k!%~3SU\A`a` *)BL]y~9kyu,4w'gWM5 )0R-Jm`x `<Y "B$u81M~lAXHXEWOB/m\}rS˜w4@z"'^N {$~YK?W8RNM LwR*<2׆ ''o.]zYIVc98=S85ߨԧ@hdD'1kGd 14o’B&Z}oJ ~1/yt2xG?O’/3*!H/GIrKcFLkԣkNnfIF=UI)V0J fEҲ.֔a,!'@'}ȵye#0*dm@];޲3#UOsmprZ⺅ lnK5UKv t`F?G;ey^׷Oe5N^@=(qN=(L\"sTD["ǿ€ Ù+`6*mzYY#ʇɷ<< o9nLBIdg%3R;ˡ&.Q#@=ֳ@qUB΋nZa<Bz7#)\cU@dkHYm̏ 1Cz-aod%<ᄙijtA9`/h_)P@#%V,Ϡ?'!0mYB엮ԉ.Jn t~i=~{^7HgP-jRuGttֻ_$*Rlԁc~`Vwi,B1,g?ANFDB*|MxCdRB`Rju CVy5Cվt^o#K\0pߠWqh QyE/Kd_8,_zeXu'}\nh _7͈hb0pjf3 Id%pa>#3Õ c)z}9GyoSYH@rFi M4 Ӂ :/KU!ܽ#84Vqu/t`\fWi!CK왿tcn,F2[vfXCc E"7>*Z]=ud2ub,JdC'N}ԷWM(H\ԝ|/VH,F$/ITBpf+e#L< ¸lykC]e,ne!/aA)3BĊJnB9g9S%4^gii =U% @dMk.d(#ٚؑ+ d\I㯥=×Q޹SElI5T @1JgT'`NjK:CzM"}P}8Cw1j5Kn"|$31Z< EӞlm6.^F'w|Etҗ2J{t {K6d/7G󒤠YRcv%>Ͱ .l?F~ x,cm#.eʻ>o[vO65յb8cήvN82bx$||?q4kKY݉OJ+i$v2'54 ݠy޹a0PPqW$-S{ɥyL2h.Fz\"Ư(犑YAgʣB,EgTO%8K/б]4B$LOn~*Y !\KqI> !N=uHp4.>}W؜{sP:i)ߋz0Y9TMg0ٕ&Mtu\nST7Drc>-F".4^O ĩ25=bc\l|eO?7)8l$,&?w(hߺqؒU0 K zNPV3߹ %ߢ/m|TՍPe'z2:VKsQ@Osx:v}LsI8ܠliU1zNvg K()ǎH@(gvc,lxA^T}E$Jي܇Z`wxoY ߀8fnpzcq}>L@Uփ0q.QHVNM`hyGoni-?i(X*%}a.୊hNK=XE XF9VC7)t Ó.&SY$֦ͥ 𪇬y UQDXՈxcX+c',_Gd9Jϒjb^"ڏ˟{jὀ;$4rN{]6??7״L[JO3'%H"2U:j _!QXIgC'h6_(gٝd.JzSGg{Mq<(POJ؏}H&^ɹ 5s Bӻ9UNTH<ۆ8-wx=i<s=dv[:qL4rjDڝHgx)sH#g鄰eۧ0!Q `G ~ebM!ثjPU 9)}E0jWf@Ӓb"}9@J"ޫYyP,:e5%rW:1,+-n9lsz8^A5rl mF׾@/]h#[[}m%̖uU-?.IƘZm.Ri aPsBUƎ;iS/E+nxO&l*zyGp CF -0Yڝ?ξ>FH>`tZ <!zޖR驇(g0B+}mP}rN}JD.9 lbK"f*TXضxQ9=%\2[Cv5 M:Uz9JRi c;`:Ͽj䍁n& KvuD-0 DUG~P9!=q+[U3@ ~1r;}$`BHO㖗 &_hRDvDGj YTX̩mnIN{kcpm-[Tޟ4 fI(uCb7LBK(Q2qPlPQO RK̊Z& yP.{f^Ltyx-?0oMT=e z%8\Ãl7S!D}w99eɜi%x8w?9ĉj0qBוik֐Bܙ|Wu(l/^^PvM\۠Vޟ:"\q^9-aO5s D'NQd~$gc`7$ ^gi:HQH\P=5mz.a 0X Z ȷˋ`7#8.T&ie|] փG'FC1쯈' @cepEɰUg2$`hn - Œ>*I5l"82>J_ dW2rb:4PH?yU%F2ZY4A"L& Azdi M GQIIh| &  =OsXGHO הu5G5ŷ,"*[B8 z},5Xu|R*s]zpRT7lC8b.a햊v:F->nA.gKWK=h{<;N^DIW4K)&N#XqqS2a&5HQܓp[Kz)RӾ L^u!>ݨ$2Ԥ)_qzZ9_t+Nm,hKqs iIp_ŋg6%N𮫥LJ֭ãS%tg9vFb,{) n-)/<3L5|-2YJ?F+vx68#dbJW#lN[oi|h_&Xw i|wZ)W24)8<^4~N\*n.SMz~i6-[L S`Kej:AO8@q v":8糒I MaFf˝`h h(ڿS>qXqOa^!7`L7.g۩zi;cedF~+Չ3ic8]? I ,POtb'VZLw:R/ T;WB6 +wb>Lj[/*hwޅl$F&:G 8T*7GSo<`72~av'!pDKIOpHrU.Hr.ZH*4H"I)·+E{/ D2fs<FvDeF?+ӗ>ʼnE&)F*e:hD0nCiA'9|v<"8_ 4䥒mC7_o(G vЅY[BOXj>4 Y&R]u(Յ6usL)gh ILgGdgXo2鯣[7oY(ޔJ# 5jA[(۰V;cO rȎV1PNkX-k>ҟSutR*K¸?|BMGSGF  |ndw]Dخb:!I e8q`syFgkݴŁ:9;V"N,7qHcꏛ 1Ps&^a,7R$σiu/ Ɠl54Bݔ?6x?+ \ BmrGe_dů2 .d抩"C(J~C?0+8!ߥ[C@RZpvҀ7(Mf9C. 煃SCµ9TrPlF{-  <'5)Q}v:%㵶?:+"RI. 7-_'/gy6D] C9ʉ`;BO^͵,uX'PcYWYףYݴ校:ny^l zW$I8@;JaD?N| 4eInĬN~Z7=3'DŽ^>]JXu=~@h5"TI!e\qHK-pV2.>5(1% /϶ǯCl(2ALPuDP*Ypqvm0)l?KW/Ί{ròE>=8pvb_ d+j^wH;wu. ]usȅG'bym:ȆnZ~{z 6㢰ujZ<kZf-TR2@'W UF]Rx]S~[L&6rgL˥01/#g_)|`XQ'cGyǤȎM>f^dDaAG@?͡c {\q]k|N_0kٗ abٍ_A3Hc#2B`*9쵪GӓN'}қj%β.rⶡU$Qق ss'Jh +?tD]O җͫYm*Rrq'R<>x8MLyWYv@Q*cϾѡY~3;@S^NH!(8 ew:\Ap+vna^y/*LYhS㲬r5!ły9̇NG^)$JoϞjeJoTuIM3~zs⡺D) )sXڥf`J;h(Wl%4jy??!oExR9j #mB lk0b{Fɱ9!Az7Q {n!H Y6C}LVB͇fP=}^}>6F2RNN#bv:c*5}6FSpu:_+f |:fdc 5f9''7q1ue#TJ WJԏO^*ז1*ʲւ~kTǜ~Ս geʱѽB +S:Z磤)@nY9 HwHkKMT3I n$rt0:>ޡ 2 ^#cȌ#/ASGޢ2_ AG4;ZŢO(6 yAZ12d[u)k78*, gk*> [^ΡuO<#;W_zQ]B[E8tC:&Т QQ( Rr1HAc>Q >X*V +Q# 2gr]85z[iN?O`GQw%Mm|nT372ߧwqvߔ P'Q 4K^fIsƜl*xHk 7D7OkzJE'dU':%3&Oq0 F80bT]հVC|_"_r2TZq՞|"v* aM"+/oV3w^ۆrAh))\4'HM5ZOف|ix9o1RmLPZ"Jዓ.Яf+U3EKFO$t:hn ^M=;g֘G/-DryL.OI&4(=WM1o"S{GWZuu l$mנo/)<]=6Biw~y3\sTO)k@,󎗶AqXǢX> [ fJ[ԩ>o4XBM d(|S:žУu|}) f.+%VvL TqM΍A 9J wP&YZ\v3ARz$-'Qsi.ҋMfYY)2NQ;+" Otnߔ k+`$&3R~uL}\!~yF4ON _*?O'<=)+Z]?!nBBxAq"O'[ l (*0n2=\K%! +u9jrf]r`r$َ (zon*1` jZtp*FѧvъRjt O|@K^`*\O 8D暳nK tF4%eT?6N%> >@0Q^5^G^;3rMs-` ;nB3UG!GWJP>~Jlw)Vq"H꽥o$5;j 'SU f4nFVPtLWJ }ۆ HsVS-|澂]Lpt"\YĐm鑶H'|ʛoސ҉Ɏ\q[(4[vl\,.qU @cCS@cE qnI@E DWEꘅmTNqxĆYh.Z%7.GHF,t`u|^x!zɯc7G.w'4P}X0^b_`]--^ .Zخz^kC^вU 减5gvS;'jfhM fbr鑠%YWS2|e[ 8iO#ˡ;Lvu18֔oKO.5D:( y*UcJQ`LJ3~fE)*ey.&e}{=[Q[alJ|a̕܈A@zaBP0H wS6 63FӍxENq]mgmJ$7~kF8f2¢_ziY&HH O柧,_W/1\ˬ2J7=?f$±-\3;/!T`.ILfvo 4csw[&g"ѻBƲz`Nc jT+7XKhJBp) E ;M`=)[5{LZ;&G_7BGg`M&-~Uc[32gVwW.YX2/nIGҽ`&sJi$ s'p[ݳHV\PLtD!$K!*פBq#5B,dujl;K`+sO\RGPN8!;FY@(%bV<%\c؋d}^f딶~Nr "ݻkB\ހ1/U2[D*vZrv<񫛅`B(gMt?$ *i{xe^!.~yxin.]DĄ=fa;8Af /O/z EU.a/̺f'P>0BDWş LaG\XˡD&#ٳ]i[iMЛ\3{i-Zi,} t+xZ(Q#yV+*fTS |q|>]h ?VRj ~r3GC(T|=G U{ܝ"ar-On@ j_*z5TQ R6dcsTsVJr4MT~\][e C:!j/IƵoqGkhV`/=>:!KKyS~R/]kzފ x/eiYfB(&.Gg1F)Cҳ)w6ĭPؽ~mxIb_P\rt̑B%BNɒ܁Xj^?A-dyLcWubrL.g](\~8Ichb\5ng֒Jjd:P ӡ8G 4T)lW;rRjy\-qHKlT|Y`?Jf!/x]Jt;]$4d}.nAׯ:2~(66M8psI YrE'h-FqfY놹h] DQ>y[7c&E-E,57lѬIE7|ܫ>*{=kg'OQO\k95p8J ^ɼgӽ9"0/fwZ-PmVf_^灛"\N-Z3-IJ CaI1g%m*s8ClR{X"=L##gu{i맘Z[k"N rDKT3pp`=Jdz3*F}D 94{)OO[@W fwфcAJpVC>rW: Dx#*n F B#rqPTOun&u> ) w#WKۤjYl*¶@VhX!+3%&u.3S!"XԃV4,PD'@e3zr^7ȃ`¬B@j %>L'<DH~T usgxO-|wqVvuӻf|5>_ F+-wjT1k8(N+``qe)犽7ͧavS˳J޻|ҒL> 41Z/"8MIO@_5;]Ԓ"ycTE. 53{50,EjV˕e(bƏ^Ny&p&woZ9%=Sb~!6lhTq#'!~`)@ ~uo\&=_W`LRM KBiyPWf4tWB=kuٕ$"K yrMfD掜Y jM< Ssۊcoְ͟6~7ذ`mܝ]| kR-SW;=AhG 1%2D;^Ù Ӌ~ i`/:QSBڄk'uߎ`-5ON *}jXk$cY!4$ά@{AF_{0 TP'䢖^)+5i_ m6k#?fl#@{nspaƪݹ^z:m_kŽYAJ[N+-3P@RdOqFrNqWfxKP4C-Αn{nɀ:[a*iyU4|`~ !A7 9FK., bj334q44_mwRXdgrFHs`Ώ ϙOvǸnT3u]Oh׈ǀZ .ϗ0BFc@"~@ZF¤xE {]'1pwQ@:HٚȠF8`JFBvV^/$d=й`Q0m֥0ᡞ# " (TprۭY8\KshU0)@ݻS1oќkw7҄Z@%ծ8E|E aP8wD(O!惻Fd^Z-KLcÀOg, Z88o8< m]7lǰAl!!۩=PRSj{!>9_.̛3Vu$|bWnAhb.Pp3<ҖQp$eqb1l],(n# _\i0ОՏ&Ag ޟs NE9t& b}췿ƘU;~Ĵa{|KoPs8  bS6_;jfLwV)EQ\{GJڀL^tg9@T̜Qc<_r .i^=ZZsFɝ|L܄ ~-!ĉő|{20 UȞDc}"<`нW(#J7S{D8oQpJMV :ڟY!fVDq+$P+#<͈rf> '77 U-jRJ= -f*j{Y`y5>Ja뒾iD\/kD))nYT0.j?TT{~7Jt0{SdyjMm>\{J^V։-hcU*UGQABg04X0~ti҃r0 t%:i *SR|j5b9w ee"4I}ӀD D̶$jnv9)Vij?zSŇ2Spp32oa)3B`! )79{eK*zc˥ӾuUCM#:&}zrdFr4H5&]}NCR]}XSY}tSb!u)-{#NQ4ƑB!nKEgV_e-`NIS\wJ) aQ>i;vNhtOPnNsxɬ/l=6fj0ן2y@#Djz![%~QI*%]`' &&TDJ e_^V+_a8ioOx.khHƛ[Ȑ̿A|֡بX08o:1«MN}Q:1@a ko!!ќv8 $ʁX{n0$5amSt~E(NpDb̡)P`-<fy^"MiX'-]la:p l9RnFO+["IF.҆++{S/!Kj,.Ns 9 2"Vcyo-ݖ΍ul^y t[7Xj8 3$| +UK,SknqO6hG- 6˹2{SHPBtX 2foŹTX~r-s߫eH.0GR2I\ߴA[ZKy<"n,1 uzdG| !?LVQȐZB3cg~ޠk#m8߱pb[@Ma=~fu`Q!-'rG(LlIm85_)1wxDG\d)(@bstyf#>zm0_*.V-V;I!1Y,>}Zqxͪ7>+ W= jKYzr($0P{+M(aRlRQިqų[|FQ(J*a;g3 xm73L{@X]+E!jVT ufI("X.' IxWuJo ^[]7" CЎb'UIqU}zs{ǿ'"pP vd7Zo؎}z 0,AochI1{Ul|"3?lgCsF2/KFl;ϫG;u|DF t!H'kaɁ(~f*-Fmv fIxo0 gAa厵*8ݓgZXǣAIR|7|>:b/Vޅ\N4D3:umXڋ j#wG;2-Se-%] xZX"d-wY)w~԰d,Q5`Q|1~(ua .+Y@gf-E Öw1jnI@J~(]Vf&*gi ݸ/GjC5,My8:KRw\*"Rs(]^qSbw9U8:cFElʷ# ߄o#U.n^ahu&qMU|NUqG7aVb βBaAAbAQ5P>m9~.DAUV*sC^hF| UQ:5/[RoZ> p 2]q_iBo;\j4IyG7mmw|dzIvdVN=ͫkTUA/#S{lRz}Qbė>AtH3F} uH('%o 5,}7 Zo_uyT!Tc7ÖNCY(&eOzWn!=^7+uXlҵɷ]a%=()Xtߟ"qz<3'ye%xEUwUS^9ОZ>_f~!F%s@ h RwRfP-~D|``T^܋[&P2"y<{_oovI _@H]W I۩ [%+.qj$Ni6fpuaU5XH^b|AlfHSN]cĦG}' ag2 [d׬ ȥ]7LDJOQ-ҩ.;9"E7o\dwȺla8v@?fc+؜yXtzN>W+n#ܬa['jAum -•xпŖx]r[6fVR=Wc`9sŜf\ &(͡Y@ғ7YH^w9v.#Yf dʔ߶ͦއmSӵCq >;V|7pl CS|)+ 6 JeRtm_Ҝ0pMLfNR!uru 81|2UCg\8q W긳%^@\uͱZŗ*.rS4PMW"Eg<=|o2g/V5^즨ux'd^rY.Eߐl#gݡ>6=R81SDa?'ISfl ,î9H9}s$'(#5qg)Q*W %uS'l<+#6z̞z8^ɥ/}^^S"yer瑳\liM0v8<\>Eʤ">=wx=lq\H}bU.4/l )0B.zh]ґ Ag}*ҹ9*68 Ϣ9;MDPvtHX$% I"k($XYl8u(3PM)5\.09ZK8sj$c;چ5 mي@?kܫ/Y.o"$ ʳ0Υ֋]~85u65]wAZ.>&$M\ůT˅5*t$tNV|wgd#!?g(^Q ̪ (`Y.Tl,¢=nǪX[rJ]3:|5dj \lѦd|yHk"C)|'rzYzl۰%+[^5,+8[5e4@GDb5!#:ʢ!&K8G3-Bp @cT/SIUF=^RarZۯP `b#Ǖh@Ł Zŝ#nu9 $jeNDžF ~RUC>>2/F*m}CFENJ邿wu'E^#̧O"<ׁNlҍɩ0! V۪Ӏ"f$&| Ci" V0*n)$lfjw =~{.ip%Mw#.w=' a$Hr/h?O&m_PQ_ІmT^4æ9q+0dfZ[lAD7Tjȑ28z4*{X_l`rٓpɄpJy﫣Ll9;*VT@dm˻)F=`˿` f: VxܣLm@£ݧla*-Uk7t[Q=Љ|!߱~QLT? Zt$ 2~D7 LӺ!v,I{c`e Je (ᱫGho4@#s}D_ⶎD@b!oSI>]-D45/\=9*;ݏ#mOuz*70ɚqGmhyz?@"We&_NN`{bkŗzmfw(76YO~i rvX+} |akYy[PbvԹy;aG:Չ!;(-L0٣/qu{W𕊅Y9$Q8J-4 !lV_σ,^d9@+5R鿍`P,{F{ʠ`'8ͻ*0vq)Ho2ku}l84+ۓ/k^pL )Hyr#qnix`a=?ClK5tMMWs*Z>U]=?7|Jv?9hG Uc5"viBwIJ4:}a%NT9e (5\9KG:*(XUZcy %*+O+HȚ2V`iP0~#& SJH#ӠZ1܊bN|Q dLFYˇ a\M17)B|_Ys:It\mȈ {HE"v0vAGa_: ZO=m@k F䈝 ^(!u,w["i$ w!yk\3&>8 t!'}\ ļڌ@}a-Wtw]N[*s'Gb41*Y3(3%(=|GH.4cYh"x?mZkVWL ֓SLa 5*W;Z0'  Bu#ؘÔ#, 91M1Vc 7<DN%@_cK?Vzˣ>5noj.$@FҶ9ZJX*ϼnf~W;$I8ֿg6$tTkR\-A^k h~[^ѥ| v~V #~ITt6^pg];;ǃ[u(AUfej1%O`(w!XJ±pƢA9XJ!B#>CޭfhQ?|h+c6n[j)ozvyF/6\~#zQ"u#pN".&²No7|{/"-5uю!Me(xI,ԕQ^8jk;-e򩷀F\ "^Ճ'~ =Z2s#!nD= (R}#=KhH֑NK+QWI[I)Kr_ ڹʁ)d*d$$D (D\EAǐzfz&4{엊O!9OKj?`]cGU`R)_};m%&y3]l|hō>q6m/+mс{@?|;M̴Jza- ,d2 SLj}Mv#`fRxC_CjZ \]W[x'w'k+& ïwt zyPR2ɻxX)wRIJ21U礹IJACfp@8 5Ur)ERմ:~V0T̔+K =h"0,q);hB㈛k{ez\6+^5%.aeP*FT Yh) .`a|/8,Fͅ c|ǜd.f W>kI !e{wl*phiRUݠKވz>jM98CʔxAݘijC*wf>J[uO?ǀ+j8 1!2Oxˁz.mhr z>TmMvXIR%&A6\mK[+,Ѯ|? ى{P͹<䠔RT9Di":R fQ$ZZi__:kl\Q^3ێnq'Wn)*N ZM5Sw&WBSvP2M~TzSj[pR,q`yPϠX\P)ΪxtV#s=p1T,÷T^ߤѸEBW+F2+˝mz$fサx| D*kxx+e}̆%c+|cftщssLenP`mfDRWeB -D[rgu@E>myh|wvScEޑ#WJ-3^IVhm38Rq<[u( X DɺfWllR~„lg"&S C\rus(oHjUX 6_0A~ܩM׆e!m`%ܛ W=8_wj؎bY4D|DJHg\6*R<0 CmZ/C5SJƊlR=pńuJa%t 4{X^KO>)E![4 i=ئ#* X=||B+HI>6ͧ]xPkhv^e0uxiKy{>wj|'sqLߠpsd[͢*Y.x.^,t9]u}*Mo{_}Od&Ӄ2+Ө6ڈLek[u1 L}pVܶ=_Nn9wD$ iU}5N- o[k&AhhO6Um% KӒQsL%KYv00Rd,A z`QQ:l>]mpcEJ 5v%x7*LWj>h.F=ݒ-("c6975Q!2.jqZ5q*?>y(AS'_5RB$Ӵ+ VrY#Ί𱛜$jRY'5 !"`Q's3`NXO{ E|kJLSs'G%.Ϗ(-eTLR{B5>Au'"m~C8 ΟnW󫓊Pq\1vrYKaKB6odIun|#0v  tDY`1/Ě!Q>#W% \Fl Us_`Be6ac]w}v8j+hp#g .;n(B7GW\E7^9^BS&fY$iVx }Z{GY9CYިoShN:W7O~7JѳQ,u a>𑀙9H]P93}1RK,@Tg5ǣXT k0{O#ۍ+||i_s`Č:(5Ҙ(=$u|@./߾9(2D; +] f'>xe+Y%XZ_t@I\ hI<!jÄq N6Pw2V]yWMԽ7D8_iv / ^'cYfZV{e_~^jc3eMV 祛XUΦ_|S&oVӄh3mM# J+D8Iޱj@;FAў=,{OP纕bKI-֟%\k#-DwgEK$-E0E-yҏK-}4JA<~z |;E8(ym;f^ޮ0K~P| #:.IN7xxDЦW.4*ܶE,B8!}h0 a=t_}@c<%@τǛLKT*Q(_o)wk~\3w3xh;&&I4$Zh2r9^&?WGiumL 6 ɒ(T:!@}m*xmPS9?|@3 }sTDer@yxS ! 19@(dpw A:;),^}C k?jiYʹwJEʕVӤ&=D+>b6mP$&va]=5ʗ]zEUGBm KEoQyRZ[q䟹'_|9kn YoCP@Hnn}[Q!J»IT]d _5M{#A#hcv"}9*[ .Dw2t1( . 7dẏjѴCg"[Y!-?ט[BV#v]5'1r0#UBǥ*xI_X,m\:Isd}m̜ a=H%~l9læ)x_.Е}Oq; ΄zw/GIݰRȦsO-t &`w 4S$M6B|8PTMHky$T͏pɷs\C4QOt[}6Rjϕnp]ˈsyD(Vy8 xr#JجUtdK<3! 9sӣF\@בC}5N"* ($LfQR>$GBRāap ۖb|c-i\ X; oq\:i ̍xHpJz r4;=VfщO3@LNr1ǯƫr#WF=_Г|ur4xiMza^yf8*Wa~F`TtM# Vz8pL9N/,ƢU?j_5 "]3.;x>CXfS9=ϼ7ëcxC(ci7K]]fЬ D^ ա{Z@믞{0*zDZK ]l㞛W "%ؤJG`NaN>O;BfQ\n?{k`TFb8ݳ9]X][ixolt=௠`ȚO}13S>,nBf% #n r!:eݵԳ˶AsH].tp:E:KM| 9Pc(ZGϥ7;DeKLNPt}Y5FTUJ=sE5#4=\h{wc;<,@@8h*o xL_i):?S3:x/)1 Z8ێVcHq?1,s_D0h$\l~5 @13G>e CaZae@Bޖq+,Pe툋6>=݅0^ma! zځP=WIym*׬"xGN8`ҪY5.1( 1}|nIOT{q%?ѐʥ* )Gkس/W֋4,滗3eGRIXb]H(,uTW4k)[T( WBYBY%c/@|6gA:x/MQr8\yG u?'5K SXӔe:C^]~}cfc"\Op̤lFbDRz#=.fE.gO?E Cgh=H`'hտNkڤy]M=G#MXmt{+1`$Nu Iൊ)nrxDGQ:L=7L~{lB|Zߌ"VS ]~1S폕kj͇]ǤEy 옾 :Hl1gaA"&9>q'}g@E?pƘkth&t)%CA y !śDԹ_~ͤM$J:;\3mq,ҁ4G=ft|` ׎gj4P>Ukj^SHBq M63- ΁D#sN>gв@/Z #z2V& %1=s K58JzIao1t`YrmE#+5?R4Ycyuw FQ(m~u.l4hT㵸D.'xBRqmj+?$"شZ+`8z.㈶e+>Ue{ °϶F6 [g_p#xYJ!Z Gx0IƑ+ics,FWw6DNQLjʋ  Lssrl(i/ewa[O(1Wa,D;Xy4JleouѰ5MqqЧe1sҞm+?n9\gEѿjBlΩQtx4WYЇϦ(0ME|5MND  M E,>e|Z)CLYf ?bf^GDGMj^ӖAsA-%J&Ru#ǾTIb5-^VyB^EMydٛbj4mK0N ;C fu_f*jkCzP4դnQ-(֤)c&p_鋜8\7Ԅdoŷ> M[#:+ԕ`/q(k5F]}WmxgXd379-.NZď_Aq(;>cd}U{JQoCfBQ疡TJC` ѓ.*ylvm|5 U:aH,W":0cJ9@Qj׸N|W$ Nv=.` d3hٌ/x"XG4M⺣P\,n^᧣cl#Lu&&s]B.VY]t6@a"?f DbsK9B\aoDE>g!/-/ (H87޼u*NG|R/o60.B(%>?OakS(m.Rx3S%IhIM;62'lk$IgyRU921*%) 6iE2~(l^}$Zdz^C?o@0h qcFC; 8cv}~ݚ!MWde'orJ*4b9=KS̢[ R[SD vf& 7;Wm5c%?&:z{lUr8\ȴM#Ua&hIȦ. ⁦^!N%Á€y/L7`HՄWP9L)eI(\؀춇2ͷ_K4O@sh KeT8/~C2>wܫ$~@aHw1mb qh͛љzk<4K՜h4 &1c};@Dž(Ō}"DUW1ཅFMo $#Ղ4S_b(w5KWI6lVTDjlG0ED;3WE'i Ǧy= db:2iUND3m>P4 .-FT!Ž7&%00a?L*; iЎC~Ʉ"-߿/o$ÃN@@`'S=jf٨Vd3ψ9@}WWB@ȓ:j(뀀 Vvk0 ,' `3 q"1"P]pB4(ߚ4mxtߑ XXQ_r5m%Su F?"4o%Wa=v}ғmV׮- `|m@L~W;YN}?ʙ7HBKZ=] _a-/GĠ7?[]@͐<p+":k_ !;80eˎPdg%p?p~ؗ4Rz0~XK6.Ls\@*Ka_(`~DڦWۙ#Bπ([[L9$H!ԱڨGͲ!b()eE8dIy₰EdP +WL97fzrp$3/lU@Od7ԱᡀҝVÀXQ93k_2ժ?K^PxPG0 w"z gN-9 f>9OTP oHDfw! *.4ӽjQbk>eQNI'd]^ǚk^B; ieLL> !SF3msm/+%ROaɆ2l5gʎ<n-C 4QAPB yCF,a({D~/l[wwa9DfFP$=5=xz^a\Ѽk/w]M]]yuWG6<$2'ys~uPE64!A:f%ly+[v` Pę1->4Ʈ,\ .!А6b"ߊЅ_B%I=SEbe_BF|s0W`Xn;$`!aj D&ӟ{,|z#%gmd!6V8.x 7j|R{ D3IRzβss2uEh#\W=^ PnQ,R i cjSb[fFLu6g` y}Ukm2arSNM!~_&o}Ϛ j~')>]Ά,2EU:XdX ҂_AxvD{epb0}.A PAI%)^ul RL,Xnh˨'&Iu .bM,9i3'~:r3@sVeӽ^ޡﵘ%o~W{OLyN+uLݒ]?id'9Ʈ6/p^7oJNE=ljG._p rܲsq|aլFb2OR78Mu[|4`*TPz]}s(D 8 KG`ck8'UT;b[%c5PLhsCmMNyP;t єaN/q^IZ[@'# K࿞A K?O"I"bFS(at\m@:t7tZB%4Ge9WiʻmCb6@It+gB[AAaƾ#ܪ:V?5g F[dgh#s`n%hB g "f^ßUuBXBӜtmYig Fz;32s. ހ=lF%uNUyp;ZM8JV_:2 ȓ*#G5"#hM0`b*S α}ˎ'U@ #.䘳 zԁBiU2C iBskVX;* pPXLb+˭S1&nFąkR^#d[:}fݻĂkr9P%ynHP[ Vʭ^f[r"j 0]UZC|s)6%@ W~Pr}g|.+EIMxui#K'8;[  iu{Mi-ov^>$>xvm! Opa45s֨?5֬hb iGAN=EX_x.Nu} z"<3𘃙?7h<}'eNnSqE N ¸ЭT쟩ePp(_9?1н@ĝط@t]ڣk^^RUʑ5*X/*Gn(Z޹5>_2#v+X2d ^tJΔk/ -k_> D,}  7~N'4!êLt!"*WtIQP[ՂfŹ3C&;ͬo3/\xNlvQ8wv*xI|pq_ۋNAGi>UwNO}AwG̕N g "L>1Ԁ>tȶ9΋SP&; 0E?@0B+B$b8_eQ HDpQ LǑrfŋ&}P{͞g%m`=@ S!7K.s]ФǪKf0eJ*>du xjы.q9;.(>L%&PO%%!QS,9C+:K;i|p\Vҁgʛ! Wk[imE-eiyLl5(?շ3w݋JF$ 谜aTHEa\ ^D5}d~&Ā!4JgIǍ: 9h;M1Wc.r`ʡc$# ?\YgEdRI)UX-Fȏ7v5zCOqNU{I̺(^ v:݇EK8Goue%q0(5HsuDxycUO=?~ e vC Teԭ1Z-b@).%<5C&%VIֶ%85ƨ4a Ao͸`sBUi[]1$t\ MR973Hrht0!ēhgXNLvɸGeG'ut-qË"L5tWYs}\"< =mN۸+ Fsۨ T/qԕSC@xߜŞBBJaz KcĚBv򽓙: BrZTu:9r!׬g`$ #!7 ÞǪ?6ɧBIw?R#ũ! r^9buSQy%rmijq TĦ I^"O,+ZMQ>V o_AIv@P%뗼Q-:O%]q' _y/[rʉlRRi7`?`r#hc6Hm:2"Cοj׺EMy@]}:ȵxxMlMbj9YrWzTT>:Cz]_iKrJgb2+%FrV.ީ-ٚķ-ۯn}S\s!51h&^X^HAp3׆tG5@?&[It5x<d.=\ $aF(=NI-TӡzaY 1xUQY3f76eoqy&놂gkx(ePZ`@W*Ȼr=֯?=U 2Ύ P˽$+@$/sf"ibHWЫQ8˖ WZ>a7,cTI͞ C{cRЋ t J(d+@7bM#OON5f|)Z`H:^^g IE#RBˣWD&VPA;sΏ ŭ ~E/Lٚoog=Wh %&:qpP:Ab "7Y*0kGVWf19߰Gʨ;:?$r&Jz0 Yx@)b *(j! %ĴR|`r $d|ra1+g"FRYuc> m ~ 59@*W\TߕxtMDML9ҡ[Lƈr9hp:Ƥps@+Vҋgr;2BS,B|  i$tm|#- ,*~SxK|%/8k㼳1bNJAH%T+|fwr5F4s9:#qy)W[QJN9M%?+~S$RCaQXjU2#СM[e(޸-V?⪧)Qn~1%&5F+.Uڦ~0* 5Is#UT/{1N-+5[fW8>i$0)t;~p=,7Fd3LgY!@OX Vy,oGc#9MˉGEN&zehܴfUy}-+qux5mR{V5 XVڻS1_hUiI:E_(k Y[lmM??ȒjC4>>Tǹh9b4Ȥ^r>QXb fn!U(嫥!,b*08vi p^INT.%Ǧݓz^G pK9OI嚯|EҺ3R1ݜIk+PxhZ@כ@tWpoɽ6;BG]AwlZKCQ/5\ѕv%E! 2ȯC7(69H%3z;w}EǍOJ'c- jsNȃ僺~('{྾58-.&=NN4jJ*Z"PŔ\n1A0LK3#0+Nf=|IRUӳt>5ɳgo nwCΕw藵] %/ۃEqZT|,ϱfD@kk9$'Jc"&Cn K<ʃT︴kPΖj1;%蘐:ʤ> uy-&<"jb(pi D l_] 2~%nǏIE a?4B$e Ӭ(pSoů &Lh5H&d5՞>+ZÓR8 & U"iRJAEpe2,ݤl3Wf^I2ݶ"M]XS1:N5/ 5{=>O ׷d|>4E,w OTXnBڻԛf [L9HE'Iُ1`鴪ƩP&_n>wL(Qe>Ә"`DQnX57}q97iYW|zDo =/rd=jxnaJЧ"E;'@Z^gg~[ӅIз&} .=(PekWsRvsAw~v=>+}O*۩芙-?Ԡ2h78Hf!|4o@{DOW࿠wenHԳ'C EP!uk58z颇SlTʭ̠d gHuxiB]DI@%(^F a>c), YH/UMy<M θA W7Kzo֝)VwՉ e@$ ^x}H3h(w`8fjvuFb^V̮z;'mcN^^\iC֩>89'2SRv Q5<hUjcOokiJdYk#c9Zx.zzuɥi#G1_~SEc,7Vַ$̝QR6,O.[2  x k.dEj )۠ǫUF5._e4:ǫ#8*H܈E 1Hb|Y XȸIGm:Z8W"7~.u2N~C:U%bL¯J_e)fW)7UKޕ* a&}[u"d垶B =U.GPiߕ;<{kjg$K|َ sNJOlsؖuJ]eZʞYJX} >2jzj/c8KC$x(y?-``/{=%GJ*[" sBRC(<,ֵ.')3}j ex@r=@o1Ycg*H(f{۽:2xO1Ƀq~h3TȥCUC!I=::7tTyx{xVi5Cʬ$>pb FUkH 'ŸUy#4G:;YCo݁[;|Zk@(W\3fL%Љg/цW0{ڢ;Z4`8OBZKTtT+*8 G6rE9qn˓C<㊢+C1嶯w1##*w~#i~~(\[95wjmr_& s=oOɿe%y P}K?t6"nG4J  Wh|=eb A4]v<x#ui%;Iop=69O0Y#njL ǣTmu؃\> ;!',;؛^}4 s=v-dUy3 jzIuArh';Diߙ3=Js BK*28bC?]u#y_ L:BN{M۔fVLiv ۯN Bɉv!(X֊-lg(ʱĤ+W3gSe_۲]7vfW tI<~5^N #@Dc@7:?լh4 İ;ó(>״:hZ# DR P. rZ6 6R\  M! 9Ö`"ԷDFu̒!i'.)v Vg,a2K@nqt뛑 |YpD&tmk* d'X 5^u\n5bBk:5YzztL bI'5O0̰?k|0"?V}41͟{FߓS@ (7TZE؊4iB[Dz9I7a ELd4v%\*r'5|itЙ9*# !nڹfPoiuͭw%)w&n2i':pǝ u^Ԍ4XUKg8Z-6=GZbq_t@% =8^R@EvjAQsNRQ_|W {77 2P寸(~=;90hIʷϧ%߅w@%^X)R)D? VRp6,B^_*O^a(]4WCFtD=252'u=o|ّ(ߓZQy6j/vV7 O̞6{P$%׶{DBf ;P3"EmGtӆ[)&Y5ʻUiҳzm6<%Jbep 7pы/bwp}a}g}?UB4N{DrS:kĈmI ;UAb`Dߞ!Ӂ9+W7/kBwl0gܥ iܫ~dWr `m`nو0^5xY ]@wJasv29ˌ3} 7*ڼꮅ9K ۜaQ)͹t):PZn17TPlR\Uh| "ZlN[#(BԷrZ@``3@94ӽ [+6jh= E' X6R.UI_FBMf$q6:kmX8n}-l/./`[{2/ ^1.66h!oÀhOJ*7gRH-zGStyJ0Lܻm;u)KJ٢KNޣp ̨xꦸpٮ,aHK^`ԏdۓL5'cS_Spv#jWbp<†n'fd)lN㝺 yBNҩ(}Zf,&YB^! pвZa\4#e ʩΆVm045T='nDa\s2`_jǩn4ņ/=\~2dރn9*w=.`J6Ms?ȇ,H`G]3q; |`ͽSQhAR֝ơ*mz`v*M9sMPY 5 8;sk92bC]\O$0 :&M8]We/H)_eDNp +ುzX##.ٮ>X>N۳w塗Pb)PZF'7d$d#mElPlK()0y8kGKn[}$?JDAy,Qpߗ?`\a 9'$'CQ#+tJݏ#Tu-oTCE0"8b[+r9(VEo$+=Jӡ\Ńh\:(U?Hib8i>m!,ҹ ? $5A'M mbKLpҊ=COՀV.DήCF-GN/ޏ(EayV=s!cn;{9vQGYWԳ&G;pW!dD*hPQ3J*GuNBDt_p` &@SU \i`* &3 1h _c6}'?ك+0<+׀/7_TfM}HZ5> h/[ $Rk;_a YW*kktϨ\)XOVy]E]϶o3kF]Yk!˘NR=zKE#\!Q׷yªEͪsJ/lOZ;!1ƶ`$y F:Z-luG?dRS=m$&v`%aKKi.hYZdHMO?^3a.RjY\YQJ)^Wu*.iϿXaߧ.Vt - $zdYܵy;ڶ2зo.Q8'pSӏ:73j$eXn#|Y O[YL\bIAPOb)y pBR+nKn cVu{AzfI%W WXT2޽s?/!-A$ZsqmB it -%;T[JjZ\( D\KT6SyºƊiB |R@nq'|@/CB`:P<>y`&4xpG,FqŽ.wUQĴRf8J e$ШK.~lzeEڙO;]BڍUr[&(r xǑ3g~Yw9hFR;2gӚ-eHk#ILhz$V4$Jd)N*]ؔ0毌iqELT1_ČR] 720B}( 3۪ RJ* ڱ 櫕bD8V8S7SX{NzT 7%١-sHWBʀm*GG汃+~<:;xF:[fݨ̚kഢN3_꾿_ŪY*ݐ` p :>>C h$*5k2+p4FSUN3~Dvn|oLgP+Pp--jk)-h["Fn+xF 3Ď}Nu܊6JG-Om0ڠhj?P~)b"kCo . \Eޏ|2-Ϡ|tԸ:,dUwX1Ӧ~R;vϙ瀞Zs(t6mՇZ%)C乊9 9y_\ԫSs"D!rUl@G6V?pqlߦ, CzD6f==ZM<[fF77N`O&b: elAW؊ 0wN~'4# /M[` 3m8=AJ0Z/pȁKȹۃcMfqF2<,FUzlb 9v@1 U&Cb4 eW :$[coz6*LX7!hZq`,'` X]AwqB~\o+ N<4>#R83@ Ta՗L`/gQZלR(4*L3mɕW¾uҰkmu}1}܅KpA( `'srvHܫLwR V8V֣Ǡ޴`.sP\.Re%Y[̥d0 >ӎUt);6wF6|4i9:~miI_^3窕)1D7V9It=uo7x b`Wq6&-[NGo J (AscM=޷bȱq apG!'(s4kâ-F7-30$c>pJfd^@*"'q𧛹h7QŌ!p}Wc̪y)T#>c2'<ζwb;1)Z16X-qrܽmo5ELe6 O1-FG XLYG:t&Af1N9TM'Ft#4 \5cyw ڰmOBb^ST\~pɷ̱ϜE"T~?OTq ]s#0 `ku̓mQyW:>[  ځ?b& n/y6Ydl+#" k5-cOnw58#xي=}EX.Z@OXcn;Z HiSM k֌(;x,V2q|%!sT)@QDch/Q)Ͽl]Ұ%S!ӯ^nފা S.<0iJ{%*!O[#3 %odeCl.YT^%P}@\%FKdT +Ժ]c;㊺2–M>m\ZU 43wnJ}qq'.C>L@z!?,ـ${S P[(UgrqNcڀxNDDÎGHq^qfк(I|WtSiVy8a#j^Nےk}P)&ATN=!{4o &?B}>`ʳ2ZF|ґv7POPvb hmpC n!)M3V}|h#<2fɠ駴RtM E ;&΁Թk 7KQu~c]iӀfiBu,RDlVȺ&Nz"zakɈqhB?|5W8P27 œFojj#ؾLnnz t.r@ j^-C˲7F l*@|fIW4nb+x>Mp4o߀ƚWb zIk{B)\ՈZR"zBOV7$@~y"1JX~ƆEN.MDRTKoHHDžqK/[VXrx֚ؗ]%kXc_i€{͠`ii'.Eu;ՀϨ5Z?@w"`B0ΓAsSU?ŭ^,& ;|G5K'O(L-F7J2:*& ێtc2o 團`p`3<>O/TTyP7 벬~a(݀5@~ [u״G!f/:YR9῅@ `na1hvŜ$(AvOȁÀ/V e @8ZkMd,_V Q=Gɉ'[0'RlY_ɮ0N4IpY@@K!u9)L XxW'%UQs#UpLO4 Tivɓ'o 3J/|ۑ3?\@Dxg&'3[ LXPn=\F6Ikz&)\<M,CPǞJ4eX;R =;ӺqTg&jzdro/-td1q5+7WVzz&?WwFm ׍_apӂrW1x_W2{RSc z::n2kD}/D !`7C_rU1%$]tG9-oZB"+f(pvyGlA &#Xp\^9A+W?np0fte:?wXf{ v?0]iגY>B@GΠqWxp5XF<+"o,:ߋezwBwMaМgtնt Iq9շ4TG+N"ӑPkW${wY%p%ٱ{lz/M.srSesT/%4Ly92fQ2r4S9^\90e@ P 6޹.,b )RlK);<˘.H`GނT?#o"WrӢsBЮB %GU YEF!p ,\zI~V9~_E>5o7r..x.sx6 ,}ˣ5䄛l{O*'77TsaS$b f]yh/@P~%|A]LvSr!,pMOlw_ zAcj 3Xfw B/J=ӊST @*:DBe[B`[ k+QK?T{-7pF~%jA UgjbWh@w 8$ⵔRC؃A8RDDɱS$է{yn OOQ?TNb(u,Κ5R 5B}m ӽɣk'KPq6oId3QD6I˱vr[x!Za(H'tT))M`^]~gu#W0fB@ VECzs"]5 tbO gW(s277֒rU ViWH'zH:8f X& Z RLDpE ނHls[} SVW^ԛNbF+8φlPu8x۩1M!bU hO&'m nMaxSgjۏY7# 2 M1ոgtDdPnhɲhm2M^"@&ہvƂ>̈́A9 f4sB\)=`fHpƒ ߠKx_bIٍH({87 A;w?+(-,uBה&$*|XXJಹILāv'a߃vPjw-F- 6Υ2"UprFMZۄm%Le% rʶwY$0,w6|qsI~aiRpA:iX\r˴rc|ݺxW2k5NzP Ҕuۻ/\K(|M4n@Kz܇EbU6+a09BP}0JWmgQsHeɤB!+Ә+鞏#N LXSG!&#+A?7dT=0F ؊:,P*j1Lmk2,Zyu$ >Z$G9َn(u?bɐ jx%~ t+=[7@WfL: uW=V\D_5N.j62IA }hr!2$$4WUFejxwm"WV9զph{'DM}lJDD?YА0RNhtB: okӂfPBm60}ѮPxhX Aѫ"@<3XԧQe=>;ő\d4aLTڅUc[ C>at/+Nfx ё4 }ДBxˍ~)rr.(H~Tk_0v6qfZpq~_1$+y !B49GEm܂hUO="жƨ@@.uk7,_m=O/G  xg#A/>xycib #/*5;j@Bjur\]sM"3K<*P4,rŚi8` hx^{q1NNr$A;` L|!s5g Vh1gΔ!Nn*n)9-ͦR/Y|lrYKv0]2T!ׇ; POd0d]n,M06"qޢ,Uؖ2bHk9R_P(".ƅ.5)Fjvui 6Lg<$SY@VK -O}JzrT&&!)\F)?"%QY7k,u3yxZ&>Q@7^G80FVZ4Pc%_a,լQS݆G'Ų}m 6P$vQ=Rݤ2Y4dv>I]@jUՍ.YGyژlCJjZ1T=h#( hf{y U\K&0'ݸ=v%-TݻGž:*,0zo^@Tp%M%~J롽$mƚ0cMv}L Ty&݃i6M X0yIV{-mŞޅp[Q#3.q{a IejL͸[D=;Lf/zEōh_*_RR/!wF gT*JgT7eQe(%6yO x d\cZHI p[>T4/I0-E58=B&_2:@(S~Lk- Hnjys$QH P3Q( ~F n&U#8eB +8{a(Qx?*``=ixn/ۜ|I_7c=_8k0L Dş0.rU˼ {Y m\4H'ۦn}S2<G!I#Fz֞…N@/ h1ԣ - NNmzgTk;o 98 YY̞)..{)n|mIse"RTlS/ora0v6vDԷzp,9-U˃J9GM+5^#khFDy5 R4n7N,JG_"ZW`%^6qꊡ([KqY ib36y);]<{Jm!_[TT>MOΉsmo,vQ( `K E~)#/1%6mͭ'N,AeT5=brk/ŒP@0bzըҽRѩ=#+VDEUᢇґ}*#-tT= ZNDak㩶37>6$b%=߸Vs)5-,ULI! N`>nl)oϲm]%@Goް}{ەPnON.eRmez 6 B?s0NŖa/O×nJ@_2 o{|;!ol`cFBqe u.m3_Y$ݛ0W_Ud7DR9;7^ڼDPu QHGy7!N"7e:94ZW9x}t^QՇ~/ t+ڹxHʻfev#/RwۉqkԣAr>, ^nkn V {7AHWftosFz9Ro}W]JȩvcCIwPK_f݈>YW MC ^tq| i/ Va-ƫcBjˠHщ- ݁c?}ߖ3{T^X Miy6D À Jk} |#ih(@ԒtsBjm!EN&0en8!ȑFo#"2L9OY&Q4%$4ڳ`| km:ū̥\F)sdh[0@F7Bw2t F'DIxRU ^ )^x` 1J¬4XU*bG|=~#\+V[M2B|HA.6*FܾgxzFfalN#`j+id.` =d?MCii @.}_FF T콪NC g_;ڕ'8PSɲ͵4-.[ Wd_I<=]U5bTFTQu1V-.kgh(.rAEhYKD[cDbA;>vvsZV<Cki]B <w?ʲh n+7b`/kj{'GMDG~JmV3%dT5:AH$]rԿÃxajA4Do4Z56"oGkW~FSWa8yJ$ιWcqv,GA7̧f%LN_rPt.l=q*s(ZUq K px..:iJy{Uq(ٚLձXI5AػxYTw""jЇɱbix099 H)W%F`v)ѻru+?E1[6ۆY| 63vnG * J@$ɹ#J06":Xډn(ja@z w6̾WSYAY} 5S \1H]𲗮?Z`8y7X3ѭV-uuu1p%\ )U +3ve&JVWi?y)FГ;G \ }L73>t3m\Ȉ*Ͼ"oe!rϰv[J@UZgrxgX[ †ôosEV|p]w>dg(VRiݕ z49%ƉB|o2^x' Ie9 K{ajIy6L-?O 4[Q H0RL4NBOm!mR80 -4˳/y͟2E;qbOZ#)[70NTѷ 6#1շbR*]]Pܱm.5ڐ{. y(#!p2'U&ȷV+ bZ4GΏK˂%+Q~嗩t@bΩ VڎlVf۟kr Z^D;y6;6[BACR|Ʈ.jAr;KkP "b;|2V—jF]]"K^&_BhNL<)ND߼iyyL(BP;(uI8Pg%E`>Yh%de 6Cgw݊V2O[13$1[4q1mh←эKlbaytt顮Ds?n͕NjVl` {+a#Y ^GPO+9lB=qD%ϛ[!3K8OZO؋^}E-'d]wT'y}< !zZRE`6dӇ^>hp_cZȕ[H ] qҎfԜvtLoUaphQFoPЃ|֌^ w  ö[ %S>3%, _јt+:΅™HI:`7Q=" bY)j\m/T3޳ }t*]uB^J5^چK3Ǧ=Y_hS Da<ߐݬw -zTE·5:*z?F70fǗ_6\ jqA=jYJM.pGוFZ#i~kw`e@{R`#G^;?tRZQ/zw wP|"2l ەF/r)q#;V{{wu,קJ9>4HM"zMZ֦W°œ/ᗫ?FM{xMHe`*zY[8,70Hr껀E5'!t}L O9LHF|C ޘzj8+qe^`تM~u1L`8E ſnH|פSq+],]$Yk Oc<5 qALQ}T`r ^lO^ $hSYwJm Eft=u`VFH]HVwDn4AFv1+qeǐ#!3k/H'Eqz Vos,2pST[EZ6[GJ@1}V׈&XڼQ Qf+6ǿ،dJKparZ_dțݚF;O]LlSJSɚ]w?ChQ]> BY!pvSp֣9u{\f LhYa6fWY ccc q rrqavj1=-pzd+( a VlÏ.,x둋VkN}@lr{^ v ;IhZ>Ѐp&jD?سyݴTZ!-p~D2nzs'lEA.t)aO۪OݽvoWva~8:w;ʱ}zx5cEXUvJDqkm -%E8ƈ=+rMcGDSH>#`Wʞ'j[&{և)![3Xؠ;{7]QT 1MZcDJ7ğ3>|Q>u39}P8zQ0퀳C0J'zߕ `.^v唫?eJ9,{[(+ODV:=|͔s g{J/{^I^dsT) |ng405![2;_oeChK1$i`>b`>(TQ\@h{kGJc )A~19ՓI+}$ّ2ݦ2qF6g3"228IkPmN_ĀAV:Ǿ\s6 q [I ISY,`ܞǟBq{Vy T*%O*(CQ4RA[bdb$)N/!1xyVJn5b@? _^[G`C^VRG[ϸ`8:UmRT$QvWTB:#y,[>Nti-fF1+ 0 ը5O(09E:䞁0ա"tՊtdFU ݑQ))C_#4iZJF" PEtRz x[{wklTOYD3dSBAp#u}WJTn#I|j vKU+u0G/nMXAp+Ud:恀fq\ΌI){^{eeTps 1F36M ;aS]P1KGoO 2$+IUd!溘%4^m\3-B5x4 g Ƭɿ b,k^VWS4c"+1exk{հ}]C<.9U& " 5[) Y@BMp{ԢVd-b?[ӶXwFSϱe&O/TnӸ;IJv񠤒@cR,~vI!\F+ x . g}`}Ejs^ 5dBgnP/<Ew +`A(5@Hh;Vp$4e <ьLLv7iR mo]+ދ e9,)>jhpD2Я+C^#?bw~mBG|d&[Gr%4MSg}R+gs]Z&Lc|9wWV~6"n! nu }4\>S2,dȰk7'>90&Q<_FgbӢ*)R[oxyVh}{bj&ܒSnT噞3Ff nвkѾ@FE̗-n/TtZlPbtO b#pB?oD G|_b +JC >;١TM=Bd,}lPܙ=?*U9nMka;C+̤L%_GkY8|i,\" N8 D,;eOvڋHdȿYdjٍro B+0xqx1q\ϵl7㴤@dm˝/nWc_4fuUJ󆘲RIՔxMm)'rn #JoGhX4 Jx8ov42C|nZRѽC]0fP:NmMfI|ama{rg4^5ޗ \JUu nn@屩`,_P)ZVD+5X^Epfw(DU,Ao_$=?:pwۈVv SfrN2nqX<<9Z~D#^RP2E^ZΞx6-mSWVGpJ7I_lc >qܮ0'4򥖏/zPN{;=\A{#~^ 58;ܗ˱6.#%2_1+ήw5RmUcUyVUi/׉EY[U+ks+./1V>.2#9&U _95 >,!sv(<2Zk)%2ZLѰ^"C>fO7ao†&YCz6#B_(VP-\_7/UfODYhECgꖅK[XL KՓWuI ƙ𔀀giw@uA&de\Om2[Z&B9}m ]%5' nGZM13=Qu}ݸp1`mĨfx{K:aw`&EgV\ߏ/9e_|\i22*\$ɔK_`d"1dDywk/{FauQo}X:wvDBxx-̶([tg'0jsjEm.Q >={3iZ;0=c.%T6gʷ$MUxcMfZ5|F|̇sv<6iC0\Ĭ$C5ZȘ~M"KI-u M~!J|n$=6;ћE~H_pZFyĴO5"Fr4]cSUϠo 6r3G?Q o[k񙈛C>Ĉ32g>s-iKpQfR)`Lgů]13Zƴڹ>\~\ӮF⓯&DžQiͩAiTO(ɪ$L0]UtY2Bz<(E62_Tyw{Yh_6G}Dǧ#$;CE)2fѼP ~V8.H%pwhʨYʺi䟋;? ;pݵc!) HrBѧ) iY<7 <3ZDt> :s޿v4|kv9sC2Wd<ϼ@ZngBxow1`2d-mOW1b; -˽ʒiR ItPQBTd P U,@Ta⨼mƋ+HxbK.my[Fu!`;PDQR>*l{U}5w)_ ؜XY&YSŋF?mA;h3NLT?ωujrj;$One)CeC5b6dzL}P b+ ~g$+1/7Hv/ҕt8Ӂf8 Q(ppmcJ+z  9*@kb0ږ0! D6,F)$8 ENmjN0]Ds .YW9O&jQ2t5辨2S!t1YZM^0 x̩ |(. I 󔨰_X1ڒrr|)_YwBfMW< nqF5X)$NXZ*p Ybq+$T;h%/ǓcD'?VŦԸ;'XT3 IՖ.c@WAgIγE( =aH(8V:CLT8U8 n6Qb犺]Sm جInetԾQӀВ ؋9s q)Qy)i tmW?kښfh:m9΍ L`tg][ye&di 1J~'Yz,{`z4t C3ұJ*Ne#0Ο ɷC23TV^ܡV0 .b[]w3t5b\NBf@h'"#v懨o}Si?l \IK yIH<ӣ3oڒ."Zp١Z~h]Z楜OFVy(1%\oNNWuP&*l#5mj#yAUD}v5pnƦslĮ^)rDž& ZpdהI{ 筿ϙʎ9o_[*0|+eV#N>U9`]rFb7vq5-#i B)*ޮ"n3 + ")4 $0)7 ;ˬCUSPu(ƑJ:STk4*(=ǫZ8~Cfg+_?Fa]Qo9j_*[Oan ّ;W *R0]t9Miv Vn^aHꢙH1W E'o3?Q.F/o4P04,9SPf]̾044T9hr :. #Mfk7'Gp)+ i#AmJv~6Ca"DŽx 9#+W5a!q@W@o0MCw h7,[&gm@~L rFbd/m28IzD~,&[o.&~Ϣ++jQP+8IyAȲrFǿaߺ<QH̶{QN KK`DiMctUv2fX/tf%`=3qt3Ќ! ل~f6(wSgz7Oҷ*TL^#5OlΞoKM#yQekTR2ADgm<K,Dֱ1riX>z]h⹿-; Rz0 O%j.;P?+ꮪ_Q."zmY{v}r>-Rz̆1/H^ )d}6c?A'^fV>9Tv׏RD.\Y9Ff'Qnj ۠"&O-y5TlAG;>}x7*LEVLTz\ir- LlsR+?͚ƚ~{Pv]<"͊C7pK=FSb 8Ǧ %sU87[eP;oWy@^\{A խL5s}kR0qs*kҵI,O97cX " !ߗ gF6DzlHw\f\zŴf[B".v\XjkBlzȍ| l^0z4A_Cļm;6 NXC5*`5hae!~t;-{6̶8*-LJUL;g4%~dU_x vgaFލbwė(87Ϳ{t kJ3X$\F$닕8|Ǝ_ضW#]lnKV+Z0^k,>r]UJWo\X%fU"0S cxs{0\G p߇.+(SEkL3dyc܂>1IC/e82YiԥT<<LTId "\./}DB NPG_8;S{P{  .QI`N|b%"y46dً|lѧ 7 *B͕)\H;#tMJϿ*:@'˲7e 3ވ=+XYK>$NPQ @; R*-3LDLp%㜩 Y츃E/ť 8W ͢=8mxBPJ{ j&Z_KAt{U9ĒwڠBѺd?z7cf1F>E s JM{"B= ).3(=g1;ͭ$N.STux4wt<֛R)^pioR<CjbS`Awly\'d/t԰r +iJ)>Lך\vxp&7U]r.y(s2/V/~uX{,X"?8.$9[g/G€DfDW:=#"3d6h6nk,P6d/N@Ys+PdބF'\%8qEX0҈;yz'F~ ֳ]X `Z >)/x&ۭx }&m#r:@ [f^VjeҐO#Umn1H/Ad]z=`|APofX=ލG 6>[t /cşޒmI `1_'ƨ8%D\ϕ#mWu_~|(䪦/x[2ݪRFL5&uo0/x CiύV`4ѫ%ܼf[NA#_&КE'$>, oiuчwK3r?%&F4xa}rmJL"C* MMOr[O [ M],4< DX"z[sB+eR'+nͶ;NCZ',aOa8(#^w~7h2m6{SdPƒOFio_G 0>I%y54?{v)HE/CluKE_#j1#?lD<\9RЕ(\{y_p xQ2S{Y[4;\Li|˭{67sF)9ȟDx9)awf*y18e0Ȩ倀 A_#-&ƿV˵SqTN_{+#s@&Jk7S9tꔩjDF`Ki~h)#Hw<+ 5%҈1UʬPWL˂8cJ Y.eL(DG_|! chP C/T&6_xFBݺAaHQMcN̬򾂅Xh`<# ⩠Ld{0V*Ѣ֔p/~4W2༬by7X2Km3~DfŦ;[`h&ӱz?6.D6/ϢͯDR)p9@Ba 'f泥~Hq{jXD@ƅVn1@J{Xvp,u#1쌀3DU%[W3 k=n PHCsz%XR=x5pnѤܨh)Rseo! jlK `M_Ϡ 5fE^Ⱦ ;<6NӠMf+rn\褁R=|$PT".+ɽ`F%_= S)G\D(lZ A#*i<(q ݅ip3_wڕf% z:F0swV^ώ7/(]B"b |#Mߛ Z1⟛@50%Dt`)W5cI5MypmL&3u8UDR؟ p{`-[@ $fT.4{h̪1$ XK<[Ptս$18ոEFـ.ڕp* IuMBc|y8J<#nzӓo_9  / 0@""#e  ڦ9[4$\Llfn(--2F耀p8Pwgw7tڠ m@x6q1EvSeHeS6Ov‚! )~fAF"n~Qwljm{Ц.X wrxJ$+|gpQLu nx6;>QcqulvEvN04~|C w( ^*8c| mn'ַZeBroLYWvypd,^Ԃ'?"YYlktcpIag;ED~=(ӭ-Bs;5 *RA@'oU[XG;SsBJ՗R+*^.TcvJ ! *1YW&ڸY=_7mjE'[ߜ3se|Oȗ?ɰ9j}rF] "DP[s$䩰@m])J!:YtaƾZȪ<},"]-ufD d!T5f:L^A)X> Fꃳ(Z\i: e>lU˴-|(yWN|d08Rܽڮ⡓'-$N&'3q3,=eoL)Mh|o޲. jaZz`m$|~1!AB[;2-T58C4[Hv 䍽6o_vxBǏ.hگ__%7^(?peAHJ҉(;f;UŠ8Y0pѸ0eA9'oYS/”/ܨFv$|_S>ge r ǵN3--"!P(3L)U]~fJtJ\cYّʁŢS8:ݠ}37A7%_C`,4_?' ٧_~YtOI 8{t:"C,6S-*dV'_ iيY+{qe(ʖ=DnxTq.X*{QSYvJx0݂ڄ`&+RעȜ`p!H'3b98Y 9FG(S;2$`<3F't3J{q:#?.fDYl/0"$u)/(W'u/ IDؾWbajwl6gtNgkD"2r=C57z! % -F&;B}+*QO:wE#PN<wwu a 7>EO.<յR V1y ߡ-^\X_E޹2ypK엕)]Υ^eF:歋Alv&"Fs jx1 —έ F1\*tL5ť| Ǎr 'ѨX`&j@&qT&\/ăպ̌"SW;  n0 gM3wCw6?.rG k\YMV 4_tyW aA*k*{U[%Ε|kԁC (,,Zo~ϡ)r>/jwQyK"M Ŭ 7_fHwJ*}JHe:QHGf׾ul3kccYaihec͍sY/I5t,Q뎎-7]m >vJ&8.@nl?V4dݮtfv֜ZlTGtTuqC)2h0  F8掜XHh(}F~vYe !k.1B@~NJJ^'$e^i9 NZ+PzfЦJHaP;xS_<&xcn[h~>ڎ%Q4~AQ(a!gjb6^1(,?Űی߰v&gAMe꩏ZUw&o{.ێrV{MZʮ4BeۧEY=(H!V#<g(  mx?k!}+a#1I" 2ZF%~DaKnZ h\ VE+s*:cn/*mF~OlPE2_G*CSp282R"%s~R֐I.=}J@.z%PLF3U> Ժkv5}=afPL< m|׷Y^2Luj.$lONoJ;A<~4鳶;Ikk/AuE{O9v G})<2-\_n`~T0>,% SFY7ߞbfЍ5ִK(*1T {fNlTFh7RIrg9g@58OLU/{~FUKHCr0{, >ez܇g*S$c|Fj^%F2s0qVL;v~nQaGah% wB (z.j}i٨[C S߮h | c<g*㚻 U`@='lRu{'K1}o*%e1:GVO0y0E=-jF4pO!rk'CkVcU[ˆ oDXޔ'to?5ĵs f9Zal;`O"bW2(L (R }NbdV}VY#r'ߗd+8, MGPGswEZiSsU1}[Lnp['eC+}'[o,#+[a+x@:!)v]^>t.(cW T 5ޗqV~?! L5NTNk狖hNIg H-ъ1IInHZzZL}A NOw?W<ݵJdNo`΍+p\7;iO[ȸio:x!3i?Pc!ϧMBo=u#[~s>ݰ BZu@[Ix n5^7!$(FehyM2EX~S `̒- ~T8uy ? jӀ^ml25ƙU-F{>*Ywߣ<2DPA3siDX.4! >Ja#|SnV}sF9a@7)0a!j쏟zF:yc]DxJhgO%2BQ}Z(Swu6RP] `e…$~?r1w=h8䂑<'ɑnWi qYuY^9 }B93d&^4ld0$t0M(Ƹd$_FqٿXz'p$@L}I F4&N/vk nk!-sf]OYFL`#*_Qޗw(FJxvBy)6 UGG{-D4_Bŀ6&\+5Rkjmz0rPd79@Y@~1GN)O_UL@%V!ע}uQV_d' {RӤJ"`r` N%d!5FMɖB8s#3PR'a:}UgzHqgΐh#t3^OŠboGǃ9C!y0X/Q/A0e]& Rè ;) mjc^h;o.\qmt6/sZx_.~T70C1/%DE&M4b(Xy@#$-}$P'1+{t!)"wZ ~wZc0G@k]0LAp6@,_d5JkqBGTB-d;] ZNbxmQW:^8u,7kLIxߝW끂xݘӯe5잣+V$V,EKva~Sa,ƞ2NHX;KnF zft O3bU)D`bC|%pe^!p D:&5SDB~!(VJHy~XԋAoX>Sx-`ZUX/yVi=/G7tv3ԱY0 ډ@iQ<F 콹 %Am"pET C>:у#.#M=)#ՈRgජC_?;SQ%k.^+yH-.T*݀o ̎Ob٤H޸e^l:*p b` e@1\leYN jo"r ! <{*%p|. L. N1ENlRie66C@B[X_hfk{LN\"(SGa[f" ^J^ #]@`$K3+yA y<0mr?n="yM)+\g̽"n6c.p2.ֻk/߇Z;@0ƨ UKg"읁G{PtAuh{2|~D=bF+EgijRsTfHH7ߛm{nŤk%svhbny /sNea,`pAb:!Qs ˂esi-wƈ3`6̿2؄"]z=iŽW $=^ [WY,Bq@LqBL? &.Ûm"R퀀@Ȃ nUm2)n8)co`>w^߆i>. q((4ꡢxڨct׃kl*I%@vUl- '0z D1B:#:g=w[s ~ToW xQPZ_/-e.ô[Youah>|∳|r q@1ƚt`[nxNo}x--H|D5(FhPM'w0ЮKP1Ed_7Sۨ1Dzݨ3Q!+U=vB#yݒzp}2"+(4,}x"*. #W͍%܄D9#JEbq5Tlh PRͣzDz><NSN'`_- }S:3(gG皎 Çf\S>0-2@Ȝp|N_66u1vVaVک7A/]zQweGwIxc5ѕLk ᭼֪HT[TC:P4Qߐ|5/'>lCQ,4PdO*p6]%'B7e5lU@,O\%gLEO ,H򖕩*3+^-6߆B؋h4G砤4UlD."Wi󖉿Ͽ CBnArNv[>Ţ?2PkFf̥啱LuHk{K !1󢜵9|A1͏t&ў}iX[L zO,&A-H2kuB0\AYaSgbDy%M|J6薱Pl`רI0+/'KX͂Fz ҅L“\]i }17 ύbfvo)?h܂R(lzW` eb1* +Cc矨>f1'ԟDO9B t;_p҂UEPg[ b G8n^LP-?U]I;/KIeEU5G0*+K~L&wR#M$rsh'wἌIg!aJQ8-N[%$Ϫy|>>ՠA<V,ivu3I:띙3}4uP҇@C]8Qɠhs^n@.[n+SHFy_"~PW|.6aVcђT"8ǻ3P4-Eu=t_F>LD0})lP }LN(\BHx.X{H+.6smP[bsTglw UXeٯxvsC4JV[LCE WєY0*l1al:2`tgԭ;yEW})QiQ+Q48/UIDZ)㤦Slj s#GEpG3h}[I1=wkwն|S78 wN D4G9*c:j^ w1N{!NY 9Jz*wqPJx&s!ufĊTAwJpW sk( 1d_"SV$Ŝ;`zeXܴB0dG bCJ1GE@ \CZ}r(kQհ?~nvsJ`EC=!>9t&fE$YT9{8A=wip- h_(OmZwE[:8H^O3_2:Kg3YsvƓCw=.5B!ArmlJ9#Т>XT׵}`cf+]i1i7K| B;b\YMO1<0oqz9W!aݖ9DאSv>N V8YaZj`C)EzF{W{?eίظpvEd&,n.4iY vS$:B~jR|*ЋI'7(fU||/NcڕU[4Tа[-ـmZtYcP]pA@z/7*8|S9Ð Ep9f`eH9b$N+Vc>yC4@ȪلC'ۨc{KQi`m{Sٓ:eYC=tN K(}A9F6ݫ9sУ,H1{8C;6ۇݰ?Ye ܠϘ\1L@tъ(ׇV{. UTe;^G{/x'Cdj?u0c\P < o\NE^ -ubwDœ!eF+JD:s:^>̻l@,lj/b`FνUYͫ$Khf)#sxWpkU!gƨw.خ@__gzho1!E1 `憋+RwϯcA{ 2/pʳWW̥%*HxW(Y6"SwՓρk@tZ¨\zspkh)<4|uTK 6g$4TѮ4M(nDՏ+')>hҌÿ3qy TSqCc^dH2@kJ??7'42A`Zny?d@iAq<LmԈk2/BMi u)nĥy'1?BQ;MH:ѨO'S QZ܂i͸֛@#Bx]epUTTk[q[a gP\5(䙤VqYmVMtXرezxеJ~qۢ詪doP1f !<"ZG!VRMJ~~Z҅ҷ81d`J9Gnvļ^ %#e7 k /4(e`xo<Sp//EMm7w䉑ӊղ'')ݐ;v6}~3p *1Anf#Y:jS="ZҸx%D v`fE4 ~ U5a,U گjEw YNʒ$C]J1pdVt`dsQ9{~J:,T*#_(З xlhWkK1:J<)++f?͛ teՌi?&k=x U??lyk R̵e&CcхcJ: ӌ t(DZj9fQaP^mXj/BMPKOk&XБhK˒^,V$夀ZZ)܍;Df^g4{ zʃmHp)rꭆ0{{/x{qhK&}m6FQՓ6!9zʬ!@Z:mFg!s es,;X`^-F$-]R:yY@]̓8MoPK[(jK +Xu$$_\,,D|7 (S@dq/w42cJ eVܜSAd8Q AF۹<]&tlm>y5JKDI)Q4^5@[}9$5gHf@ }_n5H{[{70F 7-gXRA޵EtaFVCy&ܪt`LS N(4eڀFXif\4fRͅ;SaVh}Nʒ/Mn{[X_D fuPČms*B) w Zض=31cscYDi VvH#Cckh,F#!(BH;5jнdIS9S&O)p&WX޷^|Ҍ991nJ2()^,Eak(%6z @_W4 IR3濫` ~Y#q ʳs\e\xo\9.']qk\y{/+vTgJ&уPI,Xm%&gdd!8N'yNUʅJ~W \6.xkX=uL'7u6uiF:(kbܑwH%u~dOOG@{=HmLX;ټrL:S2qf|6 2ƮˢoV+ AۤR OYffB5Y_o]'͹s[!!yt#+Ѻ/7NQj:!GL0o˗Hԇ$}E|b _l[аvw[5e V+Hek߳:Ca4˒fx+ An>YОo:IlF'hrR$uCus!^ٷ ="Z8Lth8bQ#y,rQL\+3.O@vxN_RLWܨd60&AZkRI|R QZXVWB@3m&hu"b,y'4%wz-͇Sa?u[0G)0ߪ|h2bK%了M!>ݪ;4ӑ&ggm .άul!ĠEjKUp\\u'rܘH o,cx*H)3*nS,; zjQ|,VW'3KEԥD7*Ԏ-& |5UA'xUVƨo5I{Yol΂둙fi1p$dබ~4ǾЍFh/LޣwK-+!zي%AmNLNn$%UZ&aR;XEr glҹyZsu? W6qdyBϴvh/4,rɁ\Wi;;3\̆r"5=,nos}eAMF0+9?ab D+&'e)I$J|<&na#\)٭O`]Mˇ1 3X&5gƢIĩFQr>5wQdT(J۝y@X`1 NU-ҵ1u1$c[DG 1QC@W-'ɏ!6F9(qapC4Z3 yT1oo) ҊG JH 1 3{W= HڿNr7$FQZ2hĝk\}18xsWC'ҹPOS9~ڭs7HRʓ'~q]' #K P8LAz 2o%욬U a}lru5B0TYQPXvu"s P:`ѻiAb̒* :XMU#vMmJAws` titKt`eI&Mݭ hu7#y=9^`^ }qm迺:U{FǶ}W(lhW$|~ uI舐`vHQ&f+W9qQ0ȗQ7qTq0&ZAxC>ՂI>}/WAÐ'ZVʀEC9W2'jvїnlT6)bZGq8Zߌ^B*n%IX=5hBGY= :64r}Um)`>޽E?J<[ sK15v.ɂ؀Grq2J̶Z8 cҞ)F$n5PW. 'bXQʿTͮ]֨wT">_' 4 SBd=0@~60X]Sku_f}&=5KU .;:`: 7E:)qVFHǑ6;$1B6"W)Y ;.lπe;]{*"cV<*<$Rs$1IPm/Ji0QaSlLȀ{MZ˘s`2CgNn?$ NytR [}s"Pzi-b]zz482Wf?azmea1^$k J]j^v梨:一r/or">d΅ 0*Io|H3~̘_sxIOX4޹<T6e[ƙsk%Z6/@kUyx ESL?Nc\ ڦ!j;9 S"8cC )-ևfNiD*A4$V`1(tzcL˽酼\Yi +7I&UJkMin6n&pFyh^yl==E^%z{μ}ve[ě=7Zin7ZF+"Ģ/;C_m732n[ޤɜCgƴW=iiqڈI@o:Sg8]n_$#:^ͭV>9c.ȮnEi1{a OMu .ٯR'Xcct{[5Ĕ,[xSvnp+=;j7D+} E M_Eΰ*ѓɖ6Djs ٍ 0W |Q?+v*M\a-)&?/:x~v; ɛaVu磊j#|ӎ{23"$_9%/dZK6\`f]!2Y-񑼅nn(;#nN;> [Ŕonrګ &uڛ!ʊWFS C)$5)؂P6uZ#|kdkTvYe6PF+Cr&vlDsҙ^gB~mIPQE0|҅t䙆c@<^E]CZ&waq-qG`eS`?VXz0_>bfX1;~X*\Ó(a+Nˆ[Hiyc`JJCwQ[ _$C0*?Ze\:8!Hi'*`b_:RlnZ&[vaG媔(^6R}qxkzd Yз,ܴ"H N!M <0q`T̴2= ۳ko$5 |p֚iL |u 1i ԰WoҭiDΡ".O;borc;VuHmsSJNN=5an) (G?? L+QyO3:rgHL(;7kaK6h[da﶐%>,{Y*>a}65TPu샐"rrcx>8x'i73ԄB鑫(#Y+~iO.` $)g A/h]0l(&v~c3) βp.дlDwbꅨ@MTkbW@&lcrhSSNz)mε| Ι`M.%Xtlu0XQ!n3l&%fI-$(xI<dU_ ~UVi)-Nn9=ظ&|-_7BT : B'DYˌb3&Jel7qD:eH_>؞jRpўe(Սx;s[zkۧ}kaު 4RNOidSVW<"2CID3m^,u!@%F_l *Ypy[4>Քެ1Ï?[,:m0;cY7Ĝ UR4}PݖP^[MWMQ?|Ќozmrh7rV A_韖3瀿peGN`x2N:1̸:*t_¤W[@Ʉj-pD{Ӷǿ*HgXآ[qx#DI:+8d(3aU`!E }-@[qcv6@:+miZ) X/ھG'>Oyג+ sj|2 f^D:Ɣp9(քٗ"z>[C/,/zOsN,,N8х# ?SFM)-A-摴Z;dhh|ĵ V}hrj=öNFh[Xm8g6Z$f&E0%/$m( ' [T l\+ M a#bAG] NJ`ۤhn|8aZQk3MC ߴ iQF?kn*[CۀwMa@=1Ԝm}]Ay Us~$+`|ex*yzƨ#t7[(^odnUW_,SɞG]*Ahj((baWŵɄ@߽ik%pY2#` l ئ-"|0 6**qVѧҳw-Z9i|MϡE2Ј݂AWUōs7n?p^+2Pj|-E*MQEDAw;LQX޹ފ,]\sA)C[!cnyOGdW5nB-kZ3!cyN)p0I!ELSc3DNzLmRv')f7"loIWOKtC4XИ:)#tp赾Wx?Pwgxs5S /Snc@-̘oh~8yWf{>_iZ4u_+IӒWɺԄ7ëY`#gϑ=4#/ QE[Hoso!O"EU(*-v=b~"Q7`){$zoƾ~}j4r &|ڮZ<^ HϻK-Byp뎭T'MĄTLZ5`d]'6>\ kd`+M\,o F2zxOV:*rX'(/lٽ"虼'[7t?Wnm:ˏ+ZDQ3M~~_m?.0Rzw{e3046{uhE0ΩG:Ⱥ;4꣢=Uz|^>ZNT\ι>cm2[gho|I#e*絀BbZwkvMq _Z&^Et#渷]eBvպb&K)Y/43e ! "] ۄ:BI]b07(wu v"mӂi5mu&D'cTUZNWU"V'=fzIDt/GcMʣ"RnP[B?6]޴η %q>ޮMKœ_prx`䛩 f@C;Fgּ?Ф삘?!E[w<{W4X[1Rw"a\!N6&G3 f`Ӏp)_i <ʗXV͹OaA\Jg?#ه+* q ?#lm MQ;99_L33=. 9J|Gs2/n>@B #u$)"z.unh" ~zm6 E}*8uR8R%rjiXwO/VDDvmݑsrrg9d s`F ;puaӭx`lMt}ҫYΖ Y7ͪq8@RIf%kSDN$&{T5߆-dpqB)\%X EZxTU[fNGQTśI7`!)rOI?^b|Kt-s6>|'Z)D|J%/ ;n#ߵT_ +ʑTN$&$@)dhZkc B{k,&绒vϴwU<_RO[򣠱̧di:ٮZp2r}J@}Diu|%Z 1> e; }*q~/L=P _~8kSfLL2D)(T5цځpBҐ EZ6) GmXŀuDJH!U@P!WpV9V)aOa%CqN0?=V/[5jy$^@rvۀD(y;!DÜ>&\cn 6q:aOg+al=INYԧА2"ܮe&8dc*%0nKs95 ^PޞĎtFI ,5 y7$'d)r$wEKEpE͆ts2 >Y}.x#*n;`|:?w7 &Mt߁t\&A,?\o(KBNԷsm(fG V/'svPaSJ/p"ήY*ߥ$G)}hDuj c8:5wLlۨjűjqnQ88ր2bBY< !"g &O$o ǁ{Q .[Z_ckQ28ÜTd.y\ާxqYQĸdZ- 6'm[}a\Y%I1j2fhwnV\Xeg4q2Hl9,4Ľ\#‰O`VqD˅1JrsV]+ܺbS~- ufMZz) WXo[ޢ WEY6n+Iy*QF}ȎS@ԓNX^M_+V (V7 9Bl %3U\#%#%(*0yrTMr/FI3]ǩ SlqVYG;73ԑgAKxpŰBSK O%c,F$ݩJ' Ź>@PA{~ERYُl8]H䫾?d'bkd0P0-z~ T`<`{ @uU*Vm/oDg.Oz] z$l@>w< s&P SUU=k˕ӥ ~|FJ[JR6p DIZkn(;ߘEc^WX@FxOjÀnT7_)]D{baYž2`OS@\) 2o{\AVGWFi#f%wCiw,/rZ6 .sB-i9gQp䱏XfeY$H*([{%iEr P<6sq3m ɥF7 ,}+CZ+|%\8)x?mK^pZ\-ب✜mUg/n DP!5g8V@LTށ!?,\o][{d(d IqlN)v icWZ@aԅ^,e H2Pe Y@/NwP+e٦pa>Uhb%!XHg9N@Ył@(<蝡.4/L1FDn|bzRtW5 5wI$`.E܋B`OTA,to-KerzKK\cϱ:He2GV€Mg.fQХW6| K2fAdhPHR\˵z]2n(sJxMj)::3k9۴kj9bдb#=Vm:=Kٕl){U0 : iL>ld\|6՚+n{E@gVD&t%`UG_T0V[G П䤮‰VsJ& |%|#=FAz~xFm_tϮaa$91jIyJjTKog}5x0?ds<:vuhOV#c|\*dHfhWFLY7̏ 2Z sf`-Ȕk\21Gj>Y]fAPLRP^%ML ɨpþ`e\٪Fzmf#M҅AZ\E³h|oCƸ}-sLz6sEл_^Kk}-5Kɛ0k+-wР IsʻTy9 ;K_o>?q6v`9g?(Mhd;8( #ØM{M[c<_fNx+G?Zk׆2;Hm| 舝.|b8GmSY lwPQaHmK2& } l#Y Xm5 ~gSgcҟR3 }5βH dp4L_9ңG(Tdcp&s nP2|J0YVbN=̾g,1gkP6̤$Z077R>U9(E ]Q8 h]8ArifbXz#Mu)A'~ lU <^ai)J΀\MJFW~dgYԚ1`:1hQc&|7'Yyn uYHc/R']ۏ֒-0p|dD+(W O`P_[pSpۭ&^M,iwǪi}+@7^ZWϯս,CHd_}̅ڱ D9ΒGĜ.2hF$~4:͟; B1A*o3Q\]x͗nE2o.`E?@P2YtYؐ@1 fѠB.!Pn1}doTgIfrK~'j]ߜI`M7-K?  ~1]|sԼu N܍, E4G9iNw'\%.rDD^8=ƔBjG¡1=Kag!tF+Z#n4/K (cAyB/"8^N ~&@"(!(e[iZ?jh=? (P?^^= ac_&?C]WR H[e47Qf[<iF pMd!u=U|V2)~*&,C*$mz<đVگՐ.:;|m-e9u4>%qWA.LU?>SEHd[q2_iy+/S@~smK[9[`q yswaH]o-pPWVbXA5J~U9Q~Lr/a(goz b'TGRgGV&zPr3io 9H%uX&_4ә |#v:hv[XS}v!kůL  <[7GbA4a\ J8Cs`":̨j,;]D^Vivg&38[q!^g5le(ԅU.0v&9I2l7 lbސeZR<vπ"#agܷ~:h+ pHAv^("s9{b&x'ToQmcrQg]G.f$ ̓XJ*Q|'ǂhnGciYY%iR[J0u=Z/74B@jw_*uYi iZ ltN,K±sZNk^TP#F8_lRu>H9ͨcX}ߨ0}q*: \P6eTzc7!ϵtنޔT鯂8[Ѹ|F)S/e7+fI⅗)D!*R/du}ϾFb_䩳שrZU7}0Qgywfk MP^m9 (5469@[\gBNkk>{{{KixL}>=2Y /t0c#[FU-Is\9[N <ᴰW94(ˣ8cA" Wx^LFY9X20Hu#I w^;.xWaCڮ+B[|6XRr;WGk *GQ1L@Ug ӦZoI_8C#(ơ^ȰjhekėZ~;R^2 EGRh'-C$) iM 5w|Rx0-.a=,r^sؚcsc}XÆ ta!wPǎؠK?[hrRk?r=u"3JJ,9kch96h$C::*7f!@Ȳֿi 8?@DFT1@dWT`zP![Pvx= Z,`=キQ\+*:_G;3%:&SwbB .85c[fk>P˦wtyl6d0T^k"ew&44/rbݥ ? V0U#{I332|Gf23k]RC62m1OŻG|n=nj`y@[QPM4BeIM*ΝH4fDA=~-ͭnT?<׋SVͯ0'aJJyX,{9IS_0m`nH"2v;ʠ+}ζe Ͷ 9X|*/u ו `o}8rH4%IB+*WW0§pԓfn5j=?iFڥpļ>9HMpICHS q3\ݱ@Q?g 4 #jO'/uKTQHTV}G&`3(UqC44oL^6ʹi><88DQKnK]9QoUI95(TTdbE'p+\[&1Tx@QC)gh8?zb :V4^7"+# \^"0 VPB`FGh}[K;$@\c<1KRjj Fx"bƾ(͍WIkL6.czs)\ݕ) E'_>LW< 6aUmPG[3-x`7o֏Tu\E$E @/n׾B/ mh;Me:hx"#}b;se۟[?[J/ׄ@*~ `ͧ>gT^.̲QT"r*[?Y]@ԝ`g'΂?&l1^5t=pybBxR<.2JDkq95>kрaI,dkU>AǺ;UWUWPFo'Y8c$rrdy:o6U_8j|vA5UVtAm*bc#$(! ɆL=Z74 xItJ [QvjWmFq! ܟ,U>֔)ֻ5 ĺoq:p.6˼WͤkRx .9n ^ݦdcϔvɑr"]U"L\ a b'o|]\M?5 _j(]vf_bepg͑#qO'"kkXDwixd]j?lJ▕p&FBW`Bm vnkOܰ n'曞kHBP^WJW98U9 `#ÍNWVk6Z;}uu6f+"UN^9쒁IES|N/f- ߇U{%*3/1 H./aCs6. mK ͬ'Gry4f{YVb Yqfy*SIΣ' +;a@:d&~[G9R;7^Pr%t7ؗhECk"~ܥ4]EtOЂ7HiH菒@='A6fEZ~KuH=Y٬W X<ߺpޕŽ.dBﺢޯu39kΩe~P颉v`^al&H)DsrtDW~X%SY.Dϰn""QCajz_01b:%K3Jm+IZ߸~ID(K((/ shkdb!n(?=H=h֋ ^muṿV6F@# F/\+$ hW+Ŵ' d3C9?Ϣ~ޕ7fKf[r4haB#ELyFvE-n6ɛ}f'YEr/p2U\spמ>s I0'K\:hYrz14zƦ;P竵7҉žLK{ E" ~z&%ONMٴHAR8O0'| W߃gN@^Apgb[Xp%ȿd1`xLu5 ܫ(yS$(t&98AB{qۨ(]׹#{2ETHeLT#NmOSiMS[u GJ-F[MN~d̦8~%pGmat6]=LaЦ7HqF'bx4A?oyF6^CNNhmFgVĕe0,G|ee4M(ѼłL ۘ |Qm+05_|~f8V&*vM~3 '>ZNk^ :_f,MG}3ŲਚKIA1e @A&̑,.b{ 5 q,:&RS@n)&(ݔQx(a9Q["YIdOJQ.T3O-UkK,1f&@ 9]ٸB% ^,#p`yw-B?gh6 r_8 ^}a;6J1@}0^vtF©IV @7c)a<:J􀒠p@BޣAC3irzCZ0Q, ֊פxPaSYK vgQc*e12N0Y^xշj,IJNw܃Qwf*$lӌN?w;}~E9><_jD?N) Qٴy$ .J$AdSe}fzt~A[q;HcĻvu2&(fUШWZlyhD+U')iyddVmoN%`?QV+$]!v#4ľgKՆ6^!LB>O+ڂhaSSX4mK^*Uoy,.pX(N$ڠr"_0wW * 9k:J7%Zn6F8}Vg^0B2bh#dO5*1$ k^yBYǹ~g;r3 67p8 "IvֿcY S6)wv+Mﹽ-*4|pZo.Գ9az\fDۺ 9Hj fSwIP'&Vh<#77u+pnqs ބ I:+ 4n˯۾^*sW Z*pDs]SD'ĄISNH^ >պ RxǴ6/GT_@O)dEh#k$>JU'hx$Q]yPK;hW^!ƫ%DIæQŴ_ZqTtdpO 5J2ٖQQ@HIq+a)&4YvmM|Иɥ@m$ $z8smК`r]Gn? }*|q0sh^xj,~t]5u3:&v3n 6x\ 0;5NI"00+4"HWh]%AD.Lop@uX#Q:R2+0y8A֗M̮l"#$M7275ߣ$v@#Hz:v?P#wf=A}3 <_FYĻ]vMgo{Ss1RjO X_ܷ@ :`AQIb$.)nCC-~&{ƹ$j[q _' 0;r  zjE"(㡡*K[ $ɏwZ 2Ư{VϝqRZ910wdƕ#i+ <EzgZ>,&H'U̮Y=M7-14czN}кJF 3$@;3^*ٚ[Q-S.}&"- @>@@>@>@?@?@@?@?@@@@ @@@@@`@@@@@@@@@A@A @A@@A`@A@A@A@A@B@B @B@@B`@B@B@B@B@C@C @C@@C`@C@C@C@C@D@D @D@@D`@D@D@D@D@E@E @E@@E`@E@E@E@E@F@F @F@@F`@F@F@F@F@G@G @G@@G`@G@G@G@G@H@H @H@@H`@H@H@H@H@I@I @I@@I`@I@I@I@I@J@J @J@@J`@J@J@J@J@K@K @K@@K`@K@K@K@K@L@L @L@@L`@L@L@L@L@M@M @M@@M`@M@M@M@M@N@N @N@@N`@N@N@N@N@O@O @O@@O`@O@O@O@O@P@P@P @P0@P@@PP@P`@Pp@P@P@P@P@P@P@P@P@Q@Q@Q @Q0@Q@@QP@Q`@Qp@Q@Q@Q@Q@Q@Q@Q@Q@R@R@R @R0@R@@RP@R`@Rp@R@R@R@R@R@R@R@R@S@S@S @S0@S@@SP@S`@Sp@S@S@S@S@S@S@S@S@T@T@T @T0@T@@TP@T`@Tp@T@T@T@T@T@T@T@T@U@U@U @U0@U@@UP@U`@Up@U@U@U@U@U@U@U@U@V@V@V @V0@V@@VP@V`@Vp@V@V@V@V@V@V@V@V@W@W@W @W0@W@@WP@W`@Wp@W@W@W@W@W@W@W@W@X@X@X @X0@X@@XP@X`@Xp@X@X@X@X@X@X@X@X@Y@Y@Y @Y0@Y@@YP@Y`@Yp@Y@Y@Y@Y@Y@Y@Y@Y@Z@Z@Z @Z0@Z@@ZP@Z`@Zp@Z@Z@Z@Z@Z@Z@Z@Z@[@[@[ @[0@[@@[P@[`@[p@[@[@[@[@[@[@[@[@\@\@\ @\0@\@@\P@\`@\p@\@\@\@\@\@\@\@\@]@]@] @]0@]@@]P@]`@]p@]@]@]@]@]@]@]@]@^@^@^ @^0@^@@^P@^`@^p@^@^@^@^@^@^@^@^@_@_@_ @_0@_@@_P@_`@_p@_@_@_@_@_@_@_@_@`@`@`@`@` @`(@`0@`8@`@@`H@`P@`X@``@`h@`p@`x@`@`@`@`@`@`@`@`@`@`@`@`@`@`@`@`@a@a@a@a@a @a(@a0@a8@a@@aH@aP@aX@a`@ah@ap@ax@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@b@b@b@b@b @b(@b0@b8@b@@bH@bP@bX@b`@bh@bp@bx@b@b@b@b@b@b@b@b@b@b@b@b@b@b@b@b@c@c@c@c@c @c(@c0@c8@c@@cH@cP@cX@c`@ch@cp@cx@c@c@c@c@c@c@c@c@c@c@c@c@c@c@c@c@d@d@d@d@d @d(@d0@d8@d@@dH@dP@dX@d`@dh@dp@dx@d@d@d@d@d@d@d@d@d@d@d@d@d@d@d@d@e@e@e@e@e @e(@e0@e8@e@@eH@eP@eX@e`@eh@ep@ex@e@e@e@e@e@e@e@e@e@e@e@e@e@e@e@e@f@f@f@f@f @f(@f0@f8@f@@fH@fP@fX@f`@fh@fp@fx@f@f@f@f@f@f@f@f@f@f@f@f@f@f@f@f@g@g@g@g@g @g(@g0@g8@g@@gH@gP@gX@g`@gh@gp@gx@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@h@h@h@h@h @h(@h0@h8@h@@hH@hP@hX@h`@hh@hp@hx@h@h@h@h@h@h@h@h@h@h@h@h@h@h@h@h@i@i@i@i@i @i(@i0@i8@i@@iH@iP@iX@i`@ih@ip@ix@i@i@i@i@i@i@i@i@i@i@i@i@i@i@i@i@j@j@j@j@j @j(@j0@j8@j@@jH@jP@jX@j`@jh@jp@jx@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@k@k@k@k@k @k(@k0@k8@k@@kH@kP@kX@k`@kh@kp@kx@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@l@l@l@l@l @l(@l0@l8@l@@lH@lP@lX@l`@lh@lp@lx@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@m@m@m@m@m @m(@m0@m8@m@@mH@mP@mX@m`@mh@mp@mx@m@m@m@m@m@m@m@m@m@m@m@m@m@m@m@m@n@n@n@n@n @n(@n0@n8@n@@nH@nP@nX@n`@nh@np@nx@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@o@o@o@o@o @o(@o0@o8@o@@oH@oP@oX@o`@oh@op@ox@o@o@o@o@o@o@o@o@o@o@o@o@o@o@o@o@p@p@p@p @p@p@p@p@p @p$@p(@p,@p0@p4@p8@p<@p@@pD@pH@pL@pP@pT@pX@p\@p`@pd@ph@pl@pp@pt@px@p|@p@p@p@p@p@p@p@p@p@p@p@p@p@p@p@p@p@p@p@p@p@p@p@p@p@p@p@p@p@p@p@p@q@q@q@q @q@q@q@q@q @q$@q(@q,@q0@q4@q8@q<@q@@qD@qH@qL@qP@qT@qX@q\@q`@qd@qh@ql@qp@qt@qx@q|@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@r@r@r@r @r@r@r@r@r @r$@r(@r,@r0@r4@r8@r<@r@@rD@rH@rL@rP@rT@rX@r\@r`@rd@rh@rl@rp@rt@rx@r|@r@r@r@r@r@r@r@r@r@r@r@r@r@r@r@r@r@r@r@r@r@r@r@r@r@r@r@r@r@r@r@r@s@s@s@s @s@s@s@s@s @s$@s(@s,@s0@s4@s8@s<@s@@sD@sH@sL@sP@sT@sX@s\@s`@sd@sh@sl@sp@st@sx@s|@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@t@t@t@t @t@t@t@t@t @t$@t(@t,@t0@t4@t8@t<@t@@tD@tH@tL@tP@tT@tX@t\@t`@td@th@tl@tp@tt@tx@t|@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@u@u@u@u @u@u@u@u@u @u$@u(@u,@u0@u4@u8@u<@u@@uD@uH@uL@uP@uT@uX@u\@u`@ud@uh@ul@up@ut@ux@u|@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@v@v@v@v @v@v@v@v@v @v$@v(@v,@v0@v4@v8@v<@v@@vD@vH@vL@vP@vT@vX@v\@v`@vd@vh@vl@vp@vt@vx@v|@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@w@w@w@w @w@w@w@w@w @w$@w(@w,@w0@w4@w8@w<@w@@wD@wH@wL@wP@wT@wX@w\@w`@wd@wh@wl@wp@wt@wx@w|@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@x@x@x@x @x@x@x@x@x @x$@x(@x,@x0@x4@x8@x<@x@@xD@xH@xL@xP@xT@xX@x\@x`@xd@xh@xl@xp@xt@xx@x|@x@x@x@x@x@x@x@x@x@x@x@x@x@x@x@x@x@x@x@x@x@x@x@x@x@x@x@x@x@x@x@x@y@y@y@y @y@y@y@y@y @y$@y(@y,@y0@y4@y8@y<@y@@yD@yH@yL@yP@yT@yX@y\@y`@yd@yh@yl@yp@yt@yx@y|@y@y@y@y@y@y@y@y@y@y@y@y@y@y@y@y@y@y@y@y@y@y@y@y@y@y@y@y@y@y@y@y@z@z@z@z @z@z@z@z@z @z$@z(@z,@z0@z4@z8@z<@z@@zD@zH@zL@zP@zT@zX@z\@z`@zd@zh@zl@zp@zt@zx@z|@z@z@z@z@z@z@z@z@z@z@z@z@z@z@z@z@z@z@z@z@z@z@z@z@z@z@z@z@z@z@z@z@{@{@{@{ @{@{@{@{@{ @{$@{(@{,@{0@{4@{8@{<@{@@{D@{H@{L@{P@{T@{X@{\@{`@{d@{h@{l@{p@{t@{x@{|@{@{@{@{@{@{@{@{@{@{@{@{@{@{@{@{@{@{@{@{@{@{@{@{@{@{@{@{@{@{@{@{@|@|@|@| @|@|@|@|@| @|$@|(@|,@|0@|4@|8@|<@|@@|D@|H@|L@|P@|T@|X@|\@|`@|d@|h@|l@|p@|t@|x@||@|@|@|@|@|@|@|@|@|@|@|@|@|@|@|@|@|@|@|@|@|@|@|@|@|@|@|@|@|@|@|@|@}@}@}@} @}@}@}@}@} @}$@}(@},@}0@}4@}8@}<@}@@}D@}H@}L@}P@}T@}X@}\@}`@}d@}h@}l@}p@}t@}x@}|@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@~@~@~@~ @~@~@~@~@~ @~$@~(@~,@~0@~4@~8@~<@~@@~D@~H@~L@~P@~T@~X@~\@~`@~d@~h@~l@~p@~t@~x@~|@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@@@@ @@@@@ @$@(@,@0@4@8@<@@@D@H@L@P@T@X@\@`@d@h@l@p@t@x@|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @@@@@@@@@@ @"@$@&@(@*@,@.@0@2@4@6@8@:@<@>@@@B@D@F@H@J@L@N@P@R@T@V@X@Z@\@^@`@b@d@f@h@j@l@n@p@r@t@v@x@z@|@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @@@@@@@@@@ @"@$@&@(@*@,@.@0@2@4@6@8@:@<@>@@@B@D@F@H@J@L@N@P@R@T@V@X@Z@\@^@`@b@d@f@h@j@l@n@p@r@t@v@x@z@|@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @@@@@@@@@@ @"@$@&@(@*@,@.@0@2@4@6@8@:@<@>@@@B@D@F@H@J@L@N@P@R@T@V@X@Z@\@^@`@b@d@f@h@j@l@n@p@r@t@v@x@z@|@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @@@@@@@@@@ @"@$@&@(@*@,@.@0@2@4@6@8@:@<@>@@@B@D@F@H@J@L@N@P@R@T@V@X@Z@\@^@`@b@d@f@h@j@l@n@p@r@t@v@x@z@|@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @@@@@@@@@@ @"@$@&@(@*@,@.@0@2@4@6@8@:@<@>@@@B@D@F@H@J@L@N@P@R@T@V@X@Z@\@^@`@b@d@f@h@j@l@n@p@r@t@v@x@z@|@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @@@@@@@@@@ @"@$@&@(@*@,@.@0@2@4@6@8@:@<@>@@@B@D@F@H@J@L@N@P@R@T@V@X@Z@\@^@`@b@d@f@h@j@l@n@p@r@t@v@x@z@|@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @@@@@@@@@@ @"@$@&@(@*@,@.@0@2@4@6@8@:@<@>@@@B@D@F@H@J@L@N@P@R@T@V@X@Z@\@^@`@b@d@f@h@j@l@n@p@r@t@v@x@z@|@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @@@@@@@@@@ @"@$@&@(@*@,@.@0@2@4@6@8@:@<@>@@@B@D@F@H@J@L@N@P@R@T@V@X@Z@\@^@`@b@d@f@h@j@l@n@p@r@t@v@x@z@|@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @@@@@@@@@@ @"@$@&@(@*@,@.@0@2@4@6@8@:@<@>@@@B@D@F@H@J@L@N@P@R@T@V@X@Z@\@^@`@b@d@f@h@j@l@n@p@r@t@v@x@z@|@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @@@@@@@@@@ @"@$@&@(@*@,@.@0@2@4@6@8@:@<@>@@@B@D@F@H@J@L@N@P@R@T@V@X@Z@\@^@`@b@d@f@h@j@l@n@p@r@t@v@x@z@|@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @@@@@@@@@@ @"@$@&@(@*@,@.@0@2@4@6@8@:@<@>@@@B@D@F@H@J@L@N@P@R@T@V@X@Z@\@^@`@b@d@f@h@j@l@n@p@r@t@v@x@z@|@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @@@@@@@@@@ @"@$@&@(@*@,@.@0@2@4@6@8@:@<@>@@@B@D@F@H@J@L@N@P@R@T@V@X@Z@\@^@`@b@d@f@h@j@l@n@p@r@t@v@x@z@|@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @@@@@@@@@@Z`@ZP@Z,@@Z@@Y@Y@@Y@@Y@@Y|@@YX@Y,@@Y@@X@X@X@X@@X|@@XP@X @X@@W@W@@W@@W@@W|@@WL@@W @W@@V@@V@@V@@V@V`@V\@@V8@V@@U@U@@U@@U@Ux@UT@@U4@@U@T@T@@T@T@@Tl@@TH@T0@T@S@@S@@S@@S@@Sp@SL@@S0@S@@R@R@@R@R@@Rh@RX@R @R@Q@@Q@@Q@@Q@@Q|@@Q\@@Q<@@Q@@P@P@@P@@P@Pd@@P\@@P8@P@O`@O`@OP@O@N`@N`@NX`@N`@M`@M@Mp@M8`@L@L@Lp@L8`@K@K@Kp@K8`@J`@J`@JX`@J`@I`@I`@Ip@I8`@H`@H`@H`@H8`@G@G`@Gx`@G @F`@F@FX`@F0@E@E`@Eh`@E`@D@D@D@@D`@C`@C@Cx`@C`@B@B`@B@@B8`@A@A`@Ah`@A(`@@@@@@h`@@@?@?0 @>@> @=@=p @<@

/g/_ٿ/˟|O+?/׿O>鋟ׯN{4 Hk|'_'}h{_=j_|?g_?ŗg?ɏOo쯿T?}'_[ _|#Ts_k/go{/u%_|gew?E1Sxs=wo|}?9p?7M?q§~; v_|?ODů|o~g?޾ޟ O?|__}^ӯ/ ٗ~?:3L?/~/+ 2_믌Ͽٿ>~'"/?7x_~oH`O"?z|J_ߨc~?.}=s{7_/h@s{}'WO?;?YHu/?Q0oGϿoO7o)+5=C~ |?~ϾGh"?w~墳g?_c߾;#Ų}uh_m92~d~xﳙ@{$nhl~ |˯_?pfר/'XO0{~ ozoֿjM?߶B??8;]U/~z'_W_\I^U}k_į~m{ZVw~j{/m_Pw鯴g/ŇW?B~w7{e77!$??)#1Oo/~erSg+~o?????v:wCq׽ӻ;:}ݻn<:w}߻wx]4u >7}^w:]|o\]p߽ƭ}}'މn~&F[Dow޿{;Kww1wCxFP޽F5x.E]w/w1n?.wz3F-2pC1s'hvcdCx'.SonУWwy.C ]!ݿg; 7@O|E{W/huc1. IFm{KA |]0 ~/ŋwӻuT X]N_Owh;}d+F}'ԘaY&( $5-D3B@]r4.㡮@0$ bGEmy- ,! $2aG\ fF]>HHBc0B]oY|N =xYvjDzWCa{"sY2~k>{oJ<]a[$wֵxOh.W<}uڕRꠞ*ACݞJG_YNqlƒ;[޽NK@:v0c`A>=@G`1EE4aBoPu(|!yt[IJݥ.|w_p}^_<Co~u}1ߣ1*$vA|vaBc ("NDWz- um{/&%A2*(ĈޠRwaXz'H1N/F*/#ķG5įo~ֹp,yVߡ{&A4>P:5yCY/F /O0lPmCGɸh+u僧ԕ^ P_:}N*>=4wd}a#hN`IT1 I{{;w]2 5kE 5H!t ;Cͽ^/ntR/ݗcJ;QƢiW+u9>b]؏ghzNG `.sw4Hzc();zJ}E؝ĥZ;yB#BEf2(/i l@<BPBډr({9K}08ޑT>@KM4P+}ӅotKmnt(zY"w;?00 4@H wVCѰ: " :мg`G~Aj0YphAgX$gB3.Hhj]<^jz C}2?dDs`8=Ԍ|ukבˤ0p||{\I׻aJAt>ރ8nB 5HfXo9h=c_t; $:(7ai{vF2THMځwVC5!wq'Ghsλ| j0*o݃d?ИlCw0hbd6̞:IȜt;M;w-9w ?؏ugUtS{q `}56e(X׹HL͂>٘ERI S*ZdZ5,*"PLٺBWvRJ(JhKlu߆˔ߝĽ<ƺmL!7 [eʾnNԌ4,)HU1=s=>%ؚᡓ׊L{Yc5aT{R>yK/v*[úvC*^d3M81$DަݹHk'ڏ6]!!o7g6 R3F~B.3LptQ=Yu8&`=͐56kCQhTۄ׎E 8( |k4.y7wC$ SvcZj= @."…?$ juczOWȥ8 w=.bj)TL2nC=dڜm]ֻ.f#Ovތmf`5?=pfnq#3CBC,< ?ЋD[xBl\¥l0^Y,ً[=7/;Ηӹ֭?bs&j+@/5>.M Q71QMDH4Iŭ)<1 ij~ Ŕ>8u\RB>!/enVgeq[=iO1$5? xdbk}{?%TO -K$]+E}1rsN0".rQ畾EjY-lrcGW?ժZG5̟+A[s=ZJF<=/ Ε[v(|~rë֪Ê ?U @_X-[hu5_tEOofg!x;ΰ-A^e2rU{-*_"R83 3P57bb>QU- la0 Si$pф4ϻA by,-rc_,{n.`E;iRpp f rÂnW+#o DWgy(* /xH.(og f\E~KJ ""Ғ-Vec΂ wW)e0a-FCsxnf!?pN'*"Ͳ1-EL&>>b1V4ϻs38P+j\lͶוׯz۬e]ogztEWz6Ml6kߩ7l[Qgag*Zd77z3+=S`<TjcWzUUjh+F;k5k^Ec1 k=EWED땟ZXڋ[FF֌>nׂJk/x1v=] Ҙ+ZWUe(,&mxJPm fk(&$uWm!W  jU'aOK tފ+ikD{zy~|nA GWAQ DƸr r  nRA(V`e ŋ+(: Y'\UHm ~8z1"P .Vr]h.L+Y%WE-Hfa/f^`jN0Fۘ`*DՒVaY`gWb|^[>pb7ooS]u;T%Mݪ-Xo~@+YSȄ6|Z-J:xژ +5Q meWV mC

  • yq^;)L{ =oH%! C֤ Lg{:}')Yh:zN;3I$tݒKrqg@}9!T.YԂFN@~佥p]窯cf|4s'i܈{w24}WpHS#ӓpiiG3Brqξ=Lؤ! ;`07\?$7͔{k[F> =.=oP(m^{:s\~ )еDh7q8ɲs)7dö`@2#ٙ[oO6Avsǵ>{d!#ͣ?r({>ΠcZAX~4tS>޻g[0#3`%aG-=oQ6_T:}6U'An*q"f+ZI< G66JM'wn)%di&OVPv1Bj@uct%%_Ӧ@xC ﷽?%4N!6+I{ ;ȋﴻ@ҧv2#A/{dL mf`86~$la hǛ "BCtŇHI=yux7۪0)0"@0}zjYtv{#zW!&C>U֜ uAlM핝B֬iF +L\G8$.tŽx8 Cx{8hןct~q<wǣxO!^ESO&.I\R? d45xpǻ@7C j8qF1aix'Mǣy4)x ֏a`iG# : ^4>NG<>via {=<=ƃI#@Ot{̳I&Kp0}G1HhO[A\:Ӡgc tu4hhuȴ04!Oah<8!w]qpձvʁswlYwIw*S)F=8UU:҂QuP1qe=jݹWY,G;טt]GRu[ \MuY>(p"WSNj'fQ΃pݦ #3H(AEjxte:۔us׾3: .suG嶬@Ɇ@H0]?P?2]بȂoseL1;{qE6c+wm}clQ(]rX.RurlՄ&c,+R\ E]]AMݹŝ/wK^cyxwR P|g+buAsb7g`>$T޽/l`]VS}H^(%\:hRSμPxwm&MX;)C]M]4l߃%?wY.,A+HpAC"v vh)s%HO^/@\VyGe*7])}H̔,zX/:5[ٺ+!o:o:Eݿ 띇"ndC!{BY_AЮQ#zByKenŃkJi*D ~L{mNl"^*b,B2rgWfM{u] V9yhK>5?/e8u7J.2rNQ k:P2zPhAjpAԮ7aſC6 *]đAZ~ o\A*Zt8F4*,F$b g7<ʀ +^[eDqב43B͓[z^raKpzp, J"8uh|!wrb Y{H6 -uX)*Wvc#bjfR5%5 4SfP`Z|cW5{#Aν@\y=YRuH}57J5N @GV8xя^:r(cؒ}P$[74*Zp`%p@a3]fV?@zdR6zV3O?j1i GՋ v|K^LfzF&I[ X&ˠ~/WcU8q*nN.ujY_ug ^p])ؐ7pu4j oY=SYAp4UVAkO^z*nCY/xFtJj4jb Pj" ^a`|2~=r <E"]/X6k-֔ d+>f)5h4uS#cZS_jo9#T Ak5Y%t!Knwţ5z |` \?l]T9> -0/ᷙþ'{& ;it)aR JOVҴ̅N3J+ɦ}w~kSܻ{^[T-6Bo&9`^~펜uj3i6 T<SjH ֙Ū0}L<>Wطʕ~Η`vdUit1TMMo% }/KV;=f85ҟTRhT'YVB-If^ֹ"nYmгnu5iz{wӨ.8 Ckpzw=).{Lր[[s/Rj'4P? rqkA`Od鴓ՠ5s`D \N&)%+2 W_KK0'=|Mr-i7~D޳:*O;90@8RsrNE>;9u&[jfBOmd n3 ;[2Sp9.ZײfBB ))0<3%x&;)JxD9huEG"`y21&r2Z^I˩Cϥ`3$C''QՆw簗LLdMʡg(*Y;)@;~qPa^{)>뙮\V$=fq/6>:UWsʀvlG*m<2 ?Ѩ|tX,ۓ+W2/Xs-el/ \I/81'tT}Cxw2w0 Hczw7( ٢6-< .}O=ď[̉n {yAɚ2FTc 8xR+26nH(;KE9bR yQ d >J&׌c"kNJ^{zˠq CR8_(_e "%H5u/qYX10z}㺗xzihlB,m7EHzLgCI>Y=9cV?; 6Dm+DM֎ "JO\WuDž|xi+~ ElR_xDƧ9XSQadk{BzIQwh=8H[u`)CM"bu~LѶ~Ci\,6l& >]4ț),)VAPhb9"wElG~:kזyN("_nm/i/6)%埢i+`if'u ciz6 VļdA~"鷶h~?*\HyLV/WȐX7qy3V;P~NB85/Tݘ5?OS "[a< lJz`IZd"ws2(FљR'Fy(#'2=!/99oH'_HH=+ LIb<:э"ҙtק NV~Ʌ4zAd Ȅ9;t~ىİO fl(P?Nl4T>ckxd}&qV_ JjDXa" ʨ=hL|eS~lH'muNi#` z+pOhCȔ(OAa+4\@6IMrd sa D6ezB*&JF#(H{ѲF G=^}`a;8[Ls}epܮab@Hxu2G(+CGNLε8.FJ%7|m)=kJA?jGtjC~/nR 'OzDk=If:a)]3Q{ "W<$!:&K/F<sG(ۏc<a#g1ΌNDş1:Ojf =JƜTwFe<,@Ş6iӂ1 N x<&o4ntI~b4O|bd ia4po<\6Ɠq)3/OMDwh=O&@1 #tRx'M<2 I.b8ј`EinIݓ>p&ܮO8KKd0B!~7xl7^IDlI?j?1^dbaM戡qPXiQc9RzSJV'(%K}W"0#ǀR畧1ie݋IGEƟjf+f7OjVŚ1l6LOhג԰X>Y=8LqabJqҲ0ej %wŘAԲZccߘI ǩWpPW:I6l1$D -Y5>)RӀX04m&/41O-fmeŔL cZtT= $иUݡ5 ' E^o.jCLӓ fꡑF劧Bz(ɓ@3ƭV6w9. (}3؇ M]d83a<71r3WO̜iBM 27UgvtX%3&yxPķy9)IeD&TFr=_ȝw=fItp:|p5*&F|S4qA_&F=O|K4 mfY*4o;%Χ匧L ƥ<(LJR ąa<6'A|ZM$>& F1ߎ5Y}Y.YRq]ת,Ĭ6)UYSB 2WPʹf t^6͟v(&S?;)(R>MR,,ː3koc~T٩Ra62R!hjSK\5].fC%9|V37 CȞcgBt~@\@ӹs  ;Cłcw5)R4VYxd$@ޚXu<'ùZY@@*J-8l8`:Y=c18W)*+͖U"P3*8y $,VUp[HulZXYM+W]u5SM͉+֫y;_Ք{ px{Rf%>|QOeXUb9ɣBF|.cLI)N-:m@l$ ^ql AѣHNc &2; i d ʟD[Oї$j.@N5=Oxz4 ȹ ߥlT-HPRD4&8V%aI0eY&pj]VTԻá?Z:=KT#=$7Z}ŕctF;Nx-SI #]"LUP u#PC00*ixeƅiCŻ{K.؀̄xh9-Z̋sI%vA)p#.ؾ!nGLr;D/1 4Rv@, ?LQv=c-U M|ʑ*J<)]VGRb]OMPKHet!+sͤ$*p-]"TgSID5D|{@(;CU/e69`p('$8}PGa& 'hHcOQH'C& fw3HfxpeFR;xBI,0Kz |$&Ď=ѧt$g{R3" X%XCi!(G9lH񉊛MUx0/|.cJډy1rv&.L{XJ5'*cTOǂm`*6rbd|rPĹl/0P)[.,͙J!r<#!ET9ut*LɵLϩjjflk:*,U):"x>KyF8.2Myܕ+\[g:hTY\L; TNߤxJgPUaNBhWANZ9K+5קcXVcw"BdlRN'#:ցUi7rCTQrKՓ$^??V DU$+(L~2qE3{.+n]Vk5=y.R7_aV*IY5Zt㜃 iV 9d]t lBfR^Lߐ!%x~*$XXUW2G?Bhp)|rk3jSyUYP|$O>ApX67rf*7X+.(t53 =G,&KEMƮJԮutAMET)UKs ,\J+ 9sAEQ?O)LR9*KpXsY)"ZzLjAu;Tt1Qrs RX4|6|D||z,dO)GJѓs4(Z ~8G KR]OXtlM5L&,F;{D!Ag,WyNI'mbԦL (dTAR95«fIdB?۱s^5SMƦ%dY-~ O挄BFXW#˙ ʤCXf)P2rЄ-2&?sr-X0s \J ?f%Ct)ƭ Le%DF@GN&R\v'%)7v)HN٘C:^V(<iɒN΄I檍<8ys q3꒏T1J^B.}*#+Sͅ^b>$%'fXFH*U0m¿FM5j`=UχxZ^֚ \P àg mI}jS3ۻe|. 7m$2Ly/(P&ÖS=4.O87cJ4*RD00J;jJD& c9[1,F$ϴr,5k%ұbT4FY'`17p[skmHaN茒q=c=LgR9*`ilp+ʬNSa5|Lw xgen͹J%F4s6;"s)AH2@[d֘2M,)QQ1;B&r2-?emNF;0Szg_T|ٽ&'mw&G'cFĆ2lx[bYbyȡ/* AxeDU+xPԹҌh0[&EtVު8$%ͨr(p7~4\S_cx® ؒ9sPp{<",{_4 5-V1/%QglIȽpS8;0]nEu3I-5DK0ӜOc6y|Kgۋwu D'wRT$wr.ʪKXj ˝)MN NZ2+F`wzNrOz,IǴ, xB緾p4g榅ӑa,LFf>+R骝DcyuǜU%5e6怊 2SuQ.Gl%|?I)'L>Hgc1ҼQo9BH!|FtMe54LHw<{YlJl:KE9BS" 1dmYzk^Z rեQ,ddQZh\,B#Ut ;;g)f~8վ13( ldQZm+<VM̵e qٌ]k3֧XWA!Ⱦ2*Gқ!jW*ȚOlieΫ,-GqczR6+'{0'E22cz{E)\3Í (&1ɂȓgzI#q֞qQ:JD?ޑ>܁^.֩8&sLmPss<97w>z3h8=3Qao.xXcsm`óywx1)[I͐y}$gX,(p@sɆl3iGK :#iNFX0BلvE||Nӛȵbڅ) vrVzB3{ ft)z_•HD,\14ه8f6$)|1$xRO(9Mm Pvo4Wxbf-e]?=k'Xq&ٱ!x3ȭsb:5{H(YAx-S6Of1lifZvOFV@,׍sn!V=2͵j=!.2"ID1-Ol x:p^byGLXN3%='{bR[Ytrtg@ډıNFo,<).DYftdO;͌]p"RGU-OʆfW%18 bT…9ר&#36C&/=ZȭOrO@Tc" R|gn>e>>Ji9 SȢ…f#Pϕ!*%[2 5uW.殕!峘Mtm] {ӗRj8v]gCOOPmˉ6.iaL)p:: OƉ4 fav]b<^NWqh֕83Bٮ[{ s&إ 9yc,zRp ޿V / =}އ* N+7t9Q2;!A h+b;p5]C[u- IBsOi4c%c1UdFT E6μq<59;qx=šXsmj,Hs"Q%GPzl '!z9?vGp⃧nOn',0xVmn7u4Es4So[Du#^SkV=l:.  >6Jͭ[]q9ǣ}V+zi(nZMki*7MVl~t7 o]v *OYWkA'P6o705  V`s1o=x7* , @*0D$[kR 5lt{\d$TL­'轀.*af)LB|D\^f Jzke4YWbjE Aaly^ƻ,$p`$m)~ YשV0F+DtF5!E@/~ A;bU}>D cB*K"bib$Ht8Hw4J+[EXԞ,C֫bf~ T~xi#6; ^U+º/!mj4v{KD+$>;1f,`ŝrM骘Ro~ZKNYC&NvT$ ,ldmAmMcXA5CHԀR&XVJJD\tWh}&b,f0^yTooSD$!x& CG)IL9-mDV;I-yDnO#-_KH{&d-WS`U3H+΍oz%/n, x`jal2RôhJ¬l` k-+X{@4|mv+5T̃n%acH[Nht&jnan|S ޼/ YZ"|F c)%;Inw 5Z^7f HM S5"jC:ZĄh/%f c-rCK_e%V`LHyVHaZa䢃`Ȭtg'^؋6Her*̍eKwj60ZBCfԾspقy"Mz/ߚ[h./+P;,$HpVz`rvJq#p)%lc_#cۓ*6R{v눩;*gfG-tj jM' ARZQ{xōBcأgyje/BYgp./|ofq\ى/rt>eT5d+,8JN+3sߝ롪 c/qu6Z1fK&wW" vBQ`ؚ@,'WVY̞Uh'P/+G;J(*-qpq"tVCLXƾOrDY@s2oh6l ӫ)aޓ}f3Yj#EW(}&cѲ|}. T:&`yyhTiaBN`iu*cڞTkMmq-6~Ub^һ1IX]D{\c(GbPJWj9r1`(]98vTbsF_*QH^[oXdÈ';/YSA+-d#F>oͲfF=ϑYy$ yED:q1Flؖn%0w%6uK%u+oIԦJTP` B^gxc1jmm?,Oget1v%o9ykT{T;6&bWV[<菉Z2\/԰AJu5fp/V5u C{j[.OQBNM kq@yb ^yDl:'QlL~O|eOO ,@"8%1HvIʃLj j󢭕֨K$AJ5ƫV[G vIoscUkGL zʋ h,TQ}!O,p+* M^'1ex h|iBT[\*š5b}PӖǰax(ᙯm14 YDw`r%# +X`J* W8-OZA`Z^ Ϩ*w S>[ƨ@)L_:B ccKf|l BnkqisB[n3~<ie.wK8rjSؖ& a߮Bܙ:4z+l8-)צ1@U4VHQl:ې۴εZ [I$8$jD(5*Zj)v!|+]fxZ,+ Yٵ^ ?v7^įxwS˥fbŋqek4ߖLѾ qIm_}ݚ>ҵx)n| 8 ]%@k+__{0i1@JҰZhL.J``1t{٬jêeOBjp>JV @N|0m ˅dP+'fROubHL[8de)gG?]yp`U2}ckOoWSs+V # [!5@-:ry2Ij ,g sсŲJÁKoJ_J"glLU-2\4!T|Q{bY)uzLr]J܂;(j2"#I`YXmw@77 .GNK4⚉@#0{̹xkF3%Y൛GCĄ]ɥ0a&_V?"+4^DpR/Z VawjYˌ1 b Y`*旖 Py%V9km6@f٫{2$ \Qĵe@ б<JeX[3E*3K1:^*:%ͲYAUK^EKRϛyܩWV6&^Nz$`yHLy[e=O+E붥4\&Җ#QUI6czf$reR(ٲ*jwMbXҵ #,:2>Fk{"+A ]bܞjn9< ([׳6loGK}Y!EV&Ho8͢Ti*eEn:qlŮrVZ[ %fU~cdRd.eRZ\ ghxE}E V!JaUr2 l% +T~f81}a_WE;':W5aʬ2ه< 'lkJ=}5gۯ@"5>Z4gn֙i^sz-' ŷ'+|&Q& ;EOOrr@жvW]1r 8dqi 2Y8:pXy^ʬv ]Su+\09#oU&W#xa'c]%6qrU 72:ɪRZQ`Ivny'F{^dq+CefS3q*Hz32'Xp`ViU]EUQQ4\wNSd5٬שW5`fovb^.n٭FSXGJx dFl0EYm+;BzJG*L_. 200w%)mm`Gex .^5mEK u~`)Oڹt Gޚ9H%Hԭ=\n0 %R6LmX|fdՕC9f&<&3=jGӆz^!Fq*Wv}P%opiY c]YO; +,+fkSsJ[rqپFej-[$W5S* izm\45 ʆ7G/yrBN[2x cSfZ%S'OSՇ:M5zjq4b{QpHx >xz4^sKnyҾl}iL$aeL+,\TMxYJy|Mjۥk+4g4R7Y%J?AJZδLR9F&n9L630ΏvMs&p"\c996pSu0ma}펇z'ix5lܱ+qMuVc;i]sMq<^|Ziqz.mi=*9(pp8hP>i>cwq 6xlǽhg6:vXG9[5mbwPmS=ZVۀT8C9|x>vH{mih&@8l^9m<;ƕ&ΛͶiޡ5Ƹk{o؋Ƕ[=vzkwe+Q$ix 05OU6yVIth&>hAy8;Mqޕtc={Bbn5Zb'ȖT[Zٯ+[h~qO&FQo@piW ֫M|=jz @-S7"vX7@+BPcǯ9ץ5P 4fZp4ƜNkx$&%^O=\9'?ϑ ܀Twbdtw:!S1=B|^oOb,q F[D'm"rNF._} ]G8n\Uĸb0y؈McZpyקqOM cx O@w H&?Q9 6bFnk@}61^mf%flύՊ  !#fP9<ÏfGCGlpcw- t?h#Ђ8/pxк>ӟy>" v=7OE0] 95z$5a˧:š> IYz!rP.H/1U:E$h19rt_<]!G^.\g_i_kw )Gbj!4nn{k*9] P5)]oӸ{S 9,\1pV:PM뭹]c0~!;)PyE|\n9-.]C ܎ R;_Os@t FOIF~/_TCv\xzՇ˅Nvt}EB@>|;tH xh-7LɃGv *menYjXPSc>yaTSX~up;QuK-\1DOb_v:g 9@ qJAERZzS|>^x#}:^?(iۏt'(5>::*DBdtp؋> X2hۣP2#ʶJМ"F'F!(?A$ j& %qGaH'o7 0+DFB|rZ@yK zfv E#9f.$, t$xNCߝobE\#uA6_??^ IFx+Kwi|)c(3@k> 㳹-%E,SΒ҃]I_͐$G3߇?QX|k#Gq. :K6; &ƨ.dL 6)!^Hw]&na/R'!)1a\|AEI0IF" Ex'+;J,GQdgLk}LL6R2xf tԕPUP6VN"@M doI|^ncJ4 B$C5r<2+1n/;,;.hx]/5P`0HEBZ<.|QJLz_%0mwpޕf(#~9K "Q;ybDTC D"&sna{Jßk0u?kDgYs % vF:zܤ/a /(ZzQA9.j Dz,[wM&%zɄs i_"U4p;]/$B&QG5{4s%ڿE'-"X.{qQ{7u]5A4Dz"WK֗dߢ)'}iebQ CWgY6H륹r+,"C>˴D[WM~n,P{էK,Xx `X&SxPozK^R+ K4o mC"n~-.s1ۍW #;Aޔrs vO_bUM^GrƟg]x'y^m+0v8. s!LA8JȷՐE XL_ਲ਼g?%@, !dhXlDKsgO"mq%^dL^P.ixЖ|{%ó&8>3_&W/E!bz M'js1W@5LYe@0TdL?s'̼eC+Ԧ%A$sN`;1ӪW5w{e"yĞ!Y5X:ȕQA )z(t`шX;f֚G"> Ы#tP%h{b\lǡeB1LȼIӱf#\aJ o՗@/BPv ,ä6 4Sy E~ ꆯ,ƒ=`} L,%|Գ7I,:ї:_"g5檧5-| 5 9pe8<  O8ƌמN2<199g~4`ҏ0a@']C@ia*؎I! {/,i1K=scf~, $w VN|aMK=v"i^ 6藣}dU<…@[2N9!to/3tڛ17ažxF/P/c}fq0hOKε(rbV4+=$rD7DY)dzAn h3UH0뱢9 2?yb!qd1s?)Jg+eow65ä3PMCozpoUZ xNcؾR"GCHUX6g9.aH&u}c}*H\h?5VӓS/ԉӁF෸pQHE70=RvU [TSM =.X@L.#.{!p:1”ڠ@ٯp։ڝfLDszVlz:2]j\3*b 8"2Abnj54?0V@rsn4oܒO@\"b䙹+\>=xsg1aO\cV Y1Oq.  69dAϺn/v1Tg3NdwF4uw<̉/\2I|a֤hu}~}~sW捄CnLkCgDD8&/z, 3/E<J͂n2ū9Փ^=I$tw1I$ьp!#$f4O=EW}xϳAM=,^#\3_O pűAЃ43t򚀡D1(w"fKPΥ%9ؑ`oJQKbm|o~S]f<M|IdJ6'nȐ9q,,f 0}^dתL`7Č_>c/?ܞl56x,94!M,N>Ôؿa:VhbP.x&/gijR|tXdrfѓ;{ s.úijMZ⋒kqDB!C!Ͱ94LJ2ҍ k[{g+6UY&V] .{ݹ bs;cF?^g V-$=G8Nkbx̰DǰKcEb<Kjvx+;wWkteī <<^_?y|x}}~r{+_%q|iE*9: sL'_^s³Xa_&޼Z,ٗ9Mg󍉗`jen?&s7ؚFM'=>7r *fmLv@n/T$vMr+m^s F"3v+8?WYi3KMXfn _ȸ>k}z gOO D5Nqlz}y={Y{9cJΣ! qd\HY*^_.R]msza]X =j_fR:%3H1KiZyrcpMq+s!c2E-76hkhF 5< `ޡ}Np8l} ȱ= v0B.îuKt[}%!;%!v6"%;NliZկ7pmb{7G>{!odœaX<t Pm`Zi8XӿOۖƝA"vr9t Ik }kGܜzv %H)M}{{*cxL nՎ}4daK6#ֿܷ9)+^m;Wd:~s4jyFBXy s sDɬz,+⭗eHcrjf)C֟L>[E^S?:Wthe 9"yqv`~!{#a߶7v[نc pv%(MV 5DG1L%zx%ÌUJюZ,hC]4♖cblǍL)ZC;Ats-kxh)-cޗ'`99lgF٥0{$'ORԀѝldŮL+=ólEv[T8cAkglar@d[i'Zʳ#o3] _hMZ&c{kڥvwEͨcnY2qQF6研N|)z<$ȾGfZn0BMb:~ԝYɁvh'K98%3Rv P]{W3+n{p|8X's4u2S17!zI|eE\sT29ZB*TLE\13)&^3o .)]}S5EȾ,dפoI*p'?9sN+rf_>$Yx7K^={#m0l^Jlgf*mJNf4,;%%Ԋ̂%91O<{{dL^k r!Irn=!Srj/٥M!4u6\r^Ip]Lb ^K1.-ϹrYo, ̥LGzVî»TYix$v^ٱea=Jv@>o&UKR|B .VY%M$:HyA֚ ePQ:Q4 ]C|VY=q@;N,e%׮Ag9ʧ:Vj {9 K8\+rhUjUYE4P扄.X#g>Gծ|RTZgVdeШOKmAeV_[V)qrBViI|L,JZe4W*,UY)XвtZ)zXՋK}VY nEKͲRVG-'U* 銸w&2eI۬U.nRfɲkWϯtqiW Ji>xXsh>dʴeI*4,u֟FEa,:Z4& 6ˮRzEp[3Uz.9RS.Q(T}/\X\)>讒VڬR,  TU) uw;x=d=MHNtXa,JfVBeU[lSrXۺev)9SʋXY-7>nd5][3Z>pӔBt<6ו8ybyډ_SיBoO ev`tvmI[]eo|8%cVSm,BM*\0i벙IvSjV H;WW#VEK1oO0r/Y.?si`u*Um, .']2_YF7ZR+l\n%=9$kR=|k,3?x>;RlaR/|ڶbkg\oR fL8N'4 .>^^iv>nʌ.kSY^5tuU/[nNN`OnA;Iar{9y״N~^_1 .S{eDߞ[sK0w89~/찆N8?y=LɃ&]HXHʉ!޸Nf5&3q0=#碸]^U9+c={2˥ƈoc^Ŝ3zzx~ arr6@s(>;sr]!?I7RAӢCؓOq)wlr٠ NSzmqd6FeΤIԑ0k^|K`AYA$ڕiʓ뜵}MNݣQXNlLZ%oH~k\QB c' ^Wmt.ቓzJN4=_S2! ʩT"dve'IV)w *g->~锅"ћᕃ,=;z'_"=L =I,NDOY9VK2ʳ7W,uŮ8r1I:Su`n<ӊP]]4ł,oYf@kNB4䒎\㵅~V>9F{jgt"OWlo*`VyivS+N><ϛ_e5g1]Ԃh%t\pr_A]8}0W㥚'ҹrP%V4-7 a]%Y<}V]_!|Y.|ы/kD@8OX}-2UX2] l_۾Ty /|^j5m~8Za=J}N~KɏjVEF{6>u^A_~5݅}x![>ܔU=_ AT| . Z4څ[ZZO#֕<-ՙt>V'|eEρ&~eC[Jծ|ft>*q! ^- ΃ X>Dg[{a jfQ̀F4rCS@}RQhTzJ`>9+g:)t,|,_Y~zvf˄DتJϗIok"$F}jo|aicfKȔCD|jLryaqyZ OHs-)A䂩`טĶƕ<:ⓝn\57آ)7k?\kJXYLvUJ[U]{͉I3dNj Y.#da e \-rpJS  :nRF;nM2R"rPl(fFI<|:f]:G@uNltjX棑As*]TɝO8 tFJ;q2Jof+4Ŭ)r̿mۜ$;ךΧ *{$-}9!4@QC/t?0"RHP;8qi$ƒpɞڤ\59YӜ\2w=l3odީmˬ& $KvTe]l3O'TdS`ec ~p^d%idڕ':LUr.bWr@8%V[<@ҁO@w9GuYMldT.>w%Ks=mqW)?ZݻN{mh",KM~,;lPv"9 A'P 6Psq*z\m㻒r\x79)0_+pɯ>@ )od$Nu{A1uӤ="8UfTCl:@brvf]GԃK>ٻT=9G l cڊoOk&]r6y)x(ɞlnjFz'.뵠7id}Kju)*{I,y=&1]]w%7:@ʶ:Ә-.ט]ܟ{V=43#y]Ȥrsӂ||wWs1qsc{MQ\J(%͕n7Zo۸5b3-,9sYӒc.wd]2Seޏh R4OBˢn@8[ŖZɾfU]U\6_򎟶8 0I@^.׷%9  0 N=Ds'Ct9d&OD'gVbP`*I'j//&yr]3?Sop.B&Q ѓ+@ѪgڐjЕdn;z 4œTr0_P ]\5JU"'dY)ld&jrqީ"'"uwAL5.9GdϬYyY!qaV#*QCX+&Ol+׺D+Z *}2.dN.~R}&-Sh(%AEV"k.î* .A1ƑYX造b)kq* RU= Lqq{t>$/+&M,kͮVA3G\@ɘ:fGۂHG:`e^I֐FhfKDѤAJvO8:S\"夡%ĸj2,p> 5}P<4!p* =usYFgqr NqQV Xp PlAp>tF[2Qs)U{r.G+#9gSpJ*Qed-1$'@ϩuօM&qړ3L.:y*JX"> 2=9:VzZ;Y%R` ׅZQi|\}+<(ɤf.mvr]gYqin%hvSꤞ̍Nr>֞"tjbs>йg]{8=Q- U8s":N;٤6h5ʲj1ҚUVR?"uF5ʆ;9=9Tn򨸦yCs]WEݔ̂k{{QVjU 県JEstv)j|{j$L$\B.KwRJߗRsY:O!{EH0P)yGy2bkNi.ͱq^'®J 6=o,턝q8?5pfƍXғ=7ͯo<rjS:ml LCO#OD(ҋL$딥%7jdIf J9ӡ)VAlsJ (r\%O4Ƀo>9xIes*%z'3䤮)f;yS+ &g>`,d}:/֎2xu>/&yMN)yLe$㜌s];}~'  (&L>W̘9F|8'/>h ў}E㐼}j5>rso/wV3#WZ:λP&ލ4 %".<D7”U1M-j+=x9'5?g+it\1#CS y)őeR8EAcpˡPe°jВj>!)q_WQD/>'_%ڬ{H{2d}ʽ#H 5qprNt:@z&1;Ha[G! Fs 69}| Wp!kT|?8U|TP2SF3 tx1B NolҮ桪S 4p66eѧƜ<]ިgD~n+ʸGؒt*) x8yvǦ$?34bOyRw&8Yόh-,i~=G쓃z<@ V2XVǤޘ?#}rw}eh$09WrZhe2x+p/߿ח /5~~//ԫzU{>C/ rͯq5:|zq~q^_oE7ޫ9މ_*^zH\~-G=C/_=><ǸYCCyu> jMhi:u*!<놆M\ߠq|nϾzE{yH_I`y! ^ }Bp1|HD2 ޤqa27{ڇפ>}(᎗ɌH+؇_1^RW``m}4lq Bzp}uߨW>rכ{o`/޿AiHDxŴʇ]1f8+ #DMؑ!~0Mo$ڋ :=D8WrLZP M^,5 I`z/&=2WK]=4 ^_s^p?"G^-/_P>(=DP<:ϯERϡR0@ |ƚAp4,\ya }r?>#L/ mAL|x-?+?0.z}E}0~0_P]/V SRhM?[b>,LO^s\VSN N4IxԚ%lK4/?<${y5m'jK;1Lh5 5oDЭxFC/k|-yoUl ? DաU/La~C(6Yy}_LZiQ9Mx2^PxxCJ۔ # G(03MQԷgd C޳3'Eć}?ҭbg/j5utꇯ/gkݥś[{Ec_/ɷyYe7:'Bѳ  spG#<_|CdS{])&3r+3>γn^? x6:b\媃.t<. ŗgsA^_nZ7&OW7}%*D>,x:xIjDWCDWC? {`s[%>h9@W!鍇|nݞC83 7_/ndl'%H÷z:~K1?][vte K?[yojOGup,~hr[$eK04eΙt.j䜤c=J?}z˯I^˔8;boj'i/e'_?j O[-i'lYЅ{>֔-?$|Y W_0hhY$o}g2‚C4>qzəEm#Z/[.ާlpO\(=Տj67v 5F?K"0G"%cJfD(|[E>j@ԛ\r5/q_˿'))9>[ҫ'VJKKq.C{- =Ͻ6" 53iTA_Lo[ǖ c%aVR|MsA.(&K_m|(|җYaHMFϷoÃ5M"2aL4G^{ QaVRݿ~D|*(~1m]th5KaTb|LŝA@oSiݘajk86Sʹkڐn圛d[j6yZ.eavmy{{|p!G~Qz| FCU{^az[ع),1F钆8YGikr.{s@Tr@9~jye{^y!Ow9vR[: ankn1fAzˣ>hA$-`C.gʞo>2CKn5]w&/wsEgΚ.[Wy0sx9-7>|6VD{Ԛݔ&Kw)E9z|{^4E4#tfyӡܕY\TD=][~6cP/ڐ}S)TVّb&0o!r{'D4/r`+:6oYo 7e_-3=ՑǜݒW3-Gxt[c\67/z  )G՚So޸EKT7y̪QO;NEʾX<]Sq"6i;."!4fL=_^l Qnk <[2$KbRf`E/x6{1%xvK?$䋣&|(aH\}^SoSƋ~s!]P[6)zzDsILC[̥+.^~ҷt`v~SG7 zf3[g1U t4]sA%@-[ vI/1w00cgGYC)/%^:BfMaBϯ&KU;!IkS;N^D̛z@4R^|\qzni vedwďZ/y0 UF 9Yd5=^d qbѝ b2}UjMKۧE[ ՗%k;gL KRbXd"Bj Cls^6ĘL9/EоYqG>Zz>QVGX9lN+|TJڠ-Uv:ɭΗ?QM3yOtqVɷMBYL]ŁTϛvÑN G;];픩xp8m;j[wqn5xE<8wts:d.pnG1VKqgQ#u Įg=!b1ƻ) <;c!yT-6/4L0/w6]sPqm?Eˢ˭6"5]Ѷ7οj;Gqfv.i1DZjM[zmUSrd}r#R-Ÿ- Y{`ו-}w; |$`-4˞m$[mٲ"Mگ2ejTrv}\Wzjn}T9#,iLE릠ܼ4sy: E<3Sl2fmSVf,8ɾ-K +I]U`+wxi FBIɉSTJ{ftNy)RJ'sp+iGUڴRb#\oeP yMW;adE./qD֯sJAsz):u9+θu^]S boʜs+m:qj^KڢqyTsV0Z85+^n\VXNU'VO,pQ"VbSڱ@lR[hzxn+4;7.ąxZcԣφw5$)*'Ν,ѯM+'[}SbMhz:"9ZMΫ*RH^~ oט/o^c+|c@FALq-EQIḏVǟ|L~]r`9Akgf\8t6yz.\p9^<.(L JdK6>gI~PUrh/GO7+άy:8t\ P)jգo'}=8ss@#6ά{:m\9#r.bz凝Zp;>lbj7/DZ$[կ')t:_OI.^e +6^oF/\ʡ"Z5TLWmL;*GUF7kowkFo/njnt6*%H͆7[-We6:ra~@f$fu%U{.T '5츰ߩ~Dغ形 uiج"1؀Sc@]@{=æ4<`9P|M4!Zh}^+8 ʺf2.ͳLp[a>/$I/3@Myۣi䉿k># '_M3h-{niQS(ٚьӇ8>_Bn]|_+AMF5l]gڜ<3dVz<[o9>y;B")agV73TU/U/`d3m 6 P@X3h3~X?A8I?ȿ.!% Sv_y sPodX/8'@f/!Ɵyԁޟg~> ݣ/]g>LΦ d/}i_xjD=%~R/bP&+EF;uUp TP3 ƿHonֳ@kE_ B=T[Ӽq=(uxU,U~-Nɳ[:(ty_7m$ +Pw|*I/A _po9e<hF'v0cD9Jf(ǟcGw/?wwKh!j<ӫ_P%VP2?0"+l'QN3稇e>DSD9;?=*_pهa Ϳv# 0M{DBl]~矿 +aW;# 9܀g){ p.fq4aL6=<ܫ\6[E5Ϩ?~zEŏ?( la?KퟑV; GWgFT#o0ba? _aǥpiu0?`_ 7,(o>KrxyԿFu^̈zl?~Ŀr̾ߢq_D=82/99\?(i#/tv!b=#99c8f?yd ,|\{qHU;$b2 \D?!yi+|~gpd qD8_C ͌?#>ߣ?hGƙI3<ߑ'c er,4)-׭5KG!P)鱢dgpx$ʃxt)ҳS++!y_(ϯo___߾}6~xt\??uwqy}?şx˸~oa_/?~~}!Q{~4/P0B0~llcµpϸ$ğ@:uhBhzqϼ5LD>e|կ3}ǣ+ɋK3^xEqϲ/V\_hm po1E}߂wa7['}[S߆|7)wdd|A|}>}~}}S۸! Yh;X߯?%`O׏{. \ w4L^td0ƿ%߾QFĘ'dWKxcQ}bC~!駟W'b3޷@x'm/ ?O|>׼N|niעu1{/|3sLG2ـ Y,)V !cBc7)t`u;de#z\cC6 PZuj_ok"ZxXS'my<}s|qCE[CCJ #nb[<]sFG#hEV᤹׍7򑌘H~|xjRit?'56ӏ:鑼xXՉn | sB汆V EGҡ MߕGOn+.sws 8ȊPMA&|ns tµgLb4 +Ǩc< a-V7-D]ޯasSx:v qiäh|gdXk8#V -4O<'{i|nWS.=FC^N-sKk!BLyx$A8vYIɟgwy0r+ ǡv%)28o}er&~:\|I?,A-OFRgA%e߇a83.UO!d5ר53g$Q1, F[e^N+zJ\O9ySzK/ HMzǀvD~cc s<= x6?َ%*Dއ&"]OmLbWO{F1[k͙r(\$IyjA"Lxy-?+ \WdcL3TigiJ=:>?Pbm5'\~U=&vCǤg#t3cś)bL|ļ9\&!n4׏H|ھ y0>Gu$Upy~eö™ɾ1g bߑxrl'5w}_>Sk^ωgۖ/:As:ra!qNv {d~n.O[_)ߧ6a^PߧN tL޷,G||Zo zx?lIJ9qqy dPQ$S ~zj4A|j5t=SΝ 19)C蓾K9?m&{-z9}f[AM9.񘾉w̶NIy 9deIgomZN4IbVX,7Gҝ"9HO;\#q*B?Fˢj쥾Nhy Y,3s߼&H5E;d9" 9Fvӹ[b[Ȩ9۸i?7{GU &Llwc#!&{/B'N+ڡ,osěOr9^/omp,/y| DG.[N\'sƩR'ߞw:5v/t%Rv&<x0ha׈[{Anl<맾x)^K1G`#%/=yF~x, d`4}ˣmt[%rrSd-]8M?tw4AO.urZ BrgKo,_OeHم/A1~n9 +e0>ēugJx v}5pũ߬\>'c{U'ėea]eNtSW 0?C^  |Q]e >=<<<+tt:,W]Ж>[d^+=&|{6mN(4{/)?'ܥK?hnܧ_o~{6&} {saG;' dhS59xj= q=ۖbKϜˤ![c9IsO 3z9=#:0.v 2r5<&·ͼaew͛|Wk@7wǔ+3Z#)sL8y}dOZYe5z>#ZND:v?qHVW>؈X ?ʼnˤӼ[]&#x*y^'xz?>0 rq:<Ejs ΔπĺEO!<\x~"Ě$=^{/k S?#>V< "o%'=9sǒG/ _QH|JĆKܩ/ o|sqð~}tWV(3n0vy)gF/`O)|@"d9p爽"h83 U{2=<yD/nf"Rk+^&=>O2kpI4N)s5>wJE0u Sqqkv>HʃC_R!'ק31\N<-+|?5ij뀧 {SzպZZǘ6!93(9yaGO3%>=rՓ6uMlXLAOaO~̪؏yamk>z/lK}z~_ GCG>O {m>tZoo/eL|ʡ_n'? kTBG1(-m|-CZu z0=LL{?=3&}V%0}d^UPk*t(W?Q* hUɅE~ ?1vVz~kޠR´f/0߷~EBOEk' 6@ zWn|16Tnp$zdF= ^!2^ d8AOh_ B_`/M/X\6F~Z + :+4b~>/cO Br~x9rsĀ<M4zQN+꼉_/H);dogp'J%t |T'19$MMY`ԯדB$~?}xEƵE]4B@ 6p~Ņo/FQ?O" 5t/5Ea} bpxzi0÷q `< O^kϿ``UVO>'fP2Dv+ jE-< zyb>vB j 'z8R,}~*"xlPWh(پ0ޘ8 g tԘ~+昽813ʌ!$}X1%1v bsOϗgMΙ}j{Q88y1w 'x~6^9CZߟW/*诗KN.}~e5/]~Qq!|R u| ؿؾjawBA`=zZ^_7C "aW|!xTX Z{6Q2ktd_4yw@Z߷D}J4?i<|J'̎7ĻW5a|CgD] * h}^xl- 3s9jNB?Q >_7cl q368qcZ=}ȿTru} bRB/ֈr/0)7hW?] 7E[5PJߤ" o I3څ柾іЄT}>_^28_^__hϴz ?l\aCc`1O'ÝEGCo|Cl9WVS4ώ'?AoŘ_tǾP  AK)`` g{_–uP sq×cMiA0K(5pԜh.!ۈ=ϼOh0X(TOgz>ad &*,tޏgIn?iӲWpE5\gc%j">+ya婑b=7/wG1 6q) eMd;1}A1k$?SW!Kj5ASN~ U~3HrܯRU/eV 7IRK|<+:'u`|NP<7ٚDMS^SzJ]0S|?&֚o~+3? ,o%Åv3Cq ҩ)7/$FxɓJ's6.!(ҥT+Ht-XO ڈc}N |Q^x:OMoOĴnz<+YR'pے?ìq%($ Y~F3όWD*i,4OMKr&n>eNr&^3Еӌ-d4!Ƣ;T[OYfh,0RN?r9E€ԄC!>4ePՂJ|iJ&-H4uxz~}Y|~q~!t^?mۗGZ Ov3HQxv)FVL~}j"A0Exy> K/34/ዶAӪC?07FLu'pVSlU h>bj)3R%>>L A )d-6k;NtH\5Ϗ^}Ͱc }OrxTfU9usHwp;x䑻&4'DŽd8!.HXSiܧli3zf~sp`&X>YSmC*ĜdA%`t9'Eb!$~\rwӨMȾ6 TMw6#ߢj!Vɬz5Alm[yDP* AQ,9C:-u(CheYOnjBw1rn=C#tF ]Lg1C{Bοܲ!J( .❍nێM8I9}d24EsFIIX V7>f"&wJ0S ն H>򠽓DxKa`NC{*2 L?S}t+K_@ H,?1Ʉ#㙲\=R MIx!k;U⁉%鞐t㸶ɯWw1<I infoLeL<͈xP۾O~N{R*A5|&^${&y|1WN$=Qj^`'Y=>aelxXO\GI2Q!m|N jVn{zF鮰x11c0!CkxǷo5ݯD^.%jskS6%qm2[b$7Lp{5Zla-%H=ژ==vPX~9q*oN)F2=!^{L' (=mrx&<^ؤ,YT~P c tK>Ж dYH{<FYt۷gʌّ߻59X'hO{w{ ]J~̇I)iVeF #|D>jlLKms#5, xzGbFU;nmR2؟dz )V@f?(ˮ)_Ý"&ZPC2 #C0A4/)h'6qdYCN vBX|1.--IjO{8*Ubb{OT)JT.tgKmE$b|;$@SCK7?[8(4dwKSadsxx؜1TA=,,$$"l2jhs`Ǎ>xG*bH=N[XcQ-{c_]mv oP1iShyۡGc66qc? i w0N=8)~-u˸ql/t w[~7kM tkƲb|?. 1ꖍj{ݐFA{RA1Խs[$xtff}7.L ^;&#`li<Ӆc^tlƼhL#iH =NUSAt|LbsF obNt4hBG7 OCp[L `WL]Ǹ7ٜ%xg3mɍE's*|8ɱ=to=|٤D3}'ld5њs n!Llیx`#s?GG~fRO꠩ipq?f w 6븉jkߧ%Eԥp+ m'fZG7ʀ|rW~OqlB/nLŃ$dCb91nb>р Z!5ImE֑t;Sj%kh3)zH9غ8or\e`uz_Gl+ oɷ IX|Z: >N1ưI1yw J8'UL5ı84&NPdLv Ȣ4&cW!6{}Js 7$J6.|FN}cR;ydcrLp}/~SX‡Z0CzPMx0.SuO>]Z?Qi:*-DA)"]߃\T nm~ -́P!|^9V<29.Aـb ;P<wNOţEVŷÓJL1M2 xP4sTMMxx>^c{6{#oDgLr)3^80q2DnAlOl~oIono!f 8^0S Q521^iIa 6WI;4CCD5sOUevn .L=txKs 'B66Y))|z(+7~$uy 6#4g]zvӴ D]4-e܊ek,E)OM܍ fE@0o؊){I `/[{lF3fSs hqH Q=[23PI%Q/]c9. ? A 4V}S|Xt8nI(VgO1 >5O?ަP`lrJYP]` a}3ߑކ>$foP+sɋɚ'@pD7y=@EMWxrAJ!^ kfe ,XWӲp<ЂV R8a8>Q[4~{mqLWq9pQ<28"Qcʁ2RIl%y1|ih,B *dX>Ǽϰ/)N2bI\:z kecG%+RW鵍;~krpeL&ߥhd?7[=Zxy\xC[@롫 k0 *;-k1GuXwz)@mk{|aΦE_Mi^~`CLcK,z_1 Zc$i|F],{S*g4-OVBZĠ~nc6qcovZuF(7} "HolgSL1iYl,AE_k8I> ,}F-녲@U0<` PI*% 5VsrR)kUڬg%}`T/0ߩxJSH1~"ȓXZ$5?1kS&!1k xcHSŌ %goo1Oqzk!~Ƙ<=V,;ѴN>‘ ]wT KoW va ΅  clV)}mm‘.Zش}s-g l !n !^qU Ш/*vZw 1R`uEr7ǹvC4O5="l͡Xzi"Ub6C406p 4kr'{1>O4$q˜T´M|P8|wA"W[ɵ{ۄ=="$3h.=#S1l6wGh i.ne>fOcF*h-\Yׂ=CKm'%iHS$Yܓ`xkGC7_Vk\IkjbaD^6H:(S5QP=1sYˆQK-MrI*l F%bc"l3~͟BDl]9$S xBDȕwͮI 2$t$a Ѽ[A;" EE$ஓX:-L:P(dKɱͬ(*_O΁Bl )15̤hL c6**7tBQekJsƾV^ !E4(e$K}JLe) Z?~Xgڎ~\󈨙:OosRm]*")iXj9*NZg/I6DxOFzX#VN5aM?Vl1J00't7d+3x15ǮaffA|1;C.-lW2GFm?]~6wɑmN?6[^l7]x7jZ%O+9&PS=B.U>J:ݜ iҬ;v O̮8ue,)AcJD6Dy:8ϛPʏvZ'^\!|xj|s2T|܄S &D&fSfu'ߚOߤjw2.Du;=-[!_v^ADqҤPR8xc{Ɣ׌L h廘'\n_bMaC&H$d}sD}n*`ޱO*N O9/ ݺ.:u)su 3>/+z/vJ/? '5Ֆ lw~nVA:_َt ǯ刀 ^8"=@?q뛃H aPEt2KNJ#mL˂&L#Ƹx㉶S ,;fw[Xf' DOǷN\gf:=̷ œF" -o M=c̼Z;e7*~'hRbД&rD\ʄb8E$*q lKpAgR )`6*CM!c{ z,| ih\[;Du>(@pNH%U}Gdm T%2`tl 4뾲dG;R( cb+/h*kv2V|cnUB&T/2tMЖŴH[0_5iv2i~2h,Iqe{C߃Wɵ%)1Mv[}:1:\oW{|_5 ݻ:3tmk4=K*GNG!ud\:!wmޠ蕏v'9ҿ3I!\wK}Vw,I MV]&Ȃ 2iZYՅ af*вYUE`Ľ/5m$O6yL ^L%?MF,D,ɘ ȆHKxd1Mɲ$ VۊEb0e,a}ܰ =}܆aЦYD{E&;@Hf&9;Gh0I"<9O_Vpxa} 8I= :}+q^XpA)LPL`ұ!K;+ib4P{6&MOݧ\RL2R._ Uqekթ QdMJJ*J區G2TczO=۔ yCY7STrڗMda{1|^;L{F٪JR-'(O?ơ:{w[^ohft-O# >-ڴ_tm nl76rΘAtB=`}JҶyɛHI8Jv޴b^t'з-ӳhF]=$>|Db{4zۊOsX[;BoA[H"2 X'Y_z?CB_DUn K)}H{|.x+wM|o![Wۥa\P3sXSi ]WO6DPa'c;ԫߣ ?rߢ1=7bz{kdLq|lIѾ&7N=wyr#k)C1AG3WQg[GˆgbM6} wǥgvPSs~?d؋qXS2lrNѭ84 ]2gRV+н( G~heܿO|!lBO 7'{oU/)r;>nIAUrOJoau-5 jico(^]^52sXa1;DAהMjlrET=9rz̬)^]IMbW>v#UTB,Hk ir>lPce(ۤ|I?L9{)x7饙fȿҔ&Ibc!-vDol\)~3̐LwF<є]S޹:^~2A@""QK3ҟԭ%ܭLitܙU 'ٚ*jZ:2quˤ!gߩʘo4m)#~\bMZ57">owPbaq FO8V2/}[αnU9Ķߑ>-ʼnS/zo|Z[Vu/Oۃmç4~̦Lf %;h*ϐ "u޳o{^ 92g'Tc:Vy͌k0o zo`ߘB*3'6(Y !iUvvC_=d KGUb2~/£u%?sŗb}݆?xo/},g1` [}{7.7$sW;[>>dƻ_Mq7l/qL.r0KB j,E˛gV|E,xV-{O}O[n8VT76ڒ_4 A6rS&߃-E/-6{*}}’ ;hm/F pG,$kM&&o0I?biŏnTӝRLo˄Ľi|fMi2s6>fMv<>/vnϐħ_Z°NzܭYB'<{ 9g~+8 jne~>"8Q[e>~P#F&}4-LE?noMy>_X={<~O㾮f1u V?9k2c~V4[L noE1N={,( V~1|xnu7 S#Jpw!{X/c#Gq"6Іo9/,P/#F!PIA{q(#x1{6Ft{aۙHyw̥`tыrA9CHn'#HlN+X1El~İ&M!%ĵ8${"}ܓ8閸.]=e _VwzwiG#w;wM %~̌{ bxR#;"Jwty&\T<%QЖ34);/^\Hٓ>]G?4|$ _ + /_)Q s5&u޿>9G;)P9ɘ6w. !=/<.ێmH񎆙 $1}ξ 7^Śкno_髈?J RäJqb$;kWd,ڕ.=yA9k枹[S(}' [ERr͢ Fo)TX&l~XuSYE%!\g\=sݱ{Fg]nwDMduRОw3޽ )6ݹgR!)=RƥjR呭CZ#_(~f J*%s帯w)^b U|܍߃¹zD{:>>b{ 㯶pZvl;xB4-l۹뇻p7 I~>Ey9[16J^V6R]ك+Ls/yA@x1?֨TL\(P`/dC->-ʢybeJe5&o%k-T};O3}1Z% MB+WڝKY:d1quYq .|DO Y(m-Qo#~R#Xsǧ^ x[0JTba6aa]ՋsS\^7>^ MQ S䖑,3Ų:2Ǹ8kT%l1Fg;b9"I `^%2(we$;fU ҿҟojOdcPҞ [y!q"#XR"7Z4߼鄐Iˊ Vi֐`ե}ۊ04z24{ 9@ mh=pƕK m+HT\ $ 6DZdFx/LFGW&2HRQ]jy," )C@LNRL֜tLЕmWIתˊEVP\:b 7U9:U@q0,q+7x\ַjׇТL3tx{ a kguBba޶ m8G4r,6q|9W}l0<apFiUXe9&5}yUS5+#>N|CgT9]fx][ Wʩ˭&:tnY{1m3$tϽ֫|@6AXဝ煋ݎ!"7WWM (ǽ\p,sҥ JpeG`з &'yp/V+a+(B|h]>>>xVq7F ֦<@ tVM{z(Rz3ql,0- 1o.MiR&T0)xߚd# 8% oE$f#GLF\)׺NV-Zv]5 >0=d;}Ba-/ Kbhj4@3 Ob/F=Ӊ\i7&%r@FN\gM DZApSd[QcVe&ZkUv'*a*m6&@ht^ۙk]k @,+J\(*9HjVS9s=Z!~E@XU?3$H&\8jĊЈG>H"n6qT=nI&usPr;u';.TZDOR%EčUIk܅$Jz&;2*ʂ[5L:ZU(fUbeAQSH+e{JbQ{xzSy2gѡ/SXfLg %.7RG@&uMm!ddίƘ)Y<~\f)s|YUġj~#xY.iXI}ɮX'":6!?YfQm#b?ZQ7VuwEȚ,Kf567MBTi[i]5Cfby6Ҕ1ɜ>ʽܓrD bc`r('B^Ylt\Km5seC U [Q퐹q Kp]SW6r[c@~駙%u~<3!]ZJH{wdQ˴~&rtgZr܄b$ϭw6QwьECKvZR; h$,duR C";+ e;h[6HfޑZ3^HW5R&:]Ɠ3҅E[Dv!4KW3IjUhV䝹ͺN3%Y4w Dr霸Wq2a.ь'@f%2"rw)Y, ߋM0j}RQfp@|+U&mMvR"ΞA]mz"L)tsi  zOA!FX=̗eo5Y܅Xغj'?[r$L%/V:jwb܏|N=yJ^GqS2"5}ov7\2gN{ufZOؔDqšJn)ggƗO'p$q˛]Q&e:m %X`au~ؤFmcN C)C+o*|=j`J-?$[j{>ZESaډ=KPstT˜>VJdMs --i@׋,93jIOQ ][:= ꀮd7hN L֖<#ɥUnN"@9!o]2Mlrsqdx}a0 ^J( 4E!&f>>҄Y8[k1&1,Q]'sEQc'OyM"` ?NVh$7FV_2gS<2ݓC\Ҿ%;~{5Q-"In^.-úzp\SEC$( g™v;I*F;/'<Ո8gzjrbE'?&w2V'r6`kYZVI,|+v'%5%d%I݀ޗZqXMz R~ LBa_ťE"p壓«&kQ<$&d7U3)6ZrCD}Aº7/$K,iXgL̦]DŽtL}M OTf[5qo¢5x)-UaI@6[bEGsw#ޔ /Xd}J|}\>&0Ң.KhRgiO!9E%Nwx\z}|3ظ0/H`6miz_d$UT&nM/M#v=;zpMN%i'Ք):CΔNHj)T}E*4[M'M :ݚQ* ݀gcX+]W?И' }<phbTf(-~6RpkRڔ=c9$,liURNcѴsm SYg'4I؊ NF"kRJam~pVؘ[DpUqxN4f(h d;e ˘f2ܬٻP= 8>Pj{<^ ;.56MXV_ӋϹb)\JLW.5pDU]Uuaaа*Z3Z ,m ۬}WJwQm]Up Z-%o.U~\8P~^̟L=9%8oE!\ < Xk1Oq-DYTf/ Y\ _5}4H8_x̔#~g2aezՑԢr̗M(s$["Y.xrIr5&hIX%7ݑBAc۹x/zMo׽kw)br\>@ekbf2D!C0uՈNrRxYA 뢓2҃'̟㙻Dz2Н(hx<ܤ27]:ح(D69=5]/=1SXGd L * o<01o-̀:y&%pJ5 Ҳ}K"4P)ޒƳeKA͉wN0Ve4aãQݴxri^Pbg\@Bc>tfU"`M\w'IΞaSc {t@;aЃJeIŠ}\e*.Dl 95F.!{ZM&ϙ3,aQteXMWiLߡYqreF'FPDv_\dω)qSylO/bqF~īNbZmE=W(4³8T8\< rDkͩ<^!%+~&Dh/J:L"IЄ^JIȐM +>䆔gK'iuu +2-ŚS-ub2W{X~8g\\YxĤq3P(:>uל^xCEP /F`Xr o;gEs\KQ:) zJ7$&>:%Uy/8JEL+^@͠·4JȎeZYeA[l6;ahA¹Ce5.mm(rOpRf2;d `4}%<[l-i.JZֻ8^2ƌ|b+*&5b -ɬ)-P+y .J'ɛ[w:$J5:+'ʼn dh,oՌlוש!.O-E,T]WKyt&r[[.kZ)4е,ChP4W_^$[i txfM*˔}o2R$]>yzZ#Eq /,W+¢mq:=8eVj@sٺd_8SOP!eQ1"=:)]*7.!;8%=,zz!j]O ׊8L2-/ț]ޘb}b&{YSb&2&(9U.йh)Rϥm@( Ĉ>Lv,PexֱH'fU4g[6^=.ɔǛؚ8܍Tt5 ԯ[ +bF t/=Ԧ,z+AXWtVU퍑r!;Ịd֟RCud@]J *8Z#W]qz>»+g͂?LZS[m*3"PRP[L7f59UHw˞KlS [rx(}OG+ ym$62Rt4iv蓡:qǪ[ӓ։@5 l$JGCA8?)l+RS5CV%v#Lp5 )Efj {'DN*2r%(Sc~Hփ(g%9[ y٬cXx uU& OcNGmb7ɢ{ZCӴj&U|` m0iMFng. /si R!dp5e@H[ C)R;#]/}`N[ug̑|J|Y:l-t5b_,l"5.)圏->螭jj]j41'KP!7T[r)`~v:J\-*/ ",#YJ"FaITMy$(XQSt 4E҉ʑ|icQi>pJռTyA˰QRCuLcԱ@ʋ ؖUV|(ϐ%?eլ2Rʊn[>um |mzPQx,V%K'㩽tLI߬:ᔾ5+9(i[Q%l-52N*Qڔr EEUcb5oHRYY_%26UTfvLϺl56ɞp=xbޭq=~־RnzڊtMnk;d6klf҄jHF!7^yZ +NqDCVŠD3+K|S@Lj¨T:K`V{LPGw\]Sթ!a6)P Okm:fҢY<%z[wBT /%5xd(amғM5chHn (CS qIS'- 'y1 ֮Fh :,ӟz:<Jz$ [sGӭjW2&ҫqhR:j VA~gO*j?αb\C&=7.3OƇ2M%U@GΫmx8Ԧ@{܂U':#XmK*flLjlT^PRx1y!!RULΗ2.RH v۲%c5sOҧ 4\z(n94[Fޔhn}rn%J:NH $DpW'zu,G7H%z$]>ʤҥ׫pШpa\Kb>d y zo&et 'Kث2{/MYtoP{ZUMXjol@$2eǶt|L P>`Bch-};} nExw{F9NGqܺ;.mP40}7xj!zopmk#gMxs3/mn㸥-7Bǰm) ٌa(27.4ТNύDGט+$h+h=NWe:}24Ru8@I*xbt*]5櫵#p\Df {7KNh$+h]hֈW\=plr% cA_^EVpl\[zАB"NpTAP 1\.tp/RHɞ\uO)@09 A dajQWp0_fSiI`d:AQ㻥J}Pb;|za\ PĬlTs6rmK}/*jZP1V/鰻n?j}3@5i5v"̑,qU|^ƻS%Ah]͌R+-Ӫ~(v1Ox $ˋ|nU $:OW5IO=6>^w04+LA*&F~lJb,?kh eEa^(xW'9&-[~%[wi(w<4]ZDZ|pӄ Fs®ad;mi2EpplX.uqxM1Z@e;ҳ`p㎝a=eh݅_cG OH+G2.D@zfS={ŚM3W \kW>hU\C,q&`ܞ>L|>r{y\O_pl:]Jn6޺L'AoX0F3/+\siHs ]=C'[nZ6M"V߂M׭O}[T7|Jc6x]`| tn(T| 4]Hn1g@Ч+tѴP\nv aҒ`8:t᳒_:uW|jIz咲P_A{"3LyhY5ѭkSrWl#+< laM~WeEeږ)Rx%147 n@[Z>ڔG1@g::f-1$\{k<0bJ@*NimS²qKI@9r'a)2DV0>WeXiq:)sPϕ?ǽA;VԩL) L2ϛy%1^1(Q5jq!fSW=\؆J*pB"*IN*m#,T%|B=wYy˜Jk܋9 :b"+B li 2sHix6AO| VMf9B&^| )Q{>y AGu%y ѥ-1dAEMWEQUЛZY%s89K"d * >ྲBcN;"Na>1*Z`dLiB*D>*^=J:d<̕8hD&b2d`T/^aYt .LYZ3WT{!zJڕ(ֶz2=(CfHcf~dCx`C;MY֜=Oe4#݅+NָGM5 сFA2B;8#ŵdm2mj!24&"VX×( C< u  0? &eٖbŹ>yzVٯOsѽ;'W J3ywľ_A.lb⡳m u7f|/otFL1һ\|F*e[o ֬uKv5e-K1FoEܷ1$,|ϜXn W]dX`@p#|c۹He@`՝m}\}y^,E mVvnn%S f ky\e1 ǘA.vQT9Xݹ+ۢ(&؜n* 7GVrC+c\/4"sop)c[5ƅ\t8f9ᯆe?GtG>ئ^dT~7WjpU\N,#~9~{ǡi atЎf boaYۑaTg Z!w'H,n#-]AɺC?o/CDXea;e ÷ζ'1ha +Ts __UX[X؟yr>@QX]/HүN&(R2aOCTdܲ-d@u?ފ[UD5וbJW8}-!}rX,u@&K5ν7ŰX{ho؅bA_/o' Ҳq9Yl D&`)5Y"}]dNJ1ŵ:.E[ʹ#}X}]wNҟE4Y&gp+&U +i"cT䏨cӪ#rܒQrޛt9OŀVͩk[Ӽf^Vvd$b2'j3WkZ7&&e+G.Eyj+\fj06p[U(}=>@d 'lس։]>Ы i׆c,VpeFIoõ"U}-t9y(-oڥPtG~'[h)h2"O-^w5Ʒ )yZT ܼW}SBT ;uy|u2 a`u)NtpF.73<& םw*ׁrN6r7b%^ !Ň /\Wˡ 4,RHxHr]<1h3TqNupdnD2b}TYմIB(= d~+F>cR؉w:&V1dQuqOk2$/I jgH:+?r(֓?춖߂ -cڱOnpWBG6M%g4yNrZ g$1ѩ0<2jcdqť:[aȒ-6)Ei`v)S)!"/esƍ=y6Gk Dӂ'?Uy>N[ìM#X8))0#l]+FH)0iL#nVL1Kw0et`dQ9'Sa$ʫu.˃Hz5J,SK4;{8xd/^BM0Fx"iqub Ӳԅ-4 V5]:ɹoq޼*60aNcSދ?eRTOEuk((7:->Wh-SzͶ$Ҕ;P6ڥP\NX "B73lRZ"5qL:ULn1 U )Zdքj7U-1m(E}&{K%>,[ *b1ưj(0+6統 Q 2QDJ]BYKU859$3be>Dc⹽gcMBWLd;s-ښ$AI9ѧY<87p*4AM༔7Qzʏx]ün)ejDgq&lEiyDfE.$JVUD-t3݁YW+]ɠnNlu n.NPss[Ϊ:6UW/3Q}HjךQe+5ե1%77r Hq$#YSHUv!DzeGfK-[k$[$Xs*(Z r+(gz"`U;[Q7n*̣AـߧTXo\,+/ra7WmڄCɄlV,@8oL6mX\6b\@U,RqQqڮ(q;]3c*ݰ7Wpm[ܜ6c) P md6[6B-vP֧=Y]k}Ѱ*Vw=_ؚh28*t̔XudiW77hXEN @7L5nф.jn՘Ȣ2ޯ>*yj+t$k2-RkW{1ncL3xOmbe""( b7r70_!hs{rsu o0Bf:۸Ųk\NV7ÛatȚw[J6.є-1>ŚR~o>m5N킺3mS:P/mjXFz=;^yK{'*s8f|Lʓy y}pO%sMqWz]Б'A{ m a7?NhiXMWԛYh T>iBȹ|桻\E3D،~efnO⧯qK@㝚HD6- ;m#4rUn2=Wٲo?6800@dN[h[oWZ)C dVzr^ۛ1CimVL'\ h51E#:$)xM ne UiU\hXf'gO%{w6UE^#$j[1܍h5Qݷ&7*,opydrnPI|`I)[Tѽ,mj[YN>himD!%<=ԒSĀuG{i,F>;ċ>itM&Q[VtfIɓ}mp[73>myWڮ܎`15O@LOzfRrx }.&Cʊg4]X5-:.ui%m8{S,0-I^@I gW KŧwR'y vA;: m4-lTƭ,wE˄ b+xG Pn.Lɖ`3gtRa.Ŧ2_qT]=GX/g:eJ\p=輩޳lzS=[$q:y{fmH-{"K;?Zf.:7slƅc='6$p5 mm /"Tl&Bɛ<)S8sOmz%ުXw'LRO@ݏ֤_),~I {l+ѨЦw1ӧ n=:f"={F]FTA付v"jBJt%Խ"^I]pD QY6WMwfJ۸,ńMvU=W&?P5) :]Q&b"2OrƓ)Kۆ|3?MmF!ٱ eCUބ(OC60tU0֪Ru@}:E/i\t:K >4/|& y8 oH{-_O&̏9jWw5l=Wȧn0gҷ*6;F-Ă%4B8IL 62r jmveXpѐmgL&Vk)Curn~uiYyG[ھ]N8AL5/ ᤾P=GJO=B},j"]:*dm>>ڇCmב62! 4 d5-L7JcgёN&A{c4cFwХ9(uOl~5ya7-uD uB}+gکHT'k$E 6c+!VfV}BejsHћ+-6ͮ"&&j2_F\t5'-Ubҍ>77MQhS&R>q%KUՕ2%RaORҢ p:.,?Ckp Zݰ|vP`ޑe)=O2vXmv)wa>3ږ;.Z\#/*?g-- Hз|מhKS0; tņ%N~1 @9me\ @N>fmȄG-lO+k㡦&Jߜ>Yx 뫪mL\Ozi*9=r'߽؀]|eT ȍmLؾt(ovPs#Pmry4ݰM:`Eg 5ls7B&6JXd+ @O֎u+M(z6—Nw ƾK 'ѯ}߽}UlxٺҍƠo$CQ~H}?Y;ǡF]<7ۡA!>`fNʰ+ph7$8e"%d2e)uY }@"C#W[0|q2q̸{t<+<#$gDfմ Jͪ~wODbC5: Gu0OSFt ->@d4Z$ F Gx+sbcpx2~Et35M.v+F ,hJ֓~^uo 2:@ B1!֏YixA#&o`iDo~%ޒnvV)C)fޡH#9Rj,e$咓#aꨩm6#c{R3U&7x{TwFlu Pk5yu?_VW l2&VDMb^ˁD.só +=bmmЌ~"nߨNCލX,]߅ ׿cu?qe<4΋>O>3| xOoD_{:~tx5v>~Ѭnvqǽ?ر<# % 'GiO` džO~vaﱳOcs_aVĜqW3\?o JC`! X3@Ճ mDnXo0/LKT|8&^AO6>,ē=0Eh5vir8>&<|?qyX~dpw}w m&ݤRUv疾GMTqwj 4)*e~C@مev1#-#ٷԞx54FlC6t9Wz[ 'hmO3f!QR oϊ` NaU\A(-MI0P7l-|F0;C*487;n<6. QIaqEww=~In~YOԎ="VM-"b}W)` n[(^m'\19:y.P4a% clD7r#^ǠƋawFH7v8Fn FɑI&瀅MG+@X# J_#o>cd4m{v0|7Q >6l znr`w\9\,z𱉖qSOA_2a lZxhA~Rr\ɮA>BM+tBC40x q6dC-lƎ`;Dr_޶gciQNlBx]0G?z{$J8D5 khB~(%׺Sx4 'i"IQ)5D9L,Q_Yxscj3-7&+ulS.}u4QVX&\U(9_)+v: gXq6NŹbJޔ>T3-)ʘH4籮x,D<6'e*&S̪ fE/iCF$05s؈g5ݥQ[l$Ȏ85I[5U|v6Of2!i^Tf!vu5 ȼRWnSOb -Rʤ,9d.ez#kΝnpP@uRI#SetGHS*PAw"[Da6!h* tj&wvTyE;fvJYT5#&L7e;zt<:5-JVS)siⳫ)SƦh•klfuA)o* +O+CF6o'H:寵7~C?U$[Sq:KQrW4grW=Ӳ 7dvΔY޻'!f<;縋YV PPB_'m<(ڨ$\VL9X*Z5+~ޥgqpڥW]+TӤ ]o8S w"BK6=E3'3/;Ks|dD.pԴ8g PJʛLq0$ގh5ܜqC-h#xUֵ1VȑKwM)t7E  ]ɗoݩBY=rO0;(>$OD"NH`cT!dH9F8lc9Ygo6#o9zW" z;#zsKz뺡(vG0>G.{& JxR(ģq*SBF6v#n=z"B2 Hn@(SJ G̵rw]{߉8i*F#79o/P>6^ C mj J syAe.IK&7NRgTWe}}jʣp8 [1pjGi#Z*_]\}YnL`26+UUe(Pʲddxfn3Q$^cWoԡ~U|aYiZ4@2WQ^Y`mUoU^k_i`n;0W]]UUgH@=NuӶ|}H˓ hPX*'.y [/Ψ7 DJNJ8'Z #ȧ}VCPO댁G1X.Kx@sB9UZ.;?AM:rZ!<^l@ɖT=ZpG ׯ.MmQ̄c`Kf<\[ū[ Z#hfUp/HT.Y| +\<-:_Ps˚]v&j7yZP_>quso#uغc(n(K1~`T n8 RcKSeo)jF2 [W|jU! x[՞eTߪLQ^Fݸw zǵa(%Ӭ9TBIu8K7H]q~bjF*(T6W#ƅWn vĊ\{)VmZ@G7Vފb*A4~ 0u0É}4UjP3rCo5ʹ-U.~:`|_ܐҰq\r3bRX1g.B17.8%F-#Yn^4!oXb'f~nUO]O9zns\AtrǸ/\L{‰z[8w?e )ZyH8ͣ]5>:;P}BOY r | ǫT[q|3H;h9;9-1nhlǐmlN#qVjMܝȽ;t`tg'']0nc&ҟ=<0<0l'[F_$=v獮;x`O*A~e ԉNvWB5yN=6B/5bϾ,7!jz N_DV^F"5C arW\-E|4Aۘs iMNxnC;hA=8l CjM&Z)ugңz8Vj Cn] դ cA%cY/wyS¾BD H.cgRQDoBFQ)GBw_U|c MR 4q <\I?W2xW@' Kg9 xð:؍o!!`7~iY>S&w+&0ZVB5s$-& Qe=ZX5p>ʙrYxM[Z5jY:[+vU8Gy%޽.ۼUP.C?1na+њuܡ院eH؋:YJh\(Ro4GQ7]l)Y@I0ݕ Ux8+`Ev?#,7MM U.-:$DqCs<Sͤy E`6`Wh0#ttƣqﲡ>[[f"=F 6)hE9wNATA~p'}vN ]4m.vKjK} *h?f䲻7%ѦcgA2ҹoHӞd)BXsސst}dVo&dw$nu=ۢμgق_s6%caorӃ[-Rt3=|Lf2E#Hj=6u׎P|>v{|ܔeޥcVׇJ$F9Ѵ\|U6-rdlj}8a׻ZN5̠32-@&NEds`uUdC w=a5&v&x@;ԑu:ut,+E7ۡgnfdlO*S6yHNlpDZR8d><?Ivоy7k+ņ.z3i;Y$2z$nj *ywFzWA3tsnu`֚: AC'fAmZ3 ּ &^'ݴB=⺉H"oLNE/ӹ..PSF;s%@(L9{bqb Cxrw8& AP*vֳjs6N8Hmb-aŭϻf qهuT*Ua:6o6R9Lň*sOԦN$uA§ ՘Ӥ4z#6֠*Jdy2.a+댺zZɦ ǞUHqMX\,fuX]eWfj&[ei6VQ;E&mǢ9nB%73[lٮQ.°N{x2NY4%rdKUq:QjcFrcUDrva)-RQw]w6W~ew2c7-Ǹ󘧲/= l}/SMaXtHLP1_YGṖƠ(XIJ."*AU` цp$]Ԛ񠟉/CcMzv*N,]B'Y:U^K;P@S0m6,v9))6 <2Ji0 IȪiٛq [Pvjc^M,j.ƝT8U4Q2z;-P66r6FE~´%1 uSĝLŽSY[2}YD=P&^yb̝βGc_ȳHb7Q YꦩKm1Ci_I5o9dYAbS4Hub_*[2!TJog=%lRl!lHlmSaVlD0ɦy;zƭs>A>82de?`:Á AB`(MluG)1 cR8:y$qI{ NB1:V@3t:`7aǑ|=qi{"ϛP:y==DK܈sq!>cd7{vA ī ~cv#ww:[c:CAL$j8%NA4GQ Sga(:`y,>Lѹ ua3@8#t1s Qtϳ5FVNSX=G*"ׇ?~4NS 4HXm>6_JuQ#b`xG5hƾ*SֽȲ9@_0vdu]Gr5q~W=5rV 2RrVkiȯ`mnkYLӻ +kQ%bC ڽՑ۾!>]nc76rJ2Hw1g`́EmHz*׎Q%1g` c A6yA~QbdYF2j=JC1*e(08k.J^ al|_6ކ,E Ց}8ܑ]g.5׮_c}ېza!&EH]`hڏ4u x5 Wk";;K` LM-Hy p _T 8zlʬ`4]#b d>-5KȀhHup%7Z(P8ʺ5qXzPQM@YF*_}_P Dze9 ʪ"!iCG%|T@* ~Ҙ3_w2WьB(ѳz3^Hu|QPPQGE8J9Fn1pʸl( Q13>bTQǨG6@y:fH܌(ޠ`Vc{rzd-zJXI+޾x tԑb] 5lHGƚ4* K4& eY51,5sAWAc_?D,y!cpCX٤5z"Wk]:d۳β6 [5z GQffiv4>gx:Fgnemד5OE'Ɠv~^wWvw**ypnDm=R)qF`?_Fp#Sk = ^w~c%wlq 2p<͇ι;=$˵a1^ώ$7sn xz#;v65C^ٹb5т׾lhnEA} x ]#}m( wnïO!#cyׇO,~^ vm`屿3^ '9s6=x8p#0>tЁDם k~_WϋGK7C\.xc$[DPlQc7K47,˅=(v{~xru.Q"4Q:@U3Uuu{V[YMY/gPֲriJTE2+ANF 6Y8Xfq.cMeUip-kܭ.`p~m+E.ma5P$%@;d) "(tL&L-*Ǻv(Q\ODkzEY=D֨S`%^RÊQ>,ƅbt:0ŨhibRiڜp+'mt,敬C<UEO7Ejw@ldLe"x=8UJ;8Ni+IS !T3") ԆJ.YU]ݩ0KhrZ$e)cy\n+cQ&½2'6ptE;B+y:\< L:wpWlNc%`hd4'uqy|C58l<7[`'JtǦݓUXaA^EAXQ[*S2R2ZvWe_K|Xn=8UZoW3qVF >6nmdEE,@b!F--t p_=X# 6C{73n$!eb`Cj J/0S IGy%A7Vpn1ޫ[Gfl0nH}ORŒ-:b%:Nu4YG@?7B}w"ybTnEU?{Gb!'YK{aK\U%W\T 4Dnh9!^QUs}%~|`,?V=owg顇V=1/y?gyOxzЋ~B-TpA?jn$d8w5˝UxoSҮ L7s~tm)Zb%<&]bI׊*xVMtTKz^ Qݰ,S%5y;wMlqέ3&5k{teQJiR:'pZx# E v/!}eW1;Uq%҇XC6";6bPTnc vRd  `w]kͤɷ̼tw|طjtZATeYsM=@in7/" ͨ4ica,h bL5ׯ "KTWCH$ZǪY5ðP#n( , 7A؁+,t<{>mW$a/ɗ6:v$;/b T3d}SVi ؛۪.Qa:UVۙ][ @ۚLVG[oPŮ ^I02LDM:Kgb;Utb9@dBԪԩw ,k %PB}t,+-7> OE?>n۪44|ah!_n[U6EȣU&CjF|xȉ1 F}L12 蹆q ae|m}|Џ<8(/we15XƁ:\xrT; W&.ZE#NZ FN~0-/ !~ap -/yk"X6GN3G:m $MD9%1&D103Te$fk/ؿJk$s>ȖX h gX"K A ꁻAc9ƹ}nj*AnبpW:ϥ(No8 ܡnH\R.@gN)ыX ަ9 ma-a0)$3re2zsfDm\5}ZjZ*:zKl;cYledp׿bAZ2KЫ6U:FMxriy{%nx%V0j vEiN>AU zg>IMgrl}mJmZ)eZvׄ֬x /^`UmhOm@L{]Fy&nmPXpM|]Kjb#,+[%'bp|HQ t vb93z[[ [\Zy1Zl k-BNe^IvrTXپ 髀#'RZ[Zs)7׼ㅅ.1W'Rjh(E+إGd| Rl-zTFz'vbמrlV%9ߥ-S'>:A֕ D_nED,.ilp湴mS {%NM,n\-0_RpS' j6)6`K SP7yʠKfq_efD;̔xJ>ߎP&6H{N,I>kv௳k7"$Mn@O<$b$;&drc)'%N9B}˛L&{7)jsX$r`- <}! G8̍ u<Ӧ@xuF|u͌83d7o7BI)=ܧ6!lx,m!>SYUZPkM\ABIIj `kJ'rL[6@:O%E0b״(fb$7+sPIX.}2L=S,B~ ]%S96󢸼{N^jRRL\^EUyzKԺbTȰ9FBK't-ddc{LTФgBuCh $47?ܜD*MQ@W^Toj^R &q-Imffȩhs(7D#4M %1N eaM)w4wjF6nXKbnL6n]g vMl0 @mP :%}~VGz >23*Jtl[ͷͤYkq#;M- iD3kjn1B[F 6=NӄqT/lInG4M7 לs&M1 'Pnf3jraCPI!Q=T=?4 ]w(f^q&e[`՞fWa+]r71ڎ# qdž#4q.8Q'/!$t!8'GjEOoġAL8<:5@v`8uHΣYv8k?&YBb'8u ̡8v_йqc~LX&ĭ;V9.i8@qꆓI8eqB;",1B!nyDQ{ J6=mK<ރqg&dv7͖NlYbA E808+K Fع/I$hMGmՂ<(qmڦC{Z&9NKgh{ Φ#FA. v%y ,ڡ m|+c=D an|cBZ}ǘ98!ak(ZBIzL uxN(m KvC]2Gs ۶]P̏I^^ M j mQ]F#Mkn&d=鹶V8]F6IQo#N1*4CY9FHl>+m7 rR:LX'|h,DPwk*8C4$jlݕȴ;龍).QV-gc7vOhqbk2-m݃ύՕ[ k_hl6"5'R+:*6'zP (Cqw=tw dUOxEC5DnaP L{4d8Cg$ՒqQtUL_߇wGs\S j8`0l4YӎG7S`殣[sŭF\_0S3uطRS.]wlpC𰑗mioRea ϕb'@;l"bc>eRҠܴ+;lmѡc4m&^U!$[Wq2iEgDV:7h75Ђ =!Y y.7t4}ٌ2S`ȁJ &OE/I^#O;9etJ%dOJGOQ#ό||yhƑ[ш Zywy OEzP~I:& '#M'sO4F.1FڧuX#*>&EI' SMPÓ |ԡd Q#3!B.+ ϘS)JV8it#4Zɮ6T-٩O5-gaL.A"W F/F))ohI m)#Q`a1F8O#WuhŨo2IQ#+H gm=vS7BP`! hPW i26Xw+(j#-V5;0Ҭ-z4<5h't(3oI^-M:\G!f$g1Q q2 EbV0ƁrϾcscC<rPCcڟdv0ny y/ḥEL"e+CԷ=aQwL cՠO4z"HM9| u$LhA)[p2rtvY#G1tAKhB:m+)2̝")5:`%kSDC"Vvz G cQ!52T %G"HEY'R`j@^KM3ڤBX*LRi/G!ZtvN(ItO#4> -u<6SLMB`_wF4i*~$!wjTS8Ն Bl47{w4JpN]*F!ly=#wƛg]( lHBۄ;3laN^gF^Hߖku !9Ѭd2߳M[gMտUP I_k4ҽ&ӲϘuC߮UH]3/+$MΝ?)]mޛ"_+TVe/VC_S.T_(ح^ިif0RI0ٕ!0y.9J.d)7l@g>jάF z"iFMC0t.*I4";lF9YT;,D[J 4iJzz !%\!%RQ 3,H@Z rS,Yi$pAXFG5(396{ȥf4 P&֎5 ;T)qo8l5!hIa)ix%i ĶOɆ9)qU$S$i:᠆ F *+JPVވ524A?Sc~ӥ]PxNM7Y[B~azk)]4VI!)Nam=qMZ3ie^}1k,qy Ry?f-gX )?ĒzJ8cgD0|=TRQcZiTq2k5á3[_zm#>Z^ Ty\fK}Qݻ/뻘Xp+}p@0ď`rG,c%jQ0NjKtAi.A}eX8U|h,Q&b-Dnv\G# Mƀ˱G[GV$N$%r]5C)j>,oz&WlAHݭy# {8+ qZ&iRE~ϗˏ=**Eo5!AsALHȉ^kIu^ e}.8+u孇=_Ʉ(C5lq 2O|FI`<(lUVwXPr2?"DMNxOMd鯴Zu ZHNe<`036d!x^yФ;dx!-6m6xOZ % 1BaƋ f> 蹡\#=4 \;E2 bh9ӪەA:C- DpV=ztJ F_XѝTqUQZ3[i82l A?x>rP8hF ,%ij)d7։ av1OWȞ<ܒp K^h+ 6 csvDz;=FLmy")9n|NVA|Q*SvSh4'D?h7XKr?RN`iXx!$ ۶Ty| UPα<+% F3EV`"UXCHkF 5:bX,s6I01o my%V~trB긓cL%)œ ;?%db':tHHw <<=< <{P007̃qJ:"1H9h50-ГTK#6gDÂ+?ٺ)aV(9j!pݚHCqCM5sc4^9ޫ!KK*wjɩBV^ZFQ KemR' 3Q\Bk D4G./ܨq$2Vr>JSutDus-RB$!ȝ8)[jĕ1yT;DOgh!5Z5-9MfQݙzÈ|`ŵ!z٢95!MAX1-,.ut%{$Az" ~0βB Œoe d4@6 -G$, Ak0L5T4}٠.XR6(zoƭ)D -&X5%+8&c}Q14ܹ瑌?fZ|0hPjH|ُáu9c'!x3YP;$uob >Jtd=~ kWJ\S/%M2Ej6vEýHk$&8J^u'k$kv9Mh*ϰ٦QfxǣhgE~⻚-GP0{B=suڨ.qQ+!wS)eXw.ўKs2绪7y0.TYL`m=:U iÚ Њ1wm*bȵ`EM#ԴA ٛa4 IjaVJ&ArjdΊ!H^BWNAx+#ƤasPdd`Ii-&dV*m jxTC}ϠMLK]:̂)V4Ln0:~%K e /MHIvb YjJWxYCM|웖5 F7iԾxCp +?E3Vo a|CVo٢]&Int"UIL85 ,;mÓ4w;Fփ-l2VW{W*7zFg,`Ќq?b`CWkH{]m˽ZS|K V~^CDDGQau4u~%h cݭpXy2,U9Ҽwڤ i &^GuH$SR>Vݯ`Ba zQdt!d*p`O(iŃaӧP8]X+ϒfڍLJ&f3:es !gHN!+0@HӁIH~xL@Ĕ6}@OD6U)NSgtZzRה93wS00#-D)S|1zJaXiKk5ZGg6j$V_z9.FfvǶ(VAm{aM^,d rA>E2lQ`<Un¦E [,Zed%4>0 }X:7a%?Qci;ZXdOi6Xr*8lžrsdA2iX֍}HԊ{Zܪ5 lUt5Ʊ3 B|q즍58{ơӑkO&=իZH$NW&m$%lTklzyWE5q2 )Imגl^*_ԕ勎$68m4Hnn6#jiUm x!*Ѐc%"KfZ8uG4d?j,Fr'8TtW/ol{rk,9|*`<̠~/b[zm(SDR#eZ0/7fU߾aL%9dmlVvـ_h* 2XZ|jĎZh>{_M$&Z>-rƾ2 ީlhx#F\d~4 (4?8-b{z'm&`3lX >OO:l90w) }O9cʩ>># ԫESL5zJ!lzjU|9 LR_ ̀S$;җag8pXרM jwvBp(q)s&!fdD3&+#a.vߤ+y4Tql'l =BCI ۯ7KE[2Lσ$=]'഻՟V;7X2,[:#/9oyF%=iZzz#.u=Ň%iYּo@(ZNJmZy1UX SY @OjBF?/>ND&w83dהo->,DZ8>G!g1[}b5㠉2hsR/N(%WE DhuGX?)NHmFkDW9Ƥ8#R[)@H@..'if1pGܺ >4ФC dm&h@vUImq8AxjG~LmB5ӗ|FnbփTWLa\`m7]v %`6 OD~q;VL`4GA6EGDem%5 ҕOIA9Q5Hz &c jOpXHȏX'V1Z2L*-95rȌG*0<(, h^ԅZ%zޤ{?UC6;jTՠLFƥl#aȓȇ:0xڶEtI*Q( ˎRi#@ze0Х]a.kGE0O^#ѤRzP kcHht7sczRITtRލXmiϽr4Q`o"ibtA5Z9"H 8 Gz4\pPZrZX;J[r#b4l,pwwy$ &Ou0>7Z1^0 ·|LŢ_5r ):F{mmEږݟ6 m;614KEqgѪs1RPc8#Ik ԡFujqʌjZ6o28{ڷH5DEz{I#:!(J"$;GhtZ<'R oY6@Wc<-C|hj3] mcTXQX5{x562hЀ!=e􈳷cv=CJ%45F3<\.*#6g$kxJބ ;[QcFT<Ũgƅc3M[}$юɁeXj+5=Hݶm#!ryyi4鎓{ȑ\IF$#}Iˆ!ikG׃Q{B`79a;'vpnHi aWst"뮠SiRoi"Ee|iF" -E^*V;⭛ie\7a$N &C>OI%E2JQtZz?ɻ F˶}lؑee]<;,J A%Ph`w g_ǟ/H^i]Fi.pdiGIG F-8 f&At wRǁ4MЮ:l޽,cl#l3+W]4,S>[J{7Qˍw!4YQYSnPbQScsGP;,x?MDoOJ0}&>IIuvf$Z䜌=tōERPRRP`\<8?*E$3giw9' %e&5y0f1";HDc ƙw2h SP*&Dd2 `0#΍h.*S':  ^ ("'KS;N3D = MAP s,SF:5z}JĝdI$8"VLiH cnbII,(y#T4\-Sp. X~=5LFtT&ڧDZR>5%~tc'P>Qz:2 B>I >) T)MJ_JQi r܆&fu$NHT(Mrf3h:Yi>^NΦ;riΗS;-eNl+{fv;q?0Ʋ Gy:MM)e"@zxFiY-ȌE2VZ+JMP h辒)ݠD~yOR#1y?;I@)QT$8:cY-[CYixbyR_%#SӤi}zL\'4kՌ'W2=%3b6]طQ2&bK 6;K~zdgwj2ffMA>='DnGl }8ʜLSyIVD}" Ý̀Ӥ}s3ufM4-(rЕo&ѓA~<'V@M0)V H OOD >Q֞!χ`a#?)8jOS`;5QIB 8$\qF7(Q O#>RfWƘꉌ1XwhkOnn42O׬kyJӓ ѓ,iev2ƃznCIfCU 42V=jI5 %clib;?M'c<>Qěyn=Gz 7) Wu)AKD ch /=OoU1Hm:-B#g!fO0a,lu/F'cje4=dz-h\c#$FHҌb I+6˜kVĿIO{~r6;#V9J77-sH9`4cF˛DFa6׌ ҍiP 3ԭQTw< fIY*gY<@\>1{8 $(cU$8ߡyG_8=&l1u'V13 [Ǭ9;hS2#˞~ ,؂`.m$奏f7BI@Ù-PݲFZ#Ic-Z8N u5~FO|B 0aDԌ8҈E-!-N}h4 Q'1340_-Hw ?@lI6MEќ8)JZm}|?߾w`}%/WJ‹)/)ʰ;*2o(ڗU_V c'{Ƌ<_^-"U;.6M4+CϷ*Psҙ8NA/y 0eR-=@Rw!TKsSw JH"qhP x\B\)!E]oV7L|OߕMƄ }~I =SUjC<|^'xp$%IH@^ITCŇ'D;)jm& x[%GX'3?IH@Aٜ0>p[t_pYHk jp|gmZY̙ C[2 xL&g.S'E Z;_ڿ3rqb `N{JMf@>@? :1p]wjz[H\nw^wHE^* 52fA ͟#[䀟zp@?!Ce袷J]F'NUVB"${[RCXC|=-9ZyOՊxx,x(Ma lH RD** FL w*)xB~KM:E-4Wԟ z/Fjr`#&H)0,@g28cn?V|wH~Mo|#0o߈y]u7 3TB(b;);RW¨M;88CZY>9/ZS}#KѬc>]ÃA?ohzD"k4mj3| C]&n!tbNw9ipV|$^#ť, xEd0d+BZI<.rt߿HJ|Zp~GA3tH="5F7R%ٔ]V3 GoTs( {(ᄫ%x% q1t) 64&bQx"EɏߓhIdBBG2(~.Ѥwʮ0 R\ࡗ쒮,]h)L( kx! h0 1(K#B# }#l;#GM?dyr=[$(R@0w{XjE7׊7Ql{߂:;aq$8v9y+Z +% [~aZ)+XÕe[9LJP. '>}]`N %owyK5J4*!ݿo%MmN|k<ć\pgő̐EdPHjMQ# Y>&<$=:ik DN8 ˨\y=߾C =wTOz"NةyPAI$m&={o}d@ԡ{tSJ5S-E%7xҾ?h>4QH!,e2R*7qod3Rh>URB:QcZO-n?Gώmc'> 3xπhԣ=)9O-S2UtvMyӏNS=\1$k<3ܥWP5ăCz5Bo~J!N>`#=_zӿdD .\GwZ^I@mxOK?dC 3S4 vc/>ǜ˭u__|B#{ =r,0Ē9Yg\W|T_~Ժ+3|7f̀!pk O?=oOMe>0^jT5 Ljeύ@)*5 ca җՎU}qbl@k~,OXNBc c-ԏ[zPގB=~̫1q&Q]<ˮ))!́_jtg#%P`h<}!ml7%+7p-l9QH q)&٭H.Q:!!4зXp"ncܶ(e H\`S/frC6$WW%$m[6WC:3p75*i ,FUQl;Щ5n_L RXCˈipg!J[)g+D uY!ӡR&X up5Xm7Q͇8y%cDl*r;6Đ1i5 4A@Ɲ/I2O9=\jt\3#P)Q28 @ÀpEP;ljeZ飆"lqgD0PCJBe:-0<ܠe$"0ӺAf?Dĺ`8e5)t4\(!9H))AM@ \FxEv9w7ǁV--bnFW#p!^=d՛mnH:fj\sFQMhv&JKC̀(ЀFOu[ Fݡ~vހ?|ma93zZp8ۻhڍKj6[jEݐKmZ \R^go~p!n.R3]GP$0ϚRC4XM&5U~\pH*lBr:ݠ.WAZRpYT..*6(kǴԜK݊kaAQΞ/Dp&˟k 6> S)ȉ "p"PMRe72˓7Pkզ:\Wt4]]M{ % k"%.!FpQM aڝ܈JJCfE zF,fH ccOs MZT`Wh4ea`viSԎq4MV#c(m&%ZDn|oP1 !ɊlG|Vxjb[L7\eqic{n`˂ݐ۴BKa@ YNPX6-!(·PÀ)^ j5…huZUz$i+MVFUєCen㾽vLjx^5 6yLJG]5g&ˎ6b8 -/BqZܛ UQFeݡ'ohE+/9l7QA,ܨSBT@aHRi6ih 4{ʙĞ;J,1itYcIa4|0}tJp\Du\LNGV 4[C"ڦ F]`z/ŝ(edȶ"_ ͢S m` ^]&Qhi 1qCv-0GR646j$& *j4 JA%X'$L>"ZM,~4VSXXT^ V/DAV\\CC?oe eiͤۀ!6aw-lAͭ~sp!ě7 ' . ULDYr&tkU xMՃmO,%MPL!;BY[W4ܰ*Zȶ@Niam87Fi  MYcȶi=ۄ 4^$Js΁`Gѿ*L0&h ͇$Ug{6:O@(  4%Θ+*LI}\qDuD7@LM2[T':)hry2%E(1%9BL $zzb[]@X0H>~rC :²)f2&/?=M|"Te'P1S~z4}CFaGX5t 0i~2-4 Ⱥsj`\Lm(B&| & +B\ѹDi[ kSI*Vb# È<Ԣ/(`–崧B }u&AL˚ b}A'3 jTL Oi:s {@mh^p1zO {TCfˡ)/HN"g%̼^|I83ƜgܯQs,W5&BKK* DTé½7 ^C9([KʉoóC\1/QDZk us.v&cP Ыhg]D$v 85ϑR)y"Y)L+fY2LE$td>3_5N@x&好Igq"t}/r"ɽED@?Bt!BYuX#3HDa"#NCtఔ!i䁖_@37JE}^DdʑRl=hh87UKKV8e{e%X#U ff\T ]qZU J{Mż&_{3[ 0V8K(Uig=勠-LJ0 xMU 1̆rb Gw-3%Rq%랱RQ|Pv^s 29w:x y'Z!煊g@ɗʓ-a.躄h ri⯯]әW6rsLk1 I!R1+'$Kstz̔%20_ eemAS-sRꋜ+>XU3VΠ(@H9ѸFZP^ ^gV,/Hw:f<.ssf" _33 ϴ@_p|$~Df3O<_G/z HJU1z&5kM*˨~h"xQ.DTL b14zUq)zIj~iϳwPΐɐɳɼe$/쿼DN*gT3/ ƙ]0cO*'(J E@v:3/:EpEZ yyKoHm:J,"gE~ljU4A]B>ߩ?SY-qnc 6`FSgE\.:EeC3l㩈pJmN4`"d^f/hB 3;ST`xG 4T6zS{(5OAw}70=kJ!֘_U)Qd^T%-Tڍ%I>ucfjGpjv9Ir00%(?'-̦RRVҿ $jKֻ^s7b^ o!nc^:?'زzGJTGYUF8˥^}y|_*,ck[a/+qL=>8u}bCƚ?*zugeo://VwH,ZO;p&_ue[Oaߑuxٷ]Yde|fE.*_ݦzeO+ ީgYf!Odnm@jF2Bȓ 4lR[pA';mS}U叨әP3K-o(TݕtSv#J39g]Gy vCpBvHrtdF9I1/*Bqu ͎'^mqNIR%lM *nj3fE|}yw6lN[ nۙ跛0Z6mSٷdDtXPXym'd\ ( LYF a\w-!E &1+R:F.ʾ/*z"+wnW{rBY.KyP%Z;Ȯ.Vs*F 1W*M+)&y˗wռTdkDy*.>ϸfC pTdj芴p/eWALa:Gw1f%'ޥPý:=t:w>⸼%>?x{m#~uO+۾QwamIskQQ%7JC2$GZC~%UFrd!S̝Ψ ?;drZMRL̰%w8Ay=v{/s1\ U&vf&qwED"Ly@HU0~*@-of03$CSBj p7j.ט%Ҵa}p䒿C,\UJüюfXU9CV =uq UI ݜI^@w=ܬ#G-؇ZΉmCx{a Z=@Wc[ B3_ݿΥrN=R#z{I'~yʸ\ʯ JwI#"J#cx)FZ!gq 9?CEÙG'<:;X!^r-hPΆ0:aQv]Ufh BR+l̇4# .H+ X#8p*H>)rɦ*2a6>BJ×sU2+)5 hjZWղ^./ϕ_vTΗ۹^[kݿu*Gkur`{U/?b?߼(5U}#Nr '̭Or(HKD$?Vt /zr\ ]ؕ>k9qΛukJ ZrLsgUW~j)[̋{M._N)ea$DR 2(ߵ jQY%jZ51-r ع4vR.ZWw6J:Z\tJ Pa C1 fѠ&5)v_zIZSZֻep{-A  t3p7,YAWnsKz|91.suIr+hANCd'M/;zܴ23[;D X_XsO*(bIL.`KȿN+vo|Cl|uݚ$d0'juAme *tetɘ B2;U^ 7Jp T,S=Z+QeZlؿr0hW @^uwj3b`8usfӏ.E& 嵩̲:oli(ka]ct- %Jef5:GgLyơl:X 6l3s4nqņ}Fc!^KS*qIU1yADַ[;x<  Vvz£Jt`&}N<#ZѝamzcEay{rފExšY{jB(ITõz'F:35 M눣j9K UۭŰ%W0u.N!U֗gA,khj\Oow-cB(J\Qh7m'Zl6"Ft5M<Pb([RWjZ>њ8WGJ#ҋA`tK0 ުP$Yk-'"?j4W>w4em|&s)WYW{:ֈSVL]Ocs1W >X3jpXũ,4h& mNMKku12EYZ%IzUR5e`͟0BW}~^3qT3BN4Y{c>bz9&Sչr0%Vg1\u=!y_fQܦn($,ązd9s_s+k)sc \ R}4Mg<(S0M7EelBgL9V{4 s Bd]ܞ02]=<}]9lCg,U3,9$"璟vP$%d ȗGꞃWYT׹\ 9znU$MXyg2dH0HPdi@K[_~dGs*] s'~kzsx *0rWy9K9u/B$ʥ_lg^᠞+IU$ n:篴m0/}^0žA ^KS̽Vwfb}/9'/?e<¤R…U 6\wX_(hյ:3rFd8&_>X=w+x t^):d95h*g=¨3 6Ëk bڈԺ 2~qZ.6bvcm/\wP K]t ) oW]>$a{'dxbo!օxZ8O+go<2WȺ;/r| $|}+j.T9۔a \.A؄(5O@Z^ng'IJZo,6|]ޕe4nB`BUgE,~~fLO׻l\x?{NOr*$2@'7K(&3Xqh%4j6Q'([9ǿQnS6l"X-QrY"6q$tB3Zk[l*- `82r,ϸq-uG]Koi6Palj1UINF Ϋ@Gz0~Y&T<. @5]^­f H1p79y˔uyC6O Hf r01#.{$co7׵zK1e f.l|QhpHc> V8OE.ԑgssjnkd2;dxs"J )*Ff[ieHKt,whuUF[8Av/#H'[WTZ]Yweiϕ7^ t{^缿>/\KbgRWiز񢾄Wۗ ebeal<J Ib8C2U =&kkc*F{HѲ+9esk<)7MÞ0 ڼ:ȍr[>PF#AmRK,$d,Vk 4?(`Zr0C4[B"S/>lr;Hqt[Y񒗯0{*Hu8-5E6J\ [H.$MR)j.$" Uy#>^xH o ^'9 %o5tc\/ 8םUA-kpd2W ;qd󗕸^-n{I2%qc 4 ((2hW\bE/ gϯ#0y@A aWL ?<*6@Se =Ic)hIr?h5= SܐfKuӉ??.z'7}Ӵ~Y3] XAY䚫O&iRdTOͪo7%'emcϙ4&e]$ :H )+,cJdSeJ&$ڎ&q2yv'"q;[V#'gt2\39 f',ʞT(cSEfE4b! :q^%BԔ0^f)'Ei~;IOl`z(7wj*1Àp֘R 1A,b%1`Gg!L)F,M榖!\,5k%uxՙ -)H}d{L < %oe'nY}2M"M/k-%iO,+%~H$f^߰֟]sW'c ʢ 697zrtav@%˦T{cq[#lڏYOɿِ٠{ꦾq۔;Sf9MӠh~urbxֶsK-EҫJ%/ig`[MN,Pݷqo4bӹID}}}ڦHosܼ蛳 چSm2'8 KjyLp%pnh/4 HTD k 7{ N4 K1bBN=':7 ԯ҄_[ 6"ݔˌ묮1O%T`Vn" ~ChB F~H4*Ez&atLx18 O @,4hnDϲIVBՙ$$GR&"+v3E1JT턆䉧4hSI,d;=g$'{JD:FdtꄨSD3J + lӨGɅl.Js$UiڦoNM2knTt;"@/p)gF )njܟC4T)>v9礝G%q &e vܴ2@uϔLfK g*m*n* iBY򊫊 uV2$6f'k֮<@ܯμ> &|LKbpy"夠ADfJT4hFƽT!zŤ9mҬgJ?xՄO>x[[ 5%k#wlrewE"Z/XF!sfRLY&$Ŕ`3iOI)(S6X4ʻ$]Ty#Ea{OPt`5kbbϽՊz=ݔ|M js̴PKfJlƦ>ϧ= :.<Us=0`VJ~i[ɺl/a;8ǡ^iif&.7! kX`,KU0U,E.ېyǕJO;/u: 3`!IqYqR"4+3ZMKJa/s<\yrë (6? tмS=q ,/+"y˗AZsH6Hz%6$XByHK~a1XiSuB`b_xγu& KcF9 I-j>Qg* Z-upXd.M5ENL82B- C.XJ:qkѶ/u9aĨT*ȴ XO-WX]  3v*He`X_$ eE#rLW9ΩsJ^ͩ|Fp],$-Z6% fI*]U$bVTL]"s4d,@"TmQ+qYy$@yu@(Vq~tgZO<$Zzb:c OJæK " \ebA]KJ1V3kF'v%f$?ש萑$9"(yߵ[<B/9\ 7 !0uۃU:{ 9\ u5lE,'$V_tZf>H yw}rxzF.ZyjE*q-wGD́OL::IPaTu ^FUEPR Nt}9YJp.3b]!dIYv%MEE"\g=^N%58{3&r)RPqDTD@ZHOr}Jw *)@Z`Kߴ@e dRB*(Ӌ%Adv{$raMT%]юTImV=fEe F#Ȳ3bp,qBY2CL;MxCbQufm81kVUݐW\ULBjUڊJCMK`XߟkD*W5#$]8N#SGdɈZ,f8ݥ-3ώ ǒ3l=l*$q3N QK;:NK,.͆0R)X,_.+ogHjDD[gTR`@`\"myF yQB f(YɆEdjhA21:2F !s(߾P")Wej^٘; Z_V-VJ̼.h5lE[ca+5 RW4yWpz(cQ&7m,oUSDR5s9̥|Dm&7bUYDQ2_*ÂP90H}hC365٠y _Ȥ^Z8H6 Jf_IVrtQk УH\D"آsytۖ ͦn;l֏lOQ2Wvmcn7rSV(yst5uHiݖ%(nݐJg$qvvkAs%[&t~l,-Ι=v3ʶv 3k%m!3ۍ vRX֖]'62SxWCv 9nHS" mwR:zu[v @x6][k$XpLX뢜NMQYM'AnI"N&ВeBLJI_o@V7S/"̓"ή6oeR#":"qP"d.hڱV!!߆ bۥf`K@u哔j0T"l(::"_"uZryMWhu,9P!o;z+P' nX4soغۊn҂5^AwIֻMGCBن.*KRJPy2ϭ0\oνD2 eB^Ֆ|{v"Am1fmâB b>$,($k+qnO8ֳI OّlQ$5]vF;J;i.5(6H.k-=Oی8u2% ~Om0 *Yb+xy[x8ӐYQ\zK*;c{4jDG+wE}'tuZKkJ:TKg}3:,G"L^SX~tӍÜ'd:V'[=탖Ys"riZf;37Mױ?䱉#pϊCBlnE8v+0K+4 י=-%w4FemC*mh;5tki 8tuaDq܇]Dj1zUЁev`i[T}6 "z[ѰNOdn H–NݤFEl[ЋP9 ];iGa%k\p 9.ܠݤqc3G H4ʌ1iJ7^6q*m'IbdK oE; NInM.+]\v1"U6U9MrɛY`q1pqM`s;4 C݅`vK GW*F2KȈ+` Rw6R^wR `$S@vhQ h^o3R,1窑;)խ+^]l6w/ܲmWPh^+*3.lA>0PjP}VȎ#!јWɁnBv ;}_nmqKP8Rb a ڽ.H܊O!n԰|ff`Gcu@f9YSEqJ„JM/7I 40Vj((  v2D`IޗDXY=a(`fN-79oJ:4 59;%u4w]̆@elK ysT/ w\ A` U*U7czۤuntP k@l4fwd٣) +y2ۅk›%ԉ8E ><:T)ԕש{C|< 4ߤ(! u[6vybf`җ(|i&c'Ē5crXeuq~ p=/ol&wƝIFcaAuμJxz,rMۡ]16VH.ӝDM"E@(/ՙaxuhѴЙ᡾u^q`݊ې݆S7AsO̾}kOtM&IrH~M|.ɇ+{!\/V"FqG=doA|d6Ć\ ]>iB,Is^K&el73TI ނs.Jpj:M(^. $!"v 6 N٠& 92,JE|ݩ_뎂>:dQ4p1Y,_[r5Ar]UndʫgǙ27TDU~[)lU$@8#9ONb>X Yeu9Tj[Ŗ܉(W@f%7Pyp,{j-nMjڌs(FHn1(\ JDIdFmv6Đpo}&U&_&xĥۚ( 1;|[_p*79kgԚ1& (t3Ab[8%p9ir1i '6f61 @dQIp2p1& t UL&&y~[Q0H7*:TXWL߬Eoy 1üIԚԠlxjXqui pA:)ŁtEcvJ6D&$FLek0m^{]kwlG$%T5>]1~1NΙ`к.hx~Mzjxz]'0sȻpSs=A0uFd#{#e9٬2tU]"# mv+ Cԝ 3gA蜦ֆHײpkQNLP#2Xw&;t:%tC]Ԉ,QRClkslk5wM-O5 y!]>kV3 m.Mn_X):獦,S)ێxnxc&y"0z[Ij*݄f%v9BYˮ$,f bx9[(Ud!| #:Yj]ՙ o*nJFM:ۂ’=(r.NWu;L 2n7Dw̴Nj j6 >-UBi,r TB٥M[:.$0q%U0&I-ېq'uD&.d$K}P+|rykpDe&DyޖD*NˏDolOEIwl;%e4*X{&9TIJr%l7[@.)UMXT:5uQRQ n=5H~S'͇\wi$k q4$ήِuBp2B[s7 3UUjlX{HcK8̸sPuhJ`^ˇj~VK@"~1jߋCFښ#!(*X}:,zMb~Oixt;k_oWe],rGC{)TtQA ĄDcǎ9RQ_U7*RpBqoN願:<0`nWzYt^wA%yb@pK;,R쒼;Z1f'y{w8FKUП |'ĕnA`հ7uXt[z1'}j:Reۚ&b\* έk͊:Mې֨CzKm4<%7d!.th['fQK0ޒ%,F&h M¤6&ǝ)jx*_S$uO{m@6EmUlk;bǻϴMܿ*ވvHW r2CwM jۆdHLm\aVz4WFkI$9n!("(ϊ6b}$O06<^&Pg XVQ ŚNčw'¨^'e o ]#WVAP #AhXVsJQBaE/F@tdXfrx[bme-&oB5a-A&}5j#rR3p -ã{C h~9BRa+b(Tw]aZ>&+7U-KաVQ,}6R20͊7ЈWK7$Lwb?DǮ7\L9ug^uPC0 Qjizmtъ:,z[W~1d<]{e]+ZXWME}z%7ẖf(MټDs[f%W{knIۏ'޿YVw۶(o hF0Ye'UQ}nm۫AX`Bb^=~Cb2~9ڜ·|>ϧt:ѱ?^gTs׿K~r/g}>~2}T4}xvp:]=ʿ]>YXWadr,9_%bKQDPz^_V3r-"ERGhoٿN]sWƔ) A׋ mxBQ!9ǮRYuQK(Zrr)"Ur.j=TWu9A/ ?m>C7??bh)qNZ/ چE)$YF,($pKE㿎!^L $RWe꿋;Jɉ:Z2yrrt:xIy| ~Gm?}]H%^h玆GwYL6o f)DFޅTyS#J#%=ިuUG0ԭ$K_҅>r: OZzC&\!WIx8P^{#ᩖD֮?s'QG/0v4pdM\hr)DbIi0@dh`Ҧm#ق%{+cwFZLOfGqk:þnW}˕Jiݩ\-9^K%cyP/m]~:𴳼N_>w8u2eY.I{h (bwKƕKh;N2m/8-9!ed!Lɑ0茺3NQHrX\x2YC*Qia3EqP> qb::b!QYvc44j]!E;R 'E@y@{b /ǪS{<vȰ @238@/"k:` =L =a4@OQ8S'pᠰbNv7e,3w@#ti ^*pt081v3r9Wⲽ5᳽W6_ wF" ~\.}Pq|at9yxVD`; TlVȬԳ HI=):gF's'^&e:Z?zƭ<YZvg}\*H2ZP:t9ΌZK.Xj/ B|zH.yj%A~`j_B6S=G9SH8C)][I(k8"]Ŭ.} }AW8k؏}Y=B?/ ^4M> a1ǐ>nZ **9Ypuq1yꂸA^uB>}=?8#`͑M&~JHhB"AIgjRݩz޲#ѧ=Jv%,2T:Cs>mpB~p{!O_<81c1cE?ݔ#/u}әDy7d4Aw/meChgfwj*/L44|].tH' {$[4ZdMFN#[*nINNEpOpjgiD=WGG nOH| }9;t^\>)%ۺ@.)vt^.n&ha(жa7DzgNa`;v{Y޺O)p,XYfyZhj͊YCCPtYNrPgf*nz s<㿒oguPGɀ+Ko=\aI"=A@nZw&_?ptC`.JPscl붕!/oh#Shw =;ρ:l"{bfvM'`rB_wu9~R8yq>{G֑ [ׇ9 C|ntSb| GoD<,y2VBЛ+֥T"uGɍ1,ze> LEd <18;n~؋oB2h%Ktb${чtcǗ9vW0 tne5NLŝ͡ݡ+߇ml}f="Q$G*@7PӿfC;*o)[}oFxq.2AE[alӦ^>/J)Hui$HՀϽF4(3ovhPUUv`2js/1-+xt $?Yu4 d@.&e¡iզtMW䯡cqGK@d td}"8d欰Y(P՜oY䈘>\"Hkst>2CRȭminF{LYZm/jHBrin4P;f5Ogg^2˾;;6l4uC$T}ӠfOͩak`s<Fewx@wK6U6#W Ə]hTcj!c$7Mv[bwLҀ}Y6+B/F:Xa/kuImMP\.<+j EN`6K9L;z:>مNjuG kfciۤyvH:"ꦥ>uzO4mɶE7H;[@ۜk[iK7y.Wsܸ(|71h7}:6@<0 5aןٔН͛ݕ]:ߑpMmG?;a3wݞڕлRRY^(iaC]s'ds1K 'K]KU)~+':%/wv1]7QӶ .Kr%{^b;.a; an]EfK!j}O w3t]لV{]YvB ؾwX ɝwacQUQ-[;n6W U"!ncpvgXdշ_Fw h "(Eś رZ{2b;%ϨlŦs-gDvkQ{hqCpQZ7IvQ.C'6qoX iP>e;G̸o j6w7ݙ\zu2YvW%_(r:lɺ.q^4 Lѷ١3Í2_&w}m_[_QO}bog UypL㟗RX`!LGۧr#~GB0\{ p G`8N1J>PYtFs08V؞:#&/k)~k7bw\A#$ DyGIO6qAkn}ojw^G+NK=ƠBP17ܰ"jި̃ =rI7_@i +#hX-"=( DIz'R@8ByygArth#A×Kdv(W $liiVgNV:HL1p<%Oq=eGqġ? &9)D*s@qm!M] )wC1o 9v>yc0lOټ-fhsa-1c"b84`bFH_tj@n}''YRQ(m8Whv‰L9y/qt_/.d A iLp`ߘ!='|k nΉR(u^v 299ή {]"{'\3$ӆ]q=' 8&}B nۀБAG#_po8'834Jkn6`g#t 4/^6>)țBVcdP@{B7{q#L&N@;_L\;)$̼g |2Vvg3Hm<#Ys]( w֏qTEu钖 D?z9ݺďVI@~}_p#EVȶϷ k.|E۾}VX(c$yv-1wB(܅cLY>[5;[aclmO%F=Ֆ῞"FES&CZ۸ʻVqπ aNDvܲ`/:Vva}O8dmk2Ux"ߌݸ1"~-Sݽƕ`}^_ TՀXl+ooĤԞ{x$3;e8=v}]/ow{mGǷr^^ꇗKjuy87B[O@!v 3 MZrq+FU/C*2b@.|LgrML נeq-_o_D;dWUwKo/KTvuPd<]j9<'a^+{,bD%!rl: TsB+IPN3o+yBWXOԻ҅iq]XQ n@@EwV{! ҋʛKl$;v NkݳQ@IU8k&I@]Nf6E)7]O3"/h:'"eU: q&K4:Na#§YkU]a @LJ21L^ߎsSkW| t;AEfBT9¿}Ar1I= "#]Ǜl熷 "d.Y)QIs.N>{9Wy3QNĖ٪9rGP&-L`)Վ୬0gy'ty;dX93, 2vf[׋;e~xӠ}fx=^@zi֜|CI,p)3i6a^ô<k o1p1?qc=u>ue8fxd/PC_bn̮//7QAyOIb< Ă^-4\*8e0`W\Ш y\|B(r-zdWNзO{x|x}>>o{\~v+qoJrVчϏ\,7xKeov?Hջ "N0^UY}xri{70kif{0aBoeY-1 P% E }߅swֵ}3 o8Qۄ)}g5"){({ΠLMJLsoKwnB)1j2R?>klDQ*Iڿ?ɐV~y n,2o~rI9C)!]0[~zQ_@T`7cw0rffQ%Cnv>&:K@>,rvAE4AL_ufvM]VAnRp񖽘n8Tp7wxxwdpGj~o7/s>2{م,xDl9P̀n:6.D/6_ [UBhh(l\2&V=Մq .7/V]>AIfMd2-OZ?~!&^ayhQ>ٻ{:ג޽7$,ΊxjЬSpnra=Ƌ$ %G!O@{.&ˉ.x C|npb}4cd/\y>Oo%  +}+9FVojKNWWdzݠ>G!Фuн&)By76~JY= k!椑zI3*e[FZ$jve\\9EdC̶$㷋g [hq%].>6Qt`VV{@ 1v+>MAyMl =s{*!!372g '5([Sev%^L%Xp$kPZkى ohͫ_B4+]x8hrj|x*g>o-<}OD .p+" Y=h 7͏UB֊GPw$]aa[8vͲEсAo^hxar5nXu>-mhSo(czE2}ТQoA2d#yPh)`Njܬ } 'o!%8J/7 @܃Al7o'Q)K=B`s~Do^Y䕐aETFiFݳ]mp\Ҥ[O*Q*{lo"*Ch?| nxHMvoޮM~ "wE`RpK "1 hayo Ʈ"4>({fMb+~ PΝS?BՈ[Dy:7ĊV gw>͡Is)*@r}WoT±7\dBhH7VQϻѴƜʾ|S9rS/474(&K'%wRxg#۪&>n~z\fW}.ص6Q!1W0OG}1ɕ\= \^v(A\bΛM'`5 R/`2UFO*.UA+Cw U^K5ckpr ^"c<;xq]+pfdMI7JS=V]/yZ6r m?xS^{Roפo :/4V/H(:!ATe\O~H=((ۛ/uCb*Co9l3yxlz}H*s9s]|-&+S,^gحv7?Sl3s pzPxJ&bt!~G=HpKٞ1M*Y#/zs`&9n*0!x>ߝu잯2\ؤh# Ӱ΄xt\XLd3)',.Zԝ 9z. S[qB-#X8:8PQWv|"KM{c#!rckr̀Cg{!@Y4 ]`Z'bdȝI Ϟ|~+Nϱ bT|3CsqV%D05&#q42IsIdM?A˙lR1\#LAR`ucM.jɃ\gu>.qY*B6C/Kԧ0ZĀews *4 31sb ]Ф H>#R,(,zO$AῚAkʇJ._rijЛHLIP%oYe"ht'0dէW0r ;5m[ =B:aF'bIAql\OEs s3ssI$T/ ǚ䪏 (bx1Oȧђ[t.ΘOFgj8IXprqC,ۂ9'MNAr3[qdJ:<R/z'#w*{"t'v4czI]#Y[6?yKs%Y+il," _ 4987aFtQ^|=ӦqAiuV|<עL~e*U9B$ 54 ^UQ(;(~~$O~'Z x*=91`w}K3CuHA5Co!a4c>#z9&9N':ɿR*IKVQn+~XKLaׂJyK] H&-#rm )S֥zԖߺ]^"OE_tqcڻiwB>4R_].rHݎtS >ڶ ~dy_2p h(RJHéHΩ?Tr[9gHLM2:1BԈ˶PѮFg]쏅/!Hcvgv\ f-U}ݻ`ߩtrYAsWPϑ͟Q1xmnz[\Kf$V_8AG"êtY1ޮg{?~Am:ɷ7N@:zä7}q5)vF7tvt""/37Z&TiENz*dVfܮqKx2Y [B vo+.V3_8Y5):@I㦆dXݮ7\2 OY1=ON}l|Q K61tz&1pfz$II6ܓz":"rahǐ=Qg tsㅷ&W'FVGbL`Ap#wSщ=]8IY0dV W<}MJ0|.(ƃL`}J>):`q,Fy6Q~ً\^Aa[t}*!}W."Ө~Jf|P9WuSb5|s-Ip $K,A\,(7] 7ɖ@xKJx)G=>,8Z$*anV c"5$F{pFud x< XQ- ˄@ +ӘȻOB74V-zCO\>\/lj1}TOqѾ{)LcGze}K&~> wPFZUv -= IdR'U}#~LY7,-+#u߸ՕGͳ45wO+Qk ]JvoW7]J -"ܻbS"('O $J;/.cnw?|AWfsG-+#L?LfvcGq)UMNRLԝx$1@ %p#{n].+nw+\Y "c1 PuE"ʧ8*`:EU2`ZWD9-FP?izҌ+}`66]'i/)eo;{j^:xg^J˙ӳ7m8VpTe<gϗyn-e7 O#A'Qr^ $LkDܻXM?ć7I~\K#DwTaCME9I5\;c 愿}YPBŢo\ǘ)W+RV{!IjUW%g&uT8._m@4I=W} wW;ڨ+5E$߹)N*b?K%MaĂ; k2lSoZ{F HޢAU7*]{&DJ-oXh=ټeBSPV~{5r\\MILտC~*=977N7t2nc~pl޾v+Hjhmk?|µ@KϯgDP ~(WXO/S~D^j|v bܟ^rGBB|r/yX)F/VqB\rXwS 詼uLRRΏs#>`HݓXqP@Ly}rG.Kh^?B &#ܨE2T?C E^jRc3-PAʶy^4ID id?X>#zc84Di78ñ[8s)Ddwxxq)ۯpS/Ra/¡~|cϟGxp?'M2c a??>~_{}W\s$?*?|_?}O/i~>Xj㾜ϯ\+DWp Q?{i~yj|qQs)?dU*p).C.8)2bT#>K?>3EdȮ'N//98v >L·U SsF"NJ +Iw/BC"L/XB3 4%P/E~/"Tm6eD~)p F/!˵^OQgycΞ+jr5">y & ,8\şLg-N`!?Wo9kYKc[s3/DYA:%Bp$|p|~N>PRO u|l*Pd241L~:_|?XmvS~! BN00H|=0|\f`G?ܽ|y O2Ȏy-_czM fV?PSPqyqJ ^gde,Af~},P5uo*I=ɭf T?x-Vnѫ(hJ0A?yIF.BAa.,oPL 2>?dV&? [s[HeR'*mZi8mگ?-O7Iړ%*$D[K)_*qRRR?ϒW~_^i,>Y s}jE{T8߿^їU?q`n,XiztqE*o/|:p\]V~;~[yѿ]+73(ܚ u$ ,?_VO+βK/y7^9`k)YmLRM M&G QX'[ `%_Vok?Eo*~]^?{;,D>t7@Q/N`)(3,OoK4 xuDj]'|0I)L >g7+_xF]9d]p^VҊ)?N]e)iO/J,םe+?BLXt @/Ѐ]'=&_`JD03* 'd=2/S 0ZlC #:=f̓SZ?kIJE,?È巩?_I#UѰKpϿ9Vs޿o)O4ϿS?c/k A+i ̀Eݞ2q,q=Za _b{a D&_Z=?;ř3قx ?(x? 7e7t p+bOqofd/AWS?o7Hr;BIο[#Do:P1m /mh)4T_K4+(/?7~ڎJ6O8sPV/p_޺_?IyYWw"RzPU h޶EU9G{(Vu ˠ3v B3Neag@BʽZe,Â;]תX "wO 51Ӽ@U= Yѝ&bĩ \+(u؁[pOhفYl6˲~m:5آj{qAԑlٴVb4oϩt(6N[ƋY4WgLBgٮ`Ls$-:/> b:E& r̬ZEXʟѠf7X ɋ4aokfOP|MΆ,K3>qLSn$ZMVA`xL0g[]MjA}ZU!b52wYN(6] TX< u.-f<sG[v_5SlegLnM#d9fRCc tĨV d7߲nKU&U]tye$㎿X:c@:W漋iDh|'0iBD5brguvP@agB;Y(kݡZKf5oFrjc3VEJA(]UƜ}Ԗ zh*Lp6xZp Tp1a *ޜ`"VeN=8".VZ+|BwAG-q67SLm^IDlq6Xr?M;Šv]ziKg9cAlzKa4nFu{hC!֛,nfxxMlԕ*wil4&RW ~ 3$4fW# |@)ErNHRDWlbl/#G5$[%aܷK17]%)a\YlW16Iܫ7enݥjXqy۝MI&yhQ"tMozEDsyXW\fe#b5,XąNȽF.f[+8XIQ&BcB@Tf`}bqO"L *>w(1nf %V7`8nH"޶mv;2bQp!rSXtbQ3!Zts#܄7i'^D= ͌M8j(|٠ACfo>/f1ArI z0A;XY<~5O,A8Z0ш+C7U",ݢO j'{s]da(Cfbos{9,qbsqi#_c#B&ƞ{XWbDoDn\]-λGLTcU&]OԵMgĸP}ݐEyI,YVEB݂!9(v:xރ0Z{ϫDZ; f&fof@1cdva+h2@"DOn4S)Ix.1/Q߳%XUdžʳ}xUJ"lmF }D,|bس׫ҩ>B_5^>3p,dbwybuՁd` ƷO>u.́guT35.攆Uöxa?L됶TEVxj(GAYUD$,.fapeSsWTgd)jzꂚȱYvd@=Gj_-DIqևz*O@mn6b؂7+U}+* &}Srlf/iȖ/hZS0A_&v0QHu7% %>!~0/|2D 1#nlWD B.Š͕K9 ^76pLs@[[E:_gхKXޜTVZ*9(JK9e~YOB2+mZCHZ]7wLS3GUԧ[Vώ]+$gS};,؉ܶ@9"MV%3Rom%|+̨uhB\CZc7ZD:RTLQȇ̘y4\3"=KU/!Mݕ|u Ȓ\ّtuiyn%Ɲ-|ufZm4}ˡr̖m^cHhgZ?73r"\ d YcJfl tK>]ɒ*P8nFlkpSariȝS #2iWkDs5[yl7l8+΂QA[SdD5 {':.D9Nɋ*5kSM]feo>W_R6 ݴD4fwrmz s=YFl8Cymm%7UC1Ma".m~Qi[=wJZ`)g26u$]yPX|mk il;m ya73x,X/gLH@s`ղi!-ڞ` );?q }~ٲ 2Y`>km`c 1?nPW7^fJBq%%-2.O s[%C|eh[XeӨ!.# p4irZ1k$wgIΡLzrS Љ~R"i>~RKT 1p޲o5Md0N!uo/B) UzgZ'B #C5Vb!~iT#k!rL*Sd(Gy8ƆVEY'[@DPӪI1V fQ @q՗/ZT&VUiZ[Eجbj̵@ e.EoԢ^h =sɻ U`ȫ0Yq:5$%&ژWJh<U D*>dex(:l\i06nEoe`eMIF2ZRv-U8x5PSjQCZS-4:ʒ*z+u[:z-HFaeؼG#CIBRUsnN\ouRDh1*le5#j Y|-E\OUW#S%JtLncVcU@Ӎ4VGGYV٠:L6Vdt`Zx04{;:C+:v"D:QJlj%naAi<,mETdFTT;(Rq蘏 jq;:J )iVج>ȥSQ9Ok[5D#|tV!#!Z;q{coyr,1|d<~KP >aO9u׸EI>qHg&*ʅ&/U>]vԚqVȎӉrX?,Ys"JXmO]l(̸Fs=- gA|*mz3;SOT(֭%G[9 'T1\~jfcÙZ=$g',GzV|Ṷq> 6xjE^j0n+;ldzmsRwr\ qw~q:il`C~3eLԂ>|*.(HG~T(SO FhDFW`p.=, v[{tR3,M;QggRoN1:ctzΫGk5m#ګn+(33;n1YA6Uzzau r2vXۙm2JΘ7e^a5S_[繄q|U*܌ [ *x$* $we;J,E .d lC陕 sh1 ePvJۈLT0mveNA@,J`5}d KR[Ew< r4>_dEPo5zfZdTD Ӣ:x&.6Fgs . Dhӹ}Y._כt(AV}siSo"-f뙖\&@rdsKet"}!GX=Õ ZJŵ,bS2fTXpJ#79:'ЗG.dRveF`^a(WԦPeD: "34rv(|eFs̐HژAE'NSw0a'@b:E™u'ILbGHC_ R 0i%7&Nǀ" "":!AgNʁԥ, jIfvt|IS̗H | (ub2QXaƋIf"lE@K|&`I<$'3oD q#.WEH+jb"KY1QID.G+͔ KH8(B|+ɘ.ԇ# ei}SCYb7*M .̌@涖x`99_..ܱ99yHb dCڻv`SHDT\Tb\4T(uؖ )KRQpmk[5`r8T@Ŏ!g}4TajIh0Sr,:&Mȼ7> rV3zB$1\,Ḩc-)ϥn4%Xm1*1. ŒT#!g&gJhT끭7DۉIWd,TF_,Bu`55Tii!%{Va`@Urc/%bieJ0qko$-lԺtÅqeb@SM{UJ^v2mP{7$>3:|9R5F ˔D [Z"6߉@ϟEcLw]O~N;,Wn7kF)#g@d]#Ttd W$[bP]TT>ՔItg' ";$ ܬSH exS‚I`p&&Wi яj3]G=05F~]-`HwFkPrsFц;dp'5ܙ%3s3^\7 Š 2!`Br41]V?0MPEYZi7R+u6HeNMp76Jtt`fQH7Nc(L?G,QQ:2GESELUfZ;eg_I-AAWNj7\i hnj1dY;ؽ2Snc%IT.Y[x97c[[.S_d${dTKMҷ,EKc,d ՗]fy(+tqf#aU[8,/tR'$c!kKN?rCM_WL_DJ0>4(!F!-r ePs7J&J'_ , 8-yXe2bxsѡʼ2_d,)+kFeY y=8Ϣ0́ؖYK|StEM}9Bķ1s%2Y,u]oQ lUHb@i9m[DY;Q*rgQ[8Հ/MYDRR2Gq4Ir#,0x\4 w>¢-igɐGs)xWoM-ĝfb!tHI:YDS MwRLiiGt_UMlm ƃ3A|4Qrr9ua=y03Ǥ pS AW 0HǶ[Ѵ$r\#1 2ŦLz[ė#,˃3BB'gkO,@R LapaGWj2yJh 0am1l;Wv&7-5^[/UTJvevR;3oۀ.C ~a=򱛅XE_ϻ&UIӚ(l{º p lVp@: 4L®N%<ߠb)U!.}fs(0lKA@1X<57A6%ޑA@ !FxW"ʉ~78& Ij$OBzOD8¶D}oI@ * 'gE&\RX(I}2M2R7.پ"&@4JȎ\&e4gʸ#wn vyΗ}81.Wb1jhib&Mo$4 HnjcWnY޼{%L=[/()\M>4w{3,5F>Z)6mic63O7]!9Pd ]df2mOPǮ+/.)6%[^F4Ќ"бF3Sk>Z,]E7/62YYQW7~JB3+B7:mmnkay_*t!%@[)z0Z(l?O2^r@pTv(oE3[Ֆ"4_%#-mAP-B-b [s٨we6,F)}偺.賂Pxa:-嶤[bmPv"V9ߑHX|IGÀZ:s9r -^+&n4> 0 K6xh]7E@a57ao|f Nx='",Zci!P"EmBV9c;YxТV'ك;A{(6bQUXA&^nVDCc(Q* yDyaCy̪&شb<_`#{֕\s ᝆ8d<5K(&P^ 9CWMB~n3}DYmAF*{FPrgU0m][P ,7QSHSjȃr Vp5sXD*By-'_04OQ-y+B2)m*ˋE@n>Tn,jrA#Gqpe!22iR@J%9ujEBɲSsuTNZDÆfeT1[e'[V~%g? *fږĤ5mL*/HPoyn5pL1R+WFKk@ď[JUL7Or-(Wĩ,ze^BnB+T1llqmϼ\_5YI0PJTFtXeP.]jo>O*ѪOT/U_:8NSŝBkYxZYj[=!A*?{PqSBƵUPjz 2?5S .$oP,q=c#=F oP|4o۪ECi+1;B ;B+ ۻA"o{)N+r" F >:Gn] NĐ!q"rbHj44\+WSJFbHuB=C$s\&̸1#r_Vu^Qib杍FqԳ:_E`çbDRDD&?:+//]& mS|vHԙnP*{?b߮0LLb e]Qv:;`py>r {̗ʴXCɅL(oYFzBE0 /'@JNvؤoge7(t:(D3X{vCt ap]ȁrhB8sAYPզJOô r$zAx`:I8!923=|ȇ PjiK)a0q/O92h:j({SLܺՊˬLjr ##\;AŨ"lnYХ;[f3;IRv<%),a9?jyy!3(,- Fz҂:OCc0m N|v̠Nϴ`BF#V|/rv鬋a33ٰGPa)Bhc8mF!:(=#aofU"mݤGj9)hGg|3].ҋ>p=l/FE`e׃0Nzs[o;òw9܎^;Yˎ{#M__vdAh盝mǝz ݽiv伭~X@9雞mGz9A_|}52BCW=ZĠ{8'یL^s;9Ա x$Or1&XTnSq> (3IWP3yTx |UcVXPwLCTzC0TQ?9 J;+^vnd7;^4rNzտ Mv`aww]g.{s ąQ+#ϕr>cDcՏwq$}$qx+}ەwy;1î\ܵa(o&4vH.W>$hnv̆ N$?8iRQX*У2bMޮH{U +M$,lƄ0a\i|50⁲ۮѴe hvAX8*cm[ʓLضh$JPrĞ %LJ*{Gjpkg7Un37߃x4QI|3B˜x|3quNAVofl"~,j!B.TAϸcu l"REM 9\98D2h|Zڏ߃D˜$]4TvdWYw˾ڜ },˅87K$ [4T\]tɄ mY͌TU#+'e#KPĦ΁E8"un+.b-2EY״`As^UziCrcލ8MisK$-f.kdf> ~<-Ta" Zfof9}aLTr$ت۪\H@mWe-?h3'j`Uj᬴ѰwGBL^C[%AU q#fQLqT&A[ k;]òw-DA݃ d,HO=-O:L(+9Rɻ-3EVuYW[qor̊OcYl*Vi;8t۴u R嫱.e٦,qU;g!m1m.0fSXwkn'RWsaSrg iQ2Q0fuh`X4.1AlGzu`//8aHv} Ƅj7sTm5|5ә6r CfWj"X@M (3yuQ)iyG#2w]lBF6Ŭ3*6kQUr0^08\?gƻzGGŞf'+XwAn`u3c55AvɠD10ˑYdɼ,ֶG$į7K8=6J$HPTO T~Xh6X0@: ͝PW'1= am>x& An-E4cެuop"RwzUWw݌o!uE&#/"Ov6qߩ?"/D #XZY\*@['|~7sHOZXa'ե yIUn+M"yIٮʫAcpߜ40FJrU2 |cpGxG؜xn{-<-󹘹 M,_ -x[m # swYĢEUU23&Ym cX4WV Š)b.;[,tոwE\G[Kp7Sf k1(%:C>:bo(,88~3s<#_7nt4Ȳ|UQ4%k ,)53'Nc#>Kdtq%Ueub$J`\Ǚ!3FE>5Zl>Co }Գ}X"ކ2 lآ>/0 0G~|B iiefz$u\:-ܑ3SS~f M?gcx rZD (>{:zYp0.&w3OC3 !r+d@7>)*f伎H Vr܌H)dI"S(GȖ` &4YIӖ873[#gIhEMfJY v<&,m-{a0bRnT   Q< ѾOSY g!VditZKQ@rKP &h)9'1 ȷ̄j\tW2K 5zQ CԈhq'qkSYhcUα#UR}Evu#.&I / z{3@FL"Ý~ (MlyL't8rCLMUJgV<( _/rb61E Gq'z oL4j9)c4ć Vy9QlJeQ0RU }&l^XK{GQnk^W$$S9 ~˛r-+?vԞ_;Jr-]ܻm ðwC4%.u:_KB40ino%uk+gq>afA03;:4~4~s;wwlv~ws;s??M^vS<]x'B܇oW~R|a7˺V04HF>$^#1d׮pYmX\Om}>#ζtYD_GŒ(NIʩGS[cl;AZv*CG$ k~bnUTrFQ C{s!`\`ضF"3þ<3[?1,w|% ut`D$#]oø>c7l/9 a=h N6X\LҦ$aF}PMA[m4_Uc]'9; > ];Q׵}|53]9%0&F4GZ|o0;= 4d1ą@s܄B O;`*j{"\vpHyԘ fN}`qgh61}3Tļnt>>n0ZCq^dH.^ vUg^#űV=Tސn 6jEPtnmn-#A7ֆg:d{a=2|J& jocfc  #5[:%M\QiBO5%A1zKҾ?cia:=V;Ҩ;̂~3( YOb3 <4(U_óc Dy5"FnhF"{*'M:@8 IC3h,F1\f ׵DPk0B"t9ӎ GAM( Kx&H#1=5 ]6j~/d}NVTm*Qw̼f픘7̿mH9[7)YaRo6+>VdwxUnU0ޮ3atN{fƳo^Ĝ]iM%F3oy6,RMvCתѨ7}zcf7]2?gWkXik op4E$g6SԭA/bhDvE ňV!k]ڑ$yF44@4 kY GȰ1g1.iM}4Dʒ V6pT "jZ'OJHGܦs\ <R b'a8u,VN$~D r4bZcJu|h6HeŸu7:mcb]Rnk^'bnX a&aXhk: gKH};BƎ@A2ic b]R#di7!rihUllHo[ 91<-mQΌmhΒLEXL(-#ws&f(0jEX]7Oz RsEn2x5pnFg lSc򄞷T8ʖ0 M`uE[T^?ֶך~70+{iVV2Cȸ7LFv 2gy#[ 4KЄfFu0Vg]@gщ $v$`F;P nߵڽpQLvk].iRUu]IӋF奒'elaiq @ᶈKGllk&Ѻqv5v^:ea (Jwkd|ZxD6֧&ϟ) :jӬC_[[CfZmTM?YVO~~ٹ ukS^850F3jVٯGcHgOSjF3!DnQxoqm0S/6+u;pmdXք-,UL>M-soGt:@ G +#ͺ z-cG} M`h*łuSl+yc/q #ES )Wx1r 3ƱUDB" A106NV:SH4FO#'+;CS5#Y"H ꀊV$[QDW쎲3`qۺ|Ŧ[WA, "sTUx>RnN:uaҎȆ1>6^<\ޙVPg77aQfUV[["ZL@u6MycESAfUsKTzD݆튜*BhE#["$B^nht! jؤ" &zXZľeʥ:{𮍻i颎Bz&m`n=aQ[0 \*֟9F⭭M+5ھh#DERqWԐX*`>1SH  i}8,6Q)L|Z5F1|]Xc(s&IU)idddX`<],!q: cz ǃ7ըongځ`ZfkHujGZ.w$j+ MDm2p_>l:ni/u=^3O}Q֤EY˕l !CT4 H:(m+cjc>Y|3 XXJgW-Wk/ÃKnj/`>S̉1>кz͌S?d 7NQ̚+n]+_f)T}$lMm^[-B1DtSnOv7a5sh;>5&O_iN7' yyNQw8Ls#hFG;PZxЃs ( 5|E%|/7'0"1uçK| <wƫp~K#~z^H nr&V﵄_aJwVv]Z-jXgN7yC:SC(=P3Bku|@aU MxXߋ^dִE&ߑT~@7{M~po}nvW>~)*5P+#$X دvō:|~LRl]\ 'V;ק.:[Pw ~ZYwoGI7V1pB_1>@]Ŕ4E uXk3oGvv cvDӊ1y%@7CٰӰٛ*}$MbʎG?|} ;Yi(__ՇCef}4HLZRG޽ݥW#Fņގ" XΎΛGu]=Fvt7z>#bR]? }С\I?WO`Znjc8G4ch{S.6Άqnzax?qJMXO$k)y3lZa3ia|TVDȯQDc0ZLa9'4JWR5 ʇS}> %Ba>@F/__NZ>*icEKYֶrpWwzNM}ڇ>n&lo5yuUVP|o `hk 3F޷фCuoq^:6oٶ^7¶Q曚ֶ"rD%)1&#x&"`ab+ޑi #kD*&I M)+Nine5 K7#!"h[]CZx1"YG.7R lT1MP wǸ9WZ/T;0:y%Ÿaﮋs~ Yu2|6 b[cB1*JK/|܁x"](w>˺mtOG,yif{h߮ۄM 8s:bL{_\|)}Лϧc4b;B {09ȿ@5[v΅O3 *b tFJ &-S/÷z>т rȂAH5.Xt`0D.DP{}j\Z*!Ya/Bڵkym)8%X2[WU6Cj2ys?Ubl,[m"hD eҷ_>pDoԃǵ 7g C5Q!Rt)Z^ud'8/5@ϟgGKi^CG8̓,g;kO'1>9yh,iSTrDhSgO9 KFIs|̎9HL>=+"R#@' ~vB\hggoxi&}qtSd$> f؀@2rH#GgcFF;G6bwm1Oڟ]C<@ϙ^g~j6r<ڈ>?E 2jHWƢFS|)t:(\i6,?1Pc?_=<RGhx+S)yZ f0+S.dPSA3^ =n¸f 3<h7D OX&=w|KJXyc@oe˞&aqe8ݮ3_%b[V61Z.mybKbI_ ǡFܖvXݧ ^sx_T:l;& OZaF=|h1JpN%2b#pMA7ZE"vG$0KQ`s@bh(TOc1-,!g"It@Ml`1$6BHRΟSMX9?"HÎ)0e@{{/̫ƬWu)cnT$4Y~fFf|/9Jr!]}Y\E66tO7 \ov3@mk|E.ߛƏlb=m4v[M>D<_Qym<8k [w'9uG{ }11r hOyR~o+7#3܎SfUnn/=&Gƽt&cW$-`weRvũک8=jȤS;{4x!(/v f Jw}3iE{Kül:Oޮa>[47&˅1;مA\[[_x$'w,[د-E}'ez!~&)"[@YW( QqIu]օ^/5yËo\߲lŪ__[i>[~, W؈J;݀~H XBL~_Kʂ_%##gnlQ?׶K>Xngu'$:DOY’ſt< 8BݑkXj[< i"HJ2P !#&tӆätZP%EO߶\wa8Vɘs<;sjRCƧ.h&mub$ìlbo>(Ly aËoA5[C3xm,&#A!H׮Ӭr0T+.{q| }coGdfa a }6AJ Xh{aLۧ;B8H"~;rg#"hB;HDMis ` iQmXq"Ќn8|<6!fPa6(Ii ^;> R|/:(@K|9+fEZ-%/d5uB&y&5QQPSy@)e!9S NJk'e\[__׹$s_m>>=?nC4$ `pֵɖɚu< 4۾>wW:}?#|yzqr;к`CPL|#s4} >u`pic7 ̺yooLXE"ջ^uQ>ZnC3߶rfOF(g}|8JfY^ZEi.p*NJL// BBÕ9:qM#G?%.!i+#*/nʇ#60p ScǗD, $2źNi1RG"R{x*Kɖlޣ#)22O"((i9x:0 P&O'ſ, O G0s̽0Pˈ_8AXWNE`A)"3xE)| [v/pQNg '4|1r g=0ഩ3 11ЧUkyGvGqoedhաg2j˾e|FRZWV G-~E|>1T 3,rÃB4H2B\.1p4#w3Қpr 7>5KV:~Jksb6r,Lė W`zrV*"hF™iGEd\Ve=AGǪ˭C 6v;Xrf$|A VDl ~,֐xI)e%Hs7RVjL<RVzh0K~(W3.md}"7gZuX!n5Xe ;y |TF_*3Wl:jL7&% ԞP+O%<1?t-d ey6j]bHxhHd2L*SFE22 d Fm-`b|_pJ2LH7Hxr|%9~!/3A1uIzm: 0M.\!CIb35\mt5-:%a-s*K/EM7 ̋*˺]wh0mSRwyURw|6ʮq_p&U(mkĞ Pwc)&꼮,!ꇊF]4橪a u;KEAumJ&Q9A*"p(i8㘏CېL:Ύ&i#}(}"HutV54o‘KӸҌ% _SUۓ˽nҨa ~"4A;LAե켜:sN(P=QreahĢFf =T`4W[S] ;uSΘ.qviU '< DjDvY)R)fѦ9?c*YufT 8 |m -?U6hȢBao]NŴTIԱd[&hlp>yd<ȸ< cBL=?{S]+~9Zɝ!fƖ~LHc ENU(J-Of:7GAxpjy+K::@]> NEpz@pn2jN2u0f~Nu^Hh:+s'qXW;ٽzn0՞TboCcb+FoY;Τߢ#@~mGƧMotH¦)d 1 CRNs͉O.X&] aEp믊dy1̥iYȯ>muή wc$] &PSK*J *3FhbR,WP/V-/ jY:_8Lgnq`aXn;֘!1Vj_(Ԯ ; T׺= OeePbfQ[ץ2sr ^B& Z,K5sp +ud&W.̝,R#mex"D%+HQk|EaKvϲ,j1mB[$+Zxt/w?Ф/;O|QMS1ZӨ9y!4>eB5i`??v|qI)x8e'^sDOead-UAV8`!rH{yQ3hswG&I -3F"D *^~ >p>Ʌ|K~A^|f>wBgjH܋Ql*m%ޑl3>s 0bCt$0FOs4Kd/\W׀T XM#AHDCFuTcI5 r% Ʀb0{+5Y`cadDȴ(ޕ"{aFQ`p0c< \2{--{ԾQ3#= Y,3 cd-G<0./{PQɮ=W.!C4:y x?+kf~7Jq팇:R ?!'K3ם>y`8TQ l-zOHX% 06܄FJx"٤o@?3^\) vgXSIFЋ$kp}AH4c`T2 6Va)"*BTaw0PWC3V#l5@\̶֠EН#^aze4m:f)Џ*k%l=Ř1mf&RV#"Etr5gPbBgarD2[35dx5a!X022TNTİHQ29kcdg7N=_D2efIm @FMjV"_")jBsɂ@@-AD 4RKr|:.WƨKCx힓0!vI.T$>BN?΂ ,7ƀ?z%g3.tсhȍG13;j,-^É{yx@kɗ MH.`OwtAF K4/k^%'AjXvE"k45LLP6bO5^UW=Ԧwp9%ɋ7]ԗϺg40Q\٨Qa'%5|`a0KHS(QQS  0)㺌}Ƭ2R _Fy"7ba Iۄ)9+JbDic'@1Ntt/gxD ~Q>PS0Pqfs'y]1痓B:"1*f9ca3;k4o[B'ЛJ\Ty)MKgMN"bgbŨZd/ѣiK? "85*1H6_aJM@P좊bRyy  NNJy9/ L!&1PeTԄWq&ЏЊAsm;'Ec"{/*i@pyNLjlXq2%ŀmJ„^M$x R֨(SM&E,핔(a0>ZU ٠2<- kcj,hބűt$Pn8) 1ܯtMLy # '1{yqetQ/8$,gʅ VGli' qhsirh_ 8mLc؆U˰zNچ^&,ǬR>5Tt)`=+2N/n#*pH*2RaDÙAX zqb0RSQA8ϨFP28~") edmc%D $kJ$7p[DH f+`DɦH(҄=+_S7/, 1Zѣdf2ƖkNivvzY4 xFɴ950('l $n Ã`NXY$VK=d`,qN`J̦@b2hʸy)cPk\ ˓ZAw;{0Lx㶍MSmcz8MǣSСFF% kchx&-`Æ>͍#B߃.ܡ6Iiz_JE|{/_~FXVu(xx>p''d1^X"<03'qRhe k+_8"?4vŔ.x g՗jX?8 "j\.F)H{8!T."C!Kpɪ;"{<XL1kCl=Hrl8Bk'a@B_/'s]0OzX6(ܬ%!pzgnVWj"JRY ̦3TA<3Iҳs8?|{iAXY2W{L<A4༢"0;WʕI ͬpH@؛899-F`s|8;]3Q< +œtq͸x1jEgBO&hM~h@C잹anظ&ؤ;{+yr8LT)Rǫ$l"[i.f_TX`Ćfڻ&pp9M0g9Ju/iݔh"Rr.w].9ădId簘־l1gߕcYY IL50(C5;U 8fCٟ4C[qx}L$^Y=3gDȂ,b(YJm`$S0fK=ȳR>B=0vޮ1o#+Ms=N'a"=J8|tQn g>iOj g1Ewg{& l1' ugFI8ZtQttV̘gWUxYE!NbYh%P?s'dq ^/~ñ!ۓ#flL"&x\x &-z^a$$+/eo)}_/|FdR ]>UQ(7w\,4V0 H`*OXJPp"Yq6V(WslQ-ċM2t|؂ɂ|2N%)%_D6tN"+WN,YV 䠶$m 9Wbg/Lt Sp3HQbsbi%:4fF&IaF+PLRiYʉ쿤9eor1iYU(X5qcXM$ue;@Bme6iX^/Xuc\SU]"&7܀`>j#ݢ/%n jI[T-g-тZ{=D*PQ{iBnG˸-Ro*-r[׃H) @&?5M`[zRlmE`gO멒_-TJxS!L3ޥƩNsISe]Ug^N;zt{V(v >9S%ЈD9e+9gs.YˣUZju?@t-(]N0/D {E*QvlHHVRG〪9 }gYTyFIXf qዩDc߀Fr+ZY8߉ɞ{<|`5|b7A5̃ɳv)O1JMhNŊ:ݟ `m lNkir؈D^Tvƌud%}oē:ݝlaK@nE^>*LIUD%l~7E!2 'GˡMtZ‘:9y&FejmƦYܾx5? \8Nӯwg^)FD~$nW  u=@ϧܓGnu+ܛc?qہJ`P3_˗1.ì+u"ل@rb2>MH$:}\ x{5M6rM>65pYg9GMN]%60yB^XxG_]# owgGbd%IF "[,aڄ1 D/bS?Dؼ? ^#/䅫Y6" O :9rb&]Y;Bo&ȼƩ̋aAYڻ᝘w黕/^^}$^?_e(GhIIsK`SNy.Ys6,#+uqQnI'% ĂT&^ CRJܖl~x.E4kޗ~eLag u;."eO﹣l"(t$f|-lY!O5A&"s%2,hqtd6

    SjھZi-ByyH׍m%.]\{1Jt55jq^Ъesi¡(6 >ɹ5M#<-ri[Bjp$CY.BY=8C-O3i@˪mmU6pWI^1<7zD8nG~.)' Z;q!`M\ﲲRM>H~YzB(R 2XYŽ~:VԵ^BV&W2-ۀ3`9w {IOg('h8aRA)ҎOgO\Hfm~Q}c/9 Ȗ$nJ`,`I0ʁdzQn) a* 5OŏTm9"c(&y.l҂af_4hmT<ƚǎ"hPd~kF{HAKR  *(txĶD֤F.YV"ݕN$ve)gP]S$j+'ʶ2nQHL-Fތ!K*{^hY6骈dg g(.r-0厹~WU*%Q{_\e ןCE xCUQP]V#~^|ZSa);s}Z.^ۖ]۲-6/豎,`\HL"K ڲ2=8.=M簋8l Stdf[OlM-j#ZtE8V.slEIB)PrM4 R=bb#zO*E`)up),Qfm+7U0Ao)% ~c>"\9˭& 2si6"p'%bM"%=nEwBsoMsMKvcN5 E*/yXoIVuU^ 2JV"SB]+Zႍ=즱'yprud_ {ax' [[QU-mN-ȹZĐZQUIS+4}OR+$LvE)d[]pKzx-0m^VVF9nZZ%5 eđZQEBX"-[8*dEu'iY,{ZLR[9WyӢy.U~,VSRB&U:r,,2@BURPkXJ R0CJ,R<+p&e!1 h;MebqZwYW(|e8QuªZIM+zZrPڀWbWkL ٢J'RH) _ZbYKpJ`&Bj\X="f\iEJ{-#gJ-D*#9!4.CR,a *dEV[`-z(aV`]WhuJJ;7D! 3.BH!*x)Z* &XYG!T%OӤPU#XOm[Vh !S[Nm35er}3MCgbqHKj$OCϳL="HT|bV66^SQXg[27OuEk`nQ[ 7\ΤD WL|Ԣ,Dg!610Ʊr{}[i'oT8g\! 4*0#Yb% %;vja^R*DN]`AJq Z}:!L:9նoT:9t_!jԷug'6r&F V$H"wm+̢%cuJVj%TVZK {G0FD8`#3}N }cA>h:rg'ҧ8 8{G%L|`0tAK6L( OF;0̫Bh!FGR-?TrEBT'Z9c5jJJfNL黦>b $8xqDOaUz院a sfԍU嚝`.D U} >Ow!Oe{Tx%ܕ8u&X4% k3qOXEK<~@Cw>a"''X$ϱJ0%e\>:W8ףu x;RwElO}_e/G8a+Cʠ0I Ke%6/i!ۺKn0Fv,KL(QtÙ{TN_9S9`īp^"Շ]2EKV%V{&XI(fH vXKq['0&cio *f"ĊʾOQ!vl_^RC4WR6}C {&J-6\{Q՟©w9NR$OČݗ9ׄ+qwOئ%ڑNdЯL&_ĔK8ZP9"y!{qP2ET6 )@ x*@ax쾂DA'S~ GI_ s `ӇbX*/#*gp#x`{bF_?HK@I9\d4=sJ60$}GRB^"ꕜv ,ss@<;A8͐rA(~{/4SbZEC!|I`Dy&4,<$;qa*R&Ȇ$9ɩ^ kd)oĢJdzpz= 8Ya= !:q0ʆE =v H+(l^DP_x-8RL ͮJ3LÂ'PzϺaUk'YfcD++ (u/13e)[7۞e(rNV}yG ǚHY#u]^8IA)gOnc=K sfvb I%K\DIIȦ9CjAXHn=Yj"*hhV DfTd4L2'gJlR"5IÜIoR*xj¦tmr|u݋@`3'%[xCLX./ %sMhְau7rнHiٜB MH5!liB`5 ASU>dH$| u*XrmSa*g 1qV:'aNהaϠd*a~\59)P_Pg;aƓ'ְ4de9d+JVׂ.Z|B9rDh`k /9p?M%C5)tz98;Ys*J6cWL] 5-;G-afa8"d&J4Tu"!92(w ./jZ?P#Qbre7ANl0Xk[0;RzuѕDD. ġ niGyWd5)4dn QȃE <UQ` YsKxxہy뢥㹝-s0,Cd4,Pyb@p1+ĊLLTI6JV/_.lt+BVEYA}N%ȿS\KWEyy`9,=^dz'HG/iZ$(x}ݯKׯ t]/?H9zǛU+,G%p+?[p2Ί=57Xڤǰ* |; uA7 :B~?_Txp_xE'L6<v ONg[%$o 1{v@߅sWo InLgB2xS*6e78o㔼3Wt!Uљ U!K8E2聋WW Wy˩njO)X00&!j<݉g!6lr-5sKb]e(:%NhERMR%Kw`[qwDL$MaElU!}ngV.zNȋWݳ|,?@U_o-込eeRł" D1a,H5#р ?$ƺCssA6=.w/% qO1楅(`%RVvA#x&Pf]@1J$U,碯dљ! fD9tfo0 )ˑW38wg')qr3L_x0&M_$ ?I%=;fp8HIg'^J3{h@0ThPV'3WPBrF3":u0{8}rjhHXH-6:)Sr*i:zsr2KMۆ=\I0an0G}lON9 l 8`>ɯu+/߱J{ ^%Es"cE~ 8˱|x ᒵY)G8|rܑic]1slfRA2*@ :i F.wDi uQ 0R{` iYuv ^ݛIG*'r9 2݊E"~B0XR KQv$5H'"g qъʏS~ =tFdr_8-[//5ek@95Zŧ֩ljt6g.RXP# }cI/ߒR-mg>`8n8WJكcEJ6ub@ԕ7r<_i]\u7>"L)i<ΖC<0.I6_Z0f,9JkZ˰A"u3N*rҚ3 dhcX˦jƮ+!Ex0Ͷnqq"}ֵU%ڪ뮩 .zHz_Ih>֊szZWMYrv{YnۼĶFr J@ǓpQC_Ugg1j@61_f!FWzz^"~wG;ȡ˽x 9ЁRrp\%UӷH2o$$Ey09Ve𮦡-9^=Goy΋hItCM!G{!sCR Y&[2K^wBz =uK&}cra y;#ps=A*CX G \I\HPJ%\j`󆢜S9[ g֔zr5 9Y RJCƙVR/!DNC葝r%adI"4 i'-V,AHF8DhIp"B(FЖӖ22zY"\ %MZOYlN+kCfֶĶX(.&dQs\i]<N+ Q.Й#Y5ь9͢'$cn|ʢJ91sHY"S#, S0 LƵ-LF*M~fSIq6SG2ɹP`[JZny9'ޅ(阩e8۹rC7"=~M Ʉ5qj(uݐbB 4uU$xZ~E4upOsS\u!Y2 v$xT5=-#JЁ8@D7a>}֕ftjL븠uu{}}aE7M_}EEE-P$)2$gT$/PHgx#zޮNU<4hdLu'׎H_ouFVyzyy~||Ӷ|l3u]grTh τy]˶ht]1K9o+ao1=QuyW{i_74DJFW0*(H}&R^.ەڻ; 'Ap 0ut% y=u@e\I!K n@]@LP4@C$"$J0!!ێD/OǗuX s/ NhVmBq2PB;*O7n%P3SlG@W7<-~Q+{ *f9'@V[ =417 \p_ǝ@K@#<4'fE$Luqu@A קg-"FwclD"~|~~ĽO#Qm#v_p3.=^n4+1A3yK>?L__?^ޟ-Hý^i x}=HED +0Lq'#M $D/4u!ľNH'q__?_zYXk 5~[ןo?|Nq#_q^_io !z{zJlKy$#z>Fޞ^ Ϗ;@{? >ho/$ 02mDo߾~NM&I {@s?oS$O⟿N"P퍆Hh~%h:=0m#$M"y{NT?~7=  e}|#Hd#F.τ߈4>w"n'*&@PFq1a;A` P/6$ ?[jLi'P?? X|>3ѽ$goވAH6?>^cF~}2 #L?~'>eV4""oW I+MF$@FWĢ7xd ވϯ\Ս-zzN߿JL !DHH"74J|IThL{&'|@)kt}z 3?=ĩ V I׿}|{&='!LH۾\o0s7J !0@wbw $,}'F=?>PRr#,>] DL6"8$7HRo#a qF?/ DD|{$ˉLd;D4þ߮oW2Ep$Xka 9A⟄!Iџ$ _LɎyBv/+gC$yIX}#C` x66wn+[qV)pJ$ΤJMm$` tXKd҈ĨeIo/d~ N"H4I; ^ T211B25wW5Wf0HHB?@@60xV_#47O M9sWdnQ-I2F3B# d_!ֱ RMږwy';޼ړ^$ͦ!0'ӟ\S,j,jɁ5ޚa=g1td H{.+ńA~[8֦}!>y^ˈ$%{h;,x3YY`U5A_]sKs [[`h0/GqW!$s y( czGf:^;/`]QBb"Aԝ#o}Po~!=x H 5v$ $`ǂH"w S䬓EٓL`#j } ,L4!ہ}cx}I(!B&QE!'OdIjz@lm"ѴGT7#م@YCҽ"1N W+1'lHǁq"au'C8WZ0 +&(#0__7XA#722IFL e2oI =HЯxu }'IqK;oߞ nWxS B'haš`#Y ÍELV+W 2<BwAo7x7#ꅌ|IO2H%vA?¹w/pW #ܷN&v% ;A7d3B>i (8 ?wQKBIդOɡ'>d/#"n0EL夔^a%?.O#OVd>MDmQdodOѵoO>~?OTizolfQ2J@%KF Qɍ;w(@Njt;Yƿ}#ߕ(7?_}y'<믿O?~ӷo㟄V+y/ cFxs~&m^},od<}_?篿~A$7'?G׿oi"_篿}$?ٜ?~xiϟ$b?~38x2!_oD"h_n+o8 z{2'Q و?T>h@??wOW2U۷?p,$'I`Nd1CF] I@O8Oo vr>Zɷ%{\eN;)vџ!=@օ`O%OAXoOl=ӨȐa-I}&/d?HfxBuz{cqჄmwHTӝ*"W$$D'$G܎'r~@anf'=>?Ni&Eyn䮓F߬$!'r8^?H J'F{1W{%'6G}ɶ_`y&;~ם "gxIB%케`q[C $3$#]&ơ +ݞviAJ_\$yDn7Vo8XYXN6L҆󩬲6)9s䢯_.{K.gDn~8:9eCfvduBs #[SHu'wEru|&8@]@+ sAlЂ)j͜+ViRC]J< >U9׉#jn-Lv`rL5شm=_ho@J))\k,#AI?,&#>^WQC(05\PmFH3noC>'!&[U-ds"ϐ$0KENEMa<#fGY])|}I˥p_.NNyIlBBJw\p Lr萏[S5M8D6!?f|D(b0z>&v(W"Drhk!gs~QRx5Z E2lQaՙdZ EVgNNhڧ_NDc0}_ _}@u.,^hLP` ɚb[ #=(zG$d7U]rI'DBO7V S!/(ٴ:8R0| u3!ӍO/Xm|yBChۢ B_ Bw@`y"yox~GU@W`6䭡B6Y=Ǚ<8jn /;a^h en8Xx.H i#]Ӓ7{2*<Ȯ0lG*T[\?~$7x}ޟCrI^ȉB7^S&)gD`M}uDjt"Ȑ~ݗ*I+kcRRɋˢd,tyGī$| TWBGnzq!@YBOO>/}1 cTBNHB 9);&u1U %g<mXi5ƙMNDA' ;),۶*]1>>?SrgTiJt%> Hɗ\tVNY1v`}3Q9C:g ~&n,v$[99o$ؼzרN{# 42qdRP'*x8%#\tlGP4 9]iM@c1;{Vo`wIF@ -}$\qF4,m HA[2dc<9g@Á?s}G~QrUn[9 Ȝq?cx2P>(ڑl 7-;҄6Đ=qE]fwȪ^nm̤)"Kgƞ364i=8d9Cc7Ba)_A~Pul ry{ 딊sٱ+@ DMY *\Y!ͼxNƻ eL/ $}" C eE`!/9" * !'țZDIKSd@$+ӀU(D&!*1a3uĊG$T)/]dp0v(z*Ve">^cO"RP6T;B$&a{yY7X^ ̰}ooϤ8GQK18cpqTVGn'+>FFH!)^AhU'-6Jfpm}_E4rfj6AakYKpxtCq~pK!5oC*Hf4dwHK\\z$\^D*K'Z{xCI!-|3}a/UKv=odǛJ&DyrCsbP8!n}3v!yp$aq{m)9FdzEb0cMj<>9rBUf4%fƨFFL9Yrh"\܈[ȳ؆A"x xLkm4"]}u*)c|$;$җWp/$kv2 B~ڽ"  jWLlL !ENX%,=n|7B HOMHy~}"`VuH"=z$fLPrD= 2r:>AyMh J4Y#l-s.<ƴ @CXHdd,CP ~v:]\a\zz^psf,2%݀rNJGno"ۖ4h- k$Hatl3c!ưl؈@HrqV,i~D"28nDv'D!,iR;8c/7{&A'+~!pWl$ a>X r+gܻuld&`"@6agNo0@ d&t#J b7OO.!~XBsq65HWO6<T%4r};-vk;84Ţ˲C=nض͝ՇVNPDZdiI:|m4qMilIPɴ==yMJ /xqrqB IJ B=iN^&GF;xF&U=[V!Z$!HT4Hbd 2Y%ꡆxG S [J~3.Qғ??҅ĔH=_áV&q飩.5wi!.㡢'>ZW'#y  AOZ6U\v;\;4\0h~a4]-6UaK.O3ӓ ]pW=`JHcS_v`L/=1HFe9ob2x2`A 66` u1G9 ;|o62P}KٍlOIn@lC]h_x < 1r$6Z#M>r" R~z$J8tey3,yC!tXD3N$@8cGO-`UcÔAM9/k!8o;FrȄ3Ď{x!9 " s,+e"Ix3 )l-dN-iëR5 ($@09Hl{XSsȮXu i0yA2ã8̻&ɀr`>^4,hϊnJY 0+'F쇐m: r UĀ>!͙,:g18a#Ysc+ TzVc%iL8{=!g>!W#TaQ희_$u<cR[Y  eH*H?"VkR!H~i;+A Xb {bTHjPl'a k+ hvd~/-=V-duNY.؃G)1dn#NAhQzCzu]H-%Iwb&Q"|7!a%2GZbEPz# dwe7,dÖIrq.:8 i{$C_ bXyDpI9IjJ7ȗGr0 ud[\ p`d;<nmDx Dl kōzⶰi8` dol-l_YhAa'@le0'N^+i;"]d##]g]`5x$`2=BYWc4 da/4}vB@/6޹ TLYLݰ6$ 씥#IHo Ю0 YH'{wi`w$cْPs=B#S|=3-mǚ9#~RW#3xОiaa1QV9"gȏ T00?|^;[8D/(=EG)bۃ``p=uB bxUɆ`=Mڏt߸24fdqe,EX%edsj-V3oy[om_D%f+VuP/>#H{8nn|$^53Ge6Xax@Qfz;R @ Kc#!;="4Pv{,Ap@6T<2X>CG<23U:2 X;zf+Y#c(3E=@#yA{KF$}z pFoj) ve0o;fM4Vl 'ZX̰i~談2nQg7 w4/n(%3dS$G5>3 -is3lAU5 m ) Z@MpGg"w헥o7B=P; ';H@ȥNgWĈI< uQ'Ew`+ҭvZ#HDSJ+zD/VNyCqmP"҈yCs/eCJc%F]a,(ׄl+8l`2ϲ|]6e_X/`K̺ &oq'+6X țwo"s]l@<0E^New A@ij@a%m/:2L^,`( ',ti #!7k'^ ׄHc'v; "v L7o"}p7_',M6paA F* L GcOP&E Fًqlna`w(c,P:h"u#^VT&*}ñp/;o耯ql . ym\ K[sxK76PW0lsO&V{ UP.$gF k,#YRp{b7,!ϴG17ؖNH3ACӼ[GiXRo]>>]vv[Էχe>'̈a6=j.gq߁WY@sO/"hSHf=!{82qT{PjRkYJoOc̲,A,0h 5jZֈUSUU]+sܷؗH`}'}NR@!A_Hff N2"2[ yDa*[P3Ÿ}wnZc.FJwq;/M~[s?TXܫ%%aZs:5VL˳\aBŭYCM(4kH}g ,M?5ursGZD͔߮] qv30-rU׃J13@c>u?0A;G0!GYw|Y'=Ir;L yERPgq<Ӂ Йzr]gaŽfS]С: \nG8I "( mީjUv}nҊ(Pz5+K2 L+DxU5-,CN}$D7.l[8Vuʽtzxrx$oGVq(mB},#Ew< kLZe9mҡ OS?䉊qi%s2(c4kȵ|t K+H4D$#A)G::q3i3BIFY @h#}=}wZ4`4qf#䇝DB@9ΞtaBb$\oٸVD[3q Kqd2v )Z㡖:$Oe¯s(xwfy@RVwHYwoIs9mM$uywt72x 4ȢY>֌/ {i\OS_s-7:n<G< `o/I!:u:ώ=m~<=Ϫd -;(9`,M*)G;d8]**h$2KIMڨmZbC3ͮF'Pt s9wdù\F˜#8=<'GM٦5(&M)睻<_u ;x>$; B{M`y'hW'<=/ Suf週|#=Ndvtf6w Y9DD6#רI:FmkDgP>dԣ3䪄Hɕ=Xx0 flWA.td:FќY+B{a\.()scخIjes BwY42s)Ա-O)]J6$zLw)3CZO[9ؑ4I37y⑶ hJ"͕Nxwʏ4Zl3 !f]#|*:PYF2 #'m5+E(E\l!yu#u:+ͦOH;恱&'=oHH41uA3#y46u/~['>::1:MLLMOMLS3Ssbjl-#SSrGSFFpI~uL" AQ4sFyA%6> h :ht OsXkB3fG&٩I4ajbjvfvznGӳ`fonssss|kv~O>39p4\[MAəxùi4fvL=sBaf~8?[Oӳ3\3[-̡e\qvf ϰ'&qS ^#8#ccÀjtJ4<:CYC8vY҃}T7:ohxwx@&}}Cl ^|/Fx8Trbl8<X :aJ3>Cs 8.TY&g'GpY\9 Q'd>AM# J4k0P!ISGxt$9#<"l~=80xfNA!5i3S{GPIt,ZNvS'ɝI 5z!І&MSTIMBLh$ 0>6LYxN$ L>q2zb"Lh 7>Oat,7qs0wFih@{RNPM(P}4"LC,A$#)Z;IM&R A>-' L!q~ZW=&8.]c4)aB6(Lz4Fs5/Ǧh`֠cMpÚ~0)j'!"MжY %nl72J mg`O/ u;^'Ʃd#A\xrz()6!hӈ&mx0P临xlz1>BP'4;D-ᑓSbƨ32>6]%9#Ku# L΄v) cPqh(:eBS9ЈR{K3 ˘1?&x&?+1 .pb_ VAk;*)Ee˸34hḆ)1"45I89J-qA 5/JHkS5M (9& *p݁0x!1:D#$cR sRƼ?íxPNjh#0#CCu#2:0a]:JjHq"@Q$ m!,cÐxzl&S0֕Hr_^a ;ON*1?i`V{YoVw@P8a*urddrptp&NWF而[bǓDQ L 3"qԚ(qd laƥT zlFN>X183P?9h~p8J&RYg9LN O JƔǡhJy:H мHG'ijSST04K-͉`um2J&i#t@E{qb/ dqzFM487[ jfo; s@)WqZrMS 3ӡmNͲ9j6T* s38O5f/IZs97rPI18sfT#x0G,5bj`i3?z'^MSܶ0[,-,x;M&ѾE4gzinqfjiz|gsh*uDor Pl0%J 29LF{8Aah> ;w$pW-L9J(\)mf: '~EZ/09[ Cc}}cÓ'y19)tF'ƭq`9-d[QLk є I#5it J59/L9%ysF|6-8l=8AR$ j~@JvXt<4@6aMܬkzf6pnj^qi] Wba7V!&1AauG9_CaQB#yn=,cI8Ld4̕a0?2io>= A82ILpeyrIЀ?PiI, K郎8zᇚ M1h.r,џlsK5Ln1.gZ$'`r||5;t:sQqMa抜7u`qь cpEF#[\p20A6)+kI]0- fLU/MlHC HOsrj3QS2u O{&j,Iij ɾ3XF'OUM.<0#͘VCemǂk)((γfw\tw-_Osf7Okh@'4sqFFe1E{Zi i: U&4t=@rkG$fHhWds„ўTNpAR>,禓7ώFwN7NccI$H<26Qhf1zLs:.S{ N45P',krq4YFh5J-pnHDŧiհE%LtAf(l`? a (*5bc =ѣѐOǕF5. k5&). .AB_4G\ \y=&bX md CLGނҜ jpT9*lf1.Z"@ LPɿ׍p{.csrEպn8,x<3 =6:BИ49 1jИf_f^f kaaF8:L|å>3c@oez{1`#Qh2d8V9ՊUJ<>E9uLh8i5 \6"Sޱ) a29f$a@ $a(*p81M0̎\г.j٬3)7IF4v U'a*sPݩآEP5N詆qD<3LXx.0ՌG.g&Y.p^T LL2.Err:v'8[ kZY 5ƴoɣHfOj>Saz"+=i7k"S\,yI GR>fNˍM)L~|*o/"\H70]DUBqqU^ssxwX䔔0q}MVKs Lh(`br.&j4[SȘQCzrSy33 d|NSK/ ~SzzGN11ї5-9/0\%frHef,g yt$57eL-wX=т*&cĤH0>?Du0~ UjWB&dc*f9x3ǐО|>)1sx1j@x&ƇFk|*?YW1 Q"lDBѥt-] aLӞ1qĨZ%K##r|62 jѭ!=g:,vvL 32^&b>YtG{w_GThރ]V (ܺ,ÄLdBuvCб]:Ç]; @qHFeLEټ3a^[SfIH;ڄ9,W2CcPsyWPlogBVv(,w~"U"sYFĐp#(pA2*3t)1=9v ]iv 1im-`60+з[vQe9F3~:[O1ff @dhUa|YLݶC'E1a5CS#޷K5p7+lho뒮Tt\(d&t\`ߴ3u 0ݲca+sQ#I8hbLmV3Vy&-! L=;lXsjg.&rh`BNn2x#V1 P ۜgTSU2SY./]eIv wC/zQ[m(c&a;eӌOwSV6oXEw&B㸫qy'im֖)=<W-)K3pXC m7zw<2#l!ܟZϽB;f p)9Q+Ʉs 6zŭ:ۃێ聎#n8nLHG3BvnbHhJM#t7r{I6-?(`0;^{{F񑤉{IXm9Hw*Qwfdu+&c:IaM< q;FP;:xV:ژ=~+S<νqцNasIoAm VBT]aKG2+1v'#0N.7utNnRLSqN7ius pʹ7&W ze6cO#ÛuCسKЋG X]bX+ts[ >!. TxƮ|WsL=ӝ9%R~9۳ dLrsPGg>נץ} B(Kr,IA,Ͻ]>^M?N?hWO]06wk^1ۑ >#3rpy('F;;Ou-档'![˹܅pqF?7g00ui놶Ѕ瀚d=3}7kFlmcgkęE[j]S'R2nRF(n ᆃ!t`p=FN6 wb`h̃S *f)LehTϼ3fB7oCf0=}9㌛6zؑSCW$3o1;7HzLZg.Mj6ʙIVDFGɆt9?&, S( $OW&&,\ڜ u1cx Xgr0 st &2)f77CZGQ̉ 3>vZ KOz8cK)\'~C 0\9_sP. 1ibt97pf6=3%x\hpestY>6A]Ýd©JitFrͶp| UG=LwX}ٮ\T듅̢ú 6gЈ u| Jxa~r.SrtEf&i4G!' ȡs 7+A Pd:)Ԓb`wZ'o/heNkF10P|WuneseJx&0TQ!h/fd{MlJop_*D_?7Ps"ehhpe6K?LB<4Yy+ \ -qkBne`(vi :Xd{Q.8pa\uKtn_L"zrzybQ>f{PA 0bPnMj+٤''9e>:9` _^fBFg8j/Ma=~ԁI}ESod0wffxڃX_FvV8W_|]ڥu<:LiqWe=dQ0Vٰ鮩!~80>.^%LjsV.&aT}eD뀃L L4;0=َnz$f揓tMQ-| nڕM39Pvuvr ;Q/qA5q 3W,K݁,w2A`o"ď.~`Xd>neϓQ^?w`.|F^h1b~A?ȚKʦe5/|# ḇz9fc)ҤuW6? 8J T8 :#uZІ-Yge2a)&3h MჴS3hpROƵڕe>Fd}c#N]%@2@ŀt+Z_Aodl Y-ЙUǦݒl#RtFjq ժWOsc}ʚ4wkxv~r3V_7ya H?dgC0=d[n / R60'RARf4r>'C %c0`fTA!tvxN.OkNtеeY9xNFНq\Ta?_g[qL8ioɥ!kV \@[9q ΔJ;3mYsPiwW[g۲<# xo1q:yGtrۃ<+c;xN3m-:Mzfq zvWM<饭Mw93Y=4~:ڙj%w2-`T}ϙ< ّ짺kkmo[;Y+̪ޛ3̐AP|.k3qO7з+߲vq[:<.p, y( j,lz\# Mdu4WJ@ 1XL8#1OA.鴖VBF0u bйv<A=xm]]}y} =>1]l FaPq!&ƦFJ2a| )ȑ{FΡщ88~CkEGsycLL*fxD!znOb,c! ƠQ? C}AĐ"6{Jd&G7a ƈ C4G'Ɉm땱 ;̨8m.ʡAns;h4ㅩyڜՋy&F{jEic%t8P8|~ܝc@ʵelr p :͸`dLfs3o qꬶKL(LN 4`& @L+pr[lCs3+FF1 )nc,AFCcjx5:>D:Qt'7w@Dбay hhŭt# =;Ss ͟T a"c93;7?1М35U*L(sNi%0K7ɝ le0zvgbfmV1Yiz$l c8ɝ!]àv[2t lmniǎR:͊N)2qDq2ܦ:8 cFrcq4.P!xBF`B[# M"5ƦilOQ J3P1/j9FT8D* UO*hJG¥.0 0m8l`a a;&&.yniv;19-u0Pތj#1Uh{Z]bcZ7їVVb[8o*&|fmC `(q # FF!fbDᠰɌHbcxB~P{F&Fee`C P|0Db3 0 B5EpR*Mmc(F~hdk94c$0&èkٸQ1KLk(]`'ft;7FfW *e,4 qp)Vh T\1ɐEڴ!!&0(U/pXI qC؈ԓq؊ *W^Ƶ+ZcmMV#<(:3jSdpI&|l:Mp);*rw(wC6aSe vdؕOϗv)OsEYS01V T0rvqe0BkCg<`h[^s*C%x%qŴ˧xwX$㰂h\obBxZIwooK x<Џ]xX .a|T0wE48ƈR;?37?Cty_?{p DnmH @љ+@]x͍K3(v ?8=)c[[X,A._Z\(/,;2ڶ+++eT-/WLu ",hj%^*/-W:dZ)T* xFNy'nK2^[c767!P]ms2rEun$XXsbqqA{gg |qRЮ%`d EKKe2E*SJ]dVWK\aK| 20%di |nWZ^f=eGaK%jEGCӨ}8WX^XZX/t\(, slBy]P[@ٵjBA٥h2 E|X+WַK˛kFCAp4 Gס4eveecm olmmmk&^!)>+l-\Pj$*bTX˛Kkۏ7vll<~*PL Z@qedu$@ss>Zn03[XNP 5h,;;];0p;;P׭-V\,ʕB  >UJ:\B, K2SlRRy+ex.eLM*/lX2&1rEf _y9\rTbe$Z`R)A@~p 1E U v$фꮕ1d\ZXW` %ఴ0;>] +iXۂu/Rt m^[n0`k0 aiTX(AD>Z#IB08HOV/ˋzh ʮ)4M0-&Ђ^XDt #(>`V-?t) C?Whӗ ":Ėb - LӲt R 6Ņ"oƎn _"AwPaE`ЈTkt !au-LJ K0L>*c&TRm_y/  [q,dU`eiʅYXͅyUܟ ŘU,C$Y]]^/,,Pvhi GE27 ah 4\ a <| W'%K7 y @s3lF{_-^u"wØOk[fQ#b_ZFo,%BUJ(4girqy^XX,"/. }4_o*rj qߋE @ RP +HGTP[]etW4〇.-5`5 ^*} rCaS`e`:H=[DcTdm|Y^$" Z^qR&@tIfV ׀d,"-](`//i¸B>ș*sZ/HQCr-be#0f\qДRȱ_hfH 0-1ifё3yG/ym9+`7׶5n=h7U::ƚitTWa;F(кJ|SߣLhA:2c >Uh, 5PX`t&7|٧ٓO>>)./>ygOy dC<ރ߂.6qۻݷ{?Fo[{<Z8<vɏZv 5\m~(*.h J---a5pZ77m>dmЙ}ĿLH pmI"H:LwY}ukh! G? &\ء-uC]=yx~O=O=CGMH.\/-%0FځkQ^آۘPXر͝ z2v7ǣ[N6}آh e``7H)G (=c.lmMC5ȳYlӢ٧w`K0,811dze1X ˆ,"Jim@Lvk~JHZWvAl[Qy8GXfU| gP2bT"Ua^^-_ou5t r` Wyq r\Y69dw2NNiCN fs~$Nח>UCX`-Be0$EGeU?we܋x32=MZ+0\N[dMHNu4`k\ϺFݠ+̦gΙqhmڷt} ՞5DغG’İ\"/W8[+U`@`́,.ִBp .Q`9!PU~ bκ!mݽRY\L2iS2 =0h*4벫%tF+qAA!~Y-\Z* 2p-+yK.T+FOv7Zr][ưN|iB 2\L c gO˛1!,z,sv K`IUutriEvc8 [/Hvָʅ2{T4Kנ6i\ s/2J׬>o?֢Lu DC7х`U+`M 9@Wjj:GF-\wrAбGִnY X2#[^XW`ظEز :Ŗ8qZ+YX--l6w!WhRbMy$l Z 7`(1Ly͵ҵ\݀5`ޟ=ޣ㺽Tdi.a ڿfёduaTqoZ@ lw fmowT xKFy MM`[0*Fquat[Z~QHa7&zeYhQw͆;<~ 㷶o &<-xp3v9ϲhsSNVWaV8Y_+/4ͩ0AѴt;s 5zM4ߴz"p6DI޳q%)sijA N"-M :4%sK.}hjυ0+:HŖm5=GK0iaW%MasVGp !v?Aj=*>CFp zwJA[lu o hhHnv5-jrc>^VB8Cנ[и0p' 6M7F6 jn]ɹ.MKt@6ljV(C!;eL"bvO~&Ʃl0}nZ٣| ]K{f;Ch pNԷ <ֆ>yo8Nwݥ{Me]e8Cbyv XE;bzڥtzu2 jxⅉ4vX=yH}a%XYҊww˸múVg\^pms2'0Z.W\ Nh44L1-( Kp1 c{x֔6dhHl|rm1zvhmMp.,½XFUCa1 h@NߩzĎ\]eL,ʴ"y>l).cOa[9.pwav~0X}TbLdE2 :6hꠖohn#Btic_[HUso)lp1[g:e~f+sW[) aEgUZ}ikd+VA82:~? /A'në]p>FPp40+*B="8&0q]|Xҳ.[CbA5z2G|ćp,-OeL88)+p< ?&D|b /4 ~=4K`NP0YtVwVB` rWQb 0C7tY 'Dw^*f+6{R yqyAl |$V^,mb%()\4SuT85ђ + H-Z51z]s% 0pUõJX9+[BE]Yqsj|Pg|eM+cIR|`GY%.2D O9| 2G>-E>Y܅'3P%+B7(aɕ2HWpK\H#6xΏ9+?dgJ\> Әg@m %;0i,ibMSR8t/m0?O=ZZ/A5]( ֣u>4mLg~ 3 'q&go-p`ā נNEJ08oT 52hh[ߨ?~hmii5l*Iŕ͍烛zEGb| 86.3 l60\+mlm(kUjŸK~< Ik5xu'<ۆ_Dws 8Q+@fVht5U1.z3.C+pTԎy`;> TY^XY-.(^)gfۜ@d؁>\JcW0{p ޅViy PN(.r-ys&6vVo<ĽwqǘuB&DO>oѻ{=lPTKzb;:A0˥F>v-0c),—|>?b2i!kvoh/o<Nvұ-CILZj.rܷK-L֩Z|PtN" |5w+Qѳe.grzY# ƫM T lԲ r-+P9tw7`:Z[,8^ +и49k]fo ødC"+\d#$==mÇ|v.&?BPQC4c= s).Q*1Ns48Z=4UzIǺbz>o^<;k]6p+h +9i( ιgȻTźb BèmaU)nG-ZҮ*6Feb-"9X1əfP=.Ta0\2Y=?4! P:\Ze$9gЦU}FH_x>ʑg0_Ϟ=|v[#\X ]>уM>s ƶa|],`Ɯ\X-J Pmx3Vº`g4|̟ݝM-s# \/,qKbP :p?>~5>㜈sr@ @l_ÃPFDp g.rW&UVbi!$7H]^b4hcXFbPHwf3u^'?J\䌜1Wbu$|vB"v6U%'\^#h(Œ7%O53¼z=鲢>ErqGKp[{u ͵)@+JFng.F9-ڶ=1j9R!b|h l(m"ҵ/Mmש̧yc)'u+k8vȹ*ΖׅreVS*8ii%lpX#P4 deUzWc HWM1kUd,@e =kCψ0bO%j̛* ۼPS5%׸B=[: %Ej> gL G|0&y]:Z‡7TEڧE,]Cԧ ó3GR^* + ]Z)-gMY.lc"1"~,HCh[Eq [FN(3!Y K+aIX#\U/+{TW\(1e]UI<}\ij7ET'`e \Y1bШ.FJ zܔmNW UY,12᠚o.3X"r ¢ EfEDAV,|m"`g4*):wd[aV"~ZG|[QaY/e.sE5$ 8+ʊ^1@K1MBSՍ₞$S  WH*iXaω,qy8h!#BAU9V Sa1-10Q+U48* ={x0B2g"!a81ZF*0a+eAZ.b$՟k\/3VkY$pLŊ5:h +tFiYZ^llḔ K%X/̉ Zs#c(nt4Wƴۂ^UzU<[fTFyiMO̗ wʋ\٩r2CQkek+ڭ2"gaЪGt%6aPL.a¶=R .eFC1W%`q \u(*l1BK;t\Apcuʌ]c ҢܻujY{-r{gSD]^;w*n:ӻcx>).s9cn72 wT" ,9P|yQfI4Z1K>nkKeY^,i']{7ym:d昞)0̏(ޤr0iLM1 ;'s; cK /o~ Q2Ƽѝ[hqC4A "y8stqnfhfzܖ1 ,*]Y vٰE ZZdy!7յ5 @qtpen"L1<^rdb*SYt$WH:74Ly¯,)M$3LD3G +(W2&Y\`nbAҏr@./pH)Lc` D+rR@a6g;¸bv b’_,S$O耏)f.1(J/3E-̮y sӰӳl7sg,f?9h~nzb"$28Fܒi|Ymq0>E(4O*fy5DŽD̕4{vN]qnHއ0C̉ixA#73Ќ`%>e݋.5C9tY)1eTڇu-p'U Cƫ"+\SahcQ0GRcfƧl3N>|*`HdԑfL'` 5e8鸘ur+a>+ހΣfdrb&bg XچL!azR0@h PM/R`1DL`hOQkv~F 9nՑn0Ʀ0󬣩)~{n\#49.i5y#1e8.1U4scq>5=IL>yr0s P) {XVAcZ 3lP_thx[lcc0,vSUz64A iQhLC c<7PLnf yefX暣g A<3ltJI Z11C=5;ƕpyP9&~qflgM21ǞtaE>aG f͞] e(|޲_=cIʴt,@K:}cPXq|3:А3JDS3x 2oCY51>E7T{4qP4spÑ1Z`?61$'&6=dzhՆf]Q;Afu PST\i+<\Hnjہy(oYܐhwasA&I*s#F+jd )&ЌlHͣ3,n<6w6yJt8OzVfTS)Iw<y5o0 Ji;$hg~L/̃ż$ ]ҥޜZ~mDǡH}>g?1K.Ng :y?S.Pzy>70ShP {zy x3υV>M`!i&1v1mls< 2a "E`]F $2GWy[yP)᭙EiBՉ%2 ̟P<3\+<]ЏxsF!<ٴrlf OR%BIXZsLӭU hDNߣL::,?dPOzJʹ u%T&sVݹY+U!#Jl,!Ng8ߛ&e:)$9z`cbv'?`U "k {3/R $ee՟bwқe" i7U"O>lDJdƄyiyw;a'P#e?*F,ދM5Ʌ-Kț gK`*-'OigKTfwzr0 $mZ6 yO5ʆD4L"`%(3@c; JUڢKף~sCeҪ;Ft=c]!_-gVt*$z6ʬI"QvFPNdZN,wit Yz|`YTJmVhi)i1YdGcԩ IˤɬPd嘸W1v+a8s JN\琥[4(Oo3AW:a4fmߧ0`laL+٩]z:3)GVs n"yi嬕1=3Q*'LWW <Ȃl'{i+>F!A$4kί1K ?w~A0SsPt?l!S151{tYS\feK% )(gRs!qS tڃVrGG;Qw>`.(Un6VN(U2lJL*Kommimii 54uS󽏛[f|քMa/{(ZX.O B:[[Xl;*a_-zkƍ5^mnݛG lbohbGjkful}>in?QMxIZ=JZKD;Ie4)BzO-B͸o++e+}Miim Z[]gKKހMo6j) k KNoP[DKMht^jmK?_ҥ-b{x$$ABP5-ZpMS+ A)kRKξMR!&lHl+UmvK1&T{(ǂj-UY~/k!j^@*|+ݡIݼPZ.vQ{}1 +}{YǪYM=I{-G?S BSB#?ՁAn`PZzAp1Hdk2e_UN7WM'.D {Aћ-EKS޾M)&)=mg-Vt#kj\-wD`(I 7#$ġ -UM~fZ XS2Izl ,0R䪤9H?B'}.lR=&[* ]YH#ZRTM)FkR&7jLZͪ &4CKI6PVRXZl [iBdDx I0=%K8K40(eZZ={̪om{MNS=bZc gI[{bʵ:~5}UFuVƆ@3)^Ʒ@C1 >ʦѸr?jOZ-ySUc1 [m VI\M ǔ'bi+QUgű0X*?ռ_߽`1.OS4wijlGtv9"YGS[㪾TXf[ 45WGMԯնŶbS ~b_}͓44U{=zo5DTMfMTiPk!D4t oEU.R< :85U]'K(?6io . u5jl۪UCII)l/3^MFp*2YvlhLdY298G@KD䏡j N.G3>[~WJd:&88N}.ǏWD)xj#ղn-˂: $6w bSxΝ;ons?w|vu6ԈWwoկ5 zwm}tC܌g;|;|'|k[ps61>[_ޮ~o޺͆6|'Hv7Cm -C/ݮީڪ;wX,A߾{GmzUK\Qmjq綻|Q[7 m {ۍ.x_lwkc>H Ru>;Um~TU~۷Ы-ݿ>HȂ= }U(}p]E:x'vw>Fs%HXϝWX]wQåU%\:*6Z;y{̖Q~ĝЪ;뽛u'tYmQ/ξ06pZ}ml `ЎPCUaV[olTFFN;wR;UKlu*xUK ŭ6M;?cwugީUխ-_jtpojo6V5[vz}mVx+O8BT?tphն 6",du{޸>EQթ}WF[04a5>ZFfXcF;w2kb-umt_TqjShRn{Q;ƳJF};cZ>;u_}To߸-) 7/UuȨhЫZ)[%{GUEcsͪ84+Z۞;vX]+^k04ۑzĺ\/y~h }[rlh߫UsvΡ%Z޹s[H;T[k/h߽mZ M=f5yUsU[qߛǷ|!#Fo}n`nšT\7kH;U- 4V[ KS5UU/[_|ƪy{״*,A'%Bwow]VtWmTnUo4Vjt]FO*TQU@;WG*,ss]=H*8n9nٷ_hycU?T=xk;Upqڠ}O,侍g-O^~o vND}0_QX"O,PވŢxW4&#~'yLhDpx?h"_1^/#h,ƢGI.W3ڣTMĒ h$ɯEP{ 7}L|۪V6>뮬$ QUm,\HI>J "UJd@sXWBb4)۠$^I>LߑD%7gquj"e1-DWo)6(W4 "dD%Z ",$VKG XrC /IH&RTPJ` 1_[GblUoDCeI=&٥QiF_ F(8S!%u &BD&XCp8ҍ7DhؗEmRHC2h9$n3iIMh>k`Ǥ ?Q"nIA_ɠĨq6#Q ElQ`D%*UwD"`\@*yxTλvjR"!"s>щDCMj"2$e r%}GTx {, WqSiINpH"&%V)i<$HV?4職+QfFH!S46'Z'E#; +'YYth"&t 0 _ɢz\K@9WJ0+K^BVf{">eEꦆj,D ZpM* $ÞFfGf CGxfɾAcކKРaD\K CR2A*|1( 8"ĭTQ2HxN,7n^-\o%)6_Wdony >)$QTsW'L$MTj¥EtK#oҐmSQ T$HF\˪а_mO$")z@&I>N݊:tlZJO-~e.j|X:6$7L,!8n%P-ZCƔ|[Ib ExMcϦ鄾r+z1bF$ɖNEl: :nAlu8/vu2j62k }RռgQ'T3a1u͍ZҜw(H>ɋ(4!#~bɬ7U&ԧQ)=:IU[`kC)*DP-c4Ecl 5@Oh nKТ+.Ne9-R͈TS'p؁)6SeغUK|?zk_su\>ptɳO<~ݗ˿ï~_#8rܱ&_^K~} 4z?[G_ʗ]<~ܻN{?nҾ?Nȱ3S~q7~ʏ^-crw;ᱷC⣇>p̱wpwΜ:=sg=O9/%//v<>N.[.y7~Կ;qSg? ?җ?y?Ɋ}p~#Z |ǯ ֋Ͽ? rhށ7MQjoiߛϿr/܏-no߿O7~~~'ro\.+}s.#?p?s..3K߸/\o]5/į+?̯_s]]~/_گk==}}W~K~.?ϿϿϿϿȟ?#G++++?ğ?'O?ϿϿϿϿ?_̟?3g?Ÿ? /_ʟ?+W_s8xKG.kkkkkkkky_?}[[[[[[[[۾۾۾۾۾۾۾۾;;;;;;;;{{{{{{{{GGGGGGGGǾǾǾǾǾǾǾǾ''/~O>tK.'%zcq_p/\ _p/\ E_t/]E_t/]%_r/\K%_r/\Ke_v/]ˮe_v/]ˮ_qW\+_qW\+U_uW]U_uW]5_s\k5_s\ku_w]u_w] po7\ po7\Mto7]Mto7]gggggggggggggggg?]Kt}եw;.Ct{>tɥ(ro]ZC.-ס^ЬKyhå=UBÖ?l[Ö?l[Ö?l[Ö?l[Ö?l[Ö?l[Ö?l[Ö?l[#?bX#?bX#?bX#?bX#?bX#?bX#?bX#?bX,[-e߲oY,[-e߲oY,[-e߲oY,[-e߲oY?jZ?jZ?jZ?jZ?jZ?jZ?jZ?jZc?fYc?fYc?fYc?fYc?fYc?fYc?fYc?fY-ۖmm߶o[-ۖmm߶o[-ۖmm߶o[-ۖmm߶o[w,;c߱Xw,;c߱Xw,;c߱Xw,;c߱Xw-]kߵZw-]kߵZw-]kߵZw-]kߵZ?n[?n[?n[?n[?n[?n[?n[?n[,{=g߳Y,{=g߳Y,{=g߳Y,{=g߳Y-}o߷[-}o߷[-}o߷[-}o߷[?aOX?aOX?aOX?aOX?aOX?aOX?aOX?aOX,`?X,`?X,`?X,`?X?iOZ?iOZ?iOZ?iOZ?iOZ?iOZ?iOZ?iOZS?eOYS?eOYS?eOYS?eOYS?eOYS?eOYS?eOYS?eOY-ϥإ?vt?}{._~ťÿp.ݏ×]_?C.t?x¥s.^sYqKҸ|߹=6ìKQ.E{.?qi?4[UCϹ4i6iK6i64i6iK6i6k\?mO?K6i6G]?mO?6i6\3?c3?s?c3?c3]3?c3?sȥ?c3?c35.1gȥ?c3?c3.1gsi3?c3s.Y5gY=5gY5gك.Y5gY=5gY5g?k?k~5gY5gQ?k?k4gY5gY?gs?gs\s?gs?wХ?gs?gs\s?gs?W393\s?gs?7393=?gs?g?7y7.y7y?7y7C.y7yqi?oG.y7yui?oK7y7si/ `/ `/ `/ti/ `/ !`/ `/Ը4_0#`/ `/4_0aϥ`/ `/Ϲ4E_4EK_4E_44E_4EK_4E_4k\h/K_4E_4G]h/_4E_4d/Kd/pi/Kd/KAd/Kd/ri/Kd/KRK_2%_2>ri/Kd/KҨK_2%_2\Kd/KK_6e_64e_6eK_6e_64e_6eƥl/l/4e_6eyԥl/l/{.e_6e_yΥb+b+\+b+rХb+b+\+b+R_1W_1W\+b+2_1W_1W=b+b>_5WU_5W.U_5WU_=_5WU_5WC.U_5WU_qijG.U_5WU_uijK_5WU_5Pkfkvfkfk]kfkvȥfkfk5.5_3׌5_ȥfkfk.5_3׌5_sikfks.u_7׍u_?_7׍u_7׍.u_7׍u_?_7׍u_7׍nn_7׍u_7׍Qnn4׍u_7׍u9aoaopioaoAaoaorioaoFK07 07>rioaoƨK07 07\aoK47M4747M47MK47M4747M47Mƥioio47M47Msԥioio{.M47MQ.5KCzQ󟸴~.'5KKzS_<򟸴s֧zU._5_vi=ַ?si+]~ݥ[.5siKg͋.5ּz[ \qi=yۥ=뚓.5g\Zk.\qieK&|I4/jn4?j.͓KҼ?\G5.ͧ.ͫWMƥyVwi4j]wiL4k]5.ϚKfͥZҼuK3sťy]si~]5{eP>5kZ5kZ5kZ5k.Z5kZ5kZ5kZ=5kZ5kZ5kZ5kC.Z5kZ5kZ5kZqiך_kך_kך_kךG.Z5kZ5kZ5kZuiך_kך_kך_kךK5kZ5kZ5kZ5(:3:3:3:;3:3:3:3.:3:3:3:;3:3:3:3_gיu_gיu_gיu_g}3:3:3:3Q_gיu_gיu_gיu_g4:3:3:3:9_oכ_oכ_oכ_opiכ_oכ_oכ_oכA_oכ_oכ_oכ_oriכ_oכ_oכ_oכ}K7z7z7z7?riכ_oכ_oכ_oכK7z7z7z7\_oכ_oכ_oכFi7 `7 `7 `7 `7 `7 `7 `7ti7 `7 `7 `7 !`7 `7 `7 `7Ը4o0o0o0#`7 `7 `7 `74o0o0o0aϥ`7 `7 `7 `7\?bG1#?bG1#K?bG1#?bG1#tiG1#?bG1#C.1#?bG1#?R?bG1#?bG1#4#?bG1#?bGȨK?bG1#?bG1#4#?bG1#?bG3J?jG5Q?jG5piG5Q?jG5у.5Q?jG5Q?zȥ5Q?jG5Q?jGk\Q?jG5Q?jG5#Q?jG5Q?jGuiG5Q?jG5=Q?jG5Q?jG{Υ3c1?f3c1?f4c1?f3c1?fA1?f3c1?f;1?f3c1?f3c5.3c1?f3c1?K?f3c1?f3c4c1?f3c1?f؞K?f3c1?f3c4q?n7q?nq?n7q?n?q?n7q?n7\q?n7q?n7ƥ7q?n7q?n?ri7q?n7Qq?n7q?nsi7q?n7\ ?a'0O ?a'0K?a'0O ?a'0Oti'0O ?a'0OC.0O ?a'0O ?QO ?a'0O ?a'04O ?a'0O ?a'ĨK?a'0O ?a'0O4O ?a'0O ?a'+J?i'4OI?i'4Opi'4OI?i'4OɃ.4OI?i'4OI?yȥ4OI?i'4OI?i'k\I?i'4OI?i'4#OI?i'4OI?i'ui'4OI?i'4O=OI?i'4OI?i'zΥ2SO)?e2SO)?e4SO)?e2SO)?eAO)?e2SO)?e:O)?e2SO)?e2S5.2SO)?e2SO)?K?e2SO)?e2SO4SO)?e2SO)?eԞK?e2SO)?e2Sp4o[-e2o[-ϧa{|EnsK _ ?G.;pVK.}knA~>}۫W|5;~_1^1_yťqyK۹?υ%%_!y/^4_oE㷟I pi~b~'G_͇RzRͻZ].kW?0>?0.??߷/s}qϿoo~},~:-yw]{~> ^un5׌\~7 }<湃K̓eүy5o_j |Oүzv<K>G˾˾~??? !ߟޞ2;#~/wj{w?w?Sl5l sunpy-0.8.3/sunpy/data/test/EVE_He_II_304_averages.csv0000644000175000001440000000750513203275053021533 0ustar nabil00000000000000Date,WATTS / METER^2 2012-06-13T00:00:00Z,0.000461739085343 2012-06-13T00:01:00Z,0.000463001968456 2012-06-13T00:02:00Z,0.000461948632922 2012-06-13T00:03:00Z,0.00046106200413 2012-06-13T00:04:00Z,0.000460679919343 2012-06-13T00:05:00Z,0.000459480240049 2012-06-13T00:06:00Z,0.000460540230658 2012-06-13T00:07:00Z,0.000461451578303 2012-06-13T00:08:00Z,0.000460342809674 2012-06-13T00:09:00Z,0.000461265182821 2012-06-13T00:10:00Z,0.000459595049809 2012-06-13T00:11:00Z,0.000461125838531 2012-06-13T00:12:00Z,0.000459890186903 2012-06-13T00:13:00Z,0.000459513122526 2012-06-13T00:14:00Z,0.000458787093521 2012-06-13T00:15:00Z,0.000458294637307 2012-06-13T00:16:00Z,0.000458704234916 2012-06-13T00:17:00Z,0.000458095431289 2012-06-13T00:18:00Z,0.000457132361286 2012-06-13T00:19:00Z,0.000457501135922 2012-06-13T00:20:00Z,0.000455176108517 2012-06-13T00:21:00Z,0.000456249055181 2012-06-13T00:22:00Z,0.00045823258309 2012-06-13T00:23:00Z,0.000456923652867 2012-06-13T00:24:00Z,0.000455977579501 2012-06-13T00:25:00Z,0.000455785503921 2012-06-13T00:26:00Z,0.000456715123922 2012-06-13T00:27:00Z,0.000457531146822 2012-06-13T00:28:00Z,0.000460953296473 2012-06-13T00:29:00Z,0.000462006564097 2012-06-13T00:30:00Z,0.000460636884479 2012-06-13T00:31:00Z,0.000463057309389 2012-06-13T00:32:00Z,0.00046243427884 2012-06-13T00:33:00Z,0.000463686703976 2012-06-13T00:34:00Z,0.000466087270373 2012-06-13T00:35:00Z,0.000469517719466 2012-06-13T00:36:00Z,0.000466566115695 2012-06-13T00:37:00Z,0.00046284570999 2012-06-13T00:38:00Z,0.000462209786444 2012-06-13T00:39:00Z,0.000462785828859 2012-06-13T00:40:00Z,0.0004614401599 2012-06-13T00:41:00Z,0.000461522174495 2012-06-13T00:42:00Z,0.000460425202618 2012-06-13T00:43:00Z,0.000459083870131 2012-06-13T00:44:00Z,0.000458254110223 2012-06-13T00:45:00Z,0.000458085405019 2012-06-13T00:46:00Z,0.000457775046622 2012-06-13T00:47:00Z,0.00045684898699 2012-06-13T00:48:00Z,0.000457579090532 2012-06-13T00:49:00Z,0.000456516795869 2012-06-13T00:50:00Z,0.000455719860232 2012-06-13T00:51:00Z,0.000456419419303 2012-06-13T00:52:00Z,0.000456883620548 2012-06-13T00:53:00Z,0.000456806616664 2012-06-13T00:54:00Z,0.000456542208364 2012-06-13T00:55:00Z,0.000457028591579 2012-06-13T00:56:00Z,0.000456416082064 2012-06-13T00:57:00Z,0.000454672544341 2012-06-13T00:58:00Z,0.000456141322502 2012-06-13T00:59:00Z,0.000457637909373 2012-06-13T01:00:00Z,0.00045837481836 2012-06-13T01:01:00Z,0.00045690444919 2012-06-13T01:02:00Z,0.000457249378087 2012-06-13T01:03:00Z,0.000457487917932 2012-06-13T01:04:00Z,0.000458879595196 2012-06-13T01:05:00Z,0.000458848080598 2012-06-13T01:06:00Z,0.000458419051332 2012-06-13T01:07:00Z,0.000457844410751 2012-06-13T01:08:00Z,0.00045938838836 2012-06-13T01:09:00Z,0.000460098793459 2012-06-13T01:10:00Z,0.000458813466442 2012-06-13T01:11:00Z,0.000459434760463 2012-06-13T01:12:00Z,0.000457350023983 2012-06-13T01:13:00Z,0.000458293347037 2012-06-13T01:14:00Z,0.000456329265338 2012-06-13T01:15:00Z,0.000456771493191 2012-06-13T01:16:00Z,0.000457674851835 2012-06-13T01:17:00Z,0.000458854187552 2012-06-13T01:18:00Z,0.000458111414143 2012-06-13T01:19:00Z,0.000458261080591 2012-06-13T01:20:00Z,0.000456005630743 2012-06-13T01:21:00Z,0.000454254831614 2012-06-13T01:22:00Z,0.000455170258647 2012-06-13T01:23:00Z,0.000455655759045 2012-06-13T01:24:00Z,0.000455554793007 2012-06-13T01:25:00Z,0.000457425320443 2012-06-13T01:26:00Z,0.000454981956864 2012-06-13T01:27:00Z,0.000455379432727 2012-06-13T01:28:00Z,0.000455948102172 2012-06-13T01:29:00Z,0.000456139915817 2012-06-13T01:30:00Z,0.000456539724837 2012-06-13T01:31:00Z,0.00045609321387 2012-06-13T01:32:00Z,0.00045643641109 2012-06-13T01:33:00Z,0.000456602545455 2012-06-13T01:34:00Z,0.000455891291494 2012-06-13T01:35:00Z,0.000456431109342 2012-06-13T01:36:00Z,0.000454785035496 2012-06-13T01:37:00Z,0.000454413495997 2012-06-13T01:38:00Z,0.000455482115891 2012-06-13T01:39:00Z,0.000454260666932 sunpy-0.8.3/sunpy/data/test/EVE_L0CS_DIODES_1m_truncated.txt0000644000175000017500000001007713231613137023605 0ustar nabilnabil00000000000000; DATA_list: 20160610_EVE_L0CS_DIODES_1m.txt ; Created: Fri Jun 10 15:58:11 2016 UTC ; Origin: SDO/EVE Science Processing and Operations Center, LASP/CU ; Units: W/m^2 for irradiance, dark is counts/(0.25s sample), quadrants are unitless, solar lat & lon are deg ; Source: SDO-EVE ESP and MEGS-P instruments, http://lasp.colorado.edu/eve ; Product: Level 0CS, 1-minute averaged SDO-EVE Solar Indices from broadband photometers ; Version: 4.0, code updated 2014-Jan-02 ; Missing data: -1.00e+00 ; Column descriptions: ; HHMM: hour and minute in UT ; XRS-B proxy: a model of the expected XRS-B 0.1-0.8 nm value, calculated using two-component method ; XRS-A proxy: a model of the expected XRS-A value ; SEM proxy: a model of the expected SEM 26-34 nm value ; 0.1-7ESPquad: the total irradiance over the ESP quadrant diode 0.1-7 nm ; 17.1ESP: ESP irradiance measurement near 17.1 nm ; 25.7ESP: ESP irradiance measurement near 25.7 nm ; 30.4ESP: ESP irradiance measurement near 30.4 nm ; 36.6ESP: ESP irradiance measurement near 36.6 nm ; darkESP: ESP dark diode count rates (background) ; 121.6MEGS-P: MEGS-P irradiance measurement at H I Lyman-alpha 121.6 nm ; darkMEGS-P: MEGS-P dark diode count rates (background) ; q0ESP: ESP quadrant 0 fraction (q0ESP to q3ESP add up to 1.0) ; q1ESP: ESP quadrant 1 fraction ; q2ESP: ESP quadrant 2 fraction ; q3ESP: ESP quadrant 3 fraction ; CMLat: Latitude centroid of ESP quad diode irradiance at the sun in degrees ; CMLon: Longitude centroid of ESP quad diode irradiance at the sun in degrees ; x_cool proxy: Cool component for calculating XRS-B proxy ; oldXRSB proxy: XRS-B calculated using the version 2 method ; Format: ; YYYY DOY MO DD ; HHMM XRS-B XRS-A SEM 0.1-7 17.1 25.7 30.4 36.6 dark 121.6 dark q0 q1 q2 q3 CM CM x_cool oldXRSB ; proxy proxy proxy ESPquad ESP ESP ESP ESP ESP MEGS-P MEGS-P ESP ESP ESP ESP Lat Lon proxy proxy ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ;END_OF_HEADER 2016 162 06 10 0000 2.18e-07 1.84e-10 4.98e-04 3.16e-04 4.82e-04 2.64e-04 5.83e-04 6.68e-04 4.97e+01 -1.00e+00 4.03e+01 3.26e-01 2.15e-01 2.64e-01 1.96e-01 -11.3 -27.0 5.89e+02 1.01e-07 0001 2.31e-07 2.00e-10 4.98e-04 3.14e-04 4.82e-04 2.64e-04 5.83e-04 5.84e-04 4.97e+01 -1.00e+00 4.03e+01 3.23e-01 2.15e-01 2.65e-01 1.96e-01 -11.1 -25.6 5.89e+02 1.05e-07 0002 2.37e-07 2.07e-10 4.98e-04 3.14e-04 4.82e-04 2.64e-04 5.83e-04 5.05e-04 4.98e+01 -1.00e+00 4.03e+01 3.22e-01 2.18e-01 2.64e-01 1.96e-01 -10.9 -26.6 5.89e+02 1.07e-07 0003 2.27e-07 1.96e-10 4.98e-04 3.13e-04 4.82e-04 2.64e-04 5.83e-04 4.32e-04 4.98e+01 -1.00e+00 4.03e+01 3.23e-01 2.16e-01 2.67e-01 1.94e-01 -11.3 -26.2 5.89e+02 1.04e-07 0004 2.27e-07 1.96e-10 4.98e-04 3.13e-04 4.82e-04 2.65e-04 5.83e-04 3.64e-04 4.98e+01 -1.00e+00 4.03e+01 3.20e-01 2.14e-01 2.68e-01 1.97e-01 -11.3 -23.4 5.89e+02 1.04e-07 0005 2.21e-07 1.89e-10 4.99e-04 3.11e-04 4.82e-04 2.65e-04 5.84e-04 3.02e-04 4.98e+01 -1.00e+00 4.03e+01 3.20e-01 2.17e-01 2.64e-01 1.99e-01 -10.6 -24.8 5.89e+02 1.02e-07 0006 2.22e-07 1.90e-10 5.00e-04 3.09e-04 4.82e-04 2.65e-04 5.84e-04 2.45e-04 4.98e+01 -1.00e+00 4.03e+01 3.23e-01 2.15e-01 2.67e-01 1.96e-01 -11.3 -25.0 5.89e+02 1.02e-07 0007 2.40e-07 2.11e-10 4.99e-04 3.14e-04 4.82e-04 2.65e-04 5.84e-04 1.93e-04 4.98e+01 -1.00e+00 4.03e+01 3.18e-01 2.14e-01 2.70e-01 1.98e-01 -11.2 -22.1 5.89e+02 1.08e-07 0008 2.37e-07 2.08e-10 4.99e-04 3.16e-04 4.82e-04 2.65e-04 5.83e-04 1.45e-04 4.98e+01 -1.00e+00 4.03e+01 3.19e-01 2.14e-01 2.68e-01 2.00e-01 -10.9 -22.4 5.89e+02 1.07e-07 0009 2.38e-07 2.09e-10 4.99e-04 3.15e-04 4.82e-04 2.65e-04 5.83e-04 1.02e-04 4.98e+01 -1.00e+00 4.03e+01 3.20e-01 2.14e-01 2.67e-01 1.99e-01 -10.9 -23.0 5.89e+02 1.07e-07 sunpy-0.8.3/sunpy/data/test/FGMG4_20110214_030443.7.fits0000644000175000001440000023540013203275053020563 0ustar nabil00000000000000SIMPLE = T / created Mon Feb 21 05:32:02 2011 BITPIX = 16 NAXIS = 2 NAXIS1 = 200 NAXIS2 = 150 EXTEND = T DATE = '2011-02-21T05:32:02.000' /creation date DATE_RF0= '2011-02-21T05:32:02.000' /creation date TELESCOP= 'HINODE' MDP_CLK = 2342415558 FILEORIG= '2011_0221_053019.sci' MDPCTREF= 2342401702 CTREF = 4147181312 CTRATE = 584.000 TIMEERR = 0 EXP0 = 0.204544 OBT_TIME= 2342402304 OBT_END = 2342414670 DATE_OBS= '2011-02-14T03:04:43.785' TIME-OBS= '03:04:43.785' CTIME = 'Mon Feb 14 03:04:43 2011' DATE_END= '2011-02-14T03:05:07.936' TIMESPAN= 24.1515 TIMESYS = 'UTC' INSTRUME= 'SOT/NB' ORIGIN = 'JAXA/ISAS, SIRIUS' DATA_LEV= 0 ORIG_RF0= 'JAXA/ISAS, SIRIUS' VER_RF0 = '1.53' PROG_VER= 979 SEQN_VER= 1177 PARM_VER= 1222 PROG_NO = 8 SUBR_NO = 1 SEQN_NO = 88 MAIN_CNT= 5 MAIN_RPT= 0 MAIN_POS= 1 SUBR_CNT= 1 SUBR_RPT= 1 SUBR_POS= 2 SEQN_CNT= 10 SEQN_RPT= 23 SEQN_POS= 3 OBSTITLE= ' ' TARGET = ' ' SCI_OBJ = ' ' SCI_OBS = 'TBD' OBS_DEC = ' ' JOIN_SB = ' ' OBS_NUM = 0 JOP_ID = 0 NOAA_NUM= 0 OBSERVER= ' ' PLANNER = ' ' TOHBANS = ' ' DATATYPE= 'SCI' FLFLG = 'NON' OBS_MODE= 'QT' SAA = 'OUT' HLZ = 'OUT' OBS_ID = 85 GEN_ID = 4 FRM_ID = 89 WAVEID = 13 OBS_TYPE= 'FG MG4 V/I' MACROID = 7243 XSCALE = 0.160000 YSCALE = 0.160000 FGXOFF = 0 FGYOFF = 0 FGCCDIX0= 640 FGCCDIX1= 3455 FGCCDIY0= 320 FGCCDIY1= 1727 CRPIX1 = 704.500 CRPIX2 = 352.500 SC_ATTX = -8.88348 SC_ATTY = -229.039 CRVAL1 = -8.88348 CRVAL2 = -229.039 CDELT1 = 0.160000 CDELT2 = 0.160000 CUNIT1 = 'arcsec' CUNIT2 = 'arcsec' CTYPE1 = 'Solar-X' CTYPE2 = 'Solar-Y' SAT_ROT = 4.29153E-05 INST_ROT= 0.412000 CROTA1 = 0.412043 CROTA2 = 0.412043 XCEN = -8.88348 YCEN = -229.039 FOVX = 225.280 FOVY = 112.640 TR_MODE = 'TR1' FGBINX = 1 FGBINY = 1 EXPTIME = 0.204800 WAVE = 'TF Na I 5896' DARKFLAG= 0 BITCOMP1= 1 IMGCOMP1= 7 QTABLE1 = 2 BITCOMP2= 4 IMGCOMP2= 7 QTABLE2 = 2 PCK_SN0 = 26044533 PCK_SN1 = 26044554 NUM_PCKS= 17 FGMODE = 'shuttered' FGNINT = 1 ROILOOP = 0 NROILOOP= 0 CTSERVO = 1 CTMESTAT= 36864 CTMEX = 0 CTMEY = 0 CTMODE = 35 T_SPCCD = -36.6570 T_FGCCD = -42.0660 T_CTCCD = 26.6043 T_SPCEB = -3.36264 T_FGCEB = -4.16909 T_CTCEB = -3.71331 MASK = 22 WBFW = 118 WEDGE = 22 NBFW = 118 TF1 = 101 TF2 = 161 TF3 = 124 TF4 = 152 TF5 = 0 TF6 = 104 TF7 = 4 TF8 = 153 SLITENC = 1734 FOCUS = 1992 WBEXP = 250 NBEXP = 199 WAVEOFF = 140 ROISTART= 0 ROISTOP = 1025 DOPVUSED= 759 CAMGAIN = 2 CAMDACA = 8 CAMDACB = 8 CAMPSUM = 2 CAMSSUM = 2 CAMAMP = 0 CAMSCLK = 0 PMUDELAY= 128 BITCVER2= 45092 ACHFVER2= 40962 DCHFVER2= 53249 QTABVER2= 57365 BYTECNTI= 0 PIXCNTI = 0 BITSPPI = 0.00000 BYTECNTQ= 229098 PIXCNTQ = 991232 BITSPPQ = 1.84900 PERCENTD= 100.000 END tg^addeh /@Rcv~}xiV="(5/)yyjdXJPtz|2;22' % *4-+?6+#+;HJGHHHNs5JJcxu]LF+"4FF7*vZD9)2[ixypeqo|9?9;/ /7/"->($..-6?DL\x?UTmsqyrb`I-/FOG>%~}o]k~Q#%>\^\}tp(-,3) (9=2$ %7>ELdt *FX[rpjxzrzR3 5AGD1musgQ6"#*^fZbx{|y #+;6 &8<, *741@Sat{}k[\is  '9O^TjpqvvbA ",/0(|wn]OIG=)*spTUabmsbcsvl}'?B.,3"  &79+!,>J^ho|eB -Ge!-3:J^jY_cdksrh^= iQD8)#& :jzpvlhgTNXc}oa`k{gjie4>0(""-  ,33*'13)#"5?PYdd4;Z{ '2>N[a]OQSPblX@!tJ-,Vs}v}v|}cM62,OH\h\H?>D]UjMGg_e $1)' (960#"#(;CLMWwU@+1Ni|"5CHEM]UrXB847L:I+)RUgsw  *>D5. 0BFG@Gybaddx~'846=B@FWM,}mX>' %Ci|smxvru}xRCWgYWJ1'8KTYuygg !6<7$'0DJJ:9{ "*&l^Q]zeNLQU]nm`[[LI`~&366 +$5=6$'1B0:*ucL25Kcz^>0:9Rnys|aGG\xZUjuZZdnynUORCDa ! %!!%&&!(7  ")-aZV[cdYB* (;\{rZHEZlptoysmp{lIAF87Rin $  +}lu '*)&% ' w]/#/=.  'SqweL?jxRDF62HQVh|}~s !   "'xocV_N7-6:\wNW\tf`J9*KzUA. !#4,.KeogG! ",3=ARdfq'* ',uX3ueJ 3DQcYPNNH>7Y}`YrU#',<431Rvt`P<.* *>?% =;3.(!8EZwUVw lO) e/BPU]vf`nxvv|zs_# $0)) .JinR8& 3ML0&-4. /'&7Dl}vTUc kK4BSRC=7*71' }{fS^jVSkxv|ZU[`WVIHJ2& Eu {UR[UVASvrnygf\IDE>?C1'7_J\nngVHEILYiyx^`PMXPfdkpqplbXM>) }{bNTa} rd6@o ii^ST^wy{roi[MB6.<@Hzgnmstpowwqk]bW^fmsuogT;p`SP;RvrZ&yihv!o {uzvYE57T^]tflf[RQSPJF;,]BDQevwy}g49yt_G;EltJA]tbZLA@A>7@?@A7# vpqjp{g_]]jzvgbH247'-;1Lfv^(~;o[BE@=3( 3MY]fZB9$.>`grxxp\_[;4)*4A`ezR)8m \9*bVT`f_ZS;  +1, vS9,>*12 %8:1 ?ACB8,'(&""79Vn~xip]uy o@37,'4&'=Rsk>+>eyk;9vlhkaOEB3 $yd@M139?9+ )DXVRD)CYr~z`YDWV}d@!".-57>_xhelyvT+9HpnimfgibSLK@0$ whjJ,( !1?D>5*""# (7=DA6;Sd}nU: "Ryo ~~~lN>V|y``nzKLB.!2\h_ru"!*.3:GZjqRB+ _m|Z 6K\\f!lL5)*025- 3` ~gYYwu]QIBDPP@9PypeZ^r$#,7CMQaU?#t i@&(! 0DDQ~ ypg_\]fkb=9*LazmziL:+34'&Wpv "11#sSP7 5;6. lH,')1@v}s}iSE8BZgo  ~ n@ ]viTT{ 1ctZF6.,cU@3.*&(:Yt~*2BADDSI@5#  )|pO% # F83$Z|U- >Xq q6=l ;BQdut`I1cG8-" )G`r23ANNA8CCea7+;yzvh`eedlv{xSNF* (Z,.&'=F@:?GQZbkqknrnY;# pXJE<5563((8Iw>Lfix{}n_aQG8+%'.45:zoV7,# 'KpD  v~{l_XSMI?>Vlnw}oy}sF$ <6OSKNYYUPKGFJOUZeol\J@" qXMAD@0 Gy :LnzsvUIBLVM0;"&xjg704(/"#5o ulfN' sG"3dwg^_bdUdqvwumcemx{[-9b1GMMU_dnx}wnic]J@?B=@LRLF:!qS9%%1v/"[rrs^SK;8=:2!3+#' n^%!"(M zab?yR4$Mwqlgdcehjpz{m`{xohV.Gp(CYlsyx`H,)(./%sU=zONc 8huihK]\A?C,!&71) d.#+&CuhC0 ng<7>M[inhyrrwvxxufH+0| -=?Kc|pI(   vo_?pV[i8w{hrh[eqdO,491 33:88 Q;.1IG:>Oz"  B'9=gktx}{wuI%;m"4>FPdtc< wkgfS;# fD2W>,M}s^ygKdV?--!&7EHH/fF29I7%?U $"&?  +H`piH.b|cS^hney trhdbQCW{:`xnLXn~xnN&~qrypZ<59/8[u3Wp~o{xy}mlZGF1=&&+/96%X1( Iyv uYF$!Ax6hthjxu`G2ges~aD@knxy|tsvvT=,#/)#:MYXUHk864:ew% }nNF@AEA5)*TJr|ghmy_7oQ>M] .)4Aeiqsyky`wVI>0&$ KKW[I.y:!%JWxgnjgjleTF8Qr7SsvhguWqVALT @^^Vuw{zrZBGD16?;QNH[_8 f1"?2  .@`m^ND^n]`dTCYD'&2Kushfe8HVX`ehokY~taS@%+9`  !)..(  )$ ~ka\K+-=???1 #*Ti|irkHFZEnN.01?[si`C)-DM#KXh}qYNOL8)(GLWhonr~wtspiOJD?<CWlyxtyk`eS>D760# xQ(bwg6!#=ESn|xtqF0 dr ,&yqqocQC;fZJ;.'7LPKG6{`bnl  {^<>j@p*D57* skkkd\X[djls{{y||}s|~~viaXG8&dh]rxt_CFLJS>2./),BN[XMG3{r$/-36)$>=(,{H, 6Ss3[ /:C=|mcgtrzueb^`ed][^fcbfhd]X\UY[]leB,! zxrpdL8"#8B>64A>4.*)/&*,3OXgjje^P8" *1?HJO>>BJNH9+m]@$?d 7St)67)ya[VTSTW[WX[`aZQJBBFISm~{kN+ |naP50@=6)!#?8-.=IUehfW_jp{~mV;''5>??JPLLRTVSF-l[K)'?_#Nz*BKVM;=B8,  }ocahoqy|~|ulf[VF?IVdtkJ3y^<1@B;9CF@='$!.Ldxc~kVHC*#4?RWVZhkc^TRK;"yjW5  (9[-T#%"'"8DGOOF@\hprzvupeVF.vgIAPLCMa_Hw\JCEHHC7)&1?HT`ffdR;1&4Hd~tmKC96?JLGV]aivtf`F=.S;0=JH5"&5IfI|  (#'((.8H`p|fL8 vtgMFO@.5-?KLZukUO#rbagj}sT>AUz}~z[`a\Z\[W[``acYLJC;1,*'9:m^M@7.**Dn 8h     (25M[PD- )Q}3?=2,vPq]WSIC>2.8"087<GIATJ/6|hej}yib`aab[XXNFJGDA@:(zyjQ23k #5c!/:GYhowt{R86- !"+?BGJMJ:/6AZ~030QwaLILMFFLLOOKECDB>03-.%$'BQA&}wrlggjda\_e]QRE?3!{}`P2Kz#@P]my,FZ|p{o`F59'/*=ewS6urn^ZQ7@BHOSOHC@;8":"#&     #1G`q~a.z{~smswsljfcajseMDC4nZFFLZlrF:]7r $RmsSCE2)  243685-0%tlqe][Winjm[bTMJFFB6=3-./4G]qmTB0)'   1E]noWTF+ wwqnrulYJ>*hVF:>?Uh^\sR'/8K  ";HB-`E) 0XyqUD<FYcluxpgW5zr~upknpf\M;AI[n}%"gUG3" /3')18:27/ wqz~dM'|nmk{^#>J;=QB'B\ (  9iv^9r`D.'# AmphR1 (>6%/"kSA7'  z~tOE}=JZ\_gu]EB<A>_z@npV@'ymcR=D@CNYf}}{acfYNX\X]WT^R+&!mJ811)$%$  wqtq?8^<E^qxro^]CCqyxq`n|{sh`[YWRUlsR@A.~pidZOD9;C>61+(280u> %Hi $.]}vUGI9Mlwg;( +@KQfx{z}qh`_ZWZ`l}  &064 gK.}|hqxvqoljg`iy|zzwZSE1{Z3(In.1OiztoM=34!C@bNM0$'6>G-7AVsxqwsaXVLFLPDLXj'%j_BsiaQF>CNN@0'vcOB7(([ +8PYl_ZcKB !,?@?NG<@H@6436Ty*>TTYA eJ96UnhowcvysT3nfdbVI:( tdYM7 )CS 0Xu !5A<>P]^tg`E0$/2 ,#!  *4Os2WfW<   n^XOA98<:4& x~vrfXMDAFMVW^nfK5' qiZQ;#.CM_kf\V&Kp/2DWUJUlv{h9  ";b%-:HRY_]W03310#t\K</(#li[K@834867?M[lp]L>3, |nb]XVH9*(>O]iqtrfSHL4Wx&3F_qeWkn4|  %K$/2.(  *7CMJ2saH,lscQF>60.!'08=FWhytrlgo}su{vkmsqgaUF4 {pikjb_arz{psfdccdc_\FHLLIH.,Df"?Qc`ZsuM6 'Gv $.. ~d> yg]UJ>758<@H]|qcSQTP7651( sphceb[Y^m{|rlfbaWOMLR(;Tk 3FJ\lq s; {:bvjL0~q_RTo"6, lN7$!#%%"ztwrg\VQP:Ju=TOL\oq~" o+~}{sw 1DRbtaL5$' 4.%sV@6/$ ugTIK^Kn%=[gOPXS?>\wziH(}ussrq):Jdz{g[ZTJE439IVYUR_SD4~aO>1& !&(' Ct#8?[sqgppP%+9-FhtdM2zxhabWISm!=ewsuwokcQEFB;;?CRi}s_C) n_\`[RH;6* #&)$!%()J5Tg\90-^OHGcsmMqvgakxvokf_muoo{pO8#vruwvx}rg_QW<-%.<?7/8,(3:757:($" Y 2VrQ}nu^OM~F'AD(6^0  ~fSQMRS@=?FR_hkigtdXYXNFD?<;>>;:<1) }idlyh+CmX  ^GeVQT5ruQ''Nwx; "2j`L1'("-*!kYXVea[ZTamuyyi\SIBASQRRNIHLCD?4*p`UQu%=YH  '2VVU`]C y#[ f~>EhDl]UHB=H`pr`Eo^_d{xqia_i]SSUQJE=@;202*}$B]zd01OpV %  @V>"K|BzZy{k[V\aaS<"zdWcz{pbVTUQJFA@9/.20(0&(Ie~|]2 /`%ER=zj6 '3H@GAe9@,~F Qlh#{y|xoT+gVY^rztqi`TD5.-20../0/.3,&$  %Qq|S?2{1_u|f-~L/ >&K)MXm~?rH+ uhK!p]ay  )'zn`K1$$)1 4@bG# |NxM> (56.*4FL`}StqN% %k^ftuskjeS<!3# $=UP,|woX7  +-# 6L_7z(V>x_,kM# 6;:M+-0RGh0@wn*7O5kZXTD=2#   %L`\Q0mO?  1L~c|mt?y*mg+ }G  #! 7GJA3F8>EHLg{]X`uKlkF|yytcI,  $$!$)7FJQbW:PQX={`G1  ?fe8AQj<Z<$  .  9D`p[dKTFVC[\w~zmjZl&/7|bTOVk{|E7RijX4oaUB, "+)#>c!|`D '`-3mR>("+-1'2#/%'>''KheWFNJRFUTnsa_vtn|vzlpZUWMLK`gyaX[vzM$&?F6z\MC91 5><;Ha)'m2 -f}gFLK<,#/! 9"%+60!?'+44.>PYchfcnVUOTedLHabVaSQxhvezsfcaVQKTNet{}niooWMJb}rbFCNXWW`X>C<;6~`M@2(#9M[]gL$ 8\y\7E,)/# !066Q;H>P@?K_>,MTWoslxjvyvx_aWUaYGEbQ9F=_LYgmYUbtoVIAH0FA\\pm^OF<>Mco{l`P\y\=* 3>COQD2(#%.:1rZ;$.BVoyt  V1 :UfS>"! #(NKIaix|tjYlUQW\huqb[qYELabE%B7@$:<JlQf{~tiV<5=BeX='>NFQTY]I.(FNfx\Zpoft}N*'C\{yZD<B?.5$ mYJ=*)/DSd{ ''`,$.APvzcR1  !1@MScyvulp`lmwfzu|yg\RMD78;3=:3'4B5]XhyhdYS^jAQCK:E4;HXexuK717Ryqky``T`[WZ@8Zyrjji]TOG'13/77jUC)(:Tn~.+j=2+5S]ogL(- 19&#7+&E2Dedvwzkpuzg`eNLB634/'*-9$-TdkOg{ttm\H=NLLIHRRCO84Tvw`K?LM[ocZTJ<5AMG/*<KefK78?481'$-74'`=2P_&"{TB;3P]Qb{odc@23%Gc^_lYN:JODYplil|hZbcwypZcfXC?;;>=4+'!;NZ[`}rYMKKKM@<>@@FG=>1'1LflgK_nxgndF1<W[? 0>DXwjY3  nO22O[cx'9gZzxnkejtnqL3<akRFN67G;V^WZPS]SSHj{Z@>=0%/,$&+* &?LeSOTcu{jWLE;/(E<<=511-=>3$':GFUboyr}nQ<:B7+9M_XaWE) &  iQG=972N\w DepX]Tt|ox|sI,?VpolkKCD;#+-:=L[P?=CO7UlyjgiH/"&'!('3H14;ShYGNbT?,),1>GINH6+0;BJNVh}liqdVbwoac^YK#yT;% %,0/bm!,BT]bQDJm|igpS3& -=JXjgegIJ-"& 1+ALH:3=E4ESegqp8  6IF6!"*Q`YUE9EJH@/    3+! -1@Tfz}qvQ^{}dC"~j\@KRPJK]tu    %8b?3*;QT\kmbUZdo_Q3'CNYeqxxg_D" *'2:9>0DDGdvjM:  $'2XygT8"IK')BD9!((   ,8Rls[^cea_enpcfv}zu^:||zyj]af}ykghtTD$%896DWo~hPY[RTI$ <;]ju|zA&( ($67ADRW,.*%?egkY>'1"HQ?CR>1+%), 2SV;-""*3>GMtY#&JfozlkdjjF/u[SX`SRexslvhb<%"+=;.:Vht^fL-G]jvd>@"&4$'4IvO-"'HE;ANR;C'%E59)>TUD879#'$+:I>#  6NH '3W}y]F04QZnf^[IF+~gujp|{ +3& +:6/?Zp]K=*D]qo{'!rXM=    "6ctxP@-A@Qyi^xfIA@@:5<<.LKF]YMT7!#1=Vx^@( )-1L[O  2kziW2AZ^mueF> 3KPM2 /=5 '98/5FQwzcPH Jq!Rt{E{`2  15R` ikf~y_TOLC4/-%3DQ`J5;%#2?L_pM* 7bkkz|j]4  "%  0^|}n\L6$Oxe0&AgtV+%(& ,BbdU43)*:Il9_yR6& mB*-173 ?W OFEB/!$(/EYaI9>*+Nsa8!Wt8+22"B]o{rm`MF0AiqQ$<aydF- }mm}81 9Kd~mqccv~<=LWUJ\LGJ> D_)$iXRL--09>7=>%&Xu@ 5g}[7$  &B_u~zyYUP13vf]: "Kk}fC%zjf{<9 ':OZfxvz!3U`bmW#fA187!&>gx )  pp[VU8"4$%$$1+%C]lF! +9Mjq]VF0" ',-%!7Tp}|pMFPHPB4Wm\%Bf{c9   & ';77IYv{aVW7;/1"bMEPVG<_<* hM;?MD37CN56,Hxtvnjnnjl\TL?(  #0Lux=1 %.4@Wxo^GBNSbY<-`w^D4  ,NI:".>X9  ,+>O}r[LF51`wis}`{0PI:D^fdkszQL;&0xu^TUVes]?!'8WrP4!"2BV{nVIACJC?9' >QYSD;WF2-('=,/10!&'Fqpli^I327"OyoUKBWxgVF>G|}\?5$'.9Yv\A,%8JqmN?2*0JB@,  %,/<PQC6<DCBWH.:K:0;'0MpePI<?9+-+*(4`ce}hmmWPZnM@+5Z%3$,`R&('.RobK3+1g_^Q)!+39;1$4GV]_^\RK(3THUSI. ,='%&,A3.#!*;geC?Xp|df{g_h e>6M~T-  !GmpXE/$+Bhua7   6Zqywsa\>#<U_Y;zqTA (6"%'BJYSMG=NmW1!3Nv!%iasr rTKiyghwx~?5[hpjN-;[ewzmcM4-Yr{~d_G#'MZQ6 vS>->8J^TPM=CJhd;4_BFrcbps[Xjk{sX&,ATY>(.IHMZVD# rfdkd|<Zk[YL.,1wiT48E /JGKRDG:N\llO('M{L[<$h^ng\ppX/$Ge]6 )A@3wfWIDG_j 7U[_`Q/'>GB. R<49N%:>IUKPQcmvwX81I2MD1t^caqzo`muqy^G2nyB p_TPOVkEU\idH. 1HYYB+ 02Sc||U8"Ce .:+bOSWmrr qvob`}ikywdQC'M:pdsdH4*6;Ke*3JQ<,"5Xh^@'  !6X{xc?( =FU|bLWtunxx|x} nkqhY|rg``kogmZE6)ip; uNC[uoVE>65:ESq$80-+3Pb_D@,  &Iv~eSX`\Vck]hydd~}^ix}csrlw\]JEgcVgIBC8-1\6!oI?iq^RMNRQYy 5TryR"G- 0c u`\uicVQgwxvvWI;?`nmdG=<2/\Q/^Wnw_J9/+.+/Nt   );[Y#}uW% :w8&k`ny|v~lV;>hpE18HfsdH:4(**{qFzafls^K98j5Xl_5~yqD2\qzy>5xihg}rpkylZ>.8VsP697[ukR?3#!)* >R7zsloyvogUB2" 8n5B8& vrh{Y. 3JTREOj`KMYjzeZSMdxe\}eG13XX>A:`v_L=+!(2hkExz}zi_WB) M%BJ?}vxxS~edds-Fo) kO;742OwdOc~lU6"5Xw`C?9XjWK;**81;rjCkVKE3ABRU5tu":&\9*/1A[hx$FQJWtf8"$#!?[nXB@Qgy|wsgJ.*7Qwd>.,?qp[SG/'4B36b\8{\D8' 2k|lma/'@L_*2FWd}uy!q:#'#6@}SM8%0PddcrzkM627Qyw`5#0eqZSI- ,FJ0PWG!U9#-d  {qW=$%=Teo#,6[n^l) z?.j}V9-9TZPwiT:P;N[Y0,J{olbCA9QP5 yx~|`?*! W"#zu_G-#!,<L]i{Hszu\ABe uN</%)^w_N>(EA7XM@3OBHKpg@'&<gzypWE#>LD*p`\fnwzsaE0& Kx    #tjtW8#%*4?L_olu~,EUF)6QeaI7&DyiI9&<2IE=>\W>5DXifZlnF#Fh|ztjJ#*EUM$ kPOWdrxsyuS?+& =i' ~ZQ1mPGCCGMVerpsw{tsotyy}z} $J}_M>+0`tC-"/):>8AZZE51?NH<Fp~pE  $GpnkqN(3PXA#"xhjcZ\`szv}qgK3$ 5afZH*yhaabehhfegimsw}sgcYZ`^`ffkh]UTVgFgyyl`L8+2SrxR4 !1@<L]baP8=LHBBO\L  .bjjsQ%>NG8.)30 }xk]YYgtytsxsO4,X.&oE$zzxsohea_^bnytwxywfZH?@:8;;@<.$!$5ERe~Ga}eL9:K`nnP;,%.FBYfs{nF:CGOJknY.NkprX" 5KNG< 0GV5h_]]YI\q~~slpux~{VD47T| XTENSION= 'DUMP ' / created Mon Feb 21 05:32:02 2011 BITPIX = 8 NAXIS = 1 NAXIS1 = 944 PCOUNT = 0 GCOUNT = 1 END -k# E%@(!k E5Ҁ)cU hpp{5v\*!UY@!'  vKUUUUnvve|h a[0)8S 7p~ ٲd\\u͜r<2Ŧ/%Z^h`(g )(/g.R戎H踎X%(S+K 0+D06@ uuge|@ XX玈ٱ00'0(Wuuge|@ XX玈ٳ11X1YWuuge|@ XX玈ٲ1 1 1 uuge|@ XX玈ٲ1:11uuge|@ XX玈ٲ111uuge|@ XX玈ٱ1 1!N1!Ouuge|@ XX玈ٲ1'1(1(uuge|@ XX玈ٲ100101018Ai@>6[$Uճ"3"mC5:~oqǙjIc-w"73s4kA Xsunpy-0.8.3/sunpy/data/test/HinodeSOT.fits0000644000175000001440000131230013203275053017613 0ustar nabil00000000000000SIMPLE = T / created Mon Mar 10 16:13:51 2014 BITPIX = 16 NAXIS = 4 NAXIS1 = 112 NAXIS2 = 384 NAXIS3 = 1 NAXIS4 = 4 EXTEND = T DATE = '2014-03-10T16:13:51.000' /creation date DATE_RF0= '2014-03-10T16:13:51.000' /creation date TELESCOP= 'HINODE' INSTRUME= 'SOT/SP' MDP_CLK = 4239525105 ORIGIN = 'JAXA/ISAS, SIRIUS' DATA_LEV= 0 ORIG_RF0= 'JAXA/ISAS, SIRIUS' VER_RF0 = '1.58bb' PROG_VER= 317 SEQN_VER= 350 PARM_VER= 354 PROG_NO = 1 SUBR_NO = 1 SEQN_NO = 6 MAIN_CNT= 1 MAIN_RPT= 1 MAIN_POS= 1 SUBR_CNT= 1 SUBR_RPT= 1 SUBR_POS= 1 SEQN_CNT= 1 SEQN_RPT= 1 SEQN_POS= 1 OBSTITLE= ' ' TARGET = ' ' SCI_OBJ = ' ' SCI_OBS = 'TBD' OBS_DEC = ' ' JOIN_SB = ' ' OBS_NUM = 0 JOP_ID = 0 NOAA_NUM= 0 OBSERVER= ' ' PLANNER = ' ' TOHBANS = ' ' DATATYPE= 'SCI' FLFLG = 'NON' OBS_MODE= 'QT' FILEORIG= '2014_0310_160957.sci' MDPCTREF= -55444185 CTREF = 2014456122 CTRATE = 584.000 TIMEERR = 1 OBT_TIME= 4239523212 OBT_END = 4239524031 DATE_OBS= '2014-03-01T00:00:00.571' TIME-OBS= '00:00:00.571' CTIME = 'Sat Mar 1 00:00:00 2014' DATE_END= '2014-03-01T00:00:02.171' SAA = 'OUT' HLZ = 'OUT' CRPIX1 = 56.5000 CRPIX2 = 192.500 CRVAL1 = 6302.00 SC_ATTX = -408.949 SC_ATTY = -139.277 CRVAL2 = -139.277 CDELT1 = -0.0215490 CDELT2 = 0.317000 CUNIT1 = 'Angstrom' CUNIT2 = 'arcsec' CTYPE1 = 'Wavelength' CTYPE2 = 'Solar-Y' CTYPE3 = 'CCD side' CTYPE4 = 'Stokes component' SAT_ROT = 4.29153E-05 INST_ROT= 0.412000 CROTA1 = 0.412043 CROTA2 = 0.412043 YSCALE = 0.317000 XSCALE = 0.295200 FOVX = 0.295200 FOVY = 121.728 TR_MODE = 'TR3' XCEN = -409.383 YCEN = -139.277 SPMAPCTR= 38 SPCCDIX0= 128 SPCCDIX1= 895 SPCCDIY0= 56 SPCCDIY1= 167 MACROID = 14897 PCK_SN0 = 23512790 PCK_SN1 = 23512794 NUM_PCKS= 5 NSLITPOS= 1550 SLITINDX= 386 NUM_SIDE= 1 WAVE = '6302A' SPNINT = 2 SP_EXTID= 10 SCN_STEP= 1 SCN_SUM = 2 SCN_RPT = 0 SPBSHFT = 1 BITCOMP1= 1 IMGCOMP1= 7 QTABLE1 = 7 BITCOMP2= 4 IMGCOMP2= 7 QTABLE2 = 7 ROISTART= 56 ROISTOP = 168 DOPVUSED= 21 CAMGAIN = 2 CAMDACA = 5 CAMDACB = 5 CAMPSUM = 1 CAMSSUM = 2 CAMAMP = 1 CAMSCLK = 1 SLITPOS = 35 SLITENC = 2084 SPMAPINX= 1939831 CTSERVO = 1 CTMESTAT= 4294938624 CTMEX = -750 CTMEY = 2669 CTMODE = 35 DOP_RCV = 1109 WEDGE = 52 FOCUS = 2022 T_SPCCD = -35.3179 T_FGCCD = -39.7421 T_CTCCD = 25.7756 T_SPCEB = -0.335930 T_FGCEB = -0.838921 T_CTCEB = 0.0454102 PMUDELAY= 128 TIMESYS = 'UTC' EXPTIME = 1.60000 BITCVER1= 45089 ACHFVER1= 40961 DCHFVER1= 53249 QTABVER1= 57366 BITCVER2= 45092 ACHFVER2= 40962 DCHFVER2= 53249 QTABVER2= 57366 BYTECNTI= 10324 PIXCNTI = 43008 BITSPPI = 1.92039 BYTECNTQ= 36550 PIXCNTQ = 129024 BITSPPQ = 2.26625 PERCENTD= 100.000 OBS_TYPE= 'SP IQUV 4D array' END CfC BC2CBBBBQBBtB B/BBtAABQBtB@BB AAPBb@r>@@AB@BBC2CDC CBBC BBCCBBBBtBB@AB@AAB AA.@?>;84/h)o$R!!"#(:.4:^=?B@a@ABbBBCCCCCCCDDDDCCDDCCDDHAArAPAAaA @A.@A @@@A @@r@A A@@@@??=<:<8N5~2/--*-U.159L??@@A AaAAPA@A?AA@A.@@@@@r@@@?@@?@.??1>=%D)|/.49<>F?d?@P@A A?AAAB@BQBbBbBbBQB@B/AB B@B@B/B/BQB??t?d??t?>?1>>>>>?>>>?1?B>>>>F==;97"31.,,,-/259,;`=>6>? ?d????? ?@ ??B?B>>?B>>>>>?1>>F>y>F=n<;:n7`5!1.)T%""$'-2+69;<>W>?B?B?d???@@@@@r@P@.@?@@?@?@.@?@a@@@?@.@P@??????t?S?B?d??d? ?B???t?S?S>>=<;8]4x0-+ ++x,.1Z48;q>>?t??@P@a@.@??@r????t???d????S??S>?>>%=<;:,7`3X.)$,! ":&+N06(9<$=>?1???@ @P@?@@@@@@@a@P@P@a@r@r@r@r@@BB@B/BQB/AAAAAaA?AaArArAPA?@AaAArAaArA?@?t>=:681x,),((*H-U1i68;>W?@.@AAPAAAB APAAAaA?AAaAA@@@@@@@@a@r@a??t>h<?@?@@A.AAAAAB B/B@B/B/BB/BBB/B@B@B@B@AArAaAAaA @A.A?@@@A@@@@@A @@@@@P@ ?=:6f1,<'&,&z(+06v;@>6? ?@r@@A.A?A B APAAAPA?AAaAPAP@@.@@?@@a????t? >=<<$:851,(&&S'f+06(:<$>F>???@?@?@@@@@@r@?@P@ ?@ ?S? ??>>?t>>>>F=<:9|62.d(#1j "(/5^9<=^=>?S?@@@@a@@A AA.AA @APA@A A?APA.@A@@@@@a@P@@@ ?@P@r@ ?@.@?@@@.???d>?>6?B?@ @.@r@@P@.?@a@@@?????B?B??? ??>>>>%=W?B??@?@.?@@@@@@r@P@?@@@P@a@@@@PCDBBCCxBBC BtCDB AaBBB@BBQBBtB/B@BBBbA.AP?d= 96v0)%#&m+17;?B@ArBBtBCBBCUC BBBBBBBBBBtBQBQB/AAAAAAP@?>;:~61+x# $x*;06G9W; 4,#|!"'K.95~:~>F?@A?AABtBBQBBBtBQBbBtBtBtBQBbB@B AAAAB B B AAA?@r?>=,95/&FRn6 &F-*38];P=?@aArBBtBBCDCDCCCxCDCxCCxCfCDCUCCxC2CDCFZEEF$FEEF$EEF$F6EF$FE EEEEEtEEEPDDCfCB?:,1&"F!%-86G=EFF}FFEEEEEEEEEEEEbE>EE DDlDlD}DDD7CC2A@r=93v) z 0 %]+39=@A?B C CDlDEEbFHFFFlFHF}FF}F6FHFFF}F$F}GHHHNHHrHHhCUDEFlFFGdGGGGGGGGGGGGGvGGdG FGGGG0GBGBFFlFD}B>:3*V"x0 "&-4:>ADZE-FHGGGHDDDDD}DDEtDE-ECDEtDZDE-E>DDDDDlCDCDBbA>:n4-r'&'+18>=nArBCDHD}DDEE-EPEEEEPE-EPEtEE-EEbE>DDE CCCCCCDBB/@>:6/K'! #)90&7";>@B@BDDE E-EtEFG GFFFFFFlFEFZFFF}FAArAPA.AA @A ?@@@@?@P@??t?@?@a@.@@.????d><84/)&z%'*/49=>?@@@@A A@@A @@@r@@@@a@P@@@ ?@r@@@@r@?t>=;9|6(1+$$ ".'.H49;=>?d@P@AA?ArAAB B/AAAB AC2BBbBCDC2BBBBBBBBBbB@ArBBBBBAAABQBtBQBQBtB@AA@.=;8.41,<)'(+$.49>W?@B BbBQBbBBBQBCBBBQBtBBB/BBBAABtAAAAAP@a?B>;851x+%!  2#'-4Z9,h<9L51,f' " #(:.5!9<>@aAB BBC CUCCDCCCxCUCCCxCCDD&CCxCD&AAaA.@@@@@@@@@@r@ @@r@@@a@P@P@P@??>=<;q73/+ (p((+\0B59;>???@A?AA?A?A?APAaAaAPA?A?AaAPA @@?@@.@a@?@?@?@.??>=n;85O0+j%" #1(,.r4Z8<=?t?@APAAB@BBbBBBBBBBBBQB BtBBC2C?t?d?B?1?1?1?B?B>>>>>>%>6>>>>>>>>y>F==>%??d?1?S>>????>>>>>>>6========n<;;09l7P4/*V$  %D+058:<<5<=^>%>>?S????????@ ??d?t????@????d?S?B?S?d?d?B? ? ?B?>>? ? >>>>>>>h=>h=,;: 7`1)$#c#&-d4;8:<=>>F? ?d?? ? ? ?B?B?B?B? ? >>?>>>F>=>%>%>==<<;q:85~1+@% S^ >$^*H058:n;W>? ?d?d????????@@r@@r@ @@@r@P@???????????d?t???t?B?B?B?B?>>h>F<<:,7p2v+\%$$'-38]:<>%>>???t??????????d????1>>>>>>>>h=<6>?1??@ ?@@?@?@@@?@a?S?@@??t?@BQB/AAAArAaAPA@A A?A @@A.ArAPAA AA @@@P?1=<: 63g.,,,t.27p;>>@@A AAArAAaAaArAAArAaAaAAA @@@r@@@@@@r@?>>6;@9|62.r)b%"#&*0`59|<$=??@@A AAAAABBAABB@ABbBBtB/B@BC C CBBBBBBBbB@BQBBbB B/BBBBQB@BQB@B AB@@>>%:7240/K./v1Z47;`>W?ArBBQBBBBBBBCCBBBBBBB/AAB/BtBbBQB/AAA@r?=n;8]40+\'$$%(:,27;>h@@ABQBQBCDCxCCCCCCCCDBCC2BBC CCAA @@@@@@@@@@@@@A @@@P@?@P@?@ ?@??t=<96V2.H*r* *-159<>?t@@?@@@A A?APAaArArAaAPA?@@@@@@r@@@@@a@.??d>>F<:7p39.*%#"k$^(T-397; =>?@@@AAArABB@B@BBB@BbABQBtB/B/BBB/@r@P@??????t?d?t???B?d???t?S?B?B?B?>==<;851+@)(G(,0n48; = >h>? ???@ ??????????S???d?1???>>>>W==<<:851-)$""!#$&S+@059\;P=^>y? ? ?t@a@@.@a@@@@@@@@ @@@@@@a?>? ?B?B? ? ?B?t?1>>>>>>>>>>F>%>6>W>h>h>F= <5; 751.(%#>&,,172:>>?1?1>?B? ?1?B>>h>W>? >W>%>>===>F>6====<<5;0:,8.3/,&F!:^"(/4J7:M;<=>W>?>>?>y?d???d?d?B>????S?1?B??BBBBBBBBtBBQBbBB/BtBB/BBBbBQBbBQBAB@AAA.>%;`6 ," (09,=?d@APB BQBBBBBBBCBBtBtBBBbB@BtBbAAAAB AAAAP@r?>F<96V1(by^&/5:<=<>y?d@rAABQBbBbCBC CUBBCCBCBBBBC C2CDDDCCDD&CC2CCUCfCCDCxCC2CCCCCCCDBBAAA@?>91L$X#c,6<@ABtC2CxCDDCCCDDHD7CDDlCDCCCCCDBBCUCxCDBBB@A@?S<9|4*;#,.3*8=?t@rABtCCCCDE E DDlDDEDDD}DlDE E>E DArA @@A A @@a@?@@??@@a?@a@P@a@@@@??@?>><:6G.H"Fn$-5~9<>?d@@r@A A@@@@AA @@A?@rA A @@@@P?S?@.@r@.??? >>,27p:?@rA.A @ArB/AAArABBAAAaAaABbBB/A?@ @ ???????? ?B>?1?t>?B? ??1?d???t?t?1>>=,:M4,#!F)2v9 =,=>F??t?@@.????@.@ ??@?t@ @????S>W>?B??1>>h==h>???@.@r@.@ @P@@@r@?@?@ @AA?@@a?B?d??t?1? ?B?t?d>>>>>?1>>>>>>?1?1? >6>%=^=F>??t??S?d?S?t??? ? ?t?B?d?d?1? ? >>%>>>>>F==^<;:~85n0Q)9 v &,-U3H7:;q<=>6? ?S?S????@?@r@.?????@?@@@@.===^=M=M=<=<=n<<=<= =<<<<<==<=<<<==<;:9\62,#%.5!8:~;P<<<=M=n=<== =<=n=M<<=M=^<<= <<>>y>>>h==>>W>y>>y>h>>y>>>F>F==^>6=====>===>>6>6==^<<=,>6>==n======>=M===<<<= = <<= <<;0:M9 74/)T *8#p*05O7:M;P;<5<= ==>>>W>>>>F>=>%>W>y>h>h>>=>F>>W=>>6>W=^>>>y==n=========^= =n<=<$98N3-U$j% &-4Z9;<==^===>>>F==>y>>= =>W>h==n====^===<==<<5:: 740B( k &&m,2:6V8:;<=n=>%>=>?S?S? ?1>>?? ?B?1?>???:;;;@:::::;; ;:::::::::::~:<:9: 864x/)9"%+2+589<:n:;;;;q;899l9::n9:~:~:M:~:<: ::<:n::::::????1? ?1>>W? >>>>>>>>>>>>>>>>==<:M8]39,""L!*;398;0>h?1?S>>? ?S?1>>>>>?? >>>6====n>W>6==M<<<9852+-U&,5 )|0&47P9;%>h>y>>>?B?B? ?d? >?d>>>>>>>>A.APA?@@A@@a@.@r@@@r@.@ @ @@r@P@P@r@@r@a@??>=;7`0$<!)3*9=<=?d?@ @r@@Ar@AaAA?@@@@A?A@@@@a@??@@r???B>>=<:7p2v* -`-(/5O9l;=>?B@@r@@@A AAAAAA?ABBQBB BBQBtBAB BAAAAA@A.AAAP@@@ArAPA.A.APAPA@@r?@?d=<82&! $!(p1Z8.W?@@@A ArB@A AAArA?A.@@A @@A?AaA @@@?A.A @@@a??=,?@@r@ABbAB/BB/BBQABB/AAAaAAAA?@?@r@ ??????t?d?t??d?1>??t?d?t??d?>?>? >6<$:71'"!.#>(}0`7";=<>?B?t@@P@a@@ @?@.?????d??t?t?@??d?d>F>>>W>>h==^F>>?t@?@@?@@@A?@@r@ArA.@@AA?A?A?d@ @P??S?B?d?d??B>>?B?? >?1? ? ?1?1>>>F>6>>=^:95/&""x$)b046:<$=M=>h?t??B?B???? ?1???1??d?B??>>y>h>h>>>%>>W=n= ;:740*"0z^!'f-d3*79;Py>>>?B?d???@r@.??@?@@ @.@a@a@?@???t?t?S???S??1?S?S?B?B?d??S?B? >>>>>>>F=<:8>3g.(p&z%D&*;/K5!9|;=n>?1??1?t???@????? ??d?S?t?B>>>? >>>>==<? ? ?1?B?@@??@@@r?S@a@a?@ @P@?@=^=<= <==n====M>%>==>6>>F',158]9:n;;;<$<=<5>y=;@85@1.*+**+@-r058=<>y?@?@P@@@@@@@P@?@@@P@@@@@a???@.?????1>=^;:,72.9)b$!!j"F%*./48;`>>??@ @P@A.@@@AA@@A@@@r@rA?Aa@A >h>y>? >>F>6>y>>>>>>>>>F>%>=====<F>y>>>>>>>y>y>>>>>>>>W===>%====n=%>W>>??S>>?t?t??S@?S?t?? ????AArAAAAPA A@AA.A@@@A AAArAaAaAAA@?>=<:73H.* ((G)o,/5!9l=? @aAAAAAAB B AAB AAAAPAaAAAPA.AaAa@@r@@a@?d><5:73/Z*$!R"x'f-49;>?t@AaAAB@BtBB@BBQBbBbBC BbBB@BtCBBC AAaA.AAAP@@APArAAaA?AA.AP@a@a@r@r@r@r@a@a?t>>?@A.AAAA.AAAAAAA?A.A AArAA?A.AaA?@?@ @.??? ==;8|404+ %! 2!:$),/5:=,>?d@aAAaAAB AB AAAB@B@B AAAABbAABAA?@AArA?@@P@@?@P@.???@@r@@@@@.???d>>6?@a@@@@@a@@@@@@@rA @@A @@@r@@??t??S?1>=M<963 /K*%"R !j$*;06:~?t@@@@@A @AaAAA.AAr@A.AArAAAaAaBtCBBBBB/B@BB BB@BQB@B AAABBbBBtB/AAB Ar@a@P>y;06f/*d&S%'s*18;6V/'! %.5;P>ABC CCDHD}D}DDEEbEbE>E DEtEtEEFF$FEB/B BB@AAAAAAAArAaAPAPAaArAAAAAArAPBB @@?d=:5,%w"x#'/7<?A.APAB/B/C B@CfC2BBBBBBtB@BQBQBbBbBQB/BAaA?BbBb@@A?@.?B><95^/v'K 0%D-U49=M?d@rAB BQBBBCDBCDDDCCUCCCCCDDCCBBBBBB@B/BtBBbB/AAAB B/BbBBBBBBtBQAA @ ?=;8l2*V#|!R#)07<>@a@AaAArBtAAAAAAAAAr@ArAAAPAPAPAP@?@aA?AP@P@?@P?S>=M:723*-%z J&.H5!9= =?@?@APAAABtAB C C2BQB@BBBB@BtBBtBAFFFG FFlFlFFFFlF$FF6FZF}F$FHFlF}F}FlFHF6FZFEEPCB/>8.&z"#(1.9@.CfDEF6FFZGvFFG G0G0G0GGGF6FGdG FFFFEEFHFZF$F$EDCB@r=<82( !'/6<@B@CDEF$FFFGFGH*H@@aAAABBbB/BQBtBtBtBtBBABtBBQABB AAaAArAaAA@@ ?1=6?S@APABbBBCxBC CCC2C CCCCCCCCCf>%=====n=>6=====n=n============,<;P:85!.'" #p)172:M:;<$=n==<>6>=======>6= ===n=,=n=,%>6>>>>>>>>?>>>>>>>@???t?S?1?@?????t?S?S?S?d>>>?? ? ?1?1>W>>6=<:6/'"x!^$E*.2:79<==??B>??d?????1?1??>?S?t>>>>==>>>===<=n<:8681=*#j!(T/479;<==>F>>?????????S@.????@ @.@.>6>%=n=M>>%===<====^===^==<===,=,=>==>>F==^=M=n=====<<>F>>>>>>>??>??>y>>>=>>>F>h=>%>F>====>h==>>6>>>6>%=^=<; 93+@$!R!&,,397p:;<=^==>6>y>>>h>6>>>>6>F>>%>6>6>==^===M==n<<<;:M9L74Z.'!:<#*0B58]:M:;<==>>F>%>?S>>?1>>%>>y>h>>>h>?>6@@@?@@@.@r@@@@P@ @@ ??@ ???@.@?>>? >%<;4+$!.!&9-r49>?S?S?t?@a@@ ??@.@???@ @.@.@@ ???d?S>>?>>y>h><<;95/(:!0#*159 ;F>?d?@.@@r@@@r@@@ @r@a@P@@@P@@@rAPAa@@A @@@@@A@@r@r@a@.@@@a??@@?@P???=;P4,$!"&`-84x9,<>?@??@@@A?APAAAaA.A.AP@@@@@a@?@.@@?@@@r??? =<;95/h(:"  j$x+x2 69;=^>6? ?@.@@@@A A AAaAaA?AaArAaAAAPArAAAAA.@AaA?@AP@@@@@P@P@?@ @@@@?@aA A @aA ??>%;8>2X,(b%&*/5: =^>?@@@A?Aa@AAAAAPA.AA ArAaA.@@@@@@@a@@??t>=<$:8]4i/.)b$8!" 2".&-37:=>y?S@@@AaAAPArAaAAAABAAAB/BQAAB@B/AB@AAaAAAPAA.AAAaAA.A@ArAAPA A?AAA.@? >W=;q72/.,+,/K26:=,>y@ A.A.APAAA.AAAArAaAaA.@AAAArAPA?A?A?@@@@r??d>==,;840,t(b%#%])9/.48];>?1?@A.AAAABtB BtBB/BQBB BB BbBB/B/BBBCDBBQBBbB/BB@BBBBQBtBtB@BtB ABB@BBB@AA@a?S=:682.,./2:59\<>@AAB BBB/CxCCfC CDCCDBBtBtBbBQB/BAABbBB@B APA?@?>= 96V2.*;'1%&)/h48EbEbE>EE DEtEEEEDHDCAr?<830Q.9./2g6;P?BCDDE>FZFEEEEEbEFZEEEEEEEEEbEPDDHD}DHCCCB@?t<950*&%&m)/ 49|>ABCfDZDEPEFEF$EtFHFF$FGBFlFEEF}FZFZFFlABtBtAAAAAB@AAArArAB/BtAAAAAAArAaB @@P>=<$850n)&F$8"#&z+17A; =?@AA?ABbC CxBBQCBACDBACC BCCUCfCCDEbEbDDDDDDDDDD}D}DDDDDDD}DlDZDZCxBCDB@?>F8/'K#|#'.d5;@@ ABbCDCDDZDDEPE DDDDDD&DDDHCCCfCUC2CCCCUBBAA??>;8]2+*;$R 2G $+@2I7<>@ABBCDCD7DHDD7EtDCE-DD7E>DDEEbEPE>EbFFHFZEEEEEEEEEEEbE DEEEtEtEbEbEtEtEPDDDHBA<5+j# #p)2:@.BCDEPEF$FlFZFFHEEFEEE>FFlF$EEEbEPEPEtEEbDDDDCxBtA?t: 2)!.X$%-5~h8.$E # )3<$@BDEEFFFFG0FFG GFFFEEFHG GFFHFZEEEEEEEPDC Bt@ =M82)Fj6!:)39>6@AC2D}EPEFlFFGSG0GG0GSGFGBGGBG0GSGdGSGHIIIIII:ILIII^IHHIILIpHII'ILILI:I'I'HI^I^H`GFCD>5O'%j/;CxEbGBHHHI:II:IpHIIII'I'IJIpILIIIIIHHHHrHHHW=94,-#!F&/7`;@<>h?B?t?@@ @P@r@@@@A @@.@.@@@r@P@r@.????????1><>y;850&' bl@%j,38:<=>%>@r@@@@.A@AAA AA@@@AB AaA B????t?S?1? ??1? ? ?B?S?B?>?t?d?S?t???d?1?>W>6=<<$83+$ !&/Z6:;=M>F>?d??@ ?1?d?d?S?t??t>>?1?S>>>>>F>>W>%>F>h>F==n;<$9\63.'$ %-d368l;<=M=>W>>?>??B???1??@ ???@@ ?ABbBQB@BAAAAAAAAAAAA@@@@AA.@@AAPAa@??d<8l/v'X! %j-50@P@@A.AP@@B/BQB@B B/BBbAAAB AAAAA.ArA?A A.A?A@@?@?<:722g+$"#+27`:<>@.@r@@APBQBCDBBBB@C2BB/AAABQAB C2DDDDDDlDHD7DDZD&D&D7DHD7D&DHD7D7DZDDDlD7CC2CxCAA?>; 60B&R !F&.r5^; 6:,3) n0!^&-4:>APCUDEEEF$FGGHrH`GHrGGSGGdGHGGH*AAAAAAAAaAArAPAPArArAPA.AAAAAAAAAAaAA?>=:3 .H%!.&-5;?A?A?AaAAABB@B/ABBtBQABB@B/B@B/AAAAAAaAaArAP@@PAP?>%<85O/<% 2%,3v9\<$>h?@A?BbBBABBCCBCBCCCxCxDCCfCDDDDDDDlDHDHD7D7DHDlDZDCCUCUCUCCCCCCBC2BAP@>=n; 82X(p8%#1)06; =?@A?BQBBBCCDCCCDDCxCDlD&CDlDlD7DGGGHGGGGSG0G0GBGvGGvGFG0G0G0GdGGGGvG0F}FFEDCf@;@0% $+4<92)b# "*d2v7=,?d@ArAB/BCC C2CBCUCCxBCDCfCDBBC CDCBBAB/BB@AA @?>h=9|4-$va")9/49=?@AaABtC DHBCDCD7D&CCEDDHD}DDDD?????d? >>?d?S?d?t?>>?>>>???1??>F><=%>?B?t?t?? ?B?1??1???1?d??S>>>>>>h>%>>F>h>6==M<;9|7P40Q*!j#J*H16V9:F>>?>??????1?S??S? ?d????G GGGFFF$EFFFFFHEF$FF$FZF$F}GFFHFGdFEFFCA>h6G)""!%.8@rBtCDE-EFEEFFFFFlFG FFG FFZF$FHF6EEbEEEEEtE-DCCfA?<$7/Z%$%*-d6G<?tAC2CD}EFFFlFZGBGBFG0FFFFF}F}FGG G G0GHHNHrH`H*GGHHHHGGvGGHHGGHGGGdGFF$GFDC @P8* #,f7p@DHEFGSGHGHHrHHHNHH`HHHHHHBDF$FFFG0GGvGGGBFGBGGGdGGGSGBGvGdG EFlFF}FF$FEFE-BAP>:n0&$^"* 3:?1A?CUDEFHFGdHrG0H*H*GH`HrH*HrGGGH*HH`HNHrF}FFFFF6EEFlFFFHF$F6FEEEEFFF6EFHEFEEDCxBt?t8l* !)T3<$@BDZDEE-EF}FFFFZF6F}FFFZFFF}FlFFF6DEFEE-EPE>DDCA@P>9/$xn!(1=7<@BQCDZDE EFFFFFGGSG0GvGdFFGSGGGvGD7D7DHD7D&DCCDDHD7CCCCC CDCCxCDCCDlCxD7CCfBA?;`1& b $,,f5@;?ABCfCCDDDDDDZDlDDDHDZDDDlDZDlDHCC2CD&CCUCCUBBAr@>;6(,"k#1*2g7<5>@rAB@BCCDDDDDDDEDE>EEPEEbEEEEBbBtBBBBBBBtBBB@B/BbBArBBtBQB@BtAABABAAA?@P=8-$kG$-6G;>@APABBBQBCCBBBCDBBbBCCBBBBQAABtBAABA@@@ >W=M93** !adz#V)/59=>@aABBbBCfBCCCCCfCxCD&CCfCDHD&D&DlEEEEEbEPEEDEE>E-E DDDE>E>E>E-E DDDDEDZCB@?= 9l3+%%w'-5:^?ACDlEPEEFEEEEEEbEbEEEbEEE DEPE E>D7DDD}DCDHBA?=93,%! J$*V18|=@ABD7DDEtFEEF6FlFlFZFHFZFHEEFFZF6F6FlCxCCCCCfCxCCC C BBBBCCDCDC2C CBBBBCfAAP@.=:61+()9+/h59>@aAB@BCDCxDCCCCCCCCCCCCC2C2CC2CBCfBBtBtABt@??=;721,t&m#p"$R(G-U399 <>?APBQBBCfCCCDDZDDDlDHDD7DDZDD}D}D@@AA.A @@@@@@@@r@r@@@@@@@@@@?@??>=,:73.*'(* .49L<>??@P@@AA?AAArAPAaArAaAPA AAA @A@@@aA@r@ @.? ?=<:n8N3/Z+&##1$x',28>:= >6?t@@a@@A AAAABB@AABbB@B/B@BQBbBtBBB/B@BQBQB@B ABbBbB@B AAABAAAAB B/BAAA@?>;83/*'(+0Q6;?B@AABBQBC2BbBBBBbBBBB/ABBBtB@B APBtAB AaAPA@??=:8.4/+\&#|"#'-5:<>@.AaAAB@BBtC2BBC CxCCfC C2CDCDC2C2CUCCBBBBBBBBQBtBBBQB AB B/BB/AAB/B/AABQB AaAP?=:5.9(G#"&z,4; ?1@AABtBBCUBbBBBtBQBBBBQB BBBBbBA?BABAaAA@a???<:~6V1*#pG#>*d29|?A.AAB@BtB@BBBBCC CBBBCBBC CfCfGFFFFFFFFlFFF}F6FEFFFlFF$FlF}F$EF6EEF6DC@;P4Z*!j!)3gArCD}DEPF$FFHFFFFFFFGFG0GdGG GGGFZFEEEFEEEEEEEtE-E E EEbE-EbEFEEEbDDE CDA?9|3H)!" ")2;@BDDEEFFEFZFZEEF6F}FFEEEEEFEDE F6EPE-EDDCCxA>%:<5.%]"'09 =@rB@CDHDFF}FHFFFFFFFGFHFG0FFGdGGCfCBBCfCfCCxBBBBC CBB/BBbBC BBBBQCBBBA@r<83v,%bk%/7p:>@APABC2CDlCDD}CDlDD}D7D&DZD}D}DlDE Et?d??1>???1?t?S?S?S?t??d?1>??1???t???1?>>y>=M;73,%v! (b07:=<>? ?B?1?t@P@.@@@P@r@r@a@.????S?d??d>>>>>>>>F>=n<:^8.4J/(p!F <&9.509<; <=>h?B??@P?@@@r@@@A?@@@@@A ArA?@??@?@????????t??>>??S>>?1>?>>>y><84;-&`c &' .5:<=>W>>>??d??????????????t>>?S?B>>>>==>>?B?d??@ @a??@@P@a@a@P@?@a@@>?S>>??d>>>>>>>>h>>>>y>?1>>?>>>===^;73H,& J>? ??d????????1?S?t?t?d? >>h>F>>>>>><=^;98N4i/)T#V<&z-d28.9;= =>?>?d@P@?@?@??d@.@r@a@P@?@?@a@@<$%=<=>h=<=n=======>=n==n=^===M==^=n==n=M=<=<=^<6>=n====M=M====ArAA.A AAA.A@@@@A @@@@@A AaA A.Aa@@r@@@?=:7p2+@#c%.d6<$>F?@AA @A?APA?A?APAaAPA@AA A?AAa@@Aa?@ @@?@???d>>6=<:^72-'>#p,49<<>6? ?@.@@A@AArA.AAAAAArA?AaAABB DDDZD&DDD}DD}DZDHDDDDHCDCDZDDZD}DDHCCCCUBtA?<72/v&^#,5=@.BC CDDDDDDlDDDD}D&DlDHD}DDD7DZE D&CDDDCCfCUBBb@><8.2+*!A#J,.4: >%?A?B C CCD}CEbEDDDDE-E DDDE-EEEA@AAPAPA.AA.A A?ArAP@@@@@@APA.@r@A.@A @@?>=:7`2)!!:(b07<>?@?@A ABAB/AA.ABQAAAAAAaAB AA @@@AA @@??>>=<$8.3-%< 'X.59L?@r@A.ABABQBBtBBBB/CACfABDlB/CU@@A A.A@@@@A.APA?@@@@@@A @@r@A@A?@@?>>W;81Z)" $+16;=?t@P@@@AA.AA?@A A?@@A?A?A @@A@@.@P@?@P@P@P???1?B>=^;83-*$$8+$06V8;=>?@?@@A@P@@@AArArA.Bt@A@@B@A@@@@@@@@r??@@????@r@?@@@?@@????B>=<:^7"0Q(,! %-4J8;P=?B?@@@A @AaA @@@@@@AA.@@@@P?@@ @ @ @ ??S>>W=n;:n73,$EAy$,279;=>?t@P@@A.A.AAArAAB ABA?B@A.ABAA@@@@@@@a@@@A A @@@@@P?@@.@ @@?@a@@?>h<:61),!.<"+39<>?B?t?@P@A?@@@@a@@@Aa@P@A@@@@?????????1>>=<:74-%D 8!*279?@a@@r@A?ArAP@@A.A.@A@A@A.B@ArCDDCCCCC BBBCCBBBCDBC C2CCCBBB@B/A@?=:M4,,#&049,>6@AB BCUCD&BCxCfC2CxCDCDDBCUCCCxCxCDBBBBBBBQAA@?>E-E>EtEF$F$F$CD}DDCD}DlCDCCCCCCDBCCDZDHCDDZCCC CCBB/@?; 2&(}3g=<@?B@BCxD&DCEEtDDE>DD&DDE DDE EPE D}DDZD&DDCCCfB@A@?=M:M4,!8L)1L9,=?ArBbCUCCDD7DDDEEbEbEDE-DEbEEEE>y? ?B>>?S?B>??d? ? ?1?>>W>>?t?S>>?S>>y>>>><:81*!R$k,68: <>=>h? ?S?d????B??t>????d?1???t>? >>>>>y>6>>=^;:^7`3-%"+j179\;=M=>y>>??@P@@@@@@.@a@@P@A @A?@:::<999::<:<99L9L99999::<99:: 9:99,88]74/*V$!'.46879<9|9:::^:^:M:~:::^:n::M:M:<:,:: 99999: 99l9<8|8]7530,'1!-%,t14J6789\9:M:~:^;P;q;q;`;@;P;;:;:;;:W;7`1' n#+4;>W@a@@ArAABAA?AAAAPAAAAaAPA.A @@AA?AAAaAPA?@?t>6=M;97`1+#$%!.)2g7<=n>?@AArAAAAAABBAAPAAAAAAAEPEDD}DZDZDlD}CD&DDDD7DCDHDDD7DlDZD&DD&CCCxCC2A?E-EDDDDCCDCCCC CBA@?<6/$-@'s07=M? APBCDHDDEE EEPEEEEEFF}FEF6EECCCxCUCUCCD&C2CUCCDD&DCCCxCUCDCCCxDCxCDBBBA?1;6* 0 &92+:M=AaB@B BbC CfCCCxCD7DCCCCCCCCCCCC2CxCCUCxCBB AAP?=,;680B%j&`/6;0=,?A.B BC C2CCDD7D7D7DZD}DlDED}DZEPDDA @@@AA?ArAAPA@AArAAAaAA @AaAArAAAa@@@@P@><:4;)L '$19h?@a@AAAB@BBBBbBC BBtCB@B/CBC<= =,=<=<== <==<>==n=>h>=?1==? >%>>>y>F>F>y>>W>==>6>6===>6=^<=<===>%===<=n<;q:84-*$k^".*;2:72:<>h>6>W>h>6==>>F=>6>==>W>h===<=n===n<<:;:,864i/)F l!R(/46v8;;<=,===>>W>W>6>F>? >=>W>>W>>=@r@?@@.@P@a@?@ ? ?t?????@ ??d??????d@.@???>= y???@.@.@P@P@.??@ @??@a@a?@@@a??B?1?1?B?S? >>y>>%???B@.@@ @@?@r@@@P@@@@A A?@rA?AA AA?APA?A@@AA@@AaAA.@@A?@AA?@@r@@@??=n<:5n/v'"""%w,t3v9=,?@@A @A AAAAAAAAAPAAAABA@ArA?A @@@@@a>>;:85O0*"kH $+2 69<$>y?S?@AaABB/AABbBBtB/BBtBBBtCCUB==========>===>>h==,====>%==,=<=<>W>>y>y>h>W>W>y>=>W>W=>>W==,======^= <%>%>>>>>? ? >??B?B?>?B?>=>>>>>>>=====^=<=^==n=,====>=<= <$%>==>>>%>%=>==<=M=== <<<= <<<;::,752.r*%D 0!&`,15n7`8:;`;<=^=n=====>>W>>>6>6>=>>>W@@@@@r@a@r@@.@r@@@ ???@.?@a@r??@???>h>%= :8>3/h*$"x$x)0}6G:=>F>?@@@?@@@@@@@@@@@@@.@@@.??@ @?@.??1><<9\63v/Z*%! "k(,/Z5O9<5=>?S??@.@?@a@A A @@ArAAP@AA.AABA=,=M=^=,<<<<<=,===<<<<<==,+ 2I7:M<%>F>====>>>WDD&D7DCCfCxCBCxCDCCUC2CDCxCfCD&CCDCBtCxBBBAA>%:4;) X '08@rAB/BtBtCxC BBCUCCfC2CC2CUC2BCDCxBFlEEFEFFEtFHF6F$FFEEEEtEEEEtEEEFEFEEDCA?9\-r!%.9|>BCDlEFZFlEFFFF6GFEFFlF}FZFF}FEFlFEEEEEbE E-D}CC @>%92&*0%.4i;>AaC DEEEFZFG GBGSGdGvGG GGGFGGGvAr@A APA APA@APA?A.AA @@@@A?AaA.A A?AaA?@@@@???S><8]1'1R# *d38]==;P84;-8"KX!)06:%>@?A?ABbArAB B@BQBbBBBBtBB/BBbBB@@a@@@@A?@@?@?@.@@ ?????@?@ ?@@?@r@@ ?>>=^;P80B&F^"(08l<5>>h>?@@aAA AAAA A A @@@@@rA AP@@.@ ?@.@a@???S?1>6= ?@PA.@@A.AaAaArAAAAAAAAaAB >>F>>>h>>>y>%>%>>>====>y>>>>>>W>>%>==<;q9L4i-8$j"(159%>F>F? >>?>>h>y? >>W>y>y>6>? >h====>%>== =<<5::~8.5/(} V" 'f.d3g69l;y>6>h>>>>??1?d>>??d>??@@P@@@@.@r@ @@@@@r@r@r@a?@?@@r@a@r@a@@@??>>6#J)917;P>%>?@P@P@.@@a@r@@?@@@r@.@P@P@@@@???d?t????S>>=6>?1?S?@P@@@@@A A?A.@@APA.@@A@@@@@@ @a@ @?@?@?@?@?@?@?@?? ???????@r??? >%=,:8.4,%""#'$,39<>y>?S?@@P@@@A @@ @.@@@a@@r@.@@@P???????d>>=^;:73.'!^j$E+21L69l;==>? ?t@ @A A.A.A.A?AAA@A A.A@A A??S??>>?S?>>>>>>>>>?d??B?1?d??d>>W>6=<;9L6f0B)#!"(,.5O:<>F>F>?d?@?d????? ?1???B?d?B>?t?>>>>y>y>>>6==?S?@?????@ @P@?@ @ ???@@??@?@P??@??????????t???????>>>>=<:n7`4Z,%] &F.5: %>?t???@r@@@???@.????t?@.?d??S>>? ?>>W><;`963.(:!V$,2I7:<5=>F?B???@@.@?@.@.@?@@@ @@@@ @@@rBtBQB@BbBtBtB@B BBAAAAAABbB/AAAB AABQAAaA?@.><:n6/Z'""'.5^;=@?A.APBAABBtB@BBbBbCBtABBbBB/BAaBbAArAAA?@@@P?S>;86(0*#>$,37;q=? ?@AAABBB B/C2C2BBbCDBBBCfCC BBBBtBBBBbB/BBbB/BQB@AB BbB/BbBtBbBB B/BbAA @@>=,:8l4J/*&`%(-39>?A@?CDABBbBBBCBBCfBBbBBBBBABtAAABAA @?d>h<: 64,/)9$E >< J#V)17<>y@@ArAABbCCDBBCCC C2CCDC CDCCCCf@@@@@@@@r@@@@@@@@@@@@@P@.@@??S>>h=,;97"1.9(#"$8(T/h5n;@>>@?@@P@a@A?A?A.AA?@ArA.@@A?@@@@P@@?@?@a???S=<;08|5n2-("<%-5!9|W>??@?@ArAAAB@BABB@B/BBB@BtBBEEEEEEEtE>EtE>E>EEEbEtEDE-EEtE-E EPEDDHDZD&CxB@>%:M4i*# !&.r7p>WCBEDDDE>EEEFHEEEEE-EEEPEbEtDE>DDDEDD}D&BB @><94,-%wL$,4;? ABCD7DEDlEEDEPEDEE>EPE>E-E-EtEF$GGvGdGvGGGSGG FFGBGSGG0GvFFFG G0G0GFFZFHFFlEEtC@<5*" !&S/ 8>@CxEEGEtFGBGGGHEFGGHHHHHHI:HHHHrHrHIIpDDDDDDDDZDCDDlDlD7D&DZDDDD7D}D}D7CD7D&D&CBB@=<8l0(! "'/7`=ABCDCDlDEbE E EEtDEDDZDEDDDDlDDCCCDCBC B A?t=<92+\# V+%-85:>WA B/BCDHE>DlE-E>EEtE>E-EEEEEEEFF6@r@a@P@a@r@r@?@ ???@.@.????@ @?@P@?@ ??@ ??>=<:74-&"!#'.58==<@a>@@@A@@A?A@@@a@?@A @a@a@@a????d?t?? >W>h=nh?1?@?A @AaAPAPAAAABQBAB BbBBbB/@.@@ @@.@.???????????@@@????>>>=<;962,(''(-269\;>y=??@@@@?@@@.@a??@@@ @ @a@???t???B>=<<:853-("!$x*r/37:= =>?@ @@.@@@A.A@A.@@@a@A A.@@a<==n=M<<<<<<<<<<<<<=<=^<<=n=M<= ;74;0}+& >0%R")/3688:;y>6=<>>>y>>>y>>h=<====^=,==========n6>F>=>%>=M===>F==<;;;<$<5<;;@; :9<741,%wc!R'-2X579:;<5<==n=>=>%>>=======>W>=======^=,== <<=<=^<<=n==,<=,==<= <5<#*/37p9<:~; ;>=>6? >%===>F>F==^>>W>>>F>W>===^<<=,==<=n<=<<:9\62-'"!v"&-d37:^<<==^=^=>%==>%>6>>%>y==>y====,==,= <<<>h>>h>>>>>==>? >>?CxC BC2CCC2BBBBBBtBbBQBbCfBBbB@BC2BBQBBQBBbAa@a=93+$k!v!$^+2:=@?AABQBC2BBBtBBBBC BBQCUBB@BABBtBQB AAAa@@>y?><9l4-U$0 !j),06;=M>?A?AAB@BbBBBBCC CCBbBCDCCUC C@@?@@a@@@a?@A.A?A@@@@A@@P@a@@@@.@?@ ??t>=:71L)#V #J)07;P>%? ???@ArA?APAAAAAAA.B AaA Ar@A@r@P@.@.@.@ ??>F>h<; 73H,% &'K/<5:<>h?@APA.AArAAAAAB B/CDBbB BCUCBB===>>F>F============^=M=^==^=<===<$;@96 2,&"F!.!^#(p.5@86>W>=>%>=>F====<== <<<<<<%>F>h>>h>h>>>y>>>>>>>AAB B@BQBQBAB/AArABBQB AAAAB AAArAr@@@a?><9 5n.(T## #1$*06(:~>y?@?@@AAPA?AAB AAAAA AA A A@A?@@r@?@@ ???t>y=;:6V0*.#GX '1.49L;q=<>h?@a@AA?APAAAArAB/APB@BBbABBBAABB/B/AAAAAaAAAAB/AABB AABbB AAAA @ >;62-),%$%'+/5^:,>@.@B/BAABAABtABtBbAAB BB/B/BB A?AA@APA @a@>>WX '.5n9<>%?SAPA.AC B/BtBBC CfCBDCCCCCxBB9\9|9999|9L9,999:99:<99,999<9\998888726830,)o&S##J#%'+.2:6f78>9,99:<;0:<:; :~:::::~:::::n: :M99: 999,7P6503g/+$&!.C$8*;/3678|9: 9;@; ;@;@;@;<;;<5<5<5#&),**+,---....9....9.d..r.H.d./......../<.// .....H....d.V.9.---F,+@(%#c!F^A5 0!"$,&)+--r-.9.9/ .r./Z...//..//..9..H--.-,,+*)o(,%*!5#c&)9*+@,<---.9..// /Z/Z/ /Z////Z/Z//)o)o)o)|)|))))))))b)o))F)F)o))|)T)))((((:&$!nX >!$k&(b))9),))),)*)o)))))b)|)))F((),(()('''f&%P$x!l L "$k%&'K(G((T()o)))* * ))** *;*H*d**''''''''''K'''>'K''1'K's'''X'&'&&S&%$x"k & <""#%7&9&z&F&'&'$'' 'f'K&&&''$&&&m&F&&m&`&&F%%$$""R X8@|b<2^C! " #$%%&,%&' 'X'X'X''''>'>'f''(((%]%]%]%]%j%w%%%%7%w%%7%P%%7$%%7%7$$$$%$$#c"F Y@L#" " # $$$%%$%7%%%%$$%%*%$$$k$$^$8$8$$#|#|#$"F! ^ jvJv!R"##$$$%%*%%%]%%%%%%&9&S&,%$$$$$$$$$$$$$$k$R$x$x$R$E$E$^$k$R$8##|#c"!R0N*vY!:"."#p#$R$#$$8$$,$R$8##$^$^##c##J#1## """k".! C$v.Tj z!"!""#V#>##$$$^$x$k$$R$x$$$$%7''''''''''X'K'f'X'' '1'$' &&' '&&&,%%%#|!yYl !#%%&S&F&&&'1'1&&'' &&'$'$&&`&F&&%%%%%7$$k#|"! }LY!# $$%7%&,%&,&z&&&&&&&&'>'X'1'K'&&&&&&&&'$&&'' &&&&&z&`&`&z&z&`&F&z%%%#!KVG!^#$$x%]%%&&9&&&&S&F&z&&,&,&&&%%P%%w%]%P%7%$$x##$"R!$60 "R#1$$k$%D%&&m&z&&&&&&&' '$''$'X%%%%%%%%%D%%%D%D%%%7%%%%%%%w%]%j$$#"!^jVVw*z "R#$#$k$$%%j%%P$%%j%%%%%%%$$^$E$,$$##|#>"".! GAjJTY< !"k# ##$k$x$%7%7%D%%%%%j%w%%%%%))|)|)|)o)b)b)b)))))))))F)))))(()((p(:'$%]" S!$&m''(p))9)F)))F))F)()((((('((p(T(G(,'''f&&S%$" v68!#%D%&'>'s''(T(((((()((()9)b)T),/////////v/$,! <SS^$ #$&),*+\++,,,,,,,,,,,t,,,J,, ++++++N***d)o(b&# } !"$8&()|*+++,X,----U-d-F-----.V.*-((((((('(b(,((,('''(''''''''&&&%P#|!FR%c6A z"$%&&&'''(('''('s'K'''$&'K&&&&&&m&%%$$" *6| !#$$,$%&z&&'$'s'f'f'''(,(:('(:(('+++++x+N+2+$,+++x*+ +N+ *+ +$+@+@+$****V* )(&#!:^! !j nR >"%')T**d*r***********++$***)))))))T)((,&%#!RnlL+n z"%D'1'(G()T*.)F)***********+$+\+////h/Z/Z/h/h//Z///###|###c###|#V#J#V#c#p#"""k!FCCa- !"# # ###############V#J#J#1# #"""R"!!F ^ LTr~R !j"k""# ##$$$$8$$$$$$$$%%7!.!:!R!R!F!.! !^ !!" !. <Sz5@yj z z z 2 R %LVCh8Wdz^R^  > b z ! !"!:!^!j !!:!R!R!" !j! ! n J RvJ*  YVX^G J b z z b J n > > z z &vjR$j6*T.v Or@X<$  V z !!"!:!R!j!v!j!R!:!"!v!"!F!F !" ! 2GXwdk@b V J > 2  vGAKNT^l7L`Ccv z ! !.!:!:!!"!:!^!v!!!":"."""""""""!!""F!!!!" !!!!!!!! >0v-C H b V!.!F!j!!!j!F!.!!^!^!!!. n &$0zTT$^vnv^  & !!R!j!v!F!^!v!!!!!*d))*;*H))))))))b)b)))))|)T)9)9)T)o()(,'f'1%#p! n nR! "$&'$'((b(})F)o(}(b((()((G(((T(G(,(''''f'&&%%7$" VyBG "#$%&9&' '1'(,'''(('(:('(G(:((p55n5^555^505O5!5O5n5^5!55505n5O5!44455!4i4i3g2:10-U+\('>&9$"""^"$&9(+.0n13H34,4i4444Z4J45@44J444;4;44x4J4,4333H2:0/-*(b$ yn< #&(+./1i2I33 34,334,4x4x4J44i4J444x4:::::::n:n:<:~::::n:M:M:::~:^:^:~:::M:^99 8l7p5n30`,($! n!#J&+\/25@7"89|99l9::9::,::M9: 9999|9L99 888l88775!2X/*%w +C- v"k%)-135788]89L9<9,9\999:,99:M:<9:^>>W>F>h>>h>6>>%>6>W>h>W>F>%>%>W>F>6>6>6>W>y>====^<F=^=^?t? =>>>>6=>6>=>>=====n=<<;;:^8>50B)"Lk!(, 04Z7"8: ;=>>W>W>F>W>>>?S? ???t? ?88888888|888888888|8|8|8888888|8876f5!204)#VSd866v6G42/*r$RA8ttJ5 &m*H.145678889L9l9l999: 99:^:,9:,33333333v333X3H3v3333H3X3X3g3v3v334;333g11L/-8),$#'*-012v23334,33X4,33334334,3 2222222I211./,)%vL@r.^#&`),.0B1=2+2233344;4x34,4444Z34J0n000n0000B0`0400&0Q0}0`0B000&0&04040&0&/./Z/.--+\(b%j!wdY $8'*H,.d/K0/00Q0n0`040&040&04/00`//0B///////Z/..-F,+$(G%]!jcv.`av#&)+-d././04/0401001=01011i1=011Z111Z1111=1011.1x1x1=01111.11111.00Q0.H-8+2'%" <!$'*-8/K//0&0011i0110}11x11.1i00}10B0&00&0&0///<.-d+(%!nB#8 z#&)|+-*.d// /Z0000100}001111x1L0166676666f666666f6V6f66v666V6666v66 542/,*'1%$###J%(,0&2 345@6 6856G6676566V6(6f6V56 6v5!5~555555O4x43 2/<+'"v!$(+.124,45!5~566V6f6f6f666V6G6666656 6686V6G6(556 5555555^55n555^55555@5@50431.+j&# Vj "'X+.13g4J5n55666f6v6f56V556555544444444;4x310.+x'#  6# &* -/1234,5O555556686v686V6V6(66687777777777P77"777267`7727P67"7p7"77"66V5503X0-'>!XCy"' , /24J56G6677`677A66666666v66666(555554i3g3*1-(#$cb~V * %)-0}244556(6v66667777667p77;;;;;;;;;;q;0;@;;;P:;;`;;;P;;;;;0:988N6v3.'" G$R)/<3X688:;@;@;<;P;`;;;;;;;;q;@;@:;::^::,: 9987`63/.)9"LB6%"R',1468>99::;@;q;;;<<;;;;P<<<5999999999|9|9|9l9\9L9\9l99l999L999:M999L88.640*$^0*8!j&z,.046f7p9 9L9\9: 9<9L9: 99999999\89888]8|8l8.8755304+x%j^JT%j*d/246f7P79 9L999: :<:n: 99: 9:~::<6666666666666v6f6666V666G6v665555O432X0+&""Y5":&+/345@6666666(6666666v66v6866G6855555543g20&,("^ W` %*d/.13g45~56 6G666677276727P7"77722222222222g2X2v22222+2g2v22I22X3H222X1x0.,($ nn".%)-/012:223*3X223H33 3H392222212211111.0n04/v/ ,)% w 2$(,./1L112223*3*3*3X3v33v33334,3v0000000000}0&040000n00`000Q0}0004///..9,*($R!.<55<"&,)|,..040Q0&000}000}0}000&00n0}04/00////K./..-F,f*;'% `WLB  %(*,.9../0&0`0}0n0n001000011Z033333333v33333v3v333333X223933H33 2X10.*+*;'$$". !"%(+j.0112393g3v33323v3 23 393*3 3 2I212 2+11x10n/.,+$(%]# >%X #&),t./21Z212+223 3g2433393*3g345555555555O55505O5@5!5n5~5~5^5O5^554433X21/-F*d'1$"^!" "$R&),/Z133355^5556 55O5555~5555^444i4Z4Z43392v1i/-+)T&9#!. S0 "%'s+.H012435^45O5566G5655555556v6f6V6f66v6G666v6 6(666v665556686(6655433H1..r*&m"^ #'$+ .13*4,45566(6v66v6 5555@5O5546 55@5444;3321/-*)%w!`l!%)-/0233X445@55555O6v6V6V6666v6(77p7`7p777`727P7667726677P7"7"7P7A667p65543*1.d*d%".<0!%)-0395!6G7667"7"7p777"7`777"777`6766(5555^54392X0n-r* %] " 6#&+\.13566f66777P7p7727P72727p777`6999999999l9|9|9|9\9L9L9L: 999999l99 8|7654x20&,f(%##$E%'1(,1357A889,9\9|9|9: 9989<9<888889 88N8.8>8.77643X1.V,J(}#!jj "&*/14i6v7`8]888]89 89 99L99|9\99999=<<= ==<<<==M=<= <<= <<<<<<<<8898|8>87741-'" KVX#(p.926 77899<989 9L98988998l8]9\8]8.88>8]8>77`768541=/Z*#L#<""'K-14x6G679,8l89l999:<: 89l9999\9965556 556(55555^5^55555556 5505555@4i3 2 /v*%!:@z"&*.V134i4J56(6(5566 5555555~5^5^5545!544Z4x322 1.+&!!%*)F-023v3455!56V56 6567656777255O5O5~5~5^5~5445@5n5@44455444444454321/,)%""jS"F&)-d02v344J4i4544544x5O5!4455444;44i333323*10/,.)b%j!:Nk6#(+/<1L23 3g444,45@45545!5~5@44555:::; :::;q9:,:~::::9::::^:M:~:M999887"503v04-*)F&%*%&,'+.2 5~7999:9:^::::::<::~:<:<:^:^:99: 9889\87P65031.V+(,$R!jG!F$8(,043g67278N89l99:,::,:n::^:~::: :,:;@:>>>?>>F>?S>>y>F>W>>>>F??1>>>y>>>y=>%=M=;:<8]40B+\'&%'f*.36:Mh>>??1?1?>>>>y>W>%>>>=M====^=n<;=,;P9|63*/v*r%!R "R&,16V9,;`<$<=>>>F>6>>>>?>>>>>>?1?t?S@ @@a@a???@@????@ @.@?????t?d????@P??>=;73,'X$#c%(-58%>>?S@P????@@@?@r@@a@@??B?@ ?S>? ??>>F>W=;;:<84Z-'f!vG$!&+17:,%>?@???@ @.@@@a@@.@P@P@.@?@@@@@@@@@P@A@@?@r@@@@a@ ?@?@P@@ @a@@?@???S>F<8|1=*$R!^!F#(/6:~=? ???@P@@@r@@@@AP@APAa@@??@a@@.?B?t@@?d>?t?=<;84+$vLj!&,2g7:<=n>y?1?@?@@P@P@@@A AA.A?APArAAA?>>>>>>>>>6>y>>>h>h>h>%>>>>y>>>=>h==^<;:6 /(#!""%*d1=509\h>y>%?B>>? ? >>?S?S?>>y>W>F>F>W>==>F>F=n<<=;:972+@$kL")/<47: ;<=>%>W>=>>h>F? >>y? ?S?d???????d>>>?>>>>>>>W>>W>?>6>?>>>>>>?B>h>=<:60)$"^"^$E(.49L<$?1>? >>?d?S>>>?>>F>%>>>W==>F>F>===^<=n;:9\6v2v,<&9!.^6!'-279;0;<===>?t>>?????1?1?S?????;h? >>y>>>y>==>>=>>=,>>6=>>>>h=>===<;96G20+)F''1(,*/.36:,<5=n=>%>>>y>h>>6>>>%>>>>=>F>>6>%>===^=<=M=n<$;973/+&" v $(b,168:;>>>>6>W>y>==>F>>W=<=^=,<= <<<< !$(-278:M:;q<5<>6>6>F>W>h>y>==>W>>W== ===M==n=,=n==n===>=<==^=M=M=n===<>=<=n>W>F=^==^==M<<=,<?S?d?t?t?S?S?S?d?d?>>%=<<$9\51+ &$k$'f+20689?d?d?t?t???B?d???1@ ?@?>? ?t>>y>>>>>y==^=n<98500n+@%j!^"'-379;<=n>F>>h????@?@P@.@ @?@a@@r@?@.@@?@@@ @??@???@??t???S@a@?@@?@a@a@ ??S?B? >F=<<596V2+-)()9+$-26:^=<>?@P@ ?@@@@@@@a@?@@a@@?S???B>>>>>>>==h? ????@ @a@@@@a@?@a@@a@?@?@@ABBBbBbB@BBABBBbAABQABtB AB BBAAAAA@?S>6;8>40..9.0158@r@@A?AAAABBBCBBtBBBBBBBBCCUCUCC2BBCCCDBBBBCDBC CfCCCfCDC2BCBBA?><56V.)F&&*./v5:M>h@aABBCC BCUCCfBBC CCfCxCxC2BBBBBB BtBBBB/A A @>F<5961Z)$,!j!%, 38]<>@aABB@ABBC CDCDCDCUCCDlCCDCD}DlCCDE>EtE>DDE-E-DEbDDZD}DDDEDDDE E>E-DDCUDCDC AAr>:1i'!!$*3<$@PB@CfCCDDDDE-E DDDE-DDDDDZD&D&D7DZCCCCUCxCBBB@?t=:n39* jn # )16<>%@.ACCDCDDDDDDDEEPEDD}DE-E DDCDDCBBDCBQCUBBBCBBC2BBBC2CCCfCB/CfCBB@AA>y7.$,")3g;P?1@ABbBQCCD&D&D&D&D&D&D&D&CCCCCCfCxCCDBBBBQBbBBAPA.?>=n91x'$5n!v(,0`6 ;=?@ABBCCCDDDDDHD}DZD&D7DlDlD7DZD???S>>?t?S>h>>? ?B? >>?1>>>>?t??S>>? >y>==^;q<=>h>y?t?S?B?>??B?S? >>>?>>>>>==>>>F===,==;:M85,"@U '/48:<;<=^=>>>>? ?1?1?1?S?t???????@a>6>%>6>W>==>%<=>y>y>=>>y====>>6>==>= <%=>===>6>F==========<<=>=^=<  ":)90n47`9|:;==>%>F>6>6>F>h>>=>%>>>>= <= == <5=n=,=====><:~8|5^1Z-*r()|+/Z4J7; <>6>>y?@@@AA?A?A @@AaArAaA.@@@@@@.@?@a??S>y=,>h51=-8(,#|!: #(.4J7A:<5<=M>@@r@@r@A.APAPA?A.A?@AAAA?@@Aa>%===M=n=<==,===^=,=n=<==n===,=,===<<<<$:;@87P2.*V%$,$R%*/27P9\:<$<5<=>F====M===<<<<<<63/*$!F $).25!79:n; ;<$<=,=>>>h>%>>=>F>y>%>6>>>AAaA.APAPA @A @A@@AAA A.AaAAA.AArAA?A.@@?t?=<81+j$!!#)/h38;=? ?t@P@r@A?A.@@A?AaA.@@@@@@@@P@ @ ?@@???B?B>h<; 72,f%] Jcj!'-r26(9 ;<>>?B??@@@A @@A?A A.A.@@@@@C BCC2BBBBBBB@BbCfCxBBC CDC2BBCC BCBBAB@@@.@@ABbCCDC2BBCUCfCDBBCCUBBBB@BtBQB@B@B/AAAPAa@a>=:6 /.' nXwc b%,17p:=^>@aA?AB/B@CC2C2CxC2CCCCCxCCCfCxC<<==M<%==>W>F==>W>y>W>? ==<===M<<=<<==n==<<<=,=<== <<<<= <<<;;9\84.),#!j!$*148:<;<5<5<6@@@A@@@@?@@@@@a@rA?@@@@@@r@r@@P@?@>>;:6f1i-*('s').49=>y?@?@a@@.@@@A A @@@@@@.@??@P@ @ ???d?S?1>>>6=<:n62-U' " 2 !%+2X8.:n<=>6>??@?S@@?@@a@ ?@r@@@@a@P@@@rCCfC2CxCCUCDCxBtC2CDCCUCBCCCUC2CxCfC C CCUCBAaAa>=84i0-,t-.16;?B@rA?BtBC2BDCCD7D&CCCCC2CfCxBC CfBC BBBtBbB@B A@?>W<950*H&##1$(.4:<=^?t@AABBCCCCCDCCDCDDCCDlDHCfCCBBCDC2CC2BC2BBCBBQBCC2CCfCUBBCxCCBAPA>=86 1L,+, -805:?SA ACC2DDCCxCDCCfCDCCCCD&CCCC C2BBBBtBbB@B A ?=y<94.+j)*+/.49=?1@?AA ABBAABB/AABBB BtBAABA?AAAPAPArA?@??>h<:84/*.%w!!$8(-28.;=?@@@ABABQBABbBQBQBBtBBbB@BtBBB<<6=^=^=<=^=<<= <<$;; :~8N64i0,X'$#1 2!%** /Z4i79;@;<<5<==>6>>>h>F>%>>h>y>W>6>h>>>::^:<:<:^:n:n:^9:^9::9:<9|9:,:<::,:n:n:,9999l8|74Z1L-'f#V!"%*H0B4x78N9<:M9: : ::::::::99|: :n9999 99L9,9,9<88]787530-8(#R"(,-2g46v778889|9l: : : :n:,9:n:M:n:M::M:::n>y>W>6>F>h>y>h>F=>F=>h>F=>==>y>h==>>=^===$k(:-48|;=>>y>W==>6==>%>F>===<=n=M=,=,=<W>=>>%>F>%=>%>>>F:~:n:M:^:::n:M:^::M::n9::n:;:: 9:~:: ::M988>75~2g.H'" z!%+1478999::::;;@;:::;@;P; ::::^:n:,::: 99987754i2.)#").25n6789:n:~::;@;@;@;;P:;`;q;;`;0;q;;;:^:M:<:^:~:~:M:,:<:::^: 9::n:^:n:M99:M:~:n999l88]7`40*% R!v&,+147899|9\::9:<:::M: ::M:n::,9: 99L99,9<9<9,888>77725030,&!vY#)/ 2468727899,99:^:M:<::M9:n:^:n:^:,:^:::~<<<<==<<:M;`6V42+-)T$R!.'-*1=357P89 9\9<9:: :M::::::; : :;::;:77p7277`7267A7A6V67"727P7P67777A77677765~501/Z*H&S" & !&,+/3466f67A7P67P777272777P77`727"7"76676v6G6v6f5554391/,(#al$k)o.2X2v35!56v667727P77777777`78]778N8>6666V66f66f668686v67P7"56f56v556(56f5554410Q,(}$! z!.$^)-2355n5~56 56 6G6V6(6(6V6G6 666v6f6f6V6(555@55@5n54x4321x/Z+(%!vXLj"'f,89999: :^:~:^: : :^:~:^::n:<::: 9989,9<8888|77p6(42/<*$EJ""(-1=356789,9:^;999: :n:n: 9;99::M::9@.@ ????d?d?S????d?1?B?????@??>?>?t?>>>6=;`83) $,+38<>>%>>F??B?t???S??B?S?B?>>>>>?t? >>>F>y>y>=n<W>?S>y?t?? >?d?t>? ??S>?1???EbE>EDDDDDDDDDDD}DDDE DEE>DF6EtDDDDlCCB?t:~/#Jn<"+4<@BC CfCDD7EEtEE-DE E DEtDE E>DEEPDCCCDDCC BC BA??=;@3),V#@"*1=8lEEtDEtEEEEE DDDDDDDE EbEEPE DDDDDlDDHCE D7CCDlCC2CDBb@a= 2I$kn".*4<@CD7DDEEDZDE DD}DD}D7DD7DE DDDCDHDHDHDZDZD&CCUBA@@.>%EtEPEBbBbBQBQBQBtBBBBC CDC BBBCxCBCUBAC BQBBtBB/ArAP@=8."^# )1:,>?A.AABbABCfCCxCDCDC BCBCCfCCBB/BQB@B/B/B/AAA?A@ ?t>y;939(B5"),/Z5@;=^? ?A AAB ABbBBBCfCxC CDCCfCCCD7=n=n=n=n===============>6==>>F==== <$;`96/( J<"(/<68l;<=>F>>>%>%>>>>>>y>6>>%>F>h>>6>W=====n=^=<y>y>>>?1?B?t???d>?1>>?d?B>?9999::<:M:n:M:M:M:,: ::^:999l: 9|9:M999\9 8N7P52/ )#A!'-258N89l99|:99:<:~:<::<:,9::::99:<9: 99999L88]7"65!3g/, &"v '-d1i35n778]9\999:^:^:~:::::::::;0::;P7777778888>8>8.888]88l88.877287277726V53H/, &S! c!(/3467"78.78N778]8|8>88>8]8>88>8>8N788>777p7`7P7655n4i31/-d(#pHJ z'-r1=2466678778]8>8N88888888|89,88|9,:::::::;:n:::::::::~:^; ::<;@:n:9987501.'!$8,J36G79,9\:::<::^:^:::n:M:::::<:^:~::,:M9:,::: 998N7763*1.r("vk.":*056G789,99:~:,: :^:,:M:; ; :::::n:;0::n;0<<= = <<<<<5<<<<<<<5<:::;q=<=M=^=M=M==>%99: : 99999: 9999: 9999: 99L9L99L9l9\8]641,'s!$!F&-26v8>89,99:<:^:~:^:^:n:^:M:<:M:M:::M99999999|9\9<888N7p6G4,1-r)9#V<C$+046878N899|: :<:,:~:~::::n:;@::::::::99:: 99999999,9,999:: ::<999|99L9L9<8N640+&!!F&S-d268778N89L9l99999999999:<999L9<88988888|876530n,(#pH$*0&466f78|8889l9999: :99:,: 99:M:::<9::::::~::;@;P;::;;P;@::::::n:M:^999875~0, &" $*1=6 78]9l:<:::; ;@; :::::::;P::::: :<:M:<:,:,:99|9,7p641-),$8 dK!)/v36f78999:,:;;::;`;;P;0;@;;;q;<<;;@8N8l8l8]8.88>8]88N8N888N8N88l8|8l8N8>8.778.77`653/*&":!'-25~6G7`88N8]8|8888|88888]888888]7777777776553v0n,t(G#w&,025O6(67`78>8|8l88899L9 8899\889\99\9 66666f6V6656 6866686 56666f6v66f56f55^4i3X1-)%* ^S!'-F1.34x5n55556(6v686 6(6f66V656(6(6V665~555555~5044J320.*&"F* &+/1334Z456868566f6666667266v6f666677"7"66667"77p77777p7676667A766v65432+.*r$ >"k(-2 45n6f6667277`7"67"7777A7`7p7"72766v766666v655!32g0.9*&!5 '+/1345@5677"6777777p78>777777777A7P7A7"667"7P666666667727"67277p6666V5439/+$ zS!',13456V667P7666v67"7`72677`666686 6686868686 554431/,t'!XJ"%+/13345n56f66v77"7P7`767A77A77777776666766 686V6v66666v6V6677"6v67656f5~5n430+% n&,+03g4J5666666V666f6v666568666V666f6G5566 5~505@431/,'!^+@l0$* .V0Q2345~6G6(56G667677P77`7667"7`727"726766(666v66G6G686868686G6G6f66v666866G56G5n504;2v/v*$S""'-134J5@55556G6v66666666v6v6666(6856v6 56(6 5n55331/,<'K!zUb" >&+ /.13 4,45~68686(666766727A7"7"66727`7A7"7A8l877p7778888]8>8>8]88888N8|8.8]887776v42/+N'1" J $*/3678N88|889<788778>8>78|8N8|8N77778>7777766v44,20n,(p#|VNA"(-145n6v67`78788N8888888|88889 889 8888888]88888|8|88888>8N88]8888]8765020`,f(b#!R!^$*/2567A7778.8]8|8888888888889 9 888]8>8.877A75420B,)|%* "x(b-13H67"78888l889,9<99,9\9,899,9 9\99|9|99999999\99|9999999|: 9l9|99|999,9,9l8]7642/h*d%! #)|.26789<9l9:<:<999999999l99L9l9L999 888888l877P54,1.+&!Xc &S-*125678|9<9,89l99999:,99\:<999:,::,:^:::<9:,:<:<:::::::::;0:::::::n:M:^9\9\8l65^2,%j &,2 68789l9:<:~:M:n:::^:^:::M:~:<:n:M9:M:~99999999<8876 41-(!R $R+x025~689 : :,9:~::::;0;`::^;q::;;@;@;P;:::M9:M:M:<:99: : : : 99:<9:<:M99: 9::n9\9\8]6v4x1+@#  '1-U2689L9|9:M:~:,::::~:~:::^::::: :^:::,:^:<9999l88N6530&,&v*l"%+\0Q36f789l:M:n:^::;;; ;;;@:;;P; ;P;;;;<$<<<=<<"F ^%7+/13 55566(766v686v7"7P77276f66v6f766v6<<<<<h>h>W>6>===>%>h>>>>==>>y>6>6>%>>W>=^>6==<;q:72's$.79;%==>>>>6=>>>F>F>W>F>>>W>%=>=^=,==<<5<;; 98>52 +$""n$k,278; ;h>%>y>6>6>y>>y>W>W>y>>>F>h>>>WCCCfCDC CBBBCDBBCCUBBBBCDCCxBBBBBAAAA ?W@AAB@BBBBCCxCUBCxCfB/BBBBBBBBQBBB BQBAA AA@?d=;70'>$E,4:?d@PA?A?BAB BBQBBBBBCDBBC2BCUCCDG0G FFFFFFFZFFFFFFG0F$FZFGdG0FFZF}FFE>EPE>DD@=,4&",9 @CfE-E>EFFFFlFG FFZFFEtFFFFFFFF$EFZEEtFHEE EtCCBB ?<5,5*#J+5;?BC DHEbEFlF$F}FGBG0G G GBGdFFZFG0FlFGGBDDDDZDHDZDDDlEE DEDDEDDEE>DDDEtDHE-DDlCxCC @EEEE DEFDEPEEEbEEEtDDHEbDD7E>E>DlDCCA@>;6f.!^U! )93 9=M@ @BbCD&E>E EF6FF6EEEEFlEFFEFHGSF>?1?B>>>>>?B>>>>>>>>>?>>>>? ?S>=>6>%=<: 6f+x!#>+23H9;=<>>?1?B???d?1?S?????t???????t>>h>?B? >6=>%=n<??>??1?@a@?@?@@@P@@r@?@@A AA?7P777p7"727P7A7A7P77777`77p77777p777`666685~31+$#j$+N14J5677777877788>8.8887777777A727`777666f543*0-8'vJ$$).135!667778>78888888]9L8889<9,99<4;4544,4,4i4x44;4x44444;4i4444i4Z4x43333H21/Z,X&j%+x02X3g334x44J4i444444445444J444,4J344,4333v2110B.,t)#W0$)|-/1Z2v3 3X33444450545545~50505~55^5@5O455^44x444444i4Z4445444444x44334392g1/K,'$8C$*0}123g3444Z4i444444444444Z4;4443*333v3H33*2g1.1/<-,(b".#c(,/.0`12I239334Z34,4x4444444455!4447P7877P7`77777P727A7787p7777`7A7P7p6776(5^42/)9! %j,.135!56777A72777p7`7P7P7`7p7"7A7p77p7A765666(56(55442:0}.H*H$^$).0`2:345!5686V666727`7p7p77777P77777999999999l99:: 99999: 999999l9l9l88753*+@" %-d3H6(789<: :99999999999l99:: 99l9,899<8888>77753H0,&0k$*/K2X46v778888999:,: 99:<999:^:n:M:~:9999l9999\9,9l9999\9l9|99999l9L9L9l9\88877"5~3g,""N$-83g578|89l9l9<99L9|99|9\9l999|99999\9 88889 88>7766530-F&0#)/<3 4J687P78>88899|9999l9: 999999::<<8]88>8N889,887p9879,8N8l77777777"665n5@32+/.+x$a R&F,J042I5567p778.8]889 99,999 8|9 889,989|556 55556 5555556G6 5~555555555O44320,<%`(/2X44545~556f555686f685565^55545O45505O5!44Z43210.+x'!&m, /1Z2X3 34455@5n55556 5556G66V6G66669|99999|9l9l9999\889|9l9,9,999,9<9L9L888N7P66f3*.'1v`*.2 4678N89\9l8899l889,9\9L9,9L79 89L78788.8>877p76543H1-)#rVR'-14,5n67788.8]8889 999 889L9l8899|89;@;0;0;0;0; ::;@:;`;q::::;:::::;; :^::~9|88N5n1i( n*37A8>9:M:;;::<;; :;@;;;q;:n;:;:M;:~:,:,:,:,999<88]7"54i0+$8b(T/ 3X578l9l:,:~:::;;;;;;;;q;;;q;`<<;;999\9\9l9l9L9,9,89l99l9<9l9<999l9\9\9\9\9\89 98]7p64,0)!)1L50678|89|99|99999:: 99,99\: 9989l8888888N77654Z3v0B+$Alj'.*2+456v78>889 9<999999999:,99:::~:;;P::;; ;:;0::;;q;0;@:;q;q;`;P;0; ::::~:<987p41*".6 V(b04489l9:::;0;::;;q;;;::::;:M::~:,::~:^:M:,99<8765~40,&HL 'f.92g4;67899:<:~:; ;0;@;@;0; :::<:::;0; ;;>>F===>==>==>>F===>W>W>W>6>====<<$;:9 683H,#"R*H28:~<5=<=>>%>%>>>W>>%>h>>>W=>%=?S=M>>>====^=,<<;:^9751-'s y (}047:n;@>W>>>>>>>>>>?S?B>?1>>?:<:,:,:<:M:<99:n:n:^:,999:999:^:<9l9<99,9<89 753X.)" z (G/5789|9|999:~:M:,: : :<:n:n:^: : 99999L99,99,9,988>76G54x1.*$,%U&-d14Z67"89 9|9: :9|9:<:::^:~:^:n: : :n:n: : :n=======n=,=^=M=<=<<= ==n=M=n===<=,=<;;:972+N""R*38N;<5<<====<<====>>>>6==<=n===,6>W>=>>=>==>W>y>h>y>>%>=======M=,= = =,=M=M=M=>6>=n=n>==M=<=<%==<=^=<= = =<=M=M=<==n=,=M==^<641.+#d"*r1i58.9,:~;q;<= ==,<=n==n=M=n==^========;0:::::::;;P; ; ;`;;q;P:;0::^:~;::<:,:n9976V2-$ELR&.d48>9,:,::;P;q;;0;;;`;`;;;;;;;;;P;::;:::::<99,8725@2I-(T!#*1.5!789<:,:^:;;;;<'>+/ 2I4J5~55686856G666V6G6f6v6f6G6f6666G5555O5@5!544J33910.V,.(%]!K#).13 4Z4Z5555~56V5686f6G686f66f56G6V686V666:::M:<:M:^:M:<:n9999999l:^99|:<:99l9|987751.*r&##%D'-3 6f8.9<99::,99:<9999999999l9l9l9<88|9 8888l77A6531/Z+@&!c b%+0357p7"79L9|88999:999999:,:,99::9>>>>y>y>y>h>h==>%>>>F>W>>6=?t<>>6>W=n>=M>>=>>y>W>6>>>>>h>W>%=====;<=,=<===>>%>F>W>W>6=>>>>y>?1>%>%>>>>>=>%==>F>>y>F>W>=>>>>>>y>6=<<;:M8N3.)9$x#%](.49\;q<=<=>>>>>>>>h>W>W>W>W>y>h>W>6>====^===M=<= %>W>>>? ?1?S?t????S? ????d?t;;::::::; :~:<:;P;@::;:~:;;;q:<;: 9|99L863 .V(!j z#)045079,9::;0;q<;`;P;0; ;:;;:::::::~:^:::9999L8l7642.d(!X!'-256v789 9::<:::;;0;`;;;<;`:;P;;;@:;P;P;@;0; ;;:;@::~:;0;::;0::,;`9;: ;q99|9876839/<(p"x !#)o0Q4x7p9 99:^::;;0; ;::::::^:~:::::M:,:~:M99\9\9l88>654i2v/ )"H@!^&,1.36789,9:M:M:::; ;@;q;;;;;`;@;q;;;;9l9\9L9<9,99 9 9|9L9L9|9\99,9l899 97:899,8>76v42:/Z+'$$k%*&'$+0357`8|88889999|9l9\9l9l9|8899,9,8888.8l8|8777A65^31/+'"GH #(.*2g456778889 9L9\9|9999: 99:,: 99::M9<9,99 88889 8898889<89l98N7:,88]8772530.*(' ''(,./15^728]899 9 99\9L9<9,9,9<9L9\88888888l78N88.777265n4Z2+/.+'#|  $).2v4i57"778l88l8889 99<9L9\9l9<9:,99,9,9l99,99 8888888l8N888|8888978|9 87776520`-)|&%%&(G+.257`8>8l8889\888888888888l8N8.8778777P7"66(431/+@&"H %**/34678889 89 9l9l9|9|99999|: :<999999L9<9,9 88889|88l89<9L9,998N: 8>9888]877p6(2/+'$#V$&+$.1x6G7A8l88999 9|9 9 88889 99 8888l8N8>8>88N77P7P7P65420,($!.%! %+x0356v7`778N88l899999999899,89,999l==<<====,=,==M===M== =?@P@A AAAArArArArArAaA?A.AA.A A.A@@@?A @?@????=<:73v+x"c!.&.4i9W? ?@A @@AAAAAAAAAAAAAAAACxBBBBBBBBBCBBBBBCBB@BC2C BB@BAA@@><6*H%0:=?@AABbBCUCDC BBBBBBBBQBBBB/BB AA?B/B AAAa@@?S>WF;4Z'* >'3;`=M@rAAAB@BBBCfBBtBtBCBBB BBBbB/BbB APABB/AAA.@r@ ?>F;q85!-"x&`/6f:n= >%?B?@AB/B/BCDC BBBC2CxCCDCCCCUCDCxC@@@r@?@P@@@@r@@@@r@r@@A?@r@.@@@P@.@A @?@ >><8/v#""+5;P>>?@@.@a@@@A@@@@A.@@@r@@@a@@@.>??@ ??S? >=<<96v1) l (1=69;=M>%>?S@?@a@rAA?A.@@@A?ArAAArAAAAAB/<<<*H04i68:n:;@;<<<=M=^=M=<=,=<=n===M=n====>%>W:;@;@::;; ::::::::;@::;:::::^99987p4Z.% &!(0&5789l: :::; ;@; ; ; ; ; ; ;::;0:::::~99:M99999L9L77A53*/)"R 'X-81468N89\9: :::;;P;P;P;`;q;;;;q;q;q;;;<;:^::::n:::M:^:n:n:M:<:M::: :::,:<::M9|99976V2-$kv!R(.d37799::,:<:n:~:M:M:n:::~:M:<:M:::<::<9L9,9:^9|99l8N8l8l7684x2.( l >'f,03H5n7"8]889L999::^:n:~:::::::~:^:~::::>??S>?? >?1?S>>>W>W>>? ?? ?>>y>W>>>>%>F>6>y>? >F>y>>>>y>h>h>>>>%>>6==<==== <<>6=>>>>y>h>>y>%>>>>>?B?d?BB@BBB@BBB@B@BBBBBtBbBtBBBBBBtBQBtBABb@@><8|.#G V%-r6;>%?@AAAAB/B@BBB AAABB@B B@B AAAAP@A?ArAP@@@r??B>W<:60'$0nd$+27:h?d@P@A?AAAAB/B@BB/BBBQBQBtBBBBBBCUCCxC2CCCDCC CxCCCUCBCCfCCCCUC2C2CDBBAB@>:~1%j V$-86<9|3) 2#+228|<5>%?1@.APB BBCBC CxCCxCDDCCCCCDD&D7DHBCBbBBC BBQAB/BBB/AABB/BQBtBtBbB@BB BA?@ >?@AaAB/BQBQBCC BBC2CDBCUC2CDCxCCxCC??? >?t??t?d>?1?S?B? ? ?d??S?d?t?t?t?S? >>><5:8]51L+('X),16:,==>6>>?B???B?????????S?1? ?B?1>>>F>>>%===<;:~7500+&9!F "'.48|:>>?1?t??????@ @ ?@P@ @ @r@@?@P@@r@??d?@P@ @.???t?d?t??@???????d?1>6=<9631..-,-/<15O8>;>6>???@@.@ @P@.@@P@@@??@.?????t?1?1?t?S>>y>W>=,<5:851.,<'#""%)/48|;P=<>>? ???@a@?@ @.@@P@@@@@@A A @@A.=^===<===M=n==<<<=<<==<<<<<<>6>>6==>F>F==>W9::::::,:,;@::<:M:::<9; ::^:,:,:,9998>741-(%$$&*H/<3H5789::n99::<::~99:^:::n::99999989 99 886551Z.V*%"Hv!&,J1.46V688>89:99:M::::::::;:n:n;; :~:; <L'07"9:<>>>>??@@.?d???@ ??????B? ?S?S>>>>h>h>h>W>=^<%>>%>?1=??S>y??>F?>>>>?S?d? >CUBBBBBBBBBBBbBbBbBtBtC2C CCC CBBBBAA?>y:2X&v!R+@5<@?A A BBBC2CC BBBCCBBBBBBbBBB@AAAB BAAA @@??>;P8.3g+x!n!F*H28;>>?@ArAAB/BAaCfBABBtACABBBBBBBCC BBBBbBtBC2C CBBBBCBBBBBBBbB/B AAaA??>;4' *5n?@APAAB/BACBB BBtABB B/BBBBtBBGFFZFZF6EEFHEEEEEtEEEFFEEFEEEEEDlDlCA=7* !+6v>6APBDDDEEEPFF6F$FFEEFFEEbEPEEE>DE D7DDD}DCCCUBA?<8>/$xV!*3:,>@rABCDHDDDE E>EEEtEtEEE>EEEEEEEEBBAAAAAABtBbBQB/B/B/B@B@BbB@B/B@BQB@AABBQ@@@a=<8|3H'H#,7=?B@rBBACDC BCBBBBBBBBBBtBbBBBQBBABBBAAAA>>h<95-F#p"c#+4;9<>@AABBCBBCCCCCxCD&C2D&C2BCD7D&CC===n=n==^<<=<<<= <<<<<<<<<<<<;:~:n86(1+$0$-848];`;`<<<2v(p!"^$+39=M>?@a@@@A @AAAAPAAPArAa@@a@P@@@@P@r???@.?>>W>y=<$:M72,t#@#+27;=<=^>?t?@?@@A.@@AA?A?A.AA A.AAA.AaAAPA EEEEEEbEbEbEEEFEEPEPEEEEEEEEEEtE>DZDHC A?19/#> b&,.7>BCD}DE EbEEDDEEbE>DDE>EtEE EPEbEDDDHD&DlDDCC BB@?t=M9 2(Gk&-84:=n@BBCfDlDDE EbEtEtEEEEEEEFEEFZF6EEEFEEEEEEtEEFEE>EPEEEEEEtEbEPEPEE>DlD7CB @ :3%*"+\6V>yBC2D7DE EtEEFF$F6FFEFFEEEEEEEPEDDDE E-DCCUCUAP@a>:4)@n%#*H39:>W@ABCxDE>E EFFFFFF$FHFZFFFFHFlG0GFZE>EEEEbEbEEDDEbEEtE E-EEtEbEPE>EDDDD}DD&CBAr>9l/#|v #+4;ABDDDE>EtEbEDDE>E DDEEEEEtEtEbEDEPDDDDDD&CxCA@>93'lG#*29=@B@BCDEbE-EPF6F6F6F6FHFlFFFZFG0FFGSGSF@r@@@@r@@@@P@?@r@@@r@@@@@r@a@P@?@.@???B>=n;71' #1(.5:=>??@.@@@AaAA A@@A A@@@@a@a@r@?@@P????? >h== ;q8|3H+"8!&,27A9<>6>?S@?@@r@A.A?AaArAAAAAAB BBBB/BQ>>h>F>F>h>>>>>>W>>>h>W>>W>W>W>F>6>%>%>==<;971*$,!#p(b.V49\<>F>y>h=>F>y>F>%>6>6>>>>>%>>6==M=>==n=<=>F>F>>>>?1?S?S?B?B?S>?S???B?t@.>>6==>6>h>W>6? >y>>%>6>===========,= ;:~84;-&" "F&`,J279;y>>>y>>h=>6>y>F====<=M===<<<;:9,83.)T"" %w+ 047A9\;;<=====>>>6>y>>>>>>>6>??t>y>?h>%======^====n=n=n=^=M=====^=<<=M=M=<<= =^<<<5.3g589:;q;<=,===<= <==^<=^=n= =========BBBtB@B@B@B@BBbB/AB B@B@AABtBbB@BAAAAr@rA.?><5~+"" J&.5:>@rA.A.AAAAABBBtBBBBQB/BQAA?AA@A Aa@@@A@???t>W<95^/&`6 >&`-397;=>??t@.@A?APA.A ABB@AB/B/AABB B B/BbBBBtEEEbEEE-E>EPE-DDDE>E>DDlEE DDDDDDCDCC B@P:1Z' $,X4;@PBQD&D7DE-E>DE EbDDDDE DDDEDE E-DDE>DCD7DlDCUCBA@.>F;`6,.!:-S#*1L7pEbEPE-E EEEEEE-E>EEtEPEEF$FEAArA?@@@A.Aa@@@@@@@@P@@@@@@@@?@a?>h;7A.r$,<#+4:<=?B??@P@A.@A AaAAAAABB AA?@AAP@@@@??@@r??t>>h><:72 ) #1+x16V9? ?@r@AAA ArB/AAB@BbB B/BBBtBBC2CBBBBBBtBtBBBB/B@B@B@B/BBBBBtBQBAAAAAA.?<8]/.$j#+\28%??t@ @A.AaArAa@AAAPAB AABAAAB/B@B/BDZDDDDlDZDDDDZD}DZDCD7DDDDD}DHDCCCxCxBA?;1%"*3v:~?B@BBCfDDHDDDZDZDE DDHDDDDDHD7D7CCCCUCDCCBbBBtA?A.@P>%:4+!*"^(/6;=>AB BC2CCCCDEbE-DEtEE>EbEbEtEEtEPE>EPEbCD&DlDlD&DD7DlCDHD}D7CCD&DCDD7DHDHDCCCC2B/A?<:6V,!C (0`6;=>AaAB/BC CUCfCUCxD&CCDDCCDDE DD}DZD}DDDZD7DDD7DD7D}DDDlDHDDZCDCDHDD}CCD&D7CBB ?d:1.%7z#p-7A=@BQBCUCD7DHDHD7DHDDDD}D}DEEtD}DlDDlCDCBCCCBBBA@?=92+$ 8#>+j39 ;?S@ABCCCDCDHDDDHD&DlDDD}CEtE-DE EbEEEDDD}DDD}D7DZDEEDDDDDDDZD&D}DDCCxCCDBB@?<3' ",6f=@ACDCDDZDlDlD}DDZDlDlDHD&D7D}DDlD&D7DCxCCUB/CCCCDCBA@a?B=:5.9#1B-!)29LGGGvGGGGSGdFGBGdGBGGFFlHNGBFFGGvFF$F}EEDA?7*RL!*d5>BD7EFFlFFFFGG0GBGSG0FFFGHGvGdGBFFF}E>EFFEEbE>D7BA?<8N0$bY!)2:>ABCDEbEEFHFlFHF}G0GGG FFGvFFFGBGGGGILHHHrHHHHGH*H`H`HNHGGIH!R*5n?DFG GSGGGGHBD&FG0GGGGH*H`GGHHGGGHHGGGGGGdFGGF}EEbEE-D7C@>W91.%w#p+\3;?C2CDEFF}G GGSFGGH*H*GGGGGH*HHHHHHAAa@@r@AAaA?AaA.A?ArAaAA A.@AaArA @@@@@r?>=:,5-#>&m/6<>?B@a@@A.APAaAA@AA?A?AAAPArAA.APAA.@A@APAA@@@?t>%=n961)o b%],38;>>y@r@AaAB@BBBQBBBBCBBBBC CfCxCxCxCC????d????d??d?S???1?B??1?@ ??B?S?B?>>%<:71)9 v '/5:MF>??S?d?d?t??????d?t???S>>? >W=>F>W=>6>%==<<;:^96V3-F$ 's.3729l;<= =>>W>? ?S? ?1?B?S?t??d?B? ?d????t?t??@A.ArAaAAAP@AAPAAPAPA A.A@P@A?@@A?A.@@@ =<:4+# 'X-28><>?@.@A A.AAAAAAA.@@AAaAAaAA@@.@@A.A?@??t?S>y=^;8N6G0`&U n&z,X1L5@8?@ @.@r@A?A?AABBAAAABB@BQBAAB/B>y>6>F>h>==>F===>>%>%=========<<<;:8504' zc n&.48l;<<= =<===>>%=>>==>6>>h==>6>W==<==^==M<<<<:9l75^1+#w<&m,157:;;<<=n==^>F=>>>>>>>>h? >>? ? >>?:::::::;@:::;;@;0:::::::::^9987241L,f%]H"k)047289|:M:n::;;@;`;q:;P;@::;@;`;0:::::M99:<:<99|9,9,876852.H(}!!j(.d25689,: ; :;P;q;`788N8]87777`76V5@30+%!""^(G.92677P77788N8]8]8N78888.8.77877`7P7p7P7P7p72766v6G5431/,(T#   ',0&3X456 67`67P778l78877788>8]8>8.8>8N8]8N8N8]??B? >?d???B>>? ?B???S? ?1>>>W>F=; 721)F"R" *H4;:n<=>>y>>?1?B?>>??>?B?? >>?S?1? ?>>%>W>>W>y>W===<$;@9|62v,J%0N *;169:6>=>W>>?>?t???????? ???S?d???BtCCfC BBBBB/BBBBQCBB@BtBBBBBBArA@@r>;`6,"!v*r5;>@@aBQBQBQB@BAAABQBBtAAB/BBB BbB@AAAAA.AAA.@@@.??>=,94;*! (}2I8>6==M;P9|50'`$(b16v: W>h?S??@a@@@@APA @AAAAP@A AaAAAAAAr<<>=====>%>F>6==9999L9l999l99999: 999999L9L9l9<88642X.d*% !%P,f2X5^7`8N79<9L9\9|9|9|9l9l9L9999l999|9999L9 888888877542I/,.'":n$^+20B395^688.899|9:,:<:,:: 99::^:n:M::<: : :<:::M99<999899L9\888889888888888N77`530-(%7"$,(.246v88l8888888889,9L9 89 9888888|8]8>8N7887726V43v0.d+2's"j!'-U13*45778l8889,9\9|99 9 99<9l9|9l9L9l9<99<999|9<;;;;P:;;P;q;0; ::; ; ;::;0;P;0;0; :9876G3/*%"%*r0468: ::::;;0;0;0;0:;`;q; :;0;P;0::::::n:^:9:: 99,87"530,'!G#*/3 5n7P8.9:<:~::::;@;q;; ;0;`;;;;;;;;;;;;;=>F>h>>>%>%=>y>6>>6>F>6>>>>6>6>>>===n<;08l4;-8%P J"'.4J8l:<<=<=^===>>%>%=>%>%===>%>===n===<=M<=<>=>>F>h>y>y>>>>>>>y>>>????@ @P??S?????????d?d?1>>>>>h>W>W=;P8>0'f!"<")/6:~=??1?d?t???????B??d????S?1?d?1>>y>>>>>==<;974-*#|n"F(}.r48N:;<>F>??t???t?S?d?????@@.@?@a@r@??@ @r@@@AA @@A.Aa@@@@@A AA@?@P@?@P@@@??t??d>y;81'1 n #)17:<>??@PAAPAAPAA.A @@r@?@a@A?@P@r@@a@ ???@P@??d?1>=n<5;@7A4,-#c"F(/K37:<>%>?B?@P@P@P@A A@@AAr@@AAAAArAPArABQBBBBBBBBBBBBBBBBB/BQB@B/BbBBArAr@P?=;03'1^$E+x29<>@APAPABtBBbBCBtBtBBCBBbAB@BbBtBQB AAAAaAAA?@@.? >%y?@.@ArAAABBtBBBBBBbBCBBBBBBBC2AAAAAAAAAAAAAAAAAAAAAAArA A@??t=91%D^%P-39 <>?AA?AB BAB BbAAAB@BBA@AAAAAAPA?A?@A AP@@a?>=<95+ !"S%w+159|====>>==========>>==^=n=n=<<5;:^72*" '/h48|;`<=<==>%>h>W>F>F>h>>F==>>W>6>=>>%>===n=n<<= <>>>>? ?>y>>>>>>>;:::::::::::::::::::~:<:<:,9:<872-*&!F J")147P9\:,:<:^:::::::;;q;:::;@;::::::^:<:M99|9,8886f43H/h*$S" (.*247289\9:::;@;`;;;;P; ; ;P;q;`;q;<<$8.776V42.)%""&,146V78l88l89<8899 888888888|8.8N8]8>77778l77P66v542.*&m" %*/Z24J6(7`778>8>8>8l88889 88889L9L9999|9999|9L;q;"25# 55 X->t{n%;   +"! kz  *H!  4# _+v5*" *"'W(mDq .  '=/-: \FYHAw kD0-9 @+%rZ$" jF % 3  >0 Q-'F4-8 1!8^/l "2;''?"B3''% 7&TC%) /83'/&'"6(;,#4&"*Y,3< T#%$$01,  3F+'&2re$1a1=@.&#*R$ 4)()8!-+ 3(#>*?&%*_>h|WN2+'C!4_%;$ !2 ;+]v & e 5 -9)GI/ - "=(K (+!  #%4   4,' "#"% ! jK $   &2} "2%) /! , 7 '&(%& C  ! ,&".  "! *   0=4 3@@ 401!) 8 " !)=58%&&+< ""*> ,!.8+ G+&,( # Q= !'G/ -,H1)&.-*#! V*9!& 7O:&$+.$'8>(@ ,$  H:^c(b     H#_;L|! ! 4  *'$0K4 kc;<lu390 A &Q5p#| `%(%%/4 &C*!'050+:&!Xo7~0-#$ ,%"4*! qM'gDA/(7 '")'-8%#"#$% 9? " eev#4& - 6 ;5gRj%#7# ! 0$'  7 '#2%," mkm1B'%7  ' ' !,4 4$O$5($1& 00#"  >bZ.,+!++'-'     ."' 1#,'$(%4&  -&9+ $)*0),4)$#& *#  ( B !**&.$  N&/ ?!" ' ./6 (J# -   ! E.0;O68 5' &'Tm  *,3"<&? )& +1 O+"3,')  !36D3 $' )H$ 7iv % 7'& &+ ,  O1 & +  *, (E YH%!#0! 61&&0+% 81'"  '65$ 1;5 , * '1))"Q.% 'T&0 '(2# ) # '5&)%+ 0"&   " "%  " , J*1"*26$' *3  !&,:' .>'.2B$'$%%  0*,2&E1 #!'(>$3 AK& :;:A2- !7)').?.8))(>2560 ' KN2+%I5$$0+)3:7 5  '' "& 5#  $% #+#<3M6$ &;!/  !+B.!%&# '% "%(  '4 $   /6  (*+#%8  /  +"#  ,    %'01  -B   $$&$  !  %" ! %M .,5 % 8 $ ,A@ (7 A%/ 2! $"F+*49 ) (!$'$(536-G%)+&  $? *B'$" 2 % ( +7" (  :)$ +A; $ #  !    , !I<  9#70 7" 0 !%'=&!+# 6'#:#% ". #4N# +72 3,  - )9 -+$  (9 " &" ($! *30#) /  )%,9.20/D '    (< A)0!" &/+!5J#,''$$ </ ) -) $  6  +8+2 # ,>= /.2  *3%, 2N$4 -$5 $,K01- %+L(0 $-!<# "$0 &2 ($ )* 5e!$' 2(( $01) *, $/  7>/&% "0)1  " ml"g %($ #  $   $  %&"v#_/d * $  #  XH$?eU !  ! 1 3 # / $,$ ){Zo) %!# #6 GM 8 3  A!"'     ]w'\v    D< +   3D"*   ) B ;  " '$ ,=" &9 )"-|c"= ;! ! " 1 9XU;(& " !%'%C$.4-,<=J/!5]h<#! ;" $6> ""% 'H4  > & 33%!%1-5-+K0#8 ,%H;4GD, 4[B#2!- %(,C!4> ,6A6 & %/> +.)8,1$#++ 3&-:4& %2" (,;""   $  $> # -  '$%+%$<        ,* ,&)#G- 3 8  !#6%)Z0 ), '+&0C 5'= ">%#& (4  '%$ '! 6/ 2<' - 3;$!'/!v<" !/0'G' &<=+'6*$ #(*>,,%#8&+   B," 5  &+! *   3     2/ $ +(" 4+  )    4% 6< ) (   -  &     """%&  2      !  &  &1*  # 0&   ( %$ #/  $   6 .   ?      3M      * 8*+   $ "#% 0 0 "($  1 ./,&1 $3+#5#+*1!"(  #(55-D!! 0-""%B*+ +.+L DF#/5@%&:(,.%$"(>$ % !!,& 66 D '  ! #$ %3 ,   ,   ")( 1' $ 3 &2-$0    %  / 7! (! 4' . ') -  @ ()" % !(6   ',     % ' "#    *  1 /C  4=<#   9 ( !/(%*&  $   7# %5. $%#  *# & %4"  9 2 " (27    (. 4!     $     #1*   # / 6! "  (" ;,&  #*$*  "! . !   .>8 "?4  2   P " .    * $ 0# !     ,  %   !  %  #  ##       %(&     /!     $ "E'  )"   -! &  (   %+ ((%          ,/  '     4%&  '   '  8%  * !   B$ ) #   -+9 D + (    2 3  !6##^KFt/)  # + -95 (Eih ~ * ' (   ;;  ! +  ,(  '(% 7   #   "*"+     4&'   ' !  1! .  &"  4     *    3           * %      )".#  /  4 &"-/$ "%*!  =&@&!"+)4 + :D(B  %"  *=      %    (   4        %        "  &#    "  %  '    %           #      E! %  $(  ( "9   $  #    ' '     %-    "     $     #   "     $    -0 %& !        #   !"!      !          %  - " #  %        80\b5,/ :,A %@&$!  91~'27W55+ (  ;mhw/TZH865  Tz*AXG0K)0" %/kK&+0#B&@" !:*5 &  -Uq]&P4R "  19=D%)*    EmP -wI <=?0_D,*  4>n}n (iY 4B 12 1F~:S4*YkB N(" A~cE>$ $c {eKV#> P[AA (k"8"C[ Q bd.Kg 3.%[VJ;< / RWo1rwev4I[ 4:w.+Q0 }3@?'MwW>A&va L 0:@|m)!P'f0D\(_I $-yT ;F;= Rft]_h`   E2Z1,&q[A]R   G\r+qv I:O/WD1* /wrilV<EL D`0:gUnxm3,&5? (21QMkXad7>h>D+ . %E#   "#%I8J!  *. "! .1\-  *0, /(,0 (0r{6?%B*#  L8c{KV0 .(2 bVZ;/9     ]zT#   +#Ty'! #(%   !' K^L37+  +  !)4    !3  $  !      ."'_L"1RE!-)QP(qfsPMK'1NN^/SSW- $\3(Px ,pQ<D' YxFS3a)gh jpZWV  + .~gt\S_ x+8 s:*;zu iap { T}} sIL+TJM  *\TZt  dU   % s$1Hx oYvdJ%,c{Z aX'rVX  XKd.  Ru  n BCVmjz rq!>`YT\ ~ {|s ~`  nsUu   ps_hxyhYq pRt:HsbAi(Ynxr w,Fx =%@}  ;*Sbiuzz.N{N4 .Li } ' j   ! p^     68  `2c {Z@._GxJ !aO9(OxtIL*lckbuB 1  D             2.. q| / N0N: ikM  ~b (  &6&      #&( 'D  .CJ07- 0 $  % q   q^40y$A+   w\" >  <5:  ""2(76# %  "3HH@D 5  *BA) "     -  9- ?             %       %                    !             %#"( 7=/       $      ) -       "   "                 !   -,+     !  $  )  '       !    3    sj}  )(x} V Wl {L;00  " +a?o    @_gi  ! _="  nt>?^e    .xOS   $!y ~E< = OJp  ]~y}Am u|*Z8r O&`T 6 t{+:  (                      6   "       -    *    F       J )      ^E &- !  [ U_p  8 ~dG u+/ Wc  qWxW e R9HGk(]b  _*      !     "       $  ! "   ! $   % "  /    *+ -  C   4#  "  >          #     '(   !    ;  + 8!   0 #2%'$  ,  ( %!         +   )     8             " &  $     ! (   &   %  ! ")  <  6!  +$)   +   '( "          7 )  -1"    ( (    '*=  #' * "    + %D( /  $& 0$  ) !0+ ( : #*          ,0#* %D/ &+"'  & )! 6   +!'( $$ 9"  ! ; /:   !9 4 !  '+"5("       (:! %  -'    ' 2  %  '        ! !+   -+ "    $ ..+0 &   +$#     ($   #   & "  +0)   !     #  8+*'%+ 0, #  #-  "      &- .# -". &.$#0 7*4#--& . %&*% #)*&  0"&  #    5.*H !   !'" *  $+' 7I ). 9! , -%$ "$ #*  >3 .#'4'(  ( ,   '   ! "$  "(  #*     ,   #        #   (  4 "  )& -0  ) 2     &   & C! #  !    & $  #" ( , (  "   '   )     "5#   $, >84' /#) "   '0   #    ,"?*3*)=# #,    $' "' *  #4==!  7      " % # +    - '  (#   *5 ##(',   ! $"    !(   %         "-  6x_l1L ( $ 4y9Q=&0  $37$- %-SM+YpR1,- F ?!"&(3C!G-cit'm=+,/6!$1$%@49 0, 15+'#8 -%[zX3%)    B0"#(6- QK[F<?S* 3#/ *)$$  "(% 11 E 1@VIzQ8=0)80*#, $+ $u .+/ 2,- ' '/,J[&"*     >! (  $"#.  +}8!    &%' yaoy $; ,1  , & .  ' $  +6B/j+-"    !    $ '+*% .3,@[#[,( $  +-'!*3'$ !( - @' 5  //t&:)*>  ;)28V>$*(!0 #&   'L^r@Z,_b('% 0%'LqR 38  = -!/ 2 &] ?q`P# " #4H`e52< 4#" #  %0!-K}tC=UkJ#  +' *  #3GO(m3(  "%@   $4GWOC.%M  ,<\G* -% '38( Lg 0 (( (" ,-- !Yk 2#     !        .4   E  /(7"9$?N2"    06  # 2 %4" $   )!  # %   %8   '      ) B    9    $    + 5    *$ 4 /  - (    (    (!  *     '&$ <  $    ! ($         '#  &        !    )    $       "   $    . "    $"   " $<#  ,*;    - "-    !#!)  @$<! #  ?=h(`  ) *)$$ 0 $'  6ch8t 7 # #F      N@ ):       $  =G~#   +$   !  P1$uW)  4 _z     '#" zNCa); %  SV# -)1) vvRw (  <- (& w#    %,   GSf0b~ 1   vvpq 5 3 dKP],  mn ' *:W& !    *    >      ) ! %   '         "$ %"  2*$ *'"  ! 3    " !$  +1 / $%$ - * ) '    /  ;3  '   ! )+4)     "' %D  . #+  ' 0 $!   ! 8 !! #)  "   +!  )) (**   *.# -'"  !., ) B"&1 1.7 !. % 30/  E#( ,#0*/*  8   & # #%1&! &,  '!,    %D6 */    %         2" ( !$         # $6 &)  / ( ,6)  #  ,  -& "  0  (   * *      !-#   7%  *(,<Q$  -  * +   % )     $  #" /  * !  , )'  '< 6 7.  !    3 ()% # ((%' $  &  2 5 '!    '%# $#&   #&!+! "!/  ' &   P* $&2"  F 2& &   + #  %/*7 % #*$A(7   (.#&1+"@* %5"  B0" E2$&*5#) 6  "'(*%   0   %:0 ,"    #$/C 5)3 &   &4E"4  ".*(;   &$7" 74$""# 9:. $ %'$/4 6/2!%<4.6 62)" + . ""$'  3 #+# , !"'% ) %!      &     !%# '   &" 5    !  & , $"$$ )>9  ,& ,)   '%(;'     =    !'# ,(,  /   #    %#"(',   13"3 )N%   !(  '2$,     3                  &   %  . ! "   %  !   -   %    $ )'   +!      *  .   1  " ,; %    ,   +    ".      $  %  )   ,       %     ) "  ).!  ! "&    *-# ;  > &#  +   , - 6   -   " 7(  #" !$"  "  ,$   " %   2-  %5   $ !0  &" *       7   ! % # $,! #       &0      " (+&   "  "      # "  ( !  .#'     -  (     : " 7A"." !/   '" *-%   $' -" J#"(4). ,4 (T* . +    . # 4#"2M  ;. +    !2  ##-'  )!"!   "  ) !)    !+ . )     '   "  -  +  (    !, &     '% ! * , "  -*       1- ,) .5#) "    % *.M" 3. !$2  + 1 "6/    4.+:!81  ,  2  -  # (" %' 60$ (  '2$ -     $$0 ,  ""*$.&.< H4+(9 "3 L"0 &' $!   % ( $%t}= %  # #*!>!  )>$*%4TON!o  "1$+ 8 7"&! . -%#< i1( 0 9 !&) 9 -( &'= D$ ,&$#6*  !  23' & % 4 -2"+,  % .!   *& '# )+ ! &  / sb  +  @@) w $ + '# anCI"!} )!IQqa) Kv7)}  # %"/)2  m>!p"&$"9 RQE?BF  L{>eJIl+'A )'#  )"' SI)H.0  %-e1*s{  0   % &  $&Rjv$r:"  .[SI$ ,# -% ! #(%% " ,Y{T/c  / +9 -L<Lx_de= &-  - ,ZOj;KEUm]/  6# +yuA!" &  4!$3R"#W'   , -BiXPERt  +.;/? %@jH%/1%!$*!(!PlE?8>YqlVJ30   F'( 9Z()Y3/&   & &3  &;mVADGMZhje.-$10  " " / Fde`}\5! '& # 0898-79;@KUQGO&&  )  " $ ' '( &(:ONT wUXC&"')( #"/J*580,0+ "- - 1   (  &( (%0J>/G;    + (5" / -"!  $&L0$'     !       ^ #   '    gL     *   3{A !  Ut         +   2     a@. {I   78   \2     "-                        "EM)   %   "     !Qk7%0    $>4:>3'.,  " )   .H8R sln -  )B<lm[QJE.   , $Qe2c$ ( 4  EXkJ 33 "  3!   1z cXO* !!&!%).sN2JNcA%1KYE DiI(0hF    %Bmn{:+FREEK9     '9U, `gS'#5F1 %*18@*" &  !/           )%:/   & '!      " OM!2?(#   &#P&2     ( T/WQ;4 "  !3TZ_ ,N@eA-( ()7 %*%V\!UV#   2 Pl? =>F12#   ,g"<cV< 8k|g1 )Qx4   8e: @x>C/ 88A(LZ=  ?loA,5eT 0C9+" 9{mH#   2XUo }N   B? .Nd@ #  5/Nij. Wf=!   " 1" %>N?45    17c]}O-+A{`  '16  .4*  . Au@= )Fi7&&  47@Od|.20>GY)#(   E?1U^4_%+  78S_c:/49ynv' : /* "-*/8SRPygE.:RWIE )86))*?>7$' `T_   &     )<9G5%5m33;* "'  E)4"D/8 IWQU%*%  /' + " "/C<o{c#:.)#! *$F+VZ1YR  !   &4></l#     H_sB =_Q  < *z7(pD .   -  "IfU:'VlG',    G*5.VB[lsr6!xlO* #  '  "+-1/3 JCs/ 3 , !! ! +- B;F7D0 _p|_*  &  '" :U:= 5$#6#  4,+ zS      ,LK%\ & +  #E* LnD7  )! '3K+:%  +$   '`T +swN  !  $;=-    #1Xv08+"- !  ! KX&.N: ) '$$ " , ) 4 z>#   " - '   *' #  NF 3 ) !  )$  %   $ /  /%+     ?QUHEo>7     ' 1(34  KVkWRD0    +C. QaC8  *  *!  C,wG%*  !1 ;RO*bqW  Ei]eey-%  #$3&('!QP9*  !, ! %  -;?:>*F``,' + ( !<Cd4@2^I1 %(   C2EfK   "1 &.*#.4-   %  g<92 ") ':G;F !"$  ) ! Aq - ;)#Oc9%("28 V )  &+3/ 6  &  3/&M"- # %&    -2I  &/ ' "   0  "&      %  I  ##  $$'# " <" +  7qg 5bOE?2  # .L'4     &   &.&ubA  . %'4c<!'PN3(  /3 &"#   "*HxF /:F&&  $  $%"    -/ &#       *        &   3 F-~ 0 &) & *   ,  l  -      +.    )^_!       % E           )     3  ;    -     /      '    ! -  *       $/ (  2#$ )         -      )   *+   "  1J  "%       $#&  *. )( #   '   %$=>, &    2=#  1 " $42#   -'   ;F9/9-!( %'  %   7{&  '2 :-   Zk4%  <H+ 0   ! ,K 1  #=B ! ".    %!  . *  !     '     %   #) 0  *   ;2   " 46&# I3,       %''  "      '   2   !,  1     %   &4-   %  ! $-"  8A.)=   -# ,./ %2   %      +     - )  " "    5           "      ' '       /      !  #    '           +   *   %   8 ) 0   # 5      8 +  . .)    *   '#   #0   '+  "      )     %"  ,  *  " &-#      * !  %       #3  & :-     %!-) , '-: 4*. %! $" . % <,  %2 $ %) 2   +  #!&*      &1! 9   "  !  5  '(# $  '!     $"-       %     )  )  ( '$   %.        # $     1      " & #     +((#+2# /"" * 1 "+&#3 2  9*#8$%,"&  /!C4 & $*. *  ) 2! " '+  *  %  /   % ,   % "  *'    #  $   ) "  -= -,   $ "(  !    /&#!JD ! #; $"' #:\uR+ % %  9O-Bf "  FNH&  ?:p}g9  )-4qce  &HxF(DN#   `E{;  (!59XW? 8jXD ,( * 8-3%  . ,! 26!#+  DOO-euO7 %$=D  O?   '-`}d:cN3 . ;O39HN+ " .%  >_,=|% 2 &" %#:;aS:1BG#  u*N  8Mm   dUX  A_  0.Q.     0 '$($  $!  ! !1)#   ' )!-*      G " $#         , +"   " '  8/#    +      "&  !@* # = ! ""$  1.! .  A%  ' $ 62 %! " '.!  *1 4#  )'/ %-C12   ,".! (B= >U<(   :3J0   (P# wR"     IV5> R" $   .=Hx {;!&$ " &IWUcaigV$)    [:Q[\, 8I ,!      nhj !   {k#4   f>SA[ /  U+>}  % T:       .E &   $     (   "   '  #&9  ,$  *'%    &  $      6   ,    " *""## *  *  ' $"  2)# ?!>(, "!#(-' +#   -*"(RA2'##)!!  4$4)!) (& %  ( ( H ! 2 < & $&"#"  $($'**  6 /"#,&!80)>" / 'B&8 &0     />( 5,#!#7 &#  !'.* (3.#5I< F6=-  ($#->(+*"9+ )*9 $   B>& *   & (7 *# $'    .4 $6" %  #   $"!! ( $!"           *   / -%*. 2#&!*   "  5 #      8&(/  )<! .% "+     <,   3 " *& &  )$ (" ( >" "1'  !  - #!&6#) $ ! ."989?      #                #      ./  -"H' )  &/5 &  3F%-#3%+   46    # #9$<$   ,  4& & + %%&/  . &  (   (" - % *$ #    + %1( 3$   "  $ (      0                         #      "    )    / (     &   ,  )   (     "           &  5:    "7,$    46        % #%) 5$ # 7> ! ;3) 3  %  5  %)      "         "     +%!'#8!  1,(!  " &  +?#LTQdf?{o   !//MzD(4o: 6i~b&$)# ! 'On_JJ Pa&@42// 7@2p:$H7Z*O  ,+    &Vj@x( b6xV 2"##2MEX~Bl x`^  $B[T!\l` '7$gf HpupN{*  ODK7A 9\5/5OV~Jz &^U b&A8S 7 Tfg,,;   7Ry(7Bx%>uk2LZZ(>    ($D9AAi]~nf i! (: & %SW&^  "0%!$-CcN! ! (  " N5?VU% L. )bp/E=V     E37s iI/   4LlJ !Xu%  ,   3&x T 0 .3 $$8%E+F '  1% RM.! gA0.   9 ?nFO<Q:98"  'lV(4ri>6_U% MJl w0._"78&# =(yRxxB~L[L`   !+ VQ"hxc0x"-  l}(|K+Ldi2 'Kbi~_   )5jL[n';|  %$zHH*n2  <%PHvo(lSY7  +&W6&{RPOw#(  %*?GVR*,""]tUxj*"  %$CL5CX?H. pj<\ +,5Hil xj  % ":-=*hPM( ~[ *6Lc;* (.x~ % #!&<VY(oD4j 2/ ^  %<$EsBvJsq?  0*g\hk"KX*(&k ((HP4]qYbX  !#+'0}~]Y~"   " CTt plW   $0$VLpS]BZ8  &$/Ml|zY+o.' $( ( L( *!0?SQ9*!-! 5&3UnA   *HF(  %  ',cDf*5 -   /,.3ASF ! ( &" &  '+=cD #&! -58F?      F2M:, ".;SS5     +3=B4$" 8YQ(  + $ "E8ek} -'   .h]]A)  ( 2 %!5!.{le&#  $#C-.idzP  $!  & D ?}d }7Y  81 <1 C'4@sU%Rs '   $)SQ'c  "5=oCj .& - ;ERevYh& # **Qx |S   ')7YEW>y0k%x  "OwX,25y< / Q3It & 2?LM !^B/  $ .6g, X|c" "6!D}awu'iW>r( !%$  $;!" I 8^M$0 >}LY{F~ ')9&'6Rpf{x,LxZ'/ 2"?& &'  *'<4L<<b,BR &$#330 /!"EDQcm3>`8 $+&@4?SrJIw? &%2>15.`_?DHSj' :,0[xWk*Xh\  '"!lg$Q?T4b8L % %9 2 "*G]]60nt#Q$ $ # (2DaAfEx:kBZ:Bw  $), :J[.XTeF\ /OTt&(Z X{  $0CBgv!b]FY !.%!Azt7/3Vp>-p   Yy{{rW   .DjAHt6]4h' " #5[7k 0@s(` (!)8+^)<wV   !4k+H AKkS%a"ta  #^8IPlwd"F #  # + E$\"uHVw  1Nn:Y\XE7  4 Ur+&TmYOqWAp* !^ L $=BgT [;:Pr   =O,[VV .&5\@ZL}yC"  "    90+#`Imo_Y + !$" #:a~" U "    (    %^gvqR5u!  *AAZw65? # " & #- '#%K/nK>.Mii)"4 (    B?FZvLcKa 1  & *'( 4M<>cVm aw "<# .*(3'"4L=+]Y84& % " )>l`zg,sNIs *  10Je`q;2i & )/ C   % *kr?o9N 2 5/4Rqbp A:I#  #" ( ""'$+" 2_s#o_JJ 26B3TP4G%!&+ 5HwS"K_  I/:r=c6ti#% *iP&9S&)+ <8SirXn9o}%*N1Oi6raBN_`"" y !(VMKo'#Z $*?%A d{.3$ ?a_6)GW4i ' 4-Uj^NV#) *%anaS_b    !( 5JvyOz   '&1"dVn_8>f#   %6N}g5g~  &#% >%LnfSjv  #  .T~(     ,; kC ) !$& ,6\dJq   L .6XaX,u   4%CDU!$3 ' )WVkN /  !#+ +Ug $ $  (g]g(*    $?C\G   1 RmS 1 )# $ %- M H~@ !# :<za5n/   ) 0 !0 T?>Q3 #   .(0P\Bj   1*$9$7RO.     4  24PnE  +N: 5;J0 , ( )CG)   9mb " !'479tk   !%"/%mE  ,=_oqS$ $DJ{p?#  0=tlxK:nfqw!# (9Ed(`2uy   !"A#]ALa;35 D!$ %3:GTU/$j " * 2gn[(  & 'NuSB    )*4s"u  ,:@(:q"  4qJGpq $" "9% @ C 1 #,  O1oYg%""(ve  uSw#L K"QYs^ !   . .&2Fo ) \    $= =f Qa0  " (#z:w|+R 6# u("aSL 8]r#8e UWPn0    [z\a?4D ^/wA " 12[Uyl@3  Gi h,=% %* > "#"& /#!BeB^jGo326%  @JhQ. "% +$( HB6  6"%) 8/  , #1 55 &%8?  2! 5.&."-<$1  )1 c  /     &  ("  ( 9 "!  "# $ 2 !% "    $'  +  &: '= " '   .1        '-#  *   !)  3'. )  +      &   + (  ' 4  1  !   %  +    ", # @  '-  4!)>1 0( '" #)  (! ": " ?(% ""&(  + $   &    * !'  . 3 ""+    %  "%    (.           %3 2 #*[    +! ! 7  ,! -. # %!HI  % !3y  ;2  $).  "         "3  1   ))    2 <   E1< , ) ,  %Ad*  $ 14 :T.  ! 51tYm/ * (  D\xkw o!M8   % !Fo_eBo =d>2 ). $aOjVXJ:) <U2'6 g`To>OSJ2   vFw <C)#  c>6!OS6  #c9"  < + b/*I*(!  ,Eaz?uQ*  (wDt     5%KI4bC_B$!! ( \|e "'  VA&S #  -A2Gxm &uo`Kt  $" #'!!%8%BT>@QXZD~r\#) /jBt-$#!. | @;Dt% o6| h-Z3KMZV{W [ek  -, RR<}[RI-  """ 3 0OT0{< .LcGA|,]qS   &MvzahV*q0 B"A~;& @3;!  - >?LwWoxz $[Y#9 )  %%=}C^8$j +-& +es>  22uw}M % %$   ^lz ! 8 &(M0F~ %7' B8W@ncbX@|. -s,*7/g! &BAS%gNX.wz  '  %85 9'[6(>w2 9   @D(BnJN`TY $ .   EW/iHF 8) 24JjE._jk ! ( $.)#<w&[7 !*"& '[7nsC bQ#"   G)>oKF,rU l"   '83C8Xygjx  !  $8LpLk2d(S   Faj* f!c@J $')A -7HVflTGt~VXJ "$$!--$iRAjHL}G   % 8mZ VK:u75_)1^Qe<4pmX4z  -! (-X.n3uTE`>^,-01*5)lB|trV2(1+((FR}L=ro:$H4y)33$,W<"dX (M6s&%-:Cr  PnLB#cf9r (=d'S@_B,e"` ;x6 Bibz  3 5G5%/3DTb\\  K*X`}T  FE=?d"4h(e_'2q7W2fu46 .+!@/R=OUt[\9w[=Ll`XfR}(B[7MEA0IhWn{dt&=t #1 %:M/NYo|wt,nF h6d\kAb9_i_,NAij7k3K3I*Jl !$('G:9j{`ViX`0ox=u O^HQL4chr%zH5Zu  (37No}e.oZrCTV9S`A2h!.JPO- F~Mvot^e\AK<ZS.(Nz7 92>: .JdrH}vxp:UBs &#+(! 5<<fl< 6 n w-w[;Pd_NQSbnr @a,[O]=E     .@LcF|b9 J |#q ?94OkE P \%hm8NH#+Zo#.A<XRrvnV8U  ,./G8/ t =8z ^'>J$3@f|/@:6x?virhC15    7@I_vK =+R dm2e,_2.$SBHxjkju Nr~dOQr}($%:P\esZdKe>>=SnR8PEkf%f ]lt![b $(! (6CSizFN Bh{:vzJ:\4'Po]7Jlbt&zR\fYGW}<349=Qs m EnP<3q/a@OjlWT W|aM1<i?[kd`EJ !   3012T5~&OXfFd\+hY>KV`X.pj>*Lo $.f    '*"!<0c,gif`%F[ <6))F*G]H&M:0ByQk "$%KvEj#H$Jdj, "3>5-[_mIZx8tT 0D ] -VDJh0:T6` &"6W&;SB`; _m   $5X|uxDi,/ ;,ZM_%H\f=&?LDh      )$HmS<>6""]1 HOPb(v2e6p_Z)_! ")3[,Eg(g g8B /  ;%M9#Ev"`@GnS:A&  / (QK:Xot+&3$Rde6<e,ey*n,$ $% jyw " 8H hj]h5  '08VM&RMpVDt7ma$ 9 ##*;B^XaLfbTI~ '+5@AR^ ^0nRSLS   -@'z[3Y3: , &* '+.?b{xU(r>StL )2?   4kB /U h 0 (@FZ[dw.h6m`M  Dyn(|?&\ jF(* 0q67+Pv((9q .T%eQH "B + /@U 0h3k( t a &25 DZFaaeVLz*Z-9 W 7"$*!+GTXkwXWqW'}    ."?+|$N=4[TR+o B 6O>@[H,3i}z2l#   4G17Hj|vtF9 "%%h6   #+`Ph jJ`/aq`y #  ,;boT4`4R 2Le $9Q{%Go7Q#$m '!&"7,3AW1Rt--e&-- ,, *12/.!\Xt"xq7zydqz  /  !NvM " CK75. Q     1nm4WGKT ]   @"&%, B" X0(878f6ws&I  %0/sU uD v6,{ +)80EK_$R!:lS{ #" -" +/YL)m0tHP *!&,4<:ZFw 2l1Z[ !  " [qbovW\{d&  (2^3s@{M:8 ap       CNk<^o}{ 3w# '(&>(5Kf-N$V?sr   #6MTnZUr'! G88H_fE AHp   ,>f6n(D`FT@/P9`z>52,& N? !   ->Ke4)3`($$z   !=V}|Z tB -$>VRhlAFP 4'vDC4SAc96] '$  97@UAQQp^  . Ot TA}!m!P!!    ' aQ:Mn .*)8"/2&3T<nwj 5G  ' ")>_W`e#&K 'X8!`*IB +#    )%ixm0cB\ > - *^Q@{: " '-' +29BC&`),4",=:\XK0@?.[  !V2w(!xa  71CwJ\enLjg  %3 <6%=y+{:JVH00`.36^j!XR2fTr7!$* @JQ<$`} 1&'"'E2aO6!/ Rts * -!-\wiD[HfTVL& 84qU,KNO`O!!$>7K{=nD|~';-'7*(&COStlF# &9ShC,(RII: 3&#Woq,e|FMmH_^'$+f_KJx*$",mD  +,0HmjFJ-d (   +-X`$XTjN#)006D6I  '! 1%"f5Ya$*#dB(9 %1     ".E+ P%  .#EE6CX " 6! #  .ZH1  "47bzB;-  0$ '!3 ++3[?^%5 #*9Kka\iR %    6=Nu&DZjV1I   (KFql!K?w\L2B $&  7GK_;qZo02O>GNa zKaW{ 6Tp %* /w~[5O,w8A /#"VQkP^:ddB4 .A  0 #*N^7,7Pen5p " $"<E;i: ,V) & ED.<~~[C 8  #'4$56mo.Ks @   +[~0Z.G   ( N;xmN WNAN+     'H0A;AKuA?5_  ,Xyg2j5YZ 8NP 2)GWGfJZD`eL   #N6Z ,& F%2{XF f8x>.Iu_xto=p H~ =0W:OoAC0c,';L~]'.d y 97bdYTMltO  . 2WDzf  %m[( -`w y#  #   %>\l`:l  %1!,Yv&AFL!+&   -.8Eo8l3[IXB"s    F?H]|$\< cBS $  !1gk bB  '!) B,Ze}^zHxO9Fi) C", /     ,$ +?:EgUqh&#' $#4 ",[^xZFb 7  ,!%   SvrS5hO +7W*GTPqf   (JKUpG+ = !80!/K&sQIJ;    1&<R{gy2|  #+;CW~Hit$ '   " 5CroI*>8+(!%  (  '"1IUgh H@a    9( |{6"% .,W{)OA   #!Mwjjhm'!  !SaRw '  &"#%:Zc74n  ":R]oNJ   g`PKt   + AeXD   % #  [>K}OxA% ?7' "(?de(.  ,# 2+"E^ - ! \~8wv .   "   *W7ud\`  0+% 4?}    -   { x  $ 0vA$ U$  " 8 $ q.  *$   );X>U -Q   ! $ 615m{5%;  $X_5{ !&,'384'9Yt=   &(2('H=-*MS4*  2"5\aS^ZKi[/  A;cIOX\6Dm     &^_DENN`/ % 'D*qg+M  + "C1<M=U,|OU"  )) WKH1mV 5    A,WR=R)+ ) <%=DKAb  ( ($vUN-G8M& 1G-)%    )(QRUdJ " ['85*HR   ,1.Q>n& 2 &>D ^b`(]~ ! #  6`-B(C&#   >9\C . >    "^0#*/JD   krS"   OeB- ?s;/    -R!1 ( % !2a )  $ % kR$   & K2"!!$~< %9  yU8]ML,CnV>   ^d@?lkM/, (soURN43\"*   /(" PSt^L#   |aE<$ +:*,8:  xhr_  $ZMOLpH  |Qh_zH!A'/  RERrR! (/+ _Uu-HjJF # '} Nb~eeU%/        <   )FfgVF     2*ED<'&-  '5  $3" 1  %9- ) "     * "  &  ' $ #   1)   L #  !  4       (# -(      # .  ("    $   0%.# ,$    !GP?2 "  72      uz<  #KO1     486A    " ) .6         ) $( - *'          55"    $& ")!" 1    1    & +A   #1         &+ 7'  "$",  6  *   $        8" ) & !   ! &-FL    )   2   !$"  #,2'&.  (/)% B( ,%2+ -# )]76-!\D/# &U &-$,z~F  !*0& :7 5<//+.<>' ! *   '']H @962*% /  2A .)   &kAF  +P 6   rtxR1)% tg$.  |D@O8X+D    kOpA-%    )  h3z9=>^eAg% sg6|YUFF )  }e^S K>R2mB3 Av55|a/8*$   <F3y   M#6gv>#   " 3-|TJ  S-kL" G pws59#iH0 S p(S' '   *,N1wAcL\Q*+ n#O"\5*  7!2h#eHPu dX q10@"B#!rDk8VGg/DhuVD^?(--&! 2L`NS*(= s,69@ziE! # KnB Y//5# 9JJP0LBJNFB&(#   "Ukm&8k$;Q?  KY;.(  "  Q,B7iV% ) 'x4.^T`9M4 & - pl`Y|8 "nl4~=  (*ZsB    )Nqve?5*  4 +  "<@QR@/ # "+FQ   3 # &7#!&$ ,"M8'* 6   'EV'   #*)  6 %:IJ0   AW?  $ '  7dK6 "&   +QK#) ' '@  Dg9SX#Nr]J15-(+,9ci1$ zl0Vjp{  : wNNGawS7 ,  w/d=% #1, "jm]7>`Z c&g)&(.T2+xQ-7JY  j@*"M&]G $ #$ ( ZJCK"`]^O\#! $ E\b[uH|I %57;( >U3BT6'#$j/5q3>v`F{vQ@D>+    |=YmERhJ`< j=E wBB*  !   ; -)Q,$ 14 QBFl?    Rm]# vW{A#!  ' &<_J;%  $ (D#PM3'$  .  78%. $ *  -:<,E !*  !*8  30Ao/   )@*-     2G- "  &AT?)! 2  vS}A  -k<. # D=%   & CE9 !   # '# !  )'!            )"  !   #     !  #'(#6;$ E      # ,J  !, 1" #    . 0!            (! 2#       5   %        ! &&(  $#"#   <'$   "      * !&  $  $) /   >M9 ! !,!  7R=#-$ GD!)>  %#+   !-, /c= 3+)   "  $(&% "  5 0 @, -   1   ! * ' <&      (    '' $ . -  '    =  & )F (% ' %      ' ;4!,   "   4 % K."  (!  !      $=2! ,(   .  ,(!( $   " ">@& ' + ) !  )+& $ ,# /COG,#&  ( $8 =24  )  +    , ()    %   ,'       + '    !   7        ,      #&'     5  )5  $+=   +$" 3)   $  :  40 %5       $     !! ! 3)  " 7+   $'   *"      !  "" +  %-    ) & # $  #(   ) '       )  /3 %    "    !      *  &     "   $ ! & 6XTENSION= 'DUMP ' / created Mon Mar 10 16:13:51 2014 BITPIX = 8 NAXIS = 1 NAXIS1 = 1184 PCOUNT = 0 GCOUNT = 1 END Ҩìv#zUrY9) D.`s{5Z )4Uh@*wt   m- $UUUUmv4v8!^= $ a|vc)86 9qٸgwʧn7Ŗ-Z^7`/."+!%!%  1&#-*%!      #!,. '5%$1)#5@F:HVDE:B2&!' $ #)##-! ".!!1&<!$(338,+ 0&@.A<(5,-&  ( &       %     3~Y8     %'-.2,1$&!!/%   $   <:!!,EHH9?213,%!:%(=")42+3.0D'1."       '& -!#&7-"5'1-12D16<5%68@2-3,1,55&( *,/6      *    !;/3,);,030H1,'."5   ""# $*  -,!%-$&3)!+!.=7 1F< EN,6#  ! %             3OY]];!  (3" @&,-6# !      :6C&>:B>5(6(4#$G=2#(0<070 +17!+,       (  * ,2)&)6A+ ,,$&++82$")  & $            (!($/?2%0$&41+9,+I;!     #$  $,(!&'+-6 ! =.+(3!&    &             .)1 &< $. . *13+ #,!4 3)1 P]>8+1).4,1:+(+5(;3+(,#<1$'    (* #       ,=74,1&(#'@6+C*37#/5($# "$ !.'      !)2.'6* 65<0*$"92!85;.' *(   $ #   )& '!.=*((/$ &$6--                +$  "2       ", 5YE1"1(0' *&:BDEEKL1J6$217=#&    0  %*"#+$% +%AK,'(#,##)0!,-=3>3B',1+  %""! "   ,A    !-"(4 &6%+?C17C./!""!"    )&!  %*(6"#)1+)"/-0                 43 &!-%  $$6"#$$&3:-%%>(3&5,  (-69@_TJ]@9%$9@'1   # $% *1((,'/*)*+3!!(#&!%,, 4+G++:(&  '7W?  $$. "$+ ,7G6NA;++&""0  !" %       6$$%% ""& 78!$%('!"         $&."% ) !  )&(  &)2.#!2!%&0 !1/<-9")61:A7DJW]E?-*"0$(%'         *#)9   "0'"-$20%2*2C1-$*"   E1     *."@!)5E3(7QL60!00! ('  "      !!&   +/202)A@$            /"  &   0*"+/!  +,3..;:*=A'7=AKN3AAXPVU)2!3:)(<! $      4%!!)(( %''*%.',:6/&"&$      "    $    ) ,%&(:FA<4PJ3  (/(!)! #            *  5"6'&,&)   #           ") %),!   #!#(-8!" ),?!.?\G9=USW[^R;:%*M;9366!.3"))%     *+%"3( %')$ $(16%36+           " +)-0DNXW\?*!)%+*#        (#%    '""/4      ! < -($1,"%  )   '!-- 71/ 14,0,+<CPS9HejbVmD:=;+0O43VZKG;R0V@   %+&%&!#&+'15%'(*(   0(;*5:34%"#   $     %  0.28L=\^U*% '$16*5*  $+   '    %    #       6&86 2-$,%,1    %-)  ,2..5=HFUL2Pbe^hD_CECF2?Xjb_[OjW9Q-5)  + ! !+ 4$& '##)%(:-- !(          !**$  *.D1H=JbP*&('-&!"    $.F7'  &.     !  ))(       07.!+4%    ( %   +A>7MBA=^UL\cceQLE;F:A4WaynossbiUZ948      !1-"?,) $",#  %1(88)&/' ")     $   ,-#5%$ $##2JERRJF#0    ,! +-($+%%<V   $    %      $/!,+*'   %  (,471C8J:LMVGTfPUH_M.0UC`sc}zqmm]96!"  &2/0/*(*$'  (#$ &('7HD3K06$##+,     $   *! ($% %"25QWX4- '*   !  &-0( "4F       -)!       " ,#'.+3.(3%  '(       #532F:O_JUNUSOLEG53?NS_bZOP[~sXH9,   3 0!,91',$&*1"( $!61BC;;:;!+.9#"     ".$:1HC70'/# & :(&%  $&              ' 048-)4      ! #&/BSXD:TYL_PY`Z=M;AbSTWMFLFHW~cX<2*#       &5#(*?""  %(4&0?62+4- $1%      " * &$30 0.       #       ##/0+         (  0#76%#DF4'0% (%&4" ! ,:D@>BX0AAKY[YPGZSSYQF=VJLHLjuvpJ8B'         %#0D;*G<626&& !+# !/-;7IS?E,)#   !  $#  !     ()  .1$       + +  660#2<*G3,4  '6&      # .-2<BGM^`ULWINZY\T^_XNUKYaX|mP0;*  -" "%)I;2V~9) 5) ")&$(6E//&P9.7='#     #"&5             &'",3   !  .   "*%!3.+:<1&);#)2' #  &$"  -( 489CYTTHCjJNRwRUcL>SH\f_[aE'"     5;F=GniQ2=)>#*%#085&1I4#2    &#&  $/  "     "0      #+    %   "      @+1#!5&5!+>7+02 +#)(  ((8:2@lTYGC`FD9MhY_HD^xnfQ;%   & )#9D7kJ=K*+. /74T<:65-4E1$5       -+            #%-#.  $ " "  &"&%"     ,))<7*) #'574#,',"$?+'&5Q[~REGOC)/MWV`_Vs|mXG6"& < +`O^wqP,(,$*`viNB;@F90:%-     % *'      $       (3'     "   +,"'   !    $,"53.*  %!!!,)#K($!>;VufMJ<&-OL[]@V_r{nuYG=80) *& "=8.fTeP?D$$7z{uiXV@,<6)('        ! "              (  6."      "  '(!          '7-5( * )./#+#9#43/0$    "*,@d~F:73%9BN\Lb]\~mY5D!" -%< 5EESQLdK: )@CW?bWD;?:' /" !        0             -+   ,%$  $0$/# %       (!&."'1!0!"* 5/:%2+" 1jVatNR8229LXVGl|xi`G>>+   %-+#1/-!JRGjJW:@E=-"1;4%1F/I2 ) !)*-"      #  #.@F'        %  6H@D8$     !4&   53. %40/+&&''5'3)   3K]tcDP>F6?L][VskhgNAF?)%  (2(5"4' +! ,',-+ "/3%0+,"%! !/  .      %$$D:B   "    "   !$   *(Lo`82      !   1/;?9* )/-#,!#+$ ''8%&.@*@0)!+   =ivLNC3')1'<\\@H_Z^~v^K1Q<& ?!?)&  %$*'(#*(+&&"+&*(& )/ %#49DD!$+ $     4% 1<V`C;      -     (!  0C6"    0I'+ )&9 =062)"!(L<9+&   1zrL65/,%9M^^OT_ojctoCJJ8$'& $4: % " !4").-   8a/    #"#);?,4'.    !      "!    08C4               +CH=.! *)(++&,/! 1 )  &$&%6@)CDD?'  ":}cC<+1 5F\YWWZ^`phvRHIA.7)&    #2:*'  )&! "%-$1-    $ !&"834(               #&   #            AO@/C& +*0&$,701 0*  (  /98TM>)% +D\/,* .5<EDPIPUjc^AHQ5*1( "    /      ',."% "    !#(!",+9+(   #*   )  ,8Z>0          ,(4, +")")%/!1"  "3A8<G96+/    3{rb;& F&=D<.BADYS;68!7!        #)#.:      "#2-' ?:%    &                rw{RF$   !     +   +%   ')0!&#0,%'  "ScG-:$(42'%072>65"-!"' !  !+)+''%#"        1(%  9   #&&E *-%              !      0YrY4          7 %  %  ,,() @]L% '   &*%'6(3!0.*  , % %+1  )%+      + ,    ++(   !    &AODCD3SU +        %     %  //Bay\%!            !   +& @qE)32"   ?0&-$'!%04'+'  * //)   %#/".#  1 51    #:VeRO8``AP7$       $         1 *OO?/     #     %  "+ , 06$  & ,4!   F;PIKM!   ,2#     "0 $#   +"$5(#    )  5DM@MTrqa_NF13  #  E(+!      "  %"        "(=  " $''!"      '*  (*HoL8A$   "!!    "&!#-$ :>C# "##+$% /@Vt~~kdXSA"/        "    /!      ! )%-)  -   -   ")! 1=WnH=%  $+   ( $+1- #&) '>W"       !)-5- 34@ALixfmbTTKB6.+                           -   3'       !#    # 5@W<(( '   "#%"**).   Dr1   *   ,+&'$ (&#23bWchORYI=C)&      #               " #!.               "&=".,       %%#+)$   ' 6$*(   ".*51(*+#-&@H[ZwuwGG+&    .)        )$       + (       !       )-E?.$+*        +  *7 . !#              )'9 $      %*     '$ ##(,3(#"E+D0*,.>[ jRO1   %!'   #!    # #    *           $-L31(#8+2!3=         0# )        13! (  #   '     $)!%$99,3G-F8>.9)?wPX6!             %/0     *-7I+7603..#7?7)        " & #!)"%*!              ..  $!  (  $0)!(3C?*J6&6:;+7,5fr}~TH##,.               %   (!'0          $$3IF,8fPL+."0EZ1>T9      &1!C=:         ! '+%$)!   $%    *+' 2M0$:8,C57B7:T=FOmm~y^C*($         &" "        !  $)--LAOKbY_CE3+/EQEb.    #    #*(Ur7$      # $ )%.#   &# $       ($  #  9;+5D=I6:@,4&4&8A6NP=/A5:.  -+/&!*     "  ( $,5*7%# ! !         8$AVPfunbQ,&9.#EXs,$  01,.0      )&-K\jrF7"   $$#+")%%)#&      -$&+ 0!)!0,.<B$04#4,D(*(/<5$+) '#9(!       $"  57$         !*1H]G]}u\?&/=3A&cF   &FZx`cT*     .,6QKgO<)      "2$&) #!2        8!   #066>%0+?47)<!"/#+'09*, '"&'         " #+)% &        ' ";GG?[phOL8&9.:jjXF   #1rL  (.:B@16         -+4"0$+%!1#      &!2# *"' !## ) -1,03)7G984,)E* , $#9",- -8(         ""/+       %  )37!7WnSSZE(8##2:H,$ O,yUC     2#)'5G1B/    ! #F.15"%# %   2"    6  $*!4,%,#$/'"*,#,7)1.4;93'"B! % , 2! ''*#.7!       #    3< #  )*  ==/.7WTP@+$QF  '/5e%V*  -$),?>'   ) '&!5' " '!( )    #')"-2($#)#*7>1/'0#$,02!**    A,! &         %" ( 3+!,$(!    *$4?LDA"/,/0$    ,$"4XW&   *0+#  -E\0      #()/1!$         )/' -&&1F5&$-.8'-;+ !.')&*&))      $   $,#".&13  *"A ('   $;XN^K& ,F}B $ "("-3#  "!39    ).""##"%# ,     #   " #' 03'22<3( +%1 7*.9#*.*,,2)     #" ! * %2,72#+=5-)%" *    (     $) /8# )++F*8*7+1/2$ &  &  *2=JZb'&  )8l|mL>$  $  "       %   +#!64,!        )% #,: "#'-0%' %")!44(!<*$3"*.  !   /H56C5* $      )+',$ %-5@4"4$*'-!    !"+1.$MWe_ta:       "%@SQ5A            ! %!     $0'&$33'%%&#     &,&  )4&.9+1)%05.&7*@/6+2#1     (-4%503(P&27*@.*% ! #    "/2+!# 24/"(#$      +),'2%;U^LZN<    '@14B1         &    4#<0&(0(  &   ,"&# !    "(2 /7,,,1)#4/*1-7'0)8+  *"&+?=08%1%C;0 $:H$"     $* 0&$!7/&<%!) 2)        #"$9BLF1   8/)    -         %$"51,!    %11((    $!#%:/1& + $'$-!#!2/,      !7#8<71%632,A=-#    +5]a^+       %  !')&  +!! $!     =HG  1"   $             #)!1-='&    6-"   +! ,;*/)'!+/ ,&   *  0,&:),?4A8.3,,$     6g6      & 3$4+ ' #  </)    &/                '-$!)10!)732E?: *$)* !  $ #) $,.#$ -$)%+     %$.,".?818/1.4-85'     /Klo!    %*?: !)! +%#!&'4+*1!    0            &" ",*Aktsd=    +!)/#   # ($%    )# #-) "%)=*953>C78,>2 &7!     3DHAhA8  (+.,$,"  &!3 /.)*0&                 ' $,")8_v<4" 4' %!    -)&0") #        '  2 " !!<>0)"IL":.7=-. "!   ! &>]mS4        $#   (!3CMKB+                       ' $.:56D4iF(% +('",# )$(  ')!+& -%*%"  "%2-%04'8A/230*"&8#7  -  '  /8?JuR,      ' -)162;D-,& "&)      "        $$# )(/:Me d82# 4 " %+3$%"($    $%#( +'D&72/8*   96-2350  " 0K=dscQAF%                 "'4/2..3.      F."               '    /)%"4.BSfuNN   0(    $!.)  ,))     $ ($+@&&*0-,63F" 2626DY;%      =(3F\IA&&0 !  #  "   !*#,"&   FUE' &       &  %7#8&$$4<X~i4,2 & 12+'"$%%  %2#   ' (!0"   ,<* +$911&6##$'-C78%   &++.'H,%'"             #      "RlC*"               "%(+'5::;I.#7%"  0# &   ,"6    $(!.2%%   "31 .EO465$0'&   %.!4! %!#                ,Am?  "'-?(          -),*' $5%*&**7 *,",L% )+"  +%#  #,/2"!"    ""&/3@',8& & )( !/.                         !  4>kT%+(-5:+5     2$0&;'0%--$"   % /5$  ,    "&'%&>I,&   < "#% .;!  " 8/#   '          $    #-z}cI.*(GcWbA8   "   $   ,%/  %*( %$,( + ! $#+1!,a=44   $*+)-*$2, 5C2 & "",0#-* &#!                  #t}[M~`jv~H-'      " ! '*   !*,6)!")'*   /   (HC9M(3?F +17+7>75F3%,/       '' (,),-  30#         ! % 5             $hyZM=//('3/      )$''#$' !//044$#4       ! +  8!)T<.,;,/#(  #;<* -,/62#&   $ %$((!  ++       14      r(G8qmjsZUQF75!    ! "1&!   #GD$7=@&0 !4, , $          # /1AC@&#  )4@3-#3-E,"$A(%>. $     (+5                  '$)3    ) )  XDf[r{y~~nm\NL,      7"*'"(56<A4#6   #    '1 #  3>=.-4% 01#*&!*/$!./-(=>2*.-&,   #(#"+  *!/ **$"   !      1   *1&+=DA07/*' !42oA:/Sj\nixcVB3+      #  @P4JI904, %    ' %#0,  "0' #1[>CE%#"1& ,1*<' .-    ##5$ #  !            2%%.',HTWQORLeJ@$ O\8gP81FHGcel`AQ=   %      0FXA800+!# ')!#"#  !"4!% ")-*  0%( '%!&(+@4 ""($))H&-:/8*.)!$3 ! "C,%# **%&'-%    &     %!     )7FOm|qzu|w^*+&|g3###35>KJZBD=-    *";mcLH)!#+   %"#$4,"  * !##,2$2,>;; *&#*), $(%-A3;-...1-#    )+9* ')  35     ")#           !#*+ECPjfPMX'P|Q4!! 8&:IB@rF>     #KlTD "#   +# "%2-+K>/5 1$C- &#.32+&&*2J16* &!!    &% $ /!#29$& &  "  27+  "     :5$ !  "      #)!BRx~b^6 N~uxk\B6$+&)FI7A=E     # 17ES@%     *$+%#'%:$"$60,&39.2%*2)=A7&*..$<+<%     $&."-- 2)#%  %  "$*.!    *K-3    "  (& 9<dlf}jviN3  1PpV/,/  264;<0=*      EQ@KC$  &  )   "*" !#%0=.**/!('&41B5#"0F 7*!)6;)91)8,;1&#$(  %!''4!#-(*#"$** !   ">   +1<7!)      &    !    %+1NN[szpd    +) 86.>>)     #25;< -3#1",/   $  !,6*-*()%,*;-$!+#,(3&"/, !4/'+9,9*(.DJ!1 040"#)# ($<*+'%$ )$ #0+  ,   )"#      *+#      .   3'2$!       *CSqpJ &,B!C !+        -0:7'0**! &,"   # $4!&"+4!$:$!4)#1F((90(4.%*5((7&!#' *8,13&$,*.,'  +".%5',#&/ #+"+' !             ,/'(       4h66N'Y#         .%<$0+#/$&   =8 / 2  /  !  ++0%$3/  (+2, -DC*'++,6C#%2K83(,%(1%+%D7@:?:G4N07!'  */,))=*,#- ' *683""         &%   !!1>          6_ )DV&       6## )5--3    2N.'+@)%& %% % ('1)'9+47,K5 )>,9"46@1+4?-+-30)1-6!%#*J,/%*&3  (!#($'.)!.1!2+`H42:/1&$" %+     #    ):2      Zam}G:"!   "=.!56#38#"   /    6, ./#!$ 0  "-':./,1&$+1O9214+ %,""*43ED0-*&&8/+7((,,++32G?#.!/(0, #*,) %!,30+SH67 '   )4   #   ' # 3)IK'        &4N_il(^F#%( 1/;M3LB<4.O:0)!  )2>  )&-3 *%&5 " "#!"<03%/ #-B-<2,*-14G!:0,)BB;"400A<</)+'&;F6/0'/-5+$3*3*1$3 "1KcY`71 ,0   #   $ 14.9)DH]40"     *8O[a~{KDiJ+    &KRVb_<NTB1;E)  *G],    !)&'$#*    "  &-'#0;(*/9*J&!1@@=/-CM625FUC1419%67D? #91=E01,;(39*; % ! 7%: ()#>75gk50   #*           ( (&  #25G@D;EI7!        %#Gzlkvz{o}S    CUt|bmSS8:4??+Nf+   )(,    6% !'  $#(;"(/+67*0'<!/1!BC--6OBQ,951855$'&24(?H;?,.-6')7"&.;-#*'" .2%5DGkZX,"'3!  "%) $ %   / !(    '(     -8jgE(0A?       9*8>ke^^Zm~}_ky_n'  3Xg}oTIQ@>4! 'G:  5 (! '   !  +"',!6+%089163%51&-(+#3*.4'.+"45NF.8>!65*/">#33*%K==76,'-"2' !* 1&& &,.0/$?Ks}H9?  #1 "  6 %   '        0'   %*7fa5-&#          1%3.G2cH=M7>TdcfsI#  Ckzjq\>J8L;3.+ !,!        "* & (#)%,2'&&*'#%2%#365,%6<,6#&%.;<H=39B2@640<R1466##/640<1=$#;.!0*'. #:2'6IM=.-(   + - %% $2+  $2  #  -'+=f:( !  (2??]OKS9-K]P<T@   +    CSgWNFBAR7/% #(  ) !$(    (%#&#$ -# /3'-2)')6#>/>2.-72)605F/D*7H4##1:"?3</72(-2Q&1%,)0($A7"7&#""!6*&2   "#%"'#$"       $,$&&%)C*-%$!        ,<64KG>:3=DD;Dp*    84H>5JGG>P7      "(" ( $#    " '# 0#/B,)+79=%!,+%(3,.160.5.8B'5,1/%*095650>, )'%!12<*  $  %&     %    '#     "!% 9! ' / ,/3( "     #"54)-5fM;46JFB?GO\llq   &#&LW0KC=BY0&   )!/*        0'$".$  #  # "#. "0%!&%,!+*21)'&;3(402(OB:713/86'689;2!9=&->%593$  '  *$# !&5 ($$  %) &3.  #!#%+, %(  %% !0$%   *      6?/GK-7:BBNPQSDBX]TE@I&         57KWFQ=4+($" ,'(:6    !. 6:"# 9%    %   ! #(*$'!17- %# '',::&70'-0988$;<&0H2,2*+8P20-.51-*"7 )   .,+%   %  .%  :+& /(5!   #!     )(&+! 0 !     #*?= (     %,GE00201QEAACN=GS5#        #   %E<JTNC;=#.:4"  ,+FFRU``,  C5%4)+(8     . #" !.#84!$3,50,&0,!0A$,'/-7 2593,3(?=6/0"(9:!$! "& $6#&## +"$#"$))"$   !8&. #1$        4J2'  !   /&)))*02,./?CSE<><7 "               D?E]WDBA@4$;1= =:;ZXas=  2('!  )!   #%,3#* ,& ,!- , 4!$#!4!)6?&;-D-0.-1%E6,4428-=7=H"23(  ! 02    &0,"3$+"$0!&&* * '-&' ,+!7+ ! #!         1<7.!       =8<LQ'%6+&+!8  " " 9CF@H`>853) 6 05JMLDD7    0*' # - $$#-    )%55"('&!$,&-"'$! "2')"")<=L08%#+-6&E(1219K-N190/!%/%    '   ;(@(  ( " %&  ' (  , *-))!/       -:64*     .1+HFA/=2. .!2       6R=KT-500$*  *GLA0     )'"  * 04!4# $&%!)$/+""+0"=$"#-C+6&&D7CD7NL!(59#'%     ' *,(       "    ='8#'6-+%"       +=        ,:-LP<+"0/$             2:?(5KK/56*,), >>>     #  $ &"!  ,%/('!%  &  & &7!0368?/"8=@A4FQcY@NT;#'-!    !$$,+1& !    $#*,'-925"- ! " $$%  ?HKFT6OE*/' !$       1:,OA8'+1 '    %       %!  !   !; " 2#) +"  &" ?-!61&*&!*#>03/1<@P\PYuo`]`>"L:.)#     -1+#&+&! *  '3';&#6"         'Dob=<R*  )      ".#52'(!57-%(    "!&1/-& $# & +    !  -),  ) >.#!72= 6>(/&&@E/JFl]iujLE02'9"&"      +-(4'/'    #, ('$)     !   4FllKG+D         )& %6-0#&/    -- '=) $#      %" !! '&"$)- +! *' 0&.'0)"/&*&6LD0/4'-<9yitUQ>-=*!*#$    8'#B&"   )!# )9:F,           ( #G>\L_I:     -*   ' '! "   *  $   (   "$! &$.'$  2*$-!70&-'5B -%6168AFKH}RE=B;''':      ,!.0>    !    &!   $%,1*            %6-  $  9OU>7.      '3:47)7!           "       +         /&%(/  " )' $7+ ,94F842;A>GQFg}^l]N.:33*%.+    %.!"$!"#%   #!&,'             #%   #&  )0  "D+HF<=8/  &        &         !).!#  %%22&/,87,1-/#+3.+6+!(083H@S`ffmV_1C6!>>1"$,& $  !#'0") "      *  '"         -   !'2.   +"  #     "-5.VC?>2!   +)*6     #    " !1 9- *-$+'-,,*7;'#&-%)0,&@DP?'%926)>EMwtpD:1!,0,7-1'*     =&##'"0  "           +".'          (-0AQ&@8%       5nomcH)$%   ! ##'/+92/)+4 +-#+6%B<4AcX;*.+ (5JJizHIIFFwsSEJ6$,)%0%       "  ($## $                 7P7#)   '   ):<1892,& h^I-%    #         $ /!)3$1$4*=8=%H#6&1?)PKE)& **'+ZNJY\VDl_:F;&/7 +%      "'.#*   "2"       !        +;8&7 %    "        0*'INEA?   O`C&!%         -%13,)(21+<2?T2*>=:"48AC?NZW`XTD2>;-  (30( ,-"   $) $        %2 +*             ?;) 54UwL7F1(!          ' )")209$+/-A7NQ)'7N8(,>+5*',"*<K0NE=7tW:?!+'"" *  0#&         ,      $     &/        / , #-"    'A     Gi>!2'             "*,O20,CU@RH-08=++)66, #!./3*>EFs~X2)!&  "    $#%1 $! )  $   - /$$  #         !     !%'    *QA1+1'         (+17(,1:CP@KV'3>% &&.0%&".16;N=OUuf3'$ "*!   #    *+*$   ' ()   (0 !/'"$'   !           (      .'1-!,   $     +!& ),#&%.6FV;53F3%!$%!#(-"<?N+=0$4JVv|u^K134);        #%"3 !  $   $ 1#   #      "       .      #"   ! )# 06&  #     ##%%/3>2)&;*##1B0'$  %?;+,!?>F@QN6II$2##'!'A        !  ,! !   3% ""&(! *!!      (           !   .->9 &        ? 7/D1+93"(385+$*6" +8&/$#B4>3G5/5,1=SEM0.)!''' !  $ 66!).+    %!$'!($  (                !   (%@7'    $ !)'/#(% 1$6=5)+;2*/)61"97./ + 3:E-C9- $$ *"#     3  6**   !+'                    %3$  <6o$    "$)/))/%?7<&)&);4471%"0('>D+$%&&L9;I-?%<&#+ %     7  %*'#2->*   )')&$ 6 2)  #"(-! !              #    :T`b8     &#.54%7+#&&1-"4+(9A"J5 &&'9&!:;2-%+4.(1!/*+(' "&  !   "*.%# #C/  08# %  %2' '                 _LN  )'(D":4&5"0$89!>%'%(,2-%"7)%?+& +#:#+9%))$,      " :$/05'4*7%' "1& 4   ,  . #        0      \v    )*.,*D6*23<;3@+)F"!1:**9%*)&#+?'0%#;!," 3!*11(, 6*  "% 41()*   .(*) +,%   * (   '               0,    O  4.>%/*CF?8F5/8-853*&= $37O230<:/:4-2.$$80*'4&$# 9&$'*%   <!%$+" %"  # !)/ "## ##$  '!       A-    ! oK6% &(.+4<=BA$(4440*+&010"/-=1I1;72%I))*0#0'4-$.","   '&"-* &!"     #+&*%%3   "%7%,!0 (" $#   (&!     $1!  4%       &85- qu_F;1J0788.(0C[B % /"-1#!=::B>A32/ .#+1!'&2 1(    **!(($  (&1+:=&4"!'&)!%%-<:!! *" "  "      (/ "    4A/"       /A<9  ]J;7;9' '7,4A893<)J]?7;D<9/"&0/2:5+-J@4$&"&%3%(%2"'1A1,:#   #."('" %+!'!) ,#+  "$1!*%!4,#.+    !%&            2?1)           ?F2))-3    1.9+?>;F44>0@C.>*B-":(1E542$3.5D:+'*8..%"(.!-/#   #   1'/#$#!. $& 9* %%!! /6=6%/" *&                 $0C.    0 ++,'      . 61-ET6<UL2C?9E7*3(%%/2O7+8T?K#%'&K2,B#$&'*+.  % 4' 1!5 "& ) !!/0*)>/#') %8);.)#'5! !$3    ))           1D5<     ->xW -        %!#'ALEHgT[D2KOB54):#2!/-2HG>(#-;$ $%&("K#$*    $-1-"+#0$#) $ *7#61##")2,(("-(+"%,07+"$ /        %        #+"#"        7<te3q)  ')%<J;KLOZDIAUE@@2<51?"';C>4A!#)-%<282009%/   /,&3",%35  #+" '(0/4;G(%1)!@+4N (!.$   !       $       *%%,$+4  ! '%   +3! F   )"F@A@O[mH?5TI@><I6?>#:1'&JFBDF1,+7.():$'#$/"   $(569"1$ )-   3# -*' &$1%- ()1.+=)&(+ /21 (## #).  # $   $   /             2/5(0;       !    !%#5?<LPJOFPL<KK34$/6;#1*)8$!FN@.4)@+*+&!('673.-$! (#  %)+1"''"&$,4 2'5'G )8 -*+$1@=)-('&' !0!  & )   1"            &$#/*!   .       %-"68cX]fpnKJUNWO4'*0'-.5$.76/84+#!/74131/*#/9$! 1 $$80=65!!"."(."3? ;PWBG9'7*4!"&%"*         "         ">1.-   !  #  %.*.A?P^O^_mQKTRPa9G4@3/A(7 *H:<3;&(-1;<*85<=.69%"&  % #&$=&  #1-.%$#  "*($&9>>5%+%&-&'J72/b`aY%(4/)+4  % +   !           )         $  12  *72FEJPezfi]aYO[LK4P6/%3E7,.)K+:-#.$*,)75:4,A0:/ "    (( $"!,'')040-4  "+0L8>&KZe|zU>?&-*,;&-" ' 4$$07&  $                        )   #'    (*/8/%    $'86AWlhvl`VcObG1H+'(!, 4)</3;Q?'* $9?9I*4N>3*)#6%   ":%3'#'< 9#4E,)0)"71F<0+>@jfyc[CL(';,+7,#,  &   $1             %           :!"  .6<745&  +03AThsw^oJ\KY_N;+7/!2-57A*AD=CE;-2F804@98D6"%'2! "'<*"-, %" -:D18B:%;#=+1'87IAoNgT99'%39@07 $   %   '                        /#"!DKB94/+5   &:>DnO=X^CL83AA*0!#R72,A=E+@##/FE@661RX0#-+)%'%,  /79%.,+5,.#) $)054G(0=!54.,*NJKR\kNO;)F#'<:-"'$(@2         " #       3 8:D<SFG,'& &1U^vWLAW:EI(2%44-+E<.G>,62/0.1AEL;/KIG>> 9=$* *$"*$$',  +?6C?3755%0%&@1PLC?BJNQH_X.7!7,-$BKf9+%  !          /   !! "   #!   #    ,?818VFCG8    &;HTXC99/5G1!9%320,&@*+;=6,2(@;>J/?JEHLc3<.30-!   )2(#$)=:0)0!,'!    );%!<N0,$ /;d^F\TKa]]bc`Q,#>20?*9>0*G !     "&(        9"6'"       "             !! 5$4(B7<CNG( (*MAQD?;%."?=60560J=?:O3;038+D80)C.9[BNM)',@1$  ' %(/)!+%,* / 4+%7BP69;G<>>Qdy{diuZk]W6: "*0&/00!;I # *!( '( 1 "(&)!&+1>*#!                       *1,(<8M*,4)#/J/I>0*#0#4I/=)3' 9<?:AC*0%142:@O7=JEKD965/!%  +!0##8-%-5'  $4#(A(,<HUSnplusbfJN'&$>)#*!, !#% "  &5 "  !  $&+/,3,             ,93))D2  5.*59"42/;D48;CB?LCMX+BF1:@B8>?;0>9+!B//  ##00%$,'   ,)37A@9MT|lLbTK&$, *#( !$     '  " #' ):    $ (&!":    #  #                 ( *:>A421 1>22D#%B--$:;:I@936@18GEE=7AB=DG<R#6+ !   "&#:"   (&'&-/<<2!CUdonstyzhA90<'$ & ',! %"   #    " $!(X"2/$)$5$+.!        ! ! *   " 3"       %    *'A.*2$ ,G6/NK;><-#5>EDCB-<-%@7@$($';A`N9I--&,      !* "'"   /'868MF;72asacK@94(5@9/ *"&  '3'(  "   ,?LfTV80#+* *8#,            &$,"'3@G05,,#        7/9:% -5%(=>5239OC1>;<;MC'Z8<12A<&5JJjJ8@J3@%  2$- #0. 84)O8?41R`PQE6''$! ""'") -      % / ' *U9ImsW<7   +2%%887-        33)(4=3ZE0.   * &!*%#    =&:-" "$!(-0/AcQPIH<AE5-8B!201<>FB<YB;D84& !  )-   +#>!;68#17<R\cC5?H23=31 ($ )'1   "    !#,U*Ejpl?8  5*##%      #  !  *42E/'4?B5'      !##'  "!#(' $52:.B*'493HB55';@;4F<DJ=4VNB9?]IaLA%0#! &' !#2''013S9+2+@OY_W0=/(-1 -)$&$"   *(   % (%OnWNH/"  /%"#"1 1      "V]p]J7=7"  /#&+   E0+%+&#76H=:B7<.-!K5J<=<BEF;3TCVaKEHD5 (   +!60  % $ !5,3@94,7B_Nev~IE7/(4B%319)++"         (/2H_u_NBN@!"  -! !#$   $    &0QpYG8#"      !  "  *))&  " 1!)8LcD@S@A;<394K48CM7@4EKNI]cAF%)! ,!"&/  *  !00'&0G+#!091.KK]ShNT-@0+8/ +. //+(!$%    :AIhgb[V^1'  +!$#$0    & )#  '-6;NS=3     %    ')/0      @88MDHBANQAL@<=:0;18BD4*:FD>dI'1.21     #("" & # (-3$!;GD,D42<4\mxcfe6VB4"':>&6/*$7    !        ">TYXXa^D+")9   #/)0)+     !)#,1'              ,%  (8#$5'Q6C3;?V5.9&=43@UG@1J=6ISC1#$"  -,!(" -,#;,'?0<') +TCUU7CA!"=3($>;'#/$.& .#     %[RXKX[E##-=0>( )8' $*30-$"+!# %   .9(%              )$   " 1/8>E6HMBD339<69<7AQ=IWFH9\M?/*"!# %41+./%#5' $(#' #+01,'/1*+"(2 *1$  !+8<"'.#      "   8KQIHX:=#/F;-,+26.$/& I..0   /  +    1#  % !#/ -I@=D??JBGI8L5/ABDWSOEL7HYPF;4&"  %#."4#)"% / &%3+,)5*4=.?93*)5%(%1/ !1% +       ?K5><9% !<C26ALA4!$ "0,/  # -&!  $*+     /   01+!   #&;/01HGH;Y@6GFD04ANKH>-=HFR043#0 !     '-") ()2)$"*("!'!#( ;&<4&+$&/!$('#2%#-'      #   0$  &7+006/N`?-7+0-%*6+(+%  (2- #              + #2    "$ '.DH?@DOHT]L=F>1>9F;?BRPL&2 %     $&@&- -    *&%*40$7',.#B% '4E5?43B*&!5+$   +       ":I>RChbN?JC/"  '+*+%1>,+ Q\C5&            &$#+# !  #%$>:TN]?<_GBA766?F@I51H6B@Z<32.*   "-,   #,&#68"-"/!7*/2.%*"-2$% 8 "'        ,4.=;RaU?)/     7+*" ,D/%,'&   49{A!              '&'/#!   .2=H@@=:bOIC:?494=UI=*4GOGBT3 &%79#$*-##*./9(##0%'#0# 4,' :--D&$%$ 4&-        ?913Pgl9+)  ?9 '# "      7#9!         !      */-#'7(&   &%+Z[XAIH@A<9<4G=RAUICCT:E2 )?# &&037)#  +) $".@ "$. 20! 63-! #)! !    $      119[lhE;'  .'%!-)#    *S.         -     ''&0=5$  .+>9J[I7B6AG7A=I>PQ>5M97MC$,(  %,31( %  */#+*!,  ."  )$ $0.;/ *    "179@{gN0  ,     #~0%       %05"$      ! "+&,1C/"       ?>GUIDDLA5+8?E@M?NNQE/= $,  *'G-$    ( ,   "(!!$"*#($    16!<yQ%                !2=       /LQ>'    '# "40)   5:716:>?HDOI7QH@H=OBG>"$+&   )  !+6 -!#$!,#3;*,(('#%:"(        &',W`(&     1     &$      $   *!%IY[C-         ,& *!),  &0<5,;JH^==CG@92RL5>"-'&$0     "1$#,. '-$!     1% $% " 1 ! 0 *  $<$      &             '     #"7)!&8E7s}Q*               $* %/#6205@??;2@7:O?DONGE30(<G7"#)   1J74"  !$ (-            21,#!           (5?7.3338JT+  #, !!$ "   3"34:'?F/2<A6B878@I_PQ3   !  # *2    " )/ &.- " ! '      ":))2!         #,GA;&,IDCL;0      )    #   %!%--"'/9>?</+0K4/+0  &  !   &!H$( '(    ,0! 6            ("$%&!&0)A(            9D#""#&<),B>  # +"     "#/0@<1'3#*E0) !&@#"!%  !2"!('( &!#*+# "    "$    !    &.!!25*2 3 !#0  %      #    K< !  .    -)-!      ))%!+)?-'9I4026!!  # "(*..&&     !#/.  "' ,(       ( 0,5+ 94:+6&%+!& !%     &   ';5   !6)1&';     " #  $#,5-5D("!   & $*    #&      /2H&$4.      ( "/( 645+A5,(113/,*'2%'F     "     '*-$       . =xV 8C      4',&! #!    $& :$,')       *.$3   C=%    $  '!,*<5 2=0*9702079<H/-D9'"2$-'!!$$     "               "@[6"   '      -''&" " !#,/++      *=&  6/      ($'  +#&4(!(,@0$<JUKB54?10+2*%$*% ",)!.     !  "% ) .R{R$$      #  (!&   &$  %1    &' % /"    "   7.*,%  *4*)-/NPE2<TCD/5C+>39/2-.$/              0?mD    !:+8$ $ !         %.            ' (.2,60:6/E)-05JEB51-4;KE=A).4("+# (    "   $    .-,Eh-   @1>>!             $ *  " "'@,+#""-IF1'.39-<6>2"*6HFKH;P=*<*5  .(%("-0        x.  8. O"   $)<(          "         -)%& ) !  + ""1<%$ *=/.4=2-62=<5:;7A8BGH8E*TG51/'! "+'+ "!     N 5z     $.'*         )  /    $,"/    !      " 'ADH-?+,/926./);@M*B7;=GKBA=M35&<7A)93$ "0.!          *  (   *ha=.       $.            % $      3NG79&*1.3679D6CRFA:7OB@OLRP7:5)/:9:.66!  &  ! "(     /=<   #!%7@          + *!       1)%%:(;832B56:FG8=WNHK>72JGC5>G5N+10)426;3$""-)" '  .     ,&@0<8)$  !            $    !       ;-7@5#$2/4ERD?LNAH7:BK>EAHE49I+TUA/(.9-9&<>)*   !        2-1  )-,(!"         !     %$ (7/%5FT_NMVJSL3JD1@1J?WD6I.:TJK0$&/;)"+  A7" $ *'# &     >36'!90             '. $A        &!)7B-(+8HLKNI]>M`XT8RM>G=K\L.4=P;6/8+=<-&)! &1A/%+2A6'&%#,8. # 2    -H6+!) 1'.         $"      "'%*.  #%  %3.&*'<7BXE\MQWYSEBI_.L>3HG+2;<A1KA91+47 &;5L6;D1".# +)2;X:)" (#-$*& "  )   %K67(($%%)       ("  *92BC)   ,0:7 '+1,**FI6aNYdbMBPZDAQEFFK> D1C:9QAW1E-/3,+"%*%,FkVA<>=)%",*;\>-"=,$+          (  *(-              &+@^S8N\B (+)60$7<,8R9LIQY[aXjYcRRgQF6IQ0FI<(1')NFMI//+5 <&05)CE4:16C@+'3 %0<N3I':4!668*1!%%  &    -    2+0       "NOf}CHCI+2,##*7<Q?L`JZQMTVUZMVIPPRSFA>&7:./-+9;AD&("04>+& /4).+%&(7"1-7/'(*2-%#'6'!0! 6*#"         ,!2"        %3=/ecL0! -&"5?CNUMba_lMF]?Q\WF*C@dK.-7*3(+,05:85*.-<:C'(6@&(%%%!03,?/0 "0".'0* 2>E(",11-1  #(         -  #  BRaZzT4< ,51KN9]KOh}^`V[^:G><29:;O6,/.98 *<+,7999@6538"4!*<- (/0   "),7F%495#1!$/(,*'          &  $  ;lzOu[*"  '#36:E=MSKQZRATK<A97-7:I+& ",'=# $3?FGJ>IF5/2-%!$&(88  !*7%0B"-1<0 #&&+!+* #          '      nad xY9D# $#"84,JPSRHSV_HQTLF>/78.!3$120 ")-?0AAGGRGE2/*#.51!$%'-42)(.#F1=!*("( 70+$        '   ) #)  _:]4b>0# %/'0.GNCIlSXq?K_aPQBD5ME/3)&Q79HR.//MD;<1F!+'"+$ &#$#-(# 26BC9;723898+!.*(+              # ;hp/k;( !% !%<9"UF_ahMZDf?P`INQH=.1@?+16E08.ED359VQH7$/1+-30('5 *!", 3/ 813JH6696-5W<++0,'(2                 "?l hwJC+:)6+)&.'COTJPSQUzjmoi<NV2RT;CII=&EE'9>0</HRDC*A1.+/*)0*)&$"+.$  ,>D_?OK@?;5321.426.*/-      * !    f F/d[,,(# 1#&8CHHZXt_UsjgeceT8A@O<?@/1K;93-)2H3??5=E@C#D$4**<11740# $PJbR@;NGP0%;A1'>/$'")%      ,+@    -Hc6@& %!.JDWccHVa;YUOHVDG&=RP>9B53&-H=?<IRD=G77I:%H.,,5>)*"-% -#%-C;J7:;6CM@)<,"*>3-/2&       B_!@1  ' <i|yPA$%%"&&<$&2\]REPJE?MTDFZG<HW;;JE3F;@F-:CE^WI0<P12:+&*;:#H<'',"5*$(=3*$;SN\[]FL;9:763<?/@66,"' "          Qn]/#:;   !:dwVL$)  +(4=<@G>H?2>94JCB?<KS;I.EQbSA_CWDF<BRKOLN7C2I7BAK8A1:DC8,1<?=&;*?E@2&&-<EXYZLPTDFG:84<62)#%  5$       4aJ,01'    '1Bav;%4   %!!5G-:7?XU1"*:85/@5H7PRWN<HV7Hc<6FFS[YHP48I>;T?6LH;_JBJ9MTEDHM@<P@K73/8866ULNGiTR*+?6.#-&!     :P&,   "-HQ*'!-3"+87?"8<2)8&DLJ<6ID+QIG@PTI.=AR\\IPZN@G*?A1MOFeUYb_nYM:LYFLhG:2479%CRDZU@/DO?;K5+)9/7 --   %T2.  %  *K4 ' $.$-'')),5C-7# -?>HF8,]G>XKTgX]XT]gVRBGDJ=PJeYLpa\QZWNPQCHN,43+?=>IgP\L0H\:6FF&25)6#$   "        +QR   " $#  " (5     ", 66/.66)?DlADY>Y]qXTcpM`[aS\WYQqfYu[kXwgbSJVNULJKF^LYYQKKcSPLSCC23;)'11       Evz?    (   !     "!  / +!27;9OXIIMP?C[YldhkbWNXln[jrcr]wq}sqoQMT?;9KoZjbRMMJL@;P9?00:0+  #      $ .   '6J.     $    1&=%"\?R+69;VJZJgtLShjfesnxlsx{zw}nNP_@=BWCUnpZ\F=3>=#/*.),'-       &            3 -85%C2>.BC02C^gZP]CAthjtvhx}FRmcDN]imQj[Z\==@+/;*A)7.7!/%&       %$"'  !!       "# ) +-0@''4)0*3A918>qaH\jWv~vp^]cWV{ttWO[ZNYI.G.)'1.83*9"(     #   #    $         -.'!!62EV7PZIrrYy}egm_lqxsbpi]O6C92*$-/78#6"$&     &  $"   %      %     ./  %8>20KWLntdg|zaQhqwRKQ1=F92+/62 #02A(  8. 5   -86%&,   #)  !&!0./;.""!%  $&  -?82Ifd&}XWsusrezbqxnN30A1'$0 !7CC,<./     *-    HA* 4"     +*#62'>#%1<#*,E0!5)%& &   3,?9  %*74MKG[z)'/{iMgr{xx~t{zWCI:+(#C+I;2DT;.+',        ?0  0   "*+$+"-&#;@;D%3&9 -40#+7.5%=#* &0C8")  *0%15FJ| xtTUnnvutrsjd]D7+61CZDH=+PPA8  0?#     +!* (<0O##.AF7'=JKPE>$B%%A?FOPNE@2.'>7.);(+"%3)1=S@ -+B$,R_s`Viktn^rcctjUA4>bIJ;b`T\[K5> %$>;1      &B!    #(11((@9.?5737EJ.EN5AQE6C:I>Q:57.41+=@2.0.+* +? %   9$/>A6 }_erVlnvgI[vaCYI<MT@PQjAUmP*8!/80" %     "3<H!    " ,!#.%6C(VJ(KDNU8L2D>L\^V8>7@DEL:WE?FMD>:"<9;-'-L@9'8 + ($'N<`t iM_Okwq[o[mu`g[[eO`_eu[?9003%$   'VFB<   $'"6*6-B9(0.6?BDJC13MPZkL:=D\]YWHNB_M;CBP>G4DJ1)>855SRD3/UX79+ %4,( #B%&.;]podkCVhfmr~sZRhvptnbaU_{UespK?9, *$"    dN'' &  '-%4B0&:$&IESE+\7YNV?;[GkH:MNTY8MrK\[n?Z*G>t.1Xb@:a-;X3IQG,?]M66?#0"3:N)4'5TdVW sSbb_xtdcXhhxujbxtpobWJ=3)"*'  &!    &J7 ! ""+W<>-6,"O^X]PYJcZ]BcdRJRxophsG_gp]>9X^4IZYY9HVE;AX+/1=>:4[AD+&1+3+-1',!0P:Txlsriami}ph[b[no~spnYTPFA6+C1% *    9eA *0=5LI6;AAKRcOCH]oOi]hL\RZ[q|Xc\fkaX<_SU`IEC\b[X[ODDaWUj<RVQ:OC"!)'* )', 2/9<=8aWg|P<Q[{txp_noolrVg\TcB:D&%' $)"    J}6%&=1RDO]NLUSHeYSC@\VwniKVeZkgwMojzb`lSbbecl\ZXVY0YWJJ9OPb6Ri\X7;3AD1-4DA*!<9' ?-6GN}\G1U{q^p|^}irtvQY:;91+!%6!$  $;  ,RP5#  "0!$+0KgOGO\CJ^<KXTkFqs}scqrVDmqvshkM\N^j\f]h^HBHZNHNb>WN[FSJAE-9;,2#G##-=7,(/%(0ELwg@SDfyme}zmsuplzxwqbSb=/..92019' -  ' /5 T5%. ?I-&$ + A1B1@Yo_H)JFK?zZh[pXdMlbrgbbkgu~btgnvs}\cqfV\8II=8OFiO^ikY\DR%+9:PIUM"= &$7$/+);Xwsj^SDkct{nZy}}WfWaJ(5+K9(-0+2,     +S@2   %  **%FL`9=J>;IA>@OCb]nLLgdevcdkx~g[~}xn|K\d`TgyO-SlBp\]s[aF>3;%=V)6C40"36/3,JJ}vaRSICNzt`yjg~tkHj^sdmU-5+7-E/0-&!  'uO4!   B18PEIVaJ;>atQN_NTTnufwvvgOvorej{fuvknVRWXvpUJjZNZlwK9SE,;9(T=$5D12*+!(7D9[|wppqhESNdobyvqafnf~ynor{a}|uutmsGA77FI-61, HC%     *+.75Q6NGObbT4XLVHkrb\ityuo|o{kr|meaz~}^k~segRor{g[LnlXhbSJQHVeS0$43U]6@E5*0&<(?85$>@szkB6DOFqZdbiZkt}|snhyrYXOKA8NC+6,>)0$%,)&  23  !-!,M=<@VpdiT^^Di^rVjKwoknyrmwchz|awfptjOtLfb~ryt{w{ioOUTQ!B;LOQFZA685%/=*4<YTJJcyk^C-M6bj|cP[^R_rh~ZZnWJ:@<.:/++1F 3'+ )'$$%B  %&=:%5A>cP\okrPebUz~z{w~mtv|^tlKjjnzche`^e}wf\esaztt{~Qd]GU<32,TSXENC*,>++=0;FKklv\jwhO4XPlqjeWaYONoyqv^b[V^_D;L/68*#%""%     )  +65B.HUD_\answ{uaxkmft{~puzNusnrThoqpOgmaud_fk]sr_m}{{::&\YfIFNP[T`YY;70%5-8;?4K^Hew|XWJBQOKfQi`wZ5Yyvl}ypjgv`FOjBJ@BGA/D/.,4 !-" !   6$0;U+^JAoiQcOZhyovv`|x]gZbhw~sJgsqwsOYUa;CZXcUOnemRfnk} oO^S;VeSZJX_S?DKE:L7</@+OQd\}lpwytDE;Q95@ui^kvc[kysuu]IahTOIG=@/-.0-)%      7"6HATf\bVebtszfzphogrkz}SXjSqmae[wkqwmr`STC=AU?bhZ[siTfto+smVE[RJVTQbA7G<=FQELFSvi_smhVbZ`EJcesoxpUlXfsu|ohhkgLCH;9):6287%$(5)    "   (.L4<;d]G9tme}|jx|s^veTa~yh[fi_Rnmctfcja{vKF1*-':PLbFliRDuxaAJ`eBaDEERtEMiI?HHPF0P_]c~zePUUHQZald_=Yq|}qzQORbOJ=X?&-%7G.5))$'(        &)! !E,I?8]a`OZSd\tqjbfozYu^|mknM_qOGPauY|lnbw`pIMS@B*44B`TNBOdkiyxhWUBBGR[eXON\WETHW:Eik}stfY8Gb\VRQLFOcnupinrYOcGMZMCLP^O>=4?8($)+7     !    .1807W[`_i^EgnvowbnhtvdfisqY|RL9YUZAzZqayHog\YiDG'9MUG\]^nQs(e qesMPXXMSf@K<B[_k8J\Grsfuma[fWWSZY_^VVadns~e^nmZm[jW\PPID>9C2G797,#   !&     1<>J\pdVOYu^{ugecHqOrlcm6GXlhUh]`tac\iGYMGHbVVl^dm`o]{*\uQWYgN=DBINPRf::Ekdnd S59^g1e``9IcVh^~vajuyUY[[pip_GQR_OB3;36E:I0"2; '  %),!"'+  "#'     2G(<LHUf]{gvL_e|smt|]rX`o}Qnn}XW;OVCj[IOidooTUMPW:MEXmp`ebwbrzgi+wwa]WTwqB\E6QB<i`_z~-ksdMnaH;Xdf}g}}unplphaxm\aYcE;DF44E2:",<#%(     +#4#     17   %     F@ASId\<:FSTnw|opyiPym[vukBNLGPKYG\^ehfK_VFp~njg]gpeft~Usdj[k|hsiPbMc`<GH<6BU=\^bZnk8Iv70glLkum^zmprzi{nm\\[CPO[bOJ3<1O6!/&$44(..   &%&-/     4CB?*%''  .PJEYUGSNHXwmw^zzu}veOjeNjfawZgFQLWZ`nzzuw^tlZ_mQAne]tyzwXaK`d\]cyb yapcxbrJN9FCBDSf\ZXcuWzUR j=.~QW7qWnz}vxiomqqxUASEVP>:LA6KO,(',*^,#-#   ',1$      %MnjP8, "3(    M`S)WfgdQE_@Cmwn^upstYrZZrjVfbf\^cXNLLEOTk[~jv{mem`u||FSfq`^WxmWmdsgViKEfG<A=<JfWKMuy/E2G( gYB(~tp.pwDhF0zdXow{tgoabbMARN:fK9QiBB/3150"A*-!""-"..     &!>\viW17>+# ( '2z^S= "JTNNIcHjPA^x~`gNXYCMulNKr?FFHUUWdZk[|iavbYVWDIMOyA\vyphr~eVVJW1#6L?JRVITy0FZOFv~|$=xtz_I qiyo}`nW|jO^Uda7Na:?ON7(.1G(F60       )PqliN>8$- 0%q`H' A;.^ADKI<Ewvwue[FKlPnRLTGdDEZD<@soo{synnYvpgkqZL>FWeetp{cn|urojJP;G&GU(S^Q]:QR;zb_]~2*ykn}{~xzJUZbciJBN15JIR7#>+!.$ .      +Dxk}dRDE%   '4 GmU8  +',<McV_vgzcsu~sb~vg[PVyxrexpOMLIWXVYYbn\j}tz`eUcdVG&]RhpyXthiwyx~kqJ9E!>_[]ak 2G\hO?3z-2jsneViq{x{c`X`jZ]7PX@F?4:#L6/+$      !"$!,6>Fmcqm[P:,!  ,",/#!#1T}kM' 799?CbPWmd{ylxec<AAmrvh\RePUU>BK`ipfzvf~kc_izk\TiokYbn[nWn~qqkHcA@S>:=7ao-tu_qzd@>~pnFigplaiaS\DZB'>+>35'      &     $'0*5=9T`kRWJ:   O5!.)(=%-#]K&6HIYA7KfanyrHHJ>O]ly|q_\XRXY[`BP_tzr|`v_=Lfhvi{XXol|^|kWG7FX:AnA[{Htw$0 ;XIn`@}}xmvntdgJpQWGP:/.>,3<!   #  /'.$+,B:AQFTp}Q0*A/.9J=C:536!3CD07C6cZXWAn~|jrL;GJ;]dbkjcU=T[f^aoukwo{{XWJZkjZ^Xfcv}{{gl}]UXAV<GONn#kvM>!g :UmB}}zedmacIY@57(D&:3:    #      & ).#%%'$BG3iXFOseE)) M<L?G3JLAFA)#  %@a d*)HCLc[wWnmvy}x}\]M?<;eotwb8E/8LSWRj\fdskyn}stmOjeqh^viydWTI>JZZtE"47 iq)G8[H9 pp}jvRF>A574F2+(F; '!   #-'    &)%6"! "+&5O[qh_VgI?*$!MQFXKQPCE::D7% Pea 7HDKDhjWryo_XSEXc~dpZSia[YbGBSEi~|{fIr{wrfuayzrewx}]SJC;LRR3|<VeFz~{gdWSNW@5;180"!!!! ,2=&$ ' #!&!)$ %,JHTfNij[7&&."% HV<WJ^XM?QGF4(#-4OP:NaE#.8?LRhbX\uhvuuUJ[B[tt|kzG40HXzRJERwqtPW}pps& j?i}kTimowcv}tXMeNCY=F;|xw  ((<w3% vvccIOD:SH/;!!>$/(.  0 .2+<(5,%." '#     55#!1B/D]O]nQL&%))   G`ne_FLYLSE0+ %D(,Z ! 0JUJXtxr}d@iOXbjzl^_UP6Z@ykVeEbloMs~~  ptsxsrgx{nw~wJ7QN]a=Sp_nlu{d 6`/,P-wnqj\m^SUV>072!3;(0&% #-80+$,(0&0%! $/)7  3 8;<B2BUbFC'*,)1-&  J;<NNMXMJUA+0/  =:=T;f}zykwrKGW>O|wLYSObObrB3GGq|l~~k}{wmPcn}bju`rtnY=Y\T_I[apeXkn1(V-V@C"2  )4./seVwd_XTIF-732'(*#%30!40751#:=E'1!!1+% %!  ,+29DV8:^:H?B<>J1%& SQCUc]PJTO6('*('     ,;FF[x|`}`TWOVzOfJBEObd9SBYwogV}\^bHj~`^[xd~XNReJBmQPy|Rnrlt *'6jeF5O5#'3;[J'A+.jh|MYKA8)0*)666)>2.+>?EA.C924,18@#4 $"#$$"4#%!','%' $#.& .54;MCPvE>`a^Jm1:#KFYYBM_dRASA>*    I5PYxlwn^^UY_qkxeu\NNTBIjSlb*Qtfpwz mjfKfpyqvlu}YZVifVI[Fuotz~zdk`X$Ji1 N'(6"B;YRd@mPJ.!pufx}gwpSS7,\81*2,#7>/C-1 C5B+2ABO???@/5*,)%(+!/%-3( $-+5;(&1&("#9><*BfTP^W_`p`V;8LKUWttP_X2:22.(   .CXd}xzgcwYl~{IKZX,+TaNuNifgznr5 "mQrdRsvwbgSrw_NXon_ZMFcdrq~vuglmw%N ~s^4<*""Vt}UMIBnvnneicNWQLH6L=28>-<66<)3*1>5TE63G1<;</;$&+ '*!)-$24&,*'#'&%%"0"#4&#)7>:FFTKWPha}lM?C6)AB@Z\[ZZUKI5?&1 +'8^]isy~ppa}lCFhS>GHkLuwfVl`t  [ncXgudwvfnvntXf^omb9AYl{y}d{]y|s$XJPDunF`[pwY;UkxmK"$%o|w[s[ICTHNT,B6?E(72*7@-2=:::3FP-B :&-5 ! ()2(9$=(4+(2"$-! +& -!067L3MV]X[SRfDD2** SHRUDJYcSU<G-*     /:Xzz~vknRVYYf;R~ahtzpr $wyf]ljnqo@e^wlnfhusDX`Unq}ptx}UyV<|}OOcQh}75@!)qibVfDNZUOVQ?<O?#'697&,"J<513/48283@/#%.'/>-'-&,& 3 55(1) *+%%4*(3'6PG?T@ZKGG?>>= JEEEP?D`MP>2< $  3F\oTov~}jgyky}{dN_`iYRrs_Qxto   zdU]xlum|pp}mc]eXdsgQa_~swxe8[`e~\jtdylcoXY9|}ZhqP^UJL^B<08C<'&0"/A/D@CH(/.*01)&*)1'>C,@*2+.5=,7A%+))%'!'1?$&(+'%34%,B"3,E?KGJ<.!(=3:)6\8QE@?>2-7: #/,HjqT`kv{oe||MVPLZbu{pf!@ y{{c\u``oxc]{xf_Ych~|zOY}vtv!eBlwnaiOcuMZ3 npSD?QgHMhGI8//1A .061PGAVM0IB%:H1#!+32(%5697,(1*+C,%1':".,21*)1*&8!62A"%;4..$, 3;?68LD>QE44"&+1  %<?Naa}wzprypqutLSEbSuyo[s}|q}MZm[Z8/7;& pqprexeX|fu}lwVZn}v|U}p9IqPsyuUNdac9+0}jwXZTfRjoLM7.'@+/'1"1:CQYLG56.;,+."1. 48'(83=09O*6B-$)**)1>#-5.)("$*'+#",2;6&;=(18:<%(9$3-1723<>84@5<;3-' 3GVgxtnYj^l=~{ilnpjmcs3\aS^bC \qqujiop|mawt{xrqy|//1w{wJSXjj{qNq?;wcPI8gxGHHHV12,113:JYfP:@43*':'1(0!))418A=$48+"'$:#*%%:4+#35@5? 3)%.,4"&3***0;;A.1)'1SCCB::>25=.=4.2' &9HAaXxtxcLQDEquhUEvrpmg$l_lv|o. laox{~wmjzxezu{{ysc @G[e]{~e7(3PzznzTH",<+{OfXYs_L\YqZU@EE:1<.*-01XDI?:-1'&&/>)/4*&004CD)6024*6 *%3<@1(/+1;B=1O/%%+K)0.4!/"#2:"-6#(&BE7$+;#?F9?CLB91,+ L %,I9gbm}{zOCRUkoSvcvp~28omgovpqR0|wl{i|ac_q0-4@JT[=jXtC/7V]G;<db*vym|tu\_kO?J@<*#79(H@>;HFJTIH4:I9.0>@-/<7./:=/12(5%))-=58AR>9'%@+<,29AA8:%DAI>@ 0K,*-9.5<J?CD>B=883 + BUNiyzjufgOW=CJah;WoqA$Gxmylo/|u]zux|vmnGlxr /*6 AzH8> B7EC-)H$zhux`ol}bTLURV=XXI)*@-9*B<,8E*:K;3D&:<BA92)343>(C;*)43(R24)$8))'$$M@G@-Q05F.5L4+2"@0&;=HB9?2$-!0/)?.-'3!-)78COB-/<&0' '($ B8R_zmqfcmWXTvektyy{'86)yg<RqeJxG }hs}urp^iv   !wfuQL`iL?-:56@5QE><6PC4:CL<453(0*8B+'82/;?;=78!@4:$&%&+#9;=5=2(;=+A:"8?DB@9H515.OP71 89*=9187?'(/D.==L>5;"&     )$"#C(>2[_bys~dNkId}Nygjg}"@6Y`FXgtrS wa\]h\p}u}requcNB 7DMLJQ>=7MSFD8SO61,$)'E"3-3.-?0<[A2!(55-=3"1*%-AE=3+9F,(56P:47:/II/4JC-=1EKN@43240?G3<<4<"& &"+:D.BB:.2FV||waoZQkwb|~{mp'; E2YdM^Uggtb5 ~}y|wmnVvj|zvFRE>:)87D>OIKM<9M3?1+AG;+:''@6:2EXKF_N<3)?(;3&*@+E,>:$*,1?;@1@005?FPTDT<3WZvW{dC4(/14`AQB4-?-    '+%P;1 +CPC@B>6%Kv}~ufVtej{uwkmeI39N'SN~vKUJ$4wtytxsk|~yhkmIM`WVWH2-NMMRTF?<A-6/=7;*'-,8(A0AIOLpe[W>#GI%#%&+%-$(<.3,672$($0>C,SMADPL_EehoLV7/.**).,H3:  K#N9  %C$=7OQT5Hgwruiaxtutu}x.*,Wj]LJizXZE9 v}f}[toaes s~zqnvj{wt]Wc^:^81VX<?][R>B8)E16+4N20"7B99%!=;:Nk1606+0(.<5$).0!(.+#%1&1GSSQ\EPWysQAB0+;$1)/L/#'   ! @$FH;F0%2',1BRCI^cvfnwz31D+k9jtx|\8" Rpjvh $giy~|bdBY|YK^QBHJO[SkdG<L1<I7C20>2E7??C%@19A[cQ@55+5HC7L0<'2$&#4$%AHQ:@bLI[Xbv|ZS</O',N1'    ?oY~e  '9%Y7QXh{z{{y\m 7B3B8$``kO%3 )& zkrgkXt~"|tv{|{grn}gxj[6SKONTJ1:<7H?`R06<:5307C<,1=/.@Z>! @PIo<QC6)8M@#*;)+0#=&' #79<9@?d}juPSE';10* Cy4^ |*< %A@[m|jvz5 7)Q7JofjfT 2B909: j[r(*  ".{ptrwSHclFLnhmY7-P<B,9LJGJ@<T37#7* .'</167=<E6U\:0D;91B/<F@C 3;.,,3=J]syx`X|oeS<    +!806[$9EJ5-%W5#CGTTci^|qowX(>31OKUfyUrZY[J4 ABS/;Z?'iyn9U%4*7("#<+0xumd]bjZWCK\RA<=IQ>8B2>QF=@NJG;3558'-8.(.8;.3/3wB:cI91:BG,4-4/&$$-!'./)(:%2H_lcUNSvlKC;   )+3Rk E I9sF5  ( 7VYXv{rnj/AhdMS6lvwdk^bkC#*. '!D^a r938huy C[H8#%8@3@#$ 0.ozmu}_aB>YRIJE441GP?@8C(<Q`V=D;1=<0C34@@-+#8+1J]6)#CG)1;<<4+#3$*/H3:+"4.?*-*(>KFQ]jzajZZR7    ) >7f`@Phb7z#   *.K\i|Z +%q62csiG_Vu~wooID[-'  )GR. (% 2[j^s5)ZG%1^309MK-'#PT1 .SP/xu{xfsfmpZFRQRKQ8D4I?9@;C564GL3<QG;C%)# C760AS+3,3+<V\^U2@=6D=+P.;3C..85!,A,50!((@):&)2KdX`^xh[\]>/-   0)+"&5<jt- (/$!(#IhTt 4)$k{;ZnxjH_|X/>:9 CNVP<.V=A~owG[GG220,`OEJHI>'2]SI-7'"/L4J'PjgUJ[STD11ABBHB.1MdE>AE?G<II3).11!3$)-/3*:.2'A:4MI+6)23G9(I>%)")+*#!320-!2A/70%'>GMF`[c]YHXJ+#   ")" 1%)#%<:]KA>   +-)23 -1(QSbk 8! drlm%+\.{O@rzr=5OI*+2r`oVV ]Vmzo8-.~&<"^rbhP@VW]?[f4 9>ARnP)ypv{isSTP6BA/56<@A<GJf4?1#B'9Q2-@&#&4. &!"4116?1/59.*49/<=;;85$ 3'%7G;<65&!4;XB::H3mqakfRD<890  ")!"*&&.663DihpucxI4@0  !&30"&$7CLsgu  tgw FbS9`kzwkzT[OVMKd}|fCY\EVkuU|U\8I<IZF2WnGxgl}xwltK7P?;41@%02:1>\EROG@@13?H1)!%+;&.(*%#;D7:,>>3EO:,39..E7%1' 5.4>'3$%B*AWO`l`VbSut`W[G57+!   6/,%.#*8+/CJUAH4,  *41>*6LHAglvqsn0'!LbGj1Tow`G_EY7tz~mzN1@]X qd^\hH=(@A#ocn}|zmZXA6&05.%3)F91*BZ>*D:2>1+(&" #;,.;*2++"935211/099@C#0%,&-1)-2.( $95Md[MOkVTKIM830.5  !,"40'1  1  !)0>3&,&  #0DIXKVr[_rvalzGb~&LI$VVTu}t|ziv<@hf]Qlf= ]:p:@s1gtv*$QFD nuh1b[$.gdj\[AI-.<+'+'&42.A28?A47,0#1&3  #E=1.7)" .36,)!CN00590-2!'<$)(4%3'9\HKM@-BO=1*/$%# *')&()+% "G4 )0#4    '  '+;;nAE@IJc|}e\R?u3 !   17E3Cbxg5aY}mt6#$ Njg-1 jnanC.gYAoidUI5'# -  #%;6-3J:!!0&312(,;9.06D1C&B??&!0&*#62J6(*%  (1,!6,';IAb;8BjS/.*',!"  &( .( 6=>:?)$%1"       !NfI=$FFKdwXgDHx :vpB>4   9#.oQyhnYAGHxJC&I">0{nN,u{[Eltwc|oq{wWC/.2'"- ".#3"1* ).!+*;'-CJ03(?5="-:&0&/2'.!820('/(*) =OX^AII?02+&*"  +)2')>F<?>>+&2"'.#'     5"12FI"%>LN`|\modaophDOnp&V_'v5  $Q#nQangdyboukqq2KEBcMnif)% +)KwQ5E;A6ddB(cl>k`iGxybfK2,337 "$#/ %&>3 ,)08>:.?06916+?/3:%-#6*0C9Ryi^P.&! "( % %  5,.6AF8K3.9082+#+        !"#6*EB3D(8?cC7ERB]nzgcBKw"T_N{| -]CpMA.WT6SVRfBd9<62'\Xo_<! $?WdLey$v`*Lza-}sKE83*$'%$ &-%  )#2&->)/7O=0BO2=93G<?$. ')#+*"=Rfr[A@-%2*$     '!%((H3%?O<N1G;#%"(:&&$ ";<Q@)'%*>5F67<Sr}p}t`-Exk xsP ,fJ9"!'DC(L&D:5ol>HN17>mURr}gXd)G!#& /* ;>yG)!m3\n)Vv]#[?1SM;zZ^H?1_03)!#&$.)$* ,=:/.NVSGA.&J>.19+:2/*#(   %!:EYwzA!30-'+0 $$ '52  N'$D:66!<)1(  /(       &-6#)&1.<BMn|~{~0}o~b@1'$-TM$G=J*$ 1 .;f}rp45-#( $6:]CB-tB!CM8[q?\4x l9b=sEnby|VU\<5E+#%""  21>Q;QGHT?5CgK<'F79=>%"-   >BLT=+$      %3&4-50>6B6=37D2&&,'' 1)        #!#&'&$E8Zllv+&6CZ<QR$1!BGH)($  ?11aTWpuVWB &/:-1L =:Gt<kBB4%v $wd,$]2+8$iS=O8%;+-$&</"7%$'*.:=LEL<HI]CKML6@J2.-2,6). .Lvms8!     7=/<4+>.95AA0M>050/-9'?"#-  )) 9AOjd1'FFe^*#:&80'#%+*<GzU=<FEN<$& %#, O].^#BffT|'#K', 9  1qK-2=8-:*),*/8+5/)%!" !%-3@NIHGSYG]EJHpDW<F=CH,-0*,"&"+(  &BTX?   '+0!/5HF>IS;H=-,6-2-AZ 1''6)          )'Wbo|FRDV1C(#021~{=9K>\gX + y4d>\8:;o}WSI(GwnCyej31E5J 1N7DCe\N>Q3/&'<-(-:+(+/ $+ 4"*:-/LF]6WmQWCGNN4GELI'VL%DU' ) !<LlzM(3 )-8>T4$=&=?LKD0(./4B<94E4/%43%  !   %2Zvr.<F7=D*/G27\|UH;tl33,Z{ 4:S]|>N=r)i2J:QS^DF[P@M1 0th_FOBH+#:-!71F-4.#(!:.-27+J#8>RHEEJOCEL]7w^V?(ACES:<J@-; (-3(!!5DMwTYQI6-   "2 .KML-F;4B;IP0,-;;B9"413;:$ )          4;WJ5C>$'" !  6`Gq5@ufD-MhsuY@!a6"@ozrt|}l\{4~cDC\0F570+,$!/(<'E:==FE5:61?ERLKF\Ka_ukpM39,?FJ4-(B0+);%9."&&1)gT5J;-7'? $"<7E2EC18CCQH@75/,)"<<J624?.4*0*"      7' HADa}QL!H96BD 4 2 = 5<Iz~z<z6>Z)#Q[y\uV4hqFUwC&dh!F/(9rq|M|o}}L4|bV>S8FM908.27.$))*5/$1A>FE=>/KSH@CAo^h`O*?G>>MB98):;:=/(:1$!@DD&*0/0H8P#&.,/HKHBYCQ5LZWM.8 --&/ *48-,5K!,0")       0+*EGmox||1IfLIQWV=35/0@    &YY}mXgNKb@2T{6g`C>vPf}PEfeL(bP32AA$/7=0(*=(1&-,#()6LPfT@NIHJr}|pJG@E??T>--L*?.7;76"=0$.+)&<NA6=;(4AO=ZqNL?KSGOSSD670/(-%5 /$(        +#! )=@4+FD8UWg{|IWVU5  2UPo=+ (F':[v`y{D`%X/.`~98OK .R/R'M F$lf61.gd6OMG@64F+?P )%((,<DUITX)O_Jb{K75-'DS3/0+=+23(14F/)'IW?4=&A?8C&-&>EO`Y`PJJHpiTBKF16-. 0/+( ' "$         .9( !104*&J>KiZiObv]d<*`K8G^xPE% - #$^d}\/?yvol~f  $.@XB.!=YntR'Lon=1kt$54<fL]lI/_=03PQ.@:)6:-6'DM/(,2/TXT=9;bLgg|ZIH6:KGFL;;63+68=H96:0)FGGZ#69*#%6APEUYERTpmnWLSA4C"$,@;/ ";$0(#'   5  !=/D;;*=bOpkp_a]_$\8^f=2dHgz_Bi<!(<hg$>fd`qoxy,B(I?u_xVAKbTM4&?)M\uSXgiNhEHJIP9E(($4W?#E@%/(,4PO/<?T[eTDI9DJI3F;G5)J4.31#22-95SzD>=),6% P4E<MNPgrlfxlW^M#6? 31!)# 3.     ,  $5F9N;F9E[ana?\Xt L+VC8& 1:XTsAFEA  9#2F4H%'smsvzXvnM\O(aSCSPXt a0'6Wwf3 3"?690fU'yZDCF1DLC=B<27TB'*5,2?C+09*5E7AS~uF7LPH5SG<EB(!<I/&+"4YN+--DJ/(/F;D3HKV`XqceiYGK<-%#?&4 ')"5" " ', 3@SHK1IM_`OK\*\{B micV\PZL kYv_-/tZY\YhetiO~l _|PorZVn~kD2(Nbi 'gYucJYmRW$AwsG-\FC902>O)CK/:A57.C0,C1,8F@:\kPe  QI`MLF+1 0M685)9882=@9@46;B>RL&<+#!I6;]QR\ldNdcntF^\E*" *<!C !!%"  (43* $*5;ON7=8YMGXjw    $}svPD_F%gf xu=\Fbq_md]jboqh>f}[zYs~kl |7qL  }Oh9xVxo"H\^ZAKa? >8EPI9\.<CBR7+8.4/1,<CDA/4rgfPn`_WH^A1-7F3>53%-/=CBM:QMF=HXf6 5.1,&*'BITQZci\]jk\\GV\:&&) 18    ( !"*  **0%2DC:[RBOGOm83LzptNyT  $iyAULl`wWpgaibbmlx$\gap;K5Z+BoRl=GAImK8M? =GI@<J."/C<85(,)9JH33JGXO][JkroYOFVA@CAOBG7D*FEJD.KVIcE@HV7*#A- +2,8P@(MZiVFRqagU_VL('% (-0 !#""#$) '/ #;2EWKI^RSy"@i  ut`|qm|Mc8"& 1M^quM_^cFAv_q|sh{znzdu?kI`cyt!E X6{Ork6cm;4{E5 EGH<E>I5RH -#'?.1%KA8QDGdRXX\kGWwYOFH4LIL=5;6PN%EHWR=LG1M:O==()))""&+-6<:NAOabTStlmXXeJ;9> %-)(       1(.7$ 7OV> !5IZV^bw4|EpvlN\@%":F *e;?\XWScw~ogUQfsv=|`1s[l{U2jWidwjmVL'@pkOwL2-;J?=9EB<O<+,A#",58kW7SBQU`kc\isprL;*?8C*k@1R/'K<9BL>V2:L:)3471=@3&1-0;@BSFCDfOnoex~iW=  !$$$!   944''# )--Enk:2+"+,<6-`|y ;n>6M&|n}qA1pUWdSQ1=Q]MPuo_~gjhvUxbdOnY|5C}$ZlP2LpjWkuSm9/E fZ%VQQ<NP>/:1<;>8*90%#?3CEKJ[fTIR?cLE[bgoqbWJB7.D0GAF<3A9M>J=9F/89ECG2A#&*6$3H7<6QC@F=\zKV`_beXATC(#  "   "/3+J:0.& lx J#5<J^uQ#kc_?  17=M|hMfnscYHC=Nb@b`i~_acadVx|bW7Y,[\fcfD}t[D f$l[_RM\9,1I/RHZbH[N]b@,J;>3050M+&731>D3J[KP@]X<@SMJ`[4A-O57F:?2C6ERVH>AA;-H3F7,;/%/',3=(F ;4*?PbaSfYQT\VPA-<'  $      5-7B*6&$ 4 i|""/+4P N7-#+C % #&\cbp*I00ExZFC5;><HqjU]^[PLeZn Vai`U''Y{2#8}iv )CEKGC9.8. 0b}:tV]R_gFHN=8B*"/-1 4;)%AJ2BJ8HYcNRVJ=61GJLGML-BB>F="GOCG:LJD6=?0K7! .(;0-68G:A@:.M<#:PcUaLONMzZ25'  # 7)%5.:4ID?:4 ;r    }:)0W>+!xz|{euuM?/:" +eTF=>I4&%0 XLO!/EFZtfNEz`DpY_]8C2i%IT.&Jd^*M][[ 9,go ^RO}jE73P(;  L3hch\`hLWbNBRX;2A9H1*%!-$.M8>:<V6OT9Z1DGU=60;R(;:13OEM<:G=8445->G@=#&6;/#1:>;BP)NKACPOID`MUPaH=KM% (&   G:4I<;T1$4# +*o M);0bol ?IZSbfwJ%H %<cc'8#hS:$-ZQNbH^]_hO^sQv{u7AJB?<V#1-k&#:{w|^6vu?3L-"#,OR,x|*mu\]QtPH?Kgg6DJ*J*$6# 7%0/1P@EL799QF1<,AS6;9:>@3ALVRIK2/10K6,,(&+ 4$$3$-K7==M@MG&<KKUF?aSd>46&"   ($!#)  3V?1/I840C,  < 4;7&DS^ >[us_o]^dqv&LO+kgE459%(JTc8IO[SJ<G^v}~sw9dK4F^aZ1K1J- ,QrihR" & #A'Ws$|pwVmR?\XZTN;7LE1#N*$"&" ! $")"$$1U1*.10,3802687+5&:C@0LG4($60/775$ ./A4.C7?A=31FD@FNEQLKEBM($&     -  />A,K:C<495 0\1| FC09iTp}?Rt|~yatviaC1>$  6N)omK;;RD1D@]g^gK7UVVKc~mm~|*0V]sgf^3XKeWnwaT[sWiIW;}+/Xfj|U$wws{yll[JYJTKJCJ7=8 @8&+"'3 "4#"3*;G%-,#5-4/./9B@><10/$1"(2,)319A9!22>,C<?PHF[r^E>>L,      !$# ./754';UO51(QDV t11 %1]=acD|~z^RqdU*  MgQ>E:(84?MMHE@ODb^YZUozkmzj AGv~V7rp\[|N,DEVwqhRKSn;iX ,[wHtmwVfLS6:HOU5;.9;+>5,'8+.0/&"*"!+.2& *%++.80D0*46D6/$#1&3/,.)/1:H)1<F78EPBGA/*74$     6:$7489J !G0&()    LI> H (kM   @S{2Htq_~PK7 QVH8I(/-^LRZK2_BbvQ_Xhsx~tV-FZYaXaDx8;`rXG'4=ginz8,5HCB>jsXwt`LaBSKHXWG2;>0%/.!**$(6$D30-25,!  $+/%/+.$A#>%>:6''4%#!*7'(5AC?/*4.PYQ78&<    "    '0R/L'0F/!, # -- Qd{5`jB +@Y_WvSq:&   qpJG'/%&)1BJQ\EHFY_L\Ur}ntzz}}vy~,@h,NhVO;@HbRjV<;%H#/Ls/6E/*atuqs^JS[C5:F*(0<!(80#.&08/"2.3)) &" 5-$6; $2+&& 1%)04 7B>EDD@E6$7/+!$ "  '% 83"6$R"/ (4GDRB"Td ;R% (2UHf#^{]9mwpGW=8@&$2DOnBFYEbWW_Oli}fttrtxy!84Ni.'' /TLC+CelEm_ "*++7@g{we{rpaYXknOP+)53D %+ ',%*6&&!"&   ! "!&! 2,/9,%7")4.4G73?:7*18221%##   #    4,2*-&'22   DFNjgU 8G/(QTi;&,@Aa~d}?2qynW\C=0$&87Q1DEVPPIMTZflmpqbmss"+13FFKUG(&0*827F\N~Mhq::%eqo;bUVmpeql^_ZnVQA/7$ &4+ + )*(& 8( "    #>16)(+607)46,*/@K8544C)(2@<"),5     !6<.@$8( & 5,/3[FoH&7?e8^(O>.!  ":J.8Ol!ZuV)6~dTa32H-6D 8F*IaXS?JUgWd_udke}ns_&(P);4-F5G#% AK:lfevw|zw+$,N[aRP w`pT_YUk7?>7O+$<*7+1,)6)&' "-  +   +%+#3 '& "&%2 5?'3?BAB>0+.7-   "     ( 8#*<"   2,8,.Dej^J" #\ehI+(*.$DC60Qfv%D}:4)sbUEBF>6=(++3DbR5CGc[\xqsu~jqDDRA-!8'$ :@t/.VhiHvMD# .61CopTT<0i|\cb|dfv[J>54-&NA><:$).7- +!1*&/ $   (!!55($5+$++#/  4.-4&)&M12/19,     <(%6% #    %98$?TL3*XzgOE25716J9m}8idj _L}i^JU-435!.(;4RIGF<U>Hct|zsuz*;66*a?(>& "#dZrUsa[D)6C* 3qe_M<.lr_mpzs}E7PXF:/U9C0(5.&3 !%        " )/'(1;"$ "! ##$/;8 *4*$    $76/"4=06,+    !",#@oj. !EqS;TbVZD,-8;:?hUs'QJ(r GjiLkVL:60$"+!0:<TJG<8QQqk~tpm ) +"T$!Jc`J}<FphvTZrM &st`nvcpnhnxUZZX:TE75>B,5+,7, '    23$:$.!"' )*,# )%$(!  "%$#'E80. #=H?Sy`S; "IMSYBFKIF.2I1$" ?\^AM]b$<EXnx !r\ ||yZSDHJ1"( 0)..E7S<I7[mwoxmtj}  %/uA|ag]~i^]]krx.8;x|uXgdjjRlxZXFI;6354<>1*; !!       %+%&.+#(/+).5?   $/"$,"&&1,!  1'D=M`oyfjG:FP*"5AOE./'>9& 74>SeSdv Li_h$#jaJw~\LRGA25,03  ''"JXJ]PJ&^off|{pw}gy}s 9  '3$.3-"$h0Iqf?pUIjm~]jXx|v~I z|||ksQOmTKon`fOLC5B*,1;%",&"#         ( )--#2"$*/)##%  () 0!!!!    &+>Ck}sQ0 %2C-%,/?$/#1016 0FDQm} WLWu~/}O*Az~kj[a0+/+5#  );J79CTBI@aWy{o{fu~hvw$H^T;T-$ +*B <"<7cZJ03K\4:tWs"!mXiYM.yubPTjxS\ce`T7C>5GM)%$# "      '    2 '$&-@,)   !"'25$5    )PtoohQJ% `!+'''*,(#:+) $.AZo|:MU\y~yYkJg}~w]OQM.7.-'52,7:;1<ONLRFOQFn{}XmXaooC p+k7!0 8=T2239jcD_tNt'6rtua=k}WfZud^jJcV6:FR<.)$-!A% '            !  +&=#-& #    #$9;.F6 %:m/LaG  8V+ "2%2.$%+  @=tr >BUZ#xYK^P~yvkarjkx|v]d`;;'-%"&$418>GPEURHKGVQ_jWvw{|pby(YD-R (  !*- $YgbmeWI emjZl^F9h^^hv_b?|zY^]PF?T?A82D24+ &       #&'-.$%C   9,'#"-$ !=;=DV^upL$  D& 5!!$!8(PQr:VY}{(0>ZGRa^h}idtwkVX\R?1(9-0" ,&%9==HQ35,3OQdqnx^ezoxw_mnmLc k [657 G&C:XEBnas oHKC;lioXSeBV_Om_CI?=12&/+/"!""2#      ;&%)-*/ %<C:(#%&  #3.D:JF5E    'E&*&*30WNz+1 MZ 01< UhI \\=s_rt~|m~jgu|eszNJE68& ')%*6;6<=0@EZ1EHmeh^hYNYv[svTQ{ohvjw%NOY\m_vihdHPNF=R{I_CI_ha[4 {\<2J)zs{blXga\YXFSF9(A494A)'&"+,4.5     &",  5)"# (*      <7.'@+%   .1+008*!    #9$(@6>#%  "1Jhk /  '0T` @E%3|Hs{nYYcqXwqxptsWZVfrk9;4%! (/$AR..L>25MF-B?6\vcdQlsA]`Qnf^Pyfp1h c}iZsq~sVaqrj#wK`%,|iggdm^dM]<IY:T3,4>,&& 2:<      !"   1+ $ 0@"     =M7E#"5    .'0)   .:>@5=BB:* -Led )1<7~\\y}[RI$zn~MaHjIfLwQ_Wvz_sueXQFfB%+.! )*B>2=)4JRYF2I%NCiKDTzuiTc\hrndqvp]q]v? h zngx{Zx 1/LA`O p|xxdlrXXJfABLM*1:>>-!!$ &)+IPA..%1       -02 (  1@55"#(      +/80  !  F/,/,8G(FKj>"%*-A4/7=-^Tiqrc?Jz__pLAXSX`\wv}rureweIKX[PA$!$& ,/!H245ETPG;^HJ4LXYBlmM]njyoax\NUbq|eJ_jnr[Rm~).#~\8B}st}wh{wug[P_BR3PB;2;?3+(A//,/!#*+ #.)"#*#    " (! 6.(!!' %,5/'!"  ''.$2 "(' +3.6,/A1@\Vg3;%1($+<)CX |T>/#wyem^R_HBUW]c`NsXqtjkhLp`JM8*%*&*%0?,5@#OAJM0;3\IEAB\gkfrpcpg^\]UUaVprs[~#gjUrcvtwdQUotJN;{yw~iqp}eaTKP7HhTW1P<39310A)1(B,-@B ,'(!    * "$)/4,'+'   '#1&"    '   $  #!5.E-J/;'!:S~$75(&,5Ce^v U1d[w}}WSZF`SZ`^?ZojilYrhVjR`UI>%9$&.   .HI648GPA0AC)AO2XrnZ`yhUYHgNwi<UcggPrz>}mbau}sA k~|xpRmgvg9Sb`LZ2K5'546<.85W&5&56/5%"3&+        *#!##% ('5"  !?+.% " $    (&2&5<=/BI6804]b 3%  %+$:PQh\Ejx{lEpJ=VVXUbXPYtbiPneLUbYXPOH:J@&# #!1*F0"D63M6MQHCZ@YLPRl}iSdjrNOJcbhaSiyzf`znnf_tJPnZ{}uu}WbcBW[\Ea?K:L`iX94<Q0810'CC2,(*.%#  &!!&      ,05",($ * -"+    -1 **       +   8  ,'44=I1426:33hy%05 /173Cr]ku8 qf~fh9Y++GG[paZ2,acLO_ymfX[oAVC.#1,'! *%&5EB335<WJ]L;,^UIhvin_M`dKR_eVU[Tc5*HO|]uZleWL8sjtxklZlWok_\mZMWa]pCAVCkNV\J06KBCG24-   (.-(%'#  "!   ")*/" 0 $* ( ()!    &)/=I8'=?MF(Kq "T" ,3 #X}^]hh@Swv}rqLH;.+XOCTM?6JSR^\kY]]Q^x`T<*B!&&* "1)254DK81BLEA]KeMNR`PDMViVnk@M]co}r&LpfWieklT>3guG~-xz~zuvqslntvbXzbnczL}KnnWnassRMBM1,) )5),(F()#     3&# , #!"" +(3.$,     "!// %>IQ7UPMWEE1W^W*$+?"N'D@gS|aQ%&~vsrpWiAB=A@(iH4PhJR>Xj]m\aIGXUgJB@I/$.  * -.$*&&C53FHAQ<ZMQK9=kSWUc`^cTlb`XUgmCxqnqt~V\TMMWaqe]j9jvag{:St]6wvuwzm^nbn~qkbvchkl{`cIJ6"/+-1!.&9+)&     $'+'   )#( .%     " 4#&-"5[T>@I=B=@Qb-.6  =A'$9Dcwwo${xktN_4WPJ@D=GSIlT:;JIpxaIJEO6kXN89?') % %7)2"(22#+;>?JPM_9)Q>NNN[T\lHQoXUgUnhp7Xjg`hq[NZTM<AYB6R?IR|]u}[p+%[[k'z||ysvuXuyGmbkzpyvm;:46;5DB>##.-,$0'#  *  ) ($    $"   '!13 )!+'$! "09MF\IFYVG0Mlx6# 7&EWMBXTW@bM7F!pusVR:JGLFW8-=>'KXW2AC_baRIdJPOABDA3! 3   )/'+6;@D9Ga[NT=Zoiigmdyuj{sq|o>B,(NRY%WQL-@'3H1%%4'K[9VjSfQB/@dpChyty{znp]Tgna~wS^K>XJ7OQ5),#!&):-#       !(# "       -,&."   ";)F/KSbNH:I]t e^[b`Y]U0"|vk\JmclU63=TCAIP^=IU`C?E\dLQ=I]O8A0$!  %6(757HB9VP7@gKTczwjfotxsw+4@H;PH-$  0 J+AI-LFW.HV*8>;Q@@yisw}zxterefPcWsbxx|%Jw{PZNRDQ*(1!$,/(#);8 $"%   %  %     3'   '*+-4 4/6>SRo<TIIV7Up0 ?7_uOO;?3$|{lshg[SJQ7#?.1[S\S5LASlwZKWJJHnJ"K;1 "$! (!#,,4=G*CAI^P\VGOqxZ{Wugvfd{ 0 )$   4!&53I.a+* ._h`Ko|tttthwLhe\Wn\nr~kN\U:6>7+12+/7,5C.F58 (              ! !    ( )! !+5@ZVVJL[kIKon$7]HJ%6ksitmeb_AO/&1/4JpcSMM?2PJZRJ<+QAHB#2:3%$  *(4-'??=BBaF@BTXgdaNPSf`p~ !  83>CF.wj'slu\}p{qxefmbvMmRRP_PSeectrrunRBEL54<H;:5JNUnA8>/!*#$               "%F%)  (-*FJV\X\YJUM_-O<"?' zmpjon\bbMB<;@9OKFWPQHLbI09:O<B<595+1"%  +).%!B;@IRR@7AP\V_eOub$(#?Y@>|lkjYfwfnwz{w[}`Mhxn^`meYHOi{s^_fbOSIR6.7?8@-#<L^{Z3?3''#,*            *6-%  ^`Yu[a\?PRj~+)}}px{REe29.%3$FK^jUMD?L]WB<EV[73+21"  +'(% ?#/?UC<D$:JK\nh!  N !-<\ xzwm^lwwcLSwv{fcwP`onqMTl\HmJTq_OP?E6P>=)G,.O6-4RfbQG2)(&!%9          "     $  8!  #?[uPyh[Ka\YdW|uymommxktxcs~H$'86 $KPW=81PD@7QE1E,630C%  #    8( $&5",&<AFO'6>-Xawu ' HZ[v}kh\jq|}oufa}mxeooqttgU[c\dO?OHBFCcLSF:NGQ'8A9+:SFG=XDb> '1),               1       &   ;anpwtZcpA]in{o{z`nn{oZdvsrF95A34^F6O2SA5@7G>WJGDJ,-.5,/3   *  2/S600LKSLInf^t  "!%/@,@km:ukuk_Zlg_kZnqQIbz`Rrzx|y|dcXq]ZIH8DM7%;9E>MSPO>KK2'MFHXZi!e`S9::%+*-5#          03$+    5Q]}_g|omqVmza\tgwuz~rcbs~|paj_bulXQ-J^L2V;(I(-'6:CIT<1EN8(B! &"  ?5$KB98=D=HRfe^mn ;,4& D=TDJbqo|`OYaEPhmWO^W`V]ohqsy{`T[X_IjSJ[VL>LP-7K5J"?4:E0F1%(S>7Rqj oobSB8/B I1$(-%         )&4 ,  'HWS^fZmiorOswPZjzw||adyVgpZztthvh}`JC/#1LKF/16?132O",736>6%<?'   $$:E$SPWILZ]HTppam#$>M?#   '$4G)|TWrqkdRcTl|fvVlyOPMQnZg[]tlhqayWMWYgJ;0</0H=6?$#0&52B`F?;T^fxmZRX>I;@*(""*'-5              $2-C,,7     (5-nj\_ZroelZsvafk~}z~echXlo{joubfpw{s|nor>0+8D/+A>SV6#<F<,'-- )'==    5'*55:dVe5JG_g{xbo  'D   *a2<$myGhnpcdMge?U\S`j]]IPIgpnbfcniQmD_NOKaRV8N=24.35-125<$1C\A?[f\\`eLaaKEN:9))/G   9'              +2=20$   '7RaYo|Zxtz|~zvjnUqzb[IiXLoayUce\uvo901F04G=P2N10<U=*AMH9&0..       %1LXnY8OYU~pg}my!E6#)?bFY:6cawh~ftrgft_HfmjJ^7O\VKJL]eH:J?fZeQLEifS17A;0"7#$ 9)EZ.5bTZc]RvaZjUQJ;-1;( 1.,               ".>/>1"%  9BYhastg~`w||ykfqni[V[qNR}bCbdq/%F-+7D'?>?=G>)QX:M)57)  $" /+:YF=6e}ktXaddo27 37!(K<OI;+ Fa^F^nl|\sgjQl`OL@P]VTV]EEDEPS;HiIEJP3MDGGF#:4+650 (#/=L7WZaqpeb`s_RPQIZK9A3U@0$ '.4+#  !/,-            6MbF)DF#':YWeyyyzrd_`cn^QjbhMztdbnC=_QSX723/8$,/F7=*J,985"9&!   &#+<IcQFEJdJkzqY`]l|~!A! EU#|A9EH[=!W-ABfdUNIYhEi{QZjf]nfeL\gS?GIEE<XZZAWML_FTV<;M2-CG2$',5+:EXGN^nnydbo]B[]AI^(WO>B-!11!-0!  ($<03*+           $#;334& $ /Oibapsxq}tcmSIL\S__OUfqr`cLGQLGZ<OE?##"*B*2,9M*5419/$/(.")  )#""A3SNPfem{b|mmli"")LDx5(}s=;8Y[/hpD=R^px`y|`ggrVUgVKTCEGSRNFNV4FWN7G_BbO>AA)-639I:-B;%&;R>QQWiIReG\_WKgY^HDLBKGE,2+2! *5 51<"*-$#0&     #%<<8>0/* =7J^oXt ! vtl{F^;+84?RU_2XYKkHRf9Y_[bEU?4%-%1I,'V?4HOMX*3CD($      #& /3?UWk_Paq][Ufzieeu *bmb?|~D-<8C:#e;G*TV`lfipTjoLKkiXRaF.WPX7<bf`RZRFHDISO@M3?J=/<(_,TJ/f\T`NUoDGPGA^5USC9F[M';IL-%,7G6)2='2$;" 3"6GH    "  2-   7(:!;>!$"'0<@pdB:7ntm}yy`qxMMWNKA6KOrUji\qQ?SEJPk\hOJ9-7/-4:HR&(C9H478>'4( (    CUQOjUTk_9QdrpUSWwvv7IDpk-vam $A G<EG]bg{~qslbhW{nNKnqN_aOpUNGY[RThZNaW(0?EOEJRUSZ]8\=H7/D4jB^bvVeJ<H@<0>A>$)@DQ:SNAH7&+ /"-#0>(-8H.16<)3@cmiTL/        !  $"3D;B#0$.- %RSVff@tjBvykzywkaWQ<AUP;BDh\R]aOi>QK5WG[^VKK:G' ,"),/ 9$;9M,R7?("&#4   (","2T@h\LhYD?JOX[fhquchE.@sjtxlnuBA16+DMko]unvtl|Umrhccjbf\WQ_BkwnpiM.C?=]`QgTRA\N>21CVB8U_V`SDI<E?2''706J/@)`X^XNZAM)&!+!. .2"371O> OB>]|wsnO;  #&        ';F;C=2:,%   )5@?ps|Kb$kfspwnotzvH^>XSA01>^PrvrYSFK[wJHYlF9>((),"F2A3J9HA6.@AB8H      )&0WLY^G7_]gb^m`Obhs]btz2Uze+EvsekxXj~t_[=878:Mbrrmgtf^jNwVUJ^aYdrWkmx[^NVc]wjXYaJK9F5E(5M2MAPReBAH)@;J#1*,;AGMD3PVYM*353.90(:&*YK6>4)<6DiPB.    % )        9:6<3A!%    %?6IYnmy<?T4aFtwxt]sessREIJZM9G917jbmUa@=C6XSkHK;<I8) 5%=RB8-=E04<>H=40$     #(! $4E5!8NFHMFVHY\Opceyexzr?WKH/#txnQhoSd}gYA)C./..HUtxr_bNtLVYNX^_X\SpwuyUakgIec[YTUM<F5JO<0=:"10B[SAF$6@;K'0('>"/J-:J/BACJ<":2)%%'J00<@$FO@*:/11-_|`P8!!  !  3$   %B=T.AI:+!    +;QRua >7 fvr\`XzOUP7DK*BEF>EckiGPGY3OOjMBX,"8.#7&#@FV0T6J<--:T>)?94   1A /65-\Q[ISSCiKSSggckomhm~(Ui:H,|vX_X\`sz`6C=7 ;8@-IPbsqlWDse^RflLXki~vmgKOWSO68,D@KZ65IS@"@5B\586(-*@T;@;:,9$#8IXEAEDJaTD8\7,*/(4F7=2PC&%(8@JezCeq3?$-*    "   +    8*UD2B=,@0   04<?Ve}"|{xbVw}WbedKJN:6CD6Z2IqDIWCF<T=^S[h; +5Y:F4AN^S9H)D7-E98 #  ( (<=2)J_CNSOJZLRZHHw`dfmxtAtJ<kzZUTQTMbjh`6V-?:/*22>6Ie`byPQ;mjeK_[gO}}|kfZE1I0/%18aO=BCEPRNFP=LJL(%5:C.032;C./^VV[C\7R^SAO+'?.-9@64=EG0A:*!>BoUSP9?.6+*(+  +  !        !I^SQ:N@J"9  ,KAUVYw{twqgusfmMnxW@A<HD@=iWtM9B<E=>QPV519./ 17!(AB.1);4<+EJ30D;=!        :'2N6DWkBOTd7YqOj[ga]zyrvI]osbYV:7@ODjrtmnUf<@(!&64?E@J@XV][PSJYWd`a_a_zZK=*03$'(=D[IH0XIC^HL[K64<IKI+<"#1 $BGB@IfiiAVX`>K]=0/C%"'39N4:T;@8(WHjHN5'&0!!     %     $-7@L^XPB)5 37N;dz|juemg~Xh\gI>iMENFJOEW~wXR>'EO?LGPn]@$# .2 #01I?GH59+j?.<,!A,    ,$>QB7ZXOO4YbceRGX]Ncg{ )#! |jgm^JBTVWXnbynV@GJ+/#-.!2*9;<;7VKjKZoS\g[mgaYt^UGM94--VHM?HMhLJFgPN[W=%!/$;*,.(5%BECHWdcUUjcD=5C@38^@F:+41"PB+.DBJx~fYK6S"81%(/+#1  "$   /YE@8]J1$!   &6-7Qkc`qr~fvorpmXH\_l]S>OKUNTRUGQ=9N=mLfLk?E<+32,94*/#1[;6-*4DM7,B(4/*    !";:3*KN/IJPEKLbOLolnbm[w^vx kfO_B,LETIUNHDUQG5C715%!+5,841>788O3SO_aLe^jZqk|b~sbRTIMBA?J?dbV\MPYrzbebEM-,42&@"!!-=A`7TxfEL<H6?Q=:Z3LB?7;AAF<=>A343`_rr_EFD3  6*/01;.#"        %JO=QIAM01 '<9<GNUkgdt~s]YAsxiZGZQ>LcTKBX`iWh]E2.5ESDSdWB4)*+&)/,)K72>?NMNIHR`P: **2    %;B9DCC=AIDPXJ]SJLVc^mWTWf|ybl[\PNSET9:A4)::,B3<$"A..5*1*/<5"1DTY<WWofZv~yiqZDKZhaXUuadMi\}anl[C:-5#.$6%6>3.U>S\q^vjWcLhpNNeFF?(1C!8F/0)7N=86APFT;4/;,4277>:E'%"J'          $%3?@<<5M=+"&##8SP`XeSXilyu}zzhgaIa|xy[9N6jWLVJCVkvb_`EN@=KB=IGYA?:&'*(%#)EBA?[_aeG/OR=*>*>,>.H-JFTT7B;.6]VQ7UUViRTodZ`TSOC7PA;+="0(27@,$!B)()+0-A?OI4GJm]lZXaw}hpk<L^IhhNVcrbAuedgb`Q[G;0/!*3$)!%D;(%>TNKaMIS_XP^khU9/AGQ>VJ:',(A89,M67"7.)?0.!*52(60)6"#    '           >,5JAY?)! "," ./?EEgkUocuwtt|~kdxY||XiHQSba1Y^[UREuzWYhRV<DBA990+E9'#,+12NIZdcU`CGbP0%'        +09'7LCSAAe?<+aTHiaRMLR^r~rp}xa_plSA<599=E+-,-<-CK>#88??"273>>V513X>XK\J=KC_YpxwmviYVZbfUVNp{sianfoNI<N 87:G/05K9@0-;FRO@LWkOdd_:,GHJ<0,)+>42G9C3A0/4."B-+ 5,2A>%!"& '" ,9,/4SQO8#%!"8:NEUYIpfVujtkc}xumyyj_XKTTjk[dDuG[lwUN^xp9<KM>9D.A2+7!#;@9XNBFGhj}icZI9&,:   %+%!$<>1IKRD45M5IEC>NOSZ-0c\mXn_ID>I@D)06?78C73@!)-K9F.I=.22-$OE\7@>28[YxwwdrjofyrnoI]ymm~ziQTTd674-1/')":C7*%;\?JXdRud^XiZga=249;(<<2.*_ICJ/:K535.7(5#5*1?322:7 !$)&$(!    ((6=APE30"))5F74WJLFLinaezmj|yrrfL^KDZkRXSJ]_\wtj[h\GRCXHN[;GM) %234g_PRKMsyeefD+%$     $   >2.1;=@66F@TF[8=7PGED0Fcvu~X\BEV9$*4&(0?,-2K)?*827105;679DL9,,374RP?@PScbdzsjbUWb|ytuaZHM?MA>B902$M1/-5AL@LWZsxpkh`qff^:6D2'5<1P75G8/@?E>:)&)7,8!$3%6/' 0+(% 9" #(,! '&   (  0=>3C:%!#  "2.832D6IIGMdwWSy}zu]dK6QSXWTJgURb}]p^ebMLE=>DI@J*111+>V=XTp]XkrSMI-  *   $2 /"1/F4$-GB7BPBdJ0MTFK=GIE\SjutceVSE7E37>9//-/84%(+95=8F1%EAA--F2TOG8TQFU?2HCGgombaplmFOhPQZjWmxee]gRW?3BJ'$6,?=#BRGPYEiu_Cax^unZ?BB%.F94<;7BL2<88=P4A74C,",("&")%!3%&/5+A2*-!'#" )# *  .$%5  .77AG3(2&(3PF/6SGS6?m^gYk|and}~~glfFD:cfo\xi^fxsuxyla;<<HEKCBC2.A/F3LT9WmajxB&2 %   -(:2+)1.02$:I2@CSE:LN>,@@07/?9JcXOEkufcybajS]Z9J6AQ.!.)0,4;8"5.4;[J>C4AM9,H2[PMD:WJLS4GD7D8WqactOMX90jduitCYIe3<I4BV<+"24A:,2JERG]Z``vMekpS3$6 %8#.07MDWECF?XZE@C?>I;!("C 6%-)+)/% ?=1N;0496-9/-+2!(4%*  '& /;:31-   *&3@S?6Q@POYcT]Wh`}zux`CFJ9L_}gssbok{}dIBk.<<;L-7.>1DOHRVZZntvrb-   ( $(-)!!?D2:G4.05HaA\BOK[UH:SU67JD@5WOOXU\ZUME[dOMUX-?.FG4(D.<(:EF9%+5 D%?D9bc8]b;:GIT8J=OEGG>692?KWTut__TKDD`kvl5Z\:3H[EF5++($F"I1<:EMn|dptg|^)8;=57N7<IR6$=AZ_Vem\K25>+"#13A, &+)F85A('3-@38/-.'"$=."+)% ""#.*** &   ,+4DI6+D5AFDCgjiqnqub}UYWIVUido|yqwQYdVI;FMYFII'E?HXfrRn`znZ0(    -  '+(:/7<.L2>F4LLPVFNFCS78@5N4@QXL@<XEV9C7VJ]HP&%)27 #?%+-=;$(-"1:NIDVEIA=ETHCMMQBGEfJDG7XINDakY>UW\lw}wq*gjeA3ME+!:# )D*/EW`EYpngis|+D0#6+"'29-2C?YAE23>NZB?=D/4.)51;I:0>*4,$5@(&@44! #4 (0=0&%"$,   '&"  /3=/*5+&1:<QghJbzu}nuc_t>HJY_e\q}gs`ydO\E.?G277/F),@Ramn[oo?:(       # !7&   &+1F>@O;);68:4QMI=EI@M+2D/?>HJ-HK68571;%+8+>-!*/9*!451--C3 ,D&2BPJ\LA9LAGZKSDMLZUnF_EIVbYN]PRRvwe*KjyzkhY?&9%-,)72N]XXsi_gkwiw/+0*'"'0%.14)C>P#'-<4Rck_EPRQ;H)42CUQH/."4!-K, 3'"2+2!9 &+. %,1% "        ! 9!4(F*7JXVtaS`inrcekUqqNWCSubcUnuwnwqbS<SF5O4-'-<43BV5u`u{uC=*   2/"%B2!% '" :6%:G&8=10;EH;97S6H58ED=61/9O947:;<0+>%14,1$!) /9&$:;>.9S`AOKI/BINNKOeemnYfVRfK`UgZOOnZe~fRFB$$54B/P_@Njh~puWgz14&,$2#6,/,&>4/?C2-94EHRQS>LE1/*7':JJ;5590'01,;&'5*)2.0%+57;A(AN     !$2?*34B54]YtbdzgryTctyrisk\i[XjgbTZ{y{`cbE58>1Z.(<6(1UIJ\Tft9%    9?MQ9@,A@'& %# 3+@!?;'*-4;=OC95? :FMEJQZ20=X:80.C%>C606:0(7*+$(*0<62IE9Pc=E7AMDDCHbAGTisuhgh=Eija]]jv|vwrs|okN6F1'-!+>61RXZS\p}wuy{x8.'9*0-2$)>B99MRW??@>4509 $'0/397, D+(#$301#+:)0) *0F$;:*)#  '<#*59*',=L]`cRUaZfbHP__v}whh}gpqzhgsMU[au}kDWS_VDI012! +94GSI`hsZT:    'A{]<.9H !0 '!&+-+.9&,.C%T=AK6OQCCK4%7D<*=D-%-,09E<>7.$ !#$*$6ZJ:9XHCE:_AIS:DQT\YZfZCSd[ao[Ia_ktx|zn}w]YPX@<71"NJfhQNT_jzxr4 !"A&&9A*24NQCLBI-?DS@%.-4"(2),%)+' 00);" #, &/9%(*"3!'-'-'.99;3        (!*2B36+LG76PABJZchR[E_d}veg\nvtrrdZ5]\lbd]POB_,?FB-70<@J=?PvtbS1%  "<cutW2K0N7  $ *909 *7504)<A?0A<92 4:/->((;1,2+CXK8$%  ,&&*%"9FT7$PJ\VAOYW\\_WWMddrU2L:iG:`Md[jwTv\_bG\WA<?*1/L]xpU`Soj{xnp{ ?8(!;9&6891J*51IV\K'09<N78.,:F*5!!A3 ;*))*#%'.$"$!5<N+4)/%'E6   &!!73!6#"B??BPFFOb{zzwyjf]re^SPLOw|p`pM@<B=>5A5.0&@S[Nc`cB-   +1".OOkkuF34"%*#8#%!9@-?80.:*4K>A3'0=83-5*61?$.:+@'JHA:J&20'!2*8#'66=HI:.C[?JICjlNYbQ_fyPlGCXdJ\VYQvo|Wd=FCITc:EY='YSekfOpumyt%0%+& *+;573/A1%29)0>JMBB6D@;B$$5 C0#'!**''D+4#)& *'#'/.0$+-%B.,$+++    $(&7;$("=$#&*/%/:>3?7_Yfv_[Z~{\cvRyeto_glM=?E_8C,74<DGKu}qzzwF1 # &*/=OZ#2$"- "0& ):EJ&;09(9J<='92M;8D70.??<C2C58+@<;4,C>$+('',0);AG;NQ=]ZZ^6J]cryytlids`xZRt]d96JEsxgr\eY]J;4BH@[19__adJmxz(*(11%#:99'$/3:ONBPOQ]?<JJ();J<(C(5A$%"1+,##)+:!6'+ $<-=;6A3!33(9(B5)(    1>+291B0'+//.=32N9Zp~zaPUzm{pbl|rflxdbjeZP2:A<Z.&6*9E3DVn|{uh\j?    &-T>_z8)0, 5&,! +';,'-<703<6-9/=6$,-B1(=9/J2,3+NAP<.7I>.'#+?(?GBOiJfKQP#BE[jdxwqrU]A8?4I<YoxlSbV;7@O 7GC3zkTetkpg 2;7:8)3D:39>UN\wQB<BD=7;06V1#R&"7)),'*$H,&/D654#$!%5$,;7(';7-1(.2*A%/,    "%      EA3GHGE;0.'&25.H:Y]t~yumiVsbr]c^vr}ujfpX:G9%IG8:B.-PJIEk|kpvU@+  02NkuZ7., %&)+!  )-$:23?/) <-D8:,9.%32<89JGN`@HIA,/)/(0$$-421@0FHR*:>Kaqb]xmom[cMVEEU;=YSkx~cEJ:,D=.7,ARDgiyy||a';=:;-G;LA=;5OLD]DQ1ULB=-2<0@7J0")I&)2" '-78.?<032% 8 4MS:,:2,"=)()% )   (#1  +B<Z\Q='+$&  -+/.'HSWfXv~hx\Gkzqo{jvzccIO;9XEB28)30+:/=E@WJcpyakjZ3!  $!'"EPVQn}\0>,*D1&! /" #-4 +C"(8*5 #0)<J/4-@@GS[BD75//!)#)4!1$,C>%8;BHUISOUdhsqerhmj_ogpQJ=RZeRcvuaE)1>@;*LNSZ[Szfv\J:5 01@=QJ1F=<.HXOA>KODSEU2 53L+2-2#1) /%",5/%(-"-$#4DKD7&.K;0%>+#,G(:>&%-     *%       <<Ud+/&& #-".88BUdI~uwa\HHxow]tkX8E:UCT:QE37)3+,<4@E__j|nySM./(/?JM|eoPJD:,1(%96/*#' #!+)*; ,(,60(0&)-%3)"!FhnoOI90-25"$#&$9,959<858]]S_G_hUgr|neTipV4>G;EQSzrgI0E401$,8Vhdjpwzyx|fb-EE<J>PO_?B*;L=F5NG5?70L-$?1H+2103!:.-,,8(N&:3*81+&)1A<2\3#!?D47C+$28A?5;(+"6&       &   /AH,1<.2 '#&'.&";CPfWarwinPjgv}z}_qG4LWNUUQB26#*/A@BOtouycbHOG  !,>?EH__^Y:'A@EI@;I7  #!!22'1-464& #&>&'6OYXBAB:82 91 < !("5&=98C=QQHQ\Uatkobp\ograhfH-]Vf\WyVB80"#$,MJV]{t|v}{Y3DQTEBI7ETFF?0A85CAB9@%3":+-.'(&@;E<,(%9&<03#?$ !**9;RR*(<&>;7&%-0A5/8)1"& #  -       &2@EDN6%#!4.&*7F?EQbkedXqxow\`I2<N]JP:59.!)>MG_`sdeuxocRgJB )*1-?<jsx`>mi[^[W\H,' ))#" )65=%".%-2'7RPTP?(5.26&(,# 6;8=DJDMJsYRfHe@\UMer_dhI7H3=RdRw}pi:9'((3?It~}xz|yiuqhvu49,:)?;@A>B4+04/:6/=,'6*$25(?'$4$"-@9/F2(=",:+>5"'>8&#)/'63QF'&#;4./>21(6B,/8A24!('"*2   $!      *29>;5 &!&!%779KjVUyrq|f<N]G5U=KB&2A-7 9P.LMczy]{\gxmhX:'  '$?EGWtkXa^fEZlU!!&$, !3""'"&+$  7+#$0,"0D@A+-/'$'-*' 0-4(G:=P*NMTGHJUM7;DRn\^iTKE8,QdXk{spQ:C?75=,NBDs~|t~~-/9922+CLKF,4;+;E6%?[29A7U9E24.$!,45-)7+2)A-,14 */1-8FB4//E&;6P2-42//:3<J*#"10#   ,  "(     79.33  ,#+!3@CC[Morty|sy|ubNIIfeXLI?TM8/"6?9?Keswtrvy^ND:  &3')Fu|xpB;kpsP>+,# *($$56"). -8BC86&00$!  ($7H7377DQ65BCES&2?JEDS]IXF-%+;cbwyzpoOVSOG;9',2@?Bi~{_uwzw{d%'1P"7;.(9H)<QE.;'..9C2""F-')(&-"-)#*),485,.4+G<)'6(+.;1$68".@+7&0>(?.!2 -(+ % .'' &     "$/*44$ "30=DJQ`{_p\XINNLKN;;X97!*15Te]oc^Je}YTjSL7      $ &/Ys{^EJCt|`PI&*$8!    0 %4%7"9 E<+%&!$&$%  (*&,B82I6-@3)=K73BMHP[TPF=9?9<Weeyq]\LGWVH?.>FM]\_rbpmlq|onwrl{+" 0%>?<90C*$4D350,;64SS<'"?*7.6!17A)%=84-8*6F3.2!-<$"3"86C);=.4%8#+I?=29''',#   (* 79 '3-,G   $$ -NTLkjrwhmKO:2NLaD$9,/ 1!!85:Icdk}scdnaTO[OA-   <XmskOOGpvgU0#0 $#" &!, '-&' *!    "7:'*1,968-?76/3,?@a:RI95UBPrcz}m^HJ@>I;9IKZSCYecQnpwmnhvost\eyqhb39(2"*)"046=$+4!E>$(0=48?15/26+2/>H=9SA:651\8?F<:39+.>;31- (55E5:7#7, ;DN0<> ),&% -    +*&', <#  0%!IB%,(0(=#0!25*B?Gis}iaI=GQ9AKCLX+G(6,!.A>TmeGkhx{\`TTV&    'LbmfrAHbUMC?     & !*$ # "5)$)* 3+%"!9"%-OB@L;87`ydYRR@=F?JBJTIJU[[gnheOgnn`fz]ogu|mv|b$29,9*2".4$"++AD?J>5)50/3"4@1,C'96;4<\?<;@2D@P0HC)D29+,/0:FD^UK9?D-16ACJH=9E>&$(!"'#$! '"-+.1!-  ( 3!#-.(")( (,'4!-1DVKjhmyvwdXZSI48A<sFX9&=,!4ASMurlrfp}r_ZUOK7$   %1OTjc;bnTL;#      !     !&--.) %.9=IDNJPT]v~mvinG8DLH16A1RJI:L>jiFI@bQWjc]jRT}zpitzrG#6$1:;*/0+0*'%!0$8G@7A/8>39<O;1B=65L.E/3/3K?8>07JK?<KN68+.EERURSN@GC:0>62'DIJ@7I1.'-+$"%-' <3!&     7%+A *=3/&#1/:PleweOT?HS*7:I;9%41),#'FLQ`tztplR?;      /TJehP`U84&  " %          + $#04 ' )>=TU_feyq`ilLEO:9. 4>IPWJOSWATOB[kbRWiga_ibda]DPe(24?XC2,)6!+!5(559S1:D8:*+;-0-::F H0@E:W&9:)>R;<*D119I;EJ9[ZaaKaTNM@C:K80'&PD#CDI+6$%+% &", ,:8@! $1-    )* 3&)E*#" "$#)(.7EcXufq`C7B7=;I==R.+'(,SSdl`odQ0/-  &2A[ERid@/!!("  % #  '"$) %  2&UG=LIP`zknul}SSgOGFB053<CUX[IO?PLPhlgfvg\ppkgPihM`ZJI(27KKTA12,@6#1% 0(J&2"+00+%4%.9?&3/>83779NDD68HKMSX=K\OcVkqUJS;HD1>K2354L5 ,76+,A0-3'4(.(:*63$*''3/,$" ,  .(&($%%6>9NZc}^YS;9<!7l]D@5-$)3MYAQiyz~h]]E(/      ZXX`eGQ*,  %           !+$G;Y[.RUTt}~soqJJ=GEH.4B;@POLE,hiWlV[Q_S[^da~\h_Wc]cGk`)B@b^C5!'#-&#&$1# +$"',05/*89>?:E+IM@@EW_]L`bZ^ZdOSV<C2MI7HR6-8C070795<99/?4016'% &:6-)&*>$0# ".!0,      "=)G/%$, ($7@`UX~~{ZFC73>3@CGK2)50#)(<[jmcwx|z`OCK'     " DO\tyc611)0       # %  '"5=>'HSVZlmn~vrP_CeLMXXNCL@3C,IT?];TRNVK\eiTkcNbs]YSjwuRUi-<S}]+(8=/%2,)%(%!#'"#*/6=*=IG4IS^]^VU^orRi]M^NP>3T#0+<12MFB:-)>5$.;K=AU+%996"@H@3#?<,(+9$<G %.& (/#!&?$ $!BB_yxx{yV:N112BIB; 6I, 14-@G\jdi~p}znr_G90       'PWm~W'$*&    "5."    $*$/+4<<AH^Lat}nn|osjvc_lz[RaLV[[A)987AT*>FQHYFThUOTINaJkTy{pd\dm';Te&+#"+  -,"  !&20%%3)39@>:=NHNM^XfVXJP_J?EB-6>B6GA;R-=/$F2;,-<IT8>?,9>4/#>8<3,6)+-.<5 #!*,I+ _KME(6 **#&&2 &,'&?I`ScomxueTD2+=+<6W@=6*"+ >&;T\MryeVL=D     *OW{c!7!&       "@JP! -  !28250**1DGrjgeldebwqtxVfjdePHUjn`/Q@53349-HFHM\AJKR<>ELcfRQim~e\d*7t`, !#%    '+ %.;P6$&5=,:MMLEF=_FL9::-)I;:087NK6I>.M889+3<AUS\J:;CH.,5:D+)-7<*'. +&A,3)(+%'1DI;=)  / $-&&6/01 !73]SkmY|`^@@6=F2J<LOJ; L8Q[atvyrdmSJ5'  "   4HqwqbIG4/      #-AB6    .8$5%#48#:0O>Yazard|f_ctwc{ufPCXu`KdXl[C98C8>E<UPN>@AQSSesYTlSQC<N^oY\YY^,Or\-#!   ) & $($)>')7YE%6ED$MNb@@VFG\A59E<,E=3SBJGWD-8;):')>@K;BHZE,:5-=9(AB3/<7-B3(@9-5L/B46/("*4,4:;$$ ##.:6 1='2."+,&+.;=|gsjb@WM>5;;F5 <;FQKF7%)0O<i]W~yy_C>6$%$    5ureU%2  ! %        8)-$!,X76&+;:.B=\ePZWLUQPZisqswmzrKWwWU^RZ[BK]c_\NLI<+@ITBB]gk]lLX\`LZclY_gec;foW+'3    #$*13 +9D6)8J=I/A:6TZDO8@30B5DPAHJ@8QcR>JNOM[A\\S;D/A/5.%&:C7.H-,5:F=6%,<E-%$470D1-*%' &   ) 058  #)*6(5CNovvkjcRN@?8;M>?3.6[IQP>Z.J@<@ihyniUTD $         OkVB*&*           !", /48'+>B,.:L=\Vg^OiR_XIFpuGhUTYkJKSJcjdgBGN/B>@MN4EU_n]e`QZe_dS[_qPchDJgvk^'   # $* ,H9/%(04'"89*):U0J4L=1B.9:SJ<4>0FRIXRhD\yjePd\ZPAK;H<E0*5,@6@428CGB&$!)Q8- *0+,6%+  ()+ &4! )1B809HK_Lq{}{tgESVC;VD5G.SBC;GIO^,D?5BHsfvZwtlZiroLG()    0hb\WB'3#  "-      !   2&// :BFKP'>a[`fP_k][p~dmlGRa[FM[ibfE<B@FWY_]bLXaFDA[S`ijykX`fzef]-Sru`SD"   "/%(B,07#0%3$&FS21BDG*LKIa?,YB4T68;3QOQabKono[Sb]QPMA]67?M7A=F5<+1C;)1,;?9/2-)49%)    $!!+)##'+FMNEC]^hqtfff`UF=P$>:?F/PGG=@NQ28BL5?O^x~rr_vX;/*#    Ti[C:)&$&  # !     .()"%%3@E=ABM`^sRZ\f1Wn~rtdT?fYFJZdS[_PAQJ':cG?B!;DUgmZF^lmn{noxdbp$4WUUO;     %%  #,E5?+/!;%%.&$*$=A<,>EY49J5)B*E;QPXalNUeXZQUDPEJ-2=+B/50)'CGR5D@B=4I6;519,/3?+.*   )*' 6+'(&3`N][Ys^dwmulxV~zovvn^N550(@05P)0J+9WJE?TfW@BX_Hx}eignVH<!.   @ilh> -  $!#   !   +'++!))*7F?%5SNURTYG\qgmgeT<S[YEVXUF]L;FAA<CCC<71QR_\&KZ{jp[ievdaof$LU3&       #4#&&%I=&531&  *7 )JA,(<=37/>G:?6EJ_^TUo\]qei_\>Ic]T_XO2%7664.@4@AFF<UEM>4+!1W@,'1# 5'%#    "-(+370(;)067*TOD\l]o`keHRmhmkY|~me_xifPdW@=841>4P>IN=cVN1eUGYip]zWWYI5?+$   /nxiG,/&&(&*)! "    #&6*)!9=4-QGUR=DGRWQOsCAifnZUHKB3=lU9*!0#DGBDTIIR<LQEWSqXg_ksl~w!3) (  17(3550&+,&$, ,-+-3'E!.L:==7>4BCfIRaM^lx]_ai[X=WTuFC8OM<<CK-34GDPCOLCV\I?C?A5G;?+'%&<92(   %!P'84&<N=F8jnneioic[mp]d|kpoYpagVgaCZ3!0H0@?S=F4JOPPMbbTOsy\cGY;4"       *`yavLQ5.#$ &"-.;=/&$",   24+-?A5OOHF0>5KTD:IK?@Jabbn_FL=AKaT/7"$8J:@B>ZAV?ZOGS`Ta_NUvpia*3.  *!>+#"2BC#6%  '-)-%'+81*5B=1O9EDEBAMKW^W[aXkl]XKcXQV;;'5?FCD;FDCIC^=uYHOLjgFDD2>,,$#/9,('     $#2>9A8FA8/IXQVu|XSao}ppy{sib`PkSruw`YnjT)D:#$;2."*B'>NWZcOVL_Snpg~ks;JE&  CZkwahP(3))&*81@B>C  & "'   -$'>)=#4DKV2-9J64:5EP[XUKwUl[NKP5D;667+42IRECQLHNICTUgNRZ]T_lrmq ,! %49E0,3=12'1(8 % 17*>)C*F><FN?LbdnZXJL]eMOdKeYF=M:-$IRqP_htGTTY`e^goHGTG834,%*J( .     $2BA,1+;$@PbiizkGZamkium_[]mefRVGLH[rPK-155FC21*/ @EMI\v^ahrqyZH@")   ";DP^WJ2+0'1%5-)E<91* 0#$     ("%'#1>;6?:619>FCM:?GM[WYnbjP:;VWAC004901=D?G6A<V[7JNUOZIovuglv)" (/.G=8"=:=72!'-#!! 0)'S?%&.@<F9<6XCCD^ki\F.ECQ=WUSk[@O&.?6UMurcxlwgRdH1.9-1;54/*! $-#FDA(0E<E":dnbgatyYtfdfVdQWiP;BCKNETG<:.;C4G/+:8=LWjcfdgX`[z|X]I@227   $5GMSX?)/&!%)"4(^MIEJA45 !   +(    ''*%=3<2(>/.0;EO0<7KGLMhmcT2D>=O-=05F</(H=P8ALZ<Qi^i>HHVp|torm0=FQ+0+6&"  !%,:E75?)>(9*04:EIMS\KNC938MZUiXP=EOYD<MWW[^}gL;.60L42E.-(/.4&$    &7+4WfD;$32<MR\rwltzznyzk^cSCLQCH:5<=4::=):89%;?9`unuhyzte8RC1!   07=7G'3""!-$?BRXbPQ.*/ !+ & ),%*/'+*&)@'>$4BJ2:,U\_mxtQ7=EK:761/?2"&G)3UOPL=EPPUNHXH{xtl    64/@5H0+!!  ++%*" //33J1R?$8$D5!0C9?ITJJ9<2F@<=TSG?>QKP6JY\bPh{q*pJ=@79;E1!=4-!% " 4(4$0=J=.31,9:@cnuqwu{}m}ZGFAL9H?G;?!B/)!&+D$06P~}|~iYXDS'$       #,"7E&55/67I\cGR?95#7)%-&     *!&,.&-, +      35 )#6'7'+*%2)7C>4>pgZCC@LgXD63//:,+>03NNBB8.C]]:LWDUnhW   2B8A?B>,  " #$ !'7'5?H?4;'20'5=+KMYN7145>@DHN9FVOT;OL\Vkj8IB=9oZSHD3@59,121< & 5+/8=92P8++(<Q_ik{{zx}fz\|gTWQe))<;8%" + /-$&.MnrWOC*6B  *-6" -)+GasoMZbEF@N#$/   139.*8B"   /,*)/-'5830;TKbwTMG9RIFKD.@JA7+4/%;)?<NF:,BbUJKQVtUp   +<'0NeND$%   '$"# )8(2@:6/6!;CIJ431@G09H9>SZBGQ_[HhkVQUx?O\GJH7BA1*.+'1(# "(A8 1'%,2>FbDIov~{}ihk|]Q6.VF/24,(0>;_|wOE<,&  ' ")''72JoYnXSUcB8%/!  =3#89(!   !  !0("8258S_{lsM>2?FE>I;XW:F?9?")+09O@7=R:JOD?DKGjuze"+%+3BH_N ',!  6$(->&/#%38.:=3"F:.7H.N\B%IiNH`ZQeQd]\[rE>_dmH]=I*3D./#+'$4+!$   &-8%-"1#A=OfUO_}vfKVO/2)*,!)!"*ZYuo[P<00     $%&;=CT|:M+'$ #&AK;57       %? ),/HXyj^RD?2AUPX_FK=>QC5?D562-A506JZKBA9OLa]gz^   ,*;8=KZ8.'   -#$%4!3*##,'6A><LOC7=6<kcPPJ^PXQ_i_EUTX pJu23wmB\E8;/28&)1$;=7$ 3$92PhOgd[vTuks~}fi}oqMR@F,,(-, &4K]Rh\rtlXLPA63         2A\s6R3 )   2+2=B;!#+"    #%,()4$@NIP?BbH5CKJOB2+,?:/<052?&,>>5CJ>EC460PyMayg #SF:<O?%   '& .-3*0'. </,>31B+,Q2T@?GOVW\a^GZdYRX^jrXe__vne+kTA@OA5P+)&3  9'*$??%*C2@'AECL\op^oraqpgcyzywuwTJZHG7  & # *<1DGHctzwz@`?O?,'!%         &2s'$KJ&vs,31   !07<<1$$%    -+,'""*6D*C=,4B>L=H+/39*3B>)&/E>3G ;B:.IJ7B9CECi[  /A2<3>3$    $ ,".#.-&)+0(855B4AGGNB@goQSss`VeYf_Yyyto8s^PR^C7/*6L&$&;@&!  P97&&<TC<VBK_k~{llyrorovw}p~{fT=+/-,%2$*49;T<@Fakh^{YkK]T;3!.(       0L[3opWsm=,) #" $".+$;#$,-  #      * '303)<29,@;JJ67.(*0<(4)*21"#,?;1??2A)F9=FSOI     #/!* 3  %#$8>2#.=)+1/ACALX`rUbbgqqXipiS[OkmsEq& ({lX=\2CMF-93133-/ (&    ;=CB444PdgDEfiiiztoqk_sv{zkLoI(*%/-FC4GM;F<2CWdk?H>N1(%       "  9Ktc`\_A&3 2  #<" +,&%+2    #&+ *,/O9B3FL"3B'G5"0*%!!$4,#"0>*0=43J0.E>GLRID   $!$  &) %8945>68((*4?I@QJ;I<JV]tZ|bHhQMRVXg{v{ysUyx!ao{sTMURPM.6:%%:0)('6)%)+!  ".KOHE?]ScXN]]g~unbz]xRQZ~}kVSC$.2$./'020-I91:-BBBFT^0=H6" "    665nxz: Y83, #  2/(#%*61) "   &*3-6+EP2;JH5,?7K#)+'(++!5($468,:F9E<KBG     &-("     !,! 6 57 ..J B<=7<3OG2IJETt_f^dkcT\Si\tygi@~*o3zL7)tf]\^NGC1:3E#-./+#J,4'5  %$*+HjURWp~uNgug|wagylY^axypuzvy|{SP7.&.*83[-+$+!05=L2&3;?G>N%#&%          $249NL D0L<47$)  &0'; #J<;         #$&&758K*!';A>0%*$%%,#.2"<5! +7%5;$I66G::E<  $$+$'%   #-"3,/?2"-HPIR=JJL,<YIHW{Vc|]etd`f_dtrzv<p 3jvS~ca<3R40'@'%59/#+)90-# !24CCPOQT]lmy|}qe`G?Yncnpv]sZe7% #<49& %&5)'.56<CNEF'!     %  ($(5=>h%>g64#+-& 1% $"&%7.#' ,(    &",1."*E'&-49'"!- +"-***5##<7=BDV;RNTQE  "  ),26*"       $# "%2#N5BFHaLHH9AZB?egRn|lkqZjelqz(E3xHcRU?@5-%3'#"2."6   ! #%(:<WKerknqp}WsmCEfhek\Tkb]plgSqfbU&8(@$-*)%%#1<".C=?./$  "     "" )(:<AP[E?%%$>'   07" &  +%+# (( &)!@7B/,$9$#,92'(+3+?CCEQ7XUB>8'  %  !  +&   #,3/", %1E6<F1AJQZISNEGUYWahXhuqzkqkwJuls}|xy^`P7;M2&++$"*!2#(! ,G^mb{ozy{tr^YCQhlRL[n]mnJMVN]^7:-)46@#    #&!1E5:," $&/       !(F-<urE@C"+'  !#"2$(!# #!+*4    %.")%$7$00723'25 )""0%*.4&-8ACRDOV;D#2%"2   -7   B )2*$:7;%><<@BJTYCDPQIMFQS]hzbllpn`ia`ZVfr}{{|wqWU;*#+,0- "(#%/-\VNkeYj~tldP^ADiK\dRfUSWYHDUKK$:02<.   % +?4>F(,''(         .1/('/BVmpK/0$"!1! &0.( $ #":&03#,  $  , ' $"%)#7E/-)9.-)017=;5LES:XU<>S,./+'  ()&= &!   *''*8+;',6DE:KVCTJG3APMjIWpjZoEOaJi`\paoxdZvforussvivyjajlrwVD;==4% !-         *'D^j^dbdtysgdbUORTCGQRQ/^E0DBEQcqP2(,"& #  %#8Y$F1&  #    :"       --)=20A21;AI7,.* , '(  (./$    )$'0%##'&)/;32=;D&!$!&-N8'10IKXaHJA8=WLV,048&$%! #,":)  $#   ,#=(G@:5336Z98]KB8B4NXKX\UVrJ\^]a\ZtabbmkfU_ctvkxkijouyumyu~i_kOid`WY>-F6% "!% !.:WLVMY[bf}zz]h]g^8.YDI.0LC1C4C>=FKxTI13#(* *A9>M+       ;           #(99?57A4:$3%0*  "  !# (!,+%1          &'4'003* 5=1*>-21/0?")&0&+7((2;CEL_P^C[=td05I5,)7(  $  " *CD67PP@7%=R?mB>BTOWeXKH\kERlR^UYTVUY\WUkfbRZa_nhrn_fwjzc_rZ[VUUX_R_F+@9#" 0-  &!'4)ULRjekos\WXdDK</)&AI3#A=>EMTWdJ9.!+  !%   /'&     &,"  $<$4BF3%1.1,)#$     (! (32*)     !*(@GK+'++-*CA080,#*,=4*"+,39/5#2I;@QD57Dh<8:* 37#&$!      (83480751:9,"$BOiKARJI`aYCafpac>`UT_TM?Pj_]_fekV_dieiWTX\c[L`\KDOUUEGD35        '+   "%"+.H;V>Zop|ihydPhSnICNE-$+!&#,?6)EBCPLG8>67$#0$/&$ #(       !%)        +&-))&#87%()6-0,!&   "( .3"         +#(%)%11*#,4&!%!0#'**3/9,%@8)$4-6#%<8$4K=NNJ-S=551-'4-(   )53$6RNDD747I8%>FUKnxs`KSMS@Iuf\b?clXY_P:WH<OWYe^bU[W[bjiddqb\WZNVFG>NTVi=1B.&"&  ".$&/%'/6;C?G_]^hl[gL[`nK?&%2$+CFDA@A@[M7 !&#(&(      "  !#      %-,D,2."*   !&#)%%- $  *#-)"&"*!(+)*#$<*+#)<.7$+'2/2/&%1)7/*:95(6<74:XN63%+3' :     (,.12EQGEFF@?@<8QLUZQIPYKKHFV@b\@:W[DQ_[ELUJDQGPOR]WNRr}^IRNZmTFHMDG?J7QDY==-,! ! !*.4AM>UYlVR]WeskfwD<?30%24$557,1CD12@&%&5:)&%"    "* )(&     #'%*! $ (   .')#,*.     .%-09*=---/,0,'+4-0/(09,20%/$/668yQQK0)# &- &'86"78IeBNI6EIVLESG@J^>INOC7A0=A8:CUC7FJNSeJNOH5m^RFXVcLYV_F.PT@@=9?<JB0A/N9=4-"&       #'-<L;&N\X_nmsymnYZ</-)#3 -1*$+?,!"%$,*84>5  )     *#47%$  . $+-3)"   / % "!+%14#        )*#  2&.-D=(/&'##0,4 %"04&&7"7$)2%)7-30$57-,=ePGL):.( "/ $ !>57959=I7;3F96CQNFoF@PS=>MFIL0"C>?=IO8MFQYRPRE;NLOXB=aD_?LU=DNPC;:14PC>2"+*")/+    $&*C/8A4:CSO`f`h_trulYZOM#!-*$@&-0"#13)4"*+/(';+## .$ "*$/'#+    !0,! )"      ""$%"!$&<9"*      #!1  '#!32/%/%!  (3+2%3C''2<+$6% $!35/7$2`NZL!""(,(   (,%(94-/9H?>WIBI?SZTRFR0;<:XXH<H5BD<--9=GCC82@@CLE=>:GK6DQBRIBHRNFYF.-288B')%7'83'   --/45-9?WYVhw{n_yqbbTH-*$' %F!/&%/0AB5%) *"'"#6 ,        #/" 8%)  !4 !1 !     )&  +$04#$ % %"       !"!!!$,0*$ *$;1.2,($')*1#F/+'3E<O$)sYD\@*$(" #*$ / ("5/#4LD2O5GH9MUVMNIGPKcFXJDB>EE/D9;<4F+F;<HFVW>=-9-197XCFZ9SP::IC<7<=#/#4( +8       $;$#9:7BBJTufusrwWN)#+ .(2"''0G1&%'-0:S=/()D*$$1&      6%-)/%   !##6$#,$  %0%".   & *.'&) !**#/        -,&!-/5&../"+':'.'(" !C<0-09@A8/C=JPQO;* ! &5.(&14<PC?DA6BGLOGP[JAbA\U5GXUK@A6=5EBJ3)6B#3CJ=MO=;P2$1A;=IOMO=S7S/WQB*:%6"%)   ! +&,?5-4<D_sr~TU;;53?>9Q%),.)&L/>50-/!45J4"8= /!&  )$")'  +!".1%# %'%  %!-+,)+:&%       "*#!"1&%>"&%&1":7<<,*  9<.64&3R@.6646I@B% &  & 2"#6CO5)WTLTMGXPMB`T_f^PNGB>KC@8DB0%'2QEBAB46BL@B4;:I:3A?*BZ_LO;TTF;'N7H#3)$        !"#6,, 7-C@HG_L}xz]XCFAF9C6>JE48E;-)2QF0818"9''!(.3%+    # #+%$ .!#+!,   $ ! ,-&'&  " "         % ,&$ *-%!! # %-'4+C/.2$+$0&*'M80:5:;8?9CA36(0 4#  .><9S2:DAGKN[9?@QC;CXcQCTMY:LC=9@?6$;@),+4KEDCYH:0%BA63E9<HTTCQGUBL2AE23%  +       *(@,)$"TBMER|lVR7L8GEALQ`BOB,),7'5A%2 /#&2%%& *$.#4(2)'$ "   !         0#     $    *$00!!%2$ (',16($&#3:(/+%-2(;(>DC5;48+%  09& '* 0;RGbXFOKVKRGL<JLL=CX]WPLfVEISD;;KTA:5=3@3;M?1K[?%02.B13:9F(DLIUTJOTJ;-)#         #$/$8.';OYLAUqvod^[KQQPDA9PdH^[34:>97K*2*:-  #*'.&-#!$    +$''     $#   $& ' +80)4+/2$$&0..*1/ "-22H+2.A=  $,*93D;L@M<\ULNW`F?1aPCE_XYUQDZ>C**D9$DN1>4;-.>5I]GTF5?56-8AK/MB9EMO9,9OT=2(#    %"(0;;J<I[g]bwq{rl~`W]`ckCSE]GBH;#;&*,4/+ .0**/!,%%  .&2$ '&"02+$  ("'%    !  #    )               $ ,('"$-:60 .))>"&%,B,."#,6>J<(    - <+%;<(G46GC:8?TBYD;<GTT>DSP_CK58BE6<B/&B6D@44@ZP<HO3Y9*1C:#H86IBVA3CAXLTR0 -9 #     +.46.EJR6XVS`Ttywu}wpguopjoi^PX47D):A;N'-/6$$#  !#,8+A1&8G1                        )$8   !)>6414":,3*22"##&&/&2! # ("!0%$"'371>KNN<?KUW=8SHXOG0:FAFG??V/MX::::D=@=5K>3;851@43J6B00&38CK/:'6K/:BfYP4!+ %O<  $6+*5G=#>=GRpVhlzyyqw|`ZHETLB.HRDK=5>)0%   $*,AUI'%33(  %*$)!       !            !  #%4.'(75$844/*41$/!."% $%+  , +5 +"@6DNJI@HY0?Q95?%5?VO%B*NNA)ODABX>;2:U1H3ASF>=Q::3?+>?B/1WN\86A79-2)HK"Add|4?$ )/2cD,#:(12E)?SJEK9XNzty{tv}xlrcXiJSCIAC):/Q5% $#$  0'#&'=12604#                        $(3 **(>2?@+:2++ 2/&/    ! ( !*&/>7:7@5,(GFITGI:II5>1PcJ:7::=I(X[YKU5=I2:,%>72<?B2+94=*:F=09?9C=0::=83'$:4.f~P>+;rt=   &(;>*,7.,AaLD\lfz}vszn{seb_a@^?7964**7"!!   '!! !/&0.*"7    )#)!                %    "*!5-1;,'9(3-#""0<"&$ !#   !%,%:+-:P2&9<E:JB=B=4^R:298F9O>NWPR51@?Q>H:DG97#? :@-OSVQ4?F9K.9I-P901GVQ!# !(!6Syd;8'' EC  &)"%&6';9;DLZQTjmxlou{~|qZkrOIT9UEMP.50;%+   '!>!)%%*'&2"-)                   *  ,5+"57*/-",<)##"*%2,.%   )2' ++."+$5(&!6?@BK8+<=2516>;;2G@A=49<. %/8$4>F*D8BKFRA39;>+48K6-7D82G127?2 "8OgBD Hu]V(  7#,0 J722<3PXcei}uzrotn~yGG?PB?E@S=3'7.5*6-  &215+7$,+! 3-)#  #)( 3-$              )".$/+/$,.<%"$ ' "%)$=74&!+H5/H%#,<:FX=H='N@B-)33$'54=4=6<'3:(1%!-5,<?FFTV=G6GC817.H>7>=7::+B>6+/%#"+?XnK2&) 3^R@+ 9   ! (),,6+:F;D=NRka_g}{uzizyvqnpZIYRF63KM;5?L9=7J#(3     @.#%+/54%<F/.-&+81*1,!! /#/56                 (-&"D1D$*;+""!"!%&# !*%+)  10M@'7!%%8'OG-'?:*-'&:,6=P8;1/8$- '%U>UDGN*G<F2L:8+:45@B7=874(08+),7Qmx\`;6     $(50(;D7M]Ode_ZgdXr}xa`nrtn_nwa^gmZ`fCTSZYN-C&!$!   (  $"C;(239$$'!""0&%1, 7#?;%,5$              ')1#1*,&$6*4 !!". #$!#$*)6)96934C60,046,.$1 ''9 +7X4##&. &"2B/&:(1(OK7*28.5!N31&8<@1=B;S.:=((99Mi~~L&   ""!@:%7MRepSJ`i[gyx{xqs|k~g`hlgTRSUVH7A5",-(      *%0& $&/.,4"0%3#/"!  $/*1.#                #3+0# " !# (  3&', (0*-'!&"'"F4?,7.2$!++:;7!'&-%.,0);5#41CB(C6/*5*2-+1-+6D2>8.")*16](V)!%  %93))9/S~jd\S]fixuvh\xvgmTv\V:^P>FMIJE2- -)+#- #!//-D70! '=+! 3:/)()$#'','                 *6"""  6  ! $+#%($!)!4$<6(2+%'"2$! '&.#"$0@*>/EJD;1,0>34F4<+>-E452/2-274*4MoU-9%     "2>6BL^rf_\apodskuu}|]PamO6UJ448914J( ( 0&# !'##%!"*,0=&% +.?+/&*&"! (              1+ "#,%)& + $3   +-) # &'!*(*/&*,/'  1%&# $&%&>(4'73.5E?*5A<&=261551-?203@0"5>PrZ1""     #"";KPQYaY\^Hk~wjh}fP\yovO\WGD[J5B>$=L>5&35& !$ &%--01( %0$'&(#,"    /  &      "      &7%""&! )#    +/  -*%!)!%,0)4 '*&" ."/2+>1<5;J7H.(2B=)38>]P4F9*A"*5Vjj`,&      " %2D:DecVx\ieptLZ}m]a`xy|l[^^WDL?DN;N-),      $.'1,/"&#*,,7'0-0+670                -<)!( ! (#   $/3&%!*8%"'+-2  ")($6;B0<<8<K.>%-3)5QT#C=B=;"210'$&-P]q>,      -7OGM>CghR^fzuUMZ}^lxgozh~fiY\S]1YJU:7( *'     #"+*2&"%;;3#+!'3! <("))    *   !  >91&  %2   "'     %$)**)#!!$(&  &$/5-/A9:5 B0.-.A*10B/');23'7#3&>&B5#*9@d\7&"    .>JCE.TJNAKSfUNLkSdqzcuwsVwcn]abVN??QM9&$-3 "     8!#/41*'>0,23*( 0/#       $         )-;%!   !##$  10 0!(* '( %#-))#?(R@803,1()-;(%'$/)27%AF1C/3.)&(2,\ihw{Z*$ &0;C1:FTFNLQWfDVNdFnspwslisrnqr\>D^VR()"+ ! '/(!'!1,BK9/2&T@)?(C*:&8*%                     %C<"   !(! 8-/4%(:'*$!$     &"   $ 9&'84%D64=8:840>63'/&,6-&44F0VH('2)>088/,5PYK)   4     /(4;IdQ>_M]RFMVTXjyoz{|jrltneOF>P43<-,'  &@""7*:1@J+*0>F3F>3;*GFG4( ,.      +5   $.     F3%#$#  "   +#%191%;1)%'""*$"&  !'    !#' 1$8;9><93W(087+-4.-!&#<-D1@L@&<'3++E)&2)>JA     $  GME;KRNUQVaRmcf}j|fwiwn[QH4J'0!4+*&3#"47>64A7;Q@78F3==4=7.+A7'&*!   &    ,     4&       "?'8$  :*/(,,)( *3"+=#%,1&.   $/-#9*EAD=I.//6X.(L4%*6&#-'03)+57>?:;+%/0!3%!!%.5+   "59<VVOjzLdXB`X[~ovd}rfas|oz}aPIAA-8.&",4H(%.(9HF*hF"&:72<G;>3C2<<5+)732.%'$%#*             /9krU04 +  >L0.%      JI==3&*%'(F$5/%6>   "      #2$4?12FYYRMCEH7?HKBL@=E;" ),5*,/EI0'0/#+&C.',       #-3*4@N?\c]_\LNYQYTYmuik|{qSgzyzmqjuqoqpXv\OOB4-0>"(6+$ :3\0%<(3,/Q8?1);0&2AE></6.#1;$*-'(*#'        1bo4' '    %.3>=4%     @BB105!;F<G18 $!   (  $!::0=29un`M\JHLL3<#9<&-/%&!*,":9$705(*,"0!)      !(.$5!2$;LKFHlRAOPH]kamo_lohwcgkkngp_mh^]<gqRXEI<%#5?5/$,AHNZJTHV.AFG7G.& $4;0"-31&4%#*/.*.,%!$4 "       ':qb4$&("* .?@;&      JD@/-1>-;8J2@3(#  %.2" (>)1-,Synd\;,7>JE;8(-0*(!)#6$-,+&%%'#!       %A4)    %"(=E2IHULLNRTsY^fkfcnYgnk`}n`aeXPHIbcgYZHL8EIB76<@/%+,545?<7Y>[OlGBF8:;+3(7.&#021+(!45GA--(7(           /|Q2-6$!   4/>$(    T=G<10R!#(D*L_>( ' % %1, /!,0K923AXleFUYEBF<:B,!"- %"-:@+3! 0$+$%(-  @H>*+ ( @J;CTJ;FANF[jO`sXNkixqgDSSj]XTSD>HPc[=LQ>1-+.D/<4%32/825IG<LVQNRT4(2.) '',9%!2A;F=.'8$!            #^dgB&      D73-,    \RVI7!8 0,E;97   %   ,&0#51'.3-+52,EEpwu\NGUZ?.(:>."718 $%" !9#/9,(&(&      2K+*'    %0!1>7>IX<NPLIZOW;DMFSyVSVZIFLaOP?1(/=B:\D12?2"+&$ 3+/=3@IL?KRWXB9E=#)9.!%/64$81HJ?5.;0/"          Jap}T^H6*7*   &-.,1! FU2(;31% 4/.%  )#"/.&)*0-;'$.>AQVcYM-9/?/ 4*$8<,"2!1*(# 61(   )7! ','7*#+<4@=G4AQOYXKMR_Zhcn<U?BB>@50*922=@J8;(*#/-2%*3<?G>:e[CF;G;CM@4,7,!,:%D->5.=X2'0C3" +              $%/)7B))-1!    &0+-  !6>?'2 !      $*  !4$3#-3K*+1-08'#'K7.:0$)8.,((90.16.++   4@$    #/)1%1432$56A,1@HH9IjtYM^PJFA<J=TJ68; "(+8#7%.)'3-!30!%;)E]KOS\!37@&70G<0C,/-7BNJ7?+C=H)%&1 %#       # -  "      % /#2*18*  ##7 &*4!>4-5<".2::#,*- &3!8)0+5&+>5(#%+% 1##         :8   +-F:'C20/:N-696GFSL=3NPCQ8<H?79): &/$/7(&2-6+5. )%5XE5;425% =8/>3/$ JVB2>[^0M33$                  $ 7      "0!%    657%+)<%%    2>1,,1.9,43.@.,/83-%!,(#  $%.+,,3 "### '!%       $  ('2(D90:@5+7HEID?W=GII=H8.-=?0/"! '&'<+&97//2B#) /W?E6F5&)# )#*-4WaF9*50K?$8D@507**9 &                  ! "-+ # (&93  )1F,1 '#37-5!/!2, $)$"40'*)4*1%.*"(/$.)1'',!"           "#%&/+"&%54,1DHQ_Q=/<@4<1+2++.",0 /4A*#8<7!+$-M?9@/ ),' 9J<>:@,'D6GD20>8=(+       (      &  %&   0*   $  9?"4)   $*-%2&'*  , ),*'&(2;4'*5,10-"%#$ &',=)-*/30$ '*           3(;55)4'<:90.7-4<JQR;50*B<" '#50(!122 40;<2:*$ #!@O]NU_388,/$2AA?3%$  !       '   7?2'   '/   BJ"<1>!@D! ,*2   $$.4),,3+8,*'$%!-""7+7!3 5,#+"  "              .%)!:-7725<IH<D.?4''/!)%0'+7H00+2251<%*+! & %56LOL@2>B$(63EH9L53                    (+.E@6"     % 2Mb8HNC@DX>@-&$ .  5. "'%/%!; -% 20(#&+ !'&%//!) &"C,.%$+           ),-,;'63HH04)K.#:*0/ %&+! (.(D*'$0HBG(# %'5-7WOLJIRb9BG2D6,55+  $ !$*   , $ *(>C%  ,'       .*LJ]\ntfe_QX:# #)# ) "$ $$'& :%F!%$##$.*4$(,(&4.22-!*"&$     $   ;6kq#    .08##09""$/93>L'"'    *.#,04&(16QP;1),%*#$)BXNM<:YXrxl0;B.6$'  $#"! "*),    ," -   " !  #9E>axt4 !  $ (0'1.'. * ++')-0**''(". +%-'%53**)C+,+'    [tI)&   #'")3&$+14'7#$&.     .+"$>.20,E:M`224!*3K:5<J;8FQCc\heNWA)        %*        '       ?GhvH!      $!% ,)#' (#.(2( $% )#6!82,'$9'! !        Zd\H  !$-&# *.(3*3&,'!   %')'1(/B*!^CSOD0//  />I:-3JQ8TXLZXMj9-*      +.3 %     !$&        (;Q~a,  , +)5-93)%"%+1;<&#2,& #"103<;!-116/<*6% $       :}ugV=    080+#'#4("*%*7   $.B.9!*G]ZP2<+! 9MOGK;MYXJVj`SD=!    "5;(9)    !     -_b vB(   $0%A>/3/&+%NH58**%/*! $ , 3,175567 2+,/'#!         Mmoeb1/1     ((*"H;: $"$   /6$$9/;]U?=$* "$89BESN^YlZ@F@ED=*!)       !GT97+'   !'"         -L_&#(      ,JA11"+1"/COK61(@33+'%,0$#(,&3105/.!.!     .IsnVp%&) $?;=7=># "!     $.$&$"%%A0GB47,) $%"#'3>FK@D3ANEB.         & CQGM>0/# !%  +K|Q?&.%  *&$3LXIS63#60 3I;`69-:7+&( ()$50D?+8D5=H..#'#        :HRV400*  $46>;Y;MSD/*  ) $$-34:?)2*+(2;6+ $'   $/&?#%2./<(I2!    $  #:\I<)'    . )0#(  $$  ;_jbhUbeQ   (0,(*BHH:1"2;<.5BDME>-;66<&'+93LNV-=4B742$(" #    "  "  ;%+     #AMEful@>EK/)$   !    %%1+=<VB;5,&0(/*%)8+1-&*(##80&95           1E5<    $  *'*8'%-$     7 4A^CQV.B52'$      )3%-;GO>1*48.1UNUGC0-9,K"@<>1'37DY[F@?10343"+#   "  '.< $   *#L[rhX_FE/=!&#+      A04JcWKO:$1!>).*) /!)&/- +   "#   (*)$    7E*E16.-% ([A !& &   )4-!!3:.HBRQ)1A>3;6GUFU;D=I/6?B6>%*??nRVA"!11(        #$$    6RZLAE<;BF20       %D9<>YiYLtS&###/  '+0/$     )*!     *          )"*UefO10#&(" Ya7            ))3%)">9URXNI9NTNM<SYVD?G9:?@J>LD=(+8PI6%6*%!       "2,      !1@NN10(9.=D2,(   :BKe_dHffcZK2'%'5$  $'*            &#%8:?ng2!( '42$   MB           1&89+476)=;Opbb6B:VOWTRZ:4NFLNDEE<8(5=(7,O=6+11*      %12*%$( %(<.:"2-$8:-    "BPdnlj^Xur?7(%  $," "$ %"%((         9$     #;NYjI#"    '     F;.<$"=778>SKCQ=S@OaKSnsi]UNFC?B>;J>%A<01087*65'%        +%3%'/")     $1?<$),2430   !>IXrsnNZr:A& 2   #-( $G+(' $         " '  &==PyzeH@'A#      AB<;+8(?DG2QY>NWoNGIV`efWi_ZA1PCA8<,E:,)0+&+:-;("" 1      *$()        +&4&,4 &0"<3)",    #%-DZhzrdVZjR=-    /)53*&&7'/)   % & 3(     ,VX|\TD7$40    >5JHL4>1D5&;=:KbWMPUXSTc<MepO.6;B+.+31.)**$8'=3.%     &3%*"!    &(&$#-3,0/"         2BZp|xqcMJ+) ;$-+,.       %  !.+  (Oxqs^WL:4#)   TX<<VEKPM@9F@Y5T]nynFPW`aiqR=G=>JY0D.".8#-)+2(*"    !,!!&    %# ""%"'7?/?8*<;4*    #43Ku}z{hP7'5 "!1/1,=-)       !%  !!   9;NVTC:)&!$   NiHEFDDFG<QQGd\YLjvfTiqt_\jZcYJ4F;:/A-0</!")&#" #        8)  ($ &%&#,G08TD@I>B9!   !#'10sqbX@*,+(&*) )'0&64'#     !/% "$  (%jrURCU+/!    G:NGRrLCGAY3@R[EZeclVecmeTy_HQEGIDC52+%+%-#" $ (      #        !$!-&&-9LJ@@H,27?.+(    %,]fkrba0,  #,# % 2),!"' )        '+'"  !&%2" Hn_LZGKML?/.4 '  NV\HRbFTYYd2VUPOEc\Idn{]eTKIIKHSVBH;FW3"*-!:9   " #   .)+ ,DI6:@==36./   .3:E;=-/ "&400        # ,   *1P9' +<Xq\QNPOH!&!   gFVN]aYPQLMXEL>\<]DS]_m[VUZTJ:UHC>7P*'/*80- )!+    + *   % '9O5MM>#5%*  ")3*A;*  )/,!'"$         3#5&#    0BB8$    "Wpzm^BG<&' &+!  :KP\RWQ;?MDGAMCQfSRMH\\e>KMdA5OMLC<=46")1    $ -&     !$"5*;08/1" $    "(#% 6 ##         !%<   %&#   .)! .<CumeZKF>%& & .   7U8LPF_PNK[3;1AS@DQLTBTXZKPW<19?ND34:7%&1    &!*-     ""  '  !     +!*      /@7 !+/ !&2A(  Cg\bWZX=3(.2,$((3(*"   1T<<=AUCHCM@DS89=ERCBEXF`NGNLG&/=A I0-"*$         & ")-    "!               44%( &6 #)$    )7TRSSO?K742%,*#18%/,       KS5=FJ>>0:=8LLLBIKHOSEEI[MW]J\E-.>3,6& "%     "%"",              #&    (2$/& '!    #K;K=5BB1/(3/)$(;>1>9+,        /DH:MNM:0"!E:-EH@B\CSVSLHQ>JCX;B475%6'&     !#%'-& #')!($ %      " ##3$& " /5'1+4"2$!  #6FJ>906>>8 2F.=9=-:OKF;35&" " 8HK06<8D/*=KH4DG5M=I=`NE56;6KF-:>DH,G=)       "  +#!) "0JZG2"           $'#+*47%(@.?=% $$  0?MG2=;5;4/;/+=L(.=NbN6A.,- !     ##:4ACO5-B>6B&-<FDCFW;S;D63BGE9:B31,%(+$    ! , ' )!(GsU4(          $$)*//"&'9IFCC0$!'(3, &FTDF4P7-7300955/).H29;>C7,+#       /H8.:-%.*-<&JB:DBG6GDM=7.7?GP9%8,''%      3!    BwR5 &            #-81JWAA@-4* /,6+3    )5<>A=:H-+((*@12(AD=YLEK>("  '/?B>*)358:CGLQ7=496:8A.64A(9/."53;           ##+& 2@_T*          %     )/##1@A5+<5%/$  &0 7 '5C4?DB;/(121(1 %.7PADRAE/M+4$%  &     78(/'$1#13A5;AKDZD/?.:84:1+4"=4#'    %)&'#  ;?[if2           ".)07)52 )!$ ,=6)=:),-.$(&1OMFQXSWHF0B$ ) (6.   ,-(1.6!<=B5:N5C&6CHDT5;>.3*7!.%       5:;42 &ETSK6         &"40'$ &)*&   (=++90!*,1/#&*)CCYkSCBQS::;92!  $" OP% =$*!?PCD?/6DIMCI4,;:9:--5 3,*      "   &@_(&'CKG2 "              / & +)+   )3.!-3NEUb\JN@`I<NM/'& ) (<?:+-?4;=:1*0%6/+A8&(=5,7'           +9"   3>-,8$           '$"% 5=C#(   $&#&!% .;RMiOYas`CP`Fe\J/     $#A6(6+;2@/?@381#09/--#%%&/"     "& ,/-2-! $#      %572;2(    #&&## 37/Kdga^nd]mbRzgr4+)% $ *,!+9/)*16<."(+/!#3271$)!    #  '&$39- #-!         ',Z?H6&   +& ,!05GCNyoqxjzoWilymO,4! 0.M/033%096 %'-""%*.&%  %      "67/379!#E=%  "   &F3?3 060;EZEetvtsts~xx^RG1G-  ;60/9.3(+$) 27(/1%='"    !  "U[dA%$: (  "5  FA8()   4#$8)>Iudnxz~oR}dSiN6<   =13'"21"+!#,%$$+      kn4*$           +)(#6, %$.+71<1ZZ\wmkSb}faSCJNA- 6!+,&!)) (/ )&(! #        $M}<!$#  ,  #$)/5" " #/9;";LWxdl]S~debWDI4304"+#1'')         'Jr}H       "   $(  & % $A5=C5JTl~kijccl{Ueh=88(  0#!!$0 !'!)'        /NU          %0 ),  '  ,?3/BLKQW}tstijYb{ia?;"&/-+ )  '$%)         8Pp[>  ")-+          A.,&3$ +(  )$'/A]aL]xxY^|]Um}gE8.D6&+#('#'  ( ."    '    123        '$92@!   , 1,#.   * 29IFb{^UkYpfq{SA:-& 2-'$"" (                   %2=<MRK!  16>;2#'!  !''(5CK]|vkvP|qgsbwphH $)  '      '       -XD>K`d+*  ZSLA/3;;5# # 0& -(#Jdngwnvq^^nv[]iiGaT3, %<$  %%%         '  !     >`nny`-&*,LNCOE'?* !("+"0#;WUTbTm_iPmbs}yiA4YqFK7+  ( ($% $           "  +\r[-)7,!%`\F1:*, " 7ABGD^K\__eYhrnb?);=\;  ,/%  $   !   '         =QlwqQ7+3,774S_kIN3/3&(($"/-TAF[]VVf[y`YB,&#'  %    #     "&%        (  $;^sP)"-6<KPVsb?I4>A" *#5C?@NUUiU}~yx_U0 +           (!     &   ! -  (  -SVdYE:%#F=ARs_RM*1" "?A7(5^owopmj^D4)"  '!  # '       " !     )%"3?6*)!/>5FQg|okV22 9     12-1G]TIaK`YcRMB4"  %$ &$#         *#$      $! ',<@NGkrsZ;:?*/#*     #.8&49BM_IQeGIID<0!'!,"    !  %# ""          #(+36ER]WShB3$.+ & &  ,4-+)%<LSP<--4",  -          '    "))>9GGIZnYxWGK8011+0*'  (;LC.3'..(QUE( +"1;-      & '  !$     /!&   <%    %+KHACA^jJC]4+!,,!"#  (G",-1," ."("*   7$            ! %*!,*         &&B6APOpaNY'94'(      $"!()&#+#  %%    ($!   !      -):*5ObyfudI6:1>-"       5%) ,"! sunpy-0.8.3/sunpy/data/test/LATEST_EVE_L0CS_DIODES_1m.txt0000644000175000001440000004477213203275053021607 0ustar nabil00000000000000; DATA_list: 20120619_EVE_L0CS_DIODES_1m.txt ; Created: Tue Jun 19 18:36:09 2012 UTC ; Origin: SDO/EVE Science Processing and Operations Center, LASP/CU ; Units: W/m^2 for irradiance, dark is counts/(0.25s sample), quadrants are unitless, solar lat & lon are deg ; Source: SDO-EVE ESP and MEGS-P instruments, http://lasp.colorado.edu/eve ; Product: Level 0CS, 1-minute averaged SDO-EVE Solar Indices from broadband photometers ; Version: 2.1, code updated 2011-May-12 ; Missing data: -1.00e+00 ; Column descriptions: ; HHMM: hour and minute in UT ; XRS-B proxy: a model of the expected XRS-B 0.1-0.8 nm value ; XRS-A proxy: a model of the expected XRS-A value ; SEM proxy: a model of the expected SEM 26-34 nm value ; 0.1-7ESPquad: the total irradiance over the ESP quadrant diode 0.1-7 nm ; 17.1ESP: ESP irradiance measurement near 17.1 nm ; 25.7ESP: ESP irradiance measurement near 25.7 nm ; 30.4ESP: ESP irradiance measurement near 30.4 nm ; 36.6ESP: ESP irradiance measurement near 36.6 nm ; darkESP: ESP dark diode count rates (background) ; 121.6MEGS-P: MEGS-P irradiance measurement at H I Lyman-alpha 121.6 nm ; darkMEGS-P: MEGS-P dark diode count rates (background) ; q0ESP: ESP quadrant 0 fraction (q0ESP to q3ESP add up to 1.0) ; q1ESP: ESP quadrant 1 fraction ; q2ESP: ESP quadrant 2 fraction ; q3ESP: ESP quadrant 3 fraction ; CMLat: Latitude centroid of ESP quad diode irradiance at the sun in degrees ; CMLon: Longitude centroid of ESP quad diode irradiance at the sun in degrees ; Format: ; YYYY DOY MO DD ; HHMM XRS-B XRS-A SEM 0.1-7 17.1 25.7 30.4 36.6 dark 121.6 dark q0 q1 q2 q3 CM CM ; proxy proxy proxy ESPquad ESP ESP ESP ESP ESP MEGS-P MEGS-P ESP ESP ESP ESP Lat Lon ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------- ;END_OF_HEADER 2012 171 06 19 0000 6.70e-07 9.76e-09 -1.00e+00 5.95e-04 7.38e-04 3.60e-04 4.86e-04 1.11e-04 5.00e+01 -1.00e+00 4.31e+01 2.71e-01 1.53e-01 3.74e-01 2.02e-01 -19.2 37.0 0001 6.69e-07 9.71e-09 -1.00e+00 5.93e-04 7.38e-04 3.60e-04 4.85e-04 1.09e-04 5.00e+01 -1.00e+00 4.31e+01 2.72e-01 1.52e-01 3.74e-01 2.02e-01 -19.3 37.4 0002 6.64e-07 9.57e-09 -1.00e+00 5.93e-04 7.38e-04 3.60e-04 4.86e-04 1.07e-04 5.00e+01 -1.00e+00 4.30e+01 2.71e-01 1.53e-01 3.73e-01 2.03e-01 -18.9 36.8 0003 6.62e-07 9.52e-09 -1.00e+00 5.92e-04 7.38e-04 3.60e-04 4.86e-04 1.07e-04 5.00e+01 -1.00e+00 4.30e+01 2.70e-01 1.55e-01 3.74e-01 2.02e-01 -18.9 36.5 0004 6.64e-07 9.57e-09 -1.00e+00 5.90e-04 7.38e-04 3.60e-04 4.86e-04 1.07e-04 5.00e+01 -1.00e+00 4.29e+01 2.71e-01 1.54e-01 3.73e-01 2.02e-01 -18.9 36.5 0005 6.67e-07 9.66e-09 -1.00e+00 5.91e-04 7.38e-04 3.60e-04 4.86e-04 1.05e-04 4.99e+01 -1.00e+00 4.29e+01 2.70e-01 1.53e-01 3.74e-01 2.02e-01 -19.1 37.4 0006 6.61e-07 9.48e-09 -1.00e+00 5.91e-04 7.38e-04 3.60e-04 4.86e-04 1.03e-04 4.99e+01 -1.00e+00 4.29e+01 2.70e-01 1.53e-01 3.75e-01 2.02e-01 -19.0 37.6 0007 6.56e-07 9.35e-09 -1.00e+00 5.91e-04 7.38e-04 3.60e-04 4.86e-04 1.02e-04 4.99e+01 -1.00e+00 4.28e+01 2.71e-01 1.54e-01 3.74e-01 2.02e-01 -19.0 36.7 0008 6.65e-07 9.61e-09 -1.00e+00 5.92e-04 7.38e-04 3.60e-04 4.85e-04 1.02e-04 4.99e+01 -1.00e+00 4.28e+01 2.72e-01 1.54e-01 3.73e-01 2.01e-01 -19.1 35.9 0009 6.74e-07 9.87e-09 -1.00e+00 5.93e-04 7.37e-04 3.60e-04 4.85e-04 1.01e-04 4.99e+01 -1.00e+00 4.28e+01 2.71e-01 1.54e-01 3.74e-01 2.02e-01 -19.0 36.7 0010 6.64e-07 9.57e-09 -1.00e+00 5.94e-04 7.38e-04 3.60e-04 4.85e-04 9.89e-05 4.99e+01 -1.00e+00 4.28e+01 2.71e-01 1.54e-01 3.73e-01 2.02e-01 -18.9 36.6 0011 6.69e-07 9.71e-09 -1.00e+00 5.93e-04 7.38e-04 3.60e-04 4.85e-04 9.96e-05 4.98e+01 -1.00e+00 4.27e+01 2.71e-01 1.52e-01 3.74e-01 2.03e-01 -19.2 37.6 0012 6.60e-07 9.47e-09 -1.00e+00 5.93e-04 7.38e-04 3.60e-04 4.85e-04 1.00e-04 4.98e+01 -1.00e+00 4.27e+01 2.71e-01 1.52e-01 3.74e-01 2.03e-01 -19.1 37.6 0013 6.67e-07 9.67e-09 -1.00e+00 5.91e-04 7.38e-04 3.60e-04 4.85e-04 1.03e-04 4.98e+01 -1.00e+00 4.26e+01 2.71e-01 1.53e-01 3.75e-01 2.01e-01 -19.3 37.1 0014 6.64e-07 9.57e-09 -1.00e+00 5.91e-04 7.38e-04 3.60e-04 4.85e-04 1.03e-04 4.98e+01 -1.00e+00 4.26e+01 2.71e-01 1.52e-01 3.74e-01 2.03e-01 -19.1 37.2 0015 6.61e-07 9.50e-09 -1.00e+00 5.92e-04 7.38e-04 3.61e-04 4.85e-04 1.02e-04 4.98e+01 -1.00e+00 4.26e+01 2.70e-01 1.53e-01 3.74e-01 2.03e-01 -18.9 37.5 0016 6.58e-07 9.40e-09 -1.00e+00 5.90e-04 7.39e-04 3.61e-04 4.85e-04 1.01e-04 4.98e+01 -1.00e+00 4.25e+01 2.71e-01 1.53e-01 3.74e-01 2.03e-01 -19.1 37.5 0017 6.58e-07 9.40e-09 -1.00e+00 5.91e-04 7.39e-04 3.62e-04 4.85e-04 9.83e-05 4.98e+01 -1.00e+00 4.25e+01 2.71e-01 1.52e-01 3.73e-01 2.03e-01 -19.0 37.5 0018 6.55e-07 9.33e-09 -1.00e+00 5.89e-04 7.39e-04 3.62e-04 4.85e-04 9.18e-05 4.98e+01 -1.00e+00 4.24e+01 2.71e-01 1.53e-01 3.73e-01 2.04e-01 -18.9 37.3 0019 6.61e-07 9.48e-09 -1.00e+00 5.89e-04 7.39e-04 3.63e-04 4.84e-04 8.50e-05 4.98e+01 -1.00e+00 4.24e+01 2.70e-01 1.54e-01 3.73e-01 2.03e-01 -18.8 36.6 0020 6.53e-07 9.26e-09 -1.00e+00 5.87e-04 7.39e-04 3.62e-04 4.84e-04 8.06e-05 4.98e+01 -1.00e+00 4.24e+01 2.71e-01 1.54e-01 3.73e-01 2.03e-01 -18.9 36.6 0021 6.54e-07 9.30e-09 -1.00e+00 5.86e-04 7.40e-04 3.63e-04 4.84e-04 7.63e-05 4.97e+01 -1.00e+00 4.23e+01 2.71e-01 1.53e-01 3.75e-01 2.01e-01 -19.3 37.0 0022 6.54e-07 9.30e-09 -1.00e+00 5.86e-04 7.40e-04 3.62e-04 4.84e-04 7.55e-05 4.97e+01 -1.00e+00 4.23e+01 2.71e-01 1.54e-01 3.74e-01 2.01e-01 -19.1 36.5 0023 6.48e-07 9.13e-09 -1.00e+00 5.84e-04 7.39e-04 3.62e-04 4.84e-04 7.09e-05 4.97e+01 -1.00e+00 4.22e+01 2.69e-01 1.52e-01 3.75e-01 2.03e-01 -19.0 38.7 0024 6.41e-07 8.93e-09 -1.00e+00 5.85e-04 7.39e-04 3.62e-04 4.85e-04 6.37e-05 4.97e+01 -1.00e+00 4.22e+01 2.70e-01 1.52e-01 3.75e-01 2.02e-01 -19.2 38.2 0025 6.45e-07 9.04e-09 -1.00e+00 5.83e-04 7.39e-04 3.62e-04 4.85e-04 5.63e-05 4.97e+01 -1.00e+00 4.21e+01 2.71e-01 1.51e-01 3.74e-01 2.04e-01 -19.2 38.4 0026 6.33e-07 8.70e-09 -1.00e+00 5.84e-04 7.39e-04 3.62e-04 4.85e-04 5.01e-05 4.98e+01 -1.00e+00 4.21e+01 2.70e-01 1.54e-01 3.74e-01 2.03e-01 -18.9 37.2 0027 6.35e-07 8.78e-09 -1.00e+00 5.82e-04 7.40e-04 3.62e-04 4.85e-04 4.44e-05 4.98e+01 -1.00e+00 4.21e+01 2.69e-01 1.53e-01 3.76e-01 2.02e-01 -19.1 38.1 0028 6.37e-07 8.81e-09 -1.00e+00 5.80e-04 7.40e-04 3.62e-04 4.85e-04 4.41e-05 4.98e+01 -1.00e+00 4.20e+01 2.70e-01 1.53e-01 3.75e-01 2.03e-01 -19.0 38.1 0029 6.47e-07 9.11e-09 -1.00e+00 5.82e-04 7.40e-04 3.62e-04 4.85e-04 4.43e-05 4.98e+01 -1.00e+00 4.20e+01 2.69e-01 1.54e-01 3.73e-01 2.03e-01 -18.7 37.1 0030 6.32e-07 8.68e-09 -1.00e+00 5.80e-04 7.39e-04 3.61e-04 4.85e-04 4.30e-05 4.98e+01 -1.00e+00 4.19e+01 2.70e-01 1.54e-01 3.73e-01 2.03e-01 -18.7 36.9 0031 6.52e-07 9.24e-09 -1.00e+00 5.85e-04 7.40e-04 3.61e-04 4.86e-04 3.88e-05 4.98e+01 -1.00e+00 4.19e+01 2.70e-01 1.54e-01 3.73e-01 2.02e-01 -18.9 36.6 0032 6.52e-07 9.24e-09 -1.00e+00 5.87e-04 7.39e-04 3.61e-04 4.86e-04 3.52e-05 4.97e+01 -1.00e+00 4.19e+01 2.71e-01 1.52e-01 3.74e-01 2.02e-01 -19.2 37.4 0033 6.44e-07 9.01e-09 -1.00e+00 5.81e-04 7.40e-04 3.61e-04 4.85e-04 3.12e-05 4.97e+01 -1.00e+00 4.18e+01 2.70e-01 1.53e-01 3.74e-01 2.03e-01 -18.9 37.7 0034 6.37e-07 8.83e-09 -1.00e+00 5.79e-04 7.40e-04 3.61e-04 4.85e-04 2.71e-05 4.97e+01 -1.00e+00 4.18e+01 2.70e-01 1.53e-01 3.74e-01 2.04e-01 -18.9 37.9 0035 6.27e-07 8.53e-09 -1.00e+00 5.76e-04 7.40e-04 3.60e-04 4.84e-04 2.27e-05 4.97e+01 -1.00e+00 4.18e+01 2.71e-01 1.52e-01 3.74e-01 2.03e-01 -19.1 37.8 0036 6.28e-07 8.57e-09 -1.00e+00 5.76e-04 7.40e-04 3.60e-04 4.84e-04 1.95e-05 4.97e+01 -1.00e+00 4.17e+01 2.71e-01 1.53e-01 3.72e-01 2.03e-01 -18.9 36.7 0037 6.22e-07 8.42e-09 -1.00e+00 5.74e-04 7.40e-04 3.60e-04 4.84e-04 1.81e-05 4.97e+01 -1.00e+00 4.17e+01 2.71e-01 1.53e-01 3.74e-01 2.02e-01 -19.1 36.9 0038 6.27e-07 8.53e-09 -1.00e+00 5.73e-04 7.40e-04 3.60e-04 4.84e-04 2.10e-05 4.96e+01 -1.00e+00 4.17e+01 2.70e-01 1.52e-01 3.74e-01 2.03e-01 -19.0 37.9 0039 6.22e-07 8.41e-09 -1.00e+00 5.71e-04 7.40e-04 3.60e-04 4.84e-04 2.37e-05 4.96e+01 -1.00e+00 4.16e+01 2.71e-01 1.53e-01 3.72e-01 2.04e-01 -18.8 36.8 0040 6.18e-07 8.30e-09 -1.00e+00 5.71e-04 7.40e-04 3.60e-04 4.84e-04 2.52e-05 4.96e+01 -1.00e+00 4.16e+01 2.71e-01 1.54e-01 3.72e-01 2.04e-01 -18.7 36.6 0041 6.18e-07 8.30e-09 -1.00e+00 5.69e-04 7.40e-04 3.61e-04 4.84e-04 2.70e-05 4.96e+01 -1.00e+00 4.16e+01 2.72e-01 1.53e-01 3.73e-01 2.03e-01 -19.0 36.6 0042 6.17e-07 8.26e-09 -1.00e+00 5.70e-04 7.40e-04 3.61e-04 4.85e-04 2.74e-05 4.95e+01 -1.00e+00 4.15e+01 2.72e-01 1.53e-01 3.73e-01 2.02e-01 -19.0 36.5 0043 6.22e-07 8.41e-09 -1.00e+00 5.70e-04 7.40e-04 3.61e-04 4.85e-04 3.07e-05 4.95e+01 -1.00e+00 4.16e+01 2.73e-01 1.53e-01 3.72e-01 2.02e-01 -19.1 35.6 0044 6.08e-07 8.05e-09 -1.00e+00 5.68e-04 7.40e-04 3.61e-04 4.85e-04 3.63e-05 4.95e+01 -1.00e+00 4.16e+01 2.72e-01 1.53e-01 3.72e-01 2.03e-01 -18.9 36.3 0045 6.17e-07 8.26e-09 -1.00e+00 5.68e-04 7.40e-04 3.61e-04 4.85e-04 3.98e-05 4.95e+01 -1.00e+00 4.15e+01 2.70e-01 1.53e-01 3.73e-01 2.04e-01 -18.8 37.2 0046 6.14e-07 8.20e-09 -1.00e+00 5.70e-04 7.39e-04 3.61e-04 4.84e-04 4.43e-05 4.95e+01 -1.00e+00 4.14e+01 2.70e-01 1.55e-01 3.73e-01 2.02e-01 -18.8 36.4 0047 6.12e-07 8.15e-09 -1.00e+00 5.69e-04 7.39e-04 3.61e-04 4.84e-04 5.01e-05 4.95e+01 -1.00e+00 4.14e+01 2.71e-01 1.53e-01 3.74e-01 2.02e-01 -19.1 36.9 0048 6.06e-07 7.98e-09 -1.00e+00 5.68e-04 7.39e-04 3.61e-04 4.84e-04 5.32e-05 4.95e+01 -1.00e+00 4.14e+01 2.71e-01 1.52e-01 3.74e-01 2.03e-01 -19.2 37.3 0049 6.11e-07 8.12e-09 -1.00e+00 5.67e-04 7.39e-04 3.61e-04 4.84e-04 5.52e-05 4.95e+01 -1.00e+00 4.14e+01 2.70e-01 1.52e-01 3.74e-01 2.03e-01 -19.1 38.2 0050 6.07e-07 8.01e-09 -1.00e+00 5.68e-04 7.39e-04 3.61e-04 4.84e-04 5.37e-05 4.95e+01 6.21e-03 4.13e+01 2.70e-01 1.53e-01 3.73e-01 2.04e-01 -18.8 37.7 0051 6.11e-07 8.12e-09 -1.00e+00 5.68e-04 7.39e-04 3.60e-04 4.84e-04 5.81e-05 4.95e+01 6.11e-03 4.13e+01 2.71e-01 1.53e-01 3.73e-01 2.03e-01 -18.9 37.2 0052 6.12e-07 8.15e-09 -1.00e+00 5.69e-04 7.38e-04 3.60e-04 4.84e-04 6.43e-05 4.95e+01 6.02e-03 4.13e+01 2.71e-01 1.54e-01 3.73e-01 2.02e-01 -18.9 36.4 0053 6.20e-07 8.36e-09 -1.00e+00 5.72e-04 7.38e-04 3.61e-04 4.85e-04 6.92e-05 4.95e+01 6.10e-03 4.12e+01 2.71e-01 1.54e-01 3.73e-01 2.03e-01 -18.9 36.8 0054 6.20e-07 8.36e-09 -1.00e+00 5.73e-04 7.39e-04 3.61e-04 4.86e-04 7.36e-05 4.95e+01 6.11e-03 4.12e+01 2.71e-01 1.52e-01 3.74e-01 2.03e-01 -19.1 37.5 0055 6.27e-07 8.55e-09 -1.00e+00 5.74e-04 7.39e-04 3.61e-04 4.86e-04 7.74e-05 4.95e+01 -1.00e+00 4.11e+01 2.71e-01 1.52e-01 3.73e-01 2.03e-01 -19.0 37.2 0056 6.22e-07 8.42e-09 -1.00e+00 5.75e-04 7.39e-04 3.61e-04 4.86e-04 8.09e-05 4.95e+01 -1.00e+00 4.11e+01 2.70e-01 1.52e-01 3.74e-01 2.04e-01 -18.9 37.8 0057 6.18e-07 8.30e-09 -1.00e+00 5.71e-04 7.39e-04 3.61e-04 4.86e-04 8.32e-05 4.95e+01 -1.00e+00 4.11e+01 2.71e-01 1.52e-01 3.74e-01 2.03e-01 -19.1 37.6 0058 6.24e-07 8.47e-09 -1.00e+00 5.74e-04 7.39e-04 3.61e-04 4.86e-04 8.75e-05 4.95e+01 -1.00e+00 4.10e+01 2.71e-01 1.53e-01 3.75e-01 2.02e-01 -19.2 37.1 0059 6.33e-07 8.71e-09 -1.00e+00 5.77e-04 7.39e-04 3.61e-04 4.86e-04 9.79e-05 4.95e+01 -1.00e+00 4.10e+01 2.72e-01 1.52e-01 3.74e-01 2.01e-01 -19.3 36.7 0100 6.27e-07 8.53e-09 -1.00e+00 5.76e-04 7.39e-04 3.61e-04 4.87e-04 1.12e-04 4.95e+01 -1.00e+00 4.10e+01 2.72e-01 1.53e-01 3.75e-01 2.01e-01 -19.3 36.9 0101 6.26e-07 8.52e-09 -1.00e+00 5.73e-04 7.39e-04 3.60e-04 4.86e-04 1.26e-04 4.95e+01 -1.00e+00 4.09e+01 2.70e-01 1.54e-01 3.73e-01 2.04e-01 -18.7 36.9 0102 6.27e-07 8.53e-09 -1.00e+00 5.72e-04 7.38e-04 3.60e-04 4.86e-04 1.31e-04 4.94e+01 -1.00e+00 4.09e+01 2.72e-01 1.52e-01 3.73e-01 2.03e-01 -19.1 37.4 0103 6.24e-07 8.45e-09 -1.00e+00 5.72e-04 7.38e-04 3.61e-04 4.86e-04 1.37e-04 4.94e+01 -1.00e+00 4.08e+01 2.71e-01 1.52e-01 3.75e-01 2.03e-01 -19.2 38.1 0104 6.14e-07 8.19e-09 -1.00e+00 5.68e-04 7.37e-04 3.61e-04 4.85e-04 1.47e-04 4.94e+01 -1.00e+00 4.08e+01 2.71e-01 1.53e-01 3.74e-01 2.03e-01 -19.0 37.2 0105 6.04e-07 7.92e-09 -1.00e+00 5.66e-04 7.37e-04 3.61e-04 4.84e-04 1.58e-04 4.94e+01 -1.00e+00 4.08e+01 2.71e-01 1.52e-01 3.73e-01 2.04e-01 -19.0 37.7 0106 6.02e-07 7.88e-09 -1.00e+00 5.64e-04 7.37e-04 3.60e-04 4.84e-04 1.65e-04 4.94e+01 -1.00e+00 4.08e+01 2.70e-01 1.53e-01 3.72e-01 2.05e-01 -18.7 37.7 0107 5.91e-07 7.59e-09 -1.00e+00 5.63e-04 7.36e-04 3.60e-04 4.83e-04 1.74e-04 4.94e+01 -1.00e+00 4.07e+01 2.72e-01 1.53e-01 3.73e-01 2.02e-01 -19.1 36.3 0108 5.97e-07 7.74e-09 -1.00e+00 5.62e-04 7.36e-04 3.60e-04 4.82e-04 1.82e-04 4.95e+01 -1.00e+00 4.07e+01 2.72e-01 1.52e-01 3.74e-01 2.03e-01 -19.1 37.5 0109 5.89e-07 7.55e-09 -1.00e+00 5.62e-04 7.36e-04 3.59e-04 4.82e-04 1.91e-04 4.95e+01 -1.00e+00 4.07e+01 2.70e-01 1.52e-01 3.73e-01 2.04e-01 -18.9 37.8 0110 6.06e-07 7.98e-09 -1.00e+00 5.62e-04 7.36e-04 3.59e-04 4.82e-04 1.96e-04 4.95e+01 -1.00e+00 4.07e+01 2.71e-01 1.53e-01 3.72e-01 2.03e-01 -18.9 36.6 0111 5.98e-07 7.79e-09 -1.00e+00 5.62e-04 7.36e-04 3.59e-04 4.81e-04 2.02e-04 4.95e+01 -1.00e+00 4.06e+01 2.72e-01 1.54e-01 3.74e-01 2.01e-01 -19.2 36.0 0112 5.91e-07 7.61e-09 -1.00e+00 5.62e-04 7.36e-04 3.59e-04 4.81e-04 2.03e-04 4.95e+01 -1.00e+00 4.06e+01 2.70e-01 1.54e-01 3.74e-01 2.02e-01 -18.9 36.8 0113 5.95e-07 7.71e-09 -1.00e+00 5.59e-04 7.36e-04 3.59e-04 4.81e-04 1.99e-04 4.95e+01 -1.00e+00 4.06e+01 2.70e-01 1.54e-01 3.73e-01 2.03e-01 -18.8 36.8 0114 5.94e-07 7.68e-09 -1.00e+00 5.58e-04 7.36e-04 3.58e-04 4.81e-04 1.93e-04 4.94e+01 -1.00e+00 4.06e+01 2.71e-01 1.53e-01 3.73e-01 2.04e-01 -18.9 37.0 0115 5.93e-07 7.64e-09 -1.00e+00 5.58e-04 7.36e-04 3.58e-04 4.80e-04 1.88e-04 4.94e+01 -1.00e+00 4.06e+01 2.71e-01 1.53e-01 3.74e-01 2.02e-01 -19.1 37.0 0116 5.91e-07 7.59e-09 -1.00e+00 5.55e-04 7.36e-04 3.58e-04 4.80e-04 1.85e-04 4.94e+01 -1.00e+00 4.05e+01 2.71e-01 1.53e-01 3.75e-01 2.02e-01 -19.2 37.3 0117 5.87e-07 7.49e-09 -1.00e+00 5.56e-04 7.36e-04 3.58e-04 4.81e-04 1.77e-04 4.94e+01 -1.00e+00 4.05e+01 2.71e-01 1.53e-01 3.74e-01 2.02e-01 -19.1 36.7 0118 5.82e-07 7.37e-09 -1.00e+00 5.56e-04 7.36e-04 3.58e-04 4.81e-04 1.80e-04 4.94e+01 -1.00e+00 4.05e+01 2.73e-01 1.53e-01 3.72e-01 2.02e-01 -19.0 35.9 0119 5.84e-07 7.43e-09 -1.00e+00 5.56e-04 7.36e-04 3.58e-04 4.87e-04 1.80e-04 4.94e+01 -1.00e+00 4.04e+01 2.70e-01 1.55e-01 3.72e-01 2.03e-01 -18.6 36.4 0120 5.83e-07 7.40e-09 -1.00e+00 5.55e-04 7.36e-04 3.58e-04 4.87e-04 1.70e-04 4.94e+01 -1.00e+00 4.04e+01 2.71e-01 1.53e-01 3.73e-01 2.02e-01 -19.0 36.8 0121 5.86e-07 7.47e-09 -1.00e+00 5.54e-04 7.36e-04 3.58e-04 4.85e-04 1.58e-04 4.93e+01 -1.00e+00 4.04e+01 2.70e-01 1.53e-01 3.73e-01 2.04e-01 -18.8 37.4 0122 5.86e-07 7.47e-09 -1.00e+00 5.54e-04 7.36e-04 3.58e-04 4.84e-04 1.52e-04 4.93e+01 -1.00e+00 4.04e+01 2.70e-01 1.53e-01 3.72e-01 2.05e-01 -18.6 37.1 0123 5.80e-07 7.33e-09 -1.00e+00 5.54e-04 7.36e-04 3.58e-04 4.83e-04 1.50e-04 4.93e+01 -1.00e+00 4.03e+01 2.70e-01 1.53e-01 3.73e-01 2.03e-01 -18.9 37.3 0124 5.86e-07 7.46e-09 -1.00e+00 5.53e-04 7.36e-04 3.58e-04 4.82e-04 1.47e-04 4.93e+01 -1.00e+00 4.03e+01 2.70e-01 1.54e-01 3.74e-01 2.03e-01 -18.9 37.2 0125 5.78e-07 7.27e-09 -1.00e+00 5.53e-04 7.36e-04 3.58e-04 4.82e-04 1.47e-04 4.93e+01 -1.00e+00 4.03e+01 2.69e-01 1.54e-01 3.73e-01 2.04e-01 -18.7 37.4 0126 5.84e-07 7.41e-09 -1.00e+00 5.52e-04 7.37e-04 3.58e-04 4.81e-04 1.48e-04 4.92e+01 -1.00e+00 4.02e+01 2.71e-01 1.53e-01 3.73e-01 2.03e-01 -18.9 37.0 0127 5.77e-07 7.24e-09 -1.00e+00 5.53e-04 7.37e-04 3.58e-04 4.81e-04 1.48e-04 4.92e+01 -1.00e+00 4.02e+01 2.71e-01 1.53e-01 3.73e-01 2.04e-01 -18.8 37.5 0128 5.78e-07 7.25e-09 -1.00e+00 5.53e-04 7.37e-04 3.58e-04 4.81e-04 1.46e-04 4.92e+01 -1.00e+00 4.02e+01 2.71e-01 1.54e-01 3.72e-01 2.03e-01 -18.8 36.5 0129 5.87e-07 7.50e-09 -1.00e+00 5.52e-04 7.37e-04 3.58e-04 4.81e-04 1.45e-04 4.92e+01 -1.00e+00 4.01e+01 2.71e-01 1.53e-01 3.73e-01 2.03e-01 -18.9 36.5 0130 5.78e-07 7.27e-09 -1.00e+00 5.52e-04 7.37e-04 3.58e-04 4.81e-04 1.46e-04 4.92e+01 -1.00e+00 4.01e+01 2.71e-01 1.54e-01 3.73e-01 2.03e-01 -18.9 36.7 0131 5.83e-07 7.40e-09 -1.00e+00 5.53e-04 7.37e-04 3.58e-04 4.81e-04 1.38e-04 4.92e+01 -1.00e+00 4.01e+01 2.70e-01 1.54e-01 3.74e-01 2.02e-01 -19.0 37.4 0132 5.82e-07 7.37e-09 -1.00e+00 5.52e-04 7.37e-04 3.58e-04 4.81e-04 1.33e-04 4.91e+01 -1.00e+00 4.00e+01 2.70e-01 1.54e-01 3.74e-01 2.02e-01 -18.9 36.9 0133 5.79e-07 7.30e-09 -1.00e+00 5.51e-04 7.37e-04 3.58e-04 4.81e-04 1.34e-04 4.91e+01 -1.00e+00 4.00e+01 2.71e-01 1.54e-01 3.72e-01 2.03e-01 -18.8 36.5 0134 5.78e-07 7.27e-09 -1.00e+00 5.51e-04 7.37e-04 3.58e-04 4.81e-04 1.33e-04 4.91e+01 -1.00e+00 4.00e+01 2.70e-01 1.54e-01 3.73e-01 2.03e-01 -18.8 36.8 0135 5.86e-07 7.46e-09 -1.00e+00 5.52e-04 7.37e-04 3.58e-04 4.81e-04 1.37e-04 4.91e+01 -1.00e+00 4.00e+01 2.70e-01 1.54e-01 3.72e-01 2.04e-01 -18.6 36.9 0136 5.78e-07 7.27e-09 -1.00e+00 5.53e-04 7.37e-04 3.58e-04 4.81e-04 1.40e-04 4.91e+01 -1.00e+00 3.99e+01 2.70e-01 1.53e-01 3.72e-01 2.04e-01 -18.7 37.3 0137 5.80e-07 7.33e-09 -1.00e+00 5.52e-04 7.37e-04 3.58e-04 4.82e-04 1.43e-04 4.91e+01 -1.00e+00 3.99e+01 2.70e-01 1.53e-01 3.73e-01 2.04e-01 -18.8 37.8 0138 5.80e-07 7.31e-09 -1.00e+00 5.50e-04 7.37e-04 3.59e-04 4.82e-04 1.47e-04 4.90e+01 -1.00e+00 3.99e+01 2.70e-01 1.52e-01 3.74e-01 2.04e-01 -19.0 38.2 0139 5.79e-07 7.28e-09 -1.00e+00 5.50e-04 7.37e-04 3.59e-04 4.82e-04 1.48e-04 4.90e+01 -1.00e+00 3.99e+01 2.71e-01 1.52e-01 3.74e-01 2.03e-01 -19.1 37.6 0140 5.80e-07 7.31e-09 -1.00e+00 5.52e-04 7.37e-04 3.58e-04 4.83e-04 1.47e-04 4.90e+01 -1.00e+00 3.98e+01 2.70e-01 1.52e-01 3.74e-01 2.04e-01 -18.8 38.3 sunpy-0.8.3/sunpy/data/test/RecentIndices_truncated.txt0000644000175000017500000000375413231613137023504 0ustar nabilnabil00000000000000:Recent_Solar_Indices: RecentIndices.txt :Created: 2016 Jan 04 0534 UTC # Prepared by the U.S. Dept. of Commerce, NOAA, Space Weather Prediction Center (SWPC). # Please send comments and suggestions to swpc.webmaster@noaa.gov # # Source SWO: SWPC Space Weather Operations (SWO). # Source RI: S.I.D.C. Brussels International Sunspot Number. # Source 10.7cm radio flux values (sfu): Penticton, B.C., Canada. # # Source Ap: GeoForschungsZentrum, Postdam, Germany # Prior to January 1997, Institut fur Geophysik, Gottingen, Germany # Source Ap for final month is NOAA/SWPC estimated Ap. # # Data not yet available or not calculable: -1.0 # # Values for most recent 6 months are considered preliminary. # Final values from National Geophysical Data Center www.ngdc.noaa.gov # # Recent Solar Indices # of Observed Monthly Mean Values # # -----------Sunspot Numbers--------- ----Radio Flux--- ---Geomagnetic--- # ---Observed---- Ratio --Smoothed- Observed Smoothed Observed Smoothed # YR MO SWO RI RI/SW SWO RI 10.7cm 10.7cm Ap Ap #------------------------------------------------------------------------------- 1991 01 213.5 136.9 0.64 220.5 147.6 229.4 205.5 8 17.4 1991 02 270.2 167.5 0.62 221.5 147.6 243.0 206.3 10 18.4 1991 03 227.9 141.9 0.62 220.7 146.6 230.0 205.9 27 19.1 1991 04 215.9 140.0 0.65 220.7 146.5 198.8 206.8 17 20.0 1991 05 182.5 121.3 0.66 219.6 145.5 190.3 207.1 18 21.7 1991 06 231.8 169.7 0.73 218.9 145.2 206.8 207.4 44 23.0 1991 07 245.7 173.7 0.71 219.5 146.3 212.0 207.7 27 23.6 1991 08 251.5 176.3 0.70 218.3 146.6 210.3 206.8 30 24.7 1991 09 185.8 125.3 0.67 214.2 144.9 180.6 203.9 20 25.0 1991 10 220.1 144.1 0.65 208.4 141.7 201.3 199.7 31 24.3 sunpy-0.8.3/sunpy/data/test/__init__.py0000644000175000017500000000176413232563447020274 0ustar nabilnabil00000000000000"""SunPy test data files""" from __future__ import absolute_import import os import glob from astropy.utils.data import get_pkg_data_filename import sunpy __all__ = ['rootdir', 'file_list', 'get_test_filepath'] rootdir = os.path.join(os.path.dirname(sunpy.__file__), "data", "test") def get_test_filepath(filename, **kwargs): """ Return the full path to a test file in the ``data/test`` directory. Parameters ---------- filename : `str` The name of the file inside the ``data/test`` directory. Return ------ filepath : `str` The full path to the file. See Also -------- astropy.utils.data.get_pkg_data_filename : Get package data filename Notes ----- This is a wrapper around `astropy.utils.data.get_pkg_data_filename` which sets the ``package`` kwarg to be 'sunpy.data.test`. """ return get_pkg_data_filename(filename, package="sunpy.data.test", **kwargs) file_list = glob.glob(os.path.join(rootdir, '*.[!p]*')) sunpy-0.8.3/sunpy/data/test/aia_171_level1.fits0000644000175000001440000044440013203275053020417 0ustar nabil00000000000000SIMPLE = T / conforms to FITS standard BITPIX = -64 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 128 NAXIS2 = 128 DSUN_OBS= 147724815128.0 DATAVALS= 16777216 AIMGSHEN= 13 AIMSHCTC= 2040.828003 AIFTSID = 40960 DATAP10 = 8.0 DATAP95 = 807.0 ROI_LLX2= -2147483648 DATAP90 = 585.0 T_OBS = '2011-02-15T00:00:01.34Z' AIVNMST = 453 DATAP98 = 1138.0 DATAP99 = 1474.0 AICFGDL4= 236 CRLT_OBS= -6.820544 AICFGDL1= 0 AICFGDL2= 137 AICFGDL3= 201 TOTVALS = 16777216 ACS_MODE= 'SCIENCE ' CROTA2 = 0.019413 AIMSHOBE= 68.835999 AIMSHOBC= 54.832001 TRECROUN= 1 AIHIS860= 8388604 R_SUN = 1622.185913 ORB_REC = 'sdo.fds_orbit_vectors[2011.02.15_00:00:00_UTC]' FID = 0 WAVE_STR= '171_THIN' DATAP25 = 20.0 AECDELAY= 1537 INT_TIME= 2.273438 TRECEPOC= '1977.01.01_00:00:00_TAI' TEMPSMIR= 34.703 AIMSHCBC= 2054.947998 SAT_Z0 = 10.103751 LVL_NUM = 1.0 ACS_SAFE= 'NO ' AIMSHCBE= 2068.855957 AIFOENFL= 1 AIFDBID = 241 AIMGOTS = 1676419235 CTYPE1 = 'HPLN-TAN' EXPTIME = 2.000191 QUALLEV0= 0 OBS_VN = -3110.628437 AIASEN = 0 AIFCPS = 10 TEMPCCD = -69.667 CDELT1 = 19.183648 CDELT2 = 19.183648 RSUN_REF= 696000000.0 DATE-OBS= '2011-02-15T00:00:00.34' AISTATE = 'CLOSED ' OBS_VW = 30057.50278 DATAMEAN= 250.34 DATARMS = 318.8 OBS_VR = 2812.012181 GAEX_OBS= 31180895.28 RSUN_OBS= 971.812597 AIAWVLEN= 7 INSTRUME= 'AIA_3 ' CAMERA = 3 BLANK = -32768 OSCNRMS = 'nan ' DN_GAIN = 17.7 OSCNMEAN= 'nan ' CTYPE2 = 'HPLT-TAN' ROI_LLX1= -2147483648 AIHIS348= 8388492 DATAKURT= 21.51 EFF_AREA= 2.419 AIFILTYP= 0 HAEX_OBS= -122148412622.47 ACS_ECLP= 'NO ' AGT1SVY = 1 ROI_NWIN= -2147483648 AGT1SVZ = 5 AIAECENF= 1 ASQFSN = 20781661 INST_ROT= 0.019327 PERCENTD= 100.0 ACS_CGT = 'GT3 ' TEMPGT = 15.019 HAEZ_OBS= -23561780.5 ASD_REC = 'sdo.lev0_asd_0004[:#8247022]' QUALITY = 0 ROI_SUM = -2147483648 DATASKEW= 3.3 TEMPFPAD= 16.586 MPO_REC = 'sdo.master_pointing[:#377]' ROI_NAX2= -2147483648 FSN = 20781661 ROI_NAX1= -2147483648 DSUN_REF= 149597870691.0 AIHISMXB= 7 PIXLUNIT= 'DN ' EXPSDEV = 0.000132 AIAHFSN = 20781653 CAR_ROT = 2106 HGLT_OBS= -6.820544 AIMGTYP = 0 CUNIT1 = 'arcsec ' ASQTNUM = 2 CUNIT2 = 'arcsec ' CRLN_OBS= 22.814522 ORIGIN = 'SDO/JSOC-SDP' ROI_NAY2= -2147483648 WAVEUNIT= 'angstrom' AIHIS604= 8388603 AIMGOTSS= 5190 NSPIKES = 18263 GAEZ_OBS= -21726852.75 NSATPIX = 0 DATAMIN = -6 IMSCL_MP= 0.599489 AIFRMLID= 3024 BLD_VERS= 'V5R12X ' CRVAL2 = 2.865574805180813 CRPIX1 = 64.5 CRPIX2 = 64.5 CRVAL1 = -4.532172209851069 TELESCOP= 'SDO/AIA ' WAVELNTH= 171 ISPPKTIM= '2011-02-14T23:59:57.50Z' DATAMAX = 12115 KEYWDDOC= 'http://www.lmsal.com/sdodocs/aiafitskeywords.pdf' AIMGFSN = 5 Y0_MP = 2042.719971 ROI_NAY1= -2147483648 AIMGSHCE= 2000 AGT3SVZ = 1 AGT3SVY = 0 DATAP75 = 360.0 TRECSTEP= 1.0 AECMODE = 'ON ' DATE = '2012-10-12T23:56:57' T_REC = '2011-02-15T00:00:01Z' AIHIS192= 8383997 IMG_TYPE= 'LIGHT ' EFF_AR_V= 3.0 HAEY_OBS= 83080597874.92 AIAGP9 = 457 AIMSHCTE= 2025.891968 AIAGP5 = 0 AIAGP6 = 0 AIAGP7 = 0 AIAGP1 = 0 AIAGP2 = 0 AIAGP3 = 0 SAT_ROT = 8.6E-05 HGLN_OBS= 0.0 AGT4SVZ = -4 ISPPKTVN= '001.197 ' AIFTSWTH= 0 AGT4SVY = -3 AIMSHOTE= 25.532 DATACENT= 240.91 AIFWEN = 204 ISPSNAME= 'aia.lev0_isp_0011' DATAMEDN= 172 MISSVALS= 0 AIAECTI = 0 AIAGP8 = 393 ASQHDR = 2168265309 ACS_SUNP= 'YES ' DATAP01 = 0.0 GAEY_OBS= 18270454.83 FLAT_REC= 'aia.flatfield[:#7]' ROI_LLY2= -2147483648 X0_MP = 2055.060059 ROI_LLY1= -2147483648 AIAGP4 = 0 AIMSHOTC= 40.560001 AGT2SVY = -5 RECNUM = 69981867 AGT2SVZ = -8 AIAGP10 = 748 DETECTOR= 'AIA ' AECTYPE = 0 SAT_Y0 = -9.619762 COMMENT FITS (Flexible Image Transport System) format is defined in 'Astronomy COMMENT and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H HISTORY END ?????????????????@@ @ @@@ @ @@@@#@@@@@ @"@@"@ @"@$@%@#@&@$@$@)@)@0@-@+@-@/@#@1@@0@@.@1@1@2@@0@/@1@)@/@*@(@/@.@&@(@%@#@&@%@!@(@!@%@)@*@%@&@#@!@ @'@@@@@@$@@@@@@?@???????????????????@???@?@?@@@@ @@@#@@ @ @%@@$@ @'@(@%@@@!@&@@%@&@%@'@-@(@(@,@0@0@0@@5@4@3@@4@@2@2@1@2@/@1@2@*@-@0@,@,@0@+@)@'@*@,@+@,@,@)@(@@@%@@"@@@@ @!@!@@ @@@ @@@ @????@???????????????????@?@ ???@@@@@@#@#@@#@"@&@'@"@ @)@%@$@(@*@(@!@'@(@!@/@0@-@4@/@0@@6@2@@4@2@5@<@;@>@@4@8@6@6@3@3@1@4@@.@2@2@&@.@%@0@1@2@@2@1@,@-@)@*@@*@#@#@$@@!@!@"@$@#@!@@@@@@@@@??@??????????????????????@@@?@@@ @"@@@@"@&@@%@%@'@&@!@#@&@'@*@)@,@+@&@0@0@@1@0@@1@@.@6@6@1@5@7@@6@6@6@<@@@@`@=@<@=@9@@9@5@2@2@0@2@@1@1@@+@1@0@@3@1@@5@2@1@,@.@.@(@+@+@%@$@@!@@!@#@#@@@#@@@@@@ @@@???????????????@????@@@@@@@@@@ @!@@!@$@"@ @!@)@&@%@-@)@+@.@*@,@-@2@,@4@@1@5@1@4@5@9@=@@:@@=@@@?@@A@@?@B @G@E@E@D@A@=@=@:@@8@;@9@@5@4@@4@5@1@@5@6@0@:@1@@2@3@2@@2@(@)@)@)@$@!@%@@"@%@!@"@#@"@@@@@@@@ @???????????????????@?@ ?@@@@@@@"@@"@@%@"@@$@ @$@*@#@$@.@/@*@(@/@1@@3@/@6@1@3@8@9@9@@=@<@@@@>@@@D@@D@A@G@@H@@M@J`@H @H @D@D@B@B @@@@A@A`@@`@=@3@8@:@9@@9@@:@9@8@7@4@0@2@(@.@*@(@&@#@#@"@'@"@'@(@#@#@"@@@@@@@@@@???????????????????@??@ @@@@@@@@#@#@'@*@!@!@%@*@)@$@(@,@,@0@3@1@@6@1@7@6@;@:@=@@=@@`@<@@B@A@D@D@@E@J@@K@L @I@@P@@V@S@SP@P@M @K@H@@I@I @G@C@C@@@@@`@?@?@@A@@A @?@A`@8@<@6@8@@1@1@*@,@*@,@(@*@ @'@(@*@ @$@ @%@!@@@@@@@@@??@????????????????@@@@@ @@@@@@@@%@@%@&@!@@'@,@(@)@%@-@*@2@4@4@@2@6@7@@<@;@@<@>@B@@A`@C@E`@E`@I@M`@K@O@O@@Q@Q@Q@UP@Y@ZP@\`@WP@U@@R`@M@P@M@@J @K@I@H@D@F@I@I`@F`@D@D@A@A@>@;@4@1@.@0@+@-@(@*@.@3@,@'@+@(@%@@'@"@@@$@@@@@ @????@????????????@@??@@@ @@@"@ @@@@#@$@+@#@$@$@ @'@+@+@)@2@@0@@5@2@@/@7@;@9@@9@A@C@F@D@E@G@M@K`@O @O@R@S@T@V0@U@[@W@@[@`P@c@@d@aP@]`@Y`@U@U@U@T@P@PP@N@@K @M@QP@P0@M@P @K@E@@C@A@:@7@6@5@2@@0@4@2@1@@0@-@'@&@%@#@$@$@!@@@@%@ @@@@@@?@?????????????@??@?@@@@@ @@@!@!@!@ @!@@@"@@'@8@@#@'@*@-@1@0@1@@5@>@@8@@9@=@B@@D@H@@F@N@L @N @R@S@S@V@T @X@[@^@@`@b@b@a8@a@@e@j@mx@j@fH@dX@]0@^@^ @\@[P@U@U`@V@V@X@VP@T@P@P0@M`@J`@E@A@@?@5@4@@8@;@@6@7@2@.@0@(@)@$@$@#@ @@)@ @@@@%@@@@@@ @ @????????????????@@ @@@@@@@"@@@%@ @&@&@ @#@%@(@'@-@1@+@1@0@5@7@@;@@@@?@A`@E@D@L@M`@QP@Rp@V@X@X@Z@]0@] @_@]@d@e@d@i@i8@j@i@l@r@s@r@p@kx@i@g@gx@f0@c@a@]0@^@`@a@`@\@Y@U`@R@P@I`@E @B @<@@C@@>@C@<@:@@4@6@4@@(@*@&@+@#@&@"@$@%@@@ @@%@ @@@@ @ @ @????????????@@@@@@?@@@@#@#@#@!@#@!@*@)@(@&@*@-@-@)@1@2@4@5@7@9@<@A@D@J@@L@M@N @R@X`@Y0@\@a@cX@d@fH@g`@fx@h@l@@m@pP@q|@rH@t@rD@r@y$@{t@z@w@t4@q@p@q@pP@k@h@gP@h@h@i@g@d@`@]@X@T@O@M@K@K@K @H @E@C@;@@ @3@1@3@,@)@,@'@+@%@,@@!@@!@ @@@!@@@@@@@????????????????@@@@@@@@!@@#@&@"@@#@*@*@(@(@(@/@(@*@2@2@6@7@8@>@A@@B@B@H@Q@S@W@Z @^`@^@c@f@i@kx@m(@q8@r0@q@r@s@v@y@z@z@z@}x@x @{@@J@~@}l@y,@w@xp@w@ud@s@r @r4@th@q$@o@k@g`@e@`8@Z@U@U@T@X@R@O@G@B@?@@9@7@@5@.@,@0@@(@&@.@&@$@%@$@&@ @&@"@!@"@@!@ @@?@@ ?????????@???@ @ @@@@@ @@ @(@$@&@"@#@)@&@*@+@%@0@0@0@2@4@7@@8@;@:@C`@H@@G@J@N@Q@T@^@d@l@l@l@rh@t @t@v@z|@{@|@z@w@s@t@r@rX@r@t@v@s@q`@p@p@w@up@t,@v@s@r@wH@y8@}@z@y@v,@r,@p@l@fx@cP@dX@e@d0@]@V@M@K@D@B@<@8@3@4@4@2@0@2@/@,@)@%@"@#@$@ @#@ @@@@!@@@@@@@???????@@@@@@@@@$@#@!@%@)@(@+@'@1@0@)@&@1@@4@4@@5@>@@A@B@D@@F@K @Q@V@[0@[p@_@d8@j@r@w@{@~@@@t@z@xX@v@u<@m@qT@zd@p@h@r@xL@gh@o@r@o@l@l@k@o@r@s@n@{@j@q@q@{@}@x@w@sX@q@st@r@p@jH@bP@^ @T`@Q0@D`@C @@@<@@<@8@@:@8@0@1@'@$@.@ @)@(@$@"@$@@$@@@@@@?@@????????@@?@@@@@@#@$@(@$@#@'@%@&@.@,@-@1@4@2@7@<@<@@@@C@F@G@Q@R@U@`@f @lX@ql@qX@r\@y0@@@@~p@s@t@m@p@u@w@k@c8@q @lH@ip@q@h0@b8@b@g@@a@jH@i`@l@o@lp@sp@qX@b@i@m0@p4@m@@x<@v@s@z@|@\@{@vl@n@eP@`h@V@T@L@J@F@D@A@B@@`@5@@3@2@,@/@(@'@$@@-@%@$@#@ @@#@"@!@@@@@@??????@@@@@@@"@@#@%@#@%@&@)@!@(@(@,@-@0@0@2@9@=@B@?@@B@@E`@M@Qp@V@@[0@`p@d@pT@v8@|@@r@|@"@@p@@t@t@rP@h@q @rL@d@a@j@hx@nh@f@e@i(@`(@]@a0@j0@k8@p @n@lX@d@^p@`x@eh@hx@j(@e@eH@kX@k@s@@6@@@~@v@p@e@@`p@[@Y@T@Q@O@@I@D@=@;@9@@4@/@1@.@!@%@)@&@'@#@ @!@@#@ @@@@@@ @ @???????@?@@@@@@@@@$@@&@$@,@*@0@.@/@1@-@3@8@9@@>@:@@@C@D @I@Q@W@b@dP@k@tL@{0@@@@l@l@N@z@w\@w@|t@t@p@o@dH@eH@] @vP@Y@@b(@v@r@ip@`@[p@`0@cx@dH@f@f@p@m@@g@\0@d@l@nh@h@d@cx@g @l(@vL@s@{\@&@@@z@r|@l(@f@c@b@`@W@R@L@F@@@<@6@@1@3@)@-@#@(@&@"@+@ @!@$@@@@'@@@@@@??????@@@@@@@@!@!@(@$@)@&@,@(@)@*@0@0@8@3@6@7@@:@@A @B`@A@E @D@@L@T@]@i@s@w@T@@@@P@@@{D@xx@j@wH@w@z@u|@q,@_`@a8@aH@`@^@]@g@c@`x@i@]`@d @e@a@j@d@[@_@^@` @r@i@h8@x@i@d@l@k@t\@zt@@@x@x@@@}$@u@v$@p@k @b@Y0@Sp@J@D@<@@7@7@4@0@@0@(@0@%@+@%@)@*@"@ @ @!@!@@"@ @@@@ ???@@@@@@@@@ @"@!@ @&@#@$@1@*@(@#@2@3@@4@;@7@@>@?@E@@E@F@O@P @W@^@h@@yD@@@@@@h@ @@{@wx@w@tp@nh@s@x`@r@bX@c`@_@f`@j0@eX@gh@\@_@]@]@e@d@@s$@f@f@`@X@`@gX@l@b`@l@j@s@n@l`@q`@g@fH@o @v@t@v@xX@v@@@@@~4@u@k8@d@Y@Q@I@D@@@:@4@4@5@,@+@0@@&@(@,@-@'@&@@"@"@!@@ @@@@??????@@@ @@@@@$@ @'@,@&@'@*@'@0@1@3@4@@5@6@8@;@E@@H@@K@Pp@O@V @_0@i@qx@v@6@r@@@@@:@x@w@y@yt@u@x(@k@m@h@d@e@g@j@d8@i@j @c@g@^@e@j@i`@n@m@p@o@c@Y@Z@z@f(@aH@g@tT@r@r0@q@r@w@s@m@n@@|@v@x@r@v@~@@}@@n@~@u@p @dH@ZP@R0@H@@@=@@8@6@@6@/@,@*@"@*@+@*@@%@%@$@)@&@$@@@ @@@@???@@@@@@@@$@#@%@@&@1@)@)@-@1@1@5@5@=@@?@D@@B@J@K @Qp@Y @]@g@o@s@~H@@@.@@y@x@p@r<@x @t@v@t|@p@n@@r@n@i`@^@`@b@d@k@s@p@q@p@iH@m@q(@o8@o@u`@sL@q@ix@[@^@`0@dX@i@dP@k @k@pX@s4@y@u@sp@l@@n`@v@u`@v$@y @t@x@{0@R@@$@:@z@mx@f@Y@M@I@D@A@@@7@5@3@'@.@-@+@&@%@%@'@)@"@@ @!@@@@@ @@?@@@ @@@@#@@#@@*@(@+@'@1@@/@0@2@5@9@:@@@?@H@I@Pp@T`@`P@a@h@p@x(@}@@~@@}|@x@~@q@m@q@w@}@wT@s@u`@s@lp@kX@`@a@bp@`(@k@m(@t @s@x@r@r@xD@n @p@i@j@i@nX@o @l@c@j@iH@h@c @i@x@t@x@uT@o@k@op@p|@r@up@{h@w@w@tL@@|@}@>@@@zx@qX@`H@W@Q@G@N@@A@;@9@6@1@@2@(@(@)@0@+@'@#@%@%@#@@!@@@@@?@@@@@@@@@@#@'@%@#@)@(@0@@0@5@3@:@@<@A`@E@G@J@Q@X@@^@dX@p@v@}@,@(@,@2@w@yL@t4@s@u,@o@r@yP@v@s@v@r@sl@{@g@i@c0@i@fp@p@r@u@w@u8@(@t@j@m@t@px@r@p@m`@g@bH@j@@kX@hX@h@@g@w@w@vT@tT@q@p@t@r@mh@m@s@w$@w`@y4@s@y @@@v,@yd@X@@@|,@mP@b@[@Tp@L @QP@=@@<@9@6@2@1@@+@(@+@/@,@(@&@ @#@@#@ @@#@@?@@ @@@@@@%@#@%@)@)@.@0@@0@3@3@8@>@A @C`@F@K@RP@S@W@`@d@l@u,@@.@@@~@zL@{,@w<@qD@g@o8@p`@j@t4@q@tH@r@v @w@n@i@sl@p@p@m@i@qX@p@q@k@p0@x<@q@o@nX@o8@u$@y@v@g@j@a@a@jH@pd@y@>@rp@q@~H@w@q@z@v@t`@}@q@s@w@y|@sx@H@s@}@s@z@@v@@x@@n@fx@W@O@J@F@@=@=@:@8@:@2@@,@.@(@*@(@ @"@@&@!@$@$@!@@@@ @@@@@@!@"@'@#@#@+@0@2@2@4@2@7@@@@C@@H@@N@S@V@\@b@gX@q(@w\@@P@@.@@@yl@y4@mH@t4@i@n@o@t@w@b@q@y,@ud@s@u@jh@tl@r@@q@d@o@sH@s@s@j8@a@k`@q@k@l@oh@jp@q@r@h@d@c@`@k@r4@n@q@p @np@mH@p(@r@vD@uX@p@s4@r<@v8@x@s@q@u8@v@z@uL@z@.@F@z@@z @i@^@Sp@L @M@G@:@<@9@8@0@@2@)@1@-@)@-@%@!@(@@!@@@@@@@@@@@!@$@"@(@,@'@0@1@0@@1@6@;@>@B@I@M`@Q@X@b@f@k@sX@{L@@2@u@6@F@@w@{@x`@uX@r@jP@k@g@l@k0@e@s@u@xd@sp@p@k@o@r@b@b@e`@o@k@p@eH@\@i@lx@l@n@t@q|@i0@g@n@hh@b@o@t`@v@q@r@s@rX@i8@p@s`@td@t4@w@s@qp@o@p8@q@lH@s@t@wP@y\@{@@z@@@@sx@hx@f8@U@X@PP@H@@A@2@@8@:@3@@1@,@.@(@'@'@#@+@&@@&@!@@ @@@@@@@@#@ @$@*@&@0@/@3@4@4@8@@@I@R@R@Y0@]@d @oH@wD@@X@@@`@@}d@}@~@@uD@t`@uT@p@r@nX@l@e@c@^@sx@q@t@r@q@}@r@l@d@ph@g8@b@b8@c8@[@Y@`@i@f@g@ql@q@g@h@e@f@i@r@s @s8@p@r@q|@o0@c@t4@o`@p@q@@kp@n@m@j@gH@j@f@q@z@{@@w@y@@@~@@y@@v@n@Xp@Q@K@B@@ @@@@@3@2@1@1@,@-@'@#@$@%@"@#@@@@@@@@@!@%@#@@(@0@)@/@0@4@8@9@@`@J@@M@Q@V0@\@c8@k@u@~(@F@@ @@s@{@@y|@v @w@p@q@u@k@r`@l@j@r@d@e@b@rD@r@s@p@r @p@n8@j(@p\@c@_@` @`@W@[@d@b@b@l@n@l@@q@jH@a0@i@u@rx@n@qh@r@w@r@bp@k@u@s4@uh@pT@p0@j@o@m@b@i(@c@p@t<@p@q|@{4@x@}@b@@@@|8@m`@aP@W@M@T@E@C@D`@B@5@1@*@0@(@&@@"@(@ @ @@$@$@@@@@#@%@)@!@%@,@,@1@@0@2@5@@:@A@G`@I@Qp@X@@] @dx@hx@s@{@"@@V@@y@x`@w<@r@z|@rL@q@t@s@s@@v@q`@t@fH@f@fP@c@[@i@gp@l @p @i@q@pd@u@p@`@Z@d`@qH@[@^@a @l @k@m@w@l@nH@fp@k@d(@rd@v@n@h@p@t@d@b@g@o@n@p@q@s@d`@h@c`@bH@^@e @f@g@l@l@s@y@{|@@@@@@x@l@dh@V@W0@U@Pp@P@@@@;@4@3@@,@*@-@$@#@+@*@%@%@ @@"@@@ @@@*@+@'@&@+@-@2@7@5@<@B@I`@O@U@^P@dh@j@q@vX@@@k@@|p@v@yd@qt@q@u@xt@y@s@@t(@q@ox@t@r @`@`(@f@k @h8@]@d8@i8@l@hP@p@p@k0@c`@j@fh@b@s4@v\@i@q@p@u|@r@n@oX@tH@vT@y@p\@i@kH@r4@op@p@o@jp@eH@d@k@p@r@r@i@d@c@_@a@a@e@f@c@j@q,@q@z@z@x(@|@@@T@@v|@q@e@`@`@W@S`@F@A @8@6@/@-@&@#@"@ @*@#@'@"@#@"@ @@@#@"@'@%@)@+@1@@1@@1@5@9@B`@H@@L@U@^@cx@m(@r@w@~@@n@|@@y|@u@pD@v@q@g@t|@uL@tH@r@r@u@w@s0@p,@p@fh@f@`@cx@`0@d@f`@e`@cH@c@cP@h8@kP@g@g@i@0@r@s@b@s@r@h@v@wD@r@ @k@q4@d`@p,@t,@i@q@j@h@rx@e @j@rd@t@g@a@]@_@`@d@f@c@jp@r@q@y(@b@vh@{ @ @\@y$@|4@@@}@r@g@f@d@Z@P@=@4@@6@@,@.@,@#@"@#@,@#@$@"@!@ @ @@%@"@@!@&@(@0@@.@1@5@@:@@@B@J@@P @Z@c@kX@rH@v@}@@@,@@{D@@wl@v@xp@q@fx@q0@q@k@g@n`@q0@t@t@nH@k0@b@@sl@h@hp@b@`@a@f@`h@d@eH@c@m@p@c8@o(@ex@r@p@nX@`@l@m@t@q@r@t@p@r@o@r@q@i @iX@q$@p @p@g@c@c @g8@o@ax@e@`@q8@f@f@r$@mP@u@v@m@@r@r@y@}@$@{@wh@ @$@@z@nH@l@f@`@M@@C@@@@5@@6@,@+@,@*@,@*@'@"@"@#@@@!@!@!@&@)@%@+@1@0@3@6@>@@C@J @K@T`@`@iX@q\@wt@|@8@L@@@~@}@y@y@pp@r@u@h@tX@jh@e@h@qL@l@rL@rX@kx@o@r@t@k@q@b@h8@h@m@bp@dx@a@l@n@[@c@g(@s@i@g@d@Y@@`@j@r@m@t@u@q@ix@f@x@y @kH@{@p(@n@n@g@g@gh@f@o@c@a@c(@n@o(@m@l@jp@i@k@f@h@m@t@x@y@{ @~@.@@@@y4@td@p\@c@O@G@@@9@@6@4@4@@+@*@)@@'@+@&@#@%@"@#@&@&@(@$@+@0@1@2@4@;@<@C @J@Q @W`@b@k@s@|L@@@8@@@@}4@~@w@t@tt@sp@pD@r@rl@wp@d@h@f@t@l@f @qh@s|@mh@l@o@p@h@r@u@o(@`@f@c0@dx@b@Q@j@fX@d@Y@g@h8@[0@j@n@h@p@p@i@n@k@p@vx@m@o@hh@r`@m@rL@k@l@h@`x@a @k`@np@a@`@r@qh@n@n@i@c@g@e@pD@u@zT@}<@}@^@@@@@w@p@a@Q@I @C@@@<@4@6@0@,@'@&@)@&@%@#@!@!@#@%@'@ @%@-@3@*@0@7@;@D@M@@Q@V@`@@f@o@x@@@@@@~@F@@@d@X@w@ph@t@q@c@x@kX@e@c @f@r@k@b @d`@t,@j@gp@p@r0@y@v4@y@p@j@b8@S0@X@\`@[@P@Z@U@p4@f@]@j(@i@e@e@eX@Z@f@f@i(@t@s@n@o@f@p@Y@l0@z@nP@n@_`@^@e@`@bx@`@ix@j@i@p@c@e@mx@oH@pd@y@@4@P@@@>@`@@r@}@s@e @V`@I@F`@C@>@@9@6@4@2@/@)@-@'@)@!@$@ @$@$@%@%@&@)@1@@4@7@@6@@@@@F@@O@U@[P@dh@k@q0@}@@b@@@(@f@8@@Z@T@~@r|@w@p$@n@k@j@l@k@l@q@n@oP@qx@s@k@l@n@r @qL@y@r@v|@m@n@b@_@_P@sp@^@Y@@V@a@^@U@p@`@]@l@[@_@[p@h@o@q@j @o@g@m@aP@ux@b@f@q@q@c`@_@a@[@b@a@o@hx@j@g@d@j@p@g@nX@w@x@|t@w@@N@*@@@L@r@j0@^@T@K@@D`@A@@B@@8@9@@5@1@/@+@-@#@$@(@"@$@!@+@%@(@0@@-@4@8@@=@@C@J`@Q@Zp@b@i@q4@x@@N@r@Z@@@x@@.@{@@{@wL@v@w@u0@r@lH@h@p@y@s@r|@t@p@rL@q@q<@s@uD@r@s@t@s@o@q@p @[p@W@b@`@Y@\ @XP@``@ZP@cx@^p@c@e @b@q8@U@Y @c@` @g`@j@c@^@^@s@n @Y@q@W0@c@]@`@b@a@g@t@m8@n(@j(@gp@pl@t$@px@p@p<@r@w@tt@@@@@@@zl@n@@ep@V@PP@K@C@B@;@5@5@@0@1@0@-@#@#@,@ @&@&@$@.@/@0@5@6@;@@@@H@L@T @]@f@o@v@@@B@@L@@@@@@z@|@{@wL@|0@y@w<@v@sT@r@@ut@s@o@tt@oh@sD@p<@u@yH@t$@v@p@q4@v@m@h@e@j8@Y@]`@i(@b8@fH@dx@[`@Z@`@g@`@ql@b@lX@l@d@f`@a`@a@e @op@kH@l@x@@q @h@_0@`@[@b@a@c@l@r @k@qX@j@n@m@p\@m0@q@v@t0@p@r@y(@||@@@ @@b@u@l@a@W@Qp@H@D@;@=@=@2@0@'@/@#@'@'@"@"@'@*@.@0@@0@@2@@:@@?@@B @G @N@@W@@c@@k@v@}l@l@@]@@@~@@|@~@@@@u@ @v@w@u0@tH@z@z@v@t@t@r@k@s@q@p@qX@{@y@y@}@r$@@j@xL@p$@op@b@b@k@j@l @p@h@l@g@e@w@q@d@d@n@h@i@np@l@p@q@w@s@p@@{L@o@f@m0@q@m@g(@p@q@w`@v(@s@r@w(@p@j(@o@r@q`@q@q@q@y@~x@|@@N@@@@t@h@_@T @K@G@B@@@:@5@*@/@.@'@/@%@$@#@.@)@1@1@3@@6@6@<@@F@@I@R @]@f@p@y@@@@@@@@{@l@{@{D@~@@xx@uh@u@yL@tx@|@zx@~H@z@w@xp@ud@i@r`@p@o@p@oH@t@x\@xl@u@tH@o8@p@o(@p@j(@i@eP@q@j(@r@j@s,@o@s@s@h@j@m@oH@q@u@t@s$@l@p@P@@0@@@y@u@@@y@l@s@x8@{P@~@@{@s@l@h@m@n@kP@t(@p8@t@~@~@@@D@@@d@y\@p@e0@\0@R@O@J`@<@@@ @5@3@0@@+@/@$@%@)@$@*@*@,@1@@5@@9@;@B@I@P@Z@@b0@hP@t@y@@ @@@@@xt@}@@p@}@x @s@w@z@@~d@y@|@y8@~@z@p@up@s@r@tT@u@pD@x@t @u@s@v@v`@w@t@t@sD@tL@r(@k@p@jP@d@q@iX@oh@pp@qL@g@aX@\@j@k@uD@w@t@}@v@@^@i@n@zL@wd@0@z@Z@d@x@$@@t$@tH@}@"@@@N@y@s@p@pH@l(@p@q@t@q@{X@x@z @~8@v@@@,@$@t4@h@b@@Z0@P@H@D@@@6@5@@2@.@*@'@$@(@.@,@-@.@4@4@<@@?@F@K@@R@[p@d@o@x@V@@A@l@j@F@@z@4@w$@u@y@xH@w @y@y`@}@@~H@~@x|@b@z@i@g@v@@t@rp@rd@x@}@v@t`@s@up@r@u$@o @y8@s@v@u@q@p@lh@l@o@i@e@eP@f@a@e@{t@p@}@@*@xd@{@|H@|@i@nP@p@p@t@2@7@@@|t@y@u@@@D@8@\@@v@t@l`@l@s@mX@m @p@r@z|@@|@@@@*@@zp@ph@dX@\@V@@O@G`@D@9@8@2@.@&@'@%@(@)@0@3@2@4@;@@>@D@@G@P@V`@a @h@rd@{@j@@@@V@@|`@v@@x@|@r@w@x@up@u@~l@@x@@{h@t$@p,@h@p@r@q @r@k@o@q@q@z@dh@l@p @r@e@j@u@y@w@p|@s @r@q@q@jX@n@g`@f@k@b@`@{@z|@@@x@@L@v@u@k@a@c`@p(@x@~ @}l@@n@v@y@f@@@W@@@w@{@q@l@v,@p@v@st@s@zx@@@>@@@^@@@^@u@k@a@[@@Q@@K@E@@ @;@3@*@-@,@*@!@'@,@2@4@@3@9@?@F @M@U@^@d8@l@v@@@@@}<@N@{x@w@{@|@@{@w@|@ @{@{@@|@x@p@n@p@t@i @g@o@n@r@ch@u@z@r@g@j@q@h@v@vD@td@n`@p@g@p@q@sH@g@n@h@c@e@s@e@d@@*@2@H@@)@X@P@@i@d`@Y0@_@r@xP@s@v@|8@v@@c@o(@||@@@|@@x@s@jh@n@q@y@@{@{@@@@@@@F@@@@1@ @{@t@kx@`x@V@O @J@C@;@8@3@-@(@/@$@,@.@-@1@/@;@@?@E@L @V@a@f@pH@y@t@@@@@w@{x@v@x`@{H@yT@y$@u@v@u@v@s@s@|@y@nx@n@q@t@r@iP@n@q8@j0@s$@rX@zp@p@k@ep@d(@p@i@e(@x@s@o@m@eH@rl@q@`@a`@Y@`X@b@[@b@gx@@|@@@~@o@@l@@q|@k@i@l@a@r`@oX@d@n@p@}@y@dp@q@u@m@z@s@@|@s@gp@nh@u@@@@L@@N@r@@@r@(@@@.@}P@u@p$@g@[@Q@K@D@?@@9@@5@0@@-@/@/@*@+@*@2@6@7@@?@@F@Pp@Z@cp@kx@s@}@@@#@r@@@0@}@@v,@{L@{`@z@wl@t@}x@p@r8@rX@p\@q@rd@o@t@s@j@gh@ch@i@@s@m@lP@o@{T@t@l(@pp@o@u@h@e`@l@d`@l@g@e@kX@]0@_@Q@cx@d@_@cx@a@k@@ @@"@@@q@kx@{P@b@\p@dh@|,@`@h@eh@d@eH@j @i@w@q@a@F@r@r\@p@gX@h`@q@sD@@l@@w@@@@@@\@$@*@T@@6@|l@s@lH@bP@W@M @H@C@=@8@4@0@@0@@&@+@0@.@3@6@@;@D @E@S@Z@bH@j@t@@^@@@@@x8@}x@n@|@~(@}@t@w@v@y@z0@rl@p@o@q8@s@u@x|@zX@j@l(@p@r@@o@pT@i@i8@v@j@q@k@f(@q@o@u @z@j@b@`@lP@l@ch@c@P@P@]@a@`x@i@q@u@m@-@@@@u @iX@y@j@fh@.@Z @a@d @z@f@c`@d@i@d@q@s@jH@v@n0@p@r@p(@}t@@@@5@'@ـ@@@@L@@@@@@@r@@y@r@e@]@R@@K@D@A@@8@5@@5@@*@-@%@-@3@1@4@>@C@M@S@[@cx@nx@wx@@"@@@,@ul@z@~0@@~@u@w@p@x@{@| @L@yD@w@x@{\@|@y@B@@|@ql@q4@e@s@p@i@_@@b@`@m8@h(@h@n@v@g@@n@u@j @gp@q@hh@s@m@h@c@a`@d0@p@n@@b@D@@r@z@Z@yp@0@kx@f@p0@l@f@gP@g@s@v\@d@c@q@`X@w @n@~4@F@u$@@@@@@@@@@]@@R@ @@@n@@@h@@{@t@kh@`@S`@O`@I@B@?@8@6@4@@/@*@0@2@5@6@B`@E@M@S @`0@f@r@{4@*@@@@P@`@wP@x@x@y@x@w@u\@y`@@yt@y@@@@X@F@@@{@ @@nh@c@ox@}@m@k@f@@gX@e@l`@f@t@s@@x@n@o@l@r@h@l@@f@i0@dH@q@ep@n@k@o@z<@@@W@@a@@X@@@uX@@w@j@nH@h@s@i@j@j@ZP@o@k@r,@(@@@@<@@@@c@@W@@n@8@@@@H@@@@@J@@} @uL@k @b`@V@Qp@L@@A@@A@<@5@1@/@1@@'@2@8@@@ @B @I@O`@V@b@k@v@@@@Z@@@4@~@v@y@tH@w@|@t@z8@u@w@|@|@z@@@I@@-@@@z@p@n@t@r@e@dx@p@tl@q@cP@e@d@g@lX@e@ex@j@qt@y@lP@e@i@p@`H@a@pp@tp@|8@ @!@t@@@@@w0@@&@k(@y@v@u@p@k@eH@e(@k8@hX@k@q4@n@w@{@@w@@#@@@@@1@@o@@@@4@$@@@@*@@0@@w@p4@b@X0@R@H@G@D`@:@@:@1@@1@@,@3@3@5@@?@E@I@T0@\@f@p @x@f@@@@@@8@~x@{@w@u@x@x@s@x@v@zH@y@@z@*@@ @@@@!@F@@v@d@d`@h@a(@k @p @p@i@@i@h @oH@f@f@e@l@h@q@p@e@n@q<@k@p@g(@q@}@@@@@8@l@X@@@qt@@@@v,@t@ox@m@{@@y@f@v@h`@n@q8@p@@@@@@@@@@@h@@0@@@\@d@}@@@@j@y@q@f@`@T0@J@@D@?@@<@9@6@@5@3@2@9@9@A @G@N@Wp@a8@j @s@~,@,@:@r@x@@D@@@z@xp@(@@@t@}@}@yt@{@@@|L@@<@,@@@@@@@r @cX@k@q@]@n@f@kX@hp@g@r`@j@s@k@s@p@t@u@k@n@`@q@g0@a@yd@q@r@ut@{@w@>@@@V@@@h@!@E@@@@@@@P@p@ut@v@oX@h`@mP@t(@@@@@P@@\@@@e@,@@@@@@0@@@@h@@|@s@h(@aH@Y@P@H@@E@A@=@;@:@3@1@9@>@D@J@S0@\@dX@m@v@J@>@@ @6@@@@@~@@D@@|@|@4@@@@@|@~@@@@@ŀ@@ @}@}D@q0@q@e@dP@f@j`@v,@j@m@@rx@v@t@h@r\@uT@r@s@l@q@a@oH@n@h@i@f@b@dP@f@t@q@@t@|t@@ @h@@|@@x@@&@@t@y@@}D@v0@v@r@j@tL@t@n@r@@@@?@_@@@Z@j@@@$@{@@N@b@@.@,@}@s@i0@b@\`@Q@M@C@@@@>@;@:@2@@2@7@:@C@M@T`@\@g`@p\@w@B@@@@L@>@@R@@@L@@~@|@@@@@H@@u8@xP@x|@w@@@@@@S@~@||@t @p@u@h@k@s`@r@n@@p@p`@m@n@o@xd@y@r@n@o@p@j0@h@kh@n@j@e@Y@]@b@b@[@nh@q`@|<@@l@@&@<@4@@P@@@h@@~@x@v@v@q@x@X@vP@x@@y@@@@@4@\@T@@zP@}@@}@xL@{@D@@ @@@t@k8@b@\@S@J@E@C`@:@7@@7@3@@8@@;@@@`@C@N@@T @`@g@@q@y4@ @@@n@r@@d@|t@.@@8@~@z@@~@zX@~@|d@~X@v@{@}0@@@T@@@*@@{t@y@{@zH@n@m@u$@wT@rT@o@p`@j@p@o@x@v@b@h@k@t@l@i@kX@nh@c@j@b0@N`@Y@cP@`@Y @lX@x8@~@|<@x@~@@rD@|h@|@R@\@@|@@4@| @z@k@u@y@z@@vh@}@@y@J@@@@@.@@x@y@x @|t@}l@w0@ @~@@@@@w@o(@fX@_@@U@O`@E@@C`@:@@:@9@@2@@6@;@;@@E@@PP@V@\@g@r@y,@@@@@@@N@~@@{`@}\@@ @x@x@w@}@|@w@y@}(@@wh@p@qP@q@zX@@sP@v@y`@|,@v@t@r@x,@s<@xH@qH@j@g8@o@sh@}<@ @6@r@o@p@i@i@c@q@mp@c@N`@TP@a@T@S@P@gh@i8@h @e@g@lX@y@f(@`@rx@s@|4@p@~@L@@{@@x@|@~@{@zt@|@q@u@tD@w@@<@@@h@^@x@Z@r@y@{|@w@@l@.@(@@xL@op@f@]p@R@I@@B@=@>@@7@3@5@@?@:@C@H@P@@W@`@i@s@z@@@@@@:@@~`@{@u@|x@|l@@@z|@"@@@}X@|@wP@~ @v@p@p@iH@l@q`@t@u@v@v @th@v@u,@tX@u@y@@w@n@p@u@xp@{@@wx@p@c@j@@p@{@`@m8@e@Q@U@U`@T@c@X@M@j@l@lh@c@d@b(@a@f@c@Z @t@o@}@xt@v@4@}@{@@b@Z@y@H@J@@z@zl@t@@"@@{@}@{@{@@x@|L@@.@@8@@@@|0@s@gH@a@Sp@K@@B@=@6@8@3@@6@9@@>@B@J@Qp@X@c@l@@t@|@@P@@@@@@H@|@}@~h@}@}\@ @|@z@@@@@@z@w @s|@p@o@m @k`@p @q@p@u@vh@w<@u@x@w@x@t@t$@oP@n`@u(@t@|@h0@`@f@a@g@h@g@]@[@Z@S@d@V@U@b@V@Z@W@`@d@`@d@b@d8@_@aX@n@h@sD@yt@ul@v@u@|@w`@@@ @>@&@(@x@vh@H@z@@@@u(@r@s`@y4@w@|\@@b@~@@d@X@>@D@t@j@b@U@K@D@<@8@7@@2@8@7@=@D @L@S@]@d@nh@u @@@t@F@@@@z@|@x@@{@@@}@y|@|@@@^@@wP@r@s@s@p\@p@r@wH@tp@o8@m@p@u@w@v@d@|@v@u@r@r@s@p<@t @s@_@b@`@f@k@o@i@Z@_p@d @]`@c8@f(@V@]@]@k@@e@s@fp@i@_0@_P@b@h@U@l@fx@n@z@x@p @q@u@wD@w@}d@|@@y@J@w@X@|@x@t@v@t@m@t@u@}p@v@Z@N@@4@4@@>@d@}@sx@m@b@X@I@F@@@8@7@4@@5@7@@@@A@I`@R@[@e@oX@v @@V@@@F@@@@~\@T@w@z@|@|P@@|l@|t@@|@@yl@y8@u@r@r@n@p@yd@t@w@q|@uH@r@@{@y@y@~@t@w @v@s@q@v@j@p<@`@e8@b@`P@d@q<@pP@_`@c@@k@Y@Y @R@O@@S@`8@d8@f@e@b(@e@`p@a@b@g@XP@n0@m0@m@@q @t@s@q0@sP@u @v@zt@w@t@t@@{L@vT@w(@|@w@w8@n@h@l@n@s@t@}@~@J@T@,@@@.@@@{@s@o`@eX@[@M@E@>@;@3@6@7@=@=@D@H`@S@\@e@n0@u@h@@@l@@ @@}@|\@{@xL@@|T@y@}@}@~@t@}x@|@x@yP@t@x,@u@v,@s@wt@r@x@wX@s@|P@w`@@~@L@@}@yx@w@s@r@p@j(@k@h@^@W@b8@n@kh@t@`@j@_@Z@@Z@a@ql@iP@W@p,@bH@d@e@j@dx@Z`@_@uX@a@eh@n @j0@p\@v@x@r,@k@sL@x@z@xT@u\@p@t@~@{@zx@y@v@s@@h@@t@qX@{H@}\@z@x@@@@@@6@B@|\@v@pH@f@[@O @L @A`@7@@5@6@=@@;@A@@C@G`@Sp@\@e@n@t@(@@N@@@B@@@@~@{ @~@@@H@~@}(@h@@}@ @yT@q@q@s@q@s@w@s @w@}t@{@y@~0@H@@L@@@P@x@wL@u@m@r@m(@e@\@b@bP@cX@b@e8@f0@p@^@pl@m@u@mh@h @jx@uX@v@f@p@u@g@a@^@f@i@Y@cx@u@t@q@o@k@oP@o@q@z@{<@w`@t@sl@l@h@x@u@r@r@o@y@w,@u@ @|@}@|@@.@(@@@@@{@s@f@]@S@H@@@;@5@@1@5@A@C @F@J@U@\@d@m@@v@~L@@@@|@@@:@0@>@6@H@~@@@@}@@}x@6@@x@@{@t@q$@u@s@wp@xT@w@{8@|@y@s@},@s@u@x4@x8@z@{L@}@s@@u@r@ox@p@k@^@U@b@t@p@hx@b@i@k@o0@nx@h(@z@@i@f@t@y|@vX@{@q4@r,@o@d@f@r@h@y|@z@t$@p@u@t@p@q@q@@s@y@o@r`@t@t@q\@q@q@p@p@w@y@~\@x\@v@|@@@@V@@x@z@w8@qh@hH@^@T@H@@ @:@@4@@3@:@@;@A@D@M@U@\@c@m@u@~@@@@@d@@F@j@|@V@@@>@p@8@@b@<@@}@wX@y@zh@},@z@w8@wx@u@zD@v@v@t@rP@s@qp@u@w<@x0@{@v@v`@t@w4@j@h(@eH@W@]@@V`@\@` @f @c@np@y@t,@ud@z@@@q@g@a@u @{\@L@z@u0@q@p@p@r|@n8@x@q4@s@x@s@q@rX@tT@wh@tp@v@yD@w@p@r@sp@p@kx@k@kH@s@v@xp@z@|X@y@y@@@`@~@@j@|P@vh@o@e@Y@R@A@@ @9@@5@6@@9@@>@B@G@@M`@W@]@d@o@t@@@@<@@@@@r@@v@|@@0@@X@@@~@l@|@ @@|@@@|@x@@t@sL@p\@k@j@p@q@n@p@p@st@y@z@x@zp@x4@x0@t@hH@d@a@X@X@Sp@W@T@Y@j@k(@n@rx@|@@P@v @pt@r@l@q@n@q@o@k@l@p@t@s@r`@m@p,@x@r@u@o@o`@qH@sp@r@sH@|@~T@|@td@u@op@vX@p@u@ql@w@vl@u@zl@x8@u@y@@@@@@z@s@j@ax@U@I @A@<@;@5@5@<@@A@C@D @O@S@Y@d8@l@td@|D@j@@@l@@^@8@~@x@@vh@J@>@~@@(@f@|@}@|@@h@@.@z,@v@o@l @q@c@i`@n`@r@r`@nP@l@q$@l@uh@u@u@|@{P@u@eP@a@b@\@Zp@X@@N@P@s8@`h@e@s@o8@v@p$@p@o@ud@oP@gX@hH@j@t@r@vx@p@pH@n@h@q@gP@j@r@s@w8@z@t@u@t@wL@s0@w@@{@@|@yd@v@t<@n @v@x@v@yd@{@z@z@v@sh@w@@@J@@@z0@q@h@`@T@H@B@@@<@5@3@@<@@B`@E@J @R@@X@\@ch@k@s0@|@@@.@@@@@}@@~l@@|H@`@|@J@{T@<@|@@d@2@H@p@w@u@o@i@np@j8@m@r@s|@z@~P@{@s@k@rt@j@sX@p@z@x@f@c@a0@X@e0@\@Q@QP@^@@f@o@k@`@v@jH@pd@u@t@|@i@l@s<@s @o@h8@c@i`@s@f(@qT@f@d@r@j@{p@x@s@v@Z@y@p@vP@u @z@v@v @p@qx@p@u@wx@~@|D@t@@{@~d@|@@x@@@@{X@q@d@Y@P@D@@A@A@;@9@@1@=@@A@G`@N@P`@T@^@f(@j@rP@{@@@@b@ @<@:@z@@x@v@F@@{T@y$@~@z@{@}@@@@@w@q@t@jH@m`@k@t@t@{@z @@{,@y@q@p @d@gP@q@k@}@p@j`@i@W@[@N@@^@bX@T @h@d @b@dh@s@s@s|@p@q|@z@sX@uL@t<@r@gX@mp@b0@n @c@c@fH@k@fH@l@mP@s@p,@{(@{@w@p@p@v@v<@z8@u@u@t@w@p@tP@w\@u@@z@@~@~X@y@y@z@@l@$@y@n@b@X@Q@@J@C@B@?@8@2@?@E @G@@K@Qp@W@`8@d8@k@s@{x@@x@@`@@@@~(@z@{<@"@J@z@|\@| @xd@}$@z@} @$@@@zX@x(@s@m@r@k@w@0@0@@w@(@s(@tD@w(@v@l@c@_@i@e@{@k@c@]@ch@K@^@@^@`x@xL@F@l@p@d@@tT@q@c@Z`@h@w@l@n@e@`@f@p\@p @h@d @gx@m@pl@lP@j(@z`@kX@w<@wL@rD@t@v@u@v @t@x@r@pL@s@q@u@uL@~`@{@|@}@@wh@}@z@h@n@@@u@k`@`@V@Q0@N`@H@B@9@7@1@B@G @H@@P@Up@Y@]p@c@k@s|@z@@@@@@@@}H@,@@@~ @@w@{X@v@|@<@X@z@z@~h@z$@w<@zT@j@q @q$@@(@}p@w@u@@|@u@v @f@o@f@\@b@j@f(@`(@@c@f@^`@W@W@T@@b@{T@@~@@c@g@W@k@i@T@lx@@l@m@e(@[@`h@h@j@i@p@jX@kh@r@o@wP@~@x@qp@lx@r(@v@u@x@x@z@t(@w`@q@s@r|@t@y@@Z@@@|l@x<@tt@yP@y@`@4@@t@h@c@]@Y @P@F@@A@@@@@9@7@C @H@H @P@TP@]P@a@d@l @r@w@@ @@@H@@@@p@@@x8@@z@y@|@}@~@~@~@wX@v@t@zd@yx@q@q @s @uP@t@u@s@{L@o(@fX@d@a@b@[@g@i@_@\@b@^@w0@f@a@_ @a@Wp@qt@v@b@l`@U@^@d@g@e@W@p@i8@o@`@d@a@i@n8@p@m @o@g @j@s0@i8@o@x@v@m@n @z@p8@w@tl@s@{P@@~,@q@v@q@x@||@@T@@@@z@v@z,@B@@@@sx@m`@h@@a@V@Q@N@F @@@=@5@C@F@L@R @U@Z@@_@dh@l@t@x@}@@@@@j@@@@@P@@L@|@}@2@|t@ @z0@r@p@oP@t@r|@@u@r@s@p@u@|@w@p@`H@l@e(@Z@_@\P@`@W @\@\@eh@a@c0@e@mP@k@f@_`@c@j@j@_0@^@Y@^0@f@c@g@Y @f@i@_@`@b@p0@oh@q@j`@c@]@b0@rD@gh@l@r0@j@o(@k@nP@r@@s@r\@}@@V@q@t,@s@w`@u@zh@@@@|X@zL@}@}@~@@@6@@{ @u$@mp@c@[@T@O @F@E@>@>@C@E@I@P@X@@`@bP@g0@m`@s@@y@~D@@l@@@@Z@@p@@@@@@u@@zD@}@~@@~@s<@m0@s8@r@6@z\@u0@r,@q|@p@h@uh@s@` @a@s@h@W@`8@^@Z@a@d@b@cX@e8@i@s@~4@s@@nX@e@@r$@st@h@b@b@d@p@c@e0@c@^@c@d@g@j@k@pT@r@k@f @h@c@q@m@h@n@r@wt@o0@k@r@n @uD@p@q@|T@x@t(@u@v@xx@<@X@@@t@x@z@@@@%@@@@t @jP@b@Y@T@Q@G @D`@9@<@C@J@O`@S@W@^@@c@h(@m@s@x\@~@.@@@@@@@@(@@z@@@@{p@@^@@@{@s @rD@w@@B@vP@u@q@l@n@j@x@Y@`@h@ap@] @i@c@@bH@a@e@n@f`@a@qP@~@^@s@m@t|@r@u$@@i@f@q@xd@}t@r@gx@e@e@a@\@f@qH@dh@q\@bP@l@g@qt@p@i@np@oP@e@g@j@s@jh@o@u @t@s@{@q@v @w@xP@w@@{@@}@{@u@~<@{@@@3@@p@z@r8@ih@a@X@U@PP@I@C@@@;@E @I @M@Q@X@_@eH@i@@p4@s|@zl@&@@x@@ @N@*@j@ @*@^@$@@D@D@^@8@R@(@@@s@w@v@~l@@|@w@{p@p,@q@i@j@]p@[@{@i@W@eH@yp@U@\@oH@z`@o @p@}@@@@zP@s@y@~@y@q@n@zL@|L@@wl@c @e@f@i@d@r,@i@k@d @^@`@a@ex@q @n@m@a@[@[p@]@h@e@oP@s@o@j8@n(@w@r@@w@z@~@z@{h@8@(@{\@z@xP@}@@&@@f@6@t@n@fx@`@V@O@F @C@@@=@3@@@`@F@J@S@X@\@d@h@pT@s@yx@@@@:@f@@@@J@@@2@@@@2@ @d@\@H@@@q@v@@f@t@{@<@u@t@p@eh@c@f@ix@y\@W@X`@\@W@[P@`@f@q|@s@t@@@t@@{H@@@r@p@m`@@@@v@l@m0@w@o@m@k@o@e@c@q@e@ZP@Z@[@a@c@nH@a@XP@d@h@e@h@u@n@p@m@q,@z@n@s@wX@z0@x@V@z@w@y@wp@{h@`@ @@@\@|@r@h(@b0@[@S@L@E @B@>@>@5@B@A@G@@N@@Q@W@a@f@m`@s@xT@~@@@@@Q@@:@@@@g@5@j@H@@@^@@C@@2@t@v@R@@@@x@ph@kp@o@p@k(@bP@k@cP@T`@L`@`8@kp@m@b@d0@o@t@k@d@@u@{H@v@@}T@i(@x@@r@h@t@i@p@eH@p\@r@gP@i0@bP@k@g@d@V@a@c0@f(@b@s@U@\@e@u|@b@d@|@p@q@}\@p(@`@@e@l@} @~D@t$@6@v@@x,@|@t@@@@@\@@u@k@a@Y@R @M@F@B@>@:@@8@@6@@C@F@I@@P@S@X@\@d@k@p@v@{L@@@@@@5@ @@@G@ր@@@r@@@d@@ @@8@2@n@@J@ @y@t@wH@qd@u@~D@r@q@_`@eH@p@V@@W@s`@g@a@e@g@i@pX@ah@u@c@@t@p@u@@t@N@{@u@u0@l8@h@o0@m8@q@qp@o@kh@h@bH@r@Z@f@^@Zp@c@_@d8@V@^ @ih@j@h@q@@@y@w@kX@f@c@p@t@r@ @r@@|@u@}H@v@@j@}@b@@@~@p@d@_p@V@R@K@@C@E@@@@=@@3@1@B@E`@F`@O@S@WP@\P@b@h`@n@tD@x@~D@@@@T@^@@/@@|@@@@@&@@@@@c@@D@t@@@@w@~@s@*@@@u@ex@p@i@b@h(@XP@[@nH@``@f@r@t,@s@W@l@z@w@@z@y@q @t@@=@@:@tP@v@@@@|h@|@t@qH@l@n@aH@eH@_@a@V@T@X@b@c@`@f@tL@k@mx@|,@q @qd@Zp@[0@a@\@@c@y$@{@g(@@w@}@{@z@z4@N@@x@@@v@n@c@]@S@P@L@@F@D@A`@?@8@<@A@G@H`@M @P`@U@V@^@d@j8@pt@t@{T@r@@@'@@'@@@@@}@B@@p@@@D@8@@@@@v@i@@r@@8@o@b@u0@aP@_@b @b@^@V@Z`@c@]@gx@tt@n @u@yl@u8@h@q@u@uP@r@{@\@@@u@z @r@{@u@s@t,@q|@oX@u@o@Z`@^@X0@c8@Z @[@`@p@q@e@_@fP@`@f@f@qd@ph@b@Z@[@c@i(@tt@h@x@@w@v(@}@z@`@xt@|@@@T@w@n0@b@Y@Up@P@K@C`@A @;@=@7@4@3@A@D`@J@L@Q@T@Y0@_@c @h@m @qL@u@}P@@J@V@@@@?@@@z@xL@yP@@J@ @@^@@z@B@Y@9@@@t@f@a@[@i@b@\@eh@P@]@jh@S@I@N@e@[@Wp@`@a@@ax@f@mp@e@cP@e@g0@u@R@>@@@}@ @t`@w@p@l@ep@lx@t@a@p$@Y@\@`@k@T@Q@k@c@e@e(@c@b@[`@uL@g0@hx@a@g8@f(@l@{@i@t@@s@u @{@4@@@@@ @@r@g@_@U@O@J@D@A @>@A@:@8@1@3@@?@C@C@@J @M@P@T@W @_0@c@i@l@qt@w@@J@`@@2@@@}@@w@p|@x8@}@@B@@@@R@@l@)@@@@`@u@q`@j@p@[@\@`@@Y@V@_p@f@RP@`@W@X@b@w@n@c@ud@jh@i@c@bX@g@nP@~@}@}@@l@v@@jx@q8@$@m@t@m@a@i@d@d0@S`@S@d@O`@X@dX@p @pD@fX@eh@f @@q@tp@e@oH@j@@}|@t@z@w@z@}L@|@@H@>@@R@"@@v@h0@Y@T@SP@I@C@@@7@7@5@7@,@0@@ @@ @E`@D@L`@K@Q@T@X@_@d@g@np@t@}@N@@@@@z@s@p@n8@{4@@@ @@T@.@@@@{@u@@@r@l@n@a@^@T`@S@f8@_@d0@a@]0@a@]p@T@h@o@l@l@n`@s@i@k@b@] @d@k @r@y4@w@l@~@n@@z@|`@t@v@d @k@jP@[@[@`@P@_@Y@T@V@Z@@[@^@c@o(@p@t@v@t@@@V@@@z@ @@{`@~@}@R@H@@@T@@s8@lp@d`@Z@@QP@M@H@@D@;@@6@:@1@+@1@@/@=@=@>@C@B@F@K`@N@U@@Y@^@d(@l0@q@y@@@@:@@h@@u@v@zP@l@@,@@{D@d@@~(@p@x@p@@@Z@ix@np@iH@Y@Up@j@]@i@k@s@W@Z@YP@X@@b8@r<@q@`@b@d@y$@$@d@^@a8@g@q@p@z@@|@}t@@8@xh@-@u@l@h@v8@m@fp@V@R@^@i@@^@W@^0@Q0@[p@u@y@o@t@x<@H@@@#@@@~@@}@@@0@}@|@}@@@z`@p@d@]@Vp@Q0@H@@C@A@7@:@5@4@@-@+@'@0@1@4@8@@:@A@@F@G@J@Q@W@\`@c@i@q@v(@}(@b@@}@~@H@@mp@wt@z @x8@@@@@@T@u@y@z@@(@vh@|(@v@`@X@`@\@h@j(@q@X0@\@a@d0@`@c`@e@Z @_p@V@^ @n@pL@aX@qx@q@@q@s@@y @0@h@y @@8@@@=@@||@|@@@g8@k@^@j@c@V@X@p@]@g0@y@dx@t@@@J@@*@@@8@D@@{t@@@|@y@u8@@@~@q@k8@fP@[@@T0@I@H@@B@@@7@6@@5@@2@3@*@,@1@-@3@@6@7@:@?@@ @B@H@Q@X@@^P@a@h@@n@v8@@$@@{T@x@4@|@y@@w@@@k@@h@P@@@{@@@ @~@lP@b8@q@k@k@b@f@c@lP@e(@g @b@`P@c@Y@Z@m@hx@^@cx@o@x@@@@0@ @s@@r@@@΀@@v@p@n@z|@m@@h@c@q@w@`@@P@Y@b@]@a@f8@i@@q@l@W@@x@@*@N@~\@@:@}@\@| @s @x,@T@D@r@f@b@^`@W@P@N@J@>@9@8@7@0@@-@*@&@$@)@2@/@2@1@6@8@@>@@A`@B@E@N@U@]p@aP@g@q\@{x@@V@{@u@sP@@@z@@@2@@@@@@d@\@@@@@@Z@a@Y`@f@ch@U@w@@x@z@d@o@cx@W@\@cP@qT@q@m@h@s@@@.@y@@*@z@@@@@@q@p@y8@s@o@j@@a@c@b@j@t@f@@e8@d8@d@s@r@h@@x@@@@@[@h@@@@@x@@}@@u@@@~@h@] @S@R@Q@M@@K`@D @@@7@@7@2@0@/@,@&@+@)@&@+@2@3@1@@0@@:@@;@@B@F @G @Q@Y@` @c@k@v@T@@@}@x@y@@@y@ @@@(@@@@B@@@@I@@m@v@f@[@T@@`@VP@y@q@xd@kp@l @q @e@f@b@n(@d@wp@{ @vH@ud@@@y@@@@@|@@4@J@q`@t,@d@@f@n@e@tT@s@u@p(@fH@p@q@x@up@qH@m@@@@@@J@@@@@@@@H@@t@v@y@z@@w@c@Y@@Q0@J@I@C@?@@@<@8@8@1@1@@,@,@+@'@.@*@+@0@0@0@5@@;@>@@D`@E@@I@N@Y0@ap@b@i@t@@@~@H@@ @@%@@@@@@h@L@@@@A@ŀ@@v@xh@k@w,@g(@^`@RP@]@p@_@n@mh@r@dH@q@ch@dh@]p@d@mh@x@d@tx@n@{@~@{@@@o@s @w@@p@iP@`@_@d@`@wX@r@n@q@f@n@o@s@q@p@yh@v@s@v0@u@~@@~@\@0@\@@@~@z@|D@}@y(@X@\@ @|@s$@a@@U@P@D@B@A@?@:@@7@5@@3@@3@*@&@,@*@%@'@)@1@2@7@9@9@;@B@@C@H@P@S@Z@b@i@o@uD@|(@@@*@@@@@@V@@@@@@@@@@W@@@@t@v@j@fP@\@^@S@Tp@`@h@^ @u @wp@vH@j@a@e@fP@x@}@v@sP@F@V@@p@p@c(@e@zx@v@t@q@a@\p@c@g@e@j@o@s@m`@f@t@m@y@s@v@j@l0@@@i@p@tX@{`@@@F@&@s@w4@r@x@@T@,@@u@cX@Y@Q@@L@E@B@8@:@0@7@@2@-@1@0@*@"@#@*@/@0@@1@1@9@@9@=@@@C @H@@M@@N@R@Y@_@hp@n@t@z4@v@@@.@&@@@<@@ @@9@@@i@@@V@@@@@wT@r`@j@@d@f@gh@W@`@Z@Z@\`@d@a@k@m(@c0@c@e@n(@n@v@vD@@@rL@n@j@`@`x@b@b@@h@c@n@m@n0@bp@^@f@k8@pp@o@e@mP@s @@o@r`@q@@x@e@j(@m@s@{@z@@N@wX@w@w @z@y@y@@@u@lp@\@Up@O@@E`@D@A @>@@9@9@2@1@-@-@-@+@&@)@$@.@1@2@4@9@:@=@@@A@E@@J@@Qp@S@Z @]@@d@k0@p@s@z@@@@~@@@@"@@̀@L@*@@z@@@@^@B@~@~<@w@s@n@b`@d8@e@eP@d@b@d@p@b@aX@a`@j`@`@gH@n@o8@h@e0@i@l@b@e@s@iP@f @i@h@b(@^@b0@`@^@j@i@[@i8@j@m@i@t@w8@@mh@qH@c@`@c@g@a@gP@s@xX@qD@q@z@@v@uT@x@t@~@@@~t@n@b@T @R@J@@@@@9@>@9@7@5@2@+@0@@+@.@#@(@@'@2@@3@@4@@4@5@@@A@=@D@K@P@V@X@^ @`@cp@g@n@u@{@F@@ @X@t@<@D@@E@X@{,@}4@{@@2@yd@@>@~H@y4@t|@p@n0@f@b@^@e@f@b@p@d@j@t@pt@p0@j(@nX@m@q@p@v@b@d@a@x@fP@f@h @k@oh@[@ch@e@mX@b@xP@bP@i@a@@k@xT@hX@y@|@r@r@d0@c@T @g@h0@pt@@o8@r4@h@g@p@|@w@o@r@H@~@@@q@d@Z@Pp@K@D@@@;@<@5@6@5@@1@2@1@0@&@)@@ @$@*@)@.@4@1@;@:@A`@A@F@@E@N@Sp@T`@X@Y@^@c@q @z@X@.@@@@{P@\@@@@l@x@q@}<@ @@y@{@{|@wT@u@pH@k@m(@f@c@c@c@o0@l@{@hX@f@a@op@q@g@^ @g@uT@a@g@^@c@j@s@f@`x@i@y@n@v@o@b@c@eX@[@^p@b@q$@q@o @s@x,@i@i@dh@e0@Z@b@\ @l@m@@ @p@n@h@fx@s@u@p@q@tp@@@@t@h@^@U@N@E@A@@@:@<@4@3@5@-@.@+@"@+@"@$@!@ @'@*@0@6@4@2@<@9@@@E @I@@J@I @P`@P@Q@Z @e0@n @wh@@(@@2@@ @[@@@}@z@@v@s@'@@u @rl@u@sP@p@l@f@e @a@]`@g@d@@pl@px@x@q@g@`@d@l@l@n@h@c@[@Zp@p@e8@i@j@\@Z@f0@d@j0@r@p@h@X@bX@ah@^@X@@p@t@g@o@h8@iP@x@^@`@c@ut@t@y@q,@vl@s@r\@p@t@q@t @uT@n@}@L@@v@j@`@V@P @G@E@B@@:@A@@6@3@3@1@0@%@1@@,@$@)@ @@@&@-@0@0@@1@4@8@@B`@A@@ @D`@D@E@A@L@SP@Y@@ax@k`@t$@|@@@@f@v@@@@y@y$@~l@w@m@@@s@mh@s`@x(@k@h@h@j@@bH@c@iP@cH@r@m@@qP@b@\0@p\@q@k@]@\@U @Y@m@k@i`@h@`@bp@`8@`@u@p@u@f@b@f@X@n@v\@j(@e@ox@m@W@Y@mX@n@@i@w@q @u@v@v@{@t@s@tD@}@t@r@s4@w@}`@N@@x@mX@bX@X@R@@J@F@@@=@@`@<@7@2@1@@/@1@&@'@#@&@/@$@&@"@%@+@1@2@4@2@@6@9@8@=@<@@@B@@@I@P@U@a@@i@q\@wh@|@@<@@@@ @@@@v$@x@r@J@}x@q@k@|@lX@k@c@b@_@`0@a@`@f@qt@l@l@@v@`@^0@h@U@bx@dX@e@j@n@v@p@a@ix@x@@o@m@i@p@wx@L@qD@z@h@z@v@@n@a@p@kh@`@f@n@r@j@ex@r@p@tT@o @r@v@y@h@e@h@~8@@@@.@s\@g(@[p@S@N@F@A@B@<@:@8@@5@6@6@3@/@+@(@&@$@&@@@%@%@1@3@1@@2@@0@@5@@1@:@@8@2@?@<@C`@F@K@S@^@c@gX@o@u@}X@z<@@B@@T@v@@@s@x@yd@>@~@l@h@t@j@l@h@eh@[@g8@`@e@e@p@r@p@n@np@p@f@`@_@b @eX@f8@^@c8@eh@e@mP@r@y@@s@l@h@t@w,@y@v@r(@f@w@u@h0@c0@c8@o`@Z@d@`@e@_@@a@b@d@h@d@r@n@d@gp@n@v@`@x<@@H@p$@g@`X@V`@P@I @C@=@@B@=@@6@8@4@.@/@-@%@&@@-@%@@ @#@ @*@-@+@/@1@.@0@@4@@5@8@2@6@9@A`@H`@O`@S0@U@[`@c@@h@kX@m8@r@vT@"@@Q@@@@@Z@@@@n@y$@j@h@e@r@t@qx@u@a @a0@g@e@i@p@w @qh@m@p@k@f @h@hp@Z@e(@_@a@`h@h @h@l@n@u@uH@r$@sX@u@u@v`@@vP@j@m@v@oH@l0@e@X@t @p@[@e@q@k@d@m@fp@c@r@l@q@k8@x@x@@z@@@r@i@aH@X@S@M@H@F@@A @>@9@5@6@4@@6@4@0@@%@+@)@'@%@#@"@#@@&@#@+@*@"@2@'@0@@2@@1@@3@3@@:@@@F@G@L@Q @V0@[@^@`p@a(@e@j@zL@@@#@@@@r@j@>@w@h@g@h@r@s@rp@j@l(@i@h@n @kX@s\@u@t@s@u`@r<@p@cX@c0@gX@e@c@b@s\@|,@q@h@@tX@s@t@k@i@z@@wP@~<@u|@t@hh@t(@x@@p@c@[@l@d@X@m@cH@`@c@h@\@f@q<@k@l@m@w@f@@@X@s@m@bh@\p@S@QP@J@G@C@A @B@;@:@@0@2@@0@0@.@,@&@&@$@)@#@#@!@)@(@@&@+@-@,@)@0@1@4@4@3@8@<@A@D@@I@L@S@R@S@Tp@V@[@ch@s@@@v@@f@4@@R@T@|@n@m@u@u@q4@e0@oh@m`@r@d@qH@o@@vT@k@p@m@q<@j@rX@j@o@q@o@w @g@s@xd@t@j@v@v@m@pd@m@ph@w@w@t@|@y@qX@q@g@q@hH@h@b0@[@iX@u@c@b@f@`@w@r@w@t@}|@x,@X@|@~@t@t(@j@ep@_@WP@P@@I@@F @C@@A@@@=@=@3@5@1@@+@3@'@*@'@#@'@"@,@#@&@%@'@(@(@%@'@&@$@$@)@-@5@5@5@=@@;@@B@G@J@H@F@G@I@L @SP@^@gP@u@ @@2@ @@N@@v@p@t@o@{@y@u@fh@k@lp@j@r@dP@a@gx@s@j@o0@n@v@u@s@l@o@t@k(@mX@r@t@q@o@rP@l8@m@rt@sT@x@{@v@ @@p@p@s4@s@{D@j(@l@p`@n@e @h@a@d@c@ph@s@wt@v@xt@|@{@@:@^@t@h@b(@ap@Y@T@N @D@B@>@@ @?@@:@:@5@/@3@*@(@0@'@%@!@ @@ @'@@#@ @@(@#@+@&@"@-@.@+@2@3@5@;@9@@@@B @A`@A@@C@@@`@A@J@R@V@\P@i(@v@|`@@|@@t@@@@&@P@@}@s,@n@r@e@`@e@k @l@e@p8@f@eH@n@s @n@e@@ip@p@n@k@oh@s@p @n`@n@q@l@kp@g@@v@v@t@t@tL@~ @z<@x@n@sx@l@mx@r@p@v0@s@jp@j@l@x@x@zD@|@v<@|,@>@J@@@q@f@`@T@S@T@Q`@E@B@>@@:@8@6@2@:@4@@.@.@.@*@(@&@!@#@!@%@%@%@)@@#@!@!@@ @#@&@)@,@-@3@1@@3@7@@<@8@>@;@>@>@A`@A@B@J@@J@Sp@^@l@s@xL@l@d@@@@@ @ @@@z@\@}|@y@x|@zx@r@o@d@e@aH@h@o8@n8@z@n@h@_`@r@k@mh@r\@j@@k`@nP@q@p@n@p@s|@o @p@o@t0@q@j@p@r@s@v@t|@z<@s@u`@up@r@t@d@R@@p@y$@@F@r@@z@q @d@]@@S@O@L@Q@L@F@@@9@8@7@@2@@2@@/@3@@.@+@+@0@'@$@"@$@ @'@@#@@@@@@&@#@#@"@'@'@-@0@4@1@3@5@4@@6@5@7@6@:@@`@A`@C@D`@M@R@c@j@k@q@z@@~@@@h@@D@H@x@~@w@wl@xt@x@u|@t`@s@j @lX@f@s@t<@pt@e@e@@i@k@sP@n @o@q@n@@t$@l@e@f@kp@m@t@tx@m@j@c@q@s@y@v@$@~(@|$@x@{p@@>@{@{@@w@@}@t@@@@z`@o@d@Z @Q@K@I@@F@N@L @B @@ @9@2@6@6@2@1@@/@0@0@@-@*@"@#@%@@%@"@@@@@@!@@!@@$@&@+@$@%@/@-@0@1@4@4@0@,@6@6@5@<@=@?@B@E@K @V@d@g@p|@rp@s@t@~@X@@8@h@8@|`@~`@~@| @z@w@vP@u@nx@q@@m@pH@l0@kp@jX@p@s@h8@vH@c@m`@j8@h@k@ip@h@b@v@q@o@d@r@z4@p@qT@r@u @s@s@w@z@x(@x@w@x@y@wt@y@@@@@@@x|@m@cx@X@S@@I@F@D@A @G@F@C@8@6@@4@3@@2@@2@.@)@/@0@@1@@)@%@"@%@&@!@ @"@@??@@@@#@!@&@$@$@%@-@.@,@1@0@1@2@0@@0@/@7@2@:@@9@@?@A@G@I@Y @ax@d@h@d@f@l@zH@@@@@Z@@ @y@{@z@}@}@y@V@u@u@w@@rD@hp@nX@i@p@k@j@n @j@b@g@a@l@q@@r@l@kh@q@q8@jX@m@@o@t@z@s@w@{@~H@|`@w@y@y@~\@|@~@b@@@&@sl@jx@`@X@@S @J@F@B@@?@<@C @F@B@@8@3@1@/@+@.@.@'@$@'@(@"@&@'@#@%@$@"@@@??@@@'@@'@&@)@'@,@(@'@+@(@,@.@0@@/@0@0@@2@@4@3@@;@>@@@A@@C@N@@T@Z@Z@YP@YP@_@o`@r@u@| @@@`@~@y0@z@y(@@~L@||@y@z@@sd@r@yT@tH@o@s@ph@r @kP@g@h@hp@j@t|@n@rX@p,@o@r @x@t|@r@l@o@@nx@mh@u@x@x@u@|@B@w@wt@x@@J@V@@w@r@f@[@T@@Q@J@G@B@A@@;@7@?@>@@@@8@@7@@,@'@,@,@%@$@'@*@#@&@ @+@%@'@@@@ ???@@ @$@@ @!@)@%@*@$@)@(@)@&@1@0@@(@.@,@3@@0@2@:@:@@=@B@@E`@F@P @O@M`@Qp@T`@U@`@b@p @v@w|@X@@@{H@@~@w<@x@uh@vh@x@yt@y@y@@v@z@}p@o@r@m@mP@l@l@k@vl@x@v@qT@s@p@k`@uL@lH@n@k@h@nH@mH@s@s<@z@}@uX@o@td@~@@@v@gX@b@^@Y@S@L@E@G @?@=@@<@1@9@@6@?@9@:@@4@.@-@)@"@$@/@ @@!@!@@%@@ @"@@??????@@@@"@@/@-@%@%@)@(@ @#@.@)@'@)@2@2@@*@5@0@5@A@=@C@B@F @B@E@@G@G@M @QP@U @X@[p@a@@r @}T@@}@V@y@{p@up@@|@p@v @s @v@u@v8@p@t@t@p8@e@k@l@i@mp@sh@x@r@u@z@q,@q@s\@tH@n@o @qt@o@x@x@yL@y@y@0@@}@v@pX@l8@V@P@Q@L@L@C@D@?@=@@>@8@9@6@4@=@8@9@@5@1@.@/@%@(@!@'@"@ @%@#@#@!@@@???????@@@#@!@&@*@'@'@!@%@(@&@&@+@&@0@@-@1@3@1@7@7@;@?@@@@=@@@A@E@B@B@F@F @I@M@R@V @]@h`@u(@x@(@P@@@r@tp@px@w@y@ux@mh@st@rl@q@t8@p@u@p@p@r@y @w@w@@@x@y@x<@|\@}@x0@zp@&@w4@y @r@@@@J@w@jh@e@r@p@Q@F`@A@C@D@@@:@8@@4@;@4@4@1@@1@8@6@4@0@@2@(@)@(@&@'@%@@ @$@ @#@ @@@???@??@@@@!@@"@$@%@'@$@ @+@&@)@-@*@3@+@4@1@0@@6@@9@@9@;@:@@;@@@<@=@?@@A@;@E@H`@PP@S @[@g0@op@wL@D@@@,@~@u@yp@v@}@{@{@x@@|@|<@up@{8@|@v@v@v,@z @|@|@ @x@}@@|0@T@@z@F@}8@@@@y@qp@d@[@W@Zp@e@S@@@:@7@6@;@,@6@7@3@@2@8@,@-@0@@5@1@2@)@)@&@#@"@%@$@@!@@@ @@@??????@@@$@ @"@(@ @"@&@'@%@#@#@@,@)@)@$@0@2@5@@3@8@5@@<@5@@;@;@=@>@:@;@@>@@A`@G@L@N`@S@W@^@@cX@h@r@z(@:@H@@@@D@p@@@vP@v(@v@u,@s@x@s@}@w@z|@nX@o(@w@s@}D@@@@@@@$@~@u@s@j@b(@Z@R@L@N@P@L@=@<@@5@@5@4@8@4@@3@@5@@1@@0@@'@0@@-@4@@.@/@0@@$@$@+@&@#@"@!@$@#@ @@@???????@@@@@"@ @#@+@#@(@-@!@)@%@-@)@(@/@-@-@3@2@1@3@4@8@8@@6@8@5@4@6@@A@B@@F@F@H@P@Rp@T@[P@b@g(@l@qt@u@{@(@@*@"@@,@t@vT@q@p@q@o @r@ux@{\@vl@p@s@}@j@@"@$@:@L@{@st@o@g@_@Z@Up@P@H@@D@@ @O`@?@=@5@5@4@5@3@1@,@1@,@'@0@$@2@-@.@0@2@(@#@$@#@@"@!@ @$@ @@????????@@"@(@"@@%@@&@,@%@%@#@'@*@&@-@&@/@0@/@-@0@@/@1@1@2@5@8@7@1@@6@9@@<@@`@B@C@B@E@K@O`@U`@Yp@[@a@b@h@r@t`@t8@xl@|@x@t@vL@sx@rX@u@w@x@v@yP@up@t@sL@t<@u @x<@x@w\@s@t@q4@g @bp@`H@S@R`@M@H@@B@=@@=@B@G@=@6@4@2@0@@,@/@(@(@-@#@/@%@-@1@@*@0@@)@&@*@$@ @'@"@ @@ @@??????@????@@@ @#@"@"@@@$@+@@ @(@!@,@.@2@/@/@)@1@@/@0@0@@3@3@2@3@5@6@5@8@@`@<@;@;@@@@A@@F@M@L@P@R@U@@_@fx@j8@i@n@q@l@kP@l @j@jp@l@o@p@pD@q@m@j@h@h@jp@p@o@oh@h@@g@d8@a@V@R @K @H@@B@<@;@<@=@@5@9@:@8@@5@-@-@,@1@-@0@@+@.@)@/@*@+@)@$@(@"@"@"@!@@%@!@@ @@ ????????@??@@"@$@#@#@&@&@@%@ @$@@*@(@(@&@-@1@/@.@.@+@*@/@(@3@@/@1@2@5@8@3@6@@5@5@>@@A@A`@A@A`@E`@K @N@V@[@\ @_@b@bH@`8@a@`@_@b(@a@d@d@e@h@cX@`@`@^@a@cp@cp@c@b@]0@Z@W@@P@G@C@?@;@:@4@4@@3@0@@4@3@/@1@,@(@.@(@%@0@&@)@.@$@)@@@$@'@(@#@'@#@#@ @!@%@??????????????@@"@#@!@%@@!@$@"@!@$@%@+@+@,@/@*@-@0@0@&@/@(@+@,@0@0@0@2@(@2@@5@5@6@8@<@@@ @<@@?@@@E@J @O@R @Q@T@X@VP@R`@W0@T@V@V`@Z@@[ @\@]@`@\@@Z@W0@S`@V@X@]@[@X@U@Q @N@K@@@`@C@;@7@7@7@1@/@4@.@.@*@,@)@.@,@$@)@"@$@#@&@ @!@$@@)@!@%@(@"@&@@ @!@?????????????@?@@@@&@%@#@!@&@$@(@'@%@#@(@&@"@'@'@)@+@(@,@'@)@,@*@1@/@/@.@5@2@@8@@3@4@8@8@9@;@@ @B@I@H @N@@M@P`@L@K@P@L@P@Q@S@S@Sp@T@V0@T`@O@O@N@H@R@@T@Q@S @Q@H@H@F @?@7@@=@4@@6@4@@5@@*@/@'@$@(@+@%@+@)@'@(@"@$@(@"@"@#@$@!@$@@ @"@@"@@"@@@???????????????@ @@ @@"@@"@!@%@@'@'@,@@"@"@@#@(@+@+@+@-@)@-@0@0@%@/@.@.@)@2@@4@1@3@6@:@<@@@@B@C@D@J@J@F`@F@I @C@@G@M@@J@H@M@M@@Q@K@J @I@F@F@E@K@K@K`@H`@D`@@@?@<@@5@@7@@4@5@3@0@0@0@@/@+@&@)@,@*@&@!@+@"@*@ @'@ @@$@#@!@@"@@ @@@??????????????@?@@@@"@ @%@"@$@$@!@ @%@&@!@(@!@'@'@*@&@!@0@+@0@"@/@,@1@,@)@.@.@-@1@4@+@2@@;@@<@@ @>@A@@C@C @?@@A@A@B@@@B@C@B@H@F @K@F@E@@A@A@@B @D@B @B@C@B @?@8@?@<@@6@.@8@4@@.@.@*@/@*@%@(@%@"@-@#@!@"@"@#@'@&@#@"@"@@@ @@@)@!@??????????????@@@@'@!@@ @ @"@"@#@"@!@@&@'@"@"@%@)@!@*@.@%@-@.@*@&@(@,@'@1@&@1@2@@5@4@<@8@<@6@:@<@<@A@<@9@9@?@@@=@A`@@@C@@<@@@=@<@8@4@<@9@?@@A@=@@7@,@6@1@0@@.@+@.@-@)@'@-@0@,@+@'@/@@@"@#@"@$@@#@@@#@!@@@@@ @?@?@????????????@@@@@#@#@$@@@ @(@#@$@ @%@!@+@%@(@@%@(@'@.@'@&@@)@'@.@"@.@0@1@0@*@8@4@7@;@9@5@5@@7@@3@8@3@@9@@7@@6@@9@@5@A @?@@>@7@@:@5@@9@4@@7@5@6@6@3@4@1@.@0@*@&@+@+@&@.@(@%@/@*@#@%@%@(@%@#@@@#@$@@"@@@#@@@ ????????????????????????@@@$@'@ @@@"@@!@#@&@ @%@%@(@#@*@%@$@$@%@&@&@*@(@'@%@*@,@1@,@,@6@3@1@,@1@5@@-@5@,@-@2@6@8@7@@8@4@6@8@5@@7@7@2@@3@@4@@2@6@@9@3@0@4@0@2@*@(@&@&@)@(@+@%@&@$@%@)@ @&@$@@&@"@@@ @$@@@ @@@????????????????????????@@@ @!@@!@@@$@ @!@@"@!@&@&@*@ @+@"@)@%@"@'@$@'@#@+@%@/@-@0@4@@2@/@*@1@0@0@@/@*@/@-@1@2@1@1@1@3@6@@3@2@1@2@@*@3@@(@0@@,@2@-@0@)@,@0@(@(@"@&@+@*@#@)@&@*@)@@!@"@@"@(@@!@ @ @ @ @@@??????????????????@@@#@#@#@ @"@(@ @#@ @!@@+@@!@"@$@%@'@'@$@@%@,@)@*@1@)@.@)@0@@-@)@)@0@.@)@(@&@-@0@+@,@0@@4@%@0@1@1@@4@@3@@'@*@0@0@1@-@0@@.@'@(@+@)@)@!@(@!@)@*@"@!@@@(@(@(@+@'@ @ @@@@!@ @@ ????????????????????????@@@@ @@@"@@#@$@"@"@ @ @@+@&@#@$@!@#@'@)@)@'@(@'@0@-@(@+@,@)@)@1@0@@'@'@.@)@,@!@+@1@*@.@.@*@/@*@/@#@'@&@)@)@+@.@,@&@*@$@!@*@*@!@*@$@!@@#@'@$@&@"@#@@"@$@@!@ @@!???????????????sunpy-0.8.3/sunpy/data/test/annotation_lyra.db0000644000175000001440000077600013203275053020652 0ustar nabil00000000000000SQLite format 3@ >>-% })iindexend_time_indexeventCREATE INDEX end_time_index ON event(end_time)A-qindexbegin_time_indexeventCREATE INDEX begin_time_index ON event(begin_time)1tableeventeventCREATE TABLE event=YtableeventeventCREATE TABLE event ( insertion_time INTEGER, begin_time NUMERIC, reference_time NUMERIC, end_time NUMERIC, eventType_id REFERENCES eventType(id) )OtableeventTypeeventTypeCREATE TABLE eventType ( id INTEGER PRIMARY KEY, type VARCHAR(256), definition TEXT ) vHtW!$ #7CalibrationCalibration campaign.4 [Temp > 50Temperature is over 50 degrees Celcius. -CadenceUnusual cadence.& #;ASIC reloadASIC is being reloaded.,MRecoveryRecovery phase after cover open. 9GlitchStrange VFC value, ...,%ECover 3 openThe cover of unit 3 is open.,%ECover 2 openThe cover of unit 2 is open.,%ECover 1 openThe cover of unit 1 is open.=/]Backup channel onOne of the backup channels is acquiring.&!=Vis LED onVisual LED is turned on.!5UV LED onUV LED is turned on. IIIIQ[QIQIQI bdQ[QC݆QCQCbKQӍQvQ$Q 0QӄQXQQJbQ|Q׳QQ QtQ Q Q !lQlQUAF Qv QdQ Q Q Q]QXAG^ Q QCQQQͰQ;Q_QkQwoQ3Q..$Q.9Q.E5 tfxj\@2$NXJ<. |n`RD6( Sp|Y SREMU3 S)hP S 1J R&Fc RQ@ R; Rx>7# R^l1 R>, R1' Q" Ka.- Kdt d O I N! Npт N < Mt MPzu MIn M5K} M< Nby LHt Lto L+ K8J7j Kug Kx  OW/ O4^ OgdV QM P$H PD PN? Pg; P>Պ* PL6 O2 O25}. O^ KM K9 S PM=\ Q,_' Q%a Q Q~DD QS1$ Q-N' ! Q FX5 tfxj\N2$@XJ<. |n`RD6( SpvY SRKGU3 S*IP. S3J RFc R]A R!< Rx<74 R^uD1 R@, R۸' QG" KaEC Kd e OA N! Np N 3 Mt Mr MKnE M6 N ~ M˗lz LLDu Lv&p L,>Zk KO7h K Kt\_ Oj% O4 OW9U PYk=N Py<"Z Q}uiE P1r@ Pi h5< P>,+ PO7 Ou(3 O5}/ O KM| KC\ I P1R Q|( Q'H Q)p Q~JD QS9k% Q-,' " Q@X  $>Xr0Jd~9Q3QwQQQ:Q3Q-AF= Qм;Q3Q-HQ-Q.<Q3Q..$Q.9Q.E=Q;Q_QkQwo>Q;QQQK?Q;Q-Q-Q-f@Q;Q.Q."{Q..BAQCQQQͰCQ]QXAG^ Q DQ]Q!Q!Q!(EQ]Q"1AI3Q,FQ]Q,QAQCF4F*QaQQQ+QaQ7sQ:pQ=m,QaQ5Q2Q/.Q}QYQЙQ/Q}Q~QSQ0Q}QdQQ .NND:0&Xblv*  4f\RH>pz$~tj`VL88.$ K| f K{? e K 2 d K b K a KP K K? K? Kn Kn K K K Kg@ K8 KQ w Km Kg Kg Ki Ki Kʼ j K8 i Kx h K g K Kp K { K z K y KU x K! K/ o K,= n K(} m K'o l K$ k Kq K Ka  K| ~ Kz } Ky | Ky KI t K s K r KE q K p KI KC K K) Ki K K'‰t K)ӊ u K) K* v K,er K,%\u K*do(B   K8 K7- K6 K6' K5ʇ K4; K4' K3V K2 K2(I K1V K0( K/WW K.  K-Ws M&Xl0:DNbv  H*4>R\fpzL8$.B`Vjt~ K<y KL KL{ KD]9 KD]9o KBh KD KD 0 KCFh KDK KD KDp KDN KD' KEL KDu KE-& KE-&q KE0M KEH KDN KE KEj KEjr KEN KE KEH KEc KErO KE KEs KEP KE KEB KFa< KFa<t KFQ KF@ KF KFER KF5 KF5u KGI KFJ KG KF_ KGR KGS KHO KH KHX KIi} KIiv KJ\U KJ$T KKG1 KKH KKƨ KLK KL KL/ KG KL KG# KM)  KL KM*~ KM* KMZK KM[ KMiA KM KM KMú K;xx K:+w K:v S:0&DNXlbv  *\RH>4fzp~tj`VLB8.$ K| f K e K : d K b K a K< K KH K KO K K Kg| Kt KH K w K K K KY= Kkv K j Kɮ i K h Kj g K 2 Kڬ K { K z K# y K x K#7 K1 o K- n K) m K' l K'o k Kq KM K  K} ~ K{ } Kz | K K t K s KO r K q K7 p K K K Ks K K[ K K) u K*I K*cj v K+o K<<y K;x K:w K:v K9J K8 K7ʥ K6X K6( K5 K4 K4(f K3W K2 K2( K1Wt K0) K/W K. K= t K-X)s K,r K= u I&0Xl:DNbv *R z4>H\fp$V8.BL`jt~ KL} KD KD͹o KDӻK KD KD]: KD1 KEBL KE KE-D KD KE0M KDl KEKap KEd KE KE-D KE(N KEH KEq KE` KE®O KE KE KEr KE4P KE KF]"s KE KFQ KF} KF@ KFR KFѼt KF KFaZ KGW KGou KG KF} KG KG S KHO0 KH KI KIh KFS KIi0 KIYv KJU KJ$KT KKW6 KKH1 KK KL KL1 KG KL5 KL KLm{ KLm KIi KM* KM[~ KM[ KMi} KM% KM KM^ KM^ KM* KMz(2( KM 2Lf6Tn,F`zQ+QQQ4QYQ%JQ'Q(5QYQ$QWQQ Q#hWQ̃wM6́AMR M6XQ̃wM7zM7AM7)YQ̃wM>~IM>M>ZQ̃wM>AM>M>[Q̃wMA!KAPKDMA8\Q̃wMAeDMAq MA|8_Q̃M6M6M6͟`Q̃M6 M7M7aQ̃M>fM>rM>~gbQ̃M>M>M>]cQ̃MA APEhMA!jdQ̃MAMMAYMAebeQ̃M6EM6@M6;fQ̃MF1MF6sMF;# z6Pj >Xr,F`AQPсPVQPCPLxPUQWQPт3PP XQP۬PP4[QPÈPʁPz\QP IA6 `P.Z]QPePlPs .Hb|2Lf$B\v/QͭQ0ABHQ e0QͭQ @AB Q N1QͭP$P\XP唘2QͭPkP(P`3QͭQ eaQ Q 4QͭQ NQ Q R5QͭQImQJlQKk 6QͭQ^ Q`Qc 7QͭQtQLQ 8QͭQQQͭQ`QaQb ?QͭQvOQ{Q @QͭQQQ> AQͭQ Q Q > BQͭQ 5ABSCQ d CQͭQ fQABu Q F aQεQcaAsYK`QfbQεQbJQeGQhDQQήQΰtQβEQQέQΰQγ-QUQQxQ I.QUQQQ 1QҏlNAӥ N2QҏlN AӧN M8tjlv`b  *4>HR\fpzX$.NBLVD:0~& KMx KMx KMx| Kam Ka4l K`ek K_ j K^i K[h KYag KVgf KO3; KO KN[ KNtZ KNiY KS KN4\ KT- KT-y KT7 KV2X= KU< KNϼ] KV? KVx> KV` KV`z KWa KWE@ KWG KWG{ KWGa KWHA KWJO KWJO| KWK KWLkB KWM KWM} KWO KWRC KWT KWT ~ KWXA KWY KWo KWfo KWp KW KW KXZ! KX2 KX2 KO.^ KZzK" K[0 KO@_ K]{D K]|v K]|v KPb KO{a KOLO` K`xE K` KS@d KRc Ka# Ka Ka Ka"9$ Ka"u Ka"u KT9~e Ka-% KMz Mv.tjbl`V  *4>HR\fpzLX$N8BD:0&~ KN2 K] Ka=n Kam Kaql K`f"k K_ Cj K^ i K[h KYag KP+ KP>/; KN[ KNtZ KNiPY KS KNp\ KT KTU KNf KV3= KU< KN] KVz.> KV~ KV~? KW KTy KWG% KWG%@ KWG KWJm KWJmA KWK KWM KWMB KWO; KWT' KWT'C KWY KW[/ KWp KWg# KWrc KW/ KW KWS} KW| KW{ KW0z KXZ/ KXZ! KWĉ~ KOj^ KZzi K[1 KO@_ K]|" K]|D KY KR/c KPb KOa KOL` Ka ? Ka ?E KS|d Ka Ka# Ka"W Ka"$ Ka. Ka.K% Ka9 Ka9& KVgf KT9e >>Xr0Jd~nQtQQgQoQtQQ)QpQtQVEAF QqQtQ#QQIrQtQQQsQtQQaQtQtQ!FAH Q"1uQtQ#@ Q#DQ#IDvQtQ$Q$sQ$wQtQ%aQ%Q%xQtQ'>^Q'CQ'IDyQtQ( Q(_Q(zQtQ)Q) Q)W{QtQ+&Q++Q+0|QtQ,Q,.Q,<4}QtQ,Q,~Q,L~QtQ-NQӄQXQQJQ|Q,.`Q,.~Q,. Q|Q׳QQ QtQ.-Q.*Q.' J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ Q- Q-< Q- Q-H Q. Q..$ Q.Ol Q.Ol2 Q.T( Q.- Q.Y Q.Я) Q0TR Q0b6 Q0&r Q1m|S Q1n7 Q2T Q28 Q4U Q49 Q4s Q5`V Q5b: Q6W Q6(; Q8#X Q8O< Q9ThY Q9Uw= Q:rZ Q:> Q;[ Q;? Q=G\ Q=H@ Q>7 Q>14 Q?8 Q?<5 Q@?6 Q@@29 Q@I0 Q@a>. Q@1 Q@/ Q@c; Q@c: QA;7` QA QNv< QP ? QP!= QQqj QQrL QRQ QRGk QR0 QRS, J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ Q-f Q. Q..B Q.E Q.O Q.O Q.,( Q. Q. Q.' Q. ) Q0!6 Q0"NR Q03.r Q1r,7 Q1svS Q2S8 Q2ĝT Q4{9 Q4U Q4s Q5e: Q5fV Q6; Q6W Q8< Q8 X Q9Y= Q9ZcY Q:@> Q:lZ Q;g? Q;[ Q=L@ Q=M\ Q>4 Q>7 Q?5 Q? 8 Q@@2 Q@a\0 Q@x. Q@91 Q@/ Q@ 9 Q@ā6 QA4: QA@C QAA1` QB.D QBZa QB2 QBb QCTE QCc QI{F QId QJG QJe QL1H QL2f QMI QM;g QN< QND> QP%@= QP&? QQvgL QQwj QR ; QRq0 QR, QSM1 QS/- Pz`F,v\BrX>$ jPPPPPPPPPPEQIQC޲QCQCTDQIQBQB]QB.CQIQA4QA@8@QIQ=HQ=JQ=L?QIQ;Q;Q;g>QIQ:Q:oQ:@=QIQ9UwQ9WHQ9Y<QIQ8OQ8 Q8;QIQ6(Q6Q6:QIQ5bQ5cQ5e9QIQ4Q4Q4{8QIQ2Q2Q2S7QIQ1nQ1p[Q1r,6QIQ0bQ03Q0!N(2Q'QBQBQB1QQSQS QSM0QQRQRʪQRq4-QQS/QS#QS/,QQRSQRQR4)QӍQ.ЯQ.Q. (QӍQ.TQ.r Q., 'QӍQ-NQ-=Q-, &QӍQ-AKo Q-Ŝ %QӍQ--Q-TQ-{ $QӍQ-Q-\Q- #QӍQ-o=Q-ttQ-y "QӍQ-WQ-]Q-b; PJ0v\B(6fffgQ[QM~AQM>QM;fQ[QL,QL/QL2eQ[QJQJQJdQ[QIQIQIcQ[QC݆QCQCbQ[QBQBQBaQ[QB`QB]QBZ`Q[QA;7QA>4QAA1R4\Q[Q=GQ=JQ=M[Q[Q;Q;Q;ZQ[Q:rQ:oQ:lYQ[Q9ThANU`Q9ZcXQ[Q8#Q8 Q8 WQ[Q6Q6Q6VQ[Q5`Q5cQ5fUQ[Q4Q4Q4TQ[Q2Q2Q2ĝSQ[Q1m|Q1pyQ1svRQ[Q0TQ0QQ0"NQQRQRQR2QS9w dOQIQXQX [QX ,NQIQVcQV4QVMQIQUfHR\fpz$.8BLV`jt~ QS/- QS9Yq QS9Yy QT l QUe.m QUf<M QVUn QVcN QX|o QXO QYX QYY{ QZ QZ| Q[ Q[} Q]L Q]M(~ Q^B Q^n Q_i Q_ Qa? Qa@ Qb Qb Qc Qc  Qe! Qe" Qe* Qe*= Qe3v QeKIt Qeuw Qe%u Qem Qem@ Qf. QfZ Qg2 Qg@ Qhg Qhh Qj} Qj~ QkH QkVx Qk Qk Qm Qm  Qnv Qnw Qo Qo& Qq" Qq0 QrjJ Qrkv Qsq Qs Qu  Qu  Qu{ Qu| Qy Qy: QzQT QzRb Q{{ Q{ Q|C Q|A J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ QS9wQ QSq QTl QUiM QUk(m QVN QVOn QX ,O QX vo QY]T{ QY^ QZ{| QZ Q[} Q\ Q]P~ Q]R Q^ Q^< Q_7 Q_c QaD_ QaE Qb Qb Qc Qc Qe&_ Qe' Qe*y QeKgv Qebt QeCw Qeu Qe Qe Qf Qf Qf( Qg Qg, Qi– Qi QjO Qj{ Qk,x Qkv Qk͚ Qk Qm$ Qm% Qn{ Qn| Qo Qo Qq Qq Qro QrpD Qs? Qsk Quf Qu Qx Qx Qy Qy QzV QzWN Q{+ Q{u Q|qA Q|C Q~IzB "T~dJ0v\B(rX>$ nTTT0QlQu QuQu/QlQsqQsnQsk.QlQrjJQrmGQrpD-QlQq"QqQq,QlQoQoQo+QlQnvQnyQn|*QlQmQm"Qm%)QlQkQkQk(QlQkHQk_Qkv'QlQj}Qj~Qj{&QlQhgQiQi%QlQg2Qg/Qg,$QlQf.Qf+Qf(#QlQe*=Qel(Qe"QlQe!Qe$Qe'!QlQcQcQc QlQbQbQbQlQa?QaBQaEQlQ_iQ_fQ_cQlQ^BQ^?Q^<QlQ]LQ]OQ]RQlQ[Q[Q\QlQZQZQZQlQYXQY[QY^QcQe*QelFQe QZQQQ8QZQ{Q{ZQ{+QZQzRbQzT3QzVQZQy:Qy QyQZQu|QvQxQZQu QuQufQZQsQsnQs?QZQrkvQrmGQro QZQq0QqQq PF,v\B(nT: jPPPPPPTQEQQQSQEQQėQhRQEQZ[Q`FQf1QQEQqQsoQu@PQEQ %Q Q OQEQPQ!QNQEQ~ QQMQEQ,Q.Q0LQEQۻQ݌Q]KQEQQeQ6JQEQ9lQ;=Q=IQEQEQQdR~4~EQQQQDQQIQUrQa9CQQQQ]BQQQQSAQQQQw@QQ_QkQwM?QQQ)Q5q>QQaQlQx=QQ?Q+Q6<QQ5QQ;QQYQ Q:QQw/QQ9QQ5SQAQL8Q}QemQeQf7QlQA_;Q44QlQ{{Q{xQ{u3QlQzQTQzTQQzWN2QlQyQy Qy1QlQu{QvQx J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ Q~EB Q Q Q QE Q8@ Q9l Qh Q Qڏ Qۻ Q+ Q, Q| Q~  Q$ QP Q Q % Q QG Q Q5S Q_ Qw/ QY. QYE Qpr Qq QYM QZ[ Q Q Q Q Qc Qe Q.H Q<F QF%I QGQG Q7 Qc QV QW Q Q# Q Q/ QDF QEr Q Q Q QM Q QY Q Q5 Q~/ Q~J Q Q Q= Q> Q Q Q Q Q+P Q,| QT Qb Q͟ J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ Q Q Q Q Q= Q>: Q6 Qb Q] Q Q0 Q1 Q Q Q Q Q  Q Q @ Q5q QL QwM Q Q Qw Q. Qu@ Qvl Qf1 Qg{ Qh Qǔ Q Q Qh Qi QF Q(H QG QI QX Q Q[[ Q\ Q Q Q Q QI QJ@ Q Q Q/E Qw Q QS Q Q$ Q Q/ Qb Q QBf QC Q Q Q Q Q0 Q1J Q QN Qm Qә v\>$ nT: jP6fvQEQCQQuQEQ8Q:RQ<#4rQEQ?/QAQBqQEQQQpQEQQQoQEQQwQSHQUnQEQsQDQmQEQ(QQlQEQX$QYQ[kQEQQXQ)4hQEQiQ:Q gQEQQQ˿fQEQqQrQteQEQ%Q'Q)pdQEQQМQmcQEQbQ3QbQEQ,|Q.MQ0aQEQQQ`QEQQQ_QEQ>Q@QBf^QEQQQb]QEQQQ\QEQErQGCQI[QEQ/Af~QZQEQ#QQYQEQWQYQ[[XQEQcAe#w`QX8UQEQeQfQh !^v\B(rX>fH.x^^^QaQp Qs QvQaQ$Q'Q*QaQ͟QМQәQaQTQQQNQaQ+PQ.MQ1JQaQQQQaQQQQaQ=Q@QCQaQQQQaQMAg6N Q$QaQQQQaQDFQGCQJ@QaQQQ QaQQQ QaQVQYQ\ QaQ7Ae#{ Q8QaQcQfQiQaQQQQaQQėQǔQaQYMQ`dQg{QaQprQsoQvlQaQGQV2QQaQQ QQaQ$Q!QQaQ|QQQaQ+Q.Q1~QaQڏQ݌Q}QaQhQeQb|QaQ8@Q;=Q>:{QaQQQzQSQAk Q yQSQAg6UQ xQSQQV2Qw J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ Q$ Q% Qp  Qq Q Q Q[ Qi Qi`M QjnK QN QL Qy Q Q Q3 Q Q? QI Qa Qd0 QdO QV! QX$ Q" Q( Qe# Qs QPi$ QQw Q% Q Q& Q Q>' Q?/ QR Q2P QRS Q~Q Q* Q Q7s+ Q8 Q5, QC Q߀ Q Q6 ` Q7 _ QjI QkG Qrr QsGs Q|U QSb Qd Q/p QZu QZ Q Q Q$< Q%J Q{? Q|M QƋ QǙ Q Q QhV QjT QʿW Q U J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ Q* Qt Qv Q˿ Q  Q  QU QnK QoXM QxL QN Q) Qs QJ Q] Q6 Qa9 Qx Q  Q Q0 Q[ Q\! Q Q" Q Q_# QU QVc$ Q Q% Q Q& QB QC' QP QR Q Q QLS Q Q* Q<# Q=m+ Q Q/, QN Qz Q;R _ Q<~ ` QoiG QpI Qs O QqU Qb QMd Qp Qs Qxr Qgu Qݠ Q Q( Q*6 Q QŁ9 Q; Q̅ Q"> Q# QmT QnV QīU QW QW rr(B\v,F`zQ7QQ}QNQ8Q߀Q}Qz_QWlQ7Q9Q;R`QWlQ6Q9Q<~aQk5K K K bQk6K K K dQk=K 2K 6K :eQk=K{?KcKfQk?K|K|K| gQmKK/KjhQmKxKKiQmK8KsKɮjQmKʼKaKkQmK$K&4K'olQmK'oK'K'mQmK(}K)"K)nQmK,=K,K-oQmK/K0fK1 pQmKKK7qQmKEKKrQmKKKOsQmKK.KtQmKIKţKuQmK)ӊAx# K)vQmK*K*4K*cj *\\fpz$.8BLV`jt~ Q% Q'>^ Q'?l Q( Q(* Q(A Q(Xq Q(l" Q(  Q( Q(ς Q)͓ Q) Q) Q)# Q*( Q*B Q*Z4 Q*l Q*T Q* Q* Q*ˤ Q*$ Q+& Q+' Q+p Q, Q, Q,.` Q,N Q"E Q#H Q#ID Q#d Q# Q$ Q$ Q%u Q% !b~dJ0v\B(nP6|bbbLQ O.MWO.SO.ZYKQ O-O-,O-JQ O+O+MO+IQ O*e>O*kO*r@HQ O)O)ɭO)ւGQ O)O)O)bFQ O)WQO)2EQ O)_O)O)aDQOMON+1ONmv CQO;AO< BQO)AWY O) AQOMOMOMY@QOLEOLFOLH>QO@O@jO@I=QO?zO?}O?<QO>O>#O>(n;QO<OHR\fpz$.8BLV`jt~ O%7 O; O O&c Ov|+ Ow Oǣ, O O- O Oj. Ok< OUX Oc= O | O  O O O O Oc O O? O O' O' O O< O% OQ OY OJl O OJ` OKB O O O O@ O>Zc O?E Od OF P[e PiG P%f P&H PzW P{Kg P8 PW3 P9 P34 P]v P] Pvh PwI Pi PJ P j P BK P j\k P kjL P l P M Pm PN Pcn PdO Po PP Pp PGQ PW`q PXnR Pr PS P P PJ O&0:DNXblv  *4>HR\fpz$.8BLV`jt~ O* O  O{, O|v+ Oq O͝, O O- On Op . O= OPX OJ Ov O:0 O;\ O O Oa O O= O' O( Ow O O  Oz OS O|  O Oz OOvB OP` O O O O OC(E ODTc OOF O{d P G PUe P*PH P+|f P{ Pu8 P3 PQ9 P4 P!g P{W Pov P{xI P|h P̟J Pi P K P j P o L P pVk P QM P }l PUN Pm Ph|O Pin PP Po P Q P p P\R P]Zq PVS Pr P} P O+1 O B!Z~dJ,v(nT6xZZZoQ&O3eA`O4G nQ&O3RO3UO3Y mQ&O3 O3-O3 lQ&O1A̞) O2 kQ&O1O1O>#O>)XQ O#O>0WO>= Q&O<_O<O< Q&O<^O<8mOHR\fpz$.8BLV`jt~ OvuQ Ovv. Oj G Oj% Ok0H Ok\& Om7XI Om8' OnJ On( OoK Oo) Oq*L Oq+* Or2 OrM Or OrP Os Os6, OsWVW OsWVh OrDN Or+ OsO OsC, Ou$\P Ou%j- Ow Owr Oy Oys Ozi OzjDt O{? O{ku O} k O} i O~\l O~]j O Ox O O'y OP@ OQlz O O{ O(l O( OF O O3m O3 OC OE| O O)} OC Oo~ O7 O8 O O O O O* O,* Ok O Oac O] O=d OiCg OiDe I&0:DNXblv  *4>HR\fpz$.8BLV`jt~ Ov{~Q OvzR. OjG Ok& Ok*H Om<&' Om=RI OnM( OnJ Ooޓ) Oo߿K Oq/`* Oq0L Orc Orn Os  Os6J OsM OrM OsWt2 OsW Or+ OsWN Os, OsO Ou) - Ou*VP Owyr Ow Oys Oy Ozmt Ozo O{ u O{9 O}5i O}k O~azj O~bl Ox O Oy O OUz OV: O6{ O Odl Oh O OQ OQ O OH| OI O} O O~ O= O<8 O= O_ O Oޥ O O/ O0 Om Oc O_] Od O;^ O Vv\>$ fL.x^D& pVVVVVVVVVVV'Q̃M@^M@dM@j&Q̃M@DM@EM@F%Q̃M>yM>$Q̃M>XM>M>#Q̃M>GM>NM>Uc"Q̃M=kM=M=!Q̃M91xM98M9> Q̃M7M7lM7)Q̃M6AMDM7:$Q̃M6M6M6gQ̃M5iM5j{M5k>Q̃M5I`M5OM5VQ̃M3cM3 M3hN4Q̃M,AKM,Q̃M*M*M*Q̃M&=M&6M&/R8Q̃M"UM"M"ίQ̃M" AH`M" Q̃M!M!lM!V Q̃MF1MF6MF;_  Q̃M@3APPMA  Q̃M>Z1M>dM>  Q̃M6iAM M73 Q̃M5_M5eM5k> 8Q̃MF1MF6sMF; >v\Br$ jP6bbbWQOsWVOsOsVQOgOgOh :UQOg.OgnOgTQO`lOaOaRSQOWOWOX"RQOWOWOXRQQOvuOvxOv{~PQOu$\Ou'YOu*VOQOsOsOsNQOrDOs/OsWMQOrAܡ; OrLQOq*Oq-Oq0KQOoOoOo߿JQOnOnOnIQOm7XOm:UOm=RHQOk0Ok-Ok*GQOj OjOj4DQOgOgOgCQOcOdOdBQObObObAQO`OaOb7@QO`^R\fpz$.8BLV`jt~ OWZ OWZ O O. OG OU O$n O% Ou Ov O O O O/ O O On O O O0 Oe O<_ Of O ` Oo O OB OCi O] Oxup Oo O5@ On O] Oj OQ O Og O6a Oh O6b OAa OAam O:f O:h O> z O>  O O OJt ODs OXr OM O[ O=u O> O O O O| O1 O2D O;w OSPu O}x O,vFFF<<2( OV OV O1  C&:0NDbXvl4  *R>H\fpz$.8BLV`jt~ O O O O OA O O*h O)< O{ Ozd O Oˊ O O&n O O OwW Oo OZe O_ O 7f O7` OA OA O[Gi O Ov; O'M Op O3n Ou OMo Oj OL O m OTg O a O60h OMb OW OWx O O:h O>( O>( O O OIs O Or ODt O OG OB% OCo Oj O O| O O2z OSnw Oju OJx Ov O OtZZP < O& b~dF,v\B(L2|bbbbbb{QBOOeO6zQBOQlOS=OUyQBO'OOxQBOOOf4fuQBO{kO{ObMOb>\ [QOaϝOa,Oa޻ ZQOa]Oaf4Oa YQOXפOYtOZD ~dF,nT:jP6ZZZZZZZR8QOI OIOJ.QO&O'O) V Q߸OMOlO΋~Q߸ONOOeOP }Q߸OCODOF|Q߯OܻOOI{Q߯OOᦦOmzQߦO+OO yQߦOOOOxQDOO)?OawQDOO%%O]euQDO> OvJOtQ2O OOsQ2OJA{OrQ2OŎOőOŔqQ2O=O@OCpQ2OAOoQ2OUOROOnQ2OJ-OM*OP'mQ2OOOlQ2OOOkQ2O9A:I O+jQ2OPOSOViQ2OxOuOrhQ2OO}OgQ2O"OOfQ2OsOwO|(eQ2O[:O_cOc P*HvlbXND:0&  4>R\fpz$.8BLV`jt~ OZ Oy Ou O  OJ OŎ O= O OU OJ- O O O9 OP Ox O O" Os O OE O O " O  O Oiw O1 O  Ou O$ O O O O O]  O O O[: Oș/ O$ O& OA OC OH OI  OM ON OL OM O΍ OΎ& Oσ Oτ O O OV OW Oڨ  Oک O5! Oa OJz" OK Oޛ# Oޜ O$ O O>% O?: O OB& O OO Oܻ O+ OU0 OU O6' Ob Oh O{( Q* lbXND:v0& >4HR\fpz$.8BLV`jt~ O O OŔ OC O OO OP' O O O+ OV Or O O O|( Oc Oc O O @ O! O Ooq O+ O O{ O* OL O7 O O O! OJ O Oc O Oa O]e OȚ/ O) O* OF OG OJ. OKx OP  OQT O΋ OΌ O OG O O O P O  O[ O\ Oڬ Oڮ O O/! OO* OPt" Oޠo Oޡ# O O$ OB OD% O Om O OI O  O& Os O0 O O0' O+ O Oy t~dJ0r6.ttttttZZZ@QOWZOHO:h>QOOyO @=QOOOcL4L:QO "OO!9QOEA5 OTNT4T5QeOWZOO4QeOAaOyO3QeOO O'M2QeOO?OwW1QeO3OsO0QeO(OhO/QTO]A>ˠOW-QTOBO\dOv;,QTO0AOA+QTOAO*QTOOO)QTOOO(QTOuOxO{'QTO$nO'kO*h&QTOGODOA%QTOOO$QTOOİO#QTO*O-O0"QTOOO!QTOOO QTO7O:O=QTOCO@O= x^\B(jP6^^^^^^^^^^^^^^^^^^dQ2O] O`Oc4aQ2OiwOltOoq`Q2O1O.O+_Q2O OO.]Q2O$O'O*fN4WQ2OOOVQ2O=uO@rOCoUQ2OMOJOG4RQ2OOOQQ2O:hO(PQ)OOO NQ)O:fO( MQ OA{EOJvRvIQ OOOjHQ O>O@TOB%GQ O[O,OEQ OOOCQOOO! f~d jP6fffffffffffffpQPP P oQPPPnQPcPfPimQPPPlQP P P }kQP j\P mYP pVjQP P P iQPPPhQPvPyP|gQP{KP6P!fQP%P(P+|eQP[PXPUdQOO~O{cQO>ZOAWODT$8$`QOJOMOPR8XQOUAOPWQPzP6P{ NJSQPPPVRQPXnPZ?P\QQPGP P PQPPPOQPdPfPh|NQPPPU S&0:DNXblv  *4>HR\fpz$.8BLV`jt~ P@ PH P P P PL P; PS) PtS PtS Pa Po P> P? P P P P P2 P3I P D P R P!ԉ P!՗ P#% P#& P$v P$x P% P%, P'E P'q P(jl P(k P)p P)~ P+ P+ P+d P+e6 P+n P+By P+ P+z P+f P+f P,c P,d P- P- P/+ P/9 P0Wq P0X P1 P1 P2 P2 P4J P4L P5, P5: P6T P6b P8>{ P8? P9 P9 P: P: P<2 P<3 P=7 P=c P= P=I P= P=U{ P>% P>=2| P>^\ P>^\ P>^ S&4>:0NDbXvl * fRH\pz.$B8VLj`~t Pt P=  P>=P P( Pj Pj PP Ptq P P P PC9 P[ P~ PD P P P6 P P  P8 P!: P > P#*a P!ڄ P${ P#+ P% P$| P' P% P(o: P'? P)  P(pf P+e P)j P PSG P+y P+` P+߬z P+ P+ P,Y P,h P+  P- P,i P/  P- P0\! P/ & P1H P0]k P2p P1 P4O P2 P5 P4P P6 P5& P8CI P6N P9q P8Du P: P9 P<6 P: P= P<8  P+e P+< P>{ P=s P>T| P=1 P>^z P P> P>^  ~dJ0v\B(jP6bbbbbbbb4(QO{OxOu'QO6O3O0&QOBAt`O%QO>OA OD$QOOO#QOޛOޞOޡ"QOJzOMwOPt!QO5O2O/ QOڨ Oګ OڮpV<QOLOlOΌQOMOOOQTQOHOIOKxQOAODOGQO$O'O*QOAt`Os QOkHR\fpz$.8BLV`jt~ P@% P@& PA| PA} PB PB PD PD " PEp PEqI PFE PFq PH PH PIz PI PI PI% PJ PJ PL PL, PMWF PMXT PNm PN{ PO PO PPN PPO? PPX PPpK PP PP' PPo PPo& PQJ PQK PR PR PS  PS7 PU>P PU?^ PVx PV PW{ PW PY7 PY8 PZ PZ P[ P[ P]+ P],E P^|^ P^}l P_͆ P_Δ Pa Pa Pbo Pbq Pb Pb5 Pb PbA Pc Pc' PcHe' PcHe Pc Pc( Pe# PfcK# Pfdw Pg$ P&0:DNXblv  *4>HR\fpz$.8BLV`jt~ P@+ P@*T P>X PAW PA PB~ PB PD# PD$ PEt PEv PF PF? PH: PH PI PI PI PJ.2% PJ PJ PL  PL  PM[ PM]@ PN PNg POE PO PPO PPpi PP PPE PPɵ PP PPӍ PQC& PQO PQP PR PR PS PS PUC PUDJ PV( PVr PW+ PWu PY PcH  PcH Pc' Pc Pe Pc Pfh PfiE# Pg@ Pg$ Zdv\B(|bH.tZZZZZZZZZZZZQP(kP(miP(o:QP'qP'BP'QP%,P%P%QP$xP$yP${QP#&P#(P#*aQP!՗Au P!: QP RP #P  QP3IP5P6 QPPP QPPP~ QP?PAhPC9QPoP@P8QP+fA 8n`P= <QbP>%P>1P>=PQbP=P=P=sQbP+P+uP+<QbP+nP+zP+`080|QXP>=2P>HP>T{QXP=UP>P>zQXP+P+P+߬yQXP+BP+ P+~4~vQP]P7PoNrQPPPqQPW`PZ]P]Z  b~dJ0z`F,jP6|bbbb6QP(jlP(miP(pf5QP'EP'BP'?4QP%P%P%3QP$vP$yP$|2QP#%P#(P#+1QP!ԉAuP!ڄ0QP DP AP >/QP2P5P8.QPPP-QPPP,QP>PAPD+QPaP^P[8(QP=A P>^z 'QP+dP+?P+ %QP@&P@(P@*T$QP>ՊP>[P>,#QP=cP=4P="QP<3P<4P<6!QP:P:P: QP9P9P9qQP8?P8AxP8CIQP6bP63P6QP5:P5 P5QP4LP4MP4OQP2P2P2pQP1P1wP1HQP0XP0ZPP0\!QP/9P/ P/ QP-P-P-QP,dP,fP,hQP+P+P+eQP)~P)OP)  T0v\B(rX>$ nTTTTTTTT'QPcHePcPc&QPPoPQ PQC%QPIPIPJ.2$QPgPgPg#QPfcKPffHPfiE4 QPb5Pc PcH QPboPbrPbuQPaPa!Pa$QP_͆P_ЃP_ӀQP^|^P^[P^XQP]+P].P]1QP[P[P[QPZPZPZQPY7PY:PY=QPW{PWxPWuQPVxPVuPVrQPU>PPUAMPUDJQPS PSPSQPRPRPRQPQJPQMPQPQPPO?PP*PPQPOA$`POJ4J QPLPLPL  QPJPJPJ QPIPIPIN4QPDPD!PD$QPBPBPBQPA|PAPAQPbPc>PcH P&0:DNXblv  *4>HR\fpz$.8BLV`jt~ PiV Pi5 PjVW PjW6 PkX Pk7 PlY Pl8 PnPZ PnQ?9 Po;[ Pog: Ppb\ Pp; PrC PrD Ps Ps Ps Psw Ps Psƒ Ps Pt` Pt% Pt% Pt` Pt> Pv7a Pv8,? Pv~T Pvb PvGy PvG Pw(c PwT@ PwHd PwV0 PwN{ PxO Px{ Pz*w Pz+ P{{ P{| P| P| P~ i P~E Poj Pp@F P<k PhG Pcl PH Pbm PcI Pn PJ Po PK P | P\U P\p PfZ. P}* P7/ P+ Pz P P ?~ P} PZq PhL PŰ P%r P&M Pt P* Ps K0&D:XNlbv *>H \4pzRf.$B8LV`jt~f P2q Pj[6 Pi V Pku7 Pj\W Pm8 PkX PnT9 PmY Po : PnV Z Pp0; Po5[ PrHX Pp\\ Ps; Ps¡ Ps Pt~ Pt PrI Pt% Pt  Ps Ps Pt> Pt%N Pv~ PveT Pt` Pvy Pv;? Pv<a Pw0 Pveb Pw{ Pw@ Pw"c Px Pw>d Pz/E PxI P{l Pz0q P|є P{ P~"E P| PsF P~$i P G Puj P1H P6k PgYI P]l PJ Phm P| P\ P}. PX* P/ P5+ Pn P U P~ P} PQoz P K P o P~ PL Pp P:M f~`F,v\B$ ffffffff_QPPPP~PPE^QPPXPPdPPpi]QwPc'Pc2Pc>\QwPbAPbPb[QwPP'PPPPɵZQwPPpKPP|PPlN4MQP>^\P>P>LQP+fP,!P,YJQP@%P@(P@+IQP>^P>[P>XHQP=IA P>^ GQP=7P=4P=1FQP<2P<5 P<8 EQP:P:P:DQP9P9P9CQP8>{P8AxP8DuBQP6TP6QP6NAQP5,P5)P5&@QP4JP4MP4P?QP2P2P2>QP1P1P1=QP0WqP0ZnP0]k<QP/+A J P/ &;QP-P-P-:QP,cP,fP,i9QP+e6P+!P+ 8QP+P+P+7QP)pP)mP)j PvB(>$ nT: jPPPPPPPPPPQPPNPP9PPӍ QPIzPIPI QPgPgoPg@QPfdwPffHPfhX~QPbqPbrPbt}QPaPa!Pa#]|QP_ΔP_eP_6{QP^}lP^=P^zQP],EP].P]/yQP[P[P[޿xQPZPZPZwQPY8PY:PY4*Rf\pz$.8BLV`jt~* P P|  Pe Pt PO P"E P4 PK u PLP PMG P8 P PV P8 Pv PQ PL9 P4 PH P( P P>w PLR PI PK Po P} P P? P1 P2 Pb Pp P P` Pְ P P P P P" P#6 P, PDC Pn P Pg Pg P Pv P P3 P_ PQ PR PV PY P]W P]W PiK Pi Pm Pq Pt Pt P P P Pw P7 P7 P P  P P P Pz P{  P P KD:N0&lbvXp  *4>HR\fz$.8BLV`jt~z P PR PJs P+ P P P PN P*t P P@c PO PUu P P5 PC P- PTP Pv Po P[W PE P, P PMQ P$w PS PU PG P P' PS P; P< P P PH P Pn Pڎ Pˎ P P P( P# PDa P[ P= P P  P P P PO P{ P" P$  PQ PY P]9 P]9 P]u Pii Pq% Pt Pt Pt P P P P PU P P P~ fF,nT: jfffffffffffffffJQqPPPIQqPcPePgYHQqPP`P1GQqPhP9P FQqPp@PrPsEQqP~P~ P~"hNP@QqPwTPw%Pw?QqPv8,Pv9Pv;>QqPtPtPt4;QqPpPp_Pp0:QqPogPo8Po 9QqPnQ?PnSPnT8QqPlPmPm7QqPkPkPku6QqPjWPjYPj[5QqPiPiPi h`p`0QVPwVPwPw/QMP7PP.QMPfZPr!P}4+QDPPnP5*QDP}PPX8 Vz`F,jP6x^DpVVVVVVVVVmQPbPePhlQPcP`P]kQPcQPw(Pw%Pw"bQPvAPveaQPv7Pv9Pv<`QPtPtPtR4\QPpbPp_Pp\[QPo;Po8Po5ZQPnPPnSPnV YQPlPmPmXQPkPkPkWQPjVPjYPj\VQPiPiPi UQzP\A!P TQzPv~A`Pve RQqPLPPQQqPPPMPQqPLPPSPTOQqPP PNQqPPPMQqP&A",P:LQqPhP7PKQqPPP  "^v\B(rX>$jP6x^^QPPP QP| PPH QPeA$ Po  QPL9PSP[W  QP4A#SPE  QPHP%P,  QP(PߗP  QPP6P QPMGPlP5 QP8P=PC QPPP- QPVPP QP8PPP$vQPP3PuQPK PPbPUtQPP P*sQPPPJrQP%A"TנP1qQPZPFP2pQP\A!`PoQPPP nQPPP M&0:DNXblv  *>4HR\fpz$.8BLV`jt~ P% P P1 Py Py P P PT P P P Pv Pղ P P PH Pt P P PZ P[ P P2 P P P PJ P PV P P2 P] P] P P P P P P P@W PA P P Pa  PaE Pe} Pi Ps Ps Px= Pxy P| P PI PI Pq P P P P} P} P P P( P)A P P PcB Pq P'%C P(Q! PlD Pm" PsE Ps Pʁ# PF P&0:DNXblv  *4>HR\fpz$.8BLV`jt~ P P PG P Pz P6 P P PO P P P Po P, Pv PN P P< P P P: P PU2 PZ Pņ P  P  Pf Pg P6 P P  P A P Pt P PP P P P{ P P} P P@ Pl P PK PL PN  PP P Pa' Pi Pn Pr Ps3 Px[ P P P+ Pg P P; P' P_ P P P/ P[ P P P4 P5 P~ P P P7B P3! Pi P4C `F,v\B(X>$ jjjjjjjjjN4SQFP"A&OP r4rPQ=PPqP/OQ=PPPPNQ=PAPG#PLMQ=PPaP4JQ=PPP IQ=P2PP6HQ=P[Pa'PfGQ=PPeP FQ=PtPPZEQ=PղPPDQ=PPPCQ=PPPNBQ=PP^P,z4z?Q=PPP(>Q=PP\P=Q=PpPP<Q=P2P71P;;Q=P?PP':Q=P}PPG9Q=PKPOdPS7Q4PIPP6Q4PsPuPx[4Q4PP`P |^,rXnT: ^^^^^^^^^^^^^^^3Q4PyA(ZVP<hN4-Q4PA$ P#,QPvP܍P+Q PPP'*Q PPnP)Q PiPl:Pn(Q PPPP'Q PPPt&Q PP҈PO%Q PPoP6JhJNJ4J Q PnPzvP=Q P,A&&`PDaQPPP;QP|P~PQPe}PgPiQP2PPQPVPPQP1PPQPA'PhN4QPPPQPDCPP P[   &@^x(B\v^QP˜PɑPЊ_QP'PP`QPdA7ZPraQPުtPޱmP޸fbQP5P.P'cQPLPSPZdQ"P'P_GPїeQ"P>;Pv{PѮfQ"PUoPэPgQ"PcP>PvGQœQkQmQoiIQœQjQmQpUQQ|QQqbQQSQQdQ QQʆQMpQ.zQ/QQrQ.|QrApmLQx sQ.|QsGApmLQuQ.}QZQ/QgQ+~QQQݠ ->f\RzpH$V.8BL>`jt~ Q N Q Q  Q Q~) Q Q QU Q Qb QKM Q4 QI Q Q Ql Q> Q Zg Q a Q > Q D6h Q [b Q d Qc Q e Q  Q @gm Q F Q e Q N Q R Q  Q ! Q  Q  Q7 Q8R Q Q Q Q9 Qڃ Q5 Q7E Q{ K&:0NDbXvl H 4*>R\pfz.$B8VLj`~t PLc Pl% PkG P]& P1H P' P I PT( PSJ Pűm) PŰAK P* PL PS+ PRM Pə+, PɘN P- PO P;z. P:NP P͘;/ P͗-Q P0 PܜR P:1 P> P9|S Pn P P'd P' P,/? P6T P0 P4 P>;e P>; PCc@ P,kU PG PL PUof PUo PсA PCV Pы Pѣ? Pͫ P Pcg Pc Pт3W P2 P۬X P"f P!: P' P} PĴ5 PÈ[ P!u6 P I\ Pg7 Pe] P8 P˜^ P S9 P'_ Pf: Pd` Pޫ; Pުta Pa< P5b ^v\B(fL2x^^^^^^^^^yQOPPPxQOP@WPG2PN wQOPPpPK4tQOPJA+6PsQOPPP ArQOPPPqQOPZPaEPgpQOPPtP oQOPHPPņnQOPTPP:mQOPP|PvlQOP%P"PkQOP{ A'`PhN4dQOPvP{PcQOP#6A&H`P bQOPPPaQOPbPP`QOP1P7OP<_QOPPPS^QOPoPP]QOPIPOsPU\QFPqPP [QFPx=PRPg ZQFPa PjPs3 YQFPA+6`P{ XQFPPP WQFPzA'LP P&:0NDbXvl > *4pHR\fz.$B8VLj`~t P'b Pɯ P# PzD P$ PGE Pxj% PF P& PyG P' P#H P`(( PI PŽ) ParJ Pw* Pž3K P_V+ PL Pɤ, P`M P- PɦN PG. PO Pͣ/ PH^P Pb0 PͥQ PF$1 PR P P P" PGnS P'%> P,M P4 P9 P&T P>Y? PC PL- PQ P>U PU@ Pт Pїd Pѣ] PѮe PѺ Pf P9 P PUQV PA Pvg Pr2 P W P. PX PՊ P/J PN5 PՌ  P-6 Pz[ Pr7 P.Z\ P^8 Ps] P9 PЊ^ Pq: P_ P޷:; Pr` P< P޸fa D:D:bNXlv  4*H>\Rpfz$8.LB`Vtj~D P⪰o P⩢ Pqp P䟬 Pc P䩢c P] P~d P^ P$# P$ P PLq PK P P樲! PM P?" PLt PK Pꑜ$ Pꐎ& P{% PO' P4 w P2 Px P PWy P+ PVz PU` Px{ Pwz Pg| PY P} Pk P Pue PF_ Pf P"` Pkl Pk Pl: PC~ P5 P# P P_ P^ Pr Pd P P P^ P] Pl P@ Q- Q Q^  Q\ Q Qn Q\ QN PJz`F,rX>$ jPPPPPPPPQP>;P@PCQP'P)P,MQPͫPrP9QPыPїPѣ]QPLPNPQQP4P7`P9QPP ,P"QPsPɑPɯQPPPQPѣ?PѯPѺQPGPJPL-QP0P2P4QPnA4F`PQjPPP~ QjPPP  QjP`PPn  QjPְP؟Pڎ  QjPP9Pˎ  Q`P}PٽP Q`PIP‰PQ`PsPUPQ`P]PTPQ`PPPU2Q`PyP7Podh~N~4~Q`PgPߧP4}QOPPP[|QOPPP_{QOPxyPRP+zQOPaEPjPr  ^z`F,rX>$ jP6x^^^^@QPCcPLxPU ?QP,/P5DP>Y >QPA4GP'% =QPMPSPYk<QPaP.P;QPޫPޱmP޷::QPfA7ZPq9QP SPP8QPPɑP^7QPgPlPr6QP!uA6 РP-5QPĴPʁPN42QPPPr1QP:P@WPF$0QPPPb/QP͘;P͞Pͣ.QP;zPAGPG-QPPP,QPə+PɞPɤ+QPSPYzP_V*QPA1*`Pw)QPűmPŷ:PŽ(QPTPZjP`('QPPP&QP]PP%QPlPrPxj$QPPP#QPʁPNP"QPmPs~Py<!QP(QP.P3 QPqP/PQPUoPkPт ZrX>$nT6x^D*tZZZZZ.QͭQQQc-QͭQ~GQNQU,QͭQQIQ~)+QͭQNQQ *QͭQnQQR)QͭQ\QcbQi(QͭQQQ !'QͭP@PPZ&QͭP]PdQPj%QͭPPP/$QͭPdPPȢ#QͭP^Pe2Pk"QͭPPP&S!QͭP5A=Pɒ QͭPl:A=`PQͭPP P'aQͭPYPPQͭPwzP~FPQͭPU`AHR\fpz$.8BLV`jt~ PZc P,o Pv P p P7 P P0c Pؠ] P d P|^ P# P$6 PX{q PY P唘 P< P涆! P P" PWt PX P$ PD& P% P' P?Iw P@ P x PT Py P PSz P P{ P P| P P&} P'a Pl# Pde P_ P@f P` P P P` Pf~ Pɒ P%' P&S Pj Pk Pv PȢ P  P/ Pi Pj PZ PZ Q  Q ! Qh Qi Q& QR Q  Q ( Qc QKk b.H:Tn(B\v3QҏmNNN* 4QҏmN NLN#{QҒOuOxO{mQҞQPQRQTnQҞQOQRQUoQҞK*dAʯ K+rQҞK,eK,K, sQҞK-WK-WK-X) tQҟ K'‰K2KK= uQҟK,%\A6m K= vQҟK:K:[K: wQҟK:+K:gK: xQҟK;xK;ɴK; yQҟKV`jt4 Q P- Q fQ Qs%i QIm Q~G Q) Q^  Q] Q Q Q` QH_ Q/ Q Q Q Q Qt Q Q0 Qg Q <a QvO Q ,h Q Q Db Q eam Q ea Q  Q @I Q @ Q N Q N( Q 5 Q  Q  Q v Q  Q, Q- Q Q Qq Q Q׳ Q+Q ..LjB\v0Jd~jQ̃M5k AMM6kQ̃M73AN M>ZOlQ̃M>yM?M@QmQ̃MA|AP'MF1nQ̃MF;AAQ* MGoQ̃M!M!M!*pQ̃M"M"ǘM"̓NtQ̃M&ٕM&M&uQ̃M*M*M*vQ̃M,uAK#M,h{Q̃M3M3M3|Q̃M5KM5PYM5T}Q̃M73M76M7:$~Q̃M7M7M7Q̃M93M98M9=Q̃M=M=M=1Q̃M>JM>NM>SQ̃M@aM@eDM@imQ̃M@M@NM@ Q̃MBHMBMMBR (\pf.zB$8tLj`V~\ Ogc OWS OWJ9 OXz OXפY OXy: OZ OZ; O\5 O\ < O]j]_ O]i1a O^` O^vb O` O`^0 O`? O`g O`H O` O`$ OW^ O`lT O`^<@ O` Oa>\ Oaϝ[ Oa]Z O`A Ob! ObB Od@" O`l Og.U OgL1 OcC Og. OgV OgD Ogf *\.fpz$B8LV`jt~\ Oh :V OZ\ OZ: OZDY OZ˒ OZ̾; O\ O\< O]m_ O]o+a O^&` O^pb O`! O`"? O`^^ O`f O` O`B O`ز O`@ O`0 OXRR Oa޻[ Oa Z Ob6d Ob7A Ob>\\ Ob! ObB Od" OdC Ogj Og Og1 OgD Ogjd Ogf OaRT OX"S OiHe OgU OiIg TVz`F(:x^D*pVVVVVVQq0KepKe|KeJQq0Ke*lKe63KeAQq0KdKdKdQq0Kd$KdKdQq0KbAUKd~Qq0KaQKa[xKae}Qq0KaEaKaK.KaP|Qq0Ka9Ka?vKaEC{Qq0Ka.-Ka3Ka9zQq0Ka"uKa(BKa.yQq0KaKaKa"WxQq0K]|vAbKawQq0KX2Ac`KZzivQq0KWT KWKXZ/uQq0KWMKWNKWO;tQq0KWJOKWKKWKsQq0KWGKWGCKWGrQq0KV`Aջ[KWqQq0KT-KTKTUN4mQq0KF5KGwKGlQq0KFa |bHtZZZZQTOOOQTOCOFOIQTOAB`OQQTOOOQTOP@OS=OV:QTOOOQTOOOv4vQTO{?O{HR\fpz$.8BLV`jt~ N5 N4 Nꇕ> N# NY? NzG@ N{ N{* N0 N0+ N0A N{ N{G NnB N, N NH N- N NI NT NJ N N#&$ N%~% NAC NB& ND N' NE N( OɎt OʺW Ou OR Ov OX Or OIw ON O6?J O`O OxK OY Okx OmZ Os\E Os\ Oj9 O7 O kF; Og: O lr8 O | O ] O } O ^ O S@~ O TN_ O O-` O Oa OQB ORnb O? O= O@ O> O9<J O:hG OK OGH L&:D0NXblv  *4>HR\fpz$.8BLV`jt~ N< N!U4 N"5 Nꍏ> Ng? N{3 N{# N{@ N/ N/* N07 N{+ N{A NMG N N, N N< N<- N N  N$p$ N&% N'B NMt& NNC NFH NI Nr' ND Nx( NE OdW O֐t OR Ou OX Ov OT O6]N OMJ Ox9O OK OZY Ow Oszr OwZ Oxx O O@7 Oi: Ol9 O w8 O xH; O ] O | O k^ O } O ^_ O `B~ O` O Oea O O^Db O_p O= O? O> O@ OF>G OGjJ OH OIK O)E OǐC Zv\B$fL2tZZZZZZZZZZZIQqMKdtKd7KdHQqMKdKdKdbGQqMKd+KdKdFQqMKb!Aؙ9KbEQqMK`xA<Ka ?DQqMK]{K]{K]|CQqMKWRKWSdKWT'BQqMKWLkKWM.KWMAQqMKWHKWIKWJm@QqMKWEKWFbKWG%?QqMKVKVKV~>QqMKVxKVykKVz.=QqMKV2XKV3KV3<QqMKUKUKU;QqMKO3KPKP>/hN41QqMKKGKKkKKH0QqMKD KGKIi.QqBKe,AfUKe -QqBKeAKeY[Kep ,QqBKdKe Ke* +QqBKdKd Kd: *QqBKdAzKdB )QqBKaeA؁Kb (QqBKaPKaQ KaQ7 'QqBKaE%KaERKaE H00:DNXblv  *4>HR\fpz$.8BLV`jt~ KdH Kd$ Kd$ Kd$ Kd4 KdtI Kd+ Kd Kd Kd, Ke Ke*l Ke*l KeA- KeYL Kep Kep Ke,. KeJ Kee Kee Kh+/ Kh:/ Kh:/ Kh:/ Khm  Khm  Kj>+ Kj>+ Kj>+ Kj Klj Kll Kll Kqqo Ks / Ks  Ks  Ks Kt) Kt) Kt+ Kt+ Kt+ Kt\ Kuo; Kup Kup Kup Ku Kv  Kv9 Kv= KwK KwK KwK KwK Kw5 Kw5 Kw  Kw  Kw  Kw)E Kw)E Kw)E Kw)E Kw)E Kw)E Kw+% Kw+% Kw9q Kw Q&0:DNXblvz*  >4HR\fp$.8BVL`jt~ Ko Kup Kup Ku Kt Kv9 Kv T Kv> Kw5 Kw Kw Kw Kw Kw$ Kw$ Kw$ Kw+% Kw+C Kw+C Kw+C Kw+C Kup Kw+C Kw9 Ku# Kw Kw Kx  Kx* Kx5 Kx5 Kx;$ Kx KxZ Kx;$ Kw K~x2 Kx K~r K~ K~ K Kb Kw+C K z KVb KC KC Kx K Kw K z Ko K K K: K: KP Kk\ Kx Kx K& K3* K7 KJ K> KOJ KU K` K@ K@ K* K> KA KA! K%+ Kf K K K K "X~dJ0z`F,v\B(rXXXQtKwKKwKwQtKj>+Kj>IKj>gQqbKcSKcV1KcX QqbKcAKcCKcE  QqbKc>:Kc?KcA(  Qq[KeeKeKf Qq[KepKeKe< Qq[Ke*lKebKe Qq[KdKe\KeTQq[Kd$KddKeQq[KbKb>Kc~Qq[KaQKaYKaQq[KaEaKa}KaQq[Ka9KaqKa)Qq[Ka.-KafmKaQq[Ka"uKaZKaQq[KaKaNKa=Qq[K]|vK]K]Qq[KX2KXrKY~Qq[KWT KWIKWĉ}Qq[KWMKWKWS|Qq[KWJOKWKW{Qq[KWGKWGKWzQq[KV`KVKW0yQq[KT-KTmKT4vQq[KIiKIKIYuQq[KF5KG7uKGotQq[KFaHRf\pz$.8BLV`t~ Kx) Kx) Kx* Kx* Kx5 Kx5 KxX Kxv KxD K~w K~ K~T K~  K~ K K K \ K \ K% K'd KVD K Kq K KQ KQ K K K K, K, K, K=N K$ K& K.\ K3  KE K>L KJ| KUb KUb KUb* KB K= K=! Kg| K>+ KZ KZ KZ KZ KZ K؄ K؄, K_" K` Kg| Kg|- Krb Krb Krb Krb K $ Krb# Ku Km K K MN&0:D*Xblv\  f4>HRpz$.8BLV`jt~ K1 Kiv K? KI, K K" Kt Kt Kt Kt Kt# Ka  K Kk K K  K KF Kz; K- Kܬ Kܬ$ K K KW Kױ Kױ% K K K K K"u K"u& K KdQ KdQ KdQ KdQ' K}. Kb KE K K K+M K1 Ke K K( K-/ K Kn K Kj) K0 K Kň; KŠN2 Kv< K3 KM KP KQ`T KΣ KH= Kڸ4 K> KP5 KN KQ KϋU K A KI KR KhG K? K@6 K8h@ ^z\B$ jP6fL.x^^^^^^WQtKx Kx Kx VQtKw9qKw9Kw9 UQtKv9Kv9Kv9 TQtKv Kv 6Kv T SQtKupKupKup RQtKt+Kt+4Kt+R 4OQtK%AgKCNQtK~K~K zMQtKxvKx9KxLQtKxXKxYQKxZKQtKx5Kx8TKx;$JQtKwKwLKwIQtKw)EKw*DKw+CHQtKw Kw"Kw$GQtKv=Kv=Kv>FQtKuKuKuEQtKuo;KuoKupDQtKt)Kt*qKt+4CQtKs /Ks Ks BQtKljKlkvKll9AQtKh+/KhL,Khm)8>QtK~TK~gK z =QtKw)EKw*DKw+C <QtKt\A9 Kup ;QtKt)Kt*qKt+4 :QtKsA뉠KsT 9QtKqqoKr?Ks 8QtKjKkKll9 7QtKh:/KhSKhm) 5QtKVDApKC j~dJ0z`,rXjjjjjj4QtKx)Kx/Kx53QtKw)EKw*DKw+C2QtKw Kw"Kw$1QtKwKKwKw0QtKj>+Kj>IKj>g/QtKh:/KhSKhm)FR:+QtKx*K{|=K~r*QtKw+%AꥠKx*)QtKw5Kw#-Kw+%(QtKupKvEKw5'QtKt+KtCKt\&QtKs Ks\fKs%QtKllKnKqq$QtKhm KieKj#QtKeeKfYKh:M!QtK'dK>KVb QtKx5Kx8TKx;$QtKw)EKw*DKw+CQtKw Kw"Kw$QtKwKKwKwQtKj>+Kj>IKj>gQtKh:/KhSKhm)QtKKKKQtK~ K~sK~QtKw)EKw*DKw+CQtKwKKwKwQtKKKbQtK~K~#K~QtKx)Kx/Kx5QtKw)EKw*DKw+C "X~dJ0z`F,v\B(rXXX{QxZKUbKlK`zQxSKOKKyQxSKK~KExQxSKדKױKwQxSKeKɰKvQxSKKKuQxSKmK4KtQxSKrbKsKtsQxSKZKהKrQxSKEKH3KJqQxSK>LK>jK>pQxSK.\K0K3*oQxLKKK+MnQxLK'KKmQxLKדKױKlQxLKKЩKWkQxLKeKɰKjQxLKuKHR\fpz$.8BVL`jt~ KؑD K`J Kp8 K`B Ky7K Kؑ: K؉'9 Ky7C KؑL Kأ+V Kأ+ Kv K xp K i Kj K K  K8: K[c Kr K[ K[ Kx Ks K'a K}Z KVY K]b KSm KS} KTy KUt Kb-c K\ K [ Kd K8n K8~ Kxe Kduz Keu Krf Ke] Kg K]^ K=h KM KM KQ.{ KRj Kvq L LF LP LP L; L1 L  L  L!Ny L!O L!\ L!a L!i L!A L"7 L"7 L"7 L"9 L"f L"f L"f L*i L* L*[ L+e4 L+!< L+ L+ P&0:DNXblv  *4>HR\fpz$.8BLV`j~t KiB KiJ Kw8 K؂C K؂K KؐM9 Kؘ: KؚaD KؚaL KأIO KV KJS K!p K8wi K8wv K K8X KO Kr Ka Ky Ky K K8 KVa KꅃY K{Z K[b K1s K1x Kp} KUm K+c K [ K\ K2d KNt KNy K]~ Ke Ken Kf Kc] K+g K[^ KC<h KNu KNz Kj Ktq Kt{ Kf Ld L; Lj LO L/ L L L~w L!O L! L!g L!_ L"-? L"8 L"9 L"f L"f L" L" L"J L"i L* L+!Z L+P: L+2 L+ L+ L+ #^vX>$ jP6fH.x^AQ{KQKK @Q{K K,K8h?Q{KBK K>Q{KRKK=Q{KΫKηKH<Q{KūKŷKv;Q{KqPK}Kň:Q{KؑKؕHKؘ9Q{K؉'K،KؐM8Q{KpA`Kw7Q{K8JKDKO6Q{KK yK@5Q{KK KP4Q{K*KKڸ3Q{KXKK2Q{KňKŔKŠN1QxKPKK0QxK1eKiK/QxKbKK-.QxKKK=K}-QxKg|KK,QxK؄KKI+QxK>KvK%*QxKUbKK)QxKKKj(QxKuA# K'QxK`KbqKdQ&QxKױKK"u%QxKKKױ$QxK AN Kܬ#QxKrbKsKt"QxK_AK!QxK=A KA QxK$KlK@Qx|KKKn LNz`Ff2xZ@"hNNNNNNQx|KKK Qx|KKK1 Qx|K`KbqKdQ Qx|KדKױK Qx|KuKHK Qx|KrbKsKt Qx|K`A`K? Qx|KZKהK Qx|K=A KA Qx|K&K>KU QxuKdAꟳ KQxuK`KbqKdQQxuKױKK"uQxuKKKױQxuKFK`dKz;QxuKrbKsKtQxuKg|AK QxuKZKהK QxuKBKK@ QxnK1eA `K QxnKbKTKQxnKK:KbQxnK؄KKa V8QxZK1eKKLbTQLt$LtLtSQLt,LtLtRQLtLtLt<QQLbd1LboLb{PQLb 9Lb,Lb7OQLtLt[Lu"NQLtLtcLt*MQLb{LbhLb/LQLb7LbCpLbO7KQQLQ|LQLQ? H:b&0XNDlv f \*4>HRpz$.8BL`Vtj~ LQ{W LO L-^ L-> L-l L- L- L- L- L3 L4n L4* L4d L4+ L4+ L3 L9= L91 L:a L9A L3" L=64 L=  L=e L= L> L> L=($ L>P L>m9 L>m L> L>Z L>O L=) LO' LO˜ LO  LP LP( LP( LP*0 LO5 LQ| LQ| Lb) Lb Lb 9 Lb7 Lbd1 Lb{ Lb Lb Lb Lb Lc Lc Lc Lc6 Lc6 Lkj Lj Lkf Lkj Lk Lk Lt Lt Lt Lt, Lt Lt$ ON0&:DXblv R\ *4>Hzfp$.8BLV`jt~ LQ| Lb L-\ L-< L-" L- L.n L- L4* L4 L4Y L4c L4I L-" L5G L9 L: L:. L4I L3@ L=e3 L=  L= L> L> L:AH L>mX L>m L> L>, L>x L>Ŵ L> L=) LO¶ LO& LP LP LP) L>Ŵ LO LPf LQ| LP) LQ? LP*N Lb7 LbO7 Lb{ Lb/ Lb Lb LbO LbO LcY Lc  Lc  LcT LcT Lde Li' Lj Lk Lk Lk LlN Lt< Lt Lt Lt* Lt Lu" Lu Lu Luj LuM Lu! Lvm Lv& bd,rX> jP6|bbbbbbbbdQKKdK2cQKb-KyK+bQK]KK[aQK'AKV4^QK]KK[]QKeKKc\QKKK[QK KK ZQK}KK{YQKVKnKꅃF4FVQ|0Kأ+KkKUQ|0KhKSKϋTQ|0KK KQ`SQ|!KA$`KJRQ|!KKKQQ|!K΢ZKKPQ|!KgKŤwKOQ|KJA2`KأI NQ|KΣK߳K MQ|KiXKť+K LQ|KؑKؕKؚaKQ|Ky7K}K؂JQ|K`Ke;KiIQ|KK K~GQ| KhK|Kh4DQ{KؑKؕKؚaCQ{Ky7K}K؂BQ{K`Ke;Ki XPv\^@"r>$ jPPPPPPPQ\LPL%L;QUL+e4L+|L+2QUL+!L-۽L-<QL+L,L,>ZQL"fL" L"JQL"7L"p)L"iQL LF7L~wQL*iA L L+QL!NyA| L"QLA>`LQL*A y L+ QL"9A`L"f QL!OL!L"8 QLFAk`L QxL"fL"~IL"(QpL"fA L*QpL"7L"8L"9 QpKMLLd QdL"7A L"f Q\L+L+L+ Q\L*[A vL+!Z Q\L!AL"L"-?Q\L!\L!tL!Q\L1LL/ J0&:DNXblv>  *4fHR\pz$.8BLV`jt~ Lu Lu Lu Lu/ Lu LvO L} L}  L}ϵ L}% L~ L~+ Lu L~MU LR L LE L? L L? L~MU L L% L' L L L L  L L L7[ L L;, LF! LG& L7[ L0 L4 L- L ' L9" L L2Q L^ LvI L L L1 L/ L . L ( L Y# L"a) L L#2 L9 Lh L* L$ L L L? LVy Ly% L}4+ L~3 L# L2 L5 Lw LE] L L~ LH OD:0&XNblv  *4>HR\fpz8$.~BL`Vjt~ L# L, L}C L} L~Ms L~Ms L~ L L L L}+ L Ld L L' L9 L9 LU L~+; L~B L+ L L7y L7y L Lw, L0 L! L& L&/0 L- LF L4 L2o LI Lvg L L" L L' L 1 L/ LH. LW L w( L## L#) LQ_ L? LI2 L w L L* LV Lc{ Lc{* L~% Lw$ L~+ L3 L LE{ LE{ Lf LMs Lf La LE{ La La L7k Lڛ L7k Lا L (B L!TY L}&C La L~RZ fX: bD*~dF( fLLLLLLLLLLLIQQL>L>IL>HQQL4+L5kL5GGQQL-L.6DL.nFQALQ{WLQ|LQ|DQAL>OAL>ŴCQAL=($Ag:L>BQAL9AA1 L:AHAQAL3A L4I@QAL-L-_L-"?QAL-lL-/L-<<Q9L=)AggL> ;Q9L3"A `L4I :Q9L-L-{L-" 9Q1L>ZL>L>Ŵ8Q1L>m9AL>,7Q1L:aAL:.rrR81Q)L+L,fL-0QL>L>L>x/QL>PA`L>mX.QL91L9bL:8+QL>mAsL>m*QL=L=lL>)QL=64ASlL=e3 "R~dF(fL.tZ@& lRR6QLYLe[Lq"5QLL!bL-)4Q\LA-`L 3QSL~LɶL2QSL#L\ LI1QSLLL 0QSLLL&//QKLLL .QKL L*LH -QKLLL ,QKL;LYLw +QBL}4L}L~*QBLA2  Lc{)QBL"aL#$L#(QBL L L w'QBL LUL&QBLGL L%Q9LyL|&L~ $Q9LA2 `Lw #Q9L YL L# "Q9L9LSlL !Q9LFA-?`L  Q1LLLQ(L#A0MLQ(LLR|L wQ(LLbLWQ(L7[A*LFQL?A2LVQLLLQL9LELQ_QL^LjLvgQLL&L2oQ LVyL\Lc{Q LLGL* Q&0:DNXblv  *>4HR\fpz$.8BLV`jt~ L5 L L L7M L7M LY LB LqZ LsC L@5[ LBD L?\ LB3E L] LHF L ^ LG L_ LR L+7 L5 LB$8 LY6 L{= L{H L{h L` LZ9 LZI LZS L홮> L홮i LpT L'a L*J L0bv L0bj LZb LK Le Lc LL L2d L˨M L L6s L L Lk Lm} Ly L{5w L{5 L L L%x L% L, L~ L% L L L_ L L  L LRl L\ L^`y L^` Mo M M` M M M2t M@ MB LC LY M:) J&0:DNXblv  4>*HR\fpz$.8BLV`jt~ Ld LM LM[ LKE LL\ LzF L뒈] L L7 L-)5 LY8 Lq"6 L|R LwG L^ Lx= L9 L\H LS L\_ L훎> L .i Ljh LI L0T L` Lj L0J L0a L[e LK Lb L/L L[c Lhs L L.v L. LxG} LyU L{S L{S Lw L LC LC Ls L~ L La L LL L L LJ L LRx L^~ L^~ L M M$ M MR M9Ht M9H Mg Mg MG  MH MLy Mp/o Mk M'p R~dJ0fLtZ@&lRRRRRRRRRRRRQ LhLtxL?Q LvILLQ L2QL>LI R8 QL7[LoLQL~MUL~L~QLRLpL QLLL QLELcL QwLA(d`L7yQwL%L/L9QwL}L~L~MsQoLA(`L7y 4}QoL} L~@L~Ms |QgL'L0qL9ZxQ_LuAZ L}+wQ!LL \L#vQ!LA(XL+uQ!L~L~tL~+;tQ!L}ϵL}|L}CsQLL L,rQL LLqQL~+L~6L~BpQL}%L}L}oQLuLuK*Luj x^B(nT: ^^^^^^^^^^^^^^^YQLLL!T2h2N24fTQLpLL0 SQLZL햓L RQLA;M L| lR8MQL˨LLLQLLL/KQLLLJQL*L-GL0IQLZL햓LHQL{L#L\GQLL|LwFQLHLaLzEQLB3LGLKDQLBLGLLCQLsA6! L}&BQLLL (\N\4v>QL홮L횞L훎=QL{L퇱LxV<9QLZL햓L8QLB$LMLY7QL+L L N0:&XDNlbv  4*>HRf\pz$.8BLVj`t~ Mf( M MXo Mpk Mp M l MAz MA MA MJ M, MK M M 1 M 1 M 0} M jb M g M $z M " M  M  M M) q M@|m M{r Mn M M M Mܲu M MiS Mf M Mj M  M + Mh M! M! M"U M"  M" M$ M$  M$7 M$9& M$E M$]? M$k M$7 M$o M$o M$o M%yP M%| M&= M&ٕ M* M* M, M,u M-J M-M M-` M-k? M-l M-l M.N M. M. M.h M0K M0 M3c M322( M5I` P&0:DNXblv  *4>HR\fpz$.8BLV`jt~ M_ Mܳ Mܳ MF M^ Ml Mz M 2 M 2 M t M u M e M . M / M M M M@q MX m Mr Mn M M Mu M M3j Ms Mt MN M\ M- MY Mr Mt M!* M!V M" M"̓ M"ί M$*D M$+p M$9D M$]] M$1 M$U M$ M$Í M$ M$ M%3 M% M%2 M& M&/ M* M* M, M, M-W5 M-XC M-` M-l M-l M-' M. M. M/ M/ M0 M0 M3 M3 M5T M5V M5_ M5k> M5k> M5۠/ M6; M6g fz,v\B(nT6fffffhQͭQ ,Q 8oQ D6gQͭQQQ ZfQͭPPyP@eQͭPuPPddQͭP~PEP cQͭP䩢PiP0bQͬQ DQ OQ [aQͬQ  Q FQCQ@WQ> Q TQ%Q:Q̃MFMF8MF 9Q̃MFMFMF 8Q̃MFMFPMF 7Q̃MFvQMF~MFO 6Q̃MF_MFgMFo 5Q̃MFHaMFPMFY_ 4Q̃M?kM?zM@M 3Q̃MF;AMFsMF2Q̃MA|MAMA1Q̃M>yM?M?T0Q̃M73M7kM72/Q̃M5k M5`M5۠4,Q̃M:9M:9M:: +Q̃MF/MF5MF<1*Q̃MBFEMBMMBS)Q̃M@APPlMA(Q̃M@7M@M@9 z\B(rX>$ nT:ppVzQMAAB'`MyQL^`A@NMLxQL%A>LRwQL{5LLvQL0bLhHL.uQMܲACi`MtQM2M&=M9HsQL6LOLhrQM{MMqQM) M4M@pQMM`M'oQMXMdhMp/nQ{MMKMmQ{M@|MLCMX lQ{M MM˗kQ{MpM{MjQL0bLhLiQL홮LL .hQL{L*Lj4eQLL=L[ dQL2L LcQLLL[bQLZL5LaQL'L, L0`QLLL_QLA;NNL\^QL LL]QLL닭L뒈\QL?LF\LL[QL@5LFLMZQLqA6L~R R:&0DNXblvR  *4>H\fpz$.8BLV`jt~ MF1 M5i M5k / M6 M6E M6 M5_ M6 M6́ M6  M7z M5k  M73 M730 M7 M7 M91x! M93 M:9, M=k" M= M>G# M>J M>X$ M6i M>f M>~I M> M>A M73 M>y1 M>y% M?k4 M@^' M@D& M@a M@7( M@ M@) M>Z1 MA  MA!K MAM MAeD M>y MA|2 MBFE* MBH MF/+ M@3 MF1 MF1 MF;A3 MA| MF: MF9 MF8 MFvQ7 MF_6 MFHa5 MG8 MG, MGG MGĊ9 MG4 MG# MH  MH9$ MHQ  MHdcH MHsc) MHscD MHw#I MI: MI- MIJ MI; MI|5 MI+ MI7TK MIBv% MF;A  ^z\B(rX>$ fL2x^^^^QL\L]L^~QL LoLQL_L:LQLA?- LLQL,LLQLLLCQLyLzL{SQLkLrzLyUQLLkL.QLLLQMMoM QMKM,M_ QLRlLXuL^~ QLLLC QLA=l`L{S QMhMmMrQM MM- QMMMN QMiSMnMs QMMM QM MM4QM,MEM^QMAMzMܳQMHR\fpz$.8BLV`jt~ M6͟ M6 M7 M7) M73 M7:$ M7:$ M720 M7 M7) M9= M9>! M::, M=1 M=" M>S M>Uc# M>ZO M>~g M> M>] M> M> M>$ M>% M?T1 M@F& M@M4 M@im M@j' M@  M@9( M@Q MA!j MA8 MAeb MA| MA MA) MA2 MBR MBS* MF1 MF; MF;# MF;_ MF<1+ MF9 MF8 MFO7 MFo6 MFY_5 MF3 MF: MG, MG&8 MG MGG MH 3# MH$ MHQ+$ MHh MHi1H MHs4 MHs9 MHI MHD MI - MI : MI) MI!J MIB MIZ% MIv MIv; MIz5 MKAK MKC 6 MKC < MKL 6||Pj $>Xr(v QMoA@`M$!QM`MYMR"QMM%zM9H#QM@MTMg$QM:)MA"MH%QMJMMܳ&QMMMlB*QM MM+QMAC2M,QMfMmMt-QMjMcM\.QM +MBMY/QMf(Mm!Mt0QL%LCLa 1QL{5LuL2QL%L;eLs3QL^`LL4QMAMMF6QMM*M3jQMH MHMH$QMHQ MH\MHhQMI+MI6MIB QMInMIrMIv#QMGMHlMH 3$QMH9MHEdMHQ+%QMIBvMIN=MIZ4)QMHscAR2?MI,QMGMGMG-QMIMIfMI .QMOMO.MOu PlbXND:0&vzpf\RH>4*  $.8BLV`t~j MKA< MKB MKBE MOvCY MO_X MOHRW MO1V MN/U MNT MN!S MMR MM1Q MLP MK%O MKN MKM MKTL MOq= MO. MP:> MPZ MP/ MRE8? MRG0 MS@ MS1 MS[ MTA MT2 MXp MXyo MX8n MXm MXHl MX2xk MXj MXhi MWh MWGg MWyf MWage MVGd MVc MVFb MVa MVJ` MV4v_ MV^ MUU] MT&\ M[  MJw6 M[ M[ M[ M[ M\ M\ M\ M\$, M^4C Mn Mng Mnv Mn,r MnYw Mnpws Mn Mn Mn M}Z MXx MB M0y M M Mz M t M9 { M[q L&0:DNXblv  *4>HR\fpz$.8BLV`jt~ MK̃M MK3N MKsO MMΟP MMOQ MMR MNS MN*T MO&U MO?V MOWpW MOoX MOu. MO= MOqY MP/ MP> MQ Z MRO0 MRP? MS31 MS_@ MS[ MT2 MT A MU E\ MU] MV#^ MV9D_ MVQ` MVda MVb MV4c MVd MWie MW}f MWg MWUh MX Fi MX!j MX;k MXRvl MX6m MXn MXgo MXp M[ M[ M[ M[ M\ M\ M\$, M\$, M\8 M\: M^pC Mn Mn,v MnD r Mnpw Mns Mn Mn" Mn" Mo0 M}\ M[x M Mly M, M z M$t MP{ Mhu Mr .Lf(B\v0Jd~/QMPMPMP0QMRGMRKMRO1QMSMS(MS32QMTMTMT4QMGAR.`MHs 5QMI|MIbMIz 6QMJwAR`MKC 8QMGMGMG&9QMGĊAR`MHs:QMIMIMI ;QMIMIIMIv<QMKAMKBIMKC =QMOqMOzMO>QMP:MP%MP?QMRE8MRKMRP@QMSMSMS_AQMTMTqMT CQM^4M^RM^p DQMHscMHMHEQMKBMK{.MKnGQMGMGMG HQMHdcMHfMHi1 IQMHw#MHMH JQMIMIKMI! KQMI7TMJMn Qb&0:DNXlv  *4>HR\fzp.$V8BL`jt~ M9 Mr M"? M#| M/_ M# M Mr MW Me Mg Mt  M| M Mt MW M ML M M9 Mm M M M M6 MF MV MV M MW M M M M# MW M5 M5 Ma Mx MO M. M Mר M M M  M) MA M# McY Mþ MP M McY M M M  M M  M M  M  M  MG MP? M  MQ Mӊ MӋ MӘ MӰ  Mܕ M MQ M= M ME M/ M8W M= M9 P&0:DNXblv  *4>HR\fpz$.8BLV`jt~ M2 M/}| M;5 M;5 MA Mu Mu Mk Mg M M  Mϒ M M M M M MbJ MW M M M s M0 M M M MW MW M M# M"{ M# M# ML My M ME ML M, M, M  M M( M MA! MX Mcw Mcw M Mþ: M< M M Me8 M# M M M~z M4 M ( M ( M} MG MQ MQ M' Mӌ MӰ* Mǚ M# M  M[ M[ M& M& MԆ M/ M9 M9 M֪? 2Lf6Pj $B\vQҟJKLKKLKLQҟJKL/KLKLQҟJKLKLrKL5QҟJKLKLKLmQҟJKM) KM)KM*QҟJKMZKKM[KM[ QҟJKMKMSKM% QҟJKMúKMČKM^ QҟJKMKNKN2 QҟJKKƨKKKK  QҟJKLKLKL1 QҟJKMiAKMi_KMi} QҟKKM*KMbKMQҟKKMxKN.KNfQҟxKK8K:QҟxK,K0Kk\QҟK \A_`KwQҟKQKf4KQҟK=NK[KxQҟKqKpKo QҟKADҠK: QҟKK߬KoQҟKK1KxQҟKQKKPQҟK,K.lKfQҟK,KfK&QҟKUbARK>QҠ4Kg|AaK 6Pj(B\v0Jd~_QҤZM$7M$M$`QҤ[M$EAIe`M$]]aQҤ[M$kM$M$UbQҤMMM$9DdQҤM$ M$%+M$*DeQҤM$oM$ƨM$fQҤM%|M%M%gQҤM$9&AI`M$Í hQҤM$M$$M$+piQҤM$7AI 3M$jQҤM%yPM%M%2kQҤM$oM$M%3lQҤM$oM) M-`nQҤM-MM-RM-W5qQҤM-`M-fM-l rQҤM-JM-QhM-XCsQҤM-k?M-lM-lvQҤM-lM-M-'wQҥM-lALYM5_xQҥM.M.M.yQҥM.hM/M/zQҥM0M0 M0{Qҥ M.NM.)M.|Qҥ M.M/M/}Qҥ M0KM0 &M0~Qҥ6M[M[QM[Qҥ6M[M\IM\Qҥ7M[M[M[Qҥ7M[M[M[ S&0:DNXblv  *4>HR\fpz$.8Bj`VLt~ Mr M~ MT Ms M~ M~  M M M M个 M~  Mr M3 M MS M MC M M" M'; M( M( M MH MH M礑 M礑 M M' M' MP M`! M# M M M`" M*8 M4 M4 M# Mv M M M  M| Mb M f M f Mp$ M) M3 M3 M6% Mӭ NV Na\ Na\ NѾ& N N) N N] N  N N N N'* N) N ( N' NU Na Na N+ N m N  N  N , N  N  N ˤ N  N - j#P~dF,rX>$ nT: PPrQlMn,Mn8FMnD pQMXMXMX oQMXyMXMXg nQMX8MXMX mQMXMXwMX6 lQMXHMXM?MXRv kQMX2xMX77MX; jQMXMXMX! iQMXhMXWMX F hQMWMWMWU gQMWGMWMW fQMWyMW{MW} eQMWagMWeMWi dQMVGMVMV cQMVMVMV4 bQMVFMVMV aQMVMV MVd `QMVJMVMMVQ _QMV4vMV6MV9D ^QMVMVMV# ]QMUUMU4MU \QMT&AU? `MU E [QMSMSLMS ZQMPMPMQ YQMOvCMOZMOq XQMO_MOgMOo WQMOHRMOOMOWp VQMO1MO8qMO? UQMN/AS MO& TQMNMN"MN* SQMN!MN MN RQMMMMMM QQMM1MMMMO PQMLMLMMΟ OQMK%MKLMKs S0&:DNXblv  *4>HR\fpz$.8BLV`jt~ M MT M~ Ms M}l M~ M~ M| M M丌 M^ MT M~ MQ Mֹ M݅ M5 M M% MM M"m M( M( M敁 M M MR M M M  M ! MP{ M M) M M" M* M3 M4j M4j# Mt Mu M M M~ M MD MD MD$ M)f M2N M3 M3% Mq NVv N_ Na> Na>& N N  N ' N N? N?( N Ns Ns) N N N* NU N` Naz Naz+ N O N 7 N  N , N  N R N  N w- N w3 #^rX>$ nT: jP6|^:QMAr`M#9QMcYAp2`Mþ:7QMܕM\M#6QMӘMӤcMӰ*5QM)M5ZMA!4QMMaM(3QMMM 2QMӰ MӻMǚ1QMAMLMX0QM MM/QvM#M\ME.QvMWMM-QvMM3M s,QvMM* MbJ+QvMWM3Mk*QeM5MM,)QeMMM#(QeMVMVMW'QeM6MM&QeMmM?M%QeMLMM$QeMeMM#QeMMMu"Q\MMtM# !Q\MVMVMW  Q\MM^M Q\M9M%M Q\MgMM Q\M#MLMu QTM.MM,QTMMM8QM#Ao\Z M QLMWMSM#QLMAkd`M0QLMAi MW #fz`F,v\B( jP6f#QM4jMlM"QMM'M`!QM M(IM` QM(M`MQMqMӏMӭ QMP{MPMP QN N N QN 7N N QN`N`NaQN_N`Na\QM2NM3M3QMtMM fQM3M3M4QM)MMQMMdM'QMAyo`M礑QM敁Ay MHQMQMM(QN N N  QN RN N ˤ QN ON N QNUN[Na  QNN^N  QNNN  QNN"N]  QNNN)  QNVvN[Na\ QM)fM.M3 QMuM/Mb QM*M/QM4 QMMZM QMMM' QMֹMM( QMDMM fQMRAy`M礑  "NrX>|bD*pV<"hNN]Q4McYMM\Q#MM¯Mr[Q#M^MMZQ#M|M}]M~ YQ#M}lM~/M~XQ#M8WM9M9WQ#MM M&VQ#MӊAtM[UQ#MP?MQMQTQ#M M eM (SQ#M M UMRQ#MPMMQQ#MM M<PQ#MרApcMcwOQ#MMMNQM丌MMr MQMsMxM~ LQMtMyM~ KQM/M4M9 JQMӋAtIM[ IQMGMLMQ HQMMM ( GQMArBM FQMþMyM EQMApLMcw DQMM̥MCQMEM!M&AQM~MVM个@QM~MyRMs?QM9Av5 Mt>QM=M#M/=QMQAt Mӌ<QM As`MG;QM MM4 N&0:DNXblv  *4>HR\fpz$.8BLV`jt~ N < N B NiJ Ne4 N= NC NZK NV: N٦2 N٦D N5 N0 N1?. N[1 Ns/ N}> N}E NEL N1 N N NB[ N  N@ NG N4N N(m N(A N(H N)iO N1; N1I N8|k N8|s N9 N90` N9H7Z N9ra N9[ N9o N9t N:\{ NA l NA u NJ5 NJ> NJ> NJw NK NKb NKJ\ NKc NK&] NL q NL w NL/3m NL/3x NLzQ} N]i N^d N^2?^ N^\e N^t_ N^~r N^~y N^(n N^(z N^E~ Nfv8 Nfv8 Ng Ng Ni Ni Npn Np Np4 NpѠ O&0:DNXblv  *4>HR\fzp$.8BLV`jt~ N B N 4 N J NG= NC N5 NK ND N: N82 NE Ni> NA0 N. ND1 N[/ N} N}L N Ns N N N @ N.G N NN N(OA N(H N(wO N(w N1I N1X; N7zs N7k N9t N9o N99` N90Z N9[a N9r[ N9 N9{ NA u NA l NJ4 NJ< NJ= NJ= NK w NKtq NKLb NK\ NK(c NK] NL i NL } NL]x NLm N]y N]ir N^Ad N^^ N^Ee N^\_ N^~~ N^~ N^Qz N^n Nf% Nf  NgN NgP Nh` NhbL Npm Npn| Npx6 Np Np t"V~dJ0z`F,nT6VVQMAy MH~QN AӂN }QNazAӁN m|QNAӀI`NU{QNsNDNzQN?NN yQN NNxQNa>AӀ>`NwQM3M%NVvQMDMM)uQM4jMBMvtQMA}#9 M*8sQM MM#rQM(M MqQMTAySE`MpQM~MEM oQMMMMnQMMMM"mQMMMClQM݅MMSkQMMM|jQMMMiQM"mM$M';hQM%MMgQM5MMfQ4MTMM3eQ4M~M߶BMdQ4M~M۷MTcQ4M9MqM֪?bQ4M=MN}MԆaQ4MQM҉M'`Q4M MEJM}_Q4M MF:M~z^Q4MM,Me8 Z~d0v\B(rXxZZZZZZZZZZZnQwN^Aӗ N^(mQwNLNL"|NL/3lQwNA AӐU4 NA kQwN7N7N8|iQnNL NUN]V8eQKN^EN^PN^\dQKN^AN^N^cQKNK(NKNKbQKNKLNKNKaQKN9[N9fN9r`QKN99N9%N90_QBN^\N^hTN^t^QBN^N^&xN^2?]QBNKNK_NK&\QBNKNKNKJ[QBN9rN9~MN9ZQBN90N9HR\fpz$.8BLV`jt~ N@ Nh N@ Np NqdX NqK NqK N{x N{x N N NG NF N^$ Np N) N) Nh NN NX Ny N= N N N N N% N% NNC N N* N# N N0 N< N= N N[ N N/7 NF NP NP Nj Nk7 N N N N N% N&  N& N& N) Nr^ Ns N N Nx N N( N# N0 Nz! N$ N N" NYK NZw N]) N~ N Nk N N< N N Nl NQ Ol&0:DNXbv  *4>HR\fpz$.8BLV`jt~ Nh Np Npt Np N{1A N{2 NwG Nx N  Nq NI N N/% NF Np Nh Nrj Ns NV NXg Nb? Ny N N N N NO N N N  N  N N N:+ N;9 N N1 N N= N N/ NPa NPa NQ NRA Nk Nm Nna N% N N&` N& N& Nf Ng N NB N N& NR N# Nx! NÆ N~$ N" N  NMu NN N]  N]e Ng N~q N NM Nx* Nx N NX NT |~dJ0z`F,jP6||bbbbbEQNN:rN}DQNAӄN٦CQNNNBQN N DN AQN(ON(N( @QN N_N >QNiN;&N} =QNGNN <QN N N  ;QN1XN1ÏN1:QNAӄNVp85QNNN4QN NANe3QN wN YN 2QN8NN٦1QNDNON[0QNANN/QzN[NgTNs.QzNN%xN1?-QN wN ON ,QN N N +QNazNN*QNNN')QNsNܳN(QN?NN 'QN NKN&QNa>N~NѾ%QM3MkM6$QMDM8Mp PvX:bH.tjPPPPPPPPQ6NsNN@Q6NxN8N) Q6NpAӜBNqK Q6NhbLAӚBNi Q6NgPAә޹Ng Q6Nf AәؠNfv8|ZVQN/%N:NFQNINNQNpNpNpѠQNpx6NpNpQ NFAӠԗ N^$Q NNNGQ NpтNpINpQ NpNpmNp4~QN^~N^N^E}QNL NLBNLzQ {QN9N9N:\zQN^QAӗ N^(yQN]N^;rN^~xQNL]NL!NL/3wQNK AӒ`NL uQNA AӐU NA tQN9AӎTb N9sQN7zN7N8|rQN]iN^<&N^~ qQNKtAӒ`NL oQN9AӎT N9 K&0:DNXbvl *4 >HR\fpz$.8BLV`jt~ N N y NV N N N& N( N@7' NA) NÝ NÞC N?e+ N N N> Ndž- N˄! NDŽ, N<* N N  N5` NL N? NV N  Nɮ NV0 N&o ND N' N< NE2 NȾ N NK N Nk* NlV N԰ NԱ NS NTP. Nد Nر/ Ns N0 NR4 NS~1 Nܗ Nܙ 2 Nܯ Nܰ?3 N N4 N:. N;Z5 N@( Na Nx Nߣj Nߺ N:6 NĔ) N Nj7 N4F N  N98 Nܚ N9 N9\/ N32 N:1 N~0 K&0:DNXlvb  4>*HR\fpz$.8BLV`j~t N N N N N( N& N4) N5' NÑA N NÒm N N4+ NyY- N3 Nyw NzI, N N2 N Nf N N5B NV NV NZ N̿ N N N>  N' N) Nн Nо N N N_T N` NԤ NԦ NGN. NH\ Nؤ/ Nإ; N0 N NF|1 NG N܌ 2 N܍ Nܣ=3 Nܤi N4 N N.X5 N/ N@ ) N@d6 NJ Nap Nߋ NߣL Nv3 NvF N7 NV N78 Nc N9 N N-1 N./ Ns12 Nt?0 N< ~dnT6x^D*pdddddd2Q NN:NP 0Q NXgN$N /QNRAN^Nj.QNNAN-QNNnN%4+QNPaNjN<(QNhAӣ*`NX'QNnaNyN&QN;9N;N<%QNN#pN/7$QNNN[#QNNN"QNb?NnNy!QN/N:NF QN=NNQNNRNQNyNvN=QXNhNNNQXNpNq,NqdXQGNrjNN@QGN AӠ^NhQGNwGNЄN)QGNptAӜBNqKQGNpmNpNpQGNh`AӚBNiQGNgNAәތNgQGNf%AәNfv8Q>NqAӠɋNh Q>Npn|Np9Np bv\B(jP6fL|bbbbbbbbUQŻNXNNTQŻNNNSNYK4QQŻNBNNPQŻNgNm Nr^N2LQŢN> NA NDKQŢN3N9>N>IQřNN)N5`HQřNNNGQřNNNkFQřNgNrN~EQőN5BNA NLDQőNfN-N CQőNMNNBQőN~qN8NAQ/NkAӪRA`N& @Q'N&N^N)?Q'NPaNN=Q'NNNNC<QN&`AӪiN&;QNmNyVN:QNQN^bNk79QN1NNP8QN:+N;N=7QNN_N06QNONN%5QNVNpN4Q N%AӪiN& 3Q NAӪ5L N% 6f~dJ0z`F,nTfffffQ~NVNҳNQ~N/N4N:.Q~NNLNQ~N܍NܒlNܗQ~NGNLNR4Q~NNNsQ~Nإ;NتNدQ~NH\NMNSQuNNkNQuN{AӻNQuNVNKYN@(QfNN GN QfNJNN QfN0N0(N07 QfN{NUN/ QfNܤiNܩNܯ Q]NNN< Q]NߋNߗNߣjQ]NJNUNaQUNߣLN߯NߺQUNapNm7Nx4QNNNx QNVN͎N QNxNNQQNNBNQNԤNԫcNԱ~QN_TNeNlV}QNN N|QNнNÇN{QN'N6}NE2zQNN!N' M&0:DNXblv  *4>HR\fpz$.8BLV`jt~ O lD O B O*<L O*I OM Og O OElO OFQ OP OCR Oj O# O-k O. ODS OF O!NUl O!N O"m O" O#=n O#i O%,o O%-I O&qp O&r O' O'Ίq O'϶ O(xX O( O) O)a O)=N O) ) O)< O)S O)Xi O)~a O) O): O)2 O) O)& O)b O)F O)ւ O*  O*p O*r@ O+ O+ O, O- O- O.Y O.ZY O/  O/ O/8 O0 O0 O1c O1 O1c O2Xy O2Y O2 O3 O3Y O3 O3Q O4G O4X O4lf O4 O&0:DNXblv  *4>HR\fpz$.8BLV`jt~ OeL OD O NB OC OrA O*xM O*xN O Og O9Q O:O OAR OmP O! O/j O! O"k O9 O:S OYl OZ  O!W O!Xm O#g O#ēn O% G O%!so O&e O&gp O' O'³ O'q O') O(| O(J O)_ O) m O) O)[ O)$ O) O*fL O+ O+ O, O- O- O.MW O.Ne O/ O/~b O/~b O0 O0 O1å O1 O1 O2L O2M O3  O3R O3e O3O O3] O4NG O4kX O4 P~dz`F(rT: jPPPPPPPPPPPyQNZNENV0xQN2N9>N?vQNNONuQNÑAN×NÞC4rQNNcNqQNTNNVpQNNNloQN]eAӮ N<nQNMuNSNZw0NJ4jQNNNiQNfNm'NshQNNcNV gQN] AӮ N fQŻNN$N yeQŻNԦNԫcN԰dQŻN`NeNk*cQŻNNNKbQŻNоNiNȾaQŻN)N2N<`QŻNN!N&o_QŻN̿NYNɮ^QŻNywN~N˄!4[QŻNNONZQŻNÒmN×NÝ4WQŻNNENVQŻNbNN  MNXblvD:0&  *4>HR\fpz$.8BLV`jt~ O@1 O? O>= O< O(n O>) O? O?$ O@I O@u OB"S OB$V OChU OCi.W OLH OLI OMY OM OM T ON p ON! ONLL ONc ONm ONmv ON ON ON%3 OP<\ OP=4 OQ OQ(5 ORލ OR6 OT/Y OT0[ OWC] OWCVZ OWCV\ OW OWCVX OWE OW/ LblvXND:0  *4H>R\&fpz$.8LBV`jt~ O@ȃ O?2 O># O<_ O<^ O;~ O7 O7 O7K O68 O4H O4. O4Z O56 O5N9 O5e O5} O6!) O64 O65 O7 O7 O7 O7% O;z  O;{ O; O;R O; O;^ O; O;: O<T O< O< O<b O< O< O> O> O?y O?z O@_ O@ OB{V OBS OCbW OCcU OLC OLE OM OM OM OMF OM ON R ON4 ONL. ONmXX ONmX ON+3 ON9 OP74 OP8 OQ.5 OQ< OR6 OR OT+[ OT,Y OT\ OTZ OT] OW OW OWR ^v>$ nT:|bH.x^^^^^^^^ QͭpQQQ QͭpQ]Q,Q QͭpQ)QQQͭpQ\QQ QͭpQQQ&QͭpQ^ QcbQhQͭpQ-QQ QͭpPlPcPZQͭpP^PdBPiQͭpPPrP QͭpPrPPvQͭpP_Pe2PjQͭpP#PP%'~QͭpPCA= Pf}QͭpPP P&|QͭpPgPP{QͭpPxP~FPzQͭpPVAP oQͭpP⪰PnP,mQͭgQ eaQ Q @glQͭgPkA?/Q8iQͭ Qs%QxMQ}u P~J0rX>$ nT: jPPPPPPP@QɏNzGN{N{?QɏNYN`Ng>QɏNꇕNꊒNꍏ<QɏNNsNd4d9QɏNNEN8QɏN7NN97QɏNNҕNj6QɏN@dN߂ON:5QɏN.XN4N;Z4QɏNNLN3QɏNܣ=NܩNܰ?2QɏN܌ NܒNܙ 1QɏNF|NLNS~0QɏNNN/QɏNؤNتNر.QɏNGNNMNTP-QɆNNN< ,QɆNN?N +QɆN0NVN{ *QɆN{NUN/ )QɆN@ N߂ONĔ (Q~NAӼNx'Q~NAӼiG Nr&Q~NBNHNMt%Q~N%~N&#N&$Q~N#&N#N$p#Q~NNVN{!Q~NNsN4Q~NNENܚQ~NcNN   lv\B(ntZ@llllllRRRR&bQIORnOXYO^DaQIOOzOe`QIO-AíO_QIO TNO YO ^^QIO O O k]QIO O UO 4ZQIOmOr]OwYQIOOOZXQIOOhOWQIOʺOOd6<TQ@NAӾ&`OSQ0O:O?cODRQ0OOCO8OQ'O`OlrOx9NQ'OO*O6]4KQOxA OJQO6?OBOMIQɠNNT^NHQɠNNRNFGQɠN{N NMFQɠNvNN4EQɏNAӼ`NDQɏNAӼiG NCQɏNANHNNBQɏNnNN'AQɏN0NV>N{ =\ 4 *>HRfpzB$.8LV`jt~B K1e K. KF K K% K Ke Ke Kד K Kד Kz Kד Kױ Kױ& Kד K` K` K`' K Kb/ Ku( K K K' KO K K` Kb K1e0 Kd K K K) KP1 K1e KgP KiXM KqP; Kň2 Kū< KX3 KP KT K΢ZQ KΣN KΫ= K*4 KR> K5 K KhU KR KQA KI KS KJO KB? K6 K @ KhG +HR\fpzH$.8BLV`jt~ Ke. KdR Kdb KdbH Kd KdI KdB* Kd Ke Ke* Kd:+ KeA KeT Ke*, Keu KeJ Ke Kep- KeJ Kf Ke< Kh:M Khm) Khm) Khm) Khm) Kh݋ Kj>g Kj>g Kj>g Kj Kll9 Kll9 Klܛ Kqq Ks  Ks  Ks~5 Ks Kt+4 KsT Kt+4 Kt+R >Tz`v\B($ nTTTTTTT=QqKaKaKa<QqKaKaKaS;QqKa KaHKaȃ:QqKaKaKa9QqKWKWKW8QqKWpKWqKWrc7QqKWYKWZlKW[/6QqKHKHKI5QqKGRKH AKHO0,h,N40QmK9K9K9J /QmK8K8K8 .QmK7-K7iK7ʥ -QmK6K6K6X ,QmK6'K6'K6( +QmK5ʇK5K5 *QmK4;K4wK4 )QmK4'K4(*K4(f (QmK3VK3VK3W 'QmK2K2K2 &QmK2(IK2(K2( %QmK1VK1W8K1Wt $QmK0(K0(K0) #QmK/WWK/WK/W "QmK. K.FK. 4QmKCKaK QmKqKqKq QmKAE K 2 QmKpKڎKڬ QmKK1KO QmKKK +Rfzpjt8.$`VLB\~R Kd* Kb Ka.- Ka=in Ka9m& Ka9 Ka9 KaE%' KaEa KaEa KaP( Ka Ka Ka Ka Kb Kb Kb Ka Kb!F Kbk Kbd KbF~ Kb*] Kb Kb Kb~ Kbu^ KaQ KaQ KcS KcA Kc>: Kd+G Kae) KdZ KdS Kd5 Kd Kb Kdl Kd}7 Kda )fVpz$LB8.f`j~t Kb) KaP Ka Ka Ka) Ka Ka Ka= Ka KaS Kaȃ Ka Kbw Kb Kb; Kb Kbnt Kbi KbH KbDD Kb\ Kb Kb KbD KaE' KbF Kc~ KcX KcE KcA( Kae KdG Kd]u KdX Kd7 Kd3E KaQ7( Kd: Kd Kdz Kd xJ0j2^D* RRRRRRRRRRRRRxxhxNxQZOQBOXYO_pQZOOOQZOAíO~QZO S@O YO `B}QZO O 4O |QZO O UO LN~4~xQZOkOr]OxwQZOIAOvQZOOhOuQZOOCOtQZOɎOO֐drQROA1 Osz qQIO'AM O'ΊpQIO&gO&lUO&qoQIO%!sO%&O%,nQIO#ēO#O#=mQIO!XA O"lQIOYAO!NUkQIO"O(/O-jQIO/OO4gQIOOVON4 R~`B(rTx^@& lRRRRQmKKK QmKg@Kg^Kg| QmK8KVKt QmKyKKyQmKK~K#xQmKUKKwQmKQKK "fz`F,rX>$ nT: ff`Qq'KEBKEсKE_Qq'KEcKEqKE^Qq'KEKEKE-D]Qq'KDuKD:KD\Qq'KCFhAk KC\[Qq KdtKdKdZQq KdlKdKd:YQq Kd}7Kd~rKdXQq KdaKdn KdzWQq KbKb!Kb\VQq KbKbEKbUQq Kb~KbKbTQq Kbu^KbQKbDSQq KbKbQqKb*]A؍ KbDD z!P~dJ0`F,rX>$ jPPPPmQqTKaKaKa lQqTKa4ABKaq kQqTK`eK`fK`f" jQqTK_ K_ %K_ C iQqTK^K^K^ hQqTK[K[K[ gQqTKYaKYaKYa fQqTKVgKVgKVg eQqTKT9~KT9KT9 dQqTKS@KS^KS| cQqTKRKRKR/ bQqTKPKPKP aQqTKO{A`KO `QqTKOLOKOLmKOL _QqTKO@KO@KO@ ^QqTKO.KOLKOj ]QqTKNϼKNKN \QqTKN4KNRKNp [QqTKNKNKN ZQqTKNtKNtKNt YQqTKNiKNi2KNiP N4UQqTKJ\KJzKJ TQqTKJ$KJ$-KJ$K SQqTKGKGKG RQqTKFEKFcKF QQqTKFKFKF PQqTKEKEKE4 OQqTKErKEKE® NQqTKEKE KE( MQqTKE0KE0KE0 LQqTKEKE$KEB KQqTKDKDӝKDӻ JQqMKeKeKe ((F`~&@^x :TnQҥxMKBATϠM[QҥyM\M\ M\$,QҥyM[qAV) M\ QҥzM[ AVƠM\$,Qҥ{M\M\UM\:Qҥ|M\$,M\.M\8  QҥM\AYDMn QҥMnM M, QҦ?MWAh ^Mg QҦtN}N"{N1 QҦtNAӆ[N QҦuNN̆N QҦvNsN6NQҦwNN NB[QҦNAӈ$ N(mQҧN(wN1N9QҧjN9AӐy=`NJ5QҧjNJ=AӒQ NKQҧkNJ4NJ9NJ> QҧlNJQҧmNJ=NJv7NJwQҧN^~AәݫNpnQҨJNpAӞzNQҨLN{2AӞ N{xQҨNN{1AAӞ N{xQҨNÆNN0 >>Xr(B\v,Fd~QҨN&NAN])QҨNRNNQҨN NiN QҨN&NN(!QҨNxNNz"QҨNNN#QҨNNN $QҨN~NеN &QҩNNsN'QҩN5N:N@7(QҩNNsN)QҩN4N;NA*Qҩ7NxNN<+Qҩ8N4N:N?e,Qҩ8NzINNDŽ-Qҩ9NyYNNdž/QҩwN.N4N9\0QҩwNt?NyN~1QҩyN-N4%N:2QҩyNs1NyN33QҩNvAӹ N{4QҩNNN!U5QҩNNN"7QҩOOO@8QҩO lrO qO w9QҩOjOOl:QҩOgOOi .Hb| :Tr0Jd~;QҩO kFO qO xH=QҪ*OOO>QҪ*OOO?QҪ,OOO@QҪ,OOOAQҪXOrO9OBQҪXO NOO CQҪYOAŮ OǐDQҪYOOO lEQҪnOs\AÃ0O)GQҪnO:hO@SOF>HQҪnOGO2OIQҪoO Aź O* JQҪoO9^\A PILQҰ;PtSPPKQҰ9P@ALPtJQҰ9PPP 2Lj $>Xr(B`zQҲ+PPo7PQҲ+PPPlQҲtP}A0ҠPQҲuP)AP.P4QҲuPPP~QҲvP(P.P5QҲvPPPQҲPcA6ŠPQҲP"fP(3P.QҲP'PՄPՊQҲP!:P(BP/JQҲP}PՅPՌ QҲPP~P< QҲPMP P!QҲP樲P毜P涆"QҲP?PP#Qҳ1P$PPl$Qҳ1PꑜPZP%Qҳ1P{P*P&Qҳ3PꐎPiPD'Qҳ3POP*P(QҳQ NAD`QV )QҳQwQ Q*QҳQqWQuQz]+QҳQKQQ,QҳQp+QuQ{-QҳQ PAD)QX .QҳQ@a>Q@mQ@x &&@Zt6Pj$>Xr/QҳQ@Q@Q@0QҳQ@IQ@UQ@a\1QҳQ@Q@rQ@92QҴQ.OlQ7GQ@@4QҴQ>1AOQ>5QҴQ?Q>Q>8QҴQ?Q? Q? 9QҴQ@@2AP `Q@ :QҴQ@cQ@QA4;QҴLQ@cQIQR <QҴMQNvQNGQN=QҴMQP!QP#oQP%@>QҴNQNJQNGQND?QҴNQP QP#QP&@QҴQemQwLF(LO3QҢLP(LP)LP*N4QҢLOA LP) 5QҢLP*0A4LQ| 6QҢLO5A LP)7QҢLP(LPa&LPf8QҢELc6A Li'9QҢxLkLpLt #V6Pj(B`z|bH*pV^QҤZM$]?M$zM$1]QҤ/M 1M j%M e\QҤ.M "M (M /[QҤ.M gM nM uZQҤ.M 0}M 1@M 2YQҤ-MAB^M 2 XQҤ*M $zM )M .WQҤ*M jbM oM tVQҤ)M 1AC)РMTQңL7MLoLاSQңL5L6L7kRQңLLӱLaQQңLLL7k PQңLCLoLڛ OQңLYLLaUQңL7ML┆LMQңLHA5Y5 La:QҢyLjLjLj ;QҢyLkjLk+Lk <QҢzLkjLk-Lk=QҢzLkfLk)Lk>QҢ{LkLkLlN?QҢL~MUA hLU@QҢLA%eL0AQҢLLLd BQҢL?LL CQҢL?LLDQҢLLL'EQңL~A3xLE{GQңL5L=LE{HQңLE]LIhLMs IQңLwA4`Lf JQңL2L;LE{KQңLLLfLQңLHL)La DD^| :Tn $>XvYQҫ1OT,OT-OT/ZQҫ1OTAՀ OWCV[Qҫ2OT+OT.OT0\Qҫ2OTAՀOWCV]Qҫ4OTAՄ<`OWC ^QҫsOWO\O`^_QҫtO]j]O]l.O]m`QҫtO^O^UO^&aQҫuO]i1O]l.O]o+bQҫuO^vO^sO^pcQҫOgOm5OrdQҫOgOgOgjeQҫOiDOiFOiHfQҫOgOgOggQҫOiCOiFOiIhQҬOsWVO{OiQҬO} O}dO}5jQҬO~]O~_O~azkQҬO} O}O}lQҬO~\O~_O~bmQҬ7OAaA梍O nQҬ8OA柟O3oQҬ:OAOMpQҬXrpR8hNN"QҮO OyOJ QҮO%7O(4O+1QҮOO O QҮO&cO(4O*QҮO;O OQҮHOVOYO\QҮFOWOYO[QҮHOOO QҮFOOO PQҭOσA`OQҭO΍AkOGQҭOΎ&Ad`OQҮFOA@OQҭOτA鰠OQҭmO OO QҭmOOOQҭ OZOBOtQҬsOJOGODuQҬOSPO_OjvQҬO,OOwQҬO;OGOSnxQҬO}OOJyQҬOAOzQҬO> O O2|QҬOOO}QҬO25O4O5QҬO1Ot/Ot QҬOOOQҬO2DOt/OQҬO1 O4O7QҬOuA OLQҬOVOO& QҭbOVA[O QҭlOhA; O #Vv\B(X>r$ jP2pVIQҰ9PJPMPPHQҰ9PPPGQҰ8PALPtq FQҰ7PHPPEQҰ7PLPMPODQҰ7PPP}CQҰ6PtSA-`P+eBQҰ6P]A PAQүP;AQPSG@QүPPPj?QүPS)P^Pj>QүPLPP(<QүOA<`O;QүOOO:QүO@OO9QүOOO7QүNOO}Oz6QүNOYOVOS3QүDOJlOqO2QүO'O`7Ow5QүNO%OO| 0QүOO O /QүOOO'.QүOOO( -QүOQOOz,QүOPa'QұPPP QұP7PwP QұPtPPG QұP]WPP QұPPPi QұPPPQұPiPoPtQұPRPWP]9QұP3PP$ QұPP؟P{QұPPPU QұPiKPoPt QұPQPWP]u QұP_PP"QұPP؟POQұPA'Pz~QұP7PP}QұPtPzP|QұP]WPc`Pii{QұPgP|PQzQұP PPyQұPPPxQұPmPoTPq%wQұPVPWPYvQұPP`P1uQұPwPHPtQұPqPrPtsQұPYP[hP]9rQұP|A3P|qQұP{{P{~P{pQұPz*wPz-tPz0qoQұPxOPxLPxInQұP|P|P|є 22Lf :Tn(B\vKQҵQjnQl>QnLQҵQQQxMQҵQi`Ql\QoXNQҵQQQOQҵQdAnQs PQҵQ2QQQQҵQ~QOQ RQҵQQQSQҵQRQOQLTQҶ+QjQkQmUQҶ+Q QQīVQҶ,QhQkQnWQҶ,QʿQQQjQҧQҩQҫQkQҦQҩQҬQ$QZAr QQ$Q QQ߯Q$QQQQV!Q IQQ QV"QQQ gQՅ QK%QVQb QՅ Q3Q?|QKC,QշQAu Ql -QշQ=Au Ql/QշQlnQԤQLQ֛QJbQL3QNMQ֛QI6QL3QO0 J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ Q TW QbJ Qca Qέ Qή Q. Q- QOn QPm QҦ Qҧ Q Q  Q, Q=- Q Q I Q3 QK% Qln/ Qln! QI6M QJbL Q֔i Q֕h Q Q Q6 Q7 Qڍ Qڏ Q> QL Q0A  Q1O  Q{ = Q| < QҐ _ QӼ ^ Q Q Qt Qv Qぴ Q QH QV Q% QQ QV! QX !{ Q\! Q]3! Qf! Q~?! Q樫! Q! Qc! Qc$ Q}! Q纩! Q! Q! Q["% Q\"$ Q5"K Qa"J Q8"m Qd"l QI" QK " Q" Q" Q" J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ Qf QhD QβE Qγ Q I- Q . QTm QUn Qҫ QҬ Q߯ Q Q Q g Q  QKC Qb Ql- Ql, Q/ QNL QO0M Q֙Ph Q֚|i QS Q Q; Q< Qڒ Qړ Q Q8 Q4  Q6;  QހZ < Qށ = Q^ ^ Q؊ _ Q" Q# Qy Qz Q㎶ Q Q QB QT Q Q[!{ Q\! Q]! Q~]! Q! Q9! Qש! Q ! Q! QQ! QK! Qw! Q ! Q ! Q`"$ Qa"% Q"J Q/"K Q"l Q2"m QU" QV" QU" Q女" Q" Q" 6Pj :Tn $>XrhQDZQ֕Q֗Q֙PiQDZQ֔Q֗Q֚| Q? QQQS Q? QQQ,QhQ;Q8QhQ1OQ3 Q4QhQ0AQ3>Q6;<QaQ|Q~QހZ=QbQ{Q~Qށ^QQӼQՍQ^_QQҐQՍQ؊QO#QQ Q"QO#QQ Q#QdQv QwQyQeQtQwQzVQڏQQQ㎶XQڗQぴQQ\QAQVQ'Q]QBQHQEQB~QO>QQAy<QTQO?Q%Ay<Q{Q}[QX QYQ[QxQlnAwY0`Q]   :Tn $>Xr0Jd~QyQVQYQ\QLQfQrQ~]&QݦQ~?QQ5Q XQQQש6Q YQ樫QrQ98Q ZQ\QHR\fpz$.8BLV`jt~ QB" QD" Q# Q# Q%#C QQ#B Q<(#e Q=T#d QO# Q{# QC$ Qo$ Q$: QG$; Q$ QS$ Q$, Q5/$8 QVY$= QVY&K Q/$W Q0$V Q$ Q$ Q$ Q$ Q($ Q)$ Qt<$ Quh$ R?% Rk% R% Rm%$ Rn%# R%F R%E R%l R %k R[G% R\U% R,% RX% R % R % R G&g R G=&h R P&H R hI&P R &d R %&c R m&k R m( R `D& R ap& R & R & R & R & RM& RN& R& RD& R'% R*'$ R;g'K R<'J Rk'm R'l Rݶ' R' R4' R5' R' J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ QH" Q# Q# Q#B Q#C Q@#d QB"#e Q# QI# Q$ Q=$ Q $ Qq$ Q $ Q5M$, QL$8 QV$; QVw$: Q$= Q4l$V Q5$W QR$ Q$ Qֻ$ Q$ Q-$ Q.$ Qy $ Qz6$ R % R9% R% Rr\%# Rs%$ R%E R%F R%k R%l R_% RaA% R% R&% R E% R % R G&K R hg&H R &P R C&d R &c R &h R ˋ&g R ;&k R mF& R nr& R & R & R & R & RR& RS& R& R& R'$ R'% R@5'J RAa'K R9'l Re'm R' R' R9' R:' R' R' ((B\v,F`z0Jd~RG;RRR#RRnRpRr\$RRmRpRsERRRRFRRRRkRG:R RRlRG;RRR RzR\UR^&R_R{R[GR^DRaA3R RXR)R4R R,R)R&SR 0Xv,F`z0Jd~]RsRMRPRS~RRDRRRRAԄ'`R$R2R*RR%R2RRRJRqRdR@5KRqR;gR>dRAalRSRRhR9mRSRkRhReRRRRRRݶRR0R["R5R7R91R[#R4R7R:RRR1RRSRRRRvRRRR۸wRRRRRu`R#R%QR'"RuaR"TR%QR(N<RRARR=RRRRXRR mRRYRRYR*R[RRKRHREeR,&R?RRgR,&RRіR]lR`MRR*R6mR`NRRrR9 ((B\v,F`z0Jd~yRRRHR\fpz$.8BLV`jt~ R' R' R"T( R#( R(= RA(< RK( RY( R( R3( R( R?( R( R( R@c( R@c* R!d) R") R f): R h)9 R!ó)\ R!)[ R#) R#*) R$f) R$g.) R%M) R%y) R'Q) R' _) R(S* R(T* R)* R**' R**& R,L*G R,M*F R-:*i R-f*h R.=* R.K* R0#7+ R0$c* R00+* R01G++ R0:+ R0RS+ R0|+( R0/+' R0Y+- R0Y- R1+O R1+N R2+m R2+l R43+ R44+ R5>+ R5?+ R5+ R54+ R6 + R68+ R8!W, R8", R9x[,7 R9yi,6 R:æ,] R:Ĵ,\ R<, R<,~ R=e, R=g, R>, J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ R' R'"( R(N( R(< R(= R( RE( R( R]( R( R9( R6( R@ ( R@( R( R&2) R'^) R k)9 R l): R!ȁ)[ R!ɭ)\ R#) R#) R$j) R$k) R%) R%G) R' ) R'K) R(Xj* R(Y* R)* R**& R**' R,Q*F R,R*G R-*h R-4*i R.* R.7* R0(* R0)1+ R01 * R0Rq+ R0i+ R0M+( R0+' R0++ R0w+* R1%+- R1<+N R1+O R2+l R2+m R48+ R49+ R5K+ R5L+ R5+ R5+ R6+ R6+ R8&%, R8'Q, R9} ,6 R9~U,7 R:V,\ R:ɠ,] R<Z,~ R< , R=j, R=k, R>, R>, ((B\v,F`z0Jd~~R1V-R@cR'8R01 R1V.R0$cR0&4R0(R1V.R0#7R0&4R0)1 R1BR0RSR0^R0i R1BR0:R0FR0Rq'R1BR0/R0R0(R1BR0|R0R0M*R1CR00R0s2R0w +R1DR01GR0s2R0-R1DR0YR0R1%NR2R1R1kR1<OR2R1R1R1lR4R2R2߷R2mR4R2R2R2R5iyR44R46R48R5izR43R46R49LR66R5?R5ER5KNR69R5>R5ER5LRR6R54R5R5SR6R5R5R5tR8HR68R6 R6uR8IR6 R6 R6R9R&R8"R8$TR8&%R9R&R8!WR8$TR8'Q6R:XR9yiR9{:R9} 7R:YR9x[R9{XR9~U\R<R:ĴR:ƅR:V]R<R:æR:ƣR:ɠ ((B\v,F`z0Jd~~R=RbR<R<R<ZR=RcR<R<R< $R>R=gR=hR=j%R>R=eR=hR=kJR?R>R>R>KR?R>R>R>hRAWR@R@R@iRAWR@R@R@ JRBRA]RAaERAdRBRA\RAacRAf1RCR0YR9RB RCRBRBRB_ RCRBwRBRBRC%RBRBRBg"RD,RBIRBRB/RDXyRC %RCRC 0RDXzRBRB|RC C2RDX{RBRBFRC* 3RDX{RB=RB(RC*5RDX|RC*mRCbRCNREWRC>RDgRDOREWRC0RDRDpRFbRE[RE`REdpqRFcREZRE`)REeRGRFRFRFRGRFRFRFG4RIX,RGRHKRH5RIX,RGoRHKRH' 6Pj :Tn(B\vZRJRIBRIGRIL[RJRIARIGRIM|RKRJrRJmRJh}RKRJdRJRJ"RM"}RKRKRK#RM"~RKRKRK?TRNURMAgRMFRMKURNVRM@YRMFRMMVRNWRMOYRMQRMT' rROU:RNRNRNbsROU;RNRNRNtROUHR\fpz$.8BLV`jt~ R@, R@, RA\- RA]- RBw- RB- RB- RB=- RB- RBI- RB- RC %- RC*m- RC*m/ RC0- RC>- REZ- RE[- RF. RF. RGo.5 RG.4 RIA.[ RIB.Z RJd.} RJr.| RK. RK. RM@Y. RMAg. RMOY. RN. RN. RN4. RSɲ/ RS/ RS/! RT/ RT/ RU/ RU/ RU3/ RU$/ RU<@/ RUf/ RU~/ RUd/ RUd4s RVk0 RVl0 RVt0 RWȆ0K RWɔ0J RWк0L RWo0 RW0 RX 0 RZj0 RZk0 RZp0 R[ 0 R[0 R[O0 R\1A R\1? R\P1[ R] 1Z R] 1Y R]01\ R]!1} R^1 R^+R1 R^@1 R^Wb1 J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ R@ J, RAd- RAf1- RB_- RB- RB- RBg- RB- RC C- RC - RC*- RC*- RC- RD- RD- REdp- REe- RF. RFG. RH.4 RH'.5 RIL.Z RIM.[ RJh.| RJ.} RK. RK?. RMK. RMM. RMT'. RNb. RN. RN". RS/ RSJ/ RS/! RUY/ RU/ RUE/ RU/ RU<^/ RUS/ RU~:/ RU/ RU / RU/ RV/ RVxm0 RVy0 RVG0 RW.0J RWx0K RW0L RY0 RY*0 RY0 RZw}0 RZx0 RZ0 R[ 0 R[70 R[0 R\1? R\1A R]1[ R]1Y R]1Z R]91\ R]1} R^1 R^11 R^L@1 R^d1 R^s1 **D^x >Xr,F`zRWRVtRVRVG JRY vRWɔRWaRW.KRY wRWȆRWRWxLRY9RWкAԕ`RW RZhRWAԖ1 RYRZiRWoAԖ1 RY*R[ RX RXRY 0R[$RZkRZqRZw}1R[%RZjRZqRZx8R[RZpAԖ RZ fR] R[R[R[ gR] R[ R[ R[7iR] R[OR[ȖR[ ?R^}R\R\R\AR^R\R\R\YR^K#R] R]R]ZR^K$R] R]R][R^K%R\PR\R] \R^R]0AԗI7R]9 }R^OR]!R]R] >R_WR^R^R^ QR_zmR^+RR^.1R^1 RR_zmR^@R^FR^L@ _R_hR^mR^pR^s`R_iR^lR^pR^uDaR_jR^WbR^^R^d oR_PR^mAԗi R^` 66Pj(B\v0Jd~pR_PR^R^R^ {R`3R^RR^QR^P |R`3R^Aԗ`R_ /R`R_aR_R_0R`R_SR_!R_1R`R_R_BR_ 2Ra?R_3AԗR_2 ERanR_R`-#R`b qRbfRaRaRarRbfRa RaRaRb2R`Ra&Rat Rb2Ra6RaMRad $Rc"RaRauRa BRc5RbTVRbXCRb\0CRc6RbS*RbXRRb]zhRd6*RaAԘ`Rc e sRdeRcRcRcU tRdeRc*Rc-nRc0 RdRc?RcFRcM RdRcRcRcRdRcRcRcZTRexRcS_Rc[RdcW URexRdmRdrHRdw `ReRdRdRdW uRf!RdKRdRdwRf!RdRdRdRf*Re]lRerRe J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ R^m1 R^m1 R^1 R^R1 R^1 R_21 R_S20 R_a2/ R_322 R_2E R`2 Ra 2r Ra2q Ra62 Ra2 Ra2 RbS*2 RbTV2 Rc2 Rc*2 Rc?3 RcS_3T Rc3 Rc3 Rdm3U Rd3` Rd4 Rd3w RdK3u Re\^3 Re]l3 RfQ3 RfR3 Rg%,4y Rg4v Rg 4t Rg4 RgH4 Rg4q RgT4 Rg4 Rg14 Rg 4 Rh[4 Rh[7 Rh 6 Rh4 Rh4 Rk4 Rk4 RlX5 Rlf5 Rn75* Rn9(5) Ro}k5H Ro~5G Rp5j Rp;5i Rqr 5 Rqs95 Rs|@5 Rs}N5 Rt5 Rt½5 RvS6P Rv6M Rv.6\ Rv0#6Y RvLC6] RvMo6Z Rwc6 Rwd6 RxL6 Rxd 7 J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ R^`1 R^1 R^P1 R_1 R_21 R_2/ R_20 R_222 R`b2E Ra2q Ra2r Rat2 Rad2 Ra2 Rb\02 Rb]z2 Rc e2 RcU2 Rc02 RcM3 Rc3 RcZ3 RdcW3T Rdw3U RdW3` Rd3u Rd3w Re3 Re3 Rf[}3 Rf\3 Rg4 Rg4t Rg4v Rg 4s Rg4y Rgr4q Rg4 RgO4 Rh 4 Rh 4 Rh4 Rhy4 Rh4 RjV74 RjW4 RkW4 Rk4 Rl5 Rl5 RnB5) RnC5* Ro35G Ro_5H Rp5i Rp?5j Rr5 Rr5 RsD5 Rs5 Rt5 Rt5 Rv)6M Rv*6P RvA6Y RvC6\ Rv]6Z Rv_!6] Rwo 6 Rwpj6 RxE;6 RxZ6 Rxok7 Rx,7# .Hb6Pj0Jd~Rf*Re\^RerRe6Rg RfRRfW6Rf[}7Rg RfQRfWERf\RheDRdAԙv`Rg qRhRgRgRgrsRhRUdR^Rg tRhRg RgqRgvRhRgRgRgyRh Rg%,Rg\Rg RiRgTRgRgRi6Rg1RgRh Ri6RgRgRgORi6Rg RhRh Rie*RgAԙRhy Rie*RgHAԙRhRie+Rh[RhLRh;RkurRhAԚig RjV7<RkusRhAԚijRjWaRlRkRkRkWbRlRkRkRkRnRlfRl%RlRnRlXRl4Rl)RoRn9(Rn=RnB*RoRn7Rn=RnCGRp Ro~RoeRo3HRp Ro}kRoeRo_iRrRp;RpRpjRrRpRp'Rp? ((B\v,F`z0Jd~Rt Rqs9Rr RrRt Rqr Rr Rr1RtRs}NRsIRsD2RtRs|@RsgRsWRu Rt½RtRtXRu!RtRtRtMRw^RvRv$Rv)PRw^RvSRv$Rv*YRwRv0#Rv8RvAZRwRvMoRvURv]\RwRv.Rv8RvC]RwRvLCRvURv_!Rx[RwdRwjRwo Rx\RwcRwjRwpjpRyRh Rp.$RxE; qRyRxLRxSRxZ RynRxd RxiRxok #Ry]Rx>RxRx, 4RyaRxRxRx< QRz4RxNRxRx `RzRxRxRxbRzRxRxRx,dRzRxRxӭRx uRzI/Ry Ry eRy vRzI/RyRy#Ry( RzzRy8Ry:URy; JR{1Rh[Rq RzKR{1RyRyRy;   :Tn,F`z0Jd~MR{1RyRyRyg_R{_RzRz Rz `R{_RzRzHRz;HR|]Rz oAԞRz~ IR|]RzRz'Rzn JR|]Rz@RzRzN KR|]RzRzRz ^R|1RzRzoRz^ oR|^cR{R{ R{ R|qR{pAԞuR{$? R|R{6R{9HR{; R|R{NQR{PR{S $R|R{fR{h(R{i )R|rRzRz0R{*R|sRz?RzcR{+R|tR{~?R{/R{ HR~/R|2R|xR|IR~0R|$R|R|nR]xR~R~ :R~oR]yR~R~ IR~pRRJ7RPRWWRR%RzRRRRR3R*]RRR\4R*^RhRRQRRJ7RORURRRI)RORVIvR͙RR8R J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ Rx74 RxN7Q Rx7b Rx7` Rx7d Ry 7u Ry7v Ry87 Ry7 Ry7 Rz7 Rz?8 Rz7 Rz: Rz8 Rz o8H Rz8I Rz@8J Rz8K Rz8^ R{8o R{p8 R{68 R{NQ8 R{f8 R{~?8 R|$8 R|28 R~8 R~8 RJ78 R9 R%9 Rh94 R93 RI)9R RJ79Q R9w R9v RP9 R^9 RZ9 Rh9 R09 R19 R: R9 R.: RZ: R/:D R0:C R]: R_: Ry; Rz5; R: RA: Rŭ: R; Rf; Rf=k R; R; R.;F R/;E Rt;f Ru+;e R; R; RN; R\; Rr; Rt; R; J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ Rx7Q Rx7` Rx,7b Rx7d Ry 7u Ry(7v Ry;7 Ry;7 Ryg7 Rz7 Rz7 Rz;7 Rz~8H Rzn8I RzN8J Rz8K Rz^8^ R{ 8o R{$?8 R{;8 R{S8 R{i8 R{8 R{8 R{8 R|8 R|8 R~8 R~8 RWW8 R9 R9 R\93 R94 RU9Q RVI9R R9v R9w R49 R~9 Rl9 R9 R<9 R>&9 R9 R: R|: R: R;:C R=6:D Rj': Rkq: Rz: R_: R: R;: R; R ; R; Rn; R:; Rf; R:;E R<(;F Rk;e R;f R-; Rw; R"; R#; R{; R; R; R5; 22Lf :Tn $B`~wR͚RR8R-RR^RIR4/RRPRgR~7R)RhRRl8R)RZRRYRR1R7iR<ZRR0AԡR>&RʎRR*RRʏRR9RR-(RZRR|R-)R.RRCR|R0R6[R;DR|R/R6yR=6]RRzREiRz^RR_RdRj'`RR]RdRkqjRJRARRlRJRRR_yRRŭRtR;RDRAԣ:9 RRDRyAԣ/R RDRz5Aԣ/ R  RDRfR6RnR}RRؚR: R~RRةRfERR/R5\R:FRR.R5\R<( ((B\v,F`z0Jd~eRORu+RzRkfRORtRzR RRR׍R- RRRלRw+RT/R\R R",RT0RNRR#QRRtRyR{RRRrRyRsR"RRRRRrkR>"RfRR oRn'RTRR'~RRR0R]Ri J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ R"< RN< RZ<@ R[ RA_> R>( R>' Rd>P R>O R'>n R(>m R> R> R"> RN> R&> R'> RAP? RB|? RlS? Rm? R?4 R@?3 R%?[ R&?Y RHR\fpz$.8BLV`jt~ R"< Rg9 RN%> Ri>' R>( R*>O Rt>P R4>m R5>n R[> R> R> R> R3> R4> RH:? RI? Ry? Rzc? R?3 R$?4 R2?Y R3?[ RI? RJ? Rd? Rg? R? RC@ R޳@ R@ R@ RX@ R@ RY@4 R@5 Rv@A R@H Rq@I R-@ R-@ R4@ RE@ R @ R|@ R@ R@ R5@ ((B\v,F`z0Jd~RR:RFRRNRRR13Rsx RRHR13RsRRsZRRRRBnRH,RMRRABRH;RO4;RR/RR<RRRR[R(RRkR8\R(RrRkRdR2RA_RG,RLR3R@3RG,RN%'RRRRi(RRRROR;RR]R*PR;RdRlRtmR+R(R.R4nR,R'R.R5R7RRR[R8RRR/R RNRR0R R"RRTRjRR'R-R3URjSR&R-R4R RB|RE[RH:RRAPREjRIRhRmRsLRyRiRlSRs[Rzc $$>Xr-Hc~ ?Zy3R 3R@R R4R 3RRR$YRUR&R,R2[RUR%R,R3\R}R=RCRI^R}RRD]VRƓkR7R>REoRR~PRƄRƉpRR}$RƄRƊR4KRRRR4LRRR3R`R AԲIR+4R`RrAԲI R-GUR˿R}BRʃRʈVR˿R|4RʃRʉwRRR~R-xRRRȍRw J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ RPA RRA RtA$ RA# R5AF RCAE R8Ah R9Ag R•fA R–A RA RA R7A R8A R}$A R~PA RB RB RrB4 R B3 R|4BV R}BBU RBx RBw ReB RB R͵7B RͶcB RB RB R#C ROC RbC( RdC' RӨqCF RөCE R3Co RACn RD RC R3nD R4|D RMD; RNDD< RWD" RoPD R֙D/ Rֱ,D. RWD> RWFr RקcDX RרDW RIDt RJDs RۦtD RۧD RD RD R1pD R2D Rߎ2E Rߏ^E RӿE, RE+ R0EP R1EO RvEv RwEu RE RE R/E R0E RuE Rv,E J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ R^A R:A# RfA$ RAE R'AF REjAg RFAh R¢A R£XA RA RA RD]A REA RƉA RƊA RB RB R+B3 R-GB4 RʈBU RʉBV R-Bw RwBx R*B R,B RB RB RB RKB RC RC RoPC' Rp|C( RӴCE RӶ CF RCn RCo R"C R#D R?D R@D RND RonD" RֆD RֱJD/ RȻD. RD< RuD; RBD> R׳DW R״DX RUDs RWDt R۲D R۳D RD R?D R=D R>D RߚDE RߛpE R߳E+ RE, RR2RWR RBWR5RרR׮ R׳ 6Ql)D_z$?ZuXR5RקcR׮ R״sRیRJRPQRUtRیRIRP`RWRYRۧRۭR۲RZRۦtRۭ"R۳3R-XRRR4R-XRRR?YRߊR2R8R=ZRߊR1pR8R>RϧRߏ^RߔRߚDRϨRߎ2RߔRߛp+R,,RROR߳,R,,RӿRORORpR1R7RRR/R6RM:pAB6F_GC'JJKmLP3OVTyWX@]Q g]0'h Y.2[9^:Xs"Im.JM\m ]5ojKvF~၁@⁄x恌}偈W J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ R4Fa RF R:F RF RFF} RF R&"F RGjF RGjG3 RmF R{F RiF REF R^G R G RG Rt/G+ Ru=G) RQG5 R}G4 RG RxG Ry:G RG RI( RBG RPG RZG RG R[H R\HH RH, RH+ RHN RHM RCHp RD$Ho RH RH RfH RH R+I+ R,I) R7I7 R81IN RAI2 RY=I1 RzI8 RzN R{I9 RI RI} R*@I R+lI SI SKI SI SI S)I S*I SJ S#J SSJ0 SJ/ SJc SIJa SJx SJw S NJ S \J S J S  J S ouJ S pJ J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ RFr RdF RF} R&@F R=F RGF RGF RF R"F R$F RAF RPF R꺎G RG RG) RG+ RG3 RG4 RG5 RxG R~aG R4G R4G RG R7|G R8G R ^G R G RfH Rg.H RqH+ RH, RHM R _HN RMHo RNHp R(H RrH RH RH R5I) R6QI+ R8I( RY[I2 RpI1 RzI7 RAI8 RQI9 RrIN RI} RI R3I R4I SaI SI SճI SI S2VI S3I SJ SJ S-J/ SYJ0 SaJa SJc SJw SJx S J S HJ S J S J S t%J S uoJ S2J 2Mh-Hc $?^y R=R\HRa%RfR>R[Ra%Rg.+RRRRq,RRRRMR@hRRVRNR@hRRtR _oRRD$AԽ5 RMpRRCAԽ<RNRRRR(RRRRr1R$RRR2R$RfR$R(RjRAԽV R8)RjR,R0R5+RjR+R0R6Q1RSgQS%WS)S-  SzS>\S@-SA SzS=0S@-SC* SzSFSHSJ @S SSS7 ]S9WSySݐS ^S9WSiSS jSgSSXS' kSgS&)S-@S4W SSSSSSSS%S .S9Aa S՘ PS SSISI aSSVSYS\ bSSm[SrSv xSISSzS SSS|SMSSS|Sy J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ S ?J SWK SX#K SK@ SK? S(K^ S6K] SUK SVK SYK SK SL SjL S&L= SL8 S L7 S%WL> S=0L S>\L SFL SL SyL SiL SL S&)L S9M% SM SM SMP SVMa Sm[Mb SMx SM SM SM SUM Sj|M SM S\M SLN S%N S]N SNB SN? SNC SސN S߼N{ S0N S eN S N S "O% S "=O& S +O S CIO S mO S %O# S nO( S nQ S ZO/ S!OG S! OF S"ݠOe S"Od S$#.O S$$HR\fpz$.8BLV`jt~ S[K S]K SKK? SK@ SK] S"K^ SZK S[K S'K SSK SeDL SyL SL7 SL8 S#L= S-L> SAL SC*L SJL S7L SL SL S'L S4WL SM SM S՘M% SIMP S\Ma SvMb SMx SMM SyM S M S`JM SxM SJM SJM S:N S1[N SAN SB;N S`;N SN? SNB SNC S^N{ SN S.N S 3N S _N S "N S CgO S ZO S CO S O# S O& S O% S O/ S!O( S!OF S!OG S"nOd S"Oe S$'O S$)(O S%O S%O S&O S&;O S(6O S(O S)l?P S)mP 66Ql)D_z7RmSNSSS 8SMSUS[S`J IS6Sj|SqSx XSXSSSJ wS6S\SSJ  S`LSLSS:  S`LS%S+S1[ S8S=mS?>SAS8SSB;S9S>]SOLS`; ?S3SSSBSSSSCSSSS {S 4S߼SS^S 5:SސSSS 5;S0SS. sS!HRzS pS "tS!HS S bS 3vS!HS eS bS _S!zS +S 7S CgS!S CIS OS ZS!S mS y|S C#S!S %A$; S %S!S "AS &S!S "=A S (S!S nS ޮS! ##>Yt1Pk (C^y/S" S ZS %S FS">S! S!S!GS"vS!S!S!dS$S"S"S"neS$5'S"ݠS"S"S%cS$$S4xS2S2S3)?S4x S3(HS3`S3S5S4 A S4MS5S4OS4fS4}lS5S4A S4~S5ևS4FS4jS4Z .S6r^S5NAS5PS5Q/S6S5M3S5P0S5S-LS7ΧS6S6]S6.MS7ΨS6~S6{S6xfS9F S7NS7S7gS9F!S7"S7S7S:vS9;S9=S9?_S:vS9:S9=S9@:S=S;S;߿S;;S=S;S;S;^S> S=:S=p_S> S=9S==S>S>S?S>S>S> (SA-S?S?ޱS?)SA-S?S?S?FSBrSA"2SA$SA%GSBrSA!$SA$!SA' I&&0:DNXblv  *4>HR\fpz$.8BLV`jt~ S*P/ S*P. S, PS S, PR S-ZPu S-[Pt S.P S.P S0P S0 P S1SP S1U*P S2Q> S2Q= S2Q. S3(HQ? S3(HS S4Q S4 Q S4FQ S4OQ S5M3Q S5NAQ S6~Q S6Q S7"Q S7NQ S9:R S9;R S;R; S;R: S=9R_ S=:R^ S>R S>=R S?R S?R SA!$R SA"2R SB}R SB~R SCÑS SCğS SDS SDS SE S SE HS SES SE-TS SEWS SEo1S SE[S SE[V( SFeS SFfS SGƒT SGÑT SIT! SI T SJdTG SJeTF SK#Ti SKOTh SMT SMT SMT SMT SNFxT SNGT SOT SOT SP+U SPWU I&&0:DNXblv  *4>HR\fpz$.8BLV`jt~ S*P/ S,RPR S,PS S-_Pt S-`Pu S.P S.P S0 cP S0P S1XP S1YP S2Q S2Q. S3(fQ= S3)Q> S3Q? S4MQ S4}lQ S4~Q S4ZQ S5QQ S5S-Q S6.Q S6xQ S7Q S7Q S9?_R S9@R S;R: S;R; S=>pR^ S=?R_ S>R S> R S?R S?R SA%R SA'R SBR SBR SCAS SCɋS SD|S SDS SE S SE-rS SEDS SEoOS SES SES SEyS SFS SFjrS SFkS SG3T SG}T SI T SI T! SJiTF SJjTG SKTh SKTi SM T SM T SMRT SMT SNKFT SNLrT SOT SOT SPU SP%U SRJU2 22Mh %@[z ;VqtSCЀSB~SBSBuSCЁSB}SBSBSDSCğSCpSCASDSCÑSCƎSCɋSF'S3(HS<*SE SF'SDSDSD|SF'SDSDSD'SFieSESE!SE-r4SFeSE-TSE9SEDCSFPSEo1SEzSEDSFQSEWSEcSEoOFSFRSE ASSEy GSFRSE HASSEISFSSE[SEțSFbSGSFfSFhSFjrcSGSFeSFhSFkSHSGÑSGbSG3SHSGƒSGŀSG} SJYt1Lg (C^y<SNjSMSMSMR>SNnSMSMSMNSOSNGSNIuSNKFOSOSNFxSNIuSNLrrSPSOSOSOsSPSOSOSOSR&SPWSP(SPSR&SP+SP(SP%2SSSRFySRHJSRJ3SSSREMSRHJSRKGVSTƇSSSSwSSHWSTƈSSzSSwSStvSV>SThST9ST wSV>STHR\fpz$.8BLV`jt~ SRFyU2 SSzUW SSUV STHR\fpz$.8BLV`jt~ SSHUV SStUW ST Uv ST6Uw SVIgU SVJU SW:V( SWDV& SWKV6 SWeVF SWlVE SWoVI SWoVH SWVN SW!VO SWVK SXVl SXVm SZ1%V SZ2oV S[V S[V S\V S\FV S^/W S^1W S_4SXSXSXS[gcSZ-SZ/TSZ1%S[gdSZ,uSZ/rSZ2o4S\pS[ S[S[5S\qS[S[S[XS^ +S\ZS\+S\YS^ ,S\LS\IS\F S_S^,S^-S^/ S_S^+S^. S^1JS`~S_1S_7S_Su;Su8fSxSw=ISw?Sw@gSxSw<;Sw?8SwB5 Sy{SxSxSxy Sy|SxSxSx "b}:Up-Hc~ ?^yb`SSSS0S{ SySySyѦ1S{ SySySykS|_@S{*S{,[S{.,mS|_AS{)|S{,yS{/vbS}M'SiUSrS|hS}lS| S|$S|'jS}lS|}S|S| S}S|AS|E$S|HS}S|:S|>S|A S}S|S|0S|Ki  S}S|S|0S|K S}S|KKS|S|S}S|pS|qS|sS}S|o S|rS|u/SS}S}ΪS}{0SS}S}S}USHS*SSVSHSSSwSWSo'SpSrxSXSnSqStSpSySJSSpSMSJSGJS`$S:S SLS`%SS S#SaS|KKS3S/St:SA  S4 0St;SA # S5&2St;S4Sm SL9SSmSoSq:SSlSoSr[SSSZS+\SS]SZSW_SSSS hkpuz~e_/37+<@EINUZR(%" gjoty}d^.26*;?DHMSV\'$! #`cfimlnrqvwx{s|&),-a14b895=>:ABFGCJKLPOTWXQ ]0Y[ 0 \fpz$.8BLV`jt~HR4> * S\ S\ S]\ S\ Sl\ Sm\ SpY Sq-Y SqYY Ss+Y Ss,Y StZ StZ Su-Z. SuZ, Su>ZE SuLZD Sw<;Zg Sw=IZf SxZ SxZ SyZ SyZ S{)|Z S{*Z S|[ S|[ S|}[j S| [h S|:[ S|A[ S|KK[ S|KK\ S|o [ S|p[ S}[ S}[ S[ S*[ Sn[ So'[ SM\ Sy\ S\L S:\J S\ S\ S4\ 0 \fpz$.8BLV`jt~RH>4* S\ S\ SW\ S+\ Sr\ Sq\ SqY Sq'Y Ss0eY Ss1Y St~Z StZ Su'}Z, Su'Z. SuZD Su8ZE Sw@Zf SwB5Zg SxyZ SxZ SyѦZ SyZ S{.,Z S{/vZ S|[b S| [j S|'[h S|A[ S|H[ S|K[ S|Ki[ S|s[ S|u[ S|[ S}{[ S}[ S[ S[ Sr[ St[ S\ SG\ S\J S\L S\ S4\ S5&\ SL\sunpy-0.8.3/sunpy/data/test/annotation_manual.db0000644000175000001440000005600013203275053021147 0ustar nabil00000000000000SQLite format 3@ -% }x#M)iindexend_time_indexeventCREATE INDEX end_time_index ON event(end_time)S-qindexbegin_time_indexeventCREATE INDEX begin_time_index ON event(begin_time)ctableeventeventCREATE TABLE event ( insertion_time INTEGER DEFAULT (strftime('%s', 'now')), begin_time NUMERIC, reference_time NUMERIC, end_time NUMERIC, eventType_id REFERENCES eventType(id), reference TEXT )OtableeventTypeeventTypeCREATE TABLE eventType ( id INTEGER PRIMARY KEY, type VARCHAR(256), definition TEXT ) G b$c,u 3GOperational AnomalyUnusual or unexpected data due to PROBA2 platform or instrumental behavior with a known cause5 )SSWAP CampaignsSpecial science operations for SWAP5 )SLYRA CampaignsSpecial science operations for LYRA; qFlowsNon-eruptive flows of material along coronal loopsK EruptionEjections of material from the corona observed by SWAP or LYRAbOCoronal Dimmings and/or EUV WavesLarge-scale wave or dimming associated with impulsive eventsI9kSWAP subfield campaignHigh cadence 120x120 and 300x300 SWAP subfield.-/=Beyond limb eventEvent beyond solar limb.C+mLovejoy in SWAPComet Lovejoy visible in the SWAP field-of-view.+35Unexplained featureUnexplained feature.));Off-limb eventOff-limb event in SWAP.C+mLovejoy in LYRAComet Lovejoy visible in the LYRA field-of-view. q-qOQ Q6QGQY|North East Quadrant; http://proba2.oma.be/swap/data/mpg/movies/WeeklyReportMovies/WR168-June10to16_2013/Events/20130613_NEQuad_erupt_2254_swap_diff_annotated.pngV[QaLLL$Offlimb eruption associated with C3.8 flare (see also: http://adsabs.harvard.edu/abs/2019MQ Q6QGQY|North East Quadrant;http://proba2.oma.be/swap/data/mpg/movies/WeeklyReportMovies/WR168-June10to16_2013/Events/20130613_NEQuad_erupt_2254_swap_diff_annotated.pngP{QQJQ~cQ)Prominence Eruption;http://proba2.oma.be/swap/data/mpg/movies/WeeklyReportMovies/WR168-June10to16_2013/Events/2013_06_12_07_00_35_2013_06_12_18_52_59_SWAP_174__AIA_171__AIA_304-hq.mp4  KR KLSK6T L|&L"L)o~ L*+ L*0L-,L1X+ L28XL:9j L:kF L;l|-L>HtX L>Ou|LAw LDMz LDd{| LD|\|ULQ^L\Ih Llx Lq0 L&MH9 MH: M M M環 MM瞤 N7T NLٸN8-NfPH NgNI Nh`JN{1P NwP 8 NDOaNpONFO7DOtX L>`u|LAw LDSz LDj{| LD8|ULQ^L\p Lm Lv L$&M$9 M: M M M疬 M眈Md N8 NLN8-NfmH NgI NihJN{ N 8 NOaNjJ NFO9@ROdOdOz LYRA U3 flare hunting campaign9IS>sOOO:( LYRA U3 flare hunting campaign9IS>O7DO7DO9@ LYRA U3 flare hunting campaign9IS>N7TN7TN8 LYRA U3 flare hunting campaign9IS>MMM LYRA U3 flare hunting campaign   >2YR0wbNpNpN GI Slemzin Campaign, off-point to East01=R0v=R.yR.yR. SE quadrant, 2 pathways80MR0hLLL No SWAP Data - Cause TBD - WR0268/MR0hLɠLɠLɠ No LYRA Data - Cause TBD - WR026,.5R0d%R#R#R#6 NW quadrant, AR loop-R0d R#UDR#UDR#m, SW limb,,5R0cR#R#R#R7kMlMlM% No LYRA Data, LYRA OFF, SWAP GI campaign (coordinated Koutchmy & Slemzin)+=3R7MZMZM GI Slemzin Campaign,<5R7?MMM  GI Koutchmy Campaign,;5R7MMM GI Koutchmy Campaign]:R78MHMHM No LYRA Data, LYRA OFF, GI campaign (coordinated Koutchmy & Slemzin)]9R7pM]:R78MHMHM No LYRA Data, LYRA OFF, GI campaign (coordinated Koutchmy & Slemzin),;5R7MMM GI Koutchmy Campaign,<5R7?MMM  GI Koutchmy Campaign+=3R7MZMZM GI Slemzin Campaignb>R7kMlMlM% No LYRA Data, LYRA OFF, SWAP GI campaign (coordinated Koutchmy & Slemzin)^?R7MHMHM No SWAP Data, SWAP Idle, GI campaign (coordinated Koutchmy & Slemzin)4AR9MMMl No SWAP Data, MCPM Blocked  G|5wE::::pIRC yK K KH No LYRA data - downlink failed8IRC +K K KH No SWAP data - downlink failed3OCR9$NDNDNNo SWAP Data - ESP campaign3NCR9NLٸNLٸNLNo SWAP Data - ESP cam6JIR9Nh`Nh`Nih LYRA U3 flare hunting campaign3NCR9NLٸNLٸNLNo SWAP Data - ESP campaign3OCR9$NDNDNNo SWAP Data - ESP campaign@R]RCKKK  No LYRA data (1st of 3 consecutive gaps)@S]RCIKLKLK# No LYRA data (2nd of 3 consecutive gaps)@T]RCrK6K6K;l No LYRA data (3rd of 3 consecutive gaps)B^aREFLQLQLQ LYRA U2 closed (?) - due to SWAP Off-point&l)RE%L;L;L;4SWAP off-point/t;REFL>HL>HL>O LYRA Campaign - Aim TBD/u;REL>OL>OL>` LYRA Campaign - Aim TBD?|[REhLD|\LD|\LD8SWAP Stray light measurement - Period 3:QREaL-,L-,L-HtL>OuLAwLDMzLDd{LD|\|LQZLQ^ L\Ih LlxLq0LM;Ml>MH9MH:MH?MZ=M< MM东 M东 M M _%KKU %.7@JT^hr| M N7TM; Ml8Ml>MH9MH:MH?MZ=M<b?ML& ML'-MS%$M! M" M$ M# M东 M东 M M M環 M M M瞤PMFMh M, M)$ M)$N N N 0 N7TNLٸNNfPHNgNINh`JNwzKN{1PNwP Np2N>T3N4N 5NDONeGNpN O7D O Od P& Qhh QGl Q|QJQ6Q6R"/+R#,R#UD-R#.R.y1 Rz RͶt Rx S d S2 ,LLU^gq{!*3<ENW`is} KHP KHQ KCU K+TV KWK RK#SK;lTKߴ X Kߴ Y KƬ L , L"eh L" L)T~ L*4L*,L- L-  L-OtL>`uLAwLDSzLDj{LD8|LQ^LQZ L\p LmLvL$M%>M$9M:M?M;M=M < MM M M| M _%KKU %.7@JT^hr| M N8 M%8M%>M$9M:M?M;M=M <b?M& M'-Mt%$M" MV# MV$ MZT! M M M| M M疬 M M眈 MdPM禜FMϬ M M2 M6DN  N @ N N8NLNNfmHNgINihJNwKN{N N2Nl3N4N:5NONߍGNjN O9@ O:( Oz P Qi  Q QjQ)QY|QY|R"+R#L>L> No LYRA data - Reason TBD?REL>tL>tL>` No LYRA data - Reason TBD?REuL>kL>kL>p No LYRA data - Reason TBDSREDL:BdL:BdL:8 Degraded SWAP service /u;REL>OL>OL>` LYRA Cam5GREL"L"L" Off-point for LYRA - Aim TBD=RE9L\IhL\IhL\p SWAP Off-point - Aim TBDTREȆLlxLlxLm SWAP degraded service - lower cadence - LOCOOS experiment8GRIMMM SWAP Mosaic campaign - part 15.GRI,M環M環M疬SWAP Mosaic campaign - part 25/GRINMMM眈SWAP Mosaic campaign - part 38GRIM瞤M瞤Md SWAP Mosaic campaign - part 461IS>S dS dS2 LYRA U3 flare hunting campaign62IS>RxRxR7 LYRA U3 flare hunting campaign63IS>RͶtRͶtR LYRA U3 flare hunting campaign64IS>RzRzR{ LYRA U3 flare hunting campaign65IS>Q|Q|Qj LYRA U3 flare hunting campaign "SCkFyC/t;REFL>HL>HL>O LYRA Campaign - Aim TBD/u/t;REFL>HL>HL>O LYRA Campaign - Aim TBD/u;REL>OL>OL>` LYRA Campaign - Aim TBD+w3RELALALA SWAP debug /t;REFL>HL>HL>O LYRA Campaign - Aim TBD/u;REL>OL>OL>` LYRA Campaign - Aim TBD+w3RELALALA SWAP debug campaign?z[RE LDMLDMLDS SWAP Stray light measurement - Period 1?{[RE>LDdLDdLDj SWAP Stray light measurement - Period 2?|[REhLD|\LD|\LD8SWAP Stray light measurement - Period 3&~)REL)oL)oL)T SWAP off-point&)RESL*0L*0L*, SWAP off-point.9REL*L*L*4 SWAP dark acquisitions:QREaL-,L-,L-S dS dS2 LYRA U3 flare hunting campaign62IS>RxRxR7 LYRA U3 flare hunting campaign63IS>RͶtRͶtR LYRA U3 flare hunting campaign64IS>RzRzR{ LYRA U3 flare hunting campaign65IS>Q|Q|Qj LYRA U3 flare hunting campaign U3u1e!UA!_RIjMMM( No LYRA data - Proba2 propulsion campaignA _RIiMMM, No SWAP data - Proba2 propulsion campaignA_RIiMMM No LYRA data - Proba2 propulsion campaignA_RIikMMM No SWAP data - Proba2 propulsion campaignA_RIiNV NVN` No SWAP data - Proba2 propulsion campaignA_RIhNUNUNd No LYRA data - Proba2 propulsion campaignA_RIhNVNVNc No LYRA data - Proba2 propulsion campaignA_RIhNVNVN_ No SWAP data - Proba2 propulsion campaignA_RIgN XN XN < No LYRA data - Proba2 propulsion campaignA_RIfN XN XN @ No SWAP data - Proba2 propulsion campaign3CRIdN N NP No SWAP Data - ESP campaign^RIa1N(LLN(LLN(d No LYRA Data - Cover U2 closed unexpectedly - VFC calibration problem3CRI`N'N'NH No SWAP Data - ESP campaign3CRI_NNN No SWAP Data - ESP campaign FPFV~F5/GRINMMM眈SWAP Mosaic campaign - part 35.GRI,M環M環M疬SWAP Mosaic campaign - part 25-GRIMMM SWAP Mosaic campaign - part 1e,%RIMMM禜 No LYRA data - LYRA paving campaign?? - combined with SWAP mosaic campaign??e+%RIMMM| No LYRA data - LYRA paving campaign?? - combined with SWAP mosaic campaign??A*_RIM东M东M No LYRA data - Proba2 propulsion campaignA)_RIM东M东M No SWAP data - Proba2 propulsion campaign7(KRIN 0N 0N No SWAP data - SWAPLED campaignA'_RI}M)$M)$M6D No LYRA data - Proba2 propulsion campaignA&_RI}M)$M)$M2 No SWAP data - Proba2 propulsion campaignE%gRI}M,M,M No LYRA data - corrupted data in BINLYRA_49053$CRI|MhMhMϬ No SWAP Data - ESP campaign:#QRIl N N N  No LYRA image capture - P2 in Bdot:"QRIkN N N @ No SWAP image capture - P2 in Bdot '` D}UG>kSaS2S2S2 LYRA dark current stored in standard fits files6=IS>MMM LYRA U3 flare hunting campaign6<IS>N7TN7TN8 LYRA U3 flare hunting campaign6;IS>O7DO7DO9@ LYRA U3 flare hunting campaign6:IS>sOOO:( LYRA U3 flare hunting campaign69IS>ROdOdOz LYRA U3 flar66IS>QGlQGlQ LYRA U3 flare hunting campaign67IS>QhhQhhQi  LYRA U3 flare hunting campaign68IS>2P&P&P LYRA U3 flare hunting campaign69IS>ROdOdOz LYRA U3 flare hunting campaign6:IS>sOOO:( LYRA U3 flare hunting campaign6;IS>O7DO7DO9@ LYRA U3 flare hunting campaign6<IS>N7TN7TN8 LYRA U3 flare hunting campaign6=IS>MMM LYRA U3 flare hunting campaignJkSaS2S2S2 LYRA dark current stored in standard fits files 4 fox*#,5>G4>PHYRb\ku~ S2 O7D O Od P& Qhh QGlN{1PNwP NH7Np2N>T3NB N4N 5NDONDNeGNpNNx6OO#\O+tO-SOWBOWBOe/Oe/Og(OʼOʼOMPu( Q`g Qh՚ Q|QPc QJQ6Q6Q] R mR"/+R#,R#UD-R#.R.y1 Rz RͶt Rx S d 4 fox*#,5>G4>PHYbR\ku~ S2 O9@ O:( Oz P Qi  QN{N N7N2Nl3N|,N4N:5NONݤDNߍGNjNN|T6O4O#O,O/}OWOWOg(Og(OhGOoOOPvg Qba$ Qi QjQ Q)QY|QY|Q% R JR"+R#Q@QC4!QӍQQQ\"QӍQ`QPQ#QӍQXQ Q8$QӍQiHQnQq%QӍQՐQQٌ&QӍQhQHQd'QӍQ`QaQc (QӍQdQhHQj()QӍQtQQ*QӍQUQVQWH+QӍQ\QQ,QӍQ 4Q Q P-QӍQ Q  Q .QӍQ $Q %Q &h/QӍQ ZpQ ]Q `L0QӍQ Q Q  $X~dJ0z`F,v\B(rXQQ Q#Q-lQQhQ Q8QQQ`Q@QQ`QQ0QQ8QQTQQpQrdQtQQaQbQdQQ^Q^Q_QQ(Q.0Q1QQQQQQBQEQHpQQ pQPQL QQQQ8 QQހQQ QQϼQQ QQpQ$Q QQ1Q2Q4QQXQQQQQQDQQQQQQpQQQQ{Q}QQQQQQQRQRQSQQ!@Q# Q%<QQpQQQQ@QQ<~QQQtQd}QQpQqxQr,|QQ4Q`Q{QQcQdQezQQ(QQyQQ ,Q XQ xQQDQ4QwQQ4Q$QvQQ`QQ| J&0:DNXblv  *4>HR\fpz~tj`VLB8.$ K`x K y K z K! l{ K$ | K%} K%) ~ K%4 K%G K% K%d K& K&p K&ˤ K&ڤ K'  K'ox K' K' K' K( K(1 K(Q, K(L K( K(x K(0 K( K(0 K)R K) K) K) K*` K*G K*b K* K, K,( K,} K,w  K,. K,& K," K, K, K, K+ K+ K+ K+, K+` K+ K+ K+X K+ K+dp K+Y K+2 K+  K* K*, K.  K.1 K.EP K.` K. K.  K.p K.< K.t K/  K/< K/M8 J&0:DNXblv  *4>Hzpf\R$.8BLV`jt~ K/c K/p$ K/ K/Ơ K0 K0 K0$ K07  K0CP K0O K0 K0 K0 K0H K1D K1* K1= K1  K1 K1< K1H K2 K5F K5L K5( K5 K6> K6Q< K6X K7  K7D K<( K< K<, K< K< K<{ K< K> K>  K> K? L K?5 K?S@ K? K?< K?  K@ K@J K@vX K@ K@ K@ K@  K@ KAT KAb  KA  KA KBF KBL KBH KC  KC KD =AEIMQUY]aeinrvz~qu  $(,048<AEIMQUZ^bfj{963!&*.m  <@DHLPTX\`dhmquy}pt #'+/37;@DHLPTY]aeiz~852 %)-l " K/@ K/R` J&0:DNXblv  *4>Hzpf\R$.8BLV`jt~ K/d0 K/r K/@ K/ K0P K0 K0& K08L K0E0 K0RP K0 K0Ȭ K0Ր K0$ K1  K1, K1I K1 K1 K1 K2 K2 K5MP K5 K5@ K6$ K6B< K6R K6Z` K7  K7K K< K<8 KH K>$ K>P K?  K?t K?: K?W K? K?$ K?T K@, K@M K@z K@P K@ K@ K@  K@  KA KAc KA KA KBI8 KBO KB KC KCT KDh $X~dJ0z`F,v\B(rXuQQQQȌtQQQQ0sQQQ0QrQQ@QlQqQQtQdQpQQQQoQQQQӍQ$Q$DQ$?QӍQ$Q$Q$|@QӍQ$dQ$TQ$AQӍQ$Q$Q$xBQӍQ% Q%0Q% CQӍQ%Q%|Q%DQӍQ%EQ%FQ%J0EQӍQ%TQ%Q% $X~dJ0z`F,v\B(rXiQvQ4EQ4FQ4GhQvQ2XQ2HQ28gQvQ2FQ2I$Q2LlfQvQ2Q2Q2eQvQ2Q2 Q2 dQvQ1Q1Q1cQvQ0~Q0hQ0bQvQ0E Q0EQ0FaQӍQ/nQ/pxQ/r`QӍQ/ Q/Q/x_QӍQ/}\Q/4* R\fpz$.8BLV`jt~ KD KFP KGnh KH KH48 KH@ KHcT KHy\ KH KI KI KI/ KI` KI KJ KJZ KJ KJ KJ KJ! KJڀ" KJp# KKp$ KK,% KK54& KKO' KN ( KMߴ KLT KLL KLk KNp- KN. KNP/ KOh0 KP1 KQ2 KQP3 KR4 KR&5 KSg6 KSp7 KS08 KS9 KSP: KTX; KT< KUM= KUY$> KUnx? KU|@ KUA KUpB KU`C KVD KV0E KV=lF KVIG KVnH KVI KV8J KVlK KVL KVM KVN KVO KWP KW,Q KWR KW$S KW8T KW= U KWBHV KWkW J&0:DNXblv H>4* R\fpz$.8BLV`jt~ KD  KFS KGp  KHl KH7 KHD KHgP KH} KHd KI KI#  KID KI| KI KJD KJ\ KJ| KJ KJ| KJX! KJ" KJ# KK$ KK/% KK: & KKU' KN! KM  KM,h KL KLzH KNr- KN. KN/ KOD0 KPA1 KQP2 KQ3 KR 4 KR(5 KSi6 KSsH7 KS8 KS9 KS: KT8; KTp< KUR= KU\l> KUw? KU@ KUA KUB KU C KVD KV4E KVBXF KVNG KVr(H KVI KVpJ KVK KV\L KVϬM KVN KVO KWP KW(Q KW!R KW%S KW:T KW>U KWDV KWmW X~dJ0z`F,rXXXXXXXXX QvQC9QC;lQC< QvQBQBxQB4 QvQBQB@QB QvQB$QB(QB*` QvQAQA\QA,QvQAcQAeQAgvN4QvQ>mlQ>n\Q>n~QvQ>Q>Q>d}QvQ>Q> dQ>4|QvQ>lQ>\Q>{QvQ=Q=TQ=zQvQQvQF44QF4QF5`QvQF/ QF/QF0tQvQEQEQEـQvQEQEQE`QvQEQEHQEQvQE"QE$QE%QvQEtQE(QEQvQDQDQDQvQD-QD.QD/QvQDQDQDQvQCpQDtQD<QvQCQCQCQvQC0QC QCQvQCQCQCpQvQBDQBpQB J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ QZ` QZ)Xb QZA|a QZc QZLd QZe Q[UXf Q[Hg Q[h Q\Di Q\b,j Q\vk Q]5Xl Q]Lm Q]zn Q^Ipo Q^ip Q_ q Q_r Q_s Q_Ոt Q_u Q`v Q`hw Q`xx Q`y Q`4z Q`${ Qa x| Qa} Qa|~ Qa| Qb? Qbք QbH Qb Qc QcV| Qc]H Qcl Qcш Qc0 Qd` Qd) Qdq$ Qd{8 Qd$ QdH Qe&P QeR Qe` Qe Qe Qe( Qe Qft Qf^D Qf Qf0 Qf\ Qf޴ Qf0 Qg= Qg8 Qh>D QhK QhU Qhe Qh Qh Qi#| Qi QiĀ Qi J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ QZ` QZ0`b QZBa QZc QZd QZe Q[Wf Q[g Q[h Q\i Q\f(j Q\{k Q]7tl Q]Om Q]{0n Q^Jo Q^p Q_q Q_r Q_s Q_t Q_Pu Q` v Q`Hw Q`x Q`Ly Q`z Q`p{ Qa&| Qa} Qa,~ QaH QbF Qb Qb| Qb Qcp QcW Qca Qc Qc܌ QdH Qd@ Qd+ Qdv Qd| Qd Qd| Qe7 QeS Qec@ Qe( Qe QeL Qe0 Qf4 Qff< Qf$ Qfp Qf, Qf Qf\ QgF Qg QhI QhQ@ QhY Qhr Qh QhҠ Qi& Qi| Qi0 Qi r X~dJ0z`F,v\B(XXXXXUQvQQ8QQQQhN4PQvQMQMhQMOQvQMlQMQM!@NQvQM QMQMMQvQM QM (QM LQvQLQLQLKQvQLDQL4QL`JQvQL}QL~QLIQvQL_QLaQLbxHQvQLKQLLpQLNPGQvQLFXQLGQLJFQvQLAlQLB\QLCEQvQL0QL1QL3\DQvQLQLQLCQvQLQLQL|BQvQK$QKPQKAQvQKQKQKŬ@QvQKQKDQK4?QvQK~QKQKP>QvQKxQKyQKzp=QvQKkpQKmQKp <QvQKLQKOQKQ0;QvQK9HQK;QK>4:QvQK&LQK'QK*9QvQJQJDQJ8QvQJ(QJQJD7QvQJQJQJ6QvQJ4QJ6QJ85QvQJ HQJQJ4QvQJQJQJ3QvQIQIQIx2QvQIR|QISQIU "# $'(+,/0147:;>?BCFGJKNORSVWZ[^_bcfgjklopstw{|   !"&)-.2569:=>?BCGJKNORSVWX[\_`cdghknorsvwxy|}x%*1FVQvQQ-QQ.\QQ/L J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ Qk Qkp Qk Qk Qlh Ql@  Ql Ql Qmzl Qm` Qm Qm Qn| Qn'd Qn_, Qn Qo  Qo Qo[ Qo Qp3 Qp3 QqV Qq QqΌ Qqߨ QqD Qq Qr  QrI Qr8 Qrp Qs Qs Qs Qs: QsN8 QsS` QsU@ Qss@ Qs Qs Qsx Qs@ Qs Qs QsϘ Qs Qt  Qt1T QtE Qtz8 Qt( Qt\ Qt QtH QtH QuH Qu$$ Qu Qu Qu Qu Qv  Qvr Qv Qv Qv$ Qv  Qvx Qv Qvt Qvx Qv J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ Qk8 Qk~ Qkx Qk\ Ql H QlBx Ql Qm Qmd Qm QmL Qmx Qn Qn)D Qnc Qo  Qo  Qo Qo] Qo QpC QpC QqZL Qqx Qqϸ Qqh Qq Qq\ Qr8 QrMX Qr Qr0 Qs Qs Qs Qs= QsP QsT QsV Qsv Qs Qs  Qs Qs Qs Qs Qs QsD Qth Qt2 QtL Qt| Qt Qt Qt Qt Qt Qud Qu& QuX Qu Qu Qvd Qv  Qvt Qv Qvp Qv Qv Qv Qv  Qv Qv֬ QvT $X~dJ0z`F,v\B(rXQ܆Qf޴QfQfQ܆Qf0QfQf\Q܆Qf\QfQf,Q܆Qf0QfhQfpQ܆QfQfQf$Q܆Qf^DQfc0Qff<Q܆QftQfQf4Q܆QeQeQe0Q܆Qe(Qe$QeLQ܆QeQeQeQ܆QeQetQe(Q܆Qe`QeaQec@Q܆QeRQeSPQeSQ܆Qe&PQe3Qe7Q܆QdHQd`Qd|Q܆Qd{8Qd|(Qd| Q܆Qd$QdQd Q܆Qdq$QdsQdv Q܆Qd)Qd*Qd+ Q܆Qd`QdPQd@ Q܆Qc0QcLQdHQ܆QcшQcTQc܌Q܆QclQcQcQ܆Qc]HQc^QcaQ܆QcV|QcW0QcWQ܆QcQcQcpQ܆QbQbPQbQ܆QbHQb(Qb|Q܆QbքQb8QbQ܆Qb?QbA8QbFQ܆Qa|QaØQaH~Q܆Qa|QaQa,}Q܆QaQaQa|Q܆Qa xQa#Qa&{Q܆Q`$Q`xQ`pzQ܆Q`4Q``Q` $X~dJ0z`F,v\B(rXAQ܆QqVQqX0QqZL@Q܆Qp3Qp:QpC?Q܆Qp3Qp:QpC>Q܆QoQotQo=Q܆Qo[Qo\Qo]<Q܆QoQoQo;Q܆Qo Qo pQo :Q܆QnQoQo 9Q܆Qn_,QnaQnc8Q܆Qn'dQn(TQn)D7Q܆Qn|QnlQn6Q܆QmQmPQmx5Q܆QmQmQmL4Q܆QmzlQmHQmd3Q܆Qm`Qm@Qm2Q܆QlQlQm1Q܆QlQlQl0Q܆Ql@ QlALQlBx/Q܆QlhQlQl H.Q܆QkQklQk\-Q܆QkQkQkx,Q܆QkpQktQk~+Q܆QkQk Qk8*Q܆Qj$)Q܆QiĀQinjQi0(Q܆QiQiQi'Q܆QiQiQi|&Q܆Qi#|Qi% Qi&%Q܆QhQh(QhҠ$Q܆QhQhQh#Q܆QheQhpQhr"Q܆QhUQhVQhY!Q܆QhKQhO$QhQ@ Q܆Qh>DQhC0QhIQ܆Qg8QgQgQ܆Qg=Qg@QgF J&0:DNXblv  *4>HR\fpz~tj`VLB8.$ Qw\ Qw$| QwP Qwl Qw Qw٨ Qx 8 Qx_ Qxt Qxl Qx8 Qx Qy Qy Q|"= Q `4 Q#5 Q66 Q$7 Q8 Q|9 Q,: Qh; Qm< Qt= Q\> Q? J&0:DNXblv  *4>HR\fpz~tj`VLB8.$ Qw Qw% QwRl QwX Qw Qw߄ Qx` Qxj Qxz Qx Qx$ Qx Qy QyB  QyZ Qyft Qyh QyD Qy Qz Qz$ Qz; QzBL QzzP Qz Qz Qz Qz Q{ Q{5X Q{?0 Q{M| Q{ox Q{X Q{| Q{| Q{ Q| Q~"T Q~ې"S Q~ˠ"R Q~ML"Q Q~B"P Q~ `"O Q}"N Q~"M Q}"L Q}"K Q}"J Q}"I Q} "H Q}"G Q}"F Q}t"E Q}"D Q}e"C Q}V"B Q}G"A Q}D"@ Q}94"? Q}4"> Q|"= Q @4 Q'5 Q8$6 Q7 Q8 Q&9 Q/h: Ql; Qp< Qw = Qh> Q? $X~dJ0z`F,v\B(rXeQ܆Qu$$Qu%Qu&dQ܆QuHQuQudcQ܆QtHQt(QtbQ܆QtHQt(QtaQ܆QtQtQt`Q܆Qt\QtLQt_Q܆Qt(QtQt^Q܆Qtz8Qt{(Qt|]Q܆QsϘQstQs\Q܆QtEQtHQtL[Q܆Qt1TQt2DQt2ZQ܆Qt Qt QthYQ܆QsQsQsDXQ܆QsQsńQsWQ܆QsQs@QsVQ܆Qs@QsQsUQ܆QsxQshQsTQ܆QsQsQs SQ܆QsQs`QsRQ܆Qss@QsuQsvQQ܆QsU@QsV0QsVPQ܆QsS`QsTQsTOQ܆QsN8QsNQsPNQ܆Qs:Qs<,Qs=MQ܆QsQsQsLQ܆QsQsQsKQ܆QsQsQsJQ܆QrpQrPQr0IQ܆Qr8QrQrHQ܆QrIQrKxQrMXGQ܆Qr QrQr8FQ܆QqQqQq\EQ܆QqDQqXQqDQ܆QqߨQqQqhCQ܆QqΌQq@QqϸBQ܆QqQqLQqx $X~dJ0z`F,v\B(rX Q܆QzQzQzQ܆Qy4QyQyQ܆Qy(QyQyDQ܆QyfQygQyhQ܆Qyc,Qye QyftQ܆QyUQyXQyZQ܆QyHR\fpz$.8BLV`jt~ Q<A QB Q!C Q8D QaE QtF Q{ G Q0H QXI QJ QK Q\L Q߈M QN QDO QP QtQ QxR Q$S Q$X QT Q&U Q|V Q W QY Q Z Q[ Q \ Q2$_ QP`] Qa^ Q` Q|a Qb Qlc Qלd Qe Qlf Qg Q<h Qti Q&j Q3|k Q6l Qam Qzn Qo Qp Qtq Q@r Qs Qt Qu Q4w Q`v QDx Q ,y Q(z Qc{ Q4| Qp} Q~ Q@ Qp Q!@ QR Q{ Q Qp Q Q QX Q1 Qp J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ QA QB Q%C QhLE QvF Q}(G Q D QH QDI Q0J Q`K Q<L QM QtN Q`O QP QpQ QҔR Q8S Q8X QT Q)U QV QW QPY QZ Q[ Q h\ Q:_ QR] Qd^ Q` Qa Qb Qфc Qٸd Qe Q<f Qg QXh QTi Q(j Q4k Q7l Qdm Q|`n Qo Qp Qq Qr Qs Q0t QȌu Qw Q|v Qx Q y Qz Qe{ Q| Qr,} Qd~ Q< Q Q%< QS Q Q Q Q QD Q Q4 Q ,~dJ0z`F,XXXXXXXXXXXXXXXXXXlR8hN4Q܆Q{Q{Q|Q܆Q{Q{Q{Q܆Q{pQ{$Q{|Q܆Q{(Q{Q{|Q܆Q{}Q{~xQ{XQ܆Q{m\Q{nQ{oxQ܆Q{K`Q{LQ{M|Q܆Q{;Q{=PQ{?0Q܆Q{3Q CQQ!Q#(Q%BQQQtQAQQQQ\QQh=QQtQuQw <QQmQo(Qp;QQhQjQl:Q܆Q,Q.Q/h9Q܆Q|Q"Q&8Q܆QQQ7Q܆Q$QQ6Q܆Q6Q7Q8$5Q܆Q#Q%dQ'4Q܆Q `Q PQ @hN4 ~dJ0z`F,XXXXXXXXXXXXX8hN41QQQ0Q/QQQ@Q.QQQQ-QQcpQmQq,QQY\QZQ]X+QQQ(QRQR*QQ5Q64Q6)QQ3Q4TQ5(QQ/hQ0Q0'QQ&Q($Q(&QQTQ0QL%QQ\QLQ<$QQ Q Q #QQ\Q Q"QQQ4Q`!QQ`QQ QQQLQ<QQp(QuPQvQQHQNQPQQ;0Q=QB8QQdQpQQQPQ@QlQQvQwQy  J&0:DNXblv  *4>HR\fpz8.$BLV`jt~ Qހ Q Q p Q Q( QB Q^ Qa Qp Q8 Q` Q Qh Q  Qv QP Q;0 QH Qp( Q Q` Qd Q Q\ Q  Q\ QT Q& Q/h Q3 Q5 QQ( QY\ Qcp Q Q Q Q"f Q"e Q+x"d Q~"c Q~D"b Qa"a QZh"` Q 0"_ Q"^ Q"] Q "\ Q"[ Q0"Z Q"Y Q"X Q"W QG|"V Q4"U Q Qz Q$ Q Q x Q͈ Q Q% Q0 QQ@ Q Q Q Q  Q ` Q;T Qp Q Q J&0:DNXblv  *4>HR\fpz8.$BLV`jt~ Q Q8 QL Q Q1 QHp Q_ Qd Qt QT Q0 Q@ Q8 Q-l Qy  Ql QB8 QP Qv Q< Q Q Q` Q Q  Q< QL Q( Q0 Q5 Q6 QR Q]X Qq Q Q Q Qx"f Q"e Q,"d Q@"c Q@"b Qd"a Q\H"` Q"_ QH"^ Q"] Q"\ Q"[ Q<"Z Q"Y Q"X Q"W QP"V Q7"U Q Q Q Q8 Q QX Q Q( Q3 QW QT Q Q Q Q)  Q> Q| Q Q ~XdJ0z`F,v\B(rXXXXXXaQQ:4Q;Q<`QQ1LQ2Q3_QQQQ^QQqQrQs]QQ?QBQQQ `Q&Q) PQQ QQOQQQQ@QB}QQQQ|QQ0Q Q{QQhQԔQHzQQQQ\yQQQQxQQQ0QwQQbQd$QevQQ]Q_tQbDuQQ4Q6Q:ltQQ*Q,Q.sQQ Q Q rQQܬQQqQQ xQ%Q'pQQ0QQ@oQQ,|Q3Q6nQQ8Q(QmQQQ QtlQQQQkQQQ|QjQQQQpiQQKQOQQXhQQ!Q&Q(gQQQQDfQQ4QQeQQhQQ(dQQ8QQcQQuQvQy|bQQM0QNQO J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ Q Q Q Q Qx Q Q? Qq Q Q1L Q:4 QM0 Qu Q8 Q4 Qh Q! QK Q Q Q Q Q Q8 Q,| Q0 Q x Qܬ Q  Q* Q4 Q] Qb Q Q Q Qh Q0 Q Q> Q Q@ Q< QW QjH Q$ QwX Q Q8 Q5\ Q9  QL QQ0 Qc Ql$ Qr Q Q Q Q  QD Q*t Q3 Q;T Qj4 Qh Q Q` Q Q/ QL Q` Qo Ql! J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ Q  QŌ Q4 Q Q D QX QCh Qs Q Q3 Q< QO Qy| Q Q Q( Q( QQX QD Qp Q Qt Q Q Q6 Q@ Q' Q Q  Q. Q:l QbD Qe Q Q Q\ QH Q Q QB Qt Q Q t QX Qkt Qx Q Q Q Q8, Q: QN` QR  QfH Qm Qw Q Q( Q QŬ Q4 Q+ Q5 Q< Qn Q Q Q Q Q0 QO0 QdH Qq Qh! $X~dJ0z`F,v\B(rX)QQZQ[Q\(QQҸQQH'QQ8QQ&QQQQ%QQ`Q@Q$QQJQZ$Qc #QQDQPQ"QQ5Q6Q8d!QQlQQh QQQߠQQQ`QQQQQ\QQQ\QLQxQQoQpQqQQ`QbQdHQQLQNQO0QQ/Q0@Q0QQhQQQQj4QlQnQQDQQ4QQ QQŬQQrQu QwQQl$QlQmQQQ0QQQR QQ;TQQQQQx?QQߔQQd@QQZtQc\QfAQQQQBQQTQQCQQQ QtDQQQQEQQUQVXQV J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ Q5" QJ$ QD# Q`% Q& Q8' QҸ( QZ) Qh@* Qo+ Q5"g Q?"h Q"i QȄ"j Q*@"l Qh\"k Q"m QH3 Q 4 Qd5 QP7 Q: Q16 Qd8 Q9 Q1; QKt< QZt= QZt@ Q> Qߔ? QA QTB QC QD Q)F QUE QG QO QH Q0I QP QJ QK Q\L Q M QTN QHQ Q"n Q9"o QJP"p Q"q Q"r Q"s Q"t Q48"u Q[\"w Qw"v Q$"x Q] Q3^ Qˀ_ Q` Q<a Q#(b Q,c QMd QQe Qf Qg Q&h Qz i Qj Qdk J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ Q8d" Qc $ Q# Q% Q& Q' QH( Q\) Qi* Qq+ Q9P"g QH"h Q$"i Q"j QE"l Qk"k Q4"m Q(3 Q,4 Q5 Q7 Q d: Q36 Q8 Q@9 Q4; QM< Qf= Qf@ Qx> Qd? QA QB QtC QD Q1F QVE Q8G QHO QH QɘI QP QJ Q4K QL QM QN Q۰Q Q"n Q<@"o QL"p Q"q Q"r Q"s Q݀"t Q5"u Qn"w Qx"v Q"x Qd] Q5^ Q$_ Q` Q a Q&b Q-c QNd QS4e Qf Q g Q/ h Qi Qj QLk zBB\v,F`FQQ)Q-Q1GQQQQ8HQQQQIQQ0Q QɘJQQQlQKQQQQ4LQQ\QLQMQQ Q QNQQTQDQOQQQQHPQQQhQQQQHQϼQ۰d]QQQQd^QQ3Q4Q5_QQˀQpQ$`QQQXQ X,F`z0Jd~v\B(rXXXXXXXXQmK&ˤK&̔K&HQmK&pK& QK~? QK@ QKA QK$B QLC QLD QL0E QLAlF QLFXG QLKH QL_I QL}J QLDK QLL QM M QM N QMlO QMP QP"< QPK@"; QO": QOz"9 QQ8U QQ-V QQW QS*Y QS4; QKQ0< QKp = QKzp> QKP? QK4@ QKŬA QKB QL|C QLD QL3\E QLCF QLJG QLNPH QLbxI QLJ QL`K QLL QM M QMN QM!@O QMP QP8"< QPM\"; QO": QO "9 QQU QQ/LV QQ|W QS.<Y QSDDX QS0Z QS[ QV \ QV] QV^ Xz`F,v\B(rXXXXXXXXXXXXXMQmK0K0|K0LQmK0OK0Q`K0RPKQmK0CPK0D|K0E0JQmK07 K07K08LIQmK0$K0%K0&HQmK0K0K0GQmK0K0K0PFQmK/ƠK/TK/EQmK/K/K/@DQmK/p$K/qK/rCQmK/cK/cK/d0BQmK/UK/WK/ZAQmK/M8K/PK/R`@QmK/QmK.tK.dK.א=QmK. QFpp QFz QF  QF! QF" QF$# QFD$ QF% QG & QG' QGL) QG( QHG* QHy8+ QH, QH- QH. QHФ/ QH0 QI1 QIU2 QIx3 X~dJ0z`F,rXXXXXXXXXXXXXXqQqbK>,K>HpQqbK=|K=K=oQqbK=8K=K=R8hN4aQmK7DK7GTK7K`QmK7 K7 K7 _QmK6XK6Y4K6Z`^QmK6QK6@\K6B<\QmK5K5pK6$[QmK5(K5K5@ZQmK5LK5xK5YQmK5FK5JK5MPXQmK2K2K2WQmK1HK1K2VQmK1l Q> Q> Q>ml QA "8 Q@0"7 Q@"6 Q?0"5 Q?"4 Q?8"3 Q?78"2 Q?"1 QAc *\\fpz$.8BLV`jt~ Q/r Q/w Q/X Q0F Q0 Q1 Q2  Q2 Q2Ll Q28 Q4G Q5Q Q5 Q5 Q5 Q6p Q6Z Q6 Q6D Q68 Q7 Q7X Q8x Q8 Q: Q< Q< Q Q>4 Q>d Q>n QA"8 Q@"7 Q@\"6 Q?"5 Q@"4 Q?"3 Q?:"2 Q?"1 QAg $X~dJ0z`F,v\B(rXQqbKHy\KHzLKH}QqbKHcTKHdKHgPQqbKH@KHBKHDQqbKH48KH5KH7QqbKHKHKHlQqbKGnhKGoXKGp QqbKFPKFQKFSQqbKDKDKD  QqbKDKD KD QqbKDKDK>,K? sQqbK> K>K>PrQqbK>K>K>$ X~dJ0z`F,v\B(rXXXXXX9QqbKSKSոKS8QqbKS0KSKS7QqbKSpKSrKSsH6QqbKSgKShDKSi5QqbKR&KR(KR(4QqbKRKRKR 3QqbKQPKQKQ2QqbKQKQKQP1QqbKPKP*KPA0QqbKOhKOKOD/QqbKNPKN0KN.QqbKNKNKN-QqbKNpKNq|KNrhN4'QqbKKOKKQTKKU&QqbKK54KK7PKK: %QqbKK,KK-KK/$QqbKKpKKKK#QqbKJpKJ$KJ"QqbKJڀKJ۬KJ!QqbKJKJKJX QqbKJKJKJ|QqbKJKJKJQqbKJKJKJ|QqbKJZKJ[HR\fpz$.8BLV`jt~ KWY KWZ KWά[ KX/x\ KXl] KY^ KY`_ KY\` KYȰa KY,b KY4c KZd KZpe KZ)f KZ>g KZMXh KZ8i KZj KZHk KZl K[m K[(n K[co K[nTp K[q K\=r K\ls K^;t K^W,u K^[dv K_w K_(x K_Uxy K_\z K_b{ K_r| K_} K_~ K` K`  Ka1 Kdi Kd Ke Ke  Kfh Kh Kl Kli Kl Kl Kl` Kl Km4 Km& Km9h KmE Kmv Km Km Km$ Kmߔ Km Km Kn#P Kn2 KnD Kn` KnrL Knl KnH Kn` Kn  Ko\ J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ KWY KWZ KW[ KX2 \ KXd] KY^ KY_ KYh` KYa KYb KYc KZ d KZ@e KZ+f KZBg KZOh KZi KZj KZk KZl K[ m K[*n K[eo K[pp K[q K\Cr K\s K^?t K^Zu K^\v K_!pw K_-(x K_Yty K_`@z K_d{ K_v | K_} K_~ K`8 K` Ka3 Kdk Kd KeH Kel Kfn Ki Kl" Klm KlL Kl Kl KlD Km Km) Km: KmK KmH Kml Kmd KmL Km( Km Km Kn' Kn4l KnGh Knb Knt, Kn Kn KnD Knt Ko  $X~dJ0z`F,v\B(rX]QqbKXlKXKXd\QqbKX/xKX1KX2 [QqbKWάKWKWZQqbKWKWKWYQqbKWKWKWXQqbKW|,KWKWLWQqbKWkKWlKWmVQqbKWBHKWCtKWDUQqbKW= KW>LKW>TQqbKW8KW9KW:SQqbKW$KW%8KW%RQqbKWKW KW!QQqbKW,KWKW(PQqbKWKW,KWOQqbKVKVKVNQqbKVKVKVMQqbKVKVKVϬLQqbKVKVlKV\KQqbKVlKVDKVJQqbKV8KVKVpIQqbKVKVKVHQqbKVnKVp KVr(GQqbKVIKVLKVNFQqbKV=lKV?KVBXEQqbKV0KV3KV4DQqbKVKVtKVCQqbKU`KUKU BQqbKUpKU`KUAQqbKUKUlKU@QqbKU|KUlKU?QqbKUnxKUq KUw>QqbKUY$KU[KU\l=QqbKUMKUNKUR<QqbKTKT߼KTp;QqbKTXKTKT8:QqbKSPKSxKS $X~dJ0z`F,v\B(rXQqbKa1Ka3\Ka3QqbK` K`K`QqbK`K`K`8~QqbK_K_K_}QqbK_K_tK_|QqbK_rK_sK_v {QqbK_bK_cK_dzQqbK_\K__K_`@yQqbK_UxK_VK_YtxQqbK_(K_+K_-(wQqbK_K_ K_!pvQqbK^[dK^\K^\uQqbK^W,K^XK^ZtQqbK^;K^=(K^?sQqbK\lK\K\rQqbK\=K\@K\CqQqbK[K[K[pQqbK[nTK[oK[poQqbK[cK[dK[enQqbK[(K[* K[*mQqbK[K[K[ lQqbKZKZKZkQqbKZHKZKZjQqbKZKZKZiQqbKZ8KZKZhQqbKZMXKZNKZOgQqbKZ>KZ@KZBfQqbKZ)KZ*KZ+eQqbKZpKZKZ@dQqbKZKZKZ cQqbKY4KY$KYbQqbKY,KYKYaQqbKYȰKYTKY`QqbKY\KYLKYh_QqbKY`KYKY^QqbKYKYKY J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ Ko1 Ko>p KoVX Kodh Kogt KouH Koz Ko Ko` Ko0 Ko  Ko$ Ko4 Ko Ko4 Ko8 Ko Ko  KpP Kp& Kp- Kp1 Kp< KpH8 KpM$ KpQ KpV  Kp_ Kpg( Kpm| Kp{ Kp KpX Kp Kp Kpް Kq@ Kq P Kq7 KqE Kq< Kqd Kr KrJp KrM KrZ$ Kr]0 Kri` Kr Kr Krx KrH Ks- Ks=@ Ksa Ks, Kth KtP Kt7 KtX` Kt~X Kt Ku Ku!x Ku9$ KuL Kur Kuw Ku@ Ku Ku Kv Kv KvX J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ Ko4\ Ko? KoX8 Koe KoiT Koy Ko}@ Ko Ko Ko KoX Kol KoP Ko8 Ko KoT Ko Ko( Kp Kp*t Kp0 Kp4 KpE KpKD KpP0 KpS KpW Kpc Kph Kpo\ Kp Kp Kp Kp( Kp Kp Kq Kq" Kq< KqIT Kq Kq Kr KrK KrO\ Kr\ Kr^\ Krk| Kr Kr Kr  Krd Ks0  Ks> Ksb Ks4 Kt8 Kt0 Kt9 Kta Kt8 Kt| Ku Ku# Ku;@ KuN< Kutp Kuy Ku Ku$ Kuٰ Kv  Kv| Kv]h $X~dJ0z`F,v\B(rX%QtKo>pKo?$Ko?$QtKo1Ko2Ko4\#QtKo+Ko-TKo.D"QtKo\KoKo !QtKn KnKnt QtKn`Kn\KnDQtKnHKnKnQtKnlKn KnQtKnrLKnsQtKpV KpVKpW=QtKpQKpSKpS<QtKpM$KpNKpP0;QtKpH8KpI(KpKD:QtKp$.8BLV`jt~ Kvp KwH Kw Kw4 Kw Kw, KxW Kxl  Kx Ky"( Ky$ Kyhx Ky Kzp K{ K{ K|QP K|~ K| K}%0 K~T< K KH K KS K Kt K K  K> KX K0 Kk K$ KqP K K Ko K KB< K& K K` Kٴ K` Kt Kh KK K> K2 K( K" K,# Kg$ Km<% K& KH' K ( K,|) K7* K+ Ko4, Kx- K8. K$/ K+,0 KM1 KS|2 KW3 Ke4 Kx5 K(6 K>7 KD8 J&0:DNXblv  *4\RHfpz>$.8BLV`jt~ Kv Kw Kw Kw6 Kw Kw Kx[ Kxm Kx Ky# Ky( Kyn Ky Kz K{h K{ K|R K|  K|< K}(< K~Z K K K&X Kb KP KD Kp K ` KZd K8 K< Kn K@ Ks K K8 KqT K KR K) K"\ K K K K$ Kk KM KC K5h K, Kh" Kl# Ki$ KpH% K& K' K ( K1h) KNt* K+ Kq, K- K . K'0/ K-H0 KR1 KV2 KX3 Kg4 K5 K"46 KB7 KF8 $X~dJ0z`F,v\B(rXmQtKvXKvZ Kv]hlQtKvKvKv|kQtKvKvXKv jQtKuKuKuٰiQtKuKu4Ku$hQtKu@KuKugQtKuwKuxKuyfQtKurKusKutpeQtKuLKuMKuN<dQtKu9$Ku:Ku;@cQtKu!xKu"hKu#bQtKuKuLKuaQtKtKtKt|`QtKt~XKt Kt8_QtKtX`Kt]LKta^QtKt7Kt8Kt9]QtKtPKt@Kt0\QtKthKtXKt8[QtKs,KsdKs4ZQtKsaKsbKsbYQtKs=@Ks=Ks>XQtKs-Ks.Ks0 WQtKrHKr8KrdVQtKrxKrXKr UQtKrKrhKrTQtKrKrhKrSQtKri`KrjPKrk|RQtKr]0Kr]Kr^\QQtKrZ$Kr[Kr\PQtKrMKrNKrO\OQtKrJpKrK$KrKNQtKrKrKrMQtKqdKqKqLQtKqHR\fpz$.8BLV`jt~ K\: Kj; K< K K̴ K Kwd Kr K` KI K!$ K K K Ka K_ K KK K,L KM KuN KhO KLP KQ K\R KdS K T K|U K3V K9W Kj X KtY KZ K[ K6\ KA] KT`^ Kc_ KkX` Kr`a Kb Kc Kd KDe K,xf K\g K|(h KPi Kj K4k Kl Km Kn KӰo K8p KGxq Kr Ks K"$t K9u Kݤv K w K@x Kmy Ksz Kzp{ K| Kh} K ~ K"0 K6X KDh KL` Ka J&0vlbXND:  *4>HR\fpz$.8BLV`jt~ K_`: Kn$; K< K8 K KD KyD Kt Kd KL K,d K K` K Kc Ka K KLK KL KM KwN KO KP KQ KR KS K T K%8U K5dV K=W KnX KTY KZ K[ K9\ KG] KX^ Kg\_ Kl` KwLa Kb Kc Kd Ke K08f Keg K~h K0i KHj KPk Kl K m K n Ko Kp KHq Kr Ks K$|t K;tu Kv Kw KEx Kr<y Kvtz K|{ K| K} K (~ K$ K88 KF  KN Kc `XF,v\B(rXXXXXXXXXXXXXXX5QxKxKK4QxKeKfKg3QxKWKX,KX2QxKS|KTKV1QxKMKQ`KR0QxK+,K,K-H/QxK$K%K'0.QxK8KK -QxKxKK,QxKo4Kp$Kq+QxKKK*QxK7KF|KNt)QxK,|K.K1h(QxK KK 'QxKHK(K&QxKK\K%QxKmK@KB6QxK(K!K"4 J&0:DNXblv  *HR\fpz>4~tj`VLB8.$ K K K Kp KL K< K KM K K̄ Kt K" K3 K? K K: KL K2 K  K$ K K0 K K? K Kx K Kd K0 Kߥ Kw K!| K/@ Kۅ Kۺ K K KM Kݕ Kݦ Kݼt K K K KѸ KѸ K KE K l K)H K K K Kᘔ Kk KX\ K- K K KqD KH K+l Kd Kی K_ K4 K< K K K K K K" K+ J&0:DNXblv  *HR\fpz>4~tj`VLB8.$ K\ K K K KX K Kx KO\ K KT K K# K68 KCX K K_@ K K4l K K@ Kh K K KRh K K K K K Kߧ< Ky K# K1 Kۇ$ Kۼ Kd K KP Kݘ  KݨL Kݿ K Kh KH K K K KFp K Kʇ K8 K` K8 K Kmt K]H K/ K  KŤ K KLx K.< K4 Kl K`p K` K K$ K KX K K K'\ K-t $X~dJ0z`F,v\B(rX}QxKhKK|QxKK0K{QxKzpK{`K|zQxKsKu KvtyQxKmKolKr<xQxK@KCKEwQxK KKvQxKݤK|KuQxK9K:HK;ttQxK"$K"K$|sQxKKhKrQxKKKqQxKGxKH,KHpQxK8KKoQxKӰKdKnQxKKhK mQxKKXK lQxKKLKkQxK4K`KPjQxKKKHiQxKPK|K0hQxK|(K~K~gQxK\KbKefQxK,xK-K08eQxKDKKdQxKKKcQxKKKbQxKKlKaQxKr`Ku0KwL`QxKkXKlHKl_QxKcKeKg\^QxKT`KV@KX]QxKAKDKG\QxK6K74K9[QxKKXKZQxKKPK !r~dJ0z`F,v\B(rrXX Q|8KdKTKQ|8KKtKQ|8KxK,KQ|8KK$KQ|8K?KLKRhQ|8KK8KQ|8K0K\KQ|8KKHR\fpz$.8BLV`jt~ KM K< Kð KT K K K K K  K검 Kv KN Kl K]0 KH Ky| K Kp L L L LH L L L  L 4 L E4 L)@ L<< LH L$ L0 LS$ L L LL LD L, L$ L LM L? L L L L L L$ L L  LB0 Ll Lu L L L4 Lh L L$ L L L L L Lx L{P LX L%< L L\L Ll L_H L L J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ KQ K K KH K, K K K Kl K Ky KR K< K  K K( K KL L Lp L L Ld L L l L  L H L, L>X LK L4 L(@ LVl LH L LX L LH L LD LQ LA L < L L܈ L Lh L&0 L L% LC Lp  Lv L LH L L LP L L  Lh Lh LD L  Lz` L} Lt L'X L$ Lb( Lo Lad L L X~dJ0z`F,rXXXXXXXXXXXXXXXXXEQK_K_K`pDQKیK|KllR8hN44QKEKEKFp3QKKK2QKѸKlK1QKѸKlK0QKKKH/QKKHR\fpz$.8BLV`jt~ L L L!0 L!< L$ L%0 L%7 L%i! L&" L)}# L*$ L-h% L5' L2& L4( L4\) L4* L44+ L5= L2 L7T# L7w" L79p! L7 L6l L6~ L6e L6K L8Ҩ6 L8X7 L9X8 L99 L9: L:; L:< L:= L;> L;t? L<$D@ L<:A LF L? G L?pH L@<I L@|J LAK LCTL LCTM LCLN LCO LCDP LDdQ LE! R LE-S LEiPT LEU LEV LEW LEPX LF^Y LFxZ LF[ LF\ LF] LG^ LG#_ LG@,` LG a LGb LGc LGd J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ L , L!\ L!h L$ L%2\ L%; L%kP! L&`" L)~# L*$ L- % L5+D L2 L4t( L4) L4* L5+ L5A L3` L7# L7" L7>! L7 L6 L6( L6g L6P L86 L87 L98 L9`9 L:: L: ; L:L< L;= L;> L;4? L<%@ L<<A L*xF L? hG L?H L@I L@J LAPK LCV8L LC4M LChN LCO LDpP LDQ LE"R LE4XS LEtTT LEU LEV LEW LEX LF`Y LFz Z LF[ LF\ LF] LG^ LG$_ LGB` LG<a LGb LGc LG d X~dJ0v\B(rXXXXXXXXXXX QLLLh QLL۴Lh QLLΔL  QL$LL QLLLPQLhL LQL4LLQLLLHQLLxLQLuLvtLvQLlLnLp QLB0LBLCQL L"L%hN4vQL$LLuQL,LLHtQLDL`LsQLLLLXrQLLdLqQLLLHpQLS$LTLVloQL0L#TL(@nQL$LL4mQLHLJLKlQL<XkQL)@L*lL,jQL E4L GPL H \~dJ0z`F,B(XXXXXXXX\\\hvNv4v+QYL44L5`L5*QYL4L4\L4)QYL4\L4LL4(QYL4L4XL4t4%QYL-hL-XL- $QL*L*L*#QL)}L)~ L)~"QL&L&¬L&`!QL%iL%jL%kP QL%7L%8L%;QL%0L%1L%2\QL$L$ L$QL!4*  HR\fpz$.8BLV`jt~ LH_Hf LHi g LH}h LHXi LHj LHk LIW@l LI0m LJX\n LJlHo LKMp LKq LLxr LL׀s LM t LMu LM&v LMs\w LMXx LMy LMz LP, LP'+ LOt* LOq) LO/( LN' LN\& LNV% LN/$ LP8 LQ LR%x LR7  LR LS4, LSR LS LST LS߀ LT LTl  LT LU(T LUh LVG4 LV| LWD LX LX8 LX  LX$ LXJ\ LX LX LXՔ LY/ LY( LYd LZ L[!d L[9 L[a L[mT L[8 L\(\ L\( L\l L] L] L^` L^l L_dh L`[ J&0:DNXblv>4*  HR\fpz$.8BLV`jt~ LHaf LHng LHh LHi LHj LHk LIZl LIm LJZ<n LJndo LKOp LKLq LLr LLs LM xt LMu LM)Lv LMu<w LMtx LMy LMz LP, LP-T+ LP4* LOs<) LO5( LN' LNa& LN[% LN3$ LP LQ͔ LR& LR?@ LRp LS6 LSU8 LS4 LSP LS  LT"L LTx LT LU? LU LVK LW LWh LX LX LX  LX'p LXL LX4 LXx LX8 LY54 LY LYD LZ$ L[5 L[;h L[k L[n L[| L\+ L\@ L\ L]$ L]( L^j L^ L_i L`]P  X~dJ0z`F,v\B(rXXXXXUQYLELELETQYLEiPLEohLEtTSQYLE-LE2L>"DL>*xEQYL=TL=L=DQYL=L=L=(CQYL=:xL=;L==HBQYLQYL;L;@L;=QYL:L:L;<QYL:L:L:L;QYL:L:L: :QYL9L9 L:9QYL9L9L9`8QYL9XL9L97QYL8XL8L86QYL8ҨL8LL8hN4 $X~dJ0z`F,v\B(rXyQYLMLMLMxQYLMXLMHLMtwQYLMs\LMtLLMu<vQYLM&LM'LM)LuQYLMLMLMtQYLM LM LM xsQYLL׀LLpLLrQYLLxLLLLqQYLKLKLKLpQYLKMLKNLKOoQYLJlHLJm8LJndnQYLJX\LJYLLJZ<mQYLI0LILIlQYLIW@LIY LIZkQYLHLHxLHjQYLHLH LHiQYLHXLH8LHhQYLH}LH~tLHgQYLHi LHkHR\fpz$.8BLV`jt~ La@ La LbW Lb Lb Lb8 Lb Lb4 Lc@ Lcu Li6 Lfͬ4 Lfc3 Lf2 Le1 Le0 Le/ Le. Led- Lg; Lg@ Lg Lh Lh0 Lh7P Lhj Lh LhX Lh LhP Li"( LiC LiV0 Lihx Li~D Lj7 LfT5 Ll[? LkeL> Lk= Lj@< Ljg; LjE@: Lj'|9 Lj8 LvF$ Lv Lv Lw Lw  Lw.h Lw@ LwH Lwp Lx Lx9\ LxBD Lx[ L{ L}y L}t LH Lp L8 L, Lp L Ld LX$ Lk L~X LP LՈ L J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ La La` LbY LbT Lb, Lb Lbx Lb` LcC Lcw Li$6 LfP4 Lfpd3 Lf2 Le`1 Le0 Le/ Le. LesD- Lg=x Lg Lg Lh Lh3 Lh: LhlH LhL Lh Lh( Lh Li&$ LiF LiY Lilt Li Lj 7 Lf5 Lla|? Lk> Lk'= Lj< Ljk8; LjH: Lj/9 Lj8 LvI Lv Lv Lw $ Lw Lw4D LwC LwJ LwP Lx0 Lx;x LxC Lx^ L{x L}zp L} Ld Lq LT Lp L Lx LD LY Lmx L L Lִ L Xz`F,v\B(rXXXXXXXXXXQ LXՔLXHLX8Q LXLXLXxQ LXLXLX4Q LXJ\LXKLXLQ LX$LX&LX'pQ LX LX LX Q LX8LX(LXQ LXLX,LXQ LWDLWLWhQ LV|LVlLWQ LVG4LVHLVKQ LUhLULUQ LU(TLU/LU?Q LTLTLTQYLTl LTtLTxQYLTLTLT"L QYLS߀LS`LS  QYLSTLSLSP QYLSLSLS4 QYLSRLST LSU8 QYLS4,LS5LS6QYLRLRLRpQYLR7 LR8tLR?@QYLR%xLR&,LR&QYLQLQ˴LQ͔QYLP8LPxLPhN4zQYLMLMLM ~dJ0z`F,v\B(XXXXXXXhN4:Q LcuLcvLcw9Q Lc@LcALcC8Q Lb4LbLb`7Q LbLbLbx6Q Lb8Lb(Lb5Q LbLbxLb,4Q LbLbdLbT3Q LbWLbXLbY2Q LaLaLa`1Q La@LaLa0Q L`LL`ڴL`ۤ/Q L`[L`\L`]P.Q L_dhL_fL_i-Q L^lL^\L^,Q L^`L^aL^j+Q L]L]tL](*Q L]L]L]$)Q L\lL\\L\(Q L\(L\pL\@'Q L\(\L\)L\+&Q L[8L[L[|%Q L[mTL[nDL[n$Q L[aL[gL[k#Q L[9L[:L[;h"Q L[!dL[.L[5!Q LZLZLZ$ Q LYdLYLYDQ LY(LYLYQ LY/LY0LY54 J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ L L? L L L L L5 LV Lw L L L L, L Lˀ L0 LA Lp@ L}p LP L L L LLd LY L L L$ L` L9X LZ( L L LA L LN Ls L! Lp" L@# LF$ LL% Lެ& L' L!( Lh) L,* L+ L, L- L. LY/ L0 Ly1 L2 L3 L(4 L5 L6 LX7 LI,8 L`9 Lt: L|; LX< L= L> L? Lt@ LtA LRxB LC L+D LE J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ L  LE L LP L L L8 LX| Ly L L L, L L˜ LL L L%A L\@ L  Lh Ld L L LP$ L[( L< L8 L، L\ L;8 L\D L L LC L LX LuD L0! L|" LC# LI$$ L& L' L % L#( Lj) L* L+ Ll, L$- L. L/ L0 L}1 L2 L3 L4 L|5 Lߴ6 L7 LW8 Lh9 L: L~; L< L= L> LT? Lv(@ Lv(A LaB LC L2LD LE (X~dJ0z`F,rXXXXXXXXXXXXXeQ LwHLwILwJdQ Lw@LwAdLwCcQ Lw.hLw1Lw4DbQ Lw LwLwaQ LwLwLw $`Q LvLvLv_Q LvLvLv^Q LvF$LvGLvIhN4SQ Li~DLi$LiRQ LihxLiiLiltQQ LiV0LiW\LiYPQ LiCLiELiFOQ Li"(Li$Li&$NQ LhPLhLLhMQ LhLhtLh(LQ LhXLh LhKQ LhLh\LhLJQ LhjLhkLhlHIQ Lh7PLh8|Lh:HQ Lh0Lh2(Lh3GQ LhLhLhFQ LgLgHR\fpz$.8BLV`jt~ LϐG L8H LI LpJ LK L?L LTtM L N LO LP LQ LR LS LT L@U LV LTW LVpX LY LxZ L[ L\ L6] LX^ Lf_ Lm` L`a L|b Lc Ld L:e Lf L$Tg LEh L[i L<j L0k Lhu Lv Lw Lx Ly Lz L{ L`| L} Lid~ L L L Lب L` L Lp L L Lu L< LZP L` Lt L_ Lq L{ L L4 L L L LƠ L׀ L- L L x J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ LG LH LI L@J LLK LCL LWDM L N LO LP LQ L(R LlS LT LU LXV LV4W LWX LY LZ L[ L\ L9P] L[^ Lh_ Lq` La L\b Lc L d L<e Lf L*0g LHh Le@i LHj Lk LjXu L<w Lxv Lx Ly LÄz L{ L،| LL} Lo~ L L L L L L\ L L 8 L Ly Lt L^L L0 LT LcD Lt` L} L L L L L L L L. L L  "X~dJ0z`F,v\B(rXXX-QLLL$,QLL¸Ll+QLL|L*QL,LXL)QLhLiLj(QL!L"L#'QLLL&QLެL`L%QLLLL $QLFLGLI$#QL@LBLC"QLpLL|!QLLL0 QLsLtLuDQLNLTLXQLL0LQLALBLCQLLLQLLLQLZ(LZL\DQL9XL:HL;8QL`L@L\QL$LL،QLLLL8QLLL<QLYLZtL[(QLLdLMTLP$QLLLQLL\LQLLLdQLPLLhQL}pL0L 4 QL0L\L QLˀL`LL $X~dJ0z`F,v\B(rXQQLLLPQLLXLOQLL`LNQL LxL MQLTtLULWDLQL?LB,LCKQLLLLJQLpL`L@IQLLLHQL8L(LGQLϐLмLFQLDL4LEQLLLDQL+L.PL2LCQLLLBQLRxL]LaAQLtLutLv(@QLtLutLv(?QLLLT>QLLL=QLLL<QLXLlL;QL|L}L~:QLtLL9QL`Ld\Lh8QLI,LKLW7QLXLL6QLLHR\fpz$.8BLV`jt~ L6 L0 L  LQ Lۈ L Ll L L>` LB L L0 L8 L L2 L( L. LEH Lg L, LL L>l Lc L L L L LP L"x L3 L= LՈ L", L[  L4 L L Lx  L L L LC L L L L*0 Lߘ L\ L:L L Lh L L# L,h L: LB4 La$ Lk LĊ Lħ L L L:h Lo` Lł LŇ  L LH L L)x L9h LF LF LX J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ L8 L L LS\ LX L Lx L L? LEh L L L\ L L5 L L4 LI L LT L  LA< Lx L L L L` L L%H L4 L@ LX L+ L\L L L\ L\ L| L| L LP LF$ L L LD L+ L< L LF L L L" L%$ L3 L< LC Lc Lm LČD LĪ L| L L>d Lyt Lńx Lňt L L L%| L, L: LH LH LY rX~dJ0z`F,v\XXXXXXXXXXuQ\LhLiLjXhN4kQL0L LjQLlL?LA</Q\LLLL .Q\L,LtLT-Q\LgLyL,Q\LEHLGdLI+Q\L.L2L4*Q\L(LDL)Q\L2L4L5(Q\LLL'Q\L8LָL\&Q\L0LL%Q\LLL$Q\LBLDxLEh#Q\L>`L?L?"Q\LLL!Q\LlLLx Q\LLLQ\LۈLHR\fpz$.8BLV`jt~ LvX LƂ Lƌ LƐ Lƻ| L  LWX L_ LǼ LX L L L0 L$l L/4 LZT Lȟ< LLp L#\ LN LQ L\P Lj Lʲ L L  L˓ L˛L Lˡ LˮH LŸ LT L L` L޼ LD L L1 Lͯ L L۠ L L` L2 LC LΈ L LϽ L  Lб L LPd LX L LB LאC LD LE LF L,hG LAH LT@I LvJ LӣK LӺ4L LtM LڌN LO LP LNQ Ld R LԒS LԺ`T LՐU LۨV L W LX M&0:DNXblv  *4>HR\fpz$.8BLV`jt~ Lx LƅX LƎ@ Lƒ LƼ L LZ L` Lǿ, L L Ll L L&L LdXQ\LLhLWQ\LL(L|VQ\LħLĩLĪUQ\LĊLċLČDTQ\LkLlLmSQ\La$LbLcRQ\LB4LBLCQQ\L:L<L<PQ\L,hL.L3OQ\L#L$pL%$NQ\LL 8L"MQ\LhLLLQ\LLLKQ\L:LLATLFJQ\L\LxLIQ\LߘLL<HQ\L*0L*L+GQ\LLLDFQ\LLLEQ\LLLDQ\LCLDDLF$CQ\LLLPBQ\LL LAQ\LLDL|@Q\Lx LzL|?Q\LL0L\>Q\LL0L\ $X~dJ0z`F,v\B(rXQ\LTLLQ\LŸLL,Q\LˮHL˯tL˰(Q\LˡLˢLˣQ\L˛LL˜L˜xQ\L˓L˕pL˖Q\L LL~Q\LLL}Q\LʲLʳDLʴp|Q\LjLlLm{Q\L\PL]L_ zQ\LQLRLSyQ\LNLNLOlxQ\L#\L%4*  zpf$.8BLV`jt~ Lِ LCv Lba L Lh? L@ LA LڌB LڧC LxD L٤E LF L G L(Du Lt Lls Lr L̠q Lܸp Lܘ o L܂n LVDm LBl L;Pk Lj LXi Lh Lpg Lۼf Lۗe Lzd Ls(c LOb L߹8 Lߦ Lߣ0 Lu LR L$(~ Lp} L| L{ L޶<z Lv@y Lg@x L+w Lk Ll L m Ln LEPo L$p L<q L<r L8s L.Ht L|u Lpv L!w L[tx L$y L䕄z L { L| L} L$~ L L Ld LL L8 LD L L/\ S&0:DNXblv\RH>4*  zpf$.8BLV`jt~ L4 LIPv Lcxa L=` L_ L^ LթZ Lַp] L@\ L[ LؤT< L= LT> L? L t@ L"A LڔDB LڪC LHD L E LF L$,G L-lu L%tt Lxs Lr L@q Lܽp Lܚxo L܈n LXm LEdl L>\k LTj Li Lh Lg Lf Lۛe Lہtd Lxc LTb L߼ L߫d Lߦ< Lw\ LZ L(~ L} Lи| L̀{ L޹ z L{,y Lix L.Lw L|k Ll L m L$n LH o Lp LXq Lr Ls L0t L u L\v L&w L\x L@y Lz L<{ L,| L} L&~ L咤 L  Lf  LP L糐 L$ L镬 L2h ~dJ0z`F,XXXXXXXXXXXXXXlR8hN4Q LL LLQ LXL^LhQ LPdLSLV|Q LLLxQ LбLQ LRLSLT?Q LhL L@Q LLhL tAQ LL(L"BQ LڌLڐLڔDCQ LڧLک LڪDQ LxLʤLHEQ L٤LXL FQ LLLGQ L L"L$,hkQ LL(L|lQ LLLmQ L L L nQ LLXL$oQ LEPLFLH pQ L$LLqQ LHR\fpz$.8BLV`jt~ LT LT L Lh L L L L L L,  L9, Lp@ Lt L$ LP L LS\ L L L L[ L`0 L L L LԬ L L L L2 Ln L L L L  L L$ L| L LT L L  LHp Ld LL L( L L! L3  LM Lo LH L L< L MJ, Mz M\ MC\ M M= Mp M M$ MC M_ M MҌ M ? ENNXblv  *4>HR\fpz$.8BLV`jt~ L L4 L L L| L L0 L L L/T L<8 Lr  L L L L LU< LX L L L^ Ld Lt L L LL L L| L L8 Lqx L  L L L L  L L L L` L L LJ L L L L L% L4 LN Lu L LH L L MK M|p M^` Mx MH M@ M! Md Md MF Me M MӸ M Ah (B\v,F`z0Jd~yQ L$LPL@zQ L䕄L8L{Q L LLL<|Q LLxL,}Q LLL~Q L$L$L&Q LL呴L咤Q LLL Q LdLeLf Q LLLNPLPQ L8L(L糐Q LDLpL$Q LL锼L镬Q L/\L0LL2hQ LnLpLsQ LTL@L Q LTLDL4 Q LLL Q LhLL Q LLL| Q LLXLQ LLL0Q LLՠLQ LL8LQ L, L,L/TQ L9,L:XL<8Q Lp@LpLr Q LtLdLQ L$LL $X~dJ0z`F,v\B(rXKQҥMlMlMlJQҥMlZ(MlrLMlxIQҥMl+Ml8,Ml=THQҥMlTMlMlGQҥMlTMlMl4FQҥMkMkĠMkDEQҥMk(MkpMkDQҥMkMkMkxCQҥMkwMkxMkzBQҥMklMkp@MkrAQҥMkOMkPMkQP@QҥMkH,MkJHMkK?QҥMk@MkBMkE\>QҥMk1pMk3Mk50=QҥMk!Mk$PMk%<QҥMkMkMk;QҥMjMjHMkt:Qҥ|M]XM]M]9Qҥ|M]ClM]DM]F8Qҥ|M]|M]0M]7Qҥ|M\M\M\6Qҥ|M\|M\0M\ 5Qҥ|M\0M\M\4Qҥ|M\לM\،M\ٸ3Qҥ|M\ðM\dM\T2Qҥ|M\ M\M\1Qҥ|M\\M\M\h0Qҥ|M\M\M\/Qҥ|M\|M\}M\~.Qҥ|M\WhM\jM\t-Qҥ|M\<8M\=dM\>,Qҥ|M\/TM\0DM\14+Qҥ|M\%|M\' M\(*Qҥ|M[M[M[)Qҥ|M[M[HR\fpz$LB8.~tj` M0  M ۼ M I M ' M l M  M  M  M  M  Ml M MX MT M? Mq M@ MYx M, M, M. Mgx Mr| My Mn4 M\ M M ?D M < M ̘ M \ M!R0 M! M!Ҡ M!, M"G M"[ M"H M" M" M"Ґ M" M" M#x M# M% M$T M&W M& M'-@ M(+ M) M*  M* M*ؠ M+  M+Z M+o M+H M,; M, M,h M.; M. M- M,$ M  M0X M0 M0n M0F M/ M/ M/  M. M.ʌ M., M.0 M0p M17, M1: M1@ M1Tx SV&0:DNXblv  *4>HR\fpz$LB8.~tj` M0٨ M \ M LL M ) M D M  M  M  M  M  M M4 Mʄ Mެ MI My M M\ MX M  M1T Mm Mu M{ MpP M MH M C M X M  M  M!T M!  M! M! M"N$ M"_ M"t M" M" M"` M", M"  M#yp M#d M%, M$ M&Y M&8 M'2h M(- M)p M*Ȱ M* M* M+L M+] M+v  M+ M,> M, M, M.C M.% M- t M,P M  M0t M0  M0rL M0N M/( M/( M/ M. M.L M.( M.L M0 M19  M1< M1B0 M1V $X~dJ0z`F,v\B(rX9QLMLNLN8QL3 L3L47QL!L#XL%6QLLL5QL(LL4QLLLL3QLdLL2QLHpLILJ1QL L(L0QLLDL/QLTLL`.QLLpL-QL|L0L,QL$LL+QLLL *QL L L)QLL`L(QLLL'QLLL &QLnLpLLqx%QL2L5L8$QLLL#QLLL|"QLLL!QLԬLPLL QLLpLQLL`LQLLLtQ L`0LbLLdQ L[L]$L^Q LLLQ LLLQ LLhLXQ LS\LTLU<Q LLLQ LPLL X~dJ0z`F,rXXXXXXXXXX]QMqMxMy\QM?MEMI[QMTMDMެZQMXM MʄYQMMM4XQMlM\MWQM M $M hN4MQM MM OM@CQMMMHBQMC\MkpMxAQM\M]M^`@QMzM{M|p?QMJ,MJMK>QLLL=QLHR\fpz$.8BLV`jt~ M1u M1h M1 M1l M2  M2 ` M21 M2 M2l M3 M3; M3 M3 M4p M4- M4: M4@ M4w M4 M4 M4\ M4ϐ M4d M4 M5< M69 M6I M6P M7u` M8K M8, M8 M8 M8  M9 M9, M9W M9cp M9r M9vl M9 M9l M9h M9 M9 M: M:., M:90 M:x< M: M:0 M: M;* M;V M; M;p M< M< MB M?kD M? M?! M?T" M?(# M@:8$ M@SL% M@rx& M@' L&0:DNXblv  *4>HR\fpz$.8BLV`jt~ M1w M1  M1t M1 M2 M2#l M23  M2D M2 M3 M3> M30 M3 M4l M41  M4> M4B< M4|  M4 M4@ M4 M4 M4 M4d M5h M6= M6M  M6 M7w M8N, M8 M8 M8 M8X M9 p M91H M9[ M9g0 M9t M9y M9 M9L M9 M9޸ M9 M:P M:2( M:; M:zX M: M:ô M:܌ M;-, M;\ M; M; M<@ M< MC M?m` M?h M?! M?" M?T# M@;$ M@Tx% M@u & M@' $X~dJ0z`F,v\B(rXQMQMQ MQtQMQ8MQMQQMQhMQHMQ~QMQVMQWMQX}QMQ*(MQ+MQ,|QMQMQdMQT{QMQhMQ MQ zQMPMP(MPyQMP MPHR\fpz$.8BLV`jt~ M]X M]Cl M]| M\ M\| M\0 M\ל M\ð MU  MU  MU`  MUT  MU  MV  MV+  MVe$  MVr MVs4 ! MVh " MV| # MV¨ $ MVό % MVۼ & MV ' MV$ ( MW'p ) MWO * MWs$ + MWL , MW - MWΌ . MW / MX 0 MXB 1 MXJL 2 MXLh 3 MX 4 MX 5 MXP 6 MX 7 MX 8 MX$ 9 MY$ : MY" ; MY2T < MY\ = MYd@ > MY ? MY8 @ MYP A MYD B MY` C MZ D MZO E MZ` F MZ G MZ8 H M[ I M[! M[) M[. M[c0 M[l M[~$ M[ M[ M[ M[ M[ M\%| M\/T M\<8 M\Wh M\| M\ M\\ M\  M] e M]` f M] g M^4 h Q&0:DNXblv  *4>HR\fpz$.8BLV`jt~ M] M]F M] M\ M\  M\ M\ٸ M\T MU  MU  MU@  MUl  MUH  MV   MV0  MVg  MVu ! MV MV\ " MV # MV, $ MVդ % MVݜ & MV8 ' MVx ( MW* ) MWQ * MW| + MW , MW - MW҈ . MWt / MX 0 MXCD 1 MXKx 2 MXM 3 MX 4 MXh 5 MX 6 MX 7 MXӤ 8 MX 9 MYX : MY& ; MY?8 < MY^ = MYg > MY ? MY @ MYL A MY@ B MY߈ C MZ D MZR` E MZ F MZ| G MZ H M[ I M[# M[,X M[0 M[f M[n M[ M[ M[D M[l M[, M[ M\( M\14 M\> M\t M\~ M\ M\h M\ M] e M] f M] g M^ h (B\v,F`z0Jd~&QMVۼMVܬMVݜ'QMVMVHMV8(QMV$MV0MVx)QMW'pMW(MW**QMWOMWPtMWQ+QMWs$MWuMW|,QMWLMWQMYd@MYeMYg?QMYMYMY @QMY8MYdMYAQMYPMYMYLBQMYDMYMY@CQMY`MY0MY߈ (B\v,F`z0Jd~DQMZMZMZEQMZOMZPDMZR`FQMZ`MZ0MZGQMZMZpMZ|HQMZ8MZMZIQM[M[M[4eQM]M]pM]fQM]`M]M]gQM]M]M] hQM^4M^M^iQM^M^M^!jQM^5M^7M^9kQM^AM^EM^FlQM^HM^I8M^KmQM^cM^cM^dnQM^mM^nM^noQM^{`M^}@M^~pQM^M^M^qQM^M^M^rQM^M^TM^DsQM^M^M^tQM^XM^ M^uQM^M^M^vQM^M^M^|wQM^(M^M^@xQM^M^M^yQM_M_M_zQM_) M_)M_+( I&&0:DNXblv  *4>HR\fpz$.8BLV`jt~ M^5 j M^A k M^H l M^c m M^m n M^{` o M^ p M^ q M^ r M^ s M^X t M^ u M^ v M^( w M^ x M_ y M_) z M_1@ { M_i | M_s } M_x ~ M_p  M_ؘ M_ M_ M_$ M`0 M`dH M`, M`X M` MaSX Man Ma Ma4 Ma¬ Ma, Ma׈ Ma0 MaP Ma Mb) Mb7 Mb9 Mb Mb Mc Mc McX Md Md@ Md MdD Me MfT MfaT Mf` MfP Mf Mf Mfh Mg Mg X Mg: Mg@ Mg MgH Mg| Mh-, MhD$ MhO( MhT Mh I&&0:DNXblv  *4>HR\fpz$.8BLV`jt~ M^9 j M^F k M^K l M^d m M^n n M^~ o M^ p M^ q M^D r M^ s M^ t M^ u M^| v M^@ w M^ x M_ y M_+( z M_4 { M_m | M_ut } M_{P ~ M_  M_ M_ M_ M_ M`3L M`r M` M` M` Maf Mas8 MaX Mal Ma Mat Mah MaL Ma0 Mb Mb+ Mb9D Mb;$ Mb Mb$ Mc Mch Mc8 Mdה Md\ Md Md Me Mf Mfcp Mf Mf< Mf Mf MfH Mg Mg" MgHR\fpz$.8BLV`jt~ Mr4 Mr Mr\ MrT Ms\ Msd Ms| Ms` Ms0 Ms7 MsF MsJ| MsY Msbd MsvP  Ms  Ms  Ms\  Ms  Ms\  Ms0  Ms  Mt Mt Mt< Mt\ MtfP Mt  Mt  MtD  Mt  Mt`  Mt\  Mu,  Mu!X  Mu5D  MuQ  Mut  Mu@  Mu\  Mu  Mu  MvT  Mvp  Mvx  MvH Mvp ! Mv@ " MvX # Mv( $ Mw8 % MwW & Mw} ' Mw ( Mw ) Mw * Mw + Mw , Mx | - MxJh . Mxw / Mx 0 Mx 1 Mx( 2 MxL 3 My 4 MyQ 5 Myl 6 My~ 7 My 8 My 9 My4 : My͘ ; Myٌ < J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ Mr MrL Mr< Mr4 Ms Ms p Ms Ms@ Ms3 Ms9$ MsG MsN Ms\ Msh Msz  Ms  Msd  Msx  Ms  Ms<  MsL  Ms  Mt Mt MtAH MtcD Mtj Mtx  Mt  Mt  Mt  Mt  Mt  Mu  Mu&  MuF  MuT4  Muw\  Mu  Mup  Mu  Mu4  Mv   Mvx<  MvD  Mvd MvP ! Mv " Mv # Mv $ MwB % Mwb & Mw ' Mw\ ( Mwl ) Mwx * Mw + Mw , Mx < - MxP . Mxzt / Mxd 0 MxH 1 Mx 2 Mx 3 My# 4 MyU\ 5 Myo$ 6 Myl 7 My 8 Myd 9 MyP : My ; My\ < ~dJ0XXXXXXXXXXXXXXXXXXXXXXXV<"lR8hN4BQMjLMjMjxAQMjLMjHMjd@QMjXMjHMj8?QMjqMjs\Mjt>QMj_MjbMjd\=QMjTMjMj<QMi@MiMi;QMiɬMiMi:QMiMiMiX9QMiTMiMi8QMifMigxMig7QMiR`MiSPMiS6QMiXMi'Mi-X Xz`F,v\B(rXXXXXXXXX}QMsFMsFMsG|QMs7Ms8Ms9${QMs0Ms2Ms3 zQMs`MsPMs@yQMs|MsMsxQMsdMs DMs pwQMs\MsHR\fpz$.8BLV`jt~ Mz > MzG ? Mz @ MzH A Mz| B M{7 C M{I D M{eh E M{l F M{ G M{ H M{ I M{( J M{ K M{ L M{ M M| N M|Ŭ O M|P P M} Q M}< R M}] S M}pL T M} U M} V M} W M}̤ X M} Y M~t Z M~; [ M~ax \ M~h ] M~l ^ M~ _ M~ ` M~8 a M~ט b M~ c M~@ d M e M$ f M'H g M0l h MK i Med j M k M l M4 m Ml n M0\ o MCX p Mv4 q MT r M s Mh t M$ u Mh v MD w M x ML y M"t z MUP { M | M:< } M; ~ Mo4  M` M MH MD MT M M(x M J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ Mz , > MzIX ? Mz @ Mz A Mz B M{8, C M{Kd D M{h E M{o F M{h G M{ H M{ I M{ J M{ K M{ L M{< M M|#@ N M|0 O M|0 P M}p Q M}Al R M}a S M}rh T M}X U M} V M}( W M} X M} Y M~ Z M~?| [ M~d \ M~k ] M~rX ^ M~ _ M~ ` M~ a M~ b M~H c M~ d M e M f M, g M8( h MM i Mf j M4 k M l M m M n M2 o ME8 p My| q M r MF s MH t M u M v MF w M0 x M y M$T z Ml { M | M;h } M>t ~ M(  M| M M M# MY M\ M* M $X~dJ0z`F,v\B(rX!QMvpMvMvP QMvHMv8MvdQMvxMvMvDQMvpMvu0Mvx<QMvTMvpMv QMuMuDMu4QMuMuMuQMu\MuHMupQMu@MulMu QMutMuuMuw\QMuQMuSMuT4QMu5DMu<MuFQMu!XMu"Mu&QMu,MuMuQMt\MtMtQMt`MtMtQMtMt@Mt QMtDMt$MtQMtMtMtQMtMtMtx QMtfPMti\Mtj QMt\MtadMtcD QMtMtAH QMtMt$Mt QMtMt,Mt QMsMsMsQMs0Ms\MsLQMs\MsMs<QMsMsMsQMs\MsMsxQMsMsMsdQMsMsMs QMsvPMsy\MszQMsbdMsdMshQMsYMs[\Ms\~QMsJ|MsNMsN $X~dJ0z`F,v\B(rXEQM{ehM{g M{hDQM{I M{JtM{KdCQM{7M{7M{8,BQMz|MzMzAQMzHMztMz@QMzMzMz?QMzGMzHMzIX>QMz Mz Mz ,=QMzMz4Mz<QMyٌMyڸMy\;QMy͘MyMy:QMy4My$MyP9QMyMyMyd8QMyMyMy7QMy~MyMyl6QMylMymMyo$5QMyQMyS|MyU\4QMyMy!TMy#3QMxLMxMx2QMx(MxMx1QMxMx,MxH0QMxMxMxd/QMxwMxyMxzt.QMxJhMxLHMxP-QMx |Mx Mx <,QMwMw0Mw+QMwMw(Mw*QMwMwMwx)QMwMw@Mwl(QMwMw0Mw\'QMw}MwXMw&QMwWMw_TMwb%QMw8Mw@dMwB$QMv(MvMv#QMvXMv Mv"QMv@MvMv $X~dJ0z`F,v\B(rXiQMKMLMMhQM0lM4hM8(gQM'HM(M,fQM$MMeQM M MdQM~@M~M~cQM~M~M~HbQM~טM~LM~aQM~8M~(M~`QM~M~M~_QM~M~M~ ^QM~lM~qM~rX]QM~hM~iM~k\QM~axM~cM~d[QM~;M~=M~?|ZQM~tM~(M~YQM}M}M}XQM}̤M}΄M}WQM}M}M}(VQM}M}M}UQM}M}M}XTQM}pLM}qxM}rhSQM}]M}_0M}aRQM}<M}>$M}AlQQM}M}M}pPQM|PM|׸M|0OQM|ŬM|njM|0NQM| M|"M|#@MQM{M{M{<LQM{M{DM{KQM{M{M{JQM{(M{M{IQM{M{xM{HQM{M{,M{ GQM{M{HR\fpz$.8BLV`jt~ M& M2| Mc Mwd Mx M| M M Mp M, M M\ M M M P M9d M8 Mh M3, MB, M] Ml M}< MŨ Mq8 M M'T Mi MM< ML M M MH Ml M M M M.X MJ MOT MX M3 MX M M5 Mh MQ M M MH M M@ M܄ M;4 MCh M\ MP M M M Mq M, Mh Mh dZ F<2( @&0:DNXblv  *4>HR\fpz$.8BLV`jt~ M* M4 MfH Mx Mz M}| Ml M M M M M Ml M8 M%x M; Md M M4 MC M^ Mn< MX Mh Mt M( M( Ml MV$ M8 M M M M M MT M M3D MM MP M M5 MT M` MTL M MV M M M4 M M M MA ME M( MT M M Mt M M M M٠ dZ F<2( $X~dJ0z`F,v\B(rX QMxMyMz QMwdMxMx QMcMeMfH QM2|M3M4 QM&M(M* QMMM8QMMMQM(xM)hM*QMMM\QMTMXMYQMDMM#QMHM(MQMM\MQM`MM|QMo4MM(~QM;M= M>t}QM:HR\fpz$.8BLV`jt~ M@ MC M Mɐ M|t Mc M1 M# M M, M MA MV M^ M| M M M M( M) MB MNT M` M M M Mx M M M) M> MC@ MQ MV< Mb M M Ml M M h M+ MLT MY8 Mm` Mz Mǜ M M Md M| M(h M1 MZ Mp M M  M  M  Mp  M#0  M|  Mx  M@  M< ML M8 MT M M  M_  M  M,  M@  M  M  Mn  MV  M0  Mt  M  M48  Me  M̀  MD  T&0:DNXblv  *4>HR\fpz$.8BLV`jt~ M MG M M` M| Mg  M3 M) Mh M M MC` MX M`p M~ M M M4 MT M.t MF\ MO Mh M M M M M@ M M+ M@4 MDl MU MWh Mf M M M M M M0p MM M\ Mo M M M M M 8 M< M, M6 M]` Mr M M  M  M  M h  M&x  M}  M  M  M M M@l M$ M M(  Mah  M  Mt  M  M  M  Mp  Me  M  M  M.  M8  Mj\  M0  M  X~dJ0z`F,rXXXXXXXXXXXUQ~MAMBpMC`TQ~MMM hN4IQ~M|MMHQ~MhMM٠GQ~MhMXMFQ~M,MMEQ~MqM~MDQ~M MMtCQ~MMMBQ~MM8MAQ~MPMRMT@Q~M\MM(?Q~MChMDME>Q~M;4M>MA=Q~M܄MM<Q~M@MM;Q~MMM:Q~MHMdM49Q~MMlM 8Q~MM4M7Q~MQMSLMV6Q~MhMM5Q~M5MMDMTL4Q~M MDM`3Q~MXMtMT2Q~M3M4M5 $X~dJ0z`F,v\B(rXyQ~MM\MxQ~MM\MwQ~MǜMPMvQ~MzM|`M uQ~Mm`MnMotQ~MY8MZM\sQ~MLTMMMMrQ~M+M-M0pqQ~M hMMpQ~MMMoQ~MlM\MnQ~MMMmQ~MMMlQ~MbMdMfkQ~MVM?M@4gQ~M)M*hM+fQ~MMDMeQ~MMM@dQ~MxMM cQ~MMpMbQ~MMMaQ~MMM `Q~M`MbMh_Q~MNTMODMO^Q~MBMD@MF\]Q~M)M*M.t\Q~M(MMT[Q~MMDM4ZQ~MM$MYQ~M MdMXQ~M|M}M~WQ~M^M_M`pVQ~MVMWMX J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ MA  M M ! Mt " M)P # M6p $ ML % MaT & Mt ' M ( M ) M * M + M , M - M8 . M / MT 0 M 1 MD 2 M0 3 M< 4 MB 5 MI 6 MR 7 MZ 8 M 9 M : MT ; M| < Mp = M!8 > Mv< ? M\ @ M A M B MB C M~ D M E M F M G MѠ H M,T I M0 J M; K MD< L MT M M_ N Mָ O M| P M Q M{ R M S M" T M@\ U M V M| W M X Md Y M0 Z M4 [ M \ M ] M| ^ M _ M, ` MJ a MS b M c MY| d M~H e ML f M g M)` h J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ MFp  M M ! M " M/ # M8P $ MQd % Mh\ & Mv ' M ( M\ ) Mh * M + MX , M - Mِ . M / M| 0 M 1 M 2 M4D 3 M>X 4 MFP 5 MN 6 MS 7 M] 8 M 9 M : M ; M < M = M# > M{ ? M @ M` A M4 B ME C M D M4 E M" F MT G M H M/` I M4 J MA0 K MF L MWt M Mb N Mو O M< P M Q M} R M` S M&X T MB U M V M W M X Mp Y M Z M [ M \ M` ] M ^ M _ M0 ` ML a MZ b M c M[ d MT e M f M g M+ h $X~dJ0z`F,v\B(rXQ~MDMMQ~M̀MM0Q~MeMi0Mj\Q~M48M6TM8Q~MM'M.Q~MtMdMQ~M0M MQ~MVMaMeQ~MnMoMpQ~MMMQ~MMLMQ~M@MMQ~M,MMtQ~MMMQ~M_M`xMahQ~MMM( Q~MMpM Q~MTM4M$ Q~M8MQ~M!8M"dM#=Q~MpM$M<Q~M|MM;Q~MTMpM:Q~MMM9Q~MMM8Q~MZM\M]7Q~MRMS4MS6Q~MIMMMN5Q~MBMCMFP4Q~MX3Q~M0M2M4D2Q~MDMpM 1Q~MM(M0Q~MTM$M|/Q~MMM.Q~M8MdMِ-Q~MMM,Q~M MMX+Q~MM\M*Q~MMMh)Q~MMM\(Q~MMM'Q~MtMv0Mv&Q~MaTMeMh\%Q~MLMNXMQd$Q~M6pM7M8P#Q~M)PM.M/"Q~MtM M!Q~M MɰM Q~MMMQ~MA MDTMFpQ~MMPM J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ M|X j M k M$ l ML m M` n M0 o M p Mb q Mh r M l s Mf t Mö8 u Ms v Mex w Mi x Ml y Mwd z M { M$ | MQ } M ~ MP  MT M6 Mͤ M\ Mj MX Mς$ M@ M M@ M M` M MѠ MѰ Mɀ M M M8 M[ MD M MX, MӴ M M M Myd M{ Mԓ, M Mk$ M M MC M, Ml0 ML M, MzL Ma Ml My M݁ Mݜ MݦL Mރ Ms Mߑ M߷ M Mh J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ M j M k M@ l MO m M n M4D o M p Md@ q MH r M s Mg t M÷d u Mux v Mi w Ml x Mn| y My z MT { M( | MZD } M ~ Mh  M M9` Mͧ M Ml MZ Mσ M Mh M M Md M MѤ MѲ M` M M M;, Mc Mܨ M< M\ Mӵt Mt M M" Mz M}$ Mԭ0 Mp Mnl M Ml MDh M Mm\ MX M?x M܌ Mc Mp M| M݅ Mݞ Mݩ Mމ Mu Mߛ( M߼ M MՄ $X~dJ0z`F,v\B(rXeQ=M~HMMTdQ=MY|MZ0M[cQ=MMpMbQ=MSMVMZaQ=MJMK|ML`Q=M,M.lM0_Q=MMHM^Q~M|M0M]Q~MMM`\Q~M M M[Q~M4MPMZQ~M0MMYQ~MdMЀMpXQ~MMMWQ~M|M0MVQ~MMMUQ~M@\MAMBTQ~M" M$M&XSQ~MMM`RQ~M{M|M}QQ~MM\MPQ~M|MM<OQ~MָM MوNQ~M_MaMbMQ~MTMVHMWtLQ~MDHR\fpz$.8BLV`jt~ Ml MX M&` MAT M\H Mf M MT Mૼ Mൔ M M Md M| M M M. MA MP Mdl M} M M᎜ ML M8 M M M M M M \ M M` M M/ MT M$ M/ M2$ Mu M Mo M| M p M Mnj Md Mg Mm M M- M: M[` MdH M( M\ M M, M] MR M^ M M- Mdp M M M M M M) MB M M} M, J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ MH M M/H ME Mc MoD M M Mଡ଼ M Mڜ M M M M M M0( MC MT| Mp M M Ml M MT M M Md M$ M@ M Md M M) M1 M M M0D M4 M} M\ Ms< M䈐 M! M嬘 Ml Mf Mk$ Mx M M3 MBL M\ Mf M M M  M. Mf MW Md M M0, Mr M M죸 M M M M* MG M4 M Mt $X~dJ0z`F,v\B(rX-Q=MݦLMݨhMݩ,Q=MݜMݝMݞ+Q=M݁M݃$M݅*Q=MyM{hM|)Q=MlMnMp(Q=MaMcMc'Q=MzLM܅M܌&Q=M,M3 M?x%Q=MLMMX$Q=Ml0MlMm\#Q=M,M0M"Q=MCMCMDh!Q=MMMl Q=MMlMQ=Mk$MlMnlQ=MM4MpQ=Mԓ,MԞ0Mԭ0Q=M{M|M}$Q=MydMzTMzQ=M M(M"Q=MMMQ=MM”MtQ=MӴ MӴMӵtQ=MX,MZ M\Q=M MM<Q=MDM$MܨQ=M[M_McQ=M8M:Q=MൔMM=Q=MૼMMଡ଼<Q=MTMM;Q=MMM:Q=Mf MltMoD9Q=M\HM^Mc8Q=MATMC4ME7Q=M&`M)M/H6Q=MXMM5Q=MlMMH4Q=MMM3Q=MhMԔMՄ2Q=MMʼM1Q=M߷MߺM߼0Q=MߑMߕMߛ(/Q=MsMt|Mu.Q=MރMޅMމ J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ M@ MP  MP  M:  MV  MT  M  M)  M<  M M MD M^| M0 M!  M0@  Me  Mp  M  MP  M  M  M  MB<  M_  M@  ML  M  MT  Md  M  M  M~ M ! M, " MP # M# $ MH % M & M ' M{ ( M< ) M * M + M4 , M - M@ . M( / M 0 M$ 1 M1 2 M] 3 M 4 M 5 M 6 M 7 M0 8 M 9 M8 : Nu, ; Nx < N30 = NG > N, ? NH @ N A N& B N$ C N D N#h E Ns F N G N  H N x0 I J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ MD M  M0  M N ? N @ N A N)t B N| C N D N% E Nup F N G N 5( H N y\ I $X~dJ0z`F,v\B(rXuQMM얘MtQMdpMlMrsQM- M.M0,rQMMhMqQM^MaMdpQMRMTMWoQM]Mc8MfnQM,M-M.mQMMM lQM\MMkQM(MMjQMdHMeMfiQM[`M\M\hQM:M?MBLgQM-M/PM3fQMMMeQMmMqMxdQMgMiDMk$cQMdMeMfbQMnjM|MlaQMM婌M嬘`Q=M pM!`M!_Q=M|MHR\fpz.$8BLV`jt~ N o K N L N ZL M N p N N 8 O N  P N ?t Q N e0 R N s S N  T N U N6| V N, W NX X N< Y N Z N! [ N7L \ NJH ] Na ^ Nh _ N2 ` NcL a N b N c N!` d NH e NX8 f N^ g N߰ h N i Nl j N k N l Nd m N,4 n N?l o Nah p Nk q Nv r N s N t Nl u N v N\ w N x N| NL NHp N N N N4 Nq  N NM NԤ N\ N] NgL Nؼ N N N, Ne N N N(\ N< N \ N H N!A N!T N" J&0:DNXblv  *4>HR\fpz.$8BLV`jt~ N x\ K N d L N [ M N N N O N P N A Q N f\ R N v S N T N X U N9L V N W N X N Y N Z N*, [ N: \ NM ] Ne ^ N _ N4 ` Nd a N` b N c N" d NI e NZ f N_ g NT h N@ i N j N k N l N | m N-` n N@ o Nc p Nm q Nx$ r N s N t N< u N` v N< w NH x N  N< NL0 NP NH N@ NӸ Nt N֔ NO N N N_ Nk Nܸ N N N! Ng N N N*< N> N ^$ N N!C N!$ N" $X~dJ0z`F,v\B(rX=QN30N4 N4<QNxN,N;QNu,NvXNw:QM8N N9QMMM88QM0MM7QMM%M)l6QMMLM5QMMM4QMM@M3QM]MaMe2QM1M2dM3T1QM$M%M&40QMMM/QM(MM.QM@MlM\-QMMHM,QM4M|M+QMM֔MH*QMMиML)QMQNGNHNJ J&0:DNvlbX zpf\RH>4* $.8BLV`jt~ N"@ N#/P N$ N$M@ N$ N$4 N'D N'3 N' N& N&l N&H4 N&X N%iP N%bH N(> N( N(D N)H N*Ƅ N*l N,L N,| N-A N- N- N0 N0 N0w N030 N0  N0 N/ N/ N/ N/k N/S\ N/7< N. N. N.P N.n N.1 N.+X N0@ N0 N0 N0 N0 N1 N1 N1 N1' N1@ N1O N1iD N1ut N1 N1d N1ƌ N1 N2\ N2 N2, N27 N2C N2E N2P\ N2\ N2i4 N2px N2 N2\ N2 J&0:DNvlbX zpf\RH>4* $.8BLV`jt~ N" N#; N$  N$P N$ N$Ȉ N'F N'5( N' N& N& N&J N& N%j N%e N(A N(x N( N)I N* N*L N, N,x N-E0 N- N- N0L N0` N0 N0;( N0 N0  N/l N/p N/( N/yT N/U N/EL N. N.T N.\ N.r  N.8 N..( N0x N0 N0l N0, N0d N1 N1 H N1h N1( N1A N1T N1m| N1 N1( N1 N1 N2 N2 N28 N2.` N28 N2D, N2F N2R N2^0 N2j N2q N2 N2x N2 X~dJ0z`F,rXXXXXXXXXQN]N^N_QN\NNQNԤNdNQNMNO NOQNNhN֔hN4xQNNNHwQN\NN<vQNNN`uQNlN׈N<tQNN`NsQNNNrQNvNwpNx$qQNkNlNmpQNahNbXNcoQN?lN@ N@nQN,4N,N-`mQNdN4N |lQNNNkQN N4NjQNlNNiQNNpN@hQN߰NNTgQN^N_@N_fQNX8NYdNZeQNHNItNIdQN!`N"N"cQNNNbQNNpN` X~dJ0z`F,rXXXXXXXXXX)QN*ƄN*N*(QN)HN)HN)I'QN(DN(pN(&QN(N(N(x%QN(>N(?N(A hN4QN$4N$PN$ȈQN$N$N$QN$M@N$NlN$PQN$N$ N$ QN#/PN#7HN#;QN"@N"0N" QN"N"lN" QN"N"N"QN!TN!ļN!$QN!AN!BN!CQN HN 8N QN \N ]pN ^$QNQN(\N)LN*< QNN8N QNNN QNeNfNg QN,NN! QNNNQNNNQNؼNNܸQNgLNi,Nk J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ N3-$ N35 N3U8 N3f N3 N4$, N4H N4R N4]\ N4$ N4 N4 N5`X N5l N54 N5l N5 N5͐ N5( N5 N54 N5 N6h N6Sd  N6_X  N6  N6̐  N6t  N7L  N7$8  N7I  N7j N7u N7 N70 N7 N8  N8  N80  N8Pt  N8X  N8  N8  N8Ό  N8  N8  N9\  N9JL  N9  N9  N9  N:h  N:  N:P  N:c N:o ! N: " N: # N: $ N:` % N: & N; ' N; ( N;!d ) N;# * N;)\ + N;d0 , N; - N;L . N;8 / N;Ą 0 N;( 1 N<* 2 NHR\fpz$.8BLV`jt~ N3.P N36 N3V N3hp N3 N4& N4J` N4X4 N4^ N4 N4h N4Ũ N5bt N5 N5P N5, N5 N5 N5ݼ N5 N5\ N5$ N6 N6Y@  N6`  N6  N6$  N6$  N7#  N7%  N7N  N7k N7{ N7 N7\ N7 N8  N8  N84  N8RT  N8  N8  N8Ť  N8  N8\  N9h  N9  N9V  N9  N9  N9t  N:  N:0  N:R  N:d N:r ! N: " N: # N: $ N:0 % N:d & N; ' N;l ( N;" ) N;% * N;+ + N;hh , N;( - N; . N; / N; 0 N; 1 N<- 2 NHR\fpz~tj`VLB8.$ N< 5 N<, 6 N=(L 7 N=0 8 N=k 9 N=q : N=X ; N=| < N= = N=p > N> ? N> @ N> A N>-d B N>K C N>Yt D N>4 E N> F N?9 G N?Q0 H N?{ I N? J N? K N@p L N@ M N@$ N N@G O N@K P N@\` Q N@j R N@$ S N@d T N@0 U NA6 V NAU W NAg X NAv Y NAì Z NBD [ NBO \ NB[ ] NB ^ NB _ NB\ ` NBt a NCW b NC c NC d ND] e NE$ f NF< g NF h NJ NJ NJN NI NI NIu NI$ NH NH NH NK s NK t NKA4 u NKs v NK w NK؜ x NK y NK@ z NL { NLH | NL[d } NL ~ J&0:DNXblv  *4>HR\fpz~tj`VLB8.$ N<0 5 N=t 6 N=+ 7 N=3 8 N=o 9 N= : N= ; N= < N= = N=| > N>P ? N> @ N>T A N>0 B N>N C N>Z D N>` E N> F N?; G N?Tx H N?\ I N?՜ J N? K N@ L N@ M N@(X N N@H O N@M` P N@a Q N@xD R N@ S N@D T N@ U NA< V NAZp W NAh X NAx Y NAl Z NBFt [ NBR \ NBc ] NB| ^ NBt _ NB ` NB a NC\l b NC c NC d NDd e NE0 f NF g NG h NJ NJ0 NJP NI NI NIw NI* NI NH NHp NK 0 s NK9 t NKLt u NKu v NK w NK\ x NK y NK z NL { NL | NL^p } NL ~ X,F`zv\B(rXXXXXXX QN7jN7kxN7kQN7IN7LN7NQN7$8N7$N7%QN7LN7"N7#QN6tN6N6$QN6̐N6̀N6$QN6N6N6QN6_XN6`HN6`QN6SdN6VpN6Y@QN6hN6N6 QN5N5N5$~QN54N5$N5\0fQN4$,N4%XN4&gQN4HN4IN4J`hQN4RN4TN4X4iQN4]\N4^LN4^jQN4$N4N4kQN4N4,N4hlQN4N4N4ŨmQN5`XN5aHN5btnQN5lN5\N5oQN54N5N5PpQN5lN5LN5,qQN5N5DN5rQN5͐N5PN5sQN5(N5N5ݼtQN5N5N5hN4wQQ4QQvQQ}QLQuQQy8QzQ{ $X~dJ0z`F,v\B(rX-QN;N;N;(,QN;d0N;fLN;hh+QN;)\N;+N;+*QN;#N;$pN;%)QN;!dN;"N;"(QN;N;@N;l'QN; N; N; &QN:N:N:d%QN:`N:N:0$QN:N:N:#QN:N:tN:"QN:N:,N:!QN:oN:ppN:r QN:cN:d@N:dQN:PN:QN:RQN:N:N:0QN:hN:N:QN9N9,N9tQN9N9N9QN9N9N9QN9JLN9QN9VQN9\N9N9QN8N8N9hQN8N8N8\QN8ΌN8@N8QN8N8\N8ŤQN8N8N8QN8XN8HN8QN8PtN8Q(N8RTQN80N82tN84QN8 N8 |N8 QN8N8N8 QN7 N7N7 QN70N7N7\ QN7N7N7 QN7uN7v@N7{ $X~dJ0z`F,v\B(rXQQN@\`N@^|N@aPQN@KN@LN@M`OQN@G N@GN@HNQN@$ N@&xN@(XMQN@N@pN@LQN@pN@N@KQN?N?xN?JQN?N?pN?՜IQN?{N?}N?\HQN?Q0N?SN?TxGQN?9N?:tN?;FQN>N>N>EQN>4N>N>`DQN>YtN>ZdN>ZCQN>KN>MN>NBQN>-dN>/DN>0AQN>N>N>T@QN>N> N> ?QN>N>$N>P>QN=pN=N=|=QN=N=DN=<QN=|N=lN=;QN=XN=N=:QN=qN=N=9QN=kN=mpN=o8QN=0N=2$N=37QN=(LN=)xN=+6QN<,NHR\fpz$.8BLV`jt~ NL NM\ NM( NO8 NOg NO|| NO NO NOL NOD NP NP; NPU NPml NP NQ8 NQ(t NQ- NQK$ NQg NQl NQd NQH NQ| NQ NR$ NRB NRF( NRrt NR NR NR NS?L NS˰ NT NU'D NU*P NU5 NU@ NU[ NU NV NV NVD NV" NV| NV NV NW NW! NW?H NWX NW` NW NWT NW NW NWd NXu NZH NZ N[:X N[Kt N[f N[T N\ N\ N\S N\p N\v N\X N\< N\ N\ J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ NL NMD NM04 NO9t NOj NO} NOt NOx NO NP` NPx NP

    4*  z$.8BLV`jt~ N]] N] N^ N^:( N^CL N^݄ N_} N_ N_, N`p N`wp N`| N` N` Na Nat Na Nb2, Nbd Nbt Nb0 Nb@ Nb Ndy Ndq NdK  Nd Nc NcѸ Nc4 Nc\ Nc_ Nc Nc0 Nb Nex Nf Ngl Ng Ng Ngl Ng Nh Nh Ni NiG Nio Ni Ni Nj Nj% Njq0 Nj NjH Nk( NkP Nk| Nlt Nl Nm Nm( Nm% Nml Nm{P Nm Nnk Nn Nod No Np)T Npe Np, Np Npp J&0:DNXblvpf\RH>4*  z$.8BLV`jt~ N]i N]L N^t N^QN[KtN[MTN[N L&0:DNXblv  *4>HR\fpz$.8BLV`jt~ Np@ Nq Nq8 NqE Nq[ Nqe Nqk  Nq~ Nqل Nr%8 NrCt Nr`! Nril" Nr(# Nr4 Nr Nr@ Ns Ns ! Ns38" Nse# Nsk$ Ns% Ns& Ns' Ns( Ns) Ns * NtT+ Ntz, NuH4 Nul5 Nup6 NuP7 Nv8 NvoD9 Nvp: Nv; Nwa$< Nw= Nw> Nx? Nx60@ Nx}pA NxB NxC NxD NxE NxF NxG NyH Ny5I NyJ NyǬK NyҰL NyM NyN NzO Nz P NzQ NzIR Nzp- Nz|. N{|/ N{ 0 N{1 N{2 N{3 N{4 N{5 N|?6 N|E7 N|w8 N|,9 N|˴: N|ؘ; L&0:DNXblv  *4>HR\fpz$.8BLV`jt~ Np Nqh Nq; NqG Nq` Nqg Nql Nqt Nq( Nr* NrF NrcT! Nrk" Nr4# Nr Nr Nrٰ Ns Ns |! Ns5T" Nsg@# Nslh$ Ns% Ns4& Ns' Nsl( Nsl) NsP* NtU+ Nt{, NuJ4 Num5 Nu6 Nu7 Nv8 Nvp9 NvϘ: Nw; Nwc< Nw= Nw> Nx!? Nx9@ NxPA NxXB Nx(C NxD NxE NxHF NxG Ny H Ny:XI NytJ Ny@K NyLL NyM Ny|N NzO NzP NzQ NzKR Nz\- Nz,. N{ </ N{0 N{|1 N{P2 N{x3 N{Ԭ4 N{x5 N|D<6 N|O@7 N|~ 8 N|9 N|T: N|; Xz`F,v\B(rXXXXXXXXXXXXXQaNlNlNl@QaNltNlvtNl~QaNk|NkNkQaNkPNkNk|QaNk(NkPNkQaNjHNjðNjƼQaNjNjNj ~QaNjq0Njr Njr}QaNj%Nj)Nj/|QaNjNj HR\fpz$.8BLV`jt~ N,V NU N[T N|= N|> N}? N},@ N}A N}B N}C N} D N}E N~F N~G N~dH N~*I N~=J N~J4K N~k|L N~tM N~N N~O N~HP N~lQ NR NHS Nȴ} N״~ N8 N) N-| NHp NL N}h N  N Nڰ N$H N} N N N NL N5 NQ N| N Nذ N NX N N< Nt NF N_d N-h N9\ N N( N x N N(l N N Nՠ N N, N N N NDl N~ N  N8 N N NՀ N N&0:DNXblv  *4>HR\fpz$.8BLV`jt~ NV N,U N`,T N|= N} X> N}p? N}@ N}DA N}B N}PC N}D N}E N~F N~G N~ @H N~2LI N~@J N~LPK N~qL N~M N~N N~|O N~P N~Q NR NJS N} N~ N  N+ N/  NI NO N N N N N% N Nl N N NH N; NT N  NX NT N( N( N!X N N NG| No N08 NA Nd N N  N4 N+ N0 N N N  NT N N N! NF N N< N N N N  N ((B\v,F`z0Jd~4QaNuHNuINuJ5QaNulNum8Num6QaNupNu$Nu7QaNuPNu|Nu8QaNvNvNv9QaNvoDNvp4Nvp:QaNvpNvNvϘ;QaNvNvNw<QaNwa$NwbNwc=QaNwNw$Nw>QaNwNwNw?QaNxNx Nx!@QaNx60Nx9Nx9AQaNx}pNx~`NxPBQaNxNxNxXCQaNxNx8Nx(DQaNxNxNxEQaNxNxHR\fpz$.8BLV`jt~ N  N N N X N4 NO0 NX N*T Np ND N&H N5 N:4 NJ NRX Nx N N  NJ NX N N N NB NQ8 N N Nv N}8 N Nh N N$ Nh No N N N N/ ND Na Nl Nz8 Nl N N N, N| N N N h N/ NT0 N N< N| N\ N N* NŐ N Nd N NP N N N Cbblv  *4>HR\fpz$.8BLV`jt~ N٘ N N N t NA\ NS N܄ N- N~< N N' N7d N< NL| NV N{ N N NLl NZ@ NՈ N p N NE NX| N N Nyx N~ ND N Nܜ NP N  Np N NT NL N2D NK Nc Np` N} N N N Nt NL N N N N24 NW N N( Nߤ N N N50 N N$ N N NR0 NX N, N $X~dJ0z`F,v\B(rXQҩNNN~QҩzNτN8N}QҩzNNN|QҩzN!`N"N#{QҩzNNN$zQҩzNpN`NPyQҩzNޔNHN8xQҩzNNNtwQҩ;N5hN6N7vQҩ;N+TN-pN/uQҩ;NNNtQҩ;NN N tsQҩ;NǕNǗpNǚrQҩ;NǐNǒ NǓ8qQҩ;N`\NaLNbxpQҩ;N|NNoQҩ;NNpNnQҩ;NƬ NƭNƭmQҩ;NƐNƔtNƜ0lQҩ;NƉNƋNƌkQҩ;N(NN`jQҩNN@N0iQҩN4NNhQҩN$N̸NgQҩN¯N°N³,fQҩN’N”NAQaN-hN.N08QaN_dNhNoQaNFNGNG|QaNtN(NQaNHR\fpz$.8BLV`jt~ Nܴ N  NiT N~0 N N NX N N, Nt N4 NO@ N] N|| NT NŜ ND N N` N N  N N  N\ NnL N N( NV ND N N+ N3 N N N?, N2 Nk, Nv0 N N  Nݸ ND N)! N" N# Nx$ N.% N|& N8h' NH( N) Nl* N+ NF, NS,- Nc. Ns/ Np0 N`1 NČ2 N D3 N04 Ne5 N6 N!7 Nb8 N9 N: Nt; Nl< NМ= N> N.? NT@ J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ N N@ Nr N\ N N N N$ N N` N7 NQ Nb N N N8 N N N ND N N4 N N Np, N l N*p NYP N N N,@ N5d N N NA N5 Nn Nw Nh Nl N< N N+! NH" N# N$ N1% Nt& N:' N( NH) Nh* N+ NI, NT- Ne8. Nx/ N0 Nd1 Nƨ2 N3 N,4 Ngp5 N6 N#,7 Ne8 N9 NH: N; NL< Nؔ= N> N1,? NW@ $X~dJ0z`F,v\B(rX]Q0NlNN\Q0Nz8N{N}[Q0NlNnNp`ZQ0NaNcNcYQ0NDNHLNKXQ0N/N1N2DWQ0NNNLVQ0NN NTUQ0NN4NTQ0NoNpDNpSQ0NhNN RQ0N$NNPQQ0NNNܜPQ0NhN NOQ0NNdNDNQ0N}8N~dN~MQ0NvNxLNyxLQ0NNNKQ0NN$NJQ0NQ8NR(NX|IQ0NBNDTNEHQ0NN NGQ0NNtN pFQ0NNpNՈEQ0NXNYPNZ@DQ0NJNK|NLlCQ0N NNBQ0NNNAQ0NxNyN{@Q0NRXNSNV?Q0NJNLNL|>Q0N:4N;N<=Q0N5N6N7d<Q0N&HN'8N';Q0NDN4N:Q0NpNx`N~< `X~dJF,v\B(rXXXXXXXXXXQ0N4N5N7Q0NtNDN`Q0N,NΔN~Q0NNN$}Q0NXNN|Q0NNN{Q0NNNzQ0N~0N~N\yQ0NiTNmPNrxQ0N NPN@wQ0NܴNNvQ0NN°NàuQ0NN|NtQ0NNN,sQ0NNNXrQ0NPNQ|NR0qQ0NNNpQ0NdNNoQ0NN֬N$nQ0NŐNƀNhN4dQ0N hNXNcQ0NNhNbQ0NNhNaQ0N|NܨNL`Q0N,NNt_Q0NNN^Q0NNN J&0:DNXblv  *4>HR\fpz$.8BLV~tj` NB N,0C N;D NE NHF N8PG NNH NePI NJ N(K NL NM N5pN Ng\O NyhP NQ NڬR N0S NT N>U N`V NfW NsX NY NZ N[ N\ N] N^ Np_ N` N#a N+<b N1c NZXd NXe N< f NKg Nf<h Ni Nj Nk N l Nm NRn No Np Nq N ,r N#Ps N%t N?pu NXv Nw N4x N y N`z N{ NP] N\ N[ N^Z NY NJX N"W Nڤ Nz@ N+p N0 N Nt N NO N4 J&0:DNXblv  *4>HR\fpz$.8BLV~tj` NB N/C N><D NE N̼F N<G NT4H NqDI NJ N4K N(L N!M N6N NiO NP NQ NR NS N T NBU NcV NjW NxX NY NpZ Nی[ N\ N@] N4^ N0_ N"` N'@a N.b NC$c Ngd Ne NA4f NOg Noh Ni NHj Nk N l N!m N\n Nho N8p Nq N r N$s N+t NGu NZdv Nw NPx Ny NHz N4{ N] N\ N [ NqxZ NY NMpX N$0W N N0 N- N N4 N N N\L N| $X~dJ0z`F,v\B(rX%Q0N.N/N1$Q0NxN N#Q0NNN"Q0NNNH!Q0N)N*N+ Q0NDNNQ0NݸN N<Q0N NNlQ0NNNhQ0Nv0Nw NwQ0Nk,NlNnQ0N2N3N5Q0N?,N@NAQ0NNNQ0NNTNQ0N3N4N5dQ0N+N+N,@Q0NNNQ0NDNNQ0NVNX$NYPQ0N(N)N*pQ0NNN lQ0NnLNo<CQ0N,0N-N/BQ0NNNAQ0NNND@Q0NTNUDNW?Q0N.N0Q0NNhN=Q0NМNԘNؔ<Q0NlNNL;Q0NtNN:Q0NNNH9Q0NN`N8Q0NbNcNe7Q0N!N"xN#,6Q0NN4N5Q0NeNfNgp4Q0N0NN,3Q0N DN N2Q0NČNŸNƨ1Q0N`NaNd0Q0NpNN?tNBTQNN N SQN0NNRQNڬNݸNQQNNNPQNyhN{NOQNg\NhNiNQN5pN6$N6MQNNN!LQNNN(KQN(NN4JQNNPN J&0:DNXblv  *4>HR\fpzVLB8.$`jt~ N N N N  N>h NM, Nf N{ N  N N N$ Nj N4i N$h N¯g N’f N~e N[Hd N*c Nb NHa N` N_ N|^ N N& N-H N@ NT Nú` N  N N4 N, NI Nc Nė( NĴ N N N4 N  N N- N5hw N+Tv Nu Nt NǕs Nǐr N`\q N|p No NƬ n NƐm NƉl N(k Nȉ NȘ Nȩ0 Nȭh N< N` N N& N,4 N> NɆ4 Nɕ4 N N ND Nt J&0:DNXblv  *4>HR\fpzVLB8.$`jt~ N@ N  N NT NB( NPt NiL N N N N N'` N0j Ni Nh N³,g N•f N€e N_d N/tc N!b N$a N` N_ N\^ N N)L N3$ NC NX Nþ  N N0 N N/ NM Nd Nę Nķ N N\ N@ N N N3@ N7w N/v Nu N tt Nǚs NǓ8r Nbxq Np No Nƭn NƜ0m Nƌl N`k Nȍ Nȣ Nȫ NȰt N N N N(t N3 N@  Nɉ| Nɗ N׈ NX N Nw$ X~dJ0v\B(rXXXXXXXXQN>hN@ NB(QN NtNTQNNhNQNNN  QNNN@ QN#HN%(N' QN4NN| QNONVN\L QNNNQNtNNQNNdN4QN0N NQN+pN,N-QNz@NN0QNڤNNhN4{QNNN4zQN`NNHyQN NŀNxQN4N`NPwQNNNvQNXNYNZduQN?pNB@NGtQN%N*N+sQN#PN$N$rQN ,N XN qQNNNpQNN N8oQNNNhnQNRNWN\ X~dJv\B(rXXXXXXXXXXXXXX5QNNN\4QNN@N3QNĴNķDNķ2QNė(NĘTNę1QNcNdLNd0QNINKNM/QN,N.dN/.QN4NN-QNNN0,QN NN+QNú`Nü|Nþ *QNTNWHR\fpz$.8BLV`jt~ N N N NNL Np  N˶ Nx NH N, Nb Ñ4 Ň N̞ N N NK NͰ` NΒ NΥ Nγ NP N  N N L NЂ| NМ N NH N N N& Ns Nҋ N, N N  Nӊ NӖ Nӡ NH N N N1$ NP Nԝ NH NU, N[ Nr NՌ N$ N֏ N֥ NY N NM| NW Nأ NJ` Nٸ NڑT N/ Nۚ, N N5 NL Nf Nwl Nܺt Nɰ N߸ N N NQ! J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ N$ N N NO Nq N˷ Nل N N4t Nep N̆ N̏ N̠ NX N NN NͲ NΔ0 NΫd Nε< N< N, Nl N NЛ NЦ N4 N N# N d N' Nu< NҎP N8 N Nh NӍP NӘ Nӣ ND N N N4l NTL NԠx N NV N\ NuH NՒX N N֔d Nֲ Nb, Nl NN N\ NئP NL Nٺ, Nړp N3  N۞( N N;0 NO Np Ny Nܼ N N  N p ND NT! FX,v\B(rXXXXXXXXXXXXXXYQNNNXQNNN$WQNʖNʘ0NʚVQNtNuNw$UQNDN4NTQNN,NXSQNN֘N׈RQNɕ4NɖNɗQQNɆ4NɇNɉ|PQN>N?lN@ OQN,4N/N3NQN&N'N(tMQNNDNLQN`NPNKQN4*  $.8BLV`jt~ N,x# N߇h$ Nd% N,& N' N|( N N} N!`| N{ Npz Nޔy Nx N廈0 NҀ1 N2 NN3 Ne4 N掴5 Nτ~ N%H N N N< N N Nh N? N0  N* Nl N Nh N\ N4 Nʤ N\ NH NI NpJ N|K N<L N M NN N'O N?P NI Q N[hR NsS NPT N홄U NИV NW NDX N4Y NZ N[ NJ\ Nu] N^ N0_ N4` NHa N.(b NJc Ned N{e Nf N$g Nh Ni Nj Nфk Nl J&0:DNvlbXzpf\RH>4*  $.8BLV`jt~ N/ # N߉$ N% N8& NL' N ( N N} N#| N${ NPz N8y Ntx N忄0 NԜ1 N\2 NO3 Ni4 N擠5 N~ N) NP N| N N, N Nk0 NA< N3, N- Nt N N N N N N^\ NH NI N@J NlK N#L N 0M NxN N*lO NBP NKQ N]R NtS N T N훠U NV N0W NFX NPY N۸Z N[ NM\ NwX] NӰ^ N_ N` N`a N0Db NOpc Ngd N}e Nf Ng Nh Ni Nj Nk Nll $X~dJ0z`F,v\B(rX!QɩNQNRNT QɩNNTNDQɩNNN pQɩN߸NN QɩNɰNNQɩNܺtNܻdNܼQɩNwlNx\NyQɩNfNjNpQɩNLNMNOQɩN5N7pN;0QɩNNάNQɩNۚ,NۜN۞(QɩN/N1,N3 QɩNڑTNڒDNړpQɩNٸNٹNٺ,QɩNJ`NKNLQɩNأNإ`NئPQɩNWNYN\QɩNM|NN0NNQɩNN@Nl QɩNYNZNb, QN֥N֮Nֲ QN֏N֑N֔d QN$NN QNՌNՐxNՒXQNrNtNuHQN[N[N\QNU,NUNVQNHN8NQNԝNԟNԠxQNPNR0NTLQN1$N2N4lQNNNQNNTNQNHN(ND~QNӡNӡNӣ  ~dJz`F,XXXXXXXXXXXXXXXXXXXXXXXlR8hN45QɩN掴N搔N擠4QɩNeNgNi3QɩNNNNNO2QɩNN0N\1QɩNҀNӬNԜ0QɩN廈N,N忄hN4(QɩN|N N 'QɩNNNL&QɩN,NXN8%QɩNdNN$QɩN߇hN߈N߉#QɩN,xN-N/ "QɩNN N J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ N Dn N-do N<p N_q N0r N*s Nt NS<u NҀv Nw Nx Ny Nz N#{ N| N|} N~ NUd Ng4 N$ N, N@x NY N NET N} N  N Nl N N0 N< N_H Nv N8 N N N, N N N$ N= NEp Nq Nyx N N< ND Np NH N Nd N N'` N5 NE NP Nm N N N N N̜ N, N N N) N4 N80 NF Ns Nd N N J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ N"n N.o N=p Naq Nr N3ls Nt NUu NՌv Nw Nx Ny NАz N+{ N| NL} N t~ NXp NiP N| Nݐ ND Ne Nڰ NJ N N( N8 N N N NK\ Ne` N{ N N N8 N  N N N'p NB NGP Nt N~ N N N N NT NP Np N N) N8 NH NR Nr Nx NX N N0 N N N N  N,< N7 NA NG Nv N NL N| "X~dJ0z`F,v\B(rXXXiQɩNNNhQɩNN,NgQɩN$NPNfQɩNNNeQɩN{N|4N}dQɩNeNfNgcQɩNJNNNOpbQɩN.(N/TN0DaQɩNHNN``QɩN4NN_QɩN0NN^QɩNN NӰ]QɩNuNvNwX\QɩNJNKNM[QɩNNNZQɩNNPN۸YQɩN4NNPXQɩNDNFlNFWQɩNNN0VQɩNИN4$.8BLV`jt~ N NL N% NI N l N/( N5@ NC N O  O] O O O O?4 OW Oc Oxd O O Ovt O Oi O O\ O0 OJ O O  O  O @ O  O \ O 2 O | O  O O  Od O O O,P O)D Ox O O  O  O  O G| O  O  O  O < O p O  O l O 8 O  O- OAp O_4 O O OȜ O O$ On@ O O Ol( F&0:DNXblv  *zpf\RH>4$.8BLV`jt~ N N N+ NKX N  N0 N9x NJ N O O` O O8 OT OA O]p Of Oy OH Op Ox O Ok$ O O< O4x OT O O  O  O L O  O , O 4 O < O | O h O" O O Od O- O* Od Ot O Ť O x O ! O M O  O ` O  O d O  O l O p$ O  O  O1 OE0 Oa O O  O@ O Ot Or O O̴ O8( $X~dJ0z`F,v\B(rX1QɩN4N6N70QɩN)N+LN,</QɩNN|N .QɩNNN-QɩN,N N,QɩN̜N@N+QɩNNN0*QɩNNN)QɩNNNX(QɩNNlNx'QɩNmNpNr&QɩNPNQNR%QɩNENFNH$QɩN5N7N8#QɩN'`N)@N)"QɩNN(N!QɩNdNNp QɩNNNPQɩNHNNTQɩNpN$NQɩNDNNQɩNQɩN/(N/N0=QɩN lN N <QɩNINJ,NKX;QɩN%N(lN+:QɩNLNN9QɩNNN8QɩN@NlNL7QɩNNpN|6QɩNN NL5QɩNdNN4QɩNsNu\Nv3QɩNFNFNG2QɩN80N?NA NND:0&vlbX  *4>HR\fpz$.8BLV`jt~ O Od O O Ok Og O O>` O4 O*t ON< O O O O O< O~ O O  O O O O` O O\ O  O# O O O  O Ou  O O(! O`4" Oo# Ou$ O% O& O3' O}( O) O * O + O , O H- O!$\. O!/ O!˴0 O!1 O"!|2 O"C3 O"H4 O"H5 O"6 O$x7 O& 48 O&9 O': O' ; O'< O(= O(> O*O? O*x@ O*ЈA O+dB O..C O.yTD O/E O/`F O/(G O/H O/tI O/8J O0|K O0 L O0*tM NND:0&vlbX  *4>HR\fpz$.8BLV`jt~ OL OX O8 OǨ Om Oi Od O@ O6, O- OV O O O O0 O  O8 O O 4 O O O O O O OW O1d O Op O O` O} OL OT! Oa`" Or# Ox$ O8% OX& O5l' O( O) O * O T+ O , O - O!) . O!/ O!80 O!1 O"'X2 O"I3 O"4 O"5 O"@6 O$7 O&8 O&9 O'x: O'; O'p< O(Ť= O)> O*T? O*y@ O* A O+gB O.0C O.{4D O/8E O/F O/DG O/H O/I O/J O0 K O0L O05<M  (B\v,F`z0Jd~fQuO O xO ŤgQuO O O xhQuO O !HO !iQuO G|O JLO MjQuO O O kQuO O O `lQuO O ,O mQuO Q&O(O)O)?Q&O*OO*R4O*T@Q&O*xO*yXO*yAQ&O*ЈO*ҤO*  J&0:DNXblv  *4>HR\fpz$tj`VLB8.~ O0 O O0P O0Q O1@R O1S O1MT O1U O2V O2W O3RX O3Y O3@Z O4B[ O4_h\ O48] O4^ O5_ O55` O5ata O5$b O5\c O5d O6+|e O6:f O6Eg O6Zh O6@i O6Tj O6k O6l O6Ѩm O6n O7Co O7ap O7jq O7dr O7Όs O78t O8 u O84v O8Dw O8NHx O8Vy O:4z O:E{ O:| O:} O;aP~ O? O@ OA< OAE OAQx ODl OC0 OC OBٔ OB,` OA OAT OA OF݌ OG OH OI OIH OI[  OI OI OI OJ$ OJ OJ< OK J&0:DNXblv  *4>HR\fpz$tj`VLB8.~ O0xO O0P O0Q O1R O1pS O1bhT O1U O2"V O2W O3VX O3Y O3Z O4E[ O4i\ O4] O4^ O5 4_ O5?` O5ba O5b O5xc O5d O6.Le O6>f O6Gg O6\xh O6i O6j O6k O6`l O6xm O6`n O7E4o O7dp O7n8q O7r O7Шs O7t O8 u O85v O8G|w O8Ox O8Xy O:6z O:J{ O:0| O:} O;c~ O? O@ OA?0 OAG( OAS ODL OCL OC OB4 OB/0 OAۄ OA` OA OF OG OH OI OIKX OI] OIX OI OJ \ OJ OJ OJ OK $X~dJ0z`F,v\B(rXQҬuO_O`OaQҬuOCOEOE QҬ4*  OL OMԬ ON5< ONB  ONT ON OO8 OOH OP9 OQ\ OQY OQl  OQl OQ OQH OR4 OR[0 OR_, OR OR OR OR@ OS0 OSC OS0 OV\ OV OV{ OVh OVF OV?  OV OU OU  OU4 OU OU OUD OU OUP OUu OUj OUd OUX OUQ OUIl OUC OU=x OU OU OU OU OT OTP OT OTڐ OTӈ OT OT OTl OT%( OT OTd OVx OV< OWt OX OX OX| OY@ OYH OY? OYO OY[t J&0:DNXblv ~tj`VLB8.$zpf\RH>4*  OL OM֌ ON7X ONJT ON` ON OOZp OO` OP< OQ D OQ] OQsd OQ OQ, OQ  OR5 OR]L OR OR, OR ORϬ OR OS OS] OS OV OVt OV~ OVj, OVG OVA( OV OUX OU OU OUL OUh OU OU OU OUxL OUmH OUgl OUZ OUU OUKL OUE4 OUA8 OU< OU OU OU OT OT0 OT OTܬ OT  OTΜ OT OT OTDT OT OT  OV` OVt OW OX OX8 OX OY  OY| OYA4 OYR OY^ ~dJ0z`F,v\B(XXXXXXhN4Q&OAQxOAR,OASQ&OAEOAFOAG(Q&OA (B\v,F`z0Jd~ Q&OF݌OF|OF Q&OGOGpOGQ&OHOHpOHQ&OIOIOIQ&OIHOIIxOIKXQ&OI[ OI\tOI]Q&OIOIOIXQ&OIOIOIQ&OIOJtOJ \Q&OJ$OJOJQ&OJOJOJQ&OJ4* \fpz$.8BLV`jt~  OYrl OYwX OYP OZ)x OZ+ OZE  OZa OZy OZ OZ\ OZ OZ OZL O[4 O[ x O[Ux O[ht O[ O\ O\)X O\HH O\R O\8 O\ O^D O^ O^v O] O] O]R O]>$ O`P OaEd Oa Oa Ob: Ob Obd Ob Ob Oc38 Oc< Ocr Oc Oc0 OdL< Od Od Oe  OeH0 Oe Of9 OfU Of` Ofq$ Ofx, Of| Of, Of Of! Of" Of# Og+$ Og7l% Oggx& O_2(  B&0:DNXblvRH>4* \fpz$.8BLV`jt~  OYt OYx OYڸ OZ+X OZ/ OZFL OZl OZ|p OZ OZ, OZx OZ OZX O[ < O[  O[W O[~@ O[ O\H O\* O\J( O\U O\ O\ O_ O^0 O^  O] O]l O]Z O]? O` OaH4 Oa` Oad Ob<0 Ob Ob Ob\ Ob Oc5 Oc>< Oc Oc Odh Od| Od Od Oe$T OeK Oe Of; OfW\ Ofb` Ofs OfyX Of~D Of OfT Ofp! Of" OgT# Og1T$ Og>% Ogh& O_2( (B\vJd~*QOR[0OR\OR]L+QOR_,ORupOR,QORORxOR,-QOROROR.QORORORϬ/QOR@ORlOR0QOS0OSOS1QOSCOSIPOS]2QOS0OSOSRYQOVxOVOV`ZQOVHR\fpz$.8Btj`VL~ Oj Oi Oix Oi˨ Oit Oiu Oit< OiH Oi Oh Og Okc3 OlD4 Ol(5 Ol6 Olx7 Om8 Om$9 On: OnO; Onc< Onv= On> On$? Oo-@ OoXA Op DB OpP,C OplLD OpxE OpF OppG Oq*H Oq@,I OqY|J Oq]K Oq0L OrPHM OrXN OrtO OshP OsQ OtR OtKxS OtW0T Ot_U Ot4V OtW OtX OuY OuZ Ou[X[ Ou\ Ou\] Ov 8^ Owp_ Oy` Oza Ozb O{0c O{hTd O{e O{Xf O|sg O~i  O~<  O}@ O} O}o Olm O(n Odo OrTp Oq OLr Os Out OTu OLv Ow Ox O hy R0&:DNXblv  *4>HR\fpz$.8Btj`VL~ Oj Oi Oi Oi  Oip Oiz Oiu OiK Oi" Oh Og8 Okg3 Ol4 OlҀ5 Ol6 Ol7 Om8 OmD9 On`: OnQx; Onh< On= On> Oo ? Oo8@ Oo8A Op8B OpUC OpmxD OpXE OpdF OpPG Oq2XH OqDI OqZJ Oq_K OqL OrQM Or[N OrO OsjP OsQ Ot1tR OtMXS OtXT Otb4U OtV OtW OtX OuY OuDZ Ou\[ Ou\ Ouؼ] Ov"^ Owu_ Oy` Oz-a Oztb O{(c O{md O{e O{f O|{g O~p  O~,  O} O} O}x Om O4n O o Ovp Oq Or Ols Ow0t O4u Ov O0w O x O#y zX~dJ`F,v\B(rXXXXXXXXXQOf9Of:Of;QOeOe8OeQOeH0OeJLOeKQOe Oe! Oe$TQOdOddOdQOdOdhOdQOdL<QOc38Oc4Oc5 QObObOb QObObOb\ QObdObOb QObObOb QOb:Ob;|Ob<0QOaOa8OadQOaOaOa`QOaEdOaGOaH4QO`PO`\O`hN4|QO\O\XO\{QO\8O\dO\zQO\RO\TO\UyQO\HHO\IO\J(xQO\)XO\)O\*wQO\O\O\HvQO[O[O[ vX~dJ0\B(rXXXXXXXXXXXX=QOnvOn{lOn<QOncOnfOnh;QOnOOnPOnQx:QOnOnOn`9QOm$OmLOmD8QOmOm$QOg+Og/tOg1T#QOfOg(OgT"QOfOfOf!QOfOfOfp QOfOfdOfTQOf,OfOfQOf|Of}Of~DQOfx,OfxOfyXQOfq$OfrPOfsQOf`OfapOfb`QOfUOfUOfW\_ &,28>DJPV\bhntz "(.4:@FLRX^djpv|0Ei 1UyAe "-#Q u$='a(+),E/`01)4M7q:;9>]?B%CIFmGJ5KYN}O!RESiV W1ZU[y^_Abec f-gQjukl=oaps)txw{9|]%Cz5Y}!Ei 1UyAe -Qu=a)Ge -Qu=^ &,28>DJPV\bhntz "(.4:@FLRX^djpv|ŜƜ)ɜOʝΝ9ѝ]Ҟ՞%֞Iמmڟ۟5ޟYߟ}!Ei 1U Ae )_u=a) M q ;%Im!X"}&)i-+.U2y586S9e: =->K?iBCUGyJKANeO R-SQVuWX=[a\_)`Mcqdg1hMkln+oOrssv/wOxy|9}Xu<`(Lh J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ O{ O| O} O~ O$ Ol O[ O O\ Od OT OH O9X O O4 O/ O O O/` OId O< OM Of O. OU O OH OP Oќ O O- OPh Oa Or Ox O@ O@ O̠ O O O OF OU O~H O  O\ O$8 O OԴ Ow\ O O8 O@ Oʐ O< O  O0 O O O O$ OΨ O O2 ODP Oop Or| O{( O( O O( OF\ Ow Ox J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ O|{ O| O0} O~ OP O O_D O O Oex O O OQOnOnTOn X~dz`F,v\B(rXXXXXXQnOTOOQnOdOeOexQnO\OOQnOOOQnO[O](O_DQnOlO\OQnO$OOP~QnOOO}QnOOِO0|QnOOO{QnOOO|zQnO7$O9O;yQnO hO!O#xQnOOO wQnOOތO0vQnOLOOuQnOTOO4tQnOuOv|Ow0sQnOOOlrQnOLOHR\fpz$.8BLV`jt~ O+X OXX O O8 O4 O OY O  O O O|P O  O  Od  O (  O&h  OU  Oz O O O$ O-$ O; OLP O( Oސ O\ ON Oe O OL OH OO OY OlL Or( O O O| O* O7 OW Og OkL O Og OqT O$ O* Og OT O0 OF Ot O O( O O O` O O OC  O_  O(  O  O,X  O/(  OB  Ok(  O{  O  OD  O  OD  O  O@  L&0:DNXblv  *4>HR\fpz$.8BLV`jt~ O/ O] O8 O O  O Oa O O O O O  O  O  O  O)  OX  O~ O O O&X O/ O?l OO  O O O OP On O Ox OL ORH O] On Os O4 O O  O, OJ OY| Oj  Ol O| Oj Oz O O- Oi O Ox OH Oy, O O O O| Oj O O OE  Oa  O  O<  O.  O0  OD@  Om  O}  O  O  O,  O  Op  Ol  $X~dJ0z`F,v\B(rX)QnO$8O+O.(QnO\OHO'QnO O8O&QnO~HOO%QnOUOXOY$QnOFOGOH`#QnOOO"QnOOxOH!QnOOO( QnO̠OOμQnO@OOxQnO@OOXQnOxOOQnOrOtO|QnOaObtObQnOPhOQXOR QnO-O/O0QnOOOQnOќOO@QnOPOSOXQnOHO%O/0QnOO߼OQnOUOZO^ QnO.O/|O0lQnOfOkOpQnOMON|OOQnOQnO{(O|O}=QnOr|OsOuL<QnOopOp`OqP;QnODPOEOG :QnO2O4$O6@9QnOO O8QnOΨO OϘ7QnO$OO͸6QnOOPO5QnOOO44QnOOOh3QnO0OxO2QnO OO1QnO@O?lhN4PQnO|PO}OOQnOOONQnOO\O L&0:DNXblv  *4>HR\fpz$.8BLV`jt~ O(  OXX  O` Oi ! Op@ " Ol # Op $ O % O| & O ' O ( O O O< O! O " O!# Oal$ O~|% OH& O$' O<( OT) O* OX+ Ol, O- O. O</ O5L0 O?`1 OC2 OF,3 Of4 Ool5 O6 O7 O8 O9 O: O@; O?< OҀ= O> O|? O@ OHA OtB OC O ) OP * O + OX , O - O$ . O, / O= 0 OE 1 OU 2 Oa, 3 Ox 4 O 5 O 6 O 7 Oʤ 8 OL 9 O : Op ; O < Ox = OL > OX ? O@ @ O` A O l B O#< C L&0:DNXblv  *4>HR\fpz$.8BLV`jt~ O+  OZt  Obl On` ! Oq " O # O $ O@ % O\ & O ' O` ( O O O OT! O" O## Od$ O% Od& O' O( O) O@* OѰ+ O, OH- O\. O/ O:t0 OA|1 OE<2 OGX3 Oj4 Ot5 O6 O7 O8 O9 O: O; OAl< O$= O> O? Ox@ OA OwB OdC O ) Oո * Op + O d , O - O . O. / O>@ 0 OGd 1 OX 2 Od 3 O{ 4 O 5 O 6 O` 7 OH 8 O٤ 9 O : OP ; O\ < O = O > O ? Ol @ O@ A O" B O$ C F~dJ0z`FXXXXXXXXXXXXXXXXXXXlR8hN4QMOOOQMOOOQMO`OfOjQMOOO|~QMOOؐO}QMO(OO|QMOOO{QMOtOwLOy,zQMOFOG|OHyQMO0OOxxQMOTOOwQMOgOhOivQMO*O+O-uQMO$OOtQMOqTOx\OzsQMOgOiOjrQnOOPO| (B\v,F`z0Jd~QMOOHOQMOOO QMO4*  $.8BLV`jt~ OL@ E OOL F OX4 G O] H On I Ow` J O K O L O M O( N O O O P O Q O R O" S OcD q OYl p O* o O  n O m O l O k O, j Oh i OnX h O_ g OL f OGp e O d O c O b O@ a O ` OT _ O, ^ Oݼ ] O \ O [ O Z O Y O X Op W OP V O U O T Ot O! O1 O` O4 OSr Os Ot Ou O|v O w O'x O.y OPTz O[X{ Oh| OP} O# OA OL OX Ot OH On O OSl O OH OU Oj 9 (6DR`n|$2@N\jx .<JXft K/U KD  KW|,X< Ko+@ KvD KS9H Kd L K8P L {T LH4deX L`L\ L4` LDFd LTh Lgm LsYq Lnu M My M1j} M@d(p MUH  M^ i Mhp t Mrl Mz = M M| M  MHP i M M8 N | J N" N20 Ne Pi Pz QX~ Q/j8 QA 5 QJ42 QW_ Qj< Qw Q@ Qϼ% Qp) Q\- Qll QҜ0" Q۴" Qw#% RU#r R* # RQg|$ R]4$a Rhb$ Rol% R{d%_ R% R|&$ R\&{ RV& R<' R@P'f R' RL( R|(V S ( S h( S(e)T SAuP* S6`) K&0:DNXblvzpf\RH>4*  $.8BLV`jt~ OO E OQ, F OZ G O`, H OpX I Ox J O K O L O M O N O O O P O Q O R O%H S Og| q O\ p O- o O n O p m O l OT k OH j O i Ox h Oa g OPX f OJ@ e O!< d O c O b Ol a O ` O _ O ^ O@ ] O \ O˰ [ O| Z O( Y Ol X O W O V O U Ox T O O$( O5D On O8 OW0r Ots Ot OXu Ov O w O* x O0y OU@z O]t{ Oj| O} O* OD O O O O OtL O O^ O@ OS\ O\ Oq  9 (6DR`n|$2@N\jx .<JXft K/Z KD  KWLX= Ko.DA KvE KW9I Ke8M K;Q L |U LH8eY L`ۤ] La LFe Lpi Lhn LwYr Lsv M Pz M1k~ M@(q MU  M^! i Mh u Mr Mz = M8 M M  MI i M M?d N  J N" N2x N<\ 4 NLT  N\p Np N|p< N# Nà NDA N' Nʚ N" Nxm NL O O0~N OL  OYe Og ' O;z O O(  OB D O; (6DR`n|$2@N\jx .<JXft So+ S^`* SNDt*\ O`,  O=h$ O ( O(p!&, P ,p0 P4 P.E8 P5`I< PE@HA PSE Pi1I PxtzM PQ PU P@]Z P^ P̤ b P>f Pj Pˀ{ Q8 Q/l9 QA, 6 QJ43 QW _ Qj>$ Qwl Qh@! Q& Q0* Qx. Qlm QҞ" QL" Qy#% RZ#r R*# RQz$ R]Ҍ$a Rhf$ Roh% R{$%_ R% R&$ R`@&{ R[P& R' REx'f R ' R( RŐ(V S ˸( S,( S(j8)T SA~* S6f) (B\v0Jd~<QMO?O@@OAl=QMOҀOpO$>QMOOO?QMO|O O@QMOOOxAQMOHOOBQMOtOvTOwCQMOOOd QMOtOOQMO!O"O$(QMO1O3O5DQMO`OmHOnQMO4O6`O8QMO#O%O* QMOAOBOD!QMOLOHR\fpz$.8BLV`jt~ O0 { O z O y O( x On@ w O` v OP@ u OE t O s O r O@ O@ O, O? Oè Ol O\ Op O O O OZ< Od Ok O O O8 O O3 O^( Olt OrP O O O O 8 O%` OJh O_ OX O O  Oe Op| OÆ OU O{$ O Om@ OƗ4 OD OT O Oqh Oǎx OǬ O OD ORh Oq O O OBh Oe OɓD OS( OˣP ÒT DXvlbX  *4>HR\fpz$.8BLV`jt~ O { O z O y O x OuH w Of v OT u OO t O s O$ r O OBX O0 OB  Oƴ O O^ Or4 O O O O]H Oh Om O O O O O= O_ Om Os| O O O  O! O( OK Oa$ O O` Od Ofh Oy( OÍP OW Oŋ O4 Or Oƙ O O  O ODŽ( OǑ  Oǭh O O0 OU Or O OD OI Ogp Oɜ OTT O˥l Ó $X~dJ0z`F,v\B(rXWQҭ OpO$OVQҭ OPOOUQҭ OOOTQҭ OOOxSQҬO"O$XO%HRQҬOOhOQQҬOOOPQҬOO,OOQҬOO0O NQҬO(OTOMQҬOOlOLQҬOODOKQҬOOOJQҬOw`OxOxIQҬOnOoOpXHQҬO]O^O`,GQҬOX4OYOZFQҬOOLOPxOQ,EQҬOL@OMOODQҬO?OAxOBCQҬO#QҬOLOQMOpOqOr4=QMO\O]O^<QMOlO\O;QMOèOOƴ:QMO?OAOB 9QMO,O.O08QMO@OAOBX7QMO@O0OhN4,QMOlOO+QMOjOnPOq *QMOUOXHO\)QMOHOK(OS\(QMOOO@'QMOSlOXO^&QMOOO K&0:DNXblv  *4>HR\fpz$.8BLV`jt~ OH O͹8 O OH0 Op O} Oΐ Oμp | Oρ } OύD ~ Oϙt  OϵX O` O٬ O Oh O O O O OAD OЙ( OЦH OЯ0 OиT Oȼ O O Oh Oѥ OҼ0 O$ O1` OjT O} OӖ( O O O O$ OA O O O* Op OՌ O@ O! O$" O$L# O?$ O\% O֥ O֥ O֪ OֳD O OϠ O O O OH O O2 OAL Og Oג Oǘ OP O߀ O Ox O O' OY K&0:DNXblv  *4>HR\fpz$.8BLV`jt~ OP O;` O OI Oul O΀ OΕ Oο | Oτ\ } OϏ$ ~ OϜ  OϹ O O| O OT OP O O O! OE OН OЪ Oа Oм O Od O Oo Oѧ( O O'L O4 Ol4 OӀ  Oӗ O0 O OP O) OC O OH O, OwT O O8 O! O" O%# OB$ O^% O֧P O֧P O֮ Oֵ$ O Op O Oڤ O O O O3 ODX Oh Oה Od O, O O0 OT O t O3 O\0 $X~dJ0z`F,v\B(rXmQOɓDOɗOɜlQOeOfOgpkQOBhODOIjQOOODiQOOhOhQOqOqOrgQORhOTHOUfQMODO`O0eQMOOOdQMOǬOǬOǭhcQMOǎxOǏOǑ bQMOqhOǀODŽ(aQMOOO`QMOTOLO _QMODOO^QMOƗ4OƘ$Oƙ]QMOm@OoOr\QMOO8O4[QMO{$OŅ8OŋZQMOUOVOWYQMOÆOÉTOÍPXQMOp|OtHR\fpz$.8BLV`jt~ Oy| Oئ| Oذ O$ O, O4 O!L OA OQ Oo Oٓ4 Oٚx O O\ O Op OM OڂO O3tP OWQ OyLR O֔S O@T O%U OܛV OW OX OY O5$Z OL[ OV\ Ob$] Oj^ O{_ Oދ` O|a OߞPb O@c O~$d Ode O`f O+Xg ONDh OdLi Onj Ok Ol Om OVn Oio OO< O蔜 O O8 O̠ O$ O O O/ OzL O Ol Odp| Ov} Oꗈ~ O O O| O\ OX O O OL O, O, K&0:DNXblv  *4>HR\fpz$.8BLV`jt~ Oؤ$ Oت Oر O| O O O.l OCH ORH Oq Oٕ OٜX O@ OX Od O OQH OڊxO O9P OZQ O~tR O8S OT O)U Oܟ4V OW OTX OY O7Z OPT[ OX\ Od] Ok^ O~_ Oލ` O<a Oߟb O c Otd Ope O@f O4g OQh Oi8i Oqlj O k Ol O,m Orn Oo ORH Ol OH O迼 Op O| O, OL O3 O( O鳸 O Oi | Oy} Oꛄ~ O O O  O^ O뻐 O` Ol O O O#d (B\v,F`z0Jd~QO1`O40O4QOjTOkDOl4QO}OlOӀ QOӖ(OӗOӗQOOظO0QOOOQOOOPQO$O'O)QOAOBlOCQOO$OQOOOHQO*O+O,QOpOsOwTQOՌO|O QO@OlO8!QOOO"QO$OO#QO$LO%O%$QO?O@OB%QO\O]|O^OQOڂOڇ0OڊxPQO3tO7pO9QQOWOYOZRQOyLO{O~tSQO֔OO8TQO@OlOUQO%O'O)VQOܛOܝOܟ4WQOOOXQOOOT d(B\v,F`z0JYQOOpOZQO5$O6O7[QOLONtOPT\QOVOWOX]QOb$OcOd^QOjOkHOk_QO{O}TO~`QOދOތOލaQO|O8O<bQOߞPOߟ@OߟcQO@OO dQO~$OOteQOdOOpfQO`OPO@gQO+XO/TO4hQONDOOOQiQOdLOfhOi8jQOnOp@OqlkQOOO lQOOOmQOOO,nQOVOdhOroQOiOu(Oh|QOdpOfOi }QOvOwOy H&0:DNXblv  *4>HR\fpz$.8BLV`jt~ OhT OW OR O$ O d OU O4 O$ O처 Ol O OH O*\ O8 OC4 ONt Od Oq OT OT O:x O O( OP O O` O O" OD Om O Od O O"p Ol Oo O  O O O O O O O' O+ OG O` Ox O{4 O O O, Oh OT O, O O O O O O+ O3l O@ OBl O[ Oh Oq O O OH O OP F H&0:DNXblv  *4>HR\fpz$.8BLV`jt~ Oi O[4 OS O', O OW0 O` O O컀 OL O O O, O< OD OP Of  Os O O O> O  O O0 OѤ Oܨ O O)L OF Oo$ Oh O塚 O  O) On Or  O O O O O O Ot O) O. OIH Ob Oz O~| O O OѰ O8 O O( O O O O Od O2 O6 OA| OC O\p Okp Or O0 O O OX O F $X~dJ0z`F,v\B(rX[QҮO+O1O2ZQҮO OOdYQҮOO@OXQҮOOdOWQҮOOOVQҮOOOUQҮO,OO(TQҮOTOpOSQҮOhOHO8RQҮO,OOѰQQҮOO(OPQҮOOOOQҮO{4O}PO~|NQҮOxOyOzMQҮO`OaObLQҮOGOHOIHKQҮO+ O,O.JQҮO'O(O)IQҮOOOtHQҮO O HO GQҮO O xO FQҮOOOEQҮOlOODQҮOO$O鳸CQҮOzLO|O(BQҮO/O2O3AQҮO O$OL@QҮOOO,?QҮO$OO|>QҮO̠O͐Op=QҮO8O`O迼<QҮOOhOH;QҮO蔜O蕌Ol:QҮOOQOOO QO(OOQOPO|O0QOOдOѤQO`O|Oܨ K&0:DNXblv  *4>HR\fpz$.8BLV`jt~ O Ot OP O O O%< O1 ON OT OV Oet Oj` Op< O O4 O O O O< O\! OT! O ! O! O8! OD! OX! O[! Oo! O|! O! Ol! Od! O|! O! O! O! OT! O\! O! O$h! O- OA< OM0 OP OiP On Oh O O O Oh O O  O4 O"x O2 O:` On, O! OL! O! O! O! O'! O3H! O5(! O=\! OH! OJ! O̐! OT!! O@!" O !# O`!$ Ol!% K&0:DNXblv  *4>HR\fpz$.8BLV`jt~ O OĬ OL O, Ol O& O7 OP\ OV8 OX Of Ol Os O\ O Od O Ox O O! O$! O T! O! OHR\fpz$.8BLV`jt~ OV`!' O_ !( Odp!) Ow!* O!+ O!, O!- O\!. O!/ Oݜ!0 O) O* O|+ O4, OV- Oc$. O\!1 O!2 OX!3 O !4 O!5 O!6 O !7 O!!8 O0t!9 OI!: Od!; OL!< Oh!= O8 !> O!? OL!@ O!A O"@ O&A O{TC OB OD OE PTF PDG Pp0H PI PJ PK P 4L P6M PIN P}@O PXP P`!B P!C P!D P4!E P'!F P-p!G P9d!H PW!I P!J P!K P]l!L Pi$!M P!N P^ P_ PTt` P%a POb P2c PNd Pde P<f PRg Ph P i P j P 8k P 3l P mm P ~`n P o Q&0:DNXblv  *4>HR\fpz$.8BLV`jt~ OYl!' OcD!( Og@!) OyL!* O\!+ OD!, OX!- Oǔ!. O̼!/ O@!0 O) O* O+ O7P, OZ- Oe. O!1 OL!2 O!3 O!4 O!5 O!6 O !7 O$!8 O2!9 OO(!: O!; Od!< O8!= O;,!> O\!? Oh!@ O!A O%@ O+A OC OB O D O E PF PG PvH PI P8J PK P!L P8M PON PO PP P@!B PD!C P!D P!E P-4!F P.!G P;!H PZ4!I P!J P!K P`!L P|!M P\!N P,^ P_ P ` P*a PRb P9c PQHd Pe4e Pf PTg PDh P \i P j P ;<k P 9l P rm P xn P o 0\\v,F`z{QO-O/lO0 |QOAHR\fpz$.8BLV`jt~ P!s P3q Pbr PwHs Pt Pdu P@v Pw Px Py Pz Pgt{ P| Px} P,~ P P P  P Pg P P4 P, P  Px P P P.@ PO P Pp P P$ PP PS8 PD Pل!O P !P P !Q P!R P#!S P2X!T P=!U PC!V Pa!W Pj !X P4!Y P!Z P4![ PH!\ P9P!] PP!^ P!_ Ph!` P!a PH!b P!c Ph!d P1 !e PU$!f PjHR\fpz$.8BLV`jt~ Pl!s P@4q Pkr P|s P,t Pu Pv Pw Px Py P"z PiT{ P| P} P~ P Pd P P0 Pi4 P P` P PА P P Ph P2 PS P8 PҌ P, P'd PR PTd P P!O P!P P P!Q P!R P(!S P4!T P?QүO8 O9O;,=QүOhO O8<QүOLOOd;QүOdOO:QүOIOMOO(9QүO0tO1O28QүO!O#O$7QүO OO 6QүOOO5QүOOO4QүO O4O3QүOXOO2QүOOOL1QүO\OO0QүPOݜOPO@/QүPOOTO̼.QүPO\OĈOǔ-QүPOOOX,QүPOOtOD+QүPOOO\*QүPOwOxOyL)QүPOdpOeOg@(QүPO_ Oa(OcD'QүPOV`OX|OYl&QүPO&O'O(p%QүPOlOO $QүPO`OO0 0Xz`F,v\B(rXXXXXXXXXyQPPPxQPPPwQPPPvQP@PlPuQPdP4PtQPPP,sQPwHPydP|rQPbPgPkqQP3P8P@4pQP P LP ,oQP P

    HR\fpz$.8BLV`jt~ P PP P P$ P9 PH Pm P{ P P` P P P P  P o P  P , P  P  P!x P!` P! P!8 P!P P!P P" P"9 P"J P"p P"z P"X P" P" P"` P#  P#J$ P#_ P# P#( P$  P$* P$< P$ P$ P$ P%,@ P%E P%U P% P% P&( P& P&H P& P'` P' P(| P(Ƅ P( P)u  P)u  P)d P)X P*6@ P* P* P* P+\ P+ P,R P, P,\ P- P-8 P-L P. P.) P.4\ N&0:DNXblv  *4>HR\fpz$.8BLV`jt~ PR| P\ P( P@ P; PJ Po P~l Pt Pl P Pа PL P "@ P q P  P H P Р P d P!H P!dH P! P! P! P!L P" P";p P"P P"s8 P"| P" P"ɴ P" P#\ P#'8 P#L P#d P#@ P# P$P P$7T P$? P$ P$| P$ P%- P%H P%i0 P% P%| P&  P&"X P&V P&D P'  P', P( P(ˬ P( P)z P)z P) P)D P*9 P*  P*d P*( P+X P+@ P,YH P,\ P, P- P-4 P- P.P P., P.9H ((B\v,F`z0Jd~zQPPP"{QPgtPh(PiT|QPPP}QPxPP~QP,PPQPPߠPQPPPdQP P PQPPP0QPgPhPi4QPP,PQP4PP`QP,PXPQP P(PАQPxPP QPPP QPPPh QP.@P/P2 QPOPQPS QPPhP8QPpP`PҌQPPֈP,QP$P&tP'dQPPPQPRQPS8PSPTdQPDPP4 BB\v,F`z0Jd~9Q PP`P :Q PnP|(P;Q PPP$<Q PXPYP[=Q PfPhPj>Q P PPd?Q PPP@Q P@PB$PCAQ PyP{P|BQ PLPxPhCQ PP@PDQ PP8PR|EQ PPPڨP\FQ PPP(GQ P$PP@HQ P9P:P;IQ PHPJ(PJJQ PmPnPoKQ P{P}|P~lLQ PPPtMQ P`P@PlNQ PPPOQ PPPаPQ PP PLQQ P P !P "@RQ P oP pP qSQ P P P  6  *4>HR\fpz$.8BLV`jt~ P.S P.a\ P.k P.zp P. P.4 P.D P. P/ , P/1| P/R P/W8 P/dX P/o  P/L! P/," P/$# P/$ P/% P/& P/x' P/x( P/8) P/Ռ* P/x+ P/, P0- P0. P0(/ P0!0 P0@1 P0M2 P0O3 P0V4 P0et5 P0{6 P07 P0d8 P1t9 P1k: P1; P1֘< P1T= P28> P3Hp? P3Z|@ P3(A P4&(B P46C P5D P5 E P5- F P5:@G P5IH 6  *4>HR\fpz$.8BLV`jt~ P.U, P.fH P.n P.~ P. P. P.P P. P/ 8 P/6 P/T P/Z P/i P/p P/! P/" P/P# P/0$ P/% P/& P/(' P/( P/) P/ר* P/+ P/, P0 - P0x. P0p/ P0%0 P0B1 P0N2 P0S3 P0X4 P0n 5 P0}6 P087 P08 P19 P1x: P1; P1|< P1= P2p> P3L? P3]@ P3PA P41B P4<0C P5 D P5E P5.F P5;G P5LH ,,F`z0Jd~TQ P ,P XP HUQ P P 8P РVQ P P P dWQ P!xP!XP!HXQ P!`P!cXP!dHYQ P!P!|P!ZQ P!8P!(P![Q P!PP!lP!\Q P!PP!P!L]Q P"P"P"^Q P"9P":P";p_Q P"JP"N0P"P`Q P"pP"qP"s8aQ P"zP"{P"|bQ P"XP"P"cQ P"P"P"ɴdQ P"P"LP"eQ P"`P#P#\ $X~dJ0z`F,v\B(rX Q P,RP,UP,YHQ P+P+P+@Q P+\P+xP+XQ P*P*P*(Q P*P*XP*dQ P*P*P* Q P*6@P*8\P*9Q P)XP)P)DQ P)dP)DP)Q P)u P)xP)zQ P)u P)xP)z~Q P(P(P(}Q P(ƄP(P(ˬ|Q P(|P(~P({Q P'P'P',zQ P'`P'P' yQ P&P&XP&DxQ P&HP&MP&VwQ P&P& P&"XvQ P&(P&P& uQ P%P%P%|tQ P%P%P%sQ P%UP%]HR\fpz$.8BLV`jt~ P5`J P5K P87@L P9uM P:XN P:O P:dP P; Q P;,R P;CS P;T P;U P;V P;DW P< X P<4Y P<7Z P= x[ P="\ P=2@] P=@P^ P=It_ P=Y(` P=ބa P>`b P>(c P>ld P>r,e P>Pf P>üg P>h P>i P>j P?k P?!l P?$m P?V8n P?o P?xp P?ìq P?tr P?Hs P@8t P@Au P@cv P@~w P@x P@y P@z PA<{ PAV PBF PBR PBY PBdT PBH PC1 PC` PC PCT PC PD  PD PDy PDl PD8 PD PD PEh PE*@( F&0:DNXblv  *4>HR\fpz$.8BLV`jt~ P5|J P5K P8>L P9whM P:uxN P:lO P:pP P;Q P;.R P;NS P;LT P;U P;V P;ǬW P<8X P<6LY P<9Z P= X[ P=%\\ P=5] P=C ^ P=N_ P=[` P=@a P>Lb P> c P>o\d P>ute P>f P>Ȩg P>Ӭh P>Di P>j P? k P?#l P?/Pm P?Yn P?o P?p P?q P?r P?s P@:t P@Cu P@gDv P@w P@x P@y P@z PA1{ PA[| PBJP PBU PB^ PBp  PB PC48 PCc PC$ PC0 PDx PD PDP PD( PDt PD PD` PD PEH PE+( $X~dJ0z`F,v\B(rX-Q P0P0P0 ,Q P/P/

    Q P28P2TP2p?Q P3HpP3JP3L@Q P3Z|P3\ P3]AQ P3(P3P3PBQ P4&(P4. P41CQ P46P49P4<0DQ P5P5P5 EQ P5 P5P5FQ P5- P5-P5.GQ P5:@P5:P5;HQ P5IP5K P5LIQ P5P54P5`JQ P5`P5P5|KQ P5P5@P5 (B\v,F`z0Jd~LQ P87@P8:P8>MQ P9uP9vxP9whNQ P:XP:hP:uxOQ P:P:P:lPQ P:dP:P:pQQ P; P;P;RQ P;,P;-P;.SQ P;CP;IXP;NTQ P;P;P;LUQ P;P;|P;VQ P;P;P;WQ P;DP;4P;ǬXQ P< P< P<8YQ P<4P<5P<6LZQ P<7P<8P<9[Q P= xP= hP= X\Q P="P="P=%\]Q P=2@P=3P=5^Q P=@PP=AP=C _Q P=ItP=JP=N`Q P=Y(P=ZP=[aQ P=ބP=`P=@bQ P>`P>lP>LcQ P>(P>P> dQ P>lP>mP>o\eQ P>r,P>tHP>utfQ P>PP>@P>gQ P>üP>@P>ȨhQ P>P>P>ӬiQ P>P>P>D NvlbXND:0&  *4>HR\fpz$.8BLV`jt~ PIl! PH! PH|! PH! PHr! PHSP! PH!(! PHD! PH ! PH! PGp! PG(! PG! PG@! PG! PGzH!~ PF!} PFX!| PF!{ PF!z PFH!y PE!x PE4!w PE !v PE!u PE!t PI< PIAp PJ)< PJ4@ PJ] PJw  PJP PKw PK PK  PK PL< PL PLx PM PM POd! PO! POC! PO0! PO! PN\! PN! PNz! PNX! PNE! PM! PMX! PM8! PM(! PO PP| PP^L PP PP PQ PQ PQ4 PQN PQ PQ PQ PQ PQH PQ4 PR PR $ PR PR# PRc PR PS- NvlbXND:0&  *4>HR\fpz$.8BLV`jt~ PI! PHވ! PHx! PH@! PHv! PHX! PH$p! PH`! PH ! PH$! PG! PGp! PG(! PGx! PG ! PG|d!~ PGP>P>kQ P?P?P? lQ P?!P?"P?#mQ P?$P?.`P?/PnQ P?V8P?XTP?YoQ P?P?P?pQ P?xP?P?qQ P?ìP?P?rQ P?tP?dP?sQ P?HP?ޠP?tQ P@8P@9P@:uQ P@AP@BP@CvQ P@cP@eP@gDwQ P@~P@P@xQ P@P@P@yQ P@P@ƨP@zQ P@P@PP@{Q PApPL@P>QPLPLxPL?QPLxPLPL@QPMPM PM HAQPMPMPMPQPOPO߀POQQPP|PP0PPRQPP^LPPddPPiSQPPPPPP TQPPPPTPPܠUQPQPQ|PQl J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ PT$ PT PTʐ PTϸ PT PT( PT( PU PU PU PV PV PW  PW* PW PW PX. PXB$ PY[d PY PY PYT PY PZn PZH PZ P\U P\ P^ P^@ P_ ( P_$h P`+` P`~ P` Pa Pa Pa1 PaPX Pa{< Pa Pb* Pb PfT! Pd! Pd! Pc! Pf\ Pf( Pf Pf@ Pf4 Pg Pg+, Pg1 Pg3 Pg? Pg`$ Pg$! PgX" Pgp# Pg$ Pg% Ph; & PhUL' Ph^( Ph) Ph* Ph+ Ph, Ph- Ph. Ph/ Ph0 J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ PT PT PTp PTј PT PT PT PUd PU  PU8 PVی PV PW PW/ PW PW, PX1 PXJ PY]D PY PY PYp PY0 PZq PZ( P[` P\b P\ P^$ P^ P_$ P_[ P`- P` P` Pa Pa Pa7 Pa\ Pa~ Pa0 Pb+ Pc Pf! Pdx! Pd! Pc4! Pf PfD Pf Pf PfL Pg< Pg.t Pg3$ Pg<  PgD| Pgb@ PgP! Pg" Pg# Pg͘$ PgH% Ph<& PhX' Pha( Ph) Ph* Ph4+ Ph, Ph- Ph@. Ph/ Ph0 $X~dJ0z`F,v\B(rX3QұQPtPtPt,2QұQPtPtDPt1QұQPtTPtPt$0QұQPt?PtAPtC/QұQPt9 Pt<,Pt>.QұQPt PtPtd-QұQPs PstPsD,QұQPslPs PsȠ+QұQPs4*  $.8BLV`jt~ Pi"2 Pi5\3 PiQ@4 Pi5 Pi6 PjH7 Pj8 Pki9 Pl?: PlI; Pl< Pm= Pm> Pm? PnQ,@ Po},A PoB Po4C PoXD PpE PpF PqsG Pq,H Pt! Pt! PtT! Pt?! Pt9 ! Pt ! Ps ! Psl! Ps4*  $.8BLV`jt~ Pi%l2 Piz4 Pi3 Pi5 Pi6 PjJ(7 Pjx8 Pks9 Pl@l: PlJ; Pl< Pm$= Pm@> PmX? Pnh@ Po A Po$B PoC PoD Pp8E PppF PqG PqH Pt,! Pt! Pt$! PtC! Pt>! Ptd! PsD! PsȠ! Ps! Ps4! Ps\! Psa! Ps!! Ps0! Pr,! Pr! Pr! Pr! Prl! Pr! Pt^ Pt_ Pt$` Pua Pub PuHc Pu3d PuSPe PuUf Pu g PuXh Pui Puj Puk Puȼl Pum PvKn Pv~`o Pvp Pvq PwNDr Pwps Pwlt Pwu Pwv Pwݴw Pxx Pxgy Pt! ( X~dJ0z`F,rXXXXXQPg1Pg1Pg3$QPg+,Pg-Pg.tQPgPgPg<QPf4PfPfLQPf@PfͨPfQPfPfPfQPf(PfPfQPf\PfPfDhN4QPbPbPcQPb*Pb+@Pb+QPaPa|Pa0QPa{QPmPmPm@=QPmPmPm$<QPlPlPl;QPlIPlJPlJ:QPl?Pl?Pl@l9QPkiPkpPks8QPjPjPjx7QPjHPjItPjJ(6QPiPiPi5QPiPiPi4QPiQ@PikPiz3QPi5\PikPi2QPi"Pi$@Pi%l1QPipPi$Pi0QPhPhPh/QPhPhDPh.QPhPhPh@-QPhPhPh,QPhPhHPh+QPhPhPh4*QPhPh Ph)QPhPhPh(QPh^Ph`Pha'QPhULPhVxPhX&QPh; Ph;Ph<%QPgPglPgH$QPgPg|Pg͘#QPgpPg$Pg"QPgXPg Pg!QPg$PgPgP QPg`$Pg`Pgb@QPg?PgB$PgD|QPg3Pg9HR\fpz$.8BLV`jt~ P}X! P}P! P}! P|! P|! P|! P|T! P|Yp! P|#! P{p! P{! P{H! P{rX! P{4x! P{ P! P{,! Pz! Pz! PzH! Pzo\! Pz[4! Pz $! PyZT! P}P P~Hp P~c P~ P~4 P~Ө P_ P Px P P P P P, P P P8 Pc P P PX P6@ PA PP Pl PyH P Pl P< P  Pk P P P < P3 PI P( P< P8 P P@$ P{ P Px P P P P2 PT P P0 Px P LvlbXND:0&  *4>HR\fpz$.8BLV`jt~ P}! P}! P}x! P|! P|! P|p! P|! P|^! P|6 ! P{Ō! P{! P{T! P{t8! P{7H! P{"! P{ t! PzH! Pz$! Pz! Pzrh! Pz]! Pz,! Pym! P~ P~L P~i@ P~ P~@ P~ִ Pd P P P4 P Pl P$ P$ PX P P Ph P P PP P?d PC` PX Pp$ PP P P Ph P  Po P P0 P  P5 P[ P P P P0 PI P Pt P P P P  P6< PV P4 P P P< (X~dJrXXXXXXXXXXXXXXXXXXXXXXeQPuQpPuRPuSPdQPu2Pu3pPu3cQPuPuXPuHbQPu@Pu0PuaQPtPuPu`QPtXPtPt$_QPtxPtPt^QPtPtPt"lR8hN4HQPq,PqPqGQPqsPqyPqFQPpPpPppEQPpPpPp8DQPoXPoPoCQPo4PoPoBQPoPoPo$ ~dJ0z`F,XXXXXXhN4hN4zQPxsHR\fpz$.8BLV`jt~ PM` P X P& P/P Pd Pj Pt8 P P PP PXD PL Pǘ P P P P*P P P P| P l P"8 P` P Pn P PT Pn` PH P  PP P PV Pp P P5 PT  P P P/ PAh P! PX! PL! P! P}! P2 ! Ph! P8! Pt! PE! Pݼ! PJP! P  P 4 P5 P( P P̜ P, P4 PC4 Pk  Py P| P| P` P( P Pݨ P Px PL P& J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ PV P  P)8 P5 PhD Pq Pz P< P P PfT P P P\ P ` P\ P2H P\ Pˀ P P< P% P0 P@ Pq P PX, Pq Pt P P\ P  PY P P< P:D PXD P P P8 PB Pd! P! P! P`! P! P:! PT! P`! P! PJ! Pl! PmQPPP=QPxPP<QPPHPt;QP{P~P:QP@$PCPI9QPPP08QP8PDP7QPHR\fpz$.8B~tj`VL PX Px Ph P  P P$` P P P͘ P  P*, Pa Pm P P! P" PM# Pe$ P% PQ0& P\' P( P4) Pt* P 8+ P, P- P. P\/ P0 Pd1 P܄2 P3 P54 PP5 Pv6 PP7 P8 P޼9 P0: P"<; Py0< P= P(> Pp? P@ P A PxlB P0C P D PE P;F PCG P_ H PI PF$J P4! P̌! P`! P! P! P! P! P ! P! Pˬ! Pl! Pf! PW P{X P(Y PZ P<[ P,H\ J&0:DNXblv  *4>HR\fpz$.8B~tj`VL P P P4 P  P P& P P Ph P P- Pe Pt Ph P! P" PO# Pp$ P% PU& P^' P|( P) P* P$+ P$ , P- P. P`/ P0 P€1 P2 P3 P84 PSX5 P|\6 P7 P8 P\9 P: P&; P{< Px= P> P? Pڰ@ PA P}B PC P$D PXE P>xF PEG P`8H PTI PKLJ P|! P ! P ! P8! Pd! PH! P,! P! P0! P! P! Pix! PW P}X PY PZ PФ[ P7\ ~dJ0z`F,v\B(XXXXXhN4pQjPAhPBXPBoQjP/P4HP8nQjPPPmQjPPPlQjPT PUPXDkQjP5P7tP:DjQjPPP<iQjPpPPhQjPVPWPYgQjPPP fQjPPP|P\eQjP PPdQjPHPPtcQjPn`PoPqbQjPTPVLPX,aQjPPP`QjPnPp$Pq_QjPPP@^QjP`PPP0]QP"8P#dP%\QP lP P<[QP|PШPZQPPPˀYQPPP\XQP*PP/HR\fpztj`VLB8.$~ PT^ PY_ Pa@` Pjda P|b Pc Pd PǬe Pf P\g Ph Pi P j PGhk Ps<l Pm P n Po Pp P,q Pr P@s Pt Pu Ppv P"w P*x PFhy Pjz Pz{ Pp| P} P ~ P( P0 P P', PK P P P ! P`! P! Pq! P/! P! P ! P! Pט! P! Pt! P\! P! PI! PCHR\fpztj`VLB8.$~ PV^ P^p_ Pc ` Pka P}b Pc Pd PPe Pf Pg Ph P\i P#Pj PI k Pthl Pm P(n Po Pp P°q Pr Pژs P4t Pu Pv P% w P0x PNy Pnz P}|{ Pl| PӀ} P~ P P8 P| P( PR P P  Px! PŸ! P,! P! P5! P ! P! P! Px! P! P! P! P8! PR! PE! P!! P (! P! Ph! P! P! P PP P P P# P+$ P{L PX P P_ P8 P,0 P vX~dJ0\B(rXXXXXXXXXXXXXaQjPjdPkPk`QjPa@PblPc _QjPYP\P^p^QjPTPUPV]QjP?DP?P@\QjP,HP-8P7[QjPxEQjPPxPXDQjP PP$CQjP0P\PBQjPxlP{P}AQjP P P@QjPPPڰ?QjPpP$P>QjP(PP $X~dJ0z`F,v\B(rXQjPP@P QjPPPQjPKPPPRQjP',P'P(QjPP`P|QjP0PP8QjP(PP~QjP PtP}QjPPPӀ|QjPpPPl{QjPzP}P}|zQjPjPmPPnyQjPFhPKPNxQjP*P/P0wQjP"P$0P% vQjPpPPuQjPPDPtQjPPP4sQjP@P0PژrQjPPЄPqQjP,PP°pQjPP|PoQjPPPnQjP PtP(mQjPP PlQjPsHR\fpz$.8BLV`jt~ P P7` PXl Pi PxL P~ P PШ P P` PP Pـ P P( P Pp P Pz P Px P[ PŒ P¿ P Pl PT P P P% P?4 PWX Pr PÇ P Pi P, P P P P P H P0P PW Pw Pū Pƀ PƢ( PČ Px P< P P0 Pw PȆ` PT PD PŒ P8 P P(D P\ P P2H Pˠ P=x PH@ PR Pb Pi Pn8 PpT Ps P̀ P̍( J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ Pd P:0 P^  Pk P| P P PԤ Pp Pb4 P8 P P P P P P P~ P` P P_$ PŽ P Px P P P P@ P'L PA PX Ps PÉ P P{$ P PP P  Px P P  P3  PZ Pz Pŭx PƂ Pƥ4 Pl P8 P PL P2x P| PȊ P Pp PŘ P P P-l P P$ P5 P˫8 P? PI PVP Pe Pm  Pp Pq Pv0 P̃ P̏ Xv\B(rXXXXXXXXXXXXXXXXXXXXXX)Q+PPPd(Q+PPP'Q+PyPdP&Q+PP#P,0%Q+PPP8$Q+P^,P_P_#Q+P8PP"Q+PPPX!Q+Pv$PyP{L Q+P(TP)P+$Q+P!P"xP#Q+PP(PQ+PXP PQ+PDPpPPQ+PP8P"lR8hN4 $X~dJ0z`F,v\B(rXMQ+PPPPLQ+P,PΔPKQ+PiPwP{$JQ+PPPIQ+PÇPÈPÉHQ+PrPrPsGQ+PWXPXHPXFQ+P?4P@`PAEQ+P%P&P'LDQ+PPP@CQ+PPPBQ+PTPDPAQ+PlP P@Q+PPPx?Q+P¿PP>Q+PŒPŽPŽ=Q+P[P]P_$<Q+PxPP;Q+PPP`:Q+PzP|DP~9Q+PPP8Q+PpP0P7Q+PPP6Q+P(PP5Q+PPP4Q+PـPP3Q+PPPP82Q+P`PaPb41Q+PPDPp0Q+PШPPԤ/Q+PP P.Q+P~PP-Q+PxLP{P|,Q+PiPjPk+Q+PXlP[P^ *Q+P7`P8P:0 J&0:DNXblv  zpf\RH>4*$.8BLV`jt~ P҈ P PT P Pͥ P P( P. PF PW  Pd@ Pr Pv P4 PҤ P  P! P. PϚT Ph PЛ P PE PB Pһ Pݤ P: PB" P:" P0" P" P" PT" P" Pջ" P|0" P/" P d" P " P" PP" PԸ|! PԖD! Pz`! Pm@! PS! P! Px! PLP$ Pj% Pt& P֙' P( P) P-* Pb+ P", P}- P. P/ P0 P$H1 P22 P:3 PI4 Pk5 P86 P٢7 Pt8 P9 P{: Pځ; Pڶ<< P= J&0:DNXblv  zpf\RH>4*$.8BLV`jt~ PX P@ P P! Pͧ Px PT P= PG PXL PgL Pt PΡ P PԄ P P& P7l PϜ4 Pk PН P PH, PC0 Pҽ P  P?` PDX" P=" P2" P" P" P" Pd" P¼" P~" P2\" P " P" P" P͔" PԺ! PԘ$! P|! Pn! PTh! P! PX! PO $ Po% Pu& P֜' P( P) P3h* Pp+ P$, P؁(- PX. P/ P0 P*$1 P42 P<03 PK4 Pmh5 PمP6 P٤7 P8 P$9 P~: Pڃ; P< P@= $X~dJ0z`F,v\B(rXqQ+P̀ṔP̃pQ+PsPu|Pv0oQ+PpTPpPqnQ+Pn8PodPpmQ+PiPkPm lQ+PbPd$PekQ+PRPU$PVPjQ+PH@PI0PIiQ+P=xP>P?hQ+PˠP˧P˫8gQ+P2HP3P5fQ+PPP$eQ+P\PPdQ+P(DP*P-lcQ+PPPbQ+P8PPaQ+PŒPøPŘ`Q+PDPPp_Q+PTP$P^Q+PȆ`PȈPȊ]Q+PwPzP|\Q+P0P1P2x[Q+PPPLZQ+Pzpf\RH~tj`VLB8.$ P)? P,@ PaA PmB PۯC PD P E PI F P[,G PܿH P|I P8J PK PDL PߟlM PN PO PtP P Q P4J P⢄K PL P\M PhN PO P䡰P P Q PR PS PT P" PRt" P" P`" Pp" P " P" P" Pi" P" P(" P9" P& " Pb P@c P^Xd Pqe Pf Pg PE" P蛔" Pm", PB"+ P*\"* P%") P("( P|"' P,"& P"% Ps"$ P]"# Ph"" PꙔ"! P" P{" Pl" PR" Pz P%{ P8\| PQ} P3$~ P< P J&0:DNXblv  *4>zpf\RH~tj`VLB8.$ P*? P1@ PcA PnB P۲C PPD P<E PL,F P]G PH PI PJ PވK PFL P߭M PN PO PP PQ P7J P⨜K PL P M PjN PO PdP P Q PR PLS PT P h" PS" P" P" Pø" Pp" P礌" P瞰" P" P" P" P;" P+" Pb PMc P`d Pue P`f Pg PH" P" Pq$", PD$"+ P-,"* P'P") P"( P"' P "& PT"% Pu0"$ Pbp"# P"" P꜠"! P" P~d" Po(" PU" P|z P(l{ PF| PW} P60~ P> P$ 0Jd~$Q+PLPPN0PO %Q+PjPlPo&Q+PtPuTPu'Q+P֙P֛P֜(Q+PP`P)Q+PP,P*Q+P-P.|P3h+Q+PbPmPp,Q+P"P#P$-Q+P}PHP؁(.Q+PPxPX/Q+PPHP0Q+PP,P1Q+P$HP$P*$ ((B\v,F`z0Jd~2Q+P2P3P43Q+P:P;P<04Q+PIPJPK5Q+PkPlQ+PPHR\fpz$.8BLV`jt~ PD PL P< P4 PL( PR Pa P|4 P$ P P P  PɌ PД P P& P\ Pi P~ P P Pp P P P P P, P֌ P, P P PY Pq P  P, P0 P Pt P P4 P( P\ P Px P4 P P` P&X P< PR, P Px Pl Pt PD Pl  P P P  Pk  P P P P P  P P PIl PXl P}8 P, G::DNXblv  *4>HR\fpz$.8BLV`jt~ P P P! P50 PND PSl Pb P~ P P殺 Pﮘ Pﵠ Pʸ P، P!4 P. P^ Pr P P Px P P P P8 P P Px P P0 P P[ Pr P P P P P Pt P` P4 P^l P P PP P P P* P@\ PT  P$ P PX P!  PH Pn< P@ P4 P Pl P P P< PH P P( P PKL P[< P` P (B\v,F`z0Jd~NQ+PP4POQ+PPPPQ+PtPdPQQ+P PPRQiQ`QQSQQQŠQTQQDQ`QUQEPQ8QQ`VQœQ[Q]Q_WQQzQQXQQQPQYQ.}QHQQZQ QǜQ@Ql[Q+QQݤQ\Q+QQ\Q]Q[mQ Q Q ^Q[mQ%Q'xQ(h_QģQ]Q^Q_`QģQbQeQgaQ,QúQQbQYQQHQ8cQYQQTQDdQYQ(Q+Q,eQʼnmQ@|QAlQAfQʼnmQDQEhQEgQŸQĂQăQĄthQŸQĕQĖQĖjQaQľQQkQaQTQDQlQE QQQ J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ Qln Qo Qp Qy8 Q} Q4 Q`R QS QDT Q8U Q[V QzW QX QHY QǜZ Q[ Q\ Q ] Q%^ Q]_ Qb` Qúa Qb Qc Q(d Q@|e QDf QĂg Qĕh Qľj QTk Ql Q/Pm Qhn Q|o QTp Qq Q_r Qs Q-t QoXu Qupv Qȭtw QɃ"y QѸ"z Q "{ Q-\"} Q1"| Qe"~ Q" Q " QD QE QLF Q'G Q Qt QJ QY Q`P Qs QЙ Q(< QS Qv Qі(" Qћ" Qѧ" Q(" Q " Q" Q"" Q҄" Q҇" J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ QҔn Qo Q p Q{ Q Q QR QS QT Q`U Q_V QW QX QY QlZ Q[ Q\ Q ] Q(h^ Q__ Qg` Qa Q8b QDc Q,d QAe QEf QĄtg QĖh Qj Qk Ql Q3m Qkn Q}o Qp Qq Qar Qs Q/ t Qrdu QwPv Qȱw QɅ"y Q\"z Q "{ Q/<"} Q3"| Qn"~ Q" Q" QD Q E Q!F Q+\G Q Q4 QL Q` Qa QvX QОl Q) QUx QyT Qљ" Qѝ" Qѩ" Q" Q " Q" Q'" Q҆" Q҈" ,X(B\v~dJrXXXXXXXXXXXX+Q̃M"GM"LM"N$*Q̃M!,M! M!)Q̃M!ҠM!ԼM!(Q̃M!M!,M! 'Q̃M!R0M!S\M!T&Q̃M \M M %Q̃M ̘M δM mQqQ/PQ0Q3nQƛKQhQiQkoQΟQ|Q}\Q}pQ,QTQQqQ)QQQrQȡaQ_Q`QasQ&(QQ QtQWQ-Q.0Q/ uQɸ,QoXQpQrdvQɸ,QupQvQwPwQQȭtQȰQȱN$Q̃M BQ̃M+HM+dM+AQ̃M+oM+tM+v @Q̃M+ZM+\M+]?Q̃M+ M+ M+L>Q̃M*ؠM*0M*=Q̃M*M*ˀM*<Q̃M* M*M*Ȱ;Q̃M)M)DM)p:Q̃M(+M(,M(-9Q̃M'-@M'/ M'2h8Q̃M&M&M&87Q̃M&WM&XM&Y44Q̃M#M#M#d3Q̃M#xM#xM#yp2Q̃M"M"M" 1Q̃M"M"M",0Q̃M"ҐM"ӼM"`/Q̃M"M"M".Q̃M"M" M"-Q̃M"HM"M"t,Q̃M"[M"]$M"_ N&0:DNXblv  *4>HR\fpz$.8BLV`jt~ MG C MGB M@) M@Ѡ* MAl+ MA/`, MAQ\- MA\. MAaL/ MAh0 MBP1 MB8t2 MB?3 MB4 MB 5 MB6 MC@7 MC@8 MCȈ9 MC4: MD?; MDE< MER= ME> MF? MFR@ MFDA MGO MG MG MH MH MH MH( MI/ MJBD MJ MKX< MKy MK MKL ML7 MLS ML MOƜ MO MPb MPt MP  MP MQh MQ MQ*( MQV MQh MQ8 MQ  MQt  MR)(  MR@  MRi$  MRt  MR  MR  MS MS MS* MS[| MSk MS  MS  MS  MS  MS  MSH  MTO<  MTP  MT  N&0:DNXblv  *4>HR\fpz$.8BLV`jt~ MGC MGB M@0) M@׸* MAL+ MA2l, MAUX- MA_l. MAdX/ MA40 MBh1 MB:2 MBGt3 MB4 MBx5 MB6 MC 7 MC8 MCʤ9 MD : MDA; MDG< MEh= MEL> MF? MFU@ MFňA MGP MGP MG| MH MH  MH4 MHp MI3 MJD MJ MK\ MK}D MKl MKX ML9 MLW ML MO MO| MPft MP MP MP MQ  MQT MQ, MQX MQ MQ MQt  MQD  MR+  MRBx  MRk  MR  MR  MR  MSl MS| MS.@ MS] MSn MS  MSh  MS  MSܠ  MS  MSd  MTQ  MT  MT  dXJ0z`F,v\B(rXXXXXXXsQ̃M4M4M4drQ̃M4dM4`M4qQ̃M4ϐM4PM4pQ̃M4\M4M4oQ̃M4M4M4@nQ̃M4M4M4mQ̃M4wM4z@M4| lQ̃M4@M4AM4B<kQ̃M4:M4<$M4>jQ̃M4-M4/@M41 iQ̃M4pM4`M4lhQ̃M3M3M3gQ̃M3M3|M30fQ̃M3;M3eQ̃M3M3@M3dQ̃M2lM2\M2cQ̃M2M2M2DbQ̃M21M220M23 aQ̃M2 `M2!M2#l`Q̃M2 M2TM2_Q̃M1lM1M1^Q̃M1M1M1t]Q̃M1hM1M1 \Q̃M1uM1vM1w[Q̃M1jM1k4M1kZQ̃M1TxM1UhM1VYQ̃M1@M1A|M1B0XQ̃M1:M1;M1<WQ̃M17,M18M19 VQ̃M0pM0M0hN4 (B\v,F`z0Jd~tQ̃M5  *zpf\RH>4j`VLB8.$t~ MmJ( Mh MhD MiX MiR` Mif MiT Mi Miɬ Mi@ MjT Mj_ Mjq MjX MjL MjL Mm@ Mm5 Mm/ Mm Mm Ml MlZ( Ml+ MlT MlT Mk Mk( Mk Mkw Mkl MkO MkH, Mk@ Mk1p Mk! Mk Mj Mn MnA Mq Mp Mp) Mp# Mo Mo Mo Mo{| Mq} Mq< Mq Mq Mq Mq Mr Mr! Mr'( Mr+` Mr/ Mr0 Mr: MrG >  *zpf\RH>4j`VLB8.$t~ MmT< Mh Mh$ Mi-X MiS Mig Mi MiX Mi Mi Mj Mjd\ Mjt Mj8 Mjd Mjx MmA Mm:8 Mm2 Mm% Mm@ Ml Mlx Ml=T Ml Ml4 MkD Mk Mkx Mkz Mkr MkQP MkK MkE\ Mk50 Mk% Mk Mkt Mnx MnD< Mq Mp Mp,p Mp(8 Mp Mo Mo$ Mo~ Mq~h Mq Mq Mq Mq Mq Mr Mr%H Mr) Mr, Mr/ Mr2, Mr@ MrH (B\v,F`z0Jd~Q̃M;M;M;Q̃M;pM;|M;Q̃M<M<M<@Q̃M<M< M<Q̃MBM>C@M>CQ̃M?kDM?lM?m` Q̃M?M?M?h!Q̃M?M?M?"Q̃M?TM?żM?#Q̃M?(M?M?T$Q̃M@:8M@;(M@;%Q̃M@SLM@SM@Tx&Q̃M@rxM@shM@u 'Q̃M@M@xM@(Q̃M@dM@TM@)Q̃M@M@|M@0*Q̃M@ѠM@ԬM@׸+Q̃MAlMA MAL,Q̃MA/`MA1MA2l-Q̃MAQ\MASMAUX.Q̃MA\MA^|MA_l/Q̃MAaLMAbxMAdX (B\v,F`z0Jd~0Q̃MAhMAtMA41Q̃MBPMBMBh2Q̃MB8tMB9MB:3Q̃MB?MBEMBGt4Q̃MBMBMB5Q̃MB MBMBx6Q̃MBMBHMB7Q̃MC@MClMC 8Q̃MC@MC MC9Q̃MCȈMCɴMCʤ:Q̃MC4MDMD ;Q̃MD?MDAMDA<Q̃MDEMDGMDG=Q̃MERME`XMEh>Q̃MEMEMEL?Q̃MFMFMF@Q̃MFRMFTTMFUAQ̃MFDMFMFňBQ̃MGMGMGCQ̃MG MGMGDQ>QQHQEQ>QQ $Q FQogQLQQ!GQoQ'Q)@Q+\JQͭP4P5P7KQͭP⢄PP⨜LQͭPPPMQͭP\PP NQͭPhPiPjOQͭPPP ,(B\v0Jd~PQͭP䡰PPdQQͭP PP RQͭPPۄPSQͭPP0PLTQͭPP8PbQͭPPdPcQͭP@PHPMdQͭP^XP_P`eQͭPqPsPufQͭPPDP`gQͭPP|PzQͭPP`P|{QͭP%P'P(l|QͭP8\P>PF}QͭPQPT@PW~QͭP3$P4P60QͭPQͭPPP$QͭPP PQͭPDPPQͭPLPXPQͭP Q Q` I';EOYcmw !+5?IS]gq{1'$.8BLV`jt~ Q  Q  P P P< Pbp PX Pd Pt P. PD Pc Pv P  Pl Pl P1 P= Q`\ Q QC< QɈ Q Q QGd Q Q Q[ Q< Q Q QT Q  Q  Q  Q  Q Q :x Q Q Q T Q q Q T Q l Q Qd Q%l Q{4 Q QC\ Q\ Qͤ QD Qd Q( Q Q Q Q Q\ Q QR Qø Qt Q:0"0 Q"/ Q". Q"- Q Q QC4 Q\ Q (B\v,F`z0Jd~QͭP,PPQͭP֌PPxQͭP,PhPQͭPPP0 QͭPPPP!QͭPYPZP["QͭPqPrhPr#QͭP PP$QͭP,PP%QͭP0P P&QͭPPhP'QͭPtPްP(QͭPPHPt)QͭP4PP`*QͭP(PP4+QͭP\P]P^l,QͭPPP-QͭPxPhP.QͭP4P`PP/QͭPPP0QͭP`PPP1QͭP&XP(8P*2QͭP

    @P@\3QͭPR,PSXPT 4QͭPPpP$5QͭPxP4P6QͭPlP,PX7QͭPtPP! 8QͭPDPGPH9QͭPl PmPn< (B\v,F`z0Jd~:QͭPP`P@;QͭPPDP4<QͭP P P=QͭPk PlPl>QͭPPP?QͭPPhP@QͭPPP<AQͭPPPHBQͭP PLPCQͭPPtP(DQͭPP$PEQͭPIlPJPKLFQͭPXlPY\P[<GQͭP}8P4P`HQͭP,PPIQͭPPȰPˀJQͭPP۬PKQͭPP$PLQͭP:P<P<MQͭP\P`PbpNQͭPҴPӤPXOQͭP8PPdPQͭPPPtQQͭP#P+HR\fpz$.8BLV`jt~ QiH QՐ Qh Q` Qd Qt QU Q\ Q 4 Q  Q $ Q Zp Q  Q Q Q!d Q!6 Q!: Q!I Q! Q! Q#, Q#O< Q#t Q$_ Q$< Q$ Q$ Q$d Q$ Q%  Q% Q%E Q%T Q% Q% Q% Q& Q'a Q' Q'ڬ Q( Q(l Q(tl Q( Q), Q) Q) Q* Q*t Q*T Q,. Q,ɸ Q,H Q-SL Q-| Q/ Q/9 :  *4>HR\fpz$.8BLV`jt~ Qq Qٌ Qd Qc Qj( Q QWH Q Q P Q  Q &h Q `L Q Q Q Q!$ Q!78 Q!<$ Q!K Q!p Q! Q#- Q#aH Q# Q$a Q$h Q$ Q$| Q$ Q$x Q% Q% Q%J0 Q% Q% Q% Q%h Q&p Q'e| Q' Q'l Q( Q(nT Q(y Q(0 Q) Q) Q) Q**< Q*x Q+ Q,0 Q, Q, Q-VX Q- Q/x Q/; (B\v,F`z0Jd~YQͭP:P QҡL7L7L7QҡL6lL6LL6QҡL6~L6 L6(QҡL6eL6fL6gQҡL6KL6N L6PQҡL5=L5>L5AQҡL5'L5)dL5+DQҡL2L34L3`QҡL2&L2wL2QҡKLLLDQҡKLMLPLQQҡKL?L@LAQҡKLLL <QҡKLLLQҡKLL\L܈QҡKLLxLQҡKLLLhQҡKL$L%L&0QҡKLLL QҡKK4K` QҡKKᨄK8 QҡKᘔK8K QҡKkKlKmt QҡKX\K[K]HQҡK-K.K/QҡKK0K QҡKK\lQңLBLD8LEdmQңLVDLWLXnQңL܂L܆L܈oQңLܘ LܙLܚxpQңLܸLܺLܽqQңL̠LμL@rQңLLLsQңLlLLLxtQңLL#L%tuQңL(DL+L-lvQңLCLFLIPwQңL+L,L.LxQңLg@LhlLiyQңLv@LxL{,zQңL޶QҨRN|N}N} X=QҨRN|N|dN|<QҨRN|N|N|p;QҨRN|ؘN|N|:QҨRN|˴N|HN|T9QҨRN|,N|XN|8QҨRN|wN|z$N|~  $X~dJ0z`F,v\B(rX#QҪ-O4O5$O]?O]?jQҫ4OV\OVLOViQҫ4OVOVOVthQҫ4OV{OV}dOV~gQҫ4OVhOVixOVj,fQҫ4OVFOVG@OVGeQҫ4OV? OV@8OVA(dQҫ4OVOVOVcQҫ4OUOU,OUXbQҫ4OU OUOUaQҫ4OU4OUOU`Qҫ4OUOUOUL_Qҫ4OUOUOUh^Qҫ4OUDOU`OU]Qҫ4OUOUOU\Qҫ4OUPOU@OU[Qҫ4OUuOUw\OUxLZQҫ4OUjOUkOUmHYQҫ4OUdOUeOUglXQҫ4OUXOUZOUZWQҫ4OUQOUTpOUUVQҫ4OUIlOUJ OUKLUQҫ4OUCOUDOUE4TQҫ4OU=xOU?XOUA8SQҫ4OUOUOU<RQҫ4OUOU8OUQQҫ4OUOUOUPQҫ4OUOUOUOQҫ4OTOTOTNQҫ4OTPOTOT0MQҫ4OTOT(OTLQҫ4OTڐOTۼOTܬKQҫ4OTӈOTOT JQҫ4OTOTͬOTΜIQҫ4OTOTOTHQҫ4OTlOT OT (B\v,F`z0Jd~XQҭ OO|OlYQҭ OOO(ZQҭ OOO|[Qҭ OOO˰\Qҭ OO4O]Qҭ OݼOO@^Qҭ O,OO_Qҭ OTOO`Qҭ OOXOaQҭ O@OOlbQҭ OOOcQҭ O OOdQҭ OO O!<eQҭ OGpOIPOJ@fQҭ OLONxOPXgQҭ O_O`OahQҭ OnXOsOxiQҭ OhO@OjQҭ O,OOHkQҭ OOdOTlQҭ OOLOmQҭ OO DO pnQҭ O O OoQҭ O*O,0O-pQҭ OYlO\O\qQҭ OcDOdOg|rQҭoOO4O$sQҭoOOO tQҭoOEOKTOOuQҭoOP@OROT 0Jd~'QҞQSQTQUx(QҞQvQxdQyT0QҞK*,K*ېK*1QҞK*K*,K*2QҞK+ K+K+d3QҞK+2K+3K+44QҞK+YK+[K+\5QҞK+dpK+eK+f6QҞK+K+8K+7QҞK+XK+dK+D8QҞK+K+K+x9QҞK+K+tK+(:QҞK+`K+K+и;QҞK+,K+K+֔<QҞK+K+(K+ (B\v,F`z0Jd~vQҭoO`OcLO?QүPO5(O6O6QүPO3HO48O4QүPO'O'O(DQүPOOdOTQүPOOOQүPOOOQүPOLOOQүPOOOQүO$hO%O& QүOO O DQүO\OOQүOTOOQүOOOQүOOԸOlQүOOO< QүO|OlO QүOdOO QүOlOOh QүOOOP QүO|O~O,QүOoOpOqXQүO[O\@O]0QүOXOYpOZ$QүODOEOFQүO8O:O<QүOOOQүO O O TQүOTOO$QүO\OLO $X~dJ0z`F,v\B(rXkQҰP?<TQҰQұP{4xP{5P{7H=QұP{ PP{!P{"<QұP{,P{ XP{ t;QұPzPzPzH:QұPzPzpPz$9QұPzHPzPz8QұPzo\PzpPzrh7QұPz[4Pz\`Pz]6QұPz $Pz#Pz,5QұPyZTPyeXPym4QұQPtPtPt $X~dJ0z`F,v\B(rXQҳ5P{P}tP~dQҳ5PlPmPo(Qҳ5PRPTpPUQҳ5PEPFPHQҳ5PPP hQҲP蛔PtPQҲPRtPS(PSQҲPPPQҲP`PPQҲPpPPøQҲP P簼PpQҲPPP礌QҲPPP瞰QҲPiPq8PQҲPP0PQҲP(PHPQҲP9P:pP;QҲP& P'P+ QҲPBPChPDX QҲP:P<`P= QҲP0P2P2 QҲPPDP QҲPPKHXKZd^QҟKoKpdKqT]QҟKXKK8\QҟK0KLK<[QҟKkKlQҞK+K+K+=QҞK+K+K+ $X~dJ0z`F,v\B(rXQҡKHKKLKLxQҡK+lK-K.<QҡKdKK4QҡK lK\KQҡK0KhKQҡKߥKߦKߧ<~QҠK)HKkKʇ}QҠK:KMK_@|QҠwKK8K8{QҠwKLKxKzQҠ5KKK8yQҠ5K̴K8KxQҠ5KKKDwQҠ5KwdKxKyDvQҠ5KrKrKtuQҠ5K`KcKdtQҠ5KIKKKLsQҠ5K!$K$lK,drQҠ5KKKqQҠ5KKK`pQҠ5KKKoQҠ5KaKcKcnQҠ5K_K_KamQҠ5KK8KlQҟKKKkQҟKBKAKCaQҟK2K4QҢ|LkeLLktLk=QҢ|LkLk"Lk'<QҢ|Lj@LjLj;QҢ|LjgLjiXLjk8:QҢ|LjE@LjFLjH9QҢ|Lj'|Lj. Lj/8QҢ|LjLjLj7QҢ|LjLj`Lj 6QҢ|LiLiLi$5QҢHLfTLfۀLf4QҢHLfͬLfLfP3QҢHLfcLfjLLfpd2QҢHLfLfLf1QҢHLeLeLe`0QҢHLeLeLe/QҢHLeLe Le.QҢHLeLe4Le-QҢHLedLeh@LesD,QҢLPLPLP+QҢLP'LP+tLP-T*QҢLOtLPLP4)QҢLOqLOrLOs< $X,F`z0Jd~v\B(rX'Qҥ|M[M[M[D&Qҥ|M[M[M[%Qҥ|M[~$M[@M[$Qҥ|M[lM[mM[n#Qҥ|M[c0M[d\M[f"Qҥ|M[.M[/M[0!Qҥ|M[)M[*M[,X Qҥ|M[!M["M[#Qҥ M0 M0M0٨Qҥ M0XM0M0tQҥ M0M0,M0 Qҥ M0nM0pM0rLQҥ M0FM0JtM0NQҥ M/M/8M/(Qҥ M/M/hM/(Qҥ M/ M/M/Qҥ M.M.M.QңLِLڀL4QҤ0M M M QҤ0M M M QҤ0M M xM QҤ0M M M  QҤ0M M M  QҤ0M lM M D QҤ0M 'M 'M ) QҤ0M IM K\M LL QҤ0M ۼM M \QҤM$TM$DM$QҤM%M%M%,QҤM,$M,M,PQҤM-M-M- tQҤM.M.M.%QҤM.;M.?TM.CQҥ M.ʌM.M.LQҥ M.,M.ÄM.(Qҥ M.0M. M.L $X~dJ0z`F,v\B(rXQҧNcNcNcpQҧNc0Nc,NcQҧNbNb4NbМQҧnNJNJNJQҧnNJNJNJ0QҧnNJNNJPNJP QҧnNININI QҧnNININI QҧnNIuNIvNIw QҧnNI$NI)0NI* QҧnNHNINIQҧnNHNHhNHQҧnNHNHNHpQҧ N0N0\N0LQҧ N0N0N0`Qҧ N0wN0QҪOATOAOA`=QҪOAOAOA<QҪO#O,O1d;QҪOOO:QҪOOOp9QҪO OؠO8QҪOOO`7QҪqON`O?PO@ $X~dJ0z`F,v\B(rX3QҬOa,OcOd2QҬOUOWTOX1QҬOEOFtOGd0QҬO=O=O>@/QҬO,O-O..QҬO$OO-QҬOOO,QҬOXO O d+QҬOODOp*QҬOPOOո)QҬOOO(QҬuOOO`'QҬuOO,O&QҬuO|OlO\%QҬuOOO@$QҬuOpO`O#QҬuOlOO"QҬuOp@Oq0Oq!QҬuOiOlDOn` QҬuO`Oa|OblQҬuOXXOYOZtQҬuO(O)O+QҬuO' O(O(QҬuO@OOlQҬuOODOpQҬuODOOQҬuOOO,QҬuODOOQҬuOO(OQҬuO{O|O}QҬuOk(OlOmQҬuOBOCOD@QҬuO/(O/O0QҬuO,XO-O.QҬuOOO<QҬuO(OO $X~dJ0z`F,v\B(rXCQҴQ}cQ}dQ}eBQҴQ}UQ}VQ}VAQҴQ}EQ}FTQ}G@QҴQ}BXQ}CQ}D?QҴQ}7Q}8Q}94>QҴQ}3Q}4HQ}4=QҴQ|Q|Q|<QҴPQPQPQP8;QҴPQPK@QPL0QPM\:QҴPQOQOQO9QҴPQOzQO}xQO 8QҴQA QAPQA7QҴQ@0Q@LQ@6QҴQ@Q@0Q@\5QҴQ?0Q?|Q?4QҴQ?Q@Q@3QҴQ?8Q?(Q?2QҴQ?78Q?8Q?:1QҴQ?Q? TQ?0QҳQ8Q9|Q:0/QҳQ0Q2Q.QҳQQ|Q-QҳQQ@Q,Qҳ5PmPoPq$+Qҳ5PBPCpPD$*Qҳ5P*\P+LP-,)Qҳ5P%P&P'P(Qҳ5P(PTP'Qҳ5P|P뱨P&Qҳ5P,PXP %Qҳ5PP댠PT$Qҳ5PsPt|Pu0#Qҳ5P]PLPbp"Qҳ5PhP P!Qҳ5PꙔP8P꜠ Qҳ5PPꌰP ((B\v,F`z0Jd~|QҶ.Q1Q2Q3}QҶ.Q-\Q.LQ/<~QҶ.QeQiQnQҶ.QQ(QQҶ.Q QQ?QAQՅ#QQQRQXQՅ#QaQe8QhD!QշQrQwDQxp"QˑQԂQԃQԄ#QQԻQԼQԾ $Q]Q(QQ€%QQ|QQ&QQQQ'QRQQQ(QRQQQh)Qj>Q.Q/|Q1\*Q֛Q]Q_LQah+Q֛QfQgQh,QQՙQ՚\Q՛-QQQQƨ.QQdQЀQӌ/Q)QxQ,Q0Q)QlQQ1QX^QtQQ2QX^Q3hQ4XQ5 3Q׌Q@QB,QCX4Q׌QIQJQL5QװQaQb Qct J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ Q " Qа" Q" Q " Q1" QE," QP" Q\" Qe" QӚ" Q" Q" Q" QP" Q"0" Q,D" Q.`" Q>" QQ" Qa" Qr" QԂ" QԻ" Q(" Q|" Q" Q" Q" Q." Q]" Qf" Qՙ" Q" Qd" Qx" Ql" Qt" Q3h" Q@" QI" Qa" Qnx" QևP" Q֌" Q֫" Q$" Q" Q" Q" Q:" QO<" Qg" Q׀" Q׷" Q׸" Q$" Q9$" QTT" QؑD" Qػ" Q̐" Q" Q" QYl" Qk" Q" Q" Q" QD" Q'" Q90" QA" Qw" Qہ`" J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ Qh" Q" Q@" Q," Q5" QG" QT" Qa" Qk$" Qӝ" Q(" Q" Q" Q" Q#" Q-" Q/" QA" QX" QhD" Qxp" QԄ" QԾ " Q€" Q" Q" Q" Qh" Q1\" Qah" Qh" Q՛" Qƨ" Qӌ" Q" Q" Q" Q5 " QCX" QL" Qct" Qr" Q։" Q֍," Q֮" Q@" Q" Q (" Q$X" Q<" QP" Qw" Qׂ" Q׺" QŘ" Qь" Q;|" QX" Qؒ" Qؽ" Q@" Q" Q" Q\" Qp" Q$" Qx" Qt" QP" Q+ " Q=," QC" Q{ " QۆL" ((B\v,F`z0Jd~6QװQnxQoQr7QDzQևPQֈ@Q։8QDzQ֌Q֌Q֍,9QQ֫Q֭HQ֮:QQ$QÌQ@;Q(QQHQ<QWQQQ (=QWQQ!Q$X>Q؆Q:Q<Q<@Q؆QO(Q QQfQUQ QlQtgQmbQEQGHR\fpz$.8BLV`jt~ Q," Q" Q܀`" Qܚd" Qܮ" Q" Q" Q8" Q(" Qgh" Qu" Q" Q " Q " QE" Q9" Q," Q@" Q" QP" Q_\" QhD" Q" Qΰ" Q)d" Q" Q" Q" Q" Q " Q_" Ql" Q " Q,0" QH" Q" Q(" Q," QN8" Qo# Q@# Q뚠# Q# QD# Q \# Q# Q4# Q # Q# Q*# QCl# Q,# QHR\fpz$.8BLV`jt~ Q" Q2" Q܋" Qܝp" Qܼ$" Q" Q" QD" Q" QiH" Qv" Q0" Q" Qt" QG" QB" Q " Q<" Q" Q" Qfd" Qu" QP" Qٴ" Q+D" Q䞔" Q" Q " Q߬" QH" Qa" Qn," Qt" Q:" QP" QH" Q" Q H" QQ" Qq$# Q\# Q4# Q# Q# Q ,# Q # Q# Q# Q4# Q0# QFx# Q# QA@# QMp# Q# Q# Q# Q# Q# Q# Q|# Q# Q`# Qx# Qp# Q`# Q8# Q# Q# Q# Q#! QB#" QGD## Qbt#$ ((B\v,F`z0Jd~oQCQQ㥬QPpQ$QΰQQٴqQRQ)dQ*Q+DrQQQhQ䞔sQO@QQ`QtQQQQ uQQQڄQ߬vQQA@QqQHHQJdQMpQǛQ QQQQTQDQQQXQQQwQQ0QQJrQQQQ{Q0QQQݢQQQ|Q QXQQQ:QQQ`Q:QQQxQ:Q DQ QpQ QQdQ`Q8QQQ8QcQ@QlQQ QQQ Q%QtQQ!QN^Q Q Q"Q}]Q?Q@RR\R`xRc?RٛRRR@RRR|RAR6[R۰RPR0BRRRR8CRRMLRPRTTDRGHR\fpz$.8BLV`jt~ Q#& Ql<#' Q#( Q#) Qh#* Q #+ Q#, Q߸#- Q)#. Q8#/ Q#0 Q#1 Q^T#2 QfL#3 Q#4 QƠ#5 Q\#6 Q}p#7 Q#8 Ql#9 RTh#; R#< R#= R\#> R#? R#@ R۰#A R#B RML#C RP#D R/#E R|#H Rd#F R(#G R#I R h#J R)#K R#L R#M R#N R#O R#P R#Q RT#R R'#S RV|#T R #U R #V R @#W R #X R Ul#Y R a`#Z R c|#[ R ~#\ R #] R #_ R ͨ#` R T#a R Y#b R 8#c R ”#d R Ӱ#e R \#f R $P#g R <#h R P#i R t#j R Q@#k Rd#l R$#m R8#n R#o R #p RM`#q J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ Q#& Qn#' Q#( Q#) Q#* Qӈ#+ Q#, Qx#- Q,\#. Q?#/ Q #0 Qp#1 Q_#2 Qgx#3 Q#4 Q`#5 Q #6 QP#7 Q#8 Q#9 RY#; R#< R#= Rc#> R#? R#@ R0#A R8#B RTT#C R#D R3t#E RL#H Rڐ#F R#G R #I R!#J R-#K R#L R\#M R#N R#O R#P R8#Q R #R R*0#S RX #T R$#U R ##V R <#W R #X R W#Y R b#Z R gx#[ R P#\ R d#] R 0#_ R д#` R #a R lT#b R $#c R (#d R #e R h#f R %#g R (#h R #i R #j R T#k R#l R'x#m R9#n R#o R#p RO#q ((B\v,F`z0Jd~FRRdRRڐGRR(RRHRR|R RLIRRRR JRTfR hR!XR!KRTfR)R+0R-LR|RRRMR@RRR\NR RR@ROR RRШRPR 6RRRQR KRRR8RR KRTRR SR KR'R)R*0TR }]RV|RW0RX UR R RR$VR M`R R !R #WR hR @R LR <XR aR R xR YR R UlR V\R WZR R a`R bR b[R R c|R fLR gx\R R ~R R P]R R R 8R d_R R R R 0`R R ͨR R дaR R TR R bR R YR ]R lT (B\v,F`z0Jd~cR lR 8R dR $dR lR ”R R (eR R ӰR hR fR 4R \R R hgR cMR $PR %R %hR3nR R>RRRRִR` R R R!<R{RGRIPRJR{R5RHR\fpz$.8BLV`jt~ Rl#s Rz$#t R#u RŜ#v R#w RɈ#x R#y R#z R#{ R #| R#} R#~ Rl# Rh# R=l# R# R # R5# RG# RkL# R# RJ# R]# R<# R# R# Ra# Rs$# R# R # R8# R# RP# R# RӤ# Rb# Rx# Rt# RGt# R# R# R!# R" # R"%# R"g# R#L # R#r# R$p# R$@# R%O# R%4# R%# R&# R&T# R&n(# R&wL# R&# R&p# R&L# R&Ƅ# R&l# R&ި# R&# R&# R&|# R&# R'# R'# R'## R'LX# R'# R(x# R(# R*T # J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ Rp#s R#t RT#u R#v RD#w Rʴ#x R#y R4#z R#{ R(#| R#} R#~ R# R D# R># Rִ# R!<# R= # RJ# Rt4# R# RM<# Rg# RT# R0# R8# Re# Ru@# R# R|# R# R$# Rh# R# R # Rg# RՌ# R# RK# R# R (# R!# R"# R"-# R"r# R#N<# R#tp# R$r# R$# R%R# R%# R%h# R&&4# R&V# R&pD# R&y# R&\# R&# R&# R&# R&# R&# R&# R& # R&# R&# R' # R'# R'$# R'P# R't# R(# R)`# R*a|# ((B\v,F`z0Jd~ R#EWR" R" $R"!R#uR"%R")R"-"R#R"gR"mxR"r#R$R#L R#MR#N<$R$LR#rR#sDR#tp%R%6R$pR$qR$r'R%8R$@R$R$(R&R%OR%PR%R)R&R%4R%PR%*R'-R%R%LR%h+R'\LR&R&!R&&4,R'R&TR&UR&V.R'R&n(R&oR&pD/R'R&wLR&xR&y0R'ϼR&R&@R&\1R'ϼR&pR&R&2R'R&LR&R&3R(1R&ƄR&ǰR&4R(1R&lR& R&5R((rR&ިR&,R& 6R((rR&R&R&7R((rR&R&,R&8R((rR&|R&lR&9R((rR&R&R&:R((rR'R'R' ;R([R'R',R'<R([R'#R'$DR'$=R("R'LXR'NR'P ((B\v,F`z0Jd~>R(R'R'R't?R*,0R(xR(XR(@R*CR(R)R)`AR+R*T R*\R*a|BR+R* R*R*CR,YNR*R+$|R+/ER,YNR+"`R+$|R+*XFR,R+LR+N4R+OGR-FR,pR,R,HR-FR,R,4R,IR/R.R.,R.PJR0%R.R.HR.dKR2R18R1R1pLR8R7{R7R7tMR:R8R8R8ȬNR:R8R8R8OR:@R9R9R9HPR:ZR9wR9xR9{QR:ZR9`R9R9 RR;oR:BR:ClR:ESR;oR:*R:+ R:+TR;SR:R:R:0UR<(R:R:@R:VRHR\fpz$.8BLV`jt~ R*# R+"`# R+L# R,p# R,# R.# R.# R18# R7{# R8# R8# R9# R9w# R9`# R:*# R:B# R:# R:# R;# R;%# R;D# R;# R;# R<# R<3# RX# R?# R@0# R@ # R@`# R@\# RAx# RAߌ# RB# RB# RBդ# RC# RC:l# RCF$# RCF`# RCbD# RCd# RC# RD<# REk# RE~# RE# RF# RGp$ RGv$ RGd$ RH$ RId$ RJ\$ RK||$ RKh$ RLy$ RL<$ RM$ RN3,$ RN$ RO,$ RO$ RP{$ RP$ RPĘ$ RQG$ J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ R+*X# R+/# R+O# R,# R,# R.P# R.d# R1p# R7t# R8Ȭ# R8# R9H# R9{# R9 # R:+# R:E# R:0# R:# R;# R;)X# R;E# R;h# R;(# R<# R<9t# R[# R?# R@<# R@# R@l# R@# RAȔ# RA# RB$# RB # RBׄ# RCx# RC<# RCG# RCH@# RCc# RCh# RCH# RDH# REm# RE@# RE# RFǐ# RG$ RGT$ RG$ RH$ RI$ RJ$ RK}$ RK$ RL $ RL$ RM<$ RN;`$ RNh$ RO0$ RO$ RP}$ RP$ RP<$ RQI$ ((B\v,F`z0Jd~[R=RdR<R<R<\R=R<3R<7R<9t]R=RA5RA5RR=JR=L$R=McR>R=ZR=eR=gdR?R>XR>Z$R>[eRA.R?R?8R?gRAR@0R@R@<hRAR@ R@xR@iRAR@`R@R@ljRBER@\R@RE~RERE@~RF>RERERERGRFRFRFǐRHZRGpRG$RGRHgRGvRGRGTRH;RGdRGRGRIjRHRHRHRJRIdRIRIRKZRJ\RJRJRLRK||RK}0RK}RM"RKhRKRKRM9RLyRLDRL  RM9RLRRARRBRS:RRRRRRRT&RRRRRRRT&RRRRDRR͜RT&RRhRRRRTRTlRSndRSpRSqpRUuRS RSRSDRURTRTRT RV6URT8RT`RT!RV6URTRTRT"RW RUpRURU@#RW RUʜRUlRU,$RWRVPRVRPRVS%RWFRVRVRV&RX RVʌRV|RV'RX RVӰRVdRV(RX RV`RVPRV@)RX RV RVRV<*RX RVRV@RV+RXHR\fpz$.8BLV`jt~ RQ`$ RQܬ$ RQp$ RR1H$ RR>$ RR$ RR$ RR$ RRh$ RSnd$ RS $ RT$ RT8$ RT$! RUp$" RUʜ$# RVP$$ RV$% RVʌ$& RVӰ$' RV`$( RV $) RV$* RW$+ RW <$, RW$- RW?D$. RWn$/ RWw$0 RW $1 RW,$2 RW($3 RW$4 RX h$5 RX,$6 RXE$7 RX[T$8 RXt,$; RX$< RX$= RX$> RX$? RX$@ RYP$A RY'x$B RY,($C RY$D RY$G RYp$E RYP$H RZY$I RZH$J R[P$K R[2$L R[6$M R[?|$N R[b,$O R[$P R\`$Q R\d8$S R\t$R R\$T R\$U R\$V R\$W R\0$X R\ $Y R\$[ R]$Z R]M$\ R]S $] R]]$^ R]u$_ R]$` J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ RQ$ RQ$ RQ$ RR7$$ RRB$ RR$ RR$ RR͜$ RRT$ RSqp$ RSD$ RT$ RT$ RT$! RU@$" RU,$# RVS$$ RV$% RV$& RV$' RV@$( RV<$) RV$* RWP$+ RW $, RW$- RWF$. RWr $/ RW|4$0 RWx$1 RW|$2 RW$3 RWD$4 RX$5 RX.T$6 RXG$7 RX\$8 RXy$; RXd$< RX$= RX$> RX$? RX $@ RY0$A RY($B RY@P$C RYH$D RY$G RY$E RY$H RZe$I RZD$J R[0$K R[6$L R[;$M R[Dh$N R[d$O R[@$P R\cH$Q R\j$S R\z@$R R\8$T R\$U R\ƨ$V R\($W R\$X R\8$Y R]@$[ R]$Z R]Q,$\ R]Z$] R]c$^ R]y$_ R]$` ((B\v,F`z0Jd~4RY9RWRWRWD5RY9RX hRXRX6RYhRX,RX-RX.T7RYhRXERXG,RXG8RYRX[TRX\RX\;RYRXt,RXuRXy<RYRXRXRXd=RYަRXRXRX>RYަRXRX RX?RZ3RXRX4RX@RZ5RXRXRX ARZJRYPRY@RY0BRZJRY'xRY(hRY(CRZ~RY,(RY=RY@PDRZRYRYRYHER[ RYpRY`RYGR[ RYRY RYHR[9RYPRYRYIR[&RZYRZchRZeJR\ KRZHRZ(RZDKR\QR[PR[R[0LR\~R[2R[4xR[6MR\~R[6R[9(R[;NR\~R[?|R[BLR[DhOR\R[b,R[cR[dPR]8R[R[TR[@QR]R\`R\aR\cHRR]R\tR\x$R\z@ ((B\v,F`z0Jd~SR]R\d8R\gR\jTR]R\R\XR\8UR]R\R\lR\VR^ R\R\¬R\ƨWR^R\R\tR\(XR^3R\0R\HR\fpz$.8BLV`jt~ R^$b R^"$c R^2h$h R^W$i R^x$j R^$k R^$m R^d$o R^4$n R^d$p R_$q R_~$r R_$s R_4$t R_$u R`b$v R` $w R`$x R`$y R`P$z R`${ R`@$| Ra $} Ra$~ RaPt$ Ra$ RbPd$ Rb_$ Rb{$ Rb<$ Rbθ$ Rc $ Rc<$ Rc\$ Rd<$ Rd^T$ RdX$ Rd$ Rd$ Rd$ Re;$ ReJ$ Re@$ Re4$ Rep$ Re$ Re$ Re$$ Reh$ Re,$ ReH$ ReT$ Re$ Ret$ Re$ Rf$ Rf@$ Rf\$ Rfu$ Rf|$ Rf\$ Rf($ Rf$ RgUx$ Rge$ RgP$ Rg$ RgX$ Rh$ Rh"$ Rh4\$ RhF,$ RhK$ Rh\$ J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ R^$b R^'$c R^6($h R^\$i R^$j R^@$k R^$m R^P$o R^$n R^$p R_#$q R_$r R_$s R_$t R` $u R`e`$v R`$w R`$x R`8$y R` $z R`${ R` $| Ra$} Ra$~ RaV$ Ra$ RbT$$ Rba$ RbD$ Rb$ Rb$ Rc$ RcH$ Rcx$ Rd)$ Rd`$ Rd($ Rd$ Rd$ Rd$ ReI$ ReS@$ Re$ Re`$ Re$ Re$ Ret$ Rex$ Ret$ Re $ ReƐ$ Re׬$ Re$ Re$ Re$ Rf$ RfB$ Rfb0$ Rfw $ Rf@$ Rf$ RfȜ$ Rfx$ Rg^`$ Rgg$ Rg $ Rg$ RgD$ Rh$ Rh%$ Rh8$ RhI$ RhN$$ Rh_$ (B\v,F`z0Jd~Rf|ReJReQReS@RfPRe@ReReRf,Re4ReRe`Rf,ReReReRf,RepReReRf,ReReRetRfORe$ReRexRfORehReRetRfORe,ReRe RfOReHRe(ReƐ Rg lReTReDRe׬!Rg lReReRe"Rg@RetReRe#RgN\ReRe,Re$RgN\RfRfRf%RgRf@RfARfB&Rg Rf\Rf]Rfb0'RgRfuRfvXRfw (RgRf|Rf}Rf@)RgRf\RfRf*RgkRf(RfRfȜ+Rh7RfRfRfx,RhkRgUxRgZRg^`-RhkRgeRgfRgg.Rh RgPRg|Rg /Rh RgRg,Rg0Ri6RgXRgRgD1Ri6RhRh@Rh2Rie+Rh"Rh#Rh%3Ri|Rh4\Rh7,Rh8 ((B\v,F`z0Jd~4RiRhF,RhGRhI5RiRhgRhjRhk46RiRhKRhLRhN$7RiRh\Rh_Rh_8RiRhbRhdRhf9RiRhRhDRh:RiRhRhRhx;RiRhpRhRh\<RiRhxRhRh=Rj%RhRh$Rh>Rj5JRhRhHRht?Rj5JRhdRhRh@Rj5JRhRh\RhLARjd-RiXRiRiDBRjd-Ri(Ri*tRi,CRjRiRRiSRiUDRjRi_RibRieHERjRisXRiwTRiwFRj]RilRiRixGRj]RiRiRiHRk{RiRi(RiIRk^CRj 8Rj4RjJRk^CRj\Rj,RjHKRkutRj#\Rj%HR\fpz$.8BLV`jt~ Rhg$ Rh$ Rh$ Rhp$ Rhx$ Rh$ Rh$ Rhd$ Rh$ RiX$ Ri($ RiR$ Ri_$ RisX$ Ril$ Ri$ Ri$ Rj 8$ Rj\$ Rj#\$ Rj=$$ Rjl$ RjrX$ Rj$ RjT$ Rj$ Rj$ Rjh$ Rj$ Rj$ Rk $ Rk$ Rkp$ Rk+$ Rk0$ Rk9$ RkZ$$ Rk,$ Rk$ Rk$ Rk$ RkD$ Rk|$ Rk$ Rkx$ Rk$ Rl $ Rl$ Rl$ Rl$ RlB,$ Rln$ Rl$$ Rl$ Rl$ Rm$ Rmt$ RmL0$ RmQ$ Rm$ Rm$ Rm$ Rn+$ RnK0$ Rnm$ Rnx$ Rn}$ Rǹ$ Rn$ Ro%d$ Ro+@$ Ro6% Rodp% Ro% J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ Rhk4$ Rh$ Rhx$ Rh\$ Rh$ Rh$ Rht$ Rh$ RhL$ RiD$ Ri,$ RiU$ RieH$ Riw$ Rix$ Ri$ Ri$ Rj$ RjH$ Rj'$ RjF$ Rjo$ Rju($ Rj$ Rj@$ RjP$ RjP$ Rj$ Rj$ Rj$ Rk4$ Rk\$ Rk$ Rk/$ Rk2$ Rk;$ Rk_$ Rk$ Rk$ Rk$ Rk$ Rkp$ Rk\$ Rk($ Rk($ Rk$ Rl $ Rl$ Rl8$ Rl$ RlD$ RlqH$ Rl$ Rl$ Rl$ Rm p$ Rm$ RmN$ RmU$ Rm$ Rm$ Rm$ Rn-$ RnZ$ Rnp$ Rn|$ Rn$ Rn$ Rnl$ Ro)$$ Ro.$ Ro< % Roi% Ro % ((B\v,F`z0Jd~PRkRjTRj$Rj@QRkRjRjRjPRRlRjRjĜRjPSRlRjhRjXRjTRl5jRk Rk Rk4VRl5jRjRjRjWRl5jRjRjRjXRlcRkRkRk\YRlcRkpRk$RkZRlcRk+Rk-Rk/[RlcRk0Rk1Rk2\RlORk9Rk:Rk;]RlRkZ$Rk[Rk_^RlRk,RkHRk_RlRkRkdRk`RlRkRkHR\fpz$.8BLV`jt~ Roό% Ro@% Rp+% Rp% Rp% Rqc$% RqL% Rql% Rr\% Rř% Rr֠% Rr,% Rr<% RsV% Rsy% Rs|% Rs% Rs% Rt% Rt % RtT% Rt% Rt% Ru% Ru?% Ru^p% Run`% Rux%! Ru%" RuǬ%# Ru%$ Rvx(%% Rw2@%& Rw}%' Rw%, RwL%( Rwh%- Rw%. Rw٘%1 Rx%2 Rx%3 Rx1%4 Rx%5 RxP%6 Rx`%7 Rxۤ%8 Rx%A Ry%9 Ry"%: Ry%<%; Ry4%B RyM%G Ry\%H Ryl%I Ry0%J Ry%K Ry %L Ry%M Rz%N Rz4%O Rzl%P Rz+%Q RzFt%R Rz{0%S Rz%T RzD%V Rz%W Rz@%X Rz%Y Rz%Z R{ (%[ R{L%\ R{j%] R{%^ J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ Ro8% Rp% Rp0% Rpx% Rp,% Rqe|% Rq% Rqx% Rrb% RrL% Rrؼ% Rr(% Rr% Rs_% Rs{(% Rs~4% Rs% Rs4% Rt% Rtx% Rt$% Rth% Rt% Ru% RuB% Ru_% Rup% Ru{%! Ru%" Ru%# Ruh%$ Rv}%% Rw6%& Rwd%' RwP%, RwX%( Rw%- Rw`%. Rw<%1 Rxl%2 Rxd%3 Rx2%4 Rx%5 Rxl%6 Rx%7 Rx%8 Ry %A Ry!@%9 Ry$L%: Ry( %; Ry6%B RyR<%G Ry`%H Rym%I Ry%J Ry\%K Ryt%L Rz%M Rz%N Rz0%O Rz%P Rz.P%Q RzI%R Rz~x%S Rz%T Rz%V Rz%W RzH%X Rz%Y Rzh%Z R{ D%[ R{N%\ R{q%] R{%^ ((B\v,F`z0Jd~-RxhRwhRw Rw.RyRwRwRw`1RyRw٘RwRw<2RyaRxRxRxl3RyaRxRxRxd4RyaRx1Rx1Rx25Ry]RxRxRx6RyaRxPRxRxl7Rz4Rx`RxRx8RzRxۤRxHRx9RzI/RyRyRy!@:RzI/Ry"Ry#Ry$L;RzI/Ry%xR~AR~EpRXR~HR~OR~P J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ R{l%` R{%a R{%b R{|%c R{%d R|#%e R|Ph%f R|h%g R|8%h R|T%i R},%j R}h|%k R}p%l R}d%m R~=%n R~E%o R~P%p R~W%q R~[%r R~g@%s R~n%t R~sp%u R~z<%v R~%w R~%x R~%y R~%z R,%{ R%| RVP%} R%~ RP% RL% R% R8% R'$% R)% R% R% R% R% R<% RR4% Rp% R% R8% RC$% RK% R\% Re% RX% RD% R% R4% R% R% R% RC% RV% Rl% R|% R% R% Rր% R% R`% R% R % R, % R3P% RH% RV% Rfh% Rr% J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ R{%` R{x%a R{%b R{%c R{%d R|%e R|M\%f R|fp%g R|%h R|8%i R}*`%j R}gP%k R}{%l R}Ԉ%m R~#%n R~>x%o R~H%p R~TD%q R~X@%r R~_H%s R~j%t R~p%u R~x\%v R~%w R~d%x R~%y R~%z R~%{ R%| ROH%} RD%~ R@% Rp% R,% R% R$% R(% RT% R% RT% RH% R % RMH% R|% R% R7% RA% RIx% RZ% Rdl% R% R8% R|% R\% R% R$% R% RAp% ROD% Rh% Rz% R<% RP% Rd% R޴% R% R% R@% R(% R1% RF% RT% Rb% Rp% ((B\v,F`z0Jd~qRXR~TDR~UR~WrRXR~X@R~Z R~[sRXR~_HR~bTR~g@tR*R~jR~kR~nuRSR~pR~rR~spvRSR~x\R~yR~z<wRSR~R~R~xRR~dR~TR~yRR~R~pR~zRR~R~R~{RMRRdRՐRր?R0R޴RR@R0RR4R`AR0RRPRBR_R@R0R CR_R(R)R, DR_R1R2R3PER[RTRURVLR[RFRGRHMRRpRqRr ((B\v,F`z0Jd~SRRbReRfhTR͚RRRUR͚RRxRHVR[RRƼRpWR0FR8RRXR^tR1R3R5YR^tRRXRtZR RRlRSRT[R RYtR[R\\RRRR]RRRR^R_RR|R_RRdRR`R)RRRaR)RRRbRR}R\RcR>RR$RdR RdRReR RRR|fR RRxRݔgR6ARR,RhR6ARRRiRX;R hR XR jRX;R dRRpkRX;R"|R#lR$\lR RuRwRymR R}R~RnRR4R`RP J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ R% R% R8% R% R1% RRl% RYt% R% R% R% Rd% R% R% R}% R% Rd% R% R% R% R% R h% R d% R"|% Ru% R}% R4% R% Rx% R% R% R% R%% RN% RR% Rr% R% R8% Rڤ% R% R$<% R2% Rah% Rm % Rw4& R& RP& R& Rx& R& R@& R& R& R7& RH& RH& R@& R9& R@& R& R& R& RGp& R& R(& RD& R& R$& R/x& RD& R& Rp& R~d&! R_d&" RhL&# J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ RH% Rp% R% Rt% R5% RT% R\% R% R% R% R% R% R% R% R% R% R|% Rݔ% R% R% R % Rp% R$\% Ry% R% RP% R% R͔% R% R% R% R( % RP\% RTX% R} % R % R% Rݰ% R% R&X% R4,% Rdt% Rq% R}L& R& R& R& R& R& R& R& R%& R;$& R& R & R& R>& R & R,& RL& R& RRt& R& R& R`& R& R0& R2& R& R& Rt& R`&! Ra&" Rt&# ((B\v,F`z0Jd~oRRRRpRRxR̤R͔qR.RR RrR.RR4RsR]RRRtR]R%R'R( uR6RNRORP\vR6RRRSRTXwRRrRwR} xRʕRRR yRR8R(RzR-xRڤRRݰ{R_%RRR|RtR$R@RhRR|R9RRR@RR RRRxR,RRR\RLRRRRRRGpRJ@RRtRMRRRRMR(RRRMRDR4R`RRRRRDR$RR0RsR/xR1XR2RRDRpRRRRDR RhRpRr4Rt!RR~dRDR`"RR_dR`TRa#RRhLRmRt$RR|RR%RSR$RR&RSRpRR0'RCRRR(Rt@RR#TR%)Rt@R0R2R2*RlR?R@RB+RRjRkHRk ((B\v,F`z0Jd~,RPR$RRL-RPRRPR.RPR86RRXRdRh7RRhRR88RRR R9RRRpR:RR@R RL;RC&RR0R>RC&R ,RR!ARqR#pR'R*CRR8RDRPDRRRRFRRRR”GRR R9,R?HRRbRcRdIRRhRRpJRRRRKRRRR8LRBR|R\RMRZRPR|RlNRZR(R)R*OR\qRRR8 J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ R$&% Rp&& R&' R&( R0&) R?&* Rj&+ R$&, R&- R<&. R0&/ Rޘ&3 RP&0 R;&5 RKX&4 RX&6 Rh&7 R&8 R&9 R@&: R&; R ,&> R#p&A R8&C R&D R&F R &G Rb&H Rh&I R&J R&K R|&L RP&M R(&N R&O RT&P R &U R/&V R6&W RhD&X Ru&Y R&Z R3x&[ Red&\ R&] R&^ R&_ RV&` R^x&a R&b R&c RX@&d Rx\&e RX&f Rq&g Rװ&h R&i RWl&j Ru0&k R&l R&m R&n RH&o Ra&p R&q RD&r Rq&s R}&t R4&u R &v RXX&w RH&x Rx&y Rl&z J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ R&% R0&& R&' R%&( R2&) RB&* Rk&+ RL&, R&- R&. R&/ RP&3 Rl&0 R>8&5 RNd&4 Rh&6 R8&7 R&8 R&9 RL&: R&; R!&> R*&A RP&C R&D R”&F R?&G Rd&H Rp&I R&J R8&K R&L Rl&M R*&N R8&O R&P Rp&U R1&V R8t&W RkP&X Ry`&Y RX&Z R9&[ Rg&\ RH&] R&^ R@&_ RY&` R_&a R&b R|&c Rb&d Rz&e R&f R&g R&h R&i R]&j R&k R&l R&m R`&n R!d&o Rd&p R&q R&r Rt&s R&t R&u R X&v Rg&w R&x RX&y R&z ((B\v,F`z0Jd~PR>RTRRURR R R XwRgRXXRc\RgxRRHRRyRRxRhRXzR +RlRRR RRVIRRRxR;RRRR@RjRkRmR@Rs8RtdRu R,RPxRRRS R RnxRpRr RRRRҌ R&RRRl RUR)DR/ R4H J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ RC\&| R&} R7&~ R4& R|& Rl& R& R& R& Rj& Rs8& RPx& Rnx& R& R& R)D& RY& R& R& R& R& R3 & Rc& Ry\& RD& R$(& R:0& Ru& R& Rd& Rqp& R& RQ& Rq& RT& R& Rh,& R& R& RL& R&l& R3& R& R(& R& R|& RD& R& R& RD& RKT& R{& R & RL& R$\& R+d& RY& Ra& Rn& Rz$& R& Rh& R@& Rl& R& RL& R& RX& R|& R d& R!0& R<$& REH& RN& J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ RG&| R&} R<&~ R& R& R& R& Rx& R& Rm& Ru& RS& Rr& RҌ& Rl& R4H& Rg& R\& R\& R& R& R6T& Re& Rt& R& R($& RC& R& R& Rh& RsP& R& RS& Rw& R& R& Ry& R@& Rİ& R& R(L& R4& R& R*X& R,& R& R0& R& R& RE& RL& R& R(& R,& R'h& R2& R^& Rd& Rqx& R|& R4& R8& R& Rp& R<& R& RP& R& R\& R& R$& R?& RHT& RP& ((B\v,F`z0Jd~RURYR^RgR8RRTR\R8RRTR\RRRRR?QRRRRlOR3 R5(R6TRRcRdReRʉRy\R{RtRɈRDRRRjTR$(R'pR($RjTR:0R?RCRȊRuR{RRORRԤRRjRdReRhRjRqpRrRsPRjRR0R RMRQRRRS!RMRqRsRw#RنRTRR$R 4RRR%RRh,RqRy&RRRR@'RRRHRİ(RRLRRRhR R8?R4R@RR@RRlRoRpARRRR<BRRLRxRCRRRRPDR5RXRRER5R|RR\FRMeR dRRGRMeR!0R" R$HRyR<$R=PR?&   IRyREHRFtRHTJRyRNRORPKRyRVRXR[PLRyR]R`RcHMRyRm RnRp,NRyRdRRORyR,RR8PRyRRRQRyRRRlRRyRʤRHRdSRyRXRTRTRGbRRHRURGbRR@RVRdMR5R8R:WRdMR;R82,& L#kI-l O 2 w[<bE'dG%dF&kO1wY=!dxKo7[;#Gk3Wu7%[*#1GkF3W{C_{5Rn (Eb=Z{3Rs3Ol ,SpMn+Oo H, J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ R]& Rm & Rd& R,& R& R& Rʤ& RX& R& R& R5& R;& RK& RX4& RiP& Ry@& Rh& R& R& Rx& RX& RD& R& R& RT& R[l& Rq& Rx& R& R& R& R,& R & Rd& R& Rq& R|X& R& R$& R<& R& Rh& R& R& R)& R& R& R,& RI& R`& Rm& R& R' R' R ' Rw' R' R0' RƠ' R̸' R' Rh' Rl' R' R' R(' R ' R4' RF' RH' ROp' Ra@' Ro' Rv' J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ RcH& Rp,& R& R8& R& Rl& Rd& R& R& R& R:& R=& RM& Rc& Rm& R~,& R& R& R& R& R& R& R& R& R& R]& Rs& R& R& R& R<& RD& R4& R& Rl& Rt$& R~t& R& R& R& RĈ& R& R & R& R/h& RՔ& R& R/& RL& Rd@& Ro& R& R`' R' R' R' R' R' R' RҔ' R' Rj' R' R4' Rր' R' R ' R6' RG' RJ' RQP' Rd' Rr ' Ry(' ((B\v,F`z0Jd~eRR[lR\\R]fRRqRrRsgR+RxRRhR+RR|RiRRR|RjRRRR<kRR,RRDlRR RdR4mR#RdRRnR9"RRPRloRCRqRspRt$pRCR|XR}R~tqRRRRrRR$RRsRRHR\fpz$.8BLV`jt~ R' Rh' R,' R+' RT<' Rs,'! R›'" R'# R '$ R'% R'& R:'' Rùl'( R') R6'* Ra'+ R', R'- R'. RL'/ RH'0 R'1 R0'2 R'3 R$'4 R4'5 RX'6 Rp'7 RƋ'8 Rƒ'9 Rơ': RƯ'; Rќ'< R'= R&'> Rs'? RǨ'@ R'A R`'B R)'C R[\'D Rȇ0'E R@'F Rv'G Rɠ'H R'I Rw 'J Rh'K Rfl'L Ry,'M R}'N R˅ 'O R˥'P R˴'Q R'R R'S RA'T R|'U Ȑ`'V R 'W RT'X R'Y R'|'Z R<'[ RJ'\ Ŕ@'] R'^ R'_ Rϑ'` Rϛ'a R?'b R'c RD'd RX'e J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ R' R' R' R/' RX8' Rvt'! R¹@'" R'# R d'$ R'% R!P'& RC'' Rû'( Rü') R='* Rfd'+ R@', R'- Rd'. R^'/ R$'0 R'1 R'2 Rd'3 R&'4 R7d'5 Rd('6 Ru'7 RƎ'8 RƔ'9 Rƣ': RƲ'; R߬'< R'= R)D'> Rw'? Rdz'@ RT'A R<'B R,'C Rm'D Rȗ'E Rè'F Rz'G Rɣ'H R'I Rzh'J R'K Rh'L Rz'M R'N Rˎ'O R˨H'P R˸8'Q R'R R'S RN8'T R̂'U R̒0'V R'W R'X RH'Y R*'Z RA'[ RLH'\ Rͅ'] R'^ R('_ Rϖt'` RϮ'a RA'b R'c R'd Rd'e ((B\v,F`z0Jd~>RcR&R(R)D?RȪRsRu4Rw@RRǨRǬRdzARRRلRTBRR`R|R<CRcR)R+R,DRɔeR[\RdRmERRȇ0RȐRȗFR6R@R0RèGRiRvRwRzHRRɠRɡRɣIRRRtRJR˿Rw RxRzhKRRhRRLR̓RflRgRhMRCRy,RzRzNRCR}R~TRORCR˅ Rˈ,RˎPR-R˥R˧R˨HQRR˴R˶R˸8RRRR,RSR4NRRRTR͔RARH RN8URR|R̀R̂VRȐ`ȒR̒0WRR RRXRPRTR4RYR.bRRhRH ((B\v,F`z0Jd~ZR`R'|R(lR*[R`RRA\RΒvRJRKRLH]R#Ŕ@R͂Rͅ^R4RR`R_R5RRtR(`RPRϑRϔRϖtaRRϛRϠRϮbRѐeR?R@RAcR11RRlRdR11RDR4ReR`IRXRRdfRҏeR@PRBRExiRRэlRяRѐxjRRђRєRћkR`RѤ(RѤRѥlR`RѬRѭRѯmR RѾRѿR nR RLR,RoR4RRRXpRKRDR@RhqRԭERn Ru(RyrRRӭ,RӯRӱdsR2RRR@tRdRR4RHR\fpz$.8BLV`jt~ Rэl'i Rђ'j RѤ('k RѬ'l RѾ'm RL'n R'o RD'p Rn 'q Rӭ,'r R's R4't R_'u Rԭ'v R^L'w Rq'x R('y R8'z RM<'{ Rؐ'| Rبh'} R'~ R' R' R&' R64' RJ ' RT4' Rف' R ' R' R' R4' RX' Rl ' Rڥx' Rְ' Rap' Ru\' Rۨ' R܅' Rܬ' RL' R]' Rݗt' Rv' Rނ' Rަ' R' Rߙp' R4' R|' Rv' Rh' R' R' R9(' R' R |' R㽄' R䚈' RƘ' R' R尼' R' R' RD' R' R' R>' R' RD' R ' RD' J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ Rѐx'i Rћ'j Rѥ'k Rѯ'l R 'm R'n RX'o Rh'p Ry'q Rӱd'r R@'s Rt't R`<'u RԮ'v R`h'w Rz'x R'y RH'z RT'{ R؜t'| Rػd'} Rh'~ R$' R`' R(`' R9' RL' RV' Rٓ' R<' R' R' R6' RZ' Rn' Rڦ' R' RjX' Rz' R۪' R܌' Rܯ' RƠ' Rg' Rݷ' RwH' Rރx' R޳' R' Rߜ@' R' R,' Ry' Rt' R$' Rx' RC<' R' R#' R' R' RL' R' R帴' R' Rެ' R' Rx' R`' R@' R ' R8' Rd' R$' ((B\v,F`z0Jd~RސR]Rd RgRRݗtRݧRݷR߽4RvRvRwHR߽4RނRނRރxRRަRޫR޳R0RRPRRϩRߙpRߚ`Rߜ@R0:R4R$RR`FR|R\R,RừRvRxRy RừRhRHRt!R3RRR$"RDRRRx#RpR9(RBLRC<$R0RRR%R_bR |R" R#&RCR㽄RR'RR䚈R R(RRƘRhRL)RRR߬R*RR尼R崸R帴+RRR4R,R.sRRݼRެ-R.sRDRR.RBRRRx/RX+RRdR`0RR>R?RR|R禈Rx?RWRdRތR\@RGkR0RRARswR)PR, R-BR顤RNXRORQ(CRRmRqRsDRRuRw RxER R~(RR膘FRRLRdRGRR\RLRHR+lRR|R0IRZR RR-JR7RQRSpRVKR7Rb4Re|RixMRgRR鋰R錠NR'R閴R闤ROR'R4R`R@ J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ R+' R?,' RR' R[L' R畨' R' R|' R礨' Rd' R0' R)P' RNX' Rm' Ru' R~(' RL' R\' R' R ' RQ' Rb4' R' R閴' R4' R' R' R"(' R/ ' RTP' Rt0' R' R*' RR$' Rl' R~p' R' R8' RK' R(' R잸' Rϴ' R' R' R' R[(' R{' R4' Rm' Rq ' R' Rt' Rp' R4' Rژ' R' R ' R' R4' ROP' Rv8' R' R' RP' R@' R' R,' R?P' Re ' R~\' R' R' RԜ( R( R( J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ R.L' R@' RTD' R]h' RL' R' Rx' Rx' R\' R' R-' RQ(' Rs' Rx' R膘' R' R' R0' R-' RV' Rix' R錠' R' R@' R' R' R$D' R7' RVl' R}' R\' R1' RWL' Rp`' R' R' R@' RO' R`' R' R' R' R' RH' R^p' R}$' R흸' Rp' Rs' R' R' R(' R' R' RP' R' R/' R8' R[D' Rw' R' R ' R0' Rڈ' Rp' R' RB' Rg(' Rx' R' R' R( R( Rt( ((B\v,F`z0Jd~PR?RRRQRTRR RRRTR"(R#R$DSRTR/ R3R7TRWRTPRU@RVlUR뷾Rt0RyR}VRoRR`R\WRnR*R.R1XR쁎RR$RT@RWLYRRlRmRp`ZRR~pRR[RRRHR\R텴R8R=8R@]R텴RKRLRO^RR(RR`_RR잸RR`RRϴRhRaRRRRbRRRRcRRR,RHdRR[(R]R^peRR{R{R}$fRR4RR흸gRﶔRmRoRphRﶔRq RrLRsiRﶔRR4RjRqRtRdRkR>RpRR( ((B\v,F`z0Jd~lR>R4R$RmR*]RژRLRnR*]RRRPoR*]R RRpRkRR*R/qRR4R6HR\fpz$.8BLV`jt~ R3( R?( RI( R[`( Rb,( Rk( RwD( RX( R( R|( R( R2( RM|( Rb( R( R( Rt( Rƨ( R@( R( R ( R@L( Ru( R( R|( R( R( R% (! ReD(" Rx(# Rd($ R(% R|(& R|(' Rz(( Rp() R(* R"(+ R'(, Rn(- Rv|(. R(/ R (0 Rk(1 RP(2 R(3 R (4 R?H(9 R0(: R܌(; RH(< R$(= RX(> R"T(? RP(@ R(A R(B R(C Ri (D R (E R͘(F R(G R(J R,(K R4(L R (M R*h(N R,(O R0(P RY (Q R\(R Rn`(S R|(T Rl(U J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ R7H( REX( RM( R^( Rg( Ro( Ry( R( R4( R ( R@( R4,( RO( Ri( R( RX( R( Rx( RH( R( R( RA( Ry( R( R( R ( RH( R(T(! Ri@(" RX(# R($ R(% R(& R(' Rt(( R() R(* R#(+ R)$(, Rq(- Ry(. R(/ Rx(0 Rs$(1 R0(2 R(3 R(4 RA((9 R<(: Rި(; R(< R&$(= RT(> R0d(? RYh(@ R(A R(B R(C Rkd(D R(E R(F R(G R(J R(K Rx(L R$(M R,(N R.(O R6 (P RZ(Q Rbl(R Rtx(S R(T R (U ((B\v,F`z0Jd~'R*R|RR(RRzR{Rt)RRpR$R*R WRR0R+Rn(R"R#HR#,Rn(R'R(pR)$-RRnRoRq.RRv|Rx\Ry/RPRRPR0RER RLRx1R8RkRodRs$2RQRPRR03R)RRR4R@R RR9RoR?HR@8RA(:RR0R R<;RR܌R|Rި<RB[RHRR=RpR$R%R&$>RRXRtRT?RiR"TR,,R0d@RRPRTRYhAR7RRRBRDYRRRCRjRRxRDRDRi Rj8RkdERR RdRFRR͘RФR ((B\v,F`z0Jd~GR*RRRJR*RRRKR*R,RRLRXR4R0RxMRXR R"pR$NRXR*hR+XR,ORXR,R-R.PRXR0R3R6 QR9RY RYRZRRR\RaRblSRRn`RoRtxTRR|R~PRURRlRR VRR|RRŐWRR|RLRhXRoVR!R#R#YRrR9R;8RHR\fpz$.8BLV`jt~ R|(W R!(X R9(Y RuX(Z R([ R(\ R(] R(^ R$(_ R(` R(a R(b R (c R<(d RE<(e RH(f RP(g Rn(h RĀ(i Rڈ(j R(k R$\(l R݄(m R(n S(o S&(p SF(q SK(r S](s S(t S(u S((v S(w S`(x Sy(y S4(z St({ S\(| S*D(} Sl( Sy( S( ST( S,( S]( SŒ( SD( S0( SD( S[ ( S4( S.( SB( Ss4( S( S{( SP( S1( SR( S L( Sih( S( S ( S ̸( S ( S l( S ( S ( S $( S 9x( S H( S y( S ( S ( J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ Rh(W R#(X RSSdSlS?S\SSS$@SSDSӬS$AS6|SS\SBS6|SPSSCS6|SxShSDS6|SS S ES6|SHR\fpz$.8BLV`jt~ S &( S 4@( S Z( S ( S $( S ( S 5 ( S ( S '( S cx( S ( S ( S ( Sd( S( SD( S( SP( Sx( S( S<( S.`( S[`( SrX( S ( S( S( S ( SW( S( Sp( S p( S/( Sb( S( SP( Su4( S( S( S( S'( SRt( Ss( S( S( S( S%( S)`( SQ8( S^( Ss( S( S( SԴ( S ( S$( S$( S[<( Sq( ST( Sl( S( S,( S( SI( SkX( S@( S( S( S(( S( S_( S( S( J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ S 0( S 6( S ]( S \( S ( S ( S 7( S (( S )( S h(( S ȸ( S $( S( S( S$( S$( S( S( S( S ( S( S0@( S\( Su(( S ( S8( S\( S ( Se( S8( S( S( S1( Sd(( S0( S( Sx( ST( S( S ( S.\( Sc( Sv( S( St( SP( S(4( S+|( SR( Sb( SuP( S( S<( Sذ( S( S\( S'( S]( ST( S4( Sx( S( S( S%( SKx( Smt( S\( S( S( S( S ( Sc( S( S8( (B\v,F`z0Jd~HSSrXSsHSu(ISaS S0S JS#SSS8KS#SSS\LSRS S 8S MSSWS_SeNSfSS S8OSGSpS`SPSRS pSSQS'S/S0S1RS9SbScSd(SS SSS0TS9SPSSUSĤSu4SwPSxVSĤSSdSTWSSSSXSfS'S)S.\YSfSSlS ZSISRtS` Sc[SISsStSv\SnSSdS]S" SSSt^SeSSSP_SeS%S'S(4`SyS)`S*S+|aSySQ8SQSRbScS^S_ SbcScSsStSuPdScSSS ((B\v,F`z0Jd~eSASSS<fSASԴSXSذgSAS SShSAS$SS\iSAS$S%S'jSS[HR\fpz$.8BLV`jt~ S\( S( Sl) S) SY8) S) S4) S) S) S ) S;) SD) S`0) Sk) Sr) S{) S`) S) SL) SP) SX) St) S) S) S98) SX() Si) S) S)! Sd)" S\)# S)& S)' S@l)( S)) S)* SD)- SH). S7)/ S)0 S)1 Sƨ)2 S )3 S =)4 S @)5 S p)6 S!)7 S!,)8 S")9 S"q(): S"); S")< S")= S#)> S#P)? S#h)@ S#0)A S$)B S$d$)C S$x)D S%=,)E S%F)F S%[h)G S&)H S&D)I S&d@)J S&f)K S& )L S&)M S&\)N S'$)O S')P S')Q S(9)S J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ Sb0( S( S) S) S^$) S) S) SѰ) Sp) S) SB0) SG) Sb) Sn) Su ) S~) S0) S) St) S) S) ST) S<) SH) S;) S[) Srh) S) S)! Sp)" S)# S)& S,D)' SF)( SP)) S@)* S)- S). S<)/ S0)0 S4)1 S@)2 S X)3 S @)4 S 8)5 S )6 S!)7 S!)8 S"8)9 S"xl): S"0); S"h)< S")= S#)> S#¨)? S#8)@ S#)A S$#t)B S$g0)C S$)D S%@)E S%J)F S%aD)G S&)H S&F@)I S&e)J S&h<)K S&)L S&)M S&4)N S')O S'T)P S')Q S(@)S ((B\v,F`z0Jd~(S|S@lSCSF)SًSSSP*SVSSS@-S zSDSS.S 5;SHSdS/S dS7S9TS<0S ŽSSpS01S SSS42S SƨS˔S@3S!HS S LS X4S!zS =S ?\S @5S!S @S S 86S"S pS S 7S#S!S! S!8S#5sS!,S!S!9S#5sS"S"S"8:S#oS"q(S"u`S"xl;S#;S"S"|S"0<S#;S"S"S"h=S$ S"S" S">S$@S#S#S#?S$@S#PS#@S#¨@S$@S#hS#S#8AS%1S#0S#\S#BS%cS$S$S$#tCS%S$d$S$eS$g0DS%@S$xS$S$ES&US%=,S%>S%@ ((B\v,F`z0Jd~FS&US%FS%HlS%JGS& S%[hS%] S%aDHS'dS&S&S&IS'S&DS&ES&F@JS'S&d@S&e0S&eKS'S&fS&gS&h<LS(S& S&LS&MS(S&S&S&NS(3S&\S&S&4OS(S'$S'@S'PS) S'S'8S'TQS)0eS'S'8S'SS)xS(9S(S)D0XS*&S)FS)HhS)IYS*S)zS){S)|pZS*S)}$S)~S)[S*S)S)S)\S*S)|S/ES.O\S.YpS.cHS/S.rS.uTS.vS/US.S.S.@S/US.S.$S.S/US. S.S.S0{S.ۄS.dS.4S0{S.S. S. J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ S(l)U S))V S)8)W S)F)X S)z)Y S)}$)Z S))[ S)<)\ S)0)] S)ð)^ S))_ S)T)` S*3)a S*I)b S*S)c S*c)d S* )e S*)f S+4)g S, )h S,")i S,-)j S,_)k S,}l)l S,)m S-4x)n S-N)o S-)p S-d)q S-)r S-)| S-h) S.6) S.:) S.Ft) S.O\) S.r) S.) S. ) S.) S.ۄ) S.) S/)) S/? ) S/a) S/o,) S/x) S0d) S05) S0A,) S1<) S1) S18) S2) S2F) S2z<) S2l) S2) S3D) S3N) S3pT) S4) S53D) S5q$) S54) S5) S5) S5Ǡ) S5) S68) S6 @) S6') S6F) S6SP) J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ S(x)U S)$)V S)D0)W S)I)X S)|p)Y S))Z S))[ S))\ S)L)] S)Ƽ)^ S))_ S))` S*8,)a S*L)b S*U)c S*i)d S*()e S*)f S+)g S,)h S,%)i S,.p)j S,h)k S,)l S,x)m S-6)n S-`)o S-)p S-H)q S-8)r S-D)| S.`) S.9) S.>|) S.J) S.cH) S.v) S.@) S.) S.) S.4) S.) S/+) S/A) S/c) S/t) S/) S0,P) S08) S0F) S1) S10) S1:) S2) S2K) S2{) S2x) S2 ) S3E) S3P) S3s) S4() S5u) S5vL) S5) S5) S5) S5) S5) S6) S6 ) S63) S6I) S6T@) (B\v,F`z0Jd~S0{S/)S/*S/+S0S/? S/@S/AS0VS/aS/bS/cS0VS/o,S/wS/tS0'S/xS/S/S1_S0dS0#S0,PS1_S05S07S08S1NS0A,S0DS0FS2]RS1S1S10S2]RS18S19`S1:S2]RS1S7QS6FS6HS6I?S7S6SPS6SS6T@@S7S6`S6dS6fAS7ΩS6{(S6}S6BS7ΩS6S6S6DCS7ΩS6S6tS6DS8!S6S6S6\ES8!S6\S6S6,FS8!S6S6DS6ȀGS8!S6S6`S6ڌHS817S6S6S6IS817S7DS7PS7JS8a7S7!TS7"S7#4KS8S7=S7MS7ZLS8~S7pS7S7MS8~S7S7S7OS8~S7HS7S78QS9S7HS7(S7TSS9S7S74S7$TS9S7ФS7S7DUS9F"S8pS8S8VS9S8XXS8[S8]WS9S8`PS8a@S8bXS9S8tS8wS8{YS9S8(S8TS8ZS9S8(S8S8p[S:S8ƀS8ǬS8Ȝ J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ S6{() S6) S6) S6) S6\) S6) S6) S6) S7D) S7!T) S7=) S7p) S7H) S7) S7H) S7) S7Ф) S8p) S8XX) S8`P) S8t) S8() S8() S8ƀ) S8|) S9 ) S9v ) S98) S9) S9P) S: ) S:DL) S:`) S;) S;) S;!P) S;<) S;Lp) S;dX) S;sX) S;) S;L) S;) S;) S;) S<) S<) S) S>*D) S>N ) S>@) S>) S>) S>) S>T* S?* S?'* S?F* S?* S?݀* S?X* S?* S@ p* S@8* S@I* S@p* SAh* SAa* J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ S6) S6D) S6) S6\) S6,) S6Ȁ) S6ڌ) S6) S7) S7#4) S7Z) S7) S78) S7) S7T) S7$) S7D) S8) S8]) S8b) S8{) S8) S8p) S8Ȝ) S8 ) S9$) S9y) S9) S9) S9|) S:d) S:Ex) S:) S; ,) S;) S;") S;@@) S;M) S;e) S;t) S;\) S;,) S;) S;) S<P) S<,) S<p) S) S>,`) S>P) S>) S>$) S>) S>) S>`* S?* S?*4* S?Ll* S?h* S?0* S?* S?D* S@* S@* S@L * S@* SA&* SAg|* ((B\v,F`z0Jd~\S:3RS8|S8S8 ]S:n&S9 S9"$S9$^S:S9v S9xdS9y_S;2S98S9S9`S;-S9S9S9aS;-S9PS9S9|bS;-S: S: 8S:dcS;RS:DLS:ES:ExdS<2BS:`S:S:eS<2BS;S;.S<ݰS<S<vS>XS=3S=5S=5wS>`S={0S=| S=~ ((B\v,F`z0Jd~xS? S=S=S=yS?FS>S>S>zS?vS>*DS>+4S>,`{S?S>N S>OS>P|S?S>@S>S>}S?S>S>pS>$~S@bS>S>S>S@bS>S>LjS>S@0`S>TS>S>`S@_S?S?,S?S@tS?'S?)DS?*4S@tS?FS?GS?LlS@S?S?lS?hSA- S?݀S?S?0SA- S?XS?HS?SA- S?S?S?D SA\%S@ pS@ S@ SA\%S@8S@S@ SA`S@IS@JS@L SBS@pS@S@SBA`SAhSASA&SBSAaSAe`SAg|SBSAuPSAzSA~SBSA SA(SASC|SASASASCFSBSB SBSCjSBlSBLSB" SCSBDSBF$SBK ((B\v,F`z0Jd~SCЂSBSBSB(SD]^SC SCpSChSESDASDESDLSESDSD(SDSESDSDpSD|SF3SESE SESFLSESEpSExSG,hSE8SE@SESG,hSESE SE SGSFZHSFx SF~!SGSFSFSF|"SH-SFٌSFSF@#SH[SG3PSG4@SG5l$SHSG9SG:SG;H%SHSGWhSGXSGZt&SHSG8SGSG'SHSG,SGSGҰ(SI3SGSHSH )SISH>SHASHD*SJSH`SH SH +SJ'LSHSHSH$,SJSIOSIP|SIQ0-SJSI^SIgSIj.SJSIqLSIwSIzp/SJ·SI|SI}SI}0SJΥSI` J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ SA * SA* SB* SBl* SBD* SB* SC * SDA* SD* SD* SE* SE* SE* SE8* SFZH* SF*! SFٌ*" SG3P*# SG9*$ SGWh*% SG8*& SG,*' SG*( SH>*) SH`** SH*+ SIO*, SI^*- SIqL*. SI|*/ SI<*0 SIx*1 SJ<*2 SJ|*3 SJ*4 SK t*5 SKx*6 SK!*7 SKB*8 SKax*9 SKP*: SK*; SK*< SK*= SKl*> SK,*? SKѼ*@ SK*A SK*B SL*C SLx*D SL%h*E SL:*F SL*G SLL*H SL$*I SLԸ*J SL*K SLl*L SL*M SL*N SM|*O SM'8*P SM2x*Q SMq*R SM*V SMh*S SM@*T SM*U SM*W SN *X SN% *Y SN.l*Z SN;P*[ J&0:DNXblv  *4>HR\fpz$.8BLV`jt~ SA* SA* SB* SB" * SBK* SB(* SCh* SDL* SD* SD|* SE* SEx* SE* SE* SF~* SF|*! SF@*" SG5l*# SG;H*$ SGZt*% SG*& SGҰ*' SH *( SHD*) SH ** SH$*+ SIQ0*, SIj*- SIzp*. SI}*/ SI*0 SI*1 SJ>`*2 SJ *3 SJ*4 SKp*5 SKH*6 SK%*7 SKD*8 SKh*9 SK0*: SK*; SK*< SKP*= SK\*> SKT*? SK@*@ SK,*A SLl*B SL*C SL*D SL&*E SL;*F SL*G SL*H SLԸ*I SL*J SLۄ*K SL*L SL*M SM*N SMx*O SM**P SM4X*Q SMtT*R SM *V SM*S SM*T SMh*U SM*W SN*X SN'*Y SN0*Z SN=0*[ (B\v,F`z0Jd~3SKSJ|SJSJ 4SL.rSJSJSJ5SLCSK tSK SKp6SLCSKxSKSKH7SLs SK!SK# SK%8SLs SKBSKCSKD9SLSKaxSKf(SKh:SLʊSKPSK@SK0;SLʊSKSKSK<SLʊSKSKSK=SLʊSKSK`SKP>SLSKlSKSK\?SLSK,SKSKT@SLSKѼSKԌSK@ASM*SKSKHR\fpz$.8BLV`jt~ SNz*] SN*^ SN*_ SO*` SOm*a SO*b SO *c SO*d SP\*e SP*f SPL*g SPɰ*i SP4*j SQ*k SQ~d*m SQ8*l SQ*n SQ*o SR*p SR? *q SR@*r SRC*s SRk*t SRpD*u SR*{ SR*v SR͌*| SSp*} SS*~ SS** SSK,* SSW * SSd* SS$* SSl* SS* SS* SS* SSP* SS* STFl* STl* ST<* ST* STL* ST* SUh* SUq* SU* SU* SU* SU* SU,* SV * SV+* SV7L* SVR|* SV* SV* SW * SW{* SWl* SW* SW`* SXD* SXK* SXT* SY{* SY|* SZ:T* SZM* SZT* SZ* S[* S[H* S[* S\* S]* S^Gp* S^p* S^* Q&0:DNXblv  *4>HR\fpz$.8BLV`jt~ SN}*] SN*^ SN0*_ SO*` SOp*a SO*b SO*c SO*d SP*e SP\*f SPd*g SP*i SP *j SQ&*k SQL*m SQ*l SQ*n SQ *o SRH*p SR@8*q SRA*r SRF*s SRmt*t SRsP*u SR*{ SRl*v SR\*| SS *} SS`*~ SS:* SSO* SSY* SSel* SS* SS* SS* SS* SS* SS * SS,* STJ* STy* ST* ST@* ST * ST* SU* SU~* SU* SUP* SUH* SU8* SV* SV$P* SV.(* SV9* SVUL* SV* SVl* SW* SW* SW(* SW* SW* SX'x* SXU,* SX* SY* SYh* SZ=* SZW(* SZ* S[* S[* S[]* S[˔* S\ * S]h* S^K0* S^tp* S^d* ((B\v,F`z0Jd~SV STSTST@SV STLSThST SV STSTDSTSVlSUhSUSUSVSUqSUy8SU~SVSUSUSUSVSUSU4SUPSVSUSUSUHSW?SUSUSU8SWRSU,SVTSVSWiSV SV"4SV$PSWiSV+SV,SV.(SWSV7LSV8SV9SW>SVR|SVT\SVULSWSVSV4SVl SWSVSVSV!SXWsSW SWSW"SX(SW{SW}SW#SXGSWlSWSW($SXGSWSWSW%SY'SW`SW٨SW&SYmSXDSX%SX'x'SYKSXKSXR\SXU,(SZSXTSX`SX*SZLSY{SYSY+SZkSY|SYSYh,S[geSZ:TSZ;SZ=-S[lSZMSZP SZW( ((B\v,F`z0Jd~.S\&SZTSZSZ/S\&SZS[S[0S\US[S[tS[1S\S[HS[QS[]2S\S[S[ɴS[˔3S]JS\S\S\ 4S^S]S]S]h5S_S^GpS^HS^K06S_S^pS^sS^tp7S`3S^S^XS^d8S`3S^DS^4S^`9S`~S_`S_@S_ :SaS_S_hS_T;Sam^S`CS`DS`E4<Sam^S`'pS`-S`28=SaS`OS`Q(S`R>SaS`S`S`?Sb%S`ڼS`$S`@Sb%S`@S`S`lASbT8Sa lSa \Sa BSbSaQSaRSaRCSbSa[hSa\XSa\DSbPSaSahSaESc|SaHSaSaǰFScSbSb Sb8GSd SbؼSb٬Sb`HSd<0Sc lSc Sc <ISdScPDScPScQ P&0:DNXblv  *4>HR\fpz$.8BLV`jt~ S_`* S_* S`'p* S`C* S`O* S`* S`ڼ* S`@* Sa l* SaQ* Sa[h* Sa* SaH* Sb* Sbؼ* Sc l* ScPD* Scb* Sc* Sc* Sc* Sd* Sd* SdB$* Sdh* Sdp* Sd* Sd8* Sdx* Se* SeH* SeN* Se{D* Se* Sf* Sf0* Sfb* Sfu* Sf* SfĐ* Sf* Sg|* SgL* Sg* Sg(* Sh* Shb* Sh* Sh* Sih* Si[* Sie* Si* Si* SjZ$* Sj* Sj* SkL@* SkUd* Sk* Sl%* Sld* SlH* Slx* Sl* SlϬ+ Sll+ Sl+ SmT+ Sm+ Sm+ Snm+ Snpd+ Sn+ Snt+ Sn|+ So+ So/+ So?+ Sot+ P&0:DNXblv  *4>HR\fpz$.8BLV`jt~ S_ * S_T* S`28* S`E4* S`R* S`* S`* S`l* Sa * SaR* Sa\* Sa* Saǰ* Sb8* Sb`* Sc <* ScQ* Scl* Sc* Sc* Sch* Sd* Sdt* SdC* Sdi* Sdq* Sd0* SdT* Sd* Se* Se(* SeR* Se* Se* Sf* Sf4* Sfd* Sf}* Sf* Sf4* Sf|* Sgd* Sg* Sg* Sh* Sh* Shi* Sh|* ShH* Si'* Si`* Siip* Six* Si* SjgD* Sj* Sj* SkY* SkY* Sk(* Sl)D* Slg$* Sl* Sl* Sl$* Sll+ SlH+ Sl+ Smx+ Sm+ Sm+ Sno+ Snu+ Sn$+ Sn+ So<+ So `+ So1H+ SoA8+ Sox+ ((B\v,F`z0Jd~JSdScbScgSclKSduScScScLSe&ScScScMSe&ScScSchNSeRSdSdSdOSeRSdSdHSdtPSe9SdB$SdBSdCQSe~SdhSdiSdiRSe~SdpSdq|SdqSSe~SdSdSd0TSeSd8SdSdTXSeSdxSdÄSdYSfQSeSeSeZSfQSeHSetSe([SfSeNSePSeR\SfSe{DSeSe]Sf޽SeSeSe^SgQSfSfSf_SgSf0Sf3Sf4`SgSfbSfd=Sn|SnSo< Sp>=SoSo So ` SpcESo/So0XSo1H SpcESo?So@SoA8Sp~SotSovSoxSpSo4SoSoSpSoSoSo SpSoSopSo,SqjSpSp@SqjSp$Sp)Sp-<SqSpiHR\fpz$.8BLV`jt~ S+l SH+k So+ So+ Sp$+ Sp<+ Spi<+ Spv+ Sq 0+ SqF|+ Sq+ SqH+ Sr<+ Sr|+ Sr + Sr+ Ss + Ss-+ Ss^D+ Ssh+! St&+" St6 +# StO+$ St+% Su+- Su*X+5 SuU+6 SuH+7 Su+8 Su+9 Su@+; Su+: Sv+< Svp+= Svʘ+> Sx+? SxN+@ Szkl+A Sz+B S{+C S{Œ+D S{T+E S|Q +F S|b+G S|@+H S}i +I S}q+J S}+K S~v+L S~Ӵ+M S$+N Sm8+O S+P S4+Q S$D+R S7|+S SKh+T S_+U SP+V S+W S+X S+Y S8+Z S+[ S+\ S,X+] S`+^ Si+_ Sy8+` ST+a S50+b Sc +c S+d S+e S+f SXt+j SD+i S+h S+g O&0:DNXblv  *4>HR\fpz$.8BLV`jt~ S +l S+k So + So,+ Sp-<+ Sp@+ SppD+ Sp{+ Sq+ SqJ+ Sqt+ Sq+ Sr+ Sr + Sr$+ Sr+ Ss <+ Ss1+ SsaP+ Ss+! St1+" St8+# StSl+$ St +% Su +- Su-+5 SuX+6 Su+7 Su$+8 Su+9 Su+; Su+: Sv|+< Svs+= Sv+> Sx+? SxvT+@ Szw$+A Sz+B S{L+C S{М+D S| +E S|V4+F S|d+G S}+H S}kx+I S}v+J S}+K S~x+L S~+M S>+N So+O S+P S+Q S&`+R S;+S SL+T Sd+U S+V S<+W SP+X SP+Y Sp+Z S+[ S&+\ S/d+] Sfx+^ Sm+_ S|+` S+a S8<+b Sn$+c S+d S+e Sф+f S^+j SJ+i S+h S+g BB\v,F`z0Jd~$Su?StOStQStSl%SuStStSt -SvflSuSuSu 5Sv~ Su*XSu,Su-6Sv~TSuUSuWSuX7SvSuHSuSu8SvSuSuSu$9SwSuSu`Su:SwSuSuDSu;SwSu@Su0Su<Sw6SvSvSv|=SwSvpSvrSvs>SwSvʘSvSv?SyM,SxSxDSx@Sy)SxNSxYSxvTAS{SzklSzs(Szw$BS{SzSzPSzCS|S{S{S{LDS}S{ŒS{ʄS{МES}M)S{TS|xS| FS}S|Q S|TTS|V4GS}S|bS|cS|dHS~NOS Sm8SndSoPS!SSXSQS4S4SSRStS$DS%4S&`SStS7|S9 S;TStSKhSLSLUSYS_SbSdVSSPSHSWSSSS<XSSSpSPYSSSpSPZS4S8STSp[SL!SSS\SaSS#S&^SvS`SbSfx]SzS,XS-S/dsunpy-0.8.3/sunpy/data/test/cor1_20090615_000500_s4c1A.fts0000755000175000001440000205460013203275053021251 0ustar nabil00000000000000SIMPLE = T / Written by IDL: Wed Jun 17 16:10:27 2009 BITPIX = 16 / NAXIS = 2 / NAXIS1 = 512 / NAXIS2 = 512 / DATE-OBS= '2009-06-15T00:05:00.004' / FILEORIG= '96150000.402' / SEB_PROG= 'SERIES ' / SYNC = T / SPWX = T / EXPCMD = 1.69984 / EXPTIME = 1.70021 / from MEB DSTART1 = 1 / DSTOP1 = 512 / DSTART2 = 1 / DSTOP2 = 512 / P1COL = 51 / P2COL = 2098 / P1ROW = 1 / P2ROW = 2048 / R1COL = 1 / R2COL = 2048 / R1ROW = 79 / R2ROW = 2126 / RECTIFY = T / RECTROTA= 3 /rotate 270 deg CCW LEDCOLOR= 'NONE ' / LEDPULSE= 0 / OFFSET = 600 / BIASMEAN= 669.959 / BIASSDEV= 0.0280000 / GAINCMD = 1 / GAINMODE= 'HIGH ' / SUMMED = 3.00000 / SUMROW = 1 / SUMCOL = 1 / CEB_T = 40 / TEMP_CCD= -58.8990 / POLAR = 0.00000 / deg ENCODERP= 4 / WAVELNTH= 0 / ENCODERQ= -1 / FILTER = ' ' / ENCODERF= 0 / FPS_ON = ' ' / OBS_PROG= ' ' / DOORSTAT= 2 /OPEN SHUTTDIR= 'CW ' / READ_TBL= 0 /tbl061206/read21762048.tblv1.1 CLR_TBL = 1 /tbl061206/clear2.tblv1.1 READFILE= 'ops/tables/default/rotbtb1a.img1.7' / DATE-CLR= '2009-06-15T00:04:59.244' / DATE-RO = '2009-06-15T00:05:01.854' / READTIME= 4.85198402405 / CLEARTIM= 0.544247984886 / IP_TIME = 3 / COMPRSSN= 97 /ICER7 COMPFACT= 5.07992 / From file sizes NMISSING= 0 /out of 16 segments MISSLIST= ' ' / SETUPTBL= 'ops/tables/BLD501/setuptba.img' / EXPOSTBL= 'ops/tables/current/expqueta.img1.3' / MASK_TBL= 'NONE ' /ops/tables/default/occulta.img1.26 IP_TBL = 'source/is/src/imagetbl.img1.135' / COMMENT EXPTIME from MEB COMMENT Est. clear duration = 0.700000 sec. COMMENT check ATT_FILE for pointing source, using DATE-OBS COMMENT No compression error message detected. HISTORY Id: make_scc_hdr.pro,v 1.157 2009/05/06 16:25:00 nathan Exp HISTORY Id: getsccsecpix.pro,v 1.15 2008/05/02 17:09:59 nathan Exp HISTORY Id: getscccrpix.pro,v 1.8 2007/03/30 19:31:59 nathan Exp HISTORY Id: getsccpointing.pro,v 1.9 2008/04/17 15:14:01 nathan Exp DIV2CORR= F / DISTCORR= F / TEMPAFT1= 10.1873 / TEMPAFT2= 13.9294 / TEMPMID1= 15.6875 / TEMPMID2= 9999.00 / TEMPFWD1= 24.4685 / TEMPFWD2= 27.6967 / TEMPTHRM= 9999.00 / TEMP_CEB= 35.2440 / ORIGIN = 'NRL ' / DETECTOR= 'COR1 ' / IMGCTR = 0 / TIMGCTR = 20410 / OBJECT = ' ' / FILENAME= '20090615_000500_s4c1A.fts' / DATE = '2009-06-17T20:10:12.397' / INSTRUME= 'SECCHI ' / OBSRVTRY= 'STEREO_A' / WAVEFILE= 'ops/tables/BLD501/wavetb1a.img' / CCDSUM = 1.00000 / IPSUM = 3.00000 / DATE-CMD= '2009-06-15T00:05:00.000' / DATE-AVG= '2009-06-15T00:05:00.855' / DATE-END= '2009-06-15T00:05:01.705' / OBT_TIME= 0.00000000000 / APID = 1088 / OBS_ID = 1778 / OBSSETID= 0 / IP_PROG0= 41 /Use SSR1 APID IP_PROG1= 76 /IP Trim IP_PROG2= 3 /Pixel Summing IP_PROG3= 50 /Divide by 4 IP_PROG4= 3 /Pixel Summing IP_PROG5= 50 /Divide by 4 IP_PROG6= 106 /ICER_Filter_A IP_PROG7= 97 /ICER7 IP_PROG8= 0 /No Operation IP_PROG9= 0 /No Operation IP_00_19= ' 41 76 3 50 3 50106 97 0 0 0 0 0 0 0 0 0 0 0 0' / IMGSEQ = 0 / OBSERVER= ' ' / BUNIT = 'DN ' / BLANK = 0 / FPS_CMD = ' ' / VERSION = 4 / CEB_STAT= 0 /SUCCESSFUL_RESPONSE CAM_STAT= 1 /CAMERA_READY READPORT= 'R ' / CMDOFFSE= 0.00000 / RO_DELAY= 0.0237600002438 / LINE_CLR= 0.000123999998323 / LINE_RO = 0.00234999996610 / BSCALE = 1.00000 / BZERO = 32768 /Data is Unsigned Integer SCSTATUS= 256 / SCANT_ON= F / SCFP_ON = ' ' / CADENCE = 3600 / EVENT = F / EVCOUNT = ' ' / EVROW = 0 / EVCOL = 0 / COSMICS = 0 / N_IMAGES= 1 / VCHANNEL= 13 / OFFSETCR= 0.00000 / DOWNLINK= 'SSR1 ' / DATAMIN = 674.000 / DATAMAX = 10755.0 / DATAZER = 0 / DATASAT = 0 / DSATVAL = 60000 / DATAAVG = 2672.55 / DATASIG = 1403.39 / DATAP01 = 677 / DATAP10 = 765 / DATAP25 = 1846 / DATAP75 = 3474 / DATAP90 = 4691 / DATAP95 = 5303 / DATAP98 = 5790 / DATAP99 = 6061 / CRPIX1 = 257.270 / CRPIX2 = 257.527 / CRPIX1A = 257.270 / CRPIX2A = 257.527 / RSUN = 1002.69496288 / CTYPE1 = 'HPLN-TAN' / CTYPE2 = 'HPLT-TAN' / CRVAL1 = -38.955505 / CRVAL2 = 93.082016 / CROTA = 3.9298053 / PC1_1 = 0.99764876 / PC1_2 = -0.068534277 / PC2_1 = 0.068534277 / PC2_2 = 0.99764876 / CUNIT1 = 'arcsec ' / CUNIT2 = 'arcsec ' / CDELT1 = 15.008600 / CDELT2 = 15.008600 / PV2_1 = 0.00000000000 / PV2_1A = 0.00000000000 / SC_ROLL = 3.7259794 /degrees SC_PITCH= -0.00046652305 /arcsec from GT SC_YAW = 2.1001519E-05 /arcsec from GT SC_ROLLA= -17.3660594968 / SC_PITA = 15.965225 /degrees from GT SC_YAWA = 138.27977 /degrees from GT INS_R0 = 0.20382600 / deg INS_Y0 = 97.096260 / arcsec INS_X0 = -32.899853 / arcsec CTYPE1A = 'RA---TAN' / CTYPE2A = 'DEC--TAN' / CUNIT1A = 'deg ' / CUNIT2A = 'deg ' / CRVAL1A = 138.29720 / CRVAL2A = 15.988248 / PC1_1A = 0.95334945 / PC1_2A = -0.30186888 / PC2_1A = 0.30186888 / PC2_2A = 0.95334945 / CDELT1A = -0.0041690557 / CDELT2A = 0.0041690557 / CRLN_OBS= 205.184492082 / CRLT_OBS= 6.40432569665 / XCEN = -49.427904 / YCEN = 76.904980 / EPHEMFIL= 'ahead_2009_163_01.epm.bsp' / ATT_FILE= 'ahead_2009_166_03.ah.bc+2GT' / DSUN_OBS= 143073239195. / HCIX_OBS= -71337156526.3 / HCIY_OBS= -122988916618. / HCIZ_OBS= 15958955531.0 / HAEX_OBS= 102671295213. / HAEY_OBS= -99641672705.9 / HAEZ_OBS= 306550627.702 / HEEX_OBS= 88195939658.0 / HEEY_OBS= 112655826019. / HEEZ_OBS= 304738446.495 / HEQX_OBS= 87924186951.4 / HEQY_OBS= 111734510609. / HEQZ_OBS= 15958955531.0 / LONPOLE = 180 / HGLN_OBS= 51.8006975651 / HGLT_OBS= 6.40432569665 / EAR_TIME= 29.6238557287 / SUN_TIME= 477.240955791 / JITRSDEV= 0.00000000000 / FPSNUMS = 99999 / FPSOFFY = 0 / FPSOFFZ = 0 / FPSGTSY = 0 / FPSGTSZ = 0 / FPSGTQY = 0 / FPSGTQZ = 0 / FPSERS1 = 0 / FPSERS2 = 0 / FPSERS3 = 0 / FPSERQ1 = 0 / FPSERQ2 = 0 / FPSERQ3 = 0 / FPSDAS1 = 0 / FPSDAS2 = 0 / FPSDAS3 = 0 / FPSDAQ1 = 0 / FPSDAQ2 = 0 / FPSDAQ3 = 0 / HISTORY Id: secchi_reduce.pro,v 1.315 2009/06/03 21:00:24 nathan Exp HISTORY Processed on secchilza: sparc Solaris IDL6.2 HISTORY Id: secchi_rectify.pro,v 1.21 2008/07/14 18:34:16 nathan Exp HISTORY Id: cor1_point.pro,v 1.9 2008/01/17 15:47:49 thompson Exp END ÂȂςւނ %8Li܄34/^v{څS^LJ$n|uyy|}or{ronjdbe^VXXXUQOLIFC;C@F?;8.772581.''*4,*&$$&,,%#%# #    "&+.4FIFFGSPORY`Z[abY\V]beeggov{|y{|wq\axX4@vpi~#ׄl=փɃmYJ6ЂƂ‚ʂ˂҂ڂ9Pm܄.-Plr̅AՆ=(߇뇭}xzxnfklfdkc_WTUV]URX[RWUHKHMNCA@DIB>8679?>7556284:7/+,&""   !#%"&,(()/)(()*/+-48@9?CIMFPQOVSW_\_^`^jbbcfkmlowx‡‡|gv~iLLp{5ㄸlHك΃p[J6! ܂͂‚ǂ΂Ԃׂ8Wp؄52Pho؅P[ʇ2ˇxxyounkqif^^ij\ac]aY^ZRUQVWLLJIMKJHFCAAA?><;:?83/-06>6/72/0$"%)//(*"!!(#*/'))-+2442/4124.///10968<8::9979?AEFDEFLIKLPWTTU]`]dimklnqxtrryzz|ƇʇɇȇԇۇԇՇههՇއՇˇLJŇz^lN߆C…bN%ӃhSG0܂̂Ƃ‚‚‚‚‚‚‚‚Ȃ҂؂ۂ(Nr̈́ )!J^l̈́ۅ`uć:#݇ć̇‡Ň‡Ňsu{pztjrlhmhhjjjh`ejb^\\ZVSMPLLNOJHKEHBC@8=<>@8865:3,246764+*.002:100231896=9998>1:9:;>@CCH?=;?>=6>::;;B9:9:<>9?=EA@@@ED:ABDCCFPJEDHJNQVSVY[_c`efbfceiitrwy|‡‡ć·ччև؇؇ۇ ԇԇևL܆Dc Ʉ[(׃sdM:Ԃǂ‚Ă‚‚ɂтׂAb&8L]̄nʆ'+W)ˇ߇߇߇Ӈ܇؇҇ćÇ̇ćɇɇLJLJÇÇćvypoy}zwzxslrtssvuomjfb_aacUVUV[QNKKRRNGBKBCHDEH?>ABD>?тƂ‚‚‚‚‚ÂĂĂ͂Ղ܂;eƒ2"тł‚‚‚‚‚‚‚‚˂Ղ߂H|у*C1P~҄%\R-?>!2   ۇއۇއ؇ևه҇ćƇчЇʇʇÇ}vz~|}uvpmkkkrqqqrvqnrrgnqzwtsutpry{vwz|{vzzzuxvprw|‡ɇˇÇ͇Ň̇χԇχ·ՇӇׇ܇  %"(#"20;?;3=B?;9;7;GJUII;580$+  Ĉ<1̇U}@턲z<ЃyhM/ ۂʂ‚‚‚‚‚‚‚ÂǂЂق+cŃC4DpԄqֆHчP2JZ.>3,'(! هއևڇ·ɇևҡ̇ɇ‡LJÇ~x|u~x~~ywvzyz}~}z~z}Ç҇ćʇ·ч͇ч؇Ӈ݇܇߇܇ #)$&.22105=BGJ:9:<=EGAFF@H\jlc[?D:23(S&.ӆh߅r(܄h-Ńq]@тǂ‚‚‚‚‚‚‚ÂÂĂłƂ˂Ԃ܂D|݃09-`{˄܅V+<܈j Tvք ~]kԈiʈ/?^P`Ymj_SVQXHGG><972/!##*"#**#! " ݇ӇԇԇЇׇ҇҇ʇȇƇƇ̇LJ҇LJŇއɇ‡ȇχ·̇ڇև҇Ӈ܇هڇ݇(&+/+36554>;HIJJ@EGHPLNUY_YYUaXVjinj_ecrwuzlofSb0K)A!φkv1䄱k0 惾nR-ՂȂ‚‚‚‚‚‚‚‚ÂĂÂʂӂۂ'W҃كσ*1@XŬ;:2b+|~Vsbacaq\[^QNKIFEJJD>>/.481,,/0,3775*%"()"   އ݇݇ևڇ؇ׇևԇχӇ·̇ȇLJLJ҇ć‡ʇˇ͇ɇ·ʇ̇Ӈ·͇̇Ӈ؇߇݇ۇއ   )$"%'))1-6><:EABAIJMGMMMOQOV[^]^eabhfjdhxrwrqx|x{fdZB[Qh􆢆DXτQ#ԃăs]>܂ʂ‚‚‚‚‚‚‚‚ÂĂłςق1~ރσ̃%7Ms;{툪/tZ|ttgflhTab_UOLLNLKII=;?GC>=>=?9=>@0؈56.--,)0#,&#  ڇڇׇ҇Ї҇чՇχЇɇ̇ʇ·҇‡Ň‡ÇƇLJЇӇևЇՇԇׇهއև؇܇ $%&24%(/255>C@E@ALNPOV\QPTVYY\]fhhefmkksurwxvwt~yzSfV/d݆>|FƃeJ%ς‚‚‚‚‚‚‚‚ÂĂȂЂڂ C݃ڃɃڄ*=NfɆ]@a NP{twnusukglib]QQSKMQSPLEKEGFEFIKKFGJ:BJC=?:8783895,).*1(%$#  ڇ݇ڇ݇ۇׇԇهЇ߇܇χɇŇÇɇȇƇ‡͇LJɇȇˇ·҇؇ڇӇ؇ۇՇ߇ۇ  "*,.)44/09<;DGGMIHTUYbbcbbib_feg`qtlhovxuyz|Y/eoap#߄X!ȃrR4ӂ˂‚‚‚Âó‚‚‚ĂłÂ̂Ղ܂HЃՃ;Ct,pφZه) ^d}w{xvhffbXaka_`\SPTLL\kc^\YeceaieWUWUNMQHIDBH<5?@F>?61,#(().*($* ׇчׇׇՇևևЇӇЇχ̇̇ӇԇԇӇЇЇևчӇˇԇׇևчӇˇɇʇʇ͇ȇ̇ććƇÇ̇·ևЇχ̇Ӈۇهׇև؇܇ " )5158AB??BCPJHWW[_ah_]nnvyx}|tqjp~}|~Fd7xNk세\%׃nK$тł‚‚‚‚‚‚‚‚ÂÂÂĂǂȂɂԂނG܃ރ=;W;҇#zl~xyyneiuzqtpe`YafamnccnhsuuurmcdbZ\TRUONOOKKSMHIB??B523955/5,+&$&"(#"% އ܇܇߇߇އۇ݇݇ڇۇڇՇԇׇ܇ׇ݇҇Їۇևԇۇ܇߇܇߇ڇ  *"%*&(*498?CBJLIQROR__cafgkqihu{~|ȈLj͈EЇ-ᆌ>̄DŽBŃ}W*قɂ‚‚‚‚‚‚‚‚‚ÂÂÂĂǂȂĂ̂ւނ(^˃׃Ӄ-5Cg:Hdž׈vz{qmuhpryxnmrx|zxu{nejme]Z[d`^]ZUMKQKMEGC@?@?99>=B>9:?GD?>GJRROS]`b]^fenulssvwňLjɈΈΈLj̈ΈЈΈψ̈҈Ԉֈֈψӈӈш҈ֈو݈׈؈ۈ ӈĈЈZt†~#CȄƄq2߃ȃ}hC݂͂ǂ‚‚‚‚‚‚‚‚‚‚‚‚‚‚Ȃ҂݂=w׃̓Մ!0AP}k`·wK Ȉ݈ш؈ӈֈՈՈ̈Јوۈ݈Ј̈ʈ̈ĈÈʈȈՈĈɈψ}|wmkqlqpkndjplnngdVQRTYXHJPIDC=A>C?;0F:8,-(',&(!$',''(,')"#&)$)'$    #"'# %0-1353;6>:EADDLINDEJKMHJLOV\V\cptniyquw{~ƈʈ͈ɈΈ̈Јш͈шڈ߈ވ݈؈܈؈ڈو߈ވ߈ڈ׈ĈˆˆT҈ZNՅ[焱ÕxR)҂ł‚ÂĂĂ‚ÂÂĂĂĂĂĂĂĂÂÂÂÂʂՂSʃӃσ">Ad+8 ˈو׈܈ۈ܈߈׈ڈڈ؈ԈӈԈш߈͈̈ȈƈȈшȈˆƈLjĈɈ}qz~|{vx~zqnxhdaaecYYQUSPPJQJG@@LGC9<<;3715129@5305=440),3+0164)$!&"$'))&! !%!$0)(%,.+1351;3@CEBHEGOGKT\YSPOTW`ZRRZdiejox}}ɈȈΈӈֈшԈψ҈Ոۈވވ㈱oȈḟ@o9ńo"˃\4ق͂‚ÂĂĂ‚ÂÂĂĂĂĂĂĂĂÂÂÂÂĂׂ͂,mՃ˃΃,BBrׅI: cSrzȈ ӈ؈܈ވ׈݈ڈ҈Ո׈ш҈ЈˈˈӈۈֈֈˈLjĈɈʈˈووԈĈĈĈ}{}vqmlddca`eX[^YWXLNRZPTNTLEFBFAA>HC>D?ADI988D;A@?;4100118..-/1594'#(%1-()+/+++/,37:67?A8==;=BEJMNQSUWZW]]_\`]Ydcjkeghuvyx}ĈʈˆΈ؈ڈֈ݈   ! Ȉ∇, цH@ фńɄy2ȃƒbF݂͂ǂ‚‚‚ÂĂÂÂĂĂłłłłÂÂÂÂłЂ݂ <ÃՃԄ1?Psoڇ7ňɉW݉̈߈݈߈ڈֈۈ؈шˈ؈؈ۈֈ҈҈ވ҈ՈӈʈLjȈˆɈňĈyuwprpmmrdinmif]fb``\bdgXNRTOCOOOJPKPJPAGGOIRQFKA@EGEFG:=<;=@EE85.6896;<9>:;=ECBC@KGPGJLQSNPUXZ]`adcd_ghdkiglvvxsvzȈĈÈLjˈшވՈֈ߈   "+ ӈƈ'D݆l؅U䄳DŽs5݃уoQ+ЂĂÂÂĂÂÂĂĂĂĂĂĂÂÂÂÂǂЂ݂PӃσ 4@`ƅ; qUB  ܈ֈۈوۈވوڈֈ͈шЈʈˈˈɈˈȈ}xzzpxywtwzyrkhijnf]^[ZWVXYZXVTSSVUUZWQZTRRTOVUKRY@IHFKIENED=?GFEEAIGJRMSXTUTVYc]\[^^_[`cghlijkpqjkkwuz|y{ƈňɈˈΈш͈ވɈÈ؈؈؈܈     "#! *!(/')%22 ҈ #\چˆeׅe DŽȄPՃǃw\; ҂˂ÂÂÂĂĂĂĂĂĂĂÂÂÂÂÂĂĂłɂԂ܂*eۃʃă *߆Lτӄ؄{A߃΃q?ׂɂƂ‚‚‚‚ÂĂłĂĂĂĂĂ‚‚‚ÂĂĂłÂ΂ւ5{؃ăЄ4:N1A, !     "  ݈Ԉ̈Έو܈ۈшʈƈƈň̈ň~{|~ttzsrzttlljjljmuvtqhnhffhidkkdekfhe`^f`c`lkbblikmlnqtqwtvhlnqpwxv|ˈȈȈ͈ʈ̈ψш׈ۈ܈Ոوֈ߈ۈ "$""/.)((&&&'*'(&%#"!" &38?>>HC;;<@A=;9E6@ML8 툡s؇TH}1҄фτZȃqEւ˂ɂ‚‚‚‚‚ĂÂĂĂĂĂĂĂ‚‚‚ÂĂĂłĂт܂H΃ӃŃ @>]DžG.hnډQ%  !  (      ߈ۈֈЈ͈҈҈шʈLjƈ͈ȈLjňňÈȈÈňxx~~}}~~tzqr}}wuvuzuuvyxtintrvuqvyzvy}y|zz}zňLjʈȈЈֈوވ؈׈  !#*-$$#)0+1-.74432222-,,.4067982-5:DKMKMULHMMMJHHKAVFDKXK, Ӊш:.ц=CȄƄP"̃{F݂тɂ‚‚‚‚ÂÂĂĂĂĂĂłłÂ‚‚‚ÂĂĂłƂтނWуŃ':>lԅfֆa͇ ҉<3 ! !%%$"! 100%&$$&$%  ۈԈш؈ۈوшΈوψӈЈو҈ЈӈψLjLjƈшLj|ňψӈ͈Ԉڈ߈!# -.0782)(-:<3288?9889@@87;=@AB9DABBEEILJWYYYRQSZ[VOLW\]YVVLT`\L!!݇"2BԄa-ԃW$΂ǂ‚ÂĂłłƂǂǂłĂĂĂĂĂĂĂɂԂ*mԃ3=J|-C Rىj͉Q2$-(" '+(#$!!!%!#',61/+&(:/96',54,-2+)$""'-+ ")&(   ވވ݈݈؈وԈԈ׈ֈЈՈшЈˆĈĈňƈɈĈ͈ψ҈ψ҈Ȉƈшވ   &*$*+,,,.424FG9;?D?BKMLJBCIKJKRKSNORX\ZZT`bfle]^fhg`Vdlmca]gYimdD() Ɖ0oLʅd(΄݄ń;ڃx^4Ղ̂ł‚ÂĂłłƂǂǂłĂłłĂĂĂĂȂӂ 6|Ӄ̓ 7>QŅ B%j}5e?209$%+,,*,%24.#%)39<@I?C=6?S?D;55FA/5;57*$,2:3280&),&':2),/)%&+4- ވ݈܈҈׈ЈˆÈɈ͈ЈɈ͈ȈLjȈĈΈLjƈˈȈňƈňLjˈ͈ψ̈̈҈͈ֈڈވ݈ֈو  !#&,39?:6+(;@>:FJHFBHPKDDIQQSQMVYZYOXUVX]ii`Z`f]hed]ajoouonnnoofrnmjhgclmYe^T=4#̈WnֆtD ڄՄЄ[˃e< ҂ɂ‚ÂÂłłǂǂǂĂĂłłĂĂĂĂÂׂ͂E˃у׃?A]΅b͆UŇ!܉lG-E7,002,34:)*-&$%8<;*7;BGIVZQQJROeONB3?KF<;FBB74BCH>:=.49;4/7G>586<:922<9" !"'#  ؈ڈ݈݈ۈ؈׈߈ڈۈވ׈ӈՈ܈ވЈΈ̈ӈĈĈȈÈĈňLjƈƈ̈ʈ͈׈ۈ݈؈܈׈ވ߈!!%#$+2,'.3?9IF?=A<>?GFLOUYVZPTSTYW^\WQYZZ[]cjmkdwysibhitqpjitxovxyxx{zrwsrsqoimiieyylc00Q(] ߆Aȅh݄ɄՄv6݃i=ڂ˂ÂÂÂĂłƂƂƂĂĂłłĂĂłłĂ˂قT̃Ã:Ieޅ1ۇ!NzVP.KHFJ@9-0::A>650D6985AD@BDERXZQRZXRd\wcVHPWb[GFPQMLEPOTBC?AHLLMKVSMHC:89CGAPFHMVWSPVWZ^bfi]T]Z\^hhmpg_cd^lovor}{qio|x}}}u{~y~|{wrptqytmt}qH<-$?n|AĄ˄O҃tIԂʂ‚‚‚‚‚‚‚ÂĂĂĂłłÂÂĂłłłĂłǂȂĂЂۂ `˃)8MoEPO4oC>KAMC76:C?@HPAHQSIOMJYQUW_dg^cel[\YkldLX\^QQT^]ULTacZYaWZWRSV^UOHEBHHGBD=>G<=57/*),20)+)(!"")($  ߈ۈԈֈ׈Ԉوӈ҈Ј҈ˈȈɈ҈ш؈ψЈɈЈ͈ЈՈ׈҈ԈӈԈވ҈ֈ׈׈шΈʈˈш҈͈̈҈҈҈̈Έ͈ɈΈʈ̈ЈшՈ͈͈ֈ׈܈"&141820/-64EGNINGGVHUU[]]Zebeafhjlmpf`lklxpn~|~xwvu~z}yu{}}}|w{v}ob7N)ˉ7e=̆+:Ȅ˄K ЃvKۂ΂łÂ‚‚‚‚‚‚‚ÂÂÂÂÂ󳳳ƂǂȂĂ΂݂)h̓ă0BRy]9 ωЉ pM&LJHOHDGBELJITLCJNRUQYZ\Yjh_bnwpkvsrzwolgln`Wbdliccddc_^d_digfbf``aghb]VKJWPSNGQUL=>@ACDABDA<4?477*!39828?74)$#"!!  ߈܈ވ݈ވ߈ۈֈ܈؈܈Ոވو܈ڈ  #"""&),03?>;EEB=EFEHTNNW\aikhoqqimlsvtysqszyqoox~yyzqMI1؉0%/ʆC?لτO ؃xMۂ˂ł‚‚‚‚‚‚‚‚Ă‚ĂƂƂǂǂǂƂƂĂтނ0sʃσ/HWͅyنSɇBA^*E9BJSalTRKOXTQR^SEGJ]a^Zaht}}~p~uvrqgprxwrrqvxxvvkoutuswznlpumjcJYYTeVU^b\VYTXdYUQNLEIABKD>44I\YOBC;=,367,,40,."' (&&,#" !    &'%-+,=>A>@EJECQSKGZ\TT`Z^\clv|y|m}~|}TNQ9ވIAeކņ8:ᄹFÃ|R ݂ςłĂ‚‚‚‚‚‚‚‚‚‚‚ĂłłƂǂǂłłǂςނ6ƃ˃-PZ܅9qȇ%}%bi5::GLYR[js^SXbWTZ_f]QY]fohmy~}{~yvysqqaehfbabfqjjjhjjba^YWSVV\JMTZ[`eXTC=NL>CBF?AEG==>80.:<5:,15&)&*'-)"%$       ##&)) ,5/11BBFJJHO[TYV^]^[\dkagjsihh||mY@MR>׆*P̈́τc#˃~X'ۂɂƂ‚‚‚‚‚‚‚‚‚‚ÂĂĂĂłƂłƂǂԂ߂ 7Ӄ ,Q_DӇ/M76Y4PRTmonkkXZdl^[Yjqlcfiyvot~nuzqvtvzopr{~rwsyywolfpdXWenpedSMM[_XXRQSNDQVMMQMD>BA6:@EH>55:;55:4567<51.+($""%  !      #"&4&,0356/51++3=;;WUQHGIVhes[g`jjilmirs|xx{Éʉȉ‰ȉ‰ocD?8Չ7.+Bمm.˄DŽ}C˃[)ۂςƂ‚‚‚‚‚‚‚ÂĂĂ‚‚ÂÂÂÂÂÂĂłłƂƂЂ߂<؃9R`V+χIԉ:@iQ[_nhitttnfdszwegmwvwω~x~zttu{yxs`cZmZ[a\\Sc[]^`giga_LN?KVdYUPLOJBABEQSFGB::7157:90,)+#% !#$$$'"%#$  %$%$)&&"&#"%!(&# &)''+"+%%'+06?7=,,ljavzɉɉĉى׉ЉӉՉ؉܉ۉ"    މމމى߉Ӊˉ؉ۉމ݉Չ߉ۉωĉ‰ʼnˉʉ܉ՉƉӉΉˉ̉Ӊĉ̉Չ׉Չωωʼnɉ։ɉ‰ʉÉщډƉ̉ljډ׉ՉЉЉˉ݉߉ۉ։܉҉lj݉މ  !    ։ɉljˉ܉ʉ‰y?kM҇w͆Wͅ_ℱa ׃Uقςǂ‚‚‚‚‚‚ÂÂÂÂĂĂłłƂƂƂƂƂǂȂǂՂ Vă΃ ?Wvʅ%['j@'\‰ӉӉ҉܉ى݉މ  "      ݉ÉÉ؉݉ԉ݉؉݉҉܉ىމ߉ۉ܉݉։ىӉԉʉӉ҉ЉΉ͉ʼnƉĉʼnȉ҉ÉӉЉΉ߉ۉӉ݉މ     !& RÉĉ͉щى҉lj͉݉ډ  #  9 #%)'!&&#(/!'  !!  ډ߉މ܉ԉ݉܉׉։Ӊ׉ՉՉΉЉ։̉҉ΉɉÉʼnljĉˉȉƉ‰ÉȉɉĉĉljÉӉԉЉω؉Љۉ #),#**!#+1@521<41032/+%+34410)+$#.**# %   ͉ʉʼnɉƉnEt'X` eօg鄯_كP܂͂ƂǂłĂ‚‚‚‚‚‚‚‚‚‚ÂĂĂĂłłƂƂƂƂǂȂƂԂ XƃÃ;\xх?hƇo܊ig4SÉʉωƉω܉׉Ӊ߉ډ $ %, )":'/0 +()):;5964*/55'")(0""&"*'    ׉ډՉՉ׉ՉΉ̉׉؉׉͉ωɉۉ‰͉ʉʉɉ‰ĉƉ̉Չˉщˉ̉ɉ҉ɉΉΉ҉؉ۉ݉؉ΉljӉʉω͉͉щĉɉƉ͉Ӊʉ‰ȉډω҉щՉʼn͉։ى  ! $, 2"*/.(#)-97-!"14359=AEDPKD<7348<;A>>>@@9:2+5;9/-).'% ӉωډԉωÉ;99A;33:5-3,++,.*./'210*"&",'$&+)$-&) * $  30'   ԉډՉˉȉΉԉىщ؉։݉؉߉؉މ݉މ߉؉݉ډ؉߉܉҉Љމ։ډډ    *'&&0+07;>5.9<:+8)1:@;302ISKD>IGHDNQRSGNEGHIKH\GJPNG7:=HHA:.+*./). $  ߉ىԉˉƉRb(͇`f΅]焮Ṽ\؂ςɂ‚‚‚‚‚‚‚‚ÂĂłłłĂĂĂĂÂÂĂĂĂĂĂĂłԂYɃƃ9[|ԅ=#}'e2Lzpʉ‰ȉωщ݉ԉ؉׉ $$!(4.44*>HRJ50/0:Q<;:1CQ^^OCJFE>NGG:VC7862099IBDMGE@C<43:@A<70(*/5;86GC;5;CAH=FOLD4BA?GKN3DW`_^WOPPVVLONPT_`QKIPSWUPZddOTJGJJKI@<;@>8=.&%-'+ ՉщωʉƉ^vUG~އSX^ᄫUɃQׂЂǂ‚‚‚‚‚‚‚‚‚ÂĂƂƂƂĂĂĂĂÂÂÂÂÂÂÂÂĂ͂WɃ˃>awх?s[ŊQjryۉ׉ԉ׉މ +-0;G@F>9HUbYJGGB@\L[OKO==KRdmdXIOQYmolSiCLNZWYOKZe_ZR[V\TMO]WNOIQJCCHKMFC;FUWLK;6:GOD84@8;;;57B5CA3C/996:=MM7T:7:EM?H>>?536BHKFB:HDC:/'168/3-/)'7.0'3$ "  #$#&.(#6%'!!%$$ !#)049@<297:8IM918@CDDG?SKEFOPX]eSNPHKQ[NHDPS[eqzog_`a^mjX^iikcgrurkohmdujijzmkdhpqqnvsohadegf`^a]TS]]VGBEFDB,"$ ۉ҉Ή‰bF&F:852-4??@=;6A>D?;FERULQ`yuz~Њ劬يΊъȊNJ̊ˊՊ͊ȊĊzz~xy~~{~zxstu{~jovxqupoxu}}wz|xnfa[\GRSN=B68D=IMIWbbbizʊڊ䊧ĊŠΊNJЊՊ $يۊՊԊƊъ͊ފߊϊۊӊϊϊʊNJΊЊӊNJъƊˊŊŊŊΊŠ~tpid`SW\PKI=66$ '!# ؉׉ӉʼnS[geG򆫆CIՄ>냿k;т̂ǂłłĂÂÂÂÂĂĂĂĂÂÂÂÂÂĂłłĂĂÂÂÂÂÂĂƂǂłłɂׂ =FEUWb^JSQ]kmmgnɊҊƊŠȊˊˊŊȊ׊׊ӊ؊܊Њˊ܊܊֊̊ъފ )Lgq^D%+ #Պ؊֊Ŋˊ܊ߊߊ܊ފފڊފ׊ۊҊ݊ފߊ֊ҊԊ͊ŊΊʊʊҊӊ͊ɊÊъɊ̊ӊ׊ ֊ي̊ŠNJҊ͊ˊÊŊЊӊۊÊʊŠȊÊɊ͊NJȊĊӊ̊ˊ͊ϊӊӊ؊Ȋ׊܊ԊՊ܊ۊӊ׊؊ي֊Ҋ׊ފ׊ЊЊӊ֊͊ϊΊϊي܊؊ӊՊNJӊ׊ڊ݊֊Ԋ؊Њ̊ҊΊʊĊʊÊ~ysnpjiQQVMKF=1./-$# ؉ɉʉʉQIORgÇC+95胺c$܂҂ȂƂÂÂÂłƂłłłłÂÂÂÂÂĂłłĂĂłłłłłłƂƂłłɂՂ3uƃ҃PVՇVZ<ˉsΉۉىډ  ()S`YJ9'!   "57GG_eu`O<63;<82# 1( ,0$%!%%1DVm{‹ӋӋNjheT^UVDIENZSYroM}mR`J890#%     $      ييڊފފ܊ԊɊЊȊNJzrlaNUWJFJC4(4(% Ӊ҉É~U:y&"Ć#%#ӃD ւʂɂǂłĂƂƂƂłÂÂÂÂĂłłłĂĂłƂǂȂǂǂƂƂƂǂĂт߂]̓ƃ:oqV{1!‰dƉӉωĉʼn׉&)127=ARRES`ajmxsӊۊߊيފ    ! 1+(5F68CTWplUHBd 8`KQF(u4Thr`KMR]8?04/=!.6+,,16+5ELYZPYYo}ocN?F@SWRE($6CIEKBAC62(*3;/@ScBvnJ׋݌$Ӎw;bE؋qo]WRRG7   !$  !$'&&1,&&% +#*# # + $#ފ֊ӊՊۊϊ~vkb\VFORM;22)-& ܉ӉƉy_)Seņ&߄vr9ނςʂƂǂǂǂǂȂǂĂÂÂÂĂłƂǂƂƂǂǂłƂłłƂǂǂȂςUɃŃ܃1meنQq3kЉՉωΉۉ!'6<;=CGXSMRensz}Ɋ -)*3CPMJYgY@Vo^0%;29kfwZNaY{niweTHHIN=1KNCDALCCSXclp{r\g`Xcf\edYUPWXa_ifVD>LFTWdn%zύar1ЌfQ>aȑGxR<>~smyxgiT?2*56))310*,4;$%,%&3*,$!(*1&,.%(581?4-2<.2,.;+1AI;;ED?:8#-2/*2;:8*+''(-%##%يڊ܊؊Ίʊod_WXIOI?8/(0* ܉ԉ̉Éeb%#j{Åki,݂ЂɂɂȂǂǂǂƂĂÂÂÂĂłƂǂƂƂǂǂłłłłƂǂǂȂ̂ڂLƃŃڃ c܅ZɆDkR kÉى܉׉ډ 0?NPNRV\Wajy~}̊ˊϊԊɊފ!H3.(#*!&4211@FG_fpXXnqxboSTЋ"W}`lyl}`VmeO[b[U\^g\arkju}y}rt||{nrwxslqq_UemqxȌ _MaˍՍa󌴌H4  $ITg}ŽŎҐJS7F̋oXD@B$)%*7@FHCAI:;48=HCA<6:>6+)5=CF7NE;<@;2>BEDBADDKAHMOQYOOTJTJ?7750!+-,/$"## ܊ՊɊȊŠ{imda^[RB:70!-։ˉɉ^dlÇۇSwlۄ_c$ق͂˂ǂȂǂĂĂłłĂĂłłłƂłłƂƂƂƂƂƂǂȂȂȂɂ؂ EÃÃփ[υK6h{3qq‰Ɖ܉!'&"1HNRZWW]\g{}ŠɊɊ֊Պ "%+$(3=0-3LNNJNZj|peciu~Tߋɋ^xЌum|Ӌryztfy{yoyzw}}titngyӌ?ӌʌˌ܌ ی}B;zQJ3yĎ4ݏ>,Џ`^ÌL̋j\YLGHFCI\aS[WQFVVZ[_TPIP^XQEBNY]YSWNOOIBOSSXd[YYcUUe`d^qbYUbjZY\a`YYT``RMNFTL?KI?H;6B*.' $   يΊˊNJɊtwj[WbZB7626# ׉̉ĉSn!I}҇Dkf ̄V䃴Mׂ΂ȂɂǂÂÂłƂłłłłłłłłłłƂƂƂƂǂǂǂǂȂԂ6yȃԃ OŅ61hq 8-.qĉɉ‰Ɖ̉׉ ),.//7CSY]]`hflwŠƊъЊߊފ-+61,9DFIZAINQ[eiljny{lq{ 鋛B8Ћ׋ЋҋwËы*YdsMZ׌ ی̌ӌnE=XЍ&.P R 3'mh5}3,‹vzvriah^bcgmigkffmorecijkpdP\jtkkga^Z`ef_kzvvqqsz}mzmwoekprrtqzsc_buidhc[iSJ[]VTVLWCF9<<3))(& ܊֊ЊϊNJ~ue\ZSJ>>=5+*$Չ׉ʉƉVbA+y򆭆ZڅXDŽF~AςɂɂǂĂĂƂǂƂƂłłłłłłłłƂƂƂƂłłłłƂӂނ*j˃҃B"fgIOm}ƉɉӉ 3611/3AFQ_rxsqr}ʊʊӊڊ̊ʊ $)''3;4)+85EFRSajLQUE^^\^eh_ah~xŋjzًҌ#ӌ$ދ̋#ԋċƋŋËʋȋƋҋċ΋Ƌɋ΋ыȋNjӋًҋ!ZSnތČzcEj֍ */xώ񎹎뎈(iʌ_ɋNjɋvrvwyyx~~xwvq~rs|wtvy|uotquy|xyywwfqw}tkt^dmnb]cPdW\PPPA46*+5% '"ߊ؊ӊNJȊϊ͊ĊŠ{rph\USHBCB6,# ߉щƉ_N?10↩`хDÄ!уn,݂ς˂ǂłłƂǂƂƂłłłłłłłłƂƂƂƂłłłł‚͂ۂ!fʃ̓7{^ȧ׉KXqGɉʉɉىډ <9>EDAUX`jztŠΊ׊݊֊ՊԊ (/22=0>:7BKIHNSW^qURQ_[ierq|q_foŋϋˋڋ ڋɋT?FЋËƋދՋՋԋދƋۋ⋸ɋ͋ȋˋҋȋϋ֋ًۋˋNj܋ߋދ݋ԋ׋ދ؋͋ʋʋыҋˋ̋ϋԋ1 >mZP|ʌ׌ԌɌŒ،ތ+IM)Fӎ;LbЎ⎲xjKڍg2؋֋ыыދɋՋߋߋȋs}utxlrkmbca][`SA;553-,+& ݊݊ڊ؊׊؊ӊϊqzhdZQJBHE:7' ډĉGLՉ[؇d ކ?3愹}q ΃f ւ΂ƂǂƂǂƂĂĂƂǂƂƂƂƂƂƂłłłłƂǂǂȂ̂قXʃ̓ڃ,oq]^D*x̉ωɉ,2HBA@Q]mdux~~Ɋފ׊"#9;;>F?)?R^p\SZ]dggb]_gv{}}}ߋ֌U}tmdAK7 <%ߋɋЋ1<5F􌡌ΌŌyō uE"p换Îlnts/(OƌB%݋ۋߋƋ‹̋~{z}rokm]IA>A@=;:772( ڊ؊ߊЊÊ~lbXQIMJ?7'"ډʉ‰V(kچ%ڄyuÃVׂʂʂǂȂƂĂĂƂǂƂƂƂƂƂƂłłłłƂǂȂɂ΂ق Mȃ̃׃!`aֆU_f.؉fˉ։ۉډ߉"#242297BCEaoppxx||ŠNJي#*/1EB7=ESWQJZNX\np~uuzȋˋیڋ݋8BFH5PrURYf?2D8/*/?@HWC-05-\KKQKPPBLR<;D=90)!"9**#&$##+*-)8,$596L{-8dfK9PmdÍ&ڍ2ތ֌ڍJ퍩ύ፵׎-c8%yG,A!T%(ދ֋ߋًыًԋϋ̋ˋЋԋߋՋЋ͋݋͋ыՋҋՋыڋۋ׋ԋԋߋՋԋɋˋ̋xlfc\kg_UTMNE8.0("  ׊Ȋ̊ۊÊytmaaZPID88..*+ ׊ۊڊʊ~wia^XTA842% ׉ωΉĉXeωSx憔S8ꄽpՃb%قς̂ɂʂʂʂɂǂƂłłłłłłƂǂȂɂɂʂĂς"bʃу>˅bbF8z~oʉƉ܉*DTbafmrmʊӊ  0>KQPKEMWddbqxztʋߋԋ̋ËߋՋދ;GTg|snjߌ׌mm{uzvwqok}tydP]meQI`X\R`_MIYSN;UddiHLPPI=,0K87unjGTČ%" .y78{؎[Սꍯ`n%Z(+ۍynSmX[fSO=2OB175@01+0)7*(*(%#&# &#)       ׋ދ܋΋ċыȋƋ{k_tcVLC=5:86(֊ՊҊÊzkff_\MD;8-%% ىωʉF4<ŇOՆ$3mЃV܂҂̂̂˂ʂɂǂƂłłłłłłƂȂȂɂɂʂ΂ނWƃуރ0yaU"?wDwnljʉى -8AHSRT\`|}ĊĊҊ׊$(%1?GNWJ@HWhf|~vzҋދ΋͋؋ދϋދ *L=7Tp{ƌȌ~ŌЌόlm{mnotmmrs}pysonuV2znj㌸ˌ񌶍MDΌ.Ȍۍ%qˎ[ގюH:Lf,mz,<?򌺌xvxx[ahdL653+1!%!",% "  ԋ؋ڋʋNjˋɋpo]YQDG;99$# ݊ԊÊwnlb\[S?661) ى҉ʼnlS5$`Fㆰ}-҄|jŃJւςς̂ɂǂƂƂƂƂƂƂƂƂǂȂȂɂɂʂ˂ڂ EẵڃhhV`jÊ&h}ʉщ #418?SVX^grzŠNJϊNJۊ݊ $"72YXRQagXNao{~׋Ƌɋڋԋы؋):2')PJQg~Ō܌ӌŒیΌььȌˌČ#T"ь{x}he6ތ؍)nj͍P;QK6LˎRsj+ڌލ#CʎR/eyTmvkkqkaljjTa^TPPWP]heVWZ\UTY@DNL44A@/4--9B>1683,/."$  "$ ׋͋׋ҋ׋ËNjʋNjɋme[KNHI?,+&"  ׊ʊÊxwnh_TF=6+!ۉωƉ`NۉF-xӆ}l˄~@惰AقԂ΂ʂǂƂǂǂǂƂƂǂǂǂȂȂɂɂʂɂԂ9|σՃVIֆJdz=k TƉƉ؉&-94=KUV^_mv|̊͊ҊЊފ ' <*PVUB7TTajuxyƋދ#'-);(8YD/XU]hjltȌ ׌&krӌnjˌ͌ˌɌŌŌΌƌvՌȍ-3C6_ݍ9ώ%WS;ԎO\_%Ȍٌxvxut{you{yoadlc^_LRdT[\ZOLKRNJNSPKOM=BA1@O8(4&-23)"݋ڋҋߋ؋͋̋ɋыƋ~~}udRMR?:0-/,," ݊͊sqeSLLB-(%( ډωĉtzX5܉@`چnȅD񄼄v̓vD ق΂̂ȂȂɂɂɂǂǂȂȂȂȂɂʂʂʂƂӂ,tȃԃG݅)7ll fˉˉ#(GHNKQ]lrrwҊӊϊΊ؊ .62+*#KFESRBMYfȋ׋ϋċȋϋ $- 9D%94<' 3@4FW;2, ŊŊxujWSUP9/07" ىщʉȉʼn~p{vQ>ȇWԆ&ׄsÃm3ԂςʂʂʂʂʂȂȂɂɂȂȂɂɂɂɂƂЂ݂d̃ԃ߃4҅okމc=FcƉƉʉى$!!)@PU\anƊƊӊӊ؊ӊ֊ڊ -I?N2"&*/,&8D8$8a`Wignmь͌-+cI> 2*6E,;BKND ڌ%ԌÌƌݍ֌ߌ܌ҌՌߌٌ،ٌԌ(LCHsRrTa^VCGFjken|ڍ?Y펄\mAD6gڍƎ6HO.Re7ٌ ܍݌݌ڌ݌όьnjЌŒ|~x}zy{xoa\iirofW[`VPFPFE40'&,(!ҋ΋ʋ΋֋ȋ΋Ë{xj_ZJFKI?:7'  ܊ʊrZYUWE9:=*։͉É|teKM߉&eA熿 w҄^k*ނт΂̂˂˂ʂɂɂɂɂɂɂǂǂǂǂÂ΂܂QԃكoŅvf_8,qwʼnωӉՉۉ (,+/Dageg}NJي݊Պ܊ފ8nQ-ZIjepxϋʋ̋ڋ'( K">60>15XN=HE=;2K[i~~fz܌=;U[PHFQ=4EU>#,,*1"$ߌ  . '<(JۍY]؍ύzyōٍٍ)H)aF}$& ⎀dt2<ލmhH05A$3%یЌƌˌΌڌЌی̌Ɍόʌy|uiyne``XPOF?=:=90", ыՋ֋ʋӋȋ}niZSQMOH@0# ӊŊuca\^QLN@,  ܉Љzmvk9MΉ 0/vbÄGヱ^ۂӂ΂̂˂ʂɂɂɂɂɂɂǂǂǂǂ̂ւ=˃Ӄ\Y\koϊWwɉЉ܉݉9FP_\fg`|ҊՊފ#$#Sy@dsp]vr‹݋ыՋƋ͋ҋ&75(062/ $7BF@/44@DTT2I[n^yvrkrryt| #ԍ΍׍ύύՍ'N"_ Tk;؎gxV ԏ4Ύq|p`C;Szh>PAD4:    ݌ڌٌڌߌٌҌόیЌҌ̌׌ΌŒ̌׌ҌȌvtogVXP=>A4=95++ "# ׋ċNjzpg\`WK?1'ۊՊ؊̊x~vqnbOVKB9+ ߉ωȉwn^jdMωΈ | ׆:0ۄzy:ӂς˂ɂȂȂɂɂɂɂɂɂɂɂĂς܂cʃ׃܄-$/z]  at̉ɉމ(CN\cbcuÊNJҊ5o[%roxɋȋ̋ϋ׋ &-xsK6#OW\Lhtgpb]eyҌM_ohZQbSq}|p?2LNIZJOigISZVfCZJ>n~uUa_przy͍֍ˍȍ  #"%5Scl`hsHsR׏6ڐU؏ې萺S$U xF(эōhshi]\U0*-/:6;8??;4.&" ԌیҌʌȌČҌΌÌ{gq]XZPKM@OD;8,%! ڋҋԋċtoj\SC7.)! ߊ׊̊Š}pdXSQA?4& ԉՉ͉Ésoc_J5 Çv͆~фji&ڂς΂ʂ˂ʂɂɂʂʂʂʂ˂̂Â̂ۂNÃԃڃjɅ{ naˇ!BUilxlj҉&,((*1N[ck^rՊԊՊۊ'E~I)‹‹NjNj &Bia7epmZcguodixw~ŌȌΌΌ  A[mԍҎ6 ߍJ2slt`\cnaziwiswčэӍ؍ڍǍƍߍٍ̍ݎ&;AK':-FOadGgߎ! C>ԐBH)K8Mv4ڏ)mÎWՍٍƍލs{idOPYN_LXRFHF@F>4G,33/.#%($ ی܌͌ˌČ͌Ō~zztgia\J`VWT@52)$% ֋׋ыՋƋ}yrcWF@72(݊ϊĊpd\PI:@8+ ډωʼnrrgg]6'و ׇH󆶆yḧ́V惽Rւт̂̂ʂɂɂʂʂʂʂ˂̂ʂւ:̓ۃQTTboXeՉމ77)08IY^fiՊߊފ& 8l?<ɋNjȋƋӋ΋ߋЋۋ:%5eiUSl{Yiooo~͌͌ьҌՌ  1C<$929(%Ԍnjtto_RF<98# ؋ߋًҋˋzro_UGE:1ފЊwq^N?F3,'!މӉƉ}yp_YWOˆˈx ܆Z҅S}<؃j܂ӂ͂ʂ˂ʂ˂˂ɂɂɂɂłЂ݂Vۃ߃#yԅk[qg4wủ͉Չډ  .*>IRZe_hvЊ$!%-DGA6Hcuˋҋ؋Ëҋ؋ڋ.>ITORTl_zsɌՌƌ֌njΌ"$=61C\ghx̎)-%.,Ѝ̍ˍۍ̍܍%6Wjk~wy\'$5@#$,D`]Dks׏ >e.BAѐՐ\(!5ÑUƒ|L,DK_ D5b␴4֎~LXDB66$ݍԍǍээ֍̍ȍsd_ZyldX`FJb\TFPTIX]XLAIBC-5( ߌ׌̌ŒЌʌŒ|tjTN@A21+* ߋӋNjzxcWPG5(#؊NJ|cRYC410!܉ՉωʼnsnhYJ_CX̆`ɅCل}z}݃KւЂ˂̂˂ɂɂɂɂʂ˂‚̂ڂ=σ߃[p[[;1WbXrȉЉ׉ 56GPTediln{ъڊ'793BcfghNjȋ‹ϋًҋ݋ҋ"0G/>KR=NbŒ̌ьތ͌̌3BC(Ifgpj|ލ-BэՍ* #>K9G41(IJABqhm[ej[Jaw}{ޏT֐אёB/< *ڐ_<6e͑iR ْz94̔6WޑAjG"̎|S^mVUM; ٍ׍Íэ֍č̍֍}}nnwokfmnoh\LW]X]FD4!# ތӌЌތ܌،όnjČ|vvd]JD1,*5,!ߋ݋֋Ћ{je`P=.) ފ֊Ŋ{vj\N?95)Չ͉ʼnunmeSDP0则|-ن{;!ʄ}}cӃ{'݂ӂ̂͂˂ɂɂɂɂʂ˂ǂՂ)uσ߃ >KۆNRX`hvNJЊي %AMV^bx̋ϋ׋݋ 5AXY;0TmliÌʌŌڌ،njݍ!*Ig^DFgli~׍8&) ,%"(IA(*C_H4g|eSTzǎՎǎ@fǐo0ڑۑ#;T8ޑ}!ԐE^ؔqyݕ֔t9)%dܐwuwxlN=)*61*"؍ԍȍčύȍǍȍ{svygaZ`gWRF1/0'!(׌Ҍ|ulRI?C/)!܋ыԋmn]O<2) "ӊŠxihSMI7(%ωЉȉȉÉ}pmbVL=:܈*njnq vw*탷Rւ΂̂˂˂˂ʂʂʂʂĂ΂_ȃ+)!hXtk"jqm~ʼnωωɉωމ)DTIS\dbqĊ؊͊ފ܊ "',93.HTYdl|͋Ћ׋&35#:Vf`YEOrsǔٌόŌ،܌ь̌ˌЌ%7'=LLLckxdu~kzȍҍލ%#%,6M\w[wXny5*L\:,َюݎ܎֎ݎώƎɎڎ bGʐqKғkX &}w5(␯ΓqV,ۗ{p~cH. {!ˎώ`Z]lim7-;7?1/64*  ߍ͍ލˍčslpnY_ROA:6341% ܌ɌٌČ~ymq\RCE/&!' ֋ċƋieW@1,&(܊͊xifRPO<** މ։ΉÉslbXD4A*̈?d]ޅHej胄4߂҂΂̂̂̂˂ʂʂʂ˂؂ @փ`~YX$:?dW[myƉʉԉ+@QVSRbmitĊԊ݊ي/:=HI;GZ\f‹ËЋԋ ))099:Z^ccpajˌČٌ،ΌьˌތHALhnpmdv{z{očύÍٍލۍ 3-'Ea[{rn}ԎGt|HhGJ1`9 َ׎+=W)\,ߕ.G@ b͒@2אT#7Z)͗ٗPS@/uN֏C ߎ؎ώǎ{tZS_tFV?HPCMHD;. ,܍ɍЍ͍ʍύōjen^OGTMA563"# ٌΌnjucUN@42."."؋ˋ̋ŋ}rk]I3+, ۊҊ̊ŊqfTPKB.)& ډ։Éyh^ZE6(+%߈ކkH)҄mJ ǃa؂Ղ΂΂̂̂˂ʂʂȂԂ*t˃ETCav@v`A@`ayɉى(8=OGPR\soxÊʊ׊#/@SV[YUdlk}ɋ֋ 4>A94A_b_rz֌ʌȌ،$RU:KRuv͍΍ۍ.+KHMoԎǎˎϏ]Lqi #ꑾ;{ǏWGPD5C:&0#BJR`t)nޕDeJSS\ܑm@AO擠wM:CĘ6DzϑːGj4- ێĎĎˎ{zwpk[kohwdWDB7PN9+'<6)*!  ׍ǍӍ܍Ѝ~|kd\QSVH9=9#! ٌʌmc]QCC=*2* ۋ̋ӋϋՋˋ{reZU>()2يϊÊth]YOD/++!lj|hYUD8,܇Ujeylh3>؂Ђς̂͂˂ʂʂĂς݂\ƒ46(iRrԈ߉sC[_pyƉى߉*?OBJROae|yuΊߊ $=J^`jmyxċƋً  "&5UGH6JaqˌΌ݌ߌ -YUagy~͉.AKTYYdawqъڊڊ*&.DOhmr|~Ћԋϋۋ 0*'0*A?IS]fi{،(1'Ckg{ojÍ͍׍ۍԍՍƍߍ >Q[ҏ .Ani_?Џ֏zSU?'ߎ܎َǎʎinzg^VjkJXQ@.94&ԍݍʍȍyral_^WKGQL@-#%یЌtdcdY=04ߋˋyibHG;/% ފˊskc_YD/0/" ډ׉zpeXE?2(EԆs_='ĄriIDՂт͂͂̂ʂʂȂՂ+zɃC[ކIe2qԉx`M?Qmvʉډ6FSYP^efktˊŊ؊݊;??OLm{p~ŋڋ*+/268:Pffxpvތ (-&&O\iӍ׍,1>7$59^y?thC[YheYߓH˓ga㒰yiY4WݏÏďԏGHuJ)?֘Ùx?a7y9֐̐ڐi ՓՕhfՕꔊב nԏyrc;K6K2#%"  ֎ގԎ֎ҎǎŽÎĎŎ|y|w|bUBOK<.1=1"$܍׍̍ynn^X_d\K/<;%Ռ~tunbI1$#!݋Ջvm]WIC68!؊NJzseeVJ36.&! ܉׉ĉyni]FC.1 o߆_f"u񄴄jZ/|قԂ͂΂͂̂̂Ăς_/Յ8,c_`ÈډiJRUev|׉  4@JR\Zhjt~Ҋ):@EYsuы܋*<6JQRN_l}Ȍ %&E^_d֍ύՍ    &GDYf]ɏ =oeF,V?zVwuJzkْ})PiqƏʏяߏǏُ$3MxVޒL\\͔0/Ñ>쐵vpvx}R?ƒ ^ǐs1 ҏgjdusame6?D@-'%*8(6$!ێώ׎܎ڎ{wk^l^\S[QA62C- ۍӍǍǍ|}oslcREAB ΌriYL?2* ߋڋNjze`cC99% ՊȊ|yjgXO:>60)ԉΉ‰~rj_RN9& WΆZ]+Մo? Kقςς͂͂͂ȂՂ>ԃZ!_Xˈ0MMRZgkʼn؉ $#,'$2@KM^gwx͉ډ.<9ITbsqŊĊъ܊,$$6F`f~ʋ͋ڋ&* ,:D=99plc}ˌΌȌ /R%,@wǍӍӍݎ5][{n>8SD&NPYG&  Ɛǐ|mitru65D@EC8  ۏϏڏ͏ʏ|{lmeab\[O02),֎ݎƎŽksYM9DQ;J΍ʍUWI@݌όnj|rh`UQXSO1# ԋ̋skVJ@<7֊̊Ċ|ojaZE1&)ډԉ}urkcXI5+ч0ol# sz; JՂЂ̂‚ɂ؂ Dك-a2\^Ї2Ɖ:-<@FNW]ut҉܉߉&/&-=AMHi|Ɋ͊ڊ' 7MZYrċы!&gwv}Tڐ1͏w(䒉]ғEeAԔ?xⓌޔQ"&."?X2Ide6P]owxˑˑۑő}rijl[cwpjaWmsrP1-.-!ېɐАېːxy][behC81>+ڏۏ͏Џ׏ŏď}shTHFD=. ӎێ؎ʎ~jmce\JXN9#&ݍՍjbRR5&%-'ьЌЌÌ}n\]WR<+ ڋԋniY>7/+ ܊ȊohafP;,+ Ήwsf\VK6, ܈ꈊˈ>~׆bqV鄯nl!{(܂ӂ΂ÂȂ҂,uŃFwLbE5(/2IW_inwʼnʉۉ "-05KPSWi|NJԊ %AVZdnɋƋȋۋ (87MKO[]\sƌŌȌÌ ->889XQэԍ؍ɍʍ֍%S \S`DaaxlҎŽʎ $2ێ؏rՏ{H #1(l_5MaؓyTy_ ȓ. MDT~БבّԑݑʑґבޑБ(ؑӑɑ|tʑmTEE6&ڌˌqgZK==2 ܋Ջ΋~wn`GC9+$܊ϊnc[^GC3*" ՉʉxdTQMB. ߈F҆rdT#҄yr8YׂӂȂς܂U:p҅P5aYNoÉK&%;Q`elr}ɉى!($'2M]emzNJԊ/Qijko‹ڋԋߋ!79HacoczӌՌ&893/1>~sލٍӍҍ#YU+S6h[dlctˎЎ<%ڎ_pAxUR_ꓷ-\蒭$:%@ S?/Ҕ o -͑őݑΑȑȑ %B"+HB3$ ݑ ّב‘ݑבꑳstdSO_U 3쐹{VMKC44F6%-ڏˏЏ鏼}u^LGQN=-& Վ؎юȎ̎ŎuwU`YP21 ٍύxfcYQP@7 ތՌxaQG9:1! ̋}uhRK9)& ӊۊNJrf\cNF3&! ډƉ|n\KE?* ߈\&݆ai\򄵄rr惊5؂͂ւ7ǃ$RV^kʼn#)%*8T\hizʼnʉՉ'&&.>HVjhxxNJ̊ߊ 7=ihr}ы!0>CTeÌی 7?RL22Hb /\\L6]a^en~ӎߏ "$/\+qN7 KfD tr]d/'Vv=Ȓݑ6ҕQH+7^9В 86-3,[KUNFLiqTJix`ђhT}BZՑ0KkەƓIgKE 26_zu}Tipqƒ’xxAklr}qvlp{U '7NO_hGN=A ȑޑߑ|]IL?1793'ܐАɐߐܐƐvssmnm\`OHUBJG25+ڏ͏ďȏwdVB֎Îit[e<." ۍލȍύ}jaTS97 ʌzdZ^ZRG4+ߋ΋}un^K3+%ފيԊxb_YVE5 Չɉvh[MG?+#Ԉo1↺fsq„u~ 􃟃DقFӃ+`8e`ć' #%(4?Zj|}ʉ։ @<7=FWen{Ċފڊߊ܊ (1)3O`vz|Nj *3=crsԌ܌ьɌҌҌ"):HBt}tٍɍЍB6A9B\}|͎ЎюÎԎ+8R7DO\-`{Sr_ac<\m֔>8ؓǓ KlEz;5auiߓǕGS? +J1In_sÒҒߒے ݒؒԒ]~zk~i_Y? L@'4GA:בّ~~^]VWiM8,אΐΐ~}yxkjTBNA, ܏ȏpsqiNH" ێÎĎxX?- ߍȍjcOI0ԌʌxgigYXB0/ыËuhNC<,ߊΊۊŠ{ggcTB5* ډщlj|gYPJ>+ ԈĈ[/t ӆ}lW̅=䄭x_׃y"'rK|نM_7g--&.MUeyЉ܉2KLFCMcpvՊ)5EPhl}~Ëڋ )#:[n}ӌٌΌՌ !%CWVjzэ467,* ًʋsbRK?-%ߊ܊Ԋʊ~lihaO:0* ىɉm_TL;,'܈ȈʈЈvڇ1߆hn-Ą{?N Q 9mŅX&biډ8T !:>:Scpy--@NNQ`q͌܌(Xk[yysǍݍ׍ @=KS\ibێ*!1sfeݏɏ">dNڐ萿~$'(ܑǑő瑽tYKO]T@11ؐ̐Ő}za;5?4  Ϗzr_RAЎώnZ8@.# ֍؍ЍunX9"Ì|rn_WC85,ԋbTHH.'-"ڊߊފĊrdceUB4(҉lj{k`XJ5'#؈܈ψXE׆ah_򄷄rs 샎04ƃ$SU]T݉ &AHPGU_lrʉӉ !&;>BSo{Š֊܊1BBBSfzƋ7TTXdip}nj /28:AB`tw͍ߍ܍));)GXb^͎ǎюҎ?:Ja[ ݏ͐ E䐼i:&ݑ eDaؓ$ڕ^-nL\\I5E,-t'|5 !ʓ擹Ք˓ғs[Qtokv8nUG+Pb# FSGG[\PINYBF Ȓt`:&! ߑёx_dVZF5(ِ}e^ojM8."#ˏ|aH:8َ͎ŽuW]OM$Ѝ΍vaA/#Č{vlfMB=9<%"Ӌk\OCB@-wlhaTF8&؉ΉÉ|okcYL:0& ҈ΈLj_Jdžu_[1ՄxAƒ^_Dnԅldž2WmK #6.$ Ȋun[[XK=%$ Љ҉̉ÉskaVP76-$وψȈQ]܆^itls&@˃,\*XOjcɈ$4;DJckdkyƉ͉ۉ"7:@J]fxɊˊ׊+CW^jih{ŋҋ͋͋׋#,CXnrujČ݌",%JRdƍَ -FNU~}zΎ܎Ǝ/_kߏ$  АːʑB5 e_koʕq%$8Q:N!a+Ԗ˗6Xtғēؔ<79-5>ғӓ˓ʓ֔ꓵϓÓ̔ԓles~zȓƓyj{g^cCM2ؒܒ˒ؒtxw{vb;0 ˑ̑őx[MNME;# ܐh_\VB%!+ۏяXJ3/ ގΎŽ{daG8@č΍Ӎ͍jbO0)ԌȌƌ{j^MM,/NjugfMC.!ΊŊsq]WH;5 ߉щʉvofXSA@2&ڈ͈ˈLSՆ~]T˅CuVڃnOxxΆ8RyU񈸈!'2?FIgpzՉۉ"29KRblpÊÊъ2C\_xrmȋ΋̋ыً %G^jȌ̌،ݍ)!B<:\k^y͍1ANNZb|ю/FWOGߐOIRkt|5Ô$/Η\ݗPȖ͖(ΕWӗҚ, . hT)6N!2luakZU<6̓ӓ , &4*I'+1 !ГՓɓ̓ÓǓϓɓʓД*ߓΓēԓvXPD ܒגڒƒ’ƒf`MK+ّؑґswkXLI1+ÐxeZUC2'ҏ`UJ- 莻vi^BG  ׍ˍ^TN/݌ӌvdWDB20(͋Ë{luQC+ Պϊ|jfMMA7 މӉ̉|x^RKA3!͈͈ƈPvH ֆdf2 Ątt3 σ9d<T\{ۉT͈ #'.=FLatĉىډ߉#08FHMYt̊ &$09 4Kp~[W.ړޓޓF68H,(@!Ò̒ĒerU9&ՑґʑYVq_KO&(ȐĐzrdJ9,ɏlgeQ68ݎ׎}wPW-)ߍ׍ʍncH8#Ԍƌ}cUOO:4. ׋ϋxl^E2( ݊ڊĊo`YNB9" ؉ωzvaSJ=6& ͈ÈÈG{ [͆Z][񄽄mY# R}ֆIL|-_ֈӈЈ"-1B?Slpuˉ؉ԉ$):=Pees֊ 18Gi~Ƌыڋ,9GWrՌьnj <@.Iid~{rэ 'B_hsbr͎+-6Vď :ҐDZ6KZF,@HOyls<66hږ!_Ƙw F>?ǜٚR4LkɕR2Δє”ДДܔÔՔɔ蔷cʔrʔkeBMf}k]5&B[SsL;˓ʓӓuv_DE 1 ӒƒޒՒs^P,ݑˑwlbO8FΐːːvmhN& ޏڏُshpKD4 Ꮎ~tk4>+%ڍэʍxlW73) Œ{ed^WN3  ͋~sdND8+ ЊĊwnVL=3$щ‰zpbVL;-' ؈̈ˆf`] ކk_@!Ԅxv<Ѓ=cD``Љ5 ؈#CJLauurx҉މމ$)++@V[awŠÊъ +5G\mt}Ƌɋҋ5:7LewҌˌČXaORmЍ@ 7km~ʎ֎Ύߎ 3-= E,)F\\WH0lZuchɒ9G=Εږ*eЖǗ<l6ty~Wf<3ڔ%%?t}S7ؔ֔̔̔ʔߔՔÔƔ씳jo]~D#&ockU=P,73#ÒpK$ ԑđđrrfcGԐpH22ȏfKJ5' ŽpNI50 ԍǍviN?5یԌywhSI:+ҋ͋ɋqKA@3ԊNJ|s]SH7-$ ډ̉zpcWM:% ؈̈ˆ9tlɆVb]Ąo[ #SDQ5<Ȉ,;WR`n{zÉՉ։ "(44DSZfq}Ŋӊ݊  +(HK1Gf}arEl`;.FÓXC G!֘ӚכPFFOӝ sĘ33ٖZ+$H"/#ɔ>OZDD! 2 ӔݔޕȔz}inveO#=$Γ“u_h* ȒsvIK8B4 ̑vhMIL1֐Ya;׏}b[?/ˎnbR6:<" Írth[:# Ҍ̌{s_QK7"ҋwh\QG;/# ӊŠzfXIJ5( ډщ‰~xcVI@8( ߈ӈˆ8h) ɆabuȄjŃ &UGO$WEňΈ߈ڈ,7(  ؊Ȋ~o`XA3*߉̉xd[EA6'ֈˈwJoԇ-߆ĆQQ΅:ᄿ˃ԄCF9=˕ѕڕez~h\=."-֔ᔷ}nnO ޓғГkY;7,ӒŒwrJ=2- 葼ozNB;6ϐlW= ڏ͏|gI1܎Վu^Y: ڍ̍hT$  ֌njp^TMC.!ԋ~riV=0("ڊ̊}vkYT<2$͉yaXFE8*! وЈ:qmʆW^~ ӄу*VKL-W6|͈ĈΈ؈2>PZThw~̉݉(9M^ru{Њ-&ZL[rߋڋ 29EP^UsȌߌB]Zb`X̍ݍ6@Ij؎((/]zdT`ԐА J7'-&3Nג֑d_^zzEĔ?͕;},srkDřٚXrd󢧡ӟ')ܖr)Օٕҕ&&90z斫[@h]X)84DY^i^r^E@<ڕmǕ•ؕ•p^w^dWf6 0%ߔʔƔ}L̓ٓȓefN;MHE$ޒےْڒĒ}YB6.ӑs[@>-̐jOݏnK;3ʎЎqcJ2ٍ͍zhE/# Čyl\K9%֋NjuYA4(!ԊˊymgWI9*݉։ʼnyk_NG6-) ܈ՈƈÈuE]#憺|TRՅ:ƒ@fą^цMṡÈ߈|ňň؈ (=P]\iwωމ#%"&CQd~̊&L8tNK^`hȋߋ$E;FOewŒÌɌތ/ Hhjtt֎%"'6Sfjfyˎ׎َ*?a`Y{/J0ӏۏ,=D~Ցʑőۑޒ^MX:oud۔dcE( `ʗ2י~7bqޚFJ1ݕ3BOjjUt3bnlJtƖӖE U%"9m'Еŕڕ񕶕ɕB5$&͔̔㔹ޔjCA;ᓾL@E42<  ’ŒpJM<,͑j\[F$䐾Ðj^H) ʏs`;'⎼s[E ڍɍsvW>1ՌƌvgR@. ދҋsaL<-ފЊob`PH9*݉ىȉqdSKD;.# ߈؈ʈÈEllņZS(Ԅ+UEQ4` n̈Ĉ̈ӈ܈ '?NYbqủ։ $"*6G`sɊ6qBKyӋ .AHL]rŌˌ:7'@Qe[dgԍBH'+&Vmnx̎Îӎ <6G\oqz2ǐ?0 P&8FC"E#2Ք-1_ZԐ9iS AБ5LQw6bܒ%LC ;'2͗v@8Q6JQї^Onޜ4>/::ߖǖnRcyjq c|ɖޖŖۖۗі˗lyWC|g~}pBOGNK=7R2LF,:/$@:ᕼܕ𕭕bucaE'ؔ֔{pZH?Гtsr\MQK4;,В~goS9>ڑ̑^XAߐɐm^81)Џ{c7ߎkWNAAݍɍscN>-"$܌ӌČi[D,ڋϋϋtb\MA9*ӊÊpeNC=3(؉ˉ{o_LM?4*! ׈͈w8l`ʆ][5,SGK*C^ˆˈڈ݈""0N\]^kuՉ؉މ).TVhuӊي 78(OErFOjƋދ8>JkԌ $"$.4PX{p|vލ4'+,EXdXszߎЎ&6Dpuُя-bꐱEo‘ґϑ ܒyy(f&ܖזs;Dޕ֕C@Rb_:5疲l–Wn.''|6+––ԖƖ{aC(ߕݕ͖ % ږ))6[Higm;? 7 ӕo}ns,ĔfS46ד~xtnVUG+ ԒnYZ7 đtoH@ ʐw^J9 ޏʏoE8ՎhYN=,׍Սύ{\M<3)ɌqeUD4/ًԋzlaZJA4 ЊɊ{nSH;4,ˉ|m_LA=3,&وЈoK[߆yUIȅ9@Cd…\Ն StʇֈɈhˈЈވ%&2FSTbhrԉ+DMq~~׊;;Z.Θ=̗=ؖܖƖ̖ϖ% ؖwʗM+*ؖx͖x^OXoynBbL'N.!5 !$!/XV\mw;9wOUcbD וK.$;'͔lTD ߓדÓx]XM&0咹z\B8-ّyhW?)%䐻lfa>#ُʏ~VJ.*Ď|tiN>1&ՍoVB1&Ҍo_TF>֋ylc`N:)ԊϊĊsYOA4*׉ʼn‰v`J=81(ۈшňrAiMzVZLQJO2\ψш݈ '1CUJVah~ȉщ݉/>I_|yŊԊ %JSxAUr}Ћ%/6NZvŌ  :*vs$+;0"7HFnɎ24HyOא֐BULƑۑaÒƒ5zN -dzuǖ͕6;wI `pg-ÖƗ+P▌L(t(%ӖO֖l< <>a$\_|01̖O[ =A4hB?앸ە̕Օޕ q/VV`Ж̖ږᖪWD12& ܈ψƈ}Z_1↳}oKQڄZiRֆYkXш '0HILXhn{É܉ .BXq̊ъ /%W>sV>PojČ$6@3MqȌь͌؍4(?k{ݍ(34"do͎̎֎Ўʎҏ )>W_\ߐ"/bpjurlv0Iْђ'7kx-A.tvޕϕK[b4-? L0HrSϗ>qX{xVʗ喧eV"ĕؕG ؖ>GqOZ`UD)+敘oוҕ"'P[dϖЖ̖ؖhq)*ܕŕϕ̕vzu3%הsYF:, ؓǓor^ )蒵ub]K22ґԑyK(ؐӐ{i^SHяy`TJގюǎcX.%ҍˍngTK:5$ʌwi[MJ( ̋{lZOL:9(يΊŊ}lNA2ډ։̉ʼn~dPI;8,ֈˈj=RևG}T_#n|BK)Uẅ݈0?NQQ_hrɉމ #)AlÊƊϊϊ&%`=vv`Bhڋڋˌ 'BEHbnЌՌ $9Geon:?nƎ͏ ؎ʎ/#@77M̏׏(]eԐѐWe `) 6wpѓtm+w@]~㕲˕ז!XY0"o×6<@\–}{eK7`LEAҖʖMj-T-Bu!#2"'haeZ-!;ЕЕuĕǕ Q)2Q{DG{ЖŖzX[59 ry>#Ŕ{pT= ߓsZL3גO=* ڑԑzT7 ܐ|\LG4 ԏ_h9- ՎÎg\C6'Ǎ}xkP@B&ˌujVL3 ы͋}cVSE9)݊ӊÊlT;* މՉ҉Ɖ~lVHB8, ܈ΈˆuHG ׆~xMLA׆Wl=ֈވ  (:KRP\gp}݉3Ifxъ֊0RSaBڋ͌AFMq}Όٌ .UWLl׎ "Dώێގߏ":rBlŏʏߏ Hu/Ssˑ֑ "29jCRI|ГʓΔ ˔]aZ9򕷕ߕܕڕ8tf@aF*GF }1PrRjA זfCx˖lQLƗ󖩖!ؖ0ȕĕߕۖaR6 ҕוޕݕƕȕ@9AL/(׊Ŋ~fJF+։ԉȉ}jVJE8-߈ֈʈZy(R͇;熽|S_4L ZqĈ҈ &3FQYYhoyщډ*BYiЊϊΊފ.;HWhi@j /EKg؍ (-,6ߕʕڕJwѕʕ̕2<.TfU^dƖܖۖho$>2֕~xc<ɔΔiG>Ɠv`J< ؒВqaE41 ґpI*ՐhZH%$ڏaS2+ĎfUa9$ލ΍u\SO<0ˌrcVC%ϋɋvg]WB*#ҊɊs^QF,+։щˉtk]QE7+$ ۈوȈ|jGAsنzlLυ5цJe>̈ 2DQR[gqxȉΉ#3?Zhẙϊۊ&3+5HSd{ɋٌ($+8J\d{Ռ &67YYTU֎#L=0FA!nzՏ.(l^[Z܏Õ,T 3ӕ,5PĖޖ#GG!/Ur旣Η]IjWFB0kח͖<$K6@`bЖӖؖ֗ 6MfLPϖזɖcPӖϖƖ^Ζ )= "ߕϕҕԖ >l{pjq˖Ӗ%ʖ}LڕxH/蔻ebT$“s\.*$ʒoeU]̑mM@*ސՐe<7*܏ʏmB=+ᎸvgR4&ڍ~gZQA8ٌЌxgQ?,%ًϋ΋pWRD-  ߊˊ}lc==$#׉Ӊ̉tlaUG8-(׈҈ňÈzYp%D/rH0SKzcĈLj͈-;CObhdu{щ׉#26SZg|׊$)55TVqbjȌ"&2'>amȌ֌ 6=Oe_Rf؎N]Syf-8?snؐFWfe~ȐҐ֑#425jۑ>mÓOo{N]BO|̕{&,֖J Ia!{B`* ٗQ|ݗėzƗAI oƗuҖp=_HyaN0ɘKxzGʗ'AؗL*0=pɖԖMZ1Uh~bĖCѕ,.(vҖĖϖx_HR;ߕ땷ԕkH6ДkCȓvmEQMߒvw[A ՑđcS7%ؐǐŐt[;"ՏÏdQ./Ɏx_L:$эu]ZL?#ɌnjmbK:* ۋxoT[>0$"Ί|hD?+!׉ىʉ~pdYM>7+݈ЈĈň}u_v/Boӆ}aTˆDi|3yLjˆш'3DJUc_u}‰щ։+:KHZfϊي%+6TGclˋ*3AQhrь 8JKidh؍ύ͍.k_ώݎ )Sl3%<Kxԑ0Vuȑ IޒГEsÓ fqayv-ؕږ=ؖM̖ۗ"CYŗxD.CG"u˗󗝗WPbqLٗƗŗH֗ΗPٖB0%1(Am:53sr-Uӗ(PHflw6*9ҕ•Ȗ/`Xڕȕ%9얪Ėږזח#0?0ږO0(ϕӕuO=&* ̔2 ͓֓xsb-Ԓyg*ّ~pXHƐW ֏؏vaT- ɎtiR9$΍qfWG-֌qXG2݋qjeVH<*$ߊÊ`WD/%܉ɉ‰sgWK=6, ވψLjĈ}qoE`!:*򆸆}1J͈JsTxˆƈˆ݈̈$2L_ceuЉ9LVZnogȊ֊ي &/8GTbx؋"+):ficnڌ 5Da\^tٍٍ_p_]Ko}ې (=Wm|v %8Np,,Ē>ޓ>vxMlm8:͕ЕGa3/ח]sBVi)D˗ɗY җCN7]>얥Z1 ؕΕwE{' pdIՖ%?+Y-ꖇ:˕g /ؖ &\7ЕŕUɕLReԖ"3JYTCϖdPP&ו]doY2єqE, ޓ֓|pkKߒT.⑬llbLHsH5ۏʏtnL3 َώaM6!ƍs_Q=- ܌zeO=) ዹ‹r`PQG3# ܊ÊueZE4'ىljumZME5) ڈшψƈ8xykLu(=c܆{8eMW&tlsLjĈֈ-:KYZ`l|׉߉),7=;E\qNJъՊڊ 9?.5Glԋ+'9NOq}Ì֌ '@^lz͍܍܍,W_1Ead&\x !:3i`vё"!kВ@ؓSj_땎C1j(=+d28sr̖tD˗?CƗȘ7̗ʗ—՗\>9g|ߗ)떚Y?cESO81{”Ni֔jޔd"Ǖqt2@g]r͕eq.XEZÖE8񕳖pr%5.RΖ/.<4^KeIɖ?RE!)ŕ> ƔtiF,!ɓ^ZO 咽XHJ5㑶jeY=ڐeU@!ݏ|J;؎r]F0 ύs\I1*ӌtf_L(ɋteTWL9'ΊwiaL?0!ΉtkaVN<-#ՈԈ͈z{k]PT"*>*$H؇eKWgvLjň߈+3@L^qvÉω͉3P[]vohyĊΊ؊&)=IKg|}wӋڋ  .4DiԌԌی#1:ajٍ#:K?~ɏ@k IsّC:5BCq"wÓ807Wϕ@Lslt-2!Q}JM-Oxy旤ڗ򗟗JT!ݗ, ( ۗ\W˕{֔mҔ K*$YjlՔp ÓpӔZ+Db&8gc'&Ζu}H3<̕u<)ДxJ8ۓœgK*ĒlcJW3 ӑja2ÐkWD ЏmJ&ՎeS4' ߍɍoSF>!ڌόtjS=(ڋk`^MA/ҊsfM:0! ͉ʼn~shPK>4#(؈ֈˈˈyedIh:e ԆJ8Y$1ΈlLdmyĈʈ̈ !09Ldzlj ?@46R|vƊڊ*'8Ulkyzzϋϋڋ-CJVwnj، :3R[t~ƍڍݍߎQ^P!"U_yŏې8aI{$+]Ē 3)9ߓ2^a$J8{Bpڗ Cߘ0٘!zĘ#Ζٗ= ݗ]ʗQؕ,M;6S8IZk)wY[4V0x<Õӕ^u ?擔f>D>ԗėA×CіluÕƖՖ>;<Ӗ~ǖ%"@ldu{P薹pF-)&֕e\? |qX5#ǓmBΒzdR: đ~L?ؐn_=4ӏɏ_:ЎwcO?'ōlbT8/،Ɍs\S<*ڋ΋ɋsi]K@5,ȊzfGK/"͉Ή|o_\E=<+' ҈̈Ljlrg^VD"0܆cFŇ,Q]ajvňЈڈ%:38Ttlj ;$&6yъ)8FWx~sw{ċۋ)Re{ӌ،،0C_stގ,YĎ@Xt!ݖԖha8ǕݕlVFᔬw`J)ړȓV* Ғ|P7?) ̑cF4鐼fU\ۏkY@&Ўrpf=" ݍˍmgW;̌waO9 ӋocS@8'͊zhYL90  މɉ~odRCA8+/؈ψƈwlg`Me8҇EφlI1\>M]kuÈɈو'783]{Éډ %?$"*5msŊΊۊ/948Nnwҋ(Q{ьތ 3Q]n&;8` 8Xnя2Qwő=VґÑߑȒ[Y` x O@9oՖ8mJ=ݖ3-IŘԗŗ藣s|xƕe:ܕᕞ)vJߔ󕘕•*ӔeL֗R\k, ًsc=<-يЊ|o_H<&ډщljh[MI@3/. ؈Ȉzuxi_=Q4<؇6E8QXakv|Ĉ҈׈ӈ #-/EXfuΉ͉͉׉/C;EextĊ͊+CK7Nhw͋28Efzʌی"*46IrээՍ1aʎ;:jsӐ )ooԐR[dϒܑߒXǓI{maԔ%Pϖ ȕǖniȖޖc!˗ C ИAȗB旨SbY'Jɖؖ;Aŕ~FtE㔟{k ߖƖ閳R~ѓW/)KXߍ7Œ%wwN݊asË$Lk֍`͔hGy/ FMڗƗŗxy2[=֖="{eoPuiS ݖǖ`L!֕q?딳tO>ƓeQ>& ߒ˒l>֑iMB#͐_Z:ΏÏfcDŎuX@8׍eI"یˌÌsmYC,ڋƋqhXI2$֊seTF+ ΉɉsfXRI=85 ވԈȈ|ylaW_+:c$"P=@X`gr}ƈ̈Ԉ02CSjs{ۉщՉى @Xbjd}~{Ԋ7OSQeh̋65K^v{ЌΌ׌!2DKPXm{ٍۍލ*[ڎCG]ّ-lj5ᑧՑC$cv_-)ǖ5*3U͖˖՗IؘCؘlPʗ;3cߘTK̖>nN1dƗ ?'ߔՕ3ؗ#>ߓԓg^#C󉿉̉MA fnduJBٓJ4:6r/A8_:ΖH3Au~ZIEȖ˖֖tE& 핶]9͔Ĕ{yM:ߓpG)ے’{pB,qQ; ӐÐmb0͏}rSA(̎uaA Ѝp\8%،nj~t]X:֋vm\XJ1ҊƊ{q]UF-$ ؉؉ى̉yg]TND9*ވӈȈvqk\kEW5*$ІćsH 0KMP[u|ˈ؈';LYdoƉ׉ۉ +6Hk~Ɗъ؊'CQfg_dn܋&>ELXc{ƌՌnjȌ"7FW`erލJzُ&Q^ʏː"7a <呫 yÒݒߓ0kixiWڔzږ(:@X󖷖ؗ4+UC/(S%WPdÖG@F闌q\Fږ.~[[ckє ː6hmЌ rG ċ fuƉ߉KQ22 ݊ "!_Sʌ)#@+Д\BQxMy${ӗDF5jU[hu> ǖ`Q8!ەL4͔g&ɓyEҒxsV4 Α~R%ΐܐ^@# я|oM7ڎʎylN/ߍɍaBH6ڌҌh_?#ۋ֋zr_VF1 ڊъxdWF3) ݉ىɉl]PE=9) ߈ӈȈvrj^[F]+0܇_H.AJQ^l{ĈΈ݈ '7O\jʼn҉ډ߉8ɕϖGurdߗŗLoo=ї/9vU*El"fEN ݖ*ԕ͒IK @Ëe7{tBkሸ"<6h^$ )-iΉy0Ӊt̊D{‹iXZW},ՒoBړywsՕ}NNyJkYCY}QlC\{q_Q,/ܖ\֕N& ˔L'mD# ْma<摷oO&ݐ~`SF&̏oQF#؎j_J?2эǍƍ|VJH,،xbS@ Ջ‹}mWG8-܊ΊwhP@9,߉ωsbSB<5'" ֈ̈wxjZXVDI4%`M]6G>=J_ksֈڈ(7P[f}ĉӉ؉ 1+$2PlyŊъ-:;OdZϋۋ3LchzЌԌӌ T`q΍#׍͍jYQ8֌ŌZ<.ɋ}n_O@5ӊzlUF>2%щĉvdVE@<-%׈Ɉ{yla[X=d*7ʇ.~ .!:;DI`iwΈ߈ #.6H[lsɉۉ(9OqzΊъ (%:YY{}‹ۋ *:JTpҌ،%,/GUqˍ*?DMM8oې9?Pّ;Β + đّ3'hv]zTzw$xuіI'U ˗ЗΘGӘz՗-ۗW1$gOP 43[Ζ:\ٕ] ŖqY7ǏWp2Œ y-]6".Ӈzd8b|5 -& ܆ӆ!ry$ 9c҉ Ոو!ى/5 E͊zjoj1l3Mԓ:et1٘ ra|8~ve10K2ٕؕo<ǔ[6ғq_$ ɒ`U5͑~fFِc< fQ2# zX?%΍k`H'ߌˌxbH+ Ћq^JG;,ފNJfVI>;-ԉɉ‰sbZRI@," ׈ΈÈtm]W^PD8*tbAJQajňΈۈ '-=KLhyΉۉ/MUfe|ŊĊ />QZiy̋.BJLT}ˌ/ACEE̍ݍߎ $NcUcŎ؏C 6RgZʐǑ ;ْ ͑ zĒ$Z̓ޔ2sb ݕǖHNqWܘ.5vbИ Sy" Baڕ5&@ؖ㗵:`ٍ*s;JF{LވRYL{n,憨E@<4D1'!4QN^n3Kykو'Xqʈxumd<`؉5;p@F5V;ȒE2m A~FyȗΗ痽ڗї]&ٖ^$ Օe<1ݔ_/ޓ“|W@3ҒwH*ᑨuc97Ɛb:, Ǐ~gY0ÎxkN7 yjU2* ɌjQ5% ȋxgTQC.͊oXJA?3ډ͉ykdZNB/,%ڈшňvqe`eX0O"ЈT( .BCYbms|Ȉӈ /8>HWrljωՉ)A[gkΊ֊0>IY^̋;>IIf}͌ !83M]jgɍՍ!)7icgÏ.Bvя!3^ؐ^nԑ֑ؑՑ Tӓ 8uߕ%*[]9ʖܗiܘјIbzoE]M0ȕԕ9WBږ֖@͖Lu ؕf0EXHňw6WaΈqy,}#Y’P~V]AY}g \ Ǘp>0ierC:'qC ʖY2 ҕSJ0єr.ۓuPM2ؒʒd:őwQV"ҐeO?/ ԏȏxmB!َΎ^L0ˍs`B* ݌ɌuVO5 ͋hWOB5!݊ˊzhYH=5 ԉ‰jd^QA,$܈׈Ljuea]PCO**1h%,ANYblqxˆ̈؈&4>IZpʼnlj̉܉"0CN`nyŠҊ!8E?Mpɋ$DIPXf&(Gbr|{$?Lvˎʎ*Mt"+JZ},>őޒRtEpPÔ >oEX KD2V5rϘ+U$"nz=SܕF fΕÕ(KgҕI֎Ōq5OۆƆ9߅1!@+턮FxyhT+Y/ԓjW.*0M3͑đnbDِr\K*ݏ܏ƏyP7ڎkQ7׍}eN2ՌxkRC'ދԋo]M?4֊ՊƊm[G>7 ҉ĉ{pcUH6+ވوʈyqlZMX9B%= ,4NVYgtyňԈڈ'=MN[fĉΉމ+.7FRvyъ (HܖMԕu`5 >򕓕ږ q9>;KԔɕ&Tf4őd:MΉnԈL􅶅wo0̄G.I>2ۃރփ׃ &C[\glh҅#7aJ6PQ· TMNYNf׉l?EJGN𓯓3֒蓛Ŗ&ghϙʚ ܙטݗʖ^J d1 ꔹ]3 ۓfMI<.ܒ’bG&㑿Q8␹rXDmQ+⎿SE6 ͍`T4! ٌˌr[;#ދËrm_P?$ ߊЊɊ{mU>C6! ى̉}ph[J:)ֈ؈|yqeZOEW‡!#/=BI^frwʈ݈%2GP\a|ɉى &".9HPcnÊ !4GXgwƋЋ 3U}wnjŌDKOa{č BKiю׎PҐ '8 >i{Β .>̓ZzғHc6,a}}R,gf \Br;\i.ޘ`jږ$O|<<@\ @ەL֕iUוsx֎(JX`dIچ򆄅L*܄hZ0׃ooncdhe`dsۃ"3Yz0҆(>!zφ'|݈*;^%#$_-|DѐT-ȓ&œa %{ט!sFnݘ^򗨗KX?啪F󔿔m@!ޓvhV+㒿{DaR8'ŐƐqaJ$㏷f? Ύ\PE4ٍȍp_>, ތΌeK5̋kn]F*ΊƊxkP8>9* ډljsi\M>+ و݈Ljxzsfi\TU5&+65>MXejsňш݈'0KQYl|ʼnى0DU]ol &,:L\eċ̋ԋދ/S~׌ڌ#:Sefэ7Ys}я"IÏ܏Ώ4yё/AwhBQʒ2b~MWӕ?O#5nΖrϖ&L~j*B1 0Әȗ4{˕ᕷ8Ô:ҔzДʕȒEhu$F̈Yd70*Gʅ8τuP ̓wh\UH:;zU+OϛIJӗ}閾Jڕ;+tF9ÓJFҒc;ӑÑr`@ԐucE.ȏ~_5Ȏw]E$ Ѝ{jN1όiYA0ҋ}p\L8ڊɊqTD7/$܉щƉrfZPC1# шƈzohdi]YG=$2E?JHaesz̈ވ%/GNYs҉ (NW_no'6IRq‹֋.N]wՌ1|+h@^wԗh-ɕsDS]yNZ 2H6>̊w B^7ꅥ~rRׄZ ȃfMJC8/&&  #%-.99ESf}҄:؅ ]҅օ.*YЇ& LF2/ Ȓ(“d9 ”`vږȘc:_șÚɜMpUؘK뗈5䖭x:ѕrAǔhc5-̓Q7,ᒾZ6yb=!ԐɐdaAďbD& ώrY1 ڍ{iN.׌gYB3؋zeO<8؊Ŋ|dK7/$ މՉʉreXPC2$ وʈ|pqf`VHGc"4>GKW`ayˆΈ7@AZp{̉܉"/]ʈa!rlZ܅`mD^O<0'$   $.23蜲lT뗳G!薬{Q8˔^D!ԓi[7 ϒk>БlV>֐s_A9ۏS1 ׎ĎqJ+ɍ}oP3ʌh_N57ۋ~lR9-ՊŊwmR@/" ׉̉‰tgTM@,"ۈӈ}sqcdRNO@A&/8DHRdeqvÈψ݈/5DSit|ωω+>MZmʊ܊7:Q[gzŋԋ=U[mnj 5NQ؍HQr~֎\ÐgÐӑVI @cѕ(rxі%Zҗ!%l ;'SPW˘b9r4ŕ֕-Fyv5D(ij!T+qnhae燨m7<҃wSG.%  "*7FVa|ބi΅4fN/e=nއ/+܊׌I)4̒֓/r4œ퓱Vٔ==Aٚ%],?ݜ{Ni^lJ-Ԗ00A{VnM)֓zh:^J4ʑ^N* ܐŐb: ΏbD0ގʎ^?,׍zL+ Ҍpn_K4#‹weK3. ϊ~qmVG9*ډΉljsfRG;.#܈̈wsg_VKE4M ,8GOU]amňΈ$2EWixʼn̉׉.77D\hwɊيegUuqsɋ%:PepȌ̌ //hAǕVDXɋ>WnNۆMj&҄A|fYI9&%  &)/8FSqRm4Xw͆VzƈcʉjNbv A)<͓Sc/>8lĚ;՚ƚ^Ǚt_HɖP?.וuR̔XQ'͓g;ԒxUK周y]7ؐ}eJ.n\7 ᎷsY5 xZ6ƌ}mS:ًviWA3! ɊtnXJB0* ډɉȉo[OJA8'܈҈ňsaZeN@8W)2gՑ ?Lo+XΔLBayESeFJ՘]ge`}R+ܕǕÔ̕RE~Cqc:qdžm;6*ωȉ}igXND<1)#؈ʈˆynb^`bEE[,*?HQ]^bpƈӈۈ%/CPY`sΉ߉(;L_`lrي.5Jjp͋ދ2IevΌΌ!J_enč:ECc~ڏ )M͐38^xϐGxΓ G\I 8[ՖZ~ɖlA&9N{oHrȕ*ɕk蕓ەh+ƉN4)DžbلjW=*   &/:?K`{;؆ '0Do܇aE\>Ґyѐjw씟.CU񚳛!Xڛv;{vF嗯|Ke6ווcŔo\FՓV1ڒi6đdT ҐtiE*叼k\-ߎZ81ӍiM;' Œr^M4֋ċoZ?,֊teWEE<1 ՉωxcPB81("ۈ̈ˆzoe^Z_T>R$/@LW\aly{~È͈Ո؈߈&5AR\d{Ή '7CVaho׊ &.I]vƋԋ =S^lnj#,Mh΍׍+Okg~+U@Hv*SZ(Nڒ/p)j?A>yp8_˖IwG2͘՘!RCBԕ7;ؖvTJJɖ"0* xuu9z߄|ÃY@.!    )(+5F]zJ. Ď\ID- ׍ǍwT>+׌vfQ:ՋŋwYL-!݊̊}mbJD<1"ۉɉqbOB::* ӈLjufX]SQE^$*:II\anyuzɈӈ؈߈-BJPdz͉ۉމ/9BNhn{NJϊ֊)Bcv֋-@HP[cwȌ".#Jlэގ Vuv)RpǏ0P{Б Slӑ Sؓ1 ÔޕClrӕL˖CBj̗WTn]oqBXm,ser̒}GƎfRkIʆ9L ÃbB+!   '3CV|ODۅN݆ V胩lC/  !*2򓶓Z/蒮oC ґr0ݐܐmI!ՏhE% ͎{d[?썽`UA(܌Ȍs^K6 ؋ȋx^WL;Ҋwj_M<)ԉ{jVVRF0$߈؈͈|vib\aPAX!28@IZ]ilt}ʈ܈ ".27G`p̉܉܉/-1+݈׈ˆÈzrodS[U=Q!28DMN]jms}ˈ݈ (18D^m}Éԉ߉'9@JSo~ʊۊ "7Q^Vf~΋?YWZŌ،Fmҍ/8A{̎ +c֐E}ɐ Av-`ܒ.x֔ 4;”=jwɕƗ <8 kv— 3֌-vyۆƅՃI3# !$$*6>OpDʅGۅE߇K@̉V7S̐ϑB'ƕǕa*Еi8E jNtϙpB/ژ4RЕq:񔰔eV/3oOSH nFސnTI᏿mL3 ݎŽs_E( ֍bG*#ՌsX@)ʋucXO?/ʊxeK8,щ‰ymaZO@71! Ԉψˈzqk_VaYAW !,4CNRanpt}ˆψ݈ވ$.BAVi}{ډމ*6DLap}Ҋ$3K[^by݋()K`sΌ=Mmw8Ad}ӎЎ(0QWIpؐQ $gړ2o=n~ܔݕzԕO$y&g՗s1ȗ)X͕YYÕԖj͖6 r֖@6ٔU/􋡉@+'aփwB"  %(5FY x}̅ NևB?҉\)?ܑؐy`jW2 *ܕXkF,v>;8 xk*֗җ#Iؕc!ܔe? DՓj)ݒB:ޑn\:ېhW,׏}d<ǎ}jC% ԍoO+ڌʌs_K.ыo`RJ6ӊbP9*" ΉwlbRH5) ҈ɈɈunaZ\PBT '27CMX\joxȈȈψ",DK]hzÉԉى'7EPXlzNJɊȊ݊܊ 0:Z\b}'9Me~ɌȌ+Ois͍,@]َ3NEaBBܐȐԐs6֒Ғ’ȔVHDUl7iИ ̗@ƘASҕ4 }Öe_+tHp0c-Q+ؕM}]jg\ʄnA"  (2=SmM…C5lć.*߉XT摵Eȑ\i+Z”mNwRڙ.`Rm56Ø ؕLǔp8<ɓ> 钙W2zzZ)͐qgA珱sJώdT<$ԍe9"ߌьzXG2ۋ̋mX>,% ؊keR<)щ{pbSK7*ވӈ͈Èwi^beN@G97?RXcl~ΈԈ"/:IWcsʉ؉މ 8CTZbwъNJ̊ۊ ,<\g}Ջ&9BV~،&CPtȍ*6]ˎ؎AOc#UYّ͐Es-fܒCǓTєҕ{Q'ȗ]lF% zL̕=+󕀖ɖt!~nj햓ԗ@hwY7$   )15?EāKt-҉1 Ԏ쑶ϑ)ӊyfVL7- ىɉ~tb[QF:' ψˈ{tkZbW:E $20JWbgnqɈՈ׈߈/8;K[ckx,4 ܉ΉvhbVI:( ΈȈzq^d]?D%68CNZiouLjֈو 0F_izwԊڊ,=Rd֋ 6;POZq̌ $EV\2@\vӎ2Yfۏ )֐4KsǑ̑󒆒vo1:PCb9.fϗ>l) ӗEFɖOGQG8&:.ԕnL$Me6򈥇y߃wF&    !" !$&(*0+'%!'..6&֋ËwpTB1ۊNJe\O>1"ԉyl]QG;/ԈɈqpZ^aLD.;:JU\lüވ܈-=NW`jy|ʼnՉ*>>UqomŠ͊݊ +A_y΋0BNWfь%5Hd& ^XIlҖE9˖ΗV1Pj|!H>>VĒe&O򊥉܄%|T4    !! "#)'*+*&/1-*+.4:?IUgӄ=` 0yeވ%Z]oc-땚94̗뙽>>k65Nɛ9yv[ڗW\Ҕޓ}A}M摿yM*ᐢ}L,㏻[+Ꮊo]3mZ>֌q`L,Ƌs`D:-ފ̊Êx_OI3&߉Ӊ~wkYF<6*"Ո̈}pnel\IH $)3OTcioŠÊ܊$7Ndnϋ&@ELYuČ.Jvэ;f׎ޏUFlА !d_Őِ>đʑ;> NǓ :[TLw6ꖡQ],uǕY0[gK$D=3'X1~aHy6DŽ`=3     " !! #%)%*,*263(&*-268>ELgĄ$KȆ*WOӉf.5בJjɓ <ÕJ񕝕};d ɛ$4S%ƛzl\Yܗb╕$唩KƓYGӒbӑs5Ӑ`=Ǐ{K) ̎[EÍzcC#܌Ō}hP1ȋu_B6+ԊƊykTFC.% ߉ԉwk_NB;' ֈΈ}spkoXF="*6GO^lstzЈو$/@HNgnqʼnȉ߉#/;D[dqʊ )%4K_fҋދ'EFJMx0Ca܍Mb*-[q"Vo`[ӓ?FΓܓWȔҕ[UÖ ȗ`=ӖJhh"ٖؒ?Ĉ}` S4      $###%'$)/)#*.7::1(++-257;?GYa@7Vׇw4Aя?+oڕoݕŖKiOߚ0<PߙؖUƔ`ԓoUҒ~KёO ƐkJ1 ޏc%ώnNƍyZ>2ߌΌ~nK: ΋r_M8/ӊ̊Š}iXJB.!։Éud\T;5.%ڈшň}xn^[PG;  *7HOafouψ߈4:@Qbd{Éȉ (7@YenЊ2DMapҋ݋*0C_ "3Pl}2Q_{я 99w-UNn֑qi >E>5IЕ0v JzvMFq{mRUbZ Aے e񏱌{5@уc:     !!&&&""&(+),0)%+0;><6264333579?BL]B݆>W"v5t`B)[AQ/O*ۛk™ě.D[䙍ÛkRߕr2唋.擿Kǒ{;̑^EM:p:܎L*ʍ_LBԌbPC% ыNjxbOD&׊ɊpZK@/"։‰{j^XG?2%ڈЈƈ||rZQJA8݇):GLVal~~͈؈ވ)8GRej|ʼn݉ 7BYi}͊/JSZnƋڋ @TlxÌ6Kky΍&3Kiݎ*Npď#gϐʑ1^)ؖyϖʖϗZѕɔ6@3B@UiF7$    "'#! "%().*,,-10*)-/4;>==<;5212347:;@Kc ;kl ]^dŏ\/ؑʒܕ֖a853244576!הS ֓a> Ւi)ՑWOېyWJƏPΎbF*썼w^C(njvQ;.ыʋwmR<9"͊taQ=5*ω|pgZJ<4 Ԉʈ|z{h[VC>)9?BMYfyΈވ(3;H`gp~‰Ӊ);ILdxȊ݊ڊ+HM`{zƋ2Ddqʌ/@U]+]wߏ 7̏.WtpؐݑH_ `eѓ6Wܕ0u͖oFhȖ kdsӕd@;pW }7ڐYx†l[vP0      ")22'&&$+-.)+.4,,,30/-4257:@BB;79738:9:8ACKWfЅΆ߉kʌ/ܑ=L<ɑ֒k͖uC/Ö@We'4cϚљj"Ζ&wIvݓѓu?!咫gڑd8א`K d* ⎺nN2ٍ}iP-܌όU:#׋̋}r\G7.ҊɊhWO0(# މ‰um`P@- ؈͈rwdZVD>!1<@EQcuĈƈ׈'->GSfqΉ 6AML`lyŊ݊Ί4EMkzً$8E_oԌ5MRasȍ&^oMk 8u}pƑ$]Б^3)]jݔו/~g֖Wt[~{+JYS)ӕpw2ܑp"q4 cq?+"        $'.-$()&.01+,40./.412054569?@A<>A;6:9459BAEJQ^Ʉ?Άqg "Ѝ 3IFВ.ꖔ~*Wȗ9dəܚ͛ښ*-ZXS<֕hϔ~RP ɒb͑̑yEɐwX2Տb< 䎽o\AȍhQ?.یՌ\@1֋tcXA"Պ̊|n]J@,& ۉqncRB.  ߈ՈӈƈqvcWL;=܇*8CJTbk}ˈՈ !2?NVdw̉38LVbpwȊ֊*CQ[q~ˋۋ #,:Npڍ*NUYuō.`yExM[ KgݒFto@?Փ˔q p^v!djHYj֕񕆕KX%W.b^Ē'$DÇhnԃT(           #&),,+))),23..024667553362899:=>@AA=9224;@ACBIUoڄEp+܋ߌ퐡"GjjZHTknʗ3;7ɚٚYOәpvߘav( t^哴L蒚pDɑ8!쐽fR㏷uR1ގeD0ՍvW6*،ɌeI3 ܋raW:# ъxdSB0!ωtibRE6! ۈӈ͈}|pbLC=݇  +:EIS`h{ˆֈ *2@I\kuɉډ 8BOgqwъ.>[dgċۋ#Wbό,ZZ`| 9\Ž(WސOr WgU$+r(rԔ 𕄕}-@)p˗Օ{bKF>ܕɖ+іɖHɓxRL%2GYA ܃M4      !"&(*+,.+++-3411139:987665959988<>@@@>939;=?@A?EQex݄Om׍d>ߐT V3;3rJM$5˖{r՗%bu`0 u̚hڔsLؓi蒲8ΑC"Րu]-ŏuI/玵pO& Ǎ~]9+ڌʌtZA(ċtdX;*ڊÊvcWH9)ӉljvibRD7# ֈʈňxtvlMDA%.:GN_l{ψ%4BL\qɉډ0@J^v܊3KPe݋$CVzŒ 2NTڍ4o3Gۏ&WZՑ a˒9В<{9 8U tĖ 𕭕g@Z`"ٕ!G4Gǐf@P2!     "! !$(*+./0..,/576551@=;995:<>>;:9;=>:98756=??@?ACIR\izk6nRr7[eޏɐDߑCZ. ~BIט} R7bp+隖,s9K8Ε^D Q)쓑\ ΒRϑxF0ߐFA$ҏT@掼qh>ߍȍ{c8$ΌzeG)݋ʋ~zjR=-ފʊxj_F9. Չʉ‰wnaKC5,وшƈsmooUB;"01@R]lyՈ $1=FTfw։ "2>az{ˊϊ $2FLcЋ3FZsČ(M^hčȍݎ@aĎ5eȏ֐A5Ґܑ0/jٓ+gV({|(Etʗ O۔畖{a6kKyD$ъ/;"`@$      #$ #(+--/121100137:8?B><:96>ACC><;<==8768 !+4;J\juňӈ !2DHLRoqΉՉ #1;Uoي6DSfzҋ(DdЌ9NQoύێRf׎9gɏbÑV GؒvsՓE<$͑0ą(eE%      !&$$)/202664451689;??@=9879BFJI@B<;==;:79@BC?CEAADEFHHQc}*ؑ WX d?e؜ez7ۚCڙŚՙ!k{.͕7̔McM8 ߒƒzݑˑg?␽YK=gc5⎪uT, ̍`8% ֌qV: ֋̋zbWH7#ފЊ~vl]L8/Չɉ}l]LD:-׈ʈurdVFE= (5IJ[gr}ˆ͈܈%8>KMO_w‰ʉЉ׉&5=QcrҊ :DO[a~"*SwȌ)XbrȍJRsRSxϏ"6ʒhz}@̕,cTȕLSR界•N" *pΔΓ0EÓG8݈͆O\ŃnC)    ! ""('! "*/131157666268:<<;99;<:=DHKJF?CA><88'n80ƒ.̑gM&ΐd]1 ԏuVR玮}iS5͍lZ2݌ҌsYB)Ëm^H5 ۊ͊ŊzvkZM9.Ӊm\ME6(ԈȈjraKH6'6BEXfq}ƈو 0@RYU[sʼn %6H_hxɊ#AHMPPNNQNG>?<559>FKNYdzۆQK`~4ۓN Xsu{G æ*j'oٚ)eo$zޙs(o0薼Ǖ3ޔӔb ᓨz;ܒt.u8"ĐO6> ȏ\<ȎxM3 ͍G.K!ƌwWJ%֋lF;ΊycKSB/"ӉpaRC7)وшÈ{ql[K8.҇ !2;=JS_qyΈՈ 3AI[gszɉ։ 8Pad{|ŠԊӊ0GESr|݋5Kmy،ތ1Jg|;_xޏHP 'YGڒOrsѓEEԔMcȕ%0gkzŕĖ$d2MMQ וiĕ  `֋v_!b=,   !$""$%%'*,,17@E<24334677668:>@BCCFLNLKHGFEDDEFFHNTQKMKLJIFB>77=AIGJPXk܄dTψvϊǙK(-e,ה!ڛnFךИ85*ܙtљ<iH kH _)ꔍ ;!’K ʑaF~GG̏VE׎{W5ԍƍ4`jH1͌`A.ߋƋqWF9$ߊȊrbUN@(!ΉndWF/#܈ˈyil_I;1Շ (-5@EQ]i{ˈ݈.4DXhu|ى )6KX^tƊ؊ 0AM]t}ы3AV_xь*>P>hHm@K7F;44g8FkŖuc|JUo7`L]Zv/{d#qH2؍և<|\ÃxN6  #$#"$%%'+-.15=?3155789998:<>ABEFEHNPMLJLONHGGHMNMQLGNOMLLH>ȖK00_q+@ĔW`7Y9Ւt򑶑 Ӌ]]D4" !$$ $$$%%'*-1.288,/17;>@A;:@BDCCEFEGMNIJOURPNLIJSTNLKLNUPSOFCCHIGEA@CKVco&I] o疉b\1wSȝh /BÙ#_-Ɨ/ ~/ٔIΓb9ВWđXGԐJ+ˏ{V!ŽuQ<΍kJ:׌iY>%ʋmcP3 ׊Ɗ~fZ90ӉʉÉreVK2%׈͈ňtc_XK;-և݇ '38BMX_pĈӈ6>AHR[_o݄N$h&Ǖ]֒| YU<+ڙ /gߚ_vk嗩w)uJ4Õg,ⓖ}N gΑY0Ɛc2$ЏWʎdO̍lI:Ќl\<#ˋzhP3؊ɊhVJ1#̉ȉrdSG1%׈ˈÈo[ZYM:$Їׇ ",4>HR^jzˆ҈߈5BNT`mÉΉ 0=Q_jyՊ!'Ddtы5UguŌÌ 9GZ|ƍލ 8]"BkŏԐ2eې0| =w~'ߔ-–~U떹 J&R-oɕǕŔS? ݈M^ՃV;.$!  #))'&&&%&*.36<=5358;>@CFGDGQLKIFEEGJMLOUXSWSQKQUWMQTUSNRSTRNMLJEC>>>AMJSjmǐ? OMHYaoӊ݊ )>\s΋ 7@^sŌی܌5;\Ѝ'L!W6lsђeVhZ@eXU##yE:O0s~ g XJ0<<9;=@BEHIHIOLOMHGGHJNRVY[VYUSNTWXS\dbVJLP\^TOLIEB>?CEEJMao R`UmСgǑ}ՑmҩD=Ϝ^-V_Zš79䘵`嗤ݗezWOJД!Ó]ޒIّc? 琨x1#ُ{G؎gK,؍~jL+̌tU=*ËnK/'NJ~p_NJ=)ۉʼnɉmaM7'" ͈}s[T^W=)Շ '28?BOXcpv~ʈֈ߈ (I[bjjx͉׉7OP[evĊъ4Ocsɋߋ7@[}ԌЌ 4]}Ў>Yuُ:G{Ԑ!L we9$lor Ei(P}y*Ε-@tAwޖT鏁Î%7섁Ӄ]F40,%  !##" " !!""#&(++'&()*-253;<>??;;<@GJHIILRYSPMKJELNQVYa^XXQTUYVT`ibVKKXabYOMHG@CCCDGKS[fpĄBu_kI@Ԓߐ‘,ⓑטJ򟋧 }mӚ?˜x,嗷|Inz(듘Yݒ_!vX\'ُYڎr[;؍~gI4ʌ~`C) ̋fP@/ ߊNJyiYB4 ۉʼnyh]J9% ҈Lj{q[TV^B(Ӈ߇߇ (239>OVlorȈ׈܈ $8J_jjtˉ 5OWYn~̊׊5U\r~Nj39W|܍>Pq64Xw%Rw Uΐ őP`5.n^=b+[zHs앩HVtѕ[ {R[-?%EU'ČV#eI7,+)%!    #$$#! $!"#%%')*++((*+,/488>8:=>=@EILMJLMPRZTSRQOTONMSajc[X][[]YYbb[WQS^]\YOLIJB?@DFHKLQ\cqym<;꜋"ΒW#̗@V3R"m2r!󗚗Jmb啕 2򓮓j 뒟vNϑr?אY@ ҏe(ĎpUD"܍kC/ތɌdL0Ћŋ|bOE4! ͊uaR@6%ۉlj‰taUG:% ݈׈шvbUQZB(χЇه$-79AOR`ww|Ɉ܈߈ +DO\kqljщ߉  5JTRg׊݊*B\m2&5Y׌-:Ho5=Pzݎ+`z4gȑR6^aƕoەnhhMWLDFcLJT̕ BIX񓾑[TEm ʄoʃWC3)#"   #$""#"!!#%$$&'%++-+**+-.,/39@C8[h{ۋ+&?ѕXݖFZra֖eėk^{ޕΖ-ꕎۓҐetӏɅ cL;/+%   !$%##%$"# %%%&(*'--.,,./01/27>FG@FGHEGMPRTSUYXRQTX^_]USRUZcfbjmngpgc_ZUU\]YVVTRKJPOOEJJJGMHPRUkۄ8͊n_HCz_|RțMTt=Ӝ1~ٞΠ9?p{HۗӘ=䗕TaٔdΓr6ڒ}4ؑv7 ̐H㏸m5ɎR6؍nTD+،Œ}dG%ԋ΋s^H2يƊtbRC1 Ήlj}tcWC;*ՈɈzk`RGF6 Ňχه'.7;KXZhq|ɈԈ&6k͖R|sƕ>ӖT'Î)ӏ։ggM;2*#    !#$'*+,+'&''("%&')-/.-/0369978;?ENPHJS]XLNORY\\[WX\^_]WTTTSXbfdaemmmjfccfdcZ[YUSPQUXYY[YVRMLPLOPVZV[j!T;Ք2ߖQ—IZޢǜ_›ў(؞Vɚ@SCݗїeh4{┏[~Bג}B摠JҐ}N#ݏϏsK!Î[;ՍdL# ӌdI-̋{gP; ӊÊzj^B. ԉʼn{iR_:1)Ո͈wqeTJB9 ̇Ӈއ ,;;DZP_ouɈԈ #:GW`nƉЉ؉ /;J`g|ˊ؊1:Xn̋!0EeҌ?qʍ-H}_\nڐC>9;BGJRNIITc_USWTZ]^^X[ZZ\\[SQRUaimfkjspnngclsk^\_d_\VUWZ]__^_WNJJKTUPPMYiy].fƈBV"yBOři̟S›uNqrkK$םCwЙ|(~>에]ԕ򔟔NgKŒy@둸MѐAˏxH'ΎkI0ЍvK+ ٌt[8%΋v`U8 ڊueTF,ՉÉ{mZM>,$܈ш{wnYL@8+̇҇؇܇ (/=HS\cfq|ʈԈ"8IRYi}É̉ى'bEZۖLȔd&Ó=ҒvB葳U/ϐlF#ȏwH&ɎyS7ҍkZ1ތʌya>) Njub^=!֊ЊtaRF-ՉÉ{l[J?-# ֈʈtpjXDS<.͇Ӈۇ )25=JUbfpyLjӈ܈/DPYnɉΉډ.k6ѕӕ– W HHGnKŃXB5,*(('&$!!!"!!!" !')*(  "$$%%',)000+-.234-2,(36446:=@CCC?BJMOPSQLOY\[]^^a[ZX[Y_bee_^bdgcbhwyssrpmhikopieaa_^^\bb[]YTLNUXXRPMKKR_lx„Ն1L3kݓqƗwyiF*A圬SؠƞzȜ ;7`Ym2F×q3ȕДYӓTʒt9K+v9pO4Վ}f3͍}lS( ЌraD%ыxg[;'׊͊oeWH3 ى̉|bYLC9& ވӈň|th[CC>3ˇӇԇ!(2;HH[^frňшڈ 3IT`pÉƉԉ#)4BR`xȊ׊+2܊ъn\ND7! ۉˉj]PB9% ՈĈxmfYB>4(‡ȇՇև݇  %1@ILXajt|ÈΈۈ(8HJgv}‰ĉ؉'1@LVl{ŊԊ$&930.,'&)*,,,)%$"))($""##"!!"! !&*,31-0789/44442026A@=AB==AEKPUX\^\aba_Z\]_\iic[\eomjijiggmpoptwv{xniggmplgqpjcnmmjgb^W\`a_XUZ[SKHIOOSW[ly5.$Ցϐ+DrϔW!0@b2қ[BG+7ܘOؗL3ꖻ얺Lٔ`&ѓRÒ~6葽\/ސN3⏸e?{a> ߍˍeS6!׌oT@؋Ë{eTC)֊Ŋr`O>7#ۉƉteUP;.#߈ވɈvicNB=4(͇Շ݇"4:LQY_`k݈̈ 1AM`u|ljӉ *7CPZdϊيߊ1CEav܋ "7NZy CbȍԎ,]xPg'RmՑPvu=ו|6֕ޖiZNҕ%oʖy 8l9 L%fMF=:61//-*(%&-//-('$**++*(('&$$$$!!),)0412;>>37665526B?D@??@ADHMSZ^ab`ea`a]`bdbnmfbkssnlkmmlmqqlmrutzypgc`gpnksniijopmjc`]bcb]V\UYROLHOQTVVajwD B0`Mc՗˘H"ќ W&<T @˛`:ę40a.#QǔqY ˒Oo-ՐWGՏ}cA$ʎ|bE!֍m[2ߌȌfaD ܋ŋiO?(֊ŠvgV?4 Չ~pbNI6(݈ۈLjreM=62'‡ɇӇ'0;DMX]br͈ /?P[o|ʼnى܉-FۓR#ӒT Y3 ϐV#ڏ_E+֎aL)̍aQ2$܌ˌoR=& ݋ƋvdY;&؊vj[L2ԉo\WI. ڈшĈ}|k]@:># ȇ҇)4@N\anr|ƈ܈+9CMhx͉Љ!0?MZlÊڊ %0MQdu׋ߋ;_k͌,Sziҍ s~|%“0- (˖Xv/ܕ˖:BL-9_0}Ö/ːݎ`֎@aVIǃaNB;97:7*(./-,+,121/*(,./1541.*('')( $$"! !""!%-256:89BIE@=?>;;=?EBFFEFJMOQOT^abb^fknopmnowvrvuqliikmnszunrrtuxmfejlpjin}iedgqsolgeedeee]ZUPONMFKNQT[_gl_#Kō荖a ͖U r%읿ޙ Rl.IhAŔXp-ْbّ]7 ېN#ݏrO3 厺lU5ʍgS7)ьpQ=* ދƋsdOF"؊vjXB% ։É|nZQB3% ӈÈuvha[B9,%̇·؇ "-8CM[UeuɈ܈ &4;RbowʉՉ܉+7?Qjي%?[dċϋ)6Vo1Rg|ȍIM3Gk)L|咭ΖNr6c–ƖǕ>J;-ٕ#tUᓈehzWrۄ vcVI?:88:3,.4831/1-330),-2301651.,*('**+**(%"  "#$$'+7=A><8DCA@CEDFJLIJLPSUR]hkf`]hlontqroquwwvqimtrot~urz}xzsjjktuqpmxxob`ev|voehddadf\WNQPJMFIMST]`cdm݆0V$pqː!ahw_˜SܚV.s]x[ΗrϖږWޔn󓾓i1㒪h#g3ԐU# ŏa?yT5 ʍ{i;;ЌjQ>- ދċvhXC,ՊuYR:#݉̉~l]MA7) ՈˆvybYSE4*͇҇ه߇  (29634/664-./34233342/-))/021*(*(%#" !#%'&)-8;>:::EHHHIJLMOOPRZTRRTWY]aejnnqtvrrry{wz{}}zqs|vtrrwvurhefgkijtw|wi``^][Z_WPPWXXQPUSUSay`Hzꉲ\%y&hW{їwk^t6ᖫ;И:5Ȗ\@ ۔cKw+ܑAߐY.яnZ5ƎwX,֍pP6!֌o_G(؋s_J>/ ֊ĊrcC5 ׉ljzk\N7- ߈ֈЈň|tmaTKF6- ʇ̇·ׇ݇$39>O[do{Ј '0CUZesz̉߉%6CR_mrNJՊ E\r~͋(SSkyڍ WkvǍ,@cԎڏ<65651113>A96642.&$%%"""""!#$$%#%,.+,038;=@EBGIKMLNQSTUVX_ZYYZ\^bimoqrv{}}}x}||w{|{rqxxtpkhijikrq|xkefcb_`e]WRUSOGGOW\U`uͅކÈމdZp'*>ݖuԘԚw☍,9K8Θ͘TDӖI֕j˓KĒvH푲NĐg:ȏo[: ɎU0፽w_N2،gS= ދNjzbG<"ߊъÊ{mV5.ډljzj[R9+߈ֈЈň|of^PEB2"Ç̇҇և܇ $3@Uafuƈʈ߈',DQ\akwÉ͉ )BTdqrÊ׊(H_u}Ӌދ>je}ߌ#_ďhCE}!ݔƔt4<Ȗ|˖ꖁBSʖ4?ɕq| e5J{ ڑ'9 PduaQHDGGFB:8:=?CIPOF=::@CB<:9:>@@?<:77::64CJC;8;85.+*(''%%(#'(''&(/1/026:@EMIKJLQSQRVXY[]_acdcaceip{}yzwz{z|xxxz{zxusllsy}~wliiqytlggrngTQLLLMNQROWeykUV󇭈Ȑ$(z-~H|sOU]rݙ R cz7򖜖n喻ÓbU ֒UCԐnD)Ϗq`7ݎʎb2Ǎ`H&ӌplR;ՋyaC:"يNJtiR7#ӉĉxgXQ8, ׈Ȉzf]WJ?8, ćˇч܇҇ !'2@Tagwʈ̈!$[– Ɩ]~#pJC7\'.BG2"őS*-yփdYNHDAAED?=<>AEJRVOECCHHFBABCBBA@??<<<>B@HNJA<@B@72/,+*((+'*+++*,242359)ΊĊ}qgO7&ӉÉteVJ3* ߈ӈň}xd]WG<3% ʇLJLJЇ·݇ ",5x<9);x2#}c[SQLDA>=?>99?CEGGMOHEFGHIHEDCA==>D?ADFHIMNMECBBAD<61.-**,--./0125657;>@FOYVSZZXZZa_aehkkhjnqurr}y~wz||xvnimsx~~zrc\]]]ZWTSGHKEEEJOZq󄂅CՆ, ُB%@cחw>Ŕ2 ŚQ{ߗc%`M,蓫t/풺0ˑh5򐮐NϏJ>ЎaC!эo@*͌hI0ҋ}fE6-ۊƊtcN6$؉laTJ:*܈ňˆwi[QG?.ɇ͇͇̇އ (2BHVktLj҈ڈ %2KHWlvщ1=Odq|Ċߊ6SuvË %J}ˌ.Ad{ЍKqގ9N 8qԑ*֑Ւ8k̓-}f󖔖NWb`iTIЕc?lE2/am0twĄʃkWVQOLHFEB968;DFDCGCDJIIHIOPIFFD?@@HLOTVQOMMVOHDEEJC=70-./02234567899;?BDJS]]Zadhidifhlnprpqux~{{xuxyuzxsihmklqplh^]b`ZWQNPEFJEDCEGOa)مpS)揉jđs?\pSI3Nkėk\4񖿖ږ ǔ5 q6ʒYՑh1鐵XuA#؎c?3׍]O&،_B3'ԋ|eJ7! ߊNJubT>,ډʼnj^QI: ̈̈Ĉ~reSHA>0ć·ԇև!,7CMZau~ƈֈ(3;CYmʼnى'56DStʊ݊3\lȋ,Nd͌ *Ib}ʍ5tߎ"Ll!_ۑFגTSdA:>yv\? zPn\ږK/ĕ%ʑxDY{@t-ӃbSKFFE@BHGC;;<@=BFKNLLOKJLS\\SIEDCDGMMW_\USQVNKIHGIGEB>5226879:;;<<=>@BEHNW^gfemxvrrqquqrx{y}{xtll{zqilnf_afdc^bd[QRPNFBFHKJEDCK^p򄗅jQ3эߏ׎K+1MƓMɖʖ:;M ]=6g#*ėz,C3p4쓮Rؒ`ǑRǐWӏiCݎkM*ˍ[C%ҌoM8(ы{cN3#Ȋx`V>+׉Él[MJ;$ шÈug[SH83,ćɇЇԇهևڇ*=?M[k}~ˆو &,0EQhƉӉ.;7CUpNJ؊8SkċӋ-Pxʌڌ-Kh}ō@^̎"<ȏ2b@>œ]䔓Dۖ9ϗZΗL2\ؕWޕ}&敠D7w)C@t[OGA<<>AGHHBCCC=CGKQ[\YOGHQ_jcTNPROLLIOWXV^]YNGEJKLKFDLD:8=??@?@?@@ACEFJMS\bmmlw}{|{~z{|vrrpzqklqoghmie__YOJMNMGFEFNMC@+ՉÉn\MC5$ ͈q[OND2-* ‡ć·ԇ؇؇ &1=J^lvʈۈ '2@IZqÉ̉܉ "9CGTrҊ1Wqԋ#2Wm4RvtčCdю=@׏0h\Zʓ#aK"OƗ';$W4{1 L92]M`p4'vZKA<>===??>?BDGCHJKMRTXPJHIO]_XPUdcWMJMQUWWWZPIGKMONOJROCABJLJCBAACFGJLPT[djoovy{uyyxss{zjotrh`YRNRRQHCFEEB@;=DLZe~1녨|efJ'Sۑۑ8#“w0]uї#Ԗh򔈔哢S2’r[(ᑹd*ᐦt6Ǐe=ʎfX7ٍcT5ҌoG3ߋڋrV=.# ݊ÊqXLA/߉ԉĉq_PB8$Ոňs]PG>3,- ʇ͇Ӈԇ߇ !9IRXjq̈Ո*7HPXjȉ҉+?PXrŊ!2To‹ً7Hfތ4Skʍ&`rˎ>>>>?>@IHJLLMNNNKPRSVY\\UZkodYUSSYZSQSLLLOQTTTNSRKJQLSRKIHHIKMPSW\bjort|x}zusliqlhgkj`WRTVZWPD>@?=9759ENV_{lކ2$qxf?OԑxNӓuY67|Xӗd]-󓥓2Β_n$ΐpJumJˎoV4ǍuG%ԌpcB1֋z^=-"ۊpVD8$߉҉saRB8&܈׈{}pWI?5*! LJ͇χ؇'7IO[nuʈԈ "3=P_ivÉۉ(AN_qȊ7AZ|؋1Ab}Ɍ J^ڎ$Ipݎ5E tݑ2%rǓEzؔ5ڕuΖSՖ2̗'ݖ57͕/ЕKa͏!4C؅ބj̃gXRLG@>BBAAD@ACJKKMORRSTTTPRWegaYW`aicbb^_db`ZUSSVYY`c`XUTUYTSXWVSRQRUX\`ekptuzzsqheknikkkge\ZXYUJC@=;69;>BEOOVkׄoE)ވ&ŽTW)ސґ# ՑLplؕ&[ܘ,2^.㖐Wb^ Cp/֑k5qCЏZ>ƎlI(܍jǦzXG0׋{rYD0!݊n\G6"͉ʼn|sbTJ;(шÈxhYME8%,!LJ͇Ї܇އ)6ISau|Ȉ҈,2;N^h}ĉ؉ '@Ofx׊*F`w؋.Tlό/Lič 5UŽ,UȏӑRC9Z:ЕwJ OїGj˕ޕU@COZ|‘m"ꇹL,lXSOJB@EGGFB=DGMONNKMRSSUXTVYdf_\cikfcdnkkfnnkg][\^]fnnd`ZZa\Y^_`a`ZY]`dhmruy{ƒƃƒʃăyrpnngfjkhiimnkb_YPJBAEFG@??@BCLKPa}<0yߍ0m&ЏďœIdՔ>|Ubϖ'畉P t?cN h5Ð5ݏV<Ȏg@ ٍčlFیr[L(ًt[F.ڊ}n]C0&щ|rcTE4' ߈ψˆsd[PD6"#ʇχև܇ '5AIXpň҈$(09AThrȉщ->Payъ %;Woҋ$B_Ռ.Lp̍$Mzώ3OnҐ 0m4[ܓ M7򕌕ŖƖܗd7+yDa/tO•j.BY򎚐z"; ~hZWPKE?HPQPGFJOXYROLLMNOS[\^XYXVZbntmcbirpponpnlh]b_bgjkkgfedcddejia`cgnrtwz}ƃăǃǃǃăÃÃƃ̃ȃŃ˃ȃǃʃȃ̓ɃăŃσʃwojjnpgcacefghpolc\NOLMNRPE?;<>;<<<@KJQj u/HA펨ގݏב7414),+s4"ȖU蕹i󔙔3דT)ݒrCwH/鐜v< 史P6 ׎nJ, ލrN( Ìx^G" ϋwaX?&ΊwiZE9%ډщm`QB0وˈ}h\K@:. ɇч؇߇".3@NbkzԈވ)6CP\iuÉ͉ۉ  .?[oҊ!>VcpЋ.IYxˌ'GfՍ"At͎dǐUʑNqyדGǔqHykgaKL[YiەBZGg~ܐ$8w߄rσj]TOQJDGSY[XSJMLLOUXTV]^[\]eghed`bkorstv}qqx|}rnomnpsuzqlwywwtory|̃׃ڃ݃؃؃ۃރ݃؃Ճσރ׃ԃ̓Ãȃʃǃ{}{ursqee]``\\aadhf^XTQQGA>><9>@:34?AE[քsFąᆯp gT*Hso̒4ɖtҖ1Օg,򔘔JؓOo<|l;;p;я}WB1ގzJ%ލmR( ͌i]@# ًymS;&Ҋvd[K4!Ӊ͉ÉqlZK;*׈Ȉ{lVOA0# ʇ҇ڇ  +9GPbo~ˈֈۈ*AAM]k~ÉɉՉ /CYuϊ׊:885:<5-,14;No2ӆyƌt[%΍(Npbfᒧhg<0WΖǖߖ#ϕ֔/ēB4ߒp5쑩~pW(p@另yZB#ڎ|R- ˍlL%ӌeB#ۋŋzfNC0͊{g_O6 ԉˉ}w^UF7&ވψ|jSPC3$ ćɇ҇ڇ$.6BT^m}LjՈو +9@QTo~щ%-CSlЊ6OhzË׋:OYzΌڍ)Vw 6eَ5hϐ6oБDԒ"Eғ UƔ -L9dP5T-7+ GFNEΒ֑W mXOMLLJKKJMQ[^^XVVX\]__^bnrprtsnlknuy{ytsxȃԃ߃    ҃Ӄ̃ƃǃăÃ{{vke]eo}vbbcYVZYURRNHB=::81//,%%).6?W j1^G=Č \܎xYr\ԓ/ \^ו)9ǓF䒩^ɑz$ܐ~H#Ə^E%ˎmD!ߍcTE1ΌuaG+NjfN;(ъj`F+؉ɉqaPC8& ۈԈÈtiYC65!Ƈˇԇۇއ &/7BU\m}LjԈڈ 13GM\lщ 0E^cÊ݊'1IgՋ(M[ds݌:d,Ovώ2}&MuǑ"r!ZƓ!XՔ \Ζח@auV-"ߕaVG֕_y~T׉uiWOSQKHGECFISX\Y[`a__bdcfkotvwvupgegm~}~~}̃҃ڃ#-*4+$  ؃Ճ݃փуȃƃ̓Ƀǃ~~wga^emk^VWZSTYXRLB>?><941+''$"')/Hvل~9}Qt:A~sڎ[Oǒc_:֒Ǖ)q|JB˖?ӕAS 쓤d3#Ēm'@I)ԏ^?Ǝ{wK&Ս`L:-Ō|aC͋Ƌ|gS;'Ίr^T@)މωzp`J:- ݈͈|n^P>22ވɇ҇؇߇ $+.8DTbm{Èш܈߈,?GUdt։ "9D]xĊ׊4Iar؋->YpuΌ A_~Ύ#AN׏-NݐK͐([e j@ĕx–CחXߕr9D ;Ci_ ܈턅烚veXVQLGDEJLLPVXTXehbabkptxwporu|yxy||~|ŃɃȃʃۃ )+)*/1.5EE7%!*%$(%$݃Ճ݃ڃԃуƃƒzyvqebgigdXRSKLLMMPK>963.)%" % &->f]$z_4yWA pgOᓣՖՙ*TjFĐR1쏷yV-͎nH ΍tI8$Ό~[<ыrU>(̊\P9'Љp`Q;& ݈ɈulgX@1,ŇȇчӇڇ ,0:DTWl|ˆψۈވ(1CTftÉ؉4DK`s͊/KZw؋'2>ZʌCjЎ ,F]4Bu"H{ӑ@|ԒU͓ ד7Iw~5ܖޖie5VjD?OqPHE򎀏9pSSƒkbXVPEADFKMMOUX[\_aacclpvwuwyă̓ƃƒǃǃ΃6CDDDCHOPPI@4;8006=. ߃ۃՃ҃ăustpdaghgaQLJQVRF?9684,(#&4W8r׊ ً*r6PSe]fZۑВcPRR1ٕTᔩV/2ޓ{˒:q: ېa;|Sˎs?̍lWA(ތ̌wX;ًpjA'NJvWK=,ډʉzpaQ:# ܈ˈ|qg]Q?0" ݈LJчׇ#*16@QXh}ˆшԈވ +:HUeoʉډ"-@Lfvӊ 8K`xҋ /FZoʌNrՎ-DgЏ0?n"JvƑAtdܓrfaޖeE'VؔؔNOŕǔC1쐥ԐkC2 o8w[SKMJCCHJLNPSWY\VQRV`cgdkzyuopwŃɃӃڃЃԃۃ˃ʃփԃӃ܃؃؃׃܃&5Mc^WX[fpli]SMBp'ƕߕm픳omNyŒpP瑿q7,ݐkD ܏uƎd:ōoR8یÌpY8ӋuhVF+ЊmU<,ۉ̉}paO<(ՈȈxi_UR?2"̇Ӈ%,5=FQZj|ˆˈڈ,=S`^p̉Љ؉ /:Te؊%:Okҋ +Fcxˌ!Xq؎Mlۏ'=UeY 2iTΓju(ڕݖR-ҖܕĔrŔ?,ǒ%|l/ v3(uZPJLJEEIKLORUXZ]WTUZedd`dlwyysro|ƒǃу̃ʃ܃߃΃˃ك %7;Ng~}xtoz}qocZbc[IDHI:-! ߃у׃܃˃ƒxjacosohivsc\[YYOI?Ï~KԎd1 эx\C"ٌnZ8Ջ‹zgR?"Ҋ|lZ@0ۉˉo]L:& шrg\JI9.!وŇׇ̇ #3;dQKqASiE <_s͔ΔДAYݓe̐}ӊ(q[SSRROMJJLOTX[[YXWX\d__\^gnv{}~~|vuw{ŃڃЃă̓ۃ݃Ѓ؃ 8N\Yg~mfXojSB9݃ȃÃ|qc]_bWTRRTSKJOMIC;/0-,"%/3+$$  #8rބNȍTc04.!Aw:J;^sԓ2ƖǖmL͕TՔєʔ|Óa ŒN 摸m8ݐlR8叿UʎeAʍ`;όoU6'ԋ‹~lS3ъiYD2҉ĉumVJ3 ֈuh[GH<0 ڈȇχه  /5>DIUiz}Έ܈1GN\_h|ɉ܉$9@Mpފ);Rgz΋6Qbь9S~ )KsʎIkː+Gˑ>J%P}ΕG&`єƔʔ+ xē3sw%HY󃠃r]STRQONKJMOTWZ\[\\\[acd_`hoxqlhku΃ۃփʃ҃Ѓ  $ #5OhyʄĄфɄĄojxlQP; Ѓpd[WVWMMPRURKF@;830''" %$  *_Ä{C߈ɍA] Nō1BV6nsv㖟(i0O>ܔGW őrP吶hB⏯W厦uO֍^Cߌs_B,ՋkQ3 ݊Ȋq[G2ΉreKD0!ۈˈym^HC:. ۇΈʇԇه!+1@FQYk|Ɉ܈ 4GR\_lЉӉ!3KSs.=Reyϋ3ZhьAZyˍ LhǎEgϏ9XÑ)sΒ8UgC89&hʔp*ws=烡zdTPPGBHMJNPPRR[cfcdekuwmozyxnkjitɃԃ܃̓̓փ +40-9Njt!ڄ΄Մބ݄Ȅv_N9 ҃rhjnmbXQMLHHPQRH@:521/*%   'X^5ʆGԋan7HAގOxT{LZ}ז=%KЕR7Rra4^N qA㐼i5ȏiC+ӎd2ύkO=܌}dE(؋‹xgP. vaO2߉ωseH=, ڈ̈Ĉ~iYN:5$ وˇׇ"+/?HUcstȈ܈")5J_jkwЉщ(9OVpNJߊ8GO`|͋+Oq}Ɍ;VtǍݍ$GqƎFxԏ7\֑$BP)Xݓ,W o c"PhꔷkÔsy~hK|iʎkw\RWʃs_OLMGFMOLPQPRS]eiefikorpqs{}|xvu}}}~zỹ؃σكՃăƒÃ̃؃.&ACE[Ӆ 0*?=;20-*'#  #QT6І#Ҍ΋ً>b?BlƎ֑{8{#ޘė<*I(J:הsu3b;ÑtH ϐkG"ُyX.펴v9ʍgL0ʌZ>,ڋNjwdM/#يΊtXF*݉ΉvbF7'ڈˈňd`UN97& ه߇ڈχՇ"*05DWbo{ΈՈ%5OZhvlj։ &>K]{Ɗߊ/CNmwϋ6JmՌ DbЍ ElЎ Ge[ɑ@]4gғ(;ܔme!QĖRڔv{y`i]锭͐aӎԋ KƒnZQOJHIKOQUWUX^eijgfjefirwyzuron{ǃ݃ۃڃރރɃ˃؃ 85--2-.0-($!   H:fzal(: QF[uO NgF*ޖjוjWXvܓSŒKґK< 𐿐TY7󏵏^H"ߎAʍsT.ތ͌sYE2ߋ[E8&ˊhTE-͉݉~kZF1 ΈĈt^ZP=2& ۇۇڈʇڇ݇ "*,;KRamɈو#4N^lnĉ׉.8K`q2Rjyϋ5C_܌;fՍ-OE܏#4\Ώ$Wˑ 2I֒as :5{pt 8RޔwRP”{ޔ\Ȕ֓@wz`+b@jXXXMKLMQSSTRU^`_``biipw}{vɃ؃̃ʃكڃԃփ "+O`V\ƅ #FcZWyąх`MN̈́wfUHP?"ރ΃΃ƒyuroigfhbXRMOH;641-%%+))'%   <pKoߌC4:׍C\BǓ֘ Ö~ᕯ\P8ΕӔ=~D𑬑WKE"͐d>4 Ǐf* 쎵R ݍoO2ތȌyT>"݋NjcI;&݊ƊmZJ,܉ɉm\J0Έv`ZI90$ ܇Շӈʇԇه$-2BLQZkyĈ̈ֈ"6BSct‰Չ/3HZxÊފ8Kdˋ#;LoÌBb֍,O̎2jӐ2_ّ,9HGq.hdWU( ֔dV'Ôdi͔5{ɑ>6n1"}fVZ]TRQPQSVWSUa^aa^amsywsÃу݃уރك׃ރ܃Ճڃ207]_k4bچ'!҅a.؄|XDED2ԃʃwxomg`ZROPPOGCAA<0-0.*'''%$! 7v…ay[vDvm^dґjœF74!uiZ͕?h$'@ْ풭MZ2f*֏Ï]3َ<|D$ь{U9"ߋ{nO1"؊ɊnP>*܉ƉxfWE2 ݈͈ucWH>+ڇ҈!ʇԇ߇(9?HWYhp}Ĉو!/CO`mĉՉ':Idm}֊,Pg~ɋы #5Xvƌ @jҍ#:Hsˎ;uΏ,X~Α0E7u5V GY Ֆ$ĕ~  Ő_*WY$*ׄ ygZZ]ZYTSQT[^^_b^dfegls̃ӃʃÃ҃у߃ۃ߃كރ(-&4J@Addt/MӆTYLGGUSO;߅h( 脺rX=8)׃˃vmj_^ZRMFCCAA<;:8530+(&%$"! 1k儨PR ^4ČrˌӌoՐ7֑QΓZ*&!rIYÕeg֕$UR62ԓp3AG3 ‘a6MƏSG o(䍧sJ$ьaB~nRG׊ˊkK8' ҉sdTD7" ܈͈{k[F=/هΈ#ȇȇև߇  +7BLU[eö.=L`iyȉ։&7LZoۊ0Mex܋3[nŒ;]9Zˎ@ŏP͑6LF Nߔn}\X֖N}h`[/JvȔ[HsGt Ã烒lYTVVRRSXPR\`^_`aacgkqxtǃ̓ЃǃՃ "6RLKcwF{ކXІpRR _K5"уƒth`YWSLHC@<:98;:630,&##"  ,eՄ=u)I/7jmˌZ莊񑙑>4V'`%֕ޕg`?ޕ-˔ޔL{kG񑺑vRH萳>̏a?6授6썲[*ʌw_C$ ‹fUA* ފɊbF. ׉Ér_O?1! шvlXG:0%ևȈ$ˇՇև  +7CKTZcö -Ies~ɉ܉ (:P_z~NJۊ 3I`ɋ">Npߌ3S>Sh܏ @d>uґ2yHǒ#|!`NM :MޔV.8 Ab 唿$؏ύ1.t僐m_TPNRROPPRTWXZa^[ept}zq}ƃʃÃу݃߃+_bs#5SZևd?t -)ׅk(ЄjJ-݃у|xwoe]XSLHFC?:52/-.+%"   &Ys(gچŒzY'Vʑ֑=/ؗylۖ1̖W(4 ,Y˓5W$: ڒ͓'* J񐾐Ɛ~яb?M񎡎S'Y0Ì{`F$ދy_I5 ފ{bF/ ˉ}k^N?. шΈxeVJ=/$ԇՇɈ ćԇԇ߇!+1@GPZ`uĈƈڈ݈ 39N_y‰Չމ(=R_vʊۊ6PfxȋӋ(@Wkߌ L7*x͆\䅧XDŽiP4׃̓|ung_YUPID@<8430,))'%"  #Um(rʌ~݌z\o~yƍ }^tے!A~2ĕW8V&W˕ge\Gm!^Ē3̑Lِ/͏u2BuM֍g8ƌfI& ȋv]E2ڊlXI5݉ˉzkZL>/ ψ̈wdWM>)ЇчÈ#Ň͇هۇ *5@GV^it~ɈΈو.9I[r͉$;Ucvʊڊ ;SdaËӋ #>Qoٌ-Vz܎7`t؎$TEkΑ,c@Ē'bFϕ2%C2FR Hoӏː`;?DkWLMKHHIKMS_deec]entnjlrty{}}{ƃǃǃÃă݃  'AFRhQYׅ3_ *i†o?ޅɅY؄XC2 Ѓ˃vnjd]WQKC@A>:61-*('%   "R]lՆڈߋՌIT^l\ PivV=ΒoJЖϕܕX/)3̔ԕf͕ԕ,ГՓ7Z 4rґxސm[68돞O>CꎝQ%ȍHʌtR3ыpWB:%ÊlT;0܉ԉ‰sjWM>2#ӈƈtdXO@- ӇՇň$LJЇۇۇ"+5?HW\hyLjшۈ"5>K[lӉ,BMZoЊ֊ 4Rfhۋ+8Xtό.>΍(q=ҘbNӕmߕᕿŖqJŖu_xB ِPTVҏhgIF)ꍋXތƌwS,ɋnYB' ܊jV<1 ܉ԉwjUF8, ԈĈtj]J<. ևӇ%͇ۇ߇݇$-3_ҍ%?d /oԏ8Yw(Z >dӔ^JɔjLړœړᓗє1ꐿ̎ɍ* 惟v_QQOPRWZ[^`a^agsz|sxwz||wuptƒ˃؃Ӄ̓Ƀǃ˃σЃك܃3AK[eiu|لքЄƄȄm[J*ʃ|uod``VOIEB?<951-)%#""!  KTCȈGÌV4GGbwtWk*%ݕÕbԔjUqhٕRC֕u7ȓ␽M)ȏҏEX^(A$0wZ:͋_O@'ЊreP8)܉ΉzePF7' Ȉrj[D4,ۇć7ԇڇއ &67@MW\gtɈۈ݈$6EN`gwĉ  2B[hr؊2NZiӋތ/Pa|݌7Vύ%B_Տ"eݐZYВwAДCLUД=&ؓܓܓx˓ɓs {Ս,*ۃlYQPHJJMOQTX\\alv~y~~~vu}Ãǃƃẵ׃σɃك ,?W^NIUk}ք߄ӄلք҄ۄ܄ɄbL< փ~~ungaYSJD>::73/*&#!  Mci҆􋬌3J:.Jxoΐܑn9c˙AE Sה֔ژ=}\ ؐ<4$⏘⏿@nFApɌq]>ȋzZM<֊ubN;(߉ɉw]RE8*ڈɈo]RE2&ׇՇ҇=؇ۇއ,/9BJR\htLj҈Ո*7FRelyډ 3IYq{Ê݊/NXeϋ4YtҌ4Zo֎$Lf֎)kԐD}Nڒ4p86Kqєb\㔵.+ۓѓᓭГ}㓯5N׏<(K$z̃i]\]TOLKLNPTY\ckqz~~xw}z{y}ŃăŃ̃ȃȃƃۃ߃ *SK80;Sffduu|ĄlQ5ރփylbWPLG?::73/*&#! Ofp >""Arz|ZÐܐy[ vГ.햿|qӔΔ𕀖Fs-Ε̖ėsM}͑cC%O֏яڐV8JQ荧%Ҍn\<ɋcO:ۊÊscQ=*͉w[TOC, ҈Ĉyic\I4% هχ;ׇ݇*.8JLP`k{}ˈЈ ,8AR`lzlj.JdjyÊ؊?LYhϋ+RmwȌ/HZ}ɍDiڏ![ߐ ;Z){JMהŕX\ДWѓғdCKt7y9vʃoe`WQMLPRQRWW]ktxxxwwy{~xt|ÃӃӃكރڃ&"+%$*:GHDGMiwvwnfdD(ك؃σȃzndYQOJC?;73/,)&# PiS҆Y>($5ZgzSƐnTGƓbgtϗ ϕleɔؔD)ba&חɔ!7'VG2}ΏW[̎,*LFȍV،qY9ًŋ|fU=$ʊwbS?,ȉqf[MD4# шwk`\TD,܇ɇ:؇އ)+.CBNScmwˆƈш /USEUG샘u_VNIDEKORTS^`lsxy}zryăۃփу؃у̓σ  '+*)>YixvsoebeneXX[eNB%׃كۃ׃Ӄ}rkgaXQID@;61.+)%!  $[Ȅ{Mه<Ӌ+->a`*ʐZDړ^l??ruؔ̔oQ[,억ؔӓђ𒐒Oca7]qȐ2'k]팝qO3ʋ}eL6%ҊjZ='‰|{fVB9, ҈ˆ|ndWRK?) Ї6ۇ߇ &*+7IO^gl~Lj܈/AGLXl{ÉՉ%6L^pЊ:Jisˋދ+Sύ4TV}֐?fޑR~Gq 0d“@ϕb6)(DޓÓ5nTדEDbZ؎.xIZ ]ƒ򃜃r_[UPKPORVY_djiks~yzу̓ă΃ككӃӃ܃2HPQQUTVYSY`]R;2MUT4ރσЃуЃ˃ʃ|rlld]RKJE;52.-*'$!  )cۄ#PIϋȊC\S5>Ց#4mp7y@7ᔯŔٔzX6/'ݖv ~X\@M-ΏÏΐ8O͎Ď0wa茢uW.ً|Y=1!ߊЊfY@'݉ĉxqZA1)ۈƈ}mdQF<3ه7݇ "*,9?DVgmqtԈۈ $6CHLU`p~‰Љމ1DTkՊ%;Ml׋+:Vu/[ύ7cPޏ1kߑK6sGcIӕM %R!䓔qSM[ܓ . pΎ;2YŃu_[VRMSQRQSW]ihgr}wy|z{ƃƃ҃փ݃Ճ˃σ!6947>;>MNbgUC:-$5% ݃σÃɃ˃̃{qrvp[QPJB<630-*'#!  ,kꄣ/V'nЋ֋ 7QX, 󐳐ȓ𖏕eNFєє㕩Jhʔҕ8D攝Y ~$e[֐$ˏs4Ԏ̎l-F\h@>ċ]C5!ފȊl^F+ ljneSG7%׈}qgO>1)܇Շ‡?#,2:CFR\bpxΈ*DJLU\tˉ։ /:TeΊ $:Qm}‹ϋ(=JnÌ2Ys΍2Wxώ >~ď/pƑGyВEēWu&ە^1)h ۓnr~CGRz!RNU5 ΆQ|g^WTTXPNMNT[aeiqyusrtslmsɃǃփڃʃÃ˃Ճۃԃ̓у҃؃׃ ""'35-(0LiŊڊ";Qiyċы %SxǎGtΏ+mHqҒ`Nݔ YǕ>GF%Hoѓfzt*1y@ݏM*u\m! zbYXTPTQPRV\__chnxytrmllkgn|ȃ΃ǃ˃˃˃σރ܃܃-* ׃΃ރ݃σƒ΃ǃsr}}rgYOB@83/+'$#  0z-R  &NjtlՋ%Hp2"Xj(͐БaCy mW:͔\p•<-|eOĒ~ ^Rt8ݐ&؏lmv1PڍCӌlF" ۋ͋ueQ4ӊzhQ;% ߉͉wfVD0ӈ}o_Q;6,"އчJ &/2@IQW[js|}Ɉֈ-9DMSdtɉщ'GQgĊӊ,7So~֋ :R\Ҍ*N]э6E{8u؏#g;a̒=ӓДh2L`:nu\^C$ M#zY7d^ta\[SQWWTW_ea^_hllmhihopnr|}xss{}ƒŃƃ̃̓҃׃ ΃ɃɃƒÃȃσ΃ăwtv`RGA?:50)$ !  9҅(_>Ŋ[;ދV\ċ$=B=Q|xɐꑒ𕇘H4-XUȔ^]kVʔ:(@zO񓊒asCؐ0AvLXPgˍ)ÌwK$܋‹qcK6&ϊoT>/̉thXA- ވ׈ˆwn`P@2+ՇȇK )1:XoӋ2NYi'=\xƍ.SrȎ"5Wސ G2Y˒ Frȓsڔ Q͕t[qgf";LW1ލ/91IQ9eYXVUSRNTYhlda^`dgghgjlrw|qntwzyăăɃЃɃɃǃăɃmbYZ[SHBDD?4+ # $Wu90=j󋕋tދ #37vd _ӑSC *ȕ㔤t(œՓƓۓ˓Lg+&O~^󐽐s7ҏa@*xG"FsԌ|eA$ŋ`A(܊͊fP8"ۉˉ{c_F9'߈ӈɈm_QA<4)ڇч҇8 '69@FLUeoswĈψ؈$6@Qdgtɉ׉,?M_vNJԊ/:Qfȋ̋7GUg;[s׎#IqΎ'XUJ+i͒fє NĔlޖuœ_[PmW.&{$1,yunIh\WSSRRRUYbd`abngfeglpwu{yyvrsvuswƃă{yy{yngca\^XXYYH6'" (c݄-=Ɉmvԋs ,r59Y<֑%𕴕0ΔK瓾kKuHޒqE ޑݑؑ lؐ7ᏙqkgL%юw#%čQsXB* ƋiJ+ ݊ŠbU<" ȉybUC2!шĈ~jZNB@62߇Ӈ>%.79AIR]iqq~̈Ljو #1DRZl{Ӊ؉.?K\ssΊ 2AXl|ҋ -I`oŌ׍ =Rtڎ%Ibǎ#\XQȑmٓSŔSVՕڕ쓒GW`Q/EpE?>Vԋхg҃k\QLKLQTUWYZ\_fhfffhophmmtxuy{xvqqsv~|}ƒÃƃz~{usuooqv}}{ytifdlnml`]MA71)# /s/60K m\yɌ <=Uِ)Ƒ˗ŕGX u^瓭P]9Ƒ_ېec:Ώjfe9&ݎʎ> ͍zߌ|aC% ۋoV:!ۊɊcT=&xbVF1 ވ҈Èxf\PA<22 ܇ЇĈD!-29AJP^jox}̈ӈ܈&6AUeo҉.;>\jwȊ݊!0DRt|ċӋ '?]tތ :W~؎ Gl (cO8xВ aJ۔F8•ߕؔ˓_PWB1r^َD}nTńރp_RKIIOQSTUVWXZYbgmoppnnprspq|ynp{}vxxy|ƒ|wwurnkhfiswuuyzx{|yrjikv}zodd\TK?4'"# 9Ņ8Ћ @k0ap{ь 9^ǐWQ󐑐ڑʔ 4r\瓅 璪_K7摮eMWDĐl ޏ֏aFF&؎ʎ͎P&ʍ@ӌl]>ߋ|eTB ߊŊnSE> ՉyhP?3#؈ňm``JA8: ߇ŇN#*5BMR`fjzш׈܈!7@R`i{ˉ )7@SapÊڊ-CZi{؋/Sw֌2ZՍ?fڏ'BY|ؐ#_0{ۓHԓH\͓gME!X ސe͎r)a񃖃p^TMJIOQRRQRTUS\_enqprwxxuokstqss~}srtz{tqnljifa``bfhjmpqoqt}zqffo{ud\WPIF>/)($ C5Abߋj9-?f܌?nאWEꐀؔEt3͕Y s(蒶\8EuRאaVFΏP5#ώ](̍AČc\FċhWG,ڊɊeC2,ډʼnraO@3& ڈƈrrZPC64 ؇ׇÇL $.9DMM\mlx{ˈوۈو !5BVdn}׉1ATgvӊ $5Mhq‹ԋ/Oeڌ /Pqύ+n׏.Uuܐ:[-]"y|Ɣ!n3GVœmJFޒ_Uf}̉ډ -6RdxՊ'8P^{ϋ*Sb̌-Mg{̍,[ɎHҐ2UÐґ^őߒ3d֓@ݓ9ߕ? RDғjYWS/qC}ƍZ2`>$FUboỷ։ډ %:M[xʊۊ6DUwËԋ=TiuЌ0GTq׍$R~ˎ;YAmܑ8iے5t.rÓݔ}ݔƕٕ}vXLӒݒړ>B’БLߎ#މRgԃj^TVTNMOSZ^[[[^egcdjnqkkibbhjgqwmhkils|}mpux{z{~naaa[JKHGLKJEEIKIOMNNNNOQW^jnmnsqqslhhlpt}yrxvqquyytsvtpkqrv{|wzx~{toopqsugguxcfphabd]XRLGB=367630-&  3y7ކE _??@Ƌь ԏ؏Aۗwx”ЕO+i.ђ{cZՑliǐD$ ҏq; ԎP%ٍbN$ɌxTC! ߋƋu`N7ҊjG@)݉ƉnTL5% ̈vlaRL?1 ۇЇV!)/;GVTcq{LjЈԈ#*5CSjo}̉܉ +r.⒘tbMؑhVÐg;ЏyGݎa: oLK0ЌwT2ϋu`S8(͊zeR=) Ӊˉo^O=+ڈЈxeVLE?4݇Їň^"*/7AQZ`lxĈʈЈӈ#*3BRjsʼnщ߉ +;Sg~Ҋ݊ 0C`rˋ!8FXwČ׌(@Z؍%?f(Yw?\ґ ?Y K~ɓ|ē Tߕ:XP]œpcJ8Mw@׎lԋNvOzeTQLFFPRMROPMTRU[[alqtqpnnllyvihpwqnjj{rekpoi^U[SIEE=7;<>=>=;<>>>?@A@ACHNS_\_`^_adigjh^_jnokihoqplxwmigijiidmspopo{{{qkigpvyronkyuimqmb\USQWjl^TK>>?8,#$#  (TFфR$:28aύSExNKϔLb.ƓzՒtAБsj0搾{bE.㏷^+ǎpJ) ƍ{k;̌eD>ʋxe]G<ΊƊeO=)ˉ}nbRC2%߈ڈÈufXND=2#އχÈX  *8RczɊԊي -AXlv؋.EZn=]͍<`َ,Z{,VΑ+TԒX*^Fwm^H|/H͑YiYፋ16IӅ9>dPPKHGGLHJIPMRY^adcfjnutiirtxwujmxtoknme]fqn_]UMHD?<910788866679:99:;9:>DOSPQXUUW]aee_\WZcggea^jmpin|ukgc__gibgklmiivpnuzymhmiijjkhjt{}pkjhkc_]Y^mtbaYLEA=7-*(%!  .fՄz\9ƊƊN !N}ގ$Y\:&wp2“ܒh'ё|[ 됱iW я`X(ێ|c.ɍtU>Ɍ|q^<ԋwcK;+ ي̊uZH0܉ɉ{gO=* ҈LjuiXI;+'݇χX *9=GPXgmvˆ؈׈݈ &18BU\p{ʉ܉߉%4E\k~ʊ;U[vԋ(BWvŒ،#>_΍+S~ӏOmߏ&Nӑ'KxՒ BzAJ-ƕՔדfD*ax̒S>2@ Iߑ>^!Go6,ܕn mJ @ 3Rk͌~sޏߏYqƒ;D4єsB"񓥓FϒXɑ\I|z2zT3؎~s`3эsY@" ʌ{fU2֋ɋpG= ۊʊzk\L?&׉Ɖ}r^M:-$ Ԉ~laQ>.܇هχ[ )5:CTffuzÈ̈ۈ,79KUamÉ̉׉5LRoЊ%2DPqϋ0Pgʌތ1Kqҍ!Sj֎6eϏ*fё3Q KՓ.Wߔr *R'd(8L͒A@  &ʎppكhWQPNJIEEFOQSQT\_a`[[aia`fhhgfcb]`b^hkhlfULFBB=/*,+''*+**)(&%%%&&&&'&"$*5=<>??BKNMHLMPIDHHJNOMNSRX^gl\Vag[TWVQQRUXXdmmknnrgheafebfr~vcelfbhlf[dmiYY[ZNNTJIKF<6./.&#!%$  7q߄zZH+Š;Êӊ&OgЌю)M ~\G <&f(퓹m򒪒|A⑵wa&ϐl!tJ#ˎpf]C ۍ[4͌u`R> ϋ͋uZ?(ՊxfWO>!ӉwukUF5#Ԉ}i\ME) އׇهчĈR %$6;EU_hrwLjˈو '48MR_nɉщ׉-8LWesъ؊#+EKoŋ/LVp͌׌3Ofώ)D` -P!X'ZhFaє 4Ug%&O0̒k뒙73z\@͎ք􃘃q^USOJHEEFMOQPSY[]\VWb\Z]ee^]^bjf`__kmd]UKEA=84,('&#$'(&&%$"!""####$"")4868<<@KNKGNOOHCGGHKKHJVSOQ]XTQ\b]UVSONNPURW`c_]ilqcpf`imrtspqemvoe]^a]kuo\WZ\ZSPNKKJFA552*(&''$ )F򅊆-"ҊˊŠɋ *d䌻^O1ʐ39?G([%(m$ؑe7 ֐LˏwO"Ŏs_*⍵xT2 ьl^:7؋qZC-Պ|wgM8 ܉ʉvqfOF:2#߈ӈˆvdZN97&҇чȇM $-5DLSS`jvĈΈӈ )5=HP^s{ʉʉ׉ 'AGUdzĊ֊1/1SU5֑5{N叶M2̎wpH ͍y^?Ɍ^P2 ͋fC5) ԊraRG+҉zjUJ9/ Έ|h[RB2ׇԇчLjQ+24:DN\gpxÈЈ܈#*7ITYZrʉӉۉ+7HJSq׊+/SYt܋8PlՌ4L]l؍+Dsώ4_wސMpؑ8Zג4`/gΔ:Qהg{ ΒfMkZɏB̍x;/򃙃m\SQLJHGHGGGFECFJMTWYSSYXRRTS\b`PKIRN>?81&'#!$+2<<8<>@CGH?CHHA;BB@???>?A@9>>AEFIQRNKHFEAADHLTSJQWWQOWo|vidmld_b]YTXWY^]YZ^^VUXab_YNFE@>;?GG?:6410.-.,&#&!(7\.˅n@ 'aXzÊŊ݊`Weώя"tՐݓDA_-Be,铺x9;ΒmVP7Е2 钖s>Jǒ GƎ?MыU wcUSLHJJFEA@>AGJKOTVVQQUTNJKPWUO@>@F<:60) &$  "(4=50:<:>ED:?DD>7??=<;;;<>>:?:;?BB@OTPMHD@><>AHNFHMPJBIaqrhY`niUV_cbeXTUVUUVUSRPLN[`OIJC?;%xnO!򍺍lVQ*ٌfEዽbN;/ۊŊoR7ʉuRD<1$ՈȈuo[MB5+ χŇa #(339>LV[hyňԈֈԈ !>MFSahuƉω׉ ,=L]q~ɊŊ%5@Smʋ׋ 1C^xÌ3L_tɍ0X5HaÏNJzPԓP Ghn1_1$ޒ~a8lOF 3ԎȌ-4ӅZcуoYTIDFD;>>AHKOINURQLONOOMJHQVNC79>940*'#!#! $*4721355<>76=>>=6:::856:;;;==435>@BOZINOLI@98?CIGQRPMDFV_gdWO_m`V]afpi[SV]\VSQQXPFGNTMNMHE=<<==;;977.((.4.*0:W.4E\#MɊZRʎ&`'m*ҔۗÔnx`דs]3꒹^Gz4ꑠ<fǏɏz1Ύx_D΍rU>،yL1΋ePF+ ͊}n]J2Չĉy]B92"ՈȈodXNI9+·ȇg !-3;@LN_gxˈΈՈԈ /:?PUfmv{̉߉&BL_rϊ$4@TrӋ+H[rΌՌ 8Ro̍'Gx֏;St8}Fvϒ!I’Ht- DdQ璚oS`RF͑=Gz^QԅrZRHB>=;>?EHNZXNNPWZ\[SHK[]SPQYfg[PT\]UQQQRUHFFS]\RMJ?<9669:8681./17218Gm7U%i+p)Pʊԋ9x (YɎ9*}$zܓ~Mϒsw㓹mc{O2eݐ5؏Ï}6)Ž|\D 䍩jJ>̌y\G)ԋjQ. يziWE5"ىΉlj{nZF<6#؈ɈtiUIC6/' ه̇T (05=ILO`esˆɈЈ܈ -?KDVZjwˉ׉3Ker}Ŋ%*?Qazۋ:Ym4Qqƍ 2MeL\ Drّ DdϒV[6aP@ƔtΒ钢T0{|*4&󍹌ҍah *hWIA@><>ADIPOJKQLFHHGDIJM@AB:4-))&!  '*+*,-447;149533333273366101.8;:8;?GRH>AJFD>=?ACJHMRTP[SS\[OOLNQPNGDLVWLNX^WPTUVSNFAP`VW[LD<8860//033111328=Xiфم ϋ<㊀g͋ /n@qM&i Z/@ԔUדZ䒸vv;'v*wđB됮>Џ叵O&ҎX9!qL?$ ˌ{gJ( ݋yiN5 ފϊ}jV'׈Èzm^N>1)! Ї‡Z &5?LNRbepňΈۈ%%3\wՋ/Xǩ8Viō 2Gh'Yې+dБDt̑6WؓY Sp7{ÓՒ;^MbZ dɊՅopۃp[LB?<<=@BDJKGG@BG@AGCEDF:881-(#! %''"$'0/081250//////42364.-0.9<<78=<<>AI@@IMKKNQWVJPUTPMJB?EKPPSSXXRVVTQOGDAEDGSUHD?:70.-.1333246@PjڄɅ,؇TC։N/p΋ $j[㑡pd=O}D 咹kFu𓏒ؒݒRّ+" ϐ\ʏ}M򎷎kH,͍uO9ƌjX>Ջ{QB,֊Ȋp\D4 ݉ˉw\>=*҈ylaTD9,# ڇÇT !)4>IS]eeoЈψڈ%69FQ]jutωՉ݉/?Tf͊ۊ1D^nʋ!.F]xҌ *FcwՎ)Dm͎ Iu͏bȑ>tő!T֓a:`'SݒҒJ 1,e5 v$LKsOXԄtaUI=9;;<<9:??==>>:BNH?:40/-(&%"  !$%!%.72-31/-)--(),.01394--47;<<:458><66>B@9768=D>7BKIFITONLJVVSJDAHJILMUYVXX[XQMHJIF>ZtԌ ,HYt΍&6\| 9bՐHʐ%_)JN%W4ŕ딞ђؒ˒^CҒK3\ێpˌ`ކB&NǃfSF=:<;:8438:7787535:@A7@Or؅܈ u-H^}qۋQ >v񎠎j}̖ؓX,/֓zkTג钼{$hJ[)0Aꐃ6ߏe5 ܎Ԏzh>፫eN4ڌeP5׋nVIB!̊p[RC6$ՉvlM:'݈͈xm`MF:* ؇ЇÈ_ (29>LV_gnvȈӈ !-3GOZamuɉ׉$3CixȊϊ#7NnË׋ !A]|ό5Wlƍ5Ot̎ӐHYB0ltUɒȒe%1ǒ'ݎQHhysWiUH@=B@965438344?:2'&#"     !!!#.331))+0)()$*')026>8/-4651772-1976445;553379@77:EBCFGGB@NYZQYWSVa_SQSZXWTOHEEFIJGED=:EE??@DDG@:;4.3;FYЄNƄNNˊ&RxZxmy 0̑Ô^8>PFa]I2ϒ"aY .I֏^6َ{H"pM-܌ŌZ7܋iM:5 ŠwcQ<&Ή‰kiSA0׈͈ulaPH:%܇ȇY *359JUWlpzƈӈ&0.ANXeezȉ׉ .@d͊ފ 2@b~΋ "9SyŒAUeyˍ׎"?bޏ 0a|(T~ّN{ΑHMJS_OOZ[RNKQRROKFCBBEGGFXr}ϊ/=[z‹ϋ $GUjԌ-Xezۍ4Szێ&YuQ|֐(`Ǒ&V˓M̓FPȕc͒Ȓ]"Β@$y#+@ō̌P΍LŇt\w݃_MC;69420.+***-.+)-*#     "%)+(()'  &103;4--*%(+574-/114;<860)+0../*/148?A>>;:7>?BCQKMLVKIKFBHHGC@;;<>FA8A<;8;7213577:@>DH[Ƅ9܄Յ;ˇ%k8!O_e~{f [$dzu|ɖ.9f\Γ_㒮ޓmڒ֒?.U,ߐ9s_F32-<ώ֎Ԏt'9Wču_,#ÌuXO'΋yWRPG% ފqU@8*ȉveQ8#؈ƈjXN=+'%ЇT )3;BDKUarˆӈވ #).AL^cms{щى.D<:9859;55414;?CCJRlބф_>o\Tcm܋ǎrŎ3Ƒ6+ԉ‰zj`aJ*׈҈ugXB-+#ʇe #2?DJQVdauĈ͈و܈ (-4EQXhn~ɉωۉ*;Tfs̊ (?Ns܋(JeuԌ >UtЍ,S֏,f}Ǐ/`Ɛ M =+J锯u•Д^ϒM2ؒՒ ԎO2'JLD^σ[H>:663,)((-+" $   !&'("!!%(&(*.,&)$!$+-)(-*-//560-*++,,+*,..01321,.583.ߋˋ{ZTA.ъɊriD/މˉ~\]PC;0߈Ԉƈug_KA-(ч\ (55CKS]_jsˈ҈Ԉ҈%/3>IY`n~ĉʼn҉݉*P ؒĒY.ے!E9ɌHu5'gUH=51.,*'%$"   $)&&&%' #'"$%')%(#!&(%&*'+-*04/,*,+++*+,-+-3664,,3674>BCCEDFAFA>=C@HNJA>;<;8748727334789*׊ʊjfJ4 ӉuQP;+$׈ʈq\GB*)؇[  (*7BMQ_civʈ͈ֈ׈(8@IO\oy‰ȉЉ,AFVmÊԊ 1>No 0DZu.Poˍ=^Ύ+OrƏ3s?rՑ'W̔EvݕP S7ג/̑Ϗ{!Xzʌ܋ [ԃaK?540,."  #,)$)(&%" '))""##$%&,-(+33..10**/0.+&(/2333.016857B?=CBCA@>==79=FHHD::2167645302<=49DViۄQЄيY5RlPڍ׎Ϗ SRHߔb^LܒВגB  ܑ}\3Ր}=ԏZ/ !쎸ʎЎˍj>ΌŌq]?*܋ʋkH?'ԊgYH;؉Չtld9#ֈňvcQ@')% ňZ !.;;GW_dmzȈ׈ۈ݈$;JS`oˉ߉*AHXi}NJ֊(7@Mhً#@ZwŌ֍1PcʍA`{؎.Zyސ 4h8oБ G̓lq*SΕϒAܒ1?َ]򍛍ui=ԆrhK@8720%    #*(!! ""$(('!""$)*&(02'&/1+('(--('),2460232235=:?<@BCC>;:336;@FI@@41569:9979@B936422272ֈňvcV[:/% ͈[ *1ZsǍ%IsɎ&?_~RבNsߒ6XFC=:20//257+ʌqD. ދɋ}s\C6$يNJuZ@# ډĉmvVI;/Ԉ}niaQF2+#шZ %$99HWadipvÈψو */FQ[eiwω$2?P`sҊ":L]jv‹ً#Dapnj݌"B]v !Mfώ6mTzԑ .lՒ%Dz )WԔ S=W”-Cܒ󑴑xjŽΎIˍtw7&ň+7r݃~T6++)    !%(+"!"%(& &)-.//,(.3ǓLْ͒\đc5ܐwX/tm\K: ܎vލzH ،gE2,ՋnT;( ɊÊs^J0͉~wdG,!  È}wqqdB*!׈Y !).9MQ\_kt~Èψ؈ &&4@R_fw}҉߉ '7;I^rϊ%2UxώIm)Jwِ>zӐ%cƑ1^ R“Jtᕭ̕v<ݑБ}ȑfKUEIJڊtބ*aA/+!   $'* "#!$&!!%%$'+,*$$)2<=4651135749=:58754200/0123343370+.6CXkLĄۄ?`ъdo]k~y Ύߎ܏ACĔĔ2N ӓMڒΒW?/Ƒ{- 吶|];ݏ^G;1ю֎Lύc7(Ռyf`W<܋ԋfL5# NJ{j\TD, ݉~wZ<1܈ЈykjbF,!ڈW #*47DO[dnw͈ʈ؈ވ %*8=H[e{~ʼnՉ !:JP_v~ʊ/6PjË׋.Krnj-RrԍIoΎ?fݐ3j(HwӑL;m&gKfǔ*?Òc͑Ǒ`uxFkHՉwF僆T:)   !!#&%%&##! !""$$$"%*,/+,223150*0201563200//---/369422/19D\}%ɄÅ=R]-Ћ 9^َߏJ??{!Ӕf ʓ9גS" 鑼T А|iC ㏼eC:,ڎՎЎ 鍿jlH.Œ}mcF0 ы{fI4$ ׊Š|iVM9(݉|zcKOL+ˈˆ}j`UN4% ܈X #*)7BMXcmvĈĈԈ؈  03BKP`lxΉ܉3CSYp|׊/8Efsϋ)Ch~ (KjǍ(bÎ1`܏!YIe@yߓ'fϔ6X"ە}2&⑥ܑWs1M /󊳈|GÃsA%      "%%###$%  ! !$&)&'$/1-0+%++*-1310/--,**+.37;6238=BLfv儿P]|u͊7jTaotxuߖL(KL ȓuV-’p2㑹v?䐸j- ߏvB1ԎȎMЍr{`,݌ÌtaO-̋}eO:&ϊ{j_F)Չ؉baH;6)߈͈ʈ~xjQL:-!ӈZ #,.6EHN]gqxψԈ  ,8?AG]r|ʼn܉ (7D]pԊ(1GSm΋2CPfԌEVǍ&*Kk2_Ku.\ @]ђZ“]RMȔLV[fovLjӈڈ"".B?O\dyɉ߉ /2=Zkw͊ 1@Vo{Ƌ*:Lctٌ9TA]ݏ1RwŏC`ѐGƑ$ZĒʒ:pޔ ?qȕЕeR(Ó |~Ñ:Lt2ǎi=;%NЇw烆K.         !  !!&$&#(##$#$'(&&$&---&'')*,/6388469Ma|քń[84UtߊH^Vuzup鎇׏N|U~'| dC Ȓd9. ӑPC2Րwe/}gjL ЎÎd:܍эčd>2ڌxukQ@ ϋseL>, Ίtm`RN0ىʉteQA4)!߈ψň|keQ-&ވ_ $+:BKN]hqu{Ȉʈ݈(4AN[fqɉ؉%,;O`pƊ܊.;Hc|ˋ =Lh{׌0UiՍ@a|ˎ#En؏9^5kґ9Et2BWڔiM3őw#y)R?\+M̃pB#        !&'' !"#$'&&&&().(%%(*.0112328=Nqg*Ї(#"?̊[ Ow|Ӌ5*+؎ҎMÎӏ}~1&'T/) ѓݓ^ 钠|L葱rQ8"Ԑ{Y&叻gX\G!Ȏg?ݍnc;,̌v\P2ˋsWRJ6'ߊxrkOH4$ ۉgSA7$ڈΈƈ}p\O?*# ׈^#14=FN]cm~ȈȈ܈ %1@N^jt̉ω(8J]qҊ8O^rȋދ ,J[pΌ 5NnǍ 4Y|ǎ@gȏ6]xΐ#` 4ړ1nUYΕ@) ؈W "$#+4=GR]fpzˆɈԈ$/:L]er|ʉމ*5K`oqĊ؊ 3H[gċҋ%GZqɌ 5[z~4^xĎ ,bȏ?hLڒ?ԓR4z%3sޖ p"_e] c)+ߍ$w|Gƈ 3r탆E!        "$   $ "'.')-3.//8Uy}3hE* VQ >htЋ> 뎮N͎ CU+<̓ȓn+ߒ⑾bA%ӐxiI)͏fIK6#ʎeQ7"؍bH5 ܌̌xOJ:݋ԋʋ|rND2Ҋy`TH>( މΉocXSH<&ЈylVM=71܈V $'19CLS[for~Ɉшو)2=BM`ozΉ #.H^loʊ!2H[i‹ҋ 7^sÌ2Wj~׍!Mtӏ8]}Ï 7hؐ\ё"rʒ,eJ 28+b둪XIݎ~~ +HՊꇑ#qلJŃn7         "$ "(.&&+3/26D^[}Պω'%G}bՌK㏃v2dߔe<ٓmY'ْ{3ǑiJ9Ðq\5ҏqWS4ՎsOH1ɍbG8 nj^RGF*+֋ċk]80&̊xf]E8#߉։|hVI>;'؈҈md_[IB6[#)47@GMXbltȈˈԈ܈&-0?ETezωډ #2EQg}Êˊ܊"?Rarŋڋ#4Smߌ.Jbvҍ;pɎ+[vې/XƐ(Mvđ mMK.wŔ9)3Ò(Αb4R_P2%_&eጓGS -;CU+      ! &-*)%(137?Zф9ޅ0Ί/De#9qz:7"/᎞B6:}8i%f(ȓR/ В}@ԑǑi:ѐ{cUÏnfP1ߎʎsW;)ڍɍbH@*ȌvaPU?4܋gWD/*ԊrrQ<#؉ˉ~lTA8. ؈͈rlaYNH9 Z"(.1?GMU`jwzÈ͈و!%+.v B|Ŕڕ*lEg󑵑? ʎbVBRԍ YIֆUzJ$        %'.)&*45?TƄ#}҅ )~;Ŋ3(FiV݌čÎ8w쏣5 `8:-ד͓zA+ ޒؒ|qb3ߑԑ_3 ʐ}zl8"ۏɏsbH2֎z`-֍ōoWZD,ɌpQN5*֋ua@8ӊъȊteO9މljoXH<-߈̈wpcVB:8"T $-/JP\iv̉߉ "2:EPhĊۊ$2Pm|ȋԋ1KďŊK]ڃ}C!        #!$')(/9?Rts~~sr(o8Њ&fv`TM掂"Տؗ ?l$$듹“~UӒŒh5 ɑkcH#ϐgQ:ُďZ;.!Ȏh= ʍy`T0Ì^G&ߋ֋ȋ|V6#݊ՊNJy`D8+ʉvfT@4 ؈ƈ~pTG60.' S%3:CNN[ejxÈLjՈ߈ #)3+ދuuaL8!ڊ֊ƊeO;% ى‰s[Q<2߈ՈƈsaUOF60Z "&,6=DLZZZlwƈՈވ )*3=EPVcpՉ#->M[pӊ7@Zg|Ƌ-5SnÌތ6Zoэ+Hrَ*Tp 2\ސ:W5\{ӓ0{EÕMYyЊ/Tiw lw߉ۊ$8lD͍ގY‘MfP}m( ؓvX7גc?ꑽqVe_M0ߐҐm9,ƏgJP2ΎeUP:"ՍčsM-ʌw_ZA=! ݋Nj}iS='ЊiXRGB' ىz^P?* $߈È}nlj]C-#( L $+9=EHT[`lvLjˈӈ&2?LGO_kuʉى (/3L^t|Ȋ܊'R]byɋ܋8E]~ӌ7Y{ҍ8CƎ*eΏ@mޑ1]ʑE|ǒ%K8fɕ 7F`m|e|Đi,ۍi ӌgߋJڅZvT$      ';Xڄ5xlIb~gJ݉%щ;~(>pv1;L=l$dz&;ԓd<7ђd/ǑkdXS.ڐؐt=ݏяyYUC*Ȏ}lf\.捭~URN7쌽{vaM:#ʋ‹qZC9 ˊv^E,$߉ՉnWC5%͈rbYgS3# Iۇ $14=DKN[ilu~ňȈӈو)4BDNV]gwzʼnՉ (8L\kqÊڊ 5HSh|ŋ'J[kŒ:]|Ս;Ln .Pܐ.ZzĐB/qǒ 8ʓ+MٔޔK^!ؐ]ېyʌȌv쌦-u7ąXބnS&  %4Xʄ(fhR`օB|@TĊߊ;pxGOE̎_Ώ%ږ!/I&WfX“zJ4ޒޒ’R1;͑wje:ؐАo+,ďxZP9%ێnY> ؍zh`[[1$Ɍ|aN3ċubPM)֊ĊpH= ݉ՉiR3 وyZc`TA2!Aއ#,5t;_!dE.]J$ړa*ג̒]Q:(鑿~Z03̐`]9ɏmQ6!َrP8.#獯}r[I) ֌lfD<*ϋfD( ӊΊŊkaE&(ЉyoZC2,. وψňp]IJE7@އ(,#ƌs[P>+ŋu[;Ԋ̊Ȋm\S<8׉Ɖ~tQ8+&шΈLjucIHD< > %/7FN\\bfqsƈˈ؈%*/>HPVZfu҉ ,9R\t}ˊ&6DXv͋)CXk{Čی6Rqލ -Brˎ'?e$K{ɑ.T4Tϒ5_7ޔΔ͔ה*[9]Qslxo>̆߆nd΄&ǃsB $2Nu;aN4VxuL2R߉֊ -Y`nԋ .|I{KS甆4!ܓ{cZ=)`VW)㑴]")ѐZJ7. Տ\T;-׎iS+\;/ό|fRO:"ыk^H/ҊŠlZO9-ȉZB/& "̈ƈĈ|mRA7:*< $.6DIKYacprňLjՈ &+6@MY_k}ÉՉ />Ymuˊ݊/F]t̋ 7Xpʌ+Cax(K[ )Orˏ5S@c~Ñ>gѓ5K'W֕ƔVk] &ÐL 9.#xb|vyW󇷆kc%,ЃL$  %;X5UC";gzą͈YHӉɉԉLhog͊JՎdnnbwpwi֔ړ̓x\Q7ΒnaR+ّƑ_%ԐɐSP= ԏƏ`X5׎lE+э`?2Ռz^O:#܋ŋ{iXJ0 ݊ɊweR;2։̉\F5%وLjxyqZC591 >ۇ %.3BIQX]_kswƈȈшֈ)8?K^jtwlj͉ ):Kkxي1EarƋ $BYpЌ2Mnݎ&AZ~Ў$Mk-YxHhْ$;XM^do{̉ى&7K^sЊߊ+E]g{΋3Rkw,Cctҍ,CeЎ$>[vÏ͐C_Ԑ'OǑ4dApAl͕֔A=ǖ/֐ې*ސ ߌXPG[EifOm(؄Nf7 "-Jt5!&7Ef兛LjsK " Ӊ &REE^DOpLl)ni;*m#˓S &Ւp= בdO8?ǐk<=֏vo^&ӎ~X#ٍύuX<#ԌiF/)ދˋ‹kYF0؊~hPG2$~iI3#ڈxqeR@47=ۇՇۇ߇)+5DLOY]ekl{Ljψ҈ "0BU[\jỷщ/8[u׍#7Uvώ@Y׏0IwƐڐ 2bȑ#=X{ɒ^qɓTӔ񔵕uŒƐސ)Ꮯman9pRG"g,Sk\:􄙄SvA  &;Yƒ+2$9<_ꅜԈx%$9q`L:nՋ^Ȍ{`SŎHf<'Δ3VڔI<ÓqmI咻~ca3ؑ‘O)+Ȑ=A7司|noS%ʎz]4؍wG3݌،nj}lL5,ߋۋ֋gP># ڊĊy_LF-(ȉwsmv_< ̈~qbK@:?':ه؇!!%-;FG^_ddpxňȈ׈܈ -BMRYhxʉԉ&EIT`o̊܊%;FYvˋ>Qj|ь 2huύ-@Gk~ۏ">Tp͏!7\אFeΒ$:g˒=Tɓ0bєk{ܖ!Β쑽d-)##݌&ɋD , NVa{O;넦g#΃W. #2HlЄ::Ta{ޏ 3vܑ'KqȑՒ +Gi~;]pIqՔޔ&:ϓ֐+ݍL'Jʉ9V~N+„q,lE%%>]&$#&@j녍]B.;ŠKXY3LXMmi;ގȎ`qҗ:2ߔtz06#ꓹ~Z>@ ҒےcU*Ñ{~P13 ِؐŐu`WA(܏yiD<ώTg[5 卲kO/Ռx^HO9+֋ċeF85)ފъy[G<-؉~ofj^P9(#ĈnibYEF=16͇؇ &,37ENWefjnsyĈ̈Јۈ'Ct[Y;BsvcR-*ώij󔾗8@ה(ꔵ𔛔Yݓ蓱~mF= ɒO@(ˑcsrG" АhP=%Ï[9$̎mK+؍ÍpQ2'%̌n^ZM1ۋp`:3݊yeI2݉ډĉuqeQTM?+׈pbc`K@/5-4هۇ߇ ,/8DNU[dlpLjЈڈ18HNZdtwÉ҉މ",@SfvɊՊ'@H_p͋ҋ/:\t، :IhǍ;Zw̎ -OtՐ2Xxܐ*JL{ؒ 0d|Òӓ'9rϔ-NΔ˔a[ʔ:w#X8>d3A-䋢RTÇ ԅ~8քc*ŃjG+  />Pnτ/>1%*934Bbޅ^;UP+QaUъy6Y>dZ49َi%ÔY'=ǔ𔿔[t,ܓ}aN# Ւ^A#摩tjI,! ͐nlH׏`V?؎`6# ݍ͍xe\I.ތȌq[KB4(΋zrgJ(ˊÊjY9߉ԉ̉ĉj_SNB3؈zhiX<'221ɇԇчه߇ &02=BELS]mrň͈шو .4FQ[aqyˉ!+BRewÊڊ 7H`kȋ +0Ol~܌-9Pnԍ ;Hgَ@X| C`}Őܑ2@a >]vϒ -U[ǔΔOiCg1;֒(6oAw%+l.~hv\Ç7ⅭZ{LÃlI/  ",?Uu7>;9?7"4Hl:PQcU-dP?yd#.񎊏$OcW)Ԕ3vJ ޓ“UKNfJ*ےÒʒ|NˑpdE#( ͐k\c=Џp\1ߎ͎`R0ٍ׍|`ORH)̌ŌuU?2"鋿l_M6ϊ{V?؉҉ωщ͉oRWLB9!؈tsh]I597(·ЇЇԇ߇  #/1=CEJW[kt~ˆɈ͈Ոڈ-3@MT_l{ʼnΉ݉.DOat݊%=QfzNj22DRhz، !4I`fǍ>]xޏ FZs.=`&8l.Fi͒?]v"RϔVGA%Yg H""n䋀pCmׇ-H΅<℟cBȃzS9%-C_̃/=PmhD+,T̅<߆ƈu9p#Ɖ}v9=jJKw,c9뎕)ƔylɔV|G Гۓ“]8,@ʒ_2 Б㑞U7ѐvvdg@ޏƏÏeUM1ԎqT4΍~jDI> ȌwiU>* ދŋzeR=/݊܊Ȋ~cG.މډ܉ԉɉtbIOO]rڋ&8Dlvnj!8Qmʍ&Heڎ+HgwՏ-Gmΐ.Wqё;fВD_$TƔjP葆A!q1O4]ʋ ;ibv?Ɔd腰k7ńa:#݃cE,  ,C`ۃ#(cwJBEew?򈃊׉ϊъM+Thmr{0d8#Ў􎵏8唀$oyZG#Ɠo\D- Ē~}M$ˑđz<#ӐxpQ='ҏÏPG.+ ӎ{aD.܍Ǎ^Y`A5 nj~^XG3 ًNjgR?2݊ۊĊgN:&Չ؉Չˉ\SH70؈Ո͈vgZR@9/-LJ͇̇ۇ߇ !-79?IJV]jvu͈ш؈ $.@BSd}ʼn؉ #2BRTs|ɊŠՊ 2I\vċ,ASdqٌ#4Pd)?\kߎ )H_~ϏҐ#.Uq| *G[ے*_tҒ?Y1bĔaA3 u%";.uS&H&gŋwTeFu>/k놆0߅Qۄ^F2gI0$ &4Kg *81s܄[I`%ʆoCtj-p݋A}͌`'0 Waޗߔ-nSv!%ݓmmhiOB풦nhX3‘ztE-ΐz~mM16яʏyZYM' ͎}mZ@2ՍэadbD6 ьcLD+ ֋ˋŋoU<(ΊĊnVJ0ԉщ͉ˉ{pVIB8و؈ӈˆsc]SF:1(ɇˇЇև܇ +4A>GFSVemẅΈֈ܈ *7EQauÉщ։(7GJe~̊ŊƊ.C[r}Ջ"6Th~nj -LWj؍1NVt@Yr4MXnƐ8Dg{BVz˒T}ʓ.\t^t[dݕLْƐRЏ5>G2q~Tx6ʉL ?݄dVA&ÃtaK:% ".>Tjƃ/1$*,M#lpm4-U݊^[VΊ!K_?ُRT.攚4|br')Ɠx]UJD'Ғu\7&ڑȑl\O ΐmusL)ޏYQT@ώ~hTJ2ՍɍӍsaVOF"ˌs@4# ڋЋNjfL=' ӊ̊~lXO8։҉щωmPFG@) ߈ۈЈˆxnhWL8)·ʇЇЇ݇߇ -69єxtm,,ѓÓ~~_A9 咾hFƑ_F& ՐrsEߏُُ[;B8 Ɏ~kTE0ڍ፾pmeT5ی׌jJ+ߋՋ΋ʋhOC'܊ȊˊoeZ?(։ӉˉoYOC?,و͈LjxmbTR<"χɇ͇؇ׇ$)6:@FLOaqpyLjƈ̈Ո +>FT_du|ɉ *6FPhŊȊ׊.8`ffϋ):Icxӌ /Qi~ȍڍ,>Fb~͎ !>Ӑ3Mamӑ'/J|ő:Kc͓ GoHpXuȓoX+ߑ4i`󋲋Cӊg̋{h0_VޅUՄ}TD/$؃|aJ3%   '-9Kaz؄"+ )V%%ք̅} [⊶<,6E:u^ŋ %,[9񍻎ah@X{xRvNka+(ɓL6#ޒВ~}S őQ&ѐnnZD/ďoP/3܎tjP8$ۍzu\P=,ތ׌^C$ԋɋkR@)݊ĊvhZH2ԉ͉ĉu\AG;.و҈zogbbE)(ćŇʇЇڇ߇!/27=BPXbmu}ˆȈΈ׈/FWi|҃$=E2GȄ "LĆŋ|Ћf[xÊՋ1-Zˌg"h, 2Hx*%ޔhx' ٓtg)ޒ’ycaGݑؑvla5$wdVP1 鏹~l\90ڎʎrmO7ߍ||{wkFЌnT/‹weN:5ߊrk]LH1ۉωĉ{WO<.*ވ؈ΈɈ|rlZTI<9LJLJ͇؇"()4auˎnetϏ 5exÐ5Rd̑2Vsܓ 5XzJo9ŔX?5?]ΐ+=ۍ!$B5OJ}ʇՇ;ㆩj3ՅX:!ᄰd<(&̓qdVG9.$   #*2>Narσxم), M3{F$@ي "׊f,=댝TC3󑰓ۗeʔ֔9f0nF4x9!Ɠty*eZA7ܑtcoL!&ϐƐWDI6#ۏ׏ԏ͏yWJ3- ܎poR>ۍm~z^K!یόό}rgS) ƋzaD+*֊֊ĊheaPB,߉̉fP7--ވ݈҈Ɉzu]RF6<ǡև݇އ #*1:AP[hem|ÈЈԈ!#8?H^huӉՉމ-CNcjp͊ي4>IXo{͋*Eejˌ,>Liҍ 8P^rՎ ZOoڏIfsȐ#Gjב'82,&!&.9BKU_s~уHDŽ܄:t冰≋C`㊞ΊuȊpԊՊ!?J⍖Ï̖rr{H0 ŋdC)+׊wul`YOB+ډЉʼnzeSF7,݈ЈĈwraYY/݇ćÇ̇ԇև܇!&2:9MS[^fpyˆɈ͈܈ (3:GZei~ȉԉ#3=Yg|Ŋ (=BO^q̋,Ee~ߌ&4C]wۍ/LO\Ď׎5#Rm̏+Q{֐-Uuؒ(4[ 1?^Ӕ NtTeД>ؓĕ\I_q 38;")zPt.[/݅_B( ӄgG2 ߃؃σŃ$1=P\^WI7019Oe+܆~eŠ=t󊀊⊯ߋ)S$L1j*Dk{"B̔lcx7 ϓgR@/ǒlGđ`B3)-ԐlP!ÏsC. ݎÎnW:% ۍƍэ΍vge^M, ̌vSE2"ԋ‹gE2! ʊuhjf[_^L6% ۉʼnxjP@4/шÈteN7‡ÇɇӇӇه !$19CJPUZcpyňֈ܈ %.6HY[qxÉЉ ,2EUYyNJӊߊ *=P`lˋ܋"7Pf{ʌ֌(2EmӍ=Pdyώ#6Jbʏ2Upʐ 3Qoő'B]vǒ8Ux Mic3evw>xlהіP,fpcqԊ9u{U톴\, ԅÅsK60̈́yXK9#ڃփ؃ #=GE=.  +AR`t5ꆇhbTWP/DM Ɗ()@S ڏ5%ݗ$H蕮{^0[ Ówzn`j:В䒿sW8ƑU:# ܐ֐ɐ|O:  ʏ~rvXG6ԎˎqZH:-ύɍ̍j]]O)ʌiKC7( ̋cM5(Ɗwukhd_dRW9)݉É}jOB5. ߈шLjňz{|jY7CƇ·桡Շ&$24?FJPU^jmu|Èψ݈ $2IU_lwމ19Pdq}Ɋ !-D[l|ً̋ #-AVnƌԌ &7^jݍ 'HVpz܏&Lc͏ 0FuÐ'Ddyܒ._ђΒ$`{Δ;ep`QC֔-vΕ_˒WI -֋Vc2#F6݆[(΅gVC3҄ziXK5#ԃуڃۃ݃݃߃܃ "9;#(+*/8Jhx҅?qz.Ȋ`:ԋG42(2"=lȌ*kO$EcUߔXsi;ꔫ~.H.˓“thRTEP6ӒlA*ޑ{LL0֐ːÐ[PBˏt]O9,ΎŽjTD>-Ӎ֍~o\YUC,،ʌkPJD2 ًƋy[D8'ϊqkhe\XZP5 ԉljpVF2'Ոψ͈ÈiU;JN䇨ćЇчԇއ),kvђ+aٔ->WTgYkFv1“I57 ݒ(3׎`'Mrqӈ:چb. օs[L3%܄˄o\C4.%  )-(,4CPׇʇćÇʇևއ %,79CKWY\cqtÈÈ҈*FTXbijw}Ɉ҈&8HLany}ȉՉ7ET]rwϊۋ',9FbkӋ "7N]uŒҌӌ=]lˍ,Oey{ʎÎێ:_t͏*>Y}ːڐLbwՑ@\j 8[q)ATAIJJ*[} IQ0_\NJ9gWcXwsՆ^B, mR<"  ф„qkiYVUU[Z_fjlfafrȄɄ=Zs wȉ:jCv؋`+Y~>:Fcx֌i>J!ˑTT9镟#ӕ.bGR5 ғqfR:-# ՒÒ`@!ёxyZ@ߐƐsJ6&* ܏ϏroYaO-؎ˎpO9C<* lA;CJ9ʌksWHA+ ыrSG0/ ۊȊkds]HFIIB2&ωuiR4"ψujSL؆lƇ͇ʇχ߇݇ "&-37@JS\dhtÿψ߈'6GO^lqwʉۉ*@F\atߊ/,4@TlwƋ݋,>Y_nŌɌڌ !>auǍ/LXnŎ׎ڎ'Vgŏ1cא9KkБ01Ig'K_qǓԔ?JHPW-:@d5Ô(ԈȈ{utX\N ͆.؇ɇŇȇ͇Ӈ  #+0/9MWa^kxÿÈЈ݈%)5ATVfpw͉݉ 1DWe~sɊ$-=Rfm֋$=Fei~ڌ!:XtǍՍ8Zdy܎4Olȏڏ 'NnȐڐ/Hdؑ5SYʒ"1VtÓ..6-M(B)Z_Δǔ]+ו N^LlVɋҋf}:[+y(Ć{`J0݅uqB) ۄ̄DŽĄDŽ̄ׄلф΄ȄȄ΄΄˄̈́τׄӄۄ؄لք߄>Mk\΋3&ٌN.>׋lU2MOQ֌=&ڎԏȐ]ƕɗ Up_h_.ƓœΓϓXZ\>#ǒĒ}{U1ב̑oUOF 琶|qZ* ɏxq}`JL?$ڎyeT=4#ȍčpZHG5ь~XTXXM2͋iYH.+ՊÊs_f\ZKI=>4='Չ~qR7%݈ĈzynV[.ʇчև܇ !(05=LV\ceqz{ň̈׈ .6COTk{ʉ܉/8T\uu (5MYoËˋދ6=Sajތ -Hq|Ս9Qdmώ 8Tv׏!?\א1QoΑ#9Jw˒/^sٓ 9,BBUyÔFihؓՕkQ摰ގdɋ>֋%,L}Շ{8ՆmX: ͅ~hYRF>)ۄׄՄՄԄτЄׄۄ!*SRއe6ZӌݍFËċH D*|KUL^dt.>ǏҐؑ`S֔o}oؔM7p(9$ԓidYHVI˒Ò{dVB#ؑƑrA2)̐ːhZDݏ}ikJ.!.܎ȎxiQ4'Ս~}g]E2یvTGFNO9%׋rX7%'ߊ׊܊ҊĊqc_^SPA99-݉~uS6," ܈ĈX\X㆓ÇBćƇLJȇχӇه !&-4=ON[bcoxzˈш(9BNVkt{ɉډ$MPzlŠӊ 3IP]ċʋՋ,3?Qb{ٌ2DWv͍ $>SjЎ܎:J`{ُ $CaĐ 7Ldݑ *ZtΒԒے5Tm4'N+5qu&\;|”(Vv>gKߑHڎr Ztˋ}ԋ*EdB↶p\D9*݅΅˅zfYJ;3/2+% !79Uqą*eEfP'.vԋz+[݌H>Ⓒ 0Ҕ{˔ppFJ~iS= xoZT?,"ВtpM%)ڑÑfmP--ᐴhbDE!ǏjIZ: Ɏюte17ˍэnlrY:ˌmP?6?L>/ʋnP;/1$"܊؊ۊŠ~pQdSPC7) 牻znM2+( ӈ`bI҆}mهć̇ч؇݇#&(0<@K[_gnyxȈ҉ω +/CP]hhrʉ؉$NSsqxʊߊ؊#ەFaהeI9ՔYFj,SBғʓؓw~rphH8%ɒxskTP!ԑˑ{XI0!/ȐquYYU>$#֏ǏXE3: ڎʎuXA(΍sZ_O-֌ڌԌ`ZL=EE<*ʋaH:3"؊usc\SG6& ÉueP8*( ڈʈˆst/Æ[Hه^ȇчć͇Շއއ$&/Oajjt҉݉25YmzʊÊ 4@ILhwՋ &6KhpyԌ&-RYx)2N~ӎ (;e%*8^ؐڐ).Liϑ77ZΒHi~ٓ# ( Ppfz>Ӕ.gѓݒ5\Еʔ}(lBcR\Q\džvfR>(܅݅ۅυ҅υυ݅օօ؅Յ܅݅Ӆ(J}oވIJ9 ҍWA ʋpCEz8򋣋ċy!H zkӗVa&aaq%1+ӓ~xgVV`<Ⓗld_EIʑzqRP/ ڐːڐkPMPQC*ۏďď_<:5Îʎx[F)!͍xeYJ>4 ݌Ռƌό݌[O><,;:;֋aI<6!ъjgYMD7+"މˉĉ|iQ:+' ܈͈Ĉta臼1>v"χ‡LJ҇чڇ !%1:AHPW\frz}ňΈވ (5DO`jp{ʉ؉ۉ.5N[`ϊˊ />GN^mȋыՋ$A_r "/@U\u̍)7E{|Ȏ&'&A[xÏ /IlӐ$'OZőݑ"7xŒǒޓ GT“ٔ!GH7.ؓДÓ>o3ՐKWik׈;؇u6膽|tm`J9$&/=QhxL@㊢qQZȍˍj  ɌGi니ыЋՋ}""Ǖ+=ߔ=MʔAs0,!ēē^vqTG+ђҒӒ`D6&ۑȑnmYC,ҐlZTLC#,ߏʏŏwjz^D30i|mR?(ݍ͍ÍoUHKC,݌ČȌ͌ތÌi;&+(%$2#؋ϋoXH4!֊NJxh]WM>2( ljlVB2&ˈˆxA򇹆&UjLJʇˇŇχ͇чևއ ".6D@KR[evv{ňLjшވ0>Q[hxxʼnƉʉ׉ (?DXhe{ӊҊ݊&32ETpxɋӋ)8Thřތ&2>Olƍݍ!6slxҎ*&3Ha~+8\yǐ)B`Ƒ%SdoÒђ E^|}̓(0Q]G7ѓo45Yȕޕ]ē)4(&8;w29䇀W+ԆƆ†Ȇņ҆Oy8y͋;[h<ʌ6faGɋ~֋͋Ëߋ4<ƍC򎺏c9ʔ{5 7ܔ>ҔN*o%4(ГœxxxecW<"tF/בڑh`[7%ːȐÐ~ezfZ2/ڏƏnX\_6$-ώ~haWS# ȍkJ>BB- 댶ȌnjY202,̋lO@0 ۊϊŠ}qcVI?2#)ӉlN:.  ߈͈ƈr,뇵'B~,ч‡Їɇ·ч݇ -,6BDO]howȈЈ +9CYcj|ÉÉ҉Ӊ+4>Tb}ȊNJӊ݊$2@OZhyƋߋ 4IXmvЌ +9>Y~Ǎݍ (WPh}ʎ܏!2B\nҏڏ=M~}Ő>Ogґ2H_{˒%8WgÓ ۓ7Ki- 󓏓bCє\%IkZ]G>]͏񎐍O!ˆL߇·ć5H}R{ _Rk׎aR?Ћ"jT Ԍ܌ )5gjꎯߒf4딅q”Ӕ2W4r5K"“Ǔ|mlmoWK:ڒВ|fSʑԑeM@2#ؐϐpTUWTF&ڏ⏮~]@H;#֎͎h]Yc: ؍̍g@33A:ӌʌЌ\5!ދNjiK?%Պˊulf^K6*#%щ}lT@+҈ψÈR܇&چ.]yχȇŇȇɇ̇ևۇۇ.6:FH`lnňЈވ,/>VdlvΉۉ݉'0:P\rNJҊՊ *8GQdy̋.Gha݌0D\`͍BKXlΎ 2=JgwŏÏݐ;\iϐ)CNhۑ+Cku͒ߒ'Gh|ڔ +=C/ݓޓx򓰓%=nRޓaSP SpY(r%dYǏ͎؍ IϋZXVGbЊ'^^Ď4@C6 |Gً\J`ȋٌ[8.w~C\s]G+EÔ$R,+Q$ד“͓iRbabD,֒wvj=葫zc5 ېǐI@D>??"ӏʏ{}gG<+ʎÎucT>IۍpH4/:3匽j/ҋċkF5& ފɊ|nhdSA:2/)'߉̉taK;0#ֈ҈ƈ? ƇD8͇чׇ҇܇"/1:HPTdp{Έ؈߈'-AQ_erlj҉,:HSlxNJÊʊ؊"1=Navҋۋ#=G\m}ʌڌ';Kf OAFdtĎ؎.BSgݏ'O[א! 3AQjoߑ8B^֒ ==ZtvrϓՓՔ839*ٓϓ<“ 7ߓⓐ> /꒿D󓚓"גrsyɐUV Ύ\pwď/ꎚ=ٍ_l닙k ׌m%)(%@}َFȏr+%fyO˖YssF1`ړ\K>:HFAՒ˒uhTX4ӑvaV*ސҐ}ZD=)'$Џz~`_RC31z|qS:0؍ڍэ~=.;̌ό}kQߋŋcM- ͊}lVUPC@690݉~fJ1!݈Ԉ<ۇۆ2i}̇̇ʇˇ̇ևۇ܇ #'/7=HW]oÿ؈߈2;HUip}Љ߉ '7IG[fɊЊ&5=^g‹ы ,5K^t׌ߌ4EW}̍A.4KwɎՎ5Dfsɏ4Kaz̐$7Bn~Ց֑ ;QmzĒޓ *@F]hbȓӓݓƓ ;Ɠ[3\G7S%V).Aȑْk{EړgÓo :䑬|Ő6{Ў~aPC &M:gՌ%2'k57ߐh`+CZ1۔w ߔRǔ >U2G3!ғɓ֓ғԓnlOZ[[F716.ޒxw}WI/&ڑőuuR'!saJ$ȏˏď||IFNK<4ώĎrs^=*8׍Íɍ׍s@ ʌ{A!݋֋ҋ΋ȋjX0܊ϊŊr\YQED;=5&≹iM2׈Έf ·ćڅ݆ DӇFևć‡χӇԇ߇  +6=MX]jz̈ވ1?GNdq~É̉ى -9LRetŊފߊ/=P[sˋ!KQil݌+>Of̍1%9`rΎNeuŏ (Wmxِؐ$0Pqvyđȑ'9) ׉ʼn|aE/܈҈ʈFԇƇj߆8pʇЇ̇LJ̇ևه"*6BRSamrň׈݈0=F\`pyʼnԉމ39CXao}NJ̊؊܊#:AL[|΋ #4IVnz،)Ԍph>2 ɋƋpj]L9يƊtpf_RLC82.Љ‰r\A/Ԉ҈̈Èv5هs)AهQՇŇƇ͇Ӈׇއ-;GQR_ep{Ȉ҈׈ /;JLVms̉Ӊ '0?VfpʊʊҊ #*:N_pދ2GUmuwی 5A_sč )FOmŽ !9QOÏ7QdpȐՐ9Eet}ȑБTZg}ɒے&55U:JORٓ+ Ǔgqk0J~KNpȓÔ,4bNǒg4YCQRZf9ܒYҒޒc̔]ϕnBcӕNdʔ!,*”U'FA ړHۓ֓oudM;LL5=6ْ̒P:P9#0ё̑ԑܑ֑֑shA;A$ԐxvT;+ ڏΏȏm\S^<Ўxm|[:EE эōȍRCLW<#یʌlYYLC7ʋËpkjR;(֊Ŋrtmk]XJE?+ ˉ‰ybS;,!ވՈň^2܇bHÅ9oƇχ͇Ƈ͇߇܇)6AKVZdm|}ňLjψՈ,=CCYjnɉЉډ  .=JZqyƊЊۊ ,BPcxՋ(@M`plx͌#;P\qÍ '*cˏ֏ #P{ː3E]diˑÑ"/FN|В+.9NE:DYWxwwhē ғufyg<3LOmܓQޓ`Raf):T_|[RF%Ӓd~z-Ӕ0F~,QiΕT#]+dꔗ0g@ݓɓד“ʓl~Wf:C5#+5Βܒےvlqk8*+瑶r\\N314 ̐dRaQ+ яϏzw^N=B(؎ώMVymO9& ؍Q;AAG׌όÌfE73=,΋‹oeP) Ɗ{|qmZO)"щɉyiWM;1' Ԉ3݇҇RƅFևQ҇LJχևއ-7=GMeemvxLj̈؈+6EDTfj|ĉЉӉ (0@LZdsxƊߊ  (4I]qˋ7CLdp|Ìƌ׌DRb}#*?Xriǎώ ;HuAcqӐߐ*>ISZfȑ-(O[jȒ#=%&\URܓ퓹v?BQ4"5iTIbΓw)c!yߔ?ؓun"0'CeCkB-OPh)󔶔R$1C9:,ӓ͓ړ̓ړ˓|v\WO@3Βkn]je8ۑȑӑБtwzOA4!吸}ieM->2 ԏˏs]tVP3َɎݎO8\^'эL.158ȌikR:F:܋ߋ͋ЋmWP3 ҊlZ8 ՉnVF2.) ƈ^% ԇuEхVƅ:l͇·҇χև݇ +67)܈Έp3Q>gׅSą9mƇՇՇՇׇ #4@DLY_hqzLjֈ $0;HUetʉΉى );DK_jqՊ(4CSk‹ڋ02FVmnjی+1JUt~ԍōԍ.FY\ɎĎ֎8&,َҎn]SC$7 ׍čww]RRA5ӌŒÌ}nnUCދً͋qgZG8'؊Ί|s_PF8܉Љɉv]O?@D9-Ј䈝O"χu8LK]>܇Qˇɇ҇̇܇ !4>@Q[`goxňψԈ߈28ENbu}ljԉ.8FXamzŊ؊2>Lexϋ 1IhČی%+8Nflύ(:ZW|Ҏ֎Ў,NZwƏޏ0Ldomdא%7DXdʑڑ X\ru{ƒےؒגǒ咺Β֒ԓ#-?7P^mrlۓړؓϓߓܓϓȓsvqbignw{˓Д  )"8KLL_CǓǓړޓ̓hz{g\arQjM2/%  ޒϒ[fhK@+ ۑ~}\FKD+&ԐzeF@29&(׏ߏxwVUV080ߎ|dq^<70# ֍ڍōfM:G?-ތьȌaVKK@8ًËsNOL< ȊΊ{i`NA6'҉ÉzvfNDGG8)ڈ҈~G懿cO59L؅Vƅ1n؇އЇ߇!28AEXZcnxĈ҈܈ '5BNXj~ˉ׉ى $59L^fq~ъ3>OZrً.;Xvь"-JYs{ȍ#F`pǎɎÎ*@[w͏ 3FDRbאݐ .LGfxđđ‘ݑ67NW]q}ϒǒ .95n}ēΓ͓є$ ӓē“Γۓғ   39 ГƓϓϓcvX,<]H@>ْϒvjD>970ݑԑxyiUJ,ڐӐѐܐܐǐ|n_U(  ~xwxQ/) ҎĎ_h\7&!ҍ΍`C(0/nj_MAIC+ 싴gS;;,ۊÊyshVNE:1#ىΉĉtoi_XQJ8% ߈񈯈f7 ᇳL_"5+`߆:ևS͇͇ЇЇ߇އ "-?;GRainvĈ͈Ո#/AFR^sȉЉ(6EPWdt̊ي +;K\n؋$0CVqˌ،$9anyЍڍ =Ubtxs֎Ce{Ə"3ؐАʐwV_Y_=̏ˏmU_\kD.! юpNMU6"ߍ׍VO/# ߌЌ}YN<93"ދɋx`M>7(ԊԊĊvvhJ>@0  މ҉͉‰qcfe^OC4 ߈] ͇aaF "!Pbͅ.mهև !)84EOYemuɈЈ 39CN^hyƉ܉ /7EQ`rЊˊڊ1GXdvʋ؋܋3ESqzٌ 5Lbpƍэ#5Nhtzʎގ$Ifqҏ$6_prא,9Pa[l~ّܑ$2E2%N_zvxu’ǒȒœ uvbHJ]KK/)S: ֒ՒywiehY4֑ޑ̑oK. ߐ̐АveEE><2ڏӏ̏̏m\?EDPD ގߎَȎގΎv{sVGSX#ލՍȍ{|{`J@4!֌Ќ{swf^@-+%֋ċx\L<6,$ۊۊʊ̊ĊvsgQEK:)ىՉ҉É~skrshM;8݈񈽈? ڇIb- 0d"ن@S؇ڇև݇ )79FOSiirLjȈ܈ *)2?OZbtʼn؉ (1ISelwÊˊ׊-AGhvЋ؋0=?UtŒی8OX͍ .Hmliݎ!,\^k5CIquҐِܐ!*-GUZnk|ӑ +N?jum]YOUoZגېzВ $2Mq“ٓȓƓ̓ݓÓƓagplrlOAAYmlRtubP.CFG]bZA@LjRU]o93@ ᒳplpqQDA1N6)ґבƑÑnoYK1 ڐɐzrWdF5L=3! ޏՏȏu}eSQ6=2=% ֎܎ʎĎ_dWhte<39΍zh}m\8% %ʌЌˌqYU`LB1&ދϋymL;.-'ԊÊȊzndfZ[;/ ݉ۉ׉|onk^C(鈢b+·pfI #Oqօ5q‡‡݇ "3;EMPhp{Ĉňӈ '2+;A//-69= 15')/22 6558C66K;  ͒’ÒВ~qT;WO+#'<ّԑ{qh\K@* ސr^Q:CS,$"ߏ̏wk^II/!%7!֎ώlX^f`N/#,܍ٍˍ{fk_YBތÌÌŌ{hWAISM3Ӌ‹Ë}`J9..'ՊĊyop^J@'܉҉ztoaSC( ƈyC#LJaj7/g(:Yև܇͇އ#09IDW]bzĈĈӈ߈(.9BUX]kyƉ͉ԉ-=HU`myĊÊ)9Meqz݋%6?osd^clZ=y871$ H0 '%%95> ےĒsgjdNB2"* Αđȑs]icWSC5ؐڐސʐgS349(  ݏ̏\xy]XE)!"%,ӎÎowmkdkZ[>&ۍ͍эčm\DRH匹kPD?DM?(ًËqlmYK=-#)ފ׊ȊŊy\?;*؉׉ʼn{s`N8( ꈠZ0)ᇵppK ņY(Wlх>p‡ˇ݇ ")=>LR_inz̈׈Ԉ܈  2?HZY\it|É͉݉'3DPWcsȊۊ "2CYcrƋ&4DVn|ٌ͌.gee؍'7GL[rxr~,-Jgp{{ďݏ,0Ydʐ͐ѐ&'2R|sÑƑ̑&85K/^P/H2EQ9:0\Vn’ߒ͒.48D>L YICFHA&ؒؒԒؒݒ!ؒ % ͒syws_II=B ߑՑΑ‘k{LTaL=9*%Ԑǐ㐧ytwn]VJ18D%ndcp^SC)" ׎ǎnVPcVQ[]?Ǎōˍny[8GK;茹|D. (%ڋЋua_fQ;)يՊЊNJiM>(%ЉΉ~{nTD;.׈>4Ƈmn5㆓̃ 5k EPևԇ'.3=GO^bkt|̈Ԉ߈#.9FM`_fuƉ͉܉,0HSS`uɊҊ܊!6?NVeʋ݋(AT`pЌ֌)`KkoӍ 4FVQkiq֎ߎ4MGglbxÏՏ AZomÐߐ֐$66:Hh[בޑ‘ɑ+@.A-:4*:<@QQPD6ՑǑ͑ȑiRgYHF83)֐ސɐȐzp_`VP??61)3ϏǏlynqtynOTG=<'(̎Ύَk]_OT[KR?ÍwkjS/&49͌Ԍy_syr`2 ڋċ{^YjY? ϊՊ͊}}m]PF6)܉Ή}wrcWH5,q:&χ}wW Άb 'S߅dֆCjˇׇ ,0;FRW`rpyɈ҈ވ )6>MOcor}҉ى )7?LYdlyŊԊӊي3:?Fcj‹Ћ =DScxɌ׌ S;Q_oэ-AMDZ]hwَ؎ 9;@GQdxŏ܏&QGTf{yzvːΐ  -Bkojfm͑ 3 1/*"?6LMZUObU[}ÒڒڒܒÒΒے’ђÒӒʒǒƒӒÒtqwusosbX404<$%1Αˑ~rB6F98& ̐kZYC;5(0* Џnnszt\\NP?22,$ώ\gKLXKK3 ܍ōǍaYF'ь}]VV`]3̋|opwa< ׊ۊ̊ÊvueSDB;/ މՉЉ‰hg[aXK'ሙI.‡; .j!ELԇЇ(2;DMWakqx~Lj҈܈"+8IQWhmxɉ؉/;GSYguƊԊߊ-;CSQl}ċߋ$JQYgzŌΌ/-HSWnǍԍ.9>VZbuyӎ(!%4@ZvyÏʏ6A@3:SQv}ސِݐڐ /BBcpjzyƑϑБޑԑёޑܑ #B9IOeaecZ4(2M#wXhjhySaYcjNE917Z`7^4QQ5A5(,6>@ ڑƑˑґˑpltR6A_F+ې~vVWG4<528" ӏ}skY\V@,!"Ԏ͎q`]NG=$׍ōeYN9͌ʌȌ͌pipkX=)" ׋ߋҋ‹`GBL@. ՊNJˊxknbB:-ԉljqliYNB6 ݈`6ۇO j,g@Rڇԇ%*9BGOYafrr~Ljш؈ .GdSIdft‘đ֑̑ϑБȑǑ֑  +2>Y'cV;/@E5Y@N7E2AG8UP 7ё%28!'ґȑ{uWH3 $>/ א͐ː}hw{gLPB* ݏՏǏˏzzxugWLB:6Vc2L+' "͑ґؑɑҒӒ)ݑԑӑƑwtaVoimUE20ސŐƐŐŐq_VG[iGD@>ݏۏԏˏ~z~skT@5.:"(! ߎΎʎĎsd\MTR?+! ލՍɍjfb6-挱zqf]`GJ. ȋ~~VF6)܊֊ЊƊgTB7(Ή}wrkK86-ۈ^W-ᇰP󅷅)̃&Z|4m DJÇ߇ $26;ER\hdiu{ȈՈ&2>E\ivsʉ׉#+48BM`n{NJ̊ي:FPZnwɋ܋>PYiČ͍9L_kyӍ$./9DQ\mێ"/Mgpw~ُ1+46kpxpƐِ##4^\lk~sXapo{ˑɑޑڑْ'$鑿ϑ ӑƑȑȑӑՑΑ Ǒۑבؑ‘őʑxp|ps`Zup^H;OKB6#Ґ|RIID?=:'" Ϗ̏ď|yqV_YB3ÎfjdLFL<83ȍԍʍoKB?  όЌӌrpeeQA2"ˋ~}mX<*ييΊ͊Ίm^K6'% ۉɉvvcO/6+fTDˇy#׆TC 6i݄/P݅`نFXw '03=EOXeor~ˈӈ܈",8BS`lwʉԉ܉&7CIZhtxЊ'4@FWbv̋Ӌ݋6GXfz~،(.;N[qč̍Ӎ*3>TQnĎю׎̎#DKQ^x͏Ïʏʏ֏-!1IO\bOe]~ѐݐݑ )CHO9,2OjePNYm_PYrsOcݑőؑϑȑڑÑ瑽ۑޑʑӑߑݑdPÑUPraT``jXRLAB%!'." ِؐϐx_\U6@9/$ ԏڏˏǏΏˏzh_ZI>8)ˎ؎}mcdaK=;(ӍڍǍύЍҍ[hjL06:Ԍʌ̌znukaA"ԋ׋ytomidN@ ݊܊Ê~{mWRG>( ݉Չ܉Ӊz^QGC')(ՈOD"䇬: ᅯKS~ ;mF؇B '.5@AJSbkry}Ljψ؈ #.GMZhÉЉЉ׉#.:LS^k}Ɋ&5DO]kƋՋ4=Dbgu}ьٌ 6HFPgwÍэ̍ލ :9P[q{}Ў77@If}ɏǏȏ64-@IH^cqwpoxǐҐ " 2F1!&9-($FXD=f{ϑőȑ̑ϑ‘|x‘^VTrqxxug{hjxrY\H<19 ގӎpxv\Y_IG6Ӎ֍ǍэōO;PA.($֌lf`VG1 ‹Ƌk\RSONE=*֊ՊÊxqdQD>5! ىډ؉Ɖ{g]LG>$-_P-LJ\҆+7ͅf5mڄ .NԅOԆ:Rp +38;MKYdqx|ʈԈ܈$&?FTcrÉЉЉۉ&-8FUTaxŠڊ)6L\gy΋݋*CU[gvx܌ÌԌ-@OXjȍǍ֍  #07^fsvÎЎߎ! ,R`gsΏ͏ޏ %0&*9BPMMG]zux~ǐې )4  $.CSOXfÑwjaP;gnbM^aktjaVoud@KXR*()-".'ސݐڐڐʐm_mgVF- ߏϏϏӏÏ}SMO;()&֎ʎˎŽqjtfRLO5DߍЍ΍ԍ~oQ9)?(ʌnjŒm_J=9/ċn`N7)#֊ъԊnbXJ@;: ډЉ׉xm]\WM)/Ȉw`Dه3aĂ߂Qz?i KwЇF%//FGPXbktzˆшՈو #/;@R]gxˉԉۉ&29ETY_vϊ݊ߊ-'ARdyϋ6?;KYdz͌Ì֌ߌ'(58Y_sǍ3+?RW[\xʎ "0BZo~ŏŏޏ%<738P[EE]ϐҐːƐÐΐ̐ǐ(,+':P_WRkfpwdmvfo|opzEA4IvVwwEN{Yn4a6TIDQVi[E3'%ϐҐѐygoaLI@J9 ЏϏwqgiWLJ;,ݎ֎ՎˎĎb^WOK/7ˍɍ܍nbV@9,1 ԌÌʌweM7;6) ߋϋЋ‹q`M   ڊۊ֊Ɋ~mXIA<52Չʼnx{rYcS<$)눜j_7LJX)Ȇ<߅;_؂6j~Ʉ(K~̅F̆>OkΈ #,1?ENV_gqx͈ֈڈ߈ )2:KTgrȉӉۉ %+86%@-"&7  ڐ֐ݐːȐҐ̐ːϐlNIJ]UC&!׏ɏ͏{gTQjlSR=4-,(юݎێǎvnWhWQ?48ݍ΍ڍۍ}cdif?('̌ԌnjuiU1$9'܋؋ɋʋhN\ZG,>7"݊Њmhg^U9.ʉtmfV.'*∔y_1퇿B4̅Dž7QK҂Ԃ/e|Ä$Kx32Xbň%-4@ESZais|ˆLjˈ݈߈$1FM[akˉ҉݉ "(*0nj{v|j]SB"͋aO]T8,3& ֊݊ngbRFB&ΉviQ>=xRLJ[?MGׂ̈́̂̂Em7Yo& Pb#و)"(6@GPN]fltzˆˈԈވ %2>IVbgxȉӉ&%0;I[hjvNJՊ܊ '.9H[ryƋ݋Ӌ"0BPVkopɌ݌ !37SWrx͍׍ݍ ?C/?Vc`}ʎ܎֎ߎ,=A?O_xbswvozqʏԏ0'>6EL^TXtnVV`pv}c[k{͐֐ːΐĐʐΐ̐͐̐ҐΐːѐڐɐϐؐȐ֐ܐא̐Ԑ֐SceN<@aKG3)  ܏Əy[XMP<($#/̎pzq_KVI=H9,ҍэԍu{dVCE:. ƌŌՌk`[N-#͋pb^K&݊ۊϊy_SI/#"։iMI(1$ۈ\0߇އP+b݃4ɂɂς*Zx(Jl##[هO(69@GOYchqxÈΈ؈ڈ#/8EXYcr{Ή݉!+,7DUegpϊ$6FWat~ʋ׋"58BVebvŒՌތ )DCKWjqōɍ؍+ -B=HZnώÎˎ -1F]`^^\hkuoarďˏۏ " !3+4MTJEJTUTGDclq[jS}̐ېҐː~rl{bLLFL0QF<16&ՏߏΏЏď{mpsnmf`QG#+7*, ܎ێ؎̎}g96A4),(ލۍ֍؍ɍÍzxfWhF//(׌ydeXL@ ۋNjË{bmukZSI/&# ԊÊ~gaC5" ىЉƉ~|iaY1,<zGۇLJlZ$=Ql ؂ɂ˂̂؂ ;fyɄ&%ZWچ'I_tȈ &$)99?GJQdbv{ɈɈֈ܈&4@NX_kx‰Ɖԉ-3BIXbot{͊׊*,9G\guϋ 'EFKMvryÌь$31G\ZuЍ؍ %1,/>myʎՎԎ+9BFMRc`X`SH[Zuw؏ߏ !79>Cj "fuLJ50 '%28>CGIS\isƈԈڈ"'=KN`jslj17;MY]m{Ԋ܊#0CLXqxċЋҋ59K[lez}ΌՌތ#30GXONmyэՍȍӍލ  6PpzƎَڎ0>G[\PEG@3E_fYhsx̏ݏ   "#31?K=-'6HEIH5HENPVXk\[^DR\RY\vjv}oovwwgnsjr{u_cI7J^\ENN>E1:L,09!  ߏ܏ӏˏFЏ|{hpvZ[557;<9<0Ў؎ݎÎs{ci`G) ߍԍǍʍӍ̍n|xeV^KADC7* ͌uZF>G>,D?ɋ}w\KJFL<5ߊԊNJÊws|kVL:/'Չ|tke;I0\4‡iPՆŅlJIڂ҂΂ʂɂ͂Ղ.^q2#Y΅?Ɔ 3gcĈ3'$2LYhmËˋ&6mNSXbiÌ֌ߌ.:28C\efstō܍@PUQguҎΎَގ *.6/+,$5RgWSc\f`ӏ֏ȏ֏ҏ     %#% (,1,;*#1:5&15T4!("9' ߏ ԏҏڏяÏŏɏzvtglVZ`ZYP%+2$ ܎͎ԎƎy}jneRRTE2.5 ލƍÍpta]QBT?:6ތ֌ʌŒʌ{qg\S1)33  ɋ~gVRO?C/ ϊŠfVIC>" ؉Љ͉‰va9L+ڈc+LJi$# ⃼*قԂ҂ɂɂɂʂ̂Ԃ݂"Rf3$Mu…7(s܇Fˈ ?3)3:HOQ[\es}͈ֈڈ &/2JOR[epȉ؉(.DSQds͊ي#0DJGYluȋӋ 5SD=CQew{njό%/9NBZ`ny̍ȍэӍ4;Y[Y_sˎێ ' /1GM]TbZitzzŏ܏ʏȏǏΏǏ֏؏Ϗӏ؏ݏߏ ؏  ݏ֏ϏԏˏʏxrscWA4,7@C@* ӎĎÎÎȎp]hd]\C<++͍Ǎnx[CH?-0( ΌӌٌȌČrjccV:!"׋ۋċo`N;4$ϊfYK=<+! ؉Ӊ{kc@U:mBˇph ׅugXۂԂӂӂȂȂȂɂɂςӂ5Zs9%dمHʆ#;B}kو*/.08DMN\enr{ƈ҈؈݈ )6>PTYcryԉމ*1EMS]huĊЊ݊ %94UP_dsyʋދ (?182GRjzoyuɌ͌ڌߌ(0?EOQZdpyʍԍۍ )2;ARfrȎҎێߎ &9@?LUS\bh^\_|׏ُŏŏӏŏˏЏ܏܏ڏۏڏڏϏǏُ܏؏ۏҏΏۏՏ؏ԏяÏtmqrmefbA1)%%#ێՎݎ׎؎ǎŽ{}tqjwnUNIAB(&1؍֍{{z~{vniR7<3#Ԍӌߌwf^b\J:*& ŋ̋niZSXI8$ ݊ي֊͊reVGE80.#ۉЉ~pP[\'ƈV* ɇ|Jf߄ۂւтт҂ʂłƂȂɂ̂͂ڂEc܄/+?pq;-fyLJ)͇8(*+6@IQ\h{ȋ؋ C+&->*܎֎֎ƎtkZYJKE1-.0" ۍ׍ǍȍxwkYOBSGV^.4D8. ׌Ԍ͌ΌɌƌƌxsaOXE6(Ћ~z~hM11(ˊڊъeR9-0)%ىԉЉωĉy^r^ zH*Ї}*u+t'a߂ւЂ͂͂̂ȂȂȂȂƂƂł˂т 7`|DŽ&:4gXBB@9:>MVOL;+6-*/%#FSPPA20&0@KVUTSTYUhojaaSGHB=\yfks_\HA5;@,8# ؎Վ̎ǎώ|y{rp_VUTFD>+/0 ٍ̍ɍɍ~ied[P@@A0'(  ׌ƌ{ndXR`hL6.''$ڋۋҋyywkbVI@-'ފŊ~ui^PTSF3"҉w^rXшj;ӇOU1gۂׂтςςς͂͂ʂłłłłłłłȂȂт9e҄.3aч492=DLP^dnxÈψو߈./6CLO^_puɉ̉Չ $/8CN`ju|Ȋӊ݊ 6@WN`\bsƋ، *21?9JD]a`usڌ )75EUejb^sxč܍ +4JOQ[RFVvtn~xzώŽƎ؎ʎŎ̎؎ΎҎю֎َ" /'#.;0$"!&)7;5=@9K_BPAB8(0:?J?2=F16 ΎΎߎڎώɎsl`HREG;;1?9-׍܍ԍ̍ǍjrhrzWSJOD2)+ڌތԌxhkmPG;@H+. NjЋˋ|~fb\Q=4+2ي֊ՊNJw{l_J>@@7% ىÉYjc9߈mG&*ۇ?g?5ׂԂς΂΂΂͂͂ǂǂƂłĂĂĂÂłǂׂJj?8N…!N<|҇BЇN=9ELSY`ipyΈֈ؈#.9DO[S_gq~̉Ή !**35BO]cq~ɊЊފ-1DMW[fj|ŋۋ&052@>FY[akx֌ތ֌ߌ#25>3/( ؉hx>ˈc&)퇴bYBڃ>ڂׂԂς͂΂΂͂͂ƂƂłĂ‚̂؂%XwM4qۅNԆ+BHqLJڈW6BERY^dltxňΈӈ܈%,9CIL[]dlp~ЉՉۉ  +*-@JTYetϊ*+4?FRU[q|ۋ̋Ӌ !68?VTKT^ut֌Ռ̌׌$03,21P\bZtÍ**@66$9;Zo`Ta\]orzi~pwĎǎǎɎ֎ώԎڎێ׎ҎώЎ͎ΎЎŎÎҎݎ  ֎ߎێԎ͎ĎÎ|{mhddethO@:1 ,!" ܍΍׍ύčwxstmYa_S@,،׌Čxuo\W`\M<3:*" ϋ͋܋ы‹slkWLE8& يۊъ{omfVLH2"܉ىՉtWc8%&ȇRꅾl{$^ ܂ԂՂ҂΂͂΂΂͂͂ȂÂĂ‚‚‚‚ÂÂƂ΂ >f~ӄ5AFH8rÇڇ6N@ISU\^emtĈ׈Јֈވ+2EDKRX_jz̉؉%):ORQQ\r|ɊӊՊ'7CDMXqwҋċՋ "6C=UXSZtp}ŌɌ͌ό، !#'5COHQ]wtpҍэˍӍ " =BH@OSSS^c^UU\W\^pqƎюʎێʎˎ͎ӎȎʎ͎̎ڎߎΎюÎ؎׎ގߎ؎Ўގ܎܎ώʎˎ׎ώɎɎŽ|tdfwh[ZK]QMB9&#ڍ؍Ѝύƍo^b\SUYRJ>;" ݌ҌҌŌӌnjrqlgZOHN?& ܋΋ԋڋʋ΋Ƌfg_OC*ߊ͊ÊNJxd[PIZD92 ΉщՉωphۈYB-ԇGp=X焀ۂՂ҂Ђ΂΂ςςςςǂ‚‚‚‚‚ǂтQiO9Z΅&2QBׇPχLKGNX`VairɈψֈ!2@IRUd_gw{Ɖ҉݉׉$18FKUcejj|ĊՊڊ!2?@G]_nq}͋ӋӋ &.8?LI^m_]myŌȌߌߌ&'24/:CI`my|čɍ #'-1+=;A6JCCNJCMec[lk_am}Z`ŽԎȎƎݎ֎ȎڎюߎَȎÎru[_SSVP\IF9,><  Ս͍͍ȍɍˍxsuaUTIC.C9M61)܌݌ߌߌՌxfeaeYKCD0 ݋؋ʋ׋ȋomnfYJ@( ݊̊ɊsYI645;1!߉ωщˉnp~5ĈaP" 釬boEă4قׂӂЂς΂΂ςςςς‚‚‚łʂۂ,\nX>q_8ROhɇֈHJPT[^]er|ȈԈ݈0IgXivlc_q{st~{}y{}~i`OcltrJFF+)ۍԍʍÍэÍx|spxjad[VLJC?.+,'ތӌՌތ֌{j\VNM?97-ԋ‹Njŋɋ‹zyugnfX9,+-& ׊ΊӊŊ{^H9/3>5 ։͉ɉljƉo^ƈyY,+!‡hمцnmR؂ւӂттЂ͂͂͂͂΂΂‚‚Â̂A_|τ/F;KMj‡ևԈ&SRQQYbirz͈و%::BLTa_os|Љ؉ (0QKeʇՈVZISccsvʈՈ$-=CLW_^ksˉՉՉ 48FAKMedj}Ƌϋыߋ$0;OQKJKO_dtxČŌʌ،֌  6++22Hfjop^ԍ׍ɍɍ͍ύ !"'$67<=E,5IBCG.J[^PD@K=JON@NOPKM79UVTC@ILFPJA=FNLBRC:AF7A5^ >^KakdR_ZK;26, ԍڍɍ͍mgq\YP@4IPL?D?9*- # ߌ،݌Ҍnjƌ{heaxiZOFRPJ7* ߋ͋ʋҋqknnYPPT[?܊ΊԊΊn`^T>7&! ؉ȉˉz<ۈb<+致ȇmdžy\(IۂԂт΂͂̂͂͂͂͂ςς΂΂‚̂ 9VyɄ-UEPNdۇވ'c]TbinxÈĈՈ݈ ((1@KVZhjr~ʼnԉى  *',6HXgxzÊЊϊ)6BBJL`_YiƋ΋ۋ׋'164==IEKS_gǔӌ׌Ҍٌ !2MQWV_uw΍֍ݍٍڍ+"<;((+3"014+)2*-03"361**2:+3@"78-,)(:A,ETia!*ZldMZYJ0.(.ˍȍʍʍÍ|ljlp_a[[E4+0-5:2.(# ӌ׌Ќʌuhha^Qb_MEEC;2' ȋʋ̋u{j_ad[MKD@0 ۊҊӊɊyvqc`XV;-%։Ήʼn̉‰{ẄjI!du?i߂قԂς͂΂΂͂͂͂΂ЂтЂЂÂӂF]QNKDž&XL؇6܇5[WY]ku~Ɉ̈Ԉ )1=>Rcgkr{‰ȉԉ("$*9@Jaox{}ʊΊڊ $ %=EOYRUvxċʋɋދ݋  )+969=;\lgjm~ÌÌьیŌՌ*1?C@Ecacnxsup|ōǍʍԍЍčЍύʍʍӍӍэڍ֍  "!   %)  .%*׍6Z/9AA)$ ɍyf_cTSLXRDE90!#!&ٌ͌͌ʌnjЌɌ͌yjbOcVRASRHA:-  ݋ًNjˋËwuesi`W^`OJ=%ߊي؊͊Њwni_SSEE5+"Ήĉ‰ocوyW+P[XnpzˉӉ  '$+3>MQihixȊҊފ!(//7EFuoqtnoƋҋً "50.BPLPWfo|Ōььߌ *+0:EFMX_cRNhn{~h~}ɍǍƍƍۍӍݍߍ֍ԍڍٍ ߍ؍Ύ Ѝȍݍ.P؍ɍoidrc\RIMK=;(֌ƌŌԌόŒuyygJOX?B2BB9;;( Ћ͋ȋuml^[]TbWAB;'ϊފԊˊNJzwnk[OCA<5+҉ljluw#ވW9ćT\D<σ3ڂՂԂӂӂ҂ς΂΂΂΂΂ςςςςʂ߃/Po]IzoXaf‡wԇ SgRifvȈʈΈ؈ &3@LW^koxƉӉ։ډ""-7EGccgfn}Ίڊ܊*'()&7Je]]k~~Ëɋً݋؋݋ڋۋ*#'81CHRXY_fmwˌ͌ӌ*+)+5@4AAVVYWaedmouqtt~͍ύ΍ڍՍ͍̍ڍэԍߍ؍ڍ؍׍ӍӍɍɍڍՍۍٍݍ؍֍Սʍۍ΍َ؎ ؍čōzč]d^7UhE@BD9A71'    Ԍ̌ɌŒqtvjttn_LO>B,87./6%݋ϋ͋‹xr|mle[]GJIVJ6-)$ފϊΊъ̊̊Ê}pqqb^i_FK.!  ۉʼn~/ňiB! ׇŇ|Æ j@M ڂւ҂҂҂ӂ҂ς΂΂΂΂΂΂΂΂΂ÂςKV\l}~ČÌӌ،ŌӌҌӌ܌  3,#084GTLM_[\^UMjxzÍ΍̍ˍǍ׍Ǎɍɍōʍ͍̍ȍčՍƍȍƍɍȍЍύ؍ȍԍՍȍҍ΍ɍύÍvS{@+@'(## یތόٌٌŌƌȌɌ{dT^[e\c]W?1.4@5,(܋NjʋNj~xxtspxf^`QQM:30..'  Ҋъъ͊ƊrfcWRL>:* ԉM̈qL/1釮{׆xDu߂ՂӂтЂЂЂЂтт΂΂΂΂΂΂΂΂Â҂CXK]Tօ<†7gU݇28_sooyLjɈʈՈ݈"%4EKT`fq‰ƉӉщ #-/BP\`ll}NJي%'/+-NAAAOTdnv‹Ë̋ы֋ˋ͋؋ 49-.)HGX[mmvwŒČόЌӌ %(3;?7?;;JY`xpysnygc{|ksύqfٍ|m|Gsa/$4r= ތɌҌ܌ЌˌȌmkdXMN\VG3#(#* ދ؋ʋƋyxjjmqiydSX\V;174-يˊNJʊĊ}~~skl^OH3-, ˉ~bֈW::'>*|넂"قттЂςςςςЂЂ΂΂΂΂΂΂΂΂Âق$Gb]Yd`IqYJJjyot~ˆ̈҈؈و 24@HRTYbpxĉˉ%..EKalv|}ϊ܊ ')E,78<>N]_i|zЋȋߋދ  4,:V[`^evnjҌ '&".4COBP\V`h`Wj[FPOQS]a`dldcl\luy}oxzuxjoq[vҍ}dvx\=x<ߍAߌ݌ӌьՌ֌֌،ΌȌÌȌ،ʌyt{ri]ehQF?=?E7842 ݋Ӌ܋׋ϋċysibZVahbOQGK;3#& ߊ֊Ҋy}vh_^WLI4$ ۉӉЉljs~0򈺈]F6-·k_^1҃.ۂׂӂЂςςςς΂̂̂΂ς΂΂ςςςςȂ6IjcVwvL]YgLJUimu|Ȉӈވ"00>NJVfkɌ݌ό͌ڌ׌Ԍ܌  %49G4;4644%@GHBJJQAN]Q:UAAFEF]MRLYihttjobQSTTT^_[UWf]JMS][kfb^iyevXZYRZGPdki6!""+!ό݌Ǎьڌˌ͌̌ڌӌvpkha^f`[MMS\TTNH47/,0 ڋ֋ϋʋ‹ywb\MDDDA10+.%ӊŠudrmeQJB9#,! ԉɉAqJ:6-􇳇ɇ݆΅s!bڂԂЂς΂ς΂͂͂͂͂˂˂΂ςςЂт҂҂ӂЂ;QԄEiYՅ5 `Z{ه#݇%d~ňɈ҈߈ $.GW^\`evxum~ËNjՋՋ̍$*4'19HX[[Wbjkulz|ČŌҌߌ͌Ҍӌߌ -# %*  31?@E@IBJA2F?;370:)63DDQ^]M8=PIQ3=5>FKLN@A84;EFC=:JPVCTaiZZj3A<9 < ,!ƌΌˌ܌ČČ}tcc\RUVdTCH9:D@G=9:5-" ܋ۋʋ‹~vszkhSI<882)!# NJyyhpi_UFC:44!ى܉̉WوW;9)‡̆X݂ւ҂΂͂͂΂΂͂͂͂͂̂̂͂΂΂ςЂт҂ӂÂ؂(BZQfbŎ9eRڇ8߇$g~Ɉˈ݈&1@BFR^_cjw։܉߉  )35CE`av|ŊЊ݊ފ "+4@NYOKUfilisnp}Ë΋ŋӋ׋ *7A:YKTaYW]]yqlx~zƌӌьҌɌÌˌ̌ӌߌ (1.(/. +44(%* $%%#/(,2":D.'71$!-#&',B<5NP$G;) ׌匽݌ٌyxuxvcT_KJ7=:>.)&')#1*#ދ͋ËNjygppl[NIA;.#58DފҊŠxgZJRGEAF5+ ։҉lj[눳~ZC88.'݊݊ڊҊϊЊЊɊwvmYRRRQMDG?.!"ډӉ̉ɉnvxFÈfUL4ʇއ톚s(a߂Ԃ҂ЂтЂς΂͂΂΂΂͂͂΂΂΂ςӂӂς΂̂͂͂͂ӂ)A>:5./4DJLgTf>׌cWA2 ҋԋ֋׋Ӌɋ‹~zobdflc]HH:382(# މЉȉpusM ԈhA>8ȇχƆvÄlւ͂ς΂ЂЂς΂͂͂͂͂͂͂͂͂͂ςӂԂтЂ΂΂͂͂Ăރ+BaR{ hՆIre;.cĈĈˈӈ݈ &06HLU\bfgmx}ƉΉ׉̉ى .633>LN\c_s~NJŠNJъۊ ! %)'88:>=OM^]hmn~Ëˋ݋(*  '/0#/h`ʅxSp`O+aĈ͈шو %*/:KUZW[aiwyΉщى !.,*4;KLJV`q|ҊԊߊ+&&*!$86DJTVais|wŋ݋ы "%)&$)6.30.MC49,DV^KNWnjieT`a}ort{{zwu{oqm{qskRSXVY`g{npo}xxjnZT[`khdfW_jkjWRmsqbs|}}~x}iaUWQHAMGMGV9cb?(%-925 (&# !W֍/I"ҌU' Ջɋ͋ߋߋۋʋv|mc`qjiPDID,A?3.&"!"#% ֊̊NJ͊ʊ}mrjcbhfN?05** щɉĉ\шoSC4ʇ_A:>DEBGFFNJLZgbZP`d[Sf``ttf[\V^b^XbTNURMKKNLTQRJbSPVX\KPX\JE>LLGOMLQVYNGZ^`epeqhdJA:E>>76*64=-GO$ ,!&  ߋ$.'"# ފˊȊ~jmg_YWUNV5-1+  ߉։Չ҉ɉΉƉt~TˈxVPCчiaEC߃Eۂ҂͂̂͂ςς͂̂͂̂̂͂ЂтЂς΂͂̂͂͂ςςЂӂӂтт΂2Dy( Yriȇ m·Nƈӈ߈ %$07?LNQ_hjzm}ȉщ؉މ#2,;DJKX_^ks|ŊŠƊŊʊъ݊  (4<;OGTTVX^oklkno{͋͋ڋ׋ʋՋ܋ߋ  #,% %*,+)73.,-$ 2:@;88KF-;AKSBCJOHA@2;OXA?B/:7.58625ETCI8EAFJDL0($&#&(&& $  ۋ̋*]zkrpYUR98 ۋċovo^UYUIG?KLWQiyzŠŊҊ̊Ȋ+0+/;CILL:GM[_]pvwËNjɋԋ̋ϋ܋ًً؋      !   ! !  "/"# ܋̋ŋЋЋŋ;$׋Ћʋ|d\EQG>;<3#(,+&! ފ܊݊ފϊъΊʊŠ{loxruuxujd][KDD9  ܉ۉۉ܉։ĉaka1䈭{U7F釳҆ cX oނӂЂ͂͂˂ʂɂɂɂɂʂ˂̂̂͂ςЂςς΂͂̂̂̂̂͂΂ЂтЂЂƂւ&9VۄDDƆ.mnņ%VLj׈ /4;AHNT\chnvyɉΉΉ׉݉ +$/ACFBHSbzȊʊĊ֊֊ $$'1;656<@VTZRT^]Sq̋΋ԋ͋ҋϋ݋̋ˋӋڋ؋ڋϋߋ ڋދًۋߋڋȋNjŋNjދ$4ڋόŋŋƋ‹ɋ~mWTH;:4(1"!# ي֊̊ȊϊNJywui``pdhcgeb]QKGBH0߉ۉωɉȉɉΉ̉~gwh.爮{S5B" ۆŅszAy߂ւЂς͂̂ʂɂɂʂʂʂʂ˂˂̂͂͂΂΂΂΂͂̂̂̂̂͂΂т҂ттƂ݃%;]߄MRΆ5jqĆ1SˆĈӈ׈߈ -47>KSV\`glq}Ɖ͉ω؉щ܉ #+18?=KZst}tzxʊŊΊۊ؊Ίӊ $&/:FGEHHBKPguƋŋʋϋՋɋËˋ׋̋͋ҋ݋ۋދۋ׋܋׋ދߋڋ݋ދًʋЋ͋׋݋ߋދދڋ݋݋ڋۋɋՋċƋڋً͋ŋʋˋrljmjg[X`R<6*"&  ڊߊ؊ϊϊŊĊ}xuwpfa[[LTTccRIE=4.)/Ӊωɉȉʼn‰bl2䈘qR<6ʇԅچoi!ނւ҂΂͂̂˂ʂɂɂʂʂʂʂʂʂ˂̂̂͂͂͂͂͂̂̂̂̂͂΂т҂ттłރ.>_WU׆5olɆ=$]Ɉ܈$.6=>JOWYfgvyzʼnȉˉ͉̉މ'++5Ma\kmcg{{yˋҋŋˋ؋׋׋̋֋͋ˋ׋ԋԋԋϋ֋ˋȋ̋؋܋Ћȋҋ֋ً܋ȋыӋۋ΋֋ًˋƋŋʋϋЋϋыԋ݋ԋʋՋՋ֋͋ԋŋЋ؋܋ڋԋ‹ɋ݋ۋԋ׋ӋƋʋʋ׋ًʋʋËorjty]u^Zdp~mcNYX[Z`S5(1܊ʊʊÊÊw~mf]VOLMKQRPPI5+&*'ԉ‰ʼnωĉ\f+술lF58͇‡߅Ȇs΄%قӂтς̂˂˂ʂɂɂʂʂʂʂʂʂ˂˂˂̂͂΂͂͂̂̂̂̂͂΂т҂т҂ǂ .=f` eFpgֆF%bψԈ%)29,)  ߉؉ωĉzVnl+숩p:2:؇̇φᄕ1ՂԂЂς΂˂ʂʂʂɂɂɂɂɂɂɂɂʂʂʂ˂̂͂̂̂̂̂̂̂͂΂Ђтт҂Ȃ1An]Dž+{SwoӇI݇%bLj̈҈Ո '59AEEMYlnqqwʉ̉ЉӉՉ։ %,(;WAAHPZ^MSW`iw}{{NJ݊݊ #"./4BKCLKPQWaiypytvx~Ê؊֊֊ۊيЊ"/*(?.):G7OQe_jm^iZrpfldmvqtqknryxkxxvnt}yxtyr{wxkalhbf_NVKUZSEior}ԋ/ȋҋ}fnS86+*-8IH3A:!׊؊ЊŠʊŊƊz{souk]URIALN@7102# &)Չω҉ԉ̉ʼnxafk5K)(·Ї0 ᆆ䄬;ׂӂ΂ς͂̂˂ʂʂɂɂɂɂȂȂȂȂȂȂȂɂʂ˂˂˂˂˂̂̂̂̂͂΂ςЂЂт͂1Bvqم?_{pۇQ;\Ɉшшш܈&*.4:AIR]^dgkn}‰Ɖ͉ˉ؉ /'-*1/9??IIOUacglkot~z|sr}NJƊˊ֊ۊيЊފ '3&764=GNJCIaWXaitgaUVee[TMdggaih]isw~tngpwz}xsj|~rusnppdrawsmflhopoowt}{qxlmy{~|||}}}~|y~|zx|xtwmc_\XVUZP49IKM+KGGc֋֋uxzcQ=9B')=(1*:F1 ۊ܊܊ފڊъϊNJxjtqkh`SMQJK@:74/+# މԉЉ̉ȉĉÉpwO[t:nG4)߇Ç1yꄰ@ׂς΂̂̂̂͂͂̂˂ɂɂɂɂȂȂȂȂȂȂȂȂɂ˂ʂ˂˂̂̂̂ʂʂ˂̂΂Ђт҂ς4EzsF_{tԇT7kʈʈЈЈ݈$&,/@@EHT[aacs{{ʼn̉ljЉ׉ !$5197>DNXUZVjioozofejoy}xŊϊ܊ߊ֊Ԋ!$)5317:?AJIKWVTIIVXTKEMLPDLMETaci_\P^lsguqijluvht}qrhtxbWqTJkaIOefcfnfolkba^KOV\`oln[EN^q~hgc__]j`g\auneYkg{qmvqi_eaTG8?W,:B+05ABA-.5Eh׋ɋe_4&" #8"CŠƊϊɊ؊Ŋ|umbnflmfkfYO@;A;8.-&  މωωЉȉƉÉwV_a0수i2% ‡Ç6+^<ւςɂʂʂʂ˂̂̂̂˂ɂɂɂɂɂȂȂȂȂɂȂȂɂʂʂ˂˂̂̂̂ʂʂ˂̂΂Ђт҂ӂ/CwKb{uχbÇ2`̈Ոֈ݈".405?CNYXbhiqx~ʼnĉɉЉۉ&+/4AAFAY`_U^fea_pj{swʊƊȊΊ؊݊  '$'/ ,44>BFCLGJ>3229?>BCEL@TUD8LXLQ`YXT^aaY\`pkZR[iZUfdWTGOVD93;Q;MVUPONNGJD987PPXQ>?AIPT\PRHQMUJHHRRINDFLFGQSHIHC4;,%2'?E+%*&"&Sx|ljqa{YuMD;  ;ӊϊNJ͊uszsgY^`WUPUQL:A1.)$&#  ݉ЉljÉ^ho<򈘈jC+҇ć8[$ރك<ۂӂς˂ɂɂ˂˂ʂʂ˂ʂʂʂʂʂ˂ʂǂǂʂ˂ʂʂɂɂʂ˂˂̂̂͂͂΂΂ςЂ҂ӂԂՂ/HzƄTj{ڇ_Ç=dĈɈˈ҈ۈ  &+,1;=EOQQ]bpz‰Ή߉܉Չ܉ *0538?CIK\RXS^\ookilquvŠ̊ŠՊފ݊ "$*.*3:64+"9%0*,2:9@CEDCIA8@E@?2?KEEEDQN5:CB@9FWPFI56: "2*75;8A@=5*<42-683@,54,7:6=73;:?4!*76-*56:01541& .% ",.*=rxoz^@XGYP$  ݊Ê؊shwpvnckhbacUOMA;7DEA1#%  ۉ؉ՉՉЉÉ~yrc`tB񈝈j9+҇@"EރL؂ӂ΂͂˂ȂȂʂʂɂɂʂʂʂʂʂʂ˂ʂȂȂ˂̂˂˂ɂɂʂ˂˂̂͂΂΂ςςЂЂт҂ӂق!1IĄȄ„R%iyއe‡5VÈȈԈڈ܈#%+1761'&߉܉܉ωω؉‰‰ĉÉubbx=݈X7ɇt2,N݃J݂ӂς̂͂̂ɂɂʂʂȂȂʂʂʂ˂˂˂ɂɂ˂̂˂˂˂˂ɂɂ˂̂͂΂ςЂЂЂЂЂ΂ςЂт‚ق 4K„˄Ä\-pwt܇"nŇ.ZȈȈψۈވ %"2<>PUWcigvyvw|ȉÉΉʉ͉҉ىՉԉۉ߉ %(1<=@@=DGQ[aVK_jj`jporurz{̊ɊҊ؊܊ΊԊ֊ڊ   &#    &.#         Ί̊݊ *95:)=&1 Ԋ ʊ芴rzxpu|q^TSNVVZNSF>4>LD=>6*(/ ډ׉؉؉ىɉljlj~PctJ删W3ч8K߃P؂Ԃ͂̂˂̂˂ɂɂɂɂȂȂɂʂʂ˂˂˂ɂɂ̂͂˂˂̂̂ɂɂ˂̂͂΂ςЂЂЂЂЂ΂΂ςЂÂۂ#1NÄՄ҄b3h}|%^$PĈĈʈшو܈  )69FLRN]dgsqlo}ȉ͉Љ̉ω̉Ӊԉ׉ "(743203A=F@>IKTTUXQaja\ch̊Ɋ֊ʊȊŊŠΊ܊يފ  ؊؊Ҋʊڊڊ̊ŊߊԊЊڊ") +݊Ԋڊ{q~zz]]\\HBEHPM?>F-0-%#% %$!߉߉ډ҉͉ɉɉω̉R_i@񈠈]<'ćp/$E݃O ڂт΂˂͂̂ʂɂɂɂȂȂȂȂȂɂʂ˂˂˂ʂʂʂʂ˂̂͂͂˂˂˂̂͂΂ςЂЂЂЂЂЂЂЂЂÂڂ .Nńׄ̈́l&cz|h(RȈЈԈԈ &%08:JDOJZ[cbinwxljljӉɉȉĉ͉ԉ؉Ӊ׉݉ #$')/%-.-86CDOU[Y]Ze\mx}ΊϊȊ݊܊Ԋ؊܊؊׊ۊي݊݊ۊڊ܊ߊ݊ފߊފߊي܊ԊΊҊЊЊʊʊ͊ϊъƊŠЊŊȊ̊ЊɊϊϊʊ֊؊׊֊؊܊ȊŊˊuxvWbbjk\JCA67@CC?007)+  ۉ։ډ܉ډljzMZe-ˆP$ 燹}z)8N݂҂˂ʂɂ˂˂ɂȂȂȂǂǂȂȂȂɂʂ˂̂̂˂˂ʂʂ˂̂͂΂̂̂˂̂͂΂΂ςςςςςςςςςĂ܃$1MĄ{ք҄j,ox݇ dهވ'PňΈЈӈ  &,-8;?BKDMPWbkusrq|ȉ̉҉щЉ݉$+"&15/1736@FLKZPPYcoiju}ŊЊˊʊ؊ӊʊЊЊߊߊڊЊъĊƊԊŊҊۊڊފފڊފߊҊъ܊ڊۊъӊϊ͊ȊЊϊي֊ϊ؊׊ۊ֊Њ͊ҊӊɊʊɊƊЊЊӊيڊي֊ΊҊՊӊъъԊԊ֊׊ΊĊÊ׊؊ϊӊˊϊɊƊÊŊƊNJފƊ؊يʊъڊΊ܊݊܊slcZRAO\IL9@906/('*'!%   ԉljЉЉЉΉs{Yrl|?%凴lv(ɆFރQقՂЂ͂ʂȂȂȂɂɂȂǂǂǂȂȂȂɂ˂͂΂΂̂̂͂͂̂̂˂Ђ̂̂˂˂͂΂΂΂͂͂͂͂̂̂̂̂Ă܃ -OĄ|߄؄b/tw`߇߈ExĈˆňψ܈$%/06;CDCOLZ`a_kjlvvʉ̉Չ؉ډ׉ډ  &!+ %(**2?KIMLKHg__aoot}~m|ʊ̊ъъӊȊϊ֊ŊÊȊϊ܊ϊҊĊʊˊ̊NJNJ֊̊ÊŊŠȊȊɊŠҊΊƊΊŊĊΊ̊ϊʊÊӊъΊȊΊъƊՊÊÊxƊʊ͊Ɗ֊ɊĊƊɊ{ww{mK@HH64B8>2%!$*"!݉׉׉Љ͉ʉÉÉxofKvl,o0ڇijυQ҃܃Mڂς΂͂̂ɂȂǂǂȂȂǂǂǂǂǂǂȂɂ˂͂΂΂͂͂΂΂͂̂˂Ђ͂͂̂˂̂͂͂͂̂̂̂̂˂˂˂˂Ƃނ!0Lx҄_-uzڇ\҇ш;hLjֈ܈ $&+/1<=>MLQ]Sadegq}Éȉʉډ։։ωۉ  !$2:ä׈݈#5+6469=?AKPUU`dopv‰ʉԉщɉɉ݉߉܉ $+,"04AC?EGDGUVUcabeadilwzzrohnl~{ty|{wpc~w{d`tzlgwoxyswyŠv}dmgQAB4' ܉׉ى̉҉ω̉ʼn}xvvxullebE2]H숔J Ƈg}…߅UτăDւ͂͂͂˂˂ʂʂɂǂƂƂƂƂǂȂȂƂƂǂȂʂ˂˂̂͂΂΂΂΂΂̂̂΂΂΂͂ʂɂɂʂ˂̂˂˂ʂʂʂʂł݃!-HTʄN zrч V·χ2TÈՈш܈ !"'+/5?6<>?LPPS[]`rz{ĉȉƉljƉωӉ҉ۉۉ݉ ! &#$,96:972ANLSOP^XJQWe[hfhdkrnyxzxt{~z{pwz{vfdppzvrglrc^Yads}i^_\elc`dah~r{cdeon}tqlinxrzsvo~]T65ۉωΉ܉݉ډƉĉʼnƉ‰ʼnzgafj`X]Qe=)V5Ԉ>߇LoDžنV:ւ΂˂ʂȂȂʂʂɂȂłłłłƂǂɂȂƂƂǂȂʂ˂˂˂˂˂̂͂΂΂̂˂͂̂͂̂ɂɂʂ˂˂˂˂˂ɂɂɂɂł߂!,IN˅HĆ}{ІZчч)O|ˆˈ؈Ո߈ !%''+.-1@5IIJTUcjqswyr}yljщщωˉ݉Ӊ؉ &%/0)-429B@C@G>CJDNQPS[\^lxjempnv{xvwwu|rvrn`Ykvzspt|y|mzq~|tvqqz|r~wv||ufdppnagbjigZS[ZZTV__le\WTZJKT[RVZQT6020BI5#2A8OJLUd]LIFcwXACK^bWFKISQOR_|ZYs{wcC ߉߉ۉ׉Չ͉؉̉ʉ͉lj͉‰ljȉ}yvyuqnihnojbgj^V>V.U/ʈs* ҇yBTچ/pY(Ղ΂̂ʂǂǂȂȂȂȂȂǂƂƂƂƂƂƂǂǂȂȂǂǂȂȂȂȂǂǂȂɂ˂̂˂˂̂΂ЂЂ͂̂̂̂͂͂͂͂˂˂˂˂Ăނ!*Ar: /eɆALJƇӈFNVXOOZSWZWEQTYUSb^gY`b`h``vo|inp~{ugdZOHLU\OQV^`ZPRSO[hbhphzfg^TZ\_SW`[^kWV[cXPTCMRMMK?GEE::9>;ADRnP=NamlueE; Չ؉ԉˉɉɉlj͉ʉƉzzx{snjhggd]`kje[ONOB?B ]·q?=چ7O0#݂ӂ˂ǂȂǂƂƂǂǂǂǂǂǂƂƂƂƂƂƂƂǂȂȂǂǂȂȂȂȂǂǂǂȂʂ˂ʂ˂̂΂тт΂͂͂͂΂΂΂΂̂˂˂˂Ăۂ(:o߄! &U߇.ü͇1\ÈĈЈ̈ֈۈ߈ !+)8@JJOWUYVm{rsxʼnƉʉՉ։ ')"&-",.48LFAAHJD?JG;>BLFLXUMFTO\XZWb^fhf`aph[ZUQHBIG:==>DML>F>CTSYQYUNa]aUMZYPG@DJIKD?KH?6=;?27C1.550(&3.&%;;:C<60"+3++ %%#0" !$0SV7B6&,BPE/*&MMEA?7#&.5=5/.*/4HKBEMC:FEOHMB236075?;,:86-# %('(#"$!#*,% 4UE#%)#! /.>4I`MYicb]R"܉ʉȉȉ}y~xu{|ythe`WV[[XRWXV\VNPQG3//!-1#ӈ7և63چ" ,pقЂ˂ǂǂƂ‚ÂłłĂĂƂǂƂƂƂƂǂǂƂƂƂǂȂȂǂǂȂɂɂɂɂʂʂʂɂɂɂʂ̂΂ЂЂςςςς΂΂ς΂͂̂̂̂Ղ!6ë́ j)*p9}Їȧć#EyȈLjʈӈՈڈ݈݈ވ "+B9Bڅ2لۄd݂ӂ͂ɂƂƂłĂĂĂĂĂĂłƂƂǂǂȂȂȂȂȂȂȂɂɂȂȂɂɂɂɂɂʂ̂̂˂ʂɂʂ̂΂ЂЂЂЂЂЂ΂΂΂ςт҂ЂЂт$3[ÃHՅ--Sۆ+zyчc·Ňو;pĈ͈҈Ո҈Ԉ܈  )./68@B@6=<758-# 1H߇|{X A򆾅օІ5Rӂ΂͂ɂƂĂłłĂĂĂĂĂĂłƂƂǂǂȂȂȂȂȂȂȂȂȂȂȂɂɂɂɂʂ˂͂̂˂ʂɂʂ̂΂ςЂЂтЂЂ΂΂΂ςӂԂ҂҂҂!+X8Å*6B†2pzȆOÇȈ/YˆˆʈɈЈшۈ &)$2757ZJBONRTP]geclx{x~~ȉĉΉ͉ΉΉ̉ЉƉȉĉɉɉʼnƉщɉ܉׉ۉމ    !###    ߉މډ؉މωډ̉։щ̉Љԉ։މ։މ,  ډՉ̉ʼnz|qnoqjhnkeUX]ZYYY[WSQGLDBB>95247791'*()5,$5񈋈0̇rqqN䆚׆)tv9ق΂ʂȂǂłłłłĂĂĂĂĂĂłƂƂǂǂȂȂȂȂȂȂȂƂƂƂǂɂʂ˂˂͂͂̂˂ʂʂɂʂ͂΂ςЂЂтЂЂ΂΂΂ςӂԂ҂҂ς 'M~߄DF*Y1rŇÇ"M|ƈňшӈވۈ؈ +...H9;::96=JEFS]TWaecmecj|wljlj‰͉҉ډ҉ЉΉӉډى߉ۉۉ݉ى؉։׉ډډ݉ԉ҉҉ˉʉĉĉ͉ˉʉΉȉʼn҉݉̉ʉωԉˉljƉщщ҉ɉĉ؉؉̉ʉĉ׉ۉՉ։ԉމ͉ԉĉÉu}t|wuqldcb`gUV[[YZPPNHGGHPME?637) '&)$ ݉d ԇjliW͆ x#т͂˂̂ʂȂƂÂÂƂǂƂƂƂƂĂĂłłłǂȂɂɂʂɂɂǂǂɂɂȂǂƂǂȂʂ̂͂ς΂ʂɂɂɂɂ˂˂͂Ђ҂҂ттЂ΂΂҂ӂттłނ!6mʃ`DR`>zyχZ͈.dÈňLjՈЈֈ؈Ո؈ވوވ  +<")14B;A>MJGHNOTLST]oqzoqx~ȉljʼnĉʼnʉ܉މ҉Ήˉ߉ى։ԉՉ؉܉߉؉߉Ή݉ˉщщӉ߉܉ۉ҉͉ʉ‰ˉ̉щՉىɉÉĉˉ‰щɉȉȉ҉ԉ߉Ӊ߉ԉĉ׉ԉʼn}zmikmqfjgb^ZTON`MHKNOSMFA<<@@=:/+0+$&!# Lj㈖;ɇjlfI 򅆅ÄӃaӂɂɂȂɂȂǂƂÂÂƂǂƂƂƂƂłłłłłƂǂȂȂɂɂɂǂǂɂɂɂȂƂƂǂɂ˂͂Ђςʂɂʂɂɂʂʂ̂ςттттЂ΂΂т҂ттłڂ#/c5>[Mʆ8f{Ԇ?‡%EpÈLjˈɈˈшΈψڈ 2#!*3-5;889<@=@ERUO[b\[cnoquq‰ʼnʼn։݉ЉӉ͉Ɖʉ։ԉ҉։؉މىՉ׉ډۉ߉ۉՉ҉̉Չ߉ىӉމۉ܉ىˉ̉ȉʉۉ̉ԉʉljˉωĉՉԉˉ̉ĉމʉyu{|lbdble\ZRSRPEKLZFJBDBB=0,-+,+ )+$  ㈶ʈu#ˇ~ci]= ܆Dž ҃K ڂςʂȂɂȂÂÂƂłÂÂƂǂƂłĂłǂǂłłłłłłƂǂɂʂȂȂǂȂʂʂǂƂȂɂ˂͂ЂЂ̂˂̂̂˂˂̂΂΂ςςЂЂЂς΂т҂т҂Ԃ(Tބ!-_T0a$n,euĈĈƈƈňΈԈˈψۈވ'  "&- %%%(21.>=MDMNHSSZdciqvzy}vzyщʉʉƉ‰Éʼn‰ʼn҉͉׉͉ωщωЉ؉։ˉՉʼnʼnɉ҉׉ډى؉؉ˉʉىΉ͉ʉ̉։ljȉÉЉȉʼnΉމԉvunf\SRYMOFHA?B9:s3Zqˆ͈͈шՈ    "#'%+./9AEBC>GPTXZYaostsqjgvwqwz}x~xwΉljƉĉ~v|}||~{|t}uuvo~lponrtqibggxxvxqoqtsx~{jqxyz~xf`cYlk^VRQQ`L==G295.+/)(."%'"߈ވ܈ɈψЈ߈LЇ\KT>(݆׆…󅏅酼t܂Ղ͂ȂƂĂ‚ÂÂÂĂłƂłĂłłłłłĂĂƂƂłłłłłƂȂɂȂȂȂȂʂɂłłǂɂ˂̂˂˂ɂɂɂɂɂʂ̂͂͂͂˂˂̂͂̂΂҂ԂƂۂ1^ۄ&2ty6lه"fوIc|Ȉ͈͈Έو܈  # &'-;02;34KBIIBR[`llaaV[kumnsnoszy{vxq_eXXpzvmnxynmpyvxqvvs{xzzh`mqwtnosqnqfilf^^`aXhd_OF^^`afg[_\_jppndXbhug_effpzƉzbVWVSQOMJ@HIEOB7:00,*'*)' ވ׈ֈ׈҈ӈˆň׈͈'䇻spNQG4ՆՃP؂ЂʂȂǂƂłÂ‚‚ÂłƂƂĂ‚‚łłłłĂĂƂƂĂĂĂłǂȂƂƂȂɂȂȂȂȂȂȂǂȂʂ˂ɂɂ˂˂ɂɂɂʂ˂͂͂͂̂̂΂ςςЂт҂‚ׂ&PЄ~lxi͆PCdüՈ͈Ԉ҈ #(++&13189<=C04@82834$  ߈ۈ܈ڈֈ؈ՈΈՈ͈ΈވĈa ЇhR5H;&݆ՆІ݆AυBV>Ԃ̂ǂÂĂĂĂ‚‚‚‚‚ÂĂłłĂÂĂłłłĂĂƂƂĂĂĂłǂȂƂƂȂɂȂȂȂȂȂȂȂȂʂ˂ɂɂ˂˂ʂʂʂʂ˂̂̂̂˂˂͂΂ςЂЂтт$AmǃFׅKtۆW||1w܈5ShsˆňĈ͈ȈΈՈ "*"'.01/)=;7@@HSH=84A@F?GLIHJKKIEMWY]bid^edqzeUNGCHC;7>9E6=;41/,,8-+)" ވ܈؈͈ˈ҈͈ʈɈˈ͈ψȈʈ}5Çua62:#؆΅䅳 {,тʂƂƂ‚‚‚‚ÂĂÂĂĂĂ‚‚‚ÂĂĂĂĂĂƂƂłłłƂƂǂǂȂɂʂɂɂʂʂǂǂʂ˂̂̂˂˂ʂ˂΂ς̂˂˂̂˂˂ʂɂ˂̂΂ςςЂɂ.`ք5=vԇ_LJ@VmzLjψ҈؈ވ $*(32.%018GITSXUW^]\_YXYnnhuJPy/1][cjtvvsammenrvyzpvz{u}mtppaimehhjkikqrqenkigikgphd]]hbcjb^WTSQVNTSQRTT^MFMNC>A?:CJG=989=FDDCHH>;@690+262;6/0*/317=<0/,+,5227=9=<=>B<96?FKILRKFLJIBC@=3.20,6G?E=34&-*& ߈܈ۈڈوԈֈՈψˆȈňɈʈɈƈY Ӈ}^F+3)ֆЃZނՂ˂ĂÂÂÂĂ‚‚‚‚ÂĂĂĂĂĂłłĂĂłƂƂǂǂɂɂʂɂɂ˂˂ǂǂʂ˂˂˂˂˂ɂʂ΂Ђ͂̂˂˂ʂʂɂɂʂ˂͂΂΂ςǂڂ%Q|̓uquydž9߇!D`itЈÈɈʈ͈Έ؈ڈ &&,&%#13<97>D:2' /?>31623 *8+!" &.*"!* # )*()$)(&*0-.3441"0-;979F6112.0**((+(,34)1')+$% ވֈшԈψÈLjЈɈЈňLj,^G"%40…ۅ?V9ւ̂̂Ȃ‚‚‚‚‚‚‚‚‚‚‚‚ÂĂĂĂĂĂĂ‚ÂĂƂǂȂɂɂɂʂ˂̂̂ɂɂɂʂɂɂɂɂǂɂ˂͂ς΂ʂɂȂȂɂʂ˂̂̂͂͂͂͂@s>ׅUƆFՇ"kۈ*J\fLjˈʈ͈ӈވ  ! .02.183@.?C68/$"6-<9ADFFA?IIHJXg`eem\NOWVJQT\ZURBIXMLCGJGDK=BDPLH;492A/"((884$ .+21/#!               ۈو߈݈Јƈψ҈ʈˈĈÈƈÈ.⇨sS= 񆥆aυS|̓T݂ӂ͂ȂłłĂ‚‚‚ÂĂÂÂĂĂĂĂĂĂłłłłłłƂƂƂƂȂȂǂǂǂǂǂȂ˂̂ʂɂǂǂȂȂȂȂɂɂʂ˂˂̂̂̂̂̂̂̂̂̂̂̂Ăڂ &M}]߅XՆgy/b$H[`ɈЈЈԈӈڈֈ؈ڈ  $%.305-45.+(0#:,!1"+"--489=)GQN?EYcXcgXZYHBFBDKJI@:<@?<73B?;/,2.910*)*0* #!$ "    ׈؈ڈوΈψɈˈȈkV ·[I~-3Ԃ̂ȂĂĂ‚‚‚‚ÂĂÂÂĂĂĂĂĂĂłłłłƂƂǂǂƂƂǂǂƂƂƂƂƂǂʂ˂ʂɂǂǂȂȂȂȂȂȂȂʂ˂͂͂͂͂̂̂̂̂̂̂̂Ԃ@4#-5A;57@DLGDB0*/;3/"  $*,*)%02"(' $"&!  ܈ֈ҈و܈Ԉ݈݈و҈ֈވ܈ۈ؈و߈݈݈߈݈܈݈߈ވ݈ڈ߈҈Ј׈ӈ͈̈ȈˆÈňÈnrYDqO3 ҆irA> ڂ͂ʂƂÂÂĂÂÂĂĂĂĂĂĂĂłłĂłƂǂǂƂƂƂƂłłłłƂƂłƂȂɂȂȂȂȂȂȂǂǂȂɂ̂͂͂͂̂̂̂̂˂˂˂˂Âق HnЄ-C-}uφ>w~{Ň܈:OWjynmpvm{vĈɈʈˆȈƈш׈ۈވ݈ۈ߈ވ   ,$#0"-1/49<.*%*'%" $$  ވۈ܈ڈЈ̈׈׈шΈψшˈˈ̈҈ӈЈʈĈˆֈ҈҈ψψԈΈӈֈψLjɈňшՈۈӈوֈۈ؈Ո҈ˈʈ̈ψԈՈ͈Ո҈̈ψԈ̈ψֈ׈وՈ߈وӈڈˈΈ҈ňȈƈɈ̈ȈȈqwLd_LJL.ƆwfeiPoՂ̂ǂĂ‚‚ÂĂĂĂĂĂÂÂĂłǂȂȂǂ‚łƂƂǂƂƂĂĂĂĂłƂǂȂǂǂȂȂǂǂǂǂȂȂƂǂȂɂɂʂ͂΂ς͂ɂɂ̂͂̂4cnƅ߆Jup؇"Wt|ɇXxmZdlqziqrq~ƈÈňˆ͈ˈ͈ш͈Ȉۈ܈وۈ܈ވ   ވ׈ʈňȈʈˆˆ҈шˈʈĈʈɈˆˆЈʈƈƈˆ}~uhWwvC^lDp;"ۆ܆冷hICMEj'҂͂ȂÂÂĂĂ‚ÂĂĂłǂȂȂȂƂł‚‚ƂǂƂƂĂĂĂĂłƂǂȂǂȂɂʂɂɂʂʂʂɂȂǂƂƂǂȂʂ˂˂̂˂˂ɂɂ‚؂ ;eeޅYʅ?ln؇#apjhʇ);?^teXiqcjlwr{}{LjƈňȈ͈و̈ψψՈˈψшՈ߈؈ۈ؈   ߈؈Ԉψڈ܈ЈɈȈɈֈ؈ĈĈÈň~|}m{}}xyvpjhfMZpBCmaȇB!نԆƆC0[~ꅎ*A݂Ђǂ‚‚ÂĂĂłǂȂȂȂǂƂ‚‚łƂłłłłłłłƂƂǂǂȂɂʂɂʂ˂˂˂ʂɂȂƂƂǂȂɂʂʂ˂˂˂ɂɂ΂(Sx˄r|Vz=ehaqχ44IZjT\^jhokmnl{}~ĈȈΈɈÈƈĈÈʈΈЈшшوڈڈوۈڈֈۈۈ؈ֈڈ  ߈׈݈܈Ԉو؈ވ߈߈׈ۈ͈ˈɈ͈̈׈ÈɈψɈɈňzyrvtsqpkyuqsl]UGHqQ3V]9퇠I'҆ʆӆ͆`5=o":ۃhԂʂȂł‚‚‚ÂÂĂÂÂĂłǂȂʂɂƂłłłÂĂĂĂǂȂȂȂƂłłƂǂȂȂʂʂʂ̂͂͂̂ʂɂȂȂǂȂʂ˂˂˂˂˂̂͂‚ڂS$B?n1Ն†džlB>f{yfƃVԂ˂łÂÂĂÂĂóóǂȂłłƂƂĂÂÂĂłƂǂǂłłƂǂǂ̂ȂȂǂȂʂ̂ςς΂͂ʂɂǂǂɂ˂˂̂˂̂̂͂Ă؂2\{Ԅ-,_mn݇NkU_ #3.P`GR\\[clhjglxqyyz~ˆˆɈLjΈɈψĈ̈ʈLj͈݈ӈӈшʈ͈̈وʈƈψňňȈΈˈˈˈ̈шɈш҈ЈΈʈĈ}yuvrz{}xvsy}|{qzwwuuvz}|zxvsqpntwrruocmqswlnhabbbenhc``ecf\Z\^aa[Y[^fijgh[VSKDKOGDB?>,+<)<ه5 ҆ņzd@\-xy;:҂ɂǂ‚ÂÂĂĂĂÂĂƂǂłłƂƂĂÂÂĂłƂƂƂłłǂǂɂƂȂɂǂȂȂʂ΂ς΂͂˂ʂȂǂɂʂʂ˂˂̂̂͂ς 'OnQȅRą U9XREoȇ$'4KTRY[V[XYafi_vht||ʈˆˆňˆĈƈˆɈʈʈ|v~~{livxx{}vy}uegukqmrrjogurmkjkrtuppqvsjfdgine`ac[cjkghf^`Y[ba[X]SSSXSUSGJNPPKSV][aW]SMDB>F:?1'-09'$䇓9׆]BAWԅ|~J΄$H݂ЂȂǂ‚‚‚‚‚‚‚‚łƂłłłłĂĂĂłƂǂƂƂƂƂɂł‚ƂƂ˂ɂɂǂǂ˂̂̂̂̂˂˂ʂʂɂȂɂ˂̂̂͂ł܂6`DŽ`ͅbֆCa\ч EPJPy!"1VQLOKHPXSV`cpnuvov{y|||tnzumkw{vwnfekmofmumekfcjoae`feX^`pjc^^fcfgffgmfhW`a`W[Y]ZRX_a[]PWSUW^]OLRGLJGJCB>FLLE?DDGCNGPJK?169$%1+ ㇛D ކXC!Hu`VɃ`#ڂЂƂ‚‚‚‚‚‚‚‚łƂłłłłĂĂĂłƂǂƂƂƂƂłȃÂɂǂɂɂƂƂɂʂʂ˂˂˂˂ʂɂȂǂȂʂ˂˂̂Ђ "HnЄuXo$HTINw߇%#4JHAKIQKU[djcfeisowuz{}~|{{wsnnpvuqecjhnggYVU_YZ[_ZZ]]\a]TSSW\ST^X\[VWX_``_XXZbbTRY[YVOSUMJPTMKJNNMGJOJBH=C=;956=?<5476778A;CJ>10$ ㇇I↥zJ5$:v|"}1؂͂ʂł‚‚ÂÂÂÂƂ‚‚‚ÂĂĂÂĂƂǂłłłłĂĂĂłƂǂƂƂǂǂłłǂÂƂȂȂȂƂƂǂȂɂʂɂɂɂɂȂǂǂɂʂ˂ʂʂłق /Rt-@φ)Xy&IROlׇ#6DAFMOML\]VV^fdcnzxqtpryxx|~}yoysn|xvyst|vopghjkmk_f]__TMEMNMMKMRMNLHJQVOJMMKDGHJTNNMLGNQTXTXVROKJQODELQLED>ELFDCC>C>B9<=11+6510127/).,+0&*40""Ӈ쇖Jچ~K%ކ%y|?'EނԂȂ‚‚‚‚‚ł‚‚‚ÂóóƂǂłłłłĂĂĂłƂǂƂƂǂǂłƂĂȂƂƂǂǂƂƂƂǂȂɂȂȂǂȂǂǂǂȂɂʂɂȂ͂5[z b,qPz†/W_Mg&/CABFMUNO\KW\[brpjggenqtny{ryz|yz}}vszx{utq{rqmimleimdbstonmoi_rrhed`TZSVLHEFKDF=DDMGD88CGEDBEA79;AB=<>:AB8@HKIGD=@HIJEHOQNQf^a_`\diqjkxtolmvtxzkpntqmqxq{}}||{r|}zy~swz~zyqwyegxg__`cfhjn`]b^X^^^\X\eh]STMSQGD>GE>5/;737?2.33..246147('24/095410,79>=61=8;/.4::53,/'-2-''++*'&%!$! $  ވ뇪FԆ}~|r9󅾅΅nLVуj.ۂ΂ƂƂ‚ÂĂĂĂÂĂłƂłłƂƂƂƂǂƂÂÂĂłǂȂȂȂǂǂǂƂłĂÂÂłƂƂǂǂǂǂǂƂƂłłǂǂƂƂƂƂƂƂĂԂ $Rw=(QG[JE1Mv‡ڇ '4;@9;DG@HHWYVVZW^a`bgijeV\igobbsmnlmopkfoqyqmhovrvsuuyspzw|nnulmqxo}~z{~{x}uwuzxzznqpohww~tmnwzl`V[dmljUVgYX\]]_f_[^TWUUSWTNLIDJMD;24A532)-''2,*+!!'$%$&-("(#"#%(+,/.#"0%44(+0+)*(/1,/-*"( $(%"&     ӇLJN̆tg:ㅶކ ͅyuXn߃z4߂тȂ‚ÂÂÂÂÂÂĂłƂƂƂƂłÂÂĂĂÂĂłƂǂȂȂȂǂǂǂƂ‚ÂĂłƂƂƂƂƂƂƂłłłƂȂɂȂȂƂƂƂƂʂ ;cHIɅ&sHm0?B?AQQUXSRS\VZc^^W[U^_^bfccdeiibfhjhmcijhszviwqcisq{jongpnormqjitsnnqnolspyvpfqnjokdlb`iabhje]j`gRWLSQciY^Pf]T[TUWTJEJNINGGNHK@88:?:3480430)+$&##" !%%#%#$"" '%$ #$   χʇ臕HφsvX5兡ׅd]@ ւ̂Ƃ‚‚‚ÂÂÂÂĂłłłłłÂÂÂÂÂĂłƂǂȂȂȂǂǂǂƂ‚óƂǂƂƂƂƂƂƂłłłƂȂɂȂȂƂǂǂǂłт #Bh[kՆ6zx\i‡2450Keuч />:68@FIFFNEMQXVQMSTTOQ]RY^]RMYXccXWZa`_^^_cgyoihmYZcog]Y[Xbbedm]ccce[e[VdegdiggrzrhkW^k\^^[YRR]V^X^P^[\V\^\^\WURPLRWJ:GC5;88866461,(32%$        ڇ퇽Ç߇LstgV,ׅ݅_N Lւ͂ɂ‚‚‚³Ƃłł‚‚ÂĂĂłǂȂȂȂǂǂƂƂłłƂǂɂɂȂǂƂƂƂƂłłłłǂȂȂȂȂɂɂʂƂڂ #GiՄq %)6tsXpņ/>)'Mmy͇(*12<@??=?CEEITGMMLGLNRPURLFJSUWWTFNW[ZZZ\ae]b\\[[][SNNTNKZ][\^W`^SR]WS`\]\b[ZukpqaVa^aZYXVPLVWR]XbUWUYGMIYXNIHF?A:70/,*++/()! '           ݇܇և܇LJ释;zhf]B&څɅeY!Oւ˂Ȃ‚‚‚‚‚‚ÂĂłłł‚‚ÂĂĂłǂȂȂȂǂǂƂƂłƂǂȂɂɂɂȂƂƂƂƂłłłłƂǂǂȂȂʂʂ˂ǂۂ+Qo(BB;Wb]lЇ:/)6Rfkχ!",.255423EJEB;DS]ROFQPQQPMMOPHK?KMJINDM@FMNHDGSRRHKGESXKLSTSN]GVKNNPTJYVRTRONQWQHIVEM`\YJ;6DAF?68B00..'$);I>,&#((-&$%#  ߇ևՇۇ߇ׇԇχƇ‡ۇ=r]`G4ޅم҅ԅυbN(Z!܂ӂ˂Ƃ‚‚‚‚Ă‚ÂĂĂĂÂĂĂłǂȂȂȂǂǂƂƂłłƂǂȂɂʂʂǂƂƂƂłłłłƂƂǂȂȂɂɂʂ˂݂ 8\z3TO:FVTlه'&?]dɇ$!$+*2(.'3/008::23:=@<@?<955::545460+9527?7D34/-.)(6:=;6<:AH>?6BED?8=7.<54.;:4<1;.::&:3)$#)&%)++!$  ߇ׇއ݇݇݇܇݇އڇ߇ۇ܇݇߇݇݇߇ۇևׇ҇ЇŇȇÇЇ̇ч~߇l%ՆeTQ3ɅͅDžzaQ .d*ڂЂʂłÂ‚‚‚ĂÂÂĂĂÂÂĂłƂǂǂǂƂƂƂƂłłƂǂǂȂʂʂǂƂłłłłłłłłƂǂȂɂɂsunpy-0.8.3/sunpy/data/test/euvi_20090615_000900_n4euA_s.fts0000644000175000001440000045210013203275053021774 0ustar nabil00000000000000SIMPLE = T / conforms to FITS standard BITPIX = -64 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 128 NAXIS2 = 128 DSATVAL = 15000 TEMPMID2= 26.598 DSUN_OBS= 143073245383.0 PC2_1A = 0.29648721 OBJECT = '' SC_YAW = 0.95583553 CCDSUM = 1.0 SC_ROLLA= -17.3667386514 RO_DELAY= 0.0237600002438 BIASSDEV= 0.022 DATAP10 = 736.0 TEMPAFT2= 16.4388 TEMPAFT1= 12.1167 DATAP95 = 4050.0 COMPRSSN= 94 DATAP90 = 3302.0 CRVAL1A = 138.28283 RECTIFY = T OBSRVTRY= 'STEREO_A' DATAP98 = 5536.0 DATAP99 = 6944.0 FPS_CMD = T CRLT_OBS= 6.40451029896 CDELT1 = 25.404384 SC_PITA = 15.9604566982 CTYPE2A = 'DEC--TAN' FILENAME= '20090615_000900_n4euA.fts' INS_R0 = 0.0 FPSERS2 = 11438 PC1_1 = 0.99774856 PC1_2 = -0.06706565 SCANT_ON= F IMGCTR = 10 HEQY_OBS= 111734958911.0 DOWNLINK= 'SSR1 ' CUNIT1A = 'deg ' FPSOFFZ = 0 FPSOFFY = 0 VERSION = 4 BUNIT = 'DN ' OFFSETCR= 0.0 DATAP25 = 756.0 LINE_RO = 0.0023499999661 SUMMED = 1.0 LEDCOLOR= 'NONE ' IMGSEQ = 0 OBSSETID= 0 CRPIX2A = 926.826 SUMROW = 1 R1COL = 129 HCIY_OBS= -122992547760.0 SC_ROLL = 3.7254651 CTYPE2 = 'HPLT-TAN' CTYPE1 = 'HPLN-TAN' FILEORIG= '9615000A.443' EXPTIME = 16.0074 IP_PROG8= 0 IP_PROG9= 0 IP_PROG2= 1 IP_PROG3= 94 IP_PROG0= 41 IP_PROG1= 76 IP_PROG6= 0 SYNC = T IP_PROG4= 0 IP_PROG5= 0 DATE-OBS= '2009-06-15T00:09:00.006' LEDPULSE= 0 HEEZ_OBS= 304735435.913 INS_Y0 = -136.70731 CEB_T = 40 TEMPFWD2= 29.3416 TEMPFWD1= 29.7119 READPORT= 'L ' READTIME= 4.85204792023 ENCODERP= 22 SEB_PROG= 'NORMAL ' SC_PITCH= -16.334123 PV2_1 = 0.0 R2COL = 2176 DSTOP2 = 2048 INSTRUME= 'SECCHI ' DSTOP1 = 2048 R2ROW = 2126 ENCODERF= 22 BLANK = 0 DIV2CORR= T DATE-END= '2009-06-15T00:09:16.013' HEEY_OBS= 112656265551.0 P2ROW = 2048 FPS_ON = T DOORSTAT= 2 IP_00_19= ' 41 76 1 94 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' PC1_2A = -0.29648721 DATASAT = 1379 OFFSET = 600 SC_YAWA = 138.281444346 RSUN = 1002.6949195 CADENCE = 7199 CRVAL2A = 15.964803 HAEX_OBS= 102676404445.0 CDELT2A = 0.00044104834 CLEARTIM= 0.544247984886 MASK_TBL= 'NONE ' SCFP_ON = T CROTA = 3.8454651 EVENT = F FILTER = 'S1 ' SCSTATUS= 256 NMISSING= 0 FPSDAQ1 = 70973024 HAEZ_OBS= 306547386.847 SETUPTBL= 'ops/tables/BLD501/setuptba.img' IPSUM = 1.0 BIASMEAN= 724.545 DATE-CLR= '2009-06-15T00:08:59.245' MISSLIST= '' EVCOL = 0 TEMPMID1= 11.9145 APID = 1092 CRPIX1A = 1021.81 IP_TBL = 'source/is/src/imagetbl.img1.135' CAM_STAT= 1 CTYPE1A = 'RA---TAN' HCIX_OBS= -71330805651.3 GAINMODE= 'HIGH ' TEMPTHRM= 9999.0 FPSERQ3 = 862058 WAVEFILE= 'ops/tables/BLD501/wavetb1a.img' DATE-AVG= '2009-06-15T00:09:08.009' HGLT_OBS= 6.40451029896 OBS_PROG= '' CDELT1A = -0.00044104834 PC2_2 = 0.99774856 PC2_1 = 0.06706565 FPSGTQY = 11909 FPSGTQZ = 17334 CUNIT1 = 'arcsec ' SUN_TIME= 477.240976434 CUNIT2 = 'arcsec ' CLR_TBL = 1 SHUTTDIR= 'CW ' CDELT2 = 25.404384 N_IMAGES= 1 ORIGIN = 'NRL ' CRLN_OBS= 205.148038646 PV2_1A = 0.0 RECTROTA= 6 FPSNUMS = 4229 IP_PROG7= 0 OBT_TIME= 0.0 DISTCORR= F DATAMIN = 664.0 DATASIG = 696.301 EXPOSTBL= 'ops/tables/current/expqueta.img1.3' CRVAL2 = 155.0842376759999 CRPIX1 = 64.5 CRPIX2 = 64.5 CRVAL1 = 4.27111205999995 EXPCMD = 16.0072 WAVELNTH= 171 LONPOLE = 180 TEMP_CEB= 35.244 COMPFACT= 20.5143 DATAMAX = 16454.0 CEB_STAT= 0 PC2_2A = 0.95503682 FPSDAS2 = 536471 FPSDAS3 = 538464 FPSDAS1 = 547842 HCIZ_OBS= 15959414314.9 READ_TBL= 0 FPSERS3 = 674 PC1_1A = 0.95503682 IP_TIME = 14 DATAP75 = 2416.0 OBS_ID = 1624 P2COL = 2098 FPSERS1 = 2739 GAINCMD = 1 CUNIT2A = 'deg ' DATE = '2009-06-17T20:08:12.197' YCEN = 155.02206 EVROW = 0 CMDOFFSE= 0.0 P1COL = 51 OBSERVER= '' P1ROW = 1 DATAAVG = 1650.2 FPSGTSZ = 6964 HEQX_OBS= 87923544039.60001 COSMICS = 0 FPSGTSY = 5137 INS_X0 = -4.7633219 HGLN_OBS= 51.801012885 JITRSDEV= 0.0644992738962 TIMGCTR = 27385 SUMCOL = 1 TEMP_CCD= -71.5262 HEQZ_OBS= 15959414314.9 EAR_TIME= 29.623973276 FPSDAQ2 = 68058817 ENCODERQ= 22 EPHEMFIL= 'ahead_2009_163_01.epm.bsp' FPSDAQ3 = 68565868 READFILE= 'ops/tables/default/rotbtb1a.img1.7' DATAZER = 0 DATE-CMD= '2009-06-15T00:09:00.000' SPWX = F FPSERQ1 = 588179 FPSERQ2 = 366336 HAEY_OBS= -99636416753.89999 R1ROW = 79 DETECTOR= 'EUVI ' DATAP01 = 722.0 VCHANNEL= 13 POLAR = -1.0 LINE_CLR= 0.000123999998323 DATE-RO = '2009-06-15T00:09:16.160' XCEN = -6.1359621 HEEX_OBS= 88195388274.60001 ATT_FILE= 'ahead_2009_166_03.ah.bc+1GT' DSTART2 = 1 DSTART1 = 1 EVCOUNT = '' COMMENT EXPTIME from MEBEst. clear duration = 0.700000 sec.check ATT_FILE for poCOMMENT inting source, using DATE-OBSNo compression error message detected. HISTORY Id: make_scc_hdr.pro,v 1.157 2009/05/06 16:25:00 nathan ExpId: getsccsecHISTORY pix.pro,v 1.15 2008/05/02 17:09:59 nathan ExpId: getscccrpix.pro,v 1.8 2HISTORY 007/03/30 19:31:59 nathan ExpId: getsccpointing.pro,v 1.9 2008/04/17 15:HISTORY 14:01 nathan ExpId: secchi_reduce.pro,v 1.315 2009/06/03 21:00:24 nathanHISTORY ExpProcessed on iapetus: x86 linux IDL6.2Id: secchi_rectify.pro,v 1.21 HISTORY 2008/07/14 18:34:16 nathan ExpId: euvi_point.pro,v 1.13 2009/01/15 19:05HISTORY :58 nathan Exp END @@@@@@@@@@@@@@@@@@@@@(@@@X@`@p@p@p@p@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@p@p@p@`@`@P@P@P@P@@@@@@@0@0@ @0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@8@l@p@`@p@p@p@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@p@p@p@`@`@`@P@P@@@D@@@@@0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@X@d@p@p@p@p@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@ @ @$@@@@@@@@@@@@@@@@@@@@@p@x@t@p@`@`@L@h@T@@@@@0@4@(@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @\@l@p@p@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(@@@@@@@@@8@8@@0@0@@0@@@@ @@@@@@@@@@@@@@@@@p@p@p@`@x@`@P@P@@@@@0@0@,@ @@@@@@@@@@@x@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@l@d@p@p@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(@(@@@8@P@`@H@X@L@P@@@H@P@h@h@p@H@H@X@P@8@P@8@@@@@@@@@@@@@@@@@@p@p@p@`@`@P@T@P@X@0@0@0@(@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@P@l@`@p@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(@8@(@8@T@p@X@|@t@@@@x@X@@@@@t@@@@@@x@P@P@(@@@ @@@@@@@@@@@@@@@@@p@`@`@P@`@@@@@@@@@ @8@@@@@@@@@@@@@@@@@@@@|@@@@@@@@@@@@@@@@@X@p@p@p@@@@@@@@@@@@@@@@@@@@@@@@@@ @(@8@8@P@H@X@`@p@p@@@@@@@@@@@@@@@@@@@@@@P@H@$@(@(@4@@@@@@@@@@@@@@@@t@p@l@P@h@P@P@P@0@0@(@,@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @\@@p@p@@@@@@@@@@@@@@@@@@@@@@@(@(@8@8@8@@X@X@h@t@x@@@@@@@@@@T@@@@ @p@h@X@@@<@0@8@X@(@@@@@x@`@`@`@8@P@D@D@@ @ @@@@@@@@@@@t@p@p@P@P@P@@@@@@@<@0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @l@t@p@p@@@@@@@@@@@@@@@@@@@ @@(@D@8@H@d@X@X@p@x@@@@@@@@@@P@P@@@@@@P@@@@@@@@@@@8@@@@@@@@@X@@X@4@$@,@@ @@@@@@@@@@p@@`@h@P@P@@@@@0@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @l@p@p@@@@@@@@@@@@@@@@@@@(@(@(@8@8@H@X@X@l@h@x@@@@@@@@@(@8@X@@@@@@P@t@8@@ @@@@p@|@x@@X@P@@8@P@@@@@@@@@@p@x@X@H@,@@ @@@@@@@@@@p@@p@P@P@@@D@@@<@4@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @l@p@p@@@@@@@@@@@@@@@@@@@ @0@8@H@H@d@@x@x@t@@@@@@@0@4@(@P@@@@@@@@H@8@ @@@@@@H@H@@@@@@@@`@X@H@X@H@8@@@@@@@p@p@H@@@@@@@@@@@@@@p@x@d@h@`@@@@@8@8@@ @@@@@@@@@@@@@@@@@@@@@@@@ @l@p@p@@@@@@@@@@@@@@@@ @@(@8@8@H@X@X@@x@@@@@@@@@ @@@@@@@@(@h@@h@d@@@@`@@@D@@4@@$@D@@`@l@|@@8@@@@ @@@`@`@8@@@@@@`@X@ @(@@ @@@@@@@@@x@@p@X@D@P@@@P@(@@@@@@@@@@@@@@@@@@@@@@@@0@t@p@p@@@@@@@@@@@@@@@@@ @@@H@X@X@h@x@@@@@@@@@@@@h@p@@@@X@X@H@@8@0@@@x@D@@@x@@@Z@`@t@@@ @@\@@h@@@,@@@0@T@@@@@h@H@@@@@`@`@8@$@@@@@@@@@@@p@x@|@`@@@@@P@,@@@@@@@@@@@@@@@@@@@@@@@h@p@p@p@@@@@@@@@@@@@@@@ @4@H@P@h@@x@@@@@@@ @D@P@@@@@@H@@,@X@@|@p@@@@@@@<@@(@@@r@@@@@@@@@x@@@@@\@$@@@p@(@@@X@ @@@@@X@X@4@$@0@@@@@@@@@@@`@h@X@P@8@(@(@ @@@@@@@@@@@@@@@@@@@X@l@p@p@@@@@@@@@@@@@@@ @4@8@X@h@h@@@@@@@@8@@@d@@@@@d@h@@@P@@@L@@l@@@@@@r@(@@@@@@j@@t@D@(@R@@@8@\@@@@@@`@@@@h@(@@p@h@H@@@@@`@h@D@ @@@@@@@@@x@p@h@`@@@P@(@0@@@@@@@@|@@@@@@@@@@@@@p@p@@@@@@@@@@@@@@@@(@8@D@h@@@@@@@@ @8@<@x@@@@ @p@@ @P@@,@@@@4@@@<@@@@0@\@(@|@@*@,@@@@d@@h@@@@@@@@d@ @@@L@@@@@@@@(@@@x@@@@@@@@x@<@@@@@@@@x@p@p@h@`@@@@@8@<@@@@@@@@@@@@@@@@@D@@p@@@@@@@@@@@@@@@$@@@H@X@t@x@@@@@@@8@h@|@@@@p@@@@\@@t@D@@@@,@0@X@\@@@@@@@@(@@L@S@,@:@@X@@T@@2@@@@@@@@@d@ @@@`@@@@@@@0@@@X@@@@@\@P@(@@@@@@@@@`@`@`@@@@@@@@@ @@@@@@@@@@@@@@p@@@@@@@@@@@@@@ @H@(@@@P@X@h@|@@@@@@ @X@@@@ @@@H@x@@@@@(@,@6@@N@L@@@@@$@@@@@Y@@S@v@@@I@@@3@~@@@@@:@B@0@@@R@,@@z@&@t@D@@@ @@@t@<@@@0@@@@X@H@@@@@@@@@@h@`@P@P@H@H@<@ @@@@@@@@@@@@ @d@h@p@@@@@@@@@@@@@@(@P@\@T@@@@@@@@X@@@@@`@@P@@@@@ @@@@t@@"@ @@ @"@^@@@<@g@@2@)@@n@@j@*@F@@@@G@@@@@5@@n@@@@H@@"@B@@f@@@@`@@@@X@@t@0@@@x@X@0@(@@@@@@@@p@@`@`@X@H@@@@@@@@@@@@@@@X@l@p@@@@@@@@@@@@@ @H@D@P@@@@@@ @@H@@@@@P@@@t@ @@@@@@F@@n@@@@@|@@K@@@&@@(@Q@G@-@@v@@p@@4@@@@@@@@@<@@@@%@@@@^@@b@@@@@@@x@@@@x@@h@(@@@@l@4@,@@@@@@@@t@t@h@`@@@P@(@ @@@@@@@@@@H@p@@p@@@@@@@@@@@@@4@H@X@t@@@@@@@`@@@@P@@@@@@`@L@,@$@@P@@@@@P@@}@V@@Z@@@E@}@v@k@@@@@$@@@@{@X@@-@@@@@@b@{@@@߀@@@6@<@@@H@@@@@8@@ @@@@@@X@@@@\@,@8@ @@@@@@@@h@`@h@`@8@0@@ @@@@@@@@X@`@p@@@@@@@@@@@@$@$@X@`@@@@@@(@X@@@@0@@@d@@@\@ @T@8@@@@@@Z@R@@@H@@[@@'@@@@@\@K@@@@@N@@;@v@@@@@W@@@@@@[@<@3@@@@@@@ @?@@d@@@@@@L@l@0@X@@@0@@X@@@@@0@0@@@@@@@x@p@h@X@H@@@@@@@@@@@@d@`@@@@@@@@@@@@@D@P@p@@@@@@8@h@@@@@@P@@p@D@L@X@z@@@@@@6@@@@`@@@@@@5@@S@@@0@@+@@V@@@&@@@@:@;@_@@@-@W@@@@C@@k@@@\@+@ @<@o@H@@@r@@R@<@2@@@@@@H@l@,@@@p@0@(@@@@@@@@`@`@X@P@(@ @@@@@@@@p@p@@@@@@@@@@@@8@<@@x@@@@ @T@@@@p@@@@@l@@@4@>@@@b@n@@@@@@@M@@@@*@@@@@@@@ @@;@S@@@E@@Q@)@@@w@@@@@@[@@ @@L@@@f@@@@@%@@8@@@@6@@@>@@`@@@@@@P@x@@@@p@8@@@@@@@@`@`@P@`@<@8@@@@@@@@@@@@@@@@@@@@(@h@h@@@@@@8@p@@@d@@P@@X@,@@t@@@J@J@:@@@$@@@%@@@F@@;@@@@@>@@@@"@@@@@@0@@@@,@!@@V@:@d@W@@@@@.@*@~@@@@\@d@@j@@@-@@J@b@@@@@@T@@x@@0@x@(@@@P@,@@@@@@@t@p@p@P@P@X@(@@@@@@@p@@@@@@@@@@@$@H@X@@@@@@L@@@(@h@@@,@@@@@:@V@^@@Z@@O@@@@'@Ѐ@@@@f@@@@@R@g@@@@s@-@=@@@@/@\@@{@j@%@@@@@Z@@@@@@P@k@g@@\@@F@r@@j@@@[@:@@:@@B@@@@6@@$@@l@@@@@T@0@@@@@@@@@`@`@P@\@H@ @@@@@@@@@@@@@@@@@L@H@x@@@@@L@@@P@@8@@@`@@ @@X@`@4@@&@+@@@@W@Q@@@'@@@V@@@@@@E@@@O@@@}@@D@n@[@@@?@@a@@J@@@@F@k@p@ @{@@@@@@@@x@`@T@@@ɀ@&@@@@@@.@@r@@ @@x@@H@@@t@@@,@@@@@@@@p@p@h@X@L@8@@@@@@@@@@@@@@@@0@\@`@@@@ @@@@@0@@@@\@@@.@@@:@^@.@P@u@@j@@@@"@@@@@@@E@@2@@@<@@.@@@n@@ @!@@m@<@K@v@@@L@m@@;@@@@@X@@r@@@@j@@@7@l@d@@@&@ڀ@%@@@@@ @~@@@p@@(@@4@@@l@P@,@@@@@@@x@p@p@h@X@P@ @@@@@@@@@@@@@@0@8@X@@@@@H@@@@d@@@@@t@@@R@@@@@a@@@E@@@@@j@'@@V@@z@@U@@9@@P@@s@@@A@.@@@f@C@@\@U@@@d@@@@@J@@@@@@C@t@o@@R@@K@@@v@e@R@߀@@@@o@T@@|@ @@p@8@@@h@(@@@h@0@,@@@@@@@@@`@p@P@0@@@@@@@@@@@@@@0@8@|@@@@D@P@@@P@@@@T@@r@6@@@d@.@@@@@9@V@@S@@~@@@v@q@@|@@}@P@f@@@@z@.@@J@@]@J@h@U@@@@e@R@O@"@@@ @=@@|@@@@@@ @@@@@q@I@o@@x@B@@@@@<@@z@@.@@8@8@|@@H@@@@p@P@,@@@@@@@@h@`@`@@@@@@@@@@@@@@@0@8@l@@@@ @H@@@\@@x@@@@p@@@@@@,@ @E@ @@:@@@Ā@c@q@@P@.@b@@)@@@@@"@c@@1@@v@@@@O@@|@@`@@@C@@ @@@F@@@^@@@@o@@h@@@@;@'@@@@@{@@@@c@@@@@@@@@@(@@@@@@@@x@P@H@@@@@@@@x@h@X@X@8@ @@@@@@@@@@@(@H@t@@@@0@\@@,@@@@@@@@@j@8@j@B@~@g@@l@0@@@@@@@@P@@'@@@ @@ @@@@@C@"@@@@m@V@[@@@@y@@\@C@@p@@G@@@@G@?@@{@d@;@@@/@@@K@x@9@@B@t@@̀@@@@?@d@j@j@@@(@@@,@@(@@@@X@8@@@@@@@@p@p@l@X@ @@@@@@@@@@0@8@`@@@@@L@@0@@P@@p@\@@\@@@@@@{@m@+@@[@@@@@@@ @@@@@ @G@@x@@a@@@@@@Y@:@@@@~@Z@@@@@h@6@H@Y@@@O@"@@@@@@l@@@n@K@@@A@@@@@c@@[@8@@@@@@Z@ @@@@@@@x@@@@x@X@(@@@@@@@@h@`@`@(@$@@@@@@@@@(@H@X@@@@8@@@l@@l@@$@@@@@*@@@@@@@@@@@@@@B@@@@@(@@K@@@@\@@@@f@D@@7@U@@ @@u@@j@@@j@@v@@@@@@X@@@@@ @@@@@f@@@@@@@M@@@v@A@@7@@@@@@@`@@X@t@@@h@@@@`@`@(@ @@@@@@@@`@@@ @@@@@@@@(@8@l@@@@H@@@P@@@@@4@@@@@@@d@@@@@3@@h@E@@@V@@@@5@@@@@@@8@@@@@@M@E@G@.@@@e@;@@@^@L@@@@@E@@@@L@@F@~@@^@@f@@S@}@6@@ @O@@y@w@@n@@@@@;@@r@@@@(@<@L@P@@,@@@@`@H@@@@@@@@x@p@P@0@@@@@@@@0@P@@@@ @P@@@h@@@,@@@@P@R@n@@@@w@@z@@8@4@@;@!@@@g@ @@H@"@:@@y@@o@@@@ @Q@`@@@@@@A@@@@@@@S@.@ @W@@g@j@\@@@/@x@@@@;@@@@@@n@Y@@@@@N@@@@@@@@:@|@b@ @@@@@`@@@@@@t@X@$@@@@@@@x@h@`@@@ @@@@@@(@H@h@@@@0@p@@@@@@@@@@@n@@ @2@@.@~@ @2@@@@U@@B@W@@q@@;@2@O@W@#@@@@?@7@@@@@S@@f@5@,@@@@@@@e@@@@@9@4@@@@@@a@@@@@@@@8@0@@@@6@b@@@@@N@@m@@@~@@d@@@@@$@`@@@@h@4@0@@@@@@@x@p@P@0@@@@@@(@H@h@@@@h@@@P@ @@@@`@@@X@@@M@\@Հ@R@`@@<@g@@@@@@@@@@g@@@8@f@<@@6@@h@@@a@}@L@@%@0@k@@@@Z@@@@$@U@P@@}@h@7@@@@@@@"@F@h@3@@@@@@"@@B@@@@@Հ@̀@@@@|@b@f@Z@v@@@@@@@@@@@X@8@ @@@@@@p@@`@@@@@@ @@T@X@x@@@@p@@@@@p@@@@h@f@@@@@@_@=@r@@@Z@@@@Q@6@@@@@@B@@%@M@@@@@@v@@@q@@@@@@@@@a@@@@@w@k@@@@`@@w@@d@@[@V@k@ @@@@@@O@@@@@@@@1@:@)@@@$@@@@.@v@L@*@@p@0@\@@`@@@@`@0@@@@@@@x@p@p@P@@@@@(@H@X@@@@@@@@l@0@T@@@@@8@|@@:@@@.@:@t@@@ @w@@@@@@@p@@@@c@@@_@@m@@@@@l@7@l@@@@ @@l@@@@!@,@@c@E@0@@@@ @V@@<@@@@@@@@@4@g@@c@@@ @@@@N@@j@^@@ @@p@@@:@8@P@0@@@t@@@x@t@8@@@@@@@@x@h@`@@@@@(@P@p@@@@`@@0@@@@@@@@@@@@@r@c@@@@@@@ @T@@ @Y@;@-@@@@@X@@r@@@@d@@@)@ @@@@@@@@@-@@a@=@@^@@@@w@@|@@N@@@,@@@E@@@_@3@R@@@@@@@@B@)@@@@@@(@f@X@@@@,@@L@@@@<@@@t@`@4@@@@@@@x@h@`@@@@@8@H@@@@H@@@@@@@|@8@h@N@@@@r@7@@׀@6@L@R@@2@@@|@P@@@@@9@@@@@0@@@)@B@@-@@@@@4@@@@@@@@@v@@k@@@@@@@j@@>@P@H@@@@@@f@2@_@@@L@@@@@@@@@n@@z@y@@i@@@@<@D@@@@P@@l@@@@\@(@$@@@@@@@x@p@@@@@8@X@@@@x@@8@@ @@8@@F@@@@N@r@@K@@;@a@@k@/@L@H@b@|@@@@@1@@@v@@@-@@v@@@@@@@@G@@K@@*@@@/@@u@@@@@@6@@@@@\@@@@@S@@o@@e@@Y@@@@ @@%@@[@@@@6@@I@@a@@@4@@@@D@@@X@@@@@@@@@ @@@@@@@x@p@@@@(@h@h@@@ @@@@P@@@@8@@@n@*@@@@@{@ڀ@@@@t@@y@S@2@@@@@ @R@@3@E@@2@@@@6@@/@@(@@@@@@F@@T@@J@@@:@@@@@@@@@@@x@@@@@7@@@8@(@@@@@@@@g@E@w@3@@@@N@@@@@r@@@l@@H@@@@8@@@@\@4@@@@@@@x@p@@@@(@H@@@@0@@0@@@@x@@ @j@@ @Z@@@ @@2@(@ʀ@p@P@v@@@a@@@@@7@@@ @e@ @#@@@@z@F@+@@@@1@h@p@B@@f@f@@@ @@-@,@@@^@@@D@(@\@j@@@@@H@@@@G@@@ @@@@(@%@@@g@@@3@.@@@@`@<@@@@r@@ @H@@@@@p@,@@@\@`@,@@@@@@@@@@@(@d@@@@h@@`@(@8@@P@,@j@@4@@.@@L@@"@@@+@@@@@[@ @C@g@Q@X@@M@i@@b@@@)@)@@e@>@@G@@@@@Y@L@q@@@@+@$@y@<@@@@@"@@@X@A@#@@w@>@@.@@@@@@@@S@"@?@@ @@@@@,@a@(@@@g@@@@@P@@@@@l@@@8@@@p@X@(@@@@@@@@@@@(@H@@@@d@@@h@@$@@@@@@&@@@2@@Q@@@_@@@@@@@w@@@8@@"@@@@@u@'@@@s@-@E@@@m@@>@ @@@x@@T@@@E@|@@@T@@f@@.@@@@@J@,@@@d@@S@@@@@@h@ @4@@@*@@@@@@{@@j@W@@@@@@@0@,@@@@@l@@@@d@0@@@@@@@@@@@(@H@@@@X@@@@@h@@B@@@6@@@@@@@@@x@@@@@*@8@@"@e@@e@@@@@@@~@@@@@W@V@@@@/@@@@@@ @@@j@@@@@@@@@@/@@@@H@@/@5@{@_@4@-@;@w@P@@@@@@@@@ @9@@Q@@@@B@X@\@2@d@@@d@@@@`@@@x@H@@@@@@@@@@@@@(@`@@@0@p@@@@(@@d@D@@@@@8@n@@-@@@>@@@@@@@m@@N@@@@@,@@@@@{@ @@-@5@@ @@@@N@@@2@@@y@o@@@@p@@@@c@@@$@@P@v@p@@@C@M@2@@h@@@@@@'@@@@v@b@$@@@E@@+@݀@Z@Y@!@"@@@@@@@@@@p@(@@@h@@@ @@@@@@@@@@(@d@@@ @@@x@@@@^@@@h@,@@@@Z@@,@~@V@|@@@v@@@ @@8@[@@@@@@?@@@@@X@A@<@[@6@M@@{@@@\@@b@J@S@\@@-@@4@@@l@@ @@@@y@z@@@@@@@@@@@@{@@@0@@@@B@@r@@@^@@@@t@@7@@n@b@@@@d@L@@@H@ @@@@@$@@@@@@@@@@(@H@`@@(@`@@X@P@4@@@@@H@@@@@@@i@@<@@@@@@@@@@@@@@7@ @@@@>@@S@E@@@@@@@@U@<@@B@@l@\@2@@@@{@@@?@@P@@@@5@f@@@@@@@/@Y@@@g@@ @/@P@h@@@@@N@,@4@݀@@@@@@@@@@@@@@@@@@@p@T@@@@@@@@@@@4@\@l@@@h@@@@@`@2@@@p@@V@@@@@b@m@@y@@B@@7@@@@@@e@@@0@@"@.@T@@j@O@@q@ @@L@@g@E@j@@$@@J@@@@@2@@)@@@@@@@^@@E@@|@@@a@@@@m@@@<@@@@@@h@"@@@"@@@ @@@@@@H@@d@(@@@@D@@X@@(@@@@p@0@@@@@@@@@@L@X@x@@@H@@h@0@@p@l@:@@@@\@p@k@@@Ż@@@2@@@@^@@@@@@.@@@q@@@@@@c@~@ @@@@@@@@@@~@@@@#@@@~@@@P@o@K@T@K@@t@9@ @@h@@@@l@@f@`@@D@@G@@@r@@@>@6@s@b@0@P@@@#@@@@@@@x@@@X@$@H@@<@@@@X@@@@@@@@@@@@(@X@h@@@x@@P@@@@@@\@@@ @4@@9@ @@r@@@@Z@@@B@@t@@c@@@p@@@@c@@@@o@@@@@@@@@7@@)@@>@h@1@~@@@!@@@^@@u@@@@V@+@8@@&@@@R@t@d@@@@@@,@@@@@@x@@@@T@x@Y@@1@?@@P@^@@@x@@p@@@H@@@@l@@@ @@@@@@@@@(@T@x@@@X@@<@@@ @@@@@N@ @@@@@@p@R@R@ @k@@[@@ @@@@2@@e@6@@@@@@@~@'@@9@@@@$@@@>@S@j@@@&@.@@@@;@@@@ @@@@@@B@$@ @@A@K@@.@@@@T@@@@K@(@@@f@@@@@v@@@@`@@i@@4@Z@F@@h@@@D@@@@@@@P@@@@@@@@@@(@H@@@@@@@@@<@@@@@@<@s@@@˜@@@e@@@0@@Z@@6@]@@@\@@@@l@@@@P@@@9@@@@H@}@@@!@u@m@x@@@@ @]@@l@@@m@@@D@@@@@M@R@T@@@9@@*@@@@|@@@@M@?@@@@A@@C@@@@8@@@ @@0@@n@J@@l@p@@@p@8@@@@8@0@@@@@@@@@@(@`@|@@@`@@T@p@@,@@`@l@@@O@I@@M@@@@`@V@"@h@V@@:@@@@W@K@O@j@]@@@@ @@@@@,@@@5@@@n@C@@W@@@)@@@@@@@@@@@@@@@)@@@@@S@@-@2@e@e@i@@^@R@@N@@w@Ԁ@@}@@f@I@@!@@i@z@ @z@t@~@ @@p@@H@@`@@@@d@@@ @@@@@@@@@(@8@@@@ @@`@@@@J@@@@ @ @@@O@€@*@&@!@@@,@y@Z@@@@5@@g@@ @~@@@5@I@@i@ @@d@@B@F@}@ @@@@,@r@%@T@&@@@@>@s@@C@@I@@4@ @@@@@@^@@@R@@@z@@I@]@b@@@~@@3@@@@n@@ę@@&@U@@@-@:@@@t@@x@@@@P@@@@`@@@ @@@@@@@@@@8@p@@@(@@0@$@h@0@@@@@@J@@~@̀@p@@?@@@Q@@@@@9@@'@@:@@V@@ @@Y@D@@@"@@@@q@(@X@@h@@9@@L@T@@_@@)@@@A@D@@@@@R@r@@$@[@B@n@@@6@@O@@@@@b@@@A@@&@u@4@@@@@@ŀ@*@@@@@@@b@L@8@(@@(@p@@P@@@@p@P@@@@@@@@@@@8@p@@@0@@X@l@@@@6@z@v@@@@@I@!@@@$@6@n@@@@'@@@@q@0@@@@@d@@@@@p@@7@>@?@'@l@)@@@@)@@i@@4@n@@R@@@@R@]@@@I@@i@`@@@>@@8@@Q@@@6@8@k@@A@@@~@@@G@@?@@b@@A@ @@i@@@@@@@@h@@@p@@@@p@P@0@0@@@@@@@@@8@p@@@T@@@p@h@8@d@X@@@@\@v@6@@@@@x@_@@X@@@@N@'@@!@@>@@@@@@@H@@N@q@@@9@ @a@@l@@l@@@@@b@@@@@W@@*@@i@@z@@@f@@@@@>@b@@<@@X@@@@@@@~@@h@@@@a@f@@@"@@@@.@r@@d@d@@@@@ @p@(@@@@H@D@ @@@@@@@@@<@|@@@@@@x@h@T@@4@@@n@:@<@$@@@@@@@@@@@*@p@@@E@o@@@@@@w@@@@k@R@@@2@`@S@@)@Y@@@@~@@@@@w@/@@@@@D@@X@@@@@@@@@A@j@l@I@q@@)@@@ @r@@\@7@ @@@@p@@@L@@@@@$@z@@@D@@@t@@P@@@@@P@(@@@@@@@@@@P@p@@@D@@D@@@@@B@@@2@@T@@ހ@}@>@@@E@;@_@@'@@@}@K@R@A@@@@$@@@@@@H@s@@E@9@j@@@@~@>@-@@@6@@=@ @@@,@s@@@1@@@@@@p@Z@O@@@@N@3@)@@@@@@H@M@@@_@@@@Q@@@ű@7@K@@:@@@@@P@@@D@@h@@@@@H@D@ @@@@@@@@@,@`@@@8@@@@@@@@@@$@@@@@k@@@9@@@E@@Q@@@@@@h@@)@@v@k@(@@@O@@@@@W@@@@@P@@D@K@@@d@H@@R@@@@?@&@@@m@@@@t@@@@f@:@t@@@@@]@@4@@@3@7@E@=@6@@@@ @_@›@@@@@@@@^@@@$@$@@@@@@@@`@(@@@@@@@@@@@`@@@@h@@h@@@@`@&@@@@>@]@@@@5@@@@@@@b@0@P@W@z@@@@P@@@;@@@@@$@@@@@@@*@Q@h@g@V@1@#@@|@@@d@@@@p@@@@@N@@T@@l@o@B@Z@2@|@@\@ @@@@@@@@G@@O@ @@ @@N@@@@@{@v@@@v@@@@ @ @@@p@ @@@p@P@0@@@@@@@@@@@8@p@@@@p@@@@@0@h@@@@@@@΀@3@@@@W@@@@@"@B@@|@@b@E@@k@@@Q@@@@3@@Z@@@@@@N@@_@@@)@-@@@@T@{@O@X@@@6@@@@@&@@@t@h@@@@@@R@@@ @)@@M@@@@@@\@k@@@K@@t@P@@8@@@@@@@@@@|@@@@@`@@@$@@@@@@@@@@@P@@@@p@@x@8@0@4@D@r@b@@@@7@@@@@@Z@{@@I@@@@n@@@(@@@@V@@l@@@@H@@@&@@@@g@@x@@!@%@@G@@@6@@@@@=@@3@@@@@@@c@@}@8@V@@@I@ @@K@@~@@@m@@9@@@@@@e@R@@@@@N@@@t@H@x@@@@@H@@@@X@,@$@@@@@@@@@@@8@|@@@0@@@@|@@@@T@@@@x@@@s@@j@=@S@l@@@@@ @-@@{@@@@@@@M@W@@@@@@@@@@r@t@:@@l@@@\@@@M@@@6@@n@@@@%@@@@@@u@@@@#@@&@@&@S@@@@@@@@ۀ@R@V@LJ@@@@@"@@@2@@@@@@d@@h@@d@p@0@@`@(@ @@@@@@@@@@@P@h@@@@h@@x@(@`@d@@@^@@V@@@@@@@@@^@@L@@G@0@@@@@@5@@@@@Z@k@@@8@4@@I@l@@o@@)@@@@&@@<@A@D@@4@@@@E@7@U@u@z@s@@@M@w@@@@@H@@@h@@x@@@@U@@@E@f@@@¥@@@@@v@P@@@d@d@T@@@@\@@D@@@x@P@@@@@p@@@@@@@ @@@`@@@8@@@@@t@@@@@P@@@[@@ˀ@M@Z@@V@@@{@@@s@n@@@@@@@@O@@@@@a@@8@@ @@@:@@@~@@@@B@@@@@@3@@@@@@@@@4@@@@@@@@@@@O@@8@@Z@y@@@@@z@“@½@@@@@@@@@ @@\@l@@X@@H@@@@L@0@@@@p@@@@@@@ @H@X@@@@x@@@@@@@~@@@@[@Հ@D@Z@@m@}@@@w@>@@@@@@]@@@D@@ @@t@@@@k@@@@@@j@[@g@@@@ @@@(@@@8@@@@8@@0@@@@w@@@@\@@@l@@@_@z@@@@-@+@@9@@+@@@0@@@΀@-@+@o@@t@8@t@@@@@8@@8@@@@T@@ @@@p@p@@@@@@@(@T@@@@H@@l@0@`@$@r@@f@@@L@@`@7@@@@@@G@*@@<@=@@@W@@@@@ @@@@@@@@F@@7@;@@@@P@I@z@@g@@{@@@(@t@t@%@A@"@d@@K@@@@@@@X@@@@@@@@@!@@X@@@@؀@C@ @`@ʼn@@o@@@@t@8@@N@8@@@@@p@0@@@@X@@@@@@p@p@@@@@@@@<@\@@@@@@@@@D@@b@@@d@@[@@@6@q@@@*@@*@@$@@@@u@H@@g@@E@O@~@w@L@@$@ @@@@@@@@@>@]@@}@@@@@@R@@@&@@L@ @@@!@@V@&@@@@W@@@@@@@@@@@S@F@@@@̯@M@@@@@@@@h@@~@@@@x@@4@@ @@@|@`@8@@@@p@@@@@@@@@(@X@|@@@@@@@@@d@@x@F@@@@.@ @@@@ @;@ @@@@@@@@@@@@@@@@K@@@@@~@w@@ @j@@%@H@@A@@@:@&@@2@@`@@@~@@j@@@@@"@@@@@@@M@@@@@@@K@@x@H@@ǡ@@$@³@@@@@@@@@J@@@<@@@D@@@@@@p@`@@@@@`@p@@@@@@@@@8@h@@@\@@l@@@@@@@@@@@A@@@@~@{@@@_@_@@3@@@@1@>@@*@@]@w@@@@@@@@@?@@@@@@@@@.@@@@@@@2@@@H@@@@@@ @@@?@@@@@@F@B@@@$@@m@@@@@Ŷ@t@@_@@@ڀ@E@^@,@@@@@@@@@P@@@@@@`@8@,@@@@`@p@@@@@@@@$@8@|@@@\@@@@@@@@.@@=@@P@e@@π@y@@@@V@@@:@@)@a@Z@@@_@G@@@@@h@@@@(@@N@@j@@@@J@@!@@Z@@@@@F@&@`@@J@@@U@J@r@@p@(@@@ @@@(@{@@@@x@M@@1@@@€@܀@@<@h@@@@@@J@.@@x@@@@0@@@@@`@@@@@@@`@p@@@@@@@@@(@H@@@X@@\@p@@\@@^@@4@@@%@m@@@i@@@@@@@J@$@@@ @@@@@@@/@@@@@@@@8@@;@@@h@4@@6@@@J@@@`@@@0@@V@R@@@@,@@i@{@@4@@:@c@@@@O@@o@@@K@q@@b@(@@@@@@@@D@@0@ @@@@@@p@ @@@d@@@ @@@@`@p@@@@@@@@@(@h@@@8@@8@@@@@@@@@.@@@@^@@w@@g@@@@@@@d@@@@@h@@}@@6@@v@G@@@ @_@@@@7@@@0@@O@@@p@0@@@@~@@D@\@0@@(@@@@@l@@@z@+@@@@@S@@@@4@y@@@@Հ@&@ @ @3@@@T@@@n@@@@ @p@@(@@@@H@<@0@@@@`@p@p@@@@@@@@@@p@x@@@X@@@@X@@@@>@0@@@k@ˀ@@@@i@@g@@A@@@@@@@@@[@@<@@@<@@@@L@@u@-@@@@@:@@l@@@z@@@@@@@@@@ @@@@@@g@@<@:@@@@@@@@S@Ҁ@3@7@"@h@,@@@l@!@u@R@@@@6@ @@h@p@@@p@@@@|@H@H@@@@@`@@@p@@@@@@@@L@P@@@@@$@@@,@T@^@V@@@+@@|@@@@@R@@@@@m@@@g@@@=@=@[@p@@@@G@@+@L@@C@@2@@@@@@%@@r@@C@@@@@@@N@Z@@@,@J@}@@+@G@@@@@t@@@@@@@@ @@@!@x@X@@@D@r@@d@b@@@@$@@(@@X@0@@@@\@P@$@@@@@@X@h@p@@@@@@@@4@X@p@@@t@@h@L@@P@|@@@.@~@@~@X@@@I@|@3@@@m@Z@@@@@@@@D@r@~@@r@~@)@@@U@@@@`@@#@B@@@@ @`@@@@@@J@@@@p@@@)@@;@$@@@(@K@S@@@x@@@{@V@b@f@@@@j@B@@@@r@ @r@@@@@@ @@0@@h@@@@@H@ @@@@@@@P@`@`@@@@@@@@ @0@p@@@0@@@@@@`@@"@@4@%@@@$@P@@ @ڀ@@Z@@7@@@@@@@ @@o@@@m@@ @@=@@@D@@@@}@@1@@@@@@6@@@@@@@L@@@@@2@Z@@d@@@@@@0@0@3@D@V@k@ @F@k@:@@y@@N@ @:@8@F@"@D@@@@T@@@@@@P@L@@@`@@@@@@@@@@P@P@`@@@@@@@@@0@D@@@(@t@@@@@@@D@@@@@S@O@@T@@@@@@@)@@c@t@_@@@X@@@@@@U@@Y@y@@@1@k@>@@@q@@@@v@q@H@@n@C@"@@]@@X@]@@@M@X@@W@/@@@ @n@@[@@{@@@@L@ @@Q@@@@@@@D@(@@@@@@@@@L@@\@@@@t@p@P@0@@@@@0@P@P@P@`@p@@@@@@@@(@h@x@@@@@@H@@@@v@@@@@@@A@Ī@@x@@>@@0@<@@@n@@N@v@@@J@@@@@@g@ @@@#@@@@1@@x@2@H@S@@@H@B@(@?@@@@@@@@@@@@K@@@U@@[@@4@y@@>@@m@@@@@@@x@@`@$@@@@|@(@@0@@@P@@@@@H@,@ @@@@@0@0@h@P@`@p@@@@@@@@(@`@@@@D@x@@@@0@@@v@Z@@@_@@@v@S@K@A@@@@@@5@@'@l@ @ @Z@8@@H@(@@@@@@@@ @ @)@@S@@@@@@@@=@ @@g@@.@C@+@z@@@@@@w@@~@@@@@@@@@@@@@@Z@p@v@F@@p@@@P@@H@@@@@@0@@@@t@d@P@$@@@@@@0@0@0@P@P@`@`@@@@@@@(@`@h@@@@(@@@@D@@@@@@@@@@,@ @@@'@M@;@@4@h@@@y@?@<@@@@@q@@@@@@#@@0@b@~@@o@ @@@}@@@@d@B@@:@@h@c@@/@^@@@_@@@l@i@؀@0@*@@@@*@f@]@@@@j@@X@2@@\@@0@@@@8@@@H@@@@@p@0@4@@@@@@@0@0@@@@@P@`@`@p@@@@@@ @(@@@x@@@@d@@8@@@@@@@@@@@`@@3@r@\@@@@@5@X@@@7@@@Y@@!@@+@Y@K@@@@@u@>@^@r@@@@}@@d@@@@@@@@&@@h@@L@@@G@@@9@-@0@@@y@`@N@@B@@@@@@@d@l@ @0@@@@ @@@0@@@@@h@<@8@@@@@@@t@ @0@@@@@@@P@`@p@p@@@@@@@<@X@t@@@(@x@@@X@X@@x@|@|@@H@@+@@@@.@R@ @@@@@^@@ @@@@.@@@@@4@@@@@0@@^@@z@@@@@Ҁ@h@r@I@P@@@0@@<@@e@@@@4@@ @@@@ @=@7@@@$@\@&@|@@@"@@@@@@@@H@@@P@ @@@@h@`@(@4@@@@@@@|@ @ @@@@@P@P@`@p@p@@@@@@@0@ @@@x@@@@h@@@L@@`@p@@"@,@6@*@@T@h@i@>@@~@@@@@6@-@@@@@@9@@@@@f@@@@@ @@@@e@@p@S@Y@R@@@=@ @@K@|@@v@@@@@V@ @@@@@B@@@@@@@@@Z@D@@0@@@p@@L@@@`@@@@@@P@8@ @@@@@@@@X@ @4@0@0@P@P@P@p@p@p@@@@@@@$@0@p@@@@8@@(@@@@T@@@@n@@@@Z@@@@@@@@!@@@@@@a@@[@@B@@~@#@@@@T@@r@V@@^@F@@@@@Y@#@@@@&@-@@@@@Y@A@@/@@@@)@"@@8@@@0@@R@@N@@@@@@@ @@P@@@p@(@@@@@X@P@(@@ @@@@@@@(@@ @0@0@0@@@P@P@p@p@t@@@@@@@(@@@h@@@@`@@8@@@@\@@@R@f@2@@@U@@k@@s@@#@r@@e@@@@@@k@@r@I@@Q@@@@B@ @@ @@@@@f@ @ @@=@'@D@@@@@@f@@@l@g@@@C@@@&@z@@:@@@H@r@@n@h@ @@@@`@@@|@P@ @@@@@@`@@@@@@@@@@`@ @@ @0@0@0@@@@@P@P@`@p@@@@@@@@$@@@d@@@@X@@H@@@@@t@@\@@~@6@<@R@@@@@^@@z@@8@ @@@*@0@ @@d@@a@@@@@^@@@.@@'@t@V@@-@@@d@@t@f@@@@L@@I@8@J@@@@4@L@6@P@L@@@@@L@h@`@x@@@t@@,@@@X@@@@@@x@T@0@ @@@@@@@@8@@@@@ @0@0@@@@@P@`@`@p@@@@@@@ @<@L@d@@@@P@@(@@@`@@@N@@@<@@@M@@*@'@@@@;@I@v@d@}@@@@n@t@Q@b@@M@@?@u@@w@c@@@@@@6@&@@@@@~@x@t@@Y@@@@@@@@@$@:@@\@@@j@|@@D@@,@@4@t@@|@@@`@,@@@@@x@p@@@ @@@@@@@@P@8@@@@@ @ @8@$@@@P@`@`@@p@@@@@@@@@8@@@@@@@@@@@@@@d@@8@X@@^@@@@ @)@@@@@@@A@@p@:@m@E@@@(@%@@@@@@@@@@p@J@@@.@@n@@T@@@2@@@@@@P@&@,@~@h@@@x@@ @@@$@@l@ @@p@@@@@@@@@@@\@0@8@@@@@@@@@@@@@@@@@ @ @0@P@@@@@P@`@p@x@@@@@@@0@0@X@@@@@X@@(@@h@X@p@\@@*@r@@@4@@@@@@@8@}@[@D@@"@@@@@@d@\@u@@@@@@@@@@ @@ @x@@v@`@@z@@+@@@@@l@@@@@@@@4@@@@H@@@@@x@@@@X@ @@@@@`@P@L@8@0@@@@@@@@`@@@@@@@@@ @0@(@@@@@P@@@@@|@@@@@@@@8@X@@@@@p@@@@,@@@@x@@@"@@@J@@@@@@@@@@@@@@L@`@@Z@@@@R@N@@@@v@8@x@@@@ @@@@@]@Q@#@b@4@B@@@r@@>@B@|@(@h@h@@H@@@@@h@@@@@@ @@@@p@h@P@P@$@@@@@@@@@@0@@@@@@@@@ @ @ @@@0@P@X@T@X@l@|@@@@@@@@8@H@X@@@@H@@,@p@,@@ @p@@@@@@F@@@@@n@D@6@B@@Z@@@@@@6@@@:@j@Z@@@@@@@@@,@@3@@@@~@@X@@@@@@@|@@@T@@ @@@@@ @@h@@@@x@P@@@@@@@@@H@0@ @@@@@@@@@P@@@@@@@@@@@ @ @ @@@0@0@P@P@d@x@x@@@@@@@@$@`@t@@@@@@@@@$@@@@@H@@B@@@@@F@@H@T@@@@@@$@@@@@@@@@@@E@@@%@@@@k@@\@@_@@"@@@D@@@ @0@@@x@@@l@<@@@@8@@@@h@<@ @@@@@@@x@`@0@@@@@@@@@@@@p@@@@@@@@@@@@ @@ @@@0@@@@@P@X@p@p@@@@@@@@@(@\@h@@@@X@@(@t@@h@@@,@@|@@@@8@@@@h@r@n@@H@@@@@@@@|@2@@X@@@@D@@"@z@)@@@l@@N@p@@B@@d@@ @<@@@@@@@0@@@@@|@h@H@@@@@@@x@d@`@0@(@(@@@@@@@@@@@P@@@@@@@@@@@@@@ @ @0@0@@@P@P@P@P@|@h@@@@@@@@0@0@p@@@@ @P@@@@T@@@t@@0@@ @t@X@@p@@*@&@@@@@n@N@4@r@@@@@@@@@B@@@@@R@@X@6@@@@<@@X@@T@@@`@,@,@ @@@@|@P@<@0@@@@@@@@h@X@P@0@0@0@@@@@@@@@@@`@ @@@@@@@@@@@@@@@ @@@0@@@0@0@P@P@x@`@p@@@@@@@@(@<@X@x@@@ @@@@|@@@@0@`@@@@\@@@@@@@@@@@@"@$@d@@V@@@@@@@ @@"@@@N@@@P@@F@@@@@8@@@\@(@@@@p@H@@@<@0@@@@@@@@x@h@X@H@8@0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @0@@@@@P@T@P@@x@@@@@@@@@ @8@X@x@@@@@@4@`@x@@@@@4@@ @@@@,@@l@@@@@8@@@@@p@@@@@:@@@@@@@"@d@@@<@@@l@|@(@@@@x@@X@0@@@@@@@@@@x@p@T@P@8@(@@@@@@@@@@@@@@@P@@@@@@@@@@@@@@@@@@ @ @0@ @0@@@@@P@`@X@h@x@x@@@@@@@@@ @(@`@`@p@@@@@ @@,@`@p@@@4@@@@@ @`@(@T@@@p@@L@h@@v@<@<@d@@@@@p@P@@<@ @H@ @@x@@@8@@@p@(@@0@@@@@@@@|@h@p@H@H@H@D@@@ @@@@@@@@@@@@@@P@ @@@@@@@@@@@@@@@@@@ @ @@ @0@@@P@P@P@P@`@p@p@@@@@@@@@@@ @ @4@X@h@@x@@@@@ @P@@@@L@@p@H@@@@x@|@8@@@p@@@@@@h@T@@<@@h@@ @@D@@@@,@@@@@@@@@@@@@@@|@h@\@p@D@8@<@@ @,@0@@@@@@@@@@@@@@p@0@@@@@@@@@@@@@@@@@@@@ @@@0@ @ @0@0@@@@@P@<@h@p@@@@@@@@@@@@@8@P@H@X@x@@@@@@P@X@@d@@@@@(@8@@@t@@<@@@@(@l@@@,@@@X@`@@@@@@@@@@`@ @@@@@@x@@@X@`@p@@@@@<@(@(@ @@@@@@@@@@@@@@@@p@@@@@@@@@@@@@@@@@@@@@@@@@@@ @0@0@0@@@@@P@P@`@p@h@@@@@@@@@@@@@@@@8@<@p@x@@@@@@@@P@D@h@x@@@ @@@@0@@@`@@H@@@p@@@@@@@@@p@X@H@P@@@@@@@h@p@p@P@d@d@@@@@D@@ @$@@@@@@@@@@@@@@@@@@P@@@@@@@@@@@@@@@@@@@@@@@@@@ @0@ @0@0@0@@@P@P@p@`@x@@x@@@@@@@@@@@@ @(@D@X@p@p@@@@@@@@@$@(@h@x@P@(@x@@@@@@@@@@@`@@@@(@@@@@@@0@@@@@@@@@`@p@8@X@(@8@8@@@D@@@@@@@@@@@@@@@@@@@@`@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@ @0@0@4@P@H@P@P@`@p@`@p@@@@@@@@@@@@@@0@0@(@\@`@`@p@@@@@@@@@@@@(@0@P@4@@@0@P@|@@H@P@ @@@@@@@@@@@@@H@l@h@X@<@@@(@0@4@@@@@@@@@@@@@@@@@@@@@@@`@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @0@0@ @8@@@P@P@@@P@`@@`@@x@@@@@@@@@@@@@@<@0@0@@@8@P@`@p@@@@@@@@@@@@@@@@@@@@@@@@@@@@@`@`@P@P@`@@@P@ @@@ @@@@@@@@@@@@@@@@@@@@@t@@`@0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ @ @0@0@0@@@@@X@d@X@`@`@p@@p@@@@@@@@@@@@@ @@ @0@,@0@@@@@P@P@p@`@`@`@@p@@@@@@@@@@@x@p@p@P@`@`@p@`@@@@@(@(@0@4@@ @ @@@@@@@@@@@@@@@@@@@@@@@x@p@`@0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @ @ @0@@@@@P@@@P@P@`@p@`@@@@@@@@@@@@@@@|@@@@@ @ @ @0@@@0@(@@@@@P@`@L@`@P@P@p@p@p@\@`@X@P@0@0@0@0@(@,@ @@ @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@p@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @ @@@@@P@@@P@P@P@P@`@h@@p@@@@@@@@@@@@@@@@@@@@@@@ @ @@0@0@d@D@0@0@@@P@P@P@@@8@0@ @@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@p@p@|@l@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @ @ @0@0@P@@@P@P@p@`@`@x@@x@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@p@p@p@p@h@0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @ @0@0@0@@@@@@@H@P@`@t@`@l@@@x@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0@@@@@@@@@@@@@@@@@@@@@@@@@@x@p@@p@p@@`@0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @ @ @ @0@0@@@@@@@P@`@T@p@`@d@`@p@p@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@p@@p@p@`@d@@`@0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @ @ @0@0@8@@@@@@@P@H@d@`@`@h@p@@p@@p@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@p@x@p@l@`@h@`@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@$@@@@@$@ @ @0@0@0@@@@@@@@@X@`@P@`@p@`@@x@p@@x@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@p@p@p@@`@`@p@x@T@p@P@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @ @ @0@@@0@P@@@P@@@P@@@P@`@X@p@`@`@p@@x@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@p@p@|@`@`@`@P@T@X@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @ @ @0@ @0@ @0@0@@@@@P@P@`@P@P@`@`@p@`@p@@@p@@@@@@x@@@@@@@@@@@@@@@@@@@@@@@@@@@@@p@@@@@@`@@`@p@`@`@`@`@h@\@X@0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ @ @0@0@0@0@@@P@@@@@@@P@P@T@P@`@h@`@d@p@@`@@@@p@@@@x@@@x@@@@@x@@x@@@@@@x@@@@@@p@@p@p@@@`@`@`@`@l@`@P@`@`@`@h@X@P@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@ @ @ @ @ @0@0@0@0@@@@@@@@@P@L@P@`@P@`@`@h@p@`@`@`@`@p@`@@h@p@@@p@p@@@p@p@p@p@@p@p@p@@p@@p@p@@x@p@d@t@p@@d@`@`@`@`@p@P@P@\@T@p@H@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@ @ @ @ @ @0@0@0@0@0@@@H@@@@@@@P@h@@@X@P@P@p@`@`@h@`@h@`@`@h@d@`@p@h@`@p@`@p@@x@@p@p@`@p@`@p@p@`@p@`@`@p@p@X@`@`@`@P@P@X@P@P@D@`@8@0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@ @ @ @ @ @ @0@0@0@0@@@@@@@@@@@@@H@P@P@P@H@`@`@`@p@`@`@`@P@`@`@d@`@`@p@`@`@X@p@X@p@p@`@h@`@`@`@`@P@`@P@P@P@P@X@`@P@P@P@@@D@H@P@0@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @ @ @0@ @ @0@ @0@@@0@@@@@@@@@@@@@@@@@@@@@H@X@`@`@P@P@T@\@x@P@P@P@`@P@P@P@P@P@P@`@X@l@@`@P@`@P@P@P@X@P@@@P@@@D@D@H@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@8@@@ @0@ @ @ @0@0@@@8@X@0@X@0@D@@@@@@@@@@@@@P@@@@@@@P@`@D@H@P@P@P@h@@@P@P@P@P@P@@@@@`@H@@@P@@@P@P@P@P@@@@@D@P@H@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @ @ @ @ @0@$@0@ @8@T@0@@@@@@@@@@@0@H@P@@@P@8@@@@@@@P@H@@@@@@@@@@@P@@@@@@@@@@@@@@@@@P@@@0@0@H@P@P@(@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@(@ @ @ @ @ @(@0@0@(@<@@@0@8@0@0@0@0@@@P@@@0@0@@@@@@@H@@@@@0@@@@@@@H@@@@@@@@@0@0@@@0@0@P@@@@@8@(@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @ @ @ @ @ @0@ @D@@D@0@0@@@4@0@@@0@@@0@0@@@@@@@@@0@@@0@@@@@@@@@@@@@@@@@0@0@@@0@0@0@0@(@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@sunpy-0.8.3/sunpy/data/test/gbm.fits0000644000175000017500000007570013231613137017607 0ustar nabilnabil00000000000000SIMPLE = T / file does conform to FITS standard BITPIX = 8 / number of bits per data pixel NAXIS = 0 / number of data axes EXTEND = T / FITS dataset may contain extensions COMMENT FITS (Flexible Image Transport System) format is defined in 'AstronomyCOMMENT and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H CREATOR = 'GBM_SCI_Reader.pl v1.19' / Software and version creating file FILETYPE= 'PHAII ' / Name for this type of FITS file FILE-VER= '1.0.0 ' / Version of the format for this filetype TELESCOP= 'GLAST ' / Name of mission/satellite INSTRUME= 'GBM ' / Specific instrument used for observation DETNAM = 'NAI_05 ' / Individual detector name OBSERVER= 'Meegan ' / GLAST Burst Monitor P.I. ORIGIN = 'GIOC ' / Name of organization making file DATE = '2011-06-07T02:48:45' / file creation date (YYYY-MM-DDThh:mm:ss UT) DATE-OBS= '2011-06-06T23:59:55' / Date of start of observation DATE-END= '2011-06-08T00:00:05' / Date of end of observation TIMESYS = 'TT ' / Time system used in time keywords TIMEUNIT= 's ' / Time since MJDREF, used in TSTART and TSTOP MJDREFI = 51910 / MJD of GLAST reference epoch, integer part MJDREFF = 7.428703703703703D-4 / MJD of GLAST reference epoch, fractional part TSTART = 329097595.403286 / [GLAST MET] Observation start time TSTOP = 329184005.307830 / [GLAST MET] Observation stop time FILENAME= 'glg_cspec_n5_110607_v00.pha' / Name of this file DATATYPE= 'CSPEC ' / GBM datatype used for this file INFILE01= 'glg_lutcs_nai_100716346_v00.fit' / Level 1 input lookup table file INFILE02= 'GLAST_2011158_015300_VC09_GSPEC.0.00' / Level 0 input data file INFILE03= 'GLAST_2011158_034700_VC09_GSPEC.0.00' / Level 0 input data file INFILE04= 'GLAST_2011158_062700_VC09_GSPEC.0.00' / Level 0 input data file INFILE05= 'GLAST_2011158_080800_VC09_GSPEC.0.00' / Level 0 input data file INFILE06= 'GLAST_2011158_113300_VC09_GSPEC.0.00' / Level 0 input data file INFILE07= 'GLAST_2011158_135000_VC09_GSPEC.0.00' / Level 0 input data file INFILE08= 'GLAST_2011158_154400_VC09_GSPEC.0.00' / Level 0 input data file INFILE09= 'GLAST_2011158_173100_VC09_GSPEC.0.00' / Level 0 input data file INFILE10= 'GLAST_2011158_190000_VC09_GSPEC.0.00' / Level 0 input data file INFILE11= 'GLAST_2011158_204200_VC09_GSPEC.0.00' / Level 0 input data file INFILE12= 'GLAST_2011158_222600_VC09_GSPEC.0.00' / Level 0 input data file INFILE13= 'GLAST_2011159_013000_VC09_GSPEC.0.00' / Level 0 input data file INFILE14= 'GLAST_2011159_040200_VC09_GSPEC.0.00' / Level 0 input data file CHECKSUM= 'TYTDWVRBTVRBTVRB' / HDU checksum updated 2011-06-08T04:33:29 DATASUM = ' 0' / data unit checksum updated 2011-06-07T02:48:45 END XTENSION= 'BINTABLE' / binary table extension BITPIX = 8 / 8-bit bytes NAXIS = 2 / 2-dimensional binary table NAXIS1 = 10 / width of table in bytes NAXIS2 = 128 / number of rows in table PCOUNT = 0 / size of special data area GCOUNT = 1 / one data group (required keyword) TFIELDS = 3 / number of fields in each row TTYPE1 = 'CHANNEL ' / label for field 1 TFORM1 = '1I ' / data format of field: 2-byte INTEGER TUNIT1 = 'none ' / physical unit of field TLMIN1 = 0 / Channel numbers are non-negative TLMAX1 = 127 / Greater than the number of channels TTYPE2 = 'E_MIN ' / label for field 2 TFORM2 = '1E ' / data format of field: 4-byte REAL TUNIT2 = 'keV ' / physical unit of field TLMIN2 = 0 / Lowest channel energy TLMAX2 = 2000 / Highest channel energy TTYPE3 = 'E_MAX ' / label for field 3 TFORM3 = '1E ' / data format of field: 4-byte REAL TUNIT3 = 'keV ' / physical unit of field TLMIN3 = 0 / Lowest channel energy TLMAX3 = 2000 / Highest channel energy EXTNAME = 'EBOUNDS ' / name of this binary table extension TELESCOP= 'GLAST ' / Name of mission/satellite INSTRUME= 'GBM ' / Specific instrument used for observation DETNAM = 'NAI_05 ' / Individual detector name OBSERVER= 'Meegan ' / GLAST Burst Monitor P.I. ORIGIN = 'GIOC ' / Name of organization making file DATE = '2011-06-07T02:48:45' / file creation date (YYYY-MM-DDThh:mm:ss UT) DATE-OBS= '2011-06-06T23:59:55' / Date of start of observation DATE-END= '2011-06-08T00:00:05' / Date of end of observation TIMESYS = 'TT ' / Time system used in time keywords TIMEUNIT= 's ' / Time since MJDREF, used in TSTART and TSTOP MJDREFI = 51910 / MJD of GLAST reference epoch, integer part MJDREFF = 7.428703703703703D-4 / MJD of GLAST reference epoch, fractional part TSTART = 329097595.403286 / [GLAST MET] Observation start time TSTOP = 329184005.307830 / [GLAST MET] Observation stop time HDUCLASS= 'OGIP ' / Conforms to OGIP standard indicated in HDUCLAS1HDUCLAS1= 'RESPONSE' / These are typically found in RMF files HDUCLAS2= 'EBOUNDS ' / From CAL/GEN/92-002 HDUVERS = '1.2.0 ' / Version of HDUCLAS1 format in use CHANTYPE= 'PHA ' / No corrections have been applied FILTER = 'None ' / The instrument filter in use (if any) DETCHANS= 128 / Total number of channels in each rate EXTVER = 1 / Version of this extension format GBMCKSUM= 'ea20 ' / GBM FSW icrc shecksum value (hex) CH2E_VER= 'SPLINE 2.0' / Channel to energy conversion scheme used GAIN_COR= 1.0 / Gain correction factor applied to energy edges CHECKSUM= 'OGMYOFMVOFMVOFMV' / HDU checksum updated 2011-06-08T04:33:29 DATASUM = '1439395070' / data unit checksum updated 2011-06-07T02:48:45 END @@!@!@»@»@@@@A *A *A+A+A&WA&WA6A6AG1N AG1NAXu AXuAiD AiDA{ A{A% A%AԠAԠAAAAA A AAAAAAAAAAA{pA{pB B B B B0 B0 BBB!nXB!nXB(C-CҔ?CҔC3@C3C AC C%BC%C+LCC+LC0DC0C6JEC6JC;FC;CAGCACGVHCGVCN ICN CTj@JCTj@C[ KC[ CaLCaCh MCh Co9NCo9CwOCwC~nPC~nCQCCRCC&SC&CATCAC}UC}C9VC9CZWCZCXCCDYCDCZCCk[CkC،\C،C&]C&C^CC,f_C,fCp`CpCaCCbCC!cC!C?dC?CeCCfCCbgCbCҝhCҝDUiDUDjDD kD DolDoDmDDnnDnDoDDhpDhD#qD#D(rD(D-;PsD-;PD2mtD2mD7uD7D<3vD<3DAdwDAdDFxDFDL,yDL,DQuzDQuDWw{DWwD]^|D]^Dce+}Dce+Dl|g~Dl|gDuDuDXTENSION= 'BINTABLE' / binary table extension BITPIX = 8 / 8-bit bytes NAXIS = 2 / 2-dimensional binary table NAXIS1 = 278 / width of table in bytes NAXIS2 = 10 / number of rows in table PCOUNT = 0 / size of special data area GCOUNT = 1 / one data group (required keyword) TFIELDS = 5 / number of fields in each row TLMIN2 = 0.0 / Exposure is non-negative TLMAX2 = 200000.0 / Exposure no longer than 2 days TLMIN4 = 0.0 / MJDREF will be before launch TLMAX4 = 1500000000.0 / 47 years after MJDREF TLMIN5 = 0.0 / MJDREF will be before launch TLMAX5 = 1500000000.0 / 47 years after MJDREF EXTNAME = 'SPECTRUM' / name of this binary table extension TELESCOP= 'GLAST ' / Name of mission/satellite INSTRUME= 'GBM ' / Specific instrument used for observation DETNAM = 'NAI_05 ' / Individual detector name OBSERVER= 'Meegan ' / GLAST Burst Monitor P.I. ORIGIN = 'GIOC ' / Name of organization making file DATE = '2011-06-07T02:48:45' / file creation date (YYYY-MM-DDThh:mm:ss UT) DATE-OBS= '2011-06-06T23:59:55' / Date of start of observation DATE-END= '2011-06-08T00:00:05' / Date of end of observation TIMESYS = 'TT ' / Time system used in time keywords TIMEUNIT= 's ' / Time since MJDREF, used in TSTART and TSTOP MJDREFI = 51910 / MJD of GLAST reference epoch, integer part MJDREFF = 7.428703703703703D-4 / MJD of GLAST reference epoch, fractional part TSTART = 329097595.403286 / [GLAST MET] Observation start time TSTOP = 329184005.307830 / [GLAST MET] Observation stop time FILTER = 'none ' / The instrument filter in use (if any) AREASCAL= 1. / No special scaling of effective area by channelBACKFILE= 'none ' / Name of corresponding background file (if any) BACKSCAL= 1. / No scaling of background CORRFILE= 'none ' / Name of corresponding correction file (if any) CORRSCAL= 1. / Correction scaling file RESPFILE= 'none ' / Name of corresponding RMF file (if any) ANCRFILE= 'none ' / Name of corresponding ARF file (if any) SYS_ERR = 0. / No systematic errors POISSERR= T / Assume Poisson Errors GROUPING= 0 / No special grouping has been applied HDUCLASS= 'OGIP ' / Format conforms to OGIP standard HDUCLAS1= 'SPECTRUM' / PHA dataset (OGIP memo OGIP-92-007) HDUCLAS2= 'TOTAL ' / Indicates gross data (source + background) HDUCLAS3= 'COUNT ' / Indicates data stored as counts HDUCLAS4= 'TYPEII ' / Indicates PHA Type II file format HDUVERS = '1.2.1 ' / Version of HDUCLAS1 format in use CHANTYPE= 'PHA ' / No corrections have been applied DETCHANS= 128 / Total number of channels in each rate EXTVER = 1 / Version of this extension format CHECKSUM= 'ad7cab4cab4cab4c' / HDU checksum updated 2011-06-08T04:33:29 DATASUM = '2492406410' / data unit checksum updated 2011-06-08T04:33:29 TTYPE1 = 'COUNTS ' TFORM1 = '128I ' TUNIT1 = 'count ' TSCAL1 = 1 TZERO1 = 32768 TTYPE2 = 'EXPOSURE' TFORM2 = '1E ' TUNIT2 = 's ' TTYPE3 = 'QUALITY ' TFORM3 = '1I ' TTYPE4 = 'TIME ' TFORM4 = '1D ' TUNIT4 = 's ' TZERO4 = 329097602.0 TTYPE5 = 'ENDTIME ' TFORM5 = '1D ' TUNIT5 = 's ' TZERO5 = 329097602.0 END ")9CZn~rjxpPQ4;099&-83)3461/"1)# &#             h@0c vX(&GN[ty~{a@S=H7/,424.*,5+-(& #"          c@vX?">?GgvrGFC8+1*7&9&6$*3;6$(!.""           쀋@?@"*20E{{vyIS5E53/7&7'1-/:=/)$ $!        k@d@@#/D!3/@Cyv|~_HA5=-2887:!.64;4)++("$!'$$            x@(@#/D@+^N !3/?GkyrzuwqHE31.77,54743==<*"%"!# ##!%            @@+^N@1Ƭ%"*7;fzm~jRF".,7%<*%,*# !+%           @%@1Ƭ@6_),.RrmxkJO8*<7168@9$.45)8$'%             x@@6_@:+'(&BBwz~zj[;I:7:)0;;,,**14;1##")"! &!!)*            $@@:+@>D&! 3?Dawy|twwtOF5;8<88-:)".2/0;&*#*,# '"'#            v@T@>D&@A.ĀXTENSION= 'BINTABLE' / binary table extension BITPIX = 8 / 8-bit bytes NAXIS = 2 / 2-dimensional binary table NAXIS1 = 16 / width of table in bytes NAXIS2 = 10 / number of rows in table PCOUNT = 0 / size of special data area GCOUNT = 1 / one data group (required keyword) TFIELDS = 2 / number of fields in each row TTYPE1 = 'START ' / label for field 1 TFORM1 = '1D ' / data format of field: 8-byte DOUBLE TUNIT1 = 's ' / physical unit of field TZERO1 = 329097602.000000 / Offset (s), equal to TRIGTIME TTYPE2 = 'STOP ' / label for field 2 TFORM2 = '1D ' / data format of field: 8-byte DOUBLE TUNIT2 = 's ' / physical unit of field TZERO2 = 329097602.000000 / Offset (s), equal to TRIGTIME EXTNAME = 'GTI ' / name of this binary table extension TELESCOP= 'GLAST ' / Name of mission/satellite INSTRUME= 'GBM ' / Specific instrument used for observation DETNAM = 'NAI_05 ' / Individual detector name OBSERVER= 'Meegan ' / GLAST Burst Monitor P.I. ORIGIN = 'GIOC ' / Name of organization making file DATE = '2011-06-07T02:48:45' / file creation date (YYYY-MM-DDThh:mm:ss UT) DATE-OBS= '2011-06-06T23:59:55' / Date of start of observation DATE-END= '2011-06-08T00:00:05' / Date of end of observation TIMESYS = 'TT ' / Time system used in time keywords TIMEUNIT= 's ' / Time since MJDREF, used in TSTART and TSTOP MJDREFI = 51910 / MJD of GLAST reference epoch, integer part MJDREFF = 7.428703703703703D-4 / MJD of GLAST reference epoch, fractional part TSTART = 329097595.403286 / [GLAST MET] Observation start time TSTOP = 329184005.307830 / [GLAST MET] Observation stop time HDUCLASS= 'OGIP ' / Conforms to OGIP standard indicated in HDUCLAS1HDUCLAS1= 'GTI ' / Indicates good time intervals HDUVERS = '1.2.0 ' / Version of HDUCLAS1 format in use EXTVER = 1 / Version of this extension format CHECKSUM= 'ZcS8iaS5ZaS5faS5' / HDU checksum updated 2011-06-08T04:33:29 DATASUM = '4103018472' / data unit checksum updated 2011-06-08T04:33:29 END c @,a @q@@@šހ@+Z @7:@@q*`@h@@숷@O@qw @?+@,rP@bҠ@H`@.@P@40sunpy-0.8.3/sunpy/data/test/generated_sample.genx0000644000175000017500000001602013231613137022323 0ustar nabilnabil00000000000000Sat Oct 29 08:15:08 2016x86_64linux8.4//Sample crazy file to test the sunpy genx reader MYTEXT MYTEXT_ARRAYMYTEXT_ARRAY_DIMENSIONMYNUMBERMYNUMBER_ARRAYMYNUMBER_ARRAY_DIMENSIONMYUINT MYSTRUCTUREMYSTRUCTURE_ARRAYx NAME MYFNUMBERMYFARRAY MYFARRAYD MYDNUMBERMYDARRAY MYDARRAYD NESTEDSTRUCTMYTEXT RANDOMNUMBERS MYCNUMBERMYCARRAY MYDCNUMBER MYDCARRAYSPAM MYLNUMBERMYLARRAY MYLARRAYD MYULNUMBER MYL64NUMBER MYUL64NUMBER ""  NAME MYFNUMBERMYFARRAY MYFARRAYD MYDNUMBERMYDARRAY MYDARRAYD NESTEDSTRUCTMYTEXT RANDOMNUMBERS MYCNUMBERMYCARRAY MYDCNUMBER MYDCARRAYSPAM MYLNUMBERMYLARRAY MYLARRAYD MYULNUMBER MYL64NUMBER MYUL64NUMBER ""  AAWaiter to Mr Creosote: 'Finally, monsieur – a wafer-thin mint.'AAWaiter to Mr Creosote: 'Finally, monsieur – a wafer-thin mint.'AAWaiter to Mr Creosote: 'Finally, monsieur – a wafer-thin mint.'AAWaiter to Mr Creosote: 'Finally, monsieur – a wafer-thin mint.'AAWaiter to Mr Creosote: 'Finally, monsieur – a wafer-thin mint.'AAWaiter to Mr Creosote: 'Finally, monsieur – a wafer-thin mint.'AAWaiter to Mr Creosote: 'Finally, monsieur – a wafer-thin mint.'AAWaiter to Mr Creosote: 'Finally, monsieur – a wafer-thin mint.'AAWaiter to Mr Creosote: 'Finally, monsieur – a wafer-thin mint.'AAWaiter to Mr Creosote: 'Finally, monsieur – a wafer-thin mint.'  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwfloats and doubles@?@?@@@@@@ ?@?@@@@brian, longs and ulongs adding also complexWith love from San Francisco, 2016AA ?@@.@4@$@&@(?floats and doubles@?@?@@@@@@ ?@?@@@@brian, longs and ulongs adding also complexWith love from San Francisco, 2016AA ?@@.@4@$@&@(?floats and doubles@?@?@@@@@@ ?@?@@@@brian, longs and ulongs adding also complexWith love from San Francisco, 2016AA ?@@.@4@$@&@(?floats and doubles@?@?@@@@@@ ?@?@@@@brian, longs and ulongs adding also complexWith love from San Francisco, 2016AA ?@@.@4@$@&@(?floats and doubles@?@?@@@@@@ ?@?@@@@brian, longs and ulongs adding also complexWith love from San Francisco, 2016AA ?@@.@4@$@&@(?floats and doubles@?@?@@@@@@ ?@?@@@@brian, longs and ulongs adding also complexWith love from San Francisco, 2016AA ?@@.@4@$@&@(?floats and doubles@?@?@@@@@@ ?@?@@@@brian, longs and ulongs adding also complexWith love from San Francisco, 2016AA ?@@.@4@$@&@(?sunpy-0.8.3/sunpy/data/test/go1520110607.fits0000644000175000017500000251350013231613137020433 0ustar nabilnabil00000000000000SIMPLE = T /Written by IDL: Tue Jun 26 09:32:13 2012 BITPIX = 8 / NAXIS = 0 / EXTEND = T /File contains extensions DATE = '26/06/2012' /file creation date NUMEXT = 3 /no. of extensions in file TELESCOP= 'GOES 15 ' /spacecraft INSTRUME= 'X-ray Detector' / OBJECT = 'Sun ' / ORIGIN = 'SDAC/GSFC' /written by Solar DAC at GSFC DATE-OBS= '07/06/2011' /date of first obs.(DD/MM/YYYY) TIME-OBS= '00:00:00.000' /UT time of first obs.(HH:MM:SS.XXX) DATE-END= '07/06/2011' /date of last obs.(DD/MM/YYYY) TIME-END= '23:59:57.632' /UT time of last obs.(HH:MM:SS.XXX) COMMENT Energy band information given in extension 1 COMMENT Fluxes information given in extension 2 COMMENT Status word information given in extension 3 COMMENT Ref.: Solar X-Ray Measurements from SMS-1, SMS-2, and GOES-1; COMMENT Information for Data Users. Donnelly et al, June 1977. COMMENT NOAA TM ERL SEL-48 COMMENT Ref.: SMS GOES Space Environment Monitor Subsystem, COMMENT Grubb, Dec 75, NOAA, Technical Memorandum ERL SEL-42. COMMENT Ref.:Expresions to Determine Temperatures and Emission COMMENT Measures for Solar X-ray events from GOES Measurements. COMMENT Thomas et al, 1985, Solar Physics 95, pp 323-329. END XTENSION= 'BINTABLE' /Written by IDL: Tue Jun 26 09:32:13 2012 BITPIX = 8 / NAXIS = 2 /Binary table NAXIS1 = 16 /Number of bytes per row NAXIS2 = 1 /Number of rows PCOUNT = 0 /Random parameter count GCOUNT = 1 /Group count TFIELDS = 1 /Number of columns EXTNAME = 'EDGES ' /name of this binary extension DATE = '26/06/2012' /file creation date TELESCOP= 'GOES 15 ' /spacecraft INSTRUME= 'X-ray Detector' / OBJECT = 'Sun ' / ORIGIN = 'SDAC/GSFC' /written by Solar DAC at GSFC TFORM1 = '4E ' /Real*4 (floating point) TTYPE1 = 'EDGES ' /Label for column 1 TDIM1 = '(2,2) ' /Array dimensions for column 1 TUNIT1 = 'angstrom' /Units of column 1 END ?A?@XTENSION= 'BINTABLE' /Written by IDL: Tue Jun 26 09:32:13 2012 BITPIX = 8 / NAXIS = 2 /Binary table NAXIS1 = 674832 /Number of bytes per row NAXIS2 = 1 /Number of rows PCOUNT = 0 /Random parameter count GCOUNT = 1 /Group count TFIELDS = 2 /Number of columns MJDREF = 43874 /MJD for reference file TIMESYS = 'MJD ' /The time system is MJD TIMEUNIT= 's ' /Unit for TSTART and TSTOP TIMEZERO= 55719 /Time zero off-set TSTART = -0.0380001068115 /Observation start time TSTOP = 86397.6319999 /Observation stop time EXTNAME = 'FLUXES ' /name of this binary extension DATE = '26/06/2012' /file creation date TELESCOP= 'GOES 15 ' /spacecraft INSTRUME= 'X-ray Detector' / OBJECT = 'Sun ' / ORIGIN = 'SDAC/GSFC' /written by Solar DAC at GSFC TFORM1 = '42177D ' /Real*8 (double precision) TTYPE1 = 'TIME ' /Label for column 1 TUNIT1 = 's ' /Units of column 1 TFORM2 = '84354E ' /Real*4 (floating point) TTYPE2 = 'FLUX ' /Label for column 2 TDIM2 = '(2,42177)' /Array dimensions for column 2 TUNIT2 = 'W /m**2 ' /Units of column 2 COMMENT Times given for GOES < 13 are usually 2-3 seconds after start time of. COMMENT interval. Can not be more exact due to analog filtering of data with tiCOMMENT constant of 6-10 seconds. COMMENT GOES 13,14,15 times are the center of the 2.048s exposure interval COMMENT Flux value of -99999.0 means no data. END t@n@@@]O@Ac32@Bi@Co@Du@E|0@F@GQ@HV@IZ@J@K@L =@MU@Nn@Ox@P_@PG@QeS@Q`@Rl@R =@Sr=p@S?|@TxA@Tt@U~ff@V@V@W@W@X @Xě@Y΀@Yڀ@Z-@Z@[ @[S@\&V@\7@],z@]|@^2 @^,@_8`@_ @`l@`a$@`*@` Ā@a%@ag@a9@@a5?@@b+@bmG@bȴ@bbM@c1S@cs|@@c@@cvȀ@d8b@dyh@@d+@d@e>$@ev@e?|@f@@fDQ@@f@fl@g@@gJ*@g@ǵ@h @hP@hz@hӮ@@i/@iV @iI@@i@@j\(@j\/@j^5@j@k!p@kc =@@kC@k I@l'@li@lQ@l9W@m-^@moS@m̀@mff@@n3l@@nuhr@n @nz@o:z@o{@o@o @p z@p@G@paʠ@pbM@p/@p@pQ@qx@q&9X@qG$@qg@@q\@qO @qb@@q/@r @r,Z@rM&`@rml@r9@@rp@r1&@r@sv@s2C@sSG@st1@s@s@sbM@s@@t;@@t8 @tYl @tz9X@t€@tE@t܃`@tC`@ub@@u>@u_O@uZ@u@ul@u@vdZ@v$1&@vD@vev@vz @v;d@@v1@vȴ @w @w*Q`@wKn@wk;@@w`@wl @w(@wx@x@x0vȠ@xQ33 @xq@x@x@xM@x =`@y @y6@@yWX@@yx$ @yG@y`@yn@y/@z`@zv@V(@p @@G@X @hp@@X@ (@49T@LI@eP@}p@ <@"@&+@*Ę@.Q@3@7)@;B H@?[@Cs30@G@K,@O@Sև(@Wx@\@`t@d7@hQhp@lh@pX@t@x@|I@@p@@-d@G+@^P@xQ@bL@r@ H@ٙ@@ C@#S@<@Tz@l@@Ɔ$@ʞ5<@η@\$@l@ @@2@J=l@bM@{h@@d@@/@Ȱ@@ (r@?@X`@q@\@ S@$D@(@,@1@5(@95Œ@=M@AeP@E|@I <@M@Qȴ8@UĘ@Y^0@^@b+@fC|@j[@nu?x@r@vfd@zv@~և(@ @@!G@9X @Qhp@k@X@(@9T@I@P@p@ <@/@G+@`Ę@xQ@ȑ@̩@ H@ۥ@30@ @$,@<@V(@nx@$@t@@hp@@ @ @2@LI@c@{h@@"d@&+@*޸P@.Ȱ@3bL@7(r@;B H@?Y@Cq@GC@KS@O@Sz@W@@\$@`5<@d7@hO\$@lgl@p @t@x@|=l@M@h@@-d@E@]/@vȰ@@r@@`@@ \@!G@:D@R@k@Ƅ@ʜ(@εŒ@@P@|@ <@0@H8@`Ę@z^0@@@Õ|@ۥ@?x@ @ &fd@>v@V(@p @@ G@$X @(hp@,@1X@5(@949T@=LI@AeP@E}p@I <@M@Q+@UĘ@YQ@^@b)@fB H@j[@ns30@r@v,@z@~և(@x@$@t@7@Qhp@h@ @@@I@@h@@-d@G+@^P@vȰ@ȐbL@̨r@ H@ٙ@@ C@#S@<@Tz@l@@$@5<@Œ@\$@l@|@ @0@J=l@bM@z^0@@"@&@*/@.?x@3@7&fd@;?@?X`@Cp @G\@KG@OD@S@W@\@`(@d5Œ@hM@leP@p|@t <@x@|ȴ8@Ę@^0@@+@C|@[@u?x@@fd@v@և(@ @@!G@9X @Qhp@k@ƂX@ʚ@δ9T@I@P@p@@/@G+@`Ę@xQ@bL@@ H@ۥ@30@ C@ $,@<@V(@nx@$@ t@$@(hp@,@1 @5@92@=LI@Ac@E{h@I@Md@Q+@U޸P@YȰ@^bL@b(r@fB H@jY@nq@rC@vS@z@~z@@@@5<@5Œ@O\$@gl@|@@@=l@M@^0@@+@E@]/@u?x@Ȏ@̦fd@п@`@ @ \@!G@:D@R@k@񄛤@(@Œ@@P@|@  <@/@H8@`Ę@z^0@@"@&Õ|@*ۥ@.?x@3 @7$,@;>v@?V(@Cp @G@Kt@OX @Shp@W@\X@`@d49T@hLI@leP@p}p@t@x@|+@Ę@Q@bL@)@B H@[@s30@C@,@@և(@x@$@t@7@Qhp@h@Ɓ @ʙ@β@=l@@h@@-d@E@^P@vȰ@@r@@ٙ@@ \@ #S@:D@Tz@l@@@ 5<@$Œ@(\$@,l@0|@5@90@=J=l@AbM@Ez^0@I@M@Q@U/@Y?x@^@b&fd@f?@jX`@np @r\@vG@zD@~@@@(@49T@M@eP@|@ <@@ȴ8@Ę@^0@@)@C|@[@u?x@Ȍ@̤,@оv@և(@ @@t@9X @Qhp@k@X@@9T@I@P@p@ @/@G+@`Ę@xQ@bL@"@& H@*ۥ@.30@3 C@7$,@;<@?V(@Cnx@G$@Kt@O@S\$@W@\ @`@d2@hJ=l@lc@p{h@t@xd@|@޸P@Ȱ@@(r@?@Y@q@\@S@D@z@@@@5<@5Œ@O\$@gl@|@ʙ@ΰ@=l@M@^0@@+@C|@]/@u?x@@fd@v@`@ @ \@ !G@9X @R@k@@ (@$9T@(@,P@0|@5 <@9/@=H8@A`Ę@Ez^0@I@M@QÕ|@Uۥ@Y?x@^ @b$,@f>v@jV(@np @r@vt@zX @~hp@@X@@49T@LI@eP@}p@@d@+@޸P@Q@bL@(r@B H@Y@s30@ȋC@̣S@м@z@x@$@5<@7@O\$@h@ @@@=l@@h@ @-d@E@^P@vȰ@@"r@&@*ٙ@.@3 \@7#S@;:D@?Tz@Cl@@G@K5<@OŒ@S\$@Wl@[|@`@d0@hH8@lbM@pz^0@t@x@|Õ|@/@?x@@&fd@>v@X`@p @\@G@X @@@@(@49T@M@eP@|@ʗ <@ί@ȴ8@Ę@^0@@)@B H@[@s30@@,@@և(@x@@ t@7@Qhp@h@X@ @$@(I@,@0p@5@9-d@=G+@A^P@ExQ@IbL@Mr@Q H@Uٙ@Y30@^ C@b#S@f<@jTz@nnx@r$@v5<@z@~\$@@ @@2@J=l@c@{h@@d@@/@Ȱ@@(r@?@X`@q@ȉ\@̣S@кD@@@@@5<@5Œ@M@gl@|@@@ȴ8@M@^0@ @+@C|@]/@u?x@@"fd@&v@*`@. @3 \@7!G@;9X @?R@Ck@G@K(@O9T@S@WP@[|@` <@d/@hH8@l`Ę@pxQ@t@x@| H@ۥ@30@ @$,@<@V(@nx@@t@@hp@@X@@2@LI@c@}p@ʕ@έd@+@޸P@Q@bL@(r@B H@Y@q@C@S@@z@E@l@@j@ '@ 3D@@@LB@YX@e@q&@}@@Ȳ@Z@ @"dX@$l@&9V@(@*0@,@/.@1@3p@5)x@76E@9BM@;O@=ZF@?fx@AsD@Cv@EB@GQ@IZ@K&@M/@O@QŽ@Sʾ@U@W@Zfd@\32@^;b@`+C@b8`@dC@fP@h\@jh8@lu@nG@pz@r@t$@v@xP@z˅@|׍N@~㕀@bL@(@@@!$@-@9@Ffd@Rn@^v@kC@w <@@:@j@8@z@G@O@X@$@@P@ @Ȳ@#@/\(@<(@H1&@T9V@a$@l@x@ą@Ƒ@Ȟv@ʪ=p@̶E@l@@j@@D@@ B@X@%@1&@=@I@VȲ@bZ@n@{dX@l@9V@@0@@.@ѩ@p@x@E@M@@F@ &x@ 3D@?v@LB@XQ@dZ@q&@}/@@Ž@ʾ@ @"@$fd@&32@(;b@*C@,`@/@1@3@5(8@75@9AG@;Nz@=Z@?f$@Ar@C~P@E@GN@I@KbL@M(@O@Q@S$@U@W@Zfd@\n@^v@`+C@b7 <@dCl@fO:@h[j@jh8@ltz@n@pO@rX@t$@v@x@z@|Ȳ@~㕀@\(@dX@1&@9V@!$@,@8@E@Q@^v@j=p@vE@l@@j@@D@@̋B@X@@&@@ @Ȳ@"Z@.@;dX@Gl@T9V@_@l0@x`@Ą.@Ɛ@ȝp@ʩx@̵@M@z@F@x@@v@ @Q@$Z@0bL@=/@H@UŽ@aʾ@m@z@fd@32@;b@C@`@@У@ܬ@8@@G@z@@ &$@ 2@>P@K@WN@c@pbL@|(@@@$@ @"@$š@&n@(v@*C@, <@/l@1:@3j@5(8@74z@9@@;MO@=YX@?f$@Aq@C}@E@GȲ@I@K\(@MdX@O1&@Q9V@S$@U@W@Z@\@^v@`*=p@b6E@dCl@fO@hZF@jg@lsD@nv@pB@rQ@t@v&@x/@z@|Ž@~Z@@@l@32@@,0@8`@D.@P@]p@ix@u@M@z@F@x@@v@˅@Q@Z@bL@/@@Ž@!ʾ@-@:@Ffd@S32@_;b@kC@x`@ă@Ɛ@Ȝ@ʨ8@̵@G@O@@$@@P@ @N@#@0bL@<(@H1&@T@a$@m@y@@n@v@C@ <@l@:@j@8@z@@ O@X@ %@ 1@=@I@VȲ@bZ@o\(@{dX@l@9V@@ @"@$.@&ѩ@(p@*=p@,E@/M@1@3F@5'@73D@9?v@;LB@=XQ@?e@Aq&@C}/@E@GŽ@IZ@K@M@Ol@Q32@S@U0@W`@Z.@\@^p@`)x@b5@dBM@fNz@hZF@jfx@lr@nv@p@rN@tZ@vbL@x/@z@|@~ʾ@@@fd@n@;b@+C@8`@C@O:@\@h8@u@G@O@@$@@P@@׍N@㕀@bL@(@1&@@!$@-@9@E@Rn@^v@kC@w <@ăl@Ə:@țj@ʨ8@̴z@@̋B@X@@@@ @Ȳ@"Z@/\(@;dX@Gl@T9V@_@l@x@.@@p@=p@E@M@@F@@D@v@ B@Q@ %@ 1&@=/@I@UŽ@aʾ@n@z@l@32@;b@ 0@"`@$.@&У@(ܬ@*x@,@/M@1z@3@5&x@72@9?v@;K@=WN@?dZ@ApbL@C}/@E@G@Iʾ@K@M@Ofd@Qn@S;b@UC@W`@Z@\:@^@`(8@b5@dAG@fMO@hZ@jf$@lr@n~P@p@rȲ@t@v\(@x(@z1&@|9V@~$@@@@@v@*=p@7 <@Cl@O@[j@g@tz@@B@X@@@@@Ȳ@Z@\(@dX@l@9V@@,@8@D.@Q@]p@j=p@vE@ĂM@Ə@ȚF@ʧ@̳D@οv@̋B@Q@Z@&@/@ @Ž@!ʾ@.@:@Gl@S32@_;b@l0@x`@.@@@x@@M@z@@x@@v@ @N@ $Z@ 0bL@=/@H@T@aʾ@m@y@fd@n@v@ C@" <@$@&:@(j@*8@,z@/G@1 O@3X@5&$@71@9>P@;J@=VȲ@?c@Ao\(@C|(@E1&@G9V@I$@K@M@Oš@Qѩ@Sv@U=p@W <@Zl@\@^j@`'@b4z@d@@fLB@hYX@je@lq@n}@p@rȲ@tZ@v\(@xdX@zl@|9V@~@0@@.@@p@)x@6E@BM@O@ZF@fx@sD@v@B@Q@Z@&@/@@Ž@ʾ@@@l@32@;b@,0@8`@D.@P@\@ix@u@ĂM@Ǝz@Ț@ʦx@̲@οv@˅@׍N@Z@bL@/@@@!$@-@9@Ffd@Rn@^v@kC@w <@@:@j@8@z@G@O@X@$@@P@ @Ȳ@ #@ /\(@<(@H1&@T9V@a$@l@y@@@v@ =p@"E@$l@&@(j@*@,D@/@1 B@3X@5%@71&@9=@;I@=VȲ@?bZ@An@C{dX@El@G9V@I@K0@M@O.@Qѩ@Sp@Ux@WE@ZM@\@^F@`&x@b3D@d?v@fLB@hXQ@jdZ@lq&@n}/@p@rŽ@tʾ@v@x@zl@|32@~;b@C@`@@@@(8@5@AG@Nz@Z@f$@r@~P@@N@@bL@(@@@$@@@fd@n@v@+C@7 <@C@O:@[j@h8@tz@Ā@ƍO@șX@ʦ$@̱@ν@@Ȳ@㕀@\(@dX@1&@9V@!$@,@8@E@Q@^v@j=p@vE@l@@j@@D@@̋B@X@@&@@ @Ȳ@ "Z@ .@;dX@Gl@T9V@_@l0@x@.@@p@ x@"@$M@&z@(F@*x@,@.v@1 @3Q@5$Z@70bL@9=/@;H@=UŽ@?aʾ@Am@Cz@Efd@G32@I;b@KC@M`@O@QУ@Sܬ@U8@W@ZG@\z@^@`&$@b2@d>P@fK@hWN@jc@lpbL@n|(@p@r@t$@v@x@zfd@|n@~v@C@ <@l@:@j@(8@4z@@@MO@YX@f$@q@}@@Ȳ@@\(@dX@1&@9V@$@@@@@v@*=p@6E@Cl@O@[j@g@sD@Ā@ƌB@ȘQ@ʥ@̱&@ν/@@Ž@Z@@@l@32@@,0@8`@D.@P@]p@ix@u@M@z@F@x@@v@˅@Q@Z@bL@/@@Ž@ !ʾ@ -@:@Ffd@S32@_;b@kC@x`@@@@ 8@"@$G@&z@(@*$@,@.P@1 @3N@5#@70bL@9<(@;H1&@=T@?a$@Am@Cy@E@Gn@Iv@KC@M <@Ol@Q:@Sj@U8@Wz@Z@\ O@^X@`&$@b1@d=@fJ@hVȲ@jc@lo\(@n{dX@p1&@r9V@t$@v@x@zš@|ѩ@~v@=p@E@l@@j@'@3D@?v@LB@XQ@e@q&@}/@@Ž@Z@@@l@32@@0@`@.@@p@)x@5@BM@Nz@ZF@fx@r@v@Ƌ@ȘQ@ʤZ@̰bL@ν/@@@ʾ@@@fd@n@;b@+C@8`@C@O:@\@h8@u@G@O@@$@@P@@׍N@㕀@bL@(@1&@@ !$@ -@9@E@Rn@^v@kC@w <@l@:@j@ 8@"z@$@&O@(X@*$@,@.@1 @3Ȳ@5"Z@7/\(@9;dX@;Gl@=T9V@?_@Al@Cx@E.@G@Ip@K=p@ME@OM@Q@SF@U@WD@Yv@\ B@^Q@`%@b1&@d=/@fI@hUŽ@jbZ@ln@nz@pl@r32@t;b@v0@x`@z.@|У@~ܬ@x@@M@z@@&x@2@?v@K@WN@dZ@pbL@}/@@@ʾ@@@fd@n@;b@C@`@@:@@(8@5@AG@MO@Z@f$@r@~P@Ɗ@ȗN@ʣ@̰bL@μ(@1&@9V@$@@@@@v@*=p@7 <@Cl@O@[j@g@tz@@B@X@@@@@Ȳ@Z@\(@dX@l@9V@ @ ,@8@D.@Q@]p@j=p@vE@M@@F@ @"D@$v@&̋B@(Q@*@,&@./@1 @3Ž@5!ʾ@7.@9:@;Gl@=S32@?_;b@Al0@Cx`@E.@G@I@Kx@M@OM@Qz@S@Ux@W@Yv@\ @^N@`$Z@b0bL@d=/@fH@hT@jaʾ@lm@nz@pfd@rn@t;b@vC@x <@z@|:@~j@8@z@G@ O@X@&$@1@>P@J@VȲ@c@o\(@|(@1&@9V@$@@@š@ѩ@v@=p@ <@l@@j@'@4z@@@LB@YX@e@q@}@Ɖ@ȖȲ@ʢZ@̯\(@λdX@l@9V@@@@.@@p@)x@6E@BM@O@ZF@fx@sD@v@B@Q@Z@&@/@@Ž@ʾ@@@l@32@ ;b@ ,0@8`@D.@P@\@ix@u@G@z@@ $@"@$P@&˅@(׍N@*㕀@,bL@.(@1@3@5!$@7-@99@;Ffd@=Rn@?^v@AkC@Cw <@E@G:@Ij@K8@Mz@OG@QO@SX@U$@W@YP@\ @^Ȳ@`#@b/\(@d<(@fH1&@hT9V@ja$@ll@ny@p@r@tv@v=p@x <@zl@|@~j@@D@@ B@X@%@1&@=@I@VȲ@bZ@n@{dX@l@9V@@0@@.@ѩ@p@x@E@M@@F@&x@3D@?v@LB@XQ@dZ@pbL@}/@ƈ@ȕŽ@ʡʾ@̭@κ@fd@32@;b@C@`@@@@(8@5@AG@Nz@Z@f$@r@~P@@N@@bL@(@@@$@@@fd@n@ v@ +C@7 <@C@O:@[j@h8@tz@G@O@X@ $@"@$@&@(Ȳ@*㕀@,\(@.dX@11&@39V@5!$@7,@98@;E@=Q@?^v@Aj=p@CvE@El@G@Ij@K@MD@O@Q̋B@SX@U@W&@Y@\ @^Ȳ@`"Z@b.@d:@fGl@hS32@j_@ll0@nx`@p.@r@tp@vx@x@zM@|z@~F@x@@v@ @Q@$Z@0bL@=/@H@UŽ@aʾ@m@z@fd@32@;b@C@`@@У@ܬ@8@@G@z@@&$@2@>P@K@WN@c@pbL@|(@ƈ1&@Ȕ@ʡ$@̭@ι@š@n@v@C@ <@l@:@j@(8@4z@@@MO@YX@f$@q@}@@Ȳ@@\(@dX@1&@9V@$@@@.@@ p@ *=p@6E@BM@O@ZF@g@sD@v@B@Q@ @"&@$/@&@(Ž@*Z@,@.@1l@332@5@7,0@98`@;D.@=P@?]p@Aix@Cu@EM@Gz@IF@Kx@M@Ov@Q˅@SQ@UZ@WbL@Y/@\@^Ž@`!ʾ@b-@d:@fFfd@hRn@j_;b@lkC@nx`@p@r:@t@v8@x@zG@|O@~@$@@P@ @N@#@0bL@<(@H1&@T@a$@m@y@@n@v@C@ <@l@:@j@8@z@@ O@X@&$@1@=@J@VȲ@c@o\(@{dX@ƈ1&@Ȕ9V@ʟ@̬@θ@.@ѩ@p@=p@E@M@@F@'@3D@?v@LB@XQ@e@q&@}/@@Ž@Z@@@l@32@@0@`@.@@ p@ )x@5@BM@Nz@Z@fx@r@v@@N@ Z@"bL@$/@&@(@*ʾ@,@.@1fd@3n@5;b@7+C@98`@;C@=O:@?\@Ah8@Cu@EG@GO@I@K$@M@OP@Q@S׍N@U㕀@WbL@Y(@\1&@^@`!$@b-@d9@fE@hRn@j^v@lkC@nw <@pl@r@tj@v@xz@z@|̋B@~X@@@@ @Ȳ@"Z@/\(@;dX@Gl@T9V@_@l@x@.@@p@=p@E@M@@F@@D@v@ B@Q@$Z@1&@=/@I@UŽ@aʾ@n@z@Ƈl@ȓ32@ʟ;b@̬0@θ`@.@У@ܬ@x@@M@z@@&x@2@?v@K@WN@dZ@pbL@}/@@@ʾ@@@fd@n@;b@C@`@@:@ @ (8@5@AG@MO@YX@f$@q@~P@@Ȳ@ @"\(@$(@&1&@(9V@*$@,@.@1@3@5v@7*=p@97 <@;Cl@=O@?[j@Ag@Ctz@E@GB@IX@K@M@O@Q@SȲ@UZ@W@YdX@\l@^9V@`@b,0@d8@fD.@hQ@j]p@lix@nvE@pM@r@tF@vx@xD@zv@|̋B@~Q@Z@&@/@ @Ž@!ʾ@.@:@Gl@S32@_;b@l0@x`@.@@@x@@M@z@@x@@v@ @N@#@0bL@<(@H@T@a$@m@y@Ɔfd@Ȓn@ʞv@̫C@η <@@:@j@8@z@G@ O@X@&$@1@>P@J@VȲ@c@o\(@|(@1&@9V@$@@@š@ѩ@v@@"@6@O@ @ @"@ A@ &E@ ,@ 2[@ 8t@ >@D@KdY@QG@WK@],@cE@j@o@v@|j~@n@@Q@j@"@&@O@p@ t@!"@";@#E@$(@%-@&ؓt@'ޗ@(@)G@*_@+K@,O@.32@/ @0@1@20@3!@4(Q@5.V@64Z@7:@8@@9G =@:MU@;Sn@e@?kƧ@@q@Ax1&@B~z@Cz@D~@E@Fx@G@H32@I7K@J;d@K@L@M6@N@O@PZ@Q=p@RA@S@T@Un@V@W@Y`A@Z dY@[@\@],@^$@_*@`0@a6ff@b@Dz@JG@P_@Vx@]O@c32@i@o@u@|0@@Q@V@Z@@@ =@U@n@x@\(@`A@Ƨ@@1&@z@@~@@x@@@ 7K@;d@@@!6@'@-@4Z@:=p@@A@F@L@Sn@X@^@e`A@kdY@q@w@},@Ä@Ċ@Ő@Ɩff@ǜj~@Ȣ@ɨ@ʯ;d@˵@̻"@6@ǍO@@ @"@;@E@(@[@t@@@ G@G@K@O@#E@)@/@6@<0@Bn@HQ@NQ@Tj@Z@a&@g =@mp@st@yx@;@@(@-@1&@򞗌@z@~@_@x@O@32@7K@ϝ@ա@0@@@V@Z@@@@ U@n@x@\(@ %`A@ +Ƨ@ 1@ 81&@ >z@D@J~@P@Vx@\@b@h@o;d@u@{@6@O@@ @=p@A@E@@ [@!@"@#@$dY@%G@&׮@'ݲ,@(E@)@*@+ff@,j~@.n@/@0Q@1@2"@3!&@4'O@5-p@63 @79"@8?;@9FE@:L(@;R[@d@?jG@@qG@AwK@B}O@CE@D@E@F@G0@Hn@IQ@JV@Kj@L@M&@N =@OU@Pt@Qx@R;@S@TƧ@U-@V1&@W@Yz@Z ~@[_@\x@]O@^#32@_)7K@`/@a5@b<0@cA@dG@eM@fTZ@gZ=p@h`@if@jl@ksn@lx@m\(@n`A@odY@p@q@rz@s@t@u@vff@w@x@y@z;d@{@|ۅ@}6@~O@@ @=p@A@E@ @[@@@$@+dY@1G@7@=,@CE@J@O@Vff@\j~@bn@h@nQ@tj@{"@&@O@p@t@"@;@E@(@-@t@@@G@_@K@O@E@陙@@@0@n@Q@V@j@@!&@' =@-U@3n@9x@?\(@E@KƧ@Q@X1&@^z@dz@j~@p@vx@|@Ã32@ĉ7K@ŏ;d@ƕ@Ǜ@ȡ@ɧ@ʭ@˴Z@̺=p@@Ƨ@̬@n@@\(@`A@dY@@@z@@ @@ff@@"@(@/;d@5@;@A6@GO@M@S @Y"@`A@fE@l@r[@xt@~@@dY@G@K@,@E@@@@j~@n@@θQ@Լj@"@&@O@p@t@"@;@E@ (@-@t@@ $z@ *G@ 0_@ 6x@ =O@C32@I@O@U@\0@a@hQ@nV@tZ@z@@ =@U@n@x@\(@@Ƨ@ @!1&@"z@#z@$~@%Ѓ@&x@'@(32@)7K@*;d@+@,@.@/@0 @1Z@2=p@3 @4&@5,@63n@78@8?\(@9E`A@:KdY@;Q@d@?j@@p@Avff@B|j~@C@D@E;d@F@G"@H6@IO@J@K @L"@MA@NE@O̬@Pҏ[@Qؓt@R@S@TdY@UG@VK@W,@YE@Z @[@\@]0@^"n@_(Q@`.Q@a4j@b:@cA&@dG =@eMp@fSt@gYx@h_;@ie@jl(@kr-@lx1&@m~@nz@oG@p_@qx@rO@s32@t@u@v@w0@x@yQ@zV@{Z@|@}@~@U@€n@x@‚\(@„`A@… Ƨ@†@‡1&@ˆz@‰$@Š*~@‹0@Œ6x@<@ŽB@I7K@O;d@‘U@’[@“a6@”g@•m@–tZ@—z=p@˜A@™@š@›n@œ@@ž`A@ŸdY@ @¡@¢,@£@¤@¥Ѓ@¦ff@§j~@¨@©@ª;d@«@¬"@®&@¯O@° p@± @²"@³;@´&E@µ,(@¶2[@·8t@¸>@¹D@ºJG@»QG@¼WK@½]O@¾cE@¿i@o@v@|0@Ân@ĈQ@ŎQ@Ɣj@ǚ@ȡ&@ɧ =@ʭp@˳t@̹x@Ϳ;@@Ƨ@-@1&@ޗ@z@~@_@x@O@32@ 7K@@@0@!@'@.V@4Z@:@@@F@MU@Sn@Yx@_\(@e`A@kƧ@q@x1&@~z@@~@@x@@@7K@;d@@@6@@@Z@=p@A@E@@[@@@@ dY@G@@,@ #E@ *@ /@ 6ff@ @9Dz@:J~@;P_@c32@?i7K@@o@Au@B|0@C@D@EV@FZ@G@H@I@JU@Kn@Lx@M\(@N`A@OdY@P@Q׮@Rz@S@T@U@Vff@W@Y@Z@[;d@\@]@^!6@_'O@`-@a3 @b:=p@c@A@dFE@eL@fR[@gX@h^@id@jkdY@kqG@lw@m},@nE@o@p@q@rj~@sn@t@uQ@vj@w"@x&@yǍO@zp@{t@|"@};@~E@(@À-@Át@Â@Ä@Å G@Æ_@ÇK@ÈO@É#E@Ê)@Ë/@Ì6@Í<0@ÎBn@ÏHQ@ÐNV@ÑTZ@ÒZ@Ó`@Ôg =@ÕmU@Ösn@×yx@Ø\(@ُ@ÚƧ@Û@Ü1&@Ýz@Þz@ß~@à@áx@â@ã32@ä7K@å;d@æա@çۅ@è@é@ê@ëZ@ì=p@î@ï@ð @ñn@ò@ó\(@ô%`A@õ+dY@ö1@÷7@ø>z@ùD@úJ@ûP@üVff@ý\@þb@ÿh@o;d@u@{"@Á6@ćO@ō@Ɠ @Ǚ"@ȠA@ɦE@ʬ@˲[@̸t@;@@dY@G@K@ݲ,@E@@@@j~@n@@Q@j@"@!&@'O@-p@3t@9"@?;@E@L(@R-@X1&@^@dz@jG@p_@vx@}O@32@@@@0@@Q@V@Z@@@ =@U@n@x@\(@@Ƨ@@1&@z@z@ ~@@x@@ #32@ )7K@ /;d@ 5@ ;@A@G@M@TZ@Z=p@`@f@l@sn@x@~@`A@dY@@@,@@@ @!ff@"j~@#@$@%;d@&@'"@(6@)O@*@+ @,"@.A@/E@0 @1[@2t@3@4$@5*G@61G@77K@8=O@9CE@:I@;O@bn@?hQ@@nQ@Atj@Bz@C&@D =@Ep@Ft@Gx@H;@I@J(@K-@L1&@M@Nz@OG@P_@Qx@RO@S32@T陙@U@V@W0@Y@Z@[V@\Z@]@^ @_&@`-U@a3n@b9x@c?\(@dE`A@eKƧ@fQ@gX1&@h^z@id@jj~@kp@lvx@m|@n@o7K@p;d@q@r@s6@t@u@vZ@w=p@xA@yƧ@z̬@{n@|@}@~`A@dY@Ā@ā@Ă,@Ą@ą @Ć@ćff@Ĉj~@ĉ"n@Ċ(@ċ.Q@Č5@č;"@ĎA&@ďGO@ĐMp@đS @ĒY"@ē_;@ĔfE@ĕl(@Ėr[@ėxt@Ę~@ę@ĚG@ěG@ĜK@ĝO@ĞE@ğ@Ġ@ġ@Ģ0@ģn@ĤQ@ĥθQ@ĦԼj@ħ@Ĩ&@ĩ =@ĪU@īt@Ĭx@ĭ;@į@İ Ƨ@ı-@IJ1&@ij@Ĵ$z@ĵ*~@Ķ0_@ķ6x@ĸ=O@ĹC32@ĺI7K@ĻO@ļU@Ľ\0@ľa@Ŀg@nV@tZ@z@À@Ć@ōU@Ɠn@Ǚx@ȟ\(@ɥ`A@ʫƧ@˱@̸1&@;z@@~@Ѓ@x@@@7K@;d@@@6@O@ @ @=p@ A@&E@,@2[@8@>@D@KdY@QG@W@],@cE@j@o@vff@|j~@n@@Q@@"@&@O@p@ @"@;@E@(@-@ؓt@ޗ@@G@_@K@O@E@ @@@0@ "n@ (Q@ .V@ 4j@ :@A&@G =@MU@St@Yx@_;@e@kƧ@r-@x1&@~@z@~@@x@@32@7K@ ;d@!@"@#@$@%@&Z@'=p@(@)@*@+n@,@-\(@/`A@0 dY@1@2@3z@4$@5*@60@76ff@8<@9B@:H@;O;d@a6@?gO@@m@As @Bz=p@CA@DE@E@F[@G@H@I@JdY@KG@LK@M,@NöE@O@P@Q@Rj~@Sn@T@UQ@Vj@W"@Y&@ZO@[ p@\t@]"@^;@_&E@`,(@a2-@b8t@c>@dD@eJG@fP_@gWK@h]O@icE@ji@ko@lu@m|0@n@oQ@pV@qZ@r@s@t =@uU@vn@wx@x\(@y@zƧ@{@|1&@}z@~z@~@ŀ@Łx@ł@ń32@Ņ 7K@ņ;d@Ň@ň@ʼn!@Ŋ'@ŋ-@Ō4Z@ō:=p@Ŏ@A@ŏF@ŐL@őSn@ŒX@œ^@Ŕe`A@ŕkdY@Ŗq@ŗw@Ř},@ř@Ś@ś@Ŝff@ŝj~@Ş@ş@Š;d@š@Ţ"@ţ6@ŤǍO@ť@Ŧ @ŧ"@ŨA@ũE@Ū@ū[@Ŭt@ŭ@ů@Ű dY@űG@ŲK@ų,@Ŵ#E@ŵ*@Ŷ/@ŷ6@Ÿz@D@J~@P@Vx@\@b@i7K@o;d@u@{@6@@@Z@=p@A@@@n@@@`A@dY@@׮@ݲ,@@@@ff@j~@n@@Q@@"@ !&@ 'O@ -p@ 3 @ 9"@?;@FE@L(@R[@Xt@^@d@jG@qG@wK@}O@E@@@@0@n@Q@ Q@!j@"@#&@$ =@%p@&t@'x@(;@)@*(@+-@,1&@-@/z@0 G@1_@2x@3O@4#32@5)7K@6/@75@8<0@9A@:G@;NV@`@?f@@mU@Asn@Byx@C\(@D`A@EƧ@F@G1&@Hz@I@J~@K@Lx@M@N@O7K@P;d@Q@Rۅ@S6@TO@U@V @W=p@YA@ZE@[ @\[@]@^@_$@`+dY@a1G@b7@c=,@dCE@eJ@fO@gVff@h\j~@ibn@jh@knQ@lu@m{"@n&@oO@pp@q @r"@s;@tE@u(@v-@wt@x@y@zG@{_@|K@}O@~E@陙@ƀ@Ɓ@Ƃ0@Ƅn@ƅQ@ƆV@Ƈj@ƈ@Ɖ!&@Ɗ' =@Ƌ-U@ƌ3t@ƍ9x@Ǝ?;@ƏE@ƐKƧ@ƑR-@ƒX1&@Ɠ^@Ɣdz@ƕj~@Ɩp_@Ɨvx@Ƙ}O@ƙ32@ƚ7K@ƛ@Ɯ@Ɲ0@ƞ@Ɵ@ƠV@ơZ@Ƣ@ƣ@ƤƧ@ƥ̬@Ʀn@Ƨ@ƨ\(@Ʃ`A@ƪdY@ƫ@Ƭ@ƭz@Ư@ư @Ʊ@Ʋff@Ƴ@ƴ"@Ƶ(@ƶ/;d@Ʒ5@Ƹ;@ƹA6@ƺGO@ƻM@ƼS @ƽZ=p@ƾ`A@ƿfE@l@r[@x@~@Ą@ŋdY@ƑG@ǗK@ȝ,@ɣE@ʪ@˯@̶@ͼj~@n@@θQ@Լj@"@&@O@p@t@"@;@E@ (@-@t@@$@*G@0_@7K@=O@CE@I@O@U@\0@a@hQ@nV@tZ@z@@ =@U@n@x@\(@@Ƨ@@1&@z@z@~@Ѓ@x@@32@7K@;d@@@@@ @Z@=p@ @ &@ ,@ 3n@ 8@?\(@E`A@KdY@Q@W@^z@d@j@p@vff@|j~@@@;d@@"@6@O@ @! @""@#A@$E@%̬@&ҏ[@'ؓt@(@)@*dY@+G@,K@-,@/E@0 @1@2@3j~@4"n@5(@6.Q@74j@8:@9A&@:G =@;Mp@_;@?e@@l(@Ar-@Bx1&@C~@Dz@EG@F_@Gx@HO@I32@J@K@L@M0@N@OQ@PV@QZ@R@S@T =@UU@Vn@Wx@X\(@Z`A@[ Ƨ@\@]1&@^z@_$@`*~@a0@b6x@c<@dB@eI7K@fO;d@gU@h[@ia6@jg@km@ltZ@mz=p@nA@o@p@qn@r@s@t`A@udY@v@w@x,@yöE@z@{@|ff@}j~@~n@@ǀQ@ǁ@ǂ"@DŽ&@DžO@dž p@LJ @Lj"@lj;@NJ&E@Nj,(@nj2[@Ǎ8t@ǎ>@ǏD@ǐJG@ǑQG@ǒWK@Ǔ]O@ǔcE@Ǖi@ǖo@Ǘv@ǘ|0@Ǚn@ǚQ@ǛQ@ǜj@ǝ@Ǟ&@ǟ =@Ǡp@ǡt@Ǣx@ǣ;@Ǥ@ǥ(@Ǧ-@ǧ1&@Ǩޗ@ǩz@Ǫ~@ǫ_@Ǭx@ǭO@ǯ32@ǰ 7K@DZ@Dz@dz0@Ǵ!@ǵ'@Ƕ.V@Ƿ4Z@Ǹ:@ǹ@@ǺF@ǻMU@ǼSn@ǽYx@Ǿ_\(@ǿe`A@kƧ@q@x1&@~z@Ą@Ŋ~@Ɛ@ǖx@Ȝ@ɢ@ʨ@˯;d@̵@ͻ@6@ǍO@@ @=p@A@E@@[@@@@ dY@G@@,@#E@*@/@6ff@@Dz@J~@P_@Vx@]O@c32@i7K@o@u@|0@@@V@Z@=p@@@ @!n@"@#\(@$`A@%dY@&@'׮@(z@)@*@+@,ff@-@/@0@1;d@2@3@4!6@5'O@6-@73 @8:=p@9@A@:FE@;L@^@?d@@kdY@AqG@BwK@C},@DE@E@F@G@Hj~@In@J@KQ@Lj@M"@N&@OǍO@Pp@Qt@R"@S;@TE@U(@V-@Wt@X@Z@[ G@\_@]K@^O@_#32@`)@a/@b5@c<0@dA@eHQ@fNV@gTZ@hZ@i`@jg =@kmU@lsn@myx@n\(@o@pƧ@q@r1&@sz@tz@u~@v@wx@x@y32@z7K@{;d@|ա@}ۅ@~6@@Ȁ@ȁZ@Ȃ=p@ȄA@ȅ@Ȇ @ȇn@Ȉ@ȉ@Ȋ%`A@ȋ+dY@Ȍ1@ȍ7@Ȏ=,@ȏD@ȐJ@ȑP@ȒVff@ȓ\j~@Ȕb@ȕh@Ȗo;d@ȗu@Ș{"@ș6@ȚO@ț@Ȝ @ȝ"@ȞA@ȟE@Ƞ@ȡ[@Ȣt@ȣ@Ȥ@ȥdY@ȦG@ȧK@Ȩݲ,@ȩE@Ȫ@ȫ@Ȭ@ȭj~@ȯn@ȰQ@ȱQ@Ȳj@ȳ@ȴ!&@ȵ' =@ȶ-p@ȷ3t@ȸ9x@ȹ?;@ȺE@ȻL(@ȼR-@ȽX1&@Ⱦ^@ȿdz@jG@p_@vx@}O@ă32@ʼn@Ə@Ǖ@Ȝ0@ɡ@ʨQ@ˮV@̴Z@ͺ@@ =@U@n@x@\(@`A@Ƨ@@1&@z@@ ~@@x@@"@)7K@/;d@5@;@A6@G@M@TZ@Z=p@`A@f@l@sn@x@~@`A@dY@G@@,@E@@@ff@j~@n@@θQ@@"@&@O@p@ @"@;@E@ (@[@t@ @ $@ *G@ 1G@ 7K@=O@CE@I@O@V@\0@bn@hQ@nQ@tj@z@&@ =@p@t@x@;@@ (@!-@"1&@#@$z@%~@&_@'x@(O@)32@*7K@+@,@-0@/@0@1V@2Z@3@4 @5&@6-U@73n@89x@9?\(@:E`A@;KƧ@^z@?d@@j~@Ap@Bvx@C|@D@E@F;d@G@H@I6@JO@K@L @M=p@NA@OE@P̬@Qҏ[@R@S@T@UdY@VG@W@X,@ZE@[ @\@]ff@^j~@_"n@`(@a.Q@b5@c;"@dA&@eGO@fMp@gSt@hY"@i_;@jfE@kl(@lr-@mxt@n~@o@pG@q_@rK@sO@tE@u@v@w@x0@yn@zQ@{V@|Լj@}@~&@ =@ɀU@Ɂt@ɂx@Ƀ;@Ʌ@Ɇ Ƨ@ɇ@Ɉ1&@ɉz@Ɋ$z@ɋ*~@Ɍ0@ɍ6x@Ɏ<@ɏC32@ɐI7K@ɑO;d@ɒU@ɓ[@ɔa@ɕg@ɖm@ɗtZ@ɘz=p@ə@ɚ@ɛ@ɜn@ɝ@ɞ\(@ɟ`A@ɠdY@ɡ@ɢ@ɣz@ɤ@ɥ@ɦЃ@ɧff@ɨ@ɩ@ɪ@ɫ;d@ɬ@ɭ@ɯ6@ɰO@ɱ @ɲ @ɳ=p@ɴ A@ɵ&E@ɶ,@ɷ2[@ɸ8t@ɹ>@ɺD@ɻKdY@ɼQG@ɽWK@ɾ],@ɿcE@j@o@v@|j~@Ăn@ň@ƎQ@ǔj@ț"@ɡ&@ʧO@˭p@̳t@͹"@ο;@E@(@-@ؓt@ޗ@@G@_@x@O@32@ @@@0@!@(Q@.V@4Z@:@@@G =@MU@Sn@Yx@_\(@e@kƧ@q@x1&@~z@z@~@@x@@32@7K@;d@@@6@@@Z@=p@A@@@n@@@`A@ dY@@@ ,@ $@ *@ 0@ 6ff@@:Dz@;JG@]O@?c32@@i@Ao@Bu@C|0@D@EQ@FV@GZ@H@I@J@KU@Ln@Mx@N\(@O`A@PƧ@Q@R1&@Sz@T@U~@V@Wx@X@Z@[ 7K@\;d@]@^@_!6@`'@a-@b4Z@c:=p@d@A@eF@fL@gSn@hX@i^@jd@kkdY@lqG@mw@n},@oE@p@q@rff@sj~@tn@u@vQ@w@x"@y&@zǍO@{p@| @}"@~;@E@ʀ(@ʁ[@ʂt@ʃ@ʅ@ʆ G@ʇG@ʈK@ʉO@ʊ#E@ʋ)@ʌ/@ʍ6@ʎ<0@ʏBn@ʐHQ@ʑNV@ʒTj@ʓZ@ʔa&@ʕg =@ʖmU@ʗst@ʘyx@ʙ;@ʚ@ʛƧ@ʜ-@ʝ1&@ʞ@ʟz@ʠ~@ʡ_@ʢx@ʣO@ʤ32@ʥ7K@ʦϝ@ʧա@ʨ0@ʩ@ʪ@ʫ@ʬZ@ʭ=p@ʯ@ʰ@ʱ @ʲn@ʳ@ʴ\(@ʵ%`A@ʶ+dY@ʷ1@ʸ7@ʹ>z@ʺD@ʻJ@ʼP@ʽVff@ʾ\@ʿb@h@o;d@u@{@ā6@ŇO@ƍ@Ǔ @Ț=p@ɠA@ʦE@ˬ@̲[@͸@ξ@@dY@G@׮@ݲ,@E@@@ff@j~@n@@Q@j@"@!&@'O@-p@3t@9"@?;@FE@L(@R-@Xt@^@d@jG@p_@wK@}O@E@@񏝱@@0@n@Q@V@j@@&@ =@U@t@x@\(@@Ƨ@@1&@z@z@ ~@@x@ @ #32@ )7K@ /;d@ 5@;@A@G@M@TZ@Z=p@`@f@l@sn@x@\(@`A@dY@@@,@@ @!@"ff@#j~@$@%@&;d@'@("@)6@*O@+@, @-"@/A@0E@1 @2[@3t@4@5$@6+dY@71G@87K@9=,@:CE@;J@\j~@?bn@@hQ@AnQ@Btj@Cz@D&@E =@Fp@Gt@Hx@I;@J@K(@L-@M1&@N@Oz@PG@Q_@Rx@SO@T32@U陙@V@W@X0@Z@[Q@\V@]Z@^@_ @`' =@a-U@b3n@c9x@d?\(@eE@fKƧ@gQ@hX1&@i^z@jdz@kj~@lp@mvx@n|@o32@p7K@q;d@r@s@t6@u@v@wZ@x=p@yA@zƧ@{̬@|n@}@~@`A@ˀdY@ˁ@˂@˃,@˅@ˆ @ˇ@ˈff@ˉj~@ˊ"@ˋ(@ˌ/;d@ˍ5@ˎ;"@ˏA6@ːGO@ˑMp@˒S @˓Y"@˔_;@˕fE@˖l(@˗r[@˘xt@˙~@˚@˛G@˜G@˝K@˞O@˟E@ˠ@ˡ@ˢ@ˣ0@ˤn@˥Q@˦θQ@˧Լj@˨@˩&@˪ =@˫p@ˬt@˭x@ˮ;@˰@˱ (@˲-@˳1&@˴@˵$z@˶*~@˷0_@˸6x@˹=O@˺C32@˻I7K@˼O@˽U@˾\0@˿a@g@nV@tZ@z@Ā@ņ@ƍU@Ǔn@șx@ɟ\(@ʥ`A@˫Ƨ@̱@͸1&@ξz@@~@Ѓ@ff@@@@;d@@@6@O@ @ @=p@ A@&E@,@2[@8@>@D@KdY@QG@W@],@cE@j@o@vff@|j~@n@@Q@@"@&@O@p@t@"@;@E@(@-@ؓt@ޗ@@G@_@K@O@E@ @@@ 0@ "n@ (Q@ .V@ 4j@:@A&@G =@MU@St@Yx@_;@e@kƧ@r-@x1&@~@z@~@_@x@O@32@ 7K@!@"@#0@$@%@&@'Z@(=p@)@*@+@,n@-@.\(@0`A@1 dY@2@3@4z@5$@6*@70@86ff@9<@:B@;H@[@?a6@@gO@Am@Bs @Cz=p@DA@EE@F@G[@Ht@I@J@KdY@LG@MK@N,@OöE@P@Q@R@Sj~@Tn@U@VQ@Wj@X"@Z&@[O@\ p@]t@^"@_;@`&E@a,(@b2-@c8t@d>@eD@fJG@gP_@hVx@i]O@jc32@ki@lo@mu@n|0@o@pQ@qV@rZ@s@t@u =@vU@wn@xx@y\(@z@{Ƨ@|@}1&@~z@z@̀~@́@̂x@̃@̅32@̆ 7K@̇;d@̈@̉@̊!6@̋'@̌-@̍4Z@̎:=p@̏@A@̐F@̑L@̒Sn@̓X@̔^@̕e`A@̖kdY@̗q@̘w@̙},@̚@̛@̜@̝ff@̞j~@̟@̠@̡;d@̢@̣"@̤6@̥ǍO@̦@̧ @̨"@̩;@̪E@̫(@̬[@̭t@̮@̰@̱ G@̲G@̳K@̴O@̵#E@̶)@̷/@̸6@̹<0@̺Bn@̻HQ@̼NQ@̽Tj@̾Z@̿a&@g =@mp@st@yx@;@Ņ@ƌ(@ǒ-@Ș1&@ɞ@ʤz@˪~@̰_@Ͷx@νO@32@7K@ϝ@ա@0@@@V@Z@@@@ U@n@x@\(@%`A@+Ƨ@1@81&@>z@D@J~@P@Vx@\@b@i7K@o;d@u@{@6@@@Z@=p@A@@@n@@@@dY@G@׮@ݲ,@E@@@ff@j~@n@@Q@@ "@ !&@ 'O@ -p@ 3 @9"@?;@FE@L(@R[@Xt@^@d@jG@qG@wK@}O@E@@@@0@n@ Q@!V@"j@#@$&@% =@&U@'t@(x@);@*@+Ƨ@,-@-1&@.@0z@1 ~@2_@3x@4O@5#32@6)7K@7/@85@9<0@:A@;G@Z=p@?`@@f@Al@Bsn@Cx@D\(@E`A@FdY@G@H@Iz@J@K@L@Mff@N@O@P@Q;d@R@Sۅ@T6@UO@V@W @X=p@ZA@[E@\ @][@^t@_@`$@a+dY@b1G@c7K@d=,@eCE@fJ@gO@hV@i\j~@jbn@kh@lnQ@mtj@n{"@o&@pO@qp@rt@s"@t;@uE@v(@w-@xt@y@z@{G@|_@}x@~O@32@̀陙@́@͂@̓0@ͅ@͆Q@͇V@͈Z@͉@͊ @͋' =@͌-U@͍3n@͎9x@͏?\(@͐E@͑KƧ@͒Q@͓X1&@͔^z@͕dz@͖j~@͗p@͘vx@͙|@͚32@͛7K@͜;d@͝@͞@͟6@͠@͡@͢Z@ͣ=p@ͤA@ͥƧ@̬ͦ@ͧn@ͨ@ͩ@ͪ`A@ͫdY@ͬ@ͭ@ͮ,@Ͱ@ͱ @Ͳ@ͳff@ʹj~@͵"@Ͷ(@ͷ/;d@͸5@͹;"@ͺA6@ͻGO@ͼM@ͽS @;Y"@Ϳ`A@fE@l@r[@xt@~@ń@ƋdY@ǑG@ȗK@ɝ,@ʣE@˪@̯@Ͷ@μ0@n@Q@θQ@Լj@@&@ =@p@t@x@;@@ (@-@1&@@$z@*G@0_@6x@=O@C32@I@O@U@\0@a@hQ@nV@tZ@z@@@U@n@x@\(@`A@Ƨ@@1&@z@@~@Ѓ@x@@@7K@;d@@@6@@ @Z@ =p@ A@ &@ ,@ 3n@8@>@D@KdY@QG@W@],@cE@j@o@vff@|j~@n@@Q@@"@&@ O@!p@" @#"@$;@%E@&(@'ҏ[@(ؓt@)ޗ@*@+G@,G@-K@.O@0E@1 @2@3@40@5"n@6(Q@7.V@84j@9:@:A&@;G =@Yx@?_;@@e@AkƧ@Br-@Cx1&@D~@Ez@F~@G_@Hx@IO@J32@K7K@L@M@N0@O@P@Q@RZ@S=p@T@U@V@Wn@X@Y\(@[`A@\ dY@]@^@_z@`$@a*@b0@c6ff@d<@eB@fH@gO;d@hU@i[@ja6@kgO@lm@ms @nz=p@oA@pE@q@r[@st@t@u@vdY@wG@xK@y,@zöE@{@|@}@~j~@n@΀@΁Q@΂j@΃"@΅&@ΆO@· p@Έt@Ή"@Ί;@΋&E@Ό,(@΍2-@Ύ8t@Ώ>@ΐD@ΑJG@ΒP_@ΓWK@Δ]O@ΕcE@Ζi@Ηo@Θv@Ι|0@Κn@ΛQ@ΜV@Νj@Ξ@Ο&@Π =@ΡU@΢t@Σx@Τ\(@Տ@ΦƧ@Χ@Ψ1&@Ωz@Ϊz@Ϋ~@ά@έx@ή@ΰ32@α 7K@β;d@γ@δ@ε!@ζ'@η-@θ4Z@ι:=p@κ@@λF@μL@νSn@ξX@ο_\(@e`A@kdY@q@w@},@ń@Ɗ@ǐ@Ȗff@ɜj~@ʢ@˨@̯;d@͵@λ"@6@ǍO@@ @"@A@E@@[@t@@@ dY@G@K@,@#E@*@/@6@z@D@J~@P@Vx@\@b@i7K@o;d@u@{@6@@@Z@=p@A@ @!@"n@#@$@%`A@&dY@'G@(׮@)ݲ,@*E@+@,@-ff@.j~@0n@1@2Q@3@4"@5!&@6'O@7-p@83 @99"@:?;@;FE@Xt@?^@@d@AjG@BqG@CwK@D}O@EE@F@G@H@I0@Jn@KQ@LV@Mj@N@O&@P =@QU@Rt@Sx@T;@U@VƧ@W-@X1&@Y@[z@\ ~@]_@^x@_O@`#32@a)7K@b/@c5@d<0@eA@fG@gNV@hTZ@iZ=p@j`@kf@ll@msn@nx@o\(@p`A@qdY@r@s@tz@u@v@w@xff@y@z@{@|;d@}@~ۅ@6@πO@ρ@ς @σ=p@υA@φE@χ @ψ[@ωt@ϊ@ϋ$@ό+dY@ύ1G@ώ7K@Ϗ=,@ϐCE@ϑJ@ϒO@ϓV@ϔ\j~@ϕbn@ϖh@ϗnQ@Ϙtj@ϙ{"@Ϛ&@ϛO@Ϝp@ϝt@Ϟ"@ϟ;@ϠE@ϡ(@Ϣ-@ϣt@Ϥ@ϥ@ϦG@ϧ_@ϨK@ϩO@ϪE@ϫ陙@Ϭ@ϭ@Ϯ0@ϰn@ϱQ@ϲV@ϳj@ϴ@ϵ!&@϶' =@Ϸ-U@ϸ3t@Ϲ9x@Ϻ?\(@ϻE@ϼKƧ@ϽQ@ϾX1&@Ͽ^z@dz@j~@p@vx@|@Ń32@Ɖ7K@Ǐ;d@ȕ@ɛ@ʡ@˧@̭@ʹZ@κ=p@@Ƨ@̬@n@@\(@`A@dY@@@z@@ @@ff@j~@"@(@/;d@5@;"@A6@GO@M@S @Y"@`A@fE@l@r[@xt@~@@dY@G@K@,@E@@@@j~@n@Q@θQ@Լj@@&@s@Q@y^@j@@G@z@ @@K@=p@p@r@t@@!@̀@ '؀@ @ .@ @ 4(@ +@ :-@ `A@ @Q@ Å@F*@ɉ7@Lj@Ϯ@R @S@X`@@_ =@ I@e?|@A@kt@ff@qhr@@w@@}@ě@΀@ڀ@-@ @ @S@V@7@z@|@ @%,@ր@+ @@ 1"@ U@!7@!33@">5?@"7K@#Dj~@#\(@$J\@$͑h@%Pt@%Ƨ@&VQ@&넀@'\@'@(c"Ѐ@(z@)iG@)I@*oK@*~@+up@+ր@,{@,@-"@.̀@.@/  @/@07K@0(@1+@1^5@2`A@2t@3#@3*@4)^@4j@5/@5G@65S@6@7<@7K@8B=p@8?|@9Hr@9t@:N@:љ@;T@;؀@g+@>-@?m@?Q@@sS@@V@Ay7@Az@B@C @C,@D`@D @E =@E I@FU@FA@G33@Gff@H!hr@Hj~@I'@I\@J-@Jě@K3Ƨ@Kڀ@L9넀@L@M@ @M"Ѐ@NFV@NG@OLz@O|@PR~@Pղ,@QXր@Qۥ@R^@R"@SeU@S@Tk @T5?@Uq7K@Uj~@Vw\(@V^5@W}h@Xt@XƧ@YQ@Y^@Z @Z@["Ѐ@[z@\@\I@]K@]~@^%p@^r@_+@_@`1"@`̀@a7؀@a @b>@b7K@cD(@c+@dJ^5@d`A@ePt@eӅ@fV*@fٺ^@g\j@g@hbG@hS@ih`@i@jo =@j=p@ku?|@kA@l{t@lff@m@n@n@o @o@p@p΀@qڀ@q-@r@rQ@s#S@sV@t)7@tz@u/@u @v5,@v`@w; @w =@xB I@xU@yHA@y33@zN5?@zhr@{Tj~@{ם@|Z\@|ݑh@}`ě@}Ƨ@~fڀ@~넀@l@ @Ѐs"Ѐ@ЀV@ЁyG@ЁI@Ђ|@Ѓ~@Ѓ,@Єր@Є@Ѕ@Ѕ"@ІU@І@Ї @Ї5?@Ј!7K@Јj~@Љ'\(@Љ^5@Њ-`A@Њt@Ћ3@ЋQ@Ќ9^@Ќj@Ѝ?@ЍG@ЎFz@Ў@ЏL@ЏK@АR=p@Аp@БXr@Бt@В^@Вᙙ@Гd̀@Г؀@Дj@Д@Еp@Е(@Жw+@Ж-@З}`A@ИQ@И@Й*@Й7@К j@К@Л @ЛS@М`@М@Н =@Н I@О%?|@ОA@П+t@Пff@Р1hr@Р@С7@С@Т=@Тě@УC΀@Уڀ@ФJ-@Ф@ХP @ХS@ЦVV@Цى7@Ч\z@Ч|@Шb @Ш,@Щh`@Щ @Ъn@Ъ"@ЫuU@Ы@Ь{33@Ь5?@Э7K@Юj~@Ю\(@Я \@Яh@аt@аƧ@бQ@б넀@в@в@г#"Ѐ@гz@д)G@дI@е/K@е~@ж5p@жր@з;@з@иA"@ѝ@йG@й @кN@к7K@лT(@л+@мZ^5@м`A@н`t@н@оf*@о^@пlj@п@rG@S@y@@K@=p@Å?|@r@ċt@@ő@@Ɨ؀@@Ǟ@ @ȣ΀@'+@ɪ-@-`A@ʰQ@3S@˶V@97@̼z@?@° @E,@`@K @ =@R I@U@XA@33@^ff@hr@dj~@睲@j\@@pě@Ƨ@vڀ@넀@}@ @؃"Ѐ@V@ىG@ z@ڏ|@~@ە,@ր@ܛ@@ݡ"@%U@ާ@+ @߮5?@17K@j~@7\(@^5@=h@t@CƧ@ƸQ@I^@@O@"Ѐ@Vz@@\I@K@b~@p@hr@@n@"@t̀@؀@z@@@(@+@ -@`A@Q@@*@7@j@@"G@S@(`@@/ =@=p@5?|@A@;t@ff@A@ě@G@@M@@S΀@ڀ@Z-@@` @S@fV@7@lz@|@r @,@x`@ @~@ I@U@A@33@5?@hr@j~@@\@h@ ě@Ƨ@ &ڀ@ 넀@ ,@ @ 3"Ѐ@ V@ 9G@ I@ ?|@ ~@E,@ȣր@K@@Q"@U@W@ @^5?@7K@dj~@\(@j^5@`A@pt@@vQ@^@|j@@G@z@@ @K@=p@p@r@t@@@$̀@؀@*@@ 0@ (@!7+@!-@"=`A@"Q@#C@#Ƈ*@$I7@$̼j@%O@%Ұ @&US@&`@'\@' =@(b I@(?|@)hA@)t@*nff@*hr@+t@+@,z@,@-ě@.΀@.ڀ@/ -@/@0 @0S@1V@17@2z@2|@3" @3,@4(`@4 @5.@5"@65U@6@7;33@75?@8A7K@8j~@9G\(@9ʏ\@:Mh@:Гt@;SƧ@;ָQ@fz@>G@?lI@?K@@r~@@p@Axր@A@B~@C"@C̀@D@D @E@E7K@F(@F+@G^5@G`A@H t@H@I&*@I^@J,j@J@K2G@KS@L9@L@M?K@M=p@NE?|@Nr@OKt@OΧ@PQ@Pԛ@QW؀@Q@R^@R@Sc΀@S+@Tj-@T`A@UpQ@US@VvV@V7@W|z@W@X @Y,@Y`@Z @Z =@[ I@[U@\A@\33@]ff@]hr@^$j~@^@_*\@_@`0ě@`Ƨ@a6ڀ@a넀@b=@b @cC"Ѐ@cV@dIG@dz@eO|@e~@fU,@fأր@g[@g@ha"@hU@ig@i @jn5?@j7K@ktj~@k\(@lz^5@lh@mt@nƧ@nQ@o ^@o@p@p"Ѐ@qz@q@rI@rK@s"~@sp@t(r@t@u.@u"@v4̀@v؀@w:@w@x@@x(@yG+@y-@zM`A@zQ@{S@{և*@|Y7@|ܼj@}_@}G@~eS@~`@l@ =@рr=p@р?|@сxA@сt@т~ff@у@у@ф@ф@х @х@ц΀@цڀ@ч-@ч@ш @шS@щ&V@щ7@ъ,z@ъ|@ы2 @ы,@ь8`@ь @э>@э I@юEU@юA@яK33@я5?@ѐQhr@ѐj~@ёW@ёڏ\@ђ]h@ђě@ѓcƧ@ѓڀ@єi넀@є@ѕp @ѕ"Ѐ@іvV@іG@ї|I@їK@ј~@љp@љր@њ @њ@ћ"@ћ̀@ќ@ќ @ѝ@ѝ7K@ў$(@ў\(@џ*^5@џ`A@Ѡ0t@Ѡ@ѡ6Q@ѡ^@Ѣ@"@D̀@؀@K @@Q7K@(@W+@^5@]`A@t@c@*@i^@j@o@G@uS@@|@K@؂=p@?|@وA@ t@ڎff@@۔@@ܚ@@ݠ@#΀@ަڀ@*-@߭@0Q@S@6V@ṉ7@ff@ @D@ǝ@J@@P@΀@Vڀ@-@]@ @cS@V@i7@z@o|@ @u,@`@{ @@ I@U@A@ 33@5?@hr@j~@@\@h@ě@#Ƨ@ڀ@)넀@@ 0 @ "Ѐ@!6V@!G@"e?|@>A@?kt@?ff@@qhr@@@Aw@A@B}@Cě@CƧ@Dڀ@D넀@E @E @F"Ѐ@FV@GG@Gz@H|@H~@I%,@Iր@J+ @J@K1"@KU@L7@L33@M>5?@M7K@NDj~@N\(@OJ\@O͑h@PPt@PƧ@QVQ@Q넀@R\@R@Sc"Ѐ@Sz@Ti@TI@UoK@U~@Vup@Vr@W{@W@X"@Ỳ@Y؀@Z  @Z@[7K@[(@\+@\^5@]`A@]t@^#@^*@_)^@_j@`/@`G@a5S@a@b<@bK@cB=p@c?|@dHA@dt@eNff@eљ@fT@fם@gZ@g@h`@h΀@ifڀ@i-@jm@jQ@ksS@kV@ly7@lz@m@n @n,@o`@o @p =@p I@qU@qA@r33@rff@s!hr@sj~@t'@t\@u-h@uě@v3Ƨ@vڀ@w9넀@w@x@ @x"Ѐ@yFV@yG@zLI@z|@{R~@{ղ,@|Xր@|ۥ@}^@}"@~eU@~@k @5?@Ҁq7K@Ҁj~@ҁw\(@ҁ^5@҂}h@҃t@҃Ƨ@҄Q@҄^@҅ j@҅@҆G@҆z@҇@҇@҈K@҈=p@҉%p@҉r@Ҋ+t@Ҋ@ҋ1@ҋ̀@Ҍ7؀@Ҍ@ҍ>@ҍ@ҎD(@Ҏ+@ҏJ-@ҏ`A@ҐPQ@ҐӅ@ґV*@ґى7@Ғ\j@Ғ߮@ғbG@ғS@Ҕh`@Ҕ@ҕo =@ҕ I@Җu?|@ҖA@җ{t@җff@Ҙhr@ҙ@ҙ@Қ @Қ@қě@қ΀@Ҝڀ@Ҝ-@ҝ@ҝ @Ҟ#S@ҞV@ҟ)7@ҟz@Ҡ/|@Ҡ @ҡ5,@ҡ`@Ң; @Ң@ңB I@ңU@ҤHA@Ҥ33@ҥN5?@ҥ7K@ҦTj~@Ҧ\(@ҧZ\@ҧݑh@Ҩ`t@ҨƧ@ҩfQ@ҩ넀@Ҫl@Ҫ@ҫs"Ѐ@ҫz@ҬyG@ҬI@ҭK@Ү~@Үp@үր@ү@Ұ@Ұ"@ұ̀@ұ@Ҳ @Ҳ@ҳ!7K@ҳ(@Ҵ'\(@Ҵ^5@ҵ-`A@ҵt@Ҷ3@Ҷ*@ҷ9^@ҷj@Ҹ?@ҸG@ҹES@ҹ@ҺL@ҺK@һR=p@һ?|@ҼXr@Ҽt@ҽ^@ҽᙙ@Ҿd@Ҿ؀@ҿj@ҿ@p@΀@w+@-@}`A@Q@ÃS@*@ĉ7@ j@ŏ@ @ƕ,@`@Ǜ @ =@Ȣ I@%U@ɨA@+33@ʮff@1hr@˴j~@7@̺\@=@ě@CƧ@ڀ@I넀@@P @"Ѐ@VV@G@\z@|@b~@,@hր@ @n@"@uU@@{ @5?@؁7K@j~@ه\(@ ^5@ڍh@t@ۓƧ@Q@ܙ^@@ݟ@#"Ѐ@ަz@)@߬I@/K@~@5p@r@;@⾧@A"@̀@G؀@ @N@7K@T(@+@Z-@`A@`Q@@f*@7@lj@@rG@S@x`@@ =@=p@?|@A@t@ff@𑙙@@񗝲@@@ @΀@&ڀ@-@-@Q@3S@V@97@z@?|@° @E,@`@K @@R I@U@XA@33@^5?@hr@dj~@睲@j\@h@pě@Ƨ@vڀ@넀@|@ @"Ѐ@V@G@ I@|@~@,@ր@@@"@ $̀@ @ + @ @ 17K@ (@ 7\(@ ^5@ =`A@ t@C@ƸQ@I^@̼j@O@G@Vz@@\@K@b=p@p@hr@t@n@@t̀@؀@z@@@΀@+@ -@`A@Q@S@*@7@j@@" @S@(`@@ / =@ I@!5?|@!A@";t@"ff@#Ahr@#ě@$G@$@%M@%ě@&S΀@&ڀ@'Z-@'@(` @("Ѐ@)fV@)G@*lz@*|@+r~@+,@,xր@, @-~@."@.U@/@/33@05?@07K@1j~@1\(@2\@2h@3 t@3Ƨ@4&Q@4넀@5,@5@63"Ѐ@6z@79G@7I@8?K@8~@9Ep@9r@:K@:Χ@;Q"@;̀@d(@>+@?j^5@?`A@@pt@@@Av*@A^@B|j@B@CG@DS@D@E @EK@F=p@F?|@Gr@Gt@H@H@I$@I@J*@J@K0@K΀@L6ڀ@L-@M=@MQ@NCS@NV@OI7@Oz@PO@PҰ @QU,@Q`@R[ @R =@Sb I@SU@ThA@T33@Unff@Uhr@Vtj~@V@Wz\@W@Xě@YƧ@Yڀ@Z 넀@Z@[ @["Ѐ@\V@\G@]I@]|@^"~@^,@_(ր@_@`.@`"@a5U@a@b; @b5?@cA7K@cj~@dG\(@d^5@eMh@eГt@fSƧ@fָQ@gY^@g@h_@h"Ѐ@ifz@i@jl@jK@kr=p@kp@lxr@lt@m~@n@ǹ@o؀@o@p@p@q(@q+@r-@r`A@s Q@s@t&*@t7@u,j@u@v2G@vS@w8`@w@x? =@x=p@yE?|@yA@zKt@zff@{Qhr@{ԛ@|W@|@}]@}ě@~c΀@~ڀ@j-@@Ӏp @ӀS@ӁvV@Ӂ7@ӂ|z@ӂ|@Ӄ @ӄ,@ӄ`@Ӆ @Ӆ@ӆ I@ӆU@ӇA@Ӈ33@ӈ5?@ӈhr@Ӊ$j~@Ӊ@ӊ*\@ӊh@Ӌ0t@ӋƧ@ӌ6Q@ӌ넀@Ӎ<@Ӎ@ӎC"Ѐ@ӎz@ӏIG@ӏI@ӐOK@Ӑ~@ӑUp@ӑأր@Ӓ[@Ӓާ@ӓa"@ӓ̀@Ӕg@Ӕ @ӕn@ӕ7K@Ӗt(@Ӗ\(@ӗz^5@ӗ`A@Әt@ә@әQ@Ӛ ^@Ӛj@ӛ@ӛG@ӜS@Ӝ@ӝ@ӝK@Ӟ"=p@Ӟ?|@ӟ(r@ӟt@Ӡ.@Ӡ@ӡ4@ӡ؀@Ӣ:@Ӣ@ӣ@@ӣ΀@ӤG+@Ӥ-@ӥM`A@ӥQ@ӦSS@Ӧև*@ӧY7@ӧܼj@Ө_@Ө @өeS@ө`@Ӫl@Ӫ =@ӫr I@ӫU@ӬxA@Ӭ33@ӭ~ff@Ӯhr@Ӯj~@ӯ@ӯ\@Ӱ @Ӱě@ӱƧ@ӱڀ@Ӳ넀@Ӳ@ӳ @ӳ"Ѐ@Ӵ&V@ӴG@ӵ,z@ӵ|@Ӷ2~@Ӷ,@ӷ8ր@ӷ @Ӹ>@Ӹ"@ӹEU@ӹ@ӺK33@Ӻ5?@ӻQ7K@ӻj~@ӼW\(@Ӽ^5@ӽ]h@ӽt@ӾcƧ@ӾQ@ӿi^@ӿ@o@"Ѐ@vz@@|I@K@Â~@p@Ĉr@ @Ŏ@"@Ɣ̀@؀@Ǜ @@ȡ7K@$(@ɧ+@*^5@ʭ`A@0t@˳@6*@̹7@@@D̀@؀@J@@P@(@W+@-@]`A@Q@cS@*@i7@j@o@ @uS@`@|@ =@ I@?|@A@ t@ff@hr@@@@@ě@ #΀@ ڀ@ *-@ @ 0 @ S@ 6V@ 7@ ff@8hr@9Dj~@9ǝ@:J\@:@;Pě@;Ƨ@c"Ѐ@>V@?iG@?I@@o|@@~@Au,@Aր@B{@B@C"@DU@D@E  @E5?@F7K@Fj~@G\(@G^5@Hh@Ht@I#Ƨ@IQ@J)^@J@K/@K"Ѐ@L6z@L@M@x7K@yD(@y+@zJ^5@z`A@{Pt@{Ӆ@|V*@|ٺ^@}\j@}@~bG@~S@i@@ԀoK@Ԁ=p@ԁu?|@ԁr@Ԃ{t@Ԃ@ԃ@Ԅ@Ԅ؀@ԅ @ԅ@Ԇ@Ԇ΀@ԇ+@ԇ-@Ԉ`A@ԈQ@ԉ#S@ԉV@Ԋ)7@Ԋz@ԋ/@ԋ @Ԍ5,@Ԍ`@ԍ; @ԍ =@ԎB I@ԎU@ԏHA@ԏ33@ԐNff@Ԑhr@ԑTj~@ԑם@ԒZ\@Ԓ@ԓ`ě@ԓƧ@Ԕfڀ@Ԕ넀@ԕm@ԕ @Ԗs"Ѐ@ԖV@ԗyG@ԗz@Ԙ|@ԙ~@ԙ,@Ԛր@Ԛ@ԛ@ԛ"@ԜU@Ԝ@ԝ @ԝ5?@Ԟ!7K@Ԟj~@ԟ'\(@ԟ^5@Ԡ-h@Ԡt@ԡ3Ƨ@ԡQ@Ԣ9^@Ԣ@ԣ?@ԣ"Ѐ@ԤFz@Ԥ@ԥLI@ԥK@ԦR~@Ԧp@ԧXr@ԧۥ@Ԩ^@Ԩ"@ԩd̀@ԩ؀@Ԫj@Ԫ@ԫp@ԫ(@Ԭw+@Ԭ-@ԭ}`A@ԮQ@Ԯ@ԯ*@ԯ7@԰ j@԰@ԱG@ԱS@Բ`@Բ@Գ =@Գ=p@Դ%?|@ԴA@Ե+t@Եff@Զ1@Զ@Է7@Է@Ը=@Ը@ԹC΀@Թڀ@ԺJ-@Ժ@ԻP @ԻS@ԼVV@Լى7@Խ\z@Խ|@Ծb @Ծ,@Կh`@Կ @n@ I@uU@A@{33@5?@Áhr@j~@ć@ \@ōh@ě@ƓƧ@ڀ@Ǚ넀@@Ƞ @#"Ѐ@ɦV@)G@ʬI@/K@˲~@5p@̸ր@;@;@A"@̀@G@ @N@7K@T(@\(@Z^5@`A@`t@@fQ@^@lj@@rG@z@y@@K@=p@مp@r@ڋt@@ۑ@@ܗ؀@@ݞ@ @ޣ΀@'+@ߪ-@-`A@Q@3S@ᶇ*@97@⼼j@?@° @ES@`@L@ =@R I@?|@XA@t@^ff@hr@d@睲@j@@pě@Ƨ@vڀ@넀@}@ @"Ѐ@V@G@ z@|@~@,@ր@ @@"@%U@@+33@5?@17K@j~@7\(@\@=h@t@CƧ@ƸQ@I넀@@O@"Ѐ@Vz@@\I@K@b~@p@hr@@n@"@t̀@؀@{ @@7K@(@+@ ^5@`A@t@@*@^@j@@ "G@ S@ )@ @ /K@ =p@ 5?|@ A@ ;t@ ff@A@ě@G@@M@@S΀@ڀ@Z-@@`Q@S@fV@7@lz@@r @,@x`@ @ =@ I@U@A@33@ff@hr@j~@@\@h@ ě@Ƨ@&ڀ@넀@ ,@ @!3"Ѐ@!V@"9G@"I@#?|@#~@$E,@$ȣր@%K@%@&Q"@&U@'W@' @(^5?@(7K@)dj~@)\(@*j^5@*h@+pt@+Ƨ@,vQ@,^@-|j@-@.G@/z@/@0 @0K@1=p@1p@2r@2t@3@3@4$̀@4؀@5*@5@60@6(@77+@7-@8=`A@8Q@9C@9Ƈ*@:I7@:̼j@;O@;G@b I@>?|@?hA@?t@@nff@@hr@At@A@Bz@B@Cě@D΀@Dڀ@E -@E@F @FS@GV@G7@Hz@H|@I" @I,@J(`@J @K.@K I@L5U@LA@M;33@M5?@NA7K@Nj~@OG\(@Oʏ\@PMh@PГt@QSƧ@QָQ@RY넀@R@S_@S"Ѐ@Tfz@TG@UlI@UK@Vr~@Vp@Wxր@W@X~@Y"@Ỳ@Z@Z @[@[7K@\(@\\(@]^5@]`A@^ t@^@_&*@_^@`,j@`@a2G@aS@b9@b@c?K@c=p@dE?|@dr@eKt@eΧ@fQ@fԛ@gW؀@g@h^@h@ic΀@i+@jj-@j`A@kpQ@kS@lv*@l7@m|j@m@n @o,@o`@p @p =@q I@qU@rA@r33@sff@shr@t$j~@t@u*\@u@v0ě@vƧ@w6ڀ@w넀@x=@x @yC"Ѐ@yV@zIG@zz@{O|@{~@|U,@|أր@}[ @}@~a"@~U@g@ @Հn5?@Հ7K@Ձtj~@Ձ\(@Ղz^5@Ղh@Ճt@ՄƧ@ՄQ@Յ ^@Յ@Ն@Ն"Ѐ@Շz@Շ@Ո@ՈK@Չ"=p@Չp@Պ(r@Պt@Ջ.@Ջ@Ռ4̀@Ռ؀@Ս:@Ս@Վ@@Վ(@ՏG+@Տ-@ՐM`A@ՐQ@ՑS@Ցև*@ՒY7@Ւܼj@Փ_@ՓG@ՔeS@Ք`@Օl@Օ =@Ֆr=p@Ֆ?|@՗xA@՗t@՘~ff@ՙhr@ՙ@՚@՚@՛ @՛ě@՜΀@՜ڀ@՝-@՝@՞ @՞S@՟&V@՟7@ՠ,z@ՠ|@ա2 @ա,@բ8`@բ @գ>@գ I@դEU@դA@եK33@ե5?@զQhr@զj~@էW@էڏ\@ը]h@ըt@թcƧ@թQ@ժi넀@ժ@իo@ի"Ѐ@լvz@լG@խ|I@խK@ծ~@կp@կր@հ @հ@ձ"@ձ̀@ղ@ղ @ճ@ճ7K@մ$(@մ\(@յ*^5@յ`A@ն0t@ն@շ6Q@շ^@ո@"@D̀@؀@K @@Q7K@(@W+@^5@]`A@t@c@*@i7@j@o@G@uS@`@|@ =@=p@?|@A@ t@ff@@񔛥@@@@@#΀@ڀ@*-@@0Q@S@6V@7@ff@#hr@$D@$ǝ@%J@%@&Pě@&΀@'Vڀ@'-@(]@( @)cS@)V@*i7@*z@+o|@+~@,u,@,ր@-{ @-@."@/U@/@0 33@05?@17K@1j~@2\(@2\@3h@3t@4#Ƨ@4Q@5)^@5@6/@6"Ѐ@76z@7@8a7K@>(@?g+@?^5@@m`A@@t@As@A*@By^@Bj@C@DG@DS@E`@E@F =@F=p@G?|@GA@Ht@Hff@I!@I@J'@J@K-@K@L3΀@Lڀ@M:-@M@N@Q@NS@OFV@Oɉ7@PLz@PϮ@QR @Qղ,@RX`@R @S_ =@S I@TeU@TA@Uk33@U5?@Vqhr@Vj~@Ww@W\@X}h@Yě@YƧ@Zڀ@Z넀@[ @[ @\"Ѐ@\V@]G@]I@^|@^~@_%,@_ր@`+@`@a1"@aU@b7@b @c>5?@c7K@dD(@d\(@eJ^5@e`A@fPt@fӅ@gVQ@gٺ^@h\j@h@ibG@iz@ji@j@koK@k=p@lup@lr@m{t@m@n@ò@o؀@p @p@q@q(@r+@r-@s`A@sQ@t#@t*@u)7@uj@v/@v @w5S@w`@x<@x =@yB I@y?|@zHA@zt@{Nff@{hr@|T@|ם@}Z@}@~`ě@~΀@fڀ@-@րm@ր @ցsS@ցV@ւy7@ւz@փ|@ք @ք,@օր@օ @ֆ@ֆ"@ևU@և@ֈ33@ֈ5?@։!7K@։j~@֊'\(@֊\@֋-h@֋t@֌3Ƨ@֌Q@֍9넀@֍@֎?@֎"Ѐ@֏Fz@֏G@֐LI@֐K@֑R~@֑p@֒Xր@֒ۥ@֓^@֓"@֔d̀@֔@֕k @֕@֖q7K@֖(@֗w+@֗^5@֘}`A@֙t@֙@֚*@֚^@֛ j@֛@֜G@֜S@֝@֝@֞K@֞=p@֟%?|@֟r@֠+t@֠@֡1@֡@֢7؀@֢@֣>@֣@֤C΀@֤+@֥J-@֥@֦PQ@֦S@֧VV@֧ى7@֨\z@֨߮@֩b @֩,@֪h`@֪ @֫o =@֫ I@֬uU@֬A@֭{33@֭ff@֮hr@֯j~@֯@ְ \@ְ@ֱě@ֱƧ@ֲڀ@ֲ넀@ֳ@ֳ @ִ#"Ѐ@ִV@ֵ)G@ֵz@ֶ/|@ֶ~@ַ5,@ַր@ָ;@ָ@ֹA"@ֹU@ֺG@ֺ @ֻN5?@ֻ7K@ּTj~@ּ\(@ֽZ^5@ֽݑh@־`t@־@ֿfQ@ֿ^@lj@@rG@z@y@@K@=p@ąp@r@ŋt@@Ƒ@̀@Ǘ؀@@Ȟ@ @ɤ(@'+@ʪ-@-`A@˰Q@3@̶*@97@ͼj@?@° @ES@`@L@ =@R I@?|@XA@t@^ff@hr@d@睲@j@@pě@΀@vڀ@-@}@ @كS@V@ډ7@ z@ۏ|@ @ܕ,@`@ݛ @@ޢ I@%U@ߧ@+33@5?@17K@j~@7\(@⺏\@=h@t@CƧ@ƸQ@I넀@@O@"Ѐ@Vz@G@\I@K@b~@p@hր@@n@"@t̀@@{ @@7K@(@+@ ^5@`A@t@@*@^@j@@"G@S@)@@/K@=p@5?|@r@;t@@A@ě@G؀@@N@@S΀@+@Z-@`A@`Q@S@f*@7@lz@@r @,@x`@ @ =@ I@U@A@33@ff@hr@j~@@\@@ ě@ Ƨ@ &ڀ@ 넀@ -@ @ 3"Ѐ@ V@ 9G@ z@?|@~@E,@ȣր@K@@Q"@U@W@ @^5?@7K@dj~@\(@j^5@h@pt@Ƨ@vQ@^@|@@"Ѐ@z@@ I@K@~@p@r@@@"@$̀@؀@ + @ @!0@!(@"7+@"-@#=`A@#Q@$C@$Ƈ*@%I7@%̼j@&O@&G@'US@'`@(\@( =@)b I@)?|@*hA@*t@+nff@+hr@,t@,@-z@-@.ě@/΀@/ڀ@0 -@0@1 @1S@2V@27@3z@3|@4" @4,@5(`@5 @6.@6 I@75U@7A@8;33@85?@9A7K@9j~@:G\(@:ʏ\@;Mh@;Гt@_@>"Ѐ@?fz@?G@@lI@@K@Ar~@Ap@Bxր@B@C~@D"@D̀@E@E @F@F7K@G(@G\(@H^5@H`A@I t@I@J&*@J^@K,j@K@L2G@LS@M9@M@N?K@N=p@OE?|@Or@PKt@PΧ@QQ@Qԛ@RW؀@R@S^@S@Tc΀@T+@Uj-@U`A@VpQ@VS@Wv*@W7@X|j@X@Y @Z,@Z`@[ @[ =@\ I@\U@]A@]33@^ff@^hr@_$j~@_@`*\@`@a0ě@aƧ@b6ڀ@b넀@c=@c @dC"Ѐ@dV@eIG@ez@fO|@f~@gU,@gأր@h[ @h@ia"@iU@jg@j @kn5?@k7K@ltj~@l\(@mz^5@mh@nt@oƧ@oQ@p ^@p@q@q"Ѐ@rz@r@sI@sK@t"~@tp@u(r@u@v.@v"@w4̀@w؀@x; @x@yA7K@y(@zG+@z-@{M`A@{Q@|S@|և*@}Y7@}ܼj@~_@~G@eS@`@׀l@׀ =@ׁr=p@ׁ?|@ׂxA@ׂt@׃~ff@ׄ@ׄ@ׅ@ׅ@׆ @׆@ׇ΀@ׇڀ@׈-@׈@׉ Q@׉S@׊&V@׊7@׋,z@׋|@׌2 @׌,@׍8`@׍ @׎>@׎ I@׏EU@׏A@אK33@א5?@בQhr@בj~@גW@גڏ\@ד]h@דt@הcƧ@הQ@וi넀@ו@זo@ז"Ѐ@חvz@חG@ט|I@טK@י~@ךp@ךր@כ @כ@ל"@ל̀@ם@ם @מ@מ7K@ן$(@ן\(@נ*^5@נ`A@ס0t@ס@ע6Q@ע^@ף@"@D̀@؀@K @@Q7K@(@W+@^5@]`A@t@c@*@i7@j@o@G@uS@`@|@ =@ق=p@?|@ڈA@ t@ێff@@ܔ@@ݚ@@ޠ@#΀@ߦڀ@*-@@0Q@S@6V@⹉7@ff@hr@Dj~@ǝ@J\@@Pě@Ƨ@Vڀ@넀@]@ @c"Ѐ@V@iG@z@o|@~@u,@ր@{ @@"@U@@ 33@5?@7K@j~@\(@\@h@t@#Ƨ@Q@ )^@ @!/@!"Ѐ@"6z@"@#^@> I@?eU@?A@@k33@@5?@Aqhr@Aj~@Bw@B\@C}h@Dě@DƧ@Eڀ@E넀@F @F @G"Ѐ@Gz@HG@HI@IK@I~@J%p@Jր@K+@K@L1"@L̀@M7@M @N>@N7K@OD(@O\(@PJ^5@P`A@QPt@QӅ@RVQ@Rٺ^@S\j@S@TbG@Tz@Ui@U@VoK@V=p@Wup@Wr@X{t@X@Y@Z@Z؀@[ @[@\@\΀@]+@]-@^`A@^Q@_#S@_*@`)7@`j@a/@a @b5S@b`@c<@c =@dB I@d?|@eHA@et@fNff@fhr@gT@gם@hZ\@h@i`ě@iƧ@jfڀ@j넀@km@k @ls"Ѐ@lV@myG@mz@n|@o~@o,@pր@p @q@q"@rU@r@s33@s5?@t!7K@tj~@u'\(@u\@v-h@vt@w3Ƨ@wQ@x9넀@x@y?@y"Ѐ@zFz@z@{LI@{K@|R~@|p@}Xr@}ۥ@~^@~"@d̀@؀@؀k @؀@؁q7K@؁(@؂w+@؂^5@؃}`A@؄t@؄@؅*@؅^@؆ j@؆@؇G@؇S@؈@؈@؉ =@؉=p@؊%?|@؊A@؋+t@؋ff@،1@،@؍7@؍@؎=@؎@؏C΀@؏ڀ@ؐJ-@ؐ@ؑP @ؑS@ؒVV@ؒى7@ؓ\z@ؓ|@ؔb @ؔ,@ؕh`@ؕ @ؖn@ؖ I@ؗuU@ؗA@ؘ{33@ؘ5?@ؙhr@ؚj~@ؚ@؛ \@؛h@؜ě@؜Ƨ@؝ڀ@؝넀@؞@؞ @؟#"Ѐ@؟V@ؠ)G@ؠI@ء/|@ء~@آ5p@آր@أ;@أ@ؤA"@ؤ̀@إG@إ @ئN@ئ7K@اT(@ا\(@بZ^5@ب`A@ة`t@ة@تfQ@ت^@ثlj@ث@جrG@جz@حy@ح@خK@د=p@دp@ذr@ذt@ر@ر@ز@ز؀@س@س@ش @ش΀@ص'+@ص-@ض-`A@ضQ@ط3S@ط*@ظ97@ظj@ع?@ع° @غES@غ`@ػL@ػ =@ؼR I@ؼ?|@ؽXA@ؽt@ؾ^ff@ؾhr@ؿd@ؿ睲@j@@pě@΀@vڀ@넀@}@ @ă"Ѐ@V@ʼnG@ z@Ə|@~@Ǖ,@ր@ț @@ɡ"@%U@ʧ@+33@ˮ5?@17K@̴j~@7\(@ͺ\@=h@t@CƧ@ƸQ@I넀@@O@"Ѐ@Vz@@\I@K@b~@p@hr@@n@"@t̀@؀@{ @@ف7K@(@ڇ+@ -@ۍ`A@Q@ܓ@*@ݙ7@j@ޟ@"G@ߥS@(`@@/ =@=p@5?|@A@;t@ff@A@ě@G@@M@@S΀@ڀ@Z-@@`Q@S@fV@7@lz@|@r @,@x`@ @~@ I@U@A@33@5?@hr@j~@򗝲@\@h@ ě@Ƨ@&ڀ@넀@,@ @3"Ѐ@V@9G@I@?|@~@E,@ȣր@K@Χ@Q"@̀@W@ @^@7K@d(@\(@j^5@`A@pt@@vQ@^@|j@@G@z@@ @K@=p@p@r@t@ @ @ $̀@ ؀@ *@ @ 0@ ΀@ 7+@ -@=`A@Q@CS@Ƈ*@I7@̼j@O@Ұ @US@`@\@ =@b I@?|@hA@t@nff@hr@t@@z@@ě@΀@ڀ@ -@@ @"Ѐ@V@G@z@|@"~@,@ (ր@ @!.@!"@"5U@"@#;33@#5?@$A7K@$j~@%G\(@%^5@&Mh@&Гt@'SƧ@'ָQ@(Y^@(@)_@)"Ѐ@*fz@*@+lI@+K@,r~@,p@-xr@-@.~@/"@/̀@0؀@0 @1@17K@2(@2+@3^5@3`A@4 t@4@5&*@57@6,j@6@72G@7S@88`@8@9? =@9=p@:E?|@:A@;Kt@;ff@]@>@?c΀@?ڀ@@j-@@@ApQ@AS@BvV@B7@C|z@C@D @E,@E`@F @F@G I@GU@HA@H33@I5?@Ihr@J$j~@J@K*\@Kh@L0ě@LƧ@M6ڀ@M넀@N<@N @OC"Ѐ@OV@PIG@PI@QO|@Q~@RU,@Rأր@S[@S@Ta"@TU@Ug@U @Vn@V7K@Wt(@W\(@Xz^5@X`A@Yt@Z@ZQ@[ ^@[j@\@\G@]z@]@^@^K@_"=p@_?|@`(r@`t@a.@a@b4@b؀@c:@c@d@@d΀@eG+@e-@fM`A@fQ@gSS@gև*@hY7@hܼj@i_@i @jeS@j`@kl@k =@lr I@l?|@mxA@mt@n~ff@ohr@oj~@p@p\@q @qě@rƧ@rڀ@s넀@s@t @t"Ѐ@u&V@uG@v,z@v|@w2~@w,@x8ր@x @y>@y"@zEU@z@{K33@{5?@|Q7K@|j~@}W\(@}ڏ\@~]h@~t@cƧ@Q@ـi^@ـ@فo@ف"Ѐ@قvz@ق@ك|I@كK@ل~@مp@مr@ن @ن@ه"@ه̀@و؀@و @ى@ى7K@ي$(@ي+@ً*^5@ً`A@ٌ0t@ٌ@ٍ6*@ٍ^@َ@ٹ@ٺD@ٺ؀@ٻJ@ٻ@ټP@ټ΀@ٽW+@ٽ-@پ]`A@پQ@ٿcS@ٿ*@i7@j@o@ @uS@`@|@ =@Ă I@?|@ňA@ t@Ǝff@hr@ǔ@@Ț\@@ɠě@#Ƨ@ʦڀ@)넀@˭@0 @̳"Ѐ@6V@͹G@5?@hr@Dj~@ǝ@J\@͑h@Pě@Ƨ@Vڀ@넀@\@ @c"Ѐ@V@iG@I@o|@~@up@ր@{@@"@̀@@  @@7K@(@\(@^5@ `A@ t@ #@ Q@ )^@ j@ /@ G@ 6z@ @<@K@B=p@p@Hr@t@N@љ@T@؀@Z@@`@΀@g+@-@m`A@Q@sS@*@y7@j@@ @,@`@ @ =@ I@U@A@33@ff@!hr@j~@ '@ \@!-@!ě@"3Ƨ@"ڀ@#9넀@#@$@ @$"Ѐ@%FV@%G@&Lz@&|@'R~@'ղ,@(Xր@( @)^@)"@*eU@*@+k @+5?@,q7K@,j~@-w\(@-^5@.}h@/t@/Ƨ@0Q@0^@1 @1@2"Ѐ@2z@3@3I@4K@4~@5%p@5r@6+@6@71"@7̀@87؀@8 @9>@97K@:D(@:+@;J-@;`A@\j@>߮@?bG@?S@@h`@@@Ao =@A=p@Bu?|@BA@C{t@Cff@D@E@E@F @F@G@G΀@Hڀ@H-@I@IQ@J#S@JV@K)7@Kz@L/|@L @M5,@M`@N; @N@OB I@OU@PHA@P33@QN5?@Qhr@RTj~@Rם@SZ\@Sݑh@T`t@TƧ@UfQ@U넀@Vl@V@Ws"Ѐ@Wz@XyG@XI@YK@Z~@Zp@[ր@[@\@\"@]̀@]@^ @^@_!7K@_(@`'\(@`^5@a-`A@at@b3@bQ@c9^@cj@d?@dG@eES@e@fL@fK@gR=p@g?|@hXr@ht@i^@iᙙ@jd@j؀@kj@k@lp@l΀@mw+@m-@n}`A@oQ@oS@p*@p7@q j@q@r @rS@s`@s@t =@t I@u%U@uA@v+33@vff@w1hr@wj~@x7@x\@y=@yě@zCƧ@zڀ@{I넀@{@|P @|"Ѐ@}VV@}G@~\z@~|@b~@,@ڀhր@ڀ @ځn@ځ"@ڂuU@ڂ@ڃ{33@ڃ5?@ڄ7K@څj~@څ\(@چ ^5@چh@ڇt@ڇƧ@ڈQ@ڈ^@ډ@ډ@ڊ#"Ѐ@ڊz@ڋ)@ڋI@ڌ/K@ڌ~@ڍ5p@ڍr@ڎ;t@ڎ@ڏA@ڏ̀@ڐG؀@ڐ@ڑN@ڑ@ڒT(@ڒ+@ړZ-@ړ`A@ڔ`Q@ڔ@ڕf*@ڕ7@ږlj@ږ@ڗrG@ڗS@ژx`@ژ@ڙ =@ښ=p@ښ?|@ڛA@ڛt@ڜff@ڜ@ڝ@ڝ@ڞ@ڞ@ڟ ě@ڟ΀@ڠ&ڀ@ڠ-@ڡ-@ڡ @ڢ3S@ڢV@ڣ97@ڣz@ڤ?|@ڤ° @ڥE,@ڥ`@ڦK @ڦ@ڧR I@ڧU@ڨXA@ڨ33@ک^5?@کhr@ڪdj~@ڪ睲@ګj\@ګh@ڬpě@ڬƧ@ڭvڀ@ڭ넀@ڮ|@ڮ@گ"Ѐ@ڰz@ڰG@ڱ I@ڱK@ڲ~@ڲp@ڳր@ڳ@ڴ@ڴ"@ڵ$̀@ڵ@ڶ+ @ڶ@ڷ17K@ڷ(@ڸ7+@ڸ^5@ڹ=`A@ڹt@ںC@ںƇ*@ڻI^@ڻ̼j@ڼO@ڼG@ڽUS@ڽ@ھ\@ھK@ڿb=p@ڿ?|@hr@t@n@@t@؀@z@@Ā@΀@Ň+@ -@ƍ@Q@ǓS@V@ș7@z@ɟ@" @ʥ,@(`@˫ @/ =@̲ I@5U@͸A@;33@ξff@Ahr@j~@G@ʏ\@M@ě@SƧ@ڀ@Y넀@@` @"Ѐ@fV@G@lz@|@r~@,@xր@@~@"@څU@@ۋ @5?@ܑ7K@j~@ݗ\(@^5@ޝh@ t@ߣƧ@&Q@੺^@,@@3"Ѐ@z@9@I@?K@~@Ep@r@K@Χ@Q@̀@W؀@@^@@d(@+@j-@`A@pQ@@v*@7@|j@@ @S@`@ @ =@ I@?|@A@t@ff@hr@$@@*@@0ě@΀@6ڀ@-@=@ @CS@V@I7@z@O|@Ұ @U,@`@[ @@b I@U@g@33@n5?@7K@tj~@\(@z\@h@t@Ƨ@Q@ 넀@@@"Ѐ@z@G@ I@ K@ "~@ p@ (ր@ @ .@ "@ 4̀@ @; @@A7K@(@G+@^5@M`A@Гt@S@և*@Y^@ܼj@_@G@eS@@l@K@r=p@?|@xr@t@~@@@؀@@@@΀@+@-@`A@ Q@S@ &*@ 7@!,z@!@"2 @",@#8`@# @$? =@$ I@%EU@%A@&K33@&ff@'Qhr@'j~@(W@(ڏ\@)]h@)ě@*cƧ@*ڀ@+i넀@+@,p @,"Ѐ@-vV@-G@.|I@.|@/~@0,@0ր@1 @1@2"@2U@3@3 @45?@47K@5$j~@5\(@6*^5@6h@70t@7Ƨ@86Q@8^@9[t@>ާ@?a@?̀@@g؀@@@An@A@Bt(@B+@Cz-@C`A@DQ@E@E*@F 7@Fj@G@GG@HS@H`@I@I =@J" I@J?|@K(A@Kt@L.ff@Lhr@M4@M@N:@N@O@ě@O΀@PFڀ@P-@QM@Q @RS"Ѐ@RV@SYG@Sz@T_|@T~@Ue,@Uր@Vk @V@Wq"@WU@Xw@X33@Y~5?@Z7K@Zj~@[\(@[\@\ h@\t@]Ƨ@]Q@^넀@^@_@_"Ѐ@`&z@`G@a,I@aK@b2~@bp@c8r@c@d>@d"@eD̀@e؀@fK @f@gQ7K@g(@hW+@h^5@i]`A@it@jc@j*@ki^@kj@lo@lG@muS@m@n|@nK@o=p@p?|@pr@q t@q@r@r@s@s@t@t@u#΀@uڀ@v*-@v@w0Q@wS@x6V@x7@yff@ۤhr@ۥD@ۥǝ@ۦJ@ۦ@ۧPě@ۧ΀@ۨVڀ@ۨ-@۩]@۩ @۪cS@۪V@۫i7@۫z@۬o|@۬~@ۭu,@ۭր@ۮ{ @ۮ@ۯ"@۰U@۰@۱ 33@۱5?@۲7K@۲j~@۳\(@۳\@۴h@۴t@۵#Ƨ@۵Q@۶)^@۶@۷/@۷"Ѐ@۸6z@۸@۹5?@7K@D(@\(@J^5@`A@Pt@Ӆ@VQ@ٺ^@\j@@bG@z@i@@oK@=p@u?|@r@{t@@@@؀@ @@@΀@+@-@`A@Q@#S@*@)7@j@/@ @5S@`@<@ =@B I@?|@HA@t@Nff@hr@T@ם@Z\@@`ě@Ƨ@fڀ@넀@m@ @s"Ѐ@V@yG@z@|@~@,@ր@ @@"@U@@ 33@ 5?@ !7K@ j~@ '\(@ \@ -h@ t@ 3Ƨ@ Q@9^@@?@"Ѐ@Fz@@LI@K@R~@p@Xr@ۥ@^@"@d̀@؀@j@@p@(@w+@-@}`A@Q@@*@7@ j@@G@S@`@@ =@=p@ %?|@ A@!+t@!ff@"1@"@#7@#@$=@$@%C΀@%ڀ@&J-@&@'P @'S@(VV@(ى7@)\z@)|@*b @*,@+h`@+ @,n@, I@-uU@-A@.{33@.5?@/hr@0j~@0@1 \@1h@2ě@2Ƨ@3ڀ@3넀@4@4 @5#"Ѐ@5V@6)G@6I@7/K@7~@85p@8ր@9;@9@:A"@:̀@;G@; @Z^5@>`A@?`t@?@@fQ@@^@Alj@A@BrG@Bz@Cy@C@DK@E=p@Ep@Fr@Ft@G@G@H@H؀@I@I@J @J΀@K'+@K-@L-`A@LQ@M3S@M*@N97@Nj@O?@O° @PE,@P`@QK @Q =@RR I@RU@SXA@S33@T^ff@Thr@Udj~@U睲@Vj\@V@Wpě@WƧ@Xvڀ@X넀@Y}@Z @Z"Ѐ@[V@[G@\ z@\|@]~@],@^ր@^ @_@_"@`%U@`@a+ @a5?@b17K@bj~@c7\(@c^5@d=h@dt@eCƧ@eƸQ@fI^@f@gO@g"Ѐ@hVz@h@i\I@iK@jb~@jp@khr@k@ln@l"@mt̀@m؀@n{ @n@o7K@p(@p+@q -@q`A@rQ@r@s*@s7@tj@t@u"G@uS@v(`@v@w/ =@w=p@x5?|@xA@y;t@yff@zAhr@zě@{G@{@|M@|ě@}S΀@}ڀ@~Z-@~@` @S@܀fV@܀7@܁lz@܁|@܂r @܂,@܃x`@܃ @܄~@܅ I@܅U@܆A@܆33@܇5?@܇hr@܈j~@܈@܉\@܉h@܊ t@܊Ƨ@܋&Q@܋넀@܌,@܌@܍3"Ѐ@܍z@܎9G@܎I@܏?K@܏~@ܐEp@ܐȣր@ܑK@ܑΧ@ܒQ"@ܒ̀@ܓW@ܓ @ܔ^@ܔ7K@ܕd(@ܕ\(@ܖj^5@ܖ`A@ܗpt@ܗ@ܘvQ@ܘ^@ܙ|j@ܙ@ܚG@ܛS@ܛ@ܜ @ܜK@ܝ=p@ܝ?|@ܞr@ܞt@ܟ@ܟ@ܠ$@ܠ؀@ܡ*@ܡ@ܢ0@ܢ΀@ܣ6ڀ@ܣ-@ܤ=@ܤQ@ܥCS@ܥV@ܦI7@ܦz@ܧO@ܧҰ @ܨU,@ܨ`@ܩ[ @ܩ =@ܪb I@ܪU@ܫhA@ܫ33@ܬnff@ܬhr@ܭtj~@ܭ@ܮz\@ܮ@ܯě@ܰƧ@ܰڀ@ܱ 넀@ܱ@ܲ @ܲ"Ѐ@ܳV@ܳG@ܴI@ܴ|@ܵ"~@ܵ,@ܶ(ր@ܶ@ܷ.@ܷ"@ܸ5U@ܸ@ܹ; @ܹ5?@ܺA7K@ܺj~@ܻG\(@ܻ^5@ܼMh@ܼГt@ܽSƧ@ָܽQ@ܾY^@ܾ@ܿ_@ܿ"Ѐ@fz@@lI@K@r=p@p@xr@t@~@@ń̀@؀@Ɗ@@ǐ@(@ȗ+@-@ɝ`A@ Q@ʣS@&*@˩7@,j@̯@2 @͵S@8`@μ@? =@ I@E?|@A@Kt@ff@Qhr@ԛ@W@@]@ě@c΀@ڀ@j-@@p @S@vV@7@|z@|@ڂ @,@ۈր@ @܎@"@ݕU@@ޛ33@5?@ߡ7K@$j~@\(@*\@᭑h@0t@Ƨ@6Q@넀@<@@C"Ѐ@z@IG@I@OK@~@Up@أր@[@ާ@a"@̀@g؀@ @n@7K@t(@+@z^5@`A@t@@*@ ^@j@@G@S@`@@ =@"=p@?|@(A@t@.ff@@4@@:@@@@΀@Fڀ@-@M@Q@SS@V@Y7@z@_@ @e,@`@k @ =@r I@U@xA@33@~5?@hr@j~@@\@ h@ě@Ƨ@ڀ@ 넀@ @ @ "Ѐ@ &V@ G@ ,I@ |@ 2~@ ,@8ր@@>@"@EU@@K @5?@Q7K@j~@W\(@^5@]`A@t@c@Q@i^@j@o@G@vz@@|@K@=p@p@r@ t@@@@؀@@@@ #΀@ +@!*-@!`A@"0Q@"S@#6*@#7@$Y@>I@?_K@?~@@ep@@r@Ak@A@Bq"@B̀@Cw؀@C @D~@E7K@E(@F+@F^5@G `A@Gt@H@H*@I^@Ij@J@JG@K%S@K@L,@LK@M2=p@M?|@N8A@Nt@O>ff@O@PD@Pǝ@QJ@Q@RP@R΀@SVڀ@S-@T]@TQ@UcS@UV@Vi7@Vz@Wo|@W @Xu,@X`@Y{ @Y@Z I@[U@[A@\ 33@\5?@]hr@]j~@^@^\@_h@_ě@`#Ƨ@`ڀ@a)넀@a@b0 @b"Ѐ@c6V@cG@d5?@ݏ7K@ݐDj~@ݐ\(@ݑJ^5@ݑ͑h@ݒPt@ݒƧ@ݓVQ@ݓٺ^@ݔ\@ݔ@ݕc"Ѐ@ݕz@ݖi@ݖI@ݗoK@ݗ=p@ݘup@ݘr@ݙ{t@ݙ@ݚ@ݛ̀@ݛ؀@ݜ @ݜ@ݝ@ݝ(@ݞ+@ݞ-@ݟ`A@ݟQ@ݠ#@ݠ*@ݡ)7@ݡj@ݢ/@ݢG@ݣ5S@ݣ`@ݤ<@ݤ =@ݥB=p@ݥ?|@ݦHA@ݦt@ݧNff@ݧhr@ݨT@ݨם@ݩZ@ݩ@ݪ`ě@ݪ΀@ݫfڀ@ݫ-@ݬm@ݬ @ݭsS@ݭV@ݮy7@ݮz@ݯ|@ݰ @ݰ,@ݱ`@ݱ @ݲ@ݲ I@ݳU@ݳA@ݴ33@ݴ5?@ݵ!hr@ݵj~@ݶ'@ݶ\@ݷ-h@ݷě@ݸ3Ƨ@ݸQ@ݹ9넀@ݹ@ݺ?@ݺ"Ѐ@ݻFz@ݻG@ݼLI@ݼK@ݽR~@ݽp@ݾXր@ݾۥ@ݿ^@ݿ"@d̀@@k @@q7K@(@w\(@^5@}`A@t@Ń@Q@Ɖ^@ j@Ǐ@G@ȕS@@ɜ@K@ʢ=p@%?|@˨r@+t@̮@1@ʹ@7؀@κ@>@@C΀@ڀ@J-@@PQ@S@VV@ى7@\z@߮@b @,@h`@ @o =@ I@uU@A@{33@ff@ځhr@j~@ۇ@ \@܍@ě@ݓƧ@ڀ@ޙ넀@@ߠ @#"Ѐ@V@)G@I@/|@~@5,@㸣ր@;@@A"@U@G@ @N5?@7K@Tj~@\(@Z^5@`A@`t@@fQ@^@lj@@rG@z@y@@K@=p@p@r@t@@򑙙@̀@؀@@@ @(@'+@-@-`A@Q@3@*@97@j@?@° @ES@`@L@ =@R I@?|@XA@t@^ff@hr@d@睲@j@@pě@΀@vڀ@-@}@ @S@V@7@ z@|@ @,@ `@ @ @ "@ %U@ @ +33@ 5?@ 17K@ j~@7\(@\@=h@t@CƧ@ƸQ@I넀@@O@"Ѐ@Vz@@\I@K@b~@p@hr@@n@"@t̀@؀@{ @@7K@(@+@ ^5@`A@t@@*@^@j@@ "G@ S@!)@!@"/K@"=p@#5?|@#A@$;t@$ff@%A@%ě@&G@&@'M@'@(S΀@(ڀ@)Z-@)@*`Q@*S@+fV@+7@,lz@,@-r @-,@.x`@. @/ =@0 I@0U@1A@133@2ff@2hr@3j~@3@4\@4h@5 ě@5Ƨ@6&ڀ@6넀@7,@7 @83"Ѐ@8V@99G@9I@:?|@:~@;Ep@;ȣր@W@> @?^@?7K@@d(@@\(@Aj^5@A`A@Bpt@B@CvQ@C^@D|j@D@EG@Fz@F@G @GK@H=p@Hp@Ir@It@J@J@K$̀@K؀@L*@L@M0@M΀@N7+@N-@O=`A@OQ@PCS@PƇ*@QI7@Q̼j@RO@RҰ @SUS@S`@T\@T =@Ub I@U?|@VhA@Vt@Wnff@Whr@Xt@X@Yz@Y@Zě@[΀@[ڀ@\ 넀@\@] @]"Ѐ@^V@^G@_z@_|@`"~@`,@a(ր@a @b.@b"@c5U@c@d; @d5?@eA7K@ej~@fG\(@f^5@gMh@gГt@hSƧ@hָQ@iY^@i@j_@j"Ѐ@kfz@k@llI@lK@mr~@mp@nxr@n@o~@p"@p̀@q؀@q @r@r7K@s(@s+@t^5@t`A@u Q@u@v&*@v7@w,j@w@x2G@xS@y8`@y@z? =@z=p@{E?|@{A@|Kt@|ff@}Q@}ԛ@~W@~@]@@ހc΀@ހڀ@ށj-@ށ@ނpQ@ނS@ރvV@ރ7@ބ|z@ބ|@ޅ @ކ,@ކ`@އ @އ@ވ I@ވU@މA@މ33@ފ5?@ފhr@ދ$j~@ދ@ތ*\@ތh@ލ0t@ލƧ@ގ6Q@ގ넀@ޏ<@ޏ@ސC"Ѐ@ސz@ޑIG@ޑI@ޒOK@ޒ~@ޓUp@ޓأր@ޔ[@ޔާ@ޕa"@ޕ̀@ޖg@ޖ @ޗn@ޗ7K@ޘt(@ޘ\(@ޙz^5@ޙ`A@ޚt@ޛ@ޛQ@ޜ ^@ޜj@ޝ@ޝG@ޞS@ޞ@ޟ@ޟK@ޠ"=p@ޠ?|@ޡ(r@ޡt@ޢ.@ޢ@ޣ4@ޣ؀@ޤ:@ޤ@ޥ@@ޥ΀@ަG+@ަ-@ާM`A@ާQ@ިSS@ިև*@ީY7@ީܼj@ު_@ު @ޫeS@ޫ`@ެl@ެ =@ޭr I@ޭU@ޮxA@ޮ33@ޯ~ff@ްhr@ްj~@ޱ@ޱ\@޲ @޲ě@޳Ƨ@޳ڀ@޴넀@޴@޵ @޵"Ѐ@޶&V@޶G@޷,I@޷|@޸2~@޸,@޹8ր@޹@޺>@޺"@޻EU@޻@޼K @޼5?@޽Q7K@޽j~@޾W\(@޾^5@޿]h@޿t@cƧ@Q@i^@@o@"Ѐ@vz@@|I@K@ł~@p@ƈr@ t@ǎ@@Ȕ̀@؀@ɚ@@ʠ@$(@˧+@*-@̭`A@0Q@ͳ@6*@ι7@@@D@؀@J@@P@΀@W+@-@]`A@Q@cS@V@i7@z@o@ @u,@`@{ @ =@ I@U@A@ 33@ff@hr@j~@ @ \@ h@ ě@ #Ƨ@ ڀ@ )넀@ @ 0 @ "Ѐ@6V@G@5?@:7K@;Dj~@;\(@VQ@>넀@?\@?@@c"Ѐ@@z@Ai@AI@BoK@B~@Cup@Cr@D{@D@E"@F̀@F؀@G  @G@H7K@H(@I+@I-@J`A@JQ@K#@K*@L)7@Lj@M/@MG@N5S@N`@O<@O =@PB=p@P?|@QHA@Qt@RNff@Rљ@ST@Sם@TZ@T@U`@U΀@Vfڀ@V-@Wm@WQ@XsS@XV@Yy7@Yz@Z|@[ @[,@\`@\ @]@] I@^U@^A@_33@_5?@`!hr@`j~@a'@a\@b-h@bě@c3Ƨ@cڀ@d9넀@d@e@ @e"Ѐ@fFV@fG@gLI@g|@hR~@hղ,@iXր@iۥ@j^@j"@kd̀@k@lk @l@mq7K@m(@nw\(@n^5@o}`A@pt@p@qQ@q^@r j@r@sG@sS@t@t@uK@u=p@v%?|@vr@w+t@w@x1@x@y7؀@y@z>@z@{C΀@{+@|J-@|`A@}PQ@}S@~V*@~ى7@\j@߮@߀b @߀S@߁h`@߁@߂o =@߂ I@߃uU@߃A@߄{33@߄ff@߅hr@߆j~@߆@߇ \@߇@߈ě@߈Ƨ@߉ڀ@߉넀@ߊ@ߊ @ߋ#"Ѐ@ߋV@ߌ)G@ߌz@ߍ/|@ߍ~@ߎ5,@ߎր@ߏ; @ߏ@ߐA"@ߐU@ߑG@ߑ33@ߒN5?@ߒ7K@ߓTj~@ߓ\(@ߔZ^5@ߔݑh@ߕ`t@ߕƧ@ߖfQ@ߖ^@ߗl@ߗ@ߘs"Ѐ@ߘz@ߙy@ߙI@ߚK@ߛ~@ߛp@ߜr@ߜt@ߝ@ߝ@ߞ̀@ߞ؀@ߟ@ߟ@ߠ @ߠ(@ߡ'+@ߡ-@ߢ-`A@ߢQ@ߣ3@ߣ*@ߤ97@ߤj@ߥ?@ߥG@ߦES@ߦ`@ߧL@ߧ =@ߨR=p@ߨ?|@ߩXA@ߩt@ߪ^ff@ߪᙙ@߫d@߫睲@߬j@߬@߭pě@߭΀@߮vڀ@߮-@߯}@߰ @߰S@߱V@߱7@߲ z@߲|@߳ @߳,@ߴ`@ߴ @ߵ@ߵ I@߶%U@߶A@߷+33@߷5?@߸1hr@߸j~@߹7@߹\@ߺ=h@ߺě@߻CƧ@߻ڀ@߼I넀@߼@߽O@߽"Ѐ@߾Vz@߾G@߿\I@߿K@b~@p@hր@@n@"@t̀@@{ @@Ł7K@(@Ƈ+@ ^5@Ǎ`A@t@ȓ@*@ə^@j@ʟ@"G@˥S@)@̬@/K@Ͳ=p@5?|@θr@;t@Ͼ@A@ě@G؀@@N@@S΀@+@Z-@@`Q@S@fV@7@lz@@r @,@x`@ @ =@ I@ۅU@A@܋33@5?@ݑhr@j~@ޗ@\@ߝh@ ě@Ƨ@&ڀ@넀@,@ @3"Ѐ@V@9G@I@?|@~@E,@ȣր@K@@Q"@U@W@ @^5?@7K@dj~@\(@j^5@h@pt@@vQ@^@|j@@G@z@@ @K@=p@p@r@t@@@$̀@؀@*@@0@(@7+@-@=`A@Q@C@Ƈ*@I7@̼j@O@Ұ @US@`@\@ =@1$@r@@ Ā@^@733@x9@@M@@=hr@~G@bM@S@C|@@@@Ə\@b@Ih@@+@̣@=p@Ov@?|@@@Q@@U@l@@@*@[@@@ @b5?@@@@G@ &ȴ@ hI@@ S@ \(@ ,@@ nvȀ@ @ h@@ 3 =@@ tC@ $@ @ 9?|@ zQ@ 9W@ @ ?S@ @@ ff@@l@@E@ @ț@ z@K@/@ΰ @I@@Q@@C@@/@^5@W@p@@C@^ I@@@"@@d Ā@^@33@(̀@jM@@hr@.G@pz@@@|@@5@v\@(@@;+@|ě@=p@v@AX@@@@r@@Gl@$@ʇ*@ Ā@M@@д9@@5?@@S@G@ȴ@bM@YS@|@@@@vȀ@`b@h@@+@$@f$@v@?|@*@@lQ@@@S@ 0@@ rff@@ @ @!7 @!x@!z@!@@"=/@"~ @"I@@#@@#C\(@#/@#^5@$@$Ip@$ =@@$̋C@% I@%O@%@%ҸQ@&9W@&U^@&S@&̀@'ff@@'[l@@'hr@' @( z@(a@@(@(@)& @)h(@)@)C@@*,ě@*n^5@* @*X@@+2@+tr@+ I@+@,9$@,z*@, Ā@,@-?33@-9@@-5?@@.@.EG@.G@.bM@/ S@/K|@@/@@/Ώ\@0b@0Qh@@0+@0ԣ@1=p@1Wv@1?|@1@@2Q@@2]@2l@2@@3"*@3c@3@3@4(@4j5?@@4@@4/@5.ȴ@5pI@@5S@5\(@64/@6vvȀ@6@6h@@7; =@@7|C@7$@7@8A@8Q@89W@9^@9GS@9̀@9ff@@: l@@:Mhr@: @:z@;z@;S@;@;ְ @<(@$r@>f I@>@>@?*@@?l Ā@?^@?33@@0̀@@rM@@@@hr@A6G@AxbM@A@@A|@@B=@B~\@Bb@C@CC+@Cě@C=p@Dv@DIX@@D@@Dr@E @EOl@E$@E҇*@F Ā@FU@F@Fش9@@G5?@@G[@GG@Gȴ@H bM@HaS@H\(@H@@I&vȀ@Ig@Ih@@I =@@J,@Jn$@J@J?|@K2Q@KtQ@@K@KS@L8@@Lzff@@Ll@@L@M? @M@Mz@N@NE/@N @NI@@O @@OKC@@O/@O^5@P@PQp@P@PԋC@Q I@QW@Q@Qڟ@@R9W@R]^@RS@R̀@S"M@Scl@@Shr@S @T(z@Ti@@T@T@U.\@Up(@U@U+@V4ě@Vv=p@V @VX@@W:@@W|r@W@W@XA$@X*@X Ā@Y@YG33@Y9@@Y5?@@Z @ZMG@ZG@ZbM@[S@[S|@@[@@[֏\@\b@\Yh@@\+@\ܣ@]$@]_v@]?|@]@@^$Q@@^e@^l@^@@_**@_k@_@_@`0@`r5?@@`@@`/@a6 @axI@@a@@a\(@bG@mbM@mS@n|@@nD@@n\@nb@o h@@oK+@o@o=p@pv@pQ?|@p@@pQ@@q@qWl@q@@qڇ*@r@r]@r@r@s"5?@@sc@@sG@sȴ@t(I@@tiS@t\(@t@@u.vȀ@uo@uh@@u =@@v4C@vv$@v@v?|@w:Q@w|9W@w@wS@x@@@xff@@xl@@y@yG @y@yz@z @zM/@z @zI@@{@@{SC@@{/@{^5@|@|Yp@|@|܋C@} I@}_@}@}⟾@@~$ Ā@~e^@~33@~̀@*M@k@hr@G@0z@q@@|@@@6\@x(@@+@<ě@~=p@v@X@@B@@r@@l@I$@*@ Ā@ @O@9@@5?@@@UG@ȴ@bM@S@[|@@@@vȀ@ b@ah@@+@@&$@gv@?|@@@,Q@@m@S@@@2ff@@s@@ @8@zz@@@/@> @I@@@@\(@D/@^5@@ p@K =@@C@ I@@Q@Q@9W@^@WS@̀@ff@@l@@]hr@ @z@!@@c@@ @((@i@C@@ě@.^5@o @X@@@4r@u@@$@:*@| Ā@@33@@9@@5?@@@G@FG@bM@S@ |@@L@@\@b@h@@S+@@=p@v@Y?|@@@Q@@@_l@@@*@#@e@@蛥@*5?@@k@@/@ȴ@0I@@qS@࠳\(@/@6vȀ@w@ࡹh@@ =@@\@ୀb@@+@Dě@ஆ=p@Ǿv@ X@@J@@ௌr@@l@Q$@ఒ*@ Ā@@W@ౘ9@@5?@@@]G@ಞȴ@bM@!S@c\(@೤@@vȀ@'@ih@@ഫ =@@@.$@o@൱?|@Q@4Q@@u@භS@@@:ff@@{l@@෽@ @@@ขz@Õ@/@F @่I@@@@ C@@L/@ຎ^5@@p@R@໔C@ I@@Y@༚@@9W@^@_S@འ̀@M@#l@@ehr@ྦྷ @z@)@@k|@@࿭@\@0(@q@+@ě@6=p@w @X@@@@^5@@p@ =@@DC@Ά I@ǥ@ @JQ@ό9W@ͺ^@S@P̀@Вff@@l@@hr@W @јz@z@@]@Ҟ @(@!@@cC@@Ӥě@^5@' @iX@@Ԫ@r@. I@o@ձ$@@@4 Ā@u^@ַ33@9@@:M@{@׽hr@G@@bM@؁S@|@@@@F\@وb@ɑh@@ +@L@ڎ=p@Ͼv@?|@R@@۔Q@@@l@X@@ܚ*@@@_@ݠ@5?@@#@@eG@ަȴ@I@@)S@k\(@߬@@vȀ@/@qh@@ =@@C@6$@w@?|@Q@<9W@}@S@@@Bff@@l@@Ł@ @H@z@˕@ /@N @I@@@@C@@T/@^5@@p@Z@看C@ I@@a@袟@@ Ā@%^@g33@̀@M@+@mhr@G@z@1@@s|@@@\@8(@y@+@ě@>=p@v@X@@@@Dr@@l@ $@J*@ Ā@͙@@P9@@5?@@@G@Vȴ@bM@S@|@@\@@vȀ@b@!h@@c+@@$@'v@i?|@Q@Q@@-@oS@@@ff@@3@u@ @@:z@{@@/@ @@I@@@@\(@/@F^5@@p@ =@@LC@ I@ϥ@@RQ@9W@պ^@S@X̀@ff@@l@@hr@_ @z@@@#@e@ @(@)@kC@@ě@^5@/ @qX@@@r@5@w@$@*@< Ā@}@33@9@@B5?@@@G@G@HbM@S@|@@ @@N\@b@ёh@@+@T@=p@׾v@?|@Z@@Q@@@l@`@@*@@ %@ g@ @ 5?@@ +@@ m/@ ȴ@ I@@ 1S@ s\(@ /@ vȀ@ 7@ yh@@ =@@ C@ > I@ @ @Q@D9W@^@S@̀@Jff@@l@@hr@ @Pz@z@ӕ@@V @(@@@C@@\ě@^5@ @!p@b@r@ I@'@i@@@ Ā@-^@o33@9@@M@3@uhr@G@bM@9@@{|@@@\@@b@@+@ě@F=p@v@X@@ @@Lr@@l@$@R*@ Ā@ՙ@@X9@@5?@@@G@^ȴ@I@@S@#\(@d@@vȀ@@)h@@k =@@@$@ /@ q?|@ Q@ Q@@!5@!wS@!@@!ff@@";l@@"}@" @#@#Bz@#@#/@$ @$HI@@$@@$C@@% /@%N^5@%@%p@&@&TC@& I@&ץ@'@'Z@@'9W@'ݺ^@(S@(`̀@(M@(l@@)%hr@)g @)z@)@@*+|@@*m@*\@*(@+1@+s+@+ě@+=p@,7 @,yX@@,@@,r@-=@-@-$@.*@.D Ā@.@.@/9@@/J5?@@/@/G@0ȴ@0PbM@0S@0|@@1@@1VvȀ@1b@1ّh@@2+@2\@2$@2߾v@3!?|@3b@@3Q@@3@4'l@4h@@4*@4@5-@5o@5@55?@@63@@6u/@6 @6I@@79@@7{\(@7/@7^5@8?@8p@8 =@@9C@9F I@9@9@: Q@:L9W@:^@:S@;̀@;Rff@@;l@@;hr@< @#C@@>dě@>^5@> @?)X@@?j@?r@? I@@/@@q$@@@@@ Ā@A5^@Aw33@A9@@AM@B;@B}G@BG@CbM@CAS@C|@@C@@D\@DHb@Dh@@D+@E @EN=p@Ev@E?|@F@@FTQ@@F@Fl@G@@GZ*@G@Gݙ@H@H`@H5?@@H@@I%G@Ifȴ@II@@IS@J+\(@Jl@@JvȀ@J@K1h@@Ks =@@KC@K$@L7@Ly?|@LQ@L9W@M=@MS@M@@Nff@@NCl@@N@N @O@OJz@O@O/@P @PPI@@P@@PC@@Q/@QV^5@Q@Qp@R@R\C@R I@R߅@S!@Sb@@S Ā@S^@T'33@Th̀@TM@T@U-hr@UnG@Uz@U@@V3|@@Vu@V\@Vb@W9@W{+@Wě@W=p@X?v@XX@@X@@Yr@YE@Yl@Y$@Z *@ZL Ā@Z@Z@[9@@[R5?@@[@[G@\ȴ@\XbM@\S@\|@@]@@]^vȀ@]b@]h@@^#+@^d@^$@^v@_)?|@_jQ@_Q@@_@`/S@`p@@`ff@@`@a5@aw @a@az@b;@@b}/@b @cI@@cA@@cC@@c/@d^5@dG@dp@d@e C@eN I@e@e@f@@fT9W@f^@fS@g̀@gZM@gl@@ghr@h @h`z@h@@h㕀@i%@if @i(@i@j+C@@jlě@j^5@j @k1X@@kr@@kr@k@l7@ly$@l*@l Ā@m=@m33@m9@@n5?@@nC@nG@nG@obM@oIS@o|@@o@@p\@pPb@ph@@p+@q@qV=p@qv@q?|@r@@r\Q@@r@rl@s @@sb*@s@s@t'@th@t5?@@t@@u-/@unȴ@uI@@uS@v3\(@vt/@vvȀ@v@w9h@@w{ =@@wC@w I@x?@x@x¸Q@y9W@yE^@yS@ỳ@z ff@@zKl@@zhr@z @{z@{Rz@{@{@| @|X(@|@@|C@@}ě@}^^5@} @}p@~"@~dr@~ I@~@)@j@@ Ā@^@/33@p9@@ဲM@@5hr@vG@ၸbM@@@;|@@}@Ⴞ\@b@A@Ⴣ+@ě@=p@Gv@ᄉ?|@@@ Q@@M@ᅏl@@@*@S@ᆕ@@@Z5?@@ᇛ@@G@ȴ@`I@@ሡS@\(@$@@fvȀ@ቧ@h@@+ =@@l@ኮ$@@1?|@rQ@ዴQ@@@7S@x@@ጺff@@l@@=@ @@z@C@ᎅ/@ư @I@@I@@ᏋC@@/@^5@O@ᐑp@@C@V I@ᑗ@@@@\9W@ᒝ^@S@ ̀@bM@ᓣl@@hr@' @hz@ᔩ@@|@@-@n\@ᕰ(@@3+@tě@ᖶ=p@ @9X@@z@@ᗼr@@?@ᘁ$@‡*@ Ā@E@ᙇ@ȴ9@@ 5?@@K@ᚍG@ȴ@bM@QS@ᛓ|@@@@vȀ@Xb@᜙h@@+@@^$@᝟v@?|@"@@dQ@@ឥ@l@(@@j*@៫@@/@p@ᠲz@@@5/@v @ᡸI@@@@;\(@|/@ᢾ^5@@Ap@ᣃ =@@ċC@ I@G@ᤉ@ʟ@@ 9W@M^@᥏S@̀@M@Sl@@ᦕhr@ @z@Y@@᧛@@ @`(@ᨡ@C@@$ě@f^5@ᩧ @X@@*@lr@᪮ I@@1$@r@@᫴ Ā@^@733@x9@@ᬺM@@=G@~G@bM@S@C|@@ᮄ@@Ə\@b@Ih@@ᯋ+@̣@=p@Ov@ᰑ?|@@@Q@@U@᱗l@@@*@[@Ო@@ @b5?@@᳣@@G@&ȴ@hI@@ᴩS@\(@,/@nvȀ@ᵯ@h@@3 =@@tC@ᶶ$@@9?|@zQ@᷼9W@@?S@Ḁ@@ff@@l@@Ehr@ṇ @z@ z@K@ẍ@ΰ @(@Q@@ồC@@ě@^5@W @Ἑp@@r@^ I@Ὗ@@"@@d Ā@ᾥ^@33@(̀@jM@Ύ@hr@.G@pz@@@|@@5@v\@b@@;+@|ě@¾=p@v@AX@@Â@@r@@Gl@ĉ$@ʇ*@ Ā@M@ŏ@д9@@5?@@S@ƕG@ȴ@bM@YS@Ǜ|@@@@vȀ@`b@ȡh@@+@$@f$@ɧ@?|@*Q@lQ@@ʭ@S@0@@rff@@˳@@7 @x@̺z@@@=/@~ @I@@@@CC@@΄/@^5@@Ip@ϊ@̋C@ I@O@Б@ҟ@@9W@U^@їS@̀@M@[l@@ҝhr@ @ z@a@@ӣ@@& @h(@ԩ@C@@,ě@n^5@կ @X@@2@@tr@ֵ@@9$@z*@׼ Ā@@?33@؀9@@5?@@@EG@نG@bM@ S@K|@@ڌ@@vȀ@b@Qh@@ۓ+@ԣ@$@Wv@ܙ?|@@@Q@@]@ݟl@@@"*@c@ޥ@@(@j5?@@߫@@/@.ȴ@pI@@S@\(@4/@vvȀ@@h@@; =@@|C@ I@@A@ジQ@9W@^@GS@̀@ff@@ l@@Mhr@ @z@z@S@@ְ @(@Y@@C@@ě@^5@_ @p@@$r@f I@駅@@*@@l Ā@ꭺ^@33@09@@rM@@hr@6G@xbM@@@|@@=@~\@b@@C+@@=p@v@I?|@@@Q@@ @Ol@@@҇*@@U@@؛@5?@@[@@G@ȴ@ I@@aS@\(@@@&vȀ@g@h@@ =@@,@n$@@?|@2Q@tQ@@@S@8@@zff@@l@@@? @@z@@E/@ @I@@ @@KC@@/@^5@ @Qp@@r@ I@W@@ڟ@@ Ā@]^@33@̀@"M@c@hr@G@(z@i@@|@@@.\@p(@@+@4ě@v=p@ @X@@:@@|r@@l@A$@*@ Ā@@G@9@@5?@@ @MG@ȴ@bM@S@S|@@@@vȀ@b@Yh@@+@ܣ@$@_v@?|@@@ $Q@@ e@ l@ @@ **@ k@ @ @ 0@ rz@ @@ /@ 6 @ xI@@ @@ \(@ G@bM@S@|@@D@@\@b@ h@@K+@@=p@v@Q?|@@@Q@@@Wl@@@ڇ*@@]@@@"5?@@c@@/@ȴ@(I@@iS@\(@/@ .vȀ@ o@ h@@ =@@!4C@!v$@!@!?|@":Q@"|9W@"@"S@#@@@#ff@@#l@@$hr@$G @$z@$z@% @%M@% @%(@&@@&SC@@&ě@&^5@' @'Yp@'@'r@( I@(_@(@(⟾@@)$ Ā@)e^@)33@)̀@**M@*k@*hr@*G@+0z@+q@@+|@@+@,6\@,xb@,@,+@-<ě@-~=p@-v@.X@@.B@@.r@.@/l@/I$@/*@/ Ā@0 @0O@0@05?@@1@@1UG@1ȴ@1I@@2S@2[\(@2@@2vȀ@3@3ah@@3 =@@3@4&$@4g@4?|@4Q@5,Q@@5m@5S@5@@62ff@@6s@6@6 @78@7zz@7@@7/@8> @8I@@8@@9C@@9D/@9^5@9@: p@:J@:C@: I@;@;Q@;@@;9W@<^@!@@>c|@@>@>\@?((@?i@?+@?ě@@.=p@@o @@X@@@@@A4r@Au@A@A$@B:*@B| Ā@B@B33@C@9@@C5?@@C@DG@DFG@DbM@DS@E |@@EL@@EvȀ@Eb@Fh@@FS+@F@F$@Gv@GY?|@G@@GQ@@H@H_l@H@@H*@I#@Ie@I@I蛥@J*5?@@Jk@@J/@Jȴ@K0I@@KqS@K\(@K/@L6vȀ@Lw@Lp@L =@@M\@Xb@X@Y+@YD@Y=p@YǾv@Z ?|@ZJ@@ZQ@@Z@[l@[P@@[*@[@\@\W@\@\5?@@]@@]]/@]ȴ@]I@@^!S@^c\(@^/@^vȀ@_'@_ih@@_ =@@_C@`.$@`o@`?|@`Q@a49W@au@aS@a@@b:ff@@b{l@@b@b @c@@cz@cÕ@d/@dF @dI@@d@@e C@@eLě@e^5@e @fp@fR@fr@f I@g@gY@g@@g Ā@h^@h_33@h̀@hM@i#@iehr@iG@iz@j)@@jk|@@j@j\@k0(@kq@k+@kě@l6=p@lw @lX@@l@@m^5@x@xp@y =@@yDC@y I@yǥ@z @zJ@@z9W@zͺ^@{S@{P̀@{M@{l@@|hr@|W @|z@|@@}@}]@} @}(@~!@~c+@~ě@~=p@' @iX@@@@r@-@o@‱$@*@4 Ā@u@⁷33@9@@:5?@@{@₽G@G@@bM@⃁S@|@@@@F\@℈b@ɑh@@ +@L@ⅎ=p@Ͼv@?|@R@@↔Q@@@l@X@@⇚*@@@_@∠@5?@@#@@e/@≦ȴ@I@@)S@k\(@⊬/@vȀ@/@qh@@⋳ =@@C@6$@w@⌹?|@Q@<9W@}@⍿S@@@Bff@@⎃l@@hr@ @Hz@⏊z@˕@ @N @␐(@@@C@@Tě@⑖^5@ @p@Z@⒜r@ I@@a$@ⓢ@@ Ā@%^@g33@┨9@@M@+@mhr@╮G@bM@1@@s|@@▵@\@8b@y@◻+@ě@>=p@v@X@@@@Dr@♅@l@ $@J*@⚋@͙@@P@⛒5?@@Ӯ@@G@Vȴ@✘I@@S@\(@\@@❞vȀ@@!h@@c =@@➤C@$@'@i?|@⟪Q@9W@-@oS@⠰@@ff@@3l@@u@⡷ @@:z@{@⢽/@ @@I@@⣁@@C@@/@F^5@⤇@p@ @LC@⥎ I@ϥ@@R@@⦔9W@պ^@33@X̀@⧚M@@hr@^G@⨠z@@@#|@@e@⩦\@(@)@k+@⪬ě@=p@/ @qX@@⫲@@r@5@w@⬹$@*@< Ā@}@⭿33@9@@B5?@@⮃@G@ȴ@HbM@⯉S@|@@ @@NvȀ@Ⱀb@ёh@@+@T@ⱖ$@׾v@?|@Z@@ⲜQ@@@S@`@@Ⳣff@@@%@g @⴨@z@+@@m/@⵮ @I@@1@@s\(@ⶴ/@^5@7@yp@ⷻ =@@C@> I@@@Q@D9W@⹅^@S@̀@Jff@@⺋l@@hr@ @Pz@⻑@@ӕ@@V @⼘(@٩@C@@\ě@⽞^5@ @!X@@b@⾤r@ I@'@i$@⿪*@ Ā@-@o33@9@@5?@@3@uG@G@bM@9S@{|@@¼@@\@@b@Áh@@+@@F=p@ćv@?|@ @@LQ@@ō@l@@@R*@Ɠ@ՙ@@X@ǚ5?@@ۮ@@/@^ȴ@ȠI@@S@#\(@d/@ɦvȀ@@)h@@k =@@ʬC@$@/@q?|@˲Q@9W@5@wS@̸@@ff@@;l@@}@Ϳ @@Bz@΃@/@ @HI@@ω@@C@@ ě@N^5@Џ @p@@Tr@і I@ׅ@@Z@@Ҝ Ā@ݺ^@33@`̀@ӢM@@%hr@fG@ԨbM@@@+|@@m@ծ\@b@1@s+@ִě@=p@7v@yX@@׺@@r@=@l@$@*@D Ā@م@@9@@J5?@@ڋ@G@ȴ@PbM@ۑS@|@@@@VvȀ@ܗ@ّh@@ =@@\@ݞ$@ߥ@!?|@bQ@ޤQ@@@'S@h@@ߪff@@@-@o @ఛ@z@3@u/@ᶰ @I@@9@@{C@@/@^5@?@p@@C@F I@䇥@@ @@L9W@卺^@S@̀@RM@l@@hr@ @Xz@@@ە@@^\@(@@#+@dě@=p@ @)X@@j@@r@@/@q$@벇*@ Ā@5@w33@츴9@@5?@@;@}G@G@bM@AS@|@@@@\@Hb@h@@+@ @N=p@v@?|@@@TQ@@@l@@@Z*@@݁@@`@5?@@@@%/@fȴ@I@@@@+\(@l/@^5@@1p@s =@@C@ I@7@y@Q@9W@=^@S@̀@ff@@Cl@@hr@ @z@Jz@@@ @P(@@@C@@ě@V^5@ @X@@@\r@ I@߅@!$@b@@ Ā@^@'33@h9@@M@@-hr@nG@bM@@@3|@@u@\@b@9@{+@ě@=p@?v@X@@@@r@E@l@$@ *@K@@@@R5?@@@@G@ȴ@XI@@S@\(@@@^vȀ@@h@@ # =@@ dC@ $@ @ )?|@ jQ@ 9W@ @ /S@ p@@ ff@@ l@@ 5@ w @ @ z@ ;@ }/@ @I@@A@@C@@/@^5@G@p@@ C@N I@@@@@T Ā@^@33@̀@ZM@@hr@G@`z@@@|@@%@f\@(@@++@lě@=p@v@1X@@r@@r@@7l@y$@*@ Ā@=@@9@@5?@@C@G@ȴ@bM@IS@|@@@@vȀ@Pb@h@@+@@V$@v@?|@@@\Q@@@S@ @@bff@@@@' @h@z@@@ -/@ n @ I@@ @@!3\(@!t/@!^5@!@"9p@"{ =@@"C@" I@#?@#@#¸Q@$9W@$E^@$S@$̀@% ff@@%Kl@@%hr@% @&z@&Q@@&@&@' @'X(@'@'C@@(ě@(^^5@( @(X@@)"@)dr@) I@)@*)$@*j*@* Ā@*홙@+/33@+p9@@+5?@@+@,5G@,vG@,bM@,S@-;|@@-|@@-\@.b@.Ah@@.+@.ģ@/=p@/Gv@/?|@/@@0 Q@@0M@0l@0@@1*@1S@1@1@2@2Z5?@@2@@2/@3ȴ@3`I@@3S@3\(@4$/@4fvȀ@4@4h@@5+ =@@5lC@5$@5@61@6rQ@69W@6^@77S@7x̀@7ff@@7l@@8=hr@8 @8z@9z@9C@9@9ư @:(@:I@@:C@@:ě@;^5@;O @;p@;@<r@ ̀@>bM@>@>hr@?&G@?hbM@?@@?|@@@-@@n\@@b@@@A3+@Atě@A=p@Av@B9X@@Bz@@Br@B@C?l@C$@C‡*@D Ā@DE@D@Dȴ9@@E 5?@@EK@EG@Eȴ@FbM@FQS@F\(@F@@GvȀ@GW@Gh@@G =@@H@H^$@H@H?|@I"Q@IdQ@@I@IS@J(@@Jjff@@Jl@@J@K/ @Kp@Kz@K@L5/@Lv @LI@@L@@M;C@@M|/@M^5@M@NAp@N@NċC@O I@OG@O@Oʟ@@P 9W@PM^@PS@P̀@QM@QSl@@Qhr@Q @Rz@RY@@R@R@S\@S`(@S@S+@T$ě@Tf=p@T @TX@@U*@@Ulr@U@U@V1$@Vr*@V Ā@V@W7@Wx9@@W5?@@W@X=G@X~ȴ@XbM@YS@YC|@@Y@@YvȀ@Zb@ZIh@@Z+@Ẓ@[$@[Ov@[?|@[@@\Q@@\U@\l@\@@]*@][@]@]@^ @^b5?@@^@@^/@_& @_hI@@_@@_\(@`,/@`n^5@`@`p@a3 =@@atC@a I@a@b9@bzQ@b9W@b^@c?S@c̀@cff@@dl@@dEhr@d @dz@e z@eK@e@eΰ @f(@fQ@@fC@@fě@g^5@gW @gX@@g@hr@h^ I@h@h$@i"@@id Ā@i^@i33@j(9@@jjM@j@jhr@k.G@kpbM@kS@k|@@l4@@lv\@lb@lh@@m;+@m|@m=p@mv@nA?|@n@@nQ@@o@oGl@o@@oʇ*@p @pM@p@pЛ@q5?@@qS@@qG@qȴ@rI@@rYS@r\(@r@@svȀ@s_@sh@@s =@@t$C@tf$@t@t?|@u*Q@ul9W@u@uS@v0@@vrff@@vl@@v@w7 @wx@wz@w@x=@x~ @x(@y@@yCC@@yě@y^5@z @zIp@z@zr@{ I@{O@{@{ҟ@@| Ā@|U^@|33@|̀@}M@}[@}hr@}G@~ z@~a@@~|@@~@&\@h(@@+@,ě@n=p@〯v@X@@2@@tr@ふ@l@9$@z*@ゼ Ā@@?@ダ9@@5?@@@EG@ㄆȴ@bM@ S@K|@@ㅌ@@vȀ@b@Qh@@㆓+@ԣ@$@Wv@㇙?|@@@Q@@]@㈟S@@@"ff@@c@㉥@ @(@jz@㊫@@/@. @pI@@㋱@@\(@4/@v^5@㌷@p@:@|C@㍾ I@@A@㎂@@9W@^@GS@㏈̀@M@ l@@Mhr@㐏 @z@@@S@㑕@ְ @(@Y@㒛C@@ě@^5@_ @㓡X@@@$r@e@㔧@$@**@l Ā@㕭@33@09@@r5?@@㖳@G@6G@xbM@㗹S@|@@<@@~\@b@h@@C+@㙄@=p@v@I?|@㚊@@Q@@ @Ol@㛐@@҇*@@U@㜗@؛@5?@@[@@㝝/@ȴ@ I@@aS@㞣\(@/@&vȀ@g@㟩h@@ =@@,C@n$@㠯@@2Q@t9W@㡵^@S@8̀@zff@@㢻l@@hr@? @㣀z@z@@E@㤆 @(@ @@KC@@㥌ě@^5@ @Qp@㦒@r@ I@W@㧙@ڟ@@ Ā@]^@㨟33@9@@"M@c@㩥hr@G@(bM@i@@㪫|@@@.\@pb@㫱@+@4ě@v=p@㬷v@?|@:@@|Q@@㭽@l@@@@㮂*@@@G@㯈@5?@@ @@MG@㰎ȴ@I@@S@S\(@㱔@@vȀ@@Yh@@㲛 =@@ܣ@$@_@㳡?|@Q@$Q@@e@㴧S@@@*ff@@kl@@㵭@ @0@rz@㶳@/@6 @xI@@㷹@@C@@ȴ@ÀbM@S@|@@D@@ĆvȀ@b@ h@@K+@Ō@$@v@Q?|@ƒ@@Q@@@Wl@ǘ@@ڇ*@@]@ȟ@@"5?@@c@@ɥ/@ @(I@@i@@ʫ\(@/@.^5@o@˱p@ =@@4C@v I@̷@@:Q@|9W@ͽ^@S@@̀@΂M@l@@hr@G @ψz@@@ @M@Ў @(@@SC@@єě@^5@ @YX@@Қ@r@ I@_@ӡ$@⟾@@$ Ā@e^@ԧ33@9@@*M@k@խhr@G@0bM@qS@ֳ|@@@@6\@xb@׹h@@+@<@~=p@ؿv@?|@B@@لQ@@@l@H@@ڊ*@@ @O@ې@5?@@@@UG@ܖȴ@I@@S@[\(@ݜ@@vȀ@@ah@@ޣ =@@C@&$@g@ߩ?|@Q@,9W@m@S@@@2ff@@sl@@ᵁ@ @8z@zz@⻕@@> @(@@@C@@Dě@^5@ @ p@J@r@ I@@Q@撟@@ Ā@^@W33@̀@M@@]hr@G@z@!@@c|@@@\@((@i@+@ě@.=p@ov@X@@@@4r@u@l@$@:*@| Ā@@@@9@@5?@@@G@Fȴ@bM@S@ |@@L@@vȀ@b@h@@S+@@$@v@Y?|@Q@Q@@@_S@@@ff@@#@e@ @蛥@*z@k@@/@ @0I@@q@@C@@/@6^5@w@p@@vȀ@b@h@@+@D@$@Ǿv@ ?|@J@@Q@@@l@P@@*@@@W@@5?@@@@]/@ȴ@I@@ !S@ c\(@ /@ vȀ@ '@ ih@@ =@@ C@ . I@ o@ @ Q@ 49W@ u^@ S@ ̀@ :ff@@ {l@@ hr@  @@z@z@Õ@@F @(@@@ C@@Lě@^5@ @p@R@r@ I@@Y@@@ Ā@^@_33@9@@M@#@ehr@G@bM@)@@k|@@@\@0b@q@+@ě@6=p@wv@?|@@@^5@#@#p@$@$Dr@$ I@$Dž@% @%J@@% Ā@%ͺ^@&33@&P̀@&M@&@'hr@'VG@'z@'@@(|@@(]@(\@((@)!@)c+@)ě@)=p@*' @*iX@@*@@*r@+-@+o@+$@+*@,4 Ā@,u@,@,9@@-:5?@@-{@-G@-ȴ@.@bM@.S@.|@@/@@/FvȀ@/b@/ɑh@@0 +@0L@0$@0Ͼv@1?|@1R@@1Q@@1@2l@2X@@2*@2@3@3_@3@35?@@4#@@4e/@4 @4I@@5)@@5k\(@5/@5^5@6/@6qp@6 =@@6C@76 I@7w@7@7Q@8<9W@8}^@8S@9̀@9BM@9l@@9hr@: @:Hz@:@@:˕@; @;N @;(@;ѩ@<C@@@>a$@>@@> Ā@?%^@?g33@?9@@?M@@+@@mG@@G@@bM@A1S@As|@@A@@A\@B8b@Byh@@B+@B@C>=p@Cv@C?|@D@@DDQ@@D@Dl@E@@EJ*@E@É@F@FP@F5?@@FӮ@@G/@GVȴ@GI@@GS@H\(@H\/@HvȀ@H@I!h@@Ic =@@IC@I$@J'@Ji?|@JQ@J9W@K-@KoS@K@@Kff@@L3l@@Lu@L @Lz@M:z@M{@M@M @N@(@N@@NC@@Oě@OF^5@O @Op@P @PLr@P I@Pυ@Q@QR@@Q Ā@Qպ^@R33@RX̀@RM@R@Shr@S^G@Sz@S@@T#|@@Te@T\@Tb@U)@Uk+@Uě@U=p@V/v@VqX@@V@@Vr@W5@Wwl@W$@W*@X< Ā@X}@X@Y@YB5?@@Y@@YG@Zȴ@ZHI@@ZS@Z\(@[ @@[NvȀ@[@[ёh@@\ =@@\T@\$@\ץ@]?|@]ZQ@]Q@@]@^S@^`@@^ff@@^@_%@_g @_@_z@`+@@`m/@` @`I@@a1@@asC@@a/@a^5@b7@byp@b@bC@c> I@c@c@d@@dD9W@d^@dS@è@eJM@e@ehr@fG@fPz@f@@f|@@g@gV\@g(@g٩@h+@h\ě@h=p@h @i!X@@ib@@ir@i@j'@ji$@j*@j Ā@k-@ko33@k9@@k5?@@l3@luG@lG@lbM@m9S@m{|@@m@@mvȀ@n@b@nh@@n+@o@oF$@ov@o?|@p @@pLQ@@p@pl@q@@qR*@q@qՁ@r@rX@r5?@@rۮ@@s/@s^ȴ@sI@@sS@t#\(@td/@tvȀ@t@u)h@@uk =@@uC@u I@v/@vq@vQ@v9W@w5^@wwS@ẁ@wff@@x;l@@x}hr@x @yz@yBz@y@y@z @zH(@z@zC@@{ ě@{N^5@{ @{X@@|@|Tr@| I@|ׅ@}$@}Z@@} Ā@}ݺ^@~33@~`9@@~M@~@%hr@fG@bM@@@+|@@m@䀮\@b@1@s+@䁴ě@=p@7v@y?|@䂺@@Q@@=@l@@@*@C@䄅@@@J5?@@䅋@@G@ȴ@PI@@䆑S@\(@@@VvȀ@䇗@ّh@@ =@@\@䈞$@ߥ@!?|@bQ@䉤Q@@@'S@h@@䊪ff@@l@@-@o @䋰@z@3@u/@䌶 @I@@9@@{C@@䍼/@^5@? @䎁p@@r@F I@䏇@@ @@L Ā@䐍^@33@̀@RM@䑓@hr@G@Xz@䒙@@|@@@^\@䓠(@@#+@dě@䔦=p@ @)X@@j@@䕬r@@/@q$@䖲*@ Ā@5@w@䗸9@@5?@@;@}G@䘾ȴ@bM@AS@䙃|@@@@vȀ@Hb@䚉h@@ =@@ @N$@䛏@?|@Q@TQ@@䜕@S@@@Zff@@䝛@݁@ @`@䞢z@@@%/@f @䟨I@@@@+\(@l/@䠮^5@@1p@s =@@䡴C@ I@7@y@䢺@@9W@=^@S@̀@M@Cl@@䤅hr@ @z@I@@䥋@@ @P(@䦑@C@@ě@V^5@䧗 @X@@@\r@䨞 I@߅@!$@b@@䩤 Ā@^@'33@h9@@䪪M@@-G@nG@䫰bM@S@3|@@t@@䬶\@b@9h@@{+@䭼@=p@?v@䮁?|@@@Q@@E@䯇l@@@ *@K@䰍@@@R5?@@䱓@@/@ȴ@XI@@䲙S@\(@/@^vȀ@䳟@h@@# =@@dC@䴦$@@)?|@jQ@䵬9W@@/S@p@@䶲ff@@l@@5hr@w @䷸z@z@;@}@举 @(@A@@乃C@@ě@^5@G @争p@@ r@N I@仏@@@@T Ā@伕^@33@̀@ZM@佛@hr@G@`z@価@@|@@%@f\@俨b@@++@lě@=p@v@1X@@r@@r@@7l@y$@º*@ Ā@=@@@5?@@C@@ąG@ȴ@I@@IS@ŋ\(@@@vȀ@O@Ƒh@@ =@@@V$@Ǘ@?|@Q@\Q@@ȝ@S@ @@bff@@ɣ@@' @h@ʪz@@@-/@n @˰I@@@@3C@@t/@̶^5@@9p@z@ͼC@ I@?@΁@Ÿ@@9W@E^@χS@̀@ M@K@Ѝhr@G@z@Q@@ѓ|@@@\@X(@ҙ@+@ě@^=p@ӟ @X@@"@@dr@ԥ@@)$@j*@լ Ā@홙@/33@p9@@ֲ5?@@@5G@vG@׸bM@S@;|@@|@@ؾvȀ@b@Ah@@ك+@ģ@$@Gv@ډ?|@@@ Q@@M@ۏl@@@*@S@ܕ@@@Z5?@@ݛ@@/@ȴ@`I@@ޡS@\(@$/@fvȀ@ߧ@h@@+ =@@lC@ I@@1@rQ@9W@^@7S@x̀@ff@@l@@=hr@ @z@z@C@@ư @(@I@C@@ě@^5@O @X@@@r@V I@病@$@@@\ Ā@蝺^@33@ 9@@bM@@hr@&G@hbM@@@|@@-@n\@b@@3+@t@=p@v@9?|@z@@Q@@@?l@@@‡*@@E@@ț@ 5?@@K@@/@ȴ@I@@QS@\(@/@vȀ@W@h@@ =@@C@^$@@?|@"Q@d9W@@S@(@@jff@@l@@@/ @p@z@@5/@v @I@@@@;C@@|/@^5@ @Ap@@r@ I@G@@ʟ@@ Ā@M^@33@̀@M@S@hr@G@z@Y@@|@@@\@`(@@+@$ě@f=p@ @X@@*@@lr@@l@1$@r*@ Ā@@7@x9@@5?@@@=G@~ȴ@bM@S@C|@@@@vȀ@@Ih@@ =@@̣@$@O@?|@ҸQ@Q@@U@S@@@ff@@[@@ @ @ bz@ @@ /@ & @ hI@@ @@ \(@ ,/@ n^5@ @ p@ 3 =@@ tC@ I@ @ 9@ z@@ 9W@ ^@?S@̀@M@l@@Ehr@ @z@ @@K@@ΰ @(@Q@C@@ě@^5@W @X@@@r@^ I@@$@"@@d Ā@^@33@(9@@j5?@@@G@.G@pbM@S@|@@4@@v\@b@h@@;+@|@=p@v@A?|@@@ Ā@^@G33@̀@M@ @Mhr@G@z@@@S|@@@֏\@(@Y@+@ě@=p@_v@X@@@@$r@e@l@$@ **@ l Ā@ @ @!09@@!r5?@@!@!G@"6ȴ@"xbM@"S@"|@@#<@@#~vȀ@#b@$h@@$C+@$@$$@%v@%I?|@%@@%Q@@& @&OS@&@@&ff@@'@'U@' @'؛@(z@([@@(/@(ް @) I@@)a@@)\(@)/@*&^5@*g@*p@* =@@+,C@+n I@+@+@,2Q@,t9W@,^@,S@-8̀@-zff@@-l@@-hr@.? @.z@.@@/@/E@/ @/(@0 @0KC@@0ě@0^5@1 @1QX@@1@1r@2@2W@2$@2ڇ*@3 Ā@3]@333@39@@4"5?@@4c@4G@4G@5(bM@5iS@5|@@5@@6.\@6pb@6h@@6+@74@7v=p@7v@7?|@8:@@8|Q@@8@8l@9@@@9*@9@:@:G@:@:5?@@; @@;M/@;ȴ@;I@@<S@$@>_@>@>Q@?$9W@?e^@?S@?̀@@*ff@@@kl@@@hr@@ @A0z@Arz@A@A@B6 @Bx(@B@@BC@@C<ě@C~^5@C @Dp@DB@Dr@D I@E@EI@E@@E Ā@F ^@FO33@F9@@FM@G@GUhr@GG@GbM@H@@H[|@@H@Hޏ\@I b@Ia@I+@Iě@J&=p@Jgv@JX@@J@@K,r@Km@Kl@K$@L2*@Lt Ā@L@L@M89@@Mz5?@@M@MG@N>ȴ@NbM@NS@O\(@OD@@OvȀ@O@P h@@PK =@@P@P$@Q@QQ?|@QQ@QQ@@R@RWS@R@@Rff@@Sl@@S]@S @S@T"z@Tc@T/@T @U(I@@Ui@@UC@@U/@V.^5@Vo@Vp@V@W4C@Wv I@W@W@X:@@X|9W@X^@XS@Y@̀@YM@Yl@@Zhr@ZG @Zz@Z@@[ |@@[M@[\@[(@\@\S+@\ě@\=p@] @]YX@@]@@]r@^@^_@^$@^*@_$ Ā@_e@_@_9@@`*5?@@`k@`G@`ȴ@a0bM@aqS@a|@@a@@b6vȀ@bxb@bh@@b+@c<@c~$@cv@d?|@dB@@dQ@@d@el@eH@@e*@e@f @fO@f@f5?@@g@@gU/@g @gI@@h@@h[\(@h/@h^5@i@iap@i =@@iC@j& I@jg@j@jQ@k,9W@km^@kS@k̀@l2ff@@lsl@@lhr@l @m8z@mzz@m@m@n> @n(@n@@oC@@oDě@o^5@o @p X@@pJ@pr@p I@q@qQ$@q@@q Ā@r^@rW33@r9@@rM@s@s]hr@sG@sbM@t!S@tc|@@t@@t\@u(b@uih@@u+@u@v.=p@vov@v?|@v@@w4Q@@wu@wl@w@@x:*@x{@x@x@y@@y5?@@yî@@zG@zFȴ@zI@@zS@{ \(@{L@@{vȀ@{@|h@@|S =@@|C@|$@}@}Y?|@}Q@}9W@~@~_S@~@@~ff@@#l@@e@ @蛥@*z@k@倭/@ @0I@@q@@偳C@@/@6^5@w@傹p@@vȀ@厀b@h@@+@D@叆$@Ǿv@ ?|@JQ@同Q@@@S@P@@呒ff@@@@W @咘@z@@@]/@哞 @I@@!@@cC@@唤/@^5@'@ip@啪@C@. I@o@喱@@@49W@u^@嗷S@̀@:M@{l@@嘽hr@ @@z@噁@@Õ@@F @嚈(@ɩ@ C@@Lě@囎^5@ @X@@R@圔r@@@Y$@坚*@ Ā@@_33@垠9@@5?@@#@eG@埦G@bM@)S@k|@@堬@@\@0b@qh@@塳+@@6=p@wv@墹?|@@@^5@ @p@@Dr@密 I@Dž@ @J@@尌 Ā@ͺ^@33@P9@@屒M@@hr@VG@岘bM@@@|@@]@峞\@b@!@c+@崤ě@=p@'v@iX@@嵪@@r@-@ol@嶱$@*@4 Ā@u@巷@9@@:5?@@{@帽G@ȴ@@I@@幁S@\(@@@FvȀ@庇@ɑh@@ =@@L@廎$@ϥ@?|@RQ@弔Q@@@S@X@@彚ff@@l@@@_ @徠@z@#@e/@忦 @I@@)@@kC@@/@^5@/@qp@@C@6 I@w@¹@@@<9W@}^@ÿS@̀@BM@ăl@@hr@ @Hz@ʼn@@|@@ @N\@Ɛ(@ѩ@+@Tě@ǖ=p@ @X@@Z@@Ȝr@@@a$@ɢ*@ Ā@%@g@ʨ9@@5?@@+@mG@ˮȴ@bM@1S@s|@@̴@@vȀ@8b@yh@@ͻ+@@>$@v@?|@@@DQ@@υ@l@@@J*@Ћ@́@@P@ђ5?@@Ӯ@@/@V @ҘI@@@@\(@\/@Ӟ^5@@!p@c =@@ԤC@ I@'@i@ժQ@9W@-^@oS@ְ̀@ff@@3l@@uhr@׷ @z@:z@{@ؽ@ @@(@ف@@C@@ě@F^5@ڇ @X@@ @Lr@ێ I@υ@$@R@@ܔ Ā@պ^@33@X9@@ݚM@@G@^G@ޠbM@S@#|@@d@@ߦ\@b@)h@@k+@ଣ@=p@/v@q?|@@@Q@@5@wl@@@*@;@}@@@B5?@@䃮@@G@ȴ@HI@@S@\(@ @@NvȀ@@ёh@@ =@@TC@$@ץ@?|@ZQ@9W@@S@`@@ff@@l@@%@g @ꨛ@z@+@m/@뮰 @I@@1@@sC@@/@^5@7@yp@@C@> I@@@@@D Ā@^@33@̀@JM@@hr@G@Pz@@@|@@@V\@b@٩@+@\ě@=p@߾v@!X@@b@@r@@'l@i$@*@ Ā@-@o@9@@5?@@3@uG@ȴ@bM@9S@{|@@@@vȀ@@b@h@@+@@F$@v@?|@ Q@LQ@@@S@@@Rff@@@Ձ@ @X@z@ۮ@@/@^ @I@@@@#C@@d/@^5@@)p@j@C@ I@/@q@@@9W@5^@wS@̀@M@;l@@}hr@ @z@A@@@@ @H(@@C@@ ě@N^5@ @X@@@@Tr@@ׅ@$@Z*@ Ā@ݙ@ 33@ `9@@ 5?@@ @ %G@ fG@ bM@ S@ +|@@ l@@ \@ b@ 1h@@ s+@ @ =p@ 7v@ y?|@ @@ Q@@=@l@@@*@C@@@@J5?@@@@/@ȴ@PI@@S@\(@/@VvȀ@@ّh@@ =@@\C@ I@ߥ@!@bQ@9W@^@'S@h̀@ff@@l@@-hr@o @z@z@3@u@ @(@9@@{C@@ě@^5@? @p@@r@F I@@@ @@L Ā@^@33@9@@RM@@hr@G@XbM@@@|@@@^\@b@@#+@dě@=p@v@ )X@@ j@@ r@ @!/l@!q$@!*@! Ā@"5@"w@"9@@"5?@@#;@#}G@#ȴ@$I@@$AS@$\(@$@@%vȀ@%G@%h@@% =@@& @&N$@&@&?|@'Q@'TQ@@'@'S@(@@(Zff@@(l@@(݁@) @)`@)z@)㕀@*%/@*f @*I@@*@@++C@@+l/@+^5@+@,1p@,r@,C@, I@-7@-y@-@@-9W@.=^@.S@.̀@/M@/Cl@@/hr@/ @0z@0I@@0|@@0@1\@1P(@1@1+@2ě@2V=p@2 @2X@@3@@3\r@3@3߅@4!$@4b*@4 Ā@4噙@5'@5h9@@55?@@5@6-G@6nȴ@6bM@6S@73|@@7t@@7vȀ@7b@89h@@8{+@8@8$@9?v@9?|@9@@:Q@@:E@:l@:@@; *@;K@;@;@<@/@>^^5@>@>p@?# =@@?dC@? I@?@@)@@jQ@@9W@@^@A/S@Ap̀@Aff@@Al@@B5hr@Bw @Bz@Bz@C;@C}@C @D(@DA@@DC@@Dě@E^5@EG @EX@@E@F r@FN I@F@F$@G@@GT Ā@G^@G33@H9@@HZM@H@HG@IG@I`bM@IS@I|@@J$@@Jf\@Jb@Jh@@K++@Kl@K=p@Kv@L1?|@Lr@@LQ@@L@M7l@Mx@@M*@M@N=@N@N@O5?@@OC@@OG@Oȴ@PI@@PIS@P\(@P/@QvȀ@QO@Qh@@Q =@@RC@RV$@R@R?|@SQ@S\9W@S@SS@T @@Tbff@@Tl@@T@U' @Uh@Uz@U땀@V-/@Vn @VI@@V@@W3C@@Wt/@W^5@W@X9p@Xz@XC@X I@Y?@Y@YŸ@@Z Ā@ZE^@Z33@Z̀@[ M@[K@[hr@[G@\z@\Q@@\|@@\@]\@]Xb@]@]+@^ě@^^=p@^v@^X@@_"@@_dr@_@_l@`)$@`j*@` Ā@`홙@a/@ap9@@a5?@@a@b5G@bvȴ@bbM@bS@c;|@@c|@@cvȀ@db@dAh@@d+@dģ@e$@eG@e?|@eʸQ@f Q@@fM@fS@f@@gff@@gS@g@g @h@hZz@h@@h/@i @i`I@@i@@i\(@j$/@jf^5@j@jp@k+ =@@klC@k I@k@l1@lrQ@l9W@l^@m7S@mx̀@mM@ml@@n=hr@n @nz@o@@oC@o@oư @p(@pI@pC@@pě@q^5@qO @qX@@q@@rr@rU@r@r$@s*@s\ Ā@s@s33@t 9@@tb5?@@t@tG@u&G@uhbM@uS@u|@@v,@@vn\@vb@vh@@w3+@wt@w=p@wv@x9?|@xz@@xQ@@x@y?l@y@@y‡*@z@zE@z@zț@{ 5?@@{K@@{/@{ȴ@|I@@|QS@|\(@|/@}vȀ@}W@}h@@} =@@~C@~^ I@~@~@"Q@d9W@^@S@(̀@jff@@怫l@@hr@/ @pz@恲z@@5@v @悸(@@@;C@@|ě@惾^5@ @Ap@愂@r@ I@G@慉@ʟ@@ Ā@M^@憏33@д9@@M@S@懕hr@G@bM@Y@@戛|@@@\@`b@扡@+@$ě@f=p@抧v@X@@*@@lr@拭@l@1$@r*@挴 Ā@@7@x9@@捺5?@@@=G@~ȴ@I@@S@C\(@揄@@vȀ@@Ih@@搋 =@@̣@$@O@摑?|@ҸQ@Q@@U@撗S@@@ff@@[l@@擝@ @ @bz@攣@/@& @hI@@敩@@C@@,/@n^5@斯@p@2@tC@时 I@@9@z@@昼9W@^@?S@晀̀@M@l@@Ehr@暆G@z@ @@K|@@曍@Ώ\@(@Q@朓+@ě@=p@W @杙X@@@@r@]@枟@$@"*@d Ā@查@33@(9@@j5?@@栫@G@.G@pbM@桱S@|@@4@@v\@梸b@h@@;+@|@棾$@v@A?|@椂@@Q@@@Gl@楈@@ʇ*@ @M@榏@Л@z@S@@槕/@ְ @I@@Y@@樛\(@/@^5@_@橡p@ =@@$C@f I@檧@@*Q@l9W@櫭^@S@0̀@rff@@欳l@@hr@7 @xz@歺z@@=@~ @(@@CC@@毄ě@^5@ @IX@@氊@r@ I@O@汑$@ҟ@@ Ā@U^@沗33@ش9@@5?@@[@泝G@G@ bM@aS@洣|@@@@&\@hb@浩h@@+@,@n=p@涯v@?|@2@@tQ@@淵@l@8@@z*@渻@@?@湀@5?@@@@EG@溆ȴ@I@@ S@K\(@滌/@vȀ@@Qh@@漓 =@@ԋC@$@W@潙?|@ڸQ@9W@]@澟S@@@"ff@@cl@@濥@ @(@jz@@/@. @pI@@@@C@@4/@v^5@·@p@:@|r@þ I@@A@Ă@@ Ā@^@G33@ň̀@M@ @Mhr@ƎG@z@@@S|@@Ǖ@֏\@b@Y@ț+@ě@=p@_v@ɡX@@@@$r@e@ʧl@$@**@l Ā@˭@@09@@r5?@@̳@G@6ȴ@xbM@͹S@|@@<@@~vȀ@b@h@@C+@τ@$@@I?|@ЊQ@Q@@ @OS@ѐ@@ff@@@U@җ @؛@z@[@@ӝ/@ް @ I@@a@@ԣ\(@/@&^5@g@թp@ =@@,C@n I@֯@@2Q@t9W@׵^@S@8̀@zM@ػl@@hr@? @ـz@@@@E@چ @(@ @KC@@یě@^5@ @QX@@ܒ@@r@@W@ݙ$@ڇ*@ Ā@]@ޟ33@9@@"5?@@c@ߥG@G@(bM@iS@|@@@@.\@pb@᱑h@@+@4@v=p@ⷾv@?|@:@@|Q@@@l@@@@䂇*@@@G@创@5?@@ @@M/@ȴ@I@@S@S\(@/@vȀ@@Yp@ =@@܋C@ I@_@@Q@$9W@e^@S@̀@*ff@@kl@@hr@ @0z@rz@쳕@@6 @x(@@@C@@<ě@~^5@ @p@B@r@ I@@I@@@ Ā@ ^@O33@9@@M@@Uhr@G@bM@@@[|@@@ޏ\@ b@a@+@ě@&=p@gv@X@@@@,r@m@l@$@2*@t Ā@@@89@@z5?@@@@G@>ȴ@I@@S@\(@D@@vȀ@@ h@@K =@@@$@@Q?|@Q@9W@@WS@@@ff@@l@@]@ @@"z@c@/@ @(I@@i@@C@@/@.^5@o@p@@4C@v I@@@:@@|9W@^@S@@̀@M@l@@hr@FG@z@@@ |@@M@\@(@@S+@ě@=p@ @YX@@@@r@ @ _@ $@ *@ $ Ā@ e@ 33@ 9@@ *5?@@ k@ G@ G@ 0bM@ qS@ |@@ @@ 6vȀ@ xb@ h@@ +@<@~$@v@?|@B@@Q@@@l@H@@*@@ @O @@z@@@U/@ @I@@@@[\(@/@^5@@ap@ =@@C@& I@g@@Q@,9W@m^@S@̀@2ff@@sl@@hr@ @8z@zz@@@> @(@@C@@Dě@^5@ @ X@@J@r@ I@@Q$@@@ Ā@^@W33@9@@M@@]hr@G@bM@!@@c|@@@\@ (b@ i@ +@ ě@!.=p@!ov@!?|@!@@"4Q@@"u@"l@"@@#:*@#{@#@#@$@@$5?@@$î@@%G@%Fȴ@%I@@%S@& \(@&L/@&vȀ@&@'h@@'S =@@'C@'$@(@(Y?|@(Q@(9W@)@)_S@)@@)ff@@*#l@@*e@* @*蛥@+*z@+k@+/@+ @,0I@@,q@@,C@@,/@-6^5@-w@-p@-@.vȀ@9b@9h@@:+@:D@:$@:ǥ@; ?|@;JQ@;Q@@;@<S@@@>]/@> @>I@@?!@@?c\(@?/@?^5@@'@@ip@@ =@@@C@A. I@Ao@A@AQ@B49W@Bu^@BS@B̀@C:M@C{l@@Chr@C @D@z@D@@DÕ@E@EF @E(@Eɩ@F C@@FLě@F=p@F @GX@@GR@@Gr@G@H@HY$@H*@H Ā@I@I_33@I9@@I5?@@J#@JeG@JG@JbM@K)S@Kk|@@K@@K\@L0b@Lqh@@L+@L@M6=p@Mwv@M?|@M@@N^5@Y @Yp@Z@ZDr@Z I@ZDž@[ $@[J@@[ Ā@[ͺ^@\33@\P9@@\M@\@]hr@]VG@]bM@]@@^|@@^]@^\@^b@_!@_c+@_ě@_=p@`'v@`iX@@`@@`r@a-@aol@a$@a*@b4 Ā@bu@b@b9@@c:5?@@c{@@cG@cȴ@d@I@@dS@d\(@e@@eFvȀ@e@eɑh@@f =@@fL@f$@fϥ@g?|@gRQ@gQ@@g@hS@hX@@hff@@h@i@i_ @i@iz@j#@@je/@j @jI@@k)@@kkC@@k/@k^5@l/@lqp@l@lC@m6 I@mw@m@m@@n<9W@n}^@nS@ò@oBM@o@ohr@pG@pHz@p@@p|@@q @qN\@q(@qѩ@r+@rTě@r=p@r @sX@@sZ@@sr@s@t@ta$@t*@t Ā@u%@ug33@u9@@u5?@@v+@vmG@vG@vbM@w1S@ws|@@w@@wvȀ@x8b@xyh@@x+@x@y>$@yv@y?|@z@@zDQ@@z@zl@{@@{J*@{@{́@| @|P@|z@|Ӯ@@}/@}V @}I@@}@@~\(@~\/@~^5@~@!p@c =@@C@ I@'@i@瀪Q@9W@-^@oS@灰̀@ff@@3l@@uhr@炷 @z@:z@{@烽@ @@(@焁@C@@ě@F^5@煇 @X@@ @Lr@熎 I@υ@$@R@@燔 Ā@պ^@33@X9@@爚M@@hr@^G@牠bM@@@#|@@e@犦\@b@)@k+@独ě@=p@/v@q?|@猲@@Q@@5@wl@獸@@*@;@}@玿@@B5?@@珃@@G@ȴ@HI@@琉S@\(@ /@NvȀ@瑏@ёh@@ =@@TC@璖$@ץ@?|@ZQ@瓜9W@@S@`@@產ff@@l@@%@g @畨@z@+@m/@疮 @I@@1@@sC@@痴/@^5@7@yp@瘺@r@> I@@@@@D Ā@皅^@33@̀@JM@盋@hr@G@Pz@眑@@|@@@V\@睘(@٩@+@\ě@瞞=p@ @!X@@b@@矤r@@'@i$@砪*@ Ā@-@o@硰9@@5?@@3@uG@碶ȴ@bM@9S@{|@@磼@@vȀ@@b@礁h@@ =@@@F$@祇@?|@ Q@LQ@@禍@S@@@Rff@@秓@Ձ@ @X@稚z@ۮ@@/@^ @穠I@@@@#\(@d/@窦^5@@)p@k =@@竬C@ I@/@q@笲Q@9W@5^@wS@筸̀@M@;l@@}hr@箿 @z@A@@篃@@ @H(@簉@C@@ ě@N^5@籏 @X@@@Tr@粖 I@ׅ@$@Z@@糜 Ā@ݺ^@33@`9@@索M@@%G@fG@絨bM@S@+|@@l@@綮\@b@1h@@s+@練@=p@7v@y?|@縺@@Q@@=@l@@@*@C@纅@@@J5?@@绋@@/@ȴ@PI@@缑S@\(@/@VvȀ@罗@ّh@@ =@@\C@羞$@ߥ@!?|@bQ@翤9W@@'S@h@@ff@@l@@-@o @z@z@3@u@¶ @(@9@@{C@@üě@^5@? @āp@@r@F I@Ň@@ @@L Ā@ƍ^@33@̀@RM@Ǔ@hr@G@Xz@ș@@|@@@^\@ɠb@@#+@dě@ʦ=p@v@)X@@j@@ˬr@@/l@q$@̲*@ Ā@5@w@͸@5?@@;@@}G@ξȴ@I@@AS@σ\(@@@vȀ@G@Љh@@ =@@ @N$@я@?|@Q@TQ@@ҕ@S@@@Zff@@ӛ@݁@ @`@Ԣz@@@%/@f @ըI@@@@+C@@l/@֮^5@@1p@r@״C@ I@7@y@غ@@9W@=^@S@̀@M@C@څhr@G@z@I@@ۋ|@@@\@P(@ܑ@+@ě@V=p@ݗ @X@@@@\r@ޝ@߅@!$@b*@ߤ Ā@噙@'33@h9@@5?@@@-G@nG@bM@S@3|@@t@@vȀ@b@9h@@{+@㼣@$@?v@?|@@@Q@@E@l@@@ *@K@捁@@@R5?@@瓮@@/@ȴ@XI@@S@\(@/@^vȀ@@h@@# =@@dC@ I@@)@jQ@9W@^@/S@p̀@ff@@l@@5hr@w @z@z@;@}@ @(@A@C@@ě@^5@G @X@@@ r@N I@@$@@@T Ā@^@33@9@@ZM@@hr@G@`bM@@@|@@%@f\@b@@++@lě@=p@v@1?|@r@@Q@@@7l@x@@*@@=@@@5?@@C@@G@ȴ@I@@IS@\(@@@vȀ@O@h@@ =@@@V$@@?|@Q@\Q@@@S@ @@bff@@l@@@' @h@z@땀@-/@n @I@@@@3C@@t/@^5@ @9p@z@r@ I@?@@Ÿ@@ Ā@E^@33@̀@ M@K@hr@G@z@Q@@|@@@\@X(@@+@ ě@ ^=p@ @ X@@ "@@ dr@ @ @ )$@ j*@ Ā@ 홙@ /@ p9@@ 5?@@ @ 5G@ vȴ@ bM@ S@;|@@|@@vȀ@b@Ah@@+@ģ@$@Gv@?|@@@ Q@@M@l@@@*@S@@@@Zz@@@/@ @`I@@@@\(@$/@f^5@@p@+ =@@lC@ I@@1@r@@9W@^@7S@x̀@M@l@@=hr@ @z@@@C@@ư @(@I@C@@ě@^5@O @X@@@r@V I@@$@@@\ Ā@^@33@ 9@@bM@@G@ &G@ hbM@ S@ |@@!,@@!n\@!b@!h@@"3+@"t@"=p@"v@#9?|@#z@@#Q@@#@$?l@$@@$‡*@%@%E@%@%ț@& 5?@@&K@@&/@&ȴ@'I@@'QS@'\(@'/@(vȀ@(W@(h@@( =@@)C@)^$@)@)?|@*"Q@*d9W@*@*S@+(@@+jff@@+l@@+hr@,/ @,pz@,z@,@-5@-v @-(@-@@.;C@@.|ě@.^5@. @/Ap@/@/r@0 I@0G@0@0ʟ@@1 Ā@1M^@133@1̀@2M@2S@2hr@2G@3z@3Y@@3|@@3@4\@4`b@4@4+@5$ě@5f=p@5v@5X@@6*@@6lr@6@6l@71$@7r*@7 Ā@7@87@8x@85?@@8@@9=G@9~ȴ@9I@@:S@:C\(@:@@:vȀ@;@;Ih@@; =@@;̣@<$@ff@@>[@>@> @? @?bz@?@@?/@@& @@hI@@@@@@C@@A,/@An^5@A@Ap@B2@BtC@B I@B@C9@Cz@@C9W@C^@D?S@D̀@DM@El@@EEhr@E @Ez@F @@FK@F@Fΰ @G(@GQ@GC@@Gě@H^5@HW @HX@@H@@Ir@I]@I@I$@J"*@Jd Ā@J@J33@K(9@@Kj5?@@K@KG@L.G@LpbM@LS@L|@@M4@@MvvȀ@Mb@Mh@@N;+@N|@N$@Nv@OA?|@O@@OQ@@P@PGl@P@@Pʇ*@Q @QM@Q@QЛ@R5?@@RS@@R/@Rȴ@SI@@SYS@S\(@S/@TvȀ@T_@Th@@T =@@U$C@Uf I@U@U@V*Q@Vl9W@V^@VS@W0̀@Wrff@@Wl@@Whr@X7 @Xxz@Xz@X@Y=@Y~ @Y(@Z@@ZCC@@Zě@Z^5@[ @[Ip@[@[r@\ I@\O@\@\ҟ@@] Ā@]U^@]33@]ش9@@^M@^[@^hr@^G@_ bM@_a@@_|@@_@`&\@`hb@`@`+@a,@an=p@av@a?|@b2@@btQ@@b@bl@c8@@cz*@c@c@d?@d@d5?@@e@@eEG@eȴ@eI@@f S@fK\(@f@@fvȀ@g@gQh@@g =@@gԣ@h$@hW@h?|@hڸQ@iQ@@i]@iS@i@@j"ff@@jcl@@j@j @k(@kjz@k@k/@l. @lpI@@l@@lC@@m4/@mv^5@m@mp@n:@n|C@n I@n@oA@o@@o9W@p^@pGS@p̀@pM@q l@@qMhr@qG@qz@r@@rS|@@r@r֏\@s(@sY@s+@sě@t=p@t_ @tX@@t@@u$r@ue@ul@u$@v**@vl Ā@v@v@w09@@wr5?@@w@wG@x6ȴ@yb@zh@@zC+@z@z$@{v@{I?|@{@@{Q@@| @|Ol@|@@|҇*@}@}U@}@}؛@~z@~[@@~/@~ް @ I@@a@@\(@/@&^5@g@耩p@ =@@,C@n I@聯@@2Q@t9W@肵^@S@8̀@zff@@胻l@@hr@? @脀z@z@@E@腆 @(@ @KC@@膌ě@^5@ @QX@@臒@r@ I@W@舙$@ڟ@@ Ā@]^@艟33@9@@"5?@@c@芥G@G@(bM@iS@苫|@@@@.\@pb@茱h@@+@4@v=p@荷v@?|@:@@|Q@@莽@l@@@@菂*@@@G@萈@5?@@ @@MG@葎ȴ@I@@S@S\(@蒔/@vȀ@@Yh@@蓛 =@@܋C@$@_@蔡?|@Q@$9W@e@蕧S@@@*ff@@kl@@薭@ @0@rz@藳@/@6 @xI@@蘹@@C@@ȴ@褀bM@S@|@@D@@襆vȀ@b@ h@@K+@覌@$@@Q?|@角Q@Q@@@WS@記@@ff@@@]@詟 @@"z@c@@誥/@ @(I@@i@@諫C@@/@.^5@o@謱p@@4C@v I@護@@:@@|9W@讽^@S@@̀@诂M@l@@hr@G @谈z@@@ @M@豎 @(@@SC@@貔ě@^5@ @YX@@賚@@r@@_@贡$@*@$ Ā@e@赧33@9@@*5?@@k@趭G@G@0bM@qS@跳|@@@@6\@xb@踹h@@+@<@~=p@蹿v@?|@B@@躄Q@@@l@H@@車*@@ @O@輐@5?@@@@U/@轖ȴ@I@@S@[\(@辜/@vȀ@@ah@@迣 =@@C@&$@g@?|@Q@,9W@m@S@@@2ff@@sl@@µ@ @8@zz@û@@> @Ā(@@@C@@Dě@ņ^5@ @ p@J@ƌr@ I@@Q@ǒ@@ Ā@^@W33@Ș9@@M@@]hr@ɞG@bM@!@@c|@@ʥ@\@(b@i@˫+@ě@.=p@ov@̱X@@@@4r@u@ͷl@$@:*@| Ā@ν@@@9@@ς5?@@î@@G@Fȴ@ЈI@@S@ \(@L@@юvȀ@@h@@S =@@Ҕ@$@@Y?|@ӚQ@9W@@_S@Ԡ@@ff@@#l@@e@է @蛥@*z@k@֭/@ @0I@@q@@׳C@@/@6^5@w@عp@@vȀ@b@h@@+@D@$@Ǿv@ ?|@J@@Q@@@l@P@@璇*@@@W @蘛@z@@@]/@鞰 @I@@!@@c\(@/@^5@'@ip@ =@@C@. I@o@@Q@49W@u^@S@̀@:ff@@{l@@hr@ @@z@z@Õ@@F @(@ɩ@ C@@Lě@^5@ @X@@R@r@ I@@Y$@󚟾@@ Ā@^@_33@9@@M@#@ehr@G@bM@)@@k|@@@\@0b@q@+@ě@6=p@wv@?|@@@^5@@p@@Dr@ I@Dž@ @J@@ Ā@ͺ^@33@P̀@M@@hr@VG@z@@@ |@@ ]@ \@ (@ !@ c+@ ě@ =p@ ' @ iX@@ @@ r@ -@ o@ $@ *@ 4 Ā@ u@ @ 9@@:5?@@{@G@ȴ@@bM@S@|@@@@FvȀ@b@ɑh@@ +@L@$@ϥ@?|@RQ@Q@@@S@X@@ff@@@@_ @@z@#@@e/@ @I@@)@@k\(@/@^5@/@qp@ =@@C@6 I@w@@Q@<9W@}^@S@̀@BM@l@@hr@ @Hz@@@˕@ @N @(@ѩ@C@@Tě@^5@ @X@@Z@r@ I@@a$@@@ Ā@ %^@ g33@ 9@@ M@!+@!mhr@!G@!bM@"1S@"s|@@"@@"\@#8b@#yh@@#+@#@$>=p@$v@$?|@%@@%DQ@@%@%l@&@@&J*@&@&́@'@'P@'5?@@'Ӯ@@(/@(Vȴ@(I@@(S@)\(@)\/@)vȀ@)@*!h@@*c =@@*C@*$@+'@+i?|@+Q@+9W@,-@,oS@,@@,ff@@-3l@@-u@- @-z@.:z@.{@.@. @/@(@/@@/C@@0ě@0F^5@0 @0p@1 @1Lr@1 I@1υ@2@2R@@2 Ā@2պ^@333@3X̀@3M@3@4hr@4^G@4z@4@@5#|@@5e@5\@5(@6)@6k+@6ě@6=p@7/v@7qX@@7@@7r@85@8wl@8$@8*@9< Ā@9}@9@:9@@:B5?@@:@@:G@;ȴ@;HI@@;S@;\(@< @@?|@>ZQ@>Q@@>@?S@?`@@?ff@@?@@%@@g @@@@z@A+@@Am/@A @AI@@B1@@BsC@@B/@B^5@C7@Cyp@C@CC@D> I@D@D@E@@ED9W@E^@ES@F̀@FJM@Fl@@Fhr@G @GPz@G@@Gӕ@H@HV @H(@H٩@IC@@I\ě@I^5@I @J!X@@Jb@Jr@J@K'@Ki$@K*@K Ā@L-@Lo33@L9@@L5?@@M3@MuG@MG@MbM@N9S@N{|@@N@@NvȀ@O@b@Oh@@O+@P@PF$@Pv@P?|@Q @@QLQ@@Q@Ql@R@@RR*@R@RՁ@S@SX@S5?@@Sۮ@@T/@T^ȴ@TI@@TS@U#\(@Ud/@UvȀ@U@V)h@@Vk =@@VC@V I@W/@Wq@WQ@W9W@X5^@XwS@X̀@Xff@@Y;l@@Y}hr@Y @Zz@ZBz@Z@Z@[ @[H(@[@@[C@@\ ě@\N^5@\ @\p@]@]Tr@] I@]ׅ@^@^Z@@^ Ā@^ݺ^@_33@_`9@@_M@_@`%hr@`fG@`bM@`@@a+|@@am@a\@ab@b1@bs+@bě@b=p@c7v@cyX@@c@@cr@d=@dl@d$@e*@eD Ā@e@e@f9@@fJ5?@@f@fG@gȴ@gPI@@gS@g\(@h@@hVvȀ@h@hّh@@i =@@i\@i$@iߥ@j!?|@jbQ@jQ@@j@k'S@kh@@kff@@kl@@l-@lo @l@lz@m3@mu/@m @mI@@n9@@n{C@@n/@n^5@o?@op@o@pC@pF I@p@p@q @@qL9W@q^@qS@r̀@rRM@rl@@rhr@s @sXz@s@@s|@@t@t^\@t(@t@u#+@udě@u=p@u @v)X@@vj@@vr@v@w/@wq$@w*@w Ā@x5@xw33@x9@@x5?@@y;@y}G@yG@zbM@zAS@z|@@z@@{\@{Hb@{h@@{+@| @|N$@|v@|?|@}@@}TQ@@}@}l@~@@~Z*@~@~݁@@`@5?@@@@%/@f @逨I@@@@+\(@l/@遮^5@@1p@s =@@邴C@ I@7@y@郺Q@9W@=^@S@̀@ff@@Cl@@酅hr@ @z@Jz@醋@@ @P(@金@@C@@ě@V^5@鈗 @X@@@\r@鉞 I@߅@!$@b@@銤 Ā@^@'33@h9@@鋪M@@-hr@nG@錰bM@@@3|@@u@鍶\@b@9@{+@鎼ě@=p@?v@鏁X@@@@r@E@鐇l@@@ *@K@鑍@@@R5?@@钓@@G@ȴ@XI@@铙S@\(@@@^vȀ@锟@h@@# =@@dC@镦$@@)?|@jQ@閬9W@@/S@p@@闲ff@@l@@5@w @阸@z@;@}/@陾 @I@@A@@隃C@@/@^5@G@雉p@@ C@N I@霏@@@@T Ā@靕^@33@̀@ZM@鞛@hr@G@`z@韡@@|@@%@f\@頨(@@++@lě@顮=p@ @1X@@r@@颴r@@7@y$@飺*@ Ā@=@33@9@@5?@@C@饅G@ȴ@bM@IS@馋|@@@@vȀ@Pb@駑h@@+@@V$@騗v@?|@Q@\Q@@驝@S@ @@bff@@骣@@' @h@髪z@@@-/@n @鬰I@@@@3\(@t/@魶^5@@9p@{ =@@鮼C@ I@?@鯁@¸Q@9W@E^@鰇S@̀@ M@Kl@@鱍hr@ @z@Q@@鲓@@ @X(@鳙@C@@ě@^^5@鴟 @X@@"@dr@鵦 I@@)$@j@@鶬 Ā@^@/33@p9@@鷲M@@5hr@vG@鸸bM@@@;|@@|@@鹾\@b@Ah@@麃+@ģ@=p@Gv@黉?|@@@ Q@@M@鼏l@@@*@S@齕@@@Z5?@@龛@@/@ȴ@`I@@鿡S@\(@$/@fvȀ@@h@@+ =@@lC@$@@1?|@rQ@´9W@@7S@x@@úff@@l@@=@ @@z@C@Ņ@ư @(@I@@ƋC@@ě@^5@O @Ǒp@@r@V I@ȗ@@@@\ Ā@ɝ^@33@ ̀@bM@ʣ@hr@&G@hz@˩@@|@@-@n\@̰(@@3+@tě@Ͷ=p@v@9X@@z@@μr@@?l@ρ$@‡*@ Ā@E@Ї@ȴ9@@ 5?@@K@эG@ȴ@I@@QS@ғ\(@@@vȀ@W@әh@@ =@@@^$@ԟ@?|@"Q@dQ@@ե@S@(@@jff@@֫@@/ @p@ײz@@@5/@v @ظI@@@@;\(@|/@پ^5@@Ap@ڂ@ċC@ I@G@ۉ@ʟ@@ 9W@M^@܏S@̀@M@Sl@@ݕhr@ @z@Y@@ޛ@@ @`(@ߡ@C@@$ě@f^5@ @X@@*@lr@ I@@1$@r*@ Ā@@733@x9@@5?@@@=G@~G@bM@S@C|@@@@Ə\@b@Ih@@+@̣@$@Ov@?|@@@Q@@U@l@@@*@[@靁@@ @b5?@@꣮@@/@&ȴ@hI@@S@\(@,/@nvȀ@@h@@3 =@@tC@$@@9?|@zQ@9W@^@?S@̀@ff@@l@@Ehr@ @z@ z@K@@ΰ @(@Q@@C@@ě@^5@W @p@@r@^ I@@@"@@d Ā@^@33@(̀@jM@@hr@.G@pbM@@@|@@5@v\@b@@;+@|ě@=p@v@AX@@@@r@@Gl@$@ʇ*@ Ā@M@@д9@@5?@@S@G@ȴ@bM@YS@|@@@@vȀ@_@h@@ =@@$@f$@@?|@*Q@lQ@@@S@0@@rff@@@@7 @x@z@@=/@~ @I@@@@CC@@/@^5@@Ip@@̋C@ I@O@@ҟ@@9W@U^@S@̀@ M@ [l@@ hr@  @ z@ a@@ @ @ &\@ h(@ @ +@ ,ě@ n=p@ @ X@@ 2@@ tr@ @ @9$@z*@ Ā@@?33@9@@5?@@@EG@G@bM@ S@K|@@@@Ώ\@b@Qh@@+@ԣ@=p@Wv@?|@@@Q@@]@l@@@"*@c@@@(@j5?@@@@/@.ȴ@pI@@@@\(@4/@v^5@@p@; =@@|C@ I@@A@Q@9W@^@GS@̀@ff@@ l@@Mhr@ @z@z@S@@ְ @(@Y@@C@@ě@^5@_ @X@@@ $r@ f I@ @ $@!*@@!l Ā@!^@!33@"09@@"rM@"@"hr@#6G@#xbM@#@@#|@@$=@$~\@$b@%@%C+@%ě@%=p@&v@&IX@@&@@&r@' @'Ol@'$@'҇*@(@(U@(@(؛@)5?@@)[@@)G@)ȴ@* I@@*aS@*\(@*@@+&vȀ@+g@+h@@+ =@@,,C@,n$@,@,?|@-2Q@-t9W@-@-S@.8@@.zff@@.l@@.@/? @/@/z@0@0E/@0 @0I@@1 @@1KC@@1/@1^5@2@2Qp@2@2ԋC@3 I@3W@3@3ڟ@@4 Ā@4]^@433@4̀@5"M@5c@5hr@5G@6(z@6i@@6|@@6@7.\@7p(@7@7+@84ě@8v=p@8 @8X@@9:@@9|r@9@9@:A$@:*@: Ā@;@;G33@;9@@;5?@@< @b@>Yh@@>+@>ܣ@?$@?_v@??|@?@@@$Q@@@e@@S@@@@A*ff@@Ak@A@A @B0@Brz@B@@B/@C6 @CxI@@C@@C\(@DG@ObM@O@@P|@@PE@P\@Pb@Q h@@QK+@Q@Q=p@Rv@RQ?|@R@@RQ@@S@SWl@S@@Sڇ*@T@T]@T@T@U"5?@@Uc@@UG@Uȴ@V(I@@ViS@V\(@V@@W.vȀ@Wo@Wh@@W =@@X4@Xv$@X@X?|@Y:Q@Y|9W@Y@YS@Z@@@Zff@@Zl@@[@[G @[@[z@\ @\M/@\ @\I@@]@@]SC@@]ě@]^5@^ @^Yp@^@^r@_ I@__@_@_⟾@@`$ Ā@`e^@`33@`̀@a*M@ak@ahr@aG@b0z@bq@@b|@@b@c6\@cx(@c@c+@d<ě@d~=p@d @eX@@eB@@er@e@fl@fI$@f*@f Ā@g @gO@g9@@g5?@@h@hUG@hȴ@hbM@iS@i[|@@i@@ivȀ@j b@jah@@j+@j@k&$@kgv@k?|@k@@l,Q@@lm@ll@l@@m2*@ms@m@m @n8@nzz@n@@n/@o> @oI@@o@@p\(@pD/@p^5@p@q p@qK =@@qC@q I@r@rQ@r@@r9W@s^@sWS@s̀@sM@tl@@t]hr@t @tz@u!@@uc@u@u @v((@vi@vC@@vě@w.^5@wo @wX@@w@x4r@xv I@x@x$@y:@@y| Ā@y@y33@z@9@@z5?@@z@{G@{FG@{bM@{S@| |@@|L@@|\@|b@}h@@}S+@}@}=p@~v@~Y?|@~@@~Q@@@_l@@@*@#@e@ꀧ@蛥@*5?@@k@@ꁭG@ȴ@0I@@qS@ꂳ\(@/@6vȀ@w@ꃹh@@ =@@\@ꏀb@@+@Dě@ꐆ=p@Ǿv@ X@@J@@ꑌr@@l@Q$@꒒*@ Ā@@W@ꓘ9@@5?@@@]G@ꔞȴ@bM@!S@c|@@ꕤ@@vȀ@(b@ih@@ꖫ =@@@.$@o@ꗱ?|@Q@4Q@@u@꘷S@@@:ff@@{@꙽@ @@@Ꚃz@î@@/@F @ꛈI@@@@ \(@L/@꜎^5@@p@S =@@ꝔC@ I@@Y@Ꞛ@@9W@^@_S@꟠̀@M@#l@@ehr@ꠧ @z@)@@k@ꡭ@ @0(@q@ꢳ+@ě@6=p@w @꣹X@@@@vȀ@@h@@ =@@DC@갆$@ǥ@ ?|@JQ@걌9W@@S@P@@겒ff@@l@@hr@W @곘z@z@@]@괞 @(@!@@cC@@굤ě@^5@' @ip@궪@r@. I@o@귱@@@4 Ā@u^@긷33@̀@:M@{@깽hr@G@@z@꺁@@|@@@F\@껈b@ɩ@ +@Lě@꼎=p@Ͼv@X@@R@@꽔r@@l@Y$@꾚*@ Ā@@_@꿠@5?@@#@@eG@ȴ@I@@)S@k\(@@@vȀ@/@qh@@³ =@@@6$@w@ù?|@Q@^5@ @X@@@@Dr@Ѕ@Dž@ $@J*@ь Ā@͙@33@P9@@Ғ5?@@@G@VG@ӘbM@S@|@@\@@Ԟ\@b@!h@@c+@դ@=p@'v@i?|@֪@@Q@@-@ol@װ@@*@3@u@ط@@:5?@@{@@ٽ/@ȴ@@I@@ځS@\(@/@FvȀ@ۇ@ɑh@@ =@@LC@܎ I@ϥ@@RQ@ݔ9W@պ^@S@X̀@ޚff@@l@@hr@_ @ߠz@z@#@e@র @(@)@@kC@@ě@^5@/ @qp@@r@6 I@w@@@@< Ā@}^@33@9@@BM@@hr@G@HbM@@@|@@ @N\@b@ѩ@+@Tě@=p@׾v@X@@Z@@r@@l@a$@ꢇ*@ Ā@%@g@먴9@@5?@@+@mG@ȴ@I@@1S@s\(@@@vȀ@7@yh@@ =@@@>$@@?|@Q@DQ@@@S@@@Jff@@l@@́@ @P@z@ӕ@/@V @I@@@@C@@\/@^5@@!p@b@C@ I@'@i@@@9W@-^@oS@̀@M@3l@@uhr@G@z@9@@{|@@@\@@(@@+@ě@F=p@ @X@@ @@Lr@@υ@$@R*@ Ā@ՙ@33@X9@@5?@@@G@^G@bM@S@#|@@d@@\@b@)h@@k+@@$@/v@q?|@@@Q@@5@wl@@@*@;@}@@@B5?@@@@/@ȴ@HI@@S@\(@ /@NvȀ@@ёh@@ =@@TC@$@ץ@ @ ZQ@ 9W@ ݺ^@ S@ `̀@ ff@@ l@@ %hr@ g @ z@ z@ +@ m@ @ (@ 1@ sC@@ ě@ ^5@7 @yX@@@r@> I@@$@@@D Ā@^@33@9@@JM@@hr@G@PbM@@@|@@@V\@b@٩@+@\ě@=p@߾v@!X@@b@@Q@@@'l@h@@*@@-@o@@5?@@3@@uG@ȴ@I@@9S@{\(@@@vȀ@?@h@@ =@@@F$@@?|@ Q@LQ@@@S@@@Rff@@l@@Ձ@ @X@z@ە@/@^ @I@@@@ #C@@ d/@ ^5@ @!)p@!j@!C@! I@"/@"q@"@@"9W@#5^@#wS@#̀@#M@$;l@@$}hr@$ @%z@%A@@%@%@&\@&H(@&@&+@' ě@'N=p@' @'X@@(@@(Tr@(@(ׅ@)$@)Z*@) Ā@)ݙ@*@*`9@@*5?@@*@+%G@+fȴ@+bM@+S@,+|@@,l@@,vȀ@,b@-1h@@-s+@-@-$@.7v@.y?|@.@@.Q@@/=@/l@/@@0*@0C@0@0@1@1J5?@@1@@1/@2 @2PI@@2@@2\(@3/@3V^5@3@3p@4 =@@4\C@4 I@4ߥ@5!@5bQ@59W@5^@6'S@6h̀@6ff@@6l@@7-hr@7o @7z@7z@83@8u@8 @8(@99@@9{C@@9ě@9^5@:? @:X@@:@;r@;F I@;@;$@< @@G@>XbM@>@@>|@@?@?^\@?b@?@@#+@@dě@@=p@@v@A)X@@Aj@@Ar@A@B/l@Bp@@B*@B@C5@Cw@C@C5?@@D;@@D}G@Dȴ@EI@@EAS@E\(@E@@FvȀ@FG@Fh@@F =@@G C@GN$@G@G?|@HQ@HT9W@H@HS@I@@IZff@@Il@@I݁@J @J`@Jz@J㕀@K%/@Kf @KI@@K@@L+C@@Ll/@L^5@L@M1p@Mr@MC@M I@N7@Ny@N@@N Ā@O=^@O33@Ò@PM@PC@Phr@PG@Qz@QI@@Q|@@Q@R\@RP(@R@R+@Sě@SV=p@S @SX@@T@@T\r@T@T߅@U!$@Ub*@U Ā@U噙@V'33@Vh9@@V5?@@V@W-G@Wnȴ@WbM@WS@X3|@@Xt@@XvȀ@Xb@Y9h@@Y{+@Y@Y$@Z?v@Z?|@Z@@[Q@@[E@[l@[@@\ *@\K@\@\@]@]R5?@@]@@]/@^ȴ@^XI@@^S@^\(@_/@_^^5@_@_p@`# =@@`dC@` I@`@a)@ajQ@a9W@a^@b/S@bp̀@bff@@bl@@c5hr@cw @cz@c@@d;@d}@d @e(@eA@eC@@eě@f^5@fG @fX@@f@g r@gN I@g@g$@h@@hT Ā@h^@h33@i9@@iZM@i@ihr@jG@j`bM@j@@j|@@k%@kf\@kb@kh@@l++@ll@l=p@lv@m1?|@mr@@mQ@@m@n7l@nx@@n*@n@o=@o@o@p5?@@pC@@pG@pȴ@qI@@qIS@q\(@q@@rvȀ@rO@rh@@r =@@s@sV$@s@s?|@tQ@t\9W@t@tS@u @@ubff@@ul@@u@v' @vh@vz@v땀@w-/@wn @wI@@w@@x3C@@xt/@x^5@x@y9p@yz@yC@y I@z?@z@zŸ@@{9W@{E^@{S@{̀@| M@|K@|hr@|G@}z@}Q@@}|@@}@~\@~X(@~@~+@ě@^=p@ @X@@"@@dr@뀥@l@)$@j*@끬 Ā@홙@/@p9@@낲5?@@@5G@vȴ@냸bM@S@;|@@|@@넾vȀ@b@Ah@@녃+@ģ@$@Gv@놉?|@@@ Q@@M@뇏l@@@ff@@S@눕@ @@Zz@뉛@@/@ @`I@@늡@@\(@$/@f^5@닧@p@+ =@@lC@댮 I@@1@rQ@덴9W@^@7S@x̀@뎺ff@@l@@=hr@ @z@z@C@됅@ư @(@I@둋C@@ě@^5@O @뒑X@@@r@V I@듗@$@@@\ Ā@딝^@33@ 9@@bM@땣@hr@&G@hbM@떩@@|@@-@n\@뗰b@@3+@t@똶=p@v@9?|@z@@뙼Q@@@?l@뚀@@‡*@@E@뛇@ț@ 5?@@K@@뜍/@ȴ@I@@QS@띓\(@/@vȀ@W@랙h@@ =@@C@^$@럟@?|@"Q@d9W@력@S@(@@jff@@롫l@@@/ @p@뢲z@@5/@v @룸I@@@@;C@@|/@뤾^5@ @Ap@륂@r@ I@G@릉@ʟ@@ Ā@M^@맏33@̀@M@S@먕hr@G@z@Y@@멛|@@@\@`(@몡@+@$ě@f=p@뫧 @X@@*@@lr@묭@l@1$@r*@뭴 Ā@@7@x9@@뮺5?@@@=G@~ȴ@bM@S@C|@@밄@@vȀ@b@Ih@@뱋+@̣@$@Ov@벑?|@@@Q@@U@볗l@@@*@[@봝@@ @bz@뵣@@/@& @hI@@붩@@\(@,/@n^5@뷯@p@3 =@@tC@븶 I@@9@zQ@빼9W@^@?S@뺀̀@ff@@l@@Ehr@뻇 @z@ z@K@뼍@ΰ @(@Q@뽓C@@ě@^5@W @뾙X@@@r@^ I@뿟@$@"@@d Ā@^@33@(9@@j5?@@@G@.G@pbM@±S@|@@4@@v\@øb@h@@;+@|@ľ=p@v@A?|@ł@@Q@@@Gl@ƈ@@ʇ*@ @M@Ǐ@Л@5?@@S@@ȕG@ȴ@I@@YS@ɛ\(@/@vȀ@_@ʡh@@ =@@$C@f$@˧@?|@*Q@l9W@̭@S@0@@rff@@ͳl@@@7 @x@κz@@=/@~ @I@@@@CC@@Є/@^5@@Ip@ъ@r@ I@O@ґ@ҟ@@ Ā@U^@ӗ33@̀@M@[@ԝhr@G@ z@a@@գ|@@@&\@h(@֩@+@,ě@n=p@ׯ @X@@2@@tr@ص@@9$@z*@ټ Ā@@?@ڀ9@@5?@@@EG@ۆȴ@bM@ S@K|@@܌@@vȀ@b@Qh@@ݓ+@ԣ@$@Wv@ޙ?|@@@Q@@]@ߟl@@@"*@c@ु@@(@j5?@@᫮@@/@. @pI@@@@\(@4/@v^5@@p@; =@@|C@ I@@A@傸Q@9W@^@GS@̀@M@ l@@Mhr@ @z@@@S@@ְ @(@Y@C@@ě@^5@_ @X@@@$r@f I@맅@$@*@@l Ā@쭺^@33@09@@rM@@hr@6G@xbM@S@|@@<@@~\@b@h@@C+@@=p@v@I?|@@@Q@@ @Ol@@@҇*@@U@@؛@5?@@[@@G@ȴ@ I@@aS@\(@@@&vȀ@g@h@@ =@@,C@n$@@?|@2Q@t9W@@S@8@@zff@@l@@@? @@z@@E/@ @I@@ @@KC@@/@^5@@Qp@@ԋC@ I@W@@ڟ@@ Ā@]^@33@̀@"M@c@hr@G@(z@i@@|@@@.\@p(@@+@4ě@v=p@ @X@@:@@|r@@@A$@*@ Ā@@G33@9@@5?@@ @MG@ȴ@bM@S@S|@@@@vȀ@ b@ Yh@@ +@ ܣ@ $@ _v@ ?|@ @@ $Q@@ e@ S@ @@ *ff@@ k@ @  @ 0@ rz@ @@ /@6 @xI@@@@\(@G@bM@@@|@@E@\@b@ h@@K+@@=p@v@Q?|@@@Q@@@Wl@@@ڇ*@@]@@@ "5?@@ c@@ G@ ȴ@!(I@@!iS@!\(@!@@".vȀ@"o@"h@@" =@@#4@#v$@#@#?|@$:Q@$|9W@$@$S@%@@@%ff@@%l@@&@&G @&@&z@' @'M/@' @'I@@(@@(SC@@(/@(^5@)@)Yp@)@)܋C@* I@*_@*@*⟾@@+$9W@+e^@+S@+̀@,*M@,k@,hr@,G@-0z@-q@@-|@@-@.6\@.x(@.@.+@/<ě@/~=p@/ @0X@@0B@@0r@0@1l@1I$@1*@1 Ā@2 @2O@29@@25?@@3@3UG@3ȴ@3bM@4S@4[|@@4@@4vȀ@5 b@5ah@@5+@5@6&$@6gv@6?|@6@@7,Q@@7m@7l@7@@82ff@@8s@8@8 @98@9zz@9@@9/@:> @:I@@:@@;\(@;D/@;^5@;@< p@^@>WS@>̀@>ff@@?l@@?]hr@? @?z@@"z@@c@@@@ @A((@Ai@AC@@Aě@B.^5@Bo @BX@@B@C4r@Cv I@C@C$@D:@@D| Ā@D^@D33@E@9@@EM@E@Fhr@FFG@FbM@F@@G |@@GM@G\@Gb@H@HS+@H@H=p@Iv@IY?|@I@@IQ@@J@J_l@J@@J*@K#@Ke@K@K蛥@L*5?@@Lk@@LG@Lȴ@M0I@@MqS@M\(@M@@N6vȀ@Nw@Nh@@N =@@O<@O~$@O@P?|@PBQ@PQ@@P@QS@QH@@Qff@@Ql@@R @RO @R@Rz@S@SU/@S @SI@@T@@T[C@@T/@T^5@U @Uap@U@Ur@V& I@Vg@V@Vꟾ@@W, Ā@Wm^@W33@Ẁ@X2M@Xs@Xhr@XG@Y8z@Yy@@Y|@@Y@Z>\@Z(@Z@[+@[Dě@[=p@[ @\ X@@\J@@\r@\@]l@]Q$@]*@] Ā@^@^W@^9@@^5?@@_@_]G@_ȴ@_bM@`!S@`c|@@`@@`vȀ@a(b@aih@@a+@a@b.$@bov@b?|@b@@c4Q@@cu@cl@c@@d:*@d{@d@d@e@@ez@eî@@f/@fF @fI@@f@@g \(@gL/@g^5@g@hp@hS =@@hC@h I@i@iY@iQ@i9W@j^@j_S@j̀@jff@@k#l@@kehr@k @kz@l*z@lk@l@l @m0(@mq@mC@@mě@n6^5@nw @nX@@n@ovȀ@z@zh@@{ =@@{D@{$@{ǥ@| ?|@|JQ@|Q@@|@}S@}P@@}ff@@}l@@~@~W @~@~z@@]/@ @I@@!@@cC@@쀤/@^5@'@ip@쁪@r@. I@o@삱@@@4 Ā@u^@샷33@̀@:M@{@섽hr@G@@z@셁@@|@@@F\@솈(@ɩ@ +@Lě@쇎=p@ @X@@R@@숔r@@@Y$@쉚*@ Ā@@_@슠9@@5?@@#@eG@싦ȴ@bM@)S@k|@@쌬@@vȀ@0b@qh@@썳+@@6$@wv@쎹?|@@@^5@ @X@@@Dr@웆 I@Dž@ $@J@@윌 Ā@ͺ^@33@P9@@읒M@@hr@VG@잘bM@@@|@@]@쟞\@b@!@c+@젤ě@=p@'v@iX@@졪@@r@-@ol@좰@@*@3@u@죷@@:5?@@{@@줽G@ȴ@@I@@쥁S@\(@@@FvȀ@즇@ɑh@@ =@@L@짎$@ϥ@?|@RQ@쨔Q@@@S@X@@쩚ff@@@@_ @쪠@z@#@e/@쫦 @I@@)@@kC@@쬬/@^5@/@qp@쭲@C@6 I@w@쮹@@@<9W@}^@쯿S@̀@BM@찃l@@hr@ @Hz@챉@@˕@ @N @첐(@ѩ@+@Tě@쳖=p@ @X@@Z@@촜r@@@a$@쵢*@ Ā@%@g33@춨9@@5?@@+@mG@췮ȴ@bM@1S@s|@@츴@@vȀ@8b@yh@@칻+@@>$@v@?|@@@DQ@@컅@l@@@J*@켋@́@@P@콒5?@@Ӯ@@/@Vȴ@쾘I@@S@\(@\/@쿞^5@@!p@c =@@C@ I@'@i@Q@9W@-^@oS@°̀@ff@@3l@@uhr@÷ @z@:z@{@Ľ@ @@(@Ł@@C@@ě@F^5@Ƈ @p@ @Lr@ǎ I@υ@$@R@@Ȕ Ā@պ^@33@X9@@ɚM@@hr@^G@ʠbM@@@#|@@e@˦\@b@)@k+@̬ě@=p@/v@qX@@Ͳ@@r@5@wl@ι$@*@< Ā@}@Ͽ@@B5?@@Ѓ@@G@ȴ@HI@@щS@\(@ @@NvȀ@ҏ@ёh@@ =@@T@Ӗ$@ץ@?|@ZQ@ԜQ@@@S@`@@բff@@@%@g @֨@z@+@@m/@׮ @I@@1@@sC@@ش/@^5@7@yp@ٺ@C@> I@@@@@D9W@ۅ^@S@̀@JM@܋l@@hr@ @Pz@ݑ@@ӕ@@V @ޘ(@٩@C@@\ě@ߞ^5@ @!X@@b@@r@@'@i$@᪇*@ Ā@-@o33@ⰴ9@@5?@@3@uG@G@bM@9S@{|@@@@\@@b@偑h@@+@@F=p@懾v@?|@ @@LQ@@@l@@@R*@@Ձ@@X@5?@@ۮ@@/@^ȴ@I@@S@#\(@d/@vȀ@@)h@@k =@@쬋C@ I@/@q@Q@9W@5^@wS@̀@ff@@;l@@}hr@ @z@Bz@@@ @H(@@@C@@ ě@N^5@ @p@@Tr@ I@ׅ@@Z@@ Ā@ݺ^@33@`9@@M@@%hr@fG@bM@@@+|@@m@\@b@1@s+@ě@=p@7v@yX@@@@r@=@l@$@*@D Ā@@@9@@J5?@@@G@ȴ@PI@@S@\(@@@VvȀ@@ّh@@ =@@\@$@ߥ@!?|@bQ@Q@@@'S@h@@ff@@@-@o @@z@3@@u/@ @I@@9@@{\(@/@^5@?@p@@C@F I@@@ @@L9W@^@S@̀@RM@l@@hr@  @ Xz@ @@ ە@ @ ^ @ (@ @ #C@@ dě@ ^5@ @ )X@@ j@ r@ I@ /@ q$@ *@ Ā@5@w33@9@@5?@@;@}G@G@bM@AS@|@@@@\@Hb@h@@+@ @N=p@v@?|@@@TQ@@@l@@@Z*@@ݙ@@`@5?@@@@%/@fȴ@I@@S@+\(@l/@vȀ@@1h@@s =@@C@$@7@y?|@Q@9W@=@S@@@ff@@Cl@@@ @@Jz@@/@ @PI@@@@C@@ě@V^5@ @p@@\r@ I@߅@ !@ b@@ Ā@ ^@!'33@!h̀@!M@!@"-hr@"nG@"z@"@@#3|@@#u@#\@#(@$9@${+@$ě@$=p@%? @%X@@%@@&r@&E@&l@&$@' *@'L Ā@'@'@(9@@(R5?@@(@(G@)ȴ@)XbM@)S@)\(@*@@*^vȀ@*@*h@@+# =@@+d@+$@+@,)?|@,jQ@,Q@@,@-/S@-p@@-ff@@-@.5@.w @.@.z@/;@@/}/@/ @0I@@0A@@0\(@0/@1^5@1G@1p@1 =@@2 C@2N I@2@2@3@@3T9W@3^@3S@4̀@4ZM@4l@@4hr@5 @5`z@5@@5㕀@6%@6f @6(@6@7+C@@7lě@7^5@7 @81X@@8r@8r@8 I@97@9y$@9@@9 Ā@:=@:33@:9@@;5?@@;C@;G@;G@<bM@@>V=p@>v@>?|@?@@?\Q@@?@?l@@ @@@b*@@@@噙@A'@Ah@A5?@@A@@B-G@Bnȴ@BI@@BS@C3\(@Ct/@CvȀ@C@D9h@@D{ =@@DC@D$@E?@E?|@E¸Q@F9W@FE@FS@F@@G ff@@GKl@@G@G @H@HRz@H@H/@I @IXI@@I@@IC@@J/@J^^5@J @Jp@K"@Kdr@K I@K@L)@Lj@@L Ā@L^@M/33@Mp̀@MM@M@N5hr@NvG@Nz@N@@O;|@@O}@O\@P(@PA@P+@Pě@Q=p@QG @QX@@Q@@R r@RM@R@R$@S*@ST Ā@S@S@T9@@TZ5?@@T@TG@Uȴ@U`bM@US@U|@@V$@@VfvȀ@Vb@Vh@@W++@Wl@W$@Wv@X1?|@Xr@@XQ@@X@Y7l@Yx@@Y*@Y@Z=@Z@Z@[z@[C@@[/@[ư @\I@@\I@@\\(@\/@]^5@]O@]p@] =@@^C@^V I@^@^@_Q@_\9W@_^@_S@` ̀@`bff@@`l@@`hr@a' @ahz@az@a땀@b-@bn @b(@b@@c3C@@ctě@c^5@c @d9X@@dz@dr@d I@e?@e$@eŸ@@f Ā@fE^@f33@fȴ9@@g M@gK@ghr@gG@hbM@hQ@@h|@@h@i\@iXb@i@i+@jě@j^=p@jv@jX@@k"@@kdQ@@k@kl@l(@@lj*@l@l홙@m/@mp@m5?@@m@@n5G@nvȴ@nI@@nS@o;\(@o|/@ovȀ@o@pAh@@p =@@pċC@q$@qG@q?|@qʸQ@r 9W@rM@rS@r@@sff@@sSl@@s@s @t@tZz@t@t/@u @u`I@@u@@uC@@v$/@vf^5@v@vp@w*@wlC@w I@w@x1@xr@@x Ā@x^@y733@yx̀@yM@y@z=hr@z~G@zz@{@@{C|@@{@{Ə\@|(@|I@|+@|ě@}=p@}O @}X@@}@@~r@~U@~@~$@*@\ Ā@@@ 9@@b5?@@퀣@G@&ȴ@hbM@큩S@|@@,@@nvȀ@킰b@h@@3+@t@탶$@v@9?|@z@@턼Q@@@?l@텀@@‡*@@E@톇@ț@ 5?@@K@@퇍/@ȴ@I@@Q@@툓\(@/@^5@W@퉙p@ =@@C@^ I@튟@@"Q@d9W@틥^@S@(̀@jff@@팫l@@hr@/ @pz@퍲z@@5@v @편(@@@;C@@|ě@폾^5@ @AX@@퐂@r@ I@G@푉$@ʟ@@ Ā@M^@풏33@д9@@M@S@퓕hr@G@bM@Y@@픛|@@@\@`b@핡@+@$ě@f=p@햧v@X@@*@@lr@헭@l@1$@r*@혳@@7@x@홺5?@@@@=G@~ȴ@I@@S@C\(@후@@vȀ@@Ih@@휋 =@@̣@$@O@흑?|@ҸQ@Q@@U@힗S@@@ff@@[@ퟝ@ @ @bz@@/@& @hI@@@@C@@,/@n^5@@p@2@tC@ I@@9@z@@9W@^@?S@̀@M@l@@Ehr@ @z@ @@K@@ΰ @(@Q@C@@ě@=p@W @X@@@@r@]@@$@"*@d Ā@@33@(9@@j5?@@@G@.G@pbM@S@|@@4@@v\@b@h@@;+@|@=p@v@A?|@@@Q@@@Gl@@@ʇ*@ @M@@Л@5?@@S@@/@ȴ@I@@YS@\(@/@vȀ@_@h@@ =@@$C@f$@@?|@*Q@l9W@@S@0@@rff@@l@@@7 @xz@z@@=@~ @(@@@CC@@ě@^5@ @Ip@@r@ I@O@@ҟ@@ Ā@U^@33@̀@M@[@hr@G@ z@a@@|@@@&\@hb@@+@,ě@n=p@¯v@X@@2@@tr@õ@l@9$@z*@ļ Ā@@?@ŀ9@@5?@@@EG@Ɔȴ@bM@ S@K|@@nj@@vȀ@b@Qh@@ȓ+@ԣ@$@Wv@ə?|@ڸQ@Q@@]@ʟS@@@"ff@@c@˥@ @(@jz@̫@@/@. @pI@@ͱ@@\(@4/@v^5@η@p@; =@@|C@Ͼ I@@A@ЂQ@9W@^@GS@ш̀@M@ l@@Mhr@ҏ @z@@@S@ӕ@ְ @(@Y@ԛC@@ě@^5@_ @աX@@@$r@f I@֧@$@*@@l Ā@׭^@33@09@@rM@س@hr@6G@xbM@ٹ@@|@@<@@~\@b@h@@C+@ۄ@=p@v@I?|@܊@@Q@@ @Ol@ݐ@@҇*@@U@ޗ@؛@5?@@[@@ߝG@ȴ@ I@@aS@\(@@@&vȀ@g@ᩑh@@ =@@,C@n$@⯥@?|@2Q@t9W@@S@8@@zff@@l@@@? @倛@z@@E/@憰 @I@@ @@KC@@/@^5@@Qp@@ԋC@ I@W@@ڟ@@9W@]^@33@̀@"M@c@hr@G@(z@i@@|@@@.\@p(@@+@4ě@v=p@v@X@@:@@|r@@l@A$@*@ Ā@@G@9@@5?@@ @MG@ȴ@bM@S@S|@@@@vȀ@b@Yh@@+@ܣ@$@_v@?|@@@$Q@@e@S@@@*ff@@k@@ @0@rz@@@/@6 @xI@@@@\(@G@bM@@@|@@E@\@b@ h@@K+@@=p@v@Q?|@@@Q@@ @ Wl@ @@ ڇ*@ @ ]@ @ @ "5?@@ c@@ G@ ȴ@ (I@@ iS@ \(@ @@ .vȀ@ o@ h@@ =@@4@v$@@?|@:Q@|9W@@S@@@@ff@@l@@@G @@z@ @M/@ @I@@@@SC@@/@^5@@Yp@@܋C@ I@_@@⟾@@$9W@e^@S@̀@*M@k@hr@G@0z@q@@|@@@6\@x(@@+@<ě@~=p@ @X@@B@@r@@@I$@*@ Ā@ @O33@9@@5?@@@UG@G@bM@S@[|@@@@vȀ@ b@ ah@@ +@ @!&$@!gv@!?|@!@@",Q@@"m@"l@"@@#2*@#s@#@#@$8@$z5?@@$@@$/@%>ȴ@%I@@%S@&\(@&D/@&vȀ@&@' h@@'K =@@'C@' I@(@(Q@(Q@(9W@)^@)WS@)̀@)ff@@*l@@*]hr@* @*z@+"z@+c@+@+ @,((@,i@@,C@@,ě@-.^5@-o @-p@-@.4r@.v I@.@.@/:@@/| Ā@/^@/33@0@9@@0M@0@1hr@1FG@1bM@1@@2 |@@2M@2\@2b@3@3S+@3ě@3=p@4v@4YX@@4@@4r@5@5_l@5$@5*@6$ Ā@6e@6@69@@7*5?@@7k@7G@7ȴ@80I@@8qS@8\(@8@@96vȀ@9w@9h@@9 =@@:<@:~$@:@;?|@;BQ@;Q@@;@<S@@@>U/@> @>I@@?@@?[\(@?/@?^5@@@@ap@@@@C@A& I@Ag@A@Aꟾ@@B,9W@Bm^@BS@B̀@C2M@Csl@@Chr@C @D8z@Dy@@D@D@E> @E(@E@FC@@FDě@F^5@F @G X@@GJ@Gr@G I@H@HQ$@H*@H Ā@I@IW33@I9@@I5?@@J@J]G@JG@JbM@K!S@Kc|@@K@@K\@L(b@Lih@@L+@L@M.=p@Mov@M?|@M@@N4Q@@Nu@Nl@N@@O:*@O{@O@O@P@@P5?@@Pî@@Q/@QFȴ@QI@@QS@R \(@RL/@RvȀ@R@Sh@@SS =@@SC@S$@T@TY?|@TQ@T9W@U@U_S@U@@Uff@@V#l@@Ve@V @V蛥@W*z@Wk@W/@W @X0I@@Xq@@XC@@Xě@Y6^5@Yw @Yp@Y@ZvȀ@eb@eh@@f+@fD@f$@fǾv@g ?|@gJ@@gQ@@g@hl@hP@@h*@h@i@iW @i@iz@j@@j]/@j @jI@@k!@@kc\(@k/@k^5@l'@lip@l =@@lC@m. I@mo@m@mQ@n49W@nu^@nS@ǹ@o:ff@@o{l@@ohr@o @p@z@pz@pÕ@q@qF @q(@qɩ@r C@@rLě@r^5@r @sX@@sR@sr@s I@t@tY$@t@@t Ā@u^@u_33@u9@@uM@v#@vehr@vG@vbM@w)@@wk|@@w@w\@x0b@xq@x+@xě@y6=p@ywv@y?|@y@@z^5@@p@@DC@ I@ǥ@ @J@@9W@ͺ^@S@P̀@M@l@@hr@W @z@@@|@@]@\@(@!@c+@ě@=p@' @iX@@@@r@-@o@$@*@4 Ā@u@33@9@@:5?@@{@G@G@@bM@S@|@@@@F\@b@ɑh@@ +@L@$@Ͼv@?|@R@@Q@@@l@X@@*@@@_@@5?@@#@@e/@ȴ@I@@)S@k\(@/@vȀ@/@qh@@ =@@C@6$@w@?|@Q@<9W@}^@S@̀@Bff@@l@@hr@ @Hz@z@˕@ @N @(@@@C@@Tě@^5@ @p@Z@r@ I@@a@@@ Ā@%^@g33@̀@M@+@mhr@G@bM@1@@s|@@@\@8b@y@+@ě@>=p@v@X@@@@Dr@@l@ $@J*@ Ā@͙@@P9@@5?@@@G@Vȴ@bM@S@|@@\@@vȀ@@!h@@c =@@@$@'@i?|@Q@Q@@-@oS@@@ff@@3@u@ @@:z@{@@/@ @@I@@@@\(@/@F^5@@p@ =@@LC@ I@ϥ@@R@@9W@պ^@S@X̀@M@l@@hr@_ @z@@@#@e@ @(@)@kC@@ě@^5@/ @qX@@@r@6 I@w@$@@@< Ā@}^@33@9@@B5?@@@G@G@HbM@S@|@@ @@N\@b@ёh@@+@T@=p@׾v@?|@Z@@Q@@@l@`@@*@@%@g@@5?@@+@@mG@®ȴ@I@@1S@s\(@ô/@vȀ@7@yh@@Ļ =@@C@>$@@?|@Q@D9W@ƅ@S@@@Jff@@Njl@@́@ @P@Ȓz@ӕ@/@V @ɘI@@@@C@@\/@ʞ^5@@!p@b@ˤr@ I@'@i@̪@@ Ā@-^@o33@Ͱ̀@M@3@uhr@ζG@z@9@@{|@@Ͻ@\@@(@Ё@+@ě@F=p@ч @X@@ @@Lr@ҍ@υ@$@R*@Ӕ Ā@ՙ@@X9@@Ԛ5?@@@G@^ȴ@ՠbM@S@#|@@d@@֦vȀ@b@)h@@k+@׬@$@/v@q?|@ز@@Q@@5@wl@ٸ@@*@;@}@ڿ@@B5?@@ۃ@@/@ȴ@HI@@܉S@\(@ /@NvȀ@ݏ@ёh@@ =@@TC@ޖ$@ץ@?|@ZQ@ߜ9W@@S@`̀@ff@@l@@%hr@g @z@z@+@m@⮰ @(@1@@sC@@ě@^5@7 @yp@@r@> I@@@@@D Ā@慺^@33@̀@JM@@hr@G@PbM@@@|@@@V\@b@٩@+@\ě@=p@߾v@!X@@b@@r@@'l@i$@쪇*@ Ā@-@o@9@@5?@@3@uG@ȴ@bM@9S@{|@@@@vȀ@@b@h@@ =@@@F$@@?|@ Q@LQ@@@S@@@Rff@@@Ձ@ @X@z@ۮ@@/@^ @I@@@@#\(@d/@^5@@)p@k =@@C@ I@/@q@@@9W@5^@wS@̀@M@;l@@}hr@ @z@A@@@@ @H(@@C@@ ě@N^5@ @X@@@Tr@ I@ׅ@$@Z@@ Ā@ݺ^@33@`9@@M@@%G@fG@bM@S@+|@@l@@\@b@1h@@s+@@=p@7v@y?|@@@Q@@=@l@@@*@C@@@@J5?@@@@G@ȴ@PI@@S@\(@ /@ VvȀ@ @ ّh@@  =@@ \C@ $@ ߥ@ !?|@ bQ@ 9W@ @ 'S@ h@@ ff@@ l@@ -@ o @ @ z@3@u/@ @I@@9@@{C@@/@^5@?@p@@C@F I@@@ @@L Ā@^@33@̀@RM@@hr@G@Xz@@@|@@@^\@(@@#+@dě@=p@ @)X@@j@@r@@/@q$@*@ Ā@5@w@9@@5?@@;@}G@ȴ@bM@AS@|@@@@vȀ@Hb@h@@+@ @N$@v@?|@@@TQ@@@l@@@Z*@@݁@ @ `@ 5?@@ @@!%/@!fȴ@!I@@!@@"+\(@"l/@"^5@"@#1p@#s =@@#C@# I@$7@$y@$Q@$9W@%=^@%S@%̀@&ff@@&Cl@@&hr@& @'z@'Jz@'@'@( @(P(@(@@(C@@)ě@)V^5@) @)X@@*@*\r@* I@*߅@+!$@+b@@+ Ā@+^@,'33@,h9@@,M@,@--hr@-nG@-bM@-@@.3|@@.u@.\@.b@/9@/{+@/ě@/=p@0?v@0X@@0@@1r@1E@1l@1$@2 *@2K@2@2@3@3R5?@@3@@3G@4ȴ@4XI@@4S@4\(@5@@5^vȀ@5@5h@@6# =@@6d@6$@6@7)?|@7jQ@7Q@@7@8/S@8p@@8ff@@8@95@9w @9@9z@:;@:}/@: @;I@@;A@@;C@@;/@<^5@@@>T9W@>^@>S@?̀@?ZM@?l@@?hr@@ @@`z@@@@@㕀@A%@Af @A(@A@B+C@@Blě@B=p@B @C1X@@Cr@@Cr@C@D7@Dy$@D*@D Ā@E=@E33@E9@@F5?@@FC@FG@FG@GbM@GIS@G|@@G@@H\@HPb@Hh@@H+@I@IV=p@Iv@I?|@J@@J\Q@@J@Jl@K @@Kb*@K@K@L'@Lh@L5?@@L@@M-/@Mnȴ@MI@@MS@N3\(@Nt/@NvȀ@N@O9h@@O{ =@@OC@O$@P?@P?|@P¸Q@Q9W@QE@QS@Q@@R ff@@RKl@@R@R @S@SRz@S@S/@T @TXI@@T@@TC@@U/@U^^5@U@Up@V"@VdC@V I@V@W)@Wj@@W Ā@W^@X/33@Xp̀@XM@X@Y5hr@YvG@Yz@Y@@Z;|@@Z}@Z\@[(@[A@[+@[ě@\=p@\G @\X@@\@@] r@]M@]@]$@^*@^T Ā@^@^33@_9@@_Z5?@@_@_G@`ȴ@``bM@`S@`|@@a$@@afvȀ@ab@ah@@b++@bl@b$@bv@c1?|@cr@@cQ@@c@d7l@dx@@d*@d@e=@e@e@f5?@@fC@@f/@fȴ@gI@@gI@@g\(@g/@h^5@hO@hp@h =@@iC@iV I@i@i@jQ@j\9W@j^@jS@k ̀@kbff@@kl@@khr@l' @lhz@lz@l땀@m-@mn @m(@m@@n3C@@ntě@n^5@n @o9p@oz@or@o I@p?@p$@pŸ@@q Ā@qE^@q33@qȴ9@@r M@rK@rhr@rG@sbM@sQ@@s|@@s@t\@tXb@t@t+@uě@u^=p@uv@uX@@v"@@vdr@v@vl@w)$@wj*@w@w홙@x/@xp@x5?@@x@@y5G@yvȴ@yI@@yS@z;\(@z|@@zvȀ@z@{Ah@@{ =@@{ģ@|$@|G@|?|@|ʸQ@} Q@@}M@}S@}@@~ff@@~S@~@~ @@Zz@@@/@ @`I@@@@C@@$/@f^5@@p@*@lC@ I@@1@r@@9W@^@7S@x̀@M@l@@=hr@ @z@@@C@@ư @(@I@C@@ě@=p@O @X@@@@r@U@@$@*@\ Ā@@33@ 9@@b5?@@@G@&G@hbM@S@|@@,@@n\@b@h@@3+@t@=p@v@9?|@z@@Q@@@?l@@@‡*@@E@@ț@ 5?@@K@@/@ȴ@I@@QS@\(@/@vȀ@W@h@@ =@@C@^$@@?|@"Q@d9W@@S@(@@jff@@l@@@/ @pz@z@@5@v @(@@@;C@@|ě@^5@ @Ap@@r@ I@G@@ʟ@@ Ā@M^@33@̀@M@S@hr@G@z@Y@@|@@@\@`(@@+@$ě@f=p@ @X@@*@@lr@@@1$@r*@ Ā@@733@x9@@鷺5?@@@=G@~ȴ@bM@S@C|@@濾@@vȀ@b@Ih@@溜+@̣@$@Ov@﨑?|@@@Q@@U@練l@@@*@[@瞧@@ @b5?@@﫣@@/@&ȴ@hI@@﬩S@\(@,/@n^5@ﭯ@p@3 =@@tC@﮶ I@@9@zQ@ﯼ9W@^@?S@ﰀ̀@ff@@l@@Ehr@ﱇ @z@ z@K@ﲍ@ΰ @(@Q@@ﳓC@@ě@^5@W @ﴙp@@r@^ I@ﵟ@$@"@@d Ā@ﶥ^@33@(9@@jM@﷫@hr@.G@pbM@︱@@|@@5@v\@ﹸb@@;+@|ě@ﺾ=p@v@AX@@ﻂ@@r@@Gl@)$@ʇ*@ Ā@M@o@Л@5?@@S@@ユG@ȴ@I@@YS@ᅴ\(@@@vȀ@_@h@@ =@@$@f$@@?|@*Q@lQ@@­@S@0@@rff@@ó@@7 @x@ĺz@@@=/@~ @I@@@@CC@@Ƅ/@^5@@Ip@NJ@̋C@ I@O@ȑ@ҟ@@9W@U^@ɗS@̀@M@[l@@ʝhr@ @ z@a@@ˣ@@& @h(@̩@C@@,ě@n^5@ͯ @X@@2@@tr@ε@@9$@z*@ϼ Ā@@?33@Ѐ9@@5?@@@EG@цG@bM@ S@K|@@Ҍ@@Ώ\@b@Qh@@ӓ+@ԣ@=p@Wv@ԙ?|@@@Q@@]@՟l@@@"*@c@֥@@(@j5?@@׫@@/@.ȴ@pI@@رS@\(@4/@vvȀ@ٷ@h@@; =@@|C@ھ$@@A?|@ۂQ@9W@@GS@܈@@ff@@ l@@M@ݏ @Л@z@S@ޕ@ְ @(@Y@@ߛC@@ě@^5@_ @p@@$r@f I@ᧅ@@*@@l Ā@⭺^@33@0̀@rM@@hr@6G@xz@@@|@@=@~\@(@@C+@ě@=p@ @IX@@@@r@ @O@$@҇*@ Ā@U@33@ش9@@5?@@[@G@ȴ@ bM@aS@|@@@@&vȀ@hb@쩑h@@+@,@n$@v@?|@2@@tQ@@@l@8@@z*@@@?@@5?@@@@E/@ȴ@I@@ S@K\(@/@^5@@Qp@ =@@ԋC@ I@W@@ڸQ@9W@]^@S@̀@"ff@@cl@@hr@ @(z@jz@@@. @p(@@@C@@4ě@v^5@ @p@:@|r@ I@@A$@@@ Ā@^@G33@9@@M@ @Mhr@G@bM@@@S|@@@֏\@b@Y@+@ě@@@/;@@P @ql @9X@€@ӶE@`@C`@6b@@V@wO@M@@ @@dZ@<$ @\@}`@z @;d@@`@ȴ @!@BQ`@cn@@`@\(@(@x@'@HvȠ@i33 @@@ˁ@M@ =`@- @N@@oX@@$ @G@ѡʠ@n@/@3`@TQ@ux@E@$@@\@O @:@Z/@{@ff@@&`@ @9@@@@=p@`@`@C@X@@z@ @ %ʠ@ FbM@ g/@ @  @ l @ 9X@ €@ +@@ L`@ mC`@ b@@ @ ϙ@ Z@ @ 1l@ R@ sp@ 1&@ @ վv@ z @ G@ 81@ Xȴ @ y@ Q`@ @@ ;@@ `@ l @ >(@ ^€@ E@ vȠ@ C`@ @@#O@DM@e@ @@dZ@$ @@)`@Jz @k;d@@`@ȴ @ͅ@E@n@/@P`@q\(@@x@ө@vȠ@33 @5 @V@w@M@ =`@`@@@X@@<$ @\G@}ʠ@n@/@`@Q@!x@BE@c$@@\@O @b@@/@'@Hff@@i&`@l@9@@p@=p@ @-v@NC@oG@z@@ѕ@bM@@@3@T @ul @9X@€@@@`@C`@:b@@Z@{@Z@@l@@dZ@@1&@`@v@z @;d@@1@ȴ @%@FQ`@gn@;@@`@l @(@ x@+E@LvȠ@mC`@@@ύO@M@@1 @R@@sdZ@$ @@ծ`@n@/@7`@XQ@y@E@$@@\@\(@>@^/@@ff@@33 @ @9@@#@D=p@e =`@`@C@X@@z@G@)ʠ@JbM@k/@@Q@x@9X@ $@ /@@ P`@ qO @ b@@ /@ ә@ Z@!&`@!5l@!V9@@!wp@!1&@!@!پv@!C@"G@"<1@"\@"}@"bM@"@@";@@# @#!l @#B9X@#b€@#E@#`@#C`@#b@@$@$'O@$HM@$i@$ @$@$dZ@$$ @% @%-`@%Nz @%o;d@@%`@%ȴ @%х@%Q`@&n@&3@&T`@&u\(@&(@&x@&ש@&vȠ@'33 @'9@'Z@'{@'M@' =`@' @'@@(X@@(@$ @(`G@(`@(n@(/@(`@)Q@)%@)FE@)g$@)@)\@)\(@)@* /@*+@*Lff@@*m&`@* @*9@@*ρ@*=p@+@+1`@+RC@+sX@@+z@+@+աʠ@+bM@,/@,7@,X @,yx@,9X@,$@,@@,`@-O @->b@@-^/@-@-Z@-&`@-l@.9@@.#p@.D1&@.d@.v@.z @.G@.1@/ȴ @/)@/JQ`@/k@@/;@@/`@/l @/(@0€@0/E@0PvȠ@0qC`@0@0@0ӍO@0M@1@15 @1V@1wdZ@1$ @1@1ٮ`@1z @2;d@@2;`@2\ȴ @2}@2E@2n@2@3`@3!\(@3B@3bx@3@3vȠ@333 @3 @4@4'@4HM@4i =`@4`@4@@4X@@4$ @5 G@5-ʠ@5Nn@5o/@5`@5Q@5x@5E@6$@63@6T\@6uO @6@6/@6י@6ff@@7&`@79l@7Z9@@7{p@7=p@7@7ݾv@7C@8G@8@z@8`@8@8bM@8@@8@9 @9%l @9F9X@9f€@9@@9`@9C`@9b@@: @:+@:LZ@:m@:l@:@:p@:1&@;@;1v@;Rz @;sG@;1@;ȴ @;Օ@;Q`@<@@<7;@@@@>#dZ@>D$ @>d@>`@>n@>;d@@>`@?ȴ @?)@?JE@?kn@?@?`@?\(@?@@x@@/@@PvȠ@@q33 @@ @@@@Ӂ@@=p@A =`@A5`@AVC@AwX@@Az@AG@A١ʠ@AbM@B/@B;@B\Q@B}x@B9X@B$@B@@C\@C!O @CBb@@Cb/@C@Cff@@C&`@Cl@D9@@D'p@DH=p@Dh@Dv@DC@DG@Dz@E @E-@ENbM@Eo@@E;@@E @El @E9X@F€@F3E@FT`@FuC`@Fb@@F@F׍O@FZ@G@G9l@GZ@G{dZ@G1&@G@Gݾv@Gz @H;d@@H@1@H`ȴ @H@HQ`@Hn@H;@@I`@I%\(@IF(@Ifx@I@IvȠ@I33 @I@J @J+@JLM@Jm =`@J @J@@JX@@J$ @KG@K1`@KRn@Ks/@K`@KQ@KՅ@KE@L$@L7@LX\@Ly\(@L@L/@L۩@Lff@@M33 @M= @M^9@@M@M=p@M@M`@NC@N#X@@NDz@Nd@Nʠ@NbM@N/@N@O @O)x@OJ9X@Ok$@O@@O`@OO @Ob@@P/@P/@PPZ@Pq&`@Pl@P9@@Pp@P1&@Q@Q5v@QVC@QwG@Q1@Q@Qٕ@QbM@R@@R;;@@R\ @R}l @R9X@R€@R߶E@S`@S!C`@SBb@@Sb@SO@SM@S@S @T@T'dZ@TH$ @Th@T`@Tz @T;d@@T`@U ȴ @U-@UNQ`@Uon@U@U`@U\(@U(@Vx@V3@VTvȠ@Vu33 @V@V@Vׁ@VM@W =`@W9 @WZ@@W{X@@W$ @WG@Wݡʠ@Wn@X/@X?`@X`Q@Xx@XE@X$@X@Y\@Y%O @YF@Yf/@Y@Yff@@Y&`@Y @Z 9@@Z+@ZL=p@Zl@Z`@ZC@ZX@@Zz@[@[1ʠ@[RbM@[s/@[@[ @[l @[9X@\€@\7@@\X`@\yC`@\b@@\@\ۙ@\Z@]@]=l@]^@]p@]1&@]@]v@^z @^#G@^D1@^dȴ @^@^Q`@^@@^;@@_`@_)l @_J(@_j€@_E@_vȠ@_C`@_@`@`/O@`PM@`q@` @`@@`dZ@`$ @a@a5`@aVn@aw;d@@a`@aȴ @aم@aE@bn@b;@b\`@b}\(@b@bx@bߩ@cvȠ@c!33 @cA @cb@c@cM@c =`@c`@d@@d'X@@dH$ @dhG@dʠ@dn@d/@d`@e Q@e-x@eNE@eo$@e@e\@eO @eb@@f/@f3@fTff@@fu&`@fl@f9@@fp@f=p@g@g9v@gZC@g{G@gz@g@gݕ@gbM@h@@h?@h` @hl @h9X@h€@h@@i`@i%C`@iFb@@if@i@iZ@i@il@j @j+dZ@jL1&@jl@jv@jz @j;d@@j1@kȴ @k1@kRQ`@ksn@k;@@k`@kl @k(@lx@l7E@lXvȠ@lyC`@l@l@lۍO@lM@m@m= @m^@@mdZ@m$ @m@m`@nn@n#/@nC`@ndQ@n@nE@n$@n@o\@o)\(@oJ@oj/@o@off@@o33 @o @p9@@p/@pP=p@pq =`@p`@pC@pX@@pz@qG@q5ʠ@qVbM@qw/@q@qQ@qx@q9X@r$@r;@@r\`@r}O @rb@@r/@rߙ@sZ@s!&`@sAl@sb9@@sp@s1&@s@sv@tC@t'G@tH1@th@t@tbM@t@@t;@@u  @u-l @uN9X@un€@uE@u`@uC`@ub@@v@v3O@vTZ@vu@vl@v@vdZ@v1&@w@w9v@wZz @w{;d@@w1@wȴ @wݕ@wQ`@xn@x?@x``@x\(@x(@xx@x@yvȠ@y%33 @yE@yf@y@yM@y =`@y @z @@z+X@@zL$ @zlG@z`@zn@z/@z`@{Q@{1@{RE@{s$@{@{\@{\(@{@|/@|7@|Xff@@|y&`@| @|9@@|ہ@|=p@}@}=`@}^C@}X@@}z@}@}ʠ@~bM@~#/@~C@~d @~x@~9X@~$@~@@`@)O @Jb@@j/@@Z@&`@l@9@@/p@P1&@p@v@z @G@1@ȴ @5@VQ`@w@@;@@`@l @(@€@;E@\vȠ@}C`@@@ߍO@M@!@A @b@dZ@$ @@`@z @';d@@G`@hȴ @@E@n@@ `@-\(@N@nx@@vȠ@33 @ @@3@TM@u =`@`@@@X@@$ @G@9ʠ@Zn@{/@`@Q@x@E@$@?@`\@O @@/@@ff@@%&`@E @f9@@@=p@@`@ C@+X@@Lz@l@ʠ@bM@@@@ @1l @R9X@r€@@@`@C`@b@@@7@XZ@y@l@@p@1&@@=v@^z @G@1@ȴ @ᕀ@Q`@#@@C;@@d`@l @(@x@E@vȠ@)C`@I@j@O@M@@ @@@/dZ@P$ @p@𐑮`@n@;d@@`@ȴ @5@VE@wn@@𑸟`@\(@@x@;@\vȠ@}33 @ @@߁@=p@! =`@A`@bC@X@@z@G@ʠ@bM@'/@G@hQ@x@9X@$@@@ \@-O @Nb@@n/@𕏙@ff@@&`@l@9@@3p@T=p@t@𖕾v@𖶋C@G@z@@9@ZbM@{@@@𗼬 @l @9X@€@?@@``@C`@b@@@㙙@Z@%@El@f@dZ@1&@@v@ z @+;d@@L1@lȴ @𚍕@Q`@n@;@@`@1l @R(@rx@𛓶E@vȠ@C`@@@7O@XM@y@ @𜺗@@dZ@$ @G@=`@^n@/@`@Q@@E@#$@C@d\@\(@@/@@ff@@)33 @I @j9@@🋁@=p@ =`@`@C@/X@@Pz@pG@𠑡ʠ@bM@/@@Q@5x@V9X@w$@@@𡸃`@O @b@@/@;@\Z@}&`@l@𢾴9@@p@1&@ @Av@bC@G@1@@啀@bM@'@@G;@@h @l @9X@€@E@ `@-C`@M@n@𥏍O@M@@ @@3dZ@T$ @t@𦕮`@z @;d@@`@ȴ @9@ZQ`@{n@@𧼟`@\(@(@x@?@`vȠ@33 @@@@M@% =`@E @f@@X@@$ @G@`@ n@+/@K`@lQ@𪍅@E@$@@\@1\(@R@r/@𫓩@ff@@&`@ @9@@7@X=p@x@`@𬺋C@X@@z@@=ʠ@^bM@/@@ @x@9X@#$@C@@d`@O @b@@/@癙@Z@)&`@Il@j9@@p@1&@@v@z @/G@P1@pȴ @𰑕@Q`@@@;@@`@5l @V(@v€@𱗶E@vȠ@C`@@@;O@\M@}@ @𲾣@dZ@$ @ @A`@bz @;d@@`@ȴ @@E@'n@G@h`@\(@@x@@ vȠ@-33 @M @n@𵏁@M@ =`@`@@@3X@@T$ @tG@𶕡ʠ@n@/@`@Q@9x@ZE@{$@@𷼏\@O @@/@?@`ff@@&`@ @´9@@@=p@$@E`@fC@X@@z@@镀@ bM@+@@K@l @l @9X@€@@@`@1C`@Rb@@r@𻓙@Z@@l@@7p@X1&@x@𼙾v@z @G@1@ȴ @=@^Q`@@@;@@`@l @(@"x@CE@dvȠ@C`@@@O@M@)@I @j@@dZ@$ @@`@n@/;d@@O`@pȴ @@E@n@@`@5\(@V@vx@@vȠ@33 @ @9@@;@\=p@} =`@`@¾C@X@@z@ G@Aʠ@bbM@Ã/@ã@ĸQ@x@9X@'$@G@@h\@ĉO @Īb@@/@뙙@ ff@@-&`@Ml@n9@@ŏp@Ű=p@@v@C@3G@Tz@t@ƕ@ƶbM@@@@ @9l @Z9X@z€@Ǜ@@Ǽ`@C`@b@@@?O@`Z@ȁ@ȡl@£@dZ@1&@$@Ev@fz @ɇ;d@@ɨ1@ȴ @镀@ Q`@+n@K;@@l`@ʍl @ʮ(@x@E@vȠ@1C`@Q@r@˓O@˴M@@ @@@7X@@X$ @xG@̙`@̺n@/@`@Q@=@^E@$@͟@\@\(@@"/@C@dff@@΅33 @Υ @ƴ9@@@=p@) =`@I`@jC@ϋX@@Ϭz@G@ʠ@bM@//@O@p @Бx@в9X@$@@@`@5O @Vb@@v/@ї@ѸZ@&`@l@9@@;p@\1&@|@ҝv@ҾC@G@1@ @A@bbM@Ӄ@@ӣ;@@Ĭ @l @9X@&€@GE@h`@ԉC`@Ԫb@@@O@ Z@-@Ml@n@ՏdZ@հ1&@@v@z @3;d@@T1@tȴ @֕@ֶQ`@n@@`@9\(@Z(@zx@כ@׼vȠ@33 @@@?@`M@؁ =`@ء @—@@X@@$ @$G@E`@fn@ه/@٧`@ȸQ@@ E@+$@K@l\@ڍO @ڮ@/@@ff@@1&`@Q @r9@@ۓ@۴=p@@`@C@7X@@Xz@x@ܙʠ@ܺbM@/@@ @=x@^9X@$@ݟ@@`@O @b@@"/@C@dZ@ޅ&`@ޥl@ƣ@p@1&@(@Iv@jz @ߋG@߬1@ȴ @핀@Q`@/@@O;@@p`@l @(@€@E@vȠ@5C`@U@v@ᗍO@M@@ @@;dZ@\$ @|@❮`@z @;d@@`@ ȴ @A@bQ`@n@@ğ`@\(@(@&x@G@hvȠ@33 @@@@ M@- =`@M`@n@@X@@$ @G@ʠ@n@3/@S`@tQ@x@E@$@@\@9O @Z@z/@盩@ff@@&`@ @9@@?@`=p@@`@‹C@G@z@$@E@fbM@@@@Ȭ @l @ 9X@*€@K@@l`@C`@b@@@@Z@1@Ql@r@p@1&@@v@z @7G@X1@xȴ @왕@Q`@@@;@@`@=l @^(@~x@ퟶE@vȠ@C`@@"@CO@dM@@ @Ɨ@@dZ@$ @(@I`@jn@;d@@`@ȴ @@E@/n@O@p`@\(@@x@@vȠ@533 @U @v@@M@ =`@`@@@;X@@\$ @|G@ʠ@n@/@`@ Q@Ax@b9X@$@@@ď\@O @b@@&/@G@hff@@&`@l@ʴ9@@p@ =p@,@Mv@nC@G@z@@@bM@3@@S@t @l @9X@€@@@`@9C`@Zb@@z@O@Z@@l@@?dZ@`1&@@v@z @;d@@1@$ȴ @E@fQ`@n@;@@ȟ`@l @ (@*x@KE@lvȠ@C`@@@O@M@1@Q @r@@dZ@$ @@`@n@7;d@@W`@xȴ @@E@n@@`@=\(@^@~/@@ff@@33 @ @"9@@C@d=p@ =`@`@ƋC@X@@z@(G@Iʠ@jbM@/@@̸Q@x@9X@/$@O@@p\@O @b@@/@󙙀@ff@@5&`@Ul@v9@@p@1&@@v@C@;G@\1@|@@bM@@@;@@  @Al @b9X@€@E@ă`@C`@b@@&@GO@hZ@@l@ʣ@dZ@ 1&@,@Mv@nz @;d@@`@ȴ @@Q`@3n@S@t`@\(@(@x@@vȠ@933 @Y@z@@M@ =`@ @@@?X@@`$ @G@`@n@/@ `@ $Q@ E@ fE@ $@ @ ȏ\@ \(@ @ */@ K@ lff@@ 33 @ @ δ9@@ @ =p@ 1 =`@ Q`@ rC@ X@@ z@ @ ʠ@ bM@ 7/@ W@ x @ x@ 9X@ $@ @@ `@ =O @ ^b@@ ~/@ @ Z@ &`@l@"9@@Cp@d1&@@v@ƋC@G@1@(@I@jbM@@@;@@̟`@l @(@.€@OE@pvȠ@C`@@@O@M@5@U @v@dZ@$ @@`@z @;;d@@[`@|ȴ @@Q`@n@@ `@A\(@b(@x@@vȠ@33 @ @&@G@hM@ =`@`@ʗ@@X@@ $ @,G@Mʠ@nn@/@`@иQ@x@E@3$@S@t\@O @@/@@ff@@9&`@Y @z9@@@=p@@`@C@?X@@`z@@ʠ@bM@/@@$ @Ex@f9X@$@@@ȃ`@O @ b@@*@K@lZ@@l@Σ@p@1&@0@Qv@rz @G@1@ȴ @@Q`@7@@W;@@x`@l @(@€@E@vȠ@=C`@]@~@O@M@@ @"@@CdZ@d$ @@`@n@;d@@`@(ȴ @I@jE@n@@̟`@\(@ @ .x@ O@ pvȠ@ 33 @ @ @ @!M@!5 =`@!U`@!v@@!X@@!$ @!G@!ʠ@"n@";/@"[`@"|Q@"x@"E@"$@"@# \@#AO @#b@#/@#@#ff@@#&`@$ @$&9@@$Gp@$h=p@$@$v@$ʋC@$G@% z@%,@%M@%nbM@%@@%@%Ь @%l @&9X@&2€@&S@@&t`@&C`@&b@@&@&@'Z@'9@'Yl@'z@'p@'1&@'@'v@(z @(?G@(`1@(ȴ @(@(Q`@(n@);@@)$`@)El @)f(@)x@)E@)vȠ@)C`@* @**@*KO@*lM@*@* @*Η@@*dZ@+$ @+0@+Q`@+rn@+;d@@+`@+ȴ @+@,E@,7n@,W@,x`@,\(@,@,x@,@-vȠ@-=33 @-] @-~@-@-M@- =`@.`@."@@.CX@@.d$ @.G@.ʠ@.bM@./@/@/(Q@/Ix@/j9X@/$@/@@/̏\@/O @0b@@0./@0O@0pff@@0&`@0l@0Ҵ9@@0p@1=p@14@1Uv@1vC@1G@1z@1@1@2bM@2;@@2[@2| @2l @29X@2€@2E@3 `@3AC`@3bb@@3@3O@3Z@3@4l@4&@4GdZ@4h1&@4@4v@4z @4;d@@5 1@5,ȴ @5M@5nQ`@5n@5;@@5П`@5l @6(@62x@6SE@6tvȠ@6C`@6@6@6@7M@79 =`@7Y @7z@@7X@@7$ @7G@7`@8n@8?/@8_`@8Q@8@8E@8$@9@9$\@9E\(@9f@9/@9@9ff@@933 @: @:*9@@:K@:l=p@: =`@:`@:΋C@:X@@;z@;0G@;Qʠ@;rbM@;/@;@;ԸQ@;x@<9X@<7$@v@>"C@>CG@>d1@>@>@>bM@>@@?;@@?( @?Il @?j9X@?€@?E@?̃`@?C`@@b@@@.@@OO@@pZ@@@@l@@ң@@dZ@A$ @A4@AU`@Avz @A;d@@A`@Aȴ @A@BQ`@B;n@B[@B|`@B\(@B(@Bx@B@C vȠ@CA33 @Ca@C@C@CM@C =`@D @D&@@DGX@@Dh$ @DG@D`@Dn@D/@E `@E,Q@EM@EnE@E$@E@EЏ\@E\(@F@F2/@FS@Ftff@@F33 @F @Fִ9@@F@G=p@G8@GY`@GzC@GX@@Gz@G@Gʠ@HbM@H?/@H_@H @Hx@H9X@H$@I@@I$`@IEO @Ifb@@I/@I@IZ@I&`@J l@J*9@@JKp@Jl1&@J@Jv@J΋C@JG@K1@K0ȴ @KQ@KrQ`@K@@K;@@Kԟ`@Kl @L(@L6€@LWE@LxvȠ@LC`@L@L@LO@MM@M=@M] @M~@MdZ@M$ @M@N`@N"z @NC;d@@Nc`@Nȴ @N@NQ`@Nn@O@O(`@OI\(@Oj(@Ox@O@OvȠ@O33 @P @P.@PO@PpM@P =`@P @Pҗ@@PX@@Q$ @Q4G@QUʠ@Qvn@Q/@Q`@QظQ@Qx@RE@R;$@R[@R|\@RO @R@R/@R@S ff@@SA&`@Sa @S9@@S@S=p@S@T`@T&C@TGX@@Thz@T@Tʠ@TbM@T/@U @U, @UMx@Un9X@U€@U@@UЃ`@UC`@Vb@@V2@VS@VtZ@V@Vl@V֣@Vp@W1&@W8@WYv@Wzz @WG@W1@Wȴ @W@XQ`@X?@@X_;@@X`@Xl @X(@X€@YE@Y$vȠ@YEC`@Ye@Y@YO@YM@Y@Z @Z*@ZKdZ@Zl$ @Z@Z`@Zz @Z;d@@[`@[0ȴ @[Q@[rQ`@[n@[@[ԟ`@[\(@\@\6x@\W@\xvȠ@\33 @\ @\@\@]M@]= =`@]]`@]~@@]X@@]$ @]G@^ʠ@^"n@^C/@^c`@^Q@^x@^E@^$@_@_(\@_IO @_j@_/@_@_ff@@_&`@` l@`.9@@`Op@`p=p@`@`v@`ҋC@`G@az@a4@aU@avbM@a@@a@aج @al @b9X@b:€@b[@@b|`@bC`@bb@@b@b@c Z@cA@cal@c@cp@c1&@c@dv@d&z @dG;d@@dh1@dȴ @d@dQ`@dn@e ;@@e,`@eMl @en(@ex@eE@evȠ@eC`@f@f2@fSO@ftM@f@f @f֗@@fdZ@g$ @g8@gY`@gzn@g;d@@g`@gȴ @g@hE@h?n@h_@h`@h\(@h@hx@i@i$vȠ@iE33 @ie @i@i@iM@i =`@j `@j*C@jKX@@jlz@jG@jʠ@jbM@j/@k@k0Q@kQx@kr9X@k$@k@@kԏ\@kO @lb@@l6/@lW@lxff@@l&`@ll@lڴ9@@lp@m=p@m<@m]v@m~C@mG@mz@m@n@n"bM@nC@@nc;@@n @nl @n9X@n€@oE@o(`@oIC`@ojb@@o@oO@oZ@o@p l@p.@pOdZ@pp1&@p@pv@pz @p;d@@q1@q4ȴ @qU@qvQ`@qn@q;@@q؟`@ql @r(@r:x@r[E@r|vȠ@rC`@r@r@rO@s M@sA@sa @s@@sdZ@s$ @s@t`@t&n@tG/@tg`@tQ@t@tE@t$@u @u,\@uM\(@un@u/@u@uff@@u33 @v @v29@@vS@vt=p@v =`@v`@v֋C@vX@@wz@w8G@wYʠ@wzbM@w/@w@wܸQ@wx@x9X@x?$@x_@@x`@xO @xb@@x/@y@y$Z@yE&`@yel@y9@@yp@y1&@y@z v@z*C@zKG@zl1@z@z@zbM@z@@{;@@{0 @{Ql @{r9X@{€@{E@{ԃ`@{C`@|b@@|6@|WO@|xZ@|@|l@|ڣ@|dZ@}1&@}<@}]v@}~z @};d@@}1@}ȴ @~@~"Q`@~Cn@~c@~`@~\(@~(@~x@@(vȠ@I33 @i@@@M@ =`@ @.@@OX@@p$ @G@񀱮`@n@/@`@4Q@U@vE@$@@؏\@\(@@:/@[@|ff@@&`@ @޴9@@@ =p@@@a`@񃂋C@X@@z@@ʠ@&bM@G/@g@񄈬 @x@9X@$@ @@,`@MO @nb@@/@񅯙@Z@&`@l@29@@Sp@t1&@@񆵾v@֋C@G@1@8@Y@zbM@@@;@@ܬ @l @9X@>€@_E@񈀃`@C`@@@O@$M@E@e @񉆣@dZ@$ @@ `@*z @K;d@@k`@ȴ @񊭅@Q`@n@@0`@Q\(@r(@x@񋳩@vȠ@33 @@6@W@xM@ =`@`@ڗ@@X@@$ @x@_@vȠ@33 @ @@@$M@E =`@e`@񙆗@@X@@$ @G@ ʠ@*n@K/@k`@񚌸Q@x@E@$@@0\@QO @r@/@񛳩@ff@@&`@ @69@@W@x=p@@`@ڋC@X@@z@<@]@~bM@@@@ @l @"9X@B€@c@@񞄃`@C`@b@@@@(Z@I@il@񟊣@p@1&@@ v@.z @OG@p1@ȴ @񠱕@Q`@@@;@@4`@Ul @v(@x@񡷶E@vȠ@C`@@:@[O@|M@@ @ޗ@@dZ@ $ @@@a`@n@;d@@`@ȴ @@&E@Gn@g@񤈟`@\(@@x@ @,vȠ@M33 @m @@񥯁@M@ =`@`@2@@SX@@t$ @G@񦵡ʠ@n@/@`@8Q@Yx@z9X@$@@@܏\@O @b@@>/@_@ff@@&`@l@9@@p@$=p@D@ev@񩆋C@G@z@@ @*bM@K@@k@񪌬 @l @9X@€@@@0`@QC`@rb@@@񫳙@Z@@l@6@Wp@x1&@@񬹾v@z @G@1@<ȴ @]@~Q`@n@;@@`@l @"(@Bx@cE@vȠ@C`@@@O@(M@I@i @񯊗@@dZ@$ @@ `@.n@O;d@@o`@ȴ @񰱅@E@n@@4`@U\(@v@/@񱷩@ff@@33 @ @:9@@[@|=p@ =`@`@ދC@X@@ z@@G@aʠ@bM@/@@Q@x@&9X@G$@g@@񴈏\@O @b@@/@ @,ff@@M&`@ml@񵎴9@@p@=p@@v@2C@SG@tz@@񶵕@bM@@@@8 @Yl @z9X@€@񷻶E@܃`@C`@b@@>@_O@Z@@l@@dZ@$1&@D@ev@z @;d@@1@ȴ @ @*Q`@Kn@k;@@񺌟`@l @(@x@E@0vȠ@QC`@q@@񻳍O@M@ =`@ @6@@WX@@x$ @G@񼹮`@n@/@`@@_@ȀM@ȡ =`@ @◍@@X@@$$ @DG@e`@Ɇn@ɧ/@`@Q@ @*E@K$@k@ʌ\@ʭ\(@@/@@0ff@@Q33 @q @˒9@@˳@=p@ =`@`@6C@WX@@xz@̘@̹ʠ@bM@/@@< @]x@~9X@͟$@Ϳ@@`@O @"b@@B/@c@΄Z@Υ&`@l@9@@p@(1&@H@iv@ϊC@ϫG@1@@ @.bM@O@@o;@@А`@бl @(@€@E@4vȠ@UC`@u@і@ѷO@M@@ @:@[dZ@|$ @Ҝ@ҽ`@z @;d@@`@@ȴ @a@ӂQ`@ӣn@@䟾`@\(@&(@Fx@g@ԈvȠ@ԩ33 @@@ @,M@M =`@m @Վ@@կX@@$ @G@`@2n@S/@s`@֔Q@ֵx@E@$@@8\@YO @z@ך/@׻@ff@@&`@ @>9@@_@؀=p@ؠ@`@C@X@@$z@D@eʠ@نbM@٧/@@ @ x@*9X@K$@k@@ڌ`@ڭO @b@@/@@0Z@Q&`@ql@ے9@@۳p@1&@@v@6C@WG@x1@ܘȴ @ܹ@Q`@@@;@@<`@]l @~(@ݞ€@ݿE@vȠ@C`@!@B@cO@ބM@ޥ@ @@dZ@($ @H@i`@ߊz @߫;d@@`@ȴ @ @.Q`@On@o@`@\(@@x@@4vȠ@U33 @u @@᷁@M@ =`@`@:@@[X@@|$ @G@⽡ʠ@n@/@`@@Q@ax@E@$@@\@O @&@F/@g@ff@@&`@ @9@@ @,=p@L@m`@压C@X@@z@@ʠ@2bM@S/@s@攬 @x@9X@€@@@8`@YC`@zb@@@给@Z@@l@>@_p@1&@@v@z @G@$1@Dȴ @e@Q`@@@;@@蟾`@ l @*(@J€@kE@vȠ@C`@@@O@0M@Q@q @뒗@@dZ@$ @@`@6n@W;d@@w`@ȴ @칅@E@n@@<`@]\(@~@x@@vȠ@33 @! @B@c@M@ =`@`@旍@@X@@($ @HG@iʠ@n@/@`@Q@ x@.E@O$@o@\@O @@/@@4ff@@U&`@ul@9@@p@=p@@v@:C@[G@|z@@򽕀@bM@@@@@ @al @9X@€@@@`@C`@&b@@F@g@Z@@l@@ p@,1&@L@mv@z @;d@@1@ȴ @@2Q`@Sn@s;@@`@l @(@x@E@8vȠ@YC`@y@@O@M@@ @>@@_dZ@$ @@`@n@;d@@#`@Dȴ @e@E@n@@蟾`@ \(@*@Jx@k@vȠ@33 @ @@@0M@Q =`@q`@C@X@@z@G@ʠ@6bM@W/@w@Q@x@9X@$@@@<\@]O @~b@@/@@ff@@&`@!l@B9@@cp@=p@@žv@C@G@(z@H@i@bM@@@@ @ l @.9X@N€@o@@`@C`@b@@@@4Z@U@ul@@dZ@1&@@v@:z @[;d@@|1@ȴ @@Q`@n@;@@@`@al @(@x@öE@vȠ@C`@%@F@gO@M@@ @ꗍ@@ dZ@,$ @L@m`@n@/@`@Q@@2E@S$@s@\@\(@@/@@8ff@@Y33 @y @9@@@=p@ =`@`@>C@_X@@z@G@ʠ@bM@ /@ #@ DQ@ ex@ 9X@ $@ @@ \@ O @ *b@@ J/@ k@ ff@@ &`@ l@ 9@@ p@ 0=p@ P@ qv@ C@ G@ 1@ @ @ 6bM@ W@@ w;@@  @ l @ 9X@ €@ E@ <`@ ]C`@ ~b@@ @ O@ Z@@!l@B@cdZ@1&@@žv@z @;d@@(1@Hȴ @i@Q`@n@;@@쟾`@ l @.(@Nx@oE@vȠ@C`@@@O@4M@U@u @@@dZ@$ @G@`@:n@[/@{`@Q@@E@$@@@\@a\(@@/@é@ff@@33 @% @F9@@g@=p@ =`@`@C@ X@@,z@LG@mʠ@bM@/@@ @x@29X@S$@s@@`@O @b@@/@@8Z@Y&`@yl@9@@p@1&@@v@>C@_G@1@@@bM@@@#;@@D @el @9X@€@ǶE@`@ C`@*b@@J@kO@Z@@l@@dZ@01&@P@qv@z @;d@@1@ȴ @@6Q`@Wn@w@`@\(@(@x@@z @(_;d@@(`@(ȴ @(@(Q`@)n@)#@)D`@)e\(@)(@)x@)ǩ@)vȠ@* 33 @*)@*J@*k@*M@* =`@* @*@@+X@@+0$ @+PG@+q`@+n@+/@+`@+Q@,@,6E@,W$@,w@,\@,O @,@,/@-@-n@8_/@8`@8Q@8x@8E@9$@9#@9D\@9eO @9@9/@9ǩ@9ff@@: &`@:) @:J9@@:k@:=p@:@:`@:C@;X@@;0z@;P@;qʠ@;bM@;/@;@; @<x@<69X@@>!v@>Bz @>cG@>1@>ȴ @>ŕ@>Q`@?@@?';@@?H`@?il @?(@?€@?˶E@?vȠ@@ C`@@-@@N@@oO@@M@@@@ @@@AdZ@A4$ @AT@Au`@Az @A;d@@A`@Aȴ @B@B:Q`@B[n@B{@B`@B\(@B(@Bx@C@C@vȠ@Ca33 @C @C@CÁ@CM@D =`@D%`@DF@@DgX@@D$ @DG@Dɡʠ@Dn@E /@E+`@ELQ@Emx@EE@E$@E@E\@FO @F2@FR/@Fs@Fff@@F&`@F @F9@@Gp@G8=p@GX@Gyv@GC@GG@Gz@G@H@H>bM@H_@@H@H @Hl @H9X@I€@I#@@ID`@IeC`@Ib@@I@IǙ@IZ@J @J)l@JJ@Jkp@J1&@J@J;v@Jz @KG@K01@KPȴ @Kq@KQ`@K@@K;@@K`@Ll @L6(@LV€@LwE@LvȠ@LC`@L@L@MO@MQ`@X_n@X;@@X`@Xl @X(@Yx@Y#E@YDvȠ@YeC`@Y@Y@YǍO@YM@Z @Z) @ZJ@@ZkdZ@Z$ @Z@Zͮ`@Zn@[;d@@[/`@[Pȴ @[q@[E@[n@[@[`@\\(@\6@\Vx@\w@\vȠ@\33 @\ @\@]@]E@h_$@h@h\@h\(@h@i/@i#@iDff@@ie33 @i @i9@@iǁ@i=p@j =`@j)`@jJC@jkX@@jz@jG@j͡ʠ@jbM@k/@k/@kPQ@kqx@k9X@k$@k@@k\@lO @l6b@@lV/@lw@lff@@l&`@ll@l9@@mp@m<=p@m\@m}v@mC@mG@mz@n@n!@nBbM@nc@@n;@@n @nl @n9X@o€@o'E@oH`@oiC`@ob@@o@oˍO@oZ@p @p-l@pN@podZ@p1&@p@pѾv@pz @q;d@@q41@qTȴ @qu@qQ`@qn@q;@@q`@rl @r:(@rZx@r{E@rvȠ@rC`@r@r@sO@s@M@sa@s @s@@sdZ@s$ @t@t%`@tFn@tg/@t`@tQ@tɅ@tE@u $@u+@uL\@um\(@u@u/@uϩ@uff@@v33 @v1 @vR9@@vs@v=p@v =`@v`@vC@wX@@w8z@wXG@wyʠ@wbM@w/@w@wQ@xx@x>9X@x_$@x@@x\@xO @xb@@y/@y#@yDff@@ye&`@yl@y9@@yp@y=p@z@z)v@zJC@zkG@z1@z@z͕@zbM@{@@{/;@@{P @{ql @{9X@{€@{ӶE@{`@|C`@|6b@@|V@|wO@|Z@|@|l@|@}dZ@}<1&@}\@}}v@}z @};d@@}1@~ȴ @~!@~BQ`@~cn@~@~`@~\(@~(@x@'@HvȠ@i33 @@@ˁ@M@ =`@- @N@@oX@@$ @G@Ѯ`@n@/@3`@TQ@u@E@$@@\@\(@:@Z/@{@ff@@33 @ @9@@@@=p@a =`@`@򃢋C@X@@z@G@%ʠ@FbM@g/@@򄨬 @x@9X@ $@+@@L`@mO @b@@/@ϙ@Z@&`@1l@R9@@sp@1&@@վv@C@G@81@X@y@bM@@@;@@ @l @>9X@^€@E@򈠃`@C`@b@@@#O@DZ@e@l@򉦣@dZ@1&@@)v@Jz @k;d@@1@ȴ @ͅ@Q`@n@/@P`@q\(@(@x@ө@vȠ@33 @5@V@w@M@ =`@ @@@X@@<$ @\G@}`@n@/@`@Q@!@BE@c$@@򎤏\@\(@@/@'@Hff@@i33 @ @򏪴9@@ˁ@=p@ =`@-`@NC@oX@@z@G@ѡʠ@bM@/@3@T @ux@9X@$@@@`@O @:b@@Z/@{@Z@&`@l@9@@p@@1&@`@򓁾v@򓢋C@G@1@@%@FbM@g@@;@@򔨬 @l @(@ €@+E@LvȠ@mC`@@@ύO@M@@1 @R@sdZ@$ @@ծ`@z @;d@@7`@Xȴ @y@Q`@n@@`@\(@>(@^x@@vȠ@33 @@@#@DM@e =`@ @򙦗@@X@@$ @G@)`@Jn@k/@`@򚬸Q@ͅ@E@$@/@P\@qO @@/@ө@ff@@&`@5 @V9@@w@=p@@`@C@X@@<z@\@}ʠ@bM@/@@ @!x@B9X@c$@@@򞤃`@O @b@@/@'@HZ@i&`@l@򟪴9@@p@1&@ @-v@NC@oG@1@@ѕ@bM@@@3;@@T`@ul @(@€@׶E@vȠ@C`@9@Z@{O@M@@ @@dZ@@$ @`@򣁮`@z @;d@@`@ȴ @%@FQ`@gn@@򤨟`@\(@(@ x@+@LvȠ@m33 @@@ρ@M@ =`@1 @R@@sX@@$ @G@ծ`@n@/@7`@XQ@yx@E@$@@\@O @>@^/@@ff@@&`@ @9@@#@D=p@d@`@򩦋C@X@@z@@)ʠ@JbM@k/@@򪬬 @x@9X@$@/@@P`@qO @b@@/@ә@Z@&`@5l@V9@@wp@1&@@پv@C@G@<1@\@}@Q`@@@;@@`@!l @B(@b€@򮃶E@vȠ@C`@@@'O@HM@i@ @򯪣@dZ@$ @ @-`@Nz @o;d@@`@ȴ @х@Q`@n@3@T`@u\(@@x@ש@vȠ@33 @9 @Z@{@M@ =`@`@@@X@@@$ @`G@򳁡ʠ@n@/@`@Q@%x@FE@g$@@򴨏\@O @@ /@+@Lff@@m&`@ @򵮴9@@ρ@=p@@1`@RC@sX@@z@@աʠ@bM@/@7@X @yx@9X@€@@@`@C`@>b@@^@@Z@@l@@#p@D1&@d@򹅾v@z @G@1@ȴ @)@JQ`@k@@;@@򺬟`@l @(@€@/E@PvȠ@qC`@@@ӍO@M@@5 @V@wdZ@$ @@ٮ`@z @;d@@;`@\ȴ @}@Q`@n@@`@!\(@B@bx@򾃩@vȠ@33 @ @@'@HM@i =`@`@򿪗@@X@@$ @ G@-ʠ@Nn@o/@`@Q@x@E@$@3@T\@uO @@/@ש@ff@@&`@9 @Z9@@{@œ=p@¼@`@C@X@@@z@`@Áʠ@âbM@/@@ @%l @F9X@f€@ć@@Ĩ`@C`@b@@ @+@LZ@m@ōl@Ů@p@1&@@1v@Rz @sG@Ɣ1@ƴȴ @Օ@Q`@@@7;@@X`@yl @ǚ(@Ǻ€@۶E@vȠ@C`@=@^@O@ȠM@@ @@@#dZ@D$ @d@Ʌ`@ɦn@;d@@`@ȴ @)@JE@kn@ʋ@ʬ`@\(@@x@/@PvȠ@q33 @ˑ @˲@Ӂ@M@ =`@5`@V@@wX@@̘$ @̸G@١ʠ@n@/@;`@\Q@}x@͞E@Ϳ$@@\@!O @Bb@@b/@΃@Τff@@&`@l@9@@'p@H=p@h@ωv@ϪC@G@z@ @-@NbM@o@@Џ@а @l @9X@€@3@@T`@uC`@іb@@Ѷ@י@Z@@9l@Z@{p@Ҝ1&@Ҽ@ݾv@z @G@@1@`ȴ @Ӂ@ӢQ`@@@;@@`@%l @F(@fx@ԇE@ԨvȠ@C`@@ @+O@LM@m@Ս @ծ@@dZ@$ @@1`@Rn@s;d@@֓`@ִȴ @Յ@E@n@7@X`@y\(@ך@׺x@۩@vȠ@33 @= @^@@ؠM@ =`@`@@@#X@@D$ @dG@مʠ@٦n@/@`@Q@)x@JE@k$@ڋ@@ڬ\@O @b@@/@/@Pff@@q&`@ۑl@۲9@@p@=p@@5v@VC@wG@ܘz@ܸ@ٕ@bM@@@;@\ @}l @ݞ9X@ݾ€@@@`@!C`@Bb@@b@ރ@ޤZ@@l@@'p@H1&@h@߉v@ߪz @G@1@ ȴ @-@NQ`@o@@;@@ట`@l @(@x@3E@TvȠ@uC`@@@׍O@M@@9 @Z@@{dZ@$ @@ݮ`@n@;d@@?`@`ȴ @ぅ@E@n@@`@%\(@F@fx@䇩@vȠ@33 @ @ @+@LM@m =`@`@宗@@X@@$ @G@1ʠ@Rn@s/@`@洸Q@x@9X@$@7@@X\@yO @b@@/@ۙ@ff@@&`@=l@^9@@p@=p@@v@C@#G@Dz@d@酕@bM@@@@ @)l @J9X@j€@@@ꬃ`@C`@b@@@/O@PZ@q@l@벣@dZ@1&@@5v@Vz @w;d@@1@ȴ @ٕ@Q`@n@;;@@\`@}l @(@x@߶E@vȠ@!C`@A@b@O@M@@ @@@'dZ@H$ @h@`@n@;d@@`@ ȴ @-@NE@on@@𰟾`@\(@@/@3@Tff@@u33 @ @9@@ׁ@=p@ =`@9`@ZC@{X@@z@G@ݡʠ@bM@/@?@`Q@x@9X@$@@@\@%O @Fb@@f/@􇙙@ff@@&`@l@ 9@@+p@L=p@l@v@C@G@z@@1@RbM@s@@@ @l @9X@€@7E@X`@yC`@b@@@ۍO@Z@@=l@^@dZ@1&@@v@z @#;d@@D1@dȴ @@Q`@n@;@@`@)l @J(@jx@E@vȠ@C`@@@/O@PM@q@ @@@dZ@$ @@5`@Vn@w;d@@`@ȴ @م@E@n@;@\\@}\(@@/@ߩ@ff@@!33 @A @b9@@@=p@ =`@`@C@'X@@Hz@hG@ʠ@bM@/@@ Q@-x@N9X@o$@@@\@O @b@@/@3@Tff@@u&`@l@9@@p@=p@@9v@ZC@{G@z@@ݕ@bM@@@?@` @l @9X@€@E@`@%C`@Fb@@f@O@Z@@l@ @+dZ@L1&@l@v@z @;d@@1@ȴ @1@RQ`@sn@;@@`@l @(@x@7E@XvȠ@yC`@@@ۍO@M@@= @^@@dZ@$ @@`@ n@ #;d@@ C`@ dȴ @ @ E@ $@ @ \@ )\(@ J@ j/@ @ ff@@ 33 @ @ 9@@ /@ P=p@ q =`@ `@ C@ X@@ z@ G@ 5ʠ@ VbM@ w/@ @ Q@ x@ 9X@ $@ ;@@ \\@ }O @ b@@ /@ ߙ@ff@@!&`@Al@b9@@p@=p@@v@C@'G@Hz@h@@bM@@@;@@  @-l @N9X@n€@E@`@C`@b@@@3O@TZ@u@l@@dZ@1&@@9v@Zz @{;d@@1@ȴ @ݕ@Q`@n@?;@@``@l @(@x@@vȠ@%33 @E@f@@M@ =`@ @ @@+X@@L$ @lG@`@n@/@`@Q@1@RE@s$@@\@\(@@/@7@Xff@@y33 @ @9@@ہ@=p@ =`@=`@^C@X@@z@G@ʠ@bM@#/@C@dQ@x@9X@$@@@`@)O @Jb@@j/@@Z@&`@l@9@@/p@P1&@p@v@C@G@1@@5@VbM@w@@;@@ @l @9X@€@;E@\`@}C`@b@@@ߍO@Z@!@Al@b@dZ@1&@@v@z @';d@@H1@hȴ @@Q`@n@;@@ `@ -\(@ N(@ nx@ @ vȠ@ 33 @ @!@!3@!TM@!u =`@! @!@@!X@@!$ @"G@"9`@"Zn@"{/@"`@"Q@"݅@"E@#$@#?@#`\@#\(@#@#/@#@$ff@@$%33 @$E @$f9@@$@$=p@$ =`@$`@% C@%+X@@%Lz@%lG@%ʠ@%bM@%/@%@&Q@&1x@&R9X@&s$@&@@&`@&O @&b@@'/@'7@'XZ@'y&`@'l@'9@@'p@'1&@(@(=v@(^C@(G@(1@(@(ᕀ@)bM@)#@@)C;@@)d @)l @)9X@)€@)E@*`@*)C`@*Jb@@*j@*O@*Z@*@*l@+@+/dZ@+P1&@+p@+v@+z @+;d@@+1@,ȴ @,5@,VQ`@,wn@,@,`@,\(@,(@-x@-;@-\vȠ@-}33 @-@-@-߁@.M@.! =`@.A @.b@@.X@@.$ @.G@.`@/n@/'/@/G`@/hQ@/@/E@/$@/@0 \@0-\(@0N@0n/@0@0ff@@033 @0 @19@@13@1T=p@1u =`@1`@1C@1X@@1z@2G@29ʠ@2ZbM@2{/@2@2 @2x@29X@3$@3?@@3``@3O @3b@@3/@3㙙@4Z@4%&`@4El@4f9@@4p@41&@4@4v@5 C@5+G@5L1@5l@5@5bM@5@@5;@@6 @61l @6R9X@6r€@6E@6`@6C`@6b@@7@77O@7XZ@7y@7l@7@7dZ@71&@8@8=v@8^z @8;d@@81@8ȴ @8@9Q`@9#n@9C@9d`@9\(@9(@9x@9@:vȠ@:)33 @:I@:j@:@:M@: =`@: @;@@;/X@@;P$ @;pG@;`@;n@;/@;`@<Q@<5@=p@> @>A`@>bC@>X@@>z@>@>ʠ@?bM@?'/@?G@?h @?x@?9X@?$@?@@@ `@@-O @@Nb@@@n/@@@@Z@@&`@@l@A9@@A3p@AT1&@At@Av@AC@AG@A1@B@B9@BZbM@B{@@B;@@B @Bl @B(@C€@C?E@C`vȠ@CC`@C@C@CO@DM@D%@DE @Df@DdZ@D$ @D@D`@E z @E+;d@@EK`@Elȴ @E@EQ`@En@E@F`@F1\(@FR(@Frx@F@FvȠ@F33 @F@G@G7@GXM@Gy =`@G @G@@GX@@G$ @HG@H=`@H^n@H/@H`@HQ@H@IE@I#$@IC@Id\@IO @I@I/@I@Jff@@J)&`@JI @Jj9@@J@J=p@J@J`@KC@K/X@@KPz@Kp@Kʠ@KbM@K/@K@L @L5x@LV9X@Lw$@L@@L`@LO @Lb@@M/@M;@M\Z@M}&`@Ml@M9@@Mp@N1&@N @NAv@NbC@NG@N1@N@N啀@ObM@O'@@OG;@@Oh`@Ol @O(@O€@OE@P vȠ@P-C`@PM@Pn@PO@PM@P@P @Q@Q3dZ@QT$ @Qt@Q`@Qz @Q;d@@Q`@Rȴ @R9@RZQ`@R{n@R@R`@R\(@R(@Sx@S?@S`vȠ@S33 @S@S@S@TM@T% =`@TE @Tf@@TX@@T$ @TG@T`@U n@U+/@UK`@UlQ@Ux@UE@U$@U@V\@V1O @VR@Vr/@V@Vff@@V&`@V @W9@@W7@WX=p@Wx@W`@WC@WX@@Wz@X@X=ʠ@X^bM@X/@X@X @Xx@Y9X@Y#$@YC@@Yd`@YO @Yb@@Y/@Y癙@ZZ@Z)&`@ZIl@Zj9@@Zp@Z1&@Z@Zv@[C@[/G@[P1@[p@[@[Q`@[@@[;@@\`@\5l @\V(@\v€@\E@\vȠ@\C`@\@]@];O@]\M@]}@] @]@]dZ@^$ @^ @^A`@^bz @^;d@@^`@^ȴ @^@_Q`@_'n@_G@_h`@_\(@_(@_x@_@` vȠ@`-33 @`M@`n@`@`M@` =`@` @a@@a3X@@aT$ @atG@a`@an@a/@a`@bQ@b9x@bZE@b{$@b@b\@bO @b@c/@c?@c`ff@@c&`@c @c´9@@c@d=p@d$@dE`@dfC@dX@@dz@d@dʠ@e bM@e+/@eK@el @ex@e9X@e$@e@@f`@f1O @fRb@@fr/@f@fZ@f&`@fl@g9@@g7p@gX1&@gx@gv@gC@gG@g1@hȴ @h=@h^Q`@h@@h;@@h`@hl @i(@i"€@iCE@idvȠ@iC`@i@i@iO@jM@j)@jI @jj@jdZ@j$ @j@j`@kz @k/;d@@kO`@kpȴ @k@kQ`@kn@k@l`@l5\(@lV(@lvx@l@lvȠ@l33 @l@m@m;@m\M@m} =`@m @m@@mX@@n$ @n G@nAʠ@nbn@n/@n`@nĸQ@nx@oE@o'$@oG@oh\@oO @o@o/@o@p ff@@p-&`@pM @pn9@@p@p=p@p@p`@qC@q3X@@qTz@qt@qʠ@qbM@q/@q@r @r9x@rZ9X@r{$@r@@r`@rO @rb@@s/@s?@s`Z@s&`@sl@s´9@@sp@t1&@t$@tEv@tfz @tG@t1@tȴ @t镀@u Q`@u+@@uK;@@ul`@ul @u(@u€@uE@vvȠ@v1C`@vQ@vr@vO@vM@v@v @w@w7dZ@wX$ @wx@w`@wz @w;d@@w`@xȴ @x=@x^Q`@xn@x@x`@x\(@y(@y"x@yC@ydvȠ@y33 @y@y@y@zM@z) =`@zI`@zj@@zX@@z$ @zG@zʠ@{n@{//@{O`@{pQ@{x@{E@{$@{@|\@|5O @|V@|v/@|@|ff@@|&`@| @}9@@};@}\=p@}|@}`@}C@}X@@~z@~ @~Aʠ@~bbM@~/@~@~Ĭ @~x@9X@'$@G@@h`@O @b@@/@뙙@ Z@-&`@Ml@n@p@1&@@v@z @3G@T1@tȴ @󁕕@Q`@@@;@@`@9l @Z(@z€@󂛶E@vȠ@C`@@@?O@`M@@ @£@dZ@$ @$@E`@fz @;d@@`@ȴ @@ Q`@+n@K@l`@\(@(@x@@vȠ@133 @Q@r@󆓁@M@ =`@`@@@7X@@X$ @xG@󇙡ʠ@n@/@`@Q@=x@^E@$@@\@O @@"/@C@dff@@&`@ @ƴ9@@@=p@(@I`@jC@X@@z@@핀@bM@/@@O@p @l @9X@€@@@`@5C`@Vb@@v@󌗙@Z@@l@@;p@\1&@|@󍝾v@z @G@1@ ȴ @A@bQ`@@@;@@ğ`@l @(@&€@GE@hvȠ@C`@@@O@ M@-@M @n@dZ@$ @@`@n@3;d@@S`@tȴ @󑕅@E@n@@`@9\(@Z@zx@󒛩@vȠ@33 @ @@?@`M@ =`@`@—@@X@@$ @$G@Eʠ@fn@/@`@ȸQ@x@ E@+$@K@l\@O @@/@@ff@@1&`@Q @r9@@󖓁@=p@@v@C@7G@Xz@x@󗙕@bM@@@@ @=l @^9X@~€@@@`@C`@b@@"@C@dZ@@l@ƣ@p@1&@(@Iv@jz @G@1@ȴ @핀@Q`@/@@O;@@p`@l @(@€@E@vȠ@5C`@U@v@󜗍O@M@@ @@@;dZ@\$ @|@󝝮`@n@;d@@`@ ȴ @A@bE@n@@ğ`@\(@@&x@G@hvȠ@33 @ @@@ M@- =`@M`@n@@X@@$ @G@ʠ@n@3/@S`@tQ@x@E@$@@\@9O @Z@z/@󢛩@ff@@&`@ @9@@?p@`=p@@󣡾v@‹C@G@z@$@E@fbM@@@@Ȭ @l @ 9X@*€@K@@l`@C`@b@@@@Z@1@Ql@r@p@1&@@v@z @7G@X1@xȴ @󧙕@Q`@@@;@@`@=l @^(@~€@󨟶E@vȠ@C`@@"@CO@dM@@ @Ɨ@@dZ@$ @(@I`@jn@;d@@`@ȴ @@E@/n@O@p`@\(@@x@@vȠ@533 @U @v@󬗁@M@ =`@`@@@;X@@\$ @|G@󭝡ʠ@n@/@`@ Q@Ax@bE@$@@ď\@O @@&/@G@hff@@&`@l@ʴ9@@p@ =p@,@Mv@nC@G@z@@@bM@3@@S@t @l @9X@€@@@`@9C`@Zb@@z@󲛙@Z@@l@@?p@`1&@@󳡾v@z @G@1@$ȴ @E@fQ`@@@;@@ȟ`@l @ (@*€@KE@lvȠ@C`@@@O@M@1@Q @r@@dZ@$ @@`@n@7;d@@W`@xȴ @󷙅@E@n@@`@=\(@^@~x@󸟩@vȠ@33 @ @"@C@dM@ =`@`@Ɨ@@X@@$ @(G@Iʠ@jn@/@`@̸Q@x@E@/$@O@p\@O @@/@󙙀@ff@@5&`@Ul@v9@@p@=p@@v@C@;G@\z@|@󽝕@bM@@@@  @Al @b9X@€@@@ă`@C`@b@@&@G@hZ@@l@ʣ@p@ 1&@,@Mv@nz @G@1@ȴ @@Q`@3@@S;@@t`@l @(@€@E@vȠ@9C`@Y@z@›O@¼M@@ @@@?dZ@`$ @À@á`@n@;d@@`@$ȴ @E@fE@ćn@ħ@ȟ`@\(@ @*x@K@lvȠ@ō33 @ŭ @@@M@1 =`@Q`@r@@ƓX@@ƴ$ @G@ʠ@n@7/@W`@xQ@Ǚx@ǺE@$@@\@=O @^b@@~/@ȟ@ff@@&`@l@"9@@Cp@d=p@Ʉ@ɥv@ƋC@G@z@(@I@jbM@ʋ@@ʫ@̬ @l @9X@.€@O@@p`@ˑC`@˲b@@@󙙀@Z@5@Ul@v@̗p@̸1&@@v@z @;G@\1@|ȴ @͝@;Q`@@@;@@ `@Al @b(@΂x@ΣE@vȠ@C`@@&@GO@hM@ω@ϩ @ʗ@@dZ@ $ @,@M`@nn@Џ;d@@Я`@ȴ @@E@3n@S@t`@ѕ\(@Ѷ@x@@vȠ@933 @Y @z@қ@ҼM@ =`@`@@@?X@@`$ @ӀG@ӡʠ@n@/@`@$Q@Ex@f9X@ԇ$@ԧ@@ȏ\@O @ b@@*/@K@lff@@Ս&`@խl@δ9@@p@=p@0@Qv@rC@֓G@ִz@@@bM@7@@W@x @יl @׺9X@€@@@`@=C`@^b@@~@؟@Z@@l@"@Cp@d1&@ل@٥v@z @G@1@(ȴ @I@jQ`@ڋn@ګ;@@̟`@l @(@.x@OE@pvȠ@ۑC`@۱@@O@M@5@U @v@@ܗdZ@ܸ$ @@`@n@;;d@@[`@|ȴ @ݝ@ݾE@n@@ `@A\(@b@ނx@ޣ@vȠ@33 @ @&@G@hM@߉ =`@ߩ`@ʗ@@X@@ $ @,G@Mʠ@nn@/@@иQ@x@9X@3$@S@@t\@O @b@@/@@ff@@9&`@Yl@z9@@p@=p@@v@C@?G@`z@@㡕@bM@@@@$ @El @f9X@€@@@ȃ`@C`@ b@@*@K@lZ@@l@Σ@p@1&@0@Qv@rz @G@1@ȴ @@Q`@7n@W;@@x`@l @(@x@E@vȠ@=C`@]@~@蟍O@M@@ @"@@CdZ@d$ @@饮`@n@;d@@`@(ȴ @I@jE@n@@̟`@\(@@.x@O@pvȠ@33 @ @@@M@5 =`@U`@v@@X@@$ @G@ʠ@bM@;/@[@|Q@x@9X@$@@@ \@AO @bb@@/@@ff@@&`@l@&9@@Gp@h=p@@奄v@ʋC@G@ z@,@M@nbM@@@@Ь @l @9X@2€@S@@t`@C`@b@@@@Z@9@Yl@z@p@1&@@v@z @?;d@@`1@ȴ @󡕀@Q`@n@;@@$`@El @f(@x@E@vȠ@C`@ @*@KO@lM@@ @Η@@dZ@$ @0@Q`@rn@;d@@`@ȴ @@E@7n@W@x`@\(@@x@@vȠ@=33 @] @~@@M@ =`@`@"@@CX@@dz@G@ʠ@bM@/@@(Q@Ix@j9X@$@@@̏\@O @b@@./@O@pff@@&`@l@Ҵ9@@p@=p@4@Uv@vC@G@z@@@bM@;@@[@| @l @9X@€@@@ `@AC`@bb@@@@Z@@l@&@Gp@h1&@@v@z @;d@@ 1@,ȴ @M@nQ`@n@;@@П`@l @(@2x@SE@tvȠ@C`@@@O@M@9@Y @z@@dZ@$ @@`@n@?;d@@_`@ȴ @@E@n@@$`@E\(@f@x@@vȠ@33 @ @*@K@lM@ =`@`@΋C@X@@z@0G@Qʠ@rbM@/@@ԸQ@x@9X@7$@W@@x\@O @b@@/@@ff@@=&`@]l@~9@@p@=p@@ v@ "C@ CG@ dz@ @ @ bM@ @@ @ ( @ Il @ j9X@ €@ @@ ̃`@ C`@ b@@ .@ O@ pZ@ @ l@ ң@ dZ@ 1&@ 4@ Uv@ vz @ ;d@@ 1@ ȴ @ @ Q`@ ;n@ [;@@ |`@ l @ (@ x@ E@ vȠ@AC`@a@@O@M@@ @&@@GdZ@h$ @@`@n@/@ `@,Q@M@nE@$@@Џ\@\(@@2/@S@tff@@33 @ @ִ9@@@=p@9 =`@Y`@zC@X@@z@G@ʠ@bM@?/@_@Q@x@9X@$@@@$\@EO @fb@@/@@ff@@&`@ l@*9@@Kp@l=p@@v@΋C@G@z@0@Q@rbM@@@@Ԭ @l @9X@6€@W@@x`@C`@b@@@O@Z@=@]l@~@dZ@1&@@v@"z @C;d@@d1@ȴ @@Q`@n@;@@(`@Il @j(@x@E@vȠ@C`@ @.@OO@pM@@ @җ@@dZ@$ @4G@U`@vn@/@`@ظQ@@E@;$@[@|\@\(@@/@@ ff@@A33 @a @9@@@=p@ =`@`@&C@GX@@hz@G@ʠ@bM@/@ @ ,Q@ Mx@ n9X@ $@ @@ Џ\@ O @!b@@!2/@!S@!tff@@!&`@!l@!ִ9@@!p@"=p@"8@"Yv@"zC@"G@"1@"@"@#bM@#?@@#_;@@# @#l @#9X@#€@$E@$$`@$EC`@$fb@@$@$O@$Z@$@% l@%*@%KdZ@%l1&@%@%v@%z @%;d@@&1@&0ȴ @&Q@&rQ`@&n@&;@@&ԟ`@&l @'(@'6x@'WE@'xvȠ@'C`@'@'@'O@(M@(=@(] @(~@@(X@@($ @(G@)`@)"n@)C/@)c`@)Q@)@)E@)$@*@*(\@*I\(@*j@*/@*@*ff@@*33 @+ @+.9@@+O@+p=p@+ =`@+`@+ҋC@+X@@,z@,4G@,Uʠ@,vbM@,/@,@,ظQ@,x@-9X@-;$@-[@@-|\@-O @-b@@-/@-@. ff@@.A&`@.al@.9@@.p@.1&@.@/v@/&C@/GG@/h1@/@/@/bM@/@@0 ;@@0, @0Ml @0n9X@0€@0E@0Ѓ`@0C`@1b@@12@1SO@1tZ@1@1l@1֣@1dZ@21&@28@2Yv@2zz @2;d@@21@2ȴ @2@3Q`@3?n@3_;@@3`@3l @3(@3x@4E@4$vȠ@4EC`@4e@4@4@4M@4 =`@5 @5*@@5KX@@5l$ @5G@5`@5n@5/@6`@60Q@6Q@6rE@6$@6@6ԏ\@6\(@7@76/@7W@7xff@@733 @7 @7ڴ9@@7@8=p@8= =`@8]`@8~C@8X@@8z@8G@9ʠ@9"bM@9C/@9c@9Q@9x@99X@9$@:@@:(\@:IO @:jb@@:/@:@:Z@:&`@; l@;.9@@;Op@;p1&@;@;v@;ҋC@;G@<1@<4@ Z@>A@>al@>@>dZ@>1&@>@?v@?&z @?G;d@@?h1@?ȴ @?@?Q`@?n@@ ;@@@,`@@Ml @@n(@@x@@E@@vȠ@@33 @A@A2@AS@AtM@A =`@A @A֗@@AX@@B$ @B8G@BY`@Bzn@B/@B`@BܸQ@B@CE@C?$@C_@C\@C\(@C@C/@D@D$ff@@DE33 @De @D9@@D@D=p@D =`@E `@E*C@EKX@@Elz@EG@Eʠ@EbM@E/@F@F0Q@FQx@Fr9X@F$@F@@Fԏ\@FO @Gb@@G6/@GW@GxZ@G&`@Gl@Gڴ9@@Gp@H1&@H<@H]v@H~C@HG@H1@H@I@I"bM@IC@@Ic;@@I @Il @I9X@I€@JE@J(`@JIC`@Jjb@@J@JO@JZ@J@K l@K.@KOdZ@Kp1&@K@Kv@Kz @K;d@@L1@L4ȴ @LU@LvQ`@Ln@L;@@L؟`@Ll @M(@M:x@M[@M|vȠ@M33 @M@M@M@N M@NA =`@Na @N@@NX@@N$ @NG@O`@O&n@OG/@Og`@OQ@O@OE@O$@P @P,\@PM\(@Pn@P/@P@Pff@@P33 @Q @Q29@@QS@Qt=p@Q =`@Q`@Q֋C@QX@@Rz@R8G@RYʠ@RzbM@R/@R@RܸQ@Rx@S9X@S?$@S_@@S`@SO @Sb@@S/@T@T$Z@TE&`@Tel@T9@@Tp@T1&@T@U v@U*C@UKG@Ul1@U@U@UbM@U@@V;@@V0 @VQl @Vr9X@V€@VE@Vԃ`@VC`@Wb@@W6@WWO@WxZ@W@Wl@Wڣ@WdZ@X1&@X<@X]v@X~z @X;d@@X1@Xȴ @Y@Y"Q`@YCn@Yc;@@Y`@Y\(@Y(@Yx@Z@Z(vȠ@ZI33 @Zi@Z@Z@ZM@Z =`@[ @[.@@[OX@@[p$ @[G@[`@[n@[/@\`@\4Q@\U@\vE@\$@\@\؏\@\\(@]@]:/@][@]|ff@@]33 @] @]޴9@@]@^ =p@^A =`@^a`@^C@^X@@^z@^G@_ʠ@_&bM@_G/@_g@_Q@_x@_9X@_$@` @@`,`@`MO @`nb@@`/@`@`Z@`&`@al@a29@@aSp@at1&@a@av@a֋C@aG@b1@b8@bY@bzbM@b@@b;@@bܬ @bl @c9X@c>€@c_E@c`@cC`@cb@@c@dO@d$Z@dE@del@d@ddZ@d1&@d@e v@e*z @eK;d@@el1@eȴ @e@eQ`@en@f@f0`@fQ\(@fr(@fx@f@fvȠ@f33 @g@g6@gW@gxM@g =`@g @gڗ@@gX@@h$ @hx@s_@svȠ@s33 @s@s@t@t$M@tE =`@te @t@@tX@@t$ @tG@u `@u*n@uK/@uk`@uQ@u@uE@u$@v@v0\@vQ\(@vr@v/@v@vff@@v33 @w @w69@@wW@wx=p@w =`@w`@wڋC@wX@@xz@x<@x]ʠ@x~bM@x/@x@x @yx@y"9X@yC$@yc@@y`@yO @yb@@y/@z@z(Z@zI&`@zil@z9@@zp@z1&@z@{ v@{.C@{OG@{p1@{@{@{bM@{@@|;@@|4 @|Ul @|v9X@|€@|E@|؃`@|C`@}b@@}:@}[O@}|Z@}@}l@}ޣ@}dZ@~ 1&@~@@~a`@~z @~;d@@~`@~ȴ @@&Q`@Gn@g@`@\(@(@x@ @,vȠ@M33 @m@@􀯁@M@ =`@ @2@@SX@@t$ @G@􁵮`@n@/@`@8Q@Y@zE@$@@܏\@\(@@>/@_@ff@@33 @ @9@@@$=p@E =`@e`@􄆋C@X@@z@@ ʠ@*bM@K/@k@􅌬 @x@9X@$@@@0`@QO @rb@@/@􆳙@Z@&`@l@69@@Wp@x1&@@􇹾v@ڋC@G@1@<@]@~bM@@@;@@ @l @"9X@B€@cE@􉄃`@C`@b@@@O@(Z@I@il@􊊣@dZ@$ @@ `@.z @O;d@@o`@ȴ @􋱅@Q`@n@@4`@U\(@v(@x@􌷩@vȠ@33 @@:@[@|M@ =`@ @ޗ@@X@@ $ @@G@a`@n@/@`@Q@@&E@G$@g@􏈏\@\(@@/@ @,ff@@M33 @m @9@@@=p@@`@2C@SX@@tz@@ʠ@bM@/@@8 @Yx@z9X@$@@@܃`@O @b@@>/@_@Z@&`@l@9@@p@$1&@D@ev@C@G@1@@ @*bM@K@@k;@@ @l @9X@€@E@0`@QC`@rb@@@O@Z@@ @6@WdZ@x$ @@`@z @;d@@`@<ȴ @]@~Q`@n@@`@\(@"(@Bx@c@vȠ@33 @@@@(M@I =`@i @@@X@@$ @G@ `@.n@O/@o`@Q@@E@$@@4\@U\(@v@/@@ff@@33 @ @:9@@[@|=p@@`@ދC@X@@ z@@@aʠ@bM@/@@ @x@&9X@G$@g@@`@O @b@@/@ @,Z@M&`@ml@9@@p@1&@@v@2z @SG@t1@ȴ @@Q`@@@;@@8`@Yl @z(@€@E@vȠ@C`@@>@_O@M@@ @@dZ@$$ @D@e`@z @;d@@`@ȴ @ @*Q`@Kn@k@`@\(@(@x@@0vȠ@Q33 @q@@@M@ =`@ @6@@WX@@x$ @G@ʠ@n@/@`@@_@M@ =`@`@◍@@X@@$$ @DG@eʠ@n@/@`@Q@ x@*E@K$@k@\@O @@/@@0ff@@Q&`@q @9@@@=p@@`@6C@WX@@xz@@ʠ@bM@/@@< @]x@~9X@$@@@`@O @"b@@B/@c@Z@&`@l@@p@(1&@H@iv@z @G@1@ȴ @ @.Q`@O@@o;@@`@l @(@€@E@4vȠ@UC`@u@@O@M@@ @:@[dZ@|$ @@`@z @;d@@`@@ȴ @a@Q`@n@@䟾`@\(@&(@Fx@g@vȠ@33 @@@ @,M@M =`@m`@@@X@@$ @G@ʠ@2n@S/@s`@Q@x@E@$@@8\@YO @z@š/@»@ff@@&`@ @>9@@_@À=p@à@`@C@X@@$z@D@eʠ@ĆbM@ħ/@@ @ x@*9X@K$@k@@Ō`@ŭO @b@@/@@0Z@Q@ql@ƒ@Ƴp@1&@@v@6z @WG@x1@ǘȴ @ǹ@Q`@@@;@@<`@]l @~(@Ȟ€@ȿE@vȠ@C`@!@B@cO@ɄM@ɥ@ @@dZ@($ @H@i`@ʊz @ʫ;d@@`@ȴ @ @.Q`@On@o@ː`@˱\(@(@x@@4vȠ@U33 @u @̖@̷@M@ =`@`@:@@[X@@|$ @͜G@ͽʠ@n@/@`@@Q@ax@΂E@Σ$@@\@O @&@F/@g@ψff@@ϩ&`@ @9@@ @,=p@L@m`@ЎC@ЯX@@z@@ʠ@2bM@S/@s@є @ѵx@9X@$@@@8`@YC`@zb@@Қ@һ@Z@@l@>@_p@Ӏ1&@Ӡ@v@z @G@$1@Dȴ @e@ԆQ`@ԧ@@;@@蟾`@ l @*(@J€@kE@ՌvȠ@խC`@@@O@0M@Q@q @֒@ֳdZ@$ @@`@6z @W;d@@w`@טȴ @׹@Q`@n@@<`@]\(@~@؞x@ؿ@vȠ@33 @! @B@c@لM@٥ =`@`@旍@@X@@($ @HG@iʠ@ڊn@ګ/@`@Q@ x@.E@O$@o@ې\@۱O @@/@@4ff@@U&`@u @ܖ9@@ܷ@=p@@`@:C@[X@@|z@ݜ@ݽʠ@bM@/@@@ @ax@ނ9X@ޢ€@@@`@C`@&b@@F@g@߈Z@ߩ@l@@ p@,1&@L@mv@z @G@1@ȴ @@2Q`@S@@s;@@ᔟ`@l @(@€@E@8vȠ@YC`@y@@⻍O@M@@ @>@_dZ@$ @@`@z @;d@@#`@Dȴ @e@Q`@n@@蟾`@ \(@*@Jx@k@vȠ@33 @ @@@0M@Q =`@q`@撗@@X@@$ @G@ʠ@6n@W/@w`@瘸Q@x@E@$@@<\@]O @~@/@迩@ff@@&`@!l@B9@@cp@=p@@žv@C@G@(z@H@i@bM@@@@ @ l @.9X@N€@o@@됃`@C`@b@@@@4Z@U@ul@얣@p@1&@@v@:z @[G@|1@ȴ @@Q`@@@;@@@`@al @(@€@öE@vȠ@C`@%@F@gO@M@@ @ꗍ@@ dZ@,$ @L@m`@n@;d@@`@ȴ @@2E@Sn@s@񔟾`@\(@@x@@8vȠ@Y33 @y @@@M@ =`@`@>@@_X@@$ @G@ʠ@n@/@#`@DQ@ex@E@$@@\@ O @*b@@J/@k@ff@@&`@l@9@@p@0=p@P@qv@C@G@z@@@6bM@W@@w@ @l @9X@€@@@<`@]C`@~b@@@@Z@@!l@B@cp@1&@@žv@z @G@(1@Hȴ @i@Q`@@@;@@쟾`@ l @.(@Nx@oE@vȠ@C`@@@O@4M@U@u @@@dZ@$ @@`@:n@[;d@@{`@ȴ @@E@n@@@`@a\(@@x@é@vȠ@33 @% @F@g@M@ =`@`@ꗍ@@ X@@,$ @LG@mʠ@n@/@`@Q@x@2E@S$@s@@\@O @b@@/@@8ff@@Y&`@yl@9@@p@=p@@v@>C@_G@z@@@bM@@@#@D @el @9X@€@@@`@ C`@*b@@J@k@Z@@l@@p@01&@P@qv@z @G@1@ȴ @@6Q`@W@@w;@@`@l @(@x@E@z @_G@1@ȴ @@Q`@n@#;@@D`@el @(@x@ǶE@vȠ@ C`@)@J@kO@M@@ @@@dZ@0$ @P@q`@n@;d@@`@ȴ @@6E@Wn@w@`@\(@4J60p_4D0p_4G0p_4B,0p_4G0p_4B,0p_4G0p_4D0p_4B,0p_4D0p_4B,0p_4D0p_4B,0p_4J60p_4D0p_4D0p_4D0p_4B,0p_4B,0p_4B,0p_4B,0p_4B,0p_4B,0p_4G0p_4B,0p_4B,0p_4G0p_4D0p_4B,0p_4D0p_4?\0p_4D0p_4B,0p_4D0p_4D0p_4D0p_4B,0p_4D0p_4D0p_4D0p_4D0p_4?\0p_4D0p_4D0p_4?\0p_4B,0p_4B,0p_4B,0p_490p_4?\0p_4<0p_4?\0p_490p_4B,0p_4<0p_4<0p_4B,0p_4<0p_4<0p_4?\0p_490p_4B,0p_4<0p_4<0p_4<0p_4B,0p_4<0p_4<0p_4<0p_4?\0p_4?\0p_4B,0p_4G0p_4G0p_4G0p_4D0p_4J60p_4J60p_4G0p_4D0p_4G0p_4D0p_4G0p_4J60p_4D0p_4D0p_4G0p_4D0p_4D0p_4D0p_4J60p_4G0p_4B,0p_4D0p_4D0p_4D0p_4J60p_4B,0p_4G0p_4D0p_4G0p_4G0p_4D0p_4D0p_4G0p_4J60p_4G0p_4G0p_4G0p_4G0p_4B,0p_4<0p_4D0p_4D0p_490p_4B,0p_4?\0p_4B,0p_4D0p_4G0p_4?\0p_4B,0p_4D0p_4B,0p_4D0p_4B,0p_4D0p_4?\0p_490p_4B,0p_4?\0p_4?\0p_4<0p_4?\0p_4B,0p_4<0p_4B,0p_4<0p_4?\0p_4?\0p_4?\0p_4D0p_4D0p_4G0p_4B,0p_4D0p_4D0p_4G0p_4G0p_4B,0p_4D0p_4D0p_4D0p_4B,0p_4G0p_4B,0p_4?\0p_4D0p_4D0p_4B,0p_4<0p_4<0p_4D0p_4?\0p_4?\0p_4D0p_4B,0p_4B,0p_4D0p_4J60p_4G0p_4B,0p_4B,0p_4G0p_4J60p_4G0p_4G0p_4B,0p_4G0p_4G0p_4G0p_4D0p_4G0p_4B,0p_4B,0p_4B,0p_4?\0p_4B,0p_4G0p_4B,0p_4B,0p_4D0p_4D0p_4B,0p_4B,0p_4B,0p_4D0p_4B,0p_4?\0p_4D0p_4B,0p_4B,0p_4D0p_4B,0p_4D0p_4?\0p_4?\0p_4D0p_4B,0p_4B,0p_4B,0p_4?\0p_4B,0p_4B,0p_4D0-]4D0p_4B,0-]4B,0p_4B,0p_4B,0p_4?\0p_4?\0p_4D0p_4B,0p_4D0p_4D0p_4<0p_4D0p_4D0p_4B,0p_4B,0p_4D0p_4B,0p_4D0p_4G0p_4B,0p_4D0p_4B,0p_4D0p_4G0p_4D0p_4B,0p_4D0p_4B,0p_4G0p_4G0p_4G0p_4D0p_4D0p_4B,0p_4D0p_4G0p_4B,0p_4B,0p_4D0p_4?\0p_4G0p_4?\0p_4D0p_4?\0p_4B,0p_4G0p_4G0p_4B,0p_4D0p_4?\0p_4<0p_4B,0p_4<0p_4?\0p_4?\0p_4B,0p_4B,0p_4<0p_4B,0p_4?\0p_4?\0p_4?\0p_4?\0p_4?\0p_4?\0p_4?\0p_4?\0p_4?\0p_4?\0p_4?\0p_4B,0p_4B,0p_4<0p_490p_490p_4<0p_4B,0p_4<0p_490p_4<0-]4?\0p_4?\0p_4?\0p_4?\0p_4B,0p_4<0p_490p_4<0p_4B,0p_490p_4D0p_4G0p_4J60p_4D0p_4G0p_4J60p_4D0p_4G0p_4J60p_4G0p_4G0p_4G0p_4G0p_4G0p_4G0p_4G0p_4Mpd0p_4G0p_4G0p_4Mpd0p_4G0p_4G0p_4D0p_4G0p_4?\0p_4D0p_4D0p_4D0p_4D0p_4G0p_4G0p_4G0p_4J60p_4B,0p_4J60p_4D0p_4J60p_4J60p_4G0p_4G0p_4D0p_4D0p_4B,0p_4B,0p_4B,0p_4D0p_4G0p_4D0p_4B,0p_4G0p_4D0p_4D0p_4B,0p_490p_4?\0p_4D0p_4D0p_4B,0p_4D0p_4D0p_4B,0p_4D0p_4B,0p_4D0p_4D0p_4B,0p_4B,0p_4B,0p_4B,0p_4B,0p_4D0p_4B,0p_4B,0p_4B,0p_4G0p_4D0p_4B,0p_4B,0p_4B,0p_4D0p_4B,0p_4D0p_4D0p_4B,0p_4D0p_4?\0p_4D0p_4?\0p_46t0p_490p_4B,0p_4B,0p_4B,0p_4B,0p_4B,0p_4B,0p_4B,0p_4B,0p_4B,0p_4B,0p_4B,0p_4B,1:,4G0p_4B,1:,4B,14B,0p_4?\0p_4B,0p_4G0p_4?\0-]4B,0p_4D0p_4D0p_4D0p_4B,0p_4B,0p_4?\0p_4D0p_4D0p_4D0p_4D0p_4D0p_4B,0p_4B,0p_4B,0p_4D0p_4B,0p_4B,0p_4B,0p_4D0p_4B,0p_4B,0p_4D0p_4D0p_4B,0p_4B,0p_4D0p_4?\0p_4D0p_4B,0p_4?\0p_4?\0p_4G0p_4B,0p_4D0p_4?\0p_4D0p_4?\0p_4B,0p_4?\0p_4B,0p_4B,0p_4D0p_4G0p_4D0p_4B,0p_4D0p_4D0p_4?\0p_4B,0p_4B,0p_4D0p_4B,0p_4D0p_4?\0p_4D0p_4D0p_4B,0p_4B,0p_4D0p_4?\0p_4D0p_4G0p_4J60p_4J60p_4D0p_4J60p_4J60p_4J60p_4Mpd0p_4J60p_4G0p_4G0p_4J60p_4J60p_4G0p_4G0p_4G0p_4J60p_4J60p_4J60p_4J60p_4G0p_4G0p_4J60p_4G0p_4D0p_4B,0p_4B,0p_4G0p_4D0p_4?\0p_4G0p_4B,0p_4B,0p_4?\0p_4G0p_4B,0p_4D0p_4D0p_4G0p_4G0p_4B,0p_4D0p_4B,0p_4B,0p_4G0p_4D0p_4D0p_4D0p_4D0p_4G0p_4?\0p_4D0p_4G0p_4D0p_4D0p_4D0p_4D0p_4D0p_4D0p_4D0p_4B,0p_4D0p_4G0p_4G0p_4B,0p_4<0p_4J60p_4B,0p_4?\0p_4D0p_4J60p_4B,0p_4J60p_4D0p_4G0p_4J60p_4G0p_4J60p_4Mpd0p_4G0p_4G0p_4G0p_4Mpd0p_4D0p_4J60p_4Mpd0p_4J60p_4J60p_4G0p_4J60p_4G0p_4G0p_4G0p_4G0p_4D0p_4G0p_4B,0p_4G0p_4J60p_4B,0p_4G0p_4D0p_4D0p_4Mpd0p_4D0p_4B,0p_4B,0p_4D0p_4B,0p_4G0p_4D0p_4G0p_4D0p_4B,0p_4?\0p_4D0p_4D0p_4B,0p_4B,0p_4J60p_4D0p_4B,0p_4B,0p_4D0p_4B,0p_4B,0p_4G0p_4B,0p_4B,0p_4B,0p_4B,0p_4B,0p_4B,0p_4D0p_4B,0p_4J60p_4B,0p_4D0p_4B,0p_4G0p_4B,0p_4D0p_4B,0p_4B,0p_4G0p_4B,0p_4D0p_4D0p_4?\0p_4D0p_4B,0p_4D0p_4?\0p_4B,0p_4D0p_4B,0p_4D0p_4B,0p_4B,0p_4B,0p_4B,0p_4B,0p_4J60p_4G0p_4J60p_4G0p_4J60p_4J60p_4G0p_4J60p_4J60p_4J60p_4G0p_4J60p_4G0p_4G0p_4G0p_4G0p_4D0p_4G0p_4G0p_4J60p_4J60p_4J60p_4J60p_4J60p_4J60p_4G0p_4G0p_4J60p_4Mpd0p_4G0p_4J60p_4Mpd0p_4G0p_4Mpd0p_4J60p_4B,0p_4J60p_4G0p_4J60p_4G0p_4G0p_4J60p_4B,0p_4G0p_4G0p_4J60p_4G0p_4G0p_4G0p_4G0p_4J60p_4G0p_4G0p_4D0p_4G0p_4G0p_4J60p_4J60p_4G0p_4G0p_4J60p_4G0p_4G0p_4D0p_4Mpd0p_4D0p_4J60p_4G0p_4D0p_4G0p_4J60p_4J60p_4B,0p_4J60p_4D0p_4G0p_4D0p_4J60p_4G0p_4D0p_4B,0p_4B,0p_4B,0p_4B,0p_4D0p_4?\0p_4B,0p_4?\0p_4?\0p_4?\0p_4G0p_4B,0p_4D0p_4B,0p_4B,0p_4B,0p_4<0p_4D0p_4?\0p_490p_4<0p_4?\0p_4B,0p_4B,0p_4D0p_4<0p_4D0p_4B,0p_4B,0p_4B,0p_4B,0p_4B,0p_4D0p_4B,0p_4B,0p_4B,0p_4D0p_4B,0p_4B,0p_4D0p_4B,0p_4?\0p_4D0p_4B,0p_4?\0p_4B,0p_4D0p_4?\0p_4B,0p_4G0p_4B,0p_4D0p_4D0p_4G0p_4D0p_4B,0p_4B,0p_4G0p_4B,0p_4B,0p_4G0p_4G0p_4D0p_4B,0p_4D0p_4B,0p_4B,0p_4J60p_4?\0p_4D0p_4G0p_4?\0p_4D0p_4D0p_4D0p_4G0p_4D0p_4G0p_4B,0p_4D0p_4D0p_4B,0p_4B,0p_4B,0p_4D0p_4D0p_4?\0p_4J60p_4D0p_4B,0p_4J60p_4G0p_4D0p_4B,0p_4B,0p_4G0p_4D0p_4G0p_4B,0p_4B,0p_4G0p_4G0p_4B,0p_4D0p_4D0p_4D0p_4D0p_4D0p_4B,0p_4D0p_4D0p_4D0p_4G0p_4?\0p_4D0p_4D0p_4B,0p_4B,0p_4B,0p_4B,0p_4G0p_4D0p_4D0p_4D0p_4G0p_4D0p_4G0p_4G0p_4D0p_4D0p_4J60p_4G0p_4Mpd0p_4J60p_4Mpd0p_4Mpd0p_4Mpd0p_4PCR0p_4Mpd0p_4PCR0p_4Mpd0p_4Mpd0p_4Mpd0p_4Mpd0p_4B,0p_4B,0p_4J60p_4D0p_4B,0p_4G0p_4B,0p_4<0p_4?\0p_4D0p_4B,0p_4?\0p_4<0p_4D0p_4B,0p_4D0p_4<0p_4B,0p_4B,0p_4?\0p_4B,0p_4B,0p_4B,0p_4?\0p_4?\0p_4?\0p_4B,0p_4B,0p_4B,0p_4B,0p_4?\0p_4B,0p_4B,0p_4G0p_4B,0p_4D0p_4Mpd0p_4PCR0p_4G0p_4Mpd0p_4J60p_4J60p_4S0p_4G0p_4J60p_4G0p_4G0p_4B,0p_4J60p_4Mpd0p_4G0p_4J60p_4J60p_4J60p_4G0p_4G0p_4D0p_4G0p_4D0p_4G0p_4B,0p_4D0p_4D0p_4?\0p_4J60p_4G0p_4D0p_4D0p_4B,0p_4B,0p_4G0p_4G0p_4D0p_4B,0p_4B,0p_4?\0p_4D0p_4B,0p_4?\0p_4G0p_4?\0p_4B,0p_4B,0p_4B,0p_4B,0p_4B,0p_4?\0p_4?\0p_4B,0p_4B,0p_4B,0p_4<0p_4B,0p_4B,0p_4?\0p_4?\0p_4B,0p_4B,0p_4?\0p_4<0p_4?\0p_4<0p_4<0p_490p_4<0p_46t0p_490p_4<0p_4<0p_4<0p_490p_4<0p_490p_4<0p_490p_4<0p_4<0p_4<0p_4<0p_4<0p_4<0p_4<0p_4<0p_4<0p_4?\0p_4<0p_490p_4?\0p_490p_490p_490p_4?\0p_490p_4?\0p_4D0p_4D0p_4D0p_4J60p_4?\0p_4?\0p_4B,0p_4?\0p_4?\0p_4B,0p_4<0p_4D0p_4?\0p_4?\0p_4?\0p_4?\0p_4?\0p_4B,0p_4?\0p_4B,0p_4?\0p_4B,0p_4B,0p_4B,0p_4?\0p_4?\0p_4?\0p_4<0p_4B,0p_4?\0p_4B,0p_4?\0p_4?\0p_4B,0p_4B,0p_4D0p_4D0p_4D0p_4D0p_4D0p_4B,0p_4D0p_4D0p_4<0p_4G0p_4J60p_4G0p_4D0p_4D0p_4B,0p_4?\0p_4B,0p_4?\0p_4?\0p_4B,0p_4?\0p_4D0p_4D0p_4?\0p_4?\0p_4?\0p_4B,0p_4Mpd0p_4?\0p_4D0p_4D0p_4D0p_4D0p_4D0p_4D0p_4B,0p_4D0p_4D0p_4G0p_4G0p_4B,0p_4D0p_4D0p_4D0p_4D0p_4B,0p_4B,0p_4G0p_4B,0p_4D0p_4B,0p_4D0p_4B,0p_4D0p_4B,0p_4B,0p_4D0p_4B,0p_4B,0p_4G0p_4B,0p_4G0p_4Mpd0p_4J60p_4J60p_4J60p_4G0p_4G0p_4G0p_4Mpd0p_4J60p_4G0p_4J60p_4Mpd0p_4G0p_4J60p_4G0p_4G0p_4J60p_4G0p_4G0p_4D0p_4D0p_4G0p_4G0p_4G0p_4D0p_4B,0p_4D0p_4B,0p_4G0p_4D0p_4D0p_4B,0p_4D0p_4B,0p_4D0p_4G0p_4B,0p_4D0p_4J60p_4B,0p_4D0p_4D0p_4G0p_4D0p_4J60p_4G0p_4D0p_4D0p_4G0p_4G0p_4B,0p_4J60p_4B,0p_4J60p_4?\0p_4B,0p_4G0p_4D0p_4G0p_4?\0p_4D0p_4D0p_4G0p_4D0p_4D0p_4D0p_4D0p_4D0p_4G0p_4G0p_4D0p_4D0p_4G0p_4D0p_4D0p_4G0p_4G0p_4G0p_4G0p_4B,0p_4B,0p_4G0p_4D0p_4G0p_4D0p_4G0p_4D0p_4G0p_4B,0p_4D0p_4D0p_4B,0p_4G0p_4G0p_4G0p_4D0p_4D0p_4G0p_4D0p_4D0p_4D0p_4B,0p_4D0p_4G0p_4G0p_4J60p_4B,0p_4B,0p_4G0p_4D0p_4<0p_4<0p_4D0p_4J60p_4G0p_4G0p_4G0p_4J60p_4D0p_4B,0p_4B,0p_4D0p_4D0p_4G0p_4G0p_4G0p_4G0p_4D0p_4J60p_4D0p_4G0p_4G0p_4G0p_4G0p_4J60p_4D0p_4D0p_4D0p_4J60p_4G0p_4D0p_4D0p_4J60p_4G0p_4G0p_4D0p_4G0p_4G0p_4J60p_4G0p_4D0p_4D0p_4G0p_4D0p_4G0p_4D0p_4G0p_4G0p_4G0p_4D0p_4Mpd0p_4G0p_4G0p_4J60p_4G0p_4G0p_4G0p_4D0p_4D0p_4D0p_4J60p_4D0p_4G0p_4D0p_4D0p_4G0p_4J60p_4Mpd0p_4Mpd0p_4Mpd0p_4Mpd0p_4PCR0p_4J60p_4Mpd0p_4PCR0p_4J60p_4Mpd0p_4Mpd0p_4J60p_4J60p_4PCR0p_4J60p_4J60p_4Mpd0p_4PCR0p_4Mpd0p_4PCR0p_4Mpd0p_4G0p_4J60p_4PCR0p_4Mpd0p_4Mpd0p_4G0p_4J60p_4G0p_4J60p_4G0p_4G0p_4G0p_4D0p_4J60p_4Mpd0p_4D0p_4J60p_4B,0p_4D0p_4G0p_4?\0p_4G0p_4?\0p_4B,0p_4?\0p_4D0p_4G0p_4D0p_4G0p_4D0p_4G0p_4G0p_4B,0p_4D0p_4D0p_4B,0p_4G0p_4B,0p_4D0p_4J60p_4J60p_4G0p_4J60p_4D0p_4G0p_4PCR0p_4G0p_4D0p_4B,0p_4?\0p_4?\0p_4?\0p_4?\0p_4B,0p_4G0p_4G0p_4G0p_4B,0p_4D0p_4D0p_4?\0p_4D0p_4G0p_4D0p_4D0p_4?\0p_4B,0p_4B,0p_4B,0p_4B,0p_4G0p_4?\0p_4B,0p_4G0p_4B,0p_4G0p_4D0p_4D0p_4G0p_4?\0p_4G0p_4D0p_4D0p_4D0p_4B,0p_4D0p_4D0p_4J60p_4J60p_4Mpd0p_4J60p_4J60p_4D0p_4J60p_4J60p_4B,0p_4B,0p_4D0p_4G0p_4G0p_4D0p_4D0p_4G0p_4D0p_4D0p_4D0p_4B,0p_4G0p_4G0p_4D0p_4G0p_4G0p_4D0p_4D0p_4G0p_4D0p_4G0p_4D0p_4G0p_4D0p_4D0p_4J60p_4B,0p_4J60p_4D0p_4B,0p_4J60p_4D0p_4G0p_4B,0p_4D0p_4D0p_4D0p_4PCR0p_4Mpd0p_4G0p_4B,0p_4D0p_4D0p_4B,0p_4B,0p_4B,0p_4B,0p_4<0p_4B,0p_4<0p_4D0p_4<0p_4B,0p_4?\0p_4B,0p_4B,0p_4?\0p_4G0p_4B,0p_4?\0p_4B,0p_4D0p_4B,0p_4D0p_4<0p_4B,0p_4B,0p_4B,0p_4?\0p_4?\0p_4?\0p_4?\0p_4<0p_4B,0p_4D0p_4?\0p_4D0p_4B,0p_4B,0p_4?\0p_4<0p_4?\0p_4B,0p_4<0p_4D0p_4B,0p_4B,0p_4?\0p_4B,0p_4?\0p_4?\0p_4?\0p_4B,0p_4<0p_4?\0p_4?\0p_4B,0p_4?\0p_4?\0p_490p_4B,0p_4?\0p_4<0p_4<0p_4?\0p_4B,0p_4?\0p_4<0p_4<0p_4?\0p_4?\0p_4?\0p_4B,0p_4?\0p_4?\0p_4?\0p_4<0p_4<0p_4?\0p_4?\0p_4<0p_4<0p_4<0p_4B,0p_4?\0p_4B,0p_4B,0p_4<0p_4B,0p_4?\0p_4B,0p_4<0p_4D0p_4?\0p_4?\0p_4?\0p_4?\0p_4B,0p_4?\0p_4?\0p_4?\0p_4<0p_4?\0p_4?\0p_4B,0p_4?\0p_4?\0p_4?\0p_4?\0p_4B,0p_4<0p_4B,0p_4?\0p_4?\0p_4B,0p_4D0p_4D0p_4G0p_4G0p_4B,0p_4D0p_4D0p_4D0p_4B,0p_4B,0p_4G0p_4D0p_4B,0p_4J60p_4?\0p_4B,0p_4?\0p_4B,0p_4<0p_4B,0p_4<0p_4<0p_4B,0p_4?\0p_4<0p_4<0p_4?\0p_4D0p_4<0p_4D0p_4B,0p_4?\0p_4?\0p_4?\0p_4D0p_4D0p_4D0p_4G0p_4D0p_4D0p_4D0p_4G0p_4G0p_4G0p_4G0p_4G0p_4D0p_4G0p_4G0p_4D0p_4J60p_4G0p_4J60p_4D0p_4D0p_4B,0p_4B,0p_4D0p_4D0p_4B,0p_4B,0p_4B,0p_4D0p_4D0p_4D0p_4<0p_4D0p_4?\0p_4D0p_4B,0p_4D0p_4B,0p_4D0p_4D0p_4D0p_4B,0p_4D0p_4B,0p_4B,0p_4B,0p_4B,0p_4B,0p_4B,0p_4G0p_4D0p_4Mpd0p_4?\0p_4D0p_4B,0p_4D0p_4D0p_4D0p_4B,0p_4G0p_4?\0p_4G0p_4B,0p_4B,0p_4J60p_4B,0p_4D0p_4J60p_4J60p_4Mpd0p_4G0p_4J60p_4G0p_4J60p_4G0p_4G0p_4Mpd0p_4G0p_4G0p_4Mpd0p_4J60p_4Mpd0p_4J60p_4G0p_4Mpd0p_4J60p_4J60p_4J60p_4J60p_4J60p_4J60p_4G0p_4J60p_4J60p_4J60p_4Mpd0p_4J60p_4J60p_4J60p_4Mpd0p_4PCR0p_4G0p_4Mpd0p_4J60p_4G0p_4J60p_4G0p_4D0p_4J60p_4G0p_4G0p_4G0p_4G0p_4J60p_4D0p_4J60p_4G0p_4D0p_4G0p_4J60p_4Mpd0p_4D0p_4G0p_4Mpd0p_4G0p_4G0p_4G0p_4G0p_4D0p_4J60p_4G0p_4D0p_4B,0p_4G0p_4D0p_4G0p_4D0p_4G0p_4J60p_4D0p_4J60p_4G0p_4D0p_4G0p_4J60p_4B,0p_4G0p_4G0p_4G0p_4G0p_4D0p_4G0p_4D0p_4D0p_4J60p_4G0p_4J60p_4J60p_4Mpd0p_4Mpd0p_4Mpd0p_4Mpd0p_4Mpd0p_4Mpd0p_4J60p_4PCR0p_4G0p_4G0p_4PCR0p_4G0p_4J60p_4Mpd0p_4D0p_4B,0p_4J60p_4D0p_4G0p_4D0p_4J60p_4D0p_4D0p_4D0p_4D0p_4G0p_4J60p_4D0p_4B,0p_4D0p_4G0p_4G0p_4D0p_4B,0p_4B,0p_4G0p_4D0p_4D0p_4D0p_4G0p_4G0p_4D0p_4D0p_4G0p_4D0p_4D0p_4G0p_4Mpd0p_4G0p_4J60p_4J60p_4J60p_4Mpd0p_4G0p_4J60p_4G0p_4G0p_4J60p_4J60p_4J60p_4J60p_4D0p_4J60p_4J60p_4PCR0p_4G0p_4PCR0p_4J60p_4J60p_4J60p_4G0p_4J60p_4Mpd0p_4J60p_4G0p_4Mpd0p_4Mpd0p_4Mpd0p_4J60p_4J60p_4PCR0p_4J60p_4J60p_4Mpd0p_4J60p_4Mpd0p_4J60p_4Mpd0p_4J60p_4PCR0p_4Mpd0p_4Mpd0p_4Mpd0p_4J60p_4PCR0p_4Mpd0p_4Mpd0p_4S0p_4PCR0p_4J60p_4PCR0p_4J60p_4Mpd0p_4PCR0p_4PCR0p_4Mpd0p_4Mpd0p_4PCR0p_4Mpd0p_4S0p_4Mpd0p_4Mpd0p_4PCR0p_4PCR0p_4PCR0p_4Mpd0p_4S0p_4J60p_4PCR0p_4Mpd0p_4PCR0p_4Mpd0p_4Mpd0p_4PCR0p_4Mpd0p_4Mpd0p_4J60p_4S0p_4PCR0p_4J60p_4J60p_4Mpd0p_4Mpd0p_4Mpd0p_4G0p_4Mpd0p_4J60p_4G0p_4J60p_4J60p_4J60p_4Mpd0p_4U0p_4PCR0p_4PCR0p_4PCR0p_4Mpd0p_4Mpd0p_4PCR0p_4PCR0p_4PCR0p_4Mpd0p_4PCR0p_4PCR0p_4Mpd0p_4PCR0p_4Mpd0p_4PCR0p_4PCR0p_4Mpd0p_4PCR0p_4PCR0p_4Mpd0p_4S0p_4U0p_4S0p_4Mpd0p_4PCR0p_4PCR0-]4J60-]4Mpd1:,4PCR0p_4PCR0-]4Mpd0-]4PCR0-]4G1:,4PCR0p_4Mpd1:,4J60p_4Mpd0p_4Mpd0p_4Mpd0p_4G0p_4Mpd0p_4J60p_4Mpd0p_4J60p_4PCR0p_4PCR0p_4J60p_4PCR0p_4Mpd0p_4J60p_4S0p_4Mpd0p_4G0p_4Mpd0p_4J60p_4Mpd0p_4D0p_4J60p_4PCR0p_4J60p_4G0p_4G0p_4Mpd0p_4J60p_4Mpd0p_4J60p_4J60p_4Mpd0p_4Mpd0p_4J60p_4J60p_4Mpd0p_4Mpd0p_4J60p_4Mpd0p_4J60p_4J60p_4G0p_4J60p_4Mpd0p_4Mpd0p_4J60p_4Mpd0p_4Mpd0p_4S0p_4J60p_4Mpd0p_4Mpd0p_4Mpd0p_4PCR0p_4PCR0p_4Mpd0p_4Mpd0p_4J60p_4U0p_4G0p_4G0p_4Mpd0p_4J60p_4G0p_4PCR0p_4G0p_4J60p_4Mpd0p_4PCR0p_4Mpd0p_4Mpd0p_4PCR0p_4G0p_4S0p_4Mpd0p_4J60p_4Mpd0p_4PCR0p_4Mpd0p_4J60p_4Mpd0p_4G0p_4J60p_4D0p_4G0p_4G0p_4D0p_4G0p_4J60p_4G0p_4J60p_4PCR0p_4S0p_4Mpd0p_4PCR0p_4Mpd0p_4PCR0p_4PCR0p_4PCR0p_4Mpd0p_4PCR0p_4Mpd0p_4PCR0p_4Mpd0p_4G0p_4Mpd0p_4PCR0p_4Mpd0p_4PCR0p_4J60p_4PCR0p_4Mpd0p_4Mpd0p_4Mpd0p_4Mpd0p_4PCR0p_4S0p_4J60p_4Mpd0p_4PCR0p_4Mpd0p_4Mpd0p_4PCR0p_4Mpd0p_4Mpd0p_4J60p_4PCR0p_4Mpd0p_4J60p_4S0p_4Mpd0p_4PCR0p_4B,0p_4G0p_4B,0p_4Mpd0p_4B,0p_4Mpd0p_4J60p_4J60p_4G0p_4D0p_4J60p_4J60p_4G0p_4G0p_4J60p_4B,0p_4G0p_4B,0p_4D0p_4D0p_4B,0p_4G0p_4?\0p_4B,0p_4D0p_4<0p_4J60p_4D0p_4D0p_4?\0p_4G0p_4B,0p_4G0p_4B,0p_4D0p_4B,0p_4?\0p_4D0p_4B,0p_4B,0p_4B,0p_4G0p_4G0p_4D0p_4B,0p_4J60p_4G0p_4D0p_4J60p_4D0p_4J60p_4B,0p_4D0p_4J60p_4B,0p_4G0p_4G0p_4G0p_4D0p_4B,0p_4G0p_4J60p_4G0p_4D0p_4J60p_4D0p_4G0p_4G0p_4D0p_4J60p_4J60p_4G0p_4G0p_4Mpd0p_4J60p_4J60p_4PCR0p_4J60p_4S0p_4J60p_4G0p_4G0p_4Mpd0p_4Mpd0p_4Mpd0p_4D0p_4J60p_4PCR0p_4PCR0p_4J60p_4S0p_4Mpd0p_4PCR0p_4Mpd0p_4S0p_4Mpd0p_4Mpd0p_4Mpd0p_4Mpd0p_4S0p_4J60p_4S0p_4PCR0p_4D0p_4J60p_4J60p_4J60p_4PCR0p_4S0p_4S0p_4S0p_4U0p_4U0p_4S0p_4S0p_4U0p_4S0p_4X0p_4U0p_4U0p_4[0p_4U0p_4U0p_4U0p_4X0p_4PCR0p_4U0p_4S0p_4PCR0p_4PCR0p_4U0p_4PCR0p_4S0p_4S0p_4U0p_4PCR0p_4PCR0p_4S0p_4PCR0p_4PCR0p_4Mpd0p_4PCR0p_4S0p_4PCR0p_4PCR0p_4J60p_4S0p_4S0p_4J60p_4U0p_4S0p_4PCR0p_4PCR0p_4PCR0p_4S0p_4S0p_4S0p_4X0p_4U0p_4S0p_4S0p_4S0p_4X0p_4S0p_4^V0p_4U0p_4[0p_4[0p_4U0p_4X0p_4U0p_4X0p_4X0p_4U0p_4S0p_4S0p_4S0p_4X0p_4S0p_4U0p_4U0p_4PCR0p_4S0p_4U0p_4S0p_4U0p_4S0p_4S0p_4S0p_4PCR0p_4S0p_4U0p_4X0p_4U0p_4U0p_4S0p_4X0p_4S0p_4Mpd0p_4U0p_4U0p_4U0p_4U0p_4U0p_4X0p_4S0p_4S0p_4U0p_4S0p_4PCR0p_4S0p_4S0p_4U0p_4S0p_4S0p_4S0p_4S0p_4S0p_4PCR0p_4S0p_4U0p_4S0p_4S0p_4S0p_4PCR0p_4U0p_4PCR0p_4S0p_4S0p_4S0p_4X0p_4PCR0p_4J60p_4S0p_4Mpd0p_4PCR0p_4S0p_4U0p_4S0p_4S0p_4S0p_4U0p_4Mpd0p_4U0p_4U0p_4PCR0p_4PCR0p_4Mpd0p_4PCR0p_4S0p_4S0p_4[0p_4PCR0p_4[0p_4S0p_4U0p_4X0p_4S0p_4Mpd0p_4PCR0p_4S0p_4Mpd0p_4S0p_4Mpd0p_4PCR0p_4Mpd0p_4S0p_4PCR0p_4PCR0p_4S0p_4Mpd0p_4PCR0p_4J60p_4PCR0p_4PCR0p_4PCR0p_4Mpd0p_4PCR0p_4S0p_4PCR0p_4PCR0p_4PCR0p_4Mpd0p_4Mpd0p_4PCR0p_4S0p_4PCR0p_4PCR0p_4PCR0p_4X0p_4Mpd0p_4PCR0p_4PCR0p_4S0p_4Mpd0p_4S0p_4S0p_4PCR0p_4PCR0p_4S0p_4S0p_4U0p_4PCR0p_4S0p_4PCR0p_4PCR0p_4PCR0p_4S0p_4S0p_4PCR0p_4PCR0p_4PCR0p_4S0p_4PCR0p_4S0p_4U0p_4U0p_4X0p_4U0p_4S0p_4X0p_4U0p_4S0p_4X0p_4S0p_4U0p_4Mpd0p_4Mpd0p_4PCR0p_4S0p_4X0p_4S0p_4S0p_4U0p_4U0p_4S0p_4PCR0p_4S0p_4S0p_4S0p_4X0p_4X0p_4X0p_4X0p_4X0p_4[0p_4X0p_4[0p_4U0p_4U0p_4X0p_4S0p_4U0p_4U0p_4S0p_4S0p_4U0p_4X0p_4U0p_4X0p_4S0p_4S0-]4PCR0p_4PCR0p_4Mpd0p_4PCR0p_4U0p_4Mpd0p_4U0p_4Mpd0p_4PCR0p_4PCR0p_4PCR0p_4PCR0p_4S0p_4PCR0p_4Mpd0p_4Mpd0p_4PCR0p_4PCR0p_4U0p_4S0p_4S0p_4S0p_4S0p_4U0p_4S0p_4S0p_4X0p_4PCR0p_4X0p_4U0p_4PCR0p_4PCR0p_4X0p_4S0p_4J60p_4X0p_4PCR0p_4S0p_4S0p_4U0p_4S0p_4U0p_4S0p_4S0p_4S0p_4PCR0p_4[0p_4U0p_4S0p_4PCR0p_4PCR0p_4PCR0p_4S0p_4S0p_4S0p_4Mpd0p_4PCR0p_4S0p_4S0p_4S0p_4U0p_4S0p_4U0p_4Mpd0p_4Mpd0p_4U0p_4Mpd0p_4Mpd0p_4Mpd0p_4J60p_4J60p_4Mpd0p_4G0p_4J60p_4Mpd0p_4PCR0p_4Mpd0p_4G0p_4Mpd0p_4J60p_4Mpd0p_4J60p_4J60p_4D0p_4J60p_4G0p_4Mpd0p_4Mpd0p_4G0p_4G0p_4Mpd0p_4S0p_4PCR0p_4PCR0p_4Mpd0p_4J60p_4PCR0p_4Mpd0p_4PCR0p_4J60p_4PCR0p_4J60p_4J60p_4Mpd0p_4J60p_4J60p_4J60p_4J60-]4Mpd0p_4J60p_4PCR0p_4J60p_4Mpd0p_4J60p_4Mpd0p_4PCR0p_4J60p_4J60p_4J60p_4PCR0p_4J60p_4J60p_4J60p_4Mpd0p_4Mpd0p_4PCR0p_4U0p_4Mpd0p_4Mpd0p_4PCR0p_4Mpd0p_4PCR0p_4J60p_4PCR0p_4Mpd0p_4PCR0p_4S0p_4PCR0p_4PCR0p_4U0p_4PCR0p_4J60p_4S0p_4S0p_4S0p_4S0p_4S0p_4S0p_4Mpd0p_4PCR0p_4PCR0p_4X0p_4S0p_4PCR0p_4Mpd0p_4U0p_4Mpd0p_4S0p_4PCR0p_4PCR0p_4S0p_4PCR0p_4PCR0p_4Mpd0p_4PCR0p_4Mpd0p_4PCR0p_4J60p_4Mpd0p_4J60p_4Mpd0p_4J60p_4PCR0p_4J60p_4J60p_4Mpd0p_4Mpd0p_4J60p_4Mpd0p_4Mpd0p_4J60p_4PCR0p_4Mpd0p_4J60p_4J60p_4Mpd0p_4J60p_4J60p_4J60p_4J60p_4PCR0p_4G0p_4J60p_4G0p_4Mpd0p_4G0p_4Mpd0p_4G0p_4J60p_4G0p_4J60p_4J60p_4Mpd0p_4PCR0p_4Mpd0p_4G0p_4J60p_4Mpd0p_4PCR0p_4G0p_4J60p_4Mpd0p_4Mpd0p_4J60p_4G0p_4J60p_4PCR0p_4G0p_4Mpd0p_4J60p_4J60p_4J60p_4G0p_4Mpd0p_4G0p_4PCR0p_4PCR0p_4PCR0p_4Mpd0p_4Mpd0p_4Mpd0p_4Mpd0p_4PCR0p_4PCR0p_4S0p_4G0p_4Mpd0p_4J60p_4Mpd0p_4J60p_4J60p_4G0p_4G0p_4Mpd0p_4PCR0p_4Mpd0p_4G0p_4PCR0p_4G0p_4J60p_4D0p_4D0p_4B,0p_4D0p_4D0p_4D0p_4D0p_4B,0p_4D0p_4B,0p_4B,0p_4B,0p_4D0p_4D0p_4B,0p_4D0p_4D0p_4?\0p_4D0p_4B,0p_4D0p_4D0p_490p_4<0p_4?\0p_4B,0p_4D0p_4B,0p_4B,0p_4B,0p_4?\0p_4D0p_4<0p_4B,0p_4B,0p_4?\0p_4B,0p_4B,0p_4B,0p_4B,0p_4?\0p_4<0p_4?\0p_4D0p_4D0p_4?\0p_4?\0p_4B,0p_4D0p_4D0p_4B,0p_4G0p_4D0p_4G0p_4G0p_4J60p_4J60p_4J60p_4J60p_4J60p_4G0p_4G0p_4?\0p_4D0p_4J60p_4J60p_4G0p_4J60p_4Mpd0p_4G0p_4D0p_4G0p_4G0p_4G0p_4G0p_4D0p_4G0p_4?\0p_4B,0p_4B,0p_4B,0p_4B,0p_4B,0p_4D0p_4<0p_4B,0p_4B,0p_4B,0p_4D0p_4?\0p_4D0p_4?\0p_4B,0p_4G0p_4J60p_4G0p_4D0p_4D0p_4B,0p_4D0p_4G0p_4B,0p_4G0p_4D0p_4?\0p_4D0p_4G0p_4B,0p_4G0p_4B,0p_4D0p_4B,0p_4G0p_4G0p_4B,0p_4D0p_4D0p_4B,0p_4D0p_4D0p_4D0p_4B,0p_4D0p_4D0p_4B,0p_4D0p_4B,0p_4D0p_4B,0p_4B,0p_4D0p_4D0p_4B,0p_4G0p_4<0p_4D0p_4?\0p_4B,0p_4?\0p_4?\0p_4B,0p_4?\0p_4G0p_4?\0p_4B,0p_4?\0p_4?\0p_4?\0p_4<0p_4<0p_4B,0p_4?\0p_4?\0p_4B,0p_4B,0p_4B,0p_4?\0p_4?\0p_4<0p_4?\0p_4B,0p_4?\0p_4?\0p_4<0p_4D0p_4?\0p_4?\0p_4<0p_4D0p_490p_4?\0p_490p_4D0p_4B,0p_4D0p_4B,0p_4B,0p_4?\0p_4B,0p_4B,0p_4B,0p_4D0p_4B,0p_4?\0p_4<0p_4B,0p_4B,0p_4?\0p_4?\0p_4?\0p_4B,0p_4B,0p_4?\0p_4<0p_4<0p_4<0p_4?\0p_490p_4?\0p_4?\0p_4?\0p_4B,0p_4B,0p_4?\0p_490p_4?\0p_4<0p_46t0p_490p_4<0p_4<0p_490p_490p_4<0p_4?\0p_490p_490p_4<0p_4<0p_490p_4<0p_4<0p_4<0p_4<0p_4<0p_4?\0p_4<0p_4B,0p_4<0p_4?\0p_4?\0p_4<0p_4?\0p_4B,0p_4?\0p_4B,0p_4?\0p_490p_4?\0p_4B,0p_4?\0p_4D0p_4B,0p_4B,0p_4D0p_4<0p_4?\0p_4?\0p_4?\0p_4B,0p_4<0p_4?\0p_4<0p_4?\0p_4?\0p_4B,0p_4?\0p_4<0p_4B,0p_4?\0p_4D0p_4<0p_4B,0p_4?\0p_4<0p_4B,0p_4<0p_4B,0p_4?\0p_4?\0p_4?\0p_4?\0p_4<0p_4?\0p_4?\0p_4?\0p_4B,0p_490p_4<0p_4B,0p_490p_4<0p_4?\0p_4?\0p_4?\0p_4B,0p_4?\0p_4?\0p_4B,0p_4?\0p_4<0p_4<0p_4?\0p_4?\0p_4B,0p_4<0p_4<0p_4<0p_4<0p_4B,0p_4<0p_490p_4?\0p_4?\0p_4?\0p_4?\0p_4?\0p_4?\0p_4<0p_4<0p_4B,0p_4<0p_4?\0p_4?\0p_4?\0p_46t0p_4B,0p_4<0p_490p_4B,0p_4?\0p_4?\0p_4<0p_4?\0p_4?\0p_4?\0p_4B,0p_4<0p_4B,0p_4?\0p_4?\0p_4B,0p_4<0p_4?\0p_4B,0p_4B,0p_4G0p_4B,0p_4D0p_4D0-]4?\0p_4D0p_4B,0-]4B,0p_4B,0p_4D0p_4D0p_4B,0p_4B,0p_4B,0p_4B,0p_4G0p_4?\0p_4B,0p_4B,0p_4B,0p_4B,0p_4D0p_4B,0p_4D0p_4?\0p_4<0p_4?\0p_4<0p_4?\0p_4<0p_4B,0p_4?\0p_4?\0p_490p_4?\0p_4B,0p_4<0p_4?\0p_4<0p_4?\0p_4<0p_4B,0p_4<0p_4?\0p_4?\0p_4<0p_4<0p_490p_4<0p_4<0p_4?\0p_490p_4B,0p_4<0p_4<0p_4B,0p_4<0p_4?\0p_46t0p_4B,0p_4<0p_4<0p_4B,0p_4<0p_4<0p_4?\0p_4<0p_4B,0p_4?\0p_4D0p_4B,0p_4G0p_4D0p_4?\0p_4D0p_4B,0p_4D0p_4B,0p_4B,0p_4B,0p_4B,0p_4D0p_4G0p_4G0p_4D0p_4B,0p_4G0p_4G0p_4D0p_4G0p_4G0p_4D0p_4D0p_4B,0p_4D0p_4D0p_4G0p_4B,0p_4D0p_4D0p_4B,0p_4G0p_4B,0p_4?\0p_4D0p_4G0p_4D0p_4?\0p_4D0p_4D0p_4?\0p_4?\0p_4B,0p_4B,0p_4G0p_4B,0p_4B,0p_4D0p_4G0p_4?\0p_4D0p_4?\0p_4D0p_4?\0p_4B,0p_4D0p_4B,0p_4D0p_4B,0p_4G0p_4?\0p_4D0p_4B,0p_4B,0p_4B,0p_4B,0p_4D0p_4D0p_4J60p_4D0p_4G0p_4D0p_4J60p_4B,0p_4G0p_4G0p_4B,0p_4B,0p_4D0p_4D0p_4D0p_4D0p_4G0p_4G0p_4D0p_4J60p_4B,0p_4?\0p_4G0p_4D0p_4D0p_4B,0p_4?\0p_4B,0p_4<0p_4B,0p_4?\0p_4B,0p_4?\0p_46t0p_490p_490p_490p_4<0p_4<0p_4<0p_4<0p_4?\0p_4<0p_4?\0p_490p_490p_4B,0p_4B,0p_4<0p_4?\0p_4<0p_4B,0p_4?\0p_4<0p_4B,0p_4<0p_4B,0p_4?\0p_4?\0p_4G0p_4J60p_4B,0p_4G0p_4D0p_4G0p_4?\0p_4D0p_4?\0p_4?\0p_4<0p_490p_4<0p_490p_490p_4?\0p_490p_4<0p_4<0p_4?\0p_46t0p_490p_4<0p_4<0p_4?\0p_4<0p_440p_4?\0p_4<0p_4<0p_4<0p_490p_490p_46t0p_4PCR0p_46t0p_4<0p_490p_4B,0p_4<0p_4<0p_490p_4<0p_4<0p_490p_4<0p_4<0p_4<0p_490p_4<0p_4<0p_4<0p_4?\0p_4<0p_4?\0p_46t0p_4<0p_4?\0p_490p_4?\0p_4B,0p_4G0p_490p_4<0p_490p_4<0p_4<0p_4<0p_4?\0p_46t0p_440p_46t0p_490p_4<0p_490p_490p_490p_46t0p_4<0p_4<0p_4B,0p_490p_4<0p_4B,0p_4<0p_4?\0p_4<0p_4?\0p_4<0p_4?\0p_4<0p_4?\0p_4?\0p_4?\0p_4<0p_4?\0p_4<0p_4<0p_4?\0p_4?\0p_4<0p_4B,0p_490p_4<0p_4<0p_490p_4B,0p_4<0p_4B,0p_490p_4?\0p_4<0p_4?\0p_4?\0p_4?\0p_4B,0p_4<0p_46t0p_4<0p_4B,0p_4D0p_4D0p_4D0p_4B,0p_4B,0p_4D0p_4?\0p_4B,0p_4D0p_4D0p_4D0p_4?\0p_4B,0p_4B,0p_4D0p_4B,0p_4B,0p_4B,0p_4G0p_4B,0p_4B,0p_4J60p_4D0p_4B,0p_4G0p_4D0p_4G0p_4D0p_4B,0p_4B,0p_4<0p_4<0p_4?\0p_4B,0p_4D0p_4B,0p_4J60p_4B,0p_4D0p_4D0p_4D0p_4?\0p_4D0p_4G0p_4?\0p_4D0p_4D0p_4D0p_4B,0p_4?\0p_4J60p_4B,0p_4G0p_4B,0p_4D0p_4G0p_4D0p_4B,0p_4G0p_4B,0p_4G0p_4D0p_4D0p_4D0p_4D0p_4D0p_4G0p_4D0p_4D0p_4D0p_4D0p_4G0p_4G0p_4B,0p_4D0p_4?\0p_4G0p_4J60p_4B,0p_4B,0p_4B,0p_4?\0p_4B,0p_4B,0p_4?\0p_4<0p_4?\0p_4?\0p_4?\0p_4B,0p_4?\0p_4<0p_4D0p_4?\0p_4B,0p_4<0p_4<0p_4B,0p_4?\0p_490p_4?\0p_4B,0p_4?\0p_490p_4?\0p_4?\0p_4?\0p_4?\0p_4B,0p_4?\0p_4?\0p_4B,0p_4<0p_4<0p_4B,0p_4?\0p_4?\0p_4?\0p_4?\0p_4?\0p_4?\0p_4?\0p_4<0p_490p_46t0p_4?\0p_490p_4<0p_490p_4<0p_4<0p_46t0p_4<0p_4?\0p_4B,0p_4D0p_4<0p_4?\0p_490p_490p_440p_46t0p_490p_490p_46t0p_46t0p_46t0p_440p_440p_4.v*0p_440p_4.v*0p_46t0p_41FX0p_41FX0p_41FX0p_41FX0p_4.v*0p_440p_4.v*0p_41FX0p_440p_440p_440p_41FX0p_440p_41FX0p_4.v*0p_440p_46t0p_4.v*0p_440p_41FX0p_4.v*0p_4.v*0p_4+<0p_4+<0p_4.v*0p_4.v*0p_4.v*0p_4.v*0p_41FX0p_4.v*0p_440p_4.v*0p_4.v*0p_41FX0p_41FX0p_4.v*0p_4+<0p_41FX0p_41FX0p_4.v*0p_41FX0p_41FX0p_4.v*0p_4+<0p_4+<0p_41FX0p_41FX0p_4.v*0p_41FX0p_4.v*0p_4.v*0p_440p_4+<0p_4.v*0p_4+<0p_41FX0p_4.v*0p_41FX0p_4.v*0p_4.v*0p_4.v*0p_4.v*0p_4.v*0p_4.v*0p_4.v*0p_4.v*0p_41FX0p_4+<0p_46t0p_4.v*0p_4+<0p_4.v*0p_4.v*0p_41FX0p_4.v*0p_41FX0p_41FX0p_4.v*0p_440p_4.v*0p_4+<0p_41FX0p_41FX0p_41FX0p_41FX0p_41FX0p_4.v*0p_4+<0p_440p_41FX0p_440p_46t0p_440p_440p_41FX0p_440p_41FX0p_440p_41FX0p_490p_490p_440p_46t0p_41FX0p_41FX0p_46t0p_440p_440p_440p_440p_46t0p_490p_41FX0p_46t0p_440p_46t0p_41FX0p_440p_490p_490p_490p_490p_440p_490p_46t0p_4<0p_46t0p_440p_46t0p_46t0p_4<0p_41FX0p_490p_46t0p_46t0p_490p_4<0p_46t0p_46t0p_4<0p_490p_490p_46t0p_490p_46t0p_4<0p_440p_46t0p_46t0p_440p_46t0p_490p_440p_4<0p_440p_46t0p_46t0p_440p_4<0p_46t0p_440p_490p_46t0p_41FX0p_440p_41FX0p_440p_46t0p_41FX0p_440p_4.v*0p_440p_440p_490p_440p_4.v*0p_46t0p_440p_440p_440p_41FX0p_440p_440p_440p_41FX0p_440-]46t0p_440p_440p_440p_440p_46t0p_440p_46t0p_440p_440p_440p_440p_46t0p_46t0p_440p_41FX0p_46t0p_41FX0p_440p_440p_46t0p_41FX0p_440p_41FX0p_46t0p_440p_440p_440p_41FX0p_46t0p_46t0p_440p_440p_440p_440p_440p_440p_490p_440p_440p_46t0p_46t0p_41FX0p_46t0p_41FX0p_440p_46t0p_440p_440p_490p_490p_440p_46t0p_46t0p_46t0p_440p_490p_41FX0p_46t0p_440p_440p_4<0p_490p_490p_490p_490p_4<0p_440p_4<0p_4<0p_490p_46t0p_490p_490p_490p_46t0p_46t0p_490p_490p_4<0p_440p_46t0p_4<0p_4?\0p_490p_46t0p_4?\0p_4<0p_4B,0p_4?\0p_4D0p_4?\0p_4B,0p_4<0p_4B,0p_4?\0p_4?\0p_4D0p_4<0p_4B,0p_4?\0p_4B,0p_4?\0p_490p_490p_46t0p_4<0p_440p_4<0p_4<0p_490p_4<0p_490p_490p_4?\0p_46t0p_4<0p_46t0p_490p_4<0p_4?\0p_4?\0p_490p_4<0p_46t0p_440p_490p_490p_490p_4<0p_490p_4<0p_490p_490p_490p_4<0p_490p_490p_490p_4<0p_490p_46t0p_440p_46t0p_46t0p_46t0p_4<0p_46t0p_4.v*0p_46t0p_440p_490p_46t0p_46t1:,46t0p_4917r46t1:,46t0-]490p_4<0p_440p_46t0-]46t0p_46t0p_46t0p_46t0p_46t0p_46t0p_490p_490p_46t0p_490p_46t0p_490p_4<0p_46t0p_490p_46t0p_490p_440p_490p_46t0p_490p_46t0p_46t0p_41FX0p_440p_46t0p_4<0p_4<0p_4<0p_4?\0p_4D0p_4G0p_4G0p_4D0p_4B,0p_4D0p_4D0p_4D0p_4B,0p_4D0p_4G0p_4B,0p_4B,0p_4G0p_4B,0p_4B,0p_4D0p_4B,0p_4B,0p_4B,0p_4D0p_4D0p_4B,0p_4G0p_4D0p_4?\0p_4D0p_4?\0p_4D0p_4D0p_4D0p_4B,0p_4G0p_4B,0p_4G0p_4D0p_490p_490p_490p_46t0p_4<0p_4<0p_41FX0p_4<0p_46t0p_4<0p_4<0p_46t0p_4?\0p_490p_4<0p_490p_490p_490p_490p_4<0p_46t0p_490p_490p_4<0p_4<0p_4<0p_4<0p_490p_4<0p_4<0p_490p_490p_4<0p_4?\0p_46t0p_490p_4<0p_4<0p_46t0p_4<0p_4B,0p_490p_4?\0p_4<0p_4?\0p_4?\0p_4<0p_4?\0p_4<0p_4<0p_4B,0p_4?\0p_4<0p_4<0p_490p_490p_46t0p_4<0p_46t0p_4<0p_490p_490p_4<0p_490p_46t0p_490p_4<0p_4<0p_4?\0p_46t0p_4?\0p_4B,0p_4<0p_4<0p_4?\0p_4?\0p_4D0p_4?\0p_4B,0p_4<0p_4B,0p_4?\0p_4?\0p_4B,0p_4?\0p_4<0p_4B,0p_4<0p_4B,0p_4B,0p_4B,0p_4?\0p_4B,0p_4<0p_4?\0p_4B,0p_4<0p_4?\0p_4B,0p_4?\0p_490p_46t0p_46t0p_490p_490p_46t0p_41FX0p_41FX0p_440p_4.v*0p_46t0p_440p_46t0p_490p_440p_46t0p_46t0p_440p_440p_490p_440p_46t0p_41FX0p_46t0p_440p_41FX0p_440p_440p_440p_41FX0p_440p_46t0p_41FX0p_440p_41FX0p_46t0p_440p_440p_41FX0p_440p_46t0p_46t0p_41FX0p_440p_46t0p_440p_440p_46t0p_440p_440p_46t0p_440p_41FX0p_46t0p_46t0p_4<0p_490p_490p_46t0p_490p_440p_440p_440p_46t0p_440p_46t0p_46t0p_46t0p_46t0p_46t0p_440p_440p_440p_46t0p_46t0p_490p_46t0p_440p_4<0p_440p_490p_46t0p_46t0p_46t0p_46t0p_46t0p_46t0p_46t0p_46t0p_440p_46t0p_41FX0p_46t0p_46t0p_490p_46t0p_46t0p_490p_46t0p_440p_46t0p_440p_46t0p_440p_41FX0p_41FX0p_490p_440p_46t0p_41FX0p_440p_440p_440p_46t0p_440p_46t0p_490p_440p_46t0p_490p_4<0p_4<0p_490p_4B,0p_46t0p_490p_4<0p_4<0p_4<0p_490p_4<0p_490p_490p_4<0p_490p_4<0p_4B,0p_490p_490p_4B,0p_4<0p_4<0p_490p_4?\0p_490p_4<0p_4<0p_4<0p_490p_4<0p_490p_4?\0p_4<0p_490p_4<0p_4<0p_4<0p_440p_4<0p_4<0p_4?\0p_490p_490p_4<0p_4<0p_490p_4<0p_4<0p_46t0p_440p_490p_490p_490p_490p_490p_46t0p_490p_490p_490p_490p_490p_490p_46t0p_4<0p_46t0p_4?\0p_4?\0p_4<0p_4<0p_4?\0p_440p_4<0p_4<0p_4?\0p_4B,0p_490p_4G0p_4?\0p_4D0p_4B,0p_4D0p_4?\0p_4D0p_4D0p_4D0p_4?\0p_4PCR0p_4?\0p_4?\0p_4D0p_4B,0p_4B,0p_4B,0p_4B,0p_4B,0p_4<0p_4<0p_4<0p_4<0p_4?\0p_490p_4?\0p_4?\0p_4<0p_4<0p_4?\0p_4?\0p_4<0p_4<0p_4<0p_490p_490p_46t0p_4<0p_46t0p_4<0p_46t0p_4<0p_4<0p_4<0p_490p_490p_490p_490p_490p_490p_46t0p_490p_490p_490p_4<0p_490p_490p_490p_4<0p_46t0p_490p_46t0p_490p_4<0p_46t0p_490p_4<0p_490p_490p_490p_490p_490p_46t0p_490p_490p_4<0p_46t0p_490p_4<0p_490p_490p_4<0p_46t0p_4<0p_4<0p_4<0p_46t0p_490p_490p_490p_4<0p_490p_4<0p_490p_4<0p_4?\0p_4<0p_490p_440p_4<0p_490p_490p_46t0p_4<0p_490p_490p_4<0p_490p_4<0p_46t0p_46t0p_490p_490p_4<0p_4<0p_490p_440p_490p_46t0p_4.v*0p_440p_46t0p_46t0p_440p_46t0p_46t0p_440p_490p_41FX0p_490p_46t0p_490p_440p_46t0p_46t0p_46t0p_440p_46t0p_46t0p_46t0p_440p_46t0p_490p_46t0p_4<0p_440p_490p_46t0p_440p_440p_440p_46t0p_46t0p_440p_440p_46t0p_46t0p_46t0p_490p_440p_46t0p_490p_46t0p_440p_440p_46t0p_46t0p_46t0p_46t0p_440p_46t0p_46t0p_440p_46t0p_46t0p_4<0p_4B,0p_490p_4<0p_4<0p_4<0p_4?\0p_4B,0p_4B,0p_4?\0p_4B,0p_4?\0p_4?\0p_4?\0p_4B,0p_4D0p_4<0p_4B,0p_4?\0p_4?\0p_4D0p_4?\0p_4D0p_490p_4?\0p_4?\0p_4B,0p_4?\0p_4B,0p_4B,0p_4B,0p_4<0p_4<0p_490p_490p_4<0p_490p_4?\0p_46t0p_4<0p_4?\0p_490p_4?\0p_4<0p_490p_490p_490p_4<0p_490p_46t0p_4<0p_490p_490p_4B,0p_490p_4<0p_46t0p_490p_490p_4<0p_46t0p_4<0p_4<0p_4<0p_46t0p_490p_490p_490p_4<0p_490p_490p_4<0p_4<0p_46t0p_46t0p_4?\0p_490p_4?\0p_4<0p_46t0p_46t0p_440p_490p_490p_440p_440p_46t0p_46t0p_440p_440p_490p_440p_41FX0p_41FX0p_440p_46t0p_490p_41FX0p_46t0p_440p_46t0p_440p_440p_440p_440p_46t0p_4?\0p_41FX0p_46t0p_41FX0p_46t0p_440p_440p_440p_440p_490p_440p_490p_440p_46t0p_41FX0p_46t0p_440p_46t0p_440p_440p_440p_440p_440p_41FX0p_46t0p_46t0p_440p_440p_46t0p_41FX0p_46t0p_440p_440p_46t0p_440p_440p_46t0p_490p_440p_490p_46t0p_440p_46t0p_41FX0p_41FX0p_490p_46t0p_41FX0p_46t0p_46t0p_440p_440p_440p_46t0p_46t0p_440p_440p_440p_440p_41FX0p_41FX0p_440p_440p_490p_46t0p_440p_490p_490p_46t0p_490p_41FX0p_440p_440p_440p_46t0p_46t0p_41FX0p_4<0p_41FX0p_440p_440p_46t0p_440p_440p_440p_440p_4.v*0p_46t0p_440p_440p_46t0p_46t0p_440p_490p_440p_440p_4.v*0p_41FX0p_4+<0p_41FX0p_4+<0p_46t0p_46t0p_440p_41FX0p_41FX0p_46t0p_46t0p_46t0p_440p_46t0p_46t0p_440p_46t0p_41FX0p_440p_46t0p_41FX0p_440p_46t0p_46t0p_46t0p_440p_4.v*0p_41FX0p_46t0p_46t0p_440p_440p_440p_41FX0p_440p_4.v*0p_46t0p_440p_440p_440p_440p_41FX0p_440p_440p_440p_41FX0p_440p_440p_440p_440p_46t0p_440p_440p_46t0p_41FX0p_41FX0p_46t0p_41FX0p_46t0p_440p_440p_440p_41FX0p_440p_41FX0p_440p_440p_41FX0p_440p_41FX0p_41FX0p_4.v*0p_41FX0p_41FX0p_41FX0p_4.v*0p_4.v*0p_4.v*0p_440p_41FX0p_440p_440p_4.v*0p_4+<0p_46t0p_4+<0p_4.v*0p_4.v*0p_41FX0p_41FX0p_41FX0p_4.v*0p_41FX0p_440p_41FX0p_440p_440p_4.v*0p_41FX0p_46t0p_41FX0p_41FX0p_4.v*0p_46t0p_4.v*0p_41FX0p_440p_41FX0p_440p_41FX0p_46t0p_4.v*0p_4.v*0p_41FX0p_4+<0p_4.v*0p_46t0p_4.v*0p_4.v*0p_4.v*0p_4.v*0p_4.v*0p_4.v*0p_41FX0p_4.v*0p_4.v*0p_41FX0p_4.v*0p_41FX0p_4+<0p_41FX0p_41FX0-]41FX0p_4.v*0-]41FX0p_41FX0p_41FX0p_440p_41FX0p_41FX0p_440p_440p_41FX0p_440p_46t0p_41FX0p_440p_440p_440p_4.v*0p_41FX0p_41FX0p_41FX0p_440p_440p_440p_440p_41FX1:,46t0p_440p_41FX0p_46t0p_440p_41FX0p_46t0p_440p_41FX0p_41FX0p_440p_41FX0p_46t0p_440p_46t0p_440p_46t0p_46t0p_46t0p_440p_490p_41FX0p_440p_46t0p_46t0p_4G0p_440p_46t0p_440p_490p_490p_4?\0p_490p_4<0p_4<0p_46t0p_490p_46t0p_4?\0p_490p_4<0p_4<0p_4<0p_490p_4<0p_490p_4<0p_490p_46t0p_490p_4<0p_490p_490p_490p_4<0p_4<0p_490p_4<0p_46t0p_490p_4<0p_4<0p_46t0p_46t0p_4<0p_4<0p_46t0p_46t0p_490p_440p_490p_46t0p_46t0p_46t0p_46t0p_4<0p_46t0p_46t0p_440p_490p_440p_46t0p_41FX0p_46t0p_440p_41FX0p_4.v*0p_440p_41FX0p_440p_41FX0p_41FX0p_440p_4.v*0p_41FX0p_4+<0p_440p_4.v*0p_46t0p_46t0p_440p_440p_41FX0p_41FX0p_41FX0p_4.v*0p_440p_41FX0p_440p_41FX0p_46t0p_41FX0p_41FX0p_440p_41FX0p_46t0p_41FX0p_46t0p_440p_4.v*0p_440p_41FX0p_41FX0p_440p_41FX0p_41FX0p_4.v*0p_440p_4.v*0p_41FX0p_440p_440p_41FX0p_440p_41FX0p_440p_440p_41FX0p_440p_41FX0p_490p_41FX0p_46t0p_46t0p_46t0p_440p_490p_440p_440p_41FX0p_4<0p_490p_46t0p_440p_46t0p_46t0p_440p_440p_46t0p_440p_46t0p_440p_46t0p_490p_46t0p_46t0p_440p_46t0p_490p_490p_46t0p_490p_490p_46t0p_490p_46t0p_440p_490p_46t0p_440p_46t0p_490p_490p_46t0p_4<0p_46t0p_46t0p_46t0p_46t0p_46t0p_440p_490p_4?\0p_490p_46t0p_41FX0p_440p_440p_490p_490p_440p_440p_440p_440p_41FX0p_46t0p_41FX0p_41FX0p_46t0p_440p_41FX0p_41FX0p_440p_440p_440p_4.v*0p_440p_41FX0p_41FX0p_46t0p_41FX0p_4.v*0p_4.v*0p_41FX0p_4.v*0p_41FX0p_4.v*0p_41FX0p_41FX0p_4.v*0p_46t0p_440p_41FX0p_4.v*0p_4.v*0p_41FX0p_41FX0p_41FX0p_4.v*0p_440p_4.v*0p_41FX0p_41FX0p_41FX0p_41FX0p_440p_4+<0p_41FX0p_440p_41FX0p_440p_41FX0p_440p_440p_46t0p_440p_41FX0p_46t0p_440p_4B,0p_4.v*0p_41FX0p_46t0p_46t0p_46t0p_41FX0p_440p_46t0p_440p_440p_46t0p_46t0p_46t0p_440p_440p_41FX0p_46t0p_46t0p_46t0p_490p_440p_440p_490p_440p_490p_490p_4?\0p_490p_4<0p_46t0p_490p_4<0p_4?\0p_4<0p_4<0p_4?\0p_4?\0p_46t0p_46t0p_4<0p_4<0p_490p_46t0p_490p_490p_490p_4<0p_46t0p_46t0p_46t0p_46t0p_4<0p_490p_46t0p_490p_4<0p_46t0p_490p_46t0p_4<0p_46t0p_41FX0p_490p_490p_440p_46t0p_490p_440p_490p_46t0p_440p_440p_490p_440p_440p_46t0p_46t0p_440p_46t0p_440p_440p_440p_4+<0p_41FX0p_46t0p_41FX0p_41FX0p_440p_490p_4<0p_490p_490p_46t0p_4<0p_4<0p_46t0p_46t0p_4?\0p_490p_490p_46t0p_490p_490p_46t0p_4<0p_46t0p_4<0p_46t0p_4<0p_440p_4<0p_4?\0p_4?\0p_4<0p_490p_4?\0p_4<0p_4B,0p_490p_4<0p_4?\0p_4?\0p_490p_4<0p_490p_4<0p_4?\0p_4<0p_490p_4<0p_4B,0p_4<0p_4<0p_4?\0p_4<0p_4?\0p_4?\0p_4<0p_4<0p_4<0p_490p_4?\0p_4<0p_490p_4<0p_4<0p_490p_4?\0p_490p_46t0p_490p_4<0p_490p_4<0p_4?\0p_4?\0p_4?\0p_4B,0p_4?\0p_4<0p_4<0p_4?\0p_4<0p_4B,0p_490p_4?\0p_4?\0p_490p_4B,0p_4<0p_4?\0p_4<0p_4?\0p_490p_4?\0p_4<0p_4<0p_4?\0p_4B,0p_4?\0p_4B,0p_4<0p_4<0p_4?\0p_4B,0p_4?\0p_4B,0p_4?\0p_4?\0p_4G0p_4?\0p_4B,0p_4?\0p_4<0p_4B,0p_490p_4B,0p_4?\0p_4?\0p_4?\0p_4?\0p_4?\0p_4?\0p_4<0p_4B,0p_4<0p_4?\0p_4B,0p_4?\0p_4D0p_4D0p_4G0p_4B,0p_4D0p_4G0p_4B,0p_4D0p_4D0p_4D0p_4D0p_4B,0p_4B,0p_4B,0p_4D0p_4?\0p_4D0p_4D0p_4D0p_4B,0p_4B,0p_4D0p_4B,0p_4D0p_4?\0p_4?\0p_4D0p_4G0p_4B,0p_4D0p_4B,0p_4B,0p_4?\0p_4D0p_4B,0p_4<0p_4B,0p_4B,0p_4B,0p_4D0p_4B,0p_4D0p_4D0p_4B,0p_4B,0p_4D0p_4D0p_4D0p_4?\0p_4D0p_4B,0p_4?\0p_4D0p_4B,0p_4B,0p_4D0p_4B,0p_4?\0p_4B,0p_4D0p_4B,0p_4B,0p_4B,0p_4B,0p_4B,0p_4B,0p_4D0p_4B,0p_4?\0p_4D0p_4D0p_4B,0p_4?\0p_4D0p_4D0p_4B,0p_4?\0p_4D0p_4B,0p_4B,0p_4B,0p_4?\0p_4<0p_4?\0p_4<0p_4B,0p_4?\0p_4B,0p_4B,0p_4<0p_4?\0p_4B,0p_4?\0p_46t0p_490p_4<0p_46t0p_46t0p_46t0p_4<0p_4<0p_46t0p_4<0p_440p_490p_440p_46t0p_4?\0p_46t0p_46t0p_46t0p_4<0p_4<0p_46t0p_46t0p_4+<0p_490p_46t0p_490p_46t0p_490p_46t0p_490p_46t0p_490p_41FX0p_490p_440p_46t0p_4<0p_4<0p_46t0p_490p_490p_46t0p_4<0p_4<0p_490p_490p_4<0p_46t0p_4<0p_4?\0p_490p_490p_490p_46t0p_4<0p_46t0p_46t0p_46t0p_4<0p_4<0p_4<0p_46t0p_46t0p_46t0p_490p_46t0p_490p_4<0p_490p_4<0p_4<0p_4<0p_4<0p_4?\0p_490p_4<0p_4<0p_490p_4<0p_4<0p_4<0p_490p_4<0p_490p_4<0p_490p_490p_4<0p_4<0p_490p_4?\0p_46t0p_4D0p_4<0p_4<0p_4<0p_4B,0p_4<0p_4?\0p_490p_4<0p_4<0p_490p_4?\0p_490p_4<0p_4<0p_490p_4?\0p_4G0p_4<0p_490p_490p_490p_4?\0p_4<0p_4<0p_4B,0p_4B,0p_4?\0p_4B,0p_4B,0p_4B,0p_4B,0p_4D0p_4D0p_490p_4B,0p_4?\0p_4<0p_4?\0p_4<0p_4B,0p_4<0p_4?\0p_4<0p_4?\0p_4?\0p_46t0p_490p_490p_490p_4<0p_4?\0p_4<0p_4<0p_4?\0p_4B,0p_4?\0p_4B,0p_4<0p_4?\0p_4<0p_4B,0p_4B,0p_4?\0p_4B,0p_4D0p_4D0p_4<0p_4B,0p_4B,0p_4?\0p_4?\0p_4<0p_4B,0p_4<0p_4<0p_4?\0p_4?\0p_490p_4B,0p_4<0p_4?\0p_4?\0p_4<0p_490p_490p_4<0p_46t0p_4<0p_46t0p_4<0p_440p_4<0p_490p_490p_490p_4<0p_490p_4?\0p_490p_490p_4<0p_490p_490p_490p_46t0p_490p_490p_4<0p_4?\0p_4D0p_4?\0p_4?\0p_490p_4?\0p_4?\0p_4<0p_490p_4?\0p_4?\0p_4?\0p_490p_4B,0p_46t0p_4?\0p_4<0p_4?\0p_4<0p_4<0p_4?\0p_4<0p_4?\0p_4<0p_4?\0p_4?\0p_4?\0p_4<0p_4?\0p_4?\0p_4<0p_490p_490p_46t0p_46t0p_440p_490p_46t0p_46t0p_490p_46t0p_46t0p_490p_46t0p_46t0p_46t0p_490p_46t0p_46t0p_46t0p_490p_46t0p_46t0p_46t0p_440p_4<0p_46t0p_41FX0p_490p_440p_4?\0p_4<0p_490p_4?\0p_4<0p_490p_490p_4<0p_4?\0p_4?\0p_4<0p_4<0p_4<0p_4<0p_4<0p_4<0p_4<0p_4?\0p_490p_4<0p_4?\0p_490p_4?\0p_4?\0p_4<0p_4<0p_4<0p_4?\0p_4?\0p_4<0p_4B,0p_490p_4B,0p_4<0p_4?\0p_4<0p_4?\0p_4?\0p_4B,0p_4?\0p_4?\0p_4B,0p_4<0p_4<0p_46t0p_46t0p_4?\0p_4?\0p_4?\0p_4?\0p_4B,0p_4B,0p_4B,0p_4D0p_4?\0p_4B,0p_4<0p_4?\0p_4<0p_4<0p_4?\0p_490p_4<0p_4<0p_4?\0p_4?\0p_4?\0p_4<0p_4B,0p_4<0p_4?\0p_4B,0p_4?\0p_4?\0p_4?\0p_4<0p_4?\0p_4?\0p_4?\0p_4?\0p_4?\0p_4?\0p_4<0p_4B,0p_46t0p_4<0p_490p_4<0p_440p_440p_490p_46t0p_490p_440p_46t0p_46t0p_4<0p_490p_46t0p_490p_490p_490p_46t0p_46t0p_46t0p_490p_490p_46t0p_46t0p_490p_46t0p_46t0p_46t0p_490p_490p_490p_46t0p_46t0p_490p_4<0p_46t0p_4?\0p_46t0p_490p_4<0p_46t0p_490p_4?\0p_490p_4?\0p_46t0p_4<0p_4?\0p_490p_490p_490p_46t0p_4?\0p_46t0p_490p_4<0p_490p_4<0p_4B,0p_4D0p_4?\0p_4G0p_4?\0p_4B,0p_4B,0p_4G0p_4B,0p_4G0p_4D0p_4B,0p_4D0p_4D0p_4D0p_4D0p_4D0p_4G0p_4D0p_4B,0p_4G0p_4B,0p_4D0p_4D0p_4B,0p_4B,0p_4G0p_4?\0p_4B,0p_4?\0p_4<0p_4D0p_4B,0p_4?\0p_4B,0p_4?\0p_4?\0p_4B,0p_4B,0p_4?\0p_4?\0p_4B,0p_4?\0p_4?\0p_4B,0p_4B,0p_4?\0p_4D0p_4?\0p_4?\0p_4?\0p_4D0p_4D0p_4B,0p_4B,0p_4?\0p_4?\0p_4B,0p_4D0p_4<0p_4B,0p_4D0p_4B,0p_4B,0p_4?\0p_4B,0p_4B,0p_4B,0p_4Mpd0p_4J60p_4G0p_4B,0p_4B,0p_4G0p_4J60p_4B,0p_4B,0p_4G0p_4D0p_4?\0p_4G0p_4D0p_4B,0p_4D0p_4B,0p_4D0p_4D0-]4B,0p_4D0p_4?\0-]4D0p_4D0p_4B,0p_4B,0p_4<0p_490p_4B,0p_4?\0p_4<0p_4<0p_4<0p_490p_4<0p_4<0p_490p_4<0p_4?\0p_490p_490p_4?\0p_490p_46t0p_440p_490p_4?\0p_4<0p_490p_46t0p_4B,0p_4<0p_4<0p_4<0p_4<0p_4<0p_46t0p_4<0p_4?\0p_4<0p_4?\0p_4<0p_4<0p_4<0p_490p_4D0p_490p_4?\0p_4<0p_4<0p_490p_4?\0p_490p_490p_4?\0p_4<0p_46t0p_4<0p_490p_490p_4<0p_4?\0p_4<0p_4?\0p_490p_4?\0p_4<0p_4<0p_4<0p_4<0p_4<0p_490p_4?\0p_4?\0p_4?\0p_4?\0p_4B,0p_4D0p_4?\0p_4<0p_4<0p_4?\0p_490p_46t0p_490p_490p_4<0p_4?\0p_4<0p_490p_4?\0p_4<0p_4<0p_4?\0p_4<0p_4<0p_4?\0p_490p_490p_4<0p_490p_4?\0p_4?\0p_4?\0p_490p_4B,0p_4<0p_490p_4<0p_46t0p_490p_490p_46t0p_4?\0p_46t0p_490p_490p_490p_4<0p_4<0p_4<0p_490p_490p_490p_4<0p_490p_4<0p_490p_490p_4<0p_490p_490p_440p_4<0p_490p_490p_4<0p_490p_490p_4<0p_4?\0p_46t0p_4<0p_4<0p_46t0-]490p_490p_490p_4<0p_490p_4?\0p_490p_490p_490p_4<0p_490p_4?\0p_4<0p_4<0p_4<0p_490p_4?\0p_4<0p_4B,0p_4?\0p_4?\0p_4?\0p_4<0p_4?\0p_4B,0p_4<0p_4B,0p_4D0p_4D0p_4D0p_4D0-]4G0p_4D0p_4B,0p_4D0p_4B,0p_4D0p_4?\0p_4B,0p_4D0p_4?\0p_4B,0p_4B,0p_4B,0p_4B,0-]4B,0p_4?\0p_4B,0p_4?\0p_4?\0p_4B,0p_4?\0p_4B,0p_4?\0p_4?\0p_4B,0p_4B,0p_4<0p_4B,0p_4D0p_4B,0p_4B,0p_490p_4<0p_490p_4?\0p_490p_4<0p_490p_4<0p_490p_4?\0p_490p_4<0p_490p_46t0p_4<0p_490p_490p_46t0p_490p_490p_46t0p_490p_4<0p_490p_490p_440p_4<0p_490p_4<0p_490p_46t0p_490p_4<0p_490p_46t0p_490p_440p_490p_4<0p_4<0p_46t0p_4?\0p_46t0p_490p_490p_4?\0p_4?\0p_4?\0p_4<0p_4B,0p_4<0-]4B,0-]4?\0p_4<0-]4?\1:,4?\0p_4B,0-]4?\0-]4?\0p_490-]491:,4<1:,4<0p_491:,491:,4<0-]4B,1:,490-]490p_4<0-]490p_491:,490-]490-]490p_490p_490-]491:,46t1:,49146t1:,46t13491:,4B,0p_46t0p_4?\0p_4?\1:,490p_4?\1:,490-]4<0p_4<0p_4<0p_4?\0p_490p_490p_4?\0p_490p_4B,0p_4<0p_4<0p_4?\0-]490p_490-]4<0p_490-]4<0-]490-]4914<13491:,491:,490p_46t146t0p_46t0-]46t0-]4<0p_46t0-]46t0p_490p_46t0p_490p_46t0p_490p_46t0p_490p_490p_4<0p_490p_4?\0p_4?\0p_4B,0p_4?\0p_4?\0p_4B,0p_4?\0p_4?\0p_4<0p_4?\0p_4D0p_4<0p_4?\0p_4?\0p_4B,0p_4<0p_4B,0p_4?\0p_490p_4<0p_4B,0p_4?\0p_4B,0p_4?\0p_4B,0p_490p_4?\0p_4<0p_490p_4<0p_4<0p_490p_4<0p_4<0p_4<0p_4<0p_4<0p_490p_4?\0p_490p_490p_4?\0p_4<0p_4<0p_4?\0p_4?\0p_4?\0p_490p_4<0p_490p_4<0p_4<0p_4<0p_4?\0p_4<0p_490p_4?\0p_4<0p_46t0p_490p_490p_4<0p_4<0p_4<0p_490p_4?\0p_4<0p_4<0p_4<0p_4<0p_4<0p_490p_490p_490p_490p_490p_490p_490p_4?\0p_490p_4<0p_46t0p_490p_4?\0p_490p_4<0p_490p_4?\0p_490p_4<0p_4<0p_46t0p_490p_4?\0p_4<0p_4<0p_4<0p_490p_4<0p_4B,0p_4D0p_4B,0p_4D0p_4?\0p_4D0p_4<0p_4B,0p_4<0p_4B,0p_4B,0p_4<0p_4B,0p_4<0p_4B,0p_4B,0p_4<0p_4B,0p_4?\0p_4D0p_4<0p_4D0p_4?\0p_4B,0p_4B,0p_4D0p_4B,0p_4B,0p_4G0p_4G0p_4J60p_4Mpd0p_4B,0p_4B,0p_4B,0p_4G0p_4G0p_4?\0p_4<0p_4?\0p_4<0p_4?\0p_4<0p_4?\0p_4?\0p_4?\0p_4<0p_4?\0p_4?\0p_4?\0p_4?\0p_4?\0p_4?\0p_4B,0p_4?\0p_4?\0p_4?\0p_4<0p_4B,0p_4?\0p_4<0p_4?\0p_4?\0p_4?\0p_4B,0p_4B,0p_490p_4B,0p_4?\0p_4<0p_4?\0p_4<0p_4<0p_4<0p_490p_4<0p_4<0p_4<0p_4<0p_4<0p_490p_490p_46t0p_4<0p_490p_490p_4<0p_440p_46t0p_490p_4<0p_490p_4<0p_46t0p_46t0p_4<0p_4?\0p_490p_4<0p_490p_440p_440p_4<0p_46t0p_490p_490p_490p_490p_46t0p_490p_46t0p_490p_46t0p_490p_46t0p_46t0p_46t0p_46t0p_46t0p_490p_440p_490p_46t0p_4<0p_46t0p_46t0p_490p_440p_46t0p_440p_490p_46t0p_490p_4<0p_4?\0p_490p_490p_490p_490p_490p_490p_41FX0p_46t0p_490p_490p_4?\0p_4<0p_490p_4?\0p_4<0p_4?\0p_4<0p_4<0p_4?\0p_4<0p_490p_490p_4?\0p_4?\0p_4?\0p_4<0p_4?\0p_4B,0p_4J60p_490p_4?\0p_4?\0p_4B,0p_4?\0p_4?\0p_4<0p_490p_490p_4B,0p_490p_490p_4<0p_490p_490p_4?\0p_490p_490p_4<0p_4<0p_490p_4<0p_46t0p_41FX0p_4<0p_4<0p_4<0p_490p_4<0p_490p_4?\0p_4<0p_4<0p_4?\0p_490p_4?\0p_490p_4B,0p_4?\0p_4<0p_4<0p_4<0p_490p_4?\0p_490p_4B,0p_490p_4?\0p_4<0p_4<0p_4?\0p_4<0p_4<0p_4<0p_4<0p_4<0p_4<0p_4<0p_490p_4B,0p_4<0p_4<0p_490p_4?\0p_46t0p_4<0p_4<0p_490p_4<0p_4?\0p_46t0p_4?\0p_46t0p_4<0p_46t0p_4<0p_490p_4?\0p_490p_490p_490p_4<0p_4<0p_4?\0p_46t0p_490p_46t0p_4?\0p_490p_4<0p_46t0p_46t0p_490p_490p_4<0p_4<0p_4<0p_4?\0p_490p_490p_490p_440p_4<0p_4B,0p_46t0p_490p_4<0p_4?\0p_4<0p_490p_46t0p_490p_46t0p_4<0p_490p_4<0p_46t0p_46t0p_4<0p_490p_46t0p_46t0p_490p_41FX0p_490p_4<0p_441:,4<0p_46t0p_490p_46t0p_46t0p_440p_490p_490p_46t0p_4<0p_440p_440p_440p_4.v*0p_46t0p_4<0p_490p_490p_46t0p_4<0p_4?\0p_4B,0p_490p_4<0p_46t0p_4<0p_46t0p_4<0p_4<0p_490p_490p_4?\0p_4<0p_4<0p_46t0p_4<0p_46t0p_46t0p_46t0p_440p_440p_440p_46t0p_4.v*0p_46t0p_490p_46t0p_46t0p_46t0p_46t0p_440p_490p_46t0p_46t0p_440p_440p_46t0p_440p_4<0p_490p_46t0p_46t0p_440p_440p_490p_440p_41FX0p_440p_46t0p_440p_440p_440p_46t0p_4<0p_440p_440p_4<0p_46t0p_46t0p_41FX0p_440p_41FX0p_41FX0p_4.v*0p_41FX0p_440p_41FX0p_440p_4.v*0p_41FX0p_440p_440p_440p_440p_46t0p_440p_440p_440p_46t0p_440p_440p_41FX0p_440p_41FX0p_440p_46t0p_440p_440p_440p_46t0p_440p_46t0p_440p_46t0p_46t0p_46t0p_440p_46t0p_490p_46t0p_46t0p_46t0p_490p_440p_46t0p_46t0p_46t0p_440p_490p_440p_440p_41FX0p_41FX0p_440p_41FX0p_46t0p_490p_490p_46t0p_46t0p_490p_490p_440p_440p_490p_490p_46t0p_46t0p_490p_46t0p_46t0p_46t0p_440p_4<0p_440p_46t0p_4<0p_440p_490p_490p_41FX0p_46t0p_440p_46t0p_46t0p_46t0p_41FX0p_490p_490p_46t0p_4?\0p_4<0p_490p_4<0p_46t0p_4?\0p_4?\0p_46t0p_4<0p_4<0p_490p_490p_4<0p_4<0p_4<0p_490p_4<0p_4?\0p_490p_4<0p_4?\0p_4<0p_490p_4?\0p_4?\0p_4?\0p_4<0p_4<0p_4<0p_4?\0p_4<0p_4<0p_4B,0p_4G0p_4G0p_4D0p_4B,0p_4D0p_4G0p_4B,0p_4D0p_4B,0p_4G0p_4D0p_4B,0p_4J60p_4D0p_4G0p_4G0p_4G0p_4G0p_4G0p_4J60p_4J60p_4G0p_4Mpd0p_4J60p_4J60p_4J60p_4D0p_4G0p_4D0p_4G0p_4D0p_4D0p_4G0p_4D0p_4G0p_4B,0p_4G0p_4D0p_4D0p_4G0p_4G0p_4G0p_4G0p_4D0p_4G0p_4G0p_4J60p_4G0p_4D0p_4G0p_4G0p_4J60p_4G0p_4J60p_4G0p_4D0p_4G0p_4Mpd0p_4Mpd0p_4J60p_4J60p_4G0p_4Mpd0p_4G0p_4J60p_4G0p_4G0p_4J60p_4J60p_4Mpd0p_4B,0p_4J60p_4J60p_4J60p_4G0p_4J60p_4J60p_4Mpd0p_4Mpd0p_4J60p_4J60p_4Mpd0p_4G0p_4B,0p_4Mpd0p_4G0p_4J60p_4J60p_4G0p_4J60p_4J60p_4G0p_4J60p_4D0p_4Mpd0p_4PCR0p_4Mpd0p_4PCR0p_4G0p_4G0p_4G0p_4D0p_4D0p_4G0p_4D0p_4Mpd0p_4Mpd0p_4B,0p_4J60p_4J60p_4D0p_4Mpd0p_4G0p_4J60p_4D0p_4G0p_4G0p_4Mpd0p_4PCR0p_4G0p_4Mpd0p_4J60p_4J60p_4J60p_4J60p_4G0p_4G0p_4J60p_4D0p_4Mpd0p_4J60p_4G0p_4J60p_4J60p_4J60p_4J60p_4Mpd0p_4Mpd0p_4Mpd0p_4J60p_4J60p_4J60p_4PCR0p_4J60p_4G0p_4Mpd0p_4J60p_4Mpd0p_4G0p_4PCR0p_4Mpd0p_4PCR0p_4PCR0p_4Mpd0p_4PCR0p_4Mpd0p_4PCR0p_4PCR0p_4PCR0p_4Mpd0p_4PCR0p_4J60p_4PCR0p_4PCR0p_4Mpd0p_4Mpd0p_4PCR0p_4Mpd0p_4Mpd0p_4U0p_4PCR0p_4J60p_4J60p_4Mpd0p_4Mpd0p_4PCR0p_4PCR0p_4Mpd0p_4PCR0p_4Mpd0p_4G0p_4S0p_4PCR0p_4G0p_4G0p_4J60p_4G0p_4J60p_4J60p_4J60p_4B,0p_4D0p_4?\0p_4B,0p_4B,0p_4B,0p_4?\0p_4D0p_4D0p_4B,0p_4D0p_4B,0p_4G0p_4D0p_4D0p_4B,0p_4B,0p_4B,0p_4D0p_4B,0p_4<0p_4B,0p_4?\0p_4G0p_4B,0p_4D0p_4D0p_4B,0p_4G0p_4B,0p_4G0p_4B,0p_4B,0p_4B,0p_4D0p_4B,0p_4?\0p_4D0p_4G0p_4B,0p_4D0p_4B,0p_4G0p_4G0p_4?\0p_4B,0p_4B,0p_4D0p_4<0p_4B,0p_4D0p_4B,0p_4?\0p_4?\0p_4?\0p_4?\0p_4<0p_4D0p_4B,0p_4B,0p_4D0p_4B,0p_4<0p_4B,0p_4B,0p_4D0p_4<0p_4<0p_4B,0p_4?\0p_4?\0p_4?\0p_4?\0p_4<0p_4<0p_4?\0p_4?\0p_4?\0p_4<0p_4?\0p_4?\0p_4D0p_4B,0p_4B,0p_4G0p_4D0p_4D0p_4B,0p_4D0p_4D0p_4D0p_4B,0p_4G0p_4B,0p_4D0p_4B,0p_4G0p_4B,0p_4G0p_4D0p_4G0p_4G0p_4B,0p_4J60p_4D0p_4Mpd0p_4D0p_4D0p_4B,0p_4D0p_4D0p_4B,0p_4D0p_4D0p_4D0p_4G0p_4B,0p_4G0p_4D0p_4D0p_4G0p_4G0p_4G0p_4<0p_4B,0p_4?\0p_4?\0p_4D0p_4D0p_4D0p_4G0p_4J60p_4J60p_4J60p_4G0p_4G0p_4J60p_4Mpd0p_4G0p_4?\0p_4D0p_4D0p_4B,0p_4D0p_4B,0p_4?\0p_4B,0p_4?\0p_4B,0p_4B,0p_4B,0p_4?\0p_4<0p_4?\0p_4B,0p_4B,0p_4<0p_4D0p_490p_4?\0p_4?\0p_4B,0p_4B,0p_4?\0p_4B,0p_4<0p_4?\0p_4?\0p_4<0p_4<0p_4B,0p_4<0p_490p_4?\0p_4B,0p_4?\0p_4<0p_4B,0p_4<0p_4B,0p_4?\0p_4D0p_490p_4?\0p_4?\0p_4?\0p_4<0p_4B,0p_4D0p_440p_490p_46t0p_4?\0p_4B,0p_4B,0p_4?\0p_4D0p_4?\0p_4B,0p_4D0p_4<0p_4?\0p_4D0p_4B,0p_4?\0p_4?\0p_4B,0p_4B,0p_4B,0p_4?\0p_4?\0p_4?\0p_4B,0p_4B,0p_4G0p_4G0p_4D0p_4D0p_4B,0p_4D0p_4D0p_4D0p_4B,0p_4D0p_4B,0p_4G0p_4B,0p_4B,0p_4D0p_4B,0p_4D0p_4B,0p_4B,0p_4?\0p_490p_4?\0p_4<0p_4?\0p_4?\0p_4<0p_4B,0p_4<0p_4?\0p_4<0p_4?\0p_4<0p_4?\0p_4<0p_4B,0p_4<0p_4<0p_4<0p_4?\0p_4?\0p_4<0p_4?\0p_4B,0p_46t0p_4<0p_4<0p_4?\0p_4<0p_4?\0p_4?\0p_490p_490p_4<0p_4<0p_4<0p_490p_490p_4?\0p_4<0p_4<0p_4<0p_4<0p_4<0p_4?\0p_4<0p_490p_490p_4?\0p_4<0p_4<0p_4<0p_490p_490p_4<0p_4?\0p_4?\0p_4?\0p_4B,0p_4<0p_4?\0p_4?\0p_4<0p_4<0p_4B,0p_4?\0p_4B,0p_4?\0p_4B,0p_4B,0p_4D0p_4B,0p_4D0p_4B,0p_4B,0p_4B,0p_4D0p_4?\0p_4?\0p_4B,0p_4B,0p_4B,0p_4B,0p_4B,0p_4D0p_4D0p_4B,0p_4?\0p_4B,0p_4B,0p_4D0p_4?\0p_4B,0p_4D0p_4B,0p_4B,0p_4B,0p_4B,0p_4B,0p_4?\0p_4?\0p_4B,0p_4B,0p_4D0p_4?\0p_4?\0p_4?\0p_4B,0p_4<0p_4B,0p_4B,0p_4B,0p_4B,0p_4<0p_4B,0p_4?\0p_4B,0p_4?\0p_4B,0p_4B,0p_4B,0p_4G0p_4?\0p_4B,0p_4B,0p_4B,0p_4<0p_4<0p_4<0p_4<0p_4?\0p_4?\0p_4D0p_4B,0p_4D0p_4G0p_4B,0p_4B,0p_4D0p_4G0p_4D0p_4J60p_4G0p_4D0p_4G0p_4G0p_4D0p_4Mpd0p_4J60p_4G0p_4G0p_4J60p_4J60p_4D0p_4G0p_4G0p_4G0p_4D0p_4J60p_4D0p_4G0p_4D0p_4J60p_4G0p_4G0p_4J60p_4D0p_4G0p_4J60p_4G0p_4B,0p_4J60p_4D0p_4J60p_4G0p_4D0p_4G0p_4B,0p_4D0p_4?\0p_4?\0p_4B,0p_4J60p_4J60p_4G0p_4J60p_4G0p_4B,0p_4D0p_4D0p_4B,0p_4D0p_4B,0p_4B,0p_4D0p_4?\0p_4B,0p_4B,0p_4B,0p_4D0p_4?\0p_4D0p_4B,0p_4D0p_4B,0p_4G0p_4G0p_4<0p_4D0p_4?\0p_4G0p_4?\0p_4B,0p_4B,0p_4D0p_4D0p_4D0p_4?\0p_4?\0p_4<0p_4B,0p_4<0p_4<0p_4<0p_490p_4<0p_4<0p_4?\0p_4<0p_4?\0p_4B,0p_4B,0p_4?\0p_4B,0p_4<0p_4?\0p_4?\0p_4G0p_4D0p_4?\0p_4B,0p_4?\0p_4B,0p_4G0p_4B,0p_4G0p_4G0p_4G0p_4D0p_4B,0p_4G0p_4B,0p_4D0p_4D0p_4G0p_4G0p_4J60p_4D0p_4B,0p_4?\0p_4B,0p_4?\0p_4B,0p_4D0p_4<0p_4?\0p_4<0p_4?\0p_4?\0p_4B,0p_4B,0p_4<0p_4<0p_4D0p_490p_4?\0p_4?\0p_4?\0p_4?\0p_4?\0p_4D0p_4D0p_4D0p_4D0p_4D0p_4G0p_4G0p_4J60p_4G0p_4D0p_4G0p_4D0p_4G0p_4G0p_4J60p_4D0p_4D0p_4G0p_4D0p_4D0p_4B,0p_4B,0p_4D0p_4D0p_4D0p_4?\0p_4D0p_4?\0p_4?\0p_4D0p_4B,0p_4B,0p_4D0p_4B,0p_4D0p_4D0p_4G0p_4D0p_4G0p_4J60p_4D0p_4D0p_4D0p_4J60p_4G0p_4J60p_4Mpd0p_4Mpd0p_4S0p_4PCR0p_4S0p_4PCR0p_4S0p_4S0p_4PCR0p_4S0p_4S0p_4S0p_4U0p_4Mpd0p_4S0p_4U0p_4S0p_4PCR0p_4S0p_4S0p_4S0p_4PCR0p_4PCR0p_4S0p_4S0p_4S0p_4PCR0p_4U0p_4PCR0p_4PCR0p_4U0p_4U0p_4S0p_4PCR0p_4U0p_4PCR0p_4S0p_4U0p_4PCR0p_4PCR0p_4Mpd0p_4Mpd0p_4Mpd0p_4S0p_4U0p_4S0p_4Mpd0p_4Mpd0p_4Mpd0p_4Mpd0p_4PCR0p_4X0p_4U0p_4Mpd0p_4Mpd0p_4S0p_4PCR0p_4G0p_4PCR0p_4Mpd0p_4S0p_4J60p_4PCR0p_4J60p_4PCR0p_4Mpd0p_4G0p_4Mpd0p_4S0p_4Mpd0p_4PCR0p_4J60p_4G0p_4Mpd0p_4J60p_4J60p_4G0p_4PCR0p_4J60p_4PCR0p_4G0p_4J60p_4PCR0p_4G0p_4Mpd0p_4J60p_4Mpd0p_4J60p_4Mpd0p_4J60p_4G0p_4G0p_4G0p_4PCR0p_4J60p_4J60p_4Mpd0p_4PCR0p_4J60p_4J60p_4G0p_4PCR0p_4J60p_4Mpd0p_4G0p_4J60p_4PCR0p_4G0p_4Mpd0p_4Mpd0p_4Mpd0p_4J60p_4G0p_4PCR0p_4D0p_4G0p_4D0p_4G0p_4D0p_4G0p_4B,0p_4J60p_4D0p_4G0p_4G0p_4D0p_4G0p_4J60p_4B,0p_4D0p_4D0p_4D0p_4G0p_4D0p_4G0p_4D0p_4D0p_4D0p_4B,0p_4G0p_4B,0p_4G0p_4D0p_4D0p_4D0p_4G0p_4B,0p_4D0p_4B,0p_4D0p_4G0p_4B,0p_4B,0p_4D0p_4G0p_4B,0p_4B,0p_4G0p_4B,0p_4B,0p_4D0p_4D0p_4?\0p_4J60p_4?\0p_4D0p_4D0p_4J60p_4D0p_4G0p_4D0p_4G0p_4G0p_4G0p_4G0p_4J60p_4Mpd0p_4J60p_4J60p_4J60p_4G0p_4J60p_4J60p_4Mpd0p_4G0p_4Mpd0p_4G0p_4J60p_4Mpd0p_4D0p_4G0p_4J60p_4D0p_4B,0p_4G0p_4G0p_4G0p_4D0p_4B,0p_4G0p_4D0p_4G0p_4D0p_4G0p_4G0p_4D0p_4J60p_4B,0p_4D0p_4B,0p_4?\0p_4B,0p_4?\0p_4D0p_4G0p_4D0p_4G0p_4D0p_4J60p_4B,0p_4D0p_4G0p_4D0p_4G0p_4D0p_4B,0p_4G0p_4D0p_4Mpd0p_4G0p_4J60p_4G0p_4J60p_4Mpd0p_4Mpd0p_4J60p_4Mpd0p_4J60p_4G0p_4J60p_4J60p_4J60p_4J60p_4J60p_4PCR0p_4PCR0p_4U0p_4PCR0p_4PCR0p_4S0p_4S0p_4PCR0p_4U0p_4Mpd0p_4U0p_4Mpd0p_4Mpd0p_4PCR0p_4J60p_4PCR0p_4PCR0p_4G0p_4PCR0p_4J60p_4Mpd0p_4Mpd0p_4PCR0p_4Mpd0p_4PCR0p_4Mpd0p_4PCR0p_4Mpd0p_4J60p_4Mpd0p_4Mpd0p_4J60p_4J60p_4G0p_4Mpd0p_4Mpd0p_4PCR0p_4G0p_4J60p_4J60p_4Mpd0p_4G0p_4J60p_4J60p_4PCR0p_4G0p_4J60p_4Mpd0p_4J60p_4D0p_4D0p_4B,0p_4J60p_4J60p_4Mpd0p_4G0p_4D0p_4J60p_4D0p_4J60p_4J60p_4Mpd0p_4J60p_4J60p_4G0p_4J60p_4J60p_4G0p_4G0p_4Mpd0p_4G0p_4G0p_4G0p_4D0p_4J60p_4G0p_4G0p_4?\0p_4D0p_4G0p_4D0p_4G0p_4B,0p_4G0p_4J60p_4J60p_4G0p_4Mpd0p_4D0p_4Mpd0p_4G0p_4G0p_4J60p_4G0p_4J60p_4J60p_4J60p_4J60p_4G0p_4G0p_4Mpd0p_4J60p_4G0p_4G0p_4Mpd0p_4D0p_4J60p_4J60p_4D0p_4J60p_4J60p_4G0p_4G0p_4D0p_4G0p_4J60p_4D0p_4?\0p_4D0p_4D0p_4B,0p_4D0p_4D0p_4B,0p_4J60p_4G0p_4PCR0p_4G0p_4D0p_4G0p_4G0p_4J60p_4D0p_4J60p_4J60p_4J60p_4J60p_4J60p_4D0p_4Mpd0p_4J60p_4J60p_4G0p_4Mpd0p_4G0p_4G0p_4D0p_4B,0p_4G0p_4D0p_4G0p_4D0p_4J60p_4PCR0p_4G0p_4Mpd0p_4J60p_4J60p_4J60p_4J60p_4Mpd0p_4J60p_4Mpd0p_4J60p_4Mpd0p_4Mpd0p_4J60p_4J60p_4J60p_4J60p_4J60p_4Mpd0p_4J60p_4B,0p_4G0p_4B,0p_4D0p_4B,0p_4Mpd0p_4Mpd0p_4J60p_4G0p_4J60p_4G0p_4G0p_4J60p_4G0p_4G0p_4D0p_4B,0p_4B,0p_4G0p_4D0p_4D0p_4D0p_4D0p_4D0p_4B,0p_4B,0p_4G0p_4B,0p_4B,0p_4D0p_4D0p_4D0p_4B,0p_4G0p_4D0p_4D0p_4D0p_4J60p_4D0p_4D0p_4G0p_4G0p_4B,0p_4B,0p_4G0p_4G0p_4D0p_4B,0p_4D0p_4D0p_4D0p_4D0p_4D0p_4G0p_4D0p_4G0p_4D0p_4D0p_4D0p_4G0p_4?\0p_4D0p_4D0p_4G0p_4G0p_4G0p_4B,0p_4D0p_4B,0p_4G0p_4G0p_4D0p_4D0p_4G0p_4D0p_4Mpd0p_4Mpd0p_4G0p_4J60p_4Mpd0p_4G0p_4J60p_4J60p_4Mpd0p_4Mpd0p_4J60p_4PCR0p_4PCR0p_4G0p_4G0p_4J60p_4J60p_4J60p_4D0p_4G0p_4G0p_4G0p_4J60p_4B,0p_4G0p_4J60p_4D0p_4J60p_4D0p_4J60p_4G0p_4G0p_4G0p_4Mpd0p_4J60p_4D0p_4G0p_4G0p_4G0p_4G0p_4G0p_4D0p_4G0p_4D0p_4G0p_4Mpd0p_4G0p_4Mpd0p_4G0p_4J60p_4G0p_4D0p_4J60p_4J60p_4G0p_4G0p_4PCR0p_4PCR0p_4J60p_4G0p_4J60p_4B,0p_4G0p_4G0p_4Mpd0p_4J60p_4J60p_4J60p_4Mpd0p_4G0p_4Mpd0p_4J60p_4G0p_4G0p_4Mpd0p_4G0p_4G0p_4Mpd0p_4D0p_4Mpd0p_4J60p_4G0p_4Mpd0p_4PCR0p_4Mpd0p_4J60p_4Mpd0p_4G0p_4G0p_4D0p_4J60p_4G0p_4D0p_4D0p_4G0p_4J60p_4D0p_4D0p_4G0p_4D0p_4G0p_4D0p_4D0p_4G0p_4D0p_4D0p_4G0p_4G0p_4D0p_4J60p_4?\0p_4G0p_4D0p_4G0p_4J60p_4PCR0p_4G0p_4J60p_4Mpd0p_4G0p_4G0p_4G0p_4Mpd0p_4B,0p_4D0p_4G0p_4J60p_4D0p_4J60p_4D0p_4G0p_4D0p_4G0p_4D0p_4B,0p_4S0p_4D0p_4G0p_4J60p_4D0p_4G0p_4J60p_4J60p_4D0p_4G0p_4D0p_4D0p_4G0p_4D0p_4G0p_4G0p_4B,0p_4G0p_4B,0p_4G0p_4B,0p_4J60p_4D0p_4D0p_4G0p_4D0p_4D0p_4J60p_4G0p_4G0p_4D0p_4G0p_4G0p_4G0p_4G0p_4G0p_4D0p_4D0p_4D0p_4G0p_4D0p_4G0p_4D0p_4D0p_4D0p_4D0p_4G0p_4B,0p_4?\0p_4<0p_4D0p_4D0p_4D0p_4D0p_4D0p_4D0p_4G0p_4B,0p_4D0p_4G0p_4G0p_4D0p_4D0p_4D0p_4G0p_4D0p_4G0p_4B,0p_4G0p_4G0p_4D0p_4D0p_4B,0p_4D0p_4B,0p_4D0p_4J60p_4D0p_4B,0p_4D0p_4G0p_4D0p_4G0p_4D0p_4J60p_4D0p_4Mpd0p_4J60p_4G0p_4J60p_4J60p_4Mpd0p_4G0p_4J60p_4PCR0p_4PCR0p_4J60p_4J60p_4Mpd0p_4D0p_4D0p_4D0p_4G0p_4B,0p_4G0p_4G0p_4D0p_4B,0p_4D0p_4D0p_4D0p_4D0p_4D0p_4G0p_4G0p_4G0p_4D0p_4D0p_4G0p_4D0p_4D0p_4D0p_4B,0p_4B,0p_4D0p_4D0p_4D0p_4J60p_4D0p_4D0p_4G0p_4D0p_4B,0p_4J60p_4B,0p_4B,0p_4J60p_4B,0p_4G0p_4D0p_4D0p_4D0p_4G0p_4D0p_4G0p_4G0p_4D0p_4D0p_4G0p_4B,0p_4D0p_4B,0p_4J60p_4G0p_4D0p_4J60p_4B,0p_4D0p_4G0p_4D0p_4D0p_4G0p_4J60p_4G0p_4J60p_4D0p_4D0p_4J60p_4J60p_4J60p_4J60p_4G0p_4D0p_4G0p_4D0p_4J60p_4B,0p_4J60p_4G0p_4G0p_4D0p_4Mpd0p_4J60p_4G0p_4D0p_4J60p_4G0p_4D0p_4B,0p_4J60p_4D0p_4S0p_4G0p_4J60p_4G0p_4G0p_4G0p_4J60p_4G0p_4Mpd0p_4G0p_4G0p_4Mpd0p_4J60p_4G0p_4Mpd0p_4G0p_4G0p_4G0p_4G0p_4J60p_4J60p_4J60p_4B,0p_4J60p_4J60p_4D0p_4Mpd0p_4G0p_4D0p_4J60p_4G0p_4B,0p_4G0p_4G0p_4G0p_4J60p_4G0p_4Mpd0p_4D0p_4G0p_4D0p_4G0p_4?\0p_4D0p_4B,0p_4J60p_4D0p_4D0p_4?\0p_4D0p_4J60p_4D0p_4G0p_4G0p_4D0p_4G0p_4J60p_4D0p_4G0p_4G0p_4G0p_4G0p_4D0p_4J60p_4B,0p_4G0p_4B,0p_4G0p_4B,0p_4G0p_4B,0p_4D0p_4D0p_4B,0p_4D0p_4D0p_4D0p_4B,0p_4G0p_4B,0p_4D0p_4G0p_4D0p_4J60p_4D0p_4G0p_4B,0p_4G0p_4B,0p_4D0p_4G0p_4J60p_4G0p_4D0p_4D0p_4G0p_4B,0p_4G0p_4G0p_4B,0p_4J60p_4B,0p_4G0p_4B,0p_4G0p_4D0p_4D0p_4G0p_4G0p_4D0p_4J60p_4D0p_4D0p_4G0p_4D0p_4D0p_4G0p_4G0p_4D0p_4D0p_4B,0p_4G0p_4G0p_4D0p_4D0p_4D0p_4B,0p_4B,0p_4D0p_4?\0p_4D0p_4B,0p_4?\0p_4G0p_4J60p_4D0p_4D0p_4G0p_4J60p_4D0p_4J60p_4D0p_4G0p_4G0p_4D0p_4G0p_4D0p_4D0p_4B,0p_4B,0p_4D0p_4B,0p_4G0p_4?\0p_490p_4?\0p_4<0p_4?\0p_4<0p_4G0p_4?\0p_4D0p_4B,0p_4B,0p_4G0p_4J60p_4Mpd0p_4B,0p_4G0p_4J60p_4D0p_4B,0p_4G0p_4D0p_4B,0p_4D0p_4G0p_4B,0p_4G0p_4G0p_4G0p_4?\0p_4G0p_4D0p_4G0p_4G0p_4D0p_4G0p_4J60p_4G0p_4B,134G0p_4G0p_4G0p_4D0p_4D0p_4G0p_4B,0p_4G0p_4G0p_4G0p_4J60p_4Mpd0p_4G0p_4G0p_4Mpd0p_4G0p_4J60p_4Mpd0p_4G0p_4G0p_4Mpd0p_4J60p_4Mpd0p_4G0p_4J60p_4J60p_4D0p_4G0p_4J60p_4J60p_4G0p_4D0p_4J60p_4J60p_4G0p_4G0p_4J60p_4G0p_4G0p_4D0p_4D0p_4J60p_4Mpd0p_4J60p_4PCR0p_4Mpd0p_4Mpd0p_4S0p_4G0p_4PCR0p_4J60p_4G0p_4J60p_4D0p_4J60p_4J60p_4J60p_4Mpd0p_4D0p_4J60p_4J60p_4Mpd0p_4J60p_4J60p_4G0p_4PCR0p_4U0p_4Mpd0p_4J60p_4Mpd0p_4PCR0p_4J60p_4J60p_4J60p_4Mpd0p_4J60p_4Mpd0p_4J60p_4J60p_4PCR0p_4G0p_4J60p_4Mpd0p_4Mpd0p_4Mpd0p_4Mpd0p_4J60p_4PCR0p_4Mpd0p_4PCR0p_4Mpd0p_4PCR0p_4PCR0p_4PCR0p_4J60p_4S0p_4PCR0p_4PCR0p_4S0p_4PCR0p_4S0p_4S0p_4PCR0p_4S0p_4Mpd0p_4U0p_4S0p_4PCR0p_4S0p_4U0p_4X0p_4[0p_4U0p_4U0p_4U0p_4X0p_4[0p_4U0p_4[0p_4U0p_4U0p_4X0p_4[0p_4U0p_4X0p_4X0p_4X0p_4U0p_4X0p_4[0p_4[0p_4U0p_4X0p_4U0p_4[0p_4[0p_4X0p_4U0p_4X0p_4X0p_4U0p_4X0p_4U0p_4X0p_4U0p_4[0p_4S0p_4[0p_4[0p_4X0p_4[0p_4[0p_4X0p_4^V0p_4[0p_4X0p_4X0p_4[0p_4X0p_4X0p_4X0p_4X0p_4[0p_4[0p_4[0p_4S0p_4X0p_4[0p_4[0p_4a)0p_4[0p_4c0p_4[0p_4X0p_4X0p_4[0p_4[0p_4X0p_4[0p_4^V0p_4X0p_4U0p_4[0p_4U0p_4X0p_4U0p_4a)0p_4a)0p_4X0p_4U0p_4X0p_4U0p_4X0p_4U0p_4X0p_4U0p_4S0p_4S0p_4X0p_4PCR0p_4PCR0p_4U0p_4U0p_4S0p_4U0p_4X0p_4U0p_4PCR0p_4U0p_4Mpd0p_4U0p_4U0p_4[0p_4X0p_4X0p_4U0p_4X0p_4X0p_4U0p_4U0p_4[0p_4U0p_4X0p_4X0p_4U0p_4S0p_4S0p_4Mpd0p_4Mpd0p_4Mpd0p_4Mpd0p_4Mpd0p_4PCR0p_4U0p_4S0p_4S0p_4U0p_4Mpd0p_4Mpd0p_4U0p_4S0p_4Mpd0p_4S0p_4S0p_4PCR0p_4U0p_4PCR0p_4Mpd0p_4PCR0p_4S0p_4Mpd0p_4PCR0p_4PCR0p_4Mpd0p_4PCR0p_4PCR0p_4Mpd0p_4PCR0p_4S0p_4Mpd0p_4Mpd0p_4PCR0p_4PCR0p_4Mpd0p_4U0p_4PCR0p_4U0p_4S0p_4S0p_4S0p_4S0p_4PCR0p_4S0p_4PCR0p_4S0p_4J60p_4S0p_4Mpd0p_4Mpd0p_4PCR0p_4PCR0p_4Mpd0p_4Mpd0p_4G0p_4J60p_4J60p_4PCR0p_4J60p_4J60p_4PCR0p_4Mpd0p_4J60p_4Mpd0p_4Mpd0p_4PCR0p_4J60p_4J60p_4PCR0p_4J60p_4S0p_4J60p_4PCR0p_4Mpd0p_4PCR0p_4Mpd0p_4S0p_4PCR0p_4PCR0p_4S0p_4Mpd0p_4S0p_4PCR0p_4PCR0p_4PCR0p_4S0p_4PCR0p_4PCR0p_4PCR0p_4PCR0p_4Mpd0p_4PCR0p_4U0p_4Mpd0p_4S0p_4S0p_4Mpd0p_4PCR0p_4Mpd0p_4PCR0p_4PCR0p_4PCR0p_4PCR0p_4U0p_4PCR0p_4PCR0p_4S0p_4U0p_4U0p_4X0p_4S0p_4X0p_4U0p_4S0p_4U0p_4U0p_4X0p_4U0p_4S0p_4U0p_4S0p_4X0p_4U0p_4X0p_4X0p_4X0p_4U0p_4U0p_4X0p_4X0p_4U0p_4X0p_4U0p_4S0p_4S0p_4S0p_4U0p_4S0p_4S0p_4S0p_4S0p_4S0p_4U0p_4PCR0p_4PCR0p_4PCR0p_4S0p_4X0p_4S0p_4U0p_4U0p_4S0p_4U0p_4U0p_4U0p_4U0p_4S0p_4X0p_4[0p_4X0p_4X0p_4[0p_4[0p_4X0p_4X0p_4X0p_4[0p_4U0p_4X0p_4X0p_4^V0p_4X0p_4X0p_4X0p_4U0p_4PCR0p_4X0p_4U0p_4S0p_4PCR0p_4U0p_4PCR0p_4U0p_4S0p_4U0p_4U0p_4S0p_4U0p_4U0p_4PCR0p_4J60p_4Mpd0p_4U0p_4S0p_4U0p_4X0p_4X0p_4S0p_4X0p_4S0p_4U0p_4S0p_4U0p_4U0p_4[0p_4X0p_4[0p_4^V0p_4U0p_4[0p_4U0p_4PCR0p_4U0p_4S0p_4X0p_4PCR0p_4X0p_4PCR0p_4S0p_4U0p_4U0p_4PCR0p_4[0p_4^V0p_4X0p_4[0p_4^V0p_4[0p_4[0p_4^V0p_4^V0p_4[0p_4a)0p_4[0p_4^V0p_4[0p_4[0p_4a)0p_4[0p_4[0p_4a)0p_4^V0p_4^V0p_4a)0p_4^V0p_4[0p_4X0p_4^V0p_4^V0p_4[0p_4[0p_4[0p_4^V0p_4[0p_4[0p_4X0p_4U0p_4[0p_4[0p_4X0p_4^V0p_4^V0p_4[0p_4[0p_4^V0p_4[0p_4[0p_4^V0p_4U0p_4^V0p_4U0p_4U0p_4[0p_4U0p_4X0p_4X0p_4U0p_4[0p_4S0p_4U0p_4X0p_4U0p_4U0p_4U0p_4X0p_4U0p_4U0p_4U0p_4X0p_4U0p_4U0p_4X0p_4X0p_4[0p_4U0p_4X0p_4U0p_4[0p_4X0p_4[0p_4U0p_4[0p_4^V0p_4^V0p_4^V0p_4^V0p_4X0p_4^V0p_4^V0p_4[0p_4[0p_4X0p_4^V0p_4[0p_4[0p_4a)0p_4X0p_4[0p_4X0p_4[0p_4X0p_4U0p_4[0p_4X0p_4S0p_4U0p_4X0p_4X0p_4X0p_4X0p_4[0p_4^V0p_4[0p_4X0p_4[0p_4[0p_4X0p_4[0p_4[0p_4[0p_4^V0p_4X0p_4^V0p_4^V0p_4X0p_4^V0p_4[0p_4^V0p_4[0p_4U0p_4[0p_4S0p_4[0p_4[0p_4^V0p_4[0p_4X0p_4X0p_4^V0p_4[0p_4[0p_4a)0p_4[0p_4[0p_4^V0p_4^V0p_4[0p_4^V0p_4X0p_4[0p_4^V0p_4[0p_4a)0p_4U0p_4U0p_4X0p_4X0p_4X0p_4X0p_4[0p_4[0p_4[0p_4X0p_4X0p_4X0p_4[0p_4[0p_4^V0p_4X0p_4X0p_4^V0p_4PCR0p_4U0p_4PCR0p_4U0p_4[0p_4[0p_4X0p_4X0p_4[0p_4X0p_4[0p_4a)0p_4X0p_4X0p_4a)0p_4X0p_4[0p_4[0p_4[0p_4[0p_4U0p_4X0p_4[0p_4X0p_4X0p_4S0p_4X0p_4U0p_4X0p_4[0p_4U0p_4X0p_4U0p_4S0p_4U0p_4X0p_4S0p_4U0p_4U0p_4X0p_4U0p_4X0p_4U0p_4^V0p_4U0p_4U0p_4X0p_4[0p_4S0p_4U0p_4X0p_4X0p_4U0p_4U0p_4X0p_4[0p_4X0p_4X0p_4S0p_4X0p_4X0p_4U0p_4X0p_4U0p_4U0p_4U0p_4S0p_4U0p_4PCR0p_4S0p_4PCR0p_4U0p_4PCR0p_4S0p_4[0p_4U0p_4U0p_4PCR0p_4PCR0p_4U0p_4PCR0p_4U0p_4S0p_4S0p_4PCR0p_4S0p_4U0p_4PCR0p_4U0p_4U0p_4S0p_4U0p_4S0p_4U0p_4U0p_4X0p_4PCR0p_4X0p_4PCR0p_4X0p_4U0p_4S0p_4S0p_4U0p_4X0p_4S0p_4U0p_4U0p_4U0p_4X0p_4U0p_4U0p_4X0p_4U0p_4S0p_4S0p_4X0p_4S0p_4U0p_4X0p_4U0p_4S0p_4U0p_4U0p_4PCR0p_4X0p_4X0p_4X0p_4U0p_4X0p_4X0p_4^V0p_4X0p_4X0p_4^V0p_4X0p_4[0p_4X0p_4PCR0p_4U0p_4U0p_4U0p_4S0p_4PCR0p_4S0p_4U0p_4PCR0p_4X0p_4S0p_4U0p_4S0p_4U0p_4PCR0p_4U0p_4U0p_4S0p_4X0p_4^V0p_4U0p_4U0p_4X0p_4U0p_4U0p_4U0p_4U0p_4X0p_4X0p_4U0p_4X0p_4PCR0p_4X0p_4U0p_4[0p_4PCR0p_4U0p_4X0p_4S0p_4S0p_4PCR0p_4S0p_4S0p_4U0p_4U0p_4[0p_4U0p_4S0p_4U0p_4U0p_4S0p_4S0p_4U0p_4U0p_4U0p_4S0p_4X0p_4U0p_4U0p_4X0p_4U0p_4X0p_4U0p_4[0p_4U0-]4X0-]4U1:,4S1:,4X0p_4S0p_4^V0p_4X0p_4[0p_4U0p_4X0p_4X0p_4[0p_4^V0p_4^V0p_4[0p_4X0p_4[0p_4X0p_4S0p_4U0p_4U0p_4U0p_4X0p_4X0p_4U0p_4[0p_4S0-]4U0p_4X0-]4S0-]4^V0p_4[0p_4[0p_4a)0p_4a)0p_4c0p_4[0p_4[0p_4^V0p_4^V0p_4c0p_4^V0p_4^V0p_4^V0p_4a)0p_4^V0p_4[0p_4X0p_4^V0p_4X0p_4[0p_4U0p_4[0p_4[0p_4[0p_4[0p_4[0p_4[0p_4^V0p_4X0p_4[0p_4X0p_4^V0p_4[0p_4X0p_4^V0p_4^V0p_4X0p_4[0p_4^V0p_4^V0p_4^V0p_4X0-]4a)0p_4[1:,4[0p_4^V0p_4^V0p_4^V1:,4^V1:,4X14^V0-]4^V0-]4^V0-]4[0-]4[0-]4^V0p_4X0-]4[0p_4^V0p_4[0p_4[0p_4^V0p_4^V0p_4a)0p_4X0p_4^V0p_4^V0p_4a)0p_4[0p_4^V0p_4[0p_4a)0p_4[0p_4[0p_4X0p_4^V0p_4[0p_4a)0p_4^V0p_4X0p_4^V0p_4^V0p_4[0p_4[0p_4U0p_4[0p_4X0p_4[0p_4[0p_4[0p_4U0p_4[0p_4[0p_4[0p_4[0p_4[0p_4X0p_4X0p_4a)0p_4c0p_4^V0p_4[0p_4X0p_4[0p_4U0p_4U0p_4X0p_4X0-]4U0p_4[0p_4U0p_4X0p_4X0p_4[0p_4^V0p_4^V0p_4X0p_4a)0p_4^V0p_4[0p_4S0p_4X0p_4^V0-]4X0p_4c0p_4X0p_4[0p_4^V0p_4^V0p_4[0p_4X0p_4^V0p_4^V0p_4U0p_4[0p_4[0p_4^V0p_4[0p_4[0p_4^V0p_4[0p_4^V0p_4[14X0p_4^V0p_4^V0p_4X0p_4^V0p_4^V0p_4^V0p_4[0p_4^V0p_4[0p_4^V0p_4^V0p_4[0p_4[0p_4^V0p_4[0p_4[0p_4[0p_4X0p_4[0p_4^V0p_4[0p_4X0p_4[0p_4[0p_4^V0p_4^V0p_4[0p_4^V0p_4[0p_4[0p_4[0p_4[0p_4^V0p_4[0p_4[0p_4a)0p_4^V0p_4[0p_4^V0p_4^V0p_4a)0p_4[0p_4^V0p_4[0p_4X0p_4^V0p_4^V0p_4^V0p_4a)0p_4a)0p_4c0p_4a)0p_4a)0p_4a)0p_4[0p_4i00p_4a)0p_4^V0p_4a)0p_4c0p_4a)0p_4a)0p_4a)0p_4c0p_4fB0p_4c0p_4fB0p_4c0p_4a)0p_4a)0p_4c0p_4c0p_4c0p_4fB0p_4a)0p_4a)0p_4fB0p_4c0p_4lm^0p_4fB0p_4i00p_4i00p_4fB0p_4fB0p_4fB0p_4i00p_4fB0p_4i00p_4i00p_4fB0p_4c0p_4i00p_4c0p_4i00p_4c0p_4lm^0p_4i00p_4fB0p_4fB0p_4i00p_4fB0p_4fB0p_4i00p_4i00p_4fB0p_4i00p_4c0p_4fB0p_4fB0p_4i00p_4fB0p_4i00p_4fB0p_4i00p_4fB0p_4fB0p_4i00p_4i00p_4i00p_4lm^0p_4i00p_4lm^0p_4o=0p_4lm^0p_4lm^0p_4i00p_4i00p_4i00p_4lm^0p_4lm^0p_4i00p_4lm^0p_4lm^0p_4c0p_4o=0p_4lm^0p_4i00p_4c0p_4i00p_4i00p_4fB0p_4lm^0p_4i00p_4lm^0p_4i00p_4i00p_4lm^0p_4i00p_4lm^0p_4i00p_4lm^0p_4fB0p_4i00p_4lm^0p_4fB0p_4c0p_4i00p_4fB0p_4i00p_4lm^0p_4c0p_4fB0p_4i00p_4c0p_4fB0p_4fB0p_4fB0p_4c0p_4fB0p_4a)0p_4fB0p_4c0p_4c0p_4c0p_4c0p_4a)0p_4a)0p_4c0p_4^V0p_4fB0p_4a)0p_4fB0p_4a)0p_4c0p_4a)0p_4c0p_4^V0p_4c0p_4c0p_4a)0p_4a)0p_4a)0p_4c0p_4c0p_4a)0p_4a)0p_4^V0p_4fB0p_4a)0p_4a)0p_4c0p_4a)0p_4a)0p_4[0p_4a)0p_4c0p_4^V0p_4a)0p_4c0p_4a)0p_4X0p_4i00p_4i00p_4fB0p_4fB0p_4i00p_4fB0p_4fB0p_4fB0p_4i00p_4a)0p_4fB0p_4fB0p_4lm^0p_4c0p_4fB0p_4fB0p_4c0p_4c0p_4fB0p_4c0p_4^V0p_4c0p_4^V0p_4c0p_4^V0p_4a)0p_4a)0p_4[0p_4[0p_4[0p_4^V0p_4a)0p_4[0p_4U0p_4^V0p_4[0p_4[0p_4a)0p_4X0p_4^V0p_4[0p_4[0p_4^V0p_4X0p_4^V0p_4[0p_4[0p_4X0p_4[0p_4X0p_4[0p_4[0p_4[0p_4[0p_4X0p_4X0p_4X0p_4S0p_4S0p_4X0p_4U0p_4S0p_4U0p_4S0p_4X0p_4S0p_4U0p_4X0p_4U0p_4U0p_4U0p_4S0p_4U0p_4S0p_4S0p_4U0p_4[0p_4X0p_4X0p_4X0p_4X0p_4S0p_4U0p_4X0p_4S0p_4X0p_4X0p_4S0p_4U0p_4X0p_4U0p_4[0p_4U0p_4U0p_4U0p_4S0p_4U0p_4[0p_4X0p_4U0p_4[0p_4U0p_4X0p_4X0p_4U0p_4U0p_4U0p_4U0p_4U0p_4[0p_4a)0p_4^V0p_4U0p_4X0p_4X0p_4[0p_4[0p_4U0p_4X0p_4X0p_4U0p_4U0p_4U0p_4^V0p_4S0p_4X0p_4X0p_4X0p_4X0p_4[0p_4X0p_4U0p_4X0p_4S0p_4X0p_4U0p_4S0p_4U0p_4U0p_4X0p_4U0p_4S0p_4X0p_4PCR0p_4S0p_4S0p_4U0p_4S0p_4S0p_4PCR0p_4S0p_4PCR0p_4S0p_4S0p_4PCR0p_4S0p_4U0p_4PCR0p_4X0p_4PCR0p_4U0p_4S0p_4X0p_4PCR0p_4PCR0p_4S0p_4S0p_4S0p_4S0p_4S0p_4S0p_4X0p_4X0p_4S0p_4S0p_4S0p_4PCR0p_4S0p_4S0p_4PCR0p_4PCR0p_4PCR0p_4Mpd0p_4S0p_4PCR0p_4PCR0p_4S0p_4PCR0p_4U0p_4U0p_4X0p_4U0p_4S0p_4S0p_4S0p_4PCR0p_4PCR0p_4S0p_4S0p_4PCR0p_4S0p_4Mpd0p_4S0p_4S0p_4PCR0p_4S0p_4PCR0p_4S0p_4Mpd0p_4S0p_4Mpd0p_4S0p_4Mpd0p_4S0p_4PCR0p_4PCR0p_4Mpd0p_4Mpd0p_4PCR0p_4PCR0p_4Mpd0p_4Mpd0p_4S0p_4S0p_4Mpd0p_4Mpd0p_4PCR0p_4Mpd0p_4PCR0p_4PCR0p_4Mpd0p_4Mpd0p_4PCR0p_4Mpd0p_4PCR0p_4Mpd0p_4PCR0p_4Mpd0p_4J60p_4PCR0p_4PCR0p_4Mpd0p_4J60p_4PCR0p_4PCR0p_4J60p_4U0p_4J60p_4S0p_4PCR0p_4Mpd0p_4S0p_4Mpd0p_4Mpd0p_4U0p_4Mpd0p_4PCR0p_4S0p_4J60p_4Mpd0p_4PCR0p_4PCR0p_4Mpd0p_4Mpd0p_4S0p_4Mpd0p_4J60p_4PCR0p_4PCR0p_4Mpd0p_4J60p_4PCR0p_4PCR0p_4PCR0p_4PCR0p_4Mpd0p_4Mpd0p_4PCR0p_4Mpd0p_4PCR0p_4G0p_4J60p_4G0p_4D0p_4G0p_4D0p_4Mpd0p_4J60p_4S0p_4J60p_4Mpd0p_4Mpd0p_4PCR0p_4Mpd0p_4J60p_4PCR0p_4Mpd0p_4Mpd0p_4Mpd0p_4Mpd0p_4Mpd0p_4PCR0p_4Mpd0p_4Mpd0p_4Mpd0p_4PCR0p_4Mpd0p_4Mpd0p_4Mpd0p_4Mpd0p_4J60p_4Mpd0p_4Mpd0p_4Mpd0p_4J60p_4J60p_4PCR0p_4G0p_4J60p_4J60p_4G0p_4J60p_4J60p_4G0p_4J60p_4J60p_4G0p_4Mpd0p_4J60p_4J60p_4D0p_4Mpd0p_4D0p_4G0p_4J60p_4G0p_4J60p_4J60p_4G0p_4Mpd0p_4J60p_4Mpd0p_4J60p_4J60p_4S0p_4G0p_4J60p_4J60p_4J60p_4Mpd0p_4G0p_4PCR0p_4J60p_4Mpd0p_4J60p_4Mpd0p_4J60p_4J60p_4J60p_4G0p_4Mpd0p_4J60p_4Mpd0p_4J60p_4Mpd0p_4PCR0p_4J60p_4J60p_4Mpd0p_4PCR0p_4D0p_4Mpd0p_4PCR0p_4G0p_4Mpd0p_4Mpd0p_4Mpd0p_4J60p_4G0p_4J60p_4Mpd0p_4J60p_4Mpd0p_4J60p_4G0p_4G0p_4Mpd0p_4J60p_4J60p_4J60p_4Mpd0p_4D0p_4Mpd0p_4J60p_4Mpd0p_4Mpd0p_4G0p_4J60p_4PCR0p_4J60p_4J60p_4J60p_4G0p_4G0p_4G0p_4Mpd0p_4J60p_4G0p_4G0p_4J60p_4Mpd0p_4G0p_4G0p_4J60p_4J60p_4Mpd0p_4J60p_4J60p_4G0p_4J60p_4D0p_4G0p_4Mpd0p_4D0p_4J60p_4J60p_4G0p_4G0p_4Mpd0p_4G0p_4Mpd0p_4G0p_4Mpd0p_4D0p_4Mpd0p_4J60p_4J60p_4Mpd0p_4G0p_4J60p_4Mpd0p_4D0p_4Mpd0p_4Mpd0p_4J60p_4Mpd0p_4J60p_4J60p_4Mpd0p_4J60p_4Mpd0p_4Mpd0p_4G0p_4J60p_4J60p_4D0p_4D0p_4G0p_4Mpd0p_4G0p_4G0p_4Mpd0p_4G0p_4G0p_4J60p_4J60p_4D0p_4G0p_4J60p_4D0p_4D0p_4G0p_4J60p_4B,0p_4Mpd0p_4J60p_4G0p_4D0p_4G0p_4Mpd0p_4B,0p_4G0p_4G0p_4G0p_4G0p_4Mpd0p_4J60p_4Mpd0p_4Mpd0p_4PCR0p_4Mpd0p_4G0p_4D0p_4D0p_4G0p_4J60p_4J60p_4J60p_4J60p_4J60p_4G0p_4G0p_4B,0p_4G0p_4G0p_4B,0p_4B,0p_4D0p_4D0p_4Mpd0p_4G0p_4J60p_4J60p_4J60p_4J60p_4G0p_4J60p_4D0p_4G0p_4Mpd0p_4D0p_4J60p_4J60p_4Mpd0p_4G0p_4J60p_4J60p_4G0p_4J60p_4Mpd0p_4G0p_4Mpd0p_4G0p_4J60p_4J60p_4J60p_4G0p_4J60p_4G0p_4J60p_4J60p_4J60p_4J60p_4Mpd0p_4Mpd0p_4G0p_4Mpd0p_4J60p_4Mpd0p_4D0p_4J60p_4J60p_4Mpd0p_4B,0p_4J60p_4D0p_4Mpd0p_4J60p_4D0p_4Mpd0p_4J60p_4Mpd0p_4J60p_4Mpd0p_4S0p_4J60p_4Mpd0p_4J60p_4PCR0p_4Mpd0p_4PCR0p_4S0p_4S0p_4U0p_4U0p_4U0p_4PCR0p_4U0p_4S0p_4U0p_4U0p_4U0p_4S0p_4PCR0p_4S0p_4X0p_4U0p_4X0p_4S0p_4X0p_4U0p_4U0p_4X0p_4[0p_4X0p_4[0p_4X0p_4[0p_4X0p_4^V0p_4X0p_4[0p_4a)0p_4^V0p_4a)0p_4a)0p_4c0p_4c0p_4fB0p_4fB0p_4fB0p_4i00p_4lm^0p_4t0p_4lm^0p_4w0p_4o=0p_4o=0p_4lm^0p_4t0p_4rz0p_4z0p_4z0p_4w0p_40p_4z0p_40p_40p_40p_40p_4{0p_4{0p_40p_4{0p_4K0p_40p_4{0p_4K0p_4{0-]4K0p_4{0-]4K0p_4C0p_4C0p_40p_4C0-]40p_40p_40p_4K0p_4K0p_40-]40p_40p_4C0-]40p_4Z0p_4Z0p_40p_4C0p_4q0p_4Z0p_4q0p_4q0p_4q0p_4Z0p_4Z0p_4q0p_4'0p_40p_40p_4'0p_40p_4'0p_40p_4'0p_40p_40p_40p_40p_4`0p_4`0p_4`0p_420p_42I0p_42I0p_42I0p_4`0p_4`0p_4k1:,40p_40-]40p_40p_4k0p_40p_40p_40p_40p_40p_4w!0p_40p_40p_4w!0p_40p_40-]4 0-]4=|1:,40-]4 1:,4w!0-]41340-]41:,41:,4 0-]4=|0p_4 0p_40p_4 0p_4 0p_40p_4w!0p_4 0p_40p_480p_4=|0p_4 0p_40p_4w!0p_4 0-]4 0p_4w!0p_4 0-]4 0p_4 0-]480p_4=|0-]4 0p_4 0p_4 0p_4w!0p_4 0p_4w!0-]4w!0p_4 0p_40p_4 0p_4 0p_4 0p_40p_4=|0p_4 0p_4 0p_4=|0p_4 0p_40p_4w!0p_4w!0p_480p_4w!0p_4 0p_40p_480p_4GO0p_480p_4 0p_4w!0p_4 0p_40p_40p_40p_4 0-]4 1:,4=|0p_40p_40p_40-]40p_4k0-]4=|0p_4k0p_4k0p_4k0p_4k0p_4k0p_4k0p_4k0p_4k0p_4k0p_40p_4`0p_4k0p_4`0p_4k0p_4`0p_4`0p_4`0p_42I0p_4`0p_4`0p_42I0p_4`0p_42I0p_420p_4`0p_40p_420p_420p_42I0p_420p_42I0p_420p_420p_4`0p_4`0p_4`0p_40p_4`0p_40p_4`0p_40p_40p_40p_40p_40p_4'0-]4'0p_40p_40p_40p_4'0p_4'0p_40p_4'0p_40p_4V0p_4'0p_40p_40p_4V0p_4q0p_4q0p_4q0p_4q0p_4q0p_4q0p_4q0p_4q0p_4q0p_4V0p_4q0p_4Z0p_40p_4Z0p_40p_4C0p_4C0p_4q0p_4C0p_4K0p_40p_4K0p_4K0p_4K0p_40p_40p_4Z0p_40p_4Z0p_4C0p_40p_40p_40p_40p_4K0p_4K0p_4K0p_40p_4K0p_40p_4K0p_4K0p_4K0p_40p_40p_4{0p_40p_40p_4K0p_40p_4{0p_4K0p_40p_4{0p_40p_40p_40p_40p_40p_40p_4{0p_40p_40p_4z0p_4}S0p_4{0p_4}S0p_4K0p_40p_4}S0p_4{0p_4}S0p_40p_40p_40p_40p_40p_4z0p_4{0p_40p_4}S0p_40p_40p_4w0p_4}S0p_4}S0p_4}S0p_4z0p_4}S0p_40p_4t0p_4w0p_4w0p_40p_4z0p_4w0p_4}S0p_4}S0p_4w0p_4rz0p_4rz0p_4z0p_4rz0p_4w0p_4rz0p_4rz0p_4rz0p_4rz0p_4rz0p_4t0p_4rz0p_4rz0p_4rz0p_4w0p_4t0p_4rz0p_4t0p_4rz0p_4t0p_4o=0p_4t0p_4rz0p_4t0p_4o=0p_4t0p_4t0p_4rz0p_4t0p_4rz0p_4t0p_4z0p_4lm^0p_4rz0p_4rz0p_4t0p_4rz0p_4t0p_4t0p_4w0p_4w0p_4rz0p_4rz0p_4o=0p_4o=0p_4w0p_4rz0p_4t0p_4t0p_4w0p_4t0p_4rz0p_4t0p_4t0p_4t0p_4t0p_4z0p_4w0p_4w0p_4z0p_4z0p_4t0p_4z0p_4}S0p_4z0p_4w0p_4z0p_4w0p_4}S0p_4z0p_4w0p_4w0p_4z0p_4}S0p_4w0p_4}S0p_4}S0p_40p_4w0p_4}S0p_4z0p_40p_4}S0p_4}S0p_40p_4}S0p_4}S0p_40p_4}S0p_40p_4}S0p_4}S0p_4}S0p_4}S0p_4}S0p_4}S0p_4z0p_4}S0p_4z0p_4z0p_40p_4w0p_40p_4}S0p_4z0p_40p_4}S0p_4}S0p_40p_4}S0p_40p_40p_4}S0p_4}S0p_40p_40p_4{0p_4}S0p_40p_4}S0p_40p_4{0p_4{0p_40p_4{0p_40p_4{0p_40p_4{0p_40p_40p_40p_40p_4K0-]40p_4K0p_4K0p_4K0p_4{0p_40p_40p_4C0p_4K0p_4C0p_40p_4C0p_40p_4Z0p_4Z0p_4q0p_4V0p_4Z0p_4q0p_40p_4Z0p_4V0p_4q0p_4V0p_4q0p_4q0p_4q0p_40p_40p_40p_4V0p_40p_40p_40-]40-]40-]4`0-]40-]4`0-]4`0-]40-]4`1:,421:,4`0p_42I0p_420p_42I0p_40p_4`0p_420p_40-]4`0p_40p_40p_4=|0p_41:,40p_40p_480p_40p_40p_40p_4k0p_4R0p_4"0p_4>0p_4>0p_4>0p_4\U0p_4>0p_4>0p_4>0p_4"0p_4>0p_4\U0p_4>0p_4\U0p_4>0p_4\U0p_4\U0p_4\U0p_4\U0p_40p_41:,4\U1:,40p_4-0p_40p_4q0p_4Z0p_4Z0-]4q0p_4Z0p_4q0p_4Z0p_4Z0-]4q0p_4g0p_4ϟ0p_4ϟ0p_4q0p_4ϟ0p_4ϟ0p_4ϟ0p_4-0-]4r0p_4 D0-]4r1:,4 D0p_4 D0p_40p_4 D0p_4w0-]4ì`1:,4w0p_4ì`0p_4w0-]4ì`0-]4B0-]4B0p_4w0-]4ì`0p_4ì`0-]4ì`0p_4w0-]4w0-]4w0-]4w0-]4|1:,4|0-]4N1:,4N0-]4ʶ30-]4134͇134͇141417r417r414)}134)}14)}14f1:,4Ԓ1:,4c"14 1:,4 1:,4̙0-]4 14>134>134̙14417r442f4ۜ14ۜ0-]44134̙1440-]4̙14ۜ0-]441441:,4414̙1440-]4̙14ۜ1:,4>0-]441:,440-]4>14ۜ1:,4>1:,4ۜ1:,4ۜ1:,4>17r4>134>134ۜ17r4nU17r4ۜ134nU134nU14>1:,4nU1:,4ۜ0-]4ۜ134ۜ14ۜ134>17r4>134>134ۜ1:,4>14nU14ۜ14nU14l2f4nU14>17r4l2f4l14l2!'4?2f4l2f42!'4?2f4l142!'4?17r4l17r414l17r414?14?14?14l134?14?13414nU14?134l13414nU17r417r4?1:,417r4?14134?134?134x(13413413413414134x(14x(134x(17r4141417r4x(1417r417r417r417r4I2f414x(17r4x(17r4141417r4x(13414x(14x(17r417r41:,4134x(14134134134x(1341:,4x(17r413417r417r4x(134x(2f41417r4I2f42f4-2!'4-2f4-2!'4I244D2!'4[14D14[2f4T14T14%2f42442442442f414^2!'42G432f432440J24432G4a2G4244i2!'42f517r42f517r517r5152f5:1517r52f5 o2!'5Wd2!'5{2!'5(B2f5(B245(B2!'5 2f5 2!'5 E245 2Z5 a245 2Z5 2G52Z5 ~2452n!S52n!S52G52n!S5^25!%2n!S5!%26I5lj25<26I5=H2n!S526I526I526I526I525ߴ25H{2525Y2[5d2[5 25 25$ 2[5$25(@25(25+<25+H25-._25.&2ç'5.&25/2ç'502>522ç'532ç'532>56Vd256Vd258s72>59N2ç'5<285>285@285BN285E &2^}5G25J2^}5M25PdN35UQ35V 3 M5Xט3 M5Zj375]=3 M5_3325a3325cg3)5f83$(5hUe3.h5i p3325mC3325o_375r375u_3A5y3K!g5~)3Y}5J3^G5Nz3c53g5R3g5/!3ql53v55J3v55 3zv5"3535[3v53v53f5Z353 5>305n[3050x3 5?3 535w35"3 5z>3e5<[3e53m5 3B5)[3]=5x353&5\35y3 53t53Tz5l#3513J535l3ǰ5w3ǰ5@3C5tx3އ563C5\3q5ay35ŀ[3ߞ5Bx3;5]3h5m[35̈315Χ315ϳ3^+5Ҕ35Ԥ"35u3 5ڠ45r"45@@45n4 T(5454Q5?4545@4~)5"45@4 54( $5=4+6u41 624:6]4CC6 4I6 4S!>6e4\'67v4b9654lD"6/4q W6Q4w )6n<4~5X6!>46#J46&!46)g4D6,=4604A63 4 *66Y4<169=4Ө6=hv486@ Z4κ6B=4&6Dͯ46GD04ȵ6I446KQ46Mo4[>6O486R46Vg46Zu46]04ŵE6`h4M6d$496g|>46j!4zK6l4w6o4L6sHv4 6v4ݤL6{4;6~14k6T44iS64f646o4.Y6_;464(T6M5^65v65t66~56C506 5 <6l5 76E 5!:6bJ54657656568 56TX565 {A67 5#,65$G6b5'\6Rn5)6n5+@G65.=6{50 651< 6Ù546v5576(59 656Ǭ 5@16P'5@T6<5EGQ6ҕ5I*`65N6۽5T<^6K5Y6䷒5^h&6o5b#695g6K5lw6BY5q@65vW-7T5{7B5~j7}5g753Z757 t5y7 z;5J7 &p57 a57"5s75O7O5M75ڰ7f5757Z&573t5U7 5j7)5h7 մ5̖7"597$57&Ѹ5 7(5y7*557,57."570T5725m73 5755775h97:5̌>7<5m=7?i5+7BG5[7ED:5f 7H+5p[7Kq5z7N5誛7Qn57S5p 7V5J7Y*5J7[\5\7]5g%7_F6X{7b#6c7d9617gWN67iΪ6`7lF6 Qn7nV6 7q_6+7t6k7vT6y7y6ڰ7|a167H962:7'67u676,76 67q6!P76#d7\6$L76&76'7}6)?7܌6*:7/6,c76.7N6/B7=6287v63|765d7H+67g769k76;7j6=76>*7$6@76B976C7#v6E8376G7@6H7f6I7HR6JNo7)6K !7 6L#7@6Mrt76NV76OB76P7}6Q76RG76S76TSc76U_e76V27 6W7]6YB76Zm76[n7r6\;7S6]=7l6^>76_@7 }6a A7Z6a76b76bb76b79=6cn76cH7e6c7)O6dT76e|7M]6e|7.6da7.6d76e:76eb76e7»6e7B6fG7^6f7~6g76g7Ţ6g76g7W6g7e6f7 ~6f7P66fG7e6e7ǿ6eb76e:7ȋ6eb76e:7ɚy6e7 %6e|7ʩ6e|76e|7]r6eb76e76e`7<6d7̙ 6d7۳6dT7,6c7E6by7E6b7b6b7xw6aw7ͽ/6aV7ҩ6`7H6`J7a6_76^>7H6^XX7H6]LV7H6]&7ҩ6\7ͽ/6[Z7͐6ZN7E6Xй76Wwh7̙ 6V7<6U766TSc7ˠ6S!7]r6QE70Y6Q/_70Y6Px76O7]r6Ow70Y6NV7]r6NV7ˊ6M76M76M?76M?76L76L 76KW76K7ˠ6KZq7ˠ6J7˵~6Jt;7ˠ6J 7ˊ6I7ˠ6H7]r6H7]r6GQ7E6Gv7]r6G7ˠ6Fj76F76G76F7Th6F7́6F7́6F7i6E7i6F7̙ 6E7̙ 6E7̮6F7۳6FD57۳6Fj76FD5756FD57K^6FD57b6Fj7b6FD57K^6F756E7۳6E7i6DQ76CK76B7r6B_70Y6B_76A7@6A7@6A7@6A7]r6B7ˠ6C 076Ck76CK76Dw7́6E76E7,6FD576G756Gv756GQ7K^6H\87b6H7b6H7b6I@7͐6I7͐6H7b6I@7K^6H76HS76H7̮6H7Th6H766H476Gv7]r6G(70Y6GP67@6G7@6GP676F7ʩ6F7ʑo6G77>6F7 %6G7 %6G7ǒ6Gv7ɚy6Gv7ɚy6G7ɚy6G7ɂ6G7ɂ6H\87ma6H\87U6HS7U6HS7U6H7(6I7(6I7(6IT7(6J 76IT7ȡ^6I@7G,6I76H7ׁ6HS7Ǫh6I786H7#6H7 ~6I7#6Ih97e6J&7P66I7e6I7e6Jt;7e6K !7Ǫh6K<7Ǫh6Lfr7Ǫh6K7e6L#7#6KW7e6L#76L 76M%$76M?7e6N Z7 ~6N~u76Ob786OB7P66PI)7ǒ6PD7ǒ6Qz7ǿ6R76SGb7G,6TSc7ȡ^6U76V76V27ma6Wķ7ɯ6X57ǒ6YP76Y77 %6Z(R76Zu7 %6[7 %6[n77>6\7dW6\;7dW6]&7{6]r"7{6]&7{6]LV7{6]7ʑo6^27(6^7(6^76_7@6_dY76_t7r6`J7ˠ6a|\766aɫ7i6bխ76by76cn756dz7K^6c756dz7b6dz7xw6dz7͐6dz7ͥ6da7ͽ/6e:7a6eb7Y6fG7q6fd7δ%6fl7>6fd76g+7h6g7ϭA6h776h7J6i7a6i7w6h7Ў6i7O6j76jž7C!6jO76j76k57p96k7х6kΠ7ѝR6kΠ7ѝR6l7ѝR6kΠ7Ѳ6l7k6l 7"w6m 7O6n37ҔH6n7a6o?7a6o?7a6n7z6n7z6o76pK7H6p7Ӌ>6qW7Ӌ>6qW7ӸW6q76r76r7?6s"7ԄZ6s7ތ6sI76t.7!6t.7{P6t{7N76t{7N76t.7{P6tV07{P6t.7Ւ6t7e6t7N76so7N76sJ.7!6rG7 6rG7!6r7 6q7 6qW76q}76p7ތ6p7ތ6pq76pD7!6pK7 6oe76o(7ތ6n37ԙ6ms7ԙ6m'7Աs6l7ԙ6l7ԄZ6lA7ԙ6kΠ7WA6jj7*(6j)7*(6i 76j)7?6i7?6ik7l6iC7ԄZ6i7ԙ6h7ԙ6h77ԙ6g7ԙ6gx76g+76g+76g76f76fG76e7ތ6e7ތ6e`7ތ6e|7ތ6da7ތ6dz7ތ6d-F7ތ6c76cH76cn7 6bխ7!6bխ786b^7!6bb7!6b<7!6a786aɫ7N76a|\7N76a|\7e6`v7{P6`v7ըi6`7!6`v7:6`v7\6`7\6`J7GS6_t7:6_7Ձ6^>7!6^27Ձ6^ 7ըi6]r"7ըi6]r"7{P6\;7N76\7 6[76Z76Zu76Z7Աs6Yi76Yi7Աs6Xй7Աs6Xй76X67Աs6XO7Աs6Wķ76Wwh76WQ76V276V7ԙ6U_e7l6U7WA6Ty/76SH76Sm.76R7Ӣ6R7Ӌ>6Qz7H6PD7z6O7a6N 7|6NV7O6M 76M%$7k6L>7k6K7ѝR6K<7х6J7p96J 7h6Ih97л6H7л6H7Ф76GQ7Ў6Gv7w6F746E7r6E837ϭA6DQ7h6C7W6B7δ%6B/7Y6AS7a6@7ͽ/6?Ԩ7xw6?;7E6>}76=7̙ 6<7<6<76;76;76;1766:l76:KQ7˵~6:%76976:%76:KQ7<6:%7Th69k7Th697668i7ˠ677ˊ67t7r67t7ˠ67N7ˠ677]r66766B7(65\7ʑo65I7dW64P7N637!637 %62F7ǒ627ɯ627ɚy61x*7ma61R^7(617/60l(76/B7ȸ6/v7ȋ6/`'7G,6.@76..Z7ׁ6-s7ǒ6-H$7}O6, 786,<"76+<7ƱL6+}p7n6*:7*6)T76)؈76)97Ţ6(7`%6(373 6'Mj7`6&O7i/6%7$v6%76% 7Ç6$O17Z6#7h6#C07¦66"7y6"76!G7ĺ6 76 F7=o67=6)76R7[6(76F7Ԩ67zv6 7M]6:7,6V>7ݲ6.7676p7)O6"7667}6>;7e6 7G6X76 76767o6&87fV67 $67 $6@76@7l67l67S67W67*676s76ڰ767^676ί767g657R56­76O76w7p6C76v767=67J6t7S6QY76 7i6 G7;6 76 9V76 7Zs6 pU76 77(6 n76 7c}6 +76d6 76d6 El726 76Q76Q7T67?n69k7067͝6LP76767]6z7FS6@O7676767d6n7O]64M7 67݌67s6u7m6O7)(676K76i76B7d67_K6J7226J7z6J7z6}76ח7}67P6wb7P6+7 6|7k6~G7R6E7W6F7*6`76769767357Z5g%7A5 7i57$5P7d5C!7K5C!72577[5T7Cz57a5v75R7/575757a57k57R5R79575l{7&O5E75:757\r57/Y57(57o5| 76>5725J=757?H5}75 o75L7]5ڡ795l7ց5@7h5Y7|O547O6575(7537Y557+'5瞚75x7V5d7v57I5b75a75z7}5n7;57 57E59W75*7Y5V7D 575p[75J765J7b5ޣ75XX7Y5r"75&7T5܋75@U757r54S7`5ڙ7Ө5s75ٳ7E5I7 575u75u7(O5i75K7~5K7s5~7F5~75Q7'575H7|5kv78=57"5Ү{7 $5҅@7Ȓ5҅@75y>7n`5y>7V5мD7)5Г 75!7v5!7]5ϊw7H+575U:7؀5 75I87Q55̌>7 }57L57o5 j7B5ʚ7o5h7V5Ɏ7v5>74 5>75ȧ7G527j.5v7%v5/75D57+57q5b7[5Ń7g5,75`75Q7z5÷_7b}5÷_75d5÷_75E7575«]7S5_7U57=57 5-7\57/5G75G7է5G757657!D5;7+5#7575{W7l57l5U7?5U75 75 757d5oV7u5I7H5#71257575cT757|5=7:<5}7 #517 5 757X57+5~75757J+5~75 75Y75M7Q57#57d5725I7Z5I75)75)7U57K5{76 57R57575C7<5C75jq7C5v7*5^o7a5@7*5,7ڙ5,7=5s7h57SN5=75r7}5757|5T57/@5.i7 57+5H375"h7m57+g5f7575007]57F5 d7~~\5$/7~95$/7}5ؗ7}@5g47}57|c57|a15-7{57{55g7{=#57z,5t7zY5)e7y\5C07yJ5)7x57x5\7xK7jS57iΪ5X7itx5X7iG57h5q7he5|7g85ڰ7gA57gA5ί7f)5@7fs5Y7f547eU57eO57d5M7d5w7d+57ci5A7cw+5v7b5v7bN557bh5 7bd5t7a5um7a/ 5O7`57`z5C7`55C7_5q7_l57_'\577^57^C57^5+7]5:7]9p57\?57\587\*57[5b7[57[1577Z507Z}\57Z 57Y557Yn557Y5J7X5!b7X`15>7X05>7WH5>7WT5}7W<#5}7Vw5W_7V957V-5 7U5K]7U57UI57T@57T5e7TU587Sp57Sqy57S,53Z7R5s7R|57R5ڹ7Qݿ5ڹ7Qn57P5W7P517P_~5~7O5}Ѵ7OV5|67O 15}8u7N5{7N(5{l7M"5{ r7Mj5z37M35y7Lٍ5y7L[5xx7L d5xo07K5w7Kp5vu7K5w7Jc5vW-7Jw5u7I5ti7I5t?*7IS5sX7Hj5s 7H5rsn7Ho5q7HN5p7G5p$7Gad5o-7G 5nܧ7F?5mq7FW5mq7F'5m7E$5m]7E5lw7ED:5l+e7DԎ5jb7D"5j7D95ik7C85ik7C5h7CVN5hG7C+[5gh7B)5f{7Bv5g)7B2?5e7A5ee7AU5e7AN5ee7A#5d&7@5d7@oF5d7@*5c~b7?5bK7?v+5b7?1s5af_7>ی5` 7>5` 7>g5`)7> d5`37=5_7=5_M7=. 5^7<5]7<5^h&773 5P73T5PX73P5P X72k5O&725N725O&715MU71\5M[715L(715J705KR705K[70T5J7/p5J\7/15IwW7/E5H7.T5H7."5G7.a5G7-95G_T7-5G]7-=5Fy7,5EGQ7,75E7,D5D7,M5C{7+5C/N7+ec5BW7+ 15BW7*5Ac7* 5AK7*5Ac7)ѩ5AK7)5?7)H85?K7)5>eZ7(5>7(~[5>eZ7(h5=7'65=7'45=37'5=7'B55!:7 t5!:7[5B75B7s5B7F5B7M5B745B7p57e?5 u785;7 {5 7I5 7705 77@T5 ?75 #7w5 ={7u5 ={7_F5 ={7i5 7P5 W75 7gt5 7#5 7)5 q7507o5?7X5757?57&5Y7J5 u75'75'757<"57%5A75<75\37qi57DP5o6=5)6z 5o6/5o6kv5w6D56h5^6065l6596O'5l65,-6m=5l65,-6/5l614k6}5,-6P4Yq664`64`6(4Yq6}464e64(T6R4[6& 4)k6R4)k6D 4)k6v464^_654^_646T}46K4646=4^_6 4+6d4+6v4+6VD4+6)46u64+64e6'46f4`6=4.Y6X 46.4_6Iv4064S6™4S64S66416Y416-'4Y6o4j6x4f64f6j/46=44^6 4iS6[466Խ466z46 Y4X646k4X649M6046ք4^64^6|R49M64R6m4l654R6`4;6`4 F6ૠ4 F6#4oX6=46B4<64 ^6޻4q6a4q64 ^6S54?R64q6ܞ4?R6D4ڦ6۽4 66 4tF64A6ځ4X64ק64L6Fg4ק6ؿ4L6eY4ק6 '46ׄJ4D@6V4D@64D@6u4D@64w64F6R4w694F6 4F6C4EW6Ԇ4EW6+4EW6Y4Ѭ6Ѯ4Ѭ6Ӥ'4Ѭ6I4646ҕ4EW6ҕ46 46 4zK6ч46-4zK6-4zK6yC46Х4zK64ί@6Ϙ546>4Q6}4Q64Q6\4Q6/n46<46N`46.4JE6̙496?46496ˋg4˰W646ʪY4L6P'4L6"4L6ɛ4?6 4ǀQ6ȹ46ȍ.4646Ǭ 46Q4Ă64PK654Ă6p4PK64·6'4PK6Ŏ4·644PK6ĭ46S4P64P6ßR4P64R64 D6d4664646'46J4J6Π4U96tn4U96<4J6 4"6e46 4>6u4W6*4>646v54%36v546464%36K4D6 n46<4X6Y 486,`4&J64X646C46Ù4[>6ig4[>6<42646X4¯6.'4¯64¯64[>6M4¯6426 4]6k.426k.4D64D64D6\46g4]654+86{4+86!Y4I6|4I6|4I6464-6_<4+8614-6 4`,64>6# 426# 46C426B464ȵ654ȵ63|4764.6J4646Rn476ʵ46 4c6C41=6R4,6u4,6u465C4f1641=6464f16464f16E436n436n436d4367 4C64&6.4C64364C64&6476t4764κ6547654h6fX4&6 &4364h64&6yC4&64h64&6ż46+6TX46+6X4=6|464i6F46m416<4868 4%6.4%6Q496V 4+64<64n6u4n64Կ6X4<64<16 J4<16 J464<164q%6`46 466v4>634664 *646Q46Q4 *64s6f4٭654s6CX4٭6406|464s6n4A646n4t6<46j4t6=_4$646.4$6-46\Q4$6.4646Ԙ4B66C46zg467f4ޛ6464D6l46?&4D6|406464D6^46<4646 4y6e406"406"4y6u4G$6u4߳6@4y64G$646v546_4G$646X4G$6&46~464|6m4|64I6p<4*64*64I6-46w46a4I64646C4646ig4}/6&f464644}/64$6[464}/6{4646J46M4646ܑ4}/646_4}/6T4}/6(-4L6(-464L64}/6G4$6ռ46f4$6|f4$6N46!X4$6X4L646&46V46@J464M)64i564~5X6u4};6H4~5X6_4};6׃4~5X6׃4~5X6-4};6P4};6:Q4~5X6#4};64yn#64{^6t4zA6C4yn#6B4yn#6+4yn#64x:F64w )64zA6J4yn#64X4yn#64yn#64yn#6J4uL6h4x:F6<4w )6<4uL6;4w )6;4t/6 4uL6[ 4t/64t/64t/64t/6Q4spR64q W6u4q W664r?46B4o:6f4q W6f4n6kf4q W6=4mu@6Z4mu@6n4n6?4n64mu@6~>4lD"6~>4lD"6}}4lD"6}P4i(6|4lD"6|o4hK6{4kE6{4hK6{34kE6zZ4i(6{4i(6zR4i(6zR4hK6y4i(6y4hK6y4gz.6x4gz.6x4e46x5w4e46w!4e46w4gz.6wTh4b96v̰4c6v4c6vsZ4c6vF4`K?6uc4e46u7>4c6t4e46t4b96t)4c6t)4b96s4a6ri4b96r4a6ri4_"6r Z4_"6q4\'6q+L4`K?6pv4\'6p4\'6p4_"6pJ=4\'6o4]E6o:4ZP-6o:4[J6ni4[J6nY4YP6m4W36m4U86m4W36m4W36lL4V6l<4TU6k4U86k04U86k.4U86jzw4S!>6jՄ4TU6jM4TU6j!!4TU6ih4U86ih4S!>6h4Q!6h4TU6h4S!>6gՓ4Q!6h4PD6gՓ4PD6gO4PD6gO4Q!6f4O'6fn4O'6f@"4PD6fw4PD6ev4NZ 6e_4O'6e4NZ 6d4K6d~4NZ 6dQZ4M&,6cɡ4NZ 6cɡ4K6cA4M&,6c>4K6b4K6b4/4O'6b4O'6a&v4NZ 6`4NZ 6`r4M&,6`4NZ 6_Z4K6_Z4M&,6_4NZ 6_54O'6_54O'6^>4K6^4NZ 6^T4NZ 6]4K6]4H\86]G/4I6\!4H\86\di4G+6\74I6\ 4H\86[h4G+6[h4D 6[h4CC6[V4CC6[h4Ba&6Z4A06Z4E=6Y4A06Z4A06Y4A06Y 4D 6Yg4Ba&6X/4?+6X!4?+6X4A06W!4?+6W4?+6W4=16WZ4?+6WZ4?+6VZ4>6VZ4>6V;L4;276U4;276UZ=4:6UZ=4;276U4:6T҅4:6T4:6TL4;276Sv486S!476S=4:6R476R476R/Z476R476Q46k6Qz46k6Q!46k6P>46k6P476P46k6P>46k6O457%6O]46k6Ov446Ov457%6Nh446Nh42+6M457%6M@446Mo42+6M42+6L>446L>446L_42+6Kْ446Kْ41 6K~41 6K~446K~40m06J4.66J!41 6J!42+6Jp4/<6Jp40m06J41 6Ih4/<6Ih4.66IaZ4/<6I40m06HL4.66H&4.66H&4/<6Gr4.66G=4.66Gr4/<6G4,6G4.66F/4,6F/4.66Fc!4,6F6v4,6F 4,6EUh4+6E4*r6E(4+6E(4+6DZ4+6D4+6D4*r6DG4+6C4)A6C4)A6C4*r6C8=4*r6Cd4*r6C 4)A6B=4)A6B=4*r6B*4)A6B*4)A6Av4)A6A4*r6Av 4( $6@h4+6@h4*r6@h4*r6@4)A6@4)A6@f4)A6@ Z4)A6@ Z4)A6?4*r6?4)A6>4( $6?X4( $6>4)A6>4)A6>K=4)A6=/4)A6=4*r6=4*r6=hv4&6=Ä4%*6=!4$w 6=hv4"6<4%*64"6:4#C06:=4#C0694$w 69\4#C069/4"69.4"69.4"68{v4"67467m4"67m4"67m4#C067?Z4"67?Z4"66Y4 664"66Y4 66^K4"664 65֓4 65֓4 65#4 65}=4"65P4"644644644"64/4 64v464A!4{64A!4 63463 463`4H633h4{634{62RY4H62Z4H62%4H62%461L4#61L461461qK461qK4#61=4604#60<4605/4#604605/4#6/4604#6/v4#6/v4#6/46/46.4M 6.h4~)6.h4M 6.s4M 6.D4~)6.s4~)6-4M 6-c4M 6-Y4~)6-4M 6-646- K4~)6,46,46,U46,U4M 6,)=46+4M 6+46+t46+Fv46* 4~)6+4~)6*v4~)6*eh4M 6*4~)6*4M 6)g46* 4~)6)g46)Y46)Y46)W46)W46)+46(Y46(K46(K46(v46(I4M 6(I4~)6(I46(46'4H6'4~)6'46'g/4~)6'46'4~)6&.4~)6':46' 4~)6&!46&Yv46&Yv46&Yv46& 46%ѽ46%ѽ46%xg46%ѽ46%xg4Q6%Z46%Z46$46$46$46$Y4Q6$Y46$46!>4 T(6 4 6 4 6 4 #6 4 6 ]4 6 ]4 T(64 T(6 ]4 T(64 T(64 64 6{4 T(6OK46 4 #6=4 64 # 646n<46?46?46n<464646^46^462 4646}46h46Q46$g4646464Y646A46K4Y6K4'64Y64'6`464Y6<4'6<46ڑ4'6/46ڑ46R46R46R46R4646 4"6 46 3 6 3 6q4"6q3Y63Y6q4"64"63Y63Y6g4646g3Y6g4"6bY3 6g3 6bY3Y654"654"654"6546 4"6 3 6K3 646K3 6K3 6T3Y63 6T46T46'4"6=464"63 63 63Y64"6s3 64"63Y6=46F3Y6s464"6=4"6.4"64"64"6 3 67v3Y646d 3 64"6d 3Y67v3 67v4"6 4"63 64"6 3Y63Y6Vg36)36Y36ί3636ί3636ί36H3^+6K363( 6K3( 6K3636J363( 69=3( 69=3^+6363^+63^+6 3^+636636+36X.36X.3^+6X.3^+6v36366w 366Ju366Ju366Ju36¼36g36¼316¼366¼366g366g366Y316;3^+6g36;366Y316Y36 366Y366Y366 316 36 366 Y366 Y316 366 -J366 -J36 =366 -J316 =36 =366 =316 366 366 x366 x316 x36 L<3^+6 L<36 L<366 366 .36 .36 ă316 .36 366 ă36 .366 36 iv36 iv366 iv316 iv36 iv36 366 <36 iv316 iv36 <366 iv316 iv316  3^+6  36  36 u36  36  36 36 3ߞ6 /36 /3h6 36 /3h6 36 3h6 Y3h6 Y36 z3h6 N3h6 3h6 z36363h63ߞ6363h6k=31636k=3h6k=36<3h63h6<36<363h63h636<36<3636<36/3h603h6/3h6.3;603603;636.3ӧ63 6 36|u36 3;6O36O36O36O3q636#3;6g36n3;6n36g3q6n3ߞ6n36g3h6@Y3ߞ6@Y36363h636X3h636_K363h63h63623h6363q623q63q6Q3 6Q36Q3 63q6Q3q636$3ߞ6Q363 63 6.3 6.36.3 6p3q6p3 6B 3ӧ6u3q6B 3 6B 3ӧ6u3C6 3ӧ6 3C6u3C6 3C6u3ӧ6a3z6a3C64g3އ63C63C63z63ӧ6SY3z63ӧ6SY3އ53އ5@3އ53އ5@3C5@3އ5353އ53އ5.y3އ5.y35.y3z5.y3z5Ų3z53z5Ų3z5l\35l\3z53ǰ5Ų35Ų35Ų35Ų3z53ǰ5Ų353ǰ5l\35l\3K53ǰ5l\3K5Ų35Ų3K5Ų3K5Ų3J5l\3535l\3ǰ535\3J5P3K5\35\3K5?3ǰ535?3K53K5$3ǰ5Ax3J53ǰ53K5Ax3K5#3K5Ax3ǰ5Ax3z5#3z5]3z5]35235235#3ǰ523ǰ5#3z5]3ǰ5]3ǰ5#3K5ر3K523523J5\3J5\35\35@3ǰ5ر35&3J5o3J5o3J5@3J5@35&3535o3J5o3އ5o3ǰ5o3ǰ535?35`y3Tz5?3t5?35#3J5Tx353K5#3K5#3J5\353ǰ5"3ǰ5Tx3ǰ5\3އ5\35E35\3K53ǰ53K53ǰ5[3J553J53J5[3J5@3ǰ53J553J53J53t53 5353 5sy35sy3&5@3 5#3 535 3 5d35d3&5#3&535d3&535\3&5\35 3&5\35\3&5X3&5X35\3535A3&5X3 5H3Tz53Tz53 5H3&53t59$353J53ǰ5?3K59$3ǰ59$353J5x3Tz53Tz5x3 5-"3 5-"3Tz5w3Tz5w35-"3 5]3 53Tz5[35k3t5k3Tz5k3 5[3Tz5>35>3t5[3 5>3Tz5[3&5y35>3&5>3 535353 5w3&5L#353&5\3 5<3535\3&53503503503503B5!?3]=5z3B5z3]=5!?3]=5!?3]=53&53]=535_"35x35x3]=5x35_"3]=535_"3]=53B53B53]=5353B5O3B5O35@@3m5\35\3.5\3m5\3.53B535@@35@@35\3B5@@3B53.5ߍ35@@3]=54?35@@3B5ߍ354?354?354?35~#3B5y35y35y35y3B5y3B5$3B5y3B5x3B5$3B5~#35r"35$3B5r"3.5r"3B5r"3]=5b35ܼ3.5b3e5ܼ3m5ܼ3m5b3m53m5b3m5 [3m5S@3e5۬3e5S@3.53e53.5S@3.5ڠ353.5ڠ3.5ڠ3.5C35C3m5y3e573e5ّ#3e573m5w35w3 5؁35؁35؁305(\375375375f?375u3053n55ֿ305ֿ3 5f?3 5 305 3n55 35 3 5f?305f?3 5f?35 3n55 3 5x35f?35V35 3 5ճ3 5ճ3 5x3 5V35V3 5Ԥ"3 5G]35G]35Ӕ3@`5;[3@`5;[3n55;[3n55;[3n55;[35Ӕ35;[3@`5Ӕ3@`53@`5353f5Ҕ3f5+3f5҅@3v5+35Ҕ3f5+3f5Ҕ3f5+3f5y3v5y>3f5y>3@`5i3v5i3v5i3f5#35ϳ3v5Z\3f5#3f5Z\3f53v535N[3f53f535N[3v53f5͘?35>3f53v5͘?3f53v5N[3f5N[3f53f53v53f5̈3f53v5/x3v5̈3@`5"3@`5/x3@`5/x3@`5"35/x3@`5|3@`5|3@`5|3@`5 3v5Ʊ3f5 3f5m[3v5m[3f5 3f5m[3f5m[3@`5Ʊ3@`5m[3f5"35Ʊ3@`5Ʊ35 35|305 3 5|3n55 3 5|3 5 3n55Ʊ3n55Ʊ3n55Ʊ3 5 35m[35Ʊ35ɺ3@`5m[35Ʊ35]3@`5]3 5ɺ35ɺ3 5ɺ3n55]3 5ɺ3n55305ȫ?3n55ȫ?3 5Q305ȫ?35Q3 5#305ȫ?3 5Bx35Bx35Ǜ35Bx3@`5"3533f5ƌ\3@`5ƌ\3v5ƌ\3 5ٱ3f533f5335ٱ3v5ٱ3v5#3v5ŀ[35ŀ[35ŀ[3v5@35ŀ[35@3535p3v5p35þ>3f5þ>35þ>35þ>3v5#35#3v5#35®35ay35ay35#35#35#35®35Uw35#3v5Uw3f5\3f535F35\35F35\3535\35Z3H5635Z3535Z3H53Q5353535*35*3H5*35*35353H5tx3H5tx3Q53H5"35"3H5"3Q53H5"35e35"3H5tx35e3Q5[3zv5 3H5 3Q5 3Q5Y35 3Q5@3Q5[3zv5I3Q5@3zv5@3Q53H5@3v553H5>3Q5I3Q5I3zv5>3H5>3Q5>3zv5>3zv5>3zv5:#3Q53Q53Q53zv5:#3Q53H5>3zv53v553Q53Q53v55:#353Q5."3H535w35."3H5w3Q5\3H5."3zv5."3zv5\3ql5."3l5x3l5."3v55x3zv5x3v55l3v55x3zv5l3v55[3ql5[3ql5l3ql5[3Q53zv5?3zv5?3zv53v553zv53v553l5?3ql53ql5\3ql53ql5\3zv5x3v553ql53l53l53l5w3l53g53g53l5=3ql5=3ql5w3ql5[3g5w3zv53ql5=3v55[3v553l5[3l5[3l5[3v5513ql513l513l5Z3l5Z3l5Z3ql5Z3ql5"?3ql5"?3g53l53v55"?3H53v553l5l#3ql53l5l#3ql5x3l53l5l#3ql53l5l#3g5x3g5x3ql53g5x3g5x3g53ql53ql5`"3c5`"3c5`"3ql5`"3g53g5[3l5P3l5[3g53l53l53l5`"3ql53v55P3ql53ql53l53l5P3g5[3c53g5[3g53c5A@3g53c53^G5A@3l5A@3c53c53g55>3c5A@3c53c55>3g5A@3^G53c5y3^G55>3^G5y3c55>3c5#3g5y3v55#3l55>3ql5y3l5#3l5%3g5#3l5w3l5%3l5%3g5%3g5w3g5#3c5w3^G5w3^G5%3^G5\3^G5s!3Y}5s!3^G5\3g5\3OB53^G5c3c5\3^G53c5c3^G5 Z3Y}5 Z3^G53^G5 Z3^G53Y}53^G53^G53Y}5 Z3c5T?3^G5T?3c53^G5T?3c5H=3OB53^G5T?3^G5T?3^G53c53Y}5H=3^G53Y}53^G5"3T753Y}5H=3T75x3^G5x3^G5H=3T75x3Y}583^G5"3T75"3Y}583^G583T7583T753Y}583T7583^G53Y}583T753T753T753Y}53Y}5)[3OB53T753Y}53OB53T75v3T75v3T753Y}53OB5g>3^G53Y}53^G53^G5 3^G53T753K!g5g>3OB53K!g5g>3T753K!g5 3FWr5 3FWr53OB5W3FWr5w3A5"3K!g5W3FWr5w3FWr5w3<ż5"3<ż5K375"375375<[3<ż53753<ż5375K375K375375<[3753753<ż5<[3FWr53OB5<[3FWr53FWr53<ż53FWr5,3K!g5,3A5?3FWr5,3A5?3<ż5?3A5,3A5,3A5,3<ż5,3A5?3A5?3A53A5?3<ż5Ӕ3<ż5Ӕ3A5,3<ż5x3<ż5x3A5x3A5x3<ż5x3<ż5"3<ż5"3A5"3A5j3A5j3<ż5"3FWr5j3A5j3A53FWr5w3FWr53FWr5w3A53FWr5[[3FWr5[[3A5[[3753K!g53FWr5[[3<ż53FWr5[[3A5[[3A53A5OZ3FWr5OZ3K!g53OB53OB53K!g53OB53K!g5OZ3OB5OZ3K!g53FWr5?3OB5?3K!g5?3OB5?3FWr53FWr5?3FWr5?3A53A5?3<ż5?3A53A5?3A53<ż5?3A53K!g53A50x3A5?3FWr50x3A53A53K!g53FWr53A53FWr53A53FWr53A50x3A53A53<ż533250x3750x3<ż5375"3.h50x3325n[3325DZ3325DZ375$v375DZ3325}3<ż5DZ375n[3325DZ3.h5n[3)5n[3$(5DZ3$(5DZ3)5n[3)5n[3)5n[3$(53.h53)53CX53CX53 M53 M53CX5^3CX53CX53 M5^3CX5^3z}53 M53 M53$(5^3 M5^3$(53 M53 M5>3CX5>3CX5R3CX5R3CX5R3 M5#3)5>3 M5#3 M5#3 M53$(5!3$(53CX5Cw3$(5Cw3CX53CX5Cw3CX5!3CX543CX53 M53CX543CX53$(53 M543 M543$(543CX5ڰ3 5ڰ3z}5ڰ3CX5Z3 M5ڰ3CX5ڰ3$(5Z3 M5Z3z}5ڰ3 M5(3CX5Z3CX543z}5ڰ3CX5Z3 M5(3 M5ڰ3z}5ڰ3 M5(3CX5(3z}5?3z}5(3 M5?3z}5q3CX5=35q3 M5=3z}53z}5=3z}5bx3CX5bx35=3z}5bx3CX5 "3$(53$(53$(5 "3$(5Vv3z}53z}5 "35353z}5[3 53 M53)5G3CX5Vv3CX5G3CX53CX5[3z}5G353$(5G3 M5[3 M573 M53z}53z}53z}53z}53z}57353z}573535735>353573z}53573z}53573CX53 573z}5>3 5>3 5735735+353z}5+3CX5+353z}5+35+3 M53 53z}535uw3z}53CX5"35uw353535"35"353 53z}53 5"3 53 5"3 5"3 5"35uw3 53 5f35"3T535f3 53 5 3 535f3 5[35 3z}5Z3CX5[3z}5[3 53 5Z3 5 35 3 5[35[3 5[35[3 5Z3535Z353 53T53T5353 5J35>353 53 5>35;"35J3 5>3 535>35;"3 5>35353 5;"3T5;"253T53T53T5353 5353 M5w35[35X3CX5/!35y3 5[3CX5[3z}5y3z}5y35R3z}5X3z}5R3)5X3)5X3)5R3 M5X3CX5kL3CX5kL3)5R3)5R3)5kL3 M5R3)5R3)53.h5kL33253.h5X3$(5R3 M5R3 M53CX53CX5kL3z}53z}53CX5\3CX53z}53 M53$(5\3$(5\3$(53$(53 M53$(53)5\3 M5\3$(5\3$(5Nz3$(53$(5\3 M53CX5Nz3z}5353z}53CX53z}5353CX5Nz35353CX53z}53CX53 5@35@3 535@3535353z}53 53535J3513z}53z}535J3z}53z}5J3 535J3z}513 5}D3CX5135J3z}5}D3z}5135}D3z}5}D35}D3T5p3 5J35#>3 5#>35p3 5}D35#>35#>35#>35J25p3T5p3T5#>3 5p25p3T5#>25~ݵ25#>25p35~ݵ3T5#>25}t35p25~)25}t25~ݵ25~ݵ25~)25}t3T5}t35~)35}t3T5~)25| 25}t25| 25| 25|2f5|25z25z25y2f5| 25{X25z2^}5{X2f5z25| 25{X35{X3 5{X35y35y3 5{X3 5z35z3z}5{X35y35y3 5y;I3z}5y;I35y;I3z}5x>35y3 5y;I3 5x>35x>3z}5x>35y;I35w23z}5w23 5x>35w235x>35w&35w235w&35w&35vjk3 5u_35w&35w235y;I3 5w235w23 5w23 5x>35vjk35vjk3 5vjk3CX5w&3z}5w&3 5w235vjk35w235vjk3 5vjk35w&3 5w&3 5w&3 5w&35w235w235vjk2f5w&25u_35u_35uT3T5tM35uT3T5uT25u_2f5u_2f5vjk25u_2f5uT285uT25uT25uT2f5uT2f5s2f5tM2f5s25s2f5s2^}5r02f5r02^}5s2f5r02f5r2f5s2f5tM2f5s2f5s2f5s2f5tM2f5r2f5uT25r2^}5s2^}5tM2^}5r02^}5s2^}5s2f5r025r25r25r2^}5q|2^}5r2f5pȯ2^}5r025q|2f5pȯ2^}5q|2f5q|2^}5q|25pȯ2^}5p2f5r025o_25p25o_25m!2f5o_285p2f5m!2^}5m!2^}5o_25m!2^}5mC25mC285l 25n285mC25l 285m!25l 25l 2^}5mC2^}5l 25mC2f5jr725jr725kO25l 2f5kO25kO2^}5k&C2f5kO2f5k&C25i|2^}5i|2f5k&C2^}5i|2^}5jr72^}5jr72^}5i|25jr725i|25i|25jr72f5i p25i|25hUe25i p2^}5i|35i p2f5i|25hUe25g25i p35i p25hUe35g25f25hUe25hUe25f25g35g35hUe25f2f5f25f25g25f25f2^}5f2f5f25g2f5f82^}5f2^}5f82^}5f82f5f25f2f5f825f82^}5f2f5e2f5f82f5d2^}5g2f5d2f5f825e2f5e2f5e2f5d2^}5hUe2f5e2f5f2^}5d2f5e25d2^}5d2^}5d25e2f5d2^}5cg2f5d2^}5e25cg25b285d2^}5b25b25cg25b2^}5a285d285b25a285b2f5b2^}5cg2f5b25cg2^}5a25cg25aJ25b2f5a25aJ25aJ2f5aJ2f5aJ2f5b25b25aJ285aJ25`&285aJ25a25`&25a285_25`&25aJ25`&285aJ25a285_285`&2^}5_25a25a2^}5b25b25b25b25cg25b2ç'5aJ2^}5cg285a2^}5b285aJ2>5`&25aJ25aJ2>5aJ25_-_2>5aJ25`&25_2ç'5]=2>5^yT2>5^yT25]H2>5]H25]H2>5\\2>5]H25]=25]=25]=25]=25]=25]=25]=25\\2>5Zj25]=25[v25^yT25]=25]H25[v25\\25]=25]=25[v25\\25\\25[v2>5\\2[5\\25[v25[v25[v25[v25[v25Zj25Zj25[v25[v25[v25Zj25[v25[v25Zj25[v25Zj25Z?25Zj25Z?25Z?25Zj25[v2[5Z?25Z?25Zj25Zj25Z?2ç'5Y25Y25Y2[5Y25Xט2>5Z?25Xט2[5Z?25Z?25Xט25Wn2>5Xט2ç'5Xט2>5Xט25X"2>5X"285X"25Wn2>5V2ç'5X"2>5V25V25V25X"25V25UQ2>5V 2[5T2[5V 2[5UQ25UQ25T25T25S5,26I5R 25S725T25S5,2[5T2[5S5,2[5S72[5UQ25S5,25S72[5S5,25R 25S72[5Qe25S725S5,2[5S725S5,25R 2[5S725Qe2>5R 25R 2ç'5Qe2>5S5,2>5Qe25PdN2ç'5R 2>5QY2>5QY25QY2ç'5QY2[5Qe2[5PdN25QY285QY25PdN2[5PdN25QY2[5O2[5QY25O25PdN25N25PdN25O25PdN25O25PdN25N25O25PdN25N2[5N26I5O2[5N2[5O2[5N25N2[5NG{25N25NG{25NG{25M26I5NG{25M2[5M26I5NG{25L޴25M2[5M2[5N26I5L޴25L޴25M25L*2[5NG{25L*25M25L޴25L޴25L*2[5L޴25L޴2[5L޴2[5L*25M25L*25L*25L*26I5L޴2[5Ku25Ku25L*2[5Ku2[5L*25J25Ku25J2[5J2[5Ku2[5J2[5Ku2[5J25Ku2[5J2[5Ku2[5J2[5Ku2[5Ku2[5Ku2[5J25Ku2[5J25Ku25J 2>5J2>5IY25J2ç'5IY2>5IY2ç'5IY285IY25IY2>5H2ç'5H2ç'5IY2ç'5IY25J 2ç'5H2>5IY2>5H25H2>5J 2>5IY2>5H2>5IY25H25H25H2>5H25G2[5IY2[5G25IY25IY25IY25H25IY2>5IY25IY2[5G2>5H25G<2ç'5G25G25G2[5G25H25G<25F=2>5G2>5F=2ç'5F=2>5G<2>5F=2>5F=2>5G<2>5F=2ç'5F=285G<2>5F=2>5E12>5E &2>5E &2>5E &2>5F=25E &2ç'5E12>5F=2>5E125E125E125C_2>5E12>5E125E12>5E &25E &285E &2f5E &25E &25E &25Dkj285E &285C_25E &25C_285C_285E &285C285C_25Dkj2^}5C_25C_25C_2^}5C2f5C_25C_2f5BN2^}5BN25BN25C25C_25E &285C_285Dkj25Dkj25C_2^}5Dkj25C25Dkj25C2^}5C285Dkj25C25Dkj25C_285C25C25C_285BN25C_25C285C_2ç'5C2f5C25BN2f5C2^}5BN2^}5A2f5A25BN2ç'5BN2ç'5A2ç'5A285@285@12ç'5@12>5?}285@285@25@125@125@12^}5?}285@1285?}285@125@12ç'5?}2>5@2ç'5?}285@12ç'5?}285>ɮ2ç'5?}2ç'5>ɮ285>ɮ285?}2ç'5>2ç'5>2>5>ɮ2ç'5=`25>ɮ285>ɮ2ç'5?}25>ɮ285>25>ɮ25?}25=`2^}5>ɮ285>2^}5>ɮ285>25>2>5>25>ɮ25>ɮ25>25>ɮ2>5>ɮ25>25>ɮ25; 25>ɮ25<2[5>2ç'5<25=`25<25>25>25=`25=`2>5; 2>5; 25=`25=`25<25=`25<25>25<25; 2>5=`25<2ç'5<2>5<2ç'5; 2>5; 285<2>5>ɮ25=`25<25>2>5>2ç'5<2>5>25>ɮ2ç'5>2>5>2>5=`25>ɮ25>ɮ25=`25>25>ɮ25>25>25>2[5?}25@125?}25>25<25<25=`25; 25>25<2>5=`25=`2>5<25<2ç'5=`2>5<2[5; 25; 25=`25; 25=`25: 25; 25: 25;D2[59N25;D2[5: 2[5: 2[5: 25: 2n!S5: 25: 2>5;D2>59N259N25; 25: 259'B259N2>59'B259'B258s7257{259'B258s7257{259N258s7259'B258s7259'B259'B258s7258s7258s7258s7259'B259'B258s725: 258s7259'B258s7259N2>59N259N259N259'B2[58s7259'B259'B2[59'B2[59'B259N258s72[58s72[59'B2>59'B258s7259'B259'B258s7259N2[57{2[59'B258s72[59'B259'B259'B2[57{2[58s72[59N2[59'B2[59N2[58s7258s7259'B258s7259'B258s726I58s72[59'B257{2[59'B2[58s7259'B259'B258s7258s72>57 p257{257 p2[552[57{26I57 p2[552552542552542552542542[56Vd25492542[5492542>5492542552[542552542[5425525525525492542[542[549253253253254925492[5492[5325492532532[5492[532[51h2532[5225226I5225226I5325326I51h2532522n!S51h26I522502522n!S5225225025326I51h2n!S51h2n!S51h251h2522522[522[5226I522[51h2522[522522[5225225225225226I5225326I5225226I51h26I52251h26I5/K126I502n!S5/26I5/25/K12n!S5025/25/K12n!S5/25/K125/25/K125/25/K125/K126I5/K125.&2[5.&25/K125.&25.&25.&26I5/K126I5/K12[5/26I5/K125.&25/26I5/25/K126I5/K125.&2[5-25,zS25-._26I5-25-25/K125/K126I5-25.&25.&26I5.&26I5.&25.&25/K125-26I5-25/K126I5.&25-2[5-2[5-._25.&25,zS25-._2[5-2[5,zS25.&25-25-._2[5-25-._25-._25,zS2[5-25,zS25+H25+H2[5+H25-._26I5,zS2[5+H25+H25-._25+H25,zS25,zS25,zS2[5+H2[5+H26I5+H2[5+H25+H25,zS2[5+<25,zS2[5+<26I5+H2[5+H2[5+H2[5+H25*]25*]25+H25,zS25+H25,zS25+<25,zS25,zS25,zS2[5,zS2[5,zS2[5+<25+H2[5+<25*]2[5*]25+<25+<25+<2n!S5+H25)u25*]25*]25)u25*]26I5)u25(25(2[5)u25)u25)u25(25(25(25(2>5(2ç'5)u25(26I5(25(2[5'2[5(26I5(25(25(@26I5(26I5(@2[5(@26I5(@25(@2[5(@25'2[5I5(@25(@25'25'2[5'25(@25'25&2[5[5[5(@2[5%o25%o25%o25%o2[5%o25$2[5I5%o2[5[5[5[5&25I5&25%o26I5&25$25&2[5I5I5I5%o25I5%o26I5n!S5%o26I5%o2n!S5Z5$2n!S5%o25I5%o25$ 25%o25%o26I5$26I5%o25$ 25$ 26I5$25$25$25$2n!S5$ 25$ 26I5$25$ 25#R2n!S5$ 26I5$26I5"25"2n!S5!725"2n!S5!72Z5!6+2Z5 2n!S5!72n!S5!72n!S5!6+2n!S5!6+25!72Z5!726I5!72n!S5!6+2n!S5!6+2Z5!72Z5!6+2n!S5"2Z5!6+2n!S5!72n!S5!6+25 2Z5d2n!S5d2n!S5 2Z5d2Z5!6+2G5!6+2Z5d25eM25d26I5Y25d25Y25d2[5Y25Y25 26I5eM2525eM252526I5H{2[525eM2[52[525eM2526I52[5H{252[525252[525ߴ25H{25ߴ252n!S52n!S5ߴ252n!S5+26I526I525H{2n!S5ߴ26I52n!S5ߴ2n!S5ߴ25H{26I526I5+2525+252n!S52Z5v2Z5+2n!S5ߴ2Z5ߴ2Z5ߴ2Z5v2n!S5ߴ2Z5+2Z52Z5v2Z5+2n!S5v2n!S5ߴ2n!S5+2G5v2n!S5252Z5v2Z5v245v2G52G5245v2452G5+245v2G5v245ߴ245v245+245245+2Z5+2G5v2452G5ߴ2G5+2Z5v2n!S52Z5v2Z52n!S5v2Z525v26I5v26I5+252Z5Z2Z52452Z52G52G5v2G5Z2Z52Z52n!S5v2525252n!S52G52Z52Z52Z52n!S52n!S5v2n!S52Z5Z2Z5Z2Z52G52Z52n!S52G52n!S5Z2G5Z2G5Z2n!S52n!S52Z52452452!'52!'5Z245Z2f5Z2!'5Z2!'5Z2f5152f5152f5Z2f5Z152f52f52!'52!'52f52452!'52452f52f52!'52f517r5Z1517r5135135Z1513513517r5Z17r517r5Z15=H15Z15152!'5=H17r52f52f51515115=H1515<15=H17r5=H15<2f5<17r5=H17r5=H2f5<15<15<15<15115=H135!%2!'5=H2!'512!'5!%2G5=H2f5lj245<2!'5!%245!%2!'5lj245lj2!'5!%245^2f5!%2!'5^15lj245lj2f5^2f5^152!'5^152!'5^2f52!'5^15O2!'515O2f5^2!'52!'5O2!'5O2!'52G52!'52Z515O2!'5O245O15O2!'52452!'52G52452G5O2452452452f52!'5O2f52!'51522f52f5O2!'5152f52!'52!'522f52151522!'5 ~152f5 ~2!'522f5 ~2f5 ʮ2f5 ~2f5 ~2f522f5 ~1522f5217r5215 ~15217r5152152245224517r515215 ~15 ~2f515 ~2f5217r5 ~2f52245 ~2f5 ʮ17r52135 ʮ15 ~2f5 ~2f5 ~2f5 ~15 ʮ15 ʮ17r5 ~17r5 ~17r5 ʮ17r5 17r5 15 ʮ15 a17r5 a135 a1:,5 1:,5 ʮ0-]5 ʮ135 15 ʮ15 a15 15 15 ʮ1:,5 135 135 a135 a15 2f5 2f5 E2!'5 17r5 15 a17r5 a2f5 2f5 15 2f5 15 a2f5 a17r5 135 17r5 15 E15 E135 135 E135 135 15 E135 135 17r5M135 E17r5 2f5 17r5 15(B17r5 E15M15 2f5 17r5 2f5(B15 2f5 E15M17r5 15 15 E17r5 17r5 E135(B17r5(B15t617r5t615t617r5{15t615{17r5M17r5t617r5t6135{15{15{15t617r5t615{15t615 o17r5{17r5 o2f5{15{15{15t617r5 o15 o15{135 o15{17r5t615t615t615t62f5t6135(B2f5{2f5M17r5 o15(B15Wd135{135Wd15{15Wd17r5t6135Wd135{15 o1:,5 o1:,5 o135 o135Wd15 o15 o135Wd15Wd13515Wd1:,5Wd135{15Wd15Wd15{15Wd15135Wd1:,5 o15135 o135Wd15Wd0-]5150-]51515Wd1:,5151515Wd151351:,50-]50-]51:,5Wd1:,5:151351:,51:,515:1515 o151515Wd135Wd1515135:15:15:1350-]5:1513517r5:1:,51515151:,517r517r51517r51517r513517r517r517r5135135152f5152!'52!'52G52G52!'52!'42!'42f5152f515134134141417r51514141:,417r41514i17r41517r517r417r4i14i13417r4i17r4i134i2!'417r41414i2f4134a17r417r417r4a14i2f4a17r42f4i17r40J2f4i140J1414140J2f4^17r4a17r4a140J2f4142f4a17r4a2f4a2f40J140J2440J2Z4a2442!'40J244a2!'40J2f40J17r40J142f40J2f40J17r40J14314^2!'4317r4^1340J1431343134^13431340J14^2f4a14^17r431413431:,417r4^17r414^17r42f42f42!'42f42f42f42f42!'42!'4%14142!'4%2G4T244244%2!'4244%2442442!'42!'4%244%244%244244%244%24417r4%1414%14%2f4134134%17r4T14%17r4T17r4%1417r417r417r413414134T17r4%17r414T134142!'42f42!'414T2f414T1417r417r4%13417r4134%2f4T13417r414%17r4%17r417r417r4%13417r41:,4T1413417r4134T134T2f4142f4T2f4T17r414T2f42f4142f42!'414T141413414%14134T1414T17r4T134T14T134134T17r414T134141417r414T17r417r417r4T14T14[2!'4142f41414D244[244[244[244[2!'4[142G42!'4-244[244[2442!'4D2G4[2f4D2Z4[2f4D244-2!'4[244-2442!'4-2!'4-2!'4D2!'4D14D17r4I17r4-17r4I17r4D17r41414D17r4-17r4-134-14I17r4D14-244I2!'4D2!'4I244D2!'4-244I2!'4-2!'4I1414I14x(2f4-17r4I1417r4I2!'4I14-2f4-2f4-2!'4I2!'4-2G4I134I2f417r4-14I2f417r4-14I17r4D14-14D17r4D17r4-134-17r4[14-14D14-14I2f4[17r4D2f4D244D2f4-2G4-2!'4-2f4D17r4-17r4-2f414134x(2f4134I2f4x(134x(17r41417r4141417r42f4I17r4x(14x(14x(17r417r417r42f4x(2f4x(2f42!'4I14x(2f4I14x(134I134x(14134141:,4x(0-]4x(1417r4x(17r4x(14x(134x(134x(134134134134?17r413413417r4?134134l134nU134?14nU17r4>134>134>134ۜ134nU134l17r4l17r4nU134l134nU17r4nU17r4ۜ134>17r4nU134>17r4l14>17r4l14>14>17r4nU14>14nU17r4l134ۜ17r4>14l14nU14>17r4nU2f4>17r4>17r4417r4417r4̙134>14nU134nU134>14nU2!'4ۜ244ۜ2G4>2G4>2Z4>2n!S4ۜ2G4ۜ244>2!'4ۜ134414>17r4c"14ۜ134nU134l134nU14l2f4l2f4l2!'4?14l2!'4nU2!'4l14nU17r4nU14l17r4nU14nU14l14>14l17r4nU17r4>14>17r4nU2!'4ۜ2f4>244>2f4̙244nU2!'4nU2!'4ۜ2f4ۜ2f4ۜ2f4>2!'4ۜ2f4̙2f441442f4̙14̙2f4ۜ17r4̙14̙14̙17r4414ۜ2!'4̙2f4̙2!'4̙2f442!'442f4ۜ1442f4>1:,4̙134ۜ14>134̙17r44134>134ۜ13440-]440p_4>17r4̙1344134nU1:,4ۜ14>0-]4>0p_4̙0-]4>0-]4>1:,4>14>14>134>1441:,4ۜ14>134>144134>1440-]4>14>134ۜ134>14ۜ1:,4ۜ17r4̙14>14ۜ144134414̙14ۜ13441:,4ۜ14414 14c"14c"134414 134 134c"14̙14c"14c"1:,4̙14c"1:,4c"134̙134Ԓ14Ԓ134c"14̙134c"17r4c"17r4 2f4 244c"2f4 2!'4Ԓ2!'4c"2f4c"14 14̙2f4414̙2f4ۜ14̙14̙2f4c"2f4Ԓ17r4 14 2f4c"14 14c"14Ԓ14 14 14 17r4c"14 17r4 17r4 134c"14c"17r4Ԓ17r4Ԓ14Ԓ17r4)}134Ԓ0-]4f14)}134Ԓ1:,4f0-]4)}1:,4Ԓ1:,4̙14Ԓ0-]4f1:,4f14f14YO0-]4)}1:,4)}0p_4f0p_4Ԓ0-]4YO0p_4Ԓ0p_4YO0p_4f1:,4)}0-]41:,4Ԓ0-]4Ԓ1:,4)}1:,4Ԓ14YO0-]4f134f14Ԓ14Ԓ14Ԓ134YO134 14 17r4)}1344134 14)}134Ԓ134Ԓ14Ԓ1:,4Ԓ14)}134Ԓ14)}134Ԓ14f14f17r4134f14f134YO134)}141:,4YO1:,4͇1:,4f1:,4YO14YO1:,4YO0p_4YO0p_40p_40p_4f0p_40p_40p_4YO0p_40p_4͇0p_4YO0p_4͇0p_40p_40p_4YO0p_40p_4͇0p_40p_40p_41:,4͇0-]41:,4͇0-]4͇0p_40p_4YO0p_4ʶ30p_4YO0p_4͇0p_4͇0p_4YO0p_4͇0p_4͇0p_4͇0p_4͇0-]4͇0p_4͇0p_4͇0p_40p_40-]40p_4͇134͇134134͇17r4͇1414͇2f417r417r414ʶ314͇1:,4͇1:,41:,4͇1:,40-]4͇1:,4ʶ314ʶ30-]4͇141:,41:,4͇140-]4ʶ314͇0-]4͇1:,4ʶ31:,414ʶ30-]4͇1340-]40-]4N0-]41:,4ʶ31:,4ʶ30-]40-]4N1:,41:,4͇1:,4ʶ31:,4ʶ3140-]4N141:,4ʶ31:,4ʶ314͇1:,4ʶ3141:,4ʶ314ʶ30p_4ʶ314͇0p_4N1:,4ʶ31:,40-]41341:,4ʶ31:,4ʶ30-]4141:,4N0-]41:,40-]4N0-]4N0-]4ʶ30p_40p_40p_4ʶ30p_4ʶ30p_4ʶ30p_4ʶ30p_4N0p_4N0p_4ʶ31:,4ʶ30-]4N1:,41:,4N0p_4ʶ30-]40p_4N0p_40p_40p_4N0-]4ʶ30p_4N0-]40p_4N0p_4N0p_4ʶ30p_4ʶ30p_4͇0p_40p_4͇0p_4N0p_4ʶ30p_4|0p_4|0p_4N1:,4w0p_4|0p_4N0p_4N0p_40p_4N0p_4ʶ30-]4N0-]40p_4ʶ30p_4ʶ30p_4N0p_40p_4ʶ30p_4N0-]4N0p_4N0p_4N0-]4N0p_4|0-]40p_4w0p_40-]40p_41:,40p_40-]4|0-]4|0-]40p_4|0p_40p_4|0p_4w0p_40p_4w0p_4w0p_40p_4w0p_4|0p_4w0p_4ì`0-]40p_4|0p_4|0p_4w0p_4|0p_4|0p_4|0p_4w0p_4|0p_4w0p_4|0p_40p_4ʶ30p_40p_40p_4|0p_4N0p_40p_4ʶ30p_4|0p_40p_41:,4N0-]40-]41:,41:,40-]40-]40-]4N1:,40-]4N141:,4|1:,4N0p_4N0p_4|0p_4|0p_4N0p_4ʶ30p_4N0p_4N0p_4N0p_4ʶ30p_4|0-]4|0-]4|0-]4|0-]4|0p_4w0-]4|0p_4w0p_4|0p_4ì`0p_4ì`0-]4w0p_4B0p_4ì`0p_40p_4r0p_4ì`0p_4ì`0p_4B0p_40p_4B0p_4B0p_40p_40p_4B0p_4B0p_4B0p_4B0p_40p_40-]40p_41:,40p_4ì`0p_40p_4ì`0p_4B0p_4B0p_40p_40p_4B0p_4B0-]4B0-]4ì`1:,40-]41:,4B0-]4B14B1:,4B1:,4B0-]414B1:,41:,4r14B141:,4B0p_4r0p_4ì`0p_4r0p_4r0p_4B0-]40-]4 D1:,40-]4r0-]4 D0-]4-0-]40-]41:,4ì`0-]4B0p_4ì`0p_40p_4ì`0p_4B0p_4B0p_40p_4B0p_40p_4B0p_4r0p_4B0p_40-]40-]4B0-]4 D0-]41:,4r0-]4 D0-]4r1:,4 D0p_4 D1:,4-0-]4r0p_4 D0-]40-]4 D0-]4r0p_4-0-]4 D0-]4r0p_4r0p_4 D0p_4r0p_4 D0-]4 D0p_4r0p_4 D0p_4r0p_4r0p_4r0p_4 D0p_4-0p_40p_4 D0p_4 D0p_4-0p_4 D0p_4 D0-]4 D0-]4-0-]4 D0p_4r0p_4 D0p_4 D0p_490p_4 D0p_4r1:,4 D0p_4 D0-]4-0p_4 D0p_4-0p_4-0p_490p_4 D0p_4 D0p_4-0p_4 D0p_4 D0p_40-]4r0p_4r0p_40p_4-0p_4r0p_4r0p_40p_4 D0p_4 D0p_4r0p_40p_4r0p_4 D0p_4r0p_40p_490p_490p_490p_4-0p_490p_4 D0p_4-0p_4-0p_4 D0p_4-0p_4-0p_4-0p_40p_4 D0p_4-0p_4-0p_4-0p_490p_4-0p_490p_490p_490p_490p_4ϟ0p_4ϟ0p_490p_490p_4ϟ0p_490p_4ϟ1:,490p_4ϟ0p_4ϟ0p_490p_490p_490p_4ϟ0p_490p_4ϟ0p_4g0p_490p_4ϟ0p_4-0p_4g0p_4q0p_490-]490-]4g0-]4g1:,4ϟ14g14q1:,4ϟ14g14914g0p_4g0-]4ϟ0p_4g0-]4ϟ0-]4g0-]4ϟ0-]4q0-]4g0p_4q0-]4q0p_4g0-]4Z0p_4ϟ0p_4g0-]4q1:,4q0p_4ϟ0p_4ϟ0-]4g0-]4q0p_4ϟ0-]4g0p_4g0p_4g0p_4q0p_4g0p_4q0p_4g0p_4q0p_4q0p_4g0p_4Z0p_4q0p_4q0p_4g0p_4Z0p_4q0p_4g0p_4q0p_4q0p_4q0p_4q0p_4g0-]4q0-]4g134q0-]4Z134q14Z0p_4q0p_4q0p_4g0p_4q0p_4g0-]4g0-]4g0p_4g0p_4q0-]4q0p_4q0-]4Z14q0-]4q14g0p_4q0p_4914g134ϟ1:,490p_4g0p_4g0p_491:,4ϟ0p_4ϟ0p_490p_4Z0-]4g1:,4ϟ0-]4g0-]4g1:,4ϟ0p_4g134ϟ14g134g0-]4914g1491:,491:,4g134-1:,4917r4917r4917r49134-17r4-134 D134 D134-17r4134r1414r0-]40-]40p_4B0-]4r14B0-]414r1:,4r17r4 D1:,4r140-]4r1:,40-]40-]40-]4r0-]4B1:,4B0-]4B0-]4B0p_4B0p_40p_4ì`0p_4r0-]4B0p_4ì`0p_40-]40p_4B0-]41:,40p_40p_4B0p_4r0p_40p_40p_40p_40p_4 D0p_4r0p_4B0p_4 D0p_4 D0p_40p_4r0p_4 D1:,414 D0p_4r0p_490p_40p_4-0p_4r0p_4-0p_4r0p_4-0p_4-0p_4-0p_4 D0p_4-0p_4 D0p_490p_4 D0-]4-0p_4-0p_4-0p_490p_4-0p_490p_490p_4-0p_490p_490p_4ϟ0p_490p_4q0p_490p_4ϟ0p_4ϟ0p_4q0p_4g0p_4ϟ0p_4g0p_4g0p_4ϟ0p_4ϟ0p_4g0p_4ϟ0p_4g0p_4g0p_4ϟ0p_4ϟ0p_4g0p_4ϟ0p_4-0p_4q0p_4Z0-]4Z0p_4Z0p_4q0-]4q0p_4Z0p_4Z0p_4q0p_4g0p_4-0p_4Z0p_4q0p_4-0p_4-0p_4-0p_4-0p_4-0p_4Z0p_4Z0p_4Z0p_4Z0p_4Z0p_4q0-]4q0p_40-]4Z0p_4q0p_4ϟ0-]4Z0p_4Z0p_4g0-]4Z0-]4q0p_4q1:,4q0p_4Z0-]4g0-]4-1:,4Z14q134Z1:,4Z134q14q14Z14Z14Z1:,4Z1414Z14-134Z1:,41:,4Z17r4-1414Z17r4Z14Z1:,4-1:,4Z0p_4-0p_4Z0p_4-0p_4-0p_4\U0p_40p_4-0p_40p_40p_4q0p_4g0p_4q0p_4Z0p_4-0p_4-0p_4q0-]4q1:,4-0p_4g0p_4q0p_4g1:,4g0p_4g0-]4g0p_4q0-]4q0p_4Z1:,4q0p_4-0p_4q0-]4-0-]4Z1:,4q0p_4q1:,4Z0-]4Z1:,4Z0-]4Z0p_4Z1:,4-1:,4-1:,4Z1:,4q1:,4-0-]4Z0-]4Z1:,4-1:,4Z0-]4Z0p_40-]4-0p_4-0p_4-0p_4-0p_40p_4q0p_4-0p_40-]4Z0p_4-0-]4Z0p_4-0p_4-0p_4-0p_4-0p_40p_4-0p_4-0p_40p_4-0p_40p_4-0p_4\U0p_4Z0p_4Z0p_4q0p_4q0p_4q0p_4Z0p_4ϟ0p_4g0p_4Z0p_4Z0p_4Z0p_4-0p_4-0p_4Z0-]4-14Z0p_4Z0p_4Z0-]4-0p_4q0p_40p_4q0p_4Z0p_4-0-]4>0p_4\U0p_40p_4\U0p_4R0p_40p_40p_4'0p_4'0p_4\U0p_4'0-]4\U0-]4'0-]4\U0p_4'0p_4\U0p_4'0p_4>0-]4>0-]4"0p_4>0-]4>1:,4'1:,4"1:,4'0-]4\U134>14\U0-]4>0p_4>0p_4>0p_40p_4>0-]4\U0p_4>0p_41:,4'1:,4'0p_4>0-]4'0-]4\U0-]4>0p_4\U0p_4>0p_4\U0-]4Z0p_4\U0p_4>0-]40-]4\U0p_4\U0p_4>0-]4\U0p_4>0p_4>0p_4"1:,40-]4"0p_4"0-]4"0-]4'0p_4"0p_4>0p_4'0p_4"0p_4'0-]40p_4"0p_4'0p_40p_4'0p_4'0p_4'0p_4>0p_4"0p_40p_4"0p_4"0p_4"0-]40p_4"0p_40p_40p_4"0p_4"0p_40p_4"0-]4"0-]4"0p_4"0p_4k0p_4R0p_4R0p_4140p_4R0-]4R0p_40p_4k0-]4'0p_4R0p_40p_4R0p_4k0p_4k1:,4R0p_4k0p_4k1:,4R134k14R1:,4R1:,4R134k14k1414R134k0-]4k1:,40p_4k0p_4k0p_4R0-]40p_40p_41:,40p_40-]4GO0-]480-]40p_4140p_40-]4k0p_40p_40p_40p_4k1:,41:,4k1:,4141:,4k141:,4140-]41:,40p_40p_40p_4k0p_40p_40p_40p_40p_40p_4k0p_40p_40p_40p_40p_40p_40p_40p_40p_40p_4GO0p_40p_40p_4GO0p_4k0p_40p_40p_40p_40p_4140p_4GO0p_414GO0p_40p_40p_40p_40p_40p_40p_40p_4GO0p_40p_4GO0p_480p_40p_4GO0p_4GO0p_4GO0p_40p_4GO0p_40p_40p_4GO0p_40p_480p_4GO0p_40p_4GO1:,4GO0-]40-]480p_4GO0-]40-]40p_480p_480p_4GO0p_40p_4GO0p_4w!0p_40p_40p_40p_40p_40p_40p_40p_40p_40p_40p_4GO0p_480p_40p_480p_480p_480p_4GO0p_480p_4GO0p_4w!0p_480p_4w!0p_480p_4w!0p_480-]481:,481:,4w!0-]480p_4w!0p_480p_480p_4w!0p_40p_480p_4 0p_4w!0p_4 0p_4 0p_4w!0p_4 0p_4=|0p_4 0p_40p_4w!0p_4w!0p_4w!0p_4 0p_4 0p_4w!0p_4w!0p_480p_4GO0p_4w!0p_40p_4=|0p_4=|0p_4 0p_4w!0p_40p_4w!0p_4w!0p_4 0p_40p_4 0p_4 0p_40p_4 0p_40p_40p_4=|0-]40p_40p_4 0p_40p_40p_4 0p_4 0p_4w!0p_40p_4=|0p_40p_40p_40p_4=|0p_40p_4=|0p_4=|0p_4=|0p_40p_40p_40p_4k0p_4=|0p_4=|0p_40p_40p_40p_4=|0p_4=|0p_40p_40p_40p_40p_4=|0p_4=|0p_40p_4k0p_40p_4=|0p_40p_4k0p_4=|0p_40p_4=|0-]40p_40p_4k0p_40p_40-]4k0p_40p_4=|0p_40-]4=|0p_40p_40p_40p_40p_4k0p_40p_4k0p_4=|0p_4=|0p_40p_40p_40p_40p_4=|0p_4=|0p_4=|0p_40p_40p_4=|0p_4k0p_40p_4=|0p_40p_4=|0p_40p_40p_40p_40p_4k0p_4k0p_4k0p_4k0p_4k0p_4k0p_40p_40p_40p_40p_40p_4k0p_4=|0p_40p_40p_40p_4k0p_40p_40p_40p_40p_40p_40p_40p_4k0p_40p_40p_40p_4`0p_40p_4k0p_4k0p_4k0p_4k0p_4k0p_40p_4`0p_4k0p_4`0p_42I0p_42I0p_4`0p_42I0p_4`0p_4`0p_42I0p_4k0p_4`0p_40p_40p_4k0p_4`0p_40p_4`0p_4k0p_4`0p_40p_4`0p_4`0p_4`0p_42I0p_4`0p_42I0p_4`0p_4`0p_4`0p_40p_42I0p_40p_4`0p_4`0p_4`0p_4`0p_40p_4`0p_4`0p_4`0p_42I0p_420p_4k0p_4`0-]4`0-]4`0p_40p_4k0p_4`0p_42I0p_4k0p_40p_40p_40p_40p_40p_4`0p_40p_40p_40p_40p_40p_40p_42I0p_40p_40p_4k0p_40p_4`1:,4k0-]40p_4`0p_4k0p_40p_4`0p_4`0p_4`0p_40p_4k0p_42I0p_40p_420p_420p_42I0p_40p_4`0p_4`0p_42I0p_4`0p_420p_420p_420p_42I0p_4`0p_42I0p_420p_4`0p_420p_4`0p_420p_420p_40p_420p_4`0p_420p_420p_40p_4`0p_420p_420p_4`0p_40p_420p_4`0p_4`0p_420p_420p_4`0p_4`0-]420-]4`1:,4`0p_4`1:,420p_420p_40p_420p_420p_420-]4`0p_40p_40p_420p_40p_42I0p_40p_4`0p_420p_4`0p_42I0p_40p_4`0p_4`0p_42I1:,421:,420p_4`0-]42I1:,4`0-]42I0p_4`0p_420p_420-]42I14213421:,42I0p_42I0p_420p_42I0-]4`142I1:,4`14`1:,421:,41:,4`1:,40-]4214213421342I1:,4`1:,4`0-]4`1:,420-]4`1:,4`1:,420-]420-]42I1:,41:,420-]420-]4`1:,420-]4`0-]4`0-]41:,4`1:,420p_414`0-]4`0-]420p_420p_40p_4`0p_420p_40p_40p_40p_4`0p_420p_40p_4`0-]40-]40p_4`0-]40p_4`0p_40p_4`0p_40p_40p_40p_40p_4`0p_40-]40p_4'0p_42140p_4`0p_40p_4`0p_40p_40p_40p_4`0-]420p_40p_42I0p_40p_4'0p_4'0p_40p_40p_414'0-]41:,4'1:,40-]4`0-]4`0-]41:,41:,4`1:,40-]41:,4`0p_40-]4`0p_40p_40-]40-]40p_4`0p_40p_40p_4`0p_40-]40p_4`0-]4'0p_4`0p_40p_40p_40p_40p_40p_40p_40p_4`0p_40p_40p_40p_40p_4`0p_40p_40-]40p_4'0-]40p_40p_40p_40p_40p_4'0-]4'0p_4'0p_40p_4q0p_41:,40p_40p_40p_40p_4'0p_40p_40p_4'1:,41:,4'1:,4'140p_40p_40p_4'0p_4'0p_40p_4'0p_40p_40p_40p_40p_4`0p_420p_4`0-]40p_42I0p_42I0p_420p_42I0p_420p_42I0p_420p_420p_420p_420p_4`0p_420p_4`0p_4`0p_420p_40p_420p_40p_420p_420p_4`0p_40p_4`0p_40p_40p_40p_4'0p_4'0p_40p_4q0p_40p_4'0p_40p_4V0p_40p_40p_4V0p_4V0p_40p_4V0p_40p_4q0p_40p_4V0p_40p_4V0p_4q0p_40p_4V0p_40p_4q0p_4V0p_4V0p_40p_4Z0p_4Z0p_4V0p_4Z0p_4V0p_4V0p_4V0p_4V0p_4q0p_4q0p_4V0p_4q0p_4Z0p_4V0p_4q0p_4Z0p_4q0p_4V0p_4V0p_4q0p_4q0p_40p_4'0p_4V0p_4V0p_40p_4V0p_4V0p_40p_40p_4V0p_4V0p_4q0p_40p_4V0p_40p_4V0p_4V0p_4q0p_4q0-]4q1:,40p_4q0-]4q1:,40-]4V1:,4V0p_40p_4q14V0-]4V0p_40-]4q0-]40p_4q0p_40p_4q0p_4q0p_40p_40p_4V0p_4V0p_4q0p_4q0p_4q0p_4Z0p_4q0p_4C0p_4q0p_4q0p_4Z0p_4C0p_4Z0p_4Z0p_4V0p_4V0p_4q0p_4q0p_4V0p_4q0p_4q0p_4'0p_4Z0p_4q0p_4q0p_4V0p_4q0p_4q0p_4q0p_4Z0p_4C0p_4Z0p_4q0p_4V0p_4Z0p_4C0p_4q0p_4Z0p_4Z0p_4Z0p_4q0p_4Z0p_4q0p_4C0p_4q0p_4C0p_4C0p_4Z14Z14C0p_4Z0p_4Z0p_40p_4Z0p_4Z0p_4Z0p_40p_4Z0p_4C0p_4C0p_4C0p_40p_4C0p_4C0p_4Z0p_40-]4Z0p_4q0p_4Z0p_4Z0p_4Z0p_40p_4C0p_4Z0p_4Z0p_40p_40-]4V0p_4C0p_4q0p_40p_4C0p_4Z0-]4K1:,4Z0p_4Z0p_4C0p_4q0p_40-]4Z0p_4V0p_4q0p_4C0p_4Z0p_4Z1:,41:,4q0p_4q0p_4Z0-]4Z0p_4Z0-]4Z1:,4q0-]4C1:,4C0p_4Z1:,4Z0-]4C0p_4Z0p_4Z0p_4Z0p_4Z0p_4q0p_4C0p_4q0p_4V0p_4Z0p_4q0p_4q0p_4V0p_4Z0p_4V0p_4V0-]4V0p_4q141:,4V0-]4q1:,4V0-]4V0-]4V1:,4q1:,4V1:,40p_4'0-]4Z1:,40-]40-]4V0-]4'0p_4V0-]40p_40p_4V0-]4'0p_4V0p_4q0p_40p_40p_4V0p_4q0p_4V0p_4V0p_4q0p_4V0p_4V0p_4q0p_40p_4V0p_4q0p_4V0p_4V0p_4q0p_4q0p_4V0p_4q0p_4V0p_4q0p_4V0p_4q0p_4V0p_4q0p_4q0p_4V0p_4V0p_4V0p_4V0p_4q0p_4q0p_4V0p_4q0p_4C0p_4V0p_4q0p_40p_4Z0p_4q0p_4q0p_4q0p_4Z0p_4V0p_4Z0p_4q0p_4C0p_4q0p_4K0p_4C0p_40p_4C0p_4C0p_4C0p_4Z0p_40p_4C0p_4C0p_40p_40p_4Z0p_4C0p_4C0p_40p_4C0p_4C0p_4K0p_4C0p_40p_40-]4C0p_4K0p_4C1:,41:,4C1:,4C14Z1:,40-]4C1:,4C141:,4C1:,41:,4Z0-]41:,41:,4C1:,41:,40-]4K1:,41:,4K140p_40p_4C0p_4K0p_40p_40p_40p_40p_4{0p_40p_40p_4K0p_40p_4K0p_4K0p_4K0p_40p_40p_40p_40p_40p_40p_4K0p_4C0p_40p_4C0p_4C0p_4C0p_41:,4C0p_40-]4K0p_40p_40p_40p_40p_40p_40p_40p_40p_4z0p_4{0p_40-]4{0p_4}S0-]4}S0p_40p_4{0p_40p_40p_40p_4}S0p_4{0p_40p_4{0p_4}S0p_4}S0p_40p_4}S0p_4}S0p_40p_4z0p_4}S0p_40p_4}S0p_40p_40p_40p_40p_4{0p_40p_4}S0p_40p_40p_40p_4}S0p_40p_4}S0p_4}S0p_40p_4{0p_4}S0p_4{0p_40p_40p_40p_4{0p_40p_4{0p_40p_40p_4}S0p_40p_4{0p_4{0p_40p_40p_40p_40p_40p_40p_40p_4z0p_40p_40p_40p_40p_4K0p_40p_4{0p_4{0p_4{0p_4{0p_4K0p_4K0p_40p_40p_40p_4K0p_40p_4K0p_40p_4K0p_40p_40p_4K0-]40p_40p_40p_40p_4K0p_40p_40p_40p_40p_4{0p_40p_40p_40p_4K0-]4{0p_40p_4{0p_4{0p_4K0-]40p_4{0p_4K0p_40-]4{0p_4}S0-]4}S0p_4z141:,4}S0-]41:,4}S14z1:,4z14140p_40-]40p_40p_40p_40p_40p_4}S0p_4z0p_4}S0p_40p_4{0p_4z0p_4{0p_4z0p_4}S0p_40p_4}S0p_4}S0p_4z0p_40p_4w0p_40p_4w0p_4z1:,4}S0-]4z0-]4z0-]4}S0-]4z0p_4z0p_4w0p_4z0p_4}S0p_4z0p_4w0-]4}S1:,4}S0p_4z0-]4z1:,4}S0p_4}S0p_4w0p_4z0p_4}S0p_4z0p_4z0p_4z0p_4t0p_4z0p_4z0p_4z0p_4z1:,4w0p_4w0p_4z0p_4rz0p_4w0p_4w0-]4w14w1:,4w1:,4z1:,4t134t14t1:,4t14w134t1:,4w17r4z134rz134z134}S1:,4w0p_4}S0p_4w0p_4w0p_4rz0p_4w0p_4w0p_4t0p_4o=0p_4w0p_4rz0p_4rz0p_4rz0p_4t0p_4w0p_4o=1:,4t0-]4rz0p_4rz0-]4t0p_4t0-]4rz1:,4t0p_4t0-]4rz0-]4t0p_4o=0p_4rz0p_4t14rz0-]4t14lm^17r4t134t1:,4t0-]4o=1:,4rz1:,4rz0p_4t0p_4rz0p_4t0p_4t0p_4o=0p_4t0p_4lm^0p_4o=0p_4rz0p_4t0p_4z0p_4rz0p_4w0p_4z0p_4w0p_4z0p_4w0p_4t0-]4w0p_4t0-]4w0-]4w0p_4w0p_4z0p_4z0p_4t0p_4t0p_4w0p_4o=0p_4o=0p_4lm^0p_4w0p_4i01:,4o=0-]4rz0p_4t0p_4lm^0p_4o=0p_4rz0p_4o=0p_4rz0p_4o=0p_4o=0p_4o=0p_4rz0p_4lm^0p_4rz0p_4rz0p_4rz0p_4o=0p_4rz0p_4o=0p_4rz0p_4rz0p_4t0p_4w0p_4w0p_4}S0p_4rz0p_4z0p_4w0p_4w0p_4w0p_4t0p_4z0p_4w0p_4t0p_40p_4t0p_4z0p_4w0p_4w0p_4t0p_4w0p_4w0p_4z0p_4w0p_4z0p_4w0p_4z0p_4w0p_4z0p_4}S0p_4z0p_4w0p_4}S0p_4}S0p_4}S0p_4}S0p_4z1:,4}S0p_4}S1:,41:,4z141:,4}S0-]4}S0-]41:,4}S1:,4}S141:,4}S0p_4}S0p_40p_4}S0p_4}S0p_40p_4z0p_4}S0p_40p_4}S0p_4z0p_4t0p_4t0p_4t0-]4rz0p_4}S0p_4}S0p_40p_40p_40p_40p_4}S0p_40-]40-]40p_4}S0p_40p_4z0-]4}S0-]40p_4{0p_40p_40p_4}S0p_4{0p_40p_4}S0p_4}S0p_40p_4}S0p_4}S0p_40p_4}S0p_40p_4w0p_4}S0p_40p_4z0p_40p_4z0p_4z0p_4}S0p_4}S0p_4z0p_4z0p_4z0p_4z0p_4{0p_4}S0p_40p_4z0p_4z0p_4K0p_4}S0p_4}S0p_4}S0p_4}S0p_4z1:,4}S0-]4}S0p_4w0-]4}S0-]4z1:,4}S0-]4z0p_4w0p_4z0-]4z1:,4t0p_4w0p_4z0p_4w0p_4}S0p_4w0-]4}S0p_4w0p_4}S0p_40-]40p_40-]4}S0p_40p_40p_4}S0p_4z0p_4w0p_4z0p_4w0p_4z0p_4z0p_4z0p_4}S0p_40p_4{0p_4}S0p_40p_40p_4}S0p_40p_4}S0p_40p_4}S0p_40p_40p_4{0p_40p_4{0p_4K0p_40p_4{0p_40p_4K0p_4}S0p_40p_40p_4}S0p_4}S0p_4z0p_4}S0p_4z0p_4}S0p_4{0p_4{0p_40p_40p_40p_40p_4K0p_40p_4{0p_4{0p_4K0p_4{0p_40p_4{0p_40p_40p_4{0p_4K0p_40p_4{0p_4{0p_4{0p_4{0p_40p_40p_40p_40p_40p_40p_4{0p_4{0p_40-]40p_40p_4K0p_40-]40p_4{0p_4{0p_4K0p_40p_4{0p_40p_40-]40p_40p_4{0p_4}S0p_40p_40p_4{0p_4{0p_4}S0p_4z0p_4w0p_4z0p_4z0p_4z0p_4z0p_4w0p_4w0p_4t0p_4z0p_4z0p_4w0p_4w0p_4z0p_4z0p_4z0p_4t0p_4z0p_4w0p_4t0p_4rz0p_4w0p_4w0p_4rz0p_4t0p_4z0p_4t0p_4t0p_4t0p_4t0p_4t0p_4z0p_4t0p_4w0p_4}S0p_4}S0p_4w0p_4z0p_4z0p_4}S0p_40p_40p_4}S0p_4z0p_40p_4w0p_4z0p_4z0p_4w0p_4}S0p_4z0p_4w0p_4z0p_4w0p_4z0p_4w0p_4z0p_4z0p_4z0p_4z0p_4z0p_4z0p_4w0p_4w0p_4w0p_4w0p_4z0p_4w0p_4t0p_4w0p_4z0p_4z0p_4z0p_4w0p_4t0p_4w0p_4w0p_4t0p_4w0p_40p_4}S0p_4z0p_4z0p_4z0p_4}S0p_4z0p_4z0p_4z0p_4}S0p_4w0-]4z0p_4rz0p_4t0p_4o=0p_4rz0p_4z0p_4z0p_4}S0p_4z0p_4z0p_4w0p_40p_4z0p_4z0p_4w0p_4z0p_4}S0p_4rz0p_4t0p_4w0p_4t0p_4w0p_4rz0p_4rz0p_4t0p_4t0p_4t0p_4rz0p_4w0p_4t0p_4rz0p_4rz0p_4w0p_4rz0p_4}S0p_4z0p_4t0p_4z0p_4z0p_4z0p_4w0p_4}S0p_4w0p_4z0p_4z0p_4z0p_4z0p_4z0p_4w0p_4w0p_4}S0p_4w0p_4w0p_4z0p_4w0p_4t0p_4}S0p_4t0p_4z0p_4w0p_4w0p_4t0p_4rz0p_4w0p_4z0p_4w0p_4t0p_4w0p_4rz0p_4w0p_4w0p_4w0p_4w0p_4t0p_4t0p_4w0p_4z0p_4w0p_4w0p_4w0p_4}S0p_4w0p_4}S0p_4t0p_4z0p_4t0p_4z0p_4z0p_4w0p_4w0p_4z0p_4w0p_4t0p_4z0p_4w0p_4w0p_4t0p_4w0p_4w0p_4w0p_4t0p_4}S0p_4w0p_4}S0p_4z0p_4w0p_4z0p_4t0p_4t0p_4}S0p_4w0p_4w0p_4w0p_4z0p_4w0p_4w0p_4t0p_4w0p_4z0p_4w0p_4z0p_4w0p_4}S0p_4t0p_4z0p_4w0p_4z0p_4w0p_4w0p_4}S0p_4w0p_4t0p_4w0p_4w0p_4rz0p_4w0p_4w0p_4w0p_4w0p_4w0p_4z0p_4z0p_4t0p_4w0p_4}S0p_4o=0p_4o=0p_4t0p_4t0p_4t0p_4t0p_4t0p_4w0p_4t0p_4t0p_4w0p_4t0p_4z0p_4rz0p_4z0p_4rz0p_4t0p_4t0p_4t0p_4z0p_4z0p_4z0p_4z0p_4w0p_4z0p_4z0p_4}S0p_4z0p_4w0p_4w0p_4w0p_4w0p_4rz0p_4rz0p_4lm^0p_4o=0p_4lm^0p_4o=0p_4o=0p_4o=0p_4o=0p_4rz0p_4rz0p_4t0p_4rz0p_4rz0p_4o=0p_4rz0p_4o=0p_4rz0p_4rz0p_4rz0p_4rz0p_4t0p_4rz0p_4t0p_4o=0p_4t0p_4o=0p_4o=0p_4t0p_4rz0p_4rz0p_4rz0p_4t0p_4rz0p_4rz0p_4t0p_4t0p_4rz0p_4w0p_4lm^0p_4w0p_4o=0p_4w0p_4o=0p_4rz0p_4t0p_4rz0p_4t0p_4rz0p_4t0p_4t0p_4rz0p_4w0p_4o=0p_4o=0p_4w0p_4rz0p_4rz0p_4t0p_4w0p_4lm^0p_4t0p_4t0p_4o=0p_4rz0p_4t0p_4rz0p_4t0p_4rz0p_4t0p_4t0p_4o=0p_4t0p_4t0p_4t0p_4rz0p_4rz0p_4t0p_4rz0p_4t0p_4t0p_4t0p_4t0p_4z0p_4z0p_4t0p_4t0p_4w0p_4z0p_4z0p_4w0p_4t0p_4w0p_4w0p_4z0p_4w0p_4z0p_4z0p_4t0p_4w0p_4t0p_4w0p_4t0p_4w0p_4t0p_4t0p_4o=0p_4rz0p_4rz0p_4rz0p_4w0p_4o=0p_4lm^0p_4lm^0p_4c0p_4i00p_4o=0p_4i00p_4i00p_4lm^0p_4i00p_4i00p_4lm^0p_4o=0p_4o=0p_4rz0p_4lm^0p_4lm^0p_4o=0p_4o=0p_4rz0p_4i00p_4i00p_4lm^0p_4a)0p_4fB0p_4lm^0p_4i00p_4a)0p_4^V0p_4c0p_4a)0p_4c0p_4c0p_4c0p_4a)0p_4c0p_4a)0p_4c0p_4a)0p_4c0p_4a)0p_4a)0p_4c0p_4c0p_4c0p_4lm^0p_4c0p_4fB0p_4c0p_4a)0p_4fB0p_4c0p_4i00p_4fB0p_4fB0p_4i00p_4c0p_4i00p_4c0p_4fB0p_4fB0p_4fB0p_4fB0p_4i00p_4fB0p_4fB0p_4c0p_4fB0p_4fB0p_4i00p_4c0p_4fB0p_4fB0p_4c0p_4i00p_4fB0p_4i00p_4fB0p_4a)0p_4a)0p_4fB0p_4c0p_4fB0p_4c0p_4^V0p_4i00p_4a)0-]4c0p_4c0p_4c0p_4c0p_4X0p_4a)0p_4^V0p_4a)0p_4[0p_4[0p_4^V0p_4c0p_4c0p_4fB0p_4c0p_4c0p_4c0p_4fB0p_4c0p_4c0p_4c0p_4fB0p_4c0p_4c0p_4c0p_4fB0p_4fB0p_4c0p_4c0p_4fB0p_4c0p_4fB0p_4fB0p_4c0p_4c0p_4c0p_4a)0p_4fB0p_4c0p_4i00p_4fB0p_4i00p_4c0p_4c0p_4fB0p_4c0p_4c0p_4fB0p_4a)0p_4c0p_4c0p_4fB0p_4fB0p_4a)0p_4i00p_4fB0p_4c0p_4a)0p_4lm^0p_4c0-]4c0p_4c0p_4fB0-]4c1:,4fB0p_4a)0p_4fB0p_4c0-]4fB0p_4c0p_4a)0p_4a)0-]4fB0p_4fB0-]4c0-]4fB0p_4c1:,4c1:,4c1:,4fB0-]4c1:,4c134i014c134fB0-]4fB14fB0p_4c0-]4i014c1:,4fB0-]4c0-]4c1:,4fB0p_4i01:,4lm^1:,4lm^14i01:,4lm^0-]4rz0-]4o=0-]4rz1:,4o=0p_4o=0-]4rz0p_4lm^0-]4rz1:,4lm^1:,4o=0-]4o=0p_4lm^17r4o=14lm^14o=14o=0-]4lm^0p_4lm^0-]4i014o=14o=14i00-]4lm^14o=0p_4i00p_4lm^0p_4rz0p_4o=0p_4o=0p_4lm^0p_4o=0p_4i00p_4lm^0p_4lm^0p_4o=0p_4rz0p_4i00p_4lm^0p_4lm^0p_4o=0p_4lm^0p_4lm^0p_4lm^0p_4i00p_4o=0p_4rz0p_4t0p_4o=0p_4lm^0p_4o=0p_4t0p_4i00p_4lm^0p_4rz0p_4o=0p_4rz0p_4lm^0p_4rz0p_4o=0p_4o=0p_4rz0p_4o=0p_4o=0p_4o=0p_4o=0p_4o=0p_4o=0p_4o=0p_4t0p_4o=0p_4rz0p_4o=0p_4rz0p_4lm^0p_4rz0p_4rz0p_4o=0p_4o=0p_4o=0p_4o=0p_4rz0p_4o=0p_4o=0p_4t0p_4rz0p_4rz0p_4o=0p_4rz0p_4o=0p_4rz0p_4t0p_4o=0p_4rz0p_4rz0p_4o=0p_4rz0p_4rz0p_4rz0p_4t0p_4rz0p_4rz0p_4rz0p_4o=0p_4rz0p_4o=0p_4t0p_4t0p_4rz0p_4rz0p_4t0p_4t0p_4t0-]4w0-]4t0p_4z0p_4rz0p_4rz0p_4w0p_4t0p_4z0p_4w0p_4{0p_4w0p_40p_4t0p_4{0p_40p_4z0p_4w0p_4}S0p_4z0p_4z0p_40p_4w0p_4}S0p_4z0p_4}S0p_4z0p_4}S0p_4z0p_4w0p_4}S0-]4z0-]4z0p_4z0-]4}S0p_4}S1:,4}S1:,40p_4}S0p_40p_4}S0p_4z1:,4{0p_40-]41:,4{140-]4{140-]4{17r417r4{17r417r4{17r4134134142f4{2!'4K17r4{17r414{140-]414K14{14{0-]4z0-]40-]4{0-]40-]4K14{0-]41:,41414{1341341:,4K14K1417r41:,4K14141:,4K0-]414C0p_4C0-]4C0p_40p_4C0-]4Z0p_4Z1:,4C0p_41:,4C0p_4C0-]4K0-]4K0-]4C0p_4K0p_4K0-]4{0p_4K0p_40-]4K0-]4K0p_4{0-]4K0p_41:,40p_4{0p_4K0p_40p_40p_40p_40-]4K0-]4K0p_40p_4K0p_40p_4{0p_40p_4{0p_4K0p_40p_4{0p_40p_4{0p_40p_40p_40p_4K0p_40p_40p_40p_4{0p_4K0p_4K0p_4K0p_4K0p_40p_4{0p_40p_40p_4K0p_40p_4K0p_4K0p_40p_40p_4{0p_40p_40p_40p_40p_40p_4K0p_4K0p_4K0p_4{0-]4{1:,4{0p_4{0p_4{0p_4{0-]41:,4{0p_4{0-]4}S0-]40-]4}S1:,4}S0p_40p_4}S0p_40p_40p_4z0p_4}S0p_4}S0p_4w0p_4z0p_4}S0p_4z0p_4}S0p_40p_4z0p_4z0p_4z0p_4}S0p_4}S0p_4z0p_4z0p_40p_40p_4}S0p_4}S0p_4}S0p_4z0p_4}S0p_4z0p_4}S0p_4}S0p_40p_4}S0p_4}S0p_4}S0p_4{0p_40p_4}S0p_40p_4}S0p_4{0p_4}S0p_40p_4}S0p_40p_40p_4}S0p_40p_4z0p_4z0p_4z0p_4z0p_4}S0p_4w0p_40p_4z0p_4}S0p_40p_4w0p_4}S0p_4}S0p_4z0p_4}S0p_4w0p_4z0p_4}S0p_4t0p_4rz0p_4t0p_4rz0p_4w0p_4t0p_4t0p_4t0p_4t0p_4t0p_4t0p_4z0p_4w0p_4}S0p_4w0p_4w0p_4w0p_4w0p_4w0p_4w0p_4z0p_4w0p_4w0p_4w0p_4w0p_4t0p_4t0p_4}S0p_4t0p_4z0p_4w0p_4}S0p_4z0p_4z0p_4w0p_4t0p_4w0p_4t0p_4rz0p_4t0p_4t0p_4t0p_4w0p_4w0p_4t0p_4rz0p_4w0p_4z0p_4z0p_40p_4z0p_40p_4z0p_4z0p_4}S0p_4z0p_40p_4z0p_4{0p_4w0p_4z0p_40p_4}S0p_4}S0p_4}S0p_4z0p_4}S0p_4z0p_4}S0p_4z0p_4}S0p_4{0p_4}S0p_4z0p_40p_4}S0p_4z0p_4z0p_4}S0p_4}S0p_4}S0p_4}S0p_4}S0p_4}S0p_4z0p_4w0p_4w0p_4t0p_4o=0p_4lm^0p_4t0p_4z0p_4w0p_4z0p_4t0p_4w0p_4w0p_4w0p_4w0p_4t0p_4}S0p_4t0p_4t0p_4}S0p_4t0p_4w0p_4z0p_4t0p_4t0p_4t0p_4rz0p_4w0p_4rz0p_4o=0p_4lm^0p_4o=0p_4i00p_4o=0p_4rz0p_4w0p_4t0p_4rz0p_4o=0p_4o=0p_4rz0p_4rz0p_4rz0p_4t0p_4rz0p_4t0p_4o=0p_4rz0p_4o=0p_4rz0p_4lm^0p_4rz0p_4o=0p_4o=0p_4o=0p_4o=0p_4lm^0p_4lm^0p_4o=0p_4o=0p_4o=0p_4o=0p_4o=0p_4lm^0p_4o=0p_4o=0p_4lm^0p_4o=0p_4lm^0p_4rz0p_4o=0p_4o=0p_4i00p_4lm^0p_4i00p_4i00p_4i00p_4o=0p_4lm^0p_4o=0p_4lm^0p_4rz0p_4t0p_4t0p_4w0p_4t0p_4o=0p_4w0p_4t0p_4t0p_4w0p_4t0p_4t0p_4t0p_4t0p_4t0p_4t0p_4rz0p_4t0p_4o=0p_4o=0p_4rz0p_4rz0p_4rz0p_4o=0p_4o=0p_4rz0p_4lm^0p_4t0p_4o=0p_4rz0p_4o=0p_4rz0p_4o=0p_4o=0p_4lm^0p_4lm^0p_4t0p_4lm^0p_4o=0p_4fB0p_4lm^0p_4lm^0p_4i00p_4lm^0p_4i00p_4i00p_4i00p_4i00p_4i00p_4i00p_4i00p_4i00p_4i00p_4fB0p_4lm^0p_4o=0p_4o=0p_4o=0p_4o=0p_4rz0p_4o=0p_4i00p_4rz0p_4fB0p_4lm^0p_4lm^0p_4i00p_4i00p_4i00p_4i00p_4i00p_4fB0p_4o=0p_4i00p_4lm^0p_4i00p_4fB0p_4fB0p_4fB0p_4fB0p_4fB0p_4i00p_4o=0p_4i00p_4i00p_4fB0p_4lm^0p_4i00p_4lm^0p_4fB0p_4fB0p_4i00p_4lm^0p_4fB0p_4i00p_4c0p_4lm^0p_4fB0p_4i00p_4c0p_4i00p_4lm^0p_4fB0p_4i00p_4i00p_4i00p_4i00p_4lm^0p_4fB0p_4i00p_4i00p_4fB0p_4fB0p_4lm^0p_4i00p_4fB0p_4o=0p_4i00p_4i00p_4fB0p_4i00p_4i00p_4c0p_4lm^0p_4fB0p_4i00-]4c0p_4i00p_4i00p_4c0p_4lm^0p_4i00p_4i00p_4i00p_4fB0p_4i00p_4i00p_4i00p_4fB0p_4i00p_4lm^0p_4c0p_4fB0p_4fB0p_4i00p_4fB0p_4fB0p_4i00p_4fB0p_4fB0p_4fB0p_4fB0p_4lm^0p_4i00p_4o=0p_4i00p_4lm^0p_4lm^0p_4lm^0p_4lm^0p_4i00p_4o=0p_4i00p_4i00p_4lm^0p_4i00p_4i00p_4i00p_4lm^0p_4i00p_4lm^0p_4fB0-]4rz0p_4lm^0-]4o=0p_4rz0p_4lm^0p_4lm^0p_4o=0p_4fB0p_4i00p_4c0p_4i00p_4lm^0p_4i00p_4fB0p_4i00-]4fB1:,4fB0-]4i00-]4lm^0p_4c17r4i014i00-]4i00-]4o=0p_4a)0p_4i00p_4fB0-]4lm^0p_4i00p_4fB0p_4fB0p_4i00p_4o=0p_4z0p_4t0-]4rz0p_4lm^0p_4o=0p_4lm^0p_4o=0p_4i00-]4o=0p_4fB0p_4i00p_4o=0p_4lm^0p_4lm^0p_4i01:,4lm^0-]4rz0p_4lm^1:,4o=0-]4lm^1:,4lm^0p_4c0-]4c0p_4a)0p_4fB0p_4i00p_4c0p_4i00-]4c0-]4fB0p_4i00p_4a)0p_4fB0p_4fB0p_4fB0p_4i01:,4fB0-]4i01:,4o=0-]4o=0-]4o=1:,4lm^0p_4lm^0p_4lm^0p_4o=0p_4o=0p_4lm^0p_4lm^0p_4i00p_4lm^0p_4lm^0p_4rz0p_4lm^0p_4o=0p_4lm^0p_4o=0p_4o=0p_4o=0p_4lm^0p_4o=0p_4lm^0p_4o=0p_4i00p_4t0p_4i00p_4fB0p_4fB0p_4c0p_4c0-]4i00p_4c0p_4fB0p_4c0p_4c0p_4c0p_4c0-]4c0p_4a)0-]4a)0p_4fB0p_4^V0p_4a)0p_4a)0p_4fB0p_4c0-]4c0p_4i00p_4fB0p_4fB0-]4fB14c0-]4fB0p_4a)0p_4fB0p_4fB0p_4c0p_4fB0p_4i00p_4c0p_4fB0p_4a)0p_4fB0p_4i00p_4i00p_4c0p_4a)0p_4a)0-]4a)0p_4^V0p_4a)0p_4c0p_4a)0p_4a)0p_4^V0p_4^V0p_4a)0p_4^V0p_4a)0p_4^V0p_4^V0p_4a)0p_4a)0p_4a)0p_4^V0p_4a)0p_4c0p_4a)0p_4a)0p_4[0p_4c0p_4[0p_4a)0p_4a)0p_4a)0p_4a)0p_4[0p_4a)0p_4c0p_4^V0p_4a)0p_4^V0p_4a)0p_4^V0p_4^V0p_4c0p_4a)0p_4[0p_4^V0p_4^V0p_4a)0p_4^V0p_4^V0p_4^V0p_4^V0p_4X0p_4a)0p_4[0p_4^V0p_4[0p_4a)0p_4^V0p_4^V0p_4[0p_4^V0p_4X0p_4^V0p_4[0p_4a)0p_4X0p_4U0p_4[0p_4^V0p_4X0p_4[0p_4^V0p_4X0p_4[0p_4[0p_4^V0p_4[0p_4X0p_4[0p_4[0p_4^V0p_4[0p_4^V0p_4X0p_4a)0p_4^V0p_4[0p_4a)0p_4[0p_4[0p_4^V0p_4a)0p_4[0p_4^V0p_4^V0p_4^V0p_4^V0p_4^V0p_4[0p_4[0p_4X0p_4^V0p_4U0-]4^V0p_4X0-]4X0p_4U0p_4[0p_4U0p_4[0p_4[0p_4[0p_4[0p_4[0p_4X0p_4[0p_4[0p_4[0p_4X0p_4^V0p_4^V0p_4X0p_4^V0p_4[0p_4a)0p_4[0p_4[0p_4X0p_4[0p_4^V0p_4^V0p_4c0p_4a)0p_4[0p_4^V0p_4a)0p_4^V0p_4a)0p_4^V0p_4a)0p_4^V0p_4X0p_4c0p_4^V0p_4a)0p_4^V0p_4[0p_4a)0p_4^V0p_4[0p_4[0p_4^V0p_4[0p_4a)0p_4^V0p_4^V0p_4a)0p_4X0p_4c0p_4^V0p_4c0p_4[0p_4^V0p_4U0p_4[0p_4^V0p_4[0p_4a)0p_4[0p_4^V0p_4[0p_4[0p_4[0p_4^V0p_4^V0p_4[0p_4PCR0p_4U0p_4U0p_4X0p_4U0p_4U0p_4X0p_4U0p_4U0p_4S0p_4X0p_4S0p_4U0p_4X0p_4[0p_4U0p_4S0p_4U0p_4X0p_4[0p_4[0p_4[0p_4X0p_4[0p_4X0p_4X0p_4X0p_4X0p_4U0p_4U0p_4[0p_4X0p_4U0p_4X0p_4X0p_4X0p_4S0p_4^V0p_4U0p_4U0p_4U0p_4[0p_4X0p_4X0p_4U0p_4X0p_4U0p_4X0p_4U0p_4U0p_4X0p_4[0p_4X0p_4S0p_4U0p_4S0p_4S0p_4Mpd0p_4U0p_4S0p_4PCR0p_4S0p_4U0p_4Mpd0p_4U0p_4PCR0p_4PCR0p_4U0p_4S0p_4S0p_4S0p_4S0p_4X0p_4S0p_4S0p_4U0p_4PCR0p_4U0p_4PCR0p_4S0p_4S0p_4PCR0p_4U0p_4PCR0p_4S0p_4U0p_4S0p_4S0p_4S0p_4^V0p_4S0p_4S0p_4PCR0p_4S0p_4X0p_4U0p_4U0p_4U0p_4U0p_4U0p_4U0p_4U0p_4S0p_4S0p_4PCR0p_4Mpd0p_4PCR0p_4S0p_4U0p_4S0p_4X0p_4U0p_4U0p_4S0p_4S0p_4U0p_4U0p_4X0p_4U0p_4S0p_4U0p_4X0p_4U0p_4U0p_4X0p_4Mpd0p_4PCR0p_4PCR0p_4PCR0p_4PCR0p_4S0p_4S0p_4U0p_4S0p_4S0p_4PCR0p_4Mpd0p_4Mpd0p_4J60p_4J60p_4J60p_4J60p_4J60p_4Mpd0p_4J60p_4G0p_4J60p_4J60p_4J60p_4Mpd0p_4Mpd0p_4G0p_4G0p_4PCR0p_4Mpd0p_4Mpd0p_4G0p_4J60p_4J60p_4Mpd0p_4Mpd0p_4G0p_4Mpd0p_4J60p_4Mpd0p_4D0p_4J60p_4PCR0p_4J60p_4G0p_4J60p_4PCR0p_4Mpd0p_4J60p_4PCR0p_4J61:,4PCR0p_4Mpd0-]4J60-]4PCR0p_4Mpd0-]4PCR0p_4Mpd0p_4Mpd0-]4J60-]4PCR0p_4Mpd0p_4Mpd0p_4Mpd0p_4PCR0p_4PCR0p_4J60p_4J60p_4G0p_4D0p_4D0p_4?\0p_4G0p_4G0p_4G0p_4D0p_4G0p_4D0p_4B,0p_4G0p_4D0p_4B,0p_4B,0p_4D0p_4D0p_4J60p_4Mpd0p_4J60p_4D0p_4?\0p_4J60p_4Mpd0p_4J60p_4G0p_4J60p_4J60p_4J60p_4G0p_4D0p_4B,0p_4D0p_4D0p_4G0p_4?\0p_4G0p_4G0p_4B,0p_4G0p_4?\0p_4D0p_4G0p_4D0p_4G0p_4J60p_4J60p_4G0p_4B,0p_4D0p_4D0p_4G0p_4G0p_4D0p_4G0p_4D0p_4G0p_4G0p_4D0p_4G0p_4B,0p_4J60p_4D0p_4J60p_4D0p_4J60p_4B,0p_4G0p_4G0p_4G0p_4D0p_4G0p_4G0p_4G0p_4D0p_4B,0p_4J60p_4D0p_4D0p_4D0p_4G0p_4J60p_4D0p_4G0p_4G0p_4B,0p_4B,0p_4G0p_4G0p_4B,0p_4D0p_4B,0p_4B,0p_4B,0p_4D0p_4D0p_4G0p_4D0p_4D0p_4D0p_4G0p_4G0p_4B,0p_4G0p_4B,0p_4G0p_4D0p_4B,0p_4D0p_4D0p_4G0p_4D0p_4D0p_4B,0p_4G0p_4G0p_4D0p_4B,0p_4G0p_4G0p_4D0p_4B,0p_4B,0p_4D0p_4G0p_4B,0p_4G0p_4B,0p_4G0p_4?\0p_4B,0p_4B,0p_4?\0-]4?\0-]4B,0-]4?\0p_4?\0p_4G0p_4G0p_4Mpd0p_4J60p_4J60p_4G0p_4G0p_4J60p_4PCR0p_4PCR0p_4PCR0p_4Mpd0p_4PCR0p_4J60p_4U0p_4G0p_4Mpd0p_4J60p_4Mpd0p_4Mpd0p_4J60p_4PCR0p_4Mpd0p_4Mpd0p_4Mpd0p_4PCR0p_4J60p_4J60p_4Mpd0p_4PCR0p_4J60p_4Mpd0p_4PCR0p_4Mpd0p_4Mpd0p_4PCR0p_4PCR0p_4Mpd0p_4Mpd0-]4PCR0p_4Mpd0p_4J60p_4J60p_4Mpd0p_4Mpd0-]4J60-]4J60-]4D1:,4G0-]4Mpd0-]4J61:,4G0-]4J60p_4Mpd0p_4PCR0p_4Mpd0p_4Mpd0p_4S0-]4S0p_4S0p_4S0p_4S0p_4PCR0p_4Mpd1:,4U0p_4S0p_4PCR0p_4Mpd0p_4S0p_4S0p_4Mpd0p_4S0p_4PCR0p_4U0p_4PCR0p_4S0p_4U0p_4X0p_4U0p_4U0p_4S0p_4S0p_4X0p_4U0p_4X0p_4U0p_4U0p_4U0p_4X0p_4[0p_4X0p_4X0p_4^V0p_4[0p_4^V0p_4^V0p_4[0p_4[0p_4a)0p_4U0p_4S0p_4[0p_4S0p_4[0p_4U0p_4X0p_4U0p_4X0p_4X0p_4U0p_4[0p_4U0p_4U0p_4X0p_4X0p_4X0p_4U0p_4U0p_4X0p_4[0-]4U0-]4X1:,4X1:,4U0-]4X1:,4X0p_4U0p_4X0p_4X0p_4S0p_4U0p_4Mpd0p_4X0p_4[0p_4[0p_4X0p_4X0p_4U0p_4[0p_4X0p_4X0p_4[0p_4U0p_4X0p_4X0p_4U0p_4[0p_4X0p_4X0p_4X0p_4X0p_4U0p_4X0p_4U0p_4[0p_4X0p_4U0p_4U0p_4[0p_4X0p_4[0p_4[0p_4^V0p_4U0p_4[0p_4U0p_4X0p_4X0p_4[0p_4X0p_4[0p_4[0p_4U0p_4[0p_4[0p_4^V0p_4U0p_4U0p_4U0p_4U0p_4U0p_4S0p_4U0p_4X0p_4X0p_4X0p_4U0p_4U0p_4[0p_4X0p_4[0p_4X0p_4[0p_4[0p_4X0p_4[0p_4X0p_4X0p_4X0p_4[0p_4U1:,4[0p_4U0p_4a)0p_4U0p_4[0p_4U0p_4^V0p_4X0p_4U0p_4^V0p_4X0p_4X0p_4X0p_4[0p_4U0p_4[0p_4X0p_4^V0p_4U0p_4X0p_4[0p_4X0p_4X0p_4X0p_4X0p_4U0p_4X0p_4X0p_4U0p_4U0p_4[0p_4X0p_4X0p_4X0p_4U0p_4S0-]4U0-]4S0p_4U0p_4X0p_4X0p_4S0p_4S0p_4U0p_4S0p_4X0p_4U0p_4S0p_4U0p_4S0p_4S0p_4U0p_4X0p_4PCR0p_4U0p_4S0p_4PCR0p_4S0p_4U0p_4S0p_4PCR0p_4S0p_4PCR0p_4PCR0p_4PCR0p_4PCR0p_4U0p_4S0p_4PCR0p_4PCR0p_4Mpd0p_4S0p_4Mpd0p_4Mpd0p_4S0p_4Mpd0p_4S0p_4PCR0p_4PCR0p_4PCR0p_4Mpd0p_4Mpd0p_4PCR0p_4U0p_4S0p_4S0p_4U0p_4S0p_4U0p_4PCR0p_4S0p_4U0p_4S0p_4S0p_4S0p_4S0p_4S0p_4U0p_4S0p_4U0p_4S0p_4PCR0p_4U0p_4S0p_4S0p_4S0p_4X0p_4U0p_4X0p_4X0p_4[0p_4S0p_4U0p_4X0p_4U0p_4X0p_4S0p_4X0p_4[0p_4X0p_4[0p_4X0p_4^V0p_4X0p_4^V0p_4X0p_4[0p_4U0p_4X0p_4U0p_4S0p_4[0p_4X0p_4S0p_4U0p_4U0p_4S0p_4U0p_4U0p_4X0p_4PCR0p_4U0p_4X0p_4[0p_4[0p_4[0p_4X0p_4X0p_4[0p_4[0p_4X0p_4[0p_4[0p_4[0p_4[0p_4[0p_4X0p_4[0p_4X0p_4[0p_4X0-]4X0p_4^V0p_4X0p_4^V0p_4[0p_4[0-]4^V0-]4[0p_4a)0p_4[0p_4X0p_4X0p_4[0-]4[0p_4[1:,4X1:,4[1:,4U0-]4[0p_4[1:,4U0p_4^V0p_4[0p_4[0p_4^V0p_4U0p_4X0p_4S0p_4U0p_4U0p_4X0p_4U0p_4X0p_4X0p_4S0p_4U0p_4U0p_4U0p_4S0p_4U0p_4U0p_4S0p_4U0p_4X0p_4S0p_4X0p_4PCR0p_4[0p_4X0p_4c0p_4fB0p_4^V0p_4[0p_4^V0p_4[0p_4a)0p_4[0p_4U0p_4X0p_4[0p_4U0p_4X0-]4U0p_4X0p_4U0p_4S0p_4U0p_4X0p_4[0p_4S0p_4X0p_4X0p_4U0p_4X0p_4X0p_4U0p_4U0p_4X0p_4X0p_4S0p_4U0p_4X0p_4U0p_4U0p_4U0p_4U0p_4X0p_4S0p_4U0p_4U0p_4X0p_4U0p_4U0p_4U0p_4S0-]4X1:,4U0p_4U0p_4X0p_4U0p_4S0p_4S0p_4S0p_4X0p_4U0p_4X0p_4S0p_4U0p_4U0p_4X0p_4S0p_4U0p_4^V0p_4S0p_4^V0p_4[0p_4X0p_4[0p_4[0p_4X0p_4X0p_4X0p_4X0p_4U0p_4X0p_4U0p_4S0p_4U0p_4S0-]4U1:,4X0p_4U0p_4U0p_4S0p_4PCR0p_4G0p_4PCR0p_4J60p_4Mpd0p_4U0p_4S0p_4X0p_4PCR0p_4U0p_4U0p_4S0p_4S0p_4U0p_4PCR0p_4X0p_4S0p_4U0p_4S0-]4S1:,4S0p_4U0p_4PCR0-]4Mpd0p_4J61:,4Mpd0-]4J60p_4Mpd1:,4Mpd1:,4PCR0p_4S0p_4U0p_4X0p_4S0p_4S0p_4S0p_4S0p_4U0p_4U0p_4S0p_4X0p_4X0p_4S0p_4U0p_4X0p_4U0p_4X0p_4S0p_4X0p_4S0p_4X0p_4U0p_4Mpd0p_4Mpd0p_4PCR0p_4PCR0p_4U0p_4S0p_4S0p_4U0p_4X0p_4X0p_4S0p_4U0p_4S0p_4U0p_4U0p_4U0p_4U0p_4X0p_4U0p_4S0p_4X0p_4PCR0p_4U0p_4U0p_4S0p_4U0p_4U0p_4PCR0p_4^V0p_4S0p_4U0p_4U0p_4PCR0p_4U0p_4U0p_4PCR0p_4U0p_4U0p_4X0p_4[0p_4U0p_4X0p_4S0p_4U0p_4U0p_4U0p_4S0p_4S0p_4U0p_4X0p_4U0p_4U0p_4PCR0p_4PCR0p_4S0p_4Mpd0p_4X0p_4U0p_4U0p_4X0p_4S0p_4X0p_4[0p_4X0p_4X0p_4[0p_4X0p_4U0p_4X0p_4U0p_4^V0p_4U0p_4U0p_4U0p_4U0p_4U0p_4S0p_4X0p_4U0p_4U0p_4U0p_4U0p_4U0p_4U0p_4S0p_4U0p_4U0p_4U0p_4S0p_4U0p_4PCR0p_4PCR0p_4S0p_4S0p_4S0p_4PCR0p_4S0p_4PCR0p_4S0p_4PCR0p_4PCR0p_4Mpd0p_4PCR0p_4J60p_4S0p_4Mpd0p_4S0p_4PCR0p_4PCR0p_4Mpd0p_4Mpd0p_4S0p_4D0-]4S0p_4Mpd0p_4PCR0p_4Mpd0p_4Mpd0p_4PCR0p_4PCR0p_4PCR0p_4Mpd0p_4PCR0p_4PCR0p_4Mpd0p_4PCR0p_4PCR0p_4Mpd0p_4PCR0p_4Mpd0p_4PCR0p_4PCR0p_4PCR0p_4S0p_4J60p_4Mpd0p_4S0p_4Mpd0p_4J61:,4Mpd0-]4Mpd0-]4PCR0-]4PCR0p_4Mpd0-]4PCR0p_4S0p_4J60-]4J60p_4PCR0p_4PCR0p_4S0p_4U0p_4U0p_4PCR0p_4U0p_4U0p_4X0-]4S1:,4S0p_4X0p_4S1:,4S0p_4X0p_4U0p_4S0p_4S0p_4PCR0-]4Mpd0-]4S0-]4PCR0p_4PCR0p_4S0p_4PCR0p_4Mpd0p_4Mpd0p_4S0p_4Mpd0p_4S0p_4Mpd0p_4Mpd0p_4Mpd0p_4PCR0p_4Mpd0p_4S0p_4S0p_4PCR0p_4PCR0p_4PCR0p_4S0p_4X0p_4S0p_4S0p_4X0p_4X0p_4X0p_4X0p_4U0p_4X0-]4X0p_4[0p_4X0p_4X0p_4U0p_4X0p_4[0p_4[0p_4[0p_4X0p_4[0p_4X0p_4U0p_4U0p_4X0p_4PCR0p_4U0p_4U0p_4S0p_4PCR1:,4U0p_4X0p_4PCR0p_4X0p_4S0p_4X0p_4X0p_4S0p_4U0p_4[0p_4S0p_4S0p_4U0p_4U0p_4U0p_4U0p_4U0p_4X0p_4X0p_4X0p_4S0p_4U0p_4U0p_4U0p_4X0p_4S0p_4U0p_4U0p_4S0p_4S0p_4U0p_4U0p_4U0p_4PCR0p_4U0p_4U0p_4U0p_4S0p_4U0p_4S0p_4U0p_4X0p_4[0p_4X0p_4X0p_4X0p_4U0p_4^V0p_4X0p_4U0p_4S0p_4S0p_4X0p_4S0p_4U0p_4U0p_4X0p_4X0p_4X0p_4X0p_4X0p_4X0p_4X0p_4X0p_4X0p_4X0p_4U0p_4X0p_4U0p_4X0p_4X0p_4U0p_4X0p_4X0p_4X0p_4X0p_4X0p_4X0p_4X0p_4[0p_4[0p_4X0p_4[0p_4[0p_4[0p_4^V0p_4a)0p_4[0p_4a)0p_4X0p_4^V0p_4[0p_4^V0-]4c0p_4i00p_4fB0p_4fB0p_4lm^0p_4lm^0p_4i00p_4lm^0p_4lm^0p_4t0p_4lm^0-]4t0p_4t0p_4lm^0p_4w0p_4t0p_4w0p_4t0p_4t0p_4t0p_4t0p_4z0p_4w0p_4t0p_4w0p_4w0p_4w0p_4z0p_4t0p_4z0p_4z0p_4t0p_4t0p_4w0p_4rz0p_4w0p_4w0p_4t0p_4z0p_4t0p_4z0p_4t0p_4z0p_4z0p_40p_4z0p_4t0p_4rz0p_4rz0p_4w0p_4rz0p_4rz0p_4t0p_4rz0p_4t0p_4o=0p_4t0p_4o=0p_4t0p_4rz0p_4rz0p_4t0p_4i00p_4o=0p_4lm^0p_4i00p_4lm^0p_4fB0p_4lm^0p_4i00p_4o=0p_4i00p_4i00p_4lm^0p_4o=0p_4i00p_4lm^0p_4lm^0p_4lm^0p_4i00p_4o=0p_4i00p_4o=0p_4i00p_4i00p_4lm^0p_4lm^0p_4lm^0p_4i00p_4lm^0p_4i00p_4o=0p_4i00p_4lm^0p_4i00p_4i00p_4lm^0p_4i00p_4lm^0p_4lm^0p_4i00p_4rz0p_4lm^0p_4fB0p_4o=0p_4fB0p_4fB0p_4lm^0p_4i00p_4lm^0p_4lm^0p_4o=0p_4i00p_4i00p_4o=0p_4o=0p_4o=0p_4lm^0p_4o=0p_4o=0p_4o=0p_4lm^0p_4rz0p_4o=0p_4lm^0p_4o=0p_4o=0p_4o=0p_4o=0p_4lm^0p_4lm^0p_4o=0p_4lm^0p_4i00p_4lm^0p_4lm^0p_4i00p_4lm^0p_4fB0p_4lm^0p_4a)0p_4c0p_4fB0p_4a)0p_4fB0p_4c0p_4c0p_4fB0p_4fB0p_4c0p_4a)0p_4c0p_4a)0p_4c0p_4fB0p_4a)0p_4fB0p_4a)0p_4c0p_4fB0p_4[0p_4fB0p_4[0p_4fB0p_4a)0p_4a)0p_4c0p_4a)0p_4a)0p_4^V0p_4a)0p_4[0p_4a)0p_4a)0p_4a)0p_4^V0p_4a)0p_4[0p_4[0p_4a)0p_4X0p_4U0p_4S0p_4X0p_4^V0p_4[0p_4a)0p_4a)0p_4[0p_4^V0p_4^V0p_4[0p_4[0p_4^V0p_4^V0p_4X0p_4[0p_4X0p_4[0p_4^V0p_4^V0p_4[0p_4X0p_4[0p_4X0p_4X0p_4[0p_4X0p_4^V0p_4[0p_4[0p_4a)0p_4U0p_4[0p_4[0p_4[0p_4X0p_4[0p_4[0p_4U0p_4[0p_4X0p_4[0p_4U0p_4[0p_4U0p_4X0p_4S0p_4U0p_4U0p_4X0p_4U0p_4S0p_4U0p_4PCR0p_4S0p_4S0p_4U0p_4[0p_4Mpd0p_4X0p_4S0p_4X0p_4X0p_4U0p_4U0p_4U0p_4X0p_4U0p_4S0p_4U0p_4S0p_4U0p_4U0p_4U0p_4U0p_4U0p_4U0p_4[0p_4X0p_4S0p_4X0p_4[0p_4X0p_4U0p_4[0p_4U0p_4U0-]4^V0p_4X0p_4[0p_4[0p_4X0-]4X0p_4X0p_4[1:,4X1:,4X0p_4X0p_4X0p_4U0p_4X0p_4X0p_4U0p_4U0p_4S0p_4U0p_4X0p_4U0p_4X0p_4U0p_4X0p_4X0p_4U0p_4X0p_4U0p_4X0p_4PCR0-]4X0p_4X0p_4U0p_4X0p_4U0p_4[0p_4U0p_4[0p_4X0p_4U0p_4X0p_4U0p_4U0p_4S0p_4U0p_4U0p_4U0p_4S0p_4X0p_4X0p_4X0p_4S0p_4X0p_4PCR0p_4PCR0p_4U0p_4U0p_4S0p_4S0p_4PCR0p_4S0p_4PCR0-]4S0p_4U0p_4U0p_4U0p_4U0p_4U0p_4U0p_4S0p_4[0p_4U0p_4X0p_4S0p_4X0p_4PCR0p_4X0p_4U0p_4X0p_4S0p_4U0p_4X0p_4U0p_4U0p_4S0p_4S0p_4U0p_4PCR0p_4S0p_4U0-]4U0-]4S1:,4U0-]4S0p_4U0p_4PCR0p_4U0p_4PCR0p_4Mpd0p_4PCR0p_4PCR0p_4PCR0p_4PCR0p_4PCR0p_4Mpd0p_4Mpd0p_4J60p_4J60p_4PCR0p_4J60p_4Mpd0p_4S0p_4X0p_4Mpd0p_4[0p_4U0p_4S0p_4Mpd0p_4S0p_4S0p_4J60p_4PCR0p_4S0p_4PCR0p_4Mpd0p_4S0p_4S0p_4Mpd0p_4S0p_4PCR0p_4Mpd0p_4Mpd0p_4S0p_4PCR0p_4Mpd0p_4PCR0p_4PCR0p_4PCR0p_4Mpd0p_4PCR0p_4PCR0p_4PCR0p_4Mpd0p_4PCR0p_4Mpd0p_4PCR0p_4Mpd0p_4Mpd0p_4PCR0p_4PCR0p_4J60p_4PCR0p_4Mpd0p_4S0p_4Mpd0p_4PCR0p_4Mpd0p_4PCR0p_4PCR0p_4Mpd0p_4PCR0p_4PCR0p_4Mpd0p_4S0p_4J60p_4Mpd0p_4S0p_4PCR0p_4J60p_4PCR0p_4J60p_4PCR0p_4Mpd0p_4PCR0p_4Mpd0p_4PCR0p_4Mpd0p_4J60p_4PCR0p_4Mpd0p_4PCR0p_4Mpd0-]4S0p_4J60p_4PCR0p_4Mpd0p_4Mpd0p_4Mpd0p_4PCR1:,4PCR0p_4Mpd14Mpd0p_4Mpd0p_4J60p_4Mpd0p_4PCR0p_4Mpd0-]4PCR0p_4Mpd0p_4PCR1:,4PCR0-]4S0p_4J60p_4PCR0p_4PCR0p_4PCR0p_4Mpd0p_4PCR0p_4Mpd0p_4Mpd0p_4PCR0p_4Mpd0p_4PCR0p_4PCR0p_4Mpd0p_4PCR0p_4S0p_4PCR0p_4PCR0p_4U0p_4PCR0p_4Mpd0p_4PCR0p_4S0p_4PCR0p_4PCR0p_4U0p_4Mpd0p_4S0p_4S0p_4PCR0p_4S0p_4U0p_4S0p_4Mpd0p_4PCR0p_4Mpd0p_4Mpd0p_4Mpd0p_4Mpd0p_4Mpd0p_4PCR0p_4Mpd0p_4S0p_4PCR0p_4PCR0p_4Mpd0p_4Mpd0p_4Mpd0p_4PCR0p_4PCR0p_4J60p_4PCR0p_4Mpd0p_4PCR0p_4PCR0p_4PCR0p_4J60p_4PCR0p_4PCR0p_4PCR0p_4J60p_4PCR0p_4G0p_4G0p_4G0p_4J60p_4D0p_4Mpd0p_4D0p_4J60p_4J60p_4G0p_4J60p_4Mpd0p_4G0p_4G0p_4D0p_4J60p_4J60p_4G0p_4J60p_4G0p_4G0p_4J60p_4Mpd0p_4G0p_4G0p_4J60p_4G0p_4J60p_4G0p_4D0p_4J60p_4D0p_4G0p_4D0p_4J60p_4G0p_4G0p_4J60p_4G0p_4J60p_4G0p_4D0p_4J60p_4D0p_4G0p_4J60p_4D0p_4Mpd0p_4D0p_4G0p_4G0p_4G0p_4G0p_4G0p_4J60p_4J60p_4G0p_4D0p_4J60p_4J60p_4D0p_4J60p_4G0p_4J60p_4G0p_4G0p_4G0p_4D0p_4D0p_4B,0p_4D0p_4G0p_4D0p_4D0p_4G0p_4G0p_4G0p_4D0p_4G0p_4B,0p_4D0p_4D0p_4G0p_4J60p_4G0p_4G0p_4D0p_4D0p_4J60p_4D0p_4J60-]4D0p_4J60p_4G0p_4G0p_4G0p_4D0-]4G0p_4Mpd0-]4S0p_4PCR0p_4S0p_4S0p_4PCR0p_4PCR0p_4PCR0p_4S0p_4PCR0p_4PCR0p_4S0p_4PCR0p_4Mpd0p_4PCR0p_4S0p_4S0p_4Mpd0p_4U0p_4Mpd0p_4S0p_4Mpd0p_4S0p_4S0p_4Mpd0p_4PCR0p_4PCR0p_4S0p_4Mpd0p_4PCR0p_4S0p_4S0p_4U0p_4U0p_4S0p_4PCR0p_4X0p_4PCR0p_4S0p_4PCR0p_4S0p_4U0p_4S0p_4S0p_4PCR0p_4U0p_4U0p_4U0p_4PCR0p_4S0p_4U0p_4S0p_4U0p_4U0p_4U0p_4PCR0p_4U0p_4U0p_4X0p_4S0p_4X0p_4U0p_4U0p_4X0p_4S0p_4S0p_4S0p_4[0p_4S0p_4U0p_4U0p_4U0p_4S0p_4[0p_4S0p_4U0p_4X0p_4U0p_4U0p_4[0p_4X0p_4U0p_4X0p_4U0p_4[0p_4X0p_4X0p_4U0p_4U0p_4a)0p_4^V0p_4[0p_4^V0p_4^V0p_4a)0p_4[0p_4^V0p_4^V0p_4U0p_4a)0p_4^V0p_4a)0p_4^V0p_4a)0p_4a)0p_4^V0p_4a)0p_4^V0p_4a)0p_4c0p_4a)0p_4a)0p_4c0p_4c0p_4c0p_4fB0p_4a)0p_4a)0p_4c0p_4fB0p_4a)0p_4a)0p_4c0p_4c0p_4c0p_4^V0p_4^V0p_4a)0p_4a)0p_4a)0p_4^V0p_4a)0p_4^V0p_4X0p_4[0p_4a)0p_4a)0p_4a)0p_4c0p_4a)0p_4fB0p_4^V0p_4a)0p_4a)0p_4c0p_4a)0p_4a)0p_4^V0p_4c0p_4c0p_4^V0p_4c0p_4fB0p_4^V0p_4fB0p_4a)0p_4c0p_4fB0p_4fB0p_4c0p_4fB0p_4c0p_4fB0p_4fB0p_4fB0p_4c0p_4i00p_4fB0p_4c0p_4i00p_4fB0p_4fB0p_4fB0p_4fB0p_4fB0p_4i00p_4lm^0p_4fB0p_4lm^0p_4lm^0p_4fB0p_4lm^0p_4lm^0p_4lm^0p_4rz0p_4o=0p_4rz0p_4w0p_4rz0p_4w0p_4t0p_4t0p_4rz0p_4t0p_4z0p_4t0p_4z0p_4w0p_4w0p_4w0p_4w0p_4z0p_4t0p_4}S0p_4}S0p_4z0p_4}S0p_4z0p_4t0p_4t0p_4}S0p_4z0p_4z0p_4{0p_4}S0p_4z0p_40p_4{0p_4z0p_40p_4{0p_40p_40p_4{0p_4}S0p_4}S0p_40p_40p_4{0p_40p_4{0p_4K0p_40p_40p_40p_40p_4K0p_40p_40p_40p_40p_40p_4{0p_4K0p_4K0p_40p_4K0p_40p_40p_4Z0p_4C0p_4K0p_40p_40p_4C0p_4Z0p_4C0p_4C0p_4C0p_4C0p_4Z0p_40p_4Z0p_4Z0p_4Z0p_4q0p_4C0p_4C0p_4q0p_4C0p_4V0p_4C0p_4Z0p_4C0p_4q0p_4q0p_4V0p_4C0p_4q0p_40p_4q0p_4q0p_4Z0p_4q0p_4q0p_4V0p_4q0p_4q0p_4Z0p_4V0p_4q0p_4q0p_40p_4V0p_4q0p_4q0p_40p_4V0p_4q0p_40p_4V0p_4q0p_4V0p_4q0-]4q0p_40p_4q0p_4V0p_4V0p_4q0p_4V0p_40p_40p_4q0p_4V0p_40p_40p_4V0p_4'0p_40p_40p_40p_40p_40p_4'0p_4V141:,4'0-]4'0p_4'0p_4'0p_41:,41:,4140-]4'1:,414'13417r4134`1:,4134'134`14`14`17r4`1:,421:,4`1:,4213414`1:,4`1:,421:,4`1:,4`1:,421:,42I14`1:,420-]4`0p_420p_420p_420p_420p_42I0p_42I0p_42I0p_42I0p_42I0p_42I0p_4`0p_4`0p_4`0p_42I0p_4`0p_420p_4`0p_4k0p_4`0p_4`0p_42I0p_40p_4`0p_40p_4`0p_4k0p_40p_40p_40p_40p_40p_4k0p_40p_40p_40p_40p_4=|0p_4k0p_4k0p_4k0-]4k0p_40p_4=|0p_4=|0-]4k1:,41:,4=|1:,40-]4141:,40-]41:,4k0-]4k1:,41:,40-]4k1:,41:,4k1:,4k14k140-]41:,4=|1:,4=|1:,4=|0p_4=|1:,414 0-]4=|1:,4 0p_41:,414134 134 141417r4134 17r4w!13417r4w!14w!17r4w!14 134w!134w!13481414w!0-]4w!17r41:,4w!14w!134 141:,481481:,4817r481:,481348148134w!148134814817r4w!17r4 14GO17r48134814w!17r4GO134GO134GO17r4134GO13414GO17r4GO134GO17r4GO1:,4134GO17r4134134GO1417r417r4GO134GO17r4814GO134134817r417r4GO14GO134GO134GO17r4814GO17r4GO134GO14GO17r4GO17r4GO17r4GO14134GO13413414134134GO13417r413417r413414GO1:,41:,40-]40-]41:,41:,4141:,41:,4141:,40-]41:,42!'4134134k2f4R14R1:,40-]4R1341:,41:,4k0-]4k1:,40-]40-]413413417r4R14k134k134134k13417r4k141:,4k1341341:,41:,41:,40p_4R1:,4k0-]4R0-]4k1:,4R0-]41:,4R14R0-]4R1:,4R14R1:,4R13414141414k14R14R1:,4k1414R1:,4R1:,4R0p_41:,4R0-]4k134R14"141:,41:,4k1:,414R1:,4R134R134k134"134k141:,4k14k14R0-]41:,4R0p_41:,4R0-]4134R1:,40-]4R0-]4k14R13414k17r4k14R0p_4R0-]4k1:,4R1:,41:,4"1:,4R0-]4k1:,4R1:,4R0-]4k0-]41:,40-]4R1:,4R0-]4k0-]40-]4R1:,4k0-]4R14R0p_4R1:,4R1:,41:,41:,40-]4k0p_4R14R1:,4R0-]4k14R1:,4k14k1:,4R0-]40-]4k14R0-]4k0-]41:,40-]40-]4k141:,40-]41:,4k0-]4k1:,4R0p_4k141:,4R0-]40-]4k0-]40p_40-]40-]40-]40-]40-]41:,40p_4GO0-]40-]41:,40-]41:,40-]40-]40p_4GO0-]40p_40p_4R0-]4R1:,40p_4k0p_41:,4k0p_40p_41:,40p_40p_40p_480-]40p_40p_4GO1:,4GO0-]4GO0-]4814GO0p_4GO0p_4GO0-]40p_40-]40-]40-]41:,4GO0-]4GO1:,4GO0p_41:,4w!0-]40p_4w!0-]4GO0p_4GO0-]481:,480-]480-]4GO1:,480-]41:,4w!0-]480-]4w!0p_40p_480p_4GO0p_4w!0p_480p_480p_480p_4 0p_40-]40p_4GO0p_4GO0-]4GO0p_40p_4GO0p_480p_40p_40p_480p_4GO0p_4GO0p_40p_4w!0p_480p_480p_4GO0p_480p_4w!0p_4w!0p_4 0p_4 0p_4w!0p_4 0p_4w!0p_40p_4 0-]4 0-]480p_480-]4w!0-]4 0-]4GO0p_480p_4 0p_480p_480p_4w!0p_40p_4w!0p_4w!0p_4w!0p_4 0p_40p_4 0p_4w!0p_4 0p_4w!0p_40-]4w!0p_40-]480p_4=|0p_4 0p_4w!0p_4 0p_4w!0p_40p_40p_4 0p_40p_4 0p_40p_40p_4w!0p_4 0p_4=|0p_4 0p_4 0-]4w!0p_4 0-]41414 17r4134w!14 17r4=|14134=|134=|1:,41:,4 1:,4=|0-]4 1:,4=|0-]41:,4=|1:,4=|0-]40-]40-]40p_4k1:,40-]4=|1:,4=|0-]414=|1:,40p_4=|1:,41:,40-]4w!0-]40p_40p_4 0p_4 0p_4w!0p_4 0p_40p_4 0p_4=|0p_40-]40p_4=|0p_40p_4k0p_4=|0p_40p_4=|0p_4=|0p_40p_40p_40p_4=|0p_4k0p_40p_4k0p_4=|0p_40p_4=|1:,4=|1:,4k0p_4k0-]41414k14 14=|1:,41:,4k1414=|0-]4=|0-]41:,41:,40-]4=|0-]4k0p_4=|1:,4k0-]40-]41:,41414k140p_4k0p_4`0p_4`0-]4`0p_40p_4k0p_40-]40p_40-]4k0p_4k0-]4k0p_40-]4`0-]4k14`0p_41:,41:,4k141:,4k0-]40p_40-]40p_4k0p_40p_4`0p_4k0p_40p_4k0p_4k0p_40p_40p_4k0p_40p_4k0p_4=|0p_40p_4k0p_40p_4k0p_40p_4`0p_40p_4k0p_40p_40p_40p_4`0p_4k0p_4k0p_4`0p_4k0p_4`0p_40p_40p_4`0p_40p_4`0p_4`0p_4k0p_4`0p_4`0p_42I0p_4`0p_420p_42I0p_420p_420p_4`0p_4`0p_420p_42I0p_4`0p_420p_420p_420p_42I0p_420p_42I0p_42I0p_42I0p_42I0p_42I0-]420p_42I0p_420-]420p_420-]4`1:,421421:,4`1341:,40-]4`0p_4'0-]40p_4`1:,40-]4`0-]40p_40p_4'0p_40p_40p_40p_40p_4`0p_4`0p_40p_40p_40p_40p_4`0p_4`0p_420p_4`0p_42I0p_4`0p_4`0p_420p_40p_420p_40p_4`0p_4`0p_420p_420p_40p_4'0p_4'0p_40p_4'0p_40p_40p_4'0p_40p_40p_40p_40p_41:,41:,4'0-]4'1:,41:,40-]4V0p_4'0p_4'0p_40p_40p_4'0p_40p_4'0p_40p_4'0p_4'0p_40p_40p_40p_40-]4'0-]4V0p_4V0p_4'0p_40p_40p_4'0p_4'0p_4V0p_4'0p_4'0p_40p_40p_40-]40p_4V0p_4V0-]4q0p_4'0p_4q0-]4V0p_4q0p_4V0-]40p_4Z0p_4V0p_4V0-]4V0-]4V1:,40-]40-]41:,4V141:,414'0-]4V0-]40p_40p_40p_4'0p_4'0p_40p_40p_4'0p_40p_40p_4V1:,40p_4'0-]40p_4'0p_40p_40p_40-]40p_40p_4'0p_4'0p_40p_4'0p_40p_40p_40p_40p_4q0p_4V0p_4q0p_4V0p_4V0p_4q0p_40p_40p_4V0p_4V0p_4q0p_4Z0p_40p_4q0p_40p_4q0p_4q0p_4V0p_4q0p_4V0p_4V0p_4q0p_4q0-]4q0p_40p_4V0p_4Z0p_4q0p_4V0p_4V0p_4Z0p_40p_4Z0p_4q0p_4q0p_4V0p_4V0p_4q0p_4q0p_4q0p_4V0p_4C0p_40p_4C0p_4q0p_4q0p_4q0p_4V0p_4q0p_4q0p_4Z0p_4Z0p_4Z0p_40p_40p_4Z0p_4Z0p_4q0p_4Z0p_4Z0p_4q0p_4q0p_4Z0p_4Z0p_4q0p_4Z0p_4Z0p_4Z0p_4Z0p_4C0p_4V0p_4C0p_4Z0p_4Z0p_4C0p_4Z0p_4C0p_4Z0p_4Z0p_4Z0p_4q0p_4q0p_4Z0p_40p_4q0p_4Z0p_4Z0p_4Z0p_4C0p_4Z0p_4Z0p_4C0p_4Z0p_40p_4C0p_40p_4C0p_40p_40p_4q0p_4C0p_40p_4C0p_4C0p_40p_4q0p_4K0p_40p_40p_40p_4C0p_4C0p_4K0p_4C0p_40p_4C0p_4Z0p_4K0p_4C0p_4C0p_4K0p_4C0p_4C0p_4K0p_4C0p_4K0p_4K0p_40p_4C0p_4C0p_4q0p_4V0p_4C0p_4C0p_4Z0p_4Z0p_4Z0p_4q0p_4K0p_4{0p_4Z0p_4Z0p_40p_40p_4K0p_4C0p_4C0p_40p_4q0p_40p_4C0p_4C0p_4C0p_4C0p_4K0p_4C0p_40p_4Z0p_40p_40p_40p_4C0p_40p_40p_40p_4C0p_40p_4Z0p_4K0p_4K0p_40p_4K0p_4Z0p_40p_4K0p_4K0p_40p_40p_40p_4{0p_4{0p_40p_4{0p_4{0p_4K0p_4}S0p_40p_40p_4{0p_4{0p_4{0p_4{0p_4{0p_40p_40p_4{0p_40p_40p_40p_4{1:,4{0p_40p_41:,40p_40p_4{140-]41:,40p_4}S0p_40-]4}S0p_4z0p_4{0p_4}S0p_40p_40p_4z1:,40-]4{0p_4z0-]40-]4}S0-]4}S140-]4}S14}S1:,40p_4}S0p_4}S0p_4z0p_40p_4}S0p_40p_4}S0p_4{0p_4z0-]4}S0p_4z0p_40p_4z0p_4K0p_40p_4z0-]4}S0-]4}S0-]4}S1:,4z1:,40p_4}S0p_4{0p_40p_40p_40p_4{0p_4}S0p_40p_4}S0p_40p_4}S0p_4{0p_40p_40p_4{0p_4}S0p_4}S0p_40p_4{0p_40p_40p_40p_4{0p_4}S0p_40p_4{0p_40p_4{0p_4{0p_4K0p_4{0p_40p_4{0p_4{0p_40p_40p_4{0p_4}S0p_40p_4{0p_40p_4}S0p_40p_40p_4z0p_4z0p_4}S0p_4}S0p_4z0p_4}S0p_4}S0p_4}S0p_4}S0p_4w0p_4{0p_4z0p_40p_4z0p_4w0p_40p_4w0p_4z0p_4z0p_40p_4w0p_40p_4w0p_4w0p_4z0p_4z0p_4{0p_4}S0p_4}S0p_4}S0p_40p_4z0p_4}S0p_40p_40p_4}S0p_40p_4}S0p_40p_40p_4}S0p_40p_4}S0p_4w0p_4z0p_4z0p_4z0p_4}S0p_4w0p_4}S0p_4}S0p_4w0p_4}S0p_4w0p_4z0p_4t0p_4z0p_4t0p_4rz0p_4rz0p_4w0p_4rz0p_4z0p_4w0p_4t0p_4rz0p_4w0p_4t0p_4t0p_4t0p_4w0p_4w0p_4rz0p_4w0p_4rz0p_4z0p_4rz0p_4w0p_4t0p_4t0p_4t0p_4t0p_4t0p_4z0p_4t0p_4rz0p_4w0p_4w0p_4rz0p_4z0p_4t0p_4t0p_4rz0p_4w0p_4t0p_4t0p_4w0p_4w0p_4z0p_4t0p_4w0p_4rz0p_4w0p_4t0p_4t0p_4t0p_4w0p_4rz0p_4z0p_4w0p_4t0p_4w0p_4w0-]4w0p_4w0p_4w0-]4w0-]4w0-]4w1:,4z1:,4z1:,4t1:,4t14w0-]4w1:,4w0p_4t0-]4z0p_4z0p_4z0p_4t0p_4z0p_4z0p_4w0p_4z0p_4z0p_4z0p_4}S0p_40p_40p_4}S0p_4}S0p_4}S0p_4z0p_40p_40p_40p_40p_4}S0p_40p_40p_40p_4}S0-]40p_4{0-]4{0p_4{0-]40p_40-]40p_40p_40-]40p_4{0p_40p_4z0-]40p_4{0p_4}S0p_41:,40p_4{0p_40-]40p_4{0p_40-]4{0-]4}S1:,4{0-]4z14}S0-]4}S0-]4{1:,4}S1:,40p_4}S0p_4z0p_4z0-]40-]40p_40p_4}S0p_4w0-]4}S0-]40p_4z1:,4{0p_4}S0p_4}S0p_40p_4}S0p_4}S0p_4z0p_4}S1:,4}S0p_4z0-]4}S0p_40p_40-]4w0-]4}S1:,4}S0p_4z0-]4}S0p_40p_4}S0p_4z0p_40p_4z0p_40p_4}S0p_4}S0p_4t0p_4z0p_4w0p_4w0p_4w0p_4w0p_4t0p_4rz0p_4w0p_4w0p_4w0p_4w0p_4w0p_4w0p_4z0p_4w0p_4t0p_4z0p_4rz0p_4w0p_4t0p_4w0p_4z0p_4rz0p_4lm^0p_4t0p_4rz0p_4t0p_4t0p_4w0p_4rz0p_4t0p_4t0p_4w0p_4t0p_4t0p_4w0p_4t0p_4w0p_4t0p_4t0p_4rz0p_4w0p_4rz0p_4w0p_4t0p_4t0p_4t0p_4t0p_4w0p_4rz0p_4o=0p_4t0p_4rz0p_4w0p_4t0p_4t0p_4rz0p_4rz0p_4rz0p_4t0p_4rz0p_4rz0p_4rz0p_4w0p_4rz0p_4rz0p_4o=0p_4rz0p_4o=0p_4o=0p_4rz0p_4o=0p_4rz0p_4o=0p_4o=0p_4o=0p_4rz0p_4o=0p_4o=0p_4t0p_4t0p_4rz0p_4i00p_4lm^0p_4o=0p_4rz0p_4o=0p_4t0p_4o=0p_4t0p_4i00p_4o=0p_4o=0p_4o=0p_4rz0p_4o=0p_4o=0p_4rz0p_4rz0p_4o=0p_4rz0p_4o=0p_4rz0p_4rz0p_4o=0p_4rz0p_4o=0p_4lm^0p_4rz0p_4lm^0p_4o=0p_4lm^0p_4t0p_4t0p_4w0p_4lm^0p_4t0p_4o=0p_4lm^0p_4o=0p_4lm^0p_4rz0p_4o=0p_4lm^0p_4o=0p_4o=0p_4lm^0p_4rz0p_4i00p_4o=0p_4rz0p_4o=0p_4lm^0p_4o=0p_4rz0p_4t0p_4i00p_4o=0p_4fB0p_4lm^0p_4lm^0p_4o=0p_4i00p_4o=0p_4i00p_4rz0p_4fB0p_4lm^0p_4o=0p_4i00p_4lm^0p_4i00p_4i00p_4lm^0p_4i00p_4i00p_4i00p_4i00p_4fB0p_4i00p_4i00p_4i00p_4fB0p_4fB0p_4i00p_4i00p_4i00p_4i00p_4i00p_4lm^0p_4lm^0p_4o=0p_4i00p_4i00p_4i00p_4lm^0p_4fB0p_4fB0p_4i00p_4fB0p_4lm^0p_4fB0p_4lm^0p_4lm^0p_4fB0p_4i00p_4i00p_4c0p_4lm^0p_4i00p_4c0p_4fB0p_4c0p_4c0p_4i00p_4fB0p_4i00p_4fB0p_4i00p_4i00p_4i00p_4lm^0p_4i00p_4fB0p_4lm^0p_4c0p_4i00p_4fB0p_4i00p_4c0p_4^V0p_4fB0p_4fB0p_4fB0p_4fB0p_4fB0p_4fB0p_4o=0p_4o=0p_4lm^0p_4fB0p_4fB0p_4i00p_4fB0p_4fB0p_4lm^0p_4fB0p_4i00p_4fB0p_4i00p_4fB0p_4fB0p_4i00p_4i00p_4fB0p_4^V0p_4^V0p_4c0p_4c0p_4fB0p_4lm^0p_4i00p_4fB0p_4i00p_4i00p_4i00p_4c0p_4i00p_4fB0p_4fB0p_4i00p_4fB0p_4i00p_4i00p_4fB0p_4i00p_4lm^0p_4i00p_4i00p_4fB0p_4fB0p_4i00p_4fB0p_4fB0p_4lm^0p_4c0p_4lm^0p_4fB0p_4fB0p_4fB0p_4i00p_4fB0p_4fB0p_4fB0p_4i00p_4i00p_4i00p_4i00p_4fB0p_4i00p_4fB0p_4lm^0p_4c0p_4c0p_4i00p_4lm^0p_4i00p_4lm^0p_4i00p_4i00p_4fB0p_4i00p_4fB0p_4i00p_4fB0p_4c0p_4fB0p_4c0p_4c0p_4a)0p_4c0p_4a)0p_4c0p_4a)0p_4a)0p_4c0p_4fB0p_4a)0-]4fB0p_4fB0p_4^V1:,4fB0p_4a)0p_4c1:,4i00p_4a)1:,4c0p_4c1:,4c1:,4a)0p_4fB1:,4c1:,4c17r4c0p_4a)1:,4c0p_4i00-]4c0-]4c0-]4c0p_4^V0-]4c0-]4c0p_4c0-]4a)0-]4a)0-]4fB0-]4[0-]4a)0p_4^V0-]4fB0p_4a)1:,4c0p_4c0p_4a)0p_4a)0p_4fB0p_4a)0p_4a)0p_4a)0-]4fB0p_4c0p_4c0p_4c0p_4c0p_4^V0p_4a)0p_4fB0p_4^V0p_4fB0p_4^V0p_4c0p_4c0p_4fB0p_4a)0p_4fB0p_4a)0p_4c0p_4^V0p_4X0p_4^V0p_4^V0p_4^V0p_4[0p_4a)0p_4a)0p_4c0p_4c0p_4c0p_4^V0p_4fB0p_4c0p_4fB0p_4a)0p_4i00p_4c0p_4fB0p_4c0p_4a)0p_4fB0p_4fB0p_4fB0p_4lm^0p_4i00p_4i00p_4o=0p_4c0p_4i00p_4i00p_4o=0p_4o=0p_4o=0p_4i00p_4lm^0p_4fB0p_4lm^0p_4fB0p_4i00p_4lm^0p_4lm^0p_4i00p_4i00p_4o=0p_4c0p_4i00p_4i00p_4i00p_4fB0p_4i00p_4i00p_4lm^0p_4i00p_4fB0p_4lm^0p_4fB0p_4o=0p_4c1:,4c0-]4lm^0-]4fB0p_4lm^0p_4fB0p_4i00-]4fB0-]4lm^0-]4lm^0p_4i00-]4fB1:,4fB0-]4i00-]4lm^0p_4fB17r4i014lm^17r4i014i014i014i00-]4i00p_4i00p_4i00p_4i00p_4lm^0p_4i00p_4lm^0p_4fB0p_4lm^0p_4c0p_4i00p_4fB0p_4c0p_4i00-]4i00p_4fB0p_4fB0p_4lm^0p_4i00p_4c0-]4i00p_4c0p_4fB0p_4fB0p_4i00p_4fB0p_4fB0-]4fB0-]4i00-]4fB0p_4c0-]4i00p_4fB0p_4fB0p_4c0p_4i00p_4i00p_4i00p_4i00p_4i00p_4lm^0p_4i00p_4fB0p_4i00p_4i00p_4i00p_4i00p_4i00p_4lm^0p_4i00p_4lm^0p_4i00p_4lm^0p_4i00p_4o=0p_4i00p_4i00p_4i00p_4lm^0p_4i00p_4lm^0p_4lm^0-]4fB1:,4lm^0p_4o=0p_4i00-]4i00p_4i00-]4o=0p_4o=0-]4lm^0-]4lm^1:,4o=0p_4lm^1:,4rz0p_4i01:,4o=0-]4i00-]4lm^14lm^134o=0-]4fB1:,4o=0p_4i00p_4o=0p_4fB0p_4o=0p_4o=0p_4rz0p_4lm^0p_4o=0p_4o=0p_4lm^0p_4lm^0p_4o=0p_4z0-]4lm^1:,4o=0p_4lm^14o=0-]4o=0-]4o=1:,4i01:,4o=1:,4lm^1:,4rz14o=134i01:,4c1:,4i01:,4c0-]4lm^0p_4lm^0-]4lm^0p_4i01:,4lm^0p_4rz1:,4rz0p_4lm^0-]4o=0p_4o=0-]4o=0-]4i00p_4o=0p_4o=0p_4lm^0p_4lm^0p_4lm^0p_4o=0p_4o=0p_4o=0p_4o=0p_4o=0p_4lm^0p_4rz0p_4o=0-]4o=0p_4t0p_4o=0p_4lm^0p_4rz0p_4o=0p_4lm^0-]4rz0-]4rz0p_4o=0p_4o=0-]4rz0p_4o=0p_4lm^0p_4o=0p_4lm^0p_4lm^0p_4lm^0p_4o=0p_4lm^0p_4t0p_4t0p_4o=0p_4lm^0p_4lm^0p_4rz0p_4o=0p_4lm^0p_4lm^0-]4i00p_4fB0p_4fB0p_4o=0p_4o=0p_4lm^0p_4o=0p_4o=0p_4o=0p_4o=0p_4lm^0p_4o=0p_4lm^0p_4rz0p_4rz0p_4rz0p_4rz0p_4o=0p_4rz0p_4lm^0p_4o=0p_4lm^0p_4i00p_4fB0p_4i00p_4i00p_4c0p_4i00p_4i00p_4i00p_4a)0p_4i00p_4fB0p_4a)0p_4fB0p_4a)0p_4a)0p_4c0-]4c0p_4c0p_4i00p_4c0-]4i00p_4^V1:,4c1:,4fB1:,4fB1:,4fB14fB14c134i00p_4c0-]4c1:,4fB0-]4c0-]4c0-]4c0p_4a)0p_4c0p_4fB0p_4c0p_4fB0p_4a)0p_4c0p_4fB0p_4c0p_4fB0p_4^V0p_4c0p_4a)0p_4a)0p_4fB0p_4c0p_4a)0p_4c0p_4a)0p_4c0p_4c0p_4c0p_4a)0p_4c0p_4a)0p_4a)0p_4a)0p_4a)0p_4fB0p_4lm^0p_4a)0p_4c0p_4fB0p_4^V0p_4c0p_4fB0p_4a)0p_4a)0p_4c0p_4a)0p_4fB0p_4c0p_4^V0p_4c0p_4a)0p_4^V0p_4c0p_4^V0p_4c0p_4[0p_4fB0p_4c0p_4^V0p_4c0p_4a)0p_4^V0p_4a)0p_4c0p_4c0p_4[0p_4fB0p_4c0p_4a)0p_4c0p_4a)0p_4c0p_4c0p_4a)0p_4a)0p_4a)0p_4c0p_4X0p_4c0p_4^V0p_4a)0p_4c0p_4a)0p_4a)0p_4[0p_4c0p_4^V0p_4a)0p_4a)0p_4^V0p_4^V0p_4a)0p_4a)0p_4^V0p_4^V0p_4c0p_4a)0p_4^V0p_4a)0p_4a)0p_4[0p_4i00p_4c0p_4a)0p_4a)0p_4^V0p_4^V0p_4a)0p_4^V0p_4c0p_4[0p_4^V0p_4X0p_4a)0p_4a)0p_4[0p_4[0p_4[0p_4[0p_4[0p_4^V0p_4^V0p_4^V0p_4^V0p_4[0p_4a)0p_4^V0p_4[0p_4a)0p_4^V0p_4^V0p_4a)0p_4^V0p_4^V0p_4[0p_4X0p_4a)0p_4[0p_4^V0p_4^V0p_4^V0p_4^V0p_4[0p_4[0p_4[0p_4^V0p_4X0p_4^V0p_4[0p_4X0p_4a)0p_4a)0p_4a)0p_4a)0p_4a)0p_4a)0p_4^V0p_4^V0p_4X0p_4a)0p_4a)0p_4[0p_4a)0p_4^V0p_4^V0p_4[0p_4[0p_4c0p_4a)0p_4a)0p_4^V0p_4[0p_4[0-]4[0-]4^V0p_4[0p_4X0p_4X0p_4^V0p_4[0p_4X0p_4X0p_4U0p_4^V0p_4U0p_4[0p_4[0p_4^V0p_4U0-]4c0p_4a)0p_4a)0p_4a)0p_4a)0p_4^V0-]4^V0p_4c0p_4c0p_4c0p_4a)0p_4c0p_4c0p_4c0-]4c0-]4^V0p_4a)0p_4^V0p_4[0p_4a)0p_4[0p_4^V0p_4[0p_4^V0p_4^V0p_4[0p_4X0p_4^V0p_4X0p_4^V0p_4[0p_4^V0p_4[0p_4^V0p_4[0p_4[0p_4[0p_4[0p_4[0p_4X0p_4X0p_4[0p_4X0p_4[0p_4a)0p_4X0p_4[0p_4X0p_4[0p_4[0p_4X0-]4X1:,4^V0p_4[0p_4[0-]4U0-]4[0p_4[0p_4X1:,4[0p_4[0p_4X0-]4^V0p_4X0p_4X0p_4^V0p_4X0p_4[0p_4[0p_4X0p_4X0p_4X0p_4S0p_4S0p_4S0-]4[0p_4X0-]4U0p_4X0p_4U0p_4X0p_4U0p_4[0p_4PCR0p_4X0p_4U0p_4S0p_4X0p_4X0p_4S0p_4U0p_4[0p_4U0p_4[0p_4X0p_4U0p_4X0p_4X0p_4[0p_4U0p_4X0p_4U0p_4U0p_4X0p_4X0p_4PCR0p_4X0p_4[0p_4X0p_4X0p_4U0p_4U0p_4X0p_4U0p_4[0p_4X0p_4X0p_4PCR0p_4S0p_4X0p_4X0p_4X0p_4X0p_4U0p_4X0p_4X0p_4X0p_4U0p_4X0p_4S0p_4X0p_4U0p_4U0p_4U0p_4X0p_4S0p_4U0p_4PCR0p_4U0p_4S0p_4S0p_4U0p_4PCR0p_4U0p_4PCR0p_4S0p_4[0p_4B,0p_4S0p_4S0p_4S0p_4PCR0p_4PCR0p_4S0p_4Mpd0p_4S0p_4PCR0p_4PCR0p_4S0p_4S0p_4U0p_4PCR0p_4S0p_4PCR0p_4Mpd0p_4S0p_4U0p_4PCR0p_4PCR0p_4Mpd0p_4Mpd0p_4PCR0p_4PCR0p_4Mpd0p_4PCR0p_4S0p_4PCR0p_4S0p_4S0p_4PCR0p_4S0p_4S0p_4PCR0p_4S0p_4S0p_4S0p_4PCR0p_4PCR0p_4S0p_4S0p_4Mpd0p_4S0p_4J60p_4J60p_4Mpd0p_4Mpd0p_4Mpd0p_4Mpd0p_4Mpd0p_4PCR0p_4U0p_4PCR0p_4PCR0p_4S0p_4PCR0p_4S0p_4PCR0p_4S0p_4S0p_4S0p_4Mpd0p_4PCR0p_4S0p_4U0p_4Mpd0p_4S0p_4Mpd0p_4PCR0p_4PCR0p_4X0p_4S0p_4U0p_4U0p_4X0p_4X0p_4[0p_4X0p_4S0p_4PCR0p_4U0p_4U0p_4X0p_4^V0p_4S0p_4[0p_4X0p_4X0p_4[0p_4X0p_4X0p_4U0p_4X0p_4X0p_4[0p_4^V0p_4[0p_4a)0p_4X0p_4[0p_4[0p_4[0p_4[0p_4[0p_4X0p_4X0p_4U0p_4[0p_4^V0p_4X0p_4U0p_4U0p_4X0p_4U0p_4U0p_4S0p_4X0p_4S0-]4X0p_4U0-]4U0-]4U1:,4X14S14U1:,4X17r4U14S134X1:,4PCR17r4U1:,4X0-]4U1:,4X0-]4PCR14X0-]4PCR134PCR1:,4S0p_4S0p_4X0p_4U0p_4U0-]4U0p_4S0p_4X0p_4U0-]4X0p_4X0p_4U0p_4S0p_4X0p_4X0p_4PCR0p_4S0p_4U0p_4Mpd0p_4Mpd0p_4S0p_4J60p_4S0p_4PCR0p_4PCR0p_4S0p_4Mpd0p_4PCR0p_4Mpd0p_4PCR0p_4Mpd0p_4PCR0p_4S0p_4J60p_4PCR0p_4Mpd0p_4Mpd0p_4Mpd0p_4PCR0p_4U0p_4PCR0p_4Mpd0p_4PCR0p_4Mpd0p_4U0p_4J60p_4PCR0p_4Mpd0p_4Mpd0p_4PCR0p_4J60p_4PCR0p_4Mpd0p_4D0p_4Mpd0p_4PCR0p_4J60p_4Mpd0p_4D0p_4PCR0p_4Mpd0p_4D0p_4Mpd0p_4G0p_4PCR0p_4Mpd0p_4J60p_4G0p_4J60p_4Mpd0p_4G0p_4Mpd0p_4Mpd0p_4D0p_4Mpd0p_4G0p_4Mpd0p_4J60p_4J60p_4J60p_4J60p_4G0p_4J60p_4J60p_4Mpd0p_4Mpd0p_4G0p_4Mpd0p_4J60p_4G0p_4G0p_4D0p_4B,0-]4G0p_4G0p_4J60p_4J60p_4G0p_4J60p_4J60p_4J60p_4J60p_4J60p_4J60p_4J60p_4Mpd0p_4J60p_4Mpd0p_4Mpd0p_4G0-]4G0p_4J60p_4J60p_4Mpd0p_4G0p_4G0p_4G0p_4D0p_4G0p_4Mpd0p_4G0p_4G0p_4Mpd0p_4G0p_4J60p_4G0p_4Mpd0p_4J60p_4J60p_4G0p_4G0p_4Mpd0p_4G0p_4D0p_4Mpd0p_4J60p_4J60p_4J60p_4J60p_4J60p_4J60p_4J60p_4J60p_4PCR0p_4G0p_4J60p_4Mpd0p_4J60p_4J60p_4Mpd0p_4PCR0p_4J60p_4PCR0p_4S0p_4J60p_4PCR0p_4S0p_4PCR0p_4S0p_4U0p_4^V0p_4[0p_4^V0p_4a)0p_4a)0p_4fB0p_4c0p_4i00p_4i00p_4i00p_4o=0p_4lm^0p_4o=0p_4i00p_4o=0p_4o=0p_4o=0p_4lm^0p_4o=0p_4o=0p_4lm^0p_4o=0p_4o=0p_4o=0p_4o=0p_4rz0p_4rz0p_4rz0p_4w0p_4t0p_4w0p_4w0p_4w0p_4t0p_4t0p_4t0p_4w0p_4w0p_4z0p_4z0p_4rz0p_4}S0p_4w0p_4}S0p_4}S0p_4w0p_40p_4z0p_4w0p_40p_4t0p_4t0p_4z0p_4w0-]4t0p_4w0p_4w0p_4z0p_4w0p_4w0p_4z0p_4w0p_4w0p_4t0p_4t0p_4w0p_4w0p_4rz0p_4rz0p_4o=0p_4t0p_4t0p_4rz0p_4o=0p_4rz0p_4o=0p_4o=0p_4rz0p_4o=0p_4o=0p_4lm^0p_4o=0p_4i00p_4lm^0p_4o=0p_4i00p_4lm^0p_4lm^0p_4i00p_4i00p_4i00p_4fB0p_4a)0p_4a)0p_4a)0p_4^V0p_4a)0p_4^V0p_4^V0p_4[0p_4[0p_4[0p_4[0p_4X0p_4^V0p_4[0p_4X0p_4^V0p_4[0p_4a)0p_4^V0p_4a)0p_4X0p_4U0p_4U0p_4[0p_4U0p_4X0p_4[0p_4a)0p_4X0p_4^V0p_4a)0p_4a)0p_4X0p_4a)0p_4a)0p_4[0p_4a)0p_4[0p_4^V0p_4[0p_4a)0p_4^V0p_4[0p_4^V0p_4[0p_4X0p_4[0p_4[0p_4[0p_4X0p_4X0p_4X0p_4[0p_4X0p_4X0p_4U0p_4X0p_4^V0p_4X0p_4X0p_4U0p_4X0p_4S0p_4U0p_4X0p_4S0p_4U0p_4X0p_4U0p_4U0p_4S0p_4U0p_4U0p_4Mpd0p_4PCR0p_4Mpd0p_4PCR0p_4J60p_4PCR0p_4Mpd0p_4PCR0p_4Mpd0p_4PCR0p_4Mpd0p_4PCR0p_4G0p_4J60p_4S0p_4J60p_4PCR0p_4PCR0p_4Mpd0p_4Mpd0p_4J60p_4S0p_4Mpd0p_4J60p_4PCR0p_4Mpd0p_4Mpd0p_4Mpd0p_4J60p_4PCR0p_4Mpd0p_4J60p_4PCR0p_4J60p_4PCR0p_4J60p_4J60p_4PCR0p_4G0p_4Mpd0p_4PCR0p_4J60p_4PCR0p_4J60p_4G0p_4PCR0p_4J60p_4J60p_4D0p_4G0p_4J60p_4G0p_4D0p_4G0p_4B,0p_4G0p_4PCR0p_4J60p_4G0p_4D0p_4G0p_4D0p_4B,0p_4G0p_4G0p_4D0p_4B,0p_4D0p_4B,0p_4G0p_4G0p_4B,0p_4G0p_4?\0p_4D0p_4D0p_4J60p_4?\0-]4G0p_4G0p_4D0p_4D0p_4D0p_4Mpd0p_4D0p_4G0p_4D0p_4B,0p_4J60p_4D0p_4G0p_4B,0p_4J60p_4?\0p_4J60p_4B,0p_4G0p_4?\0p_4B,0p_4G0p_4B,0p_4G0p_4B,0p_4D0p_4B,0p_4D0p_4B,0p_4D0p_4D0p_4D0p_4D0p_4G0p_4D0p_4D0p_4G0p_4?\0p_4D0p_4J60p_4B,0p_4G0p_4D0p_4B,0p_4G0p_4B,0p_4G0p_4D0p_4G0p_4G0p_4D0p_4G0p_4J60p_4D0p_4G0p_4D0p_4B,0p_4Mpd0p_4J60p_4D0p_4G0p_4D0p_4D14D1:,4G0-]4?\0-]4D0-]4G0p_4D0p_4B,0p_4J60p_4D0p_4?\0p_4G0p_4B,0p_4D0p_4G0p_4G0p_4G0p_4G0p_4G0p_4G0p_4G0p_4B,0p_4G0p_4B,0p_4G0p_4B,0p_4G0p_4J60p_4Mpd0p_4J60p_4D0-]4J60p_4G0p_4G0p_4J60p_4G0p_4G0p_4Mpd0p_4G0p_4D0p_4D0p_4Mpd0p_4D0p_4J60p_4B,0p_4B,0p_4D0p_4G0p_4G0p_4G0p_4J60p_4G0p_4G0p_4G0p_4D0p_4D0p_4G0p_4G0p_4D0p_4G0p_4B,0p_4D0p_4B,0p_4G0p_4D0p_4D0p_4D0p_4G0p_4D0p_4D0p_4?\0p_4B,0p_4D0p_4B,0p_4G0p_4B,0p_4B,0p_4Mpd0p_4D0p_4J60p_4G0p_4J60p_4G0p_4J60p_4J60p_4J60p_4B,0p_4Mpd0p_4J60p_4G0p_4G0p_4G0p_4G0p_4G0p_4G0p_4J60p_4G0p_4G0p_4G0p_4G0p_4J60p_4G0-]4D0p_4G0p_4G0p_4G0p_4B,0-]4G0p_4G0p_4J60p_4G0p_4G0p_4D0p_4J60p_4G0p_4G0p_4B,0p_4B,0p_4J60p_4D0p_4G0p_4G0p_4G0p_4G0p_4D0p_4G0p_4<0-]4D0p_4B,0p_4D0p_4B,0p_4D0p_4J60p_4D0p_4G0p_4G0p_4D0p_4G0p_4G0p_4J60p_4J60p_4G0p_4J60p_4G0p_4Mpd0p_4Mpd0p_4J60p_4Mpd0p_4J60p_4G0p_4G0p_4J60p_4J60p_4J60p_4Mpd0p_4G0p_4Mpd0p_4Mpd0p_4J60p_4J60p_4Mpd0p_4G0p_4B,0p_4D0p_4J60p_4J60p_4D0p_4G0p_4G0p_4G0p_4G0p_4G0p_4D0p_4Mpd0p_4D0p_4D0p_4G0p_4D0p_4D0p_4?\0-]4J60p_4D0p_4D0p_4D0p_4D0-]4G0p_4G0-]4D0-]4J60-]4B,0-]4G0p_4G0p_4D0p_4D0-]4B,0-]4G0-]4D0p_4D0p_4D0p_4G0p_4D0p_4B,0p_4G0p_4D0p_4G0p_4D0p_4G0p_4D0p_4J60p_4G0p_4D0p_4D0p_4D0p_4B,0p_4B,0p_4G0p_4G0p_4B,0p_4D0p_4G0p_4B,0p_4G0p_4D0p_4D0p_4D0p_4G0p_4J60p_4B,0p_4D0p_4B,0p_4G0p_4D0p_4D0p_4D0p_4G0p_4G0p_4J60p_4D0p_4J60p_4G0p_4G0p_4J60p_4G0p_4D0p_4G0p_4Mpd0p_4G0p_4G0p_4J60p_4G0p_4J60p_4J60p_4D0p_4J60p_4S0p_4J60p_4G0p_4G0p_4B,0p_4<0p_4D0p_4D0p_4B,0p_4G0p_4D0p_4D0p_4D0p_4B,0p_4B,0p_4D0p_4D0p_4G0p_4G0p_4D0p_4G0p_4D0p_4D0p_4?\0p_4D0p_4B,0p_4G0p_4D0p_4B,0p_4G0p_4D0p_4D0p_4B,0p_4D0p_4B,0p_4B,0p_4D0p_4B,0p_4D0p_4?\0p_4D0p_4G0p_4B,0p_4B,0p_4D0p_4B,0p_4B,0p_4D0p_4G0p_4?\0p_4G0p_4B,0p_4B,0p_4B,0p_4B,0p_4B,0p_4G0p_4G0p_4G0p_4D0p_4G0p_4D0p_4Mpd0p_4Mpd0p_4D0p_4D0p_4G0p_4G0p_4G0p_4D0p_4J60p_4B,0p_4J60p_4G0p_4G0p_4G0p_4G0p_4D0p_4G0p_4G0p_4G0p_4J60p_4G0p_4G0p_4?\0p_4D0p_4J60p_4D0p_4G0p_4J60p_4D0p_4Mpd0p_4J60p_4G0p_4J60p_4D0p_4G0p_4D0p_4B,0p_4B,0p_4B,0p_4D0p_4?\0p_4D0p_4B,0p_4?\0p_4B,0p_4B,0p_490p_4<0p_4B,0p_4B,0p_4B,0p_4D0p_4B,0p_4G0p_4B,0p_4B,0-]4?\0-]4B,0p_4D0p_4?\0p_4B,0p_4B,0p_4B,0p_4?\0p_4D0p_4B,0p_4J60p_4Mpd0p_4S0p_4Mpd0p_4G0p_4D0p_4G0p_4G0p_4PCR0p_4D0p_4Mpd0p_4G0p_4J60p_4Mpd0p_4J60p_4J60p_4J60p_4G0p_4G0p_4G0p_4PCR0p_4D0p_4Mpd0p_4G0p_4J60p_4G0p_4D0p_4G0p_4D0p_4G0p_4D0p_4D0p_4D0p_4D0p_4D0p_4D0p_4D0p_4?\0p_4<0p_4?\0p_4D0p_4B,0p_4G0p_4D0p_4G0p_4D0p_4D0p_4G0p_4G0p_4B,0p_4D0p_4D0p_4D0p_4D0p_4G0p_4D0-]4D0p_4D0p_4D0p_4G0p_4G0p_4D0p_4G0p_4?\0p_4?\0p_4J60p_4B,0p_4B,0p_4B,0p_4J60p_4B,0p_4?\0p_4D0p_4B,0p_4B,0p_4B,0p_4B,0p_4B,0p_4B,0p_4D0p_4B,0p_4D0p_4D0p_4J60p_4B,0p_4J60p_4D0p_4G0p_4B,0p_4B,0p_4?\0p_4D0p_4G0p_4G0p_4J60p_4D0p_4D0p_4G0p_4G0p_4G0p_4G0p_4G0p_4J60p_4J60p_4G0p_4Mpd0p_4D0p_4D0p_4G0p_4D0p_4B,0p_4D0p_4D0p_4D0p_4D0p_4J60p_4J60p_4G0p_4J60p_4J60p_4J60p_4J60p_4J60p_4Mpd0p_4G0p_4B,0p_4D0p_4G0p_4B,0p_4G0p_4B,0p_4B,0p_4G0p_4B,0p_4G0p_4B,0p_4B,0p_4D0p_4B,0p_4G0p_4D0p_4B,0p_4D0p_4G0p_4D0p_4D0p_4B,0p_4D0p_4G0p_4D0p_4D0p_4G0p_4G0p_4B,0p_4B,0p_4J60p_4B,0p_4G0p_4J60p_4B,0p_4J60p_4D0p_4D0p_4D0p_4J60p_4B,0p_4G0p_4G0p_4D0p_4G0p_4B,0p_4B,0p_4B,0p_4<0p_4B,0p_4<0p_4B,0p_4?\0p_4B,0p_4D0p_4G0p_490p_4D0p_4G0p_4B,0p_4D0-]4G0p_4D0p_4J60p_4D0p_4G0p_4G0-]4B,0p_4D0p_4D0p_4D0p_4G0p_4D0p_4J60p_4B,0p_4<0p_4?\0p_4<0p_4D0p_4?\0p_4?\0p_4B,0p_4?\0p_4<0p_4B,0p_4<0p_4G0p_4D0p_4B,0p_4D0p_4B,0p_4D0p_4B,0p_4B,0p_4D0p_4B,0p_4D0p_4D0p_4B,0p_4D0p_4B,0p_4?\0p_4G0p_4?\0p_4B,0p_4?\0p_4B,0p_4G0p_4B,0p_4B,0p_4?\0p_4?\0p_4D0p_4D0p_4B,0p_4B,0p_4D0p_4B,0p_4?\0p_4G0p_4?\0p_4D0p_4B,0p_4?\0p_4D0p_4D0p_4D0p_4B,0p_4B,0p_4G0p_4D0p_4B,0p_4D0p_4G0p_4D0p_4D0p_4B,0p_4D0p_4?\0p_4D0p_4D0p_4B,0p_4D0p_4B,0p_4D0p_4D0p_4D0p_4D0p_4B,0p_4B,0p_4B,0-]4G0p_4B,0-]4D0p_4D0p_4B,0p_4B,0p_4B,0p_4B,0p_4D0p_4B,0p_4?\0p_4B,0p_4?\0p_4D0p_4D0p_4D0p_4B,0p_4D0p_4B,0p_4?\0p_4<0p_4B,0p_4D0p_4<0p_4D0p_4?\0p_4D0p_4B,0p_4B,0p_4B,0p_4B,0p_4G0p_4D0p_4D0p_4G0-]4D0-]4D0p_4D0p_4D0p_4B,0p_4J60p_4D0p_4D0p_4G0p_4B,0p_4G0p_4D0p_4B,0p_4D0p_4G0p_4G0p_4PCR0p_4PCR0p_4J60p_4PCR0p_4Mpd0p_4J60p_4Mpd0p_4Mpd0p_4PCR0p_4J60p_4PCR0p_4J60p_4G0p_4D0p_4Mpd0p_4J60p_4Mpd0p_4J60p_4G0p_4Mpd0p_4J60p_4J60p_4J60p_4Mpd0p_4Mpd0p_4J60p_4J60p_4Mpd0p_4PCR0p_4Mpd0p_4G0p_4J60p_4J60p_4J60p_4Mpd0p_4PCR0p_4S0p_4J60p_4G0-]4PCR0p_4J60p_4J60p_4J60p_4PCR0p_4Mpd0p_4J60p_4J60p_4Mpd0p_4PCR0p_4PCR0p_4PCR0p_4S0p_4PCR0p_4PCR0p_4S0p_4Mpd0p_4S0p_4PCR0p_4PCR0p_4Mpd0p_4S0p_4PCR0p_4J60p_4Mpd0p_4Mpd0p_4Mpd0p_4PCR0p_4PCR0p_4Mpd0p_4S0p_4Mpd0p_4Mpd0p_4PCR0p_4Mpd0p_4PCR0p_4S0p_4S0p_4Mpd0p_4PCR0p_4PCR0p_4PCR0p_4Mpd0p_4S0p_4PCR0p_4S0p_4J60p_4J60-]4G0p_4D0p_4D0p_4G0p_4J60p_4J60p_4G0p_4J60p_4J60p_4G0p_4D0p_4J60p_4D0p_4D0p_4G0p_4G0p_4G0p_4G0p_4J60p_4J60p_4G0p_4J60p_4G0p_4G0p_4G0p_4J60p_4G0p_4G0p_4J60p_4D0-]4Mpd0p_4D0-]4J60p_4G0p_4G0p_4J60p_4G0p_4Mpd0p_4G0p_4J60p_4G0p_4B,0p_4G0p_4B,0p_4D0p_4B,0p_4D0p_4J60p_4G0p_4G0-]4G0p_4D0p_4Mpd0p_4D0-]4D0p_4B,1:,4D0p_4G0p_4G0p_4J60p_4G0p_4D0p_4G0p_4G0p_4G0p_4G0p_4G0p_4J60p_4G0p_4G0p_4D0p_4D0p_4G0p_4B,0p_4D0p_4J60p_4B,0p_4D0p_4J60p_4G0p_4J60p_4J60p_4D0p_4G0p_4D0p_4J60p_4G0p_4G0p_4G0p_4D0p_4D0p_4J60p_4B,0p_4J60p_4G0p_4D0p_4G0p_4D0p_4D0p_4G0p_4D0p_4G0p_4G0p_4D0p_4B,0p_4G0p_4D0p_4D0p_4J60p_4G0p_4G0p_4G0p_4G0p_4J60p_4D0p_4G0p_4G0p_4J60p_4D0p_4J60p_4G0p_4G0p_4J60p_4D0p_4G0p_4D0p_4Mpd0p_4G0p_4G0p_4D0p_4G0p_4B,0p_4D0p_4G0p_4D0p_4?\0p_4D0p_4B,0p_4D0p_4<0p_4?\0p_4<0p_4G0p_4G0p_4D0p_4B,0p_4B,0p_4D0p_4D0p_4D0p_4J60p_4D0p_4B,0p_4D0p_4J60p_4G0p_4B,0p_4G0p_4B,0p_4G0p_4J60p_4B,0p_4G0p_4G0p_4G0p_4D0p_4D0p_4D0p_4J60p_4G0p_4G0p_4G0p_4G0p_4J60p_4G0p_4J60p_4D0p_4J60p_4J60p_4G0p_4D0p_4J60p_4B,0p_4G0p_4G0p_4D0p_4G0p_4B,0p_4Mpd0p_4D0p_4G0p_4B,0p_4J60p_4J60p_4G0p_4D0p_4J60p_4G0p_4G0p_4D0p_4J60p_4G0p_4Mpd0p_4J60p_4Mpd0p_4Mpd0p_4Mpd0p_4J60p_4J60p_4PCR0p_4G0p_4G0p_4D0p_4D0p_4D0p_4D0p_4B,0p_4?\0p_4<0p_4B,0p_4D0p_4J60p_4B,0p_4G0p_4G0p_4B,0p_4D0p_4Mpd0p_4D0p_4?\0p_4B,0p_4D0p_4G0p_4D0p_4J60p_4D0p_4B,0p_4G0p_4G0p_4B,0p_4D0p_4G0p_4G0p_4D0p_4?\0p_4D0p_4J60p_4B,0p_4D0p_4D0p_4D0p_4D0p_4G0-]4D0p_4G0p_4G0p_4B,0p_4D0p_4B,0p_4D0p_4D0p_4D0p_4D0p_4B,0p_4G0p_4D0p_4B,0p_4D0p_4?\0p_4D0p_4?\0p_4B,0p_4B,1:,4D0p_4D0-]4D0-]4B,0-]4?\0p_4B,0p_4D0p_4?\0p_4D0p_4B,0p_4D0p_4D0p_4D0p_4B,0p_4D0p_4B,0p_4D0p_4G0p_4?\0p_4G0p_4G0p_4B,0p_4B,0p_4B,0p_4?\0p_4D0p_4B,0p_4D0p_4?\0p_4D0p_4?\0p_4?\0p_4?\0p_4?\0p_4B,0p_4D0p_4?\0p_4G0p_4B,0p_4B,0p_4D0p_4D0p_4B,0p_4?\0p_4D0p_4B,0p_4?\0p_4D0p_4B,0p_4?\0p_4D0p_4B,0p_4B,0p_4?\0p_4?\0p_4?\0p_4B,0p_4?\0p_4<0p_4B,0p_4<0p_4B,0p_4<0p_4B,0p_4<0p_4?\0p_4<0p_4B,0p_4?\0p_4B,0p_4?\0p_4?\0p_4<0p_4B,0p_4B,0p_4D0p_4B,0p_4B,0p_4<0p_4B,0p_4?\0p_4G0p_4D0p_4D0p_4B,0p_4B,0p_4?\0p_4<0p_4B,0p_490p_4B,0p_4D0p_4?\0p_4?\0p_4D0p_4<0p_4?\0p_4B,0p_4B,0p_4?\0p_4B,0p_4B,0p_4?\0p_4D0p_4?\0p_4B,0p_4?\0p_4?\0p_4B,0p_4B,0p_4D0p_4<0p_4B,0p_4B,0p_4B,0p_4D0p_4?\0p_4B,0p_4?\0p_4D0p_4D0p_4B,0p_4?\0p_4B,0p_4?\0p_4?\0p_4?\0p_4B,0p_4B,0p_4?\0p_4D0p_4?\0p_4D0p_4D0p_4?\0p_4?\0p_4D0p_4B,0p_4?\0p_4B,0p_4B,0p_4B,0p_4B,0p_4?\0p_4B,0p_4B,0p_4?\0p_4J60p_4G0p_4G0p_4G0p_4D1:,4Mpd0-]4G0p_4D0p_4G0p_4D0p_4J60p_4D0p_4D0p_4D0p_4?\0p_4D0p_4D0p_4B,0p_4D0p_4B,0p_4B,0p_4B,0p_4G0p_4B,0p_4D0p_4D0p_4D0p_4D0p_4D0p_4D0p_4D0p_4B,0p_4B,0p_4B,0p_4?\0p_4?\0p_4?\0p_4?\0p_4?\0p_490p_4?\0p_4?\0p_4B,0p_490p_4B,0p_4B,0p_4?\0p_4?\0p_4B,0p_4B,0p_4?\0p_4B,0p_4B,0p_4<0p_4?\0p_4?\0p_4?\0p_4?\0p_4B,0p_4?\0p_4B,0p_4<0p_4B,0p_4B,0p_4B,0p_4?\0p_4B,0p_4B,0p_4B,0p_4?\0p_4D0p_4B,0p_4B,0p_4<0p_4?\0p_4?\0p_4?\0p_4B,0p_4?\0p_4B,0p_4?\0p_4B,0p_4D0p_4G0p_4G0p_4D0p_4G0p_4G0p_4D0p_4D0-]4J60p_4D0p_4D0p_4D0p_4G0p_4G0p_4D0p_4D0p_4G0p_4J60p_4D0p_4D0p_4D0p_4B,0p_4G0p_4<0p_4B,0p_4?\0p_4?\0p_4D0p_4<0p_4?\0p_4?\0p_4?\0p_4B,0p_4<0p_4B,0p_4D0p_4<0p_4?\0p_4?\0p_4B,0p_4?\0p_4?\0p_4D0p_4?\0p_4<0p_4B,0p_4<0p_4?\0p_4B,0p_4?\0p_4?\0p_4<0p_4B,0p_4?\0p_4<0p_4<0p_4?\0p_4?\0p_4<0p_4<0p_4<0p_490p_4?\0p_4?\0p_4<0p_4<0p_4?\0p_4B,0p_4<0p_490p_4<0p_4<0p_4?\0p_4B,0p_4<0p_4B,0p_4?\0p_4<0p_4<0p_4<0p_4?\0p_4<0p_4<0p_4?\0p_4?\0p_4<0p_4?\0p_490p_4?\0p_4?\0p_4<0p_4?\0p_4B,0p_4<0p_4<0p_4G0p_4D0p_4D0p_4B,0p_4D0p_4G0p_4D0p_4D0p_4B,0p_4D0p_4?\0p_4D0p_4D0p_4D0p_4D0p_4?\0-]4D0p_4?\0-]4<0-]4?\0p_4?\0p_4B,0p_4?\0p_4?\0p_4G0p_4D0p_4G0p_4D0p_4G0p_4D0p_4G0p_4D0p_4B,0p_4G0-]4<0-]4B,0p_4G0-]4G0p_4D1:,4D0p_4D0p_4G0p_4<1:,4B,0p_4<0-]4D0p_4?\0p_4B,0p_4?\0p_4B,0p_4?\0p_4<0p_4?\0-]4B,0p_4<0p_4<0-]4<0p_4?\0p_4B,0p_4?\0p_4?\0p_4?\0p_4?\0p_4B,0p_4?\0p_4?\0p_4<0p_4B,0p_4?\0p_4B,0p_4<0p_4<0p_4?\0p_4B,0p_4?\0p_4?\0p_4D0p_4?\0p_4B,0p_4G0p_4B,0p_4D0p_4B,0p_4B,0p_4D0p_4?\0p_4?\0p_4D0p_4?\0p_4G0p_4B,0p_4D0p_4B,0p_4B,0p_4?\0p_4D0p_4D0p_4<0p_4B,0p_4D0p_4?\0p_4D0p_4D1:,4?\0p_4B,0-]4D0p_4B,0p_4D0p_4D0-]4D0p_4D0p_4B,0-]4D0p_4B,0-]4D0-]4J60-]4?\1:,4G1:,4J60-]4G0p_4D0p_4D0-]4G0p_4G0p_4D0p_4D0p_4D0p_4G0p_4B,0p_4D0p_4B,0p_4D0p_4D0p_4D0p_4D0p_4D0p_4B,0p_4D0p_4B,0p_4?\14G1:,4D1:,4B,0-]4D14D0-]4G0-]4B,14D1:,4D0p_4J60p_4B,1:,4G0p_4G0p_4D0p_4G0p_4G0p_4D0p_4D0p_4G0p_4G0p_4D0p_4G0p_4B,0p_4G0p_4D0p_4G0p_4D0p_4G0p_4J60p_4D0-]4B,1:,4G0p_4B,0p_4D0p_4D0-]4B,0-]4G1:,4J60-]4G0-]4D1:,4G0-]4J60p_4J60p_4B,0p_4G0-]4B,0-]4D0p_4B,0-]490p_4?\0p_4<0p_4B,0p_4B,0p_4D0p_4?\0p_4D0p_4?\0p_4?\0p_4B,0p_4B,0p_4G0p_4G0p_4G0p_4D0p_4J60p_4G0p_4G0p_4B,0p_4G0p_4J60p_4D0p_4G0p_4D0p_4D0p_4J60-]4G0p_4D0-]4B,0p_4?\0p_4?\0-]4B,0p_4B,0p_4D1:,4?\1:,4D0p_4?\0p_4B,0p_4D0-]4D0p_4Mpd0p_4D0p_4D0p_4G0p_4B,1:,4D0-]4B,0-]4D0p_4D0-]4D0p_4D0-]4D0p_4D1:,4D0-]4D0-]4J60p_4?\0p_4B,0p_4B,0p_4D0p_4D0p_4D0p_4G0p_4G0p_4G0p_4?\0p_4D0p_4B,0p_4?\0p_4D0p_4B,0p_4J60p_4G0p_4J60p_4J60p_4G0p_4J60p_4Mpd0-]4PCR0p_4J60p_4G0p_4Mpd0p_4G0-]4J60p_4G0p_4G0p_4PCR0p_4J60p_4J60p_4J60p_4Mpd0p_4J60p_4Mpd0p_4Mpd0p_4J60p_4J60p_4G0p_4Mpd0p_4Mpd0p_4Mpd0p_4J60p_4Mpd0p_4Mpd0p_4Mpd0p_4J60p_4G0p_4J60p_4J60p_4G0p_4J60p_4J60p_4J60p_4Mpd0p_4Mpd0p_4J60p_4G0p_4J60p_4Mpd0p_4Mpd0p_4Mpd0p_4Mpd0p_4Mpd0p_4J60p_4Mpd0p_4Mpd0p_4J60-]4Mpd0p_4Mpd0p_4J60-]4Mpd0p_4Mpd0p_4J60p_4Mpd0p_4G0p_4G0p_4Mpd0p_4G0p_4Mpd0p_4G0p_4D0p_4B,0p_4G0p_4B,0p_4D0p_4B,0p_4B,0p_4D0p_4G0p_4D0p_4?\0p_4J60p_4D0p_4D0p_4B,0p_4B,0p_4D0p_4B,0p_4D0p_4B,0p_4B,0p_4G0p_4<0p_4D0p_4D0p_4B,0p_4B,0p_4B,0p_4B,0p_4D0p_4D0p_4B,0p_4B,0p_4B,0p_4B,0p_490p_490p_490p_4?\0p_46t0p_4?\0p_490p_490p_490p_490p_490p_490p_490p_46t0p_4?\0p_4?\0p_4?\0p_4D0p_4<0p_4<0p_4B,0p_4B,0p_4B,0p_4<0p_4B,0p_4?\0p_4B,0p_4<0p_4?\0p_4<0p_4?\0p_4?\0p_4<0p_490p_490p_440p_46t0p_4?\0p_4<0p_46t0p_490p_4<0p_490p_4<0p_490p_46t0p_4<1:,4<0p_490-]490-]46t0-]490p_490p_490-]46t0p_46t0p_4<0p_4?\0p_490p_4?\0p_490p_490p_4<0p_490p_490p_490p_490p_4<0p_4<0p_4?\0p_4?\0p_4<0p_4<1:,4B,0p_4?\0p_4<0-]4<0-]4B,0p_4<0p_4<0p_4?\0p_4<0p_4<0p_4<0p_4?\0p_4<0p_4?\0p_490p_4<0-]490p_4<0p_490p_490p_490p_4<0p_4?\0p_46t0p_4<0p_4<0p_4?\0p_440p_4<0p_4?\0p_4G0p_4<0p_4B,0p_4G0p_4D0p_4?\0p_4?\0p_4?\0p_4D0p_4<0p_4B,0p_4<0p_4B,0p_4?\0p_4?\0p_4<0p_490p_4B,0p_4<0p_4<0p_4?\0p_4B,0p_490p_4B,0p_4<0p_4<0p_4<0p_4<0p_4B,0p_4<0p_4?\0p_4<0p_4?\0p_4<0p_4<0p_4?\0p_4<0p_4?\0p_4?\0p_4<0p_4?\0p_4?\0p_4<0p_4?\0p_4?\0p_4<0p_4<0p_4<0p_4<0p_4?\0p_4B,0p_490p_4<0p_490p_4?\0p_4?\0p_4?\0p_4<0p_4<0p_4<0p_4B,0p_4<0p_490p_46t0p_4?\0p_4D0p_4G0p_4?\0p_4D0p_4D0p_4?\0p_4B,0p_4D0p_4D0p_4B,0p_4D0p_4B,0p_4B,0p_4?\0p_4B,0p_4D0p_4D0p_4D0p_4D0p_4D0p_4<0p_4<0p_4?\0p_4?\0p_4?\0p_4?\0p_4?\0p_4?\0p_4B,0p_4B,0p_4B,0p_4<0p_4?\0p_4?\0p_490p_4B,0p_4B,0p_4B,0p_4G0p_4B,0p_4B,0p_4B,0p_4D0p_4B,0p_4G0p_4B,0p_4B,0p_4B,0p_4D0p_4B,0p_4?\0p_4B,0p_4D0p_4G0p_4D0p_4D0p_4D0p_4B,0p_4B,0p_4D0p_4D0p_4B,0p_4G0p_4D0p_4D0p_4D0p_4B,0p_4D0p_4D0p_4B,0p_4D0p_4B,0p_4Mpd0p_4G0p_4J60p_4G0p_4Mpd0p_4G0p_4G0p_4Mpd0p_4Mpd0p_4G0p_4Mpd0p_4G0p_4J60p_4G0p_4PCR0p_4G0p_4G0p_4G0p_4B,0p_4D0p_4D0p_4G0p_4G0p_4B,0p_4G0p_4D0p_4B,0p_4G0p_4B,0p_4J60p_4D0p_4D0p_4G0p_4D0p_4B,0p_4G0p_4J60p_4D0p_4D0p_4D0p_4G0p_4B,0p_4G0p_4B,0p_4B,0p_4?\0p_4D0p_4D0p_4<0p_490p_4?\0p_4B,0p_4?\0p_4?\0p_4<0p_4<0p_4<0p_4?\0p_4B,0p_4<0p_4B,0p_4<0p_4?\0p_4?\0p_4B,0p_4?\0p_4<0p_4?\0p_4?\0p_490p_4B,0p_4<0p_4?\0p_4?\0p_4?\0p_4<0p_4<0p_4?\0p_490p_4?\0p_4?\0p_4?\0p_4B,0p_4<0p_490p_4?\0p_4B,0p_4B,0p_4<0p_4B,0p_4<0p_4B,0p_4?\0p_4G0p_4?\0p_4?\0p_4G0p_4?\0p_4D0p_4B,0p_4B,0p_4D0p_4D0p_4?\0p_4?\0p_4G0p_4B,0p_4B,0p_4D0p_4B,0p_4B,0p_4D0p_4D0p_4D0p_4?\0p_4B,0p_4G0p_4B,0p_4D0p_4B,0p_4B,0p_4G0p_4B,0p_4B,0p_4D0p_4D0p_4B,0p_4B,0p_4B,0p_4G0p_4D0p_4D0p_4B,0p_4D0p_4G0p_4?\0p_4J60p_4J60p_4J60p_4Mpd0p_4G0p_4D0p_4D0p_4D0p_4D0p_4D0p_4D0p_4?\0p_4?\0p_4D0p_4B,0p_4B,0p_4D0p_4?\0p_4B,0p_4B,0p_4G0p_4D0p_4B,0p_4?\0p_4B,0p_4B,0p_4D0-]4B,0p_4D0-]4D1:,4B,0-]4G14D14G14G134J6134J614Mpd0p_4Mpd1:,4J60p_4Mpd0p_4J61:,4J60p_4PCR0p_4PCR0p_4J60p_4Mpd0p_4J60p_4J60p_4PCR0p_4Mpd0p_4Mpd0p_4Mpd0p_4J60p_4Mpd0p_4Mpd0p_4J60p_4Mpd0p_4PCR0p_4J60p_4PCR0p_4J60p_4J60p_4J60p_4PCR0p_4PCR0p_4Mpd0p_4Mpd0p_4PCR0p_4J60p_4Mpd0p_4Mpd0p_4S0p_4Mpd0p_4S0p_4S0p_4PCR0p_4U0p_4S0p_4PCR0p_4PCR0p_4U0p_4S0p_4U0p_4S0p_4S0p_4PCR0p_4U0p_4S0p_4S0p_4S0p_4S0p_4X0p_4PCR0p_4X0p_4PCR0p_4S0p_4U0p_4S0p_4S0p_4S0p_4X0p_4PCR0p_4PCR0p_4S0p_4X0p_4S0p_4S0p_4PCR0p_4X0p_4S0p_4PCR0p_4S0p_4U0p_4S0p_4S0p_4S0p_4U0p_4S0p_4U0p_4U0p_4U0p_4U0p_4U0p_4PCR0p_4X0p_4U0p_4U0p_4X0p_4PCR0p_4U0p_4S0p_4U0p_4U0p_4X0p_4U0p_4S0p_4X0p_4U0p_4U0p_4U0p_4X0p_4X0p_4X0p_4X0p_4X0p_4U0p_4X0p_4X0p_4U0p_4X0p_4S0p_4[0p_4X0p_4X0p_4[0p_4X0p_4X0p_4X0-]4X0p_4X14[0p_4^V0p_4[0p_4c0p_4^V0p_4^V0p_4[0p_4X0p_4X0p_4[0p_4X0p_4X0p_4X0p_4X0p_4[0p_4X0p_4X0p_4[0p_4X0p_4X0p_4X0p_4[0p_4[0p_4U0p_4^V0p_4U0p_4U0p_4^V0p_4U0p_4X1:,4[0-]4^V0p_4[0p_4[0p_4^V0p_4X0p_4X0p_4X0p_4[0p_4X0p_4[0p_4a)0p_4[0p_4[0p_4X0p_4[0p_4X0p_4c0p_4[0p_4[0-]4a)0-]4[14X1:,4[14[1:,4X0-]4[0p_4[0p_4^V0p_4X0-]4X0p_4[0p_4a)0p_4X0p_4^V0p_4X0p_4[0p_4[0p_4[0p_4[0p_4X0p_4X0p_4[0p_4[0p_4^V0p_4^V0p_4[0p_4[0p_4[0p_4^V0p_4^V0p_4[0p_4[0p_4c0p_4c0p_4a)0p_4c0p_4c0p_4a)0p_4c0-]4^V0p_4a)0-]4[0-]4^V1:,4^V0p_4^V0-]4a)0-]4^V0p_4a)0p_4^V0p_4[0-]4[1:,4^V14^V17r4a)0-]4a)0p_4[0-]4X0p_4[0-]4[0-]4[0p_4[0p_4X0p_4[0-]4[0p_4X0-]4[0-]4[0p_4[0p_4^V0p_4[0p_4^V0p_4U0p_4[0p_4^V0p_4^V0p_4[0p_4^V0p_4[0p_4[0p_4[0p_4[0p_4a)0p_4[0p_4a)0p_4[0p_4^V0p_4^V0p_4[0p_4^V0p_4a)0p_4a)0p_4^V0p_4c0p_4^V0p_4c0p_4^V0p_4a)0p_4c0p_4a)0p_4^V0p_4c0p_4c0p_4^V0p_4c0p_4fB0p_4a)0p_4c0p_4fB0p_4fB0p_4fB0p_4fB0p_4i00p_4lm^0p_4fB0p_4lm^0p_4lm^0p_4i00p_4i00p_4i00p_4lm^0p_4i00p_4fB0p_4i00p_4i00p_4lm^0p_4lm^0p_4fB0p_4i00p_4i00p_4o=0p_4rz0p_4lm^0p_4rz0p_4i00p_4rz0p_4rz0p_4rz0p_4rz0p_4rz0p_4t0p_4t0p_4w0p_4o=0p_4o=0p_4t0p_4rz0p_4rz0p_4rz0p_4rz0p_4t0p_4}S0p_4w0p_4rz0p_4z0p_4rz0p_4rz0p_4t0p_4w0p_4t0p_4rz0p_4z0p_4t0p_4w0p_4t0p_4w0p_4w0p_4t0p_4w0p_4z0p_4t0p_4rz0p_4z0p_4w0p_4t0p_4z0p_4w0p_4z0p_4w0p_4t0p_4w0p_4}S0p_4w0p_4}S0p_4}S0p_4z0p_4z0p_4z0p_4}S0p_40p_4w0p_4w0-]4}S0p_4}S0p_4z0p_4}S0p_4}S0p_40p_4{0p_40p_40p_40p_4{0p_4z0p_40p_40p_4{0p_4z0p_40p_4{0p_4{0p_40p_4{0p_40p_4{0p_4{0p_4}S0p_40p_4}S1:,4}S0p_40-]40-]40p_40-]4{0p_4{0p_4}S0p_40p_4{0p_40p_40p_4{0p_40p_40p_4}S0p_4{0p_40p_40p_4{0p_40p_40p_4C0p_4{0p_4K0p_4K0p_4K0p_40p_40p_4K0p_4{1:,4K0-]40p_4K0p_4K0p_4C0p_4Z0p_4Z0p_4Z0p_4V0p_4Z0p_4Z0p_4V0p_4q0p_4V0p_4V0-]4V0-]4V0-]40-]4q0-]4V1:,4V0p_4'0-]4Z1:,40p_4V0p_4'0p_4q1:,41:,41:,4V1:,4V0-]4V0-]40p_41:,4V0-]4q0-]4'0p_4q0p_4V14V0p_40-]4V1:,40-]40-]41:,4V0p_41:,4q0p_4V0p_4V0p_4V0-]40p_4q0-]4q0p_40p_4q0p_4V0p_4Z0p_4q0p_40p_4q0p_4'0p_4'0p_4V0p_4V0p_4q0p_4Z0p_4V0p_4V0p_4V0p_4Z0p_4V0p_4q0p_4q0p_40p_4q0p_40p_4Z0p_4V0p_4'0p_4q0p_4q0p_4V0p_4V0-]4q0p_40p_4q0p_40p_4V0p_40p_4V0p_40p_4V0p_40p_4q0p_4V0-]4V1:,4V1:,40p_4V0-]4V0p_4V0p_4q0p_4V0p_4'0p_4V0p_4V0p_4V0p_40p_4q0p_40p_40p_4q0p_4q0-]4q0p_4Z0p_4C0-]4q0p_4Z0p_4q0p_4q0p_40p_4Z0p_4C0p_4C0p_4Z0p_4C0p_4C0p_4V0p_4Z0p_4Z0p_4V0p_40p_4Z0p_4V0p_4q0p_4q0-]4q0p_4C0p_4q0p_4q0p_4q0p_4V0p_40p_40p_4V0p_4q0p_40p_40p_4'0p_4'0p_40-]4V0-]4V0p_4'0-]40-]41:,41:,40-]40-]4'0-]4'0p_4'0p_4V1:,4'0-]4'0-]40-]40p_4Z1:,4q141:,41:,4'0-]40-]4'0p_41:,41:,4'0p_41:,4'0-]40p_4'0p_4'0-]4'0-]40-]41:,4V14V0-]4'14`0-]4V14'14134V1:,4V1:,4q14q1:,4Z14q0p_4Z0p_4q0p_4Z0p_4Z0-]4q1:,4Z1:,4q0-]4q1:,4V0-]4q14Z134Z14Z134V14Z14Z134q14V1:,4q14V1:,4q1:,4Z1:,4q14q1:,4q1:,4C14q1:,4q1:,4K13414Z14q1:,4Z14q0-]41:,4q134V1:,414134'1:,4'134V1341:,40-]4q1:,4V1:,4V0-]4q1:,4'1341:,4q17r4V14q1414q134V1:,4134134V1414q1:,4V17r4q14C14Z13414q1:,4V0p_4q0-]4q1:,4V13414Z17r4'14q134V0-]4q1:,4V0-]4V1:,4q0-]4q1:,4q0-]40-]41:,4'0-]41:,40-]40-]40p_4'0p_40p_40p_40p_4'0p_40p_40p_4'0p_40p_40p_40-]40p_40p_4V0p_4'1:,4V0p_4V0p_4V0p_40p_40p_40p_40p_40-]4'0p_4V0-]4'0p_41:,40-]40p_41:,41:,4'1414'141:,4'141:,4V140-]4'1:,4141:,4V14'1:,4q1:,4'0p_4q0p_4'0p_4V0p_40p_40p_40p_4'0p_40p_4V0p_4'0p_4V0p_40p_4'0p_4'0p_4'0p_40p_40p_40p_4'0-]4'0p_40p_4'0p_4'0p_40p_40p_40p_4'0p_4'0p_4'0p_4'0p_40p_40p_40p_40p_4'0p_4'0p_40p_4'0p_40p_4'0p_40p_40p_4'0p_4'0p_40p_4`0p_4'0p_4'0p_4'0p_40p_4'0p_4'0p_40p_4'0p_40p_4'0p_40p_40p_40p_40p_40p_40p_40p_4'0p_40p_40p_4'0p_4'0p_4'0p_40p_40p_4'0p_40p_4'0p_40p_4`0p_4'0p_4'0p_4'0p_40p_40p_40p_4'0p_4'0p_40p_4'0p_4'0p_4'0p_40p_40p_40p_4'0p_40p_40p_4'0p_4'0p_40-]40p_40p_40p_40p_4`0p_420p_40p_40p_40p_40p_4'0p_4`0p_40p_40p_40p_40p_40p_4'0p_40p_40p_40p_4'0p_40p_40p_4'0p_40p_40p_4`0p_4'1:,40p_4'0p_40p_4'0p_4'0p_4q0p_4'0p_40p_40p_4'0p_4'0p_40p_4'0p_40p_4'0p_40p_40p_40p_40p_40p_4'0p_4'0p_40p_4'0p_4'0p_40p_4'0p_40p_40p_40p_40p_4'0p_40p_40p_40p_4'0p_40p_4'0p_40p_40p_40p_40p_40p_40p_40p_40p_40p_4'0p_4'0p_40p_40-]40p_40-]40p_40p_40p_4'0p_40p_4'0p_40p_40p_4'0p_40p_40p_4'0p_40p_4'0p_4'0p_4'0p_4'0p_40p_40p_40p_40p_40p_40p_40p_40p_40p_40p_4'0p_40p_40p_40p_40p_40p_4'0p_4'0-]40p_4'0p_40p_4'0p_40p_4'0p_40p_4`0p_40p_40p_40p_4`0p_40p_40p_40p_40p_4`0p_40p_40p_40p_4'0p_40p_40p_40p_40p_4`0p_40-]40p_40p_4'0p_40p_40p_40p_4`0p_4'0p_420p_40p_40p_420p_4`0p_420p_420p_40p_40p_420p_4'0p_40p_4'0p_40p_40p_40p_40p_40p_4'0p_40p_40p_4'0p_40p_4'0p_40-]40p_40p_4`0p_40p_40p_40p_4'0p_4'0p_40p_4'0p_40p_4'0p_40p_40p_40p_40p_40p_40p_40p_40p_40p_40p_40p_4'0p_4'0p_4'0p_4V0p_40p_4'0p_40p_40p_40p_42I0p_40p_4`0p_40p_4`0p_4`0p_4`0p_420p_42I0p_420p_420p_420p_42I0p_42I0p_420p_4`0p_4`0p_42I0p_4`0p_42I0p_42I0p_4`0p_40p_420p_4`0p_4`0p_4`0p_40p_4`0p_4`0p_4`0p_4`0p_4`0p_4`0-]4`0p_4`0p_42I0-]420p_40p_40p_4`0p_4`0p_40p_4`0p_4`0p_4`0p_40p_420p_40p_4'0p_40p_40p_40p_40p_40p_4'0p_40p_40p_4'0p_4'0p_40p_40p_40p_40p_4'0p_40p_40p_40p_40p_4'0p_40p_40p_40p_4`0p_40p_40p_40p_4`0p_40p_4`0p_40p_40p_40p_4`0p_40p_40p_40p_420p_4`0p_4`0p_4`0p_40p_420p_4`0p_4`0p_40p_40p_4`0p_40p_40p_40p_40p_40p_4'0p_40p_40p_4`0p_40p_40p_40p_40p_40p_40p_40p_40p_4`0p_40p_40p_4`0p_4`0p_420p_40p_4`0p_40p_4`0p_4`0p_420p_40p_4`0p_40p_40p_420p_40p_40p_420p_420p_42I0p_420p_420p_42I0p_420p_420p_4`0p_420p_42I0p_420p_42I0p_42I0p_420p_420p_4`0p_42I0p_42I0p_420p_420p_40p_420p_42I0p_420p_40p_40p_40p_4`0p_4`0p_40p_40p_4`0p_4`0p_4`0p_4`0p_4`0p_4`0p_420p_4`0-]420p_4`1:,42I0p_420p_4`0p_420p_40p_420p_4`0p_420p_420p_4`0p_420p_4`0p_42I0p_4`0p_4`0p_420p_420p_4`0p_4`0p_4`0p_4`0p_42I0p_420p_420p_42I0p_4`0p_420p_42I0p_4`0p_420p_4`0p_4`0p_42I0p_42I0p_4`0p_40p_40p_4`0p_4`0p_40p_4`0p_420p_4`0p_420p_420p_4`0p_4`0p_4`0p_40p_420p_420p_40p_420p_40p_4`0p_4'0p_4`0p_420p_42I0p_4`0-]420p_4`0p_4`0p_4`0p_40p_4`0p_4`0p_40p_40p_40p_4'0p_40-]40p_40p_4'0p_4`0p_420p_40p_42I0p_40p_4`0p_420p_40-]420p_40p_40p_40p_420p_40p_40p_40p_4'0p_420p_40p_40p_4`0p_40p_40p_40p_4`0p_40p_4'0p_40p_40p_40p_40p_4'0p_4'0p_40p_40p_4'0p_40p_40p_4'0p_40p_40p_40p_40p_40p_4'0p_4'0p_40p_40p_4'0p_4'0p_40p_40p_4'0p_40p_40p_40p_40p_40-]40-]40p_40p_4'0p_40p_40p_4'0p_4'0p_40p_40p_4'0p_4V0p_4V0p_4'0p_4V0p_40p_4'0p_4'0p_4'0p_4'0p_40p_4'0p_4'0p_40p_40p_4'0p_40p_4'0p_40p_4'0p_40p_4'0p_4'0p_40p_4'0p_4'0p_40p_4'0p_4V0p_40p_40p_40p_4'0p_4'0p_40p_40p_40p_40p_4`0p_40p_40p_40p_4`0p_40p_40p_4`0p_40p_40p_40p_40p_40p_40p_40-]420p_4`0p_40p_40p_40p_4`0p_4`0p_40p_4`0p_4`0p_4`0p_40p_4`0p_4`0p_40p_4`0p_40p_4`0p_420p_40p_4`0p_420p_4`0p_420p_4`0p_4`0p_4`0p_420p_40p_4`0p_40p_40p_40p_4'0p_40-]414`1:,414`140-]40-]40p_40p_40-]4141:,41:,414141:,4`1:,40p_40p_40p_40-]40p_40-]42I1:,420p_4'14`1417r4`0-]4`0p_40p_41:,4`0-]4`0p_4`0p_40-]40-]4`0p_41:,4`0p_40p_40p_4`0p_40p_4'0p_40p_40p_4'0p_40p_40p_4`0p_420p_42I0p_4`0p_40p_42I0p_4`0p_420p_4`0p_40p_40p_4`0p_4`0p_4`0p_4k0p_42I0p_40p_4`0p_4`0p_42I0p_40-]42!'4`0p_40-]40p_4k0p_4k0p_40p_4k0p_40p_4k0p_4k0p_40p_4=|0p_40p_40p_40p_40p_4k0p_4=|0p_4=|0p_40p_40p_4 0p_4 0p_4w!0p_4=|0p_4w!0p_4w!0p_4w!0p_480p_480p_4w!0p_4GO0-]4w!0p_4GO0p_480p_4w!0p_40p_480p_40p_40p_480p_40p_40p_40p_4GO0p_4GO0p_480p_480p_4GO0p_40p_4GO0p_40p_40p_40p_4GO0p_40p_4GO0p_40p_40p_40p_40p_40p_40p_40p_40p_40-]40p_40p_40p_4k0p_40p_4k0p_4k0p_40p_4k0p_40p_4k0p_4k0p_4R0p_40p_40p_4"0p_4"0p_4R0p_4'0p_4"0p_4"0p_40p_4k0p_40p_40p_4R0p_414"0-]4'0p_4"0p_4R0p_4'0p_4"0p_40p_40p_4"0p_4"0-]4"1:,4"0-]4"0-]4>0p_4'134\U134"14>1414>14>14\U134\U14>14\U1:,4>14\U14\U134>0p_40p_4\U1:,4>134\U13413417r4-0-]4q0-]4141:,4-134-141:,4-134-134>14>17r4\U134>134>13417r4>17r4>134"13417r4134>14\U1:,4'1:,4>1:,4>0p_4>14>14134134'17r4134\U17r4-1:,414-1:,40p_4\U0-]40p_4134-17r4\U1417r4-13414-17r4\U14-141:,4\U141:,4134>134Z1:,4Z14\U14\U14'1:,4'141:,4134-17r4Z14g134q14Z14q134q1:,4-0-]4g0p_4g0-]4-0p_4-0-]4-0-]4-0p_4-1:,4q141:,4134q1:,4-14134-0-]41:,4-1:,414-14Z1:,4-1:,4-14Z1:,41414-14134-1:,4-14-134-134Z17r4\U134Z14-134Z13414-17r4Z17r4Z17r4-17r4Z134-17r4Z134-17r417r4-134-17r414-14134-14-14Z134q14Z0p_4-0p_4-0p_40p_4q0-]4-0-]4-0p_4-0-]4\U0p_4Z0-]40p_4-14-141417r4Z134-1:,4134-14-1414\U14\U141341414Z134\U1:,4134\U1:,4134-1:,4\U13414134\U140-]40-]40-]4>0-]40p_4\U0p_40p_40p_4\U0p_4>0p_40p_4\U0p_4\U0p_4\U0p_4\U0p_4\U0p_4'0p_4>0p_4\U0p_4>0p_4>0p_4'0p_4'0p_4>0p_4'0p_4"0p_4"0-]4"1:,4'1:,4>0-]4"0p_4>0-]4'0p_40p_4"0p_4'0p_4'0p_4"0p_4"0p_4"0p_4"14"0p_4"0-]40p_40p_4"0-]40p_4"0p_40p_4R0p_4"0p_4"0p_40p_4"0-]41:,40-]4"1:,4140-]4141:,40p_41:,40p_40-]4k1:,4R0p_4k0-]4R0p_40p_4k0p_4k0p_4R0p_4R0p_40p_4R0p_4k0p_40p_4k0p_41:,4k0p_4k0p_4R0-]4k0p_4k0-]40-]41:,40p_4k0-]40p_40-]40p_40p_40p_40-]40p_41:,40-]4k1:,40p_4GO0-]41:,40-]41:,40-]4k0-]40p_40p_40p_40p_4k0p_40p_4k1:,4R0p_40p_4k0p_40p_40p_40p_4k0p_4k0p_4k0p_4k0p_40p_40p_40p_4k0p_4k0p_4k0p_4k0p_40p_40p_4k0p_4k0p_40p_40p_40p_4k0p_40p_4R0p_40p_40p_4R0-]40p_4k0p_40p_40p_4k0p_40p_40p_40p_40p_40p_40p_40p_4R0p_40p_40p_40p_40p_40p_40p_40p_40p_40p_40p_40p_40p_40p_40p_40p_4GO0p_40p_40p_40p_4GO0p_40p_4GO0p_4GO0p_4GO0-]4GO0p_480p_4GO0p_40p_40p_4GO0p_4GO0p_4GO0p_480p_40p_480p_480p_4w!0p_40p_4w!0p_480p_4w!0p_4w!0p_4w!0p_4w!0-]4w!0p_4w!0p_4w!0p_4 0p_4w!0p_4w!0p_4 0p_4=|0p_4 0p_4 0p_4 0p_4 0p_4w!0p_4w!0p_4 0p_4w!0p_4w!0p_40p_4w!0p_4 0p_4 0p_40p_4w!0p_4 0p_4 0p_4 1:,40p_4w!0p_4w!0p_4=|0p_4 0p_4w!0p_4 0p_40p_4w!0p_40p_4w!0p_4 0p_4 0p_4 0p_4 0p_4 0p_40p_4w!0p_40p_4 0p_40p_4 0p_4=|0p_40p_4=|0p_4=|0p_40p_40p_4=|0p_4=|0-]4=|1:,4=|0p_4k0p_4=|0p_4k0-]4=|0p_4k0p_40p_40p_4k0p_4k0p_4`0p_4k0p_4`0p_40p_4k0p_4k0p_4k0p_40p_4k0p_40p_40p_4k0p_4k0p_40p_4k0p_40p_40p_40p_40p_4k0p_40p_40p_4k0p_4k0p_4k0p_4k0p_40p_4`0p_4`0p_40p_40p_40p_40p_40p_4k0p_40p_4k0p_40p_4k0p_40p_40-]4k0p_40p_40p_4k0p_4k0p_40p_4k0p_4k0p_40-]4k0p_4k0p_40p_40p_40p_40p_40p_4=|0p_40p_41:,4k0p_40p_4k0p_40p_4k0p_40p_40p_4k0p_4k0p_4k0p_4k0p_4k0p_40-]40p_40p_4k0p_40p_4k0p_4k0p_4k0p_4=|0p_4k0p_4k0p_4=|0p_4k0p_40p_40p_40p_4k0p_40p_4=|0p_40p_41:,4k0p_40p_4k0p_4=|1:,40p_414=|0p_4k0-]4k0p_4k0p_40p_4k0p_4k0p_4k0p_4k1:,4k1:,41:,4k0p_40p_4k0p_4k0p_4k0p_40p_4k0p_4=|0p_4=|0p_4k0p_4k0p_40p_4=|0p_4k0p_4k0p_40p_4k0p_4k0p_4k0p_40p_4k0p_40p_40p_4`0p_40p_40p_40p_4k0p_4k0p_40p_40p_40p_41:,4k0-]4`0p_420p_42I0p_4`0-]42I0p_4`0-]4`0-]42I1:,42I1:,42I0p_4`1:,42I0p_42I0p_4`0p_420p_4`0-]42I0p_42I0p_4`0p_42I0p_4`0p_42I1:,4`142I1:,4`1:,420-]42I0-]42I0-]42I0-]4`1:,421:,42I0-]42I0p_42I0p_4`0-]42I1:,40p_42I0p_420p_4`0p_42I0p_40p_42I0p_4`0p_420p_4`0p_42I0p_4`0p_420p_4`0p_40p_4`0p_4`0p_40p_40p_42I0p_42I0p_42I0p_4`0p_42I0p_4`0p_4`0p_4`0p_42I0p_4`0p_42I0p_4`0p_40p_4`0p_42I0p_4`0p_42I0p_4`0p_42I0p_420p_4`0p_42I0p_40p_420p_4`0p_40p_42I0p_420p_42I0p_4`0p_42I0p_4`0p_42I0p_420p_4`0p_4`0p_42I0p_4`0p_42I0p_4`0p_42I0p_42I0p_42I0-]420-]420p_40p_420p_4`0-]4`0p_4'0p_4'0p_40p_40p_40p_40p_40p_40p_40p_4`0p_40p_4'0p_40p_40p_40p_4`0p_40p_40-]4'0p_40p_40p_4'0-]4`0p_4'0p_40p_40p_40p_40p_4'0p_40p_40p_40p_40p_4'0p_4`0p_40p_40p_40p_40-]40p_40p_40p_40-]40p_40p_40p_40p_40p_40p_4`0p_40p_40p_40p_40p_40p_40p_40p_40p_40p_4'0p_40p_40p_4'0p_40p_40p_4'0p_4C0p_4q0p_40p_40p_40p_4q0p_4'0p_4V0p_40p_40p_40p_40p_4q0p_4'0p_4q0p_4V0p_40p_4V0p_4q0p_40p_4'0p_4V0p_40p_40p_40p_4'0p_40p_4'0p_40p_4'0p_40p_4V0p_40p_4'0p_4'0p_40p_4V0p_4V0p_4'0p_40p_40p_40p_40p_40p_40p_40p_40p_4V0p_40p_40p_40p_4q0p_4V0p_40p_4V0p_40p_4q0p_4V0p_4V0p_40-]4V0-]4V0-]40-]40p_40p_4V0p_4V0p_40p_40p_4V0p_4V0p_4q0p_4V0p_4'0p_4V0p_4V0p_40p_4q0p_40p_40p_4'0p_40p_40-]40p_4V0p_4V0p_40p_4V0p_4V0p_40p_4V0p_4Z0p_4q0p_40p_40p_4V0p_40p_40p_40p_4V0p_40p_4V0p_4V0p_4V0p_4V0p_40p_40p_4V0-]4q0-]4q0p_4q0p_4q0p_4V0p_4V0p_40p_4Z0p_4V0p_40p_40p_4q0p_4q0p_4V0p_4Z0p_40p_40p_4q0p_4q0p_4Z0p_4C0p_40p_40p_4C0p_40p_4C0p_4C0p_40p_4Z0p_40p_4Z0p_4Z0p_4Z0p_4q0p_40p_4Z0p_4C0p_4C0p_4C0p_40p_4q0p_4Z0p_4C0p_4V0p_4q0p_4Z0p_4C0p_4Z0p_4C0p_4Z0p_40p_4Z0p_4q0p_4C0p_4Z0p_4Z0p_4Z0p_4C0p_4C0p_4Z0p_4Z0p_4C0p_4Z0p_4C0-]4C14q1:,4C1:,4Z0-]4C1:,4C0-]4C1:,4Z1:,4C0-]4C1:,4C0p_4Z0p_40-]4q0p_4C0p_4C0p_4Z0-]4C0-]4q0p_4Z0p_4C0p_4Z0p_4Z0p_4q0p_4q0p_4q0p_4C0p_4Z0p_40p_4q0p_4Z0p_4q0p_4V0p_4Z0p_4Z0p_4Z0p_4C0p_4C0p_40p_4q0p_4Z0p_4V0p_4q0p_4Z0p_4Z0p_4C0p_4Z0p_4Z0p_4Z0p_4V0p_4Z0p_4Z0p_4C0p_4q0p_4C0p_40p_4Z0p_4Z0p_4C0p_4C0p_4Z0p_4C0p_40p_4C0p_4Z0p_4C0p_40p_4C0p_4C0p_4Z0p_4K0p_4C0p_40p_4V0p_4Z0p_4V0p_4C0p_4C0p_4q0p_4q0p_4Z0p_4Z0p_4q0p_4q0p_4Z0p_4q0p_4Z0p_4q0p_4C0p_4Z0p_4C0p_4C0p_40p_4C0p_4Z0p_4C0p_4Z0p_4Z0p_4Z0p_4C0p_4Z0p_4C0p_4C0p_4C0p_4Z0p_4C0p_4C0p_4q0p_4C0p_40p_4C0p_4C0p_40p_4q0p_4C0p_4Z0p_40p_4C0p_4K0p_40p_40p_4C0p_4Z0p_4C0p_40p_4C0p_4C0p_4C0p_4C0p_40p_4C0p_4Z0p_40p_40p_40p_40p_4Z0p_40p_40p_4C0p_40p_4C0p_40p_4C0p_4Z0p_4Z0p_4q0p_4C0p_4Z0p_40p_4Z0p_4Z0p_4q0p_4q0p_4Z0p_4V0p_4C0p_4Z0p_4Z0p_4V0p_4Z0p_4q0p_4C0p_4q0p_4Z0p_4Z0p_4q0p_4Z0p_40p_4Z0p_4q0p_4q0p_4C0p_4Z0p_4Z0p_4C0p_40p_4C0p_4Z0p_4Z0p_4K0p_4Z0p_4C0p_4C0p_40p_4K0p_4Z0p_4K0p_4K0p_40p_4K0p_4K0p_4K0p_40p_4K0p_4K0p_4K0p_4K0p_40p_4K0p_40p_40p_40p_40p_4K0p_4Z0p_40p_4K0p_40p_4K0p_4Z0p_40p_4Z0p_40p_40p_4C0p_4C0p_4Z0p_4C0p_4C0p_40p_4Z0p_40p_4Z0p_4C0p_4K0p_40p_40p_4K0p_40p_4K0p_4K0p_4K0p_40p_40p_40p_4Z0p_40p_4C0p_4C0p_40p_4C0p_4Z0p_40p_40p_41:,4C0-]4C0p_4K0p_40p_4C0p_40p_4K0p_4q0p_40p_40p_40p_4K0p_4C0p_4K0p_40p_4C0p_4K0p_40p_40p_4K0p_40p_41:,4K0p_4K0p_4K0p_40p_4K0p_4K0p_4K0p_4K0p_4K0p_40p_40p_40p_40p_4{0p_4K0p_4K0p_4K0p_4K1:,41:,40p_4{0p_4{0p_40p_4{0p_4{0p_4{0p_40p_4{0p_4{0p_40-]40p_40p_40p_4{0p_40p_4{0p_4{0-]4{0p_4{0p_40p_4{0p_4{0p_40p_40p_4{0-]40p_4{0p_40p_4{0p_4}S0p_4{0p_40p_4K0p_40p_4{0p_40p_40p_40p_40p_4K0p_40p_4K0p_40p_4{0p_4K0p_40p_4K0p_40p_40p_4}S0p_4K0p_4{0p_40p_40p_4{0p_40p_4z0p_40p_4}S0p_4{0p_40p_40p_4{0p_4z0p_40p_40p_4{0p_40p_4{0p_40p_40p_4}S0p_40p_40p_40p_40p_40p_4}S0p_40p_40p_4}S0p_40p_40p_4}S0p_4}S0p_40p_4}S0p_4{0p_4z0p_4{0p_4{0p_4}S0p_4{0p_4}S0p_40p_40p_4z0p_4}S0p_40p_4}S0p_4}S0p_40p_40p_4}S0p_4}S0p_4}S0p_4z0p_40p_4z0p_40p_4z0p_4{0p_4}S0p_40p_40p_40p_4z0p_4z0p_4}S0p_40p_4z0p_40p_4}S0p_4}S0p_4}S0p_4}S0p_4z0p_40p_4z0p_4}S0p_4{0p_4z0p_40p_40p_40p_4}S0p_4z0p_40p_4z0p_40p_4z0p_40p_4}S0p_4}S0p_4z0p_40p_4w0p_4}S0p_4z0p_4z0p_4}S0p_4z0p_4z0p_4z0p_4z0p_4}S0p_40p_4}S0p_4z0p_4}S1:,4z0p_4}S1:,4}S1:,4z14z1:,4w134}S17r4}S14}S14}S140-]41:,4}S0p_40p_4}S0p_4{0p_40p_4}S0p_4}S0p_40p_40p_4{0p_4}S0p_40p_4}S0p_40p_4}S0p_40p_40p_4}S0p_4}S0p_4z0p_4}S0p_40p_4}S0p_40p_40p_4}S0p_40p_4{1:,40-]40-]41:,4{0p_41:,4{0-]4K1:,4{0p_40-]4{0p_40p_4{0p_4{0p_414{134{14}S14{141341:,4}S1341414}S13414}S0-]4}S0-]40p_41:,4{0-]4}S0p_40p_4}S0p_4}S0p_40p_4}S0p_4}S0p_4}S0p_4z0p_4{0p_4}S0p_4z0-]4}S0p_4z0-]4z0p_4w0p_4}S0p_4}S0p_4z0-]4}S0-]4}S0p_4z0p_40p_4}S0p_4w1:,4}S0p_4z0p_4}S0p_40p_4z0-]4z0p_4}S0p_4}S0p_4z0p_4z0p_4}S0p_4z0p_4}S0p_4}S0p_4{0p_40p_4}S0p_40p_4{0p_4t0p_4z0p_4}S0p_40p_4{0p_40p_4{0p_4{0p_40p_40p_4{0p_40p_40p_4{0p_40p_4{0p_4{0p_40p_4K0p_4}S0p_40p_4{0p_40p_40p_40p_40p_4{0p_40p_40p_4{0p_40p_40p_40p_40p_40p_40p_4{0p_4{0p_40p_4{0p_40p_40p_40p_40p_40p_40-]4{0p_4{0p_40p_40p_4{0p_4{0p_4{0p_40p_40p_40p_40p_40p_4}S0p_4{0p_4K0p_4{0p_4t0p_40p_4z0p_4{0p_4}S0p_4}S0-]4z0-]4}S0p_4z0p_40p_4}S1:,4}S0p_40p_4}S1:,4}S0-]4{1:,4{0p_4}S0-]4z0-]4}S1:,4}S1:,40-]4}S0p_4{0-]414}S1:,4}S0-]4}S1:,4}S0-]40-]40-]4z0-]4}S1:,4}S0-]4}S0-]4}S0p_4z0-]4}S1:,4z0-]4}S0-]4}S1:,41:,40-]4z14}S0p_4z1:,40p_4z0p_4z0p_40p_4z0p_4}S0p_40p_4}S0p_4z0p_4w0p_4z0p_4}S0p_4}S0p_4z0p_40p_4w1:,4w0p_4z0-]4}S0-]4w134t0p_4w0p_4}S0p_4w0-]4w0-]4}S0p_4}S0-]4}S0p_4z0p_40p_4w0p_4}S0p_40p_4}S0p_4w0p_40p_4}S0-]4}S0p_4z0p_40p_4z1:,4}S1:,4z0p_40p_4z0p_40p_4}S0p_4}S0p_4}S0p_4}S0p_40p_4z0p_40p_4z0p_4}S0p_4z0p_40p_4z0-]40p_40p_4w0-]4w0p_4}S0p_4z0p_4w0p_4w0p_4w0p_4t0-]4z0p_4t0p_4w0p_4z0p_4t0p_4w0p_4z0p_4rz0p_4t0p_4t0-]4w0p_4w0p_4}S0p_4w0-]4z0p_4w141:,4z0p_4z0-]4z0p_4}S0p_4w0p_4w0p_4z0p_4t0p_4z0p_4}S0p_4z0p_4z0p_4z0p_4z0p_4z0-]40p_4z0p_4}S0p_4z0p_4z0p_40p_4z0p_4}S0p_4z0p_4z0p_4z0p_4z0p_4}S0p_4w0p_4}S0p_40p_4t0p_4t0-]4w0p_4w0p_4w0-]4z0p_4t1:,4w0-]4w1:,4w0-]4t0p_4t0p_4t0p_4z0-]4w0p_4w0p_4t0p_4z0p_4t0p_4w0p_4rz1:,4t14w1:,4z0p_4t1:,4z0p_4w0p_4rz0-]4t0p_4w0p_4rz0p_4rz14w0-]4t0-]4z0p_4o=0p_4t0p_4t0p_4rz0p_4w0p_4rz0p_4w0p_4t0p_4rz0p_4rz0p_4t0p_4rz0p_4t0p_4rz0p_4t0p_4rz0p_4o=0p_4t0p_4rz0p_4t0p_4rz0p_4w0p_4o=0p_4w0p_4t0p_4w0p_4o=0p_4w0p_4t0p_4rz0p_4rz0p_4rz0p_4t0p_4rz0p_4t0p_4o=0p_4rz0p_4rz0p_4t0p_4t0p_4t0p_4rz0p_4rz0p_4rz0p_4rz0p_4rz0p_4t0p_4t0p_4rz0p_4o=0p_4t0p_4t0p_4rz0p_4w0p_4o=0p_4lm^0p_4o=0p_4t0p_4o=0p_4rz0p_4o=0p_4o=0p_4t0p_4rz0p_4i00p_4rz0p_4t0p_4o=0p_4t0p_4rz0p_4o=0p_4lm^0p_4lm^0p_4rz0p_4o=0p_4rz0p_4o=0p_4lm^0p_4t0p_4rz0p_4rz0p_4lm^0p_4i00p_4fB0p_4i00p_4i00p_4i00p_4i00p_4lm^0p_4rz0p_4o=0p_4o=0p_4lm^0p_4rz0p_4lm^0p_4rz0p_4rz0p_4lm^0p_4o=0p_4o=0p_4lm^0p_4rz0p_4lm^0p_4i00p_4i00p_4o=0p_4lm^0p_4o=0p_4lm^0p_4o=0p_4i00p_4rz0p_4fB0p_4lm^0p_4lm^0p_4lm^0p_4i00p_4lm^0p_4lm^0p_4o=0p_4i00p_4i00p_4lm^0p_4lm^0p_4lm^0p_4lm^0p_4lm^0p_4t0p_4i00p_4t0p_4i00p_4o=0p_4i00p_4rz0p_4o=0p_4lm^0p_4lm^0p_4i00p_4o=0p_4i00-]4t0p_4o=0p_4o=0p_4o=0p_4lm^0p_4lm^0p_4o=0p_4fB0p_4i00p_4o=0p_4o=0p_4i00p_4i00p_4lm^0p_4i00p_4fB0p_4i00p_4i00p_4lm^0p_4o=0p_4lm^0p_4lm^0p_4i00p_4i00p_4i00p_4o=0p_4lm^0p_4i00p_4fB0p_4fB0p_4fB0p_4a)0p_4c0p_4a)0p_4a)0p_4i00p_4lm^0p_4fB0p_4fB0p_4lm^0p_4lm^0p_4i00p_4i00p_4lm^0p_4fB0p_4i00p_4fB0p_4c0p_4i00p_4o=0p_4fB0p_4lm^0p_4lm^0p_4lm^0p_4lm^0p_4o=0p_4i00p_4lm^0p_4i00p_4lm^0p_4i00p_4lm^0p_4i00p_4rz0p_4lm^0p_4fB0p_4lm^0p_4rz0p_4lm^0p_4lm^0p_4o=0p_4rz0p_4lm^0p_4o=0p_4o=0p_4rz0p_4rz0p_4rz0p_4lm^0p_4o=0p_4rz0p_4rz0p_4o=0p_4o=0p_4i00-]4rz0p_4o=0p_4t0p_4w0p_4rz0p_4rz0p_4t0p_4rz0p_4t0p_4w0p_4o=0p_4t0p_4t0p_4t0p_4w0p_4t0-]4o=0p_4t0p_4rz0-]4rz0p_4o=0p_4o=0p_4t0p_4o=0-]4o=0p_4o=0-]4rz0p_4t0p_4rz0p_4lm^0-]4o=0p_4lm^0p_4lm^0p_4o=0p_4lm^0p_4o=0p_4o=0p_4t0p_4rz0p_4t0p_4o=0p_4w0p_4rz0p_4rz0p_4t0p_4t0p_4rz0p_4t0p_4t0p_4rz0p_4t0p_4rz0p_4rz0p_4t0p_4rz0p_4w0p_4t0p_4rz0p_4w0p_4o=0p_4o=0p_4t0p_4t0p_4t0p_4w0p_4t0p_4t0p_4rz0p_4t0p_4w0p_4rz0p_4w0p_4w0p_4t0p_4rz0-]4w0p_4t0p_4t0p_4rz0p_4rz0p_4rz0p_4o=0p_4rz0p_4o=0p_4o=0p_4o=0p_4rz1:,4rz0-]4lm^0p_4lm^0p_4t0p_4lm^0p_4rz0p_4rz0p_4t0p_4o=0p_4lm^0p_4o=0p_4w0p_4o=0p_4o=0p_4i00p_4lm^0p_4o=0p_4t0p_4o=0p_4o=0p_4rz0p_4o=0p_4t0-]4o=0p_4o=0p_4rz0p_4rz0p_4o=0p_4rz0p_4lm^0p_4i00p_4o=0p_4lm^0p_4o=0-]4rz0-]4lm^0p_4rz0p_4o=0-]4i014o=1:,4o=134rz1:,4rz14t0-]4rz0-]4lm^0-]4rz0p_4rz0-]4o=0p_4t0p_4w0-]4t0-]4lm^1:,4t0-]4t0p_4t0-]4rz0p_4rz0p_4t0p_4rz0p_4rz1:,4t0-]4rz0-]4rz0-]4rz1:,4t0-]4i01:,4t0-]4t1:,4o=14o=1:,4rz1:,4lm^1:,4o=0-]4o=0p_4t0p_4o=0p_4o=0p_4fB0p_4o=0p_4i00p_4i00p_4i00p_4rz0-]4lm^0-]4t0p_4rz0p_4o=0-]4i01:,4w0p_4lm^0p_4rz0p_4lm^0p_4lm^0p_4lm^0p_4fB0p_4lm^0p_4i00p_4fB0p_4fB0p_4lm^0p_4lm^0p_4lm^0p_4lm^0p_4lm^0p_4lm^0p_4lm^0p_4i00p_4fB0p_4o=0p_4fB0p_4lm^0p_4i00p_4i00p_4i00p_4c0p_4i00p_4i00p_4lm^0p_4fB0p_4c0p_4c0p_4fB0p_4c0p_4c0p_4i00p_4lm^0p_4o=0p_4o=0p_4o=0p_4lm^0-]4o=0p_4o=0p_4i00p_4lm^0p_4lm^0p_4i00p_4i00p_4i00p_4fB0p_4lm^0p_4i00p_4i00p_4i00p_4i00p_4lm^0p_4c0p_4i00p_4i00p_4o=0p_4fB0p_4fB0p_4lm^0p_4fB0p_4lm^0p_4fB0p_4i00p_4fB0p_4i00p_4fB0p_4lm^0p_4fB0p_4c0p_4c0p_4fB0p_4a)0p_4lm^0p_4c0p_4c0p_4fB0p_4fB0p_4i00p_4fB0p_4c1:,4fB0p_4lm^0-]4c134i00-]4fB1:,4fB134c14i00-]4fB14i0134fB1:,4fB134i0134fB0-]4i014i014o=14i014fB14lm^14lm^14i014i014lm^14fB14fB14fB14fB14i0134i014i017r4rz134o=134rz0-]4lm^0-]4t0-]4lm^0p_4o=1:,4lm^1:,4fB1:,4i014o=0-]4lm^1:,4rz0p_4o=1:,4rz1:,4o=0-]4t0p_4lm^0p_4{0p_4o=0p_4lm^0p_4i00p_4t0p_4o=0p_4o=0p_4o=0p_4lm^0p_4lm^0p_4lm^0p_4i00p_4lm^0p_4lm^0p_4lm^0p_4o=0p_4i00p_4lm^0p_4i00p_4o=0p_4lm^0p_4o=0p_4lm^0p_4a)0p_4o=0p_4lm^0p_4o=0p_4i00p_4fB0p_4o=0p_4lm^0p_4o=0p_4rz0p_4t0p_4rz0p_4o=0-]4o=1:,4rz0p_4rz0-]4rz0p_4t0p_4rz0p_4rz0p_4t0p_4i00-]4o=0p_4lm^1:,4rz1:,4o=0-]4o=1:,4o=0-]4o=1:,4o=0-]4rz0-]4o=0-]4o=0p_4o=0p_4lm^0p_4t0p_4o=0p_4lm^0p_4lm^0p_4o=0p_4o=0p_4o=0p_4rz0p_4rz0p_4rz0p_4o=0p_4t0p_4rz0p_4o=0p_4rz0p_4lm^0p_4o=0p_4o=0p_4lm^0p_4lm^0p_4o=0p_4lm^0p_4o=0p_4o=0p_4fB0p_4c0p_4fB0p_4i00p_4i00p_4i00p_4i00p_4i00p_4i00p_4fB0p_4c0p_4i00p_4i00p_4fB0p_4i00p_4i00p_4fB0p_4fB0p_4fB0p_4lm^0p_4c0p_4lm^0p_4c0p_4i00p_4i00p_4fB0p_4i00p_4fB0p_4c0p_4i00p_4a)0p_4lm^0p_4fB0p_4lm^0p_4c0p_4fB0p_4fB0p_4i00p_4i00p_4i00p_4lm^0p_4fB0p_4fB0p_4fB0p_4i00p_4c0p_4lm^0p_4c0p_4i00p_4i00p_4c0p_4rz0p_4c0p_4fB0p_4o=0p_4fB0p_4fB0p_4fB0p_4lm^0p_4c0p_4fB0p_4fB0p_4fB0p_4fB0p_4fB0p_4a)0p_4i00p_4i00p_4c0p_4fB0p_4c0p_4lm^0p_4lm^0p_4i00p_4t0p_4z0p_4t0p_4rz0p_4rz0p_4t0p_4rz0p_4t0p_4t0p_4rz0p_4t0p_4o=0p_4rz0p_4o=0p_4rz0p_4rz0p_4rz0p_4lm^0p_4o=0p_4i00p_4o=0p_4lm^0p_4i00p_4i00p_4lm^0p_4lm^0p_4o=0p_4i00p_4t0p_4rz0p_4o=0p_4rz0p_4i00p_4o=0p_4o=0p_4lm^0p_4o=0p_4o=0p_4i00p_4lm^0p_4i00p_4lm^0p_4o=0p_4lm^0p_4lm^0p_4i00p_4lm^0p_4o=0p_4lm^0p_4t0p_4c0p_4o=0p_4lm^0p_4lm^0p_4lm^0p_4lm^0p_4o=0p_4lm^0p_4lm^0p_4lm^0p_4lm^0p_4lm^0p_4lm^0p_4lm^0p_4i00p_4i00p_4lm^0p_4i00p_4lm^0p_4i00p_4i00p_4lm^0p_4t0p_4i00p_4fB0p_4c0p_4c0p_4i00p_4fB0p_4o=0p_4lm^0p_4lm^0p_4lm^0p_4o=0p_4i00p_4lm^0p_4rz0p_4o=0p_4o=0p_4o=0p_4o=0p_4o=0p_4rz0p_4lm^0p_4o=0p_4rz0p_4i00p_4o=0p_4lm^0p_4lm^0p_4rz0p_4o=0p_4o=0p_4rz0p_4i00p_4lm^0p_4o=0p_4o=0p_4rz0p_4i00p_4o=0p_4lm^0p_4o=0p_4i00p_4rz0p_4i00p_4rz0p_4o=0p_4lm^0p_4o=0p_4o=0p_4o=0p_4lm^0p_4lm^0p_4o=0p_4o=0p_4i00p_4lm^0p_4o=0p_4o=0p_4lm^0p_4o=0p_4rz0p_4o=0p_4lm^0p_4lm^0p_4o=0p_4rz0p_4lm^0-]4o=0p_4i00p_4o=0p_4lm^0p_4o=0p_4o=0p_4o=0p_4lm^0p_4lm^0p_4rz0p_4o=0p_4o=0p_4rz0p_4fB0-]4i00p_4rz0p_4rz0p_4lm^0p_4rz0p_4rz0p_4o=0p_4rz0p_4rz0p_4lm^0p_4o=0p_4t0p_4lm^0p_4rz0p_4i00p_4c0p_4i00p_4t0p_4i00p_4o=0p_4o=0p_4t0p_4w0p_4w0p_4rz0p_4lm^0p_4i00p_4rz0p_4o=0p_4lm^0p_4o=0p_4lm^0p_4t0p_4t0p_4rz0p_4o=0p_4o=0p_4rz0p_4o=0p_4rz0p_4w0p_4o=0p_4w0p_4o=0p_4o=0p_4i00p_4lm^0p_4lm^0p_4lm^0p_4i00p_4o=0p_4fB0p_4fB0p_4a)0p_4a)0p_4lm^0p_4fB0p_4i00p_4i00p_4i00p_4fB0p_4fB0p_4lm^0p_4o=0p_4lm^0p_4rz0p_4rz0p_4rz0p_4i00p_4i00p_4c0p_4fB0p_4i00p_4fB0p_4fB0p_4fB0p_4c0p_4lm^0p_4lm^0p_4c0p_4i00p_4fB0p_4lm^0p_4fB0p_4i00p_4i00p_4lm^0p_4i00p_4fB0p_4fB0p_4fB0p_4i00p_4i00p_4fB0p_4i00p_4i00p_4lm^0p_4i00p_4fB0p_4fB0p_4i00p_4i00p_4i00p_4fB0p_4lm^0p_4i00p_4fB0p_4lm^0p_4i00p_4fB0p_4lm^0p_4i00p_4i00p_4lm^0p_4lm^0p_4i00p_4lm^0p_4fB0p_4i00p_4fB0p_4lm^0p_4lm^0p_4i00p_4i00p_4lm^0p_4lm^0p_4lm^0p_4i00p_4fB0p_4rz0p_4i00p_4o=0p_4i00p_4o=0p_4fB0p_4lm^0p_4i00p_4fB0p_4i00p_4fB0p_4fB0p_4i00p_4c0p_4i00p_4lm^0p_4o=0p_4o=0p_4o=0p_4o=0p_4rz0p_4o=0p_4lm^0p_4o=0p_4lm^0p_4o=0p_4rz0p_4o=0p_4o=0p_4o=0p_4a)0p_4fB0p_4c0p_4fB0p_4i00p_4fB0p_4fB0p_4i00p_4lm^0p_4c0p_4fB0p_4fB0p_4a)0p_4c0p_4i00p_4fB0p_4c0p_4i00p_4a)0p_4c0p_4fB0p_4a)0p_4i00p_4a)0p_4lm^0p_4fB0p_4a)0p_4fB0p_4c0p_4fB0p_4fB0p_4a)0p_4fB0p_4^V0p_4c0p_4c0p_4c0p_4a)0p_4a)0p_4^V0p_4fB0p_4[0p_4a)0p_4fB0p_4^V0p_4a)0p_4c0p_4^V0p_4a)0p_4^V0p_4c0p_4fB0p_4a)0p_4fB0p_4c0p_4c0p_4c0p_4a)0p_4fB0p_4fB0p_4c0p_4fB0p_4fB0p_4c0p_4fB0p_4a)0p_4fB0p_4fB0p_4c0p_4fB0p_4a)0p_4a)0p_4i00p_4a)0p_4fB0p_4c0p_4fB0p_4a)0p_4c0p_4fB0p_4a)0p_4fB0p_4c0p_4fB0p_4a)0p_4c0p_4c0p_4c0p_4a)0p_4i00p_4fB0p_4o=0p_4fB0p_4c0p_4i00p_4fB0p_4c0p_4i00p_4c0p_4^V0p_4fB0p_4a)0p_4c0p_4^V0p_4fB0p_4a)0p_4c0p_4a)0p_4^V0p_4a)0p_4a)0p_4a)0p_4c0p_4a)0p_4c0p_4c0p_4^V0p_4c0p_4c0p_4a)0p_4fB0p_4^V0p_4^V0p_4c0p_4a)0p_4^V0p_4^V0p_4c0p_4fB0p_4^V0p_4[0p_4[0p_4U0p_4^V0p_4^V0p_4^V0p_4^V0p_4a)0p_4a)0p_4^V0p_4a)0p_4^V0p_4c0p_4a)0p_4a)0p_4a)0p_4^V0p_4a)0p_4c0p_4a)0p_4a)0p_4^V0p_4a)0p_4fB0p_4c0p_4a)0p_4fB0p_4fB0p_4a)0p_4a)0p_4^V0p_4c0p_4c0p_4fB0p_4a)0p_4[0p_4[0p_4^V0p_4^V0p_4[0p_4[0p_4^V0p_4^V0p_4^V0p_4[0p_4^V0p_4X0p_4[0p_4^V0p_4c0p_4^V0p_4a)0p_4^V0p_4c0p_4^V0p_4^V0p_4^V0p_4a)0p_4a)0p_4[0p_4a)0p_4[0p_4X0p_4[0p_4a)0p_4[0p_4X0p_4a)0p_4[0p_4[0p_4^V0p_4[0p_4X0p_4[0p_4^V0p_4^V0p_4^V0p_4[0p_4X0p_4^V0p_4^V0p_4[0p_4U0p_4[0p_4X14^V0p_4[0p_4c0p_4[0p_4a)0p_4a)0p_4^V0p_4^V0p_4[0p_4[0p_4[0p_4a)0p_4[0p_4a)0p_4X0p_4^V0p_4a)0p_4^V0p_4^V0p_4a)0p_4a)0p_4^V0p_4a)0p_4c0p_4a)0p_4^V0p_4a)0p_4a)0p_4^V0p_4a)0p_4^V0p_4[0p_4^V0p_4a)0p_4^V0p_4^V0p_4[0p_4^V0p_4a)0p_4X0p_4a)0p_4^V0p_4^V0p_4[0p_4a)0p_4[0p_4a)0p_4a)0p_4c0p_4c0p_4a)0p_4c0p_4c0p_4a)0p_4c0p_4^V0p_4a)0p_4c0p_4^V0p_4a)0p_4a)0p_4a)0p_4^V0p_4c0p_4a)0p_4a)0p_4a)0p_4c0p_4c0p_4a)0p_4^V0p_4fB0p_4^V0p_4c0p_4c0p_4^V0p_4c0p_4fB0p_4a)0p_4a)0p_4a)0p_4fB0p_4X0p_4[0p_4[0p_4^V0p_4^V0p_4[0p_4X0p_4^V0p_4U0p_4[0p_4[0p_4[0p_4S0p_4U0p_4S0p_4[0p_4X0p_4X0p_4X0p_4[0p_4[0p_4[0p_4^V0p_4[0p_4^V0p_4^V0p_4[0p_4X0p_4fB0p_4a)0p_4a)0p_4c0p_4c0p_4a)0p_4^V0p_4^V0p_4a)0p_4fB0p_4^V0p_4a)0p_4c0p_4a)0p_4a)0p_4a)0p_4a)0p_4a)0p_4a)0p_4a)0p_4[0p_4[0p_4^V0p_4a)0p_4^V0p_4^V0p_4^V0p_4[0p_4[0p_4a)0p_4[0p_4^V0p_4^V0p_4[0p_4[0p_4[0p_4^V0p_4[0p_4[0p_4a)0p_4[0p_4[0p_4[0p_4^V0p_4X0p_4[0p_4^V0p_4^V0p_4^V0p_4[0p_4[0p_4[0p_4[0p_4[0p_4[0p_4[0p_4X0p_4[0p_4[0p_4[0p_4X0p_4^V0p_4X0p_4[1:,4X0p_4[0p_4U0-]4^V0p_4X0p_4[0p_4[0p_4X0-]4^V0p_4X0-]4[0p_4X0p_4X0p_4[0p_4[0p_4^V0p_4X0-]4X0p_4^V0p_4[0p_4[0p_4^V0p_4X1:,4[0p_4[0-]4^V0p_4X0-]4[0p_4^V0p_4U0-]4X14[0-]4a)14[134[14^V0p_4X0p_4X0-]4[0p_4[0-]4a)0-]4X1:,4^V0-]4^V0p_4[0p_4^V1:,4[0-]4[0p_4[0p_4[0p_4^V0p_4[0p_4[0p_4X0p_4^V0p_4X0p_4^V0p_4[0p_4[0p_4[0p_4X0p_4a)0p_4[0-]4^V0-]4[0-]4^V1:,4X0-]4U0-]4X0-]4^V0-]4X1:,4[0-]4[1:,4^V1:,4X1:,4[1:,4^V0p_4[0-]4X0-]4[0p_4[0p_4^V0p_4[0-]4^V0p_4^V0p_4[0p_4^V0p_4X0p_4X0p_4^V0p_4^V0p_4X0p_4^V0p_4^V0p_4^V0p_4[0p_4[0p_4^V0p_4[0p_4^V0p_4[0p_4X0p_4a)0p_4^V0p_4c0p_4^V0p_4c0p_4[0p_4a)0p_4a)0p_4c0p_4^V0p_4a)0p_4a)0p_4a)0p_4^V0p_4^V0p_4^V0p_4c0p_4^V0p_4a)0p_4c0p_4[0p_4^V0p_4^V0p_4[0p_4^V0p_4X0p_4X0p_4[0p_4X0p_4^V0-]4X0p_4X0p_4[0p_4X0p_4X0-]4[0p_4X0-]4[0p_4[0p_4X0-]4^V0p_4[1:,4^V0p_4[0-]4[0-]4[0p_4[0p_4U0p_4X0p_4^V0p_4U0p_4X0p_4X0p_4U0p_4X0p_4X0p_4U0p_4U0p_4U0p_4U0p_4X0p_4U0p_4U0p_4U0p_4X0p_4X0p_4U0p_4X0p_4U0p_4X0p_4X0p_4U0p_4[0p_4U0p_4U0p_4U0p_4X0p_4X0p_4U0p_4S0p_4X0p_4X0p_4U0p_4U0p_4PCR0p_4X0p_4U0p_4[0p_4U0p_4^V0p_4[0p_4a)0p_4a)0p_4^V0p_4^V0p_4^V0p_4a)0p_4^V0p_4^V0p_4^V0p_4^V0p_4^V0p_4a)0p_4X0p_4a)0p_4[0p_4a)0p_4a)0p_4c0p_4c0p_4^V0p_4a)0p_4c0p_4a)0p_4^V0p_4a)0p_4a)0p_4c0p_4i00-]4a)0p_4^V0p_4a)0p_4^V0p_4^V0p_4a)0p_4^V0p_4^V0p_4^V0p_4a)0p_4^V0p_4^V0p_4^V0p_4^V0p_4^V0p_4^V0p_4a)0p_4[0p_4[0p_4^V0p_4a)0p_4^V0p_4^V0p_4[0p_4^V0p_4^V0p_4X0p_4a)0p_4a)0p_4^V0p_4[0p_4[0p_4^V0p_4a)0p_4X0p_4^V0p_4[0p_4[0p_4^V0p_4^V0p_4X0p_4a)0p_4[0p_4a)0p_4[0p_4^V0p_4X0p_4^V0p_4[0p_4^V0p_4^V0p_4[0p_4a)0p_4X0p_4^V0p_4^V0p_4^V0p_4[0p_4[0p_4^V0p_4[0p_4X0p_4[0p_4^V0p_4[0p_4^V0p_4[0p_4a)0p_4^V0p_4a)0p_4[0p_4[0p_4^V0p_4^V0p_4a)14[1:,4c1:,4^V1:,4c14[14^V17r4U134X17r4X134X1:,4X0-]4U1:,4U0-]4X0-]4X0p_4U0-]4[1:,4X0p_4X0p_4S0p_4[0p_4U0p_4X0p_4U0p_4U0p_4U0p_4X0p_4X0p_4[0p_4[0p_4a)0p_4[0p_4X0p_4^V0p_4[0p_4[0p_4a)0p_4^V0p_4^V0p_4[0p_4a)0p_4a)0p_4[1:,4a)0-]4^V0p_4X0p_4^V0p_4a)0p_4^V0-]4^V0p_4[0-]4c0-]4a)0p_4^V0p_4X0-]4[0p_4^V0p_4^V0p_4[0p_4^V0p_4^V0p_4a)0p_4^V0p_4^V0p_4[0p_4a)0p_4[0p_4^V0p_4^V0p_4^V0p_4^V0p_4[0p_4^V0p_4^V0p_4a)0-]4[0p_4^V0p_4a)0p_4[0p_4a)0p_4[0p_4[0p_4U0p_4a)0p_4[0p_4a)0p_4^V0p_4a)0p_4a)0p_4[0p_4[0p_4^V0p_4[0p_4^V0p_4^V0p_4^V0p_4^V0-]4[0p_4a)0p_4^V1:,4^V0p_4^V0p_4[0p_4a)0p_4X14^V14a)1:,4[14[0-]4[0p_4^V0p_4X0-]4a)0p_4a)0p_4^V0-]4c0-]4^V0-]4[14c0-]4X0-]4X1:,4^V1:,4[14fB1:,4c0-]4^V0p_4a)0-]4c0-]4^V1:,4a)1:,4a)0p_4c0p_4a)0-]4a)0-]4c0p_4a)0-]4c0p_4a)1:,4a)0-]4a)0-]4c0p_4c1:,4a)0-]4[0p_4a)0-]4[0-]4c0-]4^V0p_4a)0p_4a)0p_4^V0p_4^V0p_4[0p_4[0p_4[0p_4^V0p_4^V0p_4^V0p_4X0p_4X0p_4[0p_4[0p_4[0p_4[0p_4^V0p_4X0p_4^V0p_4[0p_4X0p_4^V0p_4X0p_4X0p_4[0p_4X0p_4[0p_4X0p_4[0p_4X0p_4X0p_4X0p_4X0p_4[0p_4[0p_4[0p_4X0p_4S0p_4S0p_4[0p_4X0p_4[0p_4^V0p_4X0p_4^V0p_4X0p_4X0p_4[0p_4[0p_4[0p_4X0p_4[0p_4X0p_4U0p_4X0p_4X0p_4X0p_4U0p_4X0p_4X0p_4U0p_4[0p_4U0p_4X0p_4U0p_4U0p_4X0p_4[0p_4X0p_4X0p_4[0p_4S0p_4U0p_4X0p_4[0p_4U0p_4X0p_4U0p_4X0p_4[0p_4X0p_4X0p_4U0p_4X0p_4X0p_4X0p_4U0p_4X0p_4U0p_4X0p_4X0p_4[0p_4S0p_4[0p_4U0p_4X0p_4X0p_4U0p_4U0p_4^V0p_4[0p_4PCR0p_4X0p_4X0p_4[0p_4U0p_4^V0p_4X0p_4a)0p_4^V0p_4X0p_4[0p_4^V0p_4[0p_4^V0p_4^V0p_4[0p_4[0p_4^V0p_4^V0p_4X0p_4X0p_4^V0p_4^V0p_4^V0p_4a)0p_4a)0p_4X0p_4[0p_4U0p_4X0p_4^V0p_4[0p_4X0-]4X0-]4^V0p_4[0-]4[1:,4^V0p_4X0p_4[0p_4^V0p_4[0p_4X0p_4^V0p_4[0p_4U0p_4X0p_4U0p_4^V0-]4U0-]4X0p_4X0-]4[0p_4X0p_4U0p_4^V0p_4X0p_4[0p_4X0p_4[0p_4U0p_4^V0p_4^V0p_4X0p_4^V0p_4U0p_4[0p_4X0p_4[0p_4[0p_4X0p_4[0p_4X0p_4U0p_4X0p_4U0p_4U0p_4X0p_4X0p_4S0p_4U0p_4PCR0p_4U0p_4PCR0p_4U0p_4PCR0p_4PCR0p_4PCR0p_4PCR0p_4S0p_4Mpd0p_4PCR0p_4PCR0p_4S0p_4Mpd0p_4PCR0p_4Mpd0p_4S0p_4PCR0p_4X0p_4U0p_4U0p_4U0p_4X0p_4X0p_4U0p_4X0p_4Mpd0p_4U0p_4U0p_4PCR0p_4S0p_4U0p_4PCR0p_4Mpd0p_4PCR0p_4Mpd0p_4S0p_4S0p_4PCR0p_4S0p_4S0p_4PCR0p_4PCR0p_4PCR0p_4PCR0p_4U0p_4PCR0p_4Mpd0p_4PCR0p_4PCR0p_4S0p_4S0p_4S0p_4S0p_4PCR0p_4PCR0p_4S0p_4PCR0p_4Mpd0p_4U0p_4S0p_4S0p_4X0p_4S0p_4S0p_4PCR0p_4S0p_4PCR0p_4S0p_4S0p_4S0p_4S0p_4PCR0p_4S0p_4PCR0p_4S0p_4U0p_4S0p_4S0p_4S0p_4PCR0p_4S0p_4S0p_4S0p_4[0p_4S0p_4X0p_4X0p_4U0p_4X0p_4U0p_4X0p_4[0p_4U0p_4X0p_4U0-]4X0p_4U0-]4X0p_4[0p_4U0p_4U0p_4S0p_4^V0p_4S0-]4S0p_4Mpd0p_4S0p_4PCR0p_4U0p_4U0p_4X0p_4PCR0p_4X0p_4S0p_4Mpd0p_4S0p_4Mpd0p_4G0p_4S0p_4PCR0p_4S0p_4PCR0p_4U0p_4PCR0p_4S0p_4U0p_4X0p_4U0p_4PCR0p_4U0p_4S0p_4U0p_4U0p_4PCR0p_4U0p_4U0p_4S0p_4S0p_4S0p_4PCR0p_4X0p_4S0p_4S0p_4U0p_4PCR0p_4PCR0p_4X0p_4S0p_4PCR0p_4Mpd0p_4Mpd0p_4S0p_4S0p_4Mpd0p_4Mpd0p_4S0p_4J60p_4Mpd0p_4PCR0p_4J60p_4Mpd0p_4G0p_4J60p_4Mpd0p_4Mpd0p_4J60p_4J60p_4D0p_4J60p_4J60p_4J60p_4G0p_4G0p_4G0p_4Mpd0p_4J60p_4J60p_4Mpd0p_4G0p_4PCR0p_4J60p_4D0p_4J60p_4PCR0p_4J60p_4G0p_4Mpd0p_4G0p_4PCR0p_4G0p_4G0p_4Mpd0p_4J60p_4D0p_4G0p_4Mpd0p_4G0p_4J60p_4Mpd0p_4Mpd0p_4G0p_4Mpd0p_4Mpd0p_4Mpd0p_4Mpd0p_4S0p_4Mpd0p_4G0p_4S0p_4Mpd0p_4J60p_4J60p_4Mpd0p_4J60p_4J60p_4J60p_4PCR0p_4G0p_4J60p_4Mpd0p_4U0p_4Mpd0p_4S0p_4S0p_4S0p_4J60p_4U0p_4Mpd0p_4PCR0p_4Mpd0p_4U0p_4S0p_4J60p_4D0p_4D0p_4B,0p_4J60p_4PCR0p_4D1:,4J60-]4Mpd0p_4J60p_4PCR0p_4Mpd0p_4Mpd0p_4Mpd0-]4PCR0p_4PCR0p_4J60p_4PCR0p_4J60p_4PCR0p_4Mpd0p_4PCR0p_4Mpd0p_4S0p_4S0p_4S0p_4Mpd0p_4U0p_4X0p_4S0p_4PCR0p_4U0p_4S0p_4U0p_4PCR0p_4Mpd0p_4PCR0p_4S0p_4Mpd0p_4S0p_4PCR0p_4PCR0p_4PCR0p_4Mpd0p_4PCR0p_4PCR0-]4PCR0p_4PCR0p_4Mpd1:,4Mpd0p_4Mpd0p_4PCR0p_4PCR0p_4Mpd0p_4PCR0p_4PCR0p_4PCR0p_4PCR0p_4U0p_4S0p_4PCR0p_4S0p_4PCR0p_4PCR0p_4PCR0p_4Mpd0p_4U0p_4J60-]4S0p_4PCR0p_4PCR0p_4S0p_4U0p_4PCR0p_4S0p_4PCR0p_4S0p_4PCR0p_4PCR0p_4S0p_4S0p_4PCR0p_4S0p_4Mpd0p_4PCR0p_4U0p_4Mpd0p_4Mpd0p_4S0p_4S0p_4PCR0p_4PCR0p_4PCR0p_4Mpd0p_4PCR0p_4S0p_4U0p_4U0p_4^V0p_4PCR0p_4S0p_4U0p_4U0p_4U0p_4S0p_4^V0p_4U0p_4X0p_4X0p_4S0p_4U0p_4S0p_4U0p_4S0p_4U0p_4X0p_4U0p_4S0p_4U0p_4Mpd0p_4PCR0p_4S0p_4PCR0p_4PCR0p_4PCR0-]4PCR0p_4PCR0p_4S0p_4PCR0p_4PCR0p_4PCR0p_4U0p_4PCR0p_4S0p_4Mpd0p_4PCR0p_4Mpd0p_4PCR0p_4Mpd0p_4PCR0p_4PCR0p_4PCR0p_4J60p_4J60p_4J60p_4J60p_4J60p_4J60p_4G0p_4Mpd0p_4PCR0p_4Mpd0p_4PCR0p_4G0p_4J60p_4Mpd0p_4S0p_4Mpd0p_4U0p_4PCR0p_4Mpd0p_4PCR0p_4PCR0p_4Mpd0p_4Mpd0p_4J60p_4PCR0p_4G0p_4J60p_4Mpd0p_4J60p_4Mpd0p_4G0p_4D0p_4Mpd0p_4J60p_4J60p_4J60p_4Mpd0p_4J60p_4D0p_4J60p_4D0p_4Mpd0p_4J60p_4J60p_4J60p_4J60p_4PCR0p_4G0p_4Mpd0p_4Mpd0p_4Mpd0p_4G0p_4J60p_4Mpd0p_4Mpd0p_4D0p_4Mpd0p_4G0p_4PCR0p_4J60p_4J60p_4J60p_4G0p_4J60p_4G0p_4J60p_4J60p_4G0p_4J60p_4G0p_4G0p_4J60p_4G0p_4J60p_4J60p_4G0p_4Mpd0p_4J60p_4D0p_4Mpd0p_4D0p_4J60p_4Mpd0p_4G0p_4J60p_4G0p_4D0p_4G0p_4G0p_4J60p_4Mpd0p_4D0p_4J60p_4J60p_4J60p_4J60p_4J60p_4D0p_4G0p_4Mpd0p_4PCR0p_4J60p_4PCR0p_4Mpd0p_4Mpd0p_4G0p_4Mpd0p_4S0p_4Mpd0p_4J60p_4PCR0p_4Mpd0p_4J60p_4Mpd0p_4S0p_4Mpd0p_4PCR0p_4Mpd0p_4Mpd0p_4Mpd0p_4PCR0p_4J60p_4PCR0p_4Mpd0p_4Mpd0p_4J60p_4PCR0p_4J60p_4Mpd0p_4Mpd0p_4Mpd0p_4Mpd0p_4Mpd0p_4Mpd0p_4Mpd0p_4G0p_4G0p_4J60p_4Mpd0p_4Mpd0p_4Mpd0p_4J60p_4Mpd0p_4Mpd0p_4Mpd0p_4Mpd0p_4G0p_4J60p_4Mpd0p_4Mpd0p_4G0p_4J60p_4G0p_4J60p_4G0p_4J60p_4Mpd0p_4J60p_4J60p_4Mpd0p_4G0p_4G0p_4G0p_4J60p_4G0p_4G0p_4D0p_4G0p_4G0p_4G0p_4G0p_4G0p_4J60p_4D0p_4G0p_4G0p_4J60p_4G0p_4G0p_4J60p_4J60p_4S0p_4U0p_4PCR0p_4S0p_4U0p_4X0p_4X0p_4X0p_4U0p_4U0p_4U0p_4U0p_4U0p_4X0p_4U0p_4X0p_4X0p_4U0p_4U0p_4S0p_4X0p_4U0p_4S0p_4S0p_4S0p_4PCR0p_4Mpd0p_4PCR0p_4J60p_4PCR0p_4Mpd0p_4PCR0p_4G0p_4PCR0p_4PCR0p_4PCR0p_4S0p_4S0p_4Mpd0p_4S0p_4PCR0p_4PCR0p_4S0p_4PCR0p_4PCR0p_4PCR0p_4PCR0p_4PCR0p_4Mpd0p_4S0p_4PCR0p_4S0p_4S0p_4J60p_4PCR0p_4G0-]4J60p_4Mpd0-]4Mpd0p_4J60p_4PCR0p_4G0p_4Mpd0p_4PCR0p_4J60p_4J60p_4PCR0p_4Mpd0p_4G0p_4Mpd0p_4G0p_4Mpd0p_4J60p_4Mpd0p_4G0p_4J60p_4G0p_4G0p_4Mpd0p_4J60p_4G0p_4J60p_4Mpd0p_4J60p_4J60p_4Mpd0p_4Mpd0p_4J60p_4J60p_4PCR0p_4J60p_4PCR0p_4G0p_4Mpd0p_4J60p_4J60p_4Mpd0p_4Mpd0p_4G0p_4Mpd0p_4Mpd0p_4G0p_4J60p_4J60p_4Mpd0p_4Mpd0p_4J60p_4G0p_4Mpd0p_4Mpd0p_4J60p_4D0p_4D0p_4D0p_4G0p_4D0p_4B,0p_4J60p_4D0p_4D0p_4J60p_4D0p_4G0p_4J60p_4B,0p_4J60p_4B,0p_4B,0p_4G0p_4G0p_4G0p_4D0p_4G0p_4D0p_4G0p_4D0p_4J60p_4D0p_4D0p_4D0p_4G0p_4G0p_4G0p_4G0p_4B,0p_4<0p_4B,0p_4<0p_4D0p_4D0p_4G0p_4D0p_4Mpd0p_4G0p_4Mpd0p_4Mpd0p_4G0p_4Mpd0p_4J60p_4D0p_4D0p_4G0p_4J60p_4J60p_4Mpd0p_4G0p_4G0p_4J60p_4J60p_4G0p_4G0p_4J60p_4J60p_4G0p_4J60p_4J60p_4J60p_4J60p_4Mpd0p_4PCR0p_4J60p_4Mpd0p_4J60p_4D0p_4PCR0p_4D0p_4J60p_4J60p_4Mpd0p_4G0p_4G0p_4G0p_4B,1:,4G1:,4G0-]4Mpd0-]4G14J61:,4G1:,4J60-]4J614G1:,4Mpd0-]4B,0-]4Mpd0p_4J60-]4G1:,4G0-]4G1:,4Mpd0p_4G1:,4J60-]4G0p_4J60p_4Mpd0p_4J60p_4G0p_4J60p_4D0p_4J60p_4G0p_4Mpd0p_4D0p_4G0-]4G1:,4Mpd0p_4G0-]4G0p_4J60p_4G0p_4G0p_4J60p_4G0p_4J60p_4J60p_4J60p_4J60p_4G0p_4G0p_4G0p_4Mpd0p_4Mpd0p_4Mpd0p_4J60p_4PCR0p_4J60p_4Mpd0p_4PCR0p_4Mpd0p_4Mpd0p_4U0p_4S0p_4PCR0p_4PCR0p_4S0p_4PCR0p_4Mpd0p_4PCR0p_4Mpd0p_4Mpd0p_4J60p_4G0p_4G0p_4J60p_4D0p_4J60p_4D0p_4J60p_4D0p_4G0p_4G0p_4D0p_4Mpd0p_4G0p_4D0p_4J60p_4G0p_4D0p_4PCR0p_4Mpd0p_4Mpd0p_4J60p_4Mpd0p_4PCR0p_4J60p_4Mpd0p_4D0p_4D0p_4J60p_4PCR0p_4PCR0p_4J60p_4G0p_4Mpd0p_4Mpd0p_4Mpd0p_4Mpd0p_4PCR0p_4J60p_4Mpd0p_4PCR0p_4J60p_4Mpd0p_4J60p_4G0p_4G0p_4J60p_4D0p_4G0p_4B,0p_4B,0p_4B,0p_4D0p_4?\0-]4D0p_4B,0p_4B,0p_4D0p_4D0p_4G0p_4?\0p_4?\0p_4D0p_4B,0p_4B,0p_4D0p_4?\0p_4D0p_4D0p_4B,0p_4G0p_4G0-]4B,0p_4D0p_4B,0p_4J60p_4D0p_4D0p_4D0p_4G0p_4B,0p_4D0p_4D0p_4B,0p_4B,0p_4D0p_4?\0p_4G0p_4D0p_4B,0p_4D0p_4B,0p_4B,0p_4D0p_4B,0p_4B,0p_4G0p_4B,0p_4B,0p_4D0p_4?\0p_4D0p_4?\0p_4B,0p_4D0p_4D0p_4B,0p_4G0p_4D0p_4PCR0p_4J60p_4G0p_4J60p_4G0p_4Mpd0p_4J60p_4Mpd0p_4G0p_4J60p_4J60p_4G0p_4S0p_4J60p_4J60p_4D0p_4J60p_4Mpd0p_4Mpd0p_4Mpd0p_4Mpd0p_4J60p_4J60p_4Mpd0p_4Mpd0p_4Mpd0p_4G0p_4B,0p_4?\0p_4D0p_4D0p_4J60p_4B,0p_4D0p_4B,0p_4D0p_4J60p_4<0p_4G0p_4?\0p_4D0p_4D0p_4D0p_4D0p_4D0p_4B,0p_4G0p_4PCR0p_4G0p_4G0p_4J60p_4G0p_4G0p_4J60p_4D0p_4J60p_4J60p_4D0p_4J60p_4D0p_4D0p_4G0p_4B,0p_4G0p_4D0p_4J60p_4G0p_4G0p_4J60p_4J60p_4G0p_4B,0p_4D0p_4D0p_4G0p_4D0p_4D0p_4B,0p_4G0p_4D0p_4B,0p_4D0p_4D0p_4D0p_4B,0p_4G0p_4D0p_4G0p_4B,0p_4B,0p_4D0p_4B,0p_4D0p_4B,0p_4D0p_4D0p_4D0p_4J60p_4G0p_4B,0p_4D0p_4G0p_4B,0p_4G0p_4D0p_4G0p_4?\0p_4D0p_4G0p_4B,0p_4B,0p_4G0p_4G0p_4B,0p_4G0p_4G0p_4D0p_4G0p_4G0p_4B,0p_4B,0p_4G0p_4G0p_4D0p_4G0p_4D0p_4G0p_4B,0p_4D0p_4G0p_4D0p_4D0p_4G0p_4D0p_4G0p_4B,0p_4G0p_4D0p_4D0p_4B,0p_4G0p_4D0p_4B,0p_4D0p_4D0p_4B,0p_4B,0p_4B,0p_4B,0p_4D0p_4D0p_4B,0p_4<0p_4G0p_4B,0p_4?\0p_4G0p_4G0p_4B,0p_4D0p_4B,0p_4B,0p_4B,0p_4?\0p_4B,0p_4D0p_4<0p_4?\0p_4D0p_4G0p_4B,0p_4B,0p_4?\0p_4D0p_4B,0p_4B,0p_4?\0p_4B,0p_4?\0p_490p_4D0p_4<0p_4D0p_4?\0p_4?\0p_4D0p_4<0p_4B,0p_4B,0p_4B,0p_4B,0p_4B,0p_4D0p_4?\0p_4?\0p_4D0p_4B,0p_4<0p_4D0p_4B,0p_4?\0p_4B,0p_4?\0p_4D0p_4G0p_4?\0p_4B,0p_4D0p_4B,0p_4?\0p_4D0p_4?\0p_4B,0p_4D0p_4?\0p_4?\0p_4D0p_4?\0p_4D0p_4D0p_4D0p_4G0p_4B,0p_4D0p_4B,0p_4G0p_4J60p_4G0p_4B,0p_4J60p_4G0p_4PCR0p_4J60p_4J60p_4J60p_4Mpd0p_4G0p_4G0p_4B,0p_4J60p_4B,0p_4D0p_4D0p_4D0p_4D0p_4J60p_4D0p_4D0p_4D0p_4G0p_4G0p_4D0p_4G0p_4B,0p_4D0p_4D0p_4D0p_4D0p_4D0p_4G0p_4D0p_4D0p_4D0p_4D0p_4G0p_4J60p_4D0p_4J60p_4G0p_4D0p_4D0p_4D0p_4D0p_4G0p_4D0p_4G0p_4D0p_4D0p_4G0p_4G0p_4G0p_4G0p_4G0p_4G0p_4G0p_4G0p_4B,0p_4J60p_4G0p_4G0p_4G0p_4D0p_4D0p_4G0p_4G0p_4D0p_4G0p_4G0p_4B,0p_4G0p_4G0p_4D0p_4B,0p_4D0p_4D0p_4D0p_4?\0p_4G0p_4D0p_4B,0p_4?\0p_4G0p_4G0p_4B,0p_4D0p_4J60p_4S0p_4J60p_4S0p_4Mpd0p_4S0p_4PCR0p_4PCR0p_4Mpd0p_4S0p_4S0p_4Mpd0p_4Mpd0p_4Mpd0p_4PCR0p_4PCR0p_4S0p_4S0p_4Mpd0p_4S0p_4PCR0p_4PCR0p_4Mpd0p_4PCR0p_4U0p_4PCR0p_4Mpd0p_4Mpd0p_4Mpd0p_4PCR0p_4PCR0p_4G0p_4J60p_4J60p_4J60p_4J60p_4J60p_4J60p_4Mpd0p_4Mpd0p_4J60p_4J60p_4PCR0p_4G0p_4D0p_4B,0p_4B,0p_4D0p_4J60p_4Mpd0p_4J60p_4D0p_4S0p_4S0p_4PCR0p_4Mpd0p_4S0p_4U0p_4Mpd0p_4PCR0p_4G0p_4Mpd0p_4G0p_4J60p_4J60p_4G0p_4Mpd0p_4J60p_4J60p_4J60p_4Mpd0p_4J60p_4PCR0p_4Mpd0p_4PCR0p_4S0p_4S0p_4PCR0p_4Mpd0p_4PCR0p_4PCR0p_4Mpd0p_4J60p_4Mpd0p_4PCR0p_4G0p_4Mpd0p_4Mpd0p_4J60p_4Mpd0p_4J60p_4J60p_4Mpd0p_4Mpd0p_4Mpd0p_4Mpd0p_4Mpd0p_4Mpd0p_4J60p_4S0p_4Mpd0p_4Mpd0p_4J60p_4Mpd0p_4Mpd0p_4G0p_4D0p_4G0p_4D0p_4B,0p_4D0p_4B,0p_4D0p_4D0p_4D0p_4D0p_4?\0p_4G0p_4B,0p_4B,0p_4?\0p_4B,0p_4?\0p_4B,0p_4B,0p_4B,0p_4B,0p_4B,0p_4B,0p_4B,0p_4B,0p_4?\0p_4D0p_4D0p_4?\0p_4B,0p_4B,0p_4<1:,4B,1:,4B,0p_4D0p_4D0p_4D0p_4B,0p_4B,0p_4D0p_4D0p_4D0p_4D0p_4D0p_4B,0p_4B,0p_4D0p_4B,0-]4B,0p_4D0p_4G0p_4D0-]4D0-]4G0p_4G0p_4?\0p_4D0p_4G0p_4G0p_4D0p_4B,0p_4B,0p_4D0p_4D0p_4D0p_4J60p_4<0p_4B,0p_4D0p_4D0p_4D0p_4B,0p_4B,0p_4B,0p_4D0p_4D0p_4?\0p_4G0p_4B,0p_4D0p_4B,0p_4B,0p_4<0p_4?\0p_4B,0p_4G0p_4D0p_4D0p_4D0p_4G0p_4G0p_4D0p_4D0p_4<0p_4D0p_4D0p_4B,0p_4B,0p_4B,0p_4D0p_4B,0p_4?\0-]4B,0p_4?\0p_4D0p_4B,0p_4B,0p_4B,0p_4?\0p_4B,0p_4D0p_4B,0p_4B,0p_4D0p_4?\0p_4D0p_4B,0p_4<0p_4D0p_4?\0-]4B,0p_4B,0p_4D0p_4B,0p_4?\0p_4?\0p_490p_4B,0p_4B,0p_4B,0p_4<0p_4?\0p_4B,0p_4G0p_4B,0p_4G0p_4D0p_4G0p_4G0p_4Mpd0p_4B,0p_4J60p_4J60p_4G0p_4Mpd0p_4G0p_4D0p_4U0p_4Mpd0p_4D0p_4G0p_4G0p_4G0p_4Mpd0p_4J60p_4D0p_4Mpd0p_4Mpd0p_4J60p_4G0p_4G0p_4G0p_4Mpd0p_4J60p_4G0p_4G0p_4G0p_4G0p_4D0p_4D0p_4B,0p_4D0p_4G0p_4G0p_4D0p_4G0p_4D0p_4D0p_4D0p_4G0p_4J60p_4D0p_4G0p_4D0p_4D0p_4D0p_4D0p_4?\0p_4D0p_4<0p_4B,0p_4?\0p_4?\0p_4<0p_4D0p_4?\0p_4D0p_4?\0p_4B,0p_4B,0p_4D0p_4?\0p_4B,0p_4B,0p_4B,0p_4D0p_4?\0p_4<0p_4D0p_4?\0p_4?\0p_4?\0p_4<0p_4?\0p_4B,0p_4?\0p_4D0p_4?\0p_4B,0p_4B,0p_4B,0p_4?\0p_4D0p_4<0p_4B,0p_4?\0p_4<0p_4?\0p_4B,0p_4<0p_4B,0p_4D0p_4G0p_4?\0p_4?\0p_4B,0p_4?\0p_4G0p_4?\0p_4B,0p_4?\0p_4B,0p_46t0p_4<0p_4?\0p_4?\0p_4B,0p_4B,0p_4B,0p_4?\0p_4D0p_4?\0p_4J60p_4<0p_4B,0p_4?\0p_4?\0p_4B,0p_4B,0p_4?\0p_4D0p_4B,0p_4G0p_4B,0p_4B,0p_4B,0p_4B,0p_4?\0p_4?\0p_4B,0p_4B,0p_4B,0p_4D0p_4?\0p_4D0p_4B,0p_4?\0p_4?\0p_4<0p_4B,0p_4<0p_4D0p_4D0p_4?\0p_4B,0p_4?\0p_4B,0p_4?\0p_4?\0p_4<0p_4<0p_4B,0p_4?\0p_4B,0p_4<0p_4B,0p_4?\0p_4B,0p_4D0p_4?\0p_4B,0p_4?\0p_4?\0p_4?\0p_4?\0p_4D0p_4B,0p_4?\0p_4J60p_4B,0p_4?\0p_4?\0p_4D0p_4G0p_4B,0p_4D0p_4G0p_4G0p_4G0p_4D0p_4<0p_4D0p_4D0p_4G0p_4D0p_4D0p_4G0p_4J60p_4Mpd0p_4G0p_4B,0p_4B,0p_4G0p_4B,0p_4D0p_4J60p_4B,0p_4D0p_4D0p_4D0p_4D0p_4D0p_4G0p_4?\0p_4D0p_4D0p_4D0p_4G0p_4D0p_4G0p_4G0p_4D0p_4B,0p_4D0p_4D0p_4D0p_4D0p_4G0p_4B,0p_4G0p_4D0p_4G0p_4G0p_4D0p_4Mpd0p_4B,0p_4G0p_4?\0p_4B,0p_4B,0p_4?\0p_4D0p_4D0p_4B,0p_4?\0p_4D0p_4G0p_4D0p_4B,0p_4D0p_4?\0p_4<0p_4D0p_4?\0p_4B,0p_4?\0p_4B,0p_4B,0p_4B,0p_4B,0p_4B,0p_4?\0p_4B,0p_4?\0p_4?\0p_4D0p_4?\0p_4B,0p_4B,0p_4D0p_4<0p_4?\0p_4B,0p_4B,0p_490p_4B,0-]491:,4<0-]4B,0-]4?\0-]4?\0-]4<0-]4?\1:,4<0-]4D1:,4B,0p_491:,4B,0-]4?\0p_4?\0p_46t0-]4?\0p_4?\0p_4B,0p_4?\0p_4<0p_4B,0p_4B,0p_4<0p_4?\0p_4<0p_4B,0p_4<0p_4B,0p_4?\0p_4<0p_4B,0p_4?\0p_4B,0p_4<0p_4B,0p_4<0p_4?\0p_4B,0p_4?\0p_4?\0p_4?\0p_4?\0p_4?\0p_4?\0p_490p_4?\0p_4?\0p_4?\0p_4?\0p_4D0p_4<0p_4?\0p_4<0p_490p_4?\0p_490p_4?\0p_4<0p_4<0p_4<0p_4<0p_4<0p_4B,0p_4G0p_4Mpd0p_4G0p_4J60p_4D0p_4Mpd0p_4J60p_4G0p_4Mpd0p_4G0p_4J60p_4D0p_4J60p_4J60p_4D0p_4J60p_4D0p_4B,0p_4Mpd0p_4G0p_4G0p_4D0p_4J60p_4J60p_4J60p_4J60p_4G0p_4J60p_4G0p_4D0p_4B,0p_4D0p_4B,0p_4<0p_4D0p_4<0p_4B,0p_4D0p_4B,0p_4D0p_4D0p_4B,0p_4J60p_4G0p_4J60p_4J60p_4G0p_4D0p_4J60p_4G0p_4G0p_4J60p_4D0p_4J60p_4Mpd0p_4Mpd0p_4J60p_4PCR0p_4PCR0p_4Mpd0p_4PCR0p_4PCR0p_4Mpd0p_4U0p_4Mpd0p_4Mpd0p_4PCR0p_4Mpd0p_4PCR0p_4S0p_4S0p_4PCR0p_4S0p_4Mpd0p_4PCR0p_4PCR0p_4S0p_4Mpd0p_4PCR0p_4Mpd0p_4PCR0-]4PCR0p_4U0p_4PCR0p_4Mpd0p_4Mpd0p_4Mpd0p_4J60p_4PCR0p_4J60p_4Mpd0p_4J60p_4J60p_4U0p_4U0p_4PCR0p_4Mpd0p_4Mpd0p_4Mpd0p_4J60p_4Mpd0p_4Mpd0p_4S0p_4S0p_4PCR0p_4J60p_4PCR0p_4PCR0p_4PCR0p_4J60p_4J60p_4G0p_4J60p_4B,0p_4?\0p_4B,0p_4?\0p_4B,0p_4?\0p_4?\0p_4?\0p_4B,0p_4?\0p_4D0p_4B,0p_4D0p_4?\0p_4D0p_4B,0p_4B,0p_4B,0p_4?\0p_4B,0p_4D0p_4B,0p_4?\0p_4D0p_4D0p_4B,0p_4?\0p_4B,0p_4B,0p_4D0p_4?\0p_4?\0p_4D0p_4<0p_4D0p_4B,0p_4B,0p_4B,0p_4?\0p_4?\0p_4?\0p_4B,0p_4?\0p_4Mpd0p_4J60p_4PCR0p_4Mpd0p_4J60p_4Mpd0p_4J60p_4J60p_4J60p_4PCR0p_4J60p_4G0p_4G0p_4G0p_4D0p_4G0p_4B,0p_4D0p_4D0p_4G0p_4D0p_4G0p_4G0p_4D0p_4B,0p_4J60p_4D0p_4J60p_4D0p_4D0p_4G0p_4D0p_4?\0p_4D0p_4?\0p_4B,0p_4?\0p_4?\0p_4?\0p_4B,0p_4?\0p_4<0p_4B,0p_4B,0p_490p_4?\0p_4?\0p_4B,0p_4D0p_4B,0p_4?\0p_4?\0p_4?\0p_4D0p_4<0p_4?\0p_4?\0p_4?\0p_4?\0p_4?\0p_4D0p_4D0p_4D0p_4D0p_4B,0p_4G0p_4B,0p_490p_4<0p_4B,0p_4<0p_4?\0p_4B,0p_4?\0p_4?\0p_4B,0p_4B,0p_4<0p_4?\0p_4?\0p_4<0p_4B,0p_490p_4?\0p_4<0p_4B,0p_4?\0p_4?\0p_4<0p_4?\0p_490p_46t0p_4<0p_4<0p_4?\0p_4?\0p_4?\0p_4<0p_4?\0p_4<0p_4?\0p_490p_4<0p_4<0p_46t0p_440p_490p_46t0p_490p_490p_46t0p_46t0p_46t0p_440p_4<0p_440p_490p_490p_440p_490p_46t0p_46t0p_440p_490p_46t0p_46t0p_490p_490p_490p_46t0p_490p_490p_4<0p_46t0p_4<0p_490p_490p_46t0p_490p_490p_490p_490p_4<0p_490p_4?\0p_4B,0p_4?\0p_4<0p_4<0p_4?\0p_4B,0p_4B,0p_4B,0p_4?\0p_4B,0p_4B,0p_4?\0p_4B,0p_4<0p_4B,0p_4?\0p_46t0p_4<0p_4<0p_46t0p_46t0p_4?\0p_490p_490p_46t0p_4?\0p_490p_4?\0p_4<0p_4<0p_490p_4?\0p_4B,0p_490p_4?\0p_490p_46t0p_490p_4?\0p_46t0p_490p_4<0p_46t0p_4?\0p_4<0p_490p_4<0p_4<0p_490p_490p_490p_490p_4?\0p_4<0p_490p_4<0p_4?\0p_4<0p_4?\0p_4<0p_4?\0p_4<0p_4?\0p_4?\0p_490p_4<0p_490p_490p_4<0p_490p_490p_4?\0p_4<0p_490p_490p_4?\0p_4<0p_490p_4<0p_440p_4?\0p_4?\0p_4?\0p_4?\0p_4?\0p_4B,0p_4?\0p_4?\0p_4B,0p_4?\0p_4?\0p_4D0p_4<0p_4B,0p_4B,0p_4?\0p_4B,0p_4?\0p_4?\0p_4D0p_4<0p_4?\0p_4B,0p_4B,0p_4B,0p_4?\0p_4B,0p_4?\0p_4?\0p_4?\0p_4<0p_4?\0p_4B,0-]4B,0-]4<0p_4?\0p_4?\1:,4D1:,4?\0-]4?\1:,4?\0p_4<0p_4<0p_4?\0p_4?\0p_4<0p_4?\0p_4?\0p_4<0p_4?\0p_4?\0p_4B,0p_4<0p_4<0p_4B,0p_4B,0p_4<0p_4?\0p_4<0p_4?\0p_4<0p_4?\0p_4B,0p_4B,0p_4B,0p_4B,0p_4?\0p_4?\0p_46t0p_4<0p_4?\0p_4?\0p_4<0p_4?\0p_4<0p_4<0p_4?\0p_4D0p_4<0p_490p_4B,0p_4B,0p_4<0p_4<0p_4?\0p_4B,0p_4?\0p_4?\0p_4<0p_4B,0p_4<0p_4<0p_4?\0p_4?\0p_4<0p_4?\0p_4<0p_4<0p_490p_4<0p_490p_4?\0p_4<0p_4B,0p_490p_4<0p_4?\0p_46t0p_4<0p_4<0p_4<0p_4<0p_490p_4<0p_4?\0p_490p_4?\0p_490p_4<0p_4<0p_490p_4<0p_4<0p_4<0p_4<0p_46t0p_4<0p_4<0p_4<0p_490p_4?\0p_4?\0p_4<0p_4<0p_4?\0p_46t0p_440p_4<0p_41FX0p_46t0p_46t0p_4<0p_46t0p_4<0p_46t0p_490p_46t0p_490p_490p_46t0p_4<0p_4.v*0p_46t0p_46t0p_490p_4?\0p_490p_4<0p_490p_46t0p_4?\0p_4<0p_490p_490p_4<0p_490p_490p_4<0p_4<0p_490p_4?\0p_4B,0p_490p_490p_46t0p_4?\0p_490p_490p_490p_490p_4?\0p_4<0p_490p_46t0p_46t0p_46t0p_490p_440p_46t0p_4<0p_490p_440p_4<0p_46t0p_46t0p_46t0p_440p_490p_46t0p_4<0p_440p_490p_46t0p_41FX0p_490p_490p_440p_41FX0p_490p_46t0p_440p_440p_440p_490p_46t0p_41FX0p_46t0p_46t0p_440p_46t0p_490p_440p_41FX0p_46t0p_46t0p_440p_4+<0p_41FX0p_4.v*0p_4.v*0p_490p_41FX0p_440p_41FX0p_440p_46t0p_46t0p_41FX0p_46t0p_41FX0p_440p_440p_41FX0p_41FX0p_41FX0p_46t0p_490p_440p_46t0p_490p_46t0p_440p_46t0p_46t0p_490p_41FX0p_46t0p_46t0p_440p_46t0p_46t0p_46t0p_490p_46t0p_4?\0p_440p_4<0p_41FX0p_46t0p_440p_490p_440p_46t0p_440p_440p_440p_440p_46t0p_440p_41FX0p_440p_490p_4.v*0p_46t0p_46t0p_440p_440p_440p_41FX0p_46t0p_440p_440p_41FX0p_490p_41FX0p_440p_41FX0p_46t0p_440p_46t0p_46t0p_4?\0p_490p_490p_490p_46t0p_490p_490p_490p_440p_440p_41FX0p_46t0p_41FX0p_490p_440p_46t0p_440p_440p_490p_46t0p_46t0p_440p_4?\0p_490p_4?\0p_4?\0p_4<0p_4?\0p_4<0p_490p_490p_46t0p_4B,0p_4<0p_4<0p_490p_490p_490p_490p_46t0p_490p_490p_490p_46t0p_490p_4<0p_490p_490p_490p_46t0p_4<0p_4?\0p_46t0p_4<0p_490p_490p_490p_46t0p_46t0p_490p_46t0p_490p_490p_4<0p_4B,0p_4?\0p_4<0p_4<0p_490p_4B,0p_490p_4?\0p_4?\0p_4?\0p_46t0p_4?\0p_4?\0p_4?\0p_4?\0p_4<0p_4<0p_4?\0p_4<0p_46t0p_46t0p_46t0p_490p_41FX0p_490p_490p_490p_490p_440p_490p_41FX0p_46t0p_490p_46t0p_440p_46t0p_440p_4<0p_440p_440p_440p_490p_46t0p_46t0p_4<0p_46t0p_4<0p_440p_46t0p_4<0p_440p_4<0p_46t0p_490p_490p_46t0p_46t0p_46t0p_490p_490p_490p_46t0p_490p_490p_46t0p_440p_4<0p_490p_46t0p_4<0p_490p_4<0p_490p_4<0p_4?\0p_46t0p_4?\0p_4<0p_46t0p_440p_46t0p_490p_490p_490p_440p_4<0p_4<0p_490p_4<0p_4X0p_46t0p_4B,0p_46t0p_490p_490p_4<0p_490p_46t0p_440p_440p_490p_41FX0p_46t0p_4<0p_490p_440p_46t0p_46t0p_46t0p_490p_46t0p_46t0p_440p_490p_46t0p_46t0p_46t0p_46t0p_46t0p_440p_46t0p_490p_46t0p_46t0p_490p_490p_4<0p_440p_490p_490p_4?\0p_46t0p_490p_490p_4<0p_490p_490p_490p_4<0p_490p_490p_490p_46t0p_4<0p_490p_4<0p_4?\0p_490p_46t0p_4<0p_490p_46t0p_490p_490p_41FX0p_41FX0p_41FX0p_440p_41FX0p_4<0p_46t0p_41FX0p_440p_440p_46t0p_440p_440p_46t0p_490p_41FX0p_440p_46t0p_440p_490p_490p_46t0p_440p_41FX0p_490p_46t0p_46t0p_46t0p_490p_4?\0p_46t0p_490p_4<0p_4?\0p_46t0p_4?\0p_490p_4<0p_4?\0p_490p_4<0p_46t0p_490p_41FX0p_4<0p_440p_46t0p_490p_440p_46t0p_46t0p_46t0p_46t0p_440p_46t0p_440p_4<0p_440p_440p_4<0p_490p_46t0p_46t0p_490p_490p_4<0p_46t0p_4<0p_46t0p_4<0p_490p_490p_440p_4<0p_490p_490p_490p_46t0p_440p_46t0p_440p_440p_440p_440p_46t0p_440p_440p_41FX0p_440p_41FX0p_41FX0p_440p_440p_440p_440p_41FX0p_41FX0p_440p_440p_41FX0p_41FX0p_440p_46t0p_4.v*0p_41FX0p_46t0p_4.v*0p_440p_4.v*0p_46t0p_440p_440p_440p_41FX0p_4.v*0p_41FX0p_440p_46t0p_41FX0p_4.v*0p_440p_4.v*0p_4.v*0p_41FX0p_41FX0p_41FX0p_440p_440p_4.v*0p_46t0p_440p_4.v*0p_46t0p_41FX0p_440p_440p_4.v*0p_440p_41FX0p_41FX0p_4.v*0p_41FX0p_4.v*0p_41FX0p_440p_41FX0p_440p_4(0p_4.v*0p_440p_440p_4.v*0p_41FX0p_41FX0p_440p_440p_41FX0p_46t0p_46t0p_41FX0p_46t0p_490p_46t0p_490p_440p_490p_41FX0p_490p_490p_46t0p_440p_490p_46t0p_4.v*0p_4.v*0p_41FX0p_440p_41FX0p_4.v*0p_46t0p_46t0p_490p_440p_490p_440p_440p_440p_46t0p_490p_440p_490p_46t0p_440p_490p_46t0p_440p_490p_41FX0p_490p_490p_440p_46t0p_41FX0p_46t0p_46t0p_440p_440p_46t0p_4+<0p_440p_41FX0-]4.v*0-]440p_440p_41FX0p_4.v*0p_41FX0p_41FX0p_41FX0p_41FX0p_440p_46t0p_440p_4.v*0p_4.v*0p_41FX0p_4.v*0p_41FX0p_41FX0p_4.v*0p_4+<0p_41FX0p_4+<0p_440p_440p_4.v*0p_4.v*0p_4.v*0p_41FX0p_41FX0p_41FX0p_4+<0p_41FX0p_4.v*0p_4.v*0p_440p_4.v*0p_440p_41FX0p_41FX0p_440p_41FX0p_4+<0p_4.v*0p_4.v*0p_41FX0p_41FX0p_4+<0p_440p_41FX0p_4.v*0p_4.v*0p_41FX0p_41FX0p_41FX0p_41FX0p_46t0p_41FX0p_4.v*0p_440p_4.v*0p_41FX0p_41FX0p_46t0p_41FX0p_46t0p_440p_41FX0p_490p_490p_4+<0p_41FX0p_4(0p_4.v*0p_4.v*0p_41FX0p_4.v*0p_4.v*0p_4.v*0p_41FX0p_4.v*0p_4.v*0p_4.v*0p_4+<0p_4.v*0p_4+<0p_41FX0p_4+<0p_4+<0p_4.v*0p_41FX0p_4.v*0p_4+<0p_4+<0p_4+<0p_4.v*0p_4.v*0p_41FX0p_4+<0p_4+<0p_4(0p_4.v*0p_4.v*0p_41FX0p_4(0p_4+<0p_4+<0p_41FX0p_41FX0p_4.v*0p_4(0p_4+<0p_41FX0p_440p_4.v*0p_440p_41FX0p_4+<0p_440p_440p_41FX0p_41FX0p_440p_41FX0p_41FX0p_4.v*0p_440p_41FX0p_41FX0p_4.v*0p_41FX0p_41FX0p_440p_41FX0p_4.v*0p_440p_41FX0p_440p_440p_41FX0p_440p_41FX0p_490p_440p_41FX0p_4.v*0p_46t0p_440p_440p_41FX0p_41FX0p_41FX0p_46t0p_4.v*0p_440p_4(0p_440p_4.v*0p_4+<0p_41FX0p_4.v*0p_4.v*0p_4+<0p_4.v*0p_4.v*0p_4.v*0p_41FX0p_41FX0p_440p_440p_440p_41FX0p_41FX0p_440p_41FX0p_4+<0p_4.v*0p_4.v*0p_4.v*0p_4+<0p_41FX0p_4+<0p_4+<0p_41FX0p_41FX0p_41FX0p_4.v*0p_41FX0p_4.v*0p_41FX0p_41FX0p_440p_4.v*0p_41FX0p_4+<0p_41FX0p_440p_4.v*0p_41FX0p_41FX0p_41FX0p_41FX0p_4.v*0p_41FX0p_440p_41FX0p_440p_41FX0p_440p_4+<0p_41FX0p_46t0p_4.v*0p_41FX0p_440p_41FX0p_41FX0p_440p_46t0p_46t0p_440p_46t0p_440p_440p_41FX0p_440p_41FX0p_4<0p_46t0p_46t0p_490p_46t0p_4<0p_490p_490p_440p_4<0p_46t0p_4<0p_490p_46t0p_490p_46t0p_46t0p_440p_490p_46t0p_46t0p_46t0p_490p_46t0p_440p_46t0p_490p_46t0p_46t0p_46t0p_4?\0p_4?\0p_4<0p_4<0p_46t0p_490p_41FX0p_4<0p_490p_4.v*0p_440p_490p_490p_46t0p_46t0p_490p_490p_46t0p_46t0p_4<0p_440p_4<0p_490p_440p_46t0p_490p_46t0p_46t0p_46t0p_46t0p_490p_490p_46t0p_490p_440p_490p_440p_46t0p_490-]490p_440p_490p_440p_490p_46t0p_490p_46t0p_490p_490-]490-]4<0p_490p_4<0p_490p_46t0p_490p_490p_4<0p_46t0p_4<0p_490p_46t0p_4<0p_490p_46t0p_490p_4<0p_41FX0p_46t0-]441349141FX146t0p_490p_41FX0-]440-]440p_46t0p_46t0-]440-]440p_440p_4?\0p_440p_41FX0p_46t0p_41FX0p_46t0p_490p_46t0p_440p_46t0p_490p_46t0p_490p_46t0p_46t0p_440-]46t0p_46t0-]46t0p_46t0p_440p_440p_41FX0p_46t0p_440p_41FX0p_46t0p_440p_46t0p_4<0p_46t0-]46t0-]490-]440-]440p_46t0p_440p_46t0p_46t0p_41FX0p_490p_440p_440p_46t0p_440p_490p_46t0p_490p_440p_440p_41FX0p_440p_440p_41FX0p_440p_46t0p_440p_440p_4.v*0p_46t1:,46t0p_41FX0p_440p_440p_440p_41FX0p_440p_46t0p_440p_41FX0p_41FX0p_490p_41FX0p_440p_41FX0p_440p_41FX0p_46t0p_41FX0p_41FX0p_440p_46t0p_41FX0p_41FX0p_440p_46t0p_41FX0p_440p_440p_4.v*0p_4.v*0p_4.v*0p_4+<0p_41FX0p_4.v*0p_41FX0p_4+<0p_440p_41FX0p_41FX0p_41FX0p_41FX0p_4.v*0p_4+<0p_41FX0p_4+<0p_4.v*0p_4+<0p_41FX0p_4+<1:,4.v*0p_4(0p_4.v*0p_4+<0-]4+<0p_4.v*0p_4+<0p_41FX0p_4.v*0p_440p_4+<0p_4+<0p_4.v*0p_4+<0p_4+<0p_4+<0p_4+<0p_4.v*0p_4+<0p_41FX0p_4.v*0p_4.v*0p_4+<0p_4+<0p_4+<0p_4+<0p_4(0p_4.v*0p_41FX0p_4+<0p_4.v*0p_4.v*0p_4+<0p_4+<0p_4.v*0p_4.v*0p_4.v*0p_4(0p_4.v*0p_4+<0p_4.v*0p_41FX0p_4.v*0p_4+<0p_41FX0p_4.v*0p_4+<0p_4.v*0p_4(0p_4.v*0p_4+<0p_4.v*0p_4.v*0p_4.v*0p_4.v*0p_4.v*0p_41FX0p_4+<0p_4+<0p_4.v*0p_440p_46t0p_41FX0p_41FX0p_440p_46t0p_41FX0p_490p_41FX0p_41FX0p_41FX0p_440p_440p_41FX0p_440p_440p_41FX0p_41FX0p_440p_41FX0p_4.v*0p_46t0p_41FX0p_4.v*0p_440p_440p_4.v*0p_41FX0p_41FX0p_41FX0p_41FX0p_440p_41FX0p_46t0p_440p_4+<0p_41FX0p_4+<0p_41FX0p_440p_41FX0p_46t0p_41FX0p_440p_46t0p_46t0p_4.v*0p_4+<0p_4+<0p_4+<0p_4.v*0p_41FX0p_4+<0p_41FX0p_4.v*0p_4.v*0p_4+<0p_4.v*0p_4(0p_4.v*0p_4+<0p_4.v*0p_4.v*0p_4+<0p_4(0p_4+<0p_4(0p_4.v*0p_4+<0p_4.v*0p_4+<0p_41FX0p_4+<0p_4(0p_4+<0p_4+<0p_4+<0p_4+<0p_4.v*0p_4+<0p_4.v*0p_4.v*0p_4(0p_4.v*0p_4.v*0p_41FX0p_4+<0p_4+<0p_4+<0p_4&0p_4&0p_4#/0p_4(0p_4&0p_4+<0p_4&0p_4+<0p_4+<0p_4.v*0p_4.v*0p_4(0p_4+<0p_4+<0p_4+<0p_4.v*0p_4.v*0p_4(0p_4.v*0p_4.v*0p_4+<0p_440p_4+<0p_4.v*0p_41FX0p_4.v*0p_41FX0p_4.v*0p_4.v*0p_4.v*0p_440p_4+<0p_41FX0p_4+<0p_4+<0p_4+<0p_4.v*0p_4.v*0p_41FX0p_4.v*0p_4(0p_4.v*0p_4+<0p_41FX0p_4.v*0p_41FX0p_440p_4.v*0p_4+<0p_4+<0p_4&0p_41FX0p_4(0p_4.v*0p_4+<0p_4.v*0p_4.v*0p_4+<0p_4+<0p_4+<0p_41FX0p_4+<0p_4&0p_4.v*0p_4(0p_4+<0p_4(0p_4+<0p_4(0p_4(0p_4#/0p_40p_4 _0p_4 _0p_4(0p_4(0p_4.v*0p_4(0p_4+<0p_4&0p_4(0p_4+<0p_4+<0p_4.v*0p_4+<0p_4+<0p_4+<0p_4+<0p_4+<0p_4.v*0p_4+<0p_4&0p_4+<0p_4+<0p_41FX0p_4.v*0p_4.v*0p_41FX0p_41FX0p_440p_41FX0p_41FX0p_41FX0p_41FX0p_440p_4.v*0p_4.v*0p_440p_41FX0p_4.v*0p_440p_440p_41FX0p_46t0p_4.v*0p_41FX0p_41FX0p_440p_440p_41FX0p_440p_41FX0p_41FX0p_41FX0p_440p_46t0p_41FX0p_440p_4.v*0p_4.v*0p_46t0p_440p_440p_46t0p_440p_41FX0p_4(0p_4.v*0p_4+<0p_4.v*0p_4+<0p_41FX0p_4+<0p_4.v*0p_4+<0p_4+<0p_41FX0p_41FX0p_41FX0p_4.v*0p_4.v*0p_4.v*0p_4.v*0p_4+<0p_4.v*0p_41FX0p_46t0p_41FX0p_4+<0p_4.v*0p_41FX0p_4(0p_4.v*0p_4.v*0p_4.v*0p_4+<0p_41FX0p_41FX0p_4+<0p_440p_41FX0p_41FX0p_41FX0p_4+<0p_4+<0p_4.v*0p_41FX0p_4.v*0p_41FX0p_4+<0p_4+<0p_46t0p_4+<0p_4+<0p_4.v*0p_4.v*0p_4.v*0p_41FX0p_41FX0p_4+<0p_4.v*0p_4.v*0p_4.v*0p_4+<0p_4.v*0p_4.v*0p_4(0p_41FX0p_4+<0p_4.v*0p_41FX0p_4.v*0p_41FX0p_4(0p_4+<0p_4.v*0p_4.v*0p_4.v*0p_41FX0p_41FX0p_4(0p_4.v*0p_4+<0p_41FX0p_4+<0p_4.v*0p_41FX0p_4.v*0p_4+<0p_440p_4+<0p_4+<0p_4.v*0p_4.v*0p_4+<0p_4.v*0p_46t0p_4.v*0p_41FX0p_4+<0p_4+<0p_490p_4(0p_4.v*0p_4&0p_41FX0p_4.v*0p_4+<0p_4(0p_4+<0p_41FX0p_4.v*0p_4.v*0p_4.v*0p_41FX0p_41FX0p_440p_4.v*0p_440p_4.v*0p_41FX0p_4.v*0p_440p_41FX0p_46t0p_4.v*0p_440p_41FX0p_440p_46t0p_46t0p_41FX0p_490p_46t0p_490p_440p_440p_46t0p_46t0p_440p_46t0p_440p_490p_46t0p_41FX0p_4<0p_46t0p_440p_440p_4.v*0p_41FX0p_4.v*0p_440p_4+<0p_46t0p_4.v*0p_41FX0p_4.v*0p_41FX0p_41FX0p_440p_41FX0p_4.v*0p_440p_4.v*0p_440p_4.v*0p_41FX0p_41FX0p_41FX0p_440p_41FX0p_4.v*0p_41FX0p_41FX0p_41FX0p_440p_440p_4.v*0p_4.v*0p_440p_4.v*0p_440p_490p_41FX0p_41FX0p_440p_440p_4.v*0p_440p_440p_4.v*0p_4.v*0p_4.v*0p_46t0p_4.v*0p_440p_4+<0p_4.v*0p_41FX0p_41FX0p_440p_4.v*0p_41FX0p_46t0p_41FX0p_4.v*0p_4.v*0p_41FX0p_41FX0p_4.v*0p_4.v*0p_440p_4.v*0p_440p_41FX0p_41FX0p_4+<0p_4+<0p_41FX0p_4.v*0p_440p_41FX0p_41FX0p_4.v*0p_4+<0p_4+<0p_4.v*0p_41FX0p_4.v*0p_4.v*0p_440p_4.v*0p_41FX0p_4+<0p_4.v*0p_440p_46t0p_4+<0p_41FX0p_4(0p_4(0p_4.v*0p_4+<0p_41FX0p_440p_4.v*0p_41FX0p_4.v*0p_4.v*0p_4.v*0p_41FX0p_4.v*0p_440p_4.v*0p_41FX0p_4+<0p_4+<0p_440p_41FX0p_440p_440p_46t0p_41FX0p_440p_440p_440p_440p_440p_41FX0p_440p_440p_41FX0p_41FX0p_4.v*0p_4.v*0p_4.v*0p_4.v*0p_4+<0p_440p_41FX0p_490p_46t0p_440p_46t0p_41FX0p_46t0p_440p_440p_41FX0p_46t0p_46t0p_490p_440p_490p_41FX0p_46t0p_440p_41FX0p_46t0p_46t0p_46t0p_46t0p_46t0p_440p_440p_46t0p_46t0p_46t0p_46t0p_440p_41FX0p_4+<0p_41FX0p_4.v*0p_4.v*0p_41FX0p_4+<0p_4.v*0p_41FX0p_4.v*0p_4.v*0p_41FX0p_46t0p_4.v*0p_41FX0p_41FX0p_41FX0p_440p_4.v*0p_46t0p_4.v*0p_46t0p_4.v*0p_440p_41FX0p_46t0p_4.v*0p_41FX0p_440p_41FX0p_41FX0p_4.v*0p_46t0p_41FX0p_41FX0p_46t0p_46t0p_440p_41FX0p_440p_41FX0p_440p_4+<0p_46t0p_41FX0p_440p_490p_46t0p_440p_46t0p_490p_46t0p_440p_490p_46t0p_440p_440p_46t0p_490p_440p_440p_46t0p_46t0p_46t0p_46t0p_440p_41FX0p_440p_440p_440p_41FX0p_440p_440p_440p_41FX0p_41FX0p_41FX0p_4.v*0p_440p_41FX0p_41FX0p_41FX0p_41FX0p_440p_440p_46t0p_46t0p_46t0p_440p_46t0p_440p_490p_46t0p_41FX0p_490p_440p_41FX0p_490p_46t0p_41FX0p_4.v*0p_440p_46t0p_490p_440p_490p_46t0p_46t0p_440p_46t0p_490p_4<0p_4D0p_490p_46t0p_490p_490p_46t0p_46t0p_4<0p_46t0p_490p_46t0p_41FX0p_440p_41FX0p_46t0p_41FX0p_41FX0p_46t0p_440p_490p_440p_440p_490p_440p_41FX0p_46t0p_440p_440p_440p_46t0p_490p_46t0p_440p_46t0p_46t0p_440p_46t0p_46t0p_46t0p_46t0p_440p_46t0p_46t0p_46t0p_440p_490p_46t0p_440p_440p_440p_440p_41FX0p_440p_440p_440p_4.v*0p_46t0p_46t0p_440p_41FX0p_440p_4.v*0p_440p_41FX0p_46t0p_41FX0p_440p_490p_41FX0p_46t0p_440p_490p_4.v*0p_4.v*0p_440p_46t0p_440p_440p_440p_440p_4.v*0p_440p_4.v*0p_440p_41FX0p_440p_4.v*0p_41FX0p_41FX0p_41FX0p_440p_4.v*0p_4+<0-]440p_4+<0p_46t0p_4.v*0p_4.v*0p_4+<0p_4(0p_4.v*0p_4.v*0p_41FX0p_4+<0p_4.v*0p_41FX0p_41FX0p_4(0p_4.v*0p_4.v*0p_4.v*0p_4.v*0p_440p_4(0p_4.v*0p_4(0p_4.v*0p_4.v*0p_4.v*0p_4+<0p_4+<0p_41FX0p_41FX0p_41FX0p_4.v*0p_4.v*0p_4+<0p_41FX0p_4.v*0p_41FX0p_4+<0p_41FX0p_4+<0p_440p_4+<0p_4+<0p_4.v*0p_4(0p_4.v*0p_4.v*0p_440p_4.v*0p_4.v*0p_440p_41FX0p_4+<0p_440p_41FX0p_4.v*0p_4.v*0p_4.v*0p_440p_4.v*0p_4.v*0p_41FX0p_41FX0p_440p_4+<0p_41FX0p_41FX0p_440p_4+<0p_41FX0p_41FX0p_4(0p_4+<0p_41FX0p_440p_4.v*0p_440p_46t0p_41FX0p_41FX0p_440p_440p_4.v*0p_41FX0p_440p_440p_440p_41FX0p_4.v*0p_4.v*0p_4+<0p_4.v*0p_4.v*0p_41FX0p_4(0p_4&0p_4(0p_4.v*0p_41FX0p_4.v*0p_41FX0p_4(0p_4.v*0p_4+<0p_4(0p_4.v*0p_4+<0p_41FX0p_4.v*0p_4.v*0p_41FX0p_4.v*0p_4+<0p_4.v*0p_4.v*0p_4.v*0p_4.v*0p_4+<0p_41FX0p_4.v*0p_41FX0p_41FX0p_4(0p_4+<0p_440p_4+<0p_4+<0p_41FX0p_4.v*0p_41FX0p_4.v*0p_4.v*0p_4.v*0p_4+<0p_4+<0p_4+<0p_4+<0p_4.v*0p_4+<0p_4+<0p_41FX0p_4+<0p_4+<0p_4+<0p_4.v*0p_4(0p_41FX0p_41FX0p_41FX0p_41FX0p_41FX0p_4+<0p_440p_41FX0p_41FX0p_41FX0p_440p_41FX0p_4.v*0p_440p_41FX0p_41FX0p_440p_440p_41FX0p_4.v*0p_440p_41FX0p_440p_41FX0p_41FX0p_41FX0p_41FX0p_41FX0p_4.v*0p_4.v*0p_4.v*0p_440p_4.v*0p_4+<0p_440p_440p_41FX0p_41FX0p_41FX0p_41FX0p_41FX0p_4.v*0p_4.v*0p_41FX0p_4.v*0p_4.v*0p_4(0p_4+<0p_41FX0p_41FX0p_4(0p_4.v*0p_41FX0p_4.v*0p_4.v*0p_4.v*0p_4.v*0p_4.v*0p_4.v*0p_4+<0p_41FX0p_41FX0p_41FX0p_4.v*0p_4.v*0p_4(0p_41FX0p_41FX0p_46t0p_41FX0p_41FX0p_41FX0p_4.v*0p_4.v*0p_41FX0p_4.v*0p_41FX0p_4.v*0p_41FX0p_46t0p_490p_4.v*0p_4.v*0p_41FX0p_4.v*0p_4.v*0p_4.v*0p_4.v*0p_41FX0p_41FX0p_4.v*0p_41FX0p_4.v*0p_4.v*0p_4+<0p_41FX0p_41FX0p_4.v*0p_440p_41FX0p_4.v*0p_4.v*0p_41FX0p_440p_41FX0p_41FX0p_46t0p_4.v*0p_41FX0p_4.v*0p_41FX0p_46t0p_4+<0p_41FX0p_440p_46t0p_41FX0p_46t0p_41FX0p_440p_4.v*0-]441:,46t0p_440-]4.v*0p_41FX0p_41FX0p_41FX0p_41FX0p_41FX0p_4.v*0p_440p_4.v*0p_41FX0p_41FX0p_41FX0p_490p_46t0p_41FX0p_41FX0p_4.v*0p_4.v*0p_440p_440p_41FX0p_440p_41FX0p_440p_4+<0p_440p_440p_41FX0p_440p_4.v*0p_41FX0p_4.v*0p_46t0p_41FX0p_46t0p_4.v*0p_440p_41FX0p_4.v*0p_4.v*0p_440p_41FX0p_440p_41FX0p_41FX0p_46t0p_4+<0p_4.v*0p_46t0p_4+<0p_41FX0p_4.v*0p_41FX0p_440p_4.v*0p_41FX0p_4.v*0p_4.v*0p_41FX0p_41FX0p_46t0p_41FX0p_46t0p_41FX0p_46t0p_440p_440p_440p_440p_440p_46t0p_41FX0p_46t0p_41FX0p_46t0p_440p_41FX0p_440p_41FX0p_440p_440p_440p_490p_41FX0p_41FX0p_46t0p_440p_46t0p_440p_440p_46t0p_440p_440p_440p_4.v*0p_41FX0p_4+<0p_41FX0p_4+<0p_4+<0p_41FX0p_4.v*0p_440p_4+<0p_440p_41FX0p_440p_4.v*0p_41FX0p_46t0p_41FX0p_440p_4.v*0p_4.v*0p_41FX0p_41FX0p_41FX0p_4.v*0p_440p_46t0p_41FX0p_41FX0p_41FX0p_440p_46t0p_490p_490p_46t0p_46t0p_46t0p_490p_490p_41FX0p_41FX0p_440p_440p_4.v*0p_4.v*0p_4(0p_4(0p_4&0p_4+<0p_440p_4.v*0p_4+<0p_41FX0p_41FX0p_4+<0p_4+<0p_4.v*0p_41FX0p_4.v*0p_4.v*0p_4.v*0p_4+<0p_4.v*0p_4+<0p_4.v*0p_4.v*0p_4+<0p_4.v*0p_4.v*0p_4(0p_4+<0p_4+<0p_4+<0p_4.v*0p_4+<0p_4&0p_4.v*0p_4(0p_4+<0p_4&0p_41FX0p_4+<0p_4.v*0p_4.v*0p_4.v*0p_4+<0p_4.v*0p_4.v*0p_4.v*0p_4(0p_4.v*0p_440p_4+<0p_4+<0p_41FX0p_4+<0p_41FX0p_4+<0p_4(0p_4+<0p_4+<0p_4+<0p_41FX0p_4(0p_4+<0p_4(0p_4.v*0p_4.v*0p_4.v*0p_4.v*0p_4+<0p_4+<0p_4.v*0p_4+<0p_4+<0p_4.v*0p_4.v*0p_4+<0p_4.v*0p_4+<0p_4.v*0p_4+<0p_4.v*0p_4+<0p_4+<0p_4.v*0p_4+<0p_4.v*0p_41FX0p_4+<0p_4+<0p_4.v*0p_4+<0p_4.v*0p_4+<0p_4.v*0p_41FX0p_4.v*0p_4.v*0p_4+<0p_4.v*0p_4.v*0p_4.v*0p_4.v*0p_4.v*0p_41FX0p_4.v*0p_41FX0p_41FX0p_4+<0p_41FX0p_4.v*0p_4.v*0p_46t0p_4.v*0p_46t0p_41FX0p_46t0p_440p_4+<0p_440p_4.v*0p_4.v*0p_4.v*0p_440p_4.v*0p_41FX0p_4.v*0p_41FX0p_440p_41FX0p_41FX0p_41FX0p_41FX0p_4(0p_440p_4.v*0p_41FX0p_440p_41FX0p_440p_41FX0p_440p_440p_4.v*0p_41FX0p_440p_4+<0p_4.v*0p_440p_41FX0p_41FX0p_440p_440p_41FX0p_46t0p_490p_46t0p_440p_46t0p_490p_440p_46t0p_46t0p_490p_4<0p_440p_41FX0p_440p_440p_41FX0p_41FX0p_440p_440p_440p_4.v*0p_4.v*0p_4(0p_4+<0p_4.v*0p_41FX0p_440p_41FX0p_41FX0p_440p_4+<0p_46t0p_41FX0p_440p_41FX0p_440p_4.v*0p_4.v*0p_41FX0p_41FX0p_440p_41FX0p_440p_41FX0p_41FX0p_41FX0p_440p_41FX0p_46t0p_41FX0p_440p_41FX0p_440p_41FX0p_440p_440p_46t0p_41FX0p_41FX0p_440p_440p_41FX0p_440p_46t0p_46t0p_440p_440p_440p_41FX0p_440p_46t0p_490p_490p_41FX0p_46t0p_46t0p_46t0p_46t0p_440p_41FX0p_490p_41FX0p_4.v*0p_440p_440p_490p_440p_46t0p_41FX0p_4?\0p_46t0p_490p_46t0p_440p_490p_490p_46t0p_46t0p_490p_490p_46t0p_46t0p_46t0p_46t0p_46t0p_46t0p_490p_46t0p_440p_46t0p_46t0p_440p_490p_440p_41FX0p_41FX0p_46t0p_440p_41FX0p_46t0p_440p_440p_440p_46t0p_46t0p_41FX0p_46t0p_440p_41FX0p_490p_490p_41FX0p_440p_440p_41FX0p_440p_440p_490p_440p_440p_440p_41FX0p_46t0p_41FX0p_41FX0p_41FX0p_440p_440p_46t0p_41FX0p_46t0p_4.v*0p_46t0p_46t0p_4.v*0p_440p_440p_46t0p_46t0p_41FX0p_440p_41FX0p_46t0p_490p_490p_46t0p_46t0p_490p_4<0p_46t0p_4<0p_4<0p_4<0p_4B,0p_490p_490p_4<0p_4?\0p_490p_46t0p_46t0p_490p_490p_4<0p_490p_4<0p_4<0p_440p_46t0p_46t0p_490p_490p_46t0p_490p_4<0p_490p_4<0p_4<0p_4<0p_490p_4<0p_440p_4<0p_490p_46t0p_4<0p_490p_46t0p_490p_490p_4<0p_490p_4<0p_46t0p_46t0p_46t0p_4<0p_46t0p_490p_46t0p_46t0p_4?\0p_490p_4<0p_440p_46t0p_440p_490p_4<0p_440p_46t0p_4<0p_440p_490p_46t0p_4<0p_440p_490p_440p_4<0p_490p_490p_4<0p_4?\0p_4?\0p_46t0p_4B,0p_4<0p_4?\0p_490p_4B,0p_46t0p_4?\0p_4<0p_4<0p_4?\0p_4?\0p_4<0p_4?\0p_4D0p_4?\0p_4B,0p_4?\0p_4B,0p_4?\0p_4?\0p_4?\0p_4D0p_4?\0p_4?\0p_490p_4?\0p_46t0p_490p_490p_4<0p_4?\0p_4?\0p_46t0p_4?\0p_440p_4<0p_490p_440p_46t0p_46t0p_490p_440p_4<0p_490p_46t0p_490p_490p_46t0p_4<0p_4<0p_4?\0p_490p_46t0p_4<0p_46t0p_46t0p_490p_46t0p_46t0p_490p_490p_490p_440p_4<0p_490p_4<0p_46t0p_440p_46t0p_490p_440p_440p_4.v*0p_46t0p_46t0p_440p_41FX0p_440p_41FX0p_46t0p_440p_41FX0p_41FX0p_46t0p_440p_440p_440p_440p_41FX0p_46t0p_440p_4.v*0p_490p_440p_46t0p_440p_41FX0p_41FX0p_46t0p_46t0p_46t0p_46t0p_4<0p_440p_490p_46t0p_490p_46t0p_4<0p_490p_4<0p_46t0p_4<0p_46t0p_490p_46t0p_490p_46t0p_490p_490p_490p_440p_490p_440p_440p_440p_440p_41FX0p_440p_46t0p_41FX0p_41FX0p_440p_41FX0p_4.v*0p_41FX0p_440p_4.v*0p_41FX0p_41FX0p_46t0p_41FX0p_41FX0p_440p_41FX0p_41FX0p_46t0p_41FX0p_41FX0p_41FX0p_41FX0p_46t0p_4.v*0p_46t0p_4.v*0p_440p_440p_4<0p_46t0p_41FX0p_440p_41FX0p_4.v*0p_440p_41FX0p_440p_41FX0p_41FX0p_440p_46t0p_41FX0p_46t0p_41FX0p_440p_490p_41FX0p_490p_41FX0p_41FX0p_440p_41FX0p_440p_4.v*0p_41FX0p_440p_41FX0p_440p_4.v*0p_440p_4.v*0p_41FX0p_440p_4.v*0p_41FX0p_41FX0p_41FX0p_440p_41FX0p_4.v*0p_41FX0p_41FX0p_46t0p_41FX0p_41FX0p_440p_4.v*0p_440p_440p_41FX0p_4.v*0p_440p_41FX0p_41FX0p_41FX0p_46t0p_4.v*0p_46t0p_41FX0p_4.v*0p_440p_440p_4.v*0p_440p_4.v*0p_440p_41FX0p_4.v*0p_4.v*0p_41FX0p_41FX0p_4.v*0p_4.v*0p_440p_440p_4(0p_41FX0p_440p_4.v*0p_41FX0p_4+<0p_46t0p_4.v*0p_46t0p_440p_4.v*0p_41FX0p_440p_41FX0p_440p_41FX0p_490p_440p_41FX0p_41FX0p_440p_4.v*0p_440p_41FX0p_440p_41FX0p_46t0p_41FX0p_4+<0p_41FX0p_46t0p_4.v*0p_4.v*0p_41FX0p_41FX0p_4+<0p_440p_41FX0p_4.v*0p_41FX0p_440p_4.v*0-]41FX0p_4.v*0p_4.v*0p_4+<0p_440p_440p_41FX0p_41FX0p_41FX14+<134.v*0-]440p_4.v*0p_41FX0p_440p_41FX0p_4.v*0p_41FX0-]41FX0p_4+<0p_440p_4.v*0p_41FX0p_440p_440p_41FX0p_440p_41FX0p_440p_41FX0p_440p_440p_41FX0p_440p_41FX0p_4+<0p_46t0p_41FX0p_41FX0p_440p_41FX0p_41FX0p_440p_41FX0p_440p_4.v*0p_440p_46t0p_440p_4.v*0p_41FX0p_41FX0p_41FX0p_4.v*0p_41FX0p_41FX0p_41FX0p_41FX0-]440p_440p_41FX0p_440p_46t0p_4.v*0p_440p_46t0p_4+<0p_4.v*0p_4.v*0p_41FX0p_41FX0p_440-]4.v*1341FX14417r46t146t14.v*1:,49146t17r490-]46t0-]46t0-]46t1:,46t0-]490p_41FX0p_490p_490p_490p_46t0p_490p_4?\0p_46t0p_490p_490p_440p_46t0p_46t0p_41FX0p_490p_46t0p_440p_46t0p_440p_46t0p_46t0p_490p_46t0p_46t0p_46t0p_440p_46t0p_440p_46t0p_46t0p_46t0p_440p_46t0p_46t0p_41FX0p_4+<0p_4+<0p_4(0p_4(1:,41FX1:,41FX0p_4.v*0p_41FX0p_440p_46t0p_46t0p_41FX0p_440p_4+<0p_41FX0p_4.v*0p_41FX0p_4.v*0p_46t0p_4.v*0p_46t0p_490p_46t0p_46t0p_490p_440p_490p_46t0p_46t0p_46t0p_46t0p_440p_46t0p_4<0p_490p_440p_490p_46t0p_46t0p_4?\0p_46t0p_490p_4<0p_46t0p_490p_490p_4?\0p_46t0p_4<0p_4<0p_440p_46t0p_490p_490p_4?\0p_46t0p_4?\0p_46t0p_490p_46t0p_4<0p_4<0p_4?\0p_4<0p_4B,0p_4<0p_4?\0p_4<0p_4<0p_4<0p_490p_4<0p_490p_4?\0p_4<0p_490p_490p_490p_4<0p_4?\0p_4<0p_4<0p_4<0p_4<0p_4<0p_4?\0p_490p_490p_4?\0p_4<0p_4?\0p_46t0p_4<0p_490p_4<0p_4D0p_4?\0-]4?\0p_4?\0p_46t0p_4<0p_4?\0p_4<0p_4<0p_4<0p_4B,0p_4<0p_4<0p_4?\0p_4<0p_4?\0p_4<0p_4?\0p_4?\0p_46t0p_4G0p_4G0p_4?\0p_4?\0p_4B,0p_4?\0p_4?\0p_4?\0p_4B,0p_4<0p_4?\0p_4B,0p_490p_4B,0p_4<0p_4?\0p_4B,0p_4B,0p_4?\0p_4B,0p_4<0p_4<0p_4D0p_4?\0p_4B,0p_4<0p_4<0p_4G0p_4D0p_4B,0p_4G0p_4D0p_4?\0p_4B,0p_4D0p_4?\0p_4B,0p_4B,0p_4B,0p_4B,0p_4?\0p_4D0p_4D0p_4B,0p_4G0p_4?\0p_4B,0p_4B,0p_4D0p_4G0p_4B,0p_4?\0p_4B,0p_4B,0p_4?\0p_4B,0p_4?\0p_4D0p_4B,0p_4?\0p_4<0p_4<0p_4B,0p_4?\0p_4?\0p_4<0p_490p_490p_490p_4?\0p_4?\0p_440p_4?\0p_490p_46t0p_490p_490p_4<0p_490p_46t0p_46t0p_4<0p_490p_490p_4<0p_46t0p_4<0p_490p_4<0p_490p_490p_490p_4<0p_4?\0p_490p_4<0p_4<0p_4<0p_490p_4?\0p_490p_4<0p_490p_4<0p_4<0p_490p_490p_490p_490p_4?\0p_490p_4<0p_4?\0p_4B,0p_490p_4?\0p_4?\0p_4?\0p_4B,0p_4?\0p_4?\0p_4<0p_4B,0p_4?\0p_4B,0p_4<0p_490p_490p_4<0p_4<0p_4B,0p_490p_4B,0p_4B,0p_490p_4<0p_4?\0p_46t0p_490p_4?\0p_490p_4?\0p_490p_4<0p_4<0p_4<0p_4<0p_4<0p_4<0p_490p_4B,0p_4<0p_490p_4?\0p_4<0p_490p_490p_4<0p_490p_4<0p_4<0p_46t0p_4D0p_4?\0p_4?\0p_4G0p_4B,0p_4D0p_4B,0p_4B,0p_4D0p_4D0p_4D0p_4?\0p_4B,0p_4?\0p_4?\0p_4D0p_4B,0p_4D0p_4B,0p_4J60p_4D0p_4?\0p_4B,0p_4B,0p_4B,0p_4?\0p_4B,0p_4B,0p_4?\0p_4?\0p_4B,0p_490p_4<0p_490-]4B,0p_4D0p_4<0p_4?\0p_4<0-]4?\0p_4B,0p_4?\0p_4<0p_4?\0p_4?\0p_4<0p_4?\0p_4<0p_490p_4B,0p_4B,0p_4<0p_4<0p_4?\0p_4<0p_4<0p_490p_46t0p_46t0-]4?\0p_4<0-]46t1:,4?\0-]46t0p_4?\0p_46t0-]46t0p_46t0p_4<0p_4?\0p_4<0p_4?\0p_440p_4<0p_4<0p_490p_46t0p_490p_46t0p_490p_490p_46t0p_4<0p_490p_490p_490p_46t0p_46t0p_46t0p_46t0p_4?\0p_440p_490p_46t0p_490p_46t0p_46t0p_490p_4<0p_490p_440p_490p_46t0p_4?\0p_490p_4?\0p_4<0p_4<0p_4<0p_46t0p_4<0-]4?\0p_4<0p_4<0p_4?\0p_46t0p_4<0p_4<0p_490p_46t0p_490p_490-]4B,0p_490p_4<0p_4<1:,4<1:,4<0p_490p_4<0-]490p_4?\0p_4<0-]4<1:,46t0p_4<0p_440p_4<0p_4<0p_46t0p_4?\0p_4<0p_4?\0p_490p_4<0p_4?\0p_4<0p_490p_490p_4<0p_46t0p_4<0p_4<0p_4<0p_490p_4<0p_490p_4?\0p_490p_4<0p_490p_4<0p_490p_490p_4<0p_46t0p_4<0p_46t0p_4?\0p_490p_490p_4?\0p_4<0p_490p_4<0p_490p_490p_490p_490p_490p_46t0p_4<0p_490p_4<0p_4<0p_490p_4?\0p_46t0p_4?\0p_4<0p_46t0p_4B,0p_490p_4<0p_4<0p_490p_490p_4<0p_46t0p_4?\0p_46t0p_490p_440p_4B,0p_46t0p_4<0p_490p_4<0p_490p_4<0p_4<0p_4<0p_46t0p_4<0p_4?\0p_490p_490p_4<0p_4<0p_490p_46t0p_490p_46t0p_4?\0p_490p_4<0p_46t0p_4<0p_4<0p_490p_440p_490p_4<0p_46t0p_46t0p_490p_490p_490p_46t0p_4<0p_4<0p_490p_4<0p_490p_490p_4<0p_490p_4<0p_4<0p_490p_46t0p_4<0p_4<0p_4<0p_440p_490p_46t0p_490p_440p_490p_490p_4?\0p_46t0p_46t0p_4<0p_490p_490p_490p_46t0p_4<0p_46t0p_440p_4?\0p_490p_490p_46t0p_490p_490p_490p_46t0p_4<0p_490p_46t0p_490p_46t0p_4<0p_490p_46t0p_490p_4<0p_4B,0p_4?\0p_4<0p_4<0p_490p_440p_490p_490p_4<0p_440p_490p_490p_46t0p_490p_46t0p_490p_490p_490p_440p_490p_490p_490p_46t0p_46t0p_46t0p_490p_46t0p_41FX0p_4.v*0p_46t0p_490p_440p_490p_4<0p_46t0p_46t0p_46t0p_46t0p_490p_440p_4<0p_46t0p_4<0p_4<0p_490p_490p_46t0p_490p_440p_490p_46t0-]41FX0p_46t0p_41FX0p_41FX0p_440p_440p_46t0p_41FX1440-]440-]46t0p_4.v*0p_440p_440p_490p_440p_41FX0p_440p_440p_41FX0p_46t0p_41FX0p_46t0p_440p_440p_46t0p_440p_46t0p_41FX0p_440p_46t0p_440p_46t0p_41FX0p_41FX0p_440p_440p_41FX0p_440p_46t0p_41FX0p_440p_4.v*0p_46t0p_440p_440p_440p_46t0p_440p_440p_46t0p_46t0p_41FX0p_41FX0p_46t0p_440p_440p_440p_46t0p_440p_46t0p_490p_41FX0p_440p_440p_440p_46t0p_490p_440p_46t0p_440p_46t0p_46t0p_46t0p_46t0p_41FX0p_41FX0p_440p_440p_46t0p_440p_440p_41FX0p_440p_46t0p_46t0p_41FX0p_4.v*0p_490p_440p_41FX0p_46t0p_4.v*0p_41FX0p_4.v*0p_41FX0p_440p_4+<0p_440p_41FX0p_440p_4+<0p_440p_4.v*0p_46t0p_4+<0p_41FX0p_4.v*0p_41FX0p_4.v*0p_4.v*0p_41FX0p_4.v*0p_41FX0p_4.v*0p_4(0p_4.v*0p_4.v*0p_41FX0p_4.v*0p_4.v*0p_4+<0p_4.v*0p_41FX0p_4+<0p_4.v*0p_41FX0p_41FX0p_4.v*0p_4.v*0p_4.v*0p_4+<0p_4+<0p_4.v*0p_4.v*0p_4.v*0p_4+<0p_4.v*0p_4+<0p_41FX0p_4.v*0p_4.v*0p_4+<0p_4.v*0p_41FX0p_46t0p_440p_41FX0p_41FX0p_41FX0p_440p_46t0p_4.v*0p_41FX0p_440p_440p_41FX0p_41FX0p_41FX0p_41FX0p_4.v*0p_4+<0p_4.v*0p_4.v*0p_440p_41FX0p_41FX0p_4.v*0p_440p_41FX0p_4.v*0p_440p_41FX0p_41FX0p_440p_4.v*0p_46t0p_41FX0p_440p_46t0p_41FX0p_41FX0p_46t0p_440p_440p_440p_440p_41FX0p_41FX0p_440p_4+<0p_41FX0p_41FX0p_41FX0p_41FX0p_440p_41FX0p_4.v*0p_440p_440p_440p_41FX0p_41FX0p_440p_41FX0p_440p_4+<0p_440-]4.v*0p_41FX0p_41FX0p_41FX0p_41FX0p_440p_41FX0-]440-]440-]41FX0-]41FX0-]440-]41FX1:,41FX0p_4+<0p_440p_41FX0p_46t0p_4+<0p_41FX0p_41FX0p_440p_41FX0p_41FX0p_41FX0p_41FX0p_41FX0p_4.v*0p_4.v*0-]41FX0p_4.v*0p_41FX0p_41FX0p_4.v*0p_4.v*0p_41FX0p_4.v*0p_41FX0p_4.v*0p_41FX0p_4.v*0p_41FX0p_4.v*0p_4.v*0p_4+<0p_46t0p_41FX0p_4.v*0p_41FX0p_440p_46t0p_4+<0p_41FX0p_41FX0p_4.v*0p_46t0p_4+<0p_41FX0p_4.v*0p_4.v*0p_440p_41FX0p_4.v*0p_4.v*0p_4.v*0p_41FX0p_440p_41FX0p_46t1:,46t0-]490p_46t0p_46t0-]46t0p_46t0p_4?\0-]4<0p_440-]440p_41FX1:,440p_46t0p_46t0-]46t0-]46t0p_440p_440p_440-]490p_440-]46t0-]490p_440-]440-]490p_46t0p_46t1:,46t0p_4<0p_440p_46t0p_41FX0p_490p_41FX0p_46t0p_440-]440p_4<0p_41FX0p_440p_41FX0p_46t0p_4.v*0p_46t0p_46t0p_41FX0p_46t0p_440p_4.v*0p_440p_4.v*0p_41FX0p_440p_46t0p_490p_490p_4<0p_490p_46t0-]490-]46t0-]46t1:,490-]4<0p_46t0p_46t0-]46t144134414+<14.v*146t141FX144141FX0-]440p_490-]4<0p_440-]4.v*0p_46t0-]41FX0-]440p_490p_41FX0p_440-]41FX0p_41FX0p_4.v*1:,440p_41FX0p_46t0p_440p_41FX0p_46t0p_41FX0p_4+<0p_4.v*0p_440p_4+<0p_440p_41FX0p_41FX0p_440p_440p_41FX0p_41FX0p_440p_490p_490p_41FX0p_440p_46t0p_440p_490p_46t0p_46t0p_41FX0p_490p_46t0p_4<0p_440p_440p_440p_440p_41FX0-]490p_440p_46t0p_46t0p_46t0p_41FX0p_46t0p_440p_440p_46t0p_490p_4.v*0p_41FX0p_4.v*0p_4.v*0p_41FX0p_46t0p_440p_490p_46t0p_46t0p_490p_46t0p_440p_490p_440p_490p_41FX0p_41FX0p_440p_41FX0p_4.v*0p_440p_41FX0-]4.v*146t0p_41FX0-]41FX0p_440p_4.v*0-]41FX0-]41FX0p_41FX0p_4.v*0p_4.v*0p_41FX0p_41FX0p_41FX0p_440p_440p_4.v*0p_41FX0p_41FX0p_440p_440p_41FX0p_46t0p_4.v*0-]4.v*1:,441:,41FX146t141FX1441:,4.v*144146t0p_41FX1:,440p_440-]490-]440-]440p_4.v*0p_440p_490p_4.v*0p_41FX0p_440p_440p_4.v*0p_46t0p_4.v*0p_490p_41FX0p_440p_41FX0p_46t0p_490p_440p_4.v*0p_440p_41FX0p_46t0p_46t0p_4.v*0p_440p_440p_490p_490p_490p_490p_46t0p_4<0p_490p_490p_46t0p_490p_490p_46t0p_46t0p_490p_46t0p_46t0p_490p_490p_46t0p_4<0p_490p_46t0p_46t0p_46t0p_46t0p_490p_46t0p_440p_41FX0p_4+<0p_440-]46t1:,44134.v*0-]46t0p_440p_440p_440p_440p_41FX0p_41FX0p_440p_490p_4.v*0p_41FX0p_41FX0p_46t0p_41FX0p_4.v*0p_41FX0p_4.v*0p_4.v*0p_4.v*0p_4+<0p_4+<0p_4+<0p_4+<0p_4.v*0p_4&0p_4.v*0p_4.v*0p_41FX0p_4+<0p_4+<0p_4+<0p_4(0p_41FX0p_4.v*0p_4(0p_4+<0p_4.v*0p_4.v*0p_4(0p_41FX0p_41FX0p_41FX0p_440p_490p_41FX0p_4.v*0p_41FX0p_46t0p_440p_490p_4.v*0p_440p_41FX0p_41FX0p_440p_41FX0p_41FX0p_41FX0p_41FX0p_41FX0p_440p_4.v*0p_440p_46t0p_41FX0p_41FX0p_440p_41FX0p_440p_41FX0p_41FX0p_490p_46t0p_4.v*0p_41FX0p_41FX0p_440p_440p_41FX0p_440p_41FX0p_41FX0p_4(0p_4(0p_41FX0p_41FX0p_440p_41FX0p_41FX0p_4.v*0p_440p_4+<0p_41FX0p_41FX0p_4.v*0p_41FX0p_440p_41FX0p_440p_4.v*0p_4.v*0p_46t0p_41FX0p_41FX0p_440p_440p_4+<0p_41FX0p_41FX0p_4.v*0p_41FX0p_4.v*0p_41FX0p_4.v*0p_4.v*0p_4.v*0p_4.v*0p_440p_41FX0p_4.v*0p_4.v*0p_41FX0p_41FX0p_4.v*0p_440p_440p_4+<0p_41FX0p_41FX0p_440p_41FX0p_41FX0p_41FX0p_4.v*0p_4.v*0p_41FX0p_440p_41FX0p_4.v*0p_46t0p_440p_4.v*0p_440p_41FX0p_440p_41FX0p_440p_440p_4.v*0p_41FX0p_4.v*0p_41FX0p_4+<0p_4+<0p_440p_41FX0p_440p_4+<0p_41FX0p_4+<0p_440p_41FX0p_4+<0p_41FX0p_4.v*0p_41FX0p_440p_41FX0p_41FX0p_41FX0p_440p_440p_46t0p_46t0p_440p_440p_490p_46t0p_440p_46t0p_46t0p_440p_440p_440p_440p_41FX0p_4+<0p_41FX0p_4&0p_41FX0p_4(0p_41FX0p_4+<0p_4+<0p_4+<0p_41FX0p_4(0p_4#/0p_4(0p_4.v*0p_4+<0p_4.v*0p_4+<0p_41FX0p_4+<0p_4.v*0p_4+<0p_41FX0p_440p_4(0p_4&0p_4+<0p_41FX0p_41FX0p_4+<0p_4.v*0p_4.v*0p_4.v*0p_4.v*0p_4+<0p_4+<0p_4.v*0p_4.v*0p_4.v*0p_4+<0p_4+<0p_4.v*0p_4(0p_4.v*0p_4+<0p_4.v*0p_440p_41FX0p_4+<0p_41FX0p_4+<0p_41FX0p_440p_4.v*0p_41FX0p_4.v*0p_4.v*0p_41FX0p_4+<0p_4.v*0p_4.v*0p_4.v*0p_41FX0p_41FX0p_4+<0p_4.v*0p_4+<0p_4.v*0p_4.v*0p_4+<0p_4(0p_4&0p_4&0p_4.v*0p_4.v*0p_4.v*0p_41FX0p_4+<0p_4.v*0p_440p_4.v*0p_4+<0p_4.v*0p_4.v*0p_4+<0p_4+<0p_4+<0p_4.v*0p_4(0p_4.v*0p_4.v*0p_4.v*0p_4+<0p_4(0p_4(0p_4+<0p_4+<0p_4+<0p_4.v*0p_4(0p_4+<0p_4.v*0p_4+<0p_4.v*0p_4.v*0p_4+<0p_4.v*0p_4.v*0p_41FX0p_4.v*0p_4+<0p_4+<0p_4.v*0p_4.v*0p_4+<0p_4+<0p_4+<0p_4.v*0p_4.v*0p_41FX0p_4+<0p_41FX0p_4+<0p_4+<0p_4+<0p_41FX0p_4+<0p_4+<0p_41FX0p_4(0p_4.v*0p_4+<0p_4(0p_4(0p_440p_4+<0p_4+<0p_4+<0p_4+<0p_4+<0p_4&0p_4(0p_4+<0p_4+<0p_4&0p_4(0p_4(0p_4&0p_4(0p_4(0p_4(0p_4+<0p_4&0p_4+<0p_4+<0p_4+<0p_41FX0p_4&0p_4+<0p_4.v*0p_4+<0p_4.v*0p_4+<0p_4 _0p_4(0p_4.v*0p_4.v*0p_4+<0p_41FX0p_41FX0p_41FX0p_4+<0p_4.v*0p_41FX0p_41FX0p_4+<0p_41FX0p_41FX0p_4.v*0p_41FX0p_4+<0p_41FX0p_4.v*0p_41FX0p_4.v*0p_41FX0p_41FX0p_4.v*0p_41FX0p_440p_4.v*0p_440p_440p_4.v*0p_440p_4.v*0p_440p_41FX0p_4.v*0p_440p_440p_4+<0p_41FX0p_440p_4(0p_41FX0p_440p_4.v*0p_41FX0p_4.v*0p_4.v*0p_440p_41FX0p_41FX0p_4(0p_4.v*0p_41FX0p_4&0p_41FX0p_4+<0p_41FX0p_4(0p_4(0p_4+<0p_4.v*0p_4&0p_4.v*0p_41FX0p_4+<0p_41FX0p_4#/0p_4+<0p_4+<0p_4.v*0p_4(0p_4.v*0p_4(0p_4+<0p_4+<0p_4(0p_4+<0p_4+<0p_4+<0p_4(0p_4+<0p_4.v*0p_4&0p_4+<0p_4.v*0p_4(0p_440p_4.v*0p_4(0p_4+<0p_4.v*0p_4+<0p_4&0p_4+<0p_4+<0p_41FX0p_4(0p_4(0p_4+<0p_41FX0p_41FX0p_440p_41FX0p_4.v*0p_440p_41FX0p_4.v*0p_4.v*0p_4(0p_4+<0p_4+<0p_4(0p_4+<0p_4(0p_4+<0p_4.v*0p_4.v*0p_4(0p_4(0p_4#/0p_4(0p_4&0p_4&0p_4&0p_4(0p_4&0p_4+<0p_4+<0p_4(0p_4(0p_4(0p_4 _0p_4&0p_4+<0p_4&0p_4.v*0p_4.v*0p_4&0p_4(0p_4(0p_4(0p_4(0p_4(0p_4+<0p_4+<0p_4&0p_4+<0p_4.v*0p_4&0p_4(0p_4+<0p_4.v*0p_4.v*0p_41FX0p_41FX0p_4+<0-]4+<0p_41FX1:,440-]4+<0-]41FX0-]4.v*0p_41FX0p_4.v*0p_440p_4+<0p_4(0p_4(0p_4#/0p_4.v*0p_4+<0p_4&0p_4(0-]4+<0p_4(0p_4&0p_4(0p_4&0p_4(0p_4(0p_4+<0p_4(0p_4.v*0p_4+<0p_4(0p_4+<0p_4(0p_4+<0p_4+<0p_4.v*0p_4&0p_4+<0p_4+<0p_4.v*0p_4+<0p_4(0p_4+<0p_4.v*0p_4+<0p_4+<0p_4+<0p_4.v*0p_4+<0p_4+<0p_4+<0p_4(0p_4+<0p_4+<0-]4.v*0-]4(1:,4+<1:,4+<14+<14+<14.v*0-]41FX0p_4+<0p_4(0p_4+<0p_41FX0p_4.v*0p_4+<0p_4(0p_4.v*0p_4.v*0p_4+<0p_4+<0p_4.v*0p_4.v*0p_4+<0p_4.v*0p_4.v*0p_4.v*0p_4+<0-]4(0p_41FX0p_46t0p_41FX0p_41FX0p_4<0p_46t0p_46t0p_46t0p_490p_46t0p_490p_46t0p_490p_490p_440p_46t0p_46t0p_490p_490p_440p_4<0p_440p_46t0p_490p_46t0p_46t0p_490p_46t0p_490p_490p_490p_490p_4<0p_46t0p_440p_46t0p_490p_4<0p_490p_440p_46t0p_490p_490p_490p_440p_41FX0p_440p_490p_4<0p_46t0p_490p_4<0p_41FX0p_46t0p_46t0p_490p_490p_490p_4<0p_46t0p_4<0p_490p_490p_490p_46t0p_4?\0p_46t0p_46t0p_4<0p_4<0p_46t0p_46t0p_4<0p_440p_490p_490p_46t0p_4<0p_490p_46t0p_46t0p_46t0p_4?\0p_490p_4<0p_4<0p_490p_490p_4<0p_490p_490p_490p_490p_490p_4<0-]490p_4?\0p_490p_490p_490p_4<0p_490p_4<0p_4+<0p_41FX0p_4+<0p_41FX0p_4.v*0p_46t0p_440p_41FX0p_46t0p_440p_46t0p_440p_440p_440p_440p_440p_440p_440p_41FX0p_4.v*0p_440p_440p_46t0p_440p_440p_440p_41FX0p_440p_41FX0p_440p_440p_46t0p_440p_440-]41FX1:,440p_440p_440p_41FX0p_440p_4.v*0p_4.v*0p_41FX0p_440p_440p_46t0p_440p_490p_490p_46t0p_46t0p_440p_4<0p_490p_46t0p_46t0p_46t0p_46t0p_490p_490p_490p_46t0p_46t0p_490p_4<0p_490p_490p_440p_46t0p_440p_440p_41FX0p_440p_4.v*0p_41FX0p_440p_440p_4.v*0p_4.v*0p_4.v*0p_41FX0p_440p_440p_46t0p_440p_41FX0p_440p_440p_41FX0p_440p_46t0p_41FX0p_46t0p_41FX0p_440p_440p_41FX0p_440p_440p_490p_440p_46t0p_46t0p_41FX0p_41FX0p_41FX0p_440p_490p_41FX0p_46t0p_440p_440p_4.v*0p_41FX0p_490p_440p_440p_440p_440p_46t0p_46t0p_440p_440p_440p_41FX0p_490p_46t0p_41FX0p_490p_440p_490p_440p_46t0p_41FX0p_440p_4.v*0p_440p_41FX0p_440p_41FX0p_41FX0p_440p_41FX0p_41FX0p_41FX0p_41FX0p_440p_41FX0p_46t0p_41FX0p_440p_46t0p_440p_440p_4.v*0p_41FX0p_46t0p_440p_440p_46t0p_490p_4D0p_4?\0p_4?\0p_4<0p_46t0p_490p_490p_4B,0p_4?\0p_46t0p_4<0p_4<0p_4?\0p_4<0p_4?\0p_4?\0p_4<0p_490p_4?\0p_4?\0p_4?\0p_4?\0p_4?\0p_4<0p_4<0p_4<0p_490p_4<0p_4<0p_4?\0p_490p_4?\0p_490p_4<0p_4<0p_4B,0p_4<0p_4?\0p_490p_4?\0p_4?\0p_4?\0p_4<0p_4<0p_4<0p_4<0p_4?\0p_4B,0p_4?\0p_4<0p_4?\0p_4?\0p_4?\0p_4?\0p_4<0p_4?\0p_4<0p_4?\0p_4<0p_4<0p_490p_4B,0p_4<0p_4?\0p_4?\0p_4B,0p_4?\0p_4<0p_4B,0p_4?\0p_4B,0p_4?\0-]4B,0p_4B,0-]4?\0p_46t0-]4?\0p_4<1:,4<146t14?\1:,491491:,4<1491:,4<14<14<1491:,490p_4<0p_4?\0p_490-]46t0p_490p_4<0p_490p_4<1:,46t0p_490-]4?\0p_490p_46t0p_490p_440p_440p_46t0p_440p_490p_4<1:,46t1:,490p_46t0p_4<0-]46t0-]46t0-]490-]4B,0-]4?\0p_4<0-]490-]46t0p_490-]440p_46t0p_490p_440p_440p_440p_46t0p_4.v*0p_4.v*0-]4.v*0p_4.v*1:,441:,4(1:,4.v*0p_41FX0-]41FX0-]41FX0-]4.v*0-]46t1:,440p_46t0-]46t0-]46t0-]46t0p_440-]41FX0-]46t0-]440-]490-]490-]440p_490p_490p_490p_4<0p_4?\0p_490p_4?\0p_46t0p_46t0p_490p_4<0p_490p_4<0p_46t1:,490-]490p_440p_490p_4<0p_4<0p_4<0p_46t0p_46t0p_490p_4?\0p_4?\0p_490p_46t0p_4<0p_490p_4<0p_490p_490p_490p_46t0p_46t0p_4B,0p_440p_46t0p_490p_490p_490p_490p_46t0p_46t0p_4?\0p_440p_46t0p_490p_490p_4<0p_490p_490p_4?\0p_46t0p_4<0p_490p_490p_4?\0p_490p_490p_4<0p_46t0p_4<0p_490p_4?\0p_46t0p_490p_4<0p_490p_490p_4<0p_490p_4<0p_490p_46t0p_46t0p_4?\0p_46t0p_4<0p_490p_46t0p_41FX0p_4?\0p_490p_4<0p_490p_4<0p_4?\0p_490p_4<0p_490p_490p_4<0p_490p_490p_46t0p_4<0p_46t0p_4<0p_4<0p_490p_4<0p_490p_490p_490p_490p_4<0p_46t0p_4<0p_4<0p_4<0p_4?\0p_4<0p_4?\0p_4?\0p_490p_490p_4?\0p_490p_440p_4?\0p_4<0p_4<0p_490p_490p_46t0p_4<0p_4<0p_4<0p_4<0p_490p_490p_490p_4<0p_4<0p_4<0p_4<0p_490p_490p_490p_4?\0p_4B,0p_4B,0p_4?\0p_4B,0p_4B,0p_4<0p_4B,0p_4?\0p_4B,0p_4<0p_4<0p_4<0p_490p_490p_490p_490p_46t0p_4B,0p_490p_490p_490p_490p_46t0p_4<0p_4<0p_4<0p_490p_490p_46t0p_490p_440p_4B,0p_490p_4<0p_4?\0p_4<0p_4?\0p_4<0p_4<0p_4?\0-]490-]46t0p_4D0p_4?\0p_490p_490p_4<0p_4<0p_4?\0p_4<0p_46t0p_4?\0p_4<0p_4<0p_4?\0p_4<0p_4?\0p_4?\0p_4B,0p_4?\0p_4<0p_4?\0p_4<0p_4<0p_490p_4B,0p_4?\0p_4?\0p_4<0p_4<0p_4<0p_490p_490p_4<0p_46t0p_4<0p_4?\0p_4D0p_4?\0p_490p_490p_490p_490p_490p_46t0p_4<0p_46t0p_46t0p_490p_440p_490p_490p_490p_46t0p_490p_46t0p_46t0p_4<0p_440p_4<0p_46t0p_41FX0p_440p_4<0p_46t0p_440p_490p_490p_41FX0p_440p_46t0p_41FX0p_490p_440p_440p_4.v*0p_490p_46t0p_41FX0p_490p_440p_46t0p_41FX0p_440p_46t0p_440p_46t0p_41FX0p_41FX0p_41FX0p_41FX0p_4<0p_46t0p_440p_440p_46t0p_41FX0p_46t0p_46t0p_46t0p_46t0p_440p_41FX0p_440p_4+<0p_440p_440p_440p_440p_490p_490p_46t0p_4<0p_440p_440p_46t0p_4<0p_4.v*0p_440p_490p_440p_490p_46t0p_490p_46t0p_490p_41FX0p_490p_46t0p_46t0p_490p_440p_490p_490p_41FX0p_490p_46t0p_440p_440p_46t0p_440p_46t0p_4<0p_46t0p_4<0p_46t0p_4<0p_490p_46t0p_46t0p_490p_490p_4<0p_490p_490p_490p_440p_4?\0p_440p_46t0p_440p_46t0p_41FX0p_46t0p_46t0p_440p_46t0p_4?\0p_440p_46t0p_46t0p_46t0p_440p_490p_440p_440p_46t0p_41FX0p_41FX0p_4.v*0p_440p_440p_440p_41FX0p_46t0p_4.v*0p_41FX0p_440p_41FX0p_41FX0p_46t0p_440p_46t0p_440p_41FX0p_46t0p_41FX0p_4.v*0p_46t0p_440p_440p_41FX0p_46t0p_440p_41FX0p_41FX0p_41FX0p_41FX0p_440p_490p_46t0p_440p_46t0p_440p_440p_440p_440p_46t0p_4<0p_4.v*0p_41FX0p_440p_41FX0p_41FX0p_41FX0p_41FX0p_440p_440p_41FX0p_41FX0p_490p_4?\0p_41FX0p_4<0p_440p_440p_440p_440p_46t0p_46t0p_46t0p_46t0p_46t0p_41FX0p_41FX0p_46t0p_440p_46t0p_440p_46t0p_440p_490p_4.v*0p_440p_41FX0p_46t0p_440p_490p_440p_46t0p_440p_440p_440p_4.v*0p_440p_46t0p_440p_440p_440p_46t0p_490p_46t0p_4<0p_4<0p_46t0p_490p_490p_490p_490p_490p_4<0p_440p_440p_41FX0p_440p_490p_440p_440p_41FX0p_440p_41FX0p_440p_440p_440p_440p_4.v*0p_440p_490p_41FX0p_46t0p_4.v*0p_440p_41FX0p_440p_41FX0p_440p_41FX0p_46t0p_41FX0p_46t0p_41FX0p_440p_4.v*0p_46t0p_41FX0p_440p_46t0p_41FX0p_4.v*0p_41FX0p_440p_41FX0p_41FX0p_4(0p_4.v*0p_4+<0p_4(0p_4.v*0p_41FX0p_46t0p_440p_41FX0p_41FX0p_4.v*0p_440p_41FX0p_41FX0p_440p_46t0p_440p_41FX0p_46t0p_41FX0p_440p_440p_46t0p_440p_41FX0p_440p_41FX0p_4.v*0p_440p_41FX0p_46t0p_440p_41FX0p_440p_440p_46t0p_440p_46t0p_41FX0p_490p_440p_41FX0p_440p_440p_41FX0p_440p_440p_440p_440p_440p_41FX0p_4.v*0p_41FX0p_41FX0p_440p_4.v*0p_41FX0p_440p_46t0p_46t0p_490p_46t0p_440p_440p_41FX0p_490p_4.v*0p_440p_46t0p_46t0p_46t0p_41FX0p_46t0p_440p_440p_41FX0p_41FX0p_440p_46t0p_440p_4.v*0p_4+<0p_41FX0p_41FX0p_41FX0p_41FX0p_440p_4.v*0p_41FX0p_4.v*0p_4.v*0p_41FX0p_440p_4+<0p_4.v*0p_4.v*0p_41FX0p_4.v*0p_41FX0p_4.v*0p_4.v*0p_46t0p_4+<0p_41FX0p_4+<0p_4+<0p_4.v*0p_4+<0p_4&0p_4+<0p_4#/0p_4(0p_4(0p_4+<0p_41FX0p_4.v*0p_4+<0p_41FX0p_440p_4.v*0p_41FX0p_4+<0p_4.v*0p_4(0p_4+<0p_41FX0p_41FX0p_4+<0p_4.v*0p_41FX0p_4(0p_4.v*0p_41FX0p_4.v*0p_4+<0p_4(0p_4+<0p_4(0p_4.v*0p_4.v*0p_4.v*0p_4+<0p_4+<0p_4+<0p_4+<0p_4+<0p_4.v*0p_41FX0p_4+<0p_4.v*0p_4+<0p_4+<0p_4+<0p_4+<0p_41FX0p_41FX0p_41FX0p_4.v*0p_4+<0p_41FX0p_4+<0p_41FX0p_4.v*0p_4.v*0p_4.v*0p_41FX0p_4.v*0p_41FX0p_4.v*0p_41FX0p_4(0p_41FX0p_4+<0p_440p_4.v*0p_4(0p_4.v*0p_41FX0p_41FX0p_4.v*0p_4+<0p_4+<0p_41FX0p_4.v*0p_4+<0p_4.v*0p_41FX0p_4.v*0p_41FX0p_41FX0p_4.v*0p_41FX0p_4.v*0p_41FX0p_440p_46t0p_41FX0p_41FX0p_41FX0p_4+<0p_41FX0p_41FX0p_4.v*0p_4.v*0p_4.v*0p_4.v*0p_4(0p_4.v*0p_4+<0p_4.v*0p_41FX0p_4(0p_4+<0p_4.v*0p_4+<0p_4+<0p_4.v*0p_4.v*0p_4.v*0p_4.v*0p_4+<0p_4.v*0p_4(0p_4.v*0p_4.v*0p_4.v*0p_4+<0p_4.v*0p_4+<0p_XTENSION= 'BINTABLE' /Written by IDL: Tue Jun 26 09:32:13 2012 BITPIX = 8 / NAXIS = 2 /Binary table NAXIS1 = 12 /Number of bytes per row NAXIS2 = 1 /Number of rows PCOUNT = 0 /Random parameter count GCOUNT = 1 /Group count TFIELDS = 2 /Number of columns EXTNAME = 'STATUS ' /name of this binary extension DATE = '26/06/2012' /file creation date TELESCOP= 'GOES 15 ' /spacecraft INSTRUME= 'X-ray Detector' / OBJECT = 'Sun ' / ORIGIN = 'SDAC/GSFC' /written by Solar DAC at GSFC TFORM1 = '1E ' /Real*4 (floating point) TTYPE1 = 'TIME ' /Label for column 1 TUNIT1 = 's ' /Units of column 1 TFORM2 = '2E ' /Real*4 (floating point) TTYPE2 = 'STATUS ' /Label for column 2 COMMENT Convert status words to long integer then examine bits. COMMENT Status 1 - octal mask, description (incomplete list): COMMENT 1000, Sun eclipsed by Moon COMMENT Status 2 - octal mask, description (incomplete list): COMMENT 1, X-Ray detector off COMMENT 2, X-Ray detector being calibrated COMMENT 4, X-Ray Transient COMMENT 10, X-Ray short channel saturation COMMENT 20, X-Ray long channel range change COMMENT 40, X-Ray short channel range change COMMENT 200, X-Ray long channel saturation END @sunpy-0.8.3/sunpy/data/test/go1520120601.fits.gz0000644000175000017500000065511013231613137021047 0ustar nabilnabil00000000000000 yVgo1520120601.fits tSUAG pQHf]s^uo9G-ϑq,n rj.;#gg⹹&-'Mbg'ϐp>2;[]8H$.zZnZa$^Ǔ*eԔ\NkTi4:AZFRƱ¤ 1 p-.a^ep*#?t~ bEkuQb-)e92Ez^_VLI⹰~ zU_$JCue*bbHAUeFȨ0eG칲t7L!VxYٹ/#-=:K/`tzVT8yŃ̛H_6℔hө QrybM42[~>^ /*&&\JΨ)i9sf3‹Ċ.2JxX;>1*6.y.<=.=O.*9VTsjXPDT!$mxe*0\(P.0&W/+KfPFy$hJ]9+"%L\@4R2sxr2TF (.CeeoTe<'INL4ܼ4N)d9B49~ S"NzFi2'i52)LjCȗG /K0R%Gt#8%_TċY+f*@z۟' !&1Yrx K" pBÞ~1QILL$V o x`T Ft?T<bd4N?L2s h/H% /$q:z/@|A/[ÒbRٿy >;+I<N)lJߡ ]?o]>mt7SW30QN˩3L*x!I"_,0]IԅxEu TZN3rj+׉*U+-F>t+KD<GLޅKŸcC_HqCi p~qqEKFq9iTL\:{?]_^[=#aqNy8Zsr ='!S ?}j?a[zON <:AyA-(XƳk&>2KE)t7 LSG98tvߡWփƄg4k:g4NΝv8 t$qМy/g}E5>zQ#'2}"qąf+@3qs}2a~ @d1}ep|aζL_?bh f8^D1u[§yK>z=m] },:rL; #Nd^82yfFQyT]ֿ?±p\mr#~K EdEn;_| T.6GO'q~M8/{J8_IZTݧp~ɣ'@?+KǪ>~V~hi)g gЏfƁ LkяLʺ@WMiLw{fݸi;gO| hٵLiC?:x S<;v".B6~?nqG>~z*+b ~֤!kgMӫB5 kv5GOݔCܺ,䢮Ե#uOݞÐGq~ @.^;8QoE.~!_Qk` SNqf,~f%}}_޳< 5~a{1=hВqUG"hlDyX7<no|4okhy o iޔ~2['AM .M+OS%CS;iMMB?M/t4}i8tvJ|-i-Mt|is'!~]觹׏5觹׫{F߼ 4?:i3g+\gZnE?-R\ZfZ OKd b@?-X-΅#aOobaj۸|Q/xYR㵆!IxsZ Om8aj\'[;':XG>߳pZ_AZ9}Z߳lӐG֥G[ɵganA6iG.zC?m?7ھB?+ я6ud@?f%raяل\[nc=ra~_B.̟E;qNO:j'"y;q޾먝8o"y;qQ;q9rNw`uEqAwB.:;rAw/ yߐ⼓8 rIw& y'q޹$;ۑN⼓8rIw@.:NZ䢋8\t]y]Eq޵"λMEq:rEw#nV䢛8&λ nۀ\tyE7qMwy7qn!-Ĺ8B[s qn!-Ĺ8B[s qC=yqC=yqC=yqC=Ĺ8VJ[s+qn%έĹ8VJ[s+qn%έyYc].ݠ}߂o N﬏y6n͝m-]h#Go;zuV& ։Cp]zuwA_AtϬnzw|֥ޗocƢIXaG1 ޳ve 6qV_qnC?f{?[gl3я-*rЏMY*@^i+F?Nl&c[,,mcs} ۽{7,M-!oc 'Kz,Yއϧu6Э<נ7Xo@?[S OT~9i{K= NЂ;'C%Ǯ~N+я? yڛяXmw{p`,Џ }eL6;V<&?ܻ~|~?,яjg ԗ:^qKI~ȅ#8R؍T‘~ȅc9qQ@Uȅ8 GqL<~q?q<\8D?g`yD._ AsdWyp|M~G.Ĺ8wNI;# 'q$ΝĹ8w.D.Ĺ8wNY\8s'q$ΝĹsr$ΝĹ8w7 'q$ΝĹ8wE.\Ĺ8w.ur"]Ĺ8wEsq"]&Esq"]".Esqz p.Esȅ8wnMo@.Ĺ8wnܝ\s7q&Ĺ{%r&Ĺ8wnr&Ĺ8wmȅ8wnM"nMsqC{sO"r!=Ĺ8ȅ8C{: q!=Ĺ8<\xsq!=Ĺ r!=Ĺ8ޑȅ8^K{s/q%νĹ8^K{s/q%νĹ8^K{s/q%νĹ8^K{s/q#}Ĺ8>Gsq#}Ĺ8>Gsq#}Ĺ8>Gsq#}Ĺ8>Gs?q'Ĺ8~Os?q'Ĺ8~Os?q'Ĺ8~Os?q'Ĺ8~Oq y8<@q y8<@q y8<@q y8<@ q$΃y8Aq|888|8|8|8|8|8|8|8|!·8|!·8|!·8|!·8|!·8|!·8|!·8|!·8|8pids^O|ehmTEF^,V>g܍m}tN퉾:Q{%Ϫmgsuܝ{}_>ynNNsQzoi7ޝw>B{˟}1}n^6_/`];ݼ˕6'+'#ڜ ?f;;~;؜vN_z g\dGb~1~1~1|6O O=clΙ/\f݆U\5wB8M}n} . ^u.B\O?{'+48W>wEx*瞇^>õ;|8}>O\O]&"|}^\k;᫯>Ϲ:p_goe;6X'o=}9gkڹ/־?f_/S#W/?'>ߟ}s69}?9jkyc`e>rF'za{[>)vY}iw}G>z m6gBK}.[:~\̱{|S޵a羧֭E}&xv}y6{w}~wwIlaw}/.y)Ryiw|Wv6y[_}^wۓ?R\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ҹ08787878738i΅9csapnpnpnpnQ;g sssss>΅fsapnpnpnpnn ssss3\jsapnpnpnpnn\\_m.pnpnpnpn6L.pnpnpnpnwssss̵ Y 1j5dk#C!KH >C,1Đ-d ه9}ιsB$$!%d a<}u|ˋ9?[\p~6gs~6g y8yW{pQ9>r^9zڇ.*\T>WSspQ9W+yr^9W+yr^9W+yr^9W+yr^9W+yr^9W+yr^9W+yr^9W+yq8o7yq8o7yq8o7yq8o7yq8o7yq8o7yq8o7yq8o7yq8o7yq8o7yq8o7yq8o7yq8o7yq8o7yq8o7yq8w;ys9w;ys9w;ys9w;ys9w;ys9w;ys9w;ys9w;ys9w;ys9w;ys9w;ys9w;ys9w;ys9w;ys9w;ys9w;|p>8|p>8|p>8|p>8|p>8|p>8|p>8|p>8|p>8|p>8|p>8|p>8|p>8|p>8|p>8|p>8w?'\//;!y^OFv?.zvO?q?g~?oG͏vBy/.7?aE?}O~y͏v}ﶟ?waqǽy˽͏v?˾a?/ss˞s?­}~vy>W?WUm+?aϫs/=uj?]y>'xhwW~5>zPgmJ>?]ݯs8?]C>'~|hwOnm_;~u?om}gxhwϵǞ&ytm^|PhwK ߼¶ͯ-Nuw[nvmߺN:i6w)yۻ߾Ƕs>wx;>Б_WN~o?\z̶w.Kn<2Ы~kn.~m?ⴣmGrhn.N>ѧl<~~>A?yx>?R'riϼksqy /pEοrso.W9׏\|or?om.w9ﹹ?8?~'9z>|eSϧO=z>ݜO=z>||SE7SϧO=z>ۜO=z>||SSϧO=WٜO=z>||S7SϧO=z>9z>|ySϧϣSϧ[lΧO=z>|9z>|ySϧ;oΧO=z>|ms>|SϧO=ٜO=z>||!SϧO=mΧO=z>|>zs>|SϧO=O\ϧO=z>|SϧO=z>|SϧO=z>|SϧO=z>|SϧO=z>|SϧO=z>|SϧO=z>|SϧO=z>|SϧO=z>|SϧO=z>|SϧO=ËxI*Y$+#;لJJNMH̲%!N{%YvD" 8w?{> /< /< /< /< /< /< /< /< /< σytg.8;y Ύ~邳o_vx9;Q/9gǿ蜳:xYy_: O_gtYowv9tvvw?]||>ώx> O<]||+|MO<Q.+﵋uvxx^],ט.M\X<_<_.oxb||-],7xk_X<_<_k-{b||C],kwb|_X<_<_.;׻׻{{ׇׇGGǞǟOON>uz||}|||}||}|||}||}yxZ<__s/9ףtM:f||=N<_߮s/9t:~||y~X<_<_O9׏'t:i|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||.6777\<<<<yknvyyyykϸvyyyyk/;]||||O<<<<aw;]||||?N<<<<_777#v.xyyy,UUڭmܝww';w';]Tf1‚+}GZZ̓GPG(#ByÅܦ<})m_BynW\ؕ;,v]ynO®v}s>v}$s>vەv}s$ەv}*stەv}+s\ynW˹ܾPΕv}+K\ynWWȹܾJΕv}+\ynW7˹ܾUΕv}+;\ynWȹܾOΕv+\ynWۏɹ~BΕv]ynWەv]ynWەv]ynWەv]ynWەv]ynWەv]ynWەv]ynWەv]ynWەv]ynWەv]ynWەv]ynWەv]ynWەv]ynWەv]ynWەv]ynWەv]ynWەv]ynWەv]ynWەv]ynrP;CyHrP;Cy¡+sy9WKroaM/|^M}o1?|9YwZ?y7ݟKߔɿ~.NۿObm;ԙL^49zVl=i?O+|}'W[ xO3&j}K'SmL7xO憣vY9of'=YourAޓ^8ޓ_OJ$7ޓur=o [?{^S]}ʼg{]w^oMUK8xOV+y<_){?/ݝ6WO}G젺yO{^ߗ yOq&.*&=R+_UNʫyO,T59.=zQSokEfE\<{jUP{ڷpQGy]9+伞חr@yC9o(休7rDΛyS9IfrLΛys9o!-伥VrJ[yk9o#m伭vrNy{9 伣wNrI;yg9"]伫wnrMλyw9!=伧弗r[y9+}_\rw4@@9(*qG|pM\ !r>6w4T·:p1L·p9 #||Qq1ZG_1r>v2./r>.1w4Nr>A'&č$|r~hO))r>UΧ.|F]hlr>KgfX\̑9r>ghyr>_pPUrXΗ9_ K|/ۊr|.V 9_Y+|Uy\r.X+k|]3\mp^7.6$|\l-pEη&۾79.bXrSwe.9-|rW>9/r~P!9?,r~TΏ19?.r~RO)9]Oi9?#gsr~Ny9 _Kr~I/e9"W_kr~Mίu9!7ߔ[r~K?ߖ;r~GN]9sܞv9wȹCΝr\ -n9W#9Ӹ(9h9i9X9ʹ7>9ɹ_r苋<(!9EXrnȹ!l\ܗr'qrr@C9?r,.r?pLΟs9./Z⅜re╜o9=r3.'?rN-{9/r!.>rpI?g9,_⋜8$'rsOB{ܓ],>$G=IqIrsO2{ܓ8;{==)qsO*{ܓ8' =}IsO:{ܓ>d'=}Ɉs~{2ܓ>dG=YqɊs~{ܣ8G=9qsO.{rܣ8'=?ܣ瞼8'=qsO{S瞂8=})sO{S瞢-b8ùx}8=%Z.<%p)sOH=| Oi{JS7wT瞲-8ùk<==pq&wT瞊qQ J8TNUƹJ\T*=U㎪Sm.S85qsO+Qm{jE9#u[pGu^;\ԓr^?5h( 07rDΛ|䎚O q7frG \r2.Zyh%\6pVy*h'k㢽wwqQ;pI;yN,]zࢋwqMλEw9.=㢇rJ^r;%.zy9}f\/ > ( > pArr>D3T3L·ɹ~{˹~{FH9s(9sh9-}#}+ȹ~{ɹ~{9sD9s$9$},SbOs>Ligq1]Χ˹~{fƸ)\=|v,.9s\9|g/ |W9u..b9s9_K|g/߅rBܳRW*9_-}Y#knbs>mp^7ȹ~{6$\=|(\lrmr+.~rrc.vN9s.9ߝ|g=}rOܳ_9?(}9$8,\=Gh7\crr~9.N 9sI9?5w9si9?.Y9s99?炜_r~IsY/9"}*_s>ܐr~Soʹ~{nrߖs>ܑ;r瞻r\=v9sCΝr-n9s=9sG#\=Qrh9Q6E{_r<8A9y-w\rnȹ9;/"N<>=w/⁜?;Grh.c9R;z"VşrTΟ^厞۸x.E+腜쀋repGC\-k9 .[9;;9;z/W_9W?>qpI?g9,_⋜8L6EdBG&gLD8LrI~\D&ydRG&r ^Y."<29#SL\Dyw-<{GLnLT-p瑩Y."<2VEdZGyd–t8L_rp"2##3^\Dfyd&GfydfGfydGfydVGfyd6GfydvGydGydNGyd.GydnGj̃pyq/"2#<2?# 7\Lr>(w4EΧT9&rG|e\̐r>w4Sg,9-c9r>'r>W/ |?B9_W9u.wX%rDΗf䎖X&|.h8rRWV*X-k|uhurN׷z9 |oMr1.6f92[|x\lmr+.~Iq]we);byp[9+{b;r_9?XrⰜ9?"G⨜덋cr~\Ώ 9?!'Srr~FY9?+r~!?..E9( \\r~Eί:*_pqCoM9)~-9Cr~/\ܑ;r~Wyt\&v9˹#5.rsܵn9w=9'瞒yGyG]EG˹~Gyl3\ʹW<'.rs> yp0.rs> y. 97\#89x9y#9y9.rx.\#_x)ɹ~GWq-}Zߌ9+}?9'1.wr*\+ʹ~G~?9(}I?g9,}EοWG%y~G%yTBG%yT"GyTbG%yTx뎢<*韖d8J䣭;J,Q)pΣOhQ8JrQpjuGQqz"* Σ<*EyT–t8JǬ;ʀ -QqQjYw QX.2<* Σ;ʊіl8ʆ=;ʎ}-Q9pQ9_Xw QX.r<*7ΣL(*Σ~mʋ8ʗҺ|8ʟrQpU`uGQqUp"Σ Xz"C|a.|q1RGɹ~Gbs>+89'}5^'9(}5I'md9,}5EΧT9&}5]Χ_ 9!}5Sg5,9-}5Gp1Wʹ~G͓r>_ȹ~G-rHs>Z,|/s>Z*|/;qBWʒJ9_U|5qVur5.96$|`ho-rUηmm_qo rc.vN9ߕ;%sb={r.>9_;/j“pGpqTΏq9? 'SpqJӉqqZ|3r~VϮ99?_ȇ r~..%9tY\\+r~.F&7F,.nM93.nqߖ⎜.N]9 žv9wƅCΝq\ -n9W#9Ӹ(9h9i9X9ʹ7 >9ɹ_r苋<(!9EXrnȹ!l\ܗr'qrr@C9?r,.r?WqLΟs9./Z⅜re╜o9=r.'?rN-{9/r!'.>rpI?g9,_⋜8N8ND8N],щq}I\D'yt2GytrGyt GX.ytJGպT8Nrѩq&uGipEtZGytEytc 8΀U;ΈL,љpљXwY8Ίl;Ά=,q9[w9_X.s<:Σs(:7ΣL\Dy8ΛԺ8ΗrquGp]`" Σ 弇r .~^rK{ye#}伯~qOy9 bAr>H`9"C|br>\Gt9)#|zr>Z9; c9'|w/|Op1I'd9,SbOr>MΧt9.3|lr>Kgl99r>G\9'p@ B9_4 r8wXΗ9_*KqG|\,rwBWJ9_%NsG|E\5rwVur^GqG||om̓qYη7V9/.69mw]η/9!;sG;|WV\r{;wG^9+pG|%\r~*wtPCr~Ha9?G5pqLΏ=q9?.'ℜr~JO}r~:.N9?g*\sr~>'.| A\\KqqY/j"WM\\k.ݸ7fg\ܔ[?V<.?ߖ;qqG]9s[\.v9wȹc.rs.r~OɹG=Gq)r%Qr] r#1r+N\x+>9ɹ;.r<!9yXrnL!禜ߗrqr/r@lC9(?.rDΟry\}/qUο<&A#b<&asELB$yLb<&qr1IpuG1Iql"&c<&;IY.by8~uG1)qr"&cR<&uFbR<&MvELǤyLڝŤyL8I ;ɀ󘌕-1q 1[w1X.b<& c(&+cu\dyLvd7;Ɂ-19q1FZw 1Y.br<&c|\I,1yq1Y.b<&ELyLܖ8)TrS1qS"c\yLQa),1\ĔyL "$cJz,1[.bJ)'.&d9;"SbOiir>*. 9q;)3#p1Kgl9s|ύ'/|h\,pP p/NrDΗ,R9_|/|E!\r(.Vq2.VZX#kb\uN\Q|cw\lM}p.6"[b8\lmSpMIp]w|rSw.9%|)=rW>9w|r~.!9?$Gr~.q9?.'߸8)'gⴜ3r~FϦY9?'߆ r~A/E9T _+r~.U9&zs\\r~Co .nnpqGwpqWiܑMmspas"\8RqG9wfS]qܽ~\xJpG9,H9 QG_EyOQ{[+>9#M\< AQPC#q󰜇 97”r~w'qKq/r w@C9$rGa\<'rgEO9ZO?/lrWW\%\-?k9-o⍜r?9'.w)pn1.W]9qAˇc\|3R_km\|ylF؄8M\&ylElΖ8M$8MؤO,p q)&X.bS<;~q2"6%cS<6cS<6ZElǦylZǦylBt8M8̀ [.b3<6#c3<6c3׷\fylfylVf\fyl6fylvć؜8͉\8r籹qyp,El^yl>ylt8-8-؂-p[籅q[EX.b䎊<9El1b-^;*-%p[";*R^Eliǖ[.b<ElYǖf-;*pQ>QEVJ8i8 Up[UqGp[m7.<:ckjqWnE\' ࢿ(q1P 9$烫b!r>T·q1L·p9.#br>JG=h9-c|rqr>>.9 |z\LIr>Y'""S|Oigp1]Χ 9!3bϒYr>[gbϑr>W<9/|/xrPMůr\,N-%pDΗfҵ29_|N\(%pRWŪ߹r.kX[;Z+boQ9F9(pG| \l-r5wUη69&⎶!;|g:hʂ]r[w={qW2>9_pqHa9?G ☜{r~\O 9?9')9? D8=gb\+qq..8/.\\qqI/ ,W⊜_7pqMίu9ō!7;⦜ꉋ[qCxr~%.9;w}/pUοܛuG8&lf&Ĺ7νb;&ƹ7qrMso{țdC,d8&ǹ7[뎼)pMr˅9 oJ{S.\xS\xSܛ:›4,4-޴8aù7>˅7} ˅7=νY.pXrxr̈́sok of{3߶\x4\xܛ›l-l~˅7;νM˅7ν9Y.9Y.9q5rͅso_,-<8bso$ o o>{-\xܛ[ [ނ8ĹνX.q-so{[[b8ù8νoY.%p-soI{K[[ 8ƹ νeX.eq-so9{[~ .[ 8soDso%{+[+qQ*8VŹ*ννqso {kEM 歉sosoڸwu]\ԕ.\`zr^.yhw \4F/qјyyh"M)$͒ᢙ7|B[EK9o).rF?o[9o;.y;9oC}\trޑy;yH\trޅyy>*vqC{yO)?E/9%I>rW?o?9.y9|`\ Ar>y+C|(a-p1yp!#¸#|p1y+c?'w_ |;A'?D9wO)r>.?T9&|Or>CgL9|ϖ9r>y\9'|>Ηr@B]$W9_,w/rTΗ?29_..w;ޕ|GĻRW]0*9_w>^w`޵r|z :9_w|n{Aލry7&| n|ӻy6 MηOv!;.w;]|/ȻKw]0n9w>{^w`}rO ~9?w{ACr~ya9?G(cr~yq =!'$ S|{J|/{Z?9?+g^|/{^/ 9^_{Ar~y 9W^{Ar~yo 7 ޒ?-^޻|/{W#^7Bm|k{A^;^!Nu K]|/s{A{rsGy$ FyGy]0oy{w>9ɹ_r`ހ<(!9]0oXrnȹ!&ޗrwDqrw|_@C9w?{Ary}r' >| xs}./.|/wk }o |?/G{Awry}{9yr x^O|_I? g9"_{A8%/!%Ĺ/ %¹/1}/ }I^/)}IqKwD|pK|qKs_ #^{#Ks_J#Ks_*KwD|qKwD|ipK|i/}/=}^/e/#eĹ/ e;"8e;",8e{A|Gėl|Gė |/ȗrܗrܗr_.r_n _#羼|Gė|8;"8ǹ}p+wD|q+s_! WW羢8Źù8}q+s_ #+s_IJW |GW28,}e}p+s_y*_v}?W *W*;s_e/ૂs_#*}}:88;"ZjW jyzr^;/ 7{Ay#/k,^ &rޔOrތq_39owD|弅`wR[_+9o%6|GFy[v}rށq_9wD|弓wbwY;_9"]un|G׍ yw/!=';"|_[}_9wD|}rޟ}9|| r> #|C| |G7 F/)#o|_7Z/+c9'o r>A'}D9$|O)r>EΧT9||Or> fL9%|6͖9r>G\/ogw7_}} |!Er ~eطX;["Ko){ľrq29_|#VJ/[ofwܷZ}}k|-ur ֳG[/m|_=b&9oo-Vv}[|ocogwܷ]w};|']rKwG-{o{ľr=b>9|#A/;bwX}}G({ľr~ ;;.|_wqI9?|3Y/;cww^}v}"㾋r~ .;,]+|_wqU9_n v}7&bwwK?fwwG]9+"&v9˹qCΝrs){ľ{rawa)v}~vJ}~9G yq_R_HCrfwgS3dw_;c'C}?fXΟG{"S}?g\_G{!/%;/}))-fF߰S{+oR?r;wrq{vJ}_vJ}v})'G(}bI?G,_}aUοGOsv #'Ĺ?{D8'fwܟ=bGOsRv#'ù?9{8`wܟ=bw8{S;O?#ƹ?54ܟ8ù?{8ǹ?p?#pτsf3Gςsܟl_ώsvvJ9p?'8bԟ s_σsvJ?ܟ=b^ pN??#`_ _=b! q/NE#e_b_=bq %p/N$%#b_ K_2_R9_By+G쯀s8Wd_J+__=bU_R5G쯎s kSꯉsMpsmvJ{:r^WS'#g__So #7dHSo,#7aDΛSo*?GoN7g\[GoNdJ[GoNaF۲GoNc^۳GNwdQ;GNw.rEλS*伛w{y9)=gvJ众rއRv}/~rޏRv|r>R@v|r>RvC|(r>R0v|8r>RHv#|;Qr>Rh c| ;r>R/8vJ|<{ 'DvJ|{I'dvJS| {4vJ|:{g vJ3|&{YglvJ/ϑ9\vJ/ϓvJ //"vJ__,//%__*//__!+/W__%/5װ__+k/u׳__//o7_$/o_"[/om_Mη_.;)`пSw.9%/=rG^ |r~B9?(b]3a9?~e]319?~g]3 9?~b]3r~Bi9?N fr~B99?Nw+}; ~w/; w$; w"C; aw.; Fk)5 Fk#c5 ~a,0NDZk/5 L`,0A'D|f&S|*f4|:ffL3|fYfls|f<|>f |!fEbvKA ,2vA ,V v+A UVjv; 5Zv; 9Q`od(&9Q`oa(V9Q`oc({Gr9Y`'{Gr.9ͮY`7{G=r^9ˮY`{G}r~9?Y{Gr~!9?ĮY0{Gr~9?ʮY({Gcr~q9?ήY{Gr~I9?ŮY{G4{Gr~]g,{Gsr~Nϳw8/;(r~%vP2;(r~vPW*;(kr~uvP;(r~MvP{G?A ܖ;]wA Dy{G; A 8Q)N.vP.9wwp=A xQ R#5 DhrîY @Dzwʹ]Or;(; A <J ,{G)A ܗ8q<9Q!;(r#9Q1;('rr'{G3vP9{G^ vP/%{GA %A ; J൜f%F߰wxJଡ଼?r{Gw{_w ; 'GG|O>g_G|<` qLJ0΃; &f!$<`RpLJ09΃; `!A ~SL`*vPpLQ0548a%ӱL`zvPqQ0;(8fd% L3̌`vPYpQ0+;(l8fc%ś`NvP9q̅`.vPqQ0;(<8J0/΃y; c%B΃A y6;(:#y]vPu;(z#y}vP ;(#y#vP1;(#yvPM);(G6fysvP-G[y+GymGvy{Gv;yGGv;y]Gvy7Gv{)=G,A b![{#}A e!W'A g!8@(A b%8H,CA a%8T·&A g%8\G!#A d%8JG-A a%8FDz+翰Jpg%8}A N7JpI'>Bp ;()#wJpir>}t9Jpr>},9Jp6r>}9Jp.yr>}|9Jpr}B9_Jp_|1rK|)err|rJ|;(rk|-;(r:|=;( #7>Bpob%}fvPGn-*GnA ng!]w!;A d!Kw-A a!G+A c!_< A d!xP<$A f!xDΏ<*GA c!xLΏ<.'A `!xRO<%A >B𴜟f!xFYgc!x^ϳ@o:xA/(A ^7,G^+қ^k#uvPMo 7&;([mvPMw.;(z9˹}CΝ#rb%b!s7{r~}G#GFy;((r>B0FcA Ʋs/A>B/~9 y}`}`X# 97G#}qr>B0}`?`!@|>B?b!X|>B>BO9J)gr}s9Jr}K9_#_+_|Mo:}z߲G>B;(w#ӛg!/#?GM?g /_+8%`!t(!CG%y(1CIpJ>B()CIG%7JPrBqJ>B(w8}>B{RJIo: T#R<Pzӡ48e!t전ћy(= CA e7ʈP&BM2Lo:,#қee%t(CGe7ʁPzӡ8d!t(CMr<}PB?<}P^>B(?CGy# BCEGy(b#B$C%Gy#JBCp*Py*@o:#C?қUyJCqLo:T*#қUyP5No:TC5q>BP-jӛՖ:#ЛՕCCP9o>B!P#9o>B7f!Ԅt7e!Tb!Ԍt7g!ԜtC-%VCG7j-mG7j+mMy;BMyzӡrޑ}PGzӡNrމtwf!ԅtw7*Gu7.MzyB=MzCCP9>B/P?9Go:_@o:4@қ A#ћ CC|CC|0zӡ#ӛOAo:4th$Q#Fѧ f!4th 1#ҧ _M~q#ӧ C|")C|d9>Bh 9Jo:4UΧFo:4]Χӛ͐#fқ͔YC|6Cs|\9>Bh<9Oo:4_Z@o:Pқ-E#~7Z,M9_Jo:TΗћ-7Z.MV B+MV*zӡUr}jzӡ5rthe!th7Z/Gm7(M6&BM6zӡ-r}Vzӡmrt79>Bh;9Ao:SwEo:Kwӛ=#ЛOKo:thCSЛ7:>B !CCMzӡ#)CG(19?Fo:t>e踜7:!'MNҧ SCCSzӡr~t}99?Oo:t^/@2tQ/қ]K#.ӧ ]+CW*)Cu9>B} 9Io:tSoEo:Ao:tt6;Cw.]zӡBC69ӛM#CN9wқM\r7r=zӡ{C9ЛEy$PPGӛEy P PқyKo:7ɹt/BzӡMBrb!7 ˹Ao:dЧ #ӛݧO7Og!Oo:>eC#ћ=Oz,Szӡ?S)CO3r>e腜7zI2R7K_ћO[7z-MЧ CoCOGћCSM>zӡSC'rt苜7J2 Sқ'ONp"z)ÉG'ONpRz)pNF2)SS<}w8Oo:>e8%éSSe8;pz)9Msҧ 7Eo:>e87p<8@o:>e8/Se%MKҧ ypiKӛO.pYz87.G2\p@o:#}8W7p%z)ÕqBo:\US<\t:}puz)5pIo:\>ep-8צ7C2\Gҧ וzSy}rހt!}pC9oD2Hӛ7On"MSySzSy3rޜt}p 9oI2R[ћOn-Syz)mYѧ OnOo:ܞ>e=p)M;ћwg,Syz)]}p79No:ܝ>eO)=MO%S{yoz>)}/}p_9Go:܏>eO Mҧ A)Ã|0`!r>>ex7F2tx4}h9C2<>ex,X_q)Mӧ O S'қOO$M'ӧ O))S|*4ir>>exϠ7A2tx.}<9G2<_ӛ/O^ S"zE)ÿb)KMЧ /g^J2>exr+SWЧ 7^I2UxO^-kSг )|}zzVr>exo7H*I7ѧ o[YVrtx=or>ex7A*Swҧ ]ûSw=rtx/}>9G2_ӛO> S!zC)Ç0}#GS1c)Mӧ )'SO)Sr;})ç }9?K2|>eO>/M/Ч _)%r~>e_7J2|Uίѧ _So r~t}-zV?SOMo:|>e=)wM#S#Ym)va;SN9wҧ E2gv={rOг Gy$}pGѧ Gӳ Gy }pҧ ҳ {K2s}ʰU/လS!9ѧ Y)=!&}}zV)qqrO2O*t}C9H2>ecr>e }ҧ ?)Sћ?O~./S_Ч )_)ïS_)k)o }[9K2??)}{r/}r>e}r}G9H2>eOL*>e }WzV)))D)D)$$87ҧ4HFHFHs#9}J#΍)Y>FJF*zVF*SqnOigeŹ>F:FzzVFzSpndOidged¹>FfFzVFYSYYSYqndOigeOigeĹ>FnzVFyS?г2Kȇs#}J#?=+#?΍87 ҧ4 ҳ2 (D(s0}J}J΍)87ѧ4ѧ4(N(s}J$}J$΍R)R87Jӧ4Jӧ4г2Ч4ҳ2ҧ4ѧ4ѳ2ӧ4ӳ2*Ч4*Ч4~geHҨHʨDҨDҨLʨLҨBʨBҨJҨJʨFҨFʨNҨNҨAʨAҨIʨs}J=+6΍:r^>QQWѳ2y}F}zVF9o@h( SY1}J7Oi4ge4)}J=+7Oi)rފ>ъњ>њFЧ4ҳ2ҧ4ѳ2y{F{zVFFzVFG9HD$Y }J =+wgetn)rރC{ҧ4zҳ2~^^rޛ>ћGг2y_F?zVF?9O/SS| }Jc=+c}Jc0}Jc0=+c}Jc=+c(}Jc(}Jc=+c}Jc8=+c8}Jc}Jc=+cgeQ)r>1Fҧ4ҳ2~_Y|<}Jc<=+cOgeL)IIr>1YΧЧ4г2TzV49FҘNʘ.3Y3|&}Jc&=+cϢge̦ge̦Oi̡gȇy)yr>>Pѧ4ѳ2~Oi,ge,%)%)er>\Wг2VJJzV*9_EX-SkYk|-=+cOige r>>>=+c;=+c;}Jc=+c=+c'=+c'=+c}Jc=+c7=+c7=+c=+c}Jc/=+c/=+c=+c=+cOiger~>qqXӳ2QzVQ9?F8&SY'=+$=+$}J=+㔜Nq>qqFҳ2ҳ2ѧ4ѳ2yzVzVEzVE9DʸDʸLҸLʸ"WYWYWSY:=+:=+㆜ߠgeܔ[[r=+9MʸMʸ#wYw.}J#!6zV]) =+!NzVS]) =+-nzV=9Gг2KʈaxY^zV>ge_~9г2rge_!9ѳ2rge/ CMzV}9Oʈay<=+#^Ч4г2CzV#9DxLx,OYOOƟrLΟѧ4ӳ2 zV zVKKzV_r=+=+}JozVr񚞕Fг2[zVYY=+==+㽜KW?г2>г2Y#=+=+㓜ge|//rfzVfBzVfBYpn&Oi&ge&a&ge&ge&Oi&ge&a&ge&geOige~G==+3%}J3%=+3 3=+35=+35}J3 =+3 3-=+3-=+3}J3=+3= 3==+3=+3͌̌/L873ѳ23LB̂s3+=+3+ll/87ӳ2sAỈs3=+3=+37=+37=+3<YyYyYpngegegegeYYY>YYfazVfzVffQzVfQYYSY%pngegeĹYY fizVfizVfeYeqngegeùYYfzVfzV87geVaVgeVgeVaVgeVaVgeVgeVaVgeVaVgeVge֠a֠ge֤ge֤ge֢ge֢a֦ge֦ge֡ge֡ge֥a֥ge֣ge֣ge֧ge֧a6̆rސوHӳ2yzVffS9oJIΛѳ2ѿ0yszVf 9oAlIl)Y_Y_m =+- -=+ geavgevavN/N/rޅمٕٕMλѳ2ӿ0yf9IIYge>rއWҳ2ѳ2yzVf9@@(Y|=+s0=+sge̡ar>9\·ӳ2Gг2Gп0Gҳ2Gҿ0Gѳ2Gѳ2Gӿ0Gӳ2п0г2ҳ2ҿ0geB'Y_|=+sOgeNaNr>99UΧҳ24zVtt9Aʜ!3Y3_|=+sϦgeΡaΑ̹r>99_ӳ2п0г2ҿ0"zV"/rLΗѳ2ӿ0  9_I\I\%_|5=+s sauu/rA7г27ҳ27&zV&9LL"[Y[|+=+s=+sFyyyyyyyyyyyyTΏѿ0qzVq 9?A<)'Y_wr~yyFҿ09zV9y9?Oʼ@¼@ʼH¼(Y_Y_W =+* *=+ _ge^aޠgeޠaޔ[/[?_mzVm9C¼+wY/9ѿ0rnge:_9wҿ0rge_n9wӿ0=zVaFҳ2#_Q(zVf4 3CŒgeҳ2c_^zVgeY~aYAzVfge_azVfiп0 zVI4>=+3'/x9@|@|(_=+1 ?a>?Yҿ0S33zVss9A|A|I|IKaageM[_ӳ2_ӿ0г2п0[zV_geC|'Y_Yҿ0/?G9HD$_ =+ q?A{}'d﮵3',l,7η7Q[D#Ot̺^'q9'>c-_T~ɿ]ߗR[?lIk[t?Lh/Yb?Oк['k}|/y/KyOruwS=)/ Ѽ,5GY;6vN绀?˷=x>>.Yo=)/(n{Rٸ*{o=Tm={Rl|ԥnէŷsOgy{?;j'ޓ= `=dޓ~Q 9jrG9"5(gB\䬏sq+9w).r\(w\n^ܑȓ;ysGy|!.~?ț퍋r0.y;/G"幣r^4. y(8;*(?㢐B7r^!. E︣"r^d .pQ wTT΋FXX'\pQwT7\}qQbwT .JEI9/y%_⢔Rr^-.Jr^,.Jy(3eW\qQ.yƸ('l([pG=B\Th k 1wc\?ypQg\TEQ;0\T~U)*cpQwTS.y;&զ㢚WOr^6.jy+wTCkEM95#Zr^.jjpQ;wT[koEm;uzsGuC\-r^$.EQ}9 .E*Q9op >amp&.yĸh]\4px .yh"MVI4.yNh*M).~~OfqѬ/.᎚=EQ!h~_rG-J( \x?rG-Y\VSVWp+wԺ..ZE[Qhm66\MpVۥEvQ;9or޾ .oy< vC4.;!#bոr>2.F~FŨ(9sGb;#cZb2h=\Mkp16;%.~"翄p1.w4g\q1?.=90b+hbY\LMٯyϜ w4G*ɸ{;+jbLhu\O͗q1.w;\,h-.\,L-lr(3.umŢw_qXǸXR,%r.Qg \,e?bx\,;{}r9_>/b7q2).V6V.Jw*%.VŪeѪ{X;Zbu,w&+.tlŚ.;XWsGbݟX_Gr,.6SwQ7NF9jpG|U\lpy.wYη$9+.8r.Fb[Fho[m>wfb{^h{o\lmqc w.v.š=8;:\sG \)#'#oqqG\=cpql*.]掎}=⸜Ir~b!.Nɔ8ق;:)'├jSkSr{V\.o!贜wpGqq wtFř?qqv(wtVsesqqwtNW8; UbB\\]Rr\\j{.Kr~95..e9+r~.9W\\5pqMί59 @\\(qqwto\,qq=wt .nMn]ŭϸwL\q;|\; w⎋;mxh\Dd"T> ӹcB\|}pGS\|;dg9=їҁ;"_|; _pG_qE\%iKк8K8r".3=qJZ.<.1E\-q[wx".i\%bK2ɺ$-qI>Yw".LE\%KlKd-qX.gQ\,qɗXwiKruGq)VY.RDYw]fEw,qm(>uGq=o\}ߺxOʾť{R>\ĥ*bQ\'!R=K[.R(. ޓ".͏'8E\ťy\jS;K{ruGqpn".M'\ĥodQ\zǥ\eHiQ\斋 ˸ 8˘r-wq".c,w qX.2m2,qssGqy".s".Kޓ". iZru(zrqZ.ⲍ\e;{rq'"y\d䨁8q9"'rE?\q .r"wj(wK\^(OF\iY<>\;.~`"ۛ;ʻyrG "@\{%p8  y(p;*pGE\B3Br^81. 7 E;Q9/.,ᎊ8qQ4-wTT΋E(Xf\b\{o㎊y|(ї;*xqQ wT)U;*%N􏼧8\L5\2qQ wT.EٛQ(׈;*"pQ>%wT9./ʻqQ!=.**EǬ .~EQşqQq;.*sG R\T{*ŸCyOøRUFsGUN*EJ\T=UTjxO;^Tr^#9.j4jy ;.jjEQM9sGᢖ;-絻:?pGuN\y-r^. Ec'X\ԗp@LEh kᢡ7FpHE#9o.r؉&rޤ5.E(if\45݀~\;.~tY_n\4{5/q w.ZZEh;j#.ZZEqѪwj iuu\6IpѦwf!.DpGmms\]u]z[v1Qhߙ;j/탸萛;3.:l:y؟;:yt;\;,O.xO Q9.N=]rG[=\tnq]λv\Hh+\̈p?w[ \;vCw!\ޏpѧwg8.pw,w4~p"w_ gq1 w40bO%gAq1hw4Hg 玆;rCqGC|n\ } +aar>.⎆p9Q#qG#bĿH99#/b3.F|\ƤŘ;ضcc_/pKrsG~ŸѸx\/{q1OhB1\L bbhh3$.&;TLM:{&5xєgJ=\LMLMMxEj玦&<;.b;3rG3|F3f̝L9UrGb3hGbN9hsqGsb$\̕p1.=b~"h~\̟w)p'hb\,pbaZhak\,\-Ţ̸Xԑ;Zѯ9qkw\;|⾸XsGKb`hA޳.⎖=KsGKeplw,Y/wY>/sG˿uxϊX;Zو\r{\jUn\Nnkr&+.tlŚ wV8\+u{qOh}1\bChh\l8 r".6Ng$盦bU\lN{6f9.$Ŗ&g"\lp%.=[=&b:\lrGeo]߶0.m;p.v vŎg9;rG;ŮrѮ;.vvWI {jqG{f=qW6y^9ߗ~->'w_(\pq̉ݹr~š|ѡ>8;:$燋`A\~##qq8wt 9Z;:*Gѱ蘜ux 9?'D9=.Nɥ8ũtѩ8;:߳p{;:{vt.ř8;:[ grGg_8W;:7NrGqq~wt9..T=Ubs...KɸKMxϥEd.W2pGW:芜_͎][pq5]kpqm'wt.⎮;Qݐf9Xsw覜ߪ[[xϭOr \q pq[oŝ#w⎓;w[Jn."2qGq~Ȗܑm.l&.#{\wsGGpcw8 sY Αp玜op᪀ 8: ׿ܑ*qOqŽѽYM\xO#\xpG=."ȥtsGQrQrQGoEt;ɍQ"w{X9Åww= _ܑO}q; E/s"0 9&E..rdQ .BpsGTqqa /.0rG\a wrG"w7qq;/aQQ7.=~=+$w&y4qGx;x;zyO45wqt=wTΟųѳmxfrGy\<=Er .^<^ˑK9U/9U% .gx;zpG#p{\iY7nm:\m1_q񿍸_;'7.]]?\{p~w0y; w4.=?"wap{w|Lusx[$矚"蓜N-q}/qe-wŋٸru3.;O">A/<>E|B'`Oߺ8OTrhuGZ.(>1\'r$-Ip">'E|Қ'aOzͺd,[.ͳ(>E|'r|">Ӻi,)Z[wb">E"Lrz[.auGo\oZw2">eE|ŧ|{R(> ޓ">sS=GXw8IruGi4g;O/I[rvuGi/_,jt,nXwZ./(>}">gy| n(c:E|ƶQFg\gelϴ;ʄ̹,{rG[.3qGYp">^(E|bQVg=lr 6r Z.WE Qsw:.rLE+QY;99o"W2(Wc\Z"w*\n^(O\iQ 9/% S .JyR(5RqQwT\>﹣2UqQf wT.|EQY({;*]\;* ⢼;rGVB .~?n~ 򞊹pQ'wT7S1;TTꇋJ{JOxObQ!a\T~U){E[\TUpQUΫUEiQ59rG-h6\LՔqQʀZZr^ˋٸ]qQ{3wT[E^Qu\ݏOyO7;w^~9\;.TEQ h;jX g5Q"\45Fq8wԸ)./;p$ .⎚E(i&Ӵ#.玚yO9󞟶';j45{=E"QAAsӢ.ZZ=-^㢥-pG-UU\V_rz.Z$EQ9osm6EۥQ[9opGV] w^wEQ .:E9.:c~ӱ.:y'T pGKs\t'oqѥ"we<.EQ:;z[]\tuOq}w݆-pc9.zzf==qG=^\;+y3ws;zqGv^p{w)S}qG}+sG}EQ?9w>rGk Hxπ@9sGgPhZALgpGhbH\ {l9Cb.h#\ + ap19w4.׸Q; .FFȪ9;y #?sGjb,\N p1..|i{,cpGcWѸ% wKg\;%{ŸѸp1.;{Op1(w4A'ń28;(bREhx\L:Mq1y*w4 ;"Sb-hj231w4UΧp1-w4;&3bz;\L_{{q1CgtŌ͸f^ rGb>hS\.øGq1w4.Ŝ߹9bnehD\̽y5q1o:w4.'ygm\,H{4łY [qG Wba$w(YsG5wkwV\jrGbqh/~%%pwDΗX;Z&~Ų3ѲgyUh/培37q!wrw.w{hU3\ZU.hu:\n^ѸX;Z k6rGkX k{rGk8h]~\뇋u{uOx!g!\m({66=bcEhx޳wTrGM_q.<oqG[-qewņ-xz;ږqGm-w[\;Mη^;!;b>hS\,Gp.v=b+bD޳.vŞs;ڛ{sG{bm\Kk}}\O+q?;: :zspGV\4Ckb_3.s.x9̾fHI\a_31s}x_pq}y15M=.8Db\`_3`_3$'$'׌?׌]g_3w544׌?g~z8ޤB[ShGKEKESTRvR Р*-Z׹GCuy q_?>'}ԷK_3fj]vfj]z+5S=k6Lm.6LmH_3fjfvf;{k>;f{{k6Lmj.6LmL_3fjlvfj }-5S[=[kLmJ_3C}5S?LmF_3fj}v5SkL1젯A_3c]v#}ԏD_3}OO5S;;I_3fj>vfjWzkvL{vLN|7}=y=說K_3nj/}ԾLGG7fjzkL:@_3uf}5S?KL_33}/5SLBw/+}ԯ5SMJ_3u^ }AttSkK:D_3un0}a{5SLFG7}o5SGkL:B_3uf(}Q5SkL:F_3uf8}q靟:A_3uf}N_3;}5SL5S'kNM:)S5SNL:M_3uf4ݽ3tRgkL:K_3u^,}Tf*Ew/JL )A_3%}͔5SfJK))E_3k4}͔5SfL)Cw/ek,}͔5S^L9)GG7k<ݽ5S^*L{@_3k"ݽTtRf*J^fOs5S;?G_3uf/kJokf|zkL@_3u^}tRk.K]D_3u^}%{5Sk.K]Bw/uf }{5SWL]Fw/ufݽ5kf^?kf:ݽu5SnLݠ tR7knKd"}MD_Sd'2sLwOd)YعB_Sd)Yk\d)kl5E6v.k5-5-\B_SB_SJwOJ_SJwOJ_S䠯)r9ktDN"'}MI_SFwOF_SF_SFwO䢯)rk\5t5t5En"7=MwO䡯)y<5E^"/=KwOA_SA_SAwOI_SIwOI_SI_SEwOE_SEwOE>"=GwOg"?}MO_S' sQ(@wO) ٹ(H_S' BtDa0=Q(LwO'E"tDQ{(=Q(JwO}M?{nnn{n=Q(F_S'5Eq=Q(AwO)J%5EI{}MQ(EwO)Jk5Ei{{{ =Q(CwO')')'')'O~{~{~,=Q65EY{}MQ(y9<=Q(OwOO}MQ@_ST'*ktDE{=QD_ST'*tDe =QBwOT')'''')'UtDU=QFwOT'ktDu=QA_SԠ'j5tDM!{''jZע'jktDu:5E{'')'''uqtD]{=QGKԣ'tD}z\=рh@_S4' tDCQ{Q{Q{Q{}MшhDwO4'ktDc{ =фhB_StD{=чKwO'}~D?{=яOwO%t{b=1xxxxxxxxxx5Wt@{b =10At {b=1`{b0=1BwO I|=1JK 'Cat0z\b=1NwO '{b=1IwO'F#qq7777qQt({b=.1MK'Fq1tz\b =1xxxx3tXz\b,=18{b=.1OKO|<=1xxx+qqwqwwwq tz\b=1HKL'&It$z\b=1LwOL'&){b =1JwOL%Si4{b=1NwOL%wwwq {b=1IwO̤%f3Y,{b=.1MwO̦%fq9ϡ'ssqyt=.1?qqqqqtz\b=XHwO,' E"{b=XLwO,%%{b =.XJwO,%Kqe2{b=.XNwO,%w1=. =. = =.Iz+ {b=.2tJz\b%=X*{b=.XMK%Vkq5{b =.=.=.=.%=%=.%=.%=.=.==.=.XKK'____qu:{b=.XOK%q tz\b=.HKlL|#=.=.==.}zqMo'67[q-z\b =.JKl%????qm6{b=.NKl%;qz\b=.#=#=.#=.=.=.==.IK%v].{b=.MwO%v{q={b=.7^z\b/=ؗ>z\b=.OKO|?=.q8@wO%w3=.3=.33=. =. =. =.+=.+=.+=.+=.q8HK%qC!z\=.q8LwO%Gq#z\=q8JK%qc1z\=.q8NK%'q z\=.;=.;=.;=.=.=.=.=q8IK'NS)z\=q8iz\4=.q8CKI =.q8KwO%Φw%RDH"sAKz\B%$=.EK(z\Btz% =.aq CK:=%q GK8{%=q@Kz\"D%z\"%z\"%%%%%qs靟%%%%Noz\oz\<=.q>yz\B^sz\"=.qHK\%.qKtz%z\2=.qLK\#Wq+z\*qJK\%k5z\z\z\:=z\_z\_z\_z\?:=?z\?z\?:=:=.qNNK\%n7q z\&=.qIKܤ%3㒙qLd&z\23=.LKf%Yq,dz\2+=.JKf%qld6z\2;NKBGBK2.-tz{3H%s9d|w$s9qɜtzmmmmd.:=2=.EKNKNGNKNK#s㒹dz\2CG%yȼtztztz]]tz]]d>z\2=.GK%qdz\=.YdAz\ =.Y,e!z\=.Y,DKf0=.Y,LK%Eq"dQ:=(=.YN,JK?z\n:=nz\nz\n:==.YN,FK%qtzdqz\=.YN,AK%K%qɒtzdIz\=.Y,EK#K㒥qtzdiz\:=z\z\:= =.YN,CK%#%#K>z\>:=>z\~z\%%eqɲ靗%qrd9:=<=.Y,OG%+q d:="=.YNHKV%+鑕qJtzd%z\2=.YNLKV#Uq*tzdz\:=z\z\A:=Az\A:=Az\*=.YNJKV#qjtzd5z\:=.YNNKV#k5qtzd z\&YIK֤#%#%%k鑵qZtzd-z\6=.YNMK֦#uq:tzd:=a:=a:=az\l#tz##tzd]z\nKvQNKK֣#fztzd}z\>YOK6# dCz\!ِlHG>JK>JK>JG>JK6#鑍qFtzdcz\1٘NlLK6#MqqqȦdSz\)ٔlFG6%ds:=yzqtzd z\"dK:=%=.ْNly+z\ي|N|"'q'tzdk:=5ٚ|.xN||N||-v4=.44=.~vцNlCK#mqɶtzd[z\-َlGK#qtzd{:===.فN@Kv#;qɎtzdGz\#ىNDKv#;wޙNLGv%#MYz\Y:= =.مNyz\+ٕJGvM=.ٍNFGv##%##dw:=y:=y:=y:=yz\كNAG#{=tzdOz\:=z\E:=Ez\E:=Ez\-ًEGDGDKDGDK#{鑽qtzdz\هNCK#}Ⱦtzd?z\ُGG#:=r9@Gtztztz+tz+tz+tztztztz@z\r 9NHG#㒃Atz`:=r09LG#C!P:=r(9NJG%atzp:=r89NNG%G#WH:=r$=.9NIGV]FGFKNGNGNKNGAKAGAGAK#G㒣Qtzhz\r49:tz:=r 9NCGIGIGICIG#cȱtz8:=r9NGG#tz[tz[tz[tztztztz;tz;tz;;tz:=r9N@KN#'ȉtz$z\r9NDGN#'㒓tz:=r 9NBGN#Sȩtz4:=r=.9NNGN.;N|N||N|/ :=rFz3ștzLz\r&93Ytz,:=r9NMGΦ#g鑳w9tz:=r9NKGΥ#sytz<:=r9NOGΧ#qqtz:=rN\HG.# Etz":=rN\LG.N|1N\BG.#wN\JG..K;_FG.#}{wN\NG.#?#?!?#?#?#?#?!?#W+tz r%N\IG#WUtz䪓b5N\MG#?-{>#?#?#?#?#?#?#?#?#?#?#k5tz:= := := :=K:=K:=K:=K:=+:=+:=+:=+:=r-N\KG###Nk:=:=:=ѷtztz;tz::=rN\GC#tzrN@Gn#7ȍtzwtzwtzwtztztztztz&:=rNt;LGn#7鑛-tz:=r NJGn#[mtz6:=rNNGn#tz:=r#wȟwȟȟȝ;N:=rDh'NEC#w#w鑻wtz:=r~KG#{};>:=rNOG!;:=yNN~NNNNe+w++++y0wtN~U?~ׯ}U_\Wp_~ׯ}U\Upj_ qezׯ^W\z^Wqѫ~5ׯ@\;Wpj_ ~5ׯw>ׯt掆}\UCqjRh(W ax_5 ׯyv1陼pW#pjWx_5ׯFHW}k~_Ux_:_Wo}~~hWQx_5 ׯFF}h\UcpjLv1՛x_&_Wo}X\Ucqj,_q~5x\Uqjf}\ZU pj_-~"\ZUpjW-Ÿ~ZWKpj W-RZWj_-],p#ׯ>.}r\ZU;ׯ>q$OpZW+jEz+pj%Wx_2U~#w ׯVjZWsGS\>O-wW}W}g~9_}Ux_ׯZW_}~_}U_՗x_%_}W_}W~^h-Wx_ׯ}U_x_ _}ә]|Uշx_-_}W}:\ZUpj_~\ڀUpjWm~;h#_}W}w~}{ׯM~9w 6fڌWgx_ׯ}\r]l~﫶x__Upj_mm~w﫶vځW;pG;j_U?Տŏx__U?lb'Wx_ ׯvdj_ݸ~{؍U{pjW=~^ڋUpjW}x_~ڏUWx_3WW?}ϸ~#ׯ~_qqW:W _Cx_uׯ}!:W0_7\ ~#x_u龜:WG{x_uׯ}1\:98Uq8W :W'_W}~WUx_uN}I:WWSx_uׯN}i:Wg _Y.}Y\:Ugqf)JU R~%pJ}+U$_I~J}+Uׯ4Wi2~e.,WY\x_eq.W9\rx_qw`<_ ~Uׯ"WE]$x_}UU WY]U}՟x_u9:U_x__]Ux_uׯ7e<_] ~u]vq.EUKx_u ׯ.}%\]\˸~u﫮}\UWpjvq﫮UWkx_u ׯp?x_/_UYx__Uzsvq﫮} U7fx_un}Mי:WgLx_ׯ3}ufΌY: _g,x_﫳}uV\Ί:_glx_v.tvΎ͌][V\o[q:Wx_suNΉ96 ׯop:W\~ ovׯs}uni.tn΃y:W繘 }u^΋wx_}W߉w}~}'W߅w}]x_}_|x_}u~\Ώ:?_x_]Ì]x_]ׯ }uA.(2v }u!\.Յ0_¸~]頋}u\.Ep(Wꢸ~]}ݸ~}7Wߍw}u1.W.}uq.%3Wx_]K.d%WRx_]Jx_]K}ui{ W2x_]{^~1vq?Wߏe,W.}u9\.o=~﫟g=Wx_;}u#Wwx_;}u'՝c3_wgFY~ׯ}u2tꮸ~﫻}uCWwnx_ 﫟9~﫻}uwy~﫟W.z}u='W/} x_ "W/}u/սW/}Kx_Wx_{}u}W]E_W]~}u ~=}5xx_2Wկ}+x_ Wկ}x_*Wx_=} ՃzWx_=}CzWx_=難}0zWx_=難}#zWx_=G}kx_Wկ}x_:Wo}x_WգzWQx_=G}蹼g4W1x_=}x_&Wo}Xcz,Wqx_=}xzW}x_W}x_!W/x_}B^ z!W/Ex_}b^,YՋz W/%8@𧻓}R^KqzW/ex_ ?#𧻓}r^c?O?x_W} ^+z%WUx_ W}*^իz5WOS?3 ?s?5x_}﫿/6/K﫿p+ 﫿x_}Z﫿qk﫿o﫿o[^zWx_}zހzWox_7}F﫿{﫿zWoMx_ 7}fތ՛z Wo-x_﫷}Vފ[XzPom;ڎz;Poոx_wx_#W?}Ox_W;z'Wx_ w}.ޅջz7W=x_}^ދ{z/W+}x_}~ޏWx_}g__W>;: PCCx_}a><;:տ}o8@WGW#x_}𢡊}Q>Wcx_}𢡊}q>~;:'WrG}x_Wx_}O}I>էWx_}O}i>g Wx_}}YN}u%()8@-ZWK8@-Z^W+V8@Z}j W6x_m}jW;vx_ڷmym'2;L.0eܑu^:=2ܾ S8wT[.L%0SQ20^ } Se. S3]"""kEKQњpvQtwT_G]ܝ;{vQ<7wT5(.wT )]h.JJ=%; EQ2vQJrG={qGWҁ]S;gg wtQ`7Q+ѽ{G{W]܇7mc~s?܏7es~SoM9\)(7p<ߔyOy\7pT~So*ME\7pTʸ~So*.*M꼧 T*~\yol.w𞪸~SoN=UqZ.S oM_xOu\7q:~SojMM\75q&߼7~|7͇~!,~oB\Y7 qf!,E~ob\Y7qf1,%~owoRY7,e~ k>|7rY7qf9|7Ǹ~ |7'~oV \Y7+qf%߬~ oV*\Y7۬ո~o>O|7g~|7~9|7\Y7kpf |7_~|7_͗~|W~߬~Z\oqk67~ |7ͷ~-|7pf߬u~oz\Y7pfl ~o6F\و7wmq{\oo o6&\ل7qf3l͸~o\ق7[qf+l~7?~ oͶηv\َ5qf;x~ov}\͏~#5?O~~ov.\م7pfݸ~ov\ك7{pf~oه7pfm~\ُ7p~37?ϸ~ 7/~+7A\97q JCx_so97q7 o~o#x_soQ\97Gq(c~s oq\97q8ߜ~soN~;7m?p$ߜmN)\97pߜӸ~soN\97gp ߜ~soM oR~\ \~#Fo#qF77k \1~cp7o8\q~p7o\ ~p&M?&M7 $~o?qO\97pߜp/\ oqo\oy\97q\ ~s!~so.}E\?\Kx_so.󏷹7q \+~soU\7Wq\k~s op\oq_\op?\?:\~son77p&~so3m&\̈́뷙p63f̸~om\͂Yp6+f۬~os om6͎f~{ ނ뷷oo[V\́9p6ۜ~osmN\ oop6\ͅ뷹p6qv\ooܸ~mn\͍yp6oom^\͋yq\o;pN\oۻp.\ o|~om>\͏q6?;q~[mA\- o[o m!-뷅q0"~[om\-Eq(p~{7ލwݸ~[ om1\-?޶8~[oK-%pߖے~[oKm)\-뷥pߖҸ~[oK=~{ރm\-epLz~{/ދ񏷽o~\~[o}mY\-pߖr~[omy\-pV ~[o+mE\뷕pVJ~[me\뷕q Vo[o~>탸~ >Uq*V۪~[ om5\q:V~[okw^okmM5ۇp!}oo[ okm-뷵q6ڸ~[om\ø~0>뷏#~ۺ~[om=\~[om} p6~omC\m뷏~(>뷍p6F~omc\mMp 6I >뷏}c~8xqq\}kmSMq)6f~ oms\mq9߶~o[mK\m-q%߶V~ o[~>Om뷭q5߶'>O퓸~>OӸ~4>Om\mmp ߶۶~om;\mp>3~ >q=x~o;}m\?޶vێx_o;m'\뷝pvθ~ogqY\}om\]p+vۮ~om7p>sm~omw\}oqy\=p۞~o{mO\}o_p\}o_LE\뷽o߾/}K~ۛmo\뷽>~om_\}q~~om\qv~;o_ۗqe/+~ ߾뷯}o_Wqv ہ~;o \뷃pv0~;o\Cpv(ۡ~;4a~; o}0\?v8x_;oG#pv$׎ۑ~;o_p5\}o_qu\}o7p \뷣pvߎѸ~;oGh\S;cpv ߾o>oX\cqv,ߎq~;ox\qv<߾o[~߾o۸~߾;~N ~;a2w4o'DqGpvNI~;o'd\Spv NYM۩~;oMi~; ojt\q]\}w$w.߾{~6h~;ogL\3qvYx_; ogfl\spvNWh۹x_;o.<\pv^~;k5q}\}k?p\o?qC\]p wo\] [qG qv!.E~h6wob\]뷋OrGKpv .%~ woR\]pv.ۏp#\o?~|8wox_1~;o?O\];Z+pv׮ە~oW}*\]5;Z뷫qv5׮ո~)~뷟~~3\ o?qs\]kpv \o/pї~%~_WpG_Z\]kqv-~_7x_ ~[\ooqvu~o}z\]߇;Zqvn _qGpv#nڍ~w~}w~=~&\݄뷛pv͸~o7f\v n-~ov䎶V\opG?6\݆pv㎶v\ݎqv~#qG\k۟?N݉;]~ kw}n\ݍ뷻v7=~k^\݋v}~o~\ݏ~{o۟?/~ =w 뷿~{0+wtoA\=뷇ZpGpø~{oo~[zo~{kGp(ڣ~{}1\=~{kO퉡 \=뷿}~fw\o?p$ߞۓ~{oO)\=ߞӸ~{oO=gp ߞ۳Ź~{om oS/rG)\M[3H[o%*\U~;W~qV}[[o-Zo:\uqGo=z~qGo ~KrGo#FMp6o\o?qOpߞs~ڿp/\ oۿpGy\=q.^ ~{o/]ۋ~{o/%\뷗przq2^+~{wtoUWWsGWq^k~{w}?~ѿ~/cp:^~{oo \7p&lۛ~ 2]2e̸~2]T,~]\Z>\V\ˊwYq.eqG.e~]v\na\n[q֟2~r]wr]N\ˉum2݆w].˅wdܑ˅wx_w;.3ܸ~r]\˃wyp.~;ryq\;gܑ;q.\Ip.\ˇwp.(~ ]\+wp ~WB~W }]!\+\;*wq0"pGEp~WtwTwnrGwݸ~w7bsGp~W] \+w%pߕ,~WJ]nQ)\+wq4ߕ;*w=~ws;*wep ߕ{krGݽ~w/݇w}~w?ݟ~w?ߕ~WvwT]9+wrGq<ߕ~W(wT*]wsGq"UJ~Wi%wT *]ewq U*~WFrG~ =wU~W]Q5\wp:U;wq~Wj]M\wC~Pz]-\upVj]m\uqNu:x_0=:w0=w}#~v.x_W]=\uq>~]\kw]C\kwGqQ\kwrGp5Ƹ~x-w]\kwMp1\{qq\kyS\kwM5k5f~]9Qs\kw-ߵ8~Z]V~ Z}~D \{Z}]k\kwqI\{'qzS~=wOosGO]\kwmp-ߵ~];\kw3]gp\kwq=ߵ~!~:}]G\%w:]'wqGq3uθ~lY\{d玺] Q\w][qG]q/Q7\wfqGp9\{p;uK~<=w;w=ppG=q'p ~߽w/݋[^~ z]/\{ ^p{]o\uqO>>x_v]_\up2~sGpn X rG/˸~\{^WpU\{^Y~7 \Ԝ;wpn0 3~7\r;wCqn( aa~7 p\wqn8ߍH|ߍx_7FFH\{ ^6qG~:׽wo~߽wpnߍQ~7Fh\wcpn ߍ1~&߽woݛ~7ƾ~7ݸϸq~7x\wo[~߽wo۸~6߽w;~M ~7&D\w;wpnMIǸɸ~7&}d\R;wSpn M~74\wpnM~7ݻ~.߽w{~߽w3pn;~7fL\;wpnٸ~7f\wspn~7<\wpn~7w>߽w}~A\>qñч~}\[w qn!-~"\[wqn1-Ÿ~\[wKqn)-~w 2\>z;>~r\>q\>Opn߭~VJ\[w+qn߭J|߭x_VOqS>g~}u~9}w\[wkpn }w_~}w_ݗ~}w_W~)Z\qC7~ }wݷ~-}w:\[wpn߭~\ۀwpnm~1~}uw7q{\6ݦǸM~ 6}f\یwqn m-~V\ۊw[q\~pnmm~ v\ێwv\ہw;pǚя~#w?O~~v.\ۅwpnݸ~v\ۃw{pnM|/x_u>\ۏuqn h?x_wϸ~3w?/~ wݯ~+wq ~w!\;wqa\;wo~<7\;wGp~wQ\;wp~wq\;w'pߝqq~wNݩ\)\;w4ߝӸ~w\;wgp,ߝ~wR~ߥpN;w$I\_qG)\S~4i\Ӹ~gp;w,Y\~p;wg̸~3}\ςYp> g~}6\φp>g~-~ ߂~+ߊ9n=9p>~s}N\ op6\υp>qv\q>7ܸ~<~}\}^\ϋy/;pv;pN\p.\ |~}>\Ϗq>?~_ }\/q B~_ }!\/{¸~_}\/Ep(~_pn\b~_ }1\/q8~_K} \/%;𞒸~_2R~_ K})\/q4ߗ{p\2~_}\{q^\p~\q,ߗ~_v/)pߗ~_}y\pW~_+}E\pWʸ~_+}e\Up Wp\`#yLA\}U\UqWj~_ }u\q~_k}M\5q!\pZ~_ kW=q6:~_}\qa\Gp.~_}=\p>~_}\o pa1wGqQ\}#\op17Ƹ~}\oMp1\ qq\~}S\opt }s\oq߷~[}K\o-q߷V~ 'p \[}k\oqI\'q)\j4y Ni\6~}\omq-߷v~};\gp\oq=߷~;}\q#w<{:}'\p3wθ~gqY\]p w~}W\pwp9\~}y\>qy\=p~{}O\_p\_q^~ _p%\ {}o\qi{}\}q/~~}?\q?~?\_qe\_Wp\_Wq~ l{ \p~0~?\Cp~(~?0\p~8~?G\#p~$ߏ򞑸~߿k~:߿~߿o(\p~ߏѸ~?G\cp~ ߿o~&ߏ~?c3ǥw>8\q~<ߏp-\ qm\wp\'\p~"O~?'$\p~ra3'd\Sp~ O~?T\p~O~?t\wq]\p~~?g=3q~fz3q~Y~? gl\q~9~?\\]y~?.|\qj}\px~~\_ q~!/~b/.{b\_;XK%~fKq~)>g/K#\?p~9/~?qc\?Op\_q X+p~߯J\_p~߯.Vj\_q~I)~g~9~\_s]|_ =_~e]v%|_Wop~-}k\:qk\op\oq[\_p~߯~%v\߀`p~#o~ p;\>M~ 7&\ߌq~3o-~\ߊ[;~~p~ 6.v~;oUx\ߑ\{~; 6p~gz;q~'wwaq~7w\߃{p~/.^\߇p~v~\ߏ8pd?ϸ~3ld;~+.A C!\?Dø~=vqK7\ ;.Ώ\?Z]c~~?;?^];q\?'~q~ɬ$ߟ~ O`pߟӸ~z&8gp ߟ3;ٻY\?Kßߧzߧwxjv!p^% B+\ ~׸~opތe-oq;Mg=q?.\~p>g#G\Op>y]$~~'9\?.p/\ wGq<\@_ ~1w~ /cp/2_\U\J_~~wkp\.q_\.~]~o.nM\p!S]L 2Cf\L#d>Yp! ?d-Yq!?d{%c!?dCv\Ⱦ>c!;?B#܂-73vn[w[q!?x\7)c!?C~\0c? C\(X4c ? C!\(=c? Ca\(2c0?C\(B#;BoEQ\?\?:q?k.C1\(qvQJC \(%PJCI\(u7(p?;B4?C#܃= (ew2P.{w{q>\uvq?G#܏;EY\(K#P.(wrPq?4`>h q!?4gţ(?<C#Qovq1?4]4&;B\hMp11\x o.wN`Mq C_Es\hN#4Ђ~Gh-wВ~Gh-;oU]V;B+\x"''p 5?NZv'qS?<OӍӸ4?6І~Gh];B[\hK#.C;?З~G}q/~П~Gw] ;\@#x^^WwWWpU\x^.@\qaЭb? A0eqa0C0~GCwa%0\F# ;^b8? Fav1F#qa$?.^wp5\x~Gx^.7w7pa0wѸ0~G=]1;\C#9.7w7qM\[]0øb?0ϳp--\x~GxxަwwwƲwpa0&v0~GwIwI0~GqarGv1&Spa ?LTa b*?L4agb?LtaEv.?K#=.w0fg3pa&?0s/pa?;vb6?̦a·b?̥\adpa0+0~Gb;?|>>qa v~GX wEy"\XD#,;b1?,aBvKqa)?,b?,e >.>p#\Xwr\~G>>.>OwOpa1vV+qa%rXwU~GXu];j\XM#|Z]|g;g;gyyv999?ּ. \~Gb/w2p++\Xڦb-?;]v5?|C#|ߤw mv--mzwu:\XG#;b=?l6a_b#?l6FZ;\~G.M;&\D#l6fah3~G؂[w-~G؊[w??6a[v qa{zW~G؁;;q]??ÏD#w3;.\E#];\n\M#=;ž\C#;^\G#};¾؏w~G8@#;?wwqgᗚ/ ?J#w+?A?!pnvqq7᷶7\~G8Gw#;‘SQ(p4;±{cp~G8wp~G8'w߰;;?N#;$?N)p NNw3p~G83;:gwp~G8{;JC~GHC~G ~G w2 w~GP؅M#h\;L~G[N,?8ܑO#x\;B(.?!Cb7vq! ?$;B1HpOO\~G~G8wsks;_;_?߸77??;\@#\..E"?\...%?\.aq2pWw+K+;UjzWw;wkp~GA\~G.wp?u\N#\;?ܠnM&pn dQD#f3cf1w3w,~GQ,;bV1+?fƌ]l;b61?fWE̎wx xk-;⭸x+x+s9p1;9wĜ~G̉돷xx?F#\<sx;x;x;;E̍돹wܸ~G7c1?c^1/;w;w;qNN\~G~G c>1wX~G,0;*wĂX~G,x;*독wBX~G,L#;ba\,c?cQvEq;p<~Gwt7x7Xb;bbX~G,wX~G,%wĒ;bI\,I#R;b)?Kci4X{w{w2X~G,wT~G~G݇}; q~,?˾.c9?.cy@#>naUq*XnapX wX~G;A#֠kcMf'&?֤LJwćrGc-?֢kyvQkq6XAvQupaa\|~G|fuwĺף5c=>?֧;b\l@#68.cC!?6-.GwGqب7h돍wƸؘ~GlL#6&;b!Q ?>F#>=w88?>N#65Mqج%hF#6csLv[-pwv[-q%؊~GlՓ;jE#H O'w;b[/rGOOOw$))Ο.6;b\lC#.c[-?p(w ?>C#/qE؁~GwĎsGwN;b'\D#vu;bg\L#>[;zc e'wԕ~GJ#vM+-wԍ~GF#vK9gwww/䎺ϧwwpG}w>;b\K#Ǿ;b?\G#[;b\O#w;;˯rG//^___fwā5 q0?Oq?Cqq(8h(8~Gwa;N#pqDh8~G#wđ;H5\|~G|m#w?N#돯od7w7pq8~G5;E#Gwч1;q 8~G|(w&&&8~G~Gu;w4~GE#J|68-w4~GM#I|8~GC#Υw>~GK#ΣVpGw;|\O#?O#O#<}@#~@#~> pq'h!~G\ wE;"q~G\L#.Kw%;qih)~G\J#.-;~Ghw<;o;;L#~L#~B#~B#~ q~G\A#;ZI#W*q*qWsGwOwOqSӳg;g;gy9sss\\C#kw/w/w/w/qG_____5䎾kwĵ;;;;׿rG掾wu;:q=~G\O#7qGw ;F\H#n;H#~G#~}O#~O#~돛wMM;&q3?n7O6[w-~GB#n[wĭ;;;;;6q~GF#nw;q~GA#H#H#H#H#D#4;~G~GI#ww];.q~GM#ww~GC#{;K#w}w;~xggg\~G~G~G~Gq x~G>{>!!!!Qɣ;Gw$HHHHHwޘ~GҘ~GҘ~G҄~G$&;&;w$HK1;w$M;oJ#iJ#iJ#iF#iF#iF#iF#iN#iN#iN#iN#iA#iA#iA#iA#iI#iI#iI#iI#iE#iE#iE#iE#y~G IkIkIkI Iɓ;'w$OHߑ{:H:wށ~Gҁ~Gұ};w$H>ߑ|H#NO!ddbdAz w$ w$ ';E/ߑ,ߑ,:.Hw~G~GYB#YRg)d)dddd#G;w$HHH.H>ߑ|L#~Guv ';;  JJ)g%dddda޳~G~G~G~G)Sɧg\0 WiԶm۶m۶m۶4m>OF5oyzך5+ɽ::k9w88;w8;8;6bg'g'g'g\Ώ;tz;=;=q~N~~ .p>>hO/w8w88w8<8.w8tz`AV8H9H pB6"~s~s~s~s0000HA\;tz;tzpq~sNs~s~sr!.NpNqNpNpN=ii:=iiΙ8C9#gw8gw8g{,笜ᜣᜣ㜣᜗Cqq~sNs~s~s..p.p.p.p.E%%%e:LùLùBùBùWw8Ww8Ww8Ww8W8w8w88w88׻::\ܠܤܤܤ[;[tz[;[tzۥqq~sNs~sNsg2.pqpp==:===}:=}}:=}:=9HyHyHyHy$w8w88w8>\<<<<'p~~~~N~~~~N~~~~N~~~~J pBw8w88555'\ἡ㼡ἡ͋;tz;w;wtzw;wtz;;tz;r~~N~Q?p>p>q>p>LLL"_Z  ǡ8;Np p q,p,p8a;0NEqq\;MqptzO.<;Cqqx8>~㛏 +++S\|||||O;tz;;p~N~~N~Nk.~p~q~p~CCC#///矜;tzL8&M~&~ OÄa?0w;L&NDa"1wHtzL]~&@0tzLW ~LDa"1QJ](;L:=&~ c']@&*~JDwaw :=&~ a1whtzL~&:NNDǹĠab11w871];LL:=& & ~MĦabwa0qw8;L&ni ~Kģa0x.L|&>~O$wa0 ;LB:=&a ~IH$a1V]D;Lb:=&1NI$a1Iw$;LܸHJ$c0wdtzL2&8.0;L :=&8\aR1)wtzL+HEäcR0p~IMǤayfHCäc0i&c0;L9/@a 0w;LA:=S~)Da 1;0SN)BclE(S~)JSN)Fc1wtzL SN)AÔcJ0%tzL)S~)EǔcJ0pQN)Cǔa1eS,SN)KÔcuE9S~)Oǔc0 ;L9@Ta*1wr^NDTc*02S.1U*r^N UtzLUS!.0;Lu:=J\Taj15wtzLwIԤcj05Z9pQ~EԢaj1;Lm:=NQvTNCԡa1uǰ;L=:=SNwէa1wtzL8h@4c0 ac\4a1wFrh5.0;Lc9oL4Ž1M&rޔNiڇ5c1wftzLCӜNiN4cZcG-wtzL %Ӳ2.Z0-V;L+:=l\aZ1wtzLk:= ӆNic1mwtzLӎNiGôcgcGtzL{ӡ.:1;LG:=\tc:1wNtzLLtc:0].tzLi ӕNJtcaGntzL79FtOƎ1rރNіcz1='s+.z1^;L/:=wtzLo7ӇNCc0}tzL_ӏ~Gc0;L:=f3~@ ǎ1;@:=fP v4ND a1۳;`:=f3NB a1CwtzP:=f3NF tzpf83~!#H:=f$3RG1Qtz(:=fcFgGtz9Cnjc1cr>NKnjc1|3NOÌc0 tzf3;HLc&0I$:=f23~LL1S);:=f*3NJLa1itz4:=f:3NNLaf13wtz :=ff&v4NI̤cf1zYtz,:=fϦcftz:=fϡceGstz\9G̫Ȏ1r>N?ͧa1 wtz:=f!NY-c1wEtz̢PvNYL,a1K%tz:=f NYڇ-c1wetz̲vNYN,a1+±tz :=fNYIǬcV1Utz*:=fNYMǬcV1k5tz:=f NYۚc1utz̺hNY/ahN tzF:=f#Q71Mtzf:=foc61[w-tz̖ih NJlcaGmtz6f=;Nlc0;m:=f~Icv1]tz.:=fNMcv1{=:=fNK=͎1}tz>:=f;Oc:=@]vtN9@y0L1r~N9HDŽ1!tzL1Ctz!:=搜c1tz9?Bc1Gr~N9Fa1βtzq:=8sN9AǜcN1'wtzI:=$sN9EÜcN1tzi4sN9Cǜc1gtzY:=,sN9GǜcgGtzy:=<sN@\c.1tzE:="sI/1Ktze:=沜_c.1W+tz9B\c1Wr~NF\a13tzu:=:sNAܠcn17wtzM:=&sNEܢcn1tzmsNCܡc1wtz]:=sNGܣc1tz}:=Ny@1tzG:=#NT}c>1tzg:=3NB|c11;tzc c#Ntzc,&atzLFǸctz[=tzN1:=+^:=KxopNɹN1_rW:=+NF|a1tzw:=;NAc~1?tzO:='NEc~1~7NMc?tz:=/N;{1tz?:=N Gdžctzlx:=6<N@Fc#qn#؈tzl$:=6m$:=68tzld:=6LFƹBFc@:=66N crOT:=6*mT:=6N ¹ cpnhtzl4:=6:NNFcc1tzl :=6&NIƤcc鱱Xtzl,:=66NMƦcq]8tzl:=6.N{{xtzl<:=6>NOƧc tzl:=6!NMH&c鱉pn鱉tzlb:=61mb:=6 +.IpnIؤ{') 6NMF&ctzl :=6NMIǦcS)Ttzl*:=6NMMǦcS鱩4tzl:=6 .iشtzlZ:=6]zIGǦclz:=6=N@fe3،tzlF:=6#=.NDfc3鱙tzlf:=6 =.NBftzlVz\6+NlrNNfotzlv9AcsE:=6cs9?sO.:=6cs鱹tzln:=67NCcyK"/NGcME>:=6?NO濎tzl:=[N-؂tzlA:=[%c 鱅tzlaz\0[N-BcEs([-Je E1:=cŏ8[BK%ؒqQN-)%Rtzl(Eǖtzli:=\cy:= [-KǖtzlY:==.[N-'tzly:=<[N@Vc+؊tzlHVc+鱕J'qQNLVc+Uq*tzl:= [NJVcjtzl5z\[NNVc5tzl :=[N5ؚl-:=[k7.j鱵6[N u:r^NC֥eu[NG֣cy}:=>[m@6tzl:=!=.ېNm( ۈmD6iqјNmL6cMq&tzl:=)۔NmJ6cftzl3z\9ۜNmN6c[-tzlK:=%ےmyVl+:==.:..Z鱭qtzl:=M\cmضtzl5hKǶevqўNm/tzl<@vtzlG:=#=.ۑN(JۉLvqљNBvcyJve][|\tcr޽.ۃN=؞tzlO:='ۓ^l/:=7=.ۻ?.z鱽q>tzlz\Q\c}ؾlGeqpџNOcb;Hc㲃A :=v;LeC!:=vcCq١tz096ap:=v?tzz\v;BGb$;IǎQ(:=v=.;N-qtz9Cǎ1X:=v,;NKǎeu8:=v=.;NOˎ߁tzz\v;D:=v"=.;NHNe'鱓qtzdz\v2=.;NBNcSq٩tzTz\v*;NFNcb:;NNeg :=v=.;N)3;b&;EΒY,:=v6=.;N-q9tzz\v;Gsع<:=vϣe]dGq|9O.z\v/e6B:=v!=.N]D.ZEtzbz\v1]K%:=v =.4'.Kq٥tz2z\v=.N]F./Ǝqtz z\vX\eW+ؕ˸XEǮeW鱫qqqN]Mˮckb ]KǮkpN]Gˮc:z\v=]OǮ :=v=.N(qٍtzFz\vI7㲛ófz\voeTz\v =.Uη[b+Fnev:=v;=.Aew;qٝN:=v'=.NEew鱻qnz\v7=.NC9=^z\v/}>:=v?=.Oeq:=6 c<=He< iǎBqz\emcGqa9?L#z\eGq٣Q9?Feqr~=N˞ :==.{=IǞeOgGqS):==.{:%;:M˞eOgq3z\ =.{N=K˞qstz9z\qy:=<=.{8..qًtzEz\"=.{<;D^e/㲗q1ez\2=.{YίW+z\_e`GWqk59F^{Îqr~ݠeo7&=.{Iޤeo-z\=.{Mޖz\ߡewqٻ]:=.=.{/;Gޣeq}z\>=.N}@>XŎqهtzCz\!=.}D>c㲏qcz\1}B>eOاSz\)}F>e+sz\=.}1e_/%=. eCqP9e_㲯qW+9M˾e_㲯q7r}C˾eo-=.}G˾e;z\==.^=.@~e?qُ':==.D~e?鱟qz\ =.NB:C:Cz\㲆5e-=.kqYKˆal=.F˺ #=.e]ufGnz\CzqY=.Ȏʹ>z\G+=.J~e7z\=.N~wz\=.!?qٟOz\'=.S㲿q_/z\e㲿?z\=.Keq?:==pV̲3~U{.߳az}{H=MH??,|,oX5,|{ɷ{a;"$ȗ/`0WX?,B7£'{" ̿El~/5{ĕmk_?=_w)~_4He4ގ{" ~\~_s^.v^={ 4/KƏ?`׷rOð/y2{"8>={wyv`s7D`(Rs{Q=Qt.((+߹'0IgQ lz?7p،Z}ǒ | 迟w݃~nT?][{1(ڡkϏE׃2u>__$vyqQЧ̾-hQ/_Gyr_(ZDT⿟=Dh_~(|ﱣ_q#;Q{b4E!(R\8Žb<q3;Y1['j\<Ŏb"Vv+*XQ ź=>"v ;{bWeG<4\Ύb_؆ő8p6;Ӈ{eGq<\"n[q< \]r.dG"^q\kΎE( \{Q4_op=;߲q .TfG "v`+.\E/(at\$́5'a/\$Ŏ构p="Q>v>$D 'Q0.=`GsO$H\{7Ea('>r/.bGI.2 E(S0.2=`G"s\d.Ž27Ea(r\d>Q濸Ȓe),qe ;ʲYΰ,q5.f`GY+"kGvu.nEK('Ďelq;6{dGnpO0\d͎uQ~ܓ}>.gGqO!9 "GcvCs,E(\͎ryْQN9\QtU\pk#;u޳r; .rWeG"4v[s_En<1'O.\<}pg.\4ώ Eh̎=FqXE쨱7^GQgh5&pѤ5;j2Mֲ&r5.FbGM3iEvTΛNE%\4ȎylhV5뎋f3Q39ovQ<;j.qѧ7;3}>rNjQېp7}=}~rޯ.5gGFpO쨟{Q4ӿ .yq[\ p12.tfGbVv4 .|h`\ ɎY .v4(..Šh\ Zb\ Ύ'"hpS\ 3.!p1;Қ{Ő34.fGC#q Z{vIhfz C|X.ecG|Xw\ Űhyޏ q1;#r>1.F aG#bav4BGhd \lɎFոy#CgT\Qp1=.F%bt .F誸-磧bv\.\Scz1sp1f/;sc- AcCGKqp19;7Vqq1.ƇcGb|v4-.ƏhY"sτLPM Sp1A'\ńhÓr>'.&bG|-\LIqq1);$bv4)Ir>91.&aGb0v4Y'gh_\LIŎָ2MY)9 S3p1#;*S7bE\L=ӂp1MΧUŴ&vb v4bzl\LÎh<\Lߏ(q1c;3Op17.f&gG3KbfKv4s.f̓hf(.fE`GqϬr՞͚=6Yg{\dGp*hvW= ׸g91gN.\̩͎9#sb͕p1!;;sr>.dGb^1v4Ożhq\{4_o|9߲q .θX0 rς+X ba\,= {b/܍p=b/EqHb/ʼnq;Zp(.?cGbIJv.Œ1hZ\,9͎HX-IXK/q,-ˆeq;;Z6{29_fq<6;Z.b/r9_ 9_Q+rb .V'X%p%;Z9 +Wr2"Up;Z%&bFv<.VgG|u\ŽVwih;Zkr5r7.Śܳ.X[k| \!Xk|]R\uqn.X'b}j\/Îַqhz\?oцȸؐm qa ;ڰ. q1:.6`GkbcOvq.6[h ⲣMp>.6gGpϦ`\lz=bsbvY77f9߼ r/.RҚm-kpEηHhoIغmq-mˆm696vm7pͲr=.eGb.`G{b@vw.b#v'.%eGb_s\ž{hor=.eG@d\ĎTŁ耜؊сϸΎ<.{Y͎<؅q|8X pq0|QEHSv2{B9yPJ9TCcpqh ;:t{a9?+Ⱌr~".ő vt$.TcGG \Ɏˎ<8Z틋8zG}XB\+Ď5ű8;cOѱ߸8K-(\_=Ox(;:{Nʼnrs=.NL`G'6rω8{Ndvt 슋r~r;.N^eG'TL\ŎNũ蔜ڋSw).NgGtC\ȎN/vtZOřL1\iΎ8syY9?[g89g[\sr~.)8g\9pq.Y8/o ⲣ pq>;B0;qq..6eG2vt(..>ſRJ\\*Ŏ.ť1]:KH+$\\=/GvtEίd9Wf+r~:.ظ]}qqUί{誜_KkѵƸ6]kqq ;דr~%.bGWIvt]oDōF9\hώn qx覜߬]qqs܎r~ŭ%j▜ߚ[{qqKoypq[o톸-⶜~?pqGŝ\Y;ѝMepq-;;wױgqq-.EfG2^%vt3.MŽe\̎G_pq7ܿ.v@9r.ĸxX=CqPg衜?JGr5.aGi\\;z_r>p!1; Pva.>eG\|Lck\|kp4.>H$*SG\|OpI?} \|pY?睸,-.fG_K\|ˎŗ=\|IȎBp#g0.%p# ._$Dž) ӒQ0ؑ9  ٴpas Y9q&aqVy4\yU\9%\pɹ7.\sؑK]qsw|\ #½Cp~ĎrI O1vi pvsq\;Å75;ʹ-.ؑw.gّW}qȎ|p 3*_kkO\|qUοp-..z&[0.o.ߋ{S\|p]ο??!?J⇜kpCO9?+gGvs.~nbG?/G\ bGW5v;.~ůu\-wv[o9}}菜)?rg0.,aG\q;+G⯜=蟜Kr=.M`Gy\ùsfp].\w Gp8ww ˿#WZ~;rǹ+^ W{.\w䊀sW~;rE+BG8wEwኘԿ#WD"6箈+.\]"߅+]]"pE¹+: W$"pDpPsW W W].\q߅+2]g]"߅+%G(.\Qwe߅+JG(.\Qw Lw ,w lߑ+p߅+pG~g~?pE-ŎpEwኺE=w{]* &]p w Ȏ-߅+]Ѻ]`Gpv .\8wEw኎sW~Eǹ+FB\(Ďb4E(]1"v.b&gG1q1Gp$;sW𸈕*XQ,bmE({\El9]"ކrE#qj"Ǚ8{qGxpWE+q"}?p/);W 񚳣xqo.gG^"?v?5.E(8\_ǎEH%ȈQθH0 q3;J "a v'$r&.Q"9O5.җaG\pCs E%qxQY9[#qs;y9Cq+<;%ʱ\rk<.rm`G<{v[sgE*(ƎryvT"!(`\XŽJyǸ(!%d vTRKEI9/y%CQ)9/T{\ώJy(%qQ:3;*-祻⢴ކWQi9/eL-\͎y=(#e<( pQv ;*eCQY9/\1\krr^n.E99/|\or^~.y r^.*y)g\TqQ.*yY(o⢢ R>\TJqQi.*y$r\TnŽ*EeQ\T~QRUi*qQe ;"U^r^5=.V`GUDvTUΫ^EՏ쨚Wʎy6UjqQMΫE쨺Wr^}?.eGFB\ԐpQc0;!5㢆QM95GpQ$;)VZvT.jgG\:ώjE(쨶׮]QiՖ.dGurN-vTGE=s{xpQWE+u᢮}?pQOE=97V࢞{zr^?5.E}9?Y\r #.yθh0 e\4q0;.yÞh85܅7qŎEQ=\4ꏋF Q`\4Fp81.aGP\4Gq);j,MR⢉7i&Q9orMiD\4Mώyӎh*M7EvTΛEE39oV ͺfrl.y3Qs9o^<\4ǎys.Z$dG- E#vB[,Ec\ŎZyhقQK9oVQ+9oUVqj;j%㢵ΌUpZ[OEk9o}\69qFE9h#mn㢍qVE[9oqV%E;9o 㢝;vr.ڧE{9o:\?oQ\tȎ:TEθ0u؂Qϸ5pѱ'.:y]xuNqqI;E쨓w:Nr.:'fGs\tp(;,ࢋw).Q9]k\tȎy *]'&vUλ~E[V\tƎy趃unuqѽ;籣r..Q9Qqc ;!=r39.zEO99=I\|^r+-.zy5y\Qp;3.zy﮸-罷U\>1q'';S }zvg.fG}<}󳣾 pw ;}Cp!;~pѯ. gGVqv9.E\oc:\?ˎ\ p13; b@9X|,\ Ŏ@.T A p1HŠoh.r>x(./cG|S\ !)q1;"CFbv44.fGC|hz\ vЉ*C/bG\ aYq1L·uŰ&îbq1\·p9bHr>.F 9q#|/\Lr>.FUy#|Tx\Qp1=.FgG6byv4=.FGht\ʎFOm}vp1&;#cjbLov4FaGc|c㳣r>;+cbAv4V89W 㚱qr>n.ep1^Ǐuh r>!#.&TbG|d\L q13;(bO쉋D9x|R\\Lˎ&M:I$9 Mp1y(;,瓏bS\L))q1EΧŔѸ"SNbOq1UΧvT9 S/bOir>.u49|ظ.bOp1]Χp1CgŌF!3b!v41.fhf \lfUy|YѬUڱYr>k;%bvv4[gWaG|T\Ǝfls|NN\̩Ŏ9#snb͕q1WEh}r>/).cG|p\̓yq19;'Sboc|9|A.ddG |Ag\,[p2;Z bavv.dG |.\,Ɏp(..zX|\,Ep81.&X,狗bQ\,pDΗŒVX"Kb/yqTΗVR9_:K7b/er,+.U29_6|u\,X.sb/p\Ηr9_+ brBW< 9_)+Krr$.VbG+|KvJWŪrhUr<.VgG|uf\]qz*;Z-端b599_k|\͎X+kb@vVZ9_뒲ur.Xwup^ח6h_g76JЙm [9r;(gb.vQ7&9ߔ걣Mri.6 |sa\lCqy.6槸,[RbK)\l-qEηŖW*[bo퀋qUη^V9۲bo뎋mrm.]69 |{\l}~mbGB\(Ȏv4Ŏh\8ю_ؙ;|g \ɎvΓ)bWZvKw.9ߵγ]r; .v*ݕp[w;=pGŞ=hb͏ ^9߻{|C\'b vO=>9ߟ˰r,.cG|vt@dŁJ耜̎˸8rr3q,7q,`^\qqP8(!q"!Mp2!rr!rR␜jCr~h .!9?p\r~x.ᏸ8GH5\#qqd.r~47.Q9?*GXBvtLΏ5bG\;Ď_8.Njx vt\Ώq9?'³r~.N8pqROf*褜r~*.N:蔜ʉSr~7.NfGm\qq:?;:-ⴜ>i9?g3pqf8;:#gsvt.ΦfGgl\ˎٳ謜 Ź蜜Ď-8wy9?_{⼜߅r~ޅ qpqA/9ₜ_r~0..6E9 S\\Kr~..Ѹ+\\qq..剸,/\\+Yqq;Wvt:.Xvt5.:j_\\pq..59V`\\[ŽǸ&דzqvt]ίu9~_r~#-.nv1ݐqqCoF覜삋r~s.n^eG7V \ܒ[pq7;%▜v\<ˎx&`vLΟ39 ϓr.Ux~=qB_ŋv腜؀r.^FaG/e\Sqr;z)/\yhN\bGr:rzvJ_+95Wr!.^뤸x]qZ_赜I7937gq .یx+o;d\qVEŻx'z❜ۅw7qN{9_⽜?r.>$92\|8r.>ǒ \|p)".> $&&\|OpY?gj,_b/r;"_>vEοؑ#NA\8ؑ#\8r<ƅ97qa܌ąYŎrn–cGVx\X9qa߱09ˌ09낋(Lî"L]1pɎ\r un9w7{ ;r˹ .r ORvsO3\xܳc#fG^9aG^9Å,;ʹ/W Nɹo .|rpUοW9:_w⫝̸u⛜ˋopMο79v߾⻜/r}(./w9GJ\(rc4.~S ?gz\ps".~ϋ)翢WV\_pKů%}q{.;-ﲣr'.dG`\?p1;#⯜m#_9{_x\Kˎv'6yvpQ.pWGp8wwsw/~1;rǹ;|- wxpߑ;<=~8wGw#w#,pG;C w#߅;"]#.qsw#i߅;:ܑpƿ#w.;r0ٿ#w..ܑq=.ܑg]#߅;2Q]pG;J wpGwᎂsw`" w ݁M.܁C.܁8wp5߅;*Q[]u߅;) wT"]pww¹;h߅;~hQ.pV h.v]]=߅;z wt};swt.b$`G1pш;b\8Ďb.b8.b`G1q 1q³X8w*X8wXQ,cEl9r{*.by쫸ő89qGE(ǹ8r7.gGq<@\ĕq!;+"kxQ<9w 9ϟ<\ˎy3/pQ #;* :ᢀ؂Q9/ ` \ y]((pQ(;*$ᢐBQ!9/ r^ ;*,煗vTX E9/REZᢈY"r^.FEQ9/ZED\݄r^.y(V t\bqQࢸύr^.Eq9/~D\(r^b0.JyC(%d2\-pQr$.Jy()TZ\RpQJKys(%弴]pQZKyi9/-ebࢌ2r^FE9/#e᢬mQY9/{e\KŽyf('1vTNEy9/_۰r^~.y7*y &vTA+|EE9kr^q&.*yśƎ*y$|vTI+E%9, r^y(.*ye9U*)pQEΫy쨊W9*r^UΫgGUj\TȎy 쨪WjYQ59 \Tjr^=.y:>\T>\Hr^.jyŸq5/\ԔqQ.jyU)5_Vx\ԒZeqQKkE %ᢶΌڕqQ[kOEm9}ࢎɉ:r^.E9su伮͏r^Wy]9u弞דzr^o8.y=9'~j\ԗr^,.y35q@tE쨁7r0.fgG a\4p&;j(࢑7FQ#9ot7\4NĎy&h,獗vXE9oRMZ&rd .yWh5qTΛyM쨩7frLΛUcGt\4fr̰r<7.ys9o>5wqˎZy쨅Q 9o-e2\,rr$.ZyhUZ\Vpj<.Zysh%筣uf\]pZ[oE뫸h-mbࢍ6pFE9oExh+mࢭ]qVE;9oWᢝ[vr9.E{9o_弽_r^;y9P伃wr.:yG9(L\tr1 S^\tǎ:y$7vY;Eg9<r).:yRu.qEλEW쨫wMr޵.NdG]\tnQq-+;&ݺᢛwہnQ79 {\tÎy}.GvC{4E9!=r.zyO9ق+qS{y쨗*^rK{m`G;\r޻2.zy喝-\>9qѧ.yٸ#}n㢏}o~\pw!.y߇+_Q\~qOE'Sᢿocq_E9q1@t9.br>.@9 |Ar>H 9t|r> .`9,|\ !r>;"CVb)v4D·FdGC|hy\ M*C?bXTv4L·U096var>bύup9>|]\ r> .Fq1BG&hr>.FdG|T\Qp1j<;%bљh9|6\ŽF#c|L/v4F9#c㱣r>.X9{c|\qr>.w |?\q1 .u/bB.& &b\L p1Q'f긘(gbOa$bOꇋIq1I'$9 bOr>.&?d9S|O)r>EΧT9S|Or>.49&|Z7\Lir>MΧX.|Op1]Χ 9!3bϐp1Cgdhlr>s%.f`G3|Vx\̒Yeq1;%6bzQl9]|T\Ǝf/#srbN-v4G9ssh͏r>w..dGs|C\̕yIp1(;'bϓy<9 |ˎ3/ |AFv@t9_ .r0.B9_؃-pP8X$b/EpH}DX,狛b/^GpX9_RKZb/Y%r.FR9_ZK|D\,݄r.XV|t\,epb/ύr.r9_~|E\(rb.V 9_+|rr$.VJ9_)|U\UrJWsX%|]pZWj9_-kbb5rF9_#k|mZ9_{k|w\KŽfX'b1vNz9__۰r~-.76 &bvA7|F9ߘrq&.6ƛƎ6$b|vI7&9, ry.6f9m-)pEηho9-rUηcG[|k\lr;*ۢbom69߶|or.v9߾|;bhrc1.v9 ;|gq\lrs%.vΗ|WY\]qk=.vw-3bwe\Sq[w_/#{rb酋=qG9{brW>^9'|}rO>9ߟ |r .9? @'\r~@yp4\yyE v,⠜A9?xW\$bG!r!r!GQ!9?TZCr~h5.W8qqXOM谜#r~$+.TeGGt\#pqİr~47.Q9?:wqqTΏ蘜cr~LΏ=fGx2\r~|$;:.O⸜i 9?'8ǎN(8)'d\pqRO8%jT/\S{pqJOqq:.N8-A\qqFřf8#g⌜y3pqVϖY9?;g⬜}sr~..U99?7%\r~>;.8? r~!/..9 }\\r~Q/!(_K)pqI/%9$N⒜_r~Y/we9,_+r~Eί9W_r~6.U9*W_kkr~m1.bGO\\qq;.W⺜_ 9Q7x\Xώnw)73fevtSoNM9y7[r~+'.n-95ݒ[pqKo趜r~[o?dGN\ܑ;r~g;#w⎜ߑ]9w=Î\ܓ{r~;'➜ߓ}9_߅r~? ?r`>.9aa\$SvI?m'9$矣r*.>g9}_͎"_9rą#玜;qȹO\97qa܌Y #%.4eqa܎Džs{.<,.< .¦"Lî"L]1pʉ z%=p…Kpsw\-p˹;.9ɹO}rی qUοW9*_pMο79&⛜or]οw9.rC91?r3.~gG?D\p;%翲◜ꆋ_/9u w,\͎~>-v[$9?r.9-pW诜 rOcGz\8ߑ'=*]xp;ù' Ox{G8w sOx{»;D'B~ O{"aG8DxwቀsOD{"瞈.<qsO~8DJwቄsO${"D¹' O${p w '߅'{.]xp8DwቌsO]~7.9/Kr .y~9@\r^`2. yK( `6\=pQP y((࢐BpQH E{($ᢰnCpQX Ea9/ER࢈i"r^d5.E9/Ehy\퀋r^t#.y(XU\br^l;.y19/.xm\r^\΋yq/.Jy 9/!%b\r^BKy()%弤/qQJKy)9/%㢔Rr^ZKgEi9/-弴r^Fy9/ e伌2r^6.yY9/+eA\r^Nyf('伜rqQ>;*/ࢼ_gQy9 r^".*tbGf\T pQ1;(㢢WQE9Jr^)/.*eG|\TJr^+;, 㢲WKQe9弊W)ɎyQ"U+vTUΫEU9*U'r^.y59UjpQMΫyk쨚Wr^]ΫaG>\Tr^#;!5⢆אpQCkEM9)5[ࢦ\r^SkE-9U伖ZZr^.jym9]T\Ԗr^ .y#ul\ԑ:pQGy+uB\ԕpQW%E'ᢞ;zqQOy}9/ࢾחr@dE9o 企7rPyC9o 弡7r(.y#9o$\4FrXyƸh,弱7ƿqDΛy9o"MV㢉7rTΛES9o*M弩7frLΛy39o6伙7r<7.ys9o.\4rB[yAh!-伅pR[yK9o)-OࢥVrJ[E+9o%伕rZ[yk9or&.yhӋ6{pF۸q6;j+m㢭Q[9o伝kƎyh'_v^ۗE{9o/ײr .:y9PuqA;yO쨣w̆rQ;dG \tNr)/;$ᢓwNQ'9弳wŽ:y#,K vEλE9"]N.r5.yW9]F\tr-*.y&v\tn弻wr}..yw9E9Q=伇Xr.zyO9Y=\r%.zy4U8\^p.zyL-罻T\r[y#}伏>pGy_9+}ࢯrW%E?9'伟;~rOy9弿r> .9 |f\ r>P(|a$|Aq1H 9, br>X?`9"C|!r>D·P9C|r>.09&|X7\ ar>L·X.|p1\·9!#b v4BG9#r>.FȕyQp1JGvhZQr>JGGaG|te\r>z+;-磿b1593c|qr>6?.X9p1Vhqr>N=gG||*\r>~ ;/bO 9 |OĎ&h(|bv4Q'D9(bOIr>I'$9|Onr>y).&d9S|JI\L)r>e5.W*S|jy\Lp1UΧ&ӲbOiq1MΧ]4r>=.>>|\L p1 .f 9!3|#\̐r>Sg)3|ϒYip1Kg,9%bϖr>[gwl9-|ω9r>G9s|ϕr>>.\9+s|w\̓yr>O帘'|ϗq1_|9/b/r@L9_ |/̆rPB9_x |/Er."9_$|q"\,Ns]*wK;ӥrt#;]zu-NݲtY7>erl;;]&wny,>r6;].wn>>rNW [ѐuܭXNW [uܭ,NWJ[uܭ|NW*[UuܭNW*[uܭNWj[=uܭNW[uܭN[sZ[+wkӵr ;]+wkn]vN5enܭ;Nݺtܭmz[r!~o > wnf w>}Q6Q6hma$wbmMqI6&,w b_7f}n>'ج-)pE߯[Z}e.u)\lV9*[|orUη69ߖ|omr.v9.|{\lr]η!;|pCwN9);brSw.9%|Z]rKwn9]|r .9#{|l\=rG+{|pW>9'b}rO~9/|?r~@9? r r,r,;q,r~P8(_q"!r"!r!r"!r~H!9?$zr~Xa9?,#r~DΏTeGGt\#r~İr~4.Q9?:wpqTΏ蘜cr~LΏ=bGx2\r~|;:.O⸜i 9?'8ǎNȸ8)'dvtROnI9?)bSr~&.N)9?Sn\r~>;:-ⴜ9?SgYΎg8#gli\cpqV78'2✜spqN]99?/⼜r~^y9_臋 r~..9bc\\r~..߸$R+\\KqqI/,Ⲝ_qqY/9"W_+qqEίU9*Wk⪜_r~UίzqqMί59&⚜_kr~]ίu9._r~Co 917ߐr~3.nM9)7\ܔ[r~Ko^%ߒpq[om9-⶜ߖ;r~G49#wr~W]9wߓ{r~".=9''\ܗr~_/?yp@9 ⁜?rPC9(?JGrH#9t ?r.c9,I .9"O?ƎXx*OivTΟS9*gr!.39v=g?q\Ο蹜?_r\_cG/EY\rb=;z!/⥜K99/ŽB<4.BrZߤbGoM\7r ;z#o#⭜pVn[9+❜wrN;9r^{9?r0.>9\|r$.>Q(+\|OpI? $.ⓜYpY?wg9,/rEο9"_;rȹ#玜;rȹ#玜d0rnȹssFέ[9rnʹs+V""L9ɹ.|rUοW9_r-.79&~\|or]οƸ.qC9!?V⇜rSO9)?_rK/95r;.~o9-\?rGA#rW+ vO?9'Ʊr.p;ù7\ o8{Gp8w sox{.q soxy#߅7νppп#o{#|FĹ7"νw䍈so~ވ8FĹ7_pT H8FZߑ7ν]xp 7G{&]xp 7G8Fwፌsod{#7.qso<y߅7 νQprD~@{q w Ĺ7߅7@{FŹ7jK oT{߅7*νA.A8soF oνA8F Fù7ZU o4{m߅7νь߅7:νq^sq8F"ν1 "ν1p1p1pso⸈soL{cޘ8¹7νpso,{c Xr[cyl9-<ǖrGE9#q<ǹ8rWy\9;q<Ǖr/ .y<9'<1\ēxr_yָ/<Ǘp@y9O 6"'rPVEB9O( <' E"9O$<'DrHyb9O\<'r .y9O"I<(\$$rDΓytH*I<'pTΓy29O&ɺ"'drLΓEr9O.<'ߋr\Sy 9O)<r'.RyJ9O))9 <*\r .y3/@\r^@ y9/ 张r^P yA9/(伐Br^H y!9/$弰r^X ya9/,E伈"r^D΋y9/E弨r^t#.yQ9/&XU\br^L΋y1r^\΋yq9/>弸r^.Jy 9/!%#\r^RKy()%弤RipQJKy)9/%ᢔr^ZKwEi9/-弴2r^Fy9/e伌r^>.yY9/+ew\rr^Ny('伜qQ^yy9//ࢂW r^A+LE9 伢W̆r^Q+yE9x弒WJr^.*y%9$r"\Tr^Y+y#,弊W*-qQEΫy9"U弪Wr^UΫyU9*会Wjr^MΫy59&强Wr^]Ϋyu9.5伆אr^Cky 9!5fq\Ԕr^s%;)5_࢖גZeQ-95伖zǎjyL-vT[k_Em9#ur:r^.y9sՑpQWy쨮 E]9+zr^).y=9wՓzqQ_y쨾_r^_DbG AE\4r`3;j >ᢡ7QC9o8 弡7 cGQ\4Frh>.y{h$q!\4CpXy'h,MRࢉ7&pDΛE9o*Mᢩ7퀋rTΛ^ES9ofrLΛuE39o伙7r޼6.ys9o弹-伅hrb1.Zy 9o-弥rR[yK9o%伕VrJ[y+9o-張rZ[yk9o#m伍6rFy9o+m弭rVy[9o'伝vrNy;9o/弽r .y9 C'\trA;y \trQ;yǝ(弓wNuqI;y'9$睾⢳wrY;/Eg9,弋w).rEλy9rUλyW9:]弫wnr- .y79&5\tr]λy>.弻w pC{y9!=BpC{yO9)=㢧rS{E/9%众Z^rK{yo9]強r .y9#}l\>rGy|+}弯pWy?9'ᢟ~rOE9/弿r>@9 |r>P@9(|r>H 9$|Ar>X`9,|r>D·9"C|r>T·P9*C|ar>L·UeG|4\ ar>̰r><.p9> wp1\Ghr>BGr;)#ObQi(9|:ǎFȸ-|tv4ZGoh9-c1r>&.91n\r>>;+cb89W|[Ύg'||iv4^Ǐx9/_bOȀ r>A'L9p |Ŏr>.&D9x|R\LIr>.&$|r"\Lɍq1Y'#,bO)-q1EΧ9"S#bO-r>UΧnT9|Oir>MΧ49&|Or>]Χt9.3|ϐr>Cg 9!3|ϔr>SgL9%|ϒYr>Kg,9-|ϖr>[gl9#s|ϑ9r>G9+s|ϕr>W\9'|ϓyr>O/|ϗkq1_9_ *b/r@|B9_( |/rP"9_|/Er.b9_,|\,rXX"K|/%pDΗR9_*Kb/rTΗb/erLΗm29_&|/r\Ηr9_ 9_!+|XrBWJ9_Y+|r.V*9_%|8\UrJWLX-|WpZ9_#kzb5rFZ9_+k| Z9_+|kurN:9_'|r^z9 |o rA79(|orQ7F9$|oMrI7&9,|orY7f9"[|o-rEηV9*[|orUη69&|omrMηv9.|or]η9!;|rCwN9);|\rSwcG|WY\]rk=;%bݕn9=|Ž#{|,vG9+{󱣽rw.^9}IpOah;}rObG|k\r ;/"“9?`9`9(X΃pqP蠜r~P~EEyR\y\!9?T(\Cr~(p:\r~x. 8,GH\#pqDΏk8"Gc⨜}pqTΏQ9?*☜kcr~LΏ☜r~\Ώ7q9?.r~BO 9?!'r~ROI9?)'Sr~JO)9?%r~ZOi9?-3r~F9?#gr~VY9?+gsr~N99?'r~^y9?/_ r~A/9 _r~Q/E9(_Kr~I/%9$_.r~Y/e9W_+r~e.9"Wj.\\r~Uί;*_kpqMί59&ד⺜_r~]ίu9!7hr~Co 97ߔr~s+.nM9%VM\ܒ[r~Ko-7.nm9-B\ܖr~["#wߑ;pqG]9+w⮜ߕr~Oe=9'߻{r~_}9ߗr 6.9 ~\<rPƸx(?qH#9$?rXc9,?'rDΟ9"O?rTΟS9*O?grLΟ39&?r\Οs9.rB_ 9!/rR_K9)/yyyyWrJ_+9%rZ_k9-7rF9#orV[9+owrN;9'r^{9pA?!胜8rA?`GcK\|r;("ⓜO'9dGsU\|ry;;, .9R}/spEο/;r) G9w#GΝGpȹ)Ǝ0rnܼ`GVm\X9rnDZ#+.yX&v&a]p&arvɹ+:.\rsW/\ܵ.9wɹ;.r  #94ŅG=qs{+ҸʹWνkqsk\'羊ɹo.|rs'\|pUο*_o⫝̸oypMο79&r]οw9.rC9!?rSO9)?_rK/9%r[o9-?rG9#rW_9+rO?9s_8p8ù/}p s_x8ǹ/<}q s_"8E/}ps_D"羈8EĹ/"}qs_$" H8E¹/}p /p /ps_d"8Eƹ/2}.|Qps_e߅/ }Qps_ }.|8s_ }O.|8EŹ/*}Qq:羨8EŹ/羠t~ p ¹/羠 ~  h8Ew዆s_4 1.|qkoGQe# 6Q@By ¨ AqffqpAAA$0(.@"DQ.(((*s}Nݮz7u>[n=o=o=oxE\l=o=o=o=oب{ި{ި{ި{b9x9x9x9x b9x9x9x9xb9x9x9x9x_uŦ94?|o4?|gvŌvŌosY~7;{.6f9,?|'t9?s?ޞg9g#OS3+|g=upaRO~CGW\r|/Y~+rņf+v&Hy~Ve~I寸vWỖ>!ԿbpQoMҿRoaJ@9q(Wg>Q/_{.q#망_wWʥ^r>q'mp^Г~\k{3/\ӨGIgtߊtI.X~7"/"씙қ&Kz tC uY4 5q]_ht,A{?iyjH;Q=3=vULvcH%r Kh- S~|MƁ'GȫX#W';p_|Up}&]g⎸^?3QN|}oѭo!v,@-[>#Cy||ɏs*W;7㑒g;OAr=!'O? o[9?@=z 8&?Z9Dؙ>C|ZBgCOhť|]|gul~@+jzr)?' zOh >b%#"=^wR#_5Mg^pgOU~}8Ʒx@5rv9?^Oxx|[/y/~Xbp" 7Crw>1yv~P=ʃt&rBO~z dg<]?=?9grgy~p{ύs}~[{^O#/ہ\Uڛ!ۛ;K}j%}DKAW{.jr9!y&#x-vw3{z+2s~z`!OSd9&E>ʁ~gF.0Q.p&'>(i'R?Kfrzm3no^H.z3_mrgǃ@z!BOd>_W$sNr=ė[E>;c?+f{vu+o>ET4vA<92zj[HX5xLߺ2qC'iwzw 5ygDϺkr<א#?OD˥g2"@D]Lau~{GD"= Y 鵿R-]ϚDq*G}>f~iDBԿTϘ^9@w}^?'7.vlю/%O+c/X}죝x4|'փay~Y?}c}8v_9Sv@2O(ד-?,㒂k UoEx/A~i?'8(Gkwz*W~ ӣן?uiyc^~W֝t~¾7!Qu4}Ti==j{TÄjlJE>=YM^؍™F\ȟW."XIn=ڥ!=Ӹo]O8>v>鈗v ':jhQtD)O㮫&oُK*u~JV?r}#j{{s_5\)#G?^zZ_p֩Uyoqǐ.[꿙o7sѪuV;}߰]VZ׽<m[=5}N[zg=iM9s~h{&;=SoOEnjK?^AyZ LNZ~/[ڋ`߬V{O0g?{_|jW=W+js,bϓ9M>>[3z}j7 uc}lSFqEZz('\c,G,7[{m9۫vaF5{SG[̾)O#U8]u<91x @ύ:KrG[κ<7Ҋb*T,ک=k_'~>mo9]O@ɮ?^ʥwzxyOT>*>Cy?}>'BUQb?tmEzkiIܚ?XʹOM̦?_3 SҳYlڮbcdng<|ns?b_J.q)aB; T(W/6?H;by%XZzonr+j93o;lܷza}7*w?4}ܗYZz x=~}׭D;Ŗo6s2/ɹ?L9C5_et {9sy߲G?urQCxn@<~xWI}q/$>Ϫ|&6žG]q+dyj,oa|E9]z?Fm;.=qS:~/dlgܑ{[ >=?|}sH?%|>~Cʹi~T^WUbl<$7R,_˾?9|DlO?VgWx7t\y9=j}_Wj}oEr7|w$Cs?[<@Ze;p@?Qk>tKW&]w}{y'S_W$j)k' W9ǙwŞO!gzvr zz:o{_ׯ\eFz_.WqW(rE-IDfˍtZz.׻gOˣ^Wx_f995={fTy8Z:9C|>S//xrvѻρ}j`q;΅ww^>++4v^r;赣؞lk΁Uu/G|xdܹs6L8As]9{A-|T&ָjR;:NFC<$qK:.qp|au<Qk.mH?+Rƣяqj,ǻrǿUkaIh_$F"?9@s[·~<]_ˇv:*]+Ǹr}5>Oڿc8qrfOD .?/9;:q?og$Ӄ㹡|8`]|-tSb "Γ}2$`S+1^7kE;v7toqJQ?b5XO9nS?%D{@$#7)׸NξLïvRڭɩG;:{A( \]l|na-N1td8#%d~B̋u^ܔ^}r%F1c ߣ6Zljit~=ogz:j^69שkѨ}<*or.(>ǑjuM >]9ϓ\k|^8L<Ksu^ZuOqWb1N8?qCwD&W)wNq+x8bG⾣IK;VcP3M9"Yg.:>+w䪏X+Ž/v|ɇQ9}N@|'O<ť\>7u~9Lr[Q"?^xQwEgsty='ڿgm~Uä1A;+_r"Tsho HW9ڗ^*Mb(_?%AWcr s:{ ;z'}nG<ץu.]Wεs<_ػ;_R˗T]Ԯwː[yxn <σ'Dt<Q;?ȹ/VO%玌;Ǡ_cnֹ4ZsS9';_n?]Ϳp%=]ŮWЛ]+Ru.CN?M:#5O&;KGhW\\ڋ\G;SG{#gUR_%f9_7}{u9zo=듸=pΊ|]~g0 ?rdmLqo_V7׆[>P=3?SOWAwD;rct5yM_o .ɁhGfXK/آCT?1?Gu(J_Gޫ#އN,uݚUoZ%^OM?rݵ*glgx\71fQE~}|,L|F'Lm@qT;0nV~T7Ǹzia-w5߸T]?֫TKZ~M gF>^omI1.ucΧGarWy;2~W i3X~s"aJ\΋#F)9]zqqbk y|OQYS??e^~b|~?^0\Wm߅֋;)Y[âGzcT7@kZ8>(A{ :R-q\Bw5Vqu?'r$'+ Kl헍ٵbr@bO= ~<-UkQDbӘ^py"pQqLjsm'c6}[#@yĂ)ǸSSK@5\a(y߈rr=]]G43hq_P@,۵?Rp~l|wa/Ęn*v,pw^׸8-{Z?귶_ a'~ۗv#eXwE~z=Ak;EQK׽㾧c_5M5ݘ}ncGsUGl_|_.[*W;>o4m~ [}\|9-q_Lmii[E~/%?e][2Lr#h~3=6Ǿ/c#oۻu x[a%kܰ«vz/eT}|Uy'ISc~y?h^]~wxb=riݷ[2YN*8vԃ[{ h~1QMK;Wqn+_7%;"Z>"/ bko^y-?it bܟOw= a<bF>]if>L־թkXa?zox`=>'[ޟe\0v11xWn75,o1n/q|% }kEq 9xKƃ Ӳz/cxZSL5د6uG9^㌲KP|75>h𘮩GzqvG\vk*_>Xqecuk=]L?OY?юw=%{<ҏʯwA}rC}QOou?Zv^v] H{R_~bt݊^~ErTʧRz|Sy^zJۀO{n*SƦu`e{&ʚ#k^h~zOAzs\1rҷ=ʯs9}wyΧn*T8hǟSV5h[Q>;}0EdZø[]351Tswy>Ɠ}dz^vd:`1 :BL'=;:̿qTu跶RZouοT}Dޯ'ۥг~)WѾx7N?Yw\#ڵ=>2n^8jMu|ߕk:ᷨ'S߷zkwgskKƥkL-tÿk.7EyׯZO{C}FS?S+V;mV{Gigv zGn~vRz+~lS~=o|k}{|Y?=ʉ~̏Xio~NKT)<:^zj&kQH`mq;ȸoh wy8|~b>0n=UU5x}=Pv5Qƭ[^C}D~Z5~j4MurnmU~ӊ~%wGbTS;T[#uF?{5긢9mי뇦bktJ-q{*Bk~͖־α=eW-=׈Џ:v0+RY9@(v;-?%-ƥ}ƍi<O{= g5N놜v/G\n~z"G-tWWǸP*Z<5n`Z>/ qL{x_]xyǸw5;3HG_N'׋k'kPeBs*簙<':{qBܧ?NW'oG}TWjWk|ڹO1w1.#7PM׊ YKVN4y :[qZd[ɸ(۪} g\T i\ghz~u7ʩק,?jh}u{=HBw#zÍzc<ߩ߷bg W{-/#6x}9P!SzP# ]fk|Z>1;뉮=OK_C\G\qζݾ9hYpYLuy-HG8.Ϋ>N~&'Wt'G'78hO'1sZzPz,ܬߊ(̑zvL~dziv/{9R>_NxN%~' {%# >scKyD륿s>]O~žGU;יG-}!O'Gѐ<7M9xӛ"yg^quߗ:9>x(g^9Oq<ɓ>ʭ|f3˸yNG^v/߿R.^_YIeΈgig <8?8&q -=z~J_Hҳ-K|*_Ԏ#E͛?;7L}ȁOw4N0}=y\rإq@^7^s=:'/ߝs s끉|#3;H7/Aoy[<A%=_{#=[y !|Vg8p/6G6r{UƁ/ˉ(՞Fځar|Q6Utfp r`OO9C!<ݯZV7K'_;e?WRסyz'}?gi|~hO>#ыpi3K_ordp7xвs.XpGO7.4Wқ/ztaoaxٽ|58"ݫfm6<̋rЇs O,9+3Cpo雅xartG9Q.ؽ(B.q("/;e=?Xo9P/8/"58ڏSJ'w85?Oc#ȁ'=rQR' v L?qWoeƇ㵂\Ϙx.d|hr5=9{#B+q?ۼ`LO,>_eLoyJ<%rF=^3o!ӑgz|aSEw!!=ߋ_О<"a9O::S_[y7SjGe}1?|<ۼ,g%}M⼭W>S9o1F+'4eB祁:+r~!qqހ~<\CE߲c=-γh[uG8?ri\qI|̋7i骜e]5opMm͟~9GrE'ƉܗڏD칿IEZQv̿VOʧg5S~?GөJ>.v1u^MZcy(v|\FNF99l/Q{ܾKO\!'yv/~QCtœj\C~}R}Lyuʹ\ u u$۷@ EGN9rK](%rL=qJ׷j~TO-Q q >1߄t"G:"'7{'AH90CRvʹ}Azbߝ'ENk2.p?!1uG->Wb~u23)b=a]e[g_.y E;,/0~k:\73U_OC)9ߨ纷1*/ֱ|W2o:/-b>p'4;l}u~('<nOȗ㼹ՙUIkH:?y]ݍk>A=`yo=<u@Bʺ/ E] ֧P]ONYnuJrw\7z0͈;>zɱަH91au;I>j]ms^h?ɆG]98rkߴ1;1?9h΃m;?`n?^c7oM:Y@<>>hy'vk 7On3?㹳U{傉xoē U3aOuY7t}w3M%ró_q.np ?O q.`'&fC/;}bGoB@}~+<8w=y'm Ͽ{ _G2KOQ_`A\x{W>:||Ï|␓7| /jk>Q&y;e_yϚ8~p8o>o᥃mu矲rK|G'LG޳z̟9ilz WPW|\W_x,_"ë[j򫿰q\4^w'̓k?j7 _>dW5qw|u͆lK8 _{ _lG?=v<͟6'>O7u%K~8Y+筚{nr; t?|q?=~sOO|sݸh2ٛfMt3w?[7\5 q?z]flOOs&~ ~wpi+]`1ӌWjUyw/od;gG?M5;~&X8{fj~}჏Κ~2xқ'_{}ğy>2g=?_?;~m?k}`௻01_oܵvr_6w![M>fQsɵ9vr'=wkfO=n|ZιhOnr&ݰܭ4\էmO|1{kMEstң}ܙ?xqΜMnݏxz~oϹO{c&7zEsw䣓lN=yrm73&8oz䦯=swy }mOtGwÛ\Y{l>~e_ormT+'vxB?zA\-^Փ7噵fV:+[~!~G14v6{Ok3ws4Dov'7=sg'7TMMn9 ™swNs7Tc= cZX/~0=?KL|郿˿lX|GY>-<9E?~3_mt#?|k:s[_Nߣ_C ;9?m7~~]#{c} 0{*@}do>'{S'{VQ /9޻x@~7WwL%w>_|f={3{e?wwypoo.O/~a6b<\ ۿ^/0; 8HOEKMD>?@9}Oĸ1; 䩭1~0eQer30΋{80^8-5=3D1Ρ^yn{?oוRKxrCp \`s WK'6^ Cn3nYL=yf8iX17./HD>ߺ+7Ɨf!'b<9fS#bj27}{o~fGag46l|<^TZX^ v^Ezի;zԳݏ[S=򌸏hohD#=O ڏaB3L@OOd=9fx./XnG~MxrS=>''p\aD_'IhgDў aUnYuBR߱n%q|<8R8ap#M7߀k⻛oc^SWu<u"W,0}Kޫ--sW= 0r. < 1`i6MyGK"<懮zpqoyɯY&_# )G:?ƁY^ /zK-ko-|.)B~fD^t<9?27n]:|n9~iq ʑӖv 2 ޡóos_fC;LnN_|^bo\exCZb2<w즂>?4[Ǻ[w_jj;^GsyI'x+;ܶ[h~9XC)쀸73:ɱJ9TnCX5aY`RNqLg}4:3@hvқ~nG:ɉYäG9"X 3Qo,k:rizr$y]G)z>R׃vz.#loO|5Z|k5 D}CC3ۧgw|86G~a 8r 8~퇺szpE엡ґc ؇Cn98-@?9c>m n_#"O""  ޵GbS4?"  h\N_o yzk}FLk0Q_MUW $7{ ʍ}j(roC9nyq\HVx @=/B^`p\_Jh!?7hr'7u;ۦrr=q4}g[/nr#Rzoѱgc.r+wkqw;&>_<~LYO^ɩBnfgv%gtG=>_;s؛i}urqN OA:p 90:OyULq]v.q!''z?$) 9!b9#ozA9""jsBƳ煸\e|sj{~Z9Y\ȹy^P ApGzno/NNY/3"r/L3fTq-o?\/c\i*AfunIF({Ի[?W|KęG(߹ n_Ǖq>>s ľL9Syz傽zE[ef_+8S r\1?P_EՎoDo~8^r(revjy,g:6N`$8'd=<_rY/㸳oǭWx_Gaϛi]c"=7)cy7/)q 5k9Zz^^gs'\LMn=s]v(񫈅\}K\O{j:y&'˙뻸q*9$fK#gUMS8g1 ^:1ϥ>|^qysgӊsz191mw;*N.e?Xlpr\M娕ߕ_)<:SST=Q<<ߵMmG>R#xv9n+\4ǵW|!S+>o[m@cOHO^ jaP}+.ƭ2qXxC^\w1>n{{#<෹~"Vyºc|Oxv=W~ +Q){4_*EyqƵs+_{O}\?}־ [߱Lg{Uwe{[Ͻs~:T|^bO`Ѿo̧/A1_׹y8G#Qn\I ep덻}svR[}jg4}n:g_S1EL|.rog7^_ڃk:g-޳G^9+~!~ S,sS(w;~@2 `!OŽkv $93{`^ΗXzp"y4nsuuN*yzN>$?<"~ބ+~ۇ2DηZzS{0W< C_wbK~Q~|.'rO%]O:nxE=zsD9N(^K_̇g>OW+ytI嚮^W5}=R/ ?-w8(ơZE{?e>Qq|RIF+b'B.ʿ7u믩}mE;̷h']NX.-x^f'UkW}r*gO>mY'~>1_eyoZ}籹rnX3վ+e9PC7Vq7_-5]grCSOcruu!r^%7gq>X+]k>8uOe]kdyZ[kݺ^V#=/-dzݏ?,9-o\hC9bq=>k0SG?VkҞZcS(΃?_,8?෕?]o{̺>_g]WsO8O-yC8|#~=y68YÞ{rX\@k_".]0=Qc=0*ESO?q$^X r 5^} c~9^~op#q_s\8Cq  +[.?Mv/ʅ\1]!z\? ߈d\8ƓC?s`Y?z5cH*- 8EDHvs΢3#e|Ԭg+V|cW>udXWD{o'+M9q?}R엋}IC~^%{#[^wCJΟp 98}辘_/+[{B~--7Vr>s ]1qHOV:#|n Η1Ν}O?>a`y ;g90gr_ȑoLO8ŰSr Gθ9qw>kv@/-D\#5n=8]<~2qƌlv6& t@Ks:-,\3}a'У>EJG}5q,O|pnDyg/cV9[ҏտp?;xZGZ~.FJ{1z >Kh{}ڱ}7_68^u x@Ļ6Zwn,qeq 71:NƯ.XgzYA:ӯƽƹ:ǿ95哸kl7qq^_8J8s}qn=ƹ8qQی8-󯮴xx8w8"~.#,#"#2Ӽo%7Gqq7q[EKHqo8C^ DQh!M# qaz],gmx2u;sq-.]q} q n ^ x[@D;E@_)q _z# FD#N8_"fPOD艈yCz`@?]7 o#ʝ_}/VtG兼Nr:؃#~('8~}F{ ~!."~'3hl@w5Ç8@Ԯ~4\92իxe`whOTx'?a:yge>qʁ.Ow+GF/)H\qRa_َaQr+8cYRvW{hx =- vv‹3G!Ohg,tD=YE (/숹VѮ#OQۑ'rпQ>"M>tQG/ﻔv?T΢\ߧa)ŹZyK ϸ^/^{'v⻽6.٫\ni<}9ȑ\!Gcn^klq -z u&ՋgP/@>G|s_Cxh/88.Bxb)PKO-=q1P> 9xOeY+)B {&r+mR_  8}r_zc\An#>#h\)'bHr PztOKzMg7p K~p_xhG9 9/G)ҥGK9~=Y5L`^"ə?r~>!>?=繝hj:r"}'1ӎ ~|H?5?k9o-S/S/+۩}.\.vڎg{eؾyvП={~*ϝs3$Ǽ!?%C{~N"?rr"'`y `1!z _oXc^kv $vrpő*2oqυu|MWkTjC8?E=t2o[׊H+r `~@r"q.q/ɁoY,UO8H|- U8~GG?M" y@y#]3"> q%n'q'G2:z4zGABNHtqggPS$!XGt?AdNԸSgz=IZ͚\8s05.&?ȸGSG88Pn")ZQpK 9r90ȋڃXoe9`wh&yD88hqsÈXkK|&)3Uҭs롊XG!&vC@uZhl9 R}?cOzAe]wF3bOP9}_@@\ }'Ю#V~Sr:@dBH9[Qu~y-9a-Xn6AxwlO;ꝫ?VDr''o8xZ>U>K/p~?Փ3 ŸK?R~K4 q4qhqo3t}ꏨ*ϳ |7>YG}8q.JrOA1xɴokq>p+}ἾZk?+s'p_apq'{-`-]+.`uk[;?e׏V9m13cs\8_QJq <)\ rs~)ƁP?!2崃vX^~Mr`}<"쑿_t/GrQ\j G_ %Gr鱟|we@p<ю'?XoS{[@ ? X74(㣧b],Q~W uVEBY oX5|kD 'rgrpAOoЏQnv,zzI\[Izў/_P~ګ=9쀸nY;}HlWюgSOD:#~S9vi|Ԏ =Î\3?oï"+ }̟~5=rԏv]/W7-jhѯW_;i9kz-'B}џaOþՓ~?E9_BW^&sO j~ׁ?O'V%;Ps!g~ \>s{_tkϛrXE~}SbR!mOIU*T'}P~Fw)?zN丏㼖/c=ƳqH9Uq^7ksyZ?Qϧs|lb9uߓ틒}O'U#Q1jb<ߌa|"W?rɩđrsȣ\ip.n^mg.: })MOZ6Z>!a8ZZqnŃ'/k7&7qK׺?Gk߸nk3NC3clٵk&?ոOeTK;sK׊:.z+^zþTkz_mIO*ģ~~pI-]̯7CVk={W#sGu=;~ҺmLWAwKP?VSTQor_O&~ZAH48-}{{Ej}_|j@uFmy )s.+~NϨɹO4վT~TQaG}䰋t@ZoGǧQy{_Mשiôhנvݣr_A}q~ܟ_Ʒr|yOt;rtGupa?ڥj8_-.Cڍ~7h;('dW#T+.עjbaK?\]_!< =[gVqV>=!8VyX/ ]_3.Gկ'ߨ-޳GՏh?ҎCUܗu;_(Gk{bvjr>/|+t|>G۫c*/K'xݵ~ =k\#Z]rV{#?u^W+s^WZ#*;q9[tS֩+x󩸞Vya/cAguz=w ʹuΏWLveLr~(rEPjܡ?)-[t<[]?GeQ^_C,CaRx_*_NGbIa<>0pry'}ݏy\N"rcO}п2KM깣rTGq5u*^Nyq_l9V}X_Ч]W(Ɲʥ)Ʊ#~or?{SqY_.+zoQ 7/~sJ}!}?3ر[yoџs}V++Ԛ.]Oi~[Qki|U\*ot ]qZI=楉=^}XHK@78p#Z:Sp?GuJO17 =h%hnPz97-iTߊkyi뉈PIzN \=d9ꗜXnj/~QTS7 :y?\zR?s{]a "\ʢr7G\}*g9^yE7Ek(h_G8$9"q\jqh11vǟ!g2N(wmv}D"p ʁxE_ERD(H 愃}}3wm h)t#?>爇u=?]'zBhXqmƏ|sa3MD\#xx1lrP?`~{M[5|Ӯ߰]ްBzM:7>ķ7N崉 l7,09 }]::7/ kṙv]~C#TSz )r: O]9ҝCrSKrc3Lt?⴮?d!7i] 4u.r'ػ{3Þ1L%ȁ^3yzAa#sbz~B7!8Kȁ ! @rߵ:.; 8҉W.cI{ӸQ81~U;pmE^`+Ǹ0=I=8;iĸGy\zE>rg ~z7gϳr[[~O|r Dջ<}/zQQ<-59(C'8hh~ÞW9;U9kz=yUw= 0UD:ȁ ;;o1C9nO UDyb^vVy#qz@r)B|i|1=RN=twWr+gY-_+>ȵj/}`y(Mo2d鈐+|_r {_m?lw"k{zs{"9bz!7}z~ У"s9__/~<CKH;!{]W=9P{Ir=\.r>r'=ƛzc=!e@r#_'V@d=yQdDtV/~Q>u7M|kMnG9Ӂc=DHO94HV} @f=;@<Cp|f+WKhz?rcӟɇحw%{3G>vɡW|ȱn!Z7X鄻cxž`gz7#b : g^N9ȱωzKX>͏]=9׻qzddvXmx>'@ȝ9s9pگ__~{Yui=#;QC>p̻Î,t_9>Q}LUGL#{j Ÿ,z0.nW8K8nX=vM>n('9BzӧqajS%|.t</ ^p\{/3^Wǚv!cay'R_\_CZQ;\rV.7~[vB;E=N~߹_ȿ}岟EqD>}\2Ʈ7>\2㑚?U{Z.M?ʮ7VUõquM,kh]!wnH;(~oi;]1OK"繀|eSA/]Yy2<'"?MƓJzu=r}8늙Ѯ;/"W9=Gd?>xeT|+z`azhulwaeܸ a>W"q6qr?X; #r<⽣r\Kb!az)oƝC>|>^U}BN>1 e"{Hhw־m+>~$m_"OhA}Ky_r'.brqvܧM_8-oS 4> W0˝ BFwD}o9'N%'z'=ؿ';r˾b}~]\L|egG֊|tsDKz =~''^ =z ty۷;rH7?~([OLs]UɡkwZ^ў&V@zI|j }s5U$' O<$7$?I;]<$/17!/U_xƞ~h|v> fX1`g#ӹc.>_>e3v?¹86 zg LL?mE8G|=+yg<ோHrwq"&}UPkz2_{,8E\ 1Ɨp(3D,?[~f֛w}gd:{QIgy=WlT~Y-w?{q GbJzR8&=9qK%E'IpEt*ԏƋ~Dž~ws3=0.ȋ|4Ƶ钾寖|j;l'sc<]==gq?/ԻluՎak]_~v+ 9,uGk:իrc9W4*[Q>+=:0~g,v@ȁy+?9yOϧXO]WiaQ>vsGN;շ)t.XX`Vc~1}4ZjDOHy그a>E\:1>ׇ%O/>c{ύƷsPgI9rCh_|*]7]ԳbxZ?1.gي~rDy-?;ʋp"?Eׯ<^߈zYC؎3/<:?79*yDēq*嬥gy.oD_ҸOq\c|S?a5xewDe\v~|<Ѫq>@UߌydGO  H{U߽O}B9y|>_~3>'`F:S2NW~[=]Da]cGZOY6}> _|A䴃O7\7(Pʳ=) uf[|Ndv2_G"Kܻ3~v*Wϑry GC9Pӫ?{ Z/_Q##yy*_cQUo'_g\;/rGR3\_agҮ_|juz/;\*5=ӳzGߔxN߫D}B@)/=szrc9T/O7VEh;>:'_UbCe=ڻ,WpSrE9ʓ~~d?Oik`īq#@ rc\?x3d^Yr^6Nqw5./1/{PZ^;'ǹ89m ľ2|=񯎋5N~w~z+ |@EČ7L}O|RGL9qWMU-xԫ=}r 9oz" G=8D' rtˑrw@{=&hz41c{rbOF|ʎ'24~ݞf8!8gD\_St@AN_iWp咞r^K9A=Eg\/róo,YQ^毨+0C&ga"qWCV\dGL k<Y !3q{{ec {ߘ5-{H3]-1㘞cÝuD~- s8o\;f\d?NrWtlrCqX#=x9.293N˨Ȍ) -YQ!r^QY? xL{vGN6ӎO~"?Ǹ&Oz?!Ǹ~%>49qoOhq%H-Z] ć=Q/ua{G(G=~g*b {CMrVt@gL/qU'#i\Mٟ0f>rWʫK.'"W. Bxn@%n[#;v!Nܐ#O@CnCdozAʣ%B!5{<%xIt7 7{[N"pc:pwn(&gr9ϧ#,J(7{b/xnG>8@j%)E?zډ|\x]ZjqaqnĹYS>g-k]Ri`G}RK\3?L3fr9YY˜<<ynLO9gSŹx<.5]qnW'"|ϧ{ԏcUaC!391Nzp?Q?A>`9iWvu98ӋK\u$^Co.!ʃqpYq?.rMn>z h_t;@8vwθaoΣܾ_(:^[< l< aD~~O]|霋ޮ=T=yT?ֻaNz?rn+!v=k@ov}?.op? [9?QSCȉLoϧ 䪧ԫqvg,,;Gq'_'|ƫ:C9MCs~B79QΫ< 9u:y+̇|F#<U881=Y~ ޛ"W*:0 {DG qq~DI|^̛yΫDkRz }s>V^/bPWuM}]UB׮'oI>lE<^G\\g 1|]q1Vڟr uΐhQc8_T?+(|[L毀( .Hyvwq"ߥ'I9xaNWmlDwwvk_O~4=8uNCQ.9ݮ7yo sG:(ra޹^Gy>8윯}p/8с[}w۾q[Zs'jx#S\vx>/ƭ|)]QNO^ovwG]짇rz?Ec:;/_ǹzI9iߟU;9?-?#t4>øC?^._!G޻Z=0A,_/;uX^m_f)3yQAr͎H?"˙NI;^_|^??9W1J/c9r;ʁk85%Wzrj7sh$څvOʙQ#BODzю/(rEr"ӁhdoLg>piGy;7!П;'qVy#Xs|ɧב ? S^⾘^ׯ~jT@W/1G.͞rWSqzASƿ8D\ r^9hˈuIL.aqџqxqtrK'л\žv1=aQd̞q}qU|G(^jra> 98ɪԳ\^⽲E:S'qj 5,P7d<#cyyqusMθ=wץ_ G9.x&x!0{c\bSG6@-38BUyn۴Sni;vv幌9-Gw_s=IO۳?!W/t~^N1~Ɵ2.=0>xSȇ8TN9Ƹ.glϸS1n|?/hv߾-ևXywvÎDyIyᇈs* qʣ>ʣ=Jʁ-Ƴ?"x5 8\95Ӎ3=ʧ#1Mg{y^2`ze|0z='a׭Оy45^901ЯSl.Q_,]O:c>i \]/Q1[+Gd>̷^㥱q'1Z {M;)rIyŃ z~UNiW;GJ} tNQ/GELG;<,_kqye3G=׬w{q<ķrVy{.Ƴqzq篍-O޷]z9s1],+xW?lgv@y~sy%WUyvy#9V=ߪxَu7sXgJL^l֑=]W z|Ÿl|_$qOqP%^1.qF>|9s.2滤=_;*M9{2ΰ{0~&wfoO[߹ȇ;r_;<ƷflnOr"+B9pK us^K汊y8+e^u^^_]O+̇<`i'K rV.{XcJ^dSq=lʡ~8W_Ў?j?K~s3]p\׿G\'"r(7>gu~#}.DWᾛ>ʹEF{0+nj\.kzO v~&g;ct?Qy?C猻}v-bøH H@Q#2~k_}/v#y.:2ȵ(/'P.q[-;B,.w+9{p~{wrgq"ރ~Wy (Gz ՞z'glAy y}?ϟp>XZ9FFyq(ˇTd?O>_SivD`< Ӹ'czx(׸^<'kx<v}͟ʙסכaWMrEcCCʛ%^i/T%_+?Cz<>L_O*g L.tD?/Uruux#q@iW_xƞX=a-_9^,-c}x? <]#zgzH9/8c?E?_\뇺t\8ʹ%8Y@=.oEu@ox_u2^W^dS#N!qQEo[r-3G5W?';Mxoc=Mv,_&v/9x䂥0:z !}~xioUސw=X?׮/\GWص+#ʯb;/j·ϝ=t|C_(gyt_Og5N%1?ӟ^9O+k}1q3I1uCǡѾ1ǁJhWˣ?UX܏KѮ^F#SWEQ>,u>Z֎>1\ߴm}G۪wwR=M^SG5(Y|/jQQ^R{}?i}V~w\|j= y#}Sد;Z^ٟ[Wv^a}yߧw;}q@>|N0nKT7\h{_[fv E9(L;K `4s_S UgPiȹCy\u,kQ_":V/2/hy&tge'y G|P㥝ʉ78ϐPZM?CiGTڹ\o] {O\-cRL.7ٞo-E>_/Glh/j3Xp}/?߰T=5oGci9&=L˩FPy/}vDB!˹+j]NΣHWӓg~\]G>/8?O>byU~k;~sk#ϗlϟk>'yfÍn5;(OrE7}WUN{]qs3s5|+5y8/ze#s}\wz^wwoڃP.Ӈm#n>[wn_ʑ~ =8|7n'&;>𚞈DH ]Cs~z`!/?;9O0 %7Y?=r>i߹^xC'~n\ 9юBrpk%j7oHzC2oa↚/+g|я^7e|:{^ǚYu@Qюz;z"ˣtZN3 zXnarԮKkkv^O>k9"z݇xs乳~!{)dGHazrs;ߢ]O9UC?X,[>Q|{@Qtxj:y_n]^q :^thV P/G':>!sqTsaK:!!/]K)]қGUv+o5͑v]ƿ9$Տ 3z"X:7cyLr_.S:C=ut~*Raҿ⯨dW.K>A;f@+.q~q˽>>YZ9ɸ7+@ȁUN;x е.q-\h'~堽`}%/O;֋\W<wQD}S?~^GG='0\ӱ]xg^#ɭ)J9wϐ[-OyٷWz+GCt*gP/O !txOG;7w)_ WrzF]Yb,kE}~]tbq\ W>n~뭺Nlㅰ^v~b[|WQ.YVGTA~=4}1}kzz> NTOas\W߰ݯg倫z}~eE$p;OOaSBO"K>C9DwD@3e^_5%S|?ayOC:7rZjxt^5?l!F-D./Q}y|~@=~|p>'==ٮ|+jOTg>)<==y>Qϒe?yz/2y>P_O*[ˡ2Oˇ5X4*7/ډ/E3}]v:o8|>X>OD-m|r?ys\C+~|^ꁾ^}U>sRC{O{_?]{0^wz{HzVc\[ u󯾮p@_z>B5ٙ=9~R?BNM~Eǃ?ZqY1n9_u9;Z?wҨ;8|ǖ~(z>{u~YU#et"yC5/'#z=!봾R<9&.q=Y\wd:N\u!z6yG\ ; Oyizn/5tʛAt/SGգk3s_NU ݹУ劐sߞ{!.g\"X'-k(~?;ڻTK?kzM|G%S_? 3ڱP,WWGġ?ڞc{d<}G^e=$>Et\~ s> |~P`\t:C~8@޿{8*;~E|s~w?8RO7I>~?-|OO*rv}y1e97>-s J04Ay8uA9^os% >|9^=eystz9sX;N5Jl+k{^{˪sQ}Txzl5}~SvDy&saʑeAzA_;shx.yNZ<ρsupN`>Pi/u>@%s7t hO85pAvJ}~nO$c~u`x?(~(G9&gv9Z|׸j9s姜18ًO?up̎~M~cέ7}sp_s~'~b98r2|Ͼ`iN9҉uc·xv N;쮉 l/=ӟ6jp {傉'ߺ̯d;M<o.e7_KN9tbGo,]+<&^7 {pLzG/Ynx?Ng`v| M~UK ?yyϚ8Ƿ.\z?~޼Sv{V &~K_;k}hpf7^q93^u‰ /exaK'޿kg.nx.&y`pW^y_>dĹu]nmfM͟Gxo~+&1_l}u#&. Vcǎgfoe͇gfW6-O|jˍ8soE錛 W[ec;.[6]΅4w={wN3'.Ye|b^dⳏ=m_wxrݱpW9EK oz˾̝?qՙ ~qW~]oX:k2]M|u;6kb_݋ د {ar|w>x`p?ΚuU2GokǷf-4x_Oυc'~/ Uy1}yG?u&Xun[<dr^L-&~Z597>v=s~hǞwil5֝;'7븹}uxiri!io|܍=IMnrsg'7=s7;3wW?49no'7ﲹ[;cru!&G}K6[~ܭ-pˋ+Ons}Z[~{}IN>~fƷ8Oxُl'|YO{Mnxz۞O{c&3sN=yI?o.7=ir}mO?屓3׹W_~e?n鏝S&gKeg~O|&͝\3{s|og,=67Dq}E'G n4˾b<=G|ouyqE^:99c>gO\NMn]oyp̉;_6fN? '~_@4wpә&7 |0'~N|_~o8c-F8ޯէ\o]& S_g[&&޳u}u=6)W8G;f#Of醐7۸"}]{8{;6q-5y1N{\`Mq8umgq Ə7t=gbbo{a9?@8M?`*8 v_{tC`wde^%6BqW֍rz_b_^~|V'xVuw 1n4LH1xL"_|4ë O-26O9z_.0ƳƯѡƯ5Vuن˯Y~g׳4^6t0Ͼ3>yn ?r4^r~{wͧҧgdSwIO2 {ů\﨏r֜k779 /z|_UK;nȾ. [:w#;]Ӻ~!u{wWo?]nrNjt}ݗww48WY-4LߩЧW=t{ZˌU'q?;bWGٿR8vǼW Oﴵ wOՕϼv<.7$'ΞWE/ X|gI=%7|gmzr OĦxu>ߟcy?c_BwAs%'Bzy3|ӯN!7;{27)ǼPFKolY?g>f}:AG_%[;\Xzã.) m> H^s1xĩb^\o퐞O#`=4}Fs' /1-73G7ՇS}88C_3A&t ;C֏nhDө]GG o~ 8{޹ {?ޏ?F? D? D?/gytDg?Co;P^<︮^uq\ׅzb=>X; -OgWq1oϸ툧+m3y-93Ƹ,rj`\橉&Ϝqn+-Bϸ3q"15K#,鉔c]k<1vA+`qy\G-cN_YU={rܾ\u]\חbݖݾF\aY/5ٍz5n/qrٟe^<-#u0G9q_̷ {K\#G{t-^\Y~KO;S]bʹt^] uΩPQϴumIerN@rߧrSV2K_z^O +=?|Zvc!y9kzg-l==O/{{>-+Oj'o{_7 _P`G\q_PqUaH8BƷq\ƻ#XwߛW>=8w}oۗ嵸Dn?wp3zq]ioͮz-W,_by}!i_.ԏ1~w\{ԟQyǓp"qb3p~뼟Zg^|g?kߝJ;[KߩRuTQO)+%nq]9p_颟?[>vR>?)~],^7ى{Mpl"ϳjϱ K kOg|9SkN۫s؞Zϟ%yy~E)yؿsQ?:<ΊiqyE?y+27OU:]浊yʼK<כ_v_sZz=?Ay s@  9V(_܉xUR9W/?9\1]rSlʼnR;qZqb\uO^=s+~)r|^(7G}vy|y~ľ_>ko+qs}Tv}ަs>Zq5xNR߭sxZ(Qc?:U=gT Wb=jT?y?c*qM;Ǹ8;R[9[q)b91T5C{ny,?|,lh< =Q^z\zv?_/M9HQzhR^C롸[\W#J/~pƦ#_] H\~Fk=޵OYc:^r8GJ8Gr?|Ƹyf\1G+my-˰=qT[~{Mu~B{[OnMW>!oqig6m76}}2U>n|>"NA=5{5Q+;Ob{g'+{{q|nBPxFA8!GWLr<@ʑvsìǹDG|լ{;EaG9bC/syMv]]!G=^əvԿz~9`]>cOj}NisDR.h:(BRq|"8DfQnG8EU{p8p> !)<C{BGsNp sX!=  Eqn 8OxBaC>8s^pΊ"q>[_g"s17,rɁ8wù2Ѓq+# =B*wpCz9װS=ߟcmOsf\ 8G99?7GjjDex|冷or$9;8'qniH}7|h[1.ɩW{ؙ,@O{DqO/zY~yzvZ<\ Ͻʋ윱F+Xv;<;>Mmg瑽e?IcxcVdۊ88v糞;m`F/k`x,;/#u^t;£Wڹose/kpq7ye{׳t/oO;w3w"V9J;?:_jxم|o24~͢_;Bs`q.0! ?p䇸X-wyrŸa1.zv݈ǀF {;gV_i+ 5WA?Ev> 7z}K\?ν+q>,ΟMΛ8ls_Ѯp+縢a/-38mq*8]_zS;4U~q?O:\k8O O%9z٫<>ρaz.|91L9 j:S+[9s쉦Q/|y9=g(P_NuKtڡox]O5/M.D^3"9v^03. W5sPpO奼c~R>>g,tNhOc֓ܟF{G?sRy*CvZ8Fr0N]&:~mv,_|Whov-,f=ωuc^/+׉#Bmp ޓ9<=p?-rD>#]Bo9x竃uÝ5;2L_:wzit Pzavzٽu</aKkVw51>68l|͊'L#8In<KC1nD1'aq&Wb9rW]aXhW {Vq?/+g0q 䈋fxGӸd?刧c '6Zm"~ a4_(8ڌ'4zڂwv.qǖI~J?;rĉS,  "ғ;9S-㻌z|&9Gwr"Q'r\8{o{= wo;/'wɓ^oH;h_.0U{^_hvhiQʑ鈴G=xBr B@M."?@\7@hs-?{sE]Co旘whv?_=p)GE B:@pYo!/"?EC=GC4׺y !eQpeG ܐ\逰G|!ȁhם?ֵ)LwC;vYz':qP?R.8\=dDDȼ+_ʁzpɡ=;p"3ςd:`՞U_S1Nr3ZG^߲ s`,*1 Y?<7D9OLDKƳ_GzG90 ?‹$}{\ 9~~>"'8ZD`Naa/q'/#ƕ>W;IEK1^==ġ'brWVbq99/ nϮ$rݖM|'d%FyRwP8ӻD|'H]Y]J}G\up 9.ڍ^e{|K]nGtkr ÉHz{hvHyoQk7Gln n tϑ#k 2v}_/Oʫa~oޡg=#{/i^yQ~sL>r\櫀R]+"&~/<81F4dv EN<"3]?@O[ra!b|PD9)?rC'.!ǼhryUuȗ9rrҿCz ?`xBCN~'4yBK䘇?y/s_SOVn*<880Y.p̣]9=v1?üڹ,7yⴧ.Wc݀B~[>AvGw%D#fW?|5㌮,?{F<`]pAw?yzP~ ֹn;*"v@eWEY,,Ka),K4XJbjRѨXFY`lXX&6y~Ù]-?3g#v啟L<WN{Y>G o_irqگv~cx3?ԋ'~Yjyt=y^/;=?. 2иK6@ Ÿq~BϋNϗyNx.x> Gv'-[N_^S89-I^z5OH^uˆ?$}c{V&rc&oao _ogK+Oo:7y)ǮH޾M}NqGL62y>[nM>P6/uv_1'3|\"hDN)[%Z2ق 7@ۚ~ږ۟.qs_\7Wou%{%NQ/0ȥNߒzwB큝>mط.,OY;b~2c?Z1*y[~CLJg,Nij*Ϸ*|Efqσi[p}7?_npgS*8p>PS_=/ok6X] OjcЏmal}+E?Qq '~6L8sJߴ}_?&{ 74|?{`}`WtD%q>{Zv2U|{~TѝhjWueEa{O~υgwu !A/q=g@\~Hh 〸^?q\>o~_Rl^~Az& !;!oE~7>zv>Ya!s*4B*D_h*vs|~ile4ZˠܗHQs"<9^6P?BeqGfisvh7 (XISv)bb'_!;y+R//S[Q?Z4vv[xS+_M19^F_]C>vM5+^~YvqqYNjV~b\D/QK#- \VrIzYNrdmc'%N=G.pЮ׃^o&:DZs|\S;Zh¦ίq$:Za "A/btڔc qŹqQ}Si"8Ď 0.[>Ю\FԎWmyNr_QyR0Iee1vԋx=&)Qb\)<^yCyZ/_~cl>UOl{HӆR>1Zkv{ӎpO;zyXTt^zٮ1NOƏqẓ개j/?S>zNK{8vO#҈|*y߷?eKG4 r:ۇ ʓR>gR-'?^\_3QZwW?Bc֔vh=vKx!v~u ;ny|q^|*?w|#PG!H9EY@\Opv,ha9P|' Ǟ->󸷜u͸ ^/sZ;3/Fvju\z޿nx>Dg9ή0fgݏ/#Y^ώ*Ⱥ}Y}}J]3λ]/,r.v^,h!KFHa_?SC\JݿyBA".ΐvaa7!8ȎFY">]˸f~dEIg1*a9i<cyFcZAc>WRK?\ 8CK\i=,b[<wWD}-C-vM=U&y0o_;a!޵Wqo%45B]I)]nh;8Z_H=}GFr .Ҏ(yV~OZR;jeGge1=``Wv6rIUzgBāǼ$`{8~veWz~jAOXbP+vcpA1xGA:|ӁN-G>"˫kzD1!q~EH b99&/y3|Qe=Oo}ӮzO]`v=FyANm>{s~|v.ڝ?jG=,qg=#,ݢPc?T;-Yܹ\kYPޟ >>{y1:*zUoqFyٿڿw=&Gy\\>^Oszgc]b^B떗?]fCY/:돳g]w8]kZ!y?vw{t8.q?eq8Oǥ/Nq&/@/ ~hqN?upgT:WAԼ ϫQwٳܗh}hhXB^u7:weYX:/n|"e7~hw1zؖ.>qa;YO\;t>a?]re1}")qC/IH~ CU: B{!_쇕;;<~~(wdu#Kš\qCǑỸa;\tD3;(/488q~מ(:Z.ҋSQ93ZF vyvgcuH#YnׄߐI3omӾLxvǴՃvֻ%ㄬvy>|ʩqws)-gqk2O]SۙwB;⴫ Inķӌntؾ0^狫'ʳzŭЮۧN*^_>|O_U=>v Ev-ܮqCA~}Q_ϑhyagKchxaη.4SG8s}˩x/Fp~F{q^r: B:{qy}M^]bT~$̋#i Ze}DmzHs?4SD]N_a?!q9{8@܏3OH>SD;?x υ |?KUv8{4]yc}8ǁnQ>dl}(=[]{Oa%ʛ=O߸7ˮO2{\oPߟzU7U/r&3>9\Fyy:dzv4Zqg9O_zb|j^6= 4xo[ʜrC/Ikh:|ރ6u~<|Zv% /\v6d~!s=r(^Q?Y|lk~ O]v{ԪT K Zf˥_?"&ѓ?"%);8:>)D_%ѿ1N8 wOg5~o8$ƿ?;_/K:EvxBMa41I`|P`|ſfՆV# ƃb<|X}ì]Yq߭ߵZ9a;uެ4sb?zww5ixcq\8%.9H{:'H?˄Σ/n<8wǽ`ǻp< ǵ#؍_4q DSц/K8G<q&aiq9_H\DGxs;48/ݾɿ@]iAh> q{4vAܿQK=]y7i\^0>7ĸWij;?ۏv"/(b@Ï@РӆԨś8r^yQya<P+u>ԣ:P#SrԌ< Qqx baXGa7.I'.4qRqyX.|\}_~aa=+ϡ7Va~]/;lW-#;h}hGؙ~ ,ܸ=; <:x# Λ]wUC};/)1Wy<2UGoG]O }yrcI}}d^lPVqz/v ްOWq..Zu2n5.\8Y{Wo?o<۩G^4=5q qq~W>}n׮=4>v1.i}<[hxN? ;?R!j;`qx~d,23.$;A/jZѲxCu<VaVMaz!h>R#Z?BI<=_E>GyWk}z s)3kg}] m˺Q}}Qwj RKgj0WOTǹ q!d8N:uјPpc84ojǝFx?O Σ1x ۈ?Qƍ]3yvΏ[U,/A B2>?bW.. ˯s9_/͚79oByt?ƅ#vRyH58߳[NSdW+j>ߋEvb a_gGz$qq~/Gb@\`?Ih\%5t&{yK~XԺV\Wt0/?~nI~aBZ~_]\?~QBݮ_.~n<aQ#ULw_Vͥ|g㤃~1q_ŵJӟ㫳^?\u=<;a {^켴 ]0>|=ٳqˡ]ay9wͬuv_j<k}\{q/_W~>}I>prC7omWkFzޯ8/9^%k|I<~u8n|`hw0~u8ϣ\>b>j=@uP">|1<A^{P=ρ^oz>Rk]dj|CngG=1nd_7XO1<q y1xͰq#r=?~΃yB_3<=1x%WD[?*쏱T<,xެObMWog}\Єh>s/kǝw<E~Bcow4. qMWz?sͳɢŌ_G>]:FG:'yxjF?O&6x5?N'Fyf731*yzbYŅE4c87'zCbM|:Y8_7 c9|x:ZODnqlP; #΋5/Fnmˣ[~|P]O$./|Oni~կ#_elpYngKq%o~ o/]o}߬b}Ϋsfa% ޿0o#֓igƖS? \82rXʇwU^mw1ngC8o6<p>3O +κO 4qKu;=Z/=;sw;#{xa1)g8ݯ !7Sioq ~߁8G=&$OA^4|Ϭ{omȐR,우]AVa84sF9U'J9wMZb A9=yB=_Ok|~#~5?j~ 闀<'"!2Ičۡ ]O? uEdE3)J?zY~-q!z,zq$%Pc\s~GƑ|/tb9.qsGƿs:sܼ?ʻql.xhƸy~m7@9qqZ;y|z~1Vg1~W< w=$@GV?οͻ,8qD<+j>#"| z~=O S!YNLJyMB2_I4 ;, u/w=ҾΏ"S]S_fg,rX?9 d7=~Ie߼G? :}#_ay}sԧvhCu%({ܴ\{NlRڱx{ay -U6/~]݄מU>Tk!ZY>eS+uV.u(~}9B,"~Hxׄƽ7VT›Ͷ|㟎<y݄K(|;OKVHҏl7߻P%yҷLfȢKN|euOږҟQƕO_|%T? ~[_IzӶ&uګ~Y_|鯾8V˓=hɣt}rKo߾T($GeOmccp&y7gZ^7vH~FCN~S!}A&{yjǾ}:Ge_Kiqcqۯ2{7ۜ白["ljI2M_lڧp>R۵./2>qYj 3ݺ u{dcIcŒT06l3Sw&st,թNK3VTQDeS:f4Nu~}u kR3:]vX\Wm.7{mygwHV \ZԚԩ{iXq3n.M_)s|M',Kwuogo(}ͩcdNڧe^ ze:\71gGquŽT'[urӅ;?9Ց~W$WN>Hn;0VcF鋊SF6d-vi^i9yP]U34ֺ[Q5b?xalS?.֦_qrթlVub/HJ^2b{j'eJ._#Ew_+Ǒ-DNʏ:3byv׾ ,F6{fyjK :$_9ɜ>辽;o]3lO]~Jʅ~!~[ZNt&ѥ?IULetO?}Hfo v_jH wLLM!3KMkif53YN)NMz]fȠRK>Ʃ R~T/cr4v3m~6A;w4vO!v,y>r345D f8O8m/Z-UZroK"f󇌴,/ohطbԂ:/yY4IGPW1Q4 gq"9Ï3GnؑVw6s9񈅖muAٝ&'l'P@:#vO%3b:Kcq0\p_v 1ϝ}K E_-{~㍭f:m#]WjyE?ߣuMV1;q= װ;>s(\q_ MP]!uXU6Z.㸼,/ g۫E;>Q[ ݫCm4SwKcOx~8zkrq nlBifn49ѬOQilv.jNs? o%_N;{Ֆ>}܅WyBBG9Dbk7'!G~{O<g%αiGA/m!~hᲇx~M*;#-׊{< {}.}߄Fz)BseshmrЈyBh<7x:a& Py{;ҧ6vq ʕ< O,'d[Z>Wl9[\L^xeivt]o,o[T^f9n-vk7>_K9sbm/] qY`Ʈu EV+/qW93>Ä#NxOxO|+ohɫW4zx4H?veMnxhķj%Rݑ 6D|ۏE}Xvk7Z&Yn(q.<&c2m߈2mAH;4\ŋ6v]rrV<=[m9gWJbx} r˟,V>p ?_thaEaՆ$Sfam8ӈwze޸2SЪy][V-u $!ɳxgo6駖tįj~Nҿ-Xn [T*qn_∸V?.юVz/%7[M; #.|lsobuCnQj|;= sha,Gzugvs#uE-~lN4wH?5;NdyI+~ƒdg%Yް crF{{].|fNoa9p}d\_U֎?ZR._Q7%Dojv { >P7^m[fi!uR7f8ˇX^Ri3ZFk+|q8}Ecx{|Fӎv`Kg8hCq"c}xKci41A 㟠1酏qъx}_q* ƭnU #MC8qh0qF+hWWӴ_C{c;#$֧hGgoo=VC0.",.Z",zy~c~|Cqﴲ q ljhE㸣F 4t<_Kxszy3K~~G'qQ8Q8 g-~C䡝Ch9G,4x+YNhc݋j/wfدK!5qAhsm(1ʻN8K,  kݻ~era;f'̋2&Cuy/<:/<aS3nUgE< mxM;+I&NxNvUymb7D>~SkJ|9RB\iE=gx@?kH5owry'y鏩'6_z.qz-kR` q@+g7D;e1 Ҿh{;!,G]98zYqqή]q8BXeǭ;78?xԮ\ӊ]?av\/Azq]~#žKد\u4OOh8~Da/Yc<4N湋DW_8,;B-qJ[Xayܧ/Ͼ{\w}&qj9R(~s,: 5tܗ.\d8{_xZ EG~4✽Ⱦ1_5H3Qhbu¾X g=|k"o09ǃbolȧl4@ iuS=S{yEI}/l(k6E‹[Sh+O`=}{EQ~Ah,WZ2߻P Cc?51 ޷8a/KHƮ?/#.:-3ㄅRqȃ8 󴡔ym/Ch;5zҾ+2|<•}1o/,n-sQ⡱Ny+oyAcb!jAO͸kv੅Ck+~ߕO9OoQdhg8Ѧ>I7?.Ǩ^ 5v:x(gxٟ%eTH.{3~u~f>XҮ*. 7Ϡa*NoPYM]5iʩsz85(U?kjs&SӧکSsN=oD"Q(37cDa:'zN:jnb昱+pNB 5eleUbx3+g$Q5mv:h_'dkAe9uL 3iSTR9d7mԙm(i_ߪi*ޯπrn;nYSj(c`eͶf1mI3cƮcM׻GY))¾3cIf?WU9f&ʟ?f.> 5L>~fL3r\՘?l% V6t>&߈M6[qiU6>>ߧl߶fGگoA6_;JX4{`شc 33|e:P$7rRv'O3di<>gc'+߀1c+''O?7+>_]7|ꤙ3vλJg-{|d-o眩k} ״ՕU33f9kFbg$fNKLfdZT93'-]9g̔IS+7sF<'%9frbʘ8rƸI`k7iiSO6;|b3?e:uq'MQy>b9[#Njc7l]:g[]fܘɓVS?._ʪƘg97SG1qٕM3ug5]eϯ?*_gOvB3mP)jB̹|k0a|;ƷM;μɯ_u?}qDi@ sunpy-0.8.3/sunpy/data/test/gzip_test.fit.gz0000644000175000001440000000042613203275053020265 0ustar nabil00000000000000Tgzip_test.fits1O@qPDacPKCӖwZ=0k yɛ'>shD|ѷV+mRM3{R҄D/E`~1rKL%۟Ⱦb2s{jE긼#JsꚌ=|{n໋i}0qqǝ %W̓{ p{p>[ #5p&-p_} pvU%Y-sunpy-0.8.3/sunpy/data/test/gzip_test.fits.gz0000644000175000001440000000042613203275053020450 0ustar nabil00000000000000Tgzip_test.fits1O@qPDacPKCӖwZ=0k yɛ'>shD|ѷV+mRM3{R҄D/E`~1rKL%۟Ⱦb2s{jE긼#JsꚌ=|{n໋i}0qqǝ %W̓{ p{p>[ #5p&-p_} pvU%Y-sunpy-0.8.3/sunpy/data/test/gzip_test.fts.gz0000644000175000001440000000042613203275053020277 0ustar nabil00000000000000Tgzip_test.fits1O@qPDacPKCӖwZ=0k yɛ'>shD|ѷV+mRM3{R҄D/E`~1rKL%۟Ⱦb2s{jE긼#JsꚌ=|{n໋i}0qqǝ %W̓{ p{p>[ #5p&-p_} pvU%Y-sunpy-0.8.3/sunpy/data/test/heliographic_phase_map.fits.gz0000644000175000017500000034455113231613137024137 0ustar nabilnabil00000000000000"Xheliographic_phase_map.fitsyTSA'A#"! sRCC(aP #8(8(N~Np*b[DűrCw]~+ wwy{Hx@PhaL383cJy D3)RET4"BsqzRRHSLjF_"Xi2%A9A.S$$*R\ϥY= ѡ6az'qxUʒd1$]RRXT.cԿ*\$0|]8jYR&ǧuza@x\'{usk^@OTהo"F4 JD(K~HEIĚr\ܝ8MFs8^Wt(G!a~s8r#\ܼ\^\N *i мe|B' s88n-q>\-ԓqs<<77~‚e|jA'׍qlIsoAq`@hO5n-b(0 bhSq9'T5g+ v>5zz^.]txnk֟=[ai/~}pG/HŒ?q9W~^$,< $ߏ!HIS|?)Uh" ߝ˜ ]]<<9<."8j[/?G e"eʦS3 2u*a1.. KS(>%()Jާ_HP$8OHa/)#OIMP_xojjxeI32̋OMMrv8ƩWbd1i:xXZ"F̨̄)B3TYJzN+Lkzxi 3Z&SM#~GPq2x$6ݢT$eb"ڄĄ&HL*ꋥ83_Ill7WhiAƤ:J_Oйemn觶_Ӄ3h-9(G3/؀/';_p:!0au)#7ELH} 0!-&uZmNc2m Y8*ܩwc@d.~H/#BiWbmO/׌Gk?p>\ &oӡulx/ΧqԊF|N##'L$%l8Ig)5&vr[o,,,Ci:Z\ɤ=t(363R|/UH ){cnУOQ}̐^Qw56.ς-[m^Ayӟ4Ӝ<<}&a9$0b&#c4dͿ99oXW5كEX?iX[xAAa1.D^r/䬾6>RD nJ [ 7x෷muB@Z͛i}:ji*< lhiPV,J۹L11+)z^HqwSѬ_OQ#;Z~҈ S|iVfQq޳N-,Ԭ{gjCeaǃQX1gQѫvg9U~FDt񥇙iG,@;pPo_,b(X#F0HŹ蹤 0^`,NaL/PV/MQW B䏁:NĸC 0! ]1{ g>٪4l7*>-4G!/HۓΦX N6`i0ya+2Y搫"zR0BwhE=;EN_PUH7w}KGAsPRE='5rw$%!d_ܩ_O;KgŔyg-j, &؟/T8J֎GOdChZΣ|zҦ1 To=!+= lq.4`Mۏ[aEmMo@[8̲8No /Zr,_k0p}|ąo#x}eהpkJXo ˱` `]̳@5L#,9u,~f5DIO!>B]ZQ9?Ӝi͌׻yNBAϫwU#p:_E06辶=x N0ԣcgIw#ga/앻J9enѴ֬_@;+VPEBrZ Sw6@ѻ,s_F;H,@Ȣ刚=slyƝĐHg䴅H+.{WaR ?p <QpO+ްYz CWk`$5LֵgY|l5ev 8 /!pyR-K+* ~9&H\eO.#_zgZCހnzU s{A^:cHn? p_eϠ nut3څJoQvijz(vYºx^g-T%AIJPSP}6Fp%Ip2B_oOPXZ]/2{Ύ?^v<Ϫ#OOJip,m6A喃\j'=Y9Ao."=&Yìz~vs'iicb7Ls;Md? ,,3o~'4G[5=ihb2ڬ]LvCS/wSzކM3==~ ϣi5*(KO?bB\_K~{oM}nd;Ǽ1ߚ"l{d%~ȚW{5=v-`w 8 ޖmVO^ Ld:6pvcǿ3k!ի m%h]1v,,J ѫB`y×:>jh]'vV!ϛOt+BBOP J }N *Yk{XDȔ[ n}_p;Kp|\hvd]7=޵eEJo5`A#UM~}*fDrm[m]ʠtg?9*ۯРH4 Q$(4gt6D4(R4`+ 4G <7^/\s~ױ:νG8_d[t~h>W3TJF9$Nw'Z|oHS"4oBΓitv-nK=/'MJhlh7hCo"1o0#l0>~ f6 TrmBBҠ3d{^[ ^5J7zX<͘ J2{{8d;gb'3{L;/̖Sk8siaFJ#ʜ؁V)pk=ܟos;yEd#OH*!MoO) wW`牤R_$yd@uضkW{^noYS |>Ԏ8j2]CydgGGç$r>LN{h݇4pY#F2Fn?IQɎ"Z?yna[QyCgw1.S>al$4SL+Ca) #(wj{FS(i- $ݓ"ٝNfK D1߇VAX"3 +_b^݇'m;ʰsn;, ūY*~hX\Âg!SRg 9V鮰۴{L=\q+pCni ܌=Tg"‘3a=Ʉ{' ,|@{P:~Xfu[٥ lo">eṊ̺=.Rȷ@'PVmV91#x"c&05 Ku鷡 mlkM+1Q3<3 = 0r\H7Y@s; RBJ.Hy]RkIƜ|mXք%0=}hػj\}FSbֳgS|v6(O`=G`mang*Ihx\j7^}g{bZU5FE'ֈC¬9sox#)l5[3=>9v6+U?1KFMp샰?RI|iq}/z4uKU_)t8T(s2mB^t8\R^ qexH~⹜,qqIձ{ ^iŬm/ c+ch6^~ s# \0}БBEЊް,RÅ/pנmG|2'RI.5'e+op|7Oቻʗ_|9ޛ!vw@x4Q} N`eh-٨cj`K0@B?8 cQɧ&I`:V}1/vɖTa4#u:HέLMŏ%:E.!,lkDOoKHaR ?0c'Պ`ڻjDM /XrVbx]gE\9Ɍm3݆,6"cbf&ϒdحWXCW3|ēa@(c0(3H"*1k՘c } (&6\"v+2cFOKbh^7v>Gcӡ;)~ X~ՔSMQ[h]^д #M }M,38V uJQq=FI=uB(g'\%hcKCٹ*-t (l8ࡌ+.{*GpRp򍵜I9Nd] RI *~_pr/Y6"}aXD Xc--TMiv^fZӥE|$ 7?P[g-/bԤKxRb4Q&Z6H,h|A߸N}!Y4I-IdRX #Pok-d|k+cx1‰x rLO"wu d]# g3Qp:+{;/$xLA/n/ ]`],'0+SfgphV0^[@uX ۧ"t5,^$ ۢ~ϗdH/ZM+R;(d1$RJ♒UG1%m  zV%Fϫ* /ڄG= fBm`囂s[=L;E,U+ f;Ϗ\\&;7́>-7\3)>hĞe§@h+ Ss#$T`qYrЙ2Tl~*yC0cΤDzqc^>_kZS>햓b 0 IS )L:E;Sjp'{ YϢi3]Z8etp>sHҝpFe{voPNZHRؼ/wԧip֘A47nhL )8iɿnVec 1{8P#Z R<&lj5+|1峆*H,1N&c1tu/kQK_C^8w [O;|'QpD/B'hd2ԊXs뽟'l{ZA%'v<"9<ӗej1,xNSa);tmUd= M :=-RԚg(j֮9-9U}1Nm6N]U֓ ^)$ $ ᫗4b H^zURm ţхDeF# s+e{F?OM<r.#ZH=OBB7QTRͫ42&24 @(<HFE4IEE^Cy|_=k]uZ׭D>O Āژ0-~q d^IJu jVs_%pdGaՖ]!NGet@_o_h] u›<\Nᆳp4j,H֧scøP/4,@#Ih X(:@L}22S[s7$) Osϔv09۔UaŪdֳZAKX|>뼠Fcpt8l6] V>!Å$0{H0N2fzy.=Cܟ[si^G;ax*j lEq(=5Ӓ%atjl $q~>ґ!ܢ *}4_ 0>K ~ivX$.<6 9P խ7ЙS7R^vtC+Nء^W,|v.ρ2X8wD[ڵ0 YO.ͳ!6L©<<eBY/tσP;A!M5^]y'jsn ]ϞAnh ͛^_\ .R F Ly 3p<1|;iӕRc"ݦHSWҠƍ] R}(:ʸ mT8U԰J!TI_0orƎN;N^rȀ构thX4*aAJ$̚ik%!+ApjAx3WZ]Lz\"w .WC<vbnBN$*P9 3l%Aj,剟)p:MyoF:иN4qf\AZH_16KP9:?24ރWR9=MLuh q A t ~c j& O|"`8U_1V|8CCP y*:-m\_&-&QPm]i ΙF0)y,9d~Z6&H|mDz+FF`2T#2vRRi 3GPz0a:7sPvA kM%a>FB T;-R{|8={B JA5CuiEK1jtXqRPp,N@vjNvT]3)(/>\|2c&!Peeai%B䄻4&ɟ~~E_mKp;єCr%2UB h~=TM4{e{CH=4dP e2iH#zw4y'⸌`ADu2n#qmH7m&zk"W#0A>4q;@n . #k3% @hꇧ>BC|ho'W@ (z* DuIDd"8{cvpb[d&N~Eu#h;E Gfآ5+{ *i&"=Ps*rC Y;*M\HNS.o[V@?Ff%u}POit5jm5^NFB!g2GAI@ ^gIT$bfHדQ.L#FOKLA *i(g>(z0m_bI#NGq0ӫH$wQJyzĥ &_ r߾ ;]L;+BI AL;Iu E;H#> a6YpbɣsB79߇yZVyl]TFWr}ߌkѾ+|Ci@mNW[tQѨ-:QϬ^33#Mk9練J_)ckz'\ Y2>Hm'guäݒ42%-/H5k(h7d0s4s?!֤BPrPecdx(u_ :I Rn%"E*%R\ t[Wy*iSD!S\>Ơ7zL-ULj[h힁&;u(͑ $i> 4E/!^wɇ~')dh~ԊߢJ'e2D$-zK+hhMi=`Y.j[pYDZ{SY`Th9&~%wGЌN3BA\e 7z9b8^;[`;n.豺ߡYB7w/B,Kĸ;V7kF@xyi(ޓ9ok{ߍn\uhu$^0O65%%WcA+Q>K }3iՂ u!sv$] 5=} I'bpSEuU5utu=8 ;I#h4,1YySw[:Y =ji8}.)qh#3ų0Jm`ws|93maˊ-_6|$`U~Ac݄sb?xÈ1>G)c1 gށOaQj;K@׫hc< PGj7:hbE >?mU 9ⳭT@|:D͇v#C/k0/2.{WPE!TR%J$ "J<&C‰TRRPGHI:!{_>뻾_jֻۻu_\u5 a41g`6 |g#+7 qBˍRZ岇g&SۃL'SG%\% 1y$z<,އ9"~ ;GьT==7 ׋~~_nh}O{L82gY- d! ("S[{; ,eWNeĽy9{0ӑ-KP~Ise; sEO[K^SXEӲJdC"t_Tf[4epuQ!; G$uw40Ӧ NǃO0`b-On+(fHkOҕ {EZ tD=P_1a0ɱ9C+0mYX)Mh>1;0+1v*7Q:^ګfy|*ԥ ]Oy忧{KO 3g5ziZ]lYcFE&_`4 _ "1iNqМOZt? X>0]n,C]?94B{ 92|d>=7HՎců$ܺ~F3 D1+n<'!Mœxn &?ަAkkmɴE6N^5.=BvBvL;Nc׍Q{:3~09>f&/6Ys`,n971TCJ UE3hɨ !3΀tLvƁ^\HGj F5Y=3;iokO?lptt A8v\2ʚ g4}8Gό;^>]"ȭw_ۖzItg&t&slA.Fʭzj F5pShiz9}A~raV" \^+zR9jи_.]kOC6g)Dv8@w\JI'8 ZK_H !f,u^_.o 4A"yj;4ʼFjAb*Pde-zQo}a"`A.пqOk[=.ɠ{M9\鎜BK$T-:m7f=La9DzܹbBI͔HUҶo(}eh'Tax/>ZnaJ *ME;6Vt)53.T{ƺn2f%(e#f3*v@hrMA%r|~vף^TyyKnC>o? <2M *A9Dռ؉ Cfy]+~KIG!p%NshEݰ80SG0hfAl v>Is[xo@ԕF&8}~ZIGv(G*enGBEdk.ozjqdd/@Ƽ]@9^5Ktv\dP&U*!`] Au%6|,0nCm$T@,n$/_RKkۑUsw4COw*S78n[U4@ۖ[C W j9jl;3L=<>2>4hޒ b1+}Ճ:K6)]Gq 5_pԺgԣTk(@;WAR} TN]]z${BjHm)XsGGՐ*:c,"D~ܕ6؇%Q~ϻZfO_d/'{s88,Y8ׂvsw {0|i2\ERÓ ĪGSnS: --:>o/@Yp7l.p] MБd踥L=  >ĺѻI4pL]1=½aQn/i4BSƑWk;I}9j:<P/|əKk&K8jo#Θr-tp$F`v<^tO:cM<|[֢cV7#%' V@|pVjrhS2gġ)\{:罁spy8`n.{wb)R;* Ħ]$\!ۙ>=F!sO~tAZhaQ8j-}qhO*\s7>(Nu*\(wIΟ wFG%.9Ms0D歂Ok4Hpލ2i J|}nAbcw#5c կQ>;!GN:0!9@$H8~%4ˊ˧ky>+[V2-~4i? llG s"LR"Oiu}ԗ $b~kd*9Zrg'nv%m&'8ġ^3r|WOGt~p҆fsޞɒnG@LOR"ɀyQ1 G =C5Tu6W9 ܶ{fOq=:Ĕ9xR%$j6bA#އEwhLԆ/<Ɓegګ?q#3l:ZWf9a}~Λg4@2ǯ;AįEH0.d*~oeD.aϊimBjoTO@}A4EÜg8}b!%&vx2aoC{!H֥&ae.|"֓{b:vB&.~򿞝:aS&V4=w2Q-NuOiX-9C|$/`o`I˥{ߧ|rܗ&/_%NHDϏ2%lm_V,9K:g>_`#&X}I={@X4@^E~>HPr8 Ӵ3yUq$! uB/ q]6BpS据wptmb{;?俻V$7Ƚ[ I˨ǤY\moBps9TC7:N3m:pBA{:ɐ,,²X駋g?"x<&MN,ߣ۶3OFڶ6d)(…>|15'W`$Z!j#) 5 8lpp b܇R9\U!?@yAHz{[\$H5>{eޣR" ;ߤ +T|#GVW/$k?8 dCLA%!ϷKwfG]ju.׷ٓPe4L[/qq_Ղa-*4sJ^W|I"qϢAx~ W=zV$?Lz$Uj>$pW 5-Wx>ZLA~A+v7#L0: `1q s@נWyB7rS_M]Nħd$A2U2)}'I: KDn!+a>RVa,⳪{aʿzZBRDJi:n".*BT"$MJ eJ{s!4SC9/n?鬞Zk~^ϵ?Z0EI]8WUF_m㖔VL콗]BGc\nXy)CREu K*CMhS~2Yw 0GaV]JfC _ ^G;'}-־Rw4vY5nxCTgu |X|O ;{ x={xh&>Fޓ|ub_jrugw< ]0GQ o:NW&IխuUE3E8dژV-Z6E8tJ8C!2{%$(PVeG?G[gOʱq:޲Y&dXPۘFW_oӁ90mp{*k8ZNM;r ׳ .l~9Cx`Npz$&6ažx*j 5h}IN)yV8VTj^4/D:P7Z>zlg )͏e[f- ukUtH&Xo'G%-|?Ğ_I /JcuW+Y e_cWNPW U{2vv#`D^Hn;0t<_{ZJ76?0[r^3dެ,̞5|u&bk8={x͗7gRcaޕczܐwyȟbY^Vkf#~)dzFoMdieğ;~;Et8 r/Gzh73|9oR@(pVƍ'@_' zgoѿih&2[ԏVyp+ͼK/V$q7J%/s '襙m'c7o+=D+2 |Y)Q4G \Z93XRd9׳[uYPtzgOs~ySr]' `d+Tm|QaIEP_``/l ?`^ ]KDAkA7 f=!e~ !Y} {v,FJꌖ;*ȥ6$%>G|r-md3އE[-BNC_lU3#>rE:*`ӘY7yD4ZSMQκ>[:-Xǯ~FoHIS$}*IY ɠdi G=oEfcO,ƒ'PoE`_! (w)kF?l6^:~VٹNȖI򦬲z)6.Ok`LY8˞aau-^DxH~epP\-!&f,h_D5 b:} vOȾf#;_sa[W̬!ky C˃yi|P$Ȓ)!x1}`a+ƚbC$ q 'JL*±昹s( m={RDTnN9Ab+\`NX^dV~)v{9o5_`#8Ly">',* okۋ![(Nk?4{BqM/HW2Knd.4srW#Gy`;5=4d˟Z1ޘ!rV3ñHo,eV&bΓ//Cn콟.,|: !~6To/Ő+ yVl:"zE: `m9"ԋ{v.~yAjdQ?iu0^K"E:o䢟MåB!t8͔Xl4ò/Y]slQ{NcdIQ _ {ɧwM_^w7JO&o)FB=C@k#IMя* }g$l vqm3ki^šBYFQ4v p>+$MϢA?Z0V4-g( Ԕf~]IVA\' b浍U:`9 l\kZkE|^Sj' aBl!] L8 ' v;0g|4 9A/o<Eg)y_eDOoߓͯ{d;Y_!H>t|+菗mp籅` U6Hn+xNrS5 Z p/gP=G86콧_AmX -ۺ.nīs\T o j9{lm?)au>2(eCw[!|&hW?szs+l`\XpGc-C1]%-%͸>A&~J?7㏔Nr>u4x NLO1Ź؞2 ؎ʭBgPw. M4I70Si\zC ԥ6-1>k PD~)&Eb_$ѓmxD*ԲI.R#L"~ sXed qqx9dUނCAX .1hHtҀӲ }*S TpxAshܧa_r7^;CA;tsTW5 OI1V{G:; bqd-bpzgdL:m<|0\ž,Y>ofl_nVr3phkVj+P~:l'V^|:>`r(MЛ;>6Sv7 w￳kpcH=p*مy:r:vߟLk5x_Z%&7a,B 5f]yMF:JHpvy7KyGtҽ'Xn/<ɨ)0<@uBq8F90l|$)5Aa4*Kc{|T3~KqyetM?ODwXLmPt6Crax4J>~WEUoedd~BxA]?Iq0~@F<RcJW(5 AunzƦtH aKmpy#K^>3v i?\u䵏o<7̸T;8c\BܪXkr>tƲ=xU;-87ۚWru{ܢ jkYk-!; &~ށ1P:;O4ut_ A:)@z)Pն>Il+y%i~r=١L| YnƼr9C؜\ոlW9Nu9#5 jrq\-ٕߍճ0icv=:bkZ1A=& ǘ pw[~n`w%yy4q %H>½N%}Yt}1 /{!mΫEHI 8&=H)Kng"'BX؀H|"rzW6/{sGZgI hI'ȭRihdRH7꾢ySHƈ,#zޢ<ͻhѮCcXĭ,_{xdcS$xKTHˮy6tDnݐݟ׍tz6\2qSvCyp55_8qі8ӆP\7mg {1L<7$bDtQ(lz+ϳcGO^e6ʰ0vx֡t3,X;K!Z= q'A? ':{Ӏ=N||H .?%6癲9mSq#s'o\=+ &ıO1ТD㔙:t%}xJ45L'EPGm+Pr&⺣ ]k_FC.6-Ax`rOe̦OS%TAM3&% <79lͫWOC𙑝_Ϩ`|'yP 2\3J0Wj;UgSS!* F%OA/</vtL / ol fY!gDz wsh?Q۴p8`I (%?wk ~fYlZH7;ǂkL }Tyq:9կEsNTb"9BTl'GÛè* Ж /(@;# 8{ T~z·}G̪|~*r1SkB xfD6&>=8 e,/UOWUUKZM7 1`}P/j]fKCZm]d~ ICFcu%7aUXeS ϟcSgdSirI-`,2.&VCe۷=-Ńu=)s.]DzF̠q\-и9.G#*эz|z:/i(rDͅ,ٺXX-&9e?`,|d~CZv KnqqI~}hD5ͨ9zSftSAw E78S[j:%z)vKyC}x$eBcA{.f^^hbQ5O@" w%/N#\B|d]!V-0aOvp13|R:N:x~=MXBθҩ'+S]F7ߩ8qTl^V`[t潎NFc^-eZ/c!06cߩ0JLT %ѠQ4oJH!I}Tz1JT~VHFJDiF~X?\Zs?k=}2jK]_ 4ܔ<_a)fFnNXzPj]oTHC{TgSK|so**E#Qݷ{)&o$]lD- nPt0\W"h}КY8&`[Au )z 3FŒv>f',p?֠LKY?&rb+~竼2S4"=ClQA#-H~.A@ޓ}̤8+ְ'8S.FrZs0 ?8>yG1Ï෕|[>ކWf#a*08Y >Y>ז$Xa&*4YVt1l ٥YO|3?is{eolE=nMtejcCGJzs:`(=I,xcT%:2nCZBi 1_grǻ_ON" dIuH4>`TU!)2 :<ܳ돛;=Z=3Y,Z &T;T1/ȑW`o 0P9g^eng+_eGw"åWJYV{ j9)/7ΊTOlG8._(#*_PtT~z _V@~5۩{t>;*O^d]$d[2Ӓi}tp+fLcnNhIp{> i#uLW'\ )6as54ry'u |>]{upj*l+k|^ɶwHěj'\Q&BR:eU>_;?W%ӡ%, *gB~ U–/`ƽ|)uڢ~ <>ޣ֒w8g"ZtCS<^1=ϋXt}jsă:FoSr#:G>U}=^ WI,)y ¬YzT (YᴓD?afM'hexҠ \"A&Ah8uj*{vpiGFyL"ab/əwꫥظr6Q65)bZȴ#Qn"$'Q q0&z٣)ᰖ)9m8ވT T&Uc8v`oKkS: ^rt7Sfa}_Lǧ_Wbwh<͉^^:?N$L7@&U^JtZw#EV>Et\4L$G !) N g5L[v(_h^}m|f\XNG$3~C {W?q쇼ސ]rhUϋJPuPoUݵ^过r|m~Д*S!o)8o}jaBXsISS>'j+%l3%u4^uxQ?l XFQ-jtȇ.z:&&_j4/ 07]gP!В2H:t@h,YUHBF\=44nm¼aBMa7`v0:F+dGzT=7KR/at&\e&Q]*ݎ|I'E*!i dyj%CEɪFlYf৹ҫN;~Ub\ɤJB栌ȝ7E%jSZT[4ĚN]ј\ohJ}S)uE/_;i/aFFȕۊiٚ}u0]ȃB^feoߓ@^mLLgihSp6]2CX(CÍ^U욪> 4='~%kh6,9' 14r?@BkZrLI5gް'D><Սp %UPV *72o.\6G(/4 7u ~W|3 E6efB/{_kH꣫StƭTBCoD3ȣ`'͟M>Zٵf/Tr{s/}5TH$3Ul;ϛ91OL6"&k}AM!ap? y[;p6y4hܨ<;4 yӯ)^{亊8ٰ%yxѼ#6X[1Bjf7ם46J]?qSEu1jJǕiiTm]it:С6԰aІ|K̬}9 |vta=e ꚿy!1_ g?ߡd I JhP,oDvFqOdDUk?xdvy{GɿƲ^(0|7%_ $6S&N!| /x gqݺX[{<: lĕ D{T9ȊT91Qpj_3 sϓ3M"oByQA#ijAcL.--sPBZVvpQmJIȗrM0Io-= M-aءP?øw_ptHκ{ K(5 j-f LF ~ JеktC{Z.ZBxp*VR"K[qewHO$]T)/J.wddu Q;1ougqV#v>ͨ\`҇TX<8, >]GNE0LIҬINm$nՉOL qA^%"n'U0ԌKf1 Y+uC A SY0`a6Aex؉)/jYfUC:g[. )kڵejNsrKe-=3U֊1UXECZgcNy,t_Ʃ]CIUw 0d+sD\0+F3{:zGwtvScx[ 9>04edNbƢL>gkm̛ɶr ?sK݅Bbȑ|(+*13(uт n-K@v[+80+R}y| a|+a֑,i]$뙟UDK4J{2+d!-Yty_RI]X^ s4<mѾ IOR4\5dfZD_o!~ٻҿ4 hԤ48IޫH)$CQ$CNӌTBT2GDC" !ɘLЋu׾{߈U,'4N5U,sJ>6q &VuqL]< 'Y3`% vA 1*[.LvT# gJ)v).u[gLKGF _լ_~֨[]Po"N i?In'zB_e\g`'T}0}qk3_[j꺘d6[9jZO5FlQwuccc#V։K$2:*5˵U^uDbJ,Xq9Inqz>#SsWq\MecU8?@%wR ۛvL>?p㈝ixn!g1O?[.&]n! o7k'A+F ?>A?` T̗ \FhD+~1Aܴ:{֨ejsD~ϘWw{}2.nZt j##!\F>0z w"'x#G[>;w9x  AkL!# &Qpn,| a1Z{ 컝t둫gC;H$Ea+wՙWG3!/Km~Z[Tsݾ`[ 3VI҃e8/s#C~';`T8o:Ki7]n*G3AV5@+gwvX5T6b. ~UY=ᕊgBk:pY%5Y|c.RScT(nĴU¼ťܩ㎸?k)_RtF*`w-^mEgayΔcG;27w{4P;4NJ^MJy-&ߩGm[Y<ۋc6tr>#ETuȵe(BJ59֜j3 &vxb4~\!%˻]h+rÂ,'sGO{F^"C|֑@-_o>[8_#%@j' 5-jmz1li!8|eQw/!;XV9괓*i$QIŸ$aasyIJ񇊖\-D j~{|j6ݦth}F$m^rX$[31P,:ƪ`[w /05d!1狓e q6 yٹix:o7^ JfJ|f)w@7B4eԷ :(S=.Wч!Llf,6++Z=@-3K0t3U_!7p'Hd%P,T{!*Q6/gR51Ӟ'{mb*})N<ܘ 8f[ěQ *XrJDXhsi%6!cv yȞfKCzyƚl+pzqYːad>*8.pp.;rfzҧ?QK rBO!ʚp`o$I\,`RrxYwIv%aɔ2} :k'IP0 }bsnQ4ޫO^4)w`[;{0hL3:z\_. ȗ*rG%{ 㠄,`|3"Op}l$i͙q] -xK<ӑFwZ\}ݩP\!Q96tl #%gX_V瓌Uo,_aWH*F%릕s}~kXgF~(:pg9ZW/e >ǹ}{Hbd? ܗtBdKm̏a}& c{nL0pW̵9+/v2|FgK >wMcΦ͑~wl3oou?_wu5!2ȸ8&ECtV;;֓& 'hس:]:ec&TA|sf=U]&?ΐe@66\P:9eqIL V.O6`'f@tϘġPl~  ![`N];_֪@`'0}E\S/ 5 ʣS7~KoэYߙiEYcG#YNl/ͳ`9&l,]q?w6cXO#T*h>ÆXx%vcż0|Y (ijU¬,'lϗJqɲa$^A\AHa=R0ToV;(//םS>Drɯi$f/||߃fj-s3`$0o0KL^CAU> 7eɽvim!8 P7 ˠzJ٠t'-ad}tMm)39 Z2 [ﺉG$x[e2-*k=CiJf:&ZVU/+s?7dt o>N^J0xɑdE :#zT/jcID]WEW>3[Nk3:QR~ վBf5)> 쎿Am/]'8c=uZ>(r7\釽i:DҵPb,mUF8GQWaw_t!f[46yK% :f&q$3Cq'5+yfP^4^vO*fr4r_^Dl4MS /O ,)@,: "p85ɚ3/܏*Nmw"_TkZ2}G^μCWm Q 3 'Y$q?_ ڠo2\&]9@^2$pʯow 39oZ""IYj;Y{w,1:5K{21VvOCa2~of JDaUe"aw%u$6wW&4LɑaSKdaQN XY<'h8ISevdz1-;hn)~gH ޝs3 郒 jep[!q5H0d01kDpo@DMcp}^raN46YPqa[!=슙{, r2̸rtݱ95A{/v-hΣtk6]Z0?Vw׿,f2/fyU]KgrljɆg] J )DC}P(gIMQ$jҀ*o`_xn&l<κ sVgȌ`~YXj#8bDO p]E敿AnӛFйHkc`զeYBx,,(9ӗ`\jׂJѷ7|/j{[;_C>$GDŹ`;rBnKpOBEWX+iEIduQ:{&!Wi@3M"C4jM!z.JIBRk.*sgT}}Z;ஷ~{/i2ঘ<ɕUa { |wbb=yޖ/P0rw*&$R!ݪM{V|0w$K`2LMɃ-/| |2I) 9Ǯ!,iDPw-D|ۚL Ȓ2B,ڲ}s'$=b#i 6ppNm*up1?s v{ǭa"OTDvn@TKdZ6x0+Pdq<4~0%K8Ro9xR^1 lv8$7 ax*#x|;k)xBɑa"W#dJ+!Kp&F_0Iu*wKLiĤ๳Iv *<7;\f oм,\1=M&):_*Tcp }|:Ǒ%VSzUvdP[H\[We FZ4]#I$itvV!c ˎ1O+ia=;C3G! FWb6?JRpA+j^.$돒ES'cqrej0mb~-ѣ{QT$_ajfY.fo2^10(S'71!0Įphz`Ďvd0 o{pJ.>É=һH,"r1cV9Ӆl]NM^송'h"{j;ɣer`][0+:{/э?e3_~ms؈trCU4{Uw|qB4s/v u[A!s[D9`zԶ^-Q:! Q+NHݡGST&R(z8lC\:\E o5u7_'s.Ztg39sK׺F6`}Q )n9L(rmn"3 3rSeG_avTX 99e⬌Ÿp^/El4> Fx΂Ol'GvIĮC9lwcÎ6lF#dp̮C$#;(}/0;St/T2G̃Y qHcs*$le c]@듹LItīk{)LBoȝ4'"vӇy,YqJ$rW%dB  98"6`p=QgԤE.=҅X0.oA?'o$r:$sL=Б.ٲ4 i [1:s1Ex߽HQy1_TyyGx.H64碎-vckYu,e˾0e*dC~K*+X\'ctg*J&y"ZBK~KG\ک5Nq>3Y)u70f<}))I'뮓=.FЪ$X!FDKQ_u29|'agDυEokCB>݅%{t}E\&6M  ^/jg7\.:, ~H?7ǔcڛ`Q<߇VUA/BNvMDb%CmNw=m7ѯNѱdlj '/7:Ik:]4FM$§p2u#KOP㗌JcGYK0alLp1z-Թ>FlTG2S&apiu\F M,z 5p 80 'nPpa<f%ɠu[}PU3w[1اSc3F$oɵAKSa6Af^4ɫssq [Jcrhâr72HUG"Gӄ,]A# .5 `G5y<: uwv)7]+ͮ4Maz7YD_9*?M}I{E4*o>U_cYs4}[N˃%w~O;IbuPZt!WFNt1?R@mJwO5` Of&cZ1}\!u2ӽ&=;5rd33,!yP\:tJ^bXb2+<߆,tA9Ӆ>E}S݋sn$ $Ƿ X BD{B̖(IL腪֨1YblN'mݻ~mX b4Z >^݈oD(}r/FIMD:U6D[4 ^Olݟ‰/ `? \V0)_Up/*O/Exz[_ǾƃH̼`5pkU |QO/씏HN@3m ;E*HBC7.DnG$]}U#g$̼D"ZAcFϧM[v;y)Μ -/a,'Yx܃^hSiPG[~}>%, vݘ\b_`flf6~=Ͷ(yN92,6Aư |g{TxH. T%g7IRp<~/KX=9|ڇ!@!clU"OK~54 Fѯ-2-;KƜ؀ caJ?fY<Ƥ ,i$!}I&Q!f5z?ǭ W$EHI&"!)9 YRR*$)eLh04(/4!}gX}ZUj_29Ϡ\hKfyhDO<:Z6ܵC>ټiaL_CL56қDcܓQqb uӧJQIt#^:6t{ !]ϲe~G/7@1q [;^+<ᴕFh-a|i 98IJ {Y-yj/O+;i xHg[K+5 &v?!{&[zm ehp Yʟg9 ]k 0aYcqIxg dXg.Xꩊ&6Z#ͱ>VBeQ#JOe]Kӎ%?SDm#綐.e?A 8' ^͡@y(,w=b&󾙒i$'TZ?E/$*h"-S/GJM/]ntA=+B9ManǕg1t>BxS yV̧?~~?A?',FxTԅ.J(1KH !!aЬ_qP`y\Fz3nMa _xE޳ 1cd }p Koq+FNfgGb3:0\_+?uA.;*l^H6pL3$U̇ZA͇g i Vw+qܗsf?tr gx^-ϑVB̷Uږzju8=E:.:ޔݙHU' gJ' "KqcY1@ jH4B7pXn9f 淆MOتg5B 3ZsiDw^"dY3r ZwpM1pE86 /Nt2^-x"ǢMhQ퉪*P?QNouGa'sf1f9$ Y7CBtu aLJKH|oOaӦD=ٌ#ZG"hחEupjm\ 8m:-ClX5PQ_NC)|xӛVΣq>-~A:x'CHG;mաl/tk/r1 <3{JEfGs1Ziwgpe x<eLОI½9{ ]ZaX<8/3UO*n-<Q\`/F8 _ݐ ο7|T\ ?_9 ׶/s'``x,jT!ߖjD¥1 OX>~ 1%_Ojc9R(/uPQhݞ02FȄ}xa usàgWEY<7Fwck܂M` r_1*UX6˂+jW|8B|8~4}%,dwp~spOЧqi^_,FjEc8`4O C,w8JC_ܣ Eh |a[[ضGBGt GClށJ\ V %!!=Uv G~N߆dnXm{-1]NЇ[@ dBCSĉf%]@g!ݡodPNOszptsĞ:"nGG)hx3 ϣMVPAtQQ?ٞ&]ZWo·;Qg0&oE$$v(.،g8yY1w{ m>8G1:Mǥܮjb\x@?+y ı:sc`9R'>*HcoLfjd }?Q<|א#OO|z17;$ *y>Y<>h}Zɝ [/썬GFšDZ4iVS̾vsP+W x(w )YK<-Ie"MJf6w ;aĔzqB]Oo@-W y.KktNjⲩtDe¥{*j98YN *7G皱.`j[q\+*icfs 3"Tu)mZx7cAыZo6h+i{ER %:[4ɑhPIHB\JR$"B"!sH^B^/|ayv{=Zt][z<ӑL!ǛHT@ /Op_@3K6kVw_ }I\=떄cܽBp? ҅gO;^;^t;gԈgg΄?եY\*9e+o j˴P|YyIt"Jr <ǰ0\{PmiMseߑ5FI:x:-ԃ:vߦRW$n5p\*^^-F T裆cԟVڧLPfF TzS.b=PS$q|C?k=L^b ]d!*C-2kԴHz@ŏ uévL/5xp+`l.JMw;h2ͮG57?h2{ e9 tNj Na.g,tƣxPs}Im. AU~-鞷^,ۜFJuH_/s1[S"S g-!-WC} ' | 1grҵD|>'uڲi GπEghw "nuu„&=;aXPC5<O&|,q:y9q] &Ԗ-3 k~jhjcʰq y Wg{\ ep_h-N#y\r ܷ~KӊQEqs2aƓHܹ~.r?MzpOnJOOHxKQi <[¹3)ĥx\ LE/m!5|\+?:7 rZH;<{yxt\l޹:~BeC&5Mnz1 oA&~d>Qܛ0Oτ2У^W0$1Dο֊E$-`=y]QOn"F[&?o!y(Ђ>F !?IC1w,nz3QR3/rw~((tD.w Ƴ8q0 ¬(smkР+i|= J\q+8^Kp8u9> ^eT]3. 6~S(uHDj{t\C5vyNQ][g;3|6mϘ:B^PX}& FǼ"gxh>x"6E99pf@;]"Z'ʪ WVof%޵6p )AR50*|y5ڝbݐȎcol\M,vn5tE+ECٟIGy\|M( -;aw)mYIp$PƎV MɎT&m,5knIOuHLu(cǸm7CO3`^8V.rV.jߘ(i 2Xo?AQ-l*j'e-004/p0QGyk)i'j¿ksPvhPhZsURƸ}aÙ?;8kRܓ;^42qH=l} ~xu_2fu /;|T #LT7.ëǘ6!Y}x܇1 ebެN@d4BA\\ "7&ǩj&Ի. GGzZұt̯$.DO/Px貎+]Vs-1f􏙆BFoƃ;1YE Ez+2m>5y4j袑B3B/Z`>\R^T w4_Ksߤ3!#5Br\%3>Gp*NE}lmY{qlT`Ns'WoSsA]ݯzq{>@Yb9KuIZn|!U'1JP5yӜcW o#otIBIW3:f4MJhɦ4#}q8o=ܫUG%8LY칆}X[v+e9r. ݪD߃ѶYSx3ޑCОY *'9 'C|*%; Ѽ W@?E]ֽ=Һj':ٻ Uz$؃&_EՐj "> _}l9(E~`e =^AKk\q{_sGH/yӐwlX~Z< V*]CX5@XYH?48-X XHC2銳PjbA$Ξ$s6qw{Ѣ'ܟIブ_sz*uQt6ktY.QՖiRBqjoH'E؆?՟>C̿ oTeߗ;b3v9ɱA4ECR蹴]/GҤ[I{[(+ԣ|ˡߴ`r iEi 7Hhlz<5Nsiؙtd'oI.\0ͅ;Ѳ Fau*7z;onAɁ$Cu'ӕگinSx]fߛ;,ӝ0Eܤ&38.?C?Zh/.c_/F~·3_S)<_wҺK֠bU^)y$ǀu8`- d1p>T <;i5i !u,$զ($~ 2O A l̋9WS4iAe#?b/|pK"|ݏ̸h\kJJvmT%x$[  Kw i K\p I 5kzH~y1Ib)Yvٳ QtRz">Ìʉp(߸~'dsπKyDl}lO6>ӛ,tR 䱾7"Jבr{zpqV9N ~3s9^e1vUO­Ƽ\뭇K OZ t<{#x'dp aT8bx^?v۞K}k{Gn at*ߎK\֚ǝ'ʏU FuV;o *SE Q>j{ԛ#e`zCɂVdӸsl>R>F42@8^B8cK]Ef|D}r0^^m/ xo._:y$dZ~O~!8r62xv&َnڠ ˶ w z yn ~擎N6+-f.C_u`_ wNM0gBRd .ɭ=tG tm%X2w2*Ouy)?# Iu2&{V Tday%H)v/Wc_$wL&Rp#$@qL*z)4 ''< iqH|@zlu7"ܼAz͜ND.${ǒz!iГ&EJ$HTGdE{<0bt_lK&Q $\bIaxO5W渌٣Ҵ8;rtJ(݇٠ht!C'y9If|?m8̨xyr\߮z yg;4 9.ۑ kuU-U U(vF2{270xrLa _V82WW1ܝ=x}p'73sň󸛤sȀKg {5PU1f,q<2/̙| r/'c}<ךSd, fawUϕ$? meat(Ͳa,@r5hqDʟ8^ 2Yg_'x WsCC1'R~_e[cE ܙZ#.ԙ;ȝ `wf^S_RA-"msѻemj^qlS"#a#XfO%h ~RnϗH\G,}\tc%b?30.hZq1ʄݾ s:㬀P6r#᯴DmЃuo `zM0&I|6>E0WC0~yR:\X@ }A'6Ck,hmM6M# {xfm|;&7drgK${7.bm2\Td~'+e&N#D\ҢCeF9ݾ{M tFؠTY*@JpQVԽ5t)Jz*"aV3Đ.L<%㩥[0MɛҭOj` +XSk_bͶZ胅KZP zߊ^%7ɼo9YDt<!{A>ֆpܚ\9D\I~~9<1]Ⱦ~{q0[5~FeFqr ͟^D_N[<'ڋ-guWܪC蚺6_bj0|4TN3|\O?5T+.U:AnO$']M:?L=s\覈?Nœ jεyD1fNlIw? @ݿ0}+7liW6}ŽM8ei 9mL{m6sKs6CHJ3}>i{WN/T!KB\oca o|A(gփB,>rd<a+Ŋl޵"kO( 5l{&̿YIG}9EZ^yrMs {݅$ɦg2Oڞ2\}ݙ72qZt= 8ѳQ}_IY㥴t?G1r^gy ?Ӝh; \Y.A8Uatc>c-Ino)n&B;'yK!]Lxڞt.dg=őƭI-q*JrUSpƫ^t0/vFu Iw~dgD jn] CL':=RFVS߆W;hzjh嵷}7dCچٰ:0?Azإ3 w`G3(TU?{%}iaJa] 7~Vx^":ɄVUP{4L[Qs=pu:8dń}C`hV@0^GN]4 (TP-/kyS#Q[yÄR>ws8uz)̦?8b{fČk3/Zt ZRRG&gg? w{~}=(!bFCWfvFxmm3qJ1<5WSOeW㨵p1M!W" 1Y36b3Mi .g|o,ou/XVEե7WOǔq=ۏ)N'Tq$pR.icIĒ*MfM󟈫Uݴ#O]\2pΗ!)aMx<ԣ]1ўM[LV%Н/-ׅ&(K*C0KX_2!]{f#\e|-ӡ7_-pVv $.?sZPҋ.MMMB.c_ Ä۽ Z&&;$cp|VNuX$;vf&b;ԒHU^$h@ },^ `NxLq `TK;Ȧx s.f&`>+? t͇q]-Jhξz h8=(0aQ\ %<@ 1ԫ1NDs׻vt sLz=fc0jJbco,"r$Üg1ŃD1&⼻,0mSME DXy(Xb0į#dz}tHP) @.-gZ MT ,-2bG5/ "wi_}`A߾p&alY鯋ec"<}{VD7fUV8'w 8QQ&P&{؞vH8< I=~h4%5Zko*uN6osZ 2>J^$v T,SУV{@?X9@Hk23? UipMj*qK%wA"& wx<(pg5,?:3df&JޫYeGMVa "9st+zAn f"`o/,i){j2,jEB MP5 /l Us0:f:SY>6MV~t_}W6ژO:ɴʵ% ڏhahjG-F1T1 pqi oM=S!Ơȋ扉*B/dfo[$*9C XAMy~~9=VhRF6v7q:+t\)[Cu ,%q_~R ĥaP_DZs3/id:_6ٔC sšRu"20;b]<<1ձ_d,b{TXoMV }שl~߈8}%'̟/͡O05̑|k'`~$*$LIY5l1 u T*fw湐9_I機n3+}Ҳ_@9>cFC;^#}@!S -wH015֬cvhˤy0Kw(Xk@.& >՗$K4ǰ^2Wf^q?C[)5gז~` r #@?R`aϘ;!@9qj "D ktΚХ[`waV}=E&jF}WUeG_6(oc׃?i Y!G:?T7ѯ,_ٟ'l輭Fvndnn1H[i(|5Ef:#0Yd?]Öx2jj-hԃdp+:}gGךJ"C5m[Zްb4[ Y"S˚D =(E|FGu[ ]J ӵ=ˁ$YWJ^V^Ly Avu$~CYV4wt6wq vlR;:|R^ J`tfw zARF:L gihDz*2!y'K4:Ueyp_&`ű076Ll8'5InsH] 8Hy*AΝQH8MDaa0̝~doUt 3s@&&4r݀絥l2# e$oĠv0Qܯ?,_a)9B#@pH5ς\B!dpM텿\B!R =0Mݤ|+PKzQ3&)Qnmn|8N$*;l% uuP$q=l>E\-Jȼ4Ǐ]8;_?i*>͸. F83WI稿0vicTkN K+37. o܋- n[P8{bؿul낙f:*F$/5z+#LMNK! lq]2GXJ"W~8fv1uj{*r?w?xJ0fY :Amp\gGCZ|CLɹIox%$/&[=6LEoey=/3ǻnPH,U "9 vm@$'FGB?׫o"/ A2%^ gϋƂtXD^9E0o)HvyjLqA=nu|vGV 8ޒD#O#&È@Um0Sw_]|"6A<ί#yރ%k PYcCIHx0HLB8;|]=@WebHgQ"EnA 6؄Ӌ̄>v>HwjI@oIj7L ca^^At jo`A(|"f2;v>qq8#$%yਝ9 Ovthx5&( j7.3Cޕ] q`wp`LRݗ g)RÓqm竲;)9R@>b|8VMĂn<,r|*UU}ܞf( I5 rkA!srArB:(?'YL-%ˈ[96ɶ$D}Y e3ժ6>Ԇ`aOHt3cAs罱(i 6m jJZ @S=g+^Cㄌam@/&GKv&PpZF0fQ.DtFc7L.._ԭMCj0r0^f3~=@ gPؕaG>A(+Icj!Z D.s]B!;R%BEI8_%ա$̇7!~\ 'A=5=,FS0;uC/AG~S"UxҸRՒrM9<ϤSF+:ff踎4_{ r_'YM: ;g5Bo{8:ꌐ;z~Tpx9튪K!U[XԲ6 4Ϋr5=}>QϠ7[U4U܎MmdoNx "kCz(I 'S(g4\`Qo z aVXQ,Oy>`TG*g#7X/AIrj=I3ܪG[0G:fF0]UںhԬ)`78~ ! A+W¡pz]m42 QRCiw~)ӭrxL&`lOj4aXk@Hc2$Aݐ=["aӻPޛpga'3gw;~u@j̚Io? c${uo,`oA!KydNF+?S4Z f \ c+`3g8?WMf/3 `f UAZ@҃<'F=wl;\(>j.d]u, Ң"/8}gFpBR:C38xxZ\'D3hrbк*Rv x˧dȋO؟"fתqB2Q{/ 3}!#ʠ9 &[}cGGPra#Din'紱oqa#X@lJc>w5"ԃ&クKP7'vÕJU(Xbuo5J}O=x&36PPN#0Ԩh%9Bs1VT |#B, _p'B%: M\tAʟU]iOPzd[>ur{1,T8SopH.?XN ұR\U2 ?ò y~ z3 M~:a^Q=#t60#H]#|,VL Ӑ՜$n6l|/4 ٲ \.ȧ&XM`7M'uSlx&~ o̺d)*&Ѫ:LO@hgޣn恠?CiY$-@¯w8`[3rm ³3gg^N{T'0\v:CbM7^Ψ汍?4Aϛ6QTj)~ lf&Uk>WM9m'~`&?Ŭ]v%P9}o'8FC1l;q.^E4Yy),^BVHyNbPY 8]_B)|'OG)ټF%}QrgN:;BΤO3 3E*(WJES2}J}#NĮkhY>jtxs6)/崚zҟgCq܈y/ϸu4CMh)(.Q $篦 [H3F$!}b#{ a1oA;y/\~ -ofEz"щ[F 3H%\$O`Ѭ .&Xz_J'VB#%y6|=Ȅ~~^ wY̵a )S TT] Bi:yS28t\nh]ϸ\ymxĞIPQk~a&P)bI7'|/g[ cL`kd6+@PvN > =ߵ|+=$ L<@59r7f\Ȫ = 쨐*1~0Yf3^qXhX󔯴<erjh܄r~ ]K0`.^M Nq{F.*Z( ]*Ux,r9-iVYJ6r|z(NRO_vhWWmCePiI{ڼQS32-z̏zFa9hbRqϛ>p߅gN;,x gx_tɆ({)>0o&:Qx&럼dƨ8vT"pHz4CrH!?ܒ(&HM^Hj9x%gWSoir:ut ^*s 9&0ˡ-Sk Mv*x1{`_h\Vt5Ol7qZi,&m,-dZƹ Bd4Q`߄pDH a5x2EP5bQa+̞ :B#I''!+ug?brFNIxx:btǢQ5*AJ:E]sPsb!HtPs/Fs`Zl6)!_ #;m#(Y2{g)y>~"M^}8:?DiY}gFiM{,i-똟5}Fw *04-4(Ő'BX\157%&>.nXcƲJRUS$`b %H?cȷqiFyVy} Y\%OσLP8\LlX7p [†Ä9~4AQP4.$d[S @3jmu1v/9W7S&`x1FkԾb/h)^Nl jq*7~v3yl>i) [ `K.b`D\GsAIeuk-Cm1X1g8{miI1pAKPOңGRV1؞\R:Y}Ԕ.ƼCkF&ډeS2kǍ+.zuStKAŎh|_%}6Ŏ| fW& lR$(kFyiNʳ`Iė!+:´i{٦nF`\*#;p%VC(p3' /BpuHSA&?F.`߂XR& p.zǾKT<7~0oM.4<ٽEWӿS^og #v{} 7! dk,WRu؆cVJ^qDn}eYj D 3GG-rM\Y}N2L8n,U^[^d\o$C C)733Q‰ٍNd㢏<l(@tP=l~b:GK3^ՊC.i@ pv}%O\v4l߻y/[<&/#Sɰ_YNˋVe[1h]FsZ,t u/]kx'QMrlbJ[XHD>j01!93^`M,j~[B\&{Pp,\\ gf,.s vcffJW`/G\*][|qȇɎ&Gg$c4Gx(q~47SGIсLVZ6_I}cg9N 1,1Qc_=l,"7[ޕ//U`>23=:D7q{\]2FLRso+-s2 ¢SsA-tYT*.*YҌ$$D'+}}d"_"Q,NɆ\鷺w]8t4Aų[Q!wƵ,};I0-?w~eJBAJ[h,!6>DW?GWLe==ɜM[Ռ?򯫉䇄ٔzV!B*dOvå`U8 ")d`Fv" \R&' .W`o<3~ў-Bߋ{g/1%_ƙa}KREѧ= 1A 1dq/ɼ7E6]!uS.Ø#aFp[G:Wy:@aj/ i#>D B :dW=!]/PP!$ȟfޣn܆hBh*z DPI[r8*bM>=7q 䟁ZWkh D^OYkWw aH9 ?ܗKƷEpF B :=%/9}G1;Sbȼf\g::uU촾#5b!%zVվgWݡ'({\ϬvUAo+%Mj*.(hl ZMB9J_Pނ>o,l aRC 2\ l/sbu/Y龦߭3y`T]Qw~.u oNE 侀 #5M/ku:& >:gd"Rrw)Gz:o764-$} uhU3HBP`A\'.$Azj97N +k`F\ B_췜)beU%0^B`,+ í` 5غwl_qwA'&Y<&-PF1v$;} [ =_jwyg\}!s,_'|x8#@e_傼[0ЖW.IupwD|'H 3MMc\] mXZܹCТ|1}EKMd&5i1#@o" qgrz~"¥\%򾆺hwێaڈY7Lm6d׉ s"pC}C)|Tmǹrn j+GG:f6j!VlPڸ82~لdE(eS]z*Iř`rCQ]\)wՕ]/w6TbڵA:^g~Sw|γk]m3sptSy3hK#7m 1E[q\hfЧu;цOxWCF8-rD < WsK|`YN1%W^ҊfGSH3rO*?$'OhRfu;?!ᰃ[u&X)7;_kE/ǡ)8_+31X#.`=5=J4CQ֌!C8}5KAȇ4$JA0!’MM! F hsU %04Ԟ(mQ؄j:gn4;Ӄwxﭲ'Gh!GE cz!) )ޡBnvDOCbj1 Jy/DB91E;Ҽwr?H[OW1Ո+4L\z7M2]c0=iT#<صgUx~4nݎ$2YU6(Y{458UxYV)_~{1]U~.4'Z͝T7g+6U/!0YLw2ef4X ;Z1qeFwnFӉh EKil/V皽0rW~D?CJjbBPbB`)yj@u\%)p_!c Cy'̛{Ƅ#$W@}>˧N@a.ET p&~&G'Ww' ^H|Z N/o;XvvucM}R#э> wv q\ XЅFˢsm$$`/Nxz7Qf[a}*up`7$u F8sokJȭ3Sl>g2$eߦ C]eVtpR~+quS)g~LG=g^{Eє'wLM6m0;K&/Dxo(s~,{4sgt#ނjq0qb6uvZHT7-~#)pT?f3f| ocdޏ)ɣ1Om iHTxP[M!h-f>Ђf̋|wE{OP7~`}/L;^ˬћ lvN.Ҳjo4&o&$&>y<A4eBn\wclZ<`\\ mGMIWzV8L%}eR ;ڴGͥV X͆.=pvG$$Bx:xV`A0^6$.'#L-بy>Xi.HIqG%!NZrӜ5|^F QW9͆~?@.8$cYB ̼?8b)JQ<\ޟJ 29N̈o1bxgwaMBڄ~IxA0sv{嫩,W()v4!%PZ)-IK[ZRECVy/!h*{_~ޯvq+\y]q<~]t\r20$9{R*`41G9!+lm\34_y +Κ9{]ˉ3ܙM$vJ V}tCgۄszGT ؄(cD?k]((Xbju^m,b4GO,H:#|CIE2ǻ`qx=g4К<`V3 !s FE͡}t7_c_IIJ4XГWZ$a/s+;/1 ޛlzyUk0x#~,DEE*hϽӴa?Z"p#F2ϳdNҿoKY=qe -λAwS)tv. TԾ'kGba6QV00Ux˱|i>X]<%z;:u䩟L*!IMߏ^9E҉ t%-^J?'RӻdyuǭL}Xu+b*BYv09B<=9pS5frkEmq s`ۭxe[**9hhgOws# d8SpRidnr0/z":ef^rYUd_sÅjIjDv26-{v!|P8<w7O&Fslam4]ΛP -rH} {V(+l܅7w f`JLOlqbq w>\6D,+Rek]noe4@|8 Mz. "#$ص< [΃ܢN])?6]v+g_%zs}hr.x&#S &2*b +Gab vqX4%w0h5[hvFcV(-!FʟJ,HJky@+ͩӝotA.NVVIfG's|qT&#BnN$'rQsސ IuQ y>8ZH5#ct"Ցm.!ƟTq΄њ|gAcL>M=%w ^!tiaYgCrlh)_M~ҹ դn2L:c\&L݇etFJ%ݵ䏈ChycW)pe#*rw?cJEkx 2{W(0>NUkK˟HdK~9Sñ?@z)٢u 4PE琲}–we:}15Lf,0Ωr8G*ps>P\Ro|7]*Wt\g)8Xv-11l g`!QN%C!|숽;d{}l_L~PZE E|bhDmZN(ؐE&#'$}. z>r9G2e,q[Eݰf`8g/xٛK{-nvz+mm@ߘw-JeAkzT4_3^֣uZPs]2H-zjaRʼnRxD|M _>Ny ɦ|n-Y%=؃G>TޚvoyDǺNK*Rm,cdQ,OSd,&n3Ģv-eGٷ?P6݋AfB?"&C)bs\0i.=U{Aͤ~4s3/ 镝/e3zvD, BO%m[R$Js)'yq{Ti[b>QÞ.ȾG_+;Z Eq{cbt`i<\<'ͿN~欓ї|7̴L^+#B#>R.tit4wj,'K{}F[qAWBcvZӍb]ErL,L=7aMTä5nGiț(~z_GםF$gDC{S퇈sFs$F腃8srr *M#)kb+fU,0= z զ]bBz]g#ql Uڍ ֹYufĆwi U\(o$z g7~ef G. 5h`٬R Y'֜w?B<[lD~Zp{w>@J%oDR$^ƜTs|F9dO'ϥОD=V|0'Ʊڻ`evL؋-)XpĞ_ee -Q$j9}<9*$5c=mI .?cy\Π=lɉE&egt[N,_VU4bpa!l_n:\*;ݒEFl芥ݨľ4D5=s|Mi4t6uՠ5I$4Bq≒Y֬jX:}Z α*֧#'z}&]?xhsw"tYtP';3I[DN2lN/xX.бS^tJ7V\+9RUTyDR1|Xɯ'؅y/3_8=L$/?4S-7{kj$)̷Q X GDقh .ZdՓv?ZG 7A~\mZRt5d+ۍy>`ϕ8I z Ť#E>Xn|1`7#'b̐ryqyIߥpFDݜ(bkC["voo9Zfo~6G;&E8 &x !,m:Lcc7e^'cp+#g7z7 f&J]Ó,:*T9^L+I|P.{S#Jyw7 y_-ޜ,Em's.v`3cʕr\|u]E:rl ͗Ajb2Q4F<-QqRBL=OWL߀^bgD?sD۔ܡ8*]"" 5H5 `2cw%qr!܉sɺ'@8nUlBWXIhJHȸt!Ӧ".kUh B=6! Uo`m8790 {]dB>nfj$nFϒDە_2r91~Pg]e(E~cG tY͋Xrv7+)ǰZEOF y&MMd0';D p#ɛF/tn>Ot_s1/WB[kQ?b|~wx5!KĒo1/@ZY8WЀZnWL 10yRgNf#io4>_+R[d{8<8W,8ңQlj,YΊ1]s} fmq&Vu6.otū6|;fY+]eV59d[CXn6q^RЇ8k+xŠݭZn=e>PdǰILbbs /@snay3hyO".>itz"ĈߡZN-e6Fru&c$e;%{7Q7HBWroofɲt/hMO>$nhAi@O]#6G^tzANWSvtGh~j|RCȬ 5 5nޱ'1%$J̑YM3kbOy#Tg lV3w0sij81NeLvi#-ډP7u+;w#rWvfW^>{hH G]cʋOjr~ ^s㲱\|xvtRAXBqP5N 8kdV^zXss3>De:-yq/g] HE d\BAM> B}UŸKP|~~x̀Flٸr|材!U%Uo_JUDxx1n=xznM:Gm?乔 :+_Ҙu]*O?^o~Zۗh89K pYV kǚD,bx.{-OʸY^NWv{<큈bsͣ?Yy::i:$O|8pF1c ncu }R( p_D?#P?^a ٨gyAd>$ )OC&v-y"CO3WX z|IO:SwSj_@f ;;iңԩg/;*T/X"$o†,aGǘ>F:!3+k=ϮlUp](3>Di\NPT53ZQ?5LǤ2q/+r}<(iB=3 !t_hb> YrhPCXEęR2V0ITWiv[] |m<}Hux/E7Al\5 vaF'jhko!TLOv埍C?{ckzzٲX{Z\a[~q+Ld(?N3tToI{I"\MUMGOӼé}1(R%諯$},uǔ?0+I9ѐLO֤Pe#S57TSɀY"yD :8:Wn{_HNm+}/ ݳܑ4[^kRtu6 7׿=4.-UһW 㥶 7-1e3mޱY׋&S㮳7&'|/Ar,39 ׺?PX7$oGllFXjK9B7dS}7["& <>tY6ۧ[eb|WKQEHz67癠'GeYo`f};41>eLa~bm8bY*g+IW2"WsouFaq eg!:vN7e3Բ?l!‹жn5x77:#}.DW+@gsy* PcUϗH ]Zh6[*-'?#O륹*7K;*>CH0 +h y%VX_.|~Eg$`/CD]Z SXZQ0ϙ^* =tk{G"s5/c2D9'R2/*Tb87:x$y  ÝJ&dcfy'i۞luolɣ5 z胅Pgo=e1ƱzkJ6$ݼ9:;VN2ҨPjDQw9T\<{SDNݍ}F=W|Z_֛nnXB6i+[MқU2TgUб;*0=x>a6f3q,,9ղ-K7KnvI Q8:0(=L]Qv&y`L,~3U e/cL~[_CC}녯PSH qf} ~q :Ї}N]45!z۷ [b f/Bc}[wJqxfowNmHނݏpQojµ}qY[>7C@zj8./h8-qJb"rN!? NZU oV =XVʜoGO|kLypWGž aʥU,ޤZ y#uOQSǍdSӧ2$TG_[ b9֫IW75mjz`Wz3-\Ca^(m2JqN'j/iv:*Y7fW^&]I!Ti$i^SͺuGDDl,p[)5oDtXf97}N3bDŽ'IFrƟ< aL$u9޼e ċCRؒ2J]Tr }Y'|)hg 24,cwg#%wHm3lz_(wwT}Bɶ&~M,SFt.c( qJy+gciLjK]+A]q0f3i=lw/oxq^?q"D&0WYƞއ14bLk6Ə9I1YhmZ}VAdH 5DoND$twsd/7Q%XԚs cu#W6&Df =0rzJ}l$XSq9BW k}2kX 337cͰFP;;})>e p+ѻy"bL+6mgΖzư?ܳ>ܬ/-vIM"x:zj<sru>##Ry#RA|VN%S,>K¸Hn_*XAfĮw?n |F+xoX1vB,myd<[[2oVB FNq;S++p @C37ylt#ɨ+7:`@3iseAc' ]tWŎ}߱zXDN]Oxd"(-'6Q2Z InOz/$=2zyf}Sr Z.gc{_8<l< >w|Lo@e.|Ĺ/Q Z>e..~Vg]I(p~fUF',dacI {a~;pd[ cD8eӎۯ`f2zؔhi\r+Wo2ty M_R?rtƇ.S^FߋA'D,xN ~ @HrV6Bχlܱ@Y9J׮"d|D"8M,{mc͘h'Cv} CuXLVX.N.4fo{kص좼˼nc:7 Zl%!:k{a#C'NW_t=b&]퇠Ա;F\}r!ϯ$ H0YR'\GxMN&hWδ϶tnoQC{64|8#G]:y/ioVRN,vdJ)=1 33pS#]a= 80G _Ϥ6+^Ma6Z0; ~ܣb3snjFFnlF` BF*1;|xxsMj(WeVCQӮB=>C^3;8|©꣈ܽᨺ;|ށfh~K|ѣJ쌦W0E}D5bx^5g{Q{oCK˰dksI#}<?r{gKTcg}> )+JrL, M^DU2IƒMdc!xf.q}^4/ݧ}%%*dǍbr?3K,(={OceY1x0P.WlG9ʦgs p:6\Ձa6R3ɶ\D22um95<0}O?~f5'ءqڐdG>,xӞIN1-1Ȇ\b0-\=S}wF>n{6lZS“_d`IP'acY~ؒ1Ra-bϡ[0ua{C3ECa4pJ ֭6ªiX7&k\آPMvg"ީ|+_G 'H\Y{et;~/'"| j!6`v&##Z&Fu>Aw_X 8 S~8G:|rxml6f:迵Fh8{oB8 7-µ܀tĐ];-G٫~:$xt})환F~3=Zjx}O?qtyj7]ze s2k,rl[I+D ;[P.DdAULJĄ+?sjt}HuKP%t1bJ]Og>N>HH}Q<Q 3<-d~$ i}BG3zc7e~&<>{ veNQn9z1U6Ozy7"z fQé+ ?Fd,6oɝPm%ٚ?lwv%^}H8b0j|)Drs.9dAeu=.bR穘#c50XQTWth޻+ٚF`3WQ2\~H"^S ׹8|'&7z-Xjxxv윳XųW;@ *5%Yc4o/ɔm$uȱS&ny|%E}đܹxq{ct|!sFeD avp]?JNsH'-#f"J1DPІ}=Vq>bϳp_ęƟ>/fi9ϻ?vEx"G^ڄ[K?;y]Ԫs6_2Jgx+i"hBf0tv FD|3X5c<auGOb  )%ֈ?Uԫ1uGg 4TRbFkSȽkx r٧ {}0h >I^A>(>J~Te&%y?bnGǯߘr!aa0U 莺sa$/MP ^Gav2t7!^7[w9k^pq1{nx9Gߊ^pN\ t 0.=gBIOJڋ[$ed4$אeo˒qD 9˂yCX+0/&}tF$e-<'{:_<AjN\!^xhw& ff%SލU,/T/_zGI_29ٛ'ףouZNtR"&:;9?UG۽vw?y=$ƚBIzC sJ*.DA$fl= \ae4D"?6&fI 2m){lX;#ssxDmDXƽ$A$q;cL0>1C/E5E֐p>h#3 g<k1Cs*k35qýe ݪug͗0Q[8#:f8{BK{5pb(FY6ӈc_ftK'+1{='SYΓTf1|@p'=%OV~Տ% %2Cqϸ? ?2l^AXs1)9oqeNL\҂٩GX6Kޕ2`W} ;Ŧ Cq7$}y>~sblpxm"n9${)wT,$g6=#G'o m顝0?"ӂ!zgivJ.d3BSv>w@7iOO ^T=*+U<ʖڒ'+IǓdg1'&;_::@BՈVlչaMoy^ %^Y`e*e{ܜý"d'fr<7kl8אqWX hz`Wqg,|ިDqqODڏPCLh֬tZ-NwUԒ,4^߉:Y}p,¸P,nFcዷ٧{{˸~ g:n ](?L+b^4Ae< 8AkI}$Ƃs ^|>%סlLƛzz"܃xpSD+pu:2m0)~ˋYl6>ew[^Y?}>B,{p]1p K0~ bA?3ُ3Zsrw=V|WRhV¿?Ψ .a/æO`Zʩmпcwz|X0tHǚV8\ y3fӎp ,wAwq<!EOe}, L'^7H\qU ka NϹt-|[k`wv|i^wO`n!$yjRS #gGdZoq!=] g Kc츽K`5booo?*}ؗϷ Q75ӹAҌۭ`. p`o؅?wZ$^%!ծuP٩ 8>MIE݊9hzp>ރCv:Lݦ y4mW1-8Veс}3/jSE'S*@!n\*s1^X_c%:Yw\jƆH`֬/D> xG,v(Ꞇ}t$݄Jj^A)7*_ z¦k'&K{ ٦@q^=e"Bף_DtFH`2v Y{@?. qyi{ŲO3[RzȬVeBD\'і&wm+<_y3Ie=vv`@o_V_Eѭ]EGxwG9`eE)##Hs%|n!qg?!T_#GNӮ>i~b5>GioPKc+#O [ɑ=W^(WkRzE-{#S)S잊kta\Ol+~?ѷDƸ:=N /ٗ⶝fL跕U C߭NϳQ$yx6~Ͱ ƺ0wOUiAYiJIuIԕ*_j+j 3}vݤ1XϕhO8}0oҒG,/'\Rd~1S5~cdw;l^"y&[d.8t>ŗn@y٣ yfwҩy=TF:?3G%>vot[7:(2y1~L&[-j.%O\f Wۭfz(JV''N*Xe.okUpxeU)6 C4ݠ8rٟKY맩Jv(&3lPNhoS'G&ȹ4Ɗ\dH[JIR։$റb89^guob + LЁDe(;9Z*.U>yLw>e3JIαx9 Uֈ6GaX옦>$Ι_+(n";p%y,t3䍨Y: uQɺG%_qpg6=+$q8^"wͦYO5A!ȪYth:2ywS-;wae8scQ=i[&Gg2o ˻*^k#`miYxvr2fn,_M:oĜ96XGg8l[3=_ֳ*6Asg'Spb6Y+pv8Qr׀qLA5T| c1i7qhbQzzēZC^σ|c+J:ڐ ]<[2[ث̙P[p;-ag'M>Z*mcqO9& :Arge !E\.bb$L"`Imqx/ jB\A$r|NkBӷ'0j?< á?x<$-fH/a%V[h hj߄=VwltZI=/&e;LBtZHl' R3xfIn[CnUURD Iqp 1h7O'r=%R2ќI8бky̎ NF("@}JNJ峧JegVuw { ْe;''EWKf5u cI3vLyKhCz'!WE qҩMW=>\=JU&c;iRӆc9p;&݌-hKџN;GR/|j>!Qp(<'[iSåjj-RoݣK'wyܦ}N¡0{}*dzsYd2( 1B69|Ux` '>=}bйj mty.Nu7&[|NQ0y}{+]E!6)-F瘐{I`USH"<{j YqP7"v-% rDq/ BEß%YI v =^̌0}Un580olNG`N)G;C#H[ 'PKpxNPE)K<.Ów}7H撶ItjzR8Ecr[wZz#tP?99m.^.C=Sн9Eک[El2`07#iZp#V=[i}!Xф(zb>t*t$`{<gUջ5=YڣxK.UDKQM*߿:w Ϋ# /ۖ'8{Q=q~aߏ^+1/,RZ=g$ZZXqKe`Ξ %gb/3tsX3]S|_ [YM}:ɇ B][<*[tD30<:piW|č^P#7uɶnL<i`_`3ڲ$^<#w9G{\Ҝ͢W[R¤͂P/{0X&m%5}cj!mU6܏*k#/j& Y b/*.BJPor١5yۅ=!fdؐ5us|J2Yr~lJwebbzƴRVm %^)N*f7>4K,Ǧc.cw}A2 ֏׃}Y1Snql=cdqi3'Fo'E/c64UE|Wi­^ȽM{ǴhOwGG =lL]yM-j(nێ-L&:'Djp~qP<Ya9~J9Rձ}zioʴnK;kg]'8b:ű̋dyYd[7NJX'Fs&ò_q`Nx tSԭ):gdoxiYSmޚ]Ae8=s"JŹF?-g) ygIL,_l)bV{} .0o,X{~,Ea-u٦l3 YF>Xva6FǕ`Aul<k>nm[u~S#2!ًe4dV>5qro0OD}<כ qW;4""pC&yy@RD1s/8v_U[Ӿ'@7{;s3k9I=,m[LF񸄪&eϓ~:?`7@Sp/FҺʴ޿]LW~,Qf5į4zc ^*bv/zvU8֏ dzr^-hcAQm|m w.Vh?;{?J啲ګ''^4gv{ sـYP t`1MW1%3LL ڵce,>'e+Xl;OVg   %cqb/wj| M0uײ!GYE \Ģ:sK܋O3ުI|@3,l˻1ϳ^m^`| }J?5Iٗ9c{1TΠ_wQKI#%Ƒ8L8,ֹg?I3#Sco/ Lb!voVLJ\ڍ='{΢`Q_PR>۳v'`њΰMJsqqF52ѿL2$ [DLmCxl_<։2 &ɼ(jpoLɻg % t - rVRXMF5S}t{͠'_{ҙdL3?oJ_Z#{mPKݴzvڕ^[^YA&f/g5Y3q$˷1ͤs0 jGSS/{ƒUĒ&z0{aM.Io/>0Aof> B|,<%^(M^f p1'GmljG8e-쟻N^ׁؠ" 뇤E/E\ț<ND2^Uˠ\XM${AAIA.[-%I*˦cS΍$nPr-+[+OsЅQ,jFǕPbJcs9s42iQY:vz/{܍6gX=qM+fwձqXU 8|V9ydqzZE|^VՀ mf~- mCx)^3qAx쯅kp8A|U.1&+1lwE SL/WJ.;GrNajJy(:!s7VāNpOmBj 3[v8wߌPSL6ܦ.oX2mq&7y!Xy& 'd;υ\XU+eٕp_[')Q\N%Πr;wol;Hz|H}Z+E o1[h|KX3ѧE%4 v kuh-3?}ԢwN,u hVF&_vDPȳdjNb }$رޖ}t(RDxDf!eFc 5"*¸ >0ǠD'ŹĜ%Qb,M:7/"R+ϒY\ s!a9\)\ǀTݸ{K}KeTTbפmR5K_ːi '*'ǒχm5[&y,<:. V|֪pHT$XcEiN"V>L7K.2cYE-y%<#'JK*HqVqO|v&x)+-gOYqwh 6!apz. o ݑsc,P%I ,fl>Bg Ÿk '*GNzH L)~R}9H|{r`.>Ipؒ?T^_p bLl9={#C&Ԡe疉Sv ktR>[)бk9r887:7Od<%oR[ttgpuֽ@\jZ4|z!b4QM ދ {MKnO5i+-˃iKXN_;M-4?tFd۟Ϛ{,o'}Uݗ!ݑKaQq-J%hDb_O`c*~`Mg_n-.o? b-v:?e%la!׮:ۦеd"ϥ1%Ljťof:xH xn#T#>. >Yr][8T]=i/i+ϥWeJȮ͂pXǬ}^&բ"ȝ5RSu %!(L|W38_5 PnucZ'܅IBI~`I+p S%$'@|f?~C!|%X^n ~CFh ˮ "]"z z}z"# }C/3ɡ'?Y-鶉_Uυ}E&$'HN0z{϶M.h;3b֠7X{kvG={Gn™X6+NL0K7(|M 8p!/2X ;Gn:A7Ӂa ]w9z3 qyuUj %C9Rz0sH9RěYu)Ӧ'PhzԠ{iH$9xH϶Ԝ(q=_)Gs̋ ؗJ?lf+Q4nyѕ y ~}`o1N(ҙcބhZ{[ξ`g|R/p[7h؋󱫳 Xj!yT5{w|{pq8w0la\nG[i䒾!v64W{= W/L~LnyzisҾ }K{)U6vZ$<= 75Q Q|qTz0[JY.{GiPzĆ\F eQ4YΛ>3mfcb )ش\$Gv7G!#e~~8GuLW' yzEǩfv.FcU `.05ɅG0c>Lڱ36b[_?W,DR}crtz#q9NBXDC~vP{z-sNԺ2%ZZ9t|./|Ev3m{}+Yu%4"z9F4=~(U?tD:UI&9?scU0J,`\G~g.fxccbqǣ8a˧[c,݃ >XUv9R%_3>G'$AR6:cS{H3lwz;\.+esƇ>tm2 IJZrp>28d^N¯R3W݋TD*;X)U~V+n[)KvchI@<3Ç|}3b1:=6gO07[v'icBMb.>^~~<.]k8&};gL;j,'-ɽ%W2äu>N4 :-\~c.j *?R'C/cYF4fdû+D).G2}֋EMP9MC^cUZ1(hgG1c 8anpZ_B`P!̲0m%,ގE/wm?th]ĸc1q;i̩̫C4M]/-;UZkxFi0IS;4;=F93|ק>Wghs oӦ!6[ts%zgS[n.=3.z7.^7.{&Xr;c^RKAut:ӠW{s5/1i.cI'[9u{;\o5RynTsxONa%?2: }'#\)*~g_cXvX Ξhg_ moVk{=ٲY}" d<pރ\rş,Иݑ' ?sӯ!(蘼rc:7K/$᪴LQ; 7#fBട%VB'o CC1::uduYsq-z_"Bg(L⼢opR]8O{_.veNJ9eXtԲ11,{7 "&I<4-A8?'Fnq71PgbeDaesg* +Ű[b\p;Üu;<2x-^bt;cqG߾MԴ]sVazlٸ܆3i8ڲ G5akz;,Nc,2|ءЬ܁m)\Iz)ҒՇnJ';`x.Nut,/]\EZϣ 'ESRgLg5/OkWSty:wK*Qkfҟd˖H.=#֗Z'y ~nVBk-wn\͉!Quq^fbN 6fXd6S z'ϱ؛bAY )3n'\nibـ·ĞMc'vyKu+eN 롬GjFg|2ŚKQ.ck\W)xajRRYRYսRinh=ksßc[jLmj ,(f5;'hO ^&cFg\訅wk! o/ Q`HpCԗ36|\L.B>>t>Zҷr,9o%;7}-Zp->)yR׾r4J7ui5BX)O)!v?bzh Yv= ܡ6A֦Շ'3>&dr8%ܕ_}3#߂X3[*+oblC 7F9}OfOy!׏}ܾG%cwD?ݴh9hoz]>Nf$zEyhSDTt; XkCyF;OgPc5"VϿA8Sdlսj̧}+RʃxWF6T ~.C|JDZ)c#V)Ddk1( [5.!S*:G`O bRdйxmnbva~c51.qf1C5ȅmg/bExܟM}պ}.Lnb}^2 }`Cؽi9|rÐSw n >])q j'E~[_ 8 S>/l6.3rC_s'Gr6MN{,'+? x컴uc??kQ~-ΏkE_ze7綆žFTD^"0|qbQ{V^ >oaVbA8OĆ;-5{*|8VB ,#^q9NR}ߑ~^P8*o{՚^mnbAf(zM #1M?+qx?9#D=nzmaQr쒈#^EO~ՏEݒEoQXz)SX(Ko_H{Նvh0_K͐k([A{q6X~6d 3ԛ =hEp_4XB_ &X`KKb,zM4_*lV=Bn~YC"C xAx`η.ؤp ^#X83 ]&|K5Ǐ#nm\>~k~8^oZ7(>N+FּHDψ7Fϗ@ٔڠ$@ǐv3 yt>I iC%/a1OVBq!kzRFof;ap^0^m8& "㇄Wa ^~(M>kh:y쓱{D=ȼSp6BJEZe.z?yv̄:ѱb44NkMmGsuMiagKZTG ;YB$g{^s$9{WyOڛ)7a]ʵ}<0,*$z?w)LGuPכ~g':=_C.:}V[`9nX`}u)<5JMYYL dbb1.J1}l%i|I=r33`2??3!GW`ʅjӍ޻1_)ʿ >2CM1Goome,'"lBr8{0Fj섅.'0(~z"4mla؊8=nX뒂XxZbe*v<\l]O߳ۖ4ܱs"4bMŭQo'oڤՀKдNZ4~@*^(؉v\|<=gd>_pcbb5J>a/z)Bg2HB[#9 YRVK\fi!8{%S4,y !78 =~coC߽P+!u0O>d~f}vF#U jz*ݐCwiREz,G_Q3շt;Q:c2=bCo'< /cΐ_rCN*=F\-G$OUX7ذ̙?ɟ,Ȃ 2هUVGЋܶӌ ݭT'%W%7I"6vBs.n0WbU6uVMsgZƬ?*V1|^&<`Qzeo:.4L}{{pF =/1y'u\ 988Q&^& /Spl#gn- *ga)[đerb0i 8olvlˢǮ'@Nװ ww0Ȑϝjkn kMWD̜ ㇐X=\&Mx^S#xc[W5x?dziD\@&N[x䓊f:Hc@c-k\o]D}i(湶{hRLj3/"tuoYo{R+^e.iz;9r:7͆_R}QӴ!u4 9J#5vWWI?k+jY|Pb>2d;#*:@ k` ]Ά!'absYS"V57}d,jA>e,ݿXO E^;[U D/u$*{kʀ|;<)%w?# "Xwd?bB]s,s\pix.gFĝRqL"IHb4^b`Grz[9!Oz;;pň\{egwhM7Qb}eމ+0;Pͯ5мeϵ<4%מ+d9 ?' QN_g¼rt'8 Mh0bfY-:N8W+9Q}:BN&e2 SvJ͠2A~zerG5)%!Nc>F仕J%Â{{K ̹-_m79NBLYW",aZ؞Ѿ,?Vn9 2L !Pe&!Nh4k+iv `W3>X ܹODc*-@Y&e{r`س;EVb81,8O*!Jy5/ԖXಙ.ۃ+!'ܱ•1"> C)fh4iQfXwKc^vL?rSy<סnνE5趫} :~kڷ33G.%'J| ntV^UȽٓAaҘ<87I#L#K'd:2ub.D2:oI +3݈DNĆ\ SE wIH$}ItURMꯪ>G%ߑoW1MEq/?&r$Y[<-)^͙~KR+ZpE@*:?JЅx[CA{/C\ήD6`q:hgx j3:}"G]~Lm'cȈB=N%3 3_(Mm9{yb%M\+xaeRY_üoW% 3_$b²!%_YԖJVN? -D)A$3k;sLxKx$N0|ZtL^|_Jcy?OJ1LLck_Xv&hᱺKsu._.%xn ݤ!07|o7G5σ4Ht )Ef!D*4(f!ͨH$Ș̤dvq]u{_k+ޟO>bmVR{EԂ}I/x N݁3 Kp{. wQ4toDrrQ\ W[t5]&rO,w(q5/rp{r1-=wDs;7zZ@'uWFFa <V `,πdOn^G K$J~pƢ!XIAFn& nF.InBH=rU_rٽȴޓb3&^#ԉ?rC+ՃaܲC5| klTM '^ 3g-`~땯C毬>oр>F 2Ur,ݩ/*T%8a8joCǾ/8pc `,!7Ń0k>fhavfṭ =IScxS9ǘ2ϓCѫFtS=|QgG5\=4Ub=dMnOEJXU߶YlXa[sS1&ػ04 K]:ՁG땚 c-6x=hg/{>Sϓ|?9@r]g8.kK4Ko^x;@zঔ~i9q|@0.|!g{(w=C:]D".:(K4Yl:wOhLc~̨o~¹igxo(cyr|!*~lHȓșdO+2m*)*z/EsJno m=~aT7ۇ>>`t"LYų{aNEFx]E -y=%;Nwߜ9⿃Y͈.(l)ϗX%c ʒZrwre+mhe9^':jIhR:'ȣۼ^NG˷Mߠ㤃hɃɕOIy!rE3>#J \bEPAYRO|Qxq-}ܢߵy{Xϊ5k-捪~JxprpBM<7yP5nz 10 "Aރ5p}~ S`=pث8խbܹEPŹ})p/q0Fwop enմdTf3ٌhቪ;gp?(;bS?`v0t=!rsr& ΋ѻVcD2k#z~PXSVn]'wvyʍl5v@HҾ ȽrG@Ib8} }Bph}^jAj;>x"+`_DMv?֯x5 |4ʁY09,LwOg%ٺ1|7~c;E_ؼW! Lx2hI`~+ϖa`rV0{~R>'LM7x^hΆalsаF.|=OkWBlUo6^V7(Il_4oZr l jnf6%n?&ZY1AHz?'r#RR r y1y?|v>B(}yv$lޤW ou޼JRf;e3i?G?!5d*fv917~*bISGqD0aإh; ן q'4>y4ƺpjwit=z¥Zt!8?)`ײw+rmPj4yJ=ߨoM2>vaoz"9/#C }4Gѓ>ޣs!M||s'4{zuh5u)Z~a/=BUTp#uz-U=Kx zq~@|/yO|hO9 \^E> AaεL <\G>pl.DCϔسKZis.;EzsY2:׿P5laSM/p׋kE%B G9Qo{xF6˷Geh^"_MGd].?x|/|ߠC|qB.?)wvwKu'O~=.1.Gymin6y4y0 $l3ҁ˃ߒ}SitF j~Ժe55X1sO O\R@qX[{g[Tf+jSX yĺBQ:Q=c ʽ E11* ~^@=x[NA梯+~|@b{Ư~ Å pZ5NIcr*:LN#G i/M#oA@s͊gTm|#Uz*;;X.N8q0EXfo?c22pQc<~=.ߙo ]g[7<8@numblH1ݶarz֘dYl< 30R N b4_cL&F>J!|w?n}%M[ Úwe0o @<6hY$p١4Fu%!Ɇ3ܲ'dXn!|R:^CN WD J UBm OwG]bẓG1h+UpT7a.Jh] >ߕiv78^viĊ5nub>hHBnr Ǔͤ9^5.7e_41]gCyOT~d+a^>a>8ݾ{]=c9[~\4gS"ߏ1w=wxZH2bCω};(gsb y *#1`J>{sй|t(sJ*7ԃ]01ET?aN1aF`2K|D"ֆPu BF!3u@װg# Fr>͍mUA7]g+\.jɡ,>Z6ÝMBNH-8#c#nxd8b=XVKt1Ӎܙ->Ⴣؼ΃Qx_i,E,;x/XMųPeߊcb͘ M>W)? ɑAb>ߟ8o#܉nm7 04,{Ü(} j{V(=UtYw5Źf<{݁Eps_Tɴ0"ưwnC ݐֆ{!m[.j%yQs^:PB{5^Ds:g$*a{^pl/tMF+ht6K~F ϕ([ kJVAxl^/(V [\o222ލN;T/Tre7TUTu?B-az*Οw]3MJ1w׎dt7app]\{ٯe3Fm0^j`Zn(ffŊ&[` ]gD\mK^X7> )o>^{u74R:(\³bQz=KKs 4ɔ+6LЉzbq'<_",&4E54c#6OK.Ҷ Vv?$e174,O)@?S79d3[n.꘎1(nez';Gx~Uoۋ/ey>~4Ngޖiu$ӑN͖uwJf>@frXEy"Ygו2Gd2}N14dj:66O|>X`NXpO]բUAXwl:w|P~0ۍa3}ý1f|Gzez'Fuy(|*^uxݣo}bsp|B1y*|d-j:,g"=gŻ"u# % 0B'i~m.cso@NX+}"m6|GYCѣRRܵ&'e[gi$s0h3~cы(N-0ܶJBHr Z1 o7[5@Ѡq{б8p6Jأ!p$X;K_&ⳤwb/{ߧn( KkElS?Ӕ!zEN4v!\0ps5XVzax*.`Yx=1++g!Ω b%+X#XC6L3C@?IfX&3~IfrMf:"CfEf2WfEf.//3;L d]<::o!3X9_Ce3VveSL&y/ޤ4M{WxfR,*vC&C0rs^2/@0alVVM"t؝8& %'Jq+w Ջdg)]1v?|έ‚~x2437y-Mǫ|8^cZ݃*y|lPRv?%\ ~Çcwxk9<' M },#ftN)hF؃ b29B|1jHfz)N] ROagO^ 78eXUW ;f]^=V+f.xC^c|]O씒nu鸆y^_gʗ{B V0^g_ ڎ #\ZU&{_ԇ:]\(S(p"RiGN&kzݔy6ߐߖ騿i̓i|J+SP)+_)[1?,P|1gyb*X=9Y.xCZ$W 815^XYN%ܰüíEmP~zT۲^D>h;hS:n@2١Ӷo1)lG&cd2^ayLEo0BX2OŲ5x.߄YS>,vkY8O=ݰ s7/x J}Yv쇠#/̹6@Nf;Hb$aBf+k;ϐ7;`[t廧{ Lvw[-Ղyv}^j(+/u{ʧx*I152uv7b}O[*g+ۓfLyPĹa˲dX.Y'Z] {(LF$tpBr-Q dzE;o7yE&?$IYU.A'N!j~2zD`r9=<ErA3UV\#5FZdbR2p$q'VO+ۈџ{D.ΘW1#L6sJXƥ\ER \#Or o6?V_o:̫I;E1(| `Gx:cCR3ثL/=7|b>=_R|=>^y?hٌO|*~M3i3|K'|&6'ܻ33DVtf3a13 LNc>"r ZN9 k 9Ѭo;;X0ܬ_O@X7|5BnMHq t@mfC 'PMD8U~-aɭ8r*9Dctb}WZqF-ڬCcȐ Vl(G?Z0\t1lCn9׾iqw5 ' u,C[:ۗyvRhcqP;§!]vUa NsWyCٯɭ+O[̫ u*kx]yY xz]޾ɉUfx;\޲xWyCOָG2ŻkFɍIs J$'?@VEU޶܅!CvF!GP7(40a0<c?〴LޗFM۩H6auľFƿ.ʭȮI_!@NȴpT+~5yD9ӓq&'2\G.[KYatrz>֯ pr7܃N=FLHlLU ;\94tAg|k>INPj\C^!^W^{ʈK%S$f͉ۿ6ط)=Y %ס&c+rYߦ=]Hʗ'?n];UZ1rs,WUx9KÃ0{\40=Wkxc~S̳me=G[Q~bۻ-oÄ蕸p 85+5.[q-X2 {1î WHc;aF.(yh8IQqᦽ04Yh uubOtJ% uOK(hn Gvljы1zj_1Bqtk‘㈟7p8uU _*2 z`18<Gv8?<[8;#TLE}pWG5tوv@IV"zOt;},g.ӯ0oK0{ߧb$QJ-9F6Qr$Vʓ+mɃO]c>9ǜWr-~:vo?7Uw7ӺÛ=n^Zq:^^3^5yթ . %L3$D-YNc؏yl޳\gK? 鉅~epT&}a>[`H$Rq˟*2{G`QX.7grfU\cѾ4L{49W"믒ԐmLQ1*8pV&e2pTv D;5O#][}dx}lK0N[8@KX}ޛy9M,+~ܿH麩rL?.4P3 ypknb_`[.'K_zc?K4ON= _Zfڞ17&'}Swco=tm}㬷` F>Qsq 4#bX[ y\Xn 7{ s 0ȝg6]jY]x>/H_}BK>xOf`Oh&ͷAcurL쥂_"ɭ~yrTm'䧗 /gW+LC'2*o:haˍq:)oajNH´>m igQ>Sâf#X}{lt!; !đ21yv?҃6ޅU%L7dv"<&zG>w!?ժBm+; DmC\58cxWСo `Es1\Q̥2їk{x19"ʑ{Qf=Kx=y(r5˔3 h*pUrq]8qvzo2PggZ{.S-~O "5g5ƌ4~l)f؟w܉8oƢ DX-]eWTqzu< OSw%lRXBs!]Xxj؋%U gn~0qY&,c~1CpwlfG,Bqq 9NV>nl7tx'1Zd^*4t*Y*l};@yTPHB2gK`إc1t!,0bd:(^SU=p\ÉءVԸ!㬉eعL&ogE}wWikU9 RQ bz@M<N>qL FC5=Z{&?æ@9>>rpo-=Bw0ͳ.Mr7d)\!vWJ䬲'Xω\4x4q}8i'#ܿƓ^ngT4 Tسo6=LhA_?!#]XO55d:2<$#:`ybg-sVs\\]ω%y) Jh ݶ\BD^44u32E}{%s %IEqHBNg\ZEp4(Ş_SsOzq-9kGLsmCkVjaSq;ۿ?W7;zmwEd-idP yTԝU!VO90z.P"dʂ[{;h*$L D{iSYNN=]шn#SvW}q\jk21; xPc,zvBIlU<ӿU%9Hn0xi)^uw[70l =a%nFƫ=cʵp^jX<鲟PGU 4& 3bU`,>wfs%Fಜ!kY?`Zu?]X Ak{;AXs v#E!rqvMz@Re6Xv,' $@ [6 7d7}.e碯Y{?;3}K' : lqpzQg=:[xs^_!Ņ9y>gtyLeNLy[)۪#pt6JaL<7#̱e.peJo Qi Vbl+wvf7֟b7wMSxKZf#ͯxrhxo7R6 ySβkxXXA',[Ԃ'vaq?هCh\ Z3}gaM9&nD 0n^_l0 `h>I\QW*%-p^mSrpƾ轶GNF-%yeVk鿰 huZj/|4Ӻ]ZHx6`g^6۠qj45xp}EM70|fw+F;5,TUʣQߗP/ǯCQ"\qe,eO, /W ư>=E Tɪ ͹ Q/6&n"C!|rt/r xC|#rf'RbbDJՆғ*CRNJdY ŹOŚE;[4]^2/*wsһy9m\ύP[PF4$_a#Bs6˗nqom*,Nirѷn!LV8 ֨.8sLXp͓s9c$}vu =qcŞDokboNjRzR~r62W~?{ # V´; }3 ZwF5+ O`Ԟ,%Ń? )f^ߓy>I}8 zu P8ȎB i͂ 1k !n|!$Gn@:Hl i'@FI_ 5#!' !O]8 0h^*~ yC!{},ϡ"g^Oȱvc>y(']{PXkNxOw<~ nsq3pWyܐwL YÙoD-ΝQtst) S.;h=NO] 7fNPoH90$m/PȖcf/ۇyeWF!?OL8a*,< +Q/j(lzqzlV6o ;g(IwCe{%"2}tEկ8\5ׅbAj\å6a'D/E#z7oIJw>{1h#Bq v"oFL"o.cQX4IOK3 )/0zk~4ow߻l )U< ̔<~M6H'|{Et~5{#aЃA$f7bՄn"dd81.Z5*ۅZ͵<RUE c>B>K@g \'[ t_CaZ908]&yu7;+k'?m,hka֌rf е" ABZ5$m 4Bzv d·1LADM( 4I):: 6?$EtT640Yy-8g&T8p!2L҄7bZP. ҇:^7sô:z=fߨJ9֨2g5G-l]23fJoco6\f2arIeDy(M8gἾAX'w')Կ^- SLÈo021ڌŸqZwIܷ5i,HZ)1M7iƃQ;qǣ1'3c;TX`? (Nr‹{,Z5 âXtl, E`ac>.R`:_4/&tc4Yzwx9>Y-^ ZLPʠ_̻HqߋwcquOqt՞хH>FT]!aatBv9cH[ '\ez[vbMY:e:jpG0̩tt8vNr4}ƸMQp!aB>{^mkFèt=퀚v,TG_hrK(y8a?gwj43>0gݎ`8NfB˶>l>JPHE=y?y3D6_P6"GryDf|؏=@,}c͝(OXzJeD}l@eg(D5y^aP 31N7ʱ(wg=s>MyJ5 SD/9߬x*ӸkNkQG';BBoXD?;z1OXhl? wJJ -n S DoC)kxh2(<'WϿ# g lW/ـ.pNE'0m_g\_>3l'׾ECèp=4n '-wp{p4c(![WY ࡧsy;B5`< B eV9v}ozwz5NkW T^Ӹ6=Z/t6#|moxQ~'N+Q<(*P̠y*[p/>TՋgH&34?`W%E7ж'ڹ>ZXux{/Ct8CG𜀣X/'i^)W&_9w߽M#Ϸ]G3!a&`Qa1T-7`wL;ps]X_ZqIVIJn)hD~j.Nmdpy8 pƆR >a/N+ݿ8.krsz#fn`a lv!LWaêω-ypkzٽi9j,)"%3H'\;:(φ{Ϣ.Ra&`Qi,R>& 1r@wGM(K^ ,w&Lc'Jh?YNj㓢.5VX@qv|v.p78Y=JWB\stJnAy 88*,WK*@֖ p98}| ĵOC?)r\(gK1NٯnP}sx 49 ߆ii: ^X~?|̛w[ã8x-OC³mb^~gRGx7LV'᝷ |pnç ٪@؂/&a|h}S˿S-q~~;oIP)hn+?.NCQQrď@GPy[gDXVYUVbT t Źh 荚;3ٔT֠|DIsрEHӜN7t3Z?#YZc^r!6,Zm5G 97XkoZl*F_^Ł H9S&tU]T`H!Zͥ?CcҞ~3 =>sA{P6Gz)㑈NU=_|pew|G'/ ,$O8)SNOǩ+qj"Nf"WSяGwMt8_QpzҿO_v=ѯU~LSWi7ഀ*aSp3NI)ډ8yK-NjθݧpBZ`Z'nF]8k>GMpLקeGw4ײ^/ #76\oe3_n;k\ źHL(xSZ^eLhf&ľݦGD_p9(^Ȇpt'1W.6.Pyd3J_T}gf.rb<JG,6Ш6 D|. 7- (Eб7_e.̟k {=+_gm~3fi_ޔ—ˁ|q_l68|'Z jIkDhR KK '1.zOZ/o;|/A3=5X%z>m]\}Qh?_7$t' e]߲ Ofcf9~R.b߯S^=e%Ӗ|/rL{[lKEdA=y(O׸<͛E)+My*T7TtF-^(uB?3ag*TD∲O *' t2v*ꇝG!?Qe5\B=`<;ѦZN@-Q>umnԽbz jnڲymFYh?4 )^ԂWHu52:1K9Y|"육?G! hM.f[R{ M;0O#4sfхhvͻnBh^4{-zEr:]cR-{,G˹M!iyv[L[ Vݾ\A+ @hV& U~HsPic=moAt1 6hڭ4!]F}/K^к=Ҙ8 ^0gh'ZϿ4eJ4EhEQ>uC,vZbmJ(v6D˖r t];ȿ"-EFP_94_ٕfhzx-hJcHs.ƻLO4´VLqk1wCShm4l Cs4UCW}QWz{9e; 2X)R$6!OTvH  Ob  2  FR( u`I.$9Lg %D^wdAT.jW?>_ 1 "2t  [ ! ,L>K  M-, z%*/ 4:AAu91e)$!&8>*,Or ~pR  [2Pl^H0$8Pc| ,D\xLYJ WF, x&  % ?bWx@0c / pG;i    f 1$)05;AE@70+(d$!nU'9  *7U 1  k i nhwfXD/  #8Mcz)D_{*I [h  8 A(/r X 7m 0  e   d m ]  s  '.5=>B FG<>s5.'=$ "n } h N 6 : 7wn\M?*  %;Qg})Jc|=eX0 < / r ""  [ $ >xe j $ c 8 1 p M n p%6,5;'AFK!GaaE[KPOC?8/@&%!-$E y >  o 2 WiZLFC6+(  )?Um5Oh9 1 "I- u a68 m d e   d #  M 0 ` f ) 6 ! :"+i4=WCLPTM?q5*%%. c 4 I q i [J FvUD322)# +AWn6Thq 9m@K_ Y  F ZK Lu{ i : o L  M I s  o Q  D R A'09AH O'UV:I !94j 9 % KcH B = q ! l 1 i u f ) \  m  c ' T 2 -0w#,7>EMTZSCh8+`%%G  eG@6xl- 2G[s!<Wr| >9nw    E F 2 l r ) W 3 W    1 k > _ q 2 j E w J'1:CYJR[1[[K>2A&&}#&Z4v O C L e O<b8)Vh   #6Lav "AX` w 8: j & SR   u v l  G - Q K N ?  ' * 8 m   V K M  E   ^ E^ > D[%l-P7D@7HP%X_VD9W*K&&*Nr   qLDb %9Lay )>  ' Wl 1  5 h O G0 @ s v G  = U  >   Y S O J k n 5  - ,   % PX(O3>FNrV`A^L?c0&'m!zxH !a *>Re~( t  t  4 f c ) Z # s $  ~ m  U U f o dQ V N * #y/_:JD5MTU6_dUD6(~'$qT c c o 8<VX"0>Tjq Z X^ Mg p  W " " q e S I a C 3  q D o P ; 5  b  6 4 } * ?*6AJT]_g ^I<+k'&V(K3 #  7 }pP;mvN'2Easf u   I q  _ < g z c 4 . y * f 6 " ; o Z ] u Y + <  | Y%3>cHS\gfP4Aw/'(9 Xe  )Lu2CB*4I`s 0  #  . - * * n D  Q  0 l .    U  Q  {   z l Z  = 7" 0<GS]h'mX,E4p(B(#" 5QX0",;NcxZ c  z e  ) } N  3 [ n g  R @ R N  6   c  H 1 Z Z 1 5 S    S )   ( M ,> G\SU]h$r`I09)\(%wN ; > > J i+P, #/?Sey    D B Y   ` X W W @ ` ] D 8 X   w [    jP gy   W [2 b*)9kFBQb][g|gL=_*('cz l   6R %2DUg q  ,  : , : V  _ @ J ? v } 5 M L K   O 1 M i ' a  ='7ER] h;rnkOA#-))IaT ^ (}.q ,7CYo % 8 5 } ? ]rH0 # J F ? #L o O $ q  ) 9 5 b   a(/  t w"P F ~ M - M=e!#99?D4PRZaf"pVnS|D)/R)* ^y` S .jKS,7J\q t n  \  a ) ) " 2 P J * e z O g  ]  c h    > m 6  j  Y ?? F= 8 $G s 4#2HBMJXdunpVF1^) *| wh Ofd.^'*x$.9Lfs s  0  ! # l  C k  - S @ y ^ : C{ 9 + 7 G   ;  "~M17>/@{KVbmr>YH3(*!$9^ ?68\(Q hr{%1?Ue `  x   u V 5 Q Q ' & | @ e L Ms W l + F K   2 I ) b [ !  :@   8 HY    j 7H m76u,A>~KGTboht%\ZJ94g(*" 5 0jLyJm| '5FV1% j k    ?  . ' y z 0  y "  Z 4 ?  9 4 j   J rY U(;L,Ub8o5u^UKW5>(*#`J  IJg-jx*9H m   ? e  p  4 | @  8 * { f  h  J \ K  + Z | Q y < y6 De/Dec&<LU2b|p,w[_L5z(*n#igk+}GZhw"<9 h l - X   $ L f K Q D s Y $  3 = 2  ( 6R  v$2K;@em~ v3(O;8MXUbpx_L75([*0#p*CJUk{h|(0 : t  Y " B m  C < % ) (  l + "[ _ / ! ~}q N4%n;L8V bPq{yj^K4(*5#gmRpywKUMkf& X    n o / 0   V ;  /  l B / { c #  i / 6S vnoa R8w$=B#8[$$;MVbry]3K52'*5"v N]@PV/ei` > ] R Y o Ah6z i n ; V Y wc   ; R   A   f@^(k .Oe."Ka 4^$;QO Wbs(y'ZI0'*2!0 $+=pWTUl^o { u y X {    m g 5 = Ix p  ] - + K {~@p~Y&<)j`  sq!rFy/$<OXdeswWH.'*g b 7t "Y_PRbs  ] ~  \> ~  (   i  s M a  8m  G Yf?h-Kc|+SaX+$<PkY cvZviT'E,i("*V`[ 2%AU{fJ2jcv  R B , &  ] 8 w g g H5 @ k  X i ~ 4;(Q8cY,^{o9!&K>Q`YyewJsPB*[([*3NF -   q@^ev H u ` @ N 1 e E R  Z s   | > P K %  ByYNH|aMLC^H <dY#K;V'@>SZg^ypM?F(()d7*Zh~ V ~ F j    q& { N \  o 5   y Q D + Hl^>s[l* `K)$79*7~.iYXd)CVT\Pjb~YkMKB:'i('X6\E+gXl  e ; {  1  2 u 3  P @ Se  y~y ZZw}H@-JM  F"<iJB.  NXXEl: V-FG%V^oVdID5&)%o@2 f:m<S]t  W D v ~ * g :  H? u   _DBXM,CZ.>ph9%hmho.0 f&hhanDsR2JY`p[G|0&q)-",; MycMtPc} x z  ( q r  ? " \  'aw lOn H*$1A}WQMU{q(@-C,S-:&3a7Rl[bt}TD+1&j)gO P:e`ZTl ] F Z  ^ f ^  1 R b D x%Y TYW!|f"C=3jBl-Wj 5h*(9St#1#CwRn]rfCzyy[NJ?'&(% Ri^$.dWXrP_q s (   l X 'q239 JQ| m7 Zz g6BN,Q ='-EKLaAlb(P#v$BWa`j)rWJ8%'&b  |# 2k*mSb l  N )g 7 f ? ] 5Jo] n R=@z\ F&pom^ue"5Cr]oS_^;f )F[dpLheG1%'#|f  g8o<>YT  1  0 2 b  Gb* &m>Wc/%w)/ieb/Z+T QF EOqkqTr~B(0Nn_f\v_7[D$*a%/(El v 6wpH~L % B  R ] j ! o |2 ' z ;8F~Tv&VBnX M7K7!\pAldj52 , IH: =Tkbiz|%Oj>'&%( o 17} U` l 2 ) ; w U " tr C q~LM;krn|iqcz#'xRM+[E!1yH E&b ZMCfV#@Z)fmpI5]$u&& K ;yWdv   ' Q ? ; Y N}olK|(1/C31^W*  ;6bK U+0jK*sdR'L)G)HBaLfq_E,$j'!2  [ GU1m) (     B  [u5Mi0:C4@edGqub=nJUb9zK/Q}mxO8~q&LTOw +#1xPbhvyR!@Q&z%( Q YXTBn k   h PI ;3\hM,(Me#~(y@< A>> UHD%0,6wAKTh4E4k !@{Y.dk~ tJ6$U&9&p f X?P G  P'qAq/ t_ 3RCt/ b%jc5:_36b=U+KI2W9R'REFJjVhPa#1j"-/iK "Nn&D]gocF,$'!  @19) K_ >  w WOh+ `} iF''>H%(5JPU\d5) kW{`.Xjua0:NcivR@&c%(8 LE p p e-> R hqWCiY7X!Ub-v"ys =!qd`D 0n`[v;z* *%w, b"9Vfmt!K'5$'_'S k />J d k L*~ a3Zcz|>KM=$j:R?OU%"( !,tO$,/^8(3"%fforgSH)Za&Dw^i\r}m``GP*%)!/  O47 I@Tc{xT^p}PZZUlC!o,.K JrqueS)3?tZ$]Ps<8%Aa$*~'uy>?dQ0Oepm}Q\>%'u*  QX [>.n {nAE<IHyG9M(/n'N`Z^ f{qP~I/1gsqzsE_ h_]aP%=[k*qyouJ1&)&S  (: v&'z"0*v?Kc~=/<_<gK+7u ?nmAF~8\dBFO,?0g/) Z!"71"*IdmxtIYQD(;'+ 3  T y 98w*&?aHW^=Yb9w3p Yk0wSSb2Wx}$!7o""  {"!>!!"7WkCq{N27U&)):  B,^;MeYx ^Q44q0fXf 4#P 6Z*G*R=x+3[T.@%u$.F`Hv 5#" R $"i 'FboxkwbI*',!!8 ^ 1 a0KOX"N }(d&;\;!:m.NwYH- \|x" #   +! !!"6" "!!!3S"{"5HUWl>s;Q<&)+ L <wK.P+{8=  )>Cg0%8oZev0l9v'FIk%'O~7C:# R d!! % z!"1!|""VvB#X"#+#"# 'Cb{ryjk-K-E',[$  i3S;Ri-e`{Rs- eS{QgO1P*XDNUFz$_ ~(nQ_  !N  H!:!!I!"<"{#y#(|#'6X&6)K#[#4##/SoJvmU@f';*/,  KR[;7jG<8$%8t5IBL, G ]Gv X*XK!"6*G  # !!R!"#""#W#(>%+%K'&s&j${$%%['Dd8t{q]M/(<,%<& y%[uuq2/ %b ;_G :l7I ^*hl9?)d{3\!1-@ ^H" ' !v'"0!!I!!$%#|#$$T%%%,$G%'t%&&p&&%.%/QnSy&1XB\'*- J Q2|L`n@h+:+Nv},ZaM& Aw!ln/{"Z t "!G!x!"|M$ $J##&#%$&)''7&&')&&&(U')?bywtOz/(-K' o: j%5'ks 2~xJohAB_t;,J@OMCKEjN\G!gh qXPz'C!"3 !,#R%"!!"]$R$%u%&Q%I%B+'+M+((-((q'(_**)!(0S'p|uYC-'+.N?Bi*xz>(>-| }@/SZ`oP~c|!"Ib7 s!X*" "!d$I/$":#`#'%p2%A%Y%' )9''((`(())I))() *`(*=@xd{bvP/Q)!.&e0  7uB{1SH*xzF`0A^\^5|?<\$P{ QODZ m z!!a"V!'G#%##u$b$''>)j(`'&&(01*)*)O)).:**$**b**1UGt<1YA'+.bk$5zh~d),1m]Nivj9<i!sG,+EF8T ,  b C"l 0!!Y!!"$W%"$$A$(%&%&)'-D) ()))*O*T*=*-++,W+,3+,CiY0vNP-w).${ JL+ f`mp47)pcRj? 'M-R^^|DbNw' #c!!C h%!%!#u"E"?#X%;##$*&%>.x%&"&'R*)))W)*j*'**\++++,7+,&,^,n,.5<^{QY>',B-i ?$N9QuIH<W\W2Y56Oo#|(r#[.g&t! N  %#!!#A()$%#&t$&C+%%i%&"&''(P)b))j,,,0 \,r-8-,--Q--. .K./I/qFrO+* /!!les{J*"'S$0Z gp;q6:K>A?,3b'839 &!jS- !^.%!* ##%Y#G###%X%&&B')&C&w&()(*R),+,9+1+$+a2=0L---.)0{//!//e/|09qb mX:o',+ GpP;|~=e>5Q 0tVfp8Ha)!dw"1~a(l !$8"$N",#@"E"S###$%&%&&E&'' '(*3)J*-g1+`1 ,e,/<6Z4-/-06./]0115'2133qQy clM(*/d 2KE|McOz4MEPd|Z4#wY b^oVHHc!T  !~ "P$%c#"~"##W$$$&U'&&&s'(u)4((.0*(**+++,k-Z/8j60|1j0001M243Z124@3?kPXr4y(.( UKmB+_tch<Qq1L%*X~$X ICfeEO-Ea$  O ! ""##7#!#$G%&-( %''0&&'')+)R)+*a*,.-^,.7.o/Z//T021p222235<4w345|446ZupifI ',>/i| "s%iQ_2DH|G\lYl`JIe!-|7Y " /K  $ !"#"q"9#.$#$$%D%'V&m&F'8(*)V())**++-/r..G.?1/1011L22Z33355(44455^55Izx!L YJ.*0H#DC-dT)ox>0%ETU&J:"- nE!!%!I%v !!#1'$r$$###$$$&%'&'B( *Y+*+}**,+u-,-/l20//J1B/#1>.?m33 24J4)445N6n6G6&6H6L6}6>(hWR*cA<(..P)6B]`BwU~$O;Q|V= El{j[Qj"! #&##"###2#$$$%%&M%&'),,)*~*.x1*-,+,U---/m010@012 354X546556w7]71778s78:&;WTRyymV*-N28j(lxv%|.2HP)gD1$  _"-= $ #  "!!"F$$S$9 :y#$?$%Z&&&&(),,f**+3,S/-1,-0:./P0d10:12=4N345I55667T8b889*9:y>9::gGvWsBcb6+2')k+C] vWe =MkU<-IM(0D !  $V1%9!!""##$;$x$$'`%B&&v(E'((() )*++7,k.-- ..//0Q232.33"366667D<4889>::Q:;<;=<;>d +nK*02LDueb[lMhCW3]<f(hS q !p!!!u!"###%3#&%&( )C'B&)y+(J)m)P)***+,]-5..U.J./60 43t3424#4745~9,;H88_8:@::< <6=\>=b>>>B>S:_*/"/5as_ 3iwiq;QS!g#T &E !*K !"s!|#V#i""D(U$$#)[($&u%x&.,}''*;)*+%*+D,$+0+,h-+2/i./0A0o123\334:E857Z7t;{89:<>?A>>> =>?WB@@hDHwK yi=.5TtH9OW!5F.'Fj%C3 9"n"f 6!!a!5 !"4#&#b($$N% &['(v'&)U*.c)*U*b)*,+-#---.////0]11Y2b33u4h55ScO_7U;8:'89T:;<?#>>g@?N@@C A@ABuEJwj(duS.5'v;O::4 (u], 0 MgP%?#7H a& !B!'!"!$#*$(#$!$$%c&(Y'^'b'( (10+m+++M4g0-{-C./10T/5233e3555*87Y68~9 999;@< =FC@tA AA AIB CC]DG?D DFFUlȟHf34g|B-&< =T6k3xr&/"]6#! l "J#?"!!%##K$ )%8%%&G&'']''(3){)#+-v,D+U+,-0s.e..0D1{001243J4_466!87789>9:;-;=>>$@AABABEFQDD;EG6E EFGMIyxlrB3@'(Y/]U2kZ S#+C$%"6~"  =  !"!"t"9"##r$$%&&&%'0''/))*K)(()I*++,z,^,-..,/1q0*0022O4P5556G6Y78S8&95:J;/;<<>@\??W@A@ABDHPIEF2FHfHFINIXLjk}IW3zCO2GV"z92 :KIV U5  ! !e"X%&G#$$3%H%R$%R'U'm(>&'))),V))*7*d++,t--./4.60024=33T4345K68 79?;;;<"= ==>@@P@ABC=D]EIEG|HIHKWKJLLL]`>=l7B"vO%n:b(S. jf  b \!#!-($(##=$1$%]%&%r&J&' (\(o(h*+-*+U+u,|0l.?-/N.//021'1t24F4x5.96=7\7 78>;$:<3>w==? @BaCBDDG|EEHSIdIJ#KJKNM#MNOV+ͤ$yJBt.>FU0mLp"% *%%"" `"&!(4!$#g#s&#$%N$1B2(&W(('))),f1/&+1,, ,0-20?/60}552535/646 Gi7789V:.:>?@^CO]H<FCDG"G@JI<HKdQNLLQONOOOhRvj˓U+M~T<dy&6e .ooPu " j l!!"#$V##(%%%&,+1*J-(&((*.*x+q6 .,1--.k.4>4 01#74h334,5877u7799<<=?R?dC?@T@A,CEyDDF4G'H[HJLCLOP NNVSQ"QXRRWl\Rfjsiz3>r7!9H rW& %  K| ! z#!&#"S#$y'-&'B&8((&''((x.*h*-:+,z,.&.9.q.\01+650 0165dBhY}uf ya&f O)1 f .mY)<a".B|vQ!#!]!"&""#M#$%J-*%&H&'T'(\*12*P*,++,._--.:/./+/111b24E?46*7788u9;;';;=B>?gC@AACCE`FF'GVIJJKrLOMJNBOQRSSTWWWW6X]&\M Hѝ:C'gfXE(^!u  !$!a!"#$#$"%$$$%&&m&''Y( cB)+ .#62m,,z.4.//40w00722y@D5 8M767s8{99:E3>F??@%CCC FEBEFHVHIJKyLMyOOQQyRTfV/WXXSYXZ9^a\Fy l?_|`dL>;g#s5S1 '|  5k "U"#i"~###$&#$%+&y%')2u(() AR0+-~.}.I7.U.. . /I0/12524[44545788K8|9;;=>4=BTCs?AACEDNEDFFGITWLMyN1OQRS)T>UxVtXZ?[*[u[b]__^_xpiw fPQ& w_+q P(` z!! !:!!u""#'$#%%&%%&'*(7*,)a)*+c+//--./0)0"01852Z343456>7r99f99:=y?@A @CECG.EGKHHQLO+LMNOPSTWXXYWYZs[.^-^*^_ab!b{cKel j ý$r`5x>f@,4lhY$$%O!!D !W!"!"p"$i$M'&*3bJ%'J*&'@)((\)J-*k*+0-,`-/0J0018115@82357b;i6878~9/9;<0??AGBEB`DqGFG GHjJ}KKLiNNuP{PQUYW[MbX6Yx[ \O^/aaacDcdzefQgh}ikRcVYD =#$f! !S%T#r$#o###$T(%%''2&+\'((P))*,+1-1AZ..?0:0"0l2412W44[45P557c9899:;l<`>>f>?R@AABEGFaGIZNdLONGMyNsQPoSRqSXXCYu^`\]_a*cbii hthj"j#klmU2"'o.yNt#cN#3 ?" | !g#U!E#""A"5#x"##'$%+%&j''8*b((*r- *_++,,s. --/@/23C4t=273h34586&6W68a:,9<=;9@[?H=P?+?A@MDjDFF(GUGHwInM U}̢ROPPSU{TxVYfYZi\A\]`cac/dfl[hAol#lmn;nozց^qDUL"*eoU k![" .n"!E!"2#""$7#$$%%+!&( (*(*)',N+*+,^,0P2./ v 80t1q23Q4555+57789;;<<~=[=>@8?ABJQGCGFyGHtIunVL-LNOQbR6T TU WWZ,Z[^4^`)abefh`jk kmlpqcr4rsz'Їh  XpD"=U # %!*y"#$G<#>"J#"#$$N$R%&%.z&' ('(()*<*-\+,7,M,.0v.0=?12j3414349e6789A9:;<<)=?=@,AcA)A(ByBCEGGIIKKLN O2OSqRTFeYYWYY^\^j`ad{f5egEklm'npFrSs xv+wv+x%b$w>Dr?C[W r #TQ q!_!!"$(%g#a#]%~$7'W%'(&`'{'k))$(++,+\*;/3/.-./3/12 2p231;5;=6928859;P;FB<=G@DAsDoBNCDADEG;H JIKrLMROQ4QRTYV8.kZZd\aa`Yadh"i~hkVr.p>qqstvR{(xXxy{1N*:u"L a  ,!>'""#;"$##`#&&)&&'(4(()')+++w1 b-"-/./?/C0S13Z25M345]69f7:X::9:<~<1AQ>:>0?AB'CC+DEF/FIDJJ6LOpNUPQYSSTUWXY)Z\>``ab cdj"iiJjmpttpvwAxy}|@{~=[qFo 1Lw" c  "!$}"e"L#%"%*.&^&z&J('+(*-'5'()()^-+w+9+,a-76`/010E1Z2%23466z8[7,8f9CBIm=<-=>4?)?AAyCEDE{FGlH|IKKNQNPsR5SSUVYZ\M_b`WadezehikKl9mpOrtvPw|y{|~}0*#trZ n O2 "4&*"   C$"""%K$y#&(&(+)&(*N(P(())*m1_+a+,-*b.///02-16M43M476<<}?9<;1<\;<=G>A?\DBACBDJLGFGH+IpJLNJQSPPQRUVY)[^u_a>befhklmnq6s&twyuz|[>"ވ1z8! .$#D:!c"!M !")B'##]#%&';&x+G'-'*(M''*J)),*+<,i.s,-e-b./&/01;C5s76e455,7t;9:4::;;;<>_>AAB0DEEFIaHJ3KjKLLQSuQTyT TU[WgZ]h\\^aadTdhihjnnqKqv3uZw{|~J&.&| n6 $ !- !!P !##5@%% %$'=(((&'''))}))++,-7,E--7.d/000222405659?@89::<><>E BABTDE]EJI\IIsJKlM N&NgUQ<RSUWWpYZ[i\^`bdNeJfijUleoprGtIvuwy}SL^%ZY-ܰa \b EC?0 %W* B ! !!o(#%|#0#(w'%m%%%'(V''(f+*Y),I+g.+,..-./.e1P12a2944556982989l:>.;=>:> ?PN AyACFE-HGH`IJLKMNOeQTQSnR^S<UXzXzYZ5[]`^ab;dhghjClpr@sv@v3x{}V6Eۂ "V|qO)\%"~##!R"!!$!_#")"x"##$$$q&%F)HI'**I(,H)J*!+K.+,F,|-/54hf.1`113|5y345A5:S8:|8::;y?=F>A@DaAB_CE1EVFHMI%MFKNNNPQRlTU|VWYg[\]`cfefzijl]mo]tu`wwy{}(2/mb B_h%o-4!,F! "X!(!#g"P""$$&%Q((4%'-'(()H+i-*}-,g+.W-.v/0 /1*Y12q23E36.6g6d=o89<: ;;=;C>@gAAhB)D`DFFJFzJjIUO`LM)NNQUfSSUVX#YX[[_ _gad deglammo6qs`uyys|~o9jE CubH3~  $$" !",!c-M"&|##i%%%('&2' *L(*I'+)m7,*e+-++-. .Y00//1$13N584?5<628;:U9 9<;[=^?=??AD FBEFICGdJKKM1LQNOQT"WVXXY[]d^_Qbc\eBegil6qLs qru}xzR~j,&8JM>5O: Z!Z$6 !'D!4""#d)!$+$]#%&%t&')'q&,l)|()M3>).x+v+.k---.1031224'346;67}889B;><=c?>CCG0DFcDxGGHCHILKNTORST8VX,_Y[^A^>_acdhhkgo9mpMqruqx{-|g/S vz؆;h!  sg @!1!%!!!""#+#$H%$&(l%&)1''K(())o,-=,,,...{.t//3H2=%9u94586M8389E9:;<<>AyE5BE3[CEvFxFxHsI&JLIMMlPPQSVUVWq\Z[\^`adod5egilmo{qsu1yz|Tpoib_QTpZ# #I#RC a !y!#<#!##9"*$w$y'$$)(&&&(M'X(8()4)),+/1n-@.z.Q21&/01J2NV6C345585:H9D8;<:<==l?i?BFBRKDFaH=GgHJlKMNO?OQ#SMXTVnW|Y[-\^_a<b0d.fgiDl}urstwyi{~6r %HYg\FSj!N 7!'s! "N#!""##U$V'%,%%'%&&(('|(_))<*F+~*,,0<X-.40.1F0^11`2H36u8X66;>9<;;A>f?[?z?AAC}EHGFHK)MKXL]NPEPR*SV[UW.YBZB[{^%_abddxe_kgikEmo~q5suwx|D}Js%L>fpHJ3K<\fW-^#j"Z"!s#["$#?"# #%`$%h%p%&"&'*'6'x')()**-.R,,/R/7.s/'/1112246769:9O:?@BA6ACDwEGINJJO/LOYNP QgST#VXX[V[%\r^a(edeg)j:jTmnmpr~t@wVyPze}rWq[ F6'QM-# z%S*" "Q"#!"2%t#%$%$%%'O%'k,('(V()*0*.-1@/--72/1$031J13N33: 565k6;7#9.99{9;8=?G@*@v?8AABCF F8FXHK&JKLMNO,ZPRxUV8W WYZ[]ah gorhyj(mpoOq@vux@y|[@#}1= Hy  d W! !)% $h#"0"$#%&%$%',%'(C '*"*2(,0-.,-..T.x-~.164001A23yOAOcQS)U,V\X7Y[[y\^`deof1jijl*loprtv<y{H7PI^0V a'^|!! !#%!#$#%,$%&e&&=&'(.''(C+H)'*+*[,,",-0.00<01423`4M6B6*718d79:v:2;<=>@AD%AFUKJF2HI~LZKDL*MNPKY8VUNUQVW{YZ9[^`c~f7fhiqRm#mor(sv_x&||QN9&XE/G 6 n" " !"#&"#?%$&%1$o%U=n;<('W(()55@/)()+G*/,,k/.-./u0321E9;D<>4JEJ?99C799:<:<">>?qADANAC{DFF G1HKUK@LGN+VP@\vWTWXWXZ'[M\#_`~bcadgCjXn1lmpqt<wQxmz}gStzD"|`w;Ӕt, v!!!"!#"#H#%$$R%r' /}-'''i()4))+*+o,&+,2O/D/.03/0x447F464e;87:9@;:?z?t@OCQBD DGzGHHLKKNQONQQSTyVqY-[[]\i]`c^bd.gNik+kmp"qsvxz}rX )1>KĈҚ!%B!U&3 |# !"""m"##$^$%$*&t(P''('q'(~+)()+4-9", -^--.0/0b012445h7h:X:>:<&:@=}=7=?h@ABE=CDFFIKLLNFNOPRiS3T'V;YXZh[^ c}cbdhgPikmqqsux{&}* uu=#RWr&_mP-.T$ $ !"#Y"""$]#$1%2%p)&206'o'(((7(()d,*g*/q.f4/vG1050A>346jx:Q7789:z:;@BBBCEyGJ8HI~KHMSMQRSQ1V2UR]bZ[Y[]_d_cvcffhj/l[o q%t|uw`z }6CdW:>Cl0-#U(o&6 !!"M!"#$%_$$$$%F%%( ')'v'(*q*)+D-E+,-'.-.{./5g1369F=8%7<99:;;<>>C?W?BD7BjDIMIGHIuW(MNOPPSlTWV^WKY=[K\^_\a!cTdjfSh jlmprtvy~}g[u576]LYêqE 4%,!&"|!!h"s(Q"#,#F#m#$j%,l%&x&}%&('*B**j+)7Q+I-,,-.q1C108:13J3;@5;79!::Fm:~;<=q??AJDRBEGEFG~HKGLOjMjOPJQfR TAUUWZ]\]^`b|eegll[muor}tv{ P@|_ Ӧ( -n#2 "=!!!!C6v#""z##$8's%\$%%'!B'''(3-o)z+&3w,3,m+-/,.1/0e1,3\347%l8?767C; 99:;< ]?OED>EDFFH*J[5mLOOPMT<Q^RKVVWy[Zu[h[]_cbLdezf;ilmnq3ruw;y|a%(yiAN%lw_*@9= 5%M%v!(!#\.4""+$$!$'$%L$%l(I'.(f'F'(=*4*+?++ +,,/u/.0#001v25#l8G6'66tC78;;Y><=$>BrAnAc1FiDEEHJHJ`KM^O P(Q$QVSVV X\Z[%]]_dbdSeTgijmNoq5tUuBwz~}~N3R@_H//^a@' o$#!z!C$Y%N"#w#"#$&$%&9)T&++'N')B* )+*v+~,1=.A///./1N5d25VV45^618887M8:Y:%:;<=@>V_RKABG6HJ MH>HKL8NBN PXPQSTVW)XZ[\;]_sbnceFegj mn:ort~vy{5|I"zPk6!KX"!m h! !$3)_#I#1#"#'($&]'u%(*&K&(})*()[)*r.*+!0C.)/-.Q0/N0 1T:=3656578A=<:t:/HmJACqCCCGHLGMPMxKNOPDPSY!UV_XGZ^}] ]` ac h hVhsklnpty}7NN`h&w\[F,L& Z41!w !D !#($D"#%O$& $)S2<)&'l'(,)*)+*+,f..-// /1\25_3;3466o:j7;\:::=C>qI@C@ABDD(EHIHQIZINTMJPOQvQxRUY/X>Y@Y[]8^F`cIk f"i*llvno8qzCxzo~P3)e= A"7 c u! W !k!"T#$'$D$$%-&&^((*t*(=',~)+*++l-+.0T-./0#/143:4Q38 6<77DR9":!P#`#H%&.'$F('&%+(y')(-'()+,4.*,6,H,-.J1`//64w;34H3H:65`7=8p=W=>;<>d>!BQD@CD{EEFbGHxKJLWLN}PPQS_V*ZXq]T[^N^_habe~ghjml*njpcr u@wFw{b :j/ ܍-)=L 3 ! | u! !L"$)l)W#&0#h$F$>%%)*+V'(])()a+G=q*h+->+--.v/b./F 11L8B23:4767A679:|=;k<==Q=|>J?`CDwDDDEFGMHJK=KMNQRRSUVX\Y_Yac^9`<`c[dyfhmp+ngp7sUtvEy} hU;, $4L!", #!!"&>""#z#d#$$%&M&(W''(0'(,)V)++.,-|.3.//89321,3m9=34w45r8799:Y::;==>CbCABTD{HHmHlIIHIJLrNLO4OQRlUIUW Z+Z\n\^`{achdgkejlnprtvy}%5q6uٮ2psX0,& !# b!x #$"I"#G$$k&k%&:&)&I%&'+v((w))*,,+,-../*3A0b0(23347S48O97?N8? ;<@J?AB[B?CJHmKHKKKSNNNRWLU T=V@VXZZ\__bdefgjl8l>n~pr&uwwy6Oo"u9oM39 N ? $!!~!6"7(1%##$%''&%%'4+))))*+|+0 ,[,-{.js0/Y01kW5?43676&78G:t:;=?@@+@B/BGCFbFCFHIXKNLNPP\RnSSVJXXY\A\^_bddh;hjmznrJt uX~%|L~x]F&,qܘ\sm !:$#~! !"$.""B%Z$#&$'!( %%+,(.[())*+0-.,C,."u0/~3A12133646CV8=7r829 :;<D[=>3FzC#A}CfDADDEG&HIJLMONVTRpSTUVXg[]]^` c3bdfhil1pqr-~y|{~duHG @M7R?I=v"  M# f "7$l$"#$#$~#t%$n&%&)())}') )*Z**+--,,-|./Q//c0225q434Q=789m:9c:;=!@?O>DBAWC5E;DC4CE5H/GhIQyPxMvM6O~OQQSUXY[Q\[^a`bhZfhikmoqt$wx{}v)T^x7g)4= $yK  ) [ #S$O&#"#'%$r#%z3T'&}''''*)*6)S+;-:,,b+/"./6/01122356P899|@<*99:?Q@AAC7D6DGGGIKMKKMP9OQTSVSX2_Y]ZU\ipacdfhj-lfnGpqpsvx z|o <Fg~!IbQ  !  D" #7"-#;#$0#z%%Z%%1%'&&&{'')-(+~,*+V, -^1.//0201223c5568p89D9KVZ9>2;@@@CBB;BWBG EGI8JVLJMMaOPUR!RU#VXW_XxZ[\_`Hbxcf*giloo5qsuEw{k}VSC9.x18x ] ] s* !A!S"Q "#Z"^#[#'%T$% &%'&)(B/#7S*?**9*,'s-/..^./1<5212w356Q7!6;7:Gh"g;=~<>=@Ac@;ADEDFGH6IIfR~LQN6OPQTQUQU0VMXZ.Z\h]_adjl^h/iko5qqsxvx|&}RwO0AfL}(+kA qP!(Z!! X!v"""J$$^#&%#$*%N&&`'&*-.+,**-`+,./.j/344124|746?3@7:Y9o:K:1;1>3==>-?N?GGuDgEEqLG;HGJ"KSaOjOQO+PRqTU\mZ][}\_p`ha3befhimoMpsKt(v{`{_{~d)~@d~#MZ"~ wzh!#%s"  4  !%5 "##'$$#$V$&&;&%&L'%(A()+))+*+,.-./0+0O01=2J4r7845.77p7:=:<5=;;U>BByDlDnFRFsEFYHTJqLMNLMOSReTUWYYQ]ez;jHa=cLefh;mrnoHqqstxryy|:~XPhJBn h!?6@@AnBCQDFFXHHIJKsM9OP}PSQR*T}UVz[pg\_r_`MbcbopxjkmDpqruyvvw}o}O;d 2 .$9S"i " "#q! "#%@%#>#z&&$,((|)'O'([()h,&+*+1//d./>.20211354!3656\68=9;: :z<?C ?,@@AB-E;DDLGH=HHIM+LONOQGSESY^]WY\\^9aabefjcn4n'ogpvoqtNuvMvB{G>t!;X! EV]N(E## $"":%"g"8%$$]$3$2$%l'%&''K'f.3<)F*-.--05,-b.403/0j1 24c44T5|45d:K88E9;<;w;<=>>@@AGBPC{EFG GnIL~MNrNP#PRTXb8VAYYZ[^_b'e%eSfkvmmmm np!prtbyyZiK4~{ 1< b#D!!W#"##U#$#%V$%`&%'('*'d5)- )^-[+t,+,}-S0/..01D112^>444z6>97e8f9<6:z;<<2<=>?BoABnDD F FLMO:KLLN]NRRST0Y;\JXYZ\]`Hbc dfh`lk;km8p{y']aq3S4A  !u!! !L!)!"""$%#$?%S&&*&'5('((-C++P-+W->/p--/P4/072 1`646K45&6|7P6899d; (M')m(++++,5.81J004//20u13yPT4;4a467:88:<::;@=L=?)A5@MACkDODEHHIJ4JzL"MNOUVSSWW!VY0]^^_kcdEfg\efghhiEoxwC3)&-Q) > p!"$0!!!#""#+$$Y$$U'%/&4D'','([*))+l+8.r0b.1/./J.v/R01;?Q434NL5667>M9C97:C;{?@DBcC}CHG?FGnHJKPO^P>QS"VVU>WXZA[\^bdu:dde|efj]LQF[rk Vq_D 'k- !2 E!5"i"j"$M#)>$&$U$(/%I2&&({((k()t*+l*-\+.02./L12//0b11443#E,53466$7C99_:y;z>6=/=>?@@AB;CDQI;IHIqKcNO4ST-oX SUX{Y.`[[]^na<aactd1dj%pZ U"N%(Mn"cgu)C%} _`2"  !I#)"##[\$##8$x$G& 8&n&M&'#'''(*+,*,,,,,//..1\1,1B1554s46:9889;&9N:a;<=7>(>EGX@ACADlHHFHyHVINL~MNtOQ:S=TVW\RX[\@\/[\^kcmqe?6#~gT#B+X*e^j{SBRL !r G*!S"%V$"E"${'2I)%1(%*(i'R')'(**q,-+p:-,-8//g/A021i133q3376l7:H:/89;/;r===C?h?@C CD"CEG=GI4HILLMNQQSVUV@Y^WY\#\0[av7WRSMry_)+mh{Nnj!CKM &!5 }"&j###/$.3$$1&)%@,\-*P(*)i),A***-T,.R-/F1/1 <+12V1i2h26:;5[:8!788k9L9 ;E<*;?>_@b@B@@FBCDOFIHFK O<L LLNPS1SjST/XjWY\(Yg`~Zy _/*'jgd~-+M`2! #.E) I { !=!!"x'$["0%F*E&$%&(7'''((]))++++d0-[-a1 /3 //=/01"1234!478T879789;Q@#IO??@A BD$EYFGGjGKJ KhNMNO-RSXkUHSoU8U`d{[?E^v!Mv""4MUF"lCY] 9# s"@#!%3$V#^$%'*p$p%%.M'Y&&&9)O,),)*,;+-.-4p2041111224v46`667j99:u:>:;>P=#>@??@BBD EgF-FGIwKWLmQJLMOOP$Q:Q,S1UoJ*(;cF> 9#!I T[]w(]&!t %d ".]"!b$$"###$%b&!%&')&')((*k*/*+b+,,R.-71m/0)30y162c43!4 5568u;v:t>9:;=B6?:?:AB(A~BCPCN7GH LL[PKnKN8PONP^PyVut|I2li5:EpP& "7%)LO;vX' [ Y"!V ! -!"!!&d##Z%%%)$)'''&*'(*g.y+/+++,; -z/.0/01}2e32e2446$C>79g9o::;T>t=??ABAKBDVEF"GEHkHIEJK-MM[O/MMfNYP~HPBs<\M%gkG<+xT^j!_x>z#!.%! !$#R%o##$-&+*p'u'&(N'((w(*)s*C*4*,,y,;--/.T/>0&02113339K&GP@88~9=<=>=-? >?sA ABFmEFH[HJIK|JJJL,NX`]xd4a!6FJRm{Nu pE]aCIj [/P!yB!-W!?#a"# #y#"%%y%C%%C$&a&'W)'F)1())j**+R,,Q,,-M-m04@13113&3786:97V89:;C;b9:B; ;$==v>hAABDG"CD2EHGFGIH9PsGHkuMJs.oI8C:n}c#=aA@!!=+ ! k W!$n%#$$&]%& $%){'%''_&({+,-@* )-*,G+31Y. -/../H/0>1123G;95B6568g8b80:7;:; ;=R=^>o?[@CCChCF]F DFUGGRX2|]shM]nH}1~#{%'jwp{ 4) XL,X%  : !Y!!%!"J&$$'$&t-<&%&t&;'G(()c)*J)*;,+1,N-,.1///0x34%345R6:4568H88,9;;<UN<>A+BbB@AD6DDCEEM\c<}JY$QD 1]jg_,FQ ~>wzPiZ5vpu#)1+uSPq!!"# !"""#%$$I(^(&%,`')()M+c+0*;+=,-J-./5..x./1R2j22c3K4845755779A >z@?A=h=f@f@?"@m@AABhEEKl-m,futNU!F'BqOW4nB/_D7!R*w1 9_`"+/ $!!#!"%#9&#$+ .$(6''{&')[,,,)*+*,+,,.../0/1E202M4p4455?6:8:A>?R?@hEDARwz7fimLXgBuVQi;IIE~@+xkSZG6N>C W;`A*+  <  * !>"`! #h$%#%$&=$-(%%&(( ((()+!*C+,S,-R:"<-.0?0C1c013;367L65Y58847l99;<:;<>,>>>Q>}AADsp:{(Y,P[[: gw/Jv a"O.v,_\")2#I } x#"Y#(G#'#L&&&/P%M%&''\'()(*-0,,r+0?7-/1+00,0>11w3=5&D5|4l4676778:;<:;<<<=?zCL1h9rN`TZYQj<U`]G %cRS)W:),n3~-z**8) O~ ' x C"J4$E%%##P%o%%&R%(X)&&^(@.''(Y*/*f+P,s'9,,o-.B.//152c12F2K23457H8_6`7%89-89;:;+=VRrY+/frLrWPibZiJ$ uj"2hj7VM"](A;\(1+; "4"B! [ %!&X$#!#)#?#V$>$$(K&d+k'2&f(\,)0(L()R*+48,,]+..O-./02412312344[4567879";9:::;m?]{TvV[OZ?apo H0XOP(xf V/x)|d)P  !!\!|"!!!h'!)#$3%(&&W$%%'"))5(()+B)*+.+f,.z..>/./811222234X4587869s98O8;@?= 9Fh#wmLSWW2?K#D9{cS+RG3jj]f:n$F<rP(`C) U%&#f%"!< 6 i &"S", &#7#%W$<%:$s%&F('((l)(*3+*+77d+,n,/../2G11E22I4/34)4556p7D68:e7d:;Qrz4?j{q^LWJP+}-;h`^Fyd=/T{mq1)Z9 o%0 L!^!(G!^"o"#9"6# #v###$h&'I&')^0* ,)g(*M,+y+-.a.0//g/ 02;/232339246"4546668 ?\w\Io`PbPX9I+#ZME 8&P_XwK2&DqOLRx( !  +   k ! " !""u# #&E&N#&"'c%'++(:0))(+?*x*P***,,-06/J/d0021T4r357,577N45B5^7+Hgz%Vd3JSQ.$,f_0>vQ 4OH8PK""3{su)y_. %  |  q !M!""%###$3%%&%&;)p')('(*E+B)*u/,s+,0-////c5H5T2.11222364558>+TpI|moTLW@i+1.0f]Y!?D[TF } TvBY9)0`!;`f8{!  V !2!~"}#""F$:#Z$x%%&%&U&c':(''(=)J()*++,f-q-`.u004K500z0001243,334Fayv&4e}JPS1_+0Jw29"Bw|t1|"- Uj}h6! xF!&bUe'O" BU"!& a H !L!"m!#&#Q$$)$%$$%*K'C',('(t),,)h+e+++.,/=,6N///0e0C0//001127 OhtuZEpX4ISE*- 4  c6#w<Wsz2\ % P04U&'tmO,S"/ !L  Q !")"^""#$t$2%')&&&'q''()U)L+*[+o,, ,,-.y.O./T26!/1y0u0<3GjZmzeKLS(4*/T4E?\qL !ydMA'3}\)r' Ml{(PZg!#!"'#/$!"!"#$$s%%R)(&5&'$&)'''(o),,,g+*,[,-&--S-}.. 3`./Q1/t4Rmc&p*Xr@ZGPHp+V, 3-"FU;(@Y( N:d@kDgOs&=0Is:"%$$$ #w#!5!"""w""$$>$h%%&%&&'N'(7(*F-8,&-j,,+,,.#4---;.K00=Vhu*!eLIQ6* .94$Bc;#-/ 4/(0* &<um  U %&CoXQKoi""!%%"'g"#V# ""6#(#%%$$&%&A'X&'{')i)++,X+**,,,"-x,P,-.^0E^2k=`rs[FMuI+++1/?JK!HK6<"&tLTI,/F|n%-eI/p?1%]: aK_ 4 "o#!b"!#&$b/f$%%>%*%&&'(83,),,A+ **+6*+?. ++,l-9zQc{p]d LGO7)w-M4}%@R4+zwX2HE'1* &ir fi1+}4]~?% 'g`[R !_Ox!2 k! S Z  !!#"''A$$%%%%''W'(( ((b**)t*@**i)*W**^+O/C(ZfHzqZTE^KYHa+*00 7+lH-$UcRDg6 "Rh&C]~ x$5{R a& "9 d-R T !!T!!"i#$$&%c$%%7%A%&'A',e*[(<(()e);)()I++ *w6M_lTa=LFeM7(,4;&As74G{YRJF&&LD!o,'IvP 3&{!^7 MYBvcqE ;}% u"+"!" %F$-#]$$$&%%%%^+7*>(C'}("())()3()-DX[avmWaDGIF+9*-004gmX XU]'tMn50,@UZ's9>$ +%/bCPj_  !!P"h###O%$r$%'%r%'1(w&(.L('(((A((6OUZgn]IwDL56#(,4&&  E7kiY"Y];1HZ>e$6j[n[$j2 #!&fFgq:i!K 0$ G!!""$e$"y#-$Z%3H(:$%~&('T&v&&u&'&.',FT]irgSBaHPD%*2* 0/x+PyKRn nWJq`Fc+#/Mb >ZuQcA&F &5o y" . HlgR2o$G z @ !"""'"\"# #($$(&L%%y'P'$&''& &p'f5#N[We~qxZ<FHCZI37(>,3%.^w_VI&=Mk1 W3yq3 "e D%@*l! )RMe#;L5! #<!6! "U%j$"#"##%$}$9$o$$&%%%%G'+?Q8[qwaO@9Fs?()1.-!RbIg"*^PUg?+OP)PCT=SzXfg$xC;P4X+C<Kf"  Jm*.H !#&*$ "#R#$%%$%"$ $r%8%W$$$?(5IkT2czowVgBtAmF&/ 'w,2#\YJIeT9$8  v?9 %l8j[l4C5}1 #BrcK6 `6|f Y|'<##+"Z Y s  #G!!!P#"$@$.$m#$-##$$$$S$-@MXZnoxs\J=D9&)i1+-'Z-!0]^CS;YO~\u $[`3+fi")uSQY # "- !R"R##M"#"$$$##s#F#t$$R$'7H^PcueQ>2?A*' -O1a!I/y r%8rkiC~CGAb-muZVb>-v$|\"eE5"3" K'<.@E`5$#~ &!!/ !&&$!j#p$p$<#"""Z#e$#$0@JWloUC;Bq2%)1'A_4Ct5X~vi a$\%v-JW##i d>[%5}Ge!q n mt"A!" ! !|!"'&s!!"d8_G$)u9EO-bo[[J:*>;L&' .i.r5W [d-3\i08 n*]pstH!@un#K)pi%3ALL'Cuhp\"w)* #n W#!1 !"s">$"W!"""&t3D@HXAifc$N<:w>+%*O1*#n>4/{oH%yL1T4e<%]H%YIRf$ D*5$-!6s 7p=l 3  % a !p!7!@!1#a"%|##e-<\C;O"`g(QB`7=3 $,'/D)#aBwJL%Yr\u#okrGgO",f]-UL>[<[>]! qV&!9 "."S! !X Y")%(5?H"XydVGi698%$+\.+^8"bb#Q8);6O0&#.h5v~49Wk9\!}9$*B~`0uuUJl/&]o!2B;H ! !$0:;BQc_d[I96:*"'/f$7{77m )7w;eE%B_:CTv\z~~[! 9! $L_~[;^&h~!1\)6' *!! uA!",m7<HW]oL6>1380"'$,)^scjn3~IR|rc4%i $P #EEF lLE|;`kM  \|]J&$"p!" 0"!%(G3;IBPZOBG3h55D#"L))-,37IGV x J+s_0v*;4|?N3*f|D('c#I(6yLrCo:?RDq@y Z!fl  =&J/o7>K`UqRD5u26' %-5#'@[Wh p +3 QV~ $`#^Y@3!ad!3V:j/X) *lU.uelrMPN7V ! !7!+y49FbPT,F805,Y"*'e@x7CBf W`[ k_$< !p.+n2jX_Yxr &3t60)2? q 0r2)t}C=Y lJUF@/3t#2 V!R@'08ALL%RTHc!UdBW0w2'p=3OQ3#Y~I!iw#.350v02 "$* E(?#: ) ps j"DHn;1v{'gag 5QOVkO)N \#]C 8j1&}-fh##*{1,7CIK-?2O.2%"")#|lL0iDaR E (!- _O,K}L;-]qula myD!J#nVo(5 svDuE']'!&u{(0/4D@ HRJ@4,0)!'&B &Uf  > a  R B 6h".|s/nT"+@z $W9aLFT&0h BTM3x}.VaF Kc !Ue|8N`%!+b0:1AGyA6,/+%(veZj*f G T t e/X4Ee,`(K`Al"f_p *^}Som L.&R,Z)\&tj#)_-6h>fCB8r,-- "(yS4>|B;qMqmP T <> lrRA9>yJ"i45b+22)DsYUA8~N[P  YvSf^m!Z(+3/:?@1AZ9L,i+I-J ! '!*\ildc3  X fD )LK)n+6}qYNm\af?L,K9u@mHccl][XfV `WM &)0>7<?9-)k," z&#8XZ xE - W < 0  <'L B/ (dGx{U8F !R WFLr )X$R.a.+'LU% ).48=9-s'+#)%h$5gc>s0z;z= c 6m.@ &#  4jWf 0{kD=4"(1iEE7>OC|TK"_aY~klOA|Pp1#^&?+2:5|:7-&,) $}$%Sg.[@I E  0 p v EDbH7C;]<o 't^GRx@b"LDsF1!%+)/2i7^6E-{$'5$b"&6~ ,\8=w= 3 D I d c p  ' " cb +RcWXJ1H]=")I/#mH0J5W O\M69>aF:M! \c:#!s& +=//4)4,$%^$!N!;&o+/t.2 $ t E I  ' JYixx0  'DXOv~c`!)6 ~jz+X@x@4z&"&!+_,1E2,0###c# %e<fq < O   V  \ [ K 24 t  TuxW;Fh8*xm5e5O:goCEg} g Inbje{s)0Z8 !%)+.0+"<"T"$!^*qw U  ? @ (  !atDBU-`kqWr}q9^ ^xsBHU&0p 8#f'-(R,K.)!^!!e&#:'jW + ^  t  O o X  G(   U=[f7MD-Q*B ?t e coE"J^ :+oD<<2N"$'*],U(: w vm"{ v&J  / z i v j <  D 6 X AB: KtbgP6s!xr>g?7j^`hOqes!W!##( *&i4!oqE(i# [  u k P I l g I o   }f d !KP ]=:>r,ueQj  ~ `\JCpl>tU#tT!D!%'$n ! < [ Y ' p W E B 1 ? j i tU F F   S $3i"l*+ Tou2&h/rUNOE/   ";UE,bbu?DzX adw$s 2#%9"ctLbg  j6n=F_o 5 T m C , '  ( ( = m s X0 S Z To !   n @@RqBfK$=9zT%k?$fi]!BB(#!" Y> }LwD/ G~C  o D      ) C q i  |  e S n R  V2WL  "WgNhH,!Q_( $..3OqUK=  :  / K - 4 s y  4 [;  `S} !rXW=tU#N,#+w&sM*GDRC8Z0}sSo! q)?_qB<" mYM|2& 1  " 7 [ K m  ? | C $\ d ? ^5  G d&0YK&hPpXQ~PW!>~l*9_a 9eG;1x: :J-is@bqj O F  . @ f Y  d d5 } % S\.: ZU[{o'hc/V {mmb5JIp&jLf'@7W G g a ` h  9 Q u 1  0 \    e-:eC@2m;wX]{)ICJz$| pxg2 M2HmV,7M D ] *Ll x M 4 ( > A X w  H `    u J .E [ R   3E+RE>4LbyfsC& nW#j(k1:#)0sw C $ ] p 3    ' 7 S { * Z r #   \U &y XF* U+Ak90N"ktd_O8oGiY-'/"oCM P [   ? +  7 X  < k  8    } N  n x ~ r>v:*1#[j>Ba?`,G@S#}4 Eh" ? / ! E e - M }   jj D   0g 5  7  Hjz` #R{`V+N!Z*!txi? ,RO*cFBG{IFGM M h   A z z . U {  ; b  +  ] + T s`  m:[ 7 @ [TCNj[YMi|%RXJdWV^X(<%l  1 k ~ i V T P ` u  = e # Q v . D  )  @ p * )  $ \ )"-A y $?&=OOC@=V, 9n#o'  )%7"JM c z i 9 $ ) 2 > \ |  P v 6 d  G [L P  x   Z k n } 2 q B ^ 41y EXX%~I^Y2r=h?YW;q$_ G  > j JP# ,    8 ^ k >    ' > c - f H y  _ u ` 0 #  v ? q = J k # } R L V k<1<LL cJ|=} Y % 8 P] C dD5C   }  1 N s  A v 3 `  3 w . 9 + L , $ + G i   *F A + .Pc1p%yAz&j6`+1CT  p \   ,  J \ m m 5 $ 6 k o   @ b  0 R  I q  " O  \ 6 ' j S  $ E = #%  0hd gI|qt[ U#O4;S P k | 7 " E by j / 0  - V y  A b  7 ^  < i  f 0 y y .1;'f )T0edN  C [ ZAbt=?   c g 8  H ! B  0 o y 3 S rjizMk   G p  . P w ' K v  3 T  ] X |  d L Q , & XB j A r @C 7A}C/Uf /3un 3  \ 5 o  + x  o  78Wyzs79Eo  6 e # @ e = a  M p jC # a k o y . < Z {  Mz9N0l.f Dz,Z ~oP   n ;   w n s 8 ' Y A+4=P 4 Q {  4 S | # Q x 2 k n l h B  F x[( 3r O L SM  ]2 y7.s:BZx;f f %  B v  e  B 5 Y i &x'Me  ) R m  G k  9 n # M  < z q  :  0 N  9OhH  z Tyn <4Um<ahB [ 5   & ? j  K   E )NvK<ENh,>g  C k  / _   - U @ g x  Y p ] {   L y  B R ,kNk([6g$ w e  K5b W  M g L 'w (C`EW  9 _ # C u  D m ( [   K %  %  x 6 + `o- x U 7rO3V e% s D / (f  s t  i ,Ie})av - S u  6 [  8 ^  D p   E &   8 R y 7 7  _  * " j Y u {  M$= . 4v {  , 1Os ! b[8Sn+Ez  ( E j ' q q  S {  , \  g }Y n? | i    X8  O 4 l * 9C[  i0 { X  5 moK| J,He#Da A ^ ? d 7 p  J r L  1 ,;R )  g Kv  ]\ Xa  F & FR   y?[YwaO5iAN^fp}'C`{?`|  : [ v  9 V { & Q  7 ^ + T d 8 ?q  d  > ? 7 & _  + q  n @ r *E}MkhRn~!@[z:Y~ # T t  , Q p  D l / R p  O 2 j [ E H  T u F p X H A  w  x V \  @&6RiVxiB@I._a 7Yv 4Uu % 9 i   E h 0 _  C c t <  D + E : E - G p  Ow  [ k j  "oam8 ".Wp H>tz$/Qs &Nn   8 N {  8 \ ' M z  + V r | J s w ^ h    a  P V Fw H P j L h:e.Bl#`U<Fi)?h  + M ^  +D\}  % J d ~ qsunpy-0.8.3/sunpy/data/test/hsi_calib_ev_20020220_1106_20020220_1106_25_40.fits0000644000175000001440000062500013203275053024276 0ustar nabil00000000000000SIMPLE = T /Written by IDL: Tue Sep 13 15:37:38 2011 BITPIX = 8 / NAXIS = 0 / EXTEND = T /File contains extensions DATE = '2011-09-13T15:37:38' /File creation date (YYYY-MM-DDThh:mm:ss UTC) ORIGIN = 'RHESSI ' /High Energy Solar Spectroscopic Imager OBSERVER= 'Unknown ' /Usually the name of the user who generated file TELESCOP= 'RHESSI ' /Name of the Telescope or Mission INSTRUME= 'RHESSI ' /Name of the instrument OBJECT = 'Sun ' /Object being observed DATE_OBS= '2002-02-20T11:06:00.000' /nominal U.T. date when integration of this DATE_END= '2002-02-20T11:06:43.330' /nominal U.T. date when integration of this TIME_UNI= 1 / ENERGY_L= 25.0000 / ENERGY_H= 40.0000 / TIMESYS = '1979-01-01T00:00:00' /Reference time in YYYY MM DD hh:mm:ss TIMEUNIT= 'd ' /Unit for TIMEZERO, TSTARTI and TSTOPI END XTENSION= 'BINTABLE' /Written by IDL: Tue Sep 13 15:37:38 2011 BITPIX = 8 / NAXIS = 2 /Binary table NAXIS1 = 3722 /Number of bytes per row NAXIS2 = 1 /Number of rows PCOUNT = 0 /Random parameter count GCOUNT = 1 /Group count TFIELDS = 107 /Number of columns COMMENT COMMENT *** End of mandatory fields *** COMMENT EXTNAME = 'CONTROL PARAMETERS' / DATE = '2011-09-13' /Creation date COMMENT COMMENT *** Column names *** COMMENT TTYPE1 = 'IM_TIME_INTERVAL' / TTYPE2 = 'TB_INDEX' / TTYPE3 = 'USE_AUTO_TIME_BIN' / TTYPE4 = 'CBE_DIGITAL_QUALITY' / TTYPE5 = 'CBE_POWERS_OF_TWO' / TTYPE6 = 'CBE_TIME_BIN_FLOOR' / TTYPE7 = 'USER_FLUX_VAR' / TTYPE8 = 'USE_FLUX_VAR' / TTYPE9 = 'SMOOTHING_TIME' / TTYPE10 = 'SRT_FILENAME' / TTYPE11 = 'EB_INDEX' / TTYPE12 = 'ENERGY_BAND' / TTYPE13 = 'USE_TIME_WINDOW' / TTYPE14 = 'USE_PHZ_STACKER' / TTYPE15 = 'CB_COEF ' / TTYPE16 = 'USER_HOOK' / TTYPE17 = 'IMAGING_POWER_LAW' / TTYPE18 = 'USE_LOCAL_AVERAGE' / TTYPE19 = 'LOCAL_AVERAGE_FREQUENCY' / TTYPE20 = 'AUTO_FREQUENCY' / TTYPE21 = 'MAX_HARMONIC' / TTYPE22 = 'R_THRESHOLD' / TTYPE23 = 'CBE_MAX_CORR' / TTYPE24 = 'PHZ_N_ROLL_BINS_MIN' / TTYPE25 = 'PHZ_N_ROLL_BINS_MAX' / TTYPE26 = 'PHZ_N_ROLL_BINS_CONTROL' / TTYPE27 = 'PHZ_REPORT_ROLL_BINS' / TTYPE28 = 'PHZ_N_PHASE_BINS' / TTYPE29 = 'PHZ_RADIUS' / TTYPE30 = 'XYOFFSET' / TTYPE31 = 'FLARE_XYOFFSET' / TTYPE32 = 'USE_FLARE_XYOFFSET' / TTYPE33 = 'FRONT_SEGMENT' / TTYPE34 = 'REAR_SEGMENT' / TTYPE35 = 'IM_ENERGY_BINNING' / TTYPE36 = 'TIME_BIN_DEF' / TTYPE37 = 'TIME_BIN_MIN' / TTYPE38 = 'DET_INDEX_MASK' / TTYPE39 = 'POISSON ' / TTYPE40 = 'SEED ' / TTYPE41 = 'COINCIDENCE_FLAG' / TTYPE42 = 'OTHER_A2D_INDEX_MASK' / TTYPE43 = 'SEG_INDEX_MASK' / TTYPE44 = 'REBIN_POISSON_FLAG' / TTYPE45 = 'REBIN_SEED' / TTYPE46 = 'CONTIG_ENERGY_EDGES' / TTYPE47 = 'LIVETIME_ENABLE' / TTYPE48 = 'ALIGN512' / TTYPE49 = 'SUM_FLAG' / TTYPE50 = 'SUM_COINCIDENCE' / TTYPE51 = 'REAR_NO_ANTI' / TTYPE52 = 'SP_DP_CUTOFF' / TTYPE53 = 'DECIMATION_CORRECT' / TTYPE54 = 'REAR_DECIMATION_CORRECT' / TTYPE55 = 'DECIM_APAR' / TTYPE56 = 'USE_CULL' / TTYPE57 = 'CULL_FRAC' / TTYPE58 = 'USE_TOTAL_COUNT' / TTYPE59 = 'CLEAR_HALFSCALE' / TTYPE60 = 'EVENTLIST_STRATEGY' / TTYPE61 = 'A2D_INDEX_MASK' / TTYPE62 = 'GAIN_TIME_WANTED' / TTYPE63 = 'GAIN_GENERATION' / TTYPE64 = 'TIME_RANGE' / TTYPE65 = 'NUMBER_OF_HALF_ROTATIONS' / TTYPE66 = 'TIME_UNIT' / TTYPE67 = 'NO_LIVETIME' / TTYPE68 = 'CT_INTERPOLATE' / TTYPE69 = 'DEFLT_ATTEN_STATE' / TTYPE70 = 'FR_DEADTIME_WINDOW' / TTYPE71 = 'EXTEND_TIME_RANGE' / TTYPE72 = 'DP_CUTOFF_MAX' / TTYPE73 = 'DP_CUTOFF_MIN' / TTYPE74 = 'DP_CUTOFF_COEFF' / TTYPE75 = 'DP_CUTOFF_XP' / TTYPE76 = 'DP_ENABLE' / TTYPE77 = 'DP_EXTEND_DEF' / TTYPE78 = 'DP_EXTEND_SEC' / TTYPE79 = 'DP_EXTEND_UTLIM' / TTYPE80 = 'MIN_TIME_4_OFF' / TTYPE81 = 'DP_LLD ' / TTYPE82 = 'DP_ULD ' / TTYPE83 = 'NO_CSA_DROPOUT' / TTYPE84 = 'FILE_TYPE' / TTYPE85 = 'CHECK_BAD_PACKET' / TTYPE86 = 'ADP_TEST' / TTYPE87 = 'APP_ID ' / TTYPE88 = 'OBS_TIME_INTERVAL' / TTYPE89 = 'PACKET_TIME_RANGE' / TTYPE90 = 'PACKET_PER_BUNCH' / TTYPE91 = 'FILENAME' / TTYPE92 = 'ASPECT_MODE' / TTYPE93 = 'ASPECT_CNTL_LEVEL' / TTYPE94 = 'ASPECT_SIM' / TTYPE95 = 'ASPECT_TIME_RANGE' / TTYPE96 = 'AS_INTERPOL' / TTYPE97 = 'AS_NO_EXTRAPOL' / TTYPE98 = 'RAS_TIME_EXTENSION' / TTYPE99 = 'SASZERO ' / TTYPE100= 'AS_SPIN_PERIOD' / TTYPE101= 'AS_ROLL_OFFSET' / TTYPE102= 'AS_ROLL_SOLUTION' / TTYPE103= 'AS_POINT_SOLUTION' / TTYPE104= 'SC_SUN_OFFSET' / TTYPE105= 'EQUAT_NS' / TTYPE106= 'PMTRAS_DIAGNOSTIC' / TTYPE107= 'CONTROL_TAGS' / COMMENT COMMENT *** Column formats *** COMMENT TFORM1 = '2D ' / TFORM2 = 'I ' / TFORM3 = 'J ' / TFORM4 = 'E ' / TFORM5 = 'J ' / TFORM6 = '9J ' / TFORM7 = 'I ' / TFORM8 = 'J ' / TFORM9 = 'E ' / TFORM10 = '10A ' / TFORM11 = 'I ' / TFORM12 = '2E ' / TFORM13 = '3E ' / TFORM14 = 'J ' / TFORM15 = 'E ' / TFORM16 = 'I ' / TFORM17 = 'E ' / TFORM18 = 'B ' / TFORM19 = '27E ' / TFORM20 = 'B ' / TFORM21 = 'I ' / TFORM22 = '9E ' / TFORM23 = 'E ' / TFORM24 = '9J ' / TFORM25 = '9J ' / TFORM26 = '9J ' / TFORM27 = 'I ' / TFORM28 = 'J ' / TFORM29 = 'E ' / TFORM30 = '2E ' / TFORM31 = '2E ' / TFORM32 = 'I ' / TFORM33 = 'B ' / TFORM34 = 'B ' / TFORM35 = '2D ' / TFORM36 = '9E ' / TFORM37 = 'J ' / TFORM38 = '9B ' / TFORM39 = 'B ' / TFORM40 = 'E ' / TFORM41 = 'I ' / TFORM42 = '27B ' / TFORM43 = '18B ' / TFORM44 = 'I ' / TFORM45 = 'I ' / TFORM46 = 'I ' / TFORM47 = 'I ' / TFORM48 = 'I ' / TFORM49 = 'I ' / TFORM50 = 'I ' / TFORM51 = 'I ' / TFORM52 = 'E ' / TFORM53 = 'I ' / TFORM54 = 'I ' / TFORM55 = '6E ' / TFORM56 = 'I ' / TFORM57 = 'E ' / TFORM58 = 'I ' / TFORM59 = 'I ' / TFORM60 = '20A ' / TFORM61 = '27B ' / TFORM62 = 'D ' / TFORM63 = 'I ' / TFORM64 = '2D ' / TFORM65 = 'I ' / TFORM66 = 'I ' / TFORM67 = 'B ' / TFORM68 = 'B ' / TFORM69 = 'B ' / TFORM70 = 'I ' / TFORM71 = 'E ' / TFORM72 = 'E ' / TFORM73 = 'E ' / TFORM74 = 'E ' / TFORM75 = 'E ' / TFORM76 = 'B ' / TFORM77 = '9E ' / TFORM78 = '9E ' / TFORM79 = '9D ' / TFORM80 = 'E ' / TFORM81 = '9I ' / TFORM82 = '9J ' / TFORM83 = 'I ' / TFORM84 = '4A ' / TFORM85 = 'B ' / TFORM86 = '10B ' / TFORM87 = 'I ' / TFORM88 = '2D ' / TFORM89 = '2D ' / TFORM90 = 'J ' / TFORM91 = '80A ' / TFORM92 = 'B ' / TFORM93 = 'I ' / TFORM94 = 'B ' / TFORM95 = '2D ' / TFORM96 = '4A ' / TFORM97 = 'I ' / TFORM98 = '2D ' / TFORM99 = 'B ' / TFORM100= 'D ' / TFORM101= 'D ' / TFORM102= '5A ' / TFORM103= '3A ' / TFORM104= '2E ' / TFORM105= 'I ' / TFORM106= 'I ' / TFORM107= '2616A ' / COMMENT COMMENT *** Column dimensions (2 D or greater) *** COMMENT TDIM19 = '( 9, 3) ' / TDIM107 = '(24, 109)' / COMMENT COMMENT *** Unsigned integer column scalings * COMMENT TSCAL106= 1 / TZERO106= 32768 / END ALAa=q?s33?SRT_2*.datAB ?@AAAAAAAA@AAAAAAAA@AAAAAAAA@@@@@@@@@@@@   ADcCõ@9@D?@@AAABBC?@?@C@?HSI_EVENTLIST_PACKETALAa=q@=L:Q@fff<# <# <# <# < <# < < < ATAɋA<AdԀAաAAաAաAա=31464,A.(pppppppppfitsdALAa=qAKAb=q\\hesperia.gsfc.nasa.gov\data1\hessidata\2002\02\20\hsi_20020220_104040_006.fitsALAa=qquad@@DBASESASIM_TIME_INTERVAL TB_INDEX CBE_FILENAME USE_AUTO_TIME_BIN CBE_DIGITAL_QUALITY CBE_POWERS_OF_TWO CBE_TIME_BIN_FLOOR USER_FLUX_VAR USE_FLUX_VAR SMOOTHING_TIME SRT_FILENAME EB_INDEX ENERGY_BAND USE_TIME_WINDOW USE_PHZ_STACKER CB_COEF USER_HOOK IMAGING_POWER_LAW USE_LOCAL_AVERAGE LOCAL_AVERAGE_FREQUENCY AUTO_FREQUENCY MAX_HARMONIC R_THRESHOLD CBE_MAX_CORR CBE_INCLUDE_TAGS PHZ_N_ROLL_BINS_MIN PHZ_N_ROLL_BINS_MAX PHZ_N_ROLL_BINS_CONTROL PHZ_REPORT_ROLL_BINS PHZ_N_PHASE_BINS PHZ_RADIUS XYOFFSET FLARE_XYOFFSET USE_FLARE_XYOFFSET FRONT_SEGMENT REAR_SEGMENT IM_ENERGY_BINNING TIME_BIN_DEF TIME_BIN_MIN DET_INDEX_MASK POISSON SEED COINCIDENCE_FLAG OTHER_A2D_INDEX_MASK SEG_INDEX_MASK REBIN_METHOD REBIN_POISSON_FLAG REBIN_SEED CONTIG_ENERGY_EDGES LIVETIME_ENABLE ALIGN512 SUM_FLAG SUM_COINCIDENCE REAR_NO_ANTI SP_DP_CUTOFF DECIMATION_CORRECT REAR_DECIMATION_CORRECT DECIM_APAR USE_CULL CULL_FRAC USE_TOTAL_COUNT CLEAR_HALFSCALE EVENTLIST_STRATEGY A2D_INDEX_MASK GAIN_TIME_WANTED GAIN_GENERATION TIME_RANGE NUMBER_OF_HALF_ROTATIONSTIME_UNIT NO_LIVETIME CT_INTERPOLATE DEFLT_ATTEN_STATE FR_DEADTIME_WINDOW EXTEND_TIME_RANGE DP_CUTOFF_MAX DP_CUTOFF_MIN DP_CUTOFF_COEFF DP_CUTOFF_XP DP_ENABLE DP_EXTEND_DEF DP_EXTEND_SEC DP_EXTEND_UTLIM MIN_TIME_4_OFF DP_LLD DP_ULD NO_CSA_DROPOUT FILE_TYPE CHECK_BAD_PACKET ADP_TEST APP_ID OBS_TIME_INTERVAL PACKET_TIME_RANGE PACKET_PER_BUNCH FILENAME ASPECT_MODE ASPECT_CNTL_LEVEL ASPECT_SIM ASPECT_TIME_RANGE AS_INTERPOL AS_NO_EXTRAPOL RAS_TIME_EXTENSION SASZERO AS_SPIN_PERIOD AS_ROLL_OFFSET AS_ROLL_SOLUTION AS_POINT_SOLUTION SC_SUN_OFFSET EQUAT_NS PMTRAS_DIAGNOSTIC XTENSION= 'BINTABLE' /Written by IDL: Tue Sep 13 15:37:38 2011 BITPIX = 8 / NAXIS = 2 /Binary table NAXIS1 = 13528 /Number of bytes per row NAXIS2 = 1 /Number of rows PCOUNT = 0 /Random parameter count GCOUNT = 1 /Group count TFIELDS = 66 /Number of columns COMMENT COMMENT *** End of mandatory fields *** COMMENT EXTNAME = 'INFO PARAMETERS' / DATE = '2011-09-13' /Creation date COMMENT COMMENT *** Column names *** COMMENT TTYPE1 = 'OFFAXIS_DISP' / TTYPE2 = 'IMAGE_ATTEN_STATE' / TTYPE3 = 'PHZ_N_ROLL_BINS_INFO' / TTYPE4 = 'OFF_DET_INDEX' / TTYPE5 = 'BINNED_N_EVENT' / TTYPE6 = 'CBE_DET_INDEX_MASK_USED' / TTYPE7 = 'CBE_CORR_FACTORS' / TTYPE8 = 'N_BIN ' / TTYPE9 = 'UT_BINNED_EVENTLIST' / TTYPE10 = 'VALID_BINNED_INDEX' / TTYPE11 = 'SEC2TIME_UNIT' / TTYPE12 = 'DROPOUT ' / TTYPE13 = 'LIVETIME_ARR' / TTYPE14 = 'LIVETIME_CTR' / TTYPE15 = 'USED_XYOFFSET' / TTYPE16 = 'N_EVENT ' / TTYPE17 = 'UT_REF ' / TTYPE18 = 'INFO_DP_LLD' / TTYPE19 = 'ABSOLUTE_TIME_RANGE' / TTYPE20 = 'EV_SIM_DATA' / TTYPE21 = 'FILE_TIME_RANGE' / TTYPE22 = 'N_PACKET' / TTYPE23 = 'PACKET_REF_TIME' / TTYPE24 = 'SIMULATED_DATA' / TTYPE25 = 'AVG_SPINPERIOD' / TTYPE26 = 'AS_QUALITY$$SAS_ERROR' / TTYPE27 = 'AS_QUALITY$$TRIANGLE' / TTYPE28 = 'LAST2$$LIVE' / TTYPE29 = 'LT_UT_REF$$_$_HESSI_SCTIME_FULL_$SECONDS' / TTYPE30 = 'LT_UT_REF$$_$_HESSI_SCTIME_FULL_$BMICRO' / TTYPE31 = 'EV_UT_REF$$_$_HESSI_SCTIME_FULL_$SECONDS' / TTYPE32 = 'EV_UT_REF$$_$_HESSI_SCTIME_FULL_$BMICRO' / TTYPE33 = 'INFO_DP_CUTOFF$$_$_HSI_DP_CUTOFF_$MAX' / TTYPE34 = 'INFO_DP_CUTOFF$$_$_HSI_DP_CUTOFF_$MIN' / TTYPE35 = 'INFO_DP_CUTOFF$$_$_HSI_DP_CUTOFF_$COEFF' / TTYPE36 = 'INFO_DP_CUTOFF$$_$_HSI_DP_CUTOFF_$XP' / TTYPE37 = 'DECIM_TABLE$$REAR$$START_TIME' / TTYPE38 = 'DECIM_TABLE$$REAR$$END_TIME' / TTYPE39 = 'DECIM_TABLE$$REAR$$SSR' / TTYPE40 = 'DECIM_TABLE$$REAR$$ATTEN' / TTYPE41 = 'DECIM_TABLE$$REAR$$IDPU' / TTYPE42 = 'DECIM_TABLE$$REAR$$CHANNEL' / TTYPE43 = 'DECIM_TABLE$$REAR$$WEIGHT' / TTYPE44 = 'DECIM_TABLE$$REAR$$ENERGY' / TTYPE45 = 'DECIM_TABLE$$REAR$$CORRECTION' / TTYPE46 = 'DECIM_TABLE$$FRONT$$START_TIME' / TTYPE47 = 'DECIM_TABLE$$FRONT$$END_TIME' / TTYPE48 = 'DECIM_TABLE$$FRONT$$SSR' / TTYPE49 = 'DECIM_TABLE$$FRONT$$ATTEN' / TTYPE50 = 'DECIM_TABLE$$FRONT$$IDPU' / TTYPE51 = 'DECIM_TABLE$$FRONT$$CHANNEL' / TTYPE52 = 'DECIM_TABLE$$FRONT$$WEIGHT' / TTYPE53 = 'DECIM_TABLE$$FRONT$$ENERGY' / TTYPE54 = 'DECIM_TABLE$$FRONT$$CORRECTION' / TTYPE55 = 'OFFSET_GAIN_STR$$_$_HSI_OFFSET_GAIN_STR_$OFFSET_GAIN' / TTYPE56 = 'OFFSET_GAIN_STR$$_$_HSI_OFFSET_GAIN_STR_$GAIN_GENERATION' / TTYPE57 = 'OFFSET_GAIN_STR$$_$_HSI_OFFSET_GAIN_STR_$GAIN_TIME_WANTED' / TTYPE58 = 'SP_ATTEN_STATE$$TIME' / TTYPE59 = 'SP_ATTEN_STATE$$STATE' / TTYPE60 = 'BINNING$$CHANNEL_CAL_NEW' / TTYPE61 = 'BE_TIME_INFO$$TIME_BIN_DEF' / TTYPE62 = 'BE_TIME_INFO$$TIME_BIN_MIN' / TTYPE63 = 'BE_TIME_INFO$$ABSOLUTE_TIME_RANGE' / TTYPE64 = 'CBE_DET_EFF$$AVG' / TTYPE65 = 'CBE_DET_EFF$$REL' / TTYPE66 = 'INFO_TAGS' / COMMENT COMMENT *** Column formats *** COMMENT TFORM1 = 'E ' / TFORM2 = 'I ' / TFORM3 = '9J ' / TFORM4 = '9B ' / TFORM5 = '9J ' / TFORM6 = '9B ' / TFORM7 = '9E ' / TFORM8 = '27J ' / TFORM9 = 'I ' / TFORM10 = '9J ' / TFORM11 = 'D ' / TFORM12 = 'I ' / TFORM13 = 'I ' / TFORM14 = 'I ' / TFORM15 = '2E ' / TFORM16 = 'J ' / TFORM17 = 'D ' / TFORM18 = '9I ' / TFORM19 = '2D ' / TFORM20 = 'B ' / TFORM21 = '2D ' / TFORM22 = 'J ' / TFORM23 = 'D ' / TFORM24 = 'B ' / TFORM25 = 'E ' / TFORM26 = 'E ' / TFORM27 = '1426D ' / TFORM28 = '36B ' / TFORM29 = 'J ' / TFORM30 = 'J ' / TFORM31 = 'J ' / TFORM32 = 'J ' / TFORM33 = 'E ' / TFORM34 = 'E ' / TFORM35 = 'E ' / TFORM36 = 'E ' / TFORM37 = 'D ' / TFORM38 = 'D ' / TFORM39 = 'B ' / TFORM40 = 'B ' / TFORM41 = 'I ' / TFORM42 = 'I ' / TFORM43 = 'I ' / TFORM44 = '9E ' / TFORM45 = '9E ' / TFORM46 = 'D ' / TFORM47 = 'D ' / TFORM48 = 'B ' / TFORM49 = 'B ' / TFORM50 = 'I ' / TFORM51 = 'I ' / TFORM52 = 'I ' / TFORM53 = '9E ' / TFORM54 = '9E ' / TFORM55 = '54E ' / TFORM56 = 'J ' / TFORM57 = 'D ' / TFORM58 = 'D ' / TFORM59 = 'B ' / TFORM60 = '2D ' / TFORM61 = '9E ' / TFORM62 = 'J ' / TFORM63 = '2D ' / TFORM64 = 'E ' / TFORM65 = '9E ' / TFORM66 = '1127A ' / COMMENT COMMENT *** Column dimensions (2 D or greater) *** COMMENT TDIM8 = '( 9, 3) ' / TDIM28 = '( 2, 18)' / TDIM55 = '( 27, 2)' / TDIM66 = '(23, 49)' / END D3:"@@  7LZRV+U+U kZRV+U+U kZRV+U+U kDcCõ >AJWZALAa=qATA _ @N?h=?Xb f?dEK?-k?ǚԌc!$ay=랿v1+??51?P[@?G]֩?.s{?DJg:?ؑ?w_dҫD/gXd'?n 7?+Wz?)ctB-:)nhZW?E*ii?Phxzp ?v,H=?%0?iS`?ET6%`2?ylw? ~?&?#Hr? 係yF?OV'x?4G?RS 뗿#֘jv5?#l,,>ρ(?dk?S?Qs?v"cT?g.Ϳr2a aץh?.!/q  ۿ>h?䰆?0m׼?IQL\?~a_?YNb?W(?G[VI~߿uv!?2uZ_o}Ċ&(?^H!$'?)$a? ?uL~|??y%?!?J.]K?>F?a[q?"|d?iI(^h?ޭwhKTc?T˚?|lւMF?x;?S ,L?ĝ?v?%OPwFUS?/+'Ļ?CI'F/O44ǁnQ?__?2Uu?N:꿯\t.z?qUᅢ3HثUAi }7e?F?;)?`V` ѿbIL--?,t?-$?`?YɿnBaT(t?h+?I!&NϿ$i4?}%?@%–?{wBX? $ ,?aX??t?ʏ?lctz9?™68Cw?\a!?N 도?OG~N"vp`?Z؍T]?^?$$??̆? Vu?' <;?d孿C*eY+S7?/7?/?, d7ӱ俒qu?K$?jzTO?1x"Sxj.&6J'Hpr_?CzN?mw!r?qp(y??? 78?|I?۵ \_G=֯տr@,T:pg)_L p@Ua?!չ Tl5\˪S?% ]?qYk?dx.dU?A4?noi?1&\N{W YPZ$@G\q?A?ReHu?3k紅??0>\H?'Ә'rT??p90S?K~BCwU?|&? 8A`$?xjGy&?A܊?Mdm^?L!⿯o6?]i?]0ir?С?Tߏ&?6?R2?*׉@Et*y?_6?PCdF?LO)?Y>sL?z#k? ;N ?}x?&*qR?ʟ?Bu?x?_?lѝRzl?a:Zտd 32}I?cd1?)V5TfO^?ijẟZ&??ʛ:?- ?17o?q?e"`2{kO%l?| ƿ b4\? rgYI???)1?nqؿr:1WI?ѤS?tx;.(7?n'n?%4 s;m (>0EB~?n}4)\\?.vLM,`iڿ,ԿHOk<{?%?,+H^'i߿oQȃY?ZCrm?uZyq;?EY?,Ug?k w?O)cXRG2sO"?L=JN?[`?I=$?rk-Geba~m?8젤?z.O?Ip? C?Hq_ҿi|?~ޕ1G?{Y5QrZ U}mQ?s4ew ]?uQ ?6pM? @E~-?^ݗofdHE~?{p? f?TV􃿳^ `?BS#?-WÿJ@#o?.(?i$i.\?k? 6NWz1?,ba?(Ê*j2Yh6׭M]?Z ]JC{?$_-l?z^(?5({?nY?3 !OF?l;J ?67x?w? NI?tGcп$i?,3 P^?֜BԸ{?xZW ㍩?8B?SB?A?nr?DP?=ۇdw.N?1f+?L(AW#O?dwME{?^}6J?6g?Sߚ(?s3Φ?p7?x^<?`B?I?z&rr?T~?o+?W7'?SYkf@??*F֒?yH^QsE?`vq H.,࿡P^? n{$b̿TE` 'BJ@Ʉ%*YB6?=j#NAд$/S6\?ӆH?v?0!S7C?IpQ^goc۞~M?W?[ڟR? ~TKX_v@Eg=/E?wLK?M,B?}Xsz>?lńDÿS_?7Q ?ܿ)?;dרƿ7?)iLþʀ@,(Q? &?ɇ?Ɩ4?<5ҝ3|f?Anz@?rYXʵ?K*\?b4ΘL ?) f'h=?\[,u?B ?7_v?q=x/`ry?5!?V2@i?Ƽ v?yW?a^ ?IsI?svt ?J@?ɅtϿ[`Կ>yJ_t?]G?^t?xݻ0r\`ϖJH "I)3:qĿ*D='9Fl࿱GeX-3Z?/L>y?s'{jFI d?`?z(m?S|c?8qkkQ? M[ .ԿuW ?;ef?s:+?%}yn#~Y2?h_nWDp9>-ӿ{^Hi?I@C:?=Z=?bPw`?HZҿSqwvcƆ?RiL^L?N~"߿5ǿR[+? $,S? L Wz]4v?mzvA8UN.?a?ef|?01?2J꿘+N?ju5?4nB?PW?U?Z ԗB-<3?(x?՛e=Bf?KG?N:>K\?=6f?A󩤠?ht򣿒 ?(?O$3I4? _8Hz O?}y}?]"mK?xǻ܆4Q+#M8#)%N!?%?z?^0?fϿyHӿtr?l?HȸܿtEyB$JvW*c9-C?g?#?} ` `ZzN?| k?ah󶸷@?u?g֒?Ȗ?[KW((?ȑ'T4?eg^ ?&/Rl&ϋr?l`^??ѠB'z?UA ȿ;1n?KmͿ,+O?U?aa& ]?an?r~vGpzŋǿ40ZA?cE~?ۨoǙ?E3N\h? ?Lz/!`1myDHs5\?eC ?u]?9 l#t;%;f?A#`??(?a)>s&DB??f7*L!i$gOj?},?nI?$mj? h$?:%?="ļ?T2^?^ ?J w(5LU/}O?S(A-?Jys?;x/?>?( ?FҠ?ۦF<?֥ȫh(D?z{ ؍Xs?5 ^r?y;NE?YM¥?$NJ^Iq?_vB%5?"1Rg$EsݩױSHyb!X?於e?|eC_Cfܟ?~ƦGO?дrc?1t?GZѿ1쬤J'?w/3?wr?m?Q$?kLb?Ǒ$#U?7_??abU?S%먳:?~1UYN?aD5C?ȶ\B?7f|J8g3kECP@ۃ|RP? 2}?5)<$\Ј06:(Ͽ ?Ot!߿q?axH|??ֿ#o3-M,0*?K?Xy]?譄i?B?ݱY$d%ׁ?p?Tl}m“ѿW=am?.tQ?4(Y? V@5?p|@j/$ׁ?-'p>?RpsS|ъ`?:olw\?z?S6P6.or?Dyt ?Xy;?e? z9?Cot)?_󯿢׊Ɏ?L&٫g?hþ?Ŀwk۴F?qZtǿX;?qz9ɵῙ!h`3+ ?l<'M?pC-y)?ƂB:OnTXE?׈=?]-5?@?rL2mn}:7_?O)ޟ?¼ m$?Xi;?Vg ?ycR?ycR:=L:Q@fffALAa=q?????????ALAa=q?????????_w\[nck,bKI.Ru%qp,/YUV|#R\]leHW5_:€šl^Š| >4>ȴ>F>A>b> >u\>>>W>33>ǧ>pt>>M>>A>[M@@@r2@@;@?/@L?hALAJz@9@D?@@AAABBCALAa=q? o?+?S?y?x???x1X?u?eCBE_DET_EFF OFFAXIS_DISP IMAGE_ATTEN_STATE PHZ_N_ROLL_BINS_INFO OFF_DET_INDEX BINNED_N_EVENT CBE_DET_INDEX_MASK_USEDCBE_CORR_FACTORS N_BIN UT_BINNED_EVENTLIST BE_TIME_INFO VALID_BINNED_INDEX BINNING THIS_DET_INDEX THIS_A2D_INDEX THIS_SEG_INDEX UNITS_SPECTROGRAM DIM_SPECTROGRAM TOTAL_COUNT SEC2TIME_UNIT SP_ATTEN_STATE INTERVAL_ATTEN_STATE SHUTTER_CORRECTION DROPOUT LIVETIME_ARR LIVETIME_CTR OFFSET_GAIN_STR USED_XYOFFSET DECIM_TABLE DECIM_WARNING N_EVENT UT_REF CHANNEL_RANGE COINCIDENCE_MASK INFO_DP_CUTOFF INFO_DP_LLD ABSOLUTE_TIME_RANGE EV_UT_REF LT_UT_REF CSA_LLD LAST2 EV_SIM_DATA FILE_TIME_RANGE N_PACKET PACKET_REF_TIME SIMULATED_DATA FILE_LOCATION AVG_SPINPERIOD AS_QUALITY XTENSION= 'BINTABLE' /Written by IDL: Tue Sep 13 15:37:38 2011 BITPIX = 8 / NAXIS = 2 /Binary table NAXIS1 = 33 /Number of bytes per row NAXIS2 = 768 /Number of rows PCOUNT = 0 /Random parameter count GCOUNT = 1 /Group count TFIELDS = 9 /Number of columns COMMENT COMMENT *** End of mandatory fields *** COMMENT EXTNAME = 'stacked_cbe' / DATE = '2011-09-13' /Creation date X_POS = 0 / Y_POS = 0 / COMMENT COMMENT *** Column names *** COMMENT TTYPE1 = 'ROLL_ANGLE' / TTYPE2 = 'MODAMP ' / TTYPE3 = 'PHASE_MAP_CTR' / TTYPE4 = 'GRIDTRAN' / TTYPE5 = 'FLUX_VAR' / TTYPE6 = 'BACKGROUND' / TTYPE7 = 'COUNT ' / TTYPE8 = 'LIVETIME' / TTYPE9 = 'GAP ' / COMMENT COMMENT *** Column formats *** COMMENT TFORM1 = 'E ' / TFORM2 = 'E ' / TFORM3 = 'E ' / TFORM4 = 'E ' / TFORM5 = 'E ' / TFORM6 = 'E ' / TFORM7 = 'E ' / TFORM8 = 'E ' / TFORM9 = 'B ' / END =I?q>t>sJL?lZ@B=I?a"?GC>r?zYABd=I?+,?>s/?lp?ʯ'Bj=I??꒐>sEs?z$e@B=I?3D@Hx>s$?nz@B6=I?X@9u>sO?r¸@v B%=I?Q@Z(>r?ga@B_X=I? @{->s=?t@B=I?Ih@TU>s ?y @BV=I?,@>s-?k<A!fBo=I?<@^>s?n@B=I?G2@>s ?h@@B>?y>>pe?}t@B>?w4?G>pi|?z@:AB>??P>pV?A UB>?xe?LL>pgc?xHg@B>?@>p^?=@!B>?}@7[>pa|?~p@B >?@[>pOn?z@AB7>?F@{ؔ>p_7?x@ҫB>?n@56>pM?|c@Bb->?@ >pMo?@@B>?@.|>pU?oA UB>?s@>pK$?[@Bo>{S?!>@K>m ?y@B4>{S?!?I>m?B@B>{S?!?(s>m?c@B5>{S?!j?e>m?6AiUBW>{S?!@Y>mC?@B>{S?!^@7o>mͤ?@BP>{S?!@YS>m[?_FABE>{S?!@{>mę?RABV>{S?!@{>mQ?po@v Bp>{S?!"@?>m?ЭA0B>{S?!}2@h>m ?@@B+>{S?!@>m?@B_>?#j>K>k?JA UB4J>?#m8?HdN>k?]@v B%>?#Q?O>kv?@B'=>?#T;?>k?@B>?#t@>>k?@BX>?#h@8>kv?!p@B>?#g0@YO>k?:@@B>?#\@{/>k?7@B>?#\@G>kz?lc@B>?#t@a]>k^?z@B>?#|@>k?G@B>?#@4G>k:?qHAB>1?$EM>a\>jj?|:AUBŲ>1?$j ?J>jP?uRA@B>1?$[J?>j?@B >1?$f?a>j?AB>1?$L$@a>j?[A UBK>1?$a@8qp>j?}@BGT>1?$k@Zj.?q6RA B>1?$@{>jg?zA.B^>1?$@>jf.?A Bq>1?$ @Y>jd&?AYUBįZ>1?$q@Ұ>j|R?r@BU+>1?$mA@>j?j@Bܐ? :?%"s>o>ik?SpAB2;? :?$r?I>jX?q^@B? :?$B?>j9?q[xA0B? :?%1?>id?a@v B@? :?$@2>j d?EA BΠ? :?$@8\>i?)AyUBip? :?$@X1r>i>?@B"? :?$-@{i>j??B? :?%@R>i?[dAIUBY? :?%@#>id?wCABD? :?%,@pk>i?8A)UC ;? :?%@c>iÇ?@BƑ?#\?$V>yi)>j&?^@BDj?#\?$.?I;>j?zD@@B ?#\?$]? t>ja?H@BH7?#\?%(?SW>iÙ?A@B?#\?$h@;>j*?@WBm?#\?$@6>j A?ApB|j?#\?$@Xљ>j&?@B^;?#\?#m@zG>k;?T@B?#\?$@>jB?n@B۸?#\?$݆@>j&s?eANB?#\?%@>iN?A0B?#\?$S@;>j|?{A B?<~?$.t>8>k?~@BJ*?<~?$Cv?Iu>j?@B` ?<~?$8 ?G>k ?pzAB?<~?$!?˓>k$?sAB?<~?$#@">k"E?~@v BW&?<~?$Pz@8GQ>jV?ؚAUB?<~?$Rj@Z7">j?@B&?<~?$P@{!4>j?&@B?<~?$F@=R>jN?@B;1?<~?$:n@o>kU?qA BK?<~?$*j@j>k*?f@@B?<~?$)5@>k?@B?U?#Cb><8>lQ?0@Bq?U?#K?D>lF?%zA B?U?#D?>lN? :@v BE?U?#E?b>lM?q@BU?U?#?@>lV]??@Bx?U?#F@86>lKc?@B?U?#7@Y>l_J?. @B"?U?#P@z0>l??AA@BK?U?#U@V>l9=?W@@BĸM?U?#=;@F>lX?-%ANBf?U?#K@I>lF?&@@BS?U?#DS@>lOK?@B]?n?!>P>nM7?q1@B}?n?!?IW>nV~?AB)?n?!ɩ?А>n9 ?@BX?n?! ?,>n7?%@:ABYT?n?!@q>n[?@B ?n?!M@8>>nR?{ÇA B?n?!@Yk>n^?=\A@B ?n?!\@z>n=?/@v BP?n?!{@k>nVg?4@B?n?!h@5>nW~?@B3?n?!«@+>nB?@!B<?n?!@x>n];?@B?h?>0>p6?jA`B+O?h?w?IF>p?m=@B?h?܎?>p?whX@B?h??l>p??kKA"BTK?h?_@E>pN?s@B?h?F@6>p?o$@Bl ?h?@YX>p?vC@B ?h?@{>p?qt@%WB=1?h?@ >p?pܤ@Bč?h?@_5>p?@B̘x?h?@y>p?vZ9@Be?h?1@n">p+?}Z@B˂?e?U>.A>s?ni@B>?e??P?G>s?v@:ABƜ9?e?q?z>s?<AB?e?. ?>sJ?u4@WB{?e?U@[ >si? @@B%?e?U;@8l>sr?t@ҫBā?e?X`@ZI>s]?|j[@B ?e?\@{c>s?o &ABl?e?N5@lv>s?xNA B%D?e?k@>s?n^~@Bq?e??@>s?r@Bm?e?W@>s?zKABʟ?c?~b>A>w+?&AUBz\?c?n?I7>v?E@eWBM?c?7?>v\?jS@@BFd?c?@?E>v?'ABc?c?c@>vU?@B6?c?˵@8k+>v ?AB,L?c?@ZW>v^?5@BU ?c??@z >v?{@v B?c?L@" >v?@@BD?c?8@Y>vO?dAB?c?@>v?0@B'?c?@;>v?aG@v B?a?>Ս>zo?^AB?a??E|>zz?A!@@BA?a??L>z?@B?a?@$>z/?)@eWBE ?a?@8>z?@B?a?@Zې>zy?3@B?a?խ@{ >z?ABR`?a?3@GK>z?9AAB~?a?j@ >zW?A B^.?a?h@V>zo?A0B;:?a?Ϸ@>z?AB1?6^?lD>vv>?mAB?6^?m0?F9>?j}@BB?6^?yx?,>?aOAB?6^?w?> ?@BH%?6^?s~@,>w?1@@B?6^?r@8_>E?@B?6^?qY@Z޸>,?5AB?6^?nb@|[>8?@B4?6^?aO@>&?@v B~?6^?]@1>*? f@B?6^?a@w>%?AUBP8?6^?k@>?@B?\?>(>?u@Bw?\??IL>?6ABi(?\??A>?|@Bb?\? ?e >?}[@v B?\?@j>?r2@B?\?@8>?tA1fB(?\?@Ze|>J?o'@B?\?@|>8?t@@B?\? @A>ś?v@Bd?\?@56>?s6@Bl?\?@>o?z=@ҫB:?\?8@#>?sAB?XZ? >K>?A BN?XZ? ?SO>k?s;@B^?XZ? ?>?zUt@ 'B[?XZ? {?> ?@B7?XZ? @=> ?t;c@B?XZ? y@50>e?~RIAbB??XZ? @V^^>?~@Ba?XZ? ǐ@x>?{D@Bx?XZ? @>>?A Bz?XZ? |@m:>?zp@B?XZ? <@>T?z@BK?XZ? b@X>5?wϚ@B?X? >z>",?5@BX?X? ?E\>&?3@Bm?X? s?n>7?n@@B|o?X? ?+>9?h @v B?X? @=>.?oF@B?X? @8+>?@B?X? @Y>"j?@%WB=*?X? @z>,1?4aABȎ?X? @9>6?UMAUBC?X? @u>(S?iA UB|?X? @>3?}`@B+?X? @: >+?5 @B?zU?G>y*>?@ʹB*?zU?,?QP>?A`B4a?zU?2i?k>p?@@Bo?zU?E?>?@BCX?zU?X-@>{?ABw`?zU?e@9U>rY?ɹ@Bm?zU?>@\=>c?*i@B?zU??8@|p>?ABw?zU?8@{B>?@BS?zU?H@m>?TABO?zU?Y@4w>z?W@B3?zU?Kt@v>Z?V@@B3? S?>>|ѧ>?5 @eWB? S?8b?I% >?K@B? S?IW?%>?5@B=? S?<?;>C?e@B3? S?I@6>H?"yABH? S?<@7>?@@B"? S?A@Z>?@BF? S?R@z̽>?I@@B}V? S?C@U*>? AB? S?P]@>?@B?V? S?C@n>?CA BJ? S?Q@]>?i@B@(?>y2>h?@B¦@(??H>i)?SA Bb@(??>l ?@By@(?%?0#>o!?cA0Bܖ@(?{@>g?cuA`BlR@(?@8J>m(?ABf@(?@Y>h?@Bx@(?@{>p ?8ABG@(?@Z>n?;AB@(?t@>f?ABΡz@(?@̞>q?A9UB@(?"@7>h?AiUBՏY@>A>q>?\AHBӚ@>?Jf> ?Ϙ@@B)@>?1>? @Bٶ@>?D>?;AUBZ@>@[G>3?)@v B@>/@8tT>?<@ҫBޙ@>@Yf>[?SAUBi2@>@{%C>K?kA)UB@>N@*> z?)ABF>@>@>?0@B9@>@k>?Ӻ@ByO@>@B>?WA UB0@ _&>3>^>f?AiUB{@ _&>/?Iս>?F;@BQn@ _&>2n?Q>?cAPBW@ _&>8?u>?AUB@ _&>6'@>?@BW@ _&>$@8">6?A B@ _&>8@Y>?AB4@ _&>; @{>>?AB@ _&>36@|>?A BC@ _&>6z@>H?@WB@ _&>4 @>?gA UB6@ _&>4h@x>??a@BB@>>?>h?<^ABty@> ?F>l?@BK@>?->kd?A B@>|?UA>i?v@BӐ@>@C>k?rA9UBr@>@8>k(?vA)UB @>@Y/>h?@Bä@>@|Y>i?B1A UBí@>@@>h?|@Bl@>@%;>k?g@@B@>5@>i?OAfB@>@>kG?RApB9@$>a>>? @Bwh@$>e?Ho>e?b@BG@$>W?S>?q@J'BH@$>h?z#>0?bABL@$>W@S>?AB@$>k @85>G?PAB+@$>\=@Y̮>?A UB4,@$>b:@z2>?A B¦@$>b@>??A@BXl@$>U3@_x>?x7A B@$>fM@> ?Yp@%WB@$>Y9@>K?@B@ 8>RP>|>?@BW@ 8>[w?B#\>0?AB@@ 8>_(??>?v@B{@ 8>g/?>s?@B@ 8>a@y>@?~ABO@ 8>Z@8g>g?AB{@ 8>e@YK>?o@Bp@ 8>\@zp>?@Be3@ 8>c@_>? @B@ 8>Y2@>?h@B@ 8>p@!>ګ?9:@B@ 8>Y@,>K?,v@Bt@&!>>{:h>y?AB/@&!>?K&>?@v B}@&!>p?/W>?>@Bh@&!>~?m>?-S@B@&!>2@U> ?LAB@&!>@8>]?3@v B~@&!>u@Yz">?7@Bk@&!>zg@z.>? m@%WBы@&!>yC@x>H?lAB@&!>@u>d?@B)@&!>@:>?G@@B@&!>@>?dIA UB`@,ɠ?>>?A UBs5@,ɠ?T?G>?J@B-@,ɠ??%4>4??ʯ'B̀@,ɠ?$?o>?zU@B@,ɠ?@%>?X6@v B@,ɠ?!@6ǽ>'?ABD@,ɠ?@YA>?@v B]R@,ɠ?&@z> ?A@B@,ɠ?+0@ > @?A@B@,ɠ?@r5>M?A B#@,ɠ?.@>->?L&AB@,ɠ?(@2> Q?A.B@3?j3>>g7?u#}@Bc@3?p ?K>b?o@Bb@3?l ?>e?}@B\*@3?m?9>d?x@B@3?`L@9`>n@?K@B5@3?n@8>c?~Q@B@3?m(@Y>d?Y@ҫB@3?u@{SD>_E?xzAUB"@3?n@t>c?VABW.@3?p;@G>b?}TABx3@3?n@&>c?x@B~?@3?k@>e?|@B@9Z?G>|u>?hr*@zAB@9Z?,?HW4>݃?nՖAB@9Z??M>?o@@Bq@9Z?z?x>9?lQ@BJ@9Z?|@ì>?oD@B@9Z?~@8>?n?qm@B@9Z?@zk/>?q@B_@9Z?@>c?r,?Bu@9Z?@S>H?p@B@9Z?"@9>?lAB@9Z?|a@A5>?tu@Bš@??m{>/>?o1@BB@??o?GdG>s?rR@@Br@??x?>{?mC@@Bc@??k?Ӎ>?|?@Bh@??k@y>?p @@B@??t@8>~?^@B['@??v@Y>|?j@Bl@??rw@zS>A?kAB @??z{@F>z=?o!@B_@??j@@T>?|iAB@??n@>?o/#?B@??n@o>?c.@B@E? L>>>?uABn@E? j?F>$?|)@BI@E? i?.>$^?}jAB\;@E? m?_>!?z@WBAC@E? e@>'?tpAB'-@E? t2@82>*?u @Bƴ@E? n@Y> ?6AUBq6@E? c}@|!2>)E?v@Bl@E? z@a>?v}nA UBg@E? |@>?y@BF@E? fK@d>&?@B @E? qM@>4?u@BE@L4? >D>?b@B@L4? ?LD>?{ABi@L4? ?>?ABE@L4? ?^J>)?|>@@B@L4? @>?TAB@L4? :@7>a?A B@L4? o@Yx>?#AHBKN@L4? @{>?}@B׶@L4? =@pb>?y@B;@L4? '@>?ABC@L4? K@$>?|AB@L4? r@R>?5@ҫB@R|? >>K5?@B@R|? ?I(>@?A@B@R|? ?@>O#?AB@R|? ?#5>Q-?I@@B{@R|? @m>@?l@B@R|? y@83>K+?";@BTn@R|? @Z>S?iAv BN"@R|? =@{1l>C?[pAB@R|? t@?r>U? AB3@R|? @_>M?'R@B͗@R|? E@$,>F?}@B @R|? @>L?mA@B/@X?>O>_?w @Bn@X? A?I>T3?@A`B@X? ]?>SM?)g@B6@X??z>T?7@Bf7@X?1@>W?jAPB!@X?@7>Xz? a@@B@X?@Y>J ?A"BZ@X?@{b>V?UAUBvk@X? @|>S?pAB@X? @&>R?@B$@X? K@>SP?GAIUBeJ@X? @>Y?~@B~@_ ?+_> >?hA>B@_ ?;R?Hv->t8?PA UB/k@_ ?8?[>v`?&"@BEL@_ ?-=?l>~?FA^B@_ ?4@>y?E@B?J@_ ?3@8>y?VA.B$@_ ?5W@Z>x_?@B@_ ?:@z>t?yIABAY@_ ?Gx@|>k?t(A@Bk@_ ?O@>e?DA0BƧ@_ ??@>q[?@ BH@_ ?6"@y>x?m@@B@eV?V>b>$?t:A`Bս@eV??H>?y,}@WB0@eV? M?>د?ye@B@eV??'>ڎ?kABQ5@eV?,@9>ғ?sA8B@eV?@8D>?|M@B{@eV?@Y)>?7u@zABĊS@eV?@{Z>O?)AyUBϫ@eV? -@>?2A@Bv"@eV?@J>j?m@BE@@eV?@+$>?y@BM@eV?>@>ͼ?qq@v Bq@k?\>>B?n@@Bqk@k?h?N>?AB{L@k?!?[>w?pA1fBm_@k?e*?!>.?cA C)@k?T@>1?A@B@k?M@:">G?A@C@k?i@YR>?FN@WB3@k?~@{>z?5Q@v B@k?|{@:>z$?,d@BiQ@k?@/>I?zZ@C@k?t@w>8?h '@Bё@k?M)@.> ?P@B1Wi@q?a>V>W?u?ʯ'B@q?y ?O>nE?jm@B@q??7e>f?^~A B@q?b/?`>\?:.@Be@q?`@ٙ>?PABwV@q?U@;>?9DAC6@q?WP@X>?m\A0BU/@q?it@{˩>{H?R@%WB3d@q?e@>N?FѫABQ@q?@>a?`϶AIUC:t@q?w@>a!?u@B9@q?O)@K>X?wH@`CB1K@x/?o>x4>`?rEAUB3@x/?M?EN>F?fbAPB̈"@x/?O?>i?xa@B0 @x/?g?A>?AB~h@x/? L@D>?Rj@BR@x/?@8G>?F@B@x/? 3@Y>?g}@Bk@x/?@{x#>&??@Bf@x/?@P`>?AB?@x/? @>?@BÈg@x/?@М>?t@BQ@x/?@H>x?suAB@~x?D>>.?gq/@B4.@~x?7?Fc>7?jS@ҫB@~x?P)?>&N?q@WBƬ@~x?L=?>)?nS@Bm@~x?R@>$?iAiUB®@~x?Kr@8:>)9?dABڣ@~x?A@Y>0(?i)C@BL@~x?J@z>*e?aJ@BΏ@~x?K@tx>)f?\Χ@B@~x?M@W>(E?dABє @~x?V@8>"?`@@B@~x?T@E[>#I?Xi@Bxf@`H?~>`>%?t9@zABW@`H?5?Hd>1?OA UBe@`H?""?X>?y @B@`H?%7?v>?-@B*@`H?$Z@(>?~M2AB@`H?@7>?OA Bޔ@`H? @YU>?~hA*B۟@`H?B@{,%>c?}_AB*n@`H?3@Q>?~,A Bk@`H?&J@>?|:AB@`H?o@ڐ>?~O@@BUI@`H?$$@u>?a@ҫBm@? >V>?bA^Bp@? D?K>?@BD1@? 6?Nh>?ABc@? 1?>?p@!Bص9@? e@z>a?A0Bl@? @7k>X?XA>B{@? @Y9>?ZD@B@? @|>\?j@BĒ]@? Y@>/?@B*T@? &@c>.?iABɂ@? @^>$?@!B܁@? @>V?A>B҈@? >>=?$@B@? ?J >0?@B@? ?M>H?WAUB@? S?l>3c?bA0B@? @{>Fx?@B8@? h@8D>6K?@BS@? @Z 5>@t?kA2B@? @{JB>;q?A)UB_@? @lh>:?ȞAPB@? @d>A?,@Bǭ@? @)>6?sM@v B8@? @>3?a @Bn@? R>>չ?6ABf@? }?J >?9@BK@? b?>?PlA0B@? _?<>m?wv@Bo@? _+@>3?AB@? o @7>C?A0B-@? bp@X> ?@B@? ^J@{R>?fA0B5@? X@>ц?jA B@? W.@FP>Ұ?DAB@@? kC@>;?A9UB@? m@z>B?AB@F?:>`>H?!A0B`@F?7?H:>J?e@BE`@F?>?Qt>E?)AyUBXc@F?C?w>A?z)lAUBR @F??@@c>D?|:@B@F?4@9^>L?8[@@BF@F?=@Y>F?A UB@F?:@{I>H?@ʹBl@F?8A@3>J?{A B{@F?+@M">S?Ӎ@B7@F?En@B>@?{WAB8@F?8@ܽ>I?zA>Bn@?CU>g>?NA B@?F?K>6?9@Br@?MC?Ы>?<@!B7m@?B?ė>/?%@Bg%@?JV@ >?EAB@?D@8>?=@B@?H~@Z5>?aeA B3@?IB@{aq>z?APB@?Gr@X>?X@B @?;[@Tx>? A UBg@?H}@s>?AUB#$@?B@2>?m@v B@9?0>>0?A0BiT@9?:?I>)?#AB@9?=?3/>'?iA)UB@9?6?>,?8@BQi@9?9F@>*?ABh@9?E@9P>"0?A9@B@9?F@Yw>!?׬A)UB6@9?A\@{>$?AB@9?4@>-?@B3@9?>@C>'4?pWA B@6@9?8!@Ȏ>+k?JcA0BB@9?<@UH>(?$A@B@^?>|>?P@B;@^? ?F">?MAB~@^??ZB>C?A0B`@^? ?罡>?Q@ҫB$@^?@>?A@Bq@^?H@8zS>0? @@B@^?|@ZM>8?8AB@^?$@|G>?AB@^?_@z>m?}JA)UB·e@^?!^@%0>?z@B@^?@>?mAhB̍@^?@ >v?Ը@BdT@C>>[>6?z@BWl@C>we?H >'?~A`B3@C>z}?;>?A B@C>ry?~>?~vABMN@C>'@>?{APB@C>@8o>s?~fsA9UB/@C>o@Y[> ?|a@B£@C>@{>?x7@BA@C>u@{> ?}<%@@B@C>~y@RU>{?xA)UBa@C>z@1>?xAB @C>w*@}>?nA B@>Ux>w>N?u@BO@>l'?E;>y?jeA UBN@>`?>}?nAB@>pG?P^>x/?h@B@>l@>y?Tb@Bv.@>m@89>x?_ԒAUBM@>S@X>?o@B@>s@y>v?l%@B@>h@}>z?i@B @>g@Z>{?d8@B9@>Xr@>?VD@B@>e@>{?f8 ?Bg@>ab>{B>= ?dm?@B4@>j?G+>:?fNh@v Bʪ@>h?Ǧ>:?a@%WB3@>f?3>;?b AUB@>i@>:.?bs@B 4@>cm@7><9?]@v B@>m@Z>8?eU@B7@>f@{G>:?a@B@>g@m >:?d@BFl@>b@L>e@L>;?d_6@B_@>o"@>8?k!{@ҫBȝ@>H> >?x@B@>r?G>Z?g@BR@>?Լ>h?r@B\@>?_>~?jA0B'U@>_@>??vY@B +@>@8M>X?o@!Bv@>@Z>?l@ҫBm@>@{q&>?q@B@>a@o;>?k@BD@>u@K.>?qA.B2b@>g@Z>?e~AB r@>@s>?q`@eWB6@A>5 >C>U?= ?I>~?AB@A>;?>?@Bՠ@A>6y?T'>?@BRg@A>3@>?|@B،@A><#@8#>)?-@ 'B@A>57@Y >f?@B]@A>5P@|G>?@Be@A>=@ >~?ȁ@:ABO,@A>2@5>A?aA)UBc(@A>@K@>}?a@B]@A>;@>Y?8@B*@7>t>>?zj@B( @7>%?Gn> ?zAB@7>,?>?N@BS@7>i$?/>?|yAB@7>u@Ǚ>?s}A UB@7>@8G>?ABX@7>tQ@Y>V?yx?ʯ'B@7>y-@{.@>?}AUB@7>@h>h?%AB>@7>b@ >?{@v BK@7>@">A?}@Bv@7>@>W?XJ@ҫBeG@[?>>T?fA0BX@[??J>?bABѫ@[??C>?A0BU@[??}_>q?5@B@[?(@>?jA@B#@[?@8E>)?@ҫB@[?@Z>P?MA0BN@[?C@{`> ?@B @[?W@>?YuA B@[?@>^?kSABؾ@[?@>T? @B@[? @[>v?AbBA@?)`>).>`?/6@Be@?.F?H>]?'@B#@?/C? >\?n@B@?)[?>a? AB,}@?6*@>W?A v B@?-{@8|>]?A B @?4,@YK>YQ?q@B@?(@{;C>a5?1AUB@?8@j">U?&AB@?5@>W?YAB@?%@>c?rkA9UBH@?;@>S?/@B@??%>:>a1?SOAUBT@??"?Hj>cX?D.AB}@??H?>h?r=@BR@???$>m?IIA UB[@??@^>P?vAUBA@??^@8>O?%@B5@??@Yݪ>h?EABk@??@{>a?q.@B@??@3>k?A Bb@??@T>fO?`@By@??Ҽ@\>z?@@B>@??@w>[?AB`@~? +>> ?0RABr/@~? y?L>/ ?{wAB\ @~? ?>6?RAIUBYt@~? 4? >^?zLc@v BZ @~? @^>'?@B(U@~? @8&>)??A9UB͗[@~? @Yf->2?7@BP@~? #@{>&?pAB@~? "@ڻ>&?s@BȤ@~? (@9>#?@BƯt@~? @>1?y@ҫB'@~? .@B>E?Y]A B-@? a>>#?<@B@? F?I_>?FA B3@? F? >?A)UB3@? I?>?A B.@? E7@?@B@? K@8@>?r8@B>;@? O@Y&>?MAhB<@? b@zh>O?A UB.@? _@1>?aA0Bs@? J@>?@@B{@? @@>?=A@BV:@? K/@>?FABBUs@?>%>b?@BxY@??K8>?@AB@?ȵ?+>$?~ AiUB@?Ž?>?%A BJK@?Y@}>?A`Bj@?ȏ@8>]?l@B`@?͓@Z>?ABʡ+@?Y@|d>?zX@v Bȴ=@?@k>>I?~H2@B&@?@>?@B(3@?Ƀ@p>?2@@B@?k@b>?AB@5">~?R~ABv7@5~?U@B!_@5~M?W@BAa@5~6?VMABC@5~+?[@B@5~?T@Bʕ@5~!?Tb.A0BJ@5~?YW@v B@5~?ZQh@BȬ@5~b?RJ@B;@5~Y?\@B#@5~?T׌@ҫB~u@Y|?9>">zT?jXD@B@@Y|??G3>z@?foABI@Y|?Z?5>z[?ku#AUB`@Y|?Z?>zKk?p@B@Y|?c@>zN?b=AB)@Y|?@8>zX]?bj@v Be@Y|?@Z>z8?mhbAB/@Y|?%@{Y>za?co@B@Y|?(@c>zM?dV@B@Y|?@'1>zW,?oaAB@Y|?s@>zU?fF@B[@Y|?@>zZu?f@B#@}?* >>vB?_,@BŅ@}?W?HG>v?T3@B@}?R?>v(?U@B @}?D/?_>vɐ?M@B@}?S@(G>v?\A UBdp@}?^@8K>v?`@ҫB@}?A@YX?>vͯ?SA>B@}?m&@zE>v?QV@B8@}?K*@b>v?d]@Bz@}?>K@0>vҫ?O @Bl@}?U*@S>v:?S@ҫB@}?E@>v?S#@BTXTENSION= 'BINTABLE' /Written by IDL: Tue Sep 13 15:37:38 2011 BITPIX = 8 / NAXIS = 2 /Binary table NAXIS1 = 33 /Number of bytes per row NAXIS2 = 768 /Number of rows PCOUNT = 0 /Random parameter count GCOUNT = 1 /Group count TFIELDS = 9 /Number of columns COMMENT COMMENT *** End of mandatory fields *** COMMENT EXTNAME = 'stacked_cbe' / DATE = '2011-09-13' /Creation date X_POS = 1 / Y_POS = 0 / COMMENT COMMENT *** Column names *** COMMENT TTYPE1 = 'ROLL_ANGLE' / TTYPE2 = 'MODAMP ' / TTYPE3 = 'PHASE_MAP_CTR' / TTYPE4 = 'GRIDTRAN' / TTYPE5 = 'FLUX_VAR' / TTYPE6 = 'BACKGROUND' / TTYPE7 = 'COUNT ' / TTYPE8 = 'LIVETIME' / TTYPE9 = 'GAP ' / COMMENT COMMENT *** Column formats *** COMMENT TFORM1 = 'E ' / TFORM2 = 'E ' / TFORM3 = 'E ' / TFORM4 = 'E ' / TFORM5 = 'E ' / TFORM6 = 'E ' / TFORM7 = 'E ' / TFORM8 = 'E ' / TFORM9 = 'B ' / END =I?>m>Z?c+@B4=I?v?Kd>\"?f@B)p=I?W?0>]?lnF@B&=I??鷢>[?kwA0B/T=I?@W>Y?T;6AB$R=I?g@7>Z?ne@B$=I?[@Z>g?]w@@B,D=I? @{m>_?R@B q=I?@Y>k?`@B+=I?@s5>o?V?@B#`=I?E@t4>Vw?`@B,G=I?1@E>e?hR@B>?> >?|G@B>??B_<>?rr@BF>??G>?( AB83>??Q>[?kAB?>?@>t?~N@B8!y>?@7>-?}r@B)v>?@Yq>?u;@B?yL@{C>?@B3q>?Xp@z>?eAB7~>?n@&e>?`p@BGA>?@u>?|@B;>?@>?t@hB;>{S?$n->hU~>ߘ?Zj@ B+<>{S?%6?LA>b?y@ˣBK+>{S?$p?>?g`LA+4\B/4>{S?$?^>#?{@ABV>{S?$@>K?f3A* B2>{S?%$@8;j>z{S?$7@]H>>*?tl;AB*>{S?$@|<>?@TAB0n>{S?$j@5>?fOZ@@B#|>{S?%@o>u?r4A|BVb>{S?%@ہ>xK?p@ B'>{S?$@x>?w@B>?*[>>Ȕ?rwAEUUBw>?*?F>[?8A0BB>?+?O>z?@TAB>?*?鋺>?S@TAA*U>?*@_>L?IAB>?*T@9?>?@ B T>?*@Y,5>>?@ B>>?+@{>i?N@B>?*;@D`>?k@TAB>?+@ >{?@By>?*@[J>?{*@Bo>?*7@>Ψ?A0B/>1?0w>Jv>|?A 4\B1?0n?T6j>|ѣ?)@B5 >1?0?ԡ>|?a@B>1?0y:?{>|?A* B(q>1?0@`H>|?\AB) >1?0@7>|?@B .Z>1?0CX@Y>}?Y@B0>1?0@C@|->} i?>*@B*>1?0!@>|G?nYe@B>1?0a@v>|?@B->1?0|@8>|Ž?K@B(,>1?0V@~)>|?y@ B(zJ? :?5>l>v? @ B'=? :?5S?C>v?3?B#-? :?5O?Ȇ>v?~/AB, ? :?57?>v|?NA%|Bx? :?5@&>vu?@B=? :?5@7|>v2?9AB(X? :?5s@Z>vp?@B*{? :?5@}`o>vM?] @bB(!? :?5@#>vn?NAB#2f? :?5@B>vǣ?JqA|B&? :?5d,@s>w?^@B? :?5 @͑>v?@BL?#\?;H>>pEp=?;@AAF?#\?;N\?y>p??7@A t?#\?;=?6>pQ?D@A?#\?;?@=>pN?R@@A鴮?#\?; @9)>o?_@ A@h?#\?;gP@YY<>p ?@AڜZ?#\?;a @{>p(?3@TAA??#\?;p@s>p?@@A?#\?;]@>p,?@ A ?#\?;F<@Ey>pGE?@A0?#\?;C@2*>pK'?fA|AY?<~???>L>k0W?A|B?<~???P>k[?eAB4?<~??Q?2>k4?@BQ?<~??µ?19>k0?|z@BW?<~??M@1>k@?u@@Al?<~??@8>k*?F@Aů?<~??u@X>k3?2@BAz?<~??@z>kU=?@AJ B ?<~??}@(Q>kR?@B?<~?? @O>k?4@B ?<~??5@; >k5|?@A?<~??T@>k1T?‘@Bj?U?C>l>f2?VA|BƮ?U?C?E>f?iFA}B?U?C?B>fs?g@ Bx?U?C?0>f.?x@BL?U?C@>f?uABMc?U?C1@8%>f|??(@ B?U?C@Yh<>ff?AAU}B?U?C@>fh?uA B6?U?C@4>f?@A^?U?CY@m_>f,? @B A?U?C@y>fu?3@BH?n?GLY>>b?{AB(1?n?G}H?Kkw>b?@B+?n?Ga ?Gk>b?AB?n?G]A?쯩>b?6AB'/?n?G@>bi?A|B?n?GOw@7*I>b?cS@ B@?n?G@Zl>b?N]ADB;?n?G[ @{">b5?aA0B6ޡ?n?Gw@z >b?]@B??n?Gad@H>b+?1@ B,&=?n?GP@7>bi?9U@B>A?n?GV @T>b?@\AB&R?h?J>>`?A|B(?h?I?I<@>`Q?@B+t?h?I4?4I>``?&`@B0A+?h?J{?>`.?”@@B3m?h?J +@>`)?+I@ B+ ?h?J@92H>`5?@B3?h?J>@Z(>_?,@B*?h?J*z@{`r>` ?-@B*}?h?J'@`x>` ?x:@@B,mn?h?J&)@V;>` ?OW@B(Y?h?J@!a>`"?N@B6!L?h?I*@>`:?QA B4?e?La>{n>]G?<ABi?e?L%?MǑ>]?JA B}?e?Lql?>]? @B>?e?L?73>]?gG@ B8d?e?L@>]B?AB+A?e?L@75>]?@B%K?e?L@Y>]o?Ѷ?B<?e?L@{>]??e@hB+?e?L@>]X?*#@B(w?e?L@>]?d@Bs ?e?L@|>]i?@B A?e?L@>]?@B h ?c?M>n(>\l?@BW7?c?M?G>\?ABk?c?M?N>\d!?AB[A?c?M?>\Z?W@BUϡ?c?N0@>\? A|B?o\?c?N!Q@8h>\!t?=A B+2s?c?MT@Y=>\VL?@B ?c?M@z:6>\b?r@B ~1?c?M@Ų>\c?@BT!?c?ML@O>\a?PA0BkL?c?M.@5\>\?lj@B#<?c?M@:>\?o@B7٬?a?O1>mM>[N?2<@@A?a?O?Gq>Z?+@A?a?O?f>Zw?(AAl?a?N?>[X?Db@AcA@?a?N@'=>[ge?77@@B3?a?NLo@:Z2>\'? b@@BP?a?N@Wg>[?rւAZ B?a?O @x+>[^?jA%}B:?a?N3@>[?@B0g?a?O$@Y>[<6?2A B_?a?Ou4@Ӑ>Z ?"Ae}B{+?a?On@>Z?lA B( n?6^?O>k>Z?W@A?6^?O?D[>[=?6@@A5=?6^?O?j>[?@@t?6^?N%?O>[>,?@ݦ?6^?Ol@q>[ ?P@A(?6^?N:v@=>\b`? @BD?6^?NN@Xm>[w?yA|Bݠ?6^?O*_@x>[ru?bAB|?6^?N@f->[?m@BCʱ?6^?N@>[R?@B k?6^?O|@=>[l?颔A BO??6^?O@>Z@AA ?\?N>:>\?ˀA%|Bf8?\?N9&?G">\?@AB'?\?ND?>\?` A4\B/j?\?N?gs>\_?0@ B[?\?Nf@J>\?D@hB?\?Nf@8>\U?@Bv4?\?N<@Y>\?g@ A?\?N @z>\K?U@@A=?\?N@4J>\$?Ϭ@A买?\?N@Q>\K?@A삭?\?M@Df>\!?G@B+?\?N 7@>\?A0BGK'?XZ?LIC>u>_!?@@BZ-?XZ?Lp?C*>^?q@B\?XZ?LyW?;>^e?L@B^?XZ?L ?>^N?x@BPaD?XZ?Ls@M>^u?3A BR?XZ?Ls@9>^4?y @BX*>?XZ?L[@Ya>^?J@hBB?XZ?L@z>^?eN@B_GC?XZ?L0@e>^?@BON?XZ?LS@>_B?@ BK?XZ?L[%@>_ ?*ABI?XZ?LY@r >_?dA0B<.?X?I>Y>a?/@B8?X?J6?F@&>a?s/ABK?X?J>r?<>a?ABT+1?X?J;?M>a9?6iABanK?X?JZ@>ae!?tABc?X?J)@8Z>a?@Bg0?X?J!@ZB>a??A1vBfn?X?J&p@|M4>a?< A`BfN?X?J"@ >a?P@B_I?X?I<@|>a.?z%AK4\BWLo?X?I@>a?@Bs?X?I@R>a?6@ BRi?zU?G@>5>d?^@ABd1?zU?G(?H>d?{@A|BJy?zU?G:n?>d?A Bt?zU?GC0?[>dO?}A@B^t%?zU?GW9@e>d?A`Bu??zU?G!@8[>e?NAPB?zU?G(S@Y>e ?A%|Bd?zU?G@z,>e@?sA|Br+?zU?G9@>d?b@hBij?zU?G !@>e-? @BJo?zU?G'@>e?v=@BF?zU?GF@tP>d?@ BJU? S?C>?>h~?@ABzc? S?CL?I>h5?4@hBjw? S?CR?)>hP?AB[q? S?C?>hu?A|Bg? S?CP@ˌ>h?A0B^}M? S?Co@93D>h ?2@BDQ? S?C}@Y@>i?֏@hBE? S?CU@|Q>h#?A%}Bn=? S?C@4>hm?QrABS? S?C@j|>hτ?{8@Bc? S?C@Q>h˒?AB|? S?Cs@%>i?@@ BfY@(??n>C.>mu?rABKB@(???L>m]m@?iSABDD@(???l>m>?RADBNa@(??@>m>?@ BBC@(??*@7>mEG?A0BQ@(??@Y}>mi?A`BCX@(??@zW>mO-?A|B:@(??@E>m?r@BL@(??@>mc?@BL@(??@>mw?{@B>@(??@>mPr?'@BK+_@?;>ۅ>r^?a@ B' @?;?L>r?@hB@?;7?cY>rr?s@hB#V@?;BS?O>riI?ύ@B(@?;/ @;>r? @lpB'@?;\@7jD>r?@B(@?;4&@YL>r|)?A0B8y@?;@{Q>r?J@B,C@?; @>r?A@B37)@?;@H>r?*ABI@?;@>r?@B#@?:@R>r?.@B3@ _&?5>|t@>x?/z@ B%Z@ _&?5?H>x(?@Bg]@ _&?5?E>x?׉@ B#n @ _&?5L?>xZ??Bk.@ _&?52@>xֈ?ss@B@ _&?5@:Y>x[?fABR@ _&?5@ZW>x?jU@ Akx@ _&?5@xF%>x?@B@ _&?5ļ@>x?@@B@ _&?5@(>xI?@B@ _&?51@~)>x?Ɏ@ B+@ _&?5ܾ@~>x?vU@B/@?/>s}>?h1@@B޲@?0?J:>~?@B߱@?0j??> ?D@ B@?0Ew?&>??@B@?0@=>~?mAB H:@?0T@6i>'? @B@?0b@XA>n?xv@BF@?0l @{ɔ> ~?G@BE@?0G@/>9?n?B@?0}@>~z?@Br@?0S@H$>)Q?@Bt@?0=E@>FH?2]@ABs@$?+dZ>)>&?@ B %@$?+5?I>?gADAZ@$?+a?y>?(@B @$?+;?,>?~AB @$?+T@:>S?o@AAs@$?+g@9FC>?4UABf@$?+@@[>?xh@@A@$?+@{ >(?L@Bȸ@$?+"/@ >?O@@B 3@$?+]M@9>?@BB@$?+s@ k> ?[@B/@$?+:@܏>?K@B#@ 8?$ >i>?vA 4\B*?Ae}B>@ 8?$k?k>?WADBAÌ@ 8?%[8?>w ?zA5|BE@ 8?%W@>yd? @ B@ 8?%2v@6>?ABBG@ 8?%@Y&>?@B?t@ 8?%@|>E?A B=@ 8?% 3@D>`? A@B0@ 8?%C@>\?>A+4\BCܘ@ 8?%@)@>?A|BGU'@ 8?%w@\4>d?A%}BG@&!?<>v?>Y?.@TAB'@&!? f?F$>?4AB/f@&!??>?&4@B;m@&!? ?>h?@B@&!? 0V@ڿ>?xABJ@&!? x@:;(>f?4AB(N@&!?@Y6>?c=AB,'~@&!? {@{uT>?a@hB;!,@&!? *@,>?'@B(U@&!?<@>&?{@ B8=@&!? @W>7?AB(@&!?@ >{?`@B< 6@,ɠ?>2U>?cAAB=@,ɠ?_?G@>?E@B @,ɠ??u[>*?|S@hB@,ɠ??8>5?@BE@,ɠ?4@h>r?Eu@B@,ɠ? @7/>C?*A B]&@,ɠ?0@Zt>v$?A|B3%@,ɠ?3@{;>s?A>Bf"@,ɠ?@/>R?).@B:@,ɠ?6d@^>p?@@B@,ɠ?@r>??B@,ɠ?@E>p? @ B/@3?>Z>)?@B,6o@3?̏?Os>@?AB @3?~?,4>T?@ B _@3??">ޱ?˭@B%@3?"@->!?o@B7%@3?)@5w>Ӿ? pABNJ@3?@ZAt>?|!@ B &j@3?@}7>$?tR@hB3@3?P@<>Q?@ B @3?@>?vA0B"Ҹ@3?@[>y?h?٢B@3?n@N>E?@B @9Z?>I>zl?AB"@9Z?h?B{>I?@B v*@9Z?0?oZ>I]?k,@TAB/94@9Z??{_>i?m@@BH@9Z?A@;> ?A@B/t@9Z?)@;W>N?@TAB':@9Z?~@Y>u ?{A B d%@9Z?@z-A>?+@ B2@9Z?A@P>>y?@ B+k@9Z?\@S6>q>?A 4\B|@9Z?@:>#?ų@B#4X@9Z?;@x>A?@B):@??P>N>?@B.S@???H)>)?o[@B0g@???>>!?"AB4ln@??b?,>?wA@B3@??8@h>?JA|B1-@??ӑ@7f>ٓ?=@B+H@??@Y?>Ɩ?m?@B*@??>@z>? @B0=@??@A>R?A%}B+@??g@>f? BAB3@??@>?A0B+qN@??@3>?6@B-c@E? I8>(>]?6@ABU.@E? b?N8>?HA;4\BPx&@E? ?hQ>?b@A 4\B8Mj@E? Fe?>%?@BU@E? q@\>?A|BS @E?i@7>$?@ B1U@E? ?%@W*>J?A: BT@E? G@| >.?ABZf)@E? "@>?@B@0_@E? J@q>j?D@ BX,@E? F@>?M)AE|BZ!@E? @>?C@BIpj@L4?&&>>?AB[-@L4?%Ħ?AZm>]M?~ABGw@L4?%?>?1@Bw*@L4?%?nu>B?^A BWd@L4?%n@>]?{R@ABJc@L4?%@:>cG?q@Bl@L4?%*@[>Sy? @ B>)@L4?% @zɇ>i?=@@BVb@L4?%ʎ@Cg>Y]?W@BZ`@L4?%q@F\>c?@BDX@L4?%@;>??T@BS@L4?%]@J>|?<;ABZF@R|?,>|>!?q;@B T8@R|?+?E>z?|P@BJ@R|?,t_?—>,?z1AB4t@R|?,?'D>a?} @B=7@R|?,Q@_>A?z @BF@R|?,`R@9-Y>7?@@@B5$@R|?+@Y>z?lb@B?l8@R|?,?|@z>Mi?@B/@R|?,@>`?yo@B>G@R|?,5@>S?yM@B;p/@R|?,@O>i?}@B>C@R|?,@CN>b?xV@@B8@X?2>Z>|t?P@B3k@X?25?L>|?qA@BN@X?2>?1>}?s_H@ B@X?2{?Y>|X?NeABM@X?2m@ >|4?Q5@ B(OG@X?2@8>|?x@BJ6@X?1G@Z>}&?@BF8@X?2&@z>|?{@ BC?p@X?2k@O>|?V!(@B+@X?2@_>|?{woAPBM@X?2C@Bs>}a?x4ABޱ@X?2xd@y>|ۓ?tABJb@_ ?8a'>y>u;?@BZn@_ ?8C?H>v?&@BB4@_ ?8>z?1>v ?iv@B[+@_ ?8w?>uF?{AB=@_ ?8L@>u??AB@'@_ ?8Zc@6>u?@B^g@_ ?8ag@Y>u$?2AU|BZ?@_ ?8_C@{>u?pxA@BNXV@_ ?8eH@]'>u݉?^A BV]@_ ?8.@x>v?C @BN@_ ?8R@R>u?z@BKP@_ ?8@@R>v?d,@B2},@eV?> >j>n?o@B$@eV?>G?K;>na?!@@B,@eV?>v?5>n?@AB(*B@eV?>F?>n?oO@ B>t@eV?>@>n?@ B;)k@eV?>@;]>nJ?4X@ BG@eV?>%@\H>nM2?UK@B @eV?>@y>n?s@ B(l@eV?>q@^X>n?6@ʪB+1@eV?>k@ԍ>n]?@hBBM@eV?>;~@VV>o(n?K@B1@eV?>dM@@>n2?]}AJ BPR_@k?C>L>h?A}BG@k?C?L)>hh|?AB8 i@k?Cn?E>h?AB>f@k?Cߵ@W>h?3@B9w@k?D:@6O>hE?@AB4R@k?C@W>h?@BC@k?C@zX>hS?YABSQ@k?CK@C>h?A0BJ@k?D@ >hoE?_B@ABK^@k?C @>hh?@ BDd@k?CJ@>h?(:@B4@q?I;>>b?"AB4?@q?I91?I4>b?w?B>ȉ@q?I8O?>bG?AE}B=@q?I\Y?>b?A0BE0N@q?I\@>bc?L@@BJ @q?IuB@9>b{?<AB8*@q?I,@Y>bo?@B7@q?I@zc>bbD?@B2@q?I@>bf ?NAB>u@q?IH@!>by?m4@ B2@q?I?S@H>b?|@B/B@q?I:@L>b"? @ B4@x/?N>>]?0 @B!_X@x/?N?G>]?`@B@x/?N8 ?i>]z?A}B@x/?NJ?3=>]d?%A%UUB$q@x/?NS@":>]\?AB.,@x/?N^@;1>]R,?AB$ _@x/?N]@[>]Q?a@B@x/?NlE@zj>]Bf?9A B$e@x/?N~@ >].?*h@B-@x/?NM@>]a?&M@ B,z@x/?NO@J>>]^?tU@B0@x/?N@>]?r@@B3J@~x?S\>>Xm?iw@BHe)@~x?R?G>X}?iIA%}BU@~x?S ?~>Xd?pA@Bj<@~x?S/?ʀ>XPa?V(@ABGj@~x?S_@>X_v?{I9A|BK@@~x?R6@7>X?g"@BHqT@~x?RJ@X0>X?n@B@@~x?Rd@z\>X?yABO@~x?S,@ >XD?jj$@B4ZQ@~x?RV@;W>X9?~@B[V@~x?S@~>Xd?d,@BXl@~x?S @k>X[i?j<@BRĀ@`H?V>C>T0?sA0BX @`H?VP?IE>Tc?d˫A5}B(@`H?V?>T?oA B:±@`H?V?&>T5?k@B9+9@`H?VoE@>T?h0`A@B?@`H?V@8>T6?hfA BQy@`H?V+@Zg!>T@?`R@B[T@`H?V@{J3>T??o|A0B\Q@`H?VҔ@>Tm?RKABWK]@`H?V@">T[?YA BO;@`H?V@>Te?s @BW@`H?V@ S>TS+?Ub@@hB x>QD?^P@By@?YC?F2>Q[@?eM@hB3g@?Y?>Qo.?yOr@hB/5}@?Y?>Qb?wA+4\B4b@?YG@^E>QGt?i[@B4D@?Y%@:>QMy?z@B;8@?Y@[>Q,X?v@@B+C@?Y׆@})>Q~?g@jB- @?YD@>Q)?xR@B)]@?Yv@>Q:?w[@B/Nr@?YA@>Q?|AAB/@?YN@>Q?p|@B#G@?[>(`>Nҳ?@B$c@?[ƅ?A>N?.@@BK'@?[?,>N>?r'@ B{8@?[?P>N?g@@B w@?[}@Z4>N? @ A{@?[@7>N?@BVb@?[?@ZF>N?<@BND?@B@?\ @>>N}V?h@AJ@?[@D>N?~@@BN@?\,@>N^J?{"@B'k@?[@ǃ>N?hH@B.d@?]> >L?sB)@?]W?Lk>L|?j]@ B,M@?]?">L?A B& @?]?T/>L? [@B!y@?]*@>L?@B@?]@9@>L?e?A@?]@[>Lm?a"@hA=@?]I1@|Ϊ>Mo?8N@A5@?]*@>M"{?K?BKf@?]5@ێ>M?ADB @?];@>M -?BABD@?]@e>L?@B@F?^>}>K ?Ss@B+@F?\?M(J>Mp?s@AI,@F?]6?>LP?Ú@@TAA{@F?]V?f>L?چ@B!@F?]@>L?fAu|B<9@F?^D=@8d>K?~@B@F?^@[>K ?lY@AB2 @F?^@yh>K^B?]}&APBZ(@F?^r@@>K;?bA* Bn%@F?]#@/z>L?kiA1vBCإ@F?^@>K:K?B4@Ax5@?]7>ê>K?-@AH@?\[?J4>M?`@A@?]!5?l>LX?ŭ|@@Aҙn@?]X2?A>L"?A: Bz@?]w=@>Lp?ٚ@B@?^~@9>>JQ?G@A^@?^/@Zs4>J?@B3B{@?^@y>J?,A@B\|@?^]@>K?'"AB @?^?@F>K?npA`Bus@?]aj@1>L?@A_L@@9?]>>K?R(@BS@9?]?H(>K?R'5@B(_%@9?]a?p>KБ?B@AB G@9?]?>K>?9@B@9?]}W@6y>L'?]1#?٢A@9?]I@6>LZ?}|@@A&@9?]w@[>L*?l;D@Av@9?]b@|9 >LD~?<@A!@9?]~@%>L+?5@ Ato@9?]q@K>L;?Ml@Aڣ@9?]Ud@\>LW?hAB@9?]`@>LP=?w-A B ,@^?[>C>Mr?X@AB@^?[4?NI]>M ?@AT@^?[?>M?@AJ@^?[o*?q>Nr?@@Ak@^?[@9>Ma?g@AJ@^?[@8π>Mo?@AE>@^?[C@[2>M?}@@A c@^?[r@|>M-?@A@^?[1@>M?4@@BI@^?[;@a\>M?@@B(r@^?[@>M??Bv@^?\@4>M?@A!@C?Yq>>P?@ B?Ҩ@C?Y?HD:>OM?z5@B>T@C?Y+?B>OD?}@B/ N@C?Yy?>O?Ş@B3@C?Yy5@^>O?|ABCk@C?Yh.@7>P ?GAB8.u@C?YuL@Y.>P?A BD@C?Y)@z#>O7?-?٢B9@C?Y]@>OJ?{2 A%|B@"@C?Y@>O?sA B6T@C?Y@P>O(?{ZA BD"@C?Y@>O1?m@@BFת@?V?>>RZ?)@ BG$@?V?K>R?t~@B/'@?Vj)?2>S?|z@B7@?V? >R?G@AB(@?VS@/>S._?A@BA@?V@9>R?W?@AB$h@?VS@X$>R?YA+4\B:]@?Vq@|n>R?AE|BI@?VA@>SB?(A0B;э@?V@2>Ry?l6ABJ@?V@1e>RO?K@BL=s@?VS@>Ra?ub@ B7@?R>>W1?HcAB?@?R?Hb>V??"@ B0@?R?л>Vv?UA;4\B?8@?R?m>>V?~}@B@3@?R5@ )>W?A B;@?R@9Lw>Vb?w@B:;@?R'@Zr>V9?QA B2@@?Re@z>VK?,A: Be@?R@X>Vħ?A5}BA@?R@>VK?@B&9@?R@m>V?AB!>g@?R@I>V|?s@BFs@?N>>[ ?w@B9@?N?G<#>Z5?lvA|BW`a@?N?>ZU?!AE}BE٨@?N?s>[?w@ B<@?N@>[$$?-,@B6ð@?N@6!>[+?zABH@?Nl@Y->Z?z@ BZW@?N@|-!>Z??}S@B?W@?N1@%>ZS?q@BH@?N6@>Z|?A0BB@?N@>["?xm@ BB@?N֧@qf>Z?}ABU9@A?Iط>>`#H?JA|B"H~@A?IǪ?H<>`6?A`B&y @A?Iv?>` a?A0B(@A?Iy?`>`?~@B/+@A?I@)>`?A|B"@A?J@8Q>_?zA0B,w@A?I@Z^>`?@B+@@A?I"@|>`R?@B,y@A?J@>_?W<A|Bu@A?J@/>_r?t@@B'@A?J<@V>_K?r@@B!R^@A?J @1>_t?zT@@B@7?DJ>g6>e?A%}B @7?D?F >eۨ?v,@B>S@7?D^?>e?@hBa@7?D?>e?6ADA@7?D@>e?WA|B8@7?D@8}>e?gM@BЕ@7?D@Xy>eZ?$A|B@7?D֞@y)>e9?Bc@7?Dy@ݙ>e?A0B({@7?Dy@& >f?@B5@7?D8@8>e?@BM@7?DT@6K>e?u@B@[?>f>>lj?;@B s@[?>z?N>l3?@@B!6@[?>v?>lڀ?@@@A \@[?>Z]?>l%??B p@[?>XZ@x|>l?iy?B5@[?>@8>l?@@B @[?>b@[E>l ?g@B A@[?>B@}Z>l?@B8@[?>@2>li[?@@A@[?>[\@ >l?mABJX@[?>Q@|>m?P@B@[?>/@6;>m(?JAA5@?8 >u[v>s>?"@@BD=@?8m>?Hf>s?AB?q@?8\? >s?LAB>]@?8!?>spi?@B)h@?8v@>s?r@B*@?8|8@8>s?d@B@-@?8u@[>s?CAB,kI@?8@{D>s?@hB7z@?8@M>slQ?|@BB@?8x@[>s?_A|Bs'?mAE}B9^@?8@C:>szZ?gAB,ۭ@??2>p>z?!8AU|B^D@??2y?R0x>z?|A|B6@??2.? >z?9*A|BDD@??2?:>zdz?z@BS@??2U@z>z,?ƐABl@??2b@;8>z?uW@ BB@??2#@V,>{?v@Bl@??2@wf>zX?zMA Ba~@??2*@U>z@?UAPBa#b@??2z'@>z?rAB;@??2'@>{?o[AB.G@??2@x@>zx?~'LABbM@~?,t>o>?GAB+@~?,x?G$>?A0B6@~?,[6?k>w?AB*c@~?,v?Z>?/ADBE@~?,@͌>?@B@~?,t@7o >?C@AB@~?,@Y$>?_T@B?@~?,ĥ@zP>?@B! @~?,f@Z_>?lA|BNT@~?,A@ i>?y-@B4@~?,V@/>?dy@B!@~?,o@KO> ?zA}BD @?&y>> ?sN@BA@?&?K>{?`A0B(7@?&?g6>?cTd@B* @?&%?qR>?g/ABB@?&@>?eI@B,@?&$@8>?i@B6@?&5@Z>y?[A%}B;@?&~u@| >?k@hB,R@?&B@+>?k@B/@?&@>?i!AB/v@?&@zR>X?m|U@B0@?&@W>?Y0@B4y @? >s>f=?MW@B/W@? }?D>?^$@BQ @? :?7>Y?d~A BA@? ?#>i?T{@B.>a@? v@T>8?^A B\E@? 4@;>`?[@B,@? }@X>x?_@B<@? @{*>s?S<ABNf@? e@X>WO?U'@B>@? @>w?P|@B*$@? @j(>p?Z@ABK@? @jl>lD?c:@B@>@5>?rA B7uI@5I?WDAUUB( @5H?r'@BW@5?m=@ B8~@5?gQ>@B7c/@5S?q^@TABLO@5f?t-'@B+ʧ@5?m?B8@5S?v AB^@5@?oZ?B6s@5?_g@ B3%@5Q?s$A|Ba_@Y|?>F> ?^@B>@Y|??GU>?sA%|B*@Y|??#>"?x*ABT@Y|? ;?D4>q?G?AB?@Y|?@>>%[?@ B.@Y|?"@7>?sHA1vBM2@Y|?@Z@>?ycA0BAK@Y|?@|V>*,?@B:x@Y|?S@ >?o@B:P@Y|?@D,>?~?sABQ@Y|?@8>#?)AB1@Y|?@>-&?qA0BO> @}?>|lm>?YFA0BQD@}??EW>?n=A0BT @}??A>f?d@BVN@}??K>?Z؝@ BOt@}?@>5?khABi@}?@8>?m@BSº@}?@Ytc>?^ABU4@}?@{>?x3@Bg@}?k@z>w?liz@BO]@}?O@>?[4@pBR4@}?x@ >?lA BVK?@}?Y@> ?j@ABG% XTENSION= 'BINTABLE' /Written by IDL: Tue Sep 13 15:37:38 2011 BITPIX = 8 / NAXIS = 2 /Binary table NAXIS1 = 33 /Number of bytes per row NAXIS2 = 384 /Number of rows PCOUNT = 0 /Random parameter count GCOUNT = 1 /Group count TFIELDS = 9 /Number of columns COMMENT COMMENT *** End of mandatory fields *** COMMENT EXTNAME = 'stacked_cbe' / DATE = '2011-09-13' /Creation date X_POS = 2 / Y_POS = 0 / COMMENT COMMENT *** Column names *** COMMENT TTYPE1 = 'ROLL_ANGLE' / TTYPE2 = 'MODAMP ' / TTYPE3 = 'PHASE_MAP_CTR' / TTYPE4 = 'GRIDTRAN' / TTYPE5 = 'FLUX_VAR' / TTYPE6 = 'BACKGROUND' / TTYPE7 = 'COUNT ' / TTYPE8 = 'LIVETIME' / TTYPE9 = 'GAP ' / COMMENT COMMENT *** Column formats *** COMMENT TFORM1 = 'E ' / TFORM2 = 'E ' / TFORM3 = 'E ' / TFORM4 = 'E ' / TFORM5 = 'E ' / TFORM6 = 'E ' / TFORM7 = 'E ' / TFORM8 = 'E ' / TFORM9 = 'B ' / END =?n>lv>ڬ?>ٲ@B"F=??Ge)>?G@B3=? ?eT>?A)AB0 =??=>3?70Bm =?@)%>֫?95@@B(a=?}@7>??I|AzB#=?@z>8?6w AB)Ȧ=?@q>.2?J@Bp=?u@ (>?HWAB%G=?ߝ@@>]?0=@B'2/=?צ@>=?J$@B w>?j\>G> Z?@@@Bb>?qd?JS_> q?6@@B+>??O> O?3Ѳ@`B1S>?W?> |Z?-S@@B>?L@S> ?<.@AB!>?@7> ?A~@BP0>?@Y > V?CoF@AB1>?c@z> u?M?@B1>?vW@[> ?K6@aB7S>?@> ?e?B*>?X@ > ?G@@B5>?Tv@> _?<B +>S?f>@> @f?#@BZ5>S?P?G]> dZ?nPA B>S?e|? > A?EAPBJ>S?#?5> ?EA(zB-4>S?@D> q? A0B w>S?@@8 > ?A8zAr>S?@X7> ?rAX5B[>S?Od@z> Z+?@B%b>S?:@-> sF?D@At>S?ۜ@y> ?gx@@BAӟ>S?@)> -?u5@B(g>S?@> ?a?B ?/?f>-> th?U@KVBL+s?/?n?R f> b?YA`Bz?/?]?> ?eABGj?/? ?|]> :?>e@AB,?/?y@> !?DM@ABߒ?/?@: > 2^?5 @VA9?/?0@Y;W> ͛?k@B"*?/?$@y > &?SAA?/?%@> ? @A`C?/?@Fz> h?nf@B ?/?z@> ?q;5@@Acj?/?S@> ?@A?b1?R>> I?&@!B/E?b1??F2"> W?~R@`BKvJ?b1?o?I> ?@ABOg?b1?+?> q?ABH ?b1?@> ?b!A BC?b1?~@9QZ> ~?EA jB:)?b1?@Z> qX?&AyoB>?b1?r@{ > 4? AXzBR7?b1?|Z@A%> ?=A=PBD?b1?_/@> ?!ApBh?b1?X@> ?_AzBC(?b1?C@> W?"A@ABS?:?v>qS>?^@@BKeS?:?y?G#>?}^@@B[z@?:?gV?B>/?*@BI,?:?~D?뛲>(?6@B\`?:?f@u>0?A@BQ.w?:?v@8h>?0ApB]?:?]C@Y\>>?ApBA5?:?q@zY> ?& A0BR:?:?N@`>S?EAPBB?:?M@v>T?A@B@X?:?Q{@>O?AzBO?:?y @ >?G@ABSz?\?^>>u?o@B= ?\??Ib>n?%A8zB>??\?P?b>W?@aB@bQ?\?z?>?˔A`B@>?\?pv@@>?NA0B>ǻ?\?~@6>9?@AB/?\?@W>rl?֖AHzBHFf?\?@zÁ>d?WALjBVW?\?@C>5R?+@ABCl?\?@>vG?uABKS?\?@>J?PA0B>qM?\?,@>g? @B>'?~?24> > M?AjBVo?~?֟?Q>!?ƊA=PB/=u?~?-c?C > ?wA@B7u?~?z?>!Y?cA]BeV?~?@3>>!?ު@BIÃ?~?@9(J>!K?]@B?a?~?@W>!^@?VAXzBB?~?0@zV> ?c@`BK/?~?@>!`?@`B2?~?-@1>!?AzBM ?~?&o@>!?AzB4?~?X@>!|?9ABTX?ՠ?>>-9?M~ABF?ՠ??A>-`?fA`B=s?ՠ?!?o>,?ABb~ ?ՠ??ە>-W? A0B=g?ՠ?4@;>,[?zAxzBE=?ՠ?U@9>-K?&ABZM?ՠ?@[>-Ih?>AB6?ՠ?/@z>,_?@BI`?ՠ?@>-+h?yAB^?ՠ?&@>,%?A8zB>I?ՠ?@>-?EuAmB:ҟ?ՠ?4@{>,?A=PBd??q>r>:\?bAxzB(??q?Ik>:?vAzB.v??r"3?>9?APB0ס??qt?>:B?{A8zB7,??r @}^>:?ΩAHzB({??r<0@9>9?cA@B*??qӾ@Y>:8?j@B$L??r0@z/>9S?QA@B3??qSd@0>:?ApB+vq??r0@>9UQ?7@B??q@>:R?2APB5-??r@ )>9?AA jB( @h?bߍ>ѡ>H~?@BRr@h?c~?RFG>G\? 8@B+f@h?b?T>Hׂ??@AB 4@h?c ?w>H?kAB?H@h?c@M>H8??KB O@h?b@5`>I6?$A ABM0@h?cF@^9f>Hw ?A=PBD@h?b@~m>H?JApB@h?c@>H6%?b3AxzB$@h?cC@>Hu?0A,jB-@h?bp@^>IK?@BI/@h?c1Y@5z>H?;V@B6m@e?\>}>O?p@Bp@e?\|?c>O0G?AB#"7@e?\&?>O a?ʠ@BNK%@e?\?>O@?}}@BrCj@e?\@>N?EAXzB@e?\G@8>Oe?q:ABd@e?\V@Za>O?AzB@e?\0@xA>O3?o%Ap@B;@e?\\@H>OB?[AhzBKQ@e?\8@>N?}Ae+ B'v@e?\w@ >O=?z;A0Bp;@e?\@s>N?AXzB@c?`P>Z>K?={AB:@c?`K?jHA jB>N@c?`"?>K?A B,#:@c?`X?>K?A8zB2\{@c?`O@>KU?7q@VB:@c?`U1@8>K?_KAHzB9@c?_y@Y>L3F?:A=PB2 K@c?`]@{C>K?GGApB2@c?`d@z>K؜?BIAB=L&@c?`P@s#>K?YAB8J@c?`J@ݐ>K?#DAzB7V@c?`@n>Kː?A B;U@)a?k>zX>@aD?ABM@)a?lyI?T.>??[ABGW@)a?k?>@K?cA B#? ?AzBG+@)a?lC@>?C?FA@BW]@)a?l@:7C>@ ?5AB#'@)a?le@YD >?@?AAAtB?n@)a?k@}.>@!?=ABMd@)a?l@>@ ?eAB%YR@)a?l8?@jk>?Y?A@B@ @)a?k@>@!%?PABDk@)a?k@B>@[?AtA B$>@66^?y6>>3]?AB:@66^?y?S>3;?@B7@66^?y٤?H>3?̬AB.R@66^?y ?p>3 ?TiA B+@66^?y@7>3&|?^@AB3&@@66^?y8@91L>3 ]?@B&$@66^?y@Y>3?@B:@66^?yy@z{>2?aA B$Q@66^?y8@>3]?˓ApB;\@66^?y@>3J?AB+@66^?yԯ@%>36?A0B!$t@66^?y"@>3?$OA@B7@B\?>5>*-?z@B7,@B\??Ko>)?AB@B\?!E?i>)?]A B/@Q@B\?$?c>)D?A B4~@B\?S@a+>)?<AB,@B\?@9ח>)??@B,@B\?@]H>)?@`B5@B\?0F@~ڙ>)?wA8zB@B\?@o>)K?AB+i@B\?'@J>)S?AB.@B\?"@!>)X?A0B(@B\?$@P>)M?sA0B0@OXZ?>M>"G"H?A B;1"@OXZ??@>"d?FA8zBR0@OXZ??=>"0?A@B?j@OXZ?g@y/>"Y?A(zB@l@OXZ?@:M>"^5???APB=6@OXZ?@Z>"Z? AB0@OXZ?]@z>"?@B#6@OXZ?@->"L/?oA0B7\@OXZ?@=>"?@B"?xA%+ BRV@OXZ?o@!>"*H?,AzBJ7@[X?>>d?E@AB'@[X??D3>ε?YsA(zB=|@[X??E>?APBK-@[X??`>?vUAB;8@[X?@>S?yxAzBLf@[X?@7B>b?| AmBK@[X?R@Z>W?AB38@[X?@|!>?XABD-@[X? @">ں?%AB'^@[X?@>?1@AB<_&@[X?@/>L?|bAB;@[X?@>?&@BC@hzU?be>f >h?f AB/c@hzU?SG?N %>~T?"@ABJ@hzU?`?>g-?l@ABg2@hzU?u?>7?ABB@@hzU?@#> ?)AB@hzU?@: [>i?*aA@BB"@hzU?@W>z?\K3A`B7@hzU?@{_>(?sAX5Br@hzU?]@>K?mAzB*@hzU?ҩ@>;?uQAPBf1@hzU?@>?f%@ABf}r@hzU?@j>?FLAzB{p@u S?q>}>-?}.A%+ B;[@u S?Q ?MK>>?@BR@@u S?l?c>.?ܚ@Bm6@u S??>?B@AB0 @u S?I@N >? A8zB/@u S?]@;!>I?.TA(zBc$@u S?@Wl>?=4AB;@u S?@z>?[@B@u S?O@:>?AzB2@u S?@|>}?A0BO@u S?7@n>g?jtABvЀ@u S?B@@>?T APBJ]@(?>>3?A BN/U@(??J>'`?ڵABO@(?? >"?)A=PBZ @(? ?>?; A@BR @(?@\>?(A=PBa @(?'@7>I?J6AA?A BVx@(?-@|p>1?A@B;>@(?/@>J?;A0BG@(?@e>?5@aBK?Nh@BU@(?@>=?+AB8K@?>n"V>!MQ?9@`BY@?!?AUn>!m?GwAB.Ҹ@??>!-?@B!v{@?h?>!Sc?ApB @?@%>!?A B!@?y:@7:>!?APB5@?@Zt>!M?DA=PBs@?/@}0>!r?lA@BfY@?@'>! ?@B@?@͕>!O?F@B#I(@?É@>! %?tN@B^@?@>!9?J@B6(u@_&?,i>9>(?}A BP6@_&?Z?O$>(?z,@ABO4@_&?s?&.>(ǐ?SA BN@_&?&?>(m? SABMv@_&?@7@>(et?M A)oBO@_&?@8>(?|x@@BfK@_&?p@Zo>(?n@BF@_&?!@{&>(?~ABZ@_&?@Nq>(Ώ?@BT @_&?@t>(?~DAzB]@_&?!~@s>(?AZVBR@_&?@#;>(?}FApBN@?y>+>2-D?wAPBM܄@?yj?G2>2K?A(zBOG@?y!o?>2?7ABV@?yz?&>2>?ApBE~@?yP)@>2c?| @B<*@?yFz@7G>2m|?lyAB^@?y@Z>2.I?~AB?@?yG@{hf>1?|A`BX@?yV@>2?wA@B5@?yM@>1r?A=PBE{@?yV@>2^?]A•BR?@?y@6>2?A=PB:@$?lrW>>>`i?b nABX@$?lW?D>=m?XA0B0@$?k?FE>>?RnAB]D9@$?lV?>>}N?iA jB\j|@$?l>@>>?bf@B3@$?k@6%>>[?]0@BW9@$?lY@[D>>y?`<#A+ Bcw@$?l@{z>>B?X@B0b@$?lI@s>>?iءA BW8@$?l[@%>>:?fA`B])@$?l\@>>E?^eAxzB3W@$?l"r@>>?n5A9oBS@8?` >:>J?mIA0B;8@8?`3a?Jk>J]\?jM@VB6#w@8?`01?V>Ja/?mBABB0r@8?`?Ũ>J?i3AxzB.@8?`U@ >Jul?oIAHzB=@8?_@7>J?fXA B+@8?`Y@Y >J7?c3@ABJL@8?`u@}a>J?oA0BE@8?`@>J ?pHA AB%@8?`;i@=>JV?l;7AB?@8?`+I@P>Jd?h99A0B>@8?`@q>JH?i޺ABBM9@!?\{X>L>M?@B`"@!?\|?1Yb>M?}@B @!?\?6J>M?o"AHzBJ*@!?\:?l>M?puA,jA@!?\A@E>M?bv"ApBI@!?\a@> >NL?w/A jB b@!?\@WG>M?|A=PB@!?\}9@|>M?}A`B*@!?\@r>Me?@ABf@!?\@R>Mb?r7ALjBL]@!?\@.U>M%?st)@VB@!?\e@>Mu?l%AB3 !@ɠ?b`>nm>G+?7AXzA[Q@ɠ?bYe?=q>H*?AP@B-F@ɠ?cB?>Fխ?gsA B~u@ɠ?a+?>H?=YAB@ɠ?b}@>GJ? A=PBPZ@ɠ?bL6@=p>H!?,Q@AA@ɠ?bM@Y:>H?\A B@ɠ?bua@|K>Gw?KxAPB qb@ɠ?bC@f>H' ?AzB@ɠ?buy@>Gr?s@AB*u@ɠ?aCF@f>I%?#@ABƟ@ɠ?bB@i>G? @!B+YM@?o%>;>: ?Zp@AB4@?p?I8>9f?sA B9@?o?5>:r?bxA B"@?p?Ȳ>96?}A@B@?p~@>:?uAAB@?p^@8\>:`F?^@B(D@?p[*@Y)>:e?eŊA B@?p0@z >:e?voAB$+@?pM@a>:'?i@B@?p@>:?h|A Bϻ@?o@>;?f@@B@?p@3l>:28?v@B$n@Z?_>xv>,f?b[A0BfW@Z?A?M>,#?Kb@B*a@Z?ќ?Cl>,(?AAB m@Z??>,\ ?g.AAB3@Z?/@>,?HuApB+U@Z?`@8>,?@VBJ@Z?w@Wm@>,#v?gNaA B&/@Z?8R@|v>,?C,@B)@Z?@>,Q??@B%:5@Z?פ@ć>,!I?l+'@Bp@Z?QK@t>,?QA B+5@Z?X\@>,?A8zBa@?>> ?U@B$f@?Q?I.> +?RH@B3r@??o> ?NA B@??껼> B?[@B(`@?@xh> !?P5AzB&?@?A@7> ?F@B+8@?¦@[> ?NxAB76@?j5@|G>!?]@Bi@?@c> d?Kj@@B(m@?@ > ?R ?B@?w8@>! @?L@AB4z@?@> ?UMABt@?>1>PS?ZlA0B1ď@??Gg>. ?XAPB6@?ss?S>C?ZAhzBF@??4G>Zb?i@B)t@?Z@&>s?b @BF@?N@9O>|?gx@B@@?@[.>{b?pAB6@?O@{J>?S@^@AB,v@?a@>?VAB6@?w@>F?[l?B8)@?uS@>?dZ@B?HN@?j@>?f8AB:2XTENSION= 'BINTABLE' /Written by IDL: Tue Sep 13 15:37:38 2011 BITPIX = 8 / NAXIS = 2 /Binary table NAXIS1 = 33 /Number of bytes per row NAXIS2 = 384 /Number of rows PCOUNT = 0 /Random parameter count GCOUNT = 1 /Group count TFIELDS = 9 /Number of columns COMMENT COMMENT *** End of mandatory fields *** COMMENT EXTNAME = 'stacked_cbe' / DATE = '2011-09-13' /Creation date X_POS = 3 / Y_POS = 0 / COMMENT COMMENT *** Column names *** COMMENT TTYPE1 = 'ROLL_ANGLE' / TTYPE2 = 'MODAMP ' / TTYPE3 = 'PHASE_MAP_CTR' / TTYPE4 = 'GRIDTRAN' / TTYPE5 = 'FLUX_VAR' / TTYPE6 = 'BACKGROUND' / TTYPE7 = 'COUNT ' / TTYPE8 = 'LIVETIME' / TTYPE9 = 'GAP ' / COMMENT COMMENT *** Column formats *** COMMENT TFORM1 = 'E ' / TFORM2 = 'E ' / TFORM3 = 'E ' / TFORM4 = 'E ' / TFORM5 = 'E ' / TFORM6 = 'E ' / TFORM7 = 'E ' / TFORM8 = 'E ' / TFORM9 = 'B ' / END =?,g>t>.?9AJAsto=?SJ?C >q~?AnSA6=??>'?aAr AK=??>?(@Aw!=?@+>?[A0A=?@6s>v?A`A =?'@[>?iAAg=?K@ya>xC?AugA,s=?@>֢?zA)AvY=?1%@>?yoA|A@=?@p>I?{(AA}.=?.`@>?+(A\AF`>?9>D@>{?5@A8P>?\\?AEb>?σA>SA7'>??>C?A0ArJ>??>A?e'@0A*>?nD@]>?kA>SAV>?f@4X>?CS@@Ah>?߃@Z>?gA0A0>?-T@wJ_>(3?m4@A7>?G@>v?p_A0pA.>?@y>?VA)Ad>>?<@0>{?iA|A>?¼@>)?ApA8>S?%F>F9>k?_A<A>S?%]?MU>?A`A>S?%!?>C?g(D@AuP>S?%A? >?bA@A.>S?%}@>?oA.SA3>S?$L9@9F<>@D?hcdASA>S?%@W>?NAA`>S?%kA@}>f?VAAZ>S?$@)Q> ?}^A A(>S?%XD@>?jAA*>S?&@m>>S?$@z@>C?XS@LA6?/?1ti>]>yz?_ߣ@Al?/?1?H>y?a@A?/?0b?a>zI?d$A0AiF?/?0~&?X>z#?gSAPA\0?/?0@D>y?it A0AtY?/?0x@6Ś>zC?[TA A ?/?0^@Z2>z-#?kIA#A@?/?0@|6x>{{?TAAf?/?0@>zR?h]AA?/?1%@";>yѬ?'@@AWc?/?1d$@'>y?zCAR Ax?/?0@z>z9I?z._A0An?b1?9>'>pm?aA@A?b1?:?B~>pf?_3@ܦA ?b1?:q?>o?{AA#?b1?:0?>o?x=A|A?b1?:O@j>oӵ?oMAnSA?b1?:!s@7 >p?ipAA*"?b1?9@V>po)?B%YA3?b1?9l@GZ>p+?~gA~SAfb?b1?9l@!5>p?uIJAA?b1?9@_>p}?YA`AV?b1?9_q@b>p?D A^SAJ?:?@>h3>j'W?n}A~SA?:?@?N`P>j#?|AAh:?:???>j7?mCA^SA@?:??!?K>j}?Z-A)A8?:?@0@&1>j?vHA`A3?:?@{T@8>i?DA`A'?:?@j}@Zhv>iǣ?:APAX?:?@h@|(>iJ?8 AAr?:?@a@`>iF?'-A)An?:?@.@>i?A.SA?:?@@>j?KA)A<?:?@_}@ >i?A3Aw?\?DMS>z">fIe?ƄA AVA=?\?Cd%?Q>g[?s7@ASA?\?B?%>gx?l\A A?\?C?>g? AA?\?Cy@>g7?;A@A?\?B'@8>>g?E@AXP2?\?B|8@ZG$>h%>*(@A ?\?Bo@w>h>@@ڱ?\?B@k>h'f>?A0?\?CU@}>g%|?AjA֬?\?D:@>f)?{AjB?\?C@>f?AAaL?~?D)>c>g+?=A`ACo ?~?Ci?J>h?,rAA4?~?Bm?>i&?Ff_@Ab?~?B/?z>i?0u\@AH?~?CC@>h8?(>@Av?~?BU@7>h?/@yLA9?~?Bo@X_>iqY?/@A*e?~?Bh`@x0>iy?:@@I+?~?B@Է>hڬ>@A X?~?D @o>gW?ASAk=?~?D~@>f;?<B')B(f?~?De@>g(k?AA?ՠ?@>=y>k?>@ϘAbg?ՠ??ܮ?MK>l?F@@A?ՠ?@1?>>lh?}ASAx?ՠ??g?+>l?lٰ?6BkA?ՠ??@7>m?b ?AIoB?ՠ??@W}>m]g?I'P@9LA?ՠ??@{>mt?TUAgAz ?ՠ??@l>m"'?GwAUgA?ՠ??@\C>m>S?R7jA AhY?ՠ??@>m[:?FRAugAt?ՠ?@l.@>l>f?d-A)Au e??9c>7>tq?]@@A??9g?M>tK?BA.SA.??8?>t?N$D@Aێ??9f?>tv[?Q)@A ??9@>t"l?qAAh??9F@;>t6?uRAAL??9M.@]'>tSAú??9@|J>t?qAA ??9\0@X>t?wApA^??94@>tU{?tPlAPA!??8@SU>tC?^[AAc??9Q@)>t?LR5APAQ@h?1>s>}6?f4jAA}@h?0D?E[>}?iAcAk@h?0)?`>}f?IXA0A@h?1R?q>}?jAA#@h?1U?@9q>}}+?r^6@A@@h?0@8#>~}?sA~SAJ@h?0:@zD>~)?`nAA,@h?1oV@>>}_u?pA)AѴ@h?10@=#>}?~%{A~SAų@h?1*L@]>}?2AA/6@h?1Ά@>|?%4AiA@e?%c7>>y?p?A@e?%?Cz>h?q6IANSA@e?%>?3>M?wDKA)A@e?%?餥>?A^SAw@e?%B@C}>t?}fA0A3@e?&@9[>A?wrA0Aϒ@e?%k@Z98>%?2eA)Ah@e?%@x>J?@A@e?%L@ f>w?frAPAk8@e?%@T>?kAA@e?&]z@^>?oAA@e?%p@>n?oxA@A@c?M>lR>q?hzAA@c?l?U>?\A)A@c?5?2>?}.ASA%@c??ۛ>Y?AAM @c?x@>?ZAA1@c?K@:>?0AA@c?1@Y>Q?r\A|Aũ@c?Z@y8>5?{AA@c?@>fU?AA#@c?*@>m?͂APAV@c?t@>?bAnSAt@c?@)>9?s@uA@)a?T>C,>p?xACA7@)a?} ?J<>?A`A7@)a?;?>T?AYA@)a?X?x>?MApA(@)a?2|@HK>]?%APA@)a?@5>{?A0Ah@)a?c1@[>?9AnSAr?@)a?%p@y>? UA.SAg@)a?Zv@>=? @uA0@)a?k@Y>P?#AnSAW@)a?{@>R?A AM~@)a?@F>Y_?iAAgC@66^? վ>&>?ȍAAs n@66^? ?L{0>?xA)AP\@66^? ?>?AUgAe0#@66^? +O? >?5AA@66^? @{Z>?.A)A,@66^? 5,@8O>?tAAp@66^? @Xb>?}ANSAڄ@66^? Z@zJ$>_?:(AAQ@66^? @x>?cAPA@66^? Z@=V>?VA)Am@66^? ɮ@7>-?AAp@66^? @@q>-?sA)A@B\?V&>>?AAH@B\?N?A߅>?ASA@B\??>cw?+ASA9@B\??O$>?ÈAVA@B\?]@> ?+ASA5@B\?z@5>O?AcA+@B\?g@[Zi>?OA\AN@B\?n@x>?AjA:@B\?l@^>?iA>SAe@B\?->@>?ZAPA4@B\?/@e>>?`AA@B\?F,@E>:??AAB@OXZ?$8>'+>?7AA@OXZ?%l?Hx>&?S~A|A&@OXZ?$$B?>U?AA@OXZ?$%?Q>}?M<AiAw@OXZ?$F@@>6?A)A@OXZ?$@9G>qc?AA;~@OXZ?$2@Zk>y?A@A@OXZ?$@{p>r?A<Aȯ@OXZ?$-@>Y?/@ϘA@OXZ?$@h>m?ϟAAa,@OXZ?$E@ >?AA@OXZ?%e@K>V? TASAO@[X?2;>>zb?APA9@[X?1B?Gu>{e3?AjAe!@[X?2??v5>z?^B AB@[X?0?r>|O\?3ASAvh@[X?2~@>z?AAO@[X?1@:<;>{1D?AjA @[X?25@Y>zq?ÀA^SA@[X?3d@|>yt?s@LA,@[X?1@i>{(?@AwT@[X?3H@*z>x?AlA@[X?2p@@q>zU?RA`A?@[X?3!@|>yi ?ACAwD'@hzU?@O>P>je?AAbx@hzU?AE?J>j.?zcDA)AF@hzU?@h?Z>j?EAYA@hzU?@[?3s>k ?nA)Ar@hzU?A@>i!?dfAAA@hzU?@@7 >j ?#aAA9@hzU?@@Wfz>jk?.A~SA3@hzU?@X@{"}>j?b܏AAM@hzU?@@T>k? AA@hzU?@@>j?@ܦA@hzU?@@ >jq?dB@A@hzU?@@0T>j?GASA'@u S?M1>Zf?>]-&?g@A՗@u S?L[?3ڲ>^ ? A)AR@u S?M(?>] ?|cAjA2~@u S?Lv?o>^m?]KA)A@u S?M@,>]27?g(-A>SAƌ@u S?L@7 >^`_T?A0pAJ@u S?LN@{V>^v?A|Aɪ@u S?Ln@_>^F?A<A#j@u S?My@e>]?}@Ajr@u S?L(I@ >^0?@Aˠ@u S?Lad@ɮ>^i?@AW@(?V>>TjR?L2@A @(?VS?PV>T?rAYLA @(?V4?>T>?kTAjA@(?UY?u>U?PAA@(?U@>U?ngAA4@(?UW@<>U?uSASAy|@(?V@^>T^?liAAT@(?V&@~g>TX?*A A&B@(?V‹@o>TB?lA`A @(?V@>T[=?v@A@(?V+@;~>T"?ZA<A$@(?Vx@3)>T?fhA A @?\f%>->N0z?m]@A@?]*?L>MLk?T1qApAr@?\?f>M?{_A)Ah@?\?>>M\?cLAA@?\u@>M?vAAr@?]g@8`>M1?QNA A,@?]@@\U>M7K?;mAAk@?]{(@{i>LN?5e@At@?\@w>M[?>A A@?\ٻ@%>M:?Q@ܦA@?\ܷ@3>M?X,*@A4@?\@Ԇ>M?cXA A'@_&?` >[>I?A|B@_&?a\6?T>H_?&A`A$@_&?`?q>H?@EAA(Z@_&?a?]>H0?;@A/@_&?`So@>I{?.'A@At 2@_&?`k]@9 >I58?(a@A6*@_&?_@Z(>Jb?l@@.(@_&?_Z@|҄>J?2@AZ@_&?_@GI>J"?x ASA@_&?`Ý@>H?<[A,A|@_&?_@B>J"?Z4@AI@_&?_9@*>I?hAA(@?`&>p>Hw?bB,B v@?a+?Q>H :?fJA|B8@?`ȝ?F>Ht?bApA@?bI?>F>&@9LA+m+@?`Yg@1>HfH>ܰ@@@?`@>`>Hc[? N8@A3@?_@Z3>H?Sv@A-@?`s@|и>Hv?7C2@AX"n@?`5@{>H?\;TAgAh@?`@†>H_?D<A>SAE@?`1@S&>H?}A A5@?` @>H??:A)AYj@$?\>̵>K?A)A`@$?\X?Id>KT?_AAК@$?\ ?>Ky?AjA.@$?\G?v>K}+?v ASA$F@$?\G@Y>K4?|r=AA@$?\ @9B>K?AugAT@$?]-@Y̹>K% ?eA A@$?]jw@y>J?d0r@Aɗ@$?]9@>K?O@A%@$?\3@i>>KN?^@A@$?\@@>K?wuAAH@$?\@: >Kt?APA@8?V>$>QP?o'A)A$@8?Uj?H|>R4?A)A=@8?U?>Q|?]A~SAS@8?U?!>Q?+A~SA@@8?UQ@>R?AiA@8?UL@9>R9? AA{@8?U]@Z=>R'?@A,@8?Uj@|_>Q?!@A9@8?Ub@J>RYZ?AA@8?U@;>Q?WASA!{@8?VK@ >Q?$A,A@8?V(@>Qk?_A>SA{5@!?Me>+>Z?W+AA@!?L?Fx>[ ?$AAp@!?K?b>[?AAA@!?L?n>[j?wAAj@!?LD@5>ZC?b|AA@!?LP@6>Z:?vA^SA^@!?L@YwM>Z?|WA~SA̞e@!?L<@]X>Z?qApA@!?Lk@>Z@?^ASAC@!?L@l>Z>?!w@Aٛ@!?LX$@>[1q?qv@uA@!?Lk@>[?~UoA|A@ɠ?@>Z>>g`?YAA@ɠ?A3?Wj>f;?RwJ@Aow@ɠ????8>hD?{WASAs @ɠ?Azt??>f]?MA Ap@ɠ?A7T@>fP?MݛAAզ@ɠ??N@7t>h]?u#APA/@ɠ?AO@Z_f>fJ'?y~A`Ab@ɠ?An@|{a>f"?`A@A@ɠ?@G@>gT?m{@ܦAn@ɠ?AQ@>f?PЧAnSA@ɠ?AL@L>f?]pA~SA+o@ɠ?@SZ@h>g>?yA@Aw@?2~>i>vqR?A0A>@?3 ?DB>u?[?uASA@?3B?>u?1A.SA@?3?흼>v&?SQA0AY@?2@>>vGI?ajA`AZO@?1@:>w?5rA.SAF%@?3~@V9>u?9APA@?39@{º>u?_AegALa@?3DS@Re>u?"tAjA.@?3@>u?yHASAǧa@?2O@v>v?AA=@?3W@>u-?{A:Aj@Z?$>h>?M*AA @Z?$?J>q?A^SA@Z?$?t>U?b A^SAE4@Z?$h?f>?Z$A@Av@Z?$@=>?TApAm@Z?$@:>0?AA@Z?$6@XU>?|%A As@Z?$X2@}t>m?AVAַ@Z?%L@>.?}TA A@Z?$p@c>?7>A)A@Z?#@>'?AA@Z?$Z@C>s?AA0@?q>e>?4#@A>@?A?Gб> ?bLASA>@? ?>ҕ?UW`@AFo@??>!?i22@A`@?YH@G>J?JzX@Aq@?R@7D>H`?oAlA6^@?mh@ZHG>x?I|A.SAbo@?>@x>T?xRA.SA @?Z@>G??z5AYA@?@,>E?4sXA@Au@?%@^H>g?ox\A)A@? X>C>Ro?`A@AE@? Z>?U>V?L>@AD@? KL?#>Z`?VAgA@? ?jq>4?`I{@A S@? %q@t>s?WANSA@? 8@=]P>v8?uANSA*@? c@W5>J`?WݺA AOE@? \Y@~E>Z?d1A,AH۷@? 3@@(Z>k?^ASAY@? '@>?UUA.SA)o @? D_@!`>^=?g$ApAhv@? &@>I?A{>oQu>Y1t?FB5I?A?Ld>Y'K?] B$B|H>I?A?{>Y!?AAc>I?A?ޠ%>Yy?_A2 A>I?@@c.>Z./?BB >I?@+@8>Z?7A! A(>I??@_F>[< ?S.AA>I??3@z%>[e?mAA[U>I?>@!>\#?2A B`>I??@eL>Z?$ACBo[>I?A@;>X? BIyB)>I?AK@'>Y??BB B2??9b>>bFK?y,BrB6??: ?L>a?YBBFp#??:??Z>`?C~ACBd9??;?2>`u?HyABnwK??:c@>`?AAEB`??:y~@7I8>a(?A@ B^x??:6@Y*>a?MABU??9<@zeK>a?MAUB=??9@D>a?pA BM"??:$@v>ao?o}BB'1??9W@q>b$?{OB6HB2??9f@>a˻?y=B "B#WY?{S?'>>vm ?rOAlBd?{S?&?KGE>w?OBIv?AyBO[O?{S?'?>v?AyBZi?{S?'d@>v?ACBa;e?{S?'K0@8d>v?NAІ BHz?{S?'{@Y>v?t%AyBG ?{S?'@z>v_M?{uBBR ?{S?'n@>v?zeB$Bm9?{S?'f@?m>vx?wB3rBdn?{S?'޶@s>vS?pEMBr6IBgY?{S?&x@Ԁ>wg?v"BPBct??>t>?B:-BU2??9?Co>A?xB(B\&??%?_>?ɕB6HBZ?f??zt?=>em?JA BuV??;E@>?BBb??9@9<>b?IB BZ??g>@Zx>s?aBBc%??@|\>w?7ByB[??/@[>?UB"B`!??D@C>/?B jBN0??@ت>?>BHBQDu??V@0>zZ?BEBXZ?1?)>>s?9fByBh܇?1?*?J$D>s ?UB"BCI?1?)^?>s?]BBb?1?)#?2>s?!(B%sc?BCBfH?1?)ҩ@7,>sF?|"Bss?MB,Bu}?1?* @|z>s9W?,BBWЉ?1?)@>s?B B`?1?*5@D>s d? AB`\?1?)C@,>sY?<5B yBh\?1?)f@}>s?BBJB@ :?K[>>M֙?uBB^@ :?Kf?G>N5?AІ B`@ :?K_?IG>Mu?B jBd @ :?K??d0>NZ?PBBV@ :?K@s>Mޣ?PB* B_@ :?LZ@8d#>M0?$A B\@ :?L$@X>Mq?AyBR@ :?M @y>L~!?aAyBa@ :?Lkj@G>M&M?VXABfp@ :?MN@<>LX?RMAyBUQ@ :?L@>Mv?\ABg< @ :?L(@f>Mk?{ABbB@#\?j>d>0%-?`AyB_8@#\?jg?I>/?EAB_T@#\?j?>0(?+BiBtc@#\?j?E >/L?_"BBb'H@#\?ksC@7>.{?ABk2@#\?kw@8O>/6=?4#ABZ&@#\?l @XH>.V@?GB yBb8@#\?jK@za>/bI?dA B_8@#\?k@#>/40?RA B_x@#\?j]@>/y?qAx!BU@#\?k@41>/B?\AyMBD7@#\?kE@>/?AyB\y~@<~?O>>?zʤBBu@<~?;?F>q?JBBk@<~?J{?>F?AyBh=z@<~??->?!AyBF16@<~?z-@j>? ABF1@<~?0y@8>V?zAyBJ@<~?@Z/>I?OAB6@<~?w@z >?*ABF@<~? @>|?GB B[ծ@<~?@\>mj?uA߆CBf@<~?@>B?oB "Bb@<~?ab@c>5?4BB}͚@U?2C>">A?nAlAj$@U?k?H!>H?RB=yBF@U?=?h>?rAPB6.s@U??> ?(AB@U?@>.B? wA B@U?/@7J>@?,d5ApB-@U?|@WjA>?PbhACB5#@U?@xq>$?qA`B&@U?>@>.?ACBP@U?mt@>A@ qAAZ@U?@'>_@AyA`@U?@>?A AԢ'@n?>>?dB BcA@n?6?G>Y?oB0(Bf @n?֤?83>O?B Bnh@n??a>T?UA BSƏ@n?vY@(> ?{$AeBR/@n?@8>-?X%Ar BC@n?"@Z]>?%@BL 4@n? C@e> ?~0A BY@n?@}'>#?,ABj@n?@E>%?_AyBj v@n?%R@>j?csB CBp@h?k=>>.v2?rxB4BQ@h?kO?N/>-?uB,BD@h?k]?Gn>.5?x־BCBNn@h?k?2>-ߺ?f!A B^Z@h?k@Z>.?sA BY@h?k`@7&>.X?VABe@h?l!@Y8>-?v,AyBeZ@h?k@{Z>-?jxA0BU@h?lz@pi>-?uA0BT@h?k-@>-N?q JAuBI@h?kǭ@>-?HA BGF@h?k@>-?mTBBDo@e?M=><>K?{ B BW @e?LH ?H3>L?~ByBZ0V@e?L ?9>La?u B-yB\d@e?L;?>L?dABIJ@e?K@>MH@?v=AyNBWd@e?L@8O>LM&?qERAyBK@e?M;@Xѯ>KA?lnAyBQv@e?M3@z >K3?wJA BZ '@e?Mb@֚>Kt?s ACB\V@e?Mܻ@]h>J?oPByBLM@e?M@?>K'P?xgA BcUW@e?M@h>K?x?BB[R@c?+>>p?d\BBS]@c?*?F]>q\?:AyBS0@c?*9o?{>r*?u׹BBYÊ@c?*?#>q?jB Ba1@c?+&@r>q?\\JByB[ d@c?+n@8I#>p?AyB<@c?*"@Xu >ql?e5B"Bi[@c?*1@{<>r9V?Y)BBuL@c?+@>q0?`jUBDBW@c?+>D@D>q?tf6ByBc@c?+R@>p?awBBfm@c?*@9>q@?_GbBBl0@a?b>2>O?m`BjBaN@a?S?E=S>)?emA BNC@a?c?I>1?eIAyBXX@a?G0?j> ?kBBBdI@a?a@%>$?dABZE@a?ss@7W>?gB yBiHW@a?<@Ymi>J?kB3Bb_@a?@zk>/c?tB0BV@a?4@>?nSB4B_@a?B9@Cu>?lqByBk3@a?H@$>)?fBBRU@a?G@HW>?T?c|B$BV't@6^?&>g>w?nB"6IB^@6^?&?I-J>v?qpB$Btk@6^?%xH?X>xMy?[*AyBM @6^?' 8?V>vla?m_BBqD@6^?%0@,>x?sABN@6^?&+@7s>v?xB!yBQ/@6^?&@Xq>v?IB0CBN%@6^?%@{bh>x8?wuBBVC@6^?&[@ >vv?o A BU@6^?'@u>uy?hCB('Be[@6^?&@ c>v?iyByB^v@6^?'@>vk?YBBn_@\?9Q%>r>a?B$B7@\?9?Hb>a{?rwB<BF@\?9~?>asv?wnB Be @\?:kR?>`p?eO,AlBL=@\?9ԡ@o>a?aBBp2@\?9@8Q>af#?b~ABgh@\?9ڤ@Y>a ?oYA Bm@\?9 6@{:>a`?coAlBXz@\?9T@>`#?|ٗBBLk@\?9@>aP!?^BlBGGL@\?9m@݆>a]}?z]AyBK@\?9s@h>at ?bBB2XTENSION= 'BINTABLE' /Written by IDL: Tue Sep 13 15:37:38 2011 BITPIX = 8 / NAXIS = 2 /Binary table NAXIS1 = 33 /Number of bytes per row NAXIS2 = 144 /Number of rows PCOUNT = 0 /Random parameter count GCOUNT = 1 /Group count TFIELDS = 9 /Number of columns COMMENT COMMENT *** End of mandatory fields *** COMMENT EXTNAME = 'stacked_cbe' / DATE = '2011-09-13' /Creation date X_POS = 5 / Y_POS = 0 / COMMENT COMMENT *** Column names *** COMMENT TTYPE1 = 'ROLL_ANGLE' / TTYPE2 = 'MODAMP ' / TTYPE3 = 'PHASE_MAP_CTR' / TTYPE4 = 'GRIDTRAN' / TTYPE5 = 'FLUX_VAR' / TTYPE6 = 'BACKGROUND' / TTYPE7 = 'COUNT ' / TTYPE8 = 'LIVETIME' / TTYPE9 = 'GAP ' / COMMENT COMMENT *** Column formats *** COMMENT TFORM1 = 'E ' / TFORM2 = 'E ' / TFORM3 = 'E ' / TFORM4 = 'E ' / TFORM5 = 'E ' / TFORM6 = 'E ' / TFORM7 = 'E ' / TFORM8 = 'E ' / TFORM9 = 'B ' / END > ?!N>h'>4?])B^W&A|u> ? ?K>v?wBrA> ?#?>w?ZCB2A8> ?"kT?lC>m?IA"Af> ?!k@I>?[A 7Aυ> ?$@72>f ?oAEA> ?$@[>\p?VAnA(> ?!@{>S?DAA> ?!@V>?]A"A~> ?!m@>?gqBA,> ?"k@ >_g?YBnA6> ? $@>r?CcAA?I?w>TQ>I?tBA1?I??=R>;?}BD"A?I?ư?>?uB:;IA?I??]>| ?teA&A?I? @8>Q-?agBnAˬ`?I?gf@8> ?LRBnA[)?I?^~@ZC>?AEA{?I?=@yK>,?fAhA?I?Og@h>?jtbBBە?I?A@b>(w?cAAN?I?#@ݹ>?;?kAA?I?o@O>?|YA"A?7?>F>-?d B4EAڅ?7?n%?P]>?yqBPAe7?7?d9?`>+?.BT|BG?7?1?_>?EBVAY?7?@|>? B\B&?7?E@8>,?hhBnB?7?E@Y>?:BBZz?7?@z>'?ZDBnB ?7?@[>?_zBBi?7? n@W>P?gBnB?7?<@V>;?a% B:nAn?7?\@>&?pBfnA?ꒀ?[>>F?'C$"BCG?ꒀ? ?A>%?͆*BA?ꒀ?,?>6r?UA B8"BIW0?ꒀ?@>/?1AEB#h?ꒀ?@6p>^G?MAxEA7?ꒀ?D:@Y]> ?AEA?ꒀ?7@xg>D>1A@A>?ꒀ?@NX>*>2 ?}p?ꒀ?ꒀ?ꒀ?6@ >CO@C B@? 8>{E>?CB|"A@? ?H[>?BdAQ@? ?{>?\B6fA?@? h?">p?9A/A2@? z}@> ?AAl@? [@8>pT?A"AY@? m@Yt|> (?\B nAx@?@y>N?]BfnA,@?h@J>J?BB@?6c@Z>7?zB}/A4@? @5>X?BeA#f@? @>:?B%A&@8N?$>>^?WB "A @8N??Qj>?qBnAi @8N?;?A> _?iAA@8N?\?IK>?A"A@8N?u@>G?XAAB%@8N?@80> ?/A"AU@8N?@Y>v4?AA&@8N?@|Y>=?qiB Aߗ@8N?@q>w?n<AA2@8N?1@>?rTB$"Aʆ<@8N?h@>?BZAշ~@8N?պ@a.>ao?gNB\"A΂@Y-?(>>͠?KkA"Aԅ@Y-?#@?KX>w?bBA2@Y-?%2?>@?XjAxEA@Y-?&!?> ??zPAA@Y-?&@}>1?AA @Y-?(@6A>ۚ?sAHEA@@Y-?*@XW>P?O;AA-@Y-?)w@{%>?vVAAl@Y-?*@>?CA"A@Y-?$p@ ">a?}AhA@Y-?)+@v>ƾ?YU!B$A@Y-?%@_>Bp?s AtA-`@{S?XSz>9>O/?uAA i@{S?UG?J>R4?]AEA@{S?Un?7>R\?OAA@{S?UV?=>RmK?Z&A`A@{S?WI=@>PI?{ARnA"@{S?U@8N}>RD?n;AhA*@{S?W=@Zj>PF?~.AAn@{S?W@})>P?uF%A"A.@{S?YL@>NW?h8A/A@{S?Z@>Mo2?}MAA*@{S?[@?>M '?X=AEA6K@{S?Zw7@H>Mx?{NAA9y@k;?ys>x>0d}?B<An@k;?xo%?Kz>1N?<B.nBw@k;?y}?>/?B eBFO@k;?x?ꀀ>0?ukAhA$@k;?w@>1?cyAXEA@k;?wM@9)>2EJ?A A@k;?w!V@Z >2mx?v@!A<@k;?x]u@{>1Q?AEA@k;?w@>1j?AAx@k;?x @>1?oAEA#@k;?y@z >0;V?AA$@k;?xNK@a >1a?ƋB24JA7_@,?~,n>>+#?@n@ƒ@,?~?\ء>*{? @!@g@,?Ư?*>)?^g@A@,?Of?%>)c?`A ^%AvB@,?@A>(?SA 7B{@,? K@8>'?z#^A"B>%Y@,?@U@>'K?5@B+@,?@|7>& >%m>Igj@A@,?@Ҳ>% >N@A_@,?W@>$'~>1re@AB@,?};(@´>+?xA@@@?q/>>6B?^BA@?r ?I>5?fA"Ar@?p3L?>7d?g`lA 7A @?oO?k>8~?nvBAM4@?o%@B>8 ?lyA@Ax@?n(@7>9Zh?AAտ@?nt@Y>8S?AA>@?nN@{>8?sAA-@?ng@W>8?A`A/r@?p@q>7]?}pAEA l@?qH@>6?,B nAxV@?p['@/v>7SW?MBA{K@1?NQ>dD>X?b'B>4JA„@1?NWY?H_>X_?ssB6nB@1?K[8?S\BJeA@1?L?O>Z{?OqA 7A8@1?L @>ZV?XAEAъ@1?MuF@7>Yn?k A"A=7@1?M` @Wj>Yc?m4fA(EAW@1?Ka@y >[?EKA0nA#@1?Jk@>\g?YPA"A=$@1?L@z>Z?v^AEA;6@1?L^@7q>Z?r0*BD"Bl@1?M @n>Y~i?k`AEB?0XTENSION= 'BINTABLE' /Written by IDL: Tue Sep 13 15:37:38 2011 BITPIX = 8 / NAXIS = 2 /Binary table NAXIS1 = 33 /Number of bytes per row NAXIS2 = 96 /Number of rows PCOUNT = 0 /Random parameter count GCOUNT = 1 /Group count TFIELDS = 9 /Number of columns COMMENT COMMENT *** End of mandatory fields *** COMMENT EXTNAME = 'stacked_cbe' / DATE = '2011-09-13' /Creation date X_POS = 6 / Y_POS = 0 / COMMENT COMMENT *** Column names *** COMMENT TTYPE1 = 'ROLL_ANGLE' / TTYPE2 = 'MODAMP ' / TTYPE3 = 'PHASE_MAP_CTR' / TTYPE4 = 'GRIDTRAN' / TTYPE5 = 'FLUX_VAR' / TTYPE6 = 'BACKGROUND' / TTYPE7 = 'COUNT ' / TTYPE8 = 'LIVETIME' / TTYPE9 = 'GAP ' / COMMENT COMMENT *** Column formats *** COMMENT TFORM1 = 'E ' / TFORM2 = 'E ' / TFORM3 = 'E ' / TFORM4 = 'E ' / TFORM5 = 'E ' / TFORM6 = 'E ' / TFORM7 = 'E ' / TFORM8 = 'E ' / TFORM9 = 'B ' / END >?F>>c?B6A>?G?C>cO?b0B\A0{>?GY?Z>c?&B*A S>?G'? F>b6?VA A9Kg>?G@>bF? AA8Q>?H.@8 l>bP?mXAz6AYm->?H{ @] m>au?AZ6A>?H@p>a?NB:Bnr>?HB@3>an3?FBFB±>?I@O>a\?jB͛1A'>?I3h@>aI?@BI Aש>?I-@NS>a?DvBFB??@_?>>jAi?h zB\×Aj??@?x>i?|0|Bl8JA??A?{>h?BBSSA??Aq@>i`??B(pAi1??@@:m>i?ݼBA??A@W>hޥ?iAA??AS@w:>iD ?B As??A@.>i ?DB6AJ??A@>h?BA??B l@k>h?BIJAF??Aq@u>i ?p'BIJA?S?5F>v>v?4B AGl?S?6l?L>ul`?hB7/A?S?6UB?CC>u?HBbA?S?5?+[>v6?DBbA?S?6@X>u?}rBA((?S?5X@9>v?aBA?S?5S{@YU>v?SAA A?S?5@z>vd?wusA Aw?S?5@]>vU\?1A6A?S?5S@)>vY??BbAt?S?5@>u?Bd8JA_?S?6y|@O>uXV?6BFAq@/?83>a>s?dBSRA @/?7?<)>t]?sB A5@/?7?R>tD?jB`Aey@/?8%?>s?~^BA|+@/?77@>t'??A A+@/?7@:>tg>?@A A3TN@/?7B@ZS>t2?'AA@/?7w@y>t?~UA@AI7@/?8e@@,d>sȓ?CBTpAAo@/?83@">t0?wB7-A"@/?9@g:>s?ˍBVA>@/?8@>sE?ΩBƚA4@b1?9΂>>q8?s;BFAd@b1?9?L >qA?VAAH @b1?9G?N>r-?gA6A*d@b1?9 ?>rh?BA@b1?8@A>rB?^AA&{+@b1?:n@;e>q`?2Al%Aׯ@b1?:@\>>q?A AMY@b1?:@z>q+Y?B AQ@b1?:Ó@ݑ>q ?9B B1dZ@b1?:@ >q/?g BBqA#?BFA@b1?:@v>qm?IBuAz@:?4>>w :?kpqBIJA@:?42?K>w~/?Bq AK(@:?4(?<>w?sBOA~@:?4?>w?OA Ah@:?4<1@4>wy?m/AAf@:?4 @5>w'r?BA AR@:?4@V_>v%?B A@:?4c@zt>wK?yMBA5@:?5Ln@;>vZ(?=B A@:?4M@h>vR?qBFAu@:?4l@^}>vO?w?zBaAͼ@:?4@r>v ?BkA@\?;>lH>o~ ?>jBuSRAx'@\?;{?Hw>oj!?C4BA@@\?:?>o?v/fBGA @\?:e?ڌ>ppu?[e@A6A @\?:{@9D>p`?Ry-AAB@\?9@[q>pX?nAl%AZ@\?:&1@w >p{Q?R/AA@\?;$_@!>o[?IBBA]#@\?;M3@}>o1w?*UB6A`~@\?;@>or?LqB~A @\?;h*@E>oP?[[Bt"A@~?E:>t>d8k?[B 8JAeN@~?ELx?Rl>d|M?jGB>Av @~?FJ?-O>cz?JB6Ai{@~?Epc? >db-?BAe@~?E8@j>dS?uA A@~?E@7:>c@?oAA,@~?F@Y&>c̪?(ApAW@~?F<@{>cV,?DB8A@~?F@N0>cE?uBlA@~?F`@>csC?Q7Bx×AL@~?Eb@+9>dj?oaB~A@~?E&@"->d?id B) AtXTENSION= 'BINTABLE' /Written by IDL: Tue Sep 13 15:37:38 2011 BITPIX = 8 / NAXIS = 2 /Binary table NAXIS1 = 33 /Number of bytes per row NAXIS2 = 72 /Number of rows PCOUNT = 0 /Random parameter count GCOUNT = 1 /Group count TFIELDS = 9 /Number of columns COMMENT COMMENT *** End of mandatory fields *** COMMENT EXTNAME = 'stacked_cbe' / DATE = '2011-09-13' /Creation date X_POS = 7 / Y_POS = 0 / COMMENT COMMENT *** Column names *** COMMENT TTYPE1 = 'ROLL_ANGLE' / TTYPE2 = 'MODAMP ' / TTYPE3 = 'PHASE_MAP_CTR' / TTYPE4 = 'GRIDTRAN' / TTYPE5 = 'FLUX_VAR' / TTYPE6 = 'BACKGROUND' / TTYPE7 = 'COUNT ' / TTYPE8 = 'LIVETIME' / TTYPE9 = 'GAP ' / COMMENT COMMENT *** Column formats *** COMMENT TFORM1 = 'E ' / TFORM2 = 'E ' / TFORM3 = 'E ' / TFORM4 = 'E ' / TFORM5 = 'E ' / TFORM6 = 'E ' / TFORM7 = 'E ' / TFORM8 = 'E ' / TFORM9 = 'B ' / END ? ?I>8)>_}?_Bo@$? ?J$?4>_J?`?FGB)9A8/? ?I^?>`QR?=B$8A]? ?I@\>_z?*$AAiG? ?J@7 6>_Ic?vNAAZ'? ?J@X>_Em?JAqAW? ?K6@}>^ʮ?qBA ? ?KCv@>^ˀ?C A ? ?I"R@Zg>`z?VAs@pH? ?IU@Ȉ>`G?mWB9@ǩ? ?I@>`?:(FB#@??H:>|ų>bt?.CSAJK??Hc?B>až?BsA!m??H:?>aP?rBtAT??IN?9>ap?1 BsAt0??I@>`?BjsAg%??J8@5>`?B9A}??Jc@XF>_F?AYTAb??J@{2>_?B3Aj??J{@l>` ?B3Ap??HN@.P>b^a!?\ Bg.X@=??GI@ >bU?BBкAM@'7?An>>iF?OB}dA{@'7?AWw?=>i?\CSAj@'7?Ari?U>iH?$B3AP2@'7?AQq?_>iJ?5cB8A7p@'7?A@b_>i%?BxAł@'7?Aר@6>i+a?6AAi@'7?Ah@X#>iu?zAsAS@'7?Bw@C>g?B*sAWM@'7?B @m>hN?VjB?.XAr@'7?BY@>hN?XB}dA"B@'7?B1 @s>h?yV&BńA\C@'7?A}@9>i?wJBbKAH@j?Cڂ>kT>gL? Bs@ѩ@j?E@?W>eRt?JBgA6@j?E?U>d?HCrBT@j?E?C>e`?BA<@j?D@>fC?BaAgO@j?E~@6>f8T?A8A|@j?D~@X>f\?ȪAAPӏ@j?D`r@yZ>f?M2A@>2@j?D@~$>f?B A W@j?D@>f?W/Bm@@j?Dn@V>fµ?BQ9@M@j?D%9@?%>g?Bg@$@?CZ >7X>f~?}[Bs@@?E?Uc>d?<BdAO2@?E?>d?g5B(A\N@?E?(>d?gCA֖@?D@9>e;4?;B"sA`w@?D?@3>e?rTgAAf`q@?D@V>f?87A8AY^@?C@z.k>fa?A8A+5@?C4@S>f?2 BA7ˑ@?C:@n>f?xB`8A"'@?B.@>gT?B@@?Bc@s>g"?jBU@n@N?BX>n>fԹ?lhC9OAF@N?C_w?E#>fko?'B HA@N?B6?1>g( ?dnB֧A6@N?Ae?{>h?UBPgA4e@N?A@>g?wVB\A"@N?Al@:>h0?u6A8A8j@N?B@U>g?BA^@N?B=@}/>g@l?N/7B9A}i@N?CD@yT>f?vB[AҼ@N?B@ѐ>g f&?:BABL@N?C!@M>f?WCWAp|sunpy-0.8.3/sunpy/data/test/hsi_image_20101016_191218.fits0000644000175000001440000027150013203275053021550 0ustar nabil00000000000000SIMPLE = T /Written by IDL: Mon Aug 29 09:50:24 2011 BITPIX = -32 /Real*4 (floating point) NAXIS = 2 / NAXIS1 = 64 / NAXIS2 = 64 / EXTEND = T /File contains extensions DATE = '2011-08-29T09:50:24' /File creation date (YYYY-MM-DDThh:mm:ss UTC) ORIGIN = 'RHESSI ' /High Energy Solar Spectroscopic Imager OBSERVER= 'schriste' /Usually the name of the user who generated file TELESCOP= 'RHESSI ' /Name of the Telescope or Mission INSTRUME= 'RHESSI ' /Name of the instrument OBJECT = 'Sun ' /Object being observed DATE_OBS= '2010-10-16T19:12:18.000' /nominal U.T. date when integration of this DATE_END= '2010-10-16T19:12:22.000' /nominal U.T. date when integration of this TIME_UNI= 1 / ENERGY_L= 12.0000 / ENERGY_H= 25.0000 / TIMESYS = '1979.00 ' /Reference Time TIMEUNIT= 's ' /Does not take leap seconds into account CRPIX1 = -66.2278 /Reference pixel coordinates CRPIX2 = 131.958 /Reference pixel coordinates CRVAL1 = 0.00000 /Reference data coordinates CRVAL2 = 0.00000 /Reference data coordinates CDELT1 = 4.00000 /Width of a pixel in data units CDELT2 = 4.00000 /Height of a pixel in data units CTYPE1 = 'arcsec ' /data units for CDELT1 CTYPE2 = 'arcsec ' /data units for CDELT2 XCEN = 394.911 /Center of image rel to sun center ,+=W YCEN = -397.831 /Center of image rel to sun center, +=N CROTACN1= 0.00000 /X Position of Center of Rotation (arcsec) CROTACN2= 0.00000 /Y Position of Center of Rotation (arcsec) CROTA = 0.00000 /Rotation Angle (clockwise from N) END 齅W#b}lˁ.hQ|˽p{8;t<= l]=b1i=$=}=q>=|=:M< <=?=Ki=2<6.+ ]ƻ/I<<[<<ŧ<]<JEyJ%-O 3κ_<-<1 K'(% v=|JU+\^S06}do{ ݼծ.[.Pኻk==<+=X==>Gt>V=_=TK= =1= =?=`,<ۻ\ ;oЏ<6f< F;׺;<H<&<?4AkiR Sy^χ=d}~%O}1EJڃ⻓4^ịSY?Ľ[Sf@'<^=l< <\V=PO=r=y==R!<><<β<+@u#LʽQfԋ>;1. pp<9=dm=M2=tn=z=˽Uhi^>T[ӽrʽw9 U=P=w=ޅ={V<==#m=mO;FJ;u彌 7ǽq#tTiR 4ʔ;H=6a=;0=g;9;,9ܽiC3}G>̒=%=_=br=eT=E=H==[oǽǼi7޽`2,¾̙;uG$-_n|p w.лwÿ==#===:n=!=U=<.p_<:<*=D< {콆q  lm4= f<0:==]I=>e>K==)^="=L=y>:=ʐG=BC<":8=č=d9;3ռsԼVt{R;2GbLcDؽvW󣽋7sƽaHT=#3< <-T=Y҈=Ơ>}O>==E~<<4P={MS=&=F=S=|=/=> Ы>ʛ=Nn<| ὂQ/;<1\eXx\(:轌Cܽ9o*ej@=i=m=ob=(+=$=(==HrF==<7=Xr=@48 bUjy=&<3-ћ`]y֪mlm_ƽ+JrT:;<3=_k==Ds<Ҽx==͑= ={KG\ AF;;yb(l=8P<<1_Mk'Ō< O > =<~aAyļ:K>'3>>==l_< "> 4E {% >D>;=˰=Fm=_s>Q>A >cɕ>`8 >@+o>w==,>z=?{=+i;E>-f>.f>rg=L=E>>d>W>|>t>>>d>9>=' νнBc%f>#===Ji=0rC=HO0=S=@=@=M=䏁>&+>C>:>`W>U>Mĸ>!?#A? ?) ?(>r>>>bC> =3b<ס&dV<=Si====pM==>8^>=Ī=&:[zq:eV^b V@>=]=G5=>=Ճ=eN= 0o>M >C>->CVb>A??Hy?}??y͞?J?Ķ>ܜ>>Dϴ=Ѿu=J]= D=O=o=F==> ,>4N>1_`>έ==*j<=<*iٽBZ">A>@>@Y>}sj>-?5q? ??9?9?M?Z?Er>5,>pe=D=00 <=-: ==uC=!=Y===l>>>>v=э=J4=X==9pc A;l>&kT>Fh>>?V/>?c?иo?]?Y?I??5>ݤj>c>Z====== =dQ.=k3= >><>BDN>)> e==$==`'N797>r??]G??؝???U?4??>Fk>s>P=K=^=m=)=ɐ=== =ݜ>>6-}>A>; 9>06>%kp>=Hs=\ѻg>6A>>4_?I?V??Mm??v??/0> >L> u> C>qa>T~==?=R=L==y>>N>#>3Z>B>LG(>Fz>(x==FƺĶ=q=uz==!=Bf<@~~V0f >8?#?h??*?M??b^? <>k>=B>>V==)Y=Dv=0g=wb=?=ϓ=v=9>>5ö>R>P>*l=V=,/;Մ?;]* 㗼{IN= 3==ڻ=Ă=d=c;==Ɵ=j= <2D᫽nU4=SL>W>>S?#?TN^?yA?~y?\&?>h>:څ=D=x>y>ж=n=h<Ý8<ļ=6=z/=z=_=z =w>E>>HE> ==V<}+=m >s'b>*>ن??2 ?!)? >z>UP==y=>z>-=2=9<.<.eb>=B=GE<ޡ<"=Pͺe>Q9.>>h>`>]>>J=r=:m=N/===>=O=+e<<=E/>^{&>re>]>#q==^:>>SX=D=͙;U;"=/=D=5`f۽oٽs*ⰽߟm:<\=S(<ԕMg: S==m=g=?=H=T=##===֘= 4<C#K;/7;nI<5Mi 2ž> 08jJdPi#Q< \>> \?=Ek;/ӽf"c1˽w@--aW~zG< 2=Y=I8<#XOnr^IP<5=F=u===]@=B=p=l =w<<JW>%am>Ӭ=+H=N===$m<|:k> '=X<㏽%Mٍ&$JϽ3li# a>>1= =Ԙ=RU=U-q=y===`2=P2;=&S=>> >H===$=ae=ˣ'x*s܂!OZ3!P&U-O Ǿ %FCJL>*7㽝.2uPaY;;;+dļʭ< <:n2[X߽ t|UNX3aՌ {ԇ Bܽ fjx㕼O ?uShCH}ox[X<1c_DlǙn rkoF#򅟾  ɾ<`Y!X~.#{u3Cz;YC<<~;㋼vHNaQ:b=<=!=c&>'=^=U];ϟ tO);ߩ<6&ҽ\HnBbk3 Q*  CC|I<<<XKx~kG( ]QX !cRRyʼ2>^xJ9D; @>.V>3g>@=/=#E=t="=nK<Èm]ŽAX;ٽ# l;^(MFN3"޽#J;D<:<,n)g½% TlEϘ1O "q۽0](:8(D&Ⱦ *C=׽<͹9<= ./<ŴV >;K"E>*>1K>! S>=l=Z=櫳== '{qR%^?29ֽAζN*޽)bF۽)ρJFd;jG#*NMqҽصս$SF^o<8=u>, >-> C>!>>*>0>(>mE>>><=,9<mUམwQz,&kխ{{G,o7QK;&< =%=6<~8Z:d>8H0>Pt^>RƱ>F[>:>7:>:S>7 >+=>>KC=[=<<YNiy~2Փ2R>.,_D:P=8=kv=k=9a=a= =6d=,>;>P>_A >a`P>XHt>M9>HŹ>I>J*>B>2?>Qx==w=; ƻoȃrϾNz ˽&Ͻq-/RTB<̄=cZU==J\=QF=1B=t=}%=@dJ:->QF>VPz>Y=>V1_>M>D>B8>E>F>?E0>+Ô>B=ֲ== 3(½X'ljUӹώRSck[<=)==k===$==5=5c<< A"u?5i=XJ>V|s>Mi>EeO>=t;>3>+>'>)>,'>(:>x =q^=y=b"_>Xy>K>@>4<>&ս>L> T> >֗>B=4==W==-<ٹ<(ۼ/ wս kQ-G>_~!p<=3p=o%?==?I==#=m=y=CUOY<Ĉh=8R=E$=#=>=q=7UG>L">B8r>/>&,==·F='== =Z=cJ=`R?n?@2E@DA:AhxAASVB.]B??????????Nnk(>IM_TIME_BIN IM_TIME_REF FULL_INFO FLARE_ID_NR IMAGE_ALGORITHM NVIS_MIN NOQUINTIC_INTERP IMAGING_METHOD PROFILE_WINDOW PROFILE_SHOW_PLOT PROFILE_PLOT_RATE PROFILE_PLOT_RESID MC_NTRIALS MC_SHOW_PLOT IMAGING_STRATEGY FACTOR_BY MODPAT_SKIP R0_OFFSET IMAGE_DIM PIXEL_SCALE PIXEL_SIZE IM_TIME_INTERVAL TB_INDEX CBE_FILENAME USE_AUTO_TIME_BIN CBE_DIGITAL_QUALITY CBE_POWERS_OF_TWO CBE_TIME_BIN_FLOOR USER_FLUX_VAR USE_FLUX_VAR SMOOTHING_TIME SRT_FILENAME EB_INDEX ENERGY_BAND USE_TIME_WINDOW USE_PHZ_STACKER CB_COEF USER_HOOK IMAGING_POWER_LAW USE_LOCAL_AVERAGE LOCAL_AVERAGE_FREQUENCY AUTO_FREQUENCY MAX_HARMONIC R_THRESHOLD CBE_MAX_CORR CBE_MULTI_ATTEN_THRESHOLDPHZ_N_ROLL_BINS_MIN PHZ_N_ROLL_BINS_MAX PHZ_N_ROLL_BINS_CONTROL PHZ_REPORT_ROLL_BINS PHZ_N_PHASE_BINS PHZ_RADIUS XYOFFSET FLARE_XYOFFSET USE_FLARE_XYOFFSET FRONT_SEGMENT REAR_SEGMENT IM_ENERGY_BINNING TIME_BIN_DEF TIME_BIN_MIN DET_INDEX_MASK POISSON SEED COINCIDENCE_FLAG OTHER_A2D_INDEX_MASK SEG_INDEX_MASK REBIN_METHOD REBIN_POISSON_FLAG REBIN_SEED CONTIG_ENERGY_EDGES LIVETIME_ENABLE ALIGN512 SUM_FLAG SUM_COINCIDENCE REAR_NO_ANTI SP_DP_CUTOFF DECIMATION_CORRECT REAR_DECIMATION_CORRECT DECIM_APAR USE_CULL CULL_FRAC USE_TOTAL_COUNT CLEAR_HALFSCALE EVENTLIST_STRATEGY A2D_INDEX_MASK GAIN_TIME_WANTED GAIN_GENERATION TIME_RANGE NUMBER_OF_HALF_ROTATIONS TIME_UNIT NO_LIVETIME CT_INTERPOLATE DEFLT_ATTEN_STATE FR_DEADTIME_WINDOW EXTEND_TIME_RANGE DP_CUTOFF_MAX DP_CUTOFF_MIN DP_CUTOFF_COEFF DP_CUTOFF_XP DP_ENABLE DP_EXTEND_DEF DP_EXTEND_SEC DP_EXTEND_UTLIM MIN_TIME_4_OFF DP_LLD DP_ULD NO_CSA_DROPOUT FILE_TYPE CHECK_BAD_PACKET ADP_TEST APP_ID OBS_TIME_INTERVAL PACKET_TIME_RANGE PACKET_PER_BUNCH FILENAME ASPECT_MODE ASPECT_CNTL_LEVEL ASPECT_SIM ASPECT_TIME_RANGE AS_INTERPOL AS_NO_EXTRAPOL RAS_TIME_EXTENSION SASZERO AS_SPIN_PERIOD AS_ROLL_OFFSET AS_ROLL_SOLUTION AS_POINT_SOLUTION SC_SUN_OFFSET EQUAT_NS PMTRAS_DIAGNOSTIC FLATFIELD VRATE USE_RATE WEIGHT NATURAL_WEIGHTING UNIFORM_WEIGHTING SPATIAL_FREQUENCY_WEIGHT TAPER XY_PIXEL PSF_NO_SUM CLEAN_NITER CLEAN_MORE_ITER CLEAN_NEGATIVE_MAX_TEST CLEAN_CHI_SQ_MIN_TEST CLEAN_FRAC CLEAN_SIGMA_FACTOR CLEAN_SIGMA_BEAM CLEAN_TAPERPSF CLEAN_BEAM_WIDTH_FACTOR CLEAN_CHI_SQ_CRIT CLEAN_LAMBDA CLEAN_MU CLEAN_NU CLEAN_SIGMA CLEAN_TAU CLEAN_NO_CHI2 CLEAN_SHOW_MAPS CLEAN_SHOW_N_MAPS CLEAN_SHOW_MAP_XDIM CLEAN_SHOW_CHI CLEAN_SHOW_N_CHI CLEAN_NWINDOW CLEAN_BOX CLEAN_CW_LIST CLEAN_CW_NOP CLEAN_CW_INVERSE CLEAN_PROGRESS_BAR CLEAN_MARK_BOX CLEAN_MEDIA_MODE CLEAN_REGRESS_COMBINE IM_CALC_ERROR VIS_INPUT_FITS VIS_CHI2LIM VIS_EDIT VIS_CONJUGATE VIS_NORMALIZE VIS_MAX_CORR VIS_OUT_FILENAME VIS_PLOTFIT A@AACIACKXTENSION= 'BINTABLE' /Written by IDL: Mon Aug 29 09:50:24 2011 BITPIX = 8 / NAXIS = 2 /Binary table NAXIS1 = 110 /Number of bytes per row NAXIS2 = 1 /Number of rows PCOUNT = 0 /Random parameter count GCOUNT = 1 /Group count TFIELDS = 7 /Number of columns COMMENT COMMENT *** End of mandatory fields *** COMMENT EXTNAME = 'SUMMARY INFO' / DATE = '2011-08-29' /Creation date NX = 1 / NY = 1 / N_IMAGES= 1 / IMAGE_UN= 'photons cm!u-2!n s!u-1!n asec!u-2!n' / COMMENT COMMENT *** Column names *** COMMENT TTYPE1 = 'IMAGE_ATTEN_STATE' / TTYPE2 = 'BINNED_N_EVENT' / TTYPE3 = 'USED_XYOFFSET' / TTYPE4 = 'ABSOLUTE_TIME_RANGE' / TTYPE5 = 'IM_EBAND_USED' / TTYPE6 = 'CBE_DET_EFF$$AVG' / TTYPE7 = 'CBE_DET_EFF$$REL' / COMMENT COMMENT *** Column formats *** COMMENT TFORM1 = 'I ' / TFORM2 = '9J ' / TFORM3 = '2E ' / TFORM4 = '2D ' / TFORM5 = '2E ' / TFORM6 = 'E ' / TFORM7 = '9E ' / END ^!]^MCt^ACIACKA@A>]?? ?{`?~w?~?T?s?d?}YXTENSION= 'BINTABLE' /Written by IDL: Mon Aug 29 09:50:24 2011 BITPIX = 8 / NAXIS = 2 /Binary table NAXIS1 = 4893 /Number of bytes per row NAXIS2 = 1 /Number of rows PCOUNT = 0 /Random parameter count GCOUNT = 1 /Group count TFIELDS = 96 /Number of columns COMMENT COMMENT *** End of mandatory fields *** COMMENT EXTNAME = 'INFO PARAMETERS' / DATE = '2011-08-29' /Creation date ENERGY_I= 0 / TIME_IND= 0 / COMMENT COMMENT *** Column names *** COMMENT TTYPE1 = 'DUMMY ' / TTYPE2 = 'ALGORITHM_USED' / TTYPE3 = 'ALGORITHM_UNITS' / TTYPE4 = 'ALG_UNIT_SCALE' / TTYPE5 = 'PIXEL_AREA' / TTYPE6 = 'IMAGE_UNITS' / TTYPE7 = 'IMG_STRATEGY_AVAILABLE' / TTYPE8 = 'RMAP_DIM' / TTYPE9 = 'N_MODPAT' / TTYPE10 = 'OFFAXIS_DISP' / TTYPE11 = 'IMAGE_ATTEN_STATE' / TTYPE12 = 'PHZ_N_ROLL_BINS_INFO' / TTYPE13 = 'OFF_DET_INDEX' / TTYPE14 = 'BINNED_N_EVENT' / TTYPE15 = 'CBE_DET_INDEX_MASK_USED' / TTYPE16 = 'CBE_CORR_FACTORS' / TTYPE17 = 'N_BIN ' / TTYPE18 = 'UT_BINNED_EVENTLIST' / TTYPE19 = 'VALID_BINNED_INDEX' / TTYPE20 = 'SEC2TIME_UNIT' / TTYPE21 = 'DROPOUT ' / TTYPE22 = 'LIVETIME_ARR' / TTYPE23 = 'LIVETIME_CTR' / TTYPE24 = 'USED_XYOFFSET' / TTYPE25 = 'N_EVENT ' / TTYPE26 = 'UT_REF ' / TTYPE27 = 'INFO_DP_LLD' / TTYPE28 = 'ABSOLUTE_TIME_RANGE' / TTYPE29 = 'EV_SIM_DATA' / TTYPE30 = 'FILE_TIME_RANGE' / TTYPE31 = 'N_PACKET' / TTYPE32 = 'PACKET_REF_TIME' / TTYPE33 = 'SIMULATED_DATA' / TTYPE34 = 'AVG_SPINPERIOD' / TTYPE35 = 'BPROJ_ALG_AVAILABLE' / TTYPE36 = 'IM_EBAND_USED' / TTYPE37 = 'CLEAN_ED_FLUX' / TTYPE38 = 'CLEAN_LAST_ITER' / TTYPE39 = 'CLEAN_CHI_SQ_TOT' / TTYPE40 = 'CLEAN_CHI_SQ_VALUE' / TTYPE41 = 'CLEAN_CHI_SQ_ITER' / TTYPE42 = 'CLEAN_CHI_WINDOW' / TTYPE43 = 'CLEAN_MAP_WINDOW' / TTYPE44 = 'CLEAN_NORMALIZATION' / TTYPE45 = 'CLEAN_STOP' / TTYPE46 = 'CLEAN_PROFILE_TOT_CSTAT' / TTYPE47 = 'CLEAN_PROFILE_CSTAT' / TTYPE48 = 'CLEAN_PROFILE_COEFF' / TTYPE49 = 'CLEAN_PROFILE_MC_TOT_CSTAT' / TTYPE50 = 'CLEAN_PROFILE_MC_CSTAT' / TTYPE51 = 'CLEAN_PROFILE_MC_TOT_FWHM' / TTYPE52 = 'CLEAN_PROFILE_MC_FWHM' / TTYPE53 = 'VIS_DET_INDEX_MASK_USED' / TTYPE54 = 'VIS_CORR_FACTORS' / TTYPE55 = 'AS_QUALITY$$SAS_ERROR' / TTYPE56 = 'AS_QUALITY$$TRIANGLE' / TTYPE57 = 'LAST2$$LIVE' / TTYPE58 = 'LT_UT_REF$$_$_HESSI_SCTIME_FULL_$SECONDS' / TTYPE59 = 'LT_UT_REF$$_$_HESSI_SCTIME_FULL_$BMICRO' / TTYPE60 = 'EV_UT_REF$$_$_HESSI_SCTIME_FULL_$SECONDS' / TTYPE61 = 'EV_UT_REF$$_$_HESSI_SCTIME_FULL_$BMICRO' / TTYPE62 = 'INFO_DP_CUTOFF$$_$_HSI_DP_CUTOFF_$MAX' / TTYPE63 = 'INFO_DP_CUTOFF$$_$_HSI_DP_CUTOFF_$MIN' / TTYPE64 = 'INFO_DP_CUTOFF$$_$_HSI_DP_CUTOFF_$COEFF' / TTYPE65 = 'INFO_DP_CUTOFF$$_$_HSI_DP_CUTOFF_$XP' / TTYPE66 = 'DECIM_TABLE$$REAR$$START_TIME' / TTYPE67 = 'DECIM_TABLE$$REAR$$END_TIME' / TTYPE68 = 'DECIM_TABLE$$REAR$$SSR' / TTYPE69 = 'DECIM_TABLE$$REAR$$ATTEN' / TTYPE70 = 'DECIM_TABLE$$REAR$$IDPU' / TTYPE71 = 'DECIM_TABLE$$REAR$$CHANNEL' / TTYPE72 = 'DECIM_TABLE$$REAR$$WEIGHT' / TTYPE73 = 'DECIM_TABLE$$REAR$$ENERGY' / TTYPE74 = 'DECIM_TABLE$$REAR$$CORRECTION' / TTYPE75 = 'DECIM_TABLE$$FRONT$$START_TIME' / TTYPE76 = 'DECIM_TABLE$$FRONT$$END_TIME' / TTYPE77 = 'DECIM_TABLE$$FRONT$$SSR' / TTYPE78 = 'DECIM_TABLE$$FRONT$$ATTEN' / TTYPE79 = 'DECIM_TABLE$$FRONT$$IDPU' / TTYPE80 = 'DECIM_TABLE$$FRONT$$CHANNEL' / TTYPE81 = 'DECIM_TABLE$$FRONT$$WEIGHT' / TTYPE82 = 'DECIM_TABLE$$FRONT$$ENERGY' / TTYPE83 = 'DECIM_TABLE$$FRONT$$CORRECTION' / TTYPE84 = 'OFFSET_GAIN_STR$$_$_HSI_OFFSET_GAIN_STR_$OFFSET_GAIN' / TTYPE85 = 'OFFSET_GAIN_STR$$_$_HSI_OFFSET_GAIN_STR_$GAIN_GENERATION' / TTYPE86 = 'OFFSET_GAIN_STR$$_$_HSI_OFFSET_GAIN_STR_$GAIN_TIME_WANTED' / TTYPE87 = 'SP_ATTEN_STATE$$TIME' / TTYPE88 = 'SP_ATTEN_STATE$$STATE' / TTYPE89 = 'BINNING$$CHANNEL_CAL_NEW' / TTYPE90 = 'BE_TIME_INFO$$TIME_BIN_DEF' / TTYPE91 = 'BE_TIME_INFO$$TIME_BIN_MIN' / TTYPE92 = 'BE_TIME_INFO$$ABSOLUTE_TIME_RANGE' / TTYPE93 = 'CBE_DET_EFF$$AVG' / TTYPE94 = 'CBE_DET_EFF$$REL' / TTYPE95 = 'CONTROL_TAGS' / TTYPE96 = 'INFO_TAGS' / COMMENT COMMENT *** Column formats *** COMMENT TFORM1 = 'I ' / TFORM2 = '9A ' / TFORM3 = '15A ' / TFORM4 = 'E ' / TFORM5 = 'E ' / TFORM6 = '35A ' / TFORM7 = '36A ' / TFORM8 = '2I ' / TFORM9 = 'J ' / TFORM10 = 'E ' / TFORM11 = 'I ' / TFORM12 = '9J ' / TFORM13 = '9B ' / TFORM14 = '9J ' / TFORM15 = '9B ' / TFORM16 = '9E ' / TFORM17 = '27J ' / TFORM18 = 'I ' / TFORM19 = '9J ' / TFORM20 = 'D ' / TFORM21 = 'I ' / TFORM22 = 'I ' / TFORM23 = 'I ' / TFORM24 = '2E ' / TFORM25 = 'J ' / TFORM26 = 'D ' / TFORM27 = '9I ' / TFORM28 = '2D ' / TFORM29 = 'B ' / TFORM30 = '2D ' / TFORM31 = '2J ' / TFORM32 = 'D ' / TFORM33 = 'B ' / TFORM34 = 'E ' / TFORM35 = '32A ' / TFORM36 = '2E ' / TFORM37 = 'E ' / TFORM38 = 'I ' / TFORM39 = 'E ' / TFORM40 = 'E ' / TFORM41 = 'E ' / TFORM42 = 'I ' / TFORM43 = 'I ' / TFORM44 = 'E ' / TFORM45 = '11A ' / TFORM46 = 'E ' / TFORM47 = '9E ' / TFORM48 = '27E ' / TFORM49 = 'E ' / TFORM50 = '9E ' / TFORM51 = 'E ' / TFORM52 = '9E ' / TFORM53 = '9B ' / TFORM54 = '9E ' / TFORM55 = 'E ' / TFORM56 = '150D ' / TFORM57 = '36B ' / TFORM58 = 'J ' / TFORM59 = 'J ' / TFORM60 = 'J ' / TFORM61 = 'J ' / TFORM62 = 'E ' / TFORM63 = 'E ' / TFORM64 = 'E ' / TFORM65 = 'E ' / TFORM66 = 'D ' / TFORM67 = 'D ' / TFORM68 = 'B ' / TFORM69 = 'B ' / TFORM70 = 'I ' / TFORM71 = 'I ' / TFORM72 = 'I ' / TFORM73 = '9E ' / TFORM74 = '9E ' / TFORM75 = 'D ' / TFORM76 = 'D ' / TFORM77 = 'B ' / TFORM78 = 'B ' / TFORM79 = 'I ' / TFORM80 = 'I ' / TFORM81 = 'I ' / TFORM82 = '9E ' / TFORM83 = '9E ' / TFORM84 = '54E ' / TFORM85 = 'J ' / TFORM86 = 'D ' / TFORM87 = 'D ' / TFORM88 = 'B ' / TFORM89 = '2E ' / TFORM90 = '9E ' / TFORM91 = 'J ' / TFORM92 = '2D ' / TFORM93 = 'E ' / TFORM94 = '9E ' / TFORM95 = '5A ' / TFORM96 = '2236A ' / COMMENT COMMENT *** Column dimensions (2 D or greater) *** COMMENT TDIM7 = '(18, 2) ' / TDIM17 = '( 9, 3) ' / TDIM35 = '(16, 2) ' / TDIM48 = '( 3, 9) ' / TDIM57 = '( 2, 18)' / TDIM84 = '( 27, 2)' / TDIM95 = '(5, 1) ' / TDIM96 = '(26, 86)' / END HSI_CLEANCounts sc!u-1!nD 8Aphotons cm!u-2!n s!u-1!n asec!u-2!nHSI_ANNSEC_PATTERNHSI_VISMOD_PATTERNACCH^!]^M   Ct^.ACG=ACIACKAv>AW8>g:? .A?MV?Gf B? a?T}g0!5ٻ%MgN+ $-̿3fn:}Gܙ~di@W~bbbS ~6J0^ˈjw(ޓ9ߤht~¿x[=ՠJhB޿֖_Eݬ82t8#XVNٿ-S.%k6UHV5wOf{Hbkبd} RˤQBn޾yކ<V=jLaۺމ@6|yR gVݣM An͘eB9wY6pi|-cɰ2)>9x܊i8ѸA:(0^) ڿBK4ɿ s18 ܈tP*XX&Agol9݈ʫMSxAqFt^;~><ՈlL7݇ÿN ܿ2SEڲG:Hp5z|߿JI9㺉闘:=Dp*Y7V5G9o4H&{:b3z곞~ޒ끪]㇠WݿVnh_#OZY^T"ζ~)ыyf㬿FK )lI>eYv ?޿ϸEGmSD+\%MGڿ16il'f ]|}=@< 'tD]ܕpڿݴ aΤ̨j-ފݭi{L߷08G!8:DI07h\ucUKvH,ZzؒBR U(jS%X1[ۿ'8ZK18x$8ȆgGqvkQDK!COِOِr=L:Q@fffACIACK?????????ACIACK?????????\&OZ;n Zbai)HEE t>&%+kA/,g4T~*!^av]:-]H+-L+6~ˆ>|<>u>j>*>̯>>[}>b>>Jw>Q >> >i>Lv>ĭ>(#>@@@V@{@q@?V@B?ACIACG-A@A?@@@AABBBACIACK>]?? ?{`?~w?~?T?s?d?}YDUMMYALGORITHM_USED ALGORITHM_UNITS ALG_UNIT_SCALE PIXEL_AREA IMAGE_UNITS ALGORITHM_AVAILABLE IMG_STRATEGY_AVAILABLE RMAP_DIM N_MODPAT CBE_DET_EFF OFFAXIS_DISP IMAGE_ATTEN_STATE PHZ_N_ROLL_BINS_INFO OFF_DET_INDEX BINNED_N_EVENT CBE_DET_INDEX_MASK_USED CBE_CORR_FACTORS N_BIN UT_BINNED_EVENTLIST BE_TIME_INFO VALID_BINNED_INDEX BINNING THIS_DET_INDEX THIS_A2D_INDEX THIS_SEG_INDEX UNITS_SPECTROGRAM DIM_SPECTROGRAM TOTAL_COUNT SEC2TIME_UNIT SP_ATTEN_STATE INTERVAL_ATTEN_STATE SHUTTER_CORRECTION DROPOUT LIVETIME_ARR LIVETIME_CTR OFFSET_GAIN_STR USED_XYOFFSET DECIM_TABLE DECIM_WARNING N_EVENT UT_REF CHANNEL_RANGE COINCIDENCE_MASK INFO_DP_CUTOFF INFO_DP_LLD ABSOLUTE_TIME_RANGE EV_UT_REF LT_UT_REF CSA_LLD LAST2 EV_SIM_DATA FILE_TIME_RANGE N_PACKET PACKET_REF_TIME SIMULATED_DATA FILE_LOCATION AVG_SPINPERIOD AS_QUALITY BPROJ_ALG_AVAILABLE IM_EBAND_USED CLEAN_RESID_MAP CLEAN_COMPONENT_MAP CLEAN_SOURCE_MAP CLEAN_CLEANED_MAP CLEAN_COMPONENTS CLEAN_WINDOWS CLEAN_ED_FLUX CLEAN_LAST_ITER CLEAN_CHI_SQ_TOT CLEAN_CHI_SQ_VALUE CLEAN_CHI_SQ_ITER CLEAN_CHI_WINDOW CLEAN_MAP_WINDOW CLEAN_NORMALIZATION CLEAN_STOP CLEAN_PROFILE_TOT_CSTAT CLEAN_PROFILE_CSTAT CLEAN_PROFILE_COEFF CLEAN_PROFILE_MC_TOT_CSTATCLEAN_PROFILE_MC_CSTAT CLEAN_PROFILE_MC_TOT_FWHM CLEAN_PROFILE_MC_FWHM IM_ERROR VIS_DET_INDEX_MASK_USED VIS_CORR_FACTORS VIS_MAP sunpy-0.8.3/sunpy/data/test/hsi_obssumm_20120601_018_truncated.fits.gz0000644000175000017500000001141513231613137025416 0ustar nabilnabil00000000000000_$ Xhsi_obssumm_20120601_018_truncated.fitsOK0S]Z.2gY2Mb-mۛeCC$!7yxI8{g/Tku6ò7~럎٪wZ2GѕIs4S\4M:-̴PP-zܺcsVf9+Nf:QKj.\UR+[B|#NOta|MnrPlx+%_,ch|S9ٟ0icd^HWEemelXؼ|ۥowxK\ B;.!N+s೟_=o0miPCVH!#P  i!o;[znɈ ,v\\][֩@K2ym WZd-4!<ϚgyHi aInu70FQA+ƚ5ͳjՑqaO%;qpd B8߅Ii(O<{.:()^-dx)%^xt^쩢x_g:j͇(<|wٹ|?ɣl&^K.]b` C^+v ! 8F(`Q0 F(Fƚ?S6lB3#ǁ*ɐqg,߅`8ćxg\\\>!..!Ǎp 11$n$LFG(`(1Lv{#ԌQ0 F(`Q0X] 0wYWm)~\A (Q?א霸@K\%%?0;v[?PL=47!s[9@{N;!Ƨ3|8D+AP_\VS}' oQ=3L|T=L>K:,,>[Q>NCmU]~iq/Ts{9"YGXgMH/zu˓(!KGb` z|.zbo:%'FKss2SG3`Q0 F(`pFr@8#t8 ip7Nx ?Ƈp(`B=#bʣ`Q0 F(`F|tg jA u43wB ruSgC '㧆 Is{kDc7g?XC¨j'!aT7k{dK: \~`׹Rz3\<} Cױ @.b d ?]EWlHeu!ќ|@&T\#dWt9+{]FM^FrgƟqBc3go1z`Q0 hl-1 F(`Q0 FFf6:L9럁9X?nA-H8߂goaL$AgX‹GFT ?Sη p Q| sη tsFoa>:_1 F?mvʆs~NNfnbI~uZTn[v~F(`Q0 FF5o Ɵ 9Lȋ>3ioWܟr?_̷(g[,Kf~_oUG$#?"}{alb`x฀vGpAbrjrQbZB@~qf 墑l)'gT>r{?EQټ *WIekRzG3KJSRAԼP̒T\ 领Z6 F(`Q@F7(63 2ƟQΞ4met>T01mD _Q0 F(r_st'Y3vpw)IqiWGs:5aQz_Ôe`!,Gw/;L[w>v5zƣ;WXr^p,j4Knkv r\aǍ`ywn14u-?]ͥMMvS&l< /=Zs \Vu[~աC`& GWv,Xǡ{Cױ_=M=Q0 F(`o;+:E*8x o1 F(lă- gp0(`Q0 F(fjn1:L)럁9P?ԍAHT;?#H8jp> T;ĘA?~TL(~?r9oiRvx(`MN1 {n:KLDQs)-b?O&O~΋y|D14Ω c30<œTR/D wor⾚'eV؍>=z'axƧKke)qxƐ%[Ȥ;RIsu 5u:gnr dF,T(dۉ JdO8O:W wbef:Gu͟yDX^n9XVC4Q}π4n ;E@N >c?܎[RR:8'F7(63ǟDal1I2`Q0 >b`djMaH4偘Q ׆+D15a`J )W+D$qЯ~ytMy% y-vF(`Q0 F,Fr?S@o`b#7F=cQ0 Fn-1z(`Q0 F(Ff6:LQ;r1z䞿VQpb!H>>3*b13#}Tk7> HAW,#xX(W1T |Q0 H`,`` 8xH,J.NM$NhgQ0 F(`FƣoP4lDg@/B7oPxb803$ @dzQ0 F(01 0e޾VH$铿kzo(yvo1 F(B>h4Z(;cQ0 F(`Q0LFƎ?S8L7:r1zopGs~ qA99 E)c7 $hheQ0 F(` eƵ~w ǟ i0LHH$x6:(`Q0rhr0ϡ¡ɩҳC!&7 [`1 F(`Q0 FFrgƟ|+io1z`Q0 h8hQ0 F(`Q0 +FƎ?S8L79R=c7o =cQ@$9yͭ yVFQbJfb^1EGp1 F(`Q0 <5^88;F;=?=3;76BLIFA;8=;5@HLTd_snVKC?>EPFF=CC:998?=@B8?8;FF98=?A8GEL?@8BB7EBFDLRUYd\asuir}{w|xwwx`Q5B\]izqlrurw}~tvxttx|pd`bZZ[^X^`ZZ]nzqӃ؃ '=<+#  RNF4):;?FCIHFECEC@?LUQKY]\ZOOJOSH:?F:8=FNLRNSWRXdhrqls{unlnunR3Cccm~w}{xwwtx}yoriebZ^[a\\aoɃ05E57(:B(&"CC:?02@@?:I=9ADDGFHBMPK?QPQOQWMLMPJRMNIBECC@IMNW_NMSX[chlrpxwwporw|juvZ5@iihxuvƒngfahwrrzՃσƃЃ)`k[ETyqQDC:223>?@>78?7;5@8CFCKCIEBIGEGGSPYPEEHDKLGJH?EHE@LKMRPTVQP`begpyʃyqqt{t~e?IjkkxǃԄЃ|~pt|v|ۃ΃Ӄȃǃ҃ރ'zs]*H749?@EA@96:799G;FAGMGLICJBBGBD54;3CJ_~xsohjVXklvlYPABAICDHfxqU9879@Tm惷ufruijzkf\PFHGDDDDD?@GAANF?@DJRK[p{{vthcfkǃԃ߃GV ăF_sv΃ۃуƃуŃŃԃփуՃʃ.oDʃ{rzpw˃ڃуăj܄߄ńÅ!j>>!7?MZrpR>;6CNPy߃tejvs}z׃xdXKIJJ@GE>?AF>Kzstƒރ̃΃˃Ƀ:2ރуƒ˃Ճ΃Ԅ Jg?݄[,Ճ9EW_|]KCcSh/كƃр<8U_eg\D3.<67A?ISMDGIUT^iif`{ӃseZZU@>FԃɃހGJOXg[Q?;==><87BQQDHJFDMON[^itk_RK:B6@AFUhlgQYd`TRHQQ]frznlmypy}ǃڃKlcу>4<8:ABDJCI8IXk]QUWh]MGLSQZjhwutԃ݃ 4;579@@>@JLC>E@GIA@N`fhth`kwrze_R:@=:C?HNcYPYQXMOMQSRXhk{ƒƒ̓ރ$"˃?r҃ȃ׃ɃăăÃȃۃ #/71փʃŃÃăуʃ̃Ӄփ݃̃ "ItڄQ%&ჵWV?@;@:38-96AKG@>H=:?DGFGHIPZcd[fUVhgf\PJ::vh҃߃€Q@=?9=11:4:AEKJEDDDB?EPDE:GKU^_YVGHXPTZEB:7@DEHJHGKLADFQVdV_[`h}ǃ˃ԃڃ˃ރكۃ݃ڃ҃Kփك̃܃݃ 3Znci^փكăÃʃƃɃÃÃ̃˃ۃ>e7ƃŃǃDB@?@=99614?CGDMTHCAA@DH:6;FMRWFEFMMHK@9J8@F;G9CKOLDMIC@DFGJP^szpmsuzуك̃҃؃̓Ѓ΃؃IykF!҃Ճڃ؃ԃÃCyɃ  4mqC!փɃƃʃƃڃރԃуσƒÃxruǃ3lsmE̓€75B78ADC>?:?GI_gooLWFEC@>;AGJKHFFABHG:FABJ;7?ABZmrW\NFL>G:BDMJNJDDE=@=68B:TQJLPCICBDLK^]jzzЃ)ZfTK"΃ʃȃ>`Ѓσك 'σŃ̃؃ŃzmlŃŃȃ'̃˃ԃ̓Ńŀ888>BDF9HILKLPIDEERS^gvz Ӄσ%?<%ǃȃ$񃾃GX~Ã̓ރ ܃Ѓ̓ʃ˃ƒք 34ÃxzǃӃ҃߄҃ƒ΃=88;;;830<;;=KT`j_QMGB?A>1?HEBL@KEF@@994A7ICEEKHLKERNYZjol{|Ƀ҃Ãуԃ؃ , FTyo{ul~~܃؃˃ʃՃ݃݃ʃƃV}pjY?#߃̃nlzԃ҃˃ڃՃǃŃƃσ=;>@:<;;37K>FScb\]VPE>==H@@>CQK<>=G:=;D7C@CE5CEI[kb\YOJA:><<<>:FID@?BE=7E;57A@ALLKC>JOKGPViZe[b\^gtɃփރփ߃ǃƃ؃ーJ^}oegkmnmyŃڃŃʃ̃ƒ؄!ukhY'Ã{x iԄ $F;@DF?D>IGGKK\Z`RVE?I>2>5:CAHGG@FAD?D@:>8HKGF" ꃾǃԃɃC\v`fvxqnixă؃ɃƃЃӃՃǃ+84IF҃}{zxz]HE:BDIGFGMPY]YTPTTPMXZWU`q҄Q}gk`L."Ń̃փヹk7Nh]clminqm{|΃ʃۃ݃΃Ճȃw|xupyv},:@=EIMUPITMV^X_XPMPFCKMMB;GND9L@NPDHJEJH::CBCHQDDLRT\XQTVWQS[Z[Yjo߄\݄΄ÄɄdǃۃ܃y\2CXYemhoz|noi{|{tyڃكɃʃ߃ԃ҃ʃut|qiqy׃ԃރB@@KJTGHOJNRW]LOMUJHMNJFEKGGGGCKGGJPNJD/CKF@AGCMMMRTPOYR\_XSY^P_^%eńЄʄwӃσ݃ۃ~a2=U_gzsnplvoosqrw}ǃڃك̓ʃtknxvsqtx||}QF@CADEBQILMUTPNLQV\SQOM]MJSACD@HILSGN9=NOC>9@CLKKTWYVTc`hTWXORaeÄ-XЄۄWσу؃~f5C]`dxsollmt}yognqr|}ǃ}|vtwx~|F?=@D<A?LFNKEL\`jedYc_XSIGAE?BB@CRNTRMNFEBLFGIROXjjvchhcdv݄(2>JxԄa!̓rY3Da__npgdhkhlzxqlghlz~ur{tsyԃჿ~~҃ B)6;<;4<8A<;ANEMEFYS[gckbkjLMEFBG?EDF>OX\MDEA>EKFF\ZT^s{|mit҃&JoAЃփڃxW*Bd_[jg]^[izxvzkbfqyxopqpq~|}{y{tu݃݃ǃw΃ÄFKdRD1;;@=4@>2>G@HNIP[[_kcnkbSUEC:DC@EDNQSPPELLFBONKa_kktƃ݃߃ლytЃރуڃ!a|c3݃ƒvO/Ifd[hfbhksyx|ilmeswwqlgcot~ssv|{܃̃}rƒăԄsu\??:B8C;@C<=C>CDMNZXlale]bWRLAAA98?<8BRKJURQPPHPIQ`kpx  ΃փӃуڃB,!ރ8<ヌ_5Gh_alkbey|u}~xf\]jgcj`]_Zg{~{||v΃ln؃كʃӄxOHCCDDB?B>ACGJKKNf]srhX`^RHJFC@;;@B@FQKTSOJIGFNUZjtoǃ  胰Ѓ݃уσ'-'؃ǃȄ_^胋d8Hf\]kqkiwzvi_\aacjbdgp}vu|~ofqztx|zƒփكރσ΃1`EFDNDNSYUen|zejdUMMNCB>ADHQNEHFNILNFJI\\nxqڄჯń d\σƒ2 Ӄ΄%lMԃf8HhZ_mkrw}imrym`\fhhaag`_chhn{~xrkfhnovx}ȃŃyEOJC>IJE8B>GPO]pjm}ibZNBAA>@PBGFM@O@IDOTHLGV^jkrу*(ƒ܄9 )ăŃ݄ ǃ܄%@d5IxuruqpztlfdaeRUhlck_TY\bfq˃Ѓƒmiyzmb`bmhljpǃsn5 ENAJHPMBNCKI[azxăueZQL><;GNAGEJELDA@NOKGUa|{Ƀ߄փфYĄ섯/ƒل ЃσڃsZ=Tvw~mipd]__PV_ha`^UXZ^hu̓ۃƒzpur^WVbmkkkhxzMBRQVOINNCMKROhszȃk\ZLJ>BGC?NKEGGCAJNNKDU[{σڃ}{̃RmÃЃ ΃ƒrg?^p\dfc_ZWW]\`d_\`\blpw|Ãӄ)!|ux}rgbZ\cdgorvmYSUQLSLMENW_^nÃ,0ꃴxdXNYTLNGIMNASMQJTMPA1DVz񃩃xoo{ уԃp]1]Ã׃qg__``Za^WSY^h_^Ybqwu~ăڄwyredigboa_gclkoуڀ`aUORRSKTYajdy-w_}ja\ZXXZMPOMDNOYROLT?+2]|tjshs˃уރƃpX0TărrooifdXVKNTN][R[jqw~ȃʃxtfZ_abhhocZopiivvʃۃ׃̀\hU]ZQYLYgku5_􃬃ttnc_QX^`Q\VQQS[W\STV81c|Ã{xrnceixԃуރۃރƒwgP0WЃƒƃ|uia_^\aYMINNXWW`WmsuŃʃЃ؃؃ۃuwqe^VVa`ejgohiko{{}˃؃ʀS[_]_ZXV_n|x˃Ƀ 5GɃsinagfm]_cWTU\aqdYcRSt{wz~vwjZncffpqxzxqÃ݃ă̓meEgŃ ̃pgbXPQTXTIHJN^\`f^gx}ʃ҃toolcddisqpncdqkku}փ˃ZXcb^^^`nv$( ǃ~xww{prbRS_gpkfhkv~|qtyt{vk]e[bSdliphp˃ʃxփԃxjdaUQZXMGL\a_^dddv~ƒՃ߃ă~pj`by{z}smiqomow}كՃ^We\Ybdk~?n~N#냶vc\^cnnpqx|iZc^MVacjdn}zу߃ueYXNRVFGGPZ`^hdaqŃŃЃփ܃˃zut~tnpsuwtۃˀW]]^f`m{߄i"كăua[emmup{zkd[ZIXZ[\afz{y}ƃ}mJk̃ƃrb[NONGFTShumfciuƒЃ܃̃ŃЃԃy{}փƃszӃP^_abisׄ K…+'τ<ÃуЃكуԃ˃у׃σ~kndojqpsuƃӃȃicPSTR\UZXi{xo}mU7bȃȃƃyhTSRMNVLP_vwtmah|ȃ̓Ճ׃݃փ݄ ԃŃŃۄ⃲wxăӃ̀[cjeequȃ$DŽRԃ΃ڃ烲փxguwvt{ǃ߃ӃփփɃv[MR\KXOYSfvzk}w~w|~v]J1^xi^XPKPQRZtm`hmă˃ƒЃɃʃ;J3҃ń? Ƀwx~ŃȀjlihm߃JI у&僾˃σpyr~̓݃҃܃ƃq]TXZMTUZS^ezwogpovgpqhom_Q@/Y}uhaYMPUHL^yyjjdpɃك~ʃՃЃ׃̓2if- 䃾ƃكvrrtyywwwyŃ΃D^FF. )%փ҃߄ăn}ǃ˃ЃŃǃԃԃŃm^UJVTUTRV]lzljfha_`[fX\TE.TyncdXNMJBFSgseddgm{Ճ惾yrŃÃۃՃăЃ,N^X*">73"ɃƃӃ|||{~x|Ãʃ)8="6WC8#)҃Ã߃v̓ ڃ҃ՃكՃmbWSYOV`Va\k{vyihXX]WUZSY^X=.Mq}zq`]\YPIPVTK[qqm_YduŃytr$  DKD<Ӄ}}|u}yr}vÃ̓ك$4,7Y];胶Ӄ؃ÃBkue܃уփՃ}nca^Xcbnmol}}ugdRWRMYS[XKA.Hriwb`bYIQHHKQPS]fgf[]vꃭwp @U9Ѓtr}||σ&1Wuilh[P[W^r^]VZKFINQSHIFEJPTKLOOUVZ`mqjqqpe^infYYde]e}{}xxodbуԃ'1 !?`DB6ȃăvurƒЃ̃r}x~{zgmuwlfadu|rRJGJC57H}^fYR^]erb^YYYNRQGOJOTXLNQLROSTT^htrpsmdbV`hcZS]f`d~̃wzh^b΃݄,?%FVLF5(؃}wwƒ ƃ}zs|s{ve\x̓dgo[Zj}lNVNF;9)C{u|ydZUOP^jhbfZYMNXSUHJMLXKMLFMOW_U[okqwob\ZSY[Y[]]VYgÃ~}|wojbăă؃ԃƒ̓65!K_lN5ރȃ~rӃ%&كy}}v}zritsmg|ƒrYbXT_[g]ULW?@@%:cjw|{|dMILW]bkhg_RP]i[GLSRLDCDJFQVRUL`t{yneVTTQRWX^`ZVXiz{suyzlk);;08A33oB߃݃҃|{ۄ ヰsnmzqcmi[cb`TMHMYgbOFF>:/*9R\eurldWRN`\alsmc\WllhYUQXLFQQHAFKKMTkvlitpcYLHPXQOZdbW\bs~yusklt{΄xq535T[NL0Ѓ̓كՃ{˃xσۃЃ ۃzrgl^]a\ovyr^]V^NY\`]XVJC92)6SX^isniowrZZQEOagvea^`ddtkRQUSPTRLILLIKU^`gicfolSLKSUTTW^ee_amw|ohq~ƒQ˄r#9MQMDIjՃσƒƃ̓ẵx׃ȃƒǃӃtk`V]e_bakc[XTTNUR\\\XPG4;6(6QP\iirf_i[aUJGRV[c]]\P`wwkbUTXPGEOBDKEILN^ffb`\ZXNFGMVW`VNV^[^p~q^ir΄Ʉ[>XF:6+gq<܃ƃƒ}ՃȃЃxv}wiRKQ]YRbRYQWLFVY\]\RORD<6(2ITVsgo`Y^ZVI:GHGRYXL\SgyzxeUT[SMG><@>CFTZ^b\Ya`NFIGMPOTX]YXYX\dtggnq˄ar9C>,@; كă|ヾ}f_TYZTW_TYTTNHLaY`Yd`KF=6$-GFTda[YVLUNRFMJHRQUUQNxxmbXZRBEEF?>B@KSOT^^VSMKLHPVNNNPLR\V`knkp~qghqywɄ NoZ=,΃̃Ã{΃uaZV^VUPIQEHPNIQW]f`\ZK<7+7PJVQYTPXZR\U/I@AIRIZdauuol`PPA@EFA<7>RUVbVU\VLHMLSTPMKROOS[Z]aakqy~xgaehu+91'ۃ߃ Ã}xăob]ZY[QOEVHCROHQ^`xurdOL?+0LMK[MUQHNO[UQECAOHKVWaruxwnhcRXPLHBA;9CVNPVTZ_d_SDDUQONO[WUd_\a`b\filwrtkhjz؃ÃɃރƃ̓΃؃ǃƒŃ~փ߃s`aTPVSMSMQGAGS_kx_YGF'1BFRXMKLNKROTMF=KTUTXdemy{yoef\RKDGJA;BFN[^VX^f`PMSPMLLKXUSVONSWTSYZenmojh`Z҃׃׃ԃփăɃǃǃ̓xdhTYPYNVMKIOLZbxvp]M@-6LKW_WPRRPIRZZXOQYXXYY\gqszwc[`THIB=@JIOJSSOX[[VSXPQ\YRLLNORSPSPICCP^ghnke_SʃƃŃÃăăЃ׃ɃsqkOLTKNLQHQQX[yzt_UG11VN^j[RDNRO^b^iMP\k`XXdv}o[LPJJIBLPQ[V^UMZ_RVVMMQRJMIGIPMNPRXMDOX[_dlha[z{ŃփуÃÃ|ǃsh_]WXRNMTUXV[ezUPE):RT`zfOJNWaa]xeh[\ZYZR[o̓ui`OOM@ITWW]][[VZ\UPNUZVXRKINIKRUTQOIHFEMTcoo_Tphuw~ЃуȃŃzzǃx`a^[\RTIKUUbfvz}vynbSC+7VTekcTUXYvmu}{{hX`\^`e}ƒԄƒrn^VOINW^cdkp^[claMQWSXZNHCKQPW^[[PGFCLVYdjdVPkbsx~ozǃÃԃփŃÃvvW[MRPLOTOZlr}vTG,?]RbkeXVlZ^cxkY]Q\ai{Ѓp\QQHIS_pqpxecnvm]UUSYZOLLHOOOMTYTM@@JFS`Z[_Zeams}yswuu{˃߃ʃǃ҃كփȃуك܃ԃƒrl[VOQMRIUQfszaJ,;JS`rqbib^iuus^\S[\dӃʃ{WKTKTW]nzt|vpyjd]Z[]WQHEDGOTJQVYH:@HTWZ_\]^i`gnr}|ms{kqǃރރ׃ヾȃჼymcb]U\JQTV[s~nP#=\RbfkslcYrl|{nfTSNNj΃΃v_NFQT]fv~tpj_XTSWUVQEHTQPQHURIKE>EQQV\VW\qflktvsxyvj|spzlgt|Ӄ؃߃ヱʃ݃xn^[ZZNRT^i}yxR0H`]P_f`Sb]rwyo_]TY[kpynTNSLOYix|oqxywe[SV\Z^^QQUR`YRTRMGBAIQNUYbd^xigdimlhfamovztjiuwpƃ̓ރЃ׃كуlvV`^^^[W]{|xuvxa5Oxm\VV]eb[uxtjxucWaYObmv{zyeZQJKT`bgnikv|v{xcRXX``]SKOOVZ^`WMRJ@DMPQ[a[]od^bfo][d`dop}tkqnm˃̃ǃ΃ك׃؃Ճ'5 ΃{s|usdg\QK[]ynny[4TpgbXKRUdmlnmh`\ZdQfrkg_kvbYTEQQPZ^klgYh~~to`Y\X\^ZVTMP^fd`[UN@EGKX_g_Vc~ujheai]^`_cpzozqtldl|փσă̓Ѓȃ҃ȃ+A8⃫}~tpwkr]VUYQigpob{t`?bfcG?JNLx}|k`WT`bT\koc]ehxkYZ\PRHONUVXZSVn|zk_RZ]V_[LKMOT[baYTPQGEMTX[[[avqiabY[\\^`jvw}ttrmwكڃǃÃɃ҃ǃփɃ/'׃σqyv{vtobXSUaX[idno|yk_;TqmaH@?HE`vgpeMV[TQ__hkd`\jpc[QXRJMJM\X^`\UXmvh`UT\VPSQPMS[`YTKEINDAGKRPNQWxwsed]ZT\]ger{lrʃ̃΃ȃ׃փԄ"?. 䃵vlpysl^^ZXTP^bspdo~tt\4Tuj\gL@IOHT`^[[FOHPVYbhhfciewvibKKLOIJMLQIKXTZceiy`RMPV\XMPKCS^`VMGEKGEGGHFEJOy|n`VRNWYcep}w{Ճ̃܃ՃăЃÃ4+(Ӄ{tmu}tpc`dXJU\^\flbtl_O+6fWWMG=<=HK_^__UIFXZYXfnj[__jaSRSLOSLJKFMTMLMSZdj]TFTQ]WMGGLJQbg`RLKHDEHA?EGGKy{nZMNHX^[hlo~{t{׃܃能7+惶xwuotkYkWLV`VYb^bsywykmGL+6ZTX=?D??EO_balhPP_hg`[njkbZKFJCFUXQPKCAD@IPHIQS[_WKMNUOKEDFMV[WXQMECADKKC<@EFrjfXURONPV^ijmsqwu؃уƃ̓ބ˃nsqtjwvwog^\ZVWU^P`^gzblVVG7,:PHBA?G;?APZUxyePS\gkdZmrjWQN>GNJZ^YUKA@DGEEKUFM][PFJNULKGCEKKQ\YORRKJGGCFC=@Gƒrg^UVOULGSZeh`bex~ƃ׃ڃ̃vemv~tttiaacbeY\gUhjjplnfTC<04>B>H6F96=ZZow_SQSewqmicTWB.FMOV``YGKF=D<A>=@C{n``ZPLKPR^nk]YjrwtɃ܃҃tpkjo}|urhh|jdb\U^bieh}qpg^T:<%2D=DAAMFECDD@=A@::C?ȃsglo`^RU_]W_dbgaww}ăooqlolywuusgs|pwii_frqwwgO<8"47B?MJUOOGT\X\?D@DCDPUTQWRYQGCHI_flncRJA;:CH>CPXUZ[^^WPYNNJG=A?=GBGCCD>BEC@O]Xbfh`a`XOHG<@FC=A?>QH<89<}~kmjklccrknhjmtzrjng\Ubs{΃~~}rusiY[jrlw]sm|}ytdQ@C3+(@CHUef|b\YTTTQE?B?FBL\OD>CXtrlI7BEIMA?C@>?=}gba[^a]gpomkpnzpic]WZV]r|~փ҃uz}||}vpq[`lcsehvvn_aX:C.(3@==@BKLJMEGD>>{yr`^WNO\fiqgfojodVURRY\Yxڃǃx{~~~yf]aWu\wqvsz}wg\mvbO<7(->@A@?CGJSXJGBBA{wna\WLOZkkhdgcV\MLKLOUcju}v̓urwxyog^Y^_k{lu{q^k}sS70,-E?Tqtu`RX[ZRJCD99GQou\JEQc|woPD;9859=<@DOW]iegiXTPB>>:46DHGKCGIJKNKOGBBqm\LGX^_cZ`^YIHIKJRVc`s|vyvqjxx}uv|wzwtqwj^hXcgssxtm~b>0%-DICThi{^iae]DMHPKM=:@@=DUZLJHPMMQTMJBzz}{dRQWU`eUNQMA>GFLJKZZ_o_ny{jst||{mveuz~|z|wo]Rg{j{ygkywqe[9;!5<2DRftolZIWhPKKHRU9431?CPdshWKEOUHCF<5:749G<:8FINVXPOI?FHF?:>AAOUXZWRTKJIEMLEsv{}y]UMS`[UUVF@B75JNDA::3/419C6@@ADKOICFI6EB=CBF?ALS_lebXFBJSQOJfmnklzcPKZX[]ZUO@<=BCKJSMGQ\bjwf^`towxuu}}uqyur|xfjb`j{inpbUUQB5-.?>LPX^`TJORZSPKWYTFE@>63:HRMH<79<3339<;73;CACQGIi|{re[JLV][Q`giihkry}lVZTR`X`]RE68EADMJJJSTVgpzvn`Zcnngn|vz|y{{zi}Ńvgmr\ZPO6:&28B@STSWA9BQLTFJRHSKI>305;9@FB=5B9<+0142:=77=<<<>??ADCJGJBDFB7FMKMizh]RXW\`P`\[cc^lopurbd^N__V_UKD:>DFLSLBNLXW\[n{{xxnaYbhx|ytlps|}ăǃksn_gZE837:3FWVTC9ICDSTFSUNPTBC?-84817<4<<>CBC=B;5@FT\lcbWMFKY\ZYXTPPUUQTQX`\_[`^`VJIB@HNNSVaUWTJLKUT\_bngpxwyy||ynjwoor\kz|ŃʃăgYKE?:64&3;AGKP8I>71;IFGJEbeNSJ7680--438;90511361=A:9167946039>=@KC<0==74@LNNHSRNKEC6*35/(.8734329:/9;:;899:-573.437898=97957115<76439;9;9=>;?C>88A?F:MUYHONJQLOSSZ]`]amxkj]QEKSX\a]QYWTY[NPQORSDR]ewzymopii^bjt{rflw̓̃уӃseL>H3C-%9H9DL111468?A;GRHRLM6D:<;.611+:6-84&044@93>8?8755/,0272<:;;28;8A@?DEA>=8@8=@EMbYYTPSSMQX^if`ZmvoiPKENV]ZPZNFMLORQJKMEIMV\ggy|hflm_cheerbinnnփƃƒȃփ΃у" ԃq_WRI;73-0A9:;7B2>6.54<9JJIF@7=83-0328017/=@381<89=5:74531505.+6<86?H;4=D9@KHAD76;=;8IKGFB6:659<9=ngeb]Za`X\]U]c]_lkeTUIOQMOKIOJGHOHDFTV[inojbfcWXaikphnfd`gpdggahr̓΃̓҃ÃڃʃӃՃσ׃ƃuqm\WROI51,?77<;7D7I8>4>@@;68;831-1654*2406AC:6169;;78;<<.4/3//4<>83@C?HJHIIIQM?79616>96zwx}plimf_UTUW]^aYVVIHAPPIGEFNOPHHHW[Y_f\VUWR]lexdirvih_bquу׃ȃăɃӃ|zl`k]ZDG9--77?:>DH@9@4=8EA?><32*5/'42=3)1/5:<415;578;<84669-.,,76<>IJNem܃ƃjZf^O\ck~eilhid_hnwƃǃ僸ԃqcwb[`OPL8-587;5BELPF@7?;7G;HA:09,*:)544-140:?;648=478<;22+03.103==>?JRXgqkfWUTTYG49:5>:8}ij]ce`_ddXSOMNOTLFCPQOPUWMFLY^uʃ%rb^UVX_Yv~t|tdojncipd{s̃̓Ƀƒ}xxz`jc[mWK?(-N8<@H>6,581=559711,/885:87261997095--8719=9A?Scm|{{cWTQIF:?64:89lf^_d]]gf^XKGJPPSIDBSILW_YQP[h΃{r]VVZR`gmzxxsdrzpoth{}xy}vsjfR\NL@)7B8MLKQ\NJ8D>BC=@=784886999?>=;181:7,25646;>:>8171>::;?GPY[hcSOHDH@B>5636}ylgee]_bjgTOFPVQOOLLINX_lh[WckăxeX]]bYjfjktihipovljkpzu}qzmqvpfZZSH<,0;@A>AGJFB;;:?LLK;?;8<@CC:>FB=354260/39.489CC584/}trohfou}v^PIPQNNMTY][iyrox˃􃧃}`dk^ffoyqvql{htrws|z}z{~se\QBA:)1A?;IFLJC;8488;AH?=DFJOI>664303*4)6<9A:376;EEKGDGSOQY_dm{olf[JE?AGB@<;<78y~{w{nVLJOUTRXZftqσ{փ كnkijggkqtyt}hjz}t}||yx{y|uccRBB=)09@<=CJVWQ?ALNDPQMcec[E>C?=>96:8<24eejtzsaPUGSYbbkqpp郟zwӃ݃̃|zrntortvy~miw{~wmv{}tσ׃փكj[RIE9%,A6;OAC?I;EHHNGHJORalYTB787/19258>5;@A=IMSa_QF>BFGIGRTWO@A>9<6;<429=66__^cq~scUVKFLQbjmhdnÃhhq{sjgkttsswjwny~|σ̃qXN=<7,0D9MIE?>;;54:087;H=JB?JNFS]bjWVI<881168?BFBHBH6ELUP[TJDJKLMEKE?BHCDA?=A@56?450bdZYco{|sshYSOKMU[_gejsw|si_]gsnpvzyt|ploetwyssvssuw҃܃~kZTA>1).:?DMH88=<9570544?=F@EEIDUV]bQ\MF=487<5CC?FIOKBFKJPPL?@MI=>KJE;:DIIDCA968;;111\ZRNWgkq~xg^\JFLISPPXis|{uvfWWNZ_dkjnqpuq^Vcgv}wsqnre}r~|˃Ãփȃ~jeX>F:),B6<@??570632>BEE;NI>?=E<>41<5??79:>A=?6142k_a`WVXi~yxh[TWRV]RXgpۃ̓m_LMSPPV`__lddmnsg]X[_eڃ؃փуƒsvmhflpipŃnhXHH3))>6D>30::=<21903ED4==EBA=FMKDE5A>?BJE?NRQL:=A=A?:?<9>LLC48.;A>9?96617931ca_XQV`i{ȃ߃ƃlcWNJYkkpv҃ڃv_`^KIQ^iihpgtyxr^ZcY_\osʃ߄ă|zrz}w}zofVWICB%=ZFLQQO=FF@C:=88)31=7/8E>MJQRK?CEA@B.0<674.<==8=@ADI?31/8<<=><68>8=4.hjc]VUZhȳi_RNOXakin~ԃ҃wjie_WPXavzwzngS\^jhz܃ۃރpilXH\HQG)6]ITVJJCNI@B;43;5244017>>B@JD:ECFBJO[SIJISH@44558925:73=:BC;=;2.23999CB>=><765`_^VV`bjsytƒjYWWPVehjixnfgZa^Sak|ccqcjlxzуǃ}zokfVN@F8%LZQW\URNNMRE>3474.16831:;=A@;;97784TfiXZe\QV\agllj]XUN?L_Yc[YelzrstlVRQ]vh^mph}tnvrr{~|~zrs{jSLJ28%=^URTRU`cCG?01<.43450.377373;BH6?;KDIHA;N[VG><2-+:4/9=75319:91033181/27;7;;>F;KS^[ZWTNDER[YZ^LNWPBKPW^VTZaea\_hefdhyhedoxozw|yrw}{z|ytv~~~{uiVJAA=)>OYO]VXlpMKD;48835;><:644354=>>733EDCHADFJ_SIC2-82///56;6:;@>9638019999==5;>@9AGQ[VIHJCAECGRQFGOVFFOS_PKQ[ZY_b\\[^jsscnskkr|tp}{p{s~zknunfLNF8.CPXLTTZmxXIF0-11.=5:@@=923<4>I;:95F;@J@:FDN[GG575221.1:>K=A@;89:54.5696?>6;B95;@HPONE?CA:?@CJMKQRMNLOSUPMWRZTW]denmj]hkjffa|||tojyyzszuvwu|~taPA<27PKMNGYtfT>=216<9?AFGF9<12;7;?@6@D:>3=DC>KOYPJ964163+48AZUQ?C:>D365/:53=?E?BE<>>DHIIF?>?;?;;?HJLGGLIQYOILNPYSETUZfc_aXSYborzzwǃxrp{{ao{ymm}wuraSK?)-FHSOOD]fV:7:3?39ACADH:@9DGCCKRAB=701429CKbbcJKA7=:2:45449IMKFH<ADJECGGC<=<>>BFBCKMRPWQPTIHJSRTQRQQ[QSWXU]\\f~y˃ԃ˃svxup|esilrq|xtqzyʃgjcgF,5IJUPGK___=>3220BLEOMQNP9;B=C7>53<97?N`r}bNC;;:47;;9;FU\^PJG@>;AFD<;:;?>657;?EFHOMORUINONPJMGKWMCSW`b`a^ikȃ̓v|ysuvskqqpiv{~wuz{~ԃ؃ك{xghR;>QERMLLSWTL?7,656DNGHNUO?9:4A113610/BLMaSCE>D1<@?6=89?SswVC@:;418A::L^incUI;7;<;@<57544577;:?GOOVNKHBMTWNRNRLNHIV\gusfiox̃~|kxy~}hmxop{qruƃՃЃ؃lu_?MyehXNCOCULB:0C<76A;NGJD@>95/02429*;68;54978;4277?@PSROIGENVQWRHLPJHR\bq}|~snbflhmrnrpgozw}jnyՃǃӃ܃ՃruV8_tqhRHLDFA=07>688=9FECEDC=/98002/+8DWfxnXG<<<;.84948?F[fsm\TIACB8:7;>;GKNQXQ;4CB9:85142,376::7;DSVOLLBENRP]]NOIQTTdsywswga]c`contuth{qt}xo{̓ltS5X~\RI@A?883;6;99E@<47D<42<7.&.056JT]geUBD6;;8=1;5@=:JJZikf_RFAICA@<7=:50+2889=<;=AJQMHADLEOPJQMJGN`lbdflhpzpj`gn\`kyunp|y|xrosyzxxigS.LndOPFAB<151@65@5<"8A;:8;2-06.816ILOFE?A78;:==GBD@9:;@XRf\KGBLHEB796AEA9KESP?::;?9293)/<@A>8E<>::FC061i>25B28+4+..;639:8<@?>;?:7=;KP8=F6:6DNYVJJCDGJ@94;CNGAKMUIB>745/.072198;:;:FOMPGDE@>CNPU`TZfozsfc]STb_Vjq[XU]Pi]hig[^]dT[geviipyirXJ>1X{oaccPYFH9ED838)݆W-1@,1.1,-275566?:8:;<:9595KH:;B852;?LQHI>HDG771JJMLDIK~]J<;E23;;:6989>;6:AFEKXNFDDFNRW\VWfxwttqii\ZPPUVT_UaSHCMVLShid]_PWL[MR_Y^fjhcTE<,Anmglff^Zc[^NQEII2/73!ƃl5761/5,+1/1:979697@>?EC;:?EJJ@9<55<@SVMKJJGj@;FK;5BC;>ABD@A6IgMEEAC<9=A:;<7*3)206.:1:.6/7.41>:=?AE;DCBE8>RP]babcfklplruwaS^W`YXN[XR^PZ^`[NKM><80351+77;DA.+9:52.899?@7>=ILJOW\V[_dltr|v\MWfa[[QPS[[U_f_OB=>GIFEQSVfbVKN?@57-6.61,0B=?;8-:684:9:=BT]iiXH9::=1;<>C==;BJCWeovxsaQPMVgr~yUQOphUVY`VJKI@895=E6:>;?DKG=@BBCE?APEHJKRNY]`X]gutaXOSY]WP[a[Sah\\URCD:9HMGFKZRURKEID=;BAJDBOKOF6,:A6>B?BGTRaQD888450,3(60@E;=845756@;;?KXgok[J.73736476>>B=E;M\mx|wo]VTQfasrXQPs`^\`ecWRK@?>:<78<=GGBIK?=:9>@@HLFELLKBMRQXckfk]\UR[Wa]`oynj^b^WNKBJFDFSQRUQOMFCK;;98;7FKMHFF7%1>.78/=A=AI?IGQ^eVF=77048346;?CJ::;CFN_ich_SZRbgj`UMH]SWZV\ZNRO;<<:=@<4>KLJJFD@ELMJX^^nlhib\[VYUacmrrsbeNMPYOIMFUKLIRHAAFF;>C<:;=KGQNB?5&.7+.?=792C7>62;03112.,/28:@;:<:EGNAH>E=KPHB:@731(004@GOQOF:=@HACOPMHLHS^^[XQNEbYYVRTOBID97;58>?@EMZfig`\TDBCIOTUSNOMSLDWji|nad]Z\_fhhmb_[TMOTULELNKKDIJECL@;EC?FLZSKR?9A3%/35015=0?9;<1.(+03404,,7.9?BA>JKHGIB@=6=C?F=71*..,13CRgaTE8@SJHHDYd\[]PCLKLQCIUN>959>;6<>>FM`lru_OCKKPQMQVWMBNSPbu}tfhcji]oof\Xge^WXUPPJCVE@CHLDKA@B:AVPWTTMGD7:#3437:AE4=9881016102;0,,1*39=BB?LD/5251=43)-0),2=F\ms\H6<<>9A?OHHBGRZc^eYIRPLGGOGFA;9986;5=HGVhm]I?4+"'<6.37<<1-3-*2*2*0.56+4/-3.25GD=845554)371<7535324885RbmON@DA:<:@>=EGIX`a_]_idLGBEFFH@<@:5<;9HORh}kTNLQ]|ÃiYTbe]]jq|xlYX[Wnvi\[cdfe[]`aYMKRHCHXSTRFFJBFVЃ҃`J=81#*0;24;<=7,*+0(031-:967.1,12)3::541206;4;3614872085=>5OQ\GH?;@8CA@=AB@S`\[^[W_bSD=BBMPHC?A@?ABI[kwz{wn_\SCENOnۃكddb``YgnjhtxkYNYV\jvhcge]_d[\]SKLIKRGLKHOTFL?=GPw΃{hI9:1"4635?=<78,($0),.1/=9<7+-.0/..02/25.4:1=8A97/68;61-4?7AIMGHI?G>G>>@?FMYhhfaa]`hJ?BHOJNQL;:BB@B]{wh_SLK?996AH}ywo]WXgvokn|m^de_knffiee`U]]PNWUPNMMNZTXXPLVGGVckYJ9=+ ,7,>09<3356(/,.4.9>8;/1@=,'-)+0-6/8165?BE@?44481431:>;B@LFHAFF?@@?=JTWidf`ck{yLIKFKQWNGJF=16H^wy`NNGHD<89BKXxw{j\RRYabdvvgaXWUaggemmqg\YUPVOYYUHLJX^\dqaRLOJEShrt`YE82 )8/8@69.3782.043);C9605G=-001.+200-/2;AI;;;;7:04?:69@BA3GBIG?HCKBBFOV[c_ddeoz{HD@CRTPWOF?:?BHUeq`MBB>:@>2/5+1)/,2,50=CJ:4<8835;;89;9G83D?@GFFGPHJMS`^eifhint~LJADV\JBI@@@>@ILdoWE@A>>CD;>CGSWPQMJFEIRLO^TYbldRO[hps}vi_VUAHQMDITSPMT]iytcJ=LSagaQLB14$'0:9=<594>B3653/(1(,.71;BQ@@?8<4=88;8:BG98D97CGBIJKJSUfjuxpksl{KBNWW\SPE?HC@BHMYlxjXG=<99;JPKCCGBGMEE>>DEGFRPLSV[\Z]WYktvgc_OKHGFJRSXSWR[[hwgJOPWX`XTYB64)",6?KJ<15:9066>8ACDG>;<.4=10-.22125*01INJPNUN;2?NKQTXge_[M>8BBHSdk`UWSHBDB6>BDJKKGBIMPYTYZVcijcicPQPJEPLOZ\][^Xeyzqp]Q]^qmWXff_D0-%.4?AF@606;=B458FNPI=54-)7-*(,/4*08..1;FEFEIC1:CD?>D>HIIWkn|~F<>NMOGHLGB?CAKWdnsf\PEF:?G]~mYZ^ZP=>@;CGEBCC;BCO_ZTNJhpndeZJKSFELKK[`W]^S\cpiWkUcwf`]g]I96%+9@=B7446;HUL=23+),,&(,+1+*97959AFORMKA>8>JEEGI:97DGB=@;DKLN^mz􃹃GPIBHOMIJE@@>HOVesr^ONH52=K\{vuweTJG@EJEDD@:;=?CR\U[e]]lg^NEIGGSHWZ^ahodWWfcf_kcp}nYcg[HB4,-<@GDB;86AC9>CCHCEDN98+6+1'*,')03<89=:=OZ_QE7A?HMIQSFA>:FD>:CGFCSXX_s$҃QFBDIPLFGOK>BIINcplf\NJB>8F_qeJED>KP@8>=31<>Ue^YRFO]fjXMJKITLOP[Yib]XSV][]ad{fZoyuTG9'/;BHSMH;7C=:>CEGFBBM;=283.+,..(0>885;:??HBFKZVYf܄܃TJBGB99:74-+201315=33?FJchUDF:DXhvcIIEFOIEC?J=VW]ĩIHHMLOJKOPGHMOQT\lznbUFGJU`dl{yROK>>;:1124;=FXfcf\EEJX[MGPIEWROZ[VSORXXNGVOIQ_x}h\dL5,8DLtvg]MH>4=CA>BG;?RFC?513772047/<8:7?AH_fTA?KN_ƒԃvYUGVWPKFFLGRXaezփڃƒAFFEM\OLPRSUORVQVbgx|pbUZaflhhy~lWN@8:;41040/=CObeWPMCCUNBIRPGSTNOXPPNVQKQPRNRBLcvp]J_wQ2(8NQo|riXSD<;CA=@E>>GLC931368787@>@7A:?9FY]QG;JNlL샋bSUaUZSRMM[Sad^gփу̃>=@EX_NO[[e`okXUY_glmeUTWipolowuwzp_KD9/7?89<7239BRPVYTKLAJNJGHLNTSXY[YSTMLRIBKS==67<>?FNTKHNQN@>>?BVVQSTjf^SRNNIHJQFD>B@87>Me&O%ʃcPHCMUNCIP\s{ul{׃䃮GG@CNISUUc̃ӃpTYPGJKV_X\kgb_`fheXIABCCB66B9.6=:5=DKMHHDALL=>ISe^T[]`YNV[VNLHCHCFELOKLIWUO@1+7?DJNKIIAC:?E_kVADA>9782:8BUfueMA7>A9;8.;I[ ǃtbLFGDD@>BGX_uf^aTPSR\_bWMB9?>?CDD=?JJP?78'0;9:BEE?;<=>D=;O_ye\\^OZIFC9@LW_kxЃȃjFFJ<=AFQde__XZXTMOOLHFDE?6:C>@KKJVXPJLKOE?ADSdnutd_TTNVheXK@CHB?>ABDD@?BH:.*'.406<3@9>A9:C[tpKG@E@43/222DLpԃ׃U;A7>765*5AHTsjKD;F>><=E@@@WpeaEM[PGAGB:=>;@?A=6$$+6)665568=F?=>91347AGlƃuR6FB=657)1=;CGTMPAB;?>=5?C?D=PqhcRFJVGBCEHE<9CMJDKXps[JHAGCIXoreSDJECIMMH>8>A86;;92'($5,27/./5:D;;=S\iWQPDC=4<<4CID_\N92+'#3.*533,:;8:9CUtvXLLF7279>FGCC8;==>:888ADIWtlWNDEHO[oro[KIEDFGQMDDFGJBCTbcgghr}zxeUSKMFKOZZVUNPOMNHEJEFQPKHE>5:99B72.#.2,00513156C7F[eNMF<;:ADMKZbjr`MFA87430+907.4B@C@@8=@;HPftvnnRAB9;C>=:A6:@;>5F=A?=:6>@G:@=K>JJJIOUyvhTLE@B>BB@:C=:EHBFKNX`mqtrz{||~~worf`glpwȃ˃cP1B:77:56AFKHH@?>IKMR_lXLO7BE<=EGDQDACECLKVSevkp{x~y{xy{uuxyw{˃уɃuV,Afek}rx|}wx}niiWQUXef]\cWX_^_dt|}}σY]CF=7@@B;>62;B676:>DBEIHHIH@BBJOeibSD8FCCFCGIMSPHNGKQW^_pjkrw}|{v}~z{w}̃ԃǃi3Jqjp}|zv~vfZ]`__\[Z\ZZ_ccr{ăƒԃ݄ 1#)  - bPEEM>?;D7<9>7=5D=59FAOISJRC9;DHN^q|}qgdXMCCCBECIV^\SPKGPOSa^hgmxv{~~{rmr~~vnwŃփ̃o;Otmqyv{ojfc[`b]^]gd^f{ŃɃσ'60/*14)DOPJ=G7EB;C49=C87@DJCRH>;?7>A=EFJPZ_b^URNKCKIRLPY]RGSPTb`juws{tmntzǃ؃{BLlnuʃ΃Ã{zswyxsxy}ă{ȃƒԃۃۃՃ-kY=IFKW5%8;>HGHEB=>=?HJVirrv{zsncjg`^dz؃ڃك܃҃̓ȃÃσރEZvtŃԃ˃ȃ̓߃܃؄,ZՃxxvqxŃŃʃ Sn[dUnHE6 p_6'664;CDEC9B/2/A=GcuokiZ_VY]bfymZUSYNGLRCIB>?F=>=76?BFXfv~|~tiffaZcguփڃӃԃՃڃ! B`o~ǃʃ˃ʃƒ̓ăǃ΃܃؃ɃփLɄ)Ƀ~xwtz̓كIl{ۅQw.b- 9>-IJOQIH76:>DERiw{s_`\g_fuzjg_[SJAKCE;:;HAEKIVdqwz}|tpd^ZZgkpƃكۃԃۃۃ9Q+E\t΃ԃƃɃڃۃ܃O1Ճ}qyu}̃؃̃ƒуEhӅ/7;86FY\QKE6:-=CN\zokfunpoڃrhbZRKH?;8A8;>EFRRV^pxy|~}xyusebbmmpz̓ӃȃӃC[R?Uf9FV{xʃՃσƃԃ$K_|f!փvw~ƃكσуڄ-j6}mȄ\"3?GNJMOVdn}uvqwwgecuulv΃ (Rc]a#惒?R{pà ܃ăӃ "@W<؃w~ă߃̓ׄS.g,Mރ8;AOT^GH85=ACC:WT^TY`f{t݄ÃsaWQL8733<59?ORPLQOIQWb^YpǃpZSHNJEIVJQ`QPKFUU\aZQZ[ov}qndbllz}|؃.HES=~?Jptt҃݃كǃڃЃՃʃʃރ̓ÃуӃԃ˃̃փ&XԆU41u; ΃ʃŀDL_\aPA921<;=>=EFKJEPDCUROU_ut`]IPG==HFLUWJEONCLYXEJU_fstszqƃ 4>;$탭t;Qȃσσ  ؃كԃ̓ރփă˃׃׃ƒ̓؃˃ǃǃɃȃу3r<ʆ1a@X#ăGPbq_G=8226:=9@FEJJIEMDLERWXexpy{|qQLJA=CBGNQODIIFCHVYPZ^U^jyσ# ׃=hɃŃÃ؃؃σσ΃ՃكŃÃ؃߃ڃŃǃӃՃ݄ BDžE%Y̓Y[QeZC58:.1=/=H?FHH?ESIGMVMX^ur_ajo|keFFGH@FHMJLC?JDEKNYV_bc\iuŃ΃܃ǃƃ ʃA׃Ń׃ǃǃԃ߃   &"ۃڃӃăɃăƒӃփƃɃփ҃Fp W<5E%̃YYMYMH+7183>230127;ILRGHMQNPULURDCGIHJJXUB:DJYdqleypqx݄ ăŃ҃߃܃ڃʃ̃̓J΃ՃɃڃރ )E:4B60Jك˃ʃуă҃ɃƃăăЃЃ*GUn{g#σɃǀGDE:48,48<:=KTNNOR;A<@C47GJLH9BDGLELHLEEGFOKP^TIA=Pbsp}rztƒԃ̃*E# ЃǃǃуIރ˃ƃ؃ۃ #!  @Z3 ߃كރ؃΃Ã̃ʃȃσ#;lm6ƃCF8CCF@?-6/301FPg\YPOA?6A?1@@=PD=FICJHI@FFLILVLIDFZex|}rvɃ ۃЃσуTOFG*ڃǃكȃGnǃ΃6=#؃؃΃ăσ׃ԃу˃҃҃σ׃:mi> ă€M@1?<@FHDIIFEB=CB>9:>IGK?:HJFMGK_mwt|jqvqσ #Ճڃ &6ڃӃ KWzw{s|΃؃ ՃăӃ߃كʃ̃#7 ȃЃÃ˃ƃ,уA>:35:8A1;?57:J]yifODEC;1=IGLMKDJ@9@?9:3:@CJXfwiWG<@;F77?GJE;>>D>>I>BF@D;@>?@EC><9@CEIA>?>EUPKMMVaf^\be]hу/'كՃك˃уǃK]~plneouxÃÃƃʃЃ̓ԃ߃σăǃǃŃ?c[8no|̃ރɃ׃D;=>:>ADGJGBSW_fehNMBAE>BEJG@@FDENCUOJCUR`[\aj_[VC>E>EKQKBDHHIBI?JCGE>LIEJ=F@BQUUWMTUW\_^b^h} ,4;5D*+ ȃ҃݃Ӄ|DUuhkww{uwsvz|ăÃу҃*$܃ǃ{x{vǃ'̃ʃ=A9CBEIHIKNUZch_`YXPAEC@?S\PPX=@BKIIPLIGBGMGGBBEDIUJRRTSKTWV\__vȃ,Qt|~G'ڃÃ܄҃j;Pfamxlxyqszxȃ̃ʃՃԃă}~܃׃ LAAD>KCFFSROYZ_]gcSIDS@L]Y\MaSBDJJMP^Pga_SLOKRfdRU^TMPUMKESKHDDAHCHDCMNTQRbQX^]]WXSV^ZmɃ,7PGpÄYƃу+.`3GeYevxqy|~ppqmror̃ՃÃƃăÃӄ FaKB?@:E>CBE@IMJZVclmXSMK\c_T^SQDLOJFELSLGAHFICBKQHXWYZbdf`g^ZP]b]uރ$3tĄ„FƃŃ郥v\r'փȃ ܃mV6C_[Zb`jtw~~nff_bkv|y}wtăڃۃӃƒƒc:;0@<4FEIECH?=?@FA=E@VXR\`u|ppdsXMLLIHFD?@RJVO`Za^X_ilmkp|zЃڃ˃{΃ &փՃՃŃăτfC܃b6@[TV]b[kvmqx}xrfmphge[ool}wmc\esr|}wt}wpt̃߃كƒσ8?<MCB>8B8=DDALAU\[fp{ropYMHJN=>FF@BGNR^e]h]skpqlpwσك؃҃ȃ1ỹσɃǃÃ&҃c4?_[[igltprxcdhff`b_\nqkhfh`\guuqxrvh_]ju{҃ʄ8L5*UF?>EGKW]rwƒ}uTXPCC;GE?C>HCWM\[YQVirhƃ̓ʃτ:񄙄-ރ~r2Mz}wwyuie^``_URW\agg\`gc_lw{̃ԃك؃yqtxmehdiqriY`b_ciactpd6KDJJDGIJEIKMZtσʃxY^VKNBJFEA7FDKLSPKEMS]eƃ ܃ƃք{$̃wa2Sdg^YYTWUUTX[Xa_Y^jnbgv݃Ƀxpoi[YZcdehkd_Z[haju]Y,IGIACIPRRQ[Zgyȃ'sg[_QZINKMFEOEDDNMABB9E^ӃÃσʃxpyzʄ? ރ˃uT2gẵكރ{]Y^SXLQRTZXO]a[W_mpq{ƃ -&܃ŃzofZYafd[[f_WWS[eqvЄ-XYFKLHTPRYagr܄Nv!҃sl]\Y_X[UTIJPGGDJO>F;$4ZǃvzomisŃσăʃxaN4fσtg\[YUOSQPPG]eVXdfvswÃЃ كʃpng[\_UYe`e_MTXdsszڃڃ΀kYS`WOTHY`ln}̃O%̓umd^cfgdaXRRTRFNBLILG(>_wymfkq|Ƀʃ˃ʃmXL3d΃ƒrdic\S]VGHIOYcYXXiyكރփ{lgb\WY]__bZ[\dipxe^_^Y[XNcg{ʃڄ +5yspeolmfb`^aSRMEFXQUHQl||t~|rdgfloԃ̃ʃՃƒy`_FuЃք (у{vkcXVUVKKFRTac^YfxՃ߃ƒhjlihefhdedac``fqg`iR\X_dqڃvqrwvlobcW`YYMXXba]z}~uk^[]\opuv׃σpby}ɃՃ჻zjbS]ZQNMLIWcj_[dtȃԃփq]`hrhhnnmlhbdilxzc^a_d\i|΃Bsxc@)}tcgc\_]`giss|{xkddZVU\auerzdp΃փރσzf`RVKJMPNJPkhhcgރ߃wrfivu}ynfejsw҃Ѓ^gd^ihsȃ>#<}ԃ{hcZa^nnku~nb`TZXWecjq~eRHtʃу؃ۃȃzzc^RRNISHBP`haWXk~ʃڃۃuu}ƃ˃Ѓ˃_\eagnmЃ[ʅyʅr ăȃ܃ۃtlrr]xkyr}~xkfUZS_iaaj|}wvwZG5nσǃ̓|~dTRMQKHJST[`_WXhxpу܃ʃԃ؃у΃ƒăۃx|^[_ftzل,D% ߃Ӄ̓߃ك䃺umyg}|̓߃⃿tkgZaW\ajg^t~sxt}yzwqS<4lă΃ăۃ{weTIMNPBFNSWUbWcp{wȃփ˃ -؃ փerqōK8O넂1ȃʃƃ̓݃ʃ݃|{yw{҃܃كodcX\S[`ihj|vnsl~oppoRB7^σ҃toZ_IFJJCHMXYW\`ab}z{Ń؃ރȃЃ1Tb=̓ƒȃvs|x̃#~pAԃԃȃуك˃~yyЃŃƃуڃՃʃŃʃumha]V]Zbfo||xpmlmptbcovjRJ/TɃsgcfSIMYZRSX\XU[abt{{zqioՃރ҃΃ك $DW@/1уƃكɃ{}z}v̓3@@JL5$ ԃσyۃԃރჹotidb][foyu{stjuklf[OVkkVN>+^ƃj]SQFJKU`RTTTW^Z[mqqpwtzăÃŃ 52փ̓{|xƒ .:)-8963'΃ă~v܄AR4ރ܃ރzpf]b]kquwtljjge]XSSTda_T@2\ă~pb\QNMFNRX^XTUVRYZis{ol{ 1ーwzx~҃  )05(̃̈́$xg ԃۃڃӃzjceaio{~rkqg_`UVXXe]YWJ7[rh^YNPOQU[aW]\^P]^a}vpick{|݃փȃ˃˃Ѓσ̃׃Ã~{~xȃ؃ׄ+1 ,91#ɃфLxnۃփԃ|oecbuuyjhjbY]SMZiik`P3gqa]X_ZZW\[_bi`SUU[h{lfghjsrwqrlm}vȃȃÃ̓ƃy|t-8(ރ'UTW;ЃȄ 0G62̃΃ʃȃ|now|{rzpio\K[QTUigmj]6gȃƃ˃zpbVXb^be__]d\UMOdh[]affgagkhhirv|r~yz|&ԃӃ.YЃƃՃуŃÃ}zxqfRMP\df~z|^?oƃуrgmV_ecbjfcgl[QQO\sha]``cjcbci_ams}{wqpz|ƒÃ؃˃ԃ߄ P؄儿vȃzʃ̃߃ڃԃ߃كʃƒǃ{|wlsond^aZ\k}g=||ng]lifdamga`YNMO_yqUYZQQ^[VY]]NWk~z|qu{ry}snx~zzr|̓Ńڃ1݃̓ك`ㄾK ܃ȃu˃ڃԃӃ˃̃{ȃԃ~ukkgw~xww^Y^c[i{|wn={ԃŃ|pggj`ZaYa_hhUCKJUllVYSPTWMPXYZ_fq|uslhjihrxsnkr{qkql}~wy߃ƒŃÃу̓$҃σŃƃ ZwP胻|zσẵzτ ~zwjlj|vqrmfcg_d]rksf5tƃƒkpygobR^ht__VVJBJYfjfWTNONTSMQ_[RWfoyv~ve`cidepo^Yuopzsfkn8 ӃȃƒŃσԃ΃̃ȃɃQH::EPV\]Zge]UZV[ZOTPPQSXTX[dzxjkukȃQe=FHB*%TyZǃrv~|zpڃÃƃՃ܃݃{g`W_`MVPV]VLPSTURZcgXXI=6(/GNI]lcebc]STEDEHOT`]K]iujfWOCHCB;7>IKZZUXc`VSPVTQSGLMY[]`T[jkknuoapr6_j]C 19A  1ڃăɃy}}xtsσ׃̓Ãȃxf\^VRW]QTGNGPQVglop]UMBC-*CPFTeZ\_b\STD<4@KNSRa_fleQOIDFDD>@@HMNW^][aUJQQXPJHMVRVYTW]`ebf{ydom}|܄)* كă΃}}}΃~rac\R\VMWWXOOW]nj`XHH:%4CLKVVTUWTWCHTB;>APRK[\hfeWTLFN;8?CAJKUUK\fVVRMLPMMPNVXMORTWZfha`q|je`~~΃Ѓуփʃ̓߃ჿƒ}yxzȃރi_YTPVTTQVAMVTczkVYH:-9DFWbRPIRJWMEPAB=FN[R_[^ium]SSEJGDDBGOQQTOWgkfVSTOKJDKRNIQORW]^VU`mwkbȃу܃҃ۃÃԃɃÃ~x{ƃeaY[RROKEOIHR^|ws^VL13PGTXMRPICNMMKEOBIS__Y^box_W_TKLLNNKNVRVU[fnd]PSUKMHJTTJTPLOPSOPXmsjpqnfW˃˃Ճ̓{svzzƃكƒxmhdcXONSBMRF]lubYL.7RMYg\KVGUMO[``RPVVSW_lp~uf]RFQKMQXXY[QWal|pYQ]^RNUPPUT\SNNQRPNQagegdWZYyzŃȃ{}Ń|̓ƃȃу҃ǃ}s\d`VZMKNROOdup`R;)<_[is]WRJUKNgprQQbNN^ev~zk[ZUHJRVXWST]c_{uj]XVTNHHHNYSXWQOIKOLVhqg^ccYlls~Ӄ˃ăƒك΃ԃmZnmZVPLTTMXhzpgTI+?\cnoTGRMTW_mvpmhb]Wck~{΃уyhaNGTPQWW[iY[cqsrm]WVROICLQO\ZQRQQNBEPZ][_bZXe`i˃΃ŃӃ΃ăvnYh`TOROXQUgmmWC(6baknsoSRWZdjrcdweaTT[fdփɃ~f]PMIVXU^cqrmcjzseVY\`_RNSPIJOQUMLHAFMVZY[caVljfn{wy|{ȃ̃׃σՃۃ߃؃Ńssa^^_\\Y_^douɃfP'9a^jjwhXQMXbgqskdiXXSWYbʃЃb_PPHLN]\nzw{she]X\UOLUJKNKUURROKDET\_UYbYhg]cpstw~suz}~xu}Ƀ߃Ճzhle`WW]Yg]xƃ̃sX+CX^_kyokU]``qgiidSZURLTe݃܃laVGIWVWdqyxuyibYPZf^UNNMIP\XQGIRJAKSU^X]ebg_T\fnzr}}rjn{iuكロƃヷytvh`g_TThqtzuӃԃ^7Ae\Zadmabi]efwqa`KYULOU]z˃ڃǃfULSNBRT_fmmuwf^_bhehXPLJPRQWXRMKGEJNZ`YWcipi[Udgxrohjclxzto{؃⃯}|Ã̃qqno_phV^di|og9KkZ\`afgd[dcgkcbWW\TSR^ivmZMCSORab_cdj|}{k_a]ag]VLISTVVW\VMIHHJPafXUSP{k][ccpg\abcmogwuooփ܃Ѓ{1ȃ{{wsmpvj`Yb`~xÃqT/cz[^VQH_QchjfnibQWXXTZdYrʃc[KOQSOV_diY`n}ve]V^]\]UNKLUYRXXVUIIE?GTUV]_[i]dZ^h`[\W]mnam{pmƃڃɃ{q؃(58҃}|wnxu{k^ZdfntpyqȃmT5g^_G?ELOXeYZf`XRRVXg\Zbw!Ƀd]TKFKUZh`hjfhsyp]YJTT^]QCJJNRXa`VJACKJJST[_al`b[`i`aWWZjkip}s|ƒڃփ׃Ń˃zx˃!O=Ƀz~x|vq~seZac_mkatԃsi^;]|hWM@?IMW^hZ`WNZQX]YZ_\oփ؃wVSOEFGKWTVWYa\foke]ZZWUSLFJIERQZ_SFCHEEJVXW`^kfaa]hdcX_gbalrzuyу΃̃ʃƃɃ}5ewGu~zl^U][`mkjvǃtaY5\mVSE@DNTUNW_wjdd_]]TU\ohdjkv{zǃ̃ǃrŃۄ IN؃vswX^VZY_[^gx}qdS6DueZRC=8>NXhjkjZULSURaX\aW^rt}lW]XYXNCBMKSEUUS[]T^ZYUQPMBG@E=71HJZn`VKNPTS[RRgkXVFAHEOGOOWXOZZPRLID?AHQSOLIMCCKB;@@CLKsda`]SQWXZ_emfiou}qՃ؃׃v|w~qu}xz{drcoi[^T`\jpzs_UNF2(+B=C?<>6F=DQ[cZVMCDLRPU[`fiWFHCKQ]dibVII@9DACNGOPLMOYWSOTDCA@FLRK@EKIHFIE>EJCD̃skknjb\YUZ[mvrpls}{uzʃʃutphh{yoruqol^Ubou|vYXG0%.F9DEU_VLGKNZWOCKJHHFEPETclXGFNML\hmc\GDDA8?>FGOTZaQS^TOPKD?:CA?;699>EOMF?<>=;݃փkekqnc^[`ftxpqphhhkho|y}oivu}nz~wlv^w|}igmuqutkZI36!.A:A[`\aRYpm^`SNA>@C?>BGPNZQN;BFU^hkiZ@:899:C>ETTdjec\VZOHF?3;<3859;CJIKWXMGAJ[pwlYC<29856=FT[j|nkYUTFC=57CD<>C5868:ABK\`jncXMHEAMa^VEE?TrjfVLDA76<6=A9@NTVcTSKFGJFB>=AHHRXQPNSUPQLLHEx|̃_RX\][[^X\\WQT[^[\__^emnktootoz|txwhodkhilurx|tse`RT{y{rvpfhnqnR:;2196MTRWldWOfSIBDC@<>78:4=KNTIF@CRQWQGCG:,00@E?7=JLGXWMLF@=F>CGLQTO^\VULIRPKIH@~rs{sYSP^`ee]YSNOIN[[VZXVbokasikinwm}v{dbjellv}xxxvsjddfwxoxygh^]SVC7 +FDGRU[]]XSTWMGJPQNOLqrrjrbdW^{jYLIF@J[b`ZWUX__`fgtwttiowwyyteeckjvur|zes_\strkqnpbcXIB5)7HAKIMPT?;PUCDQBC?B78?48:9<9D@4>GNOH@<:43,.6?:8:58AB>H>=A9?JKNONY[[baQROLQT\VLtmhjq~pjmyǃjSEEDKYeqjmRJRWYcdkzxmmvmahxytpqkp}zywmakzalaoj_PBH6*.<:LJCDF\dbXVZXOLUX\Zea_ddn~u78?EGEH@JTUW[lmcUNTYecWSXXabW[dnv̈́fOEEGYvكhS_X_gngov~v}|{{vodmyn{aaW>:60/3CD;8=@E7-6FLGRMKPM^NG?@559AA1>5:2<317-88715:852;6497=@4?B?GRT[X`aWTFDUcZ^[TT``[_X_dvzуyZMBKENw)bXX^fhrqn|uy~~}fcnitx̃ȃ̓ƒt\@MC89?&/8BC>@PFGGRLRT@@7652298<;D?EAB?:=HNNKKRPJJGJ^`_WVVP\YVOPU]v}k\NHGJUq냺pRP`ablinqlr~{kdfojnm{~҃ڃƒŃʃ˃ŃwePLH:06!/EIDH=:0:C5?;8?@=::?CKNNGFH@=AR`_[XTIIPQLOQ_kibSSMI^ix̓ǃj_XUR_[`dulr{sdjlkosx΃ЃۃŃƃƃЃʃԃփwjY]S:,5%=P9CRGGHKF;<=73>)-.:9:GBC88.823;772:++1*.)2:601FE??9?9;>?KHACC9BE=DNhYSLLRJLIMX`lozk^QMT\euygXVYOUacgilejt~lehlpwzszу׃ƃփʃЃ݃܃q_W_QK;/1;>D:@?6E5.;9?@CF?I:9?/;.399DDB>6>1018:G=/210,02410636ED;6=B<69EQK=>C:<002,/526+1349B97<>FDBGHUG>::64;7FueZ]YXTQPOPYemajrwgTROSOV`d\Y]W]dbd[eouq^[WcVc|q`]`nhX]^otŃ˃ɃɃăuahsflQD!4B0?88H;H><785/@DA<;42>0.14/2<188<=327/15565/7*222-25-34=3CCAACFINTVVLD?9:999?qkhb^][XMTa``cfxodcPHPWRMRONPW]^aWew~yd`aXUcsytsnvmkiXijuփǃvp`_dfTY5)9;,C>FC?@H3097><;=<636;0<.//445/84/<3,.59;37>7388545882777EFE887<@==58/830,67413-448*543/.3.:=@?5;D=CFCGQQZgeWQJGE83>B@==rifknkckyiga``cho]MLJGO\^eif^co΃ v`aejdf]expyqzvnuioisv~vogtvonj_KJ<5,0><<4?BFCG@4>:F=PMD?58FFJNEED@DHJPQRUQd\XJD>FA>A<=;5Ãڃσywruvl\XfsokZVUbywrǃ僱{meemxswnfnjo|zzttvonu~ty|~{y`MB9.-)=4;=:H?4/0-3.+669/1457@;AHGURIICGIMD;CQTYWTVM@6===?=>D8ڃك}}{xm`Ykuh^YT[hvÃ~BB"ꃷtfjjtt~qvusz{{rzys|~oUF>:1)159498?C>:@788@CJFB@RLLOOCCEDHBD4200/8-60;8@DQKEIJJKA8уpm^\`cef`\\m{߄99䃗"<كz|~txspzz~w|~~y{kmoŃуlWF51!499:>=<>;9C;=9G;:99@KASUFITRMNM>9:398-72@ABDB?F>?3=B@@=?E<;@AA>97;>C:5<6.}nÃ{bWNKW^YQ^qmlomp|xntsozigadpz~z~yԃăjN:1%+682=05@A8<97;7493C7@LFKX]Z`YSJKC?83;?1EA?F@@@?8@=?BA?9=FC<>;B:@=<66@A<:8/0}tryzʃ̃sbXSIPU^ZNZjmwzyokeciw}vp}scddnqh}yʃ΃}}dJ>2))76=51?4=>75:88=:-88BCHKQU[cWDFIGD@6><D<7???8;CAA;;=;886B;:>?EA=;832tngkk|~m\TLNQLR[[ftwi__\\ZUn}~{zpacZ`ignw||m|}vx{xƃxrSK>1"/=47?F;ECHD6?>@==87=F?C?B<556?9A37HA:;547mm`]_f{t[PKJMQSS`yڃփdaZXLQVZ`tzzurkdecgdis{zy}zwzyyqvsVG2%-B7<;6,:;;A-:45338>BDHPKNHBDADA:88=>484=?;@G===6;;9?C:9=7;=?5404qnkaRar~w^QLCBPSQfoǃ zf_ZZJTaevypmflmfcr|ԃy~|rhjo^ID3)6LIHQA;>785;:>5;3930:8@=GAD@LLGD@JEOULFG;>@?<8@66:6999?<;E968>5479C308;0545sia_\YenoƃȃăpWLD>GMYam}jg[ZZaWb{plicfnq탳{}xyvw_cNM>6%5A:?FFD9>=<;7:60.:.54>DG7B>@DFG?>MK\EJKHAB<<<59:@;>5=88?;B?@:?999=474;<=966{j]aZQ[_a{ă샠fXQF79<8>FB:EA<;;DB7;>@@B5755wrd^QMT\hjxh_J@DBKXV`oʃrc\WSXdfw݃僪wceknsqރƃunjcY]UL;/.4G@G?MC69/810103KGG8.40A;;?8?IRSWYSSUSO?50054:76B=>=7=849959;4614fniWTPOWZT]Zju[PECBEW\[`hzv`]]`_[^gw̓؃΃y{|p~ɃƃuvfbdaJD57-5JJCMEM;C;E;3038-4417,15B5A@8FFLFCJVOM?80584178@JJKCHEC80234139:9A::@77;/JJMMNRLGLJLONY`^]SNC@GNQINTguqomvqffgcinqr~}z}toe]\F80,+@0634./4;;C@DCA698CC@EGFHGHJBBGNQLJCDD=BOPQUWdnmdeloonyrnhp}~ry{x{qupuz}naXA?0!3@:CJJ?MGAE85+-484<@ED:>7=.-19;4.<<6?836;D=C2>234+25?CZ_fjXP?<9327614;DJL?;;6>B;68==AJEFED@?>EICDBLA29=&05889@@>7782'99=::88<:?@3?GA8?:8734+35>J]kt}`A76EMSF@E;=66?B=?OQHD?><>>@CHGI=CDBRWTY]\X\cmosmdkcfmuw}vnrulxq^KK?.??9=BA:DD;5-;4-8==FIF@<;947;897/679<9888A>4A7262,(48@SomM;=:54:=9;DQ][YGA;6:64=@AKB<<8428?6;IFJIEDFPTUY`TWQXkgedcb[]mp~|}qrx~zo\GC-9BCJA<<<:BF:<4/92/-)77DVo^DB:<;78<@EUefbLA<25<==GI?626:77;:6:B??HF@DIIPQZ\URS]ba\Waebfto~Ã{t|wz~vu~ŃmcbG#8JCKED?E7E>5/81:<57=78=82011<607>EHHMIEGIMQVUMNJSZS[_Xb\dclzՃxzyyx}kfyzv|yƃpq\0ANF;>82/5/;7@G]oiYIC>G?=@??DOIPCDD3@A4;9953:8.+/3966ENMMUVMFOQLLJQBJQKVSP]cdbfj{ƃ׃~|uvyvqsonanw|у჻nhM,HWQJTFBC;:=;;;89=E<<<@A93<>:14/00/:A;[`]XI<>I9143104533;EIPW`SLD=IONRQQWROW_ZS]hfgpzx{m`svw|y~wvsqx}xjl{mvȃqlJ'AhafUR>HF>DB>A<8D@7AOlq`WFHEID<=-;?:05C:HC?=>A?30496.253288AKU__IAE@MVJNKKU^dWUUW]he`pryujelhqt{kyvloxpv~vmluo`D0>aguZKBEA:<@D7=8<35+2.06<:RZoZ]JBGF=@?1A;9617:FUdeoaPHJHA@;96C?>3:>N@;=;315<605603575>DM\\RMFEADHITRPXPPa\VQQVSYl{zysv}~ug\S\jr~}saamtmzkajc[\snxw|pqWM9Klvt[TOCC6H?B338>9>C<0*/6,13=08,2:6A;91)5*.,0616=6:KCD9?:>AAHJK@;2.6CHbhdNE7@7A6469:8:1;aID;8797349=;>F?48;ALQIBA:=7AMV`^[Z`eijhklrqtv{zp}topjbW[\LKZcnhjgVJXVYdfw|d[VMRQZW`dVWipobED-Juynlhibj^PLB<@C4;60-.37718-+1'<(251>;;E>@:ABGD<8:BJQQD<<9>AGMV^_ZXW^dcfmx~yqnqea[YYROSTWVWZba\YNOONQ\][ldVEJOJFHYLPIUb^`KB*Ejqr{swnrz|waT?@IF5B/14/08.66/--(2+.-6>99=:=CPRXPQVhWG@720:?EMMRKOC=;=DFGJEEA9}WF@<<>86?<;ADA?;7=BDF>?DPY`YZ_`UN<1,65ACLLJHQAE>KT\XLQHB=uZFGC=<;;@E;;CC@94MJMPXYPI78;469<=?@AC>527984;ABEGE@@=>;6?@CGIOXQNVRZa^gaYPFMTOOLCBT][\aeog`_f_PJIMOPZVSOGDDHCDFCCGIK@51%D=K?MJ?D:8:;LbVJ@6??577A?OW]ZTMQKTYV][QC;^TMHFBBD>CB:;<73126:<>CBA@D<27@AB@DHDGROVXZ\VVRSKKHGOQNJ\WV\^ssp{f]WLUKK^LUNQMOCFHD@CFICDLHD=/**>;@NKTRSXbWDGDI<<:47616<@3320(#5:3?FHELFLMFJ:5::I\QH@=A9575;KRXa]VXDHCJKU[ZGBYYWMIA<<HI;382/6;?F918355:ECCLHNMHHMJ<469:?NME;8370:/>EKN\XRW@ICEIPXQPNVTRKKDCE=;CE<7;<38ELVZPG?AB@E@>:CFEJKJJJE@KW]XR\]\T\dUYgswszrhd`[V`UUKH@NHCHTKQGKG;B;@GCIRDCE=7?F=45*.775>88788A:NYWRNGDI>C863429EGQJ:B7>;59@?<@8:DF?E;>75<>5-(.136>;?4-7@KXupZMIEG<;5756*9FKPMNTGC?77:@8>=IB@;:AC@EFCDPXJKJQH:ACFA26906BIWp~_RPLD<8>DDES\XQR[XRY^ixzliljbftrgbf\^V]ca]TMQOFJLIIIFPLNONZQQHA657G@@8:<7;@KcqWMD=:;B?CKLSRTZWUfkgsqxnafhgou~ljcdbSYW\\VYOTIOUKJPPKHJPUSbUMI6:;60&1;339>5=EBK?3204?-52/*/).5+9875??URQGNE<5:4?::<>EB<=CAMNVWXX\QTTQA8?ACA<>7:<58FZ|hTI;CA9>@IPV[W^a^c\\libnzl^acutlzl_[]ke^YUVVOUZUb[RMQHKOMOhbWYGG<55*+)17360<:9=B4)*%'33946//-.0*0884=;E<=;?<359;ECPDH=::EWiqdH7;@7548?>9;@DQxpYKE=7:897.,*(*(3;16/23/0&-/9;=7A?A.;447=?@JNJ@999ACZ[XK94>98269BB63<6/01-1).+.58;6-6-.(2./588<=<.59><>BA@=C<18=76?>IAC:@08@=8CP[fjaUD86??02416=Hg|{gVKE=8JNQbkqx{rigmffwqol_`RNMRTMDKFJOV\_k]]b[RMLQSRGP;851"(131@<>760-/,62078@E90:5DC636'2-/.12+199SF9983@86;785E@<@>:AGA@IBMFLZ[b_YZjmzMA9538;;DKXhdN@@?BA@JTRSaombfq|~yhZ\TKMQOHJIFGZdZffc_]^HJNIILFC>B?2-$'4?>9541/-,4:.5;EB>56@LB7+'+0./&86,1/EIF??<7;A=BKEDLHO\SD?=>=:JMJGLYipjljmpkZYUOOOLKHNOKTT]Wk^_bSGDILJKNILE:92+1.:IC<<39/++146@MM;>14>@630)(.)1/0:-14CGGF=B<<88/:62?>@8?9?@FIIEHPV]_oyv@83<@8?GDDINVTJIGG?>E?:CFIER_[bd]_uzzhe^UNLMKKJTX?KQMU^T^`_OJEILHOMN_DC:2+09;AD=:/>7.-,B@@IK<7?:8D9<;8EA?;<7;@FHM?QK]Zdp|?@=BKTZb\LFF;538>>JOMPT\^ZLDD=BJICEGCAJUZfb[[fqxrdXQMHQLNOLZbQMRXXG^`WMPLPSSSQ_aPHA-*6=:;GD73;59/9;:AKKB941/2/-)(((/*1.1@;>A==F?@B?;EB?>D>>DFJDNMUVhtʃIC?D@DFHN@669@IV_g]QBDD985;FR\\bpto]SIFDAHE?:D@5>FK[obTV`wqe`MF=H@CHFFLNQXU]jÃŃ>;AJHGJNFHH:=FMU^``UHD?C?EMU[`qvx~wo\IJJ@>=6:A32>GUadTMWbpqk_PIHBMP[a[PXOOKHCQNGKdtvmj`drsl[M3(,:>GNM@:4<87D3GNDD>>;7<332101)(*1878E@EYPTHECB:FJR[MRJBHGK^a[exvf^YNGD?<;:10?QZe`RLOT]VYUE;HJRHOV[Q\SRLSJGMVW`m}y_]l|M<-4NMR]VO?A7?A@BJJB>=>@HQSMHBB@>LUcunfbNUDELOENNURRLOYl΃ԃFIIIKUVHGD=HRFKLFLTV^YOQQS]hnimwmeXLM?<84=;689QiaWIIFYZMJMBDBNJMWUNIEHPTJRSMSihnmuǃWD&3FNaceZN?@F=IPJJEB@GDIHD94.1+-/4/,@79:JKLF?=7ACRjp]NNPW\FLXSPNSOYb̃ăBFP`ca[N@>JURTXTXX^cUKL[gstw{xbXRH7;G?3;EMTtt^THGHIIQPIBLPPOJIFHDJRMTV\ZRRfyxil^=-3BMbps\[SNIEWabK@B=FED>91454'0441623:7CCE?7:37IZ}̓|hMXU]`THSPNOVZZf}̓BDJan`[YMMYdi^^TLRW`YW\rrc`TA?>?98?<4C]kk\QJHGJD=CFMJJMWXPVLJMPI[ZWYRLW[mhaKWVghF7*6HNP_\V_UFLJ_z]KH:D@F-:/0283.,43138B5C;7BBA84Ja(҃dYUSPOWGFN\VZURpÃǃʃƒڃ4>@GMPQPWTTQREPis^XKORQOUUPCNY_UM;*2GIHSIJTFJJPedH?>??5:.+,623-:7;J=>39;9??C93Ha.ŃgaMOCBID@ISdaUYp̃Ҁ8<@IACDBMSgqidkb\W[nz}laecbUFCEGC=<7;=:?>>CHKJD?BD>3B=:21/-92>>@IPYMJ23:?66:43@bɄÃeVDJ?@?;=GLYaVeb˃B@>IL68CHHO^u~stpdWZceplir{u^XZULKQKC:C@5;=:769@>=;ANEKabQ;*.48<>DABCBOQgڃ׃[FLB?=5441/;=AF]kjaYA54:/6424A\ՃăUIL@;;?59?IRfhig}ȃA@E@=A=B4=GLbkloUQUOLZbizweNHTPDGKGHA?GB==;>==CFIGCDCEIDC?CMRJUY]TTRLMbhrqcP7=CL:<<7AE@IH@2(-21<=8@<:?PRY[KHB:85./;0>@LYa}~nZK672*40.1ANf{RML495D7;JGZuwm}}xnmxCAD51?><74DFIWlrYLQJFT_n}gVOHHG=?AFEAIE:;A??CJJLQEAEA=AJJJFAW___Y[KKYef_MIEC:4;A939E>C@?7.%*0,/;5?8;ELLMplHD>D74/,.76:>Q\gy{g_J@53432.4?>Obrsb\CFB8@@D@EJPkzpe]XZYJH@?>8B@@<;:@KZlpWUVNFM_tq\OA;?B@@>>DHD<9@IIEMSOGKNLEJMKHFRRR_fdRLLUSTQVVDCAA?DA65<@@AE<72&,/.34256>C?LOKH<@H>BKIMQR]||bWTLOKA=87;D9:=@>=FS\^\VWY[TVPIIPNMQYd\PPQNMQSBFE8A:<<65489;:J>60&((101--8;IBAUrgNL?;>77?7@?>Pa\Y[LEF<;12-066@GTV\`lxyZPKIHH?>>/:638?>?9:AISblm]NHA@JXXcjc_YOGGGLNJJFCA??GKFSbbfa^gmab\]YOLOM]TRVPROTNHG>@?A98A<:8449@F?8.%%3-1/1288<<>R̃ރyXF44;BAE:9;5FUUQOHD?DA0000//@=J>LI=9>95?Xg{yuSBA;CCE>9CGC=;XTENSION= 'IMAGE ' / IMAGE extension BITPIX = -64 / Number of bits per data pixel NAXIS = 2 / Number of data axes NAXIS1 = 14 / NAXIS2 = 2 / PCOUNT = 0 / No Group Parameters GCOUNT = 1 / One Data Group TIME = 0 /time of each exposure in s after start of OBS (rPZTX = 1 /PZTX of each exposure in arcsec (rowindex) PZTY = 2 /PZTY of each exposure in arcsec (rowindex) EXPTIMES= 3 /SJI Exposure duration of each exposure in s (rowSLTPX1IX= 4 /Slit center in X of each exposure in window-pixeSLTPX2IX= 5 /Slit center in Y of each exposure in window-pixeSUMSPTRS= 6 /SJI spectral summing (rowindex) SUMSPATS= 7 /SJI spatial summing (rowindex) DSRCSIX = 8 /SJI data source level (rowindex) LUTIDS = 9 /SJI LUT ID (rowindex) XCENIX = 10 /XCEN (rowindex) YCENIX = 11 /YCEN (rowindex) OBS_VRIX= 12 /Speed of observer in radial direction (rowindex)OPHASEIX= 13 /Orbital phase (rowindex) END @/(\)?@[@i@???(x΍@hQz@?ݨ@BJ=p ? @[@i@???(x@hsnNSn ?M@XTENSION= 'TABLE ' / ASCII table extension BITPIX = 8 / 8 bit bytes NAXIS = 2 / 2-dimensional ASCII table NAXIS1 = 89 /Number of positions along axis 1 NAXIS2 = 2 /Number of positions along axis 2 PCOUNT = 0 / Size of special data area GCOUNT = 1 / one data group (required keyword) TFIELDS = 4 / Number of fields in each row TBCOL1 = 1 / TFORM1 = 'A10 ' / TTYPE1 = 'FRMID ' / FRMID = 0 /FRM ID of each exposure (rowindex) LFRMID = 10 /Length of FRM ID (rows) TBCOL2 = 11 / TFORM2 = 'A10 ' / TTYPE2 = 'SJIFDBID' / FDBIDS = 10 /SJI FDB ID of each exposure (rowindex) LFDBIDS = 10 /Length of SJI FDB ID (rows) TBCOL3 = 21 / TFORM3 = 'A3 ' / TTYPE3 = 'SJICRSID' / CRSIDS = 20 /SJI CRS ID of each exposure (rowindex) LCRSIDS = 3 /Length of SJI CRS ID (rows) TBCOL4 = 24 / TFORM4 = 'A66 ' / TTYPE4 = 'SJIfilename' / FILES = 23 /SJI filename of each exposure (rowindex) LFILES = 66 /Length of SJI filename (rows) END 40082016804008201680650/irisa/data/level1/2013/08/01/H0700/iris20130801_07473608_sji.fits40082016804008201680650/irisa/data/level1/2013/08/01/H0700/iris20130801_07475708_sji.fits sunpy-0.8.3/sunpy/data/test/lasco_c2_25299383_s.fts0000644000175000001440000042350013203275053020671 0ustar nabil00000000000000SIMPLE = T / conforms to FITS standard BITPIX = -64 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 128 NAXIS2 = 128 DATAP50 = 7.297E-10 DSATVAL = 1.71124823554E-07 DATE_OBS= '2009-02-28T00:05:33.380' CDELT1 = 95.2 CDELT2 = 95.2 LEBYSUM = 1 DATAP75 = 1.523E-09 DATE-OBS= '2009-02-28T00:05:33.380' LEBXSUM = 1 R1COL = 20 DATE = '2012-12-13T16:07:48.951' FILENAME= '25299383.fts' DATAP10 = 3.212E-10 READPORT= 'C ' SUMCOL = 0 DATAP95 = 1.03027E-08 COMPRSSN= 'X% ' RSUN = 978.572578766 CRPIX2 = 64.5 RECTIFY = 0.0 R1ROW = 1 DATAP98 = 3.91363E-08 R2ROW = 1024 R2COL = 1043 INSTRUME= 'LASCO ' POLAR = 'Clear ' CUNIT1 = 'arcsec ' CROTA2 = 0.475331 CROTA1 = 0.475331 CUNIT2 = 'arcsec ' MISSLIST= 'None ' CTYPE2 = 'HPLT-TAN' DSATMIN = 1.68475228523E-12 LEVEL = '1.0 ' DATAZER = 59025 DATAP99 = 9.07191E-08 MID_TIME= 376.024 DATASAT = 1 BUNIT = 'MSB ' YCEN = 54.621 DATAP90 = 4.0103E-09 DATAMIN = 1.68475E-12 DATAP25 = 4.452E-10 DATAP01 = 2.188E-10 MID_DATE= 54890 CRVAL2 = 54.62100000000009 CRPIX1 = 64.5 XCEN = 15.3747 CRVAL1 = 15.3747999999996 FILEORIG= '090228_000656.img' TIME-OBS= '' TELESCOP= 'SOHO ' DATASIG = 1.4350301289E-08 SUMROW = 0 CROTA = 0.475331 FILTER = 'Orange ' NMISSING= 0 DATAAVG = 3.6263502816E-09 DATAMAX = 1.70933E-07 CTYPE1 = 'HPLN-TAN' NSATMIN = 59025 DETECTOR= 'C2 ' EXPTIME = 25.1262079357 COMMENT FITS coordinate for center of full image is (512.5,512.5). Rotate image COMMENT CROTA degrees CCW to correct. HISTORY V15 18 Jun 1997 MAKE_FITS_HDR reduce_level_1.pro 1.65, 11/16/12,'2229938HISTORY 3.fts','25299383.fts' get_exp_factor.pro 1.20 07/26/11, 1.00108, Nreg=10HISTORY , Sig=0.00114000 Bias (618.500) from c2_expfactor_090228.dat (wr.2009/05HISTORY /05) c2_calfactor.pro 1.9, 03/22/07: 6.26831e-12 c2_calibrate.pro 1.13, HISTORY 10/03/05 c2vig_final.fts, 2005/09/20 distortion_coeffs.pro 1.4 09/13/10 HISTORY adjust_hdr_tcr.pro 1.12 11/30/12 -2 using: TIME_DIFF.DAT 2012-11-05: stHISTORY dev 7052.3 sec Original date_obs: 2009/02/28 00:06:03.474 c2_post_recoveHISTORY ry_adj_xyr_medv2.sav (interpolated) last_day=2012-10-07 No roll correctiHISTORY on applied. END 3RHi]0 (=P=R=ΰ=]'H== =h =Pp=[`= $=!=O=.(=cx=I(=W}=O4=E==8=0=5 ==⩐=v0=[C==u8=ހ=U8=̈=^ =Z:p=dH==@x=:==0h==d.8=r2@=z=~`==p=0h= P=F7x=;==mh=(=8==j(=t8=BP=P=ٽ`=S=p=S=`=(= (=tF=[8=8+=Π=~=J=.X===g,=>=e =`=p=HP=-9== =@=h=@=Š=@==}0=ng<=;=PX=S=!p==P=!=b`=ޠ=¨=H=Έ=n= ==d==@==嶀=P=p=Co=@p==#=@=IU=}==0h=pm=p=&===Q= ==0=y`=== =ψ=Q=~===f==@=,==,@=H=}x=h=vX='<=.====@=-P=N=8Ϙ=x=n=U=w=#=VP==vP=Dx=7V=I=r`=W=8==GĘ==`=Q=[=P=@=cT= ===0H=W=߉==!=e=qĸ=𢺈=V=nCx=b=鴲8=H==3===ҿHW0uAH&&J=wg=fh=,^=v%=0=68=_=ziH=0=器=d=](==8=^X=x=(=$=;=p==B/h=x9h==\=X= = =n=Et=3==r=x=}h=7===7Q=_{@=Т(=?`= =@`==9ĸ==˻0==q8=HI=.=k@= ==x=h=C=:=@=1p= ====[0=!h=ުH=*=o=J ==P=&H=H=H=h*=kh= =}=X=x=.=#=(=n==8=7 ===h=jH===N=J(==M=JP=P= = ==p=x=@=@=hP==X=U*=L =4 =Tp=﫮=%F8=(==x= H=i= =/C`VP9^^܀=EU===H=6@===[=:Z@=`===0=e=h=󞹀=p=8=$kp=v#P=Ӈ=h=a=Q==Z~=q=.cX=CX=;p=id==!8=,=\@=A=Z=`===W=P=`=bi= =H=?[=P=P=c=\=lw>`=Ͻ=8= (=.=$=n=Z=(==8=x=m#=( =,S=d.=T=#h=t8=p==ah=B=j5= ==Ȁ=E====D =; h=Gx=` =H =P==k==A6===(:=N(=P="8=vH=ZP=P=^p=;P==aG=󃶐=l=kH=봨=`=h=`==&X=h=@=-p=e=_H=S=bd=sx=T򝢈8@߷o00=pր==X==s8==;==Y=n@=ː=3=j==^==p8=x=h2==6e@=lH=*X===l=g& =k=^=k==F=M@=(=I=x=.\@=F=g=H=J =p=>|p=h=M8=N= ==l`=@R==+P=9=ڠ=^=Oh=P==P=l=0==p>l==͘=D=~>=N=}=8(==8=ψ=@===ίH=gp=H%=8=o=d3=a=%=H=3==b=Y= &==v1=7`== ==T====c$==b(=;==.=x=@|=1==]p===(h= 8==-==2===1=@ G`G=˰==(= !==\=x=2p=>=2(=](=򣍰=(j=/F`=M= yP=Qv =D4=(=X=cB=_ == @=iS=Σx=9=b=͈==! = p=Z̸={H==p=:=(=M==;=rwH=?8=h=۳=h@=ʛh= 0=0'==x=VA=gҸ==>(>Q>J9>Gh>kp>l >`>{`>8>>^x>>>vX>x>ush>lqh>K>.H>>L= ==@=?==p=o=0==)=9==== ==/=.Ƹ=P=shH=1=H=bkX=-+0=qe=Ȁ=BX=@H=O0=t=`== H=78===4@= h=L=:%=wP==U"=;=%6=V=`=ɽX==^=_= =K=P=H=~=os==O==D=t=='Ȩ=U+=9P=CP=i== =8=Cx=Y8=@==p=HL=W== =s=I=3x==?_=Wp=6= =İ=P==yH=dx=!=tH=W=s==ګ=IA0==8>_>a>>Ը>$`>P>l>>o>H>-1x>>>M>I@>o`>yj>ma>`>on>Yu@>>J>:h>4>>p>? >-@>0>y>\P>0d`>`=<=>8=A==E=L=Ř=|p=B0===H)==s(==; =>i8=(=J=p="8==0=$=6NX=֢=_p=;=?(=iN(=ȵ=e`0=%=h=H=] ==m0=8P=l0=c8=U(==腔P=.h=_@=ޤ =ex=9X==w=7fP='=*=򟳐=L0=}==`=Yx===<==Op=ښ=(=#G=H=h=4T8=p=C@=`=ߢ=N===0=}0=0=Sp===<=f=T=lX=J=?=ޣH=8=0>?l>uȐ>o1 >U>P>x>+>A> >>p>8>!>>+>">H>%>6>>(>PX>=X> >@H>X>>>Բ>0>H>8>>>?(>>Ֆ>>$>\1>/W==h==Y=ko=x=g=n8=y(==h=tgH=@=L'=g=ِ='=e=s=Xؘ=P=C= =0=D=p=x===9=4=lh=\lh= H=Ѩ==}Nx=0=[=AX=X=O=[P=8==`=CiX=ji==h=DA="=O8=A=a=k =Pp=[=l0=x=^&=0=P=h=H==Ϡ== =Vp==Ȉ= ==:=0=:x=0=|=dh=U=f"=q=:=P>>? >T>Ո>>BH>p>B>>0>#G>`Qp>s/`> >e>>> >X>8>#(>I>&H>>=th>#>>>ŧP>R>8>>>^w>1=>ʠ>>H>tfp>Tc>2y>sP>x>>SSX>?Z=H=8=KO ==w0==uw= === =^=x=J(=<=΍= -h=.=Ah=z=F5==H=;Q0==MH=p=Z===G= %P==`= = =풠=' =̨==g=V=V==(==h[`=xp=8=h=D?=h=1=T=3= 1`=3=V0=\ʘ=a=m==հ=x0===;8=n =vh=$ =:h=e= _=hIX=f`===0=F >~H>j>f!8>>|>Pv>>縷>զ>N >i>S >A>:>Jh>7>iH>B>>f8>>>8>+h>BC@>p>L>X>>+ְ>`>ZX>`>zP> >Wp>S>t >> >>Hը>N> 8>> x>'t>#E>>6p>3>Q9>x=Z@=`==D(=(=5===@=p= =J=u =z=, ==B=nH=|= 8= =K==s=C= =W===xA=%0=79=ې=4=ﳧ=/x=#=jX=@ P===H=0=:=r =PL ="h="=p==Q=&p=C=(=k=%tX==R=i@==vp=8==J=X=8x=:~x=6=W@=R@=h`==7=ں==>h>z`>>x>))>>'>>J+`>]P>Ŧ>4TH>V>)`>=P>>1;@>Nh>>͕0>x>p>8>>P>>>Y0>;>)P>>>̀>Q>ɷp>)>oi>yUh><>T0>8>>r>=> Q>)>`8>S/>2h>c>䝀>->B> >4>;@=-=x=yx=$ =Ĩ===40=.=m78=O=ϰ=z=L=M =3=8= ==G=P=, =mh=B =xx=T`=E0=(8=YP=*X=񲼈=P=^=@=_$P=}=@=*=M(=h==V(=D=X=Ĩ=Gp=ר= +(=@=$=|==_4h==}= 0X=ŀ=R=ʏ==3p=H==x=X=s>M(>i>-Ex><`>V#>|`>Pp>>o>>->C>> >24>S>>P>C>tA>>|> P>JP>qS>םH>>!>x>Ax> P>S->*(>?#>@/>L7H>TP>>"# >!)>@> >H>N>bh>>$>x>f >>_(>>P>Iz>*Fp>P>'>f>%0>(>_8>8>d>W>@=H=K= =/=(==e==@=R=Ї=H==N^=lH=Z==8=D=3=e=.==#=j=Y=ě0= V =6=.===0=* =ju0= x=k=Z=@=q==g====P="8=~====o8=9=====ӏ=ޑ=P=`=wK`=R8>y>H>>P`>>P>>F;> >I>(>h8>&>p>Sx>op>>f6> > 6>Dz>8>>ڸ>%8>l7>H>>>+>F> >;M>}O>G>(>a 8>n^>>{G>_>t>X >?>1H>>>&>0>>G8>uX>(>>6>q@>@9>&u>> >1>e>jHp> >>D>Q> >@=5= =^_=m8=.y0=Gh=ù=n =:=P=* `=cUX=2p==D=v= =(=AP=(==<p==`=P="(=Đ=px=W8=p=w>=G8==V=x=58=G`=I =U0== H=jp=# =<_h=f=.=Ǩ=:?P==^=ٲ(==yp= P=Hh=}t={`0>&4>Z`>> h>R >>0>ܗ>&l>88X>F2p>pe>> >=>I>ǾX>IQ>\@> 0>dq>7h>X>x>6>>/>=>"@>>W>{>=>'>Zu8>>;>>>Q >?>`>Np>xp>~{>7> `>8>¬>W>L&0>->>cLx>Q>p> >M>h>A> f`>>%/8>3>8>쮀>Xr>=H>o8>(>mh>D=(=X==+=P====;@==u=֔=3H==;=Z==Z=$=j==x==x=N(=Ә=:=&p=(=A!=H==#==G1@=P= b=`== =q(={=.(=RH==0==1x=/s=Zp=P==$=[p=>:>@>*g>x>DH>>DL@>g>>/>0>2P>6>{ >>D`>>Ep>T >}>K>=>\(>>s p>`> >}O>>G> )x> ]b> > p> `@> p> N> (A> &> $H> > 4 > -vx> 6H> z> ۈ> ^0> y`> 4S>Qh> >`>4 >>ư>tw>B>0>>@>2@>ϟ@>> >h>>>%\>>*@>,`>F(>߂>y>D>=o8=- ==T=8=!N8=H=B=@==k7=Z=y=؀===`=I==%K=H=Ap==q=_=rP=/`=H=:x=C\x=Ri==Z:X=(=zl0=h==j=Ը=l=@=0==#Ơ="==B=:=Y;H=R`=>>>x>H>Ib>>>L(>Q>>#(>|>> >k>\>X>. >=ƀ>> P>!!@>0P> >a>0>0$>h>h> ,> > > Vn> > 薨> > =.> p> P> > 0> > > 9> \> > k-P> ]> O?H> h> `> > IP> Q> @> > W(>_>w>>)`>1)p>>U h>>dh>%>@>e>^X>F>mȀ>硨>~z>'8>>G>>W+>HX=~j=$= 5 =QZX=Ә=.=D(=VP=X=-2== p==X=@p=F=QG=(=-==@=˹P=]_=E=>=2=gF==x=j=x=\@==Fv==]p=8=r=8==_x==Pm=5=Ō=5=J(=>>_>T8>x>[8>w00>>7h>o0>Z>;>>t> U >>³>>>,>{H>"^>0>z>6>h>q> I> X> P> > > > @> > NY> > p~ > 8> ?> 2> > >x> /> ce8> q> &h> > ,> G> 8> OǨ> n`> > 8> 2> > W> p > FH> > > N`>ې>(>#x>7`>(>]>c >zh>@>X>>&6>X>'\p>Y>x(>X>ؘ>*[=+x=-Ԩ====dY= y==U=Eh==T(=[==ʌp=嘀=6X==/H=q=_X=="ih=1=|= =<=eP==ٰ==\l==$=۳=]=p=c==rx=X=%=H=ѳ=Tɀ=^=>_>(>*>J(>*>p>nX>>L>>>@>>M`>8>5H>>>p>D.8>> >0> H> }> g0> x> `̰> > ?> >  > r`> x>>L0>}(>4>:>Vy8> >p>踰>^>չ@>sH>>j>`>2>> > fx> &> > > qs> .:(> ^> H> ;'h> ҢP> > P> D>iը>>@>s`>>=>Ġ>H>x>Hi>`>Y> E>> s0>L>S1p>1==,P==N=x =Kp=]=h=*=:= ߰=Քx=)8=h=p=)ۀ= =)3h=4=6=H=IVX==L`==,=`=Z0=Q== H== p=e=S===H=P==Y=/h=>BMP>1>}H>w >-(> ~>l>*>)>@>">Z>f>pp>ۋ8>3>>>b3> 1h>)>?> Oh> > => n> a> > i> > S> Я8>=>>7>1> `>^>">f>>e>z>>bc>y0>-8>u_X>Y>j8>Q0>8>.I>P>>>dp>I>th> T> L> r0> YU> D> > 0> h> )> X>h>>>>\>܏@>$>>.o>>2 >>*>إ >dO@>߳P>8>*=s= ===_`===y=oA=x== !=>h=C=ߙ=`=b=P=ʴ =*_ ==w (=K=ND@=)=i8=u=(=AX=P===B8=@1=:H=ғ==w@`=l=%=,yp=>8>vh> >U>i`>R9>>Φ>t8>ҟP>{>#(>>\X>>8>k>Ԩ`> IP> f<> x> 2P> `> \> ^H> fh> o%> Ǚ> x> > >$>O>>B`>`c8>^ >Yx>gx>Rj>CP>wx>W >>) >8>0>H>z>n>c>O > Lp>28> >@>\H>= >]>8>>{ɀ>ڽ>r> > x> \> 7> > X> @>DB>h>*>e8>$>W]>>eH>M@>[p>.>M°>h>>>r>)=L=/=x`=ֲ= ==+=V=&=(=ʘ=7=^N=d=&=M6=x=nu=`=b@==8=Ί=RX==0==Ȗ=Y=ƕ ==$==X8=SP=P=T> H>38>a>h>(>B>xp>j>>@>>>>"/(>S>t >8>tP>˥X> > > e> Ԥ> p> ꘈ> > > > > O>KH> X>>>~*>>h>W>r~>>1>n >{>T`>8>(>>(>>ѩ> >?h>NhH>/(>Q΀>>P>&>m0>b>#>>$>|>Z>>p>CGp> }h> d(> > (@> > S0>>@>Wx>>L0>n>Jx>X>>>#@>#>>!P>‹>\x>>k4p>#`=2==-=w>=a=i==B==l=_@=&(h=mk=&=;==0==c`==̤==,==H====ޘ=(==d= =Ŵ=0(=xP>mh>>Ψ>@>@>.(>>h@>ʍ>(>;ˈ>bM>>p >88> '@> - > b> P> z> > V> p> 8?> Ĉ> >Jp>y8>f>: >Os>>>2Ř>p>E>b^>x>T>0>0>k0>X>@>@>> >>>!8>((>H>>>y;>Vh>F>H>%`>>(>5v>>>K,`> >cxx>>e`> > (> [3> px> > F>>>.>"s>#>᭸>:F> wp>7b>L>c@>h>T2>V>U7@>M>)>,H==&̨=X=(=mh=>p=="=M=x=SV(=&=w4=CH= p=H=)k=~=Y=}8=h=x8=3h=?=-=.L=Z=~=P=cH=zpP=T =9 =xgh>!>8@>?>>8P>K>8>?>">>q8> `>:>ޘ>#>`> L0> s> 8> > (> S> P>-(`>>K@>b>,>#r(> > > (>>+%>c@>>>=>د`> >pC>>`>p>Dh>bgH>YH>>e`>{>H>[,>:>>Zx> >}>>W(>>>W>b>k>>>h>N`>>,8>`>]b> Ԡ> ň>  > $X> zX> 6H>>@P>y`>>{>p> >,(>>>>I>/>h>o>>6>I0=`=A=?=p=#H=Z=v(=Ē=p=X= a=U=K==[`= P=2=b=0=R=_=8=P=P==}=1$=/=g=`==n`>,>Y~> 0>\>p>I`> >>>>>>>:>^> %> R> BZ> > > `>>i>Yn>X>4 P>>z>Kx>1p>ɀ>>W;>>7,`>>O>>)> >O>g>>/h>u>P>m >Bx> V>*>> b>&r>Hx>1>(>>@=>q(>>>>>X>(>8X>z>38>>ʀ>~>>og> >Z>3`> 7'> W(> OX> )> K0> ;>~P>P>SqP>H`>gq0>E>>5tX>g>>| >/?X>l>:>Z>SK=O0=H=Ո==h=qT=X=e=p=.=='==S7=RP=I==mP=k=o=X=dX=r0=. ==d5==q=-S=?==>`>->(>>X>(`>DX>)>_>p>X0>>0>:&>֌x>> yh> > > ʣ> >H`>KUX>@>D>¿H>>kŸ> @>4xp>c>n>#>W(>>~0>A@>ZT>zp>/#X>>s>%h>X>7>+>^`>>x>tp>΅>f>>>lp>cL>C3X> /p>>H>`>O >)NP>>0>Nd>>zP> >H>wĨ>X(>Uu> >>%>MP>ZX> ϱ`> ƀ> > N> d0> 2X>p>O.>>m>>q>a>]w>9>\6>̯>/>>W>X>lH@==gx=W(=X(=CG8=|:=z0=t=I=3=a=>=M= =:=8=S=-@==]X==O4`=شP==f===?=2=k>$ >V>RV>j0>y(>7|>>|>>)>Vq>>]> p>xm> _h> 8 @> U > HX>ʥ>-9>q>\(>>I>>R>j?p>ΐ>E0>@>8>>4d>Lh>X>f(P>h>^D>P>>}> >t~>c>g>h>>p> >XP>p>ؚ>yѐ>_`>JeP>*P>9s>+>n(>u8> >l9>)@>T >>@>L8> > >>L>"K0>> KH>|>>j>> &!> @0> ~> X> VX> UD>`>>=(>Q`>,>>|X>|>Rs>E>SӠ>H>g>#(>8=ٺ=^==@=j=$@=}x=zP=|=/0=Y=Ȑ=V==^=F=x={=ƀ=Cӈ=rE0=E=ViH==+`=Y=rP>z(>. >ɴ>Ml>P>R>9`>׶0>l(>'>>`>?(>~`> 5> ]P> @=x> > k|>d>i`X>>_}>菐> P>2@>K(>_>i>>>>:P>>@x>S>>5>t(>i>ޘ>0>>>>@>x>K^>D>8>>0>>f>ԕ>a0>^P>>v>lUh>j8>9`>R>^>/bH>>(>0>N۸>\>->H>t>_>!>{j>"p>X>>B#>op>^> S> ^> > /0> J(8> >W>T>]M@>h>h>.>rj>b>b>>Z}x>>mX>ih>o|=DX==@=8=_==5A=~`=޳(=== =̖=\8=8=P=˂===~׈=cV=0H=h=rp=6=e>= >h>,oP>@> @>8>j(>>ϲ>r>*`> >8>qz> > v> > *(> x> [>A>EIX>F>0> >S>(>߀>%@>i>p>gV>^>t>]>`>[F>`>p >^>2Z>T>ظ>@>Tx>yh>>7 >8>]>9>{"8>B >5`>zp>>g>`>.`>>>1b>X>!h> `>/>n>'>|>׈P>:p>r0P>>h><>H> >]>T>m>M>>Ͱ> 0> 1l> 2> G(> H> v>>>k>`>>M!8>;>X>@>/h>>>Yt> (X>>#D=~=ɛ8=r =p==D=E=H=&=:F=r=@=4=8=y==Ѩ=U=i=`=R=>C`>> > > x>>->꫘>а>3P>a0>>|>VD> /> 2> > > zh> i >>a@>a>> X>.>>p>`d>(\>z>`>X>¨`># > >>^>>>h>P> >q>>> > M> /> X>!> >!>!aX>!3h>! >!>!h> >!> > h> 6>x>斨>H>g>I->2=>o`>`>?>>K>;g>dV><>ݘ>8>>>>Ux>>@>p>AX>{> 2oh> V> R> vH> x>+`>)`>6n(>>P>Fp>9>8>~TP>ܩX>{`>\p>X>a@>}=8==={x=P=D=8=\=P==u8=Q=q ===(==Xx=@>.H>YA>9> h>h>((>>`>VH> x>^>˸>gMH>C@>]> >Y@>M> F{> x> `> > `> j`>a>H>CpX>H> >>q8>4>.˸>>h>P(>>l>>>ƬH>ɟ>X@>>8>F>X> $> s@> X0>!7J>!]>!p>"V>"qx>"Ø>"Y`>"aH>"̈>"Tp>"U>"߽>"8>"Ԧ>">"JA>">!t>!8> > >P>>((>>߅>'X>"Cp>H >>~p>H>x> >>@>->>> >>> > ڰ> Z8> s`> H> >U>'H>>0 >s>PP>@> >0>KZ>>>Ʊ>Y8X=ˌ=1!x={P=i =`=`=0|(=3`=j==Xh==J=c0=6OX=z(>>4>>h>N>>B> ʸ>>P>h>)S>6>>>@s>Ph> > Ox> :> >}(> ސ>>P> (>*&>v>O/p>(>Ͱ>ѳ>Ue>J> >i@>]>p>HK(>詘>>>F>P>D0> K>!?`>!>"x>">"0>#S>#7>#Kp>$ >$Y`>$u@>$S>$>$>$x>$>$>$>$x3>$ p>#>">"s>!߻>!@i> }p> 4>!>㱸>>0>`>=> h>>. >`H>>>ݵ>U0>>> uX>p>8>6> -x> V> > `> \`> E>q`>J>>>o>@>Cx>~h>>R@>>3Z>J>H{=0=<==.r=v==א=3e=Qe=O=X=؀=c=c>>>>(>u5p>x>!p>>S>8>5O@>; >C~>s0>t>@>p>0> ,z> @ > > 5>8>H>1 ><>I>%@>px>>h> >?>S@>@>>@>q>5`>n>P>`>k> X> p>!ƨ>!>">#%N>#y>$,^@>$@>%v>%>%k>&8p>&m>&cB>&q>' F>'i>'!>'%T >':>&>&bp>%>%/>$D0>#ň >#P>">"7>!_> W> #>0> H>h>>{@> >>:>,>Tx>>>ZpH>9>^>s`>x>*!>> > ư> o> ΰ> F> w=>f>u>5h> >WP>}p>$p>`j>> >>=>\>PX>=h=Oh=: =a== = 4 == f(=`=>h>w>>b>>08>>}> >bm>>ޚ>w> h>Lt>D0>7h>F@> ;> ;P> 0> F>3>`>>p>>hN>*$(>x>>E>P>C0>k>Ѱ>6>]8>>(>">̢h>ѵ> u>!"l>"::0>"*H>#!2>#r>$c>%p>%H>&g>&>'K>'`>(>(V>) f>)e}P>)ʌ>)>*`>*Hǘ>*F>)p>)l(>(>'4>';Z>&aƠ>%>$c>$K>#x>"h>">!?q> p>ѹ>>X>8>:u>L>h>)>8>h> >>Q@>0>Ę>p>a0>p>~>ۭH> Vh> ͜8> &> > r> "Wp>58>P>ӠX>>L>|̀>(>S0>>%@>8>%>p>[9X=L=sx=ٸ=,b=C== =*`={=`8=X>fn@>>_P>ȹh>.Ah>&>S>>>,c>~>oX>i>t>ŀ>x> > ~A> 58> X> >S>A>ʹ>kdp>#>Z>|>>>.q>\>>>p>R>Kd>>">T`> jX>!L(>!C>">#>$"0>%P>%X>&Ax>&M>'8>(>)>*Yo>*@>+>+!>,J>,>->->-ĸ>->-.>,ѿ>,&(>+~>*>)O>(>'_>&옘>&->%5"H>$MH>#kx>">!>!*> SS`>KYp>'@>(>u|>w`>T`>L>>MP>>>@#>J>{>mp> `>\>>>z> > x> > > > >>p >">X>:>@(>>:> >9>@>-^>>O=Q=j(===6===Th=˂=(>>h> p>h> > >M@>Ҁ>q>>ޱ>Sa>q`>>[5>Ԗ>qh>w> uX> W> `ـ> @.> ~X> \>#X>>8 >@>>% >(>J`>>o>J>>#-8>1l`>>-@> >H>!B>!Wu@>">#b>$8x>%(>&>&>'@>(0>*>+">,>-MP>-p>.>/ n>0>0TD(>0|A(>0y>1>/P>1Q8>1 >0X>0% >/K`>.喰>-}(>,4 >+f>*9>),>(.0>'$>%0>$(>$*>#(>"G>!{Ÿ> ">0>S>`>Ih>Ϣ>E>>>_ >K@>~>>qX>>|?>gX>,>]> ٘> `> u> > >d0>VC@>V>{n>P0>s>Kg>WX>*>F0>3>e>>p>E=l =ƣ={0= >==I=ɸP=˒>A>>`)@>{P>R`>>H>Q> (>C>"%>z>ʰ>> >5H> > > p> ?> :@8>>N>~x>g|>0H>p>l>x>>S(>Q(>Pv>mO>;>Bx>h>(>> >"/>#p>#c>% 1X>%Έ8>'`O >(p>)C>*Zx>+I>-M>.Y>0>0¢H>1;X>1>2N?X>3>3x>3>469>4>4X>4GDh>3xh>3.(>2=>1eD>0">09>.>-X>+0>*a(>) >'@x>&,>%1H>$ƫX>#0>"`>"X>!)Wp> 1>8> >4>b>˜>>q>[>)<>R>ɘ>8> >\L>H>I>> > > > ͐> ĩ0>g>,>-%`>Ht@>> $>Zް>f> >>>u8> >+>$6=x=\===/=| >D>>?@>>>>Ùp>Y> 1>G8>>hX>Ҥ>@`> >8>> H~8> ~(> ,P> .> ?>\>u>>V>$> ->>H>h>(>>d>b>كP>8>>^_>z > rH>!@X>"FH>$>q0>%ݠ>&CP>'cH>)>*Q-p>,8>._W>/Ҡ>04X>1&8>2`>3s7>4xf>5Hd8>6qf>7C>8hD@>8<>8v>9W>9>9b>8ˀ>7 pX>51>4:>3pJ>2~t>1>0|(>/4p>-:>+ >*#>(h>'>& >%l >$qE>#[Vx>"YҸ>!.> >X>,>g>.P>X@>k>w\>o`>h`(>j>p>(> v>`v>h>p>p> x> A> > > k@>h>@> @>(sp>u >S>>>>H>> >=+H=%= =J=0=@>i[>>uh>x>>F>hx>>%# > ܨ>侈>@>@,8>i> v0> c> > .p> P> X>?>YH>b@>Ga>Z>楀>^h>ď>p(>>>> >0>>`>> l> Ϯ>!uŸ>"J>#A>$H>&A>(>*T>,6>->/_>1 %>2 H>3>5fH>67>7X>9F8>;X><>=(>@>B>B>B"h>AFh>@d>=k(>;|0>:>8~>76p>5p>4'} >2N>1I >0xx>.E>,0>*`>)^P>(`>'O0>%>$aP>#`X>"(>!@`> >K(>;(>h>!@> >Fp>n`>V|>>_ >j>>H>I>>>?> 4d> %h> G`> HH> |@>W>WH>> (>">>>SG>Ũ>59>kx>>9>\5@=Q== p=t>(>u@>FX>V>.>і>ew>>X>8>~>?>M>^p> 8@> lx> I > t> {> !0>0>]3>j4>>c>>P>C>>->>R>,!>5@>K;>`>X> `@>!(>!kP>">#ih>$@>%P>'[>)>.Ox>/w7P>00>1>3X>5:>7#Ј>9~>>?}>B)>B&>F>Iz>K>J0>J!>JA>IH>IG>Dp>A>@>>Y>;P>8l`>6¼P>4'Ԁ>2@>11O>/X>->+ >*>(0>',>&:̀>%,R>#$H>"B>!mp> >>^1>h>hP>>Ũ>_E>I, >Zh>hP>yp>Vp>>:W>pF@>Mh>\> <`> yh> ! @> >>Sh>>># >.+p>{`> >G>>0>v>P>׺8>B==x>E@>E>J8>\>(>Mp>A>!0>d>K>>(>mX>> h> > .> Ah> W> <>0>l>]n>C@>;@>4>kC0>>>X>>xX>>g@>>>z> y>!aB>"=>"n>$ `>$A`>%>'H>(Ϡ>,k€>/Tp>1H>2>46>6b>9(>=>B:I>C1V>J>K٪>N>T>X˘>Z8 >[j>[7>[$zh>[Ap>Z>X>T>MH>I>H>Bh>@>;>8>6CP>3h>2&3>0{>.z>,K@>*>)q>(Je>&YX>%((>#>"H>! > Ш>>k>>(> X>/>+(>GW>&>+>[p>>>>dx>;>0> L> > > >X>X>(/>3>E>8>_`>>8 >h >P>>LX>`>"=Rp>P{(>'>Nr>Ҁ>6>x>]T > >Q>T >u >Ia>" > > GV0> ?`> k> g>CИ>*>t>->6`>>8>NL>px>bI>V>(@>؏>B>9>@>0> v> ɯ>!X>">l(>#z>$y>%{`>&`>'m>(>+>- >/E>1Wx>4 @>8F68>;_>B>D#>L>PF1>XT>[>^`4>e;p>o.>tU>w>yR>y>w)>t$X>n>e+>]Bx>ZUe>W->O>I|(>C>As>:Ԧ8>7vF>40>3E>1e>/vX>-]>+a >* >(u`>&>%N>#D>"->!> >u>!>k > @p>t>L> x> >+> >>w>v>>S>9R> > > J> x> |H>>;> °>:V>X>>/>¸>Q(>|H>i> >>P=신>$> >ِ>h>>,h>> >v->>}H>k>0> X> 3> `> ->p8>Z@>X60>ƀ>~>X>Ȁ>z>A\X>!8>pP>Ű> >6X>v>%#(>>͈> ">!h>"%>#j>$R`>%ê8>'Cx>'g>)䴠>,= >.>.>>1>3"h>7z+>@HC>BG%>K x>QI`>\>Y>i7P>ycz>y>i P>O8>? >}g>|0>{>|f>~6I>\>2`>@>xxp>j0>\u >Yzqp>Q>I%>Ab>?c>9ԕ>6YH>3>1>0>->+`>*X>(6>&>%k88>$I>">!g> ᮈ>~>0h>=40>< >>9ް>>I>6>}X>x>L>X>>d>0> H> Y`> o-`> `'x> %> p>C>(>F>Xi>>$w0>0>>jM>>k>>\+X>|>5I>>Wp>X>x>r>wh>>X>gp>> h> fH> > =<> t8>0 (>o>4>x>P>>h>_-X>*V>S>^>,>>>~>x>> =>!X>!>"B>#>%%\>&Q>'ĺ>)2X>*b`>-\Cp>.=>/>0ɪ>2p>5/>< 9>Dl!`>N >Z?>[aK>mD>~>{A>~x>xR0>r>n$+>i>fP>d>d0>e>gӰ>kx>q*`>uK>{>`>`C>q@>],(>YI0>KZ>G K>@p>:~>6ذ>4>2>0E8>. >,U>*y>(e8>&P>%kh>$>"Ʌ>!Ƹ> >]MX> >d>z@>96>>>>X>>h>H>D>>>H> 4$H> > `> > >) >H>> >_>p>>jH> >Y>.>9 >n>ٕ>U>>w >(>>l8>->s>~>Ҹ>`> ^> x> 5> u>IZ>@|>>=[> >@>`>`>4>B>Up>dl>>Tx@>>P> M$>!h>!n >#$>$k5>%>'>(hX>*2>+=>.=>/>0~>1>3>6(0><_>C>P>VsX>cʽ>twh>zyx>w>qx>io>b>[m>V>R(>PL>OՇ>Ob>P>QF>Ts<>XQ>`>fT>p5>w>w8>~1>j܈0>Zb0>RjX>H](>A">; (>6Ր>4V>2 >0L>-P>,>*P>(c>&>%7t>#P>"(>!h#> ]>`>,>7>0P>>:>t>DH>_>w>>s>+>g>d>> Ȱ> > P> \>  > 8>'0>[/ >l>>=x>`K>d8>(>j>%E>m > j>k>>U%@>>Vװ>4p>>>'p>% >H>aH> x0> }> `> O>8> >8>>f>f&>1>>`>I`>|8>J>z>d-H>> > h>"q>#Jh>$f>%Ҹ>'A>(5@>*X>,qx>/;4>0IK>1X>2@>4|(>7BP>>]* >E_x>J#(>U8+>d5.@>mgP>n}u>i x>b%f>Ya0>R*>M22`>G>C>Ax>@'>>@>>h>?VD>@>Br>Egd>J=>Q_h>X>bة(>nO >xh>->>v9>] >V6h>H0>A7>;R>71 >4< >1>0GEx>.M@>,z>)$>(B>&>$X>#>"Z3P>!>> 8>>l>8>/`>w>#>8(>. (>h>+R>c>(>>/>h> H> X> w9> @> LH>>>i> >n@>0>>J>0`>x>X8>;IX>(>p>3h>+P>P>Hp>>"0>>>Vސ> C`> l (> > P>1(>I>>>͘0>>>[>>.>>+ >.>>> ox>!>#>$7.8>%FX>'c>) >*>-U>0>14>2獘>4p>7( x>9P>?܃`>EA>O 8>Rux>W"h>[# >Z)X>V?>Q>Ki>E`>AW><X>8d>5b0>3X>2>2@p>1`>2UP>3K>4Wh>75XX>;HP>@T>FXb>O,>XH(>eC>>sˆ>~(X>{ձ>a>X!Ox>Hg>A` >;bp>6>4m>1>0(>.<>,OE>)>'>&x>$Q>#Vp>"4>! > (@> `>_>(>j>?H>>>_>ʨ>h>+/>QH>:(>N>q}> q$> 3> )nH> #> X>J>L>Ɛ>(>4>A> >^>x>Vo>>>O>bx>tX> b>j>>>A>۠>>3> (> w > m> M>]d>P>xh>>V>6>x>-> >`(>0> >>`> l> ~&>!/>"Έ>$r>%#>'.>(>*>-ép>0'>17>3>6>=B>=B,>BF>I>Mw>Qˆ>H T>C>B"@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`>@>GDˠ>R+@>`>o{T>{``>}>X>bg(>W4>HQ0>A ۘ>:o>6sBX>3[#>1>/^>.b>+jW`>)rp>'>%>$5y>">!> >h+>z >>S+h>>⭨>>$>m>Ø>>>x> >]0>i;p>:H> `> )@> > >>0>z|>Y(>s@h>L>>~>P>6 >P>X>>>"Z(>>X>/>~x> >q@>u> 8> 4X> `> > 8>^>L>o>(>s>>>M>ۈ>ψ>=9>>WH>(> >!0X>"W>#~`>% >&~p>(L>*n]H>-0J0>0@>1>3>6H>:>@#@>DB>Kθ>R5>Xs >Sh>@!H>2>/Հ@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`>3d>:+*>C 8>NT>\y>lب>{Jx>}.>`_>UH>H5>@0>9@>5t>2P>1i(>/>->*>(>' >%NX>#>"(>!r> P >l>&>]>'>\xX>ATp>(Ǡ>,>/t8>%xP>Y@>u>o>>FN > v> f@P> Ex> ~2h> >d >>`>@P>>eh>SP> >|vh>3>G@> >>bI8> 0>Ǣ`>r>'8>5>n>G > > x> Y> p>>> >j>Fh>"/p> s>!>>(h>>a>xo>>|0> qSp>!H>"(>$4>%,>'>)>,lh>/>1bx>3>6o>:7p>@ `>Ds8>NIH>WD)>X>e >UE>>,>,<>#R@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`>+%Հ>0>7>A >L>[Zfp>m@>|)>zg(>Z`>PČ>E>=>8B*>4r>29>0uh>0&8>,H>*T>(>&k0>$$x>#f9>"L>!> @>R>dH>`>F>>җ0>H>>P>>_>@>M>t8>8> > 0 > x> >ԟ>>KH>\>'> >]H>x>QH>Hx>ni> > ><֐>4`>>]]h>`X>8> > $> T> @H> s=p>(h>:>&>>{H>J`>J>~>rv>>h>>^ >\>0> M>">#n8>%x>&8>(p>+D >->0>2}>5c>9>>>C>J>Sx>``>k+H>k lX>T/ ><' >*> |@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`>$x>(>/ >53>@x6>MX>]{,>p5l>~`>rZ|>Y?>I>AH>7>4I>2N>0>/">,>){>'>&>$yM>#&3>!.> >>-(>Oj>w>,}>>3>L0> C>8>0>W@>yl>>>M(> > E9P> (xp> @> R>h>>֔>`0>o>>->pr >6`>k>҈>/>">%`>L!>8@>>> > ڨ> > xH> >oF>BCx>Iֈ>0>P>^>$>b`>>H2>4H>uw>)@>Ρ> d8>!\H>">$4`>%>'GH>)l>,M>/:(>1h>x>3 >7`>;*>@n>G h>Rk>bGR>d>wP>iRH>Q >:S>)>!@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`>5Xy>A*>P>a>t~>H>->d>W'f>I$H>@>:0>6H<>3e>1>0 >-ѽ>*>(>' >%#V(>"yP>!!D > |>>0>X>Q>>0>>uC>P>p>x>>g>H>Wg > x> 68> > }>Q>/>R>[U>X>p>(>P>&t0>[x>G>ܾ>p>S>(L>>x>`> P> T> 6P> Bh>(>i>H8>Y>qÀ>x>>5k>R%X>PuH>s>(C>>Up>XC> g`>"I>#LQX>$=>&-`>(g>*(>-|(>0N`>2T`>5>8Qx>> rP>C7{x>Ja؈>SY8>ddP>xP>ym>do>L>8Xh>*r> ^x@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`>0Hh>75Z`>Cü>SOH>g`>zP>zE>Zn>LPE`>B>=>8[ >4>2`>1k0>/Kc>,h>*5>'g>&P>$l>#E>!> 9P>@>4>>h> >_>>>(> >>B>lb>>t`>> `> #9> Y8> #%> KH>Hp>|lX>h>P(>$X>1>'>?>p>IH>P>`>'>iP>E>,U> P> =8> u> K> ><8>d>g>>">">jh>pd>>X@>7R(>>c>2>|p>!M۠>">#>%>'QQ@>))[ >+H>.>0h>3MK>6j>:(p>@;>Ehh>Qq>aBa|>l'>v>t >]>Gsx>6x >) > ܈@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`>)0>1>;@>I>[>qx>>g0>W>IdhH>@h>:>6~P>3x>28>0H>-d(>+g>( >&>%+`>#l>"u>!Y> >Ix>r8>>P|>D(>H>r>O`>v9>[H>(>%>1;x>L >> 0> Έ> 7> 6> >؜>i>>p>P>)>-`>>x>(> >~h>b`>x>>> > KA0> x> r> :p>V݈>E@>>">0>>ЋP>8> v>@@>2>[0>>h> j->!5>"Ϭ>$U>%`>'cP>* 3>,v>/M>1>4Ip>7;x>A>H#>RR>b>>~>m_B>U@>C>4p>(ܨ>!@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`>% >,q>5 #@>Ad3>QH>f/H>z*İ>x"x>ZO>K&h>Cg>=>8>5kh>3 >1>. >,\>)ɤ>' >%ܼ>$C0>"b(>!> qP>ë >~>X`>版>f >>Ʋ>>>jp>|`>\X>u>h>KS> '> Ӄ> > P>0>p>@x>m>t>M>m,>șH>M@>8>P>> ܠ>ܨ>Y>C> > +> M`> $>^> >x>|P>M>>U>8 >Ҡ>6F>Y>X>!h> >I>),> B>" p>#U">$`>&h`>(K>*>-o<>0H>2P>5=`>8>>">Cw>J>WS&0>eU>>{PP>d@8>PD@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`>H >\>s#v>'o>a&>R >E>@d>:8>6>4 h>2fc>0]7h>-)>* >(>&>%n>#rp>"> G(>Ȑ>>_ >]>{>Q>)@>g>Ӱ>/&>RkX>iR(>X>>> m > i> L> {X> _>w>>Ҙ>p>5>z8>>aπ>>(>`7 >$t0>>"@>ټ> ?[0> U8> G> iS>v >fL>>ͣ>(>~|p>>\I>>> N>>j(>#(> %B<>!>"U>#Ԋ>%ch>'OI>)\j>+>.kӀ>1>3g`>6>:h>@3>E#>Q>`L>r>qH>t@>^ }>Jg@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`>B >Tf(>kG>~<>n`>Yܰ>J}m>A>;'>7(E>4>2e>0kH>.b^x>+n>)B>'1s>%C>#ת>"ff>!>> !=T>y>K*>Z>9p>^p>>{l8>V>rڠ>>Ѩ>Q>&> G> ɈH> Ȉ> uTP> {> g>>:>ְ><>Yoh>@>3i>8>J>Q>~@>R>k>dX> TVx> VP> > H>.p>u!>Y(>%X>6(>Q>qX>\h>쌰>z>8>_>;Y >?>> ;>!">#8H>$~x>&B`>(iC >*>-}>08>2{>46>8w><]>A>H>R:>a>|3>u+>n8>W2@>E@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`>>x>O1h>d u>y>x>[s>L>C>=>8>5=>3#>1^X>.>+?>)>'bQ>%>$3->">!v> =|>>>դ> @> >C>P>`>v@>(>>"H><>z> > ݟ> > H> >>> ep>T3>> H>o\ > H>t|>K>>>m >> #(> > 8> )~>x>:>i>j0>]ĸ>0>;(>MH>l> >>yC> g`>>> >"D>#i(>%>&(>(@>+̀>.Ԩ>0O>30>5x>8>=0>Bk>H)>Q>an >"@>nH>gZ@>S$>C>@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`>9>I>_5p>uA7p>q>\>M}D>CGP>> >9/>5;@>3Z{>1p>/6>,>)h>' >%(>#>"@>!m> d>΀>>"">x>^'>8X>>U>>>E>e>{x>t͸>H> > [> H> #>W>>x>d*>> (>T`>A4>(>>[8>3Ux>>> h> "> t> >[>>@>=>~>Ҝ`>(> >8`>̀>?>"H> X>W>> 8Q>!\h>">$`>%(>'x>)޸>,o>/p8>1WB>3>6,u>9f0h>>:>C >I$R>S>bܐ>R>zu>c0>PҬ>Ae@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`>-> b>>w >҅>҅>d>w@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`>7rM>F >Y>iG0=j>`>Q>D>@#eD>:>6>3f`>1q>/th>,>*A >'8>%N>$jh>">!H0> P>(>>N >wh>!U0>D>>p>A>@>y>vX>R>q|X>IH> %TP> > 9> p>>}>9>L`>(>z>a(>e8>>J>>W>"> ,> !> %> Sr> >'>5>@>>͌(> L > p>!>o:>>>u>v>T> >!r>#>$>&g>(Gs>*>-*>0 >1[p>4.@>6s >: >>GP>Cr>Jx>VX_>e>ȑ>w>ab>M>@%L@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`> b> b>w >w >҅>҅>d>d@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`>5;>C6>V:H>oα>Ax>X>T>G60>@>; >6>3>1~>0>,(>*k>'H>&(>$r>">!O> v^(>>_>mj > h>y>%\H>́ >I>I>>3>;>o{>>ZP> $:P> "tX> u> Ÿ> ">J>>>eؘ>̘>+>>aV>>2>t>p>G#@> Kgh> Q\> u> (> ԭ>>RF>h(>]x>@>Z@>ž>>J>>T`>">QI0>ؐ> >!ԏ`>#=z>$Ɉ>&b68>(@>*'>-zx>0b.>2>4`>7"9>:)x>?n>C{:8>J>Xk>h8> >v*p>`?X>L^x>?@@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`>`>`>̠>`>@>@>@>>@>@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`>4(>Bu`>U>m@>x>g>V0>Iv>Azx>7(>44L(>1O>0I>-I`>*#>( H>&GP>$>#$>!Hx> :H>|>_>_x>'>nX>5>;>h>{>~>p>g>Yx>@>~^ > m`> -߰> D> > '>M{>_p>'H>>F(>p>V0>Bs>8>,>h>_w> ;а> +@> ,> )0> p>_>D>!P>.>6>>>f>X>>mp>Y@>>qX> (>!>#x>$. >&Y>(e>*<0>-C"(>0:>2>4G>7p>:T38>>:@>CyH>K>YXP>i4T>(>u >_%P>L:`>?@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`>B>B>B>`>@>@>@>>@>@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`>5h>BM>To>l`>>icр>WZ>J2h>A>=N9`>8t>5">28>0>->*h>(>&c@>$!>#A/>!'H>  >I>x>>>}>dQ>h>>>Ө>>_W>>`>>q0> Dt> j> > > G@>H>5>0>;>%Dp>{7(>>G.h>& >Q>s`>i> 1> ;0> i> `> x>|>2H>>)>݈>>(>ѓX> >s>/8>ya>8 x> > ]>!h>"*>$>&>( @>*0>,>0Q>1H>38>68>9߽>>h>CE>K>XX>hE>>>vr9>`y$,>M?@>?p@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`>0>->B>B>f>f>@>@@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`>5wh>C:>Um>n >SwX>h'>W>J=>D2>=>9>5X>2s>1;>.F0>+|>)D0>&Lj>%X>#%>"WH> >n>'`>N>5>8>7>sp>8>mH>A>S>[>p>>_,@> D> 8[`> . > M> (>L7>V>/x>焈>7y>">I0>bx>`>ɿ >>v> ~h> .> > \> i>lX>\ >8>'>LP>">X>2>>J> x>J.>*{>> >!h>">$Eb>&h>'͊>).@>,0>/>1@ >3[h>5>9p>>P>Bp>J >Vt>eL>ɩ>x_8>aƘ>Nx>A&@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`>->->>B>f>f>@>@@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`>6o>DK>X(>pr >ܘ>f.>V>J^>C ">>(b8>9\p>5>3/8>1t_0>/(v>,!>)6x>'8>%^>$^>"xw>!.2>ńH>i`>>`q>J>xX>9P> p>x>->2X>dj>`>܏>> O0> > (> 8>  >G>ON>Ҿ(>>07>qp>"P>7߸>P>H>>> `> p> xb> eX> `>7 >.>V8>b>D(>>!>NP>> }>jȈ>>>A> 4T>!^Z>"`>$%jP>%1>'>)M>,?p>.k >0>2D>5Gx>8✠>=8>B/-h>H>SYX>b֦>uh>{oP>d`S>Qc>Bt@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`>>>>B>>>f>@@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`>9H@>G8'>[B >r_>gh>bz>Tj!>H>C>?y!>:{>6T>3>1v>/?@>,BD>)@>' >% >$(X>">!jX> M(>G>c>,8>>RP>e>>>)>N?>O+>}P>0>r>k{P> nXx> wH> 9X> 3W> .ʈ>\C>*@>µ>o>'>j>>?> -X> >`x>l@> xo> x > X> PH> 8>G$>Fވ>Ր>#>X>xp@>z>p>y> mH>X>u>ah>0H> 4`>!O>"eS>#R8>%]>'"H>)H>+D>.i>0"@>2 >4>7ڦ`>AC`0>G,>Q^>`v>i>B >h0>Tx>EX@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`>w#@>w#@>>>>>f>@@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`>=JH>L>`9>v0> >`>R3>H>CsX>?>:X>7*Π>4o>2>P>09>-38>*7rP>'@>%->$֐>">!{> F >)>X>J>A>>>_w>RX(>^k>Pb>~q>>|>^> ;> >E8> R `> _8@> HM8>F>>wH>i>Y">E>d8>.bh>*`>\x>XeH>+`> 4> U> A@> =5X> v^>ӻ8> K>P>>Lp>+)>[>> >tF>bH>~8>P>g>;`> Px>!8x>#/>$8>&^Rx>(E0>*>,}H>/_>1`>3Q>6_8>:>?݆>Eߘ>PX>_'>zy~@>/P>oҐ>Yܸ>H(@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`>AZ8>Qdh>eu>{>{֐>^&>QHY>B>@)d>;>7p>4(>2>0>.>+>(k(>&(>$Y>#@>!Ш> ]m>mh>g >h>pO>׈>F>[H>gd>Ap>Y >P>٧>@>ʯ(> `> Rw(> KT`> JLx> ,>D>[x>XP>>%>>Nx>0>Č>>Z`> >`> x> (> jH> >>QE>c>x1(>*> >>>8>Ű> P>#(>}>X>3>1> #<>!G>"u>#l>%">'b`>(Nh>+K>->0>2o>4ɼ>8[>=l>B苨>N(>\H>pWZ>>uH>`c>O]V @W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`>Fb(>Wl>n{0>א>q|>]줨>PP>G>B:>>>:D>7fH>4(>21>0U>.>+,>)/ >&P>%>#>"4> 4p>7c0>i>BH>@x>>X> >o>[.0>z,x>`>5 >x>> Y0> Q> DP> ,@> ((>Y>iP>>يp>>>X>-+>Ʊ>n>PW>2eh>˸>> P> > O> O> >2x>:d>(>x>>fH>[>W(>im>(>1p>=>Q0>P>Cp> a`>!ǫ@>#)g0>%,>&D>'>)GP>+ߠ(>/ހ>1<>3>6|8>:hX>@,0>F->SWH>bV;H>'>}>gX>T`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`>Ml>`̾>u>>X>d:>WrX>K>DLШ>@z`><">9+H>6]>3>2D>0x>..>+>)@H>'v@>%`>#>"w(>!(>)(> @>%Ә>`> >Szp>׏>x>X>>1>x>?8> p> À> aX> d> b> 5P>[0>^>p>Q`>+>>h>>D>?->m(>$>9@>\T> A>  >  x> UP> s8>>Ȁ>8>h>:> >:>m>ͺ>> >fp> >>z> .~>!wZ@>"KH>$#q>%.>&Ҙ>(V>*u>- >07h>1>42>8A>=>D%>M>0>^m`>{Tc>x>r @>]`x@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`>Ua>iX>~.>|O(>^v0>PR>G>B(>> >9Ť>6l>4RP>2>>0>.^>+>)Q>'p>&8h>$>#\Nh>!> >À>#(>>t9H> P>8>zp>:`H>>>>I>ZX>!Xh> 30> 8> p> #> wC8>U_>gH>z>`>>f>>.x>OP>>R@> y>>> p> P> > > P>ZP>Y>>ہX>|8>KTp>x{h>bDP>Mh>0>">vN>j>>-h> W>"P6>#|:>%P1>%K>'>)x>+ p>.@>190>34>7P>:>AN>J"H>Y}&>h78>>{>fp0>UEX>G6x>>En>5>P@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`>0*`>6p>A(>O>`ٶ >tq(>Aʐ>j>[eP>M0>D0>?>:|>73h>4( >2*>0h>.>,I>* X>(&0>&uL0>$q(>#m >"H|>!/H> !X>M>X>kX>>>I>t>"8>X>_>3>&>[>>'>eP> 4> :> x> >mX>> 0>>V->{ >`>o>P>fh>fx> p>>{ > t> u> pH> @>Fh>>X>mTx>TH>3*>x > => C>>`>X>ǘ>\@>2>x> @>!">"̓X>#H>%EV0>'@>)>+$gh>. >0X>2O>5\->95]P>?>>D\0>Nr>^sU>}f>V>rh>`G>Q!H>DCx>5t>>0>I >X>>ln>>}7(>]>OX>EVn >@}>;Y>7R>5p>2p>1*>/_>>,ip>*`>(ڃ>'EX>%>>#ʘ>"q(>!cр> PX>>7V>P@> l>h>jz>.X>*RP>;>j>B>>e>[`>KK > @> ް> > 5> S>A>>>p>2> >B>ٕ>K>3>Z>YX>->>2> X> > > \x>>>V> 4@>b@>խ(>(>z> >`>@>_y>>~ֈ>Df> <>!>"G+>#80>$L>&AX>'j`>)D>,o>/>1x>3έ>6><s>B\>K>Y9>gc>>L >l`X>Z#7h>M>Bݸ@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`>=R>F>T[>eԍ >xNE>h>g(>YP>K4>>B0><D >8}>5+.>2p>0P>.0>,/>*_@>(Y@>&@>%Z)`>#>"H>!> h>mzp>n>bX>/>!H> >>[(>>|>>̈>%X>>x`>Q> sS> > T> j> uI>=(>(> >5s>m >>H>vn>/P>>g'>%t>>Ø>8> ]> P> Z> 5(> >Ԝ>7>b@>_>SX>F`>^P>?(>$ >O>>|E>G|>-F >Ó> `>!Y>"X>#">% >']Ax>)3>+2>.uְ>0>2>5W>9`H>?>DE>Mx>^SX>u`P>U>y@>g?>WX>LqX@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`>EȆ>R}>b>(>t> >uv;>\0>L\>Cc>>AH>9h>56>3RG@>1p`>/>-$Ր>*x>('>&@>%@>$Y@>"p>!Ѭ> > > p>~<>@I>>J>!>)>N>Z>">a>>ԏ>,>A0>\P> |H> > ˃> i(> +>!D >vN>gX>1>2>+>P>]>>,0>"`>">}>2`>7> > J> m> P> C>fkX><>\h>lR>>E@>P>;>>+Z>U`>Z>>PSx>(P> > H>">#h&>$ >&t:>(F# >*>,>/>1>3->6>:{>@>GP>S#>`<>?x>m(>w/>f!T>W>Lh>Cu>=B'>7@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`>2lo>6x>>`>FW1>RWp>`!>q:P>Et>~_>^>Rڌ8>GVR>@4>:>78>4>2 >0+ 0>-u:0>+%ָ>)!m>'>&>$l>#o[>"/> >>0>59>^NX>h>x>}>_>1> >4>s>W>>>r(>s>> > > ")`> !8> >T`>g>h>>:0>V>b>ύ>|*>Ѱ>>DWP>٤>#>2͈><`>͐>tH> P> > nH> (> ʧ >(@>62>>G>>8>vE>.>> >d>児>>>B(>x> >!8>")>$Z>%x8>'(>)>+!>-*>0F(>2>4R>70>= >Bi@>L#>Yr>c>m&X> xH>v>f >Y`>O%>Eٰ>F@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`>:a(>A(>Hz0>S1>a8y>qI>RH>A@>b\>W>J>BO>7Ѡ>5Qh>2>0>.K`>+0>)[^p>'V>&>$>#6H>"p[>!`> e(>">P>>>V> >d>&P>U(>p>\>H>L>1>> P> x> > P> 2> >ň>Z`>>j>@>>G>6>6А>>Gh>v>X>*>X>9p>{>UF8> ɀ> E> ' > DEh> 2>>)>>v`>A>!`> i>"w>;8> >㔰>?x>jP>C>Y > > >!>#8>$X>%(>'H>)x>,V>.ap>0Y>2ԋ>5}>9R>>#>C >MJ@>\>eW>h>I>x >iʴ >]e>RO(>Ji`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`>D>MP>VcRG0>r}>3>>e#C>Z?+h>K4>Bw>={֨>8/>5>3>1'(>/d>,>*sx>(rp>&E>%!#>#͐>"W>!> zY>O>x>IX>>g`>>P> >>`>>>Y>n@>`>> > > > > >> (>=>>8>o@>R>ܱ(>+>>n)>X>p>EZP>'>>l->>n>ch> ((> T> R> [> >N߀>9V0>X>>o>0>>͢>g`>>u8>d(>P >5>{> )W$>!9>"X>#H>%d>&aQ>(F&>*{}>,%>/M>1pL>3G>6$X>:.q >?>C(>Mu^H>]?>d:>|B>`>|O>pդ>c">X}@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`@W`>Sw>\>>hJ(>uz >I>>de>Z>J<>BX>=|>9E8>5_>3~>1(>/>-D>+ >) >';>%ėp>$I>"P>!,> X>y,0>~>FP>>W>FQ@>1N>R>&>c>Gn>f >x>(>;B@>0" >j> GH> `> Z> ?n(> r'>m(>>Q>%lx>W>>h`>b/>x>H>J>x>H>K>>'P>`X>>>}ڨ> J9H> !P> O> F> P>.>>>`>>h;>?H>;>R`>>GP>g8>`( >E>I>L>;(> `>!>"G>#m>%'`>' >((>+3a>-9>0& X>1ϻ>3>6{0>:f >?>Cy >Mf>[e@>amz>{#v>h>>vW >k>b!>Y>SxI>O0>JEX(>Gh>E>E0>DM>Ew>ER>H>K>PqA,>T>\X>e"(>q>>{u> >{bh>`U>Y%8>IĂx>Bh>=A3>9N>6%`>3nU>1`>0 T>-j@>+^>)E>'">%8>$>#N>"*[>!4> F><>>X>^8>9>~>[H>]ظ>dc8>H>0>Fh>;h>XX>">mB> d> q> > TN> ߘ>j8>@>q>S>HH>>W>X>Z>+d0>X>>I`>E8>a,>{>>vS>>( >Y>> > S@> ֯> >>E>=KP>> >X>5 >h>>H>yX>>x>>:@>q>(>> >">#4>$h>%!>'>)r>+`>-g>0rx>25>4>6>:?YIh>C>Mw >VK>_>p~y>C>EX>]>v>nX>f3Wp>`N>[>Wc>Uv>T.׀>Sr>Tf>U!>XX>]W8>byK>h>qh>yX>=>X>r>Sl>Zp>UoH>Ii>A+>8>5%>3x0>1>/>->+@>)yjx>'>&S_>$9`>#PX>"sS>!<0> LѠ>L>5>">Uf>ah>V@>7H>U(>>>1@>:w>>><`>> g > > +> /> >Th>>>>>>0>z9@>>z>k4>E>&>x>.>`x>̰>xP>]>>>(>&`>%p> > 8O> P> > e>=>$_>Ӯ>zX>]>p>IH>8>>>ߢ>i>>R >`>u> 8Ȩ>!&P>";>#s>$d>&S>'斸>)>+>.+y>0P>1H>3>6~>9j0>> >C>KՈ>PU>]B>a\z>u*v(>7H>2>Dp>|rp>u>qp>m8>jJ>hE>hj:P>i R0>kM>oB>s>x5>~׀>v>>wA>aX(>Y& >OPIx>Hj>AT>;ߟh>7>5u >3%X>1 >0>-px>+K>)Sw8>'U>&A(>$yP>#p>"P>!mP> P>Y0>h>%>g >)>p>ˠ>>>>6O>oEX>x>>zX>q>e\0> 0> r> q > Kp> (>V>> @> QX>dV>8>R>f9>>hh>o<>p>Ox>r(>Wt>tX>uH>8`>>{@><`>>h>jd> > pP> 8> s@> >+>P8>Ġ>ȷ>x>5p>.>>Ā>>8Rx>>>p,x>=x> >!Y>">#>%1R0>&и>((>* I>+aX>..>0^>1ከ>3H>6Ya>9G>=PF>AYH>E `>M>p>Sz>]>`0>q>>>s>> >WH>AH> >L >6`>2*8>wN>{>Y8>>r>`D>Yw>T>Hv>Cx>@8>: >7N{>48>3>1Gr>/zX>-B%8>+"d8>)^/>'F>&+(>$ p>#h >">!ט> >&X>>>uH>m>Eŀ> >>"0`>9~>pF>%x>p>*zx>i@>&>> > &> Z> {h> >ֻh>)>p>YaP>6h>ٮ8>>P>@>>#c> >!X`>9>'\x>>>s;p> >x>>y>e>J(0>!>> > g> .> X>Ix>X0>h>9>ţ>`>_$>5!`>/Zx>>SX>>> >LX>@>> >!>">#%>%/f>&n>' >)k>+>.h>0Z>1n>3qL >5>8>>;I>>>CMH>GI8>MG`>R &>[>\x>aZh>kW%P>t^>z{7H>~>e>l>T<>~ب>z:_>tX>lf@h>a@>[Ev>ZQ>Re>H|>EW8>@g>;O>8q0>6{>41h0>2eV>0>/bZ>-f>*@>)+F>'U>&2>$7>#P>"8>!0> >X> KH>>P1H>>>N6>=8>*}P>E2>(>Up>r8>k1P>>}>a> f8> > x> KH> > #d>PŰ>o>x>IX> >x>>K8> 8>>U>>*X>>6Q>f>7X>P>T>>>*t>) >>H>U> kK> _`> P> (> 6H>z>h>@>h>X>P>x>h(>;R>_p>gD0>>g>N>=x>+!> > p>!>"8>#>%>&y6@>'>)">+I>-x>01>1Z>2\ >4>>78>8>>@X>CV>E.>K`>L 4>Q.>W->[G;>\>@>\QH>\M>\aX>\EP`>\#>Z>Wu)>Q>J>IG>C>@g><>:>7y >4 >3i>1Đ>0[gx>.2>, >* >)+@>'>&.sH>$7>#t>"{>!@> >>=>Ѩ>H>x>e>>>M9>{Z>>a>0>~X>h>4>j>8> A> /h> > ߋ8> ,2>>X>(>>+>v>0>w>ޠ> >j˰>p>m=p>a=>>y>H>)p>>x >)0>>ָ>ۘ>R>(>S8> x> m> 8> > Q>a>"8H> >ux>$.`>`>@>t>,>>h>>҄(>~>>>h> Ψ>!l>"V>#>%>&&>'߄X>)(>+Z >--_>/Dx>0ϋ>1 >3YP>5p>7 >8x>;(>=m>AB>Drx>CY>G/>Jp>Kk`>JhP>J@>KL>JF>JDE0>Iy>G#>C8>A">@2>; >9x>6h>5X>3@>2W>1H>/8>-[>,|>*;H>(B>'>& dx>$>#*>"`>!> x>M>p>/>`0>E>`>p>@>x>>>W>I{`>>i>EkH>|9X>I;> > #> !Ep> K> nzx>X>x> `>E>h%>|>kH>w>X>Bq``>Ү>t= =^X=.0>>@>>>_x>چ>P`>(>>u>u>>P> -> Z> > ?> D><0>>6>$>X>8>ߘ>2>`>p>iP>h>" >OX>t>>V> >!x>"mx>#B>%`>&t >'->).c>*h>,J>-/>0x(>1 h>2>3Ggp>55x>6;x>7>>9>;%G0><`>=>>>@P0>AFh>AM >At>A X>@tg>>>`>=Έ>;h>:>8;0>6(>5>4>2[h>1hk >0l>.>,H>+;>).8>(:>&T>%>$H>#(>"A>!gP> >>Y>8>F(>v0>>&>>&>>>C>f)>>0>Tx>h>@> J0> W > S> y> v>h>>M>_H>>>\`>>>m>@> h>w^=f=j=8=h> x>h>;;>(>P>X>B>,>H>;h>>> >y|h> %> H> 7> > >f>>Yx>>K>!>IX>p>I>9H>>H>>>b>~x>.b>Nh> >!E>"e>#>$ⷰ>&>'Ҹ>(bRp>)0 >+U>,>.@>0 ؀>1P>1>2I>4>5 >5X>6;>7>8>8>9&>9ISh>9X>9'>8&8>7Ά>7!e(>5 x>4H>4k>3*Ÿ>25H>19>04>.ݐ>-}->+?0>*B>(>'>&>%F>$@>$P>"+I>!F> s;>%@>>ՠ>;>0p>`>G >V>C>;>գh>>6L>h>쀀>c.>z>> x> tX> n>X> > z8>b>@>)>S:>Ϣ>h>v0>MH>D>!X> :>9>>$7=_(=f`=*=%=~0>> >=>p>>D>,>o>$>H>^(>C;>>nH>`> o> < h> E`> > J1>PY(>Qp>u@> p>ð>t(>Yp>>͜`>͡>>18>>h>Y2>ʶ>P p>1> EX>!>">#iv>$g0>%q x>&y>'|X>)>*@>+r>,ڑ0>.^>/V>0yIH>0h>1I>2>3@)(>3>@>3x>4>4>4iX>4>4@>4[bH>3'>3C\>2|H>1[>1vax>0>0 _>.Vlh>-&Wh>+˻>*>)G>(,O>&>%p>$38>#->"d>!> > Z8>(}p>M>(>>>>͙>>אH>Q>@>"m>N>,>>I>z% >(> > > > A> h>C>P>,y>>#>;h>S8>>T#X>>%A>z>W>8>!H>eQh>ޖ >n0>V>ި>N>3 >>rhx>Z>3X>x> *8> aH> > Ky> HO>>`>>~>>w >O>(>H>p>(>n@>(>b>K`>B>! >f(> F>!Yz>"6@>"P>#p>$A(>%>&>(>) >*6>+-P>,&W@>-2>.Qh>/y >0>0ʨ>1>1y>1*>1_>1`>1ͱ`>1и>1;O>0/>0P>0 |>/>>.>-P>,_>+Op>*Tp>)K>(">'W>&">%*x>$M>#mkh>"q;0>!H> ¨> x>>x>(>G(>ɘ>r(>> 0>Ƙ@>0>@>2H>sX>>>g>`>> y&> > qe> w> B> >9ΐ>x>ٞ>>V>@>̈>f>p>_H>x>ð>=ɰ==&а=Te=̏ =8(=N=%I`>X>p> H>X> >@>n>Ű>y|>838>%>c>Z,X>p>+> `> > X> jԈ> b+`>>Ͱ>i[p>*m>W>dJ>h>٘>vh>`>>p>>ŤP>fh>h>x>#X> =xL> rp>!R`>"h>#vsX>$>%P>%>&0>'i0>(>)o8>*>+|x>+>,>- X>->.]>.<>.>.5>.@>.i8>.$`>-8>-Z>,>,0>+tP>*|>)>(B>'TP>' >&5>%.>$D0>#>"w(>")>!B 0> 5p>>]U> >>.> >>vw >}@>>Ȁ>+>)>Nx(>͠>>T->/>> F(> > > (> 1> 3>L=>>p>t"p>`>/6>> H>_>S>Z>M>p=F=P=;U=5==ǠX=Zp=lSP=Gk0>k>>0>mH>PJ>h>v>I>7(>]a0>>֠>c8> > > > M> ՘> ?X> k@>8>0>>-W>>xp>> >s>Āp>>^>x>>h>ӈ>K>yd>ȹ> (>!U>"H>"u>#v >$>%>%>&A >'>'4>(jP>(>)v>*>*$>+#k>+9x>+TX>+u>+nh>+cP>+x>*8>*3ɠ>)h>)1>(>( EH>'}ڰ>&&>%h>%'8p>$OIp>#~>">"@>!h> ۘ> 9>;x>к8>ݸ>u>Eb>`D>>Xʀ>|Q>h>P>h`>#Zx>[>>>]>bh>D0> d~X> `z> Gp> kL> ձ> #aH>j(>@>>;x>@>I>,+p> > @>nƨ>>| H> >3%=th=~j(=v==P=~=_^=C2p=>==:,>m>>y8>8>Y&H>`>k>5>>w>C>|>x>"@>> 0> x> Q> X> #> >> >>%e>>Tx>ix>@>Çp>4>|>>ø>60>u>0>P>P>Q0> 4> H>!d^>" >"ְ>#c>#P>$bF8>%TI>% >&3>&Ή>'4p>'q@>(>(,x>(`>(Έ>(Y>(X>({8>(H>(>'w>'^(>&η>&]>%>%l>$֘>$&@>#3>"ݰ>"Dq>!>!H> Ph>l>X>H>4>@>w0>f>H>A@X>CH>UI>s>-H>> > >{8>eX>`>r> i`> Fx> y> > XP> >R>P>=>4J>j^8>5H>Lx>>4>>@>2>>vh>=W=&==x=L=0==P=>=!=!Bh=>Ɛ>-r8>6>g>s>0p>ܐ>e>6>=ɰ>Ҡ>>b>P>0>Wh> ۢp> d> v> aP> IU>8>1X>XT>P> >[(> 0 >@>k0>Q2p>s>F0> @>р>>8>.p>0>B>> 5> `>!H>!۲>"v_>"y>#wX>#ٮ >$kp>$U>%0˨>%{x>%>& >&>&hI0>&G(>&1>&Jh>&& >%t>%H>%>h>${>$?H>#>#Ox># >"/>"N>!ap> h> T>3(>d>>OVh>_@>~ >>^X>{8>>>B>qF>X>X>G>>P>WE8>n >e> > s> &wP> O> { >>>Dƈ>8> g>J>>ʀ>V>>8>x>4>>@0==ۇ= s=H=O=Yڨ=X=L[=8h=_=v=C=8=:0>4>'P>Wh>xO(>J8>y>O8>>n >\P>PÀ>>:>c{(>BG@>X(> ɨ> k> > m> s~>`o>zO>OX>]8>[>2wP>k>>@>2jx>gH>p>H> >l>Z1`>x>m@>7 >K@>$x> 4> g0>!D>!sh>" >"Q=0>">#/#X>#n|0>#ܨ>#H>$ B(>$k>$#(>$9u>$m>$Lx>$)`>#b@># >#c>#0o>" >"dk>">!>!1> > 0>{(>M> >>_>>a`>>>L x>8>j>>K>k$>>>hx>>9 >m>!> > 'L(> Y8> H> >h>><>`> >z>>56X>8>G>(>x>F8>6(>> =p=$x=0=ՠ==DP==ڝP=n=&x=h==p=O0=*P>۸>>)T>0>I>>A>fj>1>`>X>8>u><p>@>*> 4H> `> s`> P> . >NZ`>m<>6r`>>cx>@>_>{8>C=@> >t>xE>n> >Fu@>נ>I>>q@> >>3>> ,[> > )>!9C0>!p0>!H>">"`L(>"a>"KX>"~>"t>"8>"F>"rz>"/(>"! >!H>!u>!4> > /`> \m>$> >==>I>Yx>p> >0>7`>20>w`>U >>EX>>>-Q >>w>:>\>(> p>;ZX> P> >L8> oi> f> >>p>1>v*>(>7t>> w>X>>|à>B>0>''(>=F=(=Ep=Qc=>=Ʉ= =K=|h=6/==P=Th= ڠ=%==tH=>r>>">oP>X>oQ(>p>~Ix>.L> >I>ap>8>H>p>ל`> => ip> "> !Ҹ> ;(> >Oz>>C>Swx>(>>4p>ĘX>{>JS8>h>~P>`>H>>⻘>>Y@H>-P>>4H>20>x>4h> 4l> 4A8> [؈> h(> >! t> ܷ> >! >!Z>!,>! > 0> > U>> .6@>R> >h>2>>p>ee>N@>0>>h>!>8>>Eh>tH> >D2>>X>d@>> ]0>>H>"0> > 0P> 3> ]h> "Ũ> jQ@>>W>p>qo>>]8>>>(>>8>>T>I>h>3(=Gx=Y==P===wH=(=A=G=u=-==`U=W=F=DP=@=X >1L>>& >_:>%`>f0>Vp>l0>}h>"h>CX>(>>;>>> U > > > ɰ> X> > c>>`>`>`P>Q9(>K>E`>p>H>mx>>0>> P>>j >(@>X>z>',>|X>t>i>> >>B>,a>b>>NR>f>>{v>eh>>+H>>p>2f>x(>>u+>x>X>W>Tx>V>0> >P>>>e>x> @>@>0>O>>M>`>z> X> => g> > >Xp>>g>*>p)8>>>,>>v@>x>b>+2>>>>=/=?=x=7=m=^==={W=WP=MH=?b=sv=X===B `=ʬp=P=p=3P>X=p>r>>u >7H>]0>ޢH>hNh>1>e>B`>>c>X>>E> ^> <> S> ӓ8> c> >+>8>@>>kB> >X><>˸>HH>~`>͟x>@>>F >4>Pb><>wѰ>Ui>wP> N>Xkh>TX>@>X>>و> >5>#@>T8>%C>2p>P>]>S>[>>%U>_v>Wa>0>>8>p>mJ>H>;>)X>"8>C>㺨>Zh>+>]P>>D>>$>~2>N> X> gn> > ^> f>5(>Ͷ>w>N >>(>yG>N>p > >np>挠>w@>>>'u==?=\:==#=+a=l0=0=@=@==~p=W(="==e ==y=퟈==U=u=>7y>>A>>`>)R>Ԉ >U8>+v>#>>8>Z(>-> 0>o|> X0> > > ul> `x> rP(>Y>H>!y>">>8;x>x>?>>BG>̼ >cP>ۚ>Mo8>>>@>}0> >`Sh>>Bj`>>'w> a@>Uָ>8>^>CX>>P>> >ӱ>y>>@h>Bh>>X>(>r!x>o>A>>> &>X>4>n>$X>OI>->s'>@><>@>Hh>̘>> 0(> `> [i> drH> 8> [(>h>D8>j>Ո(>F:>|X>>Uc>p>XԈ>>T\`>H>nM0>> >)=s="=A=`;P==jP=X8= ==B=0`=== P= =~`=,@=H=Hm=|X==Gx=h=i=4=>>n*X>dp>b >վ>Bc>>w>N>f%>>y4 >?>Ե>a>> > P> P> @> ?`> > Զ>>!>]>18>I>>\>K>;>>6>(>>>>g >W>Hx>p>$>H>f>>>p>>J(>°>%(`>g{>eH>K >>/>`>5>~>"9>(>or>">eh>F >h>7X>x>4>1>lY>>\P>>->>pbH>=7 > `> > >0> &> P> 6>f>>4H>i(>2>c>t>H1>~p>6K> >28>ɈH> >0>X>.=hF8===\M=y4=uG= =h=I0==(====m=v=^9=`==?=x=?==X=p==W0>'9>>D>>op>@>A0>X>R>ּ@>H0>W>]h>*K>Ŏ>iy0>%/ > > i> > .> > s> P>>>h>K>y+ >(>M{(>÷0>@)p>x> >U >>`Ϡ>>ِ>|->$>>[>>> p>\ >Cd>*`>\/>~)>ؐ>|jx>R>>T>g`>Ôx>o(>)x> >q>>"x>>U>>P>)(H>&p>?e> 8>h[X>>J`>+>K>K0> YX> h> d> r> > P> 3(>8>P>M>>>2Kx>(>0(>+X>1p>>>(>/q>eP>gP>=YӨ=A8=(p===([=Y0==x===\~p=8=r =;8=n=HX=۰=U^=$H=_W==q=O=x==/p=v2=5=h>V>Wx>N>>4>>.u>y> H>>E >ڣH>x0>A@>q>l`> (> > 8> q> %`> @> >>K`>b8>U>>AE>U>z>R>֬>>"H>j>(>$l>E`>_>)`>J>b>fp>o>>wp>^>>>C`>U>>|P>q>t>-8>h>C0>(>Ÿ>>7>I>x8>.>Ց>9>ߧ>0>.X>4h>>h> Nw> x> 3> !H> > >P>ð>}X>9>]n(>Qx>@X>>(>H>Ը>L>:>aX>-8>P>8 >3a8=aX=^=& =ux==L*0=d/===x=====U =(=H=c8=闘=i=C==K=ݴ=ep= P=7====V==!#=g>N>h>P>>*X>~>@>H>>s>7h> >FC>\>͘>LgX>0> > >(> G> b> 5D> X > (>^>'8> >ex>>x>r>ْ@> >`>u!@>>;>>>x8>Ԝ>>Ժ>2>3(>l>u>yU>}ݐ>B>{>>J>B>)P>cp>>r>+>h>p>e>@>E>8>I@>x>q>>R>p>:.> OP> ˲(> /> U0> > i> )Z8>8>/>\}>9>]>>e>gO>>z>(>O>7P>v~P>>@>O=0=;@=)8=4=Xh=И=VX=,^`=ƥ=7==40==?=n=F==G=P=°==\== =@==~(=(==H=M=U)=!߀=OH=>M>x> ǘ>kwP>Q>`Q>ǘ>O^>E>g>)x>th>p>> >ǰ>q> > hp> O`> > iH> `0> 4r> >bB>2><>28>0>`>&_H>a}P>x>Z >E>a>">k>ٰ>>H>p>:@>x>6>+m>D>&}>.>E>>3>m5>>0>>>sMH>k8>f8>8>/>I>0>k>d>(}> ?> |> +P> J X> H> > P>ƿ>>VX>յh>[(>0>O0>X>>>9>O>VW>>n'>8>X>'=aVx=t0="=a8=}=|x=yN=*==;8=h==#= =oS=Q8=@=*=>=&.==d= =И=H=G{=X=-0==ah=:`= =O=а=E=Ѱ=O>>>ˀ>->>K8p> >J>8>0>p>#Ӡ>ǐ>7Z@>>mh>)D>A> Ę> > \> h> 1P> Rz8> k`> [> H>@>F$>ͷ>>7X>t@>r>i >$F>R>ux>_@>ґ0>>>> r>>>EW0>'~>)>>[>>H8>>Bx> (>*>a`>y>%>h>N>=>"> w> 0> C8> 0> SX> ^> 8> x>8>Y~>>>P>>@>@>lh>ظ>o4>c>k>W>5(>\+(>>u h>=0=`=H=Ƿ=-=v===O=4Q=׀=== x=ơP=7=H==A=-=@=*=8=W=3F=ׯ=#=z===55p==FH=V=ۨ=lΐ=b=>==_>`>`P>>~>D@>>>|P>X>Ѩ>b`>(>dH>X>E>>X>68>> 4> > \> ֎> `> > > tp> 8>>>e>X>Ā>/ߠ>[a>f >Q8>{H>.0>>H>X>>>4>>>>`>p>0>lG`>5<>>N>"8>)>.>Z> X> R`> > *> B> > J> 2> rh>>@> >U>X>K@>h>&sP>y>$`>p>0>lj>B>S`>>3ΰ>S>:=ө= p=>݀=="=j@=HP==+(=[gP= p=Y=M=c==Mx=P=/;(=U`=)==% =x=n@=%p=P=8=ڈ===[`=m =qh=9V=}h=;=o==Es=F==ut=@=>>|Š>>h>cuh>@>)p>\X> >> >>*`>0> A>>>|>0x>> y8> > > h> .h> > > j > Oh> r > g>-]>>;o>&P>>P>> >>>^0>y>"p>?s>/v> x>r`>r>|wH>8>2>ùH>(> B`> _h> P> > `X> j > Q&> > WX> > z>ް>>ļx>$>)>g'8>>>^>s>>U>>P>'D >aP>Up>h>>@k> =f8=ZT==dQ==1=e=ǘ=o=і=e== J=y=`=G=n*==h==v@=0==6==A==0==@=z=LN@==fp=={`==(=!?x=]=$M==h=x=x>#0h>R >p>E#x>>Y>>Ӈ>O[ >>MDh>؀>ѐ>`>_>Q@>)]p>h>x>]>ҿ> Zi> > ZX> > 6`> Ô> ؠ> c> > > 8lx> 4/H>>S> >?}(> Y>k><>=>yM>h>+(> > 鍀>(> > > Zk> 6> $`> ꮘ> Ϸ> p> > > yhP> i`> d> *>I> >>>)C>hx><>>n7>>u>5fX>m>12 >s>^m>@>k>>>vs==d0=P=@P=x=MO=h="k=XA==*=+h=F==^(==x=D=`===x=`==R{=8=I8=B=ȸ=S=H_x===(==g=A=`=Q=Y=#=+=tX=\Q==G@==7=>Mx>Θ> P>}2@>>-a(>|>h>z>>D>>2~>z >H>WUH>>J>K>5W >H>ƈ> nl(> Έ(> f?> v- > 䑀> K!> uO> 8> > =h> j.> kG> p<> > 0> 8h> > (> @H> ]8> u:> f P> [> /> Ǡ> '> }(> > ]> vp> Ë> > _L> c > >F(>>X>)G>j8>7>>[Rh>P>$p>8 X>7@>M>>|>"> >-@> >>5=====V=:h=Ũ=(=v==@==P={="0==`s=8=~`=b===Ā=r=8=)=/=K`=eH==M==5c=*==]H=G=8=1 =y׀=%=M=Hz ={=u== s=!X=6`==>>Xڀ>U>?0>~>0>B`>>A@>k(>>M]8>D>#8>y$> (>6H>zH>?>z>0>;B>,>Wp> "`> vP> cP> > > iJ> Rh> > 3> > |P> Q8> F)> h> \r> J> @> > > x> >0> > C> > Р> l> $>p>dU ><(>V>>X>^>X> >u(>. P>0>x^>1@> P>* >&>d> H>`>V h>>>V=x=B`=1= =Q1=H=q==8= =J =٥=F"=>=S*H====n=0I=M=U =`=-h=򖀨=:H`=x(=P=$p==b==w=hp=a=.=߈==D`= =Au==N+=3"=9`=@=(=l}==z=K=A`=1X=o=P>N_>8>h>U8>Zx> ]>SY(>H>0>Lx>ہh>b#>>40>]>,>>`">>>H>]>Ԁ>;,>x>> pH>> @> X`> p> ,X> > @> > dH> > > H> Ʈ> h> _Xh> UV> 3a> 0>>TFP>Ga>`>Ũ>R>3>Z>a@>7ʰ>f(>^Ax> j>8>E>0>(>`8> `>P>6(>&>}[>%x>^>f9>-=tH==x==L2=iM0=λ===J==Ah=@=U=p =-=rx=ހ==;X=P=]i=!=Sp=8=k8=7=.@=x=H=(0=g=u0= =ʂ=)=EP=[H=(`=kh==6.=r@=I(=h= h=xx=P=f=n{={H=?`=X=K==A=(=R>ϔ>S >0>h>Eo>|>X8>R>κ>>a >x>+>z>?>h>bh>> >D>S>>>Wv>kP>>><>R>T<>R>d7X>=4>h>l>R>>LH>]R>F>>D@>v>v>>:΀>& >#>F`>4'>>.> >,_0>>,>C>ρ> >>:>i>1P>I>ҠP>*X>>]I>3== =X=8=v==8=j=7=P=Z=Ÿ=F-X=եh=h5=(=O`==z=h|=&YP=􊖘=iҘ==6==E=1@=`=F=$H= ===1bX==0="="=_=NX==Kh=Ӽ =:k==K@=e(=VX==Z===% =H==v===8=z="=I>>p>Z>(>Z;> >O`>Go>>J>7jp>p!>>Ju>iH>>>A 8>{>>0X>B>+^>W>dh>(>h> p>iH>nX>HA>;@>5MH>P`>G >WK>>7>X>.>4>Ψ> >l>h>@> >0>]>O>@>ĩ>fy>>>X8>n>H> ˸>p0>g>>d>nBh>*(>>0>I>{=5X=^8=$=<=@=y=== =k= X=`=:==@== =p=GP=7=H==p=Fg ==]x=[=Ć=@= 4=== =q===:X=X=^=p= 0=df==;0=m(H==OL@=9x=p==0== =9(=8= ==MW0=*=k=;0==>^:> >,r@>O8>8>(>C>X>>i8>\>>Ý>o >q>7>`> H>*>`>|K>>`>(>蹠>h>$>K0>$@> >"L>x>H>ۭ>`>rx>>q,>b>F>V=>.(>ƴ>>HH>M>ꊠ>p>'8>Ky8>Ȱ>ca>;>":@>>UA`>p>J>Ok>9=͠=5/=e=?=P=J==V==x== =\X=^=?-=`=LW(=0=r= =:`=p=wX=a == = ֨=0=P=/==@H==Ch= =,@=3H=8==50=%`=={===X=8=:=18==h=!=[;==E=K=Vh=U`P= =eF==:= =!==(==0=Ġ=߯=p>o>Ti>"h>u>5>e >4>> >X>Ô>(>D>>ѐ>K>9x>W0>~(>>>>2 >>0'P>s>>f@>f>=>H>m>`>,>8>@>>q>@>.H>Wh>г>>Vi>F>>D>>%>p>a0>\k><>Ð>N >eP> ~t= ="=U(=3b=h =3==&=Y =~H=-P=-====C==h=X=Q=L8=5==t= =0=&=vѠ= Ӱ=Ҁh=wE=33=8=JX =,p=v(=f=s=p==Ip==s@=O =,0=P=L=P=)=PT= 0=7*==器=i===ؠ==!=~`=ϐ==(H==8=:=X==9V= Ƞ===> >4(X> >>(>Vب>X>>>/}>]>m(>;@>x>(+>.>>X>>k>> 0>>>x>> wh>;>>>(>3>>͆>θ>>>x>X>#H>>)>o->A>>>,(>0>9p> >>>U>s=x= @=p= e=p@=$X=T=!=_=h=Ed0= =4X=CP=eP=o=Dh=ט=4=*=@=>=P=t=+=x=[=={0=x=p=h='x==lL= 8=Y=#Y=v`=7r@=H===@===<8H=S(="P=J{=Ph==,==8==@== H=_==v8==s=0= Nx=}`===&=>=bp=@=k=I`=|!p=`=e =+>@c>^>L>8 >>->x>ې>+p>n>D)h>B>m>s> >ߢ>U> >G>wh>>3>>$;>2tH> M`>O0>"z>h>>c>>|>~>I]>'ш>)>%>i>>d>P>>ݖx>I>\>&h=H=Y( =3SP=a=^X=yp===L0=Нh=8(=Ex="P==ۻ@=VVp=kh=v>=x== H=۔@=c=ǐ=J(=a=B(=p=90=<===0=U==h=FD={==>K== =W(={X=&=r@==28=L=$x= /=P=s==I=8==-==+8=:s=Ȱ=5=¨=2== =VQX=h=G=Wx=Lߘ=~=& ==%=jX== =,8=z =u=@=(>*>C>mp>>8>>8>)x>z>h>>0x>x>`>U>6h>U>Fp>B>P>>>Wa><x>5>>-s0>.VP>>>M0>ɗ>& >e.>_s>:DX> >>{>jf>Fx>s>d=`==`=S8= \====,@>$>%>b>>@>H>>q>H>H8>_@>f>w>>v>P>>f>>r/>>>T>8X>BX>J6>;>7)p>0>v>>x>B> =_8=s8>R\==== y=h=?j=h=ZA=㟘=Z=s=O%P=p=-x=܁h=u=5=oI===k=6j={p=,J=L=8=$X==uy@= u==V=Dg=h=Jjh=/=== y|===醹==`=5`f8*U(=h=?x=:@=0=u=H= gx=S===~[=Ҹ=`=6: =_=L===2X=Ҷ=G==2==-6={=@=?X=0==1==RK=%=T`= `==8=zV=s-= ====p=$=-(=0>$$>O|x>XVX>k@x>up>h>>H>>$0>^8>еP>%x>>`>H>h>'>R>>o>j>I?>=m>@=== #h=a =>=p%=zH==wp=P=Q=a=~x@=Ջ=/=ѳh= ^(==>=`=uh==h=DJ=٪=]=ӫ8=ǩ0=N==!X=~}==s==`=땐=t =i=x==ָ===`=NP=" ==XTp=1LOZxf===P=~==1=@=V=~#=+=񳔰=D=V=(8=C=:4==ٸ=yP=x= _p=hh=x====T=E=A8=9ր=X=L=B===E==~c=(=.pH=8=ĪX='=vE=ր=TP= =RΨ===t=im@=s6=e=7=f`=@> 6>&>>#e> d>."T>,2(>==N=E(=Ɯ=z=(==Ȉ=P=@= H=C==X=uH==C=z=+xh=P=(=H=ͫh=~=B@=qp="A@=@=;=֘= eA(]_T=Dh=*;=x=V=6='==v===$==*= =\=`=8m===f=T`={=< =^=۰= =@B=~x=V=;Ĩ=m=z=w=i=#0=c=Ʌ(=eNP=(==X==O`=׀=:H=(=f%=o@==0=Ҁ=#gP=H@=_=h==8===O =0==0=4(=p0=] =-(=F==5="=`==?O ===cp=gP=$v(===Tx= x=ø=.0==@==8=2==Y===t=mX=+=-l==Tp=9= ==h=+=c=P=LH=.{=Rp=f=!=Cp=K.x=旀=(=A=^=C=w=@=h(;SHNh5xp==8IP===+)x=,9(==@h=$=Ygh=rx=*=BH=qE==7=oې=Tp==%W@=p=w=R=;g=o=%(=Bn=fx=f`=H== =;p=@==-=&== H=e8=Y=A=h=[wx==H=H=^=s =>=>= e=V`=98=8=_x=[(=ya@=1=yP=;=]4=@=8=b =?8=w =v= (= 0=C ==r=^P=A=U2=@=_h=;c=7=#=V==p=Fp= =Cx=78==Z^={=?==W =b@=;=* ==uH=P,P==ň==H=rP=Y=w=4.=~)== =$t=m==d8=X=vX=`=%=%x=㥺=p=0z@ߤ5JF`1PXH+x=헌=v0==|=O=cX=/=N=A=-=\=J= p=;=w=򬴰=@===.t=K8==="==?=(=2=X=cX=~=P==@==A˨=(==xh==VH=ڧ(=G= S=Ph=X0======20="==lm=NH==G=6={i0=Z0=P=u='ؘ===P===!=R=N:=p=Fh==P==X==7==n=8P==e5=3p@=p=?8=(Ҩ==x=#(===1r=B==i|=@==H=K(=0==R =\p=֒8=,@=%(= ==W`=/=?= = 0HA([3[BMcc\'=aǸ=8(=(=4*=s=﵁=s՘=F=rr= 0= =C===G=Ix===+= ==c=]=t=rX==h==F =xx=`=h=g=M=XV(===5=tP=MP=m=|2@=l^`==w=X=}`=@===X= P=T/=0r=S]=sm==O=18=pH=j=O=8h=3==2==z; =V=M=n(=7 =Uh= =)8=u= = =P=}0==P=OX=c=L=vH=#=X=5=aӐ=k9`=0=a=X`===gÀ=Ea=7ј==WH=m=p=ϼ= ==v4==좙=8= @=t=Ѱ=pKQX5Sh(THUs s=ߠ0==x=H=Nɸ=T=,=[= =H=(== =R==|=*<=,=~P=u0=60={8=%`==0X=?}===@=Z\p=:=M==.+=H=ə=#!=`x=(=p=_90=2=-==6=#_(=g=ۈ==q=J=m=y\0==X={=%H=Ud=V=6E=x= x===zx=r=m=G8===Щ`=fx=P=C=n=y=x8=h=@==o=]H==(==5=(==3!P=A=+=P@=U=+=K=m/=H=8=b=[8=?]=4v=x=n+=q=8=_G= =K0=<=X=ϥ=nB=78=[>A`g:sunpy-0.8.3/sunpy/data/test/lyra_20150101-000000_lev3_std_truncated.fits.gz0000644000175000017500000000234313231613137025763 0ustar nabilnabil00000000000000` Xlyra_20150101-000000_lev3_std_truncated.fitsAo0ʻ8A] R(@Pb(=E&1RHAρj bio#,G47vNfxbyRQ  xv~l.Wj/|MG y37y4e|B='tĚt]\Tyi6O^\Gt.E ( |Fc[rsZhG\\4'M=!āΜ(j $x󺃻>vGށ' y4XhY~ԕhjkP|#~>b/JBdhCvWD4ϣ{8:弔+Gb' qdk椸s84%M;OaD~s?73;ک4S7Ӧh8 ;"5RXbn馛~Ak0@Jn^$F ;jm@cISƎZv*246m( bn^>ɜܒq%曹^q,3JbS]wrBV^F+.>A?@4fY(h̦mىA ^TL?K RQA $Y-oh2C1_ ]?[T{56dV_,Ww7oi(c<{p$P٦C8퓭4M䩰jV} վ\}ƃR@e;;R)h.kS,26GYY?O ufnݹ!AS(c*[rd3?]M)/Sx{5׿"QTV~D+B:Wۧ*Nʶ6vJ֘Q Tul@e'쑰OQ%fd\ {Q*D(`Q0 F("D!sunpy-0.8.3/sunpy/data/test/mdi_fd_Ic_6h_01d.5871.0000_s.fits0000644000175000001440000043670013203275053022232 0ustar nabil00000000000000SIMPLE = T / conforms to FITS standard BITPIX = -64 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 128 NAXIS2 = 128 DPC_FORM= 'Cropped Compressed' HR_MAG = 3.267 INTERVAL= 60.0 DSUN_OBS= 149597870691.0 T_OBS = '2009.01.28_00:36:00_TAI' EARTH_R0= 974.4219002623 T_STEP = '6h ' DATAVALS= 600539 D_RMS0 = 2385.935735591 FD_SCALE= 1.985594249325 VCOR1 = 162.9725507256 DPC_SMPL= '60 second' ITIME = 0.0 D_MIN0 = 335.0 DATAKIND= 'NOT SPECIFIED' SOURCE = 'prog:mdi,level:lev1.5[-2147483648],series:fd_Ic_6h_01d[5871]' CENTER_X= 512.528503418 CENTER_Y= 512.024017334 T_STOP = '2009.01.29_00:00:00_TAI' XSCALE = 1.985594249325 T_EPOCH = '1993.01.01_00:00:00_TAI' PLATE_X = 511.5 PLATE_Y = 511.5 BLANK = -32768 MISSVALS= 197481 ABS_MIN = 356.0 I_DREC = 23484 BUNIT = 'Arbitrary intensity units' MDI_Y0 = 511.024017334 D_MAX0 = 13689.0 OBS_DIST= 0.9739569156244 DVALS0 = 2196579 CONFORMS= 'TS_EQ ' DATASIGN= 1 DATANAME= '' XY_FROM = 'SMOOTH ' B0 = -5.774028172878 CTYPE2 = 'solar-y ' CTYPE1 = 'solar-x ' Y_OPAXIS= 0.0 PIXLENY = 1.0 PIXLENX = 1.0 OBS_VN = -2359.620986501 T_FIRST = '2009.01.28_00:36:00_TAI' CDELT1 = 15.8847539946 CDELT2 = 15.8847539946 T_START = '2009.01.28_00:00:00_TAI' DNAME0 = 'fd_Ic_6h' Y_OFFSET= 0 MDI_X0 = 511.528503418 OBS_VW = 30062.69272176 DATAMEAN= 10653.66249819 S_ANGLE = 0.0 X_OPAXIS= 0.0 EARTH_L0= 174.5536581482 FNDLMBMI= 495.9843139648 DUNIT0 = '' Y_SCALE = 1 DSDS_UID= 0 FNDLMBMA= 496.3985900879 DPC_CONF= T ROLL_UPD= '2008.11.18_23:38:53_TAI' DPC_ORGN= 'Space ' FNDLMB = T INSTRUME= 'MDI ' CALTBLS = '/home/soi/CM/tables/calib/flat/fd/vers_1/' XY_QUAL = 0 D_VARS = 1 T_EARTH = '2009.01.28_00:36:05_TAI' D_MEAN0 = 10417.10158251 DATAKURT= 7.1951688993 OBS_MODE= 'FD_Continuum' EARTH_DT= 5.428290107776 IM_SCALE= 1.985594249325 ORIENT = 'SESW ' CADENCE = '6h ' SEMIDIAM= 0.004776895422961 TBLXYUPD= '2009.02.03_00:43:52_TAI' TIME-OBS= '00:35:32.43' QUALITY = '0x0000001c' T_BLOCK = '1day ' DATASKEW= -2.358082661029 EARTH_VN= -2345.998769958 SOLAR_P = -179.999994991 SOLAR_B0= -5.774028172878 VDS_VERS= '2003.11.18' MISSPKTS= 0 EARTH_VW= 30160.48273316 EARTH_VR= 207.877370443 MAGNIFY = 1.0 FDSCALEQ= 1 DPC_CROP= 504.0 OBS_CR = 2079 P_ANGLE = -179.999994991 X0 = 511.528503418 OBS_L0 = 174.4508635217 ORIGIN = 'SOI Science Support Center' DATA_RMS= 2305.467986966 S_MAJOR = 1.0 DPC_RATE= 'High-Rate' SITE = 'md ' DNOTE0 = '' OBT_TIME= 1611794160.0 DATAMIN = 356.0 SRC_ADJ = '/SUM6/D22314239/S00000/scale_corrections' DATAFILE= 'fd_Ic_6h_01d.5871.0000.fits' CRPIX1 = 64.5 CRPIX2 = 64.5 DATE-OBS= '2009-01-28T00:35:32.428Z' TELESCOP= 'SOHO ' DPC_OBSR= 'FD_Continuum' DATAMAX = 13576.0 DATE_OBS= '2009-01-28T00:35:32.428Z' FNDLMBIT= 6 X_OFFSET= 0 OBS_B0 = -5.774028172878 DPC = '0x46061FC0' OBS_TYPE= 'WHITE ' DATE = '2009-02-03' T_LAST = '2009.01.28_11:27:00_TAI' T_REC = '2009.01.28_00:00:00_TAI' EARTH_CR= 2079 YCEN = 0.9414175561523001 T_REF = '2009.01.28_00:36:00_TAI' FNDLMBXC= 512.5655517578 FNDLMBAN= 54.98337554932 DPC_STR = '0x46061FC0' DFNAME0 = '%04d ' CMPERRS = 0 BLDVER10= 60100 EARTH_B0= -5.735090867738 BLDVER15= 60100 BLDVER18= -60102 OBS_VR = 162.9725507256 SOLAR_P0= -179.999994991 EARTH_D = 0.9848351482263999 DSIGN0 = 1 PROTOCOL= 'RDB.FITS' SIZERRS = 1 YSCALE = 1.985594249325 DATAMEDN= 11308.54325433 R_SUN = 496.2269652976 ROLL_TBL= '/CM/tables/ephemeris/mdi_roll.smooth' SQID = '0xc400094d' L0 = 174.4508635217 MDIREF = '' RUNTIME = '2009.02.03_21:20:32_UT' DETECTOR= 'MDI ' OBS_R0 = 985.3054086548 XCEN = -0.05637520019531 DTYPE = 'C ' DSNAME = 'prog:mdi,level:lev1.8,series:fd_Ic_6h_01d[5871]' FNDLMBYC= 512.0347290039 X_SCALE = 1 BLDVER00= 60100 Y0 = 511.024017334 EPH_QUAL= 0 S_MINOR = 1.0 CRVAL1 = -0.05659622286691501 CRVAL2 = 0.9451084443880973 COMMENT Data from the Solar Oscillations Investigation / Michelson Doppler ImagCOMMENT er (SOI/MDI) on the Solar and Heliospheric Observatory (SOHO).For informCOMMENT ation on data rights, keyword definitions, and up-to-date reports on knCOMMENT own problems and data quality, see: http://soi.stanford.edu/data.html HISTORY created by mdical Mon Feb 2 16:24:04 2009 Order-1 calibration coefficiHISTORY ents multiplied by factor 1.137517created by MDI_image_reconstructor TueHISTORY Feb 3 13:21:03 2009 END @w@xx@y@z|@{@|\@}@}T@}`@|@|\@{\@zp@x@x8@w@w@y @{@@@@@@@@@@}@@@@@ @@@)@@@@@@@@f@d@|@y4@w@y$@}@@@v@z@r@@@i@@4@b@@@@@@@@r@ @@t@p@@u@v@@@@@_@A@r@@z8@w@w@z(@j@d@@$@]@@@@@ @@i@@@@@@@Z@`@@@@@@@@@@@@@@c@d@@@A@@,@@؀@k@@W@@@|<@xp@y@,@@@@4@,@@@@@e@?@@@]@S@t @@k@@@@`@@ @@`@`@@c`@@s@@s@.@>`@@@@@{@@<@?@@@@@b@{@@w@|8@@@@@@@@@@@0`@ @@@@@ @X@;`@d`@@~@ @{@@@@w@ @`@@@@*@ @0@@@5 @@,@@@[@3@@ @@@@B@@$@W@@@a@~@x@x`@P@w@@@`@@@k@@@@7@`@@`@r@@@ @@@?@ @@# @%@@ @@@;@@ @4@`@`@3@B@ՠ@@@@`@x@@| @`@ @@Ӡ@I@@@@B@@@<@@@@@w@@@@x@x\@@5@i@b@x@@@@M @@Ϡ@' @;@@@@@Q@[@K @I@`@@k @j@¤@z@?`@s@i@} @ƒ@‰@l@„ @a@q@@@B@K@= @@@@@@@L@V@ @Ơ@}@ @@р@;@@s@T@.@L@p@4@x|@x@~@@-@@@@@@@@@@@(@W@@ @< @ @O@|`@¹@g@@@˜@@b@”@¿`@@¦@¡@@@ՠ@@²@]@@@@@ @@«@@@Œ@œ@@@@`@7@@@H`@@@m @X @@@@=@@`@@@@@@@@Ӏ@p@ۀ@@x @{4@_@)@@@@@@@@8@@h@@q@@w@X@i@@@¢@@9`@w`@8`@À @] @×@ @W@K@@+`@/ @b@Y @#@Ó@@d@â`@!`@È @@#@@@@r@@@‚@-@`@@ @@@@@@`@@|@@U@@@@6@|4@x4@|@@@@)@@+@@@@n@`@@9@L @‚@ݠ@2@@@@@r@Š@Ô @ß`@r`@ô`@V@@Â`@}@@ʀ@`@k@@å@@٠@\@Ñ@@@р@@@Ù@@Ô @[@@Á`@f@ @@@@s@Ġ@µ @ @G@@ɀ@c@B@@ @~@@3@H@g@h@@$@@y@{@@3@@t@@߀@t@Q@@@@@W@@`@9@Š@@}@¢@f@9@a @Î@Ç@@ù@X @å@Ë@@á@@Õ@@@ @@@`@@`@@,@`@@@`@ @@@ @ @Õ @@@è@@é@t@@@ @@‰@(@@#`@0 @@B@N@8@@S@@@@@@@@1@}\@w@@@@݀@&@*@@'@@@ @;@M@£@¨`@@@@Z@@{@@`@:`@@é@@͠@,@@u@@~@S@^@@J@D@{ @@i`@\@Q@7 @ğ @q`@ı@D@@_@ļ @?@@@V@@j@å`@@u@U@) @ @@@˜@@@`@@l@ @d`@+@\@@w@@@O@2@@x,@yP@[@@@@@@@@A@@V @@ @a@­@ @@@X@@á@ú@ü@@@@"@"@u@@@B@J`@d`@D@`@Ĭ@@ć @Ī@Ă`@+@ @c@Ĭ@@@ @p @Q@Ē@ġ@ĺ@@ġ@ļ@"@Ē@@@u@Q @6 @@ó@@@Ô@'@@@½`@ª@`@d@ @`@y @ @q@j@@@H@@c@@d@z|@{4@\@$@%@@ɀ@5`@@ @@ @7@™@ @3@0@@h@@è@`@ @Ġ@ @M@v@X@b`@ğ`@Ĝ@@u@!`@@ @Ϡ@$@@ @Ď@ĥ @Ľ`@ļ@4@E@&`@h@@ĩ@@@@Ě@Ĭ`@@@v@@`@e`@S@ú@a@@9@@@@,`@`@+ @@@@U@@@@; @Z @ @l@@u@@@@@|@@`@0@@d@@@-@`@@@@@# @o@²@`@Ò@f @×@û@ý @@@`@d@Ć@e @Ģ@@9@Ĩ@ľ`@@Ě@`@@s`@ @=@- @ @C @^@ڠ@+ @@>@@ŀ@l@@; @ŧ`@H@@?`@Ą@`@:@@n@ċ@č@V@ë`@J@@Ô`@!@@À`@T`@@©@B`@6@ @@;@ @P@@ހ@@@@̀@v@@H@R@@߀@@@@ @@@ @P@…@@:`@@N@@u @ý`@õ@ @@@2@L@Ā@@@4@`@@ď@@@=@`@`@D@"@Q @u @ݠ@7@Ő@h@+ @X@ų@Ÿ@u@e @d@`@E@X@E`@s@1@@@ħ@Ѡ@`@@h@@x@@h@:@@Ë@È@C@$@@@ @|@D@ @@e`@=@ @_@@@/@@@@@@@\@@@@@/@@@n@@@}`@@@@g@Þ@`@Ñ@@M@>@P@D@g@Ơ@O@@@ě@G @Ĥ@Ĭ@D@;`@,@4`@Ŝ @N`@ţ @@`@_@Ŭ@@@@`@ţ@@Ŗ@ @@Ŗ@@Ŝ@@Ŧ@@€@o`@ſ@@L@,`@i@_@@j@@@`@@Ĩ @W@+@ @@î@u@@2@@A@o@ @h@#@`@z@U @@\@@@@@x@x@@v@@݀@K@@@@"@̠@L`@`@Ԁ@@G @È@@`@N@k@ @Ā@@ĩ @P@ @@`@@ŀ@@1@@@@s@@@Ş@Ş@ū@ŵ@W@€@Ů@@@@!@@P@@@@@@]@ @Ū`@ſ@@ž@U@Ŋ`@o@} @c@@X@S@ň`@`@@%@ģ @Ĭ@V@@@@ó@@G@@@›@R@ @ @u@@@O@@.@@@ƀ@B@x@>@@@@@>@@@@4@@$@»@L@@Π@þ@@@@i`@<@w@m@@Ĺ@@@@@@@W@Ů@ř@ţ@}@ũ`@ŧ@ų@@@@Ř@@Ŷ@q@@ @o@H @@.`@Ũ@@Ƣ@@@`@@*@@:@`@ @`@c@ű@Ŷ@P@@ @e@Q@*`@@@ď@@ĩ`@=@@ @@2 @C@@ @©@@@@1@@@@@@@@@c@@@<@x@@@@/@@@@y @{@@€@@@@÷@_@@/ @ @@Ě@@@@Đ@@@j@b@4@Ŗ`@@ŵ`@ō @Ō@@@C@f@@@W@ŷ@#`@Ǝ@Ɲ`@ƒ@1@@6@t@ƣ@<@*@ƪ`@c`@?@a@'@3@*@T@ @\@+@ō@ŕ@Œ@E@T@j@@@o@@@@@Û@÷@ß`@l @0@Հ@¢`@/@@@O@@@@@@X@À@@4@6@y@f@@h@@#@f`@@c@@@@`@`@ß`@@\`@/@@Ĩ@Ė@$@@@@@@ň @`@!`@8@@Ŋ@ť@ŋ@ź@,@Ų@ŧ @ @ @@@6@;@Ƃ @^@Ʃ`@ƺ@@{@p@&`@@f@g@f@|@Ɨ`@`@c@ @`@z@'@v@@ @1@Ź@@@e@@Ŧ@Y@D`@E@f @@`@@I@> @È`@,@J @Z @@‰`@ž@@@x@)@@@@@@@s@@@@~@@@@l@@@`@9@`@7@@ @4`@ @@8@e`@ĉ@ď@@ @ʠ@_@@@S@Œ @8 @I@Ū@Ţ@`@@@Ŕ@@ɀ@Ś@b@Ɩ`@s @d@X@@ƙ`@& @ƿ@Ɖ@ƛ@{ @%`@ƿ@ƫ@Ɠ@U@@Ź@Ɗ@@Z @_@@ƨ @!@\`@C`@@`@Ŭ @@@ŀ@H@Ԁ@)`@|@@@#@@c@]@-@@Í@ß@@@@@@p@@@@7@q @@ǀ@J@?@Ā@@{T@@@@@v@@w@@ @C@ @@@ä@@ę@A @~@@e@`@x`@Ī@T@#@Ŕ@@x@A@@@ū@@?@@ @{`@@W@ƒ@@?@@@@@@Ƈ@ @Ư`@ @@Ƞ@ƻ@Ɔ@ƣ@@@;@ƛ`@܀@Ɨ@Ʈ`@ƭ@Ə @`@}@@ƛ`@G`@ơ@Z@Ɠ @? @ƫ @Ŷ@ @@2@ @g@@3@!@ @T@@Ĥ@d @>@@@̀@Ä @` @@@@6@`@@@|@@@@!@$@@}@yH@@@P@@'@ @@@@@@`@ @@`@Ò`@@;`@D@x@Ď@@6@ @A@M @@C@e@m @m@@ś@ @I@_@@@I@d@2@ @@h@Ʒ@Ʈ@ƍ@Ʊ@@@@ @̀@ @@@@ @@Ɨ@Ɩ @ @`@Ƹ@@@@@ @`@@ @@`@6@c@"@g`@2@@@@ř@@ř`@u`@Ŭ@`@ @T@ĸ@Z @ @@Î@`@@ @@`@c@@@@@@@& @q@@@@@N@@@@{|@x@d@@T@ @@@I@@@@ @S`@H@ä@A@G @u @č@@ĭ@ `@ @[`@߀@@P @@N@@Ń`@@@@@@Ƙ`@^@f@ƨ@Ƅ@@ƪ@@ހ@>@@*@'@V@i@@@@ @ @f@@[@@T@F@@H`@@@ @ @@@@@@@@Ɗ@@a@w @k`@@р@ހ@f`@`@Y@Z @*@@M@f`@ė@,@@@ @Ó@@l@@@˜@h@ʀ@ @#@@@v@@@@y|@@@@@\@5@]@@_@©@ @@Ñ@@@i@Ć@@@;`@@)`@ś @Ŏ`@ł @]@@ż@ź@4 @`@{@@@@:@@3@@ƪ@ƃ@@Ɣ@@J@`@a @s@@`@A@@>@@T @@Ǖ @&@@v`@dž @ @@ @' @@2@@@^@@ @`@ƀ@Ƥ@H@m@@}@<@a@@J@@@Π@Ÿ@ŗ@@@@@@ą@b@!@G@@k@@©`@ @2@׀@t`@@Z@@@0@@@@@|@@`@@@G@ @@@D @•@‘@@k@Ú@@9@1@Ħ @Ļ@@!@@@r@@@ž@@@ @@`@@Ѡ@@@Ƥ@J@k@׀@& @@Ƭ@k@@@@B @v@@@@I@@/@`@?@o@Ʃ`@ǻ@@/@@+@@`@@w @@ƀ@T@/@p@@,@ @Ǚ@@`@E@`@@u@@r@@ƿ@Ƒ@K`@G @`@@@@@B@O@@@Į`@ė@ĥ@@j@@@ `@j@}@#@ @­`@@@|@ @J@@ހ@@@M@}H@y@@@@@@@@`@ @e@´`@ @Ó@@å@ @l@a@į@@@9@E@Š@\@p@Ş@>@@`@K@"@Ƽ@ƺ@ƅ@/@ @{@@ @`@`@Ɠ@/ @*@@@@<@@6@@*@ǡ @y@@F`@U@N @@(@@ @`@K @Q@[@ @@݀@ǒ @@;@`@+@@@@@@8@@@ @C@ @!@3@Ž@@@Ŗ@U@@ @ˠ@ĭ@Ė @`@@`@Å@@·@@S@@@c@@; @c@Y@@&@y @@@@@@@@ @*@@@@G@ö`@î@A@@c@@Π@ @@@Ŧ@Ş@Ś`@ @=`@o@ƚ@ž@R@@_@Ɛ@Ƨ@@p@ @Ơ@ư @`@ @@Ӏ@#@ @ @Ġ@t@@@@@@@}@@*`@@@ǝ@@h@dz @LJ @@@@dž@DZ @Ǔ@ǭ@@q@? @E@Р@#@$`@@@ƛ@@ @~@Ϡ@Z@@)@ś@@ũ@s@v@l@@H@V@ @Ğ@^`@@@ë`@@ɠ@“@~@@@@`@`@K@@Ҁ@v@@|h@@@V@@@@R`@!@@)@ž@ @#@@Á@@@ @ğ@}@Đ@@A@T @ŭ @@@@@Ƒ@x@m@ @Ɨ @@ƾ@@ @!@%@@ @E@,`@4@@@@@y@ǀ`@*@6`@F@[@Dž@Ǜ@$`@@@@ǒ`@Ƕ@`@D`@ǵ@dž@\@`@@@DŽ@@-`@*@@]@`@M@@@0@@ @ `@,`@@ƈ @+ @u@@% @@(@Ŋ@-@@@@@ĉ@Ģ@Ć@ @@N@J`@@v@@`@I@@9@@@@@@n@@{@@@@ǀ@@ @ @‰@¨@@]@ú@@Q @o@N @G@1`@ @ű@c@@Ŝ@@ƨ@r`@z @ƶ@`@@ @@@K@@@@@@G@ @@>@ǔ@ǐ @(@@o@Lj@`@Ǐ`@@Ǐ@ǧ@@e @@@&@ǃ@@@[@@ǵ@ǻ @Lj @@@ǃ@ǐ @t@ @*@@K@o@@ǘ@@@ߠ@@7@Ʃ@@@@Ƃ@v@ƅ@`@"@`@Ś@ũ @w`@€@ś @ę @֠@Ā`@@`@Í@`@@@e@[@`@@ @`@@@2@@@@@@Ԁ@ @ @x@@®@Õ@@ü@@'@v`@ @'@@Ř@@ @@Ż`@{@X @Ɵ`@i@Ƶ@@ƭ@Ɯ@۠@;@9@@\@G@@ր@@@ǥ@ǂ@@@u@Ǒ@ǁ@= @Ǣ@@@ǽ@@p@@" @@Ǔ @Ǹ@7@ @Ǚ@@X@@`@Ǻ@`@@Ǥ@֠@@@Ǒ @@a@@ǔ@J@@Ǵ @@ @ǁ@@^@@@@@`@~@Ƃ@@@@o@Ŗ @; @ @@@G@@v@ @đ@܀@@Ú@@P@@@@/@ @@Z @@@@@@@@d@zD@@@@@@@@@@`@¡@@ @@Ý`@@^@^@@Q`@Ō`@ŗ@@@@`@@O@@F`@`@8 @ư@@@@@Ɵ@Ƞ@@e@N@ǐ@@Ԡ@W @<`@r @@}@@W@ǐ@L@Ǘ@ǥ`@@Ǫ@ۀ@Ǡ@;@@@@ @>@t@ǀ@`@!`@ @B@x@@@@à@ @@`@`@@x@u`@N@@C@/@@@Ơ@@Ƨ@ƥ@Ƹ@'@@\@ @ @f @š@@Q@0`@@@ē@@l@@ @@@Ç@@{@@@½`@ `@ @8@J@@@<@@j@@y8@$@@ @@{@,@`@P@@@8@@@@@ķ@ī@`@E@q@X@ŕ@Ŕ@#@e@ƥ@o @x`@@Ƹ@@ @@@ƞ@@ @ǣ@@ǜ@L @Ǘ`@@@DZ@;@Ǩ @@; @Ǜ @n@Dž`@ǭ @@k@@@Ǯ@@Ǚ@/@@Ǜ @Ƞ`@.@LJ@F@ @k@@`@;@Ǟ@@@ @ @@x @l`@/`@Ǡ@^@Nj@@g@$@ƨ@`@`@Ƒ@ƌ`@[@ŷ@2@ܠ@]@ō@h@*@`@x`@@k`@ @Ä@@k@ @@W@@;@z@ @X@ @@@@@0@y@3@@F@9@@@A@ @S @@@@õ@Ë@@@w@@ @;`@4@M@@Ż@@Ÿ@@:`@@B`@Ʀ`@ƒ@@`@@k@@6@c@ @P@Ư @Z@Ǘ@U@ǜ@@t@@S@ǎ@M@`@Ǧ@Lj@~@E@' @@@@I@@1 @=`@c@@ȓ@@@)@`@!`@?@Ȅ @O`@ @@T@@ `@Ā@ @@A@@D @Ǟ@@@@@@ƿ@7@@`@@@ƴ`@Ɵ@ƚ`@, @[`@@@l@@@֠@Ė@@P@@-@À @ö@T@@;`@`@2@@e @@@{@@P@@@y@B@/@@ @@@@@@ @°@#@" @@@(@@@@Ԁ@@@`@8`@@@/@%@ƹ@{@K @Ʃ@Ƒ@@ƭ@@2 @{@@ˠ@[@@ǟ@q@g@U`@Ǡ@@J`@@@@@à@>@L @Ǩ@Ѡ@@@@p@m @_@@Z@L@ @@@@ȓ@Ȥ@@Ȋ@ȕ @@/@Nj@@<@ߠ@`@@@@i@L @`@\@S`@;@3@`@-`@&@\@p`@@@@@@0@x`@@@N@@n@@Ĕ@l @`@Ø`@J @K @ @˜@`@Y@@ @Q@@܀@@y@@n@P@o@`@@@y@@{`@¦@@]@@Ö@ɠ@@ @@ @3`@Ł@z@@@`@"@@@@ƚ@ƚ@@ƶ@ @@T @@@@@@@`@Ǣ`@t@1@@Nj@Ǭ@F@^`@`@ @ǭ@@Π@@`@Ǧ`@@X@nj@m @ @Ǽ@@9@ @ș@@@@ȹ`@@@ @E @A`@6`@ @"@@@@2@Ǽ`@dz@@`@}@X@ @@@ǁ@`@ƒ@@y@@Ɣ@@@ƚ@@@Ƞ@@@Ů@`@[@4@F@>@q@z@ö@Ø`@= @¾`@b@@@ @ @@@@@y@~p@@9@;@f @@@@] @ܠ@@]@ @'@` @č @@@@o@] @Ň@@@@@@[`@B@`@J@@`@A@m@0@<@@<@@>@|@i@ǯ@y@ @]@@ǽ @@`@@@E@ǩ`@@@@ȳ@@@@K@@Ȝ@>`@[@$@ȅ@@ @k@s @>@Ȃ@ @ȁ@@ȫ@@_ @@@V@Ǟ@@@ȫ@>@@@L@@6@@ @`@~@@k`@H@@7@ @ @Ǝ@@@j`@Ű@@@9 @ @C@m@@Ĩ@]@@!@@@@Ì@¶@@º`@U@ @@@@@@8@~@@*@@@@y@`@a@@@@â @û@@Ą@@`@`@o`@@Ű@>@.@@@΀@V@Ʒ@i@Ƶ@ @@@)@@d@* @ǖ@`@t@@^@@Հ@}@ @@7@@@~@Y@"@`@$@ @-@1@@@@F@L @F@@.@@n@@H @ǻ`@l @7@ǰ@5@ @-`@% @ȉ@`@`@&`@@@@I`@*@`@ƀ@Ǡ@A @ @ǂ@E@@J@@ƿ@u@ɠ@=@&@Ł @ž@t@C@@@d@\@L@ `@t@@ @§@@@B@@@@@@y@@{@@@@@b@F`@@@@³@h@G`@`@`@3@f`@ķ@@ @ū@p@k@@ō @Ũ`@ŷ@@n@@@.@Ƃ`@@@e@9@ `@D@@Q@@@dž@L@V @8@ǣ@ǎ @@@Հ@ǣ@i @: @3@f@@ @,@@@dz@T@@I@C@@4@@ȑ@@>@ȕ@U`@@@B@i@Ƞ@Ȼ@d@I@@ȷ@@@@F@@ @W@@@,@@@*@< @ǹ@@k@Ǣ@M@x @`@ƌ`@@ @q@Ƣ@@@@ʼn@k@o@@@k@@2@@i@@@š`@p@ @8@ @@@@@{@@@@@z@J@2@Ġ@@@@@î@@A@@@ğ`@ı@`@7 @Ŗ@ź@@Ŕ@@œ@O@C@C@@l@`@6@@!@\`@%@g@W`@\`@Ǧ@ @Ǒ@Ǥ @L@ǻ@w@`@ǫ@G@ @N@ȃ@S@;@`@Ǒ@U @D @ȼ @@@S@|@Ⱥ@ @Ȫ@Ȫ@@z@3@@@J@@ȕ @. @@@?`@ȋ`@3@^@ @Ȉ@@~@Ȑ@ @NJ@6@@`@Ǔ @@R @dž`@l@'@`@l@@G@@@Ʒ@(@@ @@ŭ@_ @@ @Ć@đ@@@G@;@@@@S@@@@D@@@&@3@@@@@@@3@@@A@#@@`@@@@Ā@@ @D@.@Ń@Ş@Ŋ@Ř@@@Ɩ@ƈ`@ƍ`@@}@@@{@% @+@@Ǟ@@ǎ@ @@݀@Ǚ@`@Ǧ@@b@@Р@@@@@ @ǩ@@H @k@@@@Ӡ@T@3@&@@@Ȗ @y@ȑ @Ȕ@ȼ @`@a@@9@s@Ǡ@@@@-@@Ƚ@@ȋ@9`@@ @S@ȕ@@@ @H`@@Ǹ@ @@Ǐ@ǁ@%@@`@@c@@P@@S@`@`@Ŝ@@`@ļ@J@k@`@)@`@ @;@@@ @> @E@y@d@yd@}X@~@@@c@@@@A @@`@Ӡ@@-`@=`@ă@ĸ @@S@m@Ű@`@Ş @@@*@Ɛ`@@ƛ@@a@@@@Ǜ@@@]@@@i@ @ @@@v`@ @@l@ @v`@ǐ @V@`@@ȁ@c@@@9@l@V @ @E@@1@>`@@@@@@@Ȱ@g@@@Ȟ`@@ȷ@Ȣ@@f`@,@Ȇ@~@@@y`@t@`@V@^@6@/@W@Ƿ@ǻ@Ǣ @a@@G @H@@@-@H@@@k@@'`@@ @@Ņ@-@ķ@@Ě@@@@Ó @6@@@a @@@@@A@@|x@X@E@]@@@P@ @`@@<@¢@:@{ @û@@Ą @S@@@6@p@>@Ň@ @X`@g@ƞ@@@ @ @@€@ǟ@~ @Ǧ@Dž@p@@Dž@G@q@`@$@ǹ@@ǩ @@D@Ǻ@V @Ǐ@@@@@Ǘ @S`@8@@ `@@J@Ⱦ@@@u@R@Ā@c@ȩ@} @@x@Ȩ@r@ȱ@@Ȑ @Ȑ@@j@Ƚ@Ȧ@ȁ@ȣ@@O@@Ȭ@a@@Ȇ@@@@@`@LJ@@r @ƚ@@@`@*@@@ @ @@ @)@F@^@ò`@í@@#@t@@.@@ @@@@@@s@@@0@@@@@@@2@d@@Ê@y`@ @@k@@@ƀ@N`@B`@Ź@ʼn @@~@<@@@@-`@2@@ƺ@@@ǫ@@}@nj@Ǹ@ǰ@@dž@@p @ @!@@ @@@`@ @J@`@@@z @ @@`@$@]@@ǵ@@O@Ȕ@ȷ@@@"@ȿ@ȱ@#@<`@@@ȅ@I@@@@@V@@@`@@ȣ`@}`@ȍ @I @u@Ȅ @ȉ`@;@ @@@@@@nj@L@@DŽ@]`@<@-@@.@W@`@@@@ŋ`@Q@@č@h`@í@Ù`@) @ؠ@ @@ @i@@@Ȁ@{@d@@@@3@@@`@*@…@`@o@f`@ @@@`@@Ž@@,@ň @ `@ń`@J@# @Ƴ`@ƭ@Ɲ`@1`@Ƶ@@À@ƹ@E@]`@r@@Ǜ@ǘ @Ǜ@Ǘ@@@W@Ǘ@Ǵ@ǡ@%@ @Ȋ@a @@"@h@b@Ȉ@@Ȓ @G@Ȑ@k@Ȑ@@ȴ@ǔ@@@@ȉ`@@ȱ`@`@]`@ȁ`@ȿ@@@Ȏ@@@@ @ @[`@Ȭ@X@@@@i @ț@z@Ġ@w@@ @l@@@Ǵ`@@ǟ @J@@`@`@ @@;@B`@@Ӏ@?@š@@Ė @~@m@@ì @O@@@—@`@@ @@ @@@@{D@@@E@x@@@@@@Ā@Z@ @ @Í@ð`@?`@'@%@o@@@ @2@c@Ž@@`@@@ @n@q@@@ @@@`@Y@@ @@@N@Ǧ@ǂ`@Ǔ@@@@@@Ǭ@@Ǻ@.@T@X@ @Ȓ @@Ȓ@I@@j@@Ș@Ⱥ@΀@Ȗ@V`@n`@ȋ@Ȣ@@@@@@@ @@@@@)@@ȃ @ɍ@Ƞ @@@! @p@@ȍ@@@Ƞ@ȳ@p@ȥ@8@Ȼ@R@&@`@@n@g@5@@i@@-@@C@Ƈ @ƫ@Ư@@@P@ŵ @ŀ@K@N@IJ@Ą@=`@Ý@x@@@ @D@֠@P @:@@ @\@@:@@@@@L @Ӡ@À@@@j@@ `@@L@ä@`@ą@|@@@R@?`@@h@ @@'@'@Ə@@ƻ@'@ƻ@@@ƭ@ @@@[@T@ǎ@ @ր@à@@j @@@p@@)@@ @ @@ȁ@ȓ@E @@@`@`@@@d@ț@Z @Ȑ@Ȫ@ @@i@@U@@@q@`@`@Ƚ @ @@>@Ȋ@ @ȝ@Ȁ@@W@ȥ@ȭ @Ȏ@w @@@3@ @Ȟ@@@@a @@@J@@q@@@ހ@Ƌ`@@Ƃ@@р@ՠ@ @@@@|`@İ@R@ހ@^@ @@@&@4@j@@g@@@4@@@u@@@@ @@@؀@Y@i`@@Q`@a@?@}@+`@Ĺ@/@ǀ@Ź@@ @ @Ƌ @o`@ƥ@H@^`@@@DŽ`@@2@ǫ@7@x@Nj@@`@@w@@@@`@t@ @@m`@)@ @ǭ`@N@;@ȩ @`@k@@@@:@Ȫ@@%@@`@[@Ȉ@ǰ@P@u@Ȩ@r@@Ȧ`@@@@ƀ@@Ȕ@@H @`@1@@ @ȃ@ȩ@ @"@ȱ@@LJ@3@N@D @@D@ `@ @Ǧ@Ǯ`@Ǥ@ǚ@ @Ɯ@h@@m@U@@@j@\@H@,@@ĵ`@@ã@x@/ @€@ @a@@u@@@@@@zD@@@@P@@^@ @,`@v@@:@Ó@Þ`@)@"@_@@Ĭ@ @}@A@Ŕ@ō@ŀ@@ @@ƚ`@k @ր@ƀ`@@@@a@Q@Ǔ@)@L`@e@Ǫ@2@^@@@@@@:@<@ @0@-@%@@@@T@Ȍ`@~@@@q@@@@ȗ@@@e@Ƞ@ș@@@j@@@@@@8 @@@@=@@ @1@V@@p@@@^`@Ⱦ @@@@@ @@π@v@@@ǒ`@7@`@@@j@ǝ`@Ǣ@s@ݠ@ @Ƭ@@+`@_@>@a@@ʼn@>@@ć@s@Ç@ø@(@@@ՠ@̀@@@@{@|@-@@E@@@_@m`@@:@@@@F@@@@@@/@İ@ @ @@.@s @@@ŵ@Ƌ`@ @T@@v`@ƨ @Ʃ@ƾ@@^@@`@I@Y@Ǵ @@v@@c@ @Ǵ@@@@@0@@Ǘ@@4`@S@ǝ@Ȅ@Ț@:@'@Ȍ`@`@`@b@ȃ@@@@@g@R@@Ȝ@F @ȇ @J@`@@+@%`@ @|@@@`@T@@@Ȧ`@Ȱ@@ @Ⱥ@@ȴ`@@d@Y@@Ȣ@`@ȯ@x @B@@ǁ@@`@ǚ@ǂ@@D @ǁ@r@#@@@V@@@`@@@@@@İ@x@@\ @@X @"`@R@`@I@}@ŀ@@}@\@k@@@@:@נ@\`@`@±@²`@X@@ª@@4@ì@1`@k@u@ę@@ @w@T@@x@@Ѡ@3@@ @ƍ@@Ƭ@`@C @@k@ǂ@@Ƭ@@@@@1 @}@dž@Ǻ@@@@j@@@ǎ@@@E @ @ȝ@@@ȇ @;@ȯ@{@Ȳ@B@c@ @@@|@~`@@@Ȳ@@Ȯ@@@Ȳ@@@@@_@@ @ȉ@ @h`@6 @c@$@d@@} @@ȗ@@J@E@^@@Ǹ@#@@H@X`@ǟ@W@Ơ @C@@@Ƨ@@7@D@Š @@F`@: @@Ě@@H`@@à@(@_@@F@7`@}@@@@@!@@?`@@}@@ @@u @`@`@n@ñ@ @e @ @B @Ċ@@@P@Ŕ@Ġ@@-@B@\@I@ƙ@@@ @Ƽ@x@p@Dž@π@]@b@@Ƕ`@=@@+@Ǽ`@,@(@ @@ɀ@ @Ȩ@@ @J @3@@Ȩ@@d@@6`@ȧ@@;@@+@.@ș@ȓ@@Z@h@6`@@@@0@Ƞ@ȱ@K@8@@,@@Ƀ @ @g`@:@ @@ȧ@ȫ@^@d @i`@@@@N@@e@@@@}@Ǔ@Ǚ @`@ǘ@\`@P@)`@@@Ʈ @ƞ@{@'`@ũ@Ŭ@_`@9@@٠@Ď@S @Ñ@@@@ª@@?@@&@@@@:@>@@T@W@@@O@@@@ˠ@@0@m@@@2@+@C@Z@@@S@ @Ō`@ @Ŵ@U@=@9 @[@E`@Ʃ`@ @Ƃ@Z@!@#@@ǚ@nj@@`@K@ @@Ǧ@Lj@@9@@A@@I @@(@@@Ȍ`@ȁ@ȩ@ȼ@@@@ȼ@ۀ@m@@j@ @@@@@@U @@@@* @ @ @Ȗ@@@#@ @@Ȃ@@@Ȏ@@@Ȼ@@ @ȷ`@Ȝ@y@M@@J`@G@ȋ@`@g@@@@@2`@@F@`@;@B@@"@ƛ @u@_@0`@@Ť @~@@ĥ@6@>@֠@ր@V@+@@`@@@@@@@@@"@ @ @@@ @@@@ @π@٠@ @2@ @ą@@-@n`@k@@@@Ų@@_`@#@j @ƕ`@y @ @ @@f@@ @l@@ǻ@a@@`@@`@*@`@#@u@@`@D@ț@@9 @`@p@*@@ȁ@w@ȧ`@ȵ@B@&@ `@Ȃ@@`@ @ @Ȁ@@΀@ @ @@ȭ`@@@ @@ȣ @.@F@ȣ@ܠ@ȑ@ɗ@@@ @W @-`@Ȼ@W@@I@@@ @ȅ`@Ȧ`@Ƚ@ `@`@7@Ǽ@l@@K @*@@ @Ƶ@k@@{`@@Ɣ@@0@+@U @b@@@@`@@@_@@@6@@=@f@Π@&@@@y@@]@@@p@@@@@{`@Š@» @@i@ @`@@ķ @G@ @z@`@ @`@@@@"@l`@@@X@ƨ@@@@E@@7@V @O@`@̀@ǻ`@ @`@͠@Ȇ@@2@s@p@`@ȉ@ @@y@r`@ȧ@@E@L@ȱ@Z @@Ȅ`@@Ȁ@@ȏ @Ȏ@@!@`@@R@@@9@R@ȏ @`@@@f@@Ȭ@@ș@@@@ǹ@@Ȣ@E@ȟ@\ @\@@@@@c@`@@Ǥ@NJ@ǁ@l@@ǂ`@@ @ @ƿ@Ɛ@Ƣ@@ŏ@@q@&@@đ@[@@'@@J@@`@@>@@zT@z@@@@X@ @@@@@׀@~@§ @;@I @>@t@ @@@7@ @@ī@\@0@o`@ő`@ŝ`@Ś@2 @@@7@ @K@ @$@@Ʀ@΀@o @'@@A`@r@Ǜ`@ @ǧ@@H@"@%`@=`@@@f@ȣ@@ @Ƞ@@^@ȑ @d@ȁ @;`@Ȇ@ @ȸ@@ȝ`@@Ȣ@@ȭ@Ҁ@ʀ@ @ @@ɠ@+@@^ @S@Ȼ@E@@! @@%@ɝ@K @`@@@}@ݠ@@@@@@n@e@@j@@ȗ @ȩ@W@Ȃ@i@dž@`@Q@V@y@r@@ƣ@ƾ@Ʋ@@Ʋ@@:@I@L@ƀ@Ś@ `@ `@Ġ@c@@@@E@ @@z@c@T@@Ԁ@@{$@z@@h@€@{@l@@@ʀ@@¢@ @@Ã@é@é`@@R@Q@@ @@@ű@o@h@π@&@@`@5 @`@>@@@Q@)@`@@Ǿ@Ǖ@@3@Ȃ @b@@Ǣ@@@݀@a@1@ @l@@Ȇ@@z@Ȉ@ȗ@@ȸ @ȵ`@@@ȅ@@@ȱ@i@@1 @@Ȏ @ȴ @]@@@@@ @ȷ`@y@@ @c@@Ȟ @@\@9@ȉ`@3@ȷ @q@ @6@+@ȩ @/@@ȭ @/@`@ǒ@@ @@ǭ@@@ƥ@@`@Ƙ@Ɓ@T@@ @Ř @W@*@@r @@@Ƞ@˜@@@G@@Q@)@{ @{8@2@@@@@؀@d@@ @@`@ @ @_`@A @?`@f@ @z@@Ģ@@€@@ľ@@m@X@? @ @Ũ@Ÿ@ @(@Ɖ`@`@i@@@`@@Ƥ@v@M@NJ @ǽ@Ǔ @ǻ@`@U@€@j@/@0@,@ȡ@ț`@+@@A@'@@ȿ @c@@@Ⱦ @Ȝ@@Ⱦ @@@@@@ȑ@ȵ@@@@Ȓ@[@ȿ@@@@Ƞ@Ȣ @#@9@@ܠ@@ȥ@Ȃ@ȓ@A`@Ȣ@@!@`@|@S@@<@ȧ@ȥ@w @@@@dz@{@ǥ@5 @H`@@ @`@g`@Ə`@E@@ŵ@;@t@u@@O@@:@Ö`@W@–@@ @@@@@{|@{@M@@@@@@@@K @ @[@}`@Ҁ@T@r@ä @@4@-`@0 @Ğ@ċ@ĥ@,@W@ſ @Ż@Ŵ@S @@L@N@ƙ@ƅ`@@Ƭ@Ƭ@@ơ@<@8@ǀ @~@LJ@@`@Ǿ`@!`@p@Ȫ@"@Ⱥ@<@ȹ`@@`@b@Ȟ@ȡ@@@ȑ@@ȑ@@Ⱥ@@ȯ@΀@Ȉ@ @b @ȩ`@ȝ@ȩ@ @@T@C @:@@ȭ@Ʉ@@@ȕ @#@@ȸ@@Ⱦ @ @[ @ȷ@@@@ˠ@DZ@@ȑ@m@R@@`@Ǘ@ǒ@Ǟ @@C@@@@@π@Ɓ@ƣ@@e@Ÿ@ő@ź@@@@Ĉ@?@Û`@@Ӏ@@ @l@@d@|@|$@@@@@@Z@ @E`@@@Ÿ@§@@I@@ó@2@@-@Į@Ē@`@. @Ĉ@#@n @Ń@ū@4`@X@@` @m @Ʊ@0@&`@@Ƅ`@'`@@&@m`@* @\@ @@@NJ@@@3@@C@@@@ȫ@Ѡ@@ @ȯ@ @@ȇ @l@`@À@ȑ@@Ȑ@ȵ@@(@|`@@n@@S@?`@~@ @@@G@`@"`@ @Ɂ@@ @t@j@+ @Ȥ@@ȶ@\@@Ȣ@@h@W`@Q @g @@u`@<@@ @Ǧ@ǰ@v@= @z@@ƭ@Ƙ@ư`@Ž@y@@Ű@U@^@G`@4@'@ý@`@ @'`@O@@I@@|@|0@@@ @@@K@@Q@ɀ@ @‘ @܀@@7@Ä`@`@A@ @@Ě@ļ@@Ĭ@ġ@ @=@p@Ų @@' @@ń@ `@Ƽ`@ƕ`@D@@@@@@$@/@@ǡ@`@ǰ`@n@ @@Ȓ`@@O@.@@ș@f @ȟ@DZ@ȱ@ǖ`@ŀ@I @Ⱦ@ @ǀ@`@@f @ @6@@9@q@ @Ȣ@*`@/@ @Ȋ@^@@Ɋ@(`@B@@Ȑ@g@@@Ȗ`@Ȭ@C@6@ @2`@l`@X@k@@j`@Ȃ@@`@^@ǻ@Ǐ@ǃ@y @ @ǂ@.@z@@f`@ @@[@@ń@%@@İ@K@@@c@@@@%@@@@@@}@@|d@@@@@J@@@D`@@ @Y@@Ž@Ä @2@o`@È @ö@@A@@@@@@a@~`@@Ņ @Ŧ`@ő@@ŷ@=@@M@@X@Ǝ@@ @@ @@Lj@ǖ@ǰ @K@Ǡ@@ȋ@-@Ǩ@e@ @J@@@e@@ȁ@ȩ@ȴ @s@|@@8@@@ @=@ȷ`@%@Ȕ @Ȫ@@ @ۀ@@@@`@7@@u`@@@7@ȳ@@@@@Ȗ@K@Z@ȟ@Π@ȴ@@!@l`@@`@v@X@@ȝ@@Ǽ@2@u@X @@@@4@n@;`@ƣ@i@B@@@@@}`@= @@v@* @ @Y@-`@@[@`@^@f@}4@|D@e@$@#@@@5@Ҁ@"@@8 @O @ @€`@@,@@n@@Ù`@ö@_@i @s@ @@@ @p`@@ @@Ő@@@@@@@@l @Ʈ@@a@k`@À@@T@@s@@dž`@@dz@y@NJ @@\@@@c@dz@@`@Ȅ@"@Ȗ@9@ȡ @@Ȣ`@ȗ@@@@f`@Ȝ @`@@@Ș`@ɀ`@@@*@@Ⱥ@`@`@@ȯ@T@@ȸ@}`@Y@Ȥ@@@Ț@@`@x@Ȇ`@`@z @R@@@@@@@ @@`@ @ǃ@+@@Ƌ`@ @I@@o@@@@@U @p@`@ğ`@ď`@ @m@@~@@@@@@|p@{@'@@*@@@L@@@@@``@@t @¯@@`@°@@U@>@Ë@@)@,@#`@> @@ā @P@0@@@6`@Ű@܀@Ŗ`@Ŕ`@D @'@ơ @n@@ƃ@Ɠ@'@ @4 @S@@ƪ@Ǟ@R@p@w@`@Ǧ@ș@Ǡ@Ǜ @@@ȕ@@t@ȧ@=@2@@@Ȯ@ȩ@H@ @@@Ⱦ @m@ `@f@@ȯ@0@@€@i@) @E`@+@ @Ȣ@@3@4@ @Q@M@+ @0@ @@@@Ȩ@@,@ @[@a@@O@/@2@@Ǧ@"@e@]@V`@9 @`@`@Ƽ@Ƃ`@@@ŋ`@@Ƞ@@Ĉ@@Ğ@Ĩ@@@f`@@>@@@`@@@D@|@z@@@@A@0@@@@/@ @ܠ@@€`@@@Ӡ@S@W@@×@i@@%`@Z@G @ĕ@ĝ`@@N@e @ @@@Ň`@ţ@@@`@@Ɩ@p@Ƒ@ƴ`@ƿ`@d@Y@ @5@Ǔ@f@i @Ǯ@Ǵ@@@@@@@=@ȣ@2@x`@Ǯ@P@Ȱ@ȉ@X@@r@ȳ@Ⱦ@@@ @Ȧ@@A@@@@@A @@ @@ @ȱ@Ⱦ@ @1@@ȡ@@@p`@p@s@`@E@@ǡ@`@q @-@@9`@@"@Ƞ@Lj`@D@@2`@f@ @ @B@*@`@)@ŀ@Ŭ@0`@`@@@ @i@%@;@@@@@@@@z@y@@@@@`@?@@`@ @@@,@@6@½@¨@ @I@ß@ú`@&@'@@v@ķ@@@ĸ @@@Ń@P@š@@@Z@.@V@u@ @@@`@S@ǂ@=`@@@P`@@I@Q@#@ @e@@ @@@ `@H@3@"`@l@ȅ @Ȁ@@@ȉ@@ȭ@`@`@`@ȋ@@@@ @@@@k@$@6@@@@!@@@@'@@`@ȉ@ @K@E@ȕ@~@X@N @O@]@%@]@ @@Ǻ@Dz@Q`@Ƨ@6@@Ʃ@%@`@Ɵ@6@Ź@=@@x@@ĸ@>@@@R@@@0@@@@@@z@y\@3@@@@9@@@@@N@ @@@K@g@ @@9@ì @@î`@ð@@ď@k@Ĥ@@Ī@# @^@ŕ@@ŕ @6@ż@š @@t@Ÿ@@h @@/@`@B@W@Ȁ@@@ǖ@`@ @@`@`@Ȑ@ț @@@@@a@Ϡ@W@@2@@@ @@ǩ@@Ȩ@ȣ@`@/ @`@x@@ @@`@ɀ@%@l @ޠ@@@ @@Ⱥ@Ȗ@Ȍ@Ȏ@ȵ@Ȓ@ߠ@`@ȸ@ș@X`@X@\@v@%@k@@:@@Ǜ@@d@@@ǵ@ @Ƣ@@@+`@@ƴ @6@+@M@ @ @Y`@ۀ@F@đ@è@@ @ @Z@@@@z@x@@'@@@<@b@<@z@@2@L@@,`@m@܀@t@E@L@ð@ @&@@&@@Ā@@Ě@Š@,@@W@z@:@@l@@@@ @@S@9@@Ƙ@V @ @@@h@@U @Ǖ@@@@2@s@@Ƞ@]@@@T@@ȃ@@v@T@@P@0@ȧ@@@@$@ȩ@N @A@@ȸ@Ȥ@@Ȕ@I`@@y @[@@ȩ@@P @ @Z@ȿ@Ӏ@o`@ @@ȓ @ț@Ȼ@@@ȝ@@`@u@Ȇ@Ǻ@à@I`@@@ȍ@`@Ǧ@@@@@x@G`@W@@A@܀@@Ɖ @Ɖ@=@@0@Ű@@`@:@@@į@[`@@V@³@P @@]@@@y@+@@6@@8@@`@z`@?@@1`@K@ @9@_@¯`@ @@Ê@@@@@ē@@@@*`@6@"@`@}@_ @@ @ @Ʒ@@Ƽ@u@@T@q@7@ `@@| @@ǣ @@ `@%@Ǩ @-@ȩ@a`@0 @ȋ@]@ȍ@Ȃ@W@Y@Ȑ@Ȟ@M@K@S@@ @@I@@@G@i@@.@y@@Ȏ@Ⱦ@@@@ @v @@@`@@U`@ȸ@z@ȡ@O@x@(`@Ǥ@@@ @@@lj@@ǵ@ @ǟ@@n@ǯ@{@@@ @{@@-@(`@ų@Ŝ@ @@@ĝ@ @@0@h @`@?@<@@@@@E@@@@@@`@@t`@@ @Ÿ@q@@´@@@ý@:@u`@@@@@a@Y@@< @"`@;@j@n@@i@Ű@@@Š@G@@(@@@ƚ`@Ʈ@@À@Ƶ@`@; @@a@H@ǀ`@ŀ@̀@% @Ƿ`@n@۠@@@@`@=@@٠@@Ȩ@@Ȍ@@*@@s@ȟ@ȕ@1@@Ҁ@ȶ@*@Ȧ @Ȕ@Ȭ@&`@ȋ @I@@@@{`@`@ȡ@@Ț@@ț@y @A@@o@Ԡ@Ș@-@@,@h@ @ǯ@@ހ@Ǵ@@ɀ@ǃ@@N @j@ `@ƭ`@Ƹ@@@@@d@ţ@`@Ą@ڀ@@@Þ@@@…@@`@@@ @@N@@@5@m@t@@@ @@*@@@@V@@@@@ì@@@ @@E@"@ě@ī @ @&@@.@Ũ@@@L`@M@' @ `@ƥ@}@ƍ@ŀ@@@@@Ə@@ǯ@`@ǟ@LJ@ǯ@@@C@@@a@>@ȃ @j@€@ȥ`@@s@@@ȥ`@Ġ@@ȿ@Ӡ@ @ɉ@/`@E@@@@|@ȟ@g@@@@@M@ȧ`@@Ȱ@@`@0@@@ȧ @G@w@@Y@@@ @F`@`@ǔ @ǭ@4@@@Ǘ@Dz@D@*@@@2 @ƌ@@ŀ@ş@<@@ċ@]@ހ@Å@@`@H@j@@C@@@n@~d@@@@@@@@e@@@`@@@ @R@Œ @@‹@/@6@@ò@@@2@@`@đ@y@ĉ`@@m@@@@Ş@r@@@@@_@ư@ʀ@`@̀@Ƹ@)@@`@" @w@@d@ @?@Y`@@ @@T@%`@ǹ@@@a@ȧ@D@ȃ@@Y@`@ȴ@@ @@ @@@ȝ@ @n@Ʉ@~`@Ȥ@Ȣ`@ @@>`@ȱ @]@Ȇ@Ȣ@@Y`@@@R@@@@Ȕ`@i@Ȭ`@=`@|@M@@@@ @@Lj @@H@@ @@@@Ƙ @@`@@ `@D@[@S@@n@c@@۠@ @_ @ @ @@@D@8@z@&@'@t@@@@@X@@ @@;`@@@™@¹@³`@=`@@@å@È @Ò@6@@@ @\ @|`@ @;@5@Ŋ@@:@:@ń@Ŵ@!@@ƭ@g @ƽ@ܠ@ @`@@t@@m@@Nj@@@ @w@`@@2`@ @`@H@@ @<@V@ȡ@~ @@@@h@@ȳ@ȩ@3@@Ƞ@(@1@@@ȱ@@ȸ`@t@ȼ@Ȯ@ @ @ȣ@@Ȟ@@Ȧ@3@ȡ@ @@r@`@@@.@@@I@@@Ԡ@f`@@@@@v`@@U`@0@J@S@Ƴ@H@@Ř@@\@@@u@h@@@C @ @!@@ @@@@|x@y@@@@@@@@l@@@o`@ @`@)@§@-@@`@i @è@@@@@@-@>@t@@@`@3`@]`@Ś@ő@Ł@ۀ@2@Ƴ@:@6 @@ƾ@@@V @ @@l@k@ǎ@@J @S @ǎ`@Ǎ@`@x@@@, @`@Ȇ@Ȱ@Ȟ @ @F`@k@,@@ȷ@Ȩ@U@`@Ȍ@Ȯ@/@@`@@@}@ȶ@ @"@#@@@@@G@ȫ @G@`@@V@@}@m @@d@@<@@ȧ@g@Ȅ@8`@؀@ @@Ǣ@@@ǎ@@ @Nj`@`@ @m@Ā@e@ @Ž@ŵ @6@`@Ģ@0`@I @@z @ՠ@'@@Y@@t @@'@z@@@Y@@@M@@@@b@@@4`@H`@@ɠ@! @@Ö@@ù@`@@ @q@\@`@@M@@@Y@@Ŧ@ũ@Ŕ@@@@Q`@ @:@Ƒ @ƚ@)@A @ƪ@@3@Ǥ @-@ǥ@M@@`@Ǜ @#`@ @,@ @/@@@Ȼ @R@S@N`@Ȗ @{@ @ @ȡ @#@ܠ@q@> @@ȧ@@ @@@ȑ@Ȝ@ȏ@@Ȗ@Ȥ@t@@O`@u@@@a@N@ @ǰ@E`@@@Ǥ@@Ǡ @]`@@dz@T@@a@Ə@@%@Ɩ@=@@@`@`@a@@k@@`@\ @`@Ò`@@”@M@ @ @@@@F@@@@A@b@-@e@@@ڀ@ `@8@@`@T@f@`@¤@ @V@o@=@û@@'@`@Ć@@@Ŀ@@{@@J@@Ϡ@ @@ @+@_`@ƞ@@Ɲ@@Ƶ@^@Ʒ`@ǿ@@q`@`@ @@@@`@@@@q@B`@d@`@@@ȅ@@ȿ @ `@Ȱ@Ȧ@Ȇ@@@x@@O@F@ @}@/@@}@ʠ@r@@̀@7 @`@ȟ@ȱ`@/@;@@ȑ@F@m@I@@@@@@Ǒ@DŽ@ǿ@x@|@@@ƥ@Ɔ@@@m@@ @N`@@ڀ@ `@@Ą@ÿ @m`@@@ƒ@@`@@@@}t@@@@@@@Y@@@&@B@@@@n@¢@ @`@@@@@߀@b @S@c@@Ĭ@@Į@ `@,@ɠ@U@@Ŕ@ō@@ŷ@ @Ɖ @ơ@@Ɠ@Ʊ@܀@>@@.@@:@M @n@ @@ @ǥ@ @x@@Q`@ @@j@m`@#@ @Ȇ@Ȃ @ @t@q@@@@ȇ@Ȅ`@/@K@u@7@ȩ@Ƚ@ȭ@Ȓ@@`@K@ȶ@X@8`@Z @F @ @@ @@@[ @@Ǩ@@Ǡ@Ǹ@@3@Ǯ@ `@ @@ @ @ `@_@`@`@@@@$@k@Ĵ @@@@@~ @¿@2@@`@@L@@0@zL@@@@@C@@^@@@J@@ @2@ @`@2@N@¸`@›@@`@2@Ý@Ô@@å @U@Y@8`@Ġ @@ĩ`@'@`@@M`@n@@@@@J @h@@@3@Ƨ@Ƈ@o @e`@@dž@4@@_`@c@Dz@@Ǐ@@Z@'@ȟ@@`@+`@@Ƞ`@ @F@Ȼ@@Ȫ@X@Ȫ@Ȏ@@Ȍ@6@@:`@H@= @H@@|@`@+@@@F@ȭ@8@ȇ@ @*@C@m@@@W@@nj`@Dz@ǒ`@ǟ@@-@T@ǧ@ @ƺ@@ƪ @1@1@E@@Ż@Ż @Y@&@Ĭ@|@Ӏ@@0@@l@@@@A@@@{h@@ @@@@@@@P`@@@@W@@@@a@6@@@@@H@Ó`@Ò@~@@@@@y`@8@`@@~@@Ŧ@?`@Ņ@@@A@[`@9 @ @t@Ʊ`@d`@@@@@@S @@ @Ǣ@@ǒ@@ @@Ǹ@@"@@@ȇ@t@%@Ȥ@@:@ @ȼ@f@p@j @Ȫ @(@Ȯ@@H@k`@Ȉ@'@@p@`@ˀ@G@M@Q@T@P@@I`@`@Ǧ@@@ǝ @ǜ@@̠@@o@k@A@ܠ@p@@@@@T@&`@@@ŏ @ţ`@@,@č@x@@!@@ü`@@…@-@@ @@@@@@@@@@@3@q@@@@@>@A@@@`@ @e@°@¦@y @.@ä@Â@Ù@Ï@@@I@@z@Ė@@i@ՠ@ @M@, @ž@h@Ű@@ @Y@b@@{@@@@@@π@q@@'`@]@@@dž @@4@Ǹ@@@`@o@@9@@@"@K @Z@v@ @@Ȩ@ހ@0 @- @@@I @ȑ @@ȕ@Ț`@ @Ȗ@X@6@m`@4@3@@`@Ǩ@Ǩ@`@ǖ@)@@@`@4@,@@Ƿ`@@I@@}@ƚ@c@ @Ŏ@ũ@b@e@@Z`@@@Ԁ@r@¶@:@@@@%@@@@z@@@@@@@@@@@|@`@c@|@@@@R@à@ˠ@`@M@m@@É@A @@@=@Ă`@ķ@@IJ`@į@N@M`@Ń@ŀ@y@ő@@H@1@ƌ@@ @@@Ƴ@@Y@@?@W@j@b@Ǔ@@@@ǰ@ @@0@S@@`@c`@@(@@@g @@ݠ@ȏ@Ȼ @@@@3`@k@@Ǥ@@.@@@ȓ`@@c @W`@@v@B@3@@Y@Ȉ@@ǻ@`@g@?@*@b @`@ @ @@@Ʊ@@y @\`@4@N@`@ŧ@@5@ļ@Ď@@æ@`@ـ@A @P@@ @@@&@|X@8@(@@@@@Y@€@~@p@@|@@?@@@@M@|@J@¬@l@K@Þ@)@ @ @@<@Ĭ@$@@Ĉ @@<@ @@G@`@ @@@@à@F @@@H@@d @ƅ@ǀ@@@@@Dž@W@@Ǜ@Ǩ@Lj @ǧ@@@@,@Y@@ǻ @B@ȟ@@T@@1@Ȇ@@ȃ @@ȟ@@1@ȍ@@g@g@@ȝ@s@Ȩ@@`@ @ȏ@@*@w @@.@ǵ@0@ˀ@@ @J@z`@o@%@@ @d@@ @Ư@{ @p@@`@ų @ŏ@ @)@t@@@@@ë@@t@@@@`@&@@R@@@@s@@@@@@@q@@@@`@1@@@@D@d@@@ @`@P@I@ՠ@@@v@, @@@@%@b @U@o@Ņ@@@@k@t@@@@4@p @@@@@`@L@L @Ǧ@R@@Ƕ@ǜ`@j @Ǹ@@@@P@@@+@ʠ@`@Ȍ@ @1@ @ @ȭ@@Ȓ@F @h@l@@@( @X@@@@@u`@'@(@8@ǚ@ @@m`@Ƿ@Ǘ@@`@r@v@`@@@@`@ @Ƨ@Ɯ@@@ @@j@.@`@į`@c@,@ù @b@À@M@`@@@5@@z<@@@@@@@Ԁ@@T@@<@+ @X`@`@@ @(@K@ݠ@@a@n`@{ @ـ@G@@J@n@@+@@@@נ@Ń`@Ŷ`@Ŭ@ŭ@@ƀ@u`@Ɔ`@A`@Ƣ@f @@@@ơ@W@o@@c`@F@@0@@@ @% @ @@&@Ȉ@r`@@@@`@Ǡ@'@@@@J@-@ @@@ǖ@`@" @Ȍ@+@H@@ǣ@Ƕ@c@͠@ǥ@ǯ@@)@ǂ@@@@` @Ǩ@ˠ@`@@ƺ@ @J@@0@*@ŷ@ـ@Ū@@N@@ `@Ŀ@s@"`@ã@@Z`@@K@+@@@{(@@@@k@@L@@ @@S@@ `@@@@@W@c@@`@@@5@@þ @ç@ê@ÿ`@@U@f@`@@.@@@D@ŀ@`@^@@@l@ƀ@a@@ƭ@Ʒ@@#`@-@r@@ @Nj@k`@c@}@ǚ@'`@@ȋ@ @ @@1@Lj@ @$@ߠ@@@@Ǡ@@1@@ǽ@ @@@@ǚ@H`@Ǡ@`@ǟ@@i@9@ @5@a@ǯ@ @7`@M@Ǿ@@4@@ƥ`@@I @@@@Ƥ@.@@`@w@ @ž@S@@ģ@(@@M@@`@ @@@H@h@|4@@@@@@@@@@@(@@@@ @R`@@c`@@ƒ @@@¬@\ @`@Ú@Ü@@'@M@g`@}@@.`@]@ @@+@@)@t@ņ@@ń@ź@!@d @n`@@O`@`@Ʀ@Ƶ@ƾ@.`@ǎ`@,@ǐ@@ǥ`@ߠ@Ǡ`@ @r @%@ǒ@*@Ǎ@@@x@ @N@@@@@ǐ@@u`@Ȇ @Ҁ@ǒ@@ǒ@@@@ŀ@-@`@B @[@ @@%@H@@DŽ@dž@dz@1@ @<@@ơ@2@F @ @Ʀ@@@ƀ@̀@`@ń@C@7 @@@@@@Ü@t@@@$@@y@%@@@}t@*@r@@@@K@'@؀@@|@i@@@@@@ @@A @@@ @"@×@Ѡ@@@c`@; @@@ļ`@Ľ@ @<@@@`@@@Ŧ @Ř @Ҡ@ @ @k @!@͠@@@ƅ`@Ƨ`@ @*`@>`@@ @.@Ǖ@@h@@;@Ǭ`@@@Lj@@Ǡ@ @ @@Р@ǖ@Ƿ@(@@`@i`@@Ǽ @Dž@@@`@W@ǹ@g`@Lj@ǰ`@ǣ@=@ǐ`@@ǜ @t@@(@b @c@D@`@@Ƙ@9@:@@. @ž@@@,@ű@@ō@ @ĥ @Ħ@ @æ@k@ @@€@ހ@@@@@@.sunpy-0.8.3/sunpy/data/test/mdi_fd_M_96m_01d.5874.0005_s.fits0000644000175000001440000044440013203275053022175 0ustar nabil00000000000000SIMPLE = T / conforms to FITS standard BITPIX = -64 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 128 NAXIS2 = 128 DPC_FORM= 'Cropped ' HR_MAG = 3.267 SRC_ADJ = '/PDS22/D19109218/lev1.8_adj/tables/scale_corrections' DSUN_OBS= 149597870691.0 T_OBS = '2009.01.31_08:03:30_TAI' EARTH_R0= 974.0099613754001 BFITZORG= -0.1322317381572 DATAVALS= 773010 BFITZERO= 0.0 D_RMS0 = 12.94453705719 FD_SCALE= 1.985598880261 VCOR1 = 202.1266810565 BLDVER00= 60100 DPC_SMPL= '30 second' ITIME = 0.0 D_MIN0 = -697.1359863281 DATAKIND= 'NOT SPECIFIED' SOURCE = 'prog:mdi,level:lev1.5[1],series:fd_M_96m_01d[5874]' CENTER_X= 512.5087203979 CENTER_Y= 512.05407842 T_STOP = '2009.02.01_00:00:00_TAI' XSCALE = 1.985598880261 T_EPOCH = '1993.01.01_00:00:00_TAI' PLATE_X = 511.5 PLATE_Y = 511.5 DSIGN0 = 1 MISSVALS= 0 ABS_MIN = 0.258091211319 I_DREC = 88115 BUNIT = 'Gauss ' MDI_Y0 = 511.05407842 D_MAX0 = 4644.815917969 OBS_DIST= 0.9743059749992 DVALS0 = 11970300 CONFORMS= 'TS_EQ ' DATASIGN= 1 SPIKECNT= 0 DATANAME= '' XY_FROM = 'SMOOTH ' B0 = -6.028967775337 CTYPE2 = 'solar-y ' CTYPE1 = 'solar-x ' NPIXFLUX= 773010 Y_OPAXIS= 0.0 PIXLENY = 1.0 PIXLENX = 1.0 OBS_VN = -2172.56701203 T_FIRST = '2009.01.31_00:31:30_TAI' CDELT1 = 15.884791042088 CDELT2 = 15.884791042088 T_START = '2009.01.31_00:00:00_TAI' DNAME0 = 'fd_M_96m' Y_OFFSET= 0 MDI_X0 = 511.5087203979 OBS_VW = 30071.50657967 DATAMEAN= -0.1558656932655 S_ANGLE = 0.0 X_OPAXIS= 0.0 EARTH_L0= 130.9643650996 FNDLMBMI= 497.9939762005 DUNIT0 = '' Y_SCALE = 1 DSDS_UID= 0 INTERVAL= 300.0 DPC_CONF= T ROLL_UPD= '2008.11.18_23:38:53_TAI' DPC_ORGN= 'Space ' INSTRUME= 'MDI ' CALTBLS = 'NONE ' SPIKEVER= 1.0 XY_QUAL = 0 D_VARS = 1 TOT_FLUX= 9441803.894222001 T_EARTH = '2009.01.31_08:03:35_TAI' D_MEAN0 = 0.02228362766102 DATAKURT= 24.92583880891 OBS_MODE= 'FD_Magnetogram_Sum' EARTH_DT= 5.461950335749 IM_SCALE= 1.985598880261 ORIENT = 'SESW ' CADENCE = '96m ' SEMIDIAM= 0.004775184017254 NOTE1 = 'Lev 1.8.2 created by fdmagcal on Thu Jan 28 03:01:09 2010.' TIME-OBS= '08:03:02.46' NOTE2 = 'Magnetic Flat Field Correction per Ulrich et al. 2008.' BFITZADJ= 1 QUALITY = '0x00000200' T_BLOCK = '1day ' AVG_FLUX= 12.21433602958 EARTH_VN= -2162.844392718 SOLAR_P = -179.999994991 SOLAR_B0= -6.028967775337 VDS_VERS= '2003.11.18' MISSPKTS= 0 EARTH_VW= 30155.82006376 SINRHOVR= 'Ulrich 2008Version' EARTH_VR= 228.0972436103 MAGNIFY = 1.0 EARTH_B0= -5.98590880219 DPC_CROP= 504.0 OBS_CR = 2079 MEAN_FLD= -0.1558656932655 SRC_ADJ2= '/PDS22/D19109218/lev1.8_adj/tables/ulrich2008scale_sinrho.fits' P_ANGLE = -179.999994991 X0 = 511.5087203979 OBS_L0 = 130.8892913991 ORIGIN = 'SOI Science Support Center' DATA_RMS= 17.52473905324 TBLXYUPD= '2009.02.10_23:17:33_TAI' S_MAJOR = 1.0 DPC_RATE= 'High-Rate' SITE = 'md ' DNOTE0 = '' OBT_TIME= 1612080300.0 DATAMIN = -621.8441772461 SPIKETHR= -5000.0 DATAFILE= 'fd_M_96m_01d.5874.0005.fits' CRPIX1 = 64.5 CRPIX2 = 64.5 DATE-OBS= '2009-01-31T08:03:02.462Z' TELESCOP= 'SOHO ' DPC_OBSR= 'FD_Magnetogram_Sum' DATAMAX = 457.1335144043 DATE_OBS= '2009-01-31T08:03:02.462Z' FNDLMBMA= 497.9939762005 X_OFFSET= 0 T_STEP = '96m ' OBS_B0 = -6.028967775337 DPC = '0x49460FC0' OBS_TYPE= 'MAGNI ' DATE = '2009-02-11' T_LAST = '2009.01.31_22:27:30_TAI' T_REC = '2009.01.31_08:00:00_TAI' EARTH_CR= 2079 YCEN = 0.8819615377808 T_REF = '2009.01.31_08:05:00_TAI' FNDLMBXC= 512.5087203979 FNDLMBAN= 0.0 DPC_STR = '0x49460FC0' DFNAME0 = '%04d ' CMPERRS = 0 BLDVER10= 60100 BLDVER15= 60100 BLDVER18= 60102 OBS_VR = 202.1266810565 SOLAR_P0= -179.999994991 SENSADJ = 1 EARTH_D = 0.9852516623212 PROTOCOL= 'RDB.FITS' SIZERRS = 0 YSCALE = 1.985598880261 DATAMEDN= 0.2486712752086 R_SUN = 496.0480264568 ROLL_TBL= '/CM/tables/ephemeris/mdi_roll.smooth' SQID = '0xc4c0094e' L0 = 130.8892913991 MDIREF = '' RUNTIME = '2009.02.11_00:11:30_UT' DETECTOR= 'MDI ' OBS_R0 = 984.9524058882999 XCEN = -0.01724755187988 DTYPE = 'B ' DSNAME = 'prog:mdi,level:lev1.8,series:fd_M_96m_01d[5874]' FNDLMBYC= 512.05407842 X_SCALE = 1 DATASKEW= -0.4318729113568 Y0 = 511.05407842 FDSCALEQ= 1 EPH_QUAL= 0 S_MINOR = 1.0 CRVAL1 = -0.01731521230567523 CRVAL2 = 0.8854213899321621 COMMENT Data from the Solar Oscillations Investigation / Michelson Doppler ImagCOMMENT er (SOI/MDI) on the Solar and Heliospheric Observatory (SOHO).For informCOMMENT ation on data rights, keyword definitions, and up-to-date reports on knCOMMENT own problems and data quality, see: http://soi.stanford.edu/data.html HISTORY created by mdical Thu Feb 5 13:08:15 2009created by MDI_image_reconstruHISTORY ctor Tue Feb 10 16:12:25 2009An MDI magnetogram zero level correction ofHISTORY -0.1322 Gausswas subtracted from the level 1.5 input image. END @2( D8+ s3;?iY?||@*A>*uM0@!X@%!@)d1A@5X@ @.@@?я %@b* @H{(@@.l@&"P?C/1yD@2|A@%(,&@ ~0?Pf8@ r!p@\OX@%FVN?lB)`L0W@"+@ʫ@l,?g8H'@>6ˀ@[4*0@"^@$#F}kH -pʡ?Ҧ@@& T@}v".@ )W@* @%Ω@3[`+G,lڀ [ 8@ i@37 B#~8 DJ!ZW@ +ʠ?`@@@ë@-t@*@,uyHÔ@?&0#h֖@"fմ' @@8=@&@%L#$)@fm@ &@˜ i )@'K$@(lJ?aԐ@/s@'ob@%(@8_,x@Ąo۔@8@*ֆm :`Az#\];@?ah1:ǹ@ĿE@@J,#k%[?@ N`}21`?.ƀ@BP0 ܝ@"P @@5@' @:p$4@X&3F@*@3{@]@s[@"(?$&d*kw @P@ ? @2w:t?􁂠@06&_@@?@-f/ @r[@-#Re0@qf,@$"0bX@)G@!ׄ? =@OX@%+@ɜaF@BC@ @!ݤ@$4/bLlz@%x*@9F3@"Bp@b@@x?#@& ?  @$"x6lH?.o$'@h6@`&|S1@$3h8@7$Sä@(k(4@[J?n @3)&B@4%"鳈( Ff&@m@?B@@6$S+*/p{t@!h P@&?2p w`@M0a't#d0 ﰮ@?#ߘ@z,b5@9˲,(p?ɝ`@Uh%Ґ@&T!?H< \?Ŝ1(] @@%;3?@q@ I)L@Y* `p`KR8" _?@#!M@'(d(@!@@Ч/>@%@#ܰ,.?c$4Ma@g@qzDAs H 0+H@ ?ì(00چ@):P?p2N, `@*K@N0~"? '@7H@@RsSi6?"Hr@@:l@?3?)%f@H@|y?Ѐ ۀ t@ [@3L@f<{n%g ? @75rV"@!#U@zi@)c@(y@n0?@,ƶ(@"@ E79w0H@6@.@$&@]1@.>X-%'@V@ς)Ln@8@(8@&>f@@-@2])R `@) (pJ]8?`D@ `N0!x]"P@4%*R@g@@ ?l͐@k @yx@Wp5zxht?3?@vG({&Ф@V@8χ@} @r?j+@'@0`]11&@np@?.@"E"Nq@̑@ Q()c@+i8 @@8@'1pH`T@)DZ8@?﫰@& i0@?#@4ng@#>a"zI#v@@wvx@40fw<.@@-P@#t 1u,@6c@-9G@w@-0@Xj8L{܀?N?nr@%y!@?6?@@3*0 !t&?/S@@#nA@ mp@N0ޟ@:F@AOD:8'*d@Z@' @@#106]|@vpm?•%+(,>3 3&fx&c@ k@%C@%4%h@%6@ `4ivd(2-oy@%@"> @.ʄ@<4@0@B*@0@8@@E_Ѯ3{Z-@H@@ 2 @s@*,Ԏ $b@) @<`@5`R+X@R@]@+@T1@F@l?Ӣu?\@|@"cs<#p?S<!h@?ր@%.@g/Ш91 #@$j@%Ң0A@?p@"@!|z?$?->x?‡E@*@@"|@!8{@-h4Z@?B@@(@zH@ v@q"Y@++:Ȱ)k@m@@'!]<vk@x5 @-4?a&@OM3 @>|@Ҁn*@=p@!@'`@"ȫ@@(q$.IL@*6D@*8@ @6z?))`@%H;-@(C`@x?#@@$@gF"@@'r?x@G!G+.? I?q %@ҏ@ =@6(Y{@8bWF!bv?K0(?pc@0#@"3@%l@/[@,p^@!mo`lP@%HM@%ImLI/Y@!0"(@P`K}@\P@!'͋@ @% 0@##*@@/8@0-@Z/@,h8P:0 m<@'Rl@$@0F8@3t@0@"@ӌ@8-r@@?ܘ?s@9,\@,N(@!c@ܠ?@% 6 3x@69,` m7??<X@x\+"@ X@+[@ X?|V@B$({K(YF"+ @"#ep5@6ʉ@ pp` @ V(`*@'Xrw@2!u@$@({@+@4zu4Y`@,lx)N @Jlx%y@.)# C@E@ 6@.P@2(zs'^5&>r@C@5s8@G"!@88@!tB$@%.x>@"br?",@70@ ٕ%o0@6'pPw?ehr +@%?60~0?" N@Ξ@Ҝ?q0?` 9@'~x$R <@C,@[?>$ԷO("@,s(@ h,?h!h(+]@-@))V綐@·@Yp@2,@4{0ћ\@1bߌ@s$v{j@D@ !H@-8@$PP/s:@;%% L@*<'!@[DO0}@@@ 8x9\"@?@iP7 X@ V'X!oV*"NO?͠zH@e7@0$#bU((D6zi@"N)`@'o2"$@+"@(:$w-u>q4@"gω R)h@ 9+@$ @" x@u@!qPp@ߤ@.H&p!9@ń@5B@!?@#a S .?ׁ'?@!u@ o5 @)@'A#s @ٻvk@&H,d !e@Bn@@_@) @$@/(z$ԕ@/$@6@@h` @I@- 1~b@48@'@.qm0@w@-#"0M`!`'|l3)†@*[@K@{ x j?}@&*@*nn@?Q#@h@(%?`цg*@`I`@F?~b`?@":'@4D`@ !@"Τ@ Ch5 \Eb@*%@/0? W0dޜ@8c4 @ː!@l@ ?Յ"j$@@FX!r@ <*i`"+#$'@H2T@dZ@8+8@@@$|Q$u@@+'!#p@%@3ʛ @ @ @8@ C@ F|U"@!^ <\Zp@'eOMh@YZ)@I ")@$99{ $0,@p?R"9@C 9@p@?(~ {@-]6@!@+p@1 @,b -d*VH@">$NpL @T0 8@?l@,(D8?`@HV`#.4+ @B@!k?:5)\>??rY 4&<@\Mx\)./? ?⏣*\!x9@@%Ed-4.@-Ϗ@b] ?@WPl@*XHb1)k@*$75d?ܰ!|&*4@F?@E5@0 8t0?& ːO'@.#hA e@#)Xx 6i%T@SD%?@@($I@ D ?@@@륀4(@@"&@1@C 9c3y@U0@@y[@ oXZh@/ h@%@><,@"CvՀ% @$ @t@ڸ@X@40@/偀@%-z@ נ@7q`)d: @*g@P@D_K0|@ BH@c@%~?$'Cb1ݨ/N5X@#`!h 8@ * ?@$9S7?2@ 琠'L@.s@5@k`@~3@0n75 #3&#\@.̂h_@/Y"@@@P20+ ( [q\L@* (P@"{LƐ(@@It?Ӕ"p )rBg\|?=>@R!.@ =1*X@p>`T0?pK@$2@"Od *0@$Jh@B3 0?X )Řul@@!x@J@F$8<!@"',@@ @@+ j0Ť@%g@$U@ @`_@h@=,@$]4@@#~3O@150?.~ -B@@B7p@2ef@!@$@9}+ ?14W@͇@*VX+h@)V?&7N?M`@3="I@' ?! b+@׀)Y,U ~W@.ۄ Sh@p`@݋ p(@c0j?-(W@&~@7 NN<1@߶0@$!@@bx( 8@qd #"7Va@@.,z-[X?jP@#.礊Yn?um@?z@ |@ 1+R?/@@꧴@l@0@FX i@(v@&ڸ))5+n9<"z>@ [`@=hC@-"X?9L@ ,\~ K@@Ԡh,+rl`$,Ҝ@)k' @GQ~@ @~g@Rf0҇@zX?@!͈1ƥL CK@p|@>͸@ߠ@0o@/@i@Xyx'd=@(@w /r.V@=8@sȎ@@*ؖ@7G@q&]P5fр@#@&b@5Kš+ ?m,,-K@׶@2k|@y`@@`@v)s@(ф@a@#h?ֱ%}t[$TMq@(;?ˀ? "ahf~@@B@@*T) @10?%?א@b2@5# sMj!Ih-0@!@? )fȎ@~@ !_@!@H?V25$@Zx2rAj@@@ g^0@ }X?)$a|0Q,qx?Tx@ /`@ e%&@!*@"R@0Ð.@S!2yH?1X@')@Y`%%$@@6k`(# "l&@)--(F@ -,+B`?g?Fbč|@32@4Ul?`@}< @%;Z 5:U@%@5|3yE\ m@y,$<@@!Qi@ l@6O8@+ʍ@uH@t4']Qa?Hx!@vdj@!<@/9~@|X%WW &|?H11\*Ā=׀@ i @X)@ @ZKdex (\@&"I-#"zפ@#Xm`?Z@ h83x?"~x7L@x2@=< ݹ@9]p-) @&o҉??刀@&k$@'P@&@(ڥH@+;:@%\la@" (<-@3@9Q(@*+?@a0!7t/04/8"@=U0@ r@,AU&_8ޱ4@,n&3v). . PHO`+qP%@6D@?r@A,]m@/l @0߸@R@!x@@@4u+ 1Ѱ@8@8HYkϻ`@ @H@@5kE&@!6,xӀk@-3@j% @C??$??,@@e X`-!?!Pm+K@l@ԟDv x?;Dn,w ւ@|ߙ@O@+oP@LvE?~0?)?u @c`@@֋@?~%q`?ꮉ @',@@$V@7@%@-n#@"`@;QP'i @P@ bB?[?3`5dx@0N ?'y&W%fRpJ &( . @6GP@/+8@9@.@'8@0 V[28@12Mlj,m@@|(N@| @@$,q?Ed`'m5?n@&b.׈@%`@@!Kp@$3\X0@+@!@0,ER9@n[?:@@@ ""?@#?l)JD@ V/ij?FEkP8?y@;#@90M+?]#~@ZjKP@$)ķ@ Pʐ^.v@-@+՜@@9@4BH#@`@#hC*6@0Y@)( @:(h@!_w@C{@% r9Y@<$e,@@0@]@-H槠@H?@+1HT@#0@ 0[@E@&"?Bj0t@4RЩ׀?B`@1K_5X %. @*P7"B$3?c@$es@C(3z@7@/H:@K@ .@OP@\1>hph0@x0l@0ل)2= |p@ 5?b/b6D@:l0F2 Q@ ?0@w@+ƚ@IHR@@ F?Ok@W:L?D W|)Ѽc @ n0@'҂@2{/ Ә.v`@0-@*@\%j@'\c\@Q@'[&*5@@& @%E<@ۉ@@ g@%7@*9-@"@* 3=hD3a̲@2J/u@@4 ?1$"<@!u2}BN ԥ@(J@h@ .b=?[ `@2,Ԁ?(@+{3V@ @)!+2~0(@;"U`@ @[@t`@ A @'f`@ |X?V~%((@-]0@')@(,G U@ H2t@/H@@p@1uz M0@59@1@@o/(C>@? \I[`@&I`@4M@kv 5/@, Aj@8}@(00$6w@V@̤@'ߥ@0k@@,#6<@ B>@ &``;(@s@$c Aʨ@/)@( ǀ?l`(t@%@?_!P?c?X67x(j!%@1L'VD*'@ժ@?P>K@n,.Y#@1 J@|6oM(J4 ?o @+M?PI1lz$##$@J.@-^k@%o_L@t@?`@w[?.M$Job@@@',(@0?0&0@3bȀn@2Ph$@*Vn@ v@g@@/j;@ N?ج@k6hR@,_,"P@::`+L'-0Gw6?p.:@&@39@ @v'tn?8@0T(-H8@1@%;C`@+zu @N6@Pu]AR .?@/&@@C@À@TJ@ *4@*f8A@Q9`6!t@) $\J X ?y #< Δŀ-`@MP@ޢ!Ͻ@ŏ0,td@"G%9@("@6RL@ NRHP@{@/@@%g1٩@> i ՗@ ###'$?7`@0B4?-Szf88(@lFJ@=@!yd 1`gs@'<@@ r@: 0?%@Фp@@Ar@,N)'*?X@*W@^c?#?` |31@Z{n@*Z&=u@%7UM/N@A@ d%/,@5@!,r@Gu@%Wn$@% 6L@|z< ?L4U(@7KC?ڀ?v2@@$\#Yd?Ϙ#: 1[@#3? @.`?b`@'SF?Ȕ 0$@ ֜@_Ho&x1X?@@p.-Řy` GPO!!x@ 68@}@+#SsY@@(k33eɆ@ ڰ@1=@CX@Xc?8@k8@Nh ,B8.@b @t@p@2cِ?҄b@*-?% 3DULaA@(@G P@?s zl(@jd?>$L@6x &RS p;M@PlL!aT@@i@ @'(@VNO!@#@2\P?Lp@ h@ᐴ` ?'@lJ+@?V@0A e@ @W?&@@3##v?㶮 ?Kx@)C}@!O͌@dd(@,d2?,h@# :U@$&"\@'av@@@$&s@@@@?`C@ep!%ܜM?Š(@($a@)@3”@̡+@$w@F@6@4@1#Vt``@ Ӑ?@+P` JFּ0?&@/pۦ!>N\@j0@+(v@2~? @(:n@)kS@^V@*# @`ڬk C|94H@ٜ@@DR@/}4N@@iT@9?X*rB.-18?6Y|@,@X@I@\x@DC/@\L?wg@rU@@M)@,@?(@ԠJvVA\FC+e]Ph@)ļ?*@@{@; 0@&ï?_@),+ ^p@z$+NJ4@he@^@'0@+z lgT@'@0t@H9y,P@_D?=+@ w'4/@@(el@r@3+j]?4w@0;@!I#@Ox0,ͮr@@?é+)g@ dX+d|)4@8*'Q@0?H`@@5?׵'80@ v1@@%3*TH;+p@r@*߮4@@56%,p@@,%p?4@.@4R@T@nQ1?p}?bp?jp@T <(`:@ !f/{p@!t@@h Wg?u- eC mz@;ZH@ @@\P@)Ip@1??]`#q@$#&(@ί@-$@?H@r@sO_?8@"@ ~1#䇵@(9R @ @5@ H>?\8@. o7 & ?w`x@BZF8#x2V&@8x@/ @=S0t^3@'Sn󇃈zTdJ5o".2@1(@/7@ @ qN82`4@ջ8?. !KG2 <Pf84uM@~C@X?-|G@# D@;Lߺ?p?6p#)t2 F@#+|.'@@.K@ m'`q@04*f"6@$&8 C"Ĭ@ߞр@p|#,@SN$5$#5# ?E@'L:@+d@7%`@ Ug@)q$l??-'Jo# gwC?%@4R@) DQ?]p@)E@"˂@0@) @1zϟh (E@ ,P!4@Hx@);@/ݲ1l F3@ @-/f .?)@|&p\@%8@/S3`|@ܕ@ j8@!*S`%?P9膮D@M\ O@O\P@;Tm$?@,e@"]@-#p@p?@#A@ 5>gh^P@,P@) @ yY@=q @T\!\! cL%*0?nIu^@T`2Jd!A3"H@ P@ +Ո!pɻ<m@@b%H.u@} X>!s@'rN@"8? $@1ߊT B#u(@!3p?@{?U!Q !b@ L[[ \@?R VL?bP@YB?A@`?@3xVנ `@,tFT@?` @epfP4bR@X!MJ|'@hKk?a +@.8 4` ͺ@8-R `@- ,,@@dr3b`@˰Ch?~y@H@ @0?뻄@1I,:40CI+?N@Ȥ @#@f1|`@0>#r@i00!@!*W@6Pp%@.e&P@83@5 P@ >6F3%@ ֎(@ @`@F2@6p#h@-@7(v:<[`d ?a@Sx@&@S?/&PLp hz@2?@X@BT&9C@@xN+@&{hEsrm@ aH@@@n@~@^ \Xq?T@~Al;g"6P@?R @ @,a-`YF@" P@u$$.j0@ d@#+')M5@9 -4Lv@Ö#t@(:@`@]l@!ym@"ނ @#0@"U@x@Z!@ qH@ rD :@@(x*@n'C" N0@ؼ@ @AT @)-9@ R+)Ѐ?@0c@$> `@!".c0@0@@3@(@3N8nX@,V @,j@J@"zN@@1ݾ) $&b'=@1MG{i?@ (?#h:@4w@P!tq p\@ L@%z?f);fn#x0!b@Z @SB["ˠ?~:(` H@d@]$7&@8d?L @c(zx; @#3(@R@ R(N)".@$W@^?$RuO)o@2t?1W 8@Jx"@ӸT@6h#(ӈT|@ i%vr@?H n@"l>Aq9?֡@ iWP?j@?hbR@A%< eh?@}@i@*,>(Cr@'q@0@6 ?Y>#%M|@$>@.w l@P,X"&Ө? @ s@@"m@}?ñ$@!t`@tY/;u) ;T< ?3hXP@! @@@ajLP@!Ӽ@ 1@a<@#M,@'lq?e@@e @̚Dy JZ?Mw$ A݀gr9,?@#$~ /t`?Ǻ ԼN>@ R@#[p?=9P?p@0X-@p@ ZX˷L$E @1@?\@!*?؁8@q^w@Pp@c?F@2,r0H@@g: @d@D$i,r\V@k`@I@+B@p?ܥ?s@@"s``zx@?ċK'@-TJ@#bDq(@$D-@+&?c@R![@>I@R@@ A,<( B>A )-@`6@@``!+l0piڲ`@s@/t`u4Y@ )p@!P1&@-!h@L@/d@1wRޠ?m2] @!7`@  @3ci:@'t@~@{@@"TQ8&@lLrۗ)?#3@4XNP@@s?ːL@q@Gр@MU?k@1 F?#>@!e\?{l?P-r 8A@j .@?Ue+@q~@аK?7pm?$;@ ?xL ndԸ0P @.&?[@(qNx@L1~y@-!WL@?)0-o@?ā\@S_!Xg4?@4|S@ s̐-o @ mJ@(: n0@ ;%t&$艄0@+V@Jx ?`@,N@%e#r:7{$@2;@- [\@?h@3P 4W@ PC@?+00)p0^6@@39@0}q@%D@2 @$Oh4?@9gC@@52{t@x5P+@4F*l@9,@m֧@զC[1@:,=x+?V @(x @!@1'@ud@C(L)!@ X`@?T# ɿ`@ K ^T[P@3Vps @mi@x(@ؘ)@z f<?5DO@@@ט@ @ $@&r@=n@R @ t@4@F@PX?}{.0gZ@P8H" m ?+p@ 28@@ 0, @Tv"L?݉-@޹@#[,@ 8HPx@\@*z@1(@#P \Ѐ@$@#X"@@$L[ #T@#/@}? @:9@0 9ݝ??c@.| ',?I@$i@?@`@%b`@&`@"/u@9{+i@@7?L@0%0-\@-:5)q+@OPЀ>0l@@+5P7e?'?m|0#nV@o* @'-R'9 @ R0@'ZT@0ψ@3盠@".ôZ;@'?ٯP( Y{Ġ'$ ԙ= @ x@`@z@@ij@&#z@?@0&&x@E@1l #ݹPۿ!ce@jy0 Oc̒[@0XҘ>%-_pӌ#@@*f??((Z^(ZP@> `@9@ v-k#b6+s`$i@1@54@3p0\9g<z$@&x@ TxOɶ,5o@yx@-T?ؠJ@+=TeL*H@@ e>`@%> <@#M Gq~Ҧ<4.A@ @+`?|@0 92} 7yk@,/P@ (Dx((P6?B-6 ^h@߀"<Y43J@c?.0q`̛ )@kv@ 1|@0 r]ҍ @sV@g" ri(@*7: [L m@ܝ@! q?$@d @&pY@:@# @q@P@JV4m2~@=HqXkU'~$<@>n+"''kl@X"Q#j7?ēF@r  >,@9Of@ #8@-`4Q@M(,@&D@Hz8@d@?hV9@@Fy\+,@ @<@6B+sD?F@@[4T@  .@-3Y]-@y@En?wm@1p E@1T@&_P@>X@T"J`@Aȃ8rX@@!lt? @%x@3F&1k%T @`!Nʸ(E_@A?" 4'4 " @i""H@!.?g(h@v4x@$17:?_`g|j?ToH @-๦h@` #4@@4<|@ `?؜@l?Ѡ?T0J@7@H@=DK R@<- Vss@@p@kR@$.?ď@=lC@ /Ӓ0f@#@@&Q\Q(l@Bl /Nwx.^1 ˨|(͈@"v@ FB`@J8 }@1ǒ`p˔&[=@+!n@ E@.2@$.g`@^@ K 0@&&n@2O/IH?-/5H p (@$^T@/h@6Wj@| )X8#@ ?8@, F'Q@!$ %@@'&@ "P@6C040Ʈ r'  ߔ@:9ԧ@-3  I!ah@w%@x@?.( Jw<`@H"1@@(H@" |)z@e??Sh(Ė?^@@ ~@2mk@@Z@@/bR.u@w0@%@2@.+B@) h?#@@Qv׬@v Z.@ )(%, q4@ o.-@1׷Ʉ6$?{ǀ@wP({#X @*wĀdx4(@+0P@"C@LQ]p1R1E@3(@|.?2V@?ڠ&xn@ .,!VZ<@#XJ%(@%3 @'G @#3@# Rh,@$&@+nw3jX2 ?9)Xt )&@2x@h@0<(.?W0!b\@pa%F?W#([@"@!gD@w@ @}$?\+ Iu@@p3$!"0#@@)<)+lT@-p@)Y@=@$v xxq*P?@ u`1Q']?2@@ ?@zFX?9΀3x)@_l`@LP|@0*3?{0p-l@<?t@&!@f92?V@@ @#?%ݡ@-SI@p@ 6:R@#@BL5F8@#`@'):H?f0PJ?d@!P@@St@1}n4@GGj@(<@w@S@f?Ĥ{@@N=-@ @B2T4U@ .@#׆Pl@%@ƙF@5COp?P'/c@**U@3Q"@ ߌh@>tl@@;.8@ @Q`@* P@w`@.':@QQ @&H0)ߎs7P# Ѐ6@1 /$@0CW y @\@%.@%q^T|`?L@߼@!X<% @P01m?4?״`@;V@IqP?H@;P0"1@/&!x(.$ ?Ō@*`@0L)3%m@(r.t0pOh@ qx Ⱦi *ĶgA"5TF@*4@Bz@/-d@}@ H@&9MP@1l@ e@)4M@#@G@@x@"t̰@ zD@ƭ@Y6h\@!W@2zh mF@HElL?N@)\@(-k)$+Cd7骰J>ӘPn7#z@?PIȡ0 !0?Ġ@ @@V?غ?? 3@& ?qd0l|"M\<[@@?@R@ t@,H@$3B@ ,Mp`. \b-@x?@ ӟ??E@>Ghh@8h@7!bH@"?}8?*ΐ@`t,&!"@ '[ @)rp@ D5a*@)"+D2a@!-@?`@+\@!/@ Ud@y8@7D(p!Zn@(J@& /˷ZC2= @ [1 ˰ۀ-H@3O@p@3/&@-u,A8>|@)H&V!9XI6@$}Q8"~H8E>@ l@+^4eH@Lot<(j@%p׀@$B=@$~L?PR?^`@ G@bXL @ T$ݐ@/f)@%۸"Hw?@@)|H@~e@6@K0@?*~l@p%08@Ck??9 1Y5pEވ@L1]ɰ*[Y@%dPx$!8@i@:@;hn"ږ@¢cS)?@"T'\?+@ Qۀ&tG@-@%@Z2"> @.<@$9@ T3=$@! 0%1iH@@@3&G@$L-7R$@oh@**iT*(@#aH:<>MZ@ @$|B"-B&@*0T@:>L@#e9@3m@0ä#{ ZP@5UG@z9 @!@+2@@ Mܠ?@ @$GO@6 AZ@*n\p@Yh@!+YV@@'(@ 聀@cAP@"÷ ɺ8;k@<@ W<@L+#)$bX@MJO@ A @` aA@ j@ H@k@@@, m@(!D?-)P@ @@J9_@ s?Ě. @ ?뢺p?8m?Z`@d4@ϒ@@22p?Ĭ.U@@ߐQ`@'@)!Ӈ^)B04P:#2] hp@?z߀@p@ ?G5?\@*P0,/U768 q~(@+S0@ ٳ@_@:@(y@(0@1=q4ݘ@!$3N\#i68@4R+f@+@(B@53 @5G( u @ X-(!.@ 0@Z(@qdݢ@?P0@w@3@(1@P!Kޢ%̦2@=w瑷',(?6 1-R@! b @3\@d;@'X@H @RH !@$[Ԋ@X\%/$2݄a*a@"V@Gx?M bcH'p@ i@|?Ĝ i;@#'  %[@o@Pi{( W8@ @#h` ?(?@/#Y]0@N8p?K2Hj@.W@?@'1wD#E@g3_(@~0ϵ(N @۟@#~ڛ*@'L@@@(˥2R#y@@@@*A&$Nx@"h !*^:(?   +Op@$Q ?m? @%\@3&@+i4DX## Q@-V?t kU 4@܀@$q]@ p@ O d@/pP@CRp@&9 ,~?ZP@9"?֗@߱0@8YnC@^KnTf@@^4"z@ r <"!C@L@&e}@ M@9p2ZH@AY@!@.@+q? @(BU@@Xm@_? Z0V@w`|ӂ]@ӌ@%v@:\  @EqP @`@+BY!{y@$Up@@'M@ [0%ńx@ 0{L?T9@,%4?0%b?`,@%щ @ `@ H4@S@~p#h-v, >p5uu@"x@@=@%/k?C?P{ӂ`@ @@+@ %2@!,(00 q*"0%ެ%q?9r_@4k`?@@Jv@6H@ |(7@) t##*y @!i|@ ?,@/;`n? @ _@@(Op@u@w @  @e{9?jj?a@=,~@3X@l @'^D@12 @$&]?fm`oh)@@+C"p@`/kvOan@)?@$o?,@ #.vu?x@mWU 3@@1AX G"?rl@1L@p y@r~n@#Cu?.`P@>8_@G90@""n@""oK-x8@RFp%84,͑?@)@'Gh@"*@<_eBbnql2 wf\>@ $?qPhZ@n @G:0?h0 * &·T@M@WX-?l#8&@z@@' HP@/x y)@U& _@.?j9k @# 9,'A3J@1_4@р`@sr@ s@$@@1"9X@+?@7+@$>?z@({n>@ SP@#:?$49)?@>`@#?ĖrH1߄@T.!~v)F@ ? P@0e@ @#kpu@CIV-,<}䛐@L \?ps 3T?}@k%#)=@$+!˦%l?NT:4S@ bр0Q@(}\+x@<,n`@&p3@~]l@ /i@uP!B@/M= \@% @q_@ <Q@/ٚ@yT@%@F4+G@1@5@Ih#|ܜ@  r0@" Dh@b? (.@!_':@s*(t?Öm%ل @M]@\h@X*@y? @GeTH@ح  'sEذ4qZ@ޠ,s&q,@@ 7?{"UF#2? @Rd b?g lՄ  w@ F*@@,?Ğf@#L'"x @M @ Jh {b@H#z@pv@x,?ĩ2`g&YU@,-H@-#l$4,%B@"v&@@( @\Pv0@'S@D@+@c`@ r@@@2X*H?s`?`?곜)+4@0b(@+Abp)@0`$R?{Ũ+Ȱ"a3@@9xV@)Wp'3,(wX@@"as*QP@.7@@#A@[C8. D0@'{P(="@d0Rn +p@|œ !iLo@$n@7?Q@@ԝ!0I(=(Q70*:[@>3'@10_A?Bv0@L#@ɁXŀT@ +X Jx@(hC (@p`8 y˄*FX@!~@1\@;Pl-F?(X @l40@ vP@>]?2`@ tְ@q@*l?-\?ī Sxte0@H~H@@fJ's5@|@{\rJ@p]@mX)@@@u ^ ?T jl@5@)ތ@@,y#Ҁ@,ԗP@'@0x.?&~?c[h@ Wpm$@'a@XH璐&@P.Bx'@?! ? Π?͸@l8Q!lC@ H@@'\?v@@&8@(H@*v$]@`X@ `@ P\h,"2Xä?Y@1+P@!RRƿz@& :@'_/~T@W :+0 n 㙠?y0@2m@ ?@1%@ <81+h?XZ?XP@lg@^q8@]?3"tH{g(@0jX@/ 2!GIQ??0X@!;x3s@"1V!?끞@qm@!p@,!@'`@^@"o 2.6@0,EJ@/(D@Ƥ@ x @+~d@6?@2L@@@"@@h;]:@˂&R@$3X@*4@_P)@#@J@ q}aX@y@(_!U99ll@l?v;y?^@',F@4@==pE@& @*4?i^@(wH@d@#D @8>+I=ppS.€@u@R8?@@*u@lb@ HGTsx,6H@A`@5b@@x?ة@;@?$Ah@ @[X@)=4@cDq@&LT,LP@3 b@y@뫨@ @`?=?NXX@?_@ @$,޴(dF@&a$9pnT r@@P?M-??Ġ1ta Ʉ?ďP@&p@pH g@ @6@ \?p@j.:h RmQ@">@j$$@UL@'`?䖰0$%}@(sT?Ė@@ XB/@!@+@\R8ML@$a v#ǖ t@ 9@/@ `WSHX(??@? ?8a$@0@Z( "@Ky`@%l*N?^@.װ@p*o. #@bP!!@^@h93@zq@@@z?\@ R6\@ @&@O<?Yp@*Wf@Fx <@49r@{pGY?@?nh@]J@ E0?@L1iP{@aTK@ ?@6.@(_(?+(@@Ͳ@M<@/¦@ 6h@"O&5F0D*0@,=@Of< ,@8D @@"? 9N?PD@ FX@&@?,_8@+Hnl% 1HdG@-SN@!vkj?` Y@ytX@@9P@GG+iW@$@CP+X@E!p3@)T4dD0@}KO02Z@@(V @54k;@A3P!@)C@A U~ ?(&}W?dd?iP@/N@,^@_ ?ӥ]5JJ1`_x1@.+K@!Z]@@&g$@u@@?qoo8 vv?T@1E B  ^91(@,P.A`swx@"@ .d 4@+P "0?qs2@%'@$6@?~@3 @D18[`ӑڱ`@@ ݀O'C)@- ?Ĭa?^@OC@A`&3X?/@"pH`Xr*@2i@ XF@@rL?sP@i@p2Y@@ sCt@@\p86d@E@@+0(6V]@O"<@  x@0R@@3yd@0>.R4S? @n@5@1p@12N2s'yP@" 8-?:@-?Ւ@.W@b(@ᑀ@4@|*,@$gW@%Ī@2D?m0!հ?55@P@M?D z@ c=x#@B.X@6N\=@=@1rg@ҟ@nրԶ*t? @|Ht$}u@%h?߰B@+l@dd} D@$V(@ɕz 0"d??@IY@I,@@$Kn~@* @l۸@ Q@#68?? @I4@EgU ,HS݀?8 ӯ@L/x@ @ n1,=?qHZ?61@@ H ~9|;@p@-,LR`?(Oh@蜹_+@! a@+?g-@>#x@\ eF@`?X@$q/@$;P?@@1(@)v,@+L,+(K@&{x12tu@/8#P@#h@`5@)@,"@ @?)?@2$@2"]??@-;2 xv@ <({ݨ,0c@'wX@@"[xQ@t:0Jd@@W@#zF@!K[@,(!AHv7@PZ(c@{.M?~?)hϴ?i5 ̀p jrŠ@m20@>J@*u1@!RJ;5@ [@Hc@ 5B?"Ӹ@( @ LQ@$Ԧ<-@ ,.T@H3(@;I?z@P9( 8@  @ͻ@@  ?8 {)@X&?`@@H`@WHhB@ vz@t@(R-@r@@,@" !@4R#@F#0  '@#ks?e"`@?š @(?r3p46KF@"Nv@R!?@,8@@+6L$w?ජ@Q@#T(_<@d* JUZ@h k΀#*R?S΀?!e@a.D" 8Bd@ @ E0קP)-@)?.1 X8@#ԁw0 c`@ll@AA$85??x@(@EpX?]e @ w@BEx?>pjo@@P6?#|@Y&l?r?b@@ fO4p)Ֆ,Xӟx@!@cl# @^@L"n+P@LU@ө@?b@"@J~%y@?@,Mkh@6F@^Ӂ@!a ?pQ@)8B?H~"?O!Np@)6eT@Ex0LH@!@.:/<[@?w@ 0=?j ,%r@!$@"$TBes(&@@Op@!0~@@Ř@+h &@2B:@È@(,0,@p@7&p@@%*\@س@X@.\0@0@b`@8D$|&#$@#2+ơ@]P1?j6dT_1 _ߋI ?p@!hI@#:}1%@%0@?z',@/z 无?꾭P@g%q@&>DW.P??M@"'<@^ _`@?#`@ p@@#j ?Č@=H?"Ww@#Tnb͹eM@*/ w ?'NsӨY@@"@Ӗp .?0W@#)#=>8@+K j.?n@@9CZ@#ӆDJ?gA+<@~`/*w@7c@H!N$^@$?d@!09@* @&4X@p@&n7%@ @w@ ̌@0^  CI!) 8@ǗL@ZW`?oT@(u(|鑗@-s @@%ҕ@)#8@0x@-s,%0@ J@#|@0Zj(!Vz@l@&3l d@xt@%3H  @!9 @&<@@,X('LJ@%+ ?@T:@5@@@5 @!@]? a3!t%I P@Hp?"9k00V@ 4.* @%.F@ z@Y  58#@x?Ģ28!t@#a @=@ f@$w!@E!@ʷh?@{8 汢@%@ z0"7?o0D@9 ~y4 V?y(@8?/@*)| ?`B+a[-g@'=G@+.1䲀[@@i@*X@d@ >?I7`(1b@Mk?@+ȸ@n(h p@1NQ@ l@-:?.ax@ `@)\Y@+ȣ@r4@$X@@q%` y@gz:Zc(&*k!:@b$Lb)<ls`f@$%4 B 0@!Ll@"KWn0@ 9%b@. !x@@ +x?h@Z(@# ^@ j:;KD@䲢@42`c6 @:(?;p@؇ 0T7@i?F`0@h@@ Z?Ē6ʒ@5\:6ji !O?M;`?ɷ%5d>69@}@k-@_?(O<8@G2@*@1$nn@&v*,@#_&?v{#_@D.A@,[Ak'(Sܬ@.ڼ$8#L^fp@,X#.c@h@$d@/z?r)"@~ (?:/+4p@+Ux@1}@ I@'*@z@ 7q@ 0y@wf# @D3 #l2@2³@ @%Kl1$1on ??熥 ?@ Q%o'd&@'O@6D>$Ce?ì@]E,@,3@Z_%Vq@!ubJ@ 1H@! )h ^FJD$@ f&@@A@@Lݖ@ :?IhVl@@!@&xh?K-h@-8?2 @m:?p@&Z]4?(r{@%i +@GH(?G`@):@01X( q12d@`@")@ 0@ /=|?R,?@@ @ m!@#n ~@~0@S2`@מ@ H@5|D0 [@7x4O$#@?1^F(]@$ 7-P"?BI@x@#@V@%+"WD@E.f!p?? 8 @)?@ ]\@,{(!X%ZX @2;?H|!P}+@#` w?%@7P w@P @%h@ Sp?x@ C.t'}?b?Ď?8|@#5l?Bz?Ć?+X8@ҀAY?@@3Nؐ*|@< @1mmJگ@0͸ E@'@?jPttsy@1!@a"@)]+@&hÀ+{@&|*4B@e5 @#־F$>@ l20M(@#`?K @y\@.Bx?*7v@)@ 7?&@#\??Ok 0dB?RS:%@u_@: 4+@!$i,H"Z? Է@!p@"@#``?Čy?@?1@%@&:~@"?7@? =1V |'y@=EfY@p {(}@a@?T@ڠ''@- s@#ӷFP@l|@@Q@ |@Y+L |/b!tx@$(*@-a%'y!?@6y@l@!G!Ҽ@#<@9}@8@wQ@ ot@6tà?\0? !Z~@$o7Р.@?$ ("$:F@#ĵ|Bqx@<1ǭO@"ĉ$@-?lPU8@7ѣ!(Z@F@_X,@SpQ7~(?dJf?9xuF@ۨ@E3p &@<CL*œ 5+Af?0?iX`!Q(@^ @"Ӏ@i@?`?10@(?  t@%d@ E [<+(Z@PSqR8 D?ą,ty@,Z?~@oMY@:d@?(@Tc4󘻠@?g@πb@@L,x,@1Z@*|@\@ U4@ *&un1uv@,]@#5?>W`@'WX/~;\5>PݦP@ 4$qx@[@9#@EsFtD@/zh^5{@#:@#P@+E@͛0@%؉@#@78!8=Uep@%;@(:t!5"?`$`??@/pP?l@ %f0't&),@@$*@@:&v'@ʓ@`|@ne] !@+;P@O@270@$۫`|t"f$|@1xP $CV L# "MT f@y~:E@ E?#! d&P @4tR=?`@ *@ N3@ r:@z #@ "?h{@@%gs@~/P@,]x%a*"2u@ *4@"(ß@ ʴ@"C?B@0^+@% O?@|(.9(qf'l:%ʿ= @'؀@*?Ѱܘ`LTM"@x(k@ 'sP@,@5G@ =dH@KP@+v@9b&KK0@)ә@7i>@\2@$"E@a!Ř(M诀@#3J@[@'k=$ 0#P1@@J0@+AH@)o@@QB9@-X@#h6@1HP@7Q@@˴@g84.P.h@d0L$(?\?R@@!@ UP@؉&@Z?UP@0nR 'GW@BT@?m'\H@'J$oW'(DZU?ۢ.}=O?ϴ ? ?@7}1(o@'^Gu(1Tɲ7A]? @T)n@?xީ,@@:`-n @3F y2T@ -@a6@@ @3s3j>x@) @& &@N$s-?;`)h@KLY{G@l8JEX?@,@ Z8^@O?P@*)hA rF?V?>(@#2@,=?-@@(bP@0@X!UҀ30@#\ 0@@1@!(@<?b@+6 ?82h@ @p 0.@  x@% hi@$*x@f%lhC%" b@Ѓ@҈r(8J D@"s)@iP 3@,d`@,#,x@D;x#(р@Xsp@F ,IH4@?7`!?ضw3@#%@#$t@@ tN@ +X M?Pe@82@?~!S$@2l(?ăx@?0?$RXh2Aਰ?Y@ q8?n`蜲 ?{`@f -<'K!ɠ݀@GT<?wR @"_@4ڠ@ӆ?=8@@"#r!t?+$wj@aW(@ Ʋ@&2?; "1t@ .@'۱?M~@zd@ @@$(V? M@"Yu@@?46? ,8@ax@+#F{)@v A@*u @(W1h@ S?1@q@(.xu@P 8&@#>@T0 9,Xt:?O@kM,{@x3>8i`k@:Z@,b@#i@,'@@G@͌ @%@D\@@@ M9@ -ȳ@@bvP0"@ C@!' `@ #}}@uFr2!Qs@ ?xDsHC8AK@;P?x̀u@!F?m6@&4d@*,?@- L@Ŕh@?~4.0@'$6i@1W@(D@N60p \+<oiz?p@!@I@ u @# @Ҽ@!@@!Q `@w`L@-h@ 眸}.j/@03 0gp$E=??FH@0|@$43׶'D'RY @/-o Q@"`p`@fRN??0i@ @h%Wp$@R@@ "?s@@੨  X@,SkF@ @ y#*l!j D-@.zj ?~@@4@95" ?|@@6Y@^̌@"֪x @Rs`@ xC@ y0 ,u ? od e/?@@'*Cld,?ڧ@8g@ON#.O@t@ j@(rp&R@ @\n`@0@1p@%h0i`@8@g'x..!@ ?Ç@>8<0T8Ad hb@?W' P@։X*x@a4~@G7<@!]@21`(p@!2@A o@p( @-i3'gm@b0@&A"<T?@$!@@%M=;xͨ i! @}#@kB~@5@@<^T@'$&/@$I8$Ha@,| .@`,@ @*"^@0~ PI@ wPX@@dx@&9( {@+tah@f@x@&ժ.W˂@0@/d@`?r@}??#J@7Hh|i@H@B!sX+@k5w@б ,@@'" ;@"@ -۰?@!d,?Sw@#'@$fJ#m|) *@@ )@S>@>Ҡo@/ց@@J@G7)y#c l ?@>pLڀ@+қ [ @HY? J2K]} #O ծ0̠ "Z?RH@<@!=D@1?:i?qp1U@ 0@@+,ʩaLx͖?[@@h?d"V/d4D$ e@ x#H(0p9$Y*@a@M@*D7?ހ@@'& t?H@!lbB07P@!D@R$,k@0bJ@%@M ^@ Ik@*!30 T@)G'H@D ,%^*5֛" @0+'@ IZ"48m '$S}!GJ?p@?򿸎@3@ '~'J@DQ-`@ogj@ x^P@ט?Äe@%pң?ÝM?V@, @6@n@K$\XlX@B@@@@ tx?$5X?]J@|P^0u8kr?4@.,C@ Tx?Gv|@# .@9}A?-3s@-T@X1@ OBrDb/ )@CT@@Z@0N؀@,h@$6x@@ص* =P?OC@,@ n*`/0ZG3̨mȀ@'„@'\l,|&?` C (?쟌@7@/v -+I?@K`?@ qĤ@%@&y@\@ #h@  a`@(%??@@ ?@ @?8@<@קJ3@TR@s@#@/dF q/}Yp!S@$@ P/(Yk`ڑx@(?Z@1߹@q`@ x@Nx2\?j}lX@MX@+T @+@W!S"|f@'q` &ډ@u6@-R0 ̈ h@[N@t?y, Zc@x?\h@G@3n^@x@-4@0ȥ@ش5@5K q?0@"v@ L3@H IZ@@ k(m@% :,~Cx@B@=@@ umu70a@%ClB @ Az?i?v@ h@0c (v@"?cˋ Fl?Ȁ?Q@1epF-p@l?['/m@(@ N0͠@3$?("@)6B(@2(F"(@ ?9Fu 4+@*}Su ;!x$@&~+@)> gŘ?b@!X?9@ &P@!@@ +\@\p@#W|-g P@n@1G{b1@/@lxD@(*ɤ?A2@ ߶B9?T>@"=M?5 iJ@' o@qV('@5(?@8?ظ@!G@t@x\@AﻅHS0@ @6@l@i@@<\€5.'"Mmu&Sl@f2%?`@'XQ@*sjώ##3 H@3 }(c@p@'&d`߮f&Al)z(98@#m?{p@3!z%)N +4 @&N@ 1@҈Z V``@*_@r]H#@@,6P@ ?@FS@{@0@"Ō{@#zD|@"r;Wx65@ !@0@E(L '`̐C?z @@,"? @@(4P_?× d@&Q@%%p@E+.?hG@#^E¤$?@@Gp @@| @X4$/lch?㾿?d=tY@/3?1 9`@-E&`@6ho@+<?@=`@!@ 0l@)dO@i@@X@SD?à@+ @ ѤJ^ ? @v )C(AA)f?X #G7 S h@$@ vP@Zt@33?f*$}/T g$*?y @M1 ?O?O*SԴ?R@ Uv1#H@I @"=7j@T@F @`@d W3%q@t-b@ ?p@@ @@@ @r@ @@ E@!ZVhx(@ @ [@(@"Lq?4 {Sp` ?`@%@)@ ?0PH@:@4B?Ն?C%@.@c["u ?㱥?ط}aO@?㕾 X? 'L@|@+k%Pl O@c(4@h@\@ L-{@#n:0qVx@<F5`6(|0@)p@# @3l/|@'o@[8@L@E8@,cp@$%p":@.uF@'p@鴰%Hzz?fc4"?TB?gD3P{ @#~T@ '(@yR@6 @O@(3 @\?t\@n&/O@.dk@~?ȗKH?UCА.@2 [L?$r@T@4 @|L-?걂x@2EP Μ@QN@@GS4? x;(&S@(V?@.@\vA6?C@$~@H@7@ /t'$`6?p@X@ A/}@OmHa:2.̔Ef4@@ '$g@9p +@y<v3@@l @._h"10*s@ 5|@2@[h(+N!t@\|@fF@R@)?gb?-O ',fS?E@ed !& 4@mz@"@?o@1R@)~*6?fYJ@Ҥ!;k?O@ye\?ô@&{@#@@@wˀ`@2/!1W1@4 P_P*\]@H?` Ih!fra @,P@5QA@n@"-? ! S.5@@e  ܘ@ 50?--~ 0>Z@$*9$@YCw8O@"--?p@@yˆ@,y,@4a.Zp!%\@ ,?T"Z<*2h@8n \H@ݹފx@@P?-N@ ! Ȥ-s @h|@9c@)Hn?о".@P"2B*ȼ@Bߖ@#/&Z]o?C? `f R8}}k@@ *J@$p$-&%~P1H?' @E1 @ 8th@ō?P`b@ܓ!w%n?Yp 2 A I@U^~%H@I*.+@ Y@#83GP@v`c}hl :?yP@!~C@0@.DEL@$ @1<@1a@0:?׎P@h,@4@ @J@H?p~P@!? @S@"7D@]@8<.ۀ)y?*@@i#nFT?¥0 xL(dڴ@$v ?@"tP*\@ r@eV@&H@% 'Z@#z@m@?Q#;s@k3@ #N@ Lr^D?V(@8GVG[@d@@$?',H?*@DF?Ñd@=@bD]?@,$j &$x@6t@t?@1܀O~"kV*P@]<@N-&#@,!@$ @F? @;F34@@ #t B@@?&8@@ 8d?Hc4*3j6ר@"L3Zer4@U@x@,M, @ @+(@ ;@a(@?iߨ@Xbd.@F aIMP3?r 2¾@ (?D?c^`&UT?`%r}@^Q@+pLp@)|@_@F@@ s0,t?LQD?JxbL4*,v@/(@DP?@#oÀB?@);@H @\$>@p@#q?@@-yyChp MB ;zR@8@"'wq$o$K3@3+O7 v͌?? %Y@P@L!?R6@@&: @z@@01#َp@G7KP< @@bL"དྷ@Kl+@ C+1@ ґx@4-f@=K!+H  Rʰg @2hN @ {| +@ x? x @b@ *@~(l%&0?"f@eJ@ $CMK Q;?@\&})(v V?G,"Π@@1(@*p@#R@R@+@` $!}S@ب@%B)`?4X@,H$@">0!r@r>6\.< so@ST@"j7?ռ?C@@\n@$4lf@?I@ n0,4@!*q@@d0@֠@#B@&ph e @0>?{9@{ @d<&F^@?m@0{SUZ0@m@ @6ox@@1Jפ@@,pl@&탈@@/P@ m@9 @|(?8@ &?@:#)cYNA>?æ@~H@T@)D@n=0.H`0@.d@8{@>0??g@:@@h@'%#|N H@19^>[* @x!@ 4 M@@ +@6~Pqe? ( xG&Vu?4 ?x?M\!]@0p@HH@'kx @)=.?> "5<"?`@UzL@?ڮ@[ l ?j@1%kH@J@ې*ao 2@<?P@-͸@ Q)@"R@ ^8@@$3d@&f *$@|@ 2@TC?!O<?f2DALa@ ?@*t 0k`@cO@s@>@c-?g@Q>VPJx?@U s@,op?(.@k`@ -@ '@"څ$:@U@(H@"cY:@|@P%ۦp )wɰ@Lۨ,g 'j@@0>@mX@PT@w t1P@WP@!X@*E}@V@%DJi#FJ@?EVy`Ͻ@ zv%BLdӨ'V@+c?o1 :0%82j@o-#H?N4"@5 ?@ȇ*l #@*FҚ?M~$i4se$,@7@ت@2-zب@{ Cq@@4[@!0[L@#"w%-^?&@!#׉0 @ @@+?$@:\@.@@#@=8&T@$ 90.0)h]p@"@$Uq<=@P@G_[0PB@ @QU@O8``h'@$: ?a`@!H@G<?i@ѐ@=r@-5@*%!5s?W0Ï@#D^@m>?i:h?hrP?>@2~@W@?@ @[a`@ P@&f 0A8F@<(ࢷ,@:l@"ұ@@*@&6 Qix *.p??D@! D@38%??@D"(wV@=? @*ۂ?̅':|h@ 28@@(k$?3,AvV?ʘ@!B.0et ?`@!Oh@/@DX}X?@?޼@/TCp@ $3@;׭@) @y<@ @$@HD&{@H?󆁐#MOMp@k=&:L!V D$t M/@%@:@'h~G@ ?@%H@@ 9|@@C^TOI/㩿@h? M#J? @"%x@!N0Ǥ@$N@@ RA|?? m$?&@# @Gb@ ;@0M`?@" i@rpЖ060#*z4?h1r@/puh 0N@!@H?ª̀vwv@`?@@L @,R8E` @ ]@-`#4@ij?a@?Z¨@ Pp@QY@'PU?.@3o$@}(#@ c@@7@s@ GpXD$UM@'1,@ @S(t@d<@@@}"@@!ˀ@ &lLG? `" ӦX0 #Hs1?4=?$?R>@2Q~@ @f@&rI@)r@ ?{F@ @.k!@@R@#ߜ@8@@!Y)@&’@&F;BҊX?n*Λ@DZ@)@^A@@yx ġ ʁ@ܠ솀6kY@bUFs?PB@w@sp7ԸN@4nx@)X@,\@7Kq@@O _@% 6j#ʃ=@?J@ Fdb@k l@#Br@$y)/4ؿ@!Þ@UhX@f0 $ @*av'EH@I@rv@ĝ@a@QFl^@֘K0^S@!+x@>@@Vs@FQ@X@ .3h@!PX%ՒB@ '@d3W K/0@#ذ@.-(? 3(@vPO"<?@0lڀ$Bt@@ a@%<yp4 {H3v( ! ,tp@AxE`@Pp@:!p@@&[G.@$壉6@"3z@(c @{ћG>@%o?@y@et@@#DrEBp@Ea(@@2Vx?h ]נ@)n/#R ef=@V@?=K(?,:醐@@3Q},H$ 6у@,n_S@3A,@!?? @ ͯ?N@M"D9 ,@"-GK@(@!z_Ŷ??!@(_F@#U @*@@G|@ j` @j@``@m2@@%&||@,,@' @&: n@#@@_@F @ҊW@ f~r@",#K(@#eH(\?W-X(2@@3@aఀ< Q@@\ @'i Mh@+/H*wt@T?_@y2g$@&_X@Q2px@3'(@{5 @ J7('5@- 8@U 9B((' y? }y@4T@ Tq?H@ ŀ@@%T^\[@ʬ.? `@@*@!Ule@)p@x@R?^@i7?E$@0G'f@;: jp@@'D@hP!R?p@ @lX@""R!@)`ߏ f@6$}0׶:,@ *C@;'Sd??  @?@@)/*sx@7 @&p* %eo2@RF?؀X!n}@]C|@p@n:d׀@ q7@@%RX@=@ yH?Q ?e@4&/0 4!%8 H6@k;Ш/eM @h@ k?irx@gpY!i@vm()1@ #<B_@/@."?BxE@ks(@ &EDX@ap0X ?}@FV ] @ )Fv,ea @?E0d!@3| D@{PΠc 0@p@@GD@=^@@@i"ؤo@1}Y~@KI]:?j̈5˷4@$@y~@wz\K@ i(@Y@@'`@FQj"0$@)@@%J?a|@-p@31?_B@R @xJ@@*:w4@*@Q'q?@x|*Jl@H?@@#X*Kh&₾?1P q܀@g GV@}`@0Z@i/?<`@5{$n@}UȐ?(@"@xG? Ѡ/ͯ@ʆL@P@a3}F & T@"Z@:u@Bx@@=@S  h@[@ 1@ J@ @@@ 0@9K0d䈀 @'&k/60/@S8m_<@ +<.\j&3W@@b @Q s@'3W!h?;@1|W@#!z(x@V@*lb_2?@@ϡ? K<"&( #P`@%8l@opi4@t@#Mdv@@(.(h@&=n@(4i?g?c$b@^}FEhZ@,pn@bܧ`?`@#V@0 ?{l܌/ X@ `ܩϨ?g/p^&#-@~?K t@(pPC@@@ -@dp&Oh/1É@*ST!'pq4?=P@Fx?6y@( @ i89Yh@!h@bڈ[*v@0y@=@!*o-@?0"ʢp? =7@cWX#?F<@ @?Wx $F@+@%DA@ @$Eu@#@"u:?z&PPB @R@8@APj<? p@dL=:@"!Z$L5@ZH@ F5I@1<@)@U>ڇȄ?r@+“@?r @#@;@ 8Prt8VF iD@͌'.@i8@^@ @ @& ڸ? @-[vx@ܦ7@P@6@?@3i@ L@#1_2}Z@_`?y2~@|XD@~Ux@0)@+@F(KN?e@" */Kx&\P5@?f P{@'![(@dl@$y@N@V@@ g6x @!Dvf?货@e@ae?3zt@Ӕ@?U^Ψ@ɚ@i~@<c@xtlfgrۀ@=(?-@p@"  @ wF@0@ @ ?i@0U>0@(86?d0@"@1E`~9@=(@<@5Ko i?@?St0@p?j@*@)`@!ݚl@ `@#%V?=`?=l?ڮ?@ }@v@N0@e&@$&@AWx'|r@Q[@14??%h?ޗ@Q@B,@ ͘$@K@)#O@@$k9@@?' 4@kos, ;,@-?\̀?V@1L@_ 4؀@0Q@3@" I3@@@I@}@`@"_7??G$@ uf@DDTq)  sP@"θ?ol@+:@@w@1DV1?n@'3! ,4@{X@ ?@ <@Ie@  Ң ?򬲠@@CڠvP@L&V?@!@%4(?l@z?NS3Yeس@pQ ?}%nŘ?ߐ@+PJ4\ )Z@*4t<@[@'wY?p(@@ Ĩ@'xr@ 8@@AaH@@66?€@(@!x@Y 7 @$-`@ mh@Q@)g\@Ҁ@#$YL@puC@.`,@a@_?P@7kp8UI@ 3_$h@X68 1k4@ @ @X?x@nVy?K @0v@&)L@f?\@"܀@*Ȯ@Xr@!@ v[\@ 6eb?z @Z(Q@%' @@@/|@%Cx}@?vB'OP KĘ:@ˀ?ѬD@v]?@+w@'2`}$߀ @y?K@@џ`*݀dt@@?h?@-@4$\@V@@!Fh@/sunpy-0.8.3/sunpy/data/test/predicted-sunspot-radio-flux_truncated.txt0000644000175000017500000000276213231613137026507 0ustar nabilnabil00000000000000:Predicted_Sunspot_Numbers_and_Radio_Flux: Predict.txt :Created: 2016 Jan 04 0500 UTC # Prepared by the U.S. Dept. of Commerce, NOAA, Space Weather Prediction Center (SWPC). # Please send comments and suggestions to swpc.webmaster@noaa.gov # # Sunspot Number: S.I.D.C. Brussels International Sunspot Number. # 10.7cm Radio Flux value: Penticton, B.C. Canada. # Predicted values are based on the consensus of the Solar Cycle 24 Prediction Panel. # # See the README3 file for further information. # # Missing or not applicable data: -1 # # Predicted Sunspot Number And Radio Flux Values # With Expected Ranges # # -----Sunspot Number------ ----10.7 cm Radio Flux---- # YR MO PREDICTED HIGH LOW PREDICTED HIGH LOW #-------------------------------------------------------------- 2015 07 41.6 42.6 40.6 116.1 117.1 115.1 2015 08 41.9 43.9 39.9 113.6 114.6 112.6 2015 09 43.0 46.0 40.0 111.7 113.7 109.7 2015 10 43.7 48.7 38.7 109.6 112.6 106.6 2015 11 43.5 48.5 38.5 107.6 111.6 103.6 2015 12 43.3 49.3 37.3 105.7 109.7 101.7 2016 01 43.5 50.5 36.5 104.3 109.3 99.3 2016 02 43.7 50.7 36.7 103.5 109.5 97.5 2016 03 43.4 51.4 35.4 102.7 109.7 95.7 2016 04 43.1 52.1 34.1 101.9 109.9 93.9 2016 05 43.0 52.0 34.0 100.7 108.7 92.7 sunpy-0.8.3/sunpy/data/test/resampled_hmi.fits0000644000175000001440000025630013203275053020636 0ustar nabil00000000000000SIMPLE = T / conforms to FITS standard BITPIX = -64 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 100 NAXIS2 = 100 DSUN_OBS= 148205511547.72 DATAVALS= 12702939 POLCALM = 1 CODEVER1= '$Id: interpol_code.c,v 1.3 2012/10/23 23:49:48 kehcheng Exp $' T_OBS = '2014.03.01_00:01:25_TAI' SOURCE = '''hmi.lev1[:#158263685,#158263663,#158263638,#158263710,#158263746,&'CONTINUE '#158&' CRLT_OBS= -7.226688 LUTQUERY= 'hmi.lookup_corrected_expanded[65714753][][3][37][51][0][80][6]' TOTVALS = 12702939 SATVALS = 21549 MISSVALS= 0 BUNIT = 'DN/s ' RSUN_REF= 696000000 TRECEPOC= '1993.01.01_00:00:00_TAI' TINTNUM = 72 DATASIGN= 1 DATARMS2= 16033.597656 CTYPE2 = 'HPLT-TAN' CTYPE1 = 'HPLN-TAN' QUALLEV1= 0 OBS_VN = -1365.248683 CDELT1 = 20.65575936 CDELT2 = 20.65575936 DATE-OBS= '2014-03-01T00:00:27.90' OBS_VW = 29699.776248 DATAMEAN= 49948.070312 DATARMS = 7887.500488 OBS_VR = 3300.689745 ODICOEFF= 6 RSUN_OBS= 968.660583 DATAKUR2= 2.469299 INSTRUME= 'HMI_FRONT2' CAMERA = 2 BLANK = -32768 HFLID = 1021 QLOOK = 0 DATAKURT= -0.290478 CADENCE = 45.0 DATAMEA2= 45184.652344 DATAMAX2= 69371.945312 HCAMID = 3 QUALITY = 0 DATASKEW= -0.626382 TRECUNIT= 'secs ' DSUN_REF= 149597870691 CAR_ROT = 2147 DATAMIN2= 185.617004 CUNIT1 = 'arcsec ' CUNIT2 = 'arcsec ' CRLN_OBS= 132.560135 ORIGIN = 'SDO/JSOC-SDP' SINTNUM = 10 DISTCOEF= '/home/jsoc/cvs/Development/JSOC/proj/lev1.5_hmi/apps//../libs/lev15/'CONTENT = 'CONTINUUM INTENSITY' CODEVER2= '$Id: interpol_code.c,v 1.3 2012/10/23 23:49:48 kehcheng Exp $' CODEVER3= '$Id: polcal.c,v 1.5 2013/12/22 22:54:08 couvidat Exp $' CODEVER0= '$Id: HMI_observables.c,v 1.43 2014/01/14 22:51:34 couvidat Exp $' DATAMIN = 7046.586426 BLD_VERS= '-803 ' CALVER64= 8466 CRVAL2 = 1.701427909190897 CRPIX1 = 50.5 CRPIX2 = 50.5 CRVAL1 = 2.480641216496906 TELESCOP= 'SDO/HMI ' HCFTID = 11 WAVELNTH= 6173.0 DATAMAX = 69371.945312 WCSNAME = 'Helioprojective-cartesian' TRECSTEP= 45.0 CAL_FSN = 65714753 DATE = '2014-03-05T17:58:38' T_REC = '2014.03.01_00:01:30_TAI' DATASKE2= -1.768324 TFRONT = 34.104862 DATAMED2= 50111.390625 CROTA2 = 179.929779 CRDER2 = 'nan ' CRDER1 = 'nan ' DATAMEDN= 51427.847656 ROTCOEF = '/home/jsoc/cvs/Development/JSOC/proj/lev1.5_hmi/apps//../libs/lev15/'TSEL = 22.761955 DETECTOR= 'HMI ' CSYSER2 = 'nan ' WAVEUNIT= '' CSYSER1 = 'nan ' OROCOEFF= 4 RECNUM = 5317856 COMMENT FITS (Flexible Image Transport System) format is defined in 'Astronomy COMMENT and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359HDe-COMMENT rotation: ON; Un-distortion: ON; Re-centering: ON; Re-sizing: OFF; correCOMMENT ction for cosmic-ray hits; dpath=/home/jsoc/cvs/Development/JSOC/proj/leCOMMENT v1.5_hmi/apps/; linearity=1 with coefficients updated on 2014/01/15;smooCOMMENT th=1; propagate eclipse bit from level 1; use of larger crop radiuslook-COMMENT up tables HISTORY Polynomial Coefficients used for Doppler velocity correction: 1.003989e+HISTORY 02 4.742091e-03 -2.193227e-06 -6.387018e-10 END @sWE@rt'RT`@s k@t0p:@t*0@t/@u@u@vr@wK]c@vnP@uK3333A@t =h@t3@s$8@sY@r?33332@s&-V@tY/w@tƇ+ 9@vXbM@wzGv@x@z]O;d[@{ȴ9X @}`A7D@~љ@Eʹ@ěO@ `A:@C-@x\(@;x@pěJ@}CdZ@z$/*@wQ@vt@uFM@s?|s@rn@r:fffff@r;dZ@s4m@ug@wR\(@ys@|1|Q@(PH@;,zxU@#\(@rGO@t{@:qi@ڎ` @N/@mp:~@۽֡a@un1@ےb@J=p@ځs@GT`_@׃6 @d$ x@QSλ@zG@Aᰉ@{ 'Q@xǓݗ&@vJzG@t8U@sU=@q$w@rZ@4n@s2@tQ@w҈`@{$@%{J#9@\#@A @ڊq @ՍE@ݶ] u@YV@S@y k@HCMj$@sR@E@i[W>@g@N_o@ʶ}X@fO;g@m g@S@߰@Α7@ޅO;M@ݾ|@K]l@=q@ZGfC@ Q@3 @{rGK@w\@u`d@st@r$ xD@t)^@vGz@zp`A>@D!@0zG;@1ө*0T@йx@ =q@Q{J @3@@௪Q@ߗ$tQ@k=@ě@K)7Kƨ@EE@a|@(7K@b+J#9@t?@g8|@je+@J7Kƭ@\?@"L@Q;tj|@© @0JnS@o@),@pNH@/v@@*4@I I@v k@l!-y@㕀 *@_˒@@cg|n@i6Q@;B@|U@UjK@%@]쿷@_o@p@7@@U.R<7@-@ݖ!-w:@۹V+j@%[@:8YJ@{ce@v܄V@ts|@r$/@t17KƩ@v3-b@z@rt@jn~@}V@ݷΗO@'p @vȴ9Y@V,hy@ю(@? 9X@4@Ƨ@H(9X @Y^5=@[(@׮z@_1@tj@g~)@up@+zP@f"@-U@tj@3tjz@3I@;dX@e-]@0( 5@f?+ X@3335@fvȴD@yɺ^5D@F4Cy@MV@*3332@hr!@5?|@Q@C@{@cM/@+@^t@{I`A7U@vp 5@t/~@rW|hq@u SMj@y,ѷX@@x@PH@fl@ߗ$,@_q@6x@B I[@7$tS@V? @Gv@T0]@:vȴ=@e@J]c@9+@41&@!~@^'@.]c@4IQ@ 333I@Xr@C@Tش9X@g1@y+@@V1@8O@D@V`AJ@hp@L@U}!.J@4;d\@N=p@@~5X~@˒:-@S6@"@@ߨ&@܍|@ضSPV@O;do@zg@vZC,@s|u"@s"`?@vVIQ@|Xtd@lI@hQ$@Ahr&@ߓ@.!+@eGb@➣'0@9X @+ H@@lj~@㖴Ʌk@K@ꣅR@E"@oh@{E@寏E8@Q\(@@@ں@^˒:0@w^5F@U0 @go+ J@r{@\@($ }@ b@u%Y@p@ݗ@TɅ@6J-V@$@M?@Z@L'/@tlzG@7U2a@㨃Mm@rP{@G@.$/@v@@Q0@m[W>@[dZ@Ʌv@@x|(`@tY@r? Ic@sG˒:)@xdZ@O'/@Nw}@-Ov@Z͞@@n@J@⩅?|@3A Y@m6vȴ;@}Q@$}2a|#@P-@`x@_ح@@z@,z~@-w1@6}Vl@qq @ nE@@C\@lPH@U @u@jFs@&@m-X@#&@g@lC}@𭫟C@ת͞v@W@@冄9Xb@AT$@G]!Z@%ڶ@zH@[;@usg@D@FϪ@ @PE@Gb@gu`A4@T,<@vEʾ@/hۅ@ۍN<@m\@|[!-w1@w$@rPH@qc@s_@y(Z@p H@R-V@ަϪ@V5?|@*]oiH@Al@ k@#E@hbG@:!m@G|@񤛥]@䎓@9@孓Z@fffd@)#u@6 =q@(@v_@vx@@[w@6 @Cqu&@ k@$O;q@X@-m\@擧[W@@goh@LU@U2a@Vhۋ@ؑu@{ @$1@Eʺ@涳)^@[@L i@/X[@ɭCc@@@>=@z@:I^?@_10 @Ǟߤ?@ὄ֡a@Rmzxl @B^5?@w3J#9@\O@2|@sGz@VnO@xYce@t@qeGz@t-Q@{ Q@@@Ā@R\)@33331@@!-w.@ u&@Fs@;n@̬1&@X@}H@l"h @/Stj}@䒴t@ߥb@8yX@qԕ0@拵E@3fA@F{@R`G@}KW@禬zG@¹Q@>+ L@!Q@0 @玁q@61@;q @Yd0@MO@ =p@.H@E=@fC@ ě@i\#@s/!-wN@]A@& (@q@2^5?i@"ڿ@|y@*g@璂@P@:)q@}D@{&@A"h @YEʲ@$wkb@i_,@V~F@>BZ@˅N@%{6@@1B@m@nvȴ3@߫(@ݐ{`@x k`@/@x&x@tu%F @r@uxE@A7K@޳PH@!L/z@<@K\@"`@'N@X*0@ @’R@ =p@Ft@yth@O?sR@6Ϫ@vȳ@qN_ح@e@^vȴ9@ ]cc@IG{@Gl@9҈@2f@LͲ-X@E@P|@Ⴉ @,@+Wv_ػ@!6ȴ9d@N+j@…ݘ@C3334@=zxb@5?|@X0 @^@@1X`A@^V@1|@ b\(@un}Vl@E@礀 >@#!|Q@mA@]E@ J@zE@(@Z䎊g@F"@d@r@$/@䓪@sMj@[8@O@Ꭱk@jQ@ށOl@ױrGE8@LO!@y"Ϫͭ@s~(#@q?S@u1&@x@ Ij@ %b@n5?|@B-w1@=s@㛹^5B@ @&@L =q@履`A7@atj@+Ɍ~(-@<^A@!A.H@F^@/+ B@:~@ @#E@@zG@v4֞@+- @gGE8@&Pi@_O@ @ye+Ӽ@}O;n@a@讅O;R@Y@3 I@ѷR@{ @5333B@ L@HIQ@S&@i9=U@(Kƨ@bM@E*0A@)NO@JZc @@݃]c@9!R@&@V (@333@S:)@0 ě@~dB@KU8@[333A@备iDg4@R<4@>ޞ@W>2@+@^;dZ@Nd@{J#5@>Bv@ؖ" ė@S@xҏ\(@sb~@q&"@u["`>@8@Sv@ߜb\(@P ě@L7}@ G@xr\(@ufzP@Vv@B@Z\(@;dZ@#@ ě@KƧ@/@?|@nzK@ t@ƿKƧ@L9Xg@ě@%p @dZ@r-U@S%R@q9X@&zA@)G@K =v@zB@5Q@xnz&@(.@8 ě@pě@a+ F@?7z@c"z@ -[@Oz@?\(@z=p@7+ @(ؓtk@ 0@Ѻ^5J@fffj@CzG@Thc@dZ@l\(@活333:@B)@~+$@7K@8W =p@wfffT@[ I@އ+@Kyhr#@@2 p@slI@ΦO@DQ@T49Xk@ߢ\(@؄-a@A7K@x+ I@r{v@p\(@sC@]!,@ڤ]cd@±.H@}$@B@Lt@S@Zé*0U@ƽV@J#9@JN@ະ Ğ@;:@f:G(@k&@@sg@ @a7K@&?;dZ@@!g@蟰[?@ꨏ\(@.-@~&+j@a6Ov_@/B@t`A7@钻&@Vc @ZrGE9@?@"KƧ@_o@l_@ञ쿶@1Q@`+ I@c<9X@>]c@j@TV~@砂`@4֡S@GltS@Qߣ@[|Lg@!ٙ@}A@˒:-@?[^@襠˒B@zG@8$^@v1@2mO@IX$@1@6N2@&?K]@Q@FO@ނ5@׌4m@ @u@qdQ@o7KƧ@sp <@}+ I@i4=@ƙ @,¹Y@mmp @A?@ c @4j~@z|@7KƤ@__o@t@yᰉ@dxF@}9Xi@Ư1@ r;@ɂ @]e+@~+ H@5uB@xQy@bf@[@踱@o@RC\@slD@\I^Z@ qXbY@k>BZ@>>]@*wm@@IO@DM:@hѷX@ [#@UF Q@7O@@醕H@k}@PU2aY@*a@4@4x@h|@YjQ@X {@C4֡f@2&fffd@hۈ@*K]@21=U@`u@NޗO@+'I@1oi@I^@ @G|d@T1&@nV@fXy=|@tZ@]@䟘p:@d"@2A @:N@l'|L@Pr @j~@ԔA [@}@tmp <@rHE@y3 =p@בs@,<@"c@\?;d_@=@bM@+~@;{J#<@ka@咿RT`@6x@4q@@qEQ@X[@)@? I\@ws@eM@_B@]E@M@dTzG@_?z@fa@fffb@WM@>Fj@@[q @Ē\(@?@p̄@(4֝@~@~@Cp:@T`k@wf>@;#n.@9^5Y@RZc@36z@)#@cn.@Kv@/V@Hw@J:)ǃ@[@d@w@mg@ =p@C@bM@TP`@L;@ H@-quq@+]$@½O;k@3@M wkX@h[4@!l~@,^O@*@Ggd@/{Q@\+@Rc@h8@Ov`@YJ@yffff^@rӅQ@q xF@ve@ =p@e>BZ@͵s@m[@ ě@=-p@䩚Ow@;]c@hې@-@ =p@9: @簖L/{@̘_@Q @+ A@K~2@~r@~1"@yx@`Z@*,<@6Kƨ@@+k@`@Ʊ2@'"Y@Tqoh@o@dZ@q^ @ZU@}s@J#9@ CdZ@6 (@?@̑N<@aǾvȰ@ݲ-B@tq @ꏃS%@Xp;@룱lx@G@O;h@eD@=z@H@6ffff@X6@Rg@(hM@aVߤ?@軫T@喫6z@踾E@遶a@z^5?@Q$,@kg@l,<@BF]`@#z@:~@匌12@bw@i;@ڹ@vȴd@? h@͞@E0U2]@۰U@nzG@w|@px@o]Q@t ?|k@~~"@܈i@Ihu@5@ =p@5l@]6fffg@ɉ7K@䘡G}@,I^0@`@@Q"@pd@ՎO@u@1C@h@^5?~@豿z@0`;@ptm@ =d@ޒ-U@$j~@ V@)hr!@ o@A IN@}@ ě@@07z@>zG@Õ(@o&x@̃T@}Q@ g@Y@ꤜI^/@s!@k-Q@/@n\@tC@yx4@ꋖfffA@Qhr@Y =T@ `A@+j~@@tju@(\@rvȥ@-@8 =p@& ċ@辑7K@茀ě@ O@zI@N-V@ ;@3tj}@bM@3335@p1&e@lt@ =t@J@cK@@ؓta@KƧ@lC@X@/lC~@t+ I@offffd@r9@|k;dZ8@ڈae@ߝp@XD@⾔#@ 0 @7;dZ@lI@䃖&@5!N@wYk@r @?x@2f@RAal@3i8@qi@@aᰉ@Vw&@ǍO>@&@x@胢@ wkP@i@;!^55@zF@NzF@뒋g@ @ fA@@e=B@YN;@4m@:xl"O@nE@ꤸH@@Mj@3a@q\;@/@@ q[@͞@,=4@V_o@~Q@ꩩ7K@%:@@8L@\(@(1@ě@ I@ #@鲬(•@u!x@_+j@0c@@.{dZ@C@yE@^hێ@& t@B@H$tS@`3"h@,n@ K]I@5/@@ߪ͞u@6a@#4#@ީG@MZ@z >B\@r@py@w:\(@_-O;O@kj~@=3333@=Ϫ͠@U"0U2`@WF@+D@3tj|@J@M4m@}[S@@hbM@@@zf@J@?]cp@[S3@0j6*@OA@.H@/ Dg8@65?|@1mce@ݛ=@mќu@ȓtc@Oz@4Z@ꈛxF@V@X6@I$9@@*.@{qu&@lG@!@K I@󉙙@rO:@!@T/'/@lJ@~,/@FW@ U2ae@비tS@f=p@&hu?@o|@jo'/@ZY@oQ@Oa@@7(@y"@覄q@ @Ju%F@{"\@i]cQ@CxF@#T@\mXyI@[)^@*v($ @G?@T In@5@B+j@4h:~@@ tE@sf=@BC\@⋝fA@ᮟ?@~Q@\@0U2aP@v}H@pS.@mj~@sQ@PH@ܿI@ਢڹX@Y~zH@M:@nHu @p{w@l@1 9Xf@"&K@v_ت@7@Z@;Q@C\@uhr@j{@髹|@ "@)N;@3u9@~ L*@ꨊ}V@#Ƨ@v_ذ@_e@u@yB@i ;@,zu@"@?@9@ꆮ&Z@U\2@xrGE@j&H@u@ꖜ!?@`A?@V@݃@E(@_o.@'z@,<@xۋ@\$@!\@꺯A@h@@똊@G@˲I@ =l@S&@"g @7@?SF]+@G@ԕX@Ig@@4B@4 xO@^5'@v@_4֡b@@a@T@ Hě@m!.F@ 74m@W@|@jr @;:@ʢ~@5P@+lF@ᑫR@o@ډѷO@ %@t:f @q ě@y#w@y@'@N@K]@3P@41&@X@a@N@囚C'@oy@Qu+j@YV@Sf}Vl@^5;@^5U@T @-:@r@m[W>@zy7K@k@驐 q@䎊|@yXbB@c@Q*@t({@l"h@dt@hI@뤜@BѲ@R<,@wd!-l@5w1@dt@a k@L3@5e@l =p@k@,t@ @`R@>2@y@Tu @䒀$ x@XA U@У 8@:ZM@Am@,;@yX ԕ@p@n@tF\(@(nP@wZ @ Is@- @K7@$@3 M@4E@`F@u~Qz@(—@[ @$/@œ I@5<(—@dZ@B ĝ@nG@!Q@ 333@֭S@顨@9+@D@hQ@뛒`A@z;@뵥S@(a@Vs333*@oO@ix@ Qv@G~@ Gq@/@+@)ɉ7K@KƧ@O =p@/@ɃC@i(t\@\.@&c333)@늄Z@V@"E%@pc@k =@( ě@JnL@p@;Q@w@O;Z@&MS@[@~6@i~z]@A@ h@ @"(m@YE\@$@>ahr,@7V@\(@cz\(@& S@Eʬ@W @$j~@XQ@p@j~@}/@ I@@לI^.@~H1&t@_ I@>bM@tNQ@nA@q4 k@{x@eDg8,@Dq @>>@Z@䜎fffm@I_o@"ߡ@!Р-@(a @$9XH@@S@kS&@LC@+\q@ 5@j9+@ W@17@䆔Fs@HbM@#@N@O N@on.@w[=P@Dq@ @Y@|@1iF@Q8@D° ě@Ρ@An!@* W@<13@Y$2@@hۋ@ Q@@[n@!Ju%F @"@ܮ@y=m@ x@aCF]9@E!@qr@S@l9X6@j0U2n@&EU@ƕ@퇓݇@陙o@@iV@뛹A [@F *@n@ApJ@L8@}VQ@qu@c I@@ꀴSc@rh Ԍ@ oA@zG@\D"h @/V@燦a@}o0@ @֭`A7@/:s@9O;c@|J@\$@j7@X-@*0@n҈Q@x$@qDg8@o@t=Hˊ@-U@u2a|@!y@˔oh@Dg8!@\ @傳qu@2%@I^6@O;j@C@-jb@ Ʌq@&@<@*dZ@ǐ@+q@fjb@X)^@#lC@}5Xv@qU8k@!&@л9@F1&j@u@.@q"~@ATɅ@xG@@-.6@붪u%]@X@՗vȸ@cG8@63@cA c@"@Ac I@5Xg@hۋ@g݉@Ҟ2@E@:TV@u@6@ݣ@?lC@"nU@G/7@.H@t]cb@}[@TY@v@#jd@5S&@\|@ tS@4m@B:)b@*|f@L14@3 M@p:r@g@FsV@շ =p@Ssq@zA=w@縗@glj@׍O}@+Z@`7KƝ@@$>?@SFQ@:}V@ .V@P'E8;@֥`A<@"`9@se@p~($ u@zP_D@&6t@@y=@Cݗ+@0F]@@)Gx@e> @J;5@~8}@!ŔO@dj~@{-ᰆ@U= @ae@1&@٨@u2:@ru%F@ V@9/|{@p9G|@!R@^@ꎹ.H@齢O|@dD1&@8}@ `[@#Ѫ@뗳J#9@솖fffm@:'/R@vrѪ@d3@ EIQ@)7KƮ@h*3@뭮1@Ju8@ f@tjv@r- @$tS@ @I!-w/@n@P"h @Q/@~tNU@HA@N@$/@iTɅ@qA [@=T̾@]c]@M\(@= @aLL`@쭀 k@`ŔO)@벁7K@Ci^50@rf@n.2@_@0@鿕S&@S&@c@lbM@ l8@s g@ڹz@_͞@甥hr@I^,@@i@ƃ%@G\(@3334@s qw@▛g@xF@ޒ3tj@o\(z@x3xFK@p_@lJ0U2az@s@{@o@ce`A7@2_o@✨A7L@.ȴ9Y@N;@jG@J@c|#@J._ح@F>1@$C@Xy>@g@vc@ꣵ '@$@? ?|@XBGE8@HѷW@K@7;dZ @X}<@^"h @b@[T@hs@g ě@@}B@K @ݏ\'@|U@@ #9@i@rG@:*~"@붖1@ @뢇1@KE@A7K@=ڹ@Q@톾Ov^@lC@p>@wi@#@볮;5@\O@2D@3@ꮗ-@آ[@gH^@떆?@@4@u!@E@rQ@+4@}s곀@Yq@*v@V@꬈N@aZ@巯!-w#@舆ȴ9Y@SG@}Vl@)%c@+0@+zG@P]`A-@:~@Mڻ@xb^5?{@@Q@?O O@-@ez@ L/@ۂ&x@ues@szxl5@os@v-U@؀Q!@guQ@5$@+@`P1&}@Ex@@wlC@8S@ur@DO@8[@褨 ě@BM@8ɩ]@-Ƨ@3 =n@G @+gz@2-V@9X@(@Z$@ @lC@}{E@ =p@N5?|@ ~@B Ia@넏|p@o@`@/@똆V@j\(@\(@럗+ M@"@VO@e@ū333-@ubM@A ;@.7Kƽ@훔j~@Q@&/;dG@Wvȡ@찑l@n@zG'@vȴD@^5L@Z@h}/@k333<@IQ$"@$'@&x@ 1&q@\(@,j~@ȴ9w@dZ@G@W d@ If@V@&vȴA@lh`@V\(@ ;dZB@^5?m@:?@Tu?|w@'p@stjq@[ =]@,fT@z@!@Wz@㒞@1&@$th@<@?|@wS@o`A7@qa @l@@ܓᰉ@섋C~@`vȹ@ I@s xE@ఆYJ@G\(@iVl@ qu"@jW@0Z{@8Q+@-q @MS@U@vȴO@| ě@"J@*%@DVϨ@ [WP@Fvȴ-@W\@`s@~-@M@]B~-@*0^@>.%@l"h@:84@Fk>@4cA@^@FOvn@p ԕ@!T1@1l@ibM@}84@ ioc@K&x@T@(‡@c@'p@썧-@삧+ p@|1F@;q@| 2a| @1&:@ "Ю@u+@yH@ ڹ_@'Q@+$@Wz@ @&O@mO;|@]O @N_o@n@ꚯy@G@zL/@g^Q@꽣@N@wqu$@ =f@}!Y@@3@aa|@d+@*YР@i k@ 9@e@\(@y~()@# x@@a@S@R?@l@ٓ84֏@{ l"h @q>@mB0 @tG1@#!Ro@޹M@ ě@➄b@䎇@:,<@N@?!@ᓥS@PɅ]@耥IQ@罞,@tG@x$@B@}H@5&@CP ě@j=p@k=I@sT@P@$hrG@b!R@-S& @~@#4m@bQ@'|@hr!@$@@|@(@JXYJ@y˒T@O;@<57@~($ @ ^Mi@`@%/@6z@#ѷa@%@ Sa@[@ {d@>@; ޢ@WS{J#f@@GVո@=`A%@'Ovg@v|@h 4@P@Z~@_O @2@ݏ-W@Z@隇˒:+@Xd¾@equ=@G@g@1ح@8\@&l@E@@T0@Ŀ[t@C hi@gvȻ@\z @n@"~%@渗 =p@偈@rR@@M~@;dZ/@Ug\(@ޯP[@Dg8c@sT@o8)^ @x3@_Km@E)^@1Z ě@@,zy@v"@߃{J@(Š@={ @sMj,@'@除쿝@7 \@S7@3- @3339@#'1@@G @eH@IL@h@` ?@7'/@6k~@O+@0a*@!hr!@ &@mp@ ;\@G!e@tp@odO @a@iDg8/@a2a|\@ΗO@x@'C6@-!@w䎁@1$.@C_@99@Hoh@a]cs@A9x@\I^ @tOv_@쒂Zc-@f[W>@1@Ĭ1G@잘ۋ@ue@쮺xl"r@_nQs@e@oJ@ 2P@Z@x@}%F q@@(…@{F_ح@ @o*0U+@@+ /@X.}V@Yԕ3@it@'P@l@ x]@v_4m@瞵X@#Q2@y@ƐYJ@ZN@懮z@eI@/@!W@ݢ{@C~@}3@EH@w XbM@nmO;d@ph ԕ@R<1@=@V@pv&@KMj @?ح@-<62@0- @!@@Iuce@aᰉ@דݗ@. =@~ߪ@zJM@6g@PTɄ@W:~#@nhw@ꎜm<@@zu%P@C@dvR+@;gi@3Q@T3@A7Kƛ@T}\)@GRT`@D"@׾v@65?|@}Q@셆Ϫ@7f@q@BrGB@씁&x@{n@R"@iV@Y C,o@줐bM@8e@kP@V՟@^F&@zG@N״3m@4cA@*A@ 'Ra@AG@gC,w@*:)p@ *>@84֡a@ݓC@%8@ n.@T@/ҙ0@"@hr"@epXy=@୫O@_z@E@q_j@蠡R=@n9@'RT_@4/@=@Ug@C[6@j3@tG@;d]@0$ x@9vz@e?[WE@}ě@i\@'Q|8@zS@pڹ]@l@sGz@%ffffb@\)@K\(@7@@@ =p@iFQ@)@@aG@>=p@$@0@!\(@j =s@\(@gz@@0333>@MQ@N3332@:G@fffc@G@8)@yaG~@c3335@K333@#)@"p@G@ =p@래@} =s@sV@1Gl@ Q@<@O =p@|(‘@Q@L@333B@:?z@*IGv@s@͐Q,@fff[@6@x:@쵾ffe@h@c332@h=p@uQ@6zc@G@8@)@zG@ =p@Qgz@@@ҏ\)1@P l@釺=p@@z=p@h <@ (@%Q@@Z\)@Q@话p@ĹG@fffC@up@?VQ@灀Y@G\(@LP@Y@fffk@K'z@}P@d4@ =k@\(@~ =p@@q\(Œ@nVvȴ9d@u!-w8@#zG@m}Vm@᜿ l@R\(@oh@Љ'N@YJ@f>%@t(Š@Ncn@S@h({@笗 M@(j~@pAl@v_ة@ÂS,@ /V@O.@ו\@.H@9U@aW@ym@r  @_䎃@]?@sb@^zG@i:@ZS@PD@@\(@'/@<Q*@=ІYJ@4L@%hr@틸:~@8ڹ\@e@b@+ =@@+Ƨ@fD@PH@&8YQ@`j@Bc'@ѷr@,k@W_o@홞$/3@AT@e@tQ@ K]`@^333;@_A@m@Ib@ǜ9Xt@;e?|@EY^&@s|~@5F8YS@Bk|v@v(t]@ᰊ@0U2\@-IZ@xl"{@x7Kƚ@꾎8YV@B_k@V@舛,z@adZ@t=@,Cl@OdI^1@ L@ <@jg@ Xy=@(@;艠'B@Apr @D7z@N;@[x@tL/{C@lbM@oQ$/2@zϪͰ@=Ӝ@X"s@MK]@S%@J@{u%J@dᰉ@n%@݈i@萗K]@ ,<@XϪ@DLJ@/z@ |@vxr @b@Ghr@SdZ@ꙥo@[[@~?@U:o@b/@Iq@`s"g@RT`@*=@M-N@" @q_@O@@Ǯz@둝S&@{l1A@;D@C<@afffg@N@,<@ 'ݗ@5X@ɺ^5P@2J@Lx [@;dK@we@I"@sW>@{@LS@IQ+@/|h{@}=@ĥzxe@뚙i@J#9@=p@s1@YJ@G'/@]cx@`t@O @d!@ zG@!xr @C@Ͼv@M@9YK @꬯o@@g\@%$@針s@Lm @G =p@ cp@mMj@B1&~@j:)o@ @E88@ĨT@ Kqu+@-̴@bM@Y[Z@|Q@״](@vq @n+tj @q;@nS2@ߪ͞@8}@rn@L7K@D @짧(@ca@C,@lzG@S3@t@#H9X@j0 ě@;\(@鳓{J#=@S@9x@5S&@Ix@8 @eG;dN@)8*0@8O;k@@[~R@ab@g@q|@9;dZ@~m\@쳄;@/I@ꙑoh@G̰@@U@G+j@\@xJ\(@T@4#@u@q }@=i&x@,<@@0%IQ@]K]@!7KƔ@w73@=*r@m U@*@$~@y?@쩖zM@@_*0U.@@n1@D@@ B@8%1@%F @4N;7@kP,@ڦL/@棅S@bWݗ@u}H@ @r IY@[c@萦Q@ @x`An@g'X@2nt@P q@fU84@!u@! k@|(@J#9@i!-v@dPH@xF@3t@ˊf@q('RTA@- @yѷX@p.VY@r @R@S&@溏E88@$T@K/\(@ K]{@%%@姦a@['RTi@ x@&@%@PԢ3@}Vu@rQV@kx@s ̼@bM@ޘQ@$@⟌j~@䐁@XbR@9`A5@7 O;g@N"@=;3330@纚 ĕ@lC@јě@i"@3G@`9X@ I[@"^5?@鸦ȴ9c@G@;S@7XbO@ $@~|T@&V@2 Ķ@0`A@uE@54j~@3333#@ Q@ȴ9XA@ =b@Z@8W@ҁ7KƱ@Q!@gu@ܾVy@p@N@`5@ԋT@7-@vQ@٩u@B IU@"6@p@F@vE@|I@@\1&@͛ =@x8t@6)@`Ax@+@#3338@*㕁!@땈A79@\(@5?}@<(Ž@쿣tji@ k333:@&ȴ9R@sc =K@ =p@S@,y@^5?@2sS@(Q<@Κ=p@;dw@Ձ$@DAhr@ +@װ@2o;dW@9Xc@/zG@оffff@hr@Z:\(@媆$/4@{lC@Z =Z@ Q@BY@`@{@j~@"h @3ah@[- @(ꟾv@麇\(@؁A [@Pj @ՔO @.ߤ?@G|@ˢw@c+^@@룸@E@Q1@ @/!.$@O%U@QJ-U@ >B@l!@*s@@瓕@et@K)^ @鋒v@5$@;T @3~@G8}@rxl"d@]wkS@(? =p@\zH@8ix@p:@3GKƧ@G+ W@U,g8|@.nO@(-@ԕ*@u;S@m qp@o9@w\(@'+ L@͞@ f@"`@M^zF@H@€}H@=sj@PH@3338@(_@/@z@MM>@n@r @2{@~Ov_@霓jl@gEF Q@/@룅I@9@N@7 !W@]b@8_ح@O @n /V@큟z@ퟞx@m\@_H@$tS@q@7,tS@և+@@ҡ[W>@e;dZ @셉-w1~@2[@!&@Ft#@X;dZ@@.]S&@ě@%V@@y7KƘ@:@)9XM@sN+j@*@j@@B)y@Qu!@.L/@zڹL@g;dx@3C@J`A,@Wc@U?|t@b`(@ka@x,<@?O J@)7O C@77v@J@ZzG@誑4=@oK]@ У @n4@B~fffj@*L xD@ @\*@$2@Osg@^RT`@C{J#@@\/@9n:@XOv_@ԺQ@Fs@vSv@nxl"h@nDg8d@zX9Xb=@ڰ@N@~($@8d@UO;`@ wKƧ@Fs@; =p@m\@;j@>qi@I^G@n@ J#9@<-O@fc@ӶE@!t@y,zq@1@G3@YH@@;a@R@V+@횒qi@!9u@힦vȴn@61@dm2@.!X@n.@ep@ }G@5 s3@7@@o|@iVS@>@R<0@ q X@!7KƖ@h~@- @fOi@IW@)kp@郢 Č@鼣S@T@갰bM@01@r?|@Kn@t?@=b@6IY@'@朾'@+@^ѷ(@bC\@}KS@j.H@+j@=L'@+p)^@z=p@qm\@ok,zxm@}- @*JL@@T=@m!Q@ɧvȵ@0˒:,@]3:)@Eg;d`@@;=p@%84@[<1@mjO@NT9Xa@弼j~@E @ ԕ@qu@34֚@q&x@%oO1@^]c@ 0U2d@IJ@"?|@4;xF@T@z =p@U@}9X@vs@J@~2@VO@HQ%@! qr@|@!-@ 6z@OlC@^v!:@ޛ@Z@"@̸@iDg8"@bxF@쯕Q@q8˒>@q7Kƺ@@~($ @<Fܓ@Z@IԲ@mS@ɦ ]@Zq@BWo@iB@OzG@[W3@咒>@!.E@Gt!T@웹XbQ@GݗY@&0U2]@kDM:@C9@E+@ꥄj~@귃/V@c@?@`T/@kP@*@4y.@ک @( ě@W3@XO3@r7{J0@ @p @RC@Uj~@5Q@䚜hr@#C@-b@z(n@qv@9z@yXbM@qߤ?@pߤ?@~I^5G@=ϐ@q @}}Vl@d.@"@\2~$@F.3@恥S@Y@[3337@祓|@^5M@{xF@Q@@gs@\(@C @ f@騄zG@#5X{@Q@w1@@0j @|@]p@ꨍIQ@yߤ?@봁[@ L3@Y^z@2@ x*3@\)@HQhr@窒Q@p0-@%@Jv@j7@C,@!_j@@>@qn@}3F]f@MO@[ I@;dS@2mE@_T@@<̼@s곜@}%F @O ě@{%@<>/@@E@m\@~l@qviB@SC@;3 I@6@V=@Mu@1w :@lC@\H ě@ dZ@5e@'O L@(ݕ@=cE@ϑ"@8X@ Z@w$tSM@j@)@ڽ<6(@&@($ @p:@\'@=}H@Hu@N;@4։@Z Ġ@H?@}?1@4cQ@<@{<1&@q撣S/@nQ@|;dZ@ {@ڛ3330@\<@F L@D-@"S(@渻S@Rma@ȿح@uQ@@Z@遆1@"@2G@^vȴ+@|rJ@ $&@_W@Q!@c =z@ 333+@x`A@jڹl@tjx@׊ @zYJ@o/@zxU@ҧlC@zcE@(U2a@Ɗ7@.t64@4p@!Y@Bڤ@5$@FƸQ@=O@ 4m@BZ[@fD7@R/4m@n@*C0@2o @\߃{J@@@|C@붱23@Y-w1@IQ@-'|W@"B@ݗ @@N8@0U2Z@\(@˯@[;9@V3E@뒣{J#@<1&@:sF@?@5@7E8@cN@lܑNR@꼰u0@#l@@@J/@mw|d@xi*0U>@yj~@b@C@P4[@mJ@gMz@@@Q@+j~@ Ƨ@򅇓@}}Hs@j{"Z@rᰉ@z݇ݾ@^ @P`AB@y\(k@q)^@o-@|ָQ1@t@W|k@R/@#M\,@ D@B"\@x`Az@KƧ@D@aI@``A@5?|@Q@)@333@@p@O;dp@@V@Ymp@V @tj@ E@I^K@Z{ =I@3T@5ա@<&Qx@1H9X@i@Q333E@B^5?i@vȴ^@A I}@,@"@\2@Q@iY@m\8@쮉M@p @Ml6@Q@ l@$E@契XbK@j~@/@BG@@\(@줎+@`A@%<@zGZ@G @ʌt@odZ@l@@a@x@٥?|@BM@C|@T\2@ l@0x`@в^5?b@\(@:=p@L@ě@&V@鏷lC@@z?@SݗT@Fq @alx@Gu@b-U@ =E@^+j@}0W@4߂@s@1@;cP@\@e䎊h@}Y@F@ 2W@˺=p@fW@dO @}V@}C5c@z=p@eO;O@iDgL@xp;@uQj@F&x@헴oX@Os:@@/Kƨ@iDg@ R+@ @־쿱\@wn@/s]@R Z@V)@Fp:@ņ@Mzxl@~ۤ@a:@ԓ@(u%\@9{J#@ =h@䎜@^V@h1'@Q@@u _@@\@F[@Kn@{@ۉl@YC?@$ x@ .@hۋ@H@_=a@& (@PS@ Ƨ@&{Z@i@qu2@\@a*E@@60r @䈴@Nx@l"h@Ἄwk<@ߜa@$@׊)^(@w5?|x@pSMu@mƻS@yx =@_U@e+@UT1&@ⴐT@|t@(1af@%O;@p:@NQ@i@ k@|Sf@,ݬ@dQ.H@?@Q@*j@/{Y@>|A@~p @~"@!2W@V@E{s@ER @F@ *@w&@붨d@1+@Ko@휉hr/@q2@ajf@332@%ݫ@-g@iB@v@Rs333F@yi5@Zʒ@ k@/ M*@jzn@ImE@p@P+@0U2T@S@u/@t3@:@ s҂@퓄9X@3 =-@ @N@!D@욙_@*@҂@x@bo@Xy=J@@7K@ibe@gH˻@f&s@va@ٕEj@E1@h =p@?~@*0@hD@tj~@8C@-Gg@<t@m;dZ@/)^@S& @V}Vm @||{@=p@FkP@* @BZ@.r7@o @Ara@줲=p@ ( kj@빛\@Z@Dq^U@thm@͜"h @T!,@rT`@rv3@@A7@;"h @"}<6k@f[@j'@+hV@YJ@ aR@EK4@᩺^5m@V@c@@鄒p5@,cAK@泫f@9 (@J@( @z@_lC@` ě@'R1@ᇡ@ޘlC@ ;@u5?|g@n҈p;@lqu@t$/*@>@ߡߤ?@C,@ |@jn/@{ڂ@m@9$@S@=9@ʏ\(@DCv@d@kJ#9@fzxlP@,OJ@=\@%JR@ں.@H9ᰉ@6fffp@Vϟ@ﺅ@xF@꺷$tS@ I@뎃M@@EH@ɩ@K =@@ ڹ@z6@x@B@Z@s@8iDg7@茶V@o2a|@Y@[0'RT@)q@Up @2e+@#/@/[@|om@U \"@&($ @,ߤ?@ER@GL_@t*@mL?@j9&xd@swz@4zG|@4 A7?@Chr@[@䗸/@aB@1@RM@I6zF@[333C@/@9@s.@{n@q]\@@!ě @B&@@4C@t@cp@x @W\(@A7r@R =p~@QG>@nFEc@p$/E@Y$ @Ghr@g@&z@q&x@l@Դ(@ 3333@E@`A@E@<_v@ =pY@\(@6Zo@X@6vȴi@ =pփ@G@Gc@4*@x!@\(@j=p@3E@V@_a$g@~Q@< @FeVY@/W@znx@وI@s332@$C@z-U@ @)QS@EeE@@7;dZ@hr@6pֳ@/@t@m@e$@p8@ @@,j~@#@Y@Z?@p@NV@{A@Rt@/@î5?|@ Z@$/@ xS@V @ =p@-GlC@+0@rffffX@qzG@7E@<@඾ߤD@~\b@O@r @<@n.@}ԕ$@\(@u?@Bp ԕ@=t@蔻333C@6\(@@Xn}@hۋ@4֡w@ꏶȴ9e@G qi@ꕶ]c@O&@;fV@ě@(z@`V\5@z@@s@\;|@]).H@*`A@bV@θQp@? {@(- @rz@he@O@*C\@=Q@0@U+quI@1&@ v@ArGE-@T@CQ:_@-#@;@=@9 @S&Q@]"@j.S@Қ@]e+@)[@듇@D(’@#3@xl"@-oݘ%@_ahr9@D%@?ح@#5q@p*@slF@bu@X<ܨ@n* @ =p@(–@q @Ȩ@E~G@mF1[@M/@NlC@wQ@[S)^@ޮ}Ve@o3339@m,6@!Q@]ڱ@_ @x@pN@6Fy@'E`A>@|Fs@r$/@p5@!-W@'Ovd@7@Ktj}@yە$@tj@B䎊y@oiDS@J#z@\\(@΍!@@X^zJ@G>@k I@ě@IUH@boh@>!R@(Lj~@lBwY@ˁ@IBGE8@ @r6"@=p@>BI@b@Qn.@n+@2v@Yk@M@Ł$@ @1lC@:u%{@h%F @!-{@P`Ay@Z3@@r@Zq@̹@j0@@*0@$u@BQP@Q@Fs@jW+ 5@3@D,zo@;d@B*1@e@{u-@촱rGE:@3333W@)@@ߗ$t@qi@yH*@Yhe@6҈~@Nfff@hr@M@{S@Jh ԭ@ꕍYr@,2W|@r4q @꾩$>@ɯ.@8 @ET`;@k%8u@Q&x@K@ĸ@K@@cf@@3@Om(@~($@k@,+ @@=]c@S&@yS@plC@n~"@y*@6~($ @F]c@xC@~(@rd8@g|n@_@Y@lQ"@ĐT|@_@}si@|/{O@OK@X'@?(U@/3l@@/`1&@{P@H@:h k@@S"@$ @p]cw@1[W>@o u@L(@/|\@̇@IB@쌭s@q@칗 x@@'{@p @mx@7bx@ pD@`GE8@mʈpE@*@,@w4m@vX@R|@t1&@4,Vϟ@Pz@h@p'J@}X@?94,@Z [@'4m@eL@b =p@묋 @빩*@꿂@E:@Z Ie@,2W@10 @/ὥ@[W>@WA@꒞҈|@gV@뛡-w1@tTɌ@_9hr@@B@@{h*0@KYJ@k@0_@>Mj@y!6@%L/@I@rS@r%@b@6Q@ɆvȴC@VϨ@܆l@Dj,zI@ *{@ p=@1|@wj~@FQ@߿$tS@5'RTg@*p1&y@Ɇ}Vl@4ƸQ@B@Mں@(@H ě@* Ĝ@@א@Q@V@]c@ @I@Q<@@@H)^@$tO@O^5@XtSS@Xy=@+Q@cA@Z1@쪄K@XS @q "@ A7H@(Œ@쨒-@9n.@ (d@6Mj@r(‰@' 333 @ݗ+k@hm( @a@zG@JG@TeB@[Fq@)]cn@|$j~@mF@͗+y@3@l@@˶E@/@I^B@)XbY@*zM@Bu%E@ *0@KS@<(“@nk =b@? @Y@9?|@u0U2a@mv@j33332@r =q@N =j@\(@ta@ffff@ffff@x@*G@Ӳ\(@U@s =p@祺\(@C3333@\(@9@  =p@=p@7@G@c3335@놶Qq@,zG@Q@zG@㩙@9@X!Gp@kT@uG@ᙙ@ Q@z2@Q@1@1@\(@PP @@ᛅX@VQb@)@f5Q@!G@@p ,@'C333I@fffs@=\,@=p@z@@3A@Qs@? =p@G@O.fff9@7\(@+9@[333L@3335@p@}@SzG@eQ@G@)@By@DzG@_z@p@4 @_C3337@ >@蘛 =|@׮z@)@ =p@aGt@ =@` F@-@zW@I+ =e@> =p@G~@h@=p@ƸQ@܁Gz@?'\(@333<@[Nz<@Gҏ\) @\(@r̼@p9Gz@q@n@`ᰉ@D/@^@$/@Ff..@6J@~zB@}Vl@r@_o@ L*@.nL@o)^@TɅj@D%%@k@S@Cg@`A6@R7@5$,@싸A78@_o@Z1@HU2au@s@ƗO@v8$e@uL_@e}Hj@Ǜjk@mB=p@@.g@)ԕ'@)VϪ@iA7A@Q@1&@<@ D@6[@ C@hr@E/@@@ Id@90@B@XZc@$/?@dlI]@]_o@26!;@$)@hU2a@k=p@9A@%u!w@럘@P*0@Kny@z@\kq f@칤`d@A [@j~@o{J+@ۋq@g@\@@X@o@9@rG3@;5@7>w@PH@A7K@5@*,<@G@Қ䎊w@(4֤@0 @!hA7P@]@4S@$@zěn@p@@l @wC?@@N@l!R@Z@ԗ =p@{n.@ys@`A@a=p@IA [@D@<u%B@{of@1&x@Up@ #@:@_o@'7@nK@Uy|L@#C,@A8}@)@X4]@O@r@-@ GkP@걫dZ@)l@tQ.@h~!9@S'C@PG@b$/@ k@)^@@ qz@fffp@8L@BhoiDl@쐱rGE5@6@2N~@"pU@]IQ@m"@dZ@]^$/@Vl!@ R@3쿱J@˂qi@a%O;@k@e@Vl*@ѷ#@yG_@xr @2vȴV@x%@I@fj`-@4,Ӗ@@!Gf@ld,<@ꘁl@ /@<#@ӶE@ĕ*@ Mj&@*͞@oE/@꒙@H ԕ>@`fffm@L<5@J+ D@E@u(@ZvOv?@ [H@ E8@L5\@ @ '@:҈b@坧/R@Q@@a|@_@Pc@;3@3K@`d@uO;9@s!-^@p<6"@d#@۾4Ʌ~@Q"@g@hz@+HPH@ĨT@@d@vϪ@y=1@ Mj%@.5jO@jvȴ"@3=]@C%@)Te@ @~@ql@鰆IQ@pH @ć[V@&Q@:)y@S9Y@F_ح@s@e+ @ʭ@py=^@@o@ZʌL~@귧\(@첦"@>Bu@Hh@MfffW@`@@p*@uC/V@xVq@Jxl"@+|1&@O @ORѳ@hr]@ߍO%@ Q"@GkP@GU<@쫌e@#%#@ dZ@ =p@Y$S@oS@!-wX@ G2@KC,@f,<@@l"h@켚u%@ 1'@|}@fD!c@,@=pH@㽑hr@Ϫ@F~@1$/+@ m\@bM@ќv@"+@C7@ B@gC@2a|$@?@[@mY4i@/b=p@Ƣ6:@5AY@4m@ ':@ě@اQ@zBZc@q@~($ @m1&@wKtj~@j~@ʗz@z"-U@45?|@,hr@j~@_@1$1&@%81&y@zG@= (™@rjG'@ҏ\(@Sξ@5@ $1 @谇z@O IR@$7Kƣ@{@5Ձ$@P<@n$/ @YH`A8@=p@5@낏 =p@vbM@%\?@IV[@M@[333X@bM@"Kƨ@n@Ͳ-N@+LzG@S@^+=@$Z@49X@y@hrb@`A@Cn@XC@@쑤zGs@~u@뗲-U@ljx@/|zG@k=p@R @@ġ"@أ ~@Bz*@@ 8bM@XE@=f+P@UV7@H?\(@p@hbM@2`=@m9XP@fff}@ehr@sƧ@mlC@l @[R@Q@L(@hrW@oT1'A@Q@SlW@`AL@5E@PH9X@Q@扉7K@:S@tZ@5j~@^Q@a^5>@vAXbM@nXbN@jb}u@s}H@8}@C.O@yB@2H˄@Y @䖪0@Q*@tPH@Fm\@og#@M@Q*@s$9Xq@Zx@X@Β)y@騵?|@o/X@N;X@SS@"09W@dZ@wfό@KniB@f]cn@Kn.@B@k@ߡG@vȴJ@@UƸQh@j7@.ZJ@FO+j@eWlCm@ +@ 8$@x/ M@[[H@ @vV@gsU@^:@Qg[WT@Ϫ@hPr @`=w@(*F@-w1p@@V\@Vbqi@y-@4^@L63@V# =@뢼%Q@Q7Km@e5X@29 @lqhr2@ gN@ ҈o@@qt@閲d@L/Y@ =p@s @+w@pzG@VlH@C,@ģ/V@&p:`@j@\@Bԕ,@ܟ4֡C@&A@M(@ɅQ@KPr@4@p@t (@=kP@bM@%e+ @xԬ1/@+ ޏ@G@(d#s@cA5@{x@a@D!-@|Qn.@N[ I@'0 b@r[:)@ N@SttSg@=@:@?8@꘲@K@2Z@<@S@P1a<@hX-@鏺b@qhrV@z_@9ٝ@78@>6,@+i@lC^@dV]@W'O0@5-w1s@SP,@\(@?qi@|{@_Dok@zN;B@ȠO7@wAב@pQ,@m|Z@u& I^0@^@ݭO\(@wsjj@sXp@U @ G@#@Fѷ)@ڹ=@*~ @9X\@x %@;dZC@l[U@K6@@bM@w1@3E84@hu&@5ݙ@꒻<@C!2Y@zM@qǚkP@H@AG@꒪L/w@cƧl@ iDg4@vX@p @䎋@`\Cp@b'{@@KS@cc@g8k@Oqᰉ@qnz@hy@긱[W>@>BZ@8Y2@쐥m\@@oh@?v_؅@r @Ϫ͞x@ U'@EO;V@6@PQ@@˒H@>z@%0U2an@,،@0af@9 eb@ &$/@Vl`@¤C,.@%@ۋp@*=p@.&!G@wz@($ q@点 @SE@(C@zE(@[X@CGn@AHQ6@ /6@g+ E@0g@T333N@_\(@7K@?@$$[_@}c @(]@s@C@pn0 @{1++@y/v_@C"k@+*@9ʶ}H@ @3 @JO@ g@ZP J@@1&r@%@A7F@`?@1$0@SE@߶@t@zR@C~@闭-b@ @S:~@e,@j@Ҟx@?.A@Gsn.@T6@{@}p@x$@w;@de}@̾P@ IG@w0PH@ k@+C@% @@ӯ@?8}@r@P#@,hD@@7L@Cݗ$@D.lM@ ě@㴹#@s@\(@vȗ@T!GL@P.@u|S@gXM@;n@=-N@6bd@s@?O@Ib@o Im@f?@鑩 [@潋 @bs@/vȩ@K]@Ql@Q@}E8@.K333=@. @Lߵ@qu@Cn@Q@⚤T@ʏ\)@S@жA@xvȴ94@p(@l}@sq>@\X@$Vt@E@Q@9\@㜶fffr@+ N@_#@dC@/Ctj@M\@鴓S@8n@˯vȰ@o@1A@z Ii@ :@g\J@a@z&@j$@c\(@u;dn@鴹+@*G@uXbK@9XbM@ˆfffp@3lB@y#333(@A[@5?|@(o@b@HQ@7dZ@$-@`L@"`5@)@@ov@clC@kC@xr=p@zG@418@k I@U@R =@ ?|@)x@ =t@(td@0333'@9x@r+@G#@j 7K@ER@vȴT@9j@$.@舶"@Q@4D/@Lhn@^(n@ fff@p@ovț@c$(@W|q@S@Vz`@ "T@䆲@~m@[@@j~@"J=p@vȩ@8ȴ9W@t8(S@pq@xs@&,A@T`b@3.H@ D@ҚC@}KƧ@ "&K@t@ǥ-^@H$f@H[WQ@ w@P_o@S@i!@Z @Jg@@E~@>^ #@9N@سP@p;@$!@mj@,?@@q"@prE@;5@iI^,@՞1{@n#J@䯹u@z%oiF@Uce@K?|@OQ@BXy=@g@;s@x L/@q8A7K@lj~@s@c|@Cqf@[˒<@1\@$C,z@43dZ@"0 @*4֡a@љ^5G@Ae@ح@E4ֱ@N]%F @rě@;K]_@?X@y@Sv@nv@_@갫n@n%8T@\<@@s4@W@z,@ qu@WQ@eڹ@9ԕ-@J@hۋ@L/@ݮQ@g_o@N,VϦ@`)^@ =p@ufEʸ@9&y@9N@yBø@o =p@(za|@bz@ez@1IQ4@θQ@%3@Je+@*xl"q@Mo_o1@ <@U@2'@5iԕ1@L-@I^@$J@\Mi@b@*nU@#!+@@IQ}@I@ ě@珓C,@p:G@v*@"2a|'@-K8@g8|@Ru?|@䋤#@- s@r/{A@{@2@QzG@x@~(@}FzG@sF]T@oFYJ@v]ݗ@7a@٣g @3>Q@Y2U@5fA@n_o@tj}@zG@yK/V@1Z@ \@l:@nzE@BZb@5@öE@.H@^5?@nY@v@!!.@n@Z@Fqc@麈-@U"@>c@zJ@Xy=@o@0}I@8p@0u@;o j@CTɅ@!x@Su @θQ@Ju@딫&@>BZ@M.H@HK"a@Mw1@l@Wߤ?@0wkc@`@#/V@%n:@e:@)@C\@z@w8Y@@bM@]@B @7z@: VϞ@G@0>BZ@f+@粢G@b@矏K]@hFb@G3@0n7@s@W@@厶 (s@i@z@aa@Xy=@ Q @\!@=\)@w I[@.H@vuں@p_?@ruk~9@{b@؊Q@G@@↬Fs@_R)y@=o@%Ƈ+ @Pě@TheL@ @XlZ@(@>쿱I@Phۋ@hۋ@~z<@j~@2W@|tS@8~ߤN@?\"h @?|@hہ@麺`7@ڹ@mc/@@dK@lI^&@ 4֡Y@]c@< +"@Asw@]*s@#&7@/T@Pz ď@Cf@3%@7=@T@/@w͞@̘_@+@CI@O X@<u%8@kMj,@-@^5?u@fff}@6]c@nȴ9f@@v@wHD@aW@ =p@7$/4@Zd0@wF@҈i@!dP@ ,@ү;dZ0@}? M@|h@ᖙ0 @n5?|@ֹ@Xr@z'ߕ@rRGx@mv@tel@ =p@ۺc3336@mvȴ7@r"a@zQ@~fffs@ =p@r I\@7l@zWlC@0u-T@.fffb@9X\@GlC@]hr@莤he@燣P@象&x@;@qI@蠰r @tzG@o;dZ"@8ST@w@$3@^fffr@WWKƧ@@G}@Pr @oz@?V@"@KƧ@\ @U@P@ j~@9Xc@%E@>@]o|W@nR@HQ@lT@ G_@l[@要@?lC@@ə@c@+ @JzG@Ų-O@@(‡@@:`@ߝ-,@_j~@谂G@1&@\j~@KƧ@ֿ+ 8@撜( @C@ =r@[hr@E@޸Q^@KƧ@ =r@i6@h$-@ω@ffffe@s/@pڹ;@uYR@\(M@ꍸ @ \@C3@y@j@@]MO@Q@k@N@ghr@[&_o@5@t4ܱ@+%@9X@7O L@woiDe@mS6@@T@R@K@3 ޶@tp`Ay@韈Q@jY@n5?|@\_@Eo L@dZ@ S@rG@#Q@늡kk@rܛo@A [@+ރ%@0@ꗱu@`1@{_rG@".H@ C\p@Z%F @-@ꕝ5Xl@1&R@x~@^4֡Z@ᙙ@1&@a|@陵P@q|p@o =7@=Vm@4/{s@/l"h%@@TzR@>8@_@OO )@HK]>@汱l@n5?|@؝IQq@{ C,@@u@xbM@Xsn@^=@K'0@w@vzG@xF%@qf,<@q`D@xGz@`q@*#@$- '@У 8@@N@'U=@䶚6-@YVϱ@lC@9A [@|U2a@zNH$@C,\@\@z6@tXe@kP@ݤ@\=p@nIR@qqu@?|@I?@/:G@m(@J F]Q@S\6@%F 1@{333g@@Vl5@iDgM@G@ꟾv@+ E@ۑ4G@p@ۓw@:G5@Rߤ&@ròR@b@Zl@t@)^@խ=@雜@U@/ R@qu!t@6Ib@?e @،@@!fffZ@^fYJ@8jwc@a8@"a@.dZ@)@ޖOvR@d@xctj}@x@>Bі@}r@`\@SJ#9@9X @u@$tS@J(r @15X4@{+ =p@s%5@n-}H@r?z(@|$r ĉ@ Zb@ݫg@஍Xy@@Us3332@g3@/g@ =_@]8R@ffff@C@@派Fs@`F&u@Q@*~@z4@"E@bD@ O;g@[q @!n.d@O@鹶lO@J332@)0@pF+@qx7 @pgݗ@t@;5@fBn@cy @JiB@ԛݗ?@u_o@1&@蟄&@T@Q@Q+ @Em\@ L@ⅇ@*~3@寅+a@'o@O;dZ*@xZe+@>$@gYԕ-@SfR<8@ s@E1@&G+ H@o|j@gjf@ 䎊|@x-k~@tE@p =p@tzG@yQ@cQz@fffh@ޕG}@๣ =q@EQ@(z@@3 =j@3333@nvV@g>6r@|9Xa@mS@Ck~@Qt@u%F@˺`D@p-@-@`@bM@ᙙ@@@艠'N@|_@? =p@ @# k@^w@bM@M)x@!@L~(@zC}@c@Լj~@><t@궮}x@|q@́oD@w5O;)@@0-@#5X@Hp@\(@{Mj#@LUn@勷)@䥹K@䪶ȴ9V@r@(Ž@9{J+@sA N@ᴨn@:v_س@-Lu@QO˒:)@ҟl]@@z{@v (c@qƚ,<@u陙@|Q@m$@Y k@߭{@O;_@gd,<@T`i@3OC@@ŘQ(@lJ@>҈@䜈$ x @ꜛZ@ 0 @~BZX@坊`:@oiDU@7;@vȴQ@ݑhr@!p9X@ˆpE@LF]W@ I@j~@$J)y@M@z@"P@Ckjs@p@=@ce@c@5!-wE@Z&@ D@KlF@zG@t8Y[@4@@䋅 '@G,@Hy=o@dU+g@\Y@eOsP@IzL@K]@h-@C@~E@yzG@uGz@qn~"@t$[W@xu"@@o@ۇDzG@%1@sh*7@p$@m*Oy@>@@6Fs@䬥}Hm@aG~@Q@qp[0@㼔q@j@Z}n@ "g@9r?@)y@!}Hw@ŋg@tK"S@ W-@ezxl;@C,@PտH@ @]F]Y@eSZ@ʶ}]@ ՄM:@䐀tY@tZ@1Dg8#@"+ @w@`\(@VϬ@㌬64@s/>6q@0"L@n@bb@N9@W.H@Z@Zl@ije@&IO@zO @w #@q7@u+j@zᔯO z@\E@א7@~'E8@Khr @<%F @m̼j~@ᏴɅj@#9@JL/@ n@.G@˒:#@ukMM@%D/{Y@{L_@kЃn@k@ ě@3tj@$tS@d|r@A [@A79@D@u@`A @NFs@yCD@(@Z&_ح@$Z@]E@Hu%F@U#9@㜗˒:"@ԖzM@ n.@6ÎMY@fB@a2V@/h@t9X]@߁%m\@ɾp:a@ŏ L@\@|gtj~@xJ`@tk~2@s@/@v\(ª@{~l@Q@$dZ@ @I޸Qk@+ht@6zA@Hj~&@n@/Ffffn@YE@MG@Nj~@hr @p @{u-V@g@Pև+@RGi@㰄(x@Q@9XR@Sɺ^5V@XbY@]\,@_-@}Z@[9X@ \@ L@{M@17K@n@ⴅQ@ᳬ@y$4@KƧ@Z@mEm@aDzG@۶6$.@\!G@/@|Vd@xup t@uMhr @r P@tU=@w䎊q@{MA [@C\@4zE{@ڧ Q@ݚsE@޶\@߱@*3333@i~vȴD@ܿ[]@y}H{@wO g@GI^9@axt[@s]c\@ @J @edj~@R5O@T%5@.zn@@ܑN?@*g|;@- @?$tS@Ⲉ[>@/@<1&c@r k@(cA@M`:~@g@O =p@߆U@> 0U2b@0/@مh@"- f@l"h @|UE@y ;dZ@u6z@qU@sͭB@vR=p@yFV|@G`@3-w1a@q_@FQ@@-@:@0rO@_`@A@H@q 4@̢3@@ G@}V@4!-wE@cU2a@0Ƨ@? =u@V`@힃@#Kjb@\(@Z=p@D@mS&@0!R@ނ*0@zG@ٰrG&@/ d@ M@~҈o@ztj~@wn͞-@u}Vl@rJ@uw1@w4J@{%84֟@6zQ@f = @$?@]_o @G ,<@R[ @ͯ;dZ@f{J%@v_;dF@ޡ<63@ߑs7@&vȴ8@'=[@2U>@=oiH@5͞@ E@߯ q<@ŕ]@0S @ޱnj@ݓ:@䎖@٭ ~4@?A 9@Ce@ =p@~ݗ+0@{{䎊!@x@v3R@@tx@r0-@s;dZ@tCKƧ@w3333D@xq@{x@hۋ@uaH@6G@;dZ@{Țv@ךv?@؄[W>@٬|1&@1$Q@ʖ4@PF4 @l*v@-}p@a@֝/;dZ%@m@Ʋ-VH@9XS@VF]p@1()@|%@y`d @w\(Œ@v"@t @r~"@s`A@tlO@viGz@w@yv@zC-@|bM@-V@@lF@nx@5lF@͕$@RzG@vȴX@~bM @{dZ@z_E@x\(e@ws|hv@vE{@u @tql@r,;@sC+ I@sS&@uC:@v1:@vj~@vA [@v '@vm\@vT@u4m@uEM:@toW>6@t Mosunpy-0.8.3/sunpy/data/test/swap_lv1_20140606_000113.fits0000644000175000001440000004730013203275053021345 0ustar nabil00000000000000SIMPLE = T / conforms to FITS standard BITPIX = -64 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 32 NAXIS2 = 32 DSUN_OBS= 151790625547.0 / [m] s/c distance from Sun TRAPELEC= 0.0 / [ct/cm^2/s] AE-8 MAX > 1MeV @ 725km model OBJECT = 'Sun EUV ' / object observed COMPRESS= 'jpeg ' / (off,lzw,jpeg) on-board compression algorithm GSEZ_OBS= 4577266.29539 / [m] s/c Geocentric Solar Ecliptic Z PGA_OFFS= 59 / PGA offset DATASUM = '3025099225' / data unit checksum updated 2014-06-07T00:09:45 CREATOR = 'P2SW_PREP.PRO v1.4' / FITS creation software DTPLAR1 = 2000.0 / [s] predicted time to prev large angle rotationDTPLAR2 = 417.0 / [s] predicted time to next large angle rotationREADRDIV= 0 / read-out rate divider GEOD_LON= 88.906357703 / [deg] s/c sub-point longitude SWXCEN = 511.18 / [pixel] axis 1 location of solar center in lv0 LEVEL = 1 / data processing level SWYCEN = 515.5 / [pixel] axis 2 location of solar center in lv0 IS_PROC = 1 / on-board image processing LED_SEL = 'a ' / calibration LED selection TEMP1DET= -0.7299865722659999 / [Celsius] detector temperature (SW HK T CF) CD2_1 = 0.0 / WCS coordinate description matrix GSEX_OBS= 1612053.91183 / [m] s/c Geocentric Solar Ecliptic X CD2_2 = 101.19257087008 / WCS coordinate description matrix NPRESCR = 0 / # preserved pixels - cosmic rays NPRESLZW= 0 / # preserved pixels - LZW decorrelation CAP_MODE= 'CDS ' / (DS,CDS) capture mode TRANTIME= 2373613992170.0 / [OBET] transferring time HASBLACK= 4 / HAS detector black level CTYPE2 = 'HPLT-TAN' / WCS axis Y CTYPE1 = 'HPLN-TAN' / WCS axis X EXPTIME = 10.0 / [s] commanded exposure time RECODING= 'fixed ' / (off,fixed,adaptive) on-board recoding CDELT1 = 101.19257087008 / [arcsec] average pixel scale along axis 1 CDELT2 = 101.19257087008 / [arcsec] average pixel scale along axis 2 P2_ROLL = 90.0021549957 / [deg] s/c roll SWAVINT = 14.1629 / [DN/s] average intensity in calibrated image GEOD_LAT= 37.4264259059 / [deg] s/c sub-point geodetic latitude DATE-OBS= '2014-06-06T00:01:13.567' / UTC time of observation HEEZ_OBS= 4577266.29539 / [m] s/c Heliocentric Earth Ecliptic Z FILENAME= 'swap_lv1_20140606_000113.fits' / FITS filename INSTRUME= 'SWAP ' / instrument name PN = 130 / on-board priority number EACQTIME= 2373613992170.0 / [OBET] end acquisition time HEEY_OBS= 5175545.87671 / [m] s/c Heliocentric Earth Ecliptic Y TTEMP1 = '2014-06-06T00:00:50.000' / UTC time of detector temp 1st sample TTEMP2 = '2014-06-06T00:01:20.000' / UTC time of detector temp 2nd sample OBS_MODE= 'Variable off-pointing' / sun_cen, fix_off, var_off, cme_track LANG_ROT= 0.7071067819 / commanded large angle rotation component LAST_ROW= 1024 / last read-out detector row FILE_TMR= 'swap_02373613992172_44dc7909.fits' / SWTMR filename LAST_COL= 1024 / last read-out detector column CHECKSUM= 'h9kQk8kOh8kOh8kO' / HDU checksum updated 2014-06-07T00:09:45 FILTER = 'Al ' / Aluminum filter LOS_ALT = 1000000.0 / [m] s/c LOS altitude (1000000=no atmosphere) OBSRVTRY= 'PROBA2 ' FIRSTCOL= 1 / first read-out detector column RECBIAS = 10 / recoding lower limit FIRSTROW= 1 / first read-out detector row CD1_2 = 0.0 / WCS coordinate description matrix CD1_1 = 101.19257087008 / WCS coordinate description matrix HGLT_OBS= -0.08771228316510001 / [deg] s/c heliographic latitude CUNIT1 = 'arcsec ' / WCS axis X units TEMPDARK= -0.7299865722659999 / [Celsius] temperature used in dark subtraction CUNIT2 = 'arcsec ' / WCS axis Y units ORIGIN = 'ROB ' / Royal Observatory of Belgium P2_Y0 = 0.000141676349374 / [deg] s/c pitch DATAMIN = 0.0 / minimum valid physical value ARTEFX = 'on ' / (off,on,cosmic rays) on-board artefact removal SOLAR_EP= 7.25146735653 / [deg] s/c ecliptic North to solar North angle LED_POW = 'off ' / calibration LED power CRVAL2 = 0.0 / [arcsec] reference point WCS axis Y CRPIX1 = 16.5 / [pixel] reference point axis 1 CRPIX2 = 16.5 / [pixel] reference point axis 2 CRVAL1 = 0.0 / [arcsec] reference point WCS axis X TELESCOP= 'PROBA2 ' / satellite name WAVELNTH= 174 / [Angstrom] bandpass peak response LONPOLE = 180.0 / [deg] native longitude of the celestial pole TRAPPROT= 0.0 / [ct/cm^2/s] AP-8 MAX > 10MeV @ 725km model DATAMAX = 367.987 / maximum valid physical value HASSTDBY= 0 / HAS detector standby mode RSUN_ARC= 945.771838956 / [arcsec] photospheric solar radius WCSNAME = 'Helioprojective-cartesian' / aligned with solar North P2_X0 = 0.00246297653099 / [deg] s/c yaw GSEY_OBS= -5175545.87671 / [m] s/c Geocentric Solar Ecliptic Y HASOFFST= 11 / HAS detector offset level DATE = '2014-06-07T00:09:45' / UTC time of FITS file creation REBIN = 'off ' / on-board rebin (2x2 pixel average) SACQTIME= 2373613763710.0 / [OBET] start acquisition time HGLN_OBS= 0.00171988273121 / [deg] s/c heliographic longitude FILE_RAW= 'BINSWAP201406060001270001016672PROCESSED' / raw telemetry filename LZWDECOR= 'off ' / LZW decorrelation CROTA2 = 0.0 / [deg] axis 2 to WCS rotation angle CROTA1 = 0.0 / [deg] axis 1 to WCS rotation angle PAV_ROT1= 0.0 / commanded paving rotation component 1 GEOD_ALT= 724534.193449 / [m] s/c WGS84 altitude PGA_GAIN= 1 / PGA gain TEMP2DET= -0.7299865722659999 / [Celsius] detector temperature (SW HK T CF) SIZCOMPI= 668496 / size of on-board compressed image WAVEUNIT= 'Angstrom' HEEX_OBS= 151790625389.0 / [m] s/c Heliocentric Earth Ecliptic X RECNUM = 3600 / recoding upper limit PAV_ROT0= 0.0 / commanded paving rotation component 0 DETECTOR= 'SWAP ' / HAS CMOS detector 1024x1024 pixels FILE_TAR= 'BINSWAP_14369_SVA1_2014.06.06T23.51.35.tar' / raw telemetry package BUNIT = 'DN/s/pixel' / unit of physical value COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT ------------------------------------------------------------------------COMMENT $Id: swap_fits_template 5026 2014-01-08 11:17:33Z bogdan $--------------COMMENT ------------------------------------------------------------------------COMMENT ----------------------------------------------------------This is a leveCOMMENT l-1 SWAP FITS file produced by p2sw_prep v1.4 at the Royal Observatory COMMENT of Belgium. If you have difficulty with this file or wish to make suggeCOMMENT stions for improvements, please contact the SWAP Instrument Team via emCOMMENT ail at swap_lyra@oma.be.------------------------------------------------COMMENT ------------------------ HISTORY SWTMR 411899SWEDG 411904FITSHEAD2STRUCT run at: Sat Jun 7 00:09:39 2014HISTORY p2sw_hdrchk v1.4 Computed detector temp.: -0.72998657 Celsiusp2sw_pmcdiHISTORY v v1.4 Reverted wrt swap_pmc_20100308_164500.fitsp2sw_pixrep v1.4 ReplHISTORY aced wrt swap_satcds_20100113_152800.fitsp2sw_drksub v1.4 Subtracted moHISTORY deled dark with coefficients inp2sw_drksub v1.4 swap_dark_coefs_201201HISTORY 01_000000.save usingp2sw_drksub v1.4 T=272.42 K, dt=10.0000 sp2sw_pmcrHISTORY ep v1.4 Reverted wrt swap_pmc_20100308_164500.fitsp2sw_ffcorr v1.4 FlaHISTORY t-field: swap_flatcds_20100101_000000.fitsp2sw_despike v1.4 Despiked atHISTORY the 6.0-sigma level (14571 pix)p2sw_imgcor v1.4 Image centred on solarHISTORY disk centrep2sw_imgcor v1.4 Image scaled to square pixelsp2sw_imgcor vHISTORY 1.4 Image rotated to solar North upp2sw_expnorm v1.4 Exposure time norHISTORY malized data (DN/s/pixel) END ?Y??٠?Y?`?ۀ?Y??٘?@?@?fh?@?38?L?0?4?h??fp?8??@?٘? ?h??L?s8??0?Y??٘?34?L?p?&`?fh??0?@?p?@?f`?f`???h??s8??,?@???L?8?&h?d??&`?h?8?`??s0?S0?L??8?L??L?ٙ?? ??㙠??h??8?L?0?h?Fh?`?4? ? ?s8???Y??&h?@??ҙ?ހ?fh??f`?ޙ?30??٘?fh?30?4?٘?왠?d? ?Fd??S4???h@f@f@vf??d?? ?9?L?f`??f`?h?? ??s0?٘?٘?Y?f`??Y?? @6@@@@#4@3@!g@`@g@f@f@??y?4??38?L?s(?? ?`??8?ܙ?d??L?@@/@4@33@g@+@:2f@O7@Tfh@R@M3@@@@2@@@ f@ ?0???h?٘?޳@?٠?fp?L?h?Y??@ 2@@@#3@/,@N3 @Kf`@3@4r@Ntf@2@#8@ I@?S4?l?@?8?0?܀??y?30? ?@@ @~f@%̀@G̠@X@JEf@C@@C@53@@2|@.4@#홀@9@4:@:#@D@BP@ @Nf@??0?&`?@?h?&h??y? @2@@g@(@@B@@z@$f@"3@0{@@d@-3@'3@4@$f@0`f@@0@3@1@R@@< @3@?0?s4?S4?`?fh?fP??s0@4@ y@a@@,y@D8@I3@@<0@8@"3@%.f@7@G@#1@#@23@@A@Bf`@253@@1f@3S3@@@@/@g@ h?y? ?h? ?L??@0@;3@ @,f@A@[|@3@:@1f@@'E@8@@?@@4@@=@Cp@CS@/3@4@95@l@O@Nf`@G@DD@+f@7@f?h?f`?s0?&h?٘??34@@&"f@5z@@H@s 0@D@7f@@Nu3@@Hff`@1y3@@*H@5@Q`@+Rg@(P@*&f@,3@B3@@<@f@@f@@9=@U8@KT3@@ l@2??s0?????@4@!@@f`@P!@F3 @:@h陠@A3 @D@N@ @ 3@H3 @A@Qef`@N@1ۙ@:@>3@B3@@?f@@[fh@bd`@@Rf`@9?L?? ?h?L?@2@ @;3@8X@\@5@,u@@Bf@A7@,f@0@f@0Df@53@P30@Kf`@D㙠@=f@@L3 @6bf@@6@F@P3p@Ucfp@@?h?8??s8?&h?Fd?h@2@l@3@]@A@,@;v@@E3@@L@Q@9B@Ef`@D3 @&噀@*3@+]@:f@@.h@,k3@1@=@<@T@@&f?d??s0?8? ?? @ i@3@A3 @fB@@=3@1v̀@T@^CL@43@I@If@@e=38@C0@3Y3@;\f@A 3@@9f@@=@0}@5%@?[@F@Bf`@@?? ?٘??s8?8?4@)@Ff@g@=@@?m3@@5@bL@Hq@CZ@bP@L^f`@aY@0`@7o@7tf@@2s@-f@,f@9@@̠@F23 @D@GS@0@@L@?ٜ??f`??Y?fh?d?&h?_@C4@d@#f@@'f`@J@D%f`@=3@@2f@@7 f@3Xf@@0@9@<@913@@C@Du3@@B@9ߙ@A@@u̠@:@A@F7@R@;Ù@p@ f@4??h?٘??ә??٠??Y?Fd?@@ @@ @6f@P@Kܙ@Ep3@@FY3@@D+3@@Af`@@ @Cnf@Ki@O@23@@ @ɚ?0?h?30??fh?ș?L?߳0?s8?8?d?Y?h?L@,@@l@*P@=@C@L @S0@Q0@N@D@5G@'e@@vf????8???p? ??ِ?30?陘?30??@f@4@!@@g@@@ @%f@#@ 3@(@P@ ???Fh?y?h?30?h?L?h?f`?&h?f`?@?ݳ ?&`?٠??0?8@@P@ h@2@l@ @ I@@4?&h??????4??s0?8?`?h?0??`??٘? ?ڳ0? ?h?h?h??0@@@4?h?`?,??4?34?&`?S8???S0?????ڳ@?٘?P?&`?Y????38? ?`?@?l?,??0?L?&h?&h?? ?8??٘?L??㙠???fp?L? ?@?3 ?30??L?8?0???? ?h?9?٘?0?0?홠?fh?8? ?0?p?L?٠?♘? ?ހ?ؙ??p??`?30?? ??`?f`????s0??8?ٙ?㙘?@?٘?sunpy-0.8.3/sunpy/data/test/tca110810_truncated0000644000175000017500000001320013231613137021354 0ustar nabilnabil00000000000000SIMPLE = T / BASIC FITS TAPE FORM BITPIX = -32 / 2-BYTE TWO'S COMPLEMENT INTEGER NAXIS = 1 / 1-DIMENSIONAL TEMPORAL PROF NAXIS1 = 10 / # PIXEL/ROW BUNIT = 'CORRELATION COEFF.' / CROSS CORRELATION COEFFICIENT CRVAL1 = '22:44:50.547 ' / REF POINT VALUE IN HH:MM:SS (UT) STARTFRM= 1 / REF FRAME NUMBER CRPIX1 = 1.00 / REF POINT PIXEL LOCATION CTYPE1 = 'TIME(SECOND) ' / TYPE OF PHYSICAL COORD. ON AXIS1 CDELT1 = 1.00 / PIXEL SIZE ON AXIS1 IN SECOND FUND-AMP= 11381 / COR_AMP. OF FUND. ANTENNA SPACING AT STARTFRAM OBJECT = 'SUN ' / OBJECT NAME IMAGE1 = 'R+L ' / OBS-FREQ= '17GHZ ' / INTENSITY AT 17GHZ TELESCOP= 'RADIOHELIOGRAPH ' / NOBEYAMA RADIO HELIOGRAPH DATE-OBS= '2011-08-09 ' / DATE OF DATA ACQUISITION YYYY-MM-DD (UT) JSTDATE = '2011-08-10 ' / DATE OF DATA ACQUISITION YYYY-MM-DD (JST) JSTTIME = '07:44:50.547 ' / TIME OF DATA ACQUISITION HH/MM/SS (JST) ORIGIN = 'NOBEYAMA RADIO OBS' / TAPE WRITE INSTITUTION DATE = '****-**-** ' / DATE WHEN DATA FILE WRITTEN YYYY-MM-DD (JST) PVERSION= '6.00 ' / CODED BY N.SHINOHARA 14.MAR.95 COMMENT BUNIT IS THE MEAN OF CORRELATION COEFFICIENTS OF THE ANTENNA BASELINE COMMENT LENGTH ABOVE 100*D*COS(THETA). COMMENT THETA: ANGLE BETWEEN THE ANTENNA BASELINE & THE DIRECTION OF THE SUN. COMMENT D : FUNDAMENTAL BASELINE LENGTH OF 1.528 METERS COMMENT SFACT: FACTOR INTRODUCED TO REDUCE THE DISCRETIZATION ERROR END :@9ȹ:ż: W::s91:t:" :sunpy-0.8.3/sunpy/data/test/test_ana.fz0000644000175000001440000323360313203275053017301 0ustar nabil00000000000000UUu3 XL=0 XH=1023 YL=0 YH=1023 NX=1024 NY=1024 W=1024 H=1024 Ts=2011.05.05 08:31:00.631280 Te=2011.05.05 08:31:00.648652 "Camera XXV [CRISP-T]"[ITEMS=1,ITEMS=1] "Chopper"[ITEMS=0] "Tiltable Prefilter"[ITEMS=2,POS=7,ANG=11500] "CRISP"[ITEMS=2,LRE=u161DF8E4C971AUUu3 @,HRE=u25CEF7A7B86FE@] "Liquid Crystals"[ITEMS=1,CMD=v2710t01v2710v2710t01v2710@] 3 ޮ![nA W"^/8zC%_o~Ůz _W~C;zï"/(zA `^0 a^P ~ oCCrɯ7aW/_.zC0^ _ _0 Ao E0! W _1 0_;v0_wE;zA+zooz;p/%!삠~" 7 oGn(v~ zC`_ vA/vCo^.7 CCozo770 Io!W~C8vE+o ~ï~A;v a" awzW `ñ%^0 A^ o0 _Kz; ~E/(P^1߱z$o / . (~ (~ "^-/߰;~C;zbwzAbzo  !zG/8~En~E/^0!"E/7! ] ~ozA0;/~ ^ #W!_/ CP~G +~K~.W^E%wvE^^ A0 A/ 8v _ oz+]^7 ` Co07d  +v.o~C AKzA/K_/77`~cC ~`(~A  aa ~ aE aï$ V ;^   +~CP/C~Gz w~Go C/wcW^Ao `~AC w~~_;z#WzG7 î(vKnW~W~ _7.~oE+~W _ n7 ^~C7! _ 7W 7 (zAA` /8~ Cpo ~A_ +_/_]+]A~" C/(] !` 7 bjG C7~Òz#(z"^ ~A+߯zA`~A0~/(rIoa` ð+~7~Eo(7e+r!``  _Kv\Q`/ 7 W vnAo~ ` W _+~Ő7 ] Ao([;vAA0`0߱%`v70/ C o ^ A0Wa A0^o~_ aW o a C o ~A0 7 m;~!8vA0`oCdW_W wA+`!z~A0 ~Co$zůWw E~~eW^o`WK~ozC~Ezn+~`zIo#-^ aKvov+vGo~$ 0~ޯ" ~/W 7 $W +~7 ~Ev~o~A-_+~ 7 dW +z0_1/vA+~e ~A +^P" CzEP+zG/~V_[~]Krn(z`W  ^0 bw!a7 W~Ů(zzo~/ W"Zvő+~E ~Az0W~E!W7Cî7 ߑ+ _~E`~C; a~oa_o^~CwE/C!zm"/~!zCa a7 An "A  ]ѻ%]1 /wEovoz7b7 A0`zoW" _vC ïWo C _zů! 7!_0 ߱ _+~WovA+~!zî(~!z7 A _/a(~!(_"Ap܎_07b^Kzzoo_P߯` A . ;zA;r0~C0A~I.XvAzC 7 "߯~ ~ozC07_1a a7 rK/+~o_0E.(^~Ez~o~E0] ~CE!(~A/#~^~ 5V]P]`zEa^oAzA0ů~ǯ_P~Eo(^KvE ]aW! `^0 îC+ /~E7# oA;jE#w ߱~KvzA0W wc+zIvA_++~o % \ ~0 /zC+z vEp~ A `~E0]P/(~A `~ C` E\ ܱ`  AW b[rW ~C+~Ew!~o/ ^0 W~E_q[o ~A;^~{r ! ./ E/^/HzC  _ o #W~A0!%q~ v;zCn8~~o~A !~/ozC AWaůW./ vE+_ %aW;o߮!/_ / .\+ ^0`/HzA+~C zCP 8~!_+~] A1_o޲ ^1 _+zA0Zq`(v/_ zŰ `W / C ~A~ ]~G7 A(vE`/^vd77`vAP~CoHn/~A  ^Co vE_] 7~!~z~E ~CrPW Czb~o o a"KrE ~ z0!ozCb__0߯z!`%A(zCoz+_+~e7_0 "%b7~EP0 W܎w!(~A_ zo;~ AP~E~Ia~7,]0 +vG/z;z7`o(zAïc C_/ůW!w~Ů`!~ñ jKW~G.8!"~A  w .] zE_n ~" A7o_~a_0b^+~C +_~Ib~o~/(zGo AP^K~_"w~o/~~ǮC0CW~/zw!` W~C0 ^"o !~ Aoob AK~o(zïzo(zCo߯- b+rA1 o(  wC `rvC_zC0G.(~zE7z/~C0 (zAP ]p`+!vE/C_!nv~n A0A `C ]7 /(vE !~G.+\^kvC.z!/Cn#oW!^^~AK~!` _PW~E/(zE` + ߐ `/8z;[rG W" A~ _ ~/zI zE߱ /_C삢7n~oW~/_0rEP ~ǯc77/ ~#Aa7!(vG/z/(zC/_^ ^ _07 `A`/bWa% .^c7AP ^~G wA ` "_;^`Aw zo(z_0_ (vC _0W77 8~A/aA _+~a A7 o~o~ vE /~C/8rE ]` (^/ vǮ(zb~7 7 w߯(ߐ+ A w!"77c[j0 ]rK_+zo~ð+~`]Q_0AKn _077];W_QaW_! C z/\;zrzA/!zA bW _߯n_^P#ů+v.~bPbw䊢!߯%_;v70#/~~7oz/~a7 p+~/(aw_;zE0A~+ rK !z^ ^ `(z0w0~C+z 7 Ao~n~o%AnvPaz.8v _p!(v !b ñ ޱ ߯ A`~G.(~C ~0~ůWnG/` `cKzE/_0+nG _+zC+vAP` A+v0^"/A0/a ~7 7^ a C;rů"#Azq;_1C/(z!~C ^1 ~A /Hra#` /(zï 0_1!~A/~E/+a 7 oCwvE0 A A z ]~bE/( m~A_0 ;zo%~A;rAP^+zA+%1^o8nů/z~C;~CaW~C7 `8jI_ "wC" a/`wW` !(~!(vA o ~EzE!77  K~7 Aw_W~~oc b~wz7 A/~A +~C ^/];~G.`W! A C^~Cp~7l~Eo~d+/ %w ;_ ovE0 !AG`~+^ o(vEn(~_  w8v;zC0"zv~G  /~APQz"!#"(vA A;a G-)~/pK__p_07` ~ ^ ]0W /w_ ^"~ Aa]P aw^^+~W_P!!7 A# `A0 7A (o+vC W`W! ߑ_zG CzEw_Q7ޱ+~ ~C/(`W_p-߰Kޯ]Wa 0W0펡zo(vP0  C+zI+z/(P!zI/! CE.AG_K~E_ _0 o;~AAz/~o#;~#! (~W W"~mW `~C0+bwW`C  _ W`]q%^Po~C,_!;zo`#ð_~C`W_/~/(v߱+[1 //(zG/. ߑ+ ~C~A~+ ~pzo(v"A~^`(z_ A;vA+P W0_ ~/WW_^o~ W_ ~E` /"A;r7!~A;v ~ 8~ _o~\ _p;r!ñ_  z/_ / `/ A _"zA;~ _``(v^ A0~P`n0 _ !z-W Wo voA;v!zo~ !ïEoA~ɯ7]0nz w `%q;za"zIn(r/z7^CC0z A]_0 ^ _;vE ;zAî;z~w "%7vEzC0aWzů7 Aw`CA7߯zC (zA0C/_ A/o__0 bv#7~C$W" A~/7"~C ߯ .%`a~ (z+~/_7nzCP!(]A0`\0W` +_1^~P~EzE~o_20 _. !~ˮW~C0~C"o~7_#anvC/^ 7 0_0 W߯+~KvÅ߯ E 7n~AKvG~~_P C/ ~ .`~A^   !!%A`/(~W A bC C ;7A A^# CzAQCWp~b70^!zP܎_E E^ aWW / (vIov ߯v~CobCEoazE+ 7zAP7!ůo8zEn#+~bEA^7!A0~E0EK7/`w~A~naA/(/E`bwbrɮ(vo~.aEwa bWz Ac7EA ~n`0 ~˭wzIoz"`a]]1_P Z wvC0p_7Azc /( W WoaC/(; [ !p_ z0~C0z+v1/~n ACA/(~ ~GPzǮ ]1 ~C(v`~7_ `z/(]CPW~07_/ C+ zï+~Að;vo7 "_o n zA `+zIo ï_P /~CPW7v_z-  W+~zEP_~E/~^E zE ]%^p_P `;zA0􂠗] +_^Go!rCPw~7 7_ c7 voW /]0 C` _1C~+ް+~C"a/(zů Kv/ ~A a wW!ܱ+^;Co8zð;_CKzA~P~Eo c߯row;\ `WzG/ݲ+z.~A/C~/(zz0 W_1`_7AKz7+z ߯o(znv//a~Ew!(v1삣7WA E$"Cp~C0zvG ~Go(+W !\ Z~G!v˰;zE~Cw`7Gn^P!;~W .8va w"(jI7]o_[zAïz/ 6 C \ w`~! C"`]7o+!(~ԊCz A/Hrv#;zCo"/(zA%1 A+v`;~7! b zW aw P77!~AG`(z~ ! +~A0 WP~G7E/zŮr%&;~W~E_^`]PcCo ǭ!7~C/(zE0䊡7 _G/rEo ^ 0  dW C/zC;nI/W "Ca+~o A+^oP7 zAPz _ / vE17z!~"zEPzM/# `"A `r~ aW+z7dW _P"_;rEp~C `W~C0ArI7 KzA0_`!awc7~C+ %7A "`Űab vo~C+ro\ v0~W (zC0 ^v mW;rC~A0ozw^1 A޲/(nA1߯~ Aq[~ #~\P  E/z#_%+~KW ~C/(~A ]~C0_0 v~E __p 8r !튠Co%_Q_ W^ `~ vGw~ /z/ߑ+~b A a`w~A0b~C0^W슠W"`W^z !"~dW (~W`E ^+z`+z7 !ba /7ïaW C/8z7~C;a # C_$ z ^0 1~E0 _P~a~AW솢w[v+`QP ~o/ ï(~1~7" w^Pz%%+vC0Ð zG+vE0 bw _+^ ůW#7^^ Aw 7Avǯ_7 ~"8vA0 ^n~#~A  !8zA7W 7Wa7 [ro~77aC/(~zn oz;~7;z aC0` ad+zAWG ~AA~.8~!0  a n;`zo !]0zC/ _0 8vAq"Iq`[7 _ C0 !~A+~Ao8߱^0 wzE~7 Cw~7 ^ ~ðKzA+W7 _+0o%zn C ve;zG/~ `7107z _oHz%܎`owE^_knI+0"~A^+_;`W$삤V70o(a7# _ W삠~0_waw~ _zE0`  Ů~]Q!"7a7!^[z`E+~!"_;z _Q! Eo$7K]o=![v.a7 C ~A AW`!] W7ɯW _-+zCzw!~"r WA/(zA0 vE+^P E ~InH~0߯C7 ^0A zC5oE / _Q킡܂ ~ C_+_ o7zKrE;~EoiWnRW7]Qq^.]+v"~zIn ߐ zCr]/`+zC;~Cn9ay^.8z^. "~IP ^Co$ C z/ E+vA0 ߯(r/bWa/a`a7 A[7CP$ zG~Ő;z7_azC/(z"_ AP_KzŮ _ ~"~7 w!(wb;z P7C C ! ^PC0 ] ~P%bzEoW!7 a~/W^ cW_+~AA(v0~Co]Q7~a7  A% ~1z^1+zǮ(vAKvoA0A0zEo8_0^P+`~E;rIw^~Iw]0 CmWKzC oWd;~vC_+z(!^W/`A_$v`j 7[;zÐK^ArGzůW+o(~!A// A"~IKarA7]~A+^pb prm7~pޒ,Kܖo7vެ zzC0#InS n ߯/\1,ՔvI{zm zAa(c8湞hroz]P~EeX\\_" C0bW 7+vE~I7 Ao^ _E/.(~ ^0 7 ~/~(`w^+~A+zE+zAP_o]aW_0"CGW_/C/8z_;~w^bw /)rG;~APp _A/(o CWn(~oc` Pߐ+^ _+~_! nz!(~Ao ^vA+~P~o7#w!;zE  AoC vE~% ~7A07 //8vC/n(z/(~ v/( ~CwK]7 zb/z/^;Poݯï`Hz v/ `W`_+ Wa;jOoW~EC//XzoQC/nnv7 A/w7Y(z_߯~1`9HYz^oW~ \$˔Ԭ~A zC CCPٮ;VܯCP CRqL/3jO(Vr\+~WYej:Nëj\n 7I4G5ٺD.[*lf\\1rM3A.("V "EɓTYV6_4EKn9 FPZBZ/zˑ#kWLR XK)W%bw A1# 0"Tb7zE^P#z7;~A~+zEo(za ůW`z~E zm^0 ~A0^P7~/~E0 "8~A/ /~v#C AP_ ~n7" AQ+WA orE^p7^pW,+""c7p~E zEzAPo7^1^/(~ ~7C w_o~ 7~W~C~ CQK_1CKvo C~oU,(~ ~C _ /(d$zrCpz`7v_orEP~#a嬫m^T-{ 7vE1̎PI$FRJ/~Kz CR5m@%PlUBWi7vC +ݱ E%+wmFRv~^`WM;^ 5r/IjHdV- ~MH.~^$KǏӬvA+(+߈8jv^DŽDrAo~ET4r 1<ԳNT#va2r_K!zb~xdJ?l w<їG3i*Pb0 ƍTaESN'mvTH0Fg67@ _۬Ҹɫ[byB`5+&;xLJs厦I+Zh۠$,ٱ[.6ЂЃX6"j`L`s ^E߯7`70+zï (~! o !(~`A`_p0+zAPoc A/(zEo(+zb C;~G71z\+ A W Ab~bí/7E.rp^SCn[rC #/߯zÐ ~z"A zC+ro 7aE7KnݮWWů(~EX w~ɯE W~V$a8#YΎ[+4Oꗻ~` G$E-D1~ J٠#Fhu͂ zC+`ʲ _PlZ`Bì~A 6b#ܲ`"1 -~x f)x9n̏5H#љjp ѯ~^ 0[Q#Ƌ?.խwzʹ">Bϋl҆tc‹(bk ငi=N$=UԂW,] /,Rv^.tL A!Ii ۍt]dX1nbWEߛFttT6jcGT ?)BhbEo-f[[>?& >(zꈦ!sWd[X5Nhtz2ֽ (ҵYJewȵr#C `G'8C" xv=,hJrUb072fy`v[yi}&-Pf0Xzy:> N ]^IU{v̠/Dfp,ϖmE l2@vl^A!(~"8_o(~AP~C _w wV_P`w7!o C0~G/ Azï~EawA AzE/ (z+!w\~C7Ao "]+z!~Cw(-Wa77 +7  a~EoC "_Cp `ro=!(!)\vo P7hrY;6^Xf ov-bK)Ƌm hfB`nk-*hC\ x搚j #NӬ5 *`ff.zY|^˲y%N;24p"{bo6[Xaڕj/* .') _Ws2҇gYz8q#E!iVM2g!4!!CHAR8q1ISdnmfë\?6`ÇPu~$[bZ&oKr]~dRF!z5a nhRXJ5^ҡHfE$TTCmခ<;=j-M t42Ov?2N4oC;~+^077 "r ^z/a~A`WW  `!(  1_ ] A.~CAo(~G/o`Aoï7˭~W`  ! !8z^C A7o o(zC;z70_Pv `_1` /c E/ a7E3,YUSz۫t~+vCS䊧i(ܦlYPdB| F'n.,v\ ϳpBjTNtnAPE@CI=F+> ~hQ#PbSz /H:ha=Kj5k]&ib%&ߪbBIk4iXqck&^Z =r ;E: B:VavkP9ZG\FM&C$Ry6 ֓2~őGuǍT1i´c"(vSE͐o+- -J0 DLX9RB\+(>+QP %)-i&EDǧwkkoۇu{5jAL1RTo,v+M$p(TT@2 xKo 'ֵrk+]\ͪuPC-<¢=nW-WgUR\J6A10;],m- s{a4h(}R%5B\A nqz5iDiJNCͦw*ӨE >HHzKj/H'9`~7~C;zC\QzGzG/WA/8va(ozo E1pW A7/(~A0zE_1b~7 0^vIe߯b!]P;+zE(v!v"8r~^PKzE^bwa!7_+~"] ŮXnrݭ(%.Ks߇pMX Rz_%Խw}nݓ^OopbPYZU9rOEA@FA+j8HA"4z+[X %`_95\. !r!F !!#8};]܊UY$6S3*j&DC;Riz`Z`Lbf7BYe$X[WvK_+WxQ9%k|>fOpStDCNl:K(:`WyCcuV9z8rc0KTꢠUt6sǾhZpj\>Thv,@ 4)B^ګYǖUm21YdSI[ϩFWnz,=6v.\*^ޭre{2X-ޕ)a$27~ŔޱR'"- af!_0Ɇf;^[k ZX榧v喱ͩveڧ::)*Įimt*eJE;MB~baiBm)|rCWz+]/A0_ C pP~C0߯;z`v;]~Cn_PA ~C~ïC /bA ԎP7 nPb A/(~dWb7E^\Cpv7`PW w Zz]oAK"$^3ZV.iijEɐDc:{0W+C |8B^ڵ!e!|WUG ٕnYdMZn")KUG@VlZ]w!&> (hvf}ծevV\^bK~^2H>Cu_lVfWi^r9d4?U>R-WJQ󉥢\eDCtUߓŚJkf"f(Y׳n]r͖ZY{RDC6谈U**bBYrOtql'd)jJH‹׼@İm 5J^*yCk e0u%XR4Yb_,T2R/! UKr˶Ӭ1(U#i=Zɏt5 XZUsuߝ_\Muz!WzHT }vѓI':ɮ+fU^WcCZ%ce<*Ft Gk Ƭ ~4.jY|*=JAnEESo0`RT>a̮H[GnpcQ 4MPەx/ d~G_w_0 A+8vA0~G/(zAp܎ `8rbz]7~+zCW !^17 _r;z/ba w!~0^^ a (^P 7 ;~7#Go/%e _qߓ^^/n[Eh8h9(Eɢzȍd~ݯz ïW !_7~E7 /Eo_A+\p] A!E. EKzo8zA KvP7"z+ozů\0w AR~A/8zoHe IQ_Ya(/"8~~A/n$ϓ|k_MZYgwv%Vi/ ~N^Ϙ@xtkر )({i\rEo|aWK5%r1h1n6"deb_2K*zeoϮiF՚]u˵rYsQo6T5p ~@3ϲR0-8Z#C6Ry6Kh~_u>6^R zt:iZɮ rtk:Ӫn͑^o=ڮjZ/<7 ,כoV4MC+jYm֚V*H E+$w_2[Mom$P'Gbp#F_0E5Dز m{Jlb_i4Eԛ y7aJ*X[7ۖ㱤([[3^K [M[zUq -,ՊVT7v[m M6[BR-UM\4U}P&V2SeBTkq>GtS:B>8 :Xĕ.z/Ԙz,AMA fځ6'կϬ7~/7$An m8r fǑ[~T1gj*, gv׸#:ZoUɨSVH@ JtN+8w`,Hz!+~ozݰ aWGoW !(z.(~C!A0" !8z/~G.;c7 Ao(r. awC+z/7<∶dU WKaEG-^7DCma:&?VcM1%( P0Zj(M ܀KlL^loH[V =i  <t &\jFەm jR -VӰRI hb\,&6 dUN_y~ܱ5QRCګLSi7~QvlֽBQ +Uh*rAT8Q)v,)FrY譒g9 E.[rtӫrSsJ{EUf*r~R5Cۦ'=,]WQTR#wصv/7VjW+rGԫR,Vr+ui{v^C6KW:LNѐJU-+ VE-i'C1Ϫ,P%cY,^/MSl}KP ҲK~SnI۞TFCeܲث6Ě[ntJcM6yb,~TzRL"XzˊN,]jTԖ/V״ VJ*AصrejT{B]+*W~ì)ZP/wW>3Er̾If\ibe+Uz$jbmhv߳jW>˪;J*5cirPTRS,x~]w;Rn)eܪW)Upm#7L\gsZZ`9j]^~=o 2Z_5eZ)5̒{+]T^jGjɬH!Y(kC+:K&hFck=֫ZwNjVewG[gٝQjZå]T{b ugDu[F(J6*%-=f<y{X rƣ~fhsEꩆ`)}3mESbXZ/eV Km,XjlN3rٵX_nHbSv,5V[Q+**z]1W*{ޮ` 8#!]l l$d=Y vů7_ IZKvE a oA/[~A1-YQKrE~W~`Xu/Ӛ=};۪'`-L%2 ZԨ,1A血vRܖvSkX-ViU=rN~ۯvK4Dܕw {Tk-CebͨwK>p.;u,9"QXf˕h=C:qhf)_ө͓{5"}iX6$$Kn\wVٵzѦ64+uv_ou\MrJvwJ~Ωxmm[AkW,IVf Y-˪ GuqYݣ[Xij=X7&6r6X(u[֐FeZIܲUUVI5X$n4jVj"lٍkr{ջjvZO]5&pZSnUtKCmW<4s TIJU4Mz)x}1~Y3T*]%΂uuz7 lլ*vA:e)zZ(8nEvii sh譂QK%E$aBq,yi7,Z.6ZO[^s܆#F!ΛRtV3]mW];+t Shz_Knm͢'jJ]Ol!bh[vr˪^|7 !~2[QU'scדQۥRa3d[}yW5.ZihΡ~.m^Sj3mOH]yfvOыMOdA=Q$caj٬JC.^_ ZR ǠcL_:f bQkF54t;a(V̨+vzV.(i^GJa(87kVZVWaܢKzrGUf8mJ~u%MUk2"vrM Go b\.W~m$kyn$jݽMUP̎l|[#Jvs]L\-zY啜.}݆XTRX,8ti/H~M5"[s-W$*S -׻]rVlXz ثuhzoM2*b͒,.ђ%MdzmjS$v쪮V.1W{n5;X- VC$ mjC-ZvA+[6mR<*ޑR˓\ rk׊fqeEkIfnz2٬\nv^\R]( uW1QnyJj1Z`RTZQRU2nAbɢQ]`F)bS8Gz=l\[Pj1՚v킫Ői bŊYnfmv0[IGܪkQͷSj_pKfŐ4A%[n%,Ugu3ZTU͚Pj.=v f֒ 6ZLv~_ bůw_AP4SUmiZ5J[zf"Rrjkb6^׉ 4~V D P@©C+RX8Zf+ Sn{vKT( ڽeYKVͨH_ˍFi]+2Muiyzd;F4i8j߭UUsrŪ[|#bRrSs,4ZtԦo(W7 Ih)VCD{ŪMҩ31VTp_G nweZRT%JW kv4Yݖ&9nx%êhEfuW w׊GCqFڨrMiՖVS>C4E,ϐi覫lWGϭ6P!0@Kr*5"/ݢYժUׯUr,WDdZ=a\ɯ7RjѪ5ĺzYtZw$C뵢aZ}Zk i2Z- nSɐ:OZDj ɮM{${>/EuupGvլ놦U_InUn׊R,KrW/4e57ǘK{fskJ$% !3EgXWj(hP ɰ-Ig۵nW.wժһpE9"K*DCĊZ%3,zWtՂHS1;cE,yŊubv ER >w+ZJ!*K[-AqŦ^fZ[,uzVCwMUeP yKXnHb5$5_t46{zһ=W'uĂкevxD҉rD!ÏR+~`A0_! %UAN#U(A b6I:`.@8c,`H -KkRFZ~ܠUC [k4յ=^ǫ f;!)sdkVaxݒ\m]r0chS2"\T$U)J]*Id7lQJE[VAodY=c rIUk^KV 7++Z Z6GK-(bk` ^yR]nn-%X[n'i~,>Opj% Cr^E TXwY*^/ŒV)z% vW^j& No%BKφ5K8_<^ٴXݺ-l25Q6+_ժ%y뽊ϩib(6E[rdVrRt승RUFDZRZrk4dNL[q4Ox1z˙M.JnJkX-}bvF#T$+tIR*6LS|дkf5+^L&E4Ւ\LUmW;->CkzT)nG.Rͥzi9RaxZvU p@{2DM['oA Fs+&c5ѸWRSk7\>f!##p׬6*M>+H#JeKROlݪ%Un6ԪNͺk~e5U fgR.zW٨N슞ؤ# znW8\ܮsrz*PJSzr'ޠ\_;rOɵ)jcV=nmL[KUmjIŮּ[x\R Oj-,zK6JTI%]V~Sv{E*cޮoE^Q&qոĆŦy=,5z"iNGY+z躅ORV{s5c)-hf\hW5*hTvDEZZkVveG(>`m1j=rvRUf|̶rj6fk9.9chB{oGnn~S/ޒTRM(ɮW nRdIw */cnKZ߭WOTzyn;>VTد^a 5+iN˰ʂzɮbVdMAwBL8_Nb\z~S$W(܆ ERU.$O#tm:bŞ!nAkV& mNIŢOK]otrܖv>_b.Wnr izZ-WPr_)rCcTj-7Ԋ6G/ܦ$fkڲjYnj+iZs b5jMM*R! "_o쎡o+~^Q,W,# ֩XDfօN` jGT]Y`.!;'^ajٰh]e;@F sFZRvճkY[ZRl 2P,C=7˚X:zC<-8VRw*~C/\O*jzm3I8 7TޔKҮ=/j %RkrWg"fϭVWZ %z=MQBtf+vT\։Mɒr*tU,i]ٚS\iURؗ%Sr[ / wCUT>^*Y5LrV^Yn綹,{uz7L av ~.#_ aEPn#WGql*>=08p#tUZpATZhF@JmtY*XkFޔ%YXpnJy+ިXچQy(jC8~!v(+cym]yˊf۽ۡjHgj&n6$Uk5-l'؍^.&Yk*imF0]kaM}v4fAʶ_mncKAr[=%u{,j_]d~q%n\ێ+ kM_T`֤W\.I{2U zŕՒ(^ L+ݢѰJjՄ&`w=CvS^QmckX~qimgR{.EP4+]mU$ÕEG;FR,6Gk4K6+oϑԵofgUO|K)[lEr4 _m[G:+~SZݪڬUUTuwJ~l;=4-_kR/V65r۲2,e*vG*t'kdI7ZMw)\a*baPMs/~=50JWHfcXf1rMi QlEtb0y"]RK{%n5^+k_TS;Ei7VoML7~('vT嗀YPܦ$T(c7zU-6ͺwѲOIл˰{mz晽~˨ZW ! ;_+~ !(j hV9P`(+S0r{{R`q]buqB _p{{h؎++JՊNTmM-[d .R#[)mrYdV.kWeV]XQ3ikOo7ul]unWZPkA g6bMuCkӋb-[5eT([j%ԕ㊅p -T+\k(VSr/Uvo֫_|ݞ%o EhFsVYBA85MQ sYzWawjzfX_H%4⪵^MfS~s]츅WPKN/;nAP~Œ V3Գs<\^]N)j͒Z4[mܢVtݎdɺ;/6[JBX!R^<[ a+/ٝjr+^K=CImuG5ե:ոm.bI,yb(W W7tY~ۭu[fG C&ܶqW7ԎB;3bNSzJZ/fd*F0=xխYHE-CA&6 tePvϵrͯzEl7%]*<ĐGjjn6\4FdlEUR,.hV+W nKw1̽ZqvQdfQ5ZCЛvY%Q8 PUKrIo38\pRtK)lHnK܎"u3]:ZVf]. aW_1^^P]PIԞ@%OX쾯K }fG,n3qlֳ RP F1(b EK7NrDSgo۽z.-[^/w~XzfUTW5eUP$SZ(8^%4cWgH򩵢[1ZS2UU[}%_0jאvnvv{U;V ^KWeW;JRpʓtUeijކdwN]0K2+U:2wkvE>Elh=Sj܂r E,-Tov_I7UVnl%I VX7$dIT[2k!lW[n٦ꥭyW+YrY/:2wNMs,f5˚mJoRkNIamV쮧Wl7gϑ}T%,y^U{ 'VRV4OӦJA1>_ERVZ.8 ռ[ ܔbE{Ree^1mbWb%{ ӵW/A,톧c,"fZyWꍦmyWԜ^S4^Cy=X{ȼvEco֢5׬e\ՌeK6ߺ،VjsEWZ4%՗~˯*~v"_3 kqhunޱԎTݦmrjt+{oMd֫7 $=Q`R~ bͦT.ݦ\5, Bh[\zUjv-=MǬUU }L5,ᩆq"L`[J*V`_/^ ]0 !(zoW |!l ThEWUMVsz%ldt0]VխJ֬&wOj^8Wzj})v,TV$rZ~5zӶ{ΐK1CiY~Ij,+CKK~G,]T c+jX"4 [b ?Uu-$+>dytwSk$TmH߬i2~gv;IvpnEd)ՎIvhZq+_Ī5bfN4^C- ܱ(:JRiŎUpS ׬T ʞZ?Vɬxvv)۳W~]WU'ղo͂ː>G)Uͷ;byE/yvV٢N+wOWTDۯfI3^eiYl^)6LE7ĎZ*K-zRJm}^jr,mͪ%k=Ku䪡61zGb&]xJAV raRTev >ٮ7EPݪqE^6{n,U*:zOk-"6fv{nM[ZayZ.TzA-c/TnW;enjpAQ ~/ w bwb~A "h6惕ekufm;n[{Dw^W$~Q5 Gt'{o+Wk>]^Gp0@:K؊\9ԴӔ[l`u:V,$DTX":6\Zm8J[~Ŏ[%ݯ n_$vQPԎ^+)vYUnUovzjԎPyU*[Jۭmj~e&rA0*vO3Ğ[Z[bhY5CQ Qjke9FzZH a KC+~E .8vIRAM!lʵS-46>մގ@l--'n܀RX ܊kq."GV̚4(fO0Z̒cvav ﬎ ~I%5LQ+ٚM}SWd=c, -vˆZK벥UMqŲ OvO,j'z,*=W\Yڽ\/o5H՚rYv\/-*hE{j)ՂVK*_mhK^;^-Vw[nܪTsjAq<ߵTMo7JUkn˲kOoUԕ+l,yZѴQvtRKJ +TOqeSΞ+}b,3F}ra~dl)Ƚ#jbj*#vvo̖:Hn,NZ~+UMp6Ozh-LnU+~M[Ke3F\JR]4EOnY,b:a&ĿVvẈr*5 өZŪ]/RfKx 4`*vD17rST:&kbYp~n@J=^6#|r7ä U &KzmWdIueͪ957T:CsP>ǜf;j_jWe#JQ2 `wZ6EwDQZvfͭɎhov,9<-B]mLk59ݯ5NeK%S/^(\,k5Dz ٮ;4R4*~_PܑRy6yqN98rޯCo#]0_$ (`wɐ$YV~A)1soФyv{ZqO'S v(,F퀒9meWڅnuۦUGT"kum"l^TKeD߹ z*7iymkxnåyFS >]әzU7DCzѭ^5DnOsYjmKbIR˕`+~inQm]4TvWtn 5ߵ[>05*&8zu;!U}ru-eEkwd$$4s%JrC4)Ȋ9^Ior+܂#lf+^+yRmo~[V >M.]lU`vbխZfCjJOsT7+{*UQV튢V&iYp0ĒZ)ZmMI|gF^-j$Իfs6.ZkVU*z6z%ͦ[25E2zI` g~*vk^T+w4]4rj(f޽)foZzYڊdS]k RI(͚bjJgцnʹ{vMԕb_*֫yb8߯6[foO0`Uk=MLeTe5:]o 5MȽ2fk5FgM˸[BV< gwze(^.JEd=FCozGlZ? &nwLuԪ~S-jڑ (~kg655UE~ ;}Zj펧gf ժ%$X oi^u;V-[nt*#B6zw 0!b CP㈎#yg4yVc٭څVjzU$T6rtJU?bm+B+nJn3旛zmKqRٖ,nWoB `~Urk~0P^vͲZ5jW7[Rf/jUfȆd,VϨz>J J(bܤZ1nW3~Kp,[ԊW+zϫVGj[C:Rfvr4*[GK.%Rdr*8NUzC\ lq])6 [\v/kݴ~ZS$Qu!|jhrzޱ~G/+z-af]WxPsZq>~^c5-1l_z{rY.4^qv ҤuQn+njJZf\.z^]tɍ£;fssƶ{*B$I(ZY;]͚,jö֚6D_ơUպ^ЫMPfwPJKЊuұ[#(:Qڝ>kVM_/Wj-;njU.)`^Qի-Mn l[%l=ɨiU+]=2bAr_RI:^N+S$Wfh:Uݦf~Yt~C8fGkYqԆrR;:W[kx^VCQXHY)tkVMo9vˎ5KN^mt}'z]AnVz+^IT$^f-- Us%CohWS%E-k!,m, T5YԺ6`Y A|]R\k;sEh VJgݑ+1i\'UCnl=/;*Œ!6VՑĖ"Z-]iZ.wzYXfs=6En7dMw,ZSm'`D00[)v GޛGk:_ѤnzRdvUL n.ʾksu,] FZ.+ MݚĒT7 bzݫ }[:V봫6M)˺>fH\Jbojj6m-]: Ղr[3,Vkg6rU( ~Ŭv5fb\bhn_/z/EKv+zE;p"(fbq M][vC@jb{;6[W)RաkzB~_[sR*׉,)JMnZj6ѭZUn9^ڭTDwB*YsJ_Vn1J:KK[J)A/=bmLe<^#c7QYw̺W+)K)Z*V,ؒ$]\bḴϲG-J-e^O.!nub4R;Komuj%0Kn-'~mj,((v-6=׌ﺼjje~ِ4ZM[cxXkUA-QrUs%Km5XK*G3bOk)kr6bXraV,Ruc&˒DϬ+ A'Ug pY S2+mQlԶjvok͆Z%>A5]fu>pjhl[nsk:Uj~DMre=𛍹5]YO^Kp v*d rU %gj'xVcfK ^q*|v߯{G] RZo~A;W WEw](#ÎSmYwcI<6ZMњ~ᑼFrU.DV="E#Iu]iR4 ʨ-M%2^M ֡mQjOlKuz]U ͒SJӯŢZԐ "MMn*F+5AkզiKk5Qߔ}M{rf 7ʥvzKdenIm7]+WmnnvKuTe)mFolIJ1Fլw͚b}kؑ*ݪX[ YfQ>gS ~եhgv,W̮UٯɕZӰn(,eR<&Ix5,kהj+lnm-J^'k]hh/z Cgm}"RKe۫*ve jj[~^]Ɏߐ {-èJ=Al(rɫ2f<,~P~Y66RW*ZR4$ %&+fP륂 v$Mjf/In_. -i^[+ SMPtvfdY:eؖ`TrbWIb!H/ے`\]I٬fY(&FE~Y=zRrNR>Ot f3:sfDEKmC*&ufΐ ~OTɖXEU/wU٧xRYW;]Ujig6 W+;nT%*knS&w OD<2jU Ԋ :Р~E ï$!7G7;~`@ 7)!db&g!=_V~Z-1/jSzwkU>ѕuMrk}nє_(Z0;Bs2dZߩMI.͚J劧U\y+Is}WFG))IBh;Lӻr5w]F3;7czi8UX6ߵfTB~oWtKnشKL~0zRՒ] r]o9]l£Wi[EXkrIk-Z;[H5K1j9FovYZW4׫U\T6RVJ6_nZӒ,!ΖC2 n]-EKgӰҨvKP\vBEz^W\7UؽU}OlIMӔ-\uTYzՔ%vKպ+gvwo~6E=EG=YZEIv\qU[+PYӚ*Z!WMO'YiIRDzkb75-M%fհMX W_orSUMzU, Ɉ.7n̊*YNۭvVձd4mSo9BYy< gYmJOX%_2풡VA qtn϶;=*Z͎ka\ ?C)(zA;2k;rըnh5S)h-%&fӫLovO[NI+*^T=hx%6#v~]0]aG ^K0 '0 p_J뫣ۮWiom4vmY,tEYqNOTő.ڪ$wVVj~_6,E5bhu[Rvno oŮIJk^[KvG;ib=6%AUZP~ٓj)֎ߪ5wbnALFMTՆ"LŝʆXNa$O)2OlZj݊l-ETPŦKv(^h8EgZѬy^*hU܆եd7>r1r5bA7RUy(Q+m4Jew^Y5r/x%' T1 ɬ{fyIEH?fA`N婵zՆSvݪnfv;\~c+v+vGzYirѳLnL:Wۣ+nݯו#9M&[+J#V +vCK~C.w:Vm}ْ*UZ='rU?$hyWk4Ԓܓ P/ת~)&Rlx2H$EL6jjQQi~lLVٓ+y#S U/4EY3*ƼVUnz*]KeRvݮ7 v*rGk&nI4:F6e׫ջnI[]]n g[^̦R_l(z6ȝ _{njn8zݖˆՙ~+ƒQє!F]PJҪ]f̆+WDm{wKRa-AmwJA2$):= U^_0;Q$~=p̭B~rrPzDYIEfUoI+J{i3uRoŒU&=:-Zj%fG9cSnrAQT =akݒ[/nW$,VrDrڞ9 R#0*|r+gtߕu:V"64ϨJT4f7z=Y~^PIzgP#;aUqj_Go:冡-dvs5L6\3Vެ2fG;KkJ"륶WW}8v_,9HJAKmXVihvr&`vő݊EWz˯:6 u*n]*.zXZ5ϯITXֲR\J[^][ E*:iuVir5ܶ nv)n^)jj8)W,,JXUoM6}^&yթHe Ci9JT~ܓXϣ׮TbPڢ$mzO("YE_۞nOw~v2YK9 PԾUF:]n4ïŊd6靡bBR$9J'Ύi% X~I)$6&UkmB/wKMu Ԏ-K{ v{+Жvc:MܖDn.V0IF.pEqU~UyZR-e U:ffZor͖Yt+ծfٳ*~VTn]hw;&9@ȪV+~` nޮ]+ d ^ XYV|Y;Vho%e0e>RV֠.˭@nHu>ܞm ZAeWЬ5E)K_I:EYj]KMeoekVzϮ pUT{ vԸ.9V]㧻nCPoT^-UFͬ ]jSlJ߮2S^K#ZVpkf=;vͮ z*bKM--quK6iu$ G[3Dk\,#r۬e2!~ [^C,UxXRdtGn5\+EQkH4o~ҬkwWZZE*NWeroXrΎԻiePU݆,k56]7ԔLO7r-%Tכ|MJ.]$TZMz̕.l.XX.{߬[zf׵KikjvWlO{8Mr=+9f^jS zǷVh 2fIFKxv[:zŮzYMjAV~ ݬ R몥w `ӮfMb"Vvw͆ixAyϧHmyj*ˇ%mz"]n[*fY+O1(zmug['Zc^d<^Ð+26,YY4 w[6[jn[mWZbW vM5h ~UW;bU̲!(RiUU:fZ,*j7X- z;۱ 7`WcX;ɕBUvRhK-tkrݶRR۶ٽ^%$w[ګo]i 'ͺ0eG/%$M&!*ZekՋM+v-BoWo5 6;:A.-yn^.)oQ2;V#ے ߒjWjf7 0;N4j [-hlU=YVܪ\}U)ٻefɮKkVX*;(PV.K~_YR۝QvlKN]h~0ڒk65^tawAjNSTeaK%!k~3[ZKͬm&AkhK*+mЖG"ْ5CXvQ&~rf(QznYve7b$JrS5 [u-Si^Uҭ62̊1YIbxrauC:n,8^Ǩʪ\^۩^`E!\5Qe$YEOKgݯfՊ.U~%,NZ_~/ ^+~b E0o8vo8$*k ONm akɵrquۮj-=I+Yjwm\nh5AtG f툵VVՉ=ׄjSXZITI NKuW߲l㱚fNcnbl05aד=j$XlIv^_/b$^ڦ>ꈾ_V$ ܖviȝlmW2tk:HrɬMa5d[FY5Ӑd+K"l6ɖ\zZU QkǒVrOUvlbRd̢2eXo VZ2V^v,Es=ϔK9-UIۯBCjy[=a*]sZ:aݚ^"crll. rwξgY>KXݺ2˯vKg߮)V2Ka64:+a)bgк^h F]nG5UXֆN\ >.Z/7% Ys4zCZɲ^Kׄf=(ի]JQUTQ*]-m xC܂߷׫}ljRRZJj%IotQ6l}Q[E x]1ܪ vXZX;=pyC*Ūڗ/i-/*_mc̴:ժM*Lu ^2DA+(\6֯כusoZ,X_q*zlhj~]0G]  ǯ7o(g=2†9]ijٺ zZluVWR{z:l}Y^*f@ãwţ+HMB˧)[tpD/*^v~6Wri֒kVlR5DA*Z$U嫖2j,j)&e{E2AM,T6nsWN[(vWY4nRnlMuK_9V B(Ģ#ʚ*䪩3V&$ۙfvGTvmOnԊ,4lĖ"ܯJܳ:\z&\m-I1*^-^3,jO:L+Z)zO(خr,E\{"}n8BaQkj)6Z[+b݂bK5Y~GV=U*i9V},Cv9XZɹvw-*nRղzS':zE*Dv-(_,8H[WSQtVz>G򺞢bOKz j]eM\5\ʝcv&r.B&^gd}sUMV/"vTj$~^ 2Zg(g7[I*-[Y^Cex͂\XU{!^Zr]h_.ka]VI=ݩCSuYJb-Մӻ~Tx1],tD7ѳf{WL/8Na,=+7 jʊ\.Hm[fXC Dj~C/~H^8nCA pA+Q1F =ͳۯrQM^uJkeKQ%iZqI\3 Y͖e6ۆCmJwV/^|RC+zoYfaW^Qu;.QR]Z-c"xu I/(uL$F9: קWM)bܨhRkJߑMC UC-%l4lJG:ה\1 [(5kٮ7ina]MotU4 /TvO8ɕfŒjՒ[BPH%Aouͮ5{1u|[mڱz/v{6Q,5 k*;+z=zZa>ӜM3K5Wwf۬*CUɍU(k2jgd!%!3U~Akn"Z:fS,zUVP]-w^p lT톦^ 54WnY*,ܐ* }Mk 0L&- $5G1u7lHP-bVk l6=IrzV]P;&hmש,nEhIUD[52R;xz+v7_;z/  wcc`WY=K*m}V:bJӳW:$rٛ^rJkVmrD/^W{EO̎]9XtcŲJ5͂.͊Wkc<,Tjin- d)5jU/[x[\g|Ux~MݦŊ'QFPz)u9;TVnIC.2ެ CvTrl7nwJ~fsCK֮u$ZU>1RץF5_^:ZGo5׸z8Er>3\b^+ )Y5k.%N:]..W\5j^.N~ͮ9EYbQ.;zKk>E6I,~ͭwg.W.e)M]iۚS׺fc4M[b E1*@08vhjt]ҹUфn饂γٲҍRSuՖXzQoW%7[d:rfiz E۩ -i G-CVߒKjEzbw٥߭WJ~Per޳"ahl1]T8c;hrr+B2-󚝂b"$AыN$sE IAvI7$W7 AP/%bʙ x`d\rYV̭\iVs~A$kjᭊݚĢUnO&64YCup+RԔ˸;#}USqg(vfM1ƪWb/j%Vw OV,#JYrmѭ|XjEiْ~[ԵZ.} wͰ==jp ,P-u]tZK7dib=pn54S)-ϵ}j2*]z/[u+VnIemZ v+oIR܎$m%C--lW]a*)z-NQ\_+JI])E.x-G0ZWjjwϧj -,Ck+(y~.6땦xe>%.o_\l}嵯{EjXnm58_ 6 fT4`$զ]=&(s'sѩJf ۓLA.w_R%-) vzs6sصv_V;Э~,65Lg%(]}{\N NUzԳ]P֡]%jY/kRWzq-H%תmGH^ŢkjbZ/=)S2ٖϰfL_,֐fa- av%5[TrJN Xavxc-r%ݦ vRx"U{wmV6Kuk4]-SmvgUrm.SK0 `Ԓ_U:zg[+V뽩H&ZU[VŒI_qfCZsWR .ۭ~NO% 5i%v>ۓ d*%RҔzڶמ,[tuꥦؒ47S[`^qBۯ*=[wP6hƦ"juiM`&LO-u{a)4(%+R빚D-7re-z]_Z \Xi-Gvڠf\H zvk & mܞT\y:JEYr _q4ELk7XWSDIve6JT8zpzC E^Kv _0Ι X࡞fUB#Ө۱RAnɬht;oK*4QZj U?-~\j.N~Sſ )tP;ZNܖɅVs\흺lT zC9䓤fuY+6EP bߴK~j*ҳْ SkE/ NoSuOI=bm!5%fUeXZovmW T2%p^ZyVU{_o[F!(>TT7.?!y=,V[دkx--4#LZ&~SV}+eͱVI:X]WKjkZRd_fm[ QrջEmZ hpwxb1J~5].brבkvCWoN RjOWba8OoIXSVAV Rl^QܖSņEGUbE-zU5E6 V; P ({f/Tm8fY%Db&WݧwQJg^IFEzY8dwjeڒks>')U/njnC+V\PROK"8"9L\+xbfiUswnK\7LcbJI]ZoʹjUA]YMxz `q2A".I2ەYeT-~5[%ߥ,hu%~E51j ߮,^,tF^2Qլ Zܵ^u=*H#&\/zCo"(^P ů(ʝ`8!Χ̪&|cmzAMozkZM&Ohu ES nO[H`[^LYrtŵJ^^|-\5Je5(5>&V]]뷵J뵮[4i$-=K&M,-MO"UVٯ;"Wѫj9r\-ռr0--v4g:oەzE.(bµ۬ւWʧ[^Qr񖔭mUQ^ArՄvCuz,=ճF^SnTB8bݰr-j4 ۵bgŞ;fU% Rfg+ۭzC["OE_QS]-A0fڬSj}WJURl;nqMm?"@ovZ]DE ߒZJeu9jW*jutrC06(Vt+ȆSݴ*`P8] n4Jͪ߮T^ChV(FMRnM"Y%ó%Rp݊V,U|tcEEzW]*) *[{ܠWjvjˮ͖gu-zj5S OmwW0) vf_[nl*bE꺅[U;!brĊMmsճ+SHպKb`W+EjeWkh OVm*ïWYJ}5Mk\[wat; W  j^/GްKzŰ+^7$Wq' 0BLS w|:mQ&iVk3Uf6VwZmC}jHj#F#:Qf8Y9Jf̸sw4e6Uk4ԢV9¡n+H[{~q+~bꗴP[m"X0tkRcy=ֻ+[VQkXw_Yjkn^(;:U(b[m.]T%&g=Gϴr;;c>oU:rΞ!֛h+}rz]EklkfzjՅK (454vK,4O.mԚ_P,[=^bLt ,P{%OP,gz>PTwn eH#8z/^W'~lgVra/ʟ]W^ewJZ@sbLNY%y]k6[͞Vu~e}ϫ j)JWjpwv}% ֥REr,mOYȚ݆VRo`6x0HRSHj*|)]jC$#T+r[w˝W+VǑ-ˑ{ZSJ,LRw۪4vD[zGUӪ&1 W.\ݰ4ީ%vIԎ ",vScR~AvSի#fa- M2T{N[tRVOrrGskҭ3^s>Uv֑jghf׬Z-ʭuJw*Y&8WM~w4[z3j+~jdyuIoz]֑eBcC $`~A ~o/~ _~E03CQ>׭Gjhfs;_jT|jeQ4 ۑcZJWe|K$9Khơ)ڲʥf~UCkvEn_ub,{%QR W'+RK,tۄzv\ِSIoM~hvr_74$]PkT Wf,nn*gmy\=Xm#+4YTT)if5KpVSmꭚ\nc+Rt{ZWKbCNK;R7`kE<=_tS[60UJ{"XaxGƨI^CkWmk]+&˨n;Wbpr4EnQT$_k4EQ.آo(3%[қVQ8jU*D@ phEl]V^.Z0:ѾIԩjˣ<k-,Jd6*RE@tS,;DHv"P*H##Z>X>rѧF[.ujǯەmSKn(խLt^ִJQں6I2;گwgH.ZE!UuKU ݯ2Ow˖SRMӯlmPE^|Ǭ8rMo˵# .tԻvn"Jj!zf$wkٔ]J{bPyrIk6jmnE}ܷ[ihN%k&vŲUi_8ł53>Y z_w_ _0 $C15 Pē W\$iodiJyZj}bީ~7 iN_)YIvry}`["+S[nD+Jӯ:nrl۪$kFͰ)[q H1$Z^ZgjRO8F7#?ūHZܫU4삥(1SrSnmoSRQ ޴f1,k/vk7Kh7ٮVC\-&V' `bVvw~AA0GK]q\kK0PBuJZVVt}gh bUՒU(}gb)"%RIIa[{`wr=R40Ŋ"Ե) pˍjvN#%JjIkEhd^Y W }buڽX0VWd ]j;`KzRCe[["Jw^Z٬Kouj/X`MER]i-^dRROq(aKbi,]^pU, Ep{mQ حYUpwߐKnG4 {ұUnUU._J6myMGIq|zծVk;UD "q~A+~0I _o ~C ^1AQtp4vgPrϲ-[ʒASm7J\%StT\Q%IRQw:,JR.]-[fí5fE4Mny^G=Y-ܢN5k%mBjruթ)WǑQb;VuLvQIJ7A!ߣZbRhY̖(~'nrZrWɵ cG+r Sl=S4Le,ao\3z6D魞*_M޵4'ص(p (mzʅfYEak R5\EVQ+5Sse$4BѕNG\M`ݎIEljWz][مڴ5Sj Jbc[_.$(_u$j bX+UUĂԵKJkAQNkB1 B ސ߯w_~n+~%ÓD 5`R4Z[y쪪"6ݔJ}j˵bKkƾUkM*nJ 6Z-@" LRlom9͵Ķ1nӷFM1U+J,eT2jE8Vz74n^+Ѵ"}uVU[ˆV,uK]zUekTTlo+5/~\1T}Uj~I W̆i8V) VVzyrROQKtEf*H\BQVՊ!ızYq]XRTT뭦wM\6+Ԕ ~Cv{ C,ZEW/ ղѥ0i0$xr!~+!__ G+~/(~CPxҔ  WHק jT^]YnUg;(~jӳK]N򻓮Fs(nn(rYjzR]+^#6Ed[2;Un֮qU6I.r6 yXlU^4ZPŊ;x3ujtnPת$׮6jGKz({=U;}5uwovnm:vU-ۭJZ)mSRK2ݚEY!V[K8;M-I֮;Uv6! M}6OvYjWb)6NIuLA6v\(|mem܎d5ŇǯkZQoVzw!ieAZUoNQ.jvOQ,Kw߮͢jٱJvn[^,niE3QMڨfP蘞( ۫wN.vfn}Dͦ,IUU3vE2VjjI WZUZ.+Ibcjj~WDtSQRsT0+ueR.jfW{G+vT^Uܪ֭m~Zh6ܪ%Į[_ӄSwDϐNmdn\(j K5+RԻmT#tQvQ8V0 բ8c} ;%vQuiصSmkF-vhTXt)7\,U+.PzU%%$5 kuQZv(55і,QljGuI.w*.ѱ`M#ԫ R T @hzorMVC0c+_QXʋ`߯%Li{S?W>D DzsEP.+|.Yhm7T] KqfϰJ*+Ing7]kW#Jqr3fvXI+ؒd.S̒(9j,>gTzݨuݚT&z'ݢhzaԂ^REkXU<Zr*g_PQdo8UUZö\trے bn37UïLXvR/;nݖ痊bkMpLvXTeKqCjncmh%Em ZR5ITۚ Zvګ77Z`Zjm0~K.ʖ_3łaWVvv{bkd7u4/;M\UzUj jQVkU4$ɒ<)ۅeQ+ bMs+')Ũ@noA0 ]AP07 Cr$EPBsKuYBvIr5+=~*^6Kq Tj[εV0J+`6i#y*. `ezLn-Stj.S:Z-K~,G`4loV]_iz涬FaUVj:MQ{uZ{NO6vmUn[V+z% M(lzlP^ͭDCs,AZ %W7kr2K{~MiW{jRKZٮfY5YĞTV'~]jvǢT{4[:N/jGkgJeQe>ASK$դNc%yj}$7^.:Rr-[^IjM{vlVɂ]hJVWTLAKS=ׅ͗ _6Rj mvA*V;2mnIj߮[2Y]EdzA~U ~I/֌([J8v᪞iQ7\(zU ) 5a"~zO퉶uA*kb[uKg=m.ɯ͔2*3.I[)vruL^Uܭjoq^(7ZJ`SUMu$iLMt]ٳ R_yncu[զɨ%E^/W^u,wzU0tQ7L'{}߮7"-M[nQKKI''&ݤy[fAݐ*vhnk+%ɓZVN*~nuj%-,ŢohY+ kEz|4Ό07]`zo ! C/(zC_ P$[D 3}ZIݮ;,vYf6wN$[ GԭMTZW[\z0-CWK,i}->ݦnrUEY~.HreKMjCW\UAm6 YJvˎ*K+d٥6^4 zI+;-[''/i&UGUZUvs\ί:jzT-]Utòq*0JtܶkM _ep5\OjU=VVd4\6,GɬJogxO}Jn{VI:Bڛd]YkMEًi+=ح:,V =엊7zUXza )&֔V!rloO0%춅[5T2TGI]kvљ EBڸꔦO/s;S5 ,Ak7$K t+{l v sK$EiiS[fIV .t&_U<̪R~TUzjv 򻊲kT ԊwiխwjOjV=Krr0/M嚰Uۥ"b:v&sv^Mm1<z.5XPPp>t QZrW|0snO4)t]>VZf lJ"RUkWxoԶWJ,Բ" frj]S $e ukw+tfP)^.)n jQQ!86[2CuQ;~^t~A*ɝ"^ϫ V!#Ĩ߯!5ݒ7o(zbX-TCk>l! ͒u+-\Z+OR(hU2vWwٍ^Rj$k5+Mh5E(K]Ay%ѳU# 2ztN4,ضK2gUjuz)JWAnMW, r(MA(%*w rE8jQ̎p>ղ/,nÑnbT g$e׭ϳ( -Ǫy ]aJ*!Y*^y~#z2zKrQ$SMa=op{vQZӭ^ZXhJ;;:ޥZ}8՘5UtMZtX~նuaWTMSUEc85I#چ':C]m*A+Wˊ;=+:'C.ɯ7U\lExҔRl:=ɲJKt;jߢlN=O/ͮcIn襊Qۧz&p/SVe(aܮɞot+B2`W]e R'D4{ghw[MϬ|9Eg؈fcm!$%{~Y,^*7N=L!R婶œۖti7̢5Pi7Qۤ5JUgXݳ+sAsDnA&YW4M,wɽ{Jk*glW_%jTixXzs6CkU˲-2|ˑeK:mfP,+M܎6{n:Ŗ\tKW~㸞vۼ7*l~;zp` WW /{D`qOerdEdHS}iX^խ6r,դ>ɦ7m7_emEvvZk nGԄ%i(L/YEI-r\a| AdZݑRGw[}AZTLR~f,R"ϭmϯkj'unGZKV.1 S1[7ͷvd酭ikeq<]xvE,U,M.}\u=Ej9V~iuA&t*DE-hn 6|T5ami/(~Y6{zJe(\,Hvd5C+zG+BԞ˲݊RѰv$[uf{b^ +Y))]VtgZj&vˎЪ7z`HzT'e).)JjݚMղ]]nvEwkzJpz/V5]*km]ݭOT6KQ,P6X`b~J^^ZĞАf,_w"W7#yE'W Ov4vS}f١Kղjݰ׮.*r8y\{Rz٣fg6ۄa+rW5v+\QW6R=>SznlZFepYN1ܲ؛wۢVR+rO/sͷfgk`lAֻe\8b䩤RG.YoH>anA~gp|*:fpjEj|j4C{]%y 6ZhmUheE~ra$*@Kl^zEc;~ .~Gh^c~%~uI5|ͦ[TZM5c̆l.K4-!wu5O Tzc8qVxkf2NY{v+L-'XnQW좪KUSeՎ~/cr;rTnSZՑMhUzBmM,UGv VU5Wŭ# W-Z>YnKA bz:-UYq[` ZQ, /bq,W.ɭInˍoٗR7U*-mb$bEe2 ?Vnn$Iܺ״n߯tBQ4_Eb+~КAV=;bGӗ$Gl.8;]Ϭ"jG S d:~2\,chV"J.[k<Ù_r}XU.ͲNvrSfd,xUۓjjc%zUj6/j܏:MY/r+%T^ Zج*UrSj;ʒ٦^n f#{\[0:rct]R-n߭mEk^dHzs̞bՅv|Qjjl>e nQC(YfRfC,t%7kTlYzevbN2ԖmxѱzlZ*ٙڰJ%pTE[7Ivh[U^U9Kr~3f^G$I%!jRU, 4e[6Bj} `/@Lw rEo^5삠~Ů`(~a Vjw{ِ>1 \l9Y e|ޤ5TBU8_)rKДenwWh~In7RU ԋQKwiuB'h^>Y_Ʈ-eñjZk+Zt UlWj*^o]JMm^OjE ]qݒ0--u[̂1&Vk\s/[-+]ǎl7jlߵE(KZjڦSUl/Y͂f]eVR rů(~ʤunoZz5[槱󻝚6BO*M:ൔ#$}*$\Ymu=߭+ny sE%TKK-ŎszXJ[kxUzFfUƪ0{ީVzLUMAoYlvks%bG "QL54^evZ{u.dM0_t~Qmna=-Y)VZYIrQB~]9ƨ{h2Io˽/6PEUp љ9.MA,k<4Jѵ NG7'zP Ll-g;]0$15Z]oޮu!^YJ;-#iXr]J[4\._hZdw˃OVKc)\n%g56T\TYTKr7WkvwŞ-bv:uV,S͒S{W n7a;]mP*E_r+Jz-XgakRh8mOhfhLX}b64AX|\.!}` ǯ3^u{6*jI, mo85nvBœax&nɵ)]VkzCr5׸ZEzX \`^` AK~A+"X6nzN@7Hۺ`*ǹNZ*STUw ^|[sY-ժVWWdskWE,l{z2nh(cRY~i\ՒTRm.ʹztJeMWbeUMo;vS+jY/uRK֦69XfR~G,v,MDOszvVTǯ %S (ջuۭf2Y^y~i-WvM;bXvetҐˢXpUMGl:gov-`H XNɆzRV:T/lnX zK)Eg%;^9z]*a\ޭ+H AUE2T2$ew%^;M/:bv^kzj冰Bڔ{n%X Uש ]l]v $e S~=/%,í6e.kΠ U(@N5~_/x]o(zE0솢W P!j6H$" )KM / r]%+]V!]-|Zf\R,6UU͗"֪Ct{vw.vM6]ۭߣNZ(heUj}ጥ]S,mYoXbKkZFR ZubDg^*n]Ҥz͒kJ,~,K}#GvۤvG1~I.t\XjYV_VAVjq\%I)vvNtJ[ 5V:NlZe RՙV&ەU5-C7L٩)~}SU"nӫr^5k2QENI^py/ZbQEy[Z)ԶT꽩sA(ZnTP\j-JuWJr fGĥ[Y_. !wuidզn͖:~C+~*$Zqɂתui>*4=4:MW5~:wfZRk$_/z'y=.:uD3UǺ _Qkڌ˭[,j2TltMfEؚXӶ*D6RjNGdEu ]& ]( ޒ:SٻbNG4:Twjv*G9y+&+W*/IRK%aKz;BS׻VnjMheRjOE1Z`_tz-j9CnRGSTk]MŰDl`_6i!h+*\Wz/_/(\ <~qd pvIjUM\>Ӻ,/ڪR]W.zn_zNH~q=GT.0 R;hRj26hյrc~bZ-îWDo4\zAxKTUrRfkiZ EUk'w6ZW[v ,*̊UlQj%ӕ˒[7UmEtU:U35A~NذՍ`WV\(=kV ݢ7jU7UzQ<2fEre[=K7MCf7JbjvD_i7jBgڭ})g;Zb])(t\b^,֮c:t4%(}݊e6R2ѯ ӘWĮʓr$8`,leAo筓K-r h o ʷZz"HnMvOoYfKm; J~U<˝H5g Re |igj+%vI5ުYvCijhJ-V;~/j]| r {$^.4h(\36Ypl6 =a. keԹIJK) mygɴԘ.nU-ٮ1-nmUhYj Tҫ5M~i9fU4Ɩ X~Ku^i+ؕO,l]m"%1 6J^oJM뵪lbgFa- ٘]lkh;w7dR^_/Ejf[#U$ԶZ62__2 ٟqKK:TnWrv`t|Zt~>ݵ+dQ-[rqfg, [:ؒy.jWo ViKzEU+~b cx{:.*vc$mzAq dV=cN_{ٸz+J z[nSĊTRX+ɴPD( _GXf4Ͷyn`iݪ{R_N?H.sJI}F͐~ðK(TF f(g~ֽii 5+^EAmkvbߩ ;-ƺT ꝺeWZe/x6CRbhݲ^ԛG,cyrgXaWu^(ݒ˂(iw,SZVjw +ZC/X]3gFţ6|]l$heW٥tt~iz^vUrR+vvzӑI㽕I]0nubi[^5&j_*JmKj+oj)~Kk5\jKPDA۵[1^e;-Ay;oZW[~TR'mEs;cXj٥W4T _R1jHbԚd}PjSWrUz(IUIh~1SڭTɨvU.2՚UG*;d2:=SEIm*vgsޫŶjj/zURLM+kUj~Ǯ{q^XOs* 7d-OtՒ kŵ ,S)'PĎwŮUx[-NtnlME|_fOx<~Sj-r^+UuK뉄nnza+4= M#ȕnwL2r^PDr~O1-g^CU8_+)rUQn2%uKjc͖UJeä 7el*wUt]K\UieK Sn+tYz C\SfjSj9^jQn-t~Yl7m[nt+wY dnDSN7:|v!W~C KzEӺq7.OݗQ/aSb_/\umpe.%}dR7* &*^4nMwrc|YqnfUՓ:ͩd\1D]l6~Yt_wt/+H/I:b׌Wu[Xm\FTdԻdܫ+=,v-_rAj(_ljLeٖUV\KuݫYfGRkFk>`zmɩޮ9jm'NCXۚ[/v2 ouClt݆ݬjG1KbZ4lb'e[.[GWl!K[RS2\RWjcv5J)jbSFeVw6^|~;Uj ,X!h^y:D^r gVOYoh~Aj5/5(jÕܒkXmM+a*bPbSYɾ++ Qd˫lbz-S9{atL˭H&\xfIhǶO&?6mU3$GBR|VG,Ln, Tz-i3kX]v}/2nd=Cj#*'yr)&b+fYDutREZQܞܫV-j()A)̦U3\^S(fU^C]&(ؑ\˕5Kh jI3ݙd~D۔*B[اvV0ۆ) yjŖ8mGʚev+su^+TRHp"V_ ïw!W E0 ~( `uVHS'zUclJU\W+&݄RX\q R}>fUkUfIvڐD޴YP8_kNOXJ"ڝK5k)Rx+(Y^$U7%+2_nk0vӊEnR1\kzwg]>k7%+t} o߫51,פ_nfvՑ:W շ\mua6j빭گj4Ė#:n (9BRͺ!7N`6JJv](Zol5t{-e-QSzkiw wA f˕.)m%V栗ZM)aZZͺsV5-=ײ S3 K,YvU{VWK:wd,6kn2zAq{F[F[v̵hoIEѶV)K=4C[s / ͆ߚ)hBoB66ueZF)Reeyjquv:f-՚VESݎzKbŲەɢeHG+zWde7wEfNUv [ӺR+"TtJY,e7NtzWif9n.mTj#|~Va)7 n.UMlu{*;+F b\/T8f]/YrkRͮ\Ǔņcz(X,m`rKp~]S;Snwkir.5C`w zEï-Es@.5d9*YD[.ڂ<>SiJZIsBAh;<- tr<ѪMnU^_5[ p~(]=WRSjŭ 5$+Gd*/eI׍vUr f /(!lSUU)wwfQpG 7EW},Vr+n7Wnwizdzi:ٳ|4Xmf)Oo*VԞZ+vAjHF~UfUz=#hFSz;^<_P>w[gS/z~r^RI#IJ MrvE}ĎK_dTg>BOzˬ]\p=W+\]5ޚYijՏ7D[JժegWm:ne/k5ZviʤKV2^*D ϩ5KXZ6BE~\j;g TDT5u.iSkjZr*]]+5 [;474ѧF&ԛSܢ-lUGX{SuZV|^E6}KkR;VRF\Iujv<-+])f`I X _kE>\/UnAz:Jjk-G52Mm SꥒnIgWT:ZYT.MRXbG"-O[S3vgI*¢~Ci -ř6BS8jUOUV'-l-h8oJz[(%,i8վI4:%sCj̚NR̢ryWUUQ+v,f/j=9J7ՉEV"نʎj*-I3ijC]Ϭ-%g<+;V-W>5ܞK O1 ѫJWoɝZ%79.ҽ'7̒%^DZZ(LmWjkiG[F#cwRFC{-Mbݰ{{-[ʍ;ꆡ+/]8oug{BoU~[/-8uclYJ=ElRU UйfW*%:}QӶf٬k4oNX^i$Kll6=K-W-EمcRrՖzީ=*ܮie]vrƦn轮`Oh\Kk-ӱZ["]plWlw"~;n$7kVA\|,܆^:ͦ;+ v +f?F;=LW N$د]Ep $Ֆ)Y5Zqk_*WẍaH/.|.rgb݂)Gؽr)$~͂ZjxbI%2aZ3X'ʏ\Ul"xڪdVEܒZ☎U*\RVnQ+޺5)Br*$1=[fV^PԚ](T[5 b馹^4+Ð:vU&9--fgHOwDN.YMn\0N*>(v݆.C,%44ceRk1hv]6X[9ڢڤ30|c['T7+Vޢ^ss4\,JAo;Wd\3-8$EftRIԢhnڔVq! ih)ve4IuZj6;,%x^Zɫzd=%i uurskRj[fW) K(%gRrCxTîVT]!(\-ژ&T-^1ASY̎+my4p JY.WdXsTf0bMZ];}],v/x%vOԾS5iU+:f9$6./Z.TʬVAPa ^ _"^ o`+W@CXGgkͽJZ9P+J[EsKbjQKU[BӐ) jfl+~9X4 x}E.)Ujv'MWfZt].\ز=i\ROĶrU_.+bɩf[YfU}fD<0njY/MhQ8Ď\5v5,g36]~JLoS%jzVu!VrꉒU-rZm~LaWmV tUՖ`U|fNv 6yqݚ/ Ugr!VѰXhNAZM.W+%rA(novvfSիzUtbIy5Ӯvj̶bx,Us6ج]Ekwk\UAҤ %ŪFEӽ%LQj՞ڒ^TzbNw]qLX$:vYuѲnE6WZ%mIu/7Jvʹzz'8v)5F25Cqt% Y%WV xq*#VbUռnl+'v5 &IQk~Wf!~/W+~W\6뵾vSZY-|ԕZI4 0T RWE'_~J}%j}/ZvYj~:Ek|+=bl:-`<E eެIx%Zr]v,ZoMbjiŒ s$ln(ZʹJw3+RE<_*vg)JWkA 4شnn/C_ozC ^2e:%IDd풱F%UPg,iE6q7YZaKY}-V-' ٫$IZ]v{=#((JJ[kp J\չ4}5^W۰MQ$Yn`lTLRdMuOLНPvmUu8G vA2Ԃq&:yڴ0vWrꍿ- o $6TQ#iNM(]ëxRfhIJgTduM;FAS-mzVc1t[n l5MzM(%݆y!u`,RpUSkRkwf*JroEZdH[74^,H=\^0Y~EX2zknŞ`xZ)*-C:^Yuӽ~mQTߕ5UsW.WYp\E4պD+*~sS E WUCPn+ĶeRqaO/V$=AmvRY-1նzM^CyiQܕRSkjU׬ rrثi"խu>a!:ZE]yn\W>̦)Dc3˚*w)f[w[zWj8}V[KX꭪X[5L#i݂+}nWL)~Ş_̺Ϊ[F,-J]8cY#Uׂ`Ŏ,wKV^rv$V~m֙-b68A d _~G/(arPb&f DZ>WnܩrtV٧zz:Ay%CT+$NMbťbd:e$neM/NX+TRhbch}Woכz%j%Dz"<(E]w- ~-bKn}Ur䖔OUڞ)7dƢ&mfGѵ,s덮 *EE1ݮ.w}W;2nj$U4ڮݖ$k,%߱ GCU* i6Ngj(صTzzb*IZgCfWen6m.H.Yv{qu|藫jQn:S{\}R-}7~M2zfm;rrU6p喉^s~tNYurO;U)V$GHk.\"]MQ(~mÐJM۾Q5\ljRK]Ye$uY2TC.ܲXTQ-nWs.Z3f9"YvϭF敻Zu\`BKI5kU:vӳܮΨѯv6X2A([Q'9*bnhx%Z ͞3,֍rPS̹q4_(\|Ӯ 7rz-E:'I^WI暆PzN빥S{r前&OvNNkY?C'X]RA,bUVymU( Z]~jHKޖ"7<&܆,=aR&Ֆk݂ ׫vͪnjFk"! خ7~`  b  "x `2rtInYvJ_e]&d$>[.Jj+vQMi6WIdZj3+߼EtnVdrmTWFQtnoTt$Ap-Q-LCg~ T W0Tҩ%l8uMRe[nG.)ziˮIv-eelIZ2ܵW/7 fll=ɒ<]vR*fKLTzf9~|۔mX}[5Se_o=x#rEqf,~u v޲mE/ؑ[U]B;ny݊`(e[\YхBV,*V_cvn8T;Xfnir^Ԋ\+j(*nӣj.],ڲ+9%REX#U!˽V r,hV]њ_omA-!{Ϯ݆^, wy-ݚZ*"Q:zaW#t+{rtJcWf(ݖTŚ&%Ͱ,YŖnI0J/(W֊fgՙ[>ՔQ.HZW W״dy(^T=uZ_Ǖr. Mڍ4N,~]ޢ!9:ѮIvؑvw Wg4[LJ1t9.)-:X* 5$]/B/;nSn=*:l*]GܮJ*iHXJM,|mQIZn5t5re#}/rSyJkYrL[ZSlNHnɐnUr\s4nwT%jK-A,Ϭv.LF8+jczZmUz;deŭfߒ}RZ,ĎgkF*"z7cG>%妫 icUZZu5Svuk $>9MqjK)߭5^xiZA܊j_7+`Z%nTz"x.%7$vӳkj3~CT=$[gk~C*{޸Z7fŬf3Mo'H^=qr~kbꄯhNM,t XUbq(fͫ %*9Zz-TJNlNdn_oW_o#wWC~w`8Y{ ^^ηQܸrd;lejx 1v՗v/Qnj_YdxZXjjQoiEc-j-j XJ+Vd$4.w6Ͱ5Q-6eVOެŮhzI1}^RvPD8Ղe_3b-MO՚jLzQUqiɺ[[n^P*:su{͢VVM(bO~][(8nӑ 5\p$ؐzW&-]Q[o rTet^Tݕ[2 &}mV+T-k-UUT+vQJuRo0HҋN[pD]4gB]Zb|ڝӱ;gM]ԾoU5MT~h6k=0t~x)֭]+&q+F'5VX_mxKZtvnu<t #ny\K4kr*=imm-a5.6{hrWg[dSTiY6_D(:DFz]ްn5|Mڦ\EhW5a(zk<~'KsnRc;Ǩc7;b[oơ#iRYzV݂\Qt)6euĆ"w[zi2%RvUܝXbg)bTy 2NrEXO/WدQit+{V̱`}gȭjQoۯjNmv̒XlWHu׻bȢv@ͭ z+zaA ǯHxxlʬKmuHZc,SCuTZTKf5k٦SM4!M\:Y6gٸŚ m^PVo6lٓ+ga(w͊aIiw$V~_.|0vlf51yrY* MnuLŒvzwҩW*awnn뎲r۰Mt C4bQJ ^J=g-ZE+hBWTrCk۳Rj, ّl Mw攊 z 46 el-i4͒VL8Yлu;SkRu8EKZzMn"aW5\czf̶vVZ:dv7*^S1f5K^SQvEKUǐʝeE,!rvܒlk:C+f_t_Ŗ(Mn)uT] 햌)dYFϧ2z=OM[͆/Ŷ⵩d=۵;emln+-,r[ZU !ZԮ 1!\ҖjMmDs*5䂮Tr XnA,zʲ=o{JɮJ5Mҋ^YklӫFTyNW\,(]Qt' Smwv(g5n*rG^1@%f%/U[kZjb"NWkXi4HC1T;^4Ztr-[N]'rm1#' v_ # W+(o^ !<ǠKry~pŢە"QUbaςh&-WA7fj֛rW4}r~Y,-îi'U5V.*j4bS+\::nñ̚YliZG{vC*z&{ްmW% )QoXz4Tl Q5f_vx!`WZO#Hq2Lcs ֫UZek*fIpՂrIM )D(% f+YT_ ZUOmz]R5bak݆'NG)+`J^pi3{bs=BS e?^n6A+Z-=ŷ~eۍr[Tڥߊ,U^J66$kܯzmHƠVUA-؎4Z- ϔ+W)~EuTզlh7fՕݺUi4ʅʷYhQdRdp[otNϱjfY5K=bda~=G:\]^*nCp rH ISkhؓkbP [~٨pZIr,{ViBQE&B3^742VA+ZF[Y-XF^숭wdsˢoզ(E%qd5ͪB:Q{Ψ&eD`gݭ5Qٞ퉂ѓ~*يSg5s,,+ ni5OD^.B-DΓ+ё]k{' n.. A^+~ P7P q yЛfwЎ+Ypi(JpIƬjRY*Ra 'jWTM֚OK_rYZgvGԞE"_S6lZY4)ԔUGIr%-jS)Ɋ%Fٮ AV4W5o|ͺطREU\Q jE3rU^=P[n(e_,tRGouA1\%hrqrϫَ5mKrҲbϓtfC4 rs+b;>Xwcv^k &KrIWŖ!erKUʮYX^*_oYRR;34znvVw:ZIzA,AijZOӻ]h7mT5\.[iInS,I{eUo{b٫)nO*EϪvt-hї>_5_6sΖ[dEּ~IJԙMCv^oZ 7ZZzgeSR'jDZeMVoaWU-z6 urvd|YS%_[W&[,=Vmja5U^[Jdhb- ũrW(2ѓT՚,U'VǏ!Mꕪfr Ċ45K˽mtDS-,ޫߢzfjnDg0̶(ueEh\< _/;\چPQ^Y!a^5e:zCSrq jIl#qT Vm9mT\ u[}fT/RT-VU Kgv n4`f~W_W] 7,{ ѪYޤE2QvW:)VmEnU/}:!)bHJWmJS^-%狶LmU~<~f͕i nLf"wT\l$5kՊ)hIhPG)#-[+dz kE-KjgWS*Iq\A8Wn F5;Vݞ_0=4E3Ԟ$rOo̅fPup9fK(zWԖ_o*ܭ7uU3nWM n{$.{Ŷm9bWٯn, Wkت4 Z3}tvOoʨ9Zi6a/V S'VRR岥ujìVK֭j]ٶvZ0T2SY%/4:uV+NA2үj%pF]nj]ZhrDj)b9n5uMi;[UWҭTԿ^K܊sа=[lזrvr[Tӊj*{bȒJvXUQ5zR4ð~ I-=ÖYʊ"rKk\CAfŔ\`9N6N\-IsSmݏPlzAlYԞ%RE)4Ħ%5V鿍nim%K b/R 2 l*o^+urOul~l[+VK3JJf>P܎[ gf(^܆Y+:Z2/fv/o_ ` G AP~R3p7KuճblӀ@[euai6Iw_s&ׯv]J:*u+vԾ-7 NA*,-O܂{6>sJj]3,Je xvt+ nAk*;su$9vzO(+oՖ"ʡ5]pzh* &8jE8jDI5Kj"[[1\zմItjޭ5W5s:XzwJWʊʶ[\V4tTVeuj]jh]xM 5ɬʚLKfEi ͮ{z[13:ͽRmjCp|ZשU6f_zQn]OKJn GɝbʭJn祙%i[PF]9M]Xņې-cIvǪΫZ-KW4~ҵ-:]y2b>N zC-սC]vOtsfi54jM.5jO%KUJVMiuoB4Ja\&GVUZ,r)HepRVQh $ECv4`YJI,͖zz^`JU+v$JvGY|oH۬ VۑifZ{)*Etv%]J:(mݞ]V^nCE_q=n\Պa7vinVbMr,q+mKMUlmņ7F"%`'~/% W"(z_f:?r (!%N,Dakm*=XnzM0i=jm]UT VKz-^DH5YΥv4lY%*. 0TP׮tbEm՘UMV{ٮR[o :>q6qwWK{:Zm{e ]mk6]lra.ڧFiz׶- X$OXnͬaB5[xM+i EՕԂR=W"ln+Xan`6%7n$7u\IdUlM4UYʞ(Ֆjٖ*/ V ^W)Z UeT!]%u11݂޳;feIoJ X/e~C*^Zݮ% Zذضksn*J.אKR橭fkώT)Mb͎7zzKXyULv *iks$6T\6ɬeKծ<$]ݯ(V[{ "dZ_ w^$-^%`$w6z$eZl)V^i&;W%}vQ gպ#W> "w=vR݊`səC+i^4W::aZ 7k8+Z ĦWLJQN$^,7r/V$hjyr\0vb5I2$vٯ_0dA+x(mC;\лnWyݮR SX+R]?TQ+Ez *za*# J]cevROwb%\%?^l4KՎuշ6yS^ZMN1^mUP[^lRHט{{WzsaVOsZ2jח;Nb5VuCj~T fjE,]0̒":ꡛv*暠5A]֫V%U7"Uєj6h媥o)%^UtHq~ClV{R }}f4uK%(Nǰ{(RíoeCnˍR|Xu<$9]E)5&+[ېG,Նw֥Y6ޤԼYr:U-SԘoYl+ ؖ$GTQK4td%nJ8%ť ^SgmJ" bUn/-(^IU-y2{s4bԺֵiW~i*vlIͶ^s Qbs;Ѫ*|5ާzQ@ɫ az/aW~Ca_Kv h]3J~M[Vѩ^DB-Zn\z;TT1=X+y^&\M~ٖjsim(\.FkJ͂yjCw4QK~\l[ՊcxYf*PVl:*:E6 ^*=fʂYnZ :>Yiբޯ5nG4<.^EmŊZ|+FQ~^TQ5ñf[H>q^'YN-7~_%U3rQoEW+ƞNh5rcTSo>A%ήveW U-be-݊ZbUn-,A+wW)Zݾn4 5YR$<܊d0zi۬LnLECJN{vOlU֌jд9_]_LVTrzR/Eն Ϲ^k-VQv&m䮵&)gS/ݫ&ؚ_kUz eqzjc,#7lM5[;nkl;LZMGuO,]rUri:6[5W;R֕vɦj=դT>uQE+6%&Ij[nFW4]}T+5Kw5dw<#4U(7Dk#v>Sނt6n;=5M4dLdbUŚqV[75fjͭrS(*-MeCnzaVfM3 lجv ] C7a~C^1_t%MDMu:HsXY:7MjE ٣ %/h,xFKiҼW+pUjkv{5*(_﫽R#X~!Iz.]utjvC,.z#L]Pܬ+eZE]l Ưyb;ez7[bo<^X\4;lrEu i-8[5;Vr5 ղ/wĢV)T~bSr굶I^kA[R~%7Yn[P=ֶ2-׌Tf`,AtLsj[c;]Vfw«z3>tuWmJ!7AS KzldPZZҰrj^UT7h5rONK"׊n6{~źxRrNW\+(XZvܾajUW6Yʫx]XZZL_NWkrxKaVdvںI:;v;%3NϠ%i ijYX[wMQ( *RoFvhZU+[RVCV,Zu͢WP|բݩoq#~ݺt4GHo7jf0nϪY%| ʭvEwvNniSzؒ&^#ZL[r؅No(kuj3ݞ!7Js O c˅I4͒+}f]2G:%W}78-W~A H_~ "b#(:w ʬFn wի(p,RliUN[캲:bʢ:^eZV~-.MK8MtSY^=-իeiMLSuKft bKkJER+_PVŴZmOm]6Z=h^:'i/w_(Xݎ,Kۉ]lZ=`yfss$4j7]I~mrlMr{2%q%׬7;W,r[n!-!V U5>GQʊPkwvNUݮ)7KruX뗫R.=Ym83mk7vbz=l~Qkvy+YȄ$7ĂTpE,^OdHݒVpzK\~kDj ~ ږַ*%(5մl&T |GV-w_JnKEr݆^k}>]zQ銪5Ԯ.S|Zņ]f MUK]芝wԙ&qZ_itrڐ^T3~i9zXoӺMlZ]55>xbw*(ZQUV8q(Zu6/۶p%Ut,Sn5JYje2~/~Z*h-l6uEouoy$ɷ>?˖Wur6VT,Ğ'ڕrSwDAf(HfS\v6c.^d-wZ^h(m$j^+X~A]L7~nG6E{^r-C3fUgw s&MH^nw r*J/O"KvKUdei&܊Z&ؙ:*H-ܱnu-QT8c6.*̵6rŚOVʑʵbբS  Ao $KvA0EWaIz ^:fzzj{JoוT^ͯYB)y[z*HN"Uk-).-+'h'ciB˯ z,שN<[/TP]0tK(w[^_j{vG 1[x;~=ZJ}Rq4~Ρ'' @%z~Tdc5+f2TGl|fzYfCuZЫ^Z0]$x=Y-Vdb{З=b7岧WEy,V^A*SKQկ8ZŶۊlS;ГO1T^H5RqK~˨6_eG&9Jڭiڰ J'ѮIi*'z@.ْ]IrOMWrrmʕ*=E < tZ~G+} X-wU}j([6ʦ*j-֖_tgwz%ܯYnM{rSLW+%HvnmV6Ni,},zŻ$gWQUrXQ-lŪUj͆NPZr;FSjn"ƧT-5j__, .ij_PP j[mNc['VZsv5Xi EZMwX. ~ך?E"iDծѥ r:kYnKSR\fKTmNGTdɶYՆh-%&Do5TlZ3nIxlxЭko^]:UUfd*ZWovv=*;] \,S~TX[{e(4^}~˯+IIh6-Sw%=Kygqmv/^WKbI.c7$M똢jVU[Z]Z,\u5@ ܊kzRX`܌[V[x~C/vͪ`V;N芲M ^=E{J+64MvRWxrWݺh;eem$oqZfVk JIl2ub-Uq?4ݎmV._56tmЯ\Ql gM{tڽzM'5Mm06 2[^[FVCu/U떧8֭;M/hr >ŒsSVcfkihJ^ЋzvYEkKţW(EwEm(~$T-ZHavd.<Ǯ:ך-ze{ReR)zZsR]粻$- H~xRĆ\Zj-vzfw;J2 ZX6!`b @L, zÑ+zŐ+_P`CQ\᫘j`BqdS.)XbxerQLx-Ot:EF2Ż(ݎ+o\rO貚AT~z^ʊ]nX]YUELd*\xהVne6. hW Kjr"]\Ty5垣>Tkv] 㐋~!537(>sZa,Nժib)6{Q/]QpX)[mxj^onS#{moSCbIf}Iiy5l{⮜͑X w4W(S58:צdEjh&=V]B<3 z]q`je)~AҌҼ.*JXjMڕ8;Y niŞw$SQ;^ź\lokn$ٵr0b] ^+Xܳ#ڂiwQY::KnfAuj,(]@FlTzT*@-  ! b)>z*R$HW!W_ 7~"ͲU&At%iW m;^Cgvtt]*nPkW5]]#nit4u.)E`;U9֕bW i;Tbx%J=#74AһX~ $ZvLJ,U(JQqSNXMx:["[ʠfv[jk;rI Mrڶۅ!T%&[G&I-IVRw-SJ. ߲44T: vr-nHmSm6SPVl4Uz*V+m74IJ]EAt٥Z -bWkm,Rz[mjԆhhR-zGjq+j ,_Jg轚 K;X>erE Jj]c8^tvصZ\6f6%KU]s OwSڞ׶-iN9?D.C-Y^Tǵ{bjE- -X'^jUuRފ ~IzqbZz8Ӳ,X!{3 k}\X%S%I8r٪-YXEQ)rV=F.9V_n u'l jrI,1(fM-խd1SF[ =  nWy%;Ziv|AM_ r,v$U\w:XT׳ }[ݖ# Xl(P"C%)^CxZͪNsE{-` P2tZ +rp^1 w bY@ nv{4586Kyítq^\6 _lQ_4Ͷ+Mlڂkw;d[ޫ6P ǬyUET{%$ (-$imiU `Z;-ojzX0͎l:G/Wv:eK+V^UD_W+g|%qrk|vl䂦ڍ"I8R)o>p,_z5M,[KǰzoguZg.*5j7Ği}׫r#;}Ke]H4 }Ħ+JjWTTjz(}Ӵ`[J]/;r>u\ ^bϮV=U.];#HvTS:Z \[-6{Ԕѯ6MO Jᓺ^r+cAyU+ Z5_o;[FTkrMI*:WT^o;WkZ,fe&=S۵dYZaյ!,Jvf6e"wjZ+ŦE`MmLDeNZfufDZfSu K6([B#jbh^mڒWPn+˅méGs{m)TK=.Q26ՊZ:"f^iLɪ[v);=f݆sZ՛z|S6n·ҫ_j֖˅qWb7$o725EbXU~6 {KUjjƩ\vivl~UJoYN)ȂޮvY5⸒X f&BW1̢0] 77!)Wz[rA lnAo c_;nǯ E0`Hs*6`h| ]J+gBst5- 5J*6يvafX)l^'vFWJ[~L25hZIMn lF(I,V]G4$v[;WT\-rdz%.uNM7 ؑ[k/8~Je9\f+~m ZV_i3UYpY.|n˥wX& i/4O[ZIRsunnŨREP%[*h%W0v StXPfY-~f+ =cjtՂ(tV3Szoe[^Cڳ;rkX/~if4r#E.^i*VaUt[{BeinGnljP%~^[jTqlvvz}l%J4A.{\j ݂+[n¸WFrj+j+:v_]ޓt[^ScuMk4T7u1r8 hvU-C2g z}1{-Ao+uI*fksԖPkxhz׻vͳ&O6KFY^bh]Wckw+YvUP\CDϫmA/mų̖^-Ihbglhl)~Irpkm]sJ[^0ezM5ڷjs[r{]n8⥚5ԜT+TS*Wm*:- s<ѮLs p*!T'[5A lTb;Pa/jljp>[+z_P^_o~ð+~W7<׵0wUZֳu%$^Q'}e,b6[Vo8F[Xzj9RMY&R rE gє='| ^ЭN1Kݬ^jG( z8Z`,\w*jvTݽ/Tt-er^֎8^~\9ro[ZJ2OhbITCWEl݊(䆨H3k=bMU,Sv$U&(tja;,ztԦ_R\m ߮ڷvj].TFe2TrQ-7-Z1 s״\_к]-2t_ XJZOF6ҳb0evZT՛~GN~+45ߎ+RInVvjjsYzIҬkz˽jIPfv|R KGltl[0x6Cbٕbѻe[ujǬO9bT]"uZ͆YT8Lq"*ӸYA|Zg5Z:O ˸e֠͞T5ebWKfՔKܷjI4evJvˏ,*ύdS W5ˍٮZ1Զɱ̲z^M5CT[nUЛM;>auTW/R/ \1" jwj%-7{EWjt鹞g g^ܾ{%ܮ:stʼ#V2ɒԆ>KͺTu{vّ,B F >7 E~AW,]K~$7" wd{&%Kpڥf4ӭ5ƠIaSD.!Y/W]V4V|#j2kjrjvmk\+F0hRP$' Xbd6K~37ۭY%,(8zDzʮ2Ɔ"Z+6j6vϮHu\8&X^Ԋ]SN.wʤЯ]Pa;ٗ^.ے+:K%wڴ*5fǑJh=N܂X dZ5E3=46UTKs&wgY5 k斪mtKEGZUNi7=~ݓnIKY^MتoV;dbC* V[,mQb]Y^^(~Kj0DQ[],j5jSi6hёZZMV;F9j-jEok9rcU/>|r~OK"UbݦY%t##(r^z`;p䎢C!(kXsMn69F37Nj=Q;ZW"H"$+99^'%_0PtMw4p)B,{-Swٯ}f[}Tٵfe5-*zTL,ݯmjC뉽#Wr=IwI~WbG-Xﮦ*7zҭ7ZqbU*v[0+n8[IŞ!=__7z^[e\Ҝ:õS,&-ULtM M)zkEl;kZP.aO%f0vTT+f/: n2ޫ]5i%oU#e_`U;`yWIxt[ JŴf+E~)l}-WJZ,Y-~7 n_nHvA "Ap Iv#@Z*zq}.镎>dR۞9nrŚp^jjoVk٫wZ1K26zX+Qf͞:*Qj-CjOyk\p 0ƾ*I\s.EقqI5M2%kQ*5^iZTʢݮݪm _;kF->[ȥ~GrW1ˢ! MTgzժ՚刦YzX*m~qVSklbf2b֫i,j9_;%Tuf33ZUMb*ֳKwܒ^.6$ W,j^Iz2T5{ 4ꅝRRrԪGv&.Z:rn.ntvWbN\rL/Fʉ|&#zÐ+rǰ #obW ! zGpϼL_rI>P=nlE٩)nW4z>jF ճBEtnņ++vZlQDqi,ogղRE/%Z ](~k(\<":nǧnIHQ{ v_iZJ^Rx;$r "̊ꘝ8U;vmۣ wCR`h۲ A%Yu\߭8VzǨunOnPuY> hJzN_izeqŊ a鍯^Q[S\eX*zAnx=/ْ{&TXUVYQz19,5kZ2e6,[*~*Z-a-JK^ɚg:V.~V ]}A()~v[1N;/jeZiJ3K[VC>ŗ_ҋ=Ck CUk˵\MLOp-C{z$]O2͈eS42G$r]T׹Uˍfuk >{j C/[UɯrctyMj2lԋ}Jtk{Ye"FlW~W6&cYUDBOzVG}Y+W$ޒN] 4;բ`f̲~YTIov`ՙfSlnj7;ֲ^cW%RmhvQieE-(ڕIJ_mmEZfŞ rfܪ֑& - U4Kͮ,)UAw$tS.r$WZdʽ%iuP[hsnFyWjncJ_VEP>ӥ-XT3Uegpb:R^Cl}NͷtY ,E.6,`v=W+5ڶ'%G8R9ZW.W=6ML]c55ӲNu*Ӭ\=o3nI ۽Zo۷Jޡ|}EʮVq ]D癮H*=[*H\h,V5j:x^N.9Qc}^{+5k8pvk2rCt\'Wኍ"Ud z&6rjb],p5 ܒuIK.U3-Q-䷌_Ud%N#;#㯈hspS&r)U 8V|^.R5E:BURYzٶ ^6/xVvjmVyk]߰8VQhBݷ $ɩjS^c܆XxA`jnAn 8ܯzů~Ko7c(/Z2's\w5]s\cECrڲIjբ xJۦF#̟h .m:kUn*g|ۮ" rc]vJWMʕ-84ji5_5:$[EQ$-zn%K^JOZWKMS [_pj~G7+zö9zWk_k&cmؑ: Y*P[^ߪe( J˼z`q:^D!ջi^? vb6\SѺrw`s}QܖΩ{q´VQ.=vզ -17N6JEifa۪eqKz_H$IҪ͞.ig4VEi{-gz~ok}E ~*XCWDAԫ5Qo< ֫-hUj)N-kjd[n"u͖a-2u^WML* bn[>Vj] ܊[8} rl7-9;bT\ a~\=۲$WHU2=T0[K0j,]Wnɱt2ajVzb54Q U{=+rZuj*:l٢ڱZ]V-]7s_RUSfmG-Wy /}gmxbePjEUVZ^M[Ll[Z5W4զ9]7:qpr-~xz\ڜ+[+\nUvɓ$jr7_7+]ElVkR*%[/,q6+r߱SNcz[ӤzJ*E0RѵWVGrv &zM;Jnx5O[^Al4\MW/f7JvV,Z:U4KC7c6RO(r,,d7MEe͊' J᭕[eA~쾝Q]Ziy";U^#\`Yln*^$\E[4ܖ,GkU+-G,Xܽ[-_u&4vzK6mʤs6d2ܪ{ ]/ZF+Un0 X f5FѪ%޹KZm8r! K.s z^o~ _+z W^C(~iC`(qznP=Go%I-i'N$ۦ)R!G\^5 KjǢRUh-j)nAU-KohI ՞#;_Ъrǯ+L%痪vI6k":]׵e&l.M++ ]-}L> |bȫ6\0a I/a! #dX4 Joi:IZ~_qcLNXdE4-?U\\b]TlqIeJxjQ4XZn5W3TUٙ9:,zݲZknK.LXq2EkmLnQktMMFiLx F Oi-)J](D, 6ڬ$ɲ56vSz/%OOٔ>kDNxJ5Em4vҰ*9;Qktv4놪7~CB[ќ;u~Yz3PUWvB*nh[4V`+fEzWjxMKZcu$hW)U _7X0:dE-+ꍹh7zVCdRWo,_nES.D1JJWjLֺe')p̺0L^uJ%9=$Un~|ev3Qs~lJ+ an$ BKn[J/ޜZKnhK%mvk]a*hľ},=i[\_'%dN͒+7&YzirזVA sZVrj,=>=vm54;c,+ %jnVv{Vbr5ugeîZlUQh,Q9 MD1qj%jNRf+*ݮoA/kU^Ln;fa[ʵiVIV^m7 ʫ8v[bWKjd> hщvE7# ` c~Ű;bƒ κje:bIVvg.]^(?*Vz~O3;Z]6k}׳*,մzC$~rADA,EI9mY\k^%éX.-Mq=&J^~mkԀ έ6+K-*ŞبM,&VD_Zɭ;e+ʥޫzQ{ +NgS;!=7A4ņJ2NK\į:/ݲlⶉ-f ׭+QQ7_mY vV;/jbikH^&ZFkEvg$8^ f'JkUeS+f* Z#;F>iN6VA-% f߬M2 gҞk+4*VO<.7v_:Yʊ,JI]A-L` ׽_6|ө%TV7jѻF*-׭z7jV7>0>YhjsD(T_-~uNE**$: 5.ΰ.[ Rv~)VW헻rGpj6,G zMr騖`2$/gѳ M+%qn(( I-%*"+fqe+ǑTh6f$0h+4{-i݊,ժ͢KuܲOFM*bK+O&l -5\}E3͂k֪JVaz:{{rD'$(J._6].]%VI[8YgB_NQvH=MՒnOTJ5MkۧzFP ~w+ %qWCPC2=DQ 7jFW]=NhuC/W8r+u0ndjMp+h3&lj:!Ln wEd nBNfP:jG Ǫ*]h))-9MޔY%mw[RIC vQi}AkbE`*Zrmi5YH6ۧר~V&+8sGq~nڕ)>iESٻ]#X5Dy{ZѰzIy^W4ݮ-^ԋeWn*Bn\ uYzZGk "-Kr-i~So\h #Z)-2Y/kW%!;B(RE;_n6i)~r}j lTUĢ5g, I͖koTͲTֽ7;[RE,{U;c\Дх&kMϭ%oW/)5vWĨ-tj+R6~nXJ/8E2/h=skʦvwRQ.َsXSi++d[FCrZ7~ou*KfhR1Wݾ$jQ%Eײ}԰h)fWz+*˝U*m]kxT. WG{E\/IuN\p&W A+!n~oC]2Ie09|7n[_gۭbEZ{nN]&iXmU5 7zo+b[bcR-6PvQmijC,yEWgK]w֭Ւt{nv˭۬Vd9h# 4`_ A_W ;n~I0tp|樿5)vOTUQ9Ǧwkv{PU_8"W+Heݎ_&dߪ~ѳYz_Vѫ%/%/KOͪY~AӪ*z0zUbCfH [;R5z^k]:zѓ+f踭U݊e^U)jYMSf!8^R*酝ſ ר:vñvC;ndJzC7CG*h~h6-eQ=ϹEv[wm)[nv؜&KXq$Uvq 6v\ĭ+vaR?TX*rM/^KީpV]X o7ԭYzRYJpՒbj\izn)vd_/:*_SˑM#-֮¢ZrCҦ܆Ui=Mrlb7VC[&/z0=.8TpYyzM1n)^U+uM. 5U鶴\sE0< :f(RK-esՊ&R/Щy^_)]-wvlܶ tm6Tkeg|V:+|V8Q3yzj4bCn6-MeEM5n("}C&xnvW04"_>i r%4bll5*RѦ\,eA.D+zcX}Es aJv a)F ~dI*-rdJwjE3.]nڽfWQR^ElI>K/zE2̖Ym&{ըTׯʽzI-\6]oa !(]~%ïWhƓ XVWi5̂wfS1_Q,oY"mX{2=F)8|[f5jz 4lXj}͕ܒtC齆]l6RjrSkZ:>SN["~vhNvU$R>KfjǨyZEuQ/ nSԊSmz"=ܨ $Zңyn"X1fjGmIX֜ܬ -^tuh #{굻ZKQՒ]krW!MP (vE-E8jn*uEm)3 %55[F+-zӐ-K}Sp5lQlZzM6Ȳ&Xo$UJZvks%nTo5z}5rXM zY5faS9ԎEWO;1%U.[ZxFe*va.pnjU.~[U+MU$(f] 5O=v*ZrRlNfW;ZOKMEWn4~9Qw덯)EEn5t 4ްY-IpG7(Vt%K MbK+*~Xe[^gI$JQ4YpmR;jwZ%q;ܮH}ɪUkziz/6=iZ]Ժ3ծH;fOc)R+7zP|a.G!:Q((uų&S4W삳;>H{5_= ΙKju(~Mj3S-jE.մ˝ZU5ڊVϫi-׷>WU\㵌L0˚d,3`XFUUzj Më^-Wִa鍹bJo~EmԚj+AKvO-y6K)\$EjmtIYVfbXdceq{^.8lG4zX~V ;VY2i^ح(Fj-.86O9['8իZ[Z*K5#$]{~k-ͪ-Ox+ݶ E3I,zfйqfq"Œ\lZ:-*~gNv풫^d\gz\7u~YՌjoj hװkPz.tގ˯]w2mN:nw2sZb~2JnPzz~G^ Y3E7NI9I*:RPrj3xLЀnrAv(]n(_P_0߱Lp#o2JZ>ZV멗:k*_"̢ \ r[5UM1T[Vܱ{Jz S6O[7cvZZ_ԋpuR*$fvILmhZ>v K xK[ё!7[_R&/ld.cfC4V~eZO:jYjz5apK:rwvgwւkj]l-rŞoU᪌NpFW~@ҫMW9ͮz]Dp=M;,B]}h3rw J]Qk+bU1+jۯy Ejۆ$FE[/,Pղ/ӯjŷ[RbIoI+a͒Xou%i,s#݊Sqfһ~$hv$k^)W}tz#~6m:En4n6kv5], 2Y56Q%;P" ե˪-]4eӫ ,]Jv.rQ I,XC,kUrl^KQ͖\o &]ܢj^]ϗKEV! 3 V:ru;Rd]v,#V/c(v$ٴoV دwxJkqWl?ڎ[>D4K>.WlHܝSrۗ%횯6~dVjUܬx~,jS[~e:E͑v]/u a1<5v3zu;f]skr 0*ܶbmuA+K~KɮEpIJuv+rZfU3Z!HfcmUGz+ȶ(VM\^~j[ us%g8bPrOkVS~r4l񗬭1MP֞l4ZfT*^]~E4-YV5'W`R!4[Eiz%mvG1euK ъӜmNC|>ԴM. *;r pZ-e,\]UYՎcZjHخrKzb*9Y1.QIՋr'M05ӯ}}|f- ov+YSnêY/Дn[Zt{nYUnP3MkY5ێĭ).Д-ձ\c"jYmUr[4m^vw;⼕ie/﵆mVU2z.&ם BZZtMbv),U{meNi \]/8n֔- &Q[KMmI:mvIQnS $k\-ِDO-]P;:ݶRS ~^6KMOwvhrnGjV=ӬLYk.)&A=\7U^ Xd nE+~E_+[o~EU YbKɦ֪{eURY%M1tv un. `W(s WƢr)"ܮIM7Jk,W֚GU]]Ğu^m-Up QoD\W*OQZtKhnG+MКmb$ےۊ,W WG2kTTZ6Sr2re:M:M\sJSQYQ;Rlͭc=UfK7UrkmV,͸kv*j,Ul~ ɐ=Eme푖5AlurSr,mUXMA+VaCgKe4W `񆞤}$8j'D}2%Uu%ŭ֋=,貦7VjfKQf9rGgԔ^Y:Rk[]QU{Jcx$fAHbjC0TijCHklحVUָT[5z۱Ei֯ }S.<=! ~)veXFI+ᬌnb_ZKOjSH&v%]i$m *~G=+h;nxV [Z%UyTZs[R6xF"2ۯ ]t۾jyٝv[VUnwZ󛢬%O+dk^:uQ bw$jWһd44<$,ir`xvP/=֌|:/߰ #o~!-Wo8x< &^YܧjrR^״F=1-k쪞jv]GEn6Al4lǭRYvTm5Y -RMji\vŪz]îw+Ume[&J5U=r޳̧̪V;^Kg㶫\f0Szf(C$] RuoivֺtXr[WbCQ5n'fYf,iR%HvV+5Y6̚\pu ,Z˴%mRYvbg~/CveJ5+b[hRWtEi9vLJ%4ZD\|bt2%eV*)}Ulv/ [+2(7]kMޛ+Ziɬhn(6S\\ѻ"N7.HRO]׽Yfakfi~CZ[ghLjװ%QvUAлcHVӪ9 ɧEaw-P]W-$vڎe׺eG 4 .xf\5^&5ٻܖzKV,m{\4^[zUI5UA0j;y^j^S,uЭbArʅMnSfNMX{ b6M ޮ~Viw[l}Qջ^ږRغḪVݲYjذnJMa4^eKJek4̞!l~ETk ERS^KRYz%S:W-8MuJ@ ή~_ AoX_~zgNb8$vs>ڙiVۅ_Qng Y:9*nw<)8bM+|BQnוd[pQifŬuWX}ym,z˔]r)]2^3;vٴ>.}i)~SrGܒZXO^ebUZ4KgT4 !UAqnnMmTJ%tVU^CReHEWΐmXbIwVU2U,$74Ğ4,FOh \zޯD9z]׺^ɪUC2+܎TP3;,wnU8bjun)jlW]gg(rSb~dj.+HM֔y]ߏު6YWukΒWMH+YJլwL`%ɫ~T.{ZO-G}J_)7Tӯ5]1(Xr˭]TAsKrEPZSk\$m SbS:`ֆM#ᙔZ1,添}~M[eYɨ<؂e23mO^] ęi^WUI9J--3nS/8¯Wzm2*ՎiU"\( r\Q%)vE4\W6˽J<6] [qP Gt#Jp;Iz`vβkĹ/ (+pv_ؓz)HW[*Ų{zZZUYzQxSLR-^Y8Ҡ4z[1K3L0UEړ[}Fpz1>S O4 ZA95V%]W,QJb]p4|Zi-ܞSQd 5NϓJ-5Ck&ev"~%XV-tdݱ$+zyy5ԓ+r }%^ΨKc|^x֠Ur].Z;b˯46YM6,jVNQS^pa~MoڂYPnc[nA%cvzZ]+^ᲚrC.`^~+~C vpu!,X7W,}U6-BϐMհȽflۏc$QVvͫujdwn;zUFr[n5GvRX_-=U ˲KxzIpjFGmE-t択 甌F) j6_ecuffLn˕8f-I+תfC:]Zm vQu[ W.J8ZmM9K[~A\bVbh-Mm TcuiBiŎa< hn˭׻]2ZMXj5eU#7-o ~ڭxR=-)6K d[MKtLېfU),؊cYv^pŢ$6]|T6ӫVZ+PZӴWԒܫ]bl>S=-JG;gTVH"u"[{iVWԒb=. ;GUN$KK0.uVAnVUd:v״+]'.E.:K{{kI"˫ëGSНS|oٓNjSoU]a9vbk|zSJIN6R'nd]4U6U6kZG.HF)-Vukf_}kt髓]n)~Cc %ۏ,5[.vLiY5/+Nfz2_;U$PzvdrQq*e5Jc.7trG+jlh>CvlK Tջ>֮{Z'YzbG_7APWr%pܰЅrpYUꖥ_|^`v$/[2x^v[V(-X%QĚ\fJHbVX'yvOivVPZ**]P*ӪHZex^YؽRTn8U*5ܳ)mZjnzױ{ck߭Ȇ_ڲY* .Jlm*v\؊P.݂)M7wje(Hm,fCnh^svѯ%٫f,5CtMT*f$oY%%o i \HD_+&ɭ=]wߵ+_r*{^Mҙ^_72OaUBAo nQiٍqkmJ,kZAZJEp$%i5m}/f;S*K*au%>tg{cvpV O-tfdGRTŶEAh!K+gX\4 gVfWw,A47JaZMTz$ͦX-]j*7rw[fUnVӎY0xjlt;rM l:r+f;sˑ5̚٫S8%ke"V$Zkű&terclȔgzfVi=U^b zSMIRKgN[hKjoZG.Eݚ ngJVUnR{^r fQ5;KwYԲY|Ukf#&ڍSw_Vfrٜz ǴMn~_.Y۶l okv5O+\6%`R1bQ_U+IQ=˕;^iZO;XtvJ\/L-e[]6ÑZu6Y> UY-E7DhJ(,b[v]d_y{e1ZzhwjщXfETo~G:oKz[;+^nfǠt9~]Z׸RS mJju\Gtm$5ɋ}tfcrQDW䆫HNW$G̖[/S|~4% ̪IF3D7$~deRY7dG^]bO߷o0۬umVӨ7D {DT+}^-k/vCr댽0xk=oDWìS+ۙ4iMQ(-('VZSN~ZGm u+Jde*ѫ^Jǫ9n"ۥ^s^U)6-mfj-4Zqzܒ OxN[3+VSEJb6V*k^R dX_/!Gޯ7Co`b2J;u+zzoUz-XBSm㕺BY:5;5eiΪ>ӯKڭEUZno*5O2AfEy\N.KܪٴjUP^S(ŴdRիŎtAN#4v*̽VW|M=藽32EJN;_kw~꼦b*ZOcuSZJeDSJTMjnG  )ZӬ rURh jZͲznA7Z,±6]MN$JSIk2I_1> "x˪VllnXi:}uj%Aۯ9RV\vfeb%{vy}-ڢ^{j߯͒jzōպ$kRas݆u] [En+mNiEC1gbBtkbs4nKrI.!XRVվ*jf8g8& uo]!Ngܑ;բ*uZʒ$eNvZLږ RíTApj_ѱ{V7Y1V-8zf1nGqJg _)ztV($ ezl5K/,# MrKN gXzݘ )TéUzܐ+XoW1*%=x۪K֞V5G麝ϴUKm#,Z]ۭ9jWՋJZGn-QKvK5-k({WuIRGpkZ| r ^b7 -n(_ K\@p{ղp6s񪔊˅Sn]22Hӓ\v%O^ðFT8ΎQm[Ur~YqYoQo{_hfu˳mU-܊ho-*J(Y_ҺeZVr?FٮW9rvtfXՒ;SiT7TEE"q垦VfkP*f! _SaZzp[N~V P=],La庨I[PLU>Ǖb]Cq>m}[wsRTzHq:W鮠J:\zRCj~_UڪwZf﷤ו#MRd7nC mAgW܊oIîJV{^U~iWi=dt֩N]-Z$iJ߯uOqg';$u 7 jvZJI*4WTG~:TezamKO̵] LSkEЫU^zZj7,}]V8zë7b:R@. VZlId9J3 ft2z{kUYKur͸ tn2X澵+jxٮ۝bZ%e߯~~ӢIkura[%2Z:,z Ty͒X$Ы$AiC4j&Xg)~[֬ Dבy^ :cIhJMҚ ,]p)U0M+7Աk EU܆˥U C7ڭnlUbȼ~" An !H Ap䊢C 1-aJک -uYӌBLE旰.~G{n67~]m&E1&ZSrp+JjؼfX2u+Yw%YZhwj.݂_oVڂEG.JTܒ_[+kYkM2űJw -߲:]_ՔBj ͚$auR.;V(V_IXLԊ6S>L PXܲk<>QͻLb;6,65vɰdUk^7$Jܰ&~zNmes/Ț\UؒX4S/l֮ A/o( +`WfN $[TtVEKj\MURX%WS>i"JC(z0 .Xۨ \IzzEHu˕uG<duN,T妡-Hݬ()jbn/)fUmP`W{Z͢R-7 s\jKKuykwbmis[kkzE)%^7JVdeݚ]n^.Hɥ|Apv,I*W%XRYb6*~kRjjrK" ڲ+DWmHrml/Wl׆[YZI(թiUl;ZCow,J+Lsվۓ5TrT6f(*c0cܷ uj]{ d)vsEmfgݬǍ\ka]k euUվ.m[|zY^ivVj)ŊeVAzGoV MB[) Ja, K9jfG<`8sj>szsV7V".t=^uwʶR׊ͮd )Kǒ:]jŲQZ3r[%)yE-Vٮ>O.ʵzLf#%鶭[l٨լŚRU}JnZ6b{ȥ.6iUzW+_ֵVە-U}+(" @kF zn!~ƵblEYSyR1zz_R#jrMᖥ*W0;_X[$bT*JV,+uo6j5gFˮT2ⓛ|P>J 7zW^;~CPe`2 ^jF\'צө4vnQV]S)VnUUo3^פ7jmŊzv/Y]r wKekvv۫Ծd StW2ƒEbwݮKfIN*[[ZA ͪ캶U˫{}\RW4ZnR߰~G썗$L&Ի 3'Dh:X[ ,mo7IZ ykGm \kH[K5&rkcjYW7kjMuzW n+bS,5#]jG4v&zݞo`:jbCdTY<6k,;c6֐#w-]5I:轚UtkW,F 2Vo +\f^}Y܊'K+zmwqmof Hc 54Y8Uc9R,Zc,guEj"W &^xjE*ŭ$iTrjr)kjQTVc}ÝUR/TKS=E{\̒oVѪq۪+VJiϐ%؂wJ*ӫn-n']⪎X1%y^)R,;T.ݒ-eYbʃ_^3{[ s\W7ŢZ3Ŧo75)-X*Sȍ.׏hH&VĖ3պ/M\ vlah]EќQ2c鸚5~FVMR$ZUm:D5TRm{hL6~٩)VI.F8H4 ~WI[vCK~C ^ (S1%A[ѪXҪ(ن٪ WzG^okJɪ{x_Yj֭V]MeYY*Z/lD=Vŕ즦H^T5KfOmݯ[KU0WZeQ(݆ Zw:jTڐr&6O|yE ّ$VWĢWC*ǼV]ܭ(m-;-n\E+%r rNcZ-eQ:cfzUpo9 œzC1ľ.cZ \$7E#sZ$iY-݆gֻE&VlG-yAE=r_VLb7f4/[*tf[V]3Vq:kejZ#MG/Lեu*n[h[,REMnLbUCl!Z=5-L,j*#IJT"9v6C*(5OnWų^U 6f }޲KFZh^A/$QUmE>X \)pW\bl=_ӺBjUyE'N[on1!hݦ%vE%jiXVM,݂KK+b,6.1~4̺gz a%א bs (-ǵp#L~'kInxn2VB)*jM]t+z]f|fypzCz&PJv/^0䊡 ;^0ECtu;@вVC㴬]ӫn]/GT۞^ 5Uix%:]mҩzE/1ffZk?_+z 1")_Yub~b5ߔ깢<ޑM _*uP;W[5g[Uin:3ԫfQk]zͯ^ jUuۂʦV a;rfԋ~D']ZS7d#q[nUn-׫vMUǗI=K- n[[j/$G5z\SnogVsdUvзbrTڽϱZ],*Kt 2Weñgoh-6h%+nE'ma$j%s4iRo>kMw\qveA7 GuT=ύ4*bj)^ۇ)w$To:S ~ynzsZ+U(ehzYe֔fYn~lIv0Emk+3Sjvu-[s ?[kݥK(Th-XhlUGn9VՒ@GL#zY-vY&Kz7Le\J~EF05ATYzS{(ߑ9^Yl;>GohEY/+UO1q,WMj(y5]}k%&sv_U`c#eנb~ï{\uUInAVvlyTXlS=,v[e]qv ձB1kr  L _ ,_~CK~"(ò=G{fHN6~!{% P(e_ĭK.NcolvnVY/D-HmM.ɦbj,ŬT.E5_FWջ=u̵zzmTTf7Z,S̬64g/ .ubg6f5#r$I(7;ٽ؊EjST $Hݶn߭j&[+Mɧ o,j^jǰK?fj$08K ;[".v.LbKr̺T/E.j㐇_+%G땛ؐZt+am4nIVL䴪P~ӒMݑ^ fWT[+%;^YYJVkuem XzY.viB*w Ӭ͞^q`ѫ#]ASk,Y2Jz]˖ܺʧKqIoǕnϭfW"gVQk:GI.w{SWժ c~E.,~m[ٟk<]ڦg$e0zc7~ne6n+n_S+^Ai^&ѾRUnuSzϊNrKVԓGc5ؚ7u*(YWCjck+tBRꉎ8s_؎'NI(9ܗ;]CV^W|-\Лb6+J[-kjAI^-V7vcl~(~VARTӑD߬i#:b5ڤWi/k " gJƎX[>cJ߲/EѕɐWLtX\.5h4]ϮS^U\{ WW5:nQt:o/Z{W0J~ u/ъͬVflhBW$԰T*MWd$)Yn*.C(FiMё^R+-ث1䮫+mWSq/ KZ+I=jy>+ycbbg4MWzVt K{b{Zͨ;J;,S7_X-ݬuZ&ה\ _z*^5BU)GYQ\3c֪f5SvjդrEYaWpPFW%Z~0mسoW ,ͯ֊5[#u*bA+ M %.%Y]nbnv*|g2v*~OfC2[/nYAK}ZkbIjv K(t̢Y2T靎\KnCjKZ\~`^5^giԂeJOa9% 0X.`n~O_ooaҍ``]zlTUn[ԥ3ں v\mkpnRv)ҳ=M6mYT뽥6E4TnI:KX{W9 KlJ^Lrh A~{EZ6mgZ;+Yr&5sMvZSit{(M%ëvэgpZ]#fKޡ504{zִ}^[1;ZUi=Ӭ2bIfuv+m}g뭪ѽ_N%Oݑ9x5'ifi( VYMNZ 1K54-s߯xX ze/K5힦pۆU~O5ŎGz_gQ47 ڒy%,Z Ji{KF/lo)αXn+uQ.~Hr5gwSê--Nw,[m^t\fk6mՒ]5Ī֬~CpۊȭFC׋ZUyB_X[֚A*EQ5]ÏT>*>aKƢ͢S;E,q, 5tXEUVT{W.+KJ+[^d{]_. n`azS(u~.:̯ۂY+U~AgiT;:ݚU,dZ^M-|LkJ6 ]?5~_SVi [:f)va^KikĒU2Si]E,KSKڒ:j%N[ԦY)fza-\bEŒzBsm%m`5`a^P!`0行RYiMLOVSdaURAdU:Z5U^ުܬt6UTQzͪ5*A5Ǯz|C-Wȇ nkRZMuz_GQ-wf*WTJç-m+iGt9.]׬ZJSklN_);ENM1vwzo6W-WR1{~A!LzKtjծ\7\(7+Z^ISJj/WEy6k-hFiwzQVR4TEnQ3̮:KZԖ§sKq:^[ViԪvUlJpEٳW۔#VZoVŞPIت9R.QBC c3R17>ךzӭY꽫HlZ6}]jwܯYJE[lxETi`jWTbk(fWm;E_.|r+bM5{fK/x5 |=eCͬ3:n]핔lkk\0lIњu٨UctёkZ)z SRg3m{ZU`VR$n̒+/^!qxz<7t{%W6vA/bK~l)#Vbw=&zLe5^kl-k72XVX c.V;f#+]b&j, ֡ɍ),ּHfCժoȭr)n^,nɜv:[pnW2vؑ W"ƌdz@Q`\Q_%0P ь!PTƁhErnqXuRClznqbVrGQf_W/֪zm#*]:]u|Am=OP-Qm8IJѩeѮjnjY(yFˬVrŮ$WEIJ&]%Ot CSs:Zڳ6LаU\5Vb[T-̅r#|ݯzm,u ]-6I۵]k~v+fK/3^xnA g:JUZv-Ioezũ GHvov[P޴]nʞSVkjd{M75Lh~cqErMt4v.SVJen)3KU=)$7vJ,{rMi˧bS&I]*NgWlWٺv{5Kz :Q%']Ck1(숾%_=5~9ů8zh솥En' nIk~pM-ZV[jIv[zVGz..͹Ǩ riZO4.9mW2=OskdФ*͔i̞a͢ڬ5[)5~jJAQDG%Sj}ص5C\ZSVbn&RiZSjZؖ5_Wk0p&O:A=v$2 ݘhzRX)v(;GYtZQݞw,O[fSmBf/Ƚ]s,JE TZh&[J3e#]N:VKp$b5Ji2ۥ.i>Y)&6;!wt4k͒,U4 )[ЛĞYY冣L4T]Z*"|Uj$*VZ~etVuinG]fϝl\S\۪hnKYrW˸X.)fPkݚݨ6݂V+,)ܑ{fC5 MpJzQh JUtPמՔ ny˘K)j3+Rٮ4HYK++S$^}bAl=*,.P^mX^krEjW .؝ZXvM-u*ڷfCuM}:Ej#MUlu׭Hbf|r׮il4lwKͯtRZ-zNEHrtpZ6ȓjUp񅕸R܎!]#Śm'3Œ;ׄfKLMռQaj藫^g /[Vˢ.6ԾH}Z=cD t h7;zA/~;^ ߯%Yz2ă ϵ{xMfEUKdE0V{^/V|Eی,Y/m+(imU-f4.Gol+ ͯ+(BϪwE--\Y힪Uqv\);v,hU0/؅W Ju=v܊+zW vQfh%UvǓ2z蘺٘Ԫא b_0ŚXBͨ9SĦ$ RK% wjjS.Ţ6 tCt3]vU6 ɩz*L\xj~w,gJņrQT{ V4ldb[nS[=ׯ6n[-컢YT){`6_czbZx| .{DeZ I,Q]f綌+Ղl{*S3zgDdse/wjRf^ܩvW=u'yVAr[7A '%A5Vl S5]RS>:fϱvv]R~]3ˍrSX6m E+MG'3)~4&)\k]5dtP+X[V(UЫ5Tu϶ĒUteyYcVr%(ŖW6jHr-8n7՜nI-}dY*v[bm$i8ݒk*ԫvK{h)EU.7^HjՓm`%=W-xn[^GZT .^P _ `~E[zApH*i^ECq&Wiw"RUIU4WZzeobڲ^mZݮFj6EiPFEu$kתLn+zZ)8dgq SVT1Ljkx^sZۖ[{e5zG ~C,HZ)R[Zv-.~\Lr>h$# {b7e~\ј&׭VlծWuJeWv ;f){]ͺݴ a;rSu;e>c7&0 ~Dc4A ~QjQPZI 6<ĒXpzK|Co*j*f Vm-u֭MxZv] UMgVR:U NӮ<MҨX(VnGs.Nxl .-H ݓ{zc8R)Ͷ.:G%E+쎡ڦ(]Iu4X ӱE_)ojz%WoWE/4Ŷ4ٷ\v:ju~i݆ g=LɱXC"kcTJ}i=kVZWƽ ó6r[~U.nږK[jo6ːKvK_V{55Pբv66ܦ⤩ŊN.B- ׯUvAhnŖXi؆XrQ ]IEs媮Uj٭Ub$˦^UF+ru!%o+LU;]s/uz.u+]638fAo~A ao(zC0 zo8%h}z.l,L`ln5FKZZڦt|k5'V-eh;6Qlk)8o r'Պw69/VjR^kn\$SUeK/k_,Wdl"|݂%5ulvEGZ CQb[~ W ++5b%Ԛ]ZS;ޗfgj_7nh酾ϫv;rhgƩ0UO)W X+KEY;6vگ6,ׯ7~fZMzE}u5wDWdzI{lNM/AdXDdծ=zW WX<*uD-+%t Mkp-X͒OQ MWݖTZ~\u_^#6Mxԫ7Ś0XzYhU~V(z׭BԖZ0GS%rVQJ,DXj yk|M鈭VfP¤U6RIn,rzv)='Zb9%#6ڍ&mp=F\m(l{mDc*ʤ(G 4mrv=\z߯bB$UI*ӣxTzj*WOY^c&I1BVTYoݮ 隥Wϯ}]]R8%kSiHqlݭ-ۭj~Y-*tN[jhBUo]- (4:kuYw;gtK ~E:iYmU&Ͱ>Ij8>KQFkq=leUӒ>njvQrJ+~q|ĎRo}n늠(^Cbz}aXf/t5۵-!Ւ2}BU[SM(bI{5٧~E2.8{O͂ ~tG3 Qf_V)inv̲{~lJZjf7TX.f+Zc7R%/ MEOAevZJ"$Tݰ" ~E+_0`(bi=2hѲx@4ZO(:V_uȴj,zvuÙ.X'Q/YW\u_Uڄ^%DlK]bKyb'cR]_-P]b.J%C޾^ a9YY2]NvIWmhiY_ jc0N˶;ejԛt떳Lbh~W,dź[tnd4ח֢kwJ GTޯZW.UdUԒ'M)f;TeWhvE{.HRfObk}$9߉ږ0U_Bir&;f˘ˊݓ6rUXZQo6\5KˎLO媦sԮPuz[Q+.t I%iyTG __eV)Vi]rWivZ2MSK:նdj 9v..gՈ~ݓg|`k?MTz_֜ewwe]xJhzncOqn1v;~KKZe/۽+ԊbVoԸi1aVW/<#7:!= Jrn ;_k&OM+uzϕblVEVU(|\UjՐj^XVQ:ETZ+gm{v/5iW]QNQ%EK톭*J%Cu_Y˕B_˵~Cu-J٥6by+a4; Kea7~7!\q2C)ݮ_/[mgM6-a(-YKWk+zWpıԊe;v]N؛nŭ=rǮ ɒ|Q;VRolf0Rnx-_iy=ɱ+za;zT\wJ\QmЛ~ӻܣ:>nS4 ON'(ؕ$a뗫zzYg^GZCzn,mzCVڱ\ b_[ WE*MXbWVl kɔR7+]gZWr*fbJuUٲkU| ek(&(~W՚ܔv1!wjVh['x}¬4r9ۆ¬SroW\V[j0dUE^$O.>-+e7.*jr1ygV^ Cdlm-ʺ]KJGQZI;iP^S2YnnAq^3%p:$v[UMP[zRCh{ s[f3x|$g;-Ҫ"PKxmp5[l6K[&bXuAmv{˨ Np[f{jgەWд~Rc(eN38n_/7a^ ߲' @ (4Zy{M>ŵibݙ$if]R;zגz^Tnt;v]i[vW:Ox-^S*}tS g6jɲRնyR3ƖXv.ݣwc+H4 r͘JW(Vz­8r{XfkVeL>mmEl=5K,r*7J[( 8a?ӯrI=uU:n簪]p9TԚ:I7VݱWwViR[^Ao[q{ck#7v橪U vmU;GηW ڒ˕XRgb,S7Z[rCrݪ7 l|}ۻ܊QxMrJnW4AʍFyYӬK5MAk;vP+S^A/u4aQhZӷ*XNq>p:olv-65qO-BՔZnԹSVO֔+\rGW_▬2!wٮkV/Ȏ*S:o՜k^kv^m<{VZٮ O&˺45lkCG,C-fB.Վ.z4M]ݶ[^mwIwvV Iuu4ŭqY,i7 c$vp ݬLn׭ͳI/MU-WnpYN.[2krIf.4,߮5;j.hfl[KWr͖ܲ$Hhhflj^V.:RPH8nŮ_ $ o##w,iޗ 9˷|fPQ(FZĽ(^r\)JzmRK4]T&{ 8Va*f5| UZ[;I[CV$V٧|ZoDQ/\-m٥ZI,mw9=WfϨkQr f̷JzNZ/)NMt gݪO:mY\Qg T =MU;zmzU] TԖ`5uNeC,\:ɱUX*zkXpMÓKvĵONrԞ$5r}U;[5>UVOjbWKn-U!{ElnffwLxU^^G> S%ɾR[2)XZs5z^$Y{~U}%HM_mW%Y j(7U,5ui_I3l橭36vܴ !^NӯW6Un7E8ftvEqiJ-]GAަz+]$kծSK[IU k> ;\RZծj* W{ݮ vIbW.'%WjUvdw]2nɖrl]cMM{e Y-me}{vL_>4Ve9bSRbK^SڥutV{r){깍]s4W)çzMgI%wZ/;͚V-UQ]Ok],unhXA aѺr7~KoAo 56W5Tjzһ=ҏS(=1ّ#{1j`ٮ]V*zW5{hjY-׻vi{5׮T;k=dHn^yGi ʵѪ6D ZU괛Z9;ZI*Oevͮu6BrLVNVlUd`uP.ɯEnXO b3u\wm83t;rNKR[zh:Z fW/w5Si+6~ebڪ ݦGnzXWYP,SeUr[nJAlPfV}Q4Vr]b j-7[6U<jkbX:NAy~+kZklDn#h9so/Cn)9:ilNS0[%XB' cߑ v)[Kr̦ƖگJh jKniz]Plgrk,OTjn(C3+_b{ePm~RBG.H+ʵלEQ U#(eG=AsvzZxBdݐ57*S[S,HR+3v c[k^.7 z״z[l* k[ ]푵n)9 Kf嚞ה-c7dTZ"s>_. VU/7+sVigwV߯XeiZ)$zn~ːrdonؐ;flL5 W%K3D)=[$U=gq%a8% ;(.,No- H^o(~ ! EpA\+p龋*U'.A+ ..U鯳m~v=ۓ[$7)>I6qVR%5jVS+b+$ʭϮ%0m!nmV-؍~kiVܖuS:Yr:G[fs*.6үBC0+% , t&AoQjV-U鴋-0Y5E9aW]+mvKlݪYh S8~W-:^ P<|Ȝ /]fG[jirߓ+Z%+z2MW[_RVI/bFV9~͑+nK-,/R1T)UwE^+̆#5(eR[5WgQn*RݮkrVseb$ו;,<=ARĂ(- cRSQvG*NO0-g>EɄ7 .nGUԎaUU[~Zm-jk,S )U[6k_ WԪ`ֱ ZlBSW-pViW\ś͞! (teHTvR^T]v;.HJɲ4UuCJnmZ:]t^4K݂nUiɺY]jMjEcU+Ȣ٭um+2SKBSr-WݷbQ(%C,z~U-©rV\*o}V݂f`t뵢U[% ^ݧUQp+[fj7r['Yс@9nC0]\K~a! ^h8wl^eN*+=JfSⴊ^"*Ed$eFߓ[\qld$R!z_UW wLNS*sprbX#:NFM.v A3.SffjXkVuciVe-lPSoweo!]qv <vGMGdӱ\)S;)7K3v1Ef[nE_-EA[o*^x[. V aubU-'RC &ĦTpR*~PP׳bv  V]k=GzUZ vGԨ5]]լݞg<͍jܝJjVU+Nwc|fStfXݖ((JU+ v+5r&w^T^ͰfI1d;=M4)lZjnCK[9ڤ][ۆO^.54CnSQ7%C5_veirert Ģu8]ګu\~F2]D|+uMgJ%ʚ층(2Y􎠗ˍ~=S:+v}Wz`uz75zŭU¬*az1ٖN]Oҋ-GQJ4\foJR*8^Rx{l>ZWZKxzUɒLSQ'}Yjɼ=#JRՎReSI]T V٩JO٭ԯke_jIzSTԝJkQ @l/o~Kn(~ C0`%"Bnf&u5VcӱK%~KnլL*|8W)J~Ow݆yJZr)7/kh~`6BM/UEnYV%5+NP$UotԂ&I T6%Sn5Zͦ$VZ_UqB4O(uì7kJٯ qb$Kv^hj;j5~+-tvC_;\n&vrM(%7v]n-ZS,ߚpdRdW&Aj굮2yNuNX%pe+r՘ZamYKrM;~Ӷ JQ1띖Z3KT$ǚczpNMlŎtb+Z}Y%)sgTalrUEA[RarfEݹ+M%x^'[f+zխ؅rAvJq@6^JM$(fe: kmOS^mT8̲!;V%w*[4NK <P*Ż]jz٬bv1/u˚^Mt)8f$^MTܚ%j]w]G. hOY*Z^qr׉EYԛUIV|vnI-fѳuajWrVLּs4;^P:^Պw闋6V.4]Znߧe< zWTR:ݒ{MksvY'\~/=М]Е_Ģ]/JS ]թPܬ\VKZ,A\xrAvK) -]nˋXr.\z `"z_{kUZO.m7Ԏ[K˦V.ԪUлoWjeVjR} H$( 'VԫjKZ_ ߬&#Gq}TQk.hw{Gë륞-wRG𽆿ћԦ)uK:PQDN䶻wm[v>E-W6t]H#`^b^II]VDO4O,lZp^P o ffGr[V*vs=j~uH[IY>+7bu۞~-VEŹ.tvi9UVk:(x]7|Bp~_.^ww_+~G0Ewp-}^In4M2uOJ)2s\R]^ef6|r^-K$Cm6ZT$OZvE[[3Yzꭦ=W8E/(ZUPT#uEײ\nLŊ[:]izS5!Qztk-)roSUeC+]kjҮ:g Z[r|zfP YbV;]Zخ&kUCT_Y-ErJoIuyu+2>EJizޮ'VeU덮Kz^"^%SEQnTkEaekuM|R3^ 7܂*ukB\KSݚݑ+zuש v{vURez[34쩽[y* iWbwI>۱슡!s%\ң R[ŲQ+XFJմmWp;f"vz"Mn#Vd*U!ڝ. 7]l~:êMf%v%,]ya2?nfz[^]tT-wŖ[n:kuzCped V|+WkKV5[c-ש®eRE'Y6ֱZXlwvKm ZWL-,}!wcYbAmv;5ĶV~U)wvmS^o8Fah@/5iNYͪWԊݎXbtX\ hq6}rh~AwV/JYlZzD^dӛ5Ǭ3eu+ա6̢JطLQze:݆7 _Gޯ~7!!(*`Ό\R-[v:XW׹ݞ$ͮ rWm`5Qmtdj_DK|O)T(vb3 /jAW,t5*J|\U{ KӊS,z׫]5&Sr!Wnː,I;nIV]ИuP+WnimEnŊwk]Gnu܂W{Z&j=S(xfrs}+mVjL]i,;3n|E/Fc;D\2t敛a2nz VvnW;&^kESkކ`\:JNt[FYr]kLr0V UU*[j.T[YXݒ!+-EzkP Z1V_3{WSv]%+ח g%;b,f\4Q:Gc:"jzOW_7 X;JY&Zsv86H( Jjl=IlhW5CdnrY~(u/6 h`ꅣTe" a6egVŞ]JZE4KYlGFkW|p]jl`<\kv6Q꼎_Ejsl5b,kbl^XDM*d٭7͢!.k_5{ROқ_wcZ!M`J, nfݦd]Usᶽ: ߯H_Ms% PXx]jJ4><]icebMiU(h6V I;.-zL#d~ _0Wo C| +PDI+]Z%.c]`\.SlCD#JRɬmVugԺP -*ݮJpf7^n}nfMwzְ5'EG0zCl VqԊ[*\nՓi*(u>]q Rm(Gg) ZǗjq~,juٮ1$;͚];J(:Aك_r]sͦ<}^Վ] U #[}Ȇ+Kۂٖ \yvZ鈪VZwj,Q+պ%7 )Z :v&%蕞Y%ؾ E1+OZ:W!o8qZ+Fy EܚqMtBO/VegWhDIlfSk x:p69^gbCk knPf)clrp4 ie*'aٔu`R@{_B,vI aԶ;%Qժ/(V4{r--V]JݑtvU؋\鬮lDVs,֍Yv[7ˎe_Yr5͢pk ~I{%Z1jW,%)\rexrA_tP SlQ-ZVd5j%S [sNژB*SYMkKV ei[2{Bi,W^<36I/V1=a)X}U ȋ`ؼrvG0Ԏ~+zo (&l 0nN[ FQョkbyE^C5Gs'QjJVǷle{ݲRV{>=[(_ov`z&Uk=Z[\\=k{V{nT'JsŷRMU;cS+ 6]ALշiڴZsIwKu~\Kq:hr/r5ZZY f~ԖUې9Yݵ,TS͞.L92ImPĦTJGU5ni#j=])JS,Q*mVM r[o{~q뚴[^vrIjŮhrYr^)㛂Y6~U(ݧhZ{1,Y\ujvUn)2)MEVf~^ ˣ4\Խ+gV[ߩf['6ij]fAV3UMb<֮LK"tnUjVUVP2C'{~cS-Z3^RVIr4hsr!Z(V+Fu;W-/֭ T7r7r^$ߚV 0 udU] egM-fK s#vzU\5m~WKs*nA3bR;-Gk ]ib9N,hW4\g,cU*uJjÐvI/=TT=. BUltW5Xp\֙$Uob,8%2\/ !]+%~pESN);aTU^2F lم[5y^ݫך^">+S Y=ح1^/]TbVdf*'h1j#z'tV,hE_D:S'Zvzd TjvV2v,m17kzE1|jInVd~qjZ.Ū޲.iQr%lמZZVkCsls_u|ϕ~+&dxW)V1vGEnTXlLzG,V hfe6]1 Rv}ZiX>]V:n鹝LnJYDIT.7*\Lj ]\( n]u\̶zy't[$VU]-vƺRw Cr.%C;I-rYuU7N=گTbL~'}v# -5wxP*jjMp cfOz+5zOQbÚ(=eIjyb5ڊ,ה z+ZEծXT]sZɚN.{HB{eY+u5.ոZ[mXB(Ud^WkR$G0-.Jb.wW_gڵ!ꥆji=+r+ml<ŵ N'{^Ruht5wݎxEO5 }zZ6m~RMfO.uZ͞Tw Ml8LI(9Mҭv,\>`HZY*ˣp>R\RC.v _P_0 W b!jr JwhEvͮZG{ֻ+̨vՉhvɘ."{NN*b^rgS?vR.3U>Sn ,޶ܯahS<-#Yz[͆Z=˝ӭMmiwܴCKf2^Skb kmde5ڵ~Qj8RlUIW$\EiZ.YRV%S/5ʵ~K(WuMS˚MV^FO$[[Ԧ1.WnͦXxnW)izs=K2nX2M_6xfOn0٫$Ijrry[**{v4BWUTn-wbfIpz)YcV hEU~EuzCQ,ZvH]uԣwB]l--b"Q^ݭve:uљ% A۪<ݻ4EuKF^긝ݯR-nXeu43]Ș͂nd%Ӛ֮MJT;]˥Qwz~K)J2nJY cw'V<ܨ hDk}{kY͂_+8>w,IzU0 z`E]5rxn],ZW5K ϧw3̖Y☕SZm(Q=ϕ~^oJWٯ%1Vf#׻bv3zJS.'w~fnznAmNUj- zvI5Ps 50=U^$ @8~ "zC_n8zA+ޯ5v<)Y"^VwF/h8ګ5:Z]q$Mrro0.xMzٮʰ$g ŪݴU-ZZEfުxfYw JUr&6.ͯim\bKS[~E#U-Il4LU/ZE2[^˦fU=VM$ڐ]f赚Z#h;Ֆխ+jS:MݞHoG v}XT pf0QbU R1xO26=\6f':iW5 ]l83Œq*Z͎]g :WKhIrXvU/f3"lK=h4n6lŮrQ2K^GR^ITb njI.,f]IXsܢ.]CVw[~h~oWDi%Un$!jq )6>ܯ v]%ME g0nTu(gIs$_-j~e ]%&uRz_-êȑwW7+% O,y v\mEjOZ YoRV\$IqMY$۬6*Y$VNb=nڣD]7:TzJ$t>cju%fel $t['6gɴXY7Eajve/y~XzQĒ6#eT:%6XR݂_> X+!͎,\l0R_F7P[oSjVS[jgv$9#Rѓr]r֊mpqv߬%,vC4s"SZ=pKcfn_C$^W A0ސ'ݸ 8J-'k0j喰rFNWa딶Dn ~Kd`:-ownI[ ~'UЕ[ \KݱxJn~C.׫նz2-[dMyא,YRK{M9]*UK/JCqT_5Ԓfp '[QrGܶNQf#u oVťEUʮ[jO,JgvfW{Վ&m0ЋjgԂ\^-*tUkŎ$ZS!܆k7K eenUpvO_~Tx`~m宲F˱rK-C;~0lɱ ^WL&3? F#o2)L;sWjJSߓ~2X zFՖDVXzzY.Le˩_+ˤrz⒗\+ٔߤ -Wmʥ EqVv$rcj͡m #:UEV3{2Q9ՆS Z\&5Xy<n*u Ks~i]}{!}Lò:+xZjf>k=ųD8Zծ׻r߳%Gt;ze;W.ٞ(D呤zkb˰lqQ{*A-IYxL冨vq5b umz&Tmڕ~S x0blf/v7 Krð+zGp&ȁ ȿ> %AtYT+ RmFlX N[J g괭Rk2Qy" V]l VQ)M)ݮIvod֚5LjRsWsl: Y-;udVwe+;Yvn\m\n͎~W+^kPs Ozg:gӿinP%vjAIX!i~CɖDWe[%h'- fO: .uPڔvA,7>cՎZԾ]Պ˕Ia7r"ʍ^R͒/<-lVK7oJuU^RpڂkS*GՅ\l5[2|s{W׹XAQvUYO.Tf6NMqW] hYPkUkk,FU;WUZ ^m~]g4ն,ZP0rE7 vɬ|T(uF :mQp5TT[FB&5*S[Y5Hz5z[UOSԎ]&+iUѕɞ\lf<4m4:MD֌j6fد(Fڏ`4j~6 RgE_(~YZY % ^K) #hU=T:bf';ggQΪ.OֻMS{zgNu~%ITI]Ao%p[;-$NK\mȝ~0Q=˲6Fns:w9]ҌFprj߯ _7"\"C)PN'=Ff e7$K1ieF|MmuA,T͞*nnVI1zkjgmk]R-#ӭziy)&)Z'JV;c4'[N[-)߭T[-LlǑ]EǮm;]/wūVFn5WQmɔ+zEjv#A]fͲ庥U2̎a6Ox;%dJ[YPݱbSԎt^.enCK\%nrVr[̟U4 TX jKM6(nm$U`]qf]q bhM؅Eeu%7ݒЮ*i>Wѯ-X~C$ fb֢u8^ѯ V(qztjT_ur~츾c Y%5uǜfKa{=U<)(V\ bͲt[TngD,w^Rv5׵:^1@Tl_ //`vo8 I?~H=zfERVOXjjQYS+ʍY0QѤX7dm]l9=Eڝ.a3ˬO[Q-Ip,۪>A/59F_ nrMKM֯H#2l8n(E[wKV]4)$j{`KQ:"DmV]Jjw+jɑ+fKRT/6pHMWKYn]Kn75Qj>&qE=׻~OGViW\qڞuz8f[fWV0[eͬ ݑ^_nQ|}\|JynWvMe9w9rxV`~iنyt^Ir~ |Af]Ŏ$J[Ksg]G1zߑf_QX/Z=0E'RguZ/4[/ujYk\Xo7G.MOQ IkVg ^U5],A8,V[2V:r*~gԶ)4W {=ٲn~m|IJXo+BKZnhPe TUX꼚[WIknϲR3IKTzQXe!z[$%2i4]$j"l vɐe0UE0v$ 6MIЋR:3\\ i𚕪,S-\.ud~jF×,z"\Ծ:nUNUR X%C;IU9wŏ +X~ A;/8vC+#WWC@ CSK {_7b]b( vI3c .WR!>8MʐPTX{0+[(Ȇ'%߯ ۭ-WnGWvDmJSBeg)AQ#RٮJ7IT-5Lo+~Insܦݑ}rQ}+^G|S{ 0n_GҤbRZjwr]/:&ji4 5X%_D(~CP]ܲE:~T7^UrUbڝ^;r@Φ]PmjXguZO-QkOLQ;lS/jb"UUWh7=Wʽz]ntȒۭYnZU[]9eK,XE^*"YmE4Zmv 4 i[PTTXkOaqD;vc0+;M+٬T Y Uymjj;Z.5Ulb[ړ- dj`!#䂡Cd =p'=WSv;k|bk~|orK~2M58nE~&7ثX>\ 53wr6rۭu.5%UW v:\UuKvNS2HY*wQ\Lj8 ڪMYDS46M)$4 JmJRzB~V4zijV:WiLsvZUX٫}i5cBcw|3r"ȃK]Nbdݎ F0B޹m ^GlIi ł*MR բŲRzvѳW1ڱJMt$#6,[=YT%kTE6ުVIzUFK{A({4|r2ݚ]%ײTIn޾rc*FfV/V[vfMV>IbW%f6=]DoDLTVGɂJ"6o}$UZzI[&Alն95Vf7߮ya$Wm!˰%=b=n{vve sYFi΋gզj~ '2rw=nxreT؂oUZRBhj~VΒuC2ŹUtW]h+]/յrnp}(&v$ѯq}W/~7F.UU~uɺӛf0vaU2Rʴ^viTbWc~l]Њ^5̪P ZEo7D%^!Bg-'YnuߚYZ9 Aq(^M,zQ5շWN3OzһNAxZA>Ցl,uu21JIWųpbk.v1K fϬvi4G=Z˜tjfClА=SԎ+(z,uad%bݓiwf;zz߲vմ ͂V)>aA+ݸ@g29~;V[:0eO]k^ )~mFӭMv-u+jխ)z YRb.bel\vécRխVfɳc_n|mehJjSfҒ왂YL-u#٬_iUj}VGDE4~RR^v䢬+XGY?F̮k~q W^E/KjX*gnLnꪵ>YïBTb~ŵ+o655Vi̺^qlWBwVم\kj}S.]&\E%rvc4yjO{fE1ŚُHlzmies%Db6̢4׋FQS+>imZ+SSmIUָv_Z/ݿjbM{+XeSZhVenIT=،"hՆvjlFiՒUY%XSnnۭjm]E[Mm5;Ku+6Iny׋T9$j) íXi[eZZEH_/zI5i2{#Ug݆[rYtWn7l]#4ʖMr:lE~37FGfYL͖YRqOn~c:b=bԪB`Mzv͒&۔E1R ǏINzv׬YZ)L Ի-Vņٺ6z{[o7*VNB-L4Ѭ$o6 ᦺ%Z-U PZܑufiV7\9"Ze-^n}HM ZW$%'K%4,tbK]Zn`nؑ~[tbMNe-=NےD$vlAۅ)R&+{j wa,BVq^͒\lYVE)ENf0~A ~A_;zAC􆣷&*oF`{VjOqj$Iv-4N7>h,WѪl_1vPKl۲vD2S_b|J\'4̳ڪP( dwve:CRql4;bזKuu%+JvZZĎVԷܒ-QXN14I[rޯ2~f{-3V7^nm IpGBew { *75U5)S%[ەBǫTڮh^Q!M*jc64ŮXm;nZZU]IU"( 20ްKn #n +vIbƏc9UQۛ'J[݊ZJZokF+Ju-հTVnV~WnoWFR)$ K{{o)ڔjҪw~ٷ$n[-RToM䖻uKoRS*sj%D՝_*n綛VT Y+_.-:[Գ]u$cmKj#r[-^uRMrHm4+o(4]V5F-ŖN+-._]ujdW}hmesK-m车YnG55Di2m}Q.-í4gQouvdX X+kMJPrX=D׭Xn:Tպ^KG 7kz$wYp"Sv˭YzHu{vtQ%Q{-ǘ-zgw=߮܂^Fѩm ,MɪZQ\JJkTXg-߭yzbTѯL-YEP~͕zRm8wٍfۓ )1zѭ;S,x{jNõ_MU[-7Rϒ`z"V\_n*5)eOXRQ)vqZW]߮hkQof߫ l< ۩xvifYb+XV)z^P{Z7RL4HN]-7:ilzM{ՒBxuSN!u"4dm\zroDp^36f܍SRoeSnCgHZ6*Fے;b^n4a,m6[ՎhM'cŚ̆k `+fRT^kSc`vz\QmjUs]*/E6릧˕)lzO.OnM.}j7.Wkߨw QYVC QL+:j zv:nh @L) z!Iޯv1_0 wt07۫>0="ܶI.I%Qת]WkB. kWffkS+[c[)ub3%1jʝnw\-Y\'t.O\5^- -YT]^{!7Wvsn[S+YMJo,/JX!1it׻4`nUqĒr ejW(6dtfam]5+Ԇ::A8QTf^mVx /Eo8 mE.vj)oVRFlJVh]~%UElR d)vژbV*wQ-mM0nwRP~SUT5ˢ \.Xdۭ 2Ve)ٴ&YspVI:u^_eV+Q W5,l'EԑvVZ]uToiU;u]UtcY񴆦zoӺԆ ]{Lh)c<ɥn`uȅ_PYVNov`HWIF皚q4suԆ\-Ji F ITq r&ͦ W7z-~E]oz/7 G.d %4m)jR9}۩Ilr#RK/әjr, ~藫%ׯ(n _7i V`8l {]Sfix3hI)WY٪]8*xziJ[*}UmaԫnV%c,MMhvbG4^o_oc8$Jqo ^SrÍw65rTmh-CPKRݶdwcQb[][oӻh]2E-ܭWTZ/v\k-kRQ-[nGC:Zت {VK2!|ӴԜMRzIFWgZWJiӍuN͒:hva8vFˑ$.Zz_)\%Op{nv&'5j9ܐ~E+mKr9Rj#K?SE(2=ӔY)a#Ch5]I)fr6+#l3LW,zV(ʵ.VRXf]LVOC6gE #1~i%kK[-Nn-Ѱi5]qzﶺU*{_Uo MN ^j$+b8?'k4vn g[WkjmE]k~Vhn`Gnf&6 Q)uu 1k=;Szo*dnJS .5UlBͤ*4Z0!Қ]+rEr #]/HrAK~E/(_+8 * }fOgiTV2]һr۫=)*{~dh4 ni&z\*M w[7bjUky=5jd5" ,bM(mR˅7_s6V*SC{ 6#6ۍP--)b^{oItk}[.6m)͚UOm{gS8uC)ĦOoSY6 תliXVǑ5-yv3ml[EV.j-U[oJbߚ&ÑZX*jFniRկwro8%AhuP+n/xZ/Ղl:c%Ի-U+f1n4q[]) ERK-ǭZߐZ*يluf7Egn7,k*u U\f*bse5nRWul7Բ7ۯ}(Y -eJuT3l݃@zjMsms[{o,W*f-IzJuUՊOָYZuvU+=ZeZSxIQ)NV[˲E-YG&x͞XSԊUpV,v QVg$d=$\j /9fŖOobZ߭TO p4ް I-泼ny5{g j_.^!yvVq=oTrI7[W_(7bjC{v%Ncsrvs_SKՒ%w=E:nQJ5{e:VY=C3Ղ<(pfIjfU7ŮY P~MpDE0LӫkMvikO]5V3[~YJEo 8n\.5~WLQr. RSlsuܑ4Kj/R_+ԺR+v]&WaWGnQK,횠z`UuؑZzVlzby/IP,I[r]ZL,zu(k۬b\kvtG-^ړDa X§Vn_e:V0)&PlHd\:U[vT~i{MlDn_f[UT JY͊_TkRI^Uzrd~&yWή~|ַy6C于͖ ^O+e.^wMG9ղۯZnof7Mv֫Vr6UnM왪ܮ;=QjkNoY,v_-r|8%Yn+ 6W`XX1kk=힠KŹteJYgk _hʽjI\rlwvE P*Df` ~" "W~w"߯i_N1t9/8^LzUwKs֬Ă߲ I06]gk%NwPFեS/3]VevV/Hթqjfe)uc)ʤ˯7fEfmrϲ;[֠e+E[z5VPvW^۬oRY[3\Wr\Dn.z%sEW5 nA-(e$L'wnn2Mfߐ54zYY-ޖ%!띞%IjSn^cYkU[LmBOYnT=M)DtXE9z+=gm ӯ_ڽWۖ%UntVz+6 NmmnW)rS&>Xx~/׫BMhmXt͐ߥH%ezoMP3Z4RO,Rk {5+z3.ِEQA+}\HB׬ uY-ݒ:ߕU+]׻m"ǸncU\s[b۳x w|[*UTYhZRJ#4uw^C1 #U Y,:$4JVݫbP;Z(bL^9IWT:v]i-b*]G1+۶ Ee^WT='٧%&_tcv6=`|e O7 oXTv0TjMhuX~=]QܒGx_jAlԦfjI,OnZ%8.Ck]Ivi&K6Ie BGjkEE/emrcm.INi, [7 $zԕ\c5jnլN[u JڕRݓحͶu 1.dop|KݮڪbU(n[4eE-ߦ]K~. vovDhrW0^U`eg[uqKBi쎬5GuoxfP^S/jen]](Mw5g%W3 Qymw~좪XU[%{ Gs(6w\ Ur;Ţc=~}#=U.1ħ[$)<{zE&K ۤF_v Zr 3]Rnjj-UzT?RVzM6Fh+kr[gm׽0}:m ^I+m-\5+G~gv͊sU.OUGًEX:jV]%UQR:)bO.͂S橕\8jQ]Zk~Gq\՞u:UnW=54fѭ8!^EHRL ZjdN+~a_~CA oh(v Vl6[O=%1drW]{9JEo8~bK]lZSuN/>vSz>a1T.$~jxRYbp;jYs鬆p7XnIjh~OŦ Y^%]T$OvSͲTov!A. ˆ[;K:aԭuRitW=lwQ0KݶӦwzY\ w;L+t\ݭŒ/IzOqkhbؖuN+-r׻ϙJQ)0[4_ȴ2U)emROT!Vzʅ(76*[sW ~\u )f٦vR#լj^UDPTW~Kӭ5-oXul.=[CXj>& o_Sh7r1i,h*y*VZ+*t\X+a(>];nQ.dntbfw+[tY4jzouy=j63rA2fh]02M>ifUMw*bp7jcL$TX)rћ# V^ׯVET., zGxj]ye]+$XmZUTb)Ga+nŷLf,ݦ\/9ax_ SI0=+L5i͖` {Vm,RְUӋ=fmhfQZkVű!M%i,Qju~- \-6}טKXMZmYnW[zmBt~r_.z\]dokջ iv[z㖋I I:*U+^MCл`hn4uگŪTy^ujjr+b~,-~YrnW_6:M5.n]{FC굹U,]t]]LX}7̆=Z rlQZD\չ *׾TRYz5rd*OR)N.Ce["5 wdvcuzVՒj*sbzUWWY],GSՖoL1MVm$yU3MwvU~Wun{vf(RW{ٯZWoWzf1 qRTUhgV"6%[m4$G/rajX4[~խ=٭)vCSvU{׋u @̱%ٵZ<֚Bsf>&rsOntï|-;zif['Ӌ2Z]%,~[7MT/ n=~hĠF. +~A0^/Y" VlZfQuª]癵23=eJ :yc}*#Mfa{fu6d՛fh[ Bks[)_ihT{Esnk5W2*ݨm[ղSW$U["uHBKie_;p$ڻrE~I iQ$.up^腭XNnT>SѴ0:>ɱ*o;ͮP/V4Y+[(:~߮uVgk*nwz%k%VK%=OZUT$rW0;_ے$%kt^A(]kEǐZ.rVr$ͮZVvr]/X>eOe+_[9vӳ:cqE.{jKW\պ^w$m*ilVlpvѯKEP vuKTn_ 桠8tDǸ &_v8.Ƶ(]~|etS7kR7Is9=&j۵X* bK'+fߩ{NmJtYٛzl%=]eZnìX^ײlͨin6;DLUvkL-n Β5DZˆ5SL+~g^EI}\*4QYbVU~<͵ViEH]\oaVғjoKu~3V,LnaFf[/46U{\tnnwz1V%vݶ܊%ܱ~ٺoQpIj'z*NoxMvGUkY[kfP.)qugܲ+[gA6uyufV۬vϘ=H4z(F(|t*U5XȂ[;-5Ֆҷ1 Kvmv\I2o& +EYriZavPjmFUP:}evG=yvPw4[RMpn^4jSoNGl]|4V٭(%٦$Wz>]*5]+y g]WYEA o<[DU*j&_jٴߨjX-fv%vY;rHݭH8ebhz+ĢW.א,Tzū~Ti%7[[Ts[~aUʅbӡ+:[ A/~C0~c7 G Ao8+hHS^4f:2^/eF nY6:T=IQ}TRB#.MzF췭&wpW jscTJ]ku )ljX`ޒ~˯95*~amj>jFE/܎e)ת [q:Yhͦ_2f_,[j~--Ħ\R Sv*6 V>lJMzvaE^Q4ZIfN j0"{p{%Opj2+[USOw,_Y9vUﹾO4mǮY2[T˵^J;^kxPT3W؊&H.Ե 庎ᶊ}5N2e;{/VV\ 6MSy|Bnr/ղ/JZ*>vMYv]M+)vKػrW-r(ĘKjUիMg3ųϑ#7~QZw;^+)Q^]F;J%f%M+BawVv.efd56L[bmn +v;cv R7{qf(\=)nhNOJTQRQ9ֳWeUp ܱ;g66rE-~!Z[~Olo7F,5r_p}f\dvhjU$=ǔfjzZVf]/}-Q5_UejMj&4 +[b܀%Dv c77 Gޱ;~"(m n2{'JM.iLyV~rPK.*ʚZՎϩw(dwf諊[%kL&E'UW.I-Ahjrcs̊.\3R+.׸}oX^m\zi%MǫTVSuVMmZA4Y񍂣Գ2gȕv&w ^s7,gv\Yo`][V<1u/f]ҤGmeɂXn[RZjNQsӜԚۣWjw;q9Gg-֍ř,PX-6*>E6NowԲTk6˦e;2u5i ǐMzʼFYwrW4vp-U{EE9ܭ[VEq~HUC~3D%ժx~nk>ǐ5æ9v۰Zp̚&_S<(nkvkmg6^k5"=aT;^^>kVɨI_n.ZSh5n(EjqZkwǭ+VJWŢ_o֥vR{fRĭeůl,WV.}+%E}45;a<vQW啝vۮZ& [܂+KҫmfA&\n k,'U%[ќ1U*z]۪\BF]+{Un1%ެW+ί.]:I$ ^M9ة+a]lM݆V߯b,\rVH_ 5Ubl7zdR%g׋:G+Y]ҨY :=lu׫UisK$ {4;*-7vQFO,s޲nmeyrP.oO)έ5) ^Y0L_DoT/7ؾ\5lBb]]If-u]Gt®H3p+jEN%pFArj킱ȖuTTɴ s6ّT $xOWMZ04A4;ԭ:1:oév'7KJEnjvEEYD8V5k^Ulc7Z.DުI^ٸ,O/7CDW.x\)j(fŽ P-azvE׋USDүRQ-2mW)BReˬ-p~GZ~E ZM0r-)NaW~% K#5PM3rkuf8f3~mv%]y qSLENd9U̪)-ůwԲS0jvߙFcsTԎKmRE>qْYw%VVRI-a}q)RW;jI-ܳJWx"Vz2L~QŮJ;Β4G)ՆW4ݒUdrzF[k W #v G1v)뭦P^䊪}4\bO E//׬բR{Q6TUtA %Վ 7]>XR]zVԻں Mr/LdWv%lrhj` vM5Y'׬6ѮJN )݂L}&{ꍭ_D7Nx';KrQ~(b]l^A۝]cz~K!A0~C+z;eZ{ BKA ݴ}trk0NU1M\Ohbӱ2E+%,aJq;N1+'yV}zΪ7mv|;SQeffT2/oVdjDUvhW;>dZiVVbi-[=dӻjA<ћhdi5EQ#E_:E*U\*cHfddsnCrLTk=Y.ߑ`*-eŊZ6Ŗ,mwg-Wޢp)zYZނoj:m-Tq^:%hi=GKfhD,(nJNJVᶌZëZmVECћrؙ;rVKv't[lb՚_&6dԓ~XepVޮ z^Ws+cu AՕv٪:nlz_YjXvԶN[f|%ő;nٷ]u̚aZRڱwVhNTŢvĢOsnYV}͔•zwr+VEveU\qfSi> J]厅ѫ+R"?ͩ7;V])kq-$Ħ*m kLnekEN/VO+-9Y[LL.ݢ,^M*+zOZ(.)Z vϲXڜ"+ij./jK+]-ݯ4{zM'jhU*^,kݾ]eMV9;y%ݵrQKr:۪IJjEvxz7 6aC0 /žt87RwUi{+>=QEBftxVSq{=A˦2Tl8;[RtvY tz6['xnE[ҥx-WM!yRAlt7n-rz J톅M4`[Ұ:agZ{n)7 G;)nʊ"۶Un4`͂]4ݬ4E\rsOػrhT&(E '˭ZO+#, gkE/)~6-UV5.MsqWKTu$)ȕt$qzݢ[˭8jO sxYi֋SfR:iv伞'ʒXT Jij ~M{ͦ%w~wt.$kJ!VΪhS[nM~kjjzݪݦܔf~G/%)!軂/<-]QzZϝr$TNoK3rW3R]Q*EPTte*[*ڮdwg󄉴**d7pN4_ZUk֮-Yh9R,ubۧ+墤vMmdY<\ltUFl[rЪXn7gs,AR~vZu\A*= ):oi_/[sibE<"GQ{#~Vڨl>#Vk]xm:ȘZM1O<ݒ_FK-+vCP T3^E,r6Azrѯr[ܮ!=x[r%첱+U5f ڡ+q[{[醣mVwtspJ+zۼ0 PtMul*US ]EeWQZOW; _ K#5vYn]^Un9N{mJۊ\3"BUAsKPP|S(;jz݂Z}1~c9Rñ I,ixPzy{]/Z۔kڞݷKo;¨u{bא\T+ީ^nWv< vp[:el6KZfy%b1/n~h m}iX6l45#% L&t[L(52mw~A0Qq+~7;cn Wr3^-_S㈥.KѤS=㡵u=bKޢ׫k%ב{>Dof˳jMzl7[&RtSXq IZIYVoNѪmeHa ^+=w]ePzVʹ;j'diXnj2uE/ ծfZUdUkr޵I%^|f:]ZE鞝M2;(3}/-ۮk _ӮTevcJRYoVVJLoN%%ؖkhv\.kX;MSsn6:5^˵ZTQW3b,V̊+ޫuauc4n!U~";Oz.^:jYrgan7~cLbҤVbگl%7U%](Z٨[)6-"0)&ݮ~^ ^A;zA w37g.6}LUZūc͓nk5Dқ][UmhGpDa^wJjOnYzx5 )2w.J0XErQnxrHRoכ*ij7&k[zI*7=RZz+ZSm\ +!%i]_UdI 峰 Mq )jz+(FUl轪劢j_KvcrVZ2k㋰ԊWʄ'Weij́[*j5ђ5 cISj&Ki{*V 94ŚvZYl)^[vOfNWK藛)G,״n Wvm]c-zɧ뱐^yf] &䴤Zx_ӲbwNZ]t[*J,[Ŭ) K[2se[+GstQ8_tA=)zYnީJ-fxE!([NE˽VmCvE_:ߪAR֭*'yBn_,Kzç ZYr" Т r] G`0"` ERD^ܦQV{eq QlUnnf73TQZԹ),zWv9e> n$,5C7Lǘ Ox:ےy~SԺjOQ-wik [/3+rSG]Q5!OU+eo#Ei W6o\_/~ͪbaUb_-rJ15eqĎa{nתҙV/zg嵫\״_9e8 GMrMfG,J̮el͊4ŞnI453ZmCK֬6}zŭnY땫feT~&;f&ZQlr%SWLKISQ+=\R4í-ޫLflś-`^}cjm⠔ljYgw\NKsۭf;-ٴ V˗ZvM|2ri)3iF˱VK5avaZQoJKĆ.\ZORcpRXnіs6Nr8%u`֚uܬAR.^Mk;.cKέL#T; I&"]BV5cMߒ[ksUTGVdMY1KHQIUY+j# jIj7-2JVUSz+nG*j`nIJ~?_d8][/5AhuîIqzͫغ^`6;5q__-u^Y)\slCV)Ve7vbV:|Vx jc7 WC1 awc%F|Ďi귚erL3l Vi:°zR͒XՂ[Ӫ[}iZt dNf6^e2etKl^ճ-jWƊUNX]44zwVtFVְ֪zS4+w,QyjE¡ISK)r[ZW+EY תX"[~;_Vm-[3ݎ^YSAP[zenEPeknhn[nTY?vu\*6RtbibaU4vïk(O+*MskQmw̶$>կ*qzĮ[f;Z 7oՋ67jlb]n (+zC7#Wx ӭyT2?NaW(]5ZZLQ@-)v*n>*Rc:*g WUrkUG&yXEK4U$'}}u~CiԷ0 7^eZgAvzRQvɏWKov[6r*_v|ubVnd*TVjɫs u^S}YI ɕr+u%r έN_6fnOPFOvM׹kj)FXWDUkZUʵ~ɯwPf[:j]{nr^tijlXԫKDѵTr)Hl[ZG*ٻ:B7e_zbh&(V+X}X[Iç7T#vRX֚%׊rI-a$UV\KbtGwZUlrы-Ym״[U.n)eV"7~fsڮU]MѤXՊpEn(9n~_l\X 0%ftr9vά]]KW/( (~Ǯ(Z;XRQ& r(b6Olv6M2U\rm IoKEr+UKBCԫNQCʒgZW8Y;Uʩ(\/*-WqņMoW܂VX5Qے/6Kzh&U_3~k:a9 uUs[]&T5UٔKmY6H}&^R[I)Y%;}v1%.)_[JG 7ݞ!4rhݓi;زjw|eYMp;MK[[ky%S՞OװAg|jȴrXA8fk%UXR#$,vܬKJ>E[jwZF t'kp|Y /UV ma%"囵~`w *,b+VY+fa^MfݿӴW Za~YzUW7svO\bg^ \;^W#KnEmV+ ᴽmanv])׫[&j%ۭy(eT%Uv ^U5;UUmukC_*^"W*9~EU=(&W1 umaYouj]BJY_4+rI4KzbeͲޮZk=R7Sn+[iyVr+3u 8Z]/,:# knᨪ%nCn]p{+"YemQ[[Kr0vk/8F1yƫom\k,ͫ}jYK?S4冪XԥVMݦaҠe e)\%z=P ],8%( ̵TG+bEo. X@X OsniRٯ-V[~z./SB# J~d_p 7 Iq p2fO ӹf>-*V(j*u/ԵFrX5_tS4nיVFݫ=^Q8~-ŚYwd0m$5I5nG^OXا5vw5UBQeMtZKM65ԕVcvTQ.ڨBV=6-z*7^d5L\,7׭׋"51~OkWKU{EGj9njekXf$:wM^MM=^#wn$͖_j۴b_P2z~v:$+VeK\~K(*i;kKԆMfk=v[[O$;ج7&vnuJV2;&[MP vex]U|VV嗔=-t=-Wd˺|r[(wANe-Yqڪ nDZoz G;(a mɎXmJ%r_-ZY Ol̕C2bTiVnn^Qo6JyMQqj'`M7kO|;~IV^g4jU voV^W[4heC&;rbV͓ ujۅE&8ZmmnzEݒ)W%Qeܯ LY[+ w(?se7b׫ T[YZ]InSL <r)%S2ۮuenJ^,K^: IbQpufIvg8vxe;`wsaE S5hW :;{Bջ}vL(xQrW~Kozbʉ.NϞjjNWo(-{Zkņn]gF*~P ~"VMKQot$P䒨\uMs]v+vO4e]tv[<zͩe$fsE[,XL]nJ5EMvcjuޕ܂WTr'yݺHեjn]o -tjyvyVլxI2^ړԺ$ׯ^_ےޮ|InZXՖ\&vAӛ-\-͵jEݮ/jzWXP<CqQQtq+)ܕk"R$eݓ~\wv0/zP;Z˫+3DK {bl>ڍ_ O]-y6 jrgK:gy> pW:.(]4ٔj{\XmKV+7snVM$H^lvzϮwmkkY45dA5Jj]n6~UzQrݖVve^[--;^!WsC+EzKZ؛e8[yvTezuGw2癭j,S9bOLnW/SQmvQ6,x>StKs`)utKT;$ǫUk+늢뭎S+Bc_SdZ-)6KnX]6a~G먭b͎!+2bzjm-}lfVrT[fEbBQG.U͆SRR_j+l=M.V+RYn uxKV{8\jWzf&v)ݖXg>cT+ZmջfKE @ ZCn8z7 a^pQ@0mjJNj cL&V{Nc%h]An [Tm,ԢUˬ*k-ZG{]-\+T ]ݬIU>\2z4鹥d)g_q\7u# *mYPKX6f/;4l[LJS*Zϋ>ݐ;~wo~E/(pװDg+neZPԽT魆iWf*#Ne:hUA]>I+lӪȺGtZ5V_ݒPe UVɲldzs+:EmvE% U-%Uz'\=EhJokfrP:^j4# vC6M^Ph]14_:4Qj1TMA4'd].vcha ɐ< -nLz$_tmaiH_5b\~Y 0:mi~Gi&ZZ#:ņFr+&^\4w.ViN{\xK[uɮHnݵ "Vz9)m"{>mk5l.6_pKgU36aHN[&W6_)삣V ]2+\hXr#xZoU*dՖW\,u{z*]Ut<:i(Aw̮U+^m KQ5^jayU- %?~JM4rS+EvP-6+kT܂얬V+ܯ4M,6rCZMm47oUrNܞmjѵĎIrǮӯd;z[\KmYoVe{raZG;r˳eRV.ڮ,-s[eW qhu*o$c-7$$p;}s}W4_z֚EYz/6o \r5#w[,k:AfYYSKMִժZ +'z~ï5w (c`9m׬nvCʢ{ZO-RĎ0uUh}v_.WG]|NG.FEi,T6:uy&-(zR1z޲~:S0Y&d5-AUmz^&ӍJrMTٕۊR44ǨAirT" 0h2L,sۻ][,tJ)JIוdGbw{ ZW9ƥNÕN_zdjcm+r[4CQ*cᶻ]p VGi%`ŖR5aJK}[jVK4 vS{YG+({LWmM,Ǯ=wC%[0sirVr\˭jhnݰ I_0~oX~q{ժ_ze7`6YXn޽eWN_V^)eVEI/wjiKW^'[}ǭe]i?W/z7zngCМ X>QUn+"6 0#ӻ aw_+#7$o" (c6HV v*Xئ%[(FZ& rGlA\˺Mꈝ)Nޑ~f[䎶kܱ;\jػլKXzכł](m]zbY*vǮnѹZ*K6=26]Q-j6[_Ei:Xݮgurܲ%]WV[bgz,I)(TmT- SnWVM$!h[2 nX}3E8:X<>ɑJŒ 5vN2aLM( jVKR:ncVljҤnj^V6֓*Ʋ5RpD4 uS.WOjCW"[KrnSVNv Y),˦YbGHĞ_bZS0:+T̊5 )x#sGN^kU f22^-C;,d?El+VPb YϪ꭮Xq̂]X^%U힣QWi<};mݬ=_< [k5ˑ+*Wsz9-bA]-nнBat]kyju( PBd\6z[cIB ^An Y SoHzd^]J!yfWrU(%om^WI}t+-Aڞjk ~ToNKs쨺VR\I%/UzQ1Vk Qy5^~YW.RFJFgU ;8?_(l)Fs#) nS]zOK~e01:_~C/o ozð;`r]<CME8}jU>[eV*S2u7Ǒ-݂Q*YnhWvݒ"ljUL۲ gQr+bibE4 NS;f;{٭׻S^6׋MT*{ϯwSV~G IQ(XSo)ŲTnϮ˭ =bvi{EQ,)X1mVIϗNKWvl5WuV9`ǥ \A^+~AîK((8Wv 4Qe[T6%eOwLk5ݾTޗ|MZ6zvLmvAV\К6aZnWg)i݊cZ.NݰLVUsǵn[+T^5>[ՊUt̺X\BcoK:í^I w_-[gY+zCbe7+f[Pnɪj C0\.nC-S.ZKRhfL~^Tj٩O[\E ǒKbV7{,e56W/o_Nav*UbPw~\6x`=BO~jj6(ךEoa!n A9t 6˔CvѬZo]Ab߱eGSԖ*˵詆#jq cVj킢>A_mS:sĆj,k|[K Av^mTkY [lZ۬5VMfM`ʢ6˃3h4EI "YW صٵHFoeMZvZ[g)>RY,v]6lVufxU_{jo5,hłU .Ēly#+T,:Y.jTSl,hY:\;RyYkgP}ltJQYZv5A.[MuVv=߯XWp*cvԆ|xfP+,5Ґ܊"lWH^~˷>[}ì4b7{WJrUd]UvEU|fֻ0ޣ׺vI[.ӫ,VSk~eyW,VknUb[.(3l*imL%-1.4 nmP2jGo-w\hKjC-WSS*3eQ1Dk5˰K.9~UKQ{us~5z C@qKJEZ:kE"xͪѱˆ9+W\߯7wu5N%JнnMͶͶKnil]4\͒kMnl J*e+hdEijY x]TS (Zuʖ%O-tP댕:̺5_4[ņt~Os)*ns9uN덎& :a,UUJpԚ٬Xvi4.Óvz z^Ób5:\_^Kv \r$(N`৻m;T~/z 61ZR;kml7P (^%Y_pɸL٨;JVQRVpݢw3xgNZ2*xVij檢rWz/ztR0= XH^z媨v̝*8Kն}Z _S-5JmU5jvI4\zr]m[̒],kͪEܮd{Mfūkcbô4AxO[jeɯݺ]yݲI{Rr[Ū߰e5[,)k7n[&eTJI)֛,fTE,CiؑD]{驝buN#뵎)YzW[^ٷ*ZZ.j*yꋅ^bIȵ~1[{j5*]1؄˺%7SŦڡ5V\\6d]R 蕦m$TG^ݡw>kmls~ՔsNakA7)26XĂR)rSkvjYS^ .WirRԪ:K,ՆܧxXTeV-Zuk`U QnV5~ӆz*5{Hj^E]GJY>O(*^zmMM4nU .]5;IxvuDUk~h]"5*}Vi*+ݮر\sӓP(ըb/jnVXvQr W{~@7/8ݰ+CW A|1 @˷̽էzۍ];^rRTG˥rULcVTe*eW1G5&˭>ïxv[dJHZ]Hf+tMlsG7ޏ3Ea霽Ѷu2w^:Rã6jrUbn4ծ؎WiٍP#Xw-S^A;n+Wf.6Ǔe\wV[4tb%eU/U|شvːؕj%Z}*fAߑKbO9;ɯ-jbڷ~,jEĺ*ERي z "wWbOnOzzWjMtYҥ Y^hPf׮ެv cG-U9w\<ذ$z( gߨ\lb\|29mwPԹ_e5j-Sn44h-ߑ,شyݧTJ[ ɾ\Պ֫+v:͕&Ͷ_m6+¨ʭ^Wu=ҭJjUX;o4"8Qb%װ ,ܪ)7ʹnINS܊>T*l2 zl.<q67|ѩ]\]$r)6̲U󫵎%UV-ݎm/ t(5xuj M;=Zu4bkhZȾ+NEnBf#Vvd֙Vzɂ&ت[fK.x )˥X_bɭ5;+4$?~Ā Ħ Gޮ_`(#ZҬV[ՄcZ(VC}j5-CulŞ6rbinV6]Ӕj{wb/>6IN*JKr5?mK뽮ٶf% GK?OE BE*Ni8vkwb緕k~M^mӘ.e[\/=Qz&,BzSj`+vǫJrk/*.vF$V'UNcUoCm\nMnt'_W*nMw{4WLe6͚Z4L+v_ _~0 aA% }zսT&sjwV%Xf_ۍeV]Q~4s+4bkԬ[5a;ܛ:`zхK8Q$*nU(V7d/zns6 O|>e:Q)[t-$VP6lzũ(z5;khkwa'TvFQ׹ֳ>5- M.%uӓhVnYR&ujFmȵWuʄbJcw;Xd\0[ZM,G*Z,Mbo]Pej*%ϩˍexu)L_zj}JbdZVjBQ)vIQyKw_vQJ=ijW.W_Dl5M԰_n Kwv_8:ꬥ'k~Mk]kjj;vPmu,ͭʂR;jU*dnW&E\Ӽn45=ޤ9]G5iUƪU+WtSskNոfPЛtVYؙ+[#VZY.(E[nܲ],7%EVl%MbEjGJSUn^:gGy=$IY鶄ƣ̖+jTobs^lk=XTc("cn9U1+b3XZUt {}8v m$zvÐdlߖ&I tjQ[mu&.b7M-(["(՝i_Y;WUSںInW5f7 [xjյ bgF 8r^+~A/$"~bC/(k=`xHU+4jY"zIڔ>[mܯL#EU֎ڵ.CiNm57J2U$ +7]:nsymٯvvz[n5gUޯbClFӛhܕi}VuMGu;f) rGrJmȞzh.5n!v%gi_oH%9ȽĪ'܊`,/;V;^T-;~kJYnM1+Eo̎ⵊ_UٮE헪[d5A4EjNկKmZ|]X]SKIvs}zwxa,54ml uSnz&J,fE`+bK+:JCmˎkYc4Zg9+͍VoԯcVz3m'.rh-(E[Vdlw]LCۑy2eY mVNuW4fpjer9O-as; f&Zrr_ԪFe%յY4rKqnU]P3ܞSɢsr~nxaflfhզ\(NW~*BkǯKF<~,WIZ[2bWU NC-Ͳ^UbNJn(nWmᗾVz0:dv.j2i:]t+nӯa/ޞkFpr{M1^.R11KYYvMVlsQ/S5lӫ}v,綺bXrauCU=PA"ސ A#.)j` H e^n {<Uo5k%&oM5咩5$Ws{%,SꕆWTYVd١%V$} YM*:V.׭lW~cmeK-dk=^|a-b۽Yzv$+ײ\khByS=z2Q2BͲ,E6 v *rՔG,W\l_kd1̂ Ah2oj݊D'er۬5;w}t[*rٮքI^+RUӽgԤrX*tKUuQYaՆ#BeR4ٴFtjߔ1*Zgr.'ze4Di۝Mѩ \1-]ɽ"rKVYNFhf EjKv ]Y4f-Z9^\l jQ7ΞuRDK CLlȊ*RߩnGw7o%w26fʭrI+%MmQ7vӨ Q tjY0݂([QKV,Kn:n3%2eo]-WZKĎ4~*wڦT9B'DqC*z'Z^br5KP47\Vܢ+O-rWW3noBJ&,Fr+ȬvUY{cbiUSņ/7[n]ԛfKPa^47zjmzfE[ҹR\9rϥD@ @"4 .A o EoE^1$9:jؚ#;}/sڍO]rۅ؝k7۫h^hX#YrYvZi,orj1 I1^MRbHyL-GZrN*OLY%m/7U_ j`imYr%Tie^\,C[_c[_UZjK|W72T-&_Zz)TMm蕒MY(ۍmryb^=*=y"/5ΎKj\긵{]X_3])yX)͹{8_oA,.\k\ ӯ5K鬹-ʡwvي!3Xիk[FfZy]Zr~KV}&Qʬz<0 Mm~I km/t,UܮW QtB.79J˘U%eW*MnGmrKW9k vG4jQTG*#V[1zQU{7Uou56[S̢ KMwiUoV|2dnץURUT2܂yU:^跫KgTM Q|wsEjMmjzGخg|I))ݬօVuM&VI+wrZ+-[-]ѻLcyA$5f]~Jjזk/-'ĪVg5\ wgq{V-7*<^P9~n̞ X+M6JNE)SYtr&}"(L~HfA~W A%$ާijd&>rTvܫf]ilT~Ah}eT8 w$f!~4=NX;bQ)T_t +\£j+Bj>q)J)NQ[JǷhf3mi{{asZSKbܩ B3Yjk^_.xV-fCSk$}~Aʚ+ձ{ސjjkZajS7wo\R薋L,6Zڦ5WEoe,U$۽z;Rf3^zԂp$u]&j#Z7\_/K^۵KrV (yI4]1ݲaXk5ź[ܺԉ5M<-ǒm*xrkUbԺTar}2)aR;-VnU!I[iSh*]FEjI1~]ʂگdI4rG0~Ynln L7X;ROtRk2nrfѦ~EIn[gs-Oۆri} RzK$NZ-ijM媕b#vjeiͫ0H-\JeRQo+Uwz{/hP*_Tܖ^lăai]v%KeyP;͒.:56JkE͗UYj!-xL7BI:1vK2j٪ vŭE.ת1,F]~AP/zGrIWKda`Z#g6ZUfwI ?דth5Sn*T{vds]!q:1tYP4yJJ?-Yoƾ_zAR~j(Վ"WKr"驄r\fmR֩m EWѧJ 'i V;ߪݮlkuz ԝf*VzzESTEI'Ы^IcYiUhbu(cA X.5K+bO9߸voMf5bHKo%UJu厫^ljMh&]ZۢwWy}yRm*MNN٭hnG-rG\JIcjsj'қ>gxL-rdXFsgգ*wwUlHݲe,35nEh$וXv([bG+ѫuAeR&~I6`Ee֬§wmQZm0Ųv W*&Z'ɨnEXN[Zl%*nGfk=ER\1 kVCPW,寷m^mږp[2n*W$ZXֆ,dK6 wehz.ܥ:_󊽩Qj_3{ޙʼяP %v^ඛ{WrGivj__yYXN+rP[vKRWZ^0_fb>j%Ufɭ*(#;[6ZUխOcˬ~3˦1^q<۵]y%}:".״*wk6vW$v:K Om%6:rj#^1ݎݭzkjj{qr?Xmnכ " :'w+I \ռvqfŝ-wbb״ZoW Y4]- :>^;4z_щ>E6߷fUQ{P9;>ǫ.E+zr j_rzEeEZO JRݪqbE Eڑ;(q>4`Gh #7]~w 7$$@ uHm\>JoaK+vIUUM۵j]]g%-s,8_jYՎ&2A/|&SBWQtdKֵ펯WNb4_UnCtKT2K^S$$\4-Qk+QRkrAgSЦ=tĺU̝Xkk-A+KbcΪTjz#_hj͘vc'-L-^ˍ~yJV~ǒ:n\Z3zQ,6|YK826iXmꌽSMOҿ^)*H 咺I+,3[Ew+VKeTKݢ`Uj\^S<MLJ;ak~騗!Ws[Mi: MlEVozY%kԋ5'5YeqK,zvK2DO-y4WURjJY1~/jMlP칪u$8rcm;[Z>t+3ĪIR$_-߅ݬݒS ]qwfW$bj(MQ>MU,StTMU.[ZbQ,9.+rE\nyvOju^/Y֫5Ύt ^ZP8$+];?u'Z2m]-JU+r M3;wqvgݮ6ݞE 2GS*׳l^ѲMKEkiHrK%-ײ*wdNEQJO);Ym(Rhjl2;^"_i{ǑZ׮j5ƒrN^vXx \"$KuOwGꆮE+ulYuxzQ-mv( lPJoUzRy:.IJް$R s8ϳZL*[l\KRX{]4k^uȬb̀@HzC.!w# /(v C0^QId12=t+ NU.ecQ~Pg:_VfTTڄ!9U.=Y,]QXվ9,˱٪p~Wi:h~:gN4J|rMX̒:z,n(km~]Xr-˭KMtUZ/W[ZV}$&L/*MBU/׺ *ԯnMo<޸z y#$C෫q*zCS9fF^ $2\ [`W7x`osF[1^-푻Ԟs\.XeJ$UfGPB1#{m.iVf$`ʂJGk% _VjUƯ)s0k E&G=^Q(=Mrt^Z1B,66+DݮAV*viNV6Vד+^OQԂW` nɭ1ZWwj2ѰZ׻tgu$Vb,G*w fkӣ(f(K~,byZ$kժni04bIVC&Vki/cfZ5QڅfK:a5J3ǪiՖ]R2 f:BWk~U7#ulmV5-TS}j~cNS~URKz[0gz7zi)6M-JRBkRʪբywV_ZxzKn6fC췫1xvCǂ?j\3 RF.ʰv|;JY4En b.t EJvP}f))ZPT^˒WYKIk[Ǹ>t+-ԓiZhEh g+m,s$We-O['X|ZbͮE]P%*eIJ詟g˭jYE[;" 2vLq*UnyEQVNZUݓ-U񛧠(77;ݺĂ-tmIަWilaxԪݗYnKdGʕn_ Kڬ65cdP9LQWvKM4RlYbOިwZ'"j$k`tna}zzh+5Vi7^UinzGvC{^tMZLi\>i EkK/76֕yv\`nX~nwr!^*:jUOs$q&Q4{js{f^w$6ĺZsظN䟤z=abŧR bsKI֮wmԑkvٔmɴܢ uGdX:rE1ĞgĦXp[FIPŎ`6_u$IڌjD+&߮"^~bwG "`hK8c}b[MFXeCwjTT;ӭz՜Al7*ؖyKlvkt <[ rkȂ EK{K܎I_{$Z-~KET*nAMwQ\Og7$A+&פns~%wj] k>TL&f2k+ӵiHFO+ZSw#xfn82nb%gq wY7nGeCx\8F2VlӣU*e:rTS:ē]vZrW3]oH_ WV.x;\xlwk^5>%\d)dUE;^ISrjWlkԗ:eDW^s+T^,GunQDQg7 ^w:ԓb9#Y]͔ۭN2RzZ|Gu .{zjyӚ&v*Zm5d5ؠܛ{ۨj8(n= cQycvW,ZVӛ\)Ymw\*[Oj ?ׯzsO*Ot5iz\qxeLY9t&s6~ïvrҪDV sYo, h3Qj![.d2dK(Q('[@/+IRJ-r+TVB~3N\v [U Y$-ەMs]1kR</(2]gyf1Y[e Om _ ^0__H 8xt[9 >'nM_c߭{jԘKn^"rF-zWZgzG|A͞nxvYZ7Yl:Zj==PQ07њ+ŕB򹔮Ljw:oXE:jjWE϶+vR;Zޫilq&&Plp~:uz}6YV,Vmv&kx HnT.QfclX㙕no(v\Xj~!&ɦ+Ū\R,co"7bWoݐ:zS}jd*=^3³_N/v(}m+ץZ7K~yjWnmQ.R Un9ݎ'nԖڧ&g ۲4nlRdz)V[%$Ss_бjt*M$Zz6U+ױ-<'vG՛|TN(vs`йf Mf[)_~T%4}U KgNUYNEZVrխX~m dj(-'IRGf%Wum ꗛnJc Suۑ4r鍧8r WM6~+XfQNůu+ ")6^1nC ~]+zCc8*vx+1)dj6>PU2"MKbWkʍQ5|ӏ{3U[0}~^xԶWM_Io\~]i6 ]K6 \{ȢUq)-WXsEvvVTꊡUWu[ ƷY~5QSNeYe[bZ3hh7 T %ZYm\ "^MUP٩UjxHf>YR9*6˫fI&\]ae%,ESTM͊93w4-*[=lު*I|*z_;Ų_.9fbl>֫킭O,(i{ RS2O3 64(rˎ*Lhb,< VG ohґqv UM*j*ݴjQkX[sjjq;izk[4^#v~-VJ,vlev}¢Zl*%mzސ _RukM[-In-4ܒ>z*jiI8[nbtf_$Vm Jv NCU .[jpY5.6ܚT|.IdU3͖h"ĺ*_/?~۵;~Yjj2Qi*v Hnו-rqU%X~ Ѱ$h v#E U^3YV[iWm)~S:sMbk=S-Cl:-ݾ֐Z6lU4l]U˾Uɮ(Q \-~n,.~EbAPOX0QƳN{+ej sbl[^[Vn ㎞mvPj=c͚Yj܂ngtJ K7b`J8[$ -RpUWUY{f- ku4lrlSKt[SwŦZJ^}䫜2ݒ=;vwn*.Qv+zO5tž31{ G[zhWĦ)Kx,gֲ|Y0qZIȚu$kW cŔ|ZV4jeի*'\8 r SJHB͖`hf'VjiҋJW}1[x2hjZ]GENZŐvc)YήSAy$-7>K&{U+mO; pxOtk^Zeߴs(6 k_I^IԌNIٻ6uֳ:JR&/Ѭ} ,γ hjq^YmXi+gS\ū,rەkuǬHM^%)¡u\qSj:i @*_ ߯%+A ",Ȁ Ȫ[Dmh6[[*̽c[eœ)ʧ-^wFhwC*3:e;Z0iR\zFzHy[.2^˵m5#\]5{ZUb5ԆY\_2S ~.lirM=[iBW;ŴQLpԻ-WxNMi=\l6]2tŪ8~ث ~՗fY[r,fw oK*w*|쉮k=Gi 0Mu^&H Jiwؒto6˭/$.wnOmVktQؐY ,7+fIfY_JE+PR`9C8n C7_~5`3t>"Ȇp}qkMVPr=nޮ])e;no/K/U,SYAw&7Sd#RJ,)BmrM.5Kin[j9a4^eO85^륭*م'$*g-19le ѯnݤMՉb-^O.NRm+uk2-1,iESP{C*]kGݺe\R5pr-k~KHvz!յ~SjrͶۥbD)b6)sELYEUjJefX^X}/t:nEM^:H-~2^zA zohW ~0 /X2&b hYJ#lr ̳oOUtuvҨh {7K!5{_TN0NA'v\jjժ7vz/i j4R.l0T[2Y~#܂]6Na.ScETkfc1hYԂa(` EcI^}V.%9WUQz s#JrsjMRGe{X{[VNUnXxjjMðr%"k V ڕe|'t]~Ԭ5lIѓeFڪXFH kV zc%锛&ijjQzO%K$YZ*.ә]i+5W+|蕆LjFY<6+riIy ۩ K>Kbv j[XvtԒԚ&7gifP4{ժܶAr66j;gvn\(%Ϯ\O~f͢/ :zo]Ķ+"j$߮( ѮժgKR[ݒ[zW,Wr3nyFիw-I.]S`V'w%i[ Y4%[/rE,,:;*q+ 6[~!M^2]ܧ(rۯr_mn!Y=\v]pLdWwKU8rC }ӛ~)xb\~ /^_~G/! "#hVOYcsSs\g6;f\EX{R]hj5+^9mq4-tؙ\8klIyb-\ $kն Ei8h5fXN_86Spz%)irnEDZ $Ӭr[[PUب4բ%okVM+e%3L%|bWWNI TZERU,rM.[`z=a;5IKGe~FO,*/>.a5"PeY+vY*wDYjb~j_jf)ſ2,az/}jXrZ٭jm2bZf㚩zzDén[UU4#Ŏ6Dhyی;_t61MgWvQU RZFS):-e,h%QTjM/Lg=+ #8:M%kCr*[-m+9<[Q ,(ZAVnUվ/fIԮ!h5[NGڅ&Gr[vu$*JRKrr6%V˞$UZ;֛$Ok]Z /-ZQrGnzQKO1vM(ޔWv!e2sV{n˩wgz4ZFrO=Mٱ݊vp&AbuR,x:OxD#r*v5_jlŲsJkZ\=rVZEt3ǯvV'~2 rQ.)0ՂYmmhr, tzEɯ+s7lU:,%4m~ <.*JatPoh ~ӵ*a{f--v^%M2JQW ~o)nw-G(ܪJjx4]<_= XuIcպɵ~[Iz\ ~vjnAv\rSqJ)ݖR$ rEX V3͞ZjRI+dݖU9e*y|$f.:QmIUUcC,UzŮWlw,ï44AovzfOU;`;}No577~uBETEt[՚^9)C5X->q&}7uE%? 'ZA].z]/T:~jOtbGu^}V ZR꽮 mk݂jwUn 3r.3˼ȅ,륖RsorQl]l͂ݳˎR[;v[R-[7,XwkQ7RWg{UQi YgU!p`,zzo!$_$[ T6g%Vo&#u͚*RI^f-S7l:A+jz޳lpyr..M*j[_aIjI"*tr2ˍ~_)%MjeE$yD9O,)M՞/4 Ǯ~k׼_Z)YMMv^b׬kQ+zXo\&L_kK7Yt*ZY뉝϶&8Պ&u=tSzj2b-~al՛-e5%̾,66!Ȣ"^ 1-^l*!\Y>r[k'݊fro/64w|VKœ_-` ,c6Ŕ Sv.[_i1YfsPMVvn(+4RLVt*~h..&Heݮ"vrS{^_q*io+~l=V?g(46억 _o~W~UU11 m*jVũZqjOZfSPMGnB۫Ԗ!`kM2[U2r]rY TT镕"8 q;e=2~[N4)nѧ{V-E[zQйW5z|o;-]/lO͂^ѹ2MBIߢ+UMɫUN[v='EtuCmð*in]weY+h5AVU\fWsؒ[o"@p\;z_+~Aohn~[v+ ``6ͮwtg.cHQF*mjbck$W\FW-o+TZWk8ϒjʒmvt"Y ߳ӥ ;M3vsUlt4qQ)}^_lmb&OS{r]i5 ٲ(Ww}M?7)6~xI3뭒jNWڍzˮ΀؛8ݞaȕqd.ngMN,ojno7z&JwZ瓼v`2o-NOflw]X4vӐm4[-5ii6S3QʴVS.X*zZUjޙʺKi ZddoHNMe]RM3,\;Fez;ZCdؽr=JRAK0d=*yԂQʵzc sLÔK*֬:Zz=xM+#>i{n{ej|ҭ^u%)*_Ml;KEuEͲ㹥tfU.jjdD{rkj!8++Y0~EW r(e[(jܗE)܂r\[Rk^zAZGVɧ5MzCIfEtmcLSK%a+͑dZhEYe[2;:xS^reTL6ۦo|ꗊ~$Y'(MS/WUr'xnuզiˬWTrÑ;vWё:ïw3|%Y' cd;sX-J(ߩhMz@+n^ C!W_1~(y^ȣjUmS|QVhznSdKR-TP*썷Lm(z-QsahVZu˩ի%r*]U,ɮfrCvzݢ) kuM39jKzdzfzvV[]QV.[[Z`URKue%dQfV5hnsJgn!\mWJ^)ynU/vm^U!3˯tZR'tiJ[Ueؠ̚]o;rCo%! KU֯Wvazu2ߨ~j֬% ^uƮ(6Ւԓ;kK6¦ZI-:QӮbXrMmU:ͪLQn-E:|b'ys*vok&*A-^:JE>-":$Mko^ԚEtt֤v)_hZ%zmwDZlnE)UwU$z/ m[q \,`JZ6%{u{2ғ}]YoZ&_~රE!Uj"WƺԑKŖ\ͶQre 2UGӭvUlHrױŦ;VlwE Ͷ eb(fׯJiG[VAoLEZrbhZK+z])FK̊tdUEÑ+jT[BWz[ZÒiV: -ramIʆV+-YlWJa׊lkNU^P=SeyYV+H=:JlzC/~Ő+`w aH)]I:(_苢f%9J*VښӶ-jWo]Ӳ$`z>Y* Ro&Jr˞m}=䘌rY.=m"uvY,a=1"9ri|Q.׳^*55|l$W&NoHŭY荾(^Y,ۥj/$k/wn, ˮ$K6K.KӒ+^YBa+f[,Yvm\^PӫNTZAT쒊rcjZbG6ToWN&=*˽"TyQm -הzTQ$N){G6u6759=һRzrƤxVɯWJ&"_͆kŶkXT<& oo ZsNc k͡+~DZ;mZi|cp% jJ؝ $-[:_0JtVflxvK6p8nįwJzO{-Y,>#z 2.wdZj*6ʳ5hYWݮPzz5&46Mn(Vj)\;VY'Tݲ˽zUfy)oTTB[,jվJL.WW-ӿ=Yn*JԶ;QӚ}lyUYnMЎf(-*v;jAB5KHz*Զ(7rG abIw cq[FPn_T,rZTQ7KnJ֒{\uoO0-%? xxjCzozz˯[~Cߑt_'&CQJYcSf@]U8k{/t]B٬ijWlSpK`x䢨'Vp2Vif{ >=O7lXLqk5e\zuD(ɢ.wj#6$V( [mmfP[z$nQP'KZj 'jfI3v1u*fQn+5 Kj(Y[(k6[)5Nm*YiJS덚]ɝկhS~XCPWJW7%٬e%E^^jA9}m:^ȭBVknGwQ[v쭻ve*~Ol6pܷ.Ŭ='֛%۩MR.y5S(w(Bِ{UfvY;kH%[~GT vaS]R߬5킫{YؓzG@*~A~I.bCAo; xqѦ\#-gPO%Юl-b]gxz]o9#;ifclrIf+ {Rkc$VT5ٰ4#.n]W[Ko5M4IiZ!-MiW-WT_4z˭NgA2 2Yt^\mn].ՂOKү_2LfriVKdSJŞz4K_Ն9^[Z]S,MN.bCP_o*na/5>KR¥aN,}PkfͲ4So7vHn EV *\/MnEnJXPm*z6n[Q\mzf/l+\rܮzcmZ}"mKѫ8fϹ I|jSłWi~Iқې4C0 Y;פVҺǑv֭r+v֨ç͂*^~ðLO5.e+į]݆ڦkbCk^.d"͖af."Rњj3+HݮUF$Vm4O:{vɰ "4OٸEqrTL/R[웧z-E[o4Tozvy z܊[^vCt-eOi[7n]{T 6UvZ^ A)jSlvvݱ Z_EQ{g3L}#^MJrS i(ߩj5N7mVfW G\ܐ=YV]*fK+Zɲ=rW՚tFٓi߮VjIjԼzV͓bYN  z ^1܆^nvɯWCp I91+0r^knW}*=QRyZUkzEۢ)ZCSbk_JoU +d˞~Q S7گܘnxBlݦuDEvn,jV,|^a%ͩWەN=nQUuSX$y5z]j<[7KNS3|V1 I붽@ݶJek-$Yn|anT-ecROZj'j'vUGe+y]IStUUrufi7ZR+RiT~W4ߑ P(1;qL"TR X9eçvaYo1-6K[p|XSʍvOlV- j_(V^];/\7{_{v5A rc0ZHFYAydYջVm5j,.[զ#5K.bKThWvٽzw^)|N_,X~EP5$XfW]*`+VO+۵dֵb \i}7^}[o >W-mWuUjѴZS4d{Ҙ[b]I0ĒݴzTJVkbErڳV;jne7TV]ktT/}dv rlWEօJkuE7W5_*Y*Oҫfq ~ǮCo ܼMQWudhŶ혢pv]ֳb6BZj5MvA&lnU vgY[.۰[mӅS Ev]Y:nQgf6TQ-ixe+\-wesvÐn٫Jbn>"yMzRQ5]FfhU}%VZtTVjN/eA,4~S&aX 6׻_<:ЭUr_ zKm)7S}E>-΢3\CM֑lIʂPJ}rAmBPL:w%bH]/S۽+FG/ԥV6jml J8zW|ud;En ӒԞW*fIfQ,6Վ&݊S_Hc[O[ESfA(QرUoͮ[R]VtղTa,*ˬԻ)y>c):]9~A+-POz]Tbխ Žj[|oʦ]nI?kn[vO2-Z 7$tײzR+ M "^I%PE嗆R2.+l[wzSXZ5vݞ[I$3fjbM+Xv(zY4*VevEwz%#JpkNlNָSn {yT>c&%+XUgyu5.5m3J@`,G{}zDn_kMkbE /Ces 'ܙ[fŌ]xzׯEӬ Xtì(zV{9^ZGzf05Q1ƒk,S.ZD'8`YS׹KvOoOWB~5r*4uޯpYfcY%U~%EP+sGlHO CA+gz1rG.%KMS1EVӕ*V]m AP "] !!(ec2v,Wڥnni*d[dV jW626%36*{b~ݐbX+e]kkZ],q ZT^{nSB7|lvG~^QĪ2>UEXm8b.MӺKeҦWޑz=G79gAmY,xݳKrLѨ[1~VKvKodutol7 SY A3{U)VNhURFՆź^70 fEnSc(~͕$1=]2\휊N04̐{]Z.U3Acem6]RiWպOK5zE#iE)7Z/ +E-%W&f5[сS.7~`0"-aJ: `M˴rA N/3؆Z6J~4kSz2ZRzD{Uΰl*8.X$խƦE&m_tt{ˮ+X A{Z4l*W8b{S>X ~C;_3ONG斄ߧ<,SYdgBKsdkjGlm6ԚGC oU)n8vjjZzW0*v)i~BGQn_-Zm*;V뜩m^:Ŷ,UZ +}3ZJQ1|~TqLE]'L~X5e-IOAkZI Ib(*YU" bGm{\+t뜆"O]WZ>Չ]+صAn-iFa%WbZ,UnUf͊d|MզMjW(j.kWiEA c,OE*Z^9^Mnh덭n[59zih{,4/\Sz%vbl.jjjn)80):N/Ep5_d/߮%)M %ꕾ_y=z[xjQoؽgc7䚧Tv+g(e[ Z&܄Չ]yMɩ-]o}HvcQN*|2NS%[ lT\uĎZESn6lUӱk {BZxY{׫rXg7QSE]VbG[ݲR0!uSRi~u+EoWj_ ضa5Vx.`*V̍^SkY+?Mػboɪ23O+U nI_) 0RԮmWTѲ4PYn4ϑױ۪۽^EqLMBG7=StԊWN[H|#6JGl|G)A\k/4VhIZ wmZ xL;nW nfص70 [s)_g=[VC2jMŖYӜrĞԪRۆQQ\cNS(hVI70ZbݯMC,B-T$n%4KuajhL %IǓ*]= ah7 []iV$Mg_FyVWSmWYݲmRk iy\8eW).cL/Ws[nuŒ]t܂UDѯ4Y=[-zWV{zˮ}J`۴`F zn_ KvA+a8+-HL0J *^A. ٺb3~ŷ:iJݎܯ6ޫ8M:g[mWlBj*r8\\FjgQW2녦h[ C bC1nu^>|rUul_Е4T֮f2 خ֜vY4J_Z-6c)}Z(6(SZD$X+ fI\Q,L^k6[UE㫝ܳ"6jna*:F^ѵ(%aL j,dJͫnvCzh׫cjzsqdV{.7k)VS̖X%A<_ZI|GwҬV zy۟ӕrru UޭDZJ:q-̒!lf6NZ0zv(:b3zdUDzfGPRŔܖw|*BiwVAawѭVRBWpr+i }rXtkl贤FUSlw:Z ~Mp֪ ^ŝ]ܭKUkRPKz[vr^]-Kz!WphrIU_2ZZs[rMR+Myg,;5f ^ WJ嵼,͚JFcr 9V|zoV5.*zޒ{<%P zŰՖmE񴽺n_M8OVŦ(S63!b-Szm j|{~IM"j],U-Fgr˯ ^+*K2ffڌpԨn]7 7CIH`Y_}jٰQ7$Om}Y)B2iT:%c%Cnv/RKqJ{9l!in0Ajv%[gKrivi9a fg9 UR*\ݯ\w/C;^U.|OLg ݎ^y(Vv{fj b;]C쩵XbbOWΤyZTlxNܖU_*z g d4ME#ʤ{ 00TU*jj\#nljB n7Tv3+3Ueh͖xzW;PJEEľQkXX;F5 klu,\UvO,jzK(I2zS9.>#S~\B)yOlv,:ob>Z Sm]%ቶ; :ʮjn ڬJCQ\u1p[]]4lMgX֛5eK<[m)uW qbZu%W{*#U:l ͎J~U[vW;R3EKr5ŷBܱŎ5:^\g v])5^(;Q˲Tv:[Gu56UTjbG]EXOS,ڎoԔC:JެRaJ&W;KŪ(JCVRj}edsKluvÐ-o7nSh-A݊e OSm̒W˜hZ,nѷyf1@ PbzbwzE/_~+_0 ahox!mLnߡx.T.Vu$kFksROrpKMVS.*f'RvEW?G(sV^%VV}veZ[*RIg;⒚┺UW7Վ+6x!~u$<Ctz$\ꥮ[VDvI{$1͒ݯIkZ0cH4RɤTvj[nkjYwKP5%oC Y)_ LKђڃZ1ۅ\TĆ:l{j j/tnEZNꑖX5>vˊTŶ"Y-$]A$Amy)n%Y)V%* e⨈zqiNW M(]M[*PrZvjX5F ^3ؽzO6 ;^軴jʅ޺j6UڍJwSpVgPjXg(vkv%T/;k;u)- 5=Tߔ͆]/Ă'I$(x%MJ]9LǭfGB[9nz#z_rth|J.k-mMrXmJ_ Wɕ4Tb( ╍&vV$Toz[UujŊKE6'ɩh[s\*](ƹDvIr뻋fG,TK}uk%a[zf34sj߰kbYRC+m.UML}vMm|M2 &$udh~\ZjӬ4XRNr.W$ώ |xn7_o~+`!8~W$S9ܰN檫RgV ?ͪFZVͨjVlu늖j]bŒ륊c4F EU^jfbڒس+RSR8nq v`>ӫrF]0yvA6fDC:s[R_-H<̴RD4a(CSKrIl9jFUӛR5TJ[^mj X2UZV=Aqlj-U1*EAc5fQrZJǨ 2m~zT[k r>r]^⨵Tg -50vQh%,kmʹNuvMꄎk;FՖ^2ٕ Oׯ+r!RV3bg:DZ%jzh >Zy~_z|[v l ~, yE2 \c ZuBO|-Ryg*wutVSE3V-d-5$% `6e2iuT)DɻjV{n,u=SqtU9ך락ޮ*[^EKPuԑ u^4UzsVzMPˬRCISLюژ-W[{V%z-KrtI*z[VXΆٱy"S&E!y)[rZj5=n7|}yo9\W%m)${*fߦDWyj׮ҒĢVZ~F˦k>lϘRi~Vw[]sKъ=߱$XcڬO/u?2@RvbW` GW#(` 4MۻFUp4TV\s(fP/w5_qM[<}~>C.W:F"Ӱ|DiWIx;WJalO G=+srvv*-_7OxbYd/u jm%Q;Eړ̊a:jfFõ?XQz(GS9z6۹Y- fi; vͮeՂAK+|զ%)R)vg:ó;.p‘ v1{M쵕WS 7U3k=lz>c;aFը)fh< wyزjg2qxgeխ8r%ti~]l8FEzJkڕa8v]Q\aĆ*IJ[4U/jc0vdr} \nb,6f0[4Fk8J]ym-)ij"-)5YP{5H׏]Ն~,k۲R-m9ʧ6 Ϩ:bE+(]*ڣ2[n=S/cB_rO0nO=^lknηԖW6~-*]zeWU뉝^] 5%UԦ,ԫ*rZ[#Ԩe^ݮ۬؝JԔrGKU Mr㤵Z%q^,4ֆgt]b}rr2XJ/ZESU:w\\24ͯfD[3JheSLOӭZsc9MZn㨕|v~##/zP!~E$xR@~5-hiȶժ4VٛFh*S`= "ͦ,ڧ*ovNTĆ˰嚲iXZ/j=7JɥZTNS,*6^*[:ƴbI욂jJyNQw2h ,.Q7VnGH5K~kWRj1<%HjCoAIYbKŹUsmٕGyYe,k^^i0JY@F)&ϯQ͞'ukvi|JG14q!LGvGvp}ZXgcAsVyqv.uhLY5Qh{ͪ4m`-ɢ0E[ѨSIudܬ=qˑ53EkuH%QX*ոrgbu6E-3Sn뒧D4p9WTk j uSkfQrꌻ sI|M`/cԛ-$A&amIRyի0W PZrgl{:W{f9::c r_PQr+jL5۵]jTuEʷjVev-W.WfUg-4;=GnV.̮ZJl'ST.LX,]rX1+ղR[jQ}*R[4KcCA宨sR*Bcd,R[r{6`>{$Pfwz)rg3 \\-({6hvBc,'jUw\% _MVet$JfVMVNWꉇ?RŸDQTP/ I&w;Vk a eD$wؖnx%\,R_vG햢 閺S+Vɵij׭7Kvoq<%Wz֕GoJz4Rb JM o~EoHwAP .RN \21Vn\(vL-_nO(i-bRDS^Zs߯5U%LUUuv/zfٰўUT$-6zʠ~bWW^PoI;kžԑEA.Vלi/̧-W+5ԎLzA'kVfMQj״-ݮ t4Q͂kj^\%z˙Yƨު we6KW̮hϞRq:E}*xTK`"4:lEi҄7[Zkv vSvbOw^e ŷL#mV ~Gq̞RkrV+jԻE_/|bM'`Wzۮ[m~!mW(4f\tYrrԫubKk-f6:ݒkV A:zA!w^WM{]k*vZflʝ.MOYZ_frAԻcEt!FdHhibsFM-ˎ^]qL3W,]r=b6z\6 H;uޥ,J9XwlY5vqʰ4SirlY)rAmZ.q;]SjV/厬lkNe2%i)jUr+ʒԲ ]lvTRJO]kxMת8 X"Ӕ[4Z4SVIIuk#k|K9b#$ϭxSp޿[9dz{KצRTjdz`rWeƱʽX۪])]mt:MQMlbesMq=rUbZEyvE.+vn5M/6ĚpV{z$7[BUXnĶMoV|*G1:.KĢ2T\-y٤GV$Mܝ)[1mWUyOqCXnfY宻Jum!ՑDѓ+gdi Xu-)"7Ryj3NVx`~GP--nFBS^+r/~K^ow A Sw1 D j:%E_t6ӑJݨ^zZϮH$/HZ6=]qr[%w*MRalYl/nV51wWW4)UrCL_{-i]2ٱmiЋ^+헻-I4Lnhnݯ4Z4v-nS]k5H-~AcoTղ*\[V5KE<(zeMsBw{jA.ݓWJ=[VR>\tKsíQ} E͖MjjansFI{^[wnӶU.ֻjj)њ UkĚsfݥ%4|)j=[0V\\0 ϒ nM3tZVO(3$"wzo;=Uz$M :U '2yz֮FUhCv|2{=j.K4m_Ptbu'F+z5wglGm$e<4,.˕6oTlVˤTI{n=M+|rŊ[Jz3GՊN4/ܦ^k+Ljw&[-mevɒ~ِ${E-~Y/K2QrEz5Y&%I.ϓ]cQnlr(]woIJn{MZResjU\](1ҳFXծVr"vyLOowK\5kU2H^ ^nsV7 j\Ue 閻n0,J`_"%C"G'!%Ov -VQnnw 6ÒMٞBު"jg8uXЋ]ӋʁTnk~IsK:ҮWݘ]joEtv*5#X~k;=Y,D^ǪVUvQ<]bìyݮ ^K%*ۚڮ>M-nA-Xg&Z Ԗ]gȵVGV)xfHsvSdXVl+[C.v5Cg4SS,ib!-bA;[tzt_T{jg=dZiu5zI+*Z1޼+ܫ=XVO~c뺥ͭ^c+nI5Y/E,dFg/۽,T+`k([.饎[mc_:bYRbuzyG<\5ǐJvG<n1!׎gVn Œ[$^W+ +LV(ךrǖmW/ C,5;$"hEk+epnTq;om5#y#DۯLN& Th+FemngnzͳYN#zGkѻT a:ʥZj۰-I.ETrV;f{ n͝,~El:Z/󍎠IL.r.e ք/hڔ4_/:Z3R(~-5ZTbe=Kы^Ůhj}9+|b13oA+]]d]h:- vnl,jtבzc/wV%5$U^A~jc7j.Wmd;X)wLrTTԯ `a%n(rG8. c`z\gǧJZxrV;fÙ^.<͊(NJ`A0v&ξ(:Z*V"wT#}wrIuUV4]ӊY-c7ݺW\޳~AUq ^1 󊾯qX_Ux1.L[۬5uOo_dsB(T;^Q7T]HS4tbݨ-Xۯ9.5I>U(=Ó=꘾߳iM֫-kZ;R ,n.fpKb1N)]6zrI%7{RͣxJM0b&BWUv߫roE-ݫT,"rMɽI^'wZEl6+fZkvױC[ՄXk)&Rh~&WqK؛M^=mԽRY۵굄r͔KeUnUe[Q APe`b}K2:OYJ[U~R.z G|e3%Y/6W4={r^%.6UK:3UfEZ_ l0~ y.$v+-MjZoN3ԀLpnk^ٙnS%Fp9=ܫHexʵkFVrv}7(]hrJ>7},!VܝeI;]lI핬Nvju,d>IkVCzjmHw+͢o}$$^/zb)Ċ!}65:7k>b~8EK;Zߑfg̒5lpUlHU2U\v|>G? 2ӻ~;Z(,Sn*Z%ߠ{ZhZEZ{cf[j,7F-`m)BbJvK;{M6ʪ^.U]3vXĹ1 K.ݦ1}CEiI[JEU+f)bJW6jJγ*xC*je,tS*5ת+nG3(Ju7EOwZES[\qۦYo:nՖZ2 KU]ר+Md[bcxR6RPxKR]̢Z Ӽl (X;kS4f-H8=tٕQQOr&bG+uj\옆_JAfL5֯5Ee`"^gv`]캬WR=(5;lSR u >ɯIӭT߫ZEDz{v-*^HEV6z2TI׭El:^X;fGkb04Ԟ2uuܕظ<4LvjԷۮ$[_ 2T(d6LɲturT@: uʣ2, O׵7[mzK-YfW \nW8 t*lN/*ݫU˯.V_f[)nŚ"ӱed$K+JzX%E+B3ZJXŦVn k PKfpfe5>ciޮY2v*{=5%[)f[~[q}cm)욽E _b" ]zr*mS/׼~v%MԪT!jT crn}r%Vzm,X\+fk=TnH^9X 5uʵKU䒠YfS R^v(Nc--9},VJ t.:\7Ԛaݚ kQ.udՓVf|~nQ%fXW! .2O](\KNSkVUm 2 NL@g \qD|[ rlUə )۬QJ]mjm"v+v7]2Cʵ%v,7>osBQDU.UzբNSܺv-O5]S$rvQ&SzIyάMWfһDwT]Qm^-ϰv46$z5lXEpbyņ!(FASjk)LbNjľR=nFI~nEDE- ZW.*V}ĂPx*BLUՂ_Ubҝ3I~QE\vb 9XKMI64c( ~ZƣZU-ږʝHfY[^dXV}{Q4Mg)zGj=dN\zMof}S%LfY!0l%*IU[K]:fu-AJRab\- NA$=1]trQmqLS ͬXmI! 7 [{4)nJh~SlaΫv8Wg+-nkVeZKW-'z뵡q͒YMJs]LS.䖰w 󨦨=ᷭ"TV lJ^9U˾W 'Dg^)zY\kW _Xs;zSˑt!>Z1XEt(jNDz>/Wn#TZ+~Sծv4ͧ!W;P.rWPːT)9JoiͺiEhh"[ kMH ~)J@J +Go d7b AP,u | .}X )+JѮl]['b[U+]>si&Lr;lVlVaX&v7\zfc+Kdv + YS®` ϦjWH>uwk\2qGfSvAk k%KWZZPGFYG|%ٔTxrd¥l nK/~!\-~T}I'vQnyBU[MSCab5JeGq-i\I+Ŷ^;iEht6[T'[J/3$CzQrOOP# >XZR˭<ݪyFgz厠5Y [4캅W':zuIh2VigUrەқj{~s5nW~/m^SߒޭYћN;%0;Uu÷}# pk5ufKZؑ)̆d6FKTkZPKi7Y0KeJ{ŊTo8ױvZVY3'(W .MWj ~]) ά}M6 6ʦVoA3N2*67Fچ֬IIZ*]KTR1*5cS%5èJIq%$6[r_ulT 횠XWYz+Vï]M#nldztMKv[WؽY̆lU"krU,$2-^{Mߏ9ehJG;~zS,$m/ZnK'KmQr$q̮Wntz(U,2iVLf ] n5[A7 C8zQ^0QcJʹMR 82u ~ᬷZJ@rtR v㔚͒ gbivr6<S%NCMa6%TۖlSh0{erqV͊:=Y-!;]bf6>l, 7qqՊ7 N[KE.jhREzɑsUtn)-ø PPd(7,A[*詅z[o|[yvMrʊmj][ݪ =MS\Bli'9.Z8;fdE ft%c)rѭ^i "xnG"i&:'q/8]eI67X~gfZjl5ﺥNz4C-Ѭj4gHԲ-4\ӭYmZIrp@ ,/Z<٩5,urK+-F+Z-A|RYksH^%/)WpE.xbn:~[[ʱbPcn 7C #Et?%7?dܪ-osL((mS3,J&zEǾzZa=o i.٬%vߑMUz2bR<۷E~bR*R)o--f_5%+lEQUIQ6~]*rGo7N˰[-3~-M˒ MUWzvr_$ůxr~-\c[5ldUfE LwwCP ёeծsj viR!# {[i]ǣ.MZm(Jc=گm3 wl^ꭢ(]_,)E^rI*Lf;]uC Vϸ+^j[.'\bWm7pݕfjaJ=Mt jtg%^Y IX.t./u+5IS>oYShIu4SVb4Cozfޓٹv`5EVJZQ&s4XZӜK%eժ+(ɞc6Qoz _%Ւr_oKmMu3U˲ -jM,Elv噦r)_LUn|]h7Ֆk5%c6gݱr/u͢ ޒRa9MW冣Yjkźnu/nZTwhs>b\쎩W(AWے"ENUn5e[-Y=ͬ K,48NIJO'۔Z3g5OtWJҦՋ0_݆fLnZ5kD,x1.~o ް;;#(~W2@GInjǘ#7:_;D+fӳ_喙&oVa#ԎZjjMPݒǒݧn][Z [fPJ~uT.S_.Z.Ē(=G&\_UQ3~VzVStJp$SwO]iV4S4P}疋Mc[EeZɌjkhP9U=t՞ڳBcj튭kݳ}߱ڝTwPvM,6 5lrh_1 S*Fq:e|NmU΂,Zb%j)ekjlSV\]*P^dM.{-s[07skܵZ97{rM3\Oۢn[o2$jZzzaڅc;N]T_o\݂HwE_z_JQ%zm~mVlVl[XMy}NmEvo_q\rVz^줃-J1W0+V9Zel)&sk+VK>SvL;-Ԧ]Ųw.ZMiw۽OM^vC*ܱ_ ͿV|*uf^uF[4GT9Ȝ뛝z%+FVGlr;MOiwosZn kn:7Wwԯ[;ar,2{oj5զ%&?YL.7lg(ծUju;${mC3[Xoڭz9mfjnO[{}7aMKIs cU*)jGMIrU鼚37KKVY-4c^*JV٦IMʥvCrR4ܫZr>bjnE*cb50,[)͚Q5 MVjW #nGK^ojAˊ_Ҡvn]k5Geī]nï;݊`ɪ|t瓻vŴ5tK)M-I4b[ZYi% T[%+6~sFSWŢeִjz-Wn], tz)5EK-\[.Oj w┋薜Rp[Vm8ݎ,>+xDGPAV̖ҷciv5$M}Jw+Rki=`Kk{r4ۣՕkLSP{~qVԶ*vk&Y[~\KhuWD޷rmL @H._>J٪̩r=OnY:SYyMr!5kUP$~wEWlu [IrOnBC/}]B @ hqzA7! Pܒ_P  `b[^Df+{P*֘dTe9UzlonW<*vQŚMڙm梳6]̮W&YqZ,*Ҫ]x.lXLvGdWTz4kgm,5QK㪖Q3 z!܎ؤFp%]2L+~m WSP4UU^s[VIvGeݮӎ]J*lΘ7շt4-FWjnXrgVNtk$՚W{تjGmY{YR\^)-Q3+\YeH܊`]5i6zBU.GJREL.w=-4\kWKx}UmEYZ(NӪ|}fIblط*bIJ݆(֛5o+%Z[[79RSj܂Q g}bnVٽ܂S.j+Wݨ[w߬WYæoϫ*vrgS.VhB/eŨIJZSiB) crf z5Eg9_V].j.X^]k>ARm~e%Ѥժ A3ڶ5OuJkVUkK&R؈rn7_1oW 'WC "(/π a;26E\D/ʱŲm~ٯivM[ss:hzcn ܩH%`<_kj鸆[P^S(*/u3NAkkEߩu*Wk)%/h=iŪVOE]BIqǨs̚9]fn+-%B+ܮ[RJ)<=rl*}*36E, Mo[jnu']ZVʽVEYʂ"5&Ocw]Q;cj"v vK̊-UU3Qג}TWEkbVnM[npcE-ZZ˽tkn6wnwLV.Qk%H2*Sj\UBI7{5o q5YZ}D[bq͎_=>]RC-UkM[Uث2{멂l'ȝh|_U r!oebdרJ*Ul Ы~szStP9ǴvĪͣ z5w:n2u"mRvZRq:Ue oIj{wڕmS2Gj=qj1V XjdrNג<)y=czn+^ u.N[,57Y ^յzAŞ7: %!+^Xj="Y.MQͬEi5I(+nG_gLR()wV=>E5벨J^Uv뒉EYj)..zEp ^w~(b EPL[ MF ~K[RK.G:5ьfiuuNybW-I tGf5nGٍfӖoyks YkȵjGz=CIfljx}bβW.ܻMﵥT}^i$hsګ$^M, q3 %ﳻUX!u3Wb+L33b7T&b'hoW YجR[lj5M ŬWnk7jb]ԾUњkLAջjr]5fSV*uJ]j-őٯ]jU-1t%W7Z0GP[V/H`W YqZǰR"̄.@ ge:Ö(,]kY]2=Upz-9RI.nYU>%SP")$I:-ħm|qJ^*^I6n ?G*V'yTcjTQ엖ɬjKu[mX&E-:uG &Y!S:_`tK/q!Y\~AQoW"!(vKoHs$Ildz.H>nm)NIt=kfҋ[r,[MncՑՎ\'sK\RJׄg)ʊvSTUeY8~rAl6$LIcZ^ۋ=ke\6[$rPw$Xv%n얭;̆쓽n0TCRí~ر|Q9{Q4 A5:~*~Iebӫ~i'8;"ʔd^EvS:f \XYm̎*%>tIk}E-+MùWE4\yX EYo%U&k:u1rgm~Sz^KۓaMI˖M*v(]}5[f녊k[3bj((_ՔڕaW*^aگL݊m`~iuŪb_,Ta{Mf՘:[4kn5͔j*[i5sWoZ}ESZN? ol'%h~i!:H:%Yo]Ӿ:fSӳ{v2ؼm>QjvUt5`AoK2D^ZMȭkm]Q4RlxdF`(hn oA `&݉ܓmVzEH(|zXoY]EGP۝*h*nCEfmO#*5nn6tblL눲b˒0e%Z -$Y6L-蒦\Ū7Kp:j qb2., ݑrxZCw<5,U-U"OR[n|]iR'ʖxIae+brZ/$]<x Y$=ݹjaڛն޳m,&iK[ovKQHgo~s*.ԤkvZ݂WnOg<R\EGi~{ Ijow^p-]RE+U xB)IUi͆_ OѮESvo$j_zJz]f=/yjxJYR{2[lݮ=%s:czbRpܤ͎ԹӫvgU5`ieD<):EqڽS)ՋrhUݎIzUֿUūwʂ_[,2Rlń -b~w_+_0"aI`)4t5'sڑז}Jg57Ox>iU*uM,9:۹ BEGcvUsn F׵kW]ʶvQ3TfjҪ^խ +\JlmoeAd/]_.^?FһnU$ץس$So$fmSvG~(.Wzx[SD-zcVc6lQ;f,(NTKXK'v+EQd_(dG%XrU.<_ҊگެU5UCS=i.sZ*vJݑUъn5ԎTƊXmM28p\.;]U[ͧS$Q)Vv_QĚ\:JoYtK}%]S {j's;6vZQ7ኽ6]-nxrW+SlDOk{ٷvk X۵Z^ȢNǓ)VVv%Gt\z9KM"׹~ͮJdujʒ㨒:jSUPkWrvl׋GZWS:[kվ_'wZ#xuSz]j"b*%jW9ͺ 3V0x Wєn5Y65,ker-N*TH @ zA[]o CPɴG 2QG紩ҹC \#UfMdWy}lRUU*ԛtqUKRw)JZqMۨ8ݪ^w WܒEeV*͒Y6wʄVӯ]kdU+T5 s ~.hze:pDYW7j/_4HE-Zd1FU̪zC4*e޲wE,2^`u4R_v AjBVzQq=k5~rϣ7nlŊ{Eel9Stϥwn3,א[oQZV3DQؔꍟ4&i=aEc~T vՒSWJ_t=- SnzUr E+v1V:4W[\ gGj=lKjѫLFZ:߯Eհzw:H85fQW|ו}bKTVqݸq]u6Sm(+IWE%;vgfUn Z*%g ǖdWZ*[oy+bPtUTڮ\$2VWvK-KnսWk]TJrݯվVP1fbWC{hf j0 2V2_-tFOۚU]闋%0Fڥr]ֺ(NG+\.](*Z1<bVhӮi5k^gصw;Z1w}Y((RT&C~U0ݩU\Z~E(XiAbo E~"_8 aXSVR-ܭ oKAjuj+ jjU=AvatjV6ʪ ]flZ/cvdE :\jn_̮l̎r͖I&m=ֵvc늞X#ܢb'U總UժM enU;mɯLE:E'FmFkFMuYz7 5PvoE]ow0 !I')ᡎ*L{xZk~,U\}~^ߦ U TNөurnѯ-P,Ӣkc]E0rE6 QZO%W/۝T{uFG嗚,)>BuAf|˭6KK*WuYEr*RWez;UtfExYXx^jrY4SՊXTlQSx%*{wjC2MC&u^-v~GzVE/XNͭWʮ nMi Wզ^uf4rŴgbUk\-͞fY]neN[GTgVZ^zfI/zE7մI*9mW_f]PPj|,-E ՌwZIx5é_-g1}ϑ+@>@Q\l]%rC֙- b(5 c|tao,/[ޫO<٤^w(zI @~_0~ïI w_Pahi88!a)Rѫ}4ٕ>Uf~,r SYe[,i 1}:]zk2%jGvc5uE\Rqj8R+B[(#Y̡nӬ  " K[_EGʭS,\];oݒ+zC&jVK؊|nݰiw ^֬.L.L1אůp$+Ŗ"nʞ^hEub\6~PE7"mm黄+fܭ5Ur_!nS^G;&Iv܎`Y+C+]vƱUzaՂgɥeZbQbU."Vsy6b:YrgwjSEQ/< ;ųTUIrr|JbU[ ̲S('[ZU{jfM.ix˴b-v,iU4ؕu1Znt`i,uwG}$mv+bUk&j+hoy/,Oj֚*(xjiΖWjQnRj^t&jN]hdSߧ}Ӯ5߯ ZzwTDc -tdԐf7-Xf\WBiVIӦYVmNeJ%K6n[v42#@PE[vKfŐ˕U,T+Yt e'Vؖ4'K~4|ݧ국fZGWmQnxsf^ꤞ17vT`guA/Hn0"\+~I$[:  OEzݘMתD, uZyQ &}_p*5h6CMjj*{;j]n]oɕvuaib40jݩ rŕvlU[*IIrN3+r- _9b+SZ9$~g:3LI) |Ҥ ~,pu{]gskg6VWr {ϫݎ޴XzC.v+Rתe\3b]Yzv$O/(bvVz[vRˎfڧwO\c)~a~4Ij+˭nk8)$S xF[ޘo5)clPf)[FKeKD'B%Hy=_mbϰjٰvr~/ %XBzFi|~xZA1}nET;N:QLUTc{6mQ՞ىZp' zot+zey%5ܪuO$TEuX~^m, S L~)7.v8Xfhʒ%(T)lzڮ:& L9cnINOZkbK,,(WTpR,4[erJFq{F_u*ɔz= S~C/zA,.8^ aW Ћi hjzq ;%nd*ڼ6VUԑ9 p_Ӑծ 7VR.q}57b"t<4Wr=2Utlr;V1TG*ڴ>S6DQ*6 K:LlU66U,wT`4="$y~T~A Zw\t˸{%kyZLeD-YJWΦٖv[2ATRJS/׫M -wڥ_/;zϒ&*ZP%An::گ~Erliu[.vnnk*XwŞa[m%dϰJW5 ֳ yNuf2}㊭򸭪Z.%Wkhu$lT*dQ.ܺSfœZH;eJON;j:EudrPUeZh8\Mu<ߨ /+[vKGѱeuFEt&,3~s=ӥf^Rjm6w[t$+ wrjGb~Sa(x,ݶ\i,) + !Y]srISGOkVM+ՖJRkfb9jdXוLXŮmMm){awViûYJZ^mFQŎ;:VjoDJ\>Fp]XKV{bl5T ;,f^K.z\tkM#+Ma-%ZWV cYNͮf ~kns©Xݞi@@~v^^  $7 ! na(!r%Ճ_Q fZU\v,hVԹq)9gJ"BS6nuܢ!鍧T+hjW.IJ2 _Z.$UtTaڵ޴kh͂X-DWޯN'ժ5rޕJ0~'=`V$bW^VrJ}w=nHFZۖ>ˆRkKeVKb]bY9B$إj9bKe5!6. eڕ^+k6S0]i=_ozsrQ}o/v;:\, v'*[&(:v4v-Sڭ٪ZmU2ё4fUknEm}fKJi^:mg(^ES zMz[5הꍟ^\z*㗤lHvWl$fbE[4(GJ z5nKv3jO-kr*sԴ~K SORS SiJƒb^b\3DEեVPtڭ!ĭ3P֌k^-/ ^nYbQ{]dQ\lU+"\jmU5CvKnsoٵ&_fxjm5S$A mVl ͎VGmBV;PV-zck8uMKEm)[tm8n[Ү,. j7^gTŒ!,I>*D*fd]3aIe!{VA=o(Rŕlrol8+ښ9uTszEmWN*3,u/vk=.Iv]QԾ0rKyVTZUvI4bYUV,V:nI'׋vF^+i MBQC=[=M6kRc6mNR_읖q \Vmzɕ:=:5CX.^gGF5)zO4և; DV7_o=+zA(z031p_87kazZgEhvn5Ymz]iMIMǖ'u;(gH"UNB R^ѤV0u`ԕj`+2-mI8ԪZlڊߎS <8mXd#(vnM3 n%O.V~Nv)rQ}/`V@X!EI R Xٲz7rh~挒^,덆W. vStb%,j֬nG[Y.eVZXV{Y_es׌) EJZɂ^VKvru̞IPsbdv5OLׯ9EWzmÚO!ív2RqMһNOt襷hԲΫ3En%Veכ ֐B  Dg^ zC] ^0rfn ɥ5}y 1ZSTi(~b6]WT }kaYFo 2<T\'kzͫQ UBI*M}ߨ(4wTJtvE%k;UJ*QBiϲ ,Zo{^S+yYV*lˮWT/WfƞSJZ#iʲkr1]fQ. {|_(msӚRE*vAtW-קd͒n$ZmUͨ-5ۅZ;REVsU[krc6r].rjAWUl7V+vBmU\VԢ~ޞrcTzlz͢XKCĮ(ZEElN֥I^&;WV\wjgXKvi1=ڝbRU0vV ]×rːbW.ZPQ*F䈒1 w6[Tz~XZsFo{Upk[nAW #U٫)ͱjV%kMU)w)֦Ɋdl YR~Sy^c\4~MjRZ^]+0Mܲ%TbENHzG*~pW^P \WvUmt`( pb0)VC,7=AZlF[RSaKZsVMP/*=zޙ Mrr䵖j߶k j0WtwסsdwƟP֚-nM;c j*`PpԚYo*%v^q%R㴚Rכř)z4/nMs$g^EV8ѩz`~ Gb+zA bǯr#*ff2ʰŻpB;~tWsJE' j>>T^F]jtaDKPdu(bZO,`2-U]v(ln+ c6~M,0TTWEј"׬Z/kE>JEt4MҼ6&nVLNk~Q9ͮMV{P躔۽bK7\, Iznyi9>pۂ^*ĊXNMP:mwzvVv"uYxSUejA(P.)W=zG_Ls\4jMvի/W5ͯlZUvfQ/%c=A]>_9{^-ْY'VFU,u%qen+c.XtjS۫7+,闻"[mkAP9si}B[*zmrؤ5n_)6DLSE']۹_qkRc+w{]Ǖ%L*FA}[Lbu"\2f [[pybۭF3z!,uw{~ 3x ^d ~OoI^*ʲNj[ԋf%Qkz+Z$B9_59ikcխfGFM]Z5`\XpfT'b534X-/WT++5mb\g$rc^VO-=`+ ů(z9zrAxu';vSv;N(}Vʕ~ZEOe4EQea8~H@ ѹr_b7 E_^ _\O,@IFּ2Ga-wmBٯ5aT.uu(ScdHܪ#I{jNyx*9 ]!9xzOl7kZcgu>S0%$2G\R2:ܫצkӛV;Oofc5U2d~oy^AņܼzT˭&t)bo]OIz*FehNEiflniz~OSs{:C܎]JZ1 Mmu=T$Y.Lӻ]/fbzMvۻDӯhvsUjV (&VmHP$.Tm K+j&NWv Wa:^pԻ"Q8 vӱZjgj]E$b\liYY4[:ɮMt[TU=,z5ӮnX7~9[/ZOo8/m\Zj0Q׉2aR\ow4b4UCce*JG؛~u:2T3 bbW{lڵNNK+VK/i_]JUr@]\l e2/!.lSj!T;x^YY|L0l>QUFpfK_ڽ⣖SiuI-\0!s "aW"vǰKܑ|Cpd0Q'S4fM,]S{_}Mf͐hUySy_le.TWӳ5n)%sBj;+nvA1-ɬn[.|nɱbuq(UVUhzemNiܴb$ v.齦:JKMj%]j3QT2LĄU _+~ 5)GUI$Q,ּޯ50G A0.E(v^[=h\-J]`7 Ak/w/L=@NF;ۮX>ء4w/S$A2ʳ8*ɽ"۽ݯ|v`8zwW7AQPDY@l, !$U[WPXu>]%vE:6J_vd.[N&\^:TZUIԖkVA6tmZөQ oK.lؒrk#E^㮹fGy+zN .s"~YTg"rE~D%_0n}]䶟١jEw9-2sb5Ͷ$|s54M klՆGEP'{n`uGs5Y4nA>ǐzݖ^mX^O+% S,U(H,mhZֳJNO1{%v\k^]+[qVefWgŬh%-6Dɳ:Ze_1Mq5jI,5>+̎:#=UNiFm׮fGWIմmM`TnZ)VZEP 7VfIm3ZWZ{YbK_,{$V*Z^S%V%E65&-I̖\ryRI7{b- ^nV+np]zOg-0.s%ɯ>/ZIn^jöYm˅6T)ݖ_6 ._j͔,VҪ=I46y;RO"UX͆,4r֭|j8'jf\0~ǼK6s6ͧښ*u؍=KjZe>Y~u\BJvXzW˪vJ~wjNm>-jرjf+d6(ّb WO]ܮ/jb*nÑuZ_JGApN*[-K%fzA|U.9L$:oIY$W+H^ԪN,RZ~Ez4jISPqu5& *kdhrY$#nxB[i]N,m~Gp4jluKVjN4}nro2M^]/9©uUĶSrT.S Sjvg I&تޮEزGm~XWK.锽jŖdÛ[0)j߻% \nLh]]-~׋gmZU̢٘*K+m8%ϒyRޭvPʍSRZs;I.^\ur^Ůˍj5zUnW,`z3}b=Ul{"ndKf%Wj]-tlCЋ?Iն^ .Sbm1Z-XjI{LXrׯ5MH__݊贜n_j=sʪ뒨v-Sn륞$jݪQܳawAZǒ- " Wb _WCrEñlw+'qRi(zȅf_UU1E,[twZE)^4.QTDeSiX:G('UIۦLO^C:jCꭚ(U~Ǿku{Z=]ٜߔ[ڬ{4[}zMg. n׵~ጆ_KtIj7˅AIF{+wĮ(!]XfՃUxZI{O*M5ܒWtNu{bp5kz7F$n1eI6G6;oj},JBr3c3]65͛*D_W:7y Պ}[]n\vg;ݲojYkCk)sY֒ WP<'i V6[;nV~.2*G,fe]6flX:V/Zfj^Ao4 R;0v]~Im!5 j+7ZeӍJ\k*1bE&W+z _%^o(vG [B@а,] v^Ipc:fz^0k*M*˭Mm^1־Uۗzժl+3wʄk.[i]:M켒]N/JUc $ j$4VԺ-,hYf* rWg vMvo׬*]U:%p4RmWĮ-k,\5mJk[LEb߆$Kru~i7 ܑ^L-a,_lk[Y亩lwnY,7 n#jgcueY%d&-uj[bYMZl2dvе͂ ԯ3NYonCwKW[dm-&S[:Vq]fSb(|B -GոR|e 9~RbjgБT^Uƚ,;fk J,2ܪ,RQweI5 I67f=ڨ~[e%ݪT+ab+-XlvmzK؞׻nim'+ӯ6t-Z#Sw O;,vCDf,V+Vyv.֑[WY-u0 Lz#9,dbk2rY>qDz{rtږ []gGYplJgeU2֩bzbj+y:'[ۻcUQ5j;%KP.yJ]aMݯ"s=^rLAT=_Ԕ^ +p՜b̞ah]iۓ S*i:=%]_/+Jemwq[Nɉ Ԡiv~ AzM a I Hh=࡜gf,ҬbG'Uљ{FiLEUoJq,Zj6+v[VEB)E^mfJ4%KůijQ1JYAt=RnP z1 Y{1ZM]ڢNb1.[/- ~Ki&9V|LmvV]s>2u+jڳKe#"S+֙ઍbĖl]qT˽M؞v\U+zdrdϮ$=bV Ҙ:+nQ;JӪ.o8]\vK"I6zK-=k6Qb{0hДJ, Zh%EtˆXva]h( nװ驪_m)rӳ:v[]PRJOAoZ E˲ZRk͚֗[_IMS*JGj6QҫMr8H۳[a7ff.8Y0TS+vMVMՂr̭9[G*Ԛ*jtʮm MFgT*>ٮvL^Icz;fQ%5%c7V֎SX1wHXxJBͭNcqV65$8>kMhV,vة)d="6zMӋmY6fuUZ ګ+FQa {eKji{0+.A*=U]Ŧ[ZY2F_j7KWh ^R;_nV5܍P5NE+zrS꥞[-+j ׺zUz=!7l!Ʈ~%-$\T*V($ӔK%/u:p- ~#zI]7䊣83x `Y칢q Ps1(w[+*ruNR,6S6gj|J*Z{ ^]zݦԟN)^[>`lrҕǭZ"Z.Cv~nEx$fO4gNEjs;k:sBj ~1jUd>A5=fS1d3{MّfZznj)f<%Zu hT>!e<>kr9~[-]Jd1dʬQWT/¦VE'HnWj-/Y$IW4f+f5,{ۭxf)+l%9%IkvVbԽV F峺iv8bQpMW[5UmIf%"ܭlfW(5V CrkvK ڶ;G-z^jyVdTޖfѫu܎eo;>/JC"Vie<.rW֧FO/ܝU+_JlRfT3cSۚk]lSv5%hzGۅzlb%*]Vb~{絤Jl2ݦW* JGM$vL*MpOG2jQŲ緪ZIPdIl~f6 W;60:?tK0z +z˽HfW ]i^aVYj!Z>~b\psB://EKmbuINS{R Ua3Ǝ)}.اּJ8vCjkrQnCkr՞7<nU:iFeŠɒ̛͹K;jTβZvL0"*vk DTu+6z\ԭNO UPث G.~]Rv5o^I۪~Yj~] `{㨶ZnKv0;r{ЮdY*5QfWWr0 f X^w7 xjJ1:uj)xHvMuZ3D6r%Wxo^,nٹ$Q|lE95F-7skYӪ^KoF'UڧxaUjƊTn*O)[ r] ĎuJ )zf]VU`j4*ontO,W~[zYZzjziY2IڄC2%dKvJ*rk^O0-X- rIVXni0nT+ZkbŎVV8W͢5pKT2ݖt{~U[_kf-Q+Y^NNN_DmbUoj-bM bˮ+rlUV]m;R2nEofijMuumj%h5Ċ SiwVrT,9jNrtYj7dovkwW1 S ~TbَYrRP~i+hF)&(mQ6z/jgiT{{vQl^H^V+h_ \A+Goc[A~h0ˊ\CizZ)6kb(_pDuUXnzj6wnm-S횗KUwZvnmָ=^K*xvP^-ZCћrϒ͚Α=^dZ1']kf%U\]TF0PlWn[P]&{RZ5 kCYDC5 ec;Zk7I0үP!vUh ')Rܪ^gQ*ZS۝*FQz G,Ud_'hEk,ݖ x%I~ZU;ͳzglfG}v G<.\ljU/J;KJ[͟,VM5u7;n^av4'B-.<[:k.vr  6+z_o+\.8~C-a~Crl @[uF ֘zTrK [hvpEeBՈzŶsTSjJUUm.}Jj jC?ZдR^vt0[ݒخ=Wtfmm=ߨݪY]%e7}ҖԬ٥T6ZKS}ZvE^4\K6>,̏P/{h Ro+be64)fiկ%ڦ,EP͖Jcٯ- _pܖ]햫b$HT[jWUgw͖jZo5nM눕4څ%VnZoMy9Yn ^/ ckj!̾ ~kf+,a*bEa~Cov.:EdQ(ȕ~SiWl֔b-Զ],Ul [^WH}ΣnS&Nnmh~v+m5V]]W5 l)]a軅5Jm}^΂<ɦԵ0mؖk &:Sz)V̲Zv~G2-:;k75^ntzr*OiQˑŊѫ5t()/r_oa#Y  z۔mvMyۭAZ>lM>ЯeYQlN)RS[Hk%bM]/ɻwJК^,[޳\ɭܶE%vN# e="JnhܖņUzAZ ٳ лX+^.{%MKbK8%#U ҷh5}*7rˣlT5mEk6URӒV+(~ût)n>%(ͯ,[FIٍ+-_i'NiqeҤ'rc6[:GI-)<̺Nk+nJjfKlֻfX,It)!$ͮSP5n544E_ݢ^ .sgX7 mvY8eHMP$gT^-?+DkWzbyb\Qfa/Jz8nЭՑ=*w*tzZ{OVAj^CJZ^[$פt*vAjfCR],5EJsv.8]ntVEvd^1`5pT"+繒!JZMrClCJԭռFg+y+zY 7YVhIۓvҵi4]n7FӱRWeYm[ Cv`UnMne6K,wSf},[sk6f!VSPn\q˽J/ Gh:Vg{jU.&0lOk9gVM+-ϴ MRV\xf{-ÑrVZM$SۍgVKQnI\~A !<?PP^ıˢkPzK_t EYs7vmE'+gcl8]o| hɦwcDVvG2VIlw6Rj ̂vvҭ JRIn0w! nߔZǮ6IwͶp|TKP).wӯ:rw"7`64/zѭر ЩպPu*]jw{Bqe) WLi)R4ԦxZQj`X~ 2ˑ$Y 7$UYlJcTWZΒoYqWتzG/buS+VïJ# *K,+]^ͮ(+|ۊgh_[U4ni6Jg4bW,W]*ܝwk=bj+5͑T;)ؒ{(%2~M]IvD] =^5=_+]fxmV[ ˯]Sd74kh%wkn.ZݾԦ&ēݮ;:ob[;5kn  @' bWE߮[+h(&β JZ$[MoyFqv=v*f3euv$4v.JkFi_0nSu `>84dRYվeg6vcۚn*_2{\ϯr& )RK0[.%Yn-TWP\Ҫ4^kG%, zUպ_U4O.ij嗫Fg:/W,j4eխl"jMٹMx; ̱XUdtZg7_Ħd(V jNk]2qX(z+eו]b_MWle8${fU= _vo(aW߱+~ðUA@DEb&T Zcߔ0UaBC8wzE$Sk=鬼~jVڱyb_[J V]2q-:HhZNr%[tJ,WjvݷͲؓl^lnQqIPz[CnXF=BOWX[6liNjSMՊnzZ$F[KrtͱRihv[UJ.GljB/{/w.㋲l˦vmں|DfۭuWKJr V˪K5YpLA ӗ,R Q۪KFKʕ5V_֚wNoK5}թbVEp {.y>R+N+]5My~1d^UR[ƫm\4[d#ڕ5ljvW`t+ C6_3M{c!zrFR-HݞlġVOKlUCxRoEa-4U%ZGWK:+׭J4+MPxBj(j#ufٍP{rcV6&t7]R+s_MinOkIQ[6ݩ+g˪dj+Y2jtf9ļZNbp*zAplۭ}կzl5}jW7HRNQqMYP6aԜe\"WtYRY.5zhزibKS 6p{^I$]J`w-h5U&T0MK*wkFR=k]z%"k=_B+X0n-F >,,^Z _ `W 7 E Rt} tBlxUNijksXKrrm1ԖVoEU JXfv4u\j;NUֵ3e^_-va2&A?+R-It+(uzw^WMɵ)7+Y*mWj^Q b^*CGo Ih:Uc6Rv[=b+U;͵MjvA&e8R\ktڧ4٩(R,mӑht|+ھXY$Gf#/#ܬ]Ei3F3r"JUz֨WiaGn 'T=ŭszU(~|jz4&y IK-V k>!(+#*,z%`Ӳ[lkvɮkz$A~O6f8+X_m&4VhM'j- Rfyڊ[aQ{!ح ˭5]Q)VIP[n]~M6ƚEq5ZnoSbئfl v`}خ6|~n9fUh2ڴKnJXb-jŔ9ԖP /wNqZoJEp{</m]*JZ]co|jŜvUfRkXBOUSRct~I~|]uW{ŶTZ֝rW0~`$qN/ .ݚ1*35[`=uN*-Ps){n슢9Cg ؒEC'3IQz6k՚-E8je~_+&t&\b]^߮~ A U%P q])~+vMrI]:^P^[Y]vuAũvW! tgޅU2**RvS[Rhv G5r9vOT[kUQ0kԾ [J_UY{O'Ym˫[I|livTn+{ӳfeow ZrWb]-7>j\dF)vG7K~^ 3Vkv?c"/RU$=j ]Y-vjw[4(a-쥂QoHVa8b.ymzeD5.i^8պ'߮mw*zmuvjީ+Mai J/Jr,uYc/-W~Ie"6 uX ZЌ߸+vݯvڞfzYrǑ]n0Lɻ -C!5E-JO:*JUYPnJbi_nS-VgLbvYU[Ҕ~-T8^ zHUۂ* nb' x~Z%mh[>jhԹ)KJS*nPzp;nkUknZ-E/eW8mMbqJY%woRl=]J+oՋSu;eK]/Ԅ^ Zj}GTTo ^[LE%!t%2XvE0삡,/zEP!8zCR$BP%<*W\a-rduG%kw]meEu[]b7ăhrUJvStsW e>c˲`oyNi7j,Q_M%wMi> UYtfv\n,TNWL*-"=fi1M'>ZVM#ZAmVՕ$J\_f,*xն%":$*$Q^%4[]4EGjû )irztT ~tk;H75UhV,K* WJՎ^2G}k%k:Lw (\vJdՉ+Qb %hz+V[S{Wpkڲf\VBC/ nUzUۑla&FiEՓ\IzSkNpwf[izkT7tqn=/u V+JUxVAxZZ^ NE[),oo\%խlIzms)_ll`5*bk8Koܵt(\/ ٔvkwܚW1njQKi:G[ntǴ͏8VG.^K^yܒ{me#f2QI~T&V݂^궚ZIgdJZkeRCs˅u܆v,TzVokR*Vw9nuQ5RjJ7zG3_]ۻjM6)UAoqtfXN$^dhVP﷊rnr{"^ ` xyzCޯ~E$`%Cd!@@ \乩S輮Z-sz<Ջ!7\z^/o2bi\6 G Fan)SW`W+f϶ju7jm˂4הZл-Ud#XYի횧WWִ56"fv}tK+*nSi] )zSNQ['6uHUqvUjmi~/ni-_EK6{ݒVJ/{M5RJ^"T /~1USUD{^sI7iԚM\̪dD]pzԩjX|Ye[si\\qWlJ/GZOm:͒/+^t5aվT/dGñZ:rN\4{MmnnE-v> rXs(m27tr'hl9 U.U{ޯy.oJ n*VYRF)=xB{jOЊiZ>ל빶]nVjnvUm-E2n >\`-dvӷP|e-n3HlueUA+~[Wӳ^od#YP=Y:*YHOSrzJRDtՊY.6fjsG(U_Z٬E(MjcUD^2j"7 2r/\&vlfɯJY#%Z h䛞]ҬN݂l6z_$lRm*ndy"`߬ԑ̂& Q] z. _n(zCbIʐ`+.l^Y}WZ).&ZOV-[9ݎ, fzgb6_,W.[*0:{|e(ҠȚ:^4DM[̖hUK/t+e#m]2uv%&XӜ:sVgdZ^]za{~kUBEn[bd̕4r.,ޭkJ[xVznwFMh]Wi>sfi pJ \/ -YvZbO2Iݦt4{Cov>Y%^M/8r vˮ̂NEChhb^=TZfnբ֑E *)]ՎB$Q,临2Ծ'{[XM%=VWl de_DgMKt/͢9v9%*tz'k{UbtrrCUn֊TrIڛ(FW+Z-6},IJnv_ azՒޯ wYhMք>B%zۅ+6֬M{v4R)Ll e Swݖ"bEoT# eUfdRQlŖ^w*lC.nLW+ZpkVk۰$]*PFcl r]qL+zYg7A^V]rUe/^/-&;Smv[++O;f]k~5,Q 5uvWHfQ2bU!ϥ\WVͭRksfiQjCن%ӕRc (yZk̮+6Q"կv+~C"K^Ws'# q Y3!:U:R$7z]j6Z_5dߑTItBl+;"VBլsɆZuꈢ.:}U4[SJ\uYFGժ!'L~/ u*PL+v "$Q)H^n`7\a$wt`wczpGIunEz~u fE"Ql7j%`uknnkհ[:_XZfܞgSj[- }RSbl 70~+AԦ]oE8LEfUnZrvjZTsܦ)$q|Jִ~ZjOz>[fClr_5 Őw݂nkVUٝTjjhw3KmVSG墳ũo+O& Ŋ՚ܭ{Zn-ͦX\IdU&KS6+TJrgHNhzڬkRA-: n!yRd]fUJM*=7^o9h߯wDCWU&橕Um˒(Xݚ%QϭଭDnܡ)WEV+jmTFMr0>k5ߪ _-~ì,bת6mUn7K58^#Yfq;ҮJ^_/^3~3I%EjKbavmk%MuuXmK$T&WdinU|];;:Y]sSl( z"!2yW=\NjhQFC|X-NԀ  ť^"^w`“`r/P'=mQlWZfYr- ߰wU4[]*bwTߐ[`5{fpˮyzm{-9[>].Vˑ&6t*hJM[+ձթ7:}\nuZ/5I2vvr)rx *bUݪ34sݞNכڮK 6Fa}nєx tkԑ QUN2zGQ/Hr.LU-w4e*r4*c]JKms˭6z_ϱo`L%ckWQJž\˚eݖRUZZKmrn]XP{JݪVbk3ZSlG{6CnvTezB[,U-m3~ +Q~[~E/ۭg/KwM~EbuiSܦ9JIp(N,w\d5&>/r QVNk5ݮi-%EJ)*rn'LVjV*;vNr"ڜ)Rv(k|NGz{r6rm~) /פ~rmMiUm^y}f`wj=^t2d\lɩŪ.ܮ(K%ecrUU ~[:e^2J-vή,55bߐbVWK&=dV`9{ZY+'suYҪ%qj5\4vw\6lX4ߑ}؎Xr hԛifaɽfkNԤNOmĮVznqx!"mvA;zW,!ű+ޱ< 0C6ѣJuʡ!?5ѮmC*tX=g^ ZN ?_iQjk4=ӮՆWv*,b+2Zj:oV&E}қk~6nOWD92ZIŪT0b,*jhQ1 ~ٯTY,yeK,?Ml+b夗^Aw=R6 GL٬iv}AԴVqLl )۾z]^%ɚ^fɖ%yr17uT~Zo؅rTlf,kKV$AKm;zr_jTc*x9 vYXvZD ZdQ0G9vEܞXBi]r~5$'؍B;Yv-m:iQ=+hR I"qO].Ck=W3:N#[VdgXqFnQjq5RQ3ש}vկUY!zŹi[WAUG)a r4 /*m+:ͯ)/]RbG1U5ʵN.YM4Og6;[Tq{RJ,KSb_aB;A%biR fN.xO9#eJXzQvWˎVEUXxFE{-Q$UM})b:zWD_ !_MZYfO8MwKծG@̒Q%}s^;6aXr9Uh7.%_eI6=Գ{Ś5^g5-bQnmaۍBy})\b  `AzGC7E\WXғ ޺ҥ /)67;JArr4 Z2=nv~B7*ɎtvB:)˨YS\jNTY JFXe(R ^zY;+]K_sVڒLEv/MC{.8(7z鸱-Fo6zﵺk*%X7_e+,voLܮ굪T+e I,=Gw+f/[u.4mbe*M/Ujϔ_]4JUMkۯvMnU\_\Nct߭VYQ ruŪ2E^k%ZՊ^ͪ7Vr4ezLCޮ6{:cju~Ӫ>܎{V١(r٭F˱v^W+-YM˓V-ZG'te.4%ݳTۭm3ߪLVrǪXi{%kۚ-b{ot(ȵKgȂpe˭'HӫB-yUS;eK|Ԟkќ!DjCP½;,í6R%ve-}rS%I m5ODCs:ߩZnDړ .v۳ '~| v[v̦]KrcUE2k"2^jZ(R/ MP^Urm՚Tzl[Mr\PӋ%Kh-%׫AŶV&AUEQ1[j]_)Kz7c@0E($&.~eEiʗ`+Lh6FG4ܿMht7I4VRk4_-:*i[3zW*tN\| SҤAZ6QZ_=9U+$׊BE'>m IY[OZ>A*[Un n8XS hl +.wDo hz&z[ڂykVl![&5v!6uر[e2lb rQ*☥#3ǯ YZAv4Tk͊afZfMh5´ѭՎ՞aw̙'HR>[+nK7ԽNr Vdݰ*CVԾ|~nv%+vQnW,\6UmWmmUvɯiVoHrbC݂bDe[ojQRd1{Ezͩ˭V/rWj3վ Zb<+/7&;mæKtar8{ ߙj|t$G56(vWT c6]7ei}YWQ ˕Z3VmcNN&rs{-5zfr^3ݐLĎZW 4ڍ`Ulka nBYK-m=1{QimQR*X P"Emqy^Q#vMj2rU5!E_]`=Jbט4M(JH%m uN2Tp>j˵PR_+.AQl80,1gewlꑻbc[-Nr ~r\o~A&]+_5/ oV r';RJ.W(wbp58:MYBΧ{Uۺ<S r fw U}^ͦdKezjJͱ'"]ͶX5eŗIt%yR%ٵH|՚خ٬*]w{%vjKUC{c7fwX=ɮhF*Ջծ=mUnTh #uYd-UckI8bI]rG) A)oO_Ol՜~ɰ[^*-MnEI$MvZVW븝A _g9%fǹźW;R,\rnhk{+~_Nn9Vg**5OT{ʅQn\l[4$M*HZourCϪ^Vvi -[#[NKP땚zwMun[ '%TUزEC:5MKnܨQZ?#nS4;ݪS+{=%Rh{Jo R)͈zMr;ĢU6喦 /&u%m 3V$X}%UX.-a)1zQhc5bUi5WUɪhVjz Q7Ţ\+r떴F CefMJWsgGlٰ>5:oCŎ4ԣWk&7+M8gTQPu%Uo*6lS5hXt4lMx̊S-|(T>C WB-[Ԇ]պjgz֔2D zrWz߯ `;`Gp삤8v%xX_LKKbBmdZId wKZ_;fE嶣¨ۆe=6Z&,-ӺUg#6JGhx4HI%H5f2 5o\rX6;jwH^SfĆS:tpJ~n_,(fs)~Y@\̯vm+[bͥTWMl̶hr\)a,wJzSwap굪;jDZ۪3-.5cI>/d'5Ϸ`+#Zhx7SUF( rnTSb,Ԛ%z-[VYy͗(M/+V8yj[%VjgAXfOpVg#npSZ^[y+7lrꔙ6b v[%hRXT*\lɑ+5k#TacJ"WԚS ҴEuv$`Yvd\VgvtZvUk)5l2{n]]xNg;u) t,;s={!tj*ܞRUhvD}pjPwMD3g9=UUBޱro/_/7zknYnfɮaצjtW@%֥~GJ-oǰ;zY6DSk0oZZ+ ZVk kfˮ K\l5|J ܊^Wj: mgn(/tfӅ!)rӏk͞mjpDfԋeZ4:#ix|˨<4,Ղ4ԸfU)r 6MCJK5-LOݖl7Jc ~^0#\kz_PAPΘ 7=cK蘵m!^w(T*VA*7atFc\A>}8LJv=-}ZSotmD]nBU.-xz%OI]_s Z?pi6̲hR7N,_lJU5PCYSJɓڻ$KfHvk*zI/9jìnҚIju֔]W3jטv ݦ:R2LkVVCIBK8~Ö=-kZ[wœ5+vY.btWͫdDief:֦6XP͎iYeWnL荻$rt UZVkкlnVZv:[NrKwc+]i%\ C)NS~vé-QoU_ %UdޓvD͢b݂z~UrbYMw\zJv!.QtvfKU40n*fBՕY˳2𙵆Au ^RԲӪa*+Wqdo~6d6IkֽV2~{̧%hVjאEE3)i/zCҬLM|PkP,l43;*E2$a*\V-S,7^߱lrkKOioEML(7ZSVka^E9Mթ zO*͂mKYf(`JQn~.6\~K{u-vk`t+Ůmhz.$ϩq#eZM jInl5}^c|vk R@R,\+/k~AJ 3fX-rÙi^TblxV_UA@8_YQlVZ-uinlQ 'smcjCMiUezWi,:%bZնfޮRQ3Y]$KR:Ķ"5dže4Z0[njp^s nC]( jM>*׫E[ݱ4"P,lWm^1;~O;oCے=_TKgN%Sc4 [zUSUDFlT~UM Zi,gK ȭ^UT&[V^S1.Ǖ](9ɱz}0nj+\%*<y~!ԯ8N,n'tS+^ǫ\++ZqMlJMl_6˚V+M+rA%\ d/,W$Eu~4M'hY5۶jn(eוZ۲(=X~q:l.[>6ku1Z*WJڥBAlyZEKՎJ^`Wǧ)Gw+uvW^V Q4n \x- <%nRaJYu-qH- eKXoad֫|ޮ(rZզa#g2ݒ);hSDSJ5=AՂYq~,5VZrzL~E WT0 m;#W'LδiPi, vJK0uJ)6=խnZn^RL26TrCQx̀YV_;vAP_n(_ 7 G<?g-紝I>;uK+$fЄzɪ;a嘔Y)~Sʮj|Gq"ֻ~Z~\ߐ)vzJK~e_[u"H@[T k1fT{,t"}lGM0+u;t G"Kt.[eUn:-\2U_ow;(W{jxkUJ~*F%ٕbWՎuPjoKrcNI]P5s;G/{~!XfEd%e6lFUng7FiyRRw]i6mΤkn_5MW+^i32Jz_yYjմml7꽟뵾fjRG)rFtUtKmS'6[M ŒT*oM%i酦d6>uvSQUp,G,{èv^cn79OjQUb3>m"K5m&I~n=lvX-CdzQe+| Jc*6mR_z% 04*X>߁P̢6<Ĺ Xz`RkԜ:% 5Cr|ajҢum)-!%+ahiE+mS^ivH2_*vՎn?ll5t{&߲U?[nV.m)&0E+Dn b=6TU+wRtaIfNtunȪ-_;}b G~a7~7$n~ J~嬳Y)UXAEQc*ņr&{BY+3[}P8tS -32rAjr[舢/bW*I-TVUgog[,}N!0 f_UފbT_4E2vf]%o{]o$sI9S:V%+≅z(Z.);:l8U虽Z칲0i~[K$|/UE=,Ŏ\TAJ5kESU:.3̊T2f^Rf_LZYՖ]i+W%(dgׄԙjiXro'wY͎w id_%*-Sfoxfne}H:噖׻ݲؙlvp?MeH$M=Y4{+wڽBMr4zqvv):Dnf16iޯ:MlEiPe.&M.GTiTת bk֛UM" /V펬w뵢ؔ+KMv`n.rjQJ[-ծ.6YG` L8r WVzժԼLŴA(YCnw/+ V4լjkQ[-=Q[&QͽW{զԾۯ j'9u͐Lෆ͗Ƚ${=Uv"UQgZ^%SqtJ~p fun'7lM-+3Zyբiy4Ǩj4{d`h@t &^nz W$j: )Hb4ݶ&4 Ekxc;삩QfK)n)PZT8VS6dY[ -XFӢm׭ɍٷaQtzT0Ks(ss:iFz ::W|n+Hdu ffQ/\zIk-eS8L\lEmumyܒ7%ST;}KjXŚE`̫(i<9~ghyU~حPn rnkS]mڢZǮfSb b-6BSiIZKfKivKsj9[Tk5˪뛪U1#WTNt.wJ-}.z$:fj ^,b_*j&̲V=Eu8$|fik4NeꚊI-ͷðnۦ^B8 XpZבŲrglSC'I0ۂ+D C>S_+gGo faennVsj6ni{&єnҴQ;ʮN-cͮ:DݖX-TbkFG WnQj)87 mJ^ET#]+)f vzYn}V z#I-rs8,v1U|Sv77ns~sKp]|@ZUʝ5vAiRAgZj |ԮYRΨKUT8GUMR=אn ô˘~\KJ+5t*:jh^:[J۫OqݪSϔKET"B vnAAoaޮ~;aw${h>…(nY=^Y25qXƺ6}F)巍Lx4˵ZS-+6pf ѢZ뫢5ni8^˼zcFo65C5SU6]̭q ̠j7U_jcꔽnKV.uK|xN@ 5ݯ w^C+wEL %Gyλ^[Mc7t3 Cese4IZ*MުhzS-P\qMKn)zKћ".O[bVv,KtY}>E Ab|zRV{^Iu4!){ܪZ(EEfnGS݂;.W:]2%Bm[_&iz%]~QVTȕY\GjE]j׭WlNg'$&b.p];U5!e^0vǩՊ(w9 bw0MGT^u=,*G)Z5)8WrEʢBfZX8fWjO.x5~e=KVծn C*UrfoK{DZĞ;jn)J^ԎRoڢhB\*֜^RճjE'.r[+9"jc$\l+w7;`j5*ڂVSL'*ZuQcO+]Vf*GR$~_n/[l4Rd[,(N\VsԚ5岧tr ˍr,?ꘕwڦ0)xv1E3* KV(ε&RAu֎'VTݲVud,X0 k'"j&E/hz@[5hAbOʅխ3 Ic`+N myEѲɭ{(suv]1jozzx=םzEWNԭ:~fv3%Wsr'=Sm&-S+b.~Kk\7V\zAW _a\Lu ̴EKea:zݡ{o^M+KGD\)fVi-1J X:GU/3RMuRau mT?j~ $U[|Z x,XȤQj' /hԛ6] ȍn -ah}SmE[kYgU䗋ޯ̍_뗋RDZ*]xk}Dݍ&^cD^~ݱJ^LKuU1IJ-*Z^ltUY5Yǵ^꘎Q~mѲW6_]њjqexlnQwKZ;վ$l]\ Yz[n6fH.:S*֕'VREU@@ȏ+u'NmtI2eB;Z$UevE,ӥ~DC &v%VQFdnWnYy#Zfd^*6%^oVƢ.˚.1t(k&I]k C6֔2M*%iEv,OQ+-dc65KcktWg7ݖ,벥bm6ll vW^vKNio jۥw\zEܩi C*bTn(9C׭<>bղޕ]-֜TnL[IU6ۆ2^$P;@á+U,zjQ%MfwՖPP SL'U+^$eQ7b +EW{rSd)F,Ne-tQ۵fڐ[U£:vjh;NݯP+"(W!wKvG1%+ûo~w:VqwaV;6!lMw{^[2Whvۊep L3B$Zv6NMgag Y.:^/m5ڎT̂ZSJrP\[dٓO+% h4Tu,KJ.t,-̵[4g_,Xuݻ߮Xԟ +r9f.n(vKZ`GVj%zV~T@o4:Qd~0z=*|r](9͢6 bYʵ{ͮcT=I,66.ϯ;fX;i%PVj͵:fv~_ڤ(c:4bv9V*vQKKrzzD (tvD4VM2Y3*ԞMUUYZnIvM1o{]TiwD_^hbl][MW݂,Eso[PS,۴b4O& ǭ Y4MfEїKrS^+#=%~5si~O:UpMAA*z@xiŚ-*"׊e21Ϫ5AKfoSsl-lmԶ{M8C.U C5ĊϧA4ZSj5Vjڦ~KvV>MUs8_ 5Nņޮ/8z"0]wve:ek#L{UkN/iP`N9nIUtIs͖W-WϒZ3ϯ]BV.~1U^nv*39͍5^A,rYmxV-Vi?;׳ZmH,넣[˭7٪V 34uUU[VsMEQ}ήFW7~e(raY{M"~dx5moL;Geu[ոʻu]˒Ko[)tr(U̩T_[6۵ٵLK%zETvӑ;5{FZxJn0{:6/(bYf,R=ǰc6|nh_Yj]8gS~goO蘍ڣW\-Ie[{Ͷ'}VknzeFgQKIZKۏJbV=RW6rۜ`+j&w5UUnXi jM%idf.axݢT뽲ں%ِZ 6lwm~v5'm7d8u.nUuV(~͙-Af`嚮Wf$kxnbSjG)[j .J0]+oA R9lFUԩoG4z1\ͰzݭV^"a~ ܒ!WJfdJcs+.Qj_;Sh4نF!%1HMkK2{r] -ȅrz¤ⷊu^Gp6U%යɮ4ǰDWY[%:wUV+m5QŒۛۆuWjC=lޫv%:GU|lI+vi T_4W;Sc4/ujc;ݖ-K{X7D!mP1Ui-VdI(b˰][,8f鉍А Fɓ}^|?ǒګHJKg;ZfL$I{mv-Kժ(uF,=F+b G&w$}֠_4m=+VbkNS.֔j;rY+ӣǥ.Zh~aEENjʂ-zG:jԐKKw O- {W/7VK+it9vчf]_Co+w$+ MͷJצ5pui:~ͦb]( ݆nv4 5YBA }WlVZɫH 錭WW[jP]yPazQgI=2IjyNeSu;]Xv+%'..V[=zUϳ׬)v_VjOodZkI`UG.ʔVgk}3rSiPR=C^ ZI*#_SIr2TEK_{^6N_(4OQ$I^($Cר'vw"yMg5e՛Ziv $9rvE(x%tMߊ-SL{NUQ\I-V ~0զV"[⧷Gr:g^/vFnV\/x=mLk^fE^]nEVK=ׯHS++Rh:ܷ;2oϒ{[c2NfYv G,VlZtzQ}6vSj8gM+ [] jFAJj#j!uR%mJRWV{=vW Zno<,[rUф3͚RZo4ZS,"᷵"k]5*mC[W[j(,SNľ'U|wndu!*\.;0 ` E``s2]SFX=LelJP9"zf%hUt%\Ʀ *c7s{zjBS,87֬Y䈕CP${SK \aww3S (TjvZUEtDWz~v'ߧ1NS )[YVXJzCզvOYJMnEg5H+Ղk4{*^ZH5.Z ;+gÓˊ{aC x8@IH|Ҫ鬺!l͒=f{UɎ8͂vv.LCv]/2r٩~~[)ɲ0\3#5ѓ{FEwNF Zf4hj,wfVjQnUV(r0aWQw=UIK:*% \ٲ[Jeed>Q[^mH3NܞHyEkSnWR{\ai 'ʢ[uȔU>YVY$(/_JYZr_BmZ0Uϕ|r*D SQkv,#ͽNGzfzZAk j[;NK|5%a(v:Ub_lȴZ^ɯ˖-֡v\6 iBKׯzB+_;Mu]uzݚ+ע\Z-{~ɑ_.W{6ɅӬv_mJ4.+Ybo߭U9NQ- t1tC񛪭7Ŷ]y-Vnn,~L'XnAn"|wm[Rkn0wlGjb[ iclyu`+vռ"nUoSw~]}LKX*Y^6\MjCv UnzIłLͫMpQjPRk\-zג۔^ʽrz*KխĚ9Zؔ~M{b-vj6)TovEn9n70C/1@@ g$ShonwT2ZR,X6QO$w ȝ.bLi|RX\9-$۳i>rhY֫Jp4LbOsG+[_W6]2KaWfETrn+5ʻ[/z.g6[Cɱ(nM5+v#諾ެӋ݂iZվݚ -ӪzR*%ϒF+Wrjb9d~ak4ESXKr3B#V[^Eۖ^1vv,2<ԚE1$Ii&Zwo"I:[ {(!OC~SVwUo+:hvC^ R7tYՖmBM.{_pfݮVOm~zW붮ou˺_|JO H3C[o\+4zU_׻N{ðk^j{j:)wMS*bN~mݐ͆.$QT/nRIpq w߭$+ bYifç뎪CiىeC*{=orLWv-IWBAjMR+.Mi;޾҈#T~~ljmɒVjnaNK+Ymv&Bz+'i6;G Zlޱ;&mוMezY+.h(\+kz&QU-uRoTaYo7vӑԹrĶXVqH܀E dW+7jx>e1sm#>ks[Y ̚pڔbU^V%Z:QbTmVn 4^I%Vff\Fb!jۯrŮ7߮~/(pJo~ T7fʲZV6K洯]/IJS)|0s`hZ=˾,bN^܎^Л7VddX]UKƞb GZqRǣ>aI͓=nb߯$ܕZc ^ էruG\YjzFzEz# a"+K-w}+S:uU CoǷڕ>W3~l('3^X l`&6Zje-z,6.SK%H͢f7 TK i۲f+nCXe|^g..G*nɪg*^OW\z-Z"}fa A+Tu~_)Eiwݡhi%-Q/e0<ɩ}wWgEKv*=~ӣ^zJWVnnv*(i-}/cn˚4ϕfY7\/ #y3ru+x$\{F,&轢TL5rd.|jk.)!uuqUK3Tr~fWZclQfU%mBnEqJYkӮ襮EEsTxҢuC5߭,EE}XV_/6 Qlhlkw6KVq VA7%`jY{RKe܆o6͎W+~eյq^*Ue-O jE |BCvGRJץ7XnAKeۑ^Kfpj$)f)Y[>8pxjoa$ C #!hg)3bznmʭQzA)ق*eқZzYT2>%v ЇqBnS*գ|;"6EvdՖ)mer;bYґZv}&Vߦ{MKoB(EYQ !zCoK۽A+Q ٬SʵZNciUYNߡUS-)9$6wiUIEzVn 8z&ubIS͖Rq$XnzeT s$JNћ1ڪ5ѪFei6+zRi.vc1TUly?o띆TJ:ɐ4K]R|{Yv7V㩭zԚ.(uAB3?m5T7N.yWZfcG5\m՞P^j*Qt ƨ Z) UV/|z[/v~W[r D&4Neng/crK`O1_bجt27ߓZl,6Ƥ^ x6izK,ힳLV]+%=Eo&oUa赽ZnvuVV':%onRzEnlljju6!wKn5B/xr(N;F /W_ox`0iF=&I(*=,:e/4lA5vͭiߑCAW! bQ@5QdRcYrUljW{}ZX5: x+}hjtc4|ݦl;5ݮg-~e4tzEgtKԎӗVڬFY%u_(u oRQ2e=\zZ[VotKUg֪ҫѕ\fᒙE+V+J~Y~Q b߮:Ρ5/V$XUj zQP,/;sTZ&Evojc3Kju%S삠7;U*3Uޕ[[%l re61(_]Wk~LͰr[QkUǯY-5˔jTg՞PVKr+o՚.nY.oLo{SUgXTrNStK^%^9L/[tWkz겂fy]dvUۑtvPjV)tݚgT魎Ei0VgJE>r.}f/h[Yԯ׮5Ւ֫1ו*w7sq^ݳ"tY{^͆k݆~vۗ+Y+nGn^ǎ8K٫ubnÔf_dN^i.uczw̦) ůVBS/̫_PWK1S ud2Xְ +RA.3zCV)u# @ \m\0_[^0[zI^@ 0Vhj~nA4f\}_jfsԎ-||z+52Q(9rbZn[սkj\r(SVt Yq~A֛oE{}I:rGVW0FNZ׼ŘK'zarQXne85M{[1 |NId;nj281REmŚ"-8MjV_-xj)nr <>ɪ._[YzQ=Yt41kn 05̖/t7 CͰkqfJeVzZz hF\(s͞^a1$m(n=]NÖ{QβժPQ 4T5IBI\vNQJZ.k z]7$^QR -)NZs_(Y+LsqJ_zIpDEzѬ߯ZJ3Fp ZQi~ڭvjFRm;o*BMIuZPpBkv W.(~A;!-LNֵu.65J(;ߙ^Gj*.T-$]ާ[!hUj-ihhUŽ;u6vdƶֹ"e7:nj7VŻ#uY-4k~RitnQf^% GmǹURkkl(bRmuFOjmj5ǩ%ϲ԰nnyRͳmTdG띎\^i>jwkMڑKz2A/*** zC2}m^]2ZS6f}ME,vkZw f,jil.r_2=aYNݪhWoRYW[ާjs5jJOm5kTWWG9ݦ\vz^_b4JIT>i+Ւ_m;S˴FP1خ+ZOYF0^5m5/$ٔq(n̔,7(fBO'ݎ~'Up~RG ER8X"8^ `(ϠUZVtYEM:*-A%הij^mݞt.5}Yp,&wܦk+C۲QYZ 3W7UG4f-5X:5J5H?b_[*z{UyV+zv,N.RY S\ŢYt皪3mS1{b0*SbC/Hr,բݚgt^*vC*F_FG:S[4ˊWs٩6]Y7F'Xba zn7b !7 # A V>j߭NRc{fCv^]>Eaej֭ZbVLٻ;HA :g|n(Ţ-pZwu@/7v3u4J -Wrh\%g #ZF[-~U\{ZzP Wa*yn̪TgZ*Aj+~7ݲU{kQjlZdRr$pbM5F!\Vn6%K0z5NEѴovJk{`[Y5&G wbɑ˞(W6k.xӛF-8[oubS*z6I~ݬէ4_/"\d[5j ovaڎr6vE/Fe /l߳=h+ t8 oElFש_X26J˜Lftpxv,jV[kpt.\2Q:% (W NsQtN4nr垠}Z vl -P$ɬvA[.8 GɢQnROZrr)Ϩk+vq-ΧQ.щfao3KB"~G^1d+Nupް}ޯmUE2U%r՚nIgL4W1E`=a(YrXU9%Jken;\lJ~>G3v4;(zvvIjljms>mWjEql]lI.ZmY*a힡z_5Uߔ[٨kJ}f2{*{&iKe\M̶2Rev^2jib(ݺ0MSԞrZ$;%4=nVԪYx뱛U* Tſ."׆F̦pbؼnZVfaeIz2ho+t;ZjFeOZ#%Ն5wzt5EgUt:l&_rp5)vk9Yn0ݚ0d+paL$Y~u,5mŪZ^WtIHJI2\-(H]62JrR֢ +Y]k{Vl"V3;sk3*!VZux-}L`b_j)TR{\Yţ^Rlԫ(n[ECѪefv41 0UzՒ4%MZ2TZӫM^mjzc^*\y ņVh 0N z`$߯~/!(aj^6BnW0LCZ~TkZv;ۭ ffkjeAnA-܃jxE\!nk.]zE>^]]j]9 ˑU4JN);Me9n.U-KfKWKrӐZVtG0LÐ^ZsCۛZ['>KgvLnhWo1^'FvJK"MYLݯeǶfvV4X&ϫWuv˓땱r˕Ƕzl WUcuc݊)XZkeˬ~%bQ z^nvT}ܤvn%TI5..\G-R{^Q9fIbT-N3]YuJ-l5ˆ̴hWkfXn+~ÕF]vY]jxR벴؆[ފ[?j%Kt4AbQb ,IH=`H65.uU^\_&ǡ+Z'VmQ{e.Ydzp9~)ͥҲV=p6@>:%}˳bn:^A}j&ۍzV^#.LӮ5RWX&cvF4M)͎X{,Zz#7Rq4F+hbnTu(kKݎʔzfVAU-`' Q?WjBUۢZnhQRQR{e$mM- jJ/|%yUX8YoJ.}rn[2z}3%Ww4QEU[,Œ2ź2{Yk!+Wa(]+rC;!" rwSGjIEwM*n]r >I,:2L"w.Ryo{6jv~;JCk%Slm,6}Z1ݮ/7n{4ܫ]ݯp|^ח/լxeUޫ5I&-7\_%ǨYMM܊(7U&i WO}PU.5[oS&!ȍOg{zloR֭!duߩ!<9*J;nCJ}xv캕˒MCqkѸ+($ Gkz+jZAn׭RTf4&Z,)jy|;ۯ[95iK,٩Uײ+_[N;ң KhiV3tpǎk 2$KF;^cD7/[U\bܞmzbm. WrtP-Ɍ뼖I \([՗e9͹;~ϭbOrrnOv6=qjG;޳vCLm$&_P엚vVYbKNӥ /9zvf_.}vlVU l049ZWzWf=k>lr/*ɓ-mjj*-KC.[-WF1`w%V8Az zG_/(zC!(!Jƍxj9b-'v/='r/s'mYz$mY,)rOiuG.y|. |M vX+Xi떌~^/(,bIn ʨ=(x^gIZ.89rlj=˜*{b5R=Ăa16mZ(H ïTT*BͥZiz %K\JګZA Vm]Jp ~]uZ[n*hzڻbIeK-QKy-]͒$o 'Gӊzz$꽒 rӛeBZ쨦^YYtԂՒ.zU~`i[ /ͦ-K&ՆTj%uJA-IP.O4{W5XZ8vXYPmrEfYӑg%8UJӜWJmh}Y+^ZwfrX*认YUg k5,o}j͗e{ʔhYYF^su: `]U%n<"Ku V_ϵƂZ.7\GzRwh,[(uN;MZ vһ":cS RK>V,U4Ԙ[Eaݒ[w<Wr50ܶoĎՖFrkFUb^/ ϨZnhq~[/wt4f{WfW܊ڭ$o bYUzv윒_V SWʒeڥ)Wկ WC,̲bsӫhRd6],mMl\g4b]p V ^0 w+z%ů9Fh "oyvFMWtJ=R%5v:DZ m-qRϮ{^]n+jnwc&i>GzJ0W-ݮ-T+g+]yg|8U{va+_%-W,]&bS/$TjX-i=Β!^;WQzC׼d-\ z\X]o'"$$O:f%S;Ul%ɮ-Wr'Zo5۳Qۍᶺ_Wr\u^ёz^)|>xЂ5zo_ GKzC Q-d̔ToQ1U< M+z]NVZ=fI,+%6;7IJ^f YHbhnWv5]68jrVUR$A*+jG,ibitZW˪,k5S;pl2w;s}﷤^&gO-ٕz;mzKs}ף; ȬՔY¤:J6c\RʅTy=\xT,Yn=-h|x¡Ͳ#% $Vk o7z.VKFת7TwV̮VjjIeebɽTtvMrJJEsnغ۽R+\)ۯz?hW%M,^fz/IPWXU.diXN. *H]-̰'o(}M'ѓVY)ԺN\/(Rϑ*hz(ZkTZjIvW=MZeyEvg1ϊZ+HRM) f͐1ɍKSz%/m^KU_osg-)c3 +jmXw /-8~1-q3$2UeZ0pYfM15'R^VVIm5JakFKn^ jgm]ъkilAVNchhe\y.۞۵>Ee+Z (t{K5狥9,mSDѽPk^n ŖrCűԂ&zYmquG[bE:r-1Lؚ{ɮحzi/VI4Vٰ Wޮ7G.Iv R}i>WЫeٷ=Z5(^by:rvX/<-o~8Vp-J:d[_zu0W$~m;=T$C"y&eAG1fTۑi:-;Uꍡ:ZRq[zQ\38FQ mA"Z` o5ݮ:o͊ak\,K0" {UXJFV-k[,ڮNVwFRv/zi*k ̜^sM`5FíS.֫\\S{}rV . (`+yZjƈZj%RrXjeE*yNYuZ׾5Z57ZEX6Ql 6 G ,zjٯwɸ}_k^Ke֪۫)c:Ϳfvۭh Qm>&풩vn+Drߖ;kI:u Ca}04֩4gIzeVJ56vPf3fp$䊰h~\h6qj[lVKr&ngV_t]k,$S)~AzPJKxT˥zUP %jm VG/9<ژ}F- ;^UnjFPzŖDFa0T{^{:W콚_\~KU%fFŲW-GݒsTKlnɗ -,\j6m/5)[ZE~NXUTVڎ,AŎӻevؕ^wJڨUϧV[t]WJRz֕>m4Unz]N*[f\'5t\g yպw/u~c5pjNU֣qkM6$MojpQX{ja4,&FͦRWnUۂٱ;¨].Ug1\fIUM6[f,UT;rx,bqXMVՙugI=vJmLJjmM2\g]Wٮ7z-kRЪ,92\^weQU՞"|\\Z)(rޮAo_+޲+9hX8TaaJ~v%1 w\5 VeGR6岠=vfR,v=a%֚&(WK`^aȔrwnR_PS0}CLmlzl56 zϾT1U-I(ڭTqx]͢RݦᖉV ka3{IlY^ݧrKvdŖw:Pms;[]V"H^J% eDK*wiK%DurR\j~ٮ5ݣUD FA,vIĎiSBْ;+;rU%|a*r/X,ܨ-縢_1JkdRtVHYkÒbf)nIMlLi5=˽|qn3JS܎3rϒQr_Y\ &wU rl7{=Un-(%">DzD#Lz\H\v 4X4/7$ޯTdBQ-7e[JK~K~+Em{S܎VnXV1_^cBjI2S㵤U~mmJ%]jI%lKdZ t=,|r,Fњ]~aһR^lu#jۚ*.6n㭹L_EC͞R&1keu\-W$jLMݕRǫ{=:_b~֑/_K=oSY/wfoR~[R,Q֚;USPfwcەGSZ6OsEsz-].\- 2ͅ4|ms᪕n2+UNZiYlb5Zlv.ejEYV܆\n8]P]2 Q+LtySyfDF\AkG̒q[굪Z( Bղ̯u;M4{߻Ƹ# a}aM~MߥJ]⊶)OS͆VgX[;iʥؖKBpfjjdYzcJ}*Vs^wWMѳ.%?]zSOa[mի~oمN_ ~S0ݒ^TQ}1E٩5㶪.'U/U,s2JͨD8rnJqrJO ŬݦZ&oJF;joyϖ pC4鵚8[lWzieݺݭy袦4,yvY`fNf F0= ױDAK%=e͂9vlHWY>)VU'صA~$H/zצ*2%y;֭z˫nSgyoghu\prlɢ:FoubZQW^nxr]j8.؊̦-]ZW;b6hmvۭI+)~SRi 슥 -hjmV ]T1Hj#NnNyY8G%YVkܲInة6▵Q):fhv~ ZrGv%M^}($G ;noLg++۞aVZu.][%ƖXI'xLDAVZqKrEuk׻Z3z&^k3đRg}+Zm tpEt[ RSX`p0~ߐvEWGݮ^ (&8"xx~ b,Jj<^F5PPIGRO.FXfj|0H`r4WmRSg^Uq jdmnHc6Jf}KTJjݬmSj-qTIrXڴ>U+g?"V K/|.R*WdP[+ݭUVmYv;sŴ^cz_uPfC"Sje_(j=r:\7,asji%I'JwvEkY|/yZ[NZp> "uFڝܚSZQhg5E:nەUkb޸պ_:_LdVA1=hd) b0-(g.t}]^/z Y ɰݪ&t$_>"]t)zZl*峵w i,閫FSj,Vq wm(}̮"j%ǩ謺Tp)%gfcV/:M;=c*ӡfeh,"S# LZ2L ,ؒnMeuFW W/w]SNlfVb%_JHz#6k-_\vSVYm$x[Cky%J7lR(f&5JQ閻[xecNXGWkMiUH57&a5ǭOuՎVH-'z4_=WWkՎ([ł)ˑC$=gȆQQbjE ɲVe#m^[v,%tjJSĭT'+mv0J>V6~Q}2jKR _R늤i-Ccd*VzjF+|{+k\*tMQn9PeQ!Ŧާ׋"{_-(r+*״[FaRnQ2I~6Knu=uT/5lf,q U(kơ_$`[n/ԫc*˭_g8=SjotL{}dZժʬ,V.үw1Knj} sOU$>uޞ)rqk ϐ^U)%ï.V|~h5 6"ݶkwfsnIlO}Ul'U4\[\m蝾BXxb _0vEp7 ;I3-;s٬XJEkl͑4zJKgtZ)vM>r\p;j;¨d,k#)2ݪ4Nnz-U w 鷥Y%(۱yd۳Z=Z&EwՅaSA鬊nriT5J_[Z1 sJ]}jM Aj2Mm؅SjbnjGv[JXvHv7~Gv]Һ~Kj[+]l>YbT+ЬBӴG.jUԾCꊂew[05w^[Hjů4(6 ϳnݲֽ~Ѯ CRNWݮ3mP^GT%9jɆ-ZhjY &7je=M/vZϐN얊Z{^#Z[0ZodKZ ͎V$,Mm+Z8iƪVԔ{_oU6n{-;xOu-)Umg%U-{nUAs]-8>_^}fG+Q&To |)vl.GȵNoIGV4~d[ni.7N9y-J&ߐɪuFǴ}K&-r4S5gUo[9v%85Ր+}exEzٮ~g6:2n٢^PzE5DjAP˵^Ow*ZY qʆe~k*Hr2=M~tN֍5mW%+sKzOSݒaw|[i ܹ5H~U&:=0k6A,]WrC,ݳzM;Xh_6$QvK3CT1lEp\ě蓚q펢kZOَzJnvaѬO%MQ 6 δ| s5W#؍Ηj 6Ԋ52-쵒n5jPrw;zCovo-a;~;q iD/ޮ[Ī(˕no?R+Zxz_-]깎oUe.muV'"lW7e/=<4IfVe>E˓[a^^W{%Vcܦ,r^buP[f^(=ݦj^Njb3NfIt g7ܖK5DZ WsnK}v,ԖH~守ejt5QL'/3=E]*yN`BQմt;qrg*^[[ѧ׽ӫ_V6xԤFfBYN[wO[z[RȪYS^eMVm cWRmVNSb&nDzZWJPerODT:~r+ )զܰ޸삥WJ$bmܷv8e ͯuج7L* F%k{1Ԯx2A*Z No ,.nzkV(U+b&bV:! (Qv_`7%^.hzW&@ @3ϢOv5i6UUS*- 4 MWuY/*EDuuݨŢY 薥Bb*EsMCtSO%ǩzmѮXaNT\SUKJ)u c_-u 7adWŊ4_'[fdKoQVJ*>q7U/klł%JEEl648JyZ-hU'Ƿ aNBCxv4[o4^C NAX#yxQQrp v9z8^sZےnՖ*UoɾiNG՛p/lŲڥf/=_q-fTkz$9~p,MQ+-F8'j9כcb0bxlߴ{uﳉ7jn(!TJQ㩭I 5$z[jUjZ˶%U{l]Zٵ4[anMMOˇc BDVnrWoB-z^K3ۻIsMo+%5U VRQs<ɺՊ,d2TKbMzh N/1P*:˚k>Z{uR^+ze6St+oVr׺p(]=OT\Uڔ (V6-rFmz^\f*( sS96=xl^AoTR۫`x){ݪȊ.VQjo#l v{z;ҫZVMj3-bv]јDR 0b_/ G].#I/ ` <ݞP~HmuyZi@oKR WLKy "ׯ cDӬzSbkiښ:IUfKeWtǴպa;+Y.wz0Krkʣ6IQ^,m[%çOlY%>$GouS*^ pBתw;j3nm4C,9+RLE)̅6, %4dҮ5NUfV Ө[BXY-O;uADmtd=Mrv]V,(DVU;h~/fCPnA/ʬT],(T.j\P)WbƞqӱZ:_𔢮LfKrJբQzhMvf6MLYU (Whe3I,@.>hjb4jŮ$ $[͔B][&hino~pUO-Wvmg_WXLh+WK\ZLunR#UN-X-Kq޶tr'y+̥Ul靟WmI-S3}IxVfbͧw~1um9+ rI\5&ݎ5,v9hWf{nv&g0m,V4WyF].LjhnVWPK_o]k^KS-5PZF*ZM)ݒjTO{Ԓ*[F5Jfx/wUo;[MSnӻTTrfFEXYTڦr_-2E569=V vInW`"+vG+7C-@pg>mU>],-bw|bW5p`[T^[nZSe3:w=eU[dՖPj$[(|>Zm3+^ϫ:>C] \kif'J~DR:v&/!-]ts46LQ+zSZM'~*j՗ܑվjg'V+X;tmk zlʰ URM8YY &j[ajmJ3*Mܒ>o3-Tߑ-ʹjj-[u m4cSRΞ{Jo վi*-U[H,[T[V$3̎hK-6_Z8N\j?^* gѿZrHrCf7zK,To}vKf" `@ xqyz$~Q$!d;0+yQV[ S)R_Sk8> 2zݩ(nC-?MKVNi͒5N nQ/{Q3M բds.6[|U'R۹Y%T7 '+v6+VBBhU͂, u*mVc4*fe'I͂va+rSd!ҙk2`ڽ@]諵 5V@!RU,wc8r[/;;]'E*G,SEŦzEuPˍt;Zvbz\Xͮ.n,+hW}Aڕ` %Ð~fej5TMKE_oZe]1ޢi8(}WtZ5Vbf+"[uTf IE-=]Yltkva-# O+viNkKt\Ajjv3=5c5fM~-t=k1LG;LӰVIWT{MҵkzI,z]賋z|jbdm.;eHn6Ec/f$UI+B7l F(_ C ~Kۯ_1 +e2  wM>m's쾬}S"4gzWIʁX.V]--cRQ|&KThSڵz/Zcy2 >\nDnSk<%icef߮srّ~]t~הQz:*UD_7 7$Ww-lzvuX55nEoi5G(zq&bv9[M[{:ҭ5fAfibi5 YjCTr; A0{zY:i̭nYuɥj" NVbUVf[AыR_ޭ]s meY=˭[RE~W1zl$>4mVzhtS*]ʭQzQ8ej/]'ɬNyɮv*Xf-z9T5<SbuzY]+EYrejZsrźEYbE2Kg*vK=OG_a/7[Z˥Ǭ3DE fvξޑvi_ lx(D~~sK]!Z%E*6ݙ)UzN! jz[jkbRvԨAMϒMô]2w &9 KZf S A5_W)nk*^awt%uF5Y ^roejO =Qlra\͞X(mvgb3EYka~noym[nIRv˭֭ziے^lfET /Ceg&M0BF&!ovA/zC0 Kr1wG^D O57YԼpni©賻<-^hRڽB4{fݮr&UiұuZǧz[͐6Q)Zf^St432Ym4}ܴj*emqnۑVjS,7&gY|/ R$wB͎" Ct(VaHժM⑫^ϴ~^^e;[o/PmUmUZ:}rRՂm+fi:譎m|YTɅMoT/nSlXzM6˝]i Yh׬ LnxrܽɫCoȪ䈖SR\ME0[rk`v[f%Vk\4ؤkiD ֭ wQBdMkUZ_k J&Ɋ92*s˱fM)fϬ^WPbϭY]OtR(f\oͺd#UO2-פWZ]/mp]˭Y+NZ-M$gKiM^iq*Xے5-'^r+vjU%+kKGgݮV1K۵c߮ˢ6z5UyMQQ5 ZmTZl Z-JV ;!+~$w-󿮴{OybjHji\§)V>a+K3jF-~A zEޮW A+1GSn-p6EٴON䓈 )얥˪S&JnI6eUQ[(-K.v5z,.rFA%jbnkZwvkR1Gwz^QZ`nkUC˓]rKm =^,- |gm"JhlέJNAM)[Uu ѕu^.8h<6SW|(UܢnUZeSzC a+~58,f& d{Վ&i!,Fl\ۤQ<ÐnifP+0֦crK~jEmT,!s{^p}Ilj$kn oW^YjuȐZw}Y&w5 4GX1^C95Z-^IеTcGYUZيgEԛ6zv TnP%>)1a\Yh[f0[RX׋̑f<~8w2HV| e'X^Hv gkO VWq'5Tԫϭ{g{[S~%j3ݭ`WUM̌ ]Mk͚o$U.Es8"O7tܮB.EU n3.Kn]Zu--ͩ6&ʩV֢^`,o^Xo =:~Z%nLs4&K82C+{bYiWnӯ=kU{ e,A.ɯQj pK.5eS#v Z\v77ZeZI_כ:-a+Iŗ0Y^7Ţ]徥vlF9 GW.8=ZðvCiv1R4S<4nZ9Y*fmK%siUg\h5/,PfSPt,ܔRm{uٮz͎Q\۫,=R-WTb}՘yfG2|Zrw7V-R\Z+b=vOU QV%Q-V׍4Ms5itQB<Ym]~A_.8 C+d OV& ~}(K!}pv$.^R.Վӯ f]0N)b÷4xUIVKRkUGlr]Œ`ޑ[bYz*sܕ0MlTz#;/9~G+zV'IZm=A^GoWŒ-zQvҜ7Eg(bD'ybq+,^V95 P"lfdՒ; KzpRFqłYzrv)㹆bO24NXO*̆bZZ稞X5lvkf}߭[3L!2,e6$=/9him6KUz~{U*ںf^*+ Nokx]fw~k4Ok*[ R5 Owu`4E,hcK^Z Weӓۥ>.K"j^=*d'eeeeb傠ݲv﹕t(`TTNTų))EɪKJY|b'em׭h~*R[_*]nId݊_S5W gx:Sc)Yczr;0;s?nLGMIU2{_zI/r%^[n 7훍ZҔz7fI_Ib|+j6 ̎]-fYU^b|cj*Rn:Mp>ͭQZ%]qBͲ;mSEY?axnU.ESnÔJ=,r-.Rϑ%tUjUIzיM(XDo=tZJCw-Zw3|I ՚,]6&S>ܬMڦJVXQ|vG7ZRYr$%k7ʗJusru5G'[:՞YPt$W !bM/q%.iMGhiC fAZ\vP)nŮA0~c a;Zc~8j~]*neVV!5-Rh ٖ0ڧVvo+?=k,WmӵblzNy቎) q_~kE6'w×J, Vѭ4*74Ml Mծ|dfaZ+ZH/ڥK|۵lUP[Y,l}f̪e٢Xm]&-\τ`Z6絪$˗z}lW;/WKJ]LE+jMWVzU7yEoŮ^4PNr߬w}'jgw*Y~U.e=KVvWOտ8o1DdM/^ݗZ)Ӆ.Zhݶmry];}RQ*VfXFJڣfcy(y5ϾmJRWLjgkĂhd-Q+(\p[fYs5!\-v-w&U)4n?[\ٺfS fbS\ͮUףXmS3 [ۦduޭf'5c]< Y:gV)7KwL8fSCkn[n~hjtSmj]O7Kv_ЕwzcPֲۤNS0n;Um6YT8+ٔ P-WzE/4^/(~"%Z_n (8`R׮oEQUcH|FMUݿƚ6|?~.jCmUnQf\lպr[nʶ[ճnZ irLD\Zzg\f4iq]Eiv~GJo=ǹ{]ңTZx^))7zU-uE-4&,EN74,;z-WFlOzCbuan:^6qZ~ub+ oWOIvy5J-q!EPpuf͘-Cm!UՎTt gӶt]3{&W5iՊ+E$Yw,QvnFP+u{rG2z-[rX]}%rS+d՛an5uXlh;_W|ZMg.K!JఇQ+έ M-#Z n4z/֫@ DB6v zAPw䂣7 o)]N`ヲ\:CstjObSZHX3U5JjTX;G.VURS4rG̶VxՊIhVzOL] ErIVz]ԚPVzӻYlXbvmU+{a6rl_lTUjzU&zeUZ+j^f:OltcZM=m^/:5o1nu fWU+gi4W !%ԉ-$LznEm[/l^gvtcS[FvrZzjf"sj[1n-ҤEJc9͒hVγ7XVX pyѰYݗĺ#U1Of$;`cvENcYh5tq6Y~د,O Kt;%ϧzB .4j:!Ph,v:Ұ~AԎboj0YErW+]!نǏv|u.|VͱPS{Ze)6+zVtϳ&+SgI+WD}MiOsެVΒ`-Zwz=Zjn Y;ؓf}vZ/NW1+z\,~rA) Ƥ7rSKvSP4^Zv aTnn)蝟pT\nnPCilvMfJŢ7{nS)5UYnM/SuYEyjj[p GonWd0HV)iP[Rڷ 7S4e֩2Mp{U%V\*#<4{ٓC+"uϫ YsM^,XKlzm ӦXJRS/zC +v;nؔ:r/^vU|bAjev8KoE`kZ"UUPVNuNwʍ%Wz K[.⻸fXHbn$P6^;=i0{nuGi.n)FwjQhNйC5?׫Glܔ^W'L^X9VIN/STlHCH^.9ɋK?7Uo$knnFZi9nյ{4 -n)n$Q ߩ Ԃ㒙%E<0XcůӔm8lv*_G/~-O]::n _*;nhrOlI_Z'֚f[zfOWk/ :.\ppiVF3jÐYѣ͓'+Q1WTלZGjKdn|LV~wѡx].7%꥞]qR۽rO+{:ZҺ^Vl5%8_xR5[)^tZAuʬZf$EZl^EiHE췛؃QgYu4&ДWmMST- Вf9])z o_qvY;uy ݪXߎ"5ZZzs+u,+lbQ,Ֆ"yd)ĵj>vE9J}rs'^Z[nM/iszb_qTrjvձZZEm5o7E4 lgNjA&"[>O$R]m꽖pYMඛ~^+w$o*^{ђC6k^Vjm,+bA-{-h'6굊) mVLtHsu3Qoz-]ivVk~,bͭ*U֬VLS;jz(Mԕ-mFenh5bKvCW n*{(_bGU.ůX5-Z^xR5Ǒ[[n6׮5:_/۰gZni̲S* QRCZV#h;n;U,*zO_sې]l[E۱{y-Ӡrkҋ^ o6!o>vM(zP iVl`zv^yujvSe$Q-r8rѲZge!ՒLbɥRqjĦ,aZ토3{+*mcJML6ZMXZlhEGڜH}fa-,Mtk\>M.tfGlI:jAeͲ޻1^(OTu;ٖ;,ֈfCdIk)fLEJe`ZEu4^r^T]SfU8 j1bTj/~^Aܰ;~%A$M0pҖjKE4X1ˮ. ^ӳ I֚ kyAWYbjwTnb{\("U}kiZߦZ m8cou<[nAzfnQDW5K5KlKK՚!Ůi%Uv߫;R_ҋr$H]IJK0,MҺJv7bj%׶:cz9+Ֆ[-2\״,YSeq4ve/ >ِZ%=]~KͨzJnR.Wuݴ*)f2*^&XjHei굮bwt8/EcM\9X,EnNP~ f;0Q2]o KS>< nE fnD^U^nO3]sڑZQWzvȄKĺSzխRŧȪիT>t~S)4թFU8 +fI,i^q)u\ zGkՔ_p\dYﶺ*sQgZԎߝ ^s~uB߬M/N)f)JgKf5m&͎P\k 16{jVfJnƮ-xChez٧)rVj QU4~n*__isukn=SRYTjf_hrI _Rw_^Z+fcn vi}&]QDtޕVb{r4 *Qku𴮤 Eq^&*d~`@\n7~+zCoX^n8n GC d,ϭ% ;jpdee󛭎RrSrlp#tjǪؕ0 kcrӬ|\^^U܍͚eALRrb6 u;>m5K% WjӘ(%V.U:fcֵi=Cg8֮{ް^^ҫUlS)n U]S߻&*,2V]{bCFՐ`z9a3j%UDc14zϰ>-U/E^iw%+n:Z,KrѪY6vr[vrޖ_=Evٙ^5ꐊO4-E!:pj_͢j=Ԃ46G֦RG5[m{Q\#7M?njji6ݮ}d|-)b=O/UVASʭZzh4oq_1Q2)oPL6ɑ}NKn5t9ͪ)jq2m'3+uթJ.wF}VNRAZx$CRlܥ2[?q GdnvݴΓ.\Pd(Ftb^JŮ9v=[לʝzIi.STRCYv_6(pR(7cnAhj-R6ZzSkWdiU ]v;ve%.u;o뤽ۭŷݴX9$&;~iC+bYx)Mի zŰmBwiEt:Air"RkHA4uTdA-~$ؚ[,V,oMvf7FUo:_:nz'VMA{Jr_Rdgf]* rX14QmX%eoM(Z^X]~ (9vVf~˯,W-u6Ų0+*4THzp E;SoMAwia>}Z[l굒! z,<6E`Mn!zMC+/i\r賩ny\kcM5Gɵ#%l,T\n뗔bEDE~m,[ n٪ů#E"ם1%l g*5~LYwJ +u-NvAɕX|5A6P`#{3vخZ^V]^'rj7[G]{j[~[:Z3SY Zn*>M]*Ƚ&łd5^`?~VߺMWoHTLf\ߨtToTG+fYtzI䱹 @ W zAo[ozetPRs.RStut6f~*Z5{dɍȊ'vyK+U^Cp}G?G/,7){ն[mfRVZ,:Oŗ 6fN!SE׋VjQ>pm<1n&8FhURqa)$-˚lTmZUV:zEd EӬ:uW:}~Un[]YV,66ǧiex9)fǷE/V_oau(uîjUbTU ,+-=P1]rҒZRa8i::#il~'6JwuדݪXUV֧r -w,h%2i4YXU[ņ3MezQWgw]Q"[_}VMv~6Ϸ kCmwTFQK/rvI"O vݥ>TNS @5~˫չIn͢+5f/f$~Uj+$;$M䔘&[,X-Wnh(~Xi$RLr W۵:Ǯ׻%}*_k,Flhw%Vة ;K~OSL]$jZ._n^sj)6%h6UqL,|^yk`1H<(ܪ1+5R"Eն[v&ʕnZhoGX[W{kb-ʍHRUn؞\vX2G} z) )kbEL ;lFŲzrIDR@ *Z$WAK]~CKl'|eSS&TϿv*ʺḤK\[=4V%Te^*ƶss]N*J_?f%li9՞7[ֺ6٨^zj^ԮT*;lܾN)Y\V[|&d;]_yɫ 5_FʭfTgܪj(5UozKMW5ٮ{z.4^STB^-Q&zQ$aIk;fM:U*iRJV(~ePKrM2QR-LSsJp:&o9]`hl8GijꚪeUm|Nݺ]kl96QmQh~v̮R;nu,w }j\vDMϮmi^_+IZ}Ԧ,v=KR0RwJ&a(nGWg+M)g˕GB/wBztnh5z8zu ++۩Iz iB/WXpQwgݧg.ѬbUL^]﨎\z.AWvnuk9i7vEJM jrDF3lnB9'lTI+F8lzlלz+iǩ)JZ-UkͲ\ZjmnYi7k4Ǫ5Ύg"|os[/Sn.}JwW;W{ GyCizt>]VDM)Ջ%pyM*8eœ=2v6Au~۲]ri>N'jM+_RZSzɅOڕIӋXVo K| @`-^`#[0ǯ(%*gH`/t^]p]:ii#[]Mͱ- ,1RFnWԞ4EPTKSP]ռ2ˏVw4+%MkRɮ_/h"Av:jU5&~Yş)V[z/_wDRV Śe%浛%YH?bkK+Hl\ln+b/U9~Wҽװ̢X-&y>Ydլ.ciF ^M7LeWđU>fa8Zah<਎ސeIAl]vZIlTC;^Ф=U=amC4 og3H?S3dEo 7-7blL%֑jsYzG4=cRp*5ZG酲ڭ ohݬf#uF4VdUQUj yɵ{%^P%EJJQrt"~Kté:KP]MdvryVbYbI󼊤}U4 `+Äpn 4P^a1I)k4f{צ`RKMY+lVݗ -nHitkfkm Yu)iU,]m5[ZkZf6a6Q%քaLٔ=c~1>\V-7(Kvihԫ^oj6.#VY(}ǯ )idS/Ga\Zv0 k5{#ҫn(K]Q%&$WՂ o[RdSVU+7VQ}ԴBoQggd9M.WBPt2Ԇ+hK-٫v˵ݱ붫]~ж><(jA^YZ@g7[]W,խxͪ$BY߶\L?i_Xu€q=G5E_>vJfWr JnE䚡kE#i"w]zKrSDNVWZ%AlԊe~TD\햴rW|U6%rX52J]ov7h0@4 zCm0^0 !ï%`;+cnZQzݎȆZޯVu7-b&r:}sMVVeoġHrmx96*u.Ԓ}AۆR;nDuZ-ݬwB/(WyVDes5UĎ\VvJw^>K.8 n=w;[Wؔ[-׽#L׫Z^^o6PvbI/7^V~L(٬r, 0cj]A ի=[kftT['lO5\vVY<;jH/>eIUQ=눢g͎U],Wy݉XU՚Q[6>S̆eb&՚=SnQhwv˪1/8=Õ̖reE1Ėn(UjQ/ Um3%lWHY8]zS 6okOJE)(vfFJWTk=ʲ39OErT{5UGZ4=m9,Amer;_YZ5z^4rI,ceGz9SJr:&E2,ʄ>Tݎ1vrIƞ"Ώ,2Ԏ̢5j[uE#{PUQj#jgcjF>ܘݞ-]ov i5[KVjv.M'cphy-6&,XSIkjެIҔm~n%S x}Inݒ S2 g%~ZXoxbP7@ Vv_aHKvAG579lϨ ӽ:\fIK~(Y?sH_ljkUtyԥ:nPӋ^9Eqmiq}*~純妵̚A)-ݲ3L궘͒!-ūba2&. Bkx\ɫ^/KZn sS1$^Wl~wۭ~ojgdz˭j`uۢE#]E'}(Z,MuE*%-Q-Iw^t6|r o*Ď,m՜[-Ϭ [n\ͩ.O՞(-\0DGbЧMhخeͺekziu{UAk"Z%hK*i7bAPjRAdYe+ rY,{*[fU:6{) kz1n~״^TJeeW[.--Z *S^.JJYx;v*5 QnWiuԥY{f\zQeZ;}Xf_/re1Q4<%|M]Rfz%"sVQ mTjk,~Emj8eEiG27,\^,*[삀5-Ad/P:v{UZ[^ jS ׯZӭMhs*[2q.rX7=$%# u_mzPt;ӫ~CH AlU04-svPe;cUWb ׵6=T*JN͎wlg+rb4 S^U3z ׏ A -/ E;#%Vn `/Jʂ5Irܝ~]ѴU̚$U|*~mэn˴[Bj,W= 1 XUl?bʎ/% \-ܩ;ݎ;.$j,27m|M#_!wEҫfê(Jϲ;e[jU6SrS"j^ ̀Z ԾmlvӮ|᭹{Zj5E6U+̊Zre6 ի Ʃz[v\nBqtRriAF[*bʝT m꼆VrxfkbK^~Z4MכT% sk5[E^֗6[~ 6|ܑ+6ͨw^ r/FM>٫vͷ{22Ce}G18*xnZbJgVӺ3 $J푎jgo,ŧJEZ-zA=IVAWNM-^GTi*JwvX ۫vF`]LW^-+zoj"jFE1{mǨ0r3|Y V-YެTj.TQz/m+Va\ᴋ o+K)ᩕ&뼞/Z_z* {X$k \Wi"|jY5QŞV.n.B(7y+UjZvjo6*~`K7t\+)=Q#5\cuZylIh(Kݛו^>zvʝ4Mu].3k1z^n^ůh=xY:땇qFê6gNb /U]{ /rMڥ"5,Ru*MΒ٭6BK.HM.jjr^Pd{)TVZVqLɸvORk^ݪW2u֚l"3J}meWr"ܦnu$Gt,W0[REVr6j,**Bcj&YZvP[nA+~fk`6=(԰rg6SjYvۢڨ|jbYb)Hj-b &V񊭷^ZKjۮvPDbLn˒em [qYnV[V$DAns0U&,łX$RUӛm-GsnZE{:x6^*URq2TC9Վ=0Vek Q%k/rnG6˫8*l-g[=U 6t沣[%E(>H綍s]n;2mHf-+ZSB߬v58;&`V PKW/-YI2C4}R][sKji띹des]߯(n3ȍvm)W`yvzW%A @E,6܎ zC ~Ow"!Ǥ1 TRZ.)%,ݞ4sѫ;1rMY$;糚M-l7)- Uɭr!a2rJp^z /**fKņ_7ED\#tvu-۰ZCkfXUU((%UURJz}V/vp ͒=lVT[;nh}ņfS/qKonWnI.%'2sZ.D[*t߰rova zH(='8nrnv͂;J^1|E754.WEl 2FM׋E[˲֪2ݩbET~orcWw85SJu92iYJ[ނn%*6;^S\2ǘ͢/ziKT8K+᪶Mi5Z]tZTlZʆ.:mŗq+v@ëӶMS{uTjo(E*˽ZGnٍnKZ*hՖ)}svAje־fYm֙nrOnJ֯7[zϨU7NVվ7T~ĦOkEXٙeŕuwEkV_kru.k}O1l:mJ̎MZ]ӬFq]Wծ7|0jJ5 BjY2Ԧ◺ROD+I4_~Ы^jJbGvu*Q6kzjBMQC*|&DN/"W^[ ~o5/(/r憅xw ͂3rN)6{[}q+`l='=՘VM[.ݚ0AizbӬ{eصY~Ѳ$uaR- x{Y}~cr}U{2ۯY઒㪖뵪שhrQ[it+ մdЉ.$PcK܆[vi&. ~rhWI)RlFWn؂$Zfbo7bkZٮ gOu [ Ch/Xi/+Wl{Uϔd)4˝ejGkzmt\5E7v㶷!~VPjXT֔6~;[N%ózzg&5uJaK:,w,Un{5fU2UKKǔ=V- l6­Ħ*8%ET_k冨ꤋMѫBUŞܖߴjj$ie-Y,Mb*E+OD.͓蝽rA/JTFլZ,V&Al넻ߓUҤ'流5ӻv-rc -&U)UjwƾHY~\qkkZc۽f:KVKcZp삠5ԲI~d44_p_ uᷬ]1J1zq1^Vnb3nX,Yjoӯn~$cuKj-*[.[]uI^G*YWG'8jIR|X 4vOX5vReۜ@ BdUzC~E.(ozA `({HR&z:Y嬚$:cx2.%Q/uR[v'-IoZZ-6rS -PZrQsyMC>pyˎԂp 5ә岤̻xMKcÐJRkVZOUnZ:s~㦺fpQ,Ǘ*-I\^٭Iس^kbUoV̒P,Z#?%ߦ2d} M]^'YR8X ϭ g+زUE`Z8z~\j { s*boj\sZkWS5_e1~wTIm3>G+hzɯJGP*ZQ<~͔ f+F?vI3K =itƨM-,S/ݢ[9֬X+%Q.)]h]*HReCֹ5̒ DZPDWjM rב^P>گ˚%Kz-w bmiUUЭf]KV7$/7;oY)s5řV\SV.YMT]W{{^{mu[Kϭפ.WUQSRy )2&'Vht,(=íڭYn7kEdU5$2< [2+\vZ S)MIԹB+8nח b JϪnݟ^mW Ѫ_Rz05^-KST61@Aev vEA_/( CQC%%#gW+=br^61˅kٶGyl\(\oJfU@vݦ"$-%Ǭwj}+vsjZv"Hd,^mfW9Be0Yբ,k+Z~2}eR H9Fղ 6׺Ik Eozs|m1bea^^d{]djz7E[+EXQ.^VʽzAm.UnW(uێ]irٲ"hT䆣EL?xz۪EouYTێ(V[na^鶐Y$O6Vb7Ȇ͓$]onV*\=iJ2 mNC,;bKlՖm RkUwN7nMA+{~zeW-n jEŏl0tU~۬>tغ-7'wV+\LP6avO^E M3;eRԂ*~j~Eѽfjg0ZP{Y:㘒酙Ԑpu]y<ߦVL6i[*ETd^X{J[Uctlԓ{rK+eslՂg$&El k FS؞t]$T\7΢WD Kua2=X+r{UJm9figѯ;n%U4Yh eW2[vׯWhMj9~VY÷Z< ʄ&+nC.6{%[횲;oUZvRU%0 nj8R+ҪS JnȢhV_5z8ݪf"^"%#ucT1ZjKYee͖(bUW֭5pY[{jQ{+~C+nEIzej ,ڭEY*{nA>a S6-zё|6Vb^yz\<]"k+,B,=O,5̚\VGm 7ڼ, njw[iښ_)Y2,|mGbߣzn߶:CPɥᱬv(Nr~QYnIԥWhYw}{mjI*Zb ]S ߴfRU՚JKlHm 5 sM k]]pjj9XJvSwDM/TIyZ/K\SsSZj򵌢!~ŭ kXSkέ*L `Dfzw삡C^za(bf(`~(8T?* V*,[b)8uTF(#tTSoVAMW݊4$h:fegbiyMܫlYLuf},|ͦt\ﻜA~35)ݮ%;yVLlIJ8X 9knRn~#T[Vނ\8&G-5_~mER:%)>aֽ͓N.{ݒXZBOSDoWfm*i=kk5W ªt~ LrϪYܔdeh?YjYm.Ytvhj![U*vaf=7͒%t6:-ł558jJ2kMR>pxE՚;P蕜N]ܚUdѪTT -{}cYMn լ\՞5>W}^$f[Ykr2~n- &ye/HOKrp~,v˯5.jɪmG)]m;ݚԮ լ^EA S+EPNِŒ#nd^ SrO,(V_^[coZXwAt^KRnO 5!+ȒRs+͖D (厩[ںr{zԚMAYȽ5tesW)꾡Zf+M\njn77)X=QuR`Mr:S~5AXKT鵿ْ+r vqsKU K\,V  800Iv\ _~]+v0_Q#5q0_WkYoak*ߒ, W^ U|U8$_k|+}m)KMّ͕bi,!Z"FU!7vNSVF/BY-8!Xl7T'>,=SdhM])[zS:-+ZMݢUjal1ZQ!>պ8djĊV;e\j֩HK5EOܦ^V-WDaWk$S,jŕxJGn*XϚ*\x hv˂R];=A(%fa3Z)^ߨTmzI6)ڒ4EW Y-RkfèS%Yb-8C~IxU.%,ɊݞQӄ6;v$sCqN.Mﳛuav;CiZfEjW7 3>0ulbN r5Kp 4=*~AeUR2VAm(}hJXo򬎩+>qR7dvEeĺmE7[oe:ݞFi<,M-۷knOk b!mgjvP5 xu[U6m|ʬnaj5[zuU֊yݎ6ъ NLZ/~EoHo(r+ (|5 Sm{m´w!1 [ZĒ$5 ZqйamȊU zhMs.ߑ;_d5=]t[gfV:WX͖.ݺ:~E4fϓӋ5ZqV~rwn[\XielYU8- SW0T 0ܚ+t.$[KC@\#hy#Y[VӓT, cӓ12*JZtwn!bc)ij6^rUjk]%rqkVli-L*U*j] zVj A:zoŞw~0TukWj4_K n)^FխU Z3w\;KmT{ݺDr~TĆ|1JO7NؚnƏ[F[0+Io(WmݳZok١gNoUI\[ji>fmgY:ixA>U,ޯV=fw;eAY;3S/rmxu([Z+rc|%8pc+$߮~GK~A2,B B+;Kvm&ܞw\` DYZwJ-O-ATanv3(TQڏUϢKZ.˲|R\ZC6bޓ~!j痻]]׶;lu,)~ ~!rI+!Ig͕vn){_ĒX.9n$JVY ]nWX%nKU$TBrjZMmhﻥޔ &V]_gzS.jX$2ˢ'k^hy/=ۯx%lrQ[JQ- fU=Yfʦmɬi Z cg,a4{t@# jCzC _/8vE(n[wI;Uͩl|FfwfovmԒ+zG+TE/칲]&ՙZ&VU3c&}*OYvhMWի=Py]g| _m5UkMhEhX^cTN=nÑ$nk9CiK&م[o-ZSZtJ6n.ZͶ.QX>k'nVC=z^mVvM)LS~7W,lZqݱۅGV izbK)ke[Z/L^qJOtFݬw:ݪ[u4$U똚)<i.s*xr{fͬn0ZEU#b˴MEqʽZnxjam(;Lxm謻jz-{rVYv{~Ж~ɭzji]C$X +,W(KwL%T%;PIsݲъ*?6-)z:蕎ɭ.^Iѫ w2\.6FWkW]a v&6++ i7*=Q[XMnIljETD.>5RmY"w+i\66wT08_}b[zvSMeSUv5U@3rw̾lNUPE Vޒ ieDl)J&gCTRkTIJV,UzNױKr$씦$ڳdǴKJ`wӦzm4J-*٬ v _o(~C -IX9;L-aHrybQ/ӚLh>8NNv=ؤڶ3~mݖi wbZn[ۓrTgIŒZ+ KST]EeA.qulvΘ5]jD#u%WFIvӕMe餭yCvO~UeNV%66LbI1̎!fi-nS$2zLΧjaZUӫYruV^fSC**7֪[k=ѪՋ8N:oJ#R3 JFҸb􎫶Zo/Ks,,6N)^ܶ-n]V-%jZjZ#wÙ[xO'=e4;~5!v,%VI0^fj[rʲ(9cS8i*k kEAP%^p-&I(R_:z3C eCg\]n녢i=j$d*ml;m4(ki"(Dt_)(f9ۣD&bֻ]yU^t((ZXL4ِ=kE;Q5Z$Ke~Eh~r_p-d9^ۧНJiZ1%}6n[M'vǯ{F]v+4aѩDER rGn Ehk.WՎ)Ji Bѷlu,f[/KGvNO_oyҫ7nZK 7M1k`6f4˝(Xc:^gvUq˦Lf W EX`f7 Iqت%ksU)M.E)U]>G9G]V=۵bltLA/үIuz>A ߩdV<fWKM$ ԄޚgJjI"MUͶswfG4VeW킷X=A ^4V,6'v+tEIp 9fAo.h ĎX򺼂Xli`v+6_s -U^yw%ep 59#ޚhkCǨrԷ_ۮe-(K1,ӐR_ ȅCI0fg~V neeC+7$]~֭]EZjTfl禖kX2EaIe'fAtib6lɯ8bѮźTWrQ-f+k uEsm%= Kp raCq-/V%cH;ͯ[# bej[W]-*-5ܾ۴K^-]KZwc:sDZt#)nhzbp^^痪2E떩|^\Mc:~"E$~Qv4$ [Qםj0"-XR"zU]4䟢-e~ mea ٽX{cmJ4PKes-lBŐRSU\-LZ\]GQ aZ'wVkc~ޕM2+wTC,mHnZ8X8zQ˭E^[W=(TŬz6r(^pz\f^ ~/oHnC 1fD,kֺVO7+va9l٦:߬I%owNY/EիJVKc:rUǧ zSqNгߪJ㱻z7-MwtgHE_YVfSr,U.OGԆ֐ĖZ;BTf{%l7n.oUoWib9bov SA>Qi̺OQKջZlN\BSJܒ[rϕZ eѻJELCkErjNʍ-Zܫղ$vKv)4Yj" Wi)%Eԝ:nհZRJ.OeN{NɎO.h:Yuv3 J߱5C}ZfRzSt*M%_lyWf56k5הֵrQ4{rVl-uRzk8* ᅵ1͞#t[FwY]kjjMIjb{5kEi,ؑ=f r)ܶWzjQs2Z 2_+kXFb ^W+EJMgvZ 7VAc+ K)': UWs4_Kd*,PnjR$֦j%CrMYժ[!vN[g,-V\&&(5z궬rVOK2MnS0C̖gޠZeXI.ۑ4C틭.5Jr۬߭v/tQz&Jjn)rj;J}GׄmrG/T~QkbgSxZVt^`q] r;_RG3/Đ4ץ*5Lͻh01˱r[5R J~ZVv_E ,EuʆpRj7OTo,Q^_kJԒ[44nR/t사 ZktnۑOyJ.4dXxr_lPY _Q-j墪$ǬTݭ8bI0ˆywC֨6J.l44m:cg;%U&VqE9yb$g^K+,v^ w)ѳ{>T2{b%K*lCdt-Z0}[tYY.lvM(rv4ԚkE]Nҫ%YOkkW:{GRK ʫTl^Jƣ,fYR,\͂lGRTfan{{ݮL/J.}]Ʀܓk-^1sEٝlD60 #5A9]qRlEѧzjk~*~Av|VÐWuVݬX_^UزnKmV5ݐzfA' bCnt=}4jI5,mMU2mת^^gYj֕JP Y~Od;- [c2OPi=l5Z>\0RUPu;Z+e$Hva6,l|an2\W .x Ҭ^^B6nSZz+Z]ymE͆kz-VkWN+NRԊd{"!@ @J,zC/~`w$]W`%0Ew45 DSWy'l 8_W*6,F =6mlW*S뮪" i5B{sRU:y~ݐJZ,nlpLV6],z2nm zeZU* IKfA/+^e_*m;wA*fS n\eݳ jnc<2Sr']6inWR;-9Bh j|P՚]+Vi=CV0,)הzj. Z^ju:5dVC]g yakn+k =.J bUn)eC4Id#nӫ4캍_2K>cڥUSb%%v9bI-ת햬dGg-źu~yv+gŐˎN:Ա*W+7E@fjfFMTUڵ~Sojjk8U[Y/(ujn*ޢ0jC֝2]Tֻ%Mk>Yu$Nij7&:o'$ [zJ6 QYECq,կV𔜛Vn^v[,V0*CzZGLouFkr.Nr/YN,reLreN]7Rژ]ϩjwܖZl$Ф%rkIUҀLt|OTKݚ'%)$;z0E[*dzOr.j>oi Ox5Z_.nE5ڗeq$xꎨZrǒ)NUo>z&y"rza7^A awɶ0L4LRcЊ|HjR\u*ij]r=ӻ*=ݓ=Y6 ֩ eWUyc0JLQ׾޸ZriTf0>,rUlxariUV9|nK;Ųn(2k굴PmԲf%8Pn$_ƚLیVPFS.jK}L+u;z)f񭶶f,j;&2C׭n5vȽ\oEԚJWG; C{kpZrCQ IŦjT^f_v~LfK~]mYzfk2*4$ZcR _n$* _F؜2EXhrݧ-5]SYUc7JL"B\L '^&`Yۭ[ZDTŴ^\.jS::2׋ TYj.Y*ՎXqf)-ئ[RliTV5ٌ֚~+X!WDm7}~evdBS5s*F+BϪ*:[/Vةd ڵ+fݧ}_njyJwtz nR U[Lq{z/27[?hIʥmV1]5-l Exѧ¶E6j#2h[*:fK*:ӔrKp]ͫW܆k]rUĝdDG`ՔNY\x5n !vEo ޯϵwpT,\bn $gmi+ Vҙf3UOP8dlZoE?awS|621,O+06t{MjjE,[b JT4M[,w5ܞhgToIlPE~CN"ndɗNubZSz_6nlEecRK VCUΎ4Rے*'wbO*v̢}^/j554Uv]3t[mv^ C*JusդU)rͫUa4 qmTY@LnfY+\K ˮyj.ZmCn7maw nZnlaut(I%jhnrqfP$WbGVZ>% |CK߭kZtJ[Tz)-E+KbbRnV$zURކ\4W*?mĎ`w"[-6y.e,X/4l5 =\uznN]^괺~\iM./\jIй~kyٴvp;uūғm/5Ir[(HhO,:$T]Y2$U/LK* ~c%_.kOMW@O-Zn(uQ W/؍0W+Wv5ۅA@2q'Cʐ[2x$,Okj*5钎zm,vNh۵:ܢ)ҖɊ"UsJrROn8niYԢ#n- NTĖ_-ufZV^jz_l ꈕ^;MԛR8v/ˑjbW.t ֌&yZp* i[*eD)cͲwj!7Ŭk4טtg42t[1mzaSZ'Z!,]m5r+J=r*[W1>JFX 4_Ԕ9TQ)ViEXj(1yz^/~aEۯwewA0$@G*6k(Br"v)vTsiُRe42[\aZ[S^b5lOa:n$Wb˵[,tUJrk\66'*uh;s],6_Sg]ì*b0:;JVN=ӫ~a/sVܮUUv<+\'rA֒ T]m8-өEiwz.V\$׺xU+Ny/}8 u4U~jH& gg%S ^ɥYŖ,5wzşWytmVHbszOjmhydW֌MV2ߵ 8Vqbꭿi%Vua,ݮvޮ)rwcpUq~ٝ^( 2t%Վb ]tkDKi \C$!tŤTVFڪvtunuv%d zE&^ik`CtjjhiwnêCu٬IbɎ"W,_SK_t*UyJ_삦h :V,u-ЮT^ bŊ#5U:ZnOeړj/7lc]BnR<ԯk7UVTk7[Q/ ՚/촶\%Wm3? ]si>Nvf;̲ۦgXM%kW^Co1Ϫl 0Ԛr֙\zNC{>j=+i]~`tjb!WA]+z"hjJ{"]W6k~=ܑ^UI,A%rRqjU/QKV1Qia+}Gg ~ 2̮ٛfڒ\k\/(m5em:I긚)3ۯ7VzVðF_jq2-LnM+=:cn;]M,\p(5[q݂[NUg(Q4AX31K2GOi|͊tW+mlۊݓˢ.4]9*ޅYoԢ7իur)w ڒrMb0"WTv:EUN,_tTQV|ϐbE,im:~*7BOT˭ӛHM]l-F39:Ol[8kbA%r /;Zn(M/h76^ZqmݬEUNo9Hz_m\'dkmJmM]WvjX׎VO>){=Xb*uMNS EӐRay5EuDGr-e^K_r-VsK2AZž^]XY%}ʮEQTaW}r_x#Kхn%jL&;VJx0Iժ{%T\+Z- N].fEh^ӮhfS-UKͲ&TVUs4\j8 UYTݵ z]cQR=\BA) ezSyݾU7[e5}ǩx!(RL.6@Сqk/v ~G!c( `ȿ s8{8Nn+!c[E^qX*[RZ m;/fS'5 bUί7L+T4ەksOoZ-Oza|Wֱ,qv;[4tivgorKUฒt$R/{uYk,뼦E]w,]'6nW>w;Zivُ. +q]b(.cUj"mXoj4O)^NmVZ^;؆gj_rXo)~S̚pt H}lպIlf,tV'ZKX5QP;ծP g+דBZBC @[)u Amiح^bYm)unzǰݎWՒԳUU%\J'V)][4":nҺf'[SE_2Ta,SOk:jU [NŮ֋Z7]ѵRWrԆ繖ueZ0z+z9~/-S*˕ 9zV^$9j/&MQ F2&T^Eu촻WtŲ)[c~W޴Z#^U0>Qŏ\Ѽ+5\VoV*9<^ IыNr+zW -Gn>%jVv%N8N˱ez/ʬSz-[jQ7qy^VnAur0A$RkrmJr.Ϫs VCE\&GVeʪXՒIMu6vO(J."lH4hj n_[r7$Gptl˵$9Zjl}'יFERzlϾ[-Q ݲRO WmBA] ƯvimQw{j|6ܯ)f'kQs;}ћV[Z)[IWmzb͗;N}42McXv7Q8]jZޚLn!Kcj:]5|Xi(fkxn?jp6Ui6~GU>ePS|R\bE)He]_-,g[{FݤWz^/]HRQjI=>hjJ%UuZn_ l] Sj%(*V^MYKnf^4zږ{re9ErX[ה{v&Bթk=OT%Wn[UPun˂S3Z-Qڴ)jl $zkMjðSWu=UԚ-F&%4*%db7dVC8h K^&C9{ Ӭ*¨X[QBQ*+NPCD4[(Y+$~zKmR{ 1i"8 u.N4l2Qm7]o~]-օ^5z]WZ+K/~ݮfOv<ʚwĎnP$UM]n%ǵM2ʝ`{l骣vE+ݲZݻBc,uFK-QXmrK)zwzBG0쎩Z(X2Kr c a6*& *v3ruߒ7wbe+jur3~뙥bjN{Ng2~IR̮Auab*K\V|_W-U*[UvNO-WuhxZZ;4Tu,8$^dxٶk{]U,z8;q>Sot%SuPlw G.b, ~AVtԚvܢwnmnK/ܪ]/+O{Mn b̠0vEoW ! ^[XjqJj'vs[ Vy^ORjST]㯇2 ^SշkZ-fX5ϨQ0Tg, ˍnST+ CA:#RELb7r.T M, ]/5ilV5dnzr{n+~ ֱJnsZHf1EC+uߐrb.Y\-C1V%xh|Zx­(U^s<[N@p0V͐tGXD|[|lCd9_mդzC4G*4QexDũVWkiaX^kSe^t+B\i(lu%[*Yfa~^ڍG#՞s %)R7Kff٦_^8Z^Ūu/"è7[TTlS$՛~]S;s$Qq =[rd(^]voZZ0^YKbYYS[jM1-HmfusG~k2ͮjy8*U \"Ljf=u[J\dҶkZ1[3L%$O:Ru:HEOҼXTUfP E$$TUe5'8!lMgvqͮDJR[vm$)=7bq,)UZ^=a,Vu:rVmfBS?Jmt~/TE_c0̵n0Ί)^/WnA Hn߮0zEKr$MZ'1R0}I' ZIhi=J,B%A]}r^ɍjWoRz] /6u9\(~4;^ES0[G-{U=FZ84hHԛxSKN׹Kay\Zj6D.IjR\jAHBr/VE' u"- [Tc:ׯx[d޵Ίh-Ъr-5gW}g^ʯ]Tzխ߷}[cJTm_r _*JVzU+. 55'ml>EV$]]=;6 W++۪= LWzZ/[S7ε~q(jik- 5fV왝]tNl^nYY^07uUU*Ū=RUY3j5 Y\ߕEc]`hlˑY|Q)=Ӽڨz[څUr1Z*kjկ{ORVf]ڝ0źkί9[ۮ }>GTچ-ّ舒S2]hf--$g`ep>_ڥffՎUd-NQ0eǯP%H+\UjLBEْIudA#*ZjW΂׬izr4:{u[V,>)U,ˑu+fRV\B(:JVluEmJ[' +zb8zVWp|UT*rwk%GKvӫU* f ơ ZCZR(~h:Hp@zn` A`7 Iv @$TZ-Hkn:SkitIKz멷Ų\cLN's%EzVi&;8E/[^h{W EgUؔ*rZK3^,)-IrKe;# zĆJzXmz\qX-Α U5StY} Axubyf,4t~A,^Jgk~KNA1(%5Y5YM֛Kabl50mjU}yMZv4Bݧx5[U}_mAj$L5*FŎ6vu ٮzvṋ.TN+JL8:G[엝zm v% ܤT]t:3n9uENm5dUD #=J_/^!o(zC KD#)-W4~{yNcȥ25{hinuJ)wvjU$Gs~N-A02w4^Qm-U;k^ڴ6J'UV:͞klYSMmzߤUC2T(A(*SC-6]}VVnW+KZsY[AzJ 8^VjU 7Rj~!Klr_zl6G{KvDzaPJߖԱ؏-mmUʕX^RvԼ4V(UZnͮUR cxՋZj]Yo鵮lnaNQ[MW/ZMi߳ _GjnUv+1%nFn` ]f:dz4=J"5,(8py>ES*i'Ƀ2r)yUۮ:uJ7U*ehn"DZ[$M^b_5M5Wf=6%,SrdsGsjKjIjyĦݲ\ \A ܮYd5ehgVeԯ>V^)VKn۵z\X*vMhZfIJ#ofϮ hmv=ˑ[9~+暥.sxŒ-wKYT<_-xEc\rA6 g{vZ(X 6ͬ)CSJhy^߭YZFy&l.K}-:SmOpDoq4.S~YjNG իr)Q hrA _ovA$WP[/%," xNf惭%Y%sb(d~\,aM;ZdE )\W6+YUj{"2Mӕ$rdI4zϩ62$RK]e6O|S;y.)7 g;kŮƬm mVF-zNˮ+*fEU]w8! h:B.ucV,-Vv jE`ka vױ덾ҭuVu{m^M1\5[m{}Ecߒ*b(nӱ{Ug,rO8b[^AͯhTӷoD'k;-ݎVR$AX[n)͢QYoʆzjGfT\ipQ;zާ،N]iwm՛na /n^vH9[7ӷɍvIPTc~޵U \Ao-pſC#uBReh#slV$e`NWiUU)[T~8m=O75_0Y~Qi?Q/YfKP9fULUWQt[)>0%7J/-/,~NWͪ/(nj2MYSG0Ů+<'VZkkLиrYm4NU&uzW2R[мFCqbQ:`mKh {W+j%PF9((sz:#U=3|ߢM{I* V)=j v^v3s˔6( ~/u  @ۭ7v ߯^0bfIt!0m6$CdeTjFsЧO,hַe-Z]:=2E_V-+ q'۪Wҕ-r~y-MM}>Ux$M) m`6n) jY)áݚYѪ5T(7jj{u)*^M9T)XiUT-w\G_HZ]4=֮lm]E,DG#Fj;E"7.E.rMkcs;++m̵vŬvNϠ$]T#(_g)VSgto%r lM9_̚q,TUcnrծK^O.6TCs+C4-e 闤6m͎l Ϙ= *n51JufM.zO^ӚB k}flSݾi9旹R`rXѾnegW~A(VTG/H-k7cH!)-{bèr/{ .r荳rnUo7%wlzI$ImS>dz\K. jS^3:빊`I\ _Iv!%ScUJ.6aZ[),-F8V )ly;Uţjb/k V "ׄԭ=hU] _Hc:_%::(Izx%fU$hvKf_"-Kjj>ImMdӹծVvVTS*Nve݊[ %z^A/[ԻRͱ]7+fӮUAHcv~Ao !~G^7b7%xx9_]j_TQhtcAnG3ʄߔ.W BRY#꽊KS^lȞ]-(^RhvjܒOM)ݷqVn0VmU䫧K3;4~k%g l:bv9zT9*}ֈ ! Em|݊:rQDIS:]*6ӸN iRYA2Ē]kvǶ{m٪JifdzXW<9۳}U*ԄZݬ,WY-*WjECLCQKRijaS 6fTQ{yL^QT^"er+-fB_Pߑ~\2+J )z)[XX&8VWV(Mq%[kR^WzR̆0^Sk^i4C=% ]h؝~%XMM1D+vT|KrE{JA GK$ؒkHeiBvRi6$͔}P5U\UY|:Inz~:]9aj~Czzii,&xI{Ț$VzRn (IZMuEc ~P._=#_P{]+mΓ$9^n%wiQ .D^] \;vŰ`(݉2zwS,:tf.-D] Zwn7Zy꿸.bVM;ZW Xo+ͱ S,~9)rILj%Fiwe{`u[Kr)E{\H۴+$w%.~jdS:܂ 7)~wݦX.[&ja QZlVfE5OW}Km~ckFPj_Tvս^liڒжrov^i1fϒl}s_96ӯ52^7]M9ӕkVA$v5Q%ZzE0ԚNGWSٵRK* !I^"6ԭWEK+7 oHF6[TUYoIQ͂P,xFOg&Vܮ!ͮ/ܢasXUT[m5oJkzUǒMMo6qUn; nJ;>ޯiO QYe3uufX:f\ZRdꄒ[0tۺ-cj$_ RWe#rl^4rnrE6[~kdDMrd4ZܮW,ɵPպdV^J$"6̖!SV,s=9bjި+FgWEmW.GsK͊0BU*W% k%L 8KO[\mZU$a>Eun$]׬G.vQE%j`ykM/ ҋɩ5^fH, E[>]tmYo A.}h*ЯY"idMQ, h͖Ul-imfQ vVK.%+vӛ^\,Qv46lͪ*zM r˪,}IU%gR]R.xFTY'2ROɜYhŲGAxM%kci WsNNj=CoW Ž $y+6ߦj7^Cڽ8rӺů!MZʺ晒= (7:jLq˴w 4`)(UU-AԶlRf~ ԯi'9EUںZzxTY%Q.wDo:QjQvY2}~/u$bbC>tԊRT1mdZ<^rnzIkT=UCm;j6I+4K[sYjk/5B@BՑn]roMn˭`Ԩr^ ]+zpnHr/%d6`Iyzl ]-UjUV_|GhYUWH/+߯>{\vr`h=Jm]VdO{Sm0bvltr&HSvM*xOsѰ߫yGlU(n2^2-Vϐ{߮KvTPfOiՂf׻rU(eE[T&Y'2EoT|n#s4Y)[lza$(R#:W{mbljUݪk}If)HgU>On[BNv-ME v]4M˫~=Oks Zm`vvYMyg9NMj_կ̊*wݦlYj.KSb.zh}GRI~{^i~U["ȕSU9jWknݑӭ<$Й=, \#^/ 4j^<$`Vcc5مRq\_[&eQ˅ ~o5ϑ4a*zA؄#5r9)j.ڑ&YE6}6LnWxBEk5(hVjv]oln0P^g$K;Z> U/W %k]-*sV:RlU.]T4ۜjzIk׹&g ^,]_U{mKfn֬JrZ#6]K+a[JU(=U.J +Rjֺ^, Z+<)x*[߯8b~oؗKkɭ-ͭ]hTnigO.W]l\'8f"j§ kY?{%vuToMs&a=^-x()ZEvkRv>>h[v,"7 I[%C ѵ4 3%Oc״ModlͻiWKWGr4kRݵY{gv{xR)[lGTecU^L5zݕU3[~ېDس ^T&Gvު\fk]Qfm2juŰN۫erҫvmY˲JT~b,QwLV67RzS֪+K2P}[m-rc/2AnW5;݊krAX^f+ RG.luԖUG2Te6QcĨz rŐ^w b7$" MrdI?)W*u [j֎f\rk>,ݯH{Ԯ$baՂM<8me%&Ri$KC ҕ W^\mܦ}%/E ])eA/[nk4]۲޵^,(Uh$hu=*6=TzvCVZܔZpr)YYWыZ;EZ/Mm{Y9{U/T#<mSrY'UjW6Z_ȢmmOV^[~_ܺ=xznhMC27]fJ/kz.Otj]kdMeGZU4-kvC8ӵɭ[lhiL-ϮZڴ|ߨջ':= r4_1->AR^ n3+%Ug֋f}VݲRZ6dx/,a6][;NQow(c*W< d&{V])v=ۓd>!5L';zmzCPVIuEmתOᓛp a2 v+`W ]wc7(lbVH6,Rg{㮔=7sX&/ޮY+NO1\Sk5r[;RP+tpVdkU1;)SGi۽DUnHS]%oUU˲{2jH=Ul[jPuB]ZZl k~Sn*}:P$S+%`[6,Ub_bkrMS;rA;%Q*xIVȲT+֣~ArMU{vGh]ơrwnW]B! HwZݪVPIMSSRC-lu MQpܩ^qdi)%yj㷎կj%nh:Tj{Bf X{F՘ v4~G%}(fZn9%۬fӻ^U gtKE<+X%MyVu,OYM%YtS[Ys]rRȍ')wU|>nMŖZ}-9UT{uvgK%Aon j&u>Z] A.YU$ךgr*o$*-#yzê(U,SPjк^C~ eSo1Y(ioٲngx h klUNjMYlUhM-:*5$SՒ[uKZeWmO9.C2]N,_t~^e:n-\& Yإ .T_lv YUjmG﬷{WmmP-3`%)\QDXiJԮi<֛%t בk-+4=ZEEUcZݯk^i%/I~)}$բma 3 fwyxتNXX0^p<.SZozch kcMKK=C/In5be5RUX:QzV RYk#jGqn4Y eQdUV˕U9sY[=7j/$ϢJLRZQTOW~^49}v)4{bKUn6\ֲZvl `xݩ)Or[[K;|EvenɅGjr]4 Z]jVf+[h 4:J2Dz_w4ҫDXZ4{Z.6jwlՌC=XzmmoZ_abvAl)ZYi.MnQnvq/2VMeDW**d\jlS.dYTsMn-9]0ղ*(rk]-YfCm0F#E7Սڌ16O5Rl֦ꈽ^E6hVYQQtu+Z36.\77! K], fKȀjʊ1jSȎ>uFGV"WnOZ(b! M/=rMgwIff4jlvg=ihy4|rmvjb)~$;%ˬZS뽿l h? ԎΓnhu-Y4I_mhV+\IL/)Zܪ㈖qdwc F&ݎ\ðzޮ~A+a`X ^2BmRi4}&1su^EWKvYs+ȕK}ߡdӐſixAŪ].bv+VW{Jdzݞn8nQmSFSXjQQ˭^K&[;f* nMR Y$˓]/t\/K%w]&MVzY.x.icn\.^Qt1%H7*5IoהWr誎`=v[p,]1#; ,ܯ|[o<:Մq4jЩ۫^9#땚Q*MVeJnGDr0J~*j8!;UTvkfǛvfE3v_zsMY)7JQuFi,bՎe\YۭU#hVc V5fU}lh$yVՓߦuB5aQ;zS5i`1]g,GhU[cf'Vx-=J,YfG$V>'W*Z($8XԚ2imu OWn^P Vm Fi$WPY&NuOkJcaPZEozRifF/J"s~~I"8~c8%[1v.mֺ6Wd_[\ݦů1n_-l)`;ܜz~rkVu>v^%!VIlМB94Z5jG6բϖ~ v'm͢bڢlZZ}o(g*jbIkx>MAVnkjڬH A1%\'vQIvmzKh}J[ﵺ}o# fKWrYmWZ[Fy- ko7~[YjLvVQpV=.j/=SD״[t~&+j=aZenk=MV|s5h5Ռ(oiz֛NR(*V$,!ݢeTRK~pU=Q.yѭٵjGkB}keǪlj~w+nx5hs-(LaqiM4~ IR6Ն:.knlժkj )0C4OjzKfKd bWn][4YBB~,w[Tï!XjOn ugUVKЈmv4bz(-ҭ>q麒! 0ڜJ~]h-,v Zq+FRZv|{ƃ*&5b S5 -%:G൫nWjRR[}W5 Wަ=E;2dN+^UTږqݞӐ{Q$e+j_rY5,Sdйȃ\vvnCo(zK[aCC0RU>TjImN",W|R+7ߵmsK}P6j%U]brv$By~k2Bb1ҤIBTZB c,MiZ5~yUҊb,P}ܫRM.HmLP-~#tDrkR%Ի^]£in3g{rׇh[l1ZϪ2ܶ0j۔ Vt{~v!fM5Ն)rzb9m vj M%]1 [;ծc3ثb'[n%%o)wjFQADUݶ^ﶛg6Q~KBxN&l։%kn_oQE1#f5n0-z6I[׭bC*SEPKklnE1[5a-ŮPX# }bq%W;evҮݚi¯NR_Sֶ. (}~UkTrzuBV\TݬW,r,=Uܻfrz'`K7rQebRW+jYf(+_-թbZ2q[ { zY*YjZVíuQUO0,Ocje)K[-t-EkBCIk^U~~YǷKZ̺_Oóp ~̮LS%ol6HWڷ4[oI=eֶ[x~ro5nb'Zܩ{:IBɛIZ٭s^=ͪ r[l)+_`M W+~K?j,:GAoWNd|S݋>NP{nm=Wq^nvYLo>߭w^!ktٱuYv9"jvƻw{MnaivjC&u4[5%YZU=ʪlW- t˄Kw=mBMoT{^ E5%ɴz.G+rOz-lfސZou/ײ rߧ#/R[]V R{TF;fA5ZrҮ8bp }L'2K>Б*=W0k%m;5VP~>.US-C-UVgv'v 4\ -Veͱ^BU6Բov+Ze4fvnQUQ%f=R4[[0zaZQ\j-bӫGU.YSUfCsJSS m0יFw+/"oi X άunؚXZNVFjcyU٧7Q}-5Pnr+*cw-eY>'zYg8C^Q VIPjVVL#5VUqD-VtUf裡%#nmik{ٓRxjkJSa*(#,iY}ӝ$;~WVj*a]f_USrItWvŧD.*WM0e^":jM*v$Σ7-ճȊ'd'Z.իm&]5[v AO z /%C_wa˵w0p5BÒ2qKs*=_GiԆS,zmΞі2 b-!+ nZ wHXV%\Cvެu ۬jWzERԤR6Zu|rO~[%[R rTFKmUJmIm` \nj]SRq1{α$;KmGNK[ NRd*~ͭJޒ6KaJWj]f/r5t ŲzR*xnQX%5|n5j\=evە[&W~WY[noh\foUKR[OjnAPZ_mk S+dJϪwdYT-Bc%UpvgvKD)jSpZrwTYSUꋞUbC.%_,)NK8 KnaÖ$ݴ+y.XUQx;&vu2ԝV6 NSRɦזhTjխUd){zY/#"Mɰ}fPuY ϫVcꍩގ-vs*RM%Sh\ӚU>0^[ŒMX;$'%_.X-qKj6 g9_;(\WMe)DA 'Zfzԗ2|fmJ5RN7Yf*~auCj$XI+hW v*ɔXgjNޯ}B]Ԫ%XoOzWTFj'Vjeuo3YĂ,ggSEGl,Yd6vۦy\˞4EWjhu[[ѫTExO.RJ-c/QjVֻS~>]e9e{j1 KpP5fWyrˮ[!nhjwW{:pIZaՖWM6r\e}VJݦQS[Vqkꮣي7fRA( [CW̿o&+Tݧ&KC^ n% ǵqjdnWYZj[lK)ؒ%O2wͯV(7+]fv+rxYrĂ#݆uA@^\n ~b7__.(] 8z+v:_%;/؜Q2qfiUvU!v-4NI+e;SvNJsF\k2f*-Мb'S~:7z~(zU(zch5TM{MCVcymFcܺNgkIjbdvRXNK zoójhIP*6Gz#{l6jjM܂*o:Z]v4~h+F^+5wKKr,3g$G IHë+S2/۪ZuKMYiu+~dϒFY/5ۍ2[VRV6S}sM%UgSz`Ԇ ֧6,՘KezX5E R^{-Hne U]ﴶ^^SdaVOtO BՑkzտanu"Ԥ\lmMEzGs⠷ CZf6^G*~'̢*kv_/|wl\~H)ϯ$*෺>UrUJniM132'L~eALMQ˝u^\ZW;M]X:Njm:e zMKQ?M/zjxVMnjO]e̕QWh٬+ dz rQej+nYvZכ(+K0k\,:^lh!}EE0*5{Z>G-Ir[: ;2Is'[:FG6n""Q`4-C(8P^Df`ް/8+_;vKiR:zZ.Hƶ^+VSRIrC6)y Ch ĪHSے㼎^ 5 Ps ߑUe[2VS ~_*I;JeSY \Ӫ+wtCE5qvjHMfeZ2)NhRY4;Su 9f_ZbVUޒUg^ݣJLU*ͣ rMmX]Mm6McԵJ]fS;EE;NQ3\I1ݶzPKb]X̫Ԣ5[vޕZK ~W_'ꝫՂ[zM'WS1 mU5op̊YWԂtU쮤%}f5 Xj'|fA;,G~]GtnSs\ n7zPn[ӛڗ:YV\m)z%jH~êDjK/;*כ-í^6=QnM-̶*QJNY/SʞWf{*:]Wz;Ͱe3bͯeȪjN6!vh43-nJ)yrîڬn("o<6y5\iz~i~_o m9\9Zʹr)QZ.jI_z2f$Kvmuk~UJjVgGڑıݳ]]Mˡ$`պSު{^[Q53%,J~՛"9!9Ȓ"X5MݦVo$tzPj920KR׫띥6u+}sK V-Vi.#x~ͯiu2MUUQfSa ^ԆDM/ҨNazZ]n̉0Dm,s;uܩ4Ei~PkJ4+ֳuK-}Z].TK%-'R[dzTJ[C[qD1-O,tniU4'UOaH& oo-G˽>d)5Oz~tJ`7l86@C~# zE+X/ ïWEG׮9@w|ɪmVkuJ*ӫ]~g`3;HEl.z.]"QhZYֹdw3VYjZE'ZRX "Kr!_vrXշߏMq oI-jlixTZ0hꅳjwһr"zgDQR{RVJf[4+Zmr ,iCU^wrW\ v֏4XrKOS=ctObWѬeR2^_Q-{M*ȥ6'(nwɢTY+7)ֺ}h)G{/mKh9f_4ݮS;ՕNRjA9~.fToy"wja WijM+Wk[Ǯ6@F+7 Cݯ %5[2T404)jo=gҫX%OW(~tJF{^@fѭ)V0*3H"ê۽Z]ަ ՊMkw BT{ۦ.nXHt9~^6kK/oB[Lh;Z^#ng3Vj%኎Ѳv(]vwrhw$.ꝒhSj[([j%' kS<׫֭:R[ʦb]MWt|s*P,ryѻuZog_f[ZPg ~O$.P5JmԜîK M+ͺbI G8۝ WCrXo֔+zKYŚ۰AXijvZ/hz寷Ji'S ~aijIM]}]D-UT5#l)RXX/qmJsRl_l)~ù^E1h^gURmR1 \/ u\^כT&r+jE}c<*&OR*XvSupj{Nrnb3x"c MeRRw&V%mb-V5ԵФJԺJgndMtaH[ ŖW=s'(ՎWj,v)T%j]'_γm=WUrfCm)&6N,Zc]7Rran/ΫjMRղRX  qk)6JQn[6.eIѕr*ue:vWGfGx85ra݊rNϒbE(p2w6X.,QiJK5W׫Y*֧~$Q2rαβ f.{b_M)@WnKwNѤH4 6t9~ j*o7[8o7_1VpQK%I׵n7ZF䘲'zt>* TB1U |d7V1]N96\0 Ů]-3bZ5IԆ՚'IZq+m|{$3J%]KBbczrz-fjʚ[rky>o C6M6> /vJjNŚ˯) Zj%R;+[/ gU'5a3^q/<)uNE:>E8\nc1|괚]dݒTk~M=k fZEUs&VVYJITMZuZ킡hGhYR[rL.^'jXoWi%)Y8Э-QPngUZ=f]5W1eGɭ'laj~˪v+*8)ʭj:8U=abՆሎZ5VvW:jr׻MEW%5[ݺRķctfbwlў݊EEfAm(K݂$Ξ-lee$Y ]Wkmo-/ZE襚\i~Y4k[WjIrTE ']_O-*v]viW*جZ'͞2 l-W|jZmۯ.իkjjVXbY-vbk\2 _f&6&IVs HnYg:5fí7m86,Z~$W#w#8ᠠ͂G)Uۺ-WP&ٯV=hR1;?M^M蔿x.Fck ՗]b%U tRv[ 4K1ݮFmy#+nZ -u#%1r_r+Tk^,۷2j~U- j ׫b16iҬp.Ø o־vԒ=%;ҷG2,ȔWSp g(_VJ2VPnm5ǘGZkɤSbn+SVAz^ggSVI뵩5۫Z7j燐n[l]lWU\lW}W,h=GL[]E6֮{jCZo%ꊥzo +_t:4Rv R_l\[sWƪU1Mw~aV;%'݄-KrE;\,eҢ{٬Aws{K[gHMIZI왥./-z/bn(U .}ugTS8FOhXK)mFel^uX+ZŶ %ٳ,AZE:G2G.mKY0K햦.e|"to4c<u_6̊!\IvEǽuٖjR.VĢ#yuГ[axͲ1T$6]lu%,S*FV9*QqV FWXBM ۴jIkviЕ-:ֲX7i-u]}w~ zWKkHRTkeRK! JK)D]mX6_c 5UzjXr5-M[U;9C8b/dqkجlMPXTConʺmhҠ-_\Mx͒׬u.T]]Vfsj[wo}LX)~ 7DZ3SȒ\=fiYZS?Tؕ*nx2,Bj^Vŗܮ5ʦ_V5.sW;0Z~P*]ybȈ`( !aw.߯cH8!X8FS-+I>Toی:vШn{ZG3zU Zo*KQo{N XRv4tW Do~-ߵ= E[bԛM]zj*EO,VϔTv͔>WWkbͭlIUR鼻ᘎ4CC^ݦj~+X;ɱj*ݞ$]1fq6V~WjA_*)zXps%Mv&Z;~l5ŎS,sŎ$~صTr'WY"l)JzN)EQjrZ-wgUV%V* ~3~-u,^[lufSXWFmc'jU(-ZZdnygIivX,V*;6RӚ+FkcW߯-^ͭkw4[ov.Ū^1/fa/8bSd AAfTgvݤ$#W;Fh̥4 lPڵ~)Wo4 q>\b#SvA1$.8vo^W@4TqFDE]֣t P+~d6QQeTg3j3 cWzs"m=KJuzYl=QP%,t튮NujpjFl(NY-']?vrong{Ҡ^Xjz=6vASSJ5&~ro7MmZeb:]/XrK(mR:}O-{z`݄>Ouu^MT4[e-[EKSWnM\[SRT^-՞;q{%^FQثxi4,ʎ2:ǧ5%nϸ^MǯS«e)jVb(j'\˫֢ғrG mf!h,![Z6P/0+!6ʨknvKnDƬVuFRQ\U6GVof!M4,)͵ECXMK7\ ԐGr5rf٭ U5):U4KE^QvAT;oU4VZ$9ʨ7-ʝF,nM5nzr?`UnъR\,MbYtܒc^#5Uڅ֖Xp 67Q-[YOKs,J Vg:vmRWW땯VԂzEc R2B̈́Z`IZqjZ]Y?J4{:z~e T#V> fW o*5{ݒ߇YknR nGz!*xm_y~uh^s]*Kux@ jtf^oz7z]0zAkmX>$ f;r͎󛎁i*e&н ,Y}VF;Τ2 cf9+A@,=Y4=H!$wقjveYhxbdUrY6T/v)QKC۵W,i[ \qskrCWbB.;uS)u+OŬ},S-8(*QwjOTaޖ2/H2٩HTT52I-{MpÄnr9~u5ajMnMߘ}zkvv뽚DS4rOhWT+S$Vl\+W&ܖ~Wu(TDJ_4{K`KJһvt=Q1]zdfuv'E,_ken ̒X[;_nKnHrbw ZiKP;Xպҹvuθ ?X/< S6,-*W/󺑪^>mkuOvV;bj_z-sn[oBzS߭מճUSo7%#5u5'7UD3IvU040UJSZb}|k\6k2.k]Kk:PrخP"IԋܭT=ೲ0zVn5mV]zWWek|2WGй3KfYtz=B0#4vEKzc4F@ m9_ZU5Gm~O5p(Q UЬeץNVٻ3RE9:3p@aI =Vt ĺUg7N;nGK+tr("[f=?TTYﴛ\qQ\aS\MH _8WZuK6M"ݽXwl }%٧]xf*5r58]nhr;fT<]JSr $>)wV5ZIR54]y+ZB$He~`Uԫ>RY۽^zS{yԈ vS;ŷ"TԑͶT-U{jI Zž\sEgEZY)8%_$HTo~EDݐ\eRm[cJb,?G{_/5W,bћVsviϒ(^۬we1uKӺ-tfUKr ^Rڂ٪M^ۺTj)kyfФ&3\ޤuȝ#w,2Z͒3Uږ oAn2duMfSj*gѷ׮[{E4ʤl-Xkg ☝^cc \MuĿ"\FD7ՂsZVXs[ I<GxؘKV-.-H:ת$ߵ>mC:~a.*UKdYjx-_k`WA)2h O0kvL .n5^#s˜C4<.6Nȝz-R$X%18vް ^u[%(*I=cw~kztY*{VyGTm'^QezWbUYv];hٶ՛Wкv2j+JC+=ZݐUJS1 K:j5R5[YԊUZngvGTvͨIKcq=WXܯzJ\k,݆I%GK7J۽[+r-'Gl$h.o6Jz/)kɾ0uEzzG6^E+w;nw}(+X]/^[1yb[nk~+Y廻{nT7%VeQbovIU{W$Gu[ka6ѩ nT Cԫ5~Te_+01Cd-nUEy+R "^Iq^li\ٙ{:kUU|r_:~To5,vnX z ZkФvVlSl[4ӭZC9.vꖡw++ Q~íQm 5GۺGz^$ZU8%6͒lA#N7}~A$/^b_p{~'U׻P'Z5:XXR4͆(U|[c[*r s4,LvE^WIVűkn^Wz@ q~ޯvE )od}.Gaw)D8[5inQ|2}3֮]Tt}-4 V Ye~2ZdJɢƥO$=oE-u~SԈO,uP[)Op[&A*VN/}=qeؓW4&VRnK5JۛX.\:b,YNmWEEL*vնc7{:]ֻMN˪5GmT^wTmi{k-V0^.Uʵ_|n[9m]zv۲ܶVD^ܕ Tv84٦ܗݨsL:P6 {>[kPk'8-e_bS4VZ2XM]n=:\uIͱ9~MъQwkf_jUL" VzYz4ΕZy$ArSNQevʨu *[SBS%vVm-W)ZYȵ2z&Tߙ4gjDUWmVlխ~os,A5e=LgjUnDs O]SDk|[J~lU-=Ϸr]UFevj%k Tu|%*n_3͎*jVk܆YW~B*.yѪ.Q-.]+jMVZU~kM4I~S:YcKZAj^"^iZol5WbKjV/l%֋jcMܸj^hHeԧjqݎXs^Ӵf SilJ.^9\D/xqyyu[u[FIvV,L.%[UZzEuĖzge+VOvy$Omz- _vJ̆2G"e Y Cp˼¤),9:3y/ E ~dFk ~V5[iYuo{-wLٺra$%mcwnI M햫^j+vkˑe̿]^!qUmu SxGt:N^M8~QZR{]njUӗ|$yZxMUzůD"oF&D6 SVp~uֵZXeU]ҢwAqVfU깵՛RмNQR̞TnotIlfWj. h ܯr[\rQ-n|G%vVc6WRܫzNRԢ4g{j[wfn.j5{pV008^ " W!y `NvW{-4Sn:leƃBN{kQf~&ifRmLod5|6СEJYCKcmzg,]oФnZ FO+X[7h܎Ky~grmv&Sj::ZIl=(؊#5,znG35hfOoTJ)riVp͚VTV5-SoNC|#;)urEi:M:ީHc q}e #({}jW+إ_r+jj"w_0;`I՞>#v[Z.V]!%(t7(kmJA+xuշQz%ub+\UK\VBjVd0-ɮbU6ckT4am%#S,~4vQ]%vO/_VnΆYV"}=atbϯTMA jA2S)^{m\zשvT+LcL)^f12+%֫]hիgyUZ=E(%4WDU/{.m|[']4$U:}%굊fI(ѽr. ]%ڊP=-C*j6Ϫ5v1dvKj,mjV[,j6Vv.a7\íUdȅ*V]tnILn{V9sKsuZel0^4Znzp`;Eq,G@@<n*ֵ(T:Ku}_Uk|Ziq6O,Rc*RD J4eLb,2'ULQp{+i*rr/j\P,(j_Վꉮ^6rY1Ю7.:YoUYrZ#55rWĖ IRӔ8^ 7 \W|.w{2n;"j]_VM4&הVܞ"ܽ~-7D'h@hp9jwv $_nzo(Q$e%!1$I,kdBK%ĦIvXS1%gn]rQzt]TY$&91VVkP+{v(ݒlHjCY JRzJK*RCwTaJSs,3DOkW2-iUbC"gVPDz}( CULnr* zA nOPzM@NxBֱvUڦ\}fM.5D鋞[:uܐ,ԫ6r~o-M- c9^h=[(H-~+o].]\t\mrQvD0]a n՚l3Ybv Պ',**Zm|*K}W)R4"e)D[d}V w}ZôDuqKXk)jukH2KElYaZEI"RrJseљeLKSix4O:ҩ\M"+[\[d0 Y'^϶;W麴l+>ti-2ԉUcEi ICt+B3>-V\ZpL{Up]v. ~wi~nk6઴5 )iE-զ[ '[T\EovfeCNC'r Y6}[e<M8ەˮ|nC6bTlk,Q W gŽXr^ b=mkj_.*%,ߦ-GK."A_unHhtS%gU$cQ !.3*p+v^{Y` AO3P[}aF\}SdG@VOe ڨ.F+/Ͷˢ%-(2Զ jݗը Tgm v.6Rmivdc)$k[V;bxvk5St!^ӲW/}M_5Dq9כ%ZR F0Yf拏^d9Rǎky=y (M.sZ3+NmI) &NUh;\eOQ+ݦmY0\Ztb-zm~T/+vLjn^E1ThZVy=0^bMmIվUemW \j4떊X3Ag&g^0EflszKTQќZ:\jRɗY)=dSKSIsQi. [iZp!mN [چ9+ ֡SLbREgl8 Q4JpEYJ-6E)*L"U=jvfi.40T-WZjՊ_t˿|I-VJU_k°f7jJH䂩w.hr3z_m%Ϥ ]m^+7iFhR󹍮4SnøۓZuMǔzU,fvhsEKZjT_VOA4zɐ?uiN߬ԎU{ZFkw wn(vA ÐQy@@ f{YGkx3ǂOzΊVᲚ]/=Y]KӍIԵgQ2ԭUJXsG*jjU^ZAj腧֪5q~iiEpt,ӫRYݮ5r/ޫxUQ2I#׼QՎ-xQ<(I5:7[3.6nMԽɍ$2%k̭us +Gݪ]iv8i*ƧYL$֪2zB8,CH:24Ut CmRrʧ4*͞\^ݮSn~s*8n1g2f͊ȽBo&.bNԗ Qe rfYj݂4S62MŨy5cY_ϩ岨W;nO/vjl|zdyԳgꕢVjf򊔦T+Hh{vQG+c0V6_iuJJȶ<UdG.wed_w-k^_>$k4NAl9a'"n\tHtɚ`!`Bdrn7G욎]` S[@ phnq C(u"Q0s_|&fZa^p+nUvʭo|=IPlbVb׸o4y+Uw .Ӕ}%ĆmW^hJV'mM*r^r% N2Wkr藌UVM7dVWWЭڜ.I|YkEb4:J#[cJ˫7{"D YER ,)+5<6̮HnY -5aVd`fK " PWzVgW^˫u,U2oqJJ[ҚV+vծṭz[.eC8Fk\zRG:B*SRI&;eV)3Q.lץVUTI,:NսVÕܮ׬W[xuvW,g(8~ٕa4 ֻ~G[kj/ 4r،ջ1zY ^s[đ酺i{zqKj*fʄ:q8gɦӛmY,YX^va%e2:SiIfC5Xnc%R+OYrޒ$lE[ŖW/<>n:õ&)z_KX^E7%[oluRvx.o.\ z{,Z c%-ޡu ,ebV,-mۖTv)4 ZCC״FQ/S׬5nvyrA@ Ca6z_0+ޯ~$0\i uEo1)=js]~د+9BT"uN_q =W1,ԙ~t <>ednKPi^-<QKsC-jզXRX[s Zw^n5 LX rŴ{l.ѮIb ܮݚW/em~?R[462%tYBpKv/; e6$U( bVԩWH2ݒXW- (6Jr޵蕂Qɬx}-nJh5d"E%mbTΞ'*vGvkuOetYjGLZ*:(c5Mljbm\-LELVj*MdM뙕$7=Q\PL͓DrC5e_p(u\2b)3wdJSTQj ͎_#IuUz1NQl9Ylr6ޮV4/ŧ xۜ_ (]qVGk4 Vu':YpzmKutmmz^˯ n1RWakSCGjhkN+7Y-bFm󫭚PuvZv:kT}RnHI*$fs`>bɮfRͮV~ł\k:VUL-%užUumTr&Y%wGQXֱ s$})W(g笗h?oiP}myZSLǮjh;Z&;J@ *٭~/ \bw [-!WԎѥ6\p#}JM]2ݣYU-_ȕvGѹ^Uhҧ:frkvVriL5N_hw^_kY8-߬_e7ͺ {=C)k>mB׶.Fɾ"ZEެxeŎ)M[4I~&NUwVUźN&k~_MКeDovdt\-jVuUk-"xo:ogUaVpcջjG+N_;bEtRy4bG*¹k^s6ֹdgͱZ/u_[9ՖX5녽[łZ+4^O*Zќ߮K5QH-Y]928js֫2SuTgwMZCPiwK= {wQ֪Z;tɬf/ vf(zrmIK=nG*W]i5): UՙNɔ=Ul`7n/+NqX zI9E\v]lT̊}IV0 zMݺS(# er_ˌe8UQ/Xz_2UO6_݊Y+ ՚W]Rzhi`ib(^CLV|In]XXڊ\\]o U$hf˱}Q:{Cu0[uK3ڕbzmdT;eek ܭ[f;Z26jg^kc"CA3 ۱ {MjŬ⚮2}EAT)KK2rE:.REi=";`#z0HjC^C  $ʳr?~CyxVr&oi:-[fgVwu__o}ק4_VSKzG>WĒ.v=GD ^֙XTKDK6Axl]+ze*sT bKVV4L]6&śԾԵte]VnԌVQ4fmV$-/[# FTzڑ~ Dsj ]+1ڵW )VvkTU*;͚ }ozrxcS*=EQeݵZK6Rѳ5T / ۮ \^Qҋ~艏pUQu *TK*7Oivb[BuzS& ndZTTeQgUbKLo5ΫEkTWkJvnd{ۛZ)ͮ7ﶅY*X^+H>Wn_]q_n~C80 ``)?V+6;_ԩj,ܒw &5bQ4ESvAiw,)f,kPtQbS=UEzv+[Mܽ_nZh(z7Նشخ`ҫSKiJ[+$ڝvvgWHbת<"bd^q8MՊFsٍ3K&yVG,kmm)ʞ!ʝM-C WRܭK.ݶYM ׼䈂Vp[ci)}o2gq>Ue[]zϪWU3baZ]n7M.X0mtj C$jUʚEo׻e7mp4rXFҬZ-z RMnI5T~ #uq Sf.nz5zhFUsصOզ4tzW7RRP*JI $حܗUKVY+k}S%b;M-ݒYݲP2jajFi-Rrz58ʪ]YZB_,UhR~VQADSlTjZ(k;l2[$'ɮWYnSVa-z!״~IFSӫD쳆gΜ˔\,{8 WSD܂Y޳Ei n]H7g-kIe,%;XY,~ï AW 1~KMB @ǝվKe-Υ*uT w-wZKҼ)᭗kR? {T.ѭ]1NMnZ29nN/5|۞0wfM9\&kbV ZJY;B~O7f+c^v8s7Ѧ^6]QĦP]JZ Gef3t4r+:V RpeH۴t/3\]vv%:{zOJ^\ZCl|FEU\M^Դ*4:q[ZeU꽎ޣVJqWk`wMMEA2z<~KzɔFc(MvLdq;=8\مCnCo .E\1LY[r͎'YJMT-hi,f3䚠Fnd_29녩&nI^ET박H[r Q5Y@,92SJ[rK:"PŪ$,:,*V֋:4j!}~$-&j Y흴Ñ+~lku*ϔ2a Zu*ٺL+*֥he춫ߐnSrzVt{j-zG.y|GVv*fΡ>]\SMkE ZC9fi 7 kB˫Wҿ%K״%~av`bKZQY&yٮUfY>%U2C+6nikZۖJ!0؊l~96Q:Nn:gv%Cru);۲iv"{#w3I6fA-t2v՞Qj%:Z#vF(Cw~Kݑ (vG7Гd9 \Z~TqrWlHde9NgMkv׸j\r29nzՕݭMKl*f jllwIj;^HŢlԫ~}6$7bT?ďOeZAUO=GzFc6.y"+V+~Aլzi=͗b$6U`T/-pj !RMYӤ]ncV~PZ-I{m2A*յdX]QRW*l Dh4d֞ z߲qVb.FUdj]r$6H(q^ۮ(ȑgn+٘[(."TY;űir깴vMT jEtkMT3zEՆՕ!6͒fUU]A}frMvxfM~#PCh,ؑjݎ ]0 /# Ɂ *"zNKrjOڍǟKOX uVoIcۖۘV+>ϯ*\79n˩:ݦJ]E.^J;l|G:^cӔ6-1:WV$};h֚kƩnJOmKTZ,r hL='^ѻEZ4IMZz,FWZ噒U_Rv+v!+yr,ĚajݦXJF,5cIzmQ.GkV:2Z jJbF9ɮ+q rU]N^Ϩ׽mA;bf[+&OU=!64N,ZZh$.9f H]E؝J8Knn*.ax=[BgYy6S(d*rEV3ղc(nY-G.g/0K驂s^Cfn͝KkLɶ^Z2ɷ\&!z!vr`~Yys4VP5óK U-zj0\7M R/z.zund5T ~a̦rVbܾ\ͧ6n80y(Gei$&E~լMtfTJ%\+];zZuzhݞY k6;%-Y\hrq(mWX,Y-GvU嗹vr=)gxrTn&Y!Q2Ƣ mPi E+JTV=EITzi,ŷ QkkU|sdhf*E̅ A0VC{}ZբUZ̑ gǫJJj58]R٧r\gi\.U>5eb+ jv+NӲ=VsƢT2,Zb7]:#4\ozSi`fe߫Ȯ3+{ǨlS. y U,uSi.5Qf8Ւ%.nuZkiZc.UYg̮1|b*C_y]grVotCd/vɯW A[v+ U Lq^^rUsK,uՖ\m\vd"Z-ih6K(v:Qé95ϑMC,eNiٺ6^ilQNnu$Z}D7#Ւhɢ8mñb(BmS/hN٪}S-C8 }Iױ|7+\,.u1->+Ė+.Y|eJkw v[YRyԞp8jWw˭?jA.J4`ۥvӭZݝ.qr ֺ=WTX gjKj8%_nqZn׼rzijFY|贜w]JGY-zu;R Rw3~i+.قH541gt։jһA[ՎGٴSK>'w -4M\($-beS]RJ}1 ȂZ 'RMpPU|X@V g,^-j߯uynr$T~QTjmxb[mX~\^]JgŚ MZ ESzGu%ĦkkY|.4͒b6eRѯ>fz~STs4nyojE?bPsB0(_CPZRƎ4#{,K%WĚ>ިK VmX\o q%bN:eNQ1V\u+c2zFS tZ.*G:^&4VGeX~! m"ײz;^RjE[nWD_`P:Nnq{EVn4^oGl̞/vɪ؞٭^]fٌel_Jh&{nKnvv2^Ro3;5tU5[ibh5&_kM? zU$XVdrIm>uj^ڻza!wl%u˧uՂY,4ah ׾~߭C@_0~oz. v[~AqْPB*4)|S)=Π͞lVZ-zA,ֲ7ܭxdHMە`Bc"+\v-oAjVL](G3nei84Lgl.MU^If]uMA{aZe*)8ϤTn5DVѵ㵼"GRbΨbpjw$Ţj]Gh֋2qJlĦU9vE&қ=a{]k[^_3*ehbwV4MU#rs,q=w鬒kMReE_$1 ^p j gW{$N,˒^i;R\3Bug,-5&Of]}*WXVq~S*'LmzX<w-H#=~ݲ'f7fc5ǏyZLQ="74-բѳZ~ ܦ~U xF7{z'͊'V0N[ƒT+fm$r'k%mhA{ ]Tm8]Di8~ߥc(w=vX2zA+zwc C,UCpL~fR-3 n-[fr/j2h-^|c;cuNj땎^~V V(6F+%KB_,z K%ɒܒc Nd&UW1bu5UR,VuX,dU۴ !NS%+-MUn{?~E eXona}uB# ˯VNuj_K-2yKͦ땻2zn [r3Xur-m:jĢ^2s۩:V.s|3ДvKRod]9x=|gA&M7r55z07UzR TgD4ЖjrO9f$Yfm WxŲ Rn4*NC\Xw 7\HnQؓˊZwעuZ3ZZ.JJZӌT{V+WKj͕ [<+׋ՊmVyikic_]Fb~b|:I&ť'#=i;`{E6?q͆! ~WvrsRjzJ%b9;or R8*؍G*P(sk.HEKDjoԔiSS8b+Z~f+mgzb%+g-sWzE[r)Z.6tvӏiʍ&}ZK)}`fY[** cUž1U'znJ\Q=& j BM ` fECz\Pdے+j۴j^nϔձFbY~'̕zG[lgv߸8VIVCɗa8JW"W/Sq/^ⷥvUu z+ݞM kn'ׄITp|mךJYVlߛZA꘤M,Nv#ъ_%urc*k4\ZĪ]kK{٥n\,tŴ%֨19ROX&ۺYwŚ:mlFmQprad$~G[iz>$H$O)}C2Ԛ9~ EV3fVW^VӚbլ6KQK\.(ݯ$zŰ^q$WA<p\0Rdlۯ5[H4ې\W3;MjMZהՆl^n6_mGESާViJqcbIKb'Wٱ._ndm+>PRU骲_nۖTku\aNPV+mvq|8j3KTWP%|KǮFiZloUxu2;sv$]YU\~*Vv4k*V۩fJlR KujzǩMcUU!I'ؙ~VfѩTz(b<ɊT+bhN*j׶^ٽz>5+{)K 18[իVXmCمbªk66~Wɭk)I%/,kW=+7r~iXr]vm rK4zsњZ+6+NMqk%Zt޳MZv-DKm~r٦~Ts★ѫ 跴Z鳜׋~g|v]+ʪؚUuu5Y}U5ԯ}z,oϘ V>fU-RlrbR_zi75&y}/-M\ep4.z_) "׫fi(:[,8b!Uo`EfrXpzq$bٰ7 Z4m;^gUi)XRݭUM# pFeix:ϱ%ײZRWm.B5)ꯅd]o65RꂫrxGtervZb]V[kXzm[)Z/8솢w~$+rÒ (π.f2΢QCeP[UG/CeQM۩-JK*a+ҩ5e"9HZJVӪf,"jI/ʥ+vF϶]VuGW 5Tɒ  7{zHVd5:d4fZQ)) _g96gvN^ohz.Yn"yS1/^GoR~הuo4m,tz30^S; M)}6Z,Z4=qɭKIrMl, ~r\+Z#ҁJZ(bѪnۦmXVf*X*qݜY0VVrMn:YR$-6 ^Z5W؂#V[fY+K'h ܦjXt04ݞtښٰo:ZIvr C/<*e N CtnKΎ5fɮśVK2hUI+u,R,+]SKʨ7l#mY3JXAbۮ2jfN dN_͖TJWzM֩-kEWSgLۦb|͘7?,*$dRD:ezjg-2eX4`v&6^ziy~Z܏(چbbpͶ)v_6^;k .կXN+Ut1.ق8\f(ziU,٘Km:ޯnCTj~L-f%vE)-2s^SfmQ Ԋ\vtQmԗ*u8ũV yuCK{Z~&+Q\HnFnn^/4^~CdH`!pҠUe9lZ(Z~\m鵦'=8x I=$),MSmՒuL#e&h _KnM,J0ڢz\CbߑYn(k%I۴,U5CL*RS8K 5Ϲlx5NY8_6̢SlsV(Zj\i۶*.YMEJ6J|Y@ ?8+v_ ~M._#i FSgVގX%3^(ymٴ:hEtM<`4UP[5WPɎٯ&]lh^w=Eܛ2,dmS0Զ5R*7rT6Z::Md*m% {%ַԹ%i˴m^$Wlf' DnUjU(W5,5Fq[5{]$(kM4nh^RS.S6ggz24S:":vSˢY aĻ[+ms:R.55*8lZѬ9-YܕՍ`ɭe>Um[nT`ĺa~̚ *3!9+{MH)6_KVdTTXi n\YTSibUi3 Ӵc/~-O9Cw ې,_}Ůw:)(0\]LGLK(7_j˵zOaܖRPm]~.hC(4DEQ *ܽ`y)EE5%Ŕi2UƶEZ,ֆ{mxm6SՌVlU6dy&WSRiolHWYvCkz_zJ~CmYz, nU[Ee*-mSCVPłT*FU{Ou >[c뵶_9٬W_bTTl\J}; $c̦.uI|eyfo ]W6E1]unovf\1 C´ ^C9 Jٛ.ժ<u85] ~M K~zd44|jݙ_%UKB:!,ͿFT,b>d-+}7$e^5E.6EZ\$:cyZDHWh]ѐ͎$V^/t ]G ]vMS+նk(%nnѐKPJAtHnUԮu[j6\.KыVfۮeEf)bۅknj WGQҕ^ߪ 0ubWC=$/KHv&ʦoj2A6 &ܦpVYVqKjg|tX6 nˬ6<wU-`yOnb(>UDk:EtTIQ>r+jS2*Gan0 zQ+I~+ "b*.a{4+ X}\2T[kv$kE`z-\luwo`9d NI{NA.j8Ox^UTQ8#իuQ^UWMr^ڮvmG|NH[d-e~CkHJǐnKK[2Ēji*.j/>_(VvE/+sۘܭw̒nLUx*fG v啛JUXvVmr_&v4 iz$®%(g/%MYjg OŒeAz\$tFL U:/|Kq/3h*NSuW- :ӯJU.^Q-zr\0E+x@Q(z] #`7(zS/--@RpW&}o :Ǻ+쌾VM/vrՖ1uUq-^զ[$ټ63}.hBE$(ⷪlZnWNЯxUUnʽBKmf U.,~4jXVdKW`=9zQk rYF%jwVZ36Yݦ^.q G%9ٚ[AjmJǫ[.7.aPJNݫRQ{;.yW{|Z~CybG{V`]2^k!EIĎ\ىj&Aw:ZR:$j֓:{Bm,JeԻVkC&ۊwޯiE+Җ Lmjj 8VlME+ZOi%ivOr+T7jL%9_[vn3K K"^Ә%l%P-Wm nST1Wͪ*yV״4 f}WPߑ_K\\һUZlV $ =+UZZr}.%㊽؊MoTCs$g";nT՞V?ilVc2^ rr߲RXXNkz(M ɑ sSQ%lRN=#nG6PDK+S ~Pՙju!{%f5SVtmjsf(v^WЫJ4Ϧ{^ٶ(W#n%^Mt؜2{׆*+5mUen`kͷ0 kM4{͖֥rf^7+VY4J^yUhvh~sz8ET_Urv밉OAĂ'[2I(jO2ۙ̾( L2IorC5"uN,vuԡm3G(tЬҮ]lzنnlvR:Y rR*ss+g nYm5zEBDb궛}۫*5RKu~k-$S:hCvC~PKnGdHZT)ҩvNg((8e,>]a6,Qۻ5"{4Z;9$]˚Jj]> 厢$mk[T\ z׊NVW+>Q+嶱6 (ZںWܪ涊 j-W o_nY99&ŮSq S,"f_t{/ei)VSWZvϒTmD׫jrtmh4"QlaoRMV1$[β5׮%k'JnJvYdg+umzX*X((_u*eIj]Co pz *V iTϱj6mj_tQaUP[)jpncg$v<ܪMxYeZ虲U:nEV[eVڳͮtr1_(M`XvN]uk3;'X EAnGkë8uvU[>NZjU Zy+E[ִ%,m_jTeʔ׶HvQ+R[%95뜎r%(ASZh _N& mOv5ݲN-"1\-L"E9F5zR(KGQ,WF5rHjVvC~:jf~[#CX<+:,Q9e7)4 MIKxn+-4*,{WD[MX1E5[mViX[0_ ]7nEPԎ_A/(nQE9&U;MTdso2_TAGWp]ҫe7i9ZS.V=(lt_/6[F2N)jыbG^Y%,W/yiU\ ,tW< MPү46Jns/8O&R4_-sS(bELip4ۧjE{IB]7d_ !V5!ixj5a ~lׄ kٚʜHtׯ0fSdk@nYeB[*q [=jڔ18MQ)e)z )͂,tW4 )O3RʹZ^Oh5߬y9]Wʾ#ɂ&lE^h ^I:\K4WWe%urWbI3cljה}׵R/jp^fM. jMnXZؚ]vnYTd8F]w"oŪ(Hjʔ.O,)+Vn<39߫}zn۵ZT( (fN:]8uI.md2v jۆY{nW銕fRm~S4,ɪBcl*Vv-h:2wWڕrlvU*SzWJ-m^gRW̾%[n]km*6h6 r׋r奄WLݴ5cW5jP TtJ.8:JgyŢUe+ZSˬ3sj~Yl5aֶ-/wGMǫp5r*_nidNѡm,~ֻ] ^^/D>ҫt!c(ˍ vQz _ ]QEqDMs|d>힦wx=IWZ)-fɔ2Y;VMhM"QuBOa/4+X2Sb(BF(ARpKeZhY,6kpkahmeOZ5c85aZS,ڶpvzTm4ܬW-n/|;[nC[h/iK1Lvhڬ~OoI[K-,ZSX LE]땵s3e.%Օ4U.MnȞkFn**5,E'^ҫzPt_x]/ =\v˸׌ j-xbQn+N2 Gzv_jK2-IRf9ZxUc#G1zl"sv_bӵ|\nK pڣz]ˮ9(zԾ_7&Ů[7 Խev]+ym/X-NR.j%#uQ}]Qu- zG`uWnKنosKNԵn_>2fnwI/_i\JIlQu}b;=Tu ]u^ܖa5d9n:jJ Nz=aSChŮ:Mk6<(S{-L%fi # TJ݊_U헻^cEa^gYrŖ^o6}I RSgbI>߭n(1j,]c 8^qRtZg%*U~SYk{a܎USq`i{by?c,8~m2l/ a):Mܓeep{*ӐNW3ަJV$l8G:Y=nU !J~MV\;zK^oAI|5`2Ey{^v 6UUEgt&ϧX Rꊊ.Rneo4eP luůz$ 4GP ݑnTd+ͭw%w +wD6*ԮZn\zF YTFַBP~[T\ e e}0ᷚ0([XG(oͻɚݨRx4@õķkurHP0ePDvAk3kIm}OsRkĮfN-uFiEA*j}m J#z/#~AR;!5 \oV*>dY>ӱY]\;N樈Pgf.k-Ŵ;_䙜w.]ST.X t+\vk~Oկ;NӮ&RMP*XrOpYFGkhWotG:qmmYZ2Af|SUXTZ6j2Ne~*jqoC-b^3SEw~*5Ez&Fٛ-%V T)ѭ\T&j/֪1j/vK-RP |vJjbRSEScf~ٓRf}}jj+f{^I0Kv| \ooj(U͊W.|mu K7UDE6 Y7 jKZ,ƩT-qVjt&bvޔܮ׳%azy6j7$]s*nY8Z k~OĦ,YW-U0b+jݞT Ӆk_z'L zR>tچWmcU \jmW5C8Z1ܒ._=$S>ANQ >Vڔjr0byNǒ$O+nɬY~Mk; %Z΢ٵǔSS3%ǯWt٬!S5ZݜhV$Lrc(}~MV3rbkPlJ+USbYYrY fF6] zuI.t[,m*vfjCCҬjX2ͨ脪~v fnP>Z0Fdh a3W,7$ܭ;zA{\;NVϫk&S>;A(i5+BPi孹|KߤnYRQ~YzŬkEn_KtrOojSbQv6Vy4z[>g[ ^uzł[u=4JS^ovŦ uj^OU xĽ:wӻծ{N&a[JGuRiX[4u(mVlzjn]v9&~jW/^n ՚toj(^YjJϬ;^j{FeV]PXjw\NW赺a[lX'F 6G-5Ql;R.iX%EkW YrT j*[k5O0^Y/U gݴD m&} zvȂد;zYJqZC{bRXr~EnZ3('ٰ]) [XW++^EzJPϪc%CrLEMU?E.Gq rAJlu]CKr/|XvE"^,ŮɕzZHFI6A& (tĪb֦oWb݊l-duj (j[zC}EILM̅{yb1IN鬺fO BA~dqP)ĭItZX;~KTGTfY*MeW|*+^@iZ_a+Eq|2 rYˎS V=ndlϭw4-TJS1V1*&-.ZoWMuUZZJG$.KNSȼbv!~m~5Co 92Zk4Qbxc*c:s{rk +h-ֶc-Q6u(=VmhRUUU wXuKZg5r{Ւ]i=[{(|B] ZRWzf:T$Jo6kvį6Ǫbi{ݲV4kjM-[dYj%/TDZj͢ I+yb굾z)9ZsC PmZC VwWmLmUeI.C[ZRiͮv*9JͯIjY& |ݒf[otg}<C*͑lKm.I[qHm6[*NːjՒ{WK z]xǂЭ4JR5r֞ITy+* |Ow>X% CRU,UJӦ}z[4a_^+<>{PzTb]zX>zzpRK~\.eU1[3U^G;[S~_pj^k:ܫ+^WIm `l"lb\2+kY-(mX`~gju.^U${ѫK3CnvŎqWn\EO':ZI[wB^$ \S0헩R:^a<5v|DoWҬs[.]뗻.:Y-lɵPreFA('x=.-ݯW~A vC1#)1 QԾVڦ‚4r(>_٪Rv뮹aLS j';y{,$ˊzB4hy-E6]R驻RBE'5e쭎Zr`6÷斡\f25ۼf˒땲ZnWBjժP6rߴjB[ej*9ݻMRѐܚ7-bGu\xC̟ju}ETj-WSn]̮^r [Z]sR//4V\_$v! ~It*ror^x|r\Ys,,oT\na4]`fz_`7h\nږ ͖͂P궛^)hdz#7xZ'&JՅjy,m\jainYѫz]W醣Wn-jGmdckw鍖KbNE;_.ݮ(m$*{W+h7\]2bԍBMmLvK%O~T+P;j_1>,imOP57FAyHw6^X^1^iք&δ)QW8)=n~Vᨵ͕p)FYT>[{ɬrWwSO4ZgV^K(Ԏ3LvKvfqiݕV5x Rj?CJzɯs,^O1XYM)X-ϴɼ{buR3Z"/]˒vU( rI]Gۜk r4S1* @ 7X@+6p E],CsVW&Ħ(̯(H౥'I#;KTUMwujfW' dWβ֫\뵦X _gnZMo͂7rK.Wֱ5$I-/iUv-5륆ب&Irjf\$:vWrV:aKU,]AIjn\m)nǫh,J`iuK(Ȗ Opt:\*XZVNAdzzkMz}ubk C.onIU'Zfzt-3RV]gZ!k_N_umCWfV :SΞU(e Qy]︚hQ:5JXjՙ2[ղ6߫\_] duFl+B :a-"Fv݊_ zCK۰[rp#Y&.U],lUU.j6W:^8ކcJ Ѧ-^Y>eRbZ%8N(jb[(s5dG/g˪ͬTiEQ<*T +nh>s*8]=&W굫p NZTZIlQ,obOWn.u6dWaUiRVѬvYk%m ԓtjAbj~A(k4ZzmLR'zS#fUk mB,zEpxUDIrVWKSLAЫzZؚ"%l~[r]rac-VՎ ]k\qv+MǭM j+b-]*oq㗣u:F[vGfCY \Te{~IBJuBVPI6N/=WvGԊZi3ZjRBa/%P/8 Zn,-`--G*:!:+ , ZGr UqJ Kr[Z-ͪUecZbT>jAQJٯW`x͒m5^N.5QqvސU^t-s[ ֘ڎ]= `HU\72!57Jmg-;]ZVɊxS$e+rd>jmueSO^ŧoI+](c4EvzjGW*znynqzH5jrjnϐr{E5_l׬l[4Zap j_q۾{huReGe%M+Uj:oX 7՛*k~]4G{mbԢE TכݚU5Zi0g -EĂ%M2Xl~K$ڬDN.:fJ2\SQ].Uf+f:jr 'x'NA vAK["vIRO='٦7pMGrj(}rͰMn+-gEW*I^,tkUޯ=v7_ճ^CtwBEiun^Ŧ5;[pZrg=äfgS+fjyvsou)zyLͥt׬rsV[fGoXфzpZkE2!" 8n :ޮ ~7pKzG G$]@4DЛ-/ۢٴZxMJtQM;t~kvl:/Qf$/j4:E[6ͨO_ɺk&}{ǬݝS%\s\-SgEa%9fb, *[[)1T-m~X6M^-R̆[4Ǩ]TKl(ywzW| ](š8:SZvA0z olC7c eLn>ձ c-ɌS{^iMӨ++h^;5ű.K~E,]Y.JKdֽZ|LѰm*w(ikc)v*lbXvD9DS4l[jcke5WBSȕjų=vT,S5jRs zu rVzh|ުϹقX/\.+}QTPFWcVngO$^V֋F'ekݵjNr36*e*6j,Y.YJ S}Uo46Ŗ\k7kQYu )zн*NR/E]YQ2kfA:KM[JOki{%WĶROϬcžh<Ǽ<03[%R0|jWkzK:aSjT~`KKY,8_-֊ܖ8S+|nEr$GnW,#Ѭ?:7PJ]OrE`vdK_=[,)biڕHQ]$0/d빊!GVٍZl,J) \ov1ɖ;e^{_? p*J"4n%h0AԻz ~C/zCQxJL-*th3*_Ri*wʼv뚉35jP|hW* CuU|Wl~!Մ>SsXXz<8efIr^UWhZׄwJbɂ0W,e+E[`n+kzVZm[mZZ(#JNa7Zzii xMYg ]pV*|=jlm+b˪ijYUIo|Yr1fnUOTzNnѤtAmr4uI'mmt٪܎^zD3PFQKjfI+PL~jK6%k_Q0#4S~Z1nK[Zk*ݭ-q*](V-tۥ>Y [ rJ+BTn6,a[^цXk\jU׫IuWӥZ-Q I6lm5ZfG]7,%nєT1 utݖRvm,(mjں p~ YmZZ2_S"fP%8#7nh2f;[R,*za;>@NZ%ݐޯW(# [^jXZpJUt(o>Tg[̳i%zhM0S[m;Bw}2SAk;:M kWvbsLw}oOenZۑ:v#7W&!_×ZIuJ-Uk\mFktՒ:,RVXIeu*w:r]Z^ dZz\M:~EjT1dzRإtrβ{mEeܞ~GzViV6_M cQUj׎ljRݽJs[2mE 9XR3lEӋ~ I3WULŮ>t]bUͽKDë8Mv ^M/UJWov/wVIfC5ˑ i&PHвY#MZ-QЕ Zfb[qĦjeEp뗊VrɮvMmד[ma9vUE9nau;z0̎ثEAr%Qlw$bk)dmn4aUiuf/~kovuuj6%H[j;5ǤIuN.W˶>+7Ď*Y|Ǘc} $┹2Y)n҄+XVEڴvf3/Pk2I8|oǔR<ݐ]rZVbWT75 k_2.$Ի]Shk&8S9:IV:Fj`ĩ Hj[N;VVz7rfnRy*L+_   #k'Fp(r_o~ݱ;$/(~ůlZ^MڎiMҧECu[0Ѥfūi/. .+r[b-uժ|\kj Tra8'o_ԫDTtm/2ɲ r뤦A-FmVZ͗46wYNV~`-C$̞Vnwhz"جPzm ZX}n_j=^ݫf+3:UԽYdSiQ h,5U* JGڂ5^YrjZfV50'hr( ~WjG(ij3 )RL,ն$8$P,ɎJNWJeYoMŭm ڐ(=U$P\V*6[elͦMnUf+jY+Lm'*-j~˯tb^Wk0v k2I-.4M6n_j%y(-_j#U얺*G %A3fمܪSlǯG"ы^m|jfAn7[gKg5yRWuW*Z|[/BԶOkb='<0Y9Xѯxi+zVKOK7MH Ng:^]SQF,>nSdjxZ~ܪ\ M mVu-AWT,cm\TO)5vvդl`UCnYv*Hih.1 ^T}ˮzqҹ5#W\jX;WvibA kXiP#v^%_ovQ^1 bj V^J_ڞFn9rn۪zXJU&ǩ5Mͦ#լfA+v!Wvk, &N%锶_x :1^WY*Ͳ%*WKJCvbY~]ukGxؑ˝ѭ&J:g˞dH;^UmH]~4MpĂR]-*1| #4܂S19o{ѹjyŒP+S-O[zju+~S*$uO|]3>S+G'HKU#xr]l(fi-"7 iOTiZ,W(:Ďvj/YW+5_V$W412q۬ܦuԖCܭ^A`%bL @T aW #~;b Zv>K2p=I}.U](VWl뼦j՚VJNeu:HI܊b4QE&rKr_-G;%GvUpmzGe, n[2&궍gMS6TjɘYSwo1&ثZeF-U!.o~h¢f˯\# eݣ vI݆__oz\sLmPk!M]=]^[V3iv۝Gۅ1x@ H}Qx K95[VmxnSnO9݄CWQvOfI_trl<䳡]RUvd]6Kn8V[ M-(l%IqeOLm=Y֊JKAsJeWQɱ;XjybY'eS:ǪU]ZKq]řq~GpĺwA+׬e=1 ^pm<_iBSVI_0j$Utul=^3^P*BQ%]ђs6eŖbaUbf0]ZQ+$f6rTJmi5U쒿 g^ ,նkV~l^3 fȵalv~~蕹Zno]eߤgVk͸Z= j^̦^)x]0UEzLUfS] >lnIWU_jtFQRR̦7,oV*Օ[_5Qtjɧ9EƔM䖪>kK.W=m8(Qk:YsA @УT roWWI[0%Rd+PB$ao+:(R6U_Zc2iˤ~ߥqjKl6Vܞs˼u7 Zz29~\)vJbkUnjy+ڥES2ܞ#ݪrlhɭϱ[fѫbf4,yzMGP2+(E6[X;(YS*.2v[7 erfzgUBӫZzfKkYUk^M,Xsj<̨9#9XiJz_]Uܫ}GXnUnVCq GqoY%cЋv/[x^^St,JuϬzX^I+W rE̩[\o֜El~mX(TQDc)9$mlzV~^j7+N(T+vnKUU-UR>wzf%-n1ٵr۲*TfmV%r4N[RR+ƪbi(l7뤽}h%c5Q n-m2U..y}NwEi;^7{Ϩ<&7l߭:RCR5]+bbOG+((JvUVݲut,r_5K݆GKMSK.Wna5%CIZV,xaܵllu+5i/ArZ0\e;_Q>SXv-uOVm)\#Ȓbķl:e,ݭD.)괙 8`;Oh}@ P1z/KްKvű+Z*HFqQ휅Rj-Oǽ.H=ϱ³N -:}ytũa|fŬlm؞n+k("O4 ZU۶;%k++WTV?mk6f]eF*,l-uR#D5U՛_(ۮ:z,G54i^K6]#LzsT޴)vB[kvwb忱Her jկzEӄfm,L-za7T/8zyMSjW VKj*%rjBSnkSgzv[4{Uok6߯z6Ԇ)Ԗ, յ՝6Jm}5 ZڌU~ݬ[v]ѣTEF+Ekz՚c[k;ec 5HbW{>Z趼r  !;X5+>gF @#z~/^vG;VF蠌*"N)xj{~SS:|F]ж[ՅvU% C{atM"ϽWMߦ\l/%Йo[z:[p s4smcnATT{Վm]I.NK[nj6k"Ȧٚ$/08r-4EY>k{j*jSEMKu-^ӻbCŴ(i-JlrRJT[Z1REt o؊s4ߚnU(l%ӐNɒ=:h\~Fq^a鼭E͞!DTs]_kIJճ ^zeV~W-iפGmkv_t\ޫۚU|YJY=V9 jtbhvWKdSv.b,9P.Ozfui4q/2z-&]m MA@fɽvAۂ%y6ٯׯ54J@7`vmd6[m'Eh7n4orAKΙ~͚*BS\&6onHU>L,Un[f{Ͽmjϰ.ׯ{[ԮZU%E0zUiIٵvcXQ>QꭒepՑ^ :y;Vtz_ WԵdYEޖEwddI^SQ5NiRϛ(v4}iәj+ 7e֬mɓzޥVF{<[2o5&Jߛ\GZRȫKTQ*fT{UF)J~f]J?Evd8 kHjkmꔋNc+ %C̲Yk}$K zHm˥JclXm^V +$Ⱦ|^xMC/ uA3[j4 KYfif ӱH#4ۤf|[qkfKfR w9ǖAG d_7fmzɊn\AzSt6eQh_oW6ԭ-gjV/ҦKE{d\20yM` [*-]Cwo;Zmoy]!]vgqoj":Z,Gd oUVUsVe3[E'z:j]PdKfS*6yأu㺢m>ٲNYUtT/ IR鶴MVX*LdeܒLnJV9ZAݪkJc/5>2kf -4œe˺Z nic(o'URk5Ve=|BrnIRjZ6Z*C7.Ɋ]'宱]i۽anL"kꄶ^.n(şl^ofwJEe50.Эijw Dh**SBY+"j|r׭^w(S&aLjgjJ#6(l-MԺؗ֬a[bݲ qlŚSRGEi9sWd{rlrU¨Zjծ)#ǞTZl6U"Os ZnKj#ʽk=ThhMX UlD)7ݞ]v2 Z[n=tl6+u. 7d[o7ʪܔkrl knĦ]c.婲g FGRwZ;Ul`@v^/w_P$/(zE;xRΦ/ۭoI>0ҫ{Bfuپ{EN[1GW-b]jSvz}2MVCVg-#WˬΠڅoϮ5oc,jrrU]Ek=ӻfwV.`{v/h_iJ+nJ'uJ0;ߔ޳+ߔņjwrI .|,^-׭;y'zPS,ӗSWqZ̯4b_5...[yJqkdeb+qu(*W[r$vn+2No8em\n45N^LuܲVKR,mC4v2V(4T1n WժJe5"s]I4Q :nDE&.\ԩ㉶[ih fƫIYoԽfb71ua^_׶&|Z׭(b]+ m ]]3v {,i9x:ZYu g3ԦA7+/{jhEIdPYg\^ Sn#7 nw*7& }aK+k-݊N8)f=Zŏ"ZWJ\:TtIm4ubE.f+~ѻ,'*s H-kJ~DzARCh7U:HբW/D[ժef}VdZc!w*2\׺=_UTz'8(=!5KFUv u~K/i*t$_%2*5[$J%װԒdK2e% nX1lMSQ{;WJ(c{v6D{lE(h q^ǫ͒oUD욂7Q[ֺV'fJO8-WYx-[rrQl4t]SŎGudR◆ULtn+_s|+ Fۉ1rkEn_팒,hZznrib_K[TAlIGUSOx6mTDozf䦘Ӛjml*_@zVԔN{fv]W7dMrgNsEܷl  ( 佅M(Ҋ^˚kjQ\ǑCѼ^*VYgMKmKVTYn~( vv=UKimze}V4zi/$[Z5>`պp\]ak]w9]*^M  7cMZ`("E:L jCvA+n8r+x2H# :9^kIvN&8jZ3Re6W]iJ^Yn{U{jbR"wz6-wa ՛{hby`i CE&7DIkRChjgC(+M)^/Yrq9+KU&m-ygEVVTybJܷmUbTzw#updk6kmuK<ީ#ȍP64C9e^u(wm_z7;v3Z晜Jᨩm칚'Xvpf.ziJ ҙ/cZsr^8dJZm` r' v+t4Z ,]n ۫vP0]ǵ~DjNxKOJae`muFs٥{2{D\.6GbKP{Y4xEɮ-^)Ousvj6.F\m9fוL]k:uݫ3[uPiy^;ToݮT͚S^KRЫޔkk>~ 64ъT|~ vzPSOv7*/nJ`.[zeYxkծ9Fۭ߳a5ܷؤW5zvOV\U1q^rXWeXcWה籋5,LS+lԜnTܬ<}vnjMr< d$ţvUWrKzih,u;SUߦ+JCw\e8}vo 9(Eh%Խnib_^3:Z z.zCv (8!`('y\rϗGcd5񻥻Ii{ث/*RUr1ji%gvKRo^Wޅ狚o}eoVc:|լz) WW-h7LTjصLi/7GViT[eH=" B.xg3[eSnɆ-aӊ]M(<ޯEߨ;C+ʂۖkݧb ꭚM͹%a]A4Dk˜nd*KQʂbk[NkZV43vea*nCw/bunVaZv)l(Udn˥Z+ؔT.KoK3ōb%.ԫj%tRk%{rg_-w=Pn$X2ӧr[NYzt:n/H{7*}-ЄҪ6%֘q܆㋢nvU.MaԙzG|˽b!)7rg&un(5 C)4o[JЭqf[;WӱV6;}H&S(ߨZY2y/9VU2TafEdFoժdSr6ai[Ǧkwi.(omQVǦKnm%VzX\ ŧotJ5r]pSl;3y%SάNn5 N[ (ϰܸbay=8m7*uUTk~+؅^ V06zV\5rTfC%\䂦,G4/@GwJa\R6bŨ,]N̙}U5JM#U^P ";\5ve4^UTڒc}e(^7J#L=&-d퓊uET^f~ZԖյZ=GhC5Bk&wKz]IKrrSknai:!Zv'}*rK׻զ`Ve'(YuXD7[KVnK>o MXE) ȭlTB-r{GRY^5J(r-֪R멵Ζ85ZBSFb=U+ZE,~%\J&̒YU,׬lKUWv꤆ZLZKz$mMA+fa9X;r]˭ʞW>Q~!vW*J+;&(79]ի ;壧tÙeɮrmdrн54ͥ畄W,b)(f|Tj ӬhF.O*Bגʥ)5˵f>M{>_lkbWSnٗ[bȎX`w #h;C4Zs%Q9Faqر"ŞKlzO- (P FUv.ZrGz0K1dQ7(zm1\ɓ~~5ŘvUV+QnKՊ?)7lT +ݚɂv5'{zԛJ)T=FYU]bCakd=gRn,쭲Qڕ%2),0 KfVFUFf(# L E䖫\^P+,C0M+  CV$nVEdխ0Q3ۦ"~nrZA)7f)*:EָjIm 0&ͺ}Nz4;cFᏯHcG;royJSN N[(N6%gF'-B,jz&XdEX/PB. =brEj֙|eU pLiS ~u+o '-_+/:mɂݿQK>QSdBޥnGiůIU;߷9~x6atͶڒDv0#򔜮17 ZaӐ)ܒS9 zhkmѷrmJs&yk>+ZV,(JFëUկ)U\v=)>i2֚,;}C&t{_w~+QZ)K;n˓t5ZL8D:/D[f'E$Ʌ o;g+!-lWgQqlM^Ҩ͐~iZ>˞3;MKeUr$0d֮.(]oh[$c{kQyᚦ#{NV 2oH\=uGu*jS:2rWmFo/Aa s鶻FۮJRjI+m$nMP{o +O+ݪRṣ7둹4&Eܮ:m_*J'u+hY 6z[^ܑ\*Vr}aӫ`᳙OrMnu;K,YV%CoFKV,HRX*1 I9_t2Mϐ΢7nrnnTdfګMitK+T}Yzbwk+|#x͒Ď_6zؖZ&N_Uiج:M[~W[b%KbTܓ~Z͒TNE>!7*BZc U%e7JW,OŖZ/-c-b Ot(7]veNjɢ[:^Kk5bYkhP\3$輎Eyv4V)`ũht]j :ud%plh-Y%]jTԚo[XĘuc>ظ(?_kW^YY.OkmjWhi]I}[.~p7*uTr:/NU3˕mv^tfx9(61{{gg|m8eR*Xm6 Yջ%Qk 4QbiikHrFYhi;cZ+b(Vc ^M \R=/5j0]_cJ&)kuN׫ʰ_ZUج^Ef(j㱉.+rU]9[W S{koCSQY"k 4jԪQ1Rd֔TzP6)۪=3]uz󧶊̞#ѴՍиcUnaHGԋL+U]yf1_|ƨ*f)W _m5C^l_ E㕚--*V8喝%X|VrO˯U(آv)V4lUtGRA7k$K~uWk\T0KkfI^([Q:b(jKo=.tv@ȼvC-]0_q/d7$ARTEP B;vi{fuEKCXEdTIep~E:j_W.y2g8}A0iiO*FYY,tSLI[+KXf}ҩOLTxnɦ1&s(MS ]mr]{zZőzݮ'U ͞L;6SYrIiRLs2i|(;V6g[^Ui{[*rU;|tM_1WnS4{sP-:w4$Gif*n[W Rhue$Ր`}G-VzZZo9L6SahVhcj4^KيbҚfm:8M- a\M͍`6vCx{C]mxV&\[n(F[S _ìeO7Y-׼v.)vbt9fCh}Q9U6;P4ڐZqao5Dvp]qVO14v# ]]*]Kne߸; ,N[X{,X'h"E9d)JVUa8 PT+f,4ApLNj=nM'U*zѲ.$7df_kiUݧv*3*1Zk'9E_S9vmm RP+_mzU藾WDjur]slAMBU f}.ΧTpJVO>m>zYjv[nnz1zo!r^C ͱfB9nʎY!}^4_g0 }&W4`vȑeɻ˖ufu^ںMօ~(FtmV:̩`H ETMdQVMoפ2-)[6aFlm)WZ-`%j]{R-lW wݫn,t>ԭid+1Iz,wTZRktگ6-2uӉ-' X1 zzJv 0r%Ks,C,y:?n\~DZNvQ}t R1uUrRKߩtz.ժ7k=ҚXJծm=~k. Zf6U~(hR\p^ldjfA:F-^ߓ _6zA,TWV+~,y/Ԣ4v-E9]՗y^W$uMWLmB+E_$d:bZ]W,n/Y9z͕תn[MnFt\lNݔ| /7UgUu>"uѕ6&ɦ{͞[U /ӬZMLM.Srk!C5V˴DnSS URnsj\hzZcYgEZժ)}ˈ Wo|ޮWFU)n raxktkM| 얽5jᖭ\Śd̝yJQjt #UL\3e(qbI ZDYr Ŗp*smf߲[_-q JB,:YkHeMIQ%ivoJN{I0js ~"=XLjjવv;ߩtd]XLZU4VUSeFMvz]Yn&5˴~7#F ֆRXtN![^+ ZsZ"Ͷ ]eh.aj# fUi{vJlMg] i:vרteWe卽@kYZ$ P=)ۚ9DĖU XJoI]I8joWϽD„ڑv{Udz٦vZ vўjI5n M1Kk4FP0}#w s k4>jZ1WVEVfho+[[-mԚ}\](\Zc5&(mbOS;Ee0\`v.K.>qK h'2\vC~Ű.o(^Q{<АynBl^e*e}.7r=\--uvDbw v͔Mp scyK8vnS~y,nk[zMr%2grK*$RۯWچVyZKU ]6ݟ])jv! H|;IrQrn͆]7L洊f|a,>K [V;~MRdMo~z`T<~iYZ&:rK>SVSxJ4^P.mml-A[uYndR6xZef ndIt}W$rNE5%Wz"u-޺}SR%ؖK$R>Hs v8.Tqbv&o(=Mi%,d㖻-TUٰKkɛWMcj~Rf6YY!~ǭzN/vNl"nXuQ/vfo[:j5U1A&W,bVd]4Zsǵ>g/TVݖk*^1>]Ti~Ƿ&ki;l=K8r$ʼr_.4Yo(Jn56qtSWՂX^UV>?zݦ(x~l)~gWOU.51! ׾/1zٵ]ElfӶnqa+)+N$Juc'iVA4<ʶ^j >\V 7ޱna EpIf@ DU Q,dQ^oW=gQ|[-SaQ%SL_1ĊZ҄k;\TG1?iS۵kT+Mǰ%jj4|TKW knvhV=v̎Dx9MĦIk5L%KeE+-rNXuArb`$vF^ff7&l2[Z _8\{ez_ECo6rm]+ӭW\(-#;^GyֹQ#& ~Yܞ[liZ+Ԗh:mHsx,'%䴌ZԕӻZxvEVYZ ]է꥖YRaڅZGPMzuݎ[3'ͿOЫfޒjZifћ& Vr_ĮٕKm/ "ٓyUbeZ4%AliNҥUNBWGڅD 20_z ~M] 0bd\!`\ rVJM4- ۾KJl_k-Gov[mXw&uNWjՕu(m _jLS=,ՆUDSѫ_}EwڥZ.t^v¡w_F1vKku[wXJE s&Xz\V ^q~knף+E\Yڵ.SKݳŮt;hmõ/ Ok,m~ѯI=%KzYyl RdqqEWJ]FmhvlђRK=^,~/evԮP$8bVGSyU6ݮbn[{m c5KW告˩j75%TN)kbA,ǗZ՛V-Z*yxFZn )k|u;jY)^a ՚wej Nʠz Utf͸|bhTZU}\I\:kһU{us]kyUZh\ΪܚϲJSkȳmTbTsR*單YZzv'0ff{zǎZEWrjɢTwl1&$,}k-dP&NĊu*rqUhf^*[:ZAk"Y&C/J.Vuc]f/J0i «:RTvo=Yޤx֍ Rb .remMꝙ얨Uն{mzTEvGɭnX~:LW܍˖޴_2_og_+niIOk[ԯT{5Niuۗ31GmeUPjYm8Rm2ޣHT uPu#6j_-T;ͮԖcvXX۝\JdhvOdf,NG]>3*(}&!kbQpj)N=vfblR-I+,BKlmr2\\J]lp"jVmYrא˕KVQt.ob8o=".\74|zl7M"6 'yo~AS UWk{r]k;^k\א=cʔM5H]/U*k%c7,וzV#6el{EgmdvEff]eB\/rt}tƶjuZ1;ȑ]M&`MTʡzKS%jʴmzՒIe2"W^k6i9*cU諎tj{rI7vWihDnѦԚY&ӳ酽H:^kԦѻrqӔ4Z*j$}6f˗{QQM-Vę03^n Zz)zR[6]U/W[f!Y,h4A.UZA.&=zfDV_/vñ^^~o_ E^|@ ,$j)\+Af2orN7V8fS\R[VS$ihrWu̞RZQj]C=VtO:Cem{lTS-K]27-Iыzb RNɗvU4U5Qy#b.)ꭊm<ʂ]yE1b.l]_xO♒-n(H xm|,zAvX%Q:^5ZUuSi+=W*M I /XfYU1FB\Cn5˶%+lSk.GynŔrOkl\k(V%ÔLY::DZ EMr$ VPϒ)rOn*jrA+U"_[N.3K9XnwryUޢ7l&zS1F_5Ֆ[kgĂZY)Un:8⨓8&IMk^V9Y_hVWZfUMpmANszY{YMU*W*۝zMvG3m/󋝲XhڤbV"*U*۽k.G--C\/~戭Hhpn+ b`|vnr AE4rnOmC-ZIKWZ2T_:c=i^ՓrNGm UxvaMR+AoN/Px[7>OmS[R+E[w~Ak+8SwN(w0>VU[S߱+K0$Iveץ>c/9̧}9+-^.T9Nj"Uum5م_:Rι2QfvQqXմ R_']2gsfm_P~'mYu-[idՖM4JʔZ4Ӫba !:_MI\/2_4ga4eoJ#W7+m9߹uشnc*u*eIp%Ljk3KwJ2<8_Pvvz^U$*.VW1^Ϭ8͕dՊgu-%Qkf伄ۖ;!ЀXNXJUVbm'9nҶjQ$ݵ GW녡;1Jf/7[v MZ.)5 k)\Ů݂_rSlzNSTֱujԎT jѓ'}I%yQlnK*Kҥn`۝zE5⨔9mp5kv9ٱұ&_lŢʋywYK?oL=k$ܒaݎ\]Rak;(fY_oo]/8rE_/)ݘ' U5ZMUѴNS6Zt v۵WAtd_PlV MAݚT5|hիvfJӳK [4b{gzm[5ߒ̪Y/RtP{J^EMWnznxnd]vCeچx na[nג!մ-5Y6Eb˓ůYXY$h6yeXl$MٮڦC̢ Vɝk*^&LǒC sWb]RX8:Ve]MSJ7Vi B Tf/W+yN.m-TjŹ|~ˬrfUu;c˵rY)f 4-FǓMe5MkS$lKIYKx(:FuUFY!΢ig{$Vڑ6/{//lٍwy.Mkw%J٩N6}bMC{b|g[-W{}]JGS 2ȄkzՒ\1#vtuVŰJz]6O.lhzϭVJ7Ifw>m+cr{F:Lek!VW}ͻΩ6ekNӭ&ʅg oM\7bzJ+NaVkZ\r Mw*t.,oc7 %Y vIRJ=r}ǵbj iA+hj (6vś*Qtf`%IZbҼψ"i,+^kڵnuNkW.iOȕܓ=ϫMbKnsNk߱5kv׶fCviW<[Uvmrv>yvU|ke_.A GkzvbפZk4k_eO+M[.eZ\b;{2aY{0emܞ0>n vXax1zgٱg흞u I,m[VֺtOT _stXlSwZ߰<rskNb itEu*UMٔܦ\ӻO@"xau 0'e#D +O5jUq%jM~[hݦV[]gDEn7]K ߴA{\l6[ ]Ů)${wE7XJ+rՐ$PښnyzUm岈aVr35k5[Z^8 k NoUKrI#T3IڭFM䨕>.tvi!VUTdGN"+J]QOQeS hzk6KeNQ7uƨ+n¯ jV٦Z:{\EŘFUr3 )dǏܨq44I][ԹLMs-0cx Ղtn#)ru>.4I}z7-ӭh]r,1b+T'VUkjdO+AZs1DԏA*~xߴlIݶjщ2[I~\j).׭sϬ3N,1[ʗn_l9W\RJwn7+QŒbWNcfy{co}Pvzac*UiQsc"R4#(sM-9][-JJQj0^4K-:[S+N8QK#&TÔǢ}U1 Q* ڬtf(Giٵ().mm.ŒW|.sUaX"KV EڭuVg\`]os]+N8+ie)$K~sUC^aqmT'VL_jBS.YdX 7*ޯznwb(~CHk8]Ӝngvh:>^ݖP%/ 4c LIԛڷjLVJ[mKű+U3鷫 5=˳K͹oez/ߐ*Ym8FTQQՖL7 QL^5,ŕn<~KLCr!9#ʆ7^l:h~]fM3]wJS׊ڤ{aJ[{.kV`U#=Gk4DN9БbEݮ.Tns_ԭn#Wڥ3>ŰkJ3{5om:jf+=j*e>گmZi.z]' (W-&mw]+mfr6ai5Vq̽6]V֏鵸~fn7Z]o@ec|Q^"EUbT3A[c OgMKMӔL"rQilHS)Ozd*^5CZdo-NP MrNU7kYk5wBY8>zSnX=<,P&J_cB%ːP^Kj(-Ն͋mFW*vݙ)[+#IR6v,#j/*~Q ֌ QsTYTmUKf-dT[izofrzMOgʥayņTm,شEqb*Ig^J.jW[[3F[5n5"+p@K,[0`K[ovA. cjS[ju4̆@POզV"CfZDO4{ZKky>vQզiSYkcI-r#ݚiVuJi6LKrwv=Alm!kjUnM3SlV+p} V^˓ΤUnaQ{u+b]~߬:L~E}u&Xj*=fXV$7mjmK#>G۲v5䂫zd2j7_FU_mhfԫz>]reU]\eS wMϸ kHRP IVŦc hZm Z3jYV+VVP5E\vMgՂ fJZ,ݮ:e*؅n_mK%G;OJ&v\"[iwܵ^s-)rW$qkQ rkrXkh,oU=S/ ~K^Glu._ѱKvjv{岳vfNW0oh[T*[nnᗼV|ExՆntņbI,dr.BW szGu,z7n˪f >#߰7 .HjE1$~Җ@ @nj^5G)U f8l۶j6fѯuyj6\1{֛%TfGb٧w. jA:Mex<+Xn؊fp%(Ȧ֮~rTbw fSuBchS-W4vE;ܳnc25keAR > S5u~M-%VB^j35gRvc̅y6:L2.SvY3뒨Y~vKg n:Iz9|bX_0Cm̞uUvYJCp{6}W)Eٜu}⬷LFRzcUOkּWYkmWVcjV뜳v ^\*iVh"ɫ6d*W~4gg٥Zѝc7V*) Jbfvݭz$[}ӸXn ,vJ\5̊t_'"Hc6EC*i˫H1zGʍRPmUt.%I%QfZ{MnK^mc?\-0~Պg5 WX&WLߧ[2~oZl`v1kF]fqjrGn,3vK~"U"VDoܚ4fM:RيeӎF괖S*l`^KuBS=2\fKɨW3˚%MtԒkdSf"`xU*$zxT3ol KXfNձ_>ԝTbVer̈Bcqbn]`rG3;RX`dޫun~m,[XavS/G+Y׳nj[-7z;R1^R_BYTe5+ rK1.A/[*SZuݬQVjMUƨzrښߵ>0J^UvVkqvf553Ϭns(kowFumyOQl}U~ K,d텩RnoWqZղuN T۔(A4]ᩊnI6ߏF/eGQb/ܾ[tbvxot^T6Y[4ZfŨj! ͓n+xjI90jMzk5f˵b#](%AJzL~WWt55"씢[>+՛n44zr/*n"i,֯XR_vJS D4"]T ƪEmj]c|rIJm,JL+y \~l\ Vvl X7U(Td]-FWrX*ﯡu%܏`8[. N4j_0rz _7cgxl||AoώK;ԦS+NE׊jop$Ǧ;r!Y6%ݬx$sj S.w`\bzZzg7KbiŦ^keEnQ:\ukZŔM)ZTlz՞r5T$xʺ.K֚dUu\;SUՓM/%\njA|~d괽DTfWS-ꂆͻ#q[*vFC:5l*Ԏ+T+Y9yEfUilcYlV,.\/1Z6,&wT9g.5wok"h X+ krKj4e]}8:G*<ɐY4eK^oj^O)UJ^ɪ$9ngyB뵽dQsZgެ j%%Uz+,Fc^ָd*$[+G㼥5^[ۅ^nEr~$_Q˯UAU4]$E4We[-xkofM!lcrY\(gnwr-wfrO*iM[Wԩ<^%v~һvO 6,C4wuM9{GԆ()F6YBY-0N0&Er;nSQ F*>Ye]aLkWPyROִfm9*$1jZ6\OWz^m~iJsegwYk+~EZZ"U1; z\;`jګN]6J߯_r3[ժU,jU~S=qܚI{:5afEۻ~ُXTψp"/ ;zI+nE ~p$י |U.TܵSkt>U7͕4d"6>[0۩+~C+ c6bhzZ-̭q噁 EAm :ֻvִْ;B|7MH2< zS*e8͒&v*j\ ѭH~2 nY MX4B+ۚ*faj9MZ!|44NX{EN0˝ky *tlm;~&QjRE3VYmX)bu}[Yj[p)sWeLGVP-!~k潽ȜlzZei8VUJ*K'w '$%alؕY֋.kd \,Bu.^JUNlWlծŽ7&ެv&r^MWz 3GR)T>I{MI-x({n9P\SKT׌_mʢoulUptEZ{RNz3\9X >鷴*[bMzOhnQ6C4Bm4 ZRD_˺MT^y[#L[$ִfW?ۑfAx,͒s~Z*EKflr,UVE͊=qZE!n1ib1K՚PTS :`;seݦtk&)ULJpIk=6靿Or{%wʂԪtk͛ *ł-xVziT,r_ Y)Iv2t\zNTi"٬ %q^+r74Xb`|ӃX0*.¡VB4$y5[)3TO0 _p-nWR ] O=nCK~&錎i8IzrMn $ԢX,(¿+Quj]FTE#IeViV M*Ȏp5Prg@nDc:&kh%L) fPJ9Kpr㰋*s]zW}̆bcJqiRUR.]H*^_ _1vG zG1E S?lG:} IzYڏ_X.q"] vshWO* -3\98G$mBQuR_˴;~FLj-֙!|Yibǧ2|*7kBWZWV%^ounV%iZ,9n3Oڊ'Fї:EpuaJݢqņ[(WrUlt]A=|*N׮%UY|ORI45ӯ:ؗ Hz<2ϧûuw+(W5Xwr_' vQW# R$kkJI{Uu}XSO;̍^=rPQ䒂'v{Q;+mi7UM1D+vGgsr֬3YVٶD3~֯64k֤<cDQZ/#]/8v0ݿDn9Y2: ~ 2ŚQ*[ZS4Ymk\/|BgHnK6nrMnܑNIm8+-\xj6SL[J!E![l+\5|TYm,띟5"k4Crz,W+EiUSuZ2=EZkWYwAk^vFKBH$*>. $5Oΰv]tƬ9Wn\#U VA,}j]kFa4b1~Ѵd[ܳd&躶Yv [EjvtnEj:ߠJIԔN^oh3jJkL:`rzl%Z})5n7v_ku,%nZ9~Le}ޯwfM+TkP7Xǡ,%zE)F_Jn rls[H<ցuiF5Z]~[%XYIj`I5Ktr_Ue+I%ߴ|o&/^ Z2֯ '[D߬g\i׾ޫ:E#4R=f͞@Y(Wz%wJA9:z 6@Ez# 7C ~O2ϜPNOo:J'ڒkJ}g"O+4V,ֽtΠ(Ǹe_-Q, zfEz\SiŊfȒVRЊY3ժ>%Ϭ~~2/g'GN$ \%i;u^ZďI5o/PA[4 .;^W.3{_c'v6jZI `E1i%Wf}q(~.V{8?ClfקiU^YRcKַxk_UGz5RzVGXa%G7Im[5bDU-d}^l2Be5lMY͛ [^~7^%AlGZӲjsD8vǙ֚.g֋NA- b[m͎߯3U[zdZUvE-l5m{ǥV=S/kj$vyؤnm^/vA[_K"ƅx1=jNCpjɪݚV.-¥r0ͪzɬHEۥ~7j߬כ;nvÒzrE.Bm{ݢ,ؒt-Y/H~Kmz"&W~=-r-MT3FGqэKc}4mVߕz JݔCKD=PfGJתͦgS çs] Q߯vb(VZQuTaRmsLݰq2sEI-a"Uߐz|>"A5+^v-4lojʰy :o׺]kx~[W(YXW_2VOQKtVAh z"x#S=Ji5w+fϚći}VI*hdU#UۮvUTzim ljOUlʍN=^K> 2u]pU`mG0ΐtktxx`4%yIWߔm ($xMMrW7vM4bC빪IIu/\ixůfM g'\"~.ٵ^}4z x^K18uVcJ)be:^XXPOKZ]7`:b*jZnR+ʅat\q0EXey֮A>1BGM2>V@I^ X$ 0=0@znm.oWH& dZU| ]Պϑ+Z/JrNYh}dvh')PFf)ih7R2 I*U~ 7 ~^&u֋.A-mA? Y~yG}M+vKj^%f"䫜a-ZL_7ŒԭR;VY=Zn-52WU\6QD_1|^X~iKNIXcYִ;4j9J̩ꥂS(ۢxb۱S٬&]fg:eD#vaNϗ "!j&~õNYjxɶ[,A"^lw왶 WuIR]f\O;3D%05r5KBuH^P+~,WbK]jZ.veWņ'dujQx*gl5YV_lݕ%CڽTs:P^3APm3[[`hݵnI*y\K0ӽe#*u9S*v^0u[SoJt;biɴZx_n#mSd:akI$2\跺vo\ 꺃Il%(o#{dj-s",B˫iu؛ k?hUjwսQ1n\&ᮍ׍^aFe\ *}Wwq4Gj53ؤ6&V4Ypvk&kh'LaY񅒧VF QiZG3Zvꖠ wxXj1nۦxվeq E$XvIIS .+TuW#؏azI*՚V$ynA2vMRV4Lxi ^:[QW[JSG6S4aL:e7yQSum̾;{$ܶ^0i5-M-+J٪š ,Mhw W:[~tajWu.Yܖݒ^å.6NsGqޞXf*\[M[,$Wւ m;USib\ZClX%gEԵZ՚Oej4Wƶ^);ܥ$Rl vn[H&M"u{u.4x+v. AM^q;~0b&.8_U-Z|Rv֛ܫjfK3 ͢$S EEtԗ.Z%I&RɅ-56;N& '"NY>X|MuVjq+b脱iu{u`;RDz}bOa6WvsnNEך5SjOmvj"b6c,C;{%JM*܉gi )[v*˕<'iEo.,ջT|oYUoG3]BW&}Jb%x8] ^QTEڽbK*S6ayʹOOBn¤~&aC)VBC)6ja9)ݖ%v\^-* ziW̆[nZE|\Mhx9Vݩ⪊mv:gXh}Ml$4eSn6,w(VqDgTP){i͖t^h~EAf(ε xjS^v{:o6wUҫr;sIN$7b][ՒNo˅J-{S_ڑ d~2#W RWZ,һV.E'De]nL cemW̻t9]rO $S]n?\4)ܝ+] ,d/ ]W,Ux%ڕEuyLݞ{ MkK6~lwzݶJUޒNfUͪJez,[":Ԯ_zky>7jgjWVӨK6qP&EKjخVdDWAk_^+:"^>e6[&/34q(U[*W&Wfe7;~Gn{=$jOW|/iCG[h+Wrv[t~T֢6^nyrOm1j YzeKErytRʖM%+GZU;=\-NaUB{6I}SrY|ikmjg*ZI$lr4m&SNեŪR^g{ݚT x<,\k|~[>MkשU*1: =R[\ŬXtn._u5V(V[9 wbksrOɲXrm2nL=8LRf&JZb4~.h5ΫomvKӕJiv({*jeް%ʦiB#7b,eZJqNf|vEiTEE"ުo5N(VP0t;>W*h4̮{'7Y+5ڭ~QֻÒfP-a S[x$dr-GS{FySUWhj7_n%аs-Ik)[r c0UC&$͂,vM{VqjN.ZyqzQn۫v:rξ(Uy\fKܣrVl6~ؒkbYsf&^jY;82[{/}_:e]|0vG~rIj$Vů*2[J{m>!!/*. X[8ze7$2T t3 ^~n mȢLSU虒g.u"b*D^&.Ӯy's[VE1Zr(o2C\kgxzՐ+PԚ]+=*Zwޖ\lTTUb_4/ etk(4vU PV]z{gCkv5TQJ`Y%]V*b(mCy+74tO!(l #pf *| n5F8JSk ux8R4ԫZAX=y6UvuF}!كUf {}`4Bְn۰;):NcIU6ՓVKBQ,HAOV,SZYVTo)bW)JR8,|@rzo 2YݒoB*re,[0_ %isЕkD6Jt6finN~T:͒8ݫ4~љi7,IGūM^O#:RԚT6KKjDC#Yb/p]m.YsVKΔfȱ:^XlʔVr*yUh٩6FY(JQUUkr \mA}*2дnA.\Kd̂GUdYdJmxt-T&e.gsU*kHJ'f%Uon^_6NoZV;V*])y7s:^=k[RtUf[D\سk5*xU3Rí{K3jQ~-ڽ69ZچV_-;hJ~ṢRp6m-Yƫ)څf)nUDd۫]_tUr Y~R&lͯܐz۾iF=O]qBKo^ݴ*~Vmƀc6ifIv~ŎvSh2oWɥnɰT(zW.[v)*ˮ$|ÙN,g5mr5W(K$]fuy⸄+~5ΞUdff6?0}U\oXd-0UjalC;贺2YjcaU ]N9OIEc47Jo\Er;U S.]AE4$3bI7rէ[>LYP%!M:=b*c4;:*jP/z!L>zl6Czi ]`+Z7<շ+re Vi|NRSK 8ugye%_TǢ6udzWŚ*ՊZߦ˔Sۚ}ɗW ]7,n Lmwzq!0 `;vůGۯ5-)@ uKZK/ߖϑ Z[AyR_,h J [?3U6+ݞ*[n{ꡫMvr35S*mRFvrXs+r4Xstf(Uh:Ul7%kQS5kd 5KVdWj~vFk1jDMI[۽D-hFrezմoԅ$YT;W%xYlQbnLIh^oRS+u\CPM;Y[Ju4ZM봤zh(뵉s]Uq%8jYJiʧW,E]^6ItM+\cw:/ӑ]֧5T&[-(>.X}rKiՋMԳ3t(WXOSVu$^N\RozCݯw7Ms!d tԹ[TQ>,Wlu klV bW,NO1ʝ# ѳYmb$:rQOg$oJvK}/-u̾P6j-u G,ܬ Y %t/roUn󽆶͚`U>]yg%GPVS&bٴYej\.\Slv7΢"(fQU~[oVDV)F]-.ȬEtdZnlfi$#J?/ (Y1JQ!)w%=Gg0꭯q&'Kb;W*}Xw6SVQ0,u<[*j[z4jM=On8Ch~r5 %iQigkb]hcHR[-כFC)Ŋek7TfjAn*U\,+ƱmM˭Y-+v^.lWKS[MU9_[Yk[ZK~ v\v,QUrW[VIn!hm7gXXjвfM#-,ckG,GqP{E*)T.EE.nZo-LVCw9^a"ۭCvS$Ux8RQɝYt7 JjWv^7hVjRxg:/w͚Ip4[>3ө :өن1+wɬrתjP*r7p3UJ>Oډ6FgwvzApʪT ]Gzv1UL>Ay k VԞٵ^^mʒ;esjrmU %۫]Shf]d+X$nKl/[|٫to)z]|fY]rl~)St4Y ㏤Oj?Qoznt+J KwsGhbO)e:*6>+;6\CuSmIVzPHЀX;nA[nwѽ3d|\ Wj>Q{ ԍov>PT͒ai[Ӛ5uX6N^-TEU< *nZ/h+K_4Uq˞1TgMǨ8KbGu5VzVJ;͕^Mwkp$,xnu[2T_ZXꥵR-}-D˓OM fK^.K()gUi_n2jS6XTkHZmiR_#[+nvrWݤTz];j#f;^wy]rX+c6}ze f(R*O,Lz,~QNE{hi^b[r7\KޘJW!,aqkBP X,m_3d5ԨB[n_l}Brfu>hz(\Նӏͩ$zb%5Iƥ*[UzͩW(Նj5)-ֶZdIuO-M+I=xG]jiDOb\p=4=͵_C5RjU־Poy2ׯW{̽zͰݻJ+du봖cLoi'WjzwBf,ElvvUWݓiX,E.w4.;p//V^Q~YkM,o/dImXߋn۬I$p +*1~7WoWEĐNXoRwi}`nqdZuG&J\]i&镖W>b)n`Ue "JGSŢj.8U^[n75_nOA*JRU&|',Qj;.{vv]Ūڮz4v(5gv%{K06XeOtzE"F~UZj)Y1ˢ!alp(E&X|+^Zf6gֆ3[RЫz5 7q}f]¥~j.׌.Trw.4U^EY-KĖ`%l[M$eOZN͙[-jrauKR]jVPUW.;)2!#Nܸͦ2n֪6;5j9bC`bwܺH2Q.%K&,|O|\$U$lj}Xz&0]O$wʽRAM%EŮڸ=XWY3ߑbY}rɵpdegY_IFK%/͒<;U n7ԗZGnw[ܯdv'Q/הBmmKڷMj{Vת]IzvaқR2nQ\4^I۵QѕʧZFIZ[|mI䖩]Dy{ږO vrEl{W/Z[Yx}(yF:*6:<̯:Nu\Ś'"QCSZ86I.FK%1vWoا_ŢˮjZ%2xVt/kk2ħZ5C-<(\{r*ZOp[ٝ~ۭ+UHXnĚSԫ{53uvI6{&yjSo~C8F]4P3$[4 ^*VXTY3\-Rz* W^S.۫ZimW[Oǫ)uەzv*--u[Ou5 ё9+KTΧzWCVf*D) 2fOYNeK5UfSYqBع(eq,*NDUOgT+9nOT-Z7KUԫb.Y e»U>]۬j]o1]rtc Ŧ50] ^~ǯ G09{)6bR[|C]S\ܤ7:KV%>I gyWWϮԎ 5ŮyZQjFKrwB,CzYd;fϯhie^Y1b7z^V+yVv+boUlE#<ܯ͖*52zV|Lm2Q;~uz+~d*5JtesUtRlд _57nTER 2ykӨY+irXM]6{ǤVU*[eZܒ!r`2Zf ew$^cxaU.܎ٰ+}j3@ UYuMOВcbC]jgXͦ;r,6lT̂W7J[.tIbf-SZ0nym^ O.({I* ,St'8VVgL^ilC.5{\2~Evnea׬ZT,Ir5{~lJb)}V,֫ܛՌ2Fނ^s l]emlvUvEX3%3\Gݚe2]nF3:uۥL)h Ϡ-lCf[`@8z\pAp_ Ar[cIŒc5j{[Sq;5[Ӣո!h:WG/F-Vy5 ۔MS_j4Q)f*r)IĽ,M蚭յ@zd ZK+]'"YbTXgE0^կ7}F{4DWiwMz|̻' A(e$(#KuW*^Wk]iy/^E2P _TY?]o% ɺ%s JYb8bf ^#nV[nWQVG4Ir9P ׏Y6E7|\PZ~8[ӊvl*+zUXV*URd֍t\^X&E1uHc&aTV1:Q%KD\zjrmȅaU\OWnWRbNzKX+RIZhN' %xzJS-×-ҺXPV bo- fj^lt:)URϑvE fܵH1Jpe-:U, Ԗ/z?7$A)HQ+8eFWoV/:>WYtj˽yoH~$ݎ9δS^:2:Qq^KF'fͪYRK)K ->~Ogքr^U+*mUQv]n%~BiWVC q[ܦ9Wp-LzSM+f,)쑩%U2 ]s^Ujɮjuk(.Li9M~/RZͮ+~_ +[[nݯl؅91: +~` WK@ErnfE).ے(5Y/n%oTyZnMQoXEkwӺv|fnQl(՚eܦ*wrchxvˬ O_NW&k%rW$IL'3zp饦Ukuz^ks]~a a/W(4dSr-55LTM1 춚ڪY::m^pj2 W*Y>ñj?q͚.4ۅ:S/5/i}]oTVU}Xnyp(&q%]W)m߸R ]t+ԫ}ٴzG(=^g`RG&Xu"]+mx,t4RѼnKoUdO'2ޒߩV mY-Ԏbv~i/uJUԈOW/~-Ume;7˒m(m+ex̆r~.f뤣\Ҵb㪶zzMshZO<{eOΊ_괺R`ݎ\ſFw-,\3r-6]/r^UuK-a|f5[Wra/Қvg~/95.[o77 !XA;`hN*vTj%xd2g䲦;v4>Zl2ݲ.JXkCFS#Z`4j6k ft:\iݲVǼG.6.y [Q&mpPZPQROlYgNӫk]б ᴻ )b1&?3{]Z̖c- 󛄿M.j]VbrKKUԛhm1; MvbQ֖Ž^oVm7\JSzz/e--?44ѹ$Rij+fI+vWvM7lŒ˱;vOZ&Sk̲Di.ev]*bۦ19d%)znEP*ZI}Y*,# 6bSXr]Y)8_n42cq+GV fյϩ|Vm+4[)4o :kh]rbVi(  at^UӉrj|ՊշmGQɾZcXnʝQfg)ZM{w{Ng/3n뼎 6]t7(MRőVnnv"ِܺ*fqk+Hvo$Z\Lz$ʌkOEsz5)[gҍ+2iu`4hU+]->ڤ)URji} %ֳRX:Z`C &`v_p _ ޑtq <0[tYBomjV~i]ReLiKEf7ի;-Vb*FPڂS5*Q6 y}Y: TB)yҫ5t^43^m6peGHzQ+jLvIFZYl3.=ۭKmvrۮ].TX8* f}ojZ'[!Zu9YmQT2.Vkє!|`rv|ٓGkڅDb%x|Z]%ej7eUҢ jܷuauf٦ni]_6ԺݫNKrm_tTR^Wp[I6:JU 8_^i#s˺gK`VmlF#vZO)R,5=]w:P]W7Aa+,vhsGR[T|p ܲB=]kZEuf:kվ~є l IKKjc SxvAk+,6z~oNޚ eZuզ4^8fhJ۬}% !֪[V";2+,Ѭj_k R6x~Gx["LWIvetM4LC*}ǩZP9zNvԢvY 總;r**gi>k~YUn_]C1̮VUj$H Muje SKgZMU+w_$Ŏ)D6OЍ6O\Rtr߯6kf1߳6ߢ*YUݞ"ˊ,deWjzUkբYSծ3S䫜4lE-Dì*wR[éZʬLwklIpDY0܆U6bHjE ^_aEmi$-Wk iI/\ζO{[RrN>a+x*ݦ[;Vm|ZSڴh%IWh=O7:-kQľ\&5χ x ~ Pܯ7fkv+,PeS*N޻X+j<>j&Ȓ pvY+-'U햛QYoC:oe2rNVqb-ߨNQ[]g;=_4ti|ΐY- 'ՙeȄyeuX;5*ɨۿյa Eo5IoR +Sy,Ayv2eZŎ竎2;ZVV[']DgIocH-+r "t%NW^_k zϧ׋gŎ#VĚ+K(^Ojb4e֜zU2Cp{|JGTt-͚O^2fUU$8Bc)5u6*/ ElvrT̵oѰt"PA^zPr{%sv auW0mj4?WD'nQ暨{eTKE.1uE;e_={5 gJ\W/j'k]fVꥱKiZ^Z(Zim\_-J׭ %%h}sj.^P-a3TrwdCzZjIĖ^zJcjhQMS,G-Snw|[mUvG6®w-]*iOjjmbZ=qFkefٲW5Kmh]_oIliehz;qdjZ_/ݬ:Bi,fArM)7Uy,tv((B*V+[EZI zO Zv NhRI-j6(R#%$`&o wސn/>bZZUQԖ0xed ZWK\^)V]UţU*in 1bcrkmUдS7(ĭvKq2W~$ OYװr[oL%zerU:Be^KV몗,]o n5٭ j; Mj l6\]4]PuKfACmJ{G/GQv-X[/ +ײ_*j$,_YS^gl23_5]v㯬DWrEAnh%Um=jz2C[oܮXx ˫U*IS =AERj,QuөͭkZ/Z6u[Z6eԸm%MyDnxrCf$dEXDn3%(u2_T|*w_mwgL5r0YWfI_W䊤WEQtw 4Y*wUP,t hl4Zڭ^r/+`uxTC܆m0xvtdۑU+٫۔SY+w풠%VTa.~dIs5MO%7[ņT-Te]fX>W^RV ZYKE)܂ݮ/NÖ+b1m2IwhjEk9L^+JwW-ԣذFRz3ttn6o r[kƫMÓ'(ܒWVY{VI2ǕXuz\e9g립ܑ|\kkKʢS;=k{^sFJh=+W ^˧*jzY06Լ~e].ZVAkBcS-u;~թ?fonU&i{[ەrI25h=siREő4Uid/&l,]TՊ ZکB>HXlvLrK6jR*6NlZzɮ^WzyFñޖz܂h=޸ Np֮3E͘~E4@*E:7񚽕o=M:]t\T=trאyiuO]zl^V Fj ~I2 Kf=lWnԮXUytNl1+uk%+n۫DG-ѻn]-UxQfdS45F^'9"VKnehb_IXŲ**㜵ZMQ&J%{\v 8qnC n(rn""(vmVܯm7jz"띷4VYvJMȵZ3>p],v|LW)(c0Z4IEnqQ蒀#Qky{E-Ӛsթs([Uh蝢49ة 2a^d˦oV,ٲM^j5 r5jNg +Rն"7pS+fQS5ѵ+[dOE+zg3kEIM|zhUVñRsLM'ea˕Ę}_k]Y5ǽՆauOꔂc^:kQ%:u]W9vY컯U^+X|1vXh9Wk,M\ FeV/[4&r|VϨc4ͪW[5MklWϸ,(:covQ>QU8u`7ZWPD-Sۑ=n7El2i}>Y3Kz=:Co$'`͖Kwr]i_MU{հ[T:mb^;\X$[Ţ=9Y*uJE) Q iln^Zl.CPfRWs:3M֋v{ns$W0WЩ[;n|vDo,lr0ݾ^k$8rAqҠv&R[~;_{z$otfԟutRhNn'%Ԝ/ KܻS Zgnzfq}B[KU{_;.cVY'Yj٭'P.e]0qsWs tI)C],hGK}vrE^kRIFApUr[/"V jkrQ%;W̪*P4wźSr 0"~_/w04gZ *Y8ډ.5Vj/ˮ&z5ëEJϓ=UEn:_#y. )X|hncViz:)sfp UbŊ.W#˅o|,#-Qi8bGWjVͯNZ) )svkt,eA v*UVWLgɭ¥UjJMxk،!)bCkTʣ*l:T^u5UE_3ez|jl5 vn1zY ԩW:~_+]EU6{vy>p Z֛׮h ]\E,YZ,?YW)-ȣmWE~.Ŏ," ^4 YjB%[e[ $SEݩAxEQK糐|ma+NokUUjK-S4UĪ^kުg:bKujr>QfmfkTXTݰfһ"pI%\WlTmӻ"6[hU_ݩv[V]#l=򄚡)†P9$bZX2Zk s:ݲ 7nTh4zAXvIcȪ1wvGl2C/ݾE]U{墶XK BRE*%Kն*rO7uR-Zv.rkRr>cnb\6wmm$\:vK->8MjUuVѯ7MbrYuK%_ zcjnY:v 3!u]o(zEp,EP@K4ZJNW$numvњLX#"VOkG;EgvT:/RbYkI- ߴVUrY\p8r, Vq/IO l([vUYbŭVPZ+Sz.`fteYW\[/MY;uk|:ϕRf6q>(N8jWx"Ȟܐr,.kv[iWZˤIbdRA#JKbO嫷HE˜uͰl޶\hzn;Zlɝw,l7%hufI2̾)^k/.Yo,_y*s+MD0LMeZɱ2PP:ݚNQ W+p+v4Y'9hܒEUe,eP%7>٫|:mbʥ7Ym83]Y+bq0z&Ap,kN8Y^h\SܪT=7[Gl$bVͨv +)WNzveXsLOdvkxu˫K\nxWa+: m ʩnC~n ͮ]ՋVܭqk>ٰQ̞ث;ZTB:zGA;tNC6jmKU@̩iN92ZJJo`Xna^Osb?IU uZݏz%Ԇ5nHR^kj\sYBYplq[%@K]$j)𵬆ܨ[ݖ(~aHuN E~# ?P P"2_/(z " r HY@γl㔔*jY?C a1E~Un:rV5zj2. 2\dҦLsfkOg u{eQ_x>5}k}Ԛ5rPj.w+VθU/ eӊ̆o{23UJiVqU헮rw~XcY4^\dFKg*e*X{fMDvMϦÖu[ͯcJZ djA/ܮKe>;m[Fu8ZuMoTYAˎ۰ӖmlM,2_-MrB:]8͵V:Zd%꫱*w,6t;_lw+:Ge}DKVW 4k{e^XjGf٫fY*Jcw8%U${u3x7]Ez4ܭNpJBw:IOcCKnU OUk%jK|ٰRUdvng]`,.W[Emf}SoZV+8RQ5tmQ&I{A1kRI)iݢGS= і*}SET%#5M`WoNӫsj)RSj{=Ig#Z~wVq)\g KovyL=JYKAQ!hcfh=$6QMuKz,նZj>-XRK$J-J;NC.UW2jdbY/ ; ^rZ5Œ]`Y=[|$m1c`d+r zE[-)nCQhƖ x;X/6zdCGA#֔nZ%BVFjX\ףZeIe묳ZɑVobѱmy \-zbwyR[l<%Yn_F3pr]k~DZJ$݆ =-uSf[^0a_j zOJr_JЯVz+lMNU.]WuY[–*ShvQOD4ET_SZ[cqzĴr4 W7ݽ^s4Hain)U{諵lXW0mqT4M*}jeEۊ8r{ G]ciUUlVXګS 5eo8bWl)v*2ϯ`Zn#$ђ7*EdrS #vbnkY S.ٚU@*/Vva.Z iWBЫ7"Uqȱ%nMב SxGD{Wu}'%"?֨κzt:UPJOvA*[gM-E{DWe.7&\^L-MvnC1zfI/*a Z2S'>Ț3~רR˺Q n1yB52B[l7dzn\*Y3;O#$ ^_uJﶽ-hZ5\l[VQlXJ[}l֯m\[~s :nYPUlT=f IlZfMkޑRvdB+͙X5>7Z2ّي.oFD{r-ە\TrYҠZ敚j5 Ő)2uH*Zrt9Ô爂]tNq\HWNv٪6HJIYZz|DQEv9~ڨgz*jrcUFe͞FWSfOWK~(W̟.6tUTv|Kz|zcsvkbV+uɇO[{m+*G#&SKkU{qedNU*>IЅnZҤ^e M{8jM|: z8X֢kVUD֓jYl:%酻ثɥת+zW2̞ZeJWOWïWb\#u* fckҩ5ۑEe F1K{S4v捞;NUk]w+kYs2(kޮ5\/כJ6djzy*ٮ`ܭᮿ'v48ujMjAkEAbSk\l _{ +̂ ̪Gբ MWki*[UڱkR]K~ml'9NEuUFu^ZWrjˬFT%ɺ+T6Clx evjɡlmv&DJDKw&8Pҫ5կE&MK}~Kv[44zRKVJVk*}nqzO4Zj\<Un͢Ul-baEA8|:MdkvI66,+]T's, NIőbG)u $^mrQR%CS6;"Lxf_] "\ "I$aA-!-mhrs>Ô2Tts$VקĆNPl^Z/J6fj5d[4XUɬ* _4cҌ'*IMĢRZl4O"X*Z[˟SgVjpڂK943ivQ7kU z .-j5WNaّLb k` Ψ+slzni]oRܞ|BGn U[,t4{kf>ex WmatZk,O=Mnۡ';*-WM8GQvV*F-lbirGPtirKi3޶WlmZA/: Ihe^gڌ"K*ί׍L-iS+߻NEۖRf5I2uDO]h@@`z5KXn]2ElncVjcK W+8v2˪Olе.I(k/ŮgtX 鳄o gn۳ \rŪU.hUf^rIњ^IRX͖m0{܊|ٲ 5VgUEJK8h|&Q(Rvo$ɣs{*_hڒMpKg#<`~ZP9n/Ifi,TmQjf+9lv&YRj,~^2TL(ݰm^]mGPl>ח)}ìvR݊rrG {Bz? txj`ޯ%ݯ7G Hֿz~_K+&4r)hv ^6U#z[6rgN]ُMaVjl*署4e`6?G,'pJhY^jU.7;US2٬X:S0L^#զLصUnz,;]ݭew[+UիTE3Ԝ^5-Њҵ^v5Ht9;^s{Y6lB8㋭Su%:ZWņ4ٕWKvWj۹]=~Iivh9f5fZc]͂zگkJ ՝ -Cذ+GV'܆-A9Qsiqjf0+ М:FٮvYZŎW6qJCL~VښjK.uZUӯ.ӬW>VK^sE/ΎR8) -lwS'}LCVJmRssbQd![IpW{(zl5&\0 ҭ I[pk׬NWg OvM덆duګ{Sw4G.#VԐWłpUkj|rkj*BoUOyfmZnU0zUC1r֚vSm[a_0Edz I1+^o36%5EfhyvM,S6+NԘ0Raִlg:vs:̞&( xnAZhJKiWn%6J5 5 Y7vV 8^ݎK 'J`࣠hҫGf9j *M:ïUoEh(:fs5׫cĒb:~ܒn,8Mա%Uu$ h8UwfbM4YpۦzRS6zSc_5V_Sc_-VFIh=kk]afL&zKyofEi+ҔeV\Y2(J7ȭ?r hfδUM"~_5Bv,O݆#R$R;,fJ^ivkEj74[ zB1:6fTYlRF0mT/fv6">Y)]VQvY'd峪*øV.jՖ&k+w BgIoul}5W+=Ajչ̒a jS7]fWfp͓$SԘXFdv/I_ow%K2-3 @ !Qcs:d/T[U1ݣ>ybG}AZ_kNc7 Pf4hJJ؛µwNʔZw,_uFCZI_SK)R5*?.u1Вhrk\hlk쪦֛Ro0kmURǧ6Vo^E.4SX^.u~uK_n;*۬tKj<` ƣr_fj|EǵJBi<-E2JR^еa8~w&d|`5ޮZ(G:r/_jҊK0 ^Vk~QN(wxK:-uV(>kkU[$[+5F1%VVbK2*4+u%nd*FQJvkjKk4Y3Jw*bOh7pCd#|\MfZiT+h^UOnoh^]%s I}WnZ:GZf..ҩ[ Zϰ44w+\Խ6lM jCj)\v9ElӒ;~I n*k-5J1?nTi']Ů2Y i]WSM ngZսn5]vTI6j;تOn'Mu;\w~UVEU=ϓ'4*]4۵>S_pɑ Ru FYBSlZvU5][iXjɪ7v$,^Lj_`8YVm,u>K2$Qj^+쉚6>ׅj4̊Ѹ;zQWf[V.͊In3Rߩ(VI)% B, z]$aVAPH7H *mNɓo Yr~_nyJ߼ZC.ߐxm^)gE^o`5~K+-U&\_ֻź廥NSefW SU5FުC[.Vu[BVn-s!f)=^WFyvL2 7V/l\( lXM׏3P U{GjJq+$-շvLS+ԉ%ozvȖ\ٶZm++fU}:M"EՄ"8Z)Zɤ5kt2ɢW{, 6n6gYTNu{~K4rя!f9;iy ^q>L8zm\q?s1 +${Ŧ7IbY:rų#֌PuZѴfg~Sx%^U'Qu[}~DM+Tٚ1{d,%aj.ETI2w/g$+[݊\,zS97\+N8}HuYHV%m(Zh;͊Hp)6Ϸc=Qo#݂﷥JW:v Zb}ͥk]U4mFN1Mh~GmH[ˬxqm*^SSKl#xj+Uk]/5 TMe+RsQ=RNh7V[jGvd*ņ"T[Kr6BcXF?}Y6jϯݞwr^U)WFߛ-&֯en(߹6g{7 ^ מcUв @V+Aw_I]/8r=A/0#;w^H/˲ٛ^*߭[os A.EVYSbɪѣ뼯ӭ^ۭvv9}~g mې*}v%fͦw+jݲ q^J6EB[cJթ;͆Nnw+R+XPDe~LU TM'X^Is},-jwTze+ "zb]V:&ism歹J'8]Qv^e1ZMv1BյbCn)oս#;mZS՟:fqxcBG=fEZ7a4eUn*vd4Z@jy2>2֬6Ǫ6h RS1KKk_-C6~LzfAu m,VY{*V- R^\ѪBb^OFjERvS֤`mtlkHV)[/V*fRm 1r8-G]ڬM0fNQ(YfTwj&-+M٭lꒅI*=v"yNTbz]ޮ2JmH?ծWhfZOAOz*=6W0-KTN - Gjv_`~K__3 P\V(3-O͍JEK&=C])Iv;}aZe ;VU0kX+Kʤ֢Wkkq˵z~&ֻn#~Ӣ͞Tb1TTQnI 2&njCe[8b[e~K-Цu|S&/*Tkz+m5ԭe$Uc; $I[=a=}-+uUeC.ud֧(k"T3^w[T47Dj+Fh=v#QQe!($6'tKd?ܨS5+vT4dŹ>7Zj-x*6*)6N$㐿rWZZo{,BwvtIe7m7<_-;Tɴlv #☖_;51RV{ݼ}Qۅ_t: ۮU}~g*)bZ4k[5ѻԦGfmv<\5K}1v9 zpje5e7Q2`wWZܥA^ / ;~ܫT[R.Rf48XQZvE. ^p(n~ő ҂R H!vse^'~vZo*EkVP+euNc,BaH_krϬ6c4uWV*GѮ 0J)746TM)ɽyrL/^2*Rt٭2Z݊$*^USѪfEbHUX-k鵾#b*vzu2E,\~t,7k7Q^O+RѬ*mwt`E,A-|yn;]bg;{"- |O7%c9q[.߬+آV㔬.;Uv֣gxzݴUT},JMwl4{bapzXBT"ժXsq̖t`ҘYrncr+ȚޑĂ) j;~]tzi0ϓkG1&u2^.z:eProvlT[uJREj/5`E/6 J~*ZU2Q-CREl%ihMތԛcv]dKU 2̊%ڬ[Xy˥bb Ui=ZhZ-a,(ĦR[Ep_rjU- r# ۑNqU{fnh6j4J+Sg^ì$\Gޑ5_9/gYfs H}T:G.5TG/zVz,UZXB.R5_d-W(ɥSj(+-lV^Ok1K~G ~On9JW`ڱԆO9*X|PwWl]Zc RW9l#PˍnA ;wקz5RRBβjM$C)XMEbjW7숑lU, VիkwHR3պ>]j]rVZB劥nYa9̎$Jg3EZ]鹋=h~$Z.ͷUiK.Mz󋅻kQ@gE^Ăj#RpiVVmVP.,I 'KUg/ iU/v)T԰PJSU|X.qΏ_^lX}Zp|D GiͲ)H6[re4hSl*6%rKh2W\Qx6Qk[N)[rّiUym-aurmoW6e,eΡi=իrb4ڲ*io5yYT_vgl ev%|4F/_9vյdKi%Ug %\uN†KuUSB[yb)dNQjGv,dGmZUDkNSokzcsì2(շ! ]^fڒ,zQjXgg)*(HZKJI6QKYk%K0dZkJ?>ld]&}Zi_ѪNH*qI,6yO:P9A-t RRؓ.C^p6 z ]0~IoWï! v&*^nKu'-)6 O.7NȝHN:ZS'vwMӲf%vz5b!nu'WHiFnKԤW.Sre~4 k2 i,#t8ݰ\qba,^>Y5#ԻrKKޢhp:ڴlrd+D`I4Vum+svպG|rGn*KkɆsEjS9e>AsZexj^u {zetlѯvadd)fϜZUK.:9p5LLmpJGAbSZr) m|ٗm3JOe6L SOC.UM\{ۣId[Ng6̞ET-v˝^\Wx -ל횒Wsكj|adĚW$Y+SGvRE..S.bPbmA~U~Z^'W]lUДk"nckfD#^7xr_W_~2;c*` bYnÕj%vؓ{5]Өjq:Gh\jޒ v֗עnL_vQkuv(v$)c[.kbRWIjp+ߨ 6չEᗄIr_JR6;v{e Ϊ75ۤzSiZ+,ґcJ%,^Ǭwuᑶv*kTKYzEtYL_.Si.Nn :'-l jEgfYH_*J^Oibl5Bo:n68*e`܅G͚Ƭ;݊dC۽gmV:M+}UӸ5m6ӛ'8l~ڨ+mͭ1ԆlJ2JdN.*Zݱ|o3dy`,UUUYxh`IU3yqEU%je^UԶ' gmԆ Y-W mlY_]RЄnӪgW攩Z kTFe$ir=nY. Jުj8=G׼^y7o4 Ukri/ )Y޺JS]R̫Yh9"Tv%bSuKSQm|R(wjW=\UfZ:H65^],cn1zv6їY=fJѥvVu_j;Sf#7=r&Vv(]X9U*QV 56{T]GRrSמSP<Ӫ fW:fG(8nכѶK]~Ūxlw42E+\fC/k%P۫S9IY);Q4Y[=r(/Z)Mmj {"imIg KJl~=VEjW+m"lXBJ%_.˺jv1Zfjc-CjIzJ/~_/Nc}7kv^-~E*-69rIiNEWm}¢rknuLZkjUhFejEǻm[ZW8l厰t&Qv߯Nn5k2nu#[뵧1ou|bz̊.o*ȽhI*HQx\\$P `Fv݆/GoW4[+ G,p4PLJ 95KȬX{F^ۘKU\$TUe]{rS8;F>s6D>}$͖1>CQMW˒ނ"^[:5])JAK%#4n[%ŖK}]8z&Pmzj "(Bx5ik-w5YKe2+>R8մݒm)h/&#*TT|YO$,4EA-[ܕ R:M~G9et+iźӪWMʆeS+vBV4a.8kzSi׫-\L/&n3w-.\L&V>rEMPjݟo8^[eͲa+ZZA^yP,Y'l0v F,BHd`i=ߤЁzj[tNh-tfkzfhYgUͬ]g:,6ïw4P0;^I&F*{ՙ]}]ְT)/VBC JmӴŶeՂ$s*5frI+b'Ue[g2gU*6唦jbzO-TRkEmw;R,]/ȗ%uHKLGu(-^s>a:訞NKNYܐDM() 3n7_sj2:O[ӫBAU#ު]*ʚ&UVp( Q'UntM#3\)S1IYEZ)6ZN)tb 56ͪMzj.tyRE"d+bMhY1}e W?M+d+*Q%WVW&ĂNYzGp̆W:{P]0˱d/j˕T%@Â).zQG[aU~"ΝZV&In3{!};KI1uǀP@l4h֌ߣbpP_td,536*j]* Kzm=ޚbU6:j'EB[sfXyv[bڪBt|nowj\ÔbhA[E$^3~[W," W,3O7{~bߏIzۧ(~I+noEGd~ŔX}S4օr]ou1՛%_;|RّzT6.Uqs{NY-zWjz׫ǬG$<T1划w^mu^o86Io+djLv"Z,=,dfFi]kMjUo^XQOgj̚u^{:iP4;`@ Nk~ b8^.8~' 06R7;wHsSv(S\:$ Vs.eIh^]jVO7v*[fk Mz*}:YEi^F Zmɬ̅I镢dJ{Xj-RDNm)u|O}n5^,)uhܲUt_l$;SD-ɮԴlsV[j8ZoE5ro:Ӯ3vل IG~Y%ëi]0n4H gW쪇Y؍O,"r`Mfus::ZdX久rCբfZ(J-Du4ɂnQ24*d$Իިru5vĆav|~NX"{ !YtMQ lv\jݚ)O!eK/O-a ,ʼxwpZ/߮$jX׆jSS\Z۲Xޫiuv*ԋyk^s]h}[>Uvٕ>k튮aJE7%"*& fcj5Rϲ&h2)iņݯI_n(]ܚ Jʼ`%vbK-4'گ6b feKYػ..fWڕO$WKU Y|(]aԮ+gPW-tn[ xZ&C%zj;=fN=-Cަ5gK;հ4ͱڽu]ͺTjqZ4{ _Pj>URu2E6k]Vc ]U r;zذV[U|Vtbm *%UUgWmWV]2˥VeV.Lj- +v`W~b8$tU0Eݬfslov.$bGi*\bC+jn쌳iՎ\iej)DZER헵vK͚ת ػ5nv) Z*V]4B!5j!zV(r^mL4)HR˽qEwl{ Mt7LImL%6:]nsk͂gi,7{dɥɕNٷIvOldOi|vcZzCѕ/rP-jQ/ n+{WڶPk#="v.GTjwJ] f7ke/tzEIY+ⱴ6뜆luĢ$e:KV gۥuڲHJnO#uEܕbBpk-uYvw/W6Qk-0v(ʠqTo%U˦=n5~teY3zZR\Ԃyذlכu* z~MOSQYGKs`7z](W=='Hz/;MsTw4E]X4JsДf_: \nAovX`jt땥ײIn/RnbS-v$Gy{V<4aHVzR:,6NּdwϪurJuG*U/Ր +rHUڒfM.vܾ!]eEn^WTB_x6~^\\u{h.1up_ՊVmlKKU2,Z\_ Wb7}|@o HYF̮t:dG+#qd67W:SRT"VKЄW.fTAVT[-JUS&ʭ4,Z7%OvIj^fz~bYti-\*zt*؛zvU5G+2Kizu/;M7~[(սaf7bQd65r[E_j&L`W*uc4g Qvk$EO𺅹cnX*%ImX5A.r:CTlP~Nbj,'S$TOxb9rbenխ{4[{"k W;=6 #cJIV-.l_kѱ^/Jkz۳̞];fQ( rT/ԭ8;*-^ԵєzMo~tڽFmysQ ۑL.[W3: Q*Վ}rEG1WەC)V-nŪк 50TX嚶8vѨ]F)6~mijX0rAmݒ)wYk1ո6NW"v[]{mɫYV,ih:5&1]jΫ֔*gjs&9Uǎ* )RLX4+/jT׫];$TJ b[JSvEIl1buWr ZR&IZ/` r9r R&Wsܳ Ç@@[.7pK`X/zCdHʈ xY: gnǸk:EVw[S% OP;%KЋl rG+}/kjeiE]&VM&v+( i= c˻k*Sl=Ff57٬תbc(2tSJfq]"m}zm7U ˯ bec;Y 4cZzqex255Cmx^zo}cCS;~0XE^7)M7e*CV WKE>j]kf2dvѐ=E$^;բ瘟SDBiWR< ͊jr M]y˦x*=}_nj2ū%YUM)r5n AmFm[gz)R[r,IBUNh#z,X--jvS뭞@tһf^Tȭl!zu%a0!`۞#uRl:H39rEm!7T-ˆ( vlB$Cm](Zuf _땛Z㶍Y=y~,ݝB/|2pI]jv+:uھkdŪ9`Gi~a I WvPI, pDpJYo~k}j9 hza-݂KzTܖըxI_jFF/嶨7dIE۫=i-ӯ(e_r4\$j, ٘P5X9{n%5;jՏ`4[ea4CeFA]mZzuv%$xuݔ`_z&{z͙ݞPՄ>U׫bw%c1Ԗ!Piԏ[mBYk \Mp*\+ bٗ!Jn\EZOu Mo}Xq_N-o-)9v$Qu~_gdSW}[~cJ٬kz_7tTi8YH۴-Gu}jV4-oV~(FkiWE#YY+*_i-Rt ݖx \S3RKhӝ׫.7WnJ6\zM*Nٷ?Ԟ\xŶlfUQhߦmʹc83z1M,\ljbs~,DZI-v\z\3z) ߓsUJ%l;UDb/Ѕ&+.j;Ra⸚}ېVːOp# LJV&:^oW>EIZ+IR]qj8sKV:E:͂آJE^(]0%hY[ exb&ʃ";$Okf5fU5n۵ܓ= f_mK_ž\n}ٕb4\pZVDEpeg֞kjAFZ{S:]QdYXo^N\q]$$vUW~^)^qTxj_Pخ[^ARIWݙeSvV-OVuS/ywK<\2LcjfrT.*7*sj>UC{\֕KjZzO$$q5T\;YUvWUC"sntvTjr(vEsmCWV=ݓֆ`Y3oK5fv)/KSfO*OR7\uXn)ufQݴci2z}J{z#+˂+en2¢\QYj6,Wy/ q2Imnۨru"sNkKYX,ZEAKݎڼa^YגLp7B;RKv8,H\fo˼ɧc6=Y JۓZo]lV}zaXҴ rØʳ6Ce]~arUYTfEQ+[JivWY4ij\(1jznzI7,[!Iڑ )v[^!ٔZ5qGOKQ*[(\ mRUlXv ,nݳܚXI_$JMo=>Qk +ٕ"V[BimjBUmYjKeڽrS۱eCQ'vT"f۔ĎU53չ*EnݫV땥);/KtTfC<.VG)_.Q VIDa)̘ۚyv:KD-bKqT*wt~SۅiE[PGNcʵ߫t(nZt;Rp;;A/BɹI,T+ZN*uoکL-Wݎޒ[vͣAyZ/H#t5;V6>UK*Zeak%fWڏ.Vņ\8ނmTź{^HJFxⷔkݪ خC0 I$e'X͘#;7IUjIA-Y\_^TW^ۆHZ~9jVW.hBϮu[Yz$dgq4A+RMwͶ'k&Ȯ\.Rqyeb`y%xdڏhXnWz'[nk0:nVki]vut4YWi"t_LG2eTa]zܑLL5̮T[v{KUJ[P;S5KYmT.roUzK_oWe"XVMH-,v n7!7F\n~Co~G_~$:>X؅6uMN߭jØDS3d޴5sV^P-ꔎMvYK%/Ik\%IP ܌p\Q=*6dsHY=Sz,2կ_:=EՖ#nܦrvz~VKqS(xJg"=]F)tk]om Q,Sɭ]-4֗ϸzXP-[,ZR _"sݢMU\GZKJIS3)]BeWqlNrf]R }Kr/zB,{vMnmnmnSnt-&5qtW'?+"ڽWڼW/S&K1=p +إv-ʭ+ XmKݮWj&Q2 SbWoe`h vFh~ ]Y(vA[YƐ .jz^Ў]w^]#r)Fݎ0;w[j}c]): +vrɯԊj{VE8Dݢl_,1u^zM[Pc ŨeBgкn}g^/=pZ7FK0`%QpRCI,X-QhӫnO'e_mLKȮ[e}역Jv[]J&Sǭ譎wyLۑ^^8ݪ󥂢Yd*~S]L8I`QZo6Z 4k-̺zM94jEJB".M-v~3daE:]9EK*|t<[+V Mh=S?6;zU3bb2w r*vg 8;F.% $[8vC"9ڏ eX~{9(U 8I}BY˷`!j:S,~O6KcXϕt $ZఋvHݽ]F)ժzV.vCy}w]F{/{_]<UbsRAw\O[RJY[7TZ*[>w ̢EFPh-4j\aYbg([r+jj_pjQ84wNZH%IoFےkbgĮLfhOQl[."dz KGwj{eroU0( KVe0uŶY+[D[{%hf}֮Y+7C'f9ٳzjUʂP2Z(b᥏M-V{.}(հ M5:ՖZ۾yTd:XUm*Zf9/(kתedt58)STyzۑjW,[/|o1[Z.8M*Xn爂p*QV[vDrӫYU8a[dxY a'FYT `UZ7%y٬TwalVj-sdI6 Ϙ:usLEc8b,Rsh%**ųQ̎;U4clN!:gI/}9OAnݥT6{QtxP~fk3tM4:[.Omݖ\qP ~4z*ZkBj],8Y66\'nv͐+֒R"*LQyrOJbKz;mN3]I+lSf)}UuYm-ا$V\ ZTjV,e]I<4RUuYgenQMP'v[EK,(ίYrǪjZb?~}yKc4۝D[z_hN]]nUƫ0޶Ģ$;ϒZ^\nXj93Og4l4E0 Uz}1ǪUN͕NRv:Q>ې JtLWuQw]cΖ-QfE.8\~خϩRMo(+_,qъ^nNݳl{bP8[J].U+BX)zzA;_q"Kve9JZx8}}%TTA{l lz)i9,M0LZ{Q3zѴa(r;=۱z_|ݩ+^G,z/km Z& 6?5Tג{InbUUaɲu˕Uk R&y%2ZfL_3/E As{zn(R_oHUEo{]ׯŪղ*Uym+QlՊZ\ǯ5ޣ;~%bW)QD~zՐ~bTAW-ͅV!jpӼ\VEqc+RFKn1\ Ն3ԥ]*}/tfJ"nw)I38[&S7OpѐR_>O]AL\X|ei5+wOnݝԛ/+ گTdv4`Tz A04^nq+cҘ2#u}n4DAU+ot٫]ZGtDn+fHN}K-~AUe_gAk׶ٍI7MQXWU\hl\>AnVH&,WfʅĂ5&mݲVzn*ifѻԹvguGlKr.Dm'mpde|G.P쳻݆s풴e~GjgVKua;Z+_{u4_3l#n,5iYz^3ךF,vEӮJ^QS eںa54Yc]b*LXL6+FUiTU [ߒVM1~nHXηzɷ;n6 Jjn"YN}/{~[ьKowk'KfO\F8BUhI]FgGIXzRVYKkVnc eҜ>Ze۩)WpGW-PCUrV %|N6{ 5\J^ruvOl(z/wXYZO'YM`֜FqRݫVDbu$U^xCHIr4t^-34 j*jîZirI=̤ץEjQ*EZ+=3ՊVC[$C;-ױ.U$<64em|X{̾Xv|v[[t --Ҵ;2$zC$w)3 ڍjxu&<)kPA\Mj^^iՂXetkjӌ Yo~p~]mHze,jgFh&R M\eDKjUfܩHާ[t6Ib%S[+4%,7):RQ1(>-U{n3Z2ͦ2~: &J[w) _{IoU_Hᘕ_%,\FaUc7^V6gŊT1$esIK)p#*ĨJ*2BVQ_ߚ>$#ֻ}Y/f5!v$>]c-A0*A۲TԖ[w]Gf57fN2;7ͩUrX5vU[ ]Gp^EY :nl_mPE[tKh%y*sڮU^:lg+ c0jQhl+6&nZyDܓۦX~KGHvS)wwiʦvܷx}PqZQ_H5G{=rѫ4~i*Z9:)RUZ#U+bc5jseG5%X\RK3OgkvqX~:..%U j]:cWJՐS3̪nP\lI򭷭ḳuiZM9ҥk#6[i*W,j%U<8[Ks՚pʥY)fQzHҺvLޮ]-kVnߦ ?}v(|% &ϭv*`͒+)5/ak5f蝹 -(oj\S/劳- V`?Z z$]od%I1- t@@TQ>}|r؊M+Xlpma~пi|melO2JVk>An5\zWY^Ğ֤[^c/{֙GgiЋU[obU[7j-)Z:!uD깒/hV)|v_3:[{ԋjlm7mvQm֕b*R.+Ueǎ/y5+bSM/F: P0dhO-dZ 0L/Sn{Ccj~qvCnv^!uY/ziHZ*8jŰժN6BջͲ5 e1"|Q5drCumuڗS~IUhMӷn$ˎүW֞nQUqefZ[rSTV ;+WBaԦ Z_^@mIVj7zbcezS n {WnJxZv%/H6ߵĚ$UtW:;49$e׺ש %eh#Y a)u <:ֺkwSFԲ,1f&ԙXXZAfpRŚcX]MFٔ SR~Qٲ&fLL\Q|'V*%M P8]cVju͞\5gdٖzOgteSlnpbQs{VSX˲WMf2^.S嶦na]qޛ76Şm̆Φ[+mS2k/ Z+ 7W_%A+ QHoNT#BUQ_[:XȎ n:bޯX0V;zG Y+=.4*gЋZ޲ ۶%rU3UV(IȢϕZC%ѫ gɍj _HfAlJexzWleDn[{Jp=nSnjEGlK WnZ]+FkYz-Jiܰŏ\,Sկ6mlZm*m:B__ŚevD';֯iIS I_'M*K"$Ko_^GZhܐK]֣Ҭwb7<-Akvߴ% 2Z3ZWKSo픋-Ӳ)_bGTr6, /Yzjzfn4In.%6uөJMsE>]NQ+:^sr$z0D@ۜk6í=0*"ӥRZkB BY+NnVu" evNz-ޗ4K*KHbUU+kժJ;fG.IIRҗj2nfr]:N[ BћH^]s rjz^AjKR[yNKzSh IW2BLI+fC- Rݥm7XA.!8_W M5!-p2Mt>*|CoV>]eL3k}(NZ6ϵb/8:I s,f]Ŭۨ6MWa5.O0ƞU˯r-W'BԳ٭Jf}b@+~uk[#4(XwՐYll \l-jN*5]ElbQzZ-t.E':Xv8wR-k =թr|z;͚IҨJIٵϗ ݒ$kzn)^U.vIJùe:&dA-΢6ޢ։b3 XVvMd UmnLU6gU-EeT WD'jVcssUߐKT:Ջ JBUwR{~S9NKKRY[U XX:kaz>&S\Fѹr\%_p;[ӹdmny5Gf*׬w[Ѵ6ϊ*zX.}>+vpvJʹel^mkbk-'5[ ԵnI)J7z jJUw6p {c]_ŧ(]VU4T}CVJbUV}I&B]h N`9f\P [0!bJ *xjۤ~Z.w^(YfM5:VϱvMTm&yv/mJomK*uhV,̈́o$<ڒ7^+q]ݮǺGi*-3;vMh)_:tkgEwiP5)`NohloM+X> ̞++r˱bJnݲ]e4ٳ&ɪQ$$]QFg*F9"z-ud?U$ٍ֪lV jbU3.vF%MjڶEf1)։$"eF߫A/e!Jr{Zo4'˯כ 2wK3- Vή9 ꩛d.rr ߱;\ZJVH7iOPM>UjL8<%ˆZt~*k BTdr8V[-ԼߥU.g'|8ONooeS֨X gG3Ve<i]< a g B,f$znvBьVN;E]Yݡ{œTk~$5OK|RnQJC0ȔXbiF @ [/A.(`H/(~C%E p 'ov_*TrY'=.PWSiF[]aԦ~4޶UTYn~*,%Xq:rf~QVjQrj[Vź׫|ǰ`7/ubS.jo跻:OU˼2_S {Iwچ0wUk5Jj7yz÷r+`IMdS[#1 K+ibњUqD. 5 &iz_:oC)Jj4OTkFǬc]~XͺWMk e KjVYy%b+UbԪ .EDh^uZubIbxɂZ,7K%ZWmg7 l5שeVo7#lRT)=Ipշ4ھUs gZ4ErGnYo+tvTll6YV"%hp~P֒_Em5Uw]AizW^_q YPR?Y޹jY,:WwVݺ݊ Դ[TߤR_0T}w{jWeuWR[*4Z`8mNQ[&&:~fyu!6g3]vR/wJ+**KlN9~kub$>iTl.[ۯzvuLdQۥ`sU@L&_x֧U;1ڧ(ל}rᙴNd/9N{vSh*]Pܚ5ks}E4~گmiq64FT:V%%٬dڅS.TWTm7Rhj픪EU%7ZWSnee?_-u7$T^ 5BɕշjJhtr*jOK(huަqŊ䴬RwuAiWkI`VdyWP+l_vYnw5Im}${4_.|bDf)<ͮury˩>(4Y ތױz/=R՛f"ZdVqjݲ4bSJO[G͑~jРFͭZtUWzO*4[&QPRU;6ʦSȴ:Q `jܪFjnW:nJv oRSw뭢w*>+T-SQj"9't/D(IUYZJ~^冧*ݳ-+Vah-Fy:6 %td.qnaLPF]W{cuRӔ*vKb>իݰ+~Ao(rA%I9@Gxl~o\Gszp+cϧKWWܢR+&f""Xa.]+5 ZЇZk45U]*^Sֻeܫ>Jz,)Zj+;a]zӢ*^-+Fhe0-f[.ǩ d zmM-$znH}ZӊSr-tu~Ӧu&Ͳ?lw9Z׻mg.]k֜nKitd^& vfk)jfCRY^cvJAkN jG{-yĶl^#kĊUkVb!t~|/[T+X(ZWEY& hGA6bo1s\U%S!Vk}RmRA+($`tG;hEARnuz jiŮY@,e 궻L[]JT8|0X{]-vN5@.OnΒ[ MHv+&ɴ˵'j_};~]kyVC2DJߖJ*^Kp8S jeVɄj)<6E&Vf`V,zCoHݯcWIny֚vSDZ3>Sfz+ھih5*F[kz_RÚ^cH$]:O#~jYREo> [$& iJ_GjvnP)Y)Liݚ *jz.MW[3 Nϥs+beIF[>hX)ʛ'e΢b맷kMO3 ^3^2䓻b+[-,v7+MN.ؖUWicָ"( 5 ETFjKfoROP,Onf[d]*{T4V-%ΎW crpZ~]\Kx}lubm\ݗ{ nnE0MLT܆.FJQɞ^7f%-p4M$iiSFABFeӪmVoHe$ zۧɄV^vU5IJ]%6b(ku(+]+KN֤rSEլir]D"ԛ2&7׈ra7i^S&5P{hw\˗]3bIj -Z`SHuT욬vV۔orPVlijenܴgVJX^OeskvFQrkžMln(H9]O=c*Z'r@~Gjw [x^W70'~unED[՜$ɅϮ=<ȃӪybᴝmt.:Kf pHO)$7\%rk)^n8lwvu;.5zv6|9zU`]`؆Iui"k1lI~GQsL~77fckuiݼBSt\v+OZ_ԬO#.f^#KEe2 +b\U|6{/6: /$Z[lf4㨕˨=E.6Lw[\- k׭Nu\empVuݎ]њrE5}Ue:[JXfCIbvTukSVwa?ZG,w,&շthZ6yMo58r͂,I}VUԲ\)MSB$Uuz)l:]t(c۩{uݩeI|4KCMar*tͪ%BYWՊ*ك#Lӕ͊'NZ]+ZNV<^Ћ~*?Mnh^}a~lۥ 76TMJFnƻZjZ>V5lU}UK;}W4\l9UK3 %}\[+,_K35E_2Y6Y+4zA O㐴vc2Cmծt .;r%K/ֺ"u?UĢ[zPC[Zs};~>)vZRWl?E7z#f,UkXY vůw ې;_Ҭ59@-UTOg/ݑ.jP[W+wSꪳBPlF7ּNVbAMZj[&lW{?S>P2@ZZj.՚rGv^E]%K+&QHoxZ׳tD.UKAtKխBɲ\W6QԂ$j^,،lI7o:a&}98]HzUnq3>%UM-&bԪ{ǔf8b&Ȣt4r- ׊e,Zf)(U  f\;ael1>C Xrה{ub+X3WLhzTcɢ ;eA|rvhޮ]j[}(ʴ2=bϯMKNRgl<뗻Ӭʢڰ/ 2qoۍ~K3LHVdhގ(80ŻQ EgDm4 ~c`H=],efG)*j䚮ؖZozMꙂ$M\oʼ؞q=Ŧ]-uzA.uH6~U8vիVVm:Ru4]&X^Ɍ,fٖ ]*=j>w8 xJ\4i]Xx;flkwdJATO~,wrަmuINZRzR^[G\e/],Qm*׭ nWPdc EP;2+Bgxϗ{4k>'&'k~,Syתkͬ:rUdMf_la@ rn\ [+~Co7w Et$Y2n-V!k¦ݽ(~M2=[W.ڂk}w|](rzz]V߱ m])lR]iWK]nCu*6 G.<2ZvŨTCjSZ-ç[*hd_&Jm.{S+6D_[+]_0 jA&sHUTm)- _C]jV(_Эϫ' /vWqJ-Z0ZE'ph:Iζdbgn Ѧ6E-l04fUg_:*SGժ1 ouϤ|ITz-7ێxvS{6?~J^dQKwA)n "P-8z Wz/~Œ+j{rh b(>Ȟj'H:MU^!6:U),RMM;&"U>[>*t68VŪK;oFA4sWsJtȒ1ZVh8c53\o3z5=EJU_kI+e04 a8e]i VQk͊Eޠ lOEd=NZ+ Ey: 6%_l*Z엽֒]Rخvz.DdUp{_,f38 b_|QTS6׭v$z A45Jĺ( Ϩ2-Wrj[u^ JrVk -uE,Eꍵ]3X:)K{= %[Uݫ?: QVZNU-)2~d!Fo薟&7;vW<ֶ+#nM)rk KYe[") qmS[ڪj:SbbIpeRZfY]*,%-JٸuՐ۽^t4_e[sʆ*>$*2ӸR7TQin_5Ήͨ (U5Ѭ;f[nG ꅹTA9cA>հ*rS1gx(wtdKrڮuMoJWFnkuzOhiY{C*w~U>dJ2ۥq[TnZ><Ћzr[~}ni]k2kyOA鬼~zmQZ%9 E/>]owFЍQ}OTk1m劺.Y-,4nJ_Թc z$ fmwuE QlŪ  @C,~b7 Ak/a%R3$PrݗX[=r2lVʥNQ}jƮr1fUwu"T,[(鵖55rSe7zt.RסX]W Oy.Kzt8$^ -pGmchg,zK/S]vWŞrnWaUZTFfkŖRT#VJ[A&9pDC&Z Ah$h,=Kd"v|:fUmil؂^UG(6g8bt=1~W{\xXWErn^tЙV ՝regH'a.̧\ce*RheMjMZNIVZK2sMKUSU2g V-(-Gu+5"rbU%erV;85(kg՞{_J.b}i\Usqɶq>IW򱳺oIB ;-ښLzʄNg喭O+ ,k4Z!V$*2[y ְr&MTʢMAjV5t~;%yR=],)m7-)7 ]KW*v_vg,JU-y2^G09jsu"ꕛvga5 ˯wb]m ]0^)jnr*gafI,me^Z[zO<څSyT1'cqV+ժ1=SZc=A_L05Y[,d=}$ǘmtS-7FA9ĺțROHWŚ%s0KvG/ Aoxow ɘoPJ0[ 톣l[ԺYjsut ͑;4]U^s&\1[\Y^.' -ё[SYv%U>aA3v0ae&[%x6*ŖuDXڵcݞQH2!7P [av.fucO<ç ^q ȞWĺYk{ͭER'֤7Y'4mGy5c譯~d2ݞ6˪4T3Yb.u4cʢ4\6hHl]WeVkVqZuKwz-nے,]'HR͆&S.6Y,{zIzGIIsvnڶV+]lTX;ҕvN]5Ř Er.G|~Mi7f+'b wHn{~.lZ)jr+WGqAgJR~n-vTKQKurkMTbnڕBa̡GVXԴ#%Gy~Y0Zڬ3%e޼;jYQʴ&iJsdhl4 yQg^~cUv߰R*Kbh~qwI*LzԄ~[7֫T,#5[cYI޾rGU%Mt;IVwzvM haZy7۾۳ K|lNzK: ԯ GU)Kmo+ŲK{~hyZ+ MMYtWxmG.6B#Jci B@*a~Eo-^w^04G0 @NZuK/O/ڼfcjSĞﳊVyn׬v(vڂ\]M+ҵ~FhiLӔh`ժ:ml|Q'W6\Bvug6^ꥊmjn UTWԵ+n4lJWmz_iz\7ms}0ykE|BkX>M'_/[=MףmjEܚݭE/eNA9N5YybHr j+ծ`8ΆcH5^X%2lBO  Q.Ȯ#StY6`Yl(d[XU&]ݪc +m_t^gTdI-ݲU+Wxd^u>Uz=Gݯ4$ᡊ7Uy-(usٗz/wVݎZ7n͔Z!Udo%YۍlWjzŮUlȆիijM4,mhVOUѱtqٚHpz0-nJ=QhU"m:&:v^,JY+{f'ʮYQTK> t^ӫiS֣dbXmm*GUZP㬲ް []/,iV㮵z5YoKR\5ڋ7Eӻ*eK6mk7 jjEYo>$Tkeflzլ)jіc_:5?iM]ZժvUN8Fe3e 鬺W;RW1=SKe]Pk°3ِu]\~* fi>Kgk`@2j` ߮rK!}X> WkvQ,w4v,uz>k)UZ}*BCٌ_% V51~ѰvAcUI8fxEu=r:mXݝ۪\qdW+=`W$rߥtq25 [׸x*%f;t[g[kcٴY1kvۙ<ٰEؒ>_+6j?zZhw[!-+%Ai}rŕ=^}$Tv]rEKR:R!֨8zCI+{J*,êKN_3<{[.y䭲״rK[^hNl#lR-rGl\er^N\ۥR[4QX; l {mnCV}zi[&KbrOokT hO+6]h~SWzE.5qԆձК[|`eOZj4e \EmU mDQn\Lٔst4G[j\0t޵M,u+C/2t^LϓVzíɢӰ*&J+:kTfݹQͺh4\֒u*qbYmwlwy7]ʤn,J=I{׎Lriw|h}W쒋MƗ1~uN_*Ud uMXMeؒeQ`,+zgl0֪m[RZjðiQj"r9bWgӚ~Z3[+;! OQL ^ԭ95L W~ŔI6!VC4bU^%fY2Kb 3k)M,VKhmK<_<4]c046K"E (}Wo7$aHj]UH?>Q*kk,weԝ`{=խwUBu^vݺ,vhx^J,C4k&3%bԊUkToTJV3fɬI֛OC<.8@ܙbXms=jꤩ_i-j2Dԛ $|O@veFKS<0>cu~_~C(m8vG[#]*(/jZ3Ć|6f\p^[i7b5lN&v\HˣԪ:U5M]XjE):|Zve*u%U':ɵ[a_] FA-WrWn MYkCQF;׸tLQ;f MZ_dE2ޞY/y!%_Z'ԖĭPvc{h;n|rީL5ưSe" St!rb4UpȍIPmVn2KRBg:KS~6Tznjj.j=!hJAUl+^lzSk֬,6Pn\kza-C W-szٰ-itɯ [JR)~40{͚PgW9nYm~/ufsrɾF赉j7AݢT8uElҔٞl*bw{9vdVԶ$z_h7\vC4[qꭇ\(rV{JϨv9vajFk{jc5)RKġךxu94G|2˕WI]ŪKۭ`Wv92<tվ]5UECVݯtc 5ŘE+s ZK4|nfO+֩Y]Gp%9eM VDzm 5Q?]ݴ:/SKf_j\Ȟ!܎au[}ֲj]n"EYkU>>Z3jQ4:,mRێkZy:]iO|X7(\-*zj0Z " /wA15<$ LTY-FɎڬ/ŊX-mW[Ʈ9&$XNao{]KXQIeN ݆ffͧO^hs~0-FsqURrLArx[OpzS(݆!(Xo(5A&pI5^7ʧw5h5fLp{Omm+[VK-vizSsn]z85Nb4DQu˵z+Xwe JSJ]ėאMᚶ"7zq"궠nVI{ɖ n4*>ޯVjQiH{^ٰ]7,Iث\gKBOXeXmH~2h4 8[jrVAl3%R#Yaչ2r=kƦ%2Q-$|Uǒ>Eił\2M.ElU=np& h.&kiY2 Kb7vo,UXp~TeQ6(4VtTi_m8()cQb<mnVp]y+r4[64~l d7[)l-S&[fo&FGThXfUBnM$zh/3TeREKR˰J&z,cүvM,W ܅cRk vzA+M,$[3=S"0׫~.zbǭuۤ\M&{ 4]b[6k}r{2ԋnfvٓ%M8Vovhj9)Vxpqr[;ޑ;# 8`HX`"~ R9v+BM,yE^s;dT4^#n[]sin]G5bViBXi_Ar>Kz]nVzXuWf*eQ1\PJ.営.U#| Zϣ+mjeMBԬܖS)ˇΓhgvөv5Vb3N- ΒtSV͂6\lWF*Zջǖ SYAfWjVݮVΦs"Eٴež_$Y(lm*V7-JfIUD듴h6,e5O~ӧ3$yX^!6EVLfv^]eNmW u;u9ݚYyLk*pUٽZ^lIHjt̊b^KV5/lᜎ^v 6ѐmK:|ݥrOvZS2mnWbK_T덯^vGu{|q$Vrhv0D^kKl E.7̆T*[mKfQHWdijZQ QOfn>(V[u]lJW2f"5T[؛gmWnL&bkDPh%~EVE˕e4*%O1V|\M ŽAxΆW\Ѕ1;w}J`-D{})ZSrQTײ؍NL[TdjgL *#=xhŊY _;~G-A7)@sx |ItYP6M GfI.+wFuV9)Z. uVi{uNn(Ԭw27S[CY\ }IVS=K:jYo؊WXݵ_Ն5۬t j,5LZYQC%/}TӣTRZzj+NQb)vK:̆͞cZHULHĚ/}{l^JeCV+=jh&(|ǴC~}K}TrݳKZM+X2\܊ꕆU"=iK3뭳4 Mslyrvѓ\Ul$>WCi M[/Jj}vkwCPDʠM(?C(-N%T`cs[g8]NZg|j:B@>Dر~]nI۰K~Cp_t'˘EqT/$:_=,QUh5DLG;UszYfʼn׺^I6a./~R*YnLC[:R[|Ԃ(j Z.b QʶmiZBZQbךmDꑺ"6g|[ꙕh ˮg ,rVvimvI':s.u*i馨6i zU\c kxNX,Hf)wj444Ibԅ;_YչGlUAiUMԹ.ք/nvemnUtV9~e-7EpIR%vfSNmu^Rdԯqf[U+noźd=7L^mj26WW!W\ܸ ߻)'vo:s[V_&fAhO(Ԕ9&ףuWZ7IJ[vvzz`Ʈ;UjîYm+]TvEX]~R*:%;Bԑ^lyfϞ2Y*FkY dn߸Ɏ4NBRך'UuWnzYnW޼-!>,LYg$$!U*NuoRVu;^QJBGk0_k4C35o<$\A%.$yeJx*E.OkݲfYho1(nUjr^oW9eY1Ri3bU[+g,;kWjVuZ^+vUMQo_}NSVD62)~@b[o^7%_{vG+e7nȁ E:iꮠ)mb2{(ncr*9F%Um7"b$TlRzѮ9Rq_V$PhUŢrmYzRdBK3JO됦jmt~C)jo8 36LUgSR [V4ޑ2RlkZ! fO7vL)]E]e-Wy{f_ui_Ea e[]ijT[:oq%3T\1N%6w5=Ij707VE/ɢ&OUnSiRbG.^8uEjZl:&C-* f]UwڜI[-|1m^VieYM ~[{z%RY ;ֻDmIӴZAUL6G.5:iB+V}HD]nKl6~t-~qrwvbJEP*Eu[Y-zG9vԵ&VOrIN$uWOq"k $|[,:bES^q5mX'i&!U8S{$_Ξ*j*FY'1rܖfyui:Yd"z(ЃZoc+vC^/~ǔ\0@ LoE>269Q/f۶b+Eiڊ8+UX۵mֆdZ/rEА>}%Mnsv1uZ5^)Q7UC:ՖXW nVIjިyӺ"+rSFN8n6WQlb^CRJй=sVZn:oߔw.WWܶm &GԆ ""]VP/^kK]<,JZZ4Bn\gr4|Am*b0:;SrrxzM5}Tʋ4!,\iLq}gt5.G)~T{!Z$|1YMR;Pi٘nhvڝnV7k^O8ŜUr4i)J;W.4o-RV+:k۪mGpkA˜_3,h63y*Q~SnnY:GAm0 RCnM˴ȯӫUf鄎W+_ƺm }oZ݌zUe {Lvt#Q]ѥٖU56Vt֭Uuz-s[("hjYU]M;B$5IVTM^;@anʒm5fY^ dua~ Qe2Sqxau0*CPvY-+'jl脽k:qmz&>b95OnכvfOQv,4~(WUhfZ Mk{rW]o m%&qG~$^lŖW_gW3[Րu7SLO+FVz2 6vW,qɩT5Sj5CKj{z:ڏՔFmESsZYP{Ն ~q,nX9$]ΡOܶu;ˢ#LS)zqB)YܓDj QXƚD/ f瓅u\VcteK/sl|FPVZ/*K){`5zQ&BSN|2ojSծ2Un0L,+-V,)N˪V 6,2&?]A-M:SǨ=nM\ٱ R:Q꼢]34oIVqk_+TΫn)M-wLz]%)EzMLI=%sp_GqZWlוTn]^{LEe]\M_nEv,5䲩7;F1s'*(5MVZPVdCjU֌or U[ZPX:yV*;퍺=-i]m)]KU5^ 5Oq8F YZ/ ^RJb_uY,KE)u{]"Ε+ noXk 嚅O VSz .CFG7aH~]DH@=Nm\__~3n(y[5nɆZIG1}fSXsnd/kJh˦)=qn*sd/bS2Eէ;[X/Ş%pE^uM2 {mn*Zҫb䞫jO =-sZVK\湕dQ 0a=93ZeMvpZbY fbKjՆX(=: Й#nZ6 rK)9A.Դ:bvy%a(޽^vIYF2FCgJzQjJAfǴLM3]* d1_^j%mBvnN(dz|Q$MsnWumZ/4KuOxu/8t78s$h?I m jl\־ZV hZ541Uf /jQUB]WAVAK~e'tTMs,! kU" /JvԞնriS-:[3}2jX֜K~YQjivI.e͑5 h}AdZWMnAeՎQJALLJzvA;UL6~zUoI~Gxrɕ E/aJͮWpdD9 JgW~*hB!@67DU"f:ժFT:Ew+py0žeG8&ٲ+{2}& I,l-X#NPzE/Y:W@ - _([8~fWTq<q/#c)]I6(jm$5]+V 2c9.՘~+noTQHFq]I5۽^!4vZ o[zj8lѪw4CZէjmU+ka. au$ ר]NuFe"!I_Ėo5ټ%+b5QRTJ^bJ+%WK׷{]]V Kke`XΨl٤Э]g2US)]H/wRUSj=-VֻVW5۞̏FMsng Udwn] c˵F`jұ*pn[ٝVe>1~E\C.))F,7,cv7PI7NtԻתs ^][Md]T}/DGvuڣ QjoȢ^ rZ%X:_*k{Ub=J%zRaj)bW6fh$Jum{I܂RD^UvA/Yr[GR̂3լwgjE*1P˞^Mk[,(nN,vZ%c/* POIԵ#y5X^ը uYHovKqm_lTت\y/sF:K֗ZRS4ܔ)|~Eu>$y֥-kjG5_nۅSZw8 E;O)jݳ zWW䪪z`z^YUuKuWh"C/kڽRm NW8_1NקrzˑѪ:D/eէw4åV̩R.aȬJm3ZMs<+C:ȧ7nb_O|C`nfصnz#t]+6٢XٙI{]w-푚~&Ѵ(,HmEQ*S0]\J}PV6MrE7,wJjS%qt[zE3jפY9 &r{oIO,O.2`Oy|٩z]ԫΕ&(Cَ1d8Vٍ`u^yЃIe)՗ZrN~|[v7lq6Mh0ZXH7fWeӧE])&hg Wgljf~UKT+xmݙk5+w-5UͭlsT\봪w}z}sNǖPcz'Rܑ\AqfGIפx[Ugݝn(vS>K&9/GMs-H\.x-1~~N,!VMexr](|sW]k&C)כB5yd? Gme.iwNGs+{T]gt: ՗u%[(y$ѬEIS >ky[k79N'rSvQ4EzanviVUZ%Fr-Ra*ǵSvSLdJ^-|vEnُiL˷Z~W,F/rH}cM얻fUU &kLO{V%Tfwꕮ!5&YM]9GAbd(irCk$xz+ K\S`n_G+;'/E {F|[n*cy Zl։j[fw=]-aNl~fBtvom-9(#wnu'XjhFmR^~_f%.f FR$8 i^/ E.9 ~<ôvT@D!%@(D`0@!=ū%*TmJ1VͮܓO+k^+n*\+=OjrOXN%:wEw_~M3tY3ܨ6hSXm݆_ovNw-Z%el!h]QfɇPj߯|nU;jbI$%MkjcHGLvHѝ:U>d-;ܞб/1՚rbfl]m7AHWZfS-im6d*U2/K 9Mut3YvKٵr-*F#ZS-~hҲ)Zx8#7to6Ag\eӥ*MT˅F2x^~U.;\-U%QJԃK3lI =vRSqAbv'U\.E_+Dz+}c]ҚSfimGjzͪ-ҙZ,߱]ϩh,QDgS9Ҡj16,=BR-8HFvZ.N["nAr`Ujv/WVU=WnMZݐ;RRE6*Ω[5_7:d 3Nٮ)[u,y%Cys , ѨwUhكl7ͩT <}rsrͦK+Lkf׫gslX/n2j6?b],_P:=sECiLe͡3P-EC5\Mˮ_jIvޭ,ݨ$*GD̠F) `߮8/[k-l `BR`$iwǏk0rSфTjĭIa~\ծWhWX1%fu>mi^5jbK^C_e|}pk7e}UQT7~4Y\5.[[mik[i\idq{|ªW6ڮ^oqvzU]~,)ҫܖYS\U.j2]U}kֺ}7nݧZ¦Ifr~lJ[j/lvO.*O!!w\IS:W15Z]ۺjSPvEfTьH/ VڭtcpJvU8(.ǝĖJyrݮ;ޕO(:iiѯf)ZO,7Y[髪Qj[-y咣ˮ=[V T<6+6.W;G9Z)=Y|f&iы\DוJzM?/Oq~S(OPW%D*صbJnq~dx=ߍ7 b)[2KrǰJ35[h[%5HAҭ6r߰ZRvb(˨hY`"DO@*[s B$tj)A `cǬ}xPd.Y*U[NX̦UnXMnuvkEA,NQ̱Z]+ZrZ5,pQ:wZ}ڷ\)MU|BOڀ5ՎV7i%lr/|QA)̖RyD %R|efϫiFe3c6Q.aʜFWcJ`]jjSfsSEE{`1DK"<6Z9KRϯ\Y]S'{ ժՔ6jϼ gjgDVM?z]n _e*akEջ0 g-ȦѐS/ZzuWי3G5 :^vr$"qaj|JK:z۱&7>OnrEe5#n r26]I5[<&7[|Iy9OY J1KدWkz3WWKDkTFpNe!ȍry%GuӬ2iT~6OVT-[^ű-$;Dfv.JQ-蘖]kdך(z#N9fc h (L$w6)"͓9tY^fEjm5\g 8Rs"TKp(XVlb^jk ]Y Oޥ_Yu^Y.ܶYْ"[Jwer/X.WWu^Z{( [4,^:fVk(R*~m[ŬĂXVT_(o8jGMU,$@reʄ՞&EۖğtP$ؔ^.-}[WU[bri&m9M)u"wYVtղ{^WibWu+M4I6pmvl%kF+D (keSXrVz͚VH\3:ܶbRPuNIz3ku)[(^~Pr_gTڵ5_}+wֺbT٥]g]Գ.wp~;flPRIuK.,0 QR[VxRbEI=4j͂m h5o-%G{%wqsjkX"+&G.yP]2nsP6MSٛJ_8ZKM=(ŨUԏ(M&5^9Z~Z>d&ݲϒA4!oeܫX,qZNMX[,RWhnYdmmN<jK.H4bY=ktf/3JW(0wte)G@S\橊nR:uv$a1oMeI57X[J~*)p=[h7QtZǘncehض(IlW˒Q0wXWrM{Oy= *4ߔJ=SM,>cv ^k5k[{[q-_3ݒjoֺZTӨI6A$VvISdj,2q5R)-+*']ǯs-V'+s IH3/Vi-WooZ6^g#-ͶzܢѲvn\ؔm3xnGGZ2SvCn$߮ݑնMwB3Bgk8Q3NݭTW{eaMB֘zO.}]Hsِvnui ׯ\,`b/ɯ͞zm㈽^q b&S2bOުw{0-GvvGk6N*Slk߮(IM,JͯLvVuZrë #6tr,|V{fmە 6hRf,Y*eY<jKzկs:/ufC2ͺx^G*j]5Sgېz[QǬ=ZATao,\8jg/o_5U6$Lr(|Y;jGtJO.Ƿ ^'=vͤV4~k.h:kq|BAԮ_vMob{%iV Sőt&lչܞJ 5 ]hVW{>,ھt٭"yZKEo/>iU[%֭VE^V݊YW],[Z4|_Sm] jWLdJv [Ŷ[pD$-e6m-i:U+[zRMWg}RQͪձ!ůi΂)=WLZ ~H.H]kz1DJ?242",AU6r/zA;^o(~P Ox+ #-r,ʾ-c7v[;bk5iа_YbMERd&S_ZEj6[S m4U:ÕZ4[:ך6WTVn~SJ[zY5o f]6ՂܨTCvp)[z6/(\K(wp{68TYOfY(kbn̆]1&TE[*6[s3 vqY8~Mb|b6dZ TSE--#hު%-X~jS o-R6w}/\%e6[.`4etm[4Uq+NkL.-4 dJlvٔk!<ݎ_MW ^ro4YnVQMClz`uRI֜bp{Jwe`ԛeEjj粝%zOM*zڅկ:5PY Mޭ^[>C{5fZ$na}bWq~MU/4lW7Dt&̺PUo ְ]y Q3]jO*:C:Tܿ׫Õ:A6]6bIVk6z]f|n; t-Z%,ET!:Xlzj*We=MVJ'֪Mkεiߞj > ) A-zc_ $-OX@ KKxJ^Ϯ[~̽keMA-R(#I_ݓuzرbwSpfE/VVSpOZ0QTKrzVMժ(ŖgvQu|iZur45[',ܯ|5oZەO1zz(*fUgWuH7_6;[o nr5d?NofM*u.lv~fsǭB:uwQ7ӵ[g#ZBM绞J݆n{v\W*R+WD^Ys̮lw*>uL[նIDԏ[״-ѐݒQky[$ rRmeTbե1SnvMplgww5.Vv#7 ~X#,aӺ엝^J}j\ P+߰M+qM2]Z* sv1ΆokbU쉎UT(rK^]q+XtΤ{S;{b 56 /{=/I Qjem2,(uVpVmMQJ[+j~3jCt^jj%| X{)ߚmE:[[}m B$tiz(HVa]UjJڟ#8qJ7dϨǧnŚvV]* g"85LL[t͛^J[jmZz_*UB/hz-7Ei*}lSNY$M-uNZjʜN]V* kis4(-*L,n[V{D[TnO,Zb=nxsUn_єEu*QiG#Kr_=ͫ]\6&XBH$4MEot JwNA+)ѻE>YRS.) /j$ ιP ^ȥqRUVDr q.*WMt[Oqift_ڂ k\zT;fRt;J/^ nO@x=>Ƞ1 [.`%aho8~AG3FBJVv .*nUfEvkqDEwys)^jmɮKݲ[m_:gӶ,K-vQQ->W'5:LnR&:d4Vn bk*Jn&BY+JMlJV)]1& QBi_RE}5X-媢_HrW3kcIyb,mVVݑY戎7BW4]ͺNu:I4-b+5΢ ʧmj8\QRfѝZztKo+Fתv:(ۆpzݑ6|RcIKtFSb, %Y9b̐fI'}g<V*sR1٫C8ר56V]{?Q(zhWզiւӯz;%A.T[T[&\R2lչW+V))K4`6r#".j͆Y!i(P3ms&S^5쪹*vMvQvd.?r}|nQŻ wtG Rf`.~E/~C[r`nv~IC*ñ[lY-L{X,wLrPnU隅;oW_,|cyjXzrSJQH֕Trt_2ZXjԕ+FD57ԢIVˌ*vKl;.WG. jjgR_M]uzලnre55Y"^\*~n֊rjT[Jmz\+ջ%$F٫Ϻt:-*K{Ih-F6ݮz[$\RuٝRVpk.uzmUM:gd!QG/ruQr*Nɫkj"H5lAU*=K,aH |jYIji=I^鶻r+z/Re2ͦYkKͳ 4c^EMYEuhp;%i *'KH'۴c6~NPbpkOu?BԮ|sbPo^JigI}O3C+Ilڱ[h>ng7DaJl[(iuɰrMUMX5dn\Y;Qm7Kζ S.*wo_qJ(^) BA/>4c 5 ])~IjBኍ^,PGM)ev&k,Ӓ:g+fEK0U+ַ˵{%RerU8_HFUr?{;ck=tmfftѢmuD.`\vY=|,؅!ذ濱daˆ7d:Phт+zj_/8v!I\ aH- $dS(-лc_b-EWuDQmhgĬ^<-Slx6'j99.Dwn6zM:i+)bGd~o^oQ~ 5ZS?zݲ0enqL嗵>]"tCmۗjF,Ug1dM4E9QKU" eCf,XhU^cYGd[m<[Ϭȑ9FYbO_ɹèl̆PH?(E9f%m饱_ Ѱ] ^$t%MkKve45qY1k}kŕGV\=VJvN9+_ϭuLLUeݭWQ[T,ݖ~J[. Ğ8>+Wܒ5-jqU|Q.bKx+K\/e|g*L5wBAiڢA-Uɷ`M}wpBr|"k|핍sXRA%XP^ZD<EK%U~X_S5Z,7;{])="Ԙ-43WZ[oQZnگ-{RjhubTij:kG/LuTzcwjԊVUrUoRj~(ujW+r޲ZLR}2fܱj,ح>chmmڕWlmjC*E{ZwHF-6=[SJY>W; 0$p;ߴ$4*Sombl2Fӌ<HЃ,~aW`(]/Hks :||\n^q||kFJj4ܷ'VZY.wLX.[֋SjwyTK-+{rB/Um]. զ4V<4]΂ KoHzѬw\[wjS(Mѯje^'Yl:ZŧSW[*I29Hفrj۩+ݖZeJ]Z^YS^_Tβe.CntgIU.Jh6QY5ݥY}AhunjjvVcuQ GմfKLWjZm \x Q.<*ۭ[-V« *vJβzSA-z9$f᭶͂Wn mܯwZTGͽrIV[ P+)nÐg?"-XԋzA|r\2{T3{Uɳ%_ctZggTnIYĞ;B&"3)zٱ:"د{˚Ѵ>gkH%{\jzIie^Q׆gm_,2+FpOnMiuέgXtjUժyZ-W*tUI#eݹlrkpK^Qvݯ?b{1wuuUq _c=Պ.EAju:%׳],[k ȴ3mVU]M[CJ5}+J6ӭ{IVer'jFo{;&YWenVg6}FIt5ܮrj^eh%EQn2ԭFc;z $wnuknCKJ7Q8$GtZWlGi&o1OU+^Lx=CJV+ĞDb%9vjn#1x G~"[/ .߯xZvұ&^S&DeEfg2#Xkڮ}G֍aMGdnA.[Mvec,ר Nd&fm|ռnC:ڰ֊յVV[v|Іlkr~EhW-Kzw >auVĂ8.{kڅ{T5`8XŢܮ2u3KZ'jT5ZbU.CX\C*"Ԃ^M[t<K.9bP'^Wj}]삠K=CoԾjjUbT2ZۅGSǹv ~ԛjO-WTj"9vd,*jZ*d-͖JwnEVŵ*oH*RMM{UC[{[2A 6Om\̻\bW[R'EKĶIy)u$|v}bܰs9jllSuZ]ZXg.9j;WMتb;k]2qtWʜ^[O_{$MѝDxxrS|a %vհLU9xϭҖFQ4ڍl.וd5z[.x>e C+u6Gee3C)^a7>CԹ$J"|ZZAӪ6li˴IY+IٝzRr ml?ZNh4e݊[T_2rߒj9DՊE_W:D[-b#X}_ZF7륦ŤNӐ%WP^ߐjp~[GQf.kb1_-7$SI*y=nk}0\If1/ fcaZ[{gWܾj353j͛9IeZ͊fj2\zfK,d#Ev0A+_/ (Z(zx@ Cߎ`1v?z(d x6JK[ԣ\Tk=+ijyV3 ^ASŚU=9J_,KvC~zVO6¢PTYI𵆭ՆhRm]>ǯ%YC]5/^anVJ씄Zc 5&*[łi].8jͬ*Q,DkM{$ۯUU3+ݒ&ښ0%w)[Q^VmC#o-RVSEU\PdR;n"0{EQj(VL5W8njV2V6ͲS^xFP' Z;vtizW%V ʃ#PkNwegLo(k'jwv!U/.Yv*e'Գ:v4SczA/myaUvWb5:{ݮIRӮ-MjCX_jJgSV\ȸz,7)UQYi*ʦ/;U#)Ng}q]Ԓ"8VefW-.SK,6{zc4+ݢ]:FmiVjw[=Q.E0%ͺ-\JkqzjM겾-uVtVMARb_(R嫕:Zr*;Y*Y-XB1U[&+6NOݘ6]r֮9%+ViuZ#ٚ4ڕxꢝ#,O-X,SF]E(N*M)z mE>Gs~X=,vW؍zawi'jjl.,vZ:Km{f\SfJU.۞]i{$2dӝX6aPY)~W)>LumZwctTNg5tH_qT[$q=EfѻjV5k|K EոTZ[J"xtfUVxǫh˖{ugXĻp<ؠjV8ݶT~n=" UBc8mKt+eɥl?O`֫=E#H|YحafZ4{J@lZ/kVTR;e6ltVRŖj-Do|o۴Vdm)8Mj:i,4n6[k2zj*M} qzaխ J!DUd^d$}#TB:\37jku.}pIoVoUkmsUeaFnʚGhkW]w7jh FѶ =4 Wob!U0:ۧPZܴ,DGj,R~㰔)̷ޓ\QZV^wOus-7bKmT^&*s˾W^F}H+ >tG)r%׋dX~0Z1Q69 C4i'[nQ v"+m Nw\. -S+bWcZzbW*ejPl+NUX]?NȉWήj^QPjO/f *_m:n#BlM:LmjdՎYTv}u~ ,N O͎ WԲɷj]zAeش*vskUdI7&O0 MkT1;|z^nX1NhŪi!62zdv%%ðF-4-VN*In)͙U;~yEFm|pr TEp+eUkq&&ͦY=24+U~eYXTv-v+jG7{n BMnN2 ]mkoyK1D+zSL׭J/ P(#Txɹ(VGxv/fYR˗JqyGmSSo=í[*E%OOZb%Sz*o NTM^NBYSnAlT|ĞrvZW(.3Ղ#)CGCrA.4:FM e[|"UZ~MkfmnV\ (9({,7ٜR閹n]K.IU*if4\C ovWrb Su )Uչ/kft.5[u\uTڔ;/XZ+fI-8YrO4UћlaZ_ j #BѲj!$[x%20A@Wڪ8%vNram`vTR$2V؋199!hRY%x誽Gnݥ 6JUgkjV.JZl*s߲,Ug)`_j =NSJ,TߟFg *|~CmGf>oMW(5)vmGx*~ѳMț&F9ny[FSmnv}mq_nWe.~-e P-&YV6žR=eR:*С388b__G^z$8q`j]3)$봲͕㑾Y`ɲ;^[hB'7.[V~U~G=wndoբZVO횞S,7ܖe7i67^ծ:\6ftg߭}ouKzF lwEsmE3H9=C @[Uz/r$luxҤwS,6]e\]GrtZ[rOTcEorJOkIysqbׯx7U]R̫]&?ֱn]hO 2![)Z/4h}YSk_4QoW=b0T*,T]V,*Vi(63 [ vVn*RW}&+eR;SmHa#)ʢ,! ^[Le|!+FZ6FDahemDCi-.ӝJ:E߰lB]Wϣ(N+=x;V"5%j7k}ziv_Rfedj-_tjvEO1nH`j+sNKPfsyQsbr(SS;I"FtKtɕG*W^eoȃ"m/9Uخ,N_u{%YQFbC;Nh-Cv%a)؟ũ2(''-CoX]"QlvqjW#}VYƳdŭh}1|ϪUm׎XӛZI,rdn+"Z-.!W8uӚ*>GS]^³Eѯ纍L-ƨlHXn ~Co(z# ]n( UP %߫T. jcUYDJT߷ojڽfKf}A[GnTF[j6mESwE߭7zM{21D]:ukmXz_PVJ\P]/ɅQZzIKfO+fYwMKYJ3# E3ڬ:KsvE4, kO(n52v E뷜NZ$nH)u [*!zWTbdlQѾWf!slq&2m6N^lՒi3.E)Q+, QqDCw^YْM-*Mo-W7s]n8*.Mh)WSXjhXn ߬ jkQ7YX;gnW5l[U**媜Tbԧf"[VZת==s3 A[_c]Eg ė wF;GY̗J$HK.ܷs$rTWGɇa䨘V͂k۬ClKzafOZwE2]Zf1n3ņ%J]R [SgurnB[ѮRxZuJQP01IJYݺ0MU-zt-Z%5*w>v3>$}aYz&KU[rǣUURs5fK;_(]ӻS8%,O2ƹ fޱjku An;~UrJtY˾Yv,^-vi7c.A3Wޯh\ozGQGOP T Zr>P-Fji.0SXh5a:Oѵa[뵂8gԮw]^A(_ZnKn * : Gz5VjuRiSsuAnԵIꕿ~u+9A*z[ɒRK+]X9⹫P,}2u{41~ҙO=阕~O*"ze7~k[P1ۭgո_z2:Y2{̲^pVՙmfY*8FS+'UJ\[,HXZ_,UQ5]Cn]vgE^o9~rtlt\T̆ɴ-"-Rc瘼l`לb̵/5J,[억Bͤ5Ѳe"BRt{ZPgԯcT/Wբe 9:84=}Ij}2Ar}}J.{-W+݃%Ef4hgY'IoZFU]SkW>Ssųnn%֫n&UÒL8]$|Z]V_/ɭϹoWƖĨR1)k=RϦ ~[Qd˚u g=ܦU+VTtrjE֮KfC誠zюlI5zw:, JB'x,w;vA;~_^n~ch-! >`-J].yebF{\gZbkej%ӃK*raE8]{K,+Ȯ4kZ!WWr ^^eGm,o|WŽʍt#xߖ%V NA*תz+_ov\,tlKxmC =}Pcu:%RlrErTnbyՕ5 ygWΞx*[knC];Zr\khBWYuZ7n˅\ڑ1WV*stm&CT"-1W-7mJ헴[v fydzAt5j諕[-?֔$,Upjh;lTT]]m4HE+~_l8&~QOq*Xo]Zg~W{'[n۬oY%~0կ-ש2픅:n j_Vf5zNѱZŵpjY K-$hYi %/rleO-lؼ")LGnt9Υ v)zM9RIl*vJ*wj(6NnWD3:י*M_,5.Q)w bː]Q{ᛄWf0UqvAkZZb$ kTr_[v3&Y̒go"}fB\J3(JW7`$m[׬ReaU^b5j5<08gPznTU*bvEΑ{)lbIt{zSAle=4)\nd8_m]tT+v=B6@ zf`7P`  (^8Ů3 TI0Vnν(>! I(kWVFYJCzYUԲY{x &zUfJw[Y cwYuG@`U%&^'VGh1N+$Z]ll9fQԫPvIhmh-Zm ۦv)/ejNY. ^)]tԎ`vխDG* bni4]|ۯYy$:^ٯwZfkJ'wTR /w;c5F\Rq{v%զUU.Rې ΦX]EiV^WXGEQ FSE58&,bGk[SZ1]\l2ԆuN5*V5b݌%7;$B6DZ,.٨MI-Y6NT;j[#)^O6z4ZׯR4ժhi0ն1z5Gvq;vѥy%aj>S4no׋+&IuZD^Y07;/M3tA9Mu Vj^RQb몚jJs|n~h_hEzAq8կ늵[VQdI;&lW+&V 􋎦Wk-e\xX Oo5څkSj['~.F:е-ͦPcF$$N (1gi rsfK ]ɥRjˍDqq,BWFW~CKfiNEPe|bW=]RJcJ^iM#mZUM؂z%I\BWIP|TVk'i5ag6ձJJq2*R|g+jV@rj1t̶]WSFg[^h{V;vl rqn)]ZU[NMN,۔5+\چ5h(ws sfgfũ~\g6[@`>XuJGˤimUɑ$f,~>m8VϯIls&GYZq盍nO-kbRi-JkB!w)~04"K:o7]ǧfoyb4E2(ʎ-eo,ZM^rr\OyvVHV[R9v}\.! `LEbUF72t̎Pk:ͱ ] ~]j_*ͱX O[E,^(%XdU^Y< UA2߫j^_3_-a+X[~h4J- <XYzE ~ï Z1 K6@z:o&i6hɥ$Xmպ< &Si4ޭڕ\*o˓u;]FadDܑ&3Yw*٥fI4,cV{tZשIԎUui:.eDVkWrSXdD)c.Y+i+ 6Zeרd[m]pJBInٟ*Rű/sԖQd_8ĽvɵkFUzZlJ_ժ4}YWb$ a$J-Ea7^STkbm܊#S(nZ5ϰ+RӯLAj:%Mzŭ7mkNՒOIfҰT/bY"kb&g; _ޱ[ђܲ2uc&YYWyG5 [4K+lA6ծ(XJW(Z^U(uKS^wFRJR[Kq,M[n75mmmxeuqdG5.;򔷪T5?ZW9W׵ԕ*͆SQݚذRmnKAUvIP'(R4Wn [*+WEW"(Ə[2S-X[AwK* nVdvSZh|ܭsLҔa^EvO'*w%͡3I9-Lv̯+ ,Q0׵¬;dN47Uzb5-S 4VI50Z_4Y|ڥ߯뤯);)BI,xfV%p ># rb_ Cҋ:JguQ( ,!hZ_n-2(_UJ.ƣЙEGP*땝^ QT-)8jW0:4kQ4Tu KK^, f۩͔Cj,鴼S+noY,Mw RȓPRfIT}4K2[|[u~ޤ=w-^zuɪY ^/7E-42gԪ+K)w;:y,MZfXlKm,刭o h&& _!^,iMFM_R[o:e*بɧ/zM]kV-Y}kvnI튢VSv;hZD$)JD%ӫm$~7$(l]5PvO"Tv{Y0|Tr8&_G*q,cW,uu~_{¤Kf[w&96~nkp5S8j]ꌞ0i5lY&V .::nWIjKj~Q F[ }1jxuSvT(N-6AkìTĊw븭m=b"yUK*.:-]vj7,91˥ȅx]uŊv٫=n~:'W~[ڒT%jjV 햬bƜN׌ceٻ"]zmnԞ檍W&ک5F5avjr Nն,Z/HnŶFkh%꒙e$A!x=ՓW*Gaq+J2/3e7WΝ̒KfWZKZvKZIq=ž^Y+kQqo"7bD8H.QZY-:ϩtV>Xr"jFbDDaٱ;KvM6TFI]}vS&Mv)`;JVnփ^5tQ庢Qr:S4 Jv 뭈new}SDǫhchJevobX>EՌNvv5Dٜ*tӲ*u]kuV, OY9bӯZ1 brKSy.0,Sr^]+\/1 /@ %/,;IrzkV:~+abKBbĖޭR+N}Il2 t\تzINv:5njK헋ftzcK/;(̝I.9o]2Me:E54{lji^(rƣЋ"WZ9Mjו٘lQ/{*S]].8Y`boMuM-_=]-(DhvEMAkC܎W̿ jS,mSOvJAѻjWkMnQnX%EX:ѫ,/ - aE+|*\5ek2V"S妾_ݓ&;.8MGTUJOڽOn<ڕsZZK+tݖ_=nC]-Vzz/7cuTX [!F-ͬY~O,%[]U66{F]*(c%(-ٯQX5$8>;%gj{WFY\ X;ﵙjE¹;+^TW%VW+QFCvslYvQb"R*mMУtvE/zC7DM?@ PbQ:N$V6}G8KmO>ƀi5q܂M7{r~3Qk%iJ-ɖX.ml_`TM+Kmzkt[hlMLrQ_j~TEj(Yuܖp1նSCznMp+-ŢaULȖi u<(dc;Jjmk/SK zՓ]W%mU8" X47[Rs4M-;+nC [ב E*򫅛t:.Oئ l+rA+OZX#v nUW^Ǔ.z&[!1iҿ:=[{њUI[﵌ᗋle˥g.ɳ &et~r_SbG](֢\85]Cxfix[v{LrNs]6mz Jm6}6mZkuݮ­T4O T2/uÓ[>,a$k225FTJ*KrvۮZeueF[I]"5,_d av}UivxW6)zK۞QI.HRkt7[jofu\vEn\zk ^!3UjD!L{ 5$oMVܺ:u*t[$n^ݣ~vfE*ڮݺtc_ ߷-rͫ3N5 om-HQJ1WCzTZ[^q%4(>$ig ]P)ݴ|zMk.,{:W+ UEe綖Xjuݞ³zޯfg,ԸR/ݮ]O+9MK ӯ>`Uw2TVlN46]W۫Nl5c7FU R(V+݊0_WR6iT̞:40ˬOڵQ.wj2jű^ե5wI/9U(ZQ.4Mt"r{^)*u IvZ,Z^[z+RML.nޫs\Bk w뵝d,@ &ݬ7[vc ܰzɯH"(0rlCU65ljS$O]y36WUպxxڨ{%ծ߲t.M5nizzZR)~$ݍJ/(bC |G8r(FIf8j Yye?[jVU%peY͐뽞.zիuIWm-ʰ5AHUeywV1Z4(O6A 5QzZY~C}o6,}jԯ fWr,t"_W{,(ra:g;U VAJU95]e`\_U}(j7'9LcnxnƱ8-])^dk,j}]*wm^($ֱK(ˤ+Ԇ~`zzVYm&z׍%9 Ҵj~22׹| fد6gX,rko{|6\/:g_ExGq# T =N_/+zAQޮ!(`~8]1:SAzU>ϴF^ʻ꒮vS7~Ip{VWM* ~.-/ku#{azCZbc*پ[7rg mf*jA̢XWjF"/,JS65l-Ԛ[\PnR+Ft9< 6-LAJ^նwJi$z4[1|j*~C+ݢiUvx6R)rqNٔ%#}R\j`5~Q0Nk4Uyje6V+Z*lHoo Ǣ=4~+Ui︗VT-RHe5e\d7=h,ʥwuq =Oj[=Ҥ[,IZjzKfS!3M$U4mԮjڍ)fG^E-Q2U3iuuնf,iWBgndK+]\k~;U0RԬ%T^݂]bJ[Rѯ=b*5V|Rc-7eeRٮ2bڨՔ~kʫU̒K ` EE㐄.;hIVOc'xѥVۖOnM$x]:El٫~%f[|<6Y7U4Ն[:~MoTīG7kӦ}aԢjEP<ݚZnVŶ[*_rQΎ2؍Mm:s"F֊!Vf1٭.HյvCܕm邠L^e%fpfIjcYmPEisnfXf=:Ɏ9OjUjR;EVWJw~vdLu cj1\VXY=jhz۰VKЫ^R#v2TSf]f~%:ؐ{O'sd/M'~YoJfR\A/v4MB+׋}A~(}SsCRbOGnrv@4(2P)r]mNU܊W4AfŲP~nd*Q\N'b@@ /~/vA[]$8P#։MOT;)Ӥ<uݏ&ZVb+Lp̲SIUz\Dvǰ$KR^+j]MׄW(nYʺ]mf-zmctJWlޠZEZU0Ԗ5o=)yѫ,~TEh_E򷖣6i S_t Zb#T XNS5JNFɨ~xVĊwcFW^UCݙyU.o6v8 7dNGi^e O=b[y_N6&SBXj J+`nonU^^ӝbWFyp%dm=]UjVFG*j A\;6l* *v4 urKR1Ǫz'~WUpڽ&W56ruXj`wJvMW~*%ݭxMUQz"MZ5Jvek~.V)힢=V?n̵3+Yڭb7keEP(jj\\$iPzeP(Ns1;G^OO>O)kݭ&7cnPJ˩~kWUUvu*ms.pU.LNK[Wk]fЖvk%zɪ׺MmF) cl-0Hq^F۴gLM-^?jE7GAߓQ_bi\[6[vM/2m]^W]Qv%uH~vjIs.X4 \9]rhKv׻$Le [:KG` ^#4Y,ZXr)=fI ~S A{tI"Qū\ ʫNPź^L+%]5̎$BŰ;s[˶Oj\Y2OXyCtՎ TZWP{K5[zay3%W z^lf]$_u.j7:Lzn͔ vK:: Qt\~K[-zM(UTǵFQ+2>Q-. ΧĪ\0;zI)hI52Rg ~o^݆W+}.A&z5AqK4l^۩̮5K%HŎIX \r>VmVsӜCzmג]KrWv+cN0ziԑNI҄V+j_/k -%YdVN3yZSH{7+ݖa^];W^$]bOR%co!ˢ%;ViEGJXpfL7KدJ5fKJ.mm$In]+*,k%1+ERkeҭݚ Ao:iϧ=n':e^\#4+bCqi^vEeI-LUg鷴Wvǵ͊-Dn( o645==lzjMKZo4N&[pMFvv93TzY.4E2DدI~[2mrBlrNLV0}bzjakU#HjU\fizoLW5@~OIR.nMk%0Ɏm]K݆2ee,O{!6ۊMŚ,+J˅-=bےsjC/^ٽ=oMo|M͙afZo KT:έ5;+*^R~8+hB.by +, @KwޮCMW0$4G4e-tQ~)ӯ.NKBۂrJ6lڄ* W~Qef6Kӭm |z*uEgrEKݹ=~Ԗ&-A'm(!2PiW.6{JIbY5iV}hkA/9&u3Bt/jSfW-nT;!ܤl-V,x#զ%5_W7Wp2XRMjKժkU)!,TM%K٪vˇ}ZR3~N7'1/Kn Ѭ؂AK=i|Y.ץYfKUghkMokdZifun*05綛Bѩqvd:_0$w=R+=VI=g:rvݪCkcyRnm2Cl umR &I9~XSщ%Rjsy|/l.P PK,*_ɯ7d'^]cU~g6ſޏh>A+uemZ~ű[lwn3l$߭Urԭ6JSԋgWnbWva6]3Bhۜ⛪-Y 'vkk4EvŒn5K٭1-Ixfj_:^K0{f4'􂲔֫K^oZmr(A%JfCQ"vu(EW.XoLjW'V*nAP$2yqdz=&Ov4rT6yVժ)^g1k\**KZ=r/}ÿYP! WzC/]^ogE[A % t$|OAתM%RESncH%QB-HYz6MVTCv^íU%5%MlV[\^[nՒ[5xf rkxV˭z`kfcy&aw-5LAζ 5VX5z lS^s0<;~CѶjcŪwvg63 lN 9.+rWP2%Zzr{ײZJˆW۶o~]lWi\I_ex].&V4V*Umm,fjq+ͺpV*KH f4cIeqJzL:\58 |򚕦ҳ]U+'!0}"Y~+ISr:VOjv׈>ՕZvX[Q%GS]ۭw:MEFJܢeQ[՜)hj5;͞rh' vk̽-c˽v6iu#UR]J'?B^3 {# kM6FC$댲wkF Pd:̴#}6IJ]s(ZCW-ڤj)-7 ͳ֠lkz$FDz.Wx6"&yw,W^l4w* |,6 f\,Tv}wnqEYFSǾjpxzx '-gtʬn8dsVD`>ڬxv<-vyk_kK!Z(;}[tE 2gTtf>o8'(jϨj:-P%lWmƉp %Xv+z I]+!(&,8!w9iF 7ʄ&OiajJeU.Q;_.^MV:]Un)UNRrߦJ%T\&͒ rz&T9]n[MW-odۛZeAu ~E6+BC/U [Ylp4Ooj w4IxFPvDt,b m[Vul^aPyUJI.vneH &즴\msmS/³ɂ$Uu=֭%kVM35v9s Z|)dѹ K61®QZ`:aokY Bg-Ƭ5OevIp[$:Y7] ]/`0@kIUƷhlRcW[ϼvGa ~KXU4+1XhM0R-6Ԭmvm]f]z]mՒYr#3۾85 []*,d]Fnv?|;=\.tl9F?X 6Vg4D}be5=Kl2n;B͒h>jwxI* ;zk.Z2Q'uvĽX*Q-`]%K^I&qݞ(i0[ /4 /5D1E\K`tTDk3GkTkL&z9d,HfJ_Jt3 , MtQI2Wo/*nWݶ%a eb(:{$,Z~E2~Um\=2YS/QxMJϑzUn9}K0U1,O.Wrmu ]R%;Zlף͎LbVsm2^*mDk44K𗈒+*](wKmm64a rNΗzN<8bWD{&Un*U2KM+tۭX*1e򛽞U*\U<[jSSGSZfI˵+}zHVpZ܂^8ra V^K1!*u]AөZ46d plRZ:^QZIٔڎ.UjE$z^3]KXդ6U5Z}yXu_WR{FYbH':MAoeLVMPܪ(oXzfMU#.'\clڛ-EYmW,;R9 ;r[kzr3&?Rk5i՞_W+fo*UO'[í5qĆAŞ] ϸfXJj͡1ϰw]r۸cv=t>`傯k^Kr{-j:"\B("XMjSfV.*J[(Ūa}zVGV$&Um$ٖLweT-҉uɩKTOlywڕ&MKVI~dIj86mV k-I5.CIefZh8rٮӖrX+4Z簾ͻ-u%`|5&sTz~6t^W<_(;GIBm wjiE^aD]jeRAl5/vq FYQd XTcǬkZu^Yzy۬&U.wԲ-:B]9EŖY-ta,:?NeRYfLVt7SCr:V5JZAUԢ-.i~AD+Z6vT>fS%PM_62V@u"i~(4>ev{TM]m˞UiW$UMk^U4G]A{V0-m*/mPWz=4>Qvb5 9 p(n_n(v/&/(zKVoP0@A{u׮t ܺn])B KiJ=6O,̮n[Ͽ|%nM_;V1[ 3D/50]tmM5մTKCn-7 jSi:qyO%6Ev%]5Ǔɮ]Lnw0hPY-5Yy/Gi?ڌJetdQ}lwlnN[kKz.72J괻JQg2ގT^V&[ ]4G+ ŨRd m(X]W5J%bUJ1x}Y9vP7ZBh [ke Kɭ4*Y)zWijSvAIJ*#6ue!Zѭщ6rՕYmܝHo.fY\5c[Z:ձZ3rb~,AUlj- έΫk,J jْ6At=22tbٯhʪS+:Rcb=>l%8gTo gS| rO+ڝߧITav2YR"]0.ӾKZr|A;^t險K'i5f;RZ>6Ju_۬v ukͺYmƷX$5cYWRˬՙ͎z&}Kltlw_RQ:JTm5lg\U靛P-095G+|̂:X$Ei9ܫ;RL JsyJUǼWoOїbxVW0]VDIϕxqP =F WnzC;-. hu֎3閏 <+S{"ۭb5R'p~krV*RZ\7DGحbM6Kvau+Rٔk2dzOەSuߩtr[ֺ.l49LN4K5 VHY|j-2ͫeⵅFiY[>5IcNϫUd"lj`)MWNթ:\ [Eo_kʅ\ >]fz(vZ])T:Ci܌2>/<'۔뚭z'i^Z"ʞ3䳱 cĞ֕]G/]'|^YH<`z^T JӮV-+ NyFUiMkqWkcfRU|ljf"Ԗռ 6SuJv,jG^xK5=O*#WQ]jݲʥB[&Kz_ tIUͨ{E{e1UsQ|jWnmMj;vٮ Bd)Y;rcgzy"2MQ"_5 Z3ո[#>Kk>vUnem(^{>Sj)~7QvKy jë ufaTrn u;[Vcv\LoiD~ Ip$\mC껥/l>(8cChfKmzaUP=߰*v:=kcY^lt9ҨYt\Ñݢj]]pjmjSmPsqyU'@ YW]+wMn$@@P?Q2\Lmfͨkl-:&(G0[km$((zAUzS~M W5Vny~[o^=S QR/5eURa,+|rKj<%ٯyn +e?zLn%>_ݯWIZ Zo/= 1̶v]1mi5.SS ?Ȫ:K?ͺ ~K*HWKsGdQ,+W=oXžŢUv&{4[[ToNT3K 3U.hA~:+R-=4WXbETJo15jMW4oP|zkrm[2_rU)(L\zM92KP, 3vՋci_sk%:>wzr35S/*/ɮWY2f[=߹^]hw_bKOb;Yv:oqTĆDFI{2iSu߮ vMsAK=W؍gc[WVnR(}Vg]6 Cn,&WvE,Lsَ*s:Mjoc]Q rk}˭r3R+NՕ^C!i뗑xȁr-g{b-se+V(/EڵZ"]GϵfqE,8y%Af8E)xrCwَuaz=OgۤJEۥ[|l@^`z v\/~CK0pqQ3vWٶ]ҹvMq%8*54rb# %ut^\{W(X*pT< ^0ձYzE]˥5u[7;#eYf sMc .Id xl5-,CY\ wQef)3CA6\k؍.Zufb;~k5ɲ9mͬ٢1/qkQ]鶸ku^ﮚ}sTr}͗}QY7`n ~\({fR@8vNrfCg"S sQjXz5jS4KR wuGf^b:s̕خY%!JҦ=Drm{vZ^WJOڭޕZWot I[zîY:TmZj9ztc7*V ,HzAXCW^/RD}n-hZ$$fWtت92yq U3;UlX}pinK1]+X%WT%iuݬSt9vъj5-I)eS+/Y+FGkN[}Qi Yc3T(̊bN|Qe B4zK&#U,e[&\p7ZWY IFCvY4Ɇ]+,2>r Ui ZZ(H%I^pJ.|edޯ)Z%hnfW-L^g (ݲhԛݺz+Y̆a [4絫<կvl^n-OFPMJo k ]3KTԺYbm<7˝FQbu;%8G ^y>al ƴb H6nT\[nnI\#ՆϏ^zq[lq)']}u.`+=Y8v:vQxj(NӘr[jT Q /̺ Y4`jL5r$(Fj~CnM.8~DY3=@ G[JSc:oO%S` 7JN犮ka|O~O+(G6& |zM z*[ZJBfc:SP~-ڭ5S'>6:zhFz.V%vzIƶN1"eQpЉEUo+^55z̓vp[XV9VA4bf˂_o,;:AUm5n7Ci5P }J~4ZMinMRgkxgTk|$A(}.v_olۯU";^/;sefgtTT#eBө9Y6CC.:bi*?R+rg\bhvn^IfkV,.D; 0:nz^TR_UTU.FElSQ5\})SYlڔbGKmY =ݫJjj-(eI60Fz}h6fM:C~_p[V+6k[gf^$ծQRŬj*a_jhYc)Ns Uږ7Q 9_eRݢ#$Q&vYweԊY2 aU.oFՓ=h~%UUQh[YpY0y0VZKR[dUp%YW:g4}9,#BqZpH0  rb~+]SW&@\wB cx9 >+ FG[W3EITk<ͥR" ^NT~Z&=^3RKrIO)v"W['qklVfϯ]Uj Ғ nM8N{N{ДZM^~抦wZzbpxM3jZ[w_M KmԐN\)}BJv2|U0ݏJ۳1vQm*r~V0-w*k7C}1^duŢnrKjzms)̱zZmf*L:OPY ne͚׸Gյ6k k5hŎY֗XZ&gvwβRRvۦevuمfEʋLi1)j7Nmܕ[޴[GjVFnb4NT VdM}n34 hܭ׊֔w]Yk7f.YGa9 ]պ*xVhd_ѣrmVYis*ǒ.Zݴ9;kj^QƦ2n_vo4*L_ijz+Kp^5vkDmUAfp-Snl6M4JU/SL^z%ZVksi&6BYvj) %[݆;(WOj7\e)E*(Frj`4:JOjԎ˯xrPקΰV?oS_n OYr+rb4.^(px͂]^0zZKvAқp#jw{o~BsY'6S: /[]9bT`6aZ cJЈu2LBYzF-[hMFw6O0sfS w$BձSe,;V](W6'O45As+:uKm6WnSSqT펥\S: >Es˒oYj6jmWr+JR۰3M UޏS1OQV Zq~I5XZhI* UrKJrmMGm6Ihi\֥>cK{CXz׺܏/ůVdnƪY"MJdY#*GSFR]:=g\T1ԻMe3W,Ysߍ_JŭIX]Cͩ !r3Sum/X,׻ښ5YTy{_Hd4jXժ)t+:a(+gvۯAR-cJSʇYh})ի<#Rۮv߷nBǑjU$ibT *5/jD5x%!G!P5j,;/\Uk#FMc[}-wي?~@Ѩz`\ MZ[jq$]@|aDUa, &w7Mh7LjUjx~YNQJr$~gkpakE>PsUnUuP?n(svUۓNdzS}'1' ymZ6>[Wx4%Ij)> r^MTyyo;FvGksG: Jfl>|V6*mvXF1kFcmWwtV݄r_ >oo+}"mۣ9?{W ۆE>ݪPnv(JI[zznfOH^lU4* C'Zy,|*4gVy.*mDkPnwcJff9wu6 C^z9KYV-iVm:֯bW(|'Omدl- jMJ8jb[ɝJet*)-z7oAo >*ٜͮm۬~_jv]+rGhiu2| P L_jVE격zG ioAZm̎L,,_QK.&.޵^y2VkfٮMBWQv\1ͪ]f_zԸ*Or{([$*ӐzV8FWN/۪kܯ*bilGYFEfA4]kZ^YBAk8t|:' +ٶ9WxtbIjEGŮ R]v"G'(MC^.TY٦%,Y4 }U>LnRW56R_;z/zG]o8vICp2qc|.hl.luN0l_bۧ+5ʼnZoթv,ȾՈFXji:Wժi]Ίvt<.Ҭb54dYo7tI3A,HBGVY!Zb[zu,Zp*Rr֮tIؖ*YUf)-NoJuN[7:: le&'t}MW Dm).K$J8N*jsk4K:aStZAf*x?4^.oj}6^W\nzG)bĚ)i#Xv~Ksj9jpv:^vh~߫0Y)v;MTHvfR|R,:ZWyrfTh:m* :kaD} LXj NlWb]aؾn9TKnxgmW)LT\fSMUr+۔E 1 -ZbGc6_^br^;,P{2]kQ8Ʀ&3 & evlBCn%cF TvV˽N\' Rw\4$׎3[nSG@X[7zw ].~eH2·9m:dU"/ѮY6+4=str9~( iZUoZMk]D/Nn)w.G%-,hT}uuC?תBѯv) <8f R{' roVԂY]~k^mvœʗ!^EꝚjַK](zWZq{ڬzrVJF˴[v_.mTD1ifѯTtN%{ql+&>jFK-K>TծM8I6$iZn4c)cM rh%{BIIJ uĮ7<$r-=GͶ(Oc*\^;^Nw^R܈cU%V~\.\3ng7|&; ]ٝ._2*J^Y4ʂ)>R[8|اvvG9%[ov4mK4Qs VPЮ&tN5N}F<ۤA{&\/TfJlE)(^mZկ^.څ.ah JK#Q[oz&w Z]_5gVksyfX\ev,vf˗^ *b22g(u)̢KWKe}Eeu{IQն\I~95^JJi;um=ޟ9+@얅@.ZXvFmjMԌ7ͻYXdWk\jZV&/pb1~-(zb7Iۮ! +  `ڹd]V.Fב_ӧMRQ3NSYZeTG+vAizD_.A*"zEgJo^ RY0t_2Y(zsv;:C~odvSAonT bб͢)4L/S*>d*4Amǵg uvVMDzjnV\ϕMKgǪܬb"vخ Y ,4 U]#3{֨v:^4[媨MRݬŷcH}~/\ZLU'RDʬn}oSm*hFIzםMk*3jV~EuђT'EFK | 7ŧk LmhӘ9f.cUoȖQ44hZٴ4|ѐ9"ײJl* `nvUkf-Ye=Qpq1 ڳWɨ܂(sTU<2RiՒ+F̯ ea|D hƠ6| !f6}fR,Vm%[0%Yt-Dj7tvA3Cut屉'IcU1[Ulɍ])Ԕ&Rv9Ŗ56.V]VYgr)޻&Kz4WOՃ\r5J;NUZцjY踭_/x5*3^y޼,֊CqYjmu[-4q{NP}~lNmժ5aw`-Z^N%N=rv.(r/ O.~E  V6jVfՖdn[ZufױcZC \earN۩yj-~67tA[+!4nܖ(OES*j/겢/Q QGdBqs鵵QzϚ^&SnwjT% VEP<ݞsR zS"ʭr)GTmј{Lgæ4Df,.W!V fY0Y+r㍪Yʾ^|]Jr0A{.j[_@ՓQ<̖D=fUNNl>Ñ6yEc]S~">[{vѐwג1tRYi+R/U:wsK- F:~Z^4ݚ+ۑ:S[P[ϳo/9QB)mko[܂-Y \%qʛۥǴwMk D9˧{nd*3'(MK~MUnexVknyzjVn°zn1M"Imӫ;MV;٦ [^CSަVIUbz<Ɇ .2^jfOֈUW#8EIx`ڮEԪ7udgT5U7:jW YKxM54Wx+USA]OI.%1FXKwAEQ7z5~$MUh_rnW>I,/FUM2WE˓w ):s*)>A߲(%mq *lp+-suzj/+ aGtQ=ne.-Jo7t,cljoc&U^0Ʈ껱j+5KŢDI)Wi"wߐoƺ^C/6[ՖTsfȍZһ[o)enORZ2reWEb~^UVrmŚcYfAz$QQT-ܶ۩ڶY﨏m}z*ZYsj4Q-V[3mwe RϪ֘V˽lVMtlPӊEIQ6즵oEfJjrgHbYkWrIZsc*~uqEQo4Z}icD%KE`EW "Mq,mcavWmpUvm-Om8V r=LZUu[:Ifv ,mYx4a\jt ~٢}w\I^br>rNz]H܎N)s]Yf#oLyIݭi5Y5Y4Z9k0/~мZYF7~Er=()=p|DíԶJsom W8Omuf\}2OoI>٭䗂}]mj]t4cZV:LC7w|&_Z{CYڬZPg.rZ0P+~A^%HvHeuWl1ʞ2R=6W :Un2fGUK%.yTz^Ql~IJGIZ Zr۴:KHC)&]4䊪ZxL r9~n7R]m1ɶ7曥*Lbͮ:eR_K rװd:_'I\~Etۭ=k/]HRake+nV!*ё4#]m-TA jMwjLPM,G$y>X]*b sRJ[`V[e+f걊%CwV妶>~U' mқ[=LY][ugqKbY rG0V>߭PRDÙWҒK:܏a(~G7UK/fa֙mxVKݮ]fVA0ui6ksZ:zKMutU 6K=QsJehUؚ`^ ivr|tl.a*6VjjR &L%|[cIRG4ٮ vG/%X^ ~E2\2Ty0ro\mڼBPU.Ш[Z6ݰɬcǶ( F#S?)mUlT~%[ gD)bfc&$U~rSy2m]ILʯtLJG͢ĚP,Iպqk5-jת \<\E.1ZJ5(2M^dՎѲ{T0Z؝E9}T"\)L.y/<ᨔ1$If߱s׫dWV4+k6eEPd 4MOU6~Yu ֙VQ\1hJy8Sd/i8q|ܜ=-sEfg,dD]YZztvRp'VwYֺ]r,Ig&[r$,zE]j2ev0I-N7H=TտK\/ժoUVU=Y)(j6Szs/,,ǎV2FWtOSi2%[7 tfܔ)j+ QB\Y>k$t\V/= ɝkjڭUJf>R5i e{T(tNoQezh49Zs:|O֣TpZ!] A4P~G1Wz\,Ah3h_x; ~,ibi՛U>{![*Gҫu=MI+5zHB*^avmg*ҔUI'+-n(xZ4!B[il&vvqZzzNA)LSHI3cW>Lr[Y%rG*NJ"FRөV7zlĺȱ\uՕkVC@!M>IK+SjU26߯uK\Y.#{[+ݺXU#kYݪkXrJBSjwfG$$W5URSwZGXEdW>M+f)]"Ӷzu^]+cMV̹-nsTo)~E4f8[jɖ&4w=)F91'!*]mq d[ͺ J ښ07;B& D%]>8[QTMT6m6~j:銵vLBEjGG tne [cU-ivMf4+fIjw\atY*]uKo9&"i>GĦ(喬kVt(ER&ήW|f]6l\{c_:RlHr+6+-_O_{Wm,4Y)['Ln4^nOK.u}?-`JSzgvL7R˴(Z80n&uF[lug(_+JR)Rko5Gaj>NE.4)Ck7Vl ]P^z#I ~}V-kYq=nO8j鎖N!Ո۷qEx9bVu덝֩[n**IV]S ݮvzbE)w޲T9NY0;zW󋒫nqV.ْpy^9REzab5u׶8;ӛZjkV%^*_/K ˝:/UzzGY+>JnfI erzEԭII)E6O9Ϧ&.R1N,[0ξ޸9<ԲQ(«؍ł^Ȍir{Ud&ʕGYz0 QVۦ%udrT[?mb^TV&ctP84j[e%Fisf} 2=Zr$WbҿbU5DCb QjfѰr-SDёr-t4֯45d]_2J2O2[m(ͽߢMw7Mar[Q/ڒ廳m5͒IDrMJI0U`:UYT]<[5^^*bVܶܬU$ EOt:ZyLP:vZ@gVQVquORU7jYv'=i-b%iǮwԚR7T2B>[ڮ?Upؒs2,(;[o /|\^5zj{E\ѥfk ZsKbr/YUm(-CvQjJj`Bp@Aj܆ $v sP?}>ѵQX6;{u"̍k5Eot>Go4~lnAouO_hm:¡*OԺ^ޮ'vح]vmdV+bK/iM[a)ZSѺZzVeѲvǘ'V. ۂfeĨ5e~QJIβ%~j)XO2b'^UCJW[:ܞ8Nnwʝs|(%Cl}RiKvUmQc;%#)pbݨsUYmگvy$[UYLV,ynWS۬u2/lIbH#>@hPY ]~/(rQ$U9-a.i&mz][ mkjFoPy>kǽծv#=KLI(%nJvw˳\vɫCu~_[gxJ%unhOnuPĆ_gح`jZ-֔v],Ǜd6MgTrM$7vO5qs{"v_kI\fWߵjb'> 6UkOyCʪW]G܊PiRtΊpj Fhv ~߱ ^14߭ 1,S0A@ `yWM|]t*,h5Aj[.̍JNg9fivKBKG*&ͩTLpU"uk~+zձ'Vs0]ZET'{]-YzO*e1j5׮_{M$jh*=F 5ʥ&۬MN1;mR;"d*ok O.Sz\kf^q=Hz[L8v^pvWDk;?۫VNcһ}$j^ImjRZj(UfU.*fDZڞ"K2ңSDi.yC**ʏPT\ޭJ͚#荊aٯ6hTiblBe<1sԒct! ru]Xӗ)­ z+wE(jPuE&0m)y}ZiW~M{_PHEǡuD;wCPź@&RLHnϲzL!nO;-(9anyTrgrJzHMW؍P njvdX3pVht4Ԩ8l),Io\>V:W[$fu >⓫\vů%^.(v˯X R)uQU+ e_۩ij. k>oP! Lm 5W^~I+7,ZJҐ̾'v׭xJE{v] g7kbvcU~K-iNS7e~B"۵&vvy:Pv~ȶ}q4 *FSQ*6cbU6|Uͺj݊a#=mMN#utEDm;RS,ZD(GttGZO>PM;Vjyw1vB\5*ݶX~";YrW/L01#ӛU^l\ժYnoff[Jyfsg!Ů9Ŋu DcZ-+Z^XeExKv+ ݔz$,JA>vһ:dLZgPb^`$\w9<.N&ڧVJ+W*jHjɋʾ .܏]6kz֫,) H2YݚmY@Q :,6tE{+u biCQV]ԕ*DK}Ujae_lmzM5Us7o]mNQn2Ӛ9fĆN*. +7>oj6NFۥRv5nm橛.wLt--6khQ^s˕åczfٴ{rYMM2>[StauBPrEu6[mi[e+b(x[&ҽ~Msg NJOrV9\+Z%)%\--؛Ԛ*y"Io &b#4ۢPٞ_=Y%VJN^DoYņɫ v7i*:WW[4a"\',]G̊7ʎfMjE[Z,=z}Kj5\vq$E*WG冲rO%ji38JK&mTE),5t r!܆_tgu^C$tהK #PIj9NI:ڢsOӣ֎FA7F33%4j]: 3 =H]ԟ٫͞UՌ{7Kq6* *ru(N*SxWv:S^r]㳴F][UF:n5m>-wYnn+85~tz^M^0J;Itܮ]k w(fGq^owGQ, P܋v=խkTvKLH-jրLH\QjIӜZSu,YkXmIKmꕎ^-Ա,T4Lhrz6[t 2S*2NMګU4r({R֫wWshT hUϨz$ٗɝpE阒JN쫭J^X,Zk73.\\1S5n,NYv}Rjjۯ1UV* JubM"m^ۖk&ïeT:>E Yzjm5D\IũW+j&r\r%<(izdAx. 6OJ0쾥6G(Xn7rvEf{S:^I+n]zMmotI⹪teG+ҩErOnCvdW1+WXtzt5eQnsRROBK8 b8Uv̚6Sj?l("U"$onvwSr*(Ud.s6UJzb݋nQrgk%8WL1;2a[Wku] 3z/yՆR4KRܪW5ohPz-a K,>l]^Ԅy/yna4LU/~Kf`֦X5b9~קl]KR^VM66:&rW3 X-`sNMRF܀ZGb \/(aȊ16W/Q;̮.BV7{=2ޫEUuV;mУNqz_v`2Rح5oV\W=gJ[ o֎VE/-kBe9VT%Wtֶګ]3X[uZ3ɬq{e$~-\eNK/N-*[-j>jweZPS sMXyh%ɖoJU̮zH,tԪS ms-?+m#mh\8dIujI8`*ַ͕ `\.;j*v[%S.DMG9VfYl9M)%WZJjjP{ZQlUR嚣sT2vU.>SbRo=UruRetUNYɽfE|Mů^[ĶYVrݑfcLW隅ͷZ MKWe2: :ΰ*zJٕ嶣wR5-UDާݚ֊^*+S)zk]$ dגvrɆnw N{]Iy4ێrUkgJjT"92dю'i Z?źAPee6uڞhvA`rX,YZNsVntGjRzRmV 4і̺g7ZbGQ7lKk_AYZWnt|zՓlt`] >WSreq>랢zS5}B۩܍+>$)2]/0 ^n8zGq$>=')l} Et Nu~9rzn Sv kYQ `ɫ襂QhQgsvQg9?5^oJU^WFM.vةgnm\OV:ȎJkVɳ gUOUT+ʕ.+0lUA>ݮJ76oifѬUtk}Vi骒h [TPj%62,TiU^oʝM:gA_ G}z!1ߦ\bi;X ԶukzNiMQ?^oo؋-)\fᦶ2ZQԳJhWVlnkf*C{s_ҫnm]~.V*Iv_N4fˍ)Ҥfzyk+;gߴU{גԏ{АrOْea5_kp,Dzxn6QG7$/zlgoRp.vaHBUM}Og*Vejcj#M$.ܶuZbV,Vv`ł vI. OZKn4[AswNzz棩ayjה= p#R[~_eUVANvOM$4L^kZTbY<ޤK햼սzU u\UJem*nZ%_,bMkUlKA.][S:zQ[ҝ<.|ZL ArYtN(nsf*q+Vchr;^dC26IO3ꕗwS5-eK͸:6KYe}MɕZZ~ݯ9˥Z QvUQ#WJ#]3z|j%cj|-V6#b!VRrY(bWZUZuZcy^TUTTramQlMU-VmOLS5[k;^^o6yMp8v]/z!M.Xr˯8~&(LNm9xNSVfǹʔ^S<[$9Jtї trX͆ќrcxF,Z-XTMf bgWʝJܚfGiEa jUq@;{_0jf8I*9ZjU{|m3~]nK%[Ykl(dl5Ev%q+c ?g3%:w[=W/;vUrknؽ_Cv5*<ͩTM"u~/Ov&DJ[zҕbKj;}۞U&}(9JPfg5Ӱ-n( jF"{W$W{W6]G+6KTէ2kmNO_W8q}*W{vSސnR<8Z%=mVWZ.#VGhj4>:rK[٣2Ů_sU3rTԌFAJjfѬb ԮՌ+xQ'OhVvC=׹(ső;}~5.hJJ-Drie(R2w c)5DdݻVZׄwUĩ}]fVmoF쮯lմC.ਢ[iM±ot)V|~]mʽ'KYnL50J5[M[.k:\4PyCkD-bۥjHr_C#nEQC-<ͪML[jI_/IiH= @fdj^ ~ (rC]ts5/P:z/"H +jUY;3zs[h8{V[yܲ_4n&nRO,MJYewO*ݑmWګ:ojXVfQnm>W[^bٽ]Z) x~ax{Ղ_ T츃jgSw粬7JeP}1HūjVQ^ϧZCj+<֙\U-QlfTChլW*K-w͊a5% хngkx%U]vU1QjUt2^UuQ RcVv]0j-5M6l9~Y~UnNlt[}jY+ ׋~[l[B&Vjmhr<դTZp:Q*u/z!Yj$tvZ.-rSfcR-QUWo=Uh_ir݅x#!(EU{-a*mڌKrϪ0eM_,M0N} \[VԺ/zuQTq9̦i+7:c󙭦bl鍺>]VjݐX_H{SmSn ׾)΅ZnյHYV+:ork6CY׭,L`<-V+[3| ĒجA, Fv7 %o Ik{e K5NxqWB[ClePJG㙟_$ח# *.wP1s"Ŵ;lLngՒ&DSۍ,+f׫w;-*mvôj*cLvݲ%_Ps~چ׭1UlGV fvWFZtr5 =\E/|FcWK[@9}C1lQ pvg$T^d̞{2ICܻ9W%mM-9Y;*C/V]Rf7UӽzRfCUUn]ԥWWr6d׮%^ʇ"]8ѕlwsJؤ(`i+6ݲ;~[l3N}BC/چz,lzgVivIo%[/^Q8yH2i#kHS0u^굂_Z.RSjI%< [hJ =b0)^iݒ귚zd4-BbJoZ#jgJ*Ak76[Xw.:>U#KMWCl5*%nWy5VשM6iJr: ZGJEk5 A4D9զVnU:G{7\ XU(_)Ti XzG]/ϏX_$|׭X8o4Ү%+̑)X2Q$E=RTͻsU8[jcAlUvͮ(E_W=Kf=dj+x)fJ#V݅^JݒrV_Vѐ˱ ^^RF*jĊ T8ĖnMN*.UvEN+[#׻c+F%_x"Oh}yJ_kk ;iD kir4鼢rKFAR9n_.(ۭ-T~OEpKb^,*wLgWDOznq*ݞa}-m5 n˞b5Q4Vů.6_jXUtRQ..m/ur2}l),a8m1@J+lR.ͭUVvviku&O//"3Z)xU(*ösot'(E8["dz) Wlbo.,n S˞5GUwPhBW ̭vQKW7kS#ŞR[rz#sޖS4ݦ@ S/loRYVvS/˥],q9hݒF(\ U%WIv,. /N a ! ^/(%MY>YQH)הݮNtn u=V\kpp1Vdnp0H Qtk^Q.5ZoɴFQ8[54rܷnYo^hj:.tK6z5A]SMJ.4wJnK q5EG=\Z9"جْUuciVzc̫)J5sBTEp.lv}JzYo- rn[9WifiSԮYWmbru^CA<.kbW*\;wtF^G6/퐭.>aed[kPER+7b\Ŏ">צMvOMM{ncv.Yh(]ݚfXk*{ߙe^jUԺ엾wj/ԛG?8 #~nAg)qLdj*VU贈Y*oaFɶ&~l˶-:DG?2Ăg^^ܺ2s"ͷ2{E-VU[͆ҕz/5VY*h ae3]So|t,ַJU&}YH%^*xؓu.;n"W 2Rn4bӰMY O^!@Ƈv]q<+~]/n?v[bfkwʮ|f ٔ]}/c2w՚bգV5<$٪:>MnqiU*ҬW玺T͖\v а+Sq\3%9S5ڵS2LOV^lWn{jEt 1)ZICITꝙ-_zJY\*Ԃ)T+z߯ 7 /)~Ӹ0B@"UfIf}8Jӯ>W+,-ЦJ\yo!zQ1ĖרV[iM4YzKI^Isv+t9ԩыcRyV0{ϥ8i2EiL~-fUwYt,љR@*VqJrYU7}M R H˪]HCRu&'Xܖ}oY^G ^jEv~lJ]X(4jVK)Vc~>ksMm :JrRh6ՊWjѐJBCE<.RxiP"=<ެ~k(uXf:[ULPO-(VJ'ZߑUE vTco36 !MErbsKXqٙ}ߴV*\YiS)}}2w)65kTZ$%6N(8zoa Kݯ#L? .JvbQ:zMp%I'T0~][ګ=ն>=~񺭊uq/vzElmQiw7z<[[FAҭY.MJKexmKmYS~Ԫ[=u\cYj:R.-\킁ӆߩ덹^{QJmm>WsʅT&3k;$Mv,WqŲ2WwSE_$T|\S7՚FAlq,I^RfG/v7Yˣ54Gj>jP0Gkͮә~WgybNlMJzceOhUZxg3Kxڞ"Z,IR&z;=b{_Sԡmђd|BJaU+X>T~b`H/85"RR*ݫ^<?΢ij __1EldH5]rWrYnkA*7 (·-vopz[")2gߕrU)Ȇ1pd%azJ_kUzoztv|^"M+*1_~3.:Qy}D,h'E kftU2 ɕ,Cj#VP˭~K(Xk>f +ᘆV[qb ۽LnR.zkyלUZnйIQY:)͵˲&Qē1:K[[>^ԛ,Z7FoSJ kh~VUn:INͫv\mZ-n4PȎ;]+}$j& 6arٮۆdTa*?YrZy)+#On[z1b2x5BOskjT7'WfTfvkB-s4:|U ՐP Z UݪU0{gX)̎MjMFf(տK6%5-Z% % se\3̤\3{t VWNWkZi5aslWs*S: U_TzՒ1wiv'ʥVL5K,K9.rP}GfX;i5&oT֥ZccKi YHf [w'pnh ECޭM*\iߩwDBP'1zA7߯W<Z {v`ȹr*:ALI,ժ}AZܧSLLmWmY4JPɾKX+WJgj44&5_.:UI5cːTVFz&Wl-ԘR-KvلJ]ּ R}R[l.&ߨw.ijmhjini%YM[/5B]BzRĈLFO.5jn<[ IvXl.c.q`av h6.6W/4jϭ,0[姤 5WK:dE[.TJ _(JnUjz-dox2yf~AJ+ZXCk?/uǮT-.P8fSgT6/a+.VK~ϓ++gU\Kӥi׶dK=ܺS*=XvRkM.yrv+s|v&Ugrkz"JjGS,vTάi egzck꠹o^4Vs[Z]nusOV湭UVˤ ˑnQpd׬¿-Behdi| BSj9rIp[ 0$~$-j}g_ntfYokf/V[ruw9RӗS&8^+{ 2Vu٭JWj2ɓbvLR]fK4eXwy߭Պi͔ۮNpDCn햫_rŋfz]zSL[,5ǂ\|%׺}{"͔\4Ԟ\\`J}ozf'A݊flAm`vXeWMEx*]kϴ :]nD$uNgVWd zϢ)jĊQիR}o ;V1IGJ~ު ֊Mj5jՄb2~&ٵZ/+Vd`n zGnzE[ ZIGPi9-gW(5SzzRc9vQ4A* c`youeCz7%YJ{##VlsR+b mz~[ܾ߮Ӵ}ѭzE(E*z8wQ,D(^mz"X+OMeEӎJVtZ#jrn.[Vzf"I@}b/[w3 3#5b;ݖ'Yt{] Ԧ#̝Ki,[vt uz' 6d͎R`rOٵkwzA񬏲&jm*M$zȶOvKώ fKVQJ2+SSaP!Ũސ߯Hq+~I6!.bԟsuxԚ7Ŕ#uZӭ$*N˴mnZnYhnmUth~[$ZlG}ERꓤLĎ m5ŔzuJyVQK8am|͕몗ʊ4͊ӱU?%RWVTLo tNϰ%OU(VMmgTKe[ڹ Sniw:n ]G'J+ӅNԙѬ{nqY4wMx8r筚cʽrQ'V,(a֫4o l~@vju }sw_+.PF/:Qsj2KWz~ݾaTVg.4^@b!5ᶛ~5[2۞";}"rl]/s]Idz=AnWUrS!d8*r*GԪ嚰M~k"f2E$9Y9J-G3)M_ظjo_8]^Gj:ݪzbbԪ4]$mC|vc `[5T\MQ,w[CGvMXflS7QwɚHZVjtШ|fˆNS*1\OIJTP+\Vg^ժw꽂4VG,bthv~a8zq\9R"Vooh2 b)FJXs>U(m.Hf|>.ZS7v_똭vwƲi܂doUFˍՕ3=-ԋ%$Xje*TdzdF[X&"4oTRR77kW}&WU/V+QPuXbf(FKifJ͞X6-jնҹKt^m/ɰZmGnNf6Zϳt-,l8nJO~K]<KՂ;L=uO(=:;[~71njiIqjι(ѐS/:2էX6Wv4ےW뚯/U]K_6Y53j$Gl:Bomŵc{AG!ti},S:լ[CR_\wd}]7+bGC/8 zc+5M%Nr]R{D V>["hnɴ j*5;[esIL<}vk tå,[js[eblYnrk咴rit gY>P5A%%;v!<0'(%mbԯ#Ћ1G_{kFLNo uEg4%eRY5]ZmcR6d.X"e6Nlf[dv<[ٛtV5Օtp%|̭W굵im$Xk숶N :#]O,pHXT~]%].( yrEgL "^Kߔйer:sU%MI-SZ׊v{cX)ٖL s2\ROk:+$~i~['h ^iV򏿿D(E>Qe9VMxٍt6JRƴ*&J﷛R9nhw{7Ԫ-VIƂ@-[D5ԦVuZuq"kv9(r-8jah6, iՖj-NlV<' & o*,leYw'tzrׇP4U幒4̪ed 8;V\n( Te54VE^<6teؼ$ʶs8fRYrCXlr]̞)iԑ~ްSIMvZ-Ykb hմOKWa;jfHL]c2]/yz҅X(բ,Hֱf.f[[F$9dچZbN`(%/׻~*4ѬdM8PJjխ>$wu^ekmŎO5dѬj/e&3VE{R;z%8ƥ+ni)eKDh:vADte"[Xq*^a-6J* G WNcp1{CazE:]j7¡TV֐C˫׌^#Ze[Fܸ\0Ӝl1W;g2J rKYEw{ K]- ^0c~. h`͖U ƺ%RV[cT }xkmZYTskWerkIWlu\W U0fLͭhV[_.\&xJrE&bnMY ,3 ո&^ 5Wvd[\,{&Mu D}v^MlU Qe4ŬvCz2[uhH%`z ?K:KqTrVlģ2pK׺NGpmBѨZR)/>>mZ<օG"s& g,kUc4YWmUđ6U-*u>=Y'Ͷhv5'(T[awZMc7l؎Ŧ9Rp6uJ[o~yMuE[MwJyo;+!#xx03J&J k {fOh՜{CO0.M;E5;V=ޮ}^᳼]nZrm^?V0^ʸ'zk0w0H:ז̦f[Evl]VT(ja\=-FiD/v\l ~זSf%$+Ankkb R;7g en͕u]KU,7qusqSŶFIJ\U[ c˔ZWh3VDc>|_%2k.7LVPtrZ+ RJz]$H[i4Mj&kU"mvZXACY 2lGv24!@zh(rAz&]Pe` \79bj&qbZ:ڰHY[܊{Z&ִm=VCTMp4Ȗv1j*Qwf_W kvגGkаZZ̪bwfnrڞq nrMEqWpbffmN۟Ra]rd5W5ZSc1j鮽&-[%lvxo-ej+<q6nկzv!fjJJI ZzCVĢզ}!نlDb3eN.0L+6UYU 🆰CRҀp{&ntS0_bs*eXXrenr4$jPVz{^YimS#'ɒ ,S+r{\,vH: ?st#z^SmL*XF@X,ki"nZpCYd^tb_ӌ+t g}ĽV.JV wYo(CCk`kX=nVgV~ڙU\թeWjLX!uarɨZ;N_"TmToq0ي_sSmFy>.U$ܪ6c+1SԷkymj670:~wI + 3`$|^A0Ԃ." Kvɴ @ ToKi-7[To۝Q ĵԼS{{7n[5Ze[*^6FPVԖ$;]~ p,IR a,Q. U3Mi5EMeKs&LVqzKq-]_*i*UoќRǮz"RoW~n^wSͣYenu{]斺kmʊ7wr܆FӚ-8ƦwQ(Kn*eb ϗ*bѴhZVZNǮ BjXn2Z9Jic R$(J^":o~ҕ[5T֪~ݩx5Ir H]y݊2tl"xRifݬw޲ѯ m25 K$U Tk:eU1C[տޯ}׹ZDBԆ 1 ` `Gfi^UcvLFNWO%em:+ FkvΚX(\SVasvTV^gqZ&u$ni,2arl>騎"ѳJm:UbhIigK ;=2scų>TK+99k2'^"[aF۴: S9^L[jqY|S*^(~MnH}S*wS]뭿(_;fQ%룗txRH*[8o'Uf Ót:nxj֫Y=5Dmu7CkM^ROT4UD^*rE)9 h T,vA(\~Ms!@ \'I,UoCы B0Jz{=u: Z*|46|( .U_SK$ݬ[ꢭu_P,hV`H/ %Ah9#nlsJOMR^%#RKSwފ]Z^O^M(t'Z[)u]8D]Zjtz0\ٰ݊6bۭWɝ74%MBMl:Ze#KN9Q^G}Nm8c藥Iy ]5zͷ$ uhQv3^m*fQ%WX4kbj]3Wdu,Aum0i:IuZjˢZye\q:Smh-p:CKq*;:J(rL\o٨InUtbtG,.*Iy$O:hUsW6oݏ ^@Z;L5V謞 ΦFfV2)|)VAۢ7i,9!l]rz#e\6פ~f;8h8wِj":&ۭuIߚەT% c][o d*6\+q鵆fx=IV8|XRԮ:I"lUSإ^M U앭xJکݫ̂9 *]> j:Q}Sl󕖩%3UJ1WKbǙ*ejRZyɦ[Q}J]Wv.I0qu:^n%ݭvܞui-7M,TVM\ʹo͂CCJ;`B)!|[i]][B Nb )R[RV\߷Lҫ#-M:-fQuJѕZJQ(QK8&i4W-OrZK$ ]Z(khS1J;^٬U,_[MdU) l:yvOcKBEԒ,nX'mSiI8YֺՔ"s-uJ御f}\I~>emXm&ivnOQM,ۍKO>MbKvX]*xվLl-e%,m^Yꍲ ZЉR\RC)h `P*v`5. ~GT@@ <i:|zQKOyhzZ%oUM+v_ 7 %r͆nzVU٫nsW$k,۩%_LRA.GK=V_pNa / jC9n]ӅVF-t6%Ӌ^/R&T90jsv>όNpviR, )I[q5bS)):efUKb6,k*rl5eyuQRn\4)r]Mr%ߓjJVs\QDz-^VƠ 12(uZG2[O8&G都NL'WrZ)VY+);j$[Vi[%HRZe[v\oq]jQ+zXr;J͚B  a ?ɉb;n2uӬٳNEG)7FCXr0h_CkI֫4,Ys kjCSYGK`z;͍_ʕR__iuIpej]+] EcKvUX6\2ʠvU뫭W5FP:?v6x荵IfEʋo(fqn`- |{bz}4[,(>tms7J$bO[-j6 MZW]a8nsrkQn^FyFЩ -d9[yuIjhIs}eXtj٭HlۣMvi-̮ȕ5zYkm6=k[-[f64mJ ?fYAw _.`z!Rv-rVb9K)9kɸ n|R! F\yXՂ[ik~I& wL nj\]%ȇp z_/uԖP5)=Cg j*"ǨV mם;ݵNK7;"J)zЊU;QNAkYbֲ6 w% V5)=`[kueJʹS3E[64ͯSҥn#=+^r;2^!؎N.(jhEQs iRiV5t\9 hߛ֪2=]u&NѺFsUndս_.9(9Vŋu8;|#hdj(v-ҴYWeZMrDw]OfqN 8 z{Q2W)"Q4U[8}Nm86ҭݪΨ!ɖe=E򥝔k>qIvږL5TmU0YzݐnbwIT Umk]YSYK VzԖ$TjYU PXr.zEnM~G1# $GLs54YF̆%+jIg_olUovcRV׮5+V;;KSU.ʾ[㉦[-ݒm\}eM]jzT1YN#Ş_qBA;WcD.ZQ6D Ռѭl2]͒ϧ6\;NpF1˼rQ.QfIlwclTfW4k̺fNw%ONQKQ][UirZ1dkbQ 7 n]on9ɴgU9f+ 3VZRtiL ^yGQuHʲ|*u^lNûKʍjTUmN{EalU+٥VQ񕊬:fI)ub$sI7zا{Z-C3<j8eX=";p\7^Kd_UyԿ Ύ_}WE+kBbTPgEbv*h[{^R,b)͊*9]Uz޴RrX.m0$]#,vq*Wj:N &ِ+v7n K4$0I u6SX)V g/o85 x23++~zke~I.*O+X+mdIʣ^LcJg$)Ԗ\ُUeKV]J{wemMi5#ݽyRQ*1-^U߫ZS){ľ^pvpX}׭,jf]=Dzk-#ծ[Pkk=,U &o- 4TQjڑU.S uA]M8mUtgVM?.1h.m^fF|Z/e \k~()3SFfKmD:ݦ[S[uTQwK͸Q=KoI^kVb]~+mLZ˝ľTRIqrdZjW=8؆ؘۖ2^fKsQx(wbSvE+}뵚]m*lYjQ(/R]* Zk])h3e:m|%V}[5Cr kB: ~+nfo[rW<4i}NX,wU⭆؎ʏXq5Gs͎#U{>F$6in_iv;Lk۵:et\ٝr&°+z$Z,W[պjEݢpF5Z'ncX~0 3S-mlkm-k/_vŗ^OR=Tǭ-ԶԐi"r>Wf }hKeZдrɩ;o뭭ܓ`ͱ>v:ۑf۶#F"_z65ez_`HKvQt H}E;+~6 xk)^U5zŎey)zM~Rrt˨uR]BڷVm+mu#_/;|.%yXIJh|KsW0IHJ>1z5[SDTau+7e:}UvL:'jD*aWjR=OQ-=fү e~Q&[Ͷ.w-˓륢XqwNzZ\HltխE,m"W"Q7{~urs*^ [k nK/kkSA1U]6JQDۮ4o7;zR/uR7MzݑEE.Wual܂WPl+MW7~O=[xKceT*E_Į<*EeoPt^æVkZk*D;R )95RrQaREnئ\eؔʣmhE;ZIԖ^I Scd5k]RE-n.(bOuW/¢ d|_0/tzI[lNIjˮybgJTQ|XtݖY; +q Ae So=yRܶ|#vRt$~->)I\fXk-)<YFW.ESxyeێ+k=1 "/xۓ6G:cWKşt[mibm\VM&vԢkk+]^RO1V۪>W2euz{d4jE Z-~;zA_/zs-T0P}hzr_Lu:%dr`bm:)W{>"mJzw[k65%7vn3܊l}q=!6¸KMUn(]rYTEYe&7B$|~+YGףؽ.sɖT*_7Ym5Qsu&VªTէT&՞n'=ve:U3tUKU"kNYu(j0FQ; S8핫 ^/edh7޲EuS5;Z3nl$U+jfGWjŒsukfѰ$XfU,N`,6[fF+rc IVvߨ Ra,U!6庂_ڴRK#UEft$MCKn c AW%dO+5JEv{iz*BG|h$U'Ykq>RW9% ^|uUd k[!V]sN/b6]7+}KyQ@Vi4#Zj/j,BJUcٖjU\[Gǯ7f%hv=vQ3n,RtYrټNJTL$׋oMN4`[_jm` 7֗T"HR({Be@.7Imjf-r$/{]ڨINƪծu:d5~R-NuglȢ0˲hU.THbRjAX%   D^0Ć ݱ](# 2Bn/egMOUT8 꺡\BZ\UX^l_%=%^_R+d48w%4U٨BzUU;5puajua]-w %Km~j7~Ib &شtOPSmǤdZ%jşRlf#TC GEvjczCd(n]պ+..v'LCS%]tR_ʍrI_]z־,iokҰ7I W*ϥ9_>Qي\[OU=Q^j1w+ڧڎZbOS{~v2~ *Hu.$kY[W=b֨Cl\FA+\W3%JM.VQfåI+rC,ݞX JU8-BKi%GpF]+0¶TidRIVoo9$V{q^i%zwEq;~U2&Eg G5U4U0lnM ǧ]QcE]vDUdb[:b#դY:w>K{Xޫ̰&n\b[]_j\kEQMN2W3IbO>ʬȯ[}zZZvc[Jv{NR]Zѯ۞:anͮMRwim-R{ V6kmUC/hc͊~KԕGb RZoHb,-Ԯ/iQT5[B9:gԪ*=1~43BYR,ܿ24`!W厢$^^/HrS9,T>O]Ql5}ݮWؾhjv}Yw*k>a&R\ZA%V*m'Ů)^uM2zU8OU+eB C"]iTQa2uкZ4M5߭CfY#kQ%ؚӬv_m=жzGݧ:N+KfMٔ`z 'bcZw*e؝j*>1}ݜ^ؕY%]xuo[v|j Ivx,ek #Z/4vɒvI!9M^).aQ%խ=O4$cJ]6i^I_b˥MVѲV,V\)Bs[.WuiVj+US5DG紫, PKFR9]٫m-_sCxfvXEmSfF=vm|^ E MUSg*J* ~1թs;mʊq۽֨ml.]Ն!*:OB.M)vTlN79Va-}gbR+D~al /j}մdbĔ2ݩ GrIR_Ԏׯ,Tgyj,n]u+J-qܺZozrL rdnc+vAPc v% j& co*TL,\y AVZ[l~?;3rjU]v{ojCh~U*[_d3ɌaXA=zeUjpf q95%[S}otљFݜݖdyJǥ-zZtEn1H>a&vR{Onk5bEYjYWWZKM\W<8tzjYt婂0]f$n9]lGnhLݾhclUTO|RcgJ1+$NVq9q|bEQ^'o+^cզӒE*jezb7NPEop*%WR2)UVWo]Y0e*A,(W$p I`J2*$k<ⷛY*X֥vZU4REjݳeJ>Gn筷FQ%o|t[:iVcu.J gDQbram=0Zw+vcIQ8ݖM\l9n/JvS\)fyf]< 8WTlGI5 iO&vG0 ^tE/ ^!Ө쉫1UU^-:M{L͓]QۮNA+uTѮ r=[wًĶer;k#w_[R$}=ըQ|6OwISmS۔C{ɮkhU{i+^E^vi{,d[)&OnTȼv`w+\ [Kzϲ PƼZtLVn7Mp]C~(57ft^Ro MEw$~]kϫ+f2 \fo9&ѐU ywߖ۞ZnɯJ^1׫mbcr,ȓq~46jcmդQjB,ӮK*hzzULS{ 6Z+%bw YK;܊WI2,9PwEBEs,vוSS%)X+oz5dRq;~Ϸ f%V6պ)z뉊$qr2 b+K}^VPZ7Nы բM7r&sරvCc5-:EѮD=b峚me}]44TZ1uW7*;EY*_._&dvjV SylS*Um4rnU/iUC8lw|XR=/Tͬ2+m[&rLRWlvI+k5nӍRݒT[1]MԨQE:g<W t [3g*Ge3nȬ]otkr;%hZ̚V-Df5ȭ!w(4$rPjEhdD/ů;-UzDX{5vߞ؆%56aGRc*U/6TҲrC2ԄgZ%+MMWhEj62%k{R/ɪhڔU<&&\.^mX R++X)S-* OjrA.5~<[`m]-7Y B:[.х͇-~eܖ@R\4ƶNv0JQ\U2 f]v+nIt"E'ɥN083(J,2b˯jF(st\WD2U3KĦؼWYjQֹȽTFe^TloOաvLEg\UoiSĊI\P:t h S7kB#j^\KEں,.Z^9Su%O;EH1mdVT-{EB٘9lmVMKڲ8U"5fC+H"svMn3Eny$}-Rk6Z J0|`!rCW삢[]KzTv ,p1 %)K(g*M' UNsDNGWl6r.(-vcM.lY~[fD]Vʍ1W~1is=M1zJQ(Zs,*Ug_( ׋v7⠙W"ڧD&lδ9#mRSޢ5/ٕ> foM$ma _L(j85ӚzٯUrI,V[ϑgϥRTW4Yf&SM~S9Rh-٥E1w\zDJOdhxDvcndrWst Fnln--rwV9.+h~TW\e SRUnd(2vhTך[̩¶h=[=evɩx=a( q))GVWĎ<~z5Al[%K^*ԩGq̜ni-$IZJhQVe=Ak1u6e=j6TshӴ>XFT}PE]0~hZ^mNWuf_%EKEhv5;N-uVT%ݧU{h4h܆"[za .s*bn|uaVjԮQ2l4PϢTuʒXaTRϪkX֭3#**ܨ¡ӔKY,IUzfA\^bJ WC96]GM) %?v%uZwAyq *A*-c((2U6 2[\n(W7G.3Z-`*!ȴԺ*jכJv ~7S諭HXV[Iꤗm?/\TDYo֑Pb.vLSWqhL,[YPn^YRV%ɕ'*[jZSHv,z x]pJ_z wϯ:YY\vbqB7Kƌ^77 \߫Q Wi~-ޢVvP/HZ:jvvmtv}ENAkWW,Q Er1l/M;UBեIKn>>یZͻ`;jC+-]H0n-[x5l S]g=Ot;O v-ש,md)j縕qVW vsV,|XTm6Lyj$ŢQ Idu}cMo5D;?It,Nn"KT" ]t-fz_gVCsnmr]i~G ,U}t:NamOmEC4jAm\mV:K";Ti-ϕbGF.}fV[5^Y>YxYڦUQ*^G9>e8vuk{4ξW׫5ؕr.身dZW.5dUy+~TJ톦=EKXV춃j`pMz^-=]m\jS][2;qF_7u1eIvkǩbG;oe-nm SaqY3jSҚWX[˳1˄z4rѩ>Z[n=:;T6^Am!HnW&BuB]~KVp^IrT0V]Bǎ{}f0 1N;Zk4 x~p@q]nյ+^s;&^Xi5^eR(wDOyˬFE}6WEk*]frzk, ڥb19%In*혐]BN:1lau&bRI9nZԵmmv~Ѫ[$lZPj^]ܺцZ z[P2M e[;HZIevTgmlrkƦ"ҫuuDbݒsW&v]/yj12 ,\P( _P+v ^J!ޕbCnk~k;=z*D a+ v *tCPv˅4U&|[-u%V2Umؽ%ܚ^ܯֺv۴N;ų9GYe K^|_ >2r#Z~ vð_oOyP3@ A65 I@-+[٣3ٙeu7JBNbHeZUWP}A,4tYvSz=6(ZT:î-YzS\A3[}[o*lWYQFO$cxT6lC47olٵV;>2veXNO'dRR+x$5XѪؖݙ&#s-թ$NzM[T~CR$U-_FIdSp{^vj3U冡U52UW\E8F;"Z[g662\ctXPKRXqznK8d n_o]s (WNX|&kZV:jv.u%E>{.[*T;oMN:dVi4Kq1Izug)A0gr-Ŧ>1痪\& 7Z/[C˯}PkNU=1%2b+WM "zwJ{-dyk 5EJ!{WkT[>_ЛD,jզM\<رߩ鼫]nrf6bxdQx4G:) +zt땙X%%8OVj)NCfͯLgV&C0qvK* v`Va~VѲK.֤љYb]*^傤j,gE : b7Uu u5.C{LsłFݫgR'ROpdouf+sfF˨ZMG- `y-Trݮ7,Y־eĂr5:coU\ 45דϷlV/Z\)~O\g KAL3fM+T48fPMV[2&ze,n֨9;ٲۜY+:ORG}*=h-͆T`tXnA* QX}"Q!<7sqٕS+Gv,a](,kr3G/ӫgj5 t0pb~EmzG/no> NnRdS$zLV,TZNm%;z[6O;zY3>^) CuMS.`֜eNEhOj6JUӛ5IMtZ3[O7Բ躮/V-uhK-bAu5 Ȣ]4TIv Ux]^IN"Ć6թ܆[K\O)M`$F˯D]ߍ5g5egjZGk^nyo7iMC툍jᑭ_V)]vr{ݖ_.X6U1z͒_Y]U/=Z%l.|%U5Z(TDfX]Pom8N\nC/95LM뗭*dtuj;R[]i\[ Xj=8hd>K 2%jÑnԬԊYosTڑZVTԢj'ܯXH1~r 3rb(EKۑTzRBl9[_єZʭ5:J&h0ͮ+v^][Ⱥ0skF7wbVje\]9 Mlx% э^:k촜,^YRf٭z?ъ*ͣ]5T5{J[M~O&)#<M5e"\XfwUC,wKRz^˨:mj!Uկ&lv[XЮ.ek t4wim~R똂)N>ZߔZg>mU}ӭ=I)Ylq,Q8RC}UA4q &Kx|y x}ZKq^5X&O*ffpԭ6edvF-N"赤םCC9:AD͖߱_Z[ݒ7̽V+[lɽWT*Jw}r[/jS/3V,_"?v_/߮)/8d_V)nޫEٶh}=v?VA\]X%[}Zב}_˦j:ݲ+Aub^V !.9],7nYr."Ҋb묲eUUFp%\/s60Vu_uh\lЄ[̥SщBôC@mmOk2ou$HThw_NhNהNBY QlE%y"Wy7eDJ҅z EW/Fu;WWtzʦxXƻ[sgl7LEԊ_)r'.L3؎c wV,y}R tZc|dVeeY"7o Q%1~EP{Nz[]Il_kn wՂ'MCDwun|]T,nٜ}b_0\shjLgnv|:ʎq:˽K-Ө_*o85w˕u{jai+LNT.]:ؒ^vr2ĕ[XkjF-2mfۙ$n`UVdMK.\̦TfZ犥l}2elT[뼕BG-WUXI{qkѮt->Զ(t eq%*hjEeYX*b)~7N튶FC,\!}b_~ZgMnV/VRݬV{ q/TKYNҬNM˚떹}GVm[!꽒tiզ9oii6A3j3h$ rŮԊK[dGfh(wWz_F֖~,yŪkql62~_ ))uûn6RSR3ކT%Ԭԫ2 E|Y,͆Lg|[d4'YelR[z⫬,Maif]Az^ ˧QurڗtPׯ ~dE~YP:WKd۱ɜ֦gy5q'`1zW0n׹^VfI$UnY2K_W[^0fVMvjKmR7 >ũ6bAomԭwJӓJsŪ)Ρ^)[-zvۏ6bymM3BnK5VKjXz\W^V/Ѹ+mPM5ӫM{>l$`ԛU˭siEy\~b<]CjYRE]UuC',ZYWZtcxGZ,6v6nvvFRs],R:)KR]lnɖuS*ݢn%תͫIKiЪ%KʫhnNiz'mkza4Wp_OwFVvZ՘^{v'b dY]4[d&_ѻ$& Ż!}j9MU)?l\ϤsۊPtu(cV[f ꔊ~bO(XohL̩;k^UlN]vLa[vz‡VQZ%ki%VFYMBj Qv C/8/8&8h᪴rO绫+4J>Mm*VVpTEpuVêZ͎jK,NEI0o,:[~گkRXզjjN~VmZM+=9n[UVT/fQU^{;S.]efMl՚ zY,镙5QXr˩2UtG(z LG]0zn8XnS=/@ qji׸LueՑXP.HΚN_Q]굃ch3*xݪҨhWdnY?v[NYp).gN 6EZﲸ~kb@p>_i˽LRLjEX[:_~B =\0_0?~,<~nz~]+;Uiܒ`uөlEg(ҕRGfW-^Պo+%HAŪس;ZiEjKzj%Z4&lNE=MUݞYU+MXP{N5JIXXLXrtS/{r}z W Jj䮲h9Jp:*`rf_znN k\柇U%# =ᩢZOX8 WstߘawKj\V\eB%{m~3 FKZԌkSJr,<~Q*sbtGz.q qdak1}Amn[K>Coקn+6Zb.eDËJRɬ2ݦW@*X~%ܷ<T`,0/;WV{,c'uBI^a4Փ;s-(]Ց-Xs1J1 Y Az藰˔rR程z{v/JYuG.<-X:]Knc Q=mD^SZiy07usڅb*sS[.Tzٜͬ=I͏#ڊhԖ)ejy1nMzGzW6S(rJ`va:X۰]^O>=I;" -Ҥ7I+1f)VO.?CV=ʠB`Y=յz ^nϰMI,˒`-`LܳĦ$zGKő\Z(6&bLY6bs{^rIjf&Zmĥ_[Պj֭+Enmb& ׳d|"ZSS+bXTJQWjvzujג/Jv{]n.:[[JEp}5+-֗'e4-UJ٬)l[ej)5Q Rz[Enlz~YQxZ)zJ4DXo;nÏ/V-~~W.~E)J,9JZfIS=J5jk*˚mVa,D(5,oŎkZB}s9}Dh~,sRWe+](\lU\nhFQ;v[ӽnQ3OHk%њ+(ؕvN*jY5IDUIf-(B\_~h]2O]Lw[6I>ݕ+Z߹$7fV7tcWzRZR"Zjd HVV؜ Ymţc,-w Rf9hʷ:clQqi:UkO﵍v{~GgVJ<;x@bz^ oZoe*'J`U7 ,R+%NJnE֕Y*br^A.xbItjޙY~fc [Q6ǰ~u~C9UY"̙8^\Hǯ OjS,K.64.aPjn4u,5vM% $\W4FT=6wK6D--`u )nͬ댭]t5LA/HwdrIk%LRSxK,ӻLdvG1n|Vo}Srm>pNErK[uI,}PeK<~gU؍nh1M/rh 3c_lTxJJ3FIUu畭JxLjn]FsnuewNRFɏe6~oHB9ʠ(ɤxcueVbX1WW+]3kORV148L^}(q$˴ڼ flV~P:Z-tc]7yZ맷ZiZe՜_Zb6e-gnTZ?N_H}Ϭ # %޳e睊maͪ5Yؚ8Ֆl\B/=j*\$KVRtJ(M0R:׭)"[j*^ūgsؒo8NYzN"lQ:eP-HHfφTLVlR¦MzݦzzSXV d).Z͓yv{r''۽jYfk(-p#T;r IޯWE\  CnFB)6K+Smuڇg9(fjhog޴^F` VzѸRlWdVVY)_A/˵߯Freܪm(N(mY^]fMhhrҙꧽM1K͎Qo-kKE"3IfM %ϭڝF-͖Z9}~VdCLiv]$eKf5*b%Ŏ^vngJ*'z,O&kچP0EEd^.*|4v_X){a8j e\z\$\ߴ$ r=-1< rnDz͖y6ՎQH4K^IZ׬)fSղ}ITfe^͐=eESUn^ޚڿk5y7w i5_`@8}îBJ$$`fV/B]:c)閫OjTw.:njb߬T{3j^,=ߣvkvlɌZckJfIٮF%䱪JYKuK6xjڳxO@'kJ;>ZG!)FRjKVDޡ4>;O`nt:,>KؕVf[osrceh漶:٭ѩ d&R#w r>*z2*=%TNuXet:QP-vtIQufDjĦ>L. iKl-/3K³Kתp+G' vE~!-I `|2`>Z%)I"5ۂPQ כڢMfRg)~[Ҫk@ 2;0Mn]V _t) ߲{rh}UP~\a9fd6٧Q՚:ٗBlyYim`vMsCx={WVkJwtj$G+>[Erfګ݄_:*CGVx E*j~E6fQRsminYD2-hVRիjW]tmi]oVnۑSVLծ6Kj-w :'ZWN[.# UI.ؠڱTLo;FתNǒ K˱˽bU*!ttٯݲ "wݮ8vstpYy(_8NttBwMUZc*{%~F5A `яCZAbZ[nvܚ!m^+jG{Z s:v`[~Ö{[v؎JSFWj,տȢWw;v[Eu+cAKfdm*VkTR̒DkoE-,ecjkrG*X=~(m7$z׬z ϴ 07]ϴFXӦDъvhu{S䖘SaZmo7Vo^- zUװTbzVt*ak4{k_nUӊvkzLq.TZƶz~۩Jů\]U%;ܭNlz4>jfdizUlx]ÏUD_e ͲN}CAREdZRsOr5UZlWdwܮTm$ƠU Cʢ~ERf q ״:Kc;/!vƮ[,8J쒭)1iJ-66C 'ik&*XeiA>[mĮ'WjCjQ6&^򺭙{1VIge!fÏˤw=" Ԃ_\d6f3Ulo^z#CbK%URDT' th=[>/~Wɥ宖[jU V',ubS`kZ$w' 1E"K#G;{6.}\ӈjKl7ivmq (\ Ղ^^Gpw'1@jl ޖ=vnYbWJ_lrnnXhZlzywU՘ ƘMv,Cb*-f a0KkEjeyW^ҨZ^﷙j[U6T9W9؎V 4zVO*GZEpz0v%kjCn"j@zWg%.̺腊AUhqIX P: 4kXuvW)>bY(j%6pm֍r9N/s5"u{#^k{aQغiekrYZzUҦJ<w k“NQp\MQq>suVSъ&ZZ~y.v.bwKڬIKRgdYUI^kL9/tӵv dJCie.ưh,:T#=N5/d54m^~myJ,˧"MLzrfP6i2ƂG/$5EoQ/H^l6ݪЛ}:3U^fJM % \+kz,n~2D7@ ӖiA-}Ƽf׏j}N+uAvc4B匚ؒw609KA"WJKɔkU/RZ[-[KoYoZ,5Kd&sJƣ[Xݬ niEiՋMquR*-;j#2-;v2taqvG3f& ӌC%ޗwT ˕)SVzOm7=djJjpàsU\ojݤuܹ2X"=ESo;=>5bU9cΞ֭$Yo[ l^ӓz_.Rk>g.n˰Wf²'5Ӣ5e6g~Iuz_sVEZm͞UqQӫ2鶶DIe˕QXhWt?+2T*~ͦe}fYZHC[FVc!rq$I"ӫݓP*٦ Y]ҋz(_ joflXQebse&6NUQsbe߲dJmzj4$Zկ8~ѢT!r7CW K.(~CRlk+@N,,kJr[6?jT: ެveo(v;zOurfU%Sɭ8bu_8VP|E.vz">]aEWʪذSE 5m0IJP ?CZkWM>L>,T])z՞.{ߝ E2K-x v^J5/X|Y+:QiI~O+u7E3=A{ɨmNV*^;Gp=TW^h^w--v*d̖M+)wEl8VyqpvC,1\ͦ V{,*vj6r));P3^lԜeZZkinf:'~gw+>-glh\"vNR r_]P/WK,4v4&MTΡW.}c+c)5Y3Uq'&yzӮrnOۣT][vrXz~|Fƭq4JW-eYyMbb'z[P{n`^.7O] L%$O{,rW?d,ؔWzJU^"Ԓȗv+P'vh}[ 5Uŷ\]kҸ62bsQۮZV:h6h:Y UZ/UB_ꍪ96&j[nvC+_^[vAE3@N.W*nA2rZN'uي%h.ܯs l~_*(ŵc7˭I̎4mMtnM'X=ܗZ3˱Jݎ)& g{*E}TVP:VkBU[;V]Tfg rfu%ꦨ~2[a m}U[7ߣq4}HLWUBi %6)<.3Kdkf btvrԿ2ȅoZb{]>Q*(޲i5Z2v:^Eyn!kziM:٣{kvJ)46l4+zt*rk;Ԋ;8կ{zSklMV'VGh jiwv+mMt=4j6Mϫ_f| \p-śmh*4FYt SVn(6G(DLUb^WYQ4+n+m5;v zoUmY.[+rn^v)IiWgwVZOZz/+$וwNOv`GcySq j^wFɬedT:~X.8p5*Y}ʣԔ2nuŎBm7\: hX4Y1tѬZ]` zgeu,5 [i((E(*40v̫ ?u%јRuk$Q*U̞lW\-?td&0RbIo2,QJB>)+KT)N 1b;b`vkjhۓ_ê qW^P vC*f.j^[3씿R5z[z͆3$`Pz w<Zo8~E3dBܐ&YV3b齒"(զ7q4,"(6]d[uvǚ~/}^0RCzY!5>_j=:ouڮ%U ͖NcKlnXW]G3nk G_Gy~v/W=K[V-{kwBUjVU:lrO*g5+h~ĵc%5zKާ؎եjIvk:&.%[Bnvv5Qm\JhfyFmfZn Tmf3Նծ]_kӊ֮X%NT13nU$S^8]Ei^HvSx^#^E5t$N{[n4e:nSI n])c߫Wm]5LUFhuYT8G;jo7ȱE\)\~gj2.7lnԹ}$mo|5iD{ `RSl v-uFˮ>g0O.7kX1c6O,:mbfgiakZlu,/ tKvr/ΫE着M7Bvbm\z jJWoȱG<6zmlV_~q0)^{ވɲ$^zT:bmjze@$XLZKVgzO0E#?F@4J]pou߱~DxHGX<,7NjR)53TŬ!!~"M]nœ P)Ȗ._V$aV+ezDVS]R}6)||"Qy'Skjԫ.(.KnL-Sku:ea)ش%6Lr$3[YRWBnK.V bǼ:jM^Ml9/SHQV޵.(*v-jǬi3UykrZWUlٮJ.gshJ+>SŚW$r: vaI{׵ʽ o8zCsE^۱9n5n͒ڭzY'v~Gґ2*)Z٪֊ջ+rV,Rշ&^jf5ɯ_WKUKi%_žؔI8jr,$]\D~j)UAh,Z>_Mu*eZŢ-guXZuۅSpWP0LYmQ,vސ*rʲ8٬HH[?^=1J%I* ܎U:dw}{kn,5;ʗRn]㯜*A#VJJU[)*!UGUja5EkUjt[(]ZK-zUJrq#F~ ;ܯJ6* fJJO1]lRse= q1Wn.s*rq R]>VW36K1'|M~i3ڒ_*`\B\VZWTs2>E2Uh=ڐZyrt.-vY ٯ Q{:?ʽZw\6UݞbWVEY~DO|i3]E.AS-ɳZMk}WTep+ںRjRijn~+jͯ6Z-fWm;ݟ*GyM EWZZrԩ,Vn)jNKm wYmӵnVS ONfJ JW$S= Wh}ʥ7kQK!4̷]4Hw'j}eҐfY^ gUn_ rM+Jk OsZQ9X*'Ej$lVp}mKzl2]zE޴|fI]Ŋݝ.6*Vѹ{Ӓ0}QlW3EpTi|ZXvUfꭍ[jo^Q>Y[S-~߱,t5dD7-\bu]k]eQE+fkK䆠͚VKz!W\ONo#rO%rѬ:R6*,E_k5=ZmtS=ǖ[Z,)u,+6g딕wk chmhj_jߓ$)V _%y6x~5Z~GlfS.tX#+u^U'^.bk͎BLUE{Ě^njsnީ+rӧ(n?]v5I S;V5[L:Yk{H΢w]U T2qBDeqbQJk xf(v^\#`$y2Re}H ' Ei0vȯdz#S&rxrG ϴ~V,H7]cx2:=U:nemY"fPy̲А4Oj^tң~o *ɳٚG-WwU"\\`b#FZյ=gsޮYv'U֢hz*Gq{޶]7Eh'Srf۷t#}tU$9l׻n|it{$W#͢Rr+W!FAzn`DKB:)6:Q*i Y/UU*[$#NnKRyrQ*K "rVzVސMNEo}mIjR[]vw^n礖vnt3V,W%,UzjYx=9/ gs*_ f?QpK~ӓܒ_׋fIW_lh^dNŵ>jYu92]5:*vGņjmhG^ \\Ng5U[F[0ȅjݞLuzUm^^W$,KG+4gUmqy>o6h_p(Y=oYBsu,LY-:j7߰j QCkR,Q~hMB1԰p~iۤ改q8ܠzސ;~7<$Z BʈX;>c }ZQY+۝e]a,sԆ]RK)&vI]bwZm^BPsbiXX+mV05!UZN{sNtdzT Ȳ'~-Mj9|.-:N*Tb]VE-W+Z".s]dݲuUZ](p\6D^uDũ$^XVUyve˅GvĎ:W%vyX(Un4zGmᚭgһ_M3IJq*NRW',۲UoV%URrt^l+ KtwmR6^ͪד)CC,5.Cznk-Y5p:l lvo7ŢRsObWy4ͷ5_ibI֡ŭmXj∍*IMT WY{TpZŧ\6e"&魞MrS.(oVͽ5W7$j7jP PvZi v3ٮK)隍Ku$Z5ז5;_xjEid^b5}{!6eO1yK+]pTmK(wj+N#T\6wŦUXLv_:c)Gs'ad^WNU;e힦wMRJf9*[MK4^ծ $\(1̶"ȄUYu*%T=iLC+W"a`4v`t U銾m;U)RwݒL94 n,j%B't\CrkP:zmelu 2U%UjWuJVs'eUc߮XqhM/v/RN_ TXUܹ#5roH7$k1VQVZVZe՞z6n mwWGUfɕXpUe*lpYsqm ;e [,;bY~84vK/o%׹-zRop8Wx#Xr4) ժ*i[$UV+3"8*踊+z[\ XbolJͩ Cy>S[!̊Y1ٰ=ImC[/kRߤGף k G7uˮ\|nŇӥ6Gn& MQ?P. z# \n !Zx df{4vvi٥;Nc-wj*tRis )zѭwfhȌX齶m<7vqujRd0D4Rdz&xC{=8-vi+]Bk墭d~Wb$v,G<5bc5 lUɕ؝zfM*$w;U[o6Y)=8ER(Աf_FUx["Z>5fdݬKJsBv>KzO}U/ݢĕ3ת"8mQ>nv:Ej*=r{g|WR2OCQ;keYʥJ2U.yUm 7Q}bfZ"BZͮDhv=2]$_rVhzW, B"=u)Pb/ q5%vElsyqyBܯ}w We;w,5uR-E['hQ5@Ol冠7A,oHvG|3g֢ĕ4 Mz^ԫoo;&h]uGrJSj~37!Z^ɩW[o Ԓ0 g z~M(=Y6ZY*SD9b#͚-z$SToQoi4%.I(ZwB?M2z'py:W%r"VкْmMtҩs Ց]Hݪ9E$)2C\_"UiXȚ niGǪy Udق9ݱR}j b k3iWF(ZUW1UZ{wǯI^/|'LѭIn٭ʅ£*JPcwivv{ATK$ ?ZTLתU{y:gundSf۬qcmjzYqYV oJ:AsuGEݬxVSt!|Uדی۬tWzeu8BY]G;JpjZK-w{]/[gͧX[mY4b40׫}dVK+fݢ Vۮ#mW76٥4HZOn4djK:Rٍ_O\5,!BX ~%JY4xfI*eyJ}uT=jUvM:[]U[)<6L\ճc1 Vm˯ҫʩ+Z_-jS+6DD'Ud zSW^ vW Uy^fYFCf/˕WZQ+PTN=U+SHP4B\ݢ2BM*=pwe]q*jgw\L_+vFiJQ~Y.Tڮ=$Յ[gM>5A/X^n} >DrQiU^|`ʂmrNi~(lgo&U[.IS2J(YH7ՒV+fYmvK C5Jza+0"m74OHdz6-o+bư-O4W.ܫ^{nlfS7W엙݊Okԯezc۫7ݶX(@~WovEn~A[`(=ZC~oQmQJ}Uwfh9>{vG]3n,w;5*.U Fqm cC-ےk4+Enz~iij۲%5-u]Q8u|=yZxTY+j$ (._*mݑ\u٭.i``Jm~_iՋ.P bteSg+BKI!tKrEB*M)h|],-ե+No*%xV%ͮw Ȧ@{eHFzKnr{| Ͳȵn{~ﴊiZJC1CͶ_]R *6}V.G/ syFĿT7<j'2z,K^Q{}Z.Ao~\Uy2{Kit{b [%陾1KNaVVO팝Bխj݂ R<"U! JYU" ǮMVM陛pKm|Ul贲gW.xUZ҆w\^d7 ޴͎6=1Hnbjftjj[xufv[^Qowx]eol#W5O]]fҋȦy^5{Oymg[kp9͈&0WGo_% ;m(Q67sWkfNdf*V {o|amJ$ WC{Bő\EԈ+suŬŵ7 )ԋ7Lt;ەfc!|E:SCtk*vm.vW"!)JY2 KkzZ@BV ]ސ_+vɲl psF3&˴|ku_ [(rIvG)ni(`گhrj17QW4@.b& (K{u$VvV&k+9Bi4tٝbYZw5R $>I:KR䦻lS,͐FYU*޵JsurҬwolar՟HNZZGi7ZWEl6ӑ+իcbUv.LPy6Zo7t$kӬţ`w<ʬռU)uUrԵZ@  U6 &W)->*o?P޷s4!j߳&*;jʍnC bCl6>ISStݷR6׫T#Ivj٭hK^9}lz.V-zIWX|^pĖ%9 D7.m'7_4]:DArBSbVAy>ܥ)K4 wJkw^NM/i*ՆXFam^V n Gvv/QnCl7,TY5᝵(ں^5ZLq^I)2F8]g blܖ)F5f2x_TMһ5Y,~k-_inUl6ҪJkwd=_%ro"kUժijbܘq)=KF-Jtv4|~F- fIXPVj9ݚ2w5zYvJ]-ZmFבUQ|R/6KrnᷬWx̂qj#ɍ՞S5TΰzM3OZfYHiU2hz(]cG'\zK;:U+MeS{mJjT.fkrӹIFAnUVJf.EcUVf})iYgWMgJ$ D%W\7.YkKTuE:FO-|{jyن[JGo,[vש*ޞ!?:2(gIlNdckMpQ"UbSZ7Os%zUjW&z( Ne'%ȶWH/~˪gN +(T=j` V]~ %K[ul1lTCȐ J+]Z^al5PshtV{v WU{jUϣbk;ZvTVA \ װ46{RAՍ K>\fhvk3f\]553Gk=7v[#vרo]k-mjvY+ז: 5Mg6ԣX~]_+atҔRwdktJrY9E_lB$` 0'6j*_jZilF4;f78_JUWhN W~4[YBC"bG]ɮ)4A0:W.@ ^ 2.z+8rG 9L ,Ur#f軺2E\-'Owzmڧ5wھ3ԊG}n:+wa_bѫXDi sOL檵Oh*\{KlWKBaBeKV/{ŎҮJhܭK+hMSya2Mq[ ROj)mhOg:L«Kx BO{z]wP/\pW;w-k g/%_|ѻ{Um', lI(3V]Dܮ>J**$^fɳ޸n4Pi]eSuĺ]Vyq6QoJ̖Eᔋ~To}:S.$^jMͫ\Co7ӰW7$W<ˆXQ{.G'Eig,V @ڽ\(+Yv݂Q*4L[_UM|jERveKʚ XJ ur|\4gh!:ǭRY.g]*(k<߭uشVӕFKq>並:zjqlQ}_%Gntxn8;=/.{Fg%on "fԚ6Z75LqnwVzgl45ԙW~&햵=o)5r~;Ll%1E C(:)E䖁~G)DLgzƶ}pfoJ&ͧ5rcizӫY-[%~ A5~_2;zA0DmXvK1%t<XWKW0Rx,#~Ulf]1;t%Y%zNzi۵z΢ݚ:lnYorg6r{zgwݗ nwmJ[ ݯ lF& Nҵ Y# jKrMŢZ)[ 'uvG)VEMO;ܲ 4vͲ^ Z /\XX*~TEiUz(7rOnل8Wg7-qzҙ2ۆbYn ݱ%w:lHxC,5WestKO^R4jדWi|}W-he"4[n˛RY4MջNYtW/Ye*UW #Cu$˘EQJ=C.V>S-yo#>Ufirf,Mk}RmobL! R*SM44KyjBVh}!Hi qә!: gv>G2K-=XWܮѮ 㓛rϮe8U'Ԅtwj'"; .ecUEѫBRi. ^Nm4բ٨v=2|KuZ)\O0H0zr|Cl>Խ_RMnkN,|jiJ*uOI)*=I,E֍r5IԬB3ʽVM&[7fY˒%֤*?]:2K4zwi*~tQ[հ4I݉F5jo~;X1g6`XhiVjҺry4O`գjx%*vNErЩV ٮG_- IUIlMtDNkeQnT|Ԭv˪Xu]Twn'h}!Z. UoX*v"_\b[Ԛu4,TkRUeVWPve\K `̟ i3JI:$Ed}\l\[UKkWp|*7O4$횱[SJnSb )emR,rU߲*6 rU`20Y$4Mk\I/y&hϒ8juc mKenU{v֙Z.:4&KfY)r[j˺^+{5|Fn,SeGnās]kͿ"Z;eXl4̲L[NaZ{!š6z)hzC vӻvbe:C=s RՒz~R;$T׮һ^6-1wJٴ 8n}]rUtU9;KKmZzUa+^o3C>noZs#MVo?3){tD~uvqTN']rzvrSQm'bYP{rO}kj^l6 &x823Xk]j݆]0=S^Yf&= h;&k;>M*F~o?ΨM~9AmwkHoE,r?Ǯ-ati~/(ra Qo;\3' ĦFuMc!SJe{B]vzEtvֱ. Q׷~x7fw+K7`3lj'sjF[_RӦbv{SjRԖ V5KgO;˵2X+4Q.ZͮmYn(gg׹k3MoR$T|$V& \QO,)n-%YOD*݆aQ XsR_Alے!6tf[ՒT5*Yp`:VٮʴKҩ[pkv?VKVXn9~U.r "vW3^Ef;t͞mv]iE&[%wKeᔻv )q[6\75߲kT8eSïP+Z9]SUNESRZ7w{j 7r+:jjQa.(펯G#^nEo'[r+l9~@ e\PzE$n D2q>G[Hik\CxP͈<ѭ3[cՄ2pY_zU^Z,ڤ"UBϭm_ڞv("Ubub*GVܕ+6]5o9FG Q5*\ZNxdSx>0G+fq{{K26a7B] >VjQpW4kr%͓kAbh XJ{V|OUl2JКlREkբ՞ymT/R0T%ebuMEB@ hѩ_vMo(~q3$DtD>F8 GU곆rVVt )h34NtM+O^)6˃)mUdQM J嗅RܪU)uanS$Q ~O N_,[-unWţTzv-4ZHpl5S&"2b*W]a[~=&'W$$hЉ(4LdnWJ']|c{8bm=]c(5*ͳ)k=V,,fn#6Ribn~E&wozOZb/t˨( c[bS"{:WrUQ'hrC>vv,f;auSi2I'rp c/Fn+vY+yC"N*NY,i%{/6M{ȊOTb@w'ئչ]x{6TNiO}]궢ʊ,nbI>ы&yN[VI%-0Ğx~k5Yuݞ,[}嶚6'j_ik5Tm9{(\mrSiu[j۬$Yr4R{͸$¬6j6[-NOڻ^.eWKy'tNUou,Cn|-ת%ì4EV6j3vmt6v}7涬fC/ oڴt7.$5ddX\fNxZmiJ&o*% 6A%j7jޭ',L,6M\l齚khMY IqN-7}UkV+Ղ(ɴ#$Yj)e2[%\r[n2EYbGPF!hIC+q;vbZޭxT.3$_YUBU b\OTj7߮Ԛmzݏ gU_\(ZO/I5f Ci4ĒTnC?f;RWwtJ#]TJ3uK̋I~QlN'4+vw3)2nEYJ^ ݦ+ӲӲjmŧZxdM4\e厪uirB܂Y\ɫ6'¢j7 QTѷ"nը=Kֻ"V=f!FXm\Hpa0݂7!rE!7,0- l4tĽ؎D޴>WD@*-veS_6rou*uhJ׶43I+:Kq$$dVjs6TzA7ˊUI?k"uy[Kl)$XSs9XJhudI-{ӥI&*tI`轹 ,XmަhݒT"wI^#۪"b4]jei,UI>6NK;P[mrbzMsv rxoZG,,Gv^2;w۔duj*{eֳ{^iz4ٺ#,Iru}g,JU7+[ݖNnI-U1-ܗQ}W͢ZiΥ5[l*vU!5h^UO4j%H-eBs.np 挋lGdJ[t(U}mB{b-bZ+])ng/7KCtmkrR:nZ^ fV+\֬{E׮͵bWcl,%ia:.:R]޾Zk6[nǕi+/Kt;cHjSr:VhENc#;Y-ڪ+wXn8\ɣht(+"<=i+MT8.v˯Ҷ8vjR ݮ\PJc lv',^b^Q7+;7J"H5ņbȥWUZrU*xpt!QuG7c:NCgvP"9bb_kvkpuj`?=F6^q7Tگ(<Z^*2 (!hgQ[wn _Ne7޼MRDUшNW,\K^f~wkUu bזre]֐Uݒڬg);Z0΂.SUi`v -SnǯFl˂X}R_iKKP7W됪zN*h[{\wpn.V ANAnKs"5'۵dskb_fUTثʢ6ݚm,@{պn+U2+O̧Uܨbc\4j-X(j.^TL^-^7ʬ t_6ۚB2n"fs|olպĂY$S*\k2_`ˏkRZvA{VYsTE+[qmߞd)oNA*js"Ru ̑]A/3_1FC^fW˥b/5m{ޝG4J}ZdJNk3͆ٔkP @hyvE;z=/X_87$hѹ-Yyt)v۶|D~ơ:bi Wy5ҕ5 Fg+CˮP0S b_bA*zQ践֩)f]{*+˩T ^AKf% tْLtSd~h[Ow^cQׯrâJbRxU+1jf _TWnhW=x4[jݔfYiJY*r|7֜m_/J**vAn5feN5d1[hѕ$rޫ;jp6JNO+Jܺ\$\iXv[&61hWk^{ [$ Q* ]u--8vEi՚!WEXY{4l:՚Jl4*MPdwbY4-jvT'@iEI(U/,v + /1V[{Tm#U:fіG]iI+#$pՏǹ[GnBCMR]~֋&K`vkD).Ԫ>GOPu=}"b{46G1K]7<[$?ݨR\n? ED֚#:%]A:.G)jKjbh-\6TvY65=CL/VFSA ZE /r r~ztr!osSTQ Ys7Z]cR*'s7=M2q ]ӣվS)s/bO8nG!e}G rM<)uïܞa!ʮL(k4ʶqUO:2[aV˝-tJVjQD. >rKє$ G8'/nR.tAs$rlhX5{b6wjY+՝I%Ӵd7O OPگJu*L^k.ZqBUlE]%Z\zO<fY(ȝĚ \Pu>8~"X.ۓj0~+4gm2+\kJ"zWr!Y@Tr7Wj<)TI5M4u\fޢVUK%%i32Q zV }^oUN䈆zkNq]SZZ)xBҒ5t^, _mL*zA)bdvm4%auՆrΪPQ,(A](iVج;:zO:^M,Znogg{2Xw 5![bDֺ6Y7ͱ:Gb״n^|^"]NiTr\TίmBO3%kj-Vٯ3ZͱURy=]qTݭ]V1U([r0$Zj$I}#W$թJ6hHv_-W MWDYӛ5Hʯ<[$QtzW%[4wZԂI=YNWKEi^ _gVvTѫVKJo;h|ZI[tݭ\_VTc3[v;K4 }}zkkctgiWo4㷵rCI4g5ZxkNUUX[xnCJ^cj,mb_vkښHcEUEE+55Ķ]F\ܺuuhR٨hڎ05et-cB@4Ă+Ӝ_n5 \vĢV̂Q W%-i:.Iz.izHZO8 WX/ ]jvǒ+%M^ĎtnjՎkXPsʅнc9-QUo8 KHzܮ{=CZ:nڑ-rĚRr߳vKТLȠ܂rvqJ߭X\b*WA§7PiZ_l`&UJQ/ *~' )3ۜFY˓y.4; T{D_ ꯨdV.5J-CVl$SXé-(^ޔOk+lkۥGrj^\yueTk3= C]z;/%_%$XrޮoݐDD,<î?7W /;Tծ^]':jՖjs$J55,Dz)4W Ӹ%EIv8:}t]ro{DZK5 k UfoShLݙ 饗u[rMkOxfͮȑ$CU|7Tn .ZE[[xc^E(VsKmY7bEX¤26*#kŚ u,]#HNYQ~'IEYa726KU^إ)$Z~vY-",QV[Ak9^fzu,j`-wiT '+=VjݼjvhdUIiokveHlv=t+"ը[T ̞p$a;A`Z/:~g_YmTU3zٜ\t,'v^,`:SYW|Z9 F]r*zײU.K%-^UkTzsɭz zѲ>UzfEkur.˖'<Sf.?K-7A? j&Uv5>,Ӭ:Vt{]l}ijfS6ޚI]=SrQ(4 곫0^̞nۧL^7U{/[# ^R[=%RK{\v.:u6G4 ȵroZCP~]6X[vadPזWsUR6$E`7=~{jswjvewhԉ J_&KFM"|ꜵޔm۔ ~-Z9P'h UfJŞ9L(Vݣ{ ë6eXق{#ӛfX{U2b]0L}zrݢvjEWiLg2ն{Ɏ~ˮڝ6s].Ԋ+UԎ(Xa&umHF',W19r=2Nޓs^^Oh4jLW\~0{~^nxZh"ndp\ SyV(¢mY+Ի^eU/MR*VEVmUo7ꓸ-V4flKo 6G{&Z[9zfidJ$ZfkBՔrOi&x._vS>_mծwVuo';Jws~EU`GgVgTVpfNSnUY.C97ETtIm}WyWV+^ѳ^*z62uzO. ԸY^[m*ˣm:^iL,jE|i84vfoi ٲ)jd=5MŔ+>pE5kRGS'~YJ5=3R|Qj>˘⑪+9Ƨ^s^\UU덚5E'J6Y.G<#fQ:蕄wd!w-Yl_nHnA+}tzկ _5m)zY'oSo3:TӡmUѪjR8bG=ʲZlzszSSn{FM-ReKG:(688Yczfڄԟ 2-X;z_teos˅Ne.T@9W Bې-|Bܺ+Y=/ TP$Yt:g:Vlȟn]HnbM1|bikr**Em*I%:k$z8]U:OT4)TkRtH 8vݮ ~A/-Oݐ-0s:Nw4]w(KŒ:pSŵ9 Z÷ݫ|_.Im|̱lF,ʹl]*2]'K_ocS"ήyWOdFF1ܷ$[{K.4ՂԭҍM-eid՚X=QS 4?Y)s_D5ZaZ%M*l>ۍڠ%\j0d_-cכj얉H=y(_U4ibr+ǤvLl,r1>3 0s/Liw-eږb`$S %W*rح*UU1Zo %aQY+R4H -S[{bҮȄJKjUʣW&V{^ TX;uڪspKV U+H{tzlIPIE&6ڑX=MPMzj"ozK Vlx.C $H):K' TayZͶ1.GvKtnSq_WܫKo|.Pzah+YU𥉉4妱X_e+d?HBN.<ӵ I+S*o$͒S.שLOY.y_:Zmo^ rDgW91j" s-v]rQogRoiN Vfǥ JjWݵzjt֥Mv-mfb)a\fAK~r %Zq P|2K5ղTv-BTfݞ! UgEzGSj}.ˮjwIڬTW.+-ir^K]-U5}r׵;.b/^ϝrט=켱zI1Ջm[E3KƆm.E/QdVLAs݂GTٜJj\cإ^ŧ5b_-KT[KU5=[LѲk)I.ۮNEhleo=*vrQ5PEuFFhvS׫5KUQy,+ߐj:zZ(}7i-Mˑe3ײ<łh+uSSA9Tz}ٰ]Ju%GqTG ]TNZRi]gӣV:Gj-e,6=ҥS gIۤV]Ob#(B8 ϶eij%g f;Y?ݧ{\:_tU3w[vk}><׍brCn|X,dS|i/`FkmMwv|nvV|"a;z0w1tu.Rr$ĭ19EHxz0Y'l#WrͬV#r> "RH lrݐ \ vS]?<d D2ve=IcU=ղݩotS|gYn\<]UM**#JW6}mYB&ZwӛF軝OEQ۬Upfiﶤo4t%q{.M8]u|A/h|L8jIek4+"xޭnwvؓT-t-\帜 {͐<A}*VžyUI:a,V,2bZjx`~MPK^,w5U\-d~Wpr- R$HBcLk~'/2EGLa6ݺ`͒nbgQZ=&|uR"$5MQ~,UyY]+p UY)ek7iܬv$}cMOpXSx z߭3U`U;MwJ. |5G*RuzkUT:WfZeIZ:VTtz ߰V)rWrI-mj~]Jam{ͦnA\߱;js-dMTTשǮTNڂ#jvՌ!s7*%Wꚋ_,ڵXrlۓ5kyBJefOc v[k;uO-R?Ko 2(卅RɆ[^ctX^SnյflrW*lT7FaͦcQlu#݄e{ufQKiZ:ѩw.WVe=U.'YnUjvI2kՆQ4Cxqj%>E{53*\MoZ(bl6~7.ret oHحņvNQ+l^;\Aj7.}JhՂ[MV\FP(vj0kkvٍTuM) EQ 솷vs֕K&s:KoXBM[5-:.1J@ Pa~^0zMm/:W"؅vkNϱٔAV~7_Mo+:I݂Jʗ0=KLƑn68*.wrTnI=I'_{N>a{cjԫ~VjrX'$ZWzW&A5-z7(y.H:,t)BOHvɫ2UYZokA ,ِK~(i : ]9GjlD,RbfUSj50:ݪ؇~L䕅R&U)-XRKzmaF_%wRkfwS/O-3-Īw~dbi6W}<_2M ]Wkn^ZZfmլ킦jw J+Q*I9tjBo^MTHBG.z1:P4imzORse+ɢLS5MMl7m>\ dT ^>U $mx*ܦ*4 G:EVs%`uv5([u3ٯL/[)sʔGUֆXj ؑ[j0:)h5{VuMPl%/Nީ蛎.ǠmH5bɇW/垫mXc^ rItLZ5%\ClF{kƽV #2fv"Rb*^&tS\T$qKjcS>{kEI~o8œr5TVhLG@ЋfT}ǦK.4oy~Cm't3,˵z_.!j5g -C8٬3Qv-C)׬Nb^_ M9rN&Y:VZ]2V(Rg9uͭ[7QحuGT3* wS{ [Xm h8BmmUjA̡!1E4[*DBsvQ#wu4sj5dQA&jP/&C Re=k,xuc}Ӓz7xnQث%{o7eҊ^8cZJȒdM)l5 rMVOwJQlX|UdT6]GizWt \gn6Z'ڵ:\7c*JtJz%iȬ4{-c7~bzf)jK5,U YC*)~ Z C!쬝%+6YhȦe 5*J؎kTzUe-6PaWbGgW\NzL/I>26ֆDto^R:SCdfXkFOcԂcZtO,% kB Jkr[~SDӠZzUZ]ti*HChWKV[K4.SbU'P4f_)TlP`lhrb_+~Sh֏8Zr_t.,Z~f S#G Zq3vl}^[ DkVOeC =6!}{3Ymnm6sVVNuDUwvO+WtY5.;N,~{]Gv 轞sa=à6.ᔊvb+4KjNUާ!UrjG1Xޒ]7Z,M.Z;1sNq+zf(K%Yz~hx] M.Z/+IZYmzstNN(]g(5WKێS|VKO?GenWѕVXFjtԙv׺+h,UZUUƚZ"A5O;Sy[M9-YL_MW>\Y5+ tRRͼU+P:fM4e:j'd5gKl[^heDݺC+wGp#+?YRź(˛\aZh:˥m3y?3֊UK6Yn7!n.6ĕ6{+a;(QR:Uu9H [ KNWB֎JVV\e^h7*a.fKh~ٞ/"`6d5.2WTtZUzW_v jij5b]ѭkT-S&*ciJlK"F]h6|cx$_4]*[m~=X֛q2[׭BǦ @0_oV&].`X"Sn=e<6FS>8;)eɎ(MPfa&6j{:$Wrϰ?EޭbQz=\ lX^n5{PK>Oiz$~;W5K]Q4a']hz,w8Z}S+c{ٍZ(7nHϦM]xɢZ,C.,(6}zIUq1j^dzܥC.tDŽت=P^X$(%jM#] zrZo~m͛2V<{\Wu4\/7#EAy)mUh4zzY,~/VYezh+HjR4є2/DEҔ6vܢ<- gmrh9H,Lת\jߪ>IlV{$]A/w NӒv Q(ZUw>Ė۝fHCzbDGR> ѯkq7őf_Yum+ZJv,0<=+v,%alJrStMŢ,|d%4$x'6+RtLW%iV.[m]na_Ht*f5TY0tRrk[;hu~MjjU$_DZI*i[yZ3uSdnYلj !I}!ԱeQ %JʎS6v]=ZZnv+ż6Ų厤 =nfD[bʍ%+zE?+Ab[Ы^ _GU*W &;-(2Z,zgeQ뮩n)h,[~j9mS;:)`vE輬yjzTk[\3r| PpJ*,eg* ,bm>Sx+Niںo[{h;ѫפ>Lki9vGZEZ-#2rB$R߭~AXSu1 F@Ӽ@tP"TdD̹~\F/7 WPV(L(aZyfd0N3^pM.QVۓtVtJc4}ǧTtd_, $&;RulvU̒SU뵖dŽFNe*ecԮt^vzj4UkmG(|%lmv,ISP[1(FvZQu skVŚL 74'$GyI{ ,dS+;݈U]fkWħW;Uzկ74^(x=wkmî.1iٖ-W=~kgVEk{jrZ`*N߭(Np9Ii՗l{^M'l\/B~LlB*5t\c^.ӧuXknk z&co s|ʠ U*F%.Q2J- jL݊3Ŀ_ފ2%U ,v3&Ģͧ ,kF״V ]v;\JAs5){mR(|ռ19m_TOtwڅK$5.Y#*JvUe}O[wUj:q*YVO+=*c`Z#xE^GUдnĐ Xk:vLdOE4j%E3nWlu˽RonwU2;8*5 +y-EVmfZȚ'm(JpٻNU^ݢRuzi'WT&|ZIc6<UrY+ &wŲJys>Pjj,bM 9+%RJ]iu߯3 J^f wT3E4WbdHK~Ŏp j]Yfݪ:g58xbDmLw4͡_L[s|DWbˬJNݢ٥^vw $w>Oƚf ."ڐc!x+ߨωcGk~gAL[:fD}d (V٤-c4Qv)(2v3-铄$ Ջ^ٳb;xV]jK-*뮰hƣbx3t+xCё.ɡVJn)4\oѰz=`R)Q?(rP){ܥ693OVR9Mzffp_Tي(;&qmS#SLǒj~M\5nWйI܂k\:kfm~W,2V5j홦RL[^mm)JO*6z~Ӫnfk'ר,Zx(ܒ4.1M}uݦ$G6>҉URՔL]fUQWܻ="{z-h`S4!fYs ӯՈfcWelUJ]w˵][UؕIjMZ:=k \pZ+"3 ^2)rvB%7jUWuD|.j &Xաrk^u,%gǮzr̶mN jOD0z^;nE=NBNiDvu9\Z9rŶOv/+*+)7۪f{^fSX^{MMRmͫN;^mJ4KRЩĮᕧa!O-tzX~ly=ӕ tEo ksYf:}m)q;R\-Ml$h"5Ԣ 8uX]5_] ;Ͳ:oPMVieQnVETX]}&A綤f(4+)xnmmB$\r-E ԨtfP͆k]x+{C.;bjLf%LmQ8RTK3şuuk]jٯ zLŷ՛Q*4z;q kMѫ46UL!R~ER}:_$.KrtdJ]hĹhk kÆf~C!T zʹ W٨n|QnHHj:Tc*ؽ22s  Vj~kU^jr;l^[kɚ늺+պ6Oc ^wm6mrA܂fm*m+Ž]p;j6NФvVߴθ֦z6ô: ;BqUw^_2 oOk4OvO.hTh$Rf.9њ\Jt~iTڭX'&*iJ-MgjuAlj^!t(v)mNmV-T&~N4-^HSkӧ~cG :pxvݯW$V$K]17=;Sy(m~ODUfw%*2*WKG~EpOSkFeX{˦)mUhr<͕-ܭaq9&)+4ޗcXk-:ۄ:Kyݏf͞mxCeWdV lPu^8>G* UՒq7^ey\+[_Ԅ$ o7:(8zCZaBJzA:ޖ͚S:DUh [dSE%O*jծRvox_g]͓|ZGoQzQ֌X^#~4w65EpD[y}Fp9ŦIh1|_xPO4b8euTrc{鵬e ] Q,fF?ָTR[(Y"I$mV42Jtz%$R=]qERTy6T,1;xcD5 ^ ٫ ߰+^$p5$DGh& I7Tա4 /Ve շUŒ&&X "HKøͺױ:G)ŪV-WQlE[ވSQk4A [Q5:p)]m{^a7깂=2.rGjԣtZ~ѐYJVu5ZRwhK]*ex^,I,eCTg/zZS2veXbzlcyA}f!5O,ZVn5lI.lRLIjE)]lGeU(*kv6񭬤oT0ڕ3̎\z5Ay-`4ƖzyY~\$[GĢg\[Z,u" Q1DUkNج4ܸ)Wy2ǩJRS/-VϯJrS{zs$J)"Lڵ]Lv <չvQ5{U5׮hUn0Pnw.SS;JƧ&j}P*Y 2ٰT`^j?Et[w\D9=ֻ*Ӯwuo{"]WU͊Ŧ֊"Z_QNG,NemF&\5`اlG/uB{-zJnVl~$}woW4) 6T^CsU^mܧr`ȥֻ T? W4%VU_kU1]]7k^$Vؑ$%t}[!]n$|,4zTϮSzjW-;bo5Jm^ 'Xpxd5An(Zt#aE3ˊSn]R*{sCZz2 `*/ CZU[p`*+n^n]QzrTM-ŞMǨzAgIZt?vbIY=Ε6mli(=k5~?jc6{Ѵ5xj3[2ET|bJz*S-W}^Uh[[륚- f*{^P3%LN>U,$Q.yf>lS6H%lynnPx݊j[Ҵj7ѭYz#^,Kbѵ;ka5Gi%w~eZЭ~쉲^8=s>#ﵬ=k\[S+(rq kٹ/jgI3yYB/tS{,_>k Xܘ-jn2k|nu̢[/xDXCfVYqJ]oW 5 Cn?u߮bVt}T ov>#UuʴZhcwMW;m=bL1ZQh[W6zz@c )&_zBb9NZTh3jW:lMԾT׭fpXP#iM 6%mj$+Q P*Y vrkoMӬ1rӯyj~I* kufmj\k%NRkL@&",Єs#VXW9\ ceM~ܢ+-X7~!fTЯr{}srbsl+ө:5&Z~_n BSuRc茩DbP&ç<[XKo aSTpOU x]ky-xaU$Űy\%7۬Fh[ En֕R6 OYS*JZM'%C@1b5ի%Cݭ4u^Eh=Ih'Cbttv`D&-P[E%ݷE~jY6{ؕo(r哻OޫL=nQ-ftǎҌkDsm UJ]:wRWۭRjӚ^+wkrv7(QՊKn^XgX^[0I(QqdLgΈ=BMPݞcM{m)ֱLKaS*0Vl;oߎ!ʢ]fn5봺Z2~f1&Yu2-, ~q-ve_ &EJz]vZV4MٓMnrņ2vW\Zeb|pno\+9`A˭S,w!Z MtLe׭>M1־%hMRmwfh.`Tbha*{u4r ~oup:C eUO9WYr2/ի*3_mn[r6%Ixn6+0QgU]vmւMuOODF)]4uVai蔖YS{͙ ~kvbMu_y,=mrP 79-G5l[tu~Kj V+Xyz%mIŖ,Q5֩,{]/+W^]t.b2+cO.f˯Wo7Wv~QnTaqZikڬ&)wEmOoT[Ir4ڹ&&avA T[vm+)"M;8V[>'͚'4ϕkuDE 5,l+ӥ6*W4[jpFz;|%lsi $Z;ľmYVqZ],Rק$WLUTߎݔ>nˇUd"Uw;yp%}uj ȵ50`8j\ޑzO|gpp$v #W8Nܞntv$dV\a~RY-zG;M#1mvQl ͵F]EP bZKŚ.=W3>ݪܯۅcݼjݑ;&gvg88ȝ pzt[nmsVڶRۤY{qnܟ&>EыdɭYQ5TRP2Jl%,bS2z { 6GmYpy6+rl9+~[4i+6K@VuK7/YX*[QQ5[KK)HM窓m_t]\05I-)=u,Sv>7vLvRJnjM1mKܓɭ#Kl}2,l6~IX) %nģg"sՆLnrKu,z'#ɥU@jz'Tu%nd{NX{Egv[Kj#l喣zc0Zzoin/r\VgӹKjEo$gT:nթXcJe/v( ֑j~Lֹbg' tVd*LYXjǰ+buSǎbk;9cZZ GmuNW`f ~I9\{ZS_qipsĆEx5)RY:XEZڑ:]Oɝ]@e(]l*bwzkgs%4Z-N69w,y>b刮-'zc( ׽RY-^YM_i ӵI J=bg%xl6{dQirL#苵ոzG4vw*N[~ޙ*7dW [Ď֕<ѥ4մkagn{-iY]Un~e7r27+MƵi]ߖ-+x-hciiKEݭBUlwfݒ.sbSVmIBǓlcҫ4eh9蟍\"W TZ:h1vi}j"y=!kj[/MէβF7cT;NPTCjOxnZnxe*{9 YIZ Emy&3kz)T+[l;=4[5(ʕj)"x]K+ U2 !v~E9^n/X3;^%r+*!W:\TS -.FSKC#=j=+';qHrӭ>)xh:]7EK<;(]BTQ5k#FdSB["EvW(%ծ(B8:,neFWAl,#\hNC3EȊ# :flΑk8~EU%p`P"tr^%X]( rR!]uB8+s6ŦDuh^Sy 4,ͅjvMvo[ ~iFnv۽V y' GhJ-zU1>Imz 8%{MN]ov뱚$êwvvkUFW7hFggԫFG%uEF uO2Үj՚3(Vz$j,brۊUѓu^rdWvT52_w|]$YjE44RԔm:eWmlju zSpܦ Z6\0mO}lOŒHoĪch=BA\+VZj4%iW&zҪ XjqFURCk~Qe[vd[&YN nԺnnŋmuW~aYݖcTc2˭R+vVJ*\Jn ׺2^zzz, e^Zԭ7̧j;H!ؕVR, bCh$*9azr+vvl϶ѣHhv 5*!ԋU_nŹE嚧v[f\~JۨMͫX>O7g:ͷ`vn14U#znM~3ذ*\/RsnZj]P ehUݷft6h52d-GjCn5J֛镣ߦ^X|W݄]U֩6L.)btΤ/tzM*]^TkgvR/m?7*S-UՎuW}~]P]L+[ N5T:STRr?u]!s^! UlOtvOu,1NEsS6VKJuf.ĥecgW]Jh}e j%STV(zղ^R\[iݪ4$s؅CQv{ uW@eV.*gSC z]7z.\DYFP3?5nǞi=T }*?B%{ܩU#IJ{i:rg(,1j՚j:uԵŽ'wj-/ҭъ~IM*,JI ~'-Oŭ|ezrةU;_ɨ[վ[;oMk/b[ -=Sll:w5 ^vbv])pl>Q\j`L͊]8*jAʖ:HjP32ኜԹ7N/NcY~VݞP~zcmQ5+Jm=I닥a+|-Ut$64ep>C#:fI&ɅWYuԪV/{PK8R͐b+6([t:lvQz !k-$vA \ E I=X,M+MݫRv˂߼mNI0f۰z!ѻԎ)O3EM8\e5vL65!іj~qvdy2[1f}muE'E\oZZRz[(N. BTKs^7*fz8r$X@EDbkxMz@`gT*XEoX}s\*&1^-lBW׻榠RIMEj2 IbdwkUvԤ%?[szSK t&A~j aiԯJ-=:VW i zG+\ݴu_zfot::ulV4[+K*ݗ^ѯWN:ۭ*j fGV2v녩$]ܛFCDVS {ꌷiNՑ,+ĩmsUh4\Vڗ,S&54M͖Vr-[/l~ݏ&$\4_ENZ,M0v.ڄס%)|Xb1\ܺ=nasX"mFmE5+~\o*4K)|./ҙ7a&rRZmr v·KWK+VGVQ;]J%uט&ֶTѥڵG~<.C)eҧV|n A YDDPpDI¯ciK15yVF[p$^ >>k~)1{u&jM]~έglteUB 9קuȢ@ulӬ冱Q^04?zjsZELYo\SRЄѮW;^Omڶ0EK]jEkIF&j{Vm;fy R9&:e.xUUDYZ5%v9dT݊ uw*NT1^iLhT糤Gf)ȍkU[*Ow-u ^.mEY͊]CKfIl&CzjEW3T_k:RC}r/uΦ|6 Wfَ Ů]U=3x\k7͖нzI}د iUZ*咷Gu:jD`UيrrLl;ԭyr'g\Vle;/5#Ď¯T}SἺЮ R)Xi.+wXzxmpii-hH߷;pҞ!sjX;$KZNV\4i'5=AmM ݀ h5 $8ª5ԢV&O[ I5b蚗VuArNO|Tq4EP-mF 4E^R8hBW5y2ZBVcuOn ,KCx(t,bZfAk%ʴa؍#j͖٭7ƒFsTĮZ+v1r qYڔ*MfŢzV-mBv+mE]e.Umtks!L/5֌$`PI/w 7~6۽mr G}oULoչOu[,tMKNǪ:CH{ł|Ω<|4X$RBGWYcKfԢRSU]T]G]LStjrmIWX38fC9S+9A>ٯm>˕2?k bVˮʅ7KS=[bq۵_w^nڏ^fbym ޥJ޷uT*y2]hمp a(], f-b:g,P Ss^Ut~nDf;=N-5jgm~MZ]Dnٖ{Rt^G,X^lY,[o+Je[TQL1;w.˼lDE ~]mw݆1RMUIhԊQ̒rq~+4e ۣ^9pɽn^K|ׯ UEv.Ht7;i+d)mϡ:v^]ՄώO)*SP~j*vJOc6d 8NDo xW:!VIhŲfd]ʬiXÀn<(v ]1$ Hj"*Rࢥv},K;l^]aou0xrMiXŏmqkR+M1+gڦŚ}q4Zr+%gƯFnէxYeݩ[b]a=uZ\ܺWnf`rkI.Y.69MT|.Md^^ޯ#gʹI֚%YzYלi);z^*69!k~-Q.\*VLUI h#X{/JfMW,).J+m6zcl[NY fozJfjMNY.)fք[NSUF}VN8>gvO<lWL8uSFf\06x2Fv:-s)CT/)znYooYeIvSo{zKp.kPHH>bKK4M6Nr_+VjAd[,{ZeՆz1 _pK=_݆ _n7K\j.H[մʵA׭r)е-T_ͼۂ{:oZU2[StSH]PvI%8Tp Z.MC#EWRިyU[vMed1[z" \~4|͞%B/v;Rҭ$w-8kZ_)`zʹ)PUP8HڥHmI.X *GyDYHrfk=$ EVAۭ_q%A]WR "_w"Tܖ[ٗNu(T~cl5Ϩ V_7/= ^g+ḏ۰:5Dn!%#W]'ֺbd0]ɂT^Y窆&5Qt[/Inh쓬fE{fU$)+sUݲK} ΕT+n߮uekHKߨȞӳ k7U9ZSQ-xmQ*]>UuW!^I=څ* *֚Beg$+xjgj%ӭ}*e%<=0cGu{>ֺ2ƥEԐ_2%OVO+kVyukպɴSz-GWȩtYz[v0>K*zEhT="ĸ Hz傡V^ Q[QLO]pJӈ]긳*T]UTJ1ʂoL$?¨=|N&Lr 09vHnhh|=R]K]&̛R){nTYk 74CV\ˮw[JpR_n5[Zckn\4KSZ)< k ^+7Hee^?V+kz;ase-V6)1VI*5nK% wkiv!xWUz~~^[[8rVBr]V#<8,O~.L-EAd^*~'ˎճROibCUEUm|-:ƖdvmP:PS9c[ KºSF.W96X_UG=9U4;,FFͤV-R,;Vv6[0ԖB˝Z_+mT7;NBQtWUH?T]riUnH4B8 V}3:UXEzbOz ɩqZWۆWzL **zK7ʅ.ՒK/J8/}m\QQt~zͷWs=)m26Rq"+Qx#u }ovNyUg7GUmU(]r8XbA5M.na&Z)5d~S(EbV# qⵙyBթ\gy/㻕#UfV't߲RbP^tf^zvI<_r#' v &)vo8ī]*͆'|TF9 {. F5zW`)\ZQp>I^$\ת6 UEbi=WEMz|Mm`Wתŝ*V.S Fɲ{>l4}VP,mk zVUUrL`nB׻XFVjoWH?]'Tb_zΔK~kVXc4$EMj$G)FERy_m{{oIYWԱNj_n-2-bߐ+BSꝆYmwFXM;u ɖ>~S#F\ߘc{>W הb̡n/v}r_SŪ`UZRrr-(2贝:)a5&5k&vEhsr䠗lb&1IהgOmvя8YwXW[~m /9S'c{ʌFҖN[tMڧ!ìyMC)7vWiuP) WtV*zP{kj vR'(I{=[Iq0%rܺ@ `HvQr$(TK1]hi6Tչ!H+j:zծH,~Į[s6o9bWR ǭ5TGVweNj)- 9*Bb :REfiU~߬ W\Qَ*eIK%,atƪo;OK-פw.jLr(VS}eԤ^3[J~U06٪3}̾\Fk^26o zmHc˒LR)Y~AX {[(7ZFe*3lu˵(Oєa6YyQU'0IOV--J %zbYhjƬ~P:F^:WƒV5Iwע _VuuU;f]!}JK=b52)wEEO7^oj-LM>V<ݛNme1WL&]r֪s^WnGͬz=jv"k:j*Hbuf>vIT[]U~R=XJ x X/\>vjA~}8͗Y:$#blɦK(R +EIQ$m g˺jjUp+g0ua.<#EךZJ3)=H}]v])UFlw\G5AjruYQ,krT-饟'qk6v |'yJ5zz8K7|ZRۥﶛՆ*UZ19^DZBG )y`eI;IvM}Y۲s ѥeݶzqZ׫E|$TD6 3ײLS7&J+I=Ƒܵݽ#HbR邤fp+=X%sPbke%_hKZmrAm0 屧wM&6fJzɭܪ$An)\bˑ]Qs}v(LVɓKi0uuj. Z/3Ԏeٲxû]^p|D+r5u]*U]Q SYLgk]QAR WiɘGij=I.M1߱Vn/ur(|٪TбVߡh4IbB pWvEQ+`7<^l p׸P"ay:ߒvdJ;>wPc4WSe]0jpxu5קK+tk+^(2vf㨆WMTjl\[];6%k_k׮xce.~e( ׮(U'6njxYT_WhJkTX8NYlU`k-k|njsޑ-EFZ-co|WȚ6k%~Qm5g- v%v*kY-Rr,P jR{بQ7,Cge ~j,%5*=ڹ+olZرZ,+B4]v)W04Mq(o*m]n ^YnU=kzr7b]lKuI<- 5Mێ/[(FEK[c"C} ThvZc$4:d(V¢vtERiSsɯiͷ;%W9 ߪtlvEޔ[]v(7U3]mjSKWݪYAl8rCZ<SZk-8nl%٘[[Q) %͑T1ү <&ۭWe`՚khۯQc%JSV+{+l];@_ZR5usr.b;u2W9+[s[1ZhZiIR2[R,FtSlfcQl$jǫ7'U~!H~LEUzh5W0F JɵlFi(N}XMe= #xE/荖T@@կ7a _ې|e侇vKinjh{n{p{+i^QN1NU6#7 >+XG6{/#n5GzuĩmFUZTLE]Tbּ7,Kpr˵zV2̆gJJu-QIQ!ri{ӱ{Ǔ:e6eˬ5;=Tct˵-1(fXDW6ʯveibYH;RYjʚޖ>U=0TMdiU$JЫ8$رܲXŒ)Rf81u];kRGlj%FUXJV8~9jZPTb.jt5>Skl\'Vuk+kfïIknsAwnԖǧ7N}z&^ SVf`UiubI+Փ v%.Ͳ͚m _)̂bidtƭ۵n{ݯ5e72u)r(=I(([Qi{ג&=b+\MDm(lƕ^Tv^<ڵ~V a_ͫDpwF}:7Ȇ`ҚM.Y5ol5 rx՘vAGmr%*B/зEP]Ğu.Wx4Q.,W˽]z\jSw<ǫt8jܖ^C-|k)=!.G- jM|+hQo~ (%>d 7N/a i3 LKXqYU=b0y`vر,כF-7J赖kXk+nd-O.XrKԢvbۢ5]Rg,m rps;J&8"˽*^iw[rOZNCSabխ6 U2Ϯ[NéuewWi׍BO*vLvr Y61ˆR]&k/C{zkG] Л}4mmĩTFaH}vNɥMYNv,]vAKWbӋ"IU4b8rVVjG1]mt+ɢoX&K-CzzGu;;[\q&nWK]OhFx0`;>!w~Kpg7@Ԃm V"t:F7F>rŎ%:Zm2TJURMiyCK-xnjEyjY>[yjӜvd]YzgdSkkc]G)V[Qu.[jn65yع+v1j%.vP7>_H2CT;%Ng^\nu6$MlT4krʫ\씩z-;nK\;jI7$8wϤh Wj+}ԫ]95]Ll`J2K+- *h6]W  g)vZ;]GK7(8$ՔNuw_ȓvݲ 6fޯ z=NˤDK5dVk+ b^~bF᲋K!.ZME[TNk9:'Y&VB+[UѯE}5~͍'s )5% K;/>WiN/MV39oZ( VqK-EJ嶌 c ͺJEDO暊QU<,%n[OcW]{x)v'/7ꄖjzIjiPt~3v؊us4]6'K$s7G}F1v/h5!QySk! ѯIEłd͒Q-ţSiwKV]3Γ#VZִC4Y<{E߫+kJ }*$cp*EPVCgKSK [XD,ێ[*tU~CPs*մբ v׎hZ=[nxCY~玨#ZsV%UK=+Zѷ:a ~Y2U]ErE뭎84 #6ԫU˂"O~:gTp*:pyʥu$ke7k(zQ&Ns{]Yj~j~[ R6\ztd:czKŧ*(Sv_-'z=fK1XtUk z~zrJ/QE0 'K3\עF`ZVz;^]o3zxݖIw82eL;rpX-ծb6NKb9̕ &z_9+i|^-i;ԽQ+*eZ%^QzzPuCvG3uӓ-ǫ-_n`(I>PJzpxio Or\ <8b96/1ķ7wnHKj1Qfxb\Y+Lܗ W}J-Ԋ^pk> Ób+ iۖQ:2Ք=hNy5OԬH_-rrťvLM byR^H#̖[0 gGѵ}VS4jTT̰((zajrcVkPP9S R\bvh`vK{]~VRղ.+HebR*=C %Ks%/˭JxT9F4sLCmrݒ;,)N¢2rS͸6K왵h{7J^VtmRoG+no%[4{Bl8 ~]d]FoQƶϮXvt[R;XQ5l538[=u-ҫXrgxnC]lqu_,V[;A-^Eժ>S[uUnl-{Ohn ZiX-UJ%hw,RvO:$,u -]R˭vm˴Hc9دgE1|3 mKL{6SG9mJGvuj k\wݦQ9lv\pG:,%d,=3^S:+Klnl`uh7QpũdnX.%!vǢlE.U,EWUT+oC(bajEҫWqKީ7j=nPk[|,[כR+:XuZh@J\rZ];"ZlH SV 1JRG54[ɨFz>[CdM*cj{[R6}+j,zvt[nRE-.['5UY/{zÚe_HYb՚;ka8Wj:U:,L;rHfFeGD5 zIhr)Raύ7Њ]ZR6WZ-f:eVᴫW1.٣\Jo ]g))S}S+53jѽ^.^yxDUWZIiiL/2FE/ Օz.wrζi(n=m䂤ȵZǸfi .k턑lSgW$2I]`s~UVIݞn|smWlW[hٯhvLưA;6[e~H]Q.-[k΋E/ )vknҩRK%xKvU:iR ^64VKٖklլԔŮux:a{3񫕹$L+ ~؝vM* vd*v E:RjvzRg uf.YQ=ìT'ҧ jZ^6\KݎdV/[ R)u"^Tir!ZE/tN^ڶ|z`3g5z"^pQ\P*3P:=: N5bR.cTުE&_qQ6>Dz\fiҧM˵!2j%Zk fi~`j]$Wu^kܔVU"'N+zeqz4}f:XNNmkt@3rMQZ5]wK\vLr\9R_\jzn&Rz'Jt}]ɱzEE8VЋx\PfIjMnGvDT$obWVhrs FA{m.}\,&P݅Z-S3Tem@oq]RJ8F[mWͫVᐫ-ZhizchZszcWUzRk״;U.ywr٦4E)Y15%T,To [V[Thc3ѳIb m,,Q*odRU)}zKg=kZ^W-)vZOe!)~,-Cn ~Kʲ-_v;Տr~RjP-kEњݲ.bΊ6LkF,Ic 6e&ij"2;-IYՒP*ѓ=5"B,-vI {^y܂0e)Z:ڵf~[g~ElʀXԂvLxzmb;vܬvjqTv^E#T:XjsVq=;lWUMS Jn,_0lD ,oPuaX@(QèԵj$j#knF:^qrtLLkR*15Xp%a45̚jrwr<5 eW-VpEKfT:{ޚ\왊vX{L{fIQI۷YZBn2Xowe)<䛇n6 ^e52uZ{n\9vz rPQ*F]zI\]CD֐SNb*kuou/Tۣ՗V[r*z߫sdzBOS ([r3t{bXjkr,5KW.MBȊ;>w"ZO>leW ǵ446S),u\rǔaׄ.TڲɝyLS\5XuV媕M6Y)-_\mUWA̫Q%StkحDZ?6@M-~.8z x΁M/:zHV EdzȲ(ƬfUEbYeU,S/zlOk'ݍ3=:ƥ%Imt wiWzz٦Iqb5W/[EԊի%וZ2kS5cΥIQ=V$ZML):gGx&W#]q纤"K yHHWjD&WhSjrYٕ&;IjM1Wvꕚ/7z$)~.nSd-Wn;ҡh$5쒫e(:c6ŊᙽVvծXl]&OYnx+n{Mp{C/v++-ep[X9f\Y0OKb4Z5ViU(T5WlnԖ3XVmUh}3mZJ[:[v{ru^GRWӋJUbǨLbjuKVZ[euYnKZG4n)>(mLnIk!*LPieג]%QzS鵬FE,Tʢ*3JЯ{MѺpIJEhZ0.~ͭUZ,Hz,v۴2GhGy*2͗ WsX')ͪ^i[ݕ~ͧ =Gp~\JkUUQ¢k-UW~E\&~Q_멶ue(i)W%ߴjM:кDnQ[:nvl Y/K D0"Sv" A+ݐLaC@~ܪ-YM U͂z$:Rkg b7Tn:fRs]{zS7KbGmj]$h΢eUP4o$Eo6C<^)lh[+ ӛ~ټE}ZkgVGõkڐXfa4JhTԪKl dbuB,D"jϺK"v`{DP[jGn}jg9hcCZHQ闔/E_#zv锌Fm[-C*GRtmHcs\׈Vd;T]R_Teڮ 2˔MƖٳ+`Wܹkі#(o :oXh(rͲ[[m58fA[VvmǬqV6t^=[v-V"ҕmm&~II]tuЪ, ZԂV:cɗ^YKW*5 )R]WҬswI$=FY#V$QsZo6Yq%f0'ǗjfVOSn~(+4\oEZ*jZk+[-bXJ UϷfZ7]J"zJo KɩؽzI*vKnG+DZn<yŧ\\;vAmnm:1+rlV|iQn9vR5ˮXbYRf4hkdɢV媵Vg(^M%g6;M'+s%kZn:V(Z%lX\h5KT~ή CәOd嵚23М[w>MHjCӎA-Y2KkN*{jr1߮y5EV\ɰ VW _,H]&jJ~)VŊʩ,[r>?b*kQlש\-7oJQp?~îll]k3dؽ.E,:lMOR ͥפNSfiVMD:5iGmauu& [b6u-}nNq߮~Y|w/iݖ%kO]_-WZGw aԂ۪ Jev]vj \z jd#^k d*V8N܋}Qt) N$Sj˩`HuU)U"U~:gu>q˙kSf)FK5M7E6]>6޾Խ+Dhv;Vm+nլ Iu{v琢C2?ëV-2ݖ,OpJڮjRbN$&n~n \p<{VXvmjp20`u%NBNj'l \EnhkUMjF jSIzGmwZNUZNXRJΥ2&kRqīcz5m͖VզjS=9=1-ih~l+8RV $]sJMH4NTwZu$G e^vT,&GiVg y^nzvU6֚[zR4V&tlQ)+.iu-gl{qކ'ܴT*֩)4Jy;5*Eݫ8t+ 0z0/Gz}+\D aȽՐhI:[Upfy+hFk 䎣6t+]7N?rS%nVQ+H*ouS^@v,.jgMGVyr U>lŒnX e?VVT)SZU'oM|-:Z%`w$Z04ɳ_7p֚uZ27o02M(3R2Q/ģ6Ng\r+ߡHeتw^,hm%)WaɺaYU+ͦjvAxuú[Sk>2XJ%}Zݦ˽3F')v}>a=E_%_bydfWkݱRo6cҥ-SԛpfJbSjYtBC~Y-Zc z55Y7RWw.=JkRaOZWZ" Ւ_Ն5Uo**6U"!h. O׮f+iU{SR*)>ɴ\MW+պe5el3zT\3zJY˴zC(OC &(\_2I8RoWk-n]mXQ4DZ]]TU.jJ%Զ|^pݵE4݈OQ9ӻ\+fXeZ]ri,RDfuX#&]u$GYESmj5}h̳,mf2\]ܨR/*tͨ:G2iFέ(CpnxȂچk F@)8cXm^?H [cT6 5ˎu cܓ.yTLlw[*m+Jp_MZiU~\g^͆cL'Z-VJW*NmBZ1Di4X_(֫n]ltˎ!s֥w[KYj!K+W,Kb+-ˍY/{Ej/pHAmC_ɷ?=@ \wQ6rng_ XJM2F+ҺLOp,jUhx`MnKn/mr u)]ib]WcEn$$;>^v[ r[`I,W^X[t=VjzzVCtw WNA2I0Km/ [^Gl[8ES6IxCsD˭ut*)O%)"]pdhVr7dMh̊).B]JZ=Ajjә^UΡ%i6}gvM)sˢ3!v.|{ctbC8~o) vki ?Nk~es&2]~ŝ*sj욨lMhT+@ nuZUc6݂PzEmvdGv!4SJEnW6ϕ:7rMt4[g: ]R{E. Yo%-)f}NS녣9^c|,6א|sU[g8v(SӤ(9oMZ7ri*UCtEvy/<#eZ,tuTו׋ rA/7 cC`W3~ Fc6!=ҁצ,VJrսD8uo RUXwFO+_%)r(Wƶ멪,".5'%kڽJI)km|֬ZhZ~WIlW~$X^ ?g:vOztA;zֲcպF]ϵlxzW$V& w]:x{^*@d+nj$n9Xq>}pzGb4EgrWͮUdj6zrZ{ Wяv#Uc*Ez5q8uMWN-Vv%R'8p?+ʦRbj^."oTpΦS3>0NkU ؄](L_-EnS1Z4ɗtޑj5eZi M:EkTz~M W՞oJW-hܼ~ESjrvV[*=Χ7U6.wy~J.:`}kuSw=2׭ZҪ O+]OYGB{N*>jSP4kr%a5%fH|@>nc(բ"}տrYlpMKCjvԔYӯ{~hWl.<+]Z1^Qe~Ӳ%ISjxrM Vc\eblx[zSV&lJZJY-.ZRvQʹ[Q [F5au_vizc:Ut;JdP+~+^oh_W$GZDSp@ t6Kّ:2;=\ 1BZ=MftLAhnK){vA.˯]/z:w$n7v$kN嶠EWv`b _A\vAt[fO=jIYxX4zv:㹮$W"򗜖Xu6T\;h}( Y%lվlS[-f7!?G:+J'L_Ԯ Wd tfp b^=qr}O|ߐ]kڽv֪KmZQ1E:UUfkv[~tr^а\r.Qٯb˼Qp݆J$4툝c7RRo5ޠ(ՔF[WGE 8,OxeV/`b#4nC0 '^w$I5#-%tv֡۬u2*wKjhoh˥)3ƒO0 5]objMZ~t{.Y{Z-z^und5(hEf:]@*o Rg䔮6^,dp֢4,;ݎ*~:i_XUtS/]O߽kȭ$mYIŞ3I$6=i} ɯp}ZM/+UQ;]i6J[fœrMi e+s)~lֶ5j$|ۆP7]ZUR#ZrG |:VL vKW:-fQpY\glTqVb4ӯiFݦz2*.QtN҇o4ԮOjjB_3dwۍoU[>c>:.v_nvnYcW}#}hV,Y<ޭ{w OmSێR^ްnfJ*UoQ*E!ṫ%3'|5d[3Zh_7gQ_T}ZAUSKثX-,tT^)ݻSznmhgnXŒ3}*:*vEc:S%Xf4,$rTku8NS. uR\ 7S4ۮMUwIiLUz%H],|͂_(zݐuvOP:_amKj%]5zf;k,slͧ4t[pJFR`S4YScy6jMUP6[OAXf?b@@n_.߱K4yJ %OmzM?Bf` rnP1{J\xDZSkb4y}6K,iKujZ!$EDz+vnj%ޮZw_ۺD+jbxX vRujQW_ZjZrS:?!k\'n,Yf-V-јJ\gЫmW5V/Ex8eĮ wѥlY &E4RO2eop]u|Ů~+L]dU-jíj)}jil!v_rWPhu=\˜(~,KӥR[ KטTSg[܎e(T;bf(]^t*۽zՍ̊-bp;fJ8Fpk=MW]7rԖ{VjsXf)~umzI&vT(6}gWTS$yrQA혨Mml3[y]-7[QȭKkuVɑ>QyfʣL2qJ75-LI*kNq8W喉ގVkZs,[Ԧ*JSӕr=΢ k5]#vdkz9:z!ZbL5i_2!O1F]VڕR,Wn{NRu/,}$w5rKQz }ulnfYFf*'gحj^+$\Ca3zP|^Z+NؾjܡPPk~+U{6}0(^%]XW-ۮU gBihVUko52v%4uI3^C*}2Ů]T~,&4cɚv*W[|8]s+E-mf(dbVhz9Bۥ @ 2/~C]XnK]:1 /OdTv1: E];]$[}%UR|aTUZUc.iRZfnدRp^ё¤i-hL V+fc[[yӰ&뽽vR&Pդ^z$+J]t#֓j6"Ѽk%A[pijOs-]e6E]ۯN^plvMf|[9{-fUz^{(ٴVɲ\/}26R0D1{VnMc56C~a_rժH5uhWttGz )5zF3J[Z2KMڅV* ur~m-媕R,)bKrUt^S:Y mvI-M5 V "[4Hw4Z6D@@v+z+ ]8I~\:l7+bS8>r>3lU'ݵ$Hr4D/n.R䶴\FKhU˲u[nVڕ`u$;/tv 굞 2 oj0ÑZXv$;%T t,%v]oz~4Xif5KoZl<[-Eor.. !=uxeϑkvU+NIE*.]-\R1|j^-IىSuu&Lm{zln˽!*fLj A!4G~7*:g$M0 Nq_=aho:nj[GZj&& ohiE-.z]tzYT2&ȑ%C(6qOBjj]ޭsfX\UL=2xΌ%n5%o5f$ms;ӯ[FnjOIEӫbݯ$W Ů#*F]>ێL 3 J/pvKaWE$U3p+S&ׯvN*h6ZA ZZ^9u IcRwyf\췈=M.;#rQŎnxfKIծ4M*v8}R%[MC)W.E˶l<,h}%>3Vqno,Pd.-Il?Qo9e|QX6ͯtP{Uql*I+b6j]pS Z[-Va*2oEAI]\S6 s;&hY˥|Vjܯ~hYvł鬞yq~I<*݆PiEuMS9h4 XEnUZ^u;jЯ=mXkvRmzo#\#=ȧZMQ"WʶTsj _oJZɽӤBSom+úk셫ϫbjvQJ`n X6GKєϪW>mf.r$6[PT3K6.L>YfT7=C%*z\·;5k7Ju NWYVi7̲ž"rQz~WVGT ܩiU12Zg`sU_4s{UsiXYjonEr8BR&j1fU-IT6VeNG>EW(}ݧFE 9nu[pn_(I:Z2n;'V< rm+6lW.uZǪݧUz=:HL_ɬ2z. "U ^ Cn7GtOٴR s}oYƹKHTݮE,Dz%UTZ}Fd* lU-ۺ(cG.nG-`Z-^٨WM߬n]5\Y)+W5)nQm-uZokܩF:l)_SQ,V+Je7*|c+XZTY'vghk7[_M_/rNJǾVm=\SJNYPۓeU w)i6DI1ڪ،ٮ.ZR( IMyrI%(Vjk10&d^IJ`vC\}j멒GKFeD1-Sn~-w~Gz[MAܿlfoԭN jQʲ"{%W6P<ⶩMeIuF'ux^/m}:)f/z5VN )^]K_/je96SJ7jN-^q>\$o WVthWy\~}V2jlV:Ŋ:g,JM/nyNI=4 =v4^p+(MD[R VoJr;Nlb7WZNQnZlMy6ݐUXNPu9VѬskV{EO*nQrI %r}VK,_+ }ǭئ=)i͊֐,^lz[/[]PW>G8K#$vg]!rZ;֑Ś'~A-f)Kݢ4]ulhLZ+Wu1Kjn"(0v' ]V [)4&RRZY\4eW EET T*q,TzMm9F_a3f#~aOpVXV;aY}O|Zi2j^mj ;ڝ6$ު|^FjtMhYtC$KR:M֌s_튪y#QԽmqRYz~QZ+^cMᔫnGfhMLnTi{ Ւ1efb4V&lrVqrShKhfչШ;}[ʴKp{fjEgVͬ mb2[&z 6[r VMCRdj ?N^;[L EnŒo^Ҕ9ޒcVe$ݬH+sA"=T׵[S4)4b-b 36moW/r ֱSq|)7*G&kii/CTV#v6fms|UR~ZG,v[\W6M̭ tB:l[;:WQ$i-jKZOj͞.G9TP zbTT4=qN`nEQ[b[0<ђ͖,iNkXjeHb"):JU^},M)zhb),wվZo=ᬹיEڝѩX=CfK/z -U[㔊.\shs͑sZ̩6fF'zWR[S)r+8u)UUUVLeN A4^_]qtc5]+Ͳo~Mz)YԾ4H&iU=m>Ul+J?~Wsz y;L˥~WjXENwp&dtTra=%ӭY(7,FZa Cf뫛_;b.c~<IVj VTfvlvҪNq<e^Y\ľ-:Œݲ͂~],^Jr%*uQ{~﫵Ko7M>lNjM3r*%1n]nLVUv{2B--hoЬ=1ZY+QU-( pzܲLJNi%7tӕ˪[6zeSf$4dCP 4 *Y#jV'Z\&+c]㟒L(IQ@ bȤv\A"^nNx$q4 ﱘb WV(dBZJ,9+Ϫڮʧ]"q+Ms-z mRo8uǰwW՞sjeuUYz!,%-znrKX~t+fz\\˱:m]/uܚټV3bՓ2?H[SmeRIv,]PDv>!v=Tpjٻ2Pa(~5 #\vN TI:]/IݎuV(9ZC/TJ>+RkHq*vwTl(47:iW[j_kUQ*)k/jrefh:O*Ś[Sc3XhvnYԲΒ$ +(Kr,rP~On6CVjz%UWoK>h7_JԲqKӏTk6@i¥6^A'Mׅ\joK}VU9Zlu,Wj%h]7[LQ]jXŢY$ *Q_nKMAIr_ѬaWlVr{x]/j]OApQ:&k[դGP^C0VzU,>tYw;%JFeо%.G9G0h7Rl-o6$PRqoZKb_nv~ӜP/ӕg\pzrbWKFԩLVʾf]uӱ;.קjB֩1=; PXX|S"04QX yJM+pl^T.g bȕӏI~Z)[2Ֆ}A$F74=9ݯ9K2歎m|e-ؽfEWZ +鵞"J=$Y^\2׫rgV(:C|=v4uִk[0`r^_]d\eٍ̓)@?&V0WښVyR2s~cK=fyW[띚rU+{CͶ6VuKe\i:_#7r[3HRrW]R55jk,6dhVYZͯ&dQ7zZ4Rw'k>UͺTd'Vٽ^' Q]Pp+:vV bA(Jxt c޺Ugkp5 -c\rlU)ca݊cms\^c블-:?m6QQ,\욅v7 㬷GPˌ*kVڂh @61&}UhL .eYzgȺZ}Ϩ4wnWX+%o[Qn9zY&fߪZ6s{-IoUDǺ$< U+f\ޯmSjgV2\$2Q8pdpUnC0 nYf)Ia(MDyg .E>dR${]vcB5QT *V4o}3,0EE{BGW܆s|qv^U_PkbpX::^dYVn׸=4te>Z[ٹ;P ^{-8{'eI3vRlZ>@.KXFw꠸̬p=zWlhqKU95KgdI%G{ӱMVj>!ײ0Kfmж^f8-p4E(uJYM,l1GQZ_ԋ%w V~E\NClDevӜ.)rg4M.$1ijskNTt~n=Os.]KS2,W6~)Zl(]7*)e~CrQ;Uwa>[HJCKg-˫f3Tt_ve [.==_Je0^"]ƾ"y-YR+:Vŷ 矢"gw{^WImB[hLK=vN㰥'6 vU0A(`R˰5jwr%,bvGEXqe]Bhi< *[Z(ZnYKiw6@0#F8)Q~.a7ޯx RFF^<}ޙubQ\NĕoY*N[VUV.{9l۫TN=:,h5FBcܢPjV;adMmR>̙iIѼBIڭ~t-4Z) F;U]V{K4!2UQ l- 9[w=&5@K`7[.ř*.{)}"7^0kGZy6hh7&wuX?etO+ؤV8X&ntVRYzJR~(^5/\4]lPZn%vW{z'ꩴKGây\5JV9{AuJhs]Tm6+̵魢j~jT6pgZIfZ_5*i^)n嗋4\׻udWªBcVlsMk_ݻ>SUźbzFvrU-Z_qЉK8BM≍vϳj£*ݑziQu[vey=495.Mf*Uyg]m*6XP"{.WQ=`N}n䔌W~LUB$vvi%ĶKie%p|izQ.JϩWE7TS{]ە.ђ%&SN+۲ XB4Y $R*=Ѥ׻=U5"UFT,#caG >:`pzr Q;%{N fR"˸(}HoթA]9-PGl ӑ^iv=aD=Ckj Qo*XNv%i ,[glX0emWF9r#v [2Pڻ6zNS,jhuNKv xA)5O:uVU|g$snQzk]ٔdYe[nV==d=ǏfU:!wEu[UUlWSާ7_ǬZЩZH}()PgxMK{~ŧ Eۍ4.*bɦbkS7jkzj1 =m,מ#1u٤YG&~cغZ$h&ɢ"XĆM+SYSF_Q]cl^/eayfK8_ątM_Z_.\Վ J-KBk{ZU*5$ouzɓj(^_AqZY+K-vʃ]z[=]Һl W,O{-?VnC!,/)M5; K*^(wuctԜjDOj|bXZ.dNϖUѷdܒM*Ƚ~wsΖOmSHG6=SP\gӜfS,kV=onfj3NKw^*H6ڙ6]sܲ8u URׄ5/X3LJ)5knNI̖ GTE4"kMȍa6zXUZ^ymS3cpcB&ؤ^_7 A^0LPA0+s娒 ԧōm΃N$唊 `FtD*Zv*Oi;YAjS% ]uD2F/Z:_eW)Z-*m lWNeX3[^W;$37mAVn<٣(n|­#ة 2jۗU;Eo(6K9KlYo4>ҩwBл.u \Ǔ::ګΩ6E#[Z+z- ;Rru=VvJ]$s6Of6$, %wE˗V(Ivmy]Or=(Ls3-fRPJ'9 QnWJBgnź"6T^R{u%iHFI򴇨YCm]JT쉣_vG"m,u7e٩V;Ӫ,I;U.rz(50 zl'1nM9JkwEŔ׫W+~q+\.U՞W/9W"UgնH*|.KtptM.HgE?j{b6t2Hq85qe-LS-c=բykW.Z[)tHpH}gJCgEwʲEO/}b`+rh|%hhv-h힩OK-u foZlzϮmj"2Y+Wkݩk,dJF]-:Gm7V_^[EK:c̞.8QZzQM5\I;tFˏh]ېĚD۾ڨOl2SG)>\Ir A/'ݮ`R3ԥ4*Ebnq(C4J2ai׵J;ӓ 5NLuV~ܠ]EWn[V**VZ"*uוrk**nvҩR:3{N*YRLIve.sS)kYoZrůT2UƋCߌq Na3+X5=VasU>Y(Rkn*bne9W~.vEcZ0e[zQ-7 Vn7ZFDr8vӥ5q(snG]Z+7\\axViˎU{{5Q.њo`ފRzCnU)IڭN˒TE_-[|Rprcྖ=[ov{% ff7HSJvg*s[mvM/k -:I=(&n$լ)~i;+l%I2l.QoԎ๊TƦRzDCoŶemzzޱue}\ Ŋb=v(nys$jrQƒ)W*u *b!D=Ȫw}o{ݎFk1eֹ%li܎تw~ѤV+3vA-HO*R$׳Y3&W~^'"r[J=qŹՋ"lݭQEvޚ)j]M]Q{YXѺY"% U-{~lvMm՛_#M=~[)uxˡ.b+q7m EJ^#L٫:dZ%9%xHfw%I&k-/kltezXaVLm^hU*oZͺ58rS̃-)ݞ5b=?UPE|G*xQiTbWJ3$Wvrٵ qfv.è~45C͢JmV9R^clyo*=.?^U*.S{]g#[rMջI1U)7ycjCk+5Ųeԩ4S"}{KAnɥ&0]ZkN7u6J;v$q;.W<Ϯ2cKԨĠAMUrzAE_^xXm SRn(`!tf|R%^ Q,r8Mlf 5?]68ve9h}sz3Tj[jY5 Ne~퓵j~3zm&Jj8f"1zj U7ejP lUײ(]teSo4&7 ~jm\k M#qy42"w^\kӪj,y-ݝqnNY X/w]:)-y{yZ]}]onFUoxvZq[=J6)V5$_*=/=6~5^f(׬ZM;SJI"uKB|Լ*wJ2kU=EqMxY:/eOd"kVHhUiY%^6;ZK=UQ7W[=#9}* Sn.RZ|4Nݧd6jrK׼'xmN7KN.mM=pJx5ڬijRe8Ҧw;^ZwS+4W |5zŢW n1W\R}9J<%קvW6ȅb bE.T'{V[Q )ha[UWVCKmh~:?ߦJhNz5[8"UdwTz Zv4*TmjCo~;~GPlVGp4H[)]FC1&+qĪNkr3QXA)KK-l5I:eU/춌_2 C ,`؝zgq;:aRv^)4t\+XԵcrWkZiW Ԥ5v gBaݼ+VhQ٭*^ArU"c3 TZOz_P%D*ךUhGA׻ԯn5dݢPJ/SmLr]k[>ٯ1UɔtvK-bljFR#t[܆[lyJ7Hm1 ^ԺazW^UЮuϾjZot͂%]e$KWYJܪ:UX=ݹU+G΍Q5v s6nmխEjթ-Eq-[-"X;*մK_6Pɧ,ZfGlWcI&&+xA.MŒan(+iGYCVY3j3+nۭhzU V~+ i7՚eazY]DQToжI_FtWZo˩we_oNPH[7b[9 pZG(RbGs-Βb xMAN*+겫Gd$w&E+u zj<h0]nh:ݖؘ>  @PIDMsߤ<.aEy6Wnי,;FSޤDZcm{X}N,V2[ ^r0LM^0/ Q_Cw! ; ,@NWcʨj'0d;DҨh_j? Xj=2q\u¯3zMnjj^:&5+JOQV\ݲv\A nK+~kW7{v\qRXYڨ-MŪ؜"$jFXL2`+^YdW CߣzK2U5k;WۊcE]P4ML[#ԣ֍VcmT[3uor_T>/{~I(X!WK#Ֆ,k4jε}4dNW?ElVϬE&*Z]k(G\a='jqZX3즩y"<|2M2hVbVi[_~]g3w)Z?ir~,zS/[nIHnlF hRд[z-&ʌ_Dө=穖JjN\e:SmIn 3nnY8]hź0viےJCnweQk)0ꥲd-EԾY8{vL/~InCPyne 蛮7MOyd[vڕd6TW):D&|Z/m$Eofd8UQc /5JQ)Ri+٤\I$[qEjsOJ,إ2Fa}~).76WtZbU,Wk.c1+]KUu[UuvQE%M0vlc4l65*&Vʶt&bW1vlRD.n o1cV@ˮ}Ǔ~V4il~pݝoZ ϶"E8Sٱ\kON&{3w>EvˮuR[%vc31bBzaF4jf_o7q+"ݱCDL9>O8- [pjf[A3 YwZXU~${gitI;M]@'6hj+iZs\"Ćv[^yZ͒[I@pjA+XF͎bԋPDiFzM5E'QY|Xv9FxElWv'iV KrrZGXnèϗ % %2ܶQlpDA-mYNF٪vކT2 Qt|zץv]Y湕%6df"Ux﹂L߬S{ROZV -}1̚M)^i!-RZVݐpQ1Ce4݆/ ސ+vA CP$ޱ5% =F}GIZУC%W #ZY8/&GmxWO`;N$i_e_oZeԞf5jK<9W/܊ضZBC:gekR9fZUj=Ś,N-jEɧ86kf%fcdr\]]T!5mU~q4\ec_c:zْ5W~m{D(n7z{ݎ% wY,U#~rnZ5ʨu*_EpfR3JּUS/(RnK2V-&٥ a~x;խJ.56^1UbTy0;FC0䮣CJz߭bͭjֵOIX`}*_X{:3*nҮߤV4=p[2{~1yM-jUio14E]+CnW,dX4kS51wٝ٣Zຊ#VUq8u K'C܎&8[E GU~IU:'ZMUPޒ3 l.gǕ*jouvk_d7zGh%O˦o VDnvfUDZEU aYU[}.@ 6Z`MVS;5PT!V4rM*k#.7|Oiъ%[e-)Tz:*fi"VE*V+%-[+%wjEKbU~X4Ynukhqs_\vkTdMۻUlR4FE15\nI~oYnQn^& V.vLo zLjy=}숦R-P\:V{%;V(f*I,~ik%̮̪Śy=A;K]5{bEY(,u! 沱뜩ՆY,^͔cTjbcTի$ hvɍUd7* gUݡR ROtd)vΌRrBLԪj^/~c_ qlKp^S K4_ $BKTXL>E'=t/zRWVTN^f9'xnZ*^auڵɆ ݆XbW+WSJZbZfkڎ],xzǠ[/J2v߷^^prNcٯY6ZUކU-inT&[^Cz}1cJ{p֛Jajsg\bJ4V,U$ϮfWJ.gZ J:ˎzUlX\*I^jVZb2a3Ys_zcC0}tQZMxύ=ȎRvy E~(hWZQ UjoE@uZcd[NgOuj4lb85Xu˒ fl(NGoƲ0[jUj^T[HvD/M+nIR̕.ahg0%kjRJЋL2jsJ.P[R~bruG a]Vk騝!'~RZwQkAU E/+DV ~Z{k]a^qVG+vO45񛋒jtTj]v[|UF[K~SQMnC*QUbY,+]%Kc,KWu{ lUX f[h6T+zQe۽2׋U)3c)'X-Yr\q۝QsI>:raj8FF2jNtR|fv|8"ÏFerzC.X~<-@vѼ\ٰ>W۬~mM%,VkbUn`XV1y_,kbMWh Wp=9UM6A+[%2g1'Ռ4v*jbzrUPZb,HZf8]Rr4[wYMA<:ˋ껛5_kk"Anƞ^, ~ۭ)2*Unzgw[W5i81j{wgUc';햦jvSYOlssڰUE4ҲH#2벻Ų 2vV˯1[gȽATak7ѻ´TUԶӯq-OEfm8(K鷕Ja.=^z۬/7Tvq9Ry(ժ'ݢ`\=d(\X9~c+ &ɦ$fK~1(z5{SB)k^6oVi6٬EIi[..;fN[[oM6ͮmhսr Mdunou.k6zV,-8Y jiEٮjQquf٤)o]-kW=azM|.Jl5bvN]&BA2oTt G@.665B KiR*~lP=ZGK%֤h7{K_W\UcTZEQՏN1ϭ7E&-(xɫu]-m%x-Q,ŒaۚxۋU-Kui*"]-֮]g5ju +au^+$4(MyT}jh2Mj4 1nBhY-ֳ:Kzwj>ԩSsT_MU#x}tTn|s{N+LEeb^יcumZN9k$W_2mY6Tqflb}OP:^ɚj~98;ohrj>(P <+jS#qħy5LשbҦ㚝6|Oi8n\+U }mLjCԞ:qZ㜂ՇnchݬK%C헋\5;ܓԒ95"U+׼ fzjt͖S+5MI6c{`J{%/ bt9Ŧ)|h=&)wz ``Wo%/I^ȥ<J"NѾylEwBYoDk1a,<{U9Ur\ZI؎{V#}a^ ׫M׹Gܻݷ\,5ӳYz?=֙%W,,nGԚZhILs߱[G* ZNLZ5fY;v[ _sV$Z]t^k1e吔~c)zfGT+J.O} ^4ձeŭ*|M^_dr!Z)bEME-^V],*Ne3XDU(u"TV2+].#])=GVkv0B[o]+rlvZU4>tjͰ^Iud#+30:2eHS$uB-ɒL'pF mmjޤv!rE1hjb_.^kUmsNʞ[y5WnW-0*TT1g'wlr¬C4ꜥWoSc8W5{vIشNmwִV!\Kߵd+4!62M5vlM5Kf*;mjluk+ߡYRP ^M{F>M Z+5hcM.靎CUM F}$%,>UovjkF1Zn:2e\hŎ6ܐ&׭S_Uɫ^Ų9f+)]̪u,v|u G/\oVe$t.3Jܠ ꔻzC7z7 # o(kEE .x _[^딽X%I[tFi`wk%x-Wɠ1fS5˩fO /vYSۢ]9JHPZ7؆!f_;,nVVGł(6VWg[O9mjjXۖ^/KlwzKx#_=Wī" 0VŹI}sTՎ_:+-8E>W$1;~JMUQպ) nXLjCש(+SaܞM{ѺunYS,.Ӻ{R-D^ajI³m\\rJ zbGqbZt%U%4ʥbw+zv+Q VXQ5gK Ep^NQ t+-QlwlgjvUԛe[M{Oo6B\.+Uʵ*vL657V` "˪Jɪ*CFY]zGL;RRN-elfߦD%uymEՎ+U^mJVZkIrxSJպᩭ~jk1,bw4GiOn:rV& Hu[mtc.W>&H FhQLF1bP~.zC_Pޯ Aod튖ήf`rkREf! X[Q-bE-aUTmN- fY>zըʪ{:Ҩd/Y뚩 ͭn0LqvCf'W٪ UqNu;MR{2דZ^Iz%Լ\]0Mϯ͂]Jvq.mJYSfr4:O+rgwT.g{mqņ+tj&P3N,\`5<(ДTYpx$mrvaJYeY>w'M+V;QJѺq]-WrghzETEJNbEv9V' \Y,Kw,*QuS(3M FZu,E9X:qfWRoǽ(ne6̚ R5N#me*0Ai" ,Z:<&Iݒ2װ+ҫ=kk(Nkw >XMRfYrW%_7U#u W>+h۬խim[tHQ˼:_&zZ[MLuw*=QSif+ # }M [z}ofo}Fmu3vLp 5֊"ݓe{h49rV2^juMwm tHًc;M~Ӵtke3RGy}d9(|%4Lj Y2/ِ5a*ɨUaWɏ{r7d7QVJH}EX& xUQug[RUf*̨щ* tPcJn[+nAo~az^ A$7"40@P zܺ).WGc:W&ۼi09fREBn]ި=[z&`X7cPk6û%Z.WZAؽsEˀ#ddV4UdcY0 Gd^юKԢj jfm={w^ͻZ&DlYͶ:m9B$X室zZX:=g<9kOըћhSnYWYU,`OԦî.h 9z%*׫V]CQPhZR8rG~T))pVs$wepZV 6S@1=YbYTt4n_kzo̹IVGWQbE>$@&)){msp %=AC.dZQnsޒ'vv&S)K%M(~Ovz6=Qq$IܺPe@[Orj$DcmNɬk E:ؐ]Y?kV/YEG$ѼNîwnǪ(^[w,KiX-4Q~$njxbj8v^8 f]aمZt$y{gI IvՋo˫TefV+e)[2on4 ^"{%Q5-XcEѾzhnjr x{(kڒm[zxtԦw} OR^\/*o-o{6ACq,!u\1'.?.#"D0:j+.0^ & ~4_oXˊ y*(5Vi7{z~\2gqxDJx3w"GQ>/zFPT^^kjwb׷iV|ȒgJZnkn-ׯ0+ RvGSy &Tȴm؊ٮHs-֧|j5VM| 9rm4RD. ѰJq;"e-z'D_"*eOzE*ɣZyAnmA XԒH D> ( o4vW*0zHp"Jv(!DhdHG,q4!O DDA la[L@ ͨQ(ZzN`(-^yDij&Uj{딱ǪXmřˤ N(DP/(H{O P3&N) c)3!cv*޻ENoSr=L* \@Wrř/raW^_v<* x9 z$k=,!6IixI߈ݯ+Dh|O ƪٓw.V\_VZM罬_:Ԋ!G,T 7V9FuF2Ŏ(Wphp]X'K벸6Ot_^xV%3f4:mR%.TiV&>Z,L pca XVGk6mP8Z6lWp=6NW*jZ:MjG~$$Vݬ#ƝeѢ;mŸ$>ҖJIdZZi0Vo%=IPnŦף? j`vbߔcYx!epu*WEvz%F5:a6KY]2W2ѝ2*XIA;I!2^ؙ+Gkg[bmX~h}if3V!-W(x~\Bբ#j3X,\JfvZ-7A/ thqcRa482>1 Vn_zb;v G_xv.B.\qaGBJڒ4`+&1X(^ 5e R WZ_bhԦc{ r_' 5"ՊXvGrNh\l=Q{r'^,_cz=`ȑZHȒ44O4+fClaq& MYsgS[VM!]j[*QsEWku]ԚW/T6-Rx (e\nDzh.'@Abv-} וQSSuznhU4Cog56DsT!GWt<X?*de #2'٬VYBNS *n{ n7&hXT:#|-z@$F;}זF$Q f*XR?:ܢ(ez{xJ,Sj%f$G6*v`C :2=;G(R,%EmFGuK͌J"xlJٮ1X$RPnKrA^z;^p4Ps:!) 嬗bg&-n[ B752Â/ῧttXȠr 7}N,݆lZ;Q_$=eAm]mSͦe3~/Ԯe7>ԯʦsdd NЊ*XN`!,*$Udzr[rBkCHcbuxƩW#6F7q>ɐJeǮ7l=sv~djuuC1UKiuRtz(p @ v`u0ϭ7~CHiv.cM%v̂ TiV*]h Z,+jivA#h-g iՂ]\]uCr˯zm)ޫMDE5/՚Xm6 t%Cl6͎٪z+ܐ$Q$ulznr[ɐq5nInfMny'yj+UVjbfðlט]vnj[zPrbv-T6]t:zt$rtJ+_y~]m*uJIDžֶڥqmÄIBk=D≦)ӹhH,* "X{:p"͈)3֔JVj`Y0vz|b`Eru)/Y%jacj~nGDث)oP'!%jcYeW|!w5 B &>5^!-^}9An> >dؔ~JKkh%/x1c *8ȯ¢h{IWvrUor>%*8]:/YbNjjYvA0r~ 7# W4EeްvgKaz\~SU4}[8<Agu>oOҹ& +‹!sgg콽ndzfoSurqU!=IzkK:fKhKm^t֣*uxFd3{=AW_l+ڮuF%jBӯIsR[c|f:z3.1fu_EMʾZ"G`j_86ꚢ$nYS>xhרC^/ni7]R$Y ^LK;vlwMQj:&+#6{jhԫ}Nx vG.]Rުޯ ߯`~$w!RMUQ+pSTR)cEː\L˪(%$8Uʐ)R!OF^H^ Ȕ!%y- խWTs#C,0iZXIz.(]AÝ:&zj"UuAQTz~M#Fqznmvr$w ~ z/(vm GEo_/5^o] 2z _CKj W~܆܊+zAq`w  8  W߳;zE %c /ޯW[;vA+~En o7$AR+zn%w܊_ E`8~Co ~K.8_W܎^ ~CvMnGA0C]%"w _wk߱ _+ \#+nQP߰Kb(2nc " ɬ~Go%$ɰ~W ] aW$- !z [W 7A Qܒ-)0z- AѫCܐ( +rWzA+~Gkm^P`A0_p[n z!7_a% v`Mp4$H~ow~"ݱ ~7 YA ~Cí v.)sunpy-0.8.3/sunpy/data/__init__.py0000644000175000001440000000027213210261730016256 0ustar nabil00000000000000# -*- coding: utf-8 -*- from __future__ import absolute_import from sunpy.data._sample import download_sample_data __author__ = "Steven Christe" __email__ = "steven.christe@nasa.gov" sunpy-0.8.3/sunpy/data/_sample.py0000644000175000017500000001453113231613137017161 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- """SunPy sample data files""" from __future__ import absolute_import, division, print_function import os.path import socket import warnings from zipfile import ZipFile from shutil import move from astropy.utils.data import download_file from sunpy.extern import six from sunpy.util.net import url_exists from sunpy.util.config import get_and_create_sample_dir from sunpy import config __author__ = "Steven Christe" __email__ = "steven.christe@nasa.gov" _base_urls = ( 'http://data.sunpy.org/sunpy/v1/', 'https://github.com/sunpy/sample-data/raw/master/sunpy/v1/' ) # Shortcut requirements: # start with the instrument name then # the wavelength or energy if needed then # an optional description if needed then # a reference name for the class into which the file will be opened # (e.g. IMAGE for Maps, TIMESERIES for TimeSeries, SPECTRUM for Spectrum) # All separated by underscores # the files should include necessary extensions _sample_files = { "AIA_131_IMAGE": "AIA20110607_063301_0131_lowres.fits", "AIA_171_IMAGE": "AIA20110607_063302_0171_lowres.fits", "AIA_211_IMAGE": "AIA20110607_063302_0211_lowres.fits", "AIA_335_IMAGE": "AIA20110607_063303_0335_lowres.fits", "AIA_094_IMAGE": "AIA20110607_063305_0094_lowres.fits", "AIA_1600_IMAGE": "AIA20110607_063305_1600_lowres.fits", "AIA_193_IMAGE": "AIA20110607_063307_0193_lowres.fits", "AIA_193_CUTOUT01_IMAGE": "AIA20110607_063307_0193_cutout.fits", "AIA_193_CUTOUT02_IMAGE": "AIA20110607_063931_0193_cutout.fits", "AIA_193_CUTOUT03_IMAGE": "AIA20110607_064555_0193_cutout.fits", "AIA_193_CUTOUT04_IMAGE": "AIA20110607_065219_0193_cutout.fits", "AIA_193_CUTOUT05_IMAGE": "AIA20110607_065843_0193_cutout.fits", "EIT_195_IMAGE": "eit_l1_20110607_203753.fits", "RHESSI_IMAGE": "hsi_image_20110607_063300.fits", "CALLISTO_SPECTRUM": "BIR_20110607_062400_10.fit", # Not in the sample-data repo # "RHESSI_EVENT_LIST": "hsi_calib_ev_20020220_1106_20020220_1106_25_40.fits", "SWAP_LEVEL1_IMAGE": "swap_lv1_20110607_063329.fits", "AIA_171_ROLL_IMAGE": "aiacalibim5.fits.gz", "EVE_TIMESERIES": "20110607_EVE_L0CS_DIODES_1m.txt", # Uncomment this if it needs to be used. Commented out to save bandwidth. # "LYRA_LIGHTCURVE": ("lyra_20110810-000000_lev2_std.fits.gz", , "LYRA_LEVEL3_TIMESERIES": "lyra_20110607-000000_lev3_std.fits", "GOES_XRS_TIMESERIES": "go1520110607.fits", "GBM_TIMESERIES": "glg_cspec_n5_110607_v00.pha", "NOAAINDICES_TIMESERIES": "swpc_solar_cycle_indices.txt", "NOAAPREDICT_TIMESERIES": "predicted-sunspot-radio-flux.txt", "RHESSI_TIMESERIES": "hsi_obssumm_20110607_025.fits", "NORH_TIMESERIES": "tca110607.fits" } # Creating the directory for sample files to be downloaded sampledata_dir = get_and_create_sample_dir() def download_sample_data(show_progress=True): """ Download all sample data at once. This will overwrite any existing files. Parameters ---------- show_progress: `bool` Show a progress bar during download Returns ------- None """ for file_name in six.itervalues(_sample_files): get_sample_file(file_name, show_progress=show_progress, url_list=_base_urls, overwrite=True) def get_sample_file(filename, url_list, show_progress=True, overwrite=False, timeout=None): """ Downloads a sample file. Will download a sample data file and move it to the sample data directory. Also, uncompresses zip files if necessary. Returns the local file if exists. Parameters ---------- filename: `str` Name of the file url_list: `str` or `list` urls where to look for the file show_progress: `bool` Show a progress bar during download overwrite: `bool` If True download and overwrite an existing file. timeout: `float` The timeout in seconds. If `None` the default timeout is used from `astropy.utils.data.Conf.remote_timeout`. Returns ------- result: `str` The local path of the file. None if it failed. """ if filename[-3:] == 'zip': uncompressed_filename = filename[:-4] else: uncompressed_filename = filename # check if the (uncompressed) file exists if not overwrite and os.path.isfile(os.path.join(sampledata_dir, uncompressed_filename)): return os.path.join(sampledata_dir, uncompressed_filename) else: # check each provided url to find the file for base_url in url_list: online_filename = filename if base_url.count('github'): online_filename += '?raw=true' try: url = six.moves.urllib_parse.urljoin(base_url, online_filename) exists = url_exists(url) if exists: f = download_file(os.path.join(base_url, online_filename), show_progress=show_progress, timeout=timeout) real_name, ext = os.path.splitext(f) if ext == '.zip': print("Unpacking: {}".format(real_name)) with ZipFile(f, 'r') as zip_file: unzipped_f = zip_file.extract(real_name, sampledata_dir) os.remove(f) move(unzipped_f, os.path.join(sampledata_dir, uncompressed_filename)) return os.path.join(sampledata_dir, uncompressed_filename) else: # move files to the data directory move(f, os.path.join(sampledata_dir, uncompressed_filename)) return os.path.join(sampledata_dir, uncompressed_filename) except (socket.error, socket.timeout) as e: warnings.warn("Download failed with error {}. \n" "Retrying with different mirror.".format(e)) # if reach here then file has not been downloaded. warnings.warn("File {} not found.".format(filename)) return None sunpy-0.8.3/sunpy/data/sample.py0000644000175000017500000000104513231613137017016 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- """ SunPy sample data files The following files are available in this submodule: """ from __future__ import absolute_import import sys from ._sample import _base_urls, _sample_files, get_sample_file file_list = [] file_dict = {} for _key in _sample_files: f = get_sample_file(_sample_files[_key], _base_urls) setattr(sys.modules[__name__], _key, f) file_list.append(f) file_dict.update({_key: f}) __doc__ += '* ``{}``\n'.format(_key) __all__ = list(_sample_files.keys()) + ['file_dict', 'file_list'] sunpy-0.8.3/sunpy/data/setup_package.py0000644000175000017500000000015413231613137020350 0ustar nabilnabil00000000000000def get_package_data(): return {'sunpy.data': ['sunpyrc'], 'sunpy.data.test': ['*', '*/*']} sunpy-0.8.3/sunpy/data/sunpyrc0000644000175000001440000000350413203275053015601 0ustar nabil00000000000000; ; SunPy Configuration ; ; This is a sample sunpy configuration file - you can find a copy ; of it on your system in site-packages/sunpy/data/sunpyrc. If you edit it ; there, please note that it will be overridden in your next install. ; If you want to keep a permanent local copy that will not be ; over-written, place it in HOME/.sunpy/sunpyrc (unix/linux ; like systems) and C:\Documents and Settings\yourname\.sunpy ; (win32 systems). ; ; Note that any relative filepaths specified in the SunPy configuration file ; will be relative to SunPy's working directory. ; ;;;;;;;;;;;;;;;;;;; ; General Options ; ;;;;;;;;;;;;;;;;;;; [general] ; The SunPy working directory is the parent directory where all generated ; and download files will be stored. ; Default Value: /sunpy ; working_dir = /home/$USER/sunpy ; Time Format to be used for displaying time in output (e.g. graphs) ; The default time format is based on ISO8601 (replacing the T with space) ; note that the extra '%'s are escape characters time_format = %%Y-%%m-%%d %%H:%%M:%%S ;;;;;;;;;;;;; ; Downloads ; ;;;;;;;;;;;;; [downloads] ; Location to save download data to. Path should be specified relative to the ; SunPy working directory. ; Default value: data/ ;download_dir = /tmp download_dir = data ; Location where the sample data will be downloaded. Path should be specified ; relative to the SunPy working directory. sample_dir = data/sample_data ;;;;;;;;;;;; ; Database ; ;;;;;;;;;;;; [database] ; Location to specify sunpy database parameters. ; The default url of the database location can specified here. The url of ; the database comprises the database driver, its location and name, as well ; as optional authentication parameters ; Default value: sqlite://///sunpy/sunpydb.sqlite ; url = sqlite:////home/$USER/sunpy/sunpydb.sqlitesunpy-0.8.3/sunpy/database/0000755000175000017500000000000013232563477016032 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/database/tests/0000755000175000017500000000000013232563477017174 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/database/tests/__init__.py0000644000175000001440000000000013203275053020245 0ustar nabil00000000000000sunpy-0.8.3/sunpy/database/tests/test_attrs.py0000644000175000017500000004061513231613137021734 0ustar nabilnabil00000000000000# Author: Simon Liedtke # # This module was developed with funding provided by # the Google Summer of Code (2013). from datetime import datetime import pytest from astropy import units as u from sunpy.database.database import Database from sunpy.database import tables from sunpy.database.attrs import walker, Starred, Tag, Path, DownloadTime,\ FitsHeaderEntry from sunpy.net.attr import DummyAttr, AttrAnd, AttrOr from sunpy.net import vso from sunpy.extern.six.moves import range @pytest.fixture def obj(): return object() @pytest.fixture def session(): database = Database('sqlite:///:memory:') for i in range(1, 11): entry = tables.DatabaseEntry() database.add(entry) # every entry has a fake download time of 2005-06-15 i:00:00 database.edit(entry, download_time=datetime(2005, 6, 15, i)) # every second entry gets starred if i % 2 == 0: database.star(entry) # every third entry is stored in the path /tmp if i % 3 == 0: database.edit(entry, path='/tmp') # every fifth entry gets the tag 'foo' if i % 5 == 0: database.tag(entry, 'foo') # the last entry gets the FITS header entry INSTRUME=EIT entry.fits_header_entries.append(tables.FitsHeaderEntry('INSTRUME', 'EIT')) database.commit() return database.session @pytest.fixture def vso_session(): client = vso.VSOClient() qr = client.search( vso.attrs.Time((2011, 9, 20, 1), (2011, 9, 20, 2)), vso.attrs.Instrument('RHESSI')) entries = tables.entries_from_query_result(qr) database = Database('sqlite:///:memory:') for entry in entries: database.add(entry) database.commit() return database.session def test_starred_nonzero(): assert Starred() def test_starred_invert(): assert not ~Starred() def test_starred_and_different_types(obj): assert Starred() & obj == AttrAnd([Starred(), obj]) def test_starred_and_same_types(): assert ~Starred() & ~Starred() == ~Starred() assert ~Starred() & Starred() == ~Starred() assert Starred() & ~Starred() == ~Starred() assert Starred() & Starred() == Starred() def test_starred_or_different_types(obj): assert Starred() | obj == AttrOr([Starred(), obj]) def test_starred_or_same_types(): assert ~Starred() | ~Starred() == ~Starred() assert ~Starred() | Starred() == Starred() assert Starred() | ~Starred() == Starred() assert Starred() | Starred() == Starred() def test_starred_equality(): assert Starred() == Starred() assert Starred() != ~Starred() assert ~Starred() != Starred() assert ~Starred() == ~Starred() def test_starred_repr(): assert repr(Starred()) == '' assert repr(~Starred()) == '<~Starred()>' def test_tag_repr(): assert repr(Tag('foo')) == "" assert repr(~Tag('foo')) == "<~Tag('foo')>" def test_path_repr(): assert repr(Path('/tmp')) == "" assert repr(~Path('/tmp')) == "<~Path('/tmp')>" def test_downloadtime_repr(): download_time = DownloadTime('2008-12-8', datetime(2009, 6, 12)) expected_repr = ( '') assert repr(download_time) == expected_repr def test_inverted_downloadtime_repr(): download_time = ~DownloadTime('2008-12-8', datetime(2009, 6, 12)) expected_repr = ( '<~DownloadTime(datetime.datetime(2008, 12, 8, 0, 0), ' 'datetime.datetime(2009, 6, 12, 0, 0))>') assert repr(download_time) == expected_repr def test_fitsheaderentry_repr(): header_entry = FitsHeaderEntry('key', 'value') assert repr(header_entry) == "" assert repr(~header_entry) == "<~FitsHeaderEntry('key', 'value')>" def test_walker_create_dummy(session): with pytest.raises(TypeError): walker.create(DummyAttr(), session) def test_walker_create_starred_true(session): entries = walker.create(Starred(), session) tag = tables.Tag('foo') tag.id = 1 fits_header_entry = tables.FitsHeaderEntry('INSTRUME', 'EIT') fits_header_entry.id = 1 assert len(entries) == 5 assert entries == [ tables.DatabaseEntry( id=2, starred=True, download_time=datetime(2005, 6, 15, 2)), tables.DatabaseEntry( id=4, starred=True, download_time=datetime(2005, 6, 15, 4)), tables.DatabaseEntry( id=6, path='/tmp', starred=True, download_time=datetime(2005, 6, 15, 6)), tables.DatabaseEntry( id=8, starred=True, download_time=datetime(2005, 6, 15, 8)), tables.DatabaseEntry( id=10, starred=True, tags=[tag], download_time=datetime(2005, 6, 15, 10), fits_header_entries=[fits_header_entry])] def test_walker_create_starred_false(session): entries = walker.create(~Starred(), session) tag = tables.Tag('foo') tag.id = 1 assert len(entries) == 5 assert entries == [ tables.DatabaseEntry(id=1, download_time=datetime(2005, 6, 15, 1)), tables.DatabaseEntry( id=3, path='/tmp', download_time=datetime(2005, 6, 15, 3)), tables.DatabaseEntry( id=5, tags=[tag], download_time=datetime(2005, 6, 15, 5)), tables.DatabaseEntry( id=7, download_time=datetime(2005, 6, 15, 7)), tables.DatabaseEntry( id=9, path='/tmp', download_time=datetime(2005, 6, 15, 9))] def test_walker_create_tag_positive(session): entries = walker.create(Tag('foo'), session) tag = tables.Tag('foo') tag.id = 1 fits_header_entry = tables.FitsHeaderEntry('INSTRUME', 'EIT') fits_header_entry.id = 1 assert len(entries) == 2 assert entries == [ tables.DatabaseEntry( id=5, tags=[tag], download_time=datetime(2005, 6, 15, 5)), tables.DatabaseEntry( id=10, starred=True, tags=[tag], download_time=datetime(2005, 6, 15, 10), fits_header_entries=[fits_header_entry])] def test_walker_create_tag_negative(session): entries = walker.create(~Tag('foo'), session) assert len(entries) == 8 assert entries == [ tables.DatabaseEntry(id=1, download_time=datetime(2005, 6, 15, 1)), tables.DatabaseEntry( id=2, starred=True, download_time=datetime(2005, 6, 15, 2)), tables.DatabaseEntry( id=3, path='/tmp', download_time=datetime(2005, 6, 15, 3)), tables.DatabaseEntry( id=4, starred=True, download_time=datetime(2005, 6, 15, 4)), tables.DatabaseEntry( id=6, path='/tmp', starred=True, download_time=datetime(2005, 6, 15, 6)), tables.DatabaseEntry( id=7, download_time=datetime(2005, 6, 15, 7)), tables.DatabaseEntry( id=8, starred=True, download_time=datetime(2005, 6, 15, 8)), tables.DatabaseEntry( id=9, path='/tmp', download_time=datetime(2005, 6, 15, 9))] def test_walker_create_anded_query(session): entries = walker.create(Tag('foo') & Starred(), session) assert len(entries) == 1 tag = tables.Tag('foo') tag.id = 1 fits_header_entry = tables.FitsHeaderEntry('INSTRUME', 'EIT') fits_header_entry.id = 1 assert tables.DatabaseEntry( id=10, starred=True, tags=[tag], download_time=datetime(2005, 6, 15, 10), fits_header_entries=[fits_header_entry]) in entries def test_walker_create_ored_query(session): entries = walker.create(Tag('foo') | Starred(), session) assert len(entries) == 6 tag = tables.Tag('foo') tag.id = 1 fits_header_entry = tables.FitsHeaderEntry('INSTRUME', 'EIT') fits_header_entry.id = 1 assert tables.DatabaseEntry( id=2, starred=True, download_time=datetime(2005, 6, 15, 2)) in entries assert tables.DatabaseEntry( id=4, starred=True, download_time=datetime(2005, 6, 15, 4)) in entries assert tables.DatabaseEntry( id=5, tags=[tag], download_time=datetime(2005, 6, 15, 5)) in entries assert tables.DatabaseEntry( id=6, path='/tmp', starred=True, download_time=datetime(2005, 6, 15, 6)) in entries assert tables.DatabaseEntry( id=8, starred=True, download_time=datetime(2005, 6, 15, 8)) in entries assert tables.DatabaseEntry( id=10, starred=True, tags=[tag], download_time=datetime(2005, 6, 15, 10), fits_header_entries=[fits_header_entry]) in entries def test_walker_create_complex_query(session): query = Tag('foo') & Starred() | ~Tag('foo') & ~Starred() entries = walker.create(query, session) assert len(entries) == 5 tag = tables.Tag('foo') tag.id = 1 fits_header_entry = tables.FitsHeaderEntry('INSTRUME', 'EIT') fits_header_entry.id = 1 assert tables.DatabaseEntry( id=1, download_time=datetime(2005, 6, 15, 1)) in entries assert tables.DatabaseEntry( id=3, path='/tmp', download_time=datetime(2005, 6, 15, 3)) in entries assert tables.DatabaseEntry( id=7, download_time=datetime(2005, 6, 15, 7)) in entries assert tables.DatabaseEntry( id=9, path='/tmp', download_time=datetime(2005, 6, 15, 9)) in entries assert tables.DatabaseEntry( id=10, starred=True, tags=[tag], download_time=datetime(2005, 6, 15, 10), fits_header_entries=[fits_header_entry]) in entries def test_walker_create_path_attr_notfound(session): assert walker.create(Path('doesnotexist'), session) == [] def test_walker_create_path_attr_exists(session): entries = walker.create(Path('/tmp'), session) assert len(entries) == 3 assert tables.DatabaseEntry( id=3, path='/tmp', download_time=datetime(2005, 6, 15, 3)) in entries assert tables.DatabaseEntry( id=6, path='/tmp', starred=True, download_time=datetime(2005, 6, 15, 6)) in entries assert tables.DatabaseEntry( id=9, path='/tmp', download_time=datetime(2005, 6, 15, 9)) in entries def test_walker_create_path_inverted(session): tag = tables.Tag('foo') tag.id = 1 fits_header_entry = tables.FitsHeaderEntry('INSTRUME', 'EIT') fits_header_entry.id = 1 entries = walker.create(~Path('/tmp'), session) assert len(entries) == 7 assert entries == [ tables.DatabaseEntry( id=1, download_time=datetime(2005, 6, 15, 1)), tables.DatabaseEntry( id=2, starred=True, download_time=datetime(2005, 6, 15, 2)), tables.DatabaseEntry( id=4, starred=True, download_time=datetime(2005, 6, 15, 4)), tables.DatabaseEntry( id=5, tags=[tag], download_time=datetime(2005, 6, 15, 5)), tables.DatabaseEntry(id=7, download_time=datetime(2005, 6, 15, 7)), tables.DatabaseEntry( id=8, starred=True, download_time=datetime(2005, 6, 15, 8)), tables.DatabaseEntry( id=10, starred=True, tags=[tag], download_time=datetime(2005, 6, 15, 10), fits_header_entries=[fits_header_entry])] def test_walker_create_downloadtime_notfound(session): download_time = DownloadTime( datetime(2005, 6, 15, 11), datetime(2005, 6, 15, 11)) entries = walker.create(download_time, session) assert entries == [] def test_walker_create_downloadtime_exists(session): download_time = DownloadTime( datetime(2005, 6, 15, 7), datetime(2005, 6, 15, 9)) entries = walker.create(download_time, session) assert entries == [ tables.DatabaseEntry(id=7, download_time=datetime(2005, 6, 15, 7)), tables.DatabaseEntry( id=8, starred=True, download_time=datetime(2005, 6, 15, 8)), tables.DatabaseEntry( id=9, path='/tmp', download_time=datetime(2005, 6, 15, 9))] def test_walker_create_downloadtime_inverted(session): tag = tables.Tag('foo') tag.id = 1 fits_header_entry = tables.FitsHeaderEntry('INSTRUME', 'EIT') fits_header_entry.id = 1 download_time = ~DownloadTime( datetime(2005, 6, 15, 7), datetime(2005, 6, 15, 9)) entries = walker.create(download_time, session) assert len(entries) == 7 assert entries == [ tables.DatabaseEntry( id=1, download_time=datetime(2005, 6, 15, 1)), tables.DatabaseEntry( id=2, starred=True, download_time=datetime(2005, 6, 15, 2)), tables.DatabaseEntry( id=3, path='/tmp', download_time=datetime(2005, 6, 15, 3)), tables.DatabaseEntry( id=4, starred=True, download_time=datetime(2005, 6, 15, 4)), tables.DatabaseEntry( id=5, tags=[tag], download_time=datetime(2005, 6, 15, 5)), tables.DatabaseEntry( id=6, starred=True, path='/tmp', download_time=datetime(2005, 6, 15, 6)), tables.DatabaseEntry( id=10, starred=True, tags=[tag], download_time=datetime(2005, 6, 15, 10), fits_header_entries=[fits_header_entry])] def test_walker_create_fitsheader(session): tag = tables.Tag('foo') tag.id = 1 entries = walker.create(FitsHeaderEntry('INSTRUME', 'EIT'), session) fits_header_entry = tables.FitsHeaderEntry('INSTRUME', 'EIT') fits_header_entry.id = 1 assert len(entries) == 1 assert entries == [tables.DatabaseEntry( id=10, starred=True, tags=[tag], download_time=datetime(2005, 6, 15, 10), fits_header_entries=[fits_header_entry])] def test_walker_create_fitsheader_inverted(session): tag = tables.Tag('foo') tag.id = 1 entries = walker.create(~FitsHeaderEntry('INSTRUME', 'EIT'), session) assert len(entries) == 9 assert entries == [ tables.DatabaseEntry( id=1, download_time=datetime(2005, 6, 15, 1)), tables.DatabaseEntry( id=2, starred=True, download_time=datetime(2005, 6, 15, 2)), tables.DatabaseEntry( id=3, path='/tmp', download_time=datetime(2005, 6, 15, 3)), tables.DatabaseEntry( id=4, starred=True, download_time=datetime(2005, 6, 15, 4)), tables.DatabaseEntry( id=5, tags=[tag], download_time=datetime(2005, 6, 15, 5)), tables.DatabaseEntry( id=6, starred=True, path='/tmp', download_time=datetime(2005, 6, 15, 6)), tables.DatabaseEntry(id=7, download_time=datetime(2005, 6, 15, 7)), tables.DatabaseEntry( id=8, starred=True, download_time=datetime(2005, 6, 15, 8)), tables.DatabaseEntry( id=9, path='/tmp', download_time=datetime(2005, 6, 15, 9))] @pytest.mark.flaky(reruns=5) @pytest.mark.remote_data def test_walker_create_vso_instrument(vso_session): entries = walker.create(vso.attrs.Instrument('RHESSI'), vso_session) assert entries == [ tables.DatabaseEntry(id=1, source=u'RHESSI', provider=u'LSSP', physobs=u'intensity', fileid=u'/hessidata/2011/09/20/hsi_20110920_010920', observation_time_start=datetime(2011, 9, 20, 1, 9, 20), observation_time_end=datetime(2011, 9, 20, 2, 27, 40), instrument=u'RHESSI', size=-1.0, wavemin=0.4132806579880238, wavemax=7.293188082141598e-05), tables.DatabaseEntry(id=2, source=u'RHESSI', provider=u'LSSP', physobs=u'intensity', fileid=u'/hessidata/2011/09/19/hsi_20110919_233340', observation_time_start=datetime(2011, 9, 19, 23, 33, 40), observation_time_end=datetime(2011, 9, 20, 1, 9, 20), instrument=u'RHESSI', size=-1.0, wavemin=0.4132806579880238, wavemax=7.293188082141598e-05)] @pytest.mark.remote_data def test_walker_create_wave(vso_session): entries = walker.create(vso.attrs.Wavelength(0 * u.AA, 10 * u.AA), vso_session) assert len(entries) == 2 entries = walker.create(vso.attrs.Wavelength(5 * u.AA, 10 * u.AA), vso_session) assert len(entries) == 0 @pytest.mark.flaky(reruns=5) @pytest.mark.remote_data def test_walker_create_time(vso_session): time = vso.attrs.Time( datetime(2011, 9, 17, 0, 0, 0), datetime(2011, 9, 20, 0, 0, 0)) entries = walker.create(time, vso_session) assert len(entries) == 1 assert entries == [ tables.DatabaseEntry(id=2, source=u'RHESSI', provider=u'LSSP', physobs=u'intensity', fileid=u'/hessidata/2011/09/19/hsi_20110919_233340', observation_time_start=datetime(2011, 9, 19, 23, 33, 40), observation_time_end=datetime(2011, 9, 20, 1, 9, 20), instrument=u'RHESSI', size=-1.0, wavemin=0.4132806579880238, wavemax=7.293188082141598e-05)] sunpy-0.8.3/sunpy/database/tests/test_caching.py0000644000175000001440000000414113210261730021146 0ustar nabil00000000000000# Author: Simon Liedtke # # This module was developed with funding provided by # the Google Summer of Code (2013). from __future__ import absolute_import from collections import deque import pytest from sunpy.database.caching import BaseCache, LRUCache, LFUCache def test_custom_cache(): class FIFO(BaseCache): def __init__(self, maxsize=float('inf')): self.queue = deque([], maxsize) BaseCache.__init__(self, maxsize) @property def to_be_removed(self): try: return self.queue[0] except IndexError: return None def remove(self): del self.queue[0] def __getitem__(self, key): for k, value in self.queue: if k == key: return value raise KeyError def __setitem__(self, key, value): self.queue.append((key, value)) def __len__(self): return len(self.queue) cache = FIFO(3) cache[1] = 'a' cache[2] = 'b' cache[3] = 'c' assert cache.to_be_removed == (1, 'a') cache[4] = 'd' assert len(cache) == 3 assert cache[2] == 'b' assert cache[3] == 'c' assert cache[4] == 'd' def test_lru_cache(): lrucache = LRUCache(3) lrucache[1] = 'a' lrucache[2] = 'b' lrucache[3] = 'c' assert lrucache.to_be_removed == (1, 'a') lrucache[1] lrucache[3] assert lrucache.to_be_removed == (2, 'b') lrucache[4] = 'd' assert len(lrucache) == 3 assert lrucache.to_be_removed == (1, 'a') assert lrucache == {1: 'a', 3: 'c', 4: 'd'} def test_lru_cache_missing_item(): with pytest.raises(KeyError): LRUCache()[0] def test_lfu_cache(): lfucache = LFUCache(3) lfucache[1] = 'a' lfucache[2] = 'b' lfucache[3] = 'c' assert lfucache.to_be_removed == (1, 'a') lfucache[1] lfucache[2] assert lfucache.to_be_removed == (3, 'c') lfucache[4] = 'd' assert len(lfucache) == 3 assert lfucache.to_be_removed == (4, 'd') assert lfucache == {1: 'a', 2: 'b', 4: 'd'} sunpy-0.8.3/sunpy/database/tests/test_commands.py0000644000175000017500000002051013231613137022370 0ustar nabilnabil00000000000000# Author: Simon Liedtke # # This module was developed with funding provided by # the Google Summer of Code (2013). from __future__ import absolute_import import fnmatch from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker import pytest from sunpy.database.commands import AddEntry, RemoveEntry, EditEntry,\ AddTag, RemoveTag, NoSuchEntryError, NonRemovableTagError,\ EmptyCommandStackError, CommandManager, CompositeOperation from sunpy.database.tables import DatabaseEntry, Tag @pytest.fixture def session(): # always create an in-memory database with its own new table in each test engine = create_engine('sqlite:///:memory:') Session = sessionmaker() DatabaseEntry.metadata.create_all(bind=engine) return Session(bind=engine) @pytest.fixture def command_manager(): return CommandManager() def test_add_entry_repr(session): entry = DatabaseEntry(id=5) repr_result = repr(AddEntry(session, entry)) expected_repr_result = ( ', ' 'entry id 5)>'.format(id(session))) assert fnmatch.fnmatch(repr_result, expected_repr_result) def test_add_entry(session): assert not session.new entry = DatabaseEntry() AddEntry(session, entry)() assert len(session.new) == 1 assert entry.id is None session.commit() assert not session.new assert entry.id == 1 def test_add_entry_undo(session): entry = DatabaseEntry() cmd = AddEntry(session, entry) cmd() assert session.query(DatabaseEntry).count() == 1 assert entry.id == 1 cmd.undo() assert entry in session.deleted assert session.query(DatabaseEntry).count() == 0 def test_add_removed_entry(session): entry = DatabaseEntry() AddEntry(session, entry)() session.commit() RemoveEntry(session, entry)() session.commit() AddEntry(session, entry)() session.commit() assert not session.new assert entry.id == 1 def test_add_entry_undo_precommit(session): entry = DatabaseEntry() cmd = AddEntry(session, entry) cmd() cmd.undo() session.commit() assert session.query(DatabaseEntry).count() == 0 def test_edit_entry_repr(): entry = DatabaseEntry(id=7) expected_repr_result = "" assert fnmatch.fnmatch(repr(EditEntry(entry, foo='bar')), expected_repr_result) def test_edit_entry_invalid(session): with pytest.raises(ValueError): EditEntry(DatabaseEntry()) def test_edit_entry(session): entry = DatabaseEntry() session.add(entry) session.commit() assert entry.id == 1 EditEntry(entry, id=42)() assert entry.id == 42 def test_edit_entry_undo(session): entry = DatabaseEntry() session.add(entry) session.commit() cmd = EditEntry(entry, id=42) cmd() session.commit() assert entry.id == 42 cmd.undo() session.commit() assert entry.id == 1 def test_remove_entry_repr(session): entry = DatabaseEntry(id=3) expected_repr_result = ( ', ' 'entry )>'.format(id(session))) assert fnmatch.fnmatch(repr(RemoveEntry(session, entry)), expected_repr_result) def test_remove_existing_entry(session): entry = DatabaseEntry() session.add(entry) assert session.query(DatabaseEntry).count() == 1 assert entry.id == 1 RemoveEntry(session, entry)() assert entry in session.deleted assert session.query(DatabaseEntry).count() == 0 def test_remove_nonexisting_entry(session): with pytest.raises(NoSuchEntryError): RemoveEntry(session, DatabaseEntry())() def test_remove_entry_undo(session): entry = DatabaseEntry() session.add(entry) cmd = RemoveEntry(session, entry) session.commit() cmd() assert session.query(DatabaseEntry).count() == 0 cmd.undo() assert session.query(DatabaseEntry).count() == 1 def test_add_tag_repr(session): entry = DatabaseEntry(id=12) tag = Tag('spam') expected_repr_result = ( ", " "entry id 12)>".format(id(session))) assert fnmatch.fnmatch(repr(AddTag(session, entry, tag)), expected_repr_result) def test_add_tag(session): tag = Tag('tag') entry = DatabaseEntry() assert entry.tags == [] cmd = AddTag(session, entry, tag) cmd() assert tag in entry.tags def test_add_removed_tag(session): entry = DatabaseEntry() tag = Tag('tag') entry.tags.append(tag) session.add(tag) session.commit() session.delete(tag) AddTag(session, entry, tag)() assert tag in entry.tags def test_add_tag_undo_unsaved_entry(session): tag = Tag('tag') entry = DatabaseEntry() cmd = AddTag(session, entry, tag) cmd() cmd.undo() assert entry.tags == [] cmd() assert tag in entry.tags def test_remove_tag_repr(session): entry = DatabaseEntry(id=8) tag = Tag('foo') expected_repr_result = ( ", " "entry id 8)>".format(id(session))) assert fnmatch.fnmatch(repr(RemoveTag(session, entry, tag)), expected_repr_result) def test_remove_nonexisting_tag(session): cmd = RemoveTag(session, DatabaseEntry(), Tag('tag')) with pytest.raises(NonRemovableTagError): cmd() def test_remove_tag_undo(session): tag = Tag('tag') entry = DatabaseEntry() entry.tags.append(tag) session.add(entry) session.commit() assert tag in entry.tags cmd = RemoveTag(session, entry, tag) cmd() assert tag not in entry.tags cmd.undo() assert tag in entry.tags def test_cmd_manager_pop_undo_cmd(session, command_manager): cmd = AddEntry(session, DatabaseEntry()) command_manager.do(cmd) popped_cmd = command_manager.pop_undo_command() assert popped_cmd == cmd def test_cmd_manager_pop_undo_cmd_empty_stack(command_manager): with pytest.raises(EmptyCommandStackError): command_manager.pop_undo_command() def test_cmd_manager_pop_redo_cmd(command_manager): with pytest.raises(EmptyCommandStackError): command_manager.pop_redo_command() def test_cmd_manager_pop_redo_cmd_empty_stack(session, command_manager): cmd = AddEntry(session, DatabaseEntry()) command_manager.do(cmd) command_manager.undo() popped_cmd = command_manager.pop_redo_command() assert popped_cmd == cmd def test_cmd_manager_redo_stack_empty_after_call(session, command_manager): command_manager.do(AddEntry(session, DatabaseEntry())) command_manager.do(AddEntry(session, DatabaseEntry())) assert len(command_manager.undo_commands) == 2 session.commit() command_manager.undo(2) assert not command_manager.undo_commands assert len(command_manager.redo_commands) == 2 command_manager.do(AddEntry(session, DatabaseEntry())) assert not command_manager.redo_commands def test_cmd_manager_redo(session, command_manager): assert command_manager.undo_commands == [] assert command_manager.redo_commands == [] command_manager.do(AddEntry(session, DatabaseEntry())) command_manager.do(AddEntry(session, DatabaseEntry())) assert len(command_manager.undo_commands) == 2 assert command_manager.redo_commands == [] session.commit() command_manager.undo(2) assert command_manager.undo_commands == [] assert len(command_manager.redo_commands) == 2 command_manager.redo(2) assert len(command_manager.undo_commands) == 2 assert command_manager.redo_commands == [] def test_undo_redo_multiple_cmds_at_once(session, command_manager): assert command_manager.undo_commands == [] command_manager.do(CompositeOperation([ AddEntry(session, DatabaseEntry()), AddEntry(session, DatabaseEntry()), AddEntry(session, DatabaseEntry())])) assert len(command_manager.undo_commands) == 1 assert session.query(DatabaseEntry).count() == 3 command_manager.undo() assert command_manager.undo_commands == [] assert session.query(DatabaseEntry).count() == 0 command_manager.redo() assert command_manager.redo_commands == [] assert session.query(DatabaseEntry).count() == 3 sunpy-0.8.3/sunpy/database/tests/test_database.py0000644000175000017500000010146413231613137022343 0ustar nabilnabil00000000000000# Author: Simon Liedtke # # This module was developed with funding provided by # the Google Summer of Code (2013). from __future__ import absolute_import import glob import os import os.path import shutil import pytest import sqlalchemy from astropy import units import sunpy from sunpy.database import Database, EntryAlreadyAddedError,\ EntryAlreadyStarredError, EntryAlreadyUnstarredError, NoSuchTagError,\ EntryNotFoundError, TagAlreadyAssignedError, disable_undo, split_database from sunpy.database.tables import DatabaseEntry, Tag, FitsHeaderEntry,\ FitsKeyComment, JSONDump from sunpy.database.commands import EmptyCommandStackError, NoSuchEntryError from sunpy.database.caching import LRUCache, LFUCache from sunpy.database import attrs from sunpy.net import vso, hek from sunpy.data.test.waveunit import waveunitdir from sunpy.io import fits from sunpy.extern.six.moves import range from sunpy.extern.six.moves import configparser from sunpy.net import Fido, attrs as net_attrs import sunpy.data.test testpath = sunpy.data.test.rootdir RHESSI_IMAGE = os.path.join(testpath, 'hsi_image_20101016_191218.fits') """ The 'hsi_image_20101016_191218.fits' file lies in the sunpy/data/test. RHESSI_IMAGE = sunpy/data/test/hsi_image_20101016_191218.fits So, the tests in the database depends on the test under sunpy/data. """ @pytest.fixture def database_using_lrucache(): return Database('sqlite:///:memory:', LRUCache, cache_size=3) @pytest.fixture def database_using_lfucache(): return Database('sqlite:///:memory:', LFUCache, cache_size=3) @pytest.fixture def database(): return Database('sqlite:///:memory:') @pytest.fixture def fido_search_result(): # A search query with responses from all instruments # No JSOC query return Fido.search( net_attrs.Time("2012/1/1", "2012/1/2"), net_attrs.Instrument('lyra') | net_attrs.Instrument('eve') | net_attrs.Instrument('XRS') | net_attrs.Instrument('noaa-indices') | net_attrs.Instrument('noaa-predict') | (net_attrs.Instrument('norh') & net_attrs.Wavelength(17*units.GHz)) | net_attrs.Instrument('rhessi') | (net_attrs.Instrument('EVE') & net_attrs.Level(0)) ) @pytest.fixture def query_result(): return vso.VSOClient().search( vso.attrs.Time('20130801T200000', '20130801T200030'), vso.attrs.Instrument('PLASTIC')) @pytest.fixture def download_qr(): return vso.VSOClient().search( vso.attrs.Time('2012-03-29', '2012-03-29'), vso.attrs.Instrument('AIA')) @pytest.fixture def empty_query(): return [ vso.attrs.Time((2012, 7, 3), (2012, 7, 4)), vso.attrs.Instrument('EIT')] @pytest.fixture def download_query(): return [ vso.attrs.Time((2013, 5, 19, 2), (2013, 5, 19, 2), (2013, 5, 19, 2)), vso.attrs.Instrument('VIRGO') | vso.attrs.Instrument('SECCHI')] @pytest.fixture def filled_database(): database = Database('sqlite:///:memory:') for i in range(1, 11): entry = DatabaseEntry() database.add(entry) # every fourth entry gets the tag 'foo' if i % 4 == 0: database.tag(entry, 'foo') # every fifth entry gets the tag 'bar' if i % 5 == 0: database.tag(entry, 'bar') database.commit() return database def test_config_url(monkeypatch): monkeypatch.setattr("sunpy.config", configparser.SafeConfigParser()) url = 'sqlite:///' sunpy.config.add_section('database') sunpy.config.set('database', 'url', url) database = Database() assert database.url == url def test_config_url_none(monkeypatch): monkeypatch.setattr("sunpy.config", configparser.SafeConfigParser()) with pytest.raises(configparser.NoSectionError): Database() def test_tags_unique(database): entry = DatabaseEntry() entry.tags = [Tag('foo')] database.add(entry) database.commit() entry.tags.append(Tag('foo')) with pytest.raises(sqlalchemy.orm.exc.FlushError): database.commit() def test_setting_cache_size(database_using_lrucache): assert database_using_lrucache.cache_maxsize == 3 assert database_using_lrucache.cache_size == 0 for _ in range(5): database_using_lrucache.add(DatabaseEntry()) assert len(database_using_lrucache) == 3 assert database_using_lrucache.cache_size == 3 assert database_using_lrucache.cache_maxsize == 3 database_using_lrucache.set_cache_size(5) assert database_using_lrucache.cache_size == 3 assert database_using_lrucache.cache_maxsize == 5 for _ in range(5): database_using_lrucache.add(DatabaseEntry()) assert len(database_using_lrucache) == 5 assert database_using_lrucache.cache_size == 5 assert database_using_lrucache.cache_maxsize == 5 def test_setting_cache_size_shrinking(database_using_lrucache): assert database_using_lrucache.cache_maxsize == 3 assert database_using_lrucache.cache_size == 0 for _ in range(5): database_using_lrucache.add(DatabaseEntry()) assert len(database_using_lrucache) == 3 assert database_using_lrucache.cache_maxsize == 3 assert database_using_lrucache.cache_size == 3 database_using_lrucache.set_cache_size(2) assert database_using_lrucache.cache_maxsize == 2 assert database_using_lrucache.cache_size == 2 assert len(database_using_lrucache) == 2 assert list(database_using_lrucache) == [ DatabaseEntry(id=4), DatabaseEntry(id=5)] for _ in range(5): database_using_lrucache.add(DatabaseEntry()) assert len(database_using_lrucache) == 2 assert database_using_lrucache.cache_maxsize == 2 assert database_using_lrucache.cache_size == 2 def test_setting_cache_size_undo(database_using_lrucache): assert database_using_lrucache.cache_maxsize == 3 assert database_using_lrucache.cache_size == 0 for _ in range(5): database_using_lrucache.add(DatabaseEntry()) assert len(database_using_lrucache) == 3 database_using_lrucache.set_cache_size(1) assert database_using_lrucache.cache_size == 1 assert len(database_using_lrucache) == 1 database_using_lrucache.undo() assert len(database_using_lrucache) == 3 def test_get_entry_by_id_invalid(database): with pytest.raises(EntryNotFoundError): database.get_entry_by_id(0) def test_get_entry_by_id_zero(filled_database): with pytest.raises(EntryNotFoundError): filled_database.get_entry_by_id(0) def test_get_entry_by_id_accessible(filled_database): assert filled_database.get_entry_by_id(1) == DatabaseEntry(id=1) def test_tags_property(database): assert database.tags == [] def test_get_existing_tag(database): entry = DatabaseEntry() database.tag(entry, 'tag') database.add(entry) expected_tag = Tag('tag') expected_tag.id = 1 assert database.get_tag('tag') == expected_tag def test_get_nonexting_tag(database): with pytest.raises(NoSuchTagError): database.get_tag('foo') def test_tag_missing_tags_arg(database): with pytest.raises(TypeError): database.tag(DatabaseEntry()) def test_tag_new_tag(database): entry = DatabaseEntry() database.tag(entry, 'tag') assert len(entry.tags) == 1 database.add(entry) assert len(database.tags) == 1 tag = entry.tags[0] assert tag.name == 'tag' assert tag in database.tags def test_tag_existing_tag(database): entry1 = DatabaseEntry() entry2 = DatabaseEntry() database.tag(entry1, 'tag') database.tag(entry2, 'tag') assert entry1.tags == entry2.tags def test_tag_duplicate(database): entry = DatabaseEntry() database.add(entry) database.tag(entry, 'tag') database.commit() with pytest.raises(TagAlreadyAssignedError): database.tag(entry, 'tag') def test_tag_duplicates_before_adding(database): entry1 = DatabaseEntry() entry2 = DatabaseEntry() database.tag(entry1, 'tag') database.tag(entry2, 'tag') database.add(entry1) database.add(entry2) with pytest.raises(sqlalchemy.orm.exc.FlushError): database.commit() def test_tag_undo(database): entry = DatabaseEntry() database.add(entry) database.tag(entry, 'tag') assert len(database.tags) == 1 assert len(entry.tags) == 1 database.undo() assert len(entry.tags) == 0 assert len(database.tags) == 0 database.redo() assert len(database.tags) == 1 assert len(entry.tags) == 1 def remove_nonexisting_tag(database): with pytest.raises(NoSuchTagError): database.remove_tag('foo') def test_remove_tag(filled_database): foo = Tag('foo') foo.id = 1 fourth_entry = filled_database.get_entry_by_id(4) assert foo in fourth_entry.tags eighth_entry = filled_database.get_entry_by_id(8) assert foo in eighth_entry.tags filled_database.remove_tag(fourth_entry, 'foo') assert foo not in fourth_entry.tags assert foo in filled_database.tags filled_database.remove_tag(eighth_entry, 'foo') assert foo not in eighth_entry.tags assert foo not in filled_database.tags def test_remove_tag_undo_redo(filled_database): foo = Tag('foo') foo.id = 1 fourth_entry = filled_database.get_entry_by_id(4) assert foo in fourth_entry.tags filled_database.remove_tag(fourth_entry, 'foo') assert foo not in fourth_entry.tags assert foo in filled_database.tags filled_database.undo() assert foo in fourth_entry.tags assert foo in filled_database.tags filled_database.redo() assert foo not in fourth_entry.tags assert foo in filled_database.tags eighth_entry = filled_database.get_entry_by_id(8) filled_database.remove_tag(eighth_entry, 'foo') assert foo not in eighth_entry.tags assert foo not in filled_database.tags filled_database.undo() assert foo not in fourth_entry.tags assert foo in eighth_entry.tags assert foo in filled_database.tags filled_database.redo() assert foo not in eighth_entry.tags assert foo not in filled_database.tags def test_star_entry(database): entry = DatabaseEntry() assert not entry.starred database.star(entry) assert entry.starred def test_star_already_starred_entry(database): entry = DatabaseEntry() database.star(entry) with pytest.raises(EntryAlreadyStarredError): database.star(entry) def test_star_undo(database): entry = DatabaseEntry() assert not entry.starred database.star(entry) assert entry.starred database.undo() assert not entry.starred database.redo() assert entry.starred def unstar_entry(database): entry = DatabaseEntry() assert not entry.starred database.star(entry) assert entry.starred database.unstar(entry) assert not entry.starred def test_unstar_already_unstarred_entry(database): with pytest.raises(EntryAlreadyUnstarredError): database.unstar(DatabaseEntry()) def test_unstar_already_unstarred_entry_ignore(database): entry = DatabaseEntry() database.unstar(entry, True) assert not entry.starred def test_unstar_undo(database): entry = DatabaseEntry() entry.starred = True database.unstar(entry) assert not entry.starred database.undo() assert entry.starred database.redo() assert not entry.starred def test_add_many(database): assert len(database) == 0 database.add_many((DatabaseEntry() for _ in range(5))) assert len(database) == 5 database.undo() with pytest.raises(EmptyCommandStackError): database.undo() assert len(database) == 0 database.redo() assert len(database) == 5 def test_add_many_with_existing_entry(database): evil_entry = DatabaseEntry() database.add(evil_entry) assert len(database) == 1 with pytest.raises(EntryAlreadyAddedError): database.add_many([evil_entry]) def test_add_entry(database): entry = DatabaseEntry() assert entry.id is None database.add(entry) database.commit() assert entry.id == 1 def test_add_already_existing_entry(database): entry = DatabaseEntry() database.add(entry) database.commit() with pytest.raises(EntryAlreadyAddedError): database.add(entry) def test_add_already_existing_entry_ignore(database): entry = DatabaseEntry() database.add(entry) database.add(entry, True) database.commit() assert entry.id == 1 @pytest.mark.remote_data def test_add_entry_from_hek_qr(database): hek_res = hek.HEKClient().search( hek.attrs.Time('2011/08/09 07:23:56', '2011/08/09 07:24:00'), hek.attrs.EventType('FL')) assert len(database) == 0 database.add_from_hek_query_result(hek_res) # This number loves to change, so we are just going to test that it's added # *something* assert len(database) > 1 def num_entries_from_vso_query(db, query, path=None, file_pattern='', overwrite=False): db.download_from_vso_query_result( query, path=path, overwrite=overwrite) fits_pattern = file_pattern num_of_fits_headers = sum( len(fits.get_header(file)) for file in glob.glob(fits_pattern)) return num_of_fits_headers @pytest.mark.remote_data def test_vso_query_block_caching(database, download_qr, tmpdir): assert len(database) == 0 # Download for all query response blocks and save the length # of database in num_of_fits_headers num_of_fits_headers = num_entries_from_vso_query(database, download_qr, path=str(tmpdir.join('{file}.fits')), file_pattern=str(tmpdir.join('*.fits'))) assert len(database) == num_of_fits_headers and len(database) > 0 # Emptying the database database.clear() database.commit() # Only downloading for the first query response block num_of_fits_headers_1 = num_entries_from_vso_query(database, download_qr[:1], path=str(tmpdir.join('{file}.type1')), file_pattern=str(tmpdir.join('*.type1'))) assert len(database) == num_of_fits_headers_1 and len(database) > 0 # Downloading for all query response blocks num_of_fits_headers_2 = num_entries_from_vso_query(database, download_qr, path=str(tmpdir.join('{file}.type2')), file_pattern=str(tmpdir.join('*.type2'))) # Final length of the database should be the same as num_of_fits_headers. # This is done to ensure that the first query response block's files weren't # redownloaded. If they were redownloaded then length will be greater than # num_of_fits_headers as new entries are added to the database in case of a # download. assert len(database) == num_of_fits_headers_1 + num_of_fits_headers_2 assert len(database) > 0 assert num_of_fits_headers_1 + num_of_fits_headers_2 == num_of_fits_headers @pytest.mark.remote_data def test_vso_query_block_caching_with_overwrite_true_flag(database, download_qr, tmpdir): assert len(database) == 0 # Download for all query response blocks and save the length # of database in num_of_fits_headers num_of_fits_headers = num_entries_from_vso_query(database, download_qr, path=str(tmpdir.join('{file}.fits')), file_pattern=str(tmpdir.join('*.fits'))) assert len(database) == num_of_fits_headers and len(database) > 0 # Only downloading for the first query response block with caching disabled num_of_fits_headers_1 = num_entries_from_vso_query(database, download_qr[:1], path=str(tmpdir.join('{file}.type1')), file_pattern=str(tmpdir.join('*.type1')), overwrite=True) # The files for the first query response block should be downloaded again # Old entries should be deleted, so len(database) should not change assert len(database) == num_of_fits_headers assert len(database) > 0 @pytest.mark.remote_data def test_download_from_qr(database, download_qr, tmpdir): assert len(database) == 0 database.download_from_vso_query_result( download_qr, path=str(tmpdir.join('{file}.fits'))) fits_pattern = str(tmpdir.join('*.fits')) num_of_fits_headers = sum( len(fits.get_header(file)) for file in glob.glob(fits_pattern)) assert len(database) == num_of_fits_headers > 0 for entry in database: assert os.path.dirname(entry.path) == str(tmpdir) database.undo() assert len(database) == 0 database.redo() assert len(database) == num_of_fits_headers > 0 @pytest.mark.remote_data def test_add_entry_from_qr(database, query_result): assert len(database) == 0 database.add_from_vso_query_result(query_result) assert len(database) == 16 database.undo() assert len(database) == 0 database.redo() assert len(database) == 16 @pytest.mark.remote_data def test_add_entries_from_qr_duplicates(database, query_result): assert len(database) == 0 database.add_from_vso_query_result(query_result) assert len(database) == 16 with pytest.raises(EntryAlreadyAddedError): database.add_from_vso_query_result(query_result) @pytest.mark.remote_data def test_add_entries_from_qr_ignore_duplicates(database, query_result): assert len(database) == 0 database.add_from_vso_query_result(query_result) assert len(database) == 16 database.add_from_vso_query_result(query_result, True) assert len(database) == 32 @pytest.mark.remote_data def test_add_entry_fido_search_result(database, fido_search_result): assert len(database) == 0 database.add_from_fido_search_result(fido_search_result) assert len(database) == 65 database.undo() assert len(database) == 0 database.redo() assert len(database) == 65 @pytest.mark.remote_data def test_add_entries_from_fido_search_result_JSOC_client(database): assert len(database) == 0 search_result = Fido.search( net_attrs.jsoc.Time('2014-01-01T00:00:00', '2014-01-01T01:00:00'), net_attrs.jsoc.Series('hmi.m_45s'), net_attrs.jsoc.Notify("sunpy@sunpy.org") ) with pytest.raises(ValueError): database.add_from_fido_search_result(search_result) @pytest.mark.remote_data def test_add_entries_from_fido_search_result_duplicates(database, fido_search_result): assert len(database) == 0 database.add_from_fido_search_result(fido_search_result) assert len(database) == 65 with pytest.raises(EntryAlreadyAddedError): database.add_from_fido_search_result(fido_search_result) @pytest.mark.remote_data def test_add_entries_from_fido_search_result_ignore_duplicates(database, fido_search_result): assert len(database) == 0 database.add_from_fido_search_result(fido_search_result) assert len(database) == 65 database.add_from_fido_search_result(fido_search_result, True) assert len(database) == 2*65 def test_add_fom_path(database): assert len(database) == 0 database.add_from_dir(waveunitdir) assert len(database) == 4 database.undo() assert len(database) == 0 database.redo() assert len(database) == 4 def test_add_fom_path_duplicates(database): database.add_from_dir(waveunitdir) assert len(database) == 4 with pytest.raises(EntryAlreadyAddedError): database.add_from_dir(waveunitdir) def test_add_fom_path_ignore_duplicates(database): database.add_from_dir(waveunitdir) assert len(database) == 4 database.add_from_dir(waveunitdir, ignore_already_added=True) assert len(database) == 8 def test_add_from_file(database): assert len(database) == 0 database.add_from_file(RHESSI_IMAGE) assert len(database) == 4 # make sure that all entries have the same fileid fileid = database[0].fileid for entry in database: assert entry.fileid == fileid def test_add_from_file_hdu_index(database): assert len(database) == 0 database.add_from_file(RHESSI_IMAGE) assert len(database) == 4 for i, entry in enumerate(database): assert entry.hdu_index == i def test_add_from_file_duplicates(database): database.add_from_file(RHESSI_IMAGE) with pytest.raises(EntryAlreadyAddedError): database.add_from_file(RHESSI_IMAGE) def test_add_from_file_ignore_duplicates(database): assert len(database) == 0 database.add_from_file(RHESSI_IMAGE) assert len(database) == 4 database.add_from_file(RHESSI_IMAGE, True) assert len(database) == 8 def test_edit_entry(database): entry = DatabaseEntry() database.add(entry) database.commit() assert entry.id == 1 database.edit(entry, id=42) assert entry.id == 42 def test_remove_many_entries(filled_database): bar = Tag('bar') bar.id = 2 # required to check if `remove_many` adds any entries to undo-history filled_database.clear_histories() filled_database.remove_many(filled_database[:8]) assert len(filled_database) == 2 assert list(filled_database) == [ DatabaseEntry(id=9), DatabaseEntry(id=10, tags=[bar])] filled_database.undo() assert len(filled_database) == 10 with pytest.raises(EmptyCommandStackError): filled_database.undo() def test_remove_existing_entry(database): entry = DatabaseEntry() database.add(entry) assert database.session.query(DatabaseEntry).count() == 1 assert entry.id == 1 database.remove(entry) assert database.session.query(DatabaseEntry).count() == 0 def test_remove_nonexisting_entry(database): with pytest.raises(NoSuchEntryError): database.remove(DatabaseEntry()) def test_clear_empty_database(database): database.clear() def test_clear_database(filled_database): assert len(filled_database) == 10 filled_database.clear() assert not filled_database assert filled_database.session.query(JSONDump).all() == [] assert filled_database.session.query(FitsHeaderEntry).all() == [] assert filled_database.session.query(FitsKeyComment).all() == [] assert filled_database.session.query(Tag).all() == [] filled_database.undo() assert len(filled_database) == 10 filled_database.redo() assert not filled_database assert filled_database.session.query(JSONDump).all() == [] assert filled_database.session.query(FitsHeaderEntry).all() == [] assert filled_database.session.query(FitsKeyComment).all() == [] assert filled_database.session.query(Tag).all() == [] def test_getitem_notfound(database): with pytest.raises(IndexError): database[23] def test_getitem_one(filled_database): first_entry = DatabaseEntry(id=1) assert filled_database[0] == first_entry def test_getitem_getall(filled_database): entries = filled_database[:] assert entries == list(filled_database) def test_getitem_custom(filled_database): entries = filled_database[1:5:2] foo = Tag('foo') foo.id = 1 assert entries == [ DatabaseEntry(id=2), DatabaseEntry(id=4, tags=[foo])] def test_getitem_exceeding_range(filled_database): entries = filled_database[7:1000] foo = Tag('foo') foo.id = 1 bar = Tag('bar') bar.id = 2 assert entries == [ DatabaseEntry(id=8, tags=[foo]), DatabaseEntry(id=9), DatabaseEntry(id=10, tags=[bar])] def test_getitem_negative_index(filled_database): entry = filled_database[-4] assert entry == DatabaseEntry(id=7) def test_getitem_negative_indices_slice(filled_database): entries = filled_database[-2:-8:-2] bar = Tag('bar') bar.id = 2 assert entries == [ DatabaseEntry(id=9), DatabaseEntry(id=7), DatabaseEntry(id=5, tags=[bar])] def test_contains_exists(database): entry = DatabaseEntry() database.add(entry) database.commit() assert entry in database def test_contains_precommit(database): entry = DatabaseEntry() database.add(entry) assert entry not in database def test_contains_notexists(database): assert DatabaseEntry() not in database def test_iter(database): entry1 = DatabaseEntry() entry2 = DatabaseEntry() database.add(entry1) database.add(entry2) expected_entries = [entry1, entry2] entries = list(database) assert entries == expected_entries def test_len(database): assert len(database) == 0 database.session.add(DatabaseEntry()) assert len(database) == 1 def test_lru_cache(database_using_lrucache): assert not database_using_lrucache._cache entry1, entry2, entry3 = DatabaseEntry(), DatabaseEntry(), DatabaseEntry() database_using_lrucache.add(entry1) database_using_lrucache.add(entry2) database_using_lrucache.add(entry3) assert len(database_using_lrucache) == 3 assert list(database_using_lrucache._cache.items()) == [ (1, entry1), (2, entry2), (3, entry3)] database_using_lrucache.get_entry_by_id(1) database_using_lrucache.get_entry_by_id(3) entry4 = DatabaseEntry() database_using_lrucache.add(entry4) assert len(database_using_lrucache) == 3 assert list(database_using_lrucache._cache.items()) == [ (1, entry1), (3, entry3), (4, entry4)] def test_lfu_cache(database_using_lfucache): assert not database_using_lfucache._cache entry1, entry2, entry3 = DatabaseEntry(), DatabaseEntry(), DatabaseEntry() database_using_lfucache.add(entry1) database_using_lfucache.add(entry2) database_using_lfucache.add(entry3) assert len(database_using_lfucache) == 3 assert list(database_using_lfucache._cache.items()) == [ (1, entry1), (2, entry2), (3, entry3)] # access the entries #1 and #2 to increment their counters database_using_lfucache.get_entry_by_id(1) database_using_lfucache.get_entry_by_id(2) entry4 = DatabaseEntry() database_using_lfucache.add(entry4) assert len(database_using_lfucache) == 3 assert list(database_using_lfucache._cache.items()) == [ (1, entry1), (2, entry2), (4, entry4)] def test_query_missing_arg(database): with pytest.raises(TypeError): database.search() def test_query_unexpected_kwarg(database): with pytest.raises(TypeError): database.search(attrs.Starred(), foo=42) def test_query(filled_database): foo = Tag('foo') foo.id = 1 bar = Tag('bar') bar.id = 2 entries = filled_database.search( attrs.Tag('foo') | attrs.Tag('bar'), sortby='id') assert len(entries) == 4 assert entries == [ DatabaseEntry(id=4, tags=[foo]), DatabaseEntry(id=5, tags=[bar]), DatabaseEntry(id=8, tags=[foo]), DatabaseEntry(id=10, tags=[bar])] def test_fetch_missing_arg(database): with pytest.raises(TypeError): database.fetch() @pytest.mark.remote_data def test_fetch_empty_query_result(database, empty_query): database.fetch(*empty_query) with pytest.raises(EmptyCommandStackError): database.undo() assert len(database) == 0 @pytest.mark.remote_data def test_fetch(database, download_query, tmpdir): assert len(database) == 0 database.default_waveunit = 'angstrom' database.fetch( *download_query, path=str(tmpdir.join('{file}.fits')), progress=True) fits_pattern = str(tmpdir.join('*.fits')) num_of_fits_headers = sum( len(fits.get_header(file)) for file in glob.glob(fits_pattern)) assert len(database) == num_of_fits_headers for entry in database: assert os.path.dirname(entry.path) == str(tmpdir) database.undo() assert len(database) == 0 database.redo() assert len(database) == 4 @pytest.mark.remote_data def test_fetch_duplicates(database, download_query, tmpdir): assert len(database) == 0 database.default_waveunit = 'angstrom' database.fetch( *download_query, path=str(tmpdir.join('{file}.fits')), progress=True) assert len(database) == 4 download_time = database[0].download_time database.fetch(*download_query, path=str(tmpdir.join('{file}.fits'))) assert len(database) == 4 # The old file should be untouched because of the query result block # level caching assert database[0].download_time == download_time def test_fetch_missing_arg(database): with pytest.raises(TypeError): database.fetch() @pytest.mark.remote_data def test_fetch(database, download_query, tmpdir): assert len(database) == 0 database.default_waveunit = 'angstrom' database.fetch(*download_query, path=str(tmpdir.join('{file}.fits'))) assert len(database) == 4 download_time = database[0].download_time database.fetch(*download_query, path=str(tmpdir.join('{file}.fits'))) assert len(database) == 4 assert database[0].download_time == download_time @pytest.mark.remote_data def test_fetch_separate_filenames(): # Setup db = Database('sqlite:///') download_query = [ vso.attrs.Time('2012-08-05', '2012-08-05 00:00:05'), vso.attrs.Instrument('AIA') ] tmp_test_dir = os.path.join( sunpy.config.get('downloads', 'download_dir'), 'tmp_test_dir/' ) if not os.path.isdir(tmp_test_dir): os.makedirs(tmp_test_dir) path = tmp_test_dir + '{file}' db.fetch(*download_query, path=path) # Test assert len(db) == 4 dir_contents = os.listdir(tmp_test_dir) assert 'aia_lev1_335a_2012_08_05t00_00_02_62z_image_lev1.fits' in dir_contents assert 'aia_lev1_94a_2012_08_05t00_00_01_12z_image_lev1.fits' in dir_contents assert os.path.isfile(os.path.join( tmp_test_dir, 'aia_lev1_335a_2012_08_05t00_00_02_62z_image_lev1.fits')) assert os.path.isfile(os.path.join( tmp_test_dir, 'aia_lev1_94a_2012_08_05t00_00_01_12z_image_lev1.fits')) # Teardown shutil.rmtree(tmp_test_dir) @pytest.mark.remote_data def test_disable_undo(database, download_query, tmpdir): entry = DatabaseEntry() with disable_undo(database) as db: db.set_cache_size(5) db.add(entry) db.commit() db.remove(entry) db.default_waveunit = 'angstrom' db.fetch(*download_query, path=str(tmpdir.join('{file}.fits'))) entry = db[0] db.tag(entry, 'foo', 'bar') db.remove_tag(entry, 'foo') db.star(entry) db.unstar(entry) db.add_many([entry, entry], ignore_already_added=True) db.add(entry, ignore_already_added=True) db.add_from_dir(str(tmpdir)) db.clear() with pytest.raises(EmptyCommandStackError): database.undo() @pytest.fixture def default_waveunit_database(): unit_database = Database('sqlite:///:memory:', default_waveunit=units.meter) str_database = Database('sqlite:///:memory:', default_waveunit="m") return unit_database, str_database def test_default_waveunit(default_waveunit_database): unit_database, str_database = default_waveunit_database assert isinstance(unit_database.default_waveunit, units.UnitBase) assert isinstance(str_database.default_waveunit, units.UnitBase) @pytest.fixture def split_function_database(): """ Generates a custom database to test the split_database function """ database = Database('sqlite:///:memory:') for i in range(1, 11): entry = DatabaseEntry() database.add(entry) # every fourth entry gets the instrument 'EIA' if i % 4 == 0: database.edit(entry, instrument='EIA') # every fifth entry gets the instrument 'AIA_3' elif i % 5 == 0: database.edit(entry, instrument='AIA_3') # every other entry gets instrument 'RHESSI' else: database.edit(entry, instrument='RHESSI') # all entries have provider 'xyz' database.edit(entry, provider='xyz') database.commit() return database def test_split_database(split_function_database, database): # Send all entries with instrument='EIA' to destination_database split_function_database, database = split_database( split_function_database, database, vso.attrs.Instrument('EIA')) observed_source_entries = split_function_database.search( vso.attrs.Provider('xyz'), sortby='id') observed_destination_entries = database.search(vso.attrs.Provider('xyz')) assert observed_source_entries == [ DatabaseEntry(id=1, instrument='RHESSI', provider='xyz'), DatabaseEntry(id=2, instrument='RHESSI', provider='xyz'), DatabaseEntry(id=3, instrument='RHESSI', provider='xyz'), DatabaseEntry(id=5, instrument='AIA_3', provider='xyz'), DatabaseEntry(id=6, instrument='RHESSI', provider='xyz'), DatabaseEntry(id=7, instrument='RHESSI', provider='xyz'), DatabaseEntry(id=9, instrument='RHESSI', provider='xyz'), DatabaseEntry(id=10, instrument='AIA_3', provider='xyz'), ] assert observed_destination_entries == [ DatabaseEntry(id=4, instrument='EIA', provider='xyz'), DatabaseEntry(id=8, instrument='EIA', provider='xyz'), ] sunpy-0.8.3/sunpy/database/tests/test_table.txt0000644000175000017500000000107013231613137022045 0ustar nabilnabil00000000000000 id source provider physobs fileid download_time observation_time_start instrument size wavemin path starred tags --- ------ -------- ------------ ----------------- ------------------- ---------------------- ----------- ----- ------- ---- ------- -------- 1 SOHO SDAC intensity /archive/soho/... N/A 2001-01-01 07:00:14 EIT 259.0 171.0 N/A No foo, bar 2 GONG NSO LOS_velocity pptid=11010... 2014-06-15 03:42:55 2010-01-01 00:59:00 Merged gong 944.0 6768.0 N/A Yes N/A sunpy-0.8.3/sunpy/database/tests/test_tables.py0000644000175000017500000005230213232563373022054 0ustar nabilnabil00000000000000# Author: Simon Liedtke # # This module was developed with funding provided by # the Google Summer of Code (2013). from collections import Hashable from datetime import datetime import pytest import os from astropy import units as u from astropy import conf import numpy as np from sunpy.database import Database from sunpy.database.tables import FitsHeaderEntry, FitsKeyComment, Tag,\ DatabaseEntry, entries_from_query_result, entries_from_dir,\ entries_from_file, _create_display_table, WaveunitNotFoundError, \ entries_from_fido_search_result from sunpy.net import vso, Fido, attrs as net_attrs from sunpy.data.test import rootdir as testdir from sunpy.data.test.waveunit import waveunitdir, MQ_IMAGE from sunpy.extern.six import next RHESSI_IMAGE = os.path.join(testdir, 'hsi_image_20101016_191218.fits') EIT_195_IMAGE = os.path.join(testdir, 'EIT/efz20040301.000010_s.fits') GOES_DATA = os.path.join(testdir, 'go1520110607.fits') """ The hsi_image_20101016_191218.fits file and go1520110607.fits file lie in the sunpy/data/tests dirctory. The efz20040301.000010_s.fits file lies in the sunpy/data/tests/EIT directory. RHESSI_IMAGE = sunpy/data/test/hsi_image_20101016_191218.fits EIT_195_IMAGE = sunpy/data/test/EIT/efz20040301.000010_s.fits GOES_DATA = sunpy/data/test/go1520110607.fits """ @pytest.fixture def fido_search_result(): # A search query with responses from all instruments # No JSOC query return Fido.search( net_attrs.Time("2012/1/1", "2012/1/2"), net_attrs.Instrument('lyra') | net_attrs.Instrument('eve') | net_attrs.Instrument('XRS') | net_attrs.Instrument('noaa-indices') | net_attrs.Instrument('noaa-predict') | (net_attrs.Instrument('norh') & net_attrs.Wavelength(17 * u.GHz)) | net_attrs.Instrument('rhessi') | (net_attrs.Instrument('EVE') & net_attrs.Level(0)) ) @pytest.fixture def query_result(): client = vso.VSOClient() return client.query_legacy('2001/1/1', '2001/1/2', instrument='EIT') @pytest.fixture def qr_with_none_waves(): return vso.VSOClient().search( vso.attrs.Time('20121224T120049.8', '20121224T120049.8'), vso.attrs.Provider('SDAC'), vso.attrs.Instrument('VIRGO')) @pytest.fixture def qr_block_with_missing_physobs(): return vso.VSOClient().search( vso.attrs.Time('20130805T120000', '20130805T121000'), vso.attrs.Instrument('SWAVES'), vso.attrs.Source('STEREO_A'), vso.attrs.Provider('SSC'), vso.attrs.Wavelength(10 * u.kHz, 160 * u.kHz))[0] @pytest.fixture def qr_block_with_kev_unit(): return vso.VSOClient().search( vso.attrs.Time((2011, 9, 20, 1), (2011, 9, 20, 2)), vso.attrs.Instrument('RHESSI'))[0] def test_fits_header_entry_equality(): assert FitsHeaderEntry('key', 'value') == FitsHeaderEntry('key', 'value') assert not (FitsHeaderEntry('key', 'value') == FitsHeaderEntry('k', 'v')) def test_fits_header_entry_inequality(): assert FitsHeaderEntry('key', 'value') != FitsHeaderEntry('k', 'v') assert not (FitsHeaderEntry('k', 'v') != FitsHeaderEntry('k', 'v')) def test_fits_header_entry_hashability(): assert isinstance(FitsHeaderEntry('key', 'value'), Hashable) def test_tag_equality(): assert Tag('abc') == Tag('abc') assert not (Tag('abc') == Tag('xyz')) def test_tag_inequality(): assert Tag('abc') != Tag('xyz') assert not (Tag('abc') != Tag('abc')) def test_tag_hashability(): assert isinstance(Tag(''), Hashable) @pytest.mark.flaky(reruns=5) @pytest.mark.remote_data def test_entries_from_fido_search_result(fido_search_result): entries = list(entries_from_fido_search_result(fido_search_result)) # 65 entries for 8 instruments in fido_search_result assert len(entries) == 65 # First 2 entries are from lyra assert entries[0] == DatabaseEntry( source='Proba2', provider='esa', physobs='irradiance', fileid='http://proba2.oma.be/lyra/data/bsd/2012/01/01/lyra_20120101-000000_lev2_std.fits', observation_time_start=datetime(2012, 1, 1, 0, 0), observation_time_end=datetime(2012, 1, 2, 0, 0), wavemin=np.nan, wavemax=np.nan, instrument='lyra') # 54 entries from EVE assert entries[2] == DatabaseEntry( source='SDO', provider='LASP', physobs='irradiance', fileid='EVE_L1_esp_2012001_00', observation_time_start=datetime(2012, 1, 1, 0, 0), observation_time_end=datetime(2012, 1, 2, 0, 0), instrument='EVE', size=-1.0, wavemin=0.1, wavemax=30.4) # 2 entries from goes assert entries[56] == DatabaseEntry( source='nasa', provider='sdac', physobs='irradiance', fileid='http://umbra.nascom.nasa.gov/goes/fits/2012/go1520120101.fits', observation_time_start=datetime(2012, 1, 1, 0, 0), observation_time_end=datetime(2012, 1, 1, 23, 59, 59, 999000), wavemin=np.nan, wavemax=np.nan, instrument='goes') # 1 entry from noaa-indices assert entries[58] == DatabaseEntry( source='sdic', provider='swpc', physobs='sunspot number', fileid='ftp://ftp.swpc.noaa.gov/pub/weekly/RecentIndices.txt', observation_time_start=datetime(2012, 1, 1, 0, 0), observation_time_end=datetime(2012, 1, 2, 0, 0), wavemin=np.nan, wavemax=np.nan, instrument='noaa-indices') # 1 entry from noaa-predict assert entries[59] == DatabaseEntry( source='ises', provider='swpc', physobs='sunspot number', fileid='http://services.swpc.noaa.gov/text/predicted-sunspot-radio-flux.txt', observation_time_start=datetime(2012, 1, 1, 0, 0), observation_time_end=datetime(2012, 1, 2, 0, 0), wavemin=np.nan, wavemax=np.nan, instrument='noaa-predict') # 2 entries from norh assert entries[60] == DatabaseEntry( source='NAOJ', provider='NRO', physobs="", fileid=("ftp://anonymous:data@sunpy.org@solar-pub.nao.ac.jp/" "pub/nsro/norh/data/tcx/2012/01/tca120101"), observation_time_start=datetime(2012, 1, 1, 0, 0), observation_time_end=datetime(2012, 1, 2, 0, 0), wavemin=17634850.470588233, wavemax=17634850.470588233, instrument='NORH') # 1 entry from rhessi assert entries[62] == DatabaseEntry( source="rhessi", provider='nasa', physobs='irradiance', fileid=("https://hesperia.gsfc.nasa.gov/" "hessidata/metadata/catalog/hsi_obssumm_20120101_016.fits"), observation_time_start=datetime(2012, 1, 1, 0, 0), observation_time_end=datetime(2012, 1, 2, 0, 0), wavemin=np.nan, wavemax=np.nan, instrument='rhessi') # 2 entries from eve, level 0 assert entries[63] == DatabaseEntry( source='SDO', provider='LASP', physobs='irradiance', fileid=("http://lasp.colorado.edu/eve/data_access/evewebdata/quicklook" "/L0CS/SpWx/2012/20120101_EVE_L0CS_DIODES_1m.txt"), observation_time_start=datetime(2012, 1, 1, 0, 0), observation_time_end=datetime(2012, 1, 2, 0, 0), wavemin=np.nan, wavemax=np.nan, instrument='eve') @pytest.mark.remote_data def test_entries_from_fido_search_result_JSOC(): search_result = Fido.search( net_attrs.jsoc.Time('2014-01-01T00:00:00', '2014-01-01T01:00:00'), net_attrs.jsoc.Series('hmi.m_45s'), net_attrs.jsoc.Notify("sunpy@sunpy.org") ) with pytest.raises(ValueError): # Using list() here is important because the # entries_from_fido_search_result function uses yield. # list() uses the generator to run the function body. list(entries_from_fido_search_result(search_result)) @pytest.mark.remote_data def test_from_fido_search_result_block(fido_search_result): entry = DatabaseEntry._from_fido_search_result_block( fido_search_result[0, 0][0].get_response(0)[0]) expected_entry = DatabaseEntry( source='Proba2', provider='esa', physobs='irradiance', fileid='http://proba2.oma.be/lyra/data/bsd/2012/01/01/lyra_20120101-000000_lev2_std.fits', observation_time_start=datetime(2012, 1, 1, 0, 0), observation_time_end=datetime(2012, 1, 2, 0, 0), wavemin=np.nan, wavemax=np.nan, instrument='lyra') assert entry == expected_entry @pytest.mark.remote_data def test_entry_from_qr_block(query_result): entry = DatabaseEntry._from_query_result_block(query_result[0]) expected_entry = DatabaseEntry( source='SOHO', provider='SDAC', physobs='intensity', fileid='/archive/soho/private/data/processed/eit/lz/2001/01/efz20010101.000042', observation_time_start=datetime(2001, 1, 1, 0, 0, 42), observation_time_end=datetime(2001, 1, 1, 0, 0, 54), instrument='EIT', size=2059.0, wavemin=19.5, wavemax=19.5) assert entry == expected_entry @pytest.mark.remote_data def test_entry_from_qr_block_with_missing_physobs(qr_block_with_missing_physobs): entry = DatabaseEntry._from_query_result_block( qr_block_with_missing_physobs) expected_entry = DatabaseEntry( source='STEREO_A', provider='SSC', fileid='swaves/2013/swaves_average_20130805_a_hfr.dat', observation_time_start=datetime(2013, 8, 5), observation_time_end=datetime(2013, 8, 6), instrument='SWAVES', size=3601.08, wavemin=2398339664000.0, wavemax=18737028625.0) assert entry == expected_entry @pytest.mark.flaky(reruns=5) @pytest.mark.remote_data def test_entry_from_qr_block_kev(qr_block_with_kev_unit): # See issue #766. entry = DatabaseEntry._from_query_result_block(qr_block_with_kev_unit) assert entry.source == 'RHESSI' assert entry.provider == 'LSSP' assert entry.fileid == '/hessidata/2011/09/20/hsi_20110920_010920' assert entry.observation_time_start == datetime(2011, 9, 20, 1, 9, 20) assert entry.observation_time_end == datetime(2011, 9, 20, 2, 27, 40) assert entry.instrument == 'RHESSI' assert entry.size == -1 assert round(entry.wavemin, 3) == 0.413 assert round(entry.wavemax, 7) == 0.0000729 def test_entries_from_file(): entries = list(entries_from_file(MQ_IMAGE)) assert len(entries) == 1 entry = entries[0] assert len(entry.fits_header_entries) == 31 expected_fits_header_entries = [ FitsHeaderEntry('SIMPLE', True), FitsHeaderEntry('BITPIX', 16), FitsHeaderEntry('NAXIS', 2), FitsHeaderEntry('NAXIS1', 1500), FitsHeaderEntry('NAXIS2', 1340), FitsHeaderEntry('CONTACT', 'Isabelle.Buale@obspm.fr'), FitsHeaderEntry('DATE_OBS', '2013-08-12T08:42:53.000'), FitsHeaderEntry('DATE_END', '2013-08-12T08:42:53.000'), FitsHeaderEntry('FILENAME', 'mq130812.084253.fits'), FitsHeaderEntry('INSTITUT', 'Observatoire de Paris'), FitsHeaderEntry('INSTRUME', 'Spectroheliograph'), FitsHeaderEntry('OBJECT', 'FS'), FitsHeaderEntry('OBS_MODE', 'SCAN'), FitsHeaderEntry('PHYSPARA', 'Intensity'), FitsHeaderEntry('NBREG', 1), FitsHeaderEntry('NBLAMBD', 1), FitsHeaderEntry('WAVELNTH', 6563), FitsHeaderEntry('WAVEUNIT', 'angstrom'), FitsHeaderEntry('POLARANG', 0), FitsHeaderEntry('THEMISFF', 3), FitsHeaderEntry('LONGTRC', 258.78), FitsHeaderEntry('LONGCARR', 258.78), FitsHeaderEntry('LONGITUD', 258.78), FitsHeaderEntry('LATITUD', 6.50107), FitsHeaderEntry('LATIRC', 6.50107), FitsHeaderEntry('INDLAMD', 1), FitsHeaderEntry('INDREG', 1), FitsHeaderEntry('SEQ_IND', 1), FitsHeaderEntry('SVECTOR', 0), FitsHeaderEntry('COMMENT', ''), FitsHeaderEntry('HISTORY', '')] assert entry.fits_header_entries == expected_fits_header_entries assert entry.fits_key_comments.sort() == [ FitsKeyComment('SIMPLE', 'Written by IDL: Mon Aug 12 08:48:08 2013'), FitsKeyComment('BITPIX', 'Integer*2 (short integer)')].sort() assert entry.instrument == 'Spectroheliograph' assert entry.observation_time_start == datetime(2013, 8, 12, 8, 42, 53) assert entry.observation_time_end == datetime(2013, 8, 12, 8, 42, 53) assert round(entry.wavemin, 1) == 656.3 assert round(entry.wavemax, 1) == 656.3 assert entry.path == MQ_IMAGE def test_entries_from_file_withoutwaveunit(): # does not raise `WaveunitNotFoundError`, because no wavelength information # is present in this file next(entries_from_file(RHESSI_IMAGE)) with pytest.raises(WaveunitNotFoundError): next(entries_from_file(EIT_195_IMAGE)) def test_entries_from_file_time_string_parse_format(): with pytest.raises(ValueError): # Error should be raised because of the date format in GOES_DATA entries = list(entries_from_file(GOES_DATA)) entries = list(entries_from_file(GOES_DATA, time_string_parse_format='%d/%m/%Y')) assert len(entries) == 4 entry = entries[0] assert len(entry.fits_header_entries) == 17 assert entry.observation_time_start == datetime(2011, 6, 7, 0, 0) assert entry.observation_time_end == datetime(2011, 6, 7, 0, 0) assert entry.path == GOES_DATA def test_entries_from_dir(): entries = list(entries_from_dir( waveunitdir, time_string_parse_format='%d/%m/%Y')) assert len(entries) == 4 for entry, filename in entries: if filename.endswith('na120701.091058.fits'): break assert entry.path in (os.path.join(waveunitdir, filename), filename) assert filename.startswith(waveunitdir) assert len(entry.fits_header_entries) == 42 assert entry.fits_header_entries == [ FitsHeaderEntry('SIMPLE', True), FitsHeaderEntry('BITPIX', -32), FitsHeaderEntry('NAXIS', 3), FitsHeaderEntry('NAXIS1', 256), FitsHeaderEntry('NAXIS2', 256), FitsHeaderEntry('NAXIS3', 1), FitsHeaderEntry('DATE', '27-OCT-82'), FitsHeaderEntry('DATE-OBS', '2012-07-01'), FitsHeaderEntry('DATE_OBS', '2012-07-01T09:10:58.200Z'), FitsHeaderEntry('DATE_END', '2012-07-01T09:10:58.200Z'), FitsHeaderEntry('WAVELNTH', 1.98669), FitsHeaderEntry('WAVEUNIT', 'm'), FitsHeaderEntry('PHYSPARA', 'STOKESI'), FitsHeaderEntry('OBJECT', 'FS'), FitsHeaderEntry('OBS_TYPE', 'RADIO'), FitsHeaderEntry('OBS_MODE', 'IMAGE'), FitsHeaderEntry('LONGITUD', 0.0), FitsHeaderEntry('LATITUDE', 0.0), FitsHeaderEntry('INSTITUT', 'MEUDON'), FitsHeaderEntry('CMP_NAME', 'ROUTINE'), FitsHeaderEntry('CONTACT', ' A. KERDRAON'), FitsHeaderEntry('TELESCOP', 'NRH'), FitsHeaderEntry('INSTRUME', 'NRH2'), FitsHeaderEntry('FILENAME', 'nrh2_1509_h80_20120701_091058c02_i.fts'), FitsHeaderEntry('NRH_DATA', '2DB'), FitsHeaderEntry('ORIGIN', 'wrfits'), FitsHeaderEntry('FREQ', 150.9), FitsHeaderEntry('FREQUNIT', 6), FitsHeaderEntry('BSCALE', 1.0), FitsHeaderEntry('BZERO', 0.0), FitsHeaderEntry('BUNIT', 'K'), FitsHeaderEntry('EXPTIME', 1168576512), FitsHeaderEntry('CTYPE1', 'Solar-X'), FitsHeaderEntry('CTYPE2', 'Solar-Y'), FitsHeaderEntry('CTYPE3', 'StokesI'), FitsHeaderEntry('CRPIX1', 128), FitsHeaderEntry('CRPIX2', 128), FitsHeaderEntry('CDELT1', 0.015625), FitsHeaderEntry('CDELT2', 0.015625), FitsHeaderEntry('SOLAR_R', 64.0), FitsHeaderEntry('COMMENT', ''), FitsHeaderEntry('HISTORY', '')] assert entry.fits_key_comments.sort() == [ FitsKeyComment('WAVEUNIT', 'in meters'), FitsKeyComment('NAXIS2', 'number of rows'), FitsKeyComment('CDELT2', 'pixel scale y, in solar radius/pixel'), FitsKeyComment('CRPIX1', 'SUN CENTER X, pixels'), FitsKeyComment('CRPIX2', 'SUN CENTER Y, pixels'), FitsKeyComment('SOLAR_R', 'SOLAR RADIUS, pixels'), FitsKeyComment('NAXIS1', 'number of columns'), FitsKeyComment('CDELT1', 'pixel scale x, in solar radius/pixel'), FitsKeyComment('NAXIS3', 'StokesI'), FitsKeyComment('TELESCOP', 'Nancay Radioheliograph'), FitsKeyComment('INSTRUME', 'Nancay 2D-images Radioheliograph'), FitsKeyComment('BUNIT', 'Brightness temperature'), FitsKeyComment('BITPIX', 'IEEE 32-bit floating point values'), FitsKeyComment('DATE', 'Date of file creation'), FitsKeyComment('FREQUNIT', 'in MHz'), FitsKeyComment('EXPTIME', 'in seconds')].sort() def test_entries_from_dir_recursively_true(): entries = list(entries_from_dir(testdir, True, default_waveunit='angstrom', time_string_parse_format='%d/%m/%Y')) assert len(entries) == 101 def test_entries_from_dir_recursively_false(): entries = list(entries_from_dir(testdir, False, default_waveunit='angstrom', time_string_parse_format='%d/%m/%Y')) assert len(entries) == 80 @pytest.mark.remote_data def test_entries_from_query_result(query_result): entries = list(entries_from_query_result(query_result)) assert len(entries) == 122 snd_entry = entries[1] expected_entry = DatabaseEntry( source='SOHO', provider='SDAC', physobs='intensity', fileid='/archive/soho/private/data/processed/eit/lz/2001/01/efz20010101.001210', observation_time_start=datetime(2001, 1, 1, 0, 12, 10), observation_time_end=datetime(2001, 1, 1, 0, 12, 23), instrument='EIT', size=2059.0, wavemin=19.5, wavemax=19.5) assert snd_entry == expected_entry @pytest.mark.remote_data def test_entry_from_query_results_with_none_wave(qr_with_none_waves): # does not raise WaveunitNotFoundError because neither wavemin nor wavemax # are given list(entries_from_query_result(qr_with_none_waves)) @pytest.mark.remote_data def test_entry_from_query_results_with_none_wave_and_default_unit( qr_with_none_waves): entries = list(entries_from_query_result(qr_with_none_waves, 'nm')) assert len(entries) == 4 assert entries == [ DatabaseEntry( source='SOHO', provider='SDAC', physobs='intensity', fileid='/archive/soho/private/data/processed/virgo/level1/1212/HK/121222_1.H01', observation_time_start=datetime(2012, 12, 23, 23, 59, 3), observation_time_end=datetime(2012, 12, 24, 23, 59, 2), instrument='VIRGO', size=155.0, wavemin=None, wavemax=None), DatabaseEntry( source='SOHO', provider='SDAC', physobs='intensity', fileid='/archive/soho/private/data/processed/virgo/level1/1212/LOI/121224_1.L01', observation_time_end=datetime(2012, 12, 24, 23, 59, 2), observation_time_start=datetime(2012, 12, 23, 23, 59, 3), instrument='VIRGO', size=329.0, wavemin=None, wavemax=None), DatabaseEntry( source='SOHO', provider='SDAC', physobs='intensity', fileid='/archive/soho/private/data/processed/virgo/level1/1212/SPM/121222_1.S02', observation_time_start=datetime(2012, 12, 23, 23, 59, 3), observation_time_end=datetime(2012, 12, 24, 23, 59, 2), instrument='VIRGO', size=87.0, wavemin=None, wavemax=None), DatabaseEntry( source='SOHO', provider='SDAC', physobs='intensity', fileid='/archive/soho/private/data/processed/virgo/level1/1212/DIARAD/121222_1.D01', observation_time_start=datetime(2012, 12, 24, 0, 1, 58), observation_time_end=datetime(2012, 12, 25, 0, 1, 57), instrument='VIRGO', size=14.0, wavemin=None, wavemax=None)] def test_create_display_table_missing_entries(): with pytest.raises(TypeError): _create_display_table([], ['some', 'columns']) def test_create_display_table_empty_db(): with pytest.raises(TypeError): _create_display_table(Database('sqlite:///'), ['id']) def test_create_display_table_missing_columns(): with pytest.raises(TypeError): _create_display_table([DatabaseEntry()], []) def test_create_display_table(): conf.max_width = 500 entries = [ DatabaseEntry( id=1, source='SOHO', provider='SDAC', physobs='intensity', fileid='/archive/soho/...', observation_time_start=datetime(2001, 1, 1, 7, 0, 14), observation_time_end=datetime(2001, 1, 1, 7, 0, 21), instrument='EIT', size=259.0, wavemin=171.0, wavemax=171.0, tags=[Tag('foo'), Tag('bar')]), DatabaseEntry( id=2, source='GONG', provider='NSO', physobs='LOS_velocity', fileid='pptid=11010...', observation_time_start=datetime(2010, 1, 1, 0, 59), observation_time_end=datetime(2010, 1, 1, 1), download_time=datetime(2014, 6, 15, 3, 42, 55, 123456), instrument='Merged gong', size=944.0, wavemin=6768.0, wavemax=6768.0, starred=True)] columns = [ 'id', 'source', 'provider', 'physobs', 'fileid', 'download_time', 'observation_time_start', 'instrument', 'size', 'wavemin', 'path', 'starred', 'tags'] table = _create_display_table(entries, columns) filedir = os.path.dirname(os.path.realpath(__file__)) with open(os.path.join(filedir, 'test_table.txt'), 'r') as f: stored_table = f.read() assert table.__str__().strip() == stored_table.strip() conf.reset('max_width') sunpy-0.8.3/sunpy/database/__init__.py0000644000175000001440000000224713210261730017115 0ustar nabil00000000000000# Author: Simon Liedtke # # This module was developed with funding provided by # the Google Summer of Code (2013). """ Overview ^^^^^^^^ The database package exports the following classes and exceptions: :classes: - Database :exceptions: - EntryAlreadyAddedError - NoSuchEntryError - EntryAlreadyStarredError - EntryAlreadyUnstarredError - EntryNotFoundError - TagAlreadyAssignedError - NoSuchTagError - NonRemovableTagError :functions: - disable_undo """ from __future__ import absolute_import from sunpy.database.database import Database, EntryAlreadyAddedError,\ EntryAlreadyStarredError, EntryAlreadyUnstarredError, NoSuchTagError,\ EntryNotFoundError, TagAlreadyAssignedError, disable_undo, split_database from sunpy.database.commands import NoSuchEntryError, NonRemovableTagError __all__ = [ 'Database', 'EntryAlreadyAddedError', 'NoSuchEntryError', 'NoSuchTagError', 'NonRemovableTagError', 'EntryAlreadyStarredError', 'EntryAlreadyUnstarredError', 'EntryNotFoundError', 'TagAlreadyAssignedError', 'disable_undo', 'split_database'] sunpy-0.8.3/sunpy/database/attrs.py0000644000175000017500000002047113231613137017531 0ustar nabilnabil00000000000000# Author: Simon Liedtke # # This module was developed with funding provided by # the Google Summer of Code (2013). from __future__ import absolute_import from sqlalchemy import or_, and_, not_ from sunpy.time import parse_time from sunpy.net.vso import attrs as vso_attrs from sunpy.net.attr import AttrWalker, Attr, ValueAttr, AttrAnd, AttrOr from sunpy.database.tables import DatabaseEntry, Tag as TableTag,\ FitsHeaderEntry as TableFitsHeaderEntry from sunpy.extern import six __all__ = [ 'Starred', 'Tag', 'Path', 'DownloadTime', 'FitsHeaderEntry', 'walker'] # This frozenset has been hardcoded to denote VSO attributes that are # currently supported, on derdon's request. SUPPORTED_SIMPLE_VSO_ATTRS = frozenset(['source', 'provider', 'physobs', 'instrument']) SUPPORTED_NONVSO_ATTRS = frozenset(['starred']) class _BooleanAttr(object): def __init__(self, value, make): self.value = bool(value) self.make = make def __and__(self, other): if not isinstance(other, self.make): return AttrAnd([self, other]) attr = self.make() attr.value = self.value and other.value return attr def __or__(self, other): if not isinstance(other, self.make): return AttrOr([self, other]) attr = self.make() attr.value = self.value or other.value return attr def __nonzero__(self): # py 2.x return self.value def __bool__(self): # py 3.x return self.value def __invert__(self): attr = self.make() attr.value = not self.value return attr def __eq__(self, other): return isinstance(other, self.make) and self.value == other.value def __hash__(self): return super(_BooleanAttr, self).__hash__() def collides(self, other): # pragma: no cover return False def __repr__(self): return '<{0}{1}()>'.format( '~' if not self.value else '', self.__class__.__name__) class Starred(_BooleanAttr, Attr): def __init__(self): _BooleanAttr.__init__(self, True, self.__class__) class Tag(Attr): def __init__(self, tagname): self.tagname = tagname self.inverted = False def __invert__(self): tag = self.__class__(self.tagname) tag.inverted = True return tag def collides(self, other): # pragma: no cover return False def __repr__(self): return '<{0}Tag({1!r})>'.format( '~' if self.inverted else '', self.tagname) class Path(Attr): def __init__(self, value): self.value = value self.inverted = False def __invert__(self): path = self.__class__(self.value) path.inverted = True return path def collides(self, other): # pragma: no cover return isinstance(other, self.__class__) def __repr__(self): return '<{0}Path({1!r})>'.format( '~' if self.inverted else '', self.value) # TODO: support excluding ranges as soon as # vso_attrs._Range.__xor__ is fixed / renamed class DownloadTime(Attr, vso_attrs._Range): def __init__(self, start, end): self.start = parse_time(start) self.end = parse_time(end) self.inverted = False vso_attrs._Range.__init__(self, start, end, self.__class__) def __invert__(self): download_time = self.__class__(self.start, self.end) download_time.inverted = True return download_time def collides(self, other): # pragma: no cover return isinstance(other, self.__class__) def __repr__(self): return '<{0}DownloadTime({1!r}, {2!r})>'.format( '~' if self.inverted else '', self.start, self.end) class FitsHeaderEntry(Attr): def __init__(self, key, value): self.key = key self.value = value self.inverted = False def __invert__(self): entry = self.__class__(self.key, self.value) entry.inverted = True return entry def collides(self, other): # pragma: no cover return False def __repr__(self): return '<{0}FitsHeaderEntry({1!r}, {2!r})>'.format( '~' if self.inverted else '', self.key, self.value) walker = AttrWalker() @walker.add_creator(AttrOr) def _create(wlk, root, session): entries = set() for attr in root.attrs: # make sure to add only new entries to the set to avoid duplicates entries.update(set(wlk.create(attr, session)) - entries) return list(entries) @walker.add_creator(AttrAnd) def _create(wlk, root, session): entries = [set(wlk.create(attr, session)) for attr in root.attrs] return list(set.intersection(*entries)) @walker.add_creator(ValueAttr) def _create(wlk, root, session): query = session.query(DatabaseEntry) for key, value in six.iteritems(root.attrs): typ = key[0] if typ == 'tag': criterion = TableTag.name.in_([value]) # `key[1]` is here the `inverted` attribute of the tag. That means # that if it is True, the given tag must not be included in the # resulting entries. if key[1]: query = query.filter(~DatabaseEntry.tags.any(criterion)) else: query = query.filter(DatabaseEntry.tags.any(criterion)) elif typ == 'fitsheaderentry': key, val, inverted = value key_criterion = TableFitsHeaderEntry.key == key value_criterion = TableFitsHeaderEntry.value == val if inverted: query = query.filter(not_(and_( DatabaseEntry.fits_header_entries.any(key_criterion), DatabaseEntry.fits_header_entries.any(value_criterion)))) else: query = query.filter(and_( DatabaseEntry.fits_header_entries.any(key_criterion), DatabaseEntry.fits_header_entries.any(value_criterion))) elif typ == 'download time': start, end, inverted = value if inverted: query = query.filter( ~DatabaseEntry.download_time.between(start, end)) else: query = query.filter( DatabaseEntry.download_time.between(start, end)) elif typ == 'path': path, inverted = value if inverted: # pylint: disable=E711 query = query.filter(or_( DatabaseEntry.path != path, DatabaseEntry.path == None)) else: query = query.filter(DatabaseEntry.path == path) elif typ == 'wave': wavemin, wavemax, waveunit = value query = query.filter(and_( DatabaseEntry.wavemin >= wavemin, DatabaseEntry.wavemax <= wavemax)) elif typ == 'time': start, end, near = value query = query.filter(and_( DatabaseEntry.observation_time_start < end, DatabaseEntry.observation_time_end > start)) else: if typ.lower() not in SUPPORTED_SIMPLE_VSO_ATTRS.union(SUPPORTED_NONVSO_ATTRS): raise NotImplementedError("The attribute {0!r} is not yet supported to query a database.".format(typ)) query = query.filter_by(**{typ: value}) return query.all() @walker.add_converter(Tag) def _convert(attr): return ValueAttr({('tag', attr.inverted): attr.tagname}) @walker.add_converter(Starred) def _convert(attr): return ValueAttr({('starred', ): attr.value}) @walker.add_converter(Path) def _convert(attr): return ValueAttr({('path', ): (attr.value, attr.inverted)}) @walker.add_converter(DownloadTime) def _convert(attr): return ValueAttr({ ('download time', ): (attr.start, attr.end, attr.inverted)}) @walker.add_converter(FitsHeaderEntry) def _convert(attr): return ValueAttr( {('fitsheaderentry', ): (attr.key, attr.value, attr.inverted)}) @walker.add_converter(vso_attrs._VSOSimpleAttr) def _convert(attr): return ValueAttr({(attr.__class__.__name__.lower(), ): attr.value}) @walker.add_converter(vso_attrs.Wavelength) def _convert(attr): return ValueAttr({('wave', ): (attr.min.value, attr.max.value, str(attr.unit))}) @walker.add_converter(vso_attrs.Time) def _convert(attr): return ValueAttr({('time', ): (attr.start, attr.end, attr.near)}) sunpy-0.8.3/sunpy/database/caching.py0000644000175000001440000002027613210261730016754 0ustar nabil00000000000000# Author: Simon Liedtke # # This module was developed with funding provided by # the Google Summer of Code (2013). from __future__ import absolute_import from abc import ABCMeta, abstractmethod, abstractproperty from collections import MutableMapping, OrderedDict, Counter from sunpy.extern import six __all__ = ['BaseCache', 'LRUCache', 'LFUCache'] @six.add_metaclass(ABCMeta) class BaseCache(object): """ BaseCache is a class that saves and operates on an OrderedDict. It has a certain capacity, stored in the attribute `maxsize`. Whether this capacity is reached, can be checked by using the boolean property `is_full`. To implement a custom cache, inherit from this class and override the methods ``__getitem__`` and ``__setitem__``. Call the method `sunpy.database.caching.BaseCache.callback` as soon as an item from the cache is removed. """ def __init__(self, maxsize=float('inf')): self.maxsize = maxsize self._dict = OrderedDict() def get(self, key, default=None): # pragma: no cover """Return the corresponding value to `key` if `key` is in the cache, `default` otherwise. This method has no side-effects, multiple calls with the same cache and the same passed key must always return the same value. """ try: return self._dict[key] except KeyError: return default @abstractmethod def __getitem__(self, key): """abstract method: this method must be overwritten by inheriting subclasses. It defines what happens if an item from the cache is attempted to be accessed. """ return # pragma: no cover @abstractmethod def __setitem__(self, key, value): """abstract method: this method must be overwritten by inheriting subclasses. It defines what happens if a new value should be assigned to the given key. If the given key does already exist in the cache or not must be checked by the person who implements this method. """ @abstractproperty def to_be_removed(self): """The item that will be removed on the next :meth:`sunpy.database.caching.BaseCache.remove` call. """ @abstractmethod def remove(self): """Call this method to manually remove one item from the cache. Which item is removed, depends on the implementation of the cache. After the item has been removed, the callback method is called. """ def callback(self, key, value): """This method should be called (by convention) if an item is removed from the cache because it is full. The passed key and value are the ones that are removed. By default this method does nothing, but it can be customized in a custom cache that inherits from this base class. """ @property def is_full(self): """True if the number of items in the cache equals :attr:`maxsize`, False otherwise. """ return len(self._dict) == self.maxsize def __delitem__(self, key): self._dict.__delitem__(key) def __contains__(self, key): return key in self._dict.keys() def __len__(self): return len(self._dict) def __iter__(self): for key in self._dict.__iter__(): yield key def __reversed__(self): # pragma: no cover for key in self._dict.__reversed__(): yield key def clear(self): # pragma: no cover return self._dict.clear() def keys(self): # pragma: no cover return list(self._dict.keys()) def values(self): # pragma: no cover return list(self._dict.values()) def items(self): # pragma: no cover return list(self._dict.items()) def iterkeys(self): # pragma: no cover return iter(self._dict.keys()) def itervalues(self): # pragma: no cover for value in self._dict.values(): yield value def iteritems(self): # pragma: no cover for key, value in six.iteritems(self._dict): yield key, value def update(self, *args, **kwds): # pragma: no cover self._dict.update(*args, **kwds) def pop(self, key, default=MutableMapping._MutableMapping__marker): # pragma: no cover return self._dict.pop(key, default) def setdefault(self, key, default=None): # pragma: no cover return self._dict.setdefault(key, default) def popitem(self, last=True): # pragma: no cover return self._dict.popitem(last) def __reduce__(self): # pragma: no cover return self._dict.__reduce__() def copy(self): # pragma: no cover return self._dict.copy() def __eq__(self, other): # pragma: no cover return self._dict.__eq__(other) def __ne__(self, other): # pragma: no cover return self._dict.__ne__(other) def viewkeys(self): # pragma: no cover return self._dict.keys() def viewvalues(self): # pragma: no cover return self._dict.values() def viewitems(self): # pragma: no cover return self._dict.items() @classmethod def fromkeys(cls, iterable, value=None): # pragma: no cover return OrderedDict.fromkeys(iterable, value) def __repr__(self): # pragma: no cover return '{0}({1!r})'.format(self.__class__.__name__, dict(self._dict)) class LRUCache(BaseCache): """ LRUCache """ @property def to_be_removed(self): """Return the least recently used key and its corresponding value as a tuple. """ return six.next(self.iteritems()) def remove(self): """Remove the least recently used item.""" self.callback(*self.popitem(last=False)) def __getitem__(self, key): """Returns the value which is associated to the given key and put it with its associated value to the end of this cache. Raises ------ KeyError If the key cannot be found in the cache. """ if key in self: value = self._dict.__getitem__(key) del self[key] self._dict.__setitem__(key, value) return value raise KeyError def __setitem__(self, key, value): """If the key does already exist in the cache, move it to the end of this cache. Otherwise, set a new value and put it to the end of this cache. If the cache is full, remove the least recently used item before inserting the new key-value pair. """ if key in self: del self[key] if self.is_full: self.remove() self._dict.__setitem__(key, value) class LFUCache(BaseCache): """ LFUCache """ def __init__(self, maxsize=float('inf')): self.usage_counter = Counter() BaseCache.__init__(self, maxsize) @property def to_be_removed(self): """Returns the key with the lowest times of access and its corresponding value as a tuple. """ min_ = float('inf') lfu_key = None for k, v in six.iteritems(self.usage_counter): if v < min_: min_ = v lfu_key = k return lfu_key, self.get(lfu_key) def remove(self): """Remove the least frequently used item.""" lfu_key, val = self.to_be_removed del self[lfu_key] del self.usage_counter[lfu_key] self.callback(lfu_key, val) def __getitem__(self, key): """Returns the value which is associated to the given key and increments the frequency counter of this key. Raises ------ KeyError If the key cannot be found in the cache. """ value = self._dict.__getitem__(key) self.usage_counter[key] += 1 return value def __setitem__(self, key, value): """Increment the frequency counter of the given key if it is already present in the cache, otherwise set it to 1. If the cache is full, remove the least frequently used item before inserting the new key-value pair. """ self.usage_counter[key] += 1 if self.is_full: self.remove() self._dict.__setitem__(key, value) sunpy-0.8.3/sunpy/database/commands.py0000644000175000001440000003213313210261730017154 0ustar nabil00000000000000# Author: Simon Liedtke # # This module was developed with funding provided by # the Google Summer of Code (2013). from __future__ import absolute_import from abc import ABCMeta, abstractmethod import os from sqlalchemy.orm import make_transient from sqlalchemy.exc import InvalidRequestError from sunpy.extern import six from sunpy.extern.six.moves import range __all__ = [ 'EmptyCommandStackError', 'NoSuchEntryError', 'NonRemovableTagError', 'DatabaseOperation', 'AddEntry', 'RemoveEntry', 'EditEntry', 'CommandManager'] class EmptyCommandStackError(Exception): """This exception is raised if it is attempted to pop from a command stack even though it is empty. """ class NoSuchEntryError(Exception): """This exception is raised if it is attempted to remove an entry even though it does not exist in the database. """ def __init__(self, database_entry): self.database_entry = database_entry def __str__(self): # pragma: no cover return ( 'the database entry {0!r} cannot be removed because it ' 'is not stored in the database'.format(self.database_entry)) class NonRemovableTagError(Exception): """This exception is raised if it is attempted to remove a tag from a database entry even though it is not saved in this entry. """ def __init__(self, database_entry, tag): self.database_entry = tag self.tag = tag def __str__(self): # pragma: no cover errmsg = 'the tag {0} cannot be removed from the database entry {1!r}' return errmsg.format(self.database_entry, self.tag) @six.add_metaclass(ABCMeta) class DatabaseOperation(object): """This is the abstract main class for all database operations. To implement a new operation, inherit from this class and override the methods __call__ and undo. Both these methods get no parameters (except for self of course). The undo method is expected to do the exact opposite of the __call__ method, so that calling __call__ *and* undo multiple times in a row must not have any side-effects. This is not checked in any way, though. """ @abstractmethod def __call__(self): return # pragma: no cover @abstractmethod def undo(self): return # pragma: no cover class CompositeOperation(DatabaseOperation): def __init__(self, operations=None): if operations is None: self._operations = [] else: self._operations = operations @property def operations(self): return self._operations def add(self, operation): self._operations.append(operation) def remove(self, operation): self._operations.remove(operation) def __call__(self): for operation in self._operations: # FIXME: What follows is the worst hack of my life. Enjoy. # Without it, the test test_clear_database would fail. f = open(os.devnull, 'w'); f.write(repr(operation)); f.flush() operation() def undo(self): for operation in self._operations: operation.undo() def __len__(self): return len(self._operations) class AddEntry(DatabaseOperation): """Add a new database entry to this session. It is not checked whether an equivalent entry is already saved in the session; this has to be checked by the caller. The ``undo`` method removes the entry from the session again. """ def __init__(self, session, database_entry): self.session = session self.database_entry = database_entry def __call__(self): try: self.session.add(self.database_entry) except InvalidRequestError: # database entry cannot be added because it was removed from the # database -> use make_transient to send this object back to # the transient state make_transient(self.database_entry) self.session.add(self.database_entry) def undo(self): try: self.session.delete(self.database_entry) except InvalidRequestError: # database entry cannot be removed because the last call was not # followed by a commit -> use make_transient to revert putting the # entry into the pending state make_transient(self.database_entry) def __repr__(self): return '<{0}(session {1!r}, entry id {2})>'.format( self.__class__.__name__, self.session, self.database_entry.id) class RemoveEntry(DatabaseOperation): """Remove the given database entry from the session. If it cannot be removed, because it is not stored in the session, :exc:`sunpy.database.NoSuchEntryError` is raised. The ``undo`` method puts the database entry back into the session object. """ def __init__(self, session, entry): self.session = session self.entry = entry def __call__(self): try: self.session.delete(self.entry) except InvalidRequestError: # self.database_entry cannot be removed because it's not stored in # the database raise NoSuchEntryError(self.entry) def undo(self): make_transient(self.entry) self.session.add(self.entry) def __repr__(self): return '<{0}(session {1!r}, entry {2!r})>'.format( self.__class__.__name__, self.session, self.entry) class EditEntry(DatabaseOperation): """Change the properties of the database entry. The given keyword arguments are used to set the attributes of the entry. The keys represent the attribute name and the values represent the new value of this attribute. Example: ``EditEntry(entry, foo='bar')`` will set the attribute ``foo`` of ``entry`` to the value ``'bar'``. """ def __init__(self, database_entry, **kwargs): self.database_entry = database_entry if not kwargs: raise ValueError("at least one keyword argument must be given") self.kwargs = kwargs self.prev_values = {} def __call__(self): for k, v in six.iteritems(self.kwargs): # save those values in the dict prev_values that will be changed # so that they can be recovered self.prev_values[k] = getattr(self.database_entry, k) setattr(self.database_entry, k, v) def undo(self): for k, v in six.iteritems(self.prev_values): setattr(self.database_entry, k, v) def __repr__(self): return ''.format( self.kwargs, self.database_entry.id) class AddTag(DatabaseOperation): def __init__(self, session, database_entry, tag): self.session = session self.database_entry = database_entry self.tag = tag def __call__(self): try: self.database_entry.tags.append(self.tag) except InvalidRequestError: # self.tag cannot be added because it was just removed # -> put it back to transient state make_transient(self.tag) self.database_entry.tags.append(self.tag) def undo(self): self.database_entry.tags.remove(self.tag) if not self.tag.data: # remove the tag from the database as well if it was the last tag # assigned to an entry try: RemoveEntry(self.session, self.tag)() except NoSuchEntryError: # entry cannot be removed because tag is only connected to # entries which are not saved in the database # -> can be safely ignored pass def __repr__(self): return "".format( self.tag, self.session, self.database_entry.id) class RemoveTag(DatabaseOperation): """Remove the tag from the given database entry. If the tag cannot be removed from the database entry because it is not assigned to the entry, :exc:`sunpy.database.NonRemovableTagError` is raised. The ``undo`` method puts the removed tag back into the tag list of the database entry. """ def __init__(self, session, database_entry, tag): self.session = session self.database_entry = database_entry self.tag = tag def __call__(self): try: self.database_entry.tags.remove(self.tag) except ValueError: # tag not saved in entry raise NonRemovableTagError(self.database_entry, self.tag) else: if not self.tag.data: # remove the tag from the database as well if it was the last tag # assigned to an entry try: RemoveEntry(self.session, self.tag)() except NoSuchEntryError: # entry cannot be removed because tag is only connected to # entries which are not saved in the database # -> can be safely ignored pass def undo(self): try: self.database_entry.tags.append(self.tag) except InvalidRequestError: # self.tag cannot be added because it was just removed # -> put it back to transient state try: make_transient(self.tag) self.database_entry.tags.append(self.tag) except InvalidRequestError: # self.database_entry has been removed # -> put it back to transient state make_transient(self.database_entry) self.database_entry.tags.append(self.tag) def __repr__(self): return "".format( self.tag, self.session, self.database_entry.id) class CommandManager(object): """The CommandManager saves all executed and reverted commands to act as an undo-redo-manager. All executed commands are saved in the list attribute ``undo_commands`` and all undone commands are saved in the list attribute ``redo_commands``. It is not recommended to alter these stacks directly; instead, use the methods ``push_undo_command``, ``pop_undo_command``, ``push_redo_command``, and ``pop_redo_command``, respectively. """ def __init__(self): self.undo_commands = [] self.redo_commands = [] def clear_histories(self): """Clears all entries from the undo and redo history. If one or both of the histories are already empty, no exception is raised. """ del self.undo_commands[:] del self.redo_commands[:] def push_undo_command(self, command): """Push the given command to the undo command stack.""" self.undo_commands.append(command) def pop_undo_command(self): """Remove the last command from the undo command stack and return it. If the command stack is empty, :exc:`sunpy.database.commands.EmptyCommandStackError` is raised. """ try: last_undo_command = self.undo_commands.pop() except IndexError: raise EmptyCommandStackError() return last_undo_command def push_redo_command(self, command): """Push the given command to the redo command stack.""" self.redo_commands.append(command) def pop_redo_command(self): """Remove the last command from the redo command stack and return it. If the command stack is empty, :exc:`sunpy.database.commands.EmptyCommandStackError` is raised. """ try: last_redo_command = self.redo_commands.pop() except IndexError: raise EmptyCommandStackError() return last_redo_command def do(self, command): """Execute the given command (a subclass of DatabaseOperation). Exceptions raised from the command are not caught. The passed argument may also be an iterable of commands. In this case, every command of the iterable is executed and only one entry is saved in the undo history. """ command() self.push_undo_command(command) # clear the redo stack when a new command was executed self.redo_commands[:] = [] def undo(self, n=1): """Undo the last n commands. The default is to undo only the last command. If there is no command that can be undone because n is too big or because no command has been executed yet, :exc:`sunpy.database.commands.EmptyCommandStackError` is raised. """ for _ in range(n): command = self.pop_undo_command() command.undo() self.push_redo_command(command) def redo(self, n=1): """Redo the last n commands which have been undone using the undo method. The default is to redo only the last command which has been undone using the undo method. If there is no command that can be redone because n is too big or because no command has been undone yet, :exc:`sunpy.database.commands.EmptyCommandStackError` is raised. """ for _ in range(n): command = self.pop_redo_command() command() self.push_undo_command(command) sunpy-0.8.3/sunpy/database/database.py0000644000175000017500000012621613231613137020144 0ustar nabilnabil00000000000000# Author: Simon Liedtke # # This module was developed with funding provided by # the Google Summer of Code (2013). from __future__ import absolute_import, print_function import itertools import operator from datetime import datetime from contextlib import contextmanager import os.path from sqlalchemy import create_engine, exists from sqlalchemy.orm import sessionmaker, scoped_session from astropy import units import sunpy from sunpy.database import commands, tables from sunpy.database.tables import _create_display_table from sunpy.database.caching import LRUCache from sunpy.database.commands import CompositeOperation from sunpy.database.attrs import walker from sunpy.net.hek2vso import H2VClient from sunpy.net.attr import and_ from sunpy.net.vso import VSOClient from sunpy.extern.six.moves import range from sunpy.util import deprecated __authors__ = ['Simon Liedtke', 'Rajul Srivastava'] __emails__ = [ 'liedtke.simon@googlemail.com', 'rajul09@gmail.com' ] class EntryNotFoundError(Exception): """This exception is raised if a database entry cannot be found by its unique ID. """ def __init__(self, entry_id): self.entry_id = entry_id def __str__(self): # pragma: no cover return 'an entry with the ID {0:d} does not exist'.format( self.entry_id) class EntryAlreadyAddedError(Exception): """This exception is raised if a database entry is attempted to be added to the database although it was already saved in it. """ def __init__(self, database_entry): self.database_entry = database_entry def __str__(self): # pragma: no cover return ( 'the entry {0!r} was already added ' 'to the database'.format(self.database_entry)) class EntryAlreadyStarredError(Exception): """This exception is raised if a database entry is marked as starred using :meth:`Database.star` although it was already starred before this operation. """ def __init__(self, database_entry): self.database_entry = database_entry def __str__(self): # pragma: no cover return ( 'the entry {0!r} is already marked ' 'as starred'.format(self.database_entry)) class EntryAlreadyUnstarredError(Exception): """This exception is raised if the star mark from a database entry is attempted to be removed although the entry is not starred. """ def __init__(self, database_entry): self.database_entry = database_entry def __str__(self): # pragma: no cover return ( 'the entry {0!r} is already not marked ' 'as starred'.format(self.database_entry)) class NoSuchTagError(Exception): """This exception is raised if a tag cannot be found in a database by its name. """ def __init__(self, tag_name): self.tag_name = tag_name def __str__(self): # pragma: no cover return 'the tag {0!r} is not saved in the database'.format( self.tag_name) class TagAlreadyAssignedError(Exception): """This exception is raised if it is attempted to assign a tag to a database entry but the database entry already has this tag assigned. """ def __init__(self, database_entry, tag_name): self.database_entry = database_entry self.tag_name = tag_name def __str__(self): # pragma: no cover errmsg = 'the database entry {0!r} has already assigned the tag {1!r}' return errmsg.format(self.database_entry, self.tag_name) def split_database(source_database, destination_database, *query_string): """ Queries the source database with the query string, and moves the matched entries to the destination database. When this function is called, the `~sunpy.database.Database.undo` feature is disabled for both databases. Parameters ---------- source_database : `~sunpy.database.database.Database` A SunPy `~Database` object. This is the database on which the queries will be made. destination_database : `~sunpy.database.database.Database` A SunPy `~Database` object. This is the database to which the matched entries will be moved. query_string : `list` A variable number of attributes that are chained together via the boolean AND operator. The | operator may be used between attributes to express the boolean OR operator. Examples -------- The function call in the following example moves those entries from database1 to database2 which have `~sunpy.net.vso.attrs.Instrument` = 'AIA' or 'ERNE'. >>> from sunpy.database import Database, split_database >>> from sunpy.database.tables import display_entries >>> from sunpy.net import vso >>> database1 = Database('sqlite:///:memory:') >>> database2 = Database('sqlite:///:memory:') >>> client = vso.VSOClient() # doctest: +REMOTE_DATA >>> qr = client.search(vso.attrs.Time('2011-05-08', '2011-05-08 00:00:05')) # doctest: +REMOTE_DATA >>> database1.add_from_vso_query_result(qr) # doctest: +REMOTE_DATA >>> database1, database2 = split_database(database1, database2, ... vso.attrs.Instrument('AIA') | vso.attrs.Instrument('ERNE')) # doctest: +REMOTE_DATA """ query_string = and_(*query_string) filtered_entries = source_database.search(query_string) with disable_undo(source_database): with disable_undo(destination_database): source_database.remove_many(filtered_entries) source_database.commit() source_database.session.commit() source_database.session.close() destination_database.add_many(filtered_entries) destination_database.commit() return source_database, destination_database @contextmanager def disable_undo(database): """A context manager to disable saving the used commands in the undo history. This may be useful when it's important to save memory because a big number of entries in the undo history may occupy a lot of memory space. Examples -------- >>> from sunpy.database import disable_undo, Database >>> from sunpy.database.tables import DatabaseEntry >>> database = Database('sqlite:///:memory:') >>> entry = DatabaseEntry() >>> with disable_undo(database) as db: ... db.add(entry) # This will raise an EmptyCommandStackError >>> database.undo() # doctest: +SKIP """ database._enable_history = False yield database database._enable_history = True class Database(object): """ Database(url[, CacheClass[, cache_size[, default_waveunit]]]) Parameters ---------- url : str A URL describing the database. This value is simply passed to :func:`sqlalchemy.create_engine` If not specified the value will be read from the sunpy config file. CacheClass : sunpy.database.caching.BaseCache A concrete cache implementation of the abstract class BaseCache. Builtin supported values for this parameters are :class:`sunpy.database.caching.LRUCache` and :class:`sunpy.database.caching.LFUCache`. The default value is :class:`sunpy.database.caching.LRUCache`. cache_size : int The maximum number of database entries, default is no limit. default_waveunit : `str` or `~astropy.units.Unit`, optional The wavelength unit that will be used if an entry is added to the database but its wavelength unit cannot be found (either in the file or the VSO query result block, depending on the way the entry was added). If an `~astropy.units.Unit` is passed, it is assigned to ``default_waveunit``. If a `str` is passed, it will be converted to `~astropy.units.Unit` through the `astropy.units.Unit()` initializer, and then assigned to default_waveunit. If an invalid string is passed, `~sunpy.database.WaveunitNotConvertibleError` is raised. If `None` (the default), attempting to add an entry without knowing the wavelength unit results in a :exc:`sunpy.database.WaveunitNotFoundError`. """ """ Attributes ---------- session : sqlalchemy.orm.session.Session A SQLAlchemy session object. This may be used for advanced queries and advanced manipulations and should only be used by people who are experienced with SQLAlchemy. cache_size: int The maximum number of database entries. This attribute is read-only. To change this value, use the method :meth:`sunpy.database.Database.set_cache_size`. tags : list of sunpy.database.Tag objects A list of all saved tags in database. This attribute is read-only. default_waveunit : str See "Parameters" section. Methods ------- set_cache_size(cache_size) Set a new value for the maximum number of database entries in the cache. Use the value ``float('inf')`` to disable caching. commit() Flush pending changes and commit the current transaction. get_entry_by_id(id) Get the database entry which has the given unique ID number assigned. get_tag(tagname) Get the tag which has the given unique tagname assigned. Returns None if no tag with the given name is saved in the database. tag(entry, *tags) Assign the given database entry the given tags. If no tags are given, TypeError is raised. star(entry, ignore_already_starred=False) Mark the given database entry as starred. If ``ignore_already_starred`` is False and the given entry is already marked as starred, EntryAlreadyStarredError is raised. unstar(entry, ignore_already_unstarred=False) Remove the starred mark of the given entry. If ``ignore_already_unstarred`` is False and the entry is not marked as starred, EntryAlreadyUnstarredError is raised. add(entry, ignore_already_added=False) Add the given database entry to the database. If ``ignore_already_added`` is False and the given entry is already saved in the database, EntryAlreadyAddedError is raised. edit(entry, **kwargs) Change the given database entry so that it interprets the passed key-value pairs as new values where the keys represent the attributes of this entry. If no keywords arguments are given, :exc:`ValueError` is raised. remove(entry) Remove the given entry from the database. undo(n=1) Redo the last n operations. redo(n=1) Redo the last n undone operations. __contains__(entry) Return True if the given database entry is saved in the database, False otherwise. __iter__() Return an iterator over all database entries. __len__() Get the number of database entries. """ def __init__(self, url=None, CacheClass=LRUCache, cache_size=float('inf'), default_waveunit=None): if url is None: url = sunpy.config.get('database', 'url') self._engine = create_engine(url) self._session_cls = sessionmaker(bind=self._engine) self.session = scoped_session(self._session_cls) self._command_manager = commands.CommandManager() self.default_waveunit = default_waveunit if self.default_waveunit is not None: try: self.default_waveunit = units.Unit(default_waveunit) except ValueError: raise tables.WaveunitNotConvertibleError(default_waveunit) self._enable_history = True class Cache(CacheClass): def callback(this, entry_id, database_entry): self.remove(database_entry) def append(this, value): try: this[max(this or [0]) + 1] = value except TypeError: this[1] = value self._create_tables() self._cache = Cache(cache_size) for entry in self: self._cache[entry.id] = entry @property def url(self): """The sqlalchemy url of the database instance""" return str(self._engine.url) @property def cache_size(self): return len(self._cache) @property def cache_maxsize(self): return self._cache.maxsize def set_cache_size(self, cache_size): """Set a new value for the maximum number of database entries in the cache. Use the value ``float('inf')`` to disable caching. If the new cache is smaller than the previous one and cannot contain all the entries anymore, entries are removed from the cache until the number of entries equals the cache size. Which entries are removed depends on the implementation of the cache (e.g. :class:`sunpy.database.caching.LRUCache`, :class:`sunpy.database.caching.LFUCache`). """ cmds = CompositeOperation() # remove items from the cache if the given argument is lower than the # current cache size while cache_size < self.cache_size: # remove items from the cache until cache_size == maxsize of the # cache entry_id, entry = self._cache.to_be_removed cmd = commands.RemoveEntry(self.session, entry) if self._enable_history: cmds.add(cmd) else: cmd() del self._cache[entry_id] self._cache.maxsize = cache_size if cmds: self._command_manager.do(cmds) def _create_tables(self, checkfirst=True): """Initialise the database by creating all necessary tables. If ``checkfirst`` is True, already existing tables are not attempted to be created. """ metadata = tables.Base.metadata metadata.create_all(self._engine, checkfirst=checkfirst) def commit(self): """Flush pending changes and commit the current transaction. This is a shortcut for :meth:`session.commit()`. """ self.session.commit() def _download_and_collect_entries(self, query_result, **kwargs): client = kwargs.pop('client', None) path = kwargs.pop('path', None) progress = kwargs.pop('progress', False) methods = kwargs.pop('methods', ('URL-FILE_Rice', 'URL-FILE')) overwrite = kwargs.pop('overwrite', False) if kwargs: k, v = kwargs.popitem() raise TypeError('unexpected keyword argument {0!r}'.format(k)) if client is None: client = VSOClient() remove_list = [] delete_entries = [] for qr in query_result: temp = tables.DatabaseEntry._from_query_result_block(qr) for database_entry in self: if database_entry.path is not None and temp._compare_attributes( database_entry, ["source", "provider", "physobs", "fileid", "observation_time_start", "observation_time_end", "instrument", "size", "wavemin", "wavemax"]): if not overwrite: remove_list.append(qr) else: delete_entries.append(database_entry) for temp in remove_list: query_result = [x for x in query_result if x != temp] for temp in delete_entries: self.remove(temp) paths = client.fetch(query_result, path).wait(progress=progress) for (path, block) in zip(paths, query_result): qr_entry = tables.DatabaseEntry._from_query_result_block(block) if os.path.isfile(path): entries = tables.entries_from_file(path, self.default_waveunit) elif os.path.isdir(path): entries = tables.entries_from_dir(path, self.default_waveunit) else: raise ValueError('The path is neither a file nor directory') for entry in entries: entry.source = qr_entry.source entry.provider = qr_entry.provider entry.physobs = qr_entry.physobs entry.fileid = qr_entry.fileid entry.observation_time_start = qr_entry.observation_time_start entry.observation_time_end = qr_entry.observation_time_end entry.instrument = qr_entry.instrument entry.size = qr_entry.size entry.wavemin = qr_entry.wavemin entry.wavemax = qr_entry.wavemax entry.path = path entry.download_time = datetime.utcnow() yield entry @deprecated('0.8', alternative='database.fetch()') def download(self, *query, **kwargs): """ See `~sunpy.database.Database.fetch` """ return self.fetch(*query, **kwargs) def fetch(self, *query, **kwargs): """ fetch(*query[, path, overwrite, client, progress, methods]) Check if the query has already been used to collect new data. If yes, query the database using the method :meth:`sunpy.database.Database.search` and return the result. Otherwise, the retrieved search result is used to download all files that belong to this search result. After that, all the gathered information (the one from the query result and the one from the downloaded files) is added to the database in a way that each header is represented by one database entry. It uses the :meth:`sunpy.database.Database._download_and_collect_entries` method to download files, which uses query result block level caching. This means that files will not be downloaded for any query result block that had its files downloaded previously. If files for Query A were already downloaded, and then Query B is made which has some result blocks common with Query A, then files for these common blocks will not be downloaded again. Files will only be downloaded for those blocks which are new or haven't had their files downloaded yet. If querying results in no data, no operation is performed. Concrete, this means that no entry is added to the database and no file is downloaded. Parameters ---------- query : `list` A variable number of attributes that are chained together via the boolean AND operator. The | operator may be used between attributes to express the boolean OR operator. path : `str`, optional The directory into which files will be downloaded. overwrite : `bool`, optional If True, matching database entries from the query results will be deleted and replaced with new database entries, with all files getting downloaded. Otherwise, no new file download and update of matching database entries takes place. client : `sunpy.net.vso.VSOClient`, optional VSO Client instance to use for search and download. If not specified a new instance will be created. progress : `bool`, optional If True, displays the progress bar during file download. methods : `str` or iterable of `str`, optional Set VSOClient download method, see`~sunpy.net.vso.VSOClient.get` for details. Examples -------- The `~sunpy.Database.fetch` method can be used along with the `overwrite=True` argument to overwrite and redownload files corresponding to the query, even if its entries are already present in the database. Note that the `overwrite=True` argument deletes the old matching database entries and new database entries are added with information from the redownloaded files. >>> from sunpy.database import Database >>> from sunpy.database.tables import display_entries >>> from sunpy.net import vso >>> database = Database('sqlite:///:memory:') >>> database.fetch(vso.attrs.Time('2012-08-05', '2012-08-05 00:00:05'), ... vso.attrs.Instrument('AIA')) # doctest: +REMOTE_DATA >>> print(display_entries(database, ... ['id', 'observation_time_start', 'observation_time_end', ... 'instrument', 'wavemin', 'wavemax'])) # doctest: +REMOTE_DATA id observation_time_start observation_time_end instrument wavemin wavemax --- ---------------------- -------------------- ---------- ------- ------- 1 2012-08-05 00:00:01 2012-08-05 00:00:02 AIA 9.4 9.4 2 2012-08-05 00:00:01 2012-08-05 00:00:02 AIA 9.4 9.4 3 2012-08-05 00:00:02 2012-08-05 00:00:03 AIA 33.5 33.5 4 2012-08-05 00:00:02 2012-08-05 00:00:03 AIA 33.5 33.5 >>> database.fetch(vso.attrs.Time('2012-08-05', '2012-08-05 00:00:01'), ... vso.attrs.Instrument('AIA'), overwrite=True) # doctest: +REMOTE_DATA >>> print(display_entries(database, ... ['id', 'observation_time_start', 'observation_time_end', ... 'instrument', 'wavemin', 'wavemax'])) # doctest: +REMOTE_DATA id observation_time_start observation_time_end instrument wavemin wavemax --- ---------------------- -------------------- ---------- ------- ------- 3 2012-08-05 00:00:02 2012-08-05 00:00:03 AIA 33.5 33.5 4 2012-08-05 00:00:02 2012-08-05 00:00:03 AIA 33.5 33.5 5 2012-08-05 00:00:01 2012-08-05 00:00:02 AIA 9.4 9.4 6 2012-08-05 00:00:01 2012-08-05 00:00:02 AIA 9.4 9.4 Here the first 2 entries (IDs 1 and 2) were overwritten and its files were redownloaded, resulting in the entries with IDs 5 and 6. """ if not query: raise TypeError('at least one attribute required') client = kwargs.get('client', None) if client is None: client = VSOClient() qr = client.search(*query) # don't do anything if querying results in no data if not qr: return entries = list(self._download_and_collect_entries( qr, **kwargs)) self.add_many(entries) def search(self, *query, **kwargs): """ search(*query[, sortby]) Send the given query to the database and return a list of database entries that satisfy all of the given attributes. Apart from the attributes supported by the VSO interface, the following attributes are supported: - :class:`sunpy.database.attrs.Starred` - :class:`sunpy.database.attrs.Tag` - :class:`sunpy.database.attrs.Path` - :class:`sunpy.database.attrs.DownloadTime` - :class:`sunpy.database.attrs.FitsHeaderEntry` An important difference to the VSO attributes is that these attributes may also be used in negated form using the tilde ~ operator. Parameters ---------- query : `list` A variable number of attributes that are chained together via the boolean AND operator. The | operator may be used between attributes to express the boolean OR operator. sortby : `str`, optional The column by which to sort the returned entries. The default is to sort by the start of the observation. See the attributes of :class:`sunpy.database.tables.DatabaseEntry` for a list of all possible values. Raises ------ TypeError if no attribute is given or if some keyword argument other than 'sortby' is given. Examples -------- The query in the following example searches for all non-starred entries with the tag 'foo' or 'bar' (or both). >>> database.search(~attrs.Starred(), attrs.Tag('foo') | attrs.Tag('bar')) # doctest: +SKIP """ if not query: raise TypeError('at least one attribute required') sortby = kwargs.pop('sortby', 'observation_time_start') if kwargs: k, v = kwargs.popitem() raise TypeError('unexpected keyword argument {0!r}'.format(k)) db_entries = walker.create(and_(*query), self.session) # If any of the DatabaseEntry-s lack the sorting attribute, the # sorting key should fall back to 'id', orherwise it fails with # TypeError on py3 if any([getattr(entry, sortby) is None for entry in db_entries]): sortby = 'id' return sorted(db_entries, key=operator.attrgetter(sortby)) @deprecated('0.8', alternative='database.search') def query(self, *query, **kwargs): """ See `~sunpy.database.Database.search` """ return self.search(*query, **kwargs) def get_entry_by_id(self, entry_id): """Get a database entry by its unique ID number. If an entry with the given ID does not exist, :exc:`sunpy.database.EntryNotFoundError` is raised. """ try: return self._cache[entry_id] except KeyError: raise EntryNotFoundError(entry_id) @property def tags(self): return self.session.query(tables.Tag).all() def get_tag(self, tag_name): """Get the tag which has the given name. If no such tag exists, :exc:`sunpy.database.NoSuchTagError` is raised. """ for tag in self.tags: if tag_name == tag.name: return tag raise NoSuchTagError(tag_name) def tag(self, database_entry, *tags): """Assign the given database entry the given tags. Raises ------ TypeError If no tags are given. sunpy.database.TagAlreadyAssignedError If at least one of the given tags is already assigned to the given database entry. """ if not tags: raise TypeError('at least one tag must be given') # avoid duplicates tag_names = set(tags) cmds = CompositeOperation() for tag_name in tag_names: try: tag = self.get_tag(tag_name) if tag in database_entry.tags: raise TagAlreadyAssignedError(database_entry, tag_names) except NoSuchTagError: # tag does not exist yet -> create it tag = tables.Tag(tag_name) cmd = commands.AddTag(self.session, database_entry, tag) if self._enable_history: cmds.add(cmd) else: cmd() if cmds: self._command_manager.do(cmds) def remove_tag(self, database_entry, tag_name): """Remove the given tag from the database entry. If the tag is not connected to any entry after this operation, the tag itself is removed from the database as well. Raises ------ sunpy.database.NoSuchTagError If the tag is not connected to the given entry. """ tag = self.get_tag(tag_name) cmds = CompositeOperation() remove_tag_cmd = commands.RemoveTag(self.session, database_entry, tag) remove_tag_cmd() if self._enable_history: cmds.add(remove_tag_cmd) if not tag.data: remove_entry_cmd = commands.RemoveEntry(self.session, tag) remove_entry_cmd() if self._enable_history: cmds.add(remove_entry_cmd) if self._enable_history: self._command_manager.push_undo_command(cmds) def star(self, database_entry, ignore_already_starred=False): """Mark the given database entry as starred. If this entry is already marked as starred, the behaviour depends on the optional argument ``ignore_already_starred``: if it is ``False`` (the default), :exc:`sunpy.database.EntryAlreadyStarredError` is raised. Otherwise, the entry is kept as starred and no exception is raised. """ if database_entry.starred and not ignore_already_starred: raise EntryAlreadyStarredError(database_entry) self.edit(database_entry, starred=True) def unstar(self, database_entry, ignore_already_unstarred=False): """Remove the starred mark of the given entry. If this entry is not marked as starred, the behaviour depends on the optional argument ``ignore_already_unstarred``: if it is ``False`` (the default), :exc:`sunpy.database.EntryAlreadyUnstarredError` is raised. Otherwise, the entry is kept as unstarred and no exception is raised. """ if not database_entry.starred and not ignore_already_unstarred: raise EntryAlreadyUnstarredError(database_entry) self.edit(database_entry, starred=False) def add_many(self, database_entries, ignore_already_added=False): """Add a row of database entries "at once". If this method is used, only one entry is saved in the undo history. Parameters ---------- database_entries : iterable of sunpy.database.tables.DatabaseEntry The database entries that will be added to the database. ignore_already_added : bool, optional See Database.add """ cmds = CompositeOperation() for database_entry in database_entries: # use list(self) instead of simply self because __contains__ checks # for existence in the database and not only all attributes except # ID. if database_entry in list(self) and not ignore_already_added: raise EntryAlreadyAddedError(database_entry) cmd = commands.AddEntry(self.session, database_entry) if self._enable_history: cmds.add(cmd) else: cmd() if database_entry.id is None: self._cache.append(database_entry) else: self._cache[database_entry.id] = database_entry if cmds: self._command_manager.do(cmds) def add(self, database_entry, ignore_already_added=False): """Add the given database entry to the database table. Parameters ---------- database_entry : sunpy.database.tables.DatabaseEntry The database entry that will be added to this database. ignore_already_added : bool, optional If True, attempts to add an already existing database entry will result in a :exc:`sunpy.database.EntryAlreadyAddedError`. Otherwise, a new entry will be added and there will be duplicates in the database. """ if database_entry in self and not ignore_already_added: raise EntryAlreadyAddedError(database_entry) add_entry_cmd = commands.AddEntry(self.session, database_entry) if self._enable_history: self._command_manager.do(add_entry_cmd) else: add_entry_cmd() if database_entry.id is None: self._cache.append(database_entry) else: self._cache[database_entry.id] = database_entry def add_from_hek_query_result(self, query_result, ignore_already_added=False): """Add database entries from a HEK query result. Parameters ---------- query_result : list The value returned by :meth:`sunpy.net.hek.HEKClient().search` ignore_already_added : bool See :meth:`sunpy.database.Database.add`. """ vso_qr = itertools.chain.from_iterable( H2VClient().translate_and_query(query_result)) self.add_from_vso_query_result(vso_qr, ignore_already_added) def download_from_vso_query_result(self, query_result, client=None, path=None, progress=False, ignore_already_added=False, overwrite=False): """download(query_result, client=sunpy.net.vso.VSOClient(), path=None, progress=False, ignore_already_added=False) Add new database entries from a VSO query result and download the corresponding data files. See :meth:`sunpy.database.Database.download` for information about the caching mechanism used and about the parameters `client`, `path`, `progress`. Parameters ---------- query_result : sunpy.net.vso.QueryResponse A VSO query response that was returned by the ``query`` method of a :class:`sunpy.net.vso.VSOClient` object. ignore_already_added : bool See :meth:`sunpy.database.Database.add`. """ if not query_result: return self.add_many(self._download_and_collect_entries( query_result, client=client, path=path, progress=progress, overwrite=overwrite)) def add_from_vso_query_result(self, query_result, ignore_already_added=False): """Generate database entries from a VSO query result and add all the generated entries to this database. Parameters ---------- query_result : sunpy.net.vso.QueryResponse A VSO query response that was returned by the ``query`` method of a :class:`sunpy.net.vso.VSOClient` object. ignore_already_added : bool See :meth:`sunpy.database.Database.add`. """ self.add_many( tables.entries_from_query_result( query_result, self.default_waveunit), ignore_already_added) def add_from_fido_search_result(self, search_result, ignore_already_added=False): """ Generate database entries from a Fido search result and add all the generated entries to this database. Parameters ---------- search_result : `sunpy.net.fido_factory.UnifiedResponse` A UnifiedResponse object that is used to store responses from the unified downloader. This is returned by the ``search`` method of a :class:`sunpy.net.fido_factory.UnifiedDownloaderFactory` object. ignore_already_added : `bool` See :meth:`sunpy.database.Database.add`. """ self.add_many(tables.entries_from_fido_search_result(search_result, self.default_waveunit), ignore_already_added) def add_from_dir(self, path, recursive=False, pattern='*', ignore_already_added=False, time_string_parse_format=None): """Search the given directory for FITS files and use their FITS headers to add new entries to the database. Note that one entry in the database is assigned to a list of FITS headers, so not the number of FITS headers but the number of FITS files which have been read determine the number of database entries that will be added. FITS files are detected by reading the content of each file, the `pattern` argument may be used to avoid reading entire directories if one knows that all FITS files have the same filename extension. Parameters ---------- path : string The directory where to look for FITS files. recursive : bool, optional If True, the given directory will be searched recursively. Otherwise, only the given directory and no subdirectories are searched. The default is `False`, i.e. the given directory is not searched recursively. pattern : string, optional The pattern can be used to filter the list of filenames before the files are attempted to be read. The default is to collect all files. This value is passed to the function :func:`fnmatch.filter`, see its documentation for more information on the supported syntax. ignore_already_added : bool, optional See :meth:`sunpy.database.Database.add`. time_string_parse_format : str, optional Fallback timestamp format which will be passed to `~datetime.datetime.strftime` if `sunpy.time.parse_time` is unable to automatically read the `date-obs` metadata. """ cmds = CompositeOperation() entries = tables.entries_from_dir( path, recursive, pattern, self.default_waveunit, time_string_parse_format=time_string_parse_format) for database_entry, filepath in entries: if database_entry in list(self) and not ignore_already_added: raise EntryAlreadyAddedError(database_entry) cmd = commands.AddEntry(self.session, database_entry) if self._enable_history: cmds.add(cmd) else: cmd() self._cache.append(database_entry) if cmds: self._command_manager.do(cmds) def add_from_file(self, file, ignore_already_added=False): """Generate as many database entries as there are FITS headers in the given file and add them to the database. Parameters ---------- file : str or file-like object Either a path pointing to a FITS file or a an opened file-like object. If an opened file object, its mode must be one of the following rb, rb+, or ab+. ignore_already_added : bool, optional See :meth:`sunpy.database.Database.add`. """ self.add_many( tables.entries_from_file(file, self.default_waveunit), ignore_already_added) def edit(self, database_entry, **kwargs): """Change the given database entry so that it interprets the passed key-value pairs as new values where the keys represent the attributes of this entry. If no keywords arguments are given, :exc:`ValueError` is raised. """ cmd = commands.EditEntry(database_entry, **kwargs) if self._enable_history: self._command_manager.do(cmd) else: cmd() self._cache[database_entry.id] = database_entry def remove_many(self, database_entries): """Remove a row of database entries "at once". If this method is used, only one entry is saved in the undo history. Parameters ---------- database_entries : iterable of sunpy.database.tables.DatabaseEntry The database entries that will be removed from the database. """ cmds = CompositeOperation() for database_entry in database_entries: cmd = commands.RemoveEntry(self.session, database_entry) if self._enable_history: cmds.add(cmd) else: cmd() try: del self._cache[database_entry.id] except KeyError: pass if cmds: self._command_manager.do(cmds) def remove(self, database_entry): """Remove the given database entry from the database table.""" remove_entry_cmd = commands.RemoveEntry(self.session, database_entry) if self._enable_history: self._command_manager.do(remove_entry_cmd) else: remove_entry_cmd() try: del self._cache[database_entry.id] except KeyError: # entry cannot be removed because it was already removed or never # existed in the database. This can be safely ignored, the user # doesn't even know there's a cache here pass def clear(self): """Remove all entries from the database. This operation can be undone using the :meth:`undo` method. """ cmds = CompositeOperation() for entry in self: for tag in entry.tags: cmds.add(commands.RemoveTag(self.session, entry, tag)) # TODO: also remove all FITS header entries and all FITS header # comments from each entry before removing the entry itself! # remove all entries from all helper tables database_tables = [ tables.JSONDump, tables.Tag, tables.FitsHeaderEntry, tables.FitsKeyComment] for table in database_tables: for entry in self.session.query(table): cmds.add(commands.RemoveEntry(self.session, entry)) for entry in self: cmds.add(commands.RemoveEntry(self.session, entry)) del self._cache[entry.id] if self._enable_history: self._command_manager.do(cmds) else: cmds() def clear_histories(self): """Clears all entries from the undo and redo history. See Also -------- :meth:`sunpy.database.commands.CommandManager.clear_histories` """ self._command_manager.clear_histories() # pragma: no cover def undo(self, n=1): """undo the last n commands. See Also -------- :meth:`sunpy.database.commands.CommandManager.undo` """ self._command_manager.undo(n) # pragma: no cover def redo(self, n=1): """redo the last n commands. See Also -------- :meth:`sunpy.database.commands.CommandManager.redo` """ self._command_manager.redo(n) # pragma: no cover def display_entries(self, columns=None, sort=False): print(_create_display_table(self, columns, sort)) def show_in_browser(self, columns=None, sort=False, jsviewer=True): _create_display_table(self, columns, sort).show_in_browser(jsviewer) def __getitem__(self, key): if isinstance(key, slice): entries = [] start = 0 if key.start is None else key.start stop = len(self) if key.stop is None else key.stop step = 1 if key.step is None else key.step for i in range(start, stop, step): try: entry = self[i] except IndexError: break else: self._cache[entry.id] entries.append(entry) return entries # support negative indices if key < 0 < abs(key) <= len(self): key %= len(self) for i, entry in enumerate(self): if i == key: # "touch" the entry in the cache to intentionally cause # possible side-effects self._cache[entry.id] return entry raise IndexError def __contains__(self, database_entry): """Return True if the given database_entry entry is saved in the database, False otherwise. """ (ret,), = self.session.query( exists().where(tables.DatabaseEntry.id == database_entry.id)) return ret def __iter__(self): """iterate over all database entries that have been saved.""" return iter(self.session.query(tables.DatabaseEntry)) def __len__(self): """Get the number of rows in the table.""" return self.session.query(tables.DatabaseEntry).count() def __repr__(self): return _create_display_table(self).__repr__() def __str__(self): return _create_display_table(self).__str__() def _repr_html_(self): return _create_display_table(self)._repr_html_() sunpy-0.8.3/sunpy/database/setup_package.py0000644000175000001440000000015513203275053020172 0ustar nabil00000000000000def get_package_data(): return { _ASTROPY_PACKAGE_NAME_ + '.database.tests': ['test_table.txt']} sunpy-0.8.3/sunpy/database/tables.py0000644000175000017500000007707513231613137017662 0ustar nabilnabil00000000000000# Author: Simon Liedtke # # This module was developed with funding provided by # the Google Summer of Code (2013). from __future__ import absolute_import, print_function from time import strptime, mktime from datetime import datetime import fnmatch import os from astropy.units import Unit, nm, equivalencies, quantity import astropy.table from sqlalchemy import Column, Integer, Float, String, DateTime, Boolean,\ Table, ForeignKey from sqlalchemy.orm import relationship from sqlalchemy.ext.declarative import declarative_base import numpy as np from sunpy.time import parse_time, TimeRange from sunpy.io import fits, file_tools as sunpy_filetools from sunpy.util import print_table from sunpy.extern.six.moves import map from sunpy.extern import six import sunpy.net from sunpy import config TIME_FORMAT = config.get("general", "time_format") __all__ = [ 'WaveunitNotFoundError', 'WaveunitNotConvertibleError', 'JSONDump', 'FitsHeaderEntry', 'FitsKeyComment', 'Tag', 'DatabaseEntry', 'entries_from_query_result', 'entries_from_file', 'entries_from_dir', 'display_entries'] Base = declarative_base() # required for the many-to-many relation on tags:entries association_table = Table('association', Base.metadata, Column('tag_name', String, ForeignKey('tags.name')), Column('entry_id', Integer, ForeignKey('data.id')) ) class WaveunitNotFoundError(Exception): """This exception is raised if a wavelength unit cannot be found in a FITS header or in a VSO query result block. """ def __init__(self, obj): self.obj = obj def __str__(self): # pragma: no cover return 'the wavelength unit cannot be found in {0}'.format(self.obj) + \ ' and default_waveunit not specified when opening the database' class WaveunitNotConvertibleError(Exception): """This exception is raised if a wavelength cannot be converted to an astropy.units.Unit instance. """ def __init__(self, waveunit): self.waveunit = waveunit def __str__(self): # pragma: no cover return ( 'the waveunit {0!r} cannot be converted to an ' 'astropy.units.Unit instance'.format(self.waveunit)) # TODO: move this function outside this package (sunpy.util? sunpy.time?) def timestamp2datetime(format, string): return datetime.fromtimestamp(mktime(strptime(string, format))) class JSONDump(Base): __tablename__ = 'jsondumps' dump = Column(String, nullable=False, primary_key=True) def __init__(self, dump): self.dump = dump def __eq__(self, other): return self.dump == other.dump def __ne__(self, other): return not (self == other) def __str__(self): return self.dump def __repr__(self): # pragma: no cover return '<{0}(dump {1!r})>'.format(self.__class__.__name__, self.dump) class FitsHeaderEntry(Base): __tablename__ = 'fitsheaderentries' dbentry_id = Column(Integer, ForeignKey('data.id')) id = Column(Integer, primary_key=True) key = Column(String, nullable=False) value = Column(String) def __init__(self, key, value): self.key = key self.value = value def __eq__(self, other): return ( (self.id == other.id or self.id is None or other.id is None) and self.key == other.key and self.value == other.value) def __hash__(self): return super(FitsHeaderEntry, self).__hash__() def __ne__(self, other): return not (self == other) def __repr__(self): # pragma: no cover return '<{0}(id {1}, key {2!r}, value {3!r})>'.format( self.__class__.__name__, self.id, self.key, self.value) class FitsKeyComment(Base): __tablename__ = 'fitskeycomments' dbentry_id = Column(Integer, ForeignKey('data.id')) id = Column(Integer, primary_key=True) key = Column(String, nullable=False) value = Column(String) def __init__(self, key, value): self.key = key self.value = value def __eq__(self, other): return ( (self.id == other.id or self.id is None or other.id is None) and self.key == other.key and self.value == other.value) def __lt__(self, other): return ('{0}, {1}'.format(self.key, self.value) < '{0}, {1}'.format(other.key, other.value)) def __hash__(self): return super(FitsKeyComment, self).__hash__() def __ne__(self, other): return not (self == other) def __repr__(self): # pragma: no cover return '<{0}(id {1}, key {2!r}, value {3!r})>'.format( self.__class__.__name__, self.id, self.key, self.value) class Tag(Base): __tablename__ = 'tags' name = Column(String, nullable=False, primary_key=True) def __init__(self, name): self.name = name def __eq__(self, other): return self.name == other.name def __hash__(self): return super(Tag, self).__hash__() def __ne__(self, other): return not (self == other) def __str__(self): return self.name def __repr__(self): # pragma: no cover return '<{0}(name {1!r})>'.format(self.__class__.__name__, self.name) class DatabaseEntry(Base): """ DatabaseEntry() The class :class:`DatabaseEntry` represents the main table of the database and each instance represents one record that *can* be saved in the database. Parameters ---------- id : int A unique ID number. By default it is None, but automatically set to the maximum number plus one when this entry is added to the database. source : string The source is the name of an observatory or the name of a network of observatories. provider : string The name of the server which provides the retrieved data. physobs : string A physical observable identifier used by VSO. fileid : string The file ID is a string defined by the data provider that should point to a specific data product. The association of fileid to the specific data may change sometime, if the fileid always points to the latest calibrated data. observation_time_start : datetime The date and time when the observation of the data started. observation_time_end : datetime The date and time when the observation of the data ended. instrument : string The instrument which was used to observe the data. size : float The size of the data in kilobytes. wavemin : float The value of the measured wave length. wavemax : float This is the same value as ``wavemin``. The value is stored twice, because each ``suds.sudsobject.QueryResponseBlock`` which is used by the vso package contains both these values. hdu_index : int This value provides a list of all available HDUs and in what files they are located. path : string A local file path where the according FITS file is saved. download_time : datetime The date and time when the files connected to a query have been downloaded. Note: this is not the date and time when this entry has been added to a database! starred : bool Entries can be starred to mark them. By default, this value is False. fits_header_entries : list A list of ``FitsHeaderEntry`` instances. tags : list A list of ``Tag`` instances. Use `sunpy.database.Database.tag` to add a new tag or multiple tags to a specific entry. """ __tablename__ = 'data' # FIXME: primary key is data provider + file ID + download_time! id = Column(Integer, primary_key=True) source = Column(String) provider = Column(String) physobs = Column(String) fileid = Column(String) observation_time_start = Column(DateTime) observation_time_end = Column(DateTime) instrument = Column(String) size = Column(Float) wavemin = Column(Float) wavemax = Column(Float) hdu_index = Column(Integer) path = Column(String) download_time = Column(DateTime) starred = Column(Boolean, default=False) fits_header_entries = relationship('FitsHeaderEntry') fits_key_comments = relationship('FitsKeyComment') tags = relationship('Tag', secondary=association_table, backref='data') @classmethod def _from_query_result_block(cls, qr_block, default_waveunit=None): """Make a new :class:`DatabaseEntry` instance from a VSO query result block. The values of :attr:`wavemin` and :attr:`wavemax` are converted to nm (nanometres). Parameters ---------- qr_block : suds.sudsobject.QueryResponseBlock A query result block is usually not created directly; instead, one gets instances of ``suds.sudsobject.QueryResponseBlock`` by iterating over a VSO query result. default_waveunit : str, optional The wavelength unit that is used if it cannot be found in the `qr_block`. Examples -------- >>> from sunpy.net import vso >>> from sunpy.database.tables import DatabaseEntry >>> client = vso.VSOClient() # doctest: +REMOTE_DATA >>> qr = client.search( ... vso.attrs.Time('2001/1/1', '2001/1/2'), ... vso.attrs.Instrument('eit')) # doctest: +REMOTE_DATA >>> entry = DatabaseEntry._from_query_result_block(qr[0]) # doctest: +REMOTE_DATA >>> entry.source # doctest: +REMOTE_DATA SOHO >>> entry.provider # doctest: +REMOTE_DATA SDAC >>> entry.physobs # doctest: +REMOTE_DATA 'intensity' >>> entry.fileid # doctest: +REMOTE_DATA /archive/soho/private/data/processed/eit/lz/2001/01/efz20010101.000042 >>> entry.observation_time_start, entry.observation_time_end # doctest: +REMOTE_DATA (datetime.datetime(2001, 1, 1, 0, 0, 42), datetime.datetime(2001, 1, 1, 0, 0, 54)) >>> entry.instrument # doctest: +REMOTE_DATA EIT >>> entry.size # doctest: +REMOTE_DATA 2059.0 >>> entry.wavemin, entry.wavemax # doctest: +REMOTE_DATA (19.5, 19.5) """ time_start = timestamp2datetime('%Y%m%d%H%M%S', qr_block.time.start) if not qr_block.time.end: qr_block.time.end = qr_block.time.start time_end = timestamp2datetime('%Y%m%d%H%M%S', qr_block.time.end) wave = qr_block.wave unit = None if wave.waveunit is None: if default_waveunit is not None: unit = Unit(default_waveunit) else: # some query response blocks store the unit "kev", # but AstroPy only understands "keV". See issue #766. waveunit = wave.waveunit if waveunit == "kev": waveunit = "keV" unit = Unit(waveunit) if wave.wavemin is None: wavemin = None else: if unit is None: raise WaveunitNotFoundError(qr_block) wavemin = unit.to(nm, float(wave.wavemin), equivalencies.spectral()) if wave.wavemax is None: wavemax = None else: if unit is None: raise WaveunitNotFoundError(qr_block) wavemax = unit.to(nm, float(wave.wavemax), equivalencies.spectral()) source = getattr(qr_block, 'source', None) provider = getattr(qr_block, 'provider', None) fileid = getattr(qr_block, 'fileid', None) instrument = getattr(qr_block, 'instrument', None) size = getattr(qr_block, 'size', -1) physobs = getattr(qr_block, 'physobs', None) if physobs is not None: physobs = str(physobs) return cls( source=source, provider=provider, physobs=physobs, fileid=fileid, observation_time_start=time_start, observation_time_end=time_end, instrument=instrument, size=size, wavemin=wavemin, wavemax=wavemax) @classmethod def _from_fido_search_result_block(cls, sr_block, default_waveunit=None): """ Make a new :class:`DatabaseEntry` instance from a Fido search result block. Parameters ---------- sr_block : `sunpy.net.dataretriever.client.QueryResponseBlock` A query result block is usually not created directly; instead, one gets instances of ``sunpy.net.dataretriever.client.QueryResponseBlock`` by iterating over each element of a Fido search result. default_waveunit : `str`, optional The wavelength unit that is used if it cannot be found in the `sr_block`. """ # All attributes of DatabaseEntry that are not in QueryResponseBlock # are set as None for now. source = getattr(sr_block, 'source', None) provider = getattr(sr_block, 'provider', None) physobs = getattr(sr_block, 'physobs', None) if physobs is not None: physobs = str(physobs) instrument = getattr(sr_block, 'instrument', None) time_start = sr_block.time.start time_end = sr_block.time.end wavelengths = getattr(sr_block, 'wave', None) wavelength_temp = {} if isinstance(wavelength_temp, tuple): # Tuple of values wavelength_temp['wavemin'] = wavelengths[0] wavelength_temp['wavemax'] = wavelengths[1] else: # Single Value wavelength_temp['wavemin'] = wavelength_temp['wavemax'] = wavelengths final_values = {} for key, val in wavelength_temp.items(): if isinstance(val, quantity.Quantity): unit = getattr(val, 'unit', None) if unit is None: if default_waveunit is not None: unit = Unit(default_waveunit) else: raise WaveunitNotFoundError(sr_block) final_values[key] = unit.to(nm, float(val.value), equivalencies.spectral()) elif val is None or np.isnan(val): final_values[key] = val wavemin = final_values['wavemin'] wavemax = final_values['wavemax'] # sr_block.url of a QueryResponseBlock attribute is stored in fileid fileid = str(sr_block.url) if sr_block.url is not None else None size = None return cls( source=source, provider=provider, physobs=physobs, fileid=fileid, observation_time_start=time_start, observation_time_end=time_end, instrument=instrument, size=size, wavemin=wavemin, wavemax=wavemax) def __eq__(self, other): if self.wavemin is None and other.wavemin is None: wavemins_equal = True elif not all([self.wavemin, other.wavemin]): # This means one is None and the other isnt wavemins_equal = False else: wavemins_equal = np.allclose([self.wavemin], [other.wavemin], equal_nan=True) if self.wavemax is None and other.wavemax is None: wavemaxs_equal = True elif not all([self.wavemax, other.wavemax]): # This means one is None and the other isnt wavemaxs_equal = False else: wavemaxs_equal = np.allclose([self.wavemax], [other.wavemax], equal_nan=True) return ( (self.id == other.id or self.id is None or other.id is None) and self.source == other.source and self.provider == other.provider and self.physobs == other.physobs and self.fileid == other.fileid and self.observation_time_start == other.observation_time_start and self.observation_time_end == other.observation_time_end and self.instrument == other.instrument and self.size == other.size and wavemins_equal and wavemaxs_equal and self.path == other.path and self.download_time == other.download_time and bool(self.starred) == bool(other.starred) and self.fits_header_entries == other.fits_header_entries and self.tags == other.tags) def _compare_attributes(self, other, attribute_list): """ Compare a given list of attributes of two :class:`DatabaseEntry` instances and return True if all of them match. Parameters ---------- other : :class:`DatabaseEntry` instance attribute_list : `list` The list of attributes that will be compared in both instances, self and other. """ if len(attribute_list) == 0: raise TypeError('At least one attribute required') for attribute in attribute_list: if getattr(self, attribute) != getattr(other, attribute): return False return True def __hash__(self): return super(DatabaseEntry, self).__hash__() def __ne__(self, other): # pragma: no cover return not (self == other) def __repr__(self): # pragma: no cover attrs = [ 'id', 'source', 'provider', 'physobs', 'fileid', 'observation_time_start', 'observation_time_end', 'instrument', 'size', 'wavemin', 'wavemax', 'path', 'download_time', 'starred', 'fits_header_entries', 'tags'] ret = '<{0}('.format(self.__class__.__name__) for attr in attrs: value = getattr(self, attr, None) if value: ret += '{0} {1!r}, '.format(attr, value) ret = ret.rstrip(', ') ret += ')>' return ret def entries_from_query_result(qr, default_waveunit=None): """ Use a query response returned from :meth:`sunpy.net.vso.VSOClient.search` or :meth:`sunpy.net.vso.VSOClient.query_legacy` to generate instances of :class:`DatabaseEntry`. Return an iterator over those instances. Parameters ---------- qr : `sunpy.net.vso.QueryResponse` The query response from which to build the database entries. default_waveunit : `str`, optional See :meth:`sunpy.database.DatabaseEntry.from_query_result_block`. Examples -------- >>> from sunpy.net import vso >>> from sunpy.database.tables import entries_from_query_result >>> client = vso.VSOClient() # doctest: +REMOTE_DATA >>> qr = client.search( ... vso.attrs.Time('2001/1/1', '2001/1/2'), ... vso.attrs.Instrument('eit')) # doctest: +REMOTE_DATA >>> entries = entries_from_query_result(qr) # doctest: +REMOTE_DATA >>> entry = next(entries) # doctest: +REMOTE_DATA >>> entry.source # doctest: +REMOTE_DATA SOHO >>> entry.provider # doctest: +REMOTE_DATA SDAC >>> entry.physobs # doctest: +REMOTE_DATA 'intensity' >>> entry.fileid # doctest: +REMOTE_DATA /archive/soho/private/data/processed/eit/lz/2001/01/efz20010101.000042 >>> entry.observation_time_start, entry.observation_time_end # doctest: +REMOTE_DATA (datetime.datetime(2001, 1, 1, 0, 0, 42), datetime.datetime(2001, 1, 1, 0, 0, 54)) >>> entry.instrument # doctest: +REMOTE_DATA EIT >>> entry.size # doctest: +REMOTE_DATA 2059.0 >>> entry.wavemin, entry.wavemax # doctest: +REMOTE_DATA (19.5, 19.5) """ for block in qr: yield DatabaseEntry._from_query_result_block(block, default_waveunit) def entries_from_fido_search_result(sr, default_waveunit=None): """ Use a `sunpy.net.dataretriever.fido_factory.UnifiedResponse` object returned from :meth:`sunpy.net.dataretriever.fido_factory.UnifiedDownloaderFactory.search` to generate instances of :class:`DatabaseEntry`. Return an iterator over those instances. Parameters ---------- search_result : `sunpy.net.dataretriever.fido_factory.UnifiedResponse` A UnifiedResponse object that is used to store responses from the unified downloader. This is returned by the ``search`` method of a :class:`sunpy.net.dataretriever.fido_factory.UnifiedDownloaderFactory` object. default_waveunit : `str`, optional The wavelength unit that is used if it cannot be found in the Query Response block. Examples -------- >>> from sunpy.net import Fido, attrs >>> from sunpy.database.tables import entries_from_fido_search_result >>> sr = Fido.search(attrs.Time("2012/1/1", "2012/1/2"), ... attrs.Instrument('lyra')) >>> entries = entries_from_fido_search_result(sr) >>> entry = next(entries) >>> entry.source 'Proba2' >>> entry.provider 'esa' >>> entry.physobs 'irradiance' >>> entry.fileid 'http://proba2.oma.be/lyra/data/bsd/2012/01/01/lyra_20120101-000000_lev2_std.fits' >>> entry.observation_time_start, entry.observation_time_end (datetime.datetime(2012, 1, 1, 0, 0), datetime.datetime(2012, 1, 2, 0, 0)) >>> entry.instrument 'lyra' """ for entry in sr: if isinstance(entry, sunpy.net.vso.vso.QueryResponse): # This is because Fido can search the VSO. It # returns a VSO QueryResponse. for block in entry: yield DatabaseEntry._from_query_result_block(block, default_waveunit) elif isinstance(entry, sunpy.net.jsoc.jsoc.JSOCResponse): # Adding JSOC results to the DB not supported for now raise ValueError("Cannot add JSOC results to database") else: for block in entry: yield DatabaseEntry._from_fido_search_result_block(block, default_waveunit) def entries_from_file(file, default_waveunit=None, time_string_parse_format=None): """Use the headers of a FITS file to generate an iterator of :class:`sunpy.database.tables.DatabaseEntry` instances. Gathered information will be saved in the attribute `fits_header_entries`. If the key INSTRUME, WAVELNTH or DATE-OBS / DATE_OBS is available, the attribute `instrument`, `wavemin` and `wavemax` or `observation_time_start` is set, respectively. If the wavelength unit can be read, the values of `wavemin` and `wavemax` are converted to nm (nanometres). The value of the `file` parameter is used to set the attribute `path` of each generated database entry. Parameters ---------- file : str or file-like object Either a path pointing to a FITS file or a an opened file-like object. If an opened file object, its mode must be one of the following rb, rb+, or ab+. default_waveunit : str, optional The wavelength unit that is used for a header if it cannot be found. time_string_parse_format : str, optional Fallback timestamp format which will be passed to `~datetime.datetime.strftime` if `sunpy.time.parse_time` is unable to automatically read the `date-obs` metadata. Raises ------ sunpy.database.WaveunitNotFoundError If `default_waveunit` is not given and the wavelength unit cannot be found in one of the FITS headers sunpy.WaveunitNotConvertibleError If a wavelength unit could be found but cannot be used to create an instance of the type ``astropy.units.Unit``. This can be the case for example if a FITS header has the key `WAVEUNIT` with the value `nonsense`. Examples -------- >>> from sunpy.database.tables import entries_from_file >>> import sunpy.data.sample >>> entries = list(entries_from_file(sunpy.data.sample.SWAP_LEVEL1_IMAGE)) >>> len(entries) 1 >>> entry = entries.pop() >>> entry.instrument 'SWAP' >>> entry.observation_time_start, entry.observation_time_end (datetime.datetime(2011, 6, 7, 6, 33, 29, 759000), None) >>> entry.wavemin, entry.wavemax (17.400000000000002, 17.400000000000002) >>> len(entry.fits_header_entries) 111 """ headers = fits.get_header(file) if isinstance(file, (str, six.text_type)): filename = file else: filename = getattr(file, 'name', None) for header in headers: entry = DatabaseEntry(path=filename) for key, value in six.iteritems(header): # Yes, it is possible to have an empty key in a FITS file. # Example: sunpy.data.sample.EIT_195_IMAGE # Don't ask me why this could be a good idea. if key == '': value = str(value) elif key == 'KEYCOMMENTS': for k, v in six.iteritems(value): entry.fits_key_comments.append(FitsKeyComment(k, v)) continue entry.fits_header_entries.append(FitsHeaderEntry(key, value)) waveunit = fits.extract_waveunit(header) entry.hdu_index = headers.index(header) if waveunit is None: waveunit = default_waveunit unit = None if waveunit is not None: try: unit = Unit(waveunit) except ValueError: raise WaveunitNotConvertibleError(waveunit) for header_entry in entry.fits_header_entries: key, value = header_entry.key, header_entry.value if key == 'INSTRUME': entry.instrument = value elif key == 'WAVELNTH': if unit is None: raise WaveunitNotFoundError(file) # use the value of `unit` to convert the wavelength to nm entry.wavemin = entry.wavemax = unit.to( nm, value, equivalencies.spectral()) # NOTE: the key DATE-END or DATE_END is not part of the official # FITS standard, but many FITS files use it in their header elif key in ('DATE-END', 'DATE_END'): entry.observation_time_end = parse_time( value, _time_string_parse_format=time_string_parse_format ) elif key in ('DATE-OBS', 'DATE_OBS'): entry.observation_time_start = parse_time( value, _time_string_parse_format=time_string_parse_format ) yield entry def entries_from_dir(fitsdir, recursive=False, pattern='*', default_waveunit=None, time_string_parse_format=None): """Search the given directory for FITS files and use the corresponding FITS headers to generate instances of :class:`DatabaseEntry`. FITS files are detected by reading the content of each file, the `pattern` argument may be used to avoid reading entire directories if one knows that all FITS files have the same filename extension. Parameters ---------- fitsdir : string The directory where to look for FITS files. recursive : bool, optional If True, the given directory will be searched recursively. Otherwise, only the given directory and no subdirectories are searched. The default is `False`, i.e. the given directory is not searched recursively. pattern : string, optional The pattern can be used to filter the list of filenames before the files are attempted to be read. The default is to collect all files. This value is passed to the function :func:`fnmatch.filter`, see its documentation for more information on the supported syntax. default_waveunit : str, optional See :meth:`sunpy.database.tables.DatabaseEntry.add_fits_header_entries_from_file`. time_string_parse_format : str, optional Fallback timestamp format which will be passed to `~datetime.datetime.strftime` if `sunpy.time.parse_time` is unable to automatically read the `date-obs` metadata. Returns ------- generator of (DatabaseEntry, str) pairs A generator where each item is a tuple consisting of a :class:`DatabaseEntry` instance and the absolute path to the filename which was used to make the database entry. Examples -------- >>> import os >>> from sunpy.data.test import rootdir as fitsdir >>> from sunpy.database.tables import entries_from_dir >>> eitdir = os.path.join(fitsdir, 'EIT') >>> entries = list(entries_from_dir(eitdir, default_waveunit='angstrom')) >>> len(entries) 13 """ for dirpath, dirnames, filenames in os.walk(fitsdir): filename_paths = (os.path.join(dirpath, name) for name in filenames) for path in fnmatch.filter(filename_paths, pattern): try: filetype = sunpy_filetools._detect_filetype(path) except ( sunpy_filetools.UnrecognizedFileTypeError, sunpy_filetools.InvalidJPEG2000FileExtension): continue if filetype == 'fits': for entry in entries_from_file( path, default_waveunit, time_string_parse_format=time_string_parse_format ): yield entry, path if not recursive: break def _create_display_table(database_entries, columns=None, sort=False): """Generate a table to display the database entries. Parameters ---------- database_entries : iterable of :class:`DatabaseEntry` instances The database entries will be the rows in the resulting table. columns : iterable of str The columns that will be displayed in the resulting table. Possible values for the strings are all attributes of :class:`DatabaseEntry`. sort : bool (optional) If True, sorts the entries before displaying them. Returns ------- str An astropy table that can be printed on the console or written to a file. """ if columns is None: columns = ['id', 'observation_time_start', 'observation_time_end', 'instrument', 'source', 'provider', 'physobs', 'wavemin', 'wavemax', 'path', 'fileid', 'tags', 'starred', 'download_time', 'size'] data = [] for entry in database_entries: row = [] for col in columns: if col == 'starred': row.append('Yes' if entry.starred else 'No') elif col == 'tags': row.append(', '.join(map(str, entry.tags)) or 'N/A') elif col == 'hdu_index': row.append(entry.hdu_index) # do not display microseconds in datetime columns elif col in ( 'observation_time_start', 'observation_time_end', 'download_time'): time = getattr(entry, col, None) if time is None: formatted_time = 'N/A' else: formatted_time = time.strftime(TIME_FORMAT) row.append(formatted_time) else: row.append(str(getattr(entry, col) or 'N/A')) if not row: raise TypeError('at least one column must be given') data.append(row) if not data: raise TypeError('given iterable is empty') if sort: data.sort() return astropy.table.Table(rows=data, names=columns) def display_entries(database_entries, columns=None, sort=False): """Print a table to display the database entries. Parameters ---------- database_entries : iterable of :class:`DatabaseEntry` instances The database entries will be the rows in the resulting table. columns : iterable of str The columns that will be displayed in the resulting table. Possible values for the strings are all attributes of :class:`DatabaseEntry`. sort : bool (optional) If True, sorts the entries before displaying them. """ return _create_display_table(database_entries, columns, sort).__str__() sunpy-0.8.3/sunpy/extern/0000755000175000017500000000000013232563477015573 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/extern/bundled/0000755000175000017500000000000013232563477017210 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/extern/bundled/__init__.py0000644000175000001440000000000013203275053020261 0ustar nabil00000000000000sunpy-0.8.3/sunpy/extern/bundled/six.py0000644000175000001440000006437013203275053017351 0ustar nabil00000000000000"""Utilities for writing code that runs on Python 2 and 3""" # Copyright (c) 2010-2014 Benjamin Peterson # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. import functools import operator import sys import types __author__ = "Benjamin Peterson " __version__ = "1.7.3" # Useful for very coarse version differentiation. PY2 = sys.version_info[0] == 2 PY3 = sys.version_info[0] == 3 if PY3: string_types = str, integer_types = int, class_types = type, text_type = str binary_type = bytes MAXSIZE = sys.maxsize else: string_types = basestring, integer_types = (int, long) class_types = (type, types.ClassType) text_type = unicode binary_type = str if sys.platform.startswith("java"): # Jython always uses 32 bits. MAXSIZE = int((1 << 31) - 1) else: # It's possible to have sizeof(long) != sizeof(Py_ssize_t). class X(object): def __len__(self): return 1 << 31 try: len(X()) except OverflowError: # 32-bit MAXSIZE = int((1 << 31) - 1) else: # 64-bit MAXSIZE = int((1 << 63) - 1) del X def _add_doc(func, doc): """Add documentation to a function.""" func.__doc__ = doc def _import_module(name): """Import module, returning the module after the last dot.""" __import__(name) return sys.modules[name] class _LazyDescr(object): def __init__(self, name): self.name = name def __get__(self, obj, tp): result = self._resolve() setattr(obj, self.name, result) # Invokes __set__. # This is a bit ugly, but it avoids running this again. delattr(obj.__class__, self.name) return result class MovedModule(_LazyDescr): def __init__(self, name, old, new=None): super(MovedModule, self).__init__(name) if PY3: if new is None: new = name self.mod = new else: self.mod = old def _resolve(self): return _import_module(self.mod) def __getattr__(self, attr): _module = self._resolve() value = getattr(_module, attr) setattr(self, attr, value) return value class _LazyModule(types.ModuleType): def __init__(self, name): super(_LazyModule, self).__init__(name) self.__doc__ = self.__class__.__doc__ def __dir__(self): attrs = ["__doc__", "__name__"] attrs += [attr.name for attr in self._moved_attributes] return attrs # Subclasses should override this _moved_attributes = [] class MovedAttribute(_LazyDescr): def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): super(MovedAttribute, self).__init__(name) if PY3: if new_mod is None: new_mod = name self.mod = new_mod if new_attr is None: if old_attr is None: new_attr = name else: new_attr = old_attr self.attr = new_attr else: self.mod = old_mod if old_attr is None: old_attr = name self.attr = old_attr def _resolve(self): module = _import_module(self.mod) return getattr(module, self.attr) class _SixMetaPathImporter(object): """ A meta path importer to import six.moves and its submodules. This class implements a PEP302 finder and loader. It should be compatible with Python 2.5 and all existing versions of Python3 """ def __init__(self, six_module_name): self.name = six_module_name self.known_modules = {} def _add_module(self, mod, *fullnames): for fullname in fullnames: self.known_modules[self.name + "." + fullname] = mod def _get_module(self, fullname): return self.known_modules[self.name + "." + fullname] def find_module(self, fullname, path=None): if fullname in self.known_modules: return self return None def __get_module(self, fullname): try: return self.known_modules[fullname] except KeyError: raise ImportError("This loader does not know module " + fullname) def load_module(self, fullname): try: # in case of a reload return sys.modules[fullname] except KeyError: pass mod = self.__get_module(fullname) if isinstance(mod, MovedModule): mod = mod._resolve() else: mod.__loader__ = self sys.modules[fullname] = mod return mod def is_package(self, fullname): """ Return true, if the named module is a package. We need this method to get correct spec objects with Python 3.4 (see PEP451) """ return hasattr(self.__get_module(fullname), "__path__") def get_code(self, fullname): """Return None Required, if is_package is implemented""" self.__get_module(fullname) # eventually raises ImportError return None get_source = get_code # same as get_code _importer = _SixMetaPathImporter(__name__) class _MovedItems(_LazyModule): """Lazy loading of moved objects""" __path__ = [] # mark as package _moved_attributes = [ MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), MovedAttribute("map", "itertools", "builtins", "imap", "map"), MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), MovedAttribute("reload_module", "__builtin__", "imp", "reload"), MovedAttribute("reduce", "__builtin__", "functools"), MovedAttribute("StringIO", "StringIO", "io"), MovedAttribute("UserDict", "UserDict", "collections"), MovedAttribute("UserList", "UserList", "collections"), MovedAttribute("UserString", "UserString", "collections"), MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), MovedModule("builtins", "__builtin__"), MovedModule("configparser", "ConfigParser"), MovedModule("copyreg", "copy_reg"), MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), MovedModule("http_cookies", "Cookie", "http.cookies"), MovedModule("html_entities", "htmlentitydefs", "html.entities"), MovedModule("html_parser", "HTMLParser", "html.parser"), MovedModule("http_client", "httplib", "http.client"), MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), MovedModule("cPickle", "cPickle", "pickle"), MovedModule("queue", "Queue"), MovedModule("reprlib", "repr"), MovedModule("socketserver", "SocketServer"), MovedModule("_thread", "thread", "_thread"), MovedModule("tkinter", "Tkinter"), MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), MovedModule("tkinter_tix", "Tix", "tkinter.tix"), MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), MovedModule("tkinter_colorchooser", "tkColorChooser", "tkinter.colorchooser"), MovedModule("tkinter_commondialog", "tkCommonDialog", "tkinter.commondialog"), MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), MovedModule("tkinter_font", "tkFont", "tkinter.font"), MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", "tkinter.simpledialog"), MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), MovedModule("winreg", "_winreg"), ] for attr in _moved_attributes: setattr(_MovedItems, attr.name, attr) if isinstance(attr, MovedModule): _importer._add_module(attr, "moves." + attr.name) del attr _MovedItems._moved_attributes = _moved_attributes moves = _MovedItems(__name__ + ".moves") _importer._add_module(moves, "moves") class Module_six_moves_urllib_parse(_LazyModule): """Lazy loading of moved objects in six.moves.urllib_parse""" _urllib_parse_moved_attributes = [ MovedAttribute("ParseResult", "urlparse", "urllib.parse"), MovedAttribute("SplitResult", "urlparse", "urllib.parse"), MovedAttribute("parse_qs", "urlparse", "urllib.parse"), MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), MovedAttribute("urldefrag", "urlparse", "urllib.parse"), MovedAttribute("urljoin", "urlparse", "urllib.parse"), MovedAttribute("urlparse", "urlparse", "urllib.parse"), MovedAttribute("urlsplit", "urlparse", "urllib.parse"), MovedAttribute("urlunparse", "urlparse", "urllib.parse"), MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), MovedAttribute("quote", "urllib", "urllib.parse"), MovedAttribute("quote_plus", "urllib", "urllib.parse"), MovedAttribute("unquote", "urllib", "urllib.parse"), MovedAttribute("unquote_plus", "urllib", "urllib.parse"), MovedAttribute("urlencode", "urllib", "urllib.parse"), MovedAttribute("splitquery", "urllib", "urllib.parse"), MovedAttribute("splittag", "urllib", "urllib.parse"), MovedAttribute("splituser", "urllib", "urllib.parse"), ] for attr in _urllib_parse_moved_attributes: setattr(Module_six_moves_urllib_parse, attr.name, attr) del attr Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes _importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), "moves.urllib_parse", "moves.urllib.parse") class Module_six_moves_urllib_error(_LazyModule): """Lazy loading of moved objects in six.moves.urllib_error""" _urllib_error_moved_attributes = [ MovedAttribute("URLError", "urllib2", "urllib.error"), MovedAttribute("HTTPError", "urllib2", "urllib.error"), MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), ] for attr in _urllib_error_moved_attributes: setattr(Module_six_moves_urllib_error, attr.name, attr) del attr Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes _importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), "moves.urllib_error", "moves.urllib.error") class Module_six_moves_urllib_request(_LazyModule): """Lazy loading of moved objects in six.moves.urllib_request""" _urllib_request_moved_attributes = [ MovedAttribute("urlopen", "urllib2", "urllib.request"), MovedAttribute("install_opener", "urllib2", "urllib.request"), MovedAttribute("build_opener", "urllib2", "urllib.request"), MovedAttribute("pathname2url", "urllib", "urllib.request"), MovedAttribute("url2pathname", "urllib", "urllib.request"), MovedAttribute("getproxies", "urllib", "urllib.request"), MovedAttribute("Request", "urllib2", "urllib.request"), MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), MovedAttribute("BaseHandler", "urllib2", "urllib.request"), MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), MovedAttribute("FileHandler", "urllib2", "urllib.request"), MovedAttribute("FTPHandler", "urllib2", "urllib.request"), MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), MovedAttribute("urlretrieve", "urllib", "urllib.request"), MovedAttribute("urlcleanup", "urllib", "urllib.request"), MovedAttribute("URLopener", "urllib", "urllib.request"), MovedAttribute("FancyURLopener", "urllib", "urllib.request"), MovedAttribute("proxy_bypass", "urllib", "urllib.request"), ] for attr in _urllib_request_moved_attributes: setattr(Module_six_moves_urllib_request, attr.name, attr) del attr Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes _importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), "moves.urllib_request", "moves.urllib.request") class Module_six_moves_urllib_response(_LazyModule): """Lazy loading of moved objects in six.moves.urllib_response""" _urllib_response_moved_attributes = [ MovedAttribute("addbase", "urllib", "urllib.response"), MovedAttribute("addclosehook", "urllib", "urllib.response"), MovedAttribute("addinfo", "urllib", "urllib.response"), MovedAttribute("addinfourl", "urllib", "urllib.response"), ] for attr in _urllib_response_moved_attributes: setattr(Module_six_moves_urllib_response, attr.name, attr) del attr Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes _importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), "moves.urllib_response", "moves.urllib.response") class Module_six_moves_urllib_robotparser(_LazyModule): """Lazy loading of moved objects in six.moves.urllib_robotparser""" _urllib_robotparser_moved_attributes = [ MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), ] for attr in _urllib_robotparser_moved_attributes: setattr(Module_six_moves_urllib_robotparser, attr.name, attr) del attr Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes _importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), "moves.urllib_robotparser", "moves.urllib.robotparser") class Module_six_moves_urllib(types.ModuleType): """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" __path__ = [] # mark as package parse = _importer._get_module("moves.urllib_parse") error = _importer._get_module("moves.urllib_error") request = _importer._get_module("moves.urllib_request") response = _importer._get_module("moves.urllib_response") robotparser = _importer._get_module("moves.urllib_robotparser") def __dir__(self): return ['parse', 'error', 'request', 'response', 'robotparser'] _importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), "moves.urllib") def add_move(move): """Add an item to six.moves.""" setattr(_MovedItems, move.name, move) def remove_move(name): """Remove item from six.moves.""" try: delattr(_MovedItems, name) except AttributeError: try: del moves.__dict__[name] except KeyError: raise AttributeError("no such move, %r" % (name,)) if PY3: _meth_func = "__func__" _meth_self = "__self__" _func_closure = "__closure__" _func_code = "__code__" _func_defaults = "__defaults__" _func_globals = "__globals__" else: _meth_func = "im_func" _meth_self = "im_self" _func_closure = "func_closure" _func_code = "func_code" _func_defaults = "func_defaults" _func_globals = "func_globals" try: advance_iterator = next except NameError: def advance_iterator(it): return it.next() next = advance_iterator try: callable = callable except NameError: def callable(obj): return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) if PY3: def get_unbound_function(unbound): return unbound create_bound_method = types.MethodType Iterator = object else: def get_unbound_function(unbound): return unbound.im_func def create_bound_method(func, obj): return types.MethodType(func, obj, obj.__class__) class Iterator(object): def next(self): return type(self).__next__(self) callable = callable _add_doc(get_unbound_function, """Get the function out of a possibly unbound function""") get_method_function = operator.attrgetter(_meth_func) get_method_self = operator.attrgetter(_meth_self) get_function_closure = operator.attrgetter(_func_closure) get_function_code = operator.attrgetter(_func_code) get_function_defaults = operator.attrgetter(_func_defaults) get_function_globals = operator.attrgetter(_func_globals) if PY3: def iterkeys(d, **kw): return iter(d.keys(**kw)) def itervalues(d, **kw): return iter(d.values(**kw)) def iteritems(d, **kw): return iter(d.items(**kw)) def iterlists(d, **kw): return iter(d.lists(**kw)) else: def iterkeys(d, **kw): return iter(d.iterkeys(**kw)) def itervalues(d, **kw): return iter(d.itervalues(**kw)) def iteritems(d, **kw): return iter(d.iteritems(**kw)) def iterlists(d, **kw): return iter(d.iterlists(**kw)) _add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") _add_doc(itervalues, "Return an iterator over the values of a dictionary.") _add_doc(iteritems, "Return an iterator over the (key, value) pairs of a dictionary.") _add_doc(iterlists, "Return an iterator over the (key, [values]) pairs of a dictionary.") if PY3: def b(s): return s.encode("latin-1") def u(s): return s unichr = chr if sys.version_info[1] <= 1: def int2byte(i): return bytes((i,)) else: # This is about 2x faster than the implementation above on 3.2+ int2byte = operator.methodcaller("to_bytes", 1, "big") byte2int = operator.itemgetter(0) indexbytes = operator.getitem iterbytes = iter import io StringIO = io.StringIO BytesIO = io.BytesIO else: def b(s): return s # Workaround for standalone backslash def u(s): return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") unichr = unichr int2byte = chr def byte2int(bs): return ord(bs[0]) def indexbytes(buf, i): return ord(buf[i]) def iterbytes(buf): return (ord(byte) for byte in buf) import StringIO StringIO = BytesIO = StringIO.StringIO _add_doc(b, """Byte literal""") _add_doc(u, """Text literal""") if PY3: exec_ = getattr(moves.builtins, "exec") def reraise(tp, value, tb=None): if value is None: value = tp() if value.__traceback__ is not tb: raise value.with_traceback(tb) raise value else: def exec_(_code_, _globs_=None, _locs_=None): """Execute code in a namespace.""" if _globs_ is None: frame = sys._getframe(1) _globs_ = frame.f_globals if _locs_ is None: _locs_ = frame.f_locals del frame elif _locs_ is None: _locs_ = _globs_ exec("""exec _code_ in _globs_, _locs_""") exec_("""def reraise(tp, value, tb=None): raise tp, value, tb """) print_ = getattr(moves.builtins, "print", None) if print_ is None: def print_(*args, **kwargs): """The new-style print function for Python 2.4 and 2.5.""" fp = kwargs.pop("file", sys.stdout) if fp is None: return def write(data): if not isinstance(data, basestring): data = str(data) # If the file has an encoding, encode unicode with it. if (isinstance(fp, file) and isinstance(data, unicode) and fp.encoding is not None): errors = getattr(fp, "errors", None) if errors is None: errors = "strict" data = data.encode(fp.encoding, errors) fp.write(data) want_unicode = False sep = kwargs.pop("sep", None) if sep is not None: if isinstance(sep, unicode): want_unicode = True elif not isinstance(sep, str): raise TypeError("sep must be None or a string") end = kwargs.pop("end", None) if end is not None: if isinstance(end, unicode): want_unicode = True elif not isinstance(end, str): raise TypeError("end must be None or a string") if kwargs: raise TypeError("invalid keyword arguments to print()") if not want_unicode: for arg in args: if isinstance(arg, unicode): want_unicode = True break if want_unicode: newline = unicode("\n") space = unicode(" ") else: newline = "\n" space = " " if sep is None: sep = space if end is None: end = newline for i, arg in enumerate(args): if i: write(sep) write(arg) write(end) _add_doc(reraise, """Reraise an exception.""") if sys.version_info[0:2] < (3, 4): def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, updated=functools.WRAPPER_UPDATES): def wrapper(f): f = functools.wraps(wrapped)(f) f.__wrapped__ = wrapped return f return wrapper else: wraps = functools.wraps def with_metaclass(meta, *bases): """Create a base class with a metaclass.""" # This requires a bit of explanation: the basic idea is to make a dummy # metaclass for one level of class instantiation that replaces itself with # the actual metaclass. class metaclass(meta): def __new__(cls, name, this_bases, d): return meta(name, bases, d) return type.__new__(metaclass, 'temporary_class', (), {}) def add_metaclass(metaclass): """Class decorator for creating a class with a metaclass.""" def wrapper(cls): orig_vars = cls.__dict__.copy() orig_vars.pop('__dict__', None) orig_vars.pop('__weakref__', None) slots = orig_vars.get('__slots__') if slots is not None: if isinstance(slots, str): slots = [slots] for slots_var in slots: orig_vars.pop(slots_var) return metaclass(cls.__name__, cls.__bases__, orig_vars) return wrapper # Complete the moves implementation. # This code is at the end of this module to speed up module loading. # Turn this module into a package. __path__ = [] # required for PEP 302 and PEP 451 __package__ = __name__ # see PEP 366 @ReservedAssignment if globals().get("__spec__") is not None: __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable # Remove other six meta path importers, since they cause problems. This can # happen if six is removed from sys.modules and then reloaded. (Setuptools does # this for some reason.) if sys.meta_path: for i, importer in enumerate(sys.meta_path): # Here's some real nastiness: Another "instance" of the six module might # be floating around. Therefore, we can't use isinstance() to check for # the six meta path importer, since the other six instance will have # inserted an importer with different class. if (type(importer).__name__ == "_SixMetaPathImporter" and importer.name == __name__): del sys.meta_path[i] break del i, importer # Finally, add the importer to the meta path import hook. sys.meta_path.append(_importer) sunpy-0.8.3/sunpy/extern/__init__.py0000644000175000001440000000033113203275053016653 0ustar nabil00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ This packages contains python packages that are bundled with SunPy but are external to SunPy, and hence are developed in a separate source tree. """ sunpy-0.8.3/sunpy/extern/setup_package.py0000644000175000001440000000040013210261730017717 0ustar nabil00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst from __future__ import absolute_import import os def get_package_data(): paths = [os.path.join('js', '*.js')] return {'sunpy.extern': paths} def requires_2to3(): return False sunpy-0.8.3/sunpy/extern/six.py0000644000175000001440000000324013203275053015721 0ustar nabil00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ Handle loading six package from system or from the bundled copy """ import imp from distutils.version import StrictVersion _SIX_MIN_VERSION = StrictVersion('1.7.3') # Update this to prevent Astropy from using its bundled copy of six # (but only if some other version of at least _SIX_MIN_VERSION can # be provided) _SIX_SEARCH_PATH = ['sunpy.extern.bundled.six', 'six'] def _find_module(name, path=None): """ Alternative to `imp.find_module` that can also search in subpackages. """ parts = name.split('.') for part in parts: if path is not None: path = [path] fh, path, descr = imp.find_module(part, path) return fh, path, descr def _import_six(search_path=_SIX_SEARCH_PATH): for mod_name in search_path: try: mod_info = _find_module(mod_name) except ImportError: continue mod = imp.load_module(__name__, *mod_info) try: if StrictVersion(mod.__version__) >= _SIX_MIN_VERSION: break except (AttributeError, ValueError): # Attribute error if the six module isn't what it should be and # doesn't have a .__version__; ValueError if the version string # exists but is somehow bogus/unparseable continue else: raise ImportError( "SunPy requires the 'six' module of minimum version {0}; " "normally this is bundled with the sunpy package so if you get " "this warning consult the packager of your SunPy " "distribution.".format(_SIX_MIN_VERSION)) _import_six() sunpy-0.8.3/sunpy/image/0000755000175000017500000000000013232563477015350 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/image/tests/0000755000175000017500000000000013232563477016512 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/image/tests/__init__.py0000644000175000001440000000000013203275053017563 0ustar nabil00000000000000sunpy-0.8.3/sunpy/image/tests/test_coalignment.py0000644000175000017500000003514313231613137022415 0ustar nabilnabil00000000000000from __future__ import absolute_import, division, print_function # Author: Jack Ireland, Steven Christe # # Testing functions for a mapcube coalignment functionality. This # functionality relies on the scikit-image function "match_template". # import numpy as np from astropy import units as u from numpy.testing import assert_allclose, assert_array_almost_equal from scipy.ndimage.interpolation import shift as sp_shift from sunpy import map import pytest import os import sunpy.data.test from sunpy.image.coalignment import parabolic_turning_point, \ repair_image_nonfinite, _default_fmap_function, _lower_clip, _upper_clip, \ calculate_clipping, get_correlation_shifts, find_best_match_location, \ match_template_to_layer, clip_edges, \ calculate_match_template_shift, mapcube_coalign_by_match_template,\ apply_shifts from sunpy.extern.six.moves import range @pytest.fixture def aia171_test_clipping(): return np.asarray([0.2, -0.3, -1.0001]) @pytest.fixture def aia171_test_map(): testpath = sunpy.data.test.rootdir return sunpy.map.Map(os.path.join(testpath, 'aia_171_level1.fits')) @pytest.fixture def aia171_test_shift(): return np.array([3, 5]) @pytest.fixture def aia171_test_map_layer(aia171_test_map): return aia171_test_map.data @pytest.fixture def aia171_test_map_layer_shape(aia171_test_map_layer): return aia171_test_map_layer.shape @pytest.fixture def aia171_test_template(aia171_test_shift, aia171_test_map_layer, aia171_test_map_layer_shape): # Test template a1 = aia171_test_shift[0] + aia171_test_map_layer_shape[0] // 4 a2 = aia171_test_shift[0] + 3 * aia171_test_map_layer_shape[0] // 4 b1 = aia171_test_shift[1] + aia171_test_map_layer_shape[1] // 4 b2 = aia171_test_shift[1] + 3 * aia171_test_map_layer_shape[1] // 4 return aia171_test_map_layer[a1: a2, b1:b2] @pytest.fixture def aia171_test_template_shape(aia171_test_template): return aia171_test_template.shape def test_parabolic_turning_point(): assert(parabolic_turning_point(np.asarray([6.0, 2.0, 0.0])) == 1.5) def test_repair_image_nonfinite(): for i in range(0, 9): for non_number in [np.nan, np.inf]: a = np.ones((9)) a[i] = non_number b = a.reshape(3, 3) c = repair_image_nonfinite(b) assert(np.isfinite(c).all()) def test_match_template_to_layer(aia171_test_map_layer, aia171_test_template, aia171_test_map_layer_shape, aia171_test_template_shape): result = match_template_to_layer(aia171_test_map_layer, aia171_test_template) assert_allclose(result.shape[0], aia171_test_map_layer_shape[0] - aia171_test_template_shape[0] + 1, ) assert_allclose(result.shape[1], aia171_test_map_layer_shape[1] - aia171_test_template_shape[1] + 1, ) assert_allclose(np.max(result), 1.00, rtol=1e-2, atol=0) def test_get_correlation_shifts(): # Input array is 3 by 3, the most common case test_array = np.zeros((3, 3)) test_array[1, 1] = 1 test_array[2, 1] = 0.6 test_array[1, 2] = 0.2 y_test, x_test = get_correlation_shifts(test_array) assert_allclose(y_test.value, 0.214285714286, rtol=1e-2, atol=0) assert_allclose(x_test.value, 0.0555555555556, rtol=1e-2, atol=0) # Input array is smaller in one direction than the other. test_array = np.zeros((2, 2)) test_array[0, 0] = 0.1 test_array[0, 1] = 0.2 test_array[1, 0] = 0.4 test_array[1, 1] = 0.3 y_test, x_test = get_correlation_shifts(test_array) assert_allclose(y_test.value, 1.0, rtol=1e-2, atol=0) assert_allclose(x_test.value, 0.0, rtol=1e-2, atol=0) # Input array is too big in either direction test_array = np.zeros((4, 3)) y_test, x_test = get_correlation_shifts(test_array) assert(y_test is None) assert(x_test is None) test_array = np.zeros((3, 4)) y_test, x_test = get_correlation_shifts(test_array) assert(y_test is None) assert(x_test is None) def test_find_best_match_location(aia171_test_map_layer, aia171_test_template, aia171_test_shift): result = match_template_to_layer(aia171_test_map_layer, aia171_test_template) match_location = u.Quantity(find_best_match_location(result)) assert_allclose(match_location.value, np.array(result.shape)/2. - 0.5 + aia171_test_shift, rtol=1e-3, atol=0) def test_lower_clip(aia171_test_clipping): assert(_lower_clip(aia171_test_clipping) == 2.0) # No element is less than zero test_array = np.asarray([1.1, 0.1, 3.0]) assert(_lower_clip(test_array) == 0) def test_upper_clip(aia171_test_clipping): assert(_upper_clip(aia171_test_clipping) == 1.0) # No element is greater than zero test_array = np.asarray([-1.1, -0.1, -3.0]) assert(_upper_clip(test_array) == 0) def test_calculate_clipping(aia171_test_clipping): answer = calculate_clipping(aia171_test_clipping * u.pix, aia171_test_clipping * u.pix) assert_array_almost_equal(answer, ([2.0, 1.0]*u.pix, [2.0, 1.0]*u.pix)) def test_clip_edges(): a = np.zeros(shape=(341, 156)) yclip = [4, 0] * u.pix xclip = [1, 2] * u.pix new_a = clip_edges(a, yclip, xclip) assert(a.shape[0] - (yclip[0].value + yclip[1].value) == new_a.shape[0]) assert(a.shape[1] - (xclip[0].value + xclip[1].value) == new_a.shape[1]) def test__default_fmap_function(): assert(_default_fmap_function([1,2,3]).dtype == np.float64(1).dtype) # # The following tests test functions that have mapcubes as inputs # # Setup the test mapcubes that have displacements # Pixel displacements have the y-displacement as the first entry @pytest.fixture def aia171_test_mc_pixel_displacements(): return np.asarray([1.6, 10.1]) @pytest.fixture def aia171_mc_arcsec_displacements(aia171_test_mc_pixel_displacements, aia171_test_map): return {'x': np.asarray([0.0, aia171_test_mc_pixel_displacements[1] * aia171_test_map.scale[0].value]) * u.arcsec, 'y': np.asarray([0.0, aia171_test_mc_pixel_displacements[0] * aia171_test_map.scale[1].value]) * u.arcsec} @pytest.fixture def aia171_test_mc(aia171_test_map, aia171_test_map_layer, aia171_test_mc_pixel_displacements): # Create a map that has been shifted a known amount. d1 = sp_shift(aia171_test_map_layer, aia171_test_mc_pixel_displacements) m1 = map.Map((d1, aia171_test_map.meta)) # Create the mapcube return map.Map([aia171_test_map, m1], cube=True) def test_calculate_match_template_shift(aia171_test_mc, aia171_mc_arcsec_displacements, aia171_test_map, aia171_test_map_layer, aia171_test_map_layer_shape): # Define these local variables to make the code more readable ny = aia171_test_map_layer_shape[0] nx = aia171_test_map_layer_shape[1] # Test to see if the code can recover the displacements. test_displacements = calculate_match_template_shift(aia171_test_mc) assert_allclose(test_displacements['x'], aia171_mc_arcsec_displacements['x'], rtol=5e-2, atol=0) assert_allclose(test_displacements['y'], aia171_mc_arcsec_displacements['y'], rtol=5e-2, atol=0 ) # Test setting the template as a ndarray template_ndarray = aia171_test_map_layer[ny // 4: 3 * ny // 4, nx // 4: 3 * nx // 4] test_displacements = calculate_match_template_shift(aia171_test_mc, template=template_ndarray) assert_allclose(test_displacements['x'], aia171_mc_arcsec_displacements['x'], rtol=5e-2, atol=0) assert_allclose(test_displacements['y'], aia171_mc_arcsec_displacements['y'], rtol=5e-2, atol=0) # Test setting the template as GenericMap submap = aia171_test_map.submap([nx / 4, ny / 4]*u.pix, [3 * nx / 4, 3 * ny / 4]*u.pix) test_displacements = calculate_match_template_shift(aia171_test_mc, template=submap) assert_allclose(test_displacements['x'], aia171_mc_arcsec_displacements['x'], rtol=5e-2, atol=0) assert_allclose(test_displacements['y'], aia171_mc_arcsec_displacements['y'], rtol=5e-2, atol=0) # Test setting the template as something other than a ndarray and a # GenericMap. This should throw a ValueError. with pytest.raises(ValueError): dummy_return_value = calculate_match_template_shift(aia171_test_mc, template='broken') def test_mapcube_coalign_by_match_template(aia171_test_mc, aia171_test_map_layer_shape): # Define these local variables to make the code more readable ny = aia171_test_map_layer_shape[0] nx = aia171_test_map_layer_shape[1] # Get the calculated test displacements test_displacements = calculate_match_template_shift(aia171_test_mc) # Test passing in displacements test_mc = mapcube_coalign_by_match_template(aia171_test_mc, shift=test_displacements) # Make sure the output is a mapcube assert(isinstance(test_mc, map.MapCube)) # Test returning with no clipping. Output layers should have the same size # as the original input layer. test_mc = mapcube_coalign_by_match_template(aia171_test_mc, clip=False) assert(test_mc[0].data.shape == aia171_test_map_layer_shape) assert(test_mc[1].data.shape == aia171_test_map_layer_shape) # Test the returned mapcube using the default - clipping on. # All output layers should have the same size # which is smaller than the input by a known amount test_mc = mapcube_coalign_by_match_template(aia171_test_mc) x_displacement_pixels = test_displacements['x'] / test_mc[0].scale[0] y_displacement_pixels = test_displacements['y'] / test_mc[0].scale[1] expected_clipping = calculate_clipping(y_displacement_pixels, x_displacement_pixels) number_of_pixels_clipped = [np.sum(np.abs(expected_clipping[0])), np.sum(np.abs(expected_clipping[1]))] assert(test_mc[0].data.shape == (ny - number_of_pixels_clipped[0].value, nx - number_of_pixels_clipped[1].value)) assert(test_mc[1].data.shape == (ny - number_of_pixels_clipped[0].value, nx - number_of_pixels_clipped[1].value)) # Test the returned mapcube explicitly using clip=True. # All output layers should have the same size # which is smaller than the input by a known amount test_mc = mapcube_coalign_by_match_template(aia171_test_mc, clip=True) x_displacement_pixels = test_displacements['x'] / test_mc[0].scale[0] y_displacement_pixels = test_displacements['y'] / test_mc[0].scale[1] expected_clipping = calculate_clipping(y_displacement_pixels, x_displacement_pixels) number_of_pixels_clipped = [np.sum(np.abs(expected_clipping[0])), np.sum(np.abs(expected_clipping[1]))] assert(test_mc[0].data.shape == (ny - number_of_pixels_clipped[0].value, nx - number_of_pixels_clipped[1].value)) assert(test_mc[1].data.shape == (ny - number_of_pixels_clipped[0].value, nx - number_of_pixels_clipped[1].value)) # Test that the reference pixel of each map in the coaligned mapcube is # correct. for im, m in enumerate(aia171_test_mc): for i_s, s in enumerate(['x', 'y']): assert_allclose(aia171_test_mc[im].reference_pixel[i_s] - test_mc[im].reference_pixel[i_s], test_displacements[s][im] / m.scale[i_s], rtol=5e-2, atol=0) def test_apply_shifts(aia171_test_map): # take two copies of the AIA image and create a test mapcube. mc = map.Map([aia171_test_map, aia171_test_map], cube=True) # Pixel displacements have the y-displacement as the first entry numerical_displacements = {"x": np.asarray([0.0, -2.7]), "y": np.asarray([0.0, -10.4])} astropy_displacements = {"x": numerical_displacements["x"] * u.pix, "y": numerical_displacements["y"] * u.pix} # Test to see if the code can detect the fact that the input shifts are not # astropy quantities with pytest.raises(TypeError): tested = apply_shifts(mc, numerical_displacements["y"], astropy_displacements["x"]) with pytest.raises(TypeError): tested = apply_shifts(mc, astropy_displacements["y"], numerical_displacements["x"]) with pytest.raises(TypeError): tested = apply_shifts(mc, numerical_displacements["y"], numerical_displacements["x"]) # Test returning with no extra options - the code returns a mapcube only test_output = apply_shifts(mc, astropy_displacements["y"], astropy_displacements["x"]) assert(isinstance(test_output, map.MapCube)) # Test returning with no clipping. Output layers should have the same size # as the original input layer. test_mc = apply_shifts(mc, astropy_displacements["y"], astropy_displacements["x"], clip=False) assert(test_mc[0].data.shape == aia171_test_map.data.shape) assert(test_mc[1].data.shape == aia171_test_map.data.shape) # Test returning with clipping. Output layers should be smaller than the # original layer by a known amount. test_mc = apply_shifts(mc, astropy_displacements["y"], astropy_displacements["x"], clip=True) for i in range(0, len(test_mc.maps)): clipped = calculate_clipping(astropy_displacements["y"], astropy_displacements["x"]) assert(test_mc[i].data.shape[0] == mc[i].data.shape[0] - np.max(clipped[0].value)) assert(test_mc[i].data.shape[1] == mc[i].data.shape[1] - np.max(clipped[1].value)) # Test returning with default clipping. The default clipping is set to # true, that is the mapcube is clipped. Output layers should be smaller # than the original layer by a known amount. test_mc = apply_shifts(mc, astropy_displacements["y"], astropy_displacements["x"]) for i in range(0, len(test_mc.maps)): clipped = calculate_clipping(astropy_displacements["y"], astropy_displacements["x"]) assert(test_mc[i].data.shape[0] == mc[i].data.shape[0] - np.max(clipped[0].value)) assert(test_mc[i].data.shape[1] == mc[i].data.shape[1] - np.max(clipped[1].value)) # Test that keywords are correctly passed # Test for an individual keyword test_mc = apply_shifts(mc, astropy_displacements["y"], astropy_displacements["x"], clip=False, cval=np.nan) assert(np.all(np.logical_not(np.isfinite(test_mc[1].data[:, -1])))) # Test for a combination of keywords, and that changing the interpolation # order and how the edges are treated changes the results. test_mc1 = apply_shifts(mc, astropy_displacements["y"], astropy_displacements["x"], clip=False, order=2, mode='reflect') test_mc2 = apply_shifts(mc, astropy_displacements["y"], astropy_displacements["x"], clip=False) assert(np.all(test_mc1[1].data[:, -1] != test_mc2[1].data[:, -1])) sunpy-0.8.3/sunpy/image/tests/test_resample.py0000644000175000001440000000631613210261730020706 0ustar nabil00000000000000from __future__ import absolute_import, division, print_function # Author: Tomas Meszaros import astropy.units as u from sunpy.image.rescale import reshape_image_to_4d_superpixel import pytest import os import numpy as np import sunpy.data.test import sunpy.map @pytest.fixture def aia171_test_map(): testpath = sunpy.data.test.rootdir return sunpy.map.Map(os.path.join(testpath, 'aia_171_level1.fits')) @pytest.fixture def shape(aia171_test_map): return np.array(aia171_test_map.data.shape) def resample_meta(dimensions, method, center, minusone): map_resampled = aia171_test_map().resample(dimensions) return tuple(map_resampled.data.shape) def resample_method(method): assert resample_meta((512, 512) * u.pix, method, False, False) == (512, 512) assert resample_meta((2056, 2056) * u.pix, method, False, False) == (2056, 2056) assert resample_meta((512, 512) * u.pix, method, False, True) == (512, 512) assert resample_meta((2056, 2056) * u.pix, method, False, True) == (2056, 2056) assert resample_meta((512, 512) * u.pix, method, True, False) == (512, 512) assert resample_meta((2056, 2056) * u.pix, method, True, False) == (2056, 2056) assert resample_meta((512, 512) * u.pix, method, True, True) == (512, 512) assert resample_meta((2056, 2056) * u.pix, method, True, True) == (2056, 2056) def test_resample_neighbor(): resample_method('neighbor') def test_resample_nearest(): resample_method('nearest') def test_resample_linear(): resample_method('linear') def test_resample_spline(): resample_method('spline') def test_reshape(aia171_test_map, shape): def _n(a, b, c): return int(np.floor((a-b)/c)) # Dimension divides the array shape exactly with no remainder im = reshape_image_to_4d_superpixel(aia171_test_map.data, (2, 2), (0, 0)) assert im.shape == (shape[0]/2, 2, shape[1]/2, 2) # Dimension divides the array shape exactly with remainder im = reshape_image_to_4d_superpixel(aia171_test_map.data, (7, 5), (0, 0)) assert im.shape == (np.int(shape[0]/7), 7, np.int(shape[1]/5), 5) # Dimension divides the array shape exactly with no remainder, and there is # an offset im = reshape_image_to_4d_superpixel(aia171_test_map.data, (2, 2), (1, 1)) assert im.shape == (np.int(shape[0]/2) - 1, 2, np.int(shape[1]/2) - 1, 2) # Dimension divides the array shape exactly with remainder, and there is # an offset d = (9, 7) o = (1, 4) im = reshape_image_to_4d_superpixel(aia171_test_map.data, d, o) assert im.shape == (_n(shape[0], o[0], d[0]), d[0], _n(shape[1], o[1], d[1]), d[1]) im = reshape_image_to_4d_superpixel(aia171_test_map.data, d, o) assert im.shape == (_n(shape[0], o[0], d[0]), d[0], _n(shape[1], o[1], d[1]), d[1]) d = (9, 7) o = (5, 4) im = reshape_image_to_4d_superpixel(aia171_test_map.data, d, o) assert im.shape == (_n(shape[0], o[0], d[0]), d[0], _n(shape[1], o[1], d[1]), d[1]) d = (9, 7) o = (4, 4) im = reshape_image_to_4d_superpixel(aia171_test_map.data, d, o) assert im.shape == (_n(shape[0], o[0], d[0]), d[0], _n(shape[1], o[1], d[1]), d[1]) sunpy-0.8.3/sunpy/image/tests/test_transform.py0000644000175000001440000002141013210261730021101 0ustar nabil00000000000000from __future__ import absolute_import, division, print_function from sunpy.image.transform import affine_transform import numpy as np from skimage import transform as tf import skimage.data as images import pytest from sunpy.extern.six.moves import range, zip # Define test image first so it's accessible to all functions. original = images.camera().astype('float') # Tolerance for tests rtol = 1.0e-15 @pytest.fixture def identity(): return np.array([[1, 0], [0, 1]]) def compare_results(expect, result, allclose=True): """ Function to check that the obtained results are what was expected, to within the relative tolerance defined above. """ # Outermost pixels can contain artefacts which will be ignored. exp = expect[1:-1, 1:-1] res = result[1:-1, 1:-1] t1 = abs(exp.mean() - res.mean()) <= rtol*exp.mean() #Don't do the allclose test for scipy as the bicubic algorithm has edge effects if allclose: t2 = np.allclose(exp, res, rtol=rtol) #TODO: Develop a better way of testing this else: t2 = True return t1 and t2 @pytest.mark.parametrize("angle, k", [(90.0, 1), (-90.0, -1), (-270.0, 1), (-90.0, 3), (360.0, 0), (-360.0, 0)]) def test_rotation(angle, k): # Test rotation against expected outcome angle = np.radians(angle) c = np.cos(angle); s = np.sin(angle) rmatrix = np.array([[c, -s], [s, c]]) expected = np.rot90(original, k=k) #Run the tests at order 4 as it produces more accurate 90 deg rotations rot = affine_transform(original, order=4, rmatrix=rmatrix) assert compare_results(expected, rot) # TODO: Check incremental 360 degree rotation against original image # Check derotated image against original derot_matrix = np.array([[c, s], [-s, c]]) derot = affine_transform(rot, order=4, rmatrix=derot_matrix) assert compare_results(original, derot) @pytest.mark.parametrize("angle, k", [(90.0, 1), (-90.0, -1), (-270.0, 1), (-90.0, 3), (360.0, 0), (-360.0, 0)]) def test_scipy_rotation(angle, k): # Test rotation against expected outcome angle = np.radians(angle) c = np.cos(angle); s = np.sin(angle) rmatrix = np.array([[c, -s], [s, c]]) expected = np.rot90(original, k=k) rot = affine_transform(original, rmatrix=rmatrix, use_scipy=True) assert compare_results(expected, rot, allclose=False) # TODO: Check incremental 360 degree rotation against original image # Check derotated image against original derot_matrix = np.array([[c, s], [-s, c]]) derot = affine_transform(rot, rmatrix=derot_matrix, use_scipy=True) assert compare_results(original, derot, allclose=False) dx_values, dy_values = list(range(-100, 101, 100))*3, list(range(-100, 101, 100))*3 dy_values.sort() @pytest.mark.parametrize("dx, dy", list(zip(dx_values, dy_values))) def test_shift(dx, dy): # Rotation center for all translation tests. image_center = np.array(original.shape)/2.0 - 0.5 # No rotation for all translation tests. rmatrix = np.array([[1.0, 0.0], [0.0, 1.0]]) # Check a shifted shape against expected outcome expected = np.roll(np.roll(original, dx, axis=1), dy, axis=0) rcen = image_center + np.array([dx, dy]) shift = affine_transform(original, rmatrix=rmatrix, recenter=True, image_center=rcen) ymin, ymax = max([0, dy]), min([original.shape[1], original.shape[1]+dy]) xmin, xmax = max([0, dx]), min([original.shape[0], original.shape[0]+dx]) compare_results(expected[ymin:ymax, xmin:xmax], shift[ymin:ymax, xmin:xmax]) # Check shifted and unshifted shape against original image rcen = image_center - np.array([dx, dy]) unshift = affine_transform(shift, rmatrix=rmatrix, recenter=True, image_center=rcen) # Need to ignore the portion of the image cut off by the first shift ymin, ymax = max([0, -dy]), min([original.shape[1], original.shape[1]-dy]) xmin, xmax = max([0, -dx]), min([original.shape[0], original.shape[0]-dx]) compare_results(original[ymin:ymax, xmin:xmax], unshift[ymin:ymax, xmin:xmax]) @pytest.mark.parametrize("scale_factor", [0.25, 0.5, 0.75, 1.0, 1.25, 1.5]) def test_scale(scale_factor): # No rotation for all scaling tests. rmatrix = np.array([[1.0, 0.0], [0.0, 1.0]]) # Check a scaled image against the expected outcome newim = tf.rescale(original/original.max(), scale_factor, order=4, mode='constant') * original.max() # Old width and new center of image w = original.shape[0]/2.0 - 0.5 new_c = (newim.shape[0]/2.0) - 0.5 expected = np.zeros(original.shape) upper = int(w+new_c+1) if scale_factor > 1: lower = int(new_c-w) expected = newim[lower:upper, lower:upper] else: lower = int(w-new_c) expected[lower:upper, lower:upper] = newim scale = affine_transform(original, rmatrix=rmatrix, scale=scale_factor) compare_results(expected, scale) @pytest.mark.parametrize("angle, dx, dy, scale_factor", [(90, -100, 50, 0.25), (-90, 50, -100, 0.75), (180, 100, 50, 1.5)]) def test_all(angle, dx, dy, scale_factor): """ Tests to make sure that combinations of scaling, shifting and rotation produce the expected output. """ k = int(angle/90) angle = np.radians(angle) image_center = np.array(original.shape)/2.0 - 0.5 # Check a shifted, rotated and scaled shape against expected outcome c = np.cos(angle); s = np.sin(angle) rmatrix = np.array([[c, -s], [s, c]]) scale = tf.rescale(original/original.max(), scale_factor, order=4, mode='constant') * original.max() new = np.zeros(original.shape) # Old width and new center of image w = np.array(original.shape[0])/2.0 - 0.5 new_c = (np.array(scale.shape[0])/2.0 - 0.5) upper = int(w+new_c+1) if scale_factor > 1: lower = int(new_c-w) new = scale[lower:upper, lower:upper] else: lower = int(w-new_c) new[lower:upper, lower:upper] = scale disp = np.array([dx, dy]) rcen = image_center + disp rot = np.rot90(new, k=k) shift = np.roll(np.roll(rot, dx, axis=1), dy, axis=0) expected = shift rotscaleshift = affine_transform(original, rmatrix=rmatrix, scale=scale_factor, recenter=True, image_center=rcen) w = np.array(expected.shape[0])/2.0 - 0.5 new_c = (np.array(rotscaleshift.shape[0])/2.0 - 0.5) upper = int(w+new_c+1) if scale_factor > 1: lower = int(new_c-w) expected = rotscaleshift[lower:upper, lower:upper] else: lower = int(w-new_c) expected[lower:upper, lower:upper] = rotscaleshift compare_results(expected, rotscaleshift) # Check a rotated/shifted and restored image against original transformed = affine_transform(original, rmatrix=rmatrix, scale=1.0, recenter=True, image_center=rcen) rcen = image_center - np.dot(rmatrix, np.array([dx, dy])) dx, dy = np.asarray(np.dot(rmatrix, disp), dtype=int) rmatrix = np.array([[c, s], [-s, c]]) inverse = affine_transform(transformed, rmatrix=rmatrix, scale=1.0, recenter=True, image_center=rcen) # Need to ignore the portion of the image cut off by the first shift # (which isn't the portion you'd expect, because of the rotation) ymin, ymax = max([0, -dy]), min([original.shape[1], original.shape[1]-dy]) xmin, xmax = max([0, -dx]), min([original.shape[0], original.shape[0]-dx]) compare_results(original[ymin:ymax, xmin:xmax], inverse[ymin:ymax, xmin:xmax]) def test_flat(identity): # Test that a flat array can be rotated using scikit-image in_arr = np.array([[100]]) out_arr = affine_transform(in_arr, rmatrix=identity) assert np.allclose(in_arr, out_arr, rtol=rtol) def test_nan_skimage_low(identity): # Test non-replacement of NaN values for scikit-image rotation with order <= 3 in_arr = np.array([[np.nan]]) out_arr = affine_transform(in_arr, rmatrix=identity, order=3) assert np.all(np.isnan(out_arr)) def test_nan_skimage_high(identity): # Test replacement of NaN values for scikit-image rotation with order >=4 in_arr = np.array([[np.nan]]) out_arr = affine_transform(in_arr, rmatrix=identity, order=4) assert not np.all(np.isnan(out_arr)) def test_nan_scipy(identity): # Test replacement of NaN values for scipy rotation in_arr = np.array([[np.nan]]) out_arr = affine_transform(in_arr, rmatrix=identity, use_scipy=True) assert not np.all(np.isnan(out_arr)) def test_int(identity): # Test casting of integer array to float array in_arr = np.array([[100]], dtype=int) out_arr = affine_transform(in_arr, rmatrix=identity) assert np.issubdtype(out_arr.dtype, np.float) sunpy-0.8.3/sunpy/image/tests/test_util.py0000644000175000017500000000137713231613137021074 0ustar nabilnabil00000000000000from __future__ import absolute_import, division, print_function import pytest import numpy as np from numpy.testing import assert_allclose from sunpy.image.util import to_norm, un_norm def test_to_norm(): array_simple = np.array([10., 20., 30., 100.]) assert_allclose(to_norm(array_simple), np.array([0.1, 0.2, 0.3, 1.])) array_simple_neg = np.array([-10., 0., 10., 90.]) assert_allclose(to_norm(array_simple_neg), np.array([0, 0.1, 0.2, 1.])) def test_un_norm(): array_simple = np.array([10, 20, 30, 100.]) assert_allclose(un_norm(np.array([0.1, 0.2, 0.3, 1.]), array_simple), array_simple) array_simple_neg = np.array([-10, 0, 10, 90]) assert_allclose(un_norm(np.array([0, 0.1, 0.2, 1.]), array_simple_neg), array_simple_neg) sunpy-0.8.3/sunpy/image/__init__.py0000644000175000001440000000000013203275053016421 0ustar nabil00000000000000sunpy-0.8.3/sunpy/image/coalignment.py0000644000175000017500000005422013232563373020220 0ustar nabilnabil00000000000000""" This module provides routines for the coalignment of images and mapcubes. Currently this module provides image coalignment by template matching. Which is partially inspired by the SSWIDL routine `tr_get_disp.pro `_. In this implementation, the template matching is handled via the scikit-image routine :func:`skimage.feature.match_template`. References ---------- Template matching algorithm: * http://scribblethink.org/Work/nvisionInterface/nip.html * J.P. Lewis, Fast Template Matching, Vision Interface 95, Canadian Image Processing and Pattern Recognition Society, Quebec City, Canada, May 15-19, 1995, p. 120-123 http://www.scribblethink.org/Work/nvisionInterface/vi95_lewis.pdf. """ from __future__ import absolute_import, division, print_function import numpy as np from scipy.ndimage.interpolation import shift from copy import deepcopy from astropy import units as u # Image co-registration by matching templates from skimage.feature import match_template # SunPy imports from sunpy.map.mapbase import GenericMap import sunpy.map __author__ = 'J. Ireland' __all__ = ['calculate_shift', 'clip_edges', 'calculate_clipping', 'match_template_to_layer', 'find_best_match_location', 'get_correlation_shifts', 'parabolic_turning_point', 'repair_image_nonfinite', 'apply_shifts', 'mapcube_coalign_by_match_template', 'calculate_match_template_shift'] def _default_fmap_function(data): """ This function ensures that the data are floats. It is the default data manipulation function for the coalignment method. """ return np.float64(data) def calculate_shift(this_layer, template): """Calculates the pixel shift required to put the template in the "best" position on a layer. Parameters ---------- this_layer : `~numpy.ndarray` A numpy array of size (ny, nx), where the first two dimensions are spatial dimensions. template : `~numpy.ndarray` A numpy array of size (N, M) where N < ny and M < nx. Returns ------- shifts : tuple Pixel shifts (yshift, xshift) relative to the offset of the template to the input array. """ # Repair any NANs, Infs, etc in the layer and the template this_layer = repair_image_nonfinite(this_layer) template = repair_image_nonfinite(template) # Calculate the correlation array matching the template to this layer corr = match_template_to_layer(this_layer, template) # Calculate the y and x shifts in pixels return find_best_match_location(corr) # # Remove the edges of a datacube # @u.quantity_input(yclips=u.pix, xclips=u.pix) def clip_edges(data, yclips, xclips): """ Clips off the y and x edges of a 2d array according to a list of pixel values. This function is useful for removing data at the edge of 2d images that may be affected by shifts from solar de-rotation and layer co-registration, leaving an image unaffected by edge effects. Parameters ---------- data : `numpy.ndarray` A numpy array of shape (ny, nx). yclips : `astropy.units.Quantity` The amount to clip in the y-direction of the data. Has units of pixels, and values should be whole non-negative numbers. xclips : `astropy.units.Quantity` The amount to clip in the x-direction of the data. Has units of pixels, and values should be whole non-negative numbers. Returns ------- image : `numpy.ndarray` A 2d image with edges clipped off according to yclips and xclips arrays. """ ny = data.shape[0] nx = data.shape[1] # The purpose of the int below is to ensure integer type since by default # astropy quantities are converted to floats. return data[int(yclips[0].value): ny - int(yclips[1].value), int(xclips[0].value): nx - int(xclips[1].value)] # # Return the upper and lower clipping values for the y and x directions an # input set of pixel shifts y and x # @u.quantity_input(y=u.pix, x=u.pix) def calculate_clipping(y, x): """ Return the upper and lower clipping values for the y and x directions. Parameters ---------- y : `astropy.units.Quantity` An array of pixel shifts in the y-direction for an image. x : `astropy.units.Quantity` An array of pixel shifts in the x-direction for an image. Returns ------- clipping : tuple The tuple is of the form ([y0, y1], [x0, x1]). The number of (integer) pixels that need to be clipped off at each edge in an image. The first element in the tuple is a list that gives the number of pixels to clip in the y-direction. The first element in that list is the number of rows to clip at the lower edge of the image in y. The clipped image has "clipping[0][0]" rows removed from its lower edge when compared to the original image. The second element in that list is the number of rows to clip at the upper edge of the image in y. The clipped image has "clipping[0][1]" rows removed from its upper edge when compared to the original image. The second element in the "clipping" tuple applies similarly to the x-direction (image columns). The parameters y0, y1, x0, x1 have the type `~astropy.units.Quantity`. """ return ([_lower_clip(y.value), _upper_clip(y.value)] * u.pix, [_lower_clip(x.value), _upper_clip(x.value)] * u.pix) # # Helper functions for clipping edges # def _upper_clip(z): """ Find smallest integer bigger than all the positive entries in the input array. """ zupper = 0 zcond = z >= 0 if np.any(zcond): zupper = int(np.max(np.ceil(z[zcond]))) return zupper def _lower_clip(z): """ Find smallest positive integer bigger than the absolute values of the negative entries in the input array. """ zlower = 0 zcond = z <= 0 if np.any(zcond): zlower = int(np.max(np.ceil(-z[zcond]))) return zlower def match_template_to_layer(layer, template): """ Calculate the correlation array that describes how well the template matches the layer. All inputs are assumed to be numpy arrays. This function requires the "match_template" function in scikit image. Parameters ---------- layer : `~numpy.ndarray` A numpy array of size (ny, nx). template : `~numpy.ndarray` A numpy array of size (N, M) where N < ny and M < nx. Returns ------- correlationarray : `~numpy.ndarray` A correlation array between the layer and the template. The values in the array range between 0 and 1. """ return match_template(layer, template) def find_best_match_location(corr): """ Calculate an estimate of the location of the peak of the correlation result in image pixels. Parameters ---------- corr : `~numpy.ndarray` A 2-d correlation array. Returns ------- shift : `~astropy.units.Quantity` The shift amounts (y, x) in image pixels. Subpixel values are possible. """ # Get the index of the maximum in the correlation function ij = np.unravel_index(np.argmax(corr), corr.shape) cor_max_x, cor_max_y = ij[::-1] # Get the correlation function around the maximum array_around_maximum = corr[np.max([0, cor_max_y - 1]): np.min([cor_max_y + 2, corr.shape[0] - 1]), np.max([0, cor_max_x - 1]): np.min([cor_max_x + 2, corr.shape[1] - 1])] y_shift_relative_to_maximum, x_shift_relative_to_maximum = \ get_correlation_shifts(array_around_maximum) # Get shift relative to correlation array y_shift_relative_to_correlation_array = y_shift_relative_to_maximum + cor_max_y * u.pix x_shift_relative_to_correlation_array = x_shift_relative_to_maximum + cor_max_x * u.pix return y_shift_relative_to_correlation_array, x_shift_relative_to_correlation_array def get_correlation_shifts(array): """ Estimate the location of the maximum of a fit to the input array. The estimation in the x and y directions are done separately. The location estimates can be used to implement subpixel shifts between two different images. Parameters ---------- array : `~numpy.ndarray` An array with at least one dimension that has three elements. The input array is at most a 3 x 3 array of correlation values calculated by matching a template to an image. Returns ------- peakloc : `~astropy.units.Quantity` The (y, x) location of the peak of a parabolic fit, in image pixels. """ # Check input shape ny = array.shape[0] nx = array.shape[1] if nx > 3 or ny > 3: print('Input array is too big in at least one dimension. Returning Nones') return None, None # Find where the maximum of the input array is ij = np.unravel_index(np.argmax(array), array.shape) x_max_location, y_max_location = ij[::-1] # Estimate the location of the parabolic peak if there is enough data. # Otherwise, just return the location of the maximum in a particular # direction. if ny == 3: y_location = parabolic_turning_point(array[:, x_max_location]) else: y_location = 1.0 * y_max_location if nx == 3: x_location = parabolic_turning_point(array[y_max_location, :]) else: x_location = 1.0 * x_max_location return y_location * u.pix, x_location * u.pix def parabolic_turning_point(y): """ Find the location of the turning point for a parabola y(x) = ax^2 + bx + c, given input values y(-1), y(0), y(1). The maximum is located at x0 = -b / 2a . Assumes that the input array represents an equally spaced sampling at the locations y(-1), y(0) and y(1). Parameters ---------- y : `~numpy.ndarray` A one dimensional numpy array of shape 3 with entries that sample the parabola at -1, 0, and 1. Returns ------- location : float A digit, the location of the parabola maximum. """ numerator = -0.5 * y.dot([-1, 0, 1]) denominator = y.dot([1, -2, 1]) return numerator / denominator def repair_image_nonfinite(image): """ Return a new image in which all the nonfinite entries of the original image have been replaced by the local mean. Parameters ---------- image : `~numpy.ndarray` A two-dimensional `~numpy.ndarray`. Returns ------- repaired_image : `~numpy.ndarray` A two-dimensional `~numpy.ndarray` of the same shape as the input that has all the non-finite entries replaced by a local mean. The algorithm repairs one non-finite entry at every pass. At each pass, the next non-finite value is replaced by the mean of its finite valued nearest neighbours. """ repaired_image = deepcopy(image) nx = repaired_image.shape[1] ny = repaired_image.shape[0] bad_index = np.where(np.logical_not(np.isfinite(repaired_image))) while bad_index[0].size != 0: by = bad_index[0][0] bx = bad_index[1][0] # x locations taking in to account the boundary x = bx if bx == 0: x = 1 if bx == nx - 1: x = nx - 2 # y locations taking in to account the boundary y = by if by == 0: y = 1 if by == ny - 1: y = ny - 2 # Get the sub array around the bad index, and find the local mean # ignoring nans subarray = repaired_image[y - 1: y + 2, x - 1: x + 2] repaired_image[by, bx] = np.mean(subarray[np.isfinite(subarray)]) bad_index = np.where(np.logical_not(np.isfinite(repaired_image))) return repaired_image @u.quantity_input(yshift=u.pix, xshift=u.pix) def apply_shifts(mc, yshift, xshift, clip=True, **kwargs): """ Apply a set of pixel shifts to a `~sunpy.map.MapCube`, and return a new `~sunpy.map.MapCube`. Parameters ---------- mc : `sunpy.map.MapCube` A `~sunpy.map.MapCube` of shape (ny, nx, nt), where nt is the number of layers in the `~sunpy.map.MapCube`. 'ny' is the number of pixels in the y direction, 'nx' is the number of pixels in the 'x' direction. yshift : `~astropy.units.Quantity` instance An array of pixel shifts in the y-direction for an image. xshift : `~astropy.units.Quantity` instance An array of pixel shifts in the x-direction for an image. clip : bool If True, then clip off x, y edges in the datacube that are potentially affected by edges effects. All other keywords are passed to `scipy.ndimage.interpolation.shift`. Returns ------- newmapcube : `sunpy.map.MapCube` A `~sunpy.map.MapCube` of the same shape as the input. All layers in the `~sunpy.map.MapCube` have been shifted according the input shifts. """ # New mapcube will be constructed from this list new_mc = [] # Calculate the clipping if clip: yclips, xclips = calculate_clipping(-yshift, -xshift) # Shift the data and construct the mapcube for i, m in enumerate(mc): shifted_data = shift(deepcopy(m.data), [yshift[i].value, xshift[i].value], **kwargs) new_meta = deepcopy(m.meta) # Clip if required. Use the submap function to return the appropriate # portion of the data. if clip: shifted_data = clip_edges(shifted_data, yclips, xclips) new_meta['naxis1'] = shifted_data.shape[1] new_meta['naxis2'] = shifted_data.shape[0] new_meta['crpix1'] = m.reference_pixel.x.value + xshift[i].value - xshift[0].value new_meta['crpix2'] = m.reference_pixel.y.value + yshift[i].value - yshift[0].value new_map = sunpy.map.Map(shifted_data, new_meta) # Append to the list new_mc.append(new_map) return sunpy.map.Map(new_mc, cube=True) def calculate_match_template_shift(mc, template=None, layer_index=0, func=_default_fmap_function): """ Calculate the arcsecond shifts necessary to co-register the layers in a `~sunpy.map.MapCube` according to a template taken from that `~sunpy.map.MapCube`. This method REQUIRES that scikit-image be installed. When using this functionality, it is a good idea to check that the shifts that were applied to were reasonable and expected. One way of checking this is to animate the original `~sunpy.map.MapCube`, animate the coaligned `~sunpy.map.MapCube`, and compare the differences you see to the calculated shifts. Parameters ---------- mc : `sunpy.map.MapCube` A `~sunpy.map.MapCube` of shape (ny, nx, nt), where nt is the number of layers in the `~sunpy.map.MapCube`. template : {None | `~sunpy.map.Map` | `~numpy.ndarray`} The template used in the matching. If an `~numpy.ndarray` is passed, the `~numpy.ndarray` has to have two dimensions. layer_index : int The template is assumed to refer to the map in the `~sunpy.map.MapCube` indexed by the value of "layer_index". Displacements of all maps in the `~sunpy.map.MapCube` are assumed to be relative to this layer. The displacements of the template relative to this layer are therefore (0, 0). func : function A function which is applied to the data values before the coalignment method is applied. This can be useful in coalignment, because it is sometimes better to co-align on a function of the data rather than the data itself. The calculated shifts are applied to the original data. Examples of useful functions to consider for EUV images are the logarithm or the square root. The function is of the form func = F(data). The default function ensures that the data are floats. """ # Size of the data ny = mc.maps[layer_index].data.shape[0] nx = mc.maps[layer_index].data.shape[1] nt = len(mc.maps) # Calculate a template. If no template is passed then define one # from the index layer. if template is None: tplate = mc.maps[layer_index].data[int(ny/4): int(3*ny/4), int(nx/4): int(3*nx/4)] elif isinstance(template, GenericMap): tplate = template.data elif isinstance(template, np.ndarray): tplate = template else: raise ValueError('Invalid template.') # Apply the function to the template tplate = func(tplate) # Storage for the pixel shift xshift_keep = np.zeros(nt) * u.pix yshift_keep = np.zeros_like(xshift_keep) # Storage for the arcsecond shift xshift_arcseconds = np.zeros(nt) * u.arcsec yshift_arcseconds = np.zeros_like(xshift_arcseconds) # Match the template and calculate shifts for i, m in enumerate(mc.maps): # Get the next 2-d data array this_layer = func(m.data) # Calculate the y and x shifts in pixels yshift, xshift = calculate_shift(this_layer, tplate) # Keep shifts in pixels yshift_keep[i] = yshift xshift_keep[i] = xshift # Calculate shifts relative to the template layer yshift_keep = yshift_keep - yshift_keep[layer_index] xshift_keep = xshift_keep - xshift_keep[layer_index] for i, m in enumerate(mc.maps): # Calculate the shifts required in physical units, which are # presumed to be arcseconds. xshift_arcseconds[i] = xshift_keep[i] * m.scale[0] yshift_arcseconds[i] = yshift_keep[i] * m.scale[1] return {"x": xshift_arcseconds, "y": yshift_arcseconds} # Coalignment by matching a template def mapcube_coalign_by_match_template(mc, template=None, layer_index=0, func=_default_fmap_function, clip=True, shift=None, **kwargs): """ Co-register the layers in a `~sunpy.map.MapCube` according to a template taken from that `~sunpy.map.MapCube`. This method REQUIRES that scikit-image be installed. When using this functionality, it is a good idea to check that the shifts that were applied to were reasonable and expected. One way of checking this is to animate the original `~sunpy.map.MapCube`, animate the coaligned `~sunpy.map.MapCube`, and compare the differences you see to the calculated shifts. Parameters ---------- mc : `sunpy.map.MapCube` A `~sunpy.map.MapCube` of shape (ny, nx, nt), where nt is the number of layers in the `~sunpy.map.MapCube`. template : {None | sunpy.map.Map | `~numpy.ndarray`} The template used in the matching. If an `~numpy.ndarray` is passed, the `~numpy.ndarray` has to have two dimensions. layer_index : int The template is assumed to refer to the map in the `~sunpy.map.MapCube` indexed by the value of "layer_index". Displacements of all maps in the `~sunpy.map.MapCube` are assumed to be relative to this layer. The displacements of the template relative to this layer are therefore (0, 0). func : function A function which is applied to the data values before the coalignment method is applied. This can be useful in coalignment, because it is sometimes better to co-align on a function of the data rather than the data itself. The calculated shifts are applied to the original data. Examples of useful functions to consider for EUV images are the logarithm or the square root. The function is of the form func = F(data). The default function ensures that the data are floats. clip : bool If True, then clip off x, y edges in the datacube that are potentially affected by edges effects. shift : dict A dictionary with two keys, 'x' and 'y'. Key 'x' is an astropy quantities array of corresponding to the amount of shift in the x-direction (in arcseconds, assuming the helio-projective Cartesian co-ordinate system) that is applied to the input `~sunpy.map.MapCube`. Key 'y' is an `~astropy.units.Quantity` array corresponding to the amount of shift in the y-direction (in arcseconds, assuming the helio-projective Cartesian co-ordinate system) that is applied to the input `~sunpy.map.MapCube`. The number of elements in each array must be the same as the number of maps in the `~sunpy.map.MapCube`. If a shift is passed in to the function, that shift is applied to the input `~sunpy.map.MapCube` and the template matching algorithm is not used. The remaining keyword arguments are sent to `sunpy.image.coalignment.apply_shifts`. Returns ------- output : `sunpy.map.MapCube` A `~sunpy.map.MapCube` that has co-aligned by matching the template. Examples -------- >>> from sunpy.image.coalignment import mapcube_coalign_by_match_template as mc_coalign >>> coaligned_mc = mc_coalign(mc) # doctest: +SKIP >>> coaligned_mc = mc_coalign(mc, layer_index=-1) # doctest: +SKIP >>> coaligned_mc = mc_coalign(mc, clip=False) # doctest: +SKIP >>> coaligned_mc = mc_coalign(mc, template=sunpy_map) # doctest: +SKIP >>> coaligned_mc = mc_coalign(mc, template=two_dimensional_ndarray) # doctest: +SKIP >>> coaligned_mc = mc_coalign(mc, func=np.log) # doctest: +SKIP """ # Number of maps nt = len(mc.maps) # Storage for the pixel shifts and the shifts in arcseconds xshift_keep = np.zeros(nt) * u.pix yshift_keep = np.zeros_like(xshift_keep) if shift is None: shifts = calculate_match_template_shift(mc, template=template, layer_index=layer_index, func=func) xshift_arcseconds = shifts['x'] yshift_arcseconds = shifts['y'] else: xshift_arcseconds = shift['x'] yshift_arcseconds = shift['y'] # Calculate the pixel shifts for i, m in enumerate(mc): xshift_keep[i] = (xshift_arcseconds[i] / m.scale[0]) yshift_keep[i] = (yshift_arcseconds[i] / m.scale[1]) # Apply the shifts and return the coaligned mapcube return apply_shifts(mc, -yshift_keep, -xshift_keep, clip=clip, **kwargs) sunpy-0.8.3/sunpy/image/rescale.py0000644000175000017500000002055513232563373017342 0ustar nabilnabil00000000000000"""Image resampling methods""" from __future__ import absolute_import, division, print_function import numpy as np import scipy.interpolate import scipy.ndimage from sunpy.extern.six.moves import range __all__ = ['resample', 'reshape_image_to_4d_superpixel'] def resample(orig, dimensions, method='linear', center=False, minusone=False): """Returns a new `numpy.ndarray` that has been resampled up or down. Arbitrary resampling of source array to new dimension sizes. Currently only supports maintaining the same number of dimensions. To use 1-D arrays, first promote them to shape (x,1). Uses the same parameters and creates the same co-ordinate lookup points as IDL's congrid routine (which apparently originally came from a VAX/VMS routine of the same name.) Parameters ---------- orig : `~numpy.ndarray` Original inout array. dimensions : tuple Dimensions that new `~numpy.ndarray` should have. method : {'neighbor' | 'nearest' | 'linear' | 'spline'} Method to use for resampling interpolation. * neighbor - Closest value from original data * nearest and linear - Uses n x 1-D interpolations calculated by `scipy.interpolate.interp1d`. * spline - Uses ndimage.map_coordinates center : bool If True, interpolation points are at the centers of the bins, otherwise points are at the front edge of the bin. minusone : bool For orig.shape = (i,j) & new dimensions = (x,y), if set to False orig is resampled by factors of (i/x) * (j/y), otherwise orig is resampled by(i-1)/(x-1) * (j-1)/(y-1) This prevents extrapolation one element beyond bounds of input array. Returns ------- out : `~numpy.ndarray` A new `~numpy.ndarray` which has been resampled to the desired dimensions. References ---------- | http://www.scipy.org/Cookbook/Rebinning (Original source, 2011/11/19) """ # Verify that number dimensions requested matches original shape if len(dimensions) != orig.ndim: raise UnequalNumDimensions("Number of dimensions must remain the same " "when calling resample.") #@note: will this be okay for integer (e.g. JPEG 2000) data? if orig.dtype not in [np.float64, np.float32]: orig = orig.astype(np.float64) dimensions = np.asarray(dimensions, dtype=np.float64) m1 = np.array(minusone, dtype=np.int64) # array(0) or array(1) offset = np.float64(center * 0.5) # float64(0.) or float64(0.5) # Resample data if method == 'neighbor': data = _resample_neighbor(orig, dimensions, offset, m1) elif method in ['nearest', 'linear']: data = _resample_nearest_linear(orig, dimensions, method, offset, m1) elif method == 'spline': data = _resample_spline(orig, dimensions, offset, m1) else: raise UnrecognizedInterpolationMethod("Unrecognized interpolation " "method requested.") return data def _resample_nearest_linear(orig, dimensions, method, offset, m1): """Resample Map using either linear or nearest interpolation.""" dimlist = [] # calculate new dims for i in range(orig.ndim): base = np.arange(dimensions[i]) dimlist.append((orig.shape[i] - m1) / (dimensions[i] - m1) * (base + offset) - offset) # specify old coordinates old_coords = [np.arange(i, dtype=np.float) for i in orig.shape] # first interpolation - for ndims = any mint = scipy.interpolate.interp1d(old_coords[-1], orig, bounds_error=False, fill_value=min(old_coords[-1]), kind=method) new_data = mint(dimlist[-1]) trorder = [orig.ndim - 1] + list(range(orig.ndim - 1)) for i in range(orig.ndim - 2, -1, -1): new_data = new_data.transpose(trorder) mint = scipy.interpolate.interp1d(old_coords[i], new_data, bounds_error=False, fill_value=min(old_coords[i]), kind=method) new_data = mint(dimlist[i]) if orig.ndim > 1: # need one more transpose to return to original dimensions new_data = new_data.transpose(trorder) return new_data def _resample_neighbor(orig, dimensions, offset, m1): """Resample Map using closest-value interpolation.""" dimlist = [] dimensions = np.asarray(dimensions, dtype=int) for i in range(orig.ndim): base = np.indices(dimensions)[i] dimlist.append((orig.shape[i] - m1) / (dimensions[i] - m1) * (base + offset) - offset) cd = np.array(dimlist).round().astype(int) return orig[list(cd)] def _resample_spline(orig, dimensions, offset, m1): """Resample Map using spline-based interpolation.""" oslices = [slice(0, j) for j in orig.shape] # FIXME: not used?! old_coords = np.ogrid[oslices] # pylint: disable=W0612 nslices = [slice(0, j) for j in list(dimensions)] newcoords = np.mgrid[nslices] newcoords_dims = list(range(np.rank(newcoords))) # make first index last newcoords_dims.append(newcoords_dims.pop(0)) newcoords_tr = newcoords.transpose(newcoords_dims) # pylint: disable=W0612 # makes a view that affects newcoords newcoords_tr += offset deltas = (np.asarray(orig.shape) - m1) / (dimensions - m1) newcoords_tr *= deltas newcoords_tr -= offset return scipy.ndimage.map_coordinates(orig, newcoords) def reshape_image_to_4d_superpixel(img, dimensions, offset): """Re-shape the two dimension input image into a a four dimensional array whose first and third dimensions express the number of original pixels in the x and y directions that form one superpixel. The reshaping makes it very easy to perform operations on superpixels. An application of this reshaping is the following. Let's say you have an array:: x = np.array([[0, 0, 0, 1, 1, 1], [0, 0, 1, 1, 0, 0], [1, 1, 0, 0, 1, 1], [0, 0, 0, 0, 1, 1], [1, 0, 1, 0, 1, 1], [0, 0, 1, 0, 0, 0]]) and you want to sum over 2x2 non-overlapping sub-arrays. For example, you could have a noisy image and you want to increase the signal-to-noise ratio. Summing over all the non-overlapping 2x2 sub-arrays will create a superpixel array of the original data. Every pixel in the superpixel array is the sum of the values in a 2x2 sub-array of the original array, This summing can be done by reshaping the array:: y = x.reshape(3,2,3,2) and then summing over the 1st and third directions:: y2 = y.sum(axis=3).sum(axis=1) which gives the expected array:: array([[0, 3, 2], [2, 0, 4], [1, 2, 2]]) Parameters ---------- img : `numpy.ndarray` A two-dimensional `~numpy.ndarray` of the form (y, x). dimensions : array-like A two element array-like object containing integers that describe the superpixel summation in the (y, x) directions. offset : array-like A two element array-like object containing integers that describe where in the input image the array reshaping begins in the (y, x) directions. Returns ------- A four dimensional `~numpy.ndarray` that can be used to easily create two-dimensional arrays of superpixels of the input image. References ---------- Taken from http://mail.scipy.org/pipermail/numpy-discussion/2010-July/051760.html """ # make sure the input dimensions are integers dimensions = [int(dim) for dim in dimensions] # New dimensions of the final image na = int(np.floor((img.shape[0] - offset[0]) / dimensions[0])) nb = int(np.floor((img.shape[1] - offset[1]) / dimensions[1])) # Reshape up to a higher dimensional array which is useful for higher # level operations return (img[int(offset[0]):int(offset[0] + na * dimensions[0]), int(offset[1]):int(offset[1] + nb * dimensions[1])]).reshape(na, dimensions[0], nb, dimensions[1]) class UnrecognizedInterpolationMethod(ValueError): """Unrecognized interpolation method specified.""" pass class UnequalNumDimensions(ValueError): """Number of dimensions does not match input array""" pass sunpy-0.8.3/sunpy/image/transform.py0000644000175000017500000001251413232563373017733 0ustar nabilnabil00000000000000""" Functions for geometrical image transformation and warping. """ from __future__ import absolute_import import warnings import numpy as np import scipy.ndimage.interpolation try: import skimage.transform scikit_image_not_found = False except ImportError: # pragma: no cover warnings.warn("scikit-image could not be imported. Image rotation will use scipy", ImportWarning) scikit_image_not_found = True # pragma: no cover __all__ = ['affine_transform'] def affine_transform(image, rmatrix, order=3, scale=1.0, image_center=None, recenter=False, missing=0.0, use_scipy=False): """ Rotates, shifts and scales an image using :func:`skimage.transform.warp`, or :func:`scipy.ndimage.interpolation.affine_transform` if specified. Falls back to the scipy function if scikit-image can't be imported. Parameters ---------- image : `numpy.ndarray` 2D Image to be rotated. rmatrix : 2x2 Linear transformation rotation matrix. order : int 0-5 Interpolation order to be used. When using scikit-image this parameter is passed into :func:`skimage.transform.warp` (e.g., 3 corresponds to bi-cubic interpolation). When using scipy it is passed into :func:`scipy.ndimage.interpolation.affine_transform` where it controls the order of the spline. Default: 3 scale : float A scale factor for the image. Default is no scaling. image_center : tuple The point in the image to rotate around (axis of rotation). Default: center of the array. recenter : bool or array-like Move the axis of rotation to the center of the array or recenter coords. Default: True, recenter to the center of the array. missing : float The value to replace any missing data after the transformation. use_scipy : bool Force use of :func:`scipy.ndimage.interpolation.affine_transform`. Will set all NaNs in image to zero before doing the transform. Default: False, unless scikit-image can't be imported Returns ------- out : New rotated, scaled and translated image. Notes ----- This algorithm uses an affine transformation as opposed to a polynomial geometrical transformation, which by default is :func:`skimage.transform.warp`. One can specify using :func:`scipy.ndimage.interpolation.affine_transform` as an alternative affine transformation. The two transformations use different algorithms and thus do not give identical output. When using for :func:`skimage.transform.warp` with order >= 4 or using :func:`scipy.ndimage.interpolation.affine_transform` at all, NaN values will replaced with zero prior to rotation. No attempt is made to retain the NaN values. Input arrays with integer data are cast to float64 and can be re-cast using :func:`numpy.ndarray.astype` if desired. Although this function is analogous to the IDL's rot() function, it does not use the same algorithm as the IDL rot() function. IDL's rot() calls the `POLY_2D `_ method to calculate the inverse mapping of original to target pixel coordinates. This is a polynomial geometrical transformation. Then optionally it uses a bicubic convolution interpolation algorithm to map the original to target pixel values. """ rmatrix = rmatrix / scale array_center = (np.array(image.shape)[::-1]-1)/2.0 # Make sure the image center is an array and is where it's supposed to be if image_center is not None: image_center = np.asanyarray(image_center) else: image_center = array_center # Determine center of rotation based on use (or not) of the recenter keyword if recenter: rot_center = array_center else: rot_center = image_center displacement = np.dot(rmatrix, rot_center) shift = image_center - displacement if use_scipy or scikit_image_not_found: if np.any(np.isnan(image)): warnings.warn("Setting NaNs to 0 for SciPy rotation", RuntimeWarning) # Transform the image using the scipy affine transform rotated_image = scipy.ndimage.interpolation.affine_transform( np.nan_to_num(image).T, rmatrix, offset=shift, order=order, mode='constant', cval=missing).T else: # Make the rotation matrix 3x3 to include translation of the image skmatrix = np.zeros((3, 3)) skmatrix[:2, :2] = rmatrix skmatrix[2, 2] = 1.0 skmatrix[:2, 2] = shift tform = skimage.transform.AffineTransform(skmatrix) # Transform the image using the skimage function if not np.issubdtype(image.dtype, np.float64): warnings.warn("Input data has been cast to float64", RuntimeWarning) adjusted_image = image.astype(np.float64) else: adjusted_image = image.copy() if np.any(np.isnan(adjusted_image)) and order >= 4: warnings.warn("Setting NaNs to 0 for higher-order scikit-image rotation", RuntimeWarning) adjusted_image = np.nan_to_num(adjusted_image) rotated_image = skimage.transform.warp(adjusted_image, tform, order=order, mode='constant', cval=missing) return rotated_image sunpy-0.8.3/sunpy/image/util.py0000644000175000017500000000354713231613137016674 0ustar nabilnabil00000000000000""" Helper functions for image manipulation """ from __future__ import absolute_import, division import numpy as np from skimage.util import img_as_float __all__ = ['to_norm', 'un_norm'] def to_norm(arr): """ Helper function to normalise/scale an array. This is needed for example for scikit-image which uses floats between 0 and 1. Parameters ---------- arr : `~numpy.ndarray` Array to normalise. Returns ------- arr : `~numpy.ndarray` Array with values between 0 (min) and 1 (max) Examples -------- >>> import numpy as np >>> from sunpy.image.util import to_norm >>> out = to_norm(np.array([-1, 0, 1])) >>> out # doctest: +FLOAT_CMP array([ 0. , 0.5, 1. ]) """ arr = np.array(arr, dtype='double') arr = img_as_float(arr, force_copy=True) if arr.min() < 0: arr += np.abs(arr.min()) arr /= arr.max() return arr def un_norm(arr, original): """ Helper function to un-normalise (or re-scale) an array based in the values of the original array. Parameters ---------- arr : `~numpy.ndarray` Array of floats to un-normalise with values in [0,1] original : `~numpy.ndarray` Original array with the min and max values Returns ------- arr : `~numpy.ndarray` Array with values between `original.min()` and `original.max()` . Note that the type of the original image is not guaranteed to be reproduced. Examples -------- >>> import numpy as np >>> from sunpy.image.util import un_norm >>> original = np.array([-1, 0, 1]) >>> normalised = np.array([0., 0.5, 1.]) >>> out = un_norm(normalised, original) >>> out array([-1., 0., 1.]) """ level = 0 if original.min() > 0 else np.abs(original.min()) arr *= original.max() + level arr -= level return arr sunpy-0.8.3/sunpy/instr/0000755000175000017500000000000013232563477015425 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/instr/iris/0000755000175000017500000000000013232563477016373 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/instr/iris/__init__.py0000644000175000017500000000054413231613137020473 0ustar nabilnabil00000000000000""" The Interface Region Imaging Spectrometer (IRIS) instrument routines. Currently this module only includes a simple hack to convert SJI mode files to a `sunpy.map.MapCube` instance. .. note:: More comprehensive IRIS tools are now being developed in the `IRISPy `__ affiliated pacakge. """ from .iris import * sunpy-0.8.3/sunpy/instr/iris/iris.py0000644000175000001440000000243613203275053016672 0ustar nabil00000000000000""" Some very beta tools for IRIS """ import sunpy.io import sunpy.time import sunpy.map __all__ = ['SJI_to_cube'] def SJI_to_cube(filename, start=0, stop=None, hdu=0): """ Read a SJI file and return a MapCube .. warning:: This function is a very early beta and is not stable. Further work is on going to improve SunPy IRIS support. Parameters ---------- filename: string File to read start: int Temporal axis index to create MapCube from stop: int Temporal index to stop MapCube at hdu: int Choose hdu index Returns ------- iris_cube: sunpy.map.MapCube A map cube of the SJI sequence """ hdus = sunpy.io.read_file(filename) # Get the time delta time_range = sunpy.time.TimeRange(hdus[hdu][1]['STARTOBS'], hdus[hdu][1]['ENDOBS']) splits = time_range.split(hdus[hdu][0].shape[0]) if not stop: stop = len(splits) headers = [hdus[hdu][1]]*(stop-start) datas = hdus[hdu][0][start:stop] # Make the cube: iris_cube = sunpy.map.Map(list(zip(datas, headers)), cube=True) # Set the date/time for i, m in enumerate(iris_cube): m.meta['DATE-OBS'] = splits[i].center.isoformat() return iris_cube sunpy-0.8.3/sunpy/instr/tests/0000755000175000017500000000000013232563477016567 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/instr/tests/__init__.py0000644000175000001440000000000013203275053017640 0ustar nabil00000000000000sunpy-0.8.3/sunpy/instr/tests/test_aia.py0000644000175000017500000000417613231613137020726 0ustar nabilnabil00000000000000from __future__ import absolute_import import tempfile import pytest import numpy as np import sunpy.map import sunpy.data.test as test from sunpy.instr.aia import aiaprep # Define the original and prepped images first so they're available to all # functions @pytest.fixture def original(): return sunpy.map.Map(test.get_test_filepath("aia_171_level1.fits")) @pytest.fixture def prep_map(original): return aiaprep(original) def test_aiaprep(original, prep_map): # Test that header info for the map has been correctly updated # Check all of these for Map attributes and .meta values? # Check array shape assert prep_map.data.shape == original.data.shape # Check crpix values assert prep_map.meta['crpix1'] == prep_map.data.shape[1] / 2.0 + 0.5 assert prep_map.meta['crpix2'] == prep_map.data.shape[0] / 2.0 + 0.5 # Check cdelt values assert prep_map.meta['cdelt1'] / 0.6 == int(prep_map.meta['cdelt1'] / 0.6) assert prep_map.meta['cdelt2'] / 0.6 == int(prep_map.meta['cdelt2'] / 0.6) # Check rotation value, I am assuming that the inaccuracy in # the CROTA -> PCi_j matrix is causing the inaccuracy here np.testing.assert_allclose( prep_map.rotation_matrix, np.identity(2), rtol=1e-5, atol=1e-8) # Check level number assert prep_map.meta['lvl_num'] == 1.5 def test_filesave(prep_map): # Test that adjusted header values are still correct after saving the map # and reloading it. afilename = tempfile.NamedTemporaryFile(suffix='fits').name prep_map.save(afilename, clobber=True) load_map = sunpy.map.Map(afilename) # Check crpix values assert load_map.meta['crpix1'] == prep_map.data.shape[1] / 2.0 + 0.5 assert load_map.meta['crpix2'] == prep_map.data.shape[0] / 2.0 + 0.5 # Check cdelt values assert load_map.meta['cdelt1'] / 0.6 == int(load_map.meta['cdelt1'] / 0.6) assert load_map.meta['cdelt2'] / 0.6 == int(load_map.meta['cdelt2'] / 0.6) # Check rotation value np.testing.assert_allclose( prep_map.rotation_matrix, np.identity(2), rtol=1e-5, atol=1e-8) # Check level number assert load_map.meta['lvl_num'] == 1.5 sunpy-0.8.3/sunpy/instr/tests/test_fermi.py0000644000175000017500000000450413231613137021271 0ustar nabilnabil00000000000000import pytest from numpy.testing import assert_almost_equal from sunpy.instr import fermi from sunpy.time import parse_time from sunpy.extern import six @pytest.mark.remote_data def test_download_weekly_pointing_file(): # set a test date date = parse_time('2011-10-01') afile = fermi.download_weekly_pointing_file(date) assert isinstance(afile, six.string_types) assert afile.endswith('.fits') @pytest.mark.remote_data def test_detector_angles(): # set a test date date = parse_time('2012-02-15') file = fermi.download_weekly_pointing_file(date) det = fermi.get_detector_sun_angles_for_date(date, file) assert len(det) == 13 assert_almost_equal(det['n0'][0].value, 21.73944, decimal=1) assert_almost_equal(det['n1'][0].value, 30.62983, decimal=1) assert_almost_equal(det['n2'][0].value, 74.67486, decimal=1) assert_almost_equal(det['n3'][0].value, 30.46062, decimal=1) assert_almost_equal(det['n4'][0].value, 73.89734, decimal=1) assert_almost_equal(det['n5'][0].value, 58.99893, decimal=1) assert_almost_equal(det['n6'][0].value, 47.31091, decimal=1) assert_almost_equal(det['n7'][0].value, 70.63391, decimal=1) assert_almost_equal(det['n8'][0].value, 106.30992, decimal=1) assert_almost_equal(det['n9'][0].value, 70.07033, decimal=1) assert_almost_equal(det['n10'][0].value, 106.97884, decimal=1) assert_almost_equal(det['n11'][0].value, 121.09603, decimal=1) det2 = fermi.get_detector_sun_angles_for_time( parse_time('2012-02-15 02:00'), file) assert len(det2) == 13 assert type(det2) == dict assert_almost_equal(det2['n0'].value, 83.76092, decimal=1) assert_almost_equal(det2['n1'].value, 66.65847, decimal=1) assert_almost_equal(det2['n10'].value, 123.28952, decimal=1) assert_almost_equal(det2['n11'].value, 170.69869, decimal=1) assert_almost_equal(det2['n2'].value, 58.78532, decimal=1) assert_almost_equal(det2['n3'].value, 66.69068, decimal=1) assert_almost_equal(det2['n4'].value, 57.16402, decimal=1) assert_almost_equal(det2['n5'].value, 9.04924, decimal=1) assert_almost_equal(det2['n6'].value, 112.21230, decimal=1) assert_almost_equal(det2['n7'].value, 127.35783, decimal=1) assert_almost_equal(det2['n8'].value, 122.98894, decimal=1) assert_almost_equal(det2['n9'].value, 126.95987, decimal=1) sunpy-0.8.3/sunpy/instr/tests/test_goes.py0000644000175000017500000005675713231613137021145 0ustar nabilnabil00000000000000from __future__ import absolute_import import copy import datetime import pytest import numpy as np from astropy.units.quantity import Quantity from astropy.tests.helper import assert_quantity_allclose from numpy.testing import assert_array_equal, assert_almost_equal from pandas.util.testing import assert_frame_equal import astropy.units as u from sunpy.time import TimeRange from sunpy import lightcurve from sunpy.instr import goes # Define input variables to be used in test functions for # _goes_chianti_tem. LONGFLUX = Quantity([7e-6], unit="W/m**2") SHORTFLUX = Quantity([7e-7], unit="W/m**2") DATE = "2014-04-16" @pytest.mark.remote_data def test_goes_event_list(): # Set a time range to search trange = TimeRange('2011-06-07 00:00', '2011-06-08 00:00') # Test case where GOES class filter is applied result = goes.get_goes_event_list(trange, goes_class_filter='M1') assert type(result) == list assert type(result[0]) == dict assert type(result[0]['event_date'] == str) assert type(result[0]['goes_location'] == tuple) assert type(result[0]['peak_time'] == datetime.datetime) assert type(result[0]['start_time'] == datetime.datetime) assert type(result[0]['end_time'] == datetime.datetime) assert type(result[0]['goes_class'] == str) assert type(result[0]['noaa_active_region'] == int) assert result[0]['event_date'] == '2011-06-07' assert result[0]['goes_location'] == (54, -21) assert result[0]['start_time'] == datetime.datetime(2011, 6, 7, 6, 16) assert result[0]['peak_time'] == datetime.datetime(2011, 6, 7, 6, 41) assert result[0]['end_time'] == datetime.datetime(2011, 6, 7, 6, 59) assert result[0]['goes_class'] == 'M2.5' assert result[0]['noaa_active_region'] == 11226 # Test case where GOES class filter not applied result = goes.get_goes_event_list(trange) assert type(result) == list assert type(result[0]) == dict assert type(result[0]['event_date'] == str) assert type(result[0]['goes_location'] == tuple) assert type(result[0]['peak_time'] == datetime.datetime) assert type(result[0]['start_time'] == datetime.datetime) assert type(result[0]['end_time'] == datetime.datetime) assert type(result[0]['goes_class'] == str) assert type(result[0]['noaa_active_region'] == int) assert result[0]['event_date'] == '2011-06-07' assert result[0]['goes_location'] == (54, -21) assert result[0]['start_time'] == datetime.datetime(2011, 6, 7, 6, 16) assert result[0]['peak_time'] == datetime.datetime(2011, 6, 7, 6, 41) assert result[0]['end_time'] == datetime.datetime(2011, 6, 7, 6, 59) assert result[0]['goes_class'] == 'M2.5' assert result[0]['noaa_active_region'] == 11226 @pytest.mark.remote_data def test_calculate_temperature_em(): # Create GOESLightcurve object, then create new one with # temperature & EM using with calculate_temperature_em(). goeslc = lightcurve.GOESLightCurve.create("2014-01-01 00:00", "2014-01-01 01:00") goeslc_new = goes.calculate_temperature_em(goeslc) # Test correct exception is raised if a GOESLightCurve object is # not inputted. with pytest.raises(TypeError): goes.calculate_temperature_em([]) # Find temperature and EM manually with _goes_chianti_tem() temp, em = goes._goes_chianti_tem( Quantity(goeslc.data.xrsb, unit='W/m**2'), Quantity(goeslc.data.xrsa, unit='W/m**2'), satellite=int(goeslc.meta["TELESCOP"].split()[1]), date="2014-01-01") # Check that temperature and EM arrays from _goes_chianti_tem() # are same as those in new GOESLightcurve object. assert goeslc_new.data.temperature.all() == temp.value.all() assert goeslc_new.data.em.all() == em.value.all() # Check rest of data frame of new GOESLightCurve object is same # as that in original object. goeslc_revert = copy.deepcopy(goeslc_new) del goeslc_revert.data["temperature"] del goeslc_revert.data["em"] assert_frame_equal(goeslc_revert.data, goeslc.data) @pytest.mark.remote_data def test_goes_chianti_tem_errors(): # Define input variables. ratio = SHORTFLUX/LONGFLUX shortflux_toomany = Quantity( np.append(SHORTFLUX.value, SHORTFLUX.value[0]), unit="W/m**2") shortflux_toosmall = copy.deepcopy(SHORTFLUX) shortflux_toosmall.value[0] = -1 shortflux_toobig = copy.deepcopy(SHORTFLUX) shortflux_toobig.value[0] = 1 temp_test = Quantity(np.zeros(len(LONGFLUX))+10, unit="MK") temp_test_toomany = Quantity(np.append(temp_test.value, 0), unit="MK") temp_test_toosmall = copy.deepcopy(temp_test) temp_test_toosmall.value[0] = -1 temp_test_toobig = copy.deepcopy(temp_test) temp_test_toobig.value[0] = 101 # First test correct exceptions are raised if incorrect inputs are # entered. with pytest.raises(ValueError): temp, em = goes._goes_chianti_tem(LONGFLUX, SHORTFLUX, satellite=-1) with pytest.raises(ValueError): temp, em = goes._goes_chianti_tem(LONGFLUX, shortflux_toomany) with pytest.raises(ValueError): temp = goes._goes_get_chianti_temp(ratio, satellite=-1) with pytest.raises(ValueError): temp, em = goes._goes_chianti_tem(LONGFLUX, SHORTFLUX, abundances="Neither") with pytest.raises(ValueError): temp = goes._goes_get_chianti_temp(ratio, abundances="Neither") with pytest.raises(ValueError): temp, em = goes._goes_chianti_tem(LONGFLUX, shortflux_toobig) with pytest.raises(ValueError): em = goes._goes_get_chianti_em(LONGFLUX, temp_test, satellite=-1) with pytest.raises(ValueError): em = goes._goes_get_chianti_em(LONGFLUX, temp_test, abundances="Neither") with pytest.raises(ValueError): em = goes._goes_get_chianti_em(LONGFLUX, temp_test, abundances="Neither") with pytest.raises(ValueError): em = goes._goes_get_chianti_em(LONGFLUX, temp_test_toosmall) with pytest.raises(ValueError): em = goes._goes_get_chianti_em(LONGFLUX, temp_test_toobig) @pytest.mark.remote_data def test_goes_chianti_tem_case1(): # test case 1: satellite > 7, abundances = coronal temp1, em1 = goes._goes_chianti_tem(LONGFLUX, SHORTFLUX, satellite=15, date=DATE) np.testing.assert_allclose(temp1, Quantity([11.28], unit="MK"), rtol=0.01) assert all(em1 < Quantity([4.79e+48], unit="1/cm**3")) and \ em1 > Quantity([4.78e+48], unit="1/cm**3") @pytest.mark.remote_data def test_goes_chianti_tem_case2(): # test case 2: satellite > 7, abundances = photospheric temp2, em2 = goes._goes_chianti_tem(LONGFLUX, SHORTFLUX, satellite=15, date=DATE, abundances="photospheric") assert all(temp2 < Quantity([10.25], unit="MK")) and \ all(temp2 > Quantity([10.24], unit="MK")) assert all(em2 < Quantity([1.12e+49], unit="1/cm**3")) and \ all(em2 > Quantity([1.11e+49], unit="1/cm**3")) @pytest.mark.remote_data def test_goes_chianti_tem_case3(): # test case 3: satellite < 8 and != 6, abundances = coronal temp3, em3 = goes._goes_chianti_tem(LONGFLUX, SHORTFLUX, satellite=5, date=DATE, abundances="coronal") assert all(temp3 < Quantity([11.43], unit="MK")) and \ all(temp3 > Quantity([11.42], unit="MK")) assert all(em3 < Quantity([3.85e+48], unit="1/cm**3")) and \ all(em3 > Quantity([3.84e+48], unit="1/cm**3")) @pytest.mark.remote_data def test_goes_chianti_tem_case4(): # test case 4: satellite < 8 and != 6, abundances = photospheric temp4, em4 = goes._goes_chianti_tem(LONGFLUX, SHORTFLUX, satellite=5, date=DATE, abundances="photospheric") assert all(temp4 < Quantity([10.42], unit="MK")) and \ all(temp4 > Quantity([10.41], unit="MK")) assert all(em4 < Quantity(8.81e+48, unit="1/cm**3")) and \ all(em4 > Quantity(8.80e+48, unit="1/cm**3")) @pytest.mark.remote_data def test_goes_chianti_tem_case5(): # test case 5: satellite = 6, date < 1983-06-28, abundances = coronal temp5, em5 = goes._goes_chianti_tem(LONGFLUX, SHORTFLUX, satellite=6, date="1983-06-27", abundances="coronal") assert all(temp5 < Quantity(12.30, unit="MK")) and \ all(temp5 > Quantity(12.29, unit="MK")) assert all(em5 < Quantity(3.13e+48, unit="1/cm**3")) and \ all(em5 > Quantity(3.12e+48, unit="1/cm**3")) @pytest.mark.remote_data def test_goes_chianti_tem_case6(): # test case 6: satellite = 6, date < 1983-06-28, abundances = photospheric temp6, em6 = goes._goes_chianti_tem(LONGFLUX, SHORTFLUX, satellite=6, date="1983-06-27", abundances="photospheric") assert all(temp6 < Quantity(11.44, unit="MK")) and \ all(temp6 > Quantity(11.43, unit="MK")) assert all(em6 < Quantity(6.74e+48, unit="1/cm**3")) and \ all(em6 > Quantity(6.73e+48, unit="1/cm**3")) @pytest.mark.remote_data def test_goes_chianti_tem_case7(): # test case 7: satellite = 6, date > 1983-06-28, abundances = coronal temp7, em7 = goes._goes_chianti_tem(LONGFLUX, SHORTFLUX, satellite=6, date=DATE, abundances="coronal") assert all(temp7 < Quantity(11.34, unit="MK")) and \ all(temp7 > Quantity(11.33, unit="MK")) assert all(em7 < Quantity(4.08e+48, unit="1/cm**3")) and \ all(em7 > Quantity(4.07e+48, unit="1/cm**3")) @pytest.mark.remote_data def test_goes_chianti_tem_case8(): # test case 8: satellite = 6, date > 1983-06-28, abundances = photospheric temp8, em8 = goes._goes_chianti_tem(LONGFLUX, SHORTFLUX, satellite=6, date=DATE, abundances="photospheric") assert all(temp8 < Quantity(10.36, unit="MK")) and \ all(temp8 > Quantity(10.35, unit="MK")) assert all(em8 < Quantity(9.39e+48, unit="1/cm**3")) and \ all(em8 > Quantity(9.38e+48, unit="1/cm**3")) @pytest.mark.remote_data def test_calculate_radiative_loss_rate(): # Define input variables. goeslc_input = lightcurve.GOESLightCurve.create("2014-01-01 00:00:00", "2014-01-01 00:00:10") not_goeslc = [] goeslc_no_em = goes.calculate_temperature_em(goeslc_input) del goeslc_no_em.data["em"] # Check correct exceptions are raised to incorrect inputs with pytest.raises(TypeError): goes_test = goes.calculate_radiative_loss_rate(not_goeslc) # Check function gives correct results. # Test case 1: GOESLightCurve object with only flux data goeslc_test = goes.calculate_radiative_loss_rate(goeslc_input) goeslc_expected = goes.calculate_temperature_em(goeslc_input) goeslc_expected.data["rad_loss_rate"] = \ np.array([5.44914366e+19, 5.44914366e+19, 5.43465905e+19, 5.38282295e+19, 5.42019309e+19]) assert_frame_equal(goeslc_test.data, goeslc_expected.data) # Test case 2: GOESLightCurve object with flux and temperature # data, but no EM data. goes_test = goes.calculate_radiative_loss_rate(goeslc_no_em) assert_frame_equal(goeslc_test.data, goeslc_expected.data) @pytest.mark.remote_data def test_calc_rad_loss_errors(): # Define input variables temp = 11.0 * Quantity(np.ones(6), unit="MK") em = 4.0e+48 * Quantity(np.ones(6), unit="1/cm**3") obstime = np.array([datetime.datetime(2014, 1, 1, 0, 0, 0), datetime.datetime(2014, 1, 1, 0, 0, 2), datetime.datetime(2014, 1, 1, 0, 0, 4), datetime.datetime(2014, 1, 1, 0, 0, 6), datetime.datetime(2014, 1, 1, 0, 0, 8), datetime.datetime(2014, 1, 1, 0, 0, 10)], dtype=object) temp_toolong = Quantity(np.append(temp.value, 0), unit="MK") obstime_toolong = np.array([datetime.datetime(2014, 1, 1, 0, 0, 0), datetime.datetime(2014, 1, 1, 0, 0, 2), datetime.datetime(2014, 1, 1, 0, 0, 4), datetime.datetime(2014, 1, 1, 0, 0, 6), datetime.datetime(2014, 1, 1, 0, 0, 8), datetime.datetime(2014, 1, 1, 0, 0, 10), datetime.datetime(2014, 1, 1, 0, 0, 12)], dtype=object) obstime_nonchrono = copy.deepcopy(obstime) obstime_nonchrono[1] = obstime[-1] obstime_nonchrono[-1] = obstime[1] obstime_notdatetime = copy.deepcopy(obstime) obstime_notdatetime[0] = 1 temp_outofrange = Quantity([101, 11.0, 11.0, 11.0, 11.0, 11.0], unit="MK") # Ensure correct exceptions are raised. with pytest.raises(ValueError): rad_loss_test = goes._calc_rad_loss(temp_toolong, em, obstime) with pytest.raises(ValueError): rad_loss_test = goes._calc_rad_loss(temp_outofrange, em, obstime) with pytest.raises(IOError): rad_loss_test = goes._calc_rad_loss(temp, em, obstime_toolong) with pytest.raises(TypeError): lx_test = goes._calc_rad_loss(temp, em, obstime_notdatetime) with pytest.raises(ValueError): rad_loss_test = goes._calc_rad_loss(temp, em, obstime_nonchrono) @pytest.mark.remote_data def test_calc_rad_loss_nokwags(): # Define input variables temp = Quantity([11.0, 11.0, 11.0, 11.0, 11.0, 11.0], unit="MK") em = Quantity([4.0e+48, 4.0e+48, 4.0e+48, 4.0e+48, 4.0e+48, 4.0e+48], unit="1/cm**3") obstime = np.array([datetime.datetime(2014, 1, 1, 0, 0, 0), datetime.datetime(2014, 1, 1, 0, 0, 2), datetime.datetime(2014, 1, 1, 0, 0, 4), datetime.datetime(2014, 1, 1, 0, 0, 6), datetime.datetime(2014, 1, 1, 0, 0, 8), datetime.datetime(2014, 1, 1, 0, 0, 10)], dtype=object) # Test output is correct when no kwags are set. rad_loss_test = goes._calc_rad_loss(temp[:2], em[:2]) rad_loss_expected = {"rad_loss_rate": 3.01851392e+19 * Quantity(np.ones(2), unit="J/s")} assert sorted(rad_loss_test.keys()) == sorted(rad_loss_expected.keys()) assert_quantity_allclose(rad_loss_test["rad_loss_rate"], rad_loss_expected["rad_loss_rate"], rtol=0.01) @pytest.mark.remote_data def test_calc_rad_loss_obstime(): # Define input variables temp = Quantity([11.0, 11.0, 11.0, 11.0, 11.0, 11.0], unit="MK") em = Quantity([4.0e+48, 4.0e+48, 4.0e+48, 4.0e+48, 4.0e+48, 4.0e+48], unit="1/cm**3") obstime = np.array([datetime.datetime(2014, 1, 1, 0, 0, 0), datetime.datetime(2014, 1, 1, 0, 0, 2), datetime.datetime(2014, 1, 1, 0, 0, 4), datetime.datetime(2014, 1, 1, 0, 0, 6), datetime.datetime(2014, 1, 1, 0, 0, 8), datetime.datetime(2014, 1, 1, 0, 0, 10)], dtype=object) # Test output is correct when obstime and cumulative kwargs are set. rad_loss_test = goes._calc_rad_loss(temp, em, obstime) rad_loss_expected = { "rad_loss_rate": 3.01851392e+19 * Quantity(np.ones(6), unit="J/s"), "rad_loss_int": Quantity(3.01851392e+20, unit="J"), "rad_loss_cumul": Quantity([6.03702783e+19, 1.20740557e+20, 1.81110835e+20, 2.41481113e+20, 3.01851392e+20], unit="J") } assert sorted(rad_loss_test.keys()) == sorted(rad_loss_expected.keys()) assert_quantity_allclose(rad_loss_test["rad_loss_rate"], rad_loss_expected["rad_loss_rate"], rtol=0.0001) assert_quantity_allclose(rad_loss_test["rad_loss_int"], rad_loss_expected["rad_loss_int"], rtol=0.0001) assert_quantity_allclose(rad_loss_test["rad_loss_cumul"], rad_loss_expected["rad_loss_cumul"], rtol=0.0001) @pytest.mark.remote_data def test_calculate_xray_luminosity(): # Check correct exceptions are raised to incorrect inputs not_goeslc = [] with pytest.raises(TypeError): goes_test = goes.calculate_xray_luminosity(not_goeslc) # Check function gives correct results. goeslc_input = lightcurve.GOESLightCurve.create("2014-01-01 00:00:00", "2014-01-01 00:00:10") goeslc_test = goes.calculate_xray_luminosity(goeslc_input) goeslc_expected = copy.deepcopy(goeslc_input) goeslc_expected.data["luminosity_xrsa"] = \ Quantity(np.array([2.49831950e+16, 2.49831950e+16, 2.49831950e+16, 2.52864004e+16, 2.49831950e+16], dtype="float32"), unit="J/s") goeslc_expected.data["luminosity_xrsb"] = \ Quantity(np.array([9.54399250e+17, 9.54399250e+17, 9.52985195e+17, 9.52985195e+17, 9.51571139e+17], dtype="float32"), unit="J/s") assert_frame_equal(goeslc_test.data, goeslc_expected.data, check_less_precise=True) def test_goes_lx_errors(): # Define input values of flux and time. longflux = 7e-6 * Quantity(np.ones(6), unit="W/m**2") shortflux = 7e-7 * Quantity(np.ones(6), unit="W/m**2") obstime = np.array([datetime.datetime(2014, 1, 1, 0, 0, 0), datetime.datetime(2014, 1, 1, 0, 0, 2), datetime.datetime(2014, 1, 1, 0, 0, 4), datetime.datetime(2014, 1, 1, 0, 0, 6), datetime.datetime(2014, 1, 1, 0, 0, 8), datetime.datetime(2014, 1, 1, 0, 0, 10)], dtype=object) longflux_toolong = Quantity(np.append(longflux.value, 0), unit=longflux.unit) obstime_nonchrono = copy.deepcopy(obstime) obstime_nonchrono[1] = obstime[-1] obstime_notdatetime = copy.deepcopy(obstime) obstime_notdatetime[0] = 1 # Ensure correct exceptions are raised. with pytest.raises(ValueError): lx_test = goes._goes_lx(longflux_toolong, shortflux, obstime) with pytest.raises(TypeError): lx_test = goes._goes_lx(longflux, shortflux, obstime_notdatetime) with pytest.raises(ValueError): lx_test = goes._goes_lx(longflux, shortflux, obstime_nonchrono) def test_goes_lx_nokwargs(): # Define input values of flux and time. longflux = Quantity([7e-6, 7e-6, 7e-6, 7e-6, 7e-6, 7e-6], unit="W/m**2") shortflux = Quantity([7e-7, 7e-7, 7e-7, 7e-7, 7e-7, 7e-7], unit="W/m**2") # Test output when no kwargs are set. lx_test = goes._goes_lx(longflux[:2], shortflux[:2]) lx_expected = {"longlum": Quantity([1.98649103e+18, 1.98649103e+18], unit="W"), "shortlum": Quantity([1.98649103e+17, 1.98649103e+17], unit="W")} assert sorted(lx_test.keys()) == sorted(lx_expected.keys()) assert_quantity_allclose(lx_test["longlum"], lx_expected["longlum"], rtol=0.1) assert_quantity_allclose(lx_test["shortlum"], lx_expected["shortlum"], rtol=0.1) def test_goes_lx_date(): # Define input values of flux and time. longflux = Quantity([7e-6, 7e-6, 7e-6, 7e-6, 7e-6, 7e-6], unit="W/m**2") shortflux = Quantity([7e-7, 7e-7, 7e-7, 7e-7, 7e-7, 7e-7], unit="W/m**2") # Test output when date kwarg is set. lx_test = goes._goes_lx(longflux[:2], shortflux[:2], date="2014-04-21") lx_expected = {"longlum": Quantity([1.98649103e+18, 1.98649103e+18], unit="W"), "shortlum": Quantity([1.98649103e+17, 1.98649103e+17], unit="W")} assert sorted(lx_test.keys()) == sorted(lx_expected.keys()) assert_quantity_allclose(lx_test["longlum"], lx_expected["longlum"], rtol=0.001) assert_quantity_allclose(lx_test["shortlum"], lx_expected["shortlum"], rtol=0.001) def test_goes_lx_obstime(): # Define input values of flux and time. longflux = Quantity([7e-6, 7e-6, 7e-6, 7e-6, 7e-6, 7e-6], unit="W/m**2") shortflux = Quantity([7e-7, 7e-7, 7e-7, 7e-7, 7e-7, 7e-7], unit="W/m**2") obstime = np.array([datetime.datetime(2014, 1, 1, 0, 0, 0), datetime.datetime(2014, 1, 1, 0, 0, 2), datetime.datetime(2014, 1, 1, 0, 0, 4), datetime.datetime(2014, 1, 1, 0, 0, 6), datetime.datetime(2014, 1, 1, 0, 0, 8), datetime.datetime(2014, 1, 1, 0, 0, 10)], dtype=object) # Test output when obstime and cumulative kwargs are set. lx_test = goes._goes_lx(longflux, shortflux, obstime) lx_expected = { "longlum": 1.96860565e+18 * Quantity(np.ones(6), unit='W'), "shortlum": 1.96860565e+17 * Quantity(np.ones(6), unit='W'), "longlum_int": Quantity([1.96860565e+19], unit="J"), "shortlum_int": Quantity([1.96860565e+18], unit="J"), "longlum_cumul": Quantity([3.93721131e+18, 7.87442262e+18, 1.18116339e+19, 1.57488452e+19, 1.96860565e+19], unit="J"), "shortlum_cumul": Quantity([3.93721131e+17, 7.87442262e+17, 1.18116339e+18, 1.57488452e+18, 1.96860565e+18], unit="J")} assert sorted(lx_test.keys()) == sorted(lx_expected.keys()) assert_quantity_allclose(lx_test["longlum"], lx_expected["longlum"], rtol=0.1) assert_quantity_allclose(lx_test["shortlum"], lx_expected["shortlum"], rtol=0.1) assert_quantity_allclose(lx_test["longlum_int"], lx_expected["longlum_int"], rtol=0.1) assert_quantity_allclose(lx_test["shortlum_int"], lx_expected["shortlum_int"], rtol=0.1) assert_quantity_allclose(lx_test["longlum_cumul"], lx_expected["longlum_cumul"], rtol=0.1) assert_quantity_allclose(lx_test["shortlum_cumul"], lx_expected["shortlum_cumul"], rtol=0.1) def test_flux_to_classletter(): """Test converting fluxes into a class letter""" fluxes = Quantity(10**(-np.arange(9, 2., -1)), 'W/m**2') classesletter = ['A', 'A', 'B', 'C', 'M', 'X', 'X'] calculated_classesletter = [goes.flux_to_flareclass(f)[0] for f in fluxes] calculated_classnumber = [float(goes.flux_to_flareclass(f)[1:]) for f in fluxes] assert_array_equal(classesletter, calculated_classesletter) assert_array_equal([0.1, 1, 1, 1, 1, 1, 10], calculated_classnumber) # now test the Examples assert goes.flux_to_flareclass(1e-08 * u.watt/u.m**2) == 'A1' assert goes.flux_to_flareclass(0.00682 * u.watt/u.m**2) == 'X68.2' assert goes.flux_to_flareclass(7.8e-09 * u.watt/u.m**2) == 'A0.78' assert goes.flux_to_flareclass(0.00024 * u.watt/u.m**2) == 'X2.4' assert goes.flux_to_flareclass(4.7e-06 * u.watt/u.m**2) == 'C4.7' assert goes.flux_to_flareclass(6.9e-07 * u.watt/u.m**2) == 'B6.9' assert goes.flux_to_flareclass(2.1e-05 * u.watt/u.m**2) == 'M2.1' def test_class_to_flux(): classes = ['A3.49', 'A0.23', 'M1', 'X2.3', 'M5.8', 'C2.3', 'B3.45', 'X20'] results = Quantity([3.49e-8, 2.3e-9, 1e-5, 2.3e-4, 5.8e-5, 2.3e-6, 3.45e-7, 2e-3], 'W/m2') for c, r in zip(classes, results): assert_almost_equal(r.value, goes.flareclass_to_flux(c).value) def test_joint_class_to_flux(): classes = ['A3.49', 'A0.23', 'M1', 'X2.3', 'M5.8', 'C2.3', 'B3.45', 'X20'] for c in classes: assert c == goes.flux_to_flareclass(goes.flareclass_to_flux(c)) # TODO add a test to check for raising error sunpy-0.8.3/sunpy/instr/tests/test_iris.py0000644000175000001440000000222313203275053020117 0ustar nabil00000000000000# -*- coding: utf-8 -*- import os import numpy as np import sunpy.data.test import sunpy.map from sunpy.instr import iris def test_SJI_to_cube(): test_data = os.path.join(sunpy.data.test.rootdir,'iris_l2_20130801_074720_4040000014_SJI_1400_t000.fits') iris_cube = iris.SJI_to_cube(test_data, start=0, stop=None, hdu=0) assert isinstance(iris_cube, sunpy.map.MapCube) assert isinstance(iris_cube.maps[0], sunpy.map.sources.SJIMap) assert len(iris_cube.maps) == 2 assert iris_cube.maps[0].meta['DATE-OBS'] != iris_cube.maps[1].meta['DATE-OBS'] def test_iris_rot(): test_data = os.path.join(sunpy.data.test.rootdir,'iris_l2_20130801_074720_4040000014_SJI_1400_t000.fits') iris_cube = iris.SJI_to_cube(test_data, start=0, stop=None, hdu=0) irismap = iris_cube.maps[0] irismap_rot = irismap.rotate() assert isinstance(irismap_rot, sunpy.map.sources.SJIMap) np.testing.assert_allclose(irismap_rot.meta['pc1_1'], 1) np.testing.assert_allclose(irismap_rot.meta['pc1_2'], 0, atol=1e-7) np.testing.assert_allclose(irismap_rot.meta['pc2_1'], 0, atol=1e-7) np.testing.assert_allclose(irismap_rot.meta['pc2_2'], 1) sunpy-0.8.3/sunpy/instr/tests/test_lyra.py0000644000175000017500000004761713231613137021152 0ustar nabilnabil00000000000000from __future__ import absolute_import, division import tempfile import os.path import pytest import datetime import numpy as np import pandas from sunpy.data.test import rootdir from sunpy.time import parse_time from sunpy import lightcurve from sunpy import timeseries from sunpy.instr import lyra from sunpy.extern.six.moves import range # Define location for test LYTAF database files TEST_DATA_PATH = rootdir # Define some test data for test_remove_lytaf_events() TIME = np.array([datetime.datetime(2013, 2, 1) + datetime.timedelta(minutes=i) for i in range(120)]) CHANNELS = [np.zeros(len(TIME)) + 0.4, np.zeros(len(TIME)) + 0.1] EMPTY_LYTAF = np.empty((0,), dtype=[("insertion_time", object), ("begin_time", object), ("reference_time", object), ("end_time", object), ("event_type", object), ("event_definition", object)]) LYTAF_TEST = np.append( EMPTY_LYTAF, np.array([(datetime.datetime.utcfromtimestamp(1371459961), datetime.datetime.utcfromtimestamp(1359677220), datetime.datetime.utcfromtimestamp(1359677250), datetime.datetime.utcfromtimestamp(1359677400), "LAR", "Large Angle Rotation.")], dtype=EMPTY_LYTAF.dtype)) LYTAF_TEST = np.append( LYTAF_TEST, np.array([(datetime.datetime.utcfromtimestamp(1371460063), datetime.datetime.utcfromtimestamp(1359681764), datetime.datetime.utcfromtimestamp(1359682450), datetime.datetime.utcfromtimestamp(1359683136), "UV occ.", "Occultation in the UV spectrum.")], dtype=LYTAF_TEST.dtype)) @pytest.mark.remote_data def test_split_series_using_lytaf(): '''test the downloading of the LYTAF file and subsequent queries''' tmp_dir = tempfile.mkdtemp() lyra.download_lytaf_database(lytaf_dir=tmp_dir) assert os.path.exists(os.path.join(tmp_dir, 'annotation_ppt.db')) # test split_series_using_lytaf # construct a dummy signal for testing purposes basetime = parse_time('2010-06-13 02:00') seconds = 3600 dummy_time = [basetime + datetime.timedelta(0, s) for s in range(seconds)] dummy_data = np.random.random(seconds) lytaf_tmp = lyra.get_lytaf_events('2010-06-13 02:00', '2010-06-13 06:00', lytaf_path=tmp_dir, combine_files=["ppt"]) split = lyra.split_series_using_lytaf(dummy_time, dummy_data, lytaf_tmp) assert type(split) == list assert len(split) == 4 assert split[0]['subtimes'][0] == datetime.datetime(2010, 6, 13, 2, 0) assert split[0]['subtimes'][-1] == datetime.datetime(2010, 6, 13, 2, 7, 2) assert split[3]['subtimes'][0] == datetime.datetime(2010, 6, 13, 2, 59, 41) assert split[3]['subtimes'][-1] == datetime.datetime(2010, 6, 13, 2, 59, 58) # Test case when no LYTAF events found in time series. split_no_lytaf = lyra.split_series_using_lytaf(dummy_time, dummy_data, LYTAF_TEST) assert type(split_no_lytaf) == list assert type(split_no_lytaf[0]) == dict assert not set(split_no_lytaf[0].keys()).symmetric_difference({'subtimes', 'subdata'}) assert split_no_lytaf[0]["subtimes"] == dummy_time assert split_no_lytaf[0]["subdata"].all() == dummy_data.all() @pytest.fixture def get_lyradata(dtype): if dtype == 'lc': # Create sample LYRALightCurve lyrats = lightcurve.LYRALightCurve.create("2014-01-01") lyrats.data = pandas.DataFrame(index=TIME, data={"CHANNEL1": CHANNELS[0], "CHANNEL2": CHANNELS[1], "CHANNEL3": CHANNELS[0], "CHANNEL4": CHANNELS[1]}) else: # Create sample TimeSeries lyrats = timeseries.TimeSeries( os.path.join(rootdir, 'lyra_20150101-000000_lev3_std_truncated.fits.gz'), source='LYRA') lyrats.data = pandas.DataFrame(index=TIME, data={"CHANNEL1": CHANNELS[0], "CHANNEL2": CHANNELS[1], "CHANNEL3": CHANNELS[0], "CHANNEL4": CHANNELS[1]}) return lyrats @pytest.mark.remote_data @pytest.mark.parametrize('dtype', ['ts', 'lc']) def test_remove_lytaf_events_from_timeseries(dtype): """Test if artefacts are correctly removed from a TimeSeries. Also test LYRALightCurve for backwards compatibility.""" # Check correct errors are raised due to bad input with pytest.raises(AttributeError): ts_test = lyra.remove_lytaf_events_from_timeseries( [], lytaf_path=TEST_DATA_PATH, force_use_local_lytaf=True) # Run remove_artifacts_from_timeseries, returning artifact # status ts = get_lyradata(dtype) ts_test, artifact_status_test = \ lyra.remove_lytaf_events_from_timeseries( ts, artifacts=["LAR", "Offpoint"], return_artifacts=True, lytaf_path=TEST_DATA_PATH, force_use_local_lytaf=True) # Generate expected data by calling _remove_lytaf_events and # constructing expected dataframe manually. time, channels, artifact_status_expected = lyra._remove_lytaf_events( ts.data.index, channels=[np.asanyarray(ts.data["CHANNEL1"]), np.asanyarray(ts.data["CHANNEL2"]), np.asanyarray(ts.data["CHANNEL3"]), np.asanyarray(ts.data["CHANNEL4"])], artifacts=["LAR", "Offpoint"], return_artifacts=True, lytaf_path=TEST_DATA_PATH, force_use_local_lytaf=True) dataframe_expected = pandas.DataFrame(index=time, data={"CHANNEL1": channels[0], "CHANNEL2": channels[1], "CHANNEL3": channels[2], "CHANNEL4": channels[3]}) # Assert expected result is returned pandas.util.testing.assert_frame_equal(ts_test.data, dataframe_expected) assert artifact_status_test.keys() == artifact_status_expected.keys() np.testing.assert_array_equal(artifact_status_test["lytaf"], artifact_status_expected["lytaf"]) np.testing.assert_array_equal(artifact_status_test["removed"], artifact_status_expected["removed"]) np.testing.assert_array_equal(artifact_status_test["not_removed"], artifact_status_expected["not_removed"]) assert artifact_status_test["not_found"] == \ artifact_status_expected["not_found"] # Run remove_artifacts_from_timeseries, without returning # artifact status ts_test = \ lyra.remove_lytaf_events_from_timeseries( ts, artifacts=["LAR", "Offpoint"], lytaf_path=TEST_DATA_PATH, force_use_local_lytaf=True) # Assert expected result is returned pandas.util.testing.assert_frame_equal(ts_test.data, dataframe_expected) def test_remove_lytaf_events_1(): """Test _remove_lytaf_events() with some artifacts found and others not.""" # Run _remove_lytaf_events time_test, channels_test, artifacts_status_test = \ lyra._remove_lytaf_events( TIME, channels=CHANNELS, artifacts=["LAR", "Offpoint"], return_artifacts=True, lytaf_path=TEST_DATA_PATH, force_use_local_lytaf=True) # Generated expected result bad_indices = np.logical_and(TIME >= LYTAF_TEST["begin_time"][0], TIME <= LYTAF_TEST["end_time"][0]) bad_indices = np.arange(len(TIME))[bad_indices] time_expected = np.delete(TIME, bad_indices) channels_expected = [np.delete(CHANNELS[0], bad_indices), np.delete(CHANNELS[1], bad_indices)] artifacts_status_expected = {"lytaf": LYTAF_TEST, "removed": LYTAF_TEST[0], "not_removed": LYTAF_TEST[1], "not_found": ["Offpoint"]} # Assert test values are same as expected assert time_test.all() == time_expected.all() assert (channels_test[0]).all() == (channels_expected[0]).all() assert (channels_test[1]).all() == (channels_expected[1]).all() assert artifacts_status_test.keys() == artifacts_status_expected.keys() np.testing.assert_array_equal(artifacts_status_test["lytaf"], artifacts_status_expected["lytaf"]) np.testing.assert_array_equal(artifacts_status_test["removed"], artifacts_status_expected["removed"]) np.testing.assert_array_equal(artifacts_status_test["not_removed"], artifacts_status_expected["not_removed"]) assert artifacts_status_test["not_found"] == \ artifacts_status_expected["not_found"] # Test that correct values are returned when channels kwarg not # supplied. # Run _remove_lytaf_events time_test, artifacts_status_test = \ lyra._remove_lytaf_events( TIME, artifacts=["LAR", "Offpoint"], return_artifacts=True, lytaf_path=TEST_DATA_PATH, force_use_local_lytaf=True) # Assert test values are same as expected assert time_test.all() == time_expected.all() assert artifacts_status_test.keys() == artifacts_status_expected.keys() np.testing.assert_array_equal(artifacts_status_test["lytaf"], artifacts_status_expected["lytaf"]) np.testing.assert_array_equal(artifacts_status_test["removed"], artifacts_status_expected["removed"]) np.testing.assert_array_equal(artifacts_status_test["not_removed"], artifacts_status_expected["not_removed"]) assert artifacts_status_test["not_found"] == \ artifacts_status_expected["not_found"] def test_remove_lytaf_events_2(): """Test _remove_lytaf_events() with no user artifacts found.""" # Run _remove_lytaf_events time_test, channels_test, artifacts_status_test = \ lyra._remove_lytaf_events( TIME, channels=CHANNELS, artifacts="Offpoint", return_artifacts=True, lytaf_path=TEST_DATA_PATH, force_use_local_lytaf=True) # Generated expected result time_expected = TIME channels_expected = CHANNELS artifacts_status_expected = {"lytaf": LYTAF_TEST, "removed": EMPTY_LYTAF, "not_removed": LYTAF_TEST, "not_found": ["Offpoint"]} # Assert test values are same as expected assert time_test.all() == time_expected.all() assert (channels_test[0]).all() == (channels_expected[0]).all() assert (channels_test[1]).all() == (channels_expected[1]).all() assert artifacts_status_test.keys() == artifacts_status_expected.keys() np.testing.assert_array_equal(artifacts_status_test["lytaf"], artifacts_status_expected["lytaf"]) np.testing.assert_array_equal(artifacts_status_test["removed"], artifacts_status_expected["removed"]) np.testing.assert_array_equal(artifacts_status_test["not_removed"], artifacts_status_expected["not_removed"]) assert artifacts_status_test["not_found"] == \ artifacts_status_expected["not_found"] # Test correct values are returned when return_artifacts kwarg not # supplied. # Case 1: channels kwarg is True # Run _remove_lytaf_events time_test, channels_test = lyra._remove_lytaf_events( TIME, channels=CHANNELS, artifacts=["Offpoint"], lytaf_path=TEST_DATA_PATH, force_use_local_lytaf=True) assert time_test.all() == time_expected.all() assert (channels_test[0]).all() == (channels_expected[0]).all() assert (channels_test[1]).all() == (channels_expected[1]).all() # Case 2: channels kwarg is False # Run _remove_lytaf_events time_test = lyra._remove_lytaf_events( TIME, artifacts=["Offpoint"], lytaf_path=TEST_DATA_PATH, force_use_local_lytaf=True) assert time_test.all() == time_expected.all() def test_remove_lytaf_events_3(): """Test if correct errors are raised by _remove_lytaf_events().""" with pytest.raises(TypeError): lyra._remove_lytaf_events(TIME, channels=6, artifacts=["LAR"], lytaf_path=TEST_DATA_PATH, force_use_local_lytaf=True) with pytest.raises(ValueError): lyra._remove_lytaf_events(TIME, lytaf_path=TEST_DATA_PATH, force_use_local_lytaf=True) with pytest.raises(TypeError): lyra._remove_lytaf_events(TIME, artifacts=[6], lytaf_path=TEST_DATA_PATH, force_use_local_lytaf=True) with pytest.raises(ValueError): lyra._remove_lytaf_events(TIME, artifacts=["LAR", "incorrect artifact type"], lytaf_path=TEST_DATA_PATH, force_use_local_lytaf=True) def test_get_lytaf_events(): """Test if LYTAF events are correctly downloaded and read in.""" # Run get_lytaf_events lytaf_test = lyra.get_lytaf_events("2008-01-01", "2014-01-01", lytaf_path=TEST_DATA_PATH, force_use_local_lytaf=True) # Form expected result of extract_combined_lytaf insertion_time = [datetime.datetime.utcfromtimestamp(1371459961), datetime.datetime.utcfromtimestamp(1371460063), datetime.datetime.utcfromtimestamp(1371460411), datetime.datetime.utcfromtimestamp(1371460493), datetime.datetime.utcfromtimestamp(1371460403), datetime.datetime.utcfromtimestamp(1371470988), datetime.datetime.utcfromtimestamp(1371211791), datetime.datetime.utcfromtimestamp(1371212303)] begin_time = [datetime.datetime.utcfromtimestamp(1359677220), datetime.datetime.utcfromtimestamp(1359681764), datetime.datetime.utcfromtimestamp(1360748513), datetime.datetime.utcfromtimestamp(1361115900), datetime.datetime.utcfromtimestamp(1361980964), datetime.datetime.utcfromtimestamp(1368581100), datetime.datetime.utcfromtimestamp(1371032084), datetime.datetime.utcfromtimestamp(1371158167)] reference_time = [datetime.datetime.utcfromtimestamp(1359677250), datetime.datetime.utcfromtimestamp(1359682450), datetime.datetime.utcfromtimestamp(1360751528), datetime.datetime.utcfromtimestamp(1361116200), datetime.datetime.utcfromtimestamp(1361983979), datetime.datetime.utcfromtimestamp(1368582480), datetime.datetime.utcfromtimestamp(1371045475), datetime.datetime.utcfromtimestamp(1371162600)] end_time = [datetime.datetime.utcfromtimestamp(1359677400), datetime.datetime.utcfromtimestamp(1359683136), datetime.datetime.utcfromtimestamp(1360754543), datetime.datetime.utcfromtimestamp(1361116320), datetime.datetime.utcfromtimestamp(1361986994), datetime.datetime.utcfromtimestamp(1368583080), datetime.datetime.utcfromtimestamp(1371050025), datetime.datetime.utcfromtimestamp(1371167100)] event_type = [u"LAR", u"UV occ.", u"Vis LED on", u"M Flare", u"UV LED on", u"X Flare", u"Off-limb event", u"Unexplained feature"] event_description = [u"Large Angle Rotation.", u"Occultation in the UV spectrum.", u"Visual LED is turned on.", u"M class solar flare.", u"UV LED is turned on.", u"X class solar flare.", u"Off-limb event in SWAP.", u"Unexplained feature."] lytaf_expected = np.empty((8,), dtype=[("insertion_time", object), ("begin_time", object), ("reference_time", object), ("end_time", object), ("event_type", object), ("event_definition", object)]) lytaf_expected["insertion_time"] = insertion_time lytaf_expected["begin_time"] = begin_time lytaf_expected["reference_time"] = reference_time lytaf_expected["end_time"] = end_time lytaf_expected["event_type"] = event_type lytaf_expected["event_definition"] = event_description # Assert that extract_combined_lytaf gives the right result np.testing.assert_array_equal(lytaf_test, lytaf_expected) # Check correct error is raised if names of different lytaf files # are incorrectly input. with pytest.raises(ValueError): lytaf_test = lyra.get_lytaf_events("2008-01-01", "2014-01-01", lytaf_path="test_data", combine_files=["gigo"], force_use_local_lytaf=True) def test_get_lytaf_event_types(): """Test that LYTAF event types are printed.""" lyra.get_lytaf_event_types(lytaf_path=TEST_DATA_PATH) def test_lytaf_event2string(): """Test _lytaf_event2string() associates correct numbers and events.""" out_test = lyra._lytaf_event2string(list(range(12))) assert out_test == ['LAR', 'N/A', 'UV occult.', 'Vis. occult.', 'Offpoint', 'SAA', 'Auroral zone', 'Moon in LYRA', 'Moon in SWAP', 'Venus in LYRA', 'Venus in SWAP'] out_test_single = lyra._lytaf_event2string(1) assert out_test_single == ['LAR'] def test_prep_columns(): """Test whether _prep_columns correctly prepares data.""" # Generate simple input data time_input = TIME[0:2] channels_input = [CHANNELS[0][0:2], CHANNELS[1][0:2]] filecolumns_input = ["time", "channel0", "channel1"] # Test case when channels and filecolumns are supplied by user. string_time_test, filecolumns_test = lyra._prep_columns( time_input, channels_input, filecolumns_input) # Generate expected output and verify _prep_columns() works string_time_expected = np.array([t.strftime("%Y-%m-%dT%H:%M:%S.%f") for t in time_input]) filecolumns_expected = ["time", "channel0", "channel1"] np.testing.assert_array_equal(string_time_test, string_time_expected) assert filecolumns_test == filecolumns_expected # Test case when channels supplied by user by not filecolumns string_time_test, filecolumns_test = lyra._prep_columns(time_input, channels_input) np.testing.assert_array_equal(string_time_test, string_time_expected) assert filecolumns_test == filecolumns_expected # Test case when neither channels nor filecolumns supplied by user string_time_test, filecolumns_test = lyra._prep_columns(time_input) np.testing.assert_array_equal(string_time_test, string_time_expected) assert filecolumns_test == ["time"] # Test correct exceptions are raised with pytest.raises(TypeError): string_time_test, filecolumns_test = lyra._prep_columns( time_input, channels_input, ["channel0", 1]) with pytest.raises(ValueError): string_time_test = lyra._prep_columns(time_input, filecolumns=filecolumns_input) sunpy-0.8.3/sunpy/instr/tests/test_rhessi.py0000644000175000017500000000503013232563447021470 0ustar nabilnabil00000000000000""" Because rhessi.py is code as well. """ import os import sunpy.map import sunpy.data.test import sunpy.instr.rhessi as rhessi import numpy as np import pytest from datetime import datetime testpath = sunpy.data.test.rootdir def test_backprojection(): amap = rhessi.backprojection(os.path.join(testpath, 'hsi_calib_ev_20020220_1106_20020220_1106_25_40.fits')) assert isinstance(amap, sunpy.map.GenericMap) assert amap.date == datetime(2002, 2, 20, 11, 6, 21) def test_get_obssumm_dbase_file(): with pytest.raises(ValueError): rhessi.get_obssumm_dbase_file(['2002/01/01', '2002/04/01']) @pytest.mark.remote_data def test_get_obssum_filename(): file_name = rhessi.get_obssum_filename(('2011/04/04', '2011/04/05')) # Irregardless of mirror server the osbsum file name should match assert file_name[0].split('metadata/catalog/')[1] == 'hsi_obssumm_20110404_042.fits' @pytest.mark.remote_data def test_parse_obssum_dbase_file(): file = rhessi.get_obssumm_dbase_file(('2011/04/04', '2011/04/05')) obssum = rhessi.parse_obssumm_dbase_file(file[0]) assert obssum['filename'][0] == 'hsi_obssumm_20110401_043.fit' assert obssum['filename'][-1] == 'hsi_obssumm_20110430_029.fit' assert obssum['orb_st'][0] == 0 assert obssum['orb_st'][-1] == 0 assert obssum['orb_end'][0] == 0 assert obssum['orb_end'][-1] == 0 assert obssum['start_time'][0] == datetime(2011, 4, 1, 0, 0, 0) assert obssum['start_time'][-1] == datetime(2011, 4, 30, 0, 0, 0) assert obssum['end_time'][0] == datetime(2011, 4, 2, 0, 0, 0) assert obssum['end_time'][-1] == datetime(2011, 5, 1, 0, 0, 0) assert obssum['status_flag'][0] == 0 assert obssum['status_flag'][-1] == 0 assert obssum['npackets'][0] == 0 assert obssum['npackets'][-1] == 0 @pytest.mark.remote_data def test_get_parse_obssum_file(): f = rhessi.get_obssumm_file(('2011/04/04', '2011/04/05')) # doctest: +SKIP header, _data = rhessi.parse_obssumm_file(f[0]) assert header.get('DATE_OBS') == '2011-04-04T00:00:00.000' assert header.get('DATE_END') == '2011-04-05T00:00:00.000' assert header.get('TELESCOP') == 'HESSI' def test_uncompress_countrate(): # Should only accept bytearr (uncompressed counts must be 0 - 255) with pytest.raises(ValueError): rhessi.uncompress_countrate(np.array([-1, 300])) counts = rhessi.uncompress_countrate(np.array([0, 128, 255])) # Valid min, max assert counts[0] == 0 assert counts[2] == 1015792 # Random test value assert counts[1] == 4080 sunpy-0.8.3/sunpy/instr/__init__.py0000644000175000001440000000014713210261730016505 0ustar nabil00000000000000""" This is where libraries for individual missions resides """ from __future__ import absolute_import sunpy-0.8.3/sunpy/instr/aia.py0000644000175000017500000000505013231613137016515 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- """ Provides processing routines for data captured with the AIA instrument on SDO. """ import numpy as np import astropy.units as u from sunpy.map.sources.sdo import AIAMap __all__ = ['aiaprep'] def aiaprep(aiamap): """ Processes a level 1 `~sunpy.map.sources.sdo.AIAMap` into a level 1.5 `~sunpy.map.sources.sdo.AIAMap`. Rotates, scales and translates the image so that solar North is aligned with the y axis, each pixel is 0.6 arcsec across, and the center of the sun is at the center of the image. The actual transformation is done by Map's :meth:`~sunpy.map.mapbase.GenericMap.rotate` method. This function is similar in functionality to aia_prep() in SSWIDL, but it does not use the same transformation to rotate the image and it handles the meta data differently. It should therefore not be expected to produce the same results. Parameters ---------- aiamap : `~sunpy.map.sources.sdo.AIAMap` instance A `sunpy.map.Map` from AIA Returns ------- newmap : A level 1.5 copy of `~sunpy.map.sources.sdo.AIAMap` Notes ----- This routine makes use of Map's :meth:`~sunpy.map.mapbase.GenericMap.rotate` method, which modifies the header information to the standard PCi_j WCS formalism. The FITS header resulting in saving a file after this procedure will therefore differ from the original file. """ if not isinstance(aiamap, AIAMap): raise ValueError("Input must be an AIAMap") # Target scale is 0.6 arcsec/pixel, but this needs to be adjusted if the map # has already been rescaled. if (aiamap.scale[0] / 0.6).round() != 1.0 * u.arcsec and aiamap.data.shape != (4096, 4096): scale = (aiamap.scale[0] / 0.6).round() * 0.6 * u.arcsec else: scale = 0.6 * u.arcsec # pragma: no cover # can't test this because it needs a full res image scale_factor = aiamap.scale[0] / scale tempmap = aiamap.rotate(recenter=True, scale=scale_factor.value, missing=aiamap.min()) # extract center from padded aiamap.rotate output # crpix1 and crpix2 will be equal (recenter=True), as aiaprep does not work with submaps center = np.floor(tempmap.meta['crpix1']) range_side = (center + np.array([-1, 1]) * aiamap.data.shape[0] / 2) * u.pix newmap = tempmap.submap(u.Quantity([range_side[0], range_side[0]]), u.Quantity([range_side[1], range_side[1]])) newmap.meta['r_sun'] = newmap.meta['rsun_obs'] / newmap.meta['cdelt1'] newmap.meta['lvl_num'] = 1.5 return newmap sunpy-0.8.3/sunpy/instr/fermi.py0000644000175000017500000004051013231613137017065 0ustar nabilnabil00000000000000from __future__ import absolute_import from __future__ import division import os import copy from sunpy.extern.six.moves import urllib from collections import OrderedDict import tempfile import datetime import matplotlib.pyplot as plt import numpy as np import astropy.units as u from astropy.coordinates import Longitude, Latitude from sunpy.time import parse_time, TimeRange from sunpy import sun from sunpy.io.fits import fits __all__ = ['download_weekly_pointing_file', 'get_detector_sun_angles_for_time', 'get_detector_sun_angles_for_date', 'plot_detector_sun_angles', 'met_to_utc'] def download_weekly_pointing_file(date): """ Downloads the FERMI/LAT weekly pointing file corresponding to the specified date. This file contains 1 minute cadence data on the spacecraft pointing, useful for calculating detector angles. Parameters ---------- date : `datetime.datetime` A datetime object or other date format understood by the parse_time function. """ date = parse_time(date) # use a temp directory to hold the file tmp_dir = tempfile.mkdtemp() # use Fermi data server to access weekly LAT pointing file. base_url = 'ftp://legacy.gsfc.nasa.gov/FTP/glast/data/lat/weekly/spacecraft/' fbasename = 'lat_spacecraft_weekly_w' # find out which file to get based on date # earliest full file in the FERMI server is for mission week 10, # beginning 2008 August 7. weekly_file_start = parse_time('2008-08-07') base_week = 10 # find out which mission week corresponds to date time_diff = date - weekly_file_start weekdiff = time_diff.days // 7 week = weekdiff + base_week # weekstr = ('%03.0f' % week) weekstr = '{:03.0f}'.format(week) # construct the full url for the weekly pointing file full_fname = fbasename + weekstr + '_p202_v001.fits' pointing_file_url = base_url + full_fname # try to download the file from the FTP site try: resp = urllib.request.urlopen(pointing_file_url) exists = True except: urllib.error.HTTPError exists = False # if no matches at all were found, then the pointing file doesn't exist if not exists: raise ValueError('No Fermi pointing files found for given date!') # download the file destination = os.path.join(tmp_dir, full_fname) urllib.request.urlretrieve(pointing_file_url, destination) # return the location of the downloaded file return destination def get_detector_sun_angles_for_time(time, file): """ get the GBM detector angles vs the sun for a single time. Parameters ---------- time : `datetime.datetime` A datetime object or other time format understood by the parse_time function. file : `str` A filepath to a Fermi/LAT weekly pointing file (e.g. as obtained by the download_weekly_pointing_file function). """ time = parse_time(time) scx, scz, tt = get_scx_scz_at_time(time, file) # retrieve the detector angle information in spacecraft coordinates detectors = nai_detector_angles() # get the detector pointings in RA/DEC given the input spacecraft x and z # axes detector_radecs = nai_detector_radecs(detectors, scx, scz, tt) # this gets the sun position with RA in hours in decimal format (e.g. 4.3). # DEC is already in degrees sunpos_ra_not_in_deg = [sun.sun.apparent_rightascension(time), sun.sun.apparent_declination(time)] # now Sun position with RA in degrees sun_pos = [sunpos_ra_not_in_deg[0].to('deg'), sunpos_ra_not_in_deg[1]] # sun_pos = [(sunpos_ra_not_in_deg[0] / 24) * 360., sunpos_ra_not_in_deg[1]] # now get the angle between each detector and the Sun detector_to_sun_angles = (get_detector_separation_angles(detector_radecs, sun_pos)) return detector_to_sun_angles def get_detector_sun_angles_for_date(date, file): """ get the GBM detector angles vs the sun as a function of time for a given date Parameters ---------- date : `datetime.datetime` A datetime object or other date format understood by the parse_time function. file : `str` A filepath to a Fermi/LAT weekly pointing file (e.g. as obtained by the download_weekly_pointing_file function). """ date = parse_time(date) tran = TimeRange(date, date + datetime.timedelta(days=1)) scx, scz, times = get_scx_scz_in_timerange(tran, file) # retrieve the detector angle information in spacecraft coordinates detectors = nai_detector_angles() detector_to_sun_angles = [] # get the detector vs Sun angles for each t and store in a list of # dictionaries. for i in range(len(scx)): detector_radecs = nai_detector_radecs(detectors, scx[i], scz[i], times[i]) # this gets the sun position with RA in hours in decimal format # (e.g. 4.3). DEC is already in degrees sunpos_ra_not_in_deg = [sun.sun.apparent_rightascension(times[i]), sun.sun.apparent_declination(times[i])] # now Sun position with RA in degrees sun_pos = [sunpos_ra_not_in_deg[0].to('deg'), sunpos_ra_not_in_deg[1]] # now get the angle between each detector and the Sun detector_to_sun_angles.append( get_detector_separation_angles(detector_radecs, sun_pos)) # slice the list of dictionaries to get the angles for each detector in a # list form angles = OrderedDict() key_list = ['n0', 'n1', 'n2', 'n3', 'n4', 'n5', 'n6', 'n7', 'n8', 'n9', 'n10', 'n11', 'time'] for i in range(13): if not key_list[i] == 'time': angles[key_list[i]] = [item[key_list[i]].value for item in detector_to_sun_angles] * u.deg else: angles[key_list[i]] = [item[key_list[i]] for item in detector_to_sun_angles] return angles def plot_detector_sun_angles(angles): """ Plots the Fermi/GBM detector angles as a function of time. Parameters ---------- angles : `dict` A dictionary containing the Fermi/GBM detector angle information as a function of time. Obtained from the get_detector_separation_angles function. """ # make a plot showing the angles vs time figure = plt.figure(1) for n in angles.keys(): if not n == 'time': plt.plot( angles['time'], angles[n].value, label='{lab} ({val})'.format( lab=n, val=str(np.mean(angles[n].value))[0:5])) plt.ylim(180, 0) plt.ylabel('angle (degrees)') plt.xlabel('Start time: ' + angles['time'][0].isoformat()) plt.title('Detector pointing angle from Sun') plt.legend(fontsize=10) figure.autofmt_xdate() plt.show() def get_scx_scz_at_time(time, file): """ Read a downloaded FERMI weekly pointing file and extract scx, scz for a single time. Parameters ---------- time : `datetime.datetime` A datetime object or other time format understood by the parse_time function. file : `str` A filepath to a Fermi/LAT weekly pointing file (e.g. as obtained by the download_weekly_pointing_file function). """ time = parse_time(time) hdulist = fits.open(file) timesinutc = [] for tim in hdulist[1].data['START']: timesinutc.append(met_to_utc(tim)) ind = np.searchsorted(timesinutc, time) scx_radec = (Longitude(hdulist[1].data['RA_SCX'][ind] * u.deg), Latitude(hdulist[1].data['DEC_SCX'][ind] * u.deg)) scz_radec = (Longitude(hdulist[1].data['RA_SCZ'][ind] * u.deg), Latitude(hdulist[1].data['DEC_SCZ'][ind] * u.deg)) return scx_radec, scz_radec, timesinutc[ind] def get_scx_scz_in_timerange(timerange, file): """ Read a downloaded FERMI weekly pointing file and extract scx, scz for a timerange. Parameters ---------- timerange : `sunpy.time.TimeRange` A SunPy TimeRange object. file : `str` A filepath to a Fermi/LAT weekly pointing file (e.g. as obtained by the download_weekly_pointing_file function). """ hdulist = fits.open(file) timesinutc = [] for tim in hdulist[1].data['START']: timesinutc.append(met_to_utc(tim)) startind = np.searchsorted(timesinutc, timerange.start) endind = np.searchsorted(timesinutc, timerange.end) scx_radec = [] scz_radec = [] for i in range(startind, endind): scx_radec.append((Longitude(hdulist[1].data['RA_SCX'][i] * u.deg), Latitude(hdulist[1].data['DEC_SCX'][i] * u.deg))) scz_radec.append((Longitude(hdulist[1].data['RA_SCZ'][i] * u.deg), Latitude(hdulist[1].data['DEC_SCZ'][i] * u.deg))) return scx_radec, scz_radec, timesinutc[startind:endind] def nai_detector_angles(): """ Returns the dictionary of Fermi/GBM NAI detector zenith and azimuth angles, in spacecraft coordinates. zenith angle is measured from +z (along the LAT boresight), azimuth is measured from +x. see Meegan et al. (2009) for details and detector angles. """ # angles listed as [azimuth, zenith] detectors = {'n0': [45.89 * u.deg, 20.58 * u.deg], 'n1': [45.11 * u.deg, 45.31 * u.deg], 'n2': [58.44 * u.deg, 90.21 * u.deg], 'n3': [314.87 * u.deg, 45.24 * u.deg], 'n4': [303.15 * u.deg, 90.27 * u.deg], 'n5': [3.35 * u.deg, 89.79 * u.deg], 'n6': [224.93 * u.deg, 20.43 * u.deg], 'n7': [224.62 * u.deg, 46.18 * u.deg], 'n8': [236.61 * u.deg, 89.97 * u.deg], 'n9': [135.19 * u.deg, 45.55 * u.deg], 'n10': [123.73 * u.deg, 90.42 * u.deg], 'n11': [183.74 * u.deg, 90.32 * u.deg]} return detectors def nai_detector_radecs(detectors, scx, scz, time): """ calculates the RA/DEC for each NaI detector given spacecraft z and x RA/DEC positions. NB: This routine is based on code found in GTBURST, originally written by Dr Giacamo Vianello for the Fermi Science Tools. Parameters ---------- detectors : `dict` A dictionary containing the Fermi/GBM detector pointing angles relative to the spacecraft axes. Obtained from the nai_detector_angles function. scx : array-like Two-element tuple containing the RA/DEC information of the Fermi spacecraft X-axis scz : array-like Two-element tuple containing the RA/DEC information of the Fermi spacecraft Z-axis time : `datetime.datetime` The time corresponding to the input scx and scz values, in a format understandable by parse_time. Returns ------- `dict` A dictionary containing the RA/DEC for each Fermi/GBM NaI detector at the given input time. """ scx_vector = (np.array( [np.cos(scx[0].to('rad').value) * np.cos(scx[1].to('rad').value), np.sin(scx[0].to('rad').value) * np.cos(scx[1].to('rad').value), np.sin(scx[1].to('rad').value)])) scz_vector = (np.array( [np.cos(scz[0].to('rad').value) * np.cos(scz[1].to('rad').value), np.sin(scz[0].to('rad').value) * np.cos(scz[1].to('rad').value), np.sin(scz[1].to('rad').value)])) # For each detector, do the rotation depending on the detector zenith and # azimuth angles. detector_radecs = copy.deepcopy(detectors) for l, d in detectors.items(): phi = d[0].value theta = d[1].value # rotate about spacecraft z-axis first vx_primed = rotate_vector(scx_vector, scz_vector, np.deg2rad(phi)) # now find spacecraft y-axis using cross product vy_primed = np.cross(scz_vector, vx_primed) # do the second part of the rotation around vy vz_primed = rotate_vector(scz_vector, vy_primed, np.deg2rad(theta)) # now we should be pointing at the new RA/DEC. ra = Longitude( np.degrees(np.arctan2(vz_primed[1], vz_primed[0])) * u.deg) dec = Latitude(np.degrees(np.arcsin(vz_primed[2])) * u.deg) # save the RA/DEC in a dictionary detector_radecs[l] = [ra, dec] detector_radecs['time'] = time return detector_radecs def rotate_vector(vector, axis, theta): """ The Euler-Rodrigues formula for rotating vectors. Parameters ---------- vector : `numpy.ndarray` a three-element vector to be rotated axis : `numpy.ndarray` the the-element vector to rotate around theta : `float` the angle (in radians) by which to rotate vector around axis Reference --------- http://en.wikipedia.org/wiki/Euler-Rodrigues_parameters#Rotation_angle_and_rotation_axis """ axis = axis / np.sqrt(np.dot(axis, axis)) a = np.cos(theta / 2) b, c, d = -axis * np.sin(theta / 2) rot_matrix = np.array( [[a * a + b * b - c * c - d * d, 2 * (b * c + a * d), 2 * (b * d - a * c)], [2 * (b * c - a * d), a * a + c * c - b * b - d * d, 2 * (c * d + a * b)], [2 * (b * d + a * c), 2 * (c * d - a * b), a * a + d * d - b * b - c * c]]) return np.dot(rot_matrix, vector) def get_detector_separation_angles(detector_radecs, sunpos): """ Finds the separation angle between the Sun and each NaI detector, given a dictionary of detector RA/DECs. Parameters ---------- detector_radecs : `dict` the RA/DEC for each NaI detector as AstroPy quantities. Obtained from the fermi.nai_detector_radecs function sunpos : `list` Two-element list containing the RA/DEC of the Sun position as AstroPy Quantities, e.g. [, ] """ angles = copy.deepcopy(detector_radecs) for l, d in detector_radecs.items(): if not l == 'time': angle = separation_angle(d, sunpos) angles[l] = angle return angles def separation_angle(radec1, radec2): """ Use the law of spherical cosines to calculate the separation angle between two RA/DEC positions. Parameters ---------- radec1 : `list` A two-element list containing an RA/DEC position as AstroPy Quantities, e.g. [, ] radec2 : `list` A two-element list containing an RA/DEC position as AstroPy Quantities, e.g. [, ] """ cosine_of_angle = ( (np.cos(((90 * u.deg) - radec1[1].to('degree')).to('rad')) * np.cos((90 * u.deg - radec2[1].to('degree')).to('rad'))) + (np.sin(((90 * u.deg) - radec1[1].to('degree')).to('rad')) * np.sin(((90 * u.deg) - radec2[1].to('degree')).to('rad')) * np.cos((radec1[0].to('degree') - radec2[0].to('degree')).to('rad')))) angle = (np.arccos(cosine_of_angle)).to('degree') return angle def met_to_utc(timeinsec): """ Converts Fermi Mission Elapsed Time (MET) in seconds to a datetime object. Parameters ---------- timeinsec : `float` time in seconds since 00:00 UT on 1st January 2001 (the Fermi MET format) Returns ------- `datetime.datetime` The input Fermi Mission Elapsed Time converted to a datetime object. """ # Times for GBM are in Mission Elapsed Time (MET). # The reference time for this is 2001-Jan-01 00:00. met_ref_time = parse_time('2001-01-01 00:00') offset_from_utc = ( met_ref_time - parse_time('1979-01-01 00:00')).total_seconds() time_in_utc = parse_time(timeinsec + offset_from_utc) return time_in_utc def utc_to_met(time_ut): """ Converts a UT (in datetime format) to a Fermi Mission Elapsed Time (MET) float. Parameters ---------- time_ut : 'datetime.datetime' A datetime object in UT Returns ------- 'float' The Fermi Mission Elapsed Time corresponding to the input UT """ met_ref_time = parse_time('2001-01-01 00:00') ut_seconds = (time_ut - parse_time('1979-01-01')).total_seconds() offset_from_utc = ( met_ref_time - parse_time('1979-01-01 00:00')).total_seconds() fermi_met = ut_seconds - offset_from_utc return fermi_met sunpy-0.8.3/sunpy/instr/goes.py0000644000175000017500000016266313232563447016747 0ustar nabilnabil00000000000000""" Contains functions useful for analysing GOES/XRS data. Each of the Geostationary Operational Environmental Satellite (GOES) series since the mid-1970s has carried an X-Ray Sensor (XRS) which observes full-disk-integrated solar flux in two broadband channels: 1--8 angstrom (long); and 0.5--4 angstrom (short). For more information on the GOES/XRS instrument, see [Ref1]_. GOES/XRS has become the "standard candle" for solar coronal observations due its longevity and consistency. The GOES event list, based on GOES/XRS observations, has become the standard solar flare catalogue. See http://www.ngdc.noaa.gov/stp/solar/solarflares.html for information on the GOES event list definitions and data. The functions in this module provide useful software to analyse GOES/XRS observations. First they allow the GOES event list to be imported into a Python session (`~sunpy.instr.goes.get_goes_event_list`). They also allow the thermodynamic properties of the emitting solar plasma to be determined. Temperature and emission measure are obtained using `~sunpy.instr.goes.calculate_temperature_em`, this function currently relies on lookup tables relating the GOES fluxes to the isothermal temperature and volume emission measure. These tables were calculated by functions in SolarSoftWare (SSW) using the CHIANTI atomic physics database ([Ref2]_). For more detail, see the docstring of calculate_temperature_em` and references therein. The radiative loss rate of the soft X-ray-emitting plasma across all wavelengths can be found with `~sunpy.instr.goes.calculate_radiative_loss_rate`, which makes use of a look up table calculated by functions in SSW using CHIANTI. This table relates the temperature and emission measure of the emitting solar plasma to the thermal energy radiated over all wavelengths. For more information on how this is done, see the docstring of `~sunpy.instr.goes._calc_rad_loss` and reference therein. Meanwhile, the X-ray luminosity in the two GOES passbands can be obtained by `~sunpy.instr.goes.calculate_xray_luminosity`. To do so, this function calls `~sunpy.instr.goes._goes_lx` and `~sunpy.instr.goes.calc_xraylum`. References ---------- .. [Ref1] Hanser, F.A., & Sellers, F.B. 1996, Proc. SPIE, 2812, 344 .. [Ref2] Dere, K.P., et al. 2009 A&A, 498, 915 DOI: `10.1051/0004-6361/200911712 `__ """ from __future__ import absolute_import, division import os.path import datetime import csv import copy import socket from itertools import dropwhile import numpy as np from scipy import interpolate from scipy.integrate import trapz, cumtrapz import astropy.units as u import pandas from sunpy.net import hek from sunpy.time import parse_time from sunpy import config from sunpy import lightcurve from sunpy.util.net import check_download_file from sunpy.util.config import get_and_create_download_dir from sunpy import sun from sunpy.coordinates import get_sunearth_distance GOES_CONVERSION_DICT = {'X': u.Quantity(1e-4, "W/m^2"), 'M': u.Quantity(1e-5, "W/m^2"), 'C': u.Quantity(1e-6, "W/m^2"), 'B': u.Quantity(1e-7, "W/m^2"), 'A': u.Quantity(1e-8, "W/m^2")} __all__ = ['get_goes_event_list', 'calculate_temperature_em', 'calculate_radiative_loss_rate', 'calculate_xray_luminosity', 'flux_to_flareclass', 'flareclass_to_flux'] try: # Check required data files are present in user's default download dir # Define location where GOES data files are stored. # Manually resolve the hostname HOST = socket.gethostbyname_ex('hesperia.gsfc.nasa.gov')[0] except socket.gaierror: HOST = '' GOES_REMOTE_PATH = "http://{0}/ssw/gen/idl/synoptic/goes/".format(HOST) # Define variables for file names FILE_TEMP_COR = "goes_chianti_temp_cor.csv" FILE_TEMP_PHO = "goes_chianti_temp_pho.csv" FILE_EM_COR = "goes_chianti_em_cor.csv" FILE_EM_PHO = "goes_chianti_em_pho.csv" FILE_RAD_COR = "chianti7p1_rad_loss.txt" def get_goes_event_list(timerange, goes_class_filter=None): """ Retrieve list of flares detected by GOES within a given time range. Parameters ---------- timerange : `sunpy.time.TimeRange` The time range to download the event list for. goes_class_filter: (optional) string A string specifying a minimum GOES class for inclusion in the list, e.g. 'M1', 'X2'. """ # use HEK module to search for GOES events client = hek.HEKClient() event_type = 'FL' tstart = timerange.start tend = timerange.end # query the HEK for a list of events detected by the GOES instrument # between tstart and tend (using a GOES-class filter) if goes_class_filter: result = client.search(hek.attrs.Time(tstart, tend), hek.attrs.EventType(event_type), hek.attrs.FL.GOESCls > goes_class_filter, hek.attrs.OBS.Observatory == 'GOES') else: result = client.search(hek.attrs.Time(tstart, tend), hek.attrs.EventType(event_type), hek.attrs.OBS.Observatory == 'GOES') # want to condense the results of the query into a more manageable # dictionary # keep event data, start time, peak time, end time, GOES-class, # location, active region source (as per GOES list standard) # make this into a list of dictionaries goes_event_list = [] for r in result: goes_event = { 'event_date': parse_time(r['event_starttime']).date().strftime( '%Y-%m-%d'), 'start_time': parse_time(r['event_starttime']), 'peak_time': parse_time(r['event_peaktime']), 'end_time': parse_time(r['event_endtime']), 'goes_class': str(r['fl_goescls']), 'goes_location': (r['event_coord1'], r['event_coord2']), 'noaa_active_region': r['ar_noaanum'] } goes_event_list.append(goes_event) return goes_event_list def calculate_temperature_em(goeslc, abundances="coronal", download=False, download_dir=None): """ Calculates temperature and emission measure from a GOESLightCurve. This function calculates the isothermal temperature and corresponding volume emission measure of the solar soft X-ray emitting plasma observed by the GOES/XRS. This is done using the observed flux ratio of the short (0.5-4 angstrom) to long (1-8 angstrom) channels. The results are returned in a new LightCurve object which contains metadata and flux data of the input LightCurve object in addition to the newly found temperature and emission measure values. Parameters ---------- goeslc : `~sunpy.lightcurve.LightCurve` LightCurve object containing GOES flux data which MUST be in units of W/m^2. abundances : (optional) string equalling 'coronal' or 'photospheric' States whether photospheric or coronal abundances should be assumed. Default='coronal' download : (optional) `bool` If True, the GOES temperature and emission measure data files are downloaded. It is important to do this if a new version of the files has been generated due to a new CHIANTI version being released or the launch of new GOES satellites since these files were last downloaded. Default=False download_dir : (optional) `string` The directory to download the GOES temperature and emission measure data files to. Default=SunPy default download directory Returns ------- lc_new : `~sunpy.lightcurve.LightCurve` Contains same metadata and data as input GOESLightCurve with the following two additional data columns: | lc_new.data.temperature - Array of temperatures [MK] | lc_new.data.em - Array of volume emission measures [cm**-3] Notes ----- The temperature and volume emission measure are calculated here using the methods of White et al. (2005) who used the CHIANTI atomic physics database to model the response of the ratio of the short (0.5-4 angstrom) to long (1-8 angstrom) channels of the XRSs onboard various GOES satellites. This method assumes an isothermal plasma, the ionisation equilibria of [2]_, and a constant density of 10**10 cm**-3. (See [1]_ for justification of this last assumption.) This function is based on goes_chianti_tem.pro in SolarSoftWare written in IDL by Stephen White. Recent fluxes released to the public are scaled to be consistent with GOES-7. In fact these recent fluxes are correct and so this correction must be removed before proceeding to use transfer functions. Email Rodney Viereck (NOAA) for more information. Measurements of short channel flux of less than 1e-10 W/m**2 or long channel flux less than 3e-8 W/m**2 are not considered good. Ratio values corresponding to such fluxes are set to 0.003. References ---------- .. [1] White, S. M., Thomas, R. J., & Schwartz, R. A. 2005, Sol. Phys., 227, 231, DOI: 10.1007/s11207-005-2445-z .. [2] Mazzotta, P., Mazzitelli, G., Colafrancesco, S., & Vittorio, N. 1998, A&AS, 133, 339, DOI: 10.1051/aas:1998330 Examples -------- >>> from sunpy.instr.goes import calculate_temperature_em >>> import sunpy.lightcurve as lc >>> time1 = "2014-01-01 00:00:00" >>> time2 = "2014-01-01 00:00:08" >>> goeslc = lc.GOESLightCurve.create(time1, time2) # doctest: +REMOTE_DATA >>> goeslc.data # doctest: +REMOTE_DATA +FLOAT_CMP xrsa xrsb 2014-01-01 00:00:00.421999 9.187300e-08 0.000004 2014-01-01 00:00:02.468999 9.187300e-08 0.000004 2014-01-01 00:00:04.518999 9.187300e-08 0.000004 2014-01-01 00:00:06.564999 9.298800e-08 0.000004 >>> goeslc_new = calculate_temperature_em(goeslc) # doctest: +REMOTE_DATA >>> goeslc_new.data # doctest: +REMOTE_DATA +FLOAT_CMP xrsa xrsb temperature em 2014-01-01 00:00:00.421999 9.187300e-08 0.000004 6.270239 6.440648e+48 2014-01-01 00:00:02.468999 9.187300e-08 0.000004 6.270239 6.440648e+48 2014-01-01 00:00:04.518999 9.187300e-08 0.000004 6.273917 6.422208e+48 2014-01-01 00:00:06.564999 9.298800e-08 0.000004 6.304001 6.350370e+48 """ # Check that input argument is of correct type if not isinstance(goeslc, lightcurve.LightCurve): raise TypeError("goeslc must be a LightCurve object.") if not download_dir: download_dir = get_and_create_download_dir() # Find temperature and emission measure with _goes_chianti_tem temp, em = _goes_chianti_tem( u.Quantity(goeslc.data.xrsb, unit=u.W/(u.m)**2), u.Quantity(goeslc.data.xrsa, unit=u.W/(u.m)**2), satellite=goeslc.meta["TELESCOP"].split()[1], date=goeslc.data.index[0], abundances=abundances, download=download, download_dir=download_dir) # Enter results into new version of GOES LightCurve Object # Use copy.deepcopy for replicating meta and data so that input # lightcurve is not altered. lc_new = lightcurve.LightCurve(meta=copy.deepcopy(goeslc.meta), data=copy.deepcopy(goeslc.data)) lc_new.data["temperature"] = temp.value lc_new.data["em"] = em.value return lc_new @u.quantity_input(longflux=u.W/u.m/u.m, shortflux=u.W/u.m/u.m) def _goes_chianti_tem(longflux, shortflux, satellite=8, date=datetime.datetime.today(), abundances="coronal", download=False, download_dir=None): """ Calculates temperature and emission measure from GOES/XRS data. This function calculates the isothermal temperature and volume emission measure of the solar soft X-ray emitting plasma observed by the GOES/XRS. This is done using the observed flux ratio of the short (0.5-4 angstrom) to long (1-8 angstrom) channels. Parameters ---------- longflux, shortflux : `~astropy.units.Quantity` Arrays containing the long and short GOES/XRS flux measurements respectively as a function of time. Must be of same length. [W/m**2]. satellite : int (optional) Number of GOES satellite used to make observations, important for correct calibration of data. Default=8 date : `datetime.datetime` or `str` Date when observations made. Important for correctcalibration. Default=today abundances : (optional) string equalling 'coronal' or 'photospheric' States whether photospheric or coronal abundances should be assumed. Default='coronal' download : (optional) bool If True, the GOES temperature and emission measure data files are downloaded. It is important to do this if a new version of the files has been generated due to a new CHIANTI version being released or the launch of new GOES satellites since these files were last downloaded. Default=False download_dir : (optional) string The directory to download the GOES temperature and emission measure data files to. Default=SunPy default download directory Returns ------- temp : `~astropy.units.Quantity` Array of temperature values of same length as longflux and shortflux. Units=[MK] em : `~astropy.units.Quantity` Array of volume emission measure values of same length as longflux and shortflux. Units=[10**49 cm**-3] Notes ----- The temperature and volume emission measure are calculated here using the methods of [1]_ who used the CHIANTI atomic physics database to model the response of the ratio of the short (0.5-4 angstrom) to long (1-8 angstrom) channels of the XRSs onboard various GOES satellites. This method assumes an isothermal plasma, the ionisation equilibria of [2]_, and a constant density of 10**10 cm**-3. (See White et al. 2005 for justification of this last assumption.) This function is based on goes_chianti_tem.pro in SolarSoftWare written in IDL by Stephen White. Recent fluxes released to the public are scaled to be consistent with GOES-7. In fact these recent fluxes are correct and so this correction must be removed before proceeding to use transfer functions. Email Rodney Viereck (NOAA) for more information. Measurements of short channel flux of less than 1e-10 W/m**2 or long channel flux less than 3e-8 W/m**2 are not considered good. Ratio values corresponding to such fluxes are set to 0.003. References ---------- .. [1] White, S. M., Thomas, R. J., & Schwartz, R. A. 2005, Sol. Phys., 227, 231, DOI: 10.1007/s11207-005-2445-z .. [2] Mazzotta, P., Mazzitelli, G., Colafrancesco, S., & Vittorio, N. 1998, A&AS, 133, 339, DOI: 10.1051/aas:1998330 Examples -------- >>> from sunpy.instr.goes import _goes_chianti_tem >>> from astropy.units import Quantity >>> longflux = Quantity([7e-6, 7e-6], unit="W/m/m") >>> shortflux = Quantity([7e-7, 7e-7], unit="W/m/m") >>> temp, em = _goes_chianti_tem(longflux, shortflux, satellite=15, ... date='2014-04-16', ... abundances="coronal") # doctest: +REMOTE_DATA >>> temp # doctest: +REMOTE_DATA >>> em # doctest: +REMOTE_DATA """ if not download_dir: download_dir = get_and_create_download_dir() # ENSURE INPUTS ARE OF CORRECT TYPE AND VALID VALUES longflux = longflux.to(u.W/u.m/u.m) shortflux = shortflux.to(u.W/u.m/u.m) satellite = int(satellite) if satellite < 1: raise ValueError("satellite must be the number of a " "valid GOES satellite (>1).") date = parse_time(date) # Check flux arrays are of same length. if len(longflux) != len(shortflux): raise ValueError( "longflux and shortflux must have same number of elements.") # PREPARE DATA # GOES 6 long channel flux before 1983-Jun-28 must be corrected by a # factor of 4.43/5.32 if date < datetime.datetime(1983, 6, 28) and satellite == 6: longflux_corrected = longflux*(4.43/5.32) else: longflux_corrected = longflux # Un-scale fluxes if GOES satellite is after 7. See 2nd paragraph # in Notes section of docstring above. if satellite > 7: longflux_corrected = longflux_corrected / 0.7 shortflux_corrected = shortflux / 0.85 else: shortflux_corrected = shortflux # Calculate short to long channel ratio. # Data which is not good have their ratio value set to 0.003. # See Notes section in docstring above. index = np.logical_or( shortflux_corrected < u.Quantity(1e-10, unit="W/m**2"), longflux_corrected < u.Quantity(3e-8, unit="W/m**2")) fluxratio = shortflux_corrected / longflux_corrected fluxratio.value[index] = u.Quantity(0.003, unit="W/m**2") # FIND TEMPERATURE AND EMISSION MEASURE FROM FUNCTIONS BELOW temp = _goes_get_chianti_temp(fluxratio, satellite=satellite, abundances=abundances, download=download, download_dir=download_dir) em = _goes_get_chianti_em(longflux_corrected, temp, satellite=satellite, abundances=abundances, download=download, download_dir=download_dir) return temp, em @u.quantity_input(fluxratio=u.dimensionless_unscaled) def _goes_get_chianti_temp(fluxratio, satellite=8, abundances="coronal", download=False, download_dir=None): """ Calculates temperature from GOES flux ratio. This function calculates the isothermal temperature of the solar soft X-ray emitting plasma observed by the GOES/XRS from the observed flux ratio of the short (0.5-4 angstrom) to long (1-8 angstrom) channels. This function is not intended to be called directly but by _goes_chianti_tem(), although it can be used independently. However, if used independently data preparation, such as correctly rescaling fluxes for some satellites etc. will not be carried out. This is done in _goes_chianti_tem(). Parameters ---------- fluxratio : `~astropy.units.Quantity` Array containing the ratio of short channel to long channel GOES/XRS flux measurements. satellite : int (optional) Number of GOES satellite used to make observations. Important for correct calibration of data. Default=8 abundances : (optional) string equalling 'coronal' or 'photospheric' States whether photospheric or coronal abundances should be assumed. Default='coronal' download : (optional) bool If True, the GOES temperature data files are downloaded. It is important to do this if a new version of the files has been generated due to a new CHIANTI version being released or the launch of new GOES satellites since these files were last downloaded. Default=False download_dir : (optional) string The directory to download the GOES temperature data file to. Default=SunPy default download directory Returns ------- temp : `~astropy.units.Quantity` Array of temperature values of same length as longflux and shortflux. Units=[MK] Notes ----- This function uses csv files representing the modelled relationship between temperature of the soft X-ray emitting plasma and the short to long channel GOES flux ratio. goes_chianti_temp_cor.csv is used when coronal abundances are assumed while goes_chianti_temp_pho.csv is used when photospheric abundances are assumed. (See make_goes_chianti_temp.py for more detail.) These files were calculated using the methods of [1]_ who used the CHIANTI atomic physics database to model the response of the ratio of the short (0.5-4 angstrom) to long (1-8 angstrom) channels of the XRSs onboard various GOES satellites. This method assumes an isothermal plasma, the ionisation equilibria of (See White et al. 2005 for justification of this last assumption.) This function is based on goes_get_chianti_temp.pro in SolarSoftWare written in IDL by Stephen White. For correct preparation of GOES data before calculating temperature see _goes_chianti_tem() (Notes section of docstring). References ---------- .. [1] White, S. M., Thomas, R. J., & Schwartz, R. A. 2005, Sol. Phys., 227, 231, DOI: 10.1007/s11207-005-2445-z .. [2] Mazzotta, P., Mazzitelli, G., Colafrancesco, S., & Vittorio, N. 1998, A&AS, 133, 339, DOI: 10.1051/aas:1998330 Examples -------- >>> from astropy.units import Quantity >>> from sunpy.instr.goes import _goes_get_chianti_temp >>> fluxratio = Quantity([0.1,0.1]) >>> temp = _goes_get_chianti_temp(fluxratio, satellite=15, ... abundances="coronal") # doctest: +REMOTE_DATA >>> temp # doctest: +REMOTE_DATA """ if not download_dir: download_dir = get_and_create_download_dir() # If download kwarg is True, or required data files cannot be # found locally, download required data files. check_download_file(FILE_TEMP_COR, GOES_REMOTE_PATH, download_dir, replace=download) check_download_file(FILE_TEMP_PHO, GOES_REMOTE_PATH, download_dir, replace=download) # check inputs are correct fluxratio = fluxratio.decompose() int(satellite) if satellite < 1: raise ValueError("satellite must be the number of a " "valid GOES satellite (>1).") # if abundance input is valid create file suffix, abund, equalling # of 'cor' or 'pho'. if abundances == "coronal": data_file = FILE_TEMP_COR elif abundances == "photospheric": data_file = FILE_TEMP_PHO else: raise ValueError("abundances must be a string equalling " "'coronal' or 'photospheric'.") # Initialize lists to hold model data of flux ratio - temperature # relationship read in from csv file modeltemp = [] # modelled temperature is in log_10 space in units of MK modelratio = [] # Determine name of column in csv file containing model ratio values # for relevant GOES satellite label = "ratioGOES{0}".format(satellite) # Read data representing appropriate temperature--flux ratio # relationship depending on satellite number and assumed abundances. with open(os.path.join(get_and_create_download_dir(), data_file), "r") as csvfile: startline = dropwhile(lambda l: l.startswith("#"), csvfile) csvreader = csv.DictReader(startline, delimiter=";") for row in csvreader: modeltemp.append(float(row["log10temp_MK"])) modelratio.append(float(row[label])) modeltemp = np.asarray(modeltemp) modelratio = np.asarray(modelratio) # Ensure input values of flux ratio are within limits of model table if np.min(fluxratio) < np.min(modelratio) or \ np.max(fluxratio) > np.max(modelratio): raise ValueError( "For GOES {0}, all values in fluxratio input must be within " + "the range {1} - {2}.".format(satellite, np.min(modelratio), np.max(modelratio))) # Perform spline fit to model data to get temperatures for input # values of flux ratio spline = interpolate.splrep(modelratio, modeltemp, s=0) temp = 10.**interpolate.splev(fluxratio.value, spline, der=0) temp = u.Quantity(temp, unit='MK') return temp @u.quantity_input(longflux=u.W/u.m/u.m, temp=u.MK) def _goes_get_chianti_em(longflux, temp, satellite=8, abundances="coronal", download=False, download_dir=None): """ Calculates emission measure from GOES 1-8A flux and temperature. This function calculates the emission measure of the solar soft X-ray emitting plasma observed by the GOES/XRS from the the ratio of the isothermal temperature and observed long channel (1-8 angstrom) flux which scales with the emission measure. This function is not intended to be called directly but by _goes_chianti_tem(), although it can be used independently. However, if used independently data preparation, such as correctly rescaling fluxes for some satellites etc. will not be carried out. This is done in _goes_chianti_tem(). Parameters ---------- longflux : `~astropy.units.Quantity` Array containing the observed GOES/XRS long channel flux. Units=[W/m**2] temp : `~astropy.units.Quantity` Array containing the GOES temperature. Units=[MK] satellite : int (optional) Number of GOES satellite used to make observations. Important for correct calibration of data. Default=8 abundances : (optional) {'coronal' | 'photospheric'} States whether photospheric or coronal abundances should be assumed. Default='coronal' download : (optional) `bool` If True, the GOES emission measure data file is downloaded. It is important to do this if a new version of the file has been generated due to a new CHIANTI version being released or the launch of new GOES satellites since these file was last downloaded. Default=False download_dir : (optional) `str` The directory to download the GOES emission measure data file to. Default=SunPy default download directory Returns ------- em : `~astropy.units.Quantity` Array of emission measure values of same length as longflux and temp. [cm**-3] Notes ----- This function uses csv files representing the modelled relationship between the temperature of the solar soft X-ray emitting plasma and the resulting observed flux in the GOES/XRS long channel (1-8 angstroms). goes_chianti_em_cor.csv is used when coronal abundances are assumed while goes_chianti_em_pho.csv is used when photospheric abundances are assumed. (See make_goes_chianti_temp.py for more detail.) These files were calculated using the methods of White et al. (2005) who used the CHIANTI atomic physics database and GOES transfer functions to model the response of the long channel to the temperature of the emitting plasma for XRSs onboard various GOES satellites. The emission measure can then be found by scaling the ratio of these two properties. This method assumes an isothermal plasma, the ionisation equilibria of Mazzotta et al. (1998), and a constant density of 10**10 cm**-3. (See White et al. 2005 for justification of this last assumption.) This function is based on goes_get_chianti_temp.pro in SolarSoftWare written in IDL by Stephen White. For correct preparation of GOES data before calculating temperature see _goes_chianti_tem() (Notes section of docstring). References ---------- .. [1] White, S. M., Thomas, R. J., & Schwartz, R. A. 2005, Sol. Phys., 227, 231, DOI: 10.1007/s11207-005-2445-z .. [2] Mazzotta, P., Mazzitelli, G., Colafrancesco, S., & Vittorio, N. 1998, A&AS, 133, 339, DOI: 10.1051/aas:1998330 Examples -------- >>> import astropy.units as u >>> from sunpy.instr.goes import _goes_get_chianti_em >>> longflux = u.Quantity([7e-6,7e-6], unit=u.W/u.m/u.m) >>> temp = u.Quantity([11, 11], unit=u.MK) >>> em = _goes_get_chianti_em(longflux, temp, satellite=15, ... abundances="coronal") # doctest: +REMOTE_DATA >>> em # doctest: +REMOTE_DATA """ if not download_dir: download_dir = get_and_create_download_dir() # If download kwarg is True, or required data files cannot be # found locally, download required data files. check_download_file(FILE_EM_COR, GOES_REMOTE_PATH, download_dir, replace=download) check_download_file(FILE_EM_PHO, GOES_REMOTE_PATH, download_dir, replace=download) # Check inputs are of correct type longflux = longflux.to(u.W/u.m**2) temp = temp.to(u.MK) log10_temp = np.log10(temp.value) int(satellite) if satellite < 1: raise ValueError("satellite must be the number of a " "valid GOES satellite (>1).") # if abundance input is valid create file suffix, abund, equalling # of 'cor' or 'pho'. if abundances == "coronal": data_file = FILE_EM_COR elif abundances == "photospheric": data_file = FILE_EM_PHO else: raise ValueError("abundances must be a string equalling " "'coronal' or 'photospheric'.") # check input arrays are of same length if len(longflux) != len(temp): raise ValueError("longflux and temp must have same number of " "elements.") # Initialize lists to hold model data of temperature - long channel # flux relationship read in from csv file. modeltemp = [] # modelled temperature is in log_10 space in units of MK modelflux = [] # Determine name of column in csv file containing model ratio values # for relevant GOES satellite label = "longfluxGOES{0}".format(satellite) # Read data representing appropriate temperature--long flux # relationship depending on satellite number and assumed abundances. with open(os.path.join(get_and_create_download_dir(), data_file), "r") as csvfile: startline = dropwhile(lambda l: l.startswith("#"), csvfile) csvreader = csv.DictReader(startline, delimiter=";") for row in csvreader: modeltemp.append(float(row["log10temp_MK"])) modelflux.append(float(row[label])) modeltemp = np.asarray(modeltemp) modelflux = np.asarray(modelflux) # Ensure input values of flux ratio are within limits of model table if np.min(log10_temp) < np.min(modeltemp) or \ np.max(log10_temp) > np.max(modeltemp) or \ np.isnan(np.min(log10_temp)): raise ValueError("All values in temp must be within the range " "{0} - {1} MK.".format(np.min(10**modeltemp), np.max(10**modeltemp))) # Perform spline fit to model data spline = interpolate.splrep(modeltemp, modelflux, s=0) denom = interpolate.splev(log10_temp, spline, der=0) em = longflux.value/denom * 1e55 em = u.Quantity(em, unit='cm**(-3)') return em def calculate_radiative_loss_rate(goeslc, force_download=False, download_dir=None): """ Calculates radiative loss rate from GOES observations. This function calculates the radiative loss rate as a function of time of solar soft X-ray-emitting plasma across all wavelengths given a LightCurve object containing GOES data. The radiative loss rate is determined from the GOES isothermal temperature and volume emission measure as a function of time, as calculated by `~calculate_temperature_em()`. See docstring of that function for more details. If the LightCurve object does not contain the temperatures and emission measures, but only contain the GOES fluxes, then the temperature and emission measures are calculated using calculate_temperature_em(). The unit of the resulting radiative loss rates is W. Once the radiative loss rates have been found, they are returned as part of a new LightCurve object also containing the metadata, GOES fluxes and corresponding temperatures and emission measures of the input LightCurve object. Parameters ---------- goeslc : `~sunpy.lightcurve.LightCurve` LightCurve object containing GOES data. The units of these data MUST be W/m^2 (flux), MK (temperature) and cm^-3 (emission measure). If LightCurve object does not contain temperature and emission measure values, they are calculated from the flux values using calculate_temperature_em(). force_download : (optional) `bool` If True, the GOES radiative loss data file is downloaded even if already locally stored. It is important to do this if a new version of the file has been generated due to a new CHIANTI version being released or the launch of new GOES satellites. Default=False download_dir : (optional) `str` The directory to download the GOES radiative loss data file to. Default=SunPy default download directory Returns ------- lc_new : `~sunpy.lightcurve.LightCurve` Contains same metadata and data as input LightCurve with the following additional data columns: | lc_new.data.temperature - Array of temperature values [MK] | lc_new.data.em - Array of volume emission measure values [cm**-3] | lc_new.data.rad_loss_rate - radiative loss rate of the coronal soft X-ray-emitting plasma across all wavelengths [W] Notes ----- The GOES radiative loss rates are calculated using a csv file containing a table of radiative loss rate per unit emission measure at various temperatures. The appropriate values are then found via interpolation. This table was generated using CHIANTI atomic physics database employing the methods of [1]_. Coronal abundances, a default density of 10**10 cm**-3, and ionization equilibrium of [2]_ were used. References ---------- .. [1] Cox, D.P., Tucker, W.H. 1969, ApJ, 157, 1157, DOI: 10.1086/150144 .. [2] Mazzotta, P., Mazzitelli, G., Colafrancesco, S., & Vittorio, N. 1998, A&AS, 133, 339, DOI: 10.1051/aas:1998330 Examples -------- >>> from sunpy.instr.goes import calculate_radiative_loss_rate >>> import sunpy.lightcurve as lc >>> time1 = "2014-01-01 00:00:00" >>> time2 = "2014-01-01 00:00:08" >>> goeslc = lc.GOESLightCurve.create(time1, time2) # doctest: +REMOTE_DATA >>> goeslc.data # doctest: +REMOTE_DATA xrsa xrsb 2014-01-01 00:00:00.421999 9.187300e-08 0.000004 2014-01-01 00:00:02.468999 9.187300e-08 0.000004 2014-01-01 00:00:04.518999 9.187300e-08 0.000004 2014-01-01 00:00:06.564999 9.298800e-08 0.000004 >>> goeslc_new = calculate_radiative_loss_rate(goeslc) # doctest: +REMOTE_DATA >>> goeslc_new.data # doctest: +NORMALIZE_WHITESPACE +REMOTE_DATA xrsa xrsb temperature em \\ 2014-01-01 00:00:00.421999 9.187300e-08 0.000004 6.270239 6.440648e+48 2014-01-01 00:00:02.468999 9.187300e-08 0.000004 6.270239 6.440648e+48 2014-01-01 00:00:04.518999 9.187300e-08 0.000004 6.273917 6.422208e+48 2014-01-01 00:00:06.564999 9.298800e-08 0.000004 6.304001 6.350370e+48 rad_loss_rate 2014-01-01 00:00:00.421999 5.449144e+19 2014-01-01 00:00:02.468999 5.449144e+19 2014-01-01 00:00:04.518999 5.434659e+19 2014-01-01 00:00:06.564999 5.382823e+19 """ if not download_dir: download_dir = get_and_create_download_dir() # Check that input argument is of correct type if not isinstance(goeslc, lightcurve.LightCurve): raise TypeError("goeslc must be a LightCurve object.") # extract temperature and emission measure from GOESLightCurve # object and change type to that required by _calc_rad_loss(). # If LightCurve object does not contain temperature and # emission measure, calculate using calculate_temperature_em() if 'temperature' in goeslc.data and 'em' in goeslc.data: # Use copy.deepcopy for replicating meta and data so that input # lightcurve is not altered. lc_new = lightcurve.LightCurve(meta=copy.deepcopy(goeslc.meta), data=copy.deepcopy(goeslc.data)) else: lc_new = calculate_temperature_em(goeslc) temp = u.Quantity(np.asarray(lc_new.data.temperature, dtype=np.float64), unit=u.MK) em = u.Quantity(np.asarray(lc_new.data.em, dtype=np.float64), unit=u.cm**(-3)) # Find radiative loss rate with _calc_rad_loss() rad_loss_out = _calc_rad_loss(temp, em, force_download=force_download, download_dir=download_dir) # Enter results into new version of GOES LightCurve Object lc_new.data["rad_loss_rate"] = rad_loss_out["rad_loss_rate"].to("W").value return lc_new @u.quantity_input(temp=u.MK, em=u.cm**(-3)) def _calc_rad_loss(temp, em, obstime=None, force_download=False, download_dir=None): """ Finds radiative loss rate of coronal plasma over all wavelengths. This function calculates the radiative loss rate of solar coronal soft X-ray-emitting plasma across all wavelengths given an isothermal temperature and emission measure. The units of the results are W. This function is based on calc_rad_loss.pro in SSW IDL. In addition, if obstime keyword is set, giving the times to which the temperature and emission measure values correspond, the radiated losses integrated over time are also calculated. Parameters ---------- temp : `~astropy.units.Quantity` Array containing the temperature of the coronal plasma at different times. Units=[MK] em : `~astropy.units.Quantity` Array containing the emission measure of the coronal plasma at the same times corresponding to the temperatures in temp. Must be same length as temp. Units=[cm**-3] obstime : (optional) array-like of `datetime.datetime` objects Array of measurement times to which temperature and emission measure values correspond. Must be same length as temp and em. If this keyword is set, the integrated radiated energy is calculated. force_download : (optional) bool If True, the GOES radiative loss data file is downloaded. It is important to do this if a new version of the files has been generated due to a new CHIANTI version being released or the launch of new GOES satellites. Default=False download_dir : (optional) string The directory to download the GOES radiative loss data file to. Default=SunPy default download directory Returns ------- rad_loss_out : `dict` of `~astropy.units.quantity.Quantity` objects Contains the following keys. | "rad_loss_rate" - radiative loss rate of the soft X-ray-emitting plasma across all wavelengths corresponding to temperatures and emission measures in temp and em Quantity inputs. | "rad_loss_cumul" - cumulative radiative losses as a function of time. (Only if obstime kwarg is NOT None.) | "rad_loss_int" - total radiative losses as a function of time. (Only if obstime kwarg is not None.) Array containing radiative loss rates of the coronal plasma corresponding to temperatures and emission measures in temp and em arrays. Notes ----- This function calls a csv file containing a table of radiative loss rate per unit emission measure at various temperatures. The appropriate values are then found via interpolation. This table was generated using CHIANTI atomic physics database employing the methods of Cox & Tucker (1969). Coronal abundances, a default density of 10**10 cm**-3, and ionization equilibrium of Mazzotta et al. (1998) were used. References ---------- .. [1] Cox, D.P., Tucker, W.H. 1969, ApJ, 157, 1157, DOI: 10.1086/150144 .. [2] Mazzotta, P., Mazzitelli, G., Colafrancesco, S., & Vittorio, N. 1998, A&AS, 133, 339, DOI: 10.1051/aas:1998330 Examples -------- >>> from sunpy.instr.goes import _calc_rad_loss >>> from astropy.units.quantity import Quantity >>> temp = Quantity([11.0, 11.0], unit="MK") >>> em = Quantity([4.0e+48, 4.0e+48], unit="cm**(-3)") >>> rad_loss = _calc_rad_loss(temp, em) # doctest: +REMOTE_DATA >>> rad_loss["rad_loss_rate"] # doctest: +REMOTE_DATA """ if not download_dir: download_dir = get_and_create_download_dir() # Check inputs are correct temp = temp.to(u.K) em = em.to(1/u.cm**3) if len(temp) != len(em): raise ValueError("temp and em must all have same number of elements.") # If force_download kwarg is True, or required data files cannot be # found locally, download required data files. check_download_file(FILE_RAD_COR, GOES_REMOTE_PATH, download_dir, replace=force_download) # Initialize lists to hold model data of temperature - rad loss rate # relationship read in from csv file modeltemp = [] # modelled temperature is in log_10 space in units of MK model_loss_rate = [] # Read data from csv file into lists, being sure to skip commented # lines beginning with "#" with open(os.path.join(get_and_create_download_dir(), FILE_RAD_COR), "r") as csvfile: startline = csvfile.readlines()[7:] csvreader = csv.reader(startline, delimiter=" ") for row in csvreader: modeltemp.append(float(row[0])) model_loss_rate.append(float(row[1])) modeltemp = np.asarray(modeltemp) model_loss_rate = np.asarray(model_loss_rate) # Ensure input values of flux ratio are within limits of model table if temp.value.min() < modeltemp.min() or \ temp.value.max() > modeltemp.max(): raise ValueError("All values in temp must be within the range " + "{0} - {1} MK.".format(np.min(modeltemp/1e6), np.max(modeltemp/1e6))) # Perform spline fit to model data to get temperatures for input # values of flux ratio spline = interpolate.splrep(modeltemp, model_loss_rate, s=0) rad_loss = em.value * interpolate.splev(temp.value, spline, der=0) rad_loss = u.Quantity(rad_loss, unit='erg/s') rad_loss = rad_loss.to(u.J/u.s) # If obstime keyword giving measurement times is set, calculate # radiative losses integrated over time. if obstime is not None: # First ensure obstime is of same length as temp and em and of # correct type. n = len(temp) if len(obstime) != n: raise IOError("obstime must have same number of elements as " "temp and em.") if type(obstime) == pandas.DatetimeIndex: obstime = obstime.to_pydatetime if any(type(obst) == str for obst in obstime): parse_time(obstime) if not all(type(obst) == datetime.datetime for obst in obstime): raise TypeError("obstime must be an array-like whose elements are" " convertible to datetime objects.") # Check elements in obstime in chronological order chrono_check = obstime-np.roll(obstime, 1) chrono_check = chrono_check[1:] if not all(chrono_check > datetime.timedelta(0)): raise ValueError( "Elements of obstime must be in chronological order.") # Next, get measurement times in seconds from time of first # measurement. obstime_seconds = np.array([(ot-obstime[0]).total_seconds() for ot in obstime], dtype="float64") # Finally, integrate using trapezoid rule rad_loss_int = trapz(rad_loss.value, obstime_seconds) rad_loss_int = u.Quantity(rad_loss_int, unit=rad_loss.unit*u.s) # Calculate cumulative radiated energy in each GOES channel as # a function of time. rad_loss_cumul = cumtrapz(rad_loss, obstime_seconds) rad_loss_cumul = u.Quantity(rad_loss_cumul, unit=rad_loss.unit*u.s) # Enter results into output dictionary. rad_loss_out = {"rad_loss_rate": rad_loss, "rad_loss_cumul": rad_loss_cumul, "rad_loss_int": rad_loss_int} else: rad_loss_out = {"rad_loss_rate": rad_loss} return rad_loss_out def calculate_xray_luminosity(goeslc): """ Calculates GOES solar X-ray luminosity. This function calculates the solar X-ray luminosity in the GOES wavelength ranges (1-8 angstroms and 0.5-4 angstroms) based on the observed GOES fluxes. The units of the results are W. The calculation is made by simply assuming that the radiation is emitted isotropically, i.e. is distributed over a spherical surface area with a radius equal to the Sun-Earth distance. Once the luminosity in each GOES passband is found, they are returned in a new LightCurve object also containing the metadata and data of the input LightCurve object. Parameters ---------- goeslc : `~sunpy.lightcurve.LightCurve` LightCurve object containing GOES flux data which MUST be in units of W/m^2. Returns ------- lc_new : `~sunpy.lightcurve.LightCurve` Contains same metadata and data as input LightCurve with the following additional data columns; | goeslc_new.data.luminosity_xrsa - Xray luminosity in 0.5-4A channel unit=[W] | goeslc_new.data.luminosity_xrsb - Xray luminosity in 1-8A channel unit=[W] Examples -------- >>> from sunpy.instr.goes import calculate_xray_luminosity >>> import sunpy.lightcurve as lc >>> time1 = "2014-01-01 00:00:00" >>> time2 = "2014-01-01 00:00:08" >>> goeslc = lc.GOESLightCurve.create(time1, time2) # doctest: +REMOTE_DATA >>> goeslc.data # doctest: +REMOTE_DATA xrsa xrsb 2014-01-01 00:00:00.421999 9.187300e-08 0.000004 2014-01-01 00:00:02.468999 9.187300e-08 0.000004 2014-01-01 00:00:04.518999 9.187300e-08 0.000004 2014-01-01 00:00:06.564999 9.298800e-08 0.000004 >>> goeslc_new = calculate_xray_luminosity(goeslc) # doctest: +REMOTE_DATA >>> goeslc_new.data # doctest: +NORMALIZE_WHITESPACE +REMOTE_DATA xrsa xrsb luminosity_xrsa \\ 2014-01-01 00:00:00.421999 9.187300e-08 0.000004 2.498454e+16 2014-01-01 00:00:02.468999 9.187300e-08 0.000004 2.498454e+16 2014-01-01 00:00:04.518999 9.187300e-08 0.000004 2.498454e+16 2014-01-01 00:00:06.564999 9.298800e-08 0.000004 2.528776e+16 luminosity_xrsb 2014-01-01 00:00:00.421999 9.544507e+17 2014-01-01 00:00:02.468999 9.544507e+17 2014-01-01 00:00:04.518999 9.530365e+17 2014-01-01 00:00:06.564999 9.530365e+17 """ # Check that input argument is of correct type if not isinstance(goeslc, lightcurve.GOESLightCurve): raise TypeError("goeslc must be a GOESLightCurve object.") # Find temperature and emission measure with _goes_chianti_tem lx_out = _goes_lx(u.Quantity(goeslc.data.xrsb, unit="W/m**2"), u.Quantity(goeslc.data.xrsa, unit="W/m**2"), date=str(goeslc.data.index[0])) # Enter results into new version of GOES LightCurve Object # Use copy.deepcopy for replicating meta and data so that input # lightcurve is not altered. lc_new = lightcurve.LightCurve(meta=copy.deepcopy(goeslc.meta), data=copy.deepcopy(goeslc.data)) lc_new.data["luminosity_xrsa"] = lx_out["shortlum"].to("W").value lc_new.data["luminosity_xrsb"] = lx_out["longlum"].to("W").value return lc_new def _goes_lx(longflux, shortflux, obstime=None, date=None): """ Calculates solar X-ray luminosity in GOES wavelength ranges. This function calculates the X-ray luminosity from the Sun in the GOES wavelength ranges (1-8 angstroms and 0.5-4 angstroms) based on the observed GOES fluxes. The units of the results are erg/s. The calculation is made by simply assuming that the radiation is emitted isotropically, i.e. is distributed over a spherical surface area with a radius equal to the Sun-Earth distance. Parameters ---------- longflux : `~astropy.units.Quantity` Array containing the observed GOES/XRS long channel flux. Units=[W/m**2] shortflux : `~astropy.units.Quantity` Array containing the observed GOES/XRS short channel flux. Units=[W/m**2] obstime : (optional) array-like of `datetime.datetime` objects Measurement times corresponding to each flux measurement. Assumes each pair of 0.5-4 and 1-8 angstrom flux measurements were taken simultaneously. date : (optional) `datetime.datetime` object or valid date string. Date at which measurements were taken. This is used to calculate the Sun-Earth distance. Default=None implies Sun-Earth distance is set to 1AU. Returns ------- lx_out : `dict` dictionary containing the following fields. longlum : `~astropy.units.Quantity` Array of luminosity in the 1-8 angstroms range. shortlum : `~astropy.units.Quantity` Array of luminosity in the 0.5-4 angstroms range. longlum_int : (only present if obstime kwarg is set) shortlum_int : (only present if obstime kwarg is set) Notes ----- This function calls _calc_xraylum() to calculate luminosities. For more information on how this is done, see docstring of that function. Examples -------- >>> from sunpy.instr.goes import _goes_lx >>> from datetime import datetime >>> from astropy.units.quantity import Quantity >>> longflux = Quantity([7e-6,7e-6,7e-6,7e-6,7e-6,7e-6], unit='W/m**2') >>> shortflux = Quantity([7e-7,7e-7,7e-7,7e-7,7e-7,7e-7], unit='W/m**2') >>> obstime = np.array([datetime(2014,1,1,0,0,0), ... datetime(2014,1,1,0,0,2), ... datetime(2014,1,1,0,0,4), ... datetime(2014,1,1,0,0,6), ... datetime(2014,1,1,0,0,8), ... datetime(2014,1,1,0,0,10),], dtype=object) >>> lx_out = _goes_lx(longflux, shortflux, obstime) # doctest: +REMOTE_DATA >>> lx_out["longlum"] # doctest: +REMOTE_DATA >>> lx_out["shortlum"] # doctest: +REMOTE_DATA >>> lx_out["longlum_int"] # doctest: +REMOTE_DATA >>> lx_out["shortlum_int"] # doctest: +REMOTE_DATA """ # Calculate X-ray luminosities longlum = _calc_xraylum(longflux, date=date) shortlum = _calc_xraylum(shortflux, date=date) # If obstime keyword giving measurement times is set, calculate # total energy radiated in the GOES bandpasses during the flare. if obstime is not None: # First ensure longflux, shortflux, and obstime are all of # equal length and obstime is of correct type. if not len(longflux) == len(shortflux) == len(obstime): raise ValueError("longflux, shortflux, and obstime must all have " "same number of elements.") if type(obstime) == pandas.DatetimeIndex: obstime = obstime.to_pydatetime if any(type(obst) == str for obst in obstime): parse_time(obstime) if not all(type(obst) == datetime.datetime for obst in obstime): raise TypeError("obstime must be an array-like whose elements are" " convertible to datetime objects.") # Check elements in obstime in chronological order chrono_check = obstime-np.roll(obstime, 1) chrono_check = chrono_check[1:] if not all(chrono_check > datetime.timedelta(0)): raise ValueError( "Elements of obstime must be in chronological order.") # Next, get measurement times in seconds from time of first # measurement. obstime_seconds = np.array([(ot-obstime[0]).total_seconds() for ot in obstime], dtype="float64") # Finally, integrate using trapezoid rule longlum_int = trapz(longlum.value, obstime_seconds) longlum_int = u.Quantity(longlum_int, unit=longlum.unit*u.s) shortlum_int = trapz(shortlum.value, obstime_seconds) shortlum_int = u.Quantity(shortlum_int, unit=shortlum.unit*u.s) # Calculate cumulative radiated energy in each GOES channel as # a function of time. longlum_cumul = cumtrapz(longlum.value, obstime_seconds) longlum_cumul = u.Quantity(longlum_cumul, unit=longlum.unit*u.s) shortlum_cumul = cumtrapz(shortlum.value, obstime_seconds) shortlum_cumul = u.Quantity(shortlum_cumul, unit=shortlum.unit*u.s) lx_out = {"longlum": longlum, "shortlum": shortlum, "longlum_cumul": longlum_cumul, "shortlum_cumul": shortlum_cumul, "longlum_int": longlum_int, "shortlum_int": shortlum_int} else: lx_out = {"longlum": longlum, "shortlum": shortlum} return lx_out @u.quantity_input(flux=u.W/u.m/u.m) def _calc_xraylum(flux, date=None): """ Calculates solar luminosity based on observed flux observed at 1AU. This function calculates the luminosity from the Sun based on observed flux in W/m**2. The units of the results are erg/s. The calculation is made by simply assuming that the radiation is emitted isotropically, i.e. is distributed over a spherical surface area with a radius equal to the Sun-Earth distance. Parameters ---------- flux : `~astropy.units.Quantity` Containing the observed solar flux. Units=[W/m**2] date : (optional) `datetime.datetime` object or valid date string Used to calculate a more accurate Sun-Earth distance based on Earth's orbit at that date. If date is None, Sun-Earth distance is set to 1AU. Returns ------- xraylum : `~astropy.units.Quantity` array with units=erg/s. Array of X-ray luminosity. Examples -------- >>> from sunpy.instr.goes import _calc_xraylum >>> from astropy.units.quantity import Quantity >>> flux = Quantity([7e-6,7e-6], unit="W/m**2") >>> xraylum = _calc_xraylum(flux, date="2014-04-21") # doctest: +REMOTE_DATA >>> xraylum # doctest: +REMOTE_DATA """ if date is not None: date = parse_time(date) xraylum = 4 * np.pi * get_sunearth_distance(date).to("m")**2 * flux else: xraylum = 4 * np.pi * sun.constants.au.to("m")**2 * flux return xraylum def flareclass_to_flux(flareclass): """ Converts a GOES flare class into the corresponding X-ray flux. Parameters ---------- flareclass : str The case-insensitive flare class (e.g., 'X3.2', 'm1.5', 'A9.6'). Returns ------- flux : `~astropy.units.Quantity` X-ray flux between 1 and 8 Angstroms as measured near Earth in W/m^2. Raises ------ TypeError Input must be a string. Examples -------- >>> from sunpy.instr.goes import flareclass_to_flux >>> flareclass_to_flux('A1.0') #doctest: +FLOAT_CMP >>> flareclass_to_flux('c4.7') >>> flareclass_to_flux('X2.4') """ if not isinstance(flareclass, type('str')): raise TypeError("Input must be a string") # TODO should probably make sure the string is in the expected format. flareclass = flareclass.upper() # invert the conversion dictionary # conversion_dict = {v: k for k, v in GOES_CONVERSION_DICT.items()} return float(flareclass[1:]) * GOES_CONVERSION_DICT[flareclass[0]] @u.quantity_input(goesflux=u.watt/u.m**2) def flux_to_flareclass(goesflux): """ Converts X-ray flux into the corresponding GOES flare class. Parameters ---------- flux : `~astropy.units.Quantity` X-ray flux between 1 and 8 Angstroms (usually measured by GOES) as measured at the Earth in W/m^2 Returns ------- flareclass : str The flare class e.g.: 'X3.2', 'M1.5', 'A9.6'. Raises ------ ValueError Flux cannot be negative. References ---------- `Solar Flare Classification `_ Examples -------- >>> from sunpy.instr.goes import flux_to_flareclass >>> import astropy.units as u >>> flux_to_flareclass(1e-08 * u.watt/u.m**2) 'A1' >>> flux_to_flareclass(4.7e-06 * u.watt/u.m**2) 'C4.7' >>> flux_to_flareclass(0.00024 * u.watt/u.m**2) 'X2.4' >>> flux_to_flareclass(7.8e-09 * u.watt/u.m**2) 'A0.78' >>> flux_to_flareclass(0.00682 * u.watt/u.m**2) 'X68.2' """ if goesflux.value < 0: raise ValueError("Flux cannot be negative") decade = np.floor(np.log10(goesflux.to('W/m**2').value)) # invert the conversion dictionary conversion_dict = {v: k for k, v in GOES_CONVERSION_DICT.items()} if decade < -8: str_class = "A" decade = -8 elif decade > -4: str_class = "X" decade = -4 else: str_class = conversion_dict.get(u.Quantity(10 ** decade, "W/m**2")) goes_subclass = 10 ** -decade * goesflux.to('W/m**2').value return "{0}{1:.3g}".format(str_class, goes_subclass) sunpy-0.8.3/sunpy/instr/lyra.py0000644000175000017500000007607413231613137016750 0ustar nabilnabil00000000000000from __future__ import absolute_import, division, print_function import os.path import datetime from warnings import warn import copy import csv import sqlite3 import numpy as np from astropy.io import fits import pandas from sunpy.time import parse_time from sunpy.util.net import check_download_file from sunpy.util.config import get_and_create_download_dir from sunpy.util.decorators import deprecated from sunpy.extern.six.moves import urllib LYTAF_REMOTE_PATH = "http://proba2.oma.be/lyra/data/lytaf/" __all__ = ['remove_lytaf_events_from_lightcurve', 'remove_lytaf_events_from_timeseries', 'get_lytaf_events', 'get_lytaf_event_types', 'download_lytaf_database', 'split_series_using_lytaf'] @deprecated('v0.8', message="""``remove_lytaf_events_from_lightcurve`` is deprecated as of SunPy v0.8 due to the deprecation of ``LightCurve`` in favour of ``TimeSeries``. You should use ``remove_lytaf_events_from_timeseries`` instead.""", name="remove_lytaf_events_from_lightcurve", alternative="remove_lytaf_events_from_timeseries" ) def remove_lytaf_events_from_lightcurve(lc, **kwargs): return remove_lytaf_events_from_timeseries(lc, **kwargs) def remove_lytaf_events_from_timeseries(ts, artifacts=None, return_artifacts=False, lytaf_path=None, force_use_local_lytaf=False): """ Removes periods of LYRA artifacts defined in LYTAF from a TimeSeries. Parameters ---------- ts : `sunpy.timeseries.TimeSeries` artifacts : list of strings Sets the artifact types to be removed. For a list of artifact types see reference [1]. For example, if a user wants to remove only large angle rotations, listed at reference [1] as LAR, set artifacts=["LAR"]. The default is that no artifacts will be removed. return_artifacts : `bool` Set to True to return a `numpy.recarray` containing the start time, end time and type of all artifacts removed. Default=False lytaf_path : `str` directory path where the LYRA annotation files are stored. force_use_local_lytaf : `bool` Ensures current local version of lytaf files are not replaced by up-to-date online versions even if current local lytaf files do not cover entire input time range etc. Default=False Returns ------- ts_new : `sunpy.timeseries.TimeSeries` copy of input TimeSeries with periods corresponding to artifacts removed. artifact_status : `dict` List of 4 variables containing information on what artifacts were found, removed, etc. from the time series. | **artifact_status["lytaf"]** : `numpy.recarray` | The full LYRA annotation file for the time series time range | output by get_lytaf_events(). | **artifact_status["removed"]** : `numpy.recarray` | Artifacts which were found and removed from from time series. | **artifact_status["not_removed"]** : `numpy.recarray` | Artifacts which were found but not removed as they were not | included when user defined artifacts kwarg. | **artifact_status["not_found"]** : `list` of strings | Artifacts listed to be removed by user when defining | artifacts kwarg which were not found in time series time range. Notes ----- This function is intended to take TimeSeries objects as input, but the deprecated LightCurve is still supported here. References ---------- [1] http://proba2.oma.be/data/TARDIS Examples -------- Remove LARs (Large Angle Rotations) from TimeSeries for 4-Dec-2014: >>> import sunpy.timeseries as ts >>> import sunpy.data.sample >>> from sunpy.instr.lyra import remove_lytaf_events_from_timeseries >>> lyrats = ts.TimeSeries(sunpy.data.sample.LYRA_LEVEL3_TIMESERIES, source='LYRA') >>> ts_nolars = remove_lytaf_events_from_timeseries(lyrats, artifacts=["LAR"]) # doctest: +REMOTE_DATA To also retrieve information on the artifacts during that day: >>> ts_nolars, artifact_status = remove_lytaf_events_from_timeseries( ... lyrats, artifacts=["LAR"], return_artifacts=True) # doctest: +REMOTE_DATA """ # Check that input argument is of correct type if not lytaf_path: lytaf_path = get_and_create_download_dir() # Remove artifacts from time series data_columns = ts.data.columns time, channels, artifact_status = _remove_lytaf_events( ts.data.index, channels=[np.asanyarray(ts.data[col]) for col in data_columns], artifacts=artifacts, return_artifacts=True, lytaf_path=lytaf_path, force_use_local_lytaf=force_use_local_lytaf) # Create new copy copy of timeseries and replace data with # artifact-free time series. ts_new = copy.deepcopy(ts) ts_new.data = pandas.DataFrame( index=time, data=dict((col, channels[i]) for i, col in enumerate(data_columns))) if return_artifacts: return ts_new, artifact_status else: return ts_new def _remove_lytaf_events(time, channels=None, artifacts=None, return_artifacts=False, fitsfile=None, csvfile=None, filecolumns=None, lytaf_path=None, force_use_local_lytaf=False): """ Removes periods of LYRA artifacts from a time series. This functions removes periods corresponding to certain artifacts recorded in the LYRA annotation file from an array of times given by the time input. If a list of arrays of other properties is supplied through the channels kwarg, then the relevant values from these arrays are also removed. This is done by assuming that each element in each array supplied corresponds to the time in the same index in time array. The artifacts to be removed are given via the artifacts kwarg. The default is "all", meaning that all artifacts will be removed. However, a subset of artifacts can be removed by supplying a list of strings of the desired artifact types. Parameters ---------- time : `numpy.ndarray` of `datetime.datetime` Gives the times of the timeseries. channels : `list` of `numpy.array` convertible to float64. Contains arrays of the irradiances taken at the times in the time variable. Each element in the list must have the same number of elements as time. artifacts : `list` of strings Contain the artifact types to be removed. For list of artifact types see reference [1]. For example, if user wants to remove only large angle rotations, listed at reference [1] as LAR, let artifacts=["LAR"]. Default=[], i.e. no artifacts will be removed. return_artifacts : `bool` Set to True to return a numpy recarray containing the start time, end time and type of all artifacts removed. Default=False fitsfile : `str` file name (including file path and suffix, .fits) of output fits file which is generated if this kwarg is not None. Default=None, i.e. no fits file is output. csvfile : `str` file name (including file path and suffix, .csv) of output csv file which is generated if this kwarg is not None. Default=None, i.e. no csv file is output. filecolumns : `list` of strings Gives names of columns of any output files produced. Although initially set to None above, the default is in fact ["time", "channel0", "channel1",..."channelN"] where N is the number of irradiance arrays in the channels input (assuming 0-indexed counting). lytaf_path : `str` directory path where the LYRA annotation files are stored. force_use_local_lytaf : `bool` Ensures current local version of lytaf files are not replaced by up-to-date online versions even if current local lytaf files do not cover entire input time range etc. Default=False Returns ------- clean_time : `numpy.ndarray` of `datetime.datetime` time array with artifact periods removed. clean_channels : `list` ndarrays/array-likes convertible to float64 list of irradiance arrays with artifact periods removed. artifact_status : `dict` List of 4 variables containing information on what artifacts were found, removed, etc. from the time series. artifact_status["lytaf"] = artifacts found : `numpy.recarray` The full LYRA annotation file for the time series time range output by get_lytaf_events(). artifact_status["removed"] = artifacts removed : `numpy.recarray` Artifacts which were found and removed from from time series. artifact_status["not_removed"] = artifacts found but not removed : `numpy.recarray` Artifacts which were found but not removed as they were not included when user defined artifacts kwarg. artifact_status["not_found"] = artifacts not found : `list` of strings Artifacts listed to be removed by user when defining artifacts kwarg which were not found in time series time range. References ---------- [1] http://proba2.oma.be/data/TARDIS Example ------- Sample data for example >>> from datetime import datetime, timedelta >>> from sunpy.instr.lyra import _remove_lytaf_events >>> time = np.array([datetime(2013, 2, 1)+timedelta(minutes=i) ... for i in range(120)]) >>> channel_1 = np.zeros(len(time))+0.4 >>> channel_2 = np.zeros(len(time))+0.1 Remove LARs (Large Angle Rotations) from time series. >>> time_clean, channels_clean = _remove_lytaf_events( ... time, channels=[channel_1, channel_2], artifacts=['LAR']) # doctest: +REMOTE_DATA """ # Check inputs if not lytaf_path: lytaf_path = get_and_create_download_dir() if channels and type(channels) is not list: raise TypeError("channels must be None or a list of numpy arrays " "of dtype 'float64'.") if not artifacts: raise ValueError("User has supplied no artifacts to remove.") if type(artifacts) is str: artifacts = [artifacts] if not all(isinstance(artifact_type, str) for artifact_type in artifacts): raise TypeError("All elements in artifacts must in strings.") all_lytaf_event_types = get_lytaf_event_types(lytaf_path=lytaf_path, print_event_types=False) for artifact in artifacts: if artifact not in all_lytaf_event_types: print(all_lytaf_event_types) raise ValueError("{0} is not a valid artifact type. See above.".format(artifact)) # Define outputs clean_time = np.array([parse_time(t) for t in time]) clean_channels = copy.deepcopy(channels) artifacts_not_found = [] # Get LYTAF file for given time range lytaf = get_lytaf_events(time[0], time[-1], lytaf_path=lytaf_path, force_use_local_lytaf=force_use_local_lytaf) # Find events in lytaf which are to be removed from time series. artifact_indices = np.empty(0, dtype="int64") for artifact_type in artifacts: indices = np.where(lytaf["event_type"] == artifact_type)[0] # If none of a given type of artifact is found, record this # type in artifact_not_found list. if len(indices) == 0: artifacts_not_found.append(artifact_type) else: # Else, record the indices of the artifacts of this type artifact_indices = np.concatenate((artifact_indices, indices)) artifact_indices.sort() # Remove relevant artifacts from timeseries. If none of the # artifacts the user wanted removed were found, raise a warning and # continue with code. if not len(artifact_indices): warn("None of user supplied artifacts were found.") artifacts_not_found = artifacts else: # Remove periods corresponding to artifacts from flux and time # arrays. bad_indices = np.empty(0, dtype="int64") all_indices = np.arange(len(time)) for index in artifact_indices: bad_period = np.logical_and(time >= lytaf["begin_time"][index], time <= lytaf["end_time"][index]) bad_indices = np.append(bad_indices, all_indices[bad_period]) clean_time = np.delete(clean_time, bad_indices) if channels: for i, f in enumerate(clean_channels): clean_channels[i] = np.delete(f, bad_indices) # If return_artifacts kwarg is True, return a list containing # information on what artifacts found, removed, etc. See docstring. if return_artifacts: artifact_status = {"lytaf": lytaf, "removed": lytaf[artifact_indices], "not_removed": np.delete(lytaf, artifact_indices), "not_found": artifacts_not_found} # Output FITS file if fits kwarg is set if fitsfile: # Create time array of time strings rather than datetime objects # and verify filecolumns have been correctly input. If None, # generate generic filecolumns (see docstring of function called # below. string_time, filecolumns = _prep_columns(time, channels, filecolumns) # Prepare column objects. cols = [fits.Column(name=filecolumns[0], format="26A", array=string_time)] if channels: for i, f in enumerate(channels): cols.append(fits.Column(name=filecolumns[i+1], format="D", array=f)) coldefs = fits.ColDefs(cols) tbhdu = fits.new_table(coldefs) hdu = fits.PrimaryHDU() tbhdulist = fits.HDUList([hdu, tbhdu]) # Write data to fits file. tbhdulist.writeto(fitsfile) # Output csv file if csv kwarg is set. if csvfile: # Create time array of time strings rather than datetime objects # and verify filecolumns have been correctly input. If None, # generate generic filecolumns (see docstring of function called # below. string_time, filecolumns = _prep_columns(time, channels, filecolumns) # Open and write data to csv file. with open(csvfile, 'w') as openfile: csvwriter = csv.writer(openfile, delimiter=';') # Write header. csvwriter.writerow(filecolumns) # Write data. if not channels: for i in range(len(time)): csvwriter.writerow(string_time[i]) else: for i in range(len(time)): row = [string_time[i]] for f in channels: row.append(f[i]) csvwriter.writerow(row) # Return values. if return_artifacts: if not channels: return clean_time, artifact_status else: return clean_time, clean_channels, artifact_status else: if not channels: return clean_time else: return clean_time, clean_channels def get_lytaf_events(start_time, end_time, lytaf_path=None, combine_files=("lyra", "manual", "ppt", "science"), csvfile=None, force_use_local_lytaf=False): """ Extracts combined lytaf file for given time range. Given a time range defined by start_time and end_time, this function extracts the segments of each LYRA annotation file and combines them. Parameters ---------- start_time : `datetime.datetime` or `str` Start time of period for which annotation file is required. end_time : `datetime.datetime` or `str` End time of period for which annotation file is required. lytaf_path : `str` directory path where the LYRA annotation files are stored. combine_files : `tuple` of strings States which LYRA annotation files are to be combined. Default is all four, i.e. lyra, manual, ppt, science. See Notes section for an explanation of each. force_use_local_lytaf : `bool` Ensures current local version of lytaf files are not replaced by up-to-date online versions even if current local lytaf files do not cover entire input time range etc. Default=False Returns ------- lytaf : `numpy.recarray` Containing the various parameters stored in the LYTAF files. Notes ----- There are four LYRA annotation files which mark different types of events or artifacts in the data. They are named annotation_suffix.db where suffix is a variable equalling either lyra, manual, ppt, or science. annotation_lyra.db : contains entries regarding possible effects to the data due to normal operation of LYRA instrument. annotation_manual.db : contains entries regarding possible effects to the data due to unusual or manually logged events. annotation_ppt.db : contains entries regarding possible effects to the data due to pointing or positioning of PROBA2. annotation_science.db : contains events in the data scientifically interesting, e.g. GOES flares. References ---------- Further documentation: http://proba2.oma.be/data/TARDIS Examples -------- Get all events in the LYTAF files for January 2014 >>> from sunpy.instr.lyra import get_lytaf_events >>> lytaf = get_lytaf_events('2014-01-01', '2014-02-01') # doctest: +REMOTE_DATA """ # Check inputs # Check lytaf path if not lytaf_path: lytaf_path = get_and_create_download_dir() # Check start_time and end_time is a date string or datetime object start_time = parse_time(start_time) end_time = parse_time(end_time) # Check combine_files contains correct inputs if not all(suffix in ["lyra", "manual", "ppt", "science"] for suffix in combine_files): raise ValueError("Elements in combine_files must be strings equalling " "'lyra', 'manual', 'ppt', or 'science'.") # Remove any duplicates from combine_files input combine_files = list(set(combine_files)) combine_files.sort() # Convert input times to UNIX timestamp format since this is the # time format in the annotation files start_time_uts = (start_time - datetime.datetime(1970, 1, 1)).total_seconds() end_time_uts = (end_time - datetime.datetime(1970, 1, 1)).total_seconds() # Define numpy record array which will hold the information from # the annotation file. lytaf = np.empty((0,), dtype=[("insertion_time", object), ("begin_time", object), ("reference_time", object), ("end_time", object), ("event_type", object), ("event_definition", object)]) # Access annotation files for suffix in combine_files: # Check database files are present dbname = "annotation_{0}.db".format(suffix) check_download_file(dbname, LYTAF_REMOTE_PATH, lytaf_path) # Open SQLITE3 annotation files connection = sqlite3.connect(os.path.join(lytaf_path, dbname)) # Create cursor to manipulate data in annotation file cursor = connection.cursor() # Check if lytaf file spans the start and end times defined by # user. If not, download newest version. # First get start time of first event and end time of last # event in lytaf. cursor.execute("select begin_time from event order by begin_time asc " "limit 1;") db_first_begin_time = cursor.fetchone()[0] db_first_begin_time = datetime.datetime.fromtimestamp(db_first_begin_time) cursor.execute("select end_time from event order by end_time desc " "limit 1;") db_last_end_time = cursor.fetchone()[0] db_last_end_time = datetime.datetime.fromtimestamp(db_last_end_time) # If lytaf does not include entire input time range... if not force_use_local_lytaf: if end_time > db_last_end_time or start_time < db_first_begin_time: # ...close lytaf file... cursor.close() connection.close() # ...Download latest lytaf file... check_download_file(dbname, LYTAF_REMOTE_PATH, lytaf_path, replace=True) # ...and open new version of lytaf database. connection = sqlite3.connect(os.path.join(lytaf_path, dbname)) cursor = connection.cursor() # Select and extract the data from event table within file within # given time range cursor.execute("select insertion_time, begin_time, reference_time, " "end_time, eventType_id from event where end_time >= " "{0} and begin_time <= " "{1}".format(start_time_uts, end_time_uts)) event_rows = cursor.fetchall() # Select and extract the event types from eventType table cursor.row_factory = sqlite3.Row cursor.execute("select * from eventType") eventType_rows = cursor.fetchall() eventType_id = [] eventType_type = [] eventType_definition = [] for eventType_row in eventType_rows: eventType_id.append(eventType_row["id"]) eventType_type.append(eventType_row["type"]) eventType_definition.append(eventType_row["definition"]) # Enter desired information into the lytaf numpy record array for event_row in event_rows: id_index = eventType_id.index(event_row[4]) lytaf = np.append(lytaf, np.array((datetime.datetime.utcfromtimestamp(event_row[0]), datetime.datetime.utcfromtimestamp(event_row[1]), datetime.datetime.utcfromtimestamp(event_row[2]), datetime.datetime.utcfromtimestamp(event_row[3]), eventType_type[id_index], eventType_definition[id_index]), dtype=lytaf.dtype)) # Close file cursor.close() connection.close() # Sort lytaf in ascending order of begin time np.recarray.sort(lytaf, order="begin_time") # If csvfile kwarg is set, write out lytaf to csv file if csvfile: # Open and write data to csv file. with open(csvfile, 'w') as openfile: csvwriter = csv.writer(openfile, delimiter=';') # Write header. csvwriter.writerow(lytaf.dtype.names) # Write data. for row in lytaf: new_row = [] new_row.append(row[0].strftime("%Y-%m-%dT%H:%M:%S")) new_row.append(row[1].strftime("%Y-%m-%dT%H:%M:%S")) new_row.append(row[2].strftime("%Y-%m-%dT%H:%M:%S")) new_row.append(row[3].strftime("%Y-%m-%dT%H:%M:%S")) new_row.append(row[4]) new_row.append(row[5]) csvwriter.writerow(new_row) return lytaf def get_lytaf_event_types(lytaf_path=None, print_event_types=True): """Prints the different event types in the each of the LYTAF databases. Parameters ---------- lytaf_path : `str` Path location where LYTAF files are stored. Default = Path stored in confog file. print_event_types : `bool` If True, prints the artifacts in each lytaf database to screen. Returns ------- all_event_types : `list` List of all events types in all lytaf databases. """ # Set lytaf_path is not done by user if not lytaf_path: lytaf_path = get_and_create_download_dir() suffixes = ["lyra", "manual", "ppt", "science"] all_event_types = [] # For each database file extract the event types and print them. if print_event_types: print("\nLYTAF Event Types\n-----------------\n") for suffix in suffixes: dbname = "annotation_{0}.db".format(suffix) # Check database file exists, else download it. check_download_file(dbname, LYTAF_REMOTE_PATH, lytaf_path) # Open SQLITE3 LYTAF files connection = sqlite3.connect(os.path.join(lytaf_path, dbname)) # Create cursor to manipulate data in annotation file cursor = connection.cursor() cursor.execute("select type from eventType;") event_types = cursor.fetchall() all_event_types.append(event_types) if print_event_types: print("----------------\n{0} database\n----------------" .format(suffix)) for event_type in event_types: print(str(event_type[0])) print(" ") # Unpack event types in all_event_types into single list all_event_types = [event_type[0] for event_types in all_event_types for event_type in event_types] return all_event_types def download_lytaf_database(lytaf_dir=''): """download latest Proba2 pointing database from Proba2 Science Center""" url = 'http://proba2.oma.be/lyra/data/lytaf/annotation_ppt.db' destination = os.path.join(lytaf_dir, 'annotation_ppt.db') urllib.request.urlretrieve(url, destination) return def split_series_using_lytaf(timearray, data, lytaf): """ Proba-2 analysis code for splitting up LYRA timeseries around locations where LARs (and other data events) are observed. Parameters ---------- timearray : `numpy.ndarray` of times understood by `sunpy.time.parse_time` function. data : `numpy.array` corresponding to the given time array lytaf : `numpy.recarray` Events obtained from querying LYTAF database using lyra.get_lytaf_events(). Output ------ output : `list` of dictionaries Each dictionary contains a sub-series corresponding to an interval of 'good data'. """ n = len(timearray) mask = np.ones(n) el = len(lytaf) # make the input time array a list of datetime objects datetime_array = [] for tim in timearray: datetime_array.append(parse_time(tim)) # scan through each entry retrieved from the LYTAF database for j in range(0, el): # want to mark all times with events as bad in the mask, i.e. = 0 start_dt = lytaf['begin_time'][j] end_dt = lytaf['end_time'][j] # find the start and end indices for each event start_ind = np.searchsorted(datetime_array, start_dt) end_ind = np.searchsorted(datetime_array, end_dt) # append the mask to mark event as 'bad' mask[start_ind:end_ind] = 0 diffmask = np.diff(mask) tmp_discontinuity = np.where(diffmask != 0.) # disc contains the indices of mask where there are discontinuities disc = tmp_discontinuity[0] if len(disc) == 0: print('No events found within time series interval. ' 'Returning original series.') return [{'subtimes': datetime_array, 'subdata': data}] # -1 in diffmask means went from good data to bad # +1 means went from bad data to good # want to get the data between a +1 and the next -1 # if the first discontinuity is a -1 then the start of the series was good. if diffmask[disc[0]] == -1.0: # make sure we can always start from disc[0] below disc = np.insert(disc, 0, 0) split_series = [] limit = len(disc) # now extract the good data regions and ignore the bad ones for h in range(0, limit, 2): if h == limit-1: # can't index h+1 here. Go to end of series subtimes = datetime_array[disc[h]:-1] subdata = data[disc[h]:-1] subseries = {'subtimes': subtimes, 'subdata': subdata} split_series.append(subseries) else: subtimes = datetime_array[disc[h]:disc[h+1]] subdata = data[disc[h]:disc[h+1]] subseries = {'subtimes': subtimes, 'subdata': subdata} split_series.append(subseries) return split_series def _lytaf_event2string(integers): if type(integers) == int: integers = [integers] # else: # n=len(integers) out = [] for i in integers: if i == 1: out.append('LAR') if i == 2: out.append('N/A') if i == 3: out.append('UV occult.') if i == 4: out.append('Vis. occult.') if i == 5: out.append('Offpoint') if i == 6: out.append('SAA') if i == 7: out.append('Auroral zone') if i == 8: out.append('Moon in LYRA') if i == 9: out.append('Moon in SWAP') if i == 10: out.append('Venus in LYRA') if i == 11: out.append('Venus in SWAP') return out def _prep_columns(time, channels=None, filecolumns=None): """ Checks and prepares data to be written out to a file. Firstly, this function converts the elements of time, whose entries are assumed to be datetime objects, to time strings. Secondly, it checks whether the number of elements in an input list of column names, filecolumns, is equal to the number of arrays in the list, channels. If not, a ValueError is raised. If however filecolumns equals None, a filenames list is generated equal to ["time", "channel0", "channel1",..., "channelN"] where N is the number of arrays in the list, channels (assuming 0-indexed counting). """ # Convert time which contains datetime objects to time strings. string_time = np.array([t.strftime("%Y-%m-%dT%H:%M:%S.%f") for t in time]) # If filenames is given... if filecolumns: # ...check all the elements are strings... if all(isinstance(column, str) for column in filecolumns) is False: raise TypeError("All elements in filecolumns must by strings.") # ...and that there are the same number of elements as there # are arrays in channels, plus 1 for a time array. Otherwise # raise a ValueError. if channels: ncol = 1 + len(channels) else: ncol = 1 if len(filecolumns) != ncol: raise ValueError("Number of elements in filecolumns must be " "equal to the number of input data arrays, " "i.e. time + elements in channels.") # If filenames not given, create a list of columns names of the # form: ["time", "channel0", "channel1",...,"channelN"] where N # is the number of arrays in channels (assuming 0-indexed counting). else: if channels: filecolumns = ["channel{0}".format(fluxnum) for fluxnum in range(len(channels))] filecolumns.insert(0, "time") else: filecolumns = ["time"] return string_time, filecolumns sunpy-0.8.3/sunpy/instr/rhessi.py0000644000175000017500000004464213232563447017303 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- """ Provides programs to process and analyze RHESSI data. .. warning:: This module is in development. """ from __future__ import absolute_import, print_function import csv import posixpath import re import socket import warnings from datetime import datetime, timedelta import numpy as np from dateutil.relativedelta import relativedelta from astropy.io import fits from astropy import units as u from sunpy.time import TimeRange, parse_time from sunpy.sun.sun import solar_semidiameter_angular_size from sunpy.coordinates import get_sunearth_distance import sunpy.map from sunpy.extern.six.moves import urllib from sunpy.extern.six.moves.urllib.request import urlopen, urlretrieve from sunpy.extern.six.moves.urllib.error import URLError __all__ = ['get_obssumm_dbase_file', 'parse_obssumm_dbase_file', 'get_obssum_filename', 'get_obssumm_file', 'parse_obssumm_file', 'backprojection'] # Measured fixed grid parameters grid_pitch = (4.52467, 7.85160, 13.5751, 23.5542, 40.7241, 70.5309, 122.164, 211.609, 366.646) grid_orientation = (3.53547, 2.75007, 3.53569, 2.74962, 3.92596, 2.35647, 0.786083, 0.00140674, 1.57147) data_servers = ('https://hesperia.gsfc.nasa.gov/hessidata/', 'http://hessi.ssl.berkeley.edu/hessidata/', 'http://soleil.i4ds.ch/hessidata/') lc_linecolors = ('black', 'pink', 'green', 'blue', 'brown', 'red', 'navy', 'orange', 'green') def get_base_url(): """ Find the first mirror which is online """ for server in data_servers: try: urlopen(server, timeout=1) return server except (URLError, socket.timeout): pass raise IOError('Unable to find an online HESSI server from {0}'.format(data_servers)) def get_obssumm_dbase_file(time_range): """ Download the RHESSI observing summary database file. This file lists the name of observing summary files for specific time ranges. Parameters ---------- time_range : `str`, `sunpy.time.TimeRange` A `~sunpy.time.TimeRange` or `~sunpy.time.TimeRange` compatible string. Returns ------- value : `tuple` Return a `tuple` (filename, headers) where filename is the local file name under which the object can be found, and headers is whatever the info() method of the object returned by urlopen. Examples -------- >>> import sunpy.instr.rhessi as rhessi >>> fname, hdrs = rhessi.get_obssumm_dbase_file(('2011/04/04', '2011/04/05')) # doctest: +SKIP References ---------- | http://hesperia.gsfc.nasa.gov/ssw/hessi/doc/guides/hessi_data_access.htm#Observing Summary Data .. note:: This API is currently limited to providing data from whole days only. """ _time_range = TimeRange(time_range) if _time_range.start < parse_time("2002/02/01"): raise ValueError("RHESSI summary files are not available for before 2002-02-01") _check_one_day(_time_range) url = posixpath.join(get_base_url(), 'dbase', _time_range.start.strftime("hsi_obssumm_filedb_%Y%m.txt")) return urlretrieve(url) def parse_obssumm_dbase_file(filename): """ Parse the RHESSI observing summary database file. This file lists the name of observing summary files for specific time ranges along with other info Parameters ---------- filename : `str` The filename of the obssumm dbase file. Returns ------- out : `dict` Return a `dict` containing the parsed data in the dbase file. Examples -------- >>> import sunpy.instr.rhessi as rhessi >>> fname, _ = rhessi.get_obssumm_dbase_file(('2011/04/04', '2011/04/05')) # doctest: +SKIP >>> rhessi.parse_obssumm_dbase_file(fname) # doctest: +SKIP References ---------- | http://hesperia.gsfc.nasa.gov/ssw/hessi/doc/guides/hessi_data_access.htm#Observing Summary Data .. note:: This API is currently limited to providing data from whole days only. """ # An example dbase file can be found at: # http://hesperia.gsfc.nasa.gov/hessidata/dbase/hsi_obssumm_filedb_200311.txt with open(filename) as fd: reader = csv.reader(fd, delimiter=' ', skipinitialspace=True) _ = next(reader) # skip 'HESSI Filedb File:' row _ = next(reader) # skip 'Created: ...' row _ = next(reader) # skip 'Number of Files: ...' row column_names = next(reader) # ['Filename', 'Orb_st', 'Orb_end',...] obssumm_filename = [] orbit_start = [] orbit_end = [] start_time = [] end_time = [] status_flag = [] number_of_packets = [] for row in reader: obssumm_filename.append(row[0]) orbit_start.append(int(row[1])) orbit_end.append(int(row[2])) start_time.append(datetime.strptime(row[3], '%d-%b-%y')) # skip time end_time.append(datetime.strptime(row[5], '%d-%b-%y')) # skip time status_flag.append(int(row[7])) number_of_packets.append(int(row[8])) return { column_names[0].lower(): obssumm_filename, column_names[1].lower(): orbit_start, column_names[2].lower(): orbit_end, column_names[3].lower(): start_time, column_names[4].lower(): end_time, column_names[5].lower(): status_flag, column_names[6].lower(): number_of_packets } def get_obssum_filename(time_range): """ Download the RHESSI observing summary data from one of the RHESSI servers, parses it, and returns the name of the obssumm files relevant for the time range. Parameters ---------- time_range : str, TimeRange A TimeRange or time range compatible string Returns ------- out : list Returns the filenames of the observation summary file Examples -------- >>> import sunpy.instr.rhessi as rhessi >>> rhessi.get_obssum_filename(('2011/04/04', '2011/04/05')) # doctest: +SKIP ['http://soleil.i4ds.ch/hessidata/metadata/catalog/hsi_obssumm_20110404_042.fits'] .. note:: This API is currently limited to providing data from whole days only. """ time_range = TimeRange(time_range) delta = relativedelta(time_range.end, time_range.start) if delta.years > 0 or delta.months > 0: raise ValueError("Rhessi search results can not be found for a" " time range crossing multiple months.") # need to download and inspect the dbase file to determine the filename # for the observing summary data dbase_file_name, _ = get_obssumm_dbase_file(time_range) dbase_dat = parse_obssumm_dbase_file(dbase_file_name) index_number_start = time_range.start.day - 1 # If end is 0 set it to 1 so we always have at least one record. index_number_end = time_range.end.day - 1 or index_number_start + 1 filenames = dbase_dat.get('filename')[index_number_start:index_number_end] return [posixpath.join(get_base_url(), 'metadata', 'catalog', filename + 's') for filename in filenames] def get_obssumm_file(time_range): """ Download the RHESSI observing summary data from one of the RHESSI servers. Parameters ---------- time_range : `str`, `sunpy.time.TimeRange` A TimeRange or time range compatible string Returns ------- out : tuple Return a tuple (filename, headers) where filename is the local file name under which the object can be found, and headers is whatever the info() method of the object returned by urlopen. Examples -------- >>> import sunpy.instr.rhessi as rhessi >>> fname, hdrs = rhessi.get_obssumm_file(('2011/04/04', '2011/04/05')) # doctest: +SKIP .. note:: This API is currently limited to providing data from whole days only. """ _check_one_day(TimeRange(time_range)) filenames = get_obssum_filename(time_range) # As we only support providing data from one whole day, only get the first file return urlretrieve(filenames[0]) def parse_obssumm_file(filename): """ Parse a RHESSI observation summary file. Note: this is for the Lightcurve datatype only, the TimSeries uses the parse_obssumm_hdulist(hdulist) method to enable implicit source detection. Parameters ---------- filename : str The filename of a RHESSI fits file. Returns ------- value : `tuple` Return a `tuple` (fits_header, data). Where fits_header is of type `~astropy.io.fits.header.Header` and data of type `dict` Examples -------- >>> import sunpy.instr.rhessi as rhessi >>> fname, _ = rhessi.get_obssumm_file(('2011/04/04', '2011/04/05')) # doctest: +SKIP >>> data = rhessi.parse_obssumm_file(fname) # doctest: +SKIP """ afits = fits.open(filename) fits_header = afits[0].header reference_time_ut = parse_time(afits[5].data.field('UT_REF')[0]) time_interval_sec = afits[5].data.field('TIME_INTV')[0] # The data stored in the FITS file are "compressed" countrates stored as # one byte compressed_countrate = np.array(afits[6].data.field('countrate')) countrate = uncompress_countrate(compressed_countrate) dim = np.array(countrate[:, 0]).size time_array = [reference_time_ut + timedelta(0, time_interval_sec * a) for a in np.arange(dim)] labels = _build_energy_bands(label=afits[5].data.field('DIM1_UNIT')[0], bands=afits[5].data.field('DIM1_IDS')[0]) return fits_header, dict(time=time_array, data=countrate, labels=labels) def parse_obssumm_hdulist(hdulist): """ Parse a RHESSI observation summary file. Parameters ---------- hdulist : list The HDU list from the fits file. Returns ------- out : `dict` Returns a dictionary. """ header = hdulist[0].header reference_time_ut = parse_time(hdulist[5].data.field('UT_REF')[0]) time_interval_sec = hdulist[5].data.field('TIME_INTV')[0] # label_unit = fits[5].data.field('DIM1_UNIT')[0] # labels = fits[5].data.field('DIM1_IDS') labels = ['3 - 6 keV', '6 - 12 keV', '12 - 25 keV', '25 - 50 keV', '50 - 100 keV', '100 - 300 keV', '300 - 800 keV', '800 - 7000 keV', '7000 - 20000 keV'] # The data stored in the fits file are "compressed" countrates stored as # one byte compressed_countrate = np.array(hdulist[6].data.field('countrate')) countrate = uncompress_countrate(compressed_countrate) dim = np.array(countrate[:, 0]).size time_array = [reference_time_ut + timedelta(0, time_interval_sec * a) for a in np.arange(dim)] # TODO generate the labels for the dict automatically from labels data = {'time': time_array, 'data': countrate, 'labels': labels} return header, data def uncompress_countrate(compressed_countrate): """Convert the compressed count rate inside of observing summary file from a compressed byte to a true count rate Parameters ---------- compressed_countrate : byte array A compressed count rate returned from an observing summary file. References ---------- Hsi_obs_summ_decompress.pro ``_ """ # Ensure uncompressed counts are between 0 and 255 if (compressed_countrate.min() < 0) or (compressed_countrate.max() > 255): raise ValueError( 'Exepected uncompressed counts {} to in range 0-255'.format(compressed_countrate)) # TODO Must be a better way than creating entire lookup table on each call ll = np.arange(0, 16, 1) lkup = np.zeros(256, dtype='int') _sum = 0 for i in range(0, 16): lkup[16 * i:16 * (i + 1)] = ll * 2 ** i + _sum if i < 15: _sum = lkup[16 * (i + 1) - 1] + 2 ** i return lkup[compressed_countrate] def hsi_linecolors(): """Define discrete colors to use for RHESSI plots Parameters ---------- None Returns ------- tuple : matplotliblib color list References ---------- hsi_linecolors.pro ``_ """ return ('black', 'magenta', 'lime', 'cyan', 'y', 'red', 'blue', 'orange', 'olive') def _backproject(calibrated_event_list, detector=8, pixel_size=(1., 1.), image_dim=(64, 64)): """ Given a stacked calibrated event list fits file create a back projection image for an individual detectors. This function is used by backprojection. Parameters ---------- calibrated_event_list : string filename of a RHESSI calibrated event list detector : int the detector number pixel_size : 2-tuple the size of the pixels in arcseconds. Default is (1,1). image_dim : 2-tuple the size of the output image in number of pixels Returns ------- out : ndarray Return a backprojection image. Examples -------- >>> import sunpy.instr.rhessi as rhessi """ # info_parameters = fits[2] # detector_efficiency = info_parameters.data.field('cbe_det_eff$$REL') afits = fits.open(calibrated_event_list) fits_detector_index = detector + 2 detector_index = detector - 1 grid_angle = np.pi/2. - grid_orientation[detector_index] harm_ang_pitch = grid_pitch[detector_index]/1 phase_map_center = afits[fits_detector_index].data.field('phase_map_ctr') this_roll_angle = afits[fits_detector_index].data.field('roll_angle') modamp = afits[fits_detector_index].data.field('modamp') grid_transmission = afits[fits_detector_index].data.field('gridtran') count = afits[fits_detector_index].data.field('count') tempa = (np.arange(image_dim[0] * image_dim[1]) % image_dim[0]) - (image_dim[0]-1)/2. tempb = tempa.reshape(image_dim[0], image_dim[1]).transpose().reshape(image_dim[0]*image_dim[1]) pixel = np.array(list(zip(tempa, tempb)))*pixel_size[0] phase_pixel = (2 * np.pi/harm_ang_pitch) *\ (np.outer(pixel[:, 0], np.cos(this_roll_angle - grid_angle)) - np.outer(pixel[:, 1], np.sin(this_roll_angle - grid_angle))) + phase_map_center phase_modulation = np.cos(phase_pixel) gridmod = modamp * grid_transmission probability_of_transmission = gridmod * phase_modulation + grid_transmission bproj_image = np.inner(probability_of_transmission, count).reshape(image_dim) return bproj_image @u.quantity_input(pixel_size=u.arcsec, image_dim=u.pix) def backprojection(calibrated_event_list, pixel_size=(1., 1.) * u.arcsec, image_dim=(64, 64) * u.pix): """ Given a stacked calibrated event list fits file create a back projection image. .. warning:: The image is not in the right orientation! Parameters ---------- calibrated_event_list : string filename of a RHESSI calibrated event list pixel_size : `~astropy.units.Quantity` instance the size of the pixels in arcseconds. Default is (1,1). image_dim : `~astropy.units.Quantity` instance the size of the output image in number of pixels Returns ------- out : RHESSImap Return a backprojection map. Examples -------- >>> import sunpy.data >>> import sunpy.data.sample >>> import sunpy.instr.rhessi as rhessi >>> sunpy.data.download_sample_data(overwrite=False) # doctest: +SKIP >>> map = rhessi.backprojection(sunpy.data.sample.RHESSI_EVENT_LIST) # doctest: +SKIP >>> map.peek() # doctest: +SKIP """ pixel_size = pixel_size.to(u.arcsec) image_dim = np.array(image_dim.to(u.pix).value, dtype=int) afits = fits.open(calibrated_event_list) info_parameters = afits[2] xyoffset = info_parameters.data.field('USED_XYOFFSET')[0] time_range = TimeRange(info_parameters.data.field('ABSOLUTE_TIME_RANGE')[0]) image = np.zeros(image_dim) # find out what detectors were used det_index_mask = afits[1].data.field('det_index_mask')[0] detector_list = (np.arange(9)+1) * np.array(det_index_mask) for detector in detector_list: if detector > 0: image = image + _backproject(calibrated_event_list, detector=detector, pixel_size=pixel_size.value, image_dim=image_dim) dict_header = { "DATE-OBS": time_range.center.strftime("%Y-%m-%d %H:%M:%S"), "CDELT1": pixel_size[0], "NAXIS1": image_dim[0], "CRVAL1": xyoffset[0], "CRPIX1": image_dim[0]/2 + 0.5, "CUNIT1": "arcsec", "CTYPE1": "HPLN-TAN", "CDELT2": pixel_size[1], "NAXIS2": image_dim[1], "CRVAL2": xyoffset[1], "CRPIX2": image_dim[0]/2 + 0.5, "CUNIT2": "arcsec", "CTYPE2": "HPLT-TAN", "HGLT_OBS": 0, "HGLN_OBS": 0, "RSUN_OBS": solar_semidiameter_angular_size(time_range.center).value, "RSUN_REF": sunpy.sun.constants.radius.value, "DSUN_OBS": get_sunearth_distance(time_range.center).value * sunpy.sun.constants.au.value } result_map = sunpy.map.Map(image, dict_header) return result_map def _build_energy_bands(label, bands): """ Parameters ---------- label: `str` bands: `list` of `str` Returns ------- bands_with_units: `list` of `str` Each `str` item is an energy band and its unit Example ------- >>> from sunpy.instr.rhessi import _build_energy_bands >>> _build_energy_bands('Energy bands (keV)', ['3 - 6', '6 - 12', '12 - 25']) ['3 - 6 keV', '6 - 12 keV', '12 - 25 keV'] """ unit_pattern = re.compile(r'^.+\((?P\w+)\)$') matched = unit_pattern.match(label) if matched is None: raise ValueError("Unable to find energy unit in '{0}' " "using REGEX '{1}'".format(label, unit_pattern.pattern)) unit = matched.group('UNIT').strip() return ['{energy_band} {unit}'.format(energy_band=band, unit=unit) for band in bands] def _check_one_day(time_range): """ Currently only support TimeRanges of a maximum of one day. Issue a visible warning if `time_range` is greater than this Parameters ---------- time_range : `sunpy.time.TimeRange` """ if time_range.days > 1 * u.day: warnings.warn('Currently only support providing data from one whole day. Only data for {0} ' 'will be returned'.format(time_range.start.strftime("%Y-%m-%d")), UserWarning, stacklevel=2) sunpy-0.8.3/sunpy/io/0000755000175000017500000000000013232563477014675 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/io/special/0000755000175000017500000000000013232563477016315 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/io/special/__init__.py0000644000175000017500000000004713231613137020413 0ustar nabilnabil00000000000000from .genx import * from .srs import * sunpy-0.8.3/sunpy/io/special/genx.py0000644000175000017500000001534513231613137017624 0ustar nabilnabil00000000000000import xdrlib from collections import OrderedDict from functools import partial import copy import numpy as np __all__ = ['read_genx'] class SSWUnpacker(xdrlib.Unpacker): """ `xdrlib.Unpacker` customisation to read strings and complex data as written by IDL. """ def unpack_string(self): n = self.unpack_uint() if n > 0: n = self.unpack_uint() return self.unpack_fstring(n).decode('utf-8') def unpack_complex(self): return complex(self.unpack_float(), self.unpack_float()) def unpack_complex_double(self): return complex(self.unpack_double(), self.unpack_double()) def read_struct_skeleton(xdrdata): """ Reads the skeleton of the IDL's structure as written in solarsoft `build_str()` function. """ # Read Number of tags ntags = xdrdata.unpack_uint() # Read names of tags tags = [xdrdata.unpack_string() for n in range(ntags)] # Read the tag type tagdict = OrderedDict() for tt in tags: dim = xdrdata.unpack_uint() arr_size = xdrdata.unpack_farray(dim + 2, xdrdata.unpack_int) # [7, 1] typedata = arr_size[-2] if typedata == 8: # it's a structure if dim == 2 and arr_size[0] == 1: # For when structures has been defined with 2 dim but only has one: # bb = replicate({tata: 1, bebe:2, casa:'asa'}, 3) # dd = replicate({tata: 1, bebe:2, casa:'asa'}, 1, 3) # print,size(bb), size(dd) # 1 3 8 3 # 2 1 3 8 3 dim = 1 arr_size[0] = arr_size[1] if arr_size[-1] > 1: tagdict[tt] = np.array([read_struct_skeleton(xdrdata)] * arr_size[-1]).reshape(arr_size[0:-2]) else: tagdict[tt] = read_struct_skeleton(xdrdata) else: tagdict[tt] = [dim] + arr_size return tagdict def struct_to_data(xdrdata, subskeleton): """" Converts the dictionary with the keys and IDL's size output to the data stored in the xdrdata. `subskeleton` must contain the size and type of the data that's going to be read in the right order (that's why `OrderedDict` is used). Then the data is read and the `subskeleton` is updated with the data itself. """ #http://www.harrisgeospatial.com/docs/SIZE.html types_dict = { 2: (xdrdata.unpack_int, np.int16), # int 3: (xdrdata.unpack_int, np.int32), # long 4: (xdrdata.unpack_float, np.float32), 5: (xdrdata.unpack_double, np.float64), 6: (xdrdata.unpack_complex, np.complex), 7: (xdrdata.unpack_string, None), 9: (xdrdata.unpack_complex_double, np.complex64), 12: (xdrdata.unpack_uint, np.uint16), # unsign int 13: (xdrdata.unpack_uint, np.uint32), # unsign Long int 14: (xdrdata.unpack_hyper, np.int64), # Long64 15: (xdrdata.unpack_uhyper, np.uint64), # unsign Long64 } for key in subskeleton: if isinstance(subskeleton[key], OrderedDict): struct_to_data(xdrdata, subskeleton[key]) elif isinstance(subskeleton[key], np.ndarray): testlist = list() struct_shape = subskeleton[key].shape for elem in subskeleton[key].flatten(): elem2 = copy.deepcopy(elem) struct_to_data(xdrdata, elem2) testlist.append(elem2) subskeleton[key] = np.array(testlist).reshape(struct_shape) else: sswsize = subskeleton[key] sswtype = sswsize[-2] if sswsize[0] == 0: subskeleton[key] = types_dict[sswtype][0]() else: subskeleton[key] = np.array(xdrdata.unpack_farray(sswsize[-1], types_dict[sswtype][0]), dtype=types_dict[sswtype][1]).reshape(sswsize[1:-2][::-1]) def read_genx(filename): """solarsoft genx file reader genx files have been used to store calibration data for multiple instruments and distributed within solarsoft. They are stored in XDR format; The External Data Representation Standard file format (XDR) is described in `RFC 1014 `_, written by Sun Microsystems, Inc. June 1987 SolarSoft genx writer creates structures to store the values together with the variable names. It use the `size` IDL function to include the data type, dimension and number of elements that each variable contains. Parameters ---------- filename : `str` The genx file to be read Returns ------- output : `OrderedDict` A dictionary with possibly nested dictionaries with the data in the genx file. Notes ----- The reader aims to maintain the shape and type of the arrays, but take care with the difference in indexing between Python and IDL (row mayor vs column mayor). Regarding the type notice that single numbers are converted to python precision, therefore a single integer is converted from 16 to 32/64 bits, and a float from 32 to 64. **Strings** read from genx files are assumed to be UTF-8. """ with open(filename, mode='rb') as xdrfile: xdrdata = SSWUnpacker(xdrfile.read()) # HEADER information version, xdr = xdrdata.unpack_int(), xdrdata.unpack_int() creation = xdrdata.unpack_string() if version == 2: arch = xdrdata.unpack_string() os = xdrdata.unpack_string() release = xdrdata.unpack_string() text = xdrdata.unpack_string() dim = xdrdata.unpack_int() # TODO: I don't think will have dim>1 but need # to check, if it's larger like savegen has run # with a multidimensional structure, then # probably the read_struct_skeleton will have to # run as in multi-dim structure. arr_size = xdrdata.unpack_farray(dim + 2, xdrdata.unpack_int) # [1, 8, 1] = Main structure for the data mainsize = arr_size[2] # number of upper level strs skeleton = read_struct_skeleton(xdrdata) struct_to_data(xdrdata, skeleton) xdrdata.done() skeleton['HEADER'] = OrderedDict([('VERSION', version), ('XDR', xdr), ('CREATION', creation)]) if version == 2: skeleton['HEADER']['IDL_VERSION'] = OrderedDict([('ARCH', arch), ('OS', os), ('RELEASE', release)]) skeleton['HEADER']['TEXT'] = text # TODO: for python >= 3.2; so we can keep the original order as how it's stored in the file # skeleton.move_to_end('HEADER', last=False) return skeleton sunpy-0.8.3/sunpy/io/special/srs.py0000644000175000017500000001524713231613137017473 0ustar nabilnabil00000000000000""" This module implements SRS File Reader. """ import datetime from collections import OrderedDict import numpy as np from astropy.table import QTable, MaskedColumn, Column, vstack import astropy.io.ascii import astropy.units as u __all__ = ['read_srs'] def read_srs(filepath): """ Parse a SRS table from NOAA SWPC. Parameters ---------- filepath : `str` The full path to a SRS table. Returns ------- table : `astropy.table.QTable` Table containing a stacked table from all the tables in the SRS file. The header information is stored in the ``.meta`` attribute. """ with open(filepath) as srs: file_lines = srs.readlines() header, section_lines = split_lines(file_lines) return make_table(header, section_lines) def make_table(header, section_lines): """ From the seperated section lines and the header, clean up the data and convert to a QTable. """ meta_data = get_meta_data(header) tables = [] for i, lines in enumerate(section_lines): if lines: key = list(meta_data['id'].keys())[i] t1 = astropy.io.ascii.read(lines) if len(t1) == 0: col_data_types = { # ID : 'Nmbr': np.dtype('i4'), 'Location': np.dtype('U6'), 'Lo': np.dtype('i8'), 'Area': np.dtype('i8'), 'Z': np.dtype('U3'), 'LL': np.dtype('i8'), 'NN': np.dtype('i8'), 'MagType': np.dtype('S4'), 'Lat': np.dtype('i8') } for c in t1.itercols(): # Put data types of columns in empty table to correct types, # or else vstack will fail. c.dtype = col_data_types[c._name] t1.add_column( Column(data=None, name="ID", dtype=('S2')), index=0) else: t1.add_column(Column(data=[key] * len(t1), name="ID"), index=0) tables.append(t1) out_table = vstack(tables) # Parse the Location column in Table 1 if 'Location' in out_table.columns: col_lat, col_lon = parse_location(out_table['Location']) del out_table['Location'] out_table.add_column(col_lat) out_table.add_column(col_lon) # Parse the Lat column in Table 3 if 'Lat' in out_table.columns: parse_lat_col(out_table['Lat'], out_table['Latitude']) del out_table['Lat'] # Give columns more sensible names out_table.rename_column("Nmbr", "Number") out_table.rename_column("NN", "Number of Sunspots") out_table.rename_column("Lo", "Carrington Longitude") out_table.rename_column("MagType", "Mag Type") out_table.rename_column("LL", "Longitudinal Extent") # Define a Solar Hemispere Unit a = {} u.def_unit( "SH", represents=(2 * np.pi * u.solRad**2), prefixes=True, namespace=a, doc="A solar hemisphere is the area of the visible solar disk.") # Set units on the table out_table['Carrington Longitude'].unit = u.deg out_table['Area'].unit = a['uSH'] out_table['Longitudinal Extent'].unit = u.deg out_table.meta = meta_data # Number should be formatted in 10000 after 2002-06-15. if out_table.meta['issued'] > datetime.datetime(2002, 6, 15): out_table['Number'] += 10000 return QTable(out_table) def split_lines(file_lines): """ Given all the lines in the file split based on the three sections and return the lines for the header and a list of lines for each section that is not 'None' """ section_lines = [] for i, line in enumerate(file_lines): if line.startswith(("I.", "IA.", "II.")): section_lines.append(i) header = file_lines[:section_lines[0]] header += [file_lines[s] for s in section_lines] # Append comments to the comment lines for l in section_lines: file_lines[l] = '# ' + file_lines[l] t1_lines = file_lines[section_lines[0]:section_lines[1]] # Remove the space so table reads it correctly t1_lines[1] = t1_lines[1].replace('Mag Type', 'MagType') t2_lines = file_lines[section_lines[1]:section_lines[2]] t3_lines = file_lines[section_lines[2]:] lines = [t1_lines, t2_lines, t3_lines] for i, ll in enumerate(lines): if ll[2].strip() == 'None': del ll[2] return header, lines def get_meta_data(header): """ Convert a list of header lines into a meta data dict. """ meta_lines = [] for l in header: if l.startswith(':'): meta_lines.append(l) meta_data = {} for m in meta_lines: k, v = m.strip().split(':')[1:] meta_data[k.lower()] = v.strip() meta_data['issued'] = datetime.datetime.strptime(meta_data['issued'], "%Y %b %d %H%M UTC") # Get ID descriptions meta_data['id'] = OrderedDict() for h in header: if h.startswith(("I.", "IA.", "II.")): i = h.find('.') k = h[:i] v = h[i + 2:] meta_data['id'][k] = v.strip() meta_data['header'] = [h.strip() for h in header] return meta_data def parse_longitude(value): """ Parse longitude in the form 'W10' or 'E10' """ lonsign = {'W': 1, 'E': -1} if "W" in value or "E" in value: return lonsign[value[3]] * float(value[4:]) def parse_latitude(value): """ Parse latitude in the form 'S10' or 'N10' """ latsign = {'N': 1, 'S': -1} if "N" in value or "S" in value: return latsign[value[0]] * float(value[1:3]) def parse_location(column): """ Given a column of location data in the form 'S10E10' convert to two columns of angles. """ latitude = MaskedColumn(name="Latitude", unit=u.deg) longitude = MaskedColumn(name="Longitude", unit=u.deg) for i, loc in enumerate(column): if loc: lati = parse_latitude(loc) longi = parse_longitude(loc) latitude = latitude.insert(i, lati) longitude = longitude.insert(i, longi) else: latitude = latitude.insert(i, None, mask=True) longitude = longitude.insert(i, None, mask=True) return latitude, longitude def parse_lat_col(column, latitude_column): """ Given an input column of Latitudes in the form 'S10' parse them and add them to an existing column of Latitudes. """ for i, loc in enumerate(column): if loc: latitude_column.mask[i] = False latitude_column[i] = parse_latitude(loc) return latitude_column sunpy-0.8.3/sunpy/io/src/0000755000175000017500000000000013232563477015464 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/io/src/ana/0000755000175000017500000000000013232563477016223 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/io/src/ana/_pyana.c0000644000175000017500000002340113231613137017622 0ustar nabilnabil00000000000000/*! @brief A C extension for Python to read ana f0 files @author Tim van Werkhoven Based on Michiel van Noort's IDL DLM library 'f0' which contains a cleaned up version of the original anarw routines. */ // Headers #include // For python extension #include // For numpy #include // For timestamps #include // For timestamps //#include "anadecompress.h" //#include "anacompress.h" #include "types.h" #include "anarw.h" // vasprintf() and asprintf() may not be defined, particularly on Windows #ifndef __USE_GNU int vasprintf( char **sptr, const char *fmt, va_list argv ) { va_list argv2; va_copy(argv2, argv); int wanted = vsnprintf( *sptr = NULL, 0, fmt, argv ); if( (wanted < 0) || ((*sptr = malloc( 1 + wanted )) == NULL) ) return -1; int retval; retval = vsnprintf( *sptr, 1 + wanted, fmt, argv2 ); va_end(argv2); return retval; } int asprintf( char **sptr, const char *fmt, ... ) { int retval; va_list argv; va_start( argv, fmt ); retval = vasprintf( sptr, fmt, argv ); va_end( argv ); return retval; } #endif // Prototypes static PyObject * pyana_fzread(PyObject *self, PyObject *args); static PyObject * pyana_fzwrite(PyObject *self, PyObject *args); // Methods table for this module static PyMethodDef PyanaMethods[] = { {"fzread", pyana_fzread, METH_VARARGS, "Load an ANA F0 file."}, {"fzwrite", pyana_fzwrite, METH_VARARGS, "Save an ANA F0 file."}, {NULL, NULL, 0, NULL} /* Sentinel */ }; // Copied from https://docs.python.org/2/howto/cporting.html struct module_state { PyObject *error; }; #if PY_MAJOR_VERSION >= 3 #define GETSTATE(m) ((struct module_state*)PyModule_GetState(m)) #else #define GETSTATE(m) (&_state) static struct module_state _state; #endif #if PY_MAJOR_VERSION >= 3 static int pyana_traverse(PyObject *m, visitproc visit, void *arg) { Py_VISIT(GETSTATE(m)->error); return 0; } static int pyana_clear(PyObject *m) { Py_CLEAR(GETSTATE(m)->error); return 0; } static struct PyModuleDef moduledef = { PyModuleDef_HEAD_INIT, "_pyana", NULL, sizeof(struct module_state), PyanaMethods, NULL, pyana_traverse, pyana_clear, NULL }; #define INITERROR return NULL PyMODINIT_FUNC PyInit__pyana(void) #else #define INITERROR return void init_pyana(void) #endif { #if PY_MAJOR_VERSION >= 3 PyObject *module = PyModule_Create(&moduledef); #else PyObject *module = Py_InitModule("_pyana", PyanaMethods); #endif if (module == NULL) INITERROR; struct module_state *st = GETSTATE(module); st->error = PyErr_NewException("myextension.Error", NULL, NULL); if (st->error == NULL) { Py_DECREF(module); INITERROR; } import_array(); #if PY_MAJOR_VERSION >= 3 return module; #endif } /*! @brief load an ANA f0 file data and header @param [in] filename @return [out] data, NULL on failure */ static PyObject *pyana_fzread(PyObject *self, PyObject *args) { // Function arguments char *filename; int debug=0; // Init ANA IO variables char *header = NULL; // ANA header (comments) uint8_t *anaraw = NULL; // Raw data int nd=-1, type=-1, *ds, size=-1, d; // Various properties // Data manipulation PyArrayObject *anadata; // Final ndarray // Parse arguments if (!PyArg_ParseTuple(args, "s|i", &filename, &debug)) { return NULL; } // Read ANA file if (debug == 1) printf("pyana_fzread(): Reading in ANA file\n"); anaraw = ana_fzread(filename, &ds, &nd, &header, &type, &size); if (NULL == anaraw) { PyErr_SetString(PyExc_ValueError, "In pyana_fzread: could not read ana file, data returned is NULL."); return NULL; } if (type == -1) { PyErr_SetString(PyExc_ValueError, "In pyana_fzread: could not read ana file, type invalid."); return NULL; } // Mold into numpy array npy_intp npy_dims[nd]; // Dimensions array int npy_type; // Numpy datatype // Calculate total datasize if (debug == 1) printf("pyana_fzread(): Dimensions: "); for (d=0; dtv_sec)); asprintf(&header, "#%-42s compress=%d date=%02d:%02d:%02d.%03ld\n", filename, compress, tm_time->tm_hour, tm_time->tm_min, tm_time->tm_sec, (long) (tv_time->tv_usec/1000)); } if (debug == 1) printf("pyana_fzwrite(): Header: '%s'\n", header); // Convert datatype from PyArray type to ANA type, and verify that ANA // supports it switch (PyArray_TYPE((PyObject *) anadata)) { case (PyArray_INT8): type = INT8; if (debug == 1) printf("pyana_fzwrite(): Found type PyArray_INT8\n"); break; case (PyArray_INT16): type = INT16; if (debug == 1) printf("pyana_fzwrite(): Found type PyArray_INT16\n"); break; case (PyArray_FLOAT32): type = FLOAT32; if (debug == 1) printf("pyana_fzwrite(): Found type PyArray_FLOAT32\n"); break; case (PyArray_FLOAT64): type = FLOAT64; if (debug == 1) printf("pyana_fzwrite(): Found type PyArray_FLOAT64\n"); break; //case (PyArray_INT64): type = INT64; break; default: PyErr_SetString(PyExc_ValueError, "In pyana_fzwrite: datatype cannot be stored as ANA file."); return NULL; break; } // Check if compression flag is sane if (compress == 1 && (type == FLOAT32 || type == FLOAT64)) { PyErr_SetString(PyExc_RuntimeError, "In pyana_fzwrite: datatype requested cannot be compressed."); return NULL; } if (debug == 1) printf("pyana_fzwrite(): pyarray datatype is %d, ana datatype is %d\n", PyArray_TYPE((PyObject *) anadata), type); // Sanitize data, make a new array from the old array and force the // NPY_CARRAY_RO requirement which ensures a C-contiguous and aligned // array will be made anadata_align = PyArray_FromArray(anadata, PyArray_DESCR((PyObject *) anadata), NPY_CARRAY_RO); // Get a pointer to the aligned data anadata_bytes = (uint8_t *) PyArray_BYTES(anadata_align); // Get the number of dimensions PyArrayObject *arrobj = (PyArrayObject*) anadata_align; int nd = arrobj->nd; int *dims = malloc(nd*sizeof(int)); // Get the dimensions and number of elements npy_intp *npy_dims = PyArray_DIMS(anadata_align); //npy_intp npy_nelem = PyArray_SIZE(anadata_align); if (debug == 1) printf("pyana_fzwrite(): Dimensions: "); for (d=0; d #include #include #include #include "types.h" #include "anacompress.h" int anacrunchrun8(uint8_t *x,uint8_t *array,int slice,int nx,int ny,int limit,int t_endian) /* compress 8 bit array into x (a uint8_t array) using ny blocks each of size nx, bit slice size slice, returns # of bytes in x */ { uint8_t bits[8]={1,2,4,8,16,32,64,128}; struct compresshead *ch; uint8_t *p; unsigned nb; unsigned register i,j,r1; int r0,r2,r3,mask,fac, nrun, lrun, ic; int *dif, *d, nc, zq, yq, *dd; int i2,k,iy; union { int i; short w; unsigned char b[4]; } y; /* begin execution */ if (limit<25) { printf("limit (%d) too small in crunchrun8\n", limit); return -1;} limit = limit - 24; /* need 14 for header and some margin since we don't check all times */ mask=1; for (i=0;ibsize = nx; ch->nblocks = ny; ch->slice_size = slice; ch->type = 3; i=0; r1=0; dif = (int *) malloc(nx*4); /* line buffer */ for (iy=0;iy 1) { while ( y.i == *d ) { /* at least a run of 2 */ dd = d+1; nrun = 2; while ( nc-- > 2 && y.i == *dd) { /* printf("run!, y.i, *dd = %d %d, nc = %d\n", y.i, *dd, nc ); */ nrun++; dd++; } /* short runs are not worth it, make the legal limit 4 */ /* printf("nrun = %d, nc = %d\n", nrun,nc);*/ if ( nrun >= 4 ) { /* code the run */ /* a previous literal ? */ if (lrun != 0) { /* printf("previous was literal, ic, i = %d %d\n", ic,i);*/ x[ic] = lrun; i = (r1+7)/8; lrun = 0; /* printf("now, i = %d\n",i );*/ } else i=ic; while (nrun > 128 ) { /* a big one, multiple runs */ /* printf("big run, nrun = %d\n", nrun); */ /* need only 2 bytes to represent run, runs can't be 17 bits */ if (nrun == 129) /* beware the dreaded 129 */ { x[i++] = 0x82; nrun -= 127;} else { x[i++] = 0x81; nrun -= 128; } if(t_endian){ x[i++]=y.b[3]; x[i++]=y.b[2]; }else{ x[i++]=y.b[0]; x[i++]=y.b[1]; } } /* printf("encoding run, nrun = %d, i=%d, iy = %d\n",nrun,i,iy); */ if(t_endian){ // big endian x[i++] = -(nrun-1); x[i++]=y.b[3]; x[i++]=y.b[2]; }else{ x[i++] = -(nrun-1); x[i++]=y.b[0]; x[i++]=y.b[1]; } /* prepare for a literal and for next run check */ nc--; if (nc <= 0) goto ended_on_run; lrun = 0; ic = i++; r1 = 8*i; d = dd; y.i = *d++; /* printf("after a run, new y.i = %d, new *d = %d\n", y.i, *d);*/ } else { nc = nc + nrun -1; break; } } /* not a run, do next literal, assume setup for literals */ } else if (nc <= 0) break; nc--; /* increment the literal count */ /* printf("literal, lrun = %d, nc = %d, ic,i = %d %d\n", lrun, nc, ic,i);*/ if (++lrun > 127) { /* need a new literal run count */ x[ic] = 127; /* printf("ic = %d, i,r1 = %d %d\n", ic,i,r1); */ /* bump to next byte boundary */ i = (r1+7)/8; ic = i++; r1 = 8*i; lrun = 1; /* printf("next ic = %d\n", ic); */ } /* first the fixed slice portion */ /* printf("y.i = %d\n", y.i);*/ r3=(y.i>>slice); i=r1>>3; /* byte number */ j=r1 & 7; /* bit number */ if ( i > limit ) return -1; /* bad news, went too far */ /* now load nb bytes into x */ /*low order byte of y.i is first in stream */ if(t_endian){ // big endian if (j == 0) {y.i=(y.i & mask); x[i]=y.b[3];} else { y.i=(y.i & mask)<1) { x[i+1]=y.b[2]; if (nb>2) x[i+2]=y.b[1]; } }else{ if (j == 0) {y.i=(y.i & mask); x[i]=y.b[0];} else { y.i=(y.i & mask)<1) { x[i+1]=y.b[1]; if (nb>2) x[i+2]=y.b[2]; } } r1=r1+slice; /* bump r1 pass the fixed part */ i=r1>>3; j=r1 & 7; /* note that r3 is the # of bits required minus 1 */ if (r3==0) { if (j ==0 ) {x[i]=bits[j];} else {x[i]=x[i]|bits[j];} r1+=1;} else { r3=2*r3; if (r3<0) r3 = -r3-1; if (r3<31) { r0=j+r3; /* this is the bit that needs setting offset from x[i] */ if (r0 < 8) { if (j == 0) x[i]=bits[r0]; else x[i]=x[i]|bits[r0];} else {if (j == 0) x[i]=0; j=r0%8; if (r0 < 16) x[i+1]=bits[j]; else { i2=i+r0/8; for (k=i+1;ktsize = i = i + 14; /* we have to put these in a form readable by the Vax (these may be used by fcwrite) */ if(t_endian){ // big endian bswapi32(&(ch->tsize),1); bswapi32(&(ch->bsize),1); bswapi32(&(ch->nblocks),1); } free(dif); return i; /*return # of bytes used */ } int anacrunch8(uint8_t *x,uint8_t *array,int slice,int nx,int ny,int limit,int t_endian) /* compress 8 bit array into x (a byte array) using ny blocks each of size nx, bit slice size slice, returns # of bytes in x */ { uint8_t bits[8]={1,2,4,8,16,32,64,128}; struct compresshead *ch; unsigned nb,ixa,ixb; unsigned register i,j,r1,in; int r0,r2,r3,mask,fac; int i2,k,iy; union { int i; short w; unsigned char b[4]; } y; /* begin execution */ if (limit<25) { printf("limit (%d) too small in crunch8\n", limit); return -1;} limit = limit - 24; /* need 14 for header and some margin since we don't check all times */ mask=1; for (i=0;i 8) slice = 8; if (slice == 0) nb=0; else { if (slice < 2 ) nb=1; else { if (slice < 10) nb=2; else nb=3; }}; y.i=0; /* do the compression header */ ch = (struct compresshead *) x; /* important note - can't use the sizeof(struct compresshead) because it is 14 on some machines and rounded up to 16 on others */ /*x = x + sizeof(struct compresshead);*/ x = x + 14; ch->bsize = nx; ch->nblocks = ny; ch->slice_size = slice; ch->type = 1; i=0; r1=0; in=0; for (iy=0;iy>slice); i=r1>>3; j=r1%8; if ( i > limit ) return -1; /* bad news, went too far */ /* now load nb bytes into x */ /*low order byte of y.i is first in stream */ if(t_endian){ // big endian if (j == 0) {y.i=(y.i & mask); x[i]=y.b[3];} else { y.i=(y.i & mask)<1) { x[i+1]=y.b[2]; } }else{ if (j == 0) {y.i=(y.i & mask); x[i]=y.b[0];} else { y.i=(y.i & mask)<1) { x[i+1]=y.b[1]; } } r1=r1+slice; /* bump r1 pass the fixed part */ i=r1>>3; j=r1%8; /* note that r3 is the # of bits required minus 1 */ if (r3==0) { if (j ==0 ) {x[i]=bits[j];} else {x[i]=x[i]|bits[j];} r1+=1;} else { r3=2*r3; if (r3<0) r3 = -r3-1; if (r3<31) { r0=j+r3; /* this is the bit that needs setting offset from x[i] */ if (r0 < 8) { if (j == 0) x[i]=bits[r0]; else x[i]=x[i]|bits[r0];} else {if (j == 0) x[i]=0; j=r0%8; if (r0 < 16) x[i+1]=bits[j]; else { i2=i+r0/8; for (k=i+1;ktsize = i = i + 14; /* we have to put these in a form readable by the Vax (these may be used by fcwrite) */ if(t_endian){ // big endian bswapi32(&(ch->tsize),1); bswapi32(&(ch->bsize),1); bswapi32(&(ch->nblocks),1); } return i; /*return # of bytes used */ } /* end of routine */ int anacrunchrun(uint8_t *x,int16_t *array,int slice,int nx,int ny,int limit,int t_endian) /* compress 16 bit array into x (a byte array) using ny blocks each of size nx, bit slice size slice, returns # of bytes in x */ { uint8_t bits[8]={1,2,4,8,16,32,64,128}; struct compresshead *ch; short *p; unsigned nb; unsigned register i,j,r1; int r0,r2,r3,mask,fac, nrun, lrun, ic; int *dif, *d, nc, zq, yq, *dd; int i2,k,iy; union { int i; short w; unsigned char b[4]; } y; /* begin execution */ if (limit<25) { printf("limit (%d) too small in crunchrun\n", limit); return -1;} limit = limit - 24; /* need 14 for header and some margin since we don't check all times */ mask=1; for (i=0;ibsize = nx; ch->nblocks = ny; ch->slice_size = slice; ch->type = 2; i=0; r1=0; dif = (int *) malloc(nx*4); /* line buffer */ for (iy=0;iy 1) { while ( y.i == *d ) { /* at least a run of 2 */ dd = d+1; nrun = 2; while ( nc-- > 2 && y.i == *dd) { /* printf("run!, y.i, *dd = %d %d, nc = %d\n", y.i, *dd, nc ); */ nrun++; dd++; } /* short runs are not worth it, make the legal limit 4 */ /* printf("nrun = %d, nc = %d\n", nrun,nc);*/ if ( nrun >= 4 ) { /* code the run */ /* a previous literal ? */ if (lrun != 0) { /* printf("previous was literal, ic, i = %d %d\n", ic,i);*/ x[ic] = lrun; i = (r1+7)/8; lrun = 0; /* printf("now, i = %d\n",i );*/ } else i=ic; while (nrun > 128 ) { /* a big one, multiple runs */ /* need only 2 bytes to represent run, runs can't be 17 bits */ if (nrun == 129) /* beware the dreaded 129 */ { x[i++] = 0x82; nrun -= 127;} else { x[i++] = 0x81; nrun -= 128; } if(t_endian){ // big endian x[i++]=y.b[3]; x[i++]=y.b[2]; }else{ x[i++]=y.b[0]; x[i++]=y.b[1]; } } /* printf("encoding run, nrun = %d, i=%d, iy = %d\n",nrun,i,iy); */ if(t_endian){ // big endian x[i++] = -(nrun-1); x[i++]=y.b[3]; x[i++]=y.b[2]; }else{ x[i++] = -(nrun-1); x[i++]=y.b[0]; x[i++]=y.b[1]; } /* prepare for a literal and for next run check */ nc--; if (nc <= 0) goto ended_on_run; lrun = 0; ic = i++; r1 = 8*i; d = dd; y.i = *d++; /* printf("after a run, new y.i = %d, new *d = %d\n", y.i, *d);*/ } else { nc = nc + nrun -1; break; } } /* not a run, do next literal, assume setup for literals */ } else if (nc <= 0) break; nc--; /* increment the literal count */ /* printf("literal, lrun = %d, nc = %d, ic,i = %d %d\n", lrun, nc, ic,i);*/ if (++lrun > 127) { /* need a new literal run count */ x[ic] = 127; /* printf("ic = %d, i,r1 = %d %d\n", ic,i,r1); */ /* bump to next byte boundary */ i = (r1+7)/8; ic = i++; r1 = 8*i; lrun = 1; /* printf("next ic = %d\n", ic); */ } /* first the fixed slice portion */ /* printf("y.i = %d\n", y.i);*/ r3=(y.i>>slice); i=r1>>3; /* byte number */ j=r1 & 7; /* bit number */ if ( i > limit ) return -1; /* bad news, went too far */ /* now load nb bytes into x */ /*low order byte of y.i is first in stream */ if(t_endian){ // big endian if (j == 0) {y.i=(y.i & mask); x[i]=y.b[3];} else { y.i=(y.i & mask)<1) { x[i+1]=y.b[2]; if (nb>2) x[i+2]=y.b[1]; } }else{ if (j == 0) {y.i=(y.i & mask); x[i]=y.b[0];} else { y.i=(y.i & mask)<1) { x[i+1]=y.b[1]; if (nb>2) x[i+2]=y.b[2]; } } r1=r1+slice; /* bump r1 pass the fixed part */ i=r1>>3; j=r1 & 7; /* note that r3 is the # of bits required minus 1 */ /* printf("r3 = %d\n", r3);*/ if (r3==0) { if (j ==0 ) {x[i]=bits[j];} else {x[i]=x[i]|bits[j];} r1+=1;} else { r3=2*r3; if (r3<0) r3 = -r3-1; if (r3<31) { r0=j+r3; /* this is the bit that needs setting offset from x[i] */ if (r0 < 8) { if (j == 0) x[i]=bits[r0]; else x[i]=x[i]|bits[r0];} else {if (j == 0) x[i]=0; j=r0%8; if (r0 < 16) x[i+1]=bits[j]; else { i2=i+r0/8; for (k=i+1;ktsize = i = i + 14; /* we have to put these in a form readable by the Vax (these may be used by fcwrite) */ if(t_endian){ // big endian bswapi32(&(ch->tsize),1); bswapi32(&(ch->bsize),1); bswapi32(&(ch->nblocks),1); } free(dif); return i; /*return # of bytes used */ } /* end of routine */ int anacrunch(uint8_t *x,int16_t *array,int slice,int nx,int ny,int limit,int t_endian) // compress 16 bit array into x (a byte array) using ny blocks each of size // nx, bit slice size slice, returns # of bytes in x { uint8_t bits[8]={1,2,4,8,16,32,64,128}; unsigned register i,j,r1,in; int r0,r2,r3,mask,fac; union{ int i; short w; unsigned char b[4]; } y; if(limit<25){ printf("limit (%d) too small in crunch\n", limit); return -1; } limit-=24; // need 14 for header and some margin since we don't check all times mask=1; for(i=0;ibsize=nx; ch->nblocks=ny; ch->slice_size=slice; ch->type=0; r1=0; // r1 is the bit index in the stream...? in=0; // in is the byte index in the uncompressed stream...? i=0; // i is the byte index in the compressed stream...? int iy; for(iy=0;iy>slice); i=r1>>3; // compressed data size (number of bits/8) j=r1%8; if(i>limit) return -1; // bad news: compressed data too big... if(j==0){ // now load nb bytes into x, low order byte of y.i is first in stream y.i=(y.i&mask); x[i]=(uint8_t)y.i; if(slice>8) x[i+1]=(uint8_t)(y.i>>8); // since we started at bit 0, spillover to the next byte is determined as follows (and is unlikely since slice gt 8 is unusual }else{ y.i=(y.i&mask)<1){ // spillover more likely here x[i+1]=(uint8_t)(y.i>>8); if(nb>2) x[i+2]=(uint8_t)(y.i>>16); } } r1+=slice; // bump r1 pass the fixed part i=r1>>3; j=r1%8; if(r3==0){ // note that r3 is the # of bits required minus 1 if(j==0){ x[i]=*bits; }else{ x[i]=x[i]|bits[j]; } ++r1; }else{ r3*=2; if(r3<0) r3=-r3-1; if(r3<31){ r0=j+r3; // this is the bit that needs setting offset from x[i] if(r0<8){ if(j==0) x[i]=bits[r0]; else x[i]=x[i]|bits[r0]; }else{ // note, discovered on 2/3/96 that the j==0 case not done above for the sunbow version, was OK in the umbra version, may have happened while cleaning up code?, caused extra bits to be set if x[i] wasn't zero if(j==0) x[i]=0; j=r0%8; if(r0<16){ x[i+1]=bits[j]; }else{ int i2=i+r0/8; int k; for(k=i+1;ktsize=(i+=14); if(t_endian){ // we have to put these in a form readable by the Vax (these may be used by fcwrite) bswapi32(&(ch->tsize),1); bswapi32(&(ch->bsize),1); bswapi32(&(ch->nblocks),1); } return i; // return # of bytes used } int anacrunch32(uint8_t *x,int32_t *array,int slice,int nx,int ny,int limit,int t_endian) /* compress 32 bit array into x (a byte array) using ny blocks each of size nx, bit slice size slice, returns # of bytes in x */ { uint8_t bits[8]={1,2,4,8,16,32,64,128}; struct compresshead *ch; unsigned int nb,ixa,ixb,big=0; unsigned register i,j,r1,in; int r0,r2,fac; long long r3, mask, y64; int i2,k,iy; union { int i; short w; unsigned char b[4]; } y; union { long long l64; unsigned char b[8]; } yy; /* begin execution */ if (limit<25) { printf("limit (%d) too small in crunch32\n", limit); return -1;} limit = limit - 24; /* need 14 for header and some margin since we don't check all times */ mask=1; for (i=0;ibsize = nx; ch->nblocks = ny; ch->slice_size = slice; ch->type = 4; i=0; r1=0; in=0; for (iy=0;iy>slice); i=r1>>3; j=r1%8; if ( i > limit ) return -1; /* bad news, went too far */ /* now load nb bytes into x */ /*low order byte of y.i is first in stream */ if (j == 0) { y64=(y64 & mask); x[i]= (uint8_t) y64; /* since we started at bit 0, spillover to the next byte is determined as follows (and is unlikely since slice gt 8 is unusual */ if (slice > 8) { x[i+1]= (uint8_t) (y64 >> 8); if (slice > 16) { x[i+2]= (uint8_t) (y64 >> 16); if (slice > 24) { x[i+3]= (uint8_t) (y64 >> 24);}}} } else { y64=(y64 & mask)<1) { x[i+1] = (uint8_t) (y64 >> 8); if (nb>2) { x[i+2] = (uint8_t) (y64 >> 16); if (nb>3) { x[i+3] = (uint8_t) (y64 >> 24); if (nb>4) { x[i+4] = (uint8_t) (y64 >> 32);}}}} } r1=r1+slice; /* bump r1 pass the fixed part */ i=r1>>3; j=r1%8; /* note that r3 is the # of bits required minus 1 */ if (r3==0) { if (j ==0 ) {x[i]= *bits;} else {x[i]=x[i]| bits[j];} r1++;} else { r3=2*r3; if (r3<0) r3 = -r3-1; if (r3<31) { r0=j+r3; /* this is the bit that needs setting offset from x[i] */ if (r0 < 8) { if (j == 0) x[i]=bits[r0]; else x[i]=x[i]|bits[r0];} else { if (j == 0) x[i]=0; j=r0%8; if (r0 < 16) x[i+1]=bits[j]; else { i2=i+r0/8; for (k=i+1;ktsize = i = i + 14; /* we have to put these in a form readable by the Vax (these may be used by fcwrite) */ if(t_endian){ // big endian bswapi32(&(ch->tsize),1); bswapi32(&(ch->bsize),1); bswapi32(&(ch->nblocks),1); } /* printf("number of big ones for this I*4 = %d\n", big); */ return i; /*return # of bytes used */ } /* end of routine */ sunpy-0.8.3/sunpy/io/src/ana/anacompress.h0000644000175000001440000000114513203275053017662 0ustar nabil00000000000000#ifndef __ANACOMPRESS_H__ // __ANACOMPRESS_H__ #define __ANACOMPRESS_H__ // __ANACOMPRESS_H__ int anacrunchrun8(uint8_t *x,uint8_t *array,int slice,int nx,int ny,int limit,int t_endian); int anacrunch8(uint8_t *x,uint8_t *array,int slice,int nx,int ny,int limit,int t_endian); int anacrunchrun(uint8_t *x,int16_t *array,int slice,int nx,int ny,int limit,int t_endian); int anacrunch(uint8_t *x,int16_t *array,int slice,int nx,int ny,int limit,int t_endian); int anacrunch32(uint8_t *x,int32_t *array,int slice,int nx,int ny,int limit,int t_endian); #endif // __ANACOMPRESS_H__ sunpy-0.8.3/sunpy/io/src/ana/anadecompress.c0000644000175000001440000005135213203275053020173 0ustar nabil00000000000000#include #include #include #include #include "types.h" #include "anadecompress.h" int anadecrunch32(unsigned char *x,int32_t *array,int r9,int nx,int ny,int little_endian) /* decompress a bit stream in x; result is n I*4 elements, put in array; bit slice size r9 */ { int iq; int r0=0,r1,r2,nb; int j,in,i,k,ix,iy, mask; long long y64; unsigned char xq; union { int i; short w; unsigned char b[4]; } y; union { long long l64; unsigned char b[8]; } yy; /* begin execution */ mask=1; for (i=0;i1) { yy.b[1]=x[i+1]; if (nb>2) { yy.b[2]=x[i+2]; if (nb>3) { yy.b[3]=x[i+3]; if (nb>4) { yy.b[4]=x[i+4]; }}}} }else{ yy.b[7]=x[i]; if (nb>1) { yy.b[6]=x[i+1]; if (nb>2) { yy.b[5]=x[i+2]; if (nb>3) { yy.b[4]=x[i+3]; if (nb>4) { yy.b[3]=x[i+4]; }}}} } /* shift and mask out the bit slice */ r2= (int) ((yy.l64>>j) & mask); /*printf("r2 = %x, %d\n",r2,r2);*/ /* the variable bit portion, find the first set bit */ r1=r1+r9; /* bump r1 pass the fixed part */ i=r1/8; j=r1%8; if ((xq= (x[i]>>j) ) != 0) { /* caught it on first byte, find the bit */ if ((xq&1) != 0) r0=1; else { if ((xq&2) != 0) r0=2; else { if ((xq&4) != 0) r0=3; else { if ((xq&8) != 0) r0=4; else { if ((xq&16) != 0) r0=5; else { if ((xq&32) != 0) r0=6; else { if ((xq&64) != 0) r0=7; else { if ((xq&128) != 0) r0=8; }}}}}}}} else { /* not in first byte (or part of one) checked, carry on, first count bits in that first byte */ r0=8-j; /* check up to 4 more bytes, if not found than an error */ for (k=i+1;k 32) { fprintf(stderr,"DECRUNCH -- bad bit sequence, cannot continue\n"); fprintf(stderr,"i = %d, r1 = %d, ix= %d, iy = %d\n",i,r1,ix,iy); return -1; } } } } r1=r1+r0; /* update pointer */ /* r0 even or odd determines sign of difference */ /*printf("r0 = %d\n", r0);*/ if ((r0&1) != 0) { /* positive case */ /*printf("plus case, r0, r2, iq = %d %d %d\n", r0, r2, iq);*/ r0=(r0/2)<>j) & 0x1ffffffffLL; r1=r1+33; /* if the top bit was set, do a sign extend, note that 64 bit arithmetic used*/ if ( (y64 & 0x100000000LL) != 0 ) y64 = y64 | 0xffffffff00000000LL; y64 = y64 + (long long) array[in-1]; iq = array[in]= (long) y64; } else { /* minus case (normal) */ /*printf("minus case, r0, r2, iq = %d %d %d\n", r0, r2, iq);*/ r0=(-r0/2)<1) { y.b[1]=x[i+1]; if (nb>2) y.b[2]=x[i+2]; } } else { if (nb>1) { y.b[2]=x[i+1]; if (nb>2) y.b[1]=x[i+2]; } } // shift and mask out the bit slice r2 = (y.i>>j) & mask; //printf("r2 = %x, %d\n",r2,r2); // the variable bit portion, find the first set bit r1=r1+r9; // bump r1 pass the fixed part i=r1/8; j=r1%8; if ((xq=x[i]>>j) != 0) { // caught it on first byte, find the bit if ((xq&1) != 0) r0=1; else if ((xq&2) != 0) r0=2; else if ((xq&4) != 0) r0=3; else if ((xq&8) != 0) r0=4; else if ((xq&16) != 0) r0=5; else if ((xq&32) != 0) r0=6; else if ((xq&64) != 0) r0=7; else if ((xq&128) != 0) r0=8; } else { // not in first byte (or part of one) checked, carry on, first // count bits in that first byte r0=8-j; // check up to 4 more bytes, if not found than an error for (k=i+1; k 32) { fprintf(stderr,"DECRUNCH -- bad bit sequence, cannot continue\n"); fprintf(stderr,"i = %d, r1 = %d, ix= %d, iy = %d\n",i,r1,ix,iy); return -1; } } } } r1=r1+r0; // update pointer /* r0 even or odd determines sign of difference */ if ((r0&1) != 0) { /* positive case */ r0=(r0/2)<>j) & 0x1ffff; r1=r1+17; // if the top bit was set, do a sign extend, note that 32 // bit arithmetic used if ( (r2& 0x10000) != 0 ) r2=r2 | 0xffff0000; r4=array[in-1]; r4=r4+r2; array[in]=r4; iq=r4; } else { // minus case (normal) */ r0=(-r0/2)<1) { y.b[1]=x[i+1]; if (nb>2) y.b[2]=x[i+2]; } }else{ y.b[3]=x[i]; if (nb>1) { y.b[2]=x[i+1]; if (nb>2) y.b[1]=x[i+2]; } } /* shift and mask out the bit slice */ r2=(y.i>>j) & mask; /* the variable bit portion, find the first set bit */ r1=r1+r9; /* bump r1 pass the fixed part */ i=r1/8; j=r1%8; if ((xq=x[i]>>j) != 0) { /* caught it on first byte, find the bit */ if ((xq&1) != 0) r0=1; else { if ((xq&2) != 0) r0=2; else { if ((xq&4) != 0) r0=3; else { if ((xq&8) != 0) r0=4; else { if ((xq&16) != 0) r0=5; else { if ((xq&32) != 0) r0=6; else { if ((xq&64) != 0) r0=7; else { if ((xq&128) != 0) r0=8; }}}}}}}} else { /* not in first byte (or part of one) checked, carry on, first count bits in that first byte */ r0=8-j; /* check up to 4 more bytes, if not found than an error */ for (k=i+1;k 32) { fprintf(stderr,"DECRUNCH -- bad bit sequence, cannot continue"); return -1; } } } } r1=r1+r0; /* update pointer */ /* r0 even or odd determines sign of difference */ if ((r0&1) != 0) { /* positive case */ r0=(r0/2)<>j) & 0x1ff; r1=r1+9; /* if the top bit was set, do a sign extend, note that 32 bit arithmetic used*/ if ( (r2& 0x100) != 0 ) r2=r2 | 0xffffff00; r4=array[in-1]; r4=r4+r2; array[in]=r4; iq=r4; } else { /* minus case (normal) */ r0=(-r0/2)<0) { /* look at the next run length code */ /* printf("i = %d\n", i); */ nrun = (int) x[i++]; /* printf("nrun = %d\n", nrun); */ if (nrun > 127) { /* a run of a constant difference */ n = 255 - nrun + 2; nc = nc - n; if(little_endian){ y.b[0]=x[i++]; y.b[1]=x[i++]; }else{ y.b[1]=x[i++]; y.b[0]=x[i++]; } /* printf("increment (run) = %d\n", y.w); */ while (n--) { array[in] = array[in-1] + y.w; in++; } iq = array[in-1]; r1=8*i; } else { /* a literal */ r1 = 8 * i; nc = nc - nrun; while(nrun--) { /* first the fixed slice portion */ i=r1/8; j=r1%8; /* printf("start literal, i,r1 = %d %d\n", i,r1); */ if(little_endian){ y.b[0]=x[i]; /* test effect on timing */ if (nb>1) { y.b[1]=x[i+1]; if (nb>2) y.b[2]=x[i+2]; } }else{ y.b[3]=x[i]; /* test effect on timing */ if (nb>1) { y.b[2]=x[i+1]; if (nb>2) y.b[1]=x[i+2]; } } /* shift and mask out the bit slice */ r2=(y.i>>j) & mask; /* printf("r2 = %x, %d\n",r2,r2);*/ /* the variable bit portion, find the first set bit */ r1=r1+r9; /* bump r1 pass the fixed part */ i=r1/8; j=r1%8; if ((xq=x[i]>>j) != 0) { /* caught it on first byte, find the bit */ if ((xq&1) != 0) r0=1; else { if ((xq&2) != 0) r0=2; else { if ((xq&4) != 0) r0=3; else { if ((xq&8) != 0) r0=4; else { if ((xq&16) != 0) r0=5; else { if ((xq&32) != 0) r0=6; else { if ((xq&64) != 0) r0=7; else { if ((xq&128) != 0) r0=8; }}}}}}}} else { /* not in first byte (or part of one) checked, carry on, first count bits in that first byte */ r0=8-j; /* check up to 4 more bytes, if not found than an error */ for (k=i+1;k 32) { fprintf(stderr,"DECRUNCH -- bad bit sequence, cannot continue\n"); fprintf(stderr,"i = %d, r1 = %d, iy = %d\n",i,r1,iy); return -1; } } } } r1=r1+r0; /* update pointer */ /* r0 even or odd determines sign of difference */ if ((r0&1) != 0) { /* positive case */ r0=(r0/2)<>j) & 0x1ffff; r1=r1+17; /* if the top bit was set, do a sign extend, note that 32 bit arithmetic used*/ if ( (r2& 0x10000) != 0 ) r2=r2 | 0xffff0000; /* printf("big one, r2 = %d, array[in-1] = %d\n", r2, array[in-1]);*/ r4=array[in-1]; r4=r4+r2; array[in]=r4; iq=r4; } else { /* minus case (normal) */ r0=(-r0/2)<0) { /* look at the next run length code */ /* printf("i = %d\n", i); */ nrun = (int) x[i++]; /* printf("nrun = %d\n", nrun); */ if (nrun > 127) { /* a run of a constant difference */ n = 255 - nrun + 2; nc = nc - n; if(little_endian){ y.b[0]=x[i++]; y.b[1]=x[i++]; }else{ y.b[1]=x[i++]; y.b[0]=x[i++]; } /* printf("increment (run) = %d of length %d\n", y.w,n); */ while (n--) { array[in] = array[in-1] + y.w; in++; } iq = array[in-1]; r1=8*i; } else { /* a literal */ r1 = 8 * i; nc = nc - nrun; while(nrun--) { /* first the fixed slice portion */ i=r1/8; j=r1%8; /* printf("start literal, i,r1 = %d %d\n", i,r1); */ if(little_endian){ y.b[0]=x[i]; /* test effect on timing */ if (nb>1) { y.b[1]=x[i+1]; if (nb>2) y.b[2]=x[i+2]; } }else{ y.b[3]=x[i]; /* test effect on timing */ if (nb>1) { y.b[2]=x[i+1]; if (nb>2) y.b[1]=x[i+2]; } } /* shift and mask out the bit slice */ r2=(y.i>>j) & mask; /* the variable bit portion, find the first set bit */ r1=r1+r9; /* bump r1 pass the fixed part */ i=r1/8; j=r1%8; if ((xq=x[i]>>j) != 0) { /* caught it on first byte, find the bit */ if ((xq&1) != 0) r0=1; else { if ((xq&2) != 0) r0=2; else { if ((xq&4) != 0) r0=3; else { if ((xq&8) != 0) r0=4; else { if ((xq&16) != 0) r0=5; else { if ((xq&32) != 0) r0=6; else { if ((xq&64) != 0) r0=7; else { if ((xq&128) != 0) r0=8; }}}}}}}} else { /* not in first byte (or part of one) checked, carry on, first count bits in that first byte */ r0=8-j; /* check up to 4 more bytes, if not found than an error */ for (k=i+1;k 32) { fprintf(stderr,"DECRUNCH -- bad bit sequence, cannot continue\n"); fprintf(stderr,"i = %d, r1 = %d, iy = %d\n",i,r1,iy); return -1; } } } } r1=r1+r0; /* update pointer */ /* r0 even or odd determines sign of difference */ if ((r0&1) != 0) { /* positive case */ r0=(r0/2)<>j) & 0x1ff; r1=r1+9; /* if the top bit was set, do a sign extend, note that 32 bit arithmetic used*/ if ( (r2& 0x100) != 0 ) r2=r2 | 0xffffff00; /* printf("long one decoded, r2 = %d, array[in-1]=%d\n", r2, array[in-1]); */ r4=array[in-1]; r4=r4+r2; array[in]=r4; iq=r4; } else { /* minus case (normal) */ r0=(-r0/2)< #include #include #include #include #include #include #include "types.h" #include "anadecompress.h" #include "anacompress.h" #include "anarw.h" static __inline int min(int a,int b) { return (asynch_pattern==0x5555aaaa); int revsyncpat=(fh->synch_pattern==0xaaaa5555); if(!(syncpat||revsyncpat)){ fclose(fin); fprintf(stderr,"ck_synch_hd: error: file does not have the F0 synch pattern (found 0x%x instead)\n",fh->synch_pattern); return -1; } if(syncpat==t_endian){ fprintf(stderr,"ck_synch_hd: warning: reversed F0 synch pattern\n"); wwflag=1; } if(fh->nhb>1){ // if the header is long, read in the rest now if(fh->nhb>15){ fclose(fin); fprintf(stderr,"ck_synch_hd: error: annot handle header more than 16 blocks!\n"); return -1; } int size=(fh->nhb-1)*sizeof(fzhead_t); uint8_t *buf=malloc(size); fread(buf,1,size,fin); free(buf); // not very useful? } if(t_endian) bswapi32(fh->dim,fh->ndim); // for big endian machines return wwflag; } char *ana_fzhead(char *file_name) // fzhead subroutine { struct stat stat_buf; if(stat(file_name,&stat_buf)<0){ fprintf(stderr,"ana_fzhead: error: file \"%s\" not found.\n",file_name); return 0; } int one=1; int t_endian=(*(char*)&one==0); // an endian detector, taken from SL's tiff library // FILE *fin=fopen(file_name,"r"); if(!fin){ fprintf(stderr,"ana_fzhead: error: could not open file \"%s\": %s!\n",file_name,strerror(errno)); return 0; } fzhead_t fh; int sef; if((sef=ck_synch_hd(fin,&fh,t_endian))<0) return 0; char *header=strcpy(malloc(strlen(fh.txt)+1),fh.txt); fclose(fin); return header; } uint8_t *ana_fzread(char *file_name,int **ds,int *nd,char **header,int *type,int *osz) // fzread subroutine { struct stat stat_buf; if(stat(file_name,&stat_buf)<0){ fprintf(stderr,"ana_fzread: error: file \"%s\" not found.\n",file_name); return 0; } int type_sizes[]=ANA_VAR_SZ; int one=1; int t_endian=(*(char*)&one==0); // an endian detector, taken from SL's tiff library // FILE *fin=fopen(file_name,"r"); if(!fin){ fprintf(stderr,"ana_fzread: error: could not open file \"%s\": %s!\n",file_name,strerror(errno)); return 0; } fzhead_t fh; int sef; if((sef=ck_synch_hd(fin,&fh,t_endian))<0) { fprintf(stderr,"ana_fzread: error: ck_sync_hd error!\n"); return 0; } *header=strcpy(malloc(strlen(fh.txt)+1),fh.txt); *ds=((int*)malloc(sizeof(int)*(*nd=fh.ndim))); int d; for(d=0;d<*nd;++d) (*ds)[d]=fh.dim[d]; int n_elem=1; for(d=0;d<=fh.ndim-1;++d) n_elem*=fh.dim[d]; // compute size of array *type=fh.datyp; int f_endian=(fh.subf>=128); // the top bit of the byte fh->subf denotes endian type, 0 for little and 1 for big int swap_endian=(f_endian!=t_endian); // file has different endianness if(sef) swap_endian=(!swap_endian); // file contains strange data int compressed=(fh.subf&1); // file is in compressed format if(compressed){ // compressed format struct compresshead ch; if(fread(&ch,1,14,fin)<14) fprintf(stderr,"error reading in compression header\n"); // header by default little-endian? if(t_endian){ // big endian platform bswapi32(&ch.tsize,1); bswapi32(&ch.nblocks,1); bswapi32(&ch.bsize,1); } // read data int size=ch.tsize-14; // Tim van Werkhoven, 20090327: // Add 4 to the malloc because anadecrunch() might read some data // beyond the current pixel it's investigating. If the pixel is the last // pixel, it will try to read beyond the malloc'ed area, giving trouble. // This should help prevent that. Problem arises around y.b[1]=x[i+1]; in // anadecrunch(), see Valgrind for more info. Maximum read-ahead is 4 // bytes (set by nb), so 4 bytes extra in the malloc should be sufficient. uint8_t *buf=malloc(size+4); if(fread(buf,1,size,fin)n_elem){ // fix a possible problem with ch.nblocks fprintf(stderr,"warning, bad ch.nblocks = %d\ncorrecting to %d, hope this is right!\n",ch.nblocks,n_elem/ch.bsize); ch.nblocks=n_elem/ch.bsize; } if(ch.type%2==*type) fprintf(stderr,"inconsistent compression type\n"); // consistency check int rv; uint8_t *out=malloc(n_elem*type_sizes[*type]); switch(ch.type){ case(0): rv=anadecrunch(buf,(int16_t*)out,ch.slice_size,ch.bsize,ch.nblocks,t_endian==ANA_LITTLE_ENDIAN); break; case(1): rv=anadecrunch8(buf,(int8_t*)out,ch.slice_size,ch.bsize,ch.nblocks,t_endian==ANA_LITTLE_ENDIAN); break; case(2): rv=anadecrunchrun(buf,(int16_t*)out,ch.slice_size,ch.bsize,ch.nblocks,t_endian==ANA_LITTLE_ENDIAN); break; case(3): rv=anadecrunchrun8(buf,(int8_t*)out,ch.slice_size,ch.bsize,ch.nblocks,t_endian==ANA_LITTLE_ENDIAN); break; case(4): rv=anadecrunch32(buf,(int32_t*)out,ch.slice_size,ch.bsize,ch.nblocks,t_endian==ANA_LITTLE_ENDIAN); break; default: fprintf(stderr,"error in data type for compressed data, fh.datyp =%d\n",fh.datyp); } free(buf); *osz=n_elem*type_sizes[*type]; return out; }else{ // uncompressed int size=n_elem*type_sizes[*type]; uint8_t *out=malloc(size); if(fread(out,1,size,fin)size){ fprintf(stderr,"ana_fcwrite: warning: compressed data (%d bytes) larger than raw data (%d bytes), writing uncompressed!\n",limit,size); free(q); fclose(f); ana_fzwrite(data,file_name,ds,nd,header,type); return; } size=res; if(t_endian) bswapi32(&res,1); int i; for(i=0;i<=3;++i) fh.cbytes[i]=((uint8_t*)&res)[i]; fwrite(&fh,1,sizeof(fzhead_t),f); // write header fwrite(q,1,size,f); free(q); fclose(f); } sunpy-0.8.3/sunpy/io/src/ana/anarw.h0000644000175000001440000000222013216226261016453 0ustar nabil00000000000000#ifndef __ANARW_H__ // __ANACOMPRESS_H__ #define __ANARW_H__ // __ANACOMPRESS_H__ #define ANA_VAR_SZ {1,2,4,4,8,8} #define ANA_LITTLE_ENDIAN 0 #define ANA_BIG_ENDIAN 1 #define INT8 0 #define INT16 1 #define INT32 2 #define FLOAT32 3 #define FLOAT64 4 #define INT64 5 #define ANA2PYTHON_T {PyArray_INT8, PyArray_INT16, PyArray_INT32, PyArray_FLOAT32, PyArray_FLOAT64, PyArray_INT64} #define M_TM_INPRO 0 #define M_TM_INFUN -1 // Helper routines void bswapi64(int64_t *x, int n); void bswapi32(int32_t *x, int n); void bswapi16(int16_t *x, int n); int ck_synch_hd(FILE *fin, fzhead_t *fh, int t_endian); // Ana I/O routines char *ana_fzhead(char *file_name); // fzhead subroutine uint8_t *ana_fzread(char *file_name, int **ds, int *nd, char **header, int *type, int *osz); // fzread subroutine void ana_fzwrite(uint8_t *data, char *file_name, int *ds, int nd, char *header, int py_type); /* fcwrite subroutine */ void ana_fcwrite(uint8_t *data, char *file_name, int *ds, int nd, char *header, int py_type, int slice); /* fcwrite subroutine */ #endif // __ANACOMPRESS_H__ sunpy-0.8.3/sunpy/io/src/ana/testrw.c0000644000175000001440000000167213203275053016677 0ustar nabil00000000000000/*! @file testrw.c -- test reading of ana file Test program to investigage memory leaks. Seems to work when we simply read a file to memory and free the memory directly afterwards. Compile as: gcc -g -Wall -o testrw testrw.c anarw.c anacompress.c anadecompress.c */ #include #include #include #include "types.h" #include "anarw.h" const int NITER = 5; int main(int argc, char *argv[]) { // Function arguments char *filename = argv[1]; int debug=0; // Init ANA IO variables char *header = NULL; // ANA header (comments) uint8_t *anaraw = NULL; // Raw data int nd=-1, type=-1, *ds, size=-1, d; // Various properties // Data manipulation // Read ANA file printf("testrw.c: Reading in ANA file a few times\n"); for (d = 0; d //! @todo fix include guards to legal versions typedef float float32_t; typedef double float64_t; typedef float64_t fp_t; //!< The default floating point type struct complex{ fp_t re; fp_t im; }; typedef struct complex complex_t; struct fzhead { // first block for fz files int synch_pattern; uint8_t subf; uint8_t source; uint8_t nhb,datyp,ndim,file_class; uint8_t cbytes[4]; // can't do as int because of %4 rule uint8_t free[178]; int dim[16]; char txt[256]; }; typedef struct fzhead fzhead_t; struct compresshead{ int tsize,nblocks,bsize; uint8_t slice_size,type; }; void bswapi16(int16_t *x,int n); void bswapi32(int32_t *x,int n); void bswapi64(int64_t *x,int n); #endif // __TYPES_H__ sunpy-0.8.3/sunpy/io/tests/0000755000175000017500000000000013232563477016037 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/io/tests/__init__.py0000644000175000001440000000000013203275053017110 0ustar nabil00000000000000sunpy-0.8.3/sunpy/io/tests/test_ana.py0000644000175000017500000000452413231613137020200 0ustar nabilnabil00000000000000""" General ANA Tests """ import tempfile import numpy as np import pytest from sunpy.io import ana from sunpy.tests.helpers import skip_ana # Create a test image, store it, reread it and compare img_size = (456, 345) img_src = np.arange(np.product(img_size)) img_src.shape = img_size img_i8 = img_src*2**8/img_src.max() img_i8 = img_i8.astype(np.int8) img_i16 = img_src*2**16/img_src.max() img_i16 = img_i16.astype(np.int16) img_f32 = img_src*1.0/img_src.max() img_f32 = img_f32.astype(np.float32) @skip_ana def test_i8c(): # Test int 8 compressed functions afilename = tempfile.NamedTemporaryFile().name ana.write(afilename, img_i8, 'testcase', 0) img_i8c_rec = ana.read(afilename) assert np.sum(img_i8c_rec[0][0] - img_i8) == 0 @skip_ana def test_i8u(): # Test int 8 uncompressed functions afilename = tempfile.NamedTemporaryFile().name ana.write(afilename, img_i8, 'testcase', 0) img_i8u_rec = ana.read(afilename) assert np.sum(img_i8u_rec[0][0] - img_i8) == 0 @skip_ana def test_i16c(): # Test int 16 compressed functions afilename = tempfile.NamedTemporaryFile().name ana.write(afilename, img_i16, 'testcase', 0) img_i16c_rec = ana.read(afilename) assert np.sum(img_i16c_rec[0][0] - img_i16) == 0 @skip_ana def test_i16u(): # Test int 16 uncompressed functions afilename = tempfile.NamedTemporaryFile().name ana.write(afilename, img_i16, 'testcase', 0) img_i16u_rec = ana.read(afilename) assert np.sum(img_i16u_rec[0][0] - img_i16) == 0 @skip_ana def test_f32u(): # Test float 32 uncompressed functions afilename = tempfile.NamedTemporaryFile().name ana.write(afilename, img_f32, 'testcase', 0) img_f32u_rec = ana.read(afilename) assert np.sum(img_f32u_rec[0][0]- img_f32) == 0 @skip_ana def test_f32c(): # Test if float 32 compressed functions #TODO: Bug with same code. Needs to be tracked down. # ana.write('/tmp/pyana-testf32c', img_f32, 1, 'testcase', 0) # img_f32c_rec = ana.read('/tmp/pyana-testf32c', 1) # assert_(np.sum(img_f32c_rec[0][1]- img_f32) == 0, # msg="Storing 32 bits float data without compression failed (diff: %g)" % (1.0*np.sum(img_f32c_rec[0][1] - img_f32))) afilename = tempfile.NamedTemporaryFile().name with pytest.raises(RuntimeError): ana.write(afilename, img_f32, 'testcase', 1) sunpy-0.8.3/sunpy/io/tests/test_filetools.py0000644000175000017500000001113713231613137021437 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- import numpy as np import os import sunpy import sunpy.io import sunpy.data.test from sunpy.tests.helpers import skip_glymur, skip_ana testpath = sunpy.data.test.rootdir RHESSI_IMAGE = os.path.join(testpath, 'hsi_image_20101016_191218.fits') EIT_195_IMAGE = os.path.join(testpath, 'EIT/efz20040301.000010_s.fits') AIA_171_IMAGE = os.path.join(testpath, 'aia_171_level1.fits') #============================================================================== # Test, read, get_header and write through the file independent layer #============================================================================== class TestFiletools(object): def test_read_file_fits(self): #Test read FITS aiapair = sunpy.io.read_file(AIA_171_IMAGE) assert isinstance(aiapair, list) assert len(aiapair) == 1 assert len(aiapair[0]) == 2 assert isinstance(aiapair[0][0], np.ndarray) assert isinstance(aiapair[0][1], sunpy.io.header.FileHeader) #Test read multi HDU list pairs = sunpy.io.read_file(RHESSI_IMAGE) assert isinstance(pairs, list) assert len(pairs) == 4 assert all([len(p) == 2 for p in pairs]) assert all([isinstance(p[0], np.ndarray) for p in pairs]) assert all([isinstance(p[1], sunpy.io.header.FileHeader) for p in pairs]) def test_read_file_fits_gzip(self): # Test read gzipped fits file for fits_extension in [".fts", ".fit", ".fits"]: pair = sunpy.io.read_file(os.path.join(sunpy.data.test.rootdir, "gzip_test{ext}.gz".format(ext=fits_extension))) assert isinstance(pair, list) assert len(pair) == 1 assert len(pair[0]) == 2 assert isinstance(pair[0][0], np.ndarray) assert isinstance(pair[0][1], sunpy.io.header.FileHeader) assert np.all(pair[0][0] == np.tile(np.arange(32), (32, 1)).transpose()) @skip_glymur def test_read_file_jp2(self): #Test read jp2 pair = sunpy.io.read_file(os.path.join(sunpy.data.test.rootdir, "2013_06_24__17_31_30_84__SDO_AIA_AIA_193.jp2")) assert isinstance(pair, list) assert len(pair) == 1 assert len(pair[0]) == 2 assert isinstance(pair[0][0], np.ndarray) assert isinstance(pair[0][1], sunpy.io.header.FileHeader) def test_read_file_header_fits(self): #Test FITS hlist = sunpy.io.read_file_header(AIA_171_IMAGE) assert isinstance(hlist, list) assert len(hlist) == 1 assert isinstance(hlist[0], sunpy.io.header.FileHeader) @skip_glymur def test_read_file_header_jp2(self): #Test jp2 hlist = sunpy.io.read_file_header(os.path.join(sunpy.data.test.rootdir, "2013_06_24__17_31_30_84__SDO_AIA_AIA_193.jp2")) assert isinstance(hlist, list) assert len(hlist) == 1 assert isinstance(hlist[0], sunpy.io.header.FileHeader) def test_write_file_fits(self): #Test write FITS aiapair = sunpy.io.read_file(AIA_171_IMAGE)[0] sunpy.io.write_file("aia_171_image.fits", aiapair[0], aiapair[1], clobber=True) assert os.path.exists("aia_171_image.fits") outpair = sunpy.io.read_file(AIA_171_IMAGE)[0] assert np.all(np.equal(outpair[0], aiapair[0])) assert outpair[1] == aiapair[1] os.remove("aia_171_image.fits") @skip_ana def test_read_file_ana(self): ana_data = sunpy.io.read_file(os.path.join(sunpy.data.test.rootdir,"test_ana.fz")) assert isinstance(ana_data, list) assert len(ana_data) == 1 assert len(ana_data[0]) == 2 assert isinstance(ana_data[0][0], np.ndarray) assert isinstance(ana_data[0][1], sunpy.io.header.FileHeader) @skip_ana def test_read_file__header_ana(self): ana_data = sunpy.io.read_file_header(os.path.join(sunpy.data.test.rootdir,"test_ana.fz")) assert isinstance(ana_data, list) assert len(ana_data) == 1 assert isinstance(ana_data[0], sunpy.io.header.FileHeader) @skip_ana def test_write_file_ana(self): ana = sunpy.io.read_file(os.path.join(sunpy.data.test.rootdir,"test_ana.fz"))[0] sunpy.io.write_file("ana_test_write.fz", ana[0], str(ana[1])) assert os.path.exists("ana_test_write.fz") outpair = sunpy.io.read_file(os.path.join(sunpy.data.test.rootdir,"test_ana.fz")) assert np.all(np.equal(outpair[0][1], ana[1])) assert outpair[0][1] == ana[1] os.remove("ana_test_write.fz") #TODO: Test write jp2 sunpy-0.8.3/sunpy/io/tests/test_fits.py0000644000175000001440000000471713203275053017400 0ustar nabil00000000000000import sunpy.io.fits from sunpy.io.fits import get_header, extract_waveunit import sunpy.data.test import os from sunpy.data.test.waveunit import MEDN_IMAGE, MQ_IMAGE, NA_IMAGE, SVSM_IMAGE from sunpy.extern.six.moves import range testpath = sunpy.data.test.rootdir RHESSI_IMAGE = os.path.join(testpath, 'hsi_image_20101016_191218.fits') EIT_195_IMAGE = os.path.join(testpath, 'EIT/efz20040301.000010_s.fits') AIA_171_IMAGE = os.path.join(testpath, 'aia_171_level1.fits') SWAP_LEVEL1_IMAGE = os.path.join(testpath, 'SWAP/resampled1_swap.fits') def read_hdus(): pairs = sunpy.io.fits.read(RHESSI_IMAGE) assert len(pairs) == 4 def read_hdu_int(): pairs = sunpy.io.fits.read(RHESSI_IMAGE, hdus=1) assert len(pairs) == 1 def read_hdus_list(): pairs = sunpy.io.fits.read(RHESSI_IMAGE, hdus=[1, 2]) assert len(pairs) == 2 def read_hdus_gen(): pairs = sunpy.io.fits.read(RHESSI_IMAGE, hdus=range(0, 1)) assert len(pairs) == 2 def test_extract_waveunit_missing_waveunit_key_and_missing_wavelnth_comment(): waveunit = extract_waveunit(get_header(RHESSI_IMAGE)[0]) assert waveunit is None def test_missing_waveunit_in_wavelnth_comment(): # the comment of the key WAVELNTH has the value # '171 = Fe IX/X, 195 = Fe XII,' which contains no unit information waveunit = extract_waveunit(get_header(EIT_195_IMAGE)[0]) assert waveunit is None def test_extract_waveunit_from_waveunit_key(): # the key WAVEUNIT can be accessed and returned directly waveunit = extract_waveunit(get_header(AIA_171_IMAGE)[0]) assert waveunit == 'angstrom' def test_extract_waveunit_minus9(): # value of WAVEUNIT is -9 waveunit = extract_waveunit(get_header(MEDN_IMAGE)[0]) assert waveunit == 'nm' def test_extract_waveunit_minus10(): # value of WAVEUNIT is -10 waveunit = extract_waveunit(get_header(MQ_IMAGE)[0]) assert waveunit == 'angstrom' def test_extract_waveunit_waveunitcomment(): # comment of WAVEUNIT is: "in meters" waveunit = extract_waveunit(get_header(NA_IMAGE)[0]) assert waveunit == 'm' def test_extract_waveunit_wavelnthcomment_brackets(): # WAVELNTH comment is: "[Angstrom] bandpass peak response" waveunit = extract_waveunit(get_header(SWAP_LEVEL1_IMAGE)[0]) assert waveunit == 'angstrom' def test_extract_waveunit_wavelnthcomment_parentheses(): # WAVELNTH comment is: "Observed wavelength (nm)" waveunit = extract_waveunit(get_header(SVSM_IMAGE)[0]) assert waveunit == 'nm' sunpy-0.8.3/sunpy/io/tests/test_genx.py0000644000175000017500000000670513231613137020405 0ustar nabilnabil00000000000000import os import datetime import pytest import numpy as np from sunpy.io.special import genx from sunpy.data.test import rootdir TESTING = genx.read_genx(os.path.join(rootdir, 'generated_sample.genx')) def test_skeleton(): # top level toplevel_dims = {'MYTEXT': 63, 'MYTEXT_ARRAY': 3, 'MYTEXT_ARRAY_DIMENSION': (2,3), 'MYNUMBER': 1, 'MYNUMBER_ARRAY': 3, 'MYNUMBER_ARRAY_DIMENSION': (2, 3, 4, 5), 'MYUINT': 1, 'MYSTRUCTURE': 14, # the elements inside the OrderedDict 'MYSTRUCTURE_ARRAY': 6, 'HEADER': 5} assert sorted(list(TESTING.keys())) == sorted(list(toplevel_dims.keys())) for key, val in toplevel_dims.items(): if isinstance(val, tuple): assert TESTING[key].shape == tuple(reversed(val)) else: if val > 1: assert len(TESTING[key]) == val else: assert isinstance(TESTING[key], int) def test_array_elements_values(): np.testing.assert_allclose(TESTING['MYSTRUCTURE']['MYFARRAY'], np.arange(3.)) np.testing.assert_allclose(TESTING['MYSTRUCTURE']['MYFARRAYD'][:, 0], np.arange(6., step=2)) assert TESTING['MYSTRUCTURE']['MYDARRAYD'][1, 2] == 5. assert TESTING['MYSTRUCTURE']['NESTEDSTRUCT']['MYLARRAYD'][3, 0, 1] == 19 np.testing.assert_allclose(TESTING['MYSTRUCTURE']['NESTEDSTRUCT']['MYLARRAYD'][2, :, 0], np.arange(12, 17, step=2)) assert TESTING['MYSTRUCTURE']['MYCARRAY'][1] == complex(1, -9) assert TESTING['MYSTRUCTURE']['MYDCARRAY'][2] == complex(12, 1) assert TESTING['MYSTRUCTURE']['NESTEDSTRUCT']['MYUL64NUMBER'] == 18446744073709551615 assert TESTING['MYSTRUCTURE']['NESTEDSTRUCT']['MYL64NUMBER'] == 9223372036854775807 @pytest.mark.parametrize("slice, value", [((0,0,0,0), 0), ((4, 0, 0, 0), 96), ((0, 2, 2, 0), 16), ((0, 3, 2, 0), 22), ((4, 3, 2, 0), 118)]) def test_value_slice(slice, value): assert TESTING['MYNUMBER_ARRAY_DIMENSION'][slice] == value @pytest.mark.parametrize("myarray, dtype", [(TESTING['MYNUMBER_ARRAY'], np.int16), (TESTING['MYNUMBER_ARRAY_DIMENSION'], np.int16), (TESTING['MYSTRUCTURE']['MYFARRAY'], np.float32), (TESTING['MYSTRUCTURE']['MYFARRAYD'], np.float32), (TESTING['MYSTRUCTURE']['MYDARRAY'], np.float64), (TESTING['MYSTRUCTURE']['MYDARRAYD'], np.float64), (TESTING['MYSTRUCTURE']['NESTEDSTRUCT']['MYLARRAY'], np.int32), (TESTING['MYSTRUCTURE']['NESTEDSTRUCT']['MYLARRAYD'], np.int32), (TESTING['MYSTRUCTURE']['RANDOMNUMBERS'], np.int16), (TESTING['MYSTRUCTURE']['MYCARRAY'], np.complex), (TESTING['MYSTRUCTURE']['MYDCARRAY'], np.complex64)]) def test_type(myarray, dtype): assert myarray.dtype == dtype def test_date(): creation_str = TESTING['HEADER']['CREATION'] creation = datetime.datetime.strptime(creation_str, '%a %b %d %H:%M:%S %Y') assert int(''.join(chr(x) for x in TESTING['MYSTRUCTURE']['RANDOMNUMBERS'][-4:])) == creation.year sunpy-0.8.3/sunpy/io/tests/test_jp2.py0000644000175000017500000000174713231613137020140 0ustar nabilnabil00000000000000""" JPEG2000 reading tests """ from __future__ import absolute_import #pylint: disable=C0103,R0904,W0201,W0212,W0232,E1103 import numpy as np from sunpy.data.test import get_test_filepath from sunpy.io.header import FileHeader from sunpy.map import GenericMap from sunpy.map import Map from sunpy.tests.helpers import skip_glymur AIA_193_JP2 = get_test_filepath("2013_06_24__17_31_30_84__SDO_AIA_AIA_193.jp2") @skip_glymur def test_read_data(): """Tests the reading of the JP2 data""" import glymur data = glymur.Jp2k(AIA_193_JP2).read() assert isinstance(data, np.ndarray) @skip_glymur def test_read_header(): """Tests the reading of the JP2 header""" from sunpy.io.jp2 import get_header header = get_header(AIA_193_JP2)[0] assert isinstance(header, FileHeader) @skip_glymur def test_read_file(): """Tests the reading of the complete JP2 file and its conversion into a SunPy map""" map_ = Map(AIA_193_JP2) assert isinstance(map_, GenericMap) sunpy-0.8.3/sunpy/io/tests/test_srs.py0000644000175000017500000000433213231613137020245 0ustar nabilnabil00000000000000""" This module implements tests for SRS Reader. """ import os import pytest import numpy as np import astropy.units as u from astropy.table import Table, Column, MaskedColumn from astropy.tests.helper import assert_quantity_allclose from sunpy.io.special import srs import sunpy.data.test testpath = sunpy.data.test.rootdir filenames = [{'file': '20150906SRS.txt', 'rows': 5}, {'file': '20150306SRS.txt', 'rows': 4}, {'file': '20150101SRS.txt', 'rows': 9}] COORDINATES = [{'text': 'N10W05', 'latitude': 10, 'longitude': 5}, {'text': 'N89E00', 'latitude': 89, 'longitude': 0}, {'text': 'S33E02', 'latitude': -33, 'longitude': -2}, {'text': 'S01', 'latitude': -1, 'longitude': None}] LOCATION = Column(data=[x['text'] for x in COORDINATES], name='Location') LONGLAT = Table() LONGLAT.add_column(MaskedColumn(data=[x['longitude'] for x in COORDINATES], name='Longitude', unit=u.deg, mask=True)) LONGLAT.add_column(MaskedColumn(data=[x['latitude'] for x in COORDINATES], name='Latitude', unit=u.deg)) @pytest.mark.parametrize("path, number_of_rows", [(os.path.join(testpath, elem['file']), elem['rows']) for elem in filenames]) def test_number_of_rows(path, number_of_rows): table = srs.read_srs(path) assert len(table) == number_of_rows @pytest.mark.parametrize("text, longitude", [(elem['text'], elem['longitude']) for elem in COORDINATES]) def test_parse_longitude(text, longitude): assert srs.parse_longitude(text) == longitude @pytest.mark.parametrize("text, latitude", [(elem['text'], elem['latitude']) for elem in COORDINATES]) def test_parse_latitude(text, latitude): assert srs.parse_latitude(text) == latitude @pytest.mark.parametrize("loc_column, exp_longitude, exp_latitude", [(LOCATION, LONGLAT['Longitude'], LONGLAT['Latitude'])]) def test_parse_location(loc_column, exp_longitude, exp_latitude): latitude, longitude = srs.parse_location(loc_column) assert_quantity_allclose(latitude, exp_latitude) assert_quantity_allclose(longitude, exp_longitude) sunpy-0.8.3/sunpy/io/__init__.py0000644000175000001440000000021213210261730015746 0ustar nabil00000000000000"""File input and output functions""" from __future__ import absolute_import, division, print_function from sunpy.io.file_tools import * sunpy-0.8.3/sunpy/io/ana.py0000755000175000017500000000704013231613137015776 0ustar nabilnabil00000000000000""" ANA File Reader .. warning:: The reading and writing of ana file is not supported under Windows. The C extensions are not built on Windows. Notes ----- ANA is a script that allows people to access compressed ana files. It accesses a C library, based on Michiel van Noort's IDL DLM library 'f0' which contains a cleaned up version of the original anarw routines. Created by Tim van Werkhoven (t.i.m.vanwerkhoven@gmail.com) on 2009-02-11. Copyright (c) 2009--2011 Tim van Werkhoven. """ from __future__ import absolute_import, division, print_function import os import collections try: from sunpy.io import _pyana except ImportError: # pragma: no cover _pyana = None # pragma: no cover from sunpy.io.header import FileHeader __all__ = ['read', 'get_header', 'write'] HDPair = collections.namedtuple('HDPair', ['data', 'header']) def read(filename, debug=False, **kwargs): """ Loads an ANA file and returns the data and a header in a list of (data, header) tuples. Parameters ---------- filename : `str` Name of file to be read. debug : `bool` (optional) Prints verbose debug information. Returns ------- out : `list` A list of (data, header) tuples Examples -------- >>> data = sunpy.io.ana.read(filename) # doctest: +SKIP """ if not os.path.isfile(filename): raise IOError("File does not exist!") if _pyana is None: raise ImportError("C extension for ANA is missing, please rebuild") # pragma: no cover data = _pyana.fzread(filename, debug) return [HDPair(data['data'], FileHeader(data['header']))] def get_header(filename, debug=False): """ Loads an ANA file and only return the header consisting of the dimensions, size (defined as the product of all dimensions times the size of the datatype, this not relying on actual filesize) and comments. Parameters ---------- filename : `str` Name of file to be read. debug : `bool` (optional) Prints verbose debug information. Returns ------- out : `list` A list of `~sunpy.io.header.FileHeader` headers. Examples -------- >>> header = sunpy.io.ana.get_header(filename) # doctest: +SKIP """ if _pyana is None: raise ImportError("C extension for ANA is missing, please rebuild")# pragma: no cover data = _pyana.fzread(filename, debug) return [FileHeader(data['header'])] def write(filename, data, comments=False, compress=1, debug=False): """ Saves a 2D numpy array as an ANA file and returns the bytes written or NULL Parameters ---------- filename : `str` Name of file to be created. data : `numpy.ndarray` Name of data to be stored. comments : `~sunpy.io.header.FileHeader`, optional The comments to be stored as a header. compress : `int`, optional To compress the data or not. 1 is to compress, 0 is uncompressed debug : `bool`, optional Prints verbose debug information. Returns ------- out: ANA compressed archive A new ANA compressed archive containing the data and header. Examples -------- >>> written = sunpy.io.ana.write(filename, data, comments=Falsem, compress=1) # doctest: +SKIP """ if _pyana is None: raise ImportError("C extension for ANA is missing, please rebuild")# pragma: no cover if comments: return _pyana.fzwrite(filename, data, compress, comments, debug) else: return _pyana.fzwrite(filename, data, compress, '', debug) sunpy-0.8.3/sunpy/io/file_tools.py0000644000175000017500000001446513232563447017415 0ustar nabilnabil00000000000000from __future__ import absolute_import, division, print_function import re import os import collections try: from . import fits except ImportError: fits = None try: from . import jp2 except ImportError: jp2 = None try: from . import ana except ImportError: ana = None __all__ = ['read_file', 'read_file_header', 'write_file'] # File formats supported by SunPy _known_extensions = { ('fts', 'fits'): 'fits', ('jp2', 'j2k', 'jpc', 'jpt'): 'jp2', ('fz', 'f0'): 'ana' } # Define a dict which raises a custom error message if the value is None class Readers(dict): def __init__(self, *args): dict.__init__(self, *args) def __getitem__(self, key): val = dict.__getitem__(self, key) if val is None: raise ReaderError("The Reader sunpy.io.{key!s} is not available, ".format(key=key) + "please check that you have the required dependencies installed.") return val #Map the readers _readers = Readers({ 'fits':fits, 'jp2':jp2, 'ana':ana }) def read_file(filepath, filetype=None, **kwargs): """ Automatically determine the filetype and read the file. Parameters ---------- filepath : `str` The file to be read filetype : `str` Supported reader or extension to manually specify the filetype. Supported readers are ('jp2', 'fits', 'ana') memmap : bool Should memory mapping be used, i.e. keep data on disk rather than in RAM. This is currently only supported by the FITS reader. Returns ------- pairs : `list` A list of (data, header) tuples. Notes ----- Other keyword arguments are passed to the reader used. """ if filetype: return _readers[filetype].read(filepath, **kwargs) for extension, readername in _known_extensions.items(): if filepath.endswith(extension) or filetype in extension: return _readers[readername].read(filepath, **kwargs) # If filetype is not apparent from extension, attempt to detect readername = _detect_filetype(filepath) return _readers[readername].read(filepath, **kwargs) def read_file_header(filepath, filetype=None, **kwargs): """ Reads the header from a given file. This should always return a instance of io.header.FileHeader Parameters ---------- filepath : `str` The file from which the header is to be read. filetype : `str` Supported reader or extension to manually specify the filetype. Supported readers are ('jp2', 'fits') Returns ------- headers : `list` A list of headers """ if filetype: return _readers[filetype].get_header(filepath, **kwargs) for extension, readername in _known_extensions.items(): if filepath.endswith(extension) or filetype in extension: return _readers[readername].get_header(filepath, **kwargs) readername = _detect_filetype(filepath) return _readers[readername].get_header(filepath, **kwargs) def write_file(fname, data, header, filetype='auto', **kwargs): """ Write a file from a data & header pair using one of the defined file types. Parameters ---------- fname : `str` Filename of file to save. data : `numpy.ndarray` Data to save to a fits file. header : `collections.OrderedDict` Meta data to save with the data. filetype : `str` {'auto', 'fits', 'jp2'} Filetype to save if auto fname extension will be detected, else specify a supported file extension. Notes ----- * Other keyword arguments will be passes to the writer function used. * This routine currently only supports saving a single HDU. """ if filetype == 'auto': for extension, readername in _known_extensions.items(): if fname.endswith(extension): return _readers[readername].write(fname, data, header, **kwargs) else: for extension, readername in _known_extensions.items(): if filetype in extension: return _readers[readername].write(fname, data, header, **kwargs) # Nothing has matched, panic raise ValueError("This filetype is not supported") def _detect_filetype(filepath): """ Attempts to determine the type of data contained in a file. This is only used for reading because it opens the file to check the data. Parameters ---------- filepath : `str` Where the file is. Returns ------- filetype : `str` The type of file. """ # Open file and read in first two lines with open(filepath, 'rb') as fp: line1 = fp.readline() line2 = fp.readline() # Some FITS files do not have line breaks at the end of header cards. fp.seek(0) first80 = fp.read(80) # FITS # # Check the extensions to see if it is a gzipped FITS file filepath_rest_ext1, ext1 = os.path.splitext(filepath) _, ext2 = os.path.splitext(filepath_rest_ext1) gzip_extensions = [".gz"] fits_extensions = [".fts", ".fit", ".fits"] if (ext1 in gzip_extensions and ext2 in fits_extensions): return 'fits' # Check for "KEY_WORD =" at beginning of file match = re.match(r"[A-Z0-9_]{0,8} *=".encode('ascii'), first80) if match is not None: return 'fits' # JPEG 2000 # # Checks for one of two signatures found at beginning of all JP2 files. # Adapted from ExifTool # [1] http://www.sno.phy.queensu.ca/~phil/exiftool/ # [2] http://www.jpeg.org/public/fcd15444-2.pdf # [3] ftp://ftp.remotesensing.org/jpeg2000/fcd15444-1.pdf jp2_signatures = [b"\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a", b"\x00\x00\x00\x0cjP\x1a\x1a\x0d\x0a\x87\x0a"] for sig in jp2_signatures: if line1 + line2 == sig: return 'jp2' # Raise an error if an unsupported filetype is encountered raise UnrecognizedFileTypeError("The requested filetype is not currently " "supported by SunPy.") class UnrecognizedFileTypeError(IOError): """Exception to raise when an unknown file type is encountered""" pass class ReaderError(ImportError): """Exception to raise when an unknown file type is encountered""" pass class InvalidJPEG2000FileExtension(IOError): pass sunpy-0.8.3/sunpy/io/fits.py0000644000175000017500000002223513232563373016213 0ustar nabilnabil00000000000000""" FITS File Reader Notes ----- FITS [1] FITS files allow comments to be attached to every value in the header. This is implemented in this module as a KEYCOMMENTS dictionary in the sunpy header. To add a comment to the file on write, add a comment to this dictionary with the same name as a key in the header (upcased). PyFITS [1] Due to the way PyFITS works with images the header dictionary may differ depending on whether is accessed before or after the fits[0].data is requested. If the header is read before the data then the original header will be returned. If the header is read after the data has been accessed then the data will have been scaled and a modified header reflecting these changes will be returned: BITPIX may differ and BSCALE and B_ZERO may be dropped in the modified version. [2] The verify('fix') call attempts to handle violations of the FITS standard. For example, nan values will be converted to "nan" strings. Attempting to cast a pyfits header to a dictionary while it contains invalid header tags will result in an error so verifying it early on makes the header easier to work with later. References ---------- | http://stackoverflow.com/questions/456672/class-factory-in-python | http://stsdas.stsci.edu/download/wikidocs/The_PyFITS_Handbook.pdf """ from __future__ import absolute_import, division, print_function import os import re import sys import warnings import traceback import itertools import collections from astropy.io import fits from sunpy.io.header import FileHeader from sunpy.extern.six.moves import zip __all__ = ['read', 'get_header', 'write', 'extract_waveunit'] __author__ = "Keith Hughitt, Stuart Mumford, Simon Liedtke" __email__ = "keith.hughitt@nasa.gov" HDPair = collections.namedtuple('HDPair', ['data', 'header']) def read(filepath, hdus=None, memmap=None, **kwargs): """ Read a fits file Parameters ---------- filepath : `str` The fits file to be read hdu: `int` or iterable The HDU indexes to read from the file Returns ------- pairs : `list` A list of (data, header) tuples Notes ----- This routine reads all the HDU's in a fits file and returns a list of the data and a FileHeader instance for each one. Also all comments in the original file are concatenated into a single 'comment' key in the returned FileHeader. """ with fits.open(filepath, ignore_blank=True, memmap=memmap) as hdulist: if hdus is not None: if isinstance(hdus, int): hdulist = hdulist[hdus] elif isinstance(hdus, collections.Iterable): hdulist = [hdulist[i] for i in hdus] hdulist.verify('silentfix+warn') headers = get_header(hdulist) pairs = [] for i, (hdu, header) in enumerate(zip(hdulist, headers)): try: pairs.append(HDPair(hdu.data, header)) except (KeyError, ValueError) as e: message = "Error when reading HDU {}. Skipping.\n".format(i) for line in traceback.format_tb(sys.exc_info()[2]): message += line message += '\n' message += repr(e) warnings.warn(message, Warning, stacklevel=2) return pairs def get_header(afile): """ Read a fits file and return just the headers for all HDU's. In each header, the key WAVEUNIT denotes the wavelength unit which is used to describe the value of the key WAVELNTH. Parameters ---------- afile : `str` or fits.HDUList The file to be read, or HDUList to process. Returns ------- headers : `list` A list of FileHeader headers. """ if isinstance(afile, fits.HDUList): hdulist = afile close = False else: hdulist = fits.open(afile, ignore_blank=True) hdulist.verify('silentfix') close = True try: headers= [] for hdu in hdulist: try: comment = "".join(hdu.header['COMMENT']).strip() except KeyError: comment = "" try: history = "".join(hdu.header['HISTORY']).strip() except KeyError: history = "" header = FileHeader(hdu.header) header['COMMENT'] = comment header['HISTORY'] = history # Strip out KEYCOMMENTS to a dict, the hard way keydict = {} for card in hdu.header.cards: if card.comment != '': keydict.update({card.keyword:card.comment}) header['KEYCOMMENTS'] = keydict header['WAVEUNIT'] = extract_waveunit(header) headers.append(header) finally: if close: hdulist.close() return headers def write(fname, data, header, **kwargs): """ Take a data header pair and write a FITS file. Parameters ---------- fname : `str` File name, with extension data : `numpy.ndarray` n-dimensional data array header : `dict` A header dictionary """ # Copy header so the one in memory is left alone while changing it for # write. header = header.copy() # The comments need to be added to the header separately from the normal # kwargs. Find and deal with them: fits_header = fits.Header() # Check Header key_comments = header.pop('KEYCOMMENTS', False) for k,v in header.items(): if isinstance(v, fits.header._HeaderCommentaryCards): if k == 'comments': comments = str(v).split('\n') for com in comments: fits_header.add_comments(com) elif k == 'history': hists = str(v).split('\n') for hist in hists: fits_header.add_history(hist) elif k != '': fits_header.append(fits.Card(k, str(v).split('\n'))) else: fits_header.append(fits.Card(k, v)) if isinstance(key_comments, dict): for k,v in key_comments.items(): fits_header.comments[k] = v elif key_comments: raise TypeError("KEYCOMMENTS must be a dictionary") fitskwargs = {'output_verify':'fix'} fitskwargs.update(kwargs) fits.writeto(os.path.expanduser(fname), data, header=fits_header, **fitskwargs) def extract_waveunit(header): """Attempt to read the wavelength unit from a given FITS header. Parameters ---------- header : FileHeader One :class:`sunpy.io.header.FileHeader` instance which was created by reading a FITS file. :func:`sunpy.io.fits.get_header` returns a list of such instances. Returns ------- waveunit : `str` The wavelength unit that could be found or ``None`` otherwise. Examples -------- The goal of this function is to return a string that can be used in conjunction with the astropy.units module so that the return value can be directly passed to ``astropy.units.Unit``:: >>> import astropy.units >>> header = {'WAVEUNIT': 'Angstrom', 'KEYCOMMENTS': {}} >>> waveunit = extract_waveunit(header) >>> if waveunit is not None: ... unit = astropy.units.Unit(waveunit) """ # algorithm: try the following procedures in the following order and return # as soon as a waveunit could be detected # 1. read header('WAVEUNIT'). If None, go to step 2. # 1.1 -9 -> 'nm' # 1.2 -10 -> 'angstrom' # 1.3 0 -> go to step 2 # 1.4 if neither of the above, return the value itself in lowercase # 2. parse waveunit_comment # 2.1 'in meters' -> 'm' # 3. parse wavelnth_comment # 3.1 "[$UNIT] ..." -> $UNIT # 3.2 "Observed wavelength ($UNIT)" -> $UNIT def parse_waveunit_comment(waveunit_comment): if waveunit_comment == 'in meters': return 'm' waveunit_comment = header['KEYCOMMENTS'].get('WAVEUNIT') wavelnth_comment = header['KEYCOMMENTS'].get('WAVELNTH') waveunit = header.get('WAVEUNIT') if waveunit is not None: metre_submultiples = { 0: parse_waveunit_comment(waveunit_comment), -1: 'dm', -2: 'cm', -3: 'mm', -6: 'um', -9: 'nm', -10: 'angstrom', -12: 'pm', -15: 'fm', -18: 'am', -21: 'zm', -24: 'ym'} waveunit = metre_submultiples.get(waveunit, str(waveunit).lower()) elif waveunit_comment is not None: waveunit = parse_waveunit_comment(waveunit_comment) elif wavelnth_comment is not None: # supported formats (where $UNIT is the unit like "nm" or "Angstrom"): # "Observed wavelength ($UNIT)" # "[$UNIT] ..." parentheses_pattern = r'Observed wavelength \((\w+?)\)$' brackets_pattern = r'^\[(\w+?)\]' for pattern in [parentheses_pattern, brackets_pattern]: m = re.search(pattern, wavelnth_comment) if m is not None: waveunit = m.group(1) break if waveunit == '': return None # To fix problems associated with HMI FITS. return waveunit sunpy-0.8.3/sunpy/io/header.py0000644000175000001440000000073713210261730015453 0ustar nabil00000000000000from __future__ import absolute_import, division, print_function # -*- coding: utf-8 -*- from collections import OrderedDict __all__ = ['FileHeader'] class FileHeader(OrderedDict): """ FileHeader is designed to provide a consistent interface to all other sunpy classes that expect a generic file. Open read all file types should format their header into a FileHeader """ def __init__(self, *args, **kwargs): OrderedDict.__init__(self, *args, **kwargs) sunpy-0.8.3/sunpy/io/jp2.py0000644000175000017500000000371613231613137015735 0ustar nabilnabil00000000000000"""JPEG 2000 File Reader""" from __future__ import absolute_import, division, print_function import collections from xml.etree import cElementTree as ET from glymur import Jp2k from sunpy.util.xml import xml_to_dict from sunpy.io.header import FileHeader __all__ = ['read', 'get_header', 'write'] __author__ = "Keith Hughitt" __email__ = "keith.hughitt@nasa.gov" HDPair = collections.namedtuple('HDPair', ['data', 'header']) def read(filepath, **kwargs): """ Reads a JPEG2000 file Parameters ---------- filepath : `str` The file to be read Returns ------- pairs : `list` A list of (data, header) tuples """ header = get_header(filepath) data = Jp2k(filepath).read()[::-1] return [HDPair(data, header[0])] def get_header(filepath): """ Reads the header from the file Parameters ---------- filepath : `str` The file to be read Returns ------- headers : list A list of headers read from the file """ jp2 = Jp2k(filepath) xml_box = [box for box in jp2.box if box.box_id == 'xml '] xmlstring = ET.tostring(xml_box[0].xml.find('fits')) pydict = xml_to_dict(xmlstring)["fits"] # Fix types for k, v in pydict.items(): if v.isdigit(): pydict[k] = int(v) elif _is_float(v): pydict[k] = float(v) # Remove newlines from comment if 'comment' in pydict: pydict['comment'] = pydict['comment'].replace("\n", "") # Is this file a Helioviewer Project JPEG2000 file? pydict['helioviewer'] = xml_box[0].xml.find('helioviewer') is not None return [FileHeader(pydict)] def write(fname, data, header): """ Place holder for required file writer """ raise NotImplementedError("No jp2 writer is implemented") def _is_float(s): """Check to see if a string value is a valid float""" try: float(s) return True except ValueError: return False sunpy-0.8.3/sunpy/io/setup_package.py0000644000175000017500000000177113231613137020054 0ustar nabilnabil00000000000000from __future__ import absolute_import import os import sys import platform from distutils.core import Extension from glob import glob from astropy_helpers import setup_helpers def get_extensions(): if platform.system() == 'Windows': return list() else: # 'numpy' will be replaced with the proper path to the numpy includes cfg = setup_helpers.DistutilsExtensionArgs() cfg['include_dirs'].append('numpy') cfg['sources'].extend(glob(os.path.join(os.path.dirname(__file__), 'src', 'ana', '*.c'))) cfg['extra_compile_args'].extend(['-std=c99', '-O3']) # Squash some warnings cfg['extra_compile_args'].extend(['-Wno-unused-but-set-variable', '-Wno-unused-variable', '-Wno-unused-result', '-Wno-sign-compare']) e = Extension('sunpy.io._pyana', **cfg) return [e] def requires_2to3(): return False sunpy-0.8.3/sunpy/lightcurve/0000755000175000017500000000000013232563477016442 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/lightcurve/sources/0000755000175000017500000000000013232563477020125 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/lightcurve/sources/__init__.py0000644000175000001440000000051013203275053021204 0ustar nabil00000000000000"""Datasource-specific classes This is where datasource specific logic is implemented. Each mission should have its own file with one or more classes defined. Typically, these classes will be subclasses of the :mod`sunpy.LightCurve` class. """ __all__ = ['rhessi', 'eve', 'goes', 'lyra', 'logical', 'noaa', 'norh','fermi_gbm'] sunpy-0.8.3/sunpy/lightcurve/sources/eve.py0000644000175000017500000001627213232563373021261 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- """Provides programs to process and analyze EVE data.""" from __future__ import absolute_import import os import codecs import numpy from datetime import datetime from collections import OrderedDict import matplotlib.pyplot as plt from pandas.io.parsers import read_csv from os.path import basename from sunpy.lightcurve import LightCurve __all__ = ['EVELightCurve'] class EVELightCurve(LightCurve): """ SDO EVE LightCurve for level 0CS data. The Extreme Ultraviolet Variability Experiment (EVE) is an instrument on board the Solar Dynamics Observatory (SDO). The EVE instrument is designed to measure the solar extreme ultraviolet (EUV) irradiance. The EUV radiation includes the 0.1-105 nm range, which provides the majority of the energy for heating Earth’s thermosphere and creating Earth’s ionosphere (charged plasma). EVE includes several irradiance instruments: The Multiple EUV Grating Spectrographs (MEGS)-A is a grazing- incidence spectrograph that measures the solar EUV irradiance in the 5 to 37 nm range with 0.1-nm resolution, and the MEGS-B is a normal-incidence, dual-pass spectrograph that measures the solar EUV irradiance in the 35 to 105 nm range with 0.1-nm resolution. Level 0CS data is primarily used for space weather. It is provided near real-time and is crudely calibrated 1-minute averaged broadband irradiances from ESP and MEGS-P broadband. Data is available starting on 2010/03/01. Examples -------- >>> import sunpy.lightcurve >>> import sunpy.data.test >>> eve = sunpy.lightcurve.EVELightCurve.create() # doctest: +REMOTE_DATA >>> eve = sunpy.lightcurve.EVELightCurve.create('2012/06/20') # doctest: +REMOTE_DATA >>> eve = sunpy.lightcurve.EVELightCurve.create("http://lasp.colorado.edu/eve/data_access/quicklook/quicklook_data/L0CS/LATEST_EVE_L0CS_DIODES_1m.txt") # doctest: +REMOTE_DATA >>> eve.peek(subplots=True) # doctest: +SKIP References ---------- * `SDO Mission Homepage `_ * `EVE Homepage `_ * `Level 0CS Definition `_ * `EVE Data Acess `_ * `Instrument Paper `_ """ def peek(self, column=None, **kwargs): """Plots the light curve in a new figure. An example is shown below. .. plot:: import sunpy.lightcurve from sunpy.data.sample import EVE_TIMESERIES eve = sunpy.lightcurve.EVELightCurve.create(EVE_TIMESERIES) eve.peek(subplots=True) Parameters ---------- column : str The column to display. If None displays all. **kwargs : dict Any additional plot arguments that should be used when plotting. Returns ------- fig : `~matplotlib.Figure` A plot figure. """ figure = plt.figure() # Choose title if none was specified if "title" not in kwargs and column is None: if len(self.data.columns) > 1: kwargs['title'] = 'EVE (1 minute data)' else: if self._filename is not None: base = self._filename.replace('_', ' ') kwargs['title'] = os.path.splitext(base)[0] else: kwargs['title'] = 'EVE Averages' if column is None: self.plot(**kwargs) else: data = self.data[column] if "title" not in kwargs: kwargs['title'] = 'EVE ' + column.replace('_', ' ') data.plot(**kwargs) figure.show() return figure @staticmethod def _get_default_uri(): """Loads latest level 0CS if no other data is specified""" return "http://lasp.colorado.edu/eve/data_access/evewebdata/quicklook/L0CS/LATEST_EVE_L0CS_DIODES_1m.txt" @staticmethod def _get_url_for_date(date): """Returns a URL to the EVE data for the specified date @NOTE: currently only supports downloading level 0 data .TODO: No data available prior to 2010/03/01! """ base_url = 'http://lasp.colorado.edu/eve/data_access/evewebdata/quicklook/L0CS/SpWx/' return base_url + date.strftime('%Y/%Y%m%d') + '_EVE_L0CS_DIODES_1m.txt' @classmethod def _parse_csv(cls, filepath): """Parses an EVE CSV file.""" cls._filename = basename(filepath) with codecs.open(filepath, mode='rb', encoding='ascii') as fp: # Determine type of EVE CSV file and parse line1 = fp.readline() fp.seek(0) if line1.startswith("Date"): return cls._parse_average_csv(fp) elif line1.startswith(";"): return cls._parse_level_0cs(fp) @staticmethod def _parse_average_csv(fp): """Parses an EVE Averages file.""" return "", read_csv(fp, sep=",", index_col=0, parse_dates=True) @staticmethod def _parse_level_0cs(fp): """Parses and EVE Level 0CS file.""" is_missing_data = False #boolean to check for missing data missing_data_val = numpy.nan header = [] fields = [] line = fp.readline() # Read header at top of file while line.startswith(";"): header.append(line) if '; Missing data:' in line : is_missing_data = True missing_data_val = line.split(':')[1].strip() line = fp.readline() meta = OrderedDict() for hline in header : if hline == '; Format:\n' or hline == '; Column descriptions:\n': continue elif ('Created' in hline) or ('Source' in hline): meta[hline.split(':', 1)[0].replace(';', ' ').strip()] = hline.split(':', 1)[1].strip() elif ':' in hline : meta[hline.split(':')[0].replace(';', ' ').strip()] = hline.split(':')[1].strip() fieldnames_start = False for hline in header: if hline.startswith("; Format:"): fieldnames_start = False if fieldnames_start: fields.append(hline.split(":")[0].replace(';', ' ').strip()) if hline.startswith("; Column descriptions:"): fieldnames_start = True # Next line is YYYY DOY MM DD date_parts = line.split(" ") year = int(date_parts[0]) month = int(date_parts[2]) day = int(date_parts[3]) #last_pos = fp.tell() #line = fp.readline() #el = line.split() #len # function to parse date column (HHMM) parser = lambda x: datetime(year, month, day, int(x[0:2]), int(x[2:4])) data = read_csv(fp, sep="\s*", names=fields, index_col=0, date_parser=parser, header=None, engine='python') if is_missing_data : #If missing data specified in header data[data == float(missing_data_val)] = numpy.nan # data.columns = fields return meta, data sunpy-0.8.3/sunpy/lightcurve/sources/fermi_gbm.py0000644000175000017500000001672013232563373022427 0ustar nabilnabil00000000000000"""Provides programs to process and analyse Fermi/GBM lightcurve data.""" from __future__ import absolute_import, print_function from collections import OrderedDict import numpy as np import matplotlib.pyplot as plt import pandas from sunpy.io.fits import fits from sunpy.instr import fermi from sunpy.lightcurve import LightCurve from sunpy.extern.six.moves import urllib __all__ = ['GBMSummaryLightCurve'] class GBMSummaryLightCurve(LightCurve): """ Fermi/GBM Summary Lightcurve. The Gamma-ray Burst Monitor (GBM) is an instrument aboard Fermi. It is meant to detect gamma-ray bursts but also detects solar flares. It consists of 12 Sodium Iodide (NaI) scintillation detectors and 2 Bismuth Germanate (BGO) scintillation detectors. The NaI detectors cover from a few keV to about 1 MeV and provide burst triggers and locations. The BGO detectors cover the energy range from about 150 keV to about 30 MeV. This summary lightcurve makes use of the CSPEC (daily version) data set which consists of the counts accumulated every 4.096 seconds in 128 energy channels for each of the 14 detectors. Note that the data is re-binned from the original 128 into the following 8 pre-determined energy channels. * 4-15 keV * 15-25 keV * 25-50 keV * 50-100 keV * 100-300 keV * 300-800 keV * 800-2000 keV Examples -------- >>> from sunpy.lightcurve import GBMSummaryLightCurve >>> gbm = GBMSummaryLightCurve.create('2011-06-07') # doctest: +SKIP >>> gbm.peek() # doctest: +SKIP References ---------- * `Fermi Mission Homepage `_ * `Fermi GBM Homepage `_ * `Fermi Science Support Center `_ * `Fermi Data Product `_ * `GBM Instrument Papers `_ """ def peek(self, **kwargs): """Plots the GBM lightcurve. An example can be seen below. .. plot:: from sunpy.lightcurve import GBMSummaryLightCurve from sunpy.data.sample import GBM_TIMESERIES gbm = GBMSummaryLightCurve.create(GBM_TIMESERIES) gbm.peek() Parameters ---------- **kwargs : dict Any additional plot arguments that should be used when plotting. """ figure=plt.figure() axes = plt.gca() data_lab = self.data.columns.values for d in data_lab: axes.plot(self.data.index, self.data[d], label=d) axes.set_yscale("log") axes.set_title('Fermi GBM Summary data ' + self.meta['DETNAM']) axes.set_xlabel('Start time: ' + self.data.index[0].strftime('%Y-%m-%d %H:%M:%S UT')) axes.set_ylabel('Counts/s/keV') axes.legend() figure.autofmt_xdate() plt.show() @classmethod def _get_url_for_date(cls, date, **kwargs): """Returns the url for Fermi/GBM data for the given date.""" baseurl = 'http://heasarc.gsfc.nasa.gov/FTP/fermi/data/gbm/daily/' # date is a datetime object if 'detector' in kwargs: det = _parse_detector(kwargs['detector']) final_url = urllib.parse.urljoin( baseurl, date.strftime('%Y/%m/%d/' + 'current/' + 'glg_cspec_' + det + '_%y%m%d_v00.pha')) else: # if user doesn't specify a detector, find the one pointing # closest to the Sun.' # OR: maybe user should have to specify detector or fail. det = cls._get_closest_detector_for_date(date) print('No detector specified. Detector with smallest mean angle ' 'to Sun is ' + str(det)) print('Using Detector ' + str(det)) print('For Fermi detector pointing information, use tools in ' 'sunpy/instr/fermi') final_url = urllib.parse.urljoin( baseurl, date.strftime('%Y/%m/%d/' + 'current/' + 'glg_cspec_' + det + '_%y%m%d_v00.pha')) return final_url @classmethod def _get_closest_detector_for_date(cls, date, **kwargs): """Returns the GBM detector with the smallest mean angle to the Sun for the given date""" pointing_file = fermi.download_weekly_pointing_file(date) det_angles = fermi.get_detector_sun_angles_for_date(date, pointing_file) det_angle_means = [] for n in det_angles.keys(): if not n == 'time': det_angle_values = [] for angle in det_angles[n]: det_angle_values.append(angle.value) det_angle_means.append(np.mean(det_angle_values)) best_det = 'n' +str(np.argmin(det_angle_means)) return best_det @staticmethod def _parse_fits(filepath): """Parses GBM CSPEC data files to create summary lightcurves.""" hdulist=fits.open(filepath) header=OrderedDict(hdulist[0].header) #these GBM files have three FITS extensions. #extn1 - this gives the energy range for each of the 128 energy bins #extn2 - this contains the data, e.g. counts, exposure time, time of observation #extn3 - eclipse times? energy_bins=hdulist[1].data count_data=hdulist[2].data misc=hdulist[3].data #rebin the 128 energy channels into some summary ranges #4-15 keV, 15 - 25 keV, 25-50 keV, 50-100 keV, 100-300 keV, 300-800 keV, 800 - 2000 keV #put the data in the units of counts/s/keV summary_counts=_bin_data_for_summary(energy_bins,count_data) gbm_times=[] #get the time information in datetime format with the correct MET adjustment for t in count_data['time']: gbm_times.append(fermi.met_to_utc(t)) column_labels=['4-15 keV','15-25 keV','25-50 keV','50-100 keV','100-300 keV', '300-800 keV','800-2000 keV'] return header, pandas.DataFrame(summary_counts, columns=column_labels, index=gbm_times) def _bin_data_for_summary(energy_bins,count_data): """Missing doc string""" #find the indices corresponding to some standard summary energy bins ebands=[4,15,25,50,100,300,800,2000] indices=[] for e in ebands: indices.append(np.searchsorted(energy_bins['e_max'],e)) #rebin the 128 energy channels into some summary ranges #4-15 keV, 15 - 25 keV, 25-50 keV, 50-100 keV, 100-300 keV, 300-800 keV, 800 - 2000 keV #put the data in the units of counts/s/keV summary_counts=[] for i in range(0,len(count_data['counts'])): counts_in_bands=[] for j in range(1,len(ebands)): counts_in_bands.append(np.sum(count_data['counts'][i][indices[j-1]:indices[j]]) / (count_data['exposure'][i] * (energy_bins['e_max'][indices[j]] - energy_bins['e_min'][indices[j-1]]))) summary_counts.append(counts_in_bands) return summary_counts def _parse_detector(detector): """Missing Doc String""" oklist=['n0','n1','n2','n3','n4','n5','n6','n7','n8','n9','n10','n11'] altlist = [str(i) for i in range(12)] if detector in oklist: return detector elif detector in altlist: return 'n'+detector else: raise ValueError('Detector string could not be interpreted') sunpy-0.8.3/sunpy/lightcurve/sources/goes.py0000644000175000017500000002062313232563373021432 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- """Provides programs to process and analyze GOES X-ray data.""" from __future__ import absolute_import import datetime import matplotlib.dates from matplotlib import pyplot as plt from astropy.io import fits as pyfits from numpy import nan from numpy import floor from pandas import DataFrame from sunpy.lightcurve import LightCurve from sunpy.time import parse_time, TimeRange, is_time_in_given_format from sunpy.util import net __all__ = ['GOESLightCurve'] class GOESLightCurve(LightCurve): """ GOES XRS LightCurve Each GOES satellite there are two X-ray Sensors (XRS) which provide solar X ray fluxes for the wavelength bands of 0.5 to 4 Å (short channel) and 1 to 8 Å (long channel). Most recent data is usually available one or two days late. Data is available starting on 1981/01/01. Examples -------- >>> from sunpy import lightcurve as lc >>> from sunpy.time import TimeRange >>> goes = lc.GOESLightCurve.create(TimeRange('2012/06/01', '2012/06/05')) # doctest: +REMOTE_DATA >>> goes.peek() # doctest: +SKIP References ---------- * `GOES Mission Homepage `_ * `GOES XRS Homepage `_ * `GOES XRS Guide `_ * `NASCOM Data Archive `_ """ def peek(self, title="GOES Xray Flux"): """Plots GOES XRS light curve is the usual manner. An example is shown below. .. plot:: from sunpy import lightcurve as lc from sunpy.data.sample import GOES_XRS_TIMESERIES goes = lc.GOESLightCurve.create(GOES_XRS_TIMESERIES) goes.peek() Parameters ---------- title : str The title of the plot. **kwargs : dict Any additional plot arguments that should be used when plotting. Returns ------- fig : `~matplotlib.Figure` A plot figure. """ figure = plt.figure() axes = plt.gca() dates = matplotlib.dates.date2num(parse_time(self.data.index)) axes.plot_date(dates, self.data['xrsa'], '-', label='0.5--4.0 $\AA$', color='blue', lw=2) axes.plot_date(dates, self.data['xrsb'], '-', label='1.0--8.0 $\AA$', color='red', lw=2) axes.set_yscale("log") axes.set_ylim(1e-9, 1e-2) axes.set_title(title) axes.set_ylabel('Watts m$^{-2}$') axes.set_xlabel(datetime.datetime.isoformat(self.data.index[0])[0:10]) ax2 = axes.twinx() ax2.set_yscale("log") ax2.set_ylim(1e-9, 1e-2) ax2.set_yticks((1e-9, 1e-8, 1e-7, 1e-6, 1e-5, 1e-4, 1e-3, 1e-2)) ax2.set_yticklabels((' ', 'A', 'B', 'C', 'M', 'X', ' ')) axes.yaxis.grid(True, 'major') axes.xaxis.grid(False, 'major') axes.legend() # @todo: display better tick labels for date range (e.g. 06/01 - 06/05) formatter = matplotlib.dates.DateFormatter('%H:%M') axes.xaxis.set_major_formatter(formatter) axes.fmt_xdata = matplotlib.dates.DateFormatter('%H:%M') figure.autofmt_xdate() figure.show() return figure @classmethod def _get_default_uri(cls): """Returns the URL for the latest GOES data.""" now = datetime.datetime.utcnow() time_range = TimeRange(datetime.datetime(now.year, now.month, now.day), now) url_does_exist = net.url_exists(cls._get_url_for_date_range(time_range)) while not url_does_exist: time_range = TimeRange(time_range.start-datetime.timedelta(days=1), time_range.start) url_does_exist = net.url_exists(cls._get_url_for_date_range(time_range)) return cls._get_url_for_date_range(time_range) @classmethod def _get_goes_sat_num(self, start, end): """Parses the query time to determine which GOES satellite to use.""" goes_operational = { 2: TimeRange('1980-01-04', '1983-05-01'), 5: TimeRange('1983-05-02', '1984-08-01'), 6: TimeRange('1983-06-01', '1994-08-19'), 7: TimeRange('1994-01-01', '1996-08-14'), 8: TimeRange('1996-03-21', '2003-06-19'), 9: TimeRange('1997-01-01', '1998-09-09'), 10: TimeRange('1998-07-10', '2009-12-02'), 11: TimeRange('2006-06-20', '2008-02-16'), 12: TimeRange('2002-12-13', '2007-05-09'), 13: TimeRange('2006-08-01', '2006-08-01'), 14: TimeRange('2009-12-02', '2010-11-05'), 15: TimeRange('2010-09-01', datetime.datetime.utcnow())} sat_list = [] for sat_num in goes_operational: if ((start >= goes_operational[sat_num].start and start <= goes_operational[sat_num].end and (end >= goes_operational[sat_num].start and end <= goes_operational[sat_num].end))): # if true then the satellite with sat_num is available sat_list.append(sat_num) if not sat_list: # if no satellites were found then raise an exception raise Exception('No operational GOES satellites within time range') else: return sat_list @staticmethod def _get_url_for_date_range(*args): """Returns a URL to the GOES data for the specified date. Parameters ---------- args : `~sunpy.time.TimeRange`, `datetime.datetime`, str Date range should be specified using a TimeRange, or start and end dates at datetime instances or date strings. satellite_number : int GOES satellite number (default = 15) data_type : str Data type to return for the particular GOES satellite. Supported types depend on the satellite number specified. (default = xrs_2s) """ # TimeRange if len(args) == 1 and isinstance(args[0], TimeRange): start = args[0].start end = args[0].end elif len(args) == 2: start = parse_time(args[0]) end = parse_time(args[1]) if end < start: raise ValueError('start time > end time') # find out which satellite and datatype to query from the query times sat_num = GOESLightCurve._get_goes_sat_num(start, end) base_url = 'http://umbra.nascom.nasa.gov/goes/fits/' if start < parse_time('1999/01/15'): url = base_url + "{date:%Y}/go{sat:02d}{date:%y%m%d}.fits".format( date=start, sat=sat_num[0]) else: url = base_url + "{date:%Y}/go{sat:02d}{date:%Y%m%d}.fits".format( date=start, sat=sat_num[0]) return url @staticmethod def _parse_fits(filepath): """Parses a GOES/XRS FITS file from http://umbra.nascom.nasa.gov/goes/fits/""" fits = pyfits.open(filepath) header = fits[0].header if len(fits) == 4: if is_time_in_given_format(fits[0].header['DATE-OBS'], '%d/%m/%Y'): start_time = datetime.datetime.strptime(fits[0].header['DATE-OBS'], '%d/%m/%Y') elif is_time_in_given_format(fits[0].header['DATE-OBS'], '%d/%m/%y'): start_time = datetime.datetime.strptime(fits[0].header['DATE-OBS'], '%d/%m/%y') else: raise ValueError("Date not recognized") xrsb = fits[2].data['FLUX'][0][:, 0] xrsa = fits[2].data['FLUX'][0][:, 1] seconds_from_start = fits[2].data['TIME'][0] elif 1 <= len(fits) <= 3: start_time = parse_time(header['TIMEZERO']) seconds_from_start = fits[0].data[0] xrsb = fits[0].data[1] xrsa = fits[0].data[2] else: raise ValueError("Don't know how to parse this file") times = [start_time + datetime.timedelta(seconds=int(floor(s)), microseconds=int((s - floor(s)) * 1e6)) for s in seconds_from_start] # remove bad values as defined in header comments xrsb[xrsb == -99999] = nan xrsa[xrsa == -99999] = nan # fix byte ordering newxrsa = xrsa.byteswap().newbyteorder() newxrsb = xrsb.byteswap().newbyteorder() data = DataFrame({'xrsa': newxrsa, 'xrsb': newxrsb}, index=times) data.sort_index(inplace=True) return header, data sunpy-0.8.3/sunpy/lightcurve/sources/logical.py0000644000175000001440000000345713210261730021067 0ustar nabil00000000000000# -*- coding: utf-8 -*- """Provides a logical lightcurve. Only two values are allowed - True or False. Useful for keeping track of when an event occurred, usually labeled as "True".""" from __future__ import absolute_import import numpy as np from sunpy.lightcurve import LightCurve from scipy.ndimage import label from sunpy.time import TimeRange from sunpy.extern.six.moves import range __all__ = ['LogicalLightCurve'] # Logical Lightcurve # TODO # Change the init to accept a list of TimeRange objects. Durations between the # start and end time of each TimeRange object are labeled 'True'. class LogicalLightCurve(LightCurve): """ Logical LightCurve with only True and False values. Examples -------- >>> import sunpy.lightcurve as lightcurve >>> import datetime >>> base = datetime.datetime.today() >>> dates = [base - datetime.timedelta(minutes=x) for x in range(0, 24 * 60)] >>> z = [True for x in range(0, 24 * 60)] >>> light_curve = lightcurve.LogicalLightCurve.create({"param1": z}, index=dates) """ def complement(self): """Return the logical complement of the original lightcurve.""" return LogicalLightCurve.create(np.invert(self.data), header=self.header) def times(self): """Returns a list of time ranges where values are True. Returns ------- outtr : `~sunpy.time.TimeRange` array An array of time ranges """ labeling = label(self.data) timeranges = [] for i in range(1, labeling[1] + 1): eventindices = (labeling[0] == i).nonzero() timeranges.append(TimeRange(self.data.index[eventindices[0][0]], self.data.index[eventindices[0][-1]])) return timeranges sunpy-0.8.3/sunpy/lightcurve/sources/lyra.py0000644000175000017500000001603513231613140021431 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- """Provides programs to process and analyze PROBA2/LYRA data.""" from __future__ import absolute_import, division, print_function import datetime import sys from collections import OrderedDict from matplotlib import pyplot as plt from astropy.io import fits import pandas from sunpy.lightcurve import LightCurve from sunpy.time import parse_time from sunpy import config from sunpy.extern.six.moves import urllib TIME_FORMAT = config.get("general", "time_format") __all__ = ['LYRALightCurve'] class LYRALightCurve(LightCurve): """ Proba-2 LYRA LightCurve. LYRA (Large Yield RAdiometer) is an ultraviolet irradiance radiometer that observes the Sun in four passbands, chosen for their relevance to solar physics, aeronomy and space weather. LYRA is composed of three (redundant) units, each of them constituted of the same four channels: * 120-123 nm Lyman-alpha channel * 190-222 nm Herzberg continuum channel * Aluminium filter channel (17-80 nm + a contribution below 5 nm), including He II at 30.4 nm * Zirconium filter channel (6-20 nm + a contribution below 2 nm), rejecting He II LYRA can take data with cadences chosen in the 100Hz to 0.1Hz interval. PROBA2 was launched on 2 November 2009. This class can download and hold either Level 2 data (the default) which has sub-second resolution or Level 3 which is the Level 2 data averaged to one minute cadence. The level can be specified with the ``level`` keyword argument to `~sunpy.lightcurve.LyraLightCurve.create`. Examples -------- >>> import sunpy >>> lyra = sunpy.lightcurve.LYRALightCurve.create() # doctest: +REMOTE_DATA >>> lyra = sunpy.lightcurve.LYRALightCurve.create('~/Data/lyra/lyra_20110810-000000_lev2_std.fits') # doctest: +SKIP >>> lyra = sunpy.lightcurve.LYRALightCurve.create('2011/08/10') # doctest: +REMOTE_DATA >>> lyra = sunpy.lightcurve.LYRALightCurve.create('2011/08/10', level=3) # doctest: +REMOTE_DATA >>> lyra = sunpy.lightcurve.LYRALightCurve.create("http://proba2.oma.be/lyra/data/bsd/2011/08/10/lyra_20110810-000000_lev2_std.fits") # doctest: +REMOTE_DATA >>> lyra.peek() # doctest: +SKIP References ---------- * `Proba2 SWAP Science Center `_ * `LYRA Data Homepage `_ * `LYRA Instrument Homepage `_ """ def peek(self, names=3, **kwargs): """Plots the LYRA data. An example is shown below. .. plot:: import sunpy.lightcurve from sunpy.data.sample import LYRA_LEVEL3_TIMESERIES lyra = sunpy.lightcurve.LYRALightCurve.create(LYRA_LEVEL3_TIMESERIES) lyra.peek() Parameters ---------- names : int The number of columns to plot. **kwargs : dict Any additional plot arguments that should be used when plotting. Returns ------- fig : `~matplotlib.Figure` A plot figure. """ lyranames = (('Lyman alpha','Herzberg cont.','Al filter','Zr filter'), ('120-123nm','190-222nm','17-80nm + <5nm','6-20nm + <2nm')) # Choose title if none was specified #if not kwargs.has_key("title"): # if len(self.data.columns) > 1: # kwargs['title'] = 'LYRA data' # else: # if self._filename is not None: # base = self._filename # kwargs['title'] = os.path.splitext(base)[0] # else: # kwargs['title'] = 'LYRA data' figure = plt.figure() plt.subplots_adjust(left=0.17,top=0.94,right=0.94,bottom=0.15) axes = plt.gca() axes = self.data.plot(ax=axes, subplots=True, sharex=True, **kwargs) for i, name in enumerate(self.data.columns): if names < 3: name = lyranames[names][i] else: name = lyranames[0][i] + ' \n (' + lyranames[1][i] + ')' axes[i].set_ylabel( "{name} \n (W/m**2)".format(name=name), fontsize=9.5) axes[0].set_title("LYRA ({0:{1}})".format(self.data.index[0],TIME_FORMAT)) axes[-1].set_xlabel("Time") for axe in axes: axe.locator_params(axis='y',nbins=6) figure.show() return figure @staticmethod def _get_url_for_date(date, **kwargs): """Returns a URL to the LYRA data for the specified date""" dt = parse_time(date or datetime.datetime.utcnow()) # Filename filename = "lyra_{0:%Y%m%d-}000000_lev{1:d}_std.fits".format( dt, kwargs.get('level', 2)) # URL base_url = "http://proba2.oma.be/lyra/data/bsd/" url_path = urllib.parse.urljoin(dt.strftime('%Y/%m/%d/'), filename) return urllib.parse.urljoin(base_url, url_path) @classmethod def _get_default_uri(cls): """Returns URL for latest LYRA data""" return cls._get_url_for_date(datetime.datetime.utcnow()) @staticmethod def _parse_fits(filepath): """Parses LYRA data from a FITS file""" # Open file with PyFITS hdulist = fits.open(filepath) fits_record = hdulist[1].data # secondary_header = hdulist[1].header # Start and end dates. Different LYRA FITS files have # different tags for the date obs. if 'date-obs' in hdulist[0].header: start_str = hdulist[0].header['date-obs'] elif 'date_obs' in hdulist[0].header: start_str = hdulist[0].header['date_obs'] # end_str = hdulist[0].header['date-end'] # start = datetime.datetime.strptime(start_str, '%Y-%m-%dT%H:%M:%S.%f') start = parse_time(start_str) # end = datetime.datetime.strptime(end_str, '%Y-%m-%dT%H:%M:%S.%f') # First column are times. For level 2 data, the units are [s]. # For level 3 data, the units are [min] if hdulist[1].header['TUNIT1'] == 's': times = [start + datetime.timedelta(seconds=n) for n in fits_record.field(0)] elif hdulist[1].header['TUNIT1'] == 'MIN': times = [start + datetime.timedelta(minutes=int(n)) for n in fits_record.field(0)] else: raise ValueError("Time unit in LYRA fits file not recognised. " "Value = {0}".format(hdulist[1].header['TUNIT1'])) # Rest of columns are the data table = {} for i, col in enumerate(fits_record.columns[1:-1]): # temporary patch for big-endian data bug on pandas 0.13 if fits_record.field(i+1).dtype.byteorder == '>' and sys.byteorder =='little': table[col.name] = fits_record.field(i + 1).byteswap().newbyteorder() else: table[col.name] = fits_record.field(i + 1) # Return the header and the data data = pandas.DataFrame(table, index=times) data.sort_index(inplace=True) return OrderedDict(hdulist[0].header), data sunpy-0.8.3/sunpy/lightcurve/sources/noaa.py0000644000175000017500000002172513232563373021417 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- """Provides programs to process and analyze NOAA Solar Cycle data.""" from __future__ import absolute_import import datetime from matplotlib import pyplot as plt from pandas.io.parsers import read_csv import numpy as np from sunpy.lightcurve import LightCurve __all__ = ['NOAAIndicesLightCurve', 'NOAAPredictIndicesLightCurve'] class NOAAIndicesLightCurve(LightCurve): """ NOAA Solar Cycle monthly indices. Solar activity is measured by a number of different values. The NOAA Solar Weather Prediction Center (SWPC) publishes the following indices. All of these indices are also provided as a 13-month running smoothed value. 1. The SWO sunspot number is issued by the NOAA Space Weather Prediction Center (SWPC) 2. The RI sunspot number is the official International Sunspot Number and is issued by the `Solar Influence Data Analysis Center (SDIC) `_ in Brussels, Belgium. 3. The ratio between the SWO and RI indices. 4. Radio flux at 10.7 cm is produced by Penticon/Ottawa and the units are in sfu. 5. The Ap Geomagnetic Index is produced by the United States Air Force (USAF). Examples -------- >>> from sunpy import lightcurve as lc >>> noaa = lc.NOAAIndicesLightCurve.create() # doctest: +REMOTE_DATA >>> noaa.peek() # doctest: +SKIP References ---------- * `Solar and Geomagnetic Indices Data Archive `_ * `Recent solar indices `_ * `Indices Descriptions `_ * `NOAA plots of Solar Cycle Progression `_ * `NOAA Product List `_ """ default_url_noaa_indices = "ftp://ftp.swpc.noaa.gov/pub/weekly/RecentIndices.txt" def peek(self, type='sunspot SWO', **plot_args): """Plots NOAA Indices as a function of time. An example is shown below. ..plot:: from sunpy import lightcurve as lc from sunpy.data.sample import NOAAINDICES_TIMESERIES noaa = lc.NOAAIndicesLightCurve.create(NOAAINDICES_TIMESERIES) noaa.peek() Parameters ---------- type : str The type of plot required. **plot_args : dict Any additional plot arguments that should be used when plotting. Returns ------- fig : ~matplotlib.Figure A plot figure. """ figure = plt.figure() axes = plt.gca() if type == 'sunspot SWO': axes = self.data['sunspot SWO'].plot() self.data['sunspot SWO smooth'].plot() axes.set_ylabel('Sunspot Number') if type == 'sunspot RI': axes = self.data['sunspot RI'].plot() self.data['sunspot RI smooth'].plot() axes.set_ylabel('Sunspot Number') if type == 'sunspot compare': axes = self.data['sunspot RI'].plot() self.data['sunspot SWO'].plot() axes.set_ylabel('Sunspot Number') if type == 'radio': axes = self.data['radio flux'].plot() self.data['radio flux smooth'].plot() axes.set_ylabel('Radio Flux [sfu]') if type == 'geo': axes = self.data['geomagnetic ap'].plot() self.data['geomagnetic ap smooth'].plot() axes.set_ylabel('Geomagnetic AP Index') axes.set_ylim(0) axes.set_title('Solar Cycle Progression') axes.yaxis.grid(True, 'major') axes.xaxis.grid(True, 'major') axes.legend() figure.show() return figure @classmethod def _get_default_uri(cls): """Return the url to download indices""" return NOAAIndicesLightCurve.default_url_noaa_indices @staticmethod def _get_url_for_date_range(*args, **kwargs): """Returns a URL for the specified date.""" return NOAAIndicesLightCurve.default_url_noaa_indices @staticmethod def _parse_csv(filepath): """Parses an NOAA indices csv""" header = [] with open(filepath, 'r') as fp: line = fp.readline() # Read header at top of file while line.startswith((":", "#")): header += line line = fp.readline() fields = ('yyyy', 'mm', 'sunspot SWO', 'sunspot RI', 'sunspot ratio', 'sunspot SWO smooth', 'sunspot RI smooth', 'radio flux', 'radio flux smooth', 'geomagnetic ap', 'geomagnetic smooth') data = read_csv(fp, delim_whitespace=True, names = fields, comment='#', dtype={'yyyy':np.str, 'mm':np.str}) data = data.dropna(how='any') timeindex = [datetime.datetime.strptime(x + y, '%Y%m') for x,y in zip(data['yyyy'], data['mm'])] data['time']=timeindex data = data.set_index('time') data = data.drop('mm',1) data = data.drop('yyyy',1) return {'comments': header}, data class NOAAPredictIndicesLightCurve(LightCurve): """ NOAA Solar Cycle Predicted Progression The predictions are updated monthly and are produced by ISES. Observed values are initially the preliminary values which are replaced with the final values as they become available. The following predicted values are available. * The predicted RI sunspot number is the official International Sunspot Number and is issued by the `Solar Influence Data Analysis Center (SDIC) `_ in Brussels, Belgium. * The predicted radio flux at 10.7 cm is produced by `Penticon/Ottawa `_ and the units are in sfu. Examples -------- >>> from sunpy import lightcurve as lc >>> noaa = lc.NOAAPredictIndicesLightCurve.create() #doctest: +REMOTE_DATA >>> noaa.peek() # doctest: +SKIP References ---------- * `Solar and Geomagnetic Indices Data Archive `_ * `Predicted solar indices `_ * `NOAA plots of Solar Cycle Progression `_ * `NOAA Product List `_ """ default_url_noaa_predict_indices = "http://services.swpc.noaa.gov/text/predicted-sunspot-radio-flux.txt" def peek(self, **plot_args): """ Plots predicted NOAA Indices as a function of time. An example is shown below. ..plot:: from sunpy import lightcurve as lc from sunpy.data.sample import NOAAPREDICT_TIMESERIES noaa = lc.NOAAPredictIndicesLightCurve.create(NOAAPREDICT_TIMESERIES) noaa.peek() Parameters ---------- **plot_args : dict Any additional plot arguments that should be used when plotting. Returns ------- fig : `~matplotlib.Figure` A plot figure. """ figure = plt.figure() axes = plt.gca() axes = self.data['sunspot'].plot(color='b') self.data['sunspot low'].plot(linestyle='--', color='b') self.data['sunspot high'].plot(linestyle='--', color='b') axes.set_ylim(0) axes.set_title('Solar Cycle Sunspot Number Prediction') axes.set_ylabel('Sunspot Number') # axes.set_xlabel(datetime.datetime.isoformat(self.data.index[0])[0:10]) axes.yaxis.grid(True, 'major') axes.xaxis.grid(True, 'major') axes.legend() figure.show() return figure @classmethod def _get_default_uri(cls): """Return the url to download indices""" return NOAAPredictIndicesLightCurve.default_url_noaa_predict_indices @staticmethod def _get_url_for_date_range(*args, **kwargs): """Returns a URL for the specified date.""" return NOAAPredictIndicesLightCurve.default_url_noaa_predict_indices @staticmethod def _parse_csv(filepath): """Parses an NOAA indices csv""" header = '' with open(filepath, 'r') as fp: line = fp.readline() # Read header at top of file while line.startswith((":", "#")): header += line line = fp.readline() fields = ('yyyy', 'mm', 'sunspot', 'sunspot low', 'sunspot high', 'radio flux', 'radio flux low', 'radio flux high') data = read_csv(filepath, delim_whitespace=True, names = fields, comment='#', skiprows=2, dtype={'yyyy':np.str, 'mm':np.str}) data = data.dropna(how='any') timeindex = [datetime.datetime.strptime(x + y, '%Y%m') for x,y in zip(data['yyyy'], data['mm'])] data['time']=timeindex data = data.set_index('time') data = data.drop('mm',1) data = data.drop('yyyy',1) return {'comments': header}, data sunpy-0.8.3/sunpy/lightcurve/sources/norh.py0000644000175000017500000001055013231613140021424 0ustar nabilnabil00000000000000"""Provides programs to process and analyse NoRH lightcurve data.""" from __future__ import absolute_import import datetime from collections import OrderedDict import numpy as np import matplotlib.pyplot as plt from astropy.io import fits import pandas from sunpy.lightcurve import LightCurve from sunpy.time import parse_time from sunpy import config from sunpy.extern.six.moves import urllib TIME_FORMAT = config.get("general", "time_format") __all__ = ['NoRHLightCurve'] class NoRHLightCurve(LightCurve): """ Nobeyama Radioheliograph Correlation LightCurve. Nobeyama Radioheliograph (NoRH) is a radio telescope dedicated to observing the Sun. It consists of 84 parabolic antennas with 80 cm diameter, sitting on lines of 490 m long in the east/west and of 220 m long in the north/south. It observes the full solar disk at 17 GHz and 34 GHz with a temporal resolution down to 0.1 second resolution (typically 1 s). It is located in Japan at `35.941667, 138.475833 `_. Its first observation was in April, 1992 and daily 8-hour observations are available starting June, 1992. Examples -------- >>> import sunpy.lightcurve >>> norh = sunpy.lightcurve.NoRHLightCurve.create('~/Data/norh/tca110607') # doctest: +SKIP >>> norh = sunpy.lightcurve.NoRHLightCurve.create('2011/08/10') # doctest: +SKIP >>> norh = sunpy.lightcurve.NoRHLightCurve.create('2011/08/10',wavelength='34') # doctest: +SKIP >>> norh.peek() # doctest: +SKIP References ---------- * `Nobeyama Radioheliograph Homepage `_ * `Analysis Manual `_ * `Nobeyama Correlation Plots `_ """ def peek(self, **kwargs): """Plots the NoRH lightcurve .. plot:: from sunpy import lightcurve as lc from sunpy.data.sample import NORH_TIMESERIES norh = lc.NoRHLightCurve.create(NORH_TIMESERIES) norh.peek() Parameters ---------- **kwargs : dict Any additional plot arguments that should be used when plotting. """ plt.figure() axes = plt.gca() data_lab=self.meta['OBS-FREQ'][0:2] + ' ' + self.meta['OBS-FREQ'][2:5] axes.plot(self.data.index,self.data,label=data_lab) axes.set_yscale("log") axes.set_ylim(1e-4,1) axes.set_title('Nobeyama Radioheliograph') axes.set_xlabel('Start time: ' + self.data.index[0].strftime(TIME_FORMAT)) axes.set_ylabel('Correlation') axes.legend() plt.show() @classmethod def _get_url_for_date(cls, date, **kwargs): """ This method retrieves the url for NoRH correlation data for the given date. """ # default urllib password anonymous@ is not accepted by the NoRH FTP # server. include an accepted password in base url baseurl = 'ftp://anonymous:mozilla@example.com@solar-pub.nao.ac.jp/pub/nsro/norh/data/tcx/' # date is a datetime object if 'wavelength' in kwargs: if kwargs['wavelength'] == '34': final_url = urllib.parse.urljoin( baseurl, date.strftime('%Y/%m/tcz%y%m%d')) else: final_url = urllib.parse.urljoin( baseurl, date.strftime('%Y/%m/tca%y%m%d')) return final_url @staticmethod def _parse_fits(filepath): """This method parses NoRH tca and tcz correlation files.""" hdulist = fits.open(filepath) header = OrderedDict(hdulist[0].header) # For these NoRH files, the time series data is recorded in the primary # HDU data = hdulist[0].data # No explicit time array in FITS file, so construct the time array from # the FITS header obs_start_time=parse_time(header['DATE-OBS'] + 'T' + header['CRVAL1']) length = len(data) cadence = np.float(header['CDELT1']) sec_array = np.linspace(0, length-1, (length/cadence)) norh_time = [] for s in sec_array: norh_time.append(obs_start_time + datetime.timedelta(0,s)) return header, pandas.DataFrame(data, index=norh_time) sunpy-0.8.3/sunpy/lightcurve/sources/rhessi.py0000644000175000017500000001017013232563373021766 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- """Provides programs to process and analyze RHESSI X-ray data.""" from __future__ import absolute_import import datetime import matplotlib.dates import matplotlib.pyplot as plt from pandas import DataFrame from sunpy.lightcurve import LightCurve from sunpy.time import TimeRange, parse_time from sunpy.instr import rhessi __all__ = ['RHESSISummaryLightCurve'] class RHESSISummaryLightCurve(LightCurve): """ RHESSI X-ray Summary LightCurve. The RHESSI mission consists of a single spin-stabilized spacecraft in a low-altitude orbit inclined 38 degrees to the Earth's equator. The only instrument on board is an Germaniun imaging spectrometer with the ability to obtain high fidelity solar images in X rays (down to 3 keV) to gamma rays (1 MeV). RHESSI provides summary lightcurves in the following passbands * 3 - 6 keV * 6 - 12 keV * 12 - 25 keV * 25 - 50 keV * 50 - 100 keV * 100 - 300 keV * 300 - 800 keV * 800 - 7000 keV * 7000 - 20000 keV RHESSI was launched on 5 February 2002. Examples -------- >>> from sunpy import lightcurve as lc >>> rhessi = lc.RHESSISummaryLightCurve.create() #doctest: +REMOTE_DATA >>> rhessi = lc.RHESSISummaryLightCurve.create('2012/06/01', '2012/06/05') #doctest: +REMOTE_DATA >>> rhessi.peek() # doctest: +SKIP References ---------- * RHESSI Homepage ``_ * Mission Paper ``_ """ def peek(self): """Plots RHESSI Count Rate light curve. An example is shown below. .. plot:: from sunpy import lightcurve as lc from sunpy.data.sample import RHESSI_TIMESERIES rhessi = lc.RHESSISummaryLightCurve.create(RHESSI_TIMESERIES) rhessi.peek() Returns ------- fig : `~matplotlib.Figure` A plot figure. """ figure = plt.figure() axes = plt.gca() lc_linecolors = rhessi.hsi_linecolors() for lc_color, (item, frame) in zip(lc_linecolors, self.data.iteritems()): axes.plot_date(self.data.index, frame.values, '-', label=item, lw=2, color=lc_color) axes.set_yscale("log") axes.set_xlabel(datetime.datetime.isoformat(self.data.index[0])[0:10]) axes.set_title('RHESSI Observing Summary Count Rates') axes.set_ylabel('Count Rate s$^{-1}$ detector$^{-1}$') axes.yaxis.grid(True, 'major') axes.xaxis.grid(False, 'major') axes.legend() # @todo: display better tick labels for date range (e.g. 06/01 - 06/05) formatter = matplotlib.dates.DateFormatter('%H:%M') axes.xaxis.set_major_formatter(formatter) axes.fmt_xdata = matplotlib.dates.DateFormatter('%H:%M') figure.autofmt_xdate() figure.show() @classmethod def _get_default_uri(cls): """Retrieves the latest RHESSI data.""" today = datetime.datetime.today() days_back = 3 time_range = TimeRange(today - datetime.timedelta(days=days_back), today - datetime.timedelta(days=days_back - 1)) return cls._get_url_for_date_range(time_range) @staticmethod def _get_url_for_date_range(*args, **kwargs): """Returns a URL to the RHESSI data for the specified date range. Parameters ---------- args : `~sunpy.time.TimeRange`, `datetime.datetime, str Date range should be specified using a TimeRange, or start and end dates at datetime instances or date strings. """ if len(args) == 1 and isinstance(args[0], TimeRange): time_range = args[0] elif len(args) == 2: time_range = TimeRange(parse_time(args[0]), parse_time(args[1])) return rhessi.get_obssum_filename(time_range)[0] @staticmethod def _parse_fits(filepath): """Parses a RHESSI FITS file""" header, d = rhessi.parse_obssumm_file(filepath) data = DataFrame(d['data'], columns=d['labels'], index=d['time']) return header, data sunpy-0.8.3/sunpy/lightcurve/tests/0000755000175000017500000000000013232563477017604 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/lightcurve/tests/__init__.py0000644000175000001440000000000013203275053020655 0ustar nabil00000000000000sunpy-0.8.3/sunpy/lightcurve/tests/test_eve.py0000644000175000017500000000167313231613140021761 0ustar nabilnabil00000000000000""" EVE tests """ from __future__ import absolute_import import pytest #pylint: disable=C0103,R0904,W0201,W0232,E1103 import sunpy import sunpy.lightcurve from sunpy.data.test import get_test_filepath EVE_AVERAGES_CSV = get_test_filepath("EVE_He_II_304_averages.csv") @pytest.mark.remote_data def test_eve(): eve = sunpy.lightcurve.EVELightCurve.create('2013/04/15') assert isinstance(eve, sunpy.lightcurve.EVELightCurve) @pytest.mark.remote_data def test_txt(): """Check support for parsing EVE TXT files """ eve = sunpy.lightcurve.EVELightCurve.create( "http://lasp.colorado.edu/eve/data_access/quicklook/quicklook_data/L0CS/LATEST_EVE_L0CS_DIODES_1m.txt") assert isinstance(eve, sunpy.lightcurve.EVELightCurve) def test_csv_parsing(): """Check support for parsing EVE CSV files""" csv = sunpy.lightcurve.EVELightCurve.create(EVE_AVERAGES_CSV) assert isinstance(csv, sunpy.lightcurve.sources.eve.EVELightCurve) sunpy-0.8.3/sunpy/lightcurve/tests/test_goes.py0000644000175000017500000000736213232563373022155 0ustar nabilnabil00000000000000 """ GOES LightCurve Tests """ from __future__ import absolute_import import socket import pytest import sunpy.lightcurve from sunpy.time import TimeRange class TestGOESLightCurve(object): @pytest.fixture def timerange_a(self): return TimeRange('2008/06/01', '2008/06/02') @pytest.fixture def timerange_b(self): return TimeRange('1995/06/03', '1995/06/04') @pytest.fixture def timerange_c(self): return TimeRange('1980/01/05', '1980/01/06') @pytest.mark.remote_data def test_goes_range(self, timerange_a): """Test creation with two times""" lc1 = sunpy.lightcurve.GOESLightCurve.create(timerange_a.start, timerange_a.end) assert isinstance(lc1, sunpy.lightcurve.GOESLightCurve) @pytest.mark.remote_data def test_goes_timerange(self, timerange_a): """Test creation with a TimeRange""" lc1 = sunpy.lightcurve.GOESLightCurve.create(timerange_a) assert isinstance(lc1, sunpy.lightcurve.GOESLightCurve) @pytest.mark.xfail(raises=socket.timeout) @pytest.mark.remote_data def test_goes_default(self): """Test creation with no input""" lc1 = sunpy.lightcurve.GOESLightCurve.create() assert isinstance(lc1, sunpy.lightcurve.GOESLightCurve) @pytest.mark.remote_data def test_data(self, timerange_a, timerange_b): """Test presence of data""" lc1 = sunpy.lightcurve.GOESLightCurve.create(timerange_b) lc2 = sunpy.lightcurve.GOESLightCurve.create(timerange_a) assert lc1.data.empty == False assert lc2.data.empty == False @pytest.mark.remote_data def test_header(self, timerange_a, timerange_b): """Test presence of GOES satellite number in header""" lc1 = sunpy.lightcurve.GOESLightCurve.create(timerange_b) lc2 = sunpy.lightcurve.GOESLightCurve.create(timerange_a) assert lc1.header['TELESCOP'] == 'GOES 7' assert lc2.header['TELESCOP'] == 'GOES 10' @pytest.mark.remote_data def test_goes_url(self): """Test creation with url""" url = 'http://umbra.nascom.nasa.gov/goes/fits/1995/go07950603.fits' lc1 = sunpy.lightcurve.GOESLightCurve.create(url) assert isinstance(lc1, sunpy.lightcurve.GOESLightCurve) @pytest.mark.remote_data def compare(self, lc1, lc2): try: (lc1.data == lc2.data) except: raise Exception @pytest.mark.remote_data def test_filename(self, timerange_a, timerange_b): """Compare data from two different time ranges to make sure they are not the same""" lc1 = sunpy.lightcurve.GOESLightCurve.create(timerange_a) lc2 = sunpy.lightcurve.GOESLightCurve.create(timerange_b) # If the dataframes are non-idential it raises an error, if they are # identical it returns True with pytest.raises((Exception)): self.compare(lc1, lc2) def test_goes_sat_numbers(self, timerange_a, timerange_b, timerange_c): """Test the ability to return GOES satellite availability""" g = sunpy.lightcurve.GOESLightCurve assert g._get_goes_sat_num(timerange_a.start, timerange_a.end) == [10] assert g._get_goes_sat_num(timerange_b.start, timerange_b.end) == [7] assert g._get_goes_sat_num(timerange_c.start, timerange_c.end) == [2] def test_get_url(self, timerange_a, timerange_b): """Test the getting of urls""" g = sunpy.lightcurve.GOESLightCurve # time ranges create urls with either 4 digit or 2 digit years assert g._get_url_for_date_range(timerange_b) == 'http://umbra.nascom.nasa.gov/goes/fits/1995/go07950603.fits' assert g._get_url_for_date_range(timerange_a) == 'http://umbra.nascom.nasa.gov/goes/fits/2008/go1020080601.fits' sunpy-0.8.3/sunpy/lightcurve/tests/test_lightcurve.py0000644000175000017500000000715413231613140023356 0ustar nabilnabil00000000000000""" Generic LightCurve Tests """ from __future__ import absolute_import # # @TODO: # time deltas instead of datetimes? #pylint: disable=C0103,R0904,W0201,W0232,E1101,E1103 import numpy as np import pandas import pytest import datetime import sunpy import sunpy.lightcurve from sunpy.data.test import get_test_filepath EVE_AVERAGES_CSV = get_test_filepath("EVE_He_II_304_averages.csv") # Generate input test data base = datetime.datetime.today() dates = [base + datetime.timedelta(minutes=x) for x in range(0, 24 * 60)] base_input = np.arange(24 * 60) @pytest.mark.parametrize(("data", "index"), [ (base_input, dates), (base_input, dates), ({"param": base_input}, dates), ({"instr1": base_input, "instr2": base_input, "instr3": base_input}, dates), ([{'instr1': x, 'instr2': x+1, 'instr3': x+2} for x in base_input], dates), (pandas.Series(base_input), dates), ]) def test_input(data, index): """Tests different types of expected input""" lc = sunpy.lightcurve.LightCurve.create(data, index=index) assert isinstance(lc, sunpy.lightcurve.LightCurve) assert isinstance(lc.data, pandas.DataFrame) assert len(lc.data.index) == 24 * 60 assert lc.data.index[0] == base assert lc.data.index[-1] == base + datetime.timedelta(minutes=24 * 60 - 1) @pytest.mark.parametrize(("bad_input"), [ (None), (EVE_AVERAGES_CSV) ]) def test_unimplemented(bad_input): """Tests input that has not been implemented for the generic LC class""" with pytest.raises((TypeError, NotImplementedError)): sunpy.lightcurve.LightCurve.create(bad_input) @pytest.mark.parametrize(("overlap_factor"), [0, 1, 5, 10, 100, 500, len(dates)-1]) def test_concatenate_with_overlap(overlap_factor): # test that lightcurves are being concatenated correctly both with and # without any overlap lc1 = sunpy.lightcurve.LightCurve.create(base_input, index=dates) dt = dates[1] - dates[0] # create a new lc that is shifted in time so there is some overlap lc2 = sunpy.lightcurve.LightCurve.create(base_input, index=[t + (dates[-1] - dates[0]) - (overlap_factor-1) * dt for t in dates]) concat_lc = lc1.concatenate(lc2) assert len(concat_lc.data) == (len(lc1.data) + len(lc2.data) - overlap_factor) # check that the times are correct assert np.all(concat_lc.data.index[0:len(dates)] == lc1.data.index) # check that the original data is still there assert np.all(concat_lc.data.index[-len(lc2.data)+overlap_factor:] == lc2.data.index[overlap_factor:]) # check that the new data is there assert np.all(concat_lc.data[-len(lc2.data)+overlap_factor:] == lc2.data[overlap_factor:]) def test_concatenate_meta(): # check that meta data is also being added. eve = sunpy.lightcurve.EVELightCurve.create(EVE_AVERAGES_CSV) lc1 = sunpy.lightcurve.LightCurve.create(base_input, index=dates) dt = dates[1] - dates[0] # create a new lc that is shifted in time so there is some overlap lc2 = sunpy.lightcurve.LightCurve.create(base_input, index=[t + (dates[-1] - dates[0]) - 1 * dt for t in dates]) concat_lc = lc1.concatenate(lc2) assert len(concat_lc.meta) == len(lc1.meta) + len(lc2.meta) def test_concatenate_fail(): # check that concatenate throws an error when trying to concatenate # two different lightcurve classes lc1 = sunpy.lightcurve.GOESLightCurve.create(base_input, index=dates) eve = sunpy.lightcurve.EVELightCurve.create(EVE_AVERAGES_CSV) with pytest.raises(TypeError): lc1.concatenate(eve) sunpy-0.8.3/sunpy/lightcurve/tests/test_lyra.py0000644000175000017500000000255213231613140022146 0ustar nabilnabil00000000000000""" Lyra Tests """ from __future__ import absolute_import import pytest import sunpy from sunpy.time import parse_time @pytest.mark.remote_data @pytest.mark.parametrize("date,level,start,end", [('2012/06/03', 3, '2012-06-03 00:00:00.047000', '2012-06-03 23:59:00.047000'), ('2012/06/03', 2, '2012-06-03 00:00:00.144000', '2012-06-04 00:00:00.042999')]) def test_lyra_level(date, level, start, end): lyra = sunpy.lightcurve.LYRALightCurve.create(date, level=level) assert isinstance(lyra, sunpy.lightcurve.LYRALightCurve) assert lyra.time_range().start == parse_time(start) assert lyra.time_range().end == parse_time(end) @pytest.mark.remote_data @pytest.mark.parametrize(("url, start, end"), [( 'http://proba2.oma.be/lyra/data/bsd/2012/02/04/lyra_20120204-000000_lev3_std.fits', '2012-02-04 00:00:00.004000', '2012-02-04 23:59:00.004000' ), ('http://proba2.oma.be/lyra/data/bsd/2011/08/10/lyra_20110810-000000_lev3_std.fits', '2011-08-10 00:00:00.020000', '2011-08-10 23:59:00.020000')]) def test_online(url, start, end): lyra = sunpy.lightcurve.LYRALightCurve.create(url) assert isinstance(lyra, sunpy.lightcurve.LYRALightCurve) assert lyra.time_range().start == parse_time(start) assert lyra.time_range().end == parse_time(end) sunpy-0.8.3/sunpy/lightcurve/tests/test_noaa.py0000644000175000017500000000613513231613140022116 0ustar nabilnabil00000000000000""" NOAA LightCurve Tests """ from __future__ import absolute_import import pytest import sunpy.lightcurve from sunpy.time import TimeRange timerange_a = TimeRange('2004/01/01', '2007/01/01') class TestNOAAIndicesLightCurve(object): @pytest.mark.remote_data def test_create(self): lc = sunpy.lightcurve.NOAAIndicesLightCurve.create() assert isinstance(lc, sunpy.lightcurve.NOAAIndicesLightCurve) @pytest.mark.remote_data def test_isempty(self): lc = sunpy.lightcurve.NOAAIndicesLightCurve.create() assert lc.data.empty == False @pytest.mark.remote_data def test_url(self): """Test creation with url""" url = 'ftp://ftp.swpc.noaa.gov/pub/weekly/RecentIndices.txt' lc1 = sunpy.lightcurve.NOAAIndicesLightCurve.create(url) assert isinstance(lc1, sunpy.lightcurve.NOAAIndicesLightCurve) @pytest.mark.remote_data def test_goes_timerange(self): """Test creation with a TimeRange""" lc1 = sunpy.lightcurve.NOAAIndicesLightCurve.create(timerange_a) assert isinstance(lc1, sunpy.lightcurve.NOAAIndicesLightCurve) def test_get_url(self): """Test the getting of url""" g = sunpy.lightcurve.NOAAIndicesLightCurve assert g._get_url_for_date_range(timerange_a) == 'ftp://ftp.swpc.noaa.gov/pub/weekly/RecentIndices.txt' @pytest.mark.remote_data def test_header(self): """Test presence of GOES satellite number in header""" lc1 = sunpy.lightcurve.NOAAIndicesLightCurve.create() assert 'comments' in lc1.header.keys() class TestNOAAPredictIndicesLightCurve(object): @pytest.mark.remote_data def test_create(self): """Test creation with no input""" lc = sunpy.lightcurve.NOAAPredictIndicesLightCurve.create() assert isinstance(lc, sunpy.lightcurve.NOAAPredictIndicesLightCurve) @pytest.mark.remote_data def test_isempty(self): """Test presence of data""" lc = sunpy.lightcurve.NOAAPredictIndicesLightCurve.create() assert lc.data.empty == False @pytest.mark.remote_data def test_goes_timerange(self): """Test creation with a TimeRange""" lc1 = sunpy.lightcurve.NOAAPredictIndicesLightCurve.create(timerange_a) assert isinstance(lc1, sunpy.lightcurve.NOAAPredictIndicesLightCurve) @pytest.mark.remote_data def test_url(self): """Test creation with url""" url = 'http://services.swpc.noaa.gov/text/predicted-sunspot-radio-flux.txt' lc1 = sunpy.lightcurve.NOAAPredictIndicesLightCurve.create(url) assert isinstance(lc1, sunpy.lightcurve.NOAAPredictIndicesLightCurve) def test_get_url(self): """Test the getting of url""" g = sunpy.lightcurve.NOAAPredictIndicesLightCurve assert g._get_url_for_date_range(timerange_a) == 'http://services.swpc.noaa.gov/text/predicted-sunspot-radio-flux.txt' @pytest.mark.remote_data def test_header(self): """Test presence of GOES satellite number in header""" lc1 = sunpy.lightcurve.NOAAPredictIndicesLightCurve.create() assert 'comments' in lc1.header.keys() sunpy-0.8.3/sunpy/lightcurve/tests/test_norh.py0000644000175000017500000000151013231613140022136 0ustar nabilnabil00000000000000""" NoRH Tests """ from __future__ import absolute_import import pytest import sunpy import pandas @pytest.mark.remote_data def test_norh(): norh=sunpy.lightcurve.NoRHLightCurve.create('2012-07-06') assert isinstance(norh, sunpy.lightcurve.NoRHLightCurve) assert norh.meta['OBS-FREQ'] == '17GHZ' assert norh.time_range().start == pandas.Timestamp('2012-07-05 21:59:50.710000') assert norh.time_range().end == pandas.Timestamp('2012-07-06 06:19:49.710000') norh34=sunpy.lightcurve.NoRHLightCurve.create('2012-07-06',wavelength='34') assert isinstance(norh34, sunpy.lightcurve.NoRHLightCurve) assert norh34.meta['OBS-FREQ'] == '34GHZ' assert norh34.time_range().start == pandas.Timestamp('2012-07-05 21:59:50.760000') assert norh34.time_range().end == pandas.Timestamp('2012-07-06 06:19:49.760000') sunpy-0.8.3/sunpy/lightcurve/tests/test_rhessi.py0000644000175000017500000000565013231613140022476 0ustar nabilnabil00000000000000 """ RHESSI LightCurve Tests """ from __future__ import absolute_import import pytest import sunpy.lightcurve from sunpy.time import TimeRange import numpy as np class TestRHESSISummaryLightCurve(object): @pytest.fixture def timerange_a(self): return TimeRange('2008/06/01', '2008/06/02') @pytest.fixture def timerange_b(self): return TimeRange('2004/06/03', '2004/06/04') @pytest.mark.remote_data def test_hsi_range(self, timerange_a): """Test creation with two times""" lc1 = sunpy.lightcurve.RHESSISummaryLightCurve.create(timerange_a.start, timerange_a.end) assert isinstance(lc1, sunpy.lightcurve.RHESSISummaryLightCurve) @pytest.mark.remote_data def test_hsi_timerange(self, timerange_a): """Test creation with a TimeRange""" lc1 = sunpy.lightcurve.RHESSISummaryLightCurve.create(timerange_a) assert isinstance(lc1, sunpy.lightcurve.RHESSISummaryLightCurve) @pytest.mark.remote_data def test_hsi_default(self): """Test creation with no input""" lc1 = sunpy.lightcurve.RHESSISummaryLightCurve.create() assert isinstance(lc1, sunpy.lightcurve.RHESSISummaryLightCurve) @pytest.mark.remote_data def test_data(self, timerange_a, timerange_b): """Test presence of data""" lc1 = sunpy.lightcurve.RHESSISummaryLightCurve.create(timerange_b) lc2 = sunpy.lightcurve.RHESSISummaryLightCurve.create(timerange_a) assert not lc1.data.empty assert not lc2.data.empty @pytest.mark.remote_data def test_header(self, timerange_b): """Test presence of TELESCOP in header""" lc1 = sunpy.lightcurve.RHESSISummaryLightCurve.create(timerange_b) assert lc1.header['TELESCOP'] == 'HESSI' @pytest.mark.remote_data def test_hsi_url(self): """Test creation with url""" url = 'http://soleil.i4ds.ch/hessidata/metadata/catalog/hsi_obssumm_20030302_146.fits' lc1 = sunpy.lightcurve.RHESSISummaryLightCurve.create(url) assert isinstance(lc1, sunpy.lightcurve.RHESSISummaryLightCurve) @pytest.mark.remote_data def test_filename(self, timerange_a, timerange_b): """Compare data from two different time ranges to make sure they are not the same""" lc1 = np.array(sunpy.lightcurve.RHESSISummaryLightCurve.create(timerange_a).data) lc2 = np.array(sunpy.lightcurve.RHESSISummaryLightCurve.create(timerange_b).data) with pytest.raises(AssertionError): np.testing.assert_allclose(lc1, lc2) @pytest.mark.remote_data def test_get_url(self, timerange_a, timerange_b): """Test the getting of urls""" g = sunpy.lightcurve.RHESSISummaryLightCurve assert 'hessidata/metadata/catalog/hsi_obssumm_20080601_068.fits' in g._get_url_for_date_range(timerange_a) assert 'hessidata/metadata/catalog/hsi_obssumm_20040603_110.fits' in g._get_url_for_date_range(timerange_b) sunpy-0.8.3/sunpy/lightcurve/__init__.py0000644000175000017500000000133113231613137020535 0ustar nabilnabil00000000000000""" SunPy's LightCurve module provides a datatype for 1D time series data. The objects also include data downloaders for their specific instruments, they also support instantiation from files such as csv. """ from __future__ import absolute_import __author__ = "Keith Hughitt" __email__ = "keith.hughitt@nasa.gov" from sunpy.lightcurve.lightcurve import LightCurve from sunpy.lightcurve.sources.eve import * from sunpy.lightcurve.sources.goes import * from sunpy.lightcurve.sources.noaa import * from sunpy.lightcurve.sources.lyra import * from sunpy.lightcurve.sources.logical import * from sunpy.lightcurve.sources.norh import * from sunpy.lightcurve.sources.rhessi import * from sunpy.lightcurve.sources.fermi_gbm import * sunpy-0.8.3/sunpy/lightcurve/lightcurve.py0000644000175000017500000003545713232563373021201 0ustar nabilnabil00000000000000""" LightCurve is a generic LightCurve class from which all other LightCurve classes inherit from. """ from __future__ import absolute_import import os.path import shutil import warnings from datetime import datetime from collections import OrderedDict import numpy as np import matplotlib.pyplot as plt import pandas from sunpy import config from sunpy.time import is_time, TimeRange, parse_time from sunpy.util.cond_dispatch import ConditionalDispatch, run_cls from sunpy.util.config import get_and_create_download_dir from sunpy.extern.six.moves import urllib from sunpy.extern import six # pylint: disable=E1101,E1121,W0404,W0612,W0613 __authors__ = ["Keith Hughitt"] __email__ = "keith.hughitt@nasa.gov" __all__ = ['LightCurve'] class LightCurve(object): """ LightCurve(filepath) A generic light curve object. Attributes ---------- meta : `str` or `dict` The comment string or header associated with the data. data : `~pandas.DataFrame` An pandas DataFrame prepresenting one or more fields as a function of time. Examples -------- >>> from sunpy.lightcurve import LightCurve >>> import datetime >>> import numpy as np >>> base = datetime.datetime.today() >>> dates = [base - datetime.timedelta(minutes=x) for x in range(0, 24 * 60)] >>> intensity = np.sin(np.arange(0, 12 * np.pi, step=(12 * np.pi) / 24 * 60)) >>> light_curve = LightCurve.create({"param1": intensity}, index=dates) >>> light_curve.peek() # doctest: +SKIP References ---------- * `Pandas Documentation `_ """ _cond_dispatch = ConditionalDispatch() create = classmethod(_cond_dispatch.wrapper()) def __init__(self, data, meta=None): self.data = pandas.DataFrame(data) if meta == '' or meta is None: self.meta = OrderedDict() self.meta.update({'name': None}) else: self.meta = OrderedDict(meta) @property def header(self): """ Return the lightcurves metadata .. deprecated:: 0.4.0 Use .meta instead """ warnings.warn("""lightcurve.header has been renamed to lightcurve.meta for compatibility with map, please use meta instead""", Warning) return self.meta @classmethod def from_time(cls, time, **kwargs): """ Called by Conditional Dispatch object when valid time is passed as input to create method. """ date = parse_time(time) url = cls._get_url_for_date(date, **kwargs) filepath = cls._download( url, kwargs, err="Unable to download data for specified date" ) return cls.from_file(filepath) @classmethod def from_range(cls, start, end, **kwargs): """Called by Conditional Dispatch object when start and end time are passed as input to create method. :param start: :param end: :param kwargs: :return: """ url = cls._get_url_for_date_range(parse_time(start), parse_time(end), **kwargs) filepath = cls._download( url, kwargs, err="Unable to download data for specified date range" ) result = cls.from_file(filepath) result.data = result.data.truncate(start, end) return result @classmethod def from_timerange(cls, timerange, **kwargs): """ Called by Conditional Dispatch object when time range is passed as input to create method. """ url = cls._get_url_for_date_range(timerange, **kwargs) filepath = cls._download( url, kwargs, err = "Unable to download data for specified date range" ) result = cls.from_file(filepath) result.data = result.data.truncate(timerange.start, timerange.end) return result @classmethod def from_file(cls, filename): """Used to return Light Curve object by reading the given filename. Parameters ---------- filename: `str` Path of the file to be read. Returns ------- Lightcurve object. """ filename = os.path.expanduser(filename) meta, data = cls._parse_filepath(filename) if data.empty: raise ValueError("No data found!") else: return cls(data, meta) @classmethod def from_url(cls, url, **kwargs): """ Called by Conditional Dispatch object to create Light Curve object when given a url. Downloads a file from the given url, attemps to read it and returns a Light Curve object. Parameters ---------- url : str A url given as a string. """ try: filepath = cls._download(url, kwargs) except (urllib.error.HTTPError, urllib.error.URLError, ValueError): err = "Unable to read location {!s}.".format(url) raise ValueError(err) return cls.from_file(filepath) @classmethod def from_data(cls, data, index=None, meta=None): """ Called by Conditional Dispatch object to create Light Curve object when corresponding data is passed to create method. Parameters ---------- data : `~numpy.ndarray` The data array index : `~datetime.datetime` array The time values """ return cls( pandas.DataFrame(data, index=index), meta ) @classmethod def from_yesterday(cls): """ Called by Conditional Dispatch object if no input if given """ return cls.from_url(cls._get_default_uri()) @classmethod def from_dataframe(cls, dataframe, meta=None): """ Called by Conditional Dispatch object to create Light Curve object when Pandas DataFrame is passed to create method. Parameters ---------- dataframe : `~pandas.DataFrame` The data. meta : `str` or `dict` The metadata. """ return cls(dataframe, meta) def plot(self, axes=None, **plot_args): """Plot a plot of the light curve Parameters ---------- axes : `~matplotlib.axes.Axes` or None If provided the image will be plotted on the given axes. Otherwise the current axes will be used. **plot_args : `dict` Any additional plot arguments that should be used when plotting. Returns ------- axes : `~matplotlib.axes.Axes` The plot axes. """ # Get current axes if axes is None: axes = plt.gca() axes = self.data.plot(ax=axes, **plot_args) return axes def peek(self, **kwargs): """Displays the light curve in a new figure. Parameters ---------- **kwargs : `dict` Any additional plot arguments that should be used when plotting. Returns ------- fig : `~matplotlib.Figure` A plot figure. """ figure = plt.figure() self.plot(**kwargs) figure.show() return figure @staticmethod def _download(uri, kwargs, err='Unable to download data at specified URL'): """Attempts to download data at the specified URI. Parameters ---------- **kwargs : uri A url """ _filename = os.path.basename(uri).split("?")[0] # user specifies a download directory if "directory" in kwargs: download_dir = os.path.expanduser(kwargs["directory"]) else: download_dir = get_and_create_download_dir() # overwrite the existing file if the keyword is present if "overwrite" in kwargs: overwrite = kwargs["overwrite"] else: overwrite = False # If the file is not already there, download it filepath = os.path.join(download_dir, _filename) if not(os.path.isfile(filepath)) or (overwrite and os.path.isfile(filepath)): try: response = urllib.request.urlopen(uri) except (urllib.error.HTTPError, urllib.error.URLError): raise urllib.error.URLError(err) with open(filepath, 'wb') as fp: shutil.copyfileobj(response, fp) else: warnings.warn("Using existing file rather than downloading, use " "overwrite=True to override.", RuntimeWarning) return filepath @classmethod def _get_default_uri(cls): """Default data to load when none is specified.""" msg = "No default action set for {}" raise NotImplementedError(msg.format(cls.__name__)) @classmethod def _get_url_for_date(cls, date, **kwargs): """Returns a URL to the data for the specified date.""" msg = "Date-based downloads not supported for for {}" raise NotImplementedError(msg.format(cls.__name__)) @classmethod def _get_url_for_date_range(cls, *args, **kwargs): """Returns a URL to the data for the specified date range.""" msg = "Date-range based downloads not supported for for {}" raise NotImplementedError(msg.format(cls.__name__)) @staticmethod def _parse_csv(filepath): """Place holder method to parse CSV files.""" msg = "Generic CSV parsing not yet implemented for LightCurve" raise NotImplementedError(msg) @staticmethod def _parse_fits(filepath): """Place holder method to parse FITS files.""" msg = "Generic FITS parsing not yet implemented for LightCurve" raise NotImplementedError(msg) @classmethod def _parse_filepath(cls, filepath): """Check the file extension to see how to parse the file.""" filename, extension = os.path.splitext(filepath) if extension.lower() in (".csv", ".txt"): return cls._parse_csv(filepath) else: return cls._parse_fits(filepath) def truncate(self, a, b=None): """Returns a truncated version of the lightcurve object. Parameters ---------- a : `sunpy.time.TimeRange` A time range to truncate to. Returns ------- newlc : `~sunpy.lightcurve.LightCurve` A new lightcurve with only the selected times. """ if isinstance(a, TimeRange): time_range = a else: time_range = TimeRange(a, b) truncated = self.data.truncate(time_range.start, time_range.end) return self.__class__.create(truncated, self.meta.copy()) def extract(self, column_name): """Returns a new lightcurve with the chosen column. Parameters ---------- column_name : `str` A valid column name Returns ------- newlc : `~sunpy.lightcurve.LightCurve` A new lightcurve with only the selected column. """ # TODO allow the extract function to pick more than one column if isinstance(self, pandas.Series): return self else: return LightCurve(self.data[column_name], self.meta.copy()) def time_range(self): """Returns the start and end times of the LightCurve as a `~sunpy.time.TimeRange` object""" return TimeRange(self.data.index[0], self.data.index[-1]) def concatenate(self, otherlightcurve): """Concatenate another light curve. This function will check and remove any duplicate times. It will keep the column values from the original lightcurve to which the new lightcurve is being added. Parameters ---------- otherlightcurve : `~sunpy.lightcurve.LightCurve` Another lightcurve of the same type. Returns ------- newlc : `~sunpy.lightcurve.LightCurve` A new lightcurve. """ if not isinstance(otherlightcurve, self.__class__): raise TypeError("Lightcurve classes must match.") meta = OrderedDict() meta.update({str(self.data.index[0]): self.meta.copy()}) meta.update({str(otherlightcurve.data.index[0]): otherlightcurve.meta.copy()}) data = self.data.copy().append(otherlightcurve.data) data['index'] = data.index # default behavior of drop_duplicates is keep the first column. data = data.drop_duplicates(subset='index') data.set_index = data['index'] data.drop('index', axis=1, inplace=True) return self.__class__.create(data, meta) # What's happening here is the following: The ConditionalDispatch is just an # unbound callable object, that is, it does not know which class it is attached # to. What we do against that is return a wrapper and make that a classmethod - # thus we get the class as whose member it is called as as the first argument, # this is why in the type signature we always have type as the first type. # We then use run_cls, which just returns a wrapper that interprets the first # argument as the class the function should be called of. So, # x = run_cls("foo") returns something that turns x(cls, 1) into cls.foo(1). # Because this has *args, **kwargs as its signature we need to disable the # check of ConditionalDispatch that makes sure the function and the # conditional need to have the same signature - but they still do have to. LightCurve._cond_dispatch.add( run_cls("from_time"), lambda cls, time, **kwargs: is_time(time), # type is here because the class parameter is a class, # i.e. an instance of type (which is the base meta-class). [type, (six.string_types, datetime, tuple)], False ) LightCurve._cond_dispatch.add( run_cls("from_range"), lambda cls, time1, time2, **kwargs: is_time(time1) and is_time(time2), [type, (six.string_types, datetime, tuple), (six.string_types, datetime, tuple)], False ) LightCurve._cond_dispatch.add( run_cls("from_timerange"), lambda cls, timerange, **kwargs: True, [type, TimeRange], False ) LightCurve._cond_dispatch.add( run_cls("from_file"), lambda cls, filename: os.path.exists(os.path.expanduser(filename)), [type, six.string_types], False ) LightCurve._cond_dispatch.add( run_cls("from_url"), lambda cls, url, **kwargs: True, [type, six.string_types], False ) LightCurve._cond_dispatch.add( run_cls("from_data"), lambda cls, data, index=None, meta=None: True, [type, (list, dict, np.ndarray, pandas.Series), object, object], False ) LightCurve._cond_dispatch.add( run_cls("from_dataframe"), lambda cls, dataframe, meta=None: True, [type, pandas.DataFrame, object], False ) LightCurve._cond_dispatch.add( run_cls("from_yesterday"), lambda cls: True, [type], False ) sunpy-0.8.3/sunpy/lightcurve/table_to_dataframe.py0000644000175000017500000000273313231613140022574 0ustar nabilnabil00000000000000""" Converting Astropy Table Object into Pandas Dataframe """ # This module was developed with funding from # Google Summer of Code 2015 # author - Ankit Kumar from pandas import DataFrame from astropy.table import Table, Column from astropy.utils import OrderedDict from astropy.table.column import MaskedColumn def _to_pandas(astropyTable): """ Return a :class:`pandas.DataFrame` instance Returns ------- dataframe : :class:`pandas.DataFrame` A pandas :class:`pandas.DataFrame` instance Raises ------ ImportError If pandas is not installed ValueError If the Table contains mixin or multi-dimensional columns """ from pandas import DataFrame if astropyTable.has_mixin_columns: raise ValueError("Cannot convert a table with mixin columns to a pandas DataFrame") if any(getattr(col, 'ndim', 1) > 1 for col in astropyTable.columns.values()): raise ValueError("Cannot convert a table with multi-dimensional columns to a pandas DataFrame") out = OrderedDict() for name, column in astropyTable.columns.items(): if isinstance(column, MaskedColumn): if column.dtype.kind in ['i', 'u']: out[name] = column.astype(float).filled(np.nan) elif column.dtype.kind in ['f', 'c']: out[name] = column.filled(np.nan) else: out[name] = column.astype(np.object).filled(np.nan) else: out[name] = column if out[name].dtype.byteorder not in ('=', '|'): out[name] = out[name].byteswap().newbyteorder() return DataFrame(out) sunpy-0.8.3/sunpy/map/0000755000175000017500000000000013232563477015043 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/map/sources/0000755000175000017500000000000013232563477016526 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/map/sources/tests/0000755000175000017500000000000013232563477017670 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/map/sources/tests/test_aia_source.py0000644000175000001440000000303313203275053022364 0ustar nabil00000000000000"""Test cases for SDO Map subclasses. This particular test file pertains to AIAMap. @Author: Pritish C. (VaticanCameos) """ import os import glob import pytest from sunpy.map.sources.sdo import AIAMap from sunpy.map import Map import sunpy.data.test path = sunpy.data.test.rootdir jp2path = glob.glob(os.path.join(path, "2013_06_24__17_31_30_84__SDO_AIA_AIA_193.jp2")) aiaimg = glob.glob(os.path.join(path, "aia_171_level1.fits")) from sunpy.tests.helpers import SKIP_GLYMUR if SKIP_GLYMUR: params = [aiaimg] else: params = [aiaimg, jp2path] # The fixture is parameterized with aiaimg and jp2path. @pytest.fixture(scope="module", params=params) def createAIAMap(request): """Creates an AIAMap as given in documentation examples, through AIA_171_IMAGE or through the use of the JP2 file.""" aiaobj = Map(request.param) return aiaobj # AIA Tests def test_AIAMap(createAIAMap): """Tests the creation of AIAMap from AIA_171_IMAGE or through use of the JP2 file.""" assert isinstance(createAIAMap, AIAMap) def test_is_datasource_for(createAIAMap): """Tests the is_datasource_for method of AIAMap.""" assert createAIAMap.is_datasource_for(createAIAMap.data, createAIAMap.meta) def test_observatory(createAIAMap): """Tests the observatory property of the AIAMap object.""" assert createAIAMap.observatory == "SDO" def test_measurement(createAIAMap): """Tests the measurement property of the AIAMap object.""" assert createAIAMap.measurement.value in [171, 193] # aiaimg has 171, jp2path has 193. sunpy-0.8.3/sunpy/map/sources/tests/test_cor_source.py0000644000175000017500000000172213231613140023424 0ustar nabilnabil00000000000000"""Test cases for STEREO Map subclasses. This particular test file pertains to CORMap. @Author: Pritish C. (VaticanCameos) """ import os import glob from sunpy.map.sources.stereo import CORMap from sunpy.map import Map import sunpy.data.test path = sunpy.data.test.rootdir fitspath = glob.glob(os.path.join(path, "cor1_20090615_000500_s4c1A.fts")) cor = Map(fitspath) # COR Tests def test_fitstoEIT(): """Tests the creation of CORMap using FITS.""" assert isinstance(cor, CORMap) def test_is_datasource_for(): """Test the is_datasource_for method of CORMap. Note that header data to be provided as an argument can be a MetaDict object.""" assert cor.is_datasource_for(cor.data, cor.meta) def test_measurement(): """Tests the measurement property of the CORMap object.""" assert cor.measurement == "white-light" def test_observatory(): """Tests the observatory property of the CORMap object.""" assert cor.observatory == "STEREO A" sunpy-0.8.3/sunpy/map/sources/tests/test_eit_source.py0000644000175000017500000000230013231613140023413 0ustar nabilnabil00000000000000"""Test cases for SOHO Map subclasses. This particular test file pertains to EITMap. @Author: Pritish C. (VaticanCameos) """ import os import glob import numpy as np from matplotlib import colors import pytest from sunpy.map.sources.soho import EITMap from sunpy.map import Map import sunpy.data.test path = sunpy.data.test.rootdir fitslist = glob.glob(os.path.join(path, "EIT", "*")) @pytest.fixture(scope="module", params=fitslist) def createEIT(request): """Creates an EITMap from a FITS file.""" return Map(request.param) # EIT Tests def test_fitstoEIT(createEIT): """Tests the creation of EITMap using FITS.""" assert isinstance(createEIT, EITMap) def test_is_datasource_for(createEIT): """Test the is_datasource_for method of EITMap. Note that header data to be provided as an argument can be a MetaDict object.""" assert createEIT.is_datasource_for(createEIT.data, createEIT.meta) def test_observatory(createEIT): """Tests the observatory property of the EITMap object.""" assert createEIT.observatory == "SOHO" def test_measurement(createEIT): """Tests the measurement property of the EITMap object.""" assert createEIT.measurement.value in [195, 171]sunpy-0.8.3/sunpy/map/sources/tests/test_euvi_source.py0000644000175000017500000000173713231613140023617 0ustar nabilnabil00000000000000"""Test cases for STEREO Map subclasses. This particular test file pertains to EUVIMap. @Author: Pritish C. (VaticanCameos) """ import os import glob from sunpy.map.sources.stereo import EUVIMap from sunpy.map import Map import sunpy.data.test path = sunpy.data.test.rootdir fitspath = glob.glob(os.path.join(path, "euvi_20090615_000900_n4euA_s.fts")) euvi = Map(fitspath) # EUVI Tests def test_fitstoEIT(): """Tests the creation of EUVIMap using FITS.""" assert isinstance(euvi, EUVIMap) def test_is_datasource_for(): """Test the is_datasource_for method of EUVIMap. Note that header data to be provided as an argument can be a MetaDict object.""" assert euvi.is_datasource_for(euvi.data, euvi.meta) def test_measurement(): """Tests the measurement property of the EUVIMap object.""" assert euvi.measurement.value == 171 def test_observatory(): """Tests the observatory property of the EUVIMap object.""" assert euvi.observatory == "STEREO A" sunpy-0.8.3/sunpy/map/sources/tests/test_hi_source.py0000644000175000017500000000162613231613140023244 0ustar nabilnabil00000000000000"""Test cases for STEREO Map subclasses. This particular test file pertains to HIMap. """ import os import glob from sunpy.map.sources.stereo import HIMap from sunpy.map import Map import sunpy.data.test path = sunpy.data.test.rootdir fitspath = glob.glob(os.path.join(path,"hi_20110910_114721_s7h2A.fts")) hi = Map(fitspath) def test_fitstoHI(): """Tests the creation of HIMap to fits""" assert isinstance(hi, HIMap) def test_is_datasource_for(): """Test the is_data_source_for method of HIMap. Note that header data to be provided as an argument can be a MetaDict object.""" assert hi.is_datasource_for(hi.data, hi.meta) def test_measurement(): """Tests the measurement property of the HIMap object.""" assert hi.measurement == "white-light" def test_observatory(): """Tests the observatory property of the HIMap object.""" assert hi.observatory == "STEREO A" sunpy-0.8.3/sunpy/map/sources/tests/test_hmi_source.py0000644000175000017500000000200613231613140023412 0ustar nabilnabil00000000000000"""Test cases for SDO Map subclasses. This particular test file pertains to HMIMap. @Author: Pritish C. (VaticanCameos) """ import os import glob from sunpy.map.sources.sdo import HMIMap from sunpy.map import Map import sunpy.data.test #from sunpy.net import HelioviewerClient path = sunpy.data.test.rootdir fitspath = glob.glob(os.path.join(path, "resampled_hmi.fits")) hmi = Map(fitspath) # HMI Tests def test_fitstoHMI(): """Tests the creation of HMIMap using FITS.""" assert isinstance(hmi, HMIMap) def test_is_datasource_for(): """Test the is_datasource_for method of HMIMap. Note that header data to be provided as an argument can be a MetaDict object, which in this case is hmi.meta.""" assert hmi.is_datasource_for(hmi.data, hmi.meta) def test_observatory(): """Tests the observatory property of the HMIMap object.""" assert hmi.observatory == "SDO" def test_measurement(): """Tests the measurement property of the HMIMap object.""" assert hmi.measurement == "continuum" sunpy-0.8.3/sunpy/map/sources/tests/test_iris_source.py0000644000175000017500000000206613231613140023611 0ustar nabilnabil00000000000000"""Test cases for SJIMap. This particular test file pertains to SJIMap. @Author: Pritish C. (VaticanCameos) """ import os import glob from sunpy.map import Map from sunpy.map.sources.iris import SJIMap from sunpy.map.mapbase import GenericMap import sunpy.data.test path = sunpy.data.test.rootdir fitspath = glob.glob(os.path.join(path, "iris_l2_20130801_074720_4040000014_SJI_1400_t000.fits")) irislist = Map(fitspath) # IRIS Tests def test_fitstoIRIS(): """Tests the creation of SJIMap using FITS.""" for amap in irislist: assert (isinstance(amap, (SJIMap, GenericMap))) def test_is_datasource_for(): """Test the is_datasource_for method of SJIMap. Note that header data to be provided as an argument can be a MetaDict object.""" for amap in irislist: if isinstance(amap, SJIMap): assert amap.is_datasource_for(amap.data, amap.meta) def test_observatory(): """Tests the observatory property of SJIMap.""" for amap in irislist: if isinstance(amap, SJIMap): assert amap.observatory == "IRIS" sunpy-0.8.3/sunpy/map/sources/tests/test_lasco_source.py0000644000175000017500000000174113231613140023743 0ustar nabilnabil00000000000000"""Test cases for SOHO Map subclasses. This particular test file pertains to LASCOMap. @Author: Pritish C. (VaticanCameos) """ import os import glob from sunpy.map.sources.soho import LASCOMap from sunpy.map import Map import sunpy.data.test path = sunpy.data.test.rootdir fitspath = glob.glob(os.path.join(path, "lasco_c2_25299383_s.fts")) lasco = Map(fitspath) # LASCO Tests def test_fitstoEIT(): """Tests the creation of LASCOMap using FITS.""" assert isinstance(lasco, LASCOMap) def test_is_datasource_for(): """Test the is_datasource_for method of LASCOMap. Note that header data to be provided as an argument can be a MetaDict object.""" assert lasco.is_datasource_for(lasco.data, lasco.meta) def test_measurement(): """Tests the measurement property of the LASCOMap object.""" assert lasco.measurement == "white-light" def test_observatory(): """Tests the observatory property of the LASCOMap object.""" assert lasco.observatory == "SOHO" sunpy-0.8.3/sunpy/map/sources/tests/test_mdi_source.py0000644000175000017500000000171313231613140023412 0ustar nabilnabil00000000000000"""Test cases for SOHO Map subclasses. This particular test file pertains to MDIMap. @Author: Pritish C. (VaticanCameos) """ import os import glob from sunpy.map.sources.soho import MDIMap from sunpy.map import Map import sunpy.data.test path = sunpy.data.test.rootdir fitspath = glob.glob(os.path.join(path, "mdi_fd_Ic_6h_01d.5871.0000_s.fits")) mdi = Map(fitspath) # MDI Tests def test_fitstoMDI(): """Tests the creation of MDIMap using FITS.""" assert isinstance(mdi, MDIMap) def test_is_datasource_for(): """Test the is_datasource_for method of MDIMap. Note that header data to be provided as an argument can be a MetaDict object.""" assert mdi.is_datasource_for(mdi.data, mdi.meta) def test_observatory(): """Tests the observatory property of the MDIMap object.""" assert mdi.observatory == "SOHO" def test_measurement(): """Tests the measurement property of the MDIMap object.""" assert mdi.measurement == "continuum" sunpy-0.8.3/sunpy/map/sources/tests/test_sot_source.py0000644000175000017500000000341613231613140023450 0ustar nabilnabil00000000000000"""Test cases for HINODE Map subclasses. This particular test file pertains to SOTMap. @Author: Pritish C. (VaticanCameos) """ import os import glob import astropy.units as u from sunpy.map.sources.hinode import SOTMap from sunpy.map import Map import sunpy.data.test path = sunpy.data.test.rootdir fitspath = glob.glob(os.path.join(path, "HinodeSOT.fits")) sot = Map(fitspath) # SOT Tests def test_fitstoSOT(): """Tests the creation of SOTMap using FITS.""" assert isinstance(sot, SOTMap) def test_is_datasource_for(): """Test the is_datasource_for method of SOTMap. Note that header data to be provided as an argument can be a MetaDict object.""" assert sot.is_datasource_for(sot.data, sot.meta) def test_observatory(): """Tests the observatory property of the SOTMap object.""" assert sot.observatory == "Hinode" def test_measurement(): """Tests the measurement property of the SOTMap object.""" assert sot.measurement == 0 * u.one def test_instruments(): """Tests the Instruments object of SOTMap.""" assert (sot.Instruments == ['SOT/WB', 'SOT/NB','SOT/SP','SOT/CT']) def test_waves(): """Tests the Waves object of SOTMap.""" assert (sot.Waves == ['6302A', 'BFI no move', 'CN bandhead 3883', 'Ca II H line', 'G band 4305', 'NFI no move', 'TF Fe I 6302', 'TF Mg I 5172', 'TF Na I 5896', 'blue cont 4504', 'green cont 5550', 'red cont 6684']) def test_obstype(): """Tests the Observation_Type object of SOTMap.""" assert (sot.Observation_Type == ['FG (simple)', 'FG focus scan', 'FG shuttered I and V', 'FG shutterless I and V', 'FG shutterless I and V with 0.2s intervals', 'FG shutterless Stokes', 'SP IQUV 4D array']) sunpy-0.8.3/sunpy/map/sources/tests/test_source_type.py0000644000175000017500000000215313231613140023621 0ustar nabilnabil00000000000000""" Test cases distinguishing the source types. """ import os import glob from astropy.visualization import LinearStretch from sunpy.map.sources.source_type import from_helioviewer_project, source_stretch from sunpy.map import Map import sunpy.data.test from sunpy.tests.helpers import skip_glymur path = sunpy.data.test.rootdir fitspath = glob.glob(os.path.join(path, "aia_171_level1.fits")) aia = Map(fitspath) jp2path = glob.glob(os.path.join(path, "2013_06_24__17_31_30_84__SDO_AIA_AIA_193.jp2")) @skip_glymur def test_from_helioviewer_project(): """Tests if we are able to determine if a file is from the Helioviewer Project or not.""" hvjp2 = Map(jp2path) assert not from_helioviewer_project(aia.meta) assert from_helioviewer_project(hvjp2.meta) @skip_glymur def test_source_stretch(): """ Tests that the correct stretch function is returned. """ hvjp2 = Map(jp2path) aia_fits_stretch = aia.plot_settings['norm'].stretch assert source_stretch(aia.meta, aia_fits_stretch) is aia_fits_stretch assert isinstance(source_stretch(hvjp2.meta, aia_fits_stretch), LinearStretch) sunpy-0.8.3/sunpy/map/sources/tests/test_swap_source.py0000644000175000017500000000224513231613140023614 0ustar nabilnabil00000000000000"""Test cases for PROBA2 Map subclasses. This particular test file pertains to SWAPMap. @Author: Pritish C. (VaticanCameos) """ import os import glob import pytest from sunpy.map.sources.proba2 import SWAPMap from sunpy.map import Map import sunpy.data.test path = sunpy.data.test.rootdir fitslist = glob.glob(os.path.join(path, "SWAP", "*")) @pytest.fixture(scope="module", params=fitslist) def createSWAP(request): """Creates an SWAPMap from a FITS file.""" return Map(request.param) # SWAP Tests def test_fitstoSWAP(createSWAP): """Tests the creation of SWAPMap using FITS.""" assert isinstance(createSWAP, SWAPMap) def test_is_datasource_for(createSWAP): """Test the is_datasource_for method of SWAPMap. Note that header data to be provided as an argument can be a MetaDict object.""" assert createSWAP.is_datasource_for(createSWAP.data, createSWAP.meta) def test_observatory(createSWAP): """Tests the observatory property of the SWAPMap object.""" assert createSWAP.observatory == "PROBA2" def test_measurement(createSWAP): """Tests the measurement property of the SWAPMap object.""" assert createSWAP.measurement.value == 174 sunpy-0.8.3/sunpy/map/sources/tests/test_xrt_source.py0000644000175000017500000000301513231613140023453 0ustar nabilnabil00000000000000"""Test cases for HINODE Map subclasses. This particular test file pertains to XRTMap. @Author: Pritish C. (VaticanCameos) """ import os import glob import numpy as np from matplotlib import colors import astropy.units as u from sunpy.map.sources.hinode import XRTMap from sunpy.map import Map import sunpy.data.test path = sunpy.data.test.rootdir fitspath = glob.glob(os.path.join(path, "HinodeXRT.fits")) xrt = Map(fitspath) # XRT Tests def test_fitstoXRT(): """Tests the creation of XRTMap using FITS.""" assert isinstance(xrt, XRTMap) def test_is_datasource_for(): """Test the is_datasource_for method of XRTMap. Note that header data to be provided as an argument can be a MetaDict object.""" assert xrt.is_datasource_for(xrt.data, xrt.meta) def test_observatory(): """Tests the observatory property of the XRTMap object.""" assert xrt.observatory == "Hinode" def test_measurement(): """Tests the measurement property of the XRTMap object.""" measurement = xrt.filter_wheel1_measurements[5].replace("_", " ") measurement += '-' + xrt.filter_wheel2_measurements[1].replace("_", " ") assert xrt.measurement == measurement def test_wheel_measurements(): """Tests the filter_wheel_measurements objects present in the XRTMap object.""" assert (xrt.filter_wheel1_measurements == ["Al_med", "Al_poly", "Be_med", "Be_thin", "C_poly", "Open"]) assert (xrt.filter_wheel2_measurements == ["Open", "Al_mesh", "Al_thick", "Be_thick", "Gband", "Ti_poly"]) sunpy-0.8.3/sunpy/map/sources/__init__.py0000644000175000017500000000162313231613140020617 0ustar nabilnabil00000000000000"""Datasource-specific classes This is where datasource specific logic is implemented. Each mission should have its own file with one or more classes defined. Typically, these classes will be subclasses of the :mod`sunpy.map.Map` class. """ from __future__ import absolute_import, division, print_function __all__ = ['XRTMap', 'SOTMap', 'SWAPMap', 'RHESSIMap', 'AIAMap', 'HMIMap', 'EITMap', 'LASCOMap', 'MDIMap', 'EUVIMap', 'CORMap', 'HIMap', 'SXTMap', 'SJIMap', 'TRACEMap', 'source_stretch'] from .. map_factory import Map from .hinode import XRTMap, SOTMap from .proba2 import SWAPMap from .rhessi import RHESSIMap from .sdo import AIAMap, HMIMap from .soho import EITMap, LASCOMap, MDIMap from .stereo import EUVIMap, CORMap, HIMap from .yohkoh import SXTMap from .iris import SJIMap from .trace import TRACEMap from .source_type import source_stretch, from_helioviewer_project sunpy-0.8.3/sunpy/map/sources/hinode.py0000644000175000017500000001317013232563373020343 0ustar nabilnabil00000000000000"""Hinode XRT and SOT Map subclass definitions""" from __future__ import absolute_import, print_function, division #pylint: disable=W0221,W0222,E1101,E1121 __author__ = ["Jack Ireland, Jose Ivan Campos-Rozo, David Perez-Suarez"] __email__ = "jack.ireland@nasa.gov" import numpy as np from sunpy.map import GenericMap from sunpy.cm import cm __all__ = ['XRTMap', 'SOTMap'] # the following values comes from xrt_prep.pro # search for saturation in # http://darts.jaxa.jp/pub/ssw/hinode/xrt/idl/util/xrt_prep.pro # SATURATION_LIMIT = 2500 def _lower_list(l): return [item.lower() for item in l] class XRTMap(GenericMap): """Hinode XRT map definition. The X-Ray Telescope (XRT) is a high resolution grazing incidence telescope, which is a succsessor to Yohkoh. It provides 2-arcsecond resolution images of the highest temperature solar coronal material, from 1,000,000 to 10,000,000 Kelvin. Hinode was launched on 22 September 2006 into a sun-synchronous orbit. References ---------- * `Hinode Mission Page `_ * `XRT Instrument Page `_ * `Fits header reference `_ * `Hinode User Guide `_ * `XRT Analysis Guide `_ * `Coronal Temperature Diagnostic Capability of the Hinode/X-Ray Telescope Based on Self-Consistent Calibration `_ """ filter_wheel1_measurements = ["Al_med", "Al_poly", "Be_med", "Be_thin", "C_poly", "Open"] filter_wheel2_measurements = ["Open", "Al_mesh", "Al_thick", "Be_thick", "Gband", "Ti_poly"] def __init__(self, data, header, **kwargs): GenericMap.__init__(self, data, header, **kwargs) # converting data array to masked array # self.data = ma.masked_where(self.data > SATURATION_LIMIT, self.data) fw1 = header.get('EC_FW1_') if fw1.lower() not in _lower_list(self.filter_wheel1_measurements): raise ValueError('Unpexpected filter wheel 1 in header.') fw1 = fw1.replace("_", " ") fw2 = header.get('EC_FW2_') if fw2.lower() not in _lower_list(self.filter_wheel2_measurements): raise ValueError('Unpexpected filter wheel 2 in header.') fw2 = fw2.replace("_", " ") self.meta['detector'] = "XRT" # self.meta['instrume'] = "XRT" self.meta['telescop'] = "Hinode" self.meta['wavelnth'] = np.nan self.meta['waveunit'] = 'keV' self.plot_settings['cmap'] = cm.get_cmap(name='hinodexrt') @property def measurement(self): fw1 = self.meta.get('EC_FW1_').replace("_", " ") fw2 = self.meta.get('EC_FW2_').replace("_", " ") return "{0}-{1}".format(fw1, fw2) @classmethod def is_datasource_for(cls, data, header, **kwargs): """Determines if header corresponds to an XRT image""" return header.get('instrume') == 'XRT' class SOTMap(GenericMap): """Hinode SOT Image Map definition. The Hinode Solar Optical Telescope (SOT) consists of a 50 cm diffraction-limited Gregorian telescope. It is optimized for accurate measurement of the vector magnetic field in the photosphere and dynamics of both the photosphere and chromosphere associated with the magnetic fields. Hinode was launched on 22 September 2006 into a sun-synchronous orbit. References ---------- * `Hinode Mission Page `_ * `Hinode SOT Instrument Page `_ * `Hinode SOT Instrument Paper `_ * `Data Analsis Guide `_ """ # TODO: get a link for the SOT FITS headers # Add in some information about the the possible instrument, observation # type, observable ion and wavelength Instruments = ['SOT/WB', 'SOT/NB', 'SOT/SP', 'SOT/CT'] Waves = ['6302A', 'BFI no move', 'CN bandhead 3883', 'Ca II H line', 'G band 4305', 'NFI no move', 'TF Fe I 6302', 'TF Mg I 5172', 'TF Na I 5896', 'blue cont 4504', 'green cont 5550', 'red cont 6684'] Observation_Type = ['FG (simple)', 'FG focus scan', 'FG shuttered I and V', 'FG shutterless I and V', 'FG shutterless I and V with 0.2s intervals', 'FG shutterless Stokes', 'SP IQUV 4D array'] def __init__(self, data, header, **kwargs): GenericMap.__init__(self, data, header, **kwargs) self.meta['detector'] = "SOT" self.meta['telescop'] = "Hinode" self._nickname = self.detector # TODO (add other options, Now all threated as intensity. This follows # Hinode SDC archive) StokesQUV -> grey, Velocity -> EIS, Width -> EIS, # Mag Field Azi -> IDL 5 (STD gamma II) # 'WB' -> red # 'NB'(0 = red); (>0 = gray), # nb has 1 stokes I, the rest quv # 'SP' (<=1 = red); (>1 = gray) #sp has 2 stokes I, the rest quv color = {'SOT/WB': 'intensity', 'SOT/NB': 'intensity', # For the 1st dimension 'SOT/SP': 'intensity', # For the 1st 2 dimensions } self.plot_settings['cmap'] = cm.get_cmap('hinodesot' + color[self.instrument]) @classmethod def is_datasource_for(cls, data, header, **kwargs): """Determines if header corresponds to an SOT image.""" return header.get('instrume') in cls.Instruments sunpy-0.8.3/sunpy/map/sources/iris.py0000644000175000017500000000373413231613140020033 0ustar nabilnabil00000000000000from __future__ import absolute_import import numpy as np from sunpy.map import GenericMap __all__ = ['SJIMap'] class SJIMap(GenericMap): """ A 2D IRIS Slit Jaw Imager Map. The Interface Region Imaging Spectrograph (IRIS) small explorer spacecraft provides simultaneous spectra and images of the photosphere, chromosphere, transition region, and corona with 0.33 to 0.4 arcsec spatial resolution, 2-second temporal resolution and 1 km/s velocity resolution over a field-of- view of up to 175 arcsec by 175 arcsec. IRIS consists of a 19-cm UV telescope that feeds a slit-based dual-bandpass imaging spectrograph. Slit-jaw images in four different passbands (C ii 1330, Si iv 1400, Mg ii k 2796 and Mg ii wing 2830 A) can be taken simultaneously with spectral rasters that sample regions up to 130 arcsec by 175 arcsec at a variety of spatial samplings (from 0.33 arcsec and up). IRIS is sensitive to emission from plasma at temperatures between 5000 K and 10 MK. IRIS was launched into a Sun-synchronous orbit on 27 June 2013. .. warning:: This object can only handle level 1 SJI files. References ---------- * `IRIS Mission Page `_ * `IRIS Analysis Guide `_ * `IRIS Instrument Paper `_ """ def __init__(self, data, header, **kwargs): GenericMap.__init__(self, data, header, **kwargs) self.meta['detector'] = "SJI" self.meta['waveunit'] = "Angstrom" self.meta['wavelnth'] = header['twave1'] @classmethod def is_datasource_for(cls, data, header, **kwargs): """Determines if header corresponds to an IRIS SJI image""" tele = header.get('TELESCOP', '').startswith('IRIS') obs = header.get('INSTRUME', '').startswith('SJI') level = header.get('lvl_num') == 1 return tele and obs sunpy-0.8.3/sunpy/map/sources/proba2.py0000644000175000017500000000314213232563373020260 0ustar nabilnabil00000000000000"""PROBA2 Map subclass definitions""" from __future__ import absolute_import, print_function, division #pylint: disable=W0221,W0222,E1101,E1121 __author__ = "Keith Hughitt" __email__ = "keith.hughitt@nasa.gov" from sunpy.map import GenericMap from sunpy.cm import cm __all__ = ['SWAPMap'] class SWAPMap(GenericMap): """PROBA2 SWAP Image Map. The Sun Watcher using Active Pixel System detector and Image Processing (SWAP) SWAP provides images of the solar corona at about 17.4 nm, a bandpass that corresponds to a temperature of roughly 1 million degrees, with a cadence of 1 image per 1-2 minutes, and field of view (FOV) of 54 arcmin. It is derived from the SOHO EIT telescope concept design. PROBA2 was launched on 2 November 2009. References ---------- * `Proba2 SWAP Science Center `_ * `Fits headers reference `_ """ def __init__(self, data, header, **kwargs): GenericMap.__init__(self, data, header, **kwargs) # It needs to be verified that these must actually be set and # are not already in the header. self.meta['detector'] = "SWAP" # self.meta['instrme'] = "SWAP" self.meta['obsrvtry'] = "PROBA2" self._nickname = self.detector self.plot_settings['cmap'] = cm.get_cmap(name='sdoaia171') @classmethod def is_datasource_for(cls, data, header, **kwargs): """Determines if header corresponds to an SWAP image""" return header.get('instrume') == 'SWAP' sunpy-0.8.3/sunpy/map/sources/rhessi.py0000644000175000017500000000437413232563373020400 0ustar nabilnabil00000000000000"""RHESSI Map subclass definitions""" from __future__ import absolute_import, print_function, division #pylint: disable=W0221,W0222,E1121 __author__ = "Steven Christe" __email__ = "steven.d.christe@nasa.gov" from sunpy.map import GenericMap from sunpy.cm import cm __all__ = ['RHESSIMap'] class RHESSIMap(GenericMap): """RHESSI Image Map. The RHESSI mission consists of a single spin-stabilized spacecraft in a low-altitude orbit inclined 38 degrees to the Earth's equator. The only instrument on board is an Germaniun imaging spectrometer with the ability to obtain high fidelity solar images in X rays (down to 3 keV) to gamma rays (1 MeV). RHESSI provides an angular resolution of 2 arcseconds at X-ray energies below ~40 keV, 7 arcseconds to 400 keV, and 36 arcseconds for gamma-ray lines and continuum above 1 MeV. RHESSI was launched on 5 February 2002. References ---------- * RHESSI Homepage ``_ * Mission Paper ``_ .. warning:: This software is in beta and cannot read fits files containing more than one image. """ def __init__(self, data, header, **kwargs): GenericMap.__init__(self, data, header, **kwargs) self._nickname = self.detector # TODO Currently (8/29/2011), cannot read fits files containing more # than one image (schriste) # Fix some broken/misapplied keywords if self.meta['ctype1'] == 'arcsec': self.meta['cunit1'] = 'arcsec' self.meta['ctype1'] = 'HPLN-TAN' if self.meta['ctype2'] == 'arcsec': self.meta['cunit2'] = 'arcsec' self.meta['ctype2'] = 'HPLT-TAN' self.meta['waveunit'] = 'keV' self.meta['wavelnth'] = [self.meta['energy_l'], self.meta['energy_h']] self.plot_settings['cmap'] = cm.get_cmap('rhessi') @property def detector(self): """ Returns the name of the detector """ return self.meta['telescop'] @classmethod def is_datasource_for(cls, data, header, **kwargs): """Determines if header corresponds to an RHESSI image""" return header.get('instrume') == 'RHESSI' sunpy-0.8.3/sunpy/map/sources/sdo.py0000644000175000017500000001004213232563373017655 0ustar nabilnabil00000000000000"""SDO Map subclass definitions""" from __future__ import absolute_import, print_function, division #pylint: disable=W0221,W0222,E1101,E1121 __author__ = "Keith Hughitt" __email__ = "keith.hughitt@nasa.gov" from astropy.visualization.mpl_normalize import ImageNormalize from astropy.visualization import AsinhStretch from sunpy.map import GenericMap from sunpy.cm import cm from sunpy.map.sources.source_type import source_stretch __all__ = ['AIAMap', 'HMIMap'] class AIAMap(GenericMap): """AIA Image Map. The Atmospheric Imaging Assembly is a set of four telescopes that employ normal-incidence, multi-layer coated optics to provide narrow-band imaging of the Sun. It provides high resolution full-disk images of the corona and transition region up to 0.5 solar radii above the solar limb with 1.5 arcsecond angular resolution and 12-second temporal resolution. It observes the Sun in the following seven extreme ultraviolet bandpasses: 94 A (Fe XVIII), 131 A (Fe VIII, XXI), 171 A (Fe IX), 193 A (Fe XII, XXIV), 211 A (Fe XIV), 304 A (He II), 335 A (Fe XVI). One telescope observes in the visible 1600 A (C IV) and the nearby continuun (1700 A). References ---------- * `SDO Mission Page `_ * `Instrument Page `_ * `Fits Header keywords `_ * `Analysis Guide `_ * `Instrument Paper `_ * `wavelengths and temperature response reference `_ """ def __init__(self, data, header, **kwargs): GenericMap.__init__(self, data, header, **kwargs) # Fill in some missing info self.meta['detector'] = "AIA" self._nickname = self.detector self.plot_settings['cmap'] = cm.get_cmap(self._get_cmap_name()) self.plot_settings['norm'] = ImageNormalize(stretch=source_stretch(self.meta, AsinhStretch(0.01))) @property def observatory(self): """ Returns the observatory. """ return self.meta['telescop'].split('/')[0] @classmethod def is_datasource_for(cls, data, header, **kwargs): """Determines if header corresponds to an AIA image""" return header.get('instrume', '').startswith('AIA') class HMIMap(GenericMap): """HMI Image Map. HMI consists of a refracting telescope, a polarization selector, an image stabilization system, a narrow band tunable filter and two 4096 pixel CCD cameras. It observes the full solar disk in the Fe I absorption line at 6173 Angstrom with a resolution of 1 arc-second. HMI takes images in a sequence of tuning and polarizations at a 4-second cadence for each camera. One camera is dedicated to a 45 s Doppler and line-of-sight field sequence while the other to a 90 s vector field sequence. References ---------- * `SDO Mission Page `_ * `Instrument Page `_ * `Analysis Guide `_ """ def __init__(self, data, header, **kwargs): GenericMap.__init__(self, data, header, **kwargs) self.meta['detector'] = "HMI" # self.meta['instrme'] = "HMI" # self.meta['obsrvtry'] = "SDO" self.meta['waveunit'] = 'Angstrom' self._nickname = self.detector @property def measurement(self): """ Returns the measurement type. """ return self.meta['content'].split(" ")[0].lower() @property def observatory(self): """ Returns the observatory. """ return self.meta['telescop'].split('/')[0] @classmethod def is_datasource_for(cls, data, header, **kwargs): """Determines if header corresponds to an HMI image""" return header.get('instrume', '').startswith('HMI') sunpy-0.8.3/sunpy/map/sources/soho.py0000644000175000017500000002166213232563373020052 0ustar nabilnabil00000000000000"""SOHO Map subclass definitions""" from __future__ import absolute_import, print_function, division #pylint: disable=W0221,W0222,E1101,E1121 __author__ = "Keith Hughitt" __email__ = "keith.hughitt@nasa.gov" import numpy as np from matplotlib import colors from astropy.units import Quantity from astropy.visualization import PowerStretch from astropy.visualization.mpl_normalize import ImageNormalize from sunpy.map import GenericMap from sunpy.sun import constants from sunpy.sun import sun from sunpy.cm import cm from sunpy.map.sources.source_type import source_stretch from sunpy.coordinates import get_sunearth_distance __all__ = ['EITMap', 'LASCOMap', 'MDIMap'] def _dsunAtSoho(date, rad_d, rad_1au=None): """Determines the distance to the Sun from SOhO following d_{\sun,Object} = D_{\sun\earth} \frac{\tan(radius_{1au}[rad])}{\tan(radius_{d}[rad])} though tan x ~ x for x << 1 d_{\sun,Object} = D_{\sun\eart} \frac{radius_{1au}[rad]}{radius_{d}[rad]} since radius_{1au} and radius_{d} are dividing each other we can use [arcsec] instead. --- TODO: Does this apply just to observations on the same Earth-Sun line? If not it can be moved outside here. """ if not rad_1au: rad_1au = sun.solar_semidiameter_angular_size(date) dsun = get_sunearth_distance(date) * constants.au * (rad_1au / rad_d) # return scalar value not astropy.quantity return dsun.value class EITMap(GenericMap): """SOHO EIT Image Map. SOHO EIT is an extreme ultraviolet (EUV) imager able to image the solar transition region and inner corona in four selected bandpasses, 171 (Fe IX/X), 195 (Fe XII), 284 (Fe XV), and 304 (He II) Angstrom. SOHO was launched on 2 December 2 1995 into a sun-synchronous orbit and primary mission operations for SOHO EIT ended at the end of July 2010. References ---------- * `SOHO Mission Page `_ * `SOHO EIT Instrument Page `_ * `SOHO EIT User Guide `_ """ def __init__(self, data, header, **kwargs): GenericMap.__init__(self, data, header, **kwargs) # Fill in some missing info self.meta['detector'] = "EIT" self.meta['waveunit'] = "Angstrom" self._fix_dsun() self._nickname = self.detector self.plot_settings['cmap'] = cm.get_cmap(self._get_cmap_name()) self.plot_settings['norm'] = ImageNormalize(stretch=source_stretch(self.meta, PowerStretch(0.5))) @property def rsun_obs(self): """ Returns the solar radius as measured by EIT in arcseconds. """ return Quantity(self.meta['solar_r'] * self.meta['cdelt1'], 'arcsec') def _fix_dsun(self): self.meta['dsun_obs'] = _dsunAtSoho(self.date, self.rsun_obs) @classmethod def is_datasource_for(cls, data, header, **kwargs): """Determines if header corresponds to an EIT image""" return header.get('instrume') == 'EIT' class LASCOMap(GenericMap): """SOHO LASCO Image Map The Large Angle and Spectrometric COronagraph (LASCO) is a set of three Lyot-type coronagraphs (C1, C2, and C3) that image the solar corona from 1.1 to 32 solar radii. The C1 images rom 1.1 to 3 solar radii. The C2 telescope images the corona from 2 to 6 solar radii, overlaping the outer field-of-view of C1 from 2 to 3 solar radii. The C3 telescope extends the field-of-view to 32 solar radii. SOHO was launched on 2 December 2 1995 into a sun-synchronous orbit. References ---------- * `SOHO Mission Page `_ * `SOHO LASCO Instrument Page `_ * `SOHO LASCO Fits Header keywords `_ * `SOHO LASCO User Guide `_ """ def __init__(self, data, header, **kwargs): GenericMap.__init__(self, data, header, **kwargs) self.meta['CUNIT1'] = self.meta['CUNIT1'].lower() self.meta['CUNIT2'] = self.meta['CUNIT2'].lower() # Fill in some missing or broken info datestr = "{date}T{time}".format(date=self.meta.get('date-obs', self.meta.get('date_obs') ), time=self.meta.get('time-obs', self.meta.get('time_obs') ) ) self.meta['date-obs'] = datestr # If non-standard Keyword is present, correct it too, for compatibility. if 'date_obs' in self.meta: self.meta['date_obs'] = self.meta['date-obs'] self.meta['wavelnth'] = np.nan self.meta['waveunit'] = 'nm' self._nickname = self.instrument + "-" + self.detector self.plot_settings['cmap'] = cm.get_cmap('soholasco{det!s}'.format(det=self.detector[1])) self.plot_settings['norm'] = ImageNormalize(stretch=source_stretch(self.meta, PowerStretch(0.5))) @property def measurement(self): """ Returns the type of data taken. """ # TODO: This needs to do more than white-light. Should give B, pB, etc. return "white-light" @classmethod def is_datasource_for(cls, data, header, **kwargs): """Determines if header corresponds to an LASCO image.""" return header.get('instrume') == 'LASCO' class MDIMap(GenericMap): """ SOHO MDI Image Map The Michelson Doppler Imager (MDI) is a white light refracting telescope which feeds sunlight through a series of filters onto a CCD camera. Two tunable Michelson interformeters define a 94 mAngstrom bandpass that can be tuned across the Ni 6768 Angstrom solar absorption line. MDI measures line-of-sight motion (Dopplergrams), magnetic field (magnetograms), and brightness images of the full solar disk at several resolutions (4 arc-second to very low resolution) and a fixed selected region in higher resolution (1.2 arc-second). SOHO was launched on 2 December 2 1995 into a sun-synchronous orbit and SOHO MDI ceased normal science observations on 12 April 2011. References ---------- * `SOHO Mission Page `_ * `SOHO MDI Instrument Page `_ * `SOHO MDI Fits Header keywords `_ * `SOHO MDI Instrument Paper `_ """ def __init__(self, data, header, **kwargs): GenericMap.__init__(self, data, header, **kwargs) # Fill in some missing or broken info self.meta['detector'] = "MDI" self._fix_dsun() self.meta['wavelnth'] = np.nan self.meta['waveunit'] = 'nm' self._nickname = self.detector + " " + self.measurement vmin = np.nanmin(self.data) vmax = np.nanmax(self.data) if abs(vmin) > abs(vmax): self.plot_settings['norm'] = colors.Normalize(-vmin, vmin) else: self.plot_settings['norm'] = colors.Normalize(-vmax, vmax) @property def measurement(self): """ Returns the type of data in the map. """ return "magnetogram" if self.meta.get('dpc_obsr', " ").find('Mag') != -1 else "continuum" def _fix_dsun(self): """ Solar radius in arc-seconds at 1 au previous value radius_1au = 959.644 radius = constants.average_angular_size There are differences in the keywords in the test FITS data and in the Helioviewer JPEG2000 files. In both files, MDI stores the the radius of the Sun in image pixels, and a pixel scale size. The names of these keywords are different in the FITS versus the JP2 file. The code below first looks for the keywords relevant to a FITS file, and then a JPEG2000 file. For more information on MDI FITS header keywords please go to http://soi.stanford.edu/, http://soi.stanford.edu/data/ and http://soi.stanford.edu/magnetic/Lev1.8/ . """ scale = self.meta.get('xscale', self.meta.get('cdelt1')) radius_in_pixels = self.meta.get('r_sun', self.meta.get('radius')) radius = scale * radius_in_pixels self.meta['radius'] = radius if not radius: # radius = sun.angular_size(self.date) self.meta['dsun_obs'] = constants.au else: self.meta['dsun_obs'] = _dsunAtSoho(self.date, radius) @classmethod def is_datasource_for(cls, data, header, **kwargs): """Determines if header corresponds to an MDI image""" return header.get('instrume') == 'MDI' or header.get('camera') == 'MDI' sunpy-0.8.3/sunpy/map/sources/source_type.py0000644000175000017500000000311113231613140021413 0ustar nabilnabil00000000000000""" Source type-dependencies. Helioviewer JPEG2000 files have stretched images compared to the FITS data. """ from __future__ import absolute_import, print_function, division from astropy.visualization import LinearStretch # pylint: disable=W0221,W0222,E1121 __author__ = "Jack Ireland" __email__ = "jack.ireland@nasa.gov" __all__ = ['from_helioviewer_project', 'source_stretch'] def from_helioviewer_project(meta): """ Test determining if the MapMeta object contains Helioviewer Project sourced data. Parameters ---------- meta : `~sunpy.map.MapMeta` Returns ------- If the data of the map comes from the Helioviewer Project, then True is returned. If not, False is returned. """ return 'helioviewer' in meta.keys() def source_stretch(meta, fits_stretch): """ Assign the correct source-dependent image stretching function. Parameters ---------- meta : `~sunpy.map.MapMeta` fits_stretch : `~astropy.visualization.BaseStretch` Image stretching function used when the source image data comes from a FITS file. Returns ------- An image stretching function appropriate to the image data source. """ if from_helioviewer_project(meta): # Helioviewer JPEG2000 files already have a stretched data values, so # just use a linear stretch. return LinearStretch() else: # Not a Helioviewer JPEG2000 file, so assume the data has not been # stretched and so use the FITS stretching as defined in the instrument # source. return fits_stretch sunpy-0.8.3/sunpy/map/sources/stereo.py0000644000175000017500000001320713232563373020377 0ustar nabilnabil00000000000000"""STEREO Map subclass definitions""" from __future__ import absolute_import, print_function, division #pylint: disable=W0221,W0222,E1121 __author__ = "Keith Hughitt" __email__ = "keith.hughitt@nasa.gov" import numpy as np from astropy.visualization import PowerStretch from astropy.visualization.mpl_normalize import ImageNormalize from sunpy.map import GenericMap from sunpy.cm import cm from sunpy.map.sources.source_type import source_stretch __all__ = ['EUVIMap', 'CORMap', 'HIMap'] class EUVIMap(GenericMap): """STEREO-SECCHI EUVI Image Map EUVI is an extreme ultraviolet (EUV) imager. Part of the STEREO-SECCHI suite it observes the Sun from 1 to 1.7 solar radii. It is capable of observing at 304 (He II), 171 (Fe IX), 195 (Fe XII), and 284 (Fe XV) Angstroms. References ---------- * `STEREO Mission Page `_ * `STEREO SECCHI `_ * `Instrument Page `_ """ def __init__(self, data, header, **kwargs): GenericMap.__init__(self, data, header, **kwargs) self._nickname = "{0}-{1}".format(self.detector, self.observatory[-1]) self.plot_settings['cmap'] = cm.get_cmap('sohoeit{wl:d}'.format(wl=int(self.wavelength.value))) self.plot_settings['norm'] = ImageNormalize(stretch=source_stretch(self.meta, PowerStretch(0.25))) self.meta['waveunit'] = 'Angstrom' # Try to identify when the FITS meta data does not have the correct # date FITS keyword if ('date_obs' in self.meta) and not('date-obs' in self.meta): self.meta['date-obs'] = self.meta['date_obs'] @property def rsun_arcseconds(self): """ Radius of the sun in arcseconds. References ---------- http://sohowww.nascom.nasa.gov/solarsoft/stereo/secchi/doc/FITS_keywords.pdf """ return self.meta.get('rsun', None) @classmethod def is_datasource_for(cls, data, header, **kwargs): """Determines if header corresponds to an EUVI image""" return header.get('detector') == 'EUVI' class CORMap(GenericMap): """STEREO-SECCHI CORonograph Image Map. Part of the STEREO-SECCHI suite of remote sensing telescopes, COR is a set of two coronographs (COR1, COR2) onboard STEREO. They are both traditional Lyot coronagraphs. The COR1 detectors observes from 1.3 to 4 solar radii while the COR2 detectors observe a range from 2 to 15 solar radii. References ---------- * `STEREO Mission Page `_ * `STEREO SECCHI `_ * `COR1 Instrument Page `_ * `COR2 Instrument Page `_ * `COR1 User Guide `_ """ def __init__(self, data, header, **kwargs): GenericMap.__init__(self, data, header, **kwargs) self._nickname = "{0}-{1}".format(self.detector, self.observatory[-1]) self.meta['wavelnth'] = np.nan self.meta['waveunit'] = 'nm' self.plot_settings['cmap'] = cm.get_cmap('stereocor{det!s}'.format(det=self.detector[-1])) self.plot_settings['norm'] = ImageNormalize(stretch=source_stretch(self.meta, PowerStretch(0.5))) # Try to identify when the FITS meta data does not have the correct # date FITS keyword if ('date_obs' in self.meta) and not('date-obs' in self.meta): self.meta['date-obs'] = self.meta['date_obs'] @property def measurement(self): """ Returns the type of data observed. """ # TODO: This needs to do more than white-light. Should give B, pB, etc. return "white-light" @classmethod def is_datasource_for(cls, data, header, **kwargs): """Determines if header corresponds to an COR image""" return header.get('detector', '').startswith('COR') class HIMap(GenericMap): """STEREO-SECCHI Heliospheric Imager (HI) Map. The HI is a wide-angle visible-light imaging system for the detection of coronal mass ejection (CME) events in interplanetary space and, in particular, of events directed towards the Earth. The Heliospheric imager consists of two instruments, the HI-1 and HI-2. The HI1 observes from 15-80 solar radii while HI2 observes from 80-215 solar radii. References ---------- * `STEREO Mission Page `_ * `STEREO SECCHI `_ * `HI Instrument Page `_ """ def __init__(self, data, header, **kwargs): GenericMap.__init__(self, data, header, **kwargs) self.meta['wavelnth'] = np.nan self.meta['waveunit'] = 'nm' self._nickname = "{0}-{1}".format(self.detector, self.observatory[-1]) self.plot_settings['cmap'] = cm.get_cmap('stereohi{det!s}'.format(det=self.detector[-1])) self.plot_settings['norm'] = ImageNormalize(stretch=source_stretch(self.meta, PowerStretch(0.25))) # Try to identify when the FITS meta data does not have the correct # date FITS keyword if ('date_obs' in self.meta) and not('date-obs' in self.meta): self.meta['date-obs'] = self.meta['date_obs'] @property def measurement(self): """ Returns the type of data observed. """ # TODO: This needs to do more than white-light. Should give B, pB, etc. return "white-light" @classmethod def is_datasource_for(cls, data, header, **kwargs): """Determines if header corresponds to an COR image""" return header.get('detector', '').startswith('HI') sunpy-0.8.3/sunpy/map/sources/trace.py0000644000175000017500000000567613232563373020207 0ustar nabilnabil00000000000000"""TRACE Map subclass definitions""" from __future__ import absolute_import, division, absolute_import #pylint: disable=W0221,W0222,E1101,E1121 __author__ = "Jack Ireland" __email__ = "jack.ireland@nasa.gov" from astropy.visualization import LogStretch from astropy.visualization.mpl_normalize import ImageNormalize from sunpy.map import GenericMap from sunpy.cm import cm from sunpy.map.sources.source_type import source_stretch __all__ = ['TRACEMap'] class TRACEMap(GenericMap): """TRACE Image Map The Transition Region and Coronal Explorer was a NASA Small Explorer (SMEX) mission to image the solar corona and transition region at high angular and temporal resolution. TRACE observed the Sun in the following passbands, 5000 A, 1700 A, 1600 A, 1550 A (C IV), 1216 A (H1 Lyman-alpha), 173 A (Fe IX), 195 A (Fe XII), and 284 A (Fe XV). TRACE provides solar images with an 8.5 x 8.5 arcminute field of view and 0.5 arcsecond pixels. It was placed in a sun-synchronous orbit, enabling it to make continuous solar observations. The TRACE mission operated was launched on 2 April 1998 and obtained its last science image on 6 June 2010 23:56 UT. References ---------- * `Mission/Instrument Page `_ * `Fits headers `_ * `Analysis Guide `_ * `Passband reference `_ .. note:: Note that this map definition is currently only being tested on JPEG2000 files. TRACE FITS data is stored in a more complex format. Typically TRACE data is stored in hourly "tri" files that store all the data taken by TRACE in the hour indicated by the filename. Those files must first be understood and parsed to obtain the science data. The ability to do this is not yet in SunPy, but is available in SSWIDL. Please refer to the links above concerning how to read "tri" files in SSWIDL. """ def __init__(self, data, header, **kwargs): GenericMap.__init__(self, data, header, **kwargs) # It needs to be verified that these must actually be set and are not # already in the header. self.meta['detector'] = "TRACE" self.meta['obsrvtry'] = "TRACE" self._nickname = self.detector # Colour maps self.plot_settings['cmap'] = cm.get_cmap('trace' + str(self.meta['WAVE_LEN'])) self.plot_settings['norm'] = ImageNormalize(stretch=source_stretch(self.meta, LogStretch())) @classmethod def is_datasource_for(cls, data, header, **kwargs): """Determines if header corresponds to an TRACE image""" return header.get('instrume') == 'TRACE' @property def measurement(self): """ Returns the measurement type. """ s = self.meta['WAVE_LEN'] if s == 'WL': s = 'white-light' return s sunpy-0.8.3/sunpy/map/sources/yohkoh.py0000644000175000017500000000657513232563373020411 0ustar nabilnabil00000000000000"""Yohkoh SXT Map subclass definitions""" from __future__ import absolute_import, division, absolute_import #pylint: disable=W0221,W0222,E1101,E1121 __author__ = "Jack Ireland" __email__ = "jack.ireland@nasa.gov" import numpy as np from astropy.visualization import PowerStretch from astropy.visualization.mpl_normalize import ImageNormalize from sunpy.map import GenericMap from sunpy.cm import cm from sunpy.sun import constants from sunpy.map.sources.source_type import source_stretch __all__ = ['SXTMap'] class SXTMap(GenericMap): """Yohkoh SXT Image Map The Yohkoh Soft X-ray Telescope (SXT) the full solar disk (42 x 42 arcminutes)in the 0.25 - 4.0 keV range. It consists of a glancing incidence mirror and a CCD sensor and used thin metallic filters to acquire images in restricted portions of its energy range. SXT could resolve features down to 2.5 arcseconds. Information about the temperature and density of the plasma emitting the observed x-rays was obtained by comparing images acquired with the different filters. Images could be obtained every 2 to 8 seconds. Smaller images with a single filter could be obtained as frequently as once every 0.5 seconds. Yohkoh was launched on 30 August 1991 and ceased operations on 14 December 2001. References ---------- * `Yohkoh Mission Page `_ * `Fits header reference `_ * `Yohkoh Analysis Guide `_ """ def __init__(self, data, header, **kwargs): GenericMap.__init__(self, data, header, **kwargs) self.meta['detector'] = "SXT" self.meta['telescop'] = "Yohkoh" self.plot_settings['cmap'] = cm.get_cmap(name='yohkohsxt' + self.measurement[0:2].lower()) self.plot_settings['norm'] = ImageNormalize(stretch=source_stretch(self.meta, PowerStretch(0.5))) # 2012/12/19 - the SXT headers do not have a value of the distance from # the spacecraft to the center of the Sun. The FITS keyword 'DSUN_OBS' # appears to refer to the observed diameter of the Sun. Until such # time as that is calculated and properly included in the file, we will # use simple trigonometry to calculate the distance of the center of # the Sun from the spacecraft. Note that the small angle approximation # is used, and the solar radius stored in SXT FITS files is in arcseconds. self.meta['dsun_apparent'] = constants.au if 'solar_r' in self.meta: self.meta['dsun_apparent'] = constants.radius/(np.deg2rad(self.meta['solar_r']/3600.0)) @property def dsun(self): """ For Yohkoh Maps, dsun_obs is not always defined. Uses approximation defined above it is not defined.""" return self.meta.get('dsun_obs', self.meta['dsun_apparent']) @property def measurement(self): """ Returns the type of data observed. """ s = self.meta.get('wavelnth', '') if s == 'Al.1': s = 'Al01' elif s.lower() == 'open': s = 'white-light' return s @classmethod def is_datasource_for(cls, data, header, **kwargs): """Determines if header corresponds to an SXT image""" return header.get('instrume') == 'SXT' sunpy-0.8.3/sunpy/map/tests/0000755000175000017500000000000013232563477016205 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/map/tests/__init__.py0000644000175000001440000000000013203275053017256 0ustar nabil00000000000000sunpy-0.8.3/sunpy/map/tests/test_header.py0000644000175000017500000000212113231613140021020 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- from sunpy.util.metadata import MetaDict #============================================================================== # Test, read, get_header and write through the file independent layer #============================================================================== def test_upcasing(): meta = MetaDict({'wibble':1, 'WOBBLE':2}) #__getitem__ assert meta['wibble'] == meta['WIBBLE'] #get assert meta.get('wibble') == meta.get('WIBBLE') #has_key assert ('wibble' in meta) == ('WIBBLE' in meta) #Copy meta2 = meta.copy() assert meta2 == meta #pop assert meta.pop('wibble') == meta2.pop('WIBBLE') #update meta.update({'spam':'eggs'}) meta2.update({'SPAM':'eggs'}) assert meta == meta2 #setdefault meta.setdefault('dave',3) meta2.setdefault('DAVE',3) assert meta.get('DAVE') == meta2.get('dave') #__setitem__ meta['wibble'] = 10 assert meta['wibble'] == 10 meta['WIBBLE'] = 20 assert meta['wibble'] == 20 #__contains__ assert 'wibble' in meta assert 'WIBBLE' in meta sunpy-0.8.3/sunpy/map/tests/test_map_factory.py0000644000175000017500000001330113231613140022076 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- """ Created on Fri Jun 21 15:05:09 2013 @author: stuart """ import os import glob import tempfile import pytest import numpy as np from astropy.io import fits import sunpy import sunpy.map import sunpy.data.test try: import sqlalchemy import sunpy.database HAS_SQLALCHEMY = True except ImportError: HAS_SQLALCHEMY = False filepath = sunpy.data.test.rootdir a_list_of_many = glob.glob(os.path.join(filepath, "EIT", "*")) a_fname = a_list_of_many[0] AIA_171_IMAGE = os.path.join(filepath, 'aia_171_level1.fits') RHESSI_IMAGE = os.path.join(filepath, 'hsi_image_20101016_191218.fits') #============================================================================== # Map Factory Tests #============================================================================== class TestMap(object): def test_mapcube(self): #Test making a MapCube cube = sunpy.map.Map(a_list_of_many, cube=True) assert isinstance(cube, sunpy.map.MapCube) def test_composite(self): #Test making a CompositeMap comp = sunpy.map.Map(AIA_171_IMAGE, RHESSI_IMAGE, composite=True) assert isinstance(comp, sunpy.map.CompositeMap) def test_patterns(self): ## Test different Map pattern matching ## # File name eitmap = sunpy.map.Map(a_fname) assert isinstance(eitmap, sunpy.map.GenericMap) # Directory maps = sunpy.map.Map(os.path.join(filepath, "EIT")) assert isinstance(maps, list) assert ([isinstance(amap,sunpy.map.GenericMap) for amap in maps]) # Glob maps = sunpy.map.Map(os.path.join(filepath, "EIT", "*")) assert isinstance(maps, list) assert ([isinstance(amap,sunpy.map.GenericMap) for amap in maps]) # Already a Map amap = sunpy.map.Map(maps[0]) assert isinstance(amap, sunpy.map.GenericMap) # A list of filenames maps = sunpy.map.Map(a_list_of_many) assert isinstance(maps, list) assert ([isinstance(amap,sunpy.map.GenericMap) for amap in maps]) # Data-header pair in a tuple pair_map = sunpy.map.Map((amap.data, amap.meta)) assert isinstance(pair_map, sunpy.map.GenericMap) # Data-header pair not in a tuple pair_map = sunpy.map.Map(amap.data, amap.meta) assert isinstance(pair_map, sunpy.map.GenericMap) # Data-header from FITS with fits.open(a_fname) as hdul: data = hdul[0].data header = hdul[0].header pair_map = sunpy.map.Map((data, header)) assert isinstance(pair_map, sunpy.map.GenericMap) pair_map = sunpy.map.Map(data, header) assert isinstance(pair_map, sunpy.map.GenericMap) #Custom Map data = np.arange(0,100).reshape(10,10) header = {'cdelt1': 10, 'cdelt2': 10, 'telescop':'sunpy'} pair_map = sunpy.map.Map(data, header) assert isinstance(pair_map, sunpy.map.GenericMap) # requires sqlalchemy to run properly @pytest.mark.skipif('not HAS_SQLALCHEMY') def test_databaseentry(self): db = sunpy.database.Database(url='sqlite://', default_waveunit='angstrom') db.add_from_file(a_fname) res = db.get_entry_by_id(1) db_map = sunpy.map.Map(res) assert isinstance(db_map, sunpy.map.GenericMap) @pytest.mark.remote_data def test_url_pattern(self): # A URL amap = sunpy.map.Map("http://data.sunpy.org/sample-data/AIA20110319_105400_0171.fits") assert isinstance(amap, sunpy.map.GenericMap) def test_save(self): #Test save out eitmap = sunpy.map.Map(a_fname) afilename = tempfile.NamedTemporaryFile(suffix='fits').name eitmap.save(afilename, filetype='fits', clobber=True) backin = sunpy.map.Map(afilename) assert isinstance(backin, sunpy.map.sources.EITMap) #============================================================================== # Sources Tests #============================================================================== def test_sdo(self): #Test an AIAMap aia = sunpy.map.Map(AIA_171_IMAGE) assert isinstance(aia,sunpy.map.sources.AIAMap) #Test a HMIMap def test_soho(self): #Test EITMap, LASCOMap & MDIMap eit = sunpy.map.Map(os.path.join(filepath, "EIT", "efz20040301.000010_s.fits")) assert isinstance(eit,sunpy.map.sources.EITMap) lasco = sunpy.map.Map(os.path.join(filepath, "lasco_c2_25299383_s.fts")) assert isinstance(lasco,sunpy.map.sources.LASCOMap) mdi_c = sunpy.map.Map(os.path.join(filepath, "mdi_fd_Ic_6h_01d.5871.0000_s.fits")) assert isinstance(mdi_c,sunpy.map.sources.MDIMap) mdi_m = sunpy.map.Map(os.path.join(filepath, "mdi_fd_M_96m_01d.5874.0005_s.fits")) assert isinstance(mdi_m,sunpy.map.sources.MDIMap) def test_stereo(self): #Test EUVIMap & CORMap & HIMap euvi = sunpy.map.Map(os.path.join(filepath, "euvi_20090615_000900_n4euA_s.fts")) assert isinstance(euvi,sunpy.map.sources.EUVIMap) cor = sunpy.map.Map(os.path.join(filepath, "cor1_20090615_000500_s4c1A.fts")) assert isinstance(cor,sunpy.map.sources.CORMap) hi = sunpy.map.Map(os.path.join(filepath,"hi_20110910_114721_s7h2A.fts")) assert isinstance(hi,sunpy.map.sources.HIMap) def test_rhessi(self): #Test RHESSIMap rhessi = sunpy.map.Map(RHESSI_IMAGE) assert isinstance(rhessi,sunpy.map.sources.RHESSIMap) def test_sot(self): #Test SOTMap sot = sunpy.map.Map(os.path.join(filepath , "FGMG4_20110214_030443.7.fits")) assert isinstance(sot,sunpy.map.sources.SOTMap) #Test SWAPMap #Test XRTMap #Test SXTMap sunpy-0.8.3/sunpy/map/tests/test_mapbase.py0000644000175000017500000006072213231613140021213 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- """ Test Generic Map """ from __future__ import absolute_import import os import pytest import datetime import warnings import tempfile import numpy as np import astropy.wcs from astropy.io import fits import astropy.units as u from astropy.tests.helper import assert_quantity_allclose from astropy.visualization import wcsaxes from astropy.coordinates import SkyCoord import matplotlib.pyplot as plt import sunpy import sunpy.sun import sunpy.map import sunpy.coordinates import sunpy.data.test from sunpy.time import parse_time from sunpy.extern import six testpath = sunpy.data.test.rootdir @pytest.fixture def aia171_test_map(): return sunpy.map.Map(os.path.join(testpath, 'aia_171_level1.fits')) @pytest.fixture def heliographic_test_map(): return sunpy.map.Map(os.path.join(testpath, 'heliographic_phase_map.fits.gz')) @pytest.fixture def aia171_test_map_with_mask(aia171_test_map): shape = aia171_test_map.data.shape mask = np.zeros_like(aia171_test_map.data, dtype=bool) mask[0:shape[0] // 2, 0:shape[1] // 2] = True return sunpy.map.Map(np.ma.array(aia171_test_map.data, mask=mask), aia171_test_map.meta) @pytest.fixture def generic_map(): data = np.ones([6, 6], dtype=np.float64) header = { 'CRVAL1': 0, 'CRVAL2': 0, 'CRPIX1': 5, 'CRPIX2': 5, 'CDELT1': 10, 'CDELT2': 10, 'CUNIT1': 'arcsec', 'CUNIT2': 'arcsec', 'PC1_1': 0, 'PC1_2': -1, 'PC2_1': 1, 'PC2_2': 0, 'NAXIS1': 6, 'NAXIS2': 6, 'date-obs': '1970/01/01T00:00:00', 'obsrvtry': 'Foo', 'detector': 'bar', 'wavelnth': 10, 'waveunit': 'm' } return sunpy.map.Map((data, header)) def test_fits_data_comparison(aia171_test_map): """Make sure the data is the same in pyfits and SunPy""" data = fits.open(os.path.join(testpath, 'aia_171_level1.fits'))[0].data np.testing.assert_allclose(aia171_test_map.data, data) def test_get_item(generic_map): with pytest.raises(NotImplementedError): generic_map[10, 10] def test_wcs(aia171_test_map): wcs = aia171_test_map.wcs assert isinstance(wcs, astropy.wcs.WCS) assert all(wcs.wcs.crpix == [aia171_test_map.reference_pixel.x.value, aia171_test_map.reference_pixel.y.value]) assert all(wcs.wcs.cdelt == [aia171_test_map.scale.axis1.value, aia171_test_map.scale.axis1.value]) assert all( wcs.wcs.crval == [aia171_test_map._reference_longitude.value, aia171_test_map._reference_latitude.value]) assert set(wcs.wcs.ctype) == set( [aia171_test_map.coordinate_system.axis1, aia171_test_map.coordinate_system.axis2]) np.testing.assert_allclose(wcs.wcs.pc, aia171_test_map.rotation_matrix) assert set(wcs.wcs.cunit) == set([u.Unit(a) for a in aia171_test_map.spatial_units]) def test_dtype(generic_map): assert generic_map.dtype == np.float64 def test_size(generic_map): assert generic_map.size == 36 * u.pix def test_min(generic_map): assert generic_map.min() == 1 def test_max(generic_map): assert generic_map.max() == 1 def test_mean(generic_map): assert generic_map.mean() == 1 def test_std(generic_map): assert generic_map.std() == 0 # ============================================================================== # Test the default value of a load of properties # TODO: Test the header keyword extraction # ============================================================================== def test_name(generic_map): assert isinstance(generic_map.name, six.string_types) def test_nickname(generic_map): assert generic_map.nickname == 'bar' def test_nickname_set(generic_map): assert generic_map.nickname == 'bar' generic_map.nickname = 'hi' assert generic_map.nickname == 'hi' def test_date(generic_map): assert isinstance(generic_map.date, datetime.datetime) def test_date_aia(aia171_test_map): assert aia171_test_map.date == parse_time('2011-02-15T00:00:00.34') def test_detector(generic_map): assert generic_map.detector == 'bar' def test_dsun(generic_map): assert generic_map.dsun == sunpy.coordinates.get_sunearth_distance(generic_map.date).to(u.m) def test_rsun_meters(generic_map): assert generic_map.rsun_meters == sunpy.sun.constants.radius def test_rsun_obs(generic_map): assert generic_map.rsun_obs == sunpy.sun.solar_semidiameter_angular_size(generic_map.date) def test_coordinate_system(generic_map): assert generic_map.coordinate_system == ('HPLN- ', 'HPLT- ') def test_carrington_longitude(generic_map): assert generic_map.carrington_longitude == sunpy.coordinates.get_sun_L0(generic_map.date) def test_heliographic_latitude(generic_map): assert generic_map.heliographic_latitude == sunpy.coordinates.get_sun_B0(generic_map.date) def test_heliographic_longitude(generic_map): assert generic_map.heliographic_longitude == 0. def test_units(generic_map): generic_map.spatial_units == ('arcsec', 'arcsec') def test_coordinate_frame(aia171_test_map): frame = aia171_test_map.coordinate_frame assert isinstance(frame, sunpy.coordinates.Helioprojective) assert frame.observer.lat == aia171_test_map.observer_coordinate.frame.lat assert frame.observer.lon == aia171_test_map.observer_coordinate.frame.lon assert frame.observer.radius == aia171_test_map.observer_coordinate.frame.radius assert frame.obstime == aia171_test_map.date # ============================================================================== # Test Rotation WCS conversion # ============================================================================== def test_rotation_matrix_pci_j(generic_map): np.testing.assert_allclose(generic_map.rotation_matrix, np.matrix([[0., -1.], [1., 0.]])) def test_rotation_matrix_crota(aia171_test_map): np.testing.assert_allclose(aia171_test_map.rotation_matrix, np.matrix([[9.99999943e-01, -3.38820761e-04], [3.38820761e-04, 9.99999943e-01]])) def test_rotation_matrix_cd_cdelt(): data = np.ones([6, 6], dtype=np.float64) header = { 'CRVAL1': 0, 'CRVAL2': 0, 'CRPIX1': 5, 'CRPIX2': 5, 'CDELT1': 10, 'CDELT2': 9, 'CD1_1': 0, 'CD1_2': -9, 'CD2_1': 10, 'CD2_2': 0, 'NAXIS1': 6, 'NAXIS2': 6 } cd_map = sunpy.map.Map((data, header)) np.testing.assert_allclose(cd_map.rotation_matrix, np.matrix([[0., -1.], [1., 0]])) def test_rotation_matrix_cd_cdelt_square(): data = np.ones([6, 6], dtype=np.float64) header = { 'CRVAL1': 0, 'CRVAL2': 0, 'CRPIX1': 5, 'CRPIX2': 5, 'CDELT1': 10, 'CDELT2': 10, 'CD1_1': 0, 'CD1_2': -10, 'CD2_1': 10, 'CD2_2': 0, 'NAXIS1': 6, 'NAXIS2': 6 } cd_map = sunpy.map.Map((data, header)) np.testing.assert_allclose(cd_map.rotation_matrix, np.matrix([[0., -1], [1., 0]])) def test_swap_cd(): amap = sunpy.map.Map(os.path.join(testpath, 'swap_lv1_20140606_000113.fits')) np.testing.assert_allclose(amap.rotation_matrix, np.matrix([[1., 0], [0, 1.]])) def test_data_range(generic_map): """Make sure xrange and yrange work""" assert_quantity_allclose( (generic_map.xrange[1] - generic_map.xrange[0]).to(u.arcsec).value, generic_map.meta['cdelt1'] * generic_map.meta['naxis1'] ) assert_quantity_allclose( (generic_map.yrange[1] - generic_map.yrange[0]).to(u.arcsec).value, generic_map.meta['cdelt2'] * generic_map.meta['naxis2'] ) # the weird unit-de-unit thing here is to work around and inconsistency in # the way np.average works with astropy 1.3 and 2.0dev assert_quantity_allclose(np.average(u.Quantity(generic_map.xrange).value) * u.arcsec, generic_map.center.Tx) assert_quantity_allclose(np.average(u.Quantity(generic_map.yrange).value) * u.arcsec, generic_map.center.Ty) def test_world_to_pixel(generic_map): """Make sure conversion from data units to pixels is internally consistent""" # Note: FITS pixels start from 1,1 test_pixel = generic_map.world_to_pixel(generic_map.reference_coordinate, origin=1) assert_quantity_allclose(test_pixel, generic_map.reference_pixel) def test_save(generic_map): """Tests the map save function""" aiamap = aia171_test_map() afilename = tempfile.NamedTemporaryFile(suffix='fits').name aiamap.save(afilename, filetype='fits', clobber=True) loaded_save = sunpy.map.Map(afilename) assert isinstance(loaded_save, sunpy.map.sources.AIAMap) assert loaded_save.meta == aiamap.meta assert_quantity_allclose(loaded_save.data, aiamap.data) def test_default_shift(): """Test that the default shift is zero""" data = np.ones([6, 6], dtype=np.float64) header = { 'CRVAL1': 0, 'CRVAL2': 0, 'CRPIX1': 5, 'CRPIX2': 5, 'CDELT1': 10, 'CDELT2': 9, 'CD1_1': 0, 'CD1_2': -9, 'CD2_1': 10, 'CD2_2': 0, 'NAXIS1': 6, 'NAXIS2': 6 } cd_map = sunpy.map.Map((data, header)) assert cd_map.shifted_value[0].value == 0 assert cd_map.shifted_value[1].value == 0 def test_shift_applied(generic_map): """Test that adding a shift actually updates the reference coordinate""" original_reference_coord = (generic_map.reference_coordinate.Tx, generic_map.reference_coordinate.Ty) x_shift = 5 * u.arcsec y_shift = 13 * u.arcsec shifted_map = generic_map.shift(x_shift, y_shift) assert shifted_map.reference_coordinate.Tx - x_shift == original_reference_coord[0] assert shifted_map.reference_coordinate.Ty - y_shift == original_reference_coord[1] crval1 = ((generic_map.meta.get('crval1') * generic_map.spatial_units[0] + shifted_map.shifted_value[0]).to(shifted_map.spatial_units[0])).value assert shifted_map.meta.get('crval1') == crval1 crval2 = ((generic_map.meta.get('crval2') * generic_map.spatial_units[1] + shifted_map.shifted_value[1]).to(shifted_map.spatial_units[1])).value assert shifted_map.meta.get('crval2') == crval2 def test_set_shift(generic_map): """Test that previously applied shift is stored in the shifted_value property""" x_shift = 5 * u.arcsec y_shift = 13 * u.arcsec shifted_map = generic_map.shift(x_shift, y_shift) resultant_shift = shifted_map.shifted_value assert resultant_shift[0] == x_shift assert resultant_shift[1] == y_shift def test_shift_history(generic_map): """Test the shifted_value is added to a non-zero previous shift""" x_shift1 = 5 * u.arcsec y_shift1 = 13 * u.arcsec shifted_map1 = generic_map.shift(x_shift1, y_shift1) x_shift2 = -28.5 * u.arcsec y_shift2 = 120 * u.arcsec final_shifted_map = shifted_map1.shift(x_shift2, y_shift2) resultant_shift = final_shifted_map.shifted_value assert resultant_shift[0] == x_shift1 + x_shift2 assert resultant_shift[1] == y_shift1 + y_shift2 def test_submap(generic_map): """Check data and header information for a submap""" width = generic_map.data.shape[1] height = generic_map.data.shape[0] # Create a submap of the top-right quadrant of the image submap = generic_map.submap([width / 2., height / 2.] * u.pix, [width, height] * u.pix) # Check to see if submap properties were updated properly assert submap.reference_pixel.x.value == generic_map.meta['crpix1'] - width / 2. assert submap.reference_pixel.y.value == generic_map.meta['crpix2'] - height / 2. assert submap.data.shape[1] == width / 2. assert submap.data.shape[0] == height / 2. # Check to see if header was updated assert submap.meta['naxis1'] == width / 2. assert submap.meta['naxis2'] == height / 2. # Check data assert (generic_map.data[height // 2:height, width // 2:width] == submap.data).all() resample_test_data = [('linear', (100, 200) * u.pixel), ('neighbor', (128, 256) * u.pixel), ('nearest', (512, 128) * u.pixel), ('spline', (200, 200) * u.pixel)] @pytest.mark.parametrize('sample_method, new_dimensions', resample_test_data) def test_resample_dimensions(generic_map, sample_method, new_dimensions): """Check that resampled map has expected dimensions.""" resampled_map = generic_map.resample(new_dimensions, method=sample_method) assert resampled_map.dimensions[0] == new_dimensions[0] assert resampled_map.dimensions[1] == new_dimensions[1] @pytest.mark.parametrize('sample_method, new_dimensions', resample_test_data) def test_resample_metadata(generic_map, sample_method, new_dimensions): """ Check that the resampled map has correctly adjusted metadata. """ resampled_map = generic_map.resample(new_dimensions, method=sample_method) assert float(resampled_map.meta['cdelt1']) / generic_map.meta['cdelt1'] \ == float(generic_map.data.shape[1]) / resampled_map.data.shape[1] assert float(resampled_map.meta['cdelt2']) / generic_map.meta['cdelt2'] \ == float(generic_map.data.shape[0]) / resampled_map.data.shape[0] assert resampled_map.meta['crpix1'] == (resampled_map.data.shape[1] + 1) / 2. assert resampled_map.meta['crpix2'] == (resampled_map.data.shape[0] + 1) / 2. assert resampled_map.meta['crval1'] == generic_map.center.Tx.value assert resampled_map.meta['crval2'] == generic_map.center.Ty.value for key in generic_map.meta: if key not in ('cdelt1', 'cdelt2', 'crpix1', 'crpix2', 'crval1', 'crval2'): assert resampled_map.meta[key] == generic_map.meta[key] def test_superpixel(aia171_test_map, aia171_test_map_with_mask): dimensions = (2, 2) * u.pix superpixel_map_sum = aia171_test_map.superpixel(dimensions) assert_quantity_allclose(superpixel_map_sum.dimensions[1], aia171_test_map.dimensions[1] / dimensions[1] * u.pix) assert_quantity_allclose(superpixel_map_sum.dimensions[0], aia171_test_map.dimensions[0] / dimensions[0] * u.pix) assert_quantity_allclose(superpixel_map_sum.data[0][0], (aia171_test_map.data[0][0] + aia171_test_map.data[0][1] + aia171_test_map.data[1][0] + aia171_test_map.data[1][1])) superpixel_map_avg = aia171_test_map.superpixel(dimensions, func=np.mean) assert_quantity_allclose(superpixel_map_avg.dimensions[1], aia171_test_map.dimensions[1] / dimensions[1] * u.pix) assert_quantity_allclose(superpixel_map_avg.dimensions[0], aia171_test_map.dimensions[0] / dimensions[0] * u.pix) assert_quantity_allclose(superpixel_map_avg.data[0][0], (aia171_test_map.data[0][0] + aia171_test_map.data[0][1] + aia171_test_map.data[1][0] + aia171_test_map.data[1][1]) / 4.0) # Test that the mask is respected superpixel_map_sum = aia171_test_map_with_mask.superpixel(dimensions) assert superpixel_map_sum.mask is not None assert_quantity_allclose(superpixel_map_sum.mask.shape[0], aia171_test_map.dimensions[1] / dimensions[1]) assert_quantity_allclose(superpixel_map_sum.mask.shape[1], aia171_test_map.dimensions[0] / dimensions[0]) # Test that the offset is respected superpixel_map_sum = aia171_test_map_with_mask.superpixel(dimensions, offset=(1, 1) * u.pix) assert_quantity_allclose(superpixel_map_sum.dimensions[1], aia171_test_map.dimensions[1] / dimensions[1] * u.pix - 1 * u.pix) assert_quantity_allclose(superpixel_map_sum.dimensions[0], aia171_test_map.dimensions[0] / dimensions[0] * u.pix - 1 * u.pix) dimensions = (7, 9) * u.pix superpixel_map_sum = aia171_test_map_with_mask.superpixel(dimensions, offset=(4, 4) * u.pix) assert_quantity_allclose( superpixel_map_sum.dimensions[0], np.int((aia171_test_map.dimensions[0] / dimensions[0]).value) * u.pix - 1 * u.pix) assert_quantity_allclose( superpixel_map_sum.dimensions[1], np.int((aia171_test_map.dimensions[1] / dimensions[1]).value) * u.pix - 1 * u.pix) def calc_new_matrix(angle): c = np.cos(np.deg2rad(angle)) s = np.sin(np.deg2rad(angle)) return np.matrix([[c, -s], [s, c]]) def test_rotate(aia171_test_map): rotated_map_1 = aia171_test_map.rotate(20 * u.deg) rotated_map_2 = rotated_map_1.rotate(20 * u.deg) np.testing.assert_allclose(rotated_map_1.rotation_matrix, np.dot(aia171_test_map.rotation_matrix, calc_new_matrix(20).T)) np.testing.assert_allclose(rotated_map_2.rotation_matrix, np.dot(aia171_test_map.rotation_matrix, calc_new_matrix(40).T)) # Rotation of a map by a non-integral multiple of 90 degrees expands the map # and assigns the value of 0 to corner pixels. This results in a reduction # of the mean for a map of all non-negative values. assert rotated_map_2.data.shape > rotated_map_1.data.shape > aia171_test_map.data.shape np.testing.assert_allclose(rotated_map_1.data[0, 0], 0., atol=1e-7) np.testing.assert_allclose(rotated_map_2.data[0, 0], 0., atol=1e-7) assert rotated_map_2.mean() < rotated_map_1.mean() < aia171_test_map.mean() rotated_map_3 = aia171_test_map.rotate(0 * u.deg, scale=1.5) assert rotated_map_3.mean() > aia171_test_map.mean() # Mean and std should be equal when angle of rotation is integral multiple # of 90 degrees for a square map rotated_map_4 = aia171_test_map.rotate(90 * u.deg, scale=1.5) np.testing.assert_allclose(rotated_map_3.mean(), rotated_map_4.mean(), rtol=1e-3) np.testing.assert_allclose(rotated_map_3.std(), rotated_map_4.std(), rtol=1e-3) rotated_map_5 = aia171_test_map.rotate(180 * u.deg, scale=1.5) np.testing.assert_allclose(rotated_map_3.mean(), rotated_map_5.mean(), rtol=1e-3) np.testing.assert_allclose(rotated_map_3.std(), rotated_map_5.std(), rtol=2e-3) # Rotation of a rectangular map by a large enough angle will change which dimension is larger aia171_test_map_crop = aia171_test_map.submap( SkyCoord( [[0, 0], [1000, 400]] * u.arcsec, frame=aia171_test_map.coordinate_frame)) aia171_test_map_crop_rot = aia171_test_map_crop.rotate(60 * u.deg) assert aia171_test_map_crop.data.shape[0] < aia171_test_map_crop.data.shape[1] assert aia171_test_map_crop_rot.data.shape[0] > aia171_test_map_crop_rot.data.shape[1] # Same test as above, to test the other direction aia171_test_map_crop = aia171_test_map.submap( SkyCoord( [[0, 0], [400, 1000]] * u.arcsec, frame=aia171_test_map.coordinate_frame)) aia171_test_map_crop_rot = aia171_test_map_crop.rotate(60 * u.deg) assert aia171_test_map_crop.data.shape[0] > aia171_test_map_crop.data.shape[1] assert aia171_test_map_crop_rot.data.shape[0] < aia171_test_map_crop_rot.data.shape[1] def test_rotate_pad_crpix(generic_map): rotated_map = generic_map.rotate(30*u.deg) # This tests that the reference pixel of the map is in the expected place. assert rotated_map.data.shape != generic_map.data.shape assert_quantity_allclose(u.Quantity(rotated_map.reference_pixel), u.Quantity((6.049038105675565, 7.5490381056760265), u.pix)) def test_rotate_recenter(generic_map): rotated_map = generic_map.rotate(20 * u.deg, recenter=True) pixel_array_center = (np.flipud(rotated_map.data.shape) - 1) / 2.0 assert_quantity_allclose( (pixel_array_center + 1) * u.pix, # FITS indexes from 1 u.Quantity(rotated_map.reference_pixel)) def test_rotate_crota_remove(aia171_test_map): rot_map = aia171_test_map.rotate() assert rot_map.meta.get('CROTA1', None) is None assert rot_map.meta.get('CROTA2', None) is None def test_rotate_scale_cdelt(generic_map): rot_map = generic_map.rotate(scale=10.) assert rot_map.meta['CDELT1'] == generic_map.meta['CDELT1'] / 10. assert rot_map.meta['CDELT2'] == generic_map.meta['CDELT2'] / 10. def test_rotate_new_matrix(generic_map): # Rotate by CW90 to go from CCW 90 in generic map to CCW 180 rot_map = generic_map.rotate(rmatrix=np.matrix([[0, 1], [-1, 0]])) np.testing.assert_allclose(rot_map.rotation_matrix, np.matrix([[-1, 0], [0, -1]])) def test_rotate_rmatrix_angle(generic_map): with pytest.raises(ValueError): generic_map.rotate(angle=5, rmatrix=np.matrix([[1, 0], [0, 1]])) def test_rotate_invalid_order(generic_map): with pytest.raises(ValueError): generic_map.rotate(order=6) with pytest.raises(ValueError): generic_map.rotate(order=-1) def test_as_mpl_axes_aia171(aia171_test_map): ax = plt.subplot(projection=aia171_test_map) assert isinstance(ax, wcsaxes.WCSAxes) # This test doesn't work, it seems that WCSAxes copies or changes the WCS # object. # assert ax.wcs is aia171_test_map.wcs assert all([ct1 == ct2 for ct1, ct2 in zip(ax.wcs.wcs.ctype, aia171_test_map.wcs.wcs.ctype)]) # Map adds these attributes, so we use them to check. assert hasattr(ax.wcs, 'heliographic_observer') def test_pixel_to_world_no_projection(generic_map): out = generic_map.pixel_to_world(*u.Quantity(generic_map.reference_pixel)+1*u.pix, origin=1) assert_quantity_allclose(out.Tx, -10*u.arcsec) assert_quantity_allclose(out.Ty, 10*u.arcsec) def test_validate_meta(generic_map): """Check to see if_validate_meta displays an appropriate error""" with warnings.catch_warnings(record=True) as w: bad_header = { 'CRVAL1': 0, 'CRVAL2': 0, 'CRPIX1': 5, 'CRPIX2': 5, 'CDELT1': 10, 'CDELT2': 10, 'CUNIT1': 'ARCSEC', 'CUNIT2': 'ARCSEC', 'PC1_1': 0, 'PC1_2': -1, 'PC2_1': 1, 'PC2_2': 0, 'NAXIS1': 6, 'NAXIS2': 6, 'date-obs': '1970/01/01T00:00:00', 'obsrvtry': 'Foo', 'detector': 'bar', 'wavelnth': 10, 'waveunit': 'ANGSTROM' } bad_map = sunpy.map.Map((generic_map.data, bad_header)) for count, meta_property in enumerate(('cunit1', 'cunit2', 'waveunit')): assert meta_property.upper() in str(w[count].message) # Heliographic Map Tests def test_hg_coord(heliographic_test_map): assert heliographic_test_map.coordinate_system[0] == "CRLN-CAR" assert heliographic_test_map.coordinate_system[1] == "CRLT-CAR" assert isinstance(heliographic_test_map.coordinate_frame, sunpy.coordinates.HeliographicCarrington) def test_hg_pix_to_data(heliographic_test_map): out = heliographic_test_map.pixel_to_world(180 * u.pix, 90 * u.pix) assert isinstance(out, SkyCoord) assert isinstance(out.frame, sunpy.coordinates.HeliographicCarrington) assert_quantity_allclose(out.lon, 0 * u.deg) assert_quantity_allclose(out.lat, 0 * u.deg) def test_hg_data_to_pix(heliographic_test_map): out = heliographic_test_map.world_to_pixel( SkyCoord( 0 * u.deg, 0 * u.deg, frame=heliographic_test_map.coordinate_frame)) assert_quantity_allclose(out[0], 180 * u.pix) assert_quantity_allclose(out[1], 90 * u.pix) # Heliocentric Map Tests def test_hc_warn(): data = np.ones([6, 6], dtype=np.float64) header = { 'CRVAL1': 0, 'CRVAL2': 0, 'CRPIX1': 5, 'CRPIX2': 5, 'CDELT1': 10, 'CDELT2': 10, 'CUNIT1': 'km', 'CUNIT2': 'km', 'CTYPE1': 'SOLX ', 'CTYPE2': 'SOLY ', 'PC1_1': 0, 'PC1_2': -1, 'PC2_1': 1, 'PC2_2': 0, 'NAXIS1': 6, 'NAXIS2': 6, 'date-obs': '1970/01/01T00:00:00', 'obsrvtry': 'Foo', 'detector': 'bar', 'wavelnth': 10, 'waveunit': 'm' } with pytest.warns(UserWarning): sunpy.map.Map((data, header)) # Dimension testing def test_more_than_two_dimensions(): """Checks to see if an appropriate error is raised when a FITS with more than two dimensions is loaded. We need to load a >2-dim dataset with a TELESCOP header""" # Data crudely represnts 4 stokes, 4 wavelengths with Y,X of 3 and 5. bad_data = np.random.rand(4, 4, 3, 5) hdr = fits.Header() hdr['TELESCOP'] = 'XXX' bad_map = sunpy.map.Map(bad_data, hdr) # Test fails if map.ndim > 2 and if the dimensions of the array are wrong. assert bad_map.ndim is 2 assert_quantity_allclose(bad_map.dimensions, (5, 3) * u.pix) sunpy-0.8.3/sunpy/map/tests/test_mapcube.py0000644000175000017500000001232013231613140021206 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- """ Test mapcube functionality """ from __future__ import absolute_import import numpy as np import astropy.units as u import sunpy import sunpy.map from sunpy.util.metadata import MetaDict import pytest import os import sunpy.data.test @pytest.fixture def aia_map(): """ Load SunPy's test AIA image. """ testpath = sunpy.data.test.rootdir aia_file = os.path.join(testpath, "aia_171_level1.fits") return sunpy.map.Map(aia_file) @pytest.fixture def masked_aia_map(aia_map): """ Put a simple mask in the test AIA image. A rectangular (not square) block of True values are included to test that operations on the mask respect how the mask is stored. """ aia_map_data = aia_map.data aia_map_mask = np.zeros_like(aia_map_data) aia_map_mask[0:2, 0:3] = True return sunpy.map.Map(np.ma.masked_array(aia_map_data, mask=aia_map_mask), aia_map.meta) @pytest.fixture def mapcube_all_the_same(aia_map): """ Simple `sunpy.map.mapcube` for testing.""" return sunpy.map.Map([aia_map, aia_map], cube=True) @pytest.fixture def mapcube_all_the_same_all_have_masks(masked_aia_map): """ Simple `sunpy.map.mapcube` for testing, in which all the maps have masks.""" return sunpy.map.Map([masked_aia_map, masked_aia_map], cube=True) @pytest.fixture def mapcube_all_the_same_some_have_masks(aia_map, masked_aia_map): """ Simple `sunpy.map.mapcube` for testing, in which at least some of the maps have masks.""" return sunpy.map.Map([masked_aia_map, masked_aia_map, aia_map], cube=True) @pytest.fixture() def mapcube_different(aia_map): """ Mapcube allows that the size of the image data in each map be different. This mapcube contains such maps.""" return sunpy.map.Map([aia_map, aia_map.superpixel((4, 4)*u.pix)], cube=True) def test_all_maps_same_shape(mapcube_all_the_same, mapcube_different): """Make sure that Mapcube knows if all the maps have the same shape""" assert mapcube_all_the_same.all_maps_same_shape() assert not mapcube_different.all_maps_same_shape() def test_at_least_one_map_has_mask(mapcube_all_the_same, mapcube_all_the_same_all_have_masks, mapcube_all_the_same_some_have_masks ): """ Test that we can detect the presence of at least one masked map.""" assert not mapcube_all_the_same.at_least_one_map_has_mask() assert mapcube_all_the_same_all_have_masks.at_least_one_map_has_mask() assert mapcube_all_the_same_some_have_masks.at_least_one_map_has_mask() def test_as_array(mapcube_all_the_same, mapcube_different, mapcube_all_the_same_all_have_masks, mapcube_all_the_same_some_have_masks): """Make sure the data in the mapcube returns correctly, when all the maps have the same shape. When they don't have the same shape, make sure an error is raised.""" # Should raise a ValueError if the mapcube has differently shaped maps in # it. with pytest.raises(ValueError): mapcube_different.as_array() # Test the case when none of the maps have a mask returned_array = mapcube_all_the_same.as_array() assert isinstance(returned_array, np.ndarray) assert returned_array.ndim == 3 assert len(returned_array.shape) == 3 assert returned_array.shape[0] == 128 assert returned_array.shape[1] == 128 assert returned_array.shape[2] == 2 assert np.ma.getmask(returned_array) is np.ma.nomask # Test the case when all the maps have masks returned_array = mapcube_all_the_same_all_have_masks.as_array() assert isinstance(returned_array, np.ma.masked_array) data = np.ma.getdata(returned_array) assert data.ndim == 3 assert len(data.shape) == 3 assert data.shape[0] == 128 assert data.shape[1] == 128 assert data.shape[2] == 2 mask = np.ma.getmask(returned_array) assert mask.ndim == 3 assert len(mask.shape) == 3 assert mask.shape[0] == 128 assert mask.shape[1] == 128 assert mask.shape[2] == 2 assert mask.dtype == bool # Test the case when some of the maps have masks returned_array = mapcube_all_the_same_some_have_masks.as_array() assert isinstance(returned_array, np.ma.masked_array) data = np.ma.getdata(returned_array) assert data.ndim == 3 assert len(data.shape) == 3 assert data.shape[0] == 128 assert data.shape[1] == 128 assert data.shape[2] == 3 mask = np.ma.getmask(mapcube_all_the_same_some_have_masks.as_array()) assert mask.ndim == 3 assert len(mask.shape) == 3 assert mask.shape[0] == 128 assert mask.shape[1] == 128 assert mask.shape[2] == 3 assert np.all(mask[0:2, 0:3, 0]) assert np.all(mask[0:2, 0:3, 1]) assert np.all(np.logical_not(mask[0:2, 0:3, 2])) def test_all_meta(mapcube_all_the_same): """Tests that the correct number of map meta objects are returned, and that they are all map meta objects.""" meta = mapcube_all_the_same.all_meta() assert len(meta) == 2 assert np.all(np.asarray([isinstance(h, MetaDict) for h in meta])) assert np.all(np.asarray([meta[i] == mapcube_all_the_same[i].meta for i in range(0, len(meta))])) sunpy-0.8.3/sunpy/map/tests/test_plotting.py0000644000175000017500000000733613231613140021445 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- """ Test Generic Map """ from __future__ import absolute_import import os import pytest import numpy as np import astropy.units as u from astropy.coordinates import SkyCoord import matplotlib.pyplot as plt import sunpy import sunpy.sun import sunpy.map import sunpy.coordinates import sunpy.data.test from sunpy.tests.helpers import figure_test testpath = sunpy.data.test.rootdir @pytest.fixture def aia171_test_map(): return sunpy.map.Map(os.path.join(testpath, 'aia_171_level1.fits')) @pytest.fixture def heliographic_test_map(): return sunpy.map.Map(os.path.join(testpath, 'heliographic_phase_map.fits.gz')) @pytest.fixture def aia171_test_map_with_mask(aia171_test_map): shape = aia171_test_map.data.shape mask = np.zeros_like(aia171_test_map.data, dtype=bool) mask[0:shape[0] // 2, 0:shape[1] // 2] = True return sunpy.map.Map(np.ma.array( aia171_test_map.data, mask=mask), aia171_test_map.meta) @figure_test def test_plot_aia171(aia171_test_map): aia171_test_map.plot() @figure_test def test_peek_aia171(aia171_test_map): aia171_test_map.peek() @figure_test def test_peek_basic_plot_aia171(aia171_test_map): aia171_test_map.peek(basic_plot=True) @figure_test def test_peek_grid_aia171(aia171_test_map): aia171_test_map.peek(draw_grid=True) @figure_test def test_peek_grid_spacing_aia171(aia171_test_map): aia171_test_map.peek(draw_grid=(5, 5) * u.deg) @figure_test def test_peek_limb_aia171(aia171_test_map): aia171_test_map.peek(draw_limb=True) @figure_test def test_draw_grid_aia171(aia171_test_map): aia171_test_map.plot() aia171_test_map.draw_grid(grid_spacing=(30, 40) * u.deg) @figure_test def test_peek_grid_limb_aia171(aia171_test_map): aia171_test_map.peek(draw_grid=True, draw_limb=True) @figure_test def test_plot_aia171_nowcsaxes(aia171_test_map): ax = plt.gca() aia171_test_map.plot(axes=ax) @figure_test def test_rectangle_aia171(aia171_test_map): aia171_test_map.plot() bottom_left = SkyCoord( 0 * u.arcsec, 0 * u.arcsec, frame=aia171_test_map.coordinate_frame) w = 100 * u.arcsec h = 100 * u.arcsec aia171_test_map.draw_rectangle(bottom_left, w, h) @figure_test def test_plot_masked_aia171(aia171_test_map_with_mask): aia171_test_map_with_mask.plot() @figure_test def test_plot_masked_aia171_nowcsaxes(aia171_test_map_with_mask): ax = plt.gca() aia171_test_map_with_mask.plot(axes=ax) @figure_test def test_plot_aia171_superpixel(aia171_test_map): aia171_test_map.superpixel((9, 7) * u.pix, offset=(4, 4) * u.pix).plot() @figure_test def test_plot_aia171_superpixel_nowcsaxes(aia171_test_map): ax = plt.gca() aia171_test_map.superpixel( (9, 7) * u.pix, offset=(4, 4) * u.pix).plot(axes=ax) @figure_test def test_plot_masked_aia171_superpixel(aia171_test_map_with_mask): aia171_test_map_with_mask.superpixel( (9, 7) * u.pix, offset=(4, 4) * u.pix).plot() @figure_test def test_plot_masked_aia171_superpixel_nowcsaxes(aia171_test_map_with_mask): ax = plt.gca() aia171_test_map_with_mask.superpixel( (9, 7) * u.pix, offset=(4, 4) * u.pix).plot(axes=ax) @figure_test def test_draw_contours_aia(aia171_test_map): aia171_test_map.plot() aia171_test_map.draw_contours(u.Quantity(np.arange(1, 100, 10), 'percent')) @figure_test def test_heliographic_peek(heliographic_test_map): heliographic_test_map.peek() @figure_test def test_heliographic_rectangle(heliographic_test_map): heliographic_test_map.plot() bottom = SkyCoord( 60 * u.deg, 50 * u.deg, frame=heliographic_test_map.coordinate_frame) w = 13 * u.deg h = 13 * u.deg heliographic_test_map.draw_rectangle(bottom, w, h, color='cyan') sunpy-0.8.3/sunpy/map/__init__.py0000644000175000017500000000046213231613140017134 0ustar nabilnabil00000000000000"""SunPy Maps""" from __future__ import absolute_import __author__ = "Keith Hughitt" __email__ = "keith.hughitt@nasa.gov" from sunpy.map.mapbase import GenericMap from . mapcube import MapCube from . compositemap import CompositeMap from sunpy.map.map_factory import Map from sunpy.map import sources sunpy-0.8.3/sunpy/map/compositemap.py0000644000175000017500000003777013232563447020130 0ustar nabilnabil00000000000000"""A Composite Map class Author: `Keith Hughitt ` """ from __future__ import absolute_import, print_function, division import matplotlib.pyplot as plt import astropy.units as u from sunpy.map import GenericMap from sunpy.visualization import axis_labels_from_ctype from sunpy.util import expand_list from sunpy.extern import six from sunpy.extern.six.moves import range __all__ = ['CompositeMap'] __author__ = "Keith Hughitt" __email__ = "keith.hughitt@nasa.gov" class CompositeMap(object): """ CompositeMap(map1 [,map2,..]) A Composite Map class Parameters ---------- args : [`~sunpy.map.Map` | string] One or more map of filepaths Methods ------- add_map(map, zorder=None, alpha=1, levels=False) Adds a map to the CompositeMap remove_map(index) Removes and returns the map with the given index. list_maps() Prints a list of the currently included maps. get_alpha(index=None) Returns the alpha-channel value for a layer in the composite image get_levels(index=None) Returns the list of contour levels for a map within the CompositeMap. get_plot_settings(index=None) Returns the plot settings for a map within the CompositeMap. get_zorder(index=None) Returns the layering preference (z-order) for a map within the composite. set_alpha(index, alpha) Sets the alpha-channel value for a layer in the CompositeMap. set_levels(index, levels, percent=False) Sets the contour levels for a layer in the CompositeMap. set_plot_settings(index, plot_setiings) Set the plot settings for a map with the CompositeMap. set_zorder(index, zorder) Set the layering preference (z-order) for a map within the CompositeMap. plot(figure=None, overlays=None, draw_limb=False, gamma=1.0, draw_grid=False, colorbar=True, basic_plot=False,title="SunPy Plot", matplot_args) Plots the composite map object using matplotlib Examples -------- >>> import sunpy.map >>> import sunpy.data.sample >>> comp_map = sunpy.map.Map(sunpy.data.sample.AIA_171_IMAGE, ... sunpy.data.sample.EIT_195_IMAGE, ... composite=True) >>> comp_map.add_map(sunpy.map.Map(sunpy.data.sample.RHESSI_IMAGE)) >>> comp_map.peek() # doctest: +SKIP """ def __init__(self, *args, **kwargs): self._maps = expand_list(args) for m in self._maps: if not isinstance(m, GenericMap): raise ValueError( 'CompositeMap expects pre-constructed map objects.') # Default alpha and zorder values alphas = [1] * len(self._maps) zorders = list(range(0, 10 * len(self._maps), 10)) levels = [False] * len(self._maps) # Set z-order and alpha values for the map for i, m in enumerate(self._maps): m.zorder = zorders[i] m.alpha = alphas[i] m.levels = levels[i] def add_map(self, amap, zorder=None, alpha=1, levels=False): """Adds a map to the CompositeMap. Parameters ---------- amap : `~sunpy.map.GenericMap` or subclass Map instance to be added zorder : `int` The index to use when determining where the map should lie along the z-axis; maps with higher z-orders appear above maps with lower z-orders. alpha : `float` Opacity at which the map should be displayed. An alpha value of 0 results in a fully transparent image while an alpha value of 1 results in a fully opaque image. Values between result in semi- transparent images. """ if zorder is None: zorder = max([m.zorder for m in self._maps]) + 10 amap.zorder = zorder amap.alpha = alpha amap.levels = levels self._maps.append(amap) def remove_map(self, index): """Removes and returns the map with the given index. Parameters ---------- index : `int` The index of the map in the composite map. Returns ------- `sunpy.map.CompositeMap` A composite map with the map indexed by 'index' removed from the composite map. """ return self._maps.pop(index) def list_maps(self): """Prints a list of the currently included maps.""" print([m.__class__ for m in self._maps]) def get_map(self, index): """Returns the map with given index """ return self._maps[index] def get_alpha(self, index=None): """ Returns the alpha-channel value for a layer in the composite image. """ if index is None: return [_map.alpha for _map in self._maps] else: return self._maps[index].alpha def get_levels(self, index=None): """Returns the list of contour levels for a map within the composite. Parameters ---------- index : {`int` | None} The index of the map in the composite map. Returns ------- `list` A list of the contour levels of map at index 'index' in the composite map. If index is None, then the contour levels of all the maps are returned as a list of lists. """ if index is None: return [_map.levels for _map in self._maps] else: return self._maps[index].levels def get_plot_settings(self, index=None): """Returns the plot settings for a map within the composite map. Parameters ---------- index : {`int` | None} The index of the map in the composite map. Returns ------- {`dict` | `list`} The plot settings of the map(s) in the composite map. If None then the plot settings of all the maps are returned in a list. """ if index is None: return [_map.plot_settings for _map in self._maps] else: return self._maps[index].plot_settings def get_zorder(self, index=None): """Returns the layering preference (z-order) for a map within the composite. Parameters ---------- index : {`int` | None} The index of the map in the composite map. Returns ------- {`float` | `list`} The layering order (z-order) of the map(s) in the composite map. If None then the layering order of all the maps is returned in a list. """ if index is None: return [_map.zorder for _map in self._maps] else: return self._maps[index].zorder def set_alpha(self, index, alpha): """Sets the alpha-channel value for a layer in the composite image. Parameters ---------- index : `int` The index of the map in the composite map. alpha : `float` A float in the range 0 to 1. Returns ------- `~sunpy.map.CompositeMap` A composite map with alpha-channel value 'alpha' at layer 'index'. """ if 0 <= alpha <= 1: self._maps[index].alpha = alpha else: raise OutOfRangeAlphaValue("Alpha value must be between 0 and 1.") def set_levels(self, index, levels, percent=False): """ Sets the contour levels for a layer in the composite image. Parameters ---------- index : `int` The index of the map in the composite map. levels : array-like The contour levels. percent : `bool` If True, the input 'levels' are interpreted as percentages relative to the maximum value of the data in layer 'index' of the composite map. If False, the contour levels are set directly from 'levels'. Returns ------- `~sunpy.map.CompositeMap` A composite map with contour levels 'levels' at layer 'index'. """ if percent is False: self._maps[index].levels = levels else: self._maps[index].levels = [self._maps[index].max()*level/100.0 for level in levels] def set_plot_settings(self, index, plot_settings): """Sets the plot settings for a layer in the composite image. Parameters ---------- index : `int` The index of the map in the composite map. plot_settings : `dict` A dictionary of the form Returns ------- `~sunpy.map.CompositeMap` A composite map with plot settings 'plot_settings' at layer 'index'. """ self._maps[index].plot_settings = plot_settings def set_zorder(self, index, zorder): """Set the layering order (z-order) for a map within the composite. Parameters ---------- index : `int` The index of the map in the composite map. zorder : `int` The layer order. Returns ------- `~sunpy.map.CompositeMap` A composite map with the map at layer 'index' having layering order 'zorder'. """ self._maps[index].zorder = zorder def draw_limb(self, index=None, axes=None, **kwargs): """Draws a circle representing the solar limb. Parameters ---------- index : `int` Map index to use to plot limb. axes : `matplotlib.axes.Axes` or None Axes to plot limb on or None to use current axes. Returns ------- `matplotlib.axes.Axes` Notes ----- Keyword arguments are passed onto `sunpy.map.mapbase.GenericMap.draw_limb`. """ if index is None: for i, amap in enumerate(self._maps): if hasattr(amap, 'rsun_obs'): index = i break index_check = hasattr(self._maps[index], 'rsun_obs') if not index_check or index is None: raise ValueError("Specified index does not have all the required attributes to draw limb.") return self._maps[index].draw_limb(axes=axes, **kwargs) @u.quantity_input(grid_spacing=u.deg) def draw_grid(self, index=None, axes=None, grid_spacing=20*u.deg, **kwargs): """Draws a grid over the surface of the Sun. Parameters ---------- index: int Index to determine which map to use to draw grid. axes: `~matplotlib.axes.Axes` or None Axes to plot limb on or None to use current axes. grid_spacing : `float` Spacing (in degrees) for longitude and latitude grid. Returns ------- `matplotlib.axes.Axes` object Notes ----- Keyword arguments are passed onto `sunpy.map.mapbase.GenericMap.draw_grid`. """ needed_attrs = ['rsun_meters', 'dsun', 'heliographic_latitude', 'heliographic_longitude'] if index is None: for i, amap in enumerate(self._maps): if all([hasattr(amap, k) for k in needed_attrs]): index = i break index_check = all([hasattr(self._maps[index], k) for k in needed_attrs]) if not index_check or index is None: raise ValueError("Specified index does not have all the required attributes to draw grid.") ax = self._maps[index].draw_grid(axes=axes, grid_spacing=grid_spacing, **kwargs) return ax def plot(self, axes=None, annotate=True, # pylint: disable=W0613 title="SunPy Composite Plot", **matplot_args): """Plots the composite map object using matplotlib Parameters ---------- axes: `~matplotlib.axes.Axes` or None If provided the image will be plotted on the given axes. Else the current matplotlib axes will be used. annotate : `bool` If true, the data is plotted at it's natural scale; with title and axis labels. title : `str` Title of the composite map. **matplot_args : `dict` Matplotlib Any additional imshow arguments that should be used when plotting. Returns ------- ret : `list` List of axes image or quad contour sets that have been plotted. """ # Get current axes if not axes: axes = plt.gca() if annotate: axes.set_xlabel(axis_labels_from_ctype(self._maps[0].coordinate_system[0], self._maps[0].spatial_units[0])) axes.set_ylabel(axis_labels_from_ctype(self._maps[0].coordinate_system[1], self._maps[0].spatial_units[1])) axes.set_title(title) # Define a list of plotted objects ret = [] # Plot layers of composite map for m in self._maps: # Parameters for plotting params = { "origin": "lower", "extent": list(m.xrange.value) + list(m.yrange.value), "cmap": m.plot_settings['cmap'], "norm": m.plot_settings['norm'], "alpha": m.alpha, "zorder": m.zorder, } params.update(matplot_args) if m.levels is False: ret.append(axes.imshow(m.data, **params)) # Use contour for contour data, and imshow otherwise if m.levels is not False: # Set data with values <= 0 to transparent # contour_data = np.ma.masked_array(m, mask=(m <= 0)) ret.append(axes.contour(m.data, m.levels, **params)) # Set the label of the first line so a legend can be created ret[-1].collections[0].set_label(m.name) # Adjust axes extents to include all data axes.axis('image') # Set current image (makes colorbar work) plt.sci(ret[0]) return ret def peek(self, colorbar=True, basic_plot=False, draw_limb=True, draw_grid=False, **matplot_args): """Displays the map in a new figure. Parameters ---------- colorbar : `bool` or `int` Whether to display a colorbar next to the plot. If specified as an integer a colorbar is plotted for that index. basic_plot : `bool` If true, the data is plotted by itself at it's natural scale; no title, labels, or axes are shown. draw_limb : `bool` If true, draws a circle representing the solar limb. draw_grid : `bool` If true, draws a grid over the surface of the Sun. **matplot_args : dict Matplotlib Any additional imshow arguments that should be used when plotting. """ # Create a figure and add title and axes figure = plt.figure(frameon=not basic_plot) # Basic plot if basic_plot: axes = plt.Axes(figure, [0., 0., 1., 1.]) axes.set_axis_off() figure.add_axes(axes) matplot_args.update({'annotate': False}) else: axes = figure.add_subplot(111) ret = self.plot(axes=axes, **matplot_args) if not isinstance(colorbar, bool) and isinstance(colorbar, int): figure.colorbar(ret[colorbar]) elif colorbar: plt.colorbar() if draw_limb: self.draw_limb(axes=axes) if isinstance(draw_grid, bool): if draw_grid: self.draw_grid(axes=axes) elif isinstance(draw_grid, six.integer_types + (float,)): self.draw_grid(axes=axes, grid_spacing=draw_grid) else: raise TypeError("draw_grid should be bool, int, long or float") figure.show() class OutOfRangeAlphaValue(ValueError): """Exception to raise when an alpha value outside of the range 0-1 is requested. """ pass sunpy-0.8.3/sunpy/map/map_factory.py0000644000175000017500000002607013231613140017704 0ustar nabilnabil00000000000000from __future__ import absolute_import, division, print_function import os import glob from collections import OrderedDict import numpy as np import astropy.io.fits import sunpy from sunpy.map.mapbase import GenericMap, MAP_CLASSES from sunpy.map.compositemap import CompositeMap from sunpy.map.mapcube import MapCube from sunpy.io.file_tools import read_file from sunpy.io.header import FileHeader from sunpy.util.net import download_file from sunpy.util import expand_list from sunpy.util.metadata import MetaDict from sunpy.util.config import get_and_create_download_dir from sunpy.util.datatype_factory_base import BasicRegistrationFactory from sunpy.util.datatype_factory_base import NoMatchError from sunpy.util.datatype_factory_base import MultipleMatchError from sunpy.util.datatype_factory_base import ValidationFunctionError from sunpy.extern import six from sunpy.extern.six.moves.urllib.request import urlopen __authors__ = ["Russell Hewett, Stuart Mumford"] __email__ = "stuart@mumford.me.uk" # Make a mock DatabaseEntry class if sqlalchemy is not installed try: from sunpy.database.tables import DatabaseEntry except ImportError: class DatabaseEntry(object): pass __all__ = ['Map', 'MapFactory'] class MapFactory(BasicRegistrationFactory): """ Map(\*args, \*\*kwargs) Map factory class. Used to create a variety of Map objects. Valid map types are specified by registering them with the factory. Examples -------- >>> import sunpy.map >>> import sunpy.data.sample >>> mymap = sunpy.map.Map(sunpy.data.sample.AIA_171_IMAGE) The SunPy Map factory accepts a wide variety of inputs for creating maps * Preloaded tuples of (data, header) pairs >>> mymap = sunpy.map.Map((data, header)) # doctest: +SKIP headers are some base of `dict` or `collections.OrderedDict`, including `sunpy.io.header.FileHeader` or `sunpy.util.metadata.MetaDict` classes. * data, header pairs, not in tuples >>> mymap = sunpy.map.Map(data, header) # doctest: +SKIP * File names >>> mymap = sunpy.map.Map('file1.fits') # doctest: +SKIP * All fits files in a directory by giving a directory >>> mymap = sunpy.map.Map('local_dir/sub_dir') # doctest: +SKIP * Some regex globs >>> mymap = sunpy.map.Map('eit_*.fits') # doctest: +SKIP * URLs >>> mymap = sunpy.map.Map(url_str) # doctest: +SKIP * DatabaseEntry >>> mymap = sunpy.map.Map(db_result) # doctest: +SKIP * Lists of any of the above >>> mymap = sunpy.map.Map(['file1.fits', 'file2.fits', 'file3.fits', 'directory1/']) # doctest: +SKIP * Any mixture of the above not in a list >>> mymap = sunpy.map.Map((data, header), data2, header2, 'file1.fits', url_str, 'eit_*.fits') # doctest: +SKIP """ def _read_file(self, fname, **kwargs): """ Read in a file name and return the list of (data, meta) pairs in that file. """ # File gets read here. This needs to be generic enough to seamlessly # call a fits file or a jpeg2k file, etc pairs = read_file(fname, **kwargs) new_pairs = [] for pair in pairs: filedata, filemeta = pair assert isinstance(filemeta, FileHeader) # This tests that the data is more than 1D if len(np.shape(filedata)) > 1: data = filedata meta = MetaDict(filemeta) new_pairs.append((data, meta)) return new_pairs def _validate_meta(self, meta): """ Validate a meta argument. """ if isinstance(meta, astropy.io.fits.header.Header): return True elif isinstance(meta, dict): return True else: return False def _parse_args(self, *args, **kwargs): """ Parses an args list for data-header pairs. args can contain any mixture of the following entries: * tuples of data,header * data, header not in a tuple * filename, which will be read * directory, from which all files will be read * glob, from which all files will be read * url, which will be downloaded and read * lists containing any of the above. Example ------- self._parse_args(data, header, (data, header), ['file1', 'file2', 'file3'], 'file4', 'directory1', '*.fits') """ data_header_pairs = list() already_maps = list() # Account for nested lists of items args = expand_list(args) # For each of the arguments, handle each of the cases i = 0 while i < len(args): arg = args[i] # Data-header pair in a tuple if ((type(arg) in [tuple, list]) and len(arg) == 2 and isinstance(arg[0], np.ndarray) and self._validate_meta(arg[1])): arg[1] = OrderedDict(arg[1]) data_header_pairs.append(arg) # Data-header pair not in a tuple elif (isinstance(arg, np.ndarray) and self._validate_meta(args[i+1])): pair = (args[i], OrderedDict(args[i+1])) data_header_pairs.append(pair) i += 1 # an extra increment to account for the data-header pairing # File name elif (isinstance(arg, six.string_types) and os.path.isfile(os.path.expanduser(arg))): path = os.path.expanduser(arg) pairs = self._read_file(path, **kwargs) data_header_pairs += pairs # Directory elif (isinstance(arg, six.string_types) and os.path.isdir(os.path.expanduser(arg))): path = os.path.expanduser(arg) files = [os.path.join(path, elem) for elem in os.listdir(path)] for afile in files: data_header_pairs += self._read_file(afile, **kwargs) # Glob elif (isinstance(arg, six.string_types) and '*' in arg): files = glob.glob(os.path.expanduser(arg)) for afile in files: data_header_pairs += self._read_file(afile, **kwargs) # Already a Map elif isinstance(arg, GenericMap): already_maps.append(arg) # A URL elif (isinstance(arg, six.string_types) and _is_url(arg)): url = arg path = download_file(url, get_and_create_download_dir()) pairs = self._read_file(path, **kwargs) data_header_pairs += pairs # A database Entry elif isinstance(arg, DatabaseEntry): data_header_pairs += self._read_file(arg.path, **kwargs) else: raise ValueError("File not found or invalid input") i += 1 # TODO: # In the end, if there are already maps it should be put in the same # order as the input, currently they are not. return data_header_pairs, already_maps def __call__(self, *args, **kwargs): """ Method for running the factory. Takes arbitrary arguments and keyword arguments and passes them to a sequence of pre-registered types to determine which is the correct Map-type to build. Arguments args and kwargs are passed through to the validation function and to the constructor for the final type. For Map types, validation function must take a data-header pair as an argument. Parameters ---------- composite : boolean, optional Indicates if collection of maps should be returned as a CompositeMap cube : boolean, optional Indicates if collection of maps should be returned as a MapCube silence_errors : boolean, optional If set, ignore data-header pairs which cause an exception. Notes ----- Extra keyword arguments are passed through to `sunpy.io.read_file` such as `memmap` for FITS files. """ # Hack to get around Python 2.x not backporting PEP 3102. composite = kwargs.pop('composite', False) cube = kwargs.pop('cube', False) silence_errors = kwargs.pop('silence_errors', False) data_header_pairs, already_maps = self._parse_args(*args, **kwargs) new_maps = list() # Loop over each registered type and check to see if WidgetType # matches the arguments. If it does, use that type. for pair in data_header_pairs: data, header = pair meta = MetaDict(header) try: new_map = self._check_registered_widgets(data, meta, **kwargs) except (NoMatchError, MultipleMatchError, ValidationFunctionError): if not silence_errors: raise except: raise new_maps.append(new_map) new_maps += already_maps # If the list is meant to be a cube, instantiate a map cube if cube: return MapCube(new_maps, **kwargs) # If the list is meant to be a composite map, instantiate one if composite: return CompositeMap(new_maps, **kwargs) if len(new_maps) == 1: return new_maps[0] return new_maps def _check_registered_widgets(self, data, meta, **kwargs): candidate_widget_types = list() for key in self.registry: # Call the registered validation function for each registered class if self.registry[key](data, meta, **kwargs): candidate_widget_types.append(key) n_matches = len(candidate_widget_types) if n_matches == 0: if self.default_widget_type is None: raise NoMatchError("No types match specified arguments and no default is set.") else: candidate_widget_types = [self.default_widget_type] elif n_matches > 1: raise MultipleMatchError("Too many candidate types identified ({0})." "Specify enough keywords to guarantee unique type" "identification.".format(n_matches)) # Only one is found WidgetType = candidate_widget_types[0] return WidgetType(data, meta, **kwargs) def _is_url(arg): try: urlopen(arg) except: return False return True class InvalidMapInput(ValueError): """Exception to raise when input variable is not a Map instance and does not point to a valid Map input file.""" pass class InvalidMapType(ValueError): """Exception to raise when an invalid type of map is requested with Map """ pass class NoMapsFound(ValueError): """Exception to raise when input does not point to any valid maps or files """ pass Map = MapFactory(default_widget_type=GenericMap, additional_validation_functions=['is_datasource_for']) Map.registry = MAP_CLASSES sunpy-0.8.3/sunpy/map/mapbase.py0000644000175000017500000020320313232563447017022 0ustar nabilnabil00000000000000""" Map is a generic Map class from which all other Map classes inherit from. """ from __future__ import absolute_import, division, print_function from sunpy.extern.six.moves import range import copy import warnings import inspect from abc import ABCMeta from collections import OrderedDict, namedtuple import numpy as np import matplotlib.pyplot as plt from matplotlib import patches, cm, colors import astropy.wcs import astropy.units as u from astropy.visualization.wcsaxes import WCSAxes from astropy.coordinates import SkyCoord import sunpy.io as io import sunpy.coordinates from sunpy.util.decorators import deprecated from sunpy import config from sunpy.extern import six from sunpy.visualization import toggle_pylab, wcsaxes_compat, axis_labels_from_ctype from sunpy.sun import constants from sunpy.sun import sun from sunpy.time import parse_time, is_time from sunpy.image.transform import affine_transform from sunpy.image.rescale import reshape_image_to_4d_superpixel from sunpy.image.rescale import resample as sunpy_image_resample from sunpy.coordinates import get_sun_B0, get_sun_L0, get_sunearth_distance from astropy.nddata import NDData TIME_FORMAT = config.get("general", "time_format") PixelPair = namedtuple('PixelPair', 'x y') SpatialPair = namedtuple('SpatialPair', 'axis1 axis2') __all__ = ['GenericMap'] """ Questions --------- * Should we use Helioviewer or VSO's data model? (e.g. map.meas, map.wavelength or something else?) * Should 'center' be renamed to 'offset' and crpix1 & 2 be used for 'center'? """ # GenericMap subclass registry. MAP_CLASSES = OrderedDict() class GenericMapMetaclass(ABCMeta): """ Registration metaclass for `~sunpy.map.GenericMap`. This class checks for the existance of a method named ``is_datasource_for`` when a subclass of `GenericMap` is defined. If it exists it will add that class to the registry. """ _registry = MAP_CLASSES def __new__(mcls, name, bases, members): cls = super(GenericMapMetaclass, mcls).__new__(mcls, name, bases, members) # The registry contains the class as the key and the validation method # as the item. if 'is_datasource_for' in members: mcls._registry[cls] = cls.is_datasource_for return cls @six.add_metaclass(GenericMapMetaclass) class GenericMap(NDData): """ A Generic spatially-aware 2D data array Parameters ---------- data : `~numpy.ndarray`, list A 2d list or ndarray containing the map data. header : dict A dictionary of the original image header tags. plot_settings : dict, optional Plot settings. Other Parameters ---------------- **kwargs : Additional keyword arguments are passed to `~astropy.nddata.NDData` init. Examples -------- >>> import sunpy.map >>> import sunpy.data.sample >>> aia = sunpy.map.Map(sunpy.data.sample.AIA_171_IMAGE) >>> aia # doctest: +NORMALIZE_WHITESPACE +FLOAT_CMP SunPy Map --------- Observatory: SDO Instrument: AIA 3 Detector: AIA Measurement: 171.0 Angstrom Wavelength: 171.0 Angstrom Observation Date: 2011-06-07 06:33:02 Exposure Time: 0.234256 s Dimension: [ 1024. 1024.] pix Coordinate System: helioprojective Scale: [ 2.402792 2.402792] arcsec / pix Reference Pixel: [ 512.5 512.5] pix Reference Coord: [ 3.22309951 1.38578135] arcsec array([[ -96., 7., -2., ..., -128., -128., -128.], [ -97., -5., 0., ..., -99., -104., -128.], [ -94., 1., -4., ..., -5., -38., -128.], ..., [-128., -128., -128., ..., -128., -128., -128.], [-128., -128., -128., ..., -128., -128., -128.], [-128., -128., -128., ..., -128., -128., -128.]], dtype=float32) >>> aia.spatial_units SpatialPair(axis1=Unit("arcsec"), axis2=Unit("arcsec")) >>> aia.peek() # doctest: +SKIP Notes ----- A number of the properties of this class are returned as two-value named tuples that can either be indexed by position ([0] or [1]) or be accessed by the names (.x and .y) or (.axis1 and .axis2). Things that refer to pixel axes use the ``.x``, ``.y`` convention, where x and y refer to the FITS axes (x for columns y for rows). Spatial axes use ``.axis1`` and ``.axis2`` which correspond to the first and second axes in the header. ``axis1`` corresponds to the coordinate axis for ``x`` and ``axis2`` corresponds to ``y``. This class makes some assumptions about the WCS information contained in the meta data. The first and most extensive assumption is that it is FITS-like WCS information as defined in the FITS WCS papers. Within this scope it also makes some other assumptions. * In the case of APIS convention headers where the CROTAi/j arguments are provided it assumes that these can be converted to the standard PCi_j notation using equations 32 in Thompson (2006). * If a CDi_j matrix is provided it is assumed that it can be converted to a PCi_j matrix and CDELT keywords as described in `Greisen & Calabretta (2002) `_ * The 'standard' FITS keywords that are used by this class are the PCi_j matrix and CDELT, along with the other keywords specified in the WCS papers. All subclasses of this class must convert their header information to this formalism. The CROTA to PCi_j conversion is done in this class. .. warning:: This class currently assumes that a header with the CDi_j matrix information also includes the CDELT keywords, without these keywords this class will not process the WCS. Also the rotation_matrix does not work if the CDELT1 and CDELT2 keywords are exactly equal. Also, if a file with more than two dimensions is feed into the class, only the first two dimensions (NAXIS1, NAXIS2) will be loaded and the rest will be discarded. """ def __init__(self, data, header, plot_settings=None, **kwargs): # If the data has more than two dimensions, the first dimensions # (NAXIS1, NAXIS2) are used and the rest are discarded. ndim = data.ndim if ndim > 2: # We create a slice that removes all but the 'last' two # dimensions. (Note dimensions in ndarray are in reverse order) new_2d_slice = [0]*(ndim-2) new_2d_slice.extend([slice(None), slice(None)]) data = data[new_2d_slice] # Warn the user that the data has been truncated warnings.warn_explicit("This file contains more than 2 dimensions. " "Only the first two dimensions will be used." " The truncated data will not be saved in a new file.", Warning, __file__, inspect.currentframe().f_back.f_lineno) super(GenericMap, self).__init__(data, meta=header, **kwargs) # Correct possibly missing meta keywords self._fix_date() self._fix_naxis() # Setup some attributes self._nickname = None # Validate header # TODO: This should be a function of the header, not of the map self._validate_meta() self._shift = SpatialPair(0 * u.arcsec, 0 * u.arcsec) if self.dtype == np.uint8: norm = None else: norm = colors.Normalize() # Visualization attributes self.plot_settings = {'cmap': cm.gray, 'norm': norm, 'interpolation': 'nearest', 'origin': 'lower' } if plot_settings: self.plot_settings.update(plot_settings) def __getitem__(self, key): """ This should allow indexing by physical coordinate """ raise NotImplementedError( "The ability to index Map by physical" " coordinate is not yet implemented.") def __repr__(self): return ( """SunPy Map --------- Observatory:\t\t {obs} Instrument:\t\t {inst} Detector:\t\t {det} Measurement:\t\t {meas} Wavelength:\t\t {wave} Observation Date:\t {date:{tmf}} Exposure Time:\t\t {dt:f} Dimension:\t\t {dim} Coordinate System:\t {coord.name} Scale:\t\t\t {scale} Reference Pixel:\t {refpix} Reference Coord:\t {refcoord} """.format(obs=self.observatory, inst=self.instrument, det=self.detector, meas=self.measurement, wave=self.wavelength, date=self.date, dt=self.exposure_time, dim=u.Quantity(self.dimensions), scale=u.Quantity(self.scale), coord=self.coordinate_frame, refpix=u.Quantity(self.reference_pixel), refcoord=u.Quantity((self.reference_coordinate.data.lon, self.reference_coordinate.data.lat)), tmf=TIME_FORMAT) + self.data.__repr__()) @classmethod def _new_instance(cls, data, meta, plot_settings=None, **kwargs): """ Instantiate a new instance of this class using given data. This is a shortcut for ``type(self)(data, meta, plot_settings)``. """ return cls(data, meta, plot_settings=plot_settings, **kwargs) def _get_lon_lat(self, frame): """ Given a coordinate frame, extract the lon and lat by casting to SphericalWrap180Representation first. """ r = frame.represent_as(sunpy.coordinates.representation.SphericalWrap180Representation) return r.lon.to(self.spatial_units[0]), r.lat.to(self.spatial_units[1]) @property def wcs(self): """ The `~astropy.wcs.WCS` property of the map. """ w2 = astropy.wcs.WCS(naxis=2) w2.wcs.crpix = u.Quantity(self.reference_pixel) # Make these a quantity array to prevent the numpy setting element of # array with sequence error. w2.wcs.cdelt = u.Quantity(self.scale) w2.wcs.crval = u.Quantity([self._reference_longitude, self._reference_latitude]) w2.wcs.ctype = self.coordinate_system w2.wcs.pc = self.rotation_matrix w2.wcs.cunit = self.spatial_units w2.wcs.dateobs = self.date.isoformat() w2.heliographic_observer = self.observer_coordinate w2.rsun = self.rsun_meters # Astropy WCS does not understand the SOHO default of "solar-x" and # "solar-y" ctypes. This overrides the default assignment and # changes it to a ctype that is understood. See Thompson, 2006, A.&A., # 449, 791. if w2.wcs.ctype[0].lower() in ("solar-x", "solar_x"): w2.wcs.ctype[0] = 'HPLN-TAN' if w2.wcs.ctype[1].lower() in ("solar-y", "solar_y"): w2.wcs.ctype[1] = 'HPLT-TAN' return w2 @property def coordinate_frame(self): """ An `astropy.coordinates.BaseFrame` instance created from the coordinate information for this Map. """ return astropy.wcs.utils.wcs_to_celestial_frame(self.wcs) def _as_mpl_axes(self): """ Compatibility hook for Matplotlib and WCSAxes. This functionality requires the WCSAxes package to work. The reason we include this here is that it allows users to use WCSAxes without having to explicitly import WCSAxes With this method, one can do:: import matplotlib.pyplot as plt import sunpy.map amap = sunpy.map.Map('filename.fits') fig = plt.figure() ax = plt.subplot(projection=amap) ... and this will generate a plot with the correct WCS coordinates on the axes. See http://wcsaxes.readthedocs.io for more information. """ # This code is reused from Astropy return WCSAxes, {'wcs': self.wcs} # Some numpy extraction @property def dimensions(self): """ The dimensions of the array (x axis first, y axis second). """ return PixelPair(*u.Quantity(np.flipud(self.data.shape), 'pixel')) @property def dtype(self): """ The `numpy.dtype` of the array of the map. """ return self.data.dtype @property def size(self): """ The number of pixels in the array of the map. """ return u.Quantity(self.data.size, 'pixel') @property def ndim(self): """ The value of `numpy.ndarray.ndim` of the data array of the map. """ return self.data.ndim def std(self, *args, **kwargs): """ Calculate the standard deviation of the data array. """ return self.data.std(*args, **kwargs) def mean(self, *args, **kwargs): """ Calculate the mean of the data array. """ return self.data.mean(*args, **kwargs) def min(self, *args, **kwargs): """ Calculate the minimum value of the data array. """ return self.data.min(*args, **kwargs) def max(self, *args, **kwargs): """ Calculate the maximum value of the data array. """ return self.data.max(*args, **kwargs) # #### Keyword attribute and other attribute definitions #### # def _base_name(self): """Abstract the shared bit between name and latex_name""" return "{nickname} {{measurement}} {date:{tmf}}".format(nickname=self.nickname, date=parse_time(self.date), tmf=TIME_FORMAT) @property def name(self): """Human-readable description of the Map.""" return self._base_name().format(measurement=self.measurement) @property def latex_name(self): """LaTeX formatted description of the Map.""" if isinstance(self.measurement, u.Quantity): return self._base_name().format(measurement=self.measurement._repr_latex_()) else: return self.name @property def nickname(self): """An abbreviated human-readable description of the map-type; part of the Helioviewer data model.""" return self._nickname if self._nickname else self.detector @nickname.setter def nickname(self, n): self._nickname = n @property def date(self): """Image observation time.""" time = self.meta.get('date-obs', None) if time is None: warnings.warn_explicit("Missing metadata for observation time." " Using current time.", Warning, __file__, inspect.currentframe().f_back.f_lineno) time = 'now' return parse_time(time) @property def detector(self): """Detector name.""" return self.meta.get('detector', "") @property def dsun(self): """The observer distance from the Sun.""" dsun = self.meta.get('dsun_obs', None) if dsun is None: warnings.warn_explicit("Missing metadata for Sun-spacecraft" " separation: assuming Sun-Earth distance", Warning, __file__, inspect.currentframe().f_back.f_lineno) dsun = get_sunearth_distance(self.date).to(u.m) return u.Quantity(dsun, 'm') @property def exposure_time(self): """Exposure time of the image in seconds.""" return self.meta.get('exptime', 0.0) * u.s @property def instrument(self): """Instrument name.""" return self.meta.get('instrume', "").replace("_", " ") @property def measurement(self): """Measurement name, defaults to the wavelength of image.""" return u.Quantity(self.meta.get('wavelnth', 0), self.meta.get('waveunit', "")) @property def wavelength(self): """Wavelength of the observation.""" return u.Quantity(self.meta.get('wavelnth', 0), self.meta.get('waveunit', "")) @property def observatory(self): """Observatory or Telescope name.""" return self.meta.get('obsrvtry', self.meta.get('telescop', "")).replace("_", " ") @property def processing_level(self): """ Returns the FITS processing level if present. """ return self.meta.get('lvl_num', None) @property @deprecated("0.8", "This property is only valid for non-rotated WCS") def xrange(self): """Return the X range of the image from edge to edge.""" xmin = self.center.data.lon - self.dimensions[0] / 2. * self.scale[0] xmax = self.center.data.lon + self.dimensions[0] / 2. * self.scale[0] return u.Quantity([xmin, xmax]) @property @deprecated("0.8", "This property is only valid for non-rotated WCS") def yrange(self): """Return the Y range of the image from edge to edge.""" ymin = self.center.data.lat - self.dimensions[1] / 2. * self.scale[1] ymax = self.center.data.lat + self.dimensions[1] / 2. * self.scale[1] return u.Quantity([ymin, ymax]) @property def bottom_left_coord(self): """ The physical coordinate for the bottom left [0,0] pixel. """ return self.pixel_to_world(0*u.pix, 0*u.pix) @property def top_right_coord(self): """ The physical coordinate for the top left pixel. """ return self.pixel_to_world(*self.dimensions) @property def center(self): """ Return a coordinate object for the center pixel of the array. """ center = u.Quantity(self.dimensions) / 2. return self.pixel_to_world(*center) @property def shifted_value(self): """The total shift applied to the reference coordinate by past applications of `~sunpy.map.GenericMap.shift`.""" return self._shift @u.quantity_input(axis1=u.deg, axis2=u.deg) def shift(self, axis1, axis2): """ Returns a map shifted by a specified amount to, for example, correct for a bad map location. These values are applied directly to the `~sunpy.map.GenericMap.reference_coordinate`. To check how much shift has already been applied see `~sunpy.map.GenericMap.shifted_value` Parameters ---------- axis1 : `~astropy.units.Quantity` The shift to apply to the Longitude (solar-x) coordinate. axis2 : `~astropy.units.Quantity` The shift to apply to the Latitude (solar-y) coordinate Returns ------- out : `~sunpy.map.GenericMap` or subclass A new shifted Map. """ new_meta = self.meta.copy() # Update crvals new_meta['crval1'] = ((self.meta['crval1'] * self.spatial_units[0] + axis1).to(self.spatial_units[0])).value new_meta['crval2'] = ((self.meta['crval2'] * self.spatial_units[1] + axis2).to(self.spatial_units[1])).value # Create new map with the modification new_map = self._new_instance(self.data, new_meta, self.plot_settings) new_map._shift = SpatialPair(self.shifted_value[0] + axis1, self.shifted_value[1] + axis2) return new_map @property def rsun_meters(self): """Radius of the sun in meters.""" return u.Quantity(self.meta.get('rsun_ref', constants.radius), 'meter') @property def rsun_obs(self): """Radius of the Sun.""" rsun_arcseconds = self.meta.get('rsun_obs', self.meta.get('solar_r', self.meta.get('radius', None))) if rsun_arcseconds is None: warnings.warn_explicit("Missing metadata for solar radius:" " assuming photospheric limb as seen from Earth", Warning, __file__, inspect.currentframe().f_back.f_lineno) rsun_arcseconds = sun.solar_semidiameter_angular_size(self.date).to('arcsec').value return u.Quantity(rsun_arcseconds, 'arcsec') @property def coordinate_system(self): """Coordinate system used for x and y axes (ctype1/2).""" return SpatialPair(self.meta.get('ctype1', 'HPLN- '), self.meta.get('ctype2', 'HPLT- ')) @property def carrington_longitude(self): """Carrington longitude (crln_obs).""" carrington_longitude = self.meta.get('crln_obs', None) if carrington_longitude is None: warnings.warn_explicit("Missing metadata for Carrington longitude:" " assuming Earth-based observer", Warning, __file__, inspect.currentframe().f_back.f_lineno) carrington_longitude = get_sun_L0(self.date) if isinstance(carrington_longitude, six.string_types): carrington_longitude = float(carrington_longitude) return u.Quantity(carrington_longitude, 'deg') @property def heliographic_latitude(self): """Heliographic latitude.""" heliographic_latitude = self.meta.get('hglt_obs', self.meta.get('crlt_obs', self.meta.get('solar_b0', None))) if heliographic_latitude is None: warnings.warn_explicit("Missing metadata for heliographic latitude:" " assuming Earth-based observer", Warning, __file__, inspect.currentframe().f_back.f_lineno) heliographic_latitude = get_sun_B0(self.date) if isinstance(heliographic_latitude, six.string_types): heliographic_latitude = float(heliographic_latitude) return u.Quantity(heliographic_latitude, 'deg') @property def heliographic_longitude(self): """Heliographic longitude.""" heliographic_longitude = self.meta.get('hgln_obs', 0.) if isinstance(heliographic_longitude, six.string_types): heliographic_longitude = float(heliographic_longitude) return u.Quantity(heliographic_longitude, 'deg') @property def observer_coordinate(self): """ The Heliographic Stonyhurst Coordinate of the observer. """ return SkyCoord(lat=self.heliographic_latitude, lon=self.heliographic_longitude, radius=self.dsun, obstime=self.date, frame='heliographic_stonyhurst') @property def _reference_longitude(self): """ FITS-WCS compatible longitude. Used in self.wcs and self.reference_coordinate. """ return self.meta.get('crval1', 0.) * self.spatial_units[0] @property def _reference_latitude(self): return self.meta.get('crval2', 0.) * self.spatial_units[1] @property def reference_coordinate(self): """Reference point WCS axes in data units (i.e. crval1, crval2). This value includes a shift if one is set.""" return SkyCoord(self._reference_longitude, self._reference_latitude, frame=self.coordinate_frame) @property def reference_pixel(self): """Reference point axes in pixels (i.e. crpix1, crpix2).""" return PixelPair(self.meta.get('crpix1', (self.meta.get('naxis1') + 1) / 2.) * u.pixel, self.meta.get('crpix2', (self.meta.get('naxis2') + 1) / 2.) * u.pixel) @property def scale(self): """ Image scale along the x and y axes in units/pixel (i.e. cdelt1, cdelt2). """ # TODO: Fix this if only CDi_j matrix is provided return SpatialPair(self.meta.get('cdelt1', 1.) * self.spatial_units[0] / u.pixel, self.meta.get('cdelt2', 1.) * self.spatial_units[1] / u.pixel) @property def spatial_units(self): """ Image coordinate units along the x and y axes (i.e. cunit1, cunit2). """ return SpatialPair(u.Unit(self.meta.get('cunit1', 'arcsec')), u.Unit(self.meta.get('cunit2', 'arcsec'))) @property def rotation_matrix(self): """ Matrix describing the rotation required to align solar North with the top of the image. """ if 'PC1_1' in self.meta: return np.matrix([[self.meta['PC1_1'], self.meta['PC1_2']], [self.meta['PC2_1'], self.meta['PC2_2']]]) elif 'CD1_1' in self.meta: cd = np.matrix([[self.meta['CD1_1'], self.meta['CD1_2']], [self.meta['CD2_1'], self.meta['CD2_2']]]) cdelt = u.Quantity(self.scale).value return cd / cdelt else: return self._rotation_matrix_from_crota() def _rotation_matrix_from_crota(self): """ This method converts the deprecated CROTA FITS kwargs to the new PC rotation matrix. This method can be overriden if an instruments header does not use this conversion. """ lam = self.scale[0] / self.scale[1] p = np.deg2rad(self.meta.get('CROTA2', 0)) return np.matrix([[np.cos(p), -1 * lam * np.sin(p)], [1/lam * np.sin(p), np.cos(p)]]) # #### Miscellaneous #### # def _fix_date(self): # Check commonly used but non-standard FITS keyword for observation # time and correct the keyword if we can. Keep updating old one for # backwards compatibility. if is_time(self.meta.get('date_obs', None)): self.meta['date-obs'] = self.meta['date_obs'] def _fix_naxis(self): # If naxis is not specified, get it from the array shape if 'naxis1' not in self.meta: self.meta['naxis1'] = self.data.shape[1] if 'naxis2' not in self.meta: self.meta['naxis2'] = self.data.shape[0] if 'naxis' not in self.meta: self.meta['naxis'] = self.ndim def _fix_bitpix(self): # Bit-depth # # 8 Character or unsigned binary integer # 16 16-bit twos-complement binary integer # 32 32-bit twos-complement binary integer # -32 IEEE single precision floating point # -64 IEEE double precision floating point # if 'bitpix' not in self.meta: float_fac = -1 if self.dtype.kind == "f" else 1 self.meta['bitpix'] = float_fac * 8 * self.dtype.itemsize def _get_cmap_name(self): """Build the default color map name.""" cmap_string = (self.observatory + self.meta['detector'] + str(int(self.wavelength.to('angstrom').value))) return cmap_string.lower() def _validate_meta(self): """ Validates the meta-information associated with a Map. This method includes very basic validation checks which apply to all of the kinds of files that SunPy can read. Datasource-specific validation should be handled in the relevant file in the sunpy.map.sources package. Allows for default unit assignment for: CUNIT1, CUNIT2, WAVEUNIT """ for meta_property in ('cunit1', 'cunit2', 'waveunit'): if (self.meta.get(meta_property) and u.Unit(self.meta.get(meta_property), parse_strict='silent').physical_type == 'unknown'): warnings.warn("Unknown value for " + meta_property.upper(), Warning) if (self.coordinate_system[0].startswith(('SOLX', 'SOLY')) or self.coordinate_system[1].startswith(('SOLX', 'SOLY'))): warnings.warn("SunPy Map currently does not support three dimensional data," " and therefore can not represent heliocentric coordinates. " "Creating a map in this frame will almost certainly result in errors.") # #### Data conversion routines #### # def world_to_pixel(self, coordinate, origin=0): """ Convert a world (data) coordinate to a pixel coordinate by using `~astropy.wcs.WCS.wcs_world2pix`. Parameters ---------- coordinate : `~astropy.coordinates.SkyCoord` or `~astropy.coordinates.BaseFrame` The coordinate object to convert to pixel coordinates. origin : int Origin of the top-left corner. i.e. count from 0 or 1. Normally, origin should be 0 when passing numpy indices, or 1 if passing values from FITS header or map attributes. See `~astropy.wcs.WCS.wcs_world2pix` for more information. Returns ------- x : `~astropy.units.Quantity` Pixel coordinate on the CTYPE1 axis. y : `~astropy.units.Quantity` Pixel coordinate on the CTYPE2 axis. """ if not isinstance(coordinate, (SkyCoord, astropy.coordinates.BaseCoordinateFrame)): raise ValueError("world_to_pixel takes a Astropy coordinate frame or SkyCoord instance.") native_frame = coordinate.transform_to(self.coordinate_frame) lon, lat = u.Quantity(self._get_lon_lat(native_frame)).to(u.deg) x, y = self.wcs.wcs_world2pix(lon, lat, origin) return PixelPair(x * u.pixel, y * u.pixel) # Thought it would be easier to create a copy this way. @deprecated("0.8.0", alternative="sunpy.map.GenericMap.world_to_pixel") def data_to_pixel(self, coordinate, origin=0): """ See `~sunpy.map.mapbase.GenericMap.world_to_pixel`. """ return self.world_to_pixel(coordinate, origin=origin) @u.quantity_input(x=u.pixel, y=u.pixel) def pixel_to_world(self, x, y, origin=0): """ Convert a pixel coordinate to a data (world) coordinate by using `~astropy.wcs.WCS.wcs_pix2world`. Parameters ---------- x : `~astropy.units.Quantity` Pixel coordinate of the CTYPE1 axis. (Normally solar-x). y : `~astropy.units.Quantity` Pixel coordinate of the CTYPE2 axis. (Normally solar-y). origin : int Origin of the top-left corner. i.e. count from 0 or 1. Normally, origin should be 0 when passing numpy indices, or 1 if passing values from FITS header or map attributes. See `~astropy.wcs.WCS.wcs_pix2world` for more information. Returns ------- coord : `astropy.coordinates.SkyCoord` A coordinate object representing the output coordinate. """ # Hold the WCS instance here so we can inspect the output units after # the pix2world call temp_wcs = self.wcs x, y = temp_wcs.wcs_pix2world(x, y, origin) out_units = list(map(u.Unit, temp_wcs.wcs.cunit)) x = u.Quantity(x, out_units[0]) y = u.Quantity(y, out_units[1]) return SkyCoord(x, y, frame=self.coordinate_frame) # Thought it would be easier to create a copy this way. @deprecated("0.8.0", alternative="sunpy.map.GenericMap.pixel_to_world") def pixel_to_data(self, x, y, origin=0): """ See `~sunpy.map.mapbase.GenericMap.pixel_to_world`. """ return self.pixel_to_world(x, y, origin=origin) # #### I/O routines #### # def save(self, filepath, filetype='auto', **kwargs): """Saves the SunPy Map object to a file. Currently SunPy can only save files in the FITS format. In the future support will be added for saving to other formats. Parameters ---------- filepath : str Location to save file to. filetype : str 'auto' or any supported file extension. """ io.write_file(filepath, self.data, self.meta, filetype=filetype, **kwargs) # #### Image processing routines #### # @u.quantity_input(dimensions=u.pixel) def resample(self, dimensions, method='linear'): """Returns a new Map that has been resampled up or down Arbitrary resampling of the Map to new dimension sizes. Uses the same parameters and creates the same co-ordinate lookup points as IDL''s congrid routine, which apparently originally came from a VAX/VMS routine of the same name. Parameters ---------- dimensions : `~astropy.units.Quantity` Pixel dimensions that new Map should have. Note: the first argument corresponds to the 'x' axis and the second argument corresponds to the 'y' axis. method : {'neighbor' | 'nearest' | 'linear' | 'spline'} Method to use for resampling interpolation. * neighbor - Closest value from original data * nearest and linear - Uses n x 1-D interpolations using scipy.interpolate.interp1d * spline - Uses ndimage.map_coordinates Returns ------- out : `~sunpy.map.GenericMap` or subclass A new Map which has been resampled to the desired dimensions. References ---------- * `Rebinning `_ (Original source, 2011/11/19) """ # Note: because the underlying ndarray is transposed in sense when # compared to the Map, the ndarray is transposed, resampled, then # transposed back # Note: "center" defaults to True in this function because data # coordinates in a Map are at pixel centers # Make a copy of the original data and perform resample new_data = sunpy_image_resample(self.data.copy().T, dimensions, method, center=True) new_data = new_data.T scale_factor_x = float(self.dimensions[0] / dimensions[0]) scale_factor_y = float(self.dimensions[1] / dimensions[1]) # Update image scale and number of pixels new_meta = self.meta.copy() # Update metadata new_meta['cdelt1'] *= scale_factor_x new_meta['cdelt2'] *= scale_factor_y if 'CD1_1' in new_meta: new_meta['CD1_1'] *= scale_factor_x new_meta['CD2_1'] *= scale_factor_x new_meta['CD1_2'] *= scale_factor_y new_meta['CD2_2'] *= scale_factor_y new_meta['crpix1'] = (dimensions[0].value + 1) / 2. new_meta['crpix2'] = (dimensions[1].value + 1) / 2. lon, lat = self._get_lon_lat(self.center.frame) new_meta['crval1'] = lon.value new_meta['crval2'] = lat.value # Create new map instance new_map = self._new_instance(new_data, new_meta, self.plot_settings) return new_map def rotate(self, angle=None, rmatrix=None, order=4, scale=1.0, recenter=False, missing=0.0, use_scipy=False): """ Returns a new rotated and rescaled map. Specify either a rotation angle or a rotation matrix, but not both. If neither an angle or a rotation matrix are specified, the map will be rotated by the rotation angle in the metadata. The map will be rotated around the reference coordinate defined in the meta data. This method also updates the ``rotation_matrix`` attribute and any appropriate header data so that they correctly describe the new map. Parameters ---------- angle : `~astropy.units.Quantity` The angle (degrees) to rotate counterclockwise. rmatrix : 2x2 Linear transformation rotation matrix. order : int 0-5 Interpolation order to be used. When using scikit-image this parameter is passed into :func:`skimage.transform.warp` (e.g., 4 corresponds to bi-quartic interpolation). When using scipy it is passed into :func:`scipy.ndimage.interpolation.affine_transform` where it controls the order of the spline. Faster performance may be obtained at the cost of accuracy by using lower values. Default: 4 scale : float A scale factor for the image, default is no scaling recenter : bool If True, position the axis of rotation at the center of the new map Default: False missing : float The numerical value to fill any missing points after rotation. Default: 0.0 use_scipy : bool If True, forces the rotation to use :func:`scipy.ndimage.interpolation.affine_transform`, otherwise it uses the :func:`skimage.transform.warp`. Default: False, unless scikit-image can't be imported Returns ------- out : `~sunpy.map.GenericMap` or subclass A new Map instance containing the rotated and rescaled data of the original map. See Also -------- sunpy.image.transform.affine_transform : The routine this method calls for the rotation. Notes ----- This function will remove old CROTA keywords from the header. This function will also convert a CDi_j matrix to a PCi_j matrix. See :func:`sunpy.image.transform.affine_transform` for details on the transformations, situations when the underlying data is modified prior to rotation, and differences from IDL's rot(). """ if angle is not None and rmatrix is not None: raise ValueError("You cannot specify both an angle and a matrix") elif angle is None and rmatrix is None: rmatrix = self.rotation_matrix # This is out of the quantity_input decorator. To allow the angle=None # case. See https://github.com/astropy/astropy/issues/3734 if angle: try: equivalent = angle.unit.is_equivalent(u.deg) if not equivalent: raise u.UnitsError("Argument '{0}' to function '{1}'" " must be in units convertable to" " '{2}'.".format('angle', 'rotate', u.deg.to_string())) # Either there is no .unit or no .is_equivalent except AttributeError: if hasattr(angle, "unit"): error_msg = "a 'unit' attribute without an 'is_equivalent' method" else: error_msg = "no 'unit' attribute" raise TypeError("Argument '{0}' to function '{1}' has {2}. " "You may want to pass in an astropy Quantity instead." .format('angle', 'rotate', error_msg)) # Interpolation parameter sanity if order not in range(6): raise ValueError("Order must be between 0 and 5") # The FITS-WCS transform is by definition defined around the # reference coordinate in the header. lon, lat = self._get_lon_lat(self.reference_coordinate.frame) rotation_center = u.Quantity([lon, lat]) # Copy meta data new_meta = self.meta.copy() if angle is not None: # Calculate the parameters for the affine_transform c = np.cos(np.deg2rad(angle)) s = np.sin(np.deg2rad(angle)) rmatrix = np.matrix([[c, -s], [s, c]]) # Calculate the shape in pixels to contain all of the image data extent = np.max(np.abs(np.vstack((self.data.shape * rmatrix, self.data.shape * rmatrix.T))), axis=0) # Calculate the needed padding or unpadding diff = np.asarray(np.ceil((extent - self.data.shape) / 2), dtype=int).ravel() # Pad the image array pad_x = int(np.max((diff[1], 0))) pad_y = int(np.max((diff[0], 0))) new_data = np.pad(self.data, ((pad_y, pad_y), (pad_x, pad_x)), mode='constant', constant_values=(missing, missing)) new_meta['crpix1'] += pad_x new_meta['crpix2'] += pad_y # All of the following pixel calculations use a pixel origin of 0 pixel_array_center = (np.flipud(new_data.shape) - 1) / 2.0 # Create a temporary map so we can use it for the data to pixel calculation. temp_map = self._new_instance(new_data, new_meta, self.plot_settings) # Convert the axis of rotation from data coordinates to pixel coordinates pixel_rotation_center = u.Quantity(temp_map.world_to_pixel(self.reference_coordinate, origin=0)).value del temp_map if recenter: pixel_center = pixel_rotation_center else: pixel_center = pixel_array_center # Apply the rotation to the image data new_data = affine_transform(new_data.T, np.asarray(rmatrix), order=order, scale=scale, image_center=np.flipud(pixel_center), recenter=recenter, missing=missing, use_scipy=use_scipy).T if recenter: new_reference_pixel = pixel_array_center else: # Calculate new pixel coordinates for the rotation center new_reference_pixel = pixel_center + np.dot(rmatrix, pixel_rotation_center - pixel_center) new_reference_pixel = np.array(new_reference_pixel).ravel() # Define the new reference_pixel new_meta['crval1'] = rotation_center[0].value new_meta['crval2'] = rotation_center[1].value new_meta['crpix1'] = new_reference_pixel[0] + 1 # FITS pixel origin is 1 new_meta['crpix2'] = new_reference_pixel[1] + 1 # FITS pixel origin is 1 # Unpad the array if necessary unpad_x = -np.min((diff[1], 0)) if unpad_x > 0: new_data = new_data[:, unpad_x:-unpad_x] new_meta['crpix1'] -= unpad_x unpad_y = -np.min((diff[0], 0)) if unpad_y > 0: new_data = new_data[unpad_y:-unpad_y, :] new_meta['crpix2'] -= unpad_y # Calculate the new rotation matrix to store in the header by # "subtracting" the rotation matrix used in the rotate from the old one # That being calculate the dot product of the old header data with the # inverse of the rotation matrix. pc_C = np.dot(self.rotation_matrix, rmatrix.I) new_meta['PC1_1'] = pc_C[0, 0] new_meta['PC1_2'] = pc_C[0, 1] new_meta['PC2_1'] = pc_C[1, 0] new_meta['PC2_2'] = pc_C[1, 1] # Update pixel size if image has been scaled. if scale != 1.0: new_meta['cdelt1'] = (self.scale[0] / scale).value new_meta['cdelt2'] = (self.scale[1] / scale).value # Remove old CROTA kwargs because we have saved a new PCi_j matrix. new_meta.pop('CROTA1', None) new_meta.pop('CROTA2', None) # Remove CDi_j header new_meta.pop('CD1_1', None) new_meta.pop('CD1_2', None) new_meta.pop('CD2_1', None) new_meta.pop('CD2_2', None) # Create new map with the modification new_map = self._new_instance(new_data, new_meta, self.plot_settings) return new_map def submap(self, bottom_left, top_right=None): """ Returns a submap of the map defined by the rectangle given by the ``[bottom_left, top_right]`` coordinates. Parameters ---------- bottom_left : `astropy.units.Quantity` or `~astropy.coordinates.SkyCoord` The bottom_left coordinate of the rectangle. If a `SkyCoord` it can have shape ``(2,)`` and also define ``top_right``. If specifying pixel coordinates it must be given as an `~astropy.units.Quantity` object with units of `~astropy.units.pixel`. top_right : `astropy.units.Quantity` or `~astropy.coordinates.SkyCoord` The top_right coordinate of the rectangle. Can only be omitted if ``bottom_left`` has shape ``(2,)``. Returns ------- out : `~sunpy.map.GenericMap` or subclass A new map instance is returned representing to specified sub-region. Examples -------- >>> import astropy.units as u >>> import sunpy.map >>> import sunpy.data.sample >>> aia = sunpy.map.Map(sunpy.data.sample.AIA_171_IMAGE) >>> bl = SkyCoord(-300*u.arcsec, -300*u.arcsec, frame=aia.coordinate_frame) >>> tr = SkyCoord(500*u.arcsec, 500*u.arcsec, frame=aia.coordinate_frame) >>> aia.submap(bl, tr) # doctest: +NORMALIZE_WHITESPACE +FLOAT_CMP SunPy Map --------- Observatory: SDO Instrument: AIA 3 Detector: AIA Measurement: 171.0 Angstrom Wavelength: 171.0 Angstrom Observation Date: 2011-06-07 06:33:02 Exposure Time: 0.234256 s Dimension: [ 334. 334.] pix Coordinate System: helioprojective Scale: [ 2.402792 2.402792] arcsec / pix Reference Pixel: [ 127.5 126.5] pix Reference Coord: [ 3.22309951 1.38578135] arcsec array([[ 451., 566., 586., ..., 1179., 1005., 978.], [ 475., 515., 556., ..., 1026., 1011., 1009.], [ 547., 621., 621., ..., 935., 1074., 1108.], ..., [ 203., 195., 226., ..., 612., 580., 561.], [ 207., 213., 233., ..., 651., 622., 537.], [ 230., 236., 222., ..., 516., 586., 591.]], dtype=float32) >>> aia.submap([0,0]*u.pixel, [5,5]*u.pixel) # doctest: +NORMALIZE_WHITESPACE +FLOAT_CMP SunPy Map --------- Observatory: SDO Instrument: AIA 3 Detector: AIA Measurement: 171.0 Angstrom Wavelength: 171.0 Angstrom Observation Date: 2011-06-07 06:33:02 Exposure Time: 0.234256 s Dimension: [ 5. 5.] pix Coordinate System: helioprojective Scale: [ 2.402792 2.402792] arcsec / pix Reference Pixel: [ 512.5 512.5] pix Reference Coord: [ 3.22309951 1.38578135] arcsec array([[-96., 7., -2., -3., -1.], [-97., -5., 0., 0., 1.], [-94., 1., -4., 2., -2.], [-97., -8., -3., -5., -1.], [-96., 6., -5., -1., -4.]], dtype=float32) """ if isinstance(bottom_left, (astropy.coordinates.SkyCoord, astropy.coordinates.BaseCoordinateFrame)): if not top_right: if bottom_left.shape[0] != 2: raise ValueError("If top_right is not specified bottom_left must have length two.") else: lon, lat = self._get_lon_lat(bottom_left) top_right = u.Quantity([lon[1], lat[1]]) bottom_left = u.Quantity([lon[0], lat[0]]) else: bottom_left = u.Quantity(self._get_lon_lat(bottom_left)) top_right = u.Quantity(self._get_lon_lat(top_right)) top_left = u.Quantity([bottom_left[0], top_right[1]]) bottom_right = u.Quantity([top_right[0], bottom_left[1]]) corners = u.Quantity([bottom_left, bottom_right, top_left, top_right]) coord = SkyCoord(corners, frame=self.coordinate_frame) pixel_corners = self.world_to_pixel(coord) # Round the pixel values, we use floor+1 so that we always have at # least one pixel width of data. x_pixels = u.Quantity([np.min(pixel_corners.x), np.max(pixel_corners.x)]).value x_pixels[0] = np.ceil(x_pixels[0]) x_pixels[1] = np.floor(x_pixels[1] + 1) y_pixels = u.Quantity([np.min(pixel_corners.y), np.max(pixel_corners.y)]).value y_pixels[0] = np.ceil(y_pixels[0]) y_pixels[1] = np.floor(y_pixels[1] + 1) elif (isinstance(bottom_left, u.Quantity) and bottom_left.unit.is_equivalent(u.pix) and isinstance(top_right, u.Quantity) and bottom_left.unit.is_equivalent(u.pix)): warnings.warn("GenericMap.submap now takes pixel values as `bottom_left`" " and `top_right` not `range_a` and `range_b`", Warning) x_pixels = u.Quantity([bottom_left[0], top_right[0]]).value y_pixels = u.Quantity([top_right[1], bottom_left[1]]).value else: raise ValueError("Invalid input, bottom_left and top_right must either be SkyCoord or Quantity in pixels.") # Sort the pixel values so we always slice in the correct direction x_pixels.sort() y_pixels.sort() x_pixels = np.array(x_pixels) y_pixels = np.array(y_pixels) # Clip pixel values to max of array, prevents negative # indexing x_pixels[np.less(x_pixels, 0)] = 0 x_pixels[np.greater(x_pixels, self.data.shape[1])] = self.data.shape[1] y_pixels[np.less(y_pixels, 0)] = 0 y_pixels[np.greater(y_pixels, self.data.shape[0])] = self.data.shape[0] # Get ndarray representation of submap xslice = slice(int(x_pixels[0]), int(x_pixels[1])) yslice = slice(int(y_pixels[0]), int(y_pixels[1])) new_data = self.data[yslice, xslice].copy() # Make a copy of the header with updated centering information new_meta = self.meta.copy() new_meta['crpix1'] = self.reference_pixel.x.value - x_pixels[0] new_meta['crpix2'] = self.reference_pixel.y.value - y_pixels[0] new_meta['naxis1'] = new_data.shape[1] new_meta['naxis2'] = new_data.shape[0] # Create new map instance if self.mask is not None: new_mask = self.mask[yslice, xslice].copy() # Create new map with the modification new_map = self._new_instance(new_data, new_meta, self.plot_settings, mask=new_mask) return new_map # Create new map with the modification new_map = self._new_instance(new_data, new_meta, self.plot_settings) return new_map @u.quantity_input(dimensions=u.pixel, offset=u.pixel) def superpixel(self, dimensions, offset=(0, 0)*u.pixel, func=np.sum): """Returns a new map consisting of superpixels formed by applying 'func' to the original map data. Parameters ---------- dimensions : tuple One superpixel in the new map is equal to (dimension[0], dimension[1]) pixels of the original map. Note: the first argument corresponds to the 'x' axis and the second argument corresponds to the 'y' axis. offset : tuple Offset from (0,0) in original map pixels used to calculate where the data used to make the resulting superpixel map starts. func : function applied to the original data The function 'func' must take a numpy array as its first argument, and support the axis keyword with the meaning of a numpy axis keyword (see the description of `~numpy.sum` for an example.) The default value of 'func' is `~numpy.sum`; using this causes superpixel to sum over (dimension[0], dimension[1]) pixels of the original map. Returns ------- out : `~sunpy.map.GenericMap` or subclass A new Map which has superpixels of the required size. References ---------- | `Summarizing blocks of an array using a moving window `_ """ # Note: because the underlying ndarray is transposed in sense when # compared to the Map, the ndarray is transposed, resampled, then # transposed back. # Note: "center" defaults to True in this function because data # coordinates in a Map are at pixel centers. if (offset.value[0] < 0) or (offset.value[1] < 0): raise ValueError("Offset is strictly non-negative.") # Make a copy of the original data, perform reshaping, and apply the # function. if self.mask is not None: reshaped = reshape_image_to_4d_superpixel(np.ma.array(self.data.copy(), mask=self.mask), [dimensions.value[1], dimensions.value[0]], [offset.value[1], offset.value[0]]) else: reshaped = reshape_image_to_4d_superpixel(self.data.copy(), [dimensions.value[1], dimensions.value[0]], [offset.value[1], offset.value[0]]) new_array = func(func(reshaped, axis=3), axis=1) # Update image scale and number of pixels # create copy of new meta data new_meta = self.meta.copy() new_nx = new_array.shape[1] new_ny = new_array.shape[0] # Update metadata new_meta['cdelt1'] = (dimensions[0] * self.scale[0]).value new_meta['cdelt2'] = (dimensions[1] * self.scale[1]).value if 'CD1_1' in new_meta: new_meta['CD1_1'] *= dimensions[0].value new_meta['CD2_1'] *= dimensions[0].value new_meta['CD1_2'] *= dimensions[1].value new_meta['CD2_2'] *= dimensions[1].value new_meta['crpix1'] = (new_nx + 1) / 2. new_meta['crpix2'] = (new_ny + 1) / 2. lon, lat = self._get_lon_lat(self.center.frame) new_meta['crval1'] = lon.to(self.spatial_units[0]).value + 0.5*(offset[0]*self.scale[0]).to(self.spatial_units[0]).value new_meta['crval2'] = lat.to(self.spatial_units[1]).value + 0.5*(offset[1]*self.scale[1]).to(self.spatial_units[1]).value # Create new map instance if self.mask is not None: new_data = np.ma.getdata(new_array) new_mask = np.ma.getmask(new_array) else: new_data = new_array new_mask = None # Create new map with the modified data new_map = self._new_instance(new_data, new_meta, self.plot_settings, mask=new_mask) return new_map # #### Visualization #### # @u.quantity_input(grid_spacing=u.deg) def draw_grid(self, axes=None, grid_spacing=15*u.deg, **kwargs): """ Draws a coordinate overlay on the plot in the Heliographic Stonyhurst coordinate system. To overlay other coordinate systems see the `WCSAxes Documentation `_ Parameters ---------- axes: `~matplotlib.axes` or None Axes to plot limb on or None to use current axes. grid_spacing: `~astropy.units.Quantity` Spacing for longitude and latitude grid, if length two it specifies (lon, lat) spacing. Returns ------- overlay: `~astropy.visualization.wcsaxes.coordinates_map.CoordinatesMap` The wcsaxes coordinate overlay instance. Notes ----- Keyword arguments are passed onto the `sunpy.visualization.wcsaxes_compat.wcsaxes_heliographic_overlay` function. """ if not axes: axes = wcsaxes_compat.gca_wcs(self.wcs) if not wcsaxes_compat.is_wcsaxes(axes): raise TypeError("Overlay grids can only be plotted on WCSAxes plots.") return wcsaxes_compat.wcsaxes_heliographic_overlay(axes, grid_spacing=grid_spacing, **kwargs) def draw_limb(self, axes=None, **kwargs): """ Draws a circle representing the solar limb Parameters ---------- axes: `~matplotlib.axes` or None Axes to plot limb on or None to use current axes. Returns ------- circ: list A list containing the `~matplotlib.patches.Circle` object that has been added to the axes. Notes ----- Keyword arguments are passed onto `matplotlib.patches.Circle`. """ if not axes: axes = wcsaxes_compat.gca_wcs(self.wcs) transform = wcsaxes_compat.get_world_transform(axes) if wcsaxes_compat.is_wcsaxes(axes): radius = self.rsun_obs.to(u.deg).value else: radius = self.rsun_obs.value c_kw = {'radius': radius, 'fill': False, 'color': 'white', 'zorder': 100, 'transform': transform } c_kw.update(kwargs) circ = patches.Circle([0, 0], **c_kw) axes.add_artist(circ) return [circ] @u.quantity_input(width=u.deg, height=u.deg) def draw_rectangle(self, bottom_left, width, height, axes=None, **kwargs): """ Draw a rectangle defined in world coordinates on the plot. Parameters ---------- bottom_left : `~astropy.coordinates.SkyCoord` or `~astropy.coordinates.BaseCoordinateFrame` The bottom left corner of the rectangle. width : `astropy.units.Quantity` The width of the rectangle. height : `astropy.units.Quantity` The height of the rectangle. axes : `matplotlib.axes.Axes` The axes on which to plot the rectangle, defaults to the current axes. Returns ------- rect : `list` A list containing the `~matplotlib.patches.Rectangle` object, after it has been added to ``axes``. Notes ----- Extra keyword arguments to this function are passed through to the `~matplotlib.patches.Rectangle` instance. """ if not axes: axes = plt.gca() if wcsaxes_compat.is_wcsaxes(axes): axes_unit = u.deg else: axes_unit = self.spatial_units[0] coord = bottom_left.transform_to(self.coordinate_frame) bottom_left = u.Quantity((coord.data.lon, coord.data.lat), unit=axes_unit).value width = width.to(axes_unit).value height = height.to(axes_unit).value kwergs = {'transform': wcsaxes_compat.get_world_transform(axes), 'color': 'white', 'fill': False} kwergs.update(kwargs) rect = plt.Rectangle(bottom_left, width, height, **kwergs) axes.add_artist(rect) return [rect] @u.quantity_input(levels=u.percent) def draw_contours(self, levels, axes=None, **contour_args): """ Draw contours of the data. Parameters ---------- levels : `~astropy.units.Quantity` A list of numbers indicating the level curves to draw given in percent. axes : `matplotlib.axes.Axes` The axes on which to plot the rectangle, defaults to the current axes. Returns ------- cs : `list` The `~matplotlib.QuadContourSet` object, after it has been added to ``axes``. Notes ----- Extra keyword arguments to this function are passed through to the `~matplotlib.pyplot.contour` function. """ if not axes: axes = wcsaxes_compat.gca_wcs(self.wcs) # TODO: allow for use of direct input of contours but requires units of # map flux which is not yet implemented cs = axes.contour(self.data, 0.01 * levels.to('percent').value * self.data.max(), **contour_args) return cs @toggle_pylab def peek(self, draw_limb=False, draw_grid=False, colorbar=True, basic_plot=False, **matplot_args): """ Displays the map in a new figure. Parameters ---------- draw_limb : bool Whether the solar limb should be plotted. draw_grid : bool or `~astropy.units.Quantity` Whether solar meridians and parallels are plotted. If `~astropy.units.Quantity` then sets degree difference between parallels and meridians. gamma : float Gamma value to use for the color map. colorbar : bool Whether to display a colorbar next to the plot. basic_plot : bool If true, the data is plotted by itself at it's natural scale; no title, labels, or axes are shown. **matplot_args : dict Matplotlib Any additional imshow arguments that should be used when plotting. """ # Create a figure and add title and axes figure = plt.figure(frameon=not basic_plot) # Basic plot if basic_plot: axes = plt.Axes(figure, [0., 0., 1., 1.]) axes.set_axis_off() figure.add_axes(axes) matplot_args.update({'annotate': False, "_basic_plot": True}) # Normal plot else: axes = wcsaxes_compat.gca_wcs(self.wcs) im = self.plot(axes=axes, **matplot_args) if colorbar and not basic_plot: figure.colorbar(im) if draw_limb: self.draw_limb(axes=axes) if isinstance(draw_grid, bool): if draw_grid: self.draw_grid(axes=axes) elif isinstance(draw_grid, u.Quantity): self.draw_grid(axes=axes, grid_spacing=draw_grid) else: raise TypeError("draw_grid should be a bool or an astropy Quantity.") figure.show() @toggle_pylab def plot(self, annotate=True, axes=None, title=True, **imshow_kwargs): """ Plots the map object using matplotlib, in a method equivalent to plt.imshow() using nearest neighbour interpolation. Parameters ---------- annotate : bool If True, the data is plotted at it's natural scale; with title and axis labels. axes: `~matplotlib.axes` or None If provided the image will be plotted on the given axes. Else the current matplotlib axes will be used. **imshow_kwargs : dict Any additional imshow arguments that should be used when plotting. Examples -------- >>> # Simple Plot with color bar >>> aia.plot() # doctest: +SKIP >>> plt.colorbar() # doctest: +SKIP >>> # Add a limb line and grid >>> aia.plot() # doctest: +SKIP >>> aia.draw_limb() # doctest: +SKIP >>> aia.draw_grid() # doctest: +SKIP """ # extract hiddden kwarg _basic_plot = imshow_kwargs.pop("_basic_plot", False) # Get current axes if not axes: axes = wcsaxes_compat.gca_wcs(self.wcs) if not _basic_plot: # Check that the image is properly oriented if (not wcsaxes_compat.is_wcsaxes(axes) and not np.array_equal(self.rotation_matrix, np.matrix(np.identity(2)))): warnings.warn("This map is not properly oriented. Plot axes may be incorrect", Warning) elif not wcsaxes_compat.is_wcsaxes(axes): warnings.warn("WCSAxes not being used as the axes object for this plot." " Plots may have expected behaviour", Warning) # Normal plot imshow_args = copy.deepcopy(self.plot_settings) if 'title' in imshow_args: plot_settings_title = imshow_args.pop('title') else: plot_settings_title = self.latex_name if annotate: if title is True: title = plot_settings_title if title: axes.set_title(title) axes.set_xlabel(axis_labels_from_ctype(self.coordinate_system[0], self.spatial_units[0])) axes.set_ylabel(axis_labels_from_ctype(self.coordinate_system[1], self.spatial_units[1])) if not wcsaxes_compat.is_wcsaxes(axes): bl = self._get_lon_lat(self.bottom_left_coord) tr = self._get_lon_lat(self.top_right_coord) x_range = list(u.Quantity([bl[0], tr[0]]).to(self.spatial_units[0]).value) y_range = list(u.Quantity([bl[1], tr[1]]).to(self.spatial_units[1]).value) imshow_args.update({'extent': x_range + y_range}) imshow_args.update(imshow_kwargs) if self.mask is None: ret = axes.imshow(self.data, **imshow_args) else: ret = axes.imshow(np.ma.array(np.asarray(self.data), mask=self.mask), **imshow_args) if wcsaxes_compat.is_wcsaxes(axes): wcsaxes_compat.default_wcs_grid(axes, units=self.spatial_units, ctypes=self.wcs.wcs.ctype) # Set current image (makes colorbar work) plt.sca(axes) plt.sci(ret) return ret class InvalidHeaderInformation(ValueError): """Exception to raise when an invalid header tag value is encountered for a FITS/JPEG 2000 file.""" pass sunpy-0.8.3/sunpy/map/mapcube.py0000644000175000017500000003011113232563447017022 0ustar nabilnabil00000000000000"""A Python MapCube Object""" from __future__ import absolute_import, division, print_function #pylint: disable=W0401,W0614,W0201,W0212,W0404 from copy import deepcopy import numpy as np import matplotlib.animation import numpy.ma as ma import astropy.units as u from sunpy.map import GenericMap from sunpy.visualization.mapcubeanimator import MapCubeAnimator from sunpy.visualization import wcsaxes_compat from sunpy.visualization import axis_labels_from_ctype from sunpy.util import expand_list from sunpy.extern.six.moves import range __all__ = ['MapCube'] class MapCube(object): """ MapCube A series of spatially aligned Maps. Parameters ---------- args : {List} A list of Map instances sortby : {"date", None} Method by which the MapCube should be sorted along the z-axis. derotate : {None} Apply a derotation to the data (Not Implemented) To coalign a mapcube so that solar features remain on the same pixels, please see the "Coalignment of mapcubes" note below. Attributes ---------- maps : {List} This attribute holds the list of Map instances obtained from parameter args. Examples -------- >>> import sunpy.map >>> mapcube = sunpy.map.Map('images/*.fits', cube=True) # doctest: +SKIP Mapcubes can be co-aligned using the routines in sunpy.image.coalignment. """ #pylint: disable=W0613,E1101 def __init__(self, *args, **kwargs): """Creates a new Map instance""" # Hack to get around Python 2.x not backporting PEP 3102. sortby = kwargs.pop('sortby', 'date') derotate = kwargs.pop('derotate', False) self.maps = expand_list(args) for m in self.maps: if not isinstance(m, GenericMap): raise ValueError( 'MapCube expects pre-constructed map objects.') # Optionally sort data if sortby is not None: if sortby is 'date': self.maps.sort(key=self._sort_by_date()) else: raise ValueError("Only sort by date is supported") if derotate: self._derotate() def __getitem__(self, key): """Overriding indexing operation. If the key results in a single map, then a map object is returned. This allows functions like enumerate to work. Otherwise, a mapcube is returned.""" if isinstance(self.maps[key], GenericMap): return self.maps[key] else: return MapCube(self.maps[key]) def __len__(self): """Return the number of maps in a mapcube.""" return len(self.maps) # Sorting methods @classmethod def _sort_by_date(cls): return lambda m: m.date # maps.sort(key=attrgetter('date')) def _derotate(self): """Derotates the layers in the MapCube""" pass def plot(self, axes=None, resample=None, annotate=True, interval=200, plot_function=None, **kwargs): """ A animation plotting routine that animates each element in the MapCube Parameters ---------- gamma: float Gamma value to use for the color map axes: mpl axes axes to plot the animation on, if none uses current axes resample: list or False Draws the map at a lower resolution to increase the speed of animation. Specify a list as a fraction i.e. [0.25, 0.25] to plot at 1/4 resolution. [Note: this will only work where the map arrays are the same size] annotate: bool Annotate the figure with scale and titles interval: int Animation interval in ms plot_function : function A function to be called as each map is plotted. Any variables returned from the function will have their ``remove()`` method called at the start of the next frame so that they are removed from the plot. Examples -------- >>> import matplotlib.pyplot as plt >>> import matplotlib.animation as animation >>> from sunpy.map import Map >>> cube = Map(files, cube=True) # doctest: +SKIP >>> ani = cube.plot(colorbar=True) # doctest: +SKIP >>> plt.show() # doctest: +SKIP Plot the map at 1/2 original resolution >>> cube = Map(files, cube=True) # doctest: +SKIP >>> ani = cube.plot(resample=[0.5, 0.5], colorbar=True) # doctest: +SKIP >>> plt.show() # doctest: +SKIP Save an animation of the MapCube >>> cube = Map(res, cube=True) # doctest: +SKIP >>> ani = cube.plot() # doctest: +SKIP >>> Writer = animation.writers['ffmpeg'] # doctest: +SKIP >>> writer = Writer(fps=10, metadata=dict(artist='SunPy'), bitrate=1800) # doctest: +SKIP >>> ani.save('mapcube_animation.mp4', writer=writer) # doctest: +SKIP Save an animation with the limb at each time step >>> def myplot(fig, ax, sunpy_map): ... p = sunpy_map.draw_limb() ... return p >>> cube = Map(files, cube=True) # doctest: +SKIP >>> ani = cube.peek(plot_function=myplot) # doctest: +SKIP >>> plt.show() # doctest: +SKIP """ if not axes: axes = wcsaxes_compat.gca_wcs(self.maps[0].wcs) fig = axes.get_figure() if not plot_function: plot_function = lambda fig, ax, smap: [] removes = [] # Normal plot def annotate_frame(i): axes.set_title("{s.name}".format(s=self[i])) axes.set_xlabel(axis_labels_from_ctype(self[i].coordinate_system[0], self[i].spatial_units[0])) axes.set_ylabel(axis_labels_from_ctype(self[i].coordinate_system[1], self[i].spatial_units[1])) if resample: if self.all_maps_same_shape(): resample = u.Quantity(self.maps[0].dimensions) * np.array(resample) ani_data = [amap.resample(resample) for amap in self.maps] else: raise ValueError('Maps in mapcube do not all have the same shape.') else: ani_data = self.maps im = ani_data[0].plot(axes=axes, **kwargs) def updatefig(i, im, annotate, ani_data, removes): while removes: removes.pop(0).remove() im.set_array(ani_data[i].data) im.set_cmap(ani_data[i].plot_settings['cmap']) norm = deepcopy(ani_data[i].plot_settings['norm']) # The following explicit call is for bugged versions of Astropy's # ImageNormalize norm.autoscale_None(ani_data[i].data) im.set_norm(norm) if wcsaxes_compat.is_wcsaxes(axes): im.axes.reset_wcs(ani_data[i].wcs) wcsaxes_compat.default_wcs_grid(axes) else: im.set_extent(np.concatenate((ani_data[i].xrange.value, ani_data[i].yrange.value))) if annotate: annotate_frame(i) removes += list(plot_function(fig, axes, ani_data[i])) ani = matplotlib.animation.FuncAnimation(fig, updatefig, frames=list(range(0, len(ani_data))), fargs=[im, annotate, ani_data, removes], interval=interval, blit=False) return ani def peek(self, resample=None, **kwargs): """ A animation plotting routine that animates each element in the MapCube Parameters ---------- fig: mpl.figure Figure to use to create the explorer resample: list or False Draws the map at a lower resolution to increase the speed of animation. Specify a list as a fraction i.e. [0.25, 0.25] to plot at 1/4 resolution. [Note: this will only work where the map arrays are the same size] annotate: bool Annotate the figure with scale and titles interval: int Animation interval in ms colorbar: bool Plot colorbar plot_function : function A function to call to overplot extra items on the map plot. For more information see `sunpy.visualization.MapCubeAnimator`. Returns ------- mapcubeanim : `sunpy.visualization.MapCubeAnimator` A mapcube animator instance. See Also -------- sunpy.visualization.mapcubeanimator.MapCubeAnimator Examples -------- >>> import matplotlib.pyplot as plt >>> from sunpy.map import Map >>> cube = Map(files, cube=True) # doctest: +SKIP >>> ani = cube.peek(colorbar=True) # doctest: +SKIP >>> plt.show() # doctest: +SKIP Plot the map at 1/2 original resolution >>> cube = Map(files, cube=True) # doctest: +SKIP >>> ani = cube.peek(resample=[0.5, 0.5], colorbar=True) # doctest: +SKIP >>> plt.show() # doctest: +SKIP Plot the map with the limb at each time step >>> def myplot(fig, ax, sunpy_map): ... p = sunpy_map.draw_limb() ... return p >>> cube = Map(files, cube=True) # doctest: +SKIP >>> ani = cube.peek(plot_function=myplot) # doctest: +SKIP >>> plt.show() # doctest: +SKIP Decide you want an animation: >>> cube = Map(files, cube=True) # doctest: +SKIP >>> ani = cube.peek(resample=[0.5, 0.5], colorbar=True) # doctest: +SKIP >>> mplani = ani.get_animation() # doctest: +SKIP """ if resample: if self.all_maps_same_shape(): plot_cube = MapCube() resample = u.Quantity(self.maps[0].dimensions) * np.array(resample) for amap in self.maps: plot_cube.maps.append(amap.resample(resample)) else: raise ValueError('Maps in mapcube do not all have the same shape.') else: plot_cube = self return MapCubeAnimator(plot_cube, **kwargs) def all_maps_same_shape(self): """ Tests if all the maps have the same number pixels in the x and y directions. """ return np.all([m.data.shape == self.maps[0].data.shape for m in self.maps]) def at_least_one_map_has_mask(self): """ Tests if at least one map has a mask. """ return np.any([m.mask is not None for m in self.maps]) def as_array(self): """ If all the map shapes are the same, their image data is rendered into the appropriate numpy object. If none of the maps have masks, then the data is returned as a (ny, nx, nt) ndarray. If all the maps have masks, then the data is returned as a (ny, nx, nt) masked array with all the masks copied from each map. If only some of the maps have masked then the data is returned as a (ny, nx, nt) masked array, with masks copied from maps as appropriately; maps that do not have a mask are supplied with a mask that is full of False entries. If all the map shapes are not the same, a ValueError is thrown. """ if self.all_maps_same_shape(): data = np.swapaxes(np.swapaxes(np.asarray([m.data for m in self.maps]), 0, 1).copy(), 1, 2).copy() if self.at_least_one_map_has_mask(): mask_cube = np.zeros_like(data, dtype=bool) for im, m in enumerate(self.maps): if m.mask is not None: mask_cube[:, :, im] = m.mask return ma.masked_array(data, mask=mask_cube) else: return data else: raise ValueError('Not all maps have the same shape.') def all_meta(self): """ Return all the meta objects as a list. """ return [m.meta for m in self.maps] sunpy-0.8.3/sunpy/net/0000755000175000017500000000000013232563477015054 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/net/dataretriever/0000755000175000017500000000000013232563477017715 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/net/dataretriever/attrs/0000755000175000017500000000000013232563477021052 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/net/dataretriever/attrs/__init__.py0000644000175000017500000000004713231613140023142 0ustar nabilnabil00000000000000from . import goes __all__ = ['goes'] sunpy-0.8.3/sunpy/net/dataretriever/attrs/goes.py0000644000175000017500000000023613231613140022340 0ustar nabilnabil00000000000000from ...vso.attrs import _VSOSimpleAttr __all__ = ['SatelliteNumber'] class SatelliteNumber(_VSOSimpleAttr): """ The GOES Satellite Number """ sunpy-0.8.3/sunpy/net/dataretriever/sources/0000755000175000017500000000000013232563477021400 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/net/dataretriever/sources/__init__.py0000644000175000017500000000062113231613140023466 0ustar nabilnabil00000000000000from __future__ import absolute_import, division, print_function __all__ = [ 'EVEClient', 'XRSClient', 'LYRAClient', 'NOAAIndicesClient', 'NOAAPredictClient', 'NoRHClient', 'RHESSIClient' ] from .eve import EVEClient from .goes import XRSClient from .lyra import LYRAClient from .noaa import NOAAIndicesClient, NOAAPredictClient from .norh import NoRHClient from .rhessi import RHESSIClient sunpy-0.8.3/sunpy/net/dataretriever/sources/eve.py0000644000175000017500000000673513231613140022522 0ustar nabilnabil00000000000000# Author: Rishabh Sharma # This module was developed under funding by # Google Summer of Code 2014 from __future__ import absolute_import, division, print_function import datetime from sunpy.time import TimeRange from sunpy.util.scraper import Scraper from sunpy.extern.six.moves.urllib.parse import urljoin from ..client import GenericClient __all__ = ['EVEClient'] BASEURL = ('http://lasp.colorado.edu/eve/data_access/evewebdata/quicklook/' 'L0CS/SpWx/%Y/%Y%m%d_EVE_L0CS_DIODES_1m.txt') class EVEClient(GenericClient): """ This EVEClient is for the Level 0C data from http://lasp.colorado.edu/home/eve/data/data-access/. To use this client you must request Level 0 data. Examples -------- >>> from sunpy.net import Fido, attrs as a >>> results = Fido.search(a.Time("2016/1/1", "2016/1/2"), ... a.Instrument('EVE'), a.Level(0)) #doctest: +REMOTE_DATA >>> results #doctest: +SKIP ... Results from 1 Provider: 2 Results from the EVEClient: Start Time End Time Source Instrument Wavelength str19 str19 str3 str3 str3 ------------------- ------------------- ------ ---------- ---------- 2016-01-01 00:00:00 2016-01-02 00:00:00 SDO eve nan 2016-01-02 00:00:00 2016-01-03 00:00:00 SDO eve nan """ def _get_url_for_timerange(self, timerange, **kwargs): """ Returns list of URLS corresponding to value of input timerange. Parameters ---------- timerange: `sunpy.time.TimeRange` time range for which data is to be downloaded. Returns ------- urls : list list of URLs corresponding to the requested time range """ # If start of time range is before 00:00, converted to such, so # files of the requested time ranger are included. # This is done because the archive contains daily files. if timerange.start.time() != datetime.time(0, 0): timerange = TimeRange('{:%Y-%m-%d}'.format(timerange.start), timerange.end) eve = Scraper(BASEURL) return eve.filelist(timerange) def _get_time_for_url(self, urls): eve = Scraper(BASEURL) times = list() for url in urls: t0 = eve._extractDateURL(url) # hard coded full day as that's the normal. times.append(TimeRange(t0, t0 + datetime.timedelta(days=1))) return times def _makeimap(self): """ Helper Function: used to hold information about source. """ self.map_['source'] = 'SDO' self.map_['provider'] = 'LASP' self.map_['instrument'] = 'eve' self.map_['physobs'] = 'irradiance' @classmethod def _can_handle_query(cls, *query): """ Answers whether client can service the query. Parameters ---------- query : list of query objects Returns ------- boolean answer as to whether client can service the query """ chk_var = 0 for x in query: if x.__class__.__name__ == 'Instrument' and x.value.lower() == 'eve': chk_var += 1 elif x.__class__.__name__ == 'Level' and x.value == 0: chk_var += 1 if chk_var == 2: return True return False sunpy-0.8.3/sunpy/net/dataretriever/sources/goes.py0000644000175000017500000001210213232563373022676 0ustar nabilnabil00000000000000# Author: Rishabh Sharma # This module was developed under funding provided by # Google Summer of Code 2014 import os import datetime from sunpy.time import parse_time, TimeRange from ..client import GenericClient from sunpy.extern.six.moves.urllib.parse import urlsplit from sunpy import config TIME_FORMAT = config.get("general", "time_format") __all__ = ['XRSClient'] class XRSClient(GenericClient): def _get_goes_sat_num(self, date): """ Determines the satellite number for a given date. Parameters ---------- date : `datetime.datetime` The date to determine which satellite is active. """ goes_operational = { 2: TimeRange('1981-01-01', '1983-04-30'), 5: TimeRange('1983-05-02', '1984-07-31'), 6: TimeRange('1983-06-01', '1994-08-18'), 7: TimeRange('1994-01-01', '1996-08-13'), 8: TimeRange('1996-03-21', '2003-06-18'), 9: TimeRange('1997-01-01', '1998-09-08'), 10: TimeRange('1998-07-10', '2009-12-01'), 11: TimeRange('2006-06-20', '2008-02-15'), 12: TimeRange('2002-12-13', '2007-05-08'), 13: TimeRange('2006-08-01', '2006-08-01'), 14: TimeRange('2009-12-02', '2010-10-04'), 15: TimeRange('2010-09-01', datetime.datetime.utcnow()) } results = [] for sat_num in goes_operational: if date in goes_operational[sat_num]: # if true then the satellite with sat_num is available results.append(sat_num) if results: # Return the newest satellite return max(results) else: # if no satellites were found then raise an exception raise ValueError('No operational GOES satellites on {}'.format( date.strftime(TIME_FORMAT))) def _get_time_for_url(self, urls): times = [] for uri in urls: uripath = urlsplit(uri).path # Extract the yymmdd or yyyymmdd timestamp datestamp = os.path.splitext(os.path.split(uripath)[1])[0][4:] # 1999-01-15 as an integer. if int(datestamp) < 990115: start = datetime.datetime.strptime(datestamp, "%y%m%d") else: start = datetime.datetime.strptime(datestamp, "%Y%m%d") almost_day = datetime.timedelta(days=1, milliseconds=-1) times.append(TimeRange(start, start + almost_day)) return times def _get_url_for_timerange(self, timerange, **kwargs): """ Returns a URL to the GOES data for the specified date. Parameters ---------- timerange: sunpy.time.TimeRange time range for which data is to be downloaded. satellitenumber : int GOES satellite number (default = 15) data_type : string Data type to return for the particular GOES satellite. Supported types depend on the satellite number specified. (default = xrs_2s) """ # find out which satellite and datatype to query from the query times base_url = 'http://umbra.nascom.nasa.gov/goes/fits/' start_time = datetime.datetime.combine(timerange.start.date(), datetime.datetime.min.time()) # make sure we are counting a day even if only a part of it is in the query range. day_range = TimeRange(timerange.start.date(), timerange.end.date()) total_days = int(day_range.days.value) + 1 result = list() # Iterate over each day in the input timerange and generate a URL for # it. for day in range(total_days): date = start_time + datetime.timedelta(days=day) regex = "{date:%Y}/go{sat:02d}" if (date < parse_time('1999/01/15')): regex += "{date:%y%m%d}.fits" else: regex += "{date:%Y%m%d}.fits" satellitenumber = kwargs.get('satellitenumber', self._get_goes_sat_num(date)) url = base_url + regex.format( date=date, sat=satellitenumber) result.append(url) return result def _makeimap(self): """ Helper function used to hold information about source. """ self.map_['source'] = 'nasa' self.map_['instrument'] = 'goes' self.map_['physobs'] = 'irradiance' self.map_['provider'] = 'sdac' @classmethod def _can_handle_query(cls, *query): """ Answers whether client can service the query. Parameters ---------- query : list of query objects Returns ------- boolean answer as to whether client can service the query """ chkattr = ['Time', 'Instrument', 'SatelliteNumber'] chklist = [x.__class__.__name__ in chkattr for x in query] for x in query: if x.__class__.__name__ == 'Instrument' and x.value.lower() in ('xrs', 'goes'): return all(chklist) return False sunpy-0.8.3/sunpy/net/dataretriever/sources/lyra.py0000644000175000017500000000442613231613140022705 0ustar nabilnabil00000000000000# Author: Rishabh Sharma # This module was developed under funding provided by # Google Summer of Code 2014 import datetime from sunpy.extern.six.moves.urllib.parse import urljoin from ..client import GenericClient __all__ = ['LYRAClient'] class LYRAClient(GenericClient): def _get_url_for_timerange(self, timerange, **kwargs): """ Returns list of URLS corresponding to value of input timerange. Parameters ---------- timerange: sunpy.time.TimeRange time range for which data is to be downloaded. Returns ------- urls : list list of URLs corresponding to the requested time range """ days = timerange.get_dates() urls = [] for day in days: urls.append(self._get_url_for_date(day, **kwargs)) return urls def _get_url_for_date(self, date, **kwargs): """ Return URL for corresponding date. Parameters ---------- date : Python datetime object Returns ------- string The URL for the corresponding date. """ filename = "lyra_{0:%Y%m%d-}000000_lev{1:d}_std.fits".format(date, kwargs.get('level', 2)) base_url = "http://proba2.oma.be/lyra/data/bsd/" url_path = urljoin(date.strftime('%Y/%m/%d/'), filename) return urljoin(base_url, url_path) def _makeimap(self): """ Helper Function:used to hold information about source. """ self.map_['source'] = 'Proba2' self.map_['instrument'] = 'lyra' self.map_['physobs'] = 'irradiance' self.map_['provider'] = 'esa' @classmethod def _can_handle_query(cls, *query): """ Answers whether client can service the query. Parameters ---------- query : list of query objects Returns ------- boolean answer as to whether client can service the query """ chkattr = ['Time', 'Instrument', 'Level'] chklist = [x.__class__.__name__ in chkattr for x in query] for x in query: if x.__class__.__name__ == 'Instrument' and x.value.lower() == 'lyra': return all(chklist) return False sunpy-0.8.3/sunpy/net/dataretriever/sources/noaa.py0000644000175000017500000001775513231613140022665 0ustar nabilnabil00000000000000# Author: Rishabh Sharma # This module was developed under funding provided by # Google Summer of Code 2014 from ..client import GenericClient import datetime import os import tarfile from functools import partial from collections import OrderedDict import sunpy from sunpy.util import replacement_filename, deprecated from sunpy.net.dataretriever.client import simple_path from sunpy.net.download import Downloader, Results __all__ = ['NOAAIndicesClient', 'NOAAPredictClient', 'SRSClient'] class NOAAIndicesClient(GenericClient): @staticmethod def _get_default_uri(): """Return the url to download indices""" return ["ftp://ftp.swpc.noaa.gov/pub/weekly/RecentIndices.txt"] def _get_url_for_timerange(self, timerange, **kwargs): """ Helper function: """ return NOAAIndicesClient._get_default_uri() def _makeimap(self): """ Helper Function:used to hold information about source. """ self.map_['source'] = 'sdic' self.map_['instrument'] = 'noaa-indices' self.map_['physobs'] = 'sunspot number' self.map_['provider'] = 'swpc' @classmethod def _can_handle_query(cls, *query): """ Answers whether client can service the query. Parameters ---------- query : list of query objects Returns ------- boolean answer as to whether client can service the query """ chkattr = ['Time', 'Instrument'] chklist = [x.__class__.__name__ in chkattr for x in query] for x in query: if x.__class__.__name__ == 'Instrument' and x.value == 'noaa-indices': return all(chklist) return False class NOAAPredictClient(GenericClient): @staticmethod def _get_default_uri(): """Return the url to download indices""" return ["http://services.swpc.noaa.gov/text/predicted-sunspot-radio-flux.txt"] def _get_url_for_timerange(self, timerange, **kwargs): """ Helper function: """ return NOAAPredictClient._get_default_uri() def _makeimap(self): """ Helper Function:used to hold information about source. """ self.map_['source'] = 'ises' self.map_['instrument'] = 'noaa-predict' self.map_['physobs'] = 'sunspot number' self.map_['provider'] = 'swpc' @classmethod def _can_handle_query(cls, *query): """ Answers whether client can service the query. Parameters ---------- query : list of query objects Returns ------- boolean answer as to whether client can service the query """ chkattr = ['Time', 'Instrument'] chklist = [x.__class__.__name__ in chkattr for x in query] for x in query: if x.__class__.__name__ == 'Instrument' and x.value.lower() == 'noaa-predict': return all(chklist) return False class SRSClient(GenericClient): @staticmethod def _get_default_uri(): today = datetime.datetime.utcnow() return [('ftp://ftp.swpc.noaa.gov/pub/warehouse/', '{date:%Y}/SRS/{date:%Y%m%d}SRS.txt').format(date=today)] def _get_url_for_timerange(self, timerange, **kwargs): if not timerange: return SRSClient._get_default_uri() result = list() base_url = 'ftp://ftp.swpc.noaa.gov/pub/warehouse/' total_days = (timerange.end - timerange.start).days + 1 all_dates = timerange.split(total_days) today_year = datetime.datetime.utcnow().year for day in all_dates: if today_year == day.end.year: suffix = '{date:%Y}/SRS/{date:%Y%m%d}SRS.txt' else: suffix = '{date:%Y}/{date:%Y}_SRS.tar.gz' url = base_url + suffix.format(date=day.end) result.append(url) return result def fetch(self, qres, path=None, error_callback=None, **kwargs): """ Download a set of results. Parameters ---------- qres : `~sunpy.net.dataretriever.QueryResponse` Results to download. Returns ------- Results Object """ urls = [qrblock.url for qrblock in qres] filenames = [] local_filenames = [] for i, [url, qre] in enumerate(zip(urls, qres)): name = url.split('/')[-1] # temporary fix !!! coz All QRBs have same start_time values day = qre.time.start.date() + datetime.timedelta(days=i) if name not in filenames: filenames.append(name) if name.endswith('.gz'): local_filenames.append('{date:%Y%m%d}SRS.txt'.format(date=day)) else: local_filenames.append(name) # Files to be actually downloaded paths = self._get_full_filenames(qres, filenames, path) # Those files that will be present after get returns local_paths = self._get_full_filenames(qres, local_filenames, path) res = Results(lambda x: None, 0, lambda map_: self._link(map_)) # remove duplicate urls. This will make paths and urls to have same number of elements. # OrderedDict is required to maintain ordering because it will be zipped with paths later urls = list(OrderedDict.fromkeys(urls)) dobj = Downloader(max_conn=len(urls), max_total=len(urls)) # We cast to list here in list(zip... to force execution of # res.require([x]) at the start of the loop. for aurl, ncall, fname in list(zip(urls, map(lambda x: res.require([x]), urls), paths)): dobj.download(aurl, fname, ncall, error_callback) res.wait() res2 = Results(lambda x: None, 0) for fname, srs_filename in zip(local_paths, local_filenames): fname = fname.args[0] name = fname.split('/')[-1] past_year = False for i, fname2 in enumerate(paths): fname2 = fname2.args[0] if fname2.endswith('.txt'): continue year = fname2.split('/')[-1] year = year.split('_SRS')[0] if year in name: TarFile = tarfile.open(fname2) filepath = fname.rpartition('/')[0] member = TarFile.getmember('SRS/' + srs_filename) member.name = name TarFile.extract(member, path=filepath) TarFile.close() callback = res2.require([fname]) callback({'path': fname}) past_year = True break if past_year is False: callback = res2.require([fname]) callback({'path': fname}) return res2 @deprecated('0.8', alternative='NOAAPredictClient.fetch') def get(self, qres, path=None, error_callback=None, **kwargs): """ See `~sunpy.net.dataretriever.sources.noaa.NOAAPredictClient.fetch` """ return self.fetch(qres, path=path, error_callback=error_callback, **kwargs) def _makeimap(self): self.map_['source'] = 'swpc' self.map_['instrument'] = 'SOON' self.map_['physobs'] = 'SRS' self.map_['source'] = 'NOAA/USAF' @classmethod def _can_handle_query(cls, *query): """ Answers whether client can service the query. Parameters ---------- query : list of query objects Returns ------- boolean answer as to whether client can service the query """ chkattr = ["Time", "Instrument"] chklist = [x.__class__.__name__ in chkattr for x in query] for x in query: if x.__class__.__name__ == "Instrument" and\ str(x.value).lower() in ["soon", "srs_table"]: return True return False sunpy-0.8.3/sunpy/net/dataretriever/sources/norh.py0000644000175000017500000001022313231613140022674 0ustar nabilnabil00000000000000# Author: Rishabh Sharma # This Module was developed under funding provided by # Google Summer of Code 2014 import datetime import astropy.units as u from sunpy.time import TimeRange from sunpy.util.scraper import Scraper from sunpy.net import attrs as a from ..client import GenericClient __all__ = ['NoRHClient'] BASEURL = 'ftp://solar-pub.nao.ac.jp/pub/nsro/norh/data/tcx/%Y/%m/{freq}%y%m%d' class NoRHClient(GenericClient): def _get_url_for_timerange(self, timerange, **kwargs): """ Returns list of URLS corresponding to value of input timerange. Parameters ---------- timerange: `sunpy.time.TimeRange` time range for which data is to be downloaded. Returns ------- urls : list list of URLs corresponding to the requested time range """ # We allow queries with no Wavelength but error here so that the query # does not get passed to VSO and spit out garbage. if 'wavelength' not in kwargs.keys() or not kwargs['wavelength']: raise ValueError("Queries to NORH should specify either 17GHz or 34GHz as a Wavelength." "see http://solar.nro.nao.ac.jp/norh/doc/manuale/node65.html") else: wavelength = kwargs['wavelength'] # If wavelength is a single value GenericClient will have made it a # Quantity in the kwargs. if not isinstance(wavelength, u.Quantity): raise ValueError("Wavelength to NORH must be one value not {}.".format(wavelength)) wavelength = wavelength.to(u.GHz, equivalencies=u.spectral()) if wavelength == 34 * u.GHz: freq = 'tcz' elif wavelength == 17 * u.GHz: freq = 'tca' else: raise ValueError("NORH Data can be downloaded for 17GHz or 34GHz," " see http://solar.nro.nao.ac.jp/norh/doc/manuale/node65.html") # If start of time range is before 00:00, converted to such, so # files of the requested time ranger are included. # This is done because the archive contains daily files. if timerange.start.time() != datetime.time(0, 0): timerange = TimeRange('{:%Y-%m-%d}'.format(timerange.start), timerange.end) norh = Scraper(BASEURL, freq=freq) # TODO: warn user that some files may have not been listed, like for example: # tca160504_224657 on ftp://solar-pub.nao.ac.jp/pub/nsro/norh/data/tcx/2016/05/ # as it doesn't follow pattern. return norh.filelist(timerange) def _get_time_for_url(self, urls): freq = urls[0].split('/')[-1][0:3] # extract the frequency label crawler = Scraper(BASEURL, freq=freq) times = list() for url in urls: t0 = crawler._extractDateURL(url) # hard coded full day as that's the normal. times.append(TimeRange(t0, t0 + datetime.timedelta(days=1))) return times def _makeimap(self): """ Helper Function used to hold information about source. """ self.map_['source'] = 'NAOJ' self.map_['provider'] = 'NRO' self.map_['instrument'] = 'NORH' self.map_['physobs'] = '' @classmethod def _can_handle_query(cls, *query): """ Answers whether client can service the query. Parameters ---------- query : list of query objects Returns ------- boolean answer as to whether client can service the query """ required = {a.Time, a.Instrument} optional = {a.Wavelength} all_attrs = {type(x) for x in query} ops = all_attrs - required # If ops is empty or equal to optional we are ok, otherwise we don't # match if ops and ops != optional: return False # if we get this far we have either Instrument and Time # or Instrument, Time and Wavelength for x in query: if isinstance(x, a.Instrument) and x.value.lower() == 'norh': return True return False sunpy-0.8.3/sunpy/net/dataretriever/sources/rhessi.py0000644000175000017500000000306013231613140023224 0ustar nabilnabil00000000000000# Author: Rishabh Sharma # This module was developed under funding provided by # Google Summer of Code 2014 from sunpy.instr import rhessi from ..client import GenericClient __all__ = ['RHESSIClient'] class RHESSIClient(GenericClient): def _get_url_for_timerange(self, timerange, **kwargs): """ Returns a URL to the RHESSI data for the specified date range. Parameters ---------- args : TimeRange, datetimes, date strings Date range should be specified using a TimeRange, or start and end dates at datetime instances or date strings. """ return rhessi.get_obssum_filename(timerange) def _makeimap(self): """ Helper Function:used to hold information about source. """ self.map_['source'] = 'rhessi' self.map_['instrument'] = 'rhessi' self.map_['physobs'] = 'irradiance' self.map_['provider'] = 'nasa' @classmethod def _can_handle_query(cls, *query): """ Answers whether client can service the query. Parameters ---------- query : list of query objects Returns ------- boolean answer as to whether client can service the query """ chkattr = ['Time', 'Instrument'] chklist = [x.__class__.__name__ in chkattr for x in query] for x in query: if x.__class__.__name__ == 'Instrument' and x.value.lower() == 'rhessi': return all(chklist) return False sunpy-0.8.3/sunpy/net/dataretriever/tests/0000755000175000017500000000000013232563477021057 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/net/dataretriever/tests/__init__.py0000644000175000017500000000000013231613140023134 0ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/net/dataretriever/tests/test_client.py0000644000175000017500000000070713231613140023730 0ustar nabilnabil00000000000000from sunpy.time import parse_time from sunpy.net.dataretriever.client import QueryResponse def test_reprs(): map_ = {} map_['Time_start'] = parse_time("2012/1/1") map_['Time_end'] = parse_time("2012/1/2") resp = QueryResponse.create(map_, ['']) assert isinstance(resp, QueryResponse) strs = ["2012-01-01 00:00:00", "2012-01-02 00:00:00"] assert all(s in str(resp) for s in strs) assert all(s in repr(resp) for s in strs) sunpy-0.8.3/sunpy/net/dataretriever/tests/test_eve.py0000644000175000017500000000762213232563447023253 0ustar nabilnabil00000000000000import datetime import pytest from sunpy.time import parse_time from sunpy.time.timerange import TimeRange from sunpy.net.vso import VSOClient from sunpy.net.vso.attrs import Time, Instrument, Source, Level from sunpy.net.dataretriever.client import QueryResponse import sunpy.net.dataretriever.sources.eve as eve from sunpy.net.fido_factory import UnifiedResponse from sunpy.net import Fido from sunpy.net import attrs as a from hypothesis import given, settings from hypothesis.extra.datetime import datetimes from sunpy.net.tests.strategies import time_attr LCClient = eve.EVEClient() @pytest.mark.remote_data @pytest.mark.parametrize("timerange,url_start,url_end", [ (TimeRange('2012/4/21', '2012/4/21'), 'http://lasp.colorado.edu/eve/data_access/evewebdata/quicklook/L0CS/SpWx/2012/20120421_EVE_L0CS_DIODES_1m.txt', 'http://lasp.colorado.edu/eve/data_access/evewebdata/quicklook/L0CS/SpWx/2012/20120421_EVE_L0CS_DIODES_1m.txt' ), (TimeRange('2012/5/5', '2012/5/6'), 'http://lasp.colorado.edu/eve/data_access/evewebdata/quicklook/L0CS/SpWx/2012/20120505_EVE_L0CS_DIODES_1m.txt', 'http://lasp.colorado.edu/eve/data_access/evewebdata/quicklook/L0CS/SpWx/2012/20120506_EVE_L0CS_DIODES_1m.txt' ), (TimeRange('2012/7/7', '2012/7/14'), 'http://lasp.colorado.edu/eve/data_access/evewebdata/quicklook/L0CS/SpWx/2012/20120707_EVE_L0CS_DIODES_1m.txt', 'http://lasp.colorado.edu/eve/data_access/evewebdata/quicklook/L0CS/SpWx/2012/20120714_EVE_L0CS_DIODES_1m.txt' ) ]) def test_get_url_for_time_range(timerange, url_start, url_end): urls = LCClient._get_url_for_timerange(timerange) assert isinstance(urls, list) assert urls[0] == url_start assert urls[-1] == url_end def test_can_handle_query(): ans1 = eve.EVEClient._can_handle_query( Time('2012/8/9', '2012/8/10'), Instrument('eve'), Level(0)) assert ans1 is True ans2 = eve.EVEClient._can_handle_query(Time('2012/7/7', '2012/7/7')) assert ans2 is False ans3 = eve.EVEClient._can_handle_query( Time('2012/8/9', '2012/8/10'), Instrument('eve'), Source('sdo')) assert ans3 is False @pytest.mark.remote_data def test_query(): qr1 = LCClient.search(Time('2012/8/9', '2012/8/10'), Instrument('eve')) assert isinstance(qr1, QueryResponse) assert len(qr1) == 2 assert qr1.time_range().start == parse_time('2012/08/09') assert qr1.time_range().end == parse_time('2012/08/11') # includes end. @pytest.mark.remote_data @pytest.mark.parametrize("time,instrument", [ (Time('2012/11/27', '2012/11/27'), Instrument('eve')), ]) def test_get(time, instrument): qr1 = LCClient.search(time, instrument) res = LCClient.fetch(qr1) download_list = res.wait(progress=False) assert len(download_list) == len(qr1) @pytest.mark.remote_data @pytest.mark.parametrize( 'query', [(a.Time('2012/10/4', '2012/10/6') & a.Instrument('eve') & a.Level(0))]) def test_fido(query): qr = Fido.search(query) client = qr.get_response(0).client assert isinstance(qr, UnifiedResponse) assert isinstance(client, eve.EVEClient) response = Fido.fetch(qr) assert len(response) == qr._numfile @pytest.mark.remote_data @given(time_attr(time=datetimes(timezones=[], max_year=datetime.datetime.utcnow().year, min_year=2010))) @settings(max_examples=2, timeout=240) def test_levels(time): """ Test the correct handling of level 0 / 1. The default should be level 1 from VSO, level 0 comes from EVEClient. """ eve_a = a.Instrument('EVE') qr = Fido.search(time, eve_a) client = qr.get_response(0).client assert isinstance(client, VSOClient) qr = Fido.search(time, eve_a, a.Level(0)) client = qr.get_response(0).client assert isinstance(client, eve.EVEClient) qr = Fido.search(time, eve_a, a.Level(0) | a.Level(1)) clients = {type(a.client) for a in qr.responses} assert clients.symmetric_difference({VSOClient, eve.EVEClient}) == set() sunpy-0.8.3/sunpy/net/dataretriever/tests/test_goes_ud.py0000644000175000017500000001034613232563373024114 0ustar nabilnabil00000000000000import pytest import datetime from sunpy.time.timerange import TimeRange, parse_time from sunpy.net.vso.attrs import Time, Instrument from sunpy.net.dataretriever.client import QueryResponse import sunpy.net.dataretriever.sources.goes as goes from sunpy.net.fido_factory import UnifiedResponse from sunpy.net import Fido from sunpy.net import attrs as a from hypothesis import given, example from sunpy.net.tests.strategies import goes_time LCClient = goes.XRSClient() @pytest.mark.parametrize( "timerange,url_start,url_end", [(TimeRange('1995/06/03', '1995/06/05'), 'http://umbra.nascom.nasa.gov/goes/fits/1995/go07950603.fits', 'http://umbra.nascom.nasa.gov/goes/fits/1995/go07950605.fits'), (TimeRange('2008/06/02', '2008/06/04'), 'http://umbra.nascom.nasa.gov/goes/fits/2008/go1020080602.fits', 'http://umbra.nascom.nasa.gov/goes/fits/2008/go1020080604.fits')]) def test_get_url_for_time_range(timerange, url_start, url_end): urls = LCClient._get_url_for_timerange(timerange) assert isinstance(urls, list) assert urls[0] == url_start assert urls[-1] == url_end @given(goes_time()) def test_can_handle_query(time): ans1 = goes.XRSClient._can_handle_query(time, Instrument('XRS')) assert ans1 is True ans2 = goes.XRSClient._can_handle_query(time) assert ans2 is False ans3 = goes.XRSClient._can_handle_query(time, Instrument('eve')) assert ans3 is False def test_no_satellite(): with pytest.raises(ValueError): LCClient.search(Time("1950/01/01", "1950/02/02"), Instrument('XRS')) def test_fixed_satellite(): ans1 = LCClient.search(a.Time("2017/01/01", "2017/01/02"), a.Instrument('XRS')) for resp in ans1: assert "go15" in resp.url ans1 = LCClient.search(a.Time("2017/01/01", "2017/01/02"), a.Instrument('XRS'), a.goes.SatelliteNumber(13)) for resp in ans1: assert "go13" in resp.url @example(a.Time("2006-08-01", "2006-08-01")) # This example tests a time range with a satellite jump and no overlap @example(a.Time("2009-11-30", "2009-12-3")) @given(goes_time()) def test_query(time): qr1 = LCClient.search(time, Instrument('XRS')) assert isinstance(qr1, QueryResponse) # We only compare dates here as the start time of the qr will always be the # start of the day. assert qr1.time_range().start.date() == time.start.date() almost_day = datetime.timedelta(days=1, milliseconds=-1) end = datetime.datetime.combine(time.end.date(), datetime.time()) + almost_day assert qr1.time_range().end == end def test_query_error(): times = [a.Time("1983-05-01", "1983-05-02")] for time in times: with pytest.raises(ValueError): LCClient.search(time, Instrument('XRS')) @pytest.mark.skip(reason="Hangs with pytest only") @pytest.mark.remote_data @pytest.mark.parametrize("time, instrument", [ (Time('1983/06/17', '1983/06/18'), Instrument('XRS')), (Time('2012/10/4', '2012/10/6'), Instrument('XRS')), ]) def test_get(time, instrument): qr1 = LCClient.search(time, instrument) res = LCClient.fetch(qr1) download_list = res.wait(progress=False) assert len(download_list) == len(qr1) @pytest.mark.skip(reason="Hangs with pytest only") @pytest.mark.remote_data def test_new_logic(): qr = LCClient.search(Time('2012/10/4', '2012/10/6'), Instrument('XRS')) res = LCClient.fetch(qr) download_list = res.wait(progress=False) assert len(download_list) == len(qr) @pytest.mark.remote_data @pytest.mark.parametrize( "time, instrument", [(a.Time("2012/10/4", "2012/10/6"), a.Instrument("goes")), (a.Time('2013/10/5', '2013/10/7'), a.Instrument("goes"))]) def test_fido(time, instrument): qr = Fido.search(a.Time('2012/10/4', '2012/10/6'), Instrument('XRS')) assert isinstance(qr, UnifiedResponse) response = Fido.fetch(qr) assert len(response) == qr._numfile @given(goes_time()) def test_time_for_url(time): time = time.start.date().strftime("%Y/%m/%d") almost_day = datetime.timedelta(days=1, milliseconds=-1) tr = TimeRange(time, almost_day) url = LCClient._get_url_for_timerange(tr) times = LCClient._get_time_for_url(url) assert all([tr == t2 for t2 in times]) sunpy-0.8.3/sunpy/net/dataretriever/tests/test_lyra_ud.py0000644000175000017500000000544113231613140024111 0ustar nabilnabil00000000000000import datetime import pytest from sunpy.time.timerange import TimeRange from sunpy.net.vso.attrs import Time, Instrument, Source from sunpy.net.dataretriever.client import QueryResponse import sunpy.net.dataretriever.sources.lyra as lyra from sunpy.net.fido_factory import UnifiedResponse from sunpy.net import Fido from sunpy.net import attrs as a from hypothesis import given from sunpy.net.tests.strategies import time_attr LCClient = lyra.LYRAClient() @pytest.mark.parametrize("timerange,url_start,url_end", [ (TimeRange('2012/1/7', '2012/1/7'), 'http://proba2.oma.be/lyra/data/bsd/2012/01/07/lyra_20120107-000000_lev2_std.fits', 'http://proba2.oma.be/lyra/data/bsd/2012/01/07/lyra_20120107-000000_lev2_std.fits' ), (TimeRange('2012/12/1', '2012/12/2'), 'http://proba2.oma.be/lyra/data/bsd/2012/12/01/lyra_20121201-000000_lev2_std.fits', 'http://proba2.oma.be/lyra/data/bsd/2012/12/02/lyra_20121202-000000_lev2_std.fits' ), (TimeRange('2012/4/7', '2012/4/14'), 'http://proba2.oma.be/lyra/data/bsd/2012/04/07/lyra_20120407-000000_lev2_std.fits', 'http://proba2.oma.be/lyra/data/bsd/2012/04/14/lyra_20120414-000000_lev2_std.fits' ) ]) def test_get_url_for_time_range(timerange, url_start, url_end): urls = LCClient._get_url_for_timerange(timerange) assert isinstance(urls, list) assert urls[0] == url_start assert urls[-1] == url_end def test_get_url_for_date(): url = LCClient._get_url_for_date(datetime.date(2013, 2, 13)) assert url == 'http://proba2.oma.be/lyra/data/bsd/2013/02/13/lyra_20130213-000000_lev2_std.fits' @given(time_attr()) def test_can_handle_query(time): ans1 = lyra.LYRAClient._can_handle_query( time, Instrument('lyra')) assert ans1 is True ans2 = lyra.LYRAClient._can_handle_query(time) assert ans2 is False @given(time_attr()) def test_query(time): qr1 = LCClient.search(time, Instrument('lyra')) assert isinstance(qr1, QueryResponse) assert qr1.time_range().start == time.start assert qr1.time_range().end == time.end @pytest.mark.remote_data @pytest.mark.parametrize("time,instrument", [ (Time('2013/8/27', '2013/8/27'), Instrument('lyra')), (Time('2013/2/4', '2013/2/6'), Instrument('lyra')), ]) def test_get(time, instrument): qr1 = LCClient.search(time, instrument) res = LCClient.fetch(qr1) download_list = res.wait(progress=False) assert len(download_list) == len(qr1) @pytest.mark.remote_data @pytest.mark.parametrize( "time, instrument", [(a.Time('2012/10/4', '2012/10/6'), a.Instrument('lyra')), (a.Time('2013/10/5', '2013/10/7'), a.Instrument('lyra'))]) def test_fido(time, instrument): qr = Fido.search(time, instrument) assert isinstance(qr, UnifiedResponse) response = Fido.fetch(qr) assert len(response) == qr._numfile sunpy-0.8.3/sunpy/net/dataretriever/tests/test_noaa.py0000644000175000017500000000502213231613140023363 0ustar nabilnabil00000000000000import pytest from sunpy.time import parse_time from sunpy.time.timerange import TimeRange from sunpy.net.vso.attrs import Time, Instrument from sunpy.net.dataretriever.client import QueryResponse import sunpy.net.dataretriever.sources.noaa as noaa from sunpy.net.fido_factory import UnifiedResponse from sunpy.net import Fido from sunpy.net import attrs as a LCClient = noaa.NOAAIndicesClient() @pytest.mark.parametrize( "timerange,url_start,url_end", [(TimeRange('1995/06/03', '1995/06/04'), 'ftp://ftp.swpc.noaa.gov/pub/weekly/RecentIndices.txt', 'ftp://ftp.swpc.noaa.gov/pub/weekly/RecentIndices.txt'), (TimeRange('2008/06/01', '2008/06/02'), 'ftp://ftp.swpc.noaa.gov/pub/weekly/RecentIndices.txt', 'ftp://ftp.swpc.noaa.gov/pub/weekly/RecentIndices.txt')]) def test_get_url_for_time_range(timerange, url_start, url_end): urls = LCClient._get_url_for_timerange(timerange) assert isinstance(urls, list) assert urls[0] == url_start assert urls[-1] == url_end def test_can_handle_query(): ans1 = noaa.NOAAIndicesClient._can_handle_query( Time('2012/8/9', '2012/8/10'), Instrument('noaa-indices')) assert ans1 == True ans2 = noaa.NOAAIndicesClient._can_handle_query( Time('2012/7/7', '2012/7/7')) assert ans2 == False ans3 = noaa.NOAAIndicesClient._can_handle_query( Time('2012/8/9', '2012/8/10'), Instrument('eve')) assert ans3 == False @pytest.mark.remote_data def test_query(): qr1 = LCClient.search( Time('2012/8/9', '2012/8/10'), Instrument('noaa-indices')) assert isinstance(qr1, QueryResponse) assert len(qr1) == 1 assert qr1.time_range().start == parse_time('2012/08/09') assert qr1.time_range().end == parse_time('2012/08/10') @pytest.mark.remote_data @pytest.mark.parametrize("time, instrument", [ (Time('2012/11/27', '2012/11/27'), Instrument('noaa-indices')), (Time('2012/10/4', '2012/10/6'), Instrument('noaa-indices')), ]) def test_get(time, instrument): qr1 = LCClient.search(time, instrument) res = LCClient.get(qr1) download_list = res.wait(progress=False) assert len(download_list) == len(qr1) @pytest.mark.remote_data @pytest.mark.parametrize( "time, instrument", [(a.Time("2012/10/4", "2012/10/6"), a.Instrument('noaa-indices')), (a.Time('2013/10/5', '2013/10/7'), a.Instrument('noaa-indices'))]) def test_fido(time, instrument): qr = Fido.search(time, instrument) assert isinstance(qr, UnifiedResponse) response = Fido.fetch(qr) assert len(response) == qr._numfile sunpy-0.8.3/sunpy/net/dataretriever/tests/test_norh.py0000644000175000017500000001037713231613140023424 0ustar nabilnabil00000000000000import datetime import pytest import astropy.units as u from sunpy.time.timerange import TimeRange from sunpy.net.dataretriever.client import QueryResponse import sunpy.net.dataretriever.sources.norh as norh from sunpy.net.fido_factory import UnifiedResponse from sunpy.net import Fido from sunpy.net import attrs as a from hypothesis import given from sunpy.net.tests.strategies import time_attr, range_time @pytest.mark.remote_data @pytest.mark.parametrize("timerange,url_start,url_end", [ (TimeRange('2012/4/21', '2012/4/21'), 'ftp://anonymous:data@sunpy.org@solar-pub.nao.ac.jp/pub/nsro/norh/data/tcx/2012/04/tca120421', 'ftp://anonymous:data@sunpy.org@solar-pub.nao.ac.jp/pub/nsro/norh/data/tcx/2012/04/tca120421' ), (TimeRange('2012/12/1', '2012/12/2'), 'ftp://anonymous:data@sunpy.org@solar-pub.nao.ac.jp/pub/nsro/norh/data/tcx/2012/12/tca121201', 'ftp://anonymous:data@sunpy.org@solar-pub.nao.ac.jp/pub/nsro/norh/data/tcx/2012/12/tca121202' ), (TimeRange('2012/3/7', '2012/3/14'), 'ftp://anonymous:data@sunpy.org@solar-pub.nao.ac.jp/pub/nsro/norh/data/tcx/2012/03/tca120307', 'ftp://anonymous:data@sunpy.org@solar-pub.nao.ac.jp/pub/nsro/norh/data/tcx/2012/03/tca120314' ) ]) def test_get_url_for_time_range(timerange, url_start, url_end): urls = norh.NoRHClient()._get_url_for_timerange(timerange, wavelength=17*u.GHz) assert isinstance(urls, list) assert urls[0] == url_start assert urls[-1] == url_end @given(time_attr()) def test_can_handle_query(time): ans1 = norh.NoRHClient._can_handle_query(time, a.Instrument('norh')) assert ans1 is True ans1 = norh.NoRHClient._can_handle_query(time, a.Instrument('norh'), a.Wavelength(10*u.GHz)) assert ans1 is True ans2 = norh.NoRHClient._can_handle_query(time) assert ans2 is False @pytest.mark.remote_data @pytest.mark.parametrize("wave", [a.Wavelength(17*u.GHz), a.Wavelength(34*u.GHz)]) @given(time=range_time(datetime.datetime(1992, 6, 1))) def test_query(time, wave): qr1 = norh.NoRHClient().search(time, a.Instrument('norh'), wave) assert isinstance(qr1, QueryResponse) # Not all hypothesis queries are going to produce results, and if qr1: # There are no observations everyday # so the results found have to be equal or later than the queried time # (looking at the date because it may search for miliseconds, but only date is available) assert qr1.time_range().start.date() >= time.start.date() # and the end time equal or smaller. # hypothesis can give same start-end, but the query will give you from start to end (so +1) assert qr1.time_range().end <= time.end + datetime.timedelta(days=1) # Don't use time_attr here for speed. def test_query_no_wave(): c = norh.NoRHClient() with pytest.raises(ValueError): c.search(a.Time("2016/10/1", "2016/10/2"), a.Instrument('norh')) def test_wavelength_range(): with pytest.raises(ValueError): norh.NoRHClient().search( a.Time("2016/10/1", "2016/10/2"), a.Instrument('norh'), a.Wavelength(17 * u.GHz, 34 * u.GHz)) def test_query_wrong_wave(): c = norh.NoRHClient() with pytest.raises(ValueError): c.search(a.Time("2016/10/1", "2016/10/2"), a.Instrument('norh'), a.Wavelength(50*u.GHz)) @pytest.mark.remote_data @pytest.mark.parametrize("time,instrument,wave", [ (a.Time('2012/10/4', '2012/10/6'), a.Instrument('norh'), a.Wavelength(17*u.GHz)), (a.Time('2013/10/5', '2013/10/7'), a.Instrument('norh'), a.Wavelength(34*u.GHz))]) def test_get(time, instrument, wave): LCClient = norh.NoRHClient() qr1 = LCClient.search(time, instrument, wave) res = LCClient.fetch(qr1) download_list = res.wait(progress=False) assert len(download_list) == len(qr1) @pytest.mark.remote_data @pytest.mark.parametrize( "time, instrument, wave", [(a.Time('2012/10/4', '2012/10/6'), a.Instrument('norh'), a.Wavelength(17*u.GHz)), (a.Time('2013/10/5', '2013/10/7'), a.Instrument('norh'), a.Wavelength(34*u.GHz))]) def test_fido(time, instrument, wave): qr = Fido.search(time, instrument, wave) assert isinstance(qr, UnifiedResponse) response = Fido.fetch(qr) assert len(response) == qr._numfile sunpy-0.8.3/sunpy/net/dataretriever/tests/test_rhessi.py0000644000175000017500000000444213231613140023747 0ustar nabilnabil00000000000000import pytest import sunpy.net.dataretriever.sources.rhessi as rhessi from sunpy.net import Fido from sunpy.net import attrs as a from sunpy.time import parse_time from sunpy.time.timerange import TimeRange from sunpy.net.vso.attrs import Time, Instrument from sunpy.net.dataretriever.client import QueryResponse from sunpy.net.fido_factory import UnifiedResponse LCClient = rhessi.RHESSIClient() @pytest.mark.remote_data @pytest.mark.parametrize("timerange,url_start", [ (TimeRange('2012/7/1', '2012/7/2'), 'hessidata/metadata/catalog/hsi_obssumm_20120701_050.fits'), (TimeRange('2013/6/3', '2013/6/4'), 'hessidata/metadata/catalog/hsi_obssumm_20130603_042.fits'), (TimeRange('2012/7/1', '2012/7/14'), 'hessidata/metadata/catalog/hsi_obssumm_20120701_050.fits') ]) def test_get_url_for_time_range(timerange, url_start): urls = LCClient._get_url_for_timerange(timerange) assert isinstance(urls, list) assert url_start in urls[0] def test_can_handle_query(): ans1 = rhessi.RHESSIClient._can_handle_query( Time('2012/8/9', '2012/8/9'), Instrument('rhessi')) assert ans1 is True ans2 = rhessi.RHESSIClient._can_handle_query(Time('2013/2/7', '2013/2/7')) assert ans2 is False @pytest.mark.remote_data def test_query(): qr1 = LCClient.search(Time('2011/4/9', '2011/4/10'), Instrument('rhessi')) assert isinstance(qr1, QueryResponse) assert len(qr1) == 1 assert qr1.time_range().start == parse_time('2011/04/09') assert qr1.time_range().end == parse_time('2011/04/10') @pytest.mark.remote_data @pytest.mark.parametrize("time,instrument", [ (Time('2012/11/27', '2012/11/28'), Instrument('rhessi')), (Time('2012/10/4', '2012/10/5'), Instrument('rhessi')), ]) def test_get(time, instrument): qr1 = LCClient.search(time, instrument) res = LCClient.fetch(qr1) download_list = res.wait(progress=False) assert len(download_list) == len(qr1) @pytest.mark.remote_data @pytest.mark.parametrize( "time, instrument", [(a.Time('2012/10/4', '2012/10/6'), a.Instrument('rhessi')), (a.Time('2013/10/5', '2013/10/7'), a.Instrument('rhessi'))]) def test_fido(time, instrument): qr = Fido.search(time, instrument) assert isinstance(qr, UnifiedResponse) response = Fido.fetch(qr) assert len(response) == qr._numfile sunpy-0.8.3/sunpy/net/dataretriever/__init__.py0000644000175000017500000000117313231613140022006 0ustar nabilnabil00000000000000""" The `sunpy.net.dataretriever` submodule is a framework for downloading data from "simple" web sources such as HTTP or FTP servers. Although it could be used for more complex services as well. Following the example of `sunpy.map` and `sunpy.timeseries` this module provides a base class `~sunpy.net.dataretriever.GenericClient` from which specific services can subclass. All these subclasses are then registered with the `Fido ` factory class, so do not need to be called individually. """ from .client import QueryResponseBlock, QueryResponse, GenericClient from . import clients sunpy-0.8.3/sunpy/net/dataretriever/client.py0000644000175000017500000002757013231613140021536 0ustar nabilnabil00000000000000# Author :Rishabh Sharma # This module was developed under funding provided by # Google Summer of Code 2014 import copy import os import datetime from abc import ABCMeta from collections import OrderedDict, namedtuple from functools import partial import numpy as np import astropy.table import astropy.units as u import sunpy from sunpy.extern import six from sunpy.time import TimeRange from sunpy.util import replacement_filename from sunpy.util.config import get_and_create_download_dir from sunpy import config from sunpy.util import deprecated from ..download import Downloader, Results from ..vso.attrs import Time, Wavelength, _Range TIME_FORMAT = config.get("general", "time_format") __all__ = ['QueryResponse', 'GenericClient'] def simple_path(path, sock, url): return path class QueryResponseBlock(object): """ Represents url, source along with other information """ def __init__(self, map0, url, time=None): """ Parameters ---------- map0 : Dict with relevant information url : Uniform Resource Locator """ self._map = map0 self.source = map0.get('source', "Data not Available") self.provider = map0.get('provider', "Data not Available") self.physobs = map0.get('physobs', "Data not Available") self.instrument = map0.get('instrument', "Data not Available") self.url = url self.time = TimeRange(map0.get('Time_start'), map0.get('Time_end')) if time is None else time self.wave = map0.get('wavelength', np.NaN) def iter_urls(amap, url_list, time): """Helper Function""" for aurl, t in zip(url_list, time): tmp = QueryResponseBlock(amap, aurl, t) yield tmp class QueryResponse(list): """ Container of QueryResponseBlocks """ def __init__(self, lst): super(QueryResponse, self).__init__(lst) @classmethod def create(cls, amap, lst, time=None): if time is None: time = [None] * len(lst) return cls(iter_urls(amap, lst, time)) def time_range(self): """ Returns the time-span for which records are available """ return TimeRange(min(qrblock.time.start for qrblock in self), max(qrblock.time.end for qrblock in self)) def response_block_properties(self): """ Returns a set of class attributes on all the response blocks. """ s = {a if not a.startswith('_') else None for a in dir(self[0])} for resp in self[1:]: s = s.intersection({a if not a.startswith('_') else None for a in dir(resp)}) s.remove(None) return s def __repr__(self): return repr(type(self)) + repr(self._build_table()) def __str__(self): return str(self._build_table()) def _repr_html_(self): return self._build_table()._repr_html_() def _build_table(self): columns = OrderedDict((('Start Time', []), ('End Time', []), ('Source', []), ('Instrument', []), ('Wavelength', []))) for i, qrblock in enumerate(self): columns['Start Time'].append( (qrblock.time.start).strftime(TIME_FORMAT)) columns['End Time'].append( (qrblock.time.end).strftime(TIME_FORMAT)) columns['Source'].append(qrblock.source) columns['Instrument'].append(qrblock.instrument) columns['Wavelength'].append(str(u.Quantity(qrblock.wave))) return astropy.table.Table(columns) # GenericMap subclass registry. CLIENTS = OrderedDict() class GenericClientMeta(ABCMeta): """ Registration metaclass for `~sunpy.map.GenericMap`. This class checks for the existance of a method named ``is_datasource_for`` when a subclass of `GenericMap` is defined. If it exists it will add that class to the registry. """ _registry = CLIENTS def __new__(mcls, name, bases, members): cls = super(GenericClientMeta, mcls).__new__( mcls, name, bases, members) if cls.__name__ is 'GenericClient': return cls # The registry contains the class as the key and the validation method # as the item. if '_can_handle_query' in members: mcls._registry[cls] = cls._can_handle_query return cls @six.add_metaclass(GenericClientMeta) class GenericClient(object): """ Base class for simple web clients for the data retriever module. This class is mainly designed for downloading data from FTP and HTTP type data sources, although should in theory be general enough to get data from any web service. This class has two user facing methods `~sunpy.net.dataretriever.client.GenericClient.query` and `~sunpy.net.dataretriever.client.GenericClient.get` the former generates a set of results for files available through the service the client is querying and the latter downloads that data. The `~sunpy.net.dataretriever.client.GenericClient.query` method takes a set of `sunpy.net.attrs` objects and then converts these into a call to `~sunpy.net.dataretriever.client.GenericClient._get_url_for_timerange`. It does this through the `map\_` dictionary which represents the `~sunpy.net.attrs` objects as a dictionary. """ def __init__(self): self.map_ = {} def _makeargs(self, *args, **kwargs): """ Construct the `map\_` internal representation of the query. This `map\_` dictionary is passed through to the `_get_url_for_timerange` method to get the URL results. Parameters ---------- \*args: `tuple` The query attributes. \*\*kwargs: `dict` None. """ for elem in args: if isinstance(elem, Time): self.map_['TimeRange'] = TimeRange(elem.start, elem.end) self.map_['Time_start'] = elem.start self.map_['Time_end'] = elem.end elif isinstance(elem, _Range): a_min = elem.min a_max = elem.max if a_min == a_max: self.map_[elem.__class__.__name__.lower()] = a_min else: if isinstance(elem, Wavelength): prefix = 'wave' else: prefix = '' minmax = namedtuple("minmax", "{0}min {0}max".format(prefix)) self.map_[elem.__class__.__name__.lower()] = minmax(a_min, a_max) else: if hasattr(elem, 'value'): self.map_[elem.__class__.__name__.lower()] = elem.value else: # This will only get hit if the attr is something like # Extent, which is a unique subclass of Attr. Currently no # unidown Clients support this, so we skip this line. # Anything that hits this will require special code to # convert it into the map_ dict. raise ValueError( "GenericClient can not add {} to the map_ dictionary to pass " "to the Client.".format(elem.__class__.__name__)) # pragma: no cover self._makeimap() def _get_url_for_timerange(cls, timerange, **kwargs): """ Method which generates URL results from a timerange and the `map\_` dictionary. Parameters ---------- timerange: `sunpy.time.TimeRange` The timerange to extract the URLs for. \*\*kwargs: `dict` Any extra keywords to refine the search. Generated from the attributes passed to `~sunpy.net.dataretriever.client.GenericClient.search`. """ raise NotImplementedError def _makeimap(self): """ Add client specific information to the _map dict. Normally this is extra metadata which is not downloaded, but known a priori. """ raise NotImplementedError @classmethod def _can_handle_query(cls, *query): """ Method the `sunpy.net.fido_factory.UnifiedDownloaderFactory` class uses to dispatch queries to this Client. """ raise NotImplementedError def _get_full_filenames(self, qres, filenames, path): """ Download a set of results. Parameters ---------- qres : `~sunpy.net.dataretriever.QueryResponse` Results to download. filenames : list List of base filenames (ex - "xyz.txt") path : string Path to download files to Returns ------- List of full pathnames for each file (download_directory + filename) """ # Create function to compute the filepath to download to if not set default_dir = sunpy.config.get("downloads", "download_dir") paths = [] for i, filename in enumerate(filenames): if path is None: fname = os.path.join(default_dir, '{file}') elif isinstance(path, six.string_types) and '{file}' not in path: fname = os.path.join(path, '{file}') temp_dict = qres[i]._map.copy() temp_dict['file'] = filename fname = fname.format(**temp_dict) fname = os.path.expanduser(fname) if os.path.exists(fname): fname = replacement_filename(fname) fname = partial(simple_path, fname) paths.append(fname) return paths def search(self, *args, **kwargs): """ Query this client for a list of results. Parameters ---------- \*args: `tuple` `sunpy.net.attrs` objects representing the query. """ GenericClient._makeargs(self, *args, **kwargs) kwergs = copy.copy(self.map_) kwergs.update(kwargs) urls = self._get_url_for_timerange( self.map_.get('TimeRange'), **kwergs) if urls and getattr(self, "_get_time_for_url", None): return QueryResponse.create(self.map_, urls, self._get_time_for_url(urls)) return QueryResponse.create(self.map_, urls) @deprecated('0.8', alternative='GenericClient.search') def query(self, *query, **kwargs): """ See `~sunpy.net.dataretriever.client.GenericClient.search` """ return self.search(*query, **kwargs) def fetch(self, qres, path=None, error_callback=None, **kwargs): """ Download a set of results. Parameters ---------- qres : `~sunpy.net.dataretriever.QueryResponse` Results to download. Returns ------- Results Object """ urls = [qrblock.url for qrblock in qres] filenames = [url.split('/')[-1] for url in urls] paths = self._get_full_filenames(qres, filenames, path) res = Results(lambda x: None, 0, lambda map_: self._link(map_)) dobj = Downloader(max_conn=len(urls), max_total=len(urls)) # We cast to list here in list(zip... to force execution of # res.require([x]) at the start of the loop. for aurl, ncall, fname in list(zip(urls, map(lambda x: res.require([x]), urls), paths)): dobj.download(aurl, fname, ncall, error_callback) return res @deprecated('0.8', alternative='GenericClient.fetch') def get(self, qres, path=None, error_callback=None, **kwargs): """ See `~sunpy.net.dataretriever.client.GenericClient.fetch` """ return self.fetch(qres, path=path, error_callback=error_callback, **kwargs) def _link(self, map_): """Helper Function""" paths = [] for k, v in map_.items(): paths.append(map_[k]['path']) return paths sunpy-0.8.3/sunpy/net/dataretriever/clients.py0000644000175000017500000000121113231613140021701 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- # Import and register LC sources from .sources.eve import EVEClient from .sources.lyra import LYRAClient from .sources.goes import XRSClient from .sources.norh import NoRHClient from .sources.rhessi import RHESSIClient from .sources.noaa import NOAAIndicesClient, NOAAPredictClient, SRSClient # Import and register other sources from sunpy.net.jsoc.jsoc import JSOCClient from sunpy.net.vso import VSOClient # Add the JSOC and VSO Clients explicitly as they do not inherit from # GenericClient from .client import CLIENTS CLIENTS[VSOClient] = VSOClient._can_handle_query CLIENTS[JSOCClient] = JSOCClient._can_handle_query sunpy-0.8.3/sunpy/net/hek/0000755000175000017500000000000013232563477015623 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/net/hek/__init__.py0000644000175000001440000000011013210261730016671 0ustar nabil00000000000000from __future__ import absolute_import from sunpy.net.hek.hek import * sunpy-0.8.3/sunpy/net/hek/attrs.py0000644000175000001440000004751713210261730016315 0ustar nabil00000000000000# -*- coding: utf-8 -*- # Author: Florian Mayer # # This module was developed with funding provided by # the ESA Summer of Code (2011). # The template can be found in tools/hektemplate.py # Unless you are editing the template, DO NOT EDIT THIS FILE. # ALL CHANGES WILL BE LOST THE NEXT TIME IT IS GENERATED FROM THE TEMPLATE. """ Attributes that can be used to construct HEK queries. They are different to the VSO ones in that a lot of them are wrappers that conveniently expose the comparisons by overloading Python operators. So, e.g., you are able to say AR & AR.NumSpots < 5 to find all active regions with less than 5 spots. As with the VSO query, you can use the fundamental logic operators AND and OR to construct queries of almost arbitrary complexity. Note that complex queries result in multiple requests to the server which might make them less efficient. """ from __future__ import absolute_import from datetime import datetime from sunpy.net import attr from sunpy.time import parse_time from sunpy.extern import six # Ugly hack for the deprecated apply decorator, this needs to be cleaned up def apply(f): return f() class _ParamAttr(attr.Attr): """ A _ParamAttr is used to represent equality or inequality checks for certain parameters. It stores the attribute's name, the operator to compare with, and the value to compare to. """ def __init__(self, name, op, value): attr.Attr.__init__(self) self.name = name self.op = op self.value = value def collides(self, other): if not isinstance(other, self.__class__): return False return self.op == other.op and self.name == other.name # XXX: Why is this here but never used. class _BoolParamAttr(_ParamAttr): def __init__(self, name, value='true'): _ParamAttr.__init__(self, name, '=', value) def __neg__(self): if self.value == 'true': return _BoolParamAttr(self.name, 'false') else: return _BoolParamAttr(self.name) def __pos__(self): return _BoolParamAttr(self.name) class _ListAttr(attr.Attr): """ A _ListAttr is used when the server expects a list of things with the name (GET parameter name) key. By adding the _ListAttr to the query, item is added to that list. """ def __init__(self, key, item): attr.Attr.__init__(self) self.key = key self.item = item def collides(self, other): return False def __eq__(self, other): if not isinstance(other, self.__class__): return False return vars(self) == vars(other) def __hash__(self): return hash(tuple(six.itervalues(vars(self)))) class EventType(attr.Attr): def __init__(self, item): attr.Attr.__init__(self) self.item = item def collides(self, other): return isinstance(other, EventType) def __or__(self, other): if isinstance(other, EventType): return EventType(self.item + ',' + other.item) else: return super(EventType, self).__or__(other) # XXX: XOR class Time(attr.Attr): """ Restrict query to time range between start and end. """ def __init__(self, start, end): attr.Attr.__init__(self) self.start = start self.end = end def collides(self, other): return isinstance(other, Time) def __eq__(self, other): if not isinstance(other, self.__class__): return False return vars(self) == vars(other) def __hash__(self): return hash(tuple(six.itervalues(vars(self)))) @classmethod def dt(cls, start, end): return cls(datetime(*start), datetime(*end)) # pylint: disable=R0913 class SpatialRegion(attr.Attr): def __init__(self, x1=-5000, y1=-5000, x2=5000, y2=5000, sys='helioprojective'): attr.Attr.__init__(self) self.x1 = x1 self.y1 = y1 self.x2 = x2 self.y2 = y2 self.sys = sys def collides(self, other): return isinstance(other, SpatialRegion) def __eq__(self, other): if not isinstance(other, self.__class__): return False return vars(self) == vars(other) def __hash__(self): return hash(tuple(six.itervalues(vars(self)))) class Contains(attr.Attr): def __init__(self, *types): attr.Attr.__init__(self) self.types = types def collides(self, other): return False def __eq__(self, other): if not isinstance(other, self.__class__): return False return vars(self) == vars(other) def __hash__(self): return hash(tuple(six.itervalues(vars(self)))) class _ComparisonParamAttrWrapper(object): def __init__(self, name): self.name = name def __lt__(self, other): return _ParamAttr(self.name, '<', other) def __le__(self, other): return _ParamAttr(self.name, '<=', other) def __gt__(self, other): return _ParamAttr(self.name, '>', other) def __ge__(self, other): return _ParamAttr(self.name, '>=', other) def __eq__(self, other): return _ParamAttr(self.name, '=', other) def __ne__(self, other): return _ParamAttr(self.name, '!=', other) class _StringParamAttrWrapper(_ComparisonParamAttrWrapper): def like(self, other): return _ParamAttr(self.name, 'like', other) class _NumberParamAttrWrapper(_ComparisonParamAttrWrapper): pass # The walker is what traverses the attribute tree and converts it to a format # that is understood by the server we are querying. The HEK walker builds up # a dictionary of GET parameters to be sent to the server. walker = attr.AttrWalker() @walker.add_applier(Contains) # pylint: disable=E0102,C0103,W0613 def _a(wlk, root, state, dct): dct['type'] = 'contains' if not Contains in state: state[Contains] = 1 nid = state[Contains] n = 0 for n, type_ in enumerate(root.types): dct['event_type{num:d}'.format(num=(nid + n))] = type_ state[Contains] += n return dct @walker.add_creator( Time, SpatialRegion, EventType, _ParamAttr, attr.AttrAnd, Contains) # pylint: disable=E0102,C0103,W0613 def _c(wlk, root, state): value = {} wlk.apply(root, state, value) return [value] @walker.add_applier(Time) # pylint: disable=E0102,C0103,W0613 def _a(wlk, root, state, dct): dct['event_starttime'] = parse_time(root.start).strftime('%Y-%m-%dT%H:%M:%S') dct['event_endtime'] = parse_time(root.end).strftime('%Y-%m-%dT%H:%M:%S') return dct @walker.add_applier(SpatialRegion) # pylint: disable=E0102,C0103,W0613 def _a(wlk, root, state, dct): dct['x1'] = root.x1 dct['y1'] = root.y1 dct['x2'] = root.x2 dct['y2'] = root.y2 dct['event_coordsys'] = root.sys return dct @walker.add_applier(EventType) # pylint: disable=E0102,C0103,W0613 def _a(wlk, root, state, dct): if dct.get('type', None) == 'contains': raise ValueError dct['event_type'] = root.item return dct @walker.add_applier(_ParamAttr) # pylint: disable=E0102,C0103,W0613 def _a(wlk, root, state, dct): if not _ParamAttr in state: state[_ParamAttr] = 0 nid = state[_ParamAttr] dct['param{num:d}'.format(num=nid)] = root.name dct['op{num:d}'.format(num=nid)] = root.op dct['value{num:d}'.format(num=nid)] = root.value state[_ParamAttr] += 1 return dct @walker.add_applier(attr.AttrAnd) # pylint: disable=E0102,C0103,W0613 def _a(wlk, root, state, dct): for attribute in root.attrs: wlk.apply(attribute, state, dct) @walker.add_creator(attr.AttrOr) # pylint: disable=E0102,C0103,W0613 def _c(wlk, root, state): blocks = [] for attribute in root.attrs: blocks.extend(wlk.create(attribute, state)) return blocks @apply class AR(EventType): CompactnessCls = _StringParamAttrWrapper('AR_CompactnessCls') IntensKurt = _StringParamAttrWrapper('AR_IntensKurt') IntensMax = _StringParamAttrWrapper('AR_IntensMax') IntensMean = _StringParamAttrWrapper('AR_IntensMean') IntensMin = _StringParamAttrWrapper('AR_IntensMin') IntensSkew = _StringParamAttrWrapper('AR_IntensSkew') IntensTotal = _StringParamAttrWrapper('AR_IntensTotal') IntensUnit = _StringParamAttrWrapper('AR_IntensUnit') IntensVar = _StringParamAttrWrapper('AR_IntensVar') McIntoshCls = _StringParamAttrWrapper('AR_McIntoshCls') MtWilsonCls = _StringParamAttrWrapper('AR_MtWilsonCls') NOAANum = _StringParamAttrWrapper('AR_NOAANum') NOAAclass = _StringParamAttrWrapper('AR_NOAAclass') NumSpots = _StringParamAttrWrapper('AR_NumSpots') PenumbraCls = _StringParamAttrWrapper('AR_PenumbraCls') Polarity = _StringParamAttrWrapper('AR_Polarity') SpotAreaRaw = _StringParamAttrWrapper('AR_SpotAreaRaw') SpotAreaRawUncert = _StringParamAttrWrapper('AR_SpotAreaRawUncert') SpotAreaRawUnit = _StringParamAttrWrapper('AR_SpotAreaRawUnit') SpotAreaRepr = _StringParamAttrWrapper('AR_SpotAreaRepr') SpotAreaReprUncert = _StringParamAttrWrapper('AR_SpotAreaReprUncert') SpotAreaReprUnit = _StringParamAttrWrapper('AR_SpotAreaReprUnit') ZurichCls = _StringParamAttrWrapper('AR_ZurichCls') def __init__(self): EventType.__init__(self, 'ar') @apply class CE(EventType): Accel = _StringParamAttrWrapper('CME_Accel') AccelUncert = _StringParamAttrWrapper('CME_AccelUncert') AccelUnit = _StringParamAttrWrapper('CME_AccelUnit') AngularWidth = _StringParamAttrWrapper('CME_AngularWidth') AngularWidthUnit = _StringParamAttrWrapper('CME_AngularWidthUnit') Mass = _StringParamAttrWrapper('CME_Mass') MassUncert = _StringParamAttrWrapper('CME_MassUncert') MassUnit = _StringParamAttrWrapper('CME_MassUnit') RadialLinVel = _StringParamAttrWrapper('CME_RadialLinVel') RadialLinVelMax = _StringParamAttrWrapper('CME_RadialLinVelMax') RadialLinVelMin = _StringParamAttrWrapper('CME_RadialLinVelMin') RadialLinVelStddev = _StringParamAttrWrapper('CME_RadialLinVelStddev') RadialLinVelUncert = _StringParamAttrWrapper('CME_RadialLinVelUncert') RadialLinVelUnit = _StringParamAttrWrapper('CME_RadialLinVelUnit') def __init__(self): EventType.__init__(self, 'ce') @apply class CD(EventType): Area = _StringParamAttrWrapper('CD_Area') AreaUncert = _StringParamAttrWrapper('CD_AreaUncert') AreaUnit = _StringParamAttrWrapper('CD_AreaUnit') Mass = _StringParamAttrWrapper('CD_Mass') MassUncert = _StringParamAttrWrapper('CD_MassUncert') MassUnit = _StringParamAttrWrapper('CD_MassUnit') Volume = _StringParamAttrWrapper('CD_Volume') VolumeUncert = _StringParamAttrWrapper('CD_VolumeUncert') VolumeUnit = _StringParamAttrWrapper('CD_VolumeUnit') def __init__(self): EventType.__init__(self, 'cd') CH = EventType('ch') CW = EventType('cw') @apply class FI(EventType): BarbsL = _StringParamAttrWrapper('FI_BarbsL') BarbsR = _StringParamAttrWrapper('FI_BarbsR') BarbsTot = _StringParamAttrWrapper('FI_BarbsTot') Chirality = _StringParamAttrWrapper('FI_Chirality') Length = _StringParamAttrWrapper('FI_Length') LengthUnit = _StringParamAttrWrapper('FI_LengthUnit') Tilt = _StringParamAttrWrapper('FI_Tilt') def __init__(self): EventType.__init__(self, 'fi') FE = EventType('fe') FA = EventType('fa') @apply class FL(EventType): EFoldTime = _StringParamAttrWrapper('FL_EFoldTime') EFoldTimeUnit = _StringParamAttrWrapper('FL_EFoldTimeUnit') Fluence = _StringParamAttrWrapper('FL_Fluence') FluenceUnit = _StringParamAttrWrapper('FL_FluenceUnit') GOESCls = _StringParamAttrWrapper('FL_GOESCls') PeakEM = _StringParamAttrWrapper('FL_PeakEM') PeakEMUnit = _StringParamAttrWrapper('FL_PeakEMUnit') PeakFlux = _StringParamAttrWrapper('FL_PeakFlux') PeakFluxUnit = _StringParamAttrWrapper('FL_PeakFluxUnit') PeakTemp = _StringParamAttrWrapper('FL_PeakTemp') PeakTempUnit = _StringParamAttrWrapper('FL_PeakTempUnit') def __init__(self): EventType.__init__(self, 'fl') LP = EventType('lp') OS = EventType('os') @apply class SS(EventType): SpinRate = _StringParamAttrWrapper('SS_SpinRate') SpinRateUnit = _StringParamAttrWrapper('SS_SpinRateUnit') def __init__(self): EventType.__init__(self, 'ss') @apply class EF(EventType): AspectRatio = _StringParamAttrWrapper('EF_AspectRatio') AxisLength = _StringParamAttrWrapper('EF_AxisLength') AxisOrientation = _StringParamAttrWrapper('EF_AxisOrientation') AxisOrientationUnit = _StringParamAttrWrapper('EF_AxisOrientationUnit') FluxUnit = _StringParamAttrWrapper('EF_FluxUnit') LengthUnit = _StringParamAttrWrapper('EF_LengthUnit') NegEquivRadius = _StringParamAttrWrapper('EF_NegEquivRadius') NegPeakFluxOnsetRate = _StringParamAttrWrapper('EF_NegPeakFluxOnsetRate') OnsetRateUnit = _StringParamAttrWrapper('EF_OnsetRateUnit') PosEquivRadius = _StringParamAttrWrapper('EF_PosEquivRadius') PosPeakFluxOnsetRate = _StringParamAttrWrapper('EF_PosPeakFluxOnsetRate') ProximityRatio = _StringParamAttrWrapper('EF_ProximityRatio') SumNegSignedFlux = _StringParamAttrWrapper('EF_SumNegSignedFlux') SumPosSignedFlux = _StringParamAttrWrapper('EF_SumPosSignedFlux') def __init__(self): EventType.__init__(self, 'ef') CJ = EventType('cj') PG = EventType('pg') OT = EventType('ot') NR = EventType('nr') @apply class SG(EventType): AspectRatio = _StringParamAttrWrapper('SG_AspectRatio') Chirality = _StringParamAttrWrapper('SG_Chirality') MeanContrast = _StringParamAttrWrapper('SG_MeanContrast') Orientation = _StringParamAttrWrapper('SG_Orientation') PeakContrast = _StringParamAttrWrapper('SG_PeakContrast') Shape = _StringParamAttrWrapper('SG_Shape') def __init__(self): EventType.__init__(self, 'sg') SP = EventType('sp') CR = EventType('cr') @apply class CC(EventType): AxisUnit = _StringParamAttrWrapper('CC_AxisUnit') MajorAxis = _StringParamAttrWrapper('CC_MajorAxis') MinorAxis = _StringParamAttrWrapper('CC_MinorAxis') TiltAngleMajorFromRadial = _StringParamAttrWrapper('CC_TiltAngleMajorFromRadial') TiltAngleUnit = _StringParamAttrWrapper('CC_TiltAngleUnit') def __init__(self): EventType.__init__(self, 'cc') ER = EventType('er') @apply class TO(EventType): Shape = _StringParamAttrWrapper('TO_Shape') def __init__(self): EventType.__init__(self, 'to') @apply class Wave(object): DisplMaxAmpl = _StringParamAttrWrapper('WaveDisplMaxAmpl') DisplMinAmpl = _StringParamAttrWrapper('WaveDisplMinAmpl') DisplUnit = _StringParamAttrWrapper('WaveDisplUnit') lMaxPower = _StringParamAttrWrapper('WavelMaxPower') lMaxPowerUncert = _StringParamAttrWrapper('WavelMaxPowerUncert') lMaxRange = _StringParamAttrWrapper('WavelMaxRange') lMinRange = _StringParamAttrWrapper('WavelMinRange') lUnit = _StringParamAttrWrapper('WavelUnit') @apply class Veloc(object): MaxAmpl = _StringParamAttrWrapper('VelocMaxAmpl') MaxPower = _StringParamAttrWrapper('VelocMaxPower') MaxPowerUncert = _StringParamAttrWrapper('VelocMaxPowerUncert') MinAmpl = _StringParamAttrWrapper('VelocMinAmpl') Unit = _StringParamAttrWrapper('VelocUnit') @apply class Freq(object): MaxRange = _StringParamAttrWrapper('FreqMaxRange') MinRange = _StringParamAttrWrapper('FreqMinRange') PeakPower = _StringParamAttrWrapper('FreqPeakPower') Unit = _StringParamAttrWrapper('FreqUnit') @apply class Intens(object): MaxAmpl = _StringParamAttrWrapper('IntensMaxAmpl') MinAmpl = _StringParamAttrWrapper('IntensMinAmpl') Unit = _StringParamAttrWrapper('IntensUnit') @apply class Area(object): AtDiskCenter = _StringParamAttrWrapper('Area_AtDiskCenter') AtDiskCenterUncert = _StringParamAttrWrapper('Area_AtDiskCenterUncert') Raw = _StringParamAttrWrapper('Area_Raw') Uncert = _StringParamAttrWrapper('Area_Uncert') Unit = _StringParamAttrWrapper('Area_Unit') @apply class BoundBox(object): C1LL = _StringParamAttrWrapper('BoundBox_C1LL') C1UR = _StringParamAttrWrapper('BoundBox_C1UR') C2LL = _StringParamAttrWrapper('BoundBox_C2LL') C2UR = _StringParamAttrWrapper('BoundBox_C2UR') @apply class Bound(object): ox_C1LL = _StringParamAttrWrapper('BoundBox_C1LL') ox_C1UR = _StringParamAttrWrapper('BoundBox_C1UR') ox_C2LL = _StringParamAttrWrapper('BoundBox_C2LL') ox_C2UR = _StringParamAttrWrapper('BoundBox_C2UR') CCNsteps = _StringParamAttrWrapper('Bound_CCNsteps') CCStartC1 = _StringParamAttrWrapper('Bound_CCStartC1') CCStartC2 = _StringParamAttrWrapper('Bound_CCStartC2') @apply class OBS(object): ChannelID = _StringParamAttrWrapper('OBS_ChannelID') DataPrepURL = _StringParamAttrWrapper('OBS_DataPrepURL') FirstProcessingDate = _StringParamAttrWrapper('OBS_FirstProcessingDate') IncludesNRT = _StringParamAttrWrapper('OBS_IncludesNRT') Instrument = _StringParamAttrWrapper('OBS_Instrument') LastProcessingDate = _StringParamAttrWrapper('OBS_LastProcessingDate') LevelNum = _StringParamAttrWrapper('OBS_LevelNum') MeanWavel = _StringParamAttrWrapper('OBS_MeanWavel') Observatory = _StringParamAttrWrapper('OBS_Observatory') Title = _StringParamAttrWrapper('OBS_Title') WavelUnit = _StringParamAttrWrapper('OBS_WavelUnit') @apply class Skel(object): Curvature = _StringParamAttrWrapper('Skel_Curvature') Nsteps = _StringParamAttrWrapper('Skel_Nsteps') StartC1 = _StringParamAttrWrapper('Skel_StartC1') StartC2 = _StringParamAttrWrapper('Skel_StartC2') @apply class FRM(object): Contact = _StringParamAttrWrapper('FRM_Contact') HumanFlag = _StringParamAttrWrapper('FRM_HumanFlag') Identifier = _StringParamAttrWrapper('FRM_Identifier') Institute = _StringParamAttrWrapper('FRM_Institute') Name = _StringParamAttrWrapper('FRM_Name') ParamSet = _StringParamAttrWrapper('FRM_ParamSet') SpecificID = _StringParamAttrWrapper('FRM_SpecificID') URL = _StringParamAttrWrapper('FRM_URL') VersionNumber = _StringParamAttrWrapper('FRM_VersionNumber') @apply class Event(object): C1Error = _StringParamAttrWrapper('Event_C1Error') C2Error = _StringParamAttrWrapper('Event_C2Error') ClippedSpatial = _StringParamAttrWrapper('Event_ClippedSpatial') ClippedTemporal = _StringParamAttrWrapper('Event_ClippedTemporal') Coord1 = _StringParamAttrWrapper('Event_Coord1') Coord2 = _StringParamAttrWrapper('Event_Coord2') Coord3 = _StringParamAttrWrapper('Event_Coord3') CoordSys = _StringParamAttrWrapper('Event_CoordSys') CoordUnit = _StringParamAttrWrapper('Event_CoordUnit') MapURL = _StringParamAttrWrapper('Event_MapURL') MaskURL = _StringParamAttrWrapper('Event_MaskURL') Npixels = _StringParamAttrWrapper('Event_Npixels') PixelUnit = _StringParamAttrWrapper('Event_PixelUnit') Probability = _StringParamAttrWrapper('Event_Probability') TestFlag = _StringParamAttrWrapper('Event_TestFlag') Type = _StringParamAttrWrapper('Event_Type') @apply class Outflow(object): Length = _StringParamAttrWrapper('Outflow_Length') LengthUnit = _StringParamAttrWrapper('Outflow_LengthUnit') OpeningAngle = _StringParamAttrWrapper('Outflow_OpeningAngle') Speed = _StringParamAttrWrapper('Outflow_Speed') SpeedUnit = _StringParamAttrWrapper('Outflow_SpeedUnit') TransSpeed = _StringParamAttrWrapper('Outflow_TransSpeed') Width = _StringParamAttrWrapper('Outflow_Width') WidthUnit = _StringParamAttrWrapper('Outflow_WidthUnit') @apply class Misc(object): KB_Archivist = _StringParamAttrWrapper('KB_Archivist') MaxMagFieldStrength = _StringParamAttrWrapper('MaxMagFieldStrength') MaxMagFieldStrengthUnit = _StringParamAttrWrapper('MaxMagFieldStrengthUnit') OscillNPeriods = _StringParamAttrWrapper('OscillNPeriods') OscillNPeriodsUncert = _StringParamAttrWrapper('OscillNPeriodsUncert') PeakPower = _StringParamAttrWrapper('PeakPower') PeakPowerUnit = _StringParamAttrWrapper('PeakPowerUnit') RasterScanType = _StringParamAttrWrapper('RasterScanType') sunpy-0.8.3/sunpy/net/hek/hek.py0000644000175000017500000001170713231613140016730 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- # Author: Florian Mayer # # This module was developed with funding provided by # the ESA Summer of Code (2011). # # pylint: disable=C0103,R0903 """ Facilities to interface with the HEK. """ from __future__ import absolute_import import json import codecs from itertools import chain from datetime import datetime from sunpy.net import attr from sunpy.net.hek import attrs from sunpy.net.vso import attrs as v_attrs from sunpy.util import unique from sunpy.util.xml import xml_to_dict from sunpy.extern.six import iteritems from sunpy.extern.six.moves import urllib from sunpy.util import deprecated __all__ = ['HEKClient'] DEFAULT_URL = 'http://www.lmsal.com/hek/her' def _freeze(obj): """ Create hashable representation of result dict. """ if isinstance(obj, dict): return tuple((k, _freeze(v)) for k, v in iteritems(obj)) if isinstance(obj, list): return tuple(_freeze(elem) for elem in obj) return obj class HEKClient(object): """ Client to interact with the Heliophysics Event Knowledgebase (HEK). The HEK stores solar feature and event data generated by algorithms and human observers.""" # FIXME: Expose fields in .attrs with the right types # that is, not all StringParamWrapper! default = { 'cosec': '2', 'cmd': 'search', 'type': 'column', 'event_type': '**', } # Default to full disk. attrs.walker.apply(attrs.SpatialRegion(), {}, default) def __init__(self, url=DEFAULT_URL): self.url = url def _download(self, data): """ Download all data, even if paginated. """ page = 1 results = [] reader = codecs.getreader("utf-8") while True: data['page'] = page fd = urllib.request.urlopen( self.url, urllib.parse.urlencode(data).encode('utf-8')) try: result = json.load(reader(fd)) finally: fd.close() results.extend(result['result']) if not result['overmax']: return list(map(Response, results)) page += 1 def search(self, *query): """ Retrieves information about HEK records matching the criteria given in the query expression. If multiple arguments are passed, they are connected with AND. The result of a query is a list of unique HEK Response objects that fulfill the criteria.""" query = attr.and_(*query) data = attrs.walker.create(query, {}) ndata = [] for elem in data: new = self.default.copy() new.update(elem) ndata.append(new) if len(ndata) == 1: return self._download(ndata[0]) else: return self._merge(self._download(data) for data in ndata) @deprecated('0.8', alternative='HEKClient.search') def query(self, *query): """ See `~sunpy.net.hek.hek.HEKClient.fetch` """ return self.search(*query) def _merge(self, responses): """ Merge responses, removing duplicates. """ return list(unique(chain.from_iterable(responses), _freeze)) class Response(dict): """Handles the response from the HEK. Each Response object is a subclass of the dictionary object. The dictionary key-value pairs correspond to the HEK feature/event properties and their values, for that record from the HEK. Each Response object also has extra properties that relate HEK concepts to VSO concepts.""" @property def vso_time(self): return v_attrs.Time( datetime.strptime(self['event_starttime'], "%Y-%m-%dT%H:%M:%S"), datetime.strptime(self['event_endtime'], "%Y-%m-%dT%H:%M:%S") ) @property def vso_instrument(self): if self['obs_instrument'] == 'HEK': raise ValueError("No instrument contained.") return v_attrs.Instrument(self['obs_instrument']) @property def vso_all(self): return attr.and_(self.vso_time, self.vso_instrument) def get_voevent(self, as_dict=True, base_url="http://www.lmsal.com/hek/her?"): """Retrieves the VOEvent object associated with a given event and returns it as either a Python dictionary or an XML string.""" # Build URL params = { "cmd": "export-voevent", "cosec": 1, "ivorn": self['kb_archivid'] } url = base_url + urllib.parse.urlencode(params) # Query and read response response = urllib.request.urlopen(url).read() # Return a string or dict if as_dict: return xml_to_dict(response) else: return response if __name__ == '__main__': import pprint from sunpy.net.hek import attrs as a c = HEKClient() b = c.search( a.Time((2010, 1, 1), (2010, 1, 2)) | a.Time((2010, 1, 3), (2010, 1, 4)), a.AR, a.FL ) pprint(b[0].vso_all) sunpy-0.8.3/sunpy/net/hek2vso/0000755000175000017500000000000013232563477016435 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/net/hek2vso/__init__.py0000644000175000001440000000051513210261730017514 0ustar nabil00000000000000""" This module provides a translation layer between the HEK and the VSO. It allows you to acquire records of data that are available via the VSO, based on the data in HEK event entries. .. warning:: This module is in beta and maybe unstable. """ from __future__ import absolute_import from sunpy.net.hek2vso.hek2vso import * sunpy-0.8.3/sunpy/net/hek2vso/hek2vso.py0000644000175000017500000002020013231613140020340 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- # Author: Michael Malocha # Last Edit: August 10th, 2013 # # This module was developed with funding from the GSOC 2013 summer of code # #pylint: disable=W0142 """ This module translates the results of a HEK query into a VSO query and returns the results from the VSO query to the user. """ from __future__ import absolute_import import sys from astropy import units from sunpy.net import hek from sunpy.net import vso from sunpy.util.progressbar import TTYProgressBar __author__ = 'Michael Malocha' __version__ = 'Aug 10th, 2013' __all__ = ['translate_results_to_query', 'vso_attribute_parse', 'H2VClient'] def translate_results_to_query(results): """ Formulate VSO queries from HEK results. Take the results from a HEK query either in the form of a single HEK response or a list containing multiple HEK responses then translates them into a VSO compatible query. Parameters ---------- results : `sunpy.net.hek.hek.Response` or list of `sunpy.net.hek.hek.Response` The HEK results from a HEK query to be translated. Examples -------- >>> from sunpy.net.hek import hek, HEKClient >>> from sunpy.net.hek2vso import hek2vso, H2VClient >>> h = HEKClient() # doctest: +REMOTE_DATA >>> h2v = H2VClient() # doctest: +REMOTE_DATA >>> q = h.search(hek.attrs.Time('2011/08/09 07:23:56', ... '2011/08/09 12:40:29'), hek.attrs.EventType('FL')) # doctest: +REMOTE_DATA >>> len(q) # doctest: +REMOTE_DATA 19 >>> hek2vso.translate_results_to_query(q[0]) # doctest: +SKIP [[, , , ]] >>> hek2vso.translate_results_to_query(q) # doctest: +SKIP [[, , , ], ..., [, , , ]] """ queries = [] if type(results) is list: for result in results: query = vso_attribute_parse(result) queries.append(query) else: query = vso_attribute_parse(results) queries.append(query) return queries def vso_attribute_parse(phrase): """ Parses VSO attributes from a HEK result. This is a simple function to parse HEK query result and generate a list containing VSO relevant attributes. Parameters ---------- phrase : `dict` containing a `sunpy.net.hek.hek.Response`. The single HEK result to be parsed for VSO attribute data. Examples -------- >>> from sunpy.net.hek import hek, HEKClient >>> from sunpy.net.hek2vso import hek2vso, H2VClient >>> h = HEKClient() # doctest: +REMOTE_DATA >>> h2v = H2VClient() # doctest: +REMOTE_DATA >>> q = h.search(hek.attrs.Time('2011/08/09 07:23:56', '2011/08/09 12:40:29'), hek.attrs.EventType('FL')) # doctest: +REMOTE_DATA >>> len(q) # doctest: +REMOTE_DATA 19 >>> hek2vso.vso_attribute_parse(q[9]) # doctest: +REMOTE_DATA +FLOAT_CMP [, , , ] """ try: query = [vso.attrs.Time(phrase['event_starttime'], phrase['event_endtime']), vso.attrs.Source(phrase['obs_observatory']), vso.attrs.Instrument(phrase['obs_instrument'])] avg_wave_len = phrase['obs_meanwavel'] * units.Unit(phrase['obs_wavelunit']) query.append(vso.attrs.Wavelength(avg_wave_len, avg_wave_len)) except (KeyError, TypeError): raise TypeError("'{dtype!s}' is an improper data type".format(dtype=type(phrase))) return query class H2VClient(object): """ Class to handle HEK to VSO translations Though the single step functions exists outside this class where translation is also possible, this class provides a framework where all the necessary functionality is easily accessed, along with a few additional and helpful methods. Examples -------- >>> from sunpy.net.hek import hek >>> from sunpy.net import hek2vso >>> h2v = hek2vso.H2VClient() # doctest: +REMOTE_DATA """ def __init__(self): self.hek_client = hek.HEKClient() self.hek_results = '' self.vso_client = vso.VSOClient() self.vso_results = [] self.num_of_records = 0 def full_query(self, client_query, limit=None, progress=False): """ An encompassing method that takes a HEK query and returns a VSO result Takes a list containing a HEK style query, passes it to a HEKClient instance, translates it, queries the VSO webservice, then returns the VSO results inside a structured list. Parameters ---------- client_query : `list` The list containing the HEK style query. limit : `int` An approximate limit to the desired number of VSO results. Examples -------- >>> from sunpy.net import hek, hek2vso >>> h2v = hek2vso.H2VClient() # doctest: +REMOTE_DATA >>> q = h2v.full_query((hek.attrs.Time('2011/08/09 07:23:56', '2011/08/09 12:40:29'), ... hek.attrs.EventType('FL'))) # doctest: +REMOTE_DATA """ self._quick_clean() if progress: sys.stdout.write('\rQuerying HEK webservice...') sys.stdout.flush() self.hek_results = self.hek_client.search(*client_query) self._quick_clean() return self.translate_and_query(self.hek_results, limit=limit, progress=progress) def translate_and_query(self, hek_results, limit=None, progress=False): """ Translates HEK results, makes a VSO query, then returns the results. Takes the results from a HEK query, translates them, then makes a VSO query, returning the results in a list organized by their corresponding HEK query. Parameters ---------- hek_results : `sunpy.net.hek.hek.Response` or list of such Responses The results from a HEK query in the form of a list. limit : int An approximate limit to the desired number of VSO results. progress : Boolean A flag to turn off the progress bar, defaults to "off" Examples -------- >>> from sunpy.net import hek, hek2vso >>> h = hek.HEKClient() # doctest: +REMOTE_DATA >>> tstart = '2011/08/09 07:23:56' >>> tend = '2011/08/09 12:40:29' >>> event_type = 'FL' >>> q = h.search(hek.attrs.Time(tstart, tend), hek.attrs.EventType(event_type)) # doctest: +REMOTE_DATA >>> h2v = hek2vso.H2VClient() # doctest: +REMOTE_DATA >>> res = h2v.translate_and_query(q) # doctest: +REMOTE_DATA """ vso_query = translate_results_to_query(hek_results) result_size = len(vso_query) if progress: sys.stdout.write('\rQuerying VSO webservice') sys.stdout.flush() pbar = TTYProgressBar(result_size) for query in vso_query: temp = self.vso_client.search(*query) self.vso_results.append(temp) self.num_of_records += len(temp) if limit is not None: if self.num_of_records >= limit: break if progress: pbar.poke() if progress: pbar.finish() return self.vso_results def _quick_clean(self): """ A simple method to quickly sterilize the instance variables. Used to bleach local variables before a new query is made. Not intended to be run by user. """ self.vso_results = [] self.num_of_records = 0 sunpy-0.8.3/sunpy/net/helio/0000755000175000017500000000000013232563477016154 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/net/helio/__init__.py0000644000175000017500000000024113232563447020257 0ustar nabilnabil00000000000000""" A Module for accessing the HELIO web service .. warning:: This module is still in beta and may be unstable """ from __future__ import absolute_import sunpy-0.8.3/sunpy/net/helio/hec.py0000644000175000017500000002013313232563373017257 0ustar nabilnabil00000000000000""" Access the Helio Event Catalogue """ from __future__ import print_function, absolute_import from sunpy.net.proxyfix import WellBehavedHttpTransport from sunpy.net.helio import parser from sunpy.time import parse_time from suds.client import Client as C import suds from astropy.io.votable.table import parse_single_table from sunpy.extern import six from sunpy.extern.six.moves import range, input __author__ = 'Michael Malocha' __all__ = ['HECClient'] def suds_unwrapper(wrapped_data): """ Removes suds wrapping from returned xml data When grabbing data via votable_interceptor.last_payload from the suds.client.Client module, it returns the xml data in an un-helpful "" that needs to be removed. This function politely cleans it up. Parameters ---------- wrapped_data : `str` Contains the wrapped xml results from a WSDL query Returns ------- unwrapped : `str` The xml results with the wrapper removed """ if six.PY3 and not isinstance(wrapped_data, str): wrapped_data = wrapped_data.decode("utf-8") HEADER = '\n' CATCH_1 = '>> from sunpy.net.helio import hec >>> temp = hec.suds_unwrapper(xml_string) # doctest: +SKIP >>> type(temp) # doctest: +SKIP unicode >>> temp = hec.votable_handler(temp) # doctest: +SKIP >>> type(temp) # doctest: +SKIP astropy.io.votable.tree.Table """ fake_file = six.BytesIO() fake_file.write(six.b(xml_table)) votable = parse_single_table(fake_file) fake_file.close() return votable class VotableInterceptor(suds.plugin.MessagePlugin): ''' Adapted example from http://stackoverflow.com/questions/15259929/configure-suds-to-use-custom-response-xml-parser-for-big-response-payloads ''' def __init__(self, *args, **kwargs): self.last_payload = None def received(self, context): # received xml as a string self.last_payload = six.u(suds_unwrapper(context.reply)) # clean up reply to prevent parsing context.reply = "" return context class HECClient(object): """ A client class used to interface with and query HELIO webservices. """ def __init__(self, link=None): """ The constructor; establishes the webservice link for the client Initializes the client with a weblink Parameters ---------- link : str Contains URL to valid WSDL endpoint Examples -------- >>> from sunpy.net.helio import hec >>> hc = hec.HECClient() # doctest: +REMOTE_DATA """ if link is None: # The default wsdl file link = parser.wsdl_retriever() self.votable_interceptor = VotableInterceptor() self.hec_client = C(link, plugins=[self.votable_interceptor], transport=WellBehavedHttpTransport()) def time_query(self, start_time, end_time, table=None, max_records=None): """ The simple interface to query the wsdl service. Used to utilize the service's TimeQuery() method, this is a simple interface between the sunpy module library and the web-service's API. Parameters ---------- start_time : str The datetime where the query window opens end_time : str The datetime where the query window closes table : str The table to query from. If the table is unknown, the user will be prompted to pick from a list of tables. max_records: int The maximum number of desired records. Returns ------- results: `astropy.io.votable.tree.Table` Table containing the results from the query Examples -------- >>> from sunpy.net.helio import hec >>> hc = hec.HECClient() # doctest: +REMOTE_DATA >>> start = '2005/01/03' >>> end = '2005/12/03' >>> temp = hc.time_query(start, end, max_records=10) # doctest: +SKIP +REMOTE_DATA """ while table is None: table = self.make_table_list() start_time = parse_time(start_time) end_time = parse_time(end_time) self.hec_client.service.TimeQuery(STARTTIME=start_time.isoformat(), ENDTIME=end_time.isoformat(), FROM=table, MAXRECORDS=max_records) results = votable_handler(self.votable_interceptor.last_payload) return results def get_table_names(self): """ Returns a list of the available tables to query. Returns the names of all the tables that can be queried via the webservice. Returns ------- tables.array: `numpy.ma.core.MaskedArray` A VOtable table of available tables names Examples -------- >>> from sunpy.net.helio import hec >>> hc = hec.HECClient() # doctest: +REMOTE_DATA >>> print(hc.get_table_names()) # doctest: +SKIP [('timed_see_flare',) ('hi_event',) ('yohkoh_flare_list',) ('wind_mfi_bs_crossing_time',) ('seeds_soho',) ('seeds_stb',) ... ('rhessi_hxr_flare',) ('cactus_soho_flow',) ('cactus_soho_cme',) ('stereob_het_sep',)] """ self.hec_client.service.getTableNames() tables = votable_handler(self.votable_interceptor.last_payload) return tables.array def make_table_list(self): """ Creates a list of table names and prompts the user for a choice This takes the table of table names from get_table_names(), creates a list of the names, sorts them, then presents the tables in a convenient menu for the user to choose from. It returns a string containing the name of the table that the user picked. Returns ------- temp: `str` contains the name of the table that the user picked. Examples -------- >>> from sunpy.net.helio import hec >>> hc = hec.HECClient() # doctest: +REMOTE_DATA >>> hc.make_table_list() # doctest: +SKIP """ table_list = [] tables = self.get_table_names() for i in tables: table = i[0] if len(table) > 0: table_list.append(table) table_list.sort() for index, table in enumerate(table_list): print(('{number:3d}) {table}'.format(number=index + 1, table=table))) while True: stdinput = input("\nPlease enter a table number between 1 and " "{elem:d} " "('e' to exit): ".format(elem=len(table_list))) if stdinput.lower() == "e" or stdinput.lower() == "exit": temp = None break temp = [int(s) for s in stdinput.split() if s.isdigit()] temp = temp[0] - 1 if temp in range(0, len(table_list)): temp = table_list[temp] break else: print("Choice outside of bounds") return temp sunpy-0.8.3/sunpy/net/helio/parser.py0000644000175000017500000001715113232563447020024 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- # Author: Michael Malocha # Last Edit: September 22nd, 2013 # # This module was developed with funding from the GSOC 2013 summer of code # """ This module is meant to parse the HELIO registry and return WSDL endpoints to facilitate the interfacing between further modules and HELIO. """ from __future__ import absolute_import, print_function import xml.etree.ElementTree as EL from bs4 import BeautifulSoup from contextlib import closing from sunpy.net.helio import registry_links as RL from sunpy.extern.six.moves import urllib __author__ = 'Michael Malocha' __version__ = 'September 22nd, 2013' # Lifespan in seconds before a link times-out LINK_TIMEOUT = 3 def webservice_parser(service='HEC'): """ Quickly parses important contents from HELIO registry. Uses the link contained in registry_links in with 'service' appended and scrapes the web-service links contained on that webpage. Parameters ---------- service: str Indicates which particular HELIO service is used. Defaults to HEC. Returns ------- links: list or NoneType List of urls to registries containing WSDL endpoints. Examples -------- >>> from sunpy.net.helio import parser >>> parser.webservice_parser() # doctest: +SKIP ['http://msslkz.mssl.ucl.ac.uk/helio-hec/HelioService', 'http://festung3.oats.inaf.it:8080/helio-hec/HelioService', 'http://festung1.oats.inaf.it:8080/helio-hec/HelioService', 'http://hec.helio-vo.eu/helio_hec/HelioService', 'http://msslkz.mssl.ucl.ac.uk/helio-hec/HelioLongQueryService', 'http://festung3.oats.inaf.it:8080/helio-hec/HelioLongQueryService', 'http://festung1.oats.inaf.it:8080/helio-hec/HelioLongQueryService', 'http://hec.helio-vo.eu/helio_hec/HelioLongQueryService'] """ link = RL.LINK + '/' + service.lower() xml = link_test(link) if xml is None: return None root = EL.fromstring(xml) links = [] for interface in root.iter('interface'): service_type = interface.attrib key = list(service_type.keys()) if len(key) > 0: value = service_type[key[0]] if value == 'vr:WebService': for url in interface.iter('accessURL'): if url.text not in links: links.append(url.text) return links def endpoint_parser(link): """ Takes a link to a list of endpoints and parses the WSDL links. Feeding 1 result from webservice_parser() into endpoint_parser() at a time will return a list of WSDL endpoints that are contained on the page from that link that was passed in. Parameters ---------- link: str A url to a page containing links to WSDL files. Returns ------- endpoints: list or NoneType A list containing all of the available WSDL endpoints from the passed in url. Examples -------- >>> from sunpy.net.helio import parser >>> parser.endpoint_parser('http://msslkz.mssl.ucl.ac.uk/helio-hec/HelioService') # doctest: +REMOTE_DATA +NORMALIZE_WHITESPACE ['http://helio.mssl.ucl.ac.uk:80/helio-hec/HelioService?wsdl', 'http://helio.mssl.ucl.ac.uk:80/helio-hec/HelioService1_0?wsdl', 'http://helio.mssl.ucl.ac.uk:80/helio-hec/HelioService1_0b?wsdl', 'http://helio.mssl.ucl.ac.uk:80/helio-hec/HelioLongQueryService?wsdl', 'http://helio.mssl.ucl.ac.uk:80/helio-hec/HelioLongQueryService1_0?wsdl', 'http://helio.mssl.ucl.ac.uk:80/helio-hec/HelioLongQueryService1_1?wsdl', 'http://helio.mssl.ucl.ac.uk:80/helio-hec/HelioLongQueryService1_0b?wsdl', 'http://helio.mssl.ucl.ac.uk:80/helio-hec/HelioTavernaService?wsdl'] """ endpoint_page = link_test(link) if endpoint_page is None: return None soup = BeautifulSoup(endpoint_page) endpoints = [] for web_link in soup.find_all('a'): url = web_link.get('href') if url not in endpoints: endpoints.append(url) return endpoints def taverna_parser(link): """ Takes a link to a list of endpoints and parses the taverna WSDL links. Takes a url to a page containing a list of endpoints, then passes that url to endpoint_parser(). Upon receiving the resulting list from the parser taverna_parser() goes through the list and finds all the WSDL links for the taverna web-service. It then returns a list containing the filtered links. Parameters ---------- link: str A url to a page containing links to WSDL files. Returns ------- taverna_links: list or NoneType A list containing WSDL links for a taverna web-service Examples -------- >>> from sunpy.net.helio import parser >>> parser.taverna_parser('http://msslkz.mssl.ucl.ac.uk/helio-hec/HelioService') # doctest: +REMOTE_DATA ['http://helio.mssl.ucl.ac.uk:80/helio-hec/HelioTavernaService?wsdl'] """ endpoints = endpoint_parser(link) taverna_links = [] if endpoints is None: return None for web_link in endpoints: if 'Taverna' in web_link and web_link not in taverna_links: taverna_links.append(web_link) if len(taverna_links) == 0: return None return taverna_links def link_test(link): """ Just a quick function to test a link. Quickly checks to see if the URL is a valid link; if it is it returns the downloaded contents of that page. Parameters ---------- link: str A string containing a URL Returns ------- webpage: str or NoneType String containing the webresults Examples -------- >>> from sunpy.net.helio import parser >>> result = parser.link_test('http://msslkz.mssl.ucl.ac.uk/helio-hec/HelioService') # doctest: +REMOTE_DATA >>> print(parser.link_test('http://rrnx.invalid_url5523.com')) # doctest: +REMOTE_DATA None """ try: with closing(urllib.request.urlopen(link, timeout=LINK_TIMEOUT)) as fd: return fd.read() except (ValueError, urllib.error.URLError): return None def wsdl_retriever(service='HEC'): """ Retrieves a link to a taverna WSDL file This is essentially the master method, from it all the other functions get called and it essentially knits everything together. It gets a list of service links via webservice_parser(), then filters the results via taverna_parser(). Finally it tests all the returned taverna WSDL links and returns the first live taverna endpoint. Parameters ---------- service: str Indicates which particular HELIO service is used. Defaults to HEC. Returns ------- wsdl: str URL to a single live taverna endpoint Examples -------- >>> from sunpy.net.helio import parser >>> parser.wsdl_retriever() # doctest: +REMOTE_DATA 'http://helio.mssl.ucl.ac.uk:80/helio_hec/HelioTavernaService?wsdl' Notes ----- * Currently only support for HEC exists, but it was designed so that it could be expanded at a later date * There is a 3 second timeout lifespan on links, so there is potential for this function to take a while to return. Timeout duration can be controlled through the LINK_TIMEOUT value """ service_links = webservice_parser(service=service) wsdl = None wsdl_links = None if service_links is None: return None for link in service_links: wsdl_links = taverna_parser(link) if wsdl_links is None: return None for end_point in wsdl_links: if end_point is not None and link_test(end_point) is not None: wsdl = end_point break return wsdl sunpy-0.8.3/sunpy/net/helio/registry_links.py0000644000175000017500000000047013231613140021555 0ustar nabilnabil00000000000000# contains links to HELIO registries from __future__ import absolute_import """ The following link is the link to the registry, should it be necessary, this link can easily be replaced or swapped. """ LINK = 'http://helio.ukssdc.ac.uk/helio_registry/viewResourceEntry_body.jsp?XML=true&IVORN=ivo://helio-vo.eu' sunpy-0.8.3/sunpy/net/jsoc/0000755000175000017500000000000013232563477016012 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/net/jsoc/tests/0000755000175000017500000000000013232563477017154 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/net/jsoc/tests/__init__.py0000644000175000001440000000000013203275053020225 0ustar nabil00000000000000sunpy-0.8.3/sunpy/net/jsoc/tests/test_attr.py0000644000175000017500000000376113231613140021524 0ustar nabilnabil00000000000000import pytest import astropy.units as u import sunpy.net.jsoc as jsoc import sunpy.net.jsoc.attrs as attrs from sunpy.net.attr import Attr, AttrOr, AttrAnd @pytest.mark.parametrize(("attr1, attr2"), [ (attrs.Series('foo'), attrs.Series('boo')), (attrs.Protocol('a1'), attrs.Protocol('a2')), (attrs.Notify('email@somemail.com'), attrs.Notify('someemail@somemail.com')), (attrs.Compression('rice'), attrs.Compression('rice'))]) def test_and(attr1, attr2): pytest.raises(TypeError, lambda: attr1 & attr2) def test_basicquery(): a1 = attrs.Series('foo') t1 = attrs.Time('2012/01/01', '2013/1/2') ans1 = jsoc.jsoc.and_(a1, t1) assert isinstance(ans1, AttrAnd) assert len(ans1.attrs) == 2 def test_mediumquery(): a1 = attrs.Series('foo1') a2 = attrs.Series('foo2') t1 = attrs.Time('2012/01/01', '2013/1/2') ans1 = jsoc.jsoc.and_(a1 | a2, t1) assert isinstance(ans1, AttrOr) assert isinstance(ans1.attrs[0], AttrAnd) assert isinstance(ans1.attrs[1], AttrAnd) def test_complexquery(): a1 = attrs.Series('foo1') a2 = attrs.Series('foo2') t1 = attrs.Time('2012/01/01', '2013/1/2') t2 = attrs.Time('2012/01/01', '2013/1/3') ans1 = jsoc.jsoc.and_(a1 | a2, t1 | t2) assert isinstance(ans1.attrs[0], AttrOr) assert isinstance(ans1.attrs[0].attrs[0], AttrAnd) assert isinstance(ans1.attrs[0].attrs[1], AttrAnd) def test_wavelength_error(): with pytest.raises(TypeError): w1 = attrs.Wavelength('wobble') with pytest.raises(TypeError): w1 = attrs.Wavelength(3.24) with pytest.raises(TypeError): w1 = attrs.Wavelength((3,3)) def test_wave_self(): w1 = attrs.Wavelength(193*u.AA) assert jsoc.jsoc.and_(w1 | w1) is w1 def test_duplicate(): w1 = attrs.Wavelength(193*u.AA) w2 = attrs.Wavelength(193*u.AA) assert jsoc.jsoc.and_(w1 | w2).min is w1.min def test_random(): w1 = attrs.Wavelength(193*u.AA) w2 = attrs.Series('spam') assert jsoc.jsoc.and_(w1 | w2) == AttrOr([w1, w2]) sunpy-0.8.3/sunpy/net/jsoc/tests/test_jsoc.py0000644000175000017500000002214013231613140021500 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- """ Created on Wed Mar 26 20:17:06 2014 @author: stuart """ import os import tempfile import datetime import astropy.table import astropy.time import astropy.units as u import pytest from sunpy.time import parse_time from sunpy.net.jsoc import JSOCClient, JSOCResponse from sunpy.net.download import Results import sunpy.net.jsoc.attrs as attrs import sunpy.net.vso.attrs as vso_attrs client = JSOCClient() def test_jsocresponse_double(): j1 = JSOCResponse(table=astropy.table.Table(data=[[1, 2, 3, 4]])) j1.append(astropy.table.Table(data=[[1, 2, 3, 4]])) assert isinstance(j1, JSOCResponse) assert all(j1.table == astropy.table.vstack([astropy.table.Table( data=[[1, 2, 3, 4]]), astropy.table.Table(data=[[1, 2, 3, 4]])])) def test_jsocresponse_single(): j1 = JSOCResponse(table=None) assert len(j1) == 0 j1.append(astropy.table.Table(data=[[1, 2, 3, 4]])) assert all(j1.table == astropy.table.Table(data=[[1, 2, 3, 4]])) assert len(j1) == 4 def test_payload(): start = parse_time('2012/1/1T00:00:00') end = parse_time('2012/1/1T00:00:45') payload = client._make_query_payload(start, end, 'hmi.M_42s', notify='@') payload_expected = { 'ds': '{0}[{1}-{2}]'.format('hmi.M_42s', start.strftime("%Y.%m.%d_%H:%M:%S_TAI"), end.strftime("%Y.%m.%d_%H:%M:%S_TAI")), 'format': 'json', 'method': 'url', 'notify': '@', 'op': 'exp_request', 'process': 'n=0|no_op', 'protocol': 'FITS,compress Rice', 'requestor': 'none', 'filenamefmt': '{0}.{{T_REC:A}}.{{CAMERA}}.{{segment}}'.format('hmi.M_42s') } assert payload == payload_expected def test_payload_nocompression(): start = parse_time('2012/1/1T00:00:00') end = parse_time('2012/1/1T00:00:45') payload = client._make_query_payload( start, end, 'hmi.M_42s', compression=None, notify='jsoc@cadair.com') payload_expected = { 'ds': '{0}[{1}-{2}]'.format('hmi.M_42s', start.strftime("%Y.%m.%d_%H:%M:%S_TAI"), end.strftime("%Y.%m.%d_%H:%M:%S_TAI")), 'format': 'json', 'method': 'url', 'notify': 'jsoc@cadair.com', 'op': 'exp_request', 'process': 'n=0|no_op', 'protocol': 'FITS, **NONE**', 'requestor': 'none', 'filenamefmt': '{0}.{{T_REC:A}}.{{CAMERA}}.{{segment}}'.format('hmi.M_42s') } assert payload == payload_expected def test_payload_protocol(): start = parse_time('2012/1/1T00:00:00') end = parse_time('2012/1/1T00:00:45') payload = client._make_query_payload( start, end, 'hmi.M_42s', protocol='as-is', notify='jsoc@cadair.com') payload_expected = { 'ds': '{0}[{1}-{2}]'.format('hmi.M_42s', start.strftime("%Y.%m.%d_%H:%M:%S_TAI"), end.strftime("%Y.%m.%d_%H:%M:%S_TAI")), 'format': 'json', 'method': 'url', 'notify': 'jsoc@cadair.com', 'op': 'exp_request', 'process': 'n=0|no_op', 'protocol': 'as-is', 'requestor': 'none', 'filenamefmt': '{0}.{{T_REC:A}}.{{CAMERA}}.{{segment}}'.format('hmi.M_42s') } assert payload == payload_expected def test_process_time_string(): start = client._process_time('2012/1/1T00:00:00') assert start == datetime.datetime(year=2012, month=1, day=1, second=34) def test_process_time_datetime(): start = client._process_time(datetime.datetime(year=2012, month=1, day=1)) assert start == datetime.datetime(year=2012, month=1, day=1, second=34) def test_process_time_astropy(): start = client._process_time( astropy.time.Time( '2012-01-01T00:00:00', format='isot', scale='utc')) assert start == datetime.datetime(year=2012, month=1, day=1, second=34) def test_process_time_astropy_tai(): start = client._process_time( astropy.time.Time( '2012-01-01T00:00:00', format='isot', scale='tai')) assert start == datetime.datetime(year=2012, month=1, day=1, second=0) @pytest.mark.remote_data def test_status_request(): r = client._request_status('none') assert r.json() == { u'error': u'requestid none is not an acceptable ID for the external export system (acceptable format is JSOC_YYYYMMDD_NNN_X_IN or JSOC_YYYYMMDD_NNN).', u'status': 4 } def test_empty_jsoc_response(): Jresp = JSOCResponse() assert Jresp.table is None assert Jresp.query_args is None assert Jresp.requestIDs is None assert str(Jresp) == 'None' assert repr(Jresp) == 'None' assert len(Jresp) == 0 @pytest.mark.remote_data def test_query(): Jresp = client.search( attrs.Time('2012/1/1T00:00:00', '2012/1/1T00:01:30'), attrs.Series('hmi.M_45s'), vso_attrs.Sample(90 * u.second)) assert isinstance(Jresp, JSOCResponse) assert len(Jresp) == 2 @pytest.mark.flaky(reruns=5) @pytest.mark.remote_data def test_post_pass(): responses = client.search( attrs.Time('2012/1/1T00:00:00', '2012/1/1T00:00:45'), attrs.Series('hmi.M_45s'), attrs.Notify('jsoc@cadair.com')) aa = client.request_data(responses, return_resp=True) tmpresp = aa[0][0].json() assert tmpresp['status'] == 2 assert tmpresp['protocol'] == 'FITS,compress Rice' assert tmpresp['method'] == 'url' @pytest.mark.remote_data def test_post_wavelength(): responses = client.search( attrs.Time('2010/07/30T13:30:00', '2010/07/30T14:00:00'), attrs.Series('aia.lev1_euv_12s'), attrs.Wavelength(193 * u.AA) | attrs.Wavelength(335 * u.AA), attrs.Notify('jsoc@cadair.com')) aa = client.request_data(responses, return_resp=True) tmpresp = aa[0][0].json() assert tmpresp['status'] == 2 assert tmpresp['protocol'] == 'FITS,compress Rice' assert tmpresp['method'] == 'url' assert tmpresp['rcount'] == 151 tmpresp = aa[1][0].json() assert tmpresp['status'] == 2 assert tmpresp['protocol'] == 'FITS,compress Rice' assert tmpresp['method'] == 'url' assert tmpresp['rcount'] == 151 @pytest.mark.remote_data def test_post_notify_fail(): responses = client.search( attrs.Time('2012/1/1T00:00:00', '2012/1/1T00:00:45'), attrs.Series('hmi.M_45s')) with pytest.raises(ValueError): client.request_data(responses, return_resp=True) @pytest.mark.remote_data() def test_post_wave_series(): with pytest.raises(TypeError): client.search( attrs.Time('2012/1/1T00:00:00', '2012/1/1T00:00:45'), attrs.Series('hmi.M_45s') | attrs.Series('aia.lev1_euv_12s'), attrs.Wavelength(193 * u.AA) | attrs.Wavelength(335 * u.AA)) @pytest.mark.remote_data def test_post_fail(recwarn): res = client.search( attrs.Time('2012/1/1T00:00:00', '2012/1/1T00:00:45'), attrs.Series('none'), attrs.Notify('jsoc@cadair.com')) client.request_data(res, return_resp=True) w = recwarn.pop(Warning) assert issubclass(w.category, Warning) assert "Query 0 retuned status 4 with error Series none is not a valid series accessible from hmidb2." == str( w.message) assert w.filename assert w.lineno @pytest.mark.remote_data def test_request_status_fail(): resp = client._request_status('none') assert resp.json() == { u'status': 4, u'error': u"requestid none is not an acceptable ID for the external export system (acceptable format is JSOC_YYYYMMDD_NNN_X_IN or JSOC_YYYYMMDD_NNN)." } resp = client._request_status(['none']) assert resp.json() == { u'status': 4, u'error': u"requestid none is not an acceptable ID for the external export system (acceptable format is JSOC_YYYYMMDD_NNN_X_IN or JSOC_YYYYMMDD_NNN)." } @pytest.mark.remote_data def test_wait_get(): responses = client.search( attrs.Time('2012/1/1T1:00:36', '2012/1/1T01:00:38'), attrs.Series('hmi.M_45s'), attrs.Notify('jsoc@cadair.com')) path = tempfile.mkdtemp() res = client.fetch(responses, path=path) assert isinstance(res, Results) assert res.total == 1 @pytest.mark.remote_data def test_get_request(): responses = client.search( attrs.Time('2012/1/1T1:00:36', '2012/1/1T01:00:38'), attrs.Series('hmi.M_45s'), attrs.Notify('jsoc@cadair.com')) bb = client.request_data(responses) path = tempfile.mkdtemp() aa = client.get_request(bb, path=path) assert isinstance(aa, Results) @pytest.mark.remote_data def test_results_filenames(): responses = client.search( attrs.Time('2014/1/1T1:00:36', '2014/1/1T01:01:38'), attrs.Series('hmi.M_45s'), attrs.Notify('jsoc@cadair.com')) path = tempfile.mkdtemp() aa = client.fetch(responses, path=path) assert isinstance(aa, Results) files = aa.wait(progress=False) assert len(files) == len(responses) for hmiurl in aa.map_: assert os.path.isfile(hmiurl) @pytest.mark.remote_data def test_invalid_query(): with pytest.raises(ValueError): client.search(attrs.Time('2012/1/1T01:00:00', '2012/1/1T01:00:45')) sunpy-0.8.3/sunpy/net/jsoc/__init__.py0000644000175000001440000000010513203275053017071 0ustar nabil00000000000000from sunpy.net.jsoc.jsoc import * from sunpy.net.jsoc.attrs import * sunpy-0.8.3/sunpy/net/jsoc/attrs.py0000644000175000017500000000451213231613140017501 0ustar nabilnabil00000000000000from __future__ import absolute_import from sunpy.net.attr import AttrWalker, AttrAnd, AttrOr from sunpy.net.vso.attrs import _VSOSimpleAttr from sunpy.net.vso.attrs import Time, Wavelength __all__ = ['Series', 'Protocol', 'Notify', 'Compression', 'Segment'] class Series(_VSOSimpleAttr): """ The JSOC Series to Download. See `this_` for a list of series'. """ pass class Segment(_VSOSimpleAttr): """ Segments choose which files to download when there are more than one present for each record e.g. 'image' """ pass class Protocol(_VSOSimpleAttr): """ The type of download to request one of ("FITS", "JPEG", "MPG", "MP4", or "as-is"). Only FITS is supported, the others will require extra keywords. """ pass class Notify(_VSOSimpleAttr): """ An email address to get a notification to when JSOC has staged your request """ def __init__(self, value): super(Notify, self).__init__(value) if value.find('@') == -1: raise ValueError("Notify attribute must contain an '@' symbol " "to be a valid email address") self.value = value class Compression(_VSOSimpleAttr): """ Compression format for requested files. 'rice' or None, download FITS files with RICE compression. """ pass walker = AttrWalker() @walker.add_creator(AttrAnd, _VSOSimpleAttr, Time) def _create(wlk, query): map_ = {} wlk.apply(query, map_) return [map_] @walker.add_applier(AttrAnd) def _apply(wlk, query, imap): for iattr in query.attrs: wlk.apply(iattr, imap) @walker.add_applier(_VSOSimpleAttr) def _apply1(wlk, query, imap): imap[query.__class__.__name__.lower()] = query.value @walker.add_applier(Time) def _apply2(wlk, query, imap): imap['start_time'] = query.start imap['end_time'] = query.end @walker.add_applier(Wavelength) def _apply_wave(wlk, query, imap): if query.min != query.max: raise ValueError( "For JSOC queries Wavelength.min must equal Wavelength.max") imap[query.__class__.__name__.lower()] = query.min @walker.add_creator(AttrOr) def _create1(wlk, query): qblocks = [] for iattr in query.attrs: qblocks.extend(wlk.create(iattr)) return qblocks sunpy-0.8.3/sunpy/net/jsoc/jsoc.py0000644000175000017500000006004313231613140017303 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- from __future__ import print_function, absolute_import import os import time import warnings import requests import numpy as np import astropy.units as u import astropy.time import astropy.table from astropy.utils.misc import isiterable from sunpy import config from sunpy.time import parse_time, TimeRange from sunpy.net.download import Downloader, Results from sunpy.net.attr import and_ from sunpy.net.jsoc.attrs import walker from sunpy.extern.six.moves import urllib from sunpy.extern import six from sunpy.util import deprecated __all__ = ['JSOCClient', 'JSOCResponse'] JSOC_INFO_URL = 'http://jsoc.stanford.edu/cgi-bin/ajax/jsoc_info' JSOC_EXPORT_URL = 'http://jsoc.stanford.edu/cgi-bin/ajax/jsoc_fetch' BASE_DL_URL = 'http://jsoc.stanford.edu' class JSOCResponse(object): def __init__(self, table=None): """ table : `astropy.table.Table` """ self.table = table self.query_args = None self.requestIDs = None def __str__(self): return str(self.table) def __repr__(self): return repr(self.table) def _repr_html_(self): return self.table._repr_html_() def __len__(self): if self.table is None: return 0 else: return len(self.table) def append(self, table): if self.table is None: self.table = table else: self.table = astropy.table.vstack([self.table, table]) class JSOCClient(object): """ This is a Client to the JSOC Data Export service. It exposes a similar API to the VSO client, although the underlying model is more complex. The JSOC stages data before you can download it, so a JSOC query is a three stage process, first you query the JSOC for records, a table of these records is returned. Then you can request these records to be staged for download and then you can download them. The last two stages of this process are bundled together into the `get()` method, but they can be separated if you are performing a large or complex query. .. warning:: JSOC now requires you to register your email address before requesting data. See this site: http://jsoc.stanford.edu/ajax/register_email.html Notes ----- This Client mocks input to this site: http://jsoc.stanford.edu/ajax/exportdata.html Therefore that is a good resource if things are mis-behaving. The full list of 'series' is available through this site: http://jsoc.stanford.edu/ You can build more complex queries by specifying parameters to POST to JSOC via keyword arguments. You can generate these kwargs using the Export Data page at JSOC. JSOC now requires a validated email address, you can pass in your validated email address using the `~sunpy.net.jsoc.attrs.Notify` attribute. You have to register your email address with JSOC http://jsoc.stanford.edu/ajax/register_email.html. Examples -------- *Example 1* Query JSOC for some HMI data at 45 second cadence: >>> from sunpy.net import jsoc >>> from sunpy.net import attrs as a >>> client = jsoc.JSOCClient() # doctest: +REMOTE_DATA >>> response = client.search(a.Time('2014-01-01T00:00:00', '2014-01-01T01:00:00'), ... a.jsoc.Series('hmi.m_45s'), a.jsoc.Notify("sunpy@sunpy.org")) # doctest: +REMOTE_DATA the response object holds the records that your query will return: >>> print(response) # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE +REMOTE_DATA DATE TELESCOP INSTRUME ... WAVELNTH WAVEUNIT -------------------- -------- ---------- ... -------- --------------- 2014-01-05T17:44:53Z SDO/HMI HMI_FRONT2 ... 6173.0 Invalid KeyLink 2014-01-05T17:46:02Z SDO/HMI HMI_FRONT2 ... 6173.0 Invalid KeyLink 2014-01-05T17:47:11Z SDO/HMI HMI_FRONT2 ... 6173.0 Invalid KeyLink 2014-01-05T17:48:18Z SDO/HMI HMI_FRONT2 ... 6173.0 Invalid KeyLink ... ... ... ... ... ... 2014-01-05T17:42:33Z SDO/HMI HMI_FRONT2 ... 6173.0 Invalid KeyLink 2014-01-05T17:43:41Z SDO/HMI HMI_FRONT2 ... 6173.0 Invalid KeyLink 2014-01-05T17:44:52Z SDO/HMI HMI_FRONT2 ... 6173.0 Invalid KeyLink Length = 81 rows You can then make the request and download the data: >>> res = client.fetch(response) # doctest: +SKIP This returns a Results instance which can be used to watch the progress of the download. >>> res.wait(progress=True) # doctest: +SKIP *Example 2* Query the JSOC for some AIA 171 data, and separate out the staging and the download steps: >>> import astropy.units as u >>> from sunpy.net import jsoc >>> from sunpy.net import attrs as a >>> client = jsoc.JSOCClient() # doctest: +REMOTE_DATA >>> response = client.search(a.Time('2014/1/1T00:00:00', '2014/1/1T00:00:36'), ... a.jsoc.Series('aia.lev1_euv_12s'), a.jsoc.Segment('image'), ... a.jsoc.Wavelength(171*u.AA), a.jsoc.Notify("sunpy@sunpy.org")) # doctest: +REMOTE_DATA the response object holds the records that your query will return: >>> print(response) # doctest: +REMOTE_DATA DATE TELESCOP INSTRUME T_OBS WAVELNTH WAVEUNIT -------------------- -------- -------- ----------------------- -------- -------- 2014-01-06T15:07:12Z SDO/AIA AIA_3 2013-12-31T23:59:36.34Z 171 angstrom 2014-01-06T15:07:12Z SDO/AIA AIA_3 2013-12-31T23:59:48.34Z 171 angstrom 2014-01-07T15:05:10Z SDO/AIA AIA_3 2014-01-01T00:00:00.34Z 171 angstrom 2014-01-07T15:05:10Z SDO/AIA AIA_3 2014-01-01T00:00:12.34Z 171 angstrom You can then make the request: >>> requestIDs = client.request_data(response) # doctest: +SKIP [u'JSOC_20140724_952'] This returns a list of all the request identifiers for your query. You can then check the status of the request, which will print out a status message and return you the status code, a code of 1 means it is not ready to download and a code of 0 means the request is staged and ready. A code of 6 means an error, which is commonly that the request has not had time to get into the queue. >>> status = client.check_request(requestIDs) # doctest: +SKIP Request JSOC_20140724_955 was submitted 10 seconds ago, it is not ready to download. Once the status code is 0 you can download the data using the `get_request` method: >>> res = client.get_request(requestIDs) # doctest: +SKIP This returns a Results instance which can be used to watch the progress of the download. >>> res.wait(progress=True) # doctest: +SKIP """ def search(self, *query, **kwargs): """ Build a JSOC query and submit it to JSOC for processing. Takes a variable number of :mod:`sunpy.net.jsoc.attrs` as parameters, which are chained together using the AND (`&`) operator. Complex queries to be easily formed using logical operators such as `&` and `|`, in the same way as the VSO client. Examples -------- Request all AIA 304 image data between 2010-01-01T00:00 and 2010-01-01T01:00 in rice compressed form. >>> import astropy.units as u >>> from sunpy.net import jsoc >>> from sunpy.net import attrs as a >>> client = jsoc.JSOCClient() # doctest: +REMOTE_DATA >>> response = client.search(a.Time('2010-01-01T00:00:00', '2010-01-01T01:00:00'), ... a.jsoc.Series('aia.lev1_euv_12s'), a.jsoc.Wavelength(304*u.AA), ... a.jsoc.Compression('rice'), a.jsoc.Segment('image')) # doctest: +REMOTE_DATA Returns ------- results : JSOCResults object A collection of records that the query returns. """ return_results = JSOCResponse() query = and_(*query) blocks = [] for block in walker.create(query): iargs = kwargs.copy() iargs.update(block) blocks.append(iargs) return_results.append(self._lookup_records(iargs)) return_results.query_args = blocks return return_results @deprecated('0.8', alternative='JSOCClient.search') def query(self, *query, **kwargs): """ See `~sunpy.net.jsoc.jsoc.JSOCClient.search` """ return self.search(*query, **kwargs) def request_data(self, jsoc_response, **kwargs): """ Request that JSOC stages the data for download. Parameters ---------- jsoc_response : JSOCResponse object The results of a query Returns ------- requestIDs : list of strings List of the JSOC request identifiers """ # A little (hidden) debug feature return_responses = kwargs.pop('return_resp', False) if len(kwargs): warn_message = "request_data got unexpected keyword arguments {0}" raise TypeError(warn_message.format(list(kwargs.keys()))) # Do a multi-request for each query block responses = [] requestIDs = [] for block in jsoc_response.query_args: # Do a multi-request for each query block responses.append(self._multi_request(**block)) for i, response in enumerate(responses[-1]): if response.status_code != 200: warn_message = "Query {0} retuned code {1}" warnings.warn( Warning(warn_message.format(i, response.status_code))) responses.pop(i) elif response.json()['status'] != 2: warn_message = "Query {0} retuned status {1} with error {2}" json_response = response.json() json_status = json_response['status'] json_error = json_response['error'] warnings.warn(Warning(warn_message.format(i, json_status, json_error))) responses[-1].pop(i) # Extract the IDs from the JSON requestIDs += [response.json()['requestid'] for response in responses[-1]] if return_responses: return responses return requestIDs def check_request(self, requestIDs): """ Check the status of a request and print out a message about it Parameters ---------- requestIDs : list or string A list of requestIDs to check Returns ------- status : list A list of status' that were returned by JSOC """ # Convert IDs to a list if not already if not isiterable(requestIDs) or isinstance(requestIDs, six.string_types): requestIDs = [requestIDs] allstatus = [] for request_id in requestIDs: u = self._request_status(request_id) status = int(u.json()['status']) if status == 0: # Data ready to download print("Request {0} was exported at {1} and is ready to " "download.".format(u.json()['requestid'], u.json()['exptime'])) elif status == 1: print_message = "Request {0} was submitted {1} seconds ago, " \ "it is not ready to download." print(print_message.format(u.json()['requestid'], u.json()['wait'])) else: print_message = "Request returned status: {0} with error: {1}" json_status = u.json()['status'] json_error = u.json()['error'] print(print_message.format(json_status, json_error)) allstatus.append(status) return allstatus def fetch(self, jsoc_response, path=None, overwrite=False, progress=True, max_conn=5, downloader=None, sleep=10): """ Make the request for the data in jsoc_response and wait for it to be staged and then download the data. Parameters ---------- jsoc_response : JSOCResponse object A response object path : string Path to save data to, defaults to SunPy download dir overwrite : bool Replace files with the same name if True progress : bool Print progress info to terminal max_conns : int Maximum number of download connections. downloader: `sunpy.download.Downloader` instance A Custom downloader to use sleep : int The number of seconds to wait between calls to JSOC to check the status of the request. Returns ------- results : a :class:`sunpy.net.vso.Results` instance A Results object """ # Make staging request to JSOC requestIDs = self.request_data(jsoc_response) # Add them to the response for good measure jsoc_response.requestIDs = requestIDs time.sleep(sleep/2.) r = Results(lambda x: None, done=lambda maps: [v['path'] for v in maps.values()]) while requestIDs: for i, request_id in enumerate(requestIDs): u = self._request_status(request_id) if progress: self.check_request(request_id) if u.status_code == 200 and u.json()['status'] == '0': rID = requestIDs.pop(i) r = self.get_request(rID, path=path, overwrite=overwrite, progress=progress, results=r) else: time.sleep(sleep) return r @deprecated('0.8', alternative='JSOCClient.fetch') def get(self, jsoc_response, path=None, overwrite=False, progress=True, max_conn=5, downloader=None, sleep=10): """ See `~sunpy.net.jsoc.jsoc.JSOCClient.fetch` """ return self.fetch(jsoc_response, path=path, overwrite=overwrite, progress=progress, max_conn=max_conn, downloader=downloader, sleep=sleep) def get_request(self, requestIDs, path=None, overwrite=False, progress=True, max_conn=5, downloader=None, results=None): """ Query JSOC to see if request_id is ready for download. If the request is ready for download, download it. Parameters ---------- requestIDs : list or string One or many requestID strings path : string Path to save data to, defaults to SunPy download dir overwrite : bool Replace files with the same name if True progress : bool Print progress info to terminal max_conns : int Maximum number of download connections. downloader : `sunpy.download.Downloader` instance A Custom downloader to use results: Results instance A Results manager to use. Returns ------- res: Results A Results instance or None if no URLs to download """ # Convert IDs to a list if not already if not isiterable(requestIDs) or isinstance(requestIDs, six.string_types): requestIDs = [requestIDs] if path is None: path = config.get('downloads', 'download_dir') path = os.path.expanduser(path) if downloader is None: downloader = Downloader(max_conn=max_conn, max_total=max_conn) # A Results object tracks the number of downloads requested and the # number that have been completed. if results is None: results = Results(lambda _: downloader.stop()) urls = [] for request_id in requestIDs: u = self._request_status(request_id) if u.status_code == 200 and u.json()['status'] == '0': for ar in u.json()['data']: is_file = os.path.isfile(os.path.join(path, ar['filename'])) if overwrite or not is_file: url_dir = BASE_DL_URL + u.json()['dir'] + '/' urls.append(urllib.parse.urljoin(url_dir, ar['filename'])) else: print_message = "Skipping download of file {} as it " \ "has already been downloaded" print(print_message.format(ar['filename'])) # Add the file on disk to the output results.map_.update({ar['filename']: {'path': os.path.join(path, ar['filename'])}}) if progress: print_message = "{0} URLs found for download. Totalling {1}MB" print(print_message.format(len(urls), u.json()['size'])) else: if progress: self.check_request(request_id) if urls: for url in urls: downloader.download(url, callback=results.require([url]), errback=lambda x: print(x), path=path) else: # Make Results think it has finished. results.require([]) results.poke() return results def _process_time(self, time): """ Take a UTC time string or datetime instance and generate a astropy.time object in TAI frame. Alternatively convert a astropy time object to TAI Parameters ---------- time: six.string_types or datetime or astropy.time Input time Returns ------- datetime, in TAI """ # Convert from any input (in UTC) to TAI if isinstance(time, six.string_types): time = parse_time(time) time = astropy.time.Time(time, scale='utc') time = time.tai # Change the scale to TAI return time.datetime def _make_recordset(self, start_time, end_time, series, wavelength='', segment='', **kwargs): # Build the dataset string # Extract and format Wavelength if wavelength: if not series.startswith('aia'): raise TypeError("This series does not support the wavelength attribute.") else: if isinstance(wavelength, list): wavelength = [int(np.ceil(wave.to(u.AA).value)) for wave in wavelength] wavelength = str(wavelength) else: wavelength = '[{0}]'.format(int(np.ceil(wavelength.to(u.AA).value))) # Extract and format segment if segment != '': segment = '{{{segment}}}'.format(segment=segment) sample = kwargs.get('sample', '') if sample: sample = '@{}s'.format(sample) dataset = '{series}[{start}-{end}{sample}]{wavelength}{segment}'.format( series=series, start=start_time.strftime("%Y.%m.%d_%H:%M:%S_TAI"), end=end_time.strftime("%Y.%m.%d_%H:%M:%S_TAI"), sample=sample, wavelength=wavelength, segment=segment) return dataset def _make_query_payload(self, start_time, end_time, series, notify=None, protocol='FITS', compression='rice', **kwargs): """ Build the POST payload for the query parameters """ if protocol.upper() == 'FITS' and compression and compression.lower() == 'rice': jprotocol = 'FITS,compress Rice' elif protocol.upper() == 'FITS': jprotocol = 'FITS, **NONE**' else: jprotocol = protocol if not notify: raise ValueError("JSOC queries now require a valid email address " "before they will be accepted by the server") dataset = self._make_recordset(start_time, end_time, series, **kwargs) kwargs.pop('wavelength', None) kwargs.pop('sample', None) # Build full POST payload payload = {'ds': dataset, 'format': 'json', 'method': 'url', 'notify': notify, 'op': 'exp_request', 'process': 'n=0|no_op', 'protocol': jprotocol, 'requestor': 'none', 'filenamefmt': '{0}.{{T_REC:A}}.{{CAMERA}}.{{segment}}'.format(series)} payload.update(kwargs) return payload def _send_jsoc_request(self, start_time, end_time, series, notify=None, protocol='FITS', compression='rice', **kwargs): """ Request that JSOC stages data for download This routine puts in a POST request to JSOC """ payload = self._make_query_payload(start_time, end_time, series, notify=notify, protocol=protocol, compression=compression, **kwargs) r = requests.post(JSOC_EXPORT_URL, data=payload) if r.status_code != 200: exception_message = "JSOC POST Request returned code {0}" raise Exception(exception_message.format(r.status_code)) return r, r.json() def _lookup_records(self, iargs): """ Do a LookData request to JSOC to workout what results the query returns """ keywords = ['DATE', 'TELESCOP', 'INSTRUME', 'T_OBS', 'WAVELNTH', 'WAVEUNIT'] if not all([k in iargs for k in ('start_time', 'end_time', 'series')]): error_message = "Both Time and Series must be specified for a "\ "JSOC Query" raise ValueError(error_message) postthis = {'ds': self._make_recordset(**iargs), 'op': 'rs_list', 'key': str(keywords)[1:-1].replace(' ', '').replace("'", ''), 'seg': '**NONE**', 'link': '**NONE**'} r = requests.get(JSOC_INFO_URL, params=postthis) result = r.json() out_table = {} if 'keywords' in result: for col in result['keywords']: out_table.update({col['name']: col['values']}) # sort the table before returning return astropy.table.Table(out_table)[keywords] else: return astropy.table.Table() def _multi_request(self, **kwargs): """ Make a series of requests to avoid the 100GB limit """ start_time = kwargs.pop('start_time', None) end_time = kwargs.pop('end_time', None) series = kwargs.pop('series', None) if any(x is None for x in (start_time, end_time, series)): return [] start_time = self._process_time(start_time) end_time = self._process_time(end_time) tr = TimeRange(start_time, end_time) returns = [] response, json_response = self._send_jsoc_request(start_time, end_time, series, **kwargs) # We skip these lines because a massive request is not a practical test. error_response = 'Request exceeds max byte limit of 100000MB' if (json_response['status'] == 3 and json_response['error'] == error_response): # pragma: no cover returns.append(self._multi_request(tr.start(), tr.center(), series, **kwargs)[0]) # pragma: no cover returns.append(self._multi_request(tr.center(), tr.end(), series, **kwargs)[0]) # pragma: no cover else: returns.append(response) return returns def _request_status(self, request_id): """ GET the status of a request ID """ payload = {'op': 'exp_status', 'requestid': request_id} u = requests.get(JSOC_EXPORT_URL, params=payload) return u @classmethod def _can_handle_query(cls, *query): chkattr = ['Series', 'Protocol', 'Notify', 'Compression', 'Wavelength', 'Time', 'Segment'] return all([x.__class__.__name__ in chkattr for x in query]) sunpy-0.8.3/sunpy/net/tests/0000755000175000017500000000000013232563477016216 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/net/tests/__init__.py0000644000175000001440000000000013203275053017267 0ustar nabil00000000000000sunpy-0.8.3/sunpy/net/tests/strategies.py0000644000175000017500000000525313232563447020744 0ustar nabilnabil00000000000000""" Provide a set of Hypothesis Strategies for various Fido related tests. """ import hypothesis.strategies as st from hypothesis import assume from hypothesis.extra.datetime import datetimes import datetime from sunpy.net import attrs as a from sunpy.time import parse_time, TimeRange @st.composite def timedelta(draw): """ Timedelta strategy that limits the maximum timedelta to being positive and abs max is about 100 weeks + 100 days + 100 hours + a bit """ keys = st.sampled_from(['days', 'seconds', 'microseconds', 'milliseconds', 'minutes', 'hours', 'weeks']) values = st.floats(min_value=1, max_value=100) delta = datetime.timedelta(**draw(st.dictionaries(keys, values))) # We don't want a 0 timedelta assume(delta.total_seconds() > 0) return delta def offline_instruments(): """ Returns a strategy for any instrument that does not need the internet to do a query """ offline_instr = ['lyra', 'noaa-indices', 'noaa-predict', 'goes'] offline_instr = st.builds(a.Instrument, st.sampled_from(offline_instr)) return st.one_of(offline_instr) def online_instruments(): """ Returns a strategy for any instrument that does not need the internet to do a query """ online_instr = ['rhessi'] online_instr = st.builds(a.Instrument, st.sampled_from(online_instr)) return online_instr @st.composite def time_attr(draw, time=datetimes(timezones=[], max_year=datetime.datetime.utcnow().year, min_year=1900), delta=timedelta()): """ Create an a.Time where it's always positive and doesn't have a massive time delta. """ t1 = draw(time) t2 = t1 + draw(delta) # We can't download data from the future... assume(t2 < datetime.datetime.utcnow()) return a.Time(t1, t2) @st.composite def goes_time(draw, time=datetimes(timezones=[], max_year=datetime.datetime.utcnow().year, min_year=1981), delta=timedelta()): """ Create an a.Time where it's always positive and doesn't have a massive time delta. """ t1 = draw(time) t2 = t1 + draw(delta) # We can't download data from the future... assume(t2 < datetime.datetime.utcnow()) tr = TimeRange(t1, t2) assume(parse_time("1983-05-01") not in tr) return a.Time(tr) def range_time(min_date, max_date=datetime.datetime.utcnow()): time = datetimes(timezones=[], max_year=max_date.year, min_year=1960) time = time.filter(lambda x: min_date < x < max_date) return time_attr(time=time) sunpy-0.8.3/sunpy/net/tests/test_attr.py0000644000175000017500000000151413231613140020560 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- # Author: Florian Mayer from __future__ import absolute_import from sunpy.net import attr from sunpy.net.vso import attrs def test_dummyattr(): one = attr.DummyAttr() other = attr.ValueAttr({'a': 'b'}) assert (one | other) is other assert (one & other) is other def test_and_nesting(): a = attr.and_(attrs.Level(0), attr.AttrAnd((attrs.Instrument('EVE'), attrs.Time("2012/1/1", "2012/01/02")))) # Test that the nesting has been removed. assert len(a.attrs) == 3 def test_or_nesting(): a = attr.or_(attrs.Instrument('a'), attr.AttrOr((attrs.Instrument('b'), attrs.Instrument('c')))) # Test that the nesting has been removed. assert len(a.attrs) == 3 sunpy-0.8.3/sunpy/net/tests/test_download.py0000644000175000017500000001014413231613140021414 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- # Author: Florian Mayer #pylint: disable=W0613 from __future__ import absolute_import import pytest import os import tempfile import threading from functools import partial import sunpy from sunpy.net.download import Downloader, default_name class CalledProxy(object): def __init__(self, fn): self.fn = fn self.fired = False def __call__(self, *args, **kwargs): self.fn(*args, **kwargs) self.fired = True class MockConfig(object): def __init__(self): self.dct = {} def add_section(self, name, dct): self.dct[name] = dct def get(self, one, other): return self.dct[one][other] def wait_for(n, callback): #pylint: disable=W0613 items = [] def _fun(handler): items.append(handler) if len(items) == n: callback(items) return _fun def path_fun(*args, **kwargs): raise ValueError def get_and_create_temp_directory(tmpdir): sunpy.config = MockConfig() sunpy.config.add_section( "downloads", {"download_dir": tmpdir} ) if not os.path.isdir(sunpy.config.get('downloads', 'download_dir')): os.makedirs(sunpy.config.get('downloads', 'download_dir')) return sunpy.config.get('downloads', 'download_dir') @pytest.mark.remote_data def test_path_exception(): x = threading.Event() dw = Downloader(1, 2) dw.download( "http://google.at", path_fun, errback=wait_for(1, lambda a: x.set()) ) th = threading.Thread(target=dw.wait) th.daemon = True th.start() x.wait(10) assert x.isSet() dw.stop() @pytest.mark.remote_data def test_download_http(): items = [] lck = threading.Lock() def wait_for(n, callback): # pylint: disable=W0613 def _fun(handler): with lck: items.append(handler) if len(items) == n: callback(items) return _fun tmp = tempfile.mkdtemp() path_fun = partial(default_name, tmp) dw = Downloader(1, 1) _stop = lambda _: dw.stop() timeout = CalledProxy(dw.stop) timer = threading.Timer(60, timeout) timer.start() on_finish = wait_for(3, lambda _: dw.stop()) dw.download('http://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js', path_fun, on_finish) dw.download('http://ajax.googleapis.com/ajax/libs/webfont/1.4.2/webfont.js', path_fun, on_finish) dw.download('https://raw.github.com/sunpy/sunpy/master/INSTALL.txt', path_fun, on_finish) # dw.download('ftp://speedtest.inode.at/speedtest-100mb', path_fun, on_finish) dw.wait() timer.cancel() assert len(items) == 3 assert not timeout.fired for item in items: assert os.path.exists(item['path']) @pytest.mark.remote_data def test_download_default_dir(): _config = sunpy.config try: tmpdir = tempfile.mkdtemp() path = get_and_create_temp_directory(tmpdir) dw = Downloader(1, 1) _stop = lambda _: dw.stop() timeout = CalledProxy(dw.stop) errback = CalledProxy(_stop) dw.download( 'http://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js', path=path, callback=_stop, errback=errback ) timer = threading.Timer(10, timeout) timer.start() dw.wait() timer.cancel() assert not timeout.fired assert not errback.fired assert os.path.exists(os.path.join(tmpdir, 'jquery.min.js')) finally: sunpy.config = _config @pytest.mark.remote_data def test_download_dir(): tmpdir = tempfile.mkdtemp() dw = Downloader(1, 1) _stop = lambda _: dw.stop() timeout = CalledProxy(dw.stop) errback = CalledProxy(_stop) dw.download( 'http://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js', tmpdir, callback=_stop, errback=errback ) timer = threading.Timer(10, timeout) timer.start() dw.wait() timer.cancel() assert not timeout.fired assert not errback.fired assert os.path.exists(os.path.join(tmpdir, 'jquery.min.js')) sunpy-0.8.3/sunpy/net/tests/test_fido.py0000644000175000017500000002077013231613140020534 0ustar nabilnabil00000000000000import os import copy import tempfile import pytest import hypothesis.strategies as st from hypothesis import given, assume, example import astropy.units as u from sunpy.net import attr from sunpy.net.vso import attrs as va from sunpy.net import Fido, attrs as a from sunpy.net.vso import QueryResponse as vsoQueryResponse from sunpy.net.fido_factory import DownloadResponse, UnifiedResponse from sunpy.net.dataretriever.client import CLIENTS, QueryResponse from sunpy.util.datatype_factory_base import NoMatchError, MultipleMatchError from sunpy.time import TimeRange, parse_time from sunpy import config from sunpy.net.tests.strategies import (online_instruments, offline_instruments, time_attr, range_time, goes_time) TIMEFORMAT = config.get("general", "time_format") @st.composite def offline_query(draw, instrument=offline_instruments()): """ Strategy for any valid offline query """ query = draw(instrument) # If we have AttrAnd then we don't have GOES if isinstance(query, a.Instrument) and query.value == 'norh': query &= a.Wavelength(17*u.GHz) if isinstance(query, a.Instrument) and query.value == 'goes': query &= draw(goes_time()) else: query = attr.and_(query, draw(time_attr())) return query @st.composite def online_query(draw, instrument=online_instruments(), time=time_attr()): query = draw(instrument) # If we have AttrAnd then we don't have RHESSI if isinstance(query, a.Instrument) and query.value == 'rhessi': # Build a time attr which does not span a month. year = draw(st.integers(min_value=2003, max_value=2017)) month = draw(st.integers(min_value=1, max_value=12)) days = draw(st.integers(min_value=1, max_value=28)) query = query & a.Time("{}-{}-01".format(year, month, days), "{}-{}-{}".format(year, month, days)) return query @given(offline_query()) def test_offline_fido(query): unifiedresp = Fido.search(query) check_response(query, unifiedresp) @pytest.mark.remote_data @given(online_query()) def test_online_fido(query): unifiedresp = Fido.search(query) check_response(query, unifiedresp) def check_response(query, unifiedresp): """ Common test for online or offline query """ query_tr = None query_instr = None for at in query.attrs: if isinstance(at, a.Time): query_tr = TimeRange(at.start, at.end) elif isinstance(at, a.Instrument): query_instr = at.value if not query_tr: raise ValueError("No Time Specified") for block in unifiedresp.responses: res_tr = block.time_range() for res in block: assert res.time.start in res_tr assert query_instr.lower() == res.instrument.lower() @pytest.mark.remote_data def test_save_path(): with tempfile.TemporaryDirectory() as target_dir: qr = Fido.search(a.Instrument('EVE'), a.Time("2016/10/01", "2016/10/02"), a.Level(0)) files = Fido.fetch(qr, path=os.path.join(target_dir, "{instrument}"+os.path.sep+"{level}")) for f in files: assert target_dir in f assert "eve{}0".format(os.path.sep) in f """ Factory Tests """ @pytest.mark.remote_data def test_unified_response(): start = parse_time("2012/1/1") end = parse_time("2012/1/2") qr = Fido.search(a.Instrument('EVE'), a.Level(0), a.Time(start, end)) assert qr.file_num == 2 strings = ['eve', 'SDO', start.strftime(TIMEFORMAT), end.strftime(TIMEFORMAT)] assert all(s in qr._repr_html_() for s in strings) def test_no_time_error(): query = (a.Instrument('EVE'), a.Level(0)) with pytest.raises(ValueError) as excinfo: Fido.search(*query) assert all(str(a) in str(excinfo.value) for a in query) query1 = (a.Instrument('EVE') & a.Level(0)) query2 = (a.Time("2012/1/1", "2012/1/2") & a.Instrument("AIA")) with pytest.raises(ValueError) as excinfo: Fido.search(query1 | query2) assert all(str(a) in str(excinfo.value) for a in query1.attrs) assert all(str(a) not in str(excinfo.value) for a in query2.attrs) def test_no_match(): with pytest.raises(NoMatchError): Fido.search(a.Time("2016/10/01", "2016/10/02"), a.jsoc.Series("bob"), a.vso.Sample(10*u.s)) def test_call_error(): with pytest.raises(TypeError) as excinfo: Fido() # Explicitly test all this error message as it's a copy of the one in # Python core. assert "'UnifiedDownloaderFactory' object is not callable" in str(excinfo.value) def test_multiple_match(): """ Using the builtin clients a multiple match is not possible so we create a dummy class. """ new_registry = copy.deepcopy(Fido.registry) Fido.registry = new_registry class DummyClient(): @classmethod def _can_handle_query(cls, *query): return True Fido.registry.update({DummyClient: DummyClient._can_handle_query}) with pytest.raises(MultipleMatchError): Fido.search(a.Time("2016/10/1", "2016/10/2"), a.Instrument('lyra')) Fido.registry = CLIENTS @pytest.mark.remote_data def test_no_wait_fetch(): qr = Fido.search(a.Instrument('EVE'), a.Time("2016/10/01", "2016/10/02"), a.Level(0)) res = Fido.fetch(qr, wait=False) assert isinstance(res, DownloadResponse) assert isinstance(res.wait(), list) """ UnifiedResponse Tests Use LYRA here because it does not use the internet to return results. """ def test_unifiedresponse_slicing(): results = Fido.search( a.Time("2012/1/1", "2012/1/5"), a.Instrument("lyra")) assert isinstance(results[0:2], UnifiedResponse) assert isinstance(results[0], UnifiedResponse) def test_unifiedresponse_slicing_reverse(): results = Fido.search( a.Time("2012/1/1", "2012/1/5"), a.Instrument("lyra")) assert isinstance(results[::-1], UnifiedResponse) assert len(results[::-1]) == len(results) assert isinstance(results[0, ::-1], UnifiedResponse) assert results[0, ::-1]._list[0] == results._list[0][::-1] def test_vso_unifiedresponse(): vrep = vsoQueryResponse([]) vrep.client = True uresp = UnifiedResponse(vrep) assert isinstance(uresp, UnifiedResponse) def test_responses(): results = Fido.search( a.Time("2012/1/1", "2012/1/5"), a.Instrument("lyra")) for i, resp in enumerate(results.responses): assert isinstance(resp, QueryResponse) assert i + 1 == len(results) def test_repr(): results = Fido.search( a.Time("2012/1/1", "2012/1/5"), a.Instrument("lyra")) rep = repr(results) rep = rep.split('\n') # 6 header lines, the results table and two blank lines at the end assert len(rep) == 7 + len(list(results.responses)[0]) + 2 def filter_queries(queries): return attr.and_(queries) not in queries @given(st.tuples(offline_query(), offline_query()).filter(filter_queries)) def test_fido_indexing(queries): query1, query2 = queries # This is a work around for an aberration where the filter was not catching # this. assume(query1.attrs[1].start != query2.attrs[1].start) res = Fido.search(query1 | query2) assert len(res) == 2 assert len(res[0]) == 1 assert len(res[1]) == 1 aa = res[0, 0] assert isinstance(aa, UnifiedResponse) assert len(aa) == 1 assert len(aa.get_response(0)) == 1 aa = res[:, 0] assert isinstance(aa, UnifiedResponse) assert len(aa) == 2 assert len(aa.get_response(0)) == 1 aa = res[0, :] assert isinstance(aa, UnifiedResponse) assert len(aa) == 1 with pytest.raises(IndexError): res[0, 0, 0] with pytest.raises(IndexError): res["saldkal"] with pytest.raises(IndexError): res[1.0132] @given(st.tuples(offline_query(), offline_query()).filter(filter_queries)) def test_fido_iter(queries): query1, query2 = queries # This is a work around for an aberration where the filter was not catching # this. assume(query1.attrs[1].start != query2.attrs[1].start) res = Fido.search(query1 | query2) for resp in res: assert isinstance(resp, QueryResponse) @given(offline_query()) def test_repr(query): res = Fido.search(query) for rep_meth in (res.__repr__, res.__str__, res._repr_html_): if len(res) == 1: assert "Provider" in rep_meth() assert "Providers" not in rep_meth() else: assert "Provider" not in rep_meth() assert "Providers" in rep_meth() sunpy-0.8.3/sunpy/net/tests/test_hek.py0000644000175000017500000000507213231613140020360 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- # Author: Florian Mayer #pylint: disable=W0613 from __future__ import absolute_import import pytest from sunpy.net import hek from sunpy.net import attr @pytest.fixture def foostrwrap(request): return hek.attrs._StringParamAttrWrapper("foo") def test_eventtype_collide(): with pytest.raises(TypeError): hek.attrs.AR & hek.attrs.CE with pytest.raises(TypeError): (hek.attrs.AR & hek.attrs.Time((2011, 1, 1), (2011, 1, 2))) & hek.attrs.CE with pytest.raises(TypeError): (hek.attrs.AR | hek.attrs.Time((2011, 1, 1), (2011, 1, 2))) & hek.attrs.CE def test_eventtype_or(): assert (hek.attrs.AR | hek.attrs.CE).item == "ar,ce" def test_paramattr(): res = hek.attrs.walker.create(hek.attrs._ParamAttr("foo", "=", "bar"), {}) assert len(res) == 1 assert res[0] == {'value0': 'bar', 'op0': '=', 'param0': 'foo'} def test_stringwrapper_eq(foostrwrap): res = hek.attrs.walker.create(foostrwrap == "bar", {}) assert len(res) == 1 assert res[0] == {'value0': 'bar', 'op0': '=', 'param0': 'foo'} def test_stringwrapper_lt(foostrwrap): res = hek.attrs.walker.create(foostrwrap < "bar", {}) assert len(res) == 1 assert res[0] == {'value0': 'bar', 'op0': '<', 'param0': 'foo'} def test_stringwrapper_gt(foostrwrap): res = hek.attrs.walker.create(foostrwrap > "bar", {}) assert len(res) == 1 assert res[0] == {'value0': 'bar', 'op0': '>', 'param0': 'foo'} def test_stringwrapper_le(foostrwrap): res = hek.attrs.walker.create(foostrwrap <= "bar", {}) assert len(res) == 1 assert res[0] == {'value0': 'bar', 'op0': '<=', 'param0': 'foo'} def test_stringwrapper_ge(foostrwrap): res = hek.attrs.walker.create(foostrwrap >= "bar", {}) assert len(res) == 1 assert res[0] == {'value0': 'bar', 'op0': '>=', 'param0': 'foo'} def test_stringwrapper_ne(foostrwrap): res = hek.attrs.walker.create(foostrwrap != "bar", {}) assert len(res) == 1 assert res[0] == {'value0': 'bar', 'op0': '!=', 'param0': 'foo'} def test_stringwrapper_like(foostrwrap): res = hek.attrs.walker.create(foostrwrap.like("bar"), {}) assert len(res) == 1 assert res[0] == {'value0': 'bar', 'op0': 'like', 'param0': 'foo'} def test_err_dummyattr_create(): with pytest.raises(TypeError): hek.attrs.walker.create(attr.DummyAttr(), {}) def test_err_dummyattr_apply(): with pytest.raises(TypeError): hek.attrs.walker.apply(attr.DummyAttr(), {}) sunpy-0.8.3/sunpy/net/tests/test_hek2vso.py0000644000175000017500000000401213231613140021163 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- # Author: Michael Malocha # e-mail: mmalocha13@gmail.com # Version: June 11th, 2013 # """ This module was built to test the HEK2VSO class. """ __author__ = 'Michael Malocha' __version__ = 'June 11th, 2013' import pytest from astropy import units as u from sunpy.net import hek from sunpy.net import vso from sunpy.net import hek2vso startTime = '2011/08/09 07:23:56' endTime = '2011/08/09 12:40:29' eventType = 'FL' instrument = 'eit' hekTime = hek.attrs.Time(startTime, endTime) hekEvent = hek.attrs.EventType(eventType) @pytest.fixture def h2v_client(): return hek2vso.H2VClient() @pytest.fixture def hek_client(): return hek.HEKClient() @pytest.fixture def vso_client(): vso.VSOClient() @pytest.mark.remote_data def test_translate_results_to_query(): """Make sure that conversion of HEK results to VSO queries is accurate""" h = hek.HEKClient() hek_query = h.search(hekTime, hekEvent) vso_query = hek2vso.translate_results_to_query(hek_query) if isinstance(hek_query, list): # Comparing length of two lists assert len(hek_query) == len(vso_query) #Comparing types of both queries assert type(hek_query) == type(vso_query) @pytest.mark.remote_data def test_vso_attribute_parse(): """Make sure that Parsing of VSO attributes from HEK queries is accurate""" h = hek.HEKClient() hek_query = h.search(hekTime, hekEvent) vso_query = hek2vso.vso_attribute_parse(hek_query[0]) # Checking Time # TODO # Checking Observatory assert vso_query[1].value == hek_query[0]['obs_observatory'] # Checking Instrument assert vso_query[2].value == hek_query[0]['obs_instrument'] # Checking Wavelength assert vso_query[3].min == hek_query[0]['obs_meanwavel'] * u.Unit(hek_query[0]['obs_wavelunit']) assert vso_query[3].max == hek_query[0]['obs_meanwavel'] * u.Unit( hek_query[0]['obs_wavelunit']) assert vso_query[3].unit == u.Unit('Angstrom') class TestH2VClient(object): """Tests the H2V class""" # TODO sunpy-0.8.3/sunpy/net/tests/test_helio.py0000644000175000017500000002325213232563447020730 0ustar nabilnabil00000000000000from __future__ import absolute_import import pytest try: # >= Py3.3 import unittest.mock as mock except ImportError: # Py 2.7 - Py.3.2 import mock from sunpy.net.helio import hec from sunpy.net.helio.parser import (endpoint_parser, link_test, taverna_parser, webservice_parser, wsdl_retriever) from sunpy.extern.six.moves import urllib def wsdl_endpoints(): """ Slightly simplified form of the content on http://msslkz.mssl.ucl.ac.uk/helio-hec/HelioService Intentionally contains duplicate URLs """ return '''
    Port Name:{http://helio-vo.eu/xml/QueryService/v1.0}HelioQueryServicePort
    http://helio.org/hec/HS1_0?wsdl
    http://helio.org/hec/HS1_0b?wsdl
    http://helio.org/hec/HLQS?wsdl
    http://helio.org/hec/HLQS1_0?wsdl
    http://helio.org/hec/HS1_0?wsdl
    ''' def hec_urls(): """ intentionally contains duplicate 'accessURL' elements """ return ''' http://helio.uk/hec/HelioQueryService http://helio.uk/hec/HelioService http://msslkk.uk/hec/HelioService http://voparis.fr/hec/helio-hec/HelioService http://hec.eu/helio_hec/HelioService http://helio.uk/hec/HelioService http://helio.uk/hec/HelioLongQueryService http://hec.eu/helio_hec/HelioLongQueryService ''' def test_suds_unwrapper(): suds_output = """ ... """ expected_output = """ ... """ assert hec.suds_unwrapper(suds_output) == expected_output @pytest.mark.remote_data def test_webservice_parser(): result = webservice_parser() assert isinstance(result, list) def some_taverna_urls(): """ Some valid `Taverna` links, duplicates intentional """ return ('http://www.helio.uk/Taverna/hec?wsdl', 'http://not.a.taverna.link/helio?wsdl', 'http://www.abc.ord/HelioTavernaService?wsdl', 'http://another.not.a.taverna.link/helio?wsdl', 'http://www.helio.uk/Taverna/hec?wsdl') def wsdl_urls(): """ No `Taverna` links, just `WSDL` """ return ('http://helio.mssl.ucl.ac.uk:80/helio-hec/HelioTavernaService?wsdl', 'http://helio.mssl.ucl.ac.uk:80/helio-hec/HelioLongQueryService?wsdl', 'http://helio.mssl.ucl.ac.uk:80/helio-hec/HelioLongQueryService1_1?wsdl', 'http://helio.ucl.ac.uk:80/helio-hec/HelioLongQueryService1_0b?wsdl') # Test `sunpy.net.helio.parser.webservice_parser(...)` @mock.patch('sunpy.net.helio.parser.link_test', return_value=None) def test_webservice_parser_no_content(mock_link_test): """ No content from supplied URL? Return None """ assert webservice_parser('http://www.google.com') is None @mock.patch('sunpy.net.helio.parser.link_test', return_value=hec_urls()) def test_webservice_parser_get_links(mock_link_test): """ The `sunpy.net.helio.parser.link_test` returns an XML fragment with embedded `accessURL` elements. Ensure that all the `accessURL` are extracted and duplicates discarded. """ hec_links = webservice_parser('http://www.google.com') assert len(hec_links) == 6 assert 'http://helio.uk/hec/HelioService' in hec_links assert 'http://msslkk.uk/hec/HelioService' in hec_links assert 'http://voparis.fr/hec/helio-hec/HelioService' in hec_links assert 'http://hec.eu/helio_hec/HelioService' in hec_links assert 'http://helio.uk/hec/HelioLongQueryService' in hec_links assert 'http://hec.eu/helio_hec/HelioLongQueryService' in hec_links # Test `sunpy.net.helio.parser.endpoint_parser(...)` @mock.patch('sunpy.net.helio.parser.link_test', return_value=None) def test_endpoint_parser_no_content(mock_link_test): """ No content from the supplied URL? Return None """ assert endpoint_parser('http://example.com') is None @mock.patch('sunpy.net.helio.parser.link_test', return_value=wsdl_endpoints()) def test_endpoint_parser_get_links(mock_link_test): """ Get all the WSDL endpoints listed on the page of the supplied URL. Ensure duplicates are removed. """ endpoints = endpoint_parser('http://www.google.com') assert len(endpoints) == 4 assert 'http://helio.org/hec/HS1_0?wsdl' in endpoints assert 'http://helio.org/hec/HS1_0b?wsdl' in endpoints assert 'http://helio.org/hec/HLQS?wsdl' in endpoints assert 'http://helio.org/hec/HLQS1_0?wsdl' in endpoints # `sunpy.net.helio.parser.taverna_parser(...)` @mock.patch('sunpy.net.helio.parser.endpoint_parser', return_value=None) def test_taverna_parser_no_content(mock_endpoint_parser): """ No links at all? Return None """ assert taverna_parser('http://example.com') is None @mock.patch('sunpy.net.helio.parser.endpoint_parser', return_value=['http://try.the.pub/hec']) def test_taverna_parser_no_taverna_links(mock_endpoint_parser): """ There are some URLs but none of them Taverna URLs. Return `None` """ assert taverna_parser('http://www.google.com') is None @mock.patch('sunpy.net.helio.parser.endpoint_parser', return_value=some_taverna_urls()) def test_taverna_parser_get_taverna_links(mock_endpoint_parser): """ Retrieve all the Taverna URLs """ taverna_links = taverna_parser('http://www.google.com') assert len(taverna_links) == 2 assert 'http://www.helio.uk/Taverna/hec?wsdl' in taverna_links assert 'http://www.abc.ord/HelioTavernaService?wsdl' in taverna_links # Test `sunpy.net.helio.parser.wsdl_retriever(...)` @mock.patch('sunpy.net.helio.parser.webservice_parser', return_value=None) def test_wsdl_retriever_no_content(mock_endpoint_parser): """ No links found? Return None """ assert wsdl_retriever() is None @mock.patch('sunpy.net.helio.parser.webservice_parser', return_value=wsdl_urls()) @mock.patch('sunpy.net.helio.parser.taverna_parser', return_value=some_taverna_urls()) @mock.patch('sunpy.net.helio.parser.link_test', return_value='some text read') def test_wsdl_retriever_get_link(mock_link_test, mock_taverna_parser, mock_webservice_parser): """ Get a Taverna link """ assert wsdl_retriever() == 'http://www.helio.uk/Taverna/hec?wsdl' @mock.patch('sunpy.net.helio.parser.webservice_parser', return_value=wsdl_urls()) @mock.patch('sunpy.net.helio.parser.taverna_parser', return_value=None) def test_wsdl_retriever_no_taverna_urls(mock_taverna_parser, mock_webservice_parser): """ Unable to find any valid Taverna URLs? Return None """ assert wsdl_retriever() is None # Test `sunpy.net.helio.parser.link_test(...)` @mock.patch('sunpy.net.helio.parser.urllib.request.urlopen') def test_link_test(mock_urlopen): """ Read from an open, 'mocked', URL. """ class MockFile(object): def __init__(self, content): self.content = content def read(self): return self.content def close(self): return expected = 'T' mock_urlopen.return_value = MockFile(expected) assert link_test('http://www/google.com') == expected # The following two tests for `link_test` have empty URLs as arguments. This is because # when running the tests under Py2.7, I was getting the following error: # # "An attempt was made to connect to the internet by a test that was not marked `remote_data`" # # The empty URLs in no way invalidate the tests. @mock.patch('sunpy.net.helio.parser.link_test', side_effect=ValueError) def test_link_test_on_valueerror(mock_link_test): """ If `link_test` internally raises `ValueError`, ensure it returns `None` """ link_test('') is None @mock.patch('sunpy.net.helio.parser.link_test', side_effect=urllib.error.URLError) def test_link_test_on_urlerror(mock_link_test): """ If `link_test` internally raises `URLError`, ensure it returns `None` """ link_test('') is None sunpy-0.8.3/sunpy/net/tests/test_helioviewer.py0000644000175000017500000000410313231613140022125 0ustar nabilnabil00000000000000""" Helioviewer Client tests """ from __future__ import absolute_import import sunpy import sunpy.map import pytest from sunpy.net.helioviewer import HelioviewerClient from sunpy.extern.six.moves import urllib from sunpy.tests.helpers import skip_glymur @pytest.fixture(scope="function") def client(): """ Fixture to create a client and skip tests if not available """ try: client = HelioviewerClient() client.sources = client.get_data_sources() return client except urllib.error.HTTPError as e: print("There's a HTTP problem {} {}".format(e.code, e.args)) pytest.skip("HTTP error {}".format(e.code)) @pytest.mark.remote_data class TestHelioviewerClient: """Tests the Helioviewer.org API Client class""" def test_get_datasources(self, client): """Makes sure datasource query returns a valid result and source id is casted to an integer""" assert type(client.sources['SDO']['AIA']['AIA']['171']['sourceId']) is int def test_get_closest_image(self, client): """Tests getClosestImage API method""" # check basic query im1 = client.get_closest_image('1994/01/01', observatory='SOHO', instrument='EIT', detector='EIT', measurement='195') assert im1['width'] == im1['height'] == 1024 # result should be same when using source id to query source_id = client.sources['SOHO']['EIT']['EIT']['195']['sourceId'] im2 = client.get_closest_image('1994/01/01', sourceId=source_id) assert im1 == im2 @skip_glymur def test_download_jp2(self, client): """Tests getJP2Image API method""" filepath = client.download_jp2('2020/01/01', observatory='SOHO', instrument='MDI', detector='MDI', measurement='continuum') map_ = sunpy.map.Map(filepath) assert isinstance(map_, sunpy.map.GenericMap) sunpy-0.8.3/sunpy/net/tests/test_util.py0000644000175000001440000000214213203275053017555 0ustar nabil00000000000000# -*- coding: utf-8 -*- # Author: Florian Mayer import sunpy.util.net from sunpy.extern import six def test_content_disposition_ascii(): ret = sunpy.util.net.get_content_disposition("Content-Disposition: attachment; filename=foo.txt") assert ret == u"foo.txt" assert isinstance(ret, six.text_type) def test_content_disposition_unicode(): ret = sunpy.util.net.get_content_disposition("Content-Disposition: attachment; filename*= UTF-8''%e2%82%ac%20rates") assert ret == u"€ rates" assert isinstance(ret, six.text_type) def test_slugify(): assert sunpy.util.net.slugify(u"äb c", u"b_c") assert sunpy.util.net.slugify(u"file.greg.fits") == u"file_greg.fits" assert sunpy.util.net.slugify(u"file.greg.fits", u"x") == u"filexgreg.fits" assert sunpy.util.net.slugify(u"filegreg.fits") == u"filegreg.fits" assert sunpy.util.net.slugify(u"filegreg") == u"filegreg" assert sunpy.util.net.slugify(u"f/i*l:e,gr.eg.fits") == u"f_i_l_e_gr_eg.fits" assert sunpy.util.net.slugify(u"part1.part2.part3.part4.part5") == u"part1_part2_part3_part4.part5" sunpy-0.8.3/sunpy/net/tests/test_vso.py0000644000175000017500000002766613231613140020435 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- # Author: Florian Mayer #pylint: disable=W0613 from __future__ import absolute_import import tempfile import datetime import pytest from six import iteritems from astropy import units as u from sunpy.time import TimeRange from sunpy.net import vso from sunpy.net.vso import attrs as va from sunpy.net.vso import QueryResponse from sunpy.net import attr from sunpy.tests.mocks import MockObject class MockQRRecord: """ Used to test sunpy.net.vso.QueryResponse.build_table(...) """ def __init__(self, start_time=None, end_time=None, size=0, source='SOHO', instrument='aia', extent_type=None): self.size = size self.time = MockObject(start=start_time, end=end_time) self.source = va.Source(source) self.instrument = va.Instrument(instrument) self.extent = MockObject(type=None if extent_type is None else extent_type.type) class MockQRResponse: """ Used to test `sunpy.net.vso.vso.iter_records` and `sunpy.net.vso.vso.iter_errors` >>> res = MockQRResponse(items=[1, 2, 3, [4, 5]], errors=['no-connection']) # doctest: +SKIP >>> res.provideritem[1].record.recorditem # doctest: +SKIP [2] """ def __init__(self, records=None, errors=None): self.provideritem = list() if records is not None: self.provideritem = [MockObject(record=MockObject(recorditem=[ri])) for ri in records] if errors is not None: self.provideritem.extend([MockObject(error=err) for err in errors]) @pytest.fixture def mock_response(): return MockQRResponse(records=[1, 2], errors=['FAILED']) @pytest.fixture def eit(request): return va.Instrument('eit') @pytest.fixture def client(request): return vso.VSOClient() @pytest.fixture def iclient(request): return vso.InteractiveVSOClient() def test_simpleattr_apply(): a = attr.ValueAttr({('test', ): 1}) dct = {} va.walker.apply(a, None, dct) assert dct['test'] == 1 def test_Time_timerange(): t = va.Time(TimeRange('2012/1/1', '2012/1/2')) assert isinstance(t, va.Time) assert t.min == datetime.datetime(2012, 1, 1) assert t.max == datetime.datetime(2012, 1, 2) def test_input_error(): with pytest.raises(ValueError): va.Time('2012/1/1') @pytest.mark.remote_data def test_simpleattr_create(client): a = attr.ValueAttr({('instrument', ): 'eit'}) assert va.walker.create(a, client.api)[0].instrument == 'eit' def test_simpleattr_and_duplicate(): attr = va.Instrument('foo') pytest.raises(TypeError, lambda: attr & va.Instrument('bar')) attr |= va.Source('foo') pytest.raises(TypeError, lambda: attr & va.Instrument('bar')) otherattr = va.Instrument('foo') | va.Source('foo') pytest.raises(TypeError, lambda: attr & otherattr) pytest.raises(TypeError, lambda: (attr | otherattr) & va.Instrument('bar')) tst = va.Instrument('foo') & va.Source('foo') pytest.raises(TypeError, lambda: tst & tst) def test_simpleattr_or_eq(): attr = va.Instrument('eit') assert attr | attr == attr assert attr | va.Instrument('eit') == attr def test_complexattr_apply(): tst = {('test', 'foo'): 'a', ('test', 'bar'): 'b'} a = attr.ValueAttr(tst) dct = {'test': {}} va.walker.apply(a, None, dct) assert dct['test'] == {'foo': 'a', 'bar': 'b'} @pytest.mark.remote_data def test_complexattr_create(client): a = attr.ValueAttr({('time', 'start'): 'test'}) assert va.walker.create(a, client.api)[0].time.start == 'test' def test_complexattr_and_duplicate(): attr = va.Time((2011, 1, 1), (2011, 1, 1, 1)) pytest.raises(TypeError, lambda: attr & va.Time((2011, 2, 1), (2011, 2, 1, 1))) attr |= va.Source('foo') pytest.raises(TypeError, lambda: attr & va.Time((2011, 2, 1), (2011, 2, 1, 1))) def test_complexattr_or_eq(): attr = va.Time((2011, 1, 1), (2011, 1, 1, 1)) assert attr | attr == attr assert attr | va.Time((2011, 1, 1), (2011, 1, 1, 1)) == attr def test_attror_and(): attr = va.Instrument('foo') | va.Instrument('bar') one = attr & va.Source('bar') other = ((va.Instrument('foo') & va.Source('bar')) | (va.Instrument('bar') & va.Source('bar'))) assert one == other def test_wave_inputQuantity(): wrong_type_mesage = "Wave inputs must be astropy Quantities" with pytest.raises(TypeError) as excinfo: va.Wavelength(10, 23) assert excinfo.value.message == wrong_type_mesage with pytest.raises(TypeError) as excinfo: va.Wavelength(10 * u.AA, 23) assert excinfo.value.message == wrong_type_mesage def test_wave_toangstrom(): # TODO: this test should test that inputs are in any of spectral units # more than just converted to Angstroms. frequency = [(1, 1 * u.Hz), (1e3, 1 * u.kHz), (1e6, 1 * u.MHz), (1e9, 1 * u.GHz)] energy = [(1, 1 * u.eV), (1e3, 1 * u.keV), (1e6, 1 * u.MeV)] for factor, unit in energy: w = va.Wavelength((62 / factor) * unit, (62 / factor) * unit) assert int(w.min.to(u.AA, u.equivalencies.spectral()).value) == 199 w = va.Wavelength(62 * u.eV, 62 * u.eV) assert int(w.min.to(u.AA, u.equivalencies.spectral()).value) == 199 w = va.Wavelength(62e-3 * u.keV, 62e-3 * u.keV) assert int(w.min.to(u.AA, u.equivalencies.spectral()).value) == 199 for factor, unit in frequency: w = va.Wavelength((1.506e16 / factor) * unit, (1.506e16 / factor) * unit) assert int(w.min.to(u.AA, u.equivalencies.spectral()).value) == 199 w = va.Wavelength(1.506e16 * u.Hz, 1.506e16 * u.Hz) assert int(w.min.to(u.AA, u.equivalencies.spectral()).value) == 199 w = va.Wavelength(1.506e7 * u.GHz, 1.506e7 * u.GHz) assert int(w.min.to(u.AA, u.equivalencies.spectral()).value) == 199 with pytest.raises(u.UnitsError) as excinfo: va.Wavelength(10 * u.g, 23 * u.g) assert ('This unit is not convertable to any of [Unit("Angstrom"), Unit("kHz"), ' 'Unit("keV")]' in str(excinfo)) def test_time_xor(): one = va.Time((2010, 1, 1), (2010, 1, 2)) a = one ^ va.Time((2010, 1, 1, 1), (2010, 1, 1, 2)) assert a == attr.AttrOr( [va.Time((2010, 1, 1), (2010, 1, 1, 1)), va.Time((2010, 1, 1, 2), (2010, 1, 2))]) a ^= va.Time((2010, 1, 1, 4), (2010, 1, 1, 5)) assert a == attr.AttrOr([ va.Time((2010, 1, 1), (2010, 1, 1, 1)), va.Time((2010, 1, 1, 2), (2010, 1, 1, 4)), va.Time((2010, 1, 1, 5), (2010, 1, 2)) ]) def test_wave_xor(): one = va.Wavelength(0 * u.AA, 1000 * u.AA) a = one ^ va.Wavelength(200 * u.AA, 400 * u.AA) assert a == attr.AttrOr([va.Wavelength(0 * u.AA, 200 * u.AA), va.Wavelength(400 * u.AA, 1000 * u.AA)]) a ^= va.Wavelength(600 * u.AA, 800 * u.AA) assert a == attr.AttrOr( [va.Wavelength(0 * u.AA, 200 * u.AA), va.Wavelength(400 * u.AA, 600 * u.AA), va.Wavelength(800 * u.AA, 1000 * u.AA)]) def test_err_dummyattr_create(): with pytest.raises(TypeError): va.walker.create(attr.DummyAttr(), None, {}) def test_err_dummyattr_apply(): with pytest.raises(TypeError): va.walker.apply(attr.DummyAttr(), None, {}) def test_wave_repr(): """Tests the __repr__ method of class vso.attrs.Wave""" wav = vso.attrs.Wavelength(12 * u.AA, 16 * u.AA) moarwav = vso.attrs.Wavelength(15 * u.AA, 12 * u.AA) assert repr(wav) == "" assert repr(moarwav) == "" def test_str(): qr = QueryResponse([]) assert str(qr) == ('Start Time End Time Source Instrument Type\n' '---------- -------- ------ ---------- ----') def test_repr(): qr = QueryResponse([]) assert "Start Time End Time Source Instrument Type" in repr(qr) @pytest.mark.remote_data def test_path(client): """ Test that '{file}' is automatically appended to the end of a custom path if it is not specified. """ qr = client.search( va.Time('2011-06-07 06:33', '2011-06-07 06:33:08'), va.Instrument('aia'), va.Wavelength(171 * u.AA)) tmp_dir = tempfile.mkdtemp() files = client.fetch(qr, path=tmp_dir).wait(progress=False) assert len(files) == 1 # The construction of a VSO filename is bonkers complex, so there is no # practical way to determine what it should be in this test, so we just # put it here. assert "aia_lev1_171a_2011_06_07t06_33_02_77z_image_lev1.fits" in files[0] def test_non_str_instrument(): # Sanity Check assert isinstance(va.Instrument("lyra"), va.Instrument) with pytest.raises(ValueError): va.Instrument(1234) @pytest.mark.parametrize("waverange, as_dict", [ ('3 - 4 ', {'wave_wavemin': '3', 'wave_wavemax': '4', 'wave_waveunit': 'Angstrom'}), ('27', {'wave_wavemin': '27', 'wave_wavemax': '27', 'wave_waveunit': 'Angstrom'}), ('34 - 64 GHz', {'wave_wavemin': '34', 'wave_wavemax': '64', 'wave_waveunit': 'GHz'}), ('12-13keV', {'wave_wavemin': '12', 'wave_wavemax': '13', 'wave_waveunit': 'keV'}), ]) def test__parse_waverange(waverange, as_dict): assert vso.vso._parse_waverange(waverange) == as_dict @pytest.mark.parametrize("input, expected", [ ('12/01/2017 - 02/10/2018', dict(time_start='12/01/2017', time_end='02/10/2018')), ]) def test__parse_date(input, expected): assert vso.vso._parse_date(input) == expected def test_iter_records(mock_response): assert list(vso.vso.iter_records(mock_response)) == [1, 2] def test_iter_errors(mock_response): prov_item = list(vso.vso.iter_errors(mock_response)) assert len(prov_item) == 1 assert prov_item[0].error == 'FAILED' def test_QueryResponse_build_table_defaults(): records = (MockQRRecord(),) qr = vso.QueryResponse(records) table = qr.build_table() start_time_ = table['Start Time'] assert len(start_time_) == 1 assert start_time_[0] == 'None' end_time_ = table['End Time'] assert len(end_time_) == 1 assert end_time_[0] == 'None' type_ = table['Type'].data assert len(type_) == 1 assert type_[0] == 'N/A' # Check values we did set by default in 'MockQRRecord' source_ = table['Source'].data assert len(source_) == 1 assert source_[0] == str(va.Source('SOHO')) instrument_ = table['Instrument'].data assert len(instrument_) == 1 assert instrument_[0] == str(va.Instrument('aia')) def test_QueryResponse_build_table_with_extent_type(): """ When explcitley suppling an 'Extent' only the 'type' is stored in the built table. """ e_type = va.Extent(x=1.0, y=2.5, width=37, length=129.2, atype='CORONA') qr = vso.QueryResponse((MockQRRecord(extent_type=e_type),)) table = qr.build_table() extent = table['Type'].data assert len(extent) == 1 assert extent[0] == e_type.type def test_QueryResponse_build_table_with_no_start_time(): """ Only the 'end' time set, no 'start' time """ a_st = datetime.datetime(2016, 2, 14, 8, 8, 12) records = (MockQRRecord(end_time=a_st.strftime(va.TIMEFORMAT)),) qr = vso.QueryResponse(records) table = qr.build_table() start_time_ = table['Start Time'] assert len(start_time_) == 1 assert start_time_[0] == 'None' # Even though 'End Time' is valid, there is no 'Start Time' # marks as 'N/A' end_time_ = table['End Time'] assert len(end_time_) == 1 assert end_time_[0] == 'N/A' def test_QueryResponse_build_table_with_no_end_time(): """ Only the 'start' time is set, no 'end' time """ a_st = datetime.datetime(2016, 2, 14, 8, 8, 12) records = (MockQRRecord(start_time=a_st.strftime(va.TIMEFORMAT)),) qr = vso.QueryResponse(records) table = qr.build_table() start_time_ = table['Start Time'] assert len(start_time_) == 1 assert start_time_[0] == '2016-02-14 08:08:12' end_time_ = table['End Time'] assert len(end_time_) == 1 assert end_time_[0] == 'None' sunpy-0.8.3/sunpy/net/vso/0000755000175000017500000000000013232563477015663 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/net/vso/__init__.py0000644000175000017500000000044513231613140017755 0ustar nabilnabil00000000000000from __future__ import absolute_import # for exposure to from sunpy.net.vso import * from sunpy.net.vso.vso import VSOClient, InteractiveVSOClient, QueryResponse # Delete this in 0.9 from sunpy.net.vso.vso import search, get __all__ = ['VSOClient', 'InteractiveVSOClient', 'QueryResponse'] sunpy-0.8.3/sunpy/net/vso/attrs.py0000644000175000017500000004413113231613140017353 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- # Author: Florian Mayer # # This module was developed with funding provided by # the ESA Summer of Code (2011). # # pylint: disable=C0103,R0903 """ Attributes that can be used to construct VSO queries. Attributes are the fundamental building blocks of queries that, together with the two operations of AND and OR (and in some rare cases XOR) can be used to construct complex queries. Most attributes can only be used once in an AND-expression, if you still attempt to do so it is called a collision. For a quick example think about how the system should handle Instrument('aia') & Instrument('eit'). """ from __future__ import absolute_import from datetime import datetime from astropy import units as u from sunpy.time import TimeRange as _TimeRange from sunpy.net.attr import ( Attr, AttrWalker, AttrAnd, AttrOr, DummyAttr, ValueAttr ) from sunpy.util.multimethod import MultiMethod from sunpy.util.decorators import deprecated from sunpy.time import parse_time from sunpy.extern.six import iteritems from sunpy.extern import six __all__ = ['Wavelength', 'Time', 'Extent', 'Field', 'Provider', 'Source', 'Instrument', 'Physobs', 'Pixels', 'Level', 'Resolution', 'Detector', 'Filter', 'Sample', 'Quicklook', 'PScale'] TIMEFORMAT = '%Y%m%d%H%M%S' class Field(ValueAttr): """ A subclass of the value attribute. Used in defining a decorator for the dummy attribute. """ def __init__(self, fielditem): ValueAttr.__init__(self, { ('field', 'fielditem'): fielditem }) class _Range(object): def __init__(self, min_, max_, create): self.min = min_ self.max = max_ self.create = create def __xor__(self, other): if not isinstance(other, self.__class__): return NotImplemented new = DummyAttr() if self.min < other.min: new |= self.create(self.min, min(other.min, self.max)) if other.max < self.max: new |= self.create(other.max, self.max) return new def __contains__(self, other): return self.min <= other.min and self.max >= other.max class _VSOSimpleAttr(Attr): """ A _SimpleAttr is an attribute that is not composite, i.e. that only has a single value, such as, e.g., Instrument('eit'). """ def __init__(self, value): Attr.__init__(self) self.value = value def collides(self, other): return isinstance(other, self.__class__) def __repr__(self): return "<{cname!s}({val!r})>".format( cname=self.__class__.__name__, val=self.value) class Wavelength(Attr, _Range): def __init__(self, wavemin, wavemax=None): """ Specifies the wavelength or spectral energy range of the detector. Parameters ---------- wavemin : `~astropy.units.Quantity` The lower bounds of the range. wavemax : `~astropy.units.Quantity` The upper bound of the range, if not specified it will default to the lower bound. Notes ----- The VSO understands the 'wavelength' in one of three units, Angstroms, kHz or keV. Therefore any unit which is directly convertible to these units is valid input. """ if not wavemax: wavemax = wavemin if not all(isinstance(var, u.Quantity) for var in [wavemin, wavemax]): raise TypeError("Wave inputs must be astropy Quantities") if not all([wavemin.isscalar, wavemax.isscalar]): raise ValueError("Both wavemin and wavemax must be scalar values") # VSO just accept inputs as Angstroms, kHz or keV, the following # converts to any of these units depending on the spectral inputs # Note: the website asks for GHz, however it seems that using GHz # produces weird responses on VSO. supported_units = [u.AA, u.kHz, u.keV] for unit in supported_units: if wavemin.unit.is_equivalent(unit): break else: unit = None if unit is None: raise u.UnitsError("This unit is not convertable to any of {}".format(supported_units)) self.min, self.max = sorted([wavemin.to(unit), wavemax.to(unit)]) self.unit = unit Attr.__init__(self) _Range.__init__(self, self.min, self.max, self.__class__) def collides(self, other): return isinstance(other, self.__class__) def __repr__(self): return "".format(self.min.value, self.max.value, self.unit) @deprecated("0.8", message="Wave has been renamed Wavelength", alternative="sunpy.net.vso.attrs.wavelength") class Wave(Wavelength): """ Wavelength search attribute. See `sunpy.net.vso.attrs.Wavelength`. """ class Time(Attr, _Range): """ Specify the time range of the query. Parameters ---------- start : SunPy time string or `~sunpy.time.TimeRange`. The start time in a format parseable by `~sunpy.time.parse_time` or a `sunpy.time.TimeRange` object. end : SunPy Time String The end time of the range. near: SunPy Time String Return a singular record closest in time to this value as possible, inside the start and end window. Note: not all providers support this functionality. """ def __init__(self, start, end=None, near=None): if end is None and not isinstance(start, _TimeRange): raise ValueError("Specify start and end or start has to be a TimeRange") if isinstance(start, _TimeRange): self.start = start.start self.end = start.end else: self.start = parse_time(start) self.end = parse_time(end) if self.start > self.end: raise ValueError("End time must be after start time.") self.near = None if near is None else parse_time(near) _Range.__init__(self, self.start, self.end, self.__class__) Attr.__init__(self) def collides(self, other): return isinstance(other, self.__class__) def __xor__(self, other): if not isinstance(other, self.__class__): raise TypeError if self.near is not None or other.near is not None: raise TypeError return _Range.__xor__(self, other) def pad(self, timedelta): return Time(self.start - timedelta, self.start + timedelta) def __repr__(self): return ''.format(s=self) class Extent(Attr): """ Specify the spatial field-of-view of the query. Due to a bug in the VSO, the Extent attribute is not used. """ # pylint: disable=R0913 def __init__(self, x, y, width, length, atype): Attr.__init__(self) self.x = x self.y = y self.width = width self.length = length self.type = atype def collides(self, other): return isinstance(other, self.__class__) class Provider(_VSOSimpleAttr): """ Specifies the VSO data provider to search for data for. Parameters ---------- value : string Notes ----- More information about each source may be found within in the VSO Registry. For a list of sources see http://sdac.virtualsolar.org/cgi/show_details?keyword=PROVIDER. """ pass class Source(_VSOSimpleAttr): """ Data sources that VSO can search on. Parameters ---------- value : string Notes ----- More information about each source may be found within in the VSO Registry. User Interface programmers should note that some names may be encoded as UTF-8. Please note that 'Source' is used internally by VSO to represent what the VSO Data Model refers to as 'Observatory'. For a list of sources see http://sdac.virtualsolar.org/cgi/show_details?keyword=SOURCE. """ pass class Instrument(_VSOSimpleAttr): """ Specifies the Instrument name for the search. Parameters ---------- value : string Notes ----- More information about each instrument supported by the VSO may be found within the VSO Registry. For a list of instruments see http://sdac.virtualsolar.org/cgi/show_details?keyword=INSTRUMENT. """ def __init__(self, value): if not isinstance(value, six.string_types): raise ValueError("Instrument names must be strings") super(Instrument, self).__init__(value) class Detector(_VSOSimpleAttr): """ The detector from which the data comes from. Parameters ---------- value : string Notes ----- For a list of values understood by the VSO see http://sdac.virtualsolar.org/cgi/show_details?keyword=SOURCE. References ---------- Documentation in SSWIDL routine vso_search.pro. """ pass class Physobs(_VSOSimpleAttr): """ Specifies the physical observable the VSO can search for. Parameters ---------- value : string Notes ----- More information about each instrument may be found within the VSO Registry. For a list of physical observables see http://sdac.virtualsolar.org/cgi/show_details?keyword=PHYSOBS. """ pass class Level(_VSOSimpleAttr): """ Specifies the data processing level to search for. The data processing level is specified by the instrument PI. May not work with all archives. Parameters ---------- value : float or string The value can be entered in of three ways: #. May be entered as a string or any numeric type for equality matching #. May be a string of the format '(min) - (max)' for range matching #. May be a string of the form '(operator) (number)' where operator is\ one of: lt gt le ge < > <= >= """ pass class Pixels(_VSOSimpleAttr): """ Pixels are (currently) limited to a single dimension (and only implemented for SDO data) We hope to change this in the future to support TRACE, Hinode and other investigations where this changed between observations. References ---------- Documentation in SSWIDL routine vso_search.pro. """ pass class Resolution(_VSOSimpleAttr): """ Resolution level of the data. Parameters ---------- value : float or string The value can be entered in of three ways: #. May be entered as a string or any numeric type for equality matching #. May be a string of the format '(min) - (max)' for range matching #. May be a string of the form '(operator) (number)' where operator is\ one of: lt gt le ge < > <= >= This attribute is currently implemented for SDO/AIA and HMI only. The "resolution" is a function of the highest level of data available. If the CCD is 2048x2048, but is binned to 512x512 before downlink, the 512x512 product is designated as '1'. If a 2048x2048 and 512x512 product are both available, the 512x512 product is designated '0.25'. References ---------- Documentation in SSWIDL routine vso_search.pro. """ pass class PScale(_VSOSimpleAttr): """ Pixel Scale (PSCALE) is in arc seconds. Parameters ---------- value : float or string The value can be entered in of three ways: #. May be entered as a string or any numeric type for equality matching #. May be a string of the format '(min) - (max)' for range matching #. May be a string of the form '(operator) (number)' where operator is\ one of: lt gt le ge < > <= >= Currently only implemented for SDO, which is 0.6 arcsec per pixel at full resolution for AIA. References ---------- Documentation in SSWIDL routine vso_search.pro. """ pass class Sample(_VSOSimpleAttr): """ Time interval for data sampling. Parameters ---------- value : `astropy.units.Quantity` A sampling rate convertible to seconds. """ @u.quantity_input(value=u.s) def __init__(self, value): super(Sample, self).__init__(value) self.value = value.to(u.s).value class Quicklook(_VSOSimpleAttr): """ Retrieve 'quicklook' data if available. Parameters ---------- value : boolean Set to True to retrieve quicklook data if available. Quicklook items are assumed to be generated with a focus on speed rather than scientific accuracy. They are useful for instrument planning and space weather but should not be used for science publication. This concept is sometimes called 'browse' or 'near real time' (nrt) Quicklook products are *not* searched by default. References ---------- Documentation in SSWIDL routine vso_search.pro. """ def __init__(self, value): super(Quicklook, self).__init__(value) if self.value: self.value = 1 else: self.value = 0 class Filter(_VSOSimpleAttr): """ This attribute is a placeholder for the future. Parameters ---------- value : string """ pass # The walker specifies how the Attr-tree is converted to a query the # server can handle. walker = AttrWalker() # The _create functions make a new VSO query from the attribute tree, # the _apply functions take an existing query-block and update it according # to the attribute tree passed in as root. Different attributes require # different functions for conversion into query blocks. @walker.add_creator(ValueAttr, AttrAnd) # pylint: disable=E0102,C0103,W0613 def _create(wlk, root, api): """ Implementation detail. """ value = api.factory.create('QueryRequestBlock') wlk.apply(root, api, value) return [value] @walker.add_applier(ValueAttr) # pylint: disable=E0102,C0103,W0613 def _apply(wlk, root, api, queryblock): """ Implementation detail. """ for k, v in iteritems(root.attrs): lst = k[-1] rest = k[:-1] block = queryblock for elem in rest: block = block[elem] block[lst] = v @walker.add_applier(AttrAnd) # pylint: disable=E0102,C0103,W0613 def _apply(wlk, root, api, queryblock): """ Implementation detail. """ for attr in root.attrs: wlk.apply(attr, api, queryblock) @walker.add_creator(AttrOr) # pylint: disable=E0102,C0103,W0613 def _create(wlk, root, api): """ Implementation detail. """ blocks = [] for attr in root.attrs: blocks.extend(wlk.create(attr, api)) return blocks # Converters take a type unknown to the walker and convert it into one # known to it. All of those convert types into ValueAttrs, which are # handled above by just assigning according to the keys and values of the # attrs member. walker.add_converter(Extent)( lambda x: ValueAttr( dict((('extent', k), v) for k, v in iteritems(vars(x))) ) ) walker.add_converter(Time)( lambda x: ValueAttr({ ('time', 'start'): x.start.strftime(TIMEFORMAT), ('time', 'end'): x.end.strftime(TIMEFORMAT), ('time', 'near'): ( x.near.strftime(TIMEFORMAT) if x.near is not None else None), }) ) walker.add_converter(_VSOSimpleAttr)( lambda x: ValueAttr({(x.__class__.__name__.lower(), ): x.value}) ) walker.add_converter(Wavelength)( lambda x: ValueAttr({ ('wave', 'wavemin'): x.min.value, ('wave', 'wavemax'): x.max.value, ('wave', 'waveunit'): x.unit, }) ) # The idea of using a multi-method here - that means a method which dispatches # by type but is not attached to said class - is that the attribute classes are # designed to be used not only in the context of VSO but also elsewhere (which # AttrAnd and AttrOr obviously are - in the HEK module). If we defined the # filter method as a member of the attribute classes, we could only filter # one type of data (that is, VSO data). filter_results = MultiMethod(lambda *a, **kw: (a[0], )) # If we filter with ANDed together attributes, the only items are the ones # that match all of them - this is implementing by ANDing the pool of items # with the matched items - only the ones that match everything are there # after this. @filter_results.add_dec(AttrAnd) def _(attr, results): res = set(results) for elem in attr.attrs: res &= filter_results(elem, res) return res # If we filter with ORed attributes, the only attributes that should be # removed are the ones that match none of them. That's why we build up the # resulting set by ORing all the matching items. @filter_results.add_dec(AttrOr) def _(attr, results): res = set() for elem in attr.attrs: res |= filter_results(elem, results) return res # Filter out items by comparing attributes. @filter_results.add_dec(_VSOSimpleAttr) def _(attr, results): attrname = attr.__class__.__name__.lower() return set( item for item in results # Some servers seem to omit some fields. No way to filter there. if not hasattr(item, attrname) or getattr(item, attrname).lower() == attr.value.lower() ) # The dummy attribute does not filter at all. @filter_results.add_dec(DummyAttr, Field) def _(attr, results): return set(results) @filter_results.add_dec(Wavelength) def _(attr, results): return set( it for it in results if it.wave.wavemax is not None and attr.min <= it.wave.wavemax.to(u.angstrom, equivalencies=u.spectral()) and it.wave.wavemin is not None and attr.max >= it.wave.wavemin.to(u.angstrom, equivalencies=u.spectral()) ) @filter_results.add_dec(Time) def _(attr, results): return set( it for it in results if it.time.end is not None and attr.min <= datetime.strptime(it.time.end, TIMEFORMAT) and it.time.start is not None and attr.max >= datetime.strptime(it.time.start, TIMEFORMAT) ) @filter_results.add_dec(Extent) def _(attr, results): return set( it for it in results if it.extent.type is not None and it.extent.type.lower() == attr.type.lower() ) sunpy-0.8.3/sunpy/net/vso/vso.py0000644000175000017500000010127213232563447017044 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- # Author: Florian Mayer # # This module was developed with funding provided by # the ESA Summer of Code (2011). # # pylint: disable=W0401,C0103,R0904,W0141 from __future__ import absolute_import, division, print_function """ This module provides a wrapper around the VSO API. """ import re import os import sys import logging import requests import warnings import socket from datetime import datetime, timedelta from functools import partial from collections import defaultdict from suds import client, TypeNotFound import astropy.units as u from astropy.table import QTable as Table from sunpy import config from sunpy.net import download from sunpy.net.proxyfix import WellBehavedHttpTransport from sunpy.util.net import get_filename, slugify from sunpy.net.attr import and_, Attr from sunpy.net.vso import attrs from sunpy.net.vso.attrs import walker, TIMEFORMAT from sunpy.util import replacement_filename from sunpy.time import parse_time from sunpy.util import deprecated from sunpy.extern import six from sunpy.extern.six import iteritems, text_type from sunpy.extern.six.moves import input TIME_FORMAT = config.get("general", "time_format") DEFAULT_URL_PORT = [{'url': 'http://docs.virtualsolar.org/WSDL/VSOi_rpc_literal.wsdl', 'port': 'nsoVSOi', 'transport': WellBehavedHttpTransport}] RANGE = re.compile(r'(\d+)(\s*-\s*(\d+))?(\s*([a-zA-Z]+))?') # Override the logger that dumps the whole Schema # to stderr so it doesn't do that. suds_log = logging.getLogger('suds.umx.typed') suds_log.setLevel(50) # TODO: Name class NoData(Exception): """ Risen for callbacks of VSOClient that are unable to supply information for the request. """ pass class _Str(str): """ Subclass of string that contains a meta attribute for the record_item associated with the file. """ pass # ---------------------------------------- def _parse_waverange(string): min_, max_, unit = RANGE.match(string).groups()[::2] return { 'wave_wavemin': min_, 'wave_wavemax': min_ if max_ is None else max_, 'wave_waveunit': 'Angstrom' if unit is None else unit, } def _parse_date(string): start, end = string.split(' - ') return {'time_start': start.strip(), 'time_end': end.strip()} def iter_records(response): for prov_item in response.provideritem: if not hasattr(prov_item, 'record') or not prov_item.record: continue for record_item in prov_item.record.recorditem: yield record_item def iter_errors(response): for prov_item in response.provideritem: if not hasattr(prov_item, 'record') or not prov_item.record: yield prov_item def check_connection(url): try: return requests.get(url).status_code == 200 except (socket.error, socket.timeout) as e: warnings.warn( "Connection failed with error {}. \n Retrying with different url and port.".format(e)) def get_online_vso_url(api, url, port): if api is None and (url is None or port is None): for mirror in DEFAULT_URL_PORT: if check_connection(mirror['url']): api = client.Client( mirror['url'], transport=mirror['transport']()) api.set_options(port=mirror['port']) return api # TODO: Python 3 this should subclass from UserList class QueryResponse(list): """ A container for VSO Records returned from VSO Searches. """ def __init__(self, lst, queryresult=None, table=None): super(QueryResponse, self).__init__(lst) self.queryresult = queryresult self.errors = [] self.table = None def search(self, *query): """ Furtherly reduce the query response by matching it against another query, e.g. response.search(attrs.Instrument('aia')). """ query = and_(*query) return QueryResponse( attrs.filter_results(query, self), self.queryresult ) @deprecated('0.8', alternative='QueryResponse.search') def query(self, *query): """ See `~sunpy.net.vso.vso.QueryResponse.search` """ return self.search(*query) @classmethod def create(cls, queryresult): return cls(iter_records(queryresult), queryresult) def total_size(self): """ Total size of data in KB. May be less than the actual size because of inaccurate data providers. """ # Warn about -1 values? return sum(record.size for record in self if record.size > 0) def time_range(self): """ Return total time-range all records span across. """ return ( datetime.strptime( min(record.time.start for record in self if record.time.start is not None), TIMEFORMAT), datetime.strptime( max(record.time.end for record in self if record.time.end is not None), TIMEFORMAT) ) def build_table(self): keywords = ['Start Time', 'End Time', 'Source', 'Instrument', 'Type', 'Wavelength'] record_items = {} for key in keywords: record_items[key] = [] def validate_time(time): # Handle if the time is None when coming back from VSO if time is None: return ['None'] if record.time.start is not None: return [datetime.strftime(parse_time(time), TIME_FORMAT)] else: return ['N/A'] for record in self: record_items['Start Time'].append(validate_time(record.time.start)) record_items['End Time'].append(validate_time(record.time.end)) record_items['Source'].append(str(record.source)) record_items['Instrument'].append(str(record.instrument)) record_items['Type'].append(str(record.extent.type) if record.extent.type is not None else ['N/A']) # If we have a start and end Wavelength, make a quantity if hasattr(record, 'wave') and record.wave.wavemin and record.wave.wavemax: record_items['Wavelength'].append(u.Quantity([float(record.wave.wavemin), float(record.wave.wavemax)], unit=record.wave.waveunit)) # If not save None else: record_items['Wavelength'].append(None) # If we have no wavelengths for the whole list, drop the col if all([a is None for a in record_items['Wavelength']]): record_items.pop('Wavelength') keywords.remove('Wavelength') else: # Make whole column a quantity try: with u.set_enabled_equivalencies(u.spectral()): record_items['Wavelength'] = u.Quantity(record_items['Wavelength']) # If we have mixed units or some Nones just represent as strings except (u.UnitConversionError, TypeError): record_items['Wavelength'] = [str(a) for a in record_items['Wavelength']] return Table(record_items)[keywords] def add_error(self, exception): self.errors.append(exception) def response_block_properties(self): """ Returns a set of class attributes on all the response blocks. """ s = {a if not a.startswith('_') else None for a in dir(self[0])} for resp in self[1:]: s = s.intersection({a if not a.startswith('_') else None for a in dir(resp)}) s.remove(None) return s def __str__(self): """Print out human-readable summary of records retrieved""" return str(self.build_table()) def __repr__(self): """Print out human-readable summary of records retrieved""" return repr(self.build_table()) def _repr_html_(self): return self.build_table()._repr_html_() class DownloadFailed(Exception): pass class MissingInformation(Exception): pass class UnknownMethod(Exception): pass class MultipleChoices(Exception): pass class UnknownVersion(Exception): pass class UnknownStatus(Exception): pass class VSOClient(object): """ Main VSO Client. """ method_order = [ 'URL-TAR_GZ', 'URL-ZIP', 'URL-TAR', 'URL-FILE', 'URL-packaged' ] def __init__(self, url=None, port=None, api=None): api = get_online_vso_url(api, url, port) self.api = api def make(self, atype, **kwargs): """ Create new SOAP object with attributes specified in kwargs. To assign subattributes, use foo__bar=1 to assign ['foo']['bar'] = 1. """ obj = self.api.factory.create(atype) for k, v in iteritems(kwargs): split = k.split('__') tip = split[-1] rest = split[:-1] item = obj for elem in rest: item = item[elem] if isinstance(v, dict): # Do not throw away type information for dicts. for k, v in iteritems(v): item[tip][k] = v else: item[tip] = v return obj def search(self, *query): """ Query data from the VSO with the new API. Takes a variable number of attributes as parameter, which are chained together using AND. The new query language allows complex queries to be easily formed. Examples -------- Query all data from eit or aia between 2010-01-01T00:00 and 2010-01-01T01:00. >>> from datetime import datetime >>> from sunpy.net import vso >>> client = vso.VSOClient() # doctest: +REMOTE_DATA >>> client.search( ... vso.attrs.Time(datetime(2010, 1, 1), datetime(2010, 1, 1, 1)), ... vso.attrs.Instrument('eit') | vso.attrs.Instrument('aia')) # doctest: +NORMALIZE_WHITESPACE +REMOTE_DATA Start Time [1] End Time [1] Source ... Type Wavelength [2] ... Angstrom str19 str19 str4 ... str8 float64 ------------------- ------------------- ------ ... -------- -------------- 2010-01-01 00:00:08 2010-01-01 00:00:20 SOHO ... FULLDISK 195.0 .. 195.0 2010-01-01 00:12:08 2010-01-01 00:12:20 SOHO ... FULLDISK 195.0 .. 195.0 2010-01-01 00:24:10 2010-01-01 00:24:22 SOHO ... FULLDISK 195.0 .. 195.0 2010-01-01 00:36:08 2010-01-01 00:36:20 SOHO ... FULLDISK 195.0 .. 195.0 2010-01-01 00:48:09 2010-01-01 00:48:21 SOHO ... FULLDISK 195.0 .. 195.0 Returns ------- out : :py:class:`QueryResult` (enhanced list) of matched items. Return value of same type as the one of :py:meth:`VSOClient.query`. """ query = and_(*query) responses = [] for block in walker.create(query, self.api): try: responses.append( self.api.service.Query( self.make('QueryRequest', block=block) ) ) except TypeNotFound: pass except Exception as ex: response = QueryResponse.create(self.merge(responses)) response.add_error(ex) return QueryResponse.create(self.merge(responses)) @deprecated('0.8', alternative='VSOClient.search') def query(self, *query): """ See `~sunpy.net.vso.VSOClient.search` """ return self.search(*query) def merge(self, queryresponses): """ Merge responses into one. """ if len(queryresponses) == 1: return queryresponses[0] fileids = set() providers = {} for queryresponse in queryresponses: for provideritem in queryresponse.provideritem: provider = provideritem.provider if not hasattr(provideritem, 'record'): continue if not hasattr(provideritem.record, 'recorditem'): continue if provideritem.provider not in providers: providers[provider] = provideritem fileids |= set( record_item.fileid for record_item in provideritem.record.recorditem ) else: for record_item in provideritem.record.recorditem: if record_item.fileid not in fileids: fileids.add(record_item.fileid) providers[provider].record.recorditem.append( record_item ) providers[provider].no_of_records_found += 1 providers[provider].no_of_records_returned += 1 return self.make('QueryResponse', provideritem=list(providers.values())) @staticmethod def mk_filename(pattern, response, sock, url, overwrite=False): name = get_filename(sock, url) if not name: if not isinstance(response.fileid, text_type): name = six.u(response.fileid, "ascii", "ignore") else: name = response.fileid fs_encoding = sys.getfilesystemencoding() if fs_encoding is None: fs_encoding = "ascii" name = slugify(name) if six.PY2: name = name.encode(fs_encoding, "ignore") if not name: name = "file" fname = pattern.format(file=name, **dict(response)) if not overwrite and os.path.exists(fname): fname = replacement_filename(fname) dir_ = os.path.abspath(os.path.dirname(fname)) if not os.path.exists(dir_): os.makedirs(dir_) return fname # pylint: disable=R0914 def query_legacy(self, tstart=None, tend=None, **kwargs): """ Query data from the VSO mocking the IDL API as close as possible. Either tstart and tend or date_start and date_end or date have to be supplied. Parameters ---------- tstart : datetime.datetime Start of the time-range in which records are searched. tend : datetime.datetime Start of the time-range in which records are searched. date : str (start date) - (end date) start_date : datetime the start date end_date : datetime the end date wave : str (min) - (max) (unit) min_wave : str minimum spectral range max_wave : str maximum spectral range unit_wave : str spectral range units (Angstrom, GHz, keV) extent : str VSO 'extent type' ... (FULLDISK, CORONA, LIMB, etc) physobj : str VSO 'physical observable' provider : str VSO ID for the data provider (SDAC, NSO, SHA, MSU, etc) source : str spacecraft or observatory (SOHO, YOHKOH, BBSO, etc) synonyms : spacecraft, observatory instrument : str instrument ID (EIT, SXI-0, SXT, etc) synonyms : telescope, inst detector : str detector ID (C3, EUVI, COR2, etc.) layout : str layout of the data (image, spectrum, time_series, etc.) level : str level of the data product (numeric range, see below) pixels : str number of pixels (numeric range, see below) resolution : str effective resolution (1 = full, 0.5 = 2x2 binned, etc) numeric range, see below. pscale : str pixel scale, in arcseconds (numeric range, see below) near_time : datetime return record closest to the time. See below. sample : int attempt to return only one record per SAMPLE seconds. See below. Numeric Ranges: - May be entered as a string or any numeric type for equality matching - May be a string of the format '(min) - (max)' for range matching - May be a string of the form '(operator) (number)' where operator is one of: lt gt le ge < > <= >= Examples -------- Query all data from eit between 2010-01-01T00:00 and 2010-01-01T01:00. >>> from datetime import datetime >>> from sunpy.net import vso >>> client = vso.VSOClient() # doctest: +REMOTE_DATA >>> qr = client.query_legacy(datetime(2010, 1, 1), ... datetime(2010, 1, 1, 1), instrument='eit') # doctest: +REMOTE_DATA Returns ------- out : :py:class:`QueryResult` (enhanced list) of matched items. Return value of same type as the one of :py:class:`VSOClient.query`. """ sdk = lambda key: lambda value: {key: value} ALIASES = { 'wave_min': sdk('wave_wavemin'), 'wave_max': sdk('wave_wavemax'), 'wave_type': sdk('wave_wavetype'), 'wave_unit': sdk('wave_waveunit'), 'min_wave': sdk('wave_wavemin'), 'max_wave': sdk('wave_wavemax'), 'type_wave': sdk('wave_wavetype'), 'unit_wave': sdk('wave_waveunit'), 'wave': _parse_waverange, 'inst': sdk('instrument'), 'telescope': sdk('instrument'), 'spacecraft': sdk('source'), 'observatory': sdk('source'), 'start_date': sdk('time_start'), 'end_date': sdk('time_end'), 'start': sdk('time_start'), 'end': sdk('time_end'), 'near_time': sdk('time_near'), 'date': _parse_date, 'layout': sdk('datatype'), } if tstart is not None: kwargs.update({'time_start': tstart}) if tend is not None: kwargs.update({'time_end': tend}) queryreq = self.api.factory.create('QueryRequest') for key, value in iteritems(kwargs): for k, v in iteritems(ALIASES.get(key, sdk(key))(value)): if k.startswith('time'): v = parse_time(v).strftime(TIMEFORMAT) attr = k.split('_') lst = attr[-1] rest = attr[:-1] # pylint: disable=E1103 item = queryreq.block for elem in rest: try: item = item[elem] except KeyError: raise ValueError( "Unexpected argument {key!s}.".format(key=key)) if lst not in item: raise ValueError( "Unexpected argument {key!s}.".format(key=key)) if item[lst]: raise ValueError( "Got multiple values for {k!s}.".format(k=k)) item[lst] = v try: return QueryResponse.create(self.api.service.Query(queryreq)) except TypeNotFound: return QueryResponse([]) def latest(self): """ Return newest record (limited to last week). """ return self.query_legacy( datetime.utcnow() - timedelta(7), datetime.utcnow(), time_near=datetime.utcnow() ) def fetch(self, query_response, path=None, methods=('URL-FILE_Rice', 'URL-FILE'), downloader=None, site=None): """ Download data specified in the query_response. Parameters ---------- query_response : sunpy.net.vso.QueryResponse QueryResponse containing the items to be downloaded. path : str Specify where the data is to be downloaded. Can refer to arbitrary fields of the QueryResponseItem (instrument, source, time, ...) via string formatting, moreover the file-name of the file downloaded can be referred to as file, e.g. "{source}/{instrument}/{time.start}/{file}". methods : {list of str} Download methods, defaults to URL-FILE_Rice then URL-FILE. Methods are a concatenation of one PREFIX followed by any number of SUFFIXES i.e. `PREFIX-SUFFIX_SUFFIX2_SUFFIX3`. The full list of `PREFIXES `_ and `SUFFIXES `_ are listed on the VSO site. downloader : sunpy.net.downloader.Downloader Downloader used to download the data. site : str There are a number of caching mirrors for SDO and other instruments, some available ones are listed below. =============== ======================================================== NSO National Solar Observatory, Tucson (US) SAO (aka CFA) Smithonian Astronomical Observatory, Harvard U. (US) SDAC (aka GSFC) Solar Data Analysis Center, NASA/GSFC (US) ROB Royal Observatory of Belgium (Belgium) MPS Max Planck Institute for Solar System Research (Germany) UCLan University of Central Lancashire (UK) IAS Institut Aeronautique et Spatial (France) KIS Kiepenheuer-Institut fur Sonnenphysik Germany) NMSU New Mexico State University (US) =============== ======================================================== Returns ------- out : :py:class:`Results` object that supplies a list of filenames with meta attributes containing the respective QueryResponse. Examples -------- >>> res = fetch(qr).wait() # doctest:+SKIP """ if downloader is None: downloader = download.Downloader() downloader.init() res = download.Results( lambda _: downloader.stop(), 1, lambda mp: self.link(query_response, mp) ) else: res = download.Results( lambda _: None, 1, lambda mp: self.link(query_response, mp) ) if path is None: path = os.path.join(config.get('downloads', 'download_dir'), '{file}') elif isinstance(path, six.string_types) and '{file}' not in path: path = os.path.join(path, '{file}') path = os.path.expanduser(path) fileids = VSOClient.by_fileid(query_response) if not fileids: res.poke() return res # Adding the site parameter to the info info = {} if site is not None: info['site'] = site self.download_all( self.api.service.GetData( self.make_getdatarequest(query_response, methods, info)), methods, downloader, path, fileids, res ) res.poke() return res @deprecated('0.8', alternative='VSOClient.fetch') def get(self, query_response, path=None, methods=('URL-FILE_Rice', 'URL-FILE'), downloader=None, site=None): """ See `~sunpy.net.vso.VSOClient.fetch` """ return self.fetch(query_response, path=path, methods=methods, downloader=downloader, site=site) @staticmethod def link(query_response, maps): """ Return list of paths with records associated with them in the meta attribute. """ if not maps: return [] ret = [] for record_item in query_response: try: item = _Str(maps[record_item.fileid]['path']) except KeyError: continue # pylint: disable=W0201 item.meta = record_item ret.append(item) return ret def make_getdatarequest(self, response, methods=None, info=None): """ Make datarequest with methods from response. """ if methods is None: methods = self.method_order + ['URL'] return self.create_getdatarequest( dict((k, [x.fileid for x in v]) for k, v in iteritems(self.by_provider(response))), methods, info ) def create_getdatarequest(self, maps, methods, info=None): """ Create datarequest from maps mapping data provider to fileids and methods, """ if info is None: info = {} return self.make( 'VSOGetDataRequest', request__method__methodtype=methods, request__info=info, request__datacontainer__datarequestitem=[ self.make('DataRequestItem', provider=k, fileiditem__fileid=[v]) for k, v in iteritems(maps) ] ) # pylint: disable=R0913,R0912 def download_all(self, response, methods, dw, path, qr, res, info=None): GET_VERSION = [ ('0.8', (5, 8)), ('0.7', (1, 4)), ('0.6', (0, 3)), ] for dresponse in response.getdataresponseitem: for version, (from_, to) in GET_VERSION: if getattr(dresponse, version, '0.6') >= version: break else: res.add_error(UnknownVersion(dresponse)) continue # If from_ and to are uninitialized, the else block of the loop # continues the outer loop and thus this code is never reached. # pylint: disable=W0631 code = ( dresponse.status[from_:to] if hasattr(dresponse, 'status') else '200' ) if code == '200': for dataitem in dresponse.getdataitem.dataitem: try: self.download( dresponse.method.methodtype[0], dataitem.url, dw, res.require( list(map(str, dataitem.fileiditem.fileid))), res.add_error, path, qr[dataitem.fileiditem.fileid[0]] ) except NoData: res.add_error(DownloadFailed(dresponse)) continue except Exception: # FIXME: Is this a good idea? res.add_error(DownloadFailed(dresponse)) elif code == '300' or code == '412' or code == '405': if code == '300': try: methods = self.multiple_choices( dresponse.method.methodtype, dresponse ) except NoData: res.add_error(MultipleChoices(dresponse)) continue elif code == '412': try: info = self.missing_information( info, dresponse.info ) except NoData: res.add_error(MissingInformation(dresponse)) continue elif code == '405': try: methods = self.unknown_method(dresponse) except NoData: res.add_error(UnknownMethod(dresponse)) continue files = [] for dataitem in dresponse.getdataitem.dataitem: files.extend(dataitem.fileiditem.fileid) request = self.create_getdatarequest( {dresponse.provider: files}, methods, info ) self.download_all( self.api.service.GetData(request), methods, dw, path, qr, res, info ) else: res.add_error(UnknownStatus(dresponse)) def download(self, method, url, dw, callback, errback, *args): """ Override to costumize download action. """ if method.startswith('URL'): return dw.download(url, partial(self.mk_filename, *args), callback, errback ) raise NoData @staticmethod def by_provider(response): """ Returns a dictionary of provider corresponding to records in the response. """ map_ = defaultdict(list) for record in response: map_[record.provider].append(record) return map_ @staticmethod def by_fileid(response): """ Returns a dictionary of fileids corresponding to records in the response. """ return dict( (record.fileid, record) for record in response ) # pylint: disable=W0613 def multiple_choices(self, choices, response): """ Override to pick between multiple download choices. """ for elem in self.method_order: if elem in choices: return [elem] raise NoData # pylint: disable=W0613 def missing_information(self, info, field): """ Override to provide missing information. """ raise NoData # pylint: disable=W0613 def unknown_method(self, response): """ Override to pick a new method if the current one is unknown. """ raise NoData @classmethod def _can_handle_query(cls, *query): return all([x.__class__.__name__ in attrs.__all__ for x in query]) @deprecated("0.8.0", alternative="Please use VSOClient") class InteractiveVSOClient(VSOClient): """ Client for use in the REPL. Prompts user for data if required. """ def multiple_choices(self, choices, response): """ not documented yet Parameters ---------- choices : not documented yet response : not documented yet """ while True: for n, elem in enumerate(choices): print("({num:d}) {choice!s}".format(num=n + 1, choice=elem)) try: choice = input("Method number: ") except KeyboardInterrupt: raise NoData if not choice: raise NoData try: choice = int(choice) - 1 except ValueError: continue if choice == -1: raise NoData elif choice >= 0: try: return [choices[choice]] except IndexError: continue def missing_information(self, info, field): """ not documented yet Parameters ---------- info : not documented yet not documented yet field : not documented yet not documented yet Returns ------- choice : not documented yet .. todo:: improve documentation. what does this function do? """ choice = input(field + ': ') if not choice: raise NoData return choice def search(self, *args, **kwargs): """ When passed an Attr object, perform new-style query; otherwise, perform legacy query. """ if isinstance(args[0], Attr): return self.query(*args) else: return self.query_legacy(*args, **kwargs) def get(self, query_response, path=None, methods=('URL-FILE',), downloader=None): """The path expands ``~`` to refer to the user's home directory. If the given path is an already existing directory, ``{file}`` is appended to this path. After that, all received parameters (including the updated path) are passed to :meth:`VSOClient.get`. """ if path is not None: path = os.path.abspath(os.path.expanduser(path)) if os.path.exists(path) and os.path.isdir(path): path = os.path.join(path, '{file}') return VSOClient.fetch(self, query_response, path, methods, downloader) g_client = None @deprecated("0.8.0", alternative="Please use the VSO Clients directly") def search(*args, **kwargs): # pylint: disable=W0603 global g_client if g_client is None: g_client = InteractiveVSOClient() return g_client.search(*args, **kwargs) search.__doc__ = InteractiveVSOClient.search.__doc__ @deprecated("0.8.0", alternative="Please use the VSO Clients directly") def get(query_response, path=None, methods=('URL-FILE',), downloader=None): # pylint: disable=W0603 global g_client if g_client is None: g_client = InteractiveVSOClient() return g_client.get(query_response, path, methods, downloader) get.__doc__ = VSOClient.search.__doc__ sunpy-0.8.3/sunpy/net/__init__.py0000644000175000017500000000014413231613140017142 0ustar nabilnabil00000000000000from __future__ import absolute_import __all__ = ["Fido"] from sunpy.net.fido_factory import Fido sunpy-0.8.3/sunpy/net/attr.py0000644000175000017500000001670013231613140016362 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- # Author: Florian Mayer # # This module was developed with funding provided by # the ESA Summer of Code (2011). # # pylint: disable=C0103,R0903 """ Allow representation of queries as logic expressions. This module makes sure that attributes that are combined using the two logic operations AND (&) and OR (|) always are in disjunctive normal form, that is, there are only two levels ­- the first being disjunction and the second being conjunction. In other words, every combinations of attributes looks like this: (a AND b AND c) OR (d AND e). Walkers are used to traverse the tree that results from combining attributes. They are implemented using sunpy.util.multimethod. Multimethods are functions that are not assigned to classes but still dispatch by type of one or more of their arguments. For more information about multimethods, refer to sunpy.util.multimethod. Please note that & is evaluated first, so A & B | C is equivalent to (A & B) | C. """ from __future__ import absolute_import from sunpy.util.multimethod import MultiMethod from sunpy.extern.six import iteritems # XXX: Maybe allow other normal forms. class Attr(object): """ This is the base for all attributes. """ def __and__(self, other): if isinstance(other, AttrOr): return AttrOr([elem & self for elem in other.attrs]) if self.collides(other): return NotImplemented if isinstance(other, AttrAnd): return AttrAnd([self] + list(other.attrs)) return AttrAnd([self, other]) def __hash__(self): return hash(frozenset(iteritems(vars(self)))) def __or__(self, other): # Optimization. if self == other: return self if isinstance(other, AttrOr): return AttrOr([self] + list(other.attrs)) return AttrOr([self, other]) def collides(self, other): raise NotImplementedError def __eq__(self, other): return dict(vars(self)) == dict(vars(other)) class DummyAttr(Attr): """ Empty attribute. Useful for building up queries. Returns other attribute when ORed or ANDed. It can be considered an empty query that you can use as an initial value if you want to build up your query in a loop. So, if we wanted an attr matching all the time intervals between the times stored as (from, to) tuples in a list, we could do. attr = DummyAttr() for from\_, to in times: attr |= Time(from\_, to) """ def __and__(self, other): return other def __or__(self, other): return other def collides(self, other): return False def __hash__(self): return hash(None) def __eq__(self, other): return isinstance(other, DummyAttr) class AttrAnd(Attr): """ Attribute representing attributes ANDed together. """ def __init__(self, attrs): Attr.__init__(self) self.attrs = attrs def __and__(self, other): if any(other.collides(elem) for elem in self.attrs): return NotImplemented if isinstance(other, AttrAnd): return AttrAnd(self.attrs + other.attrs) if isinstance(other, AttrOr): return AttrOr([elem & self for elem in other.attrs]) return AttrAnd(self.attrs + [other]) __rand__ = __and__ def __repr__(self): return "".format(att=self.attrs) def __eq__(self, other): if not isinstance(other, AttrAnd): return False return set(self.attrs) == set(other.attrs) def __hash__(self): return hash(frozenset(self.attrs)) def collides(self, other): return any(elem.collides(other) for elem in self.attrs) class AttrOr(Attr): """ Attribute representing attributes ORed together. """ def __init__(self, attrs): Attr.__init__(self) self.attrs = attrs def __or__(self, other): if isinstance(other, AttrOr): return AttrOr(self.attrs + other.attrs) return AttrOr(self.attrs + [other]) __ror__ = __or__ def __and__(self, other): return AttrOr([elem & other for elem in self.attrs]) __rand__ = __and__ def __xor__(self, other): new = AttrOr([]) for elem in self.attrs: try: new |= elem ^ other except TypeError: pass return new def __contains__(self, other): for elem in self.attrs: try: if other in elem: return True except TypeError: pass return False def __repr__(self): return "".format(att=self.attrs) def __eq__(self, other): if not isinstance(other, AttrOr): return False return set(self.attrs) == set(other.attrs) def __hash__(self): return hash(frozenset(self.attrs)) def collides(self, other): return all(elem.collides(other) for elem in self.attrs) class ValueAttr(Attr): def __init__(self, attrs): Attr.__init__(self) self.attrs = attrs def __repr__(self): return "".format(att=self.attrs) def __hash__(self): return hash(frozenset(iteritems(self.attrs.iteritems))) def __eq__(self, other): if not isinstance(other, self.__class__): return False return self.attrs == other.attrs def collides(self, other): if not isinstance(other, self.__class__): return False return any(k in other.attrs for k in self.attrs) class AttrWalker(object): def __init__(self): self.applymm = MultiMethod(lambda *a, **kw: (a[1], )) self.createmm = MultiMethod(lambda *a, **kw: (a[1], )) def add_creator(self, *types): def _dec(fun): for type_ in types: self.createmm.add(fun, (type_, )) return fun return _dec def add_applier(self, *types): def _dec(fun): for type_ in types: self.applymm.add(fun, (type_, )) return fun return _dec def add_converter(self, *types): def _dec(fun): for type_ in types: self.applymm.add(self.cv_apply(fun), (type_, )) self.createmm.add(self.cv_create(fun), (type_, )) return fun return _dec def cv_apply(self, fun): def _fun(*args, **kwargs): args = list(args) args[1] = fun(args[1]) return self.applymm(*args, **kwargs) return _fun def cv_create(self, fun): def _fun(*args, **kwargs): args = list(args) args[1] = fun(args[1]) return self.createmm(*args, **kwargs) return _fun def create(self, *args, **kwargs): return self.createmm(self, *args, **kwargs) def apply(self, *args, **kwargs): return self.applymm(self, *args, **kwargs) def super_create(self, *args, **kwargs): return self.createmm.super(self, *args, **kwargs) def super_apply(self, *args, **kwargs): return self.applymm.super(self, *args, **kwargs) def and_(*args): """ Trick operator precedence. and_(foo < bar, bar < baz) """ value = DummyAttr() for elem in args: value &= elem return value def or_(*args): """ Trick operator precedence. or_(foo < bar, bar < baz) """ value = DummyAttr() for elem in args: value |= elem return value sunpy-0.8.3/sunpy/net/attrs.py0000644000175000017500000000041113231613140016535 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- from .vso import attrs as vso from .jsoc import attrs as jsoc from .dataretriever.attrs import goes from .vso.attrs import Time, Instrument, Wavelength, Level __all__ = ['Time', 'Instrument', 'Wavelength', 'Level', 'vso', 'jsoc', 'goes'] sunpy-0.8.3/sunpy/net/download.py0000644000175000017500000001776713232563447017254 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- # Author: Florian Mayer # # This module was developed with funding provided by # the ESA Summer of Code (2011). from __future__ import absolute_import import os import re import threading from functools import partial from contextlib import closing from collections import defaultdict, deque from sunpy.extern import six from sunpy.extern.six.moves import urllib from sunpy.extern.six import iteritems import sunpy from sunpy.util.progressbar import TTYProgressBar as ProgressBar from sunpy.util.config import get_and_create_download_dir def default_name(path, sock, url): name = sock.headers.get('Content-Disposition', url.rsplit('/', 1)[-1]) return os.path.join(path, name) class Downloader(object): def __init__(self, max_conn=5, max_total=20): self.max_conn = max_conn self.max_total = max_total self.conns = 0 self.connections = defaultdict(int) # int() -> 0 self.q = defaultdict(deque) self.buf = 9096 self.done_lock = threading.Semaphore(0) self.mutex = threading.Lock() def _start_download(self, url, path, callback, errback): try: server = self._get_server(url) with self.mutex: self.connections[server] += 1 self.conns += 1 with closing(urllib.request.urlopen(url)) as sock: fullname = path(sock, url) dir_ = os.path.abspath(os.path.dirname(fullname)) if not os.path.exists(dir_): os.makedirs(dir_) with open(fullname, 'wb') as fd: while True: rec = sock.read(self.buf) if not rec: with self.mutex: self._close(callback, [{'path': fullname}], server) break else: fd.write(rec) except Exception as e: # TODO: Fix the silent failing if errback is not None: with self.mutex: self._close(errback, [e], server) def _attempt_download(self, url, path, callback, errback): """ Attempt download. If max. connection limit reached, queue for download later. """ num_connections = self.connections[self._get_server(url)] # If max downloads has not been exceeded, begin downloading if num_connections < self.max_conn and self.conns < self.max_total: th = threading.Thread( target=partial(self._start_download, url, path, callback, errback) ) th.daemon = True th.start() return True return False def _get_server(self, url): """Returns the server name for a given URL. Examples: http://server.com, server.org, ftp.server.org, etc. """ return re.search('(\w+://)?([\w\.]+)', url).group(2) def _default_callback(self, *args): """Default callback to execute on a successful download""" pass def _default_error_callback(self, e): """Default callback to execute on a failed download""" raise e def wait(self): self.done_lock.acquire() def stop(self): self.done_lock.release() def init(self): pass def download(self, url, path=None, callback=None, errback=None): """Downloads a file at a specified URL. Parameters ---------- url : string URL of file to download path : function, string Location to save file to. Can specify either a directory as a string or a function with signature: (path, url). Defaults to directory specified in sunpy configuration callback : function Function to call when download is successfully completed errback : function Function to call when download fails Returns ------- out : None """ # Load balancing? # @todo: explain server = self._get_server(url) # Create function to compute the filepath to download to if not set if path is None: path = partial(default_name, get_and_create_download_dir()) elif isinstance(path, six.string_types): path = partial(default_name, path) elif not callable(path): raise ValueError("path must be: None, string or callable") # Use default callbacks if none were specified if callback is None: callback = self._default_callback if errback is None: errback = self._default_error_callback # Attempt to download file from URL if not self._attempt_download(url, path, callback, errback): # If there are too many concurrent downloads, queue for later self.q[server].append((url, path, callback, errback)) def _close(self, callback, args, server): """ Called after download is done. Activated queued downloads, call callback. """ callback(*args) self.connections[server] -= 1 self.conns -= 1 if self.q[server]: self._attempt_download(*self.q[server].pop()) else: for k, v in iteritems(self.q): # pylint: disable=W0612 while v: if self._attempt_download(*v[0]): v.popleft() if self.conns == self.max_total: return else: break class Results(object): """ Returned by VSOClient.get. Use .wait to wait for completion of download. """ def __init__(self, callback, n=0, done=None): self.callback = callback self.n = self.total = n self.map_ = {} self.done = done self.evt = threading.Event() self.errors = [] self.lock = threading.RLock() self.progress = None def submit(self, keys, value): """ Submit Parameters ---------- keys : list names under which to save the value value : object value to save """ for key in keys: self.map_[key] = value self.poke() def poke(self): """ Signal completion of one item that was waited for. This can be because it was submitted, because it lead to an error or for any other reason. """ with self.lock: self.n -= 1 if self.progress is not None: self.progress.poke() if not self.n: if self.done is not None: self.map_ = self.done(self.map_) self.callback(self.map_) self.evt.set() def require(self, keys): """ Require that keys be submitted before the Results object is finished (i.e., wait returns). Returns a callback method that can be used to submit the result by simply calling it with the result. keys : list name of keys under which to save the result """ with self.lock: self.n += 1 self.total += 1 return partial(self.submit, keys) def wait(self, timeout=100, progress=True): """ Wait for result to be complete and return it. """ # Giving wait a timeout somehow circumvents a CPython bug that the # call gets ininterruptible. if progress: with self.lock: self.progress = ProgressBar(self.total, self.total - self.n) self.progress.start() self.progress.draw() while not self.evt.wait(timeout): pass if progress: self.progress.finish() return self.map_ def add_error(self, exception): """ Signal a required result cannot be submitted because of an error. """ self.errors.append(exception) self.poke() sunpy-0.8.3/sunpy/net/fido_factory.py0000644000175000017500000003506113231613140020061 0ustar nabilnabil00000000000000""" This module provides the `Fido ` instance of `sunpy.net.fido_factory.UnifiedDownloaderFactory` it also provides the `~sunpy.net.fido_factory.UnifiedResponse` class which `Fido.search ` returns and the `~sunpy.net.fido_factory.DownloadResponse` class that is returned by `Fido.fetch `. """ # This module was initially developed under funding provided by Google Summer # of Code 2014 from collections import Sequence from sunpy.util.datatype_factory_base import BasicRegistrationFactory from sunpy.util.datatype_factory_base import NoMatchError from sunpy.util.datatype_factory_base import MultipleMatchError from sunpy.net.dataretriever.clients import CLIENTS from sunpy.net.dataretriever.client import QueryResponse from sunpy.net.vso import VSOClient, QueryResponse as vsoQueryResponse from . import attr from . import attrs as a __all__ = ['Fido', 'UnifiedResponse', 'UnifiedDownloaderFactory', 'DownloadResponse'] class UnifiedResponse(Sequence): """ The object used to store results from `~sunpy.net.UnifiedDownloaderFactory.search`. The `~sunpy.net.Fido` object returns results from multiple different clients. So it is always possible to sub-select these results, you can index this object with two indices. The first index is the client index, i.e. corresponding to the results from the `~sunpy.net.vso.VSOClient`. The second index can be used to select records from the results returned from that client, for instance if you only want every second result you could index the second dimension with ``::2``. """ def __init__(self, lst): """ Parameters ---------- lst : `object` A single instance or an iterable of ``(QueryResponse, client)`` pairs or ``QueryResponse`` objects with a ``.client`` attribute. """ tmplst = [] # numfile is the number of files not the number of results. self._numfile = 0 if isinstance(lst, (QueryResponse, vsoQueryResponse)): if not hasattr(lst, 'client'): raise ValueError( ("A {} object is only a valid input to UnifiedResponse " "if it has a client attribute."). format(type(lst).__name__)) tmplst.append(lst) self._numfile = len(lst) else: for block in lst: if isinstance(block, tuple) and len(block) == 2: block[0].client = block[1] tmplst.append(block[0]) self._numfile += len(block[0]) elif hasattr(block, 'client'): tmplst.append(block) self._numfile += len(block) else: raise ValueError( "{} is not a valid input to UnifiedResponse.".format(type(lst))) self._list = tmplst def __len__(self): return len(self._list) def __iter__(self): return self.responses def _handle_record_slice(self, client_resp, record_slice): """ Given a slice to be applied to the results from a single client, return an object of the same type as client_resp. """ # When we subindex, we want to persist the type of the response object. resp_type = type(client_resp) # Make sure we always have an iterable, as most of the response objects # expect one. if isinstance(record_slice, int): resp = [client_resp[record_slice]] else: resp = client_resp[record_slice] # Reconstruct a response object with the sub-indexed records. ret = resp_type(resp) # Make sure we pass the client back out again. ret.client = client_resp.client return ret def __getitem__(self, aslice): """ Support slicing the UnifiedResponse as a 2D object. The first index is to the client and the second index is the records returned from those clients. """ # Just a single int as a slice, we are just indexing client. if isinstance(aslice, (int, slice)): ret = self._list[aslice] # Make sure we only have a length two slice. elif isinstance(aslice, tuple): if len(aslice) > 2: raise IndexError("UnifiedResponse objects can only " "be sliced with one or two indices.") # Indexing both client and records, but only for one client. if isinstance(aslice[0], int): client_resp = self._list[aslice[0]] ret = self._handle_record_slice(client_resp, aslice[1]) # Indexing both client and records for multiple clients. else: intermediate = self._list[aslice[0]] ret = [] for client_resp in intermediate: resp = self._handle_record_slice(client_resp, aslice[1]) ret.append(resp) else: raise IndexError("UnifiedResponse objects must be sliced with integers.") return UnifiedResponse(ret) def get_response(self, i): """ Get the actual response rather than another UnifiedResponse object. """ return self._list[i] def response_block_properties(self): """ Returns a set of class attributes on all the response blocks. Returns ------- s : list List of strings, containing attribute names in the response blocks. """ s = self.get_response(0).response_block_properties() for i in range(1, len(self)): s.intersection(self.get_response(i).response_block_properties()) return s @property def responses(self): """ A generator of all the `sunpy.net.dataretriever.client.QueryResponse` objects contained in the `~sunpy.net.fido_factory.UnifiedResponse` object. """ for i in range(len(self)): yield self.get_response(i) @property def file_num(self): return self._numfile def _repr_html_(self): nprov = len(self) if nprov == 1: ret = 'Results from {} Provider:

    '.format(len(self)) else: ret = 'Results from {} Providers:

    '.format(len(self)) for block in self.responses: ret += "{} Results from the {}:
    ".format(len(block), block.client.__class__.__name__) ret += block._repr_html_() ret += '
    ' return ret def __repr__(self): ret = super(UnifiedResponse, self).__repr__() ret += '\n' + str(self) return ret def __str__(self): nprov = len(self) if nprov == 1: ret = 'Results from {} Provider:\n\n'.format(len(self)) else: ret = 'Results from {} Providers:\n\n'.format(len(self)) for block in self.responses: ret += "{} Results from the {}:\n".format(len(block), block.client.__class__.__name__) lines = repr(block).split('\n') ret += '\n'.join(lines[1:]) ret += '\n\n' return ret class DownloadResponse(list): """ Object returned by clients servicing the query. """ def __init__(self, lst): super(DownloadResponse, self).__init__(lst) def wait(self, progress=True): """ Waits for all files to download completely and then return. Parameters ---------- progress : `bool` if true, display a progress bar. Returns ------- List of file paths to which files have been downloaded. """ filelist = [] for resobj in self: filelist.extend(resobj.wait(progress=progress)) return filelist """ Construct a simple AttrWalker to split up searches into blocks of attrs being 'anded' with AttrAnd. This pipeline only understands AttrAnd and AttrOr, Fido.search passes in an AttrAnd object of all the query parameters, if an AttrOr is encountered the query is split into the component parts of the OR, which at somepoint will end up being an AttrAnd object, at which point it is passed into _get_registered_widget. """ query_walker = attr.AttrWalker() @query_walker.add_creator(attr.AttrAnd) def _create_and(walker, query, factory): att = {type(x) for x in query.attrs} if a.Time not in att: error = "The following part of the query did not have a time specified:\n" for at in query.attrs: error += str(at) + ', ' raise ValueError(error) # Return the response and the client return [factory._make_query_to_client(*query.attrs)] @query_walker.add_creator(attr.AttrOr) def _create_or(walker, query, factory): qblocks = [] for attrblock in query.attrs: qblocks.extend(walker.create(attr.and_(attrblock), factory)) return qblocks class UnifiedDownloaderFactory(BasicRegistrationFactory): """ sunpy.net.Fido(\*args, \*\*kwargs) Search and Download data from a variety of supported sources. """ def search(self, *query): """ Query for data in form of multiple parameters. Examples -------- Query for LYRALightCurve data for the time range ('2012/3/4','2012/3/6') >>> from sunpy.net import Fido, attrs as a >>> import astropy.units as u >>> unifresp = Fido.search(a.Time('2012/3/4', '2012/3/6'), a.Instrument('lyra')) Query for data from Nobeyama Radioheliograph and RHESSI >>> unifresp = Fido.search(a.Time('2012/3/4', '2012/3/6'), ... (a.Instrument('norh') & a.Wavelength(17*u.GHz)) | a.Instrument('rhessi')) # doctest: +REMOTE_DATA Query for 304 Angstrom SDO AIA data with a cadence of 10 minutes >>> import astropy.units as u >>> from sunpy.net import Fido, attrs as a >>> unifresp = Fido.search(a.Time('2012/3/4', '2012/3/6'), ... a.Instrument('AIA'), ... a.Wavelength(304*u.angstrom, 304*u.angstrom), ... a.vso.Sample(10*u.minute)) # doctest: +REMOTE_DATA Parameters ---------- query : `sunpy.net.vso.attrs`, `sunpy.net.jsoc.attrs` A query consisting of multiple parameters which define the requested data. The query is specified using attributes from the VSO and the JSOC. The query can mix attributes from the VSO and the JSOC. Returns ------- `sunpy.net.fido_factory.UnifiedResponse` Container of responses returned by clients servicing query. Notes ----- The conjunction 'and' transforms query into disjunctive normal form ie. query is now of form A & B or ((A & B) | (C & D)) This helps in modularising query into parts and handling each of the parts individually. """ query = attr.and_(*query) return UnifiedResponse(query_walker.create(query, self)) # Python 3: this line should be like this # def fetch(self, *query_results, wait=True, progress=True, **kwargs): def fetch(self, *query_results, **kwargs): """ Download the records represented by `~sunpy.net.fido_factory.UnifiedResponse` objects. Parameters ---------- query_results : `sunpy.net.fido_factory.UnifiedResponse` Container returned by query method, or multiple. wait : `bool` fetch will wait until the download is complete before returning. progress : `bool` Show a progress bar while the download is running. Returns ------- `sunpy.net.fido_factory.DownloadResponse` Example -------- >>> from sunpy.net.vso.attrs import Time, Instrument >>> unifresp = Fido.search(Time('2012/3/4','2012/3/5'), Instrument('EIT')) # doctest: +REMOTE_DATA >>> downresp = Fido.fetch(unifresp) # doctest: +SKIP >>> file_paths = downresp.wait() # doctest: +SKIP """ wait = kwargs.pop("wait", True) progress = kwargs.pop("progress", True) reslist = [] for query_result in query_results: for block in query_result.responses: reslist.append(block.client.fetch(block, **kwargs)) results = DownloadResponse(reslist) if wait: return results.wait(progress=progress) else: return results def __call__(self, *args, **kwargs): raise TypeError("'{}' object is not callable".format(self.__class__.__name__)) def _check_registered_widgets(self, *args): """Factory helper function""" candidate_widget_types = list() for key in self.registry: if self.registry[key](*args): candidate_widget_types.append(key) n_matches = len(candidate_widget_types) if n_matches == 0: # There is no default client raise NoMatchError("This query was not understood by any clients. Did you miss an OR?") elif n_matches == 2: # If two clients have reported they understand this query, and one # of them is the VSOClient, then we ignore VSOClient. if VSOClient in candidate_widget_types: candidate_widget_types.remove(VSOClient) # Finally check that we only have one match. if len(candidate_widget_types) > 1: candidate_names = [cls.__name__ for cls in candidate_widget_types] raise MultipleMatchError("The following clients matched this query. " "Please make your query more specific.\n" "{}".format(candidate_names)) return candidate_widget_types def _make_query_to_client(self, *query): """ Given a query, look up the client and perform the query. Parameters ---------- query : collection of `~sunpy.net.vso.attr` objects Returns ------- response : `~sunpy.net.dataretriever.client.QueryResponse` client : `object` Instance of client class """ candidate_widget_types = self._check_registered_widgets(*query) tmpclient = candidate_widget_types[0]() return tmpclient.search(*query), tmpclient Fido = UnifiedDownloaderFactory( registry=CLIENTS, additional_validation_functions=['_can_handle_query']) sunpy-0.8.3/sunpy/net/helioviewer.py0000644000175000017500000002331113231613140017726 0ustar nabilnabil00000000000000""" This module provides a wrapper around the Helioviewer API. """ from __future__ import absolute_import #pylint: disable=E1101,F0401,W0231 __author__ = ["Keith Hughitt"] __email__ = "keith.hughitt@nasa.gov" import os import json import codecs import sunpy from sunpy.time import parse_time from sunpy.util.net import download_fileobj from sunpy.extern.six.moves import urllib __all__ = ['HelioviewerClient'] class HelioviewerClient(object): """Helioviewer.org Client""" def __init__(self, url="https://legacy.helioviewer.org/api/"): """ url : location of the Helioviewer API. The default location points to version 1 of the API. Version 1 of the Helioviewer API is currently planned to be supported until the end of April 2017. """ self._api = url def get_data_sources(self, **kwargs): """ Returns a structured list of datasources available at helioviewer.org. """ params = {"action": "getDataSources"} params.update(kwargs) return self._get_json(params) def get_closest_image(self, date, **kwargs): """Finds the closest image available for the specified source and date. For more information on what types of requests are available and the expected usage for the response, consult the Helioviewer API documentation: http://legacy.helioviewer.org/api/docs/v1/ . Parameters ---------- date : `datetime.datetime`, `str` A string or datetime object for the desired date of the image observatory : string (Optional) Observatory name instrument : string (Optional) instrument name detector : string (Optional) detector name measurement : string (Optional) measurement name sourceId : int (Optional) data source id Returns ------- out : `dict` A dictionary containing meta-information for the closest image matched Examples -------- >>> from sunpy.net import helioviewer >>> client = helioviewer.HelioviewerClient() # doctest: +REMOTE_DATA >>> metadata = client.get_closest_image('2012/01/01', sourceId=11) # doctest: +REMOTE_DATA >>> print(metadata['date']) # doctest: +REMOTE_DATA 2012-01-01 00:00:07 """ params = { "action": "getClosestImage", "date": self._format_date(date) } params.update(kwargs) response = self._get_json(params) # Cast date string to DateTime response['date'] = parse_time(response['date']) return response def download_jp2(self, date, directory=None, overwrite=False, **kwargs): """ Downloads the JPEG 2000 that most closely matches the specified time and data source. The data source may be specified either using it's sourceId from the get_data_sources query, or a combination of observatory, instrument, detector and measurement. Parameters ---------- date : `datetime.datetime`, string A string or datetime object for the desired date of the image directory : string (Optional) Directory to download JPEG 2000 image to. observatory : string (Optional) Observatory name instrument : string (Optional) instrument name detector : string (Optional) detector name measurement : string (Optional) measurement name sourceId : int (Optional) data source id jpip : bool (Optional) Returns a JPIP URI if set to True Returns ------- out : string Returns a filepath to the downloaded JPEG 2000 image or a URL if the "jpip" parameter is set to True. Examples -------- >>> import sunpy.map >>> from sunpy.net import helioviewer >>> hv = helioviewer.HelioviewerClient() # doctest: +REMOTE_DATA >>> filepath = hv.download_jp2('2012/07/03 14:30:00', observatory='SDO', instrument='AIA', detector='AIA', measurement='171') # doctest: +SKIP >>> aia = sunpy.map.Map(filepath) # doctest: +SKIP >>> aia.peek() # doctest: +SKIP >>> data_sources = hv.get_data_sources() # doctest: +REMOTE_DATA >>> hv.download_jp2('2012/07/03 14:30:00', sourceId=data_sources['SOHO']['LASCO']['C2']['white-light']['sourceId']) # doctest: +SKIP """ params = { "action": "getJP2Image", "date": self._format_date(date) } params.update(kwargs) # JPIP URL response if 'jpip' in kwargs: return self._get_json(params) return self._get_file(params, directory, overwrite=overwrite) def download_png(self, date, image_scale, layers, directory=None, overwrite=False, **kwargs): """Downloads a PNG image using data from Helioviewer.org. Returns a single image containing all layers/image types requested. If an image is not available for the date requested the closest available image is returned. The region to be included in the image may be specified using either the top-left and bottom-right coordinates in arc-seconds, or a center point in arc-seconds and a width and height in pixels. See the Helioviewer.org API Coordinates Appendix for more information about working with coordinates in Helioviewer.org. Parameters ---------- date : `datetime.datetime`, string A string or datetime object for the desired date of the image image_scale : float The zoom scale of the image. Default scales that can be used are 0.6, 1.2, 2.4, and so on, increasing or decreasing by a factor of 2. The full-res scale of an AIA image is 0.6. layers : string Each layer string is comma-separated with these values, e.g.: "[sourceId,visible,opacity]" or "[obs,inst,det,meas,visible,opacity]" Multiple layer string are by commas: "[layer1],[layer2],[layer3]" directory : string (Optional) Directory to download JPEG 2000 image to. x1 : float (Optional) The offset of the image's left boundary from the center of the sun, in arcseconds. y1 : float (Optional) The offset of the image's top boundary from the center of the sun, in arcseconds. x2 : float (Optional) The offset of the image's right boundary from the center of the sun, in arcseconds. y2 : float (Optional) The offset of the image's bottom boundary from the center of the sun, in arcseconds. x0 : float (Optional) The horizontal offset from the center of the Sun. y0 : float (Optional) The vertical offset from the center of the Sun. width : int (Optional) Width of the image in pixels (Maximum: 1920). height : int (Optional) Height of the image in pixels (Maximum: 1200). watermark (Optional) Whether or not the include the timestamps and the Helioviewer.org logo in the image (Default=True). Returns ------- out : string filepath to the PNG image Examples -------- >>> from sunpy.net.helioviewer import HelioviewerClient >>> hv = HelioviewerClient() # doctest: +REMOTE_DATA >>> hv.download_png('2012/07/16 10:08:00', 2.4, "[SDO,AIA,AIA,171,1,100]", x0=0, y0=0, width=1024, height=1024) # doctest: +SKIP >>> hv.download_png('2012/07/16 10:08:00', 4.8, "[SDO,AIA,AIA,171,1,100],[SOHO,LASCO,C2,white-light,1,100]", x1=-2800, x2=2800, y1=-2800, y2=2800, directory='~/Desktop') # doctest: +SKIP """ params = { "action": "takeScreenshot", "date": self._format_date(date), "imageScale": image_scale, "layers": layers, "display": True } params.update(kwargs) return self._get_file(params, directory, overwrite=overwrite) def is_online(self): """Returns True if Helioviewer is online and available.""" try: self.get_data_sources() except urllib.error.URLError: return False return True def _get_json(self, params): """Returns a JSON result as a string""" reader = codecs.getreader("utf-8") response = self._request(params) return json.load(reader(response)) def _get_file(self, params, directory=None, overwrite=False): """Downloads a file and return the filepath to that file""" # Query Helioviewer.org if directory is None: directory = sunpy.config.get('downloads', 'download_dir') else: directory = os.path.abspath(os.path.expanduser(directory)) response = self._request(params) try: filepath = download_fileobj(response, directory, overwrite=overwrite) finally: response.close() return filepath def _request(self, params): """Sends an API request and returns the result Parameters ---------- params : `dict` Parameters to send Returns ------- out : result of request """ response = urllib.request.urlopen( self._api, urllib.parse.urlencode(params).encode('utf-8')) return response def _format_date(self, date): """Formats a date for Helioviewer API requests""" return parse_time(date).strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + "Z" sunpy-0.8.3/sunpy/net/proxyfix.py0000644000175000017500000000226213232563373017313 0ustar nabilnabil00000000000000from suds.transport.http import HttpTransport as SudsHttpTransport class WellBehavedHttpTransport(SudsHttpTransport): """HttpTransport which properly obeys the ``*_proxy`` environment variables.""" def u2handlers(self): """Return a list of specific handlers to add. The urllib2 logic regarding ``build_opener(*handlers)`` is: - It has a list of default handlers to use - If a subclass or an instance of one of those default handlers is given in ``*handlers``, it overrides the default one. Suds uses a custom {'protocol': 'proxy'} mapping in self.proxy, and adds a ProxyHandler(self.proxy) to that list of handlers. This overrides the default behaviour of urllib2, which would otherwise use the system configuration (environment variables on Linux, System Configuration on Mac OS, ...) to determine which proxies to use for the current protocol, and when not to use a proxy (no_proxy). Thus, passing an empty list will use the default ProxyHandler which behaves correctly. This method comes from http://stackoverflow.com/a/12433606/1087595 """ return [] sunpy-0.8.3/sunpy/physics/0000755000175000017500000000000013232563477015750 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/physics/tests/0000755000175000017500000000000013232563477017112 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/physics/tests/test_differential_rotation.py0000644000175000017500000001706413231613140025064 0ustar nabilnabil00000000000000from __future__ import absolute_import import os import pytest from datetime import timedelta import numpy as np from astropy import units as u from astropy.time import Time from astropy.coordinates import SkyCoord from astropy.coordinates import Longitude from astropy.tests.helper import assert_quantity_allclose from sunpy.coordinates import frames from sunpy.coordinates.ephemeris import get_earth from sunpy.physics.differential_rotation import diff_rot, solar_rotate_coordinate, diffrot_map from sunpy.time import parse_time import sunpy.data.test import sunpy.map # pylint: disable=C0103,R0904,W0201,W0212,W0232,E1103 # Please note the numbers in these tests are not checked for physical # accuracy, only that they are the values the function was outputting upon # implementation. This is not a significant issue for the diff_rot function # since it is relatively simple and the values it produces can be easily # compared to other implementations of the same simple function. The same # cannot be said for the solar_rotate_coordinate function. This functionality # relies accurate knowledge of the solar ephemeris in particular. # There is no reference implementation of the solar_rotate_coordinate function # of demonstrated trustworthiness at time of writing in any language. There # are no known independent values or tests that can be used to test the # veracity of the solar_rotate_coordinate function. This being the case, the # solar_rotate_coordinate function is tested against values that it generated. # Therefore these tests test for consistency, not accuracy. Note that when the # 0.8.0 branch was released, the solar ephemeris calculation was handed off to # the relevant Astropy code. The solar_rotate_coordinate tests were changed # for self-consistency. Note that the change in position comparing the results # of pre- and 0.8.0 sunpy solar coordinate rotation functionality (rot_hpc # and solar_rotate_coordinate respectively) was on the order of 0.5 arcseconds. # At time of writing, the difference between the rotation # calculated using the pre-0.8.0 rot_hpc function and the SSWIDL equivalent # rot_xy.pro for the tests given in pre-0.8.0 were on the order of hundredths # of an arcsecond. I suspect that the reason for the small differences is # because the sunpy's ephemeris and coordinate transformation infrastructure # was largely based on that in SSWIDL. testpath = sunpy.data.test.rootdir @pytest.fixture def aia171_test_map(): return sunpy.map.Map((os.path.join(testpath, 'aia_171_level1.fits'))) @pytest.fixture def aia171_test_map_with_mask(aia171_test_map): shape = aia171_test_map.data.shape mask = np.zeros_like(aia171_test_map.data, dtype=bool) mask[0:shape[0]//2, 0:shape[1]//2] = True return sunpy.map.Map(np.ma.array(aia171_test_map.data, mask=mask), aia171_test_map.meta) @pytest.fixture def aia171_test_submap(aia171_test_map): bl = SkyCoord(-512 * u.arcsec, 100 * u.arcsec, frame=aia171_test_map.coordinate_frame) ur = SkyCoord(-100 * u.arcsec, 400 * u.arcsec, frame=aia171_test_map.coordinate_frame) return aia171_test_map.submap(bl, ur) @pytest.fixture def seconds_per_day(): return 24 * 60 * 60.0 * u.s def test_single(seconds_per_day): rot = diff_rot(10 * seconds_per_day, 30 * u.deg) assert_quantity_allclose(rot, 136.8216 * u.deg, rtol=1e-3) def test_array(seconds_per_day): rot = diff_rot(10 * seconds_per_day, np.linspace(-70, 70, 2) * u.deg) assert_quantity_allclose(rot, Longitude(np.array([110.2725, 110.2725]) * u.deg), rtol=1e-3) def test_synodic(seconds_per_day): rot = diff_rot(10 * seconds_per_day, 30 * u.deg, rot_type='howard', frame_time='synodic') assert_quantity_allclose(rot, 126.9656 * u.deg, rtol=1e-3) def test_sidereal(seconds_per_day): rot = diff_rot(10 * seconds_per_day, 30 * u.deg, rot_type='howard', frame_time='sidereal') assert_quantity_allclose(rot, 136.8216 * u.deg, rtol=1e-3) def test_howard(seconds_per_day): rot = diff_rot(10 * seconds_per_day, 30 * u.deg, rot_type='howard') assert_quantity_allclose(rot, 136.8216 * u.deg, rtol=1e-3) def test_allen(seconds_per_day): rot = diff_rot(10 * seconds_per_day, 30 * u.deg, rot_type='allen') assert_quantity_allclose(rot, 136.9 * u.deg, rtol=1e-3) def test_snodgrass(seconds_per_day): rot = diff_rot(10 * seconds_per_day, 30 * u.deg, rot_type='snodgrass') assert_quantity_allclose(rot, 135.4232 * u.deg, rtol=1e-3) def test_fail(seconds_per_day): with pytest.raises(ValueError): rot = diff_rot(10 * seconds_per_day, 30 * u.deg, rot_type='garbage') def test_solar_rotate_coordinate(): # Testing along the Sun-Earth line, observer is on the Earth obstime = '2010-09-10 12:34:56' newtime = '2010-09-10 13:34:56' c = SkyCoord(-570*u.arcsec, 120*u.arcsec, obstime=obstime, observer=get_earth(obstime), frame=frames.Helioprojective) d = solar_rotate_coordinate(c, newtime) # Test that a SkyCoordinate is created assert isinstance(d, SkyCoord) # Test the coordinate np.testing.assert_almost_equal(d.Tx.to(u.arcsec).value, -562.3768, decimal=1) np.testing.assert_almost_equal(d.Ty.to(u.arcsec).value, 119.2684, decimal=1) np.testing.assert_almost_equal(d.distance.to(u.km).value, 150083151.97246578, decimal=1) # Test that the SkyCoordinate is Helioprojective assert isinstance(d.frame, frames.Helioprojective) # Test the observer assert d.observer.obstime == Time(parse_time(newtime), scale='utc') np.testing.assert_almost_equal(d.observer.lon.to(u.deg).value, 0.0, decimal=5) np.testing.assert_almost_equal(d.observer.lat.to(u.deg).value, 7.248, decimal=3) np.testing.assert_almost_equal(d.observer.radius.to(u.AU).value, 1.006954, decimal=6) assert isinstance(d.observer, frames.HeliographicStonyhurst) def test_warp_sun(): pass def test_diffrot_map(aia171_test_map): # Test a submap without padding aia_srot = diffrot_map(aia171_test_map, dt=-5 * u.day) assert aia_srot.dimensions == aia171_test_map.dimensions assert (aia171_test_map.date - timedelta(days=5)) - aia_srot.date < timedelta(seconds=1) def test_diffrot_submap(aia171_test_submap): # Test a submap without padding aia_srot = diffrot_map(aia171_test_submap, '2011-02-14T12:00:00') assert aia_srot.dimensions == aia171_test_submap.dimensions assert (aia171_test_submap.date - timedelta(days=0.5)) - aia_srot.date < timedelta(seconds=1) def test_diffrot_submap_pad(aia171_test_submap): aia_srot = diffrot_map(aia171_test_submap, dt=-0.5 * u.day, pad=True) assert aia_srot.dimensions >= aia171_test_submap.dimensions assert (aia171_test_submap.date - timedelta(days=0.5)) - aia_srot.date < timedelta(seconds=1) assert aia_srot.meta['naxis1'] == 35 assert aia_srot.meta['naxis2'] == 18 def test_diffrot_allen_submap_pad(aia171_test_submap): aia_srot = diffrot_map(aia171_test_submap, dt=-0.5 * u.day, pad=True, rot_type='allen') assert aia_srot.dimensions >= aia171_test_submap.dimensions assert (aia171_test_submap.date - timedelta(days=0.5)) - aia_srot.date < timedelta(seconds=1) assert aia_srot.meta['naxis1'] == 35 assert aia_srot.meta['naxis2'] == 18 def test_diffrot_manyinputs(aia171_test_map): with pytest.raises(ValueError) as exc_info: diffrot_map(aia171_test_map, '2010-01-01', dt=3 * u.hour) assert 'Only a time or an interval is accepted' in str(exc_info.value) def test_diffrot_noinputs(aia171_test_map): with pytest.raises(ValueError) as exc_info: diffrot_map(aia171_test_map) assert 'Either a time or an interval (`dt=`) needs to be provided' in str(exc_info.value) sunpy-0.8.3/sunpy/physics/tests/test_solar_rotation.py0000644000175000017500000001011713231613140023540 0ustar nabilnabil00000000000000# # Testing functions for a mapcube solar derotation functionality. # import os from copy import deepcopy import pytest import numpy as np from numpy.testing import assert_allclose from astropy.coordinates import SkyCoord import astropy.units as u from astropy.tests.helper import assert_quantity_allclose import sunpy.data.test import sunpy.map from sunpy.physics.solar_rotation import calculate_solar_rotate_shift, mapcube_solar_derotate @pytest.fixture def aia171_test_map(): testpath = sunpy.data.test.rootdir return sunpy.map.Map(os.path.join(testpath, 'aia_171_level1.fits')) @pytest.fixture def aia171_test_submap(aia171_test_map): return aia171_test_map.submap(SkyCoord(((0, 0), (400, 500))*u.arcsec, frame=aia171_test_map.coordinate_frame)) @pytest.fixture def aia171_test_mapcube(aia171_test_submap): m2header = deepcopy(aia171_test_submap.meta) m2header['date-obs'] = '2011-02-15T01:00:00.34' m2 = sunpy.map.Map((aia171_test_submap.data, m2header)) m3header = deepcopy(aia171_test_submap.meta) m3header['date-obs'] = '2011-02-15T02:00:00.34' m3 = sunpy.map.Map((aia171_test_submap.data, m3header)) return sunpy.map.Map([aia171_test_submap, m2, m3], cube=True) # Known displacements for these mapcube layers when the layer index is set to 0 @pytest.fixture def known_displacements_layer_index0(): return {'x': np.asarray([-0.146552, -9.927367, -19.729643]), 'y': np.asarray([-0.18597, 0.064922, 0.303616])} # Known displacements for these mapcube layers when the layer index is set to 1 @pytest.fixture def known_displacements_layer_index1(): return {'x': np.asarray([9.611735, -0.146552, -9.927367]), 'y': np.asarray([-0.449032, -0.18597, 0.064922])} def test_calculate_solar_rotate_shift(aia171_test_mapcube, known_displacements_layer_index0, known_displacements_layer_index1): # Test that the default works test_output = calculate_solar_rotate_shift(aia171_test_mapcube) assert_allclose(test_output['x'].to('arcsec').value, known_displacements_layer_index0['x'], rtol=5e-2, atol=1e-5) assert_allclose(test_output['y'].to('arcsec').value, known_displacements_layer_index0['y'], rtol=5e-2, atol=1e-5) # Test that the rotation relative to a nonzero layer_index works test_output = calculate_solar_rotate_shift(aia171_test_mapcube, layer_index=1) assert_allclose(test_output['x'].to('arcsec').value, known_displacements_layer_index1['x'], rtol=5e-2, atol=1e-5) assert_allclose(test_output['y'].to('arcsec').value, known_displacements_layer_index1['y'], rtol=5e-2, atol=1e-5) def test_mapcube_solar_derotate(aia171_test_mapcube, aia171_test_submap): # Test that a mapcube is returned when the clipping is False. tmc = mapcube_solar_derotate(aia171_test_mapcube, clip=False) assert(isinstance(tmc, sunpy.map.MapCube)) # Test that all entries have the same shape when clipping is False for m in tmc: assert(m.data.shape == aia171_test_submap.data.shape) # Test that a mapcube is returned on default clipping (clipping is True) tmc = mapcube_solar_derotate(aia171_test_mapcube) assert(isinstance(tmc, sunpy.map.MapCube)) # Test that the shape of data is correct when clipped clipped_shape = (24, 19) for m in tmc: assert(m.data.shape == clipped_shape) # Test that the returned reference pixels are correctly displaced. layer_index = 0 derotated = mapcube_solar_derotate(aia171_test_mapcube, clip=True, layer_index=layer_index) tshift = calculate_solar_rotate_shift(aia171_test_mapcube, layer_index=layer_index) derotated_reference_pixel_at_layer_index = derotated[layer_index].reference_pixel for i, m_derotated in enumerate(derotated): for i_s, s in enumerate(['x', 'y']): diff_in_rotated_reference_pixel = derotated[i].reference_pixel[i_s] - derotated_reference_pixel_at_layer_index[i_s] diff_arcsec = tshift[s][i] - tshift[s][layer_index] diff_pixel = diff_arcsec / m.scale[0] assert_quantity_allclose(diff_in_rotated_reference_pixel, diff_pixel, rtol=5e-2) sunpy-0.8.3/sunpy/physics/transforms/0000755000175000017500000000000013232563477020146 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/physics/transforms/__init__.py0000644000175000001440000000000013203275053021217 0ustar nabil00000000000000sunpy-0.8.3/sunpy/physics/transforms/differential_rotation.py0000644000175000017500000000042413231613140025051 0ustar nabilnabil00000000000000import warnings warnings.warn( """The module 'sunpy.physics.transforms.differential_rotation.py' is deprecated and will be removed in the future. Use 'sunpy.physics.differential_rotation.py' instead""", stacklevel=2) from sunpy.physics.differential_rotation import * sunpy-0.8.3/sunpy/physics/transforms/solar_rotation.py0000644000175000001440000000036513203275053022535 0ustar nabil00000000000000import warnings warnings.warn("""The module 'sunpy.physics.transforms.solar_rotation.py' is deprecated and will be removed in the future. Use 'sunpy.physics.solar_rotation.py' instead""", stacklevel=2) from sunpy.physics.solar_rotation import * sunpy-0.8.3/sunpy/physics/__init__.py0000644000175000001440000000000013203275053017021 0ustar nabil00000000000000sunpy-0.8.3/sunpy/physics/differential_rotation.py0000644000175000017500000003073113232563373022674 0ustar nabilnabil00000000000000from __future__ import division import datetime from copy import deepcopy import warnings from itertools import product import numpy as np from skimage import transform from astropy import units as u from astropy.coordinates import SkyCoord, Longitude import sunpy.map from sunpy.time import parse_time from sunpy.coordinates import frames, HeliographicStonyhurst from sunpy.image.util import to_norm, un_norm __all__ = ['diff_rot', 'solar_rotate_coordinate', 'diffrot_map'] @u.quantity_input(duration=u.s, latitude=u.degree) def diff_rot(duration, latitude, rot_type='howard', frame_time='sidereal'): """ This function computes the change in longitude over days in degrees. Parameters ----------- duration : `~astropy.units.Quantity` Number of seconds to rotate over. latitude : `~astropy.units.Quantity` heliographic coordinate latitude in Degrees. rot_type : `str` The differential rotation model to use. One of: | ``howard`` : Use values for small magnetic features from Howard et al. | ``snodgrass`` : Use Values from Snodgrass et. al | ``allen`` : Use values from Allen's Astrophysical Quantities, and simpler equation. frame_time : `str` One of : ``'sidereal'`` or ``'synodic'``. Choose 'type of day' time reference frame. Returns ------- longitude_delta : `~astropy.units.Quantity` The change in longitude over days (units=degrees) References ---------- * `IDL code equivalent `__ * `Howard rotation `__ * `A review of rotation parameters (including Snodgrass values) `__ Examples -------- Default rotation calculation over two days at 30 degrees latitude: >>> import numpy as np >>> import astropy.units as u >>> from sunpy.physics.differential_rotation import diff_rot >>> rotation = diff_rot(2 * u.day, 30 * u.deg) Default rotation over two days for a number of latitudes: >>> rotation = diff_rot(2 * u.day, np.linspace(-70, 70, 20) * u.deg) With rotation type 'allen': >>> rotation = diff_rot(2 * u.day, np.linspace(-70, 70, 20) * u.deg, 'allen') """ latitude = latitude.to(u.deg) sin2l = (np.sin(latitude))**2 sin4l = sin2l**2 rot_params = {'howard': [2.894, -0.428, -0.370] * u.urad / u.second, 'snodgrass': [2.851, -0.343, -0.474] * u.urad / u.second, 'allen': [14.44, -3.0, 0] * u.deg / u.day } if rot_type not in ['howard', 'allen', 'snodgrass']: raise ValueError(("rot_type must equal one of " "{{ {} }}".format(" | ".join(rot_params.keys())))) A, B, C = rot_params[rot_type] rotation = (A + B * sin2l + C * sin4l) * duration if frame_time == 'synodic': rotation -= 0.9856 * u.deg / u.day * duration return Longitude(rotation.to(u.deg)) def solar_rotate_coordinate(coordinate, new_observer_time, new_observer_location="earth", **diff_rot_kwargs): """ Given a coordinate on the Sun, calculate where that coordinate maps to at some later or earlier time, given the solar rotation profile. Note that if the new observer location is defined using a BaseCoordinateFrame or SkyCoord, then it is assumed that the new observer location is correct for the new observer time that was also passed in. Parameters ---------- coordinate : `~astropy.coordinates.SkyCoord` Any valid coordinate which is transformable to Heliographic Stonyhurst. new_observer_time : sunpy-compatible time date/time at which the input co-ordinate will be rotated to. new_observer_location : `str`, `~astropy.coordinates.BaseCoordinateFrame`, `~astropy.coordinates.SkyCoord` The solar-system body for which to calculate observer locations. Note that spacecraft are not explicitly supported as yet. Instruments in Earth orbit can be approximated by using the default setting. If a BaseCoordinateFrame or SkyCoord are passed in, it is assumed that this observer location is correct for the observer time that was also passed in. **diff_rot_kwargs : keyword arguments Keyword arguments are passed on as keyword arguments to `~sunpy.physics.differential_rotation.diff_rot`. Returns ------- coordinate : `~astropy.coordinates.SkyCoord`` The locations of the input coordinates after the application of solar rotation in the input coordinate frame. Examples -------- >>> import astropy.units as u >>> from astropy.coordinates import SkyCoord >>> from sunpy.coordinates import frames >>> from sunpy.physics.differential_rotation import solar_rotate_coordinate >>> from sunpy.coordinates.ephemeris import get_earth >>> obstime = '2010-09-10 12:34:56' >>> c = SkyCoord(-570*u.arcsec, 120*u.arcsec, obstime=obstime, observer=get_earth(obstime), frame=frames.Helioprojective) >>> solar_rotate_coordinate(c, '2010-09-10 13:34:56') # doctest: +FLOAT_CMP ): (Tx, Ty, distance) in (arcsec, arcsec, km) (-562.37689548, 119.26840368, 1.50083152e+08)> """ # Calculate the interval between the start and end time interval = ( parse_time(new_observer_time) - parse_time(coordinate.obstime)).total_seconds() * u.s # Compute Stonyhurst Heliographic co-ordinates - returns (longitude, # latitude). Points off the limb are returned as nan. heliographic_coordinate = coordinate.transform_to('heliographic_stonyhurst') # Compute the differential rotation drot = diff_rot(interval, heliographic_coordinate.lat.to(u.degree), **diff_rot_kwargs) # Rotate the input co-ordinate and update the observer heliographic_rotated = SkyCoord( heliographic_coordinate.lon + drot, heliographic_coordinate.lat, obstime=new_observer_time, observer=new_observer_location, frame=frames.HeliographicStonyhurst) # Return the rotated coordinates to the input coordinate frame return heliographic_rotated.transform_to(coordinate.frame.name) @u.quantity_input(dt=u.s) def _warp_sun_coordinates(xy, smap, dt, **diffrot_kwargs): """ Function that returns a new list of coordinates for each input coord. This is an inverse function needed by the scikit-image `transform.warp` function. Parameters ---------- xy : `numpy.ndarray` Array from `transform.warp` smap : `~sunpy.map` Original map that we want to transform dt : `~astropy.units.Quantity` Desired interval to rotate the input map by solar differential rotation. Returns ------- xy2 : `~numpy.ndarray` Array with the inverse transformation """ # NOTE: The time is being subtracted - this is because this function # calculates the inverse of the transformation. rotated_time = smap.date - datetime.timedelta(seconds=dt.to(u.s).value) # Calculate the hpc coords x = np.arange(0, smap.dimensions.x.value) y = np.arange(0, smap.dimensions.y.value) xx, yy = np.meshgrid(x, y) # the xy input array would have the following shape # xy = np.dstack([xx.T.flat, yy.T.flat])[0] # We start by converting the pixel to world with warnings.catch_warnings(): warnings.simplefilter('ignore') hpc_coords = smap.pixel_to_world(xx * u.pix, yy * u.pix) # then diff-rotate the hpc coordinates to the desired time rotated_coord = solar_rotate_coordinate(hpc_coords, rotated_time, **diffrot_kwargs) # To find the values that are behind the sun we need to convert them # to HeliographicStonyhurst findOccult = rotated_coord.transform_to(HeliographicStonyhurst) with np.errstate(invalid='ignore'): # and find which ones are outside the [-90, 90] range. occult = np.logical_or(np.less(findOccult.lon, -90 * u.deg), np.greater(findOccult.lon, 90 * u.deg)) # NaN-ing values that move to the other side of the sun rotated_coord.data.lon[occult] = np.nan * u.deg rotated_coord.data.lat[occult] = np.nan * u.deg rotated_coord.cache.clear() # Go back to pixel co-ordinates x2, y2 = smap.world_to_pixel(rotated_coord) # Re-stack the data to make it correct output form xy2 = np.dstack([x2.T.value.flat, y2.T.value.flat])[0] # Returned a masked array with the non-finite entries masked. xy2 = np.ma.array(xy2, mask=np.isnan(xy2)) return xy2 @u.quantity_input(dt='time') def diffrot_map(smap, time=None, dt=None, pad=False, **diffrot_kwargs): """ Function to apply solar differential rotation to a sunpy map. Parameters ---------- smap : `~sunpy.map` Original map that we want to transform. time : sunpy-compatible time date/time at which the input co-ordinate will be rotated to. dt : `~astropy.units.Quantity` or `datetime` Desired interval between the input map and returned map. pad : `bool` Whether to create a padded map for submaps to don't loose data Returns ------- diffrot_map : `~sunpy.map` A map with the result of applying solar differential rotation to the input map. """ if (time is not None) and (dt is not None): raise ValueError('Only a time or an interval is accepted') elif not (time or dt): raise ValueError('Either a time or an interval (`dt=`) needs to be provided') elif time: new_time = parse_time(time) dt = (new_time - smap.date).total_seconds() * u.s else: new_time = smap.date + datetime.timedelta(seconds=dt.to(u.s).value) # Check for masked maps if smap.mask is not None: smap_data = np.ma.array(smap.data, mask=smap.mask) else: smap_data = smap.data submap = False # Check whether the input is a submap if ((2 * smap.rsun_obs > smap.top_right_coord.Tx - smap.bottom_left_coord.Tx) or (2 * smap.rsun_obs > smap.top_right_coord.Ty - smap.bottom_left_coord.Ty)): submap = True if pad: # Calculating the largest distance between the corners and their rotation values deltax = deltay = 0 for corner in product(*product([0 * u.pix], smap.dimensions)): corner_world = smap.pixel_to_world(*corner) corner_world_rotated = solar_rotate_coordinate(corner_world, new_time, **diffrot_kwargs) corner_px_rotated = smap.world_to_pixel(corner_world_rotated) dx = np.abs(corner_px_rotated.x - corner[0]) dy = np.abs(corner_px_rotated.y - corner[1]) deltax = dx if dx > deltax else deltax deltay = dy if dy > deltay else deltay deltax = np.int(np.ceil(deltax.value)) deltay = np.int(np.ceil(deltay.value)) # Create a new `smap` with the padding around it smap_data = np.pad(smap.data, ((deltay, deltay), (deltax, deltax)), 'constant', constant_values=0) smap_meta = deepcopy(smap.meta) smap_meta['naxis2'], smap_meta['naxis1'] = smap_data.shape smap_meta['crpix1'] += deltax smap_meta['crpix2'] += deltay smap = sunpy.map.Map(smap_data, smap_meta) warp_args = {'smap': smap, 'dt': dt} warp_args.update(diffrot_kwargs) # Apply solar differential rotation as a scikit-image warp out = transform.warp(to_norm(smap_data), inverse_map=_warp_sun_coordinates, map_args=warp_args) # Recover the original intensity range. out = un_norm(out, smap.data) # Update the meta information with the new date and time, and reference pixel. out_meta = deepcopy(smap.meta) if out_meta.get('date_obs', False): del out_meta['date_obs'] out_meta['date-obs'] = "{:%Y-%m-%dT%H:%M:%S}".format(new_time) if submap: crval_rotated = solar_rotate_coordinate(smap.reference_coordinate, new_time, **diffrot_kwargs) out_meta['crval1'] = crval_rotated.Tx.value out_meta['crval2'] = crval_rotated.Ty.value return sunpy.map.Map((out, out_meta)) sunpy-0.8.3/sunpy/physics/solar_rotation.py0000644000175000017500000001333613231613140021345 0ustar nabilnabil00000000000000""" This module provides routines for applying solar rotation functions to mapcubes. """ import numpy as np import astropy.units as u from sunpy.physics.differential_rotation import solar_rotate_coordinate from sunpy.image.coalignment import apply_shifts __author__ = 'J. Ireland' __all__ = ['calculate_solar_rotate_shift', 'mapcube_solar_derotate'] def calculate_solar_rotate_shift(mc, layer_index=0, **kwargs): """ Calculate the shift that must be applied to each map contained in a mapcube in order to compensate for solar rotation. The center of the map is used to calculate the position of each mapcube layer. Shifts are calculated relative to a specified layer in the mapcube. When using this functionality, it is a good idea to check that the shifts that were applied to were reasonable and expected. One way of checking this is to animate the original mapcube, animate the derotated mapcube, and compare the differences you see to the calculated shifts. An example use is as follows. If you select data from the SDO cutout service, it is common to not use the solar tracking implemented by this service. This is because (at time of writing) the solar tracking implemented by that service moves the image by single pixels at a time. This is not optimal for many use cases, as it introduces artificial jumps in the data. So with solar tracking not chosen, the selected area is like a window through which you can see the Sun rotating underneath. Parameters ---------- mc : `sunpy.map.MapCube` The input mapcube. layer_index : int The index layer. Shifts are calculated relative to the time of this layer. ``**kwargs`` These keywords are passed to the function `sunpy.physics.differential_rotation.solar_rotate_coordinate`. Returns ------- x, y : `~astropy.units.Quantity`, ~astropy.units.Quantity` The shifts relative to the index layer that can be applied to the input mapcube in order to compensate for solar rotation. The shifts are given in arcseconds as understood in helioprojective coordinates systems. """ # Size of the data nt = len(mc.maps) # Storage for the shifts in arcseconds xshift_arcseconds = np.zeros(nt) * u.arcsec yshift_arcseconds = np.zeros_like(xshift_arcseconds) # Layer that rotate_to_this_layer = mc.maps[layer_index] # Calculate the rotations and the shifts for i, m in enumerate(mc): # Calculate the rotation of the center of the map 'm' at its # observation time to the observation time of the reference layer # indicated by "layer_index". new_coordinate = solar_rotate_coordinate(m.center, rotate_to_this_layer.date, new_observer_location=rotate_to_this_layer.observer_coordinate, **kwargs) # Calculate the shift in arcseconds xshift_arcseconds[i] = new_coordinate.Tx - rotate_to_this_layer.center.Tx yshift_arcseconds[i] = new_coordinate.Ty - rotate_to_this_layer.center.Ty return {"x": xshift_arcseconds, "y": yshift_arcseconds} def mapcube_solar_derotate(mc, layer_index=0, clip=True, shift=None, **kwargs): """ Move the layers in a mapcube according to the input shifts. If an input shift is not given, the shifts due to solar rotation relative to an index layer is calculated and applied. When using this functionality, it is a good idea to check that the shifts that were applied to were reasonable and expected. One way of checking this is to animate the original mapcube, animate the derotated mapcube, and compare the differences you see to the calculated shifts. Parameters ---------- mc : `sunpy.map.MapCube` A mapcube of shape (ny, nx, nt), where nt is the number of layers in the mapcube. layer_index : int Solar derotation shifts of all maps in the mapcube are assumed to be relative to the layer in the mapcube indexed by layer_index. clip : bool If True, then clip off x, y edges in the datacube that are potentially affected by edges effects. ``**kwargs`` These keywords are passed to the function `sunpy.physics.solar_rotation.calculate_solar_rotate_shift`. Returns ------- output : `sunpy.map.MapCube` The results of the shifts applied to the input mapcube. Examples -------- >>> from sunpy.physics.solar_rotation import mapcube_solar_derotate >>> import sunpy.data.sample >>> map1 = sunpy.map.Map(sunpy.data.sample.AIA_171_IMAGE) >>> map2 = sunpy.map.Map(sunpy.data.sample.EIT_195_IMAGE) >>> mc = sunpy.map.Map([map1, map2], cube=True) >>> derotated_mc = mapcube_solar_derotate(mc) >>> derotated_mc = mapcube_solar_derotate(mc, layer_index=-1) >>> derotated_mc = mapcube_solar_derotate(mc, clip=False) """ # Size of the data nt = len(mc.maps) # Storage for the pixel shifts and the shifts in arcseconds xshift_keep = np.zeros(nt) * u.pix yshift_keep = np.zeros_like(xshift_keep) # If no shifts are passed in, calculate them. Otherwise, # use the shifts passed in. if shift is None: shift = calculate_solar_rotate_shift(mc, layer_index=layer_index, **kwargs) xshift_arcseconds = shift['x'] yshift_arcseconds = shift['y'] # Calculate the pixel shifts for i, m in enumerate(mc): xshift_keep[i] = xshift_arcseconds[i] / m.scale[0] yshift_keep[i] = yshift_arcseconds[i] / m.scale[1] # Apply the pixel shifts and return the mapcube return apply_shifts(mc, yshift_keep, xshift_keep, clip=clip) sunpy-0.8.3/sunpy/roi/0000755000175000017500000000000013232563477015057 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/roi/tests/0000755000175000017500000000000013232563477016221 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/roi/tests/test_chaincode.py0000644000175000001440000000423313203275053020523 0ustar nabil00000000000000# Author: David PS import unittest from sunpy.roi.chaincode import Chaincode import numpy as np class CCTests(unittest.TestCase): def testEnds(self): cc = Chaincode([0, 0], "2460") # Can I test more than one path? How? end = [0, 0] self.failUnless(cc.matchend(end)) def testEndsFalse(self): cc = Chaincode([0, 0], "24460") end = [0, 0] self.failIf(cc.matchend(end)) def testSecondCoordinate(self): cc = Chaincode([0, 0], "0023") second = [-2, 0] self.failUnless(cc.matchany(second, 2)) def testSecondCoordinateFails(self): cc = Chaincode([1, 0], "0023") second = [-2, 0] self.failIf(cc.matchany(second, 2)) def testScaleSecond(self): cc = Chaincode([0, 0], "0723", xdelta=0.5, ydelta=0.5) second = [-1, 0.5] self.failUnless(cc.matchany(second, 2)) def testScaleEnd(self): cc = Chaincode([1.2, 3],"0723", xdelta=2.629, ydelta=2.629) end = [-1.429, 0.371] self.failUnless(cc.matchany(end, -1)) def testnparray(self): # Let's test that the shape of the array matches the expected # To do so we need to use np.array, instead of lists. cc = Chaincode([0, 0], "2460") shape = (2,5) self.failUnless(cc.coordinates.shape == shape) def testBoundingBox(self): #needs of np.array... I think cc = Chaincode([0, 0], "00033344") boundingbox = [[-3, 2], [-3, 0]] # [[x0,x1],[y0,y1]] (like cc) self.failUnless(np.all(cc.BoundingBox() == np.array(boundingbox))) def testBoundingBoxFalse(self): cc = Chaincode([0, 0], "002") boundingbox = [[-1, 0], [-1, 0]] self.failIf(np.all(cc.BoundingBox() != np.array(boundingbox))) def testSubBoundingBoxX(self): cc = Chaincode([0, 0], "44464660012075602223") self.failUnless(cc.subBoundingBox(xedge=[0.1, 2]) == [0, 3]) def testSubBoundingBoxY(self): cc = Chaincode([0, 0], "44464660012075602223") self.failUnless(cc.subBoundingBox(yedge=[-1, 0.5]) == [0, 3]) def main(): unittest.main() if __name__ == '__main__': main() sunpy-0.8.3/sunpy/roi/tests/test_roi.py0000644000175000001440000000355413210261730017377 0ustar nabil00000000000000from __future__ import absolute_import from datetime import datetime import sunpy from sunpy.roi import roi def test_roi_instance(): region = roi(times=['2012-06-20 05:00', '2012-06-20 07:00'], description='dummy_roi') assert isinstance(region, sunpy.roi.roi) def test_roi_empty_instance(): region = roi() assert (region.start_time is None) assert (region.end_time is None) def test_roi_times_str(): region = roi(times='2012-06-20 05:00') expected_time = datetime(2012, 6, 20, 5, 0) assert (region.start_time == expected_time) assert (region.end_time == expected_time) def test_roi_times_list_one_element(): region = roi(times=['2012-06-20 05:00']) expected_time = datetime(2012, 6, 20, 5, 0) assert (region.start_time == expected_time) assert (region.end_time == expected_time) def test_roi_times_list_two_elements(): region = roi(times=['2012-06-20 05:00', '2012-06-20 07:00']) expected_start_time = datetime(2012, 6, 20, 5, 0) expected_end_time = datetime(2012, 6, 20, 7, 0) assert (region.start_time == expected_start_time) assert (region.end_time == expected_end_time) def test_roi_times_list_more_that_2_elements(): region = roi(times=['2012-06-20 05:00', '2012-06-20 07:00', '2012-06-20 09:00']) assert (region.start_time is None) assert (region.end_time is None) def test_roi_description(): region = roi(description='foo') assert isinstance(region, sunpy.roi.roi) assert (region.description == 'foo') def test_roi_source(): region = roi(source='foo') assert isinstance(region, sunpy.roi.roi) assert (region.source == 'foo') def test_roi_time_range(): region = roi(times=['2012-06-20 05:00', '2012-06-20 07:00'], description='dummy_roi') assert isinstance(region.time_range(), sunpy.time.TimeRange) sunpy-0.8.3/sunpy/roi/__init__.py0000644000175000001440000000014513210261730016135 0ustar nabil00000000000000"""Time related functionality""" from __future__ import absolute_import from sunpy.roi.roi import * sunpy-0.8.3/sunpy/roi/chaincode.py0000644000175000001440000001060513210261730016315 0ustar nabil00000000000000from __future__ import print_function import numpy as np __authors__ = ["David PS"] __email__ = "dps.helio-?-gmail.com" class Chaincode(np.ndarray): """ Chaincode(origin, chaincode, xdelta=1, ydelta=1) A tool to infer some information from chaincodes produced by HELIO Feature Catalogue or Heliophysics Events Knowledgebase Parameters ---------- origin : `numpy.ndarray`, `list` The 2 points of the origin of the chaincode chaincode : string A list of the numbers (0-7) that indicate the path of the chaincode. 0 moves horizontally to the left and the rest follows anticlockwise. xdelta : Float ydelta : Float The scale to convert between pixels and flat coordinates Returns ------- cc.coordinates : `numpy.ndarray` An array containing all the x and y coordinates of the cc such [[x0, x1, x2, ..., xn], [y0 ,y1, y2, ..., yn]] Examples -------- >>> from sunpy.roi.chaincode import Chaincode >>> cc = Chaincode([-88, 812], "44464655567670006011212222324", ... xdelta=2.629, ydelta=2.629) >>> fig = plt.figure() # doctest: +SKIP >>> ax = fig.add_subplot(111) # doctest: +SKIP >>> x,y = zip(cc.coordinates) # doctest: +SKIP >>> ax.plot(x[0], y[0], 'go-') # doctest: +SKIP >>> fig.show() # doctest: +SKIP """ def __new__(cls, origin, chaincode, **kargs): if isinstance(origin, list): obj = np.asarray(origin).view(cls) else: raise TypeError('Invalid input') return obj def __init__(self, origin, chaincode, xdelta=1, ydelta=1): x_steps = [-1, -1, 0, 1, 1, 1, 0, -1] y_steps = [0, -1, -1, -1, 0, 1, 1, 1] self.coordinates = np.ndarray((2, len(chaincode) + 1)) self.coordinates[:, 0] = origin if chaincode.isdigit(): for index, step in enumerate(chaincode): self.coordinates[:, index + 1] = self.coordinates[:, index] + \ [[x_steps[int(step)] * xdelta, y_steps[int(step)] * ydelta]] def matchend(self, end): """ not documented yet Parameters ---------- end : not documented yet Returns ------- not documented yet .. todo:: improve documentation. what does this function do? """ return np.alltrue(np.equal(self.coordinates[:, -1], np.asarray(end))) def matchany(self, coordinates, index): """ not documented yet Parameters ---------- coordinates : not documented yet index : not documented yet Returns ------- not documented yet .. todo:: improve documentation. what does this function do? """ return np.alltrue(np.allclose(self.coordinates[:, index], np.asarray(coordinates))) def BoundingBox(self): """ Extract the coordinates of the chaincode [[x0,x1],[y0,y1]] """ bb = np.zeros((2, 2)) bb[:, 0] = self.coordinates.min(1) bb[:, 1] = self.coordinates.max(1) return bb def area(self): """ Place holder (no code) """ # should we add a mask for possible not flat objects (eg. Sun)? # Check whether it is a closed object pass def length(self): """ Place holder (no code) """ pass def subBoundingBox(self, xedge=None, yedge=None): """ Extract the x or y boundaries of the chaincode from a defined limits xedge or yedge. """ # It needs to check whether the input are lists and with 2 elements.. # try: # if (type(xedge) == list) or (type(yedge) == list): # if xedge is not None: edge = xedge IndexMask = 0 # we want to mask X IndexValue = 1 # we want to extract the MinMax from Y elif yedge is not None: edge = yedge IndexMask = 1 IndexValue = 0 else: print("Not edges input") return None mask = (self.coordinates[IndexMask, :] >= edge[0]) & \ (self.coordinates[IndexMask, :] <= edge[1]) # Should the edges be included? mx = np.ma.masked_array(self.coordinates[IndexValue, :], mask=(~mask)) return [mx.min(), mx.max()] sunpy-0.8.3/sunpy/roi/roi.py0000644000175000001440000000622013210261730015167 0ustar nabil00000000000000from __future__ import absolute_import from sunpy.time import TimeRange from sunpy.time import parse_time __all__ = ['roi'] class roi(object): """ A generalized region of interest (ROI) object Parameters ---------- times : list (optional) A list of 1 or 2 parse_time-readable times description : str (optional) A text description of the ROI source : str (optional) A description of where this ROI comes from (e.g. the instrument, 'RHESSI', 'LYRA LYTAF') Attributes ---------- start_time : datetime object containing the start time of the ROI end_time : datetime object containing the end time of the ROI description : A string descriptor of the ROI event type (e.g. 'attenuator change', 'LAR', 'SAA', 'flare') source : A string descriptor of the ROI source (e.g. 'LYRA', 'RHESSI') Methods ------- time_range() Return a time range object from the start and end times of the ROI Examples -------- >>> from sunpy.roi import roi >>> result = roi(times=['2011-02-15 04:34:09','2011-02-15 04:48:21'], description='UV occult.',source='LYRA LYTAF') >>> result = roi(times='2013-05-12 03:12:00') """ def __init__(self, times=None, description=None, source=None): # time could be a list with one or two elements if times and type(times) == list: if len(times) == 1: # if only one time given, make start and end times the same self.start_time = parse_time(times[0]) self.end_time = parse_time(times[0]) elif len(times) == 2: self.start_time = parse_time(times[0]) self.end_time = parse_time(times[1]) else: self.start_time = None self.end_time = None elif type(times) == str: self.start_time = parse_time(times) self.end_time = parse_time(times) else: self.start_time = None self.end_time = None # description of the ROI event type if description: self.description = str(description) else: self.description = None # optional description of where the ROI came from if source == None: self.source = "Unknown" else: self.source = source def time_range(self): """Returns a TimeRange using the start and end times""" if self.start_time and self.end_time: return TimeRange(self.start_time, self.end_time) def __repr__(self): """Print out info on the ROI""" if not self.start_time: startstring = 'None' else: startstring = self.start_time.isoformat() if not self.end_time: endstring = 'None' else: endstring = self.end_time.isoformat() return('SunPy Region-of-interest (ROI) object' + '\n-------------------------------------' + '\nSource: \t\t' + self.source + '\nStart time:\t\t' + startstring + '\nEnd time: \t\t' + endstring + '\nEvent description:\t' + str(self.description)) sunpy-0.8.3/sunpy/spectra/0000755000175000017500000000000013232563477015727 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/spectra/sources/0000755000175000017500000000000013232563477017412 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/spectra/sources/__init__.py0000644000175000001440000000045413210261730020473 0ustar nabil00000000000000"""Datasource-specific classes This is where datasource specific logic is implemented. Each mission should have its own file with one or more classes defined. """ __all__ = ['CallistoSpectrogram', 'SWavesSpectrogram'] from .callisto import CallistoSpectrogram from .swaves import SWavesSpectrogram sunpy-0.8.3/sunpy/spectra/sources/callisto.py0000644000175000017500000004034113231613140021556 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- # Author: Florian Mayer from __future__ import absolute_import, print_function import datetime import numpy as np from astropy.io import fits from collections import defaultdict from bs4 import BeautifulSoup from scipy.optimize import leastsq from scipy.ndimage import gaussian_filter1d from sunpy.time import parse_time from sunpy.util import minimal_pairs, deprecated from sunpy.util.cond_dispatch import ConditionalDispatch, run_cls from sunpy.util.net import download_file from sunpy.spectra.spectrogram import LinearTimeSpectrogram, REFERENCE from sunpy.extern.six.moves import urllib from sunpy.extern.six import next, itervalues __all__ = ['CallistoSpectrogram'] TIME_STR = "%Y%m%d%H%M%S" DEFAULT_URL = 'http://soleil.i4ds.ch/solarradio/data/2002-20yy_Callisto/' _DAY = datetime.timedelta(days=1) DATA_SIZE = datetime.timedelta(seconds=15 * 60) def parse_filename(href): name = href.split('.')[0] try: inst, date, time, no = name.rsplit('_') dstart = datetime.datetime.strptime(date + time, TIME_STR) except ValueError: # If the split fails, the file name does not match out # format,so we skip it and continue to the next # iteration of the loop. return None return inst, no, dstart PARSERS = [ # Everything starts with "" ("", parse_filename) ] def search(start, end, instruments=None, url=DEFAULT_URL): """Get URLs for callisto data from instruments between start and end. Parameters ---------- start : `~sunpy.time.parse_time` compatible end : `~sunpy.time.parse_time` compatible instruments : sequence Sequence of instruments whose data is requested. url : str Base URL for the request. """ day = datetime.datetime(start.year, start.month, start.day) while day <= end: directory = url + day.strftime('%Y/%m/%d/') opn = urllib.request.urlopen(directory) try: soup = BeautifulSoup(opn) for link in soup.find_all("a"): href = link.get("href") for prefix, parser in PARSERS: if href.startswith(prefix): break result = parser(href) if result is None: continue inst, no, dstart = result if (instruments is not None and inst not in instruments and (inst, int(no)) not in instruments): continue dend = dstart + DATA_SIZE if dend > start and dstart < end: yield directory + href finally: opn.close() day += _DAY @deprecated('0.8', alternative='callisto.search') def query(start, end, instruments=None, url=DEFAULT_URL): __doc__ = search.__doc__ return search(start, end, instruments=instruments, url=url) def download(urls, directory): """Download files from urls into directory. Parameters ---------- urls : list of str urls of the files to retrieve directory : str directory to save them in """ return [download_file(url, directory) for url in urls] def _parse_header_time(date, time): """Returns `~datetime.datetime` object from date and time fields of header. """ if time is not None: date = date + 'T' + time return parse_time(date) class CallistoSpectrogram(LinearTimeSpectrogram): """ Class used for dynamic spectra coming from the Callisto network. Attributes ---------- header : `~astropy.io.fits.Header` main header of the FITS file axes_header : `~astropy.io.fits.Header` header for the axes table swapped : bool flag that specifies whether originally in the file the x-axis was frequency """ # XXX: Determine those from the data. SIGMA_SUM = 75 SIGMA_DELTA_SUM = 20 _create = ConditionalDispatch.from_existing(LinearTimeSpectrogram._create) create = classmethod(_create.wrapper()) # Contrary to what pylint may think, this is not an old-style class. # pylint: disable=E1002,W0142,R0902 # This needs to list all attributes that need to be # copied to maintain the object and how to handle them. COPY_PROPERTIES = LinearTimeSpectrogram.COPY_PROPERTIES + [ ('header', REFERENCE), ('swapped', REFERENCE), ('axes_header', REFERENCE) ] # List of instruments retrieved in July 2012 from # http://soleil.i4ds.ch/solarradio/data/2002-20yy_Callisto/ INSTRUMENTS = set([ 'ALASKA', 'ALMATY', 'BIR', 'DARO', 'HB9SCT', 'HUMAIN', 'HURBANOVO', 'KASI', 'KENYA', 'KRIM', 'MALAYSIA', 'MRT1', 'MRT2', 'OOTY', 'OSRA', 'SWMC', 'TRIEST', 'UNAM' ]) def save(self, filepath): """ Save modified spectrogram back to filepath. Parameters ---------- filepath : str path to save the spectrogram to """ main_header = self.get_header() data = fits.PrimaryHDU(self, header=main_header) ## XXX: Update axes header. freq_col = fits.Column( name="frequency", format="D8.3", array=self.freq_axis ) time_col = fits.Column( name="time", format="D8.3", array=self.time_axis ) cols = fits.ColDefs([freq_col, time_col]) table = fits.new_table(cols, header=self.axes_header) hdulist = fits.HDUList([data, table]) hdulist.writeto(filepath) def get_header(self): """Returns the updated header.""" header = self.header.copy() if self.swapped: header['NAXIS2'] = self.shape[1] # pylint: disable=E1101 header['NAXIS1'] = self.shape[0] # pylint: disable=E1101 else: header['NAXIS1'] = self.shape[1] # pylint: disable=E1101 header['NAXIS2'] = self.shape[0] # pylint: disable=E1101 return header @classmethod def read(cls, filename, **kwargs): """Reads in FITS file and return a new CallistoSpectrogram. Any unknown (i.e. any except filename) keyword arguments get passed to fits.open. Parameters ---------- filename : str path of the file to read """ fl = fits.open(filename, **kwargs) data = fl[0].data axes = fl[1] header = fl[0].header start = _parse_header_time( header['DATE-OBS'], header.get('TIME-OBS', header.get('TIME$_OBS')) ) end = _parse_header_time( header['DATE-END'], header.get('TIME-END', header.get('TIME$_END')) ) swapped = "time" not in header["CTYPE1"].lower() # Swap dimensions so x-axis is always time. if swapped: t_delt = header["CDELT2"] t_init = header["CRVAL2"] - t_delt * header["CRPIX2"] t_label = header["CTYPE2"] f_delt = header["CDELT1"] f_init = header["CRVAL1"] - t_delt * header["CRPIX1"] f_label = header["CTYPE1"] data = data.transpose() else: t_delt = header["CDELT1"] t_init = header["CRVAL1"] - t_delt * header["CRPIX1"] t_label = header["CTYPE1"] f_delt = header["CDELT2"] f_init = header["CRVAL2"] - t_delt * header["CRPIX2"] f_label = header["CTYPE2"] # Table may contain the axes data. If it does, the other way of doing # it might be very wrong. if axes is not None: try: # It's not my fault. Neither supports __contains__ nor .get tm = axes.data['time'] except KeyError: tm = None try: fq = axes.data['frequency'] except KeyError: fq = None if tm is not None: # Fix dimensions (whyever they are (1, x) in the first place) time_axis = np.squeeze(tm) else: # Otherwise, assume it's linear. time_axis = \ np.linspace(0, data.shape[1] - 1) * t_delt + t_init # pylint: disable=E1101 if fq is not None: freq_axis = np.squeeze(fq) else: freq_axis = \ np.linspace(0, data.shape[0] - 1) * f_delt + f_init # pylint: disable=E1101 content = header["CONTENT"] instruments = set([header["INSTRUME"]]) return cls( data, time_axis, freq_axis, start, end, t_init, t_delt, t_label, f_label, content, instruments, header, axes.header, swapped ) def __init__(self, data, time_axis, freq_axis, start, end, t_init=None, t_delt=None, t_label="Time", f_label="Frequency", content="", instruments=None, header=None, axes_header=None, swapped=False): # Because of how object creation works, there is no avoiding # unused arguments in this case. # pylint: disable=W0613 super(CallistoSpectrogram, self).__init__( data, time_axis, freq_axis, start, end, t_init, t_delt, t_label, f_label, content, instruments ) self.header = header self.axes_header = axes_header self.swapped = swapped @classmethod def is_datasource_for(cls, header): """Check if class supports data from the given FITS file. Parameters ---------- header : `~astropy.io.fits.Header` main header of the FITS file """ return header.get('instrume', '').strip() in cls.INSTRUMENTS def remove_border(self): """Remove duplicate entries on the borders.""" left = 0 while self.freq_axis[left] == self.freq_axis[0]: left += 1 right = self.shape[0] - 1 while self.freq_axis[right] == self.freq_axis[-1]: right -= 1 return self[left-1:right+2, :] @classmethod def read_many(cls, filenames, sort_by=None): """Returns a list of CallistoSpectrogram objects read from filenames. Parameters ---------- filenames : list of str list of paths to read from sort_by : str optional attribute of the resulting objects to sort from, e.g. start to sort by starting time. """ objs = list(map(cls.read, filenames)) if sort_by is not None: objs.sort(key=lambda x: getattr(x, sort_by)) return objs @classmethod def from_range(cls, instrument, start, end, **kwargs): """Automatically download data from instrument between start and end and join it together. Parameters ---------- instrument : str instrument to retrieve the data from start : `~sunpy.time.parse_time` compatible start of the measurement end : `~sunpy.time.parse_time` compatible end of the measurement """ kw = { 'maxgap': None, 'fill': cls.JOIN_REPEAT, } kw.update(kwargs) start = parse_time(start) end = parse_time(end) urls = query(start, end, [instrument]) data = list(map(cls.from_url, urls)) freq_buckets = defaultdict(list) for elem in data: freq_buckets[tuple(elem.freq_axis)].append(elem) try: return cls.combine_frequencies( [cls.join_many(elem, **kw) for elem in itervalues(freq_buckets)] ) except ValueError: raise ValueError("No data found.") def _overlap(self, other): """ Find frequency and time overlap of two spectrograms. """ one, two = self.intersect_time([self, other]) ovl = one.freq_overlap(two) return one.clip_freq(*ovl), two.clip_freq(*ovl) @staticmethod def _to_minimize(a, b): """Function to be minimized for matching to frequency channels.""" def _fun(p): if p[0] <= 0.2 or abs(p[1]) >= a.max(): return float("inf") return a - (p[0] * b + p[1]) return _fun def _homogenize_params(self, other, maxdiff=1): """ Return triple with a tuple of indices (in self and other, respectively), factors and constants at these frequencies. Parameters ---------- other : `sunpy.spectra.CallistoSpectrogram` Spectrogram to be homogenized with the current one. maxdiff : float Threshold for which frequencies are considered equal. """ pairs_indices = [ (x, y) for x, y, d in minimal_pairs(self.freq_axis, other.freq_axis) if d <= maxdiff ] pairs_data = [ (self[n_one, :], other[n_two, :]) for n_one, n_two in pairs_indices ] # XXX: Maybe unnecessary. pairs_data_gaussian = [ (gaussian_filter1d(a, 15), gaussian_filter1d(b, 15)) for a, b in pairs_data ] # If we used integer arithmetic, we would accept more invalid # values. pairs_data_gaussian64 = np.float64(pairs_data_gaussian) least = [ leastsq(self._to_minimize(a,b), [1, 0])[0] for a, b in pairs_data_gaussian64 ] factors = [x for x, y in least] constants = [y for x, y in least] return pairs_indices, factors, constants def homogenize(self, other, maxdiff=1): """ Return overlapping part of self and other as (self, other) tuple. Homogenize intensities so that the images can be used with combine_frequencies. Note that this works best when most of the picture is signal, so use :py:meth:`in_interval` to select the subset of your image before applying this method. Parameters ---------- other : `sunpy.spectra.CallistoSpectrogram` Spectrogram to be homogenized with the current one. maxdiff : float Threshold for which frequencies are considered equal. """ one, two = self._overlap(other) pairs_indices, factors, constants = one._homogenize_params( two, maxdiff ) # XXX: Maybe (xd.freq_axis[x] + yd.freq_axis[y]) / 2. pairs_freqs = [one.freq_axis[x] for x, y in pairs_indices] # XXX: Extrapolation does not work this way. # XXX: Improve. f1 = np.polyfit(pairs_freqs, factors, 3) f2 = np.polyfit(pairs_freqs, constants, 3) return (one, two * np.polyval(f1, two.freq_axis)[:, np.newaxis] + np.polyval(f2, two.freq_axis)[:, np.newaxis]) def extend(self, minutes=15, **kwargs): """Requests subsequent files from the server. If minutes is negative, retrieve preceding files. """ if len(self.instruments) != 1: raise ValueError instrument = next(iter(self.instruments)) if minutes > 0: data = CallistoSpectrogram.from_range( instrument, self.end, self.end + datetime.timedelta(minutes=minutes) ) else: data = CallistoSpectrogram.from_range( instrument, self.start - datetime.timedelta(minutes=-minutes), self.start ) data = data.clip_freq(self.freq_axis[-1], self.freq_axis[0]) return CallistoSpectrogram.join_many([self, data], **kwargs) @classmethod def from_url(cls, url): """Returns CallistoSpectrogram read from URL. Parameters ---------- url : str URL to retrieve the data from Returns ------- newSpectrogram : `sunpy.spectra.CallistoSpectrogram` """ return cls.read(url) CallistoSpectrogram._create.add( run_cls('from_range'), lambda cls, instrument, start, end: True, check=False ) try: CallistoSpectrogram.create.im_func.__doc__ = ( """Create CallistoSpectrogram from given input dispatching to the appropriate from_* function. Possible signatures: """ + CallistoSpectrogram._create.generate_docs()) except AttributeError: CallistoSpectrogram.create.__func__.__doc__ = ( """Create CallistoSpectrogram from given input dispatching to the appropriate from_* function. Possible signatures: """ + CallistoSpectrogram._create.generate_docs()) sunpy-0.8.3/sunpy/spectra/sources/swaves.py0000644000175000017500000000521013231613140021250 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- # Author: David Perez-Suarez from __future__ import absolute_import, print_function import os import datetime import numpy as np from sunpy.util.cond_dispatch import ConditionalDispatch from sunpy.spectra.spectrogram import LinearTimeSpectrogram, REFERENCE, get_day __all__ = ['SWavesSpectrogram'] class SWavesSpectrogram(LinearTimeSpectrogram): _create = ConditionalDispatch.from_existing(LinearTimeSpectrogram._create) create = classmethod(_create.wrapper()) COPY_PROPERTIES = LinearTimeSpectrogram.COPY_PROPERTIES + [ ('bg', REFERENCE) ] @staticmethod def swavesfile_to_date(filename): _, name = os.path.split(filename) date = name.split('_')[2] return datetime.datetime( int(date[0:4]), int(date[4:6]), int(date[6:]) ) @classmethod def read(cls, filename, **kwargs): """Read in FITS file and return a new SWavesSpectrogram. """ data = np.genfromtxt(filename, skip_header=2) time_axis = data[:, 0] * 60. data = data[:, 1:].transpose() header = np.genfromtxt(filename, skip_footer=time_axis.size) freq_axis = header[0, :] bg = header[1, :] start = cls.swavesfile_to_date(filename) end = start + datetime.timedelta(seconds=time_axis[-1]) t_delt = 60. t_init = (start - get_day(start)).seconds content = '' t_label = 'Time [UT]' f_label = 'Frequency [KHz]' freq_axis = freq_axis[::-1] data = data[::-1, :] return cls(data, time_axis, freq_axis, start, end, t_init, t_delt, t_label, f_label, content, bg) def __init__(self, data, time_axis, freq_axis, start, end, t_init, t_delt, t_label, f_label, content, bg): # Because of how object creation works, there is no avoiding # unused arguments in this case. # pylint: disable=W0613 super(SWavesSpectrogram, self).__init__( data, time_axis, freq_axis, start, end, t_init, t_delt, t_label, f_label, content, set(["SWAVES"]) ) self.bg = bg try: SWavesSpectrogram.create.im_func.__doc__ = ( """ Create SWavesSpectrogram from given input dispatching to the appropriate from_* function. Possible signatures: """ + SWavesSpectrogram._create.generate_docs()) except AttributeError: SWavesSpectrogram.create.__func__.__doc__ = ( """ Create SWavesSpectrogram from given input dispatching to the appropriate from_* function. Possible signatures: """ + SWavesSpectrogram._create.generate_docs()) sunpy-0.8.3/sunpy/spectra/tests/0000755000175000017500000000000013232563477017071 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/spectra/tests/__init__.py0000644000175000001440000000000013203275053020142 0ustar nabil00000000000000sunpy-0.8.3/sunpy/spectra/tests/test_callisto.py0000644000175000017500000002430413231613140022275 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- # Author: Florian Mayer from __future__ import absolute_import import shutil from tempfile import mkdtemp from datetime import datetime import pytest import os import glob import numpy as np from numpy.testing import assert_array_almost_equal, assert_allclose import sunpy.data.test from sunpy.spectra.sources.callisto import ( CallistoSpectrogram, query, download, minimal_pairs ) @pytest.fixture def CALLISTO_IMAGE(): testpath = sunpy.data.test.rootdir return os.path.join(testpath, 'BIR_20110922_050000_01.fit') @pytest.fixture def CALLISTO_IMAGE_GLOB_KEY(): return 'BIR_*' @pytest.fixture def CALLISTO_IMAGE_GLOB_INDEX(CALLISTO_IMAGE, CALLISTO_IMAGE_GLOB_KEY): testpath = sunpy.data.test.rootdir res = glob.glob(os.path.join(testpath, CALLISTO_IMAGE_GLOB_KEY)) return res.index(CALLISTO_IMAGE) def test_read(CALLISTO_IMAGE): ca = CallistoSpectrogram.read(CALLISTO_IMAGE) assert ca.start == datetime(2011, 9, 22, 5, 0, 0, 454000) assert ca.t_init == 18000.0 assert ca.shape == (200, 3600) assert ca.t_delt == 0.25 # Test linearity of time axis. assert np.array_equal( ca.time_axis, np.linspace(0, 0.25 * (ca.shape[1] - 1), ca.shape[1]) ) assert ca.dtype == np.uint8 @pytest.mark.remote_data def test_query(): URL = 'http://soleil.i4ds.ch/solarradio/data/2002-20yy_Callisto/2011/09/22/' result = list(query( datetime(2011, 9, 22, 5), datetime(2011, 9, 22, 6), set(["BIR"]) )) RESULTS = [ "BIR_20110922_050000_01.fit.gz", "BIR_20110922_051500_01.fit.gz", "BIR_20110922_053000_01.fit.gz", "BIR_20110922_050000_03.fit.gz", "BIR_20110922_051500_03.fit.gz", "BIR_20110922_053000_03.fit.gz", "BIR_20110922_054500_03.fit.gz", ] RESULTS.sort() # Should be sorted anyway, but better to assume as little as possible. result.sort() for item in RESULTS: assert URL + item in result @pytest.mark.remote_data @pytest.mark.xfail def test_query_number(): URL = 'http://soleil.i4ds.ch/solarradio/data/2002-20yy_Callisto/2011/09/22/' result = list(query( datetime(2011, 9, 22, 5), datetime(2011, 9, 22, 6), set([("BIR", 1)]) )) RESULTS = [ "BIR_20110922_050000_01.fit.gz", "BIR_20110922_051500_01.fit.gz", "BIR_20110922_053000_01.fit.gz", ] RESULTS.sort() # Should be sorted anyway, but better to assume as little as possible. result.sort() assert len(result) == len(RESULTS) @pytest.mark.remote_data @pytest.mark.xfail def test_download(): directory = mkdtemp() try: result = query( datetime(2011, 9, 22, 5), datetime(2011, 9, 22, 6), set([("BIR", 1)]) ) RESULTS = [ "BIR_20110922_050000_01.fit.gz", "BIR_20110922_051500_01.fit.gz", "BIR_20110922_053000_01.fit.gz", ] download(result, directory) for item in RESULTS: assert item in sorted(os.listdir(directory)) finally: shutil.rmtree(directory) def test_create_file(CALLISTO_IMAGE): ca = CallistoSpectrogram.create(CALLISTO_IMAGE) assert np.array_equal(ca.data, CallistoSpectrogram.read(CALLISTO_IMAGE).data) def test_create_file_kw(CALLISTO_IMAGE): ca = CallistoSpectrogram.create(filename=CALLISTO_IMAGE) assert np.array_equal(ca.data, CallistoSpectrogram.read(CALLISTO_IMAGE).data) @pytest.mark.remote_data def test_create_url(): URL = ( "http://soleil.i4ds.ch/solarradio/data/2002-20yy_Callisto/2011/09/22/" "BIR_20110922_050000_01.fit.gz" ) ca = CallistoSpectrogram.create(URL) assert np.array_equal(ca.data, CallistoSpectrogram.read(URL).data) @pytest.mark.remote_data def test_create_url_kw(): URL = ( "http://soleil.i4ds.ch/solarradio/data/2002-20yy_Callisto/2011/09/22/" "BIR_20110922_050000_01.fit.gz" ) ca = CallistoSpectrogram.create(url=URL) assert np.array_equal(ca.data, CallistoSpectrogram.read(URL).data) def test_create_single_glob(CALLISTO_IMAGE, CALLISTO_IMAGE_GLOB_INDEX, CALLISTO_IMAGE_GLOB_KEY): PATTERN = os.path.join(os.path.dirname(CALLISTO_IMAGE), CALLISTO_IMAGE_GLOB_KEY) ca = CallistoSpectrogram.create(PATTERN) assert_allclose(ca[CALLISTO_IMAGE_GLOB_INDEX].data, CallistoSpectrogram.read(CALLISTO_IMAGE).data) # seems like this does not work anymore and can't figure out what it is for #def test_create_single_glob_kw(CALLISTO_IMAGE): # PATTERN = os.path.join( os.path.dirname(CALLISTO_IMAGE), "BIR_*") # ca = CallistoSpectrogram.create(singlepattern=PATTERN) # assert np.array_equal(ca[0].data, CallistoSpectrogram.read(CALLISTO_IMAGE).data) def test_create_glob_kw(CALLISTO_IMAGE, CALLISTO_IMAGE_GLOB_INDEX, CALLISTO_IMAGE_GLOB_KEY): PATTERN = os.path.join( os.path.dirname(CALLISTO_IMAGE), CALLISTO_IMAGE_GLOB_KEY ) ca = CallistoSpectrogram.create(pattern=PATTERN)[CALLISTO_IMAGE_GLOB_INDEX] assert_allclose(ca.data, CallistoSpectrogram.read(CALLISTO_IMAGE).data) def test_create_glob(CALLISTO_IMAGE_GLOB_KEY): PATTERN = os.path.join( os.path.dirname(sunpy.data.test.__file__), CALLISTO_IMAGE_GLOB_KEY ) ca = CallistoSpectrogram.create(PATTERN) assert len(ca) == 2 def test_minimum_pairs_commotative(): A = [0, 1, 2] B = [1, 2, 3] first = list(minimal_pairs(A, B)) assert first == [(b, a, d) for a, b, d in minimal_pairs(B, A)] def test_minimum_pairs_end(): assert ( list(minimal_pairs([0, 1, 2, 4], [1, 2, 3, 4])) == [(1, 0, 0), (2, 1, 0), (3, 3, 0)] ) def test_minimum_pairs_end_more(): assert ( list(minimal_pairs([0, 1, 2, 4, 8], [1, 2, 3, 4])) == [(1, 0, 0), (2, 1, 0), (3, 3, 0)] ) def test_minimum_pairs_end_diff(): assert ( list(minimal_pairs([0, 1, 2, 8], [1, 2, 3, 4])) == [(1, 0, 0), (2, 1, 0), (3, 3, 4)] ) def test_closest(): assert ( list(minimal_pairs([50, 60], [0, 10, 20, 30, 40, 51, 52])) == [(0, 5, 1), (1, 6, 8)] ) def test_homogenize_factor(): a = np.float64(np.random.randint(0, 255, 3600))[np.newaxis, :] c1 = CallistoSpectrogram( a, np.arange(3600), np.array([1]), datetime(2011, 1, 1), datetime(2011, 1, 1, 1), 0, 1, 'Time', 'Frequency', 'Test', None, None, None, False ) b = 2 * a c2 = CallistoSpectrogram( b, np.arange(3600), np.array([1]), datetime(2011, 1, 1), datetime(2011, 1, 1, 1), 0, 1, 'Time', 'Frequency', 'Test', None, None, None, False ) pairs_indices, factors, constants = c1._homogenize_params( c2, 0 ) assert pairs_indices == [(0, 0)] assert_array_almost_equal(factors, [0.5], 2) assert_array_almost_equal(constants, [0], 2) assert_array_almost_equal(factors[0] * b + constants[0], a) def test_homogenize_constant(): a = np.float64(np.random.randint(0, 255, 3600))[np.newaxis, :] c1 = CallistoSpectrogram( a, np.arange(3600), np.array([1]), datetime(2011, 1, 1), datetime(2011, 1, 1, 1), 0, 1, 'Time', 'Frequency', 'Test', None, None, None, False ) b = a + 10 c2 = CallistoSpectrogram( b, np.arange(3600), np.array([1]), datetime(2011, 1, 1), datetime(2011, 1, 1, 1), 0, 1, 'Time', 'Frequency', 'Test', None, None, None, False ) pairs_indices, factors, constants = c1._homogenize_params( c2, 0 ) assert pairs_indices == [(0, 0)] assert_array_almost_equal(factors, [1], 2) assert_array_almost_equal(constants, [-10], 2) assert_array_almost_equal(factors[0] * b + constants[0], a) def test_homogenize_both(): a = np.float64(np.random.randint(0, 255, 3600))[np.newaxis, :] c1 = CallistoSpectrogram( a, np.arange(3600), np.array([1]), datetime(2011, 1, 1), datetime(2011, 1, 1, 1), 0, 1, 'Time', 'Frequency', 'Test', None, None, None, False ) b = 2 * a + 1 c2 = CallistoSpectrogram( b, np.arange(3600), np.array([1]), datetime(2011, 1, 1), datetime(2011, 1, 1, 1), 0, 1, 'Time', 'Frequency', 'Test', None, None, None, False ) pairs_indices, factors, constants = c1._homogenize_params( c2, 0 ) assert pairs_indices == [(0, 0)] assert_array_almost_equal(factors, [0.5], 2) assert_array_almost_equal(constants, [-0.5], 2) assert_array_almost_equal(factors[0] * b + constants[0], a) def test_homogenize_rightfq(): a = np.float64(np.random.randint(0, 255, 3600))[np.newaxis, :] c1 = CallistoSpectrogram( a, np.arange(3600), np.array([1]), datetime(2011, 1, 1), datetime(2011, 1, 1, 1), 0, 1, 'Time', 'Frequency', 'Test', None, None, None, False ) b = 2 * a + 1 c2 = CallistoSpectrogram( np.concatenate([ np.arange(3600)[np.newaxis, :], b, np.arange(3600)[np.newaxis, :] ], 0), np.arange(3600), np.array([0, 1, 2]), datetime(2011, 1, 1), datetime(2011, 1, 1, 1), 0, 1, 'Time', 'Frequency', 'Test', None, None, None, False ) pairs_indices, factors, constants = c1._homogenize_params( c2, 0 ) assert pairs_indices == [(0, 1)] assert_array_almost_equal(factors, [0.5], 2) assert_array_almost_equal(constants, [-0.5], 2) assert_array_almost_equal(factors[0] * b + constants[0], a) @pytest.mark.remote_data def test_extend(CALLISTO_IMAGE): im = CallistoSpectrogram.create(CALLISTO_IMAGE) im2 = im.extend() # Not too stable test, but works. assert im2.data.shape == (200, 7200) sunpy-0.8.3/sunpy/spectra/tests/test_spectrogram.py0000644000175000001440000006313613210261730022006 0ustar nabil00000000000000# -*- coding: utf-8 -*- # Author: Florian Mayer from __future__ import absolute_import, print_function from datetime import datetime import pytest import numpy as np from numpy.testing import assert_array_almost_equal from sunpy.spectra.spectrogram import (Spectrogram, LinearTimeSpectrogram, _LinearView) from sunpy.extern.six.moves import range def is_linear(arr): return np.array_equal(arr, np.linspace(arr[0], arr[-1], len(arr))) def dict_eq(one, other): ks = set(one.keys()) if ks != set(other.keys()): return False for key in ks: if isinstance(one[key], np.ndarray): if not np.array_equal(one[key], other[key]): return False else: if one[key] != other[key]: return False return True def mk_spec(image): return Spectrogram( image, np.linspace(0, image.shape[1] - 1, image.shape[1]), np.linspace(0, image.shape[0] - 1, image.shape[0]), datetime(2010, 10, 10), datetime(2010, 10, 10, 1), 0 ) def test_subtract_bg(): # The idea is to generate background and add a random signal, perform # background subtraction and see if the signal comes out again. bg = np.linspace(0, 200, 200).astype(np.uint16) bg.shape = (200, 1) bg = bg + np.zeros((200, 3600)) signal = np.random.rand(200, 1800) * 255 signal = signal.astype(np.uint16) image = bg image[:, 1800:] += signal spectrogram = mk_spec(image) sbg = spectrogram.subtract_bg() assert np.array_equal( spectrogram.subtract_bg()[:, 1800:].data, signal ) assert dict_eq(spectrogram._get_params(), sbg._get_params()) def test_auto_const_bg(): # The idea is to generate background and add a random signal, perform # background subtraction and see if the signal comes out again. x = np.linspace(0, 200, 200).astype(np.uint16) bg = x.reshape(200, 1) bg = bg + np.zeros((200, 3600)) signal = np.random.rand(200, 1800) * 255 signal = signal.astype(np.uint16) image = bg image[:, 1800:] += signal spectrogram = mk_spec(image) sbg = spectrogram.auto_const_bg() assert np.array_equal(sbg, x.reshape(200, 1)) def test_randomized_auto_const_bg(): # The idea is to generate background and add a random signal, perform # background subtraction and see if the signal comes out again. # As this is a Monte-Carlo probabilistic algorithm this test might # fail occasionally. x = np.linspace(0, 200, 200).astype(np.uint16) bg = x.reshape(200, 1) bg = bg + np.zeros((200, 3600)) signal = np.random.rand(200, 1800) * 255 signal = signal.astype(np.uint16) image = bg image[:, 1800:] += signal spectrogram = mk_spec(image) sbg = spectrogram.randomized_auto_const_bg(1500) assert np.array_equal(sbg, x.reshape(200, 1)) def test_slice_time_axis(): rnd = np.random.rand(200, 3600) spectrogram = mk_spec(rnd) new = spectrogram[:, 59:3599] assert new.shape == (200, 3600 - 59 - 1) assert new.t_init == 59 assert np.array_equal(new.time_axis, np.linspace(0, 3600 - 60 - 1, 3600 - 59 - 1) ) assert new.start == datetime(2010, 10, 10, 0, 0, 59) assert np.array_equal(new.data, rnd[:, 59:3599]) def test_slice_freq_axis(): rnd = np.random.rand(200, 3600) spectrogram = mk_spec(rnd) new = spectrogram[100:150, :] assert new.shape == (50, 3600) assert np.array_equal(new.freq_axis, np.linspace(100, 149, 50)) assert np.array_equal(new.data, rnd[100:150, :]) def test_slice_both_axis(): rnd = np.random.rand(200, 3600) spectrogram = mk_spec(rnd) new = spectrogram[100:, 59:] assert new.shape == (100, 3600 - 59) assert new.t_init == 59 assert np.array_equal(new.time_axis, np.linspace(0, 3600 - 60, 3600 - 59)) assert new.start == datetime(2010, 10, 10, 0, 0, 59) assert np.array_equal(new.freq_axis, np.linspace(100, 199, 100)) assert np.array_equal(new.data, rnd[100:, 59:]) def test_time_to_x(): image = np.zeros((200, 3600)) spectrogram = LinearTimeSpectrogram( image, np.linspace(0, image.shape[1] - 1, image.shape[1]), np.linspace(0, image.shape[0] - 1, image.shape[0]), datetime(2010, 10, 10), datetime(2010, 10, 10, 1), 0, 1 ) ret = spectrogram.time_to_x(datetime(2010, 10, 10, 0, 0, 59)) assert isinstance(ret, int) assert ret == 59 def test_time_to_x_nonlinear(): image = np.zeros((200, 3600)) spectrogram = Spectrogram( image, np.linspace(0, image.shape[1] - 1, image.shape[1]), np.linspace(0, image.shape[0] - 1, image.shape[0]), datetime(2010, 10, 10), datetime(2010, 10, 10, 1) ) ret = spectrogram.time_to_x(datetime(2010, 10, 10, 0, 0, 59)) assert isinstance(ret, int) assert ret == 59 def test_join(): image = np.random.rand(200, 3600) one = LinearTimeSpectrogram( image, np.linspace(0, 0.5 * (image.shape[1] - 1), image.shape[1]), np.linspace(0, image.shape[0] - 1, image.shape[0]), datetime(2010, 10, 10), datetime(2010, 10, 10, 0, 30), 0, 0.5, ) image = np.random.rand(200, 3600) other = LinearTimeSpectrogram( image, np.linspace(0, image.shape[1] - 1, image.shape[1]), np.linspace(0, image.shape[0] - 1, image.shape[0]), datetime(2010, 10, 10, 0, 29), datetime(2010, 10, 10, 1, 29), 1799, 1, ) z = LinearTimeSpectrogram.join_many( [one, other], nonlinear=False, maxgap=0 ) # The - 1 is because resampling other produces an image of size # 2 * 3600 - 1 # The - 2 is because there is one second overlap. assert z.shape == (200, 3 * 3600 - 2 - 1) assert np.array_equal(z.data[:, :3598], one.data[:, :-2]) # assert np.array_equal(z[:, 3598:], ndimage.zoom(other, (1, 2))) assert z.start == one.start assert z.end == other.end assert is_linear(z.time_axis) assert isinstance(z, LinearTimeSpectrogram) def test_join_dtype(): image = np.random.rand(200, 3600).astype(np.uint8) one = LinearTimeSpectrogram( image, np.linspace(0, 0.5 * (image.shape[1] - 1), image.shape[1]), np.linspace(0, image.shape[0] - 1, image.shape[0]), datetime(2010, 10, 10), datetime(2010, 10, 10, 0, 30), 0, 0.5, ) image = np.random.rand(200, 3600).astype(np.uint8) other = LinearTimeSpectrogram( image, np.linspace(0, image.shape[1] - 1, image.shape[1]), np.linspace(0, image.shape[0] - 1, image.shape[0]), datetime(2010, 10, 10, 0, 29), datetime(2010, 10, 10, 1, 29), 1799, 1, ) z = LinearTimeSpectrogram.join_many( [one, other], nonlinear=False, maxgap=0 ) assert z.dtype == np.dtype('uint8') def test_join_different_dtype(): image = np.random.rand(200, 3600).astype(np.uint16) one = LinearTimeSpectrogram( image, np.linspace(0, 0.5 * (image.shape[1] - 1), image.shape[1]), np.linspace(0, image.shape[0] - 1, image.shape[0]), datetime(2010, 10, 10), datetime(2010, 10, 10, 0, 30), 0, 0.5, ) image = np.random.rand(200, 3600).astype(np.uint8) other = LinearTimeSpectrogram( image, np.linspace(0, image.shape[1] - 1, image.shape[1]), np.linspace(0, image.shape[0] - 1, image.shape[0]), datetime(2010, 10, 10, 0, 29), datetime(2010, 10, 10, 1, 29), 1799, 1, ) z = LinearTimeSpectrogram.join_many( [one, other], nonlinear=False, maxgap=0 ) assert z.dtype == np.dtype('uint16') def test_join_midnight(): image = np.random.rand(200, 3600) one = LinearTimeSpectrogram( image, np.linspace(0, 0.5 * (image.shape[1] - 1), image.shape[1]), np.linspace(0, image.shape[0] - 1, image.shape[0]), datetime(2010, 10, 10, 23, 30), datetime(2010, 10, 10, 23, 59, 59), 84600, 0.5, ) image = np.random.rand(200, 3600) other = LinearTimeSpectrogram( image, np.linspace(0, image.shape[1] - 1, image.shape[1]), np.linspace(0, image.shape[0] - 1, image.shape[0]), datetime(2010, 10, 11, 0, 0), datetime(2010, 10, 11, 1), 0, 1, ) z = LinearTimeSpectrogram.join_many( [one, other], nonlinear=False, maxgap=0 ) # The - 1 is because resampling other produces an image of size # 2 * 3600 - 1 assert z.shape == (200, 3 * 3600 - 1) assert np.array_equal(z.data[:, :3600], one.data) assert is_linear(z.time_axis) assert isinstance(z, LinearTimeSpectrogram) def test_join_month(): image = np.random.rand(200, 3600) one = LinearTimeSpectrogram( image, np.linspace(0, 0.5 * (image.shape[1] - 1), image.shape[1]), np.linspace(0, image.shape[0] - 1, image.shape[0]), datetime(2012, 7, 31, 23, 30), datetime(2012, 7, 31, 23, 59, 59), 84600, 0.5, ) image = np.random.rand(200, 3600) other = LinearTimeSpectrogram( image, np.linspace(0, image.shape[1] - 1, image.shape[1]), np.linspace(0, image.shape[0] - 1, image.shape[0]), datetime(2012, 8, 1), datetime(2012, 8, 1, 1), 0, 1, ) z = LinearTimeSpectrogram.join_many( [one, other], nonlinear=False, maxgap=0 ) # The - 1 is because resampling other produces an image of size # 2 * 3600 - 1 assert z.shape == (200, 3 * 3600 - 1) assert np.array_equal(z.data[:, :3600], one.data) assert is_linear(z.time_axis) assert isinstance(z, LinearTimeSpectrogram) def test_join_year(): image = np.random.rand(200, 3600) one = LinearTimeSpectrogram( image, np.linspace(0, 0.5 * (image.shape[1] - 1), image.shape[1]), np.linspace(0, image.shape[0] - 1, image.shape[0]), datetime(2012, 12, 31, 23, 30), datetime(2013, 1, 1, 0, 0, 0), 84600, 0.5, ) image = np.random.rand(200, 3600) other = LinearTimeSpectrogram( image, np.linspace(0, image.shape[1] - 1, image.shape[1]), np.linspace(0, image.shape[0] - 1, image.shape[0]), datetime(2013, 1, 1), datetime(2013, 1, 1, 1), 0, 1, ) z = LinearTimeSpectrogram.join_many( [one, other], nonlinear=False, maxgap=0 ) # The - 1 is because resampling other produces an image of size # 2 * 3600 - 1 assert z.shape == (200, 3 * 3600 - 1) assert np.array_equal(z.data[:, :3600], one.data) assert is_linear(z.time_axis) assert isinstance(z, LinearTimeSpectrogram) def test_join_over_midnight(): image = np.random.rand(200, 3600) one = LinearTimeSpectrogram( image, np.linspace(0, 0.5 * (image.shape[1] - 1), image.shape[1]), np.linspace(0, image.shape[0] - 1, image.shape[0]), datetime(2010, 10, 10, 23, 45), datetime(2010, 10, 11, 0, 15,), 85500, 0.5, ) image = np.random.rand(200, 3600) other = LinearTimeSpectrogram( image, np.linspace(0, image.shape[1] - 1, image.shape[1]), np.linspace(0, image.shape[0] - 1, image.shape[0]), datetime(2010, 10, 11, 0, 15), datetime(2010, 10, 11, 1, 15), 900, 1, ) z = LinearTimeSpectrogram.join_many( [one, other], nonlinear=False, maxgap=0 ) # FIXME: not used?! oz = other.resample_time(0.5) # The - 1 is because resampling other produces an image of size # 2 * 3600 - 1 assert z.shape == (200, 3 * 3600 - 1) assert np.array_equal(z.data[:, :3600], one.data) assert np.array_equal(z.time_axis[:3600], one.time_axis) assert is_linear(z.time_axis) assert isinstance(z, LinearTimeSpectrogram) def test_join_gap(): image = np.random.rand(200, 3600) one = LinearTimeSpectrogram( image, np.linspace(0, 0.5 * (image.shape[1] - 1), image.shape[1]), np.linspace(0, image.shape[0] - 1, image.shape[0]), datetime(2010, 10, 10, 23, 45), datetime(2010, 10, 11, 0, 15,), 85500, 0.5, ) image = np.random.rand(200, 3600) other = LinearTimeSpectrogram( image, np.linspace(0, image.shape[1] - 1, image.shape[1]), np.linspace(0, image.shape[0] - 1, image.shape[0]), datetime(2010, 10, 11, 0, 15, 1), datetime(2010, 10, 11, 1, 15), 901, 1, ) with pytest.raises(ValueError) as excinfo: LinearTimeSpectrogram.join_many( [one, other], nonlinear=False, maxgap=0 ) assert excinfo.value.message == "Too large gap." def test_join_with_gap(): image = np.random.rand(200, 3600) one = LinearTimeSpectrogram( image, np.linspace(0, 0.5 * (image.shape[1] - 1), image.shape[1]), np.linspace(0, image.shape[0] - 1, image.shape[0]), datetime(2010, 10, 10, 23, 45), datetime(2010, 10, 11, 0, 15,), 85500, 0.5, ) image = np.random.rand(200, 3600) other = LinearTimeSpectrogram( image, np.linspace(0, image.shape[1] - 1, image.shape[1]), np.linspace(0, image.shape[0] - 1, image.shape[0]), datetime(2010, 10, 11, 0, 15), datetime(2010, 10, 11, 1, 15), 901, 1, ) z = LinearTimeSpectrogram.join_many( [one, other], nonlinear=False, maxgap=1, fill=0 ) # The - 1 is because resampling other produces an image of size # 2 * 3600 - 1 # The + 2 is because there is one second without data inserted. assert z.shape == (200, 3 * 3600 + 2 - 1) assert np.array_equal(z.data[:, :3600], one.data) # Second data to unpack masked array assert (z.data.data[:, 3600:3602] == 0).all() assert is_linear(z.time_axis) assert isinstance(z, LinearTimeSpectrogram) def test_join_with_gap_fill(): image = np.random.rand(200, 3600) one = LinearTimeSpectrogram( image, np.linspace(0, 0.5 * (image.shape[1] - 1), image.shape[1]), np.linspace(0, image.shape[0] - 1, image.shape[0]), datetime(2010, 10, 10, 23, 45), datetime(2010, 10, 11, 0, 15,), 85500, 0.5, ) image = np.random.rand(200, 3600) other = LinearTimeSpectrogram( image, np.linspace(0, image.shape[1] - 1, image.shape[1]), np.linspace(0, image.shape[0] - 1, image.shape[0]), datetime(2010, 10, 11, 0, 15), datetime(2010, 10, 11, 1, 15), 901, 1, ) z = LinearTimeSpectrogram.join_many( [one, other], nonlinear=False, maxgap=2, fill=np.NaN ) # The - 1 is because resampling other produces an image of size # 2 * 3600 - 1 # The + 2 is because there is one second without data inserted. assert z.shape == (200, 3 * 3600 + 2 - 1) assert np.array_equal(z.data[:, :3600], one.data) print(type(z.data)) # Second data to unpack masked array assert np.isnan(z.data.data[:, 3600:3602]).all() assert is_linear(z.time_axis) assert isinstance(z, LinearTimeSpectrogram) def test_join_nonlinear(): image = np.random.rand(200, 3600) one = LinearTimeSpectrogram( image, np.linspace(0, 0.5 * (image.shape[1] - 1), image.shape[1]), np.linspace(0, image.shape[0] - 1, image.shape[0]), datetime(2010, 10, 10, 23, 45), datetime(2010, 10, 11, 0, 15,), 85500, 0.5, ) image = np.random.rand(200, 3600) other = LinearTimeSpectrogram( image, np.linspace(0, image.shape[1] - 1, image.shape[1]), np.linspace(0, image.shape[0] - 1, image.shape[0]), datetime(2010, 10, 11, 0, 15), datetime(2010, 10, 11, 1, 15), 901, 1, ) oz = other.resample_time(0.5) z = LinearTimeSpectrogram.join_many( [one, other], nonlinear=True, maxgap=2 ) # The - 1 is because resampling other produces an image of size # 2 * 3600 - 1 assert z.shape == (200, 3 * 3600 - 1) assert np.array_equal(z.data[:, :3600], one.data) assert np.array_equal(z.time_axis[:3600], one.time_axis) assert np.array_equal(z.time_axis[3600:], oz.time_axis + 1801) assert isinstance(z, Spectrogram) def test_auto_t_init(): image = np.random.rand(200, 3600) assert Spectrogram(image, np.linspace(0, image.shape[1] - 1, image.shape[1]), np.linspace(0, image.shape[0] - 1, image.shape[0]), datetime(2010, 1, 1, 0, 15), datetime(2010, 1, 1, 0, 30) ).t_init == 900 def test_rescale(): image = np.random.rand(200, 3600) * 43 spec = Spectrogram(image, np.linspace(0, image.shape[1] - 1, image.shape[1]), np.linspace(0, image.shape[0] - 1, image.shape[0]), datetime(2010, 1, 1, 0, 15), datetime(2010, 1, 1, 0, 30) ) nspec = spec.rescale() assert dict_eq(spec._get_params(), nspec._get_params()) assert_array_almost_equal(nspec.data.max(), 1) assert nspec.data.min() == 0 def test_rescale_error(): image = np.zeros((200, 3600)) spec = Spectrogram(image, np.linspace(0, image.shape[1] - 1, image.shape[1]), np.linspace(0, image.shape[0] - 1, image.shape[0]), datetime(2010, 1, 1, 0, 15), datetime(2010, 1, 1, 0, 30) ) with pytest.raises(ValueError) as excinfo: spec.rescale(0, 1) assert ( excinfo.value.message == "Spectrogram needs to contain distinct values.") def test_rescale_error2(): image = np.random.rand(200, 3600) * 43 spec = Spectrogram(image, np.linspace(0, image.shape[1] - 1, image.shape[1]), np.linspace(0, image.shape[0] - 1, image.shape[0]), datetime(2010, 1, 1, 0, 15), datetime(2010, 1, 1, 0, 30) ) with pytest.raises(ValueError) as excinfo: spec.rescale(1, 1) assert (excinfo.value.message == "Maximum and minimum must be different.") def test_resample(): image = np.array([[0, 1, 2], [0, 1, 2]]) spec = LinearTimeSpectrogram( image, np.array([0, 1, 2]), np.array([0]), datetime(2012, 1, 1), datetime(2012, 1, 1, 0, 0, 3), 0, 1 ) r = spec.resample_time(0.5) assert r.shape[1] == 5 assert np.array_equal(r.time_axis, np.linspace(0, 2, 5)) def test_upsample(): image = np.array([[0, 1, 2, 3], [0, 1, 2, 3]]) spec = LinearTimeSpectrogram( image, np.array([0, 1, 2]), np.array([0]), datetime(2012, 1, 1), datetime(2012, 1, 1, 0, 0, 3), 0, 1 ) r = spec.resample_time(2) assert r.shape[1] == 2 def test_combine_freqs(): image = np.random.rand(5, 3600) spec = LinearTimeSpectrogram(image, np.linspace(0, image.shape[1] - 1, image.shape[1]), np.array([8, 6, 4, 2, 0]), datetime(2010, 1, 1, 0, 15), datetime(2010, 1, 1, 0, 30), 900, 0.25 ) image = np.random.rand(5, 3600) spec2 = LinearTimeSpectrogram(image, np.linspace(0, image.shape[1] - 1, image.shape[1]), np.array([9, 7, 5, 3, 1]), datetime(2010, 1, 1, 0, 15), datetime(2010, 1, 1, 0, 30), 900, 0.25 ) comb = LinearTimeSpectrogram.combine_frequencies([spec, spec2]) stuff = [spec, spec2] # print comb for freq in range(10): assert np.array_equal( comb[9 - freq, :], stuff[freq % 2][4 - freq // 2, :] ) def test_join_diff_freq(): image = np.random.rand(5, 3600) spec = LinearTimeSpectrogram(image, np.linspace(0, 0.25 * (image.shape[1] - 1), image.shape[1]), np.array([8, 6, 4, 2, 0]), datetime(2010, 1, 1, 0, 15), datetime(2010, 1, 1, 0, 30), 900, 0.25 ) image = np.random.rand(5, 3600) spec2 = LinearTimeSpectrogram(image, np.linspace(0, 0.25 * (image.shape[1] - 1), image.shape[1]), np.array([9, 7, 5, 3, 1]), datetime(2010, 1, 1, 0, 15), datetime(2010, 1, 1, 0, 30), 1800, 0.25 ) with pytest.raises(ValueError) as excinfo: LinearTimeSpectrogram.join_many([spec, spec2]) assert excinfo.value.message == "Frequency channels do not match." def test_intersect_time(): image = np.random.rand(5, 3600) spec = LinearTimeSpectrogram(image, np.linspace(0, 0.25 * (image.shape[1] - 1), image.shape[1]), np.array([8, 6, 4, 2, 0]), datetime(2010, 1, 1, 0, 15), datetime(2010, 1, 1, 0, 30), 900, 0.25 ) image = np.random.rand(5, 3600) spec2 = LinearTimeSpectrogram(image, np.linspace(0, 0.25 * (image.shape[1] - 1), image.shape[1]), np.array([9, 7, 5, 3, 1]), datetime(2010, 1, 1, 0, 15), datetime(2010, 1, 1, 0, 30), 901, 0.25 ) one, other = LinearTimeSpectrogram.intersect_time( [spec, spec2] ) assert one.shape[1] == other.shape[1] assert one.shape[1] == 3596 assert np.array_equal(one.data, spec.data[:, 4:]) assert np.array_equal(other.data, spec2.data[:, :-4]) assert np.array_equal(one.time_axis, other.time_axis) assert one.t_init == other.t_init assert is_linear(one.time_axis) assert is_linear(other.time_axis) def test_check_linearity(): image = np.random.rand(5, 3600) spec = LinearTimeSpectrogram(image, np.linspace(0, 0.25 * (image.shape[1] - 1), image.shape[1]), np.array([8, 6, 4, 2, 0]), datetime(2010, 1, 1, 0, 15), datetime(2010, 1, 1, 0, 30), 900, 0.25 ) assert spec.check_linearity() spec.time_axis[1] += 0.1 assert not spec.check_linearity() assert spec.check_linearity(0.1) spec.time_axis[1] -= 0.1 # The average stays (almost) the same because there are 3600 items. spec.time_axis[1] += 0.2 * 0.25 assert spec.check_linearity(None, 0.2) def test_flatten(): flat = np.arange(5 * 3600) image = flat.reshape(5, 3600) spec = LinearTimeSpectrogram(image, np.linspace(0, 0.25 * (image.shape[1] - 1), image.shape[1]), np.array([8, 6, 4, 2, 0]), datetime(2010, 1, 1, 0, 15), datetime(2010, 1, 1, 0, 30), 900, 0.25 ) assert np.array_equal(flat, spec.data.flatten()) def test_in_interval(): image = np.random.rand(5, 900) spec = LinearTimeSpectrogram(image, np.linspace(0, 1 * (image.shape[1] - 1), image.shape[1]), np.array([8, 6, 4, 2, 0]), datetime(2010, 1, 1, 0, 15), datetime(2010, 1, 1, 0, 30), 900, 1 ) assert np.array_equal(spec.in_interval("00:15", "00:30").data, spec.data) def test_in_interval2(): image = np.random.rand(5, 900) spec = LinearTimeSpectrogram(image, np.linspace(0, 1 * (image.shape[1] - 1), image.shape[1]), np.array([8, 6, 4, 2, 0]), datetime(2010, 1, 1, 0, 15), datetime(2010, 1, 1, 0, 30), 900, 1 ) assert np.array_equal( spec.in_interval("2010-01-01T00:15:00", "00:30").data, spec.data ) def test_linearize(): image = np.random.rand(5, 900) spec = LinearTimeSpectrogram(image, np.linspace(0, 1 * (image.shape[1] - 1), image.shape[1]), np.array([20, 10, 5, 0]), datetime(2010, 1, 1, 0, 15), datetime(2010, 1, 1, 0, 30), 900, 1 ) # 0 1 2 3 4 5 6 7 8 # -------- ----------- ----- --- # 20 17.5 15 12.5 10 7.5 5 2.5 0 linear = spec.linearize_freqs() assert ((linear.freq_axis[:-1] - linear.freq_axis[1:]) == 2.5).all() assert (linear[0] == image[0, :]).all() assert (linear[1] == image[0, :]).all() assert (linear[2] == image[0, :]).all() assert (linear[3] == image[1, :]).all() assert (linear[4] == image[1, :]).all() assert (linear[5] == image[1, :]).all() assert (linear[6] == image[2, :]).all() assert (linear[7] == image[2, :]).all() assert (linear[8] == image[3, :]).all() def test_linear_view(): image = np.random.rand(5, 900) spec = LinearTimeSpectrogram(image, np.linspace(0, 1 * (image.shape[1] - 1), image.shape[1]), np.array([20, 10, 5, 0]), datetime(2010, 1, 1, 0, 15), datetime(2010, 1, 1, 0, 30), 900, 1 ) linear = _LinearView(spec) # assert ((linear.freq_axis[:-1] - linear.freq_axis[1:]) == 2.5).all() assert (linear[0] == image[0, :]).all() assert (linear[1] == image[0, :]).all() assert (linear[2] == image[0, :]).all() assert (linear[3] == image[1, :]).all() assert (linear[4] == image[1, :]).all() assert (linear[5] == image[1, :]).all() assert (linear[6] == image[2, :]).all() assert (linear[7] == image[2, :]).all() assert (linear[8] == image[3, :]).all() def test_linear_view_indexerror(): image = np.random.rand(5, 900) spec = LinearTimeSpectrogram(image, np.linspace(0, 1 * (image.shape[1] - 1), image.shape[1]), np.array([20, 10, 5, 0]), datetime(2010, 1, 1, 0, 15), datetime(2010, 1, 1, 0, 30), 900, 1 ) linear = _LinearView(spec) # assert ((linear.freq_axis[:-1] - linear.freq_axis[1:]) == 2.5).all() with pytest.raises(IndexError): linear[9] def test_linear_view_negative(): image = np.random.rand(5, 900) spec = LinearTimeSpectrogram(image, np.linspace(0, 1 * (image.shape[1] - 1), image.shape[1]), np.array([20, 10, 5, 0]), datetime(2010, 1, 1, 0, 15), datetime(2010, 1, 1, 0, 30), 900, 1 ) linear = _LinearView(spec) # assert ((linear.freq_axis[:-1] - linear.freq_axis[1:]) == 2.5).all() assert (linear[8] == image[3, :]).all() assert (linear[-1] == image[3, :]).all() def test_linear_view_freqs(): image = np.random.rand(5, 900) spec = LinearTimeSpectrogram(image, np.linspace(0, 1 * (image.shape[1] - 1), image.shape[1]), np.array([20, 10, 5, 0]), datetime(2010, 1, 1, 0, 15), datetime(2010, 1, 1, 0, 30), 900, 1 ) linear = _LinearView(spec) # assert ((linear.freq_axis[:-1] - linear.freq_axis[1:]) == 2.5).all() assert linear.get_freq(0) == 20 assert linear.get_freq(1) == 20 assert linear.get_freq(2) == 20 assert linear.get_freq(3) == 10 assert linear.get_freq(4) == 10 assert linear.get_freq(5) == 10 assert linear.get_freq(6) == 5 assert linear.get_freq(7) == 5 assert linear.get_freq(8) == 0 sunpy-0.8.3/sunpy/spectra/__init__.py0000644000175000017500000000060513231613140020017 0ustar nabilnabil00000000000000import warnings from sunpy.util.exceptions import SunpyDeprecationWarning deprecation_message = ("As of v0.8.0, the `sunpy.spectra` module is deprecated and will be " "removed in a future version. This module is being moved to sunpyspectra " "- https://github.com/sunpy/spectra") warnings.warn( deprecation_message, SunpyDeprecationWarning) sunpy-0.8.3/sunpy/spectra/spectrogram.py0000644000175000017500000012341413231613140020612 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- # Author: Florian Mayer """Classes for spectral analysis.""" from __future__ import division, print_function, absolute_import import datetime from random import randint from copy import copy from math import floor import numpy as np from numpy import ma from scipy import ndimage from matplotlib import pyplot as plt from matplotlib.figure import Figure from matplotlib.ticker import FuncFormatter, MaxNLocator, IndexLocator from matplotlib.colorbar import Colorbar from sunpy.time import parse_time, get_day from sunpy.util import to_signed, common_base, merge from sunpy.util.cond_dispatch import ConditionalDispatch from sunpy.util.create import Parent from sunpy.spectra.spectrum import Spectrum from sunpy.extern.six.moves import zip, range from sunpy.util.decorators import deprecated __all__ = ['Spectrogram', 'LinearTimeSpectrogram'] # 1080 because that usually is the maximum vertical pixel count on modern # screens nowadays (2012). DEFAULT_YRES = 1080 # This should not be necessary, as observations do not take more than a day # but it is used for completeness' and extendibility's sake. # XXX: Leap second? SECONDS_PER_DAY = 86400 # Used for COPY_PROPERTIES REFERENCE = 0 COPY = 1 DEEPCOPY = 2 def figure(*args, **kwargs): """Returns a new SpectroFigure, a figure extended with features useful for analysis of spectrograms. Compare pyplot.figure.""" kw = { 'FigureClass': SpectroFigure, } kw.update(kwargs) return plt.figure(*args, **kw) def _min_delt(arr): deltas = (arr[:-1] - arr[1:]) # Multiple values at the same frequency are just thrown away # in the process of linearizaion return deltas[deltas != 0].min() def _list_formatter(lst, fun=None): """Returns a function that takes x, pos and returns fun(lst[x]) if fun is not None, else lst[x] or "" if x is out of range. """ def _fun(x, pos): x = int(x) if x >= len(lst) or x < 0: return "" elem = lst[x] if fun is None: return elem return fun(elem) return _fun def _union(sets): """Returns a union of sets.""" union = set() for s in sets: union |= s return union class _LinearView(object): """Helper class for frequency channel linearization. Attributes ---------- arr : Spectrogram Spectrogram to linearize. delt : float Delta between frequency channels in linearized spectrogram. Defaults to (minimum delta / 2.) because of the Shannon sampling theorem. """ def __init__(self, arr, delt=None): self.arr = arr if delt is None: # Nyquist–Shannon sampling theorem delt = _min_delt(arr.freq_axis) / 2. self.delt = delt midpoints = (self.arr.freq_axis[:-1] + self.arr.freq_axis[1:]) / 2 self.midpoints = np.concatenate([midpoints, arr.freq_axis[-1:]]) self.max_mp_delt = np.min(self.midpoints[1:] - self.midpoints[:-1]) self.freq_axis = np.arange( self.arr.freq_axis[0], self.arr.freq_axis[-1], -self.delt ) self.time_axis = self.arr.time_axis self.shape = (len(self), arr.data.shape[1]) def __len__(self): return int(1 + (self.arr.freq_axis[0] - self.arr.freq_axis[-1]) / self.delt) def _find(self, arr, item): if item < 0: item = item % len(self) if item >= len(self): raise IndexError freq_offset = item * self.delt freq = self.arr.freq_axis[0] - freq_offset # The idea is that when we take the biggest delta in the mid points, # we do not have to search anything that is between the beginning and # the first item that can possibly be that frequency. min_mid = int(max(0, (freq - self.midpoints[0]) // self.max_mp_delt)) for n, mid in enumerate(self.midpoints[min_mid:]): if mid <= freq: return arr[min_mid + n] return arr[min_mid + n] def __getitem__(self, item): return self._find(self.arr, item) def get_freq(self, item): return self._find(self.arr.freq_axis, item) def make_mask(self, max_dist): mask = np.zeros(self.shape, dtype=np.bool) for n, item in enumerate(range(len(self))): freq = self.arr.freq_axis[0] - item * self.delt if abs(self.get_freq(item) - freq) > max_dist: mask[n, :] = True return mask class SpectroFigure(Figure): def _init(self, data, freqs): self.data = data self.freqs = freqs def ginput_to_time(self, inp): return [ self.data.start + datetime.timedelta(seconds=secs) for secs in self.ginput_to_time_secs(inp) ] def ginput_to_time_secs(self, inp): return np.array([float(self.data.time_axis[x]) for x, y in inp]) def ginput_to_time_offset(self, inp): v = self.ginput_to_time_secs(inp) return v - v.min() def ginput_to_freq(self, inp): return np.array([self.freqs[y] for x, y in inp]) def time_freq(self, points=0): inp = self.ginput(points) min_ = self.ginput_to_time_secs(inp).min() start = self.data.start + datetime.timedelta(seconds=min_) return TimeFreq( start, self.ginput_to_time_offset(inp), self.ginput_to_freq(inp) ) class TimeFreq(object): """Class to use for plotting frequency vs time. Attributes ---------- start : `datetime.datetime` Start time of the plot. time : `~numpy.ndarray` Time of the data points as offset from start in seconds. freq : `~numpy.ndarray` Frequency of the data points in MHz. """ def __init__(self, start, time, freq): self.start = start self.time = time self.freq = freq def plot(self, time_fmt="%H:%M:%S", **kwargs): """ Plot the spectrum. Parameters ---------- time_fmt : str The time format in a `~datetime.datetime` compatible format **kwargs : dict Any additional plot arguments that should be used when plotting. Returns ------- fig : `~matplotlib.Figure` A plot figure. """ figure = plt.gcf() axes = figure.add_subplot(111) axes.plot(self.time, self.freq, **kwargs) xa = axes.get_xaxis() # FIXME: ``ya`` is not used? ya = axes.get_yaxis() xa.set_major_formatter( FuncFormatter( lambda x, pos: ( self.start + datetime.timedelta(seconds=x) ).strftime(time_fmt) ) ) axes.set_xlabel("Time [UT]") axes.set_ylabel("Frequency [MHz]") xa = axes.get_xaxis() for tl in xa.get_ticklabels(): tl.set_fontsize(10) tl.set_rotation(30) figure.add_axes(axes) figure.subplots_adjust(bottom=0.2) figure.subplots_adjust(left=0.2) return figure def peek(self, *args, **kwargs): """ Plot spectrum onto current axes. Parameters ---------- *args : dict **kwargs : dict Any additional plot arguments that should be used when plotting. Returns ------- fig : `~matplotlib.Figure` A plot figure. """ plt.figure() ret = self.plot(*args, **kwargs) plt.show() return ret @deprecated("0.8", "this module is being moved to sunpyspectra - https://github.com/sunpy/spectra") class Spectrogram(Parent): """ Spectrogram Class. .. warning:: This module is under development! Use at your own risk. Attributes ---------- data : `~numpy.ndarray` two-dimensional array of the image data of the spectrogram. time_axis : `~numpy.ndarray` one-dimensional array containing the offset from the start for each column of data. freq_axis : `~numpy.ndarray` one-dimensional array containing information about the frequencies each row of the image corresponds to. start : `~datetime.datetime` starting time of the measurement end : `~datetime.datetime` end time of the measurement t_init : int offset from the start of the day the measurement began. If None gets automatically set from start. t_label : str label for the time axis f_label : str label for the frequency axis content : str header for the image instruments : str array instruments that recorded the data, may be more than one if it was constructed using combine_frequencies or join_many. """ # Contrary to what pylint may think, this is not an old-style class. # pylint: disable=E1002,W0142,R0902 # This needs to list all attributes that need to be # copied to maintain the object and how to handle them. COPY_PROPERTIES = [ ('time_axis', COPY), ('freq_axis', COPY), ('instruments', COPY), ('start', REFERENCE), ('end', REFERENCE), ('t_label', REFERENCE), ('f_label', REFERENCE), ('content', REFERENCE), ('t_init', REFERENCE), ] _create = ConditionalDispatch.from_existing(Parent._create) @property def shape(self): return self.data.shape @property def dtype(self): return self.data.dtype def _get_params(self): """Implementation detail.""" return dict( (name, getattr(self, name)) for name, _ in self.COPY_PROPERTIES ) def _slice(self, y_range, x_range): """Return new spectrogram reduced to the values passed as slices. Implementation detail.""" data = self.data[y_range, x_range] params = self._get_params() soffset = 0 if x_range.start is None else x_range.start soffset = int(soffset) eoffset = self.shape[1] if x_range.stop is None else x_range.stop # pylint: disable=E1101 eoffset -= 1 eoffset = int(eoffset) # FIXME: `fsoffset` and `feoffset` are not used?! fsoffset = 0 if y_range.start is None else y_range.start feoffset = self.shape[0] if y_range.stop is None else y_range.stop # pylint: disable=E1101 feoffset = int(feoffset) params.update({ 'time_axis': self.time_axis[ x_range.start:x_range.stop:x_range.step ] - self.time_axis[soffset], 'freq_axis': self.freq_axis[ y_range.start:y_range.stop:y_range.step], 'start': self.start + datetime.timedelta( seconds=self.time_axis[soffset]), 'end': self.start + datetime.timedelta( seconds=self.time_axis[eoffset]), 't_init': self.t_init + self.time_axis[soffset], }) return self.__class__(data, **params) def _with_data(self, data): new = copy(self) new.data = data return new def __init__(self, data, time_axis, freq_axis, start, end, t_init=None, t_label="Time", f_label="Frequency", content="", instruments=None): # Because of how object creation works, there is no avoiding # unused arguments in this case. self.data = data if t_init is None: diff = start - get_day(start) t_init = diff.seconds if instruments is None: instruments = set() self.start = start self.end = end self.t_label = t_label self.f_label = f_label self.t_init = t_init self.time_axis = time_axis self.freq_axis = freq_axis self.content = content self.instruments = instruments def time_formatter(self, x, pos): """This returns the label for the tick of value x at a specified pos on the time axis.""" # Callback, cannot avoid unused arguments. # pylint: disable=W0613 x = int(x) if x >= len(self.time_axis) or x < 0: return "" return self.format_time( self.start + datetime.timedelta( seconds=float(self.time_axis[x]) ) ) @staticmethod def format_time(time): """Override to configure default plotting.""" return time.strftime("%H:%M:%S") @staticmethod def format_freq(freq): """Override to configure default plotting.""" return "{freq:0.1f}".format(freq=freq) def peek(self, *args, **kwargs): """ Plot spectrum onto current axes. Parameters ---------- *args : dict **kwargs : dict Any additional plot arguments that should be used when plotting. Returns ------- fig : `~matplotlib.Figure` A plot figure. """ figure() ret = self.plot(*args, **kwargs) plt.show() return ret def plot(self, figure=None, overlays=[], colorbar=True, vmin=None, vmax=None, linear=True, showz=True, yres=DEFAULT_YRES, max_dist=None, **matplotlib_args): """ Plot spectrogram onto figure. Parameters ---------- figure : `~matplotlib.Figure` Figure to plot the spectrogram on. If None, new Figure is created. overlays : list List of overlays (functions that receive figure and axes and return new ones) to be applied after drawing. colorbar : bool Flag that determines whether or not to draw a colorbar. If existing figure is passed, it is attempted to overdraw old colorbar. vmin : float Clip intensities lower than vmin before drawing. vmax : float Clip intensities higher than vmax before drawing. linear : bool If set to True, "stretch" image to make frequency axis linear. showz : bool If set to True, the value of the pixel that is hovered with the mouse is shown in the bottom right corner. yres : int or None To be used in combination with linear=True. If None, sample the image with half the minimum frequency delta. Else, sample the image to be at most yres pixels in vertical dimension. Defaults to 1080 because that's a common screen size. max_dist : float or None If not None, mask elements that are further than max_dist away from actual data points (ie, frequencies that actually have data from the receiver and are not just nearest-neighbour interpolated). """ # [] as default argument is okay here because it is only read. # pylint: disable=W0102,R0914 if linear: delt = yres if delt is not None: delt = max( (self.freq_axis[0] - self.freq_axis[-1]) / (yres - 1), _min_delt(self.freq_axis) / 2. ) delt = float(delt) data = _LinearView(self.clip_values(vmin, vmax), delt) freqs = np.arange( self.freq_axis[0], self.freq_axis[-1], -data.delt ) else: data = np.array(self.clip_values(vmin, vmax)) freqs = self.freq_axis figure = plt.gcf() if figure.axes: axes = figure.axes[0] else: axes = figure.add_subplot(111) params = { 'origin': 'lower', 'aspect': 'auto', } params.update(matplotlib_args) if linear and max_dist is not None: toplot = ma.masked_array(data, mask=data.make_mask(max_dist)) pass else: toplot = data im = axes.imshow(toplot, **params) xa = axes.get_xaxis() ya = axes.get_yaxis() xa.set_major_formatter( FuncFormatter(self.time_formatter) ) if linear: # Start with a number that is divisible by 5. init = (self.freq_axis[0] % 5) / data.delt nticks = 15. # Calculate MHz difference between major ticks. dist = (self.freq_axis[0] - self.freq_axis[-1]) / nticks # Round to next multiple of 10, at least ten. dist = max(round(dist, -1), 10) # One pixel in image space is data.delt MHz, thus we can convert # our distance between the major ticks into image space by dividing # it by data.delt. ya.set_major_locator( IndexLocator( dist / data.delt, init ) ) ya.set_minor_locator( IndexLocator( dist / data.delt / 10, init ) ) def freq_fmt(x, pos): # This is necessary because matplotlib somehow tries to get # the mid-point of the row, which we do not need here. x = x + 0.5 return self.format_freq(self.freq_axis[0] - x * data.delt) else: freq_fmt = _list_formatter(freqs, self.format_freq) ya.set_major_locator(MaxNLocator(integer=True, steps=[1, 5, 10])) ya.set_major_formatter( FuncFormatter(freq_fmt) ) axes.set_xlabel(self.t_label) axes.set_ylabel(self.f_label) # figure.suptitle(self.content) figure.suptitle( ' '.join([ get_day(self.start).strftime("%d %b %Y"), 'Radio flux density', '(' + ', '.join(self.instruments) + ')', ]) ) for tl in xa.get_ticklabels(): tl.set_fontsize(10) tl.set_rotation(30) figure.add_axes(axes) figure.subplots_adjust(bottom=0.2) figure.subplots_adjust(left=0.2) if showz: axes.format_coord = self._mk_format_coord( data, figure.gca().format_coord) if colorbar: if len(figure.axes) > 1: Colorbar(figure.axes[1], im).set_label("Intensity") else: figure.colorbar(im).set_label("Intensity") for overlay in overlays: figure, axes = overlay(figure, axes) for ax in figure.axes: ax.autoscale() if isinstance(figure, SpectroFigure): figure._init(self, freqs) return axes def __getitem__(self, key): only_y = not isinstance(key, tuple) if only_y: return self.data[int(key)] elif isinstance(key[0], slice) and isinstance(key[1], slice): return self._slice(key[0], key[1]) elif isinstance(key[1], slice): # return Spectrum( # XXX: Right class # super(Spectrogram, self).__getitem__(key), # self.time_axis[key[1].start:key[1].stop:key[1].step] # ) return np.array(self.data[key]) elif isinstance(key[0], slice): return Spectrum( self.data[key], self.freq_axis[key[0].start:key[0].stop:key[0].step] ) return self.data[int(key)] def clip_freq(self, vmin=None, vmax=None): """Return a new spectrogram only consisting of frequencies in the interval [vmin, vmax]. Parameters ---------- vmin : float All frequencies in the result are greater or equal to this. vmax : float All frequencies in the result are smaller or equal to this. """ left = 0 if vmax is not None: while self.freq_axis[left] > vmax: left += 1 right = len(self.freq_axis) - 1 if vmin is not None: while self.freq_axis[right] < vmin: right -= 1 return self[left:right + 1, :] def auto_find_background(self, amount=0.05): """Automatically find the background. This is done by first subtracting the average value in each channel and then finding those times which have the lowest standard deviation. Parameters ---------- amount : float The percent amount (out of 1) of lowest standard deviation to consider. """ # pylint: disable=E1101,E1103 data = self.data.astype(to_signed(self.dtype)) # Subtract average value from every frequency channel. tmp = (data - np.average(self.data, 1).reshape(self.shape[0], 1)) # Get standard deviation at every point of time. # Need to convert because otherwise this class's __getitem__ # is used which assumes two-dimensionality. sdevs = np.asarray(np.std(tmp, 0)) # Get indices of values with lowest standard deviation. cand = sorted(range(self.shape[1]), key=lambda y: sdevs[y]) # Only consider the best 5 %. return cand[:max(1, int(amount * len(cand)))] def auto_const_bg(self): """Automatically determine background.""" realcand = self.auto_find_background() bg = np.average(self.data[:, realcand], 1) return bg.reshape(self.shape[0], 1) def subtract_bg(self): """Perform constant background subtraction.""" return self._with_data(self.data - self.auto_const_bg()) def randomized_auto_const_bg(self, amount): """Automatically determine background. Only consider a randomly chosen subset of the image. Parameters ---------- amount : int Size of random sample that is considered for calculation of the background. """ cols = [randint(0, self.shape[1] - 1) for _ in range(amount)] # pylint: disable=E1101,E1103 data = self.data.astype(to_signed(self.dtype)) # Subtract average value from every frequency channel. tmp = (data - np.average(self.data, 1).reshape(self.shape[0], 1)) # Get standard deviation at every point of time. # Need to convert because otherwise this class's __getitem__ # is used which assumes two-dimensionality. tmp = tmp[:, cols] sdevs = np.asarray(np.std(tmp, 0)) # Get indices of values with lowest standard deviation. cand = sorted(range(amount), key=lambda y: sdevs[y]) # Only consider the best 5 %. realcand = cand[:max(1, int(0.05 * len(cand)))] # Average the best 5 % bg = np.average(self[:, [cols[r] for r in realcand]], 1) return bg.reshape(self.shape[0], 1) def randomized_subtract_bg(self, amount): """Perform randomized constant background subtraction. Does not produce the same result every time it is run. Parameters ---------- amount : int Size of random sample that is considered for calculation of the background. """ return self._with_data(self.data - self.randomized_auto_const_bg(amount)) def clip_values(self, vmin=None, vmax=None, out=None): """ Clip intensities to be in the interval [vmin, vmax]. Any values greater than the maximum will be assigned the maximum, any values lower than the minimum will be assigned the minimum. If either is left out or None, do not clip at that side of the interval. Parameters ---------- min : int or float New minimum value for intensities. max : int or float New maximum value for intensities """ # pylint: disable=E1101 if vmin is None: vmin = int(self.data.min()) if vmax is None: vmax = int(self.data.max()) return self._with_data(self.data.clip(vmin, vmax, out)) def rescale(self, vmin=0, vmax=1, dtype=np.dtype('float32')): """ Rescale intensities to [vmin, vmax]. Note that vmin ≠ vmax and spectrogram.min() ≠ spectrogram.max(). Parameters ---------- vmin : float or int New minimum value in the resulting spectrogram. vmax : float or int New maximum value in the resulting spectrogram. dtype : `numpy.dtype` Data-type of the resulting spectrogram. """ if vmax == vmin: raise ValueError("Maximum and minimum must be different.") if self.data.max() == self.data.min(): raise ValueError("Spectrogram needs to contain distinct values.") data = self.data.astype(dtype) # pylint: disable=E1101 return self._with_data( vmin + (vmax - vmin) * (data - self.data.min()) / # pylint: disable=E1101 (self.data.max() - self.data.min()) # pylint: disable=E1101 ) def interpolate(self, frequency): """ Linearly interpolate intensity at unknown frequency using linear interpolation of its two neighbours. Parameters ---------- frequency : float or int Unknown frequency for which to linearly interpolate the intensities. freq_axis[0] >= frequency >= self_freq_axis[-1] """ lfreq, lvalue = None, None for freq, value in zip(self.freq_axis, self.data[:, :]): if freq < frequency: break lfreq, lvalue = freq, value else: raise ValueError("Frequency not in interpolation range") if lfreq is None: raise ValueError("Frequency not in interpolation range") diff = frequency - freq # pylint: disable=W0631 ldiff = lfreq - frequency return (ldiff * value + diff * lvalue) / (diff + ldiff) # pylint: disable=W0631 def linearize_freqs(self, delta_freq=None): """Rebin frequencies so that the frequency axis is linear. Parameters ---------- delta_freq : float Difference between consecutive values on the new frequency axis. Defaults to half of smallest delta in current frequency axis. Compare Nyquist-Shannon sampling theorem. """ if delta_freq is None: # Nyquist–Shannon sampling theorem delta_freq = _min_delt(self.freq_axis) / 2. nsize = (self.freq_axis.max() - self.freq_axis.min()) / delta_freq + 1 new = np.zeros((int(nsize), self.shape[1]), dtype=self.data.dtype) freqs = self.freq_axis - self.freq_axis.max() freqs = freqs / delta_freq midpoints = np.round((freqs[:-1] + freqs[1:]) / 2) fillto = np.concatenate( [midpoints - 1, np.round([freqs[-1]]) - 1] ) fillfrom = np.concatenate( [np.round([freqs[0]]), midpoints - 1] ) fillto = np.abs(fillto) fillfrom = np.abs(fillfrom) for row, from_, to_ in zip(self, fillfrom, fillto): new[int(from_): int(to_)] = row vrs = self._get_params() vrs.update({ 'freq_axis': np.linspace( self.freq_axis.max(), self.freq_axis.min(), nsize ) }) return self.__class__(new, **vrs) def freq_overlap(self, other): """Get frequency range present in both spectrograms. Returns (min, max) tuple. Parameters ---------- other : Spectrogram other spectrogram with which to look for frequency overlap """ lower = max(self.freq_axis[-1], other.freq_axis[-1]) upper = min(self.freq_axis[0], other.freq_axis[0]) if lower > upper: raise ValueError("No overlap.") return lower, upper def time_to_x(self, time): """Return x-coordinate in spectrogram that corresponds to the passed `~datetime.datetime` value. Parameters ---------- time : `~sunpy.time.parse_time` compatible str `~datetime.datetime` to find the x coordinate for. """ diff = time - self.start diff_s = SECONDS_PER_DAY * diff.days + diff.seconds if self.time_axis[-1] < diff_s < 0: raise ValueError("Out of bounds") for n, elem in enumerate(self.time_axis): if diff_s < elem: return n - 1 # The last element is the searched one. return n def at_freq(self, freq): return self[np.nonzero(self.freq_axis == freq)[0], :] @staticmethod def _mk_format_coord(spec, fmt_coord): def format_coord(x, y): shape = list(map(int, spec.shape)) xint, yint = int(x), int(y) if 0 <= xint < shape[1] and 0 <= yint < shape[0]: pixel = spec[yint][xint] else: pixel = "" return '{0!s} z={1!s}'.format(fmt_coord(x, y), pixel) return format_coord @deprecated("0.8", "this module is being moved to sunpyspectra - https://github.com/sunpy/spectra") class LinearTimeSpectrogram(Spectrogram): """ Spectrogram evenly sampled in time. Attributes ---------- t_delt : float difference between the items on the time axis """ # pylint: disable=E1002 COPY_PROPERTIES = Spectrogram.COPY_PROPERTIES + [ ('t_delt', REFERENCE), ] def __init__(self, data, time_axis, freq_axis, start, end, t_init=None, t_delt=None, t_label="Time", f_label="Frequency", content="", instruments=None): if t_delt is None: t_delt = _min_delt(freq_axis) super(LinearTimeSpectrogram, self).__init__( data, time_axis, freq_axis, start, end, t_init, t_label, f_label, content, instruments ) self.t_delt = t_delt @staticmethod def make_array(shape, dtype=np.dtype('float32')): """Function to create an array with shape and dtype. Parameters ---------- shape : tuple shape of the array to create dtype : `numpy.dtype` data-type of the array to create """ return np.zeros(shape, dtype=dtype) @staticmethod def memmap(filename): """Return function that takes shape and dtype and returns a memory mapped array. Parameters ---------- filename : str File to store the memory mapped array in. """ return ( lambda shape, dtype=np.dtype('float32'): np.memmap( filename, mode="write", shape=shape, dtype=dtype ) ) def resample_time(self, new_delt): """Rescale image so that the difference in time between pixels is new_delt seconds. Parameters ---------- new_delt : float New delta between consecutive values. """ if self.t_delt == new_delt: return self factor = self.t_delt / float(new_delt) # The last data-point does not change! new_size = floor((self.shape[1] - 1) * factor + 1) # pylint: disable=E1101 data = ndimage.zoom(self.data, (1, new_size / self.shape[1])) # pylint: disable=E1101 params = self._get_params() params.update({ 'time_axis': np.linspace( self.time_axis[0], self.time_axis[int((new_size - 1) * new_delt / self.t_delt)], new_size ), 't_delt': new_delt, }) return self.__class__(data, **params) JOIN_REPEAT = object() @classmethod def join_many(cls, specs, mk_arr=None, nonlinear=False, maxgap=0, fill=JOIN_REPEAT): """Produce new Spectrogram that contains spectrograms joined together in time. Parameters ---------- specs : list List of spectrograms to join together in time. nonlinear : bool If True, leave out gaps between spectrograms. Else, fill them with the value specified in fill. maxgap : float, int or None Largest gap to allow in second. If None, allow gap of arbitrary size. fill : float or int Value to fill missing values (assuming nonlinear=False) with. Can be LinearTimeSpectrogram.JOIN_REPEAT to repeat the values for the time just before the gap. mk_array: function Function that is called to create the resulting array. Can be set to LinearTimeSpectrogram.memap(filename) to create a memory mapped result array. """ # XXX: Only load header and load contents of files # on demand. mask = None if mk_arr is None: mk_arr = cls.make_array specs = sorted(specs, key=lambda x: x.start) freqs = specs[0].freq_axis if not all(np.array_equal(freqs, sp.freq_axis) for sp in specs): raise ValueError("Frequency channels do not match.") # Smallest time-delta becomes the common time-delta. min_delt = min(sp.t_delt for sp in specs) dtype_ = max(sp.dtype for sp in specs) specs = [sp.resample_time(min_delt) for sp in specs] size = sum(sp.shape[1] for sp in specs) data = specs[0] start_day = data.start xs = [] last = data for elem in specs[1:]: e_init = ( SECONDS_PER_DAY * ( get_day(elem.start) - get_day(start_day) ).days + elem.t_init ) x = int((e_init - last.t_init) / min_delt) xs.append(x) diff = last.shape[1] - x if maxgap is not None and -diff > maxgap / min_delt: raise ValueError("Too large gap.") # If we leave out undefined values, we do not want to # add values here if x > t_res. if nonlinear: size -= max(0, diff) else: size -= diff last = elem # The non existing element after the last one starts after # the last one. Needed to keep implementation below sane. xs.append(specs[-1].shape[1]) # We do that here so the user can pass a memory mapped # array if they'd like to. arr = mk_arr((data.shape[0], size), dtype_) time_axis = np.zeros((size,)) sx = 0 # Amount of pixels left out due to non-linearity. Needs to be # considered for correct time axes. sd = 0 for x, elem in zip(xs, specs): diff = x - elem.shape[1] e_time_axis = elem.time_axis elem = elem.data if x > elem.shape[1]: if nonlinear: x = elem.shape[1] else: # If we want to stay linear, fill up the missing # pixels with placeholder zeros. filler = np.zeros((data.shape[0], diff)) if fill is cls.JOIN_REPEAT: filler[:, :] = elem[:, -1, np.newaxis] else: filler[:] = fill minimum = e_time_axis[-1] e_time_axis = np.concatenate([ e_time_axis, np.linspace( minimum + min_delt, minimum + diff * min_delt, diff ) ]) elem = np.concatenate([elem, filler], 1) arr[:, sx:sx + x] = elem[:, :x] if diff > 0: if mask is None: mask = np.zeros((data.shape[0], size), dtype=np.uint8) mask[:, sx + x - diff:sx + x] = 1 time_axis[sx:sx + x] = e_time_axis[:x] + data.t_delt * (sx + sd) if nonlinear: sd += max(0, diff) sx += x params = { 'time_axis': time_axis, 'freq_axis': data.freq_axis, 'start': data.start, 'end': specs[-1].end, 't_delt': data.t_delt, 't_init': data.t_init, 't_label': data.t_label, 'f_label': data.f_label, 'content': data.content, 'instruments': _union(spec.instruments for spec in specs), } if mask is not None: arr = ma.array(arr, mask=mask) if nonlinear: del params['t_delt'] return Spectrogram(arr, **params) return common_base(specs)(arr, **params) def time_to_x(self, time): """Return x-coordinate in spectrogram that corresponds to the passed datetime value. Parameters ---------- time : `~sunpy.time.parse_time` compatible str `datetime.datetime` to find the x coordinate for. """ # This is impossible for frequencies because that mapping # is not injective. time = parse_time(time) diff = time - self.start diff_s = SECONDS_PER_DAY * diff.days + diff.seconds result = diff_s // self.t_delt if 0 <= result <= self.shape[1]: # pylint: disable=E1101 return result raise ValueError("Out of range.") @staticmethod def intersect_time(specs): """Return slice of spectrograms that is present in all of the ones passed. Parameters ---------- specs : list List of spectrograms of which to find the time intersections. """ delt = min(sp.t_delt for sp in specs) start = max(sp.t_init for sp in specs) # XXX: Could do without resampling by using # sp.t_init below, not sure if good idea. specs = [sp.resample_time(delt) for sp in specs] cut = [sp[:, int((start - sp.t_init) / delt):] for sp in specs] length = min(sp.shape[1] for sp in cut) return [sp[:, :length] for sp in cut] @classmethod def combine_frequencies(cls, specs): """Return new spectrogram that contains frequencies from all the spectrograms in spec. Only returns time intersection of all of them. Parameters ---------- spec : list List of spectrograms of which to combine the frequencies into one. """ if not specs: raise ValueError("Need at least one spectrogram.") specs = cls.intersect_time(specs) one = specs[0] dtype_ = max(sp.dtype for sp in specs) fsize = sum(sp.shape[0] for sp in specs) new = np.zeros((fsize, one.shape[1]), dtype=dtype_) freq_axis = np.zeros((fsize,)) for n, (data, row) in enumerate(merge( [ [(sp, n) for n in range(sp.shape[0])] for sp in specs ], key=lambda x: x[0].freq_axis[x[1]] )): new[n, :] = data[row, :] freq_axis[n] = data.freq_axis[row] params = { 'time_axis': one.time_axis, # Should be equal 'freq_axis': freq_axis, 'start': one.start, 'end': one.end, 't_delt': one.t_delt, 't_init': one.t_init, 't_label': one.t_label, 'f_label': one.f_label, 'content': one.content, 'instruments': _union(spec.instruments for spec in specs) } return common_base(specs)(new, **params) def check_linearity(self, err=None, err_factor=None): """Check linearity of time axis. If err is given, tolerate absolute derivation from average delta up to err. If err_factor is given, tolerate up to err_factor * average_delta. If both are given, TypeError is raised. Default to err=0. Parameters ---------- err : float Absolute difference each delta is allowed to diverge from the average. Cannot be used in combination with err_factor. err_factor : float Relative difference each delta is allowed to diverge from the average, i.e. err_factor * average. Cannot be used in combination with err. """ deltas = self.time_axis[:-1] - self.time_axis[1:] avg = np.average(deltas) if err is None and err_factor is None: err = 0 elif err is None: err = abs(err_factor * avg) elif err_factor is not None: raise TypeError("Only supply err or err_factor, not both") return (abs(deltas - avg) <= err).all() def in_interval(self, start=None, end=None): """Return part of spectrogram that lies in [start, end). Parameters ---------- start : None or `~datetime.datetime` or `~sunpy.time.parse_time` compatible string or time string Start time of the part of the spectrogram that is returned. If the measurement only spans over one day, a colon separated string representing the time can be passed. end : None or `~datetime.datetime` or `~sunpy.time.parse_time` compatible string or time string See start. """ if start is not None: try: start = parse_time(start) except ValueError: # XXX: We could do better than that. if get_day(self.start) != get_day(self.end): raise TypeError( "Time ambiguous because data spans over more than one day" ) start = datetime.datetime( self.start.year, self.start.month, self.start.day, *list(map(int, start.split(":"))) ) start = self.time_to_x(start) if end is not None: try: end = parse_time(end) except ValueError: if get_day(self.start) != get_day(self.end): raise TypeError( "Time ambiguous because data spans over more than one day" ) end = datetime.datetime( self.start.year, self.start.month, self.start.day, *list(map(int, end.split(":"))) ) end = self.time_to_x(end) if start: start = int(start) if end: end = int(end) return self[:, start:end] sunpy-0.8.3/sunpy/spectra/spectrum.py0000644000175000017500000000527013231613140020125 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- # Author: Florian Mayer from __future__ import absolute_import import numpy as np from matplotlib import pyplot as plt from sunpy.util.decorators import deprecated __all__ = ['Spectrum'] @deprecated("0.8", "this module is being moved to sunpyspectra - https://github.com/sunpy/spectra") class Spectrum(np.ndarray): """ Class representing a 1 dimensional spectrum. Attributes ---------- freq_axis : `~numpy.ndarray` one-dimensional array with the frequency values. data\ : `numpy.ndarray` One-dimensional array which the intensity at a particular frequency at every data-point. Examples -------- >>> from sunpy.spectra.spectrum import Spectrum >>> import numpy as np >>> data = np.linspace(1, 100, 100) >>> freq_axis = np.linspace(0, 10, 100) >>> spec = Spectrum(data, freq_axis) >>> spec.peek() # doctest: +SKIP """ def __new__(cls, data, *args, **kwargs): return np.asarray(data).view(cls) def __init__(self, data, freq_axis): if np.shape(data)[0] != np.shape(freq_axis)[0]: raise ValueError('Dimensions of data and frequency axis do not match') self.freq_axis = freq_axis def plot(self, axes=None, **matplot_args): """ Plot spectrum onto current axes. Parameters ---------- axes : `~matplotlib.axes.Axes` or None If provided the spectrum will be plotted on the given axes. Else the current matplotlib axes will be used. **matplot_args : dict Any additional plot arguments that should be used when plotting. Returns ------- newaxes : `~matplotlib.axes.Axes` The plot axes. """ # Get current axes if not axes: axes = plt.gca() params = {} params.update(matplot_args) lines = axes.plot(self.freq_axis, self, **params) return lines def peek(self, **matplot_args): """ Plot spectrum onto a new figure. An example is shown below. .. plot:: from sunpy.spectra.spectrum import Spectrum import numpy as np spec = Spectrum(np.linspace(1, 100, 100), np.linspace(0, 10, 100)) spec.peek() Parameters ---------- **matplot_args : dict Any additional plot arguments that should be used when plotting. Returns ------- fig : `~matplotlib.Figure` A plot figure. """ figure = plt.figure() lines = self.plot(**matplot_args) figure.show() return figure sunpy-0.8.3/sunpy/sun/0000755000175000017500000000000013232563477015073 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/sun/tests/0000755000175000017500000000000013232563477016235 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/sun/tests/__init__.py0000644000175000001440000000000013203275053017306 0ustar nabil00000000000000sunpy-0.8.3/sunpy/sun/tests/test_constants.py0000644000175000001440000000245313210276527020645 0ustar nabil00000000000000from __future__ import absolute_import from sunpy.sun import constants as con from astropy.constants import Constant import pytest from sunpy.extern.six import iteritems @pytest.mark.parametrize('this_constant', [value for key, value in iteritems(con.constants)]) def test_all_constants_are_constants(this_constant): """Test that each member of the constants dict is an astropy Constant""" assert isinstance(this_constant, Constant) @pytest.mark.parametrize('this_key', [key for key, value in iteritems(con.constants)]) def test_get_function(this_key): """Test that the get function works for all the keys""" assert isinstance(con.get(this_key), Constant) @pytest.mark.parametrize('this_key', [key for key, value in iteritems(con.constants)]) def test_find_function(this_key): """Test that the find function works for all the keys""" assert len(con.find(this_key)) >= 1 @pytest.mark.parametrize('this_key', [key for key, value in iteritems(con.constants)]) def test_find_function(this_key): """Test that the find function works for all the keys""" assert len(con.find(this_key)) >= 1 @pytest.mark.parametrize("test_input", ['boo', 'crab', 'foo']) def test_find_function(test_input): """Test that the find function fails as expected""" assert len(con.find(test_input)) == 0 sunpy-0.8.3/sunpy/sun/tests/test_sun.py0000644000175000017500000001606313231613140020437 0ustar nabilnabil00000000000000from __future__ import absolute_import import astropy.units as u from sunpy.sun import sun from astropy.tests.helper import assert_quantity_allclose def test_sunearth_distance(): # Source for these values # wolframalpha.com # http://www.wolframalpha.com/input/?i=earth-sun+distance+on+2010%2F02%2F04 assert_quantity_allclose(sun.sunearth_distance("2010/02/04"), 0.9858 * u.AU, atol=1e-3 * u.AU) assert_quantity_allclose(sun.sunearth_distance("2009/04/13"), 1.003 * u.AU, atol=1e-3 * u.AU) assert_quantity_allclose(sun.sunearth_distance("2008/06/20"), 1.016 * u.AU, atol=1e-3 * u.AU) assert_quantity_allclose(sun.sunearth_distance("2007/08/15"), 1.013 * u.AU, atol=1e-3 * u.AU) assert_quantity_allclose(sun.sunearth_distance("2007/10/02"), 1.001 * u.AU, atol=1e-3 * u.AU) assert_quantity_allclose(sun.sunearth_distance("2006/12/27"), 0.9834 * u.AU, atol=1e-3 * u.AU) def test_true_longitude(): # source: http://www.satellite-calculations.com/Satellite/suncalc.htm # values are deviating a little because of lack of time parameter in # true_longitude function assert_quantity_allclose(sun.true_longitude("2002/12/23"), 270.978 * u.deg, atol=1.1 * u.deg) assert_quantity_allclose(sun.true_longitude("2003/01/29"), 308.661 * u.deg, atol=1.1 * u.deg) assert_quantity_allclose(sun.true_longitude("2004/05/12"), 51.617 * u.deg, atol=1.1 * u.deg) assert_quantity_allclose(sun.true_longitude("2006/07/04"), 101.910 * u.deg, atol=1.1 * u.deg) assert_quantity_allclose(sun.true_longitude("2007/09/16"), 172.767 * u.deg, atol=1.1 * u.deg) assert_quantity_allclose(sun.true_longitude("2009/02/11"), 322.394 * u.deg, atol=1.1 * u.deg) def test_apparent_declination(): assert_quantity_allclose(sun.apparent_declination("2002/12/22"), -22.964 * u.deg, atol=1 * u.deg) assert_quantity_allclose(sun.apparent_declination("2003/1/12"), -21.743 * u.deg, atol=1 * u.deg) assert_quantity_allclose(sun.apparent_declination("2004/02/13"), -13.478 * u.deg, atol=1 * u.deg) assert_quantity_allclose(sun.apparent_declination("2005/12/3"), -22.152 * u.deg, atol=1 * u.deg) assert_quantity_allclose(sun.apparent_declination("2013/02/26"), -8.547 * u.deg, atol=1 * u.deg) assert_quantity_allclose(sun.apparent_declination("2014/05/1"), 15.141 * u.deg, atol=1 * u.deg) def test_mean_anomaly(): assert_quantity_allclose(sun.mean_anomaly("2002/12/12"), 337.538 * u.deg, atol=1 * u.deg) assert_quantity_allclose(sun.mean_anomaly("2003/03/25"), 79.055 * u.deg, atol=1 * u.deg) assert_quantity_allclose(sun.mean_anomaly("2005/06/05"), 150.492 * u.deg, atol=1 * u.deg) assert_quantity_allclose(sun.mean_anomaly("2006/11/17"), 312.860 * u.deg, atol=1 * u.deg) assert_quantity_allclose(sun.mean_anomaly("2008/07/29"), 203.933 * u.deg, atol=1 * u.deg) assert_quantity_allclose(sun.mean_anomaly("2011/01/31"), 26.742 * u.deg, atol=1 * u.deg) #These values are tested from the functions after the integration of astropy.units def test_solar_cycle_number(): assert_quantity_allclose(sun.solar_cycle_number("2012/11/11"), 5, atol=1e-1) #76 assert_quantity_allclose(sun.solar_cycle_number("2011/2/22"), 4, atol=1e-1) #23 assert_quantity_allclose(sun.solar_cycle_number("2034/1/15"), 27, atol=1e-1) def test_solar_semidiameter_angular_size(): assert_quantity_allclose(sun.solar_semidiameter_angular_size("2012/11/11"), 968.604 * u.arcsec, atol=1e-3 * u.arcsec) assert_quantity_allclose(sun.solar_semidiameter_angular_size("2043/03/01"), 968.059 * u.arcsec, atol=1e-3 * u.arcsec) assert_quantity_allclose(sun.solar_semidiameter_angular_size("2001/07/21"), 943.778 * u.arcsec, atol=1e-3 * u.arcsec) def test_mean_ecliptic_longitude(): assert_quantity_allclose(sun.mean_ecliptic_longitude("2012/11/11"), 230.544 * u.deg, atol=1e-3 * u.deg) assert_quantity_allclose(sun.mean_ecliptic_longitude("2101/04/29"), 36.811 * u.deg, atol=1e-3 * u.deg) assert_quantity_allclose(sun.mean_ecliptic_longitude("2003/09/15"), 173.554 * u.deg, atol=1e-3 * u.deg) def test_equation_of_center(): assert_quantity_allclose(sun.equation_of_center("2012/11/11"), -1.540 * u.deg, atol=1e-3 * u.deg) assert_quantity_allclose(sun.equation_of_center("2014/05/27"), 1.178 * u.deg, atol=1e-3 * u.deg) assert_quantity_allclose(sun.equation_of_center("2134/01/01"), -0.161 * u.deg, atol=1e-3 * u.deg) def test_true_anomaly(): assert_quantity_allclose(sun.true_anomaly("2012/11/11"), 305.842 * u.deg, atol=1e-3 * u.deg) assert_quantity_allclose(sun.true_anomaly("2242/06/29"), 170.010 * u.deg, atol=1e-3 * u.deg) assert_quantity_allclose(sun.true_anomaly("2020/01/01"), 356.735 * u.deg, atol=1e-3 * u.deg) def test_apparent_longitude(): assert_quantity_allclose(sun.apparent_longitude("2012/11/11"), 228.994 * u.deg, atol=1e-3 * u.deg) assert_quantity_allclose(sun.apparent_longitude("2014/05/27"), 65.648 * u.deg, atol=1e-3 * u.deg) assert_quantity_allclose(sun.apparent_longitude("2134/02/12"), 323.066 * u.deg, atol=1e-3 * u.deg) def test_true_obliquity_of_ecliptic(): assert_quantity_allclose(sun.true_obliquity_of_ecliptic("2012/11/11"), 23.437 * u.deg, atol=1e-3 * u.deg) assert_quantity_allclose(sun.true_obliquity_of_ecliptic("2132/12/29"), 23.421 * u.deg, atol=1e-3 * u.deg) assert_quantity_allclose(sun.true_obliquity_of_ecliptic("2002/03/15"), 23.438 * u.deg, atol=1e-3 * u.deg) def test_true_rightasenscion(): assert_quantity_allclose(sun.true_rightascension("2012/11/11"), 226.550 * u.deg, atol=1e-3 * u.deg) assert_quantity_allclose(sun.true_rightascension("2142/02/03"), 316.466 * u.deg, atol=1e-3 * u.deg) assert_quantity_allclose(sun.true_rightascension("2013/12/11"), 258.150 * u.deg, atol=1e-3 * u.deg) def test_true_declination(): assert_quantity_allclose(sun.true_declination("2012/11/11"), -17.467 * u.deg, atol=1e-3 * u.deg) assert_quantity_allclose(sun.true_declination("2245/12/01"), -21.717 * u.deg, atol=1e-3 * u.deg) assert_quantity_allclose(sun.true_declination("2014/05/27"), 21.245 * u.deg, atol=1e-3 * u.deg) def test_apparent_obliquity_of_ecliptic(): assert_quantity_allclose(sun.apparent_obliquity_of_ecliptic("2012/11/11"), 23.435 * u.deg, atol=1e-3 * u.deg) assert_quantity_allclose(sun.apparent_obliquity_of_ecliptic("2014/05/27"), 23.438 * u.deg, atol=1e-3 * u.deg) assert_quantity_allclose(sun.apparent_obliquity_of_ecliptic("2412/02/26"), 23.388 * u.deg, atol=1e-3 * u.deg) def test_apparent_rightascension(): assert_quantity_allclose(sun.apparent_rightascension("2012/11/11"), 15.103 * u.hourangle, atol=1e-3 * u.hourangle) assert_quantity_allclose(sun.apparent_rightascension("2013/12/13"), 17.356 * u.hourangle, atol=1e-3 * u.hourangle) assert_quantity_allclose(sun.apparent_rightascension("2512/04/09"), 1.196 * u.hourangle, atol=1e-3 * u.hourangle) def test_solar_north(): assert_quantity_allclose(sun.solar_north("2012/11/11"), 22.346 * u.deg, atol=1e-3 * u.deg) assert_quantity_allclose(sun.solar_north("2019/10/10"), 26.260 * u.deg, atol=1e-3 * u.deg) assert_quantity_allclose(sun.solar_north("2542/02/20"), -17.981 * u.deg, atol=1e-3 * u.deg) sunpy-0.8.3/sunpy/sun/__init__.py0000644000175000017500000000031713231613140017163 0ustar nabilnabil00000000000000""" Contains astronomical and physical constants for use in SunPy or other places. """ from __future__ import absolute_import from sunpy.sun.sun import * from . import _constants from . import constants sunpy-0.8.3/sunpy/sun/_constants.py0000644000175000001440000001663513210276527016612 0ustar nabil00000000000000""" Collection of solar physical constants. The list is not meant to be comprehensive, but just a convenient list for everyday use. .. todo:: Need better sources for some constants as well as error values. """ from __future__ import absolute_import from astropy.constants import Constant # This is to keep the old solar values until we make the choice to move to IAU2015 Values import astropy if int(astropy.__version__[0]) >= 2: import astropy.constants.astropyconst13 as astrocon else: import astropy.constants as astrocon __all__ = ['physical_constants'] physical_constants = {} # references gsfc_fact = "http://nssdc.gsfc.nasa.gov/planetary/factsheet/sunfact.html" allen = "Allen's Astrophysical Quantities 4th Ed." asplund = "Asplund et al. 2006" fivian = "Fivian et al. 2008" physical_constants['mass'] = astrocon.M_sun physical_constants['radius'] = astrocon.R_sun physical_constants['luminosity'] = astrocon.L_sun physical_constants['mean distance'] = astrocon.au # following needs error estimate if appropriate physical_constants['perihelion distance'] = Constant('perihelion', "Perihelion Distance", 1.471e11, 'm', 0, allen, system='si') # following needs error estimate if appropriate physical_constants['aphelion distance'] = Constant('aphelion', "Aphelion Distance", 1.521e11, 'm', 0, allen, system='si') physical_constants['age'] = Constant('age', "Age of the Sun", 4.6e9, 'year', 0.1e9, allen, system='si') # A solar flux (sfu) is traditional measure of solar radio flux. physical_constants['solar flux unit'] = Constant('sfu', "Solar flux unit", 1e-22, 'W m**-2 Hz**-1', 0, allen, system='si') # following needs error estimate if appropriate physical_constants['visual magnitude'] = Constant('V', "Apparent visual magnitude", -26.75, '', 0, allen, system='si') # The Sun as viewed from Earth physical_constants['average angular size'] = Constant('theta', "Semidiameter", 959.63, 'arcsec', 0, allen, system='si') # following needs error estimate if appropriate physical_constants['surface area'] = Constant('A', "Surface area", 6.087e18, 'm**2', 0, allen, system='si') # following needs error estimate if appropriate physical_constants['average density'] = Constant('rho', "Mean density", 1409, 'kg m**-3', 0, allen, system='si') # following needs error estimate if appropriate physical_constants['surface gravity'] = Constant('g', "Surface gravity", 274, 'm s**-2', 0, allen, system='si') # following needs error estimate if appropriate physical_constants['moment of inertia'] = Constant('I', "Moment of inertia", 5.7e54, 'kg m**-2', 0, allen, system='si') # following needs error estimate if appropriate physical_constants['volume'] = Constant('V', "Volume", 1.4122e27, 'm**3', 0, allen, system='si') # following needs error estimate if appropriate physical_constants['escape velocity'] = Constant('v', "Escape velocity at surface", 6.177e5, 'm s**-1', 0, allen, system='si') physical_constants['oblateness'] = Constant('', "oblateness", 8.01, 'marcsec', 0.14, fivian, system='si') # the following constants need references and error estimates if appropriate physical_constants['metallicity'] = Constant('Z', "Metallicity", 0.0122, '', 0.0, asplund, system='si') sunspot_cycle_exp = "Average duration of sunspot cycle" physical_constants['sunspot cycle'] = Constant('', sunspot_cycle_exp, 11.4, 'year', 0, "", system='si') physical_constants['average intensity'] = Constant('I', "Mean Intensity", 2.009e7, 'W m**-2 sr**-1', 0, "", system='si') effect_temp_exp = "Effective black-body temperature" physical_constants['effective temperature'] = Constant('T', effect_temp_exp, 5778.0, 'K', 0, "", system='si') mass_conv_exp = "Mass conversion rate" physical_constants['mass conversion rate'] = Constant('dm/dt', mass_conv_exp, 4300e6, 'kg s**-1', 0, "", system='si') # following needs error estimate if appropriate physical_constants['center density'] = Constant('rho_center', "Center density", 1.622e5, 'kg m**-3', 0, gsfc_fact, system='si') # following needs error estimate if appropriate cent_temp_exp = "Center temperature" physical_constants['center temperature'] = Constant('T_center', cent_temp_exp, 1.571e7, 'K', 0, gsfc_fact, system='si') # following needs error estimate if appropriate abs_magn_exp = "Absolute magnitude" physical_constants['absolute magnitude'] = Constant('M_abs', abs_magn_exp, +4.83, '', 0, gsfc_fact, system='si') # following needs error estimate if appropriate mean_energy_exp = "mean energy production" physical_constants['mean energy production'] = Constant('', mean_energy_exp, 193.7e-6, 'J kg**-1', 0, gsfc_fact, system='si') # following needs error estimate if appropriate physical_constants['ellipticity'] = Constant('', "ellipticity", 5e-5, '', 0, gsfc_fact, system='si') # following needs error estimate if appropriate physical_constants['GM'] = Constant('mu', "standard gravitational parameter", 132.712e6, 'km**3 s**-2', 0, gsfc_fact, system='si') sunpy-0.8.3/sunpy/sun/constants.py0000644000175000017500000000727513232563373017467 0ustar nabilnabil00000000000000""" Fundamental Solar Physical Constants ------------------------------------ These constants are taken from various sources. The structure of this module is heavily based on if not directly copied from the SciPy constants module but contains Solar Physical constants. Websites -------- | http://books.google.com/books?id=4SWENr1tIJ0C&printsec=frontcover&source=gbs_ge_summary_r&cad=0#v=onepage&q=sfu&f=false """ from __future__ import absolute_import, division, print_function from astropy.table import Table from sunpy.extern.six import iteritems from sunpy.sun import _constants as _con # pylint: disable=E0611 __all__ = [ 'get', 'find', 'print_all', 'spectral_classification', 'au', 'mass', 'equatorial_radius', 'volume', 'surface_area', 'average_density', 'equatorial_surface_gravity', 'effective_temperature', 'luminosity', 'mass_conversion_rate', 'escape_velocity', 'sfu', 'average_angular_size' ] constants = _con.physical_constants def get(key): """ Retrieve a constant by key. This is just a short cut into a dictionary. Parameters ---------- key : Python string or unicode Key in dictionary in `constants` Returns ------- constant : `~astropy.units.Constant` See Also -------- _constants : Contains the description of `constants`, which, as a dictionary literal object, does not itself possess a docstring. Examples -------- >>> from sunpy.sun import constants >>> constants.get('mass') < name='Solar mass' value=1.9891e+30 uncertainty=5e+25 unit='kg' reference="Allen's Astrophysical Quantities 4th Ed."> """ return constants[key] def find(sub=None): """ Return list of constants keys containing a given string Parameters ---------- sub : str, unicode Sub-string to search keys for. By default, return all keys. Returns ------- keys : None or list See Also -------- _constants : Contains the description of `constants`, which, as a dictionary literal object, does not itself possess a docstring. """ if sub is None: result = list(constants.keys()) else: result = [key for key in constants \ if sub.lower() in key.lower()] result.sort() return result def print_all(key=None): """ Provides a table of the complete list of constants. Parameters ---------- key : Python string or unicode Key in dictionary `constants` Returns ------- table : `astropy.table.Table` """ data_rows = [] for key, this_constant in iteritems(constants): data_rows.append([ key, this_constant.name, this_constant.value, this_constant.uncertainty, str(this_constant.unit), this_constant.reference ]) t = Table(rows=data_rows, names=('key', 'name', 'value', 'uncertainty', 'unit', 'Reference')) return t # Spectral class is not included in physical constants since it is not a number spectral_classification = 'G2V' au = astronomical_unit = get('mean distance') # The following variables from _gets are brought out by making them # accessible through a call such as sun.volume mass = get('mass') equatorial_radius = radius = get('radius') volume = get('volume') surface_area = get('surface area') average_density = density = get('average density') equatorial_surface_gravity = surface_gravity = get('surface gravity') effective_temperature = get('effective temperature') luminosity = get('luminosity') mass_conversion_rate = get('mass conversion rate') escape_velocity = get('escape velocity') sfu = get('solar flux unit') # Observable parameters average_angular_size = get('average angular size') sunpy-0.8.3/sunpy/sun/models.py0000644000175000001440000000635513210261730015706 0ustar nabil00000000000000""" Solar Physical Models --------------------- This module contains standard models of the sun from various sources. All data is saved in pandas DataFrames with two added attributes * source : names the source of the data * units : a dictionary with the units of each of the columns Object ------ interior : pandas.DataFrame The standard model of the solar interior evolution : pandas.DataFrame The evolution as a function of time of the Sun .. todo:: Need source for evolution model. """ from __future__ import absolute_import import pandas from astropy.units import Quantity import sunpy.sun.constants as con # Solar radius measured outside earth's atmosphere in arcseconds # Standard Model - Interior Structure # adapted from Turck-Chieze et al. (1988) # Composition X = 0.7046, Y = 0.2757, Z = 0.0197 # Radius - R_sun _radius = [0, 0.01, 0.022, 0.061, 0.090, 0.120, 0.166, 0.202, 0.246, 0.281, 0.317, 0.370, 0.453, 0.611, 0.7304, 0.862, 0.965, 1.0000] # mass - M_sun _mass = [0, 0.0001, 0.002, 0.020, 0.057, 0.115, 0.235, 0.341, 0.470, 0.562, 0.647, 0.748, 0.854, 0.951, 0.9809, 0.9964, 0.9999, 1.000] # luminosity - L_sun _luminosity = [0, 0.0009, 0.009, 0.154, 0.365, 0.594, 0.845, 0.940, 0.985, 0.997, 0.992, 0.9996, 1.000, 1.0, 1.0, 1.0, 1.0, 1.0] # temperature - 10^6 K _temperature = [15.513, 15.48, 15.36, 14.404, 13.37, 12.25, 10.53, 9.30, 8.035, 7.214, 6.461, 5.531, 4.426, 2.981, 2.035, 0.884, 0.1818, 0.005770] # density - g cm^-3 _density = [147.74, 146.66, 142.73, 116.10, 93.35, 72.73, 48.19, 34.28, 21.958, 15.157, 10.157, 5.566, 2.259, 0.4483, 0.1528, 0.042, 0.00361, 1.99e-7] _d = {'mass': _mass, 'luminosity': _luminosity, 'temperature': _temperature, 'density': _density} interior = pandas.DataFrame(_d, index = _radius) interior.index.name = 'radius' interior.units = {'radius': con.radius, 'mass': con.mass, 'luminosity': con.luminosity, 'temperature': Quantity(1e6, 'K'), 'density': Quantity(1, 'g cm**-3')} interior.source = 'Turck-Chieze et al. (1988)' # time - 10^9 years _time = [0, 0.143, 0.856, 1.863, 2.193, 3.020, 3.977, 4.587, 5.506, 6.074, 6.577, 7.027, 7.728, 8.258, 8.7566, 9.805] # luminosity - L_sun _tluminosity = [0.7688, 0.7248, 0.7621, 0.8156, 0.8352, 0.8855, 0.9522, 1.0, 1.079, 1.133, 1.186, 1.238, 1.318, 1.399, 1.494, 1.760] # radius - R_sun _tradius = [0.872, 0.885, 0.902, 0.924, 0.932, 0.953, 0.981, 1.0, 1.035, 1.059, 1.082, 1.105, 1.143, 1.180, 1.224, 1.361] # central temperature - 10^6 K _tcentral_temperature = [13.35, 13.46, 13.68, 14.08, 14.22, 14.60, 15.12, 15.51, 16.18, 16.65, 17.13, 17.62, 18.42, 18.74, 18.81, 19.25] _t = {'luminosity': _tluminosity, 'radius': _tradius, 'central temperature': _tcentral_temperature} evolution = pandas.DataFrame(_t, index = _tradius) evolution.index.name = 'time' evolution.units = {'radius': con.radius, 'luminosity': con.luminosity, 'central temperature': Quantity(1e6, 'K'), 'time': Quantity(1e9, 'year')} evolution.source = 'Unknown' sunpy-0.8.3/sunpy/sun/sun.py0000644000175000017500000002637013232563447016257 0ustar nabilnabil00000000000000""" Provides Sun-related parameters The following code is heavily based on IDL function get_sun.pro which itself is based on algorithms presented in the book Astronomical Formulae for Calculators, by Jean Meeus. Every function returning a quantity is of type astropy.units.Quantity """ from __future__ import absolute_import, division, print_function import numpy as np import astropy.units as u from astropy.coordinates import Angle, Longitude, Latitude from sunpy.time import parse_time, julian_day, julian_centuries from sunpy.sun import constants from sunpy.util.decorators import deprecated from sunpy.extern import six __all__ = [ "print_params", "heliographic_solar_center", "solar_north", "apparent_declination", "apparent_rightascension", "apparent_obliquity_of_ecliptic", "true_declination", "true_rightascension", "true_obliquity_of_ecliptic", "apparent_latitude", "true_latitude", "apparent_longitude", "sunearth_distance", "true_anomaly", "true_longitude", "equation_of_center", "geometric_mean_longitude", "carrington_rotation_number", "mean_anomaly", "longitude_Sun_perigee", "mean_ecliptic_longitude", "eccentricity_SunEarth_orbit", "position", "solar_semidiameter_angular_size", "solar_cycle_number" ] """ A correct answer set to compare to: Solar Ephemeris for 1-JAN-01 00:00:00 Distance (AU) = 0.98330468 Semidiameter (arc sec) = 975.92336 True (long, lat) in degrees = (280.64366, 0.00000) Apparent (long, lat) in degrees = (280.63336, 0.00000) True (RA, Dec) in hrs, deg = (18.771741, -23.012449) Apparent (RA, Dec) in hrs, deg = (18.770994, -23.012593) Heliographic long. and lat. of disk center in deg = (217.31269, -3.0416292) Position angle of north pole in deg = 2.0102649 Carrington Rotation Number = 1971.4091 check! """ __authors__ = ["Steven Christe"] __email__ = "steven.d.christe@nasa.gov" PARAMETER_DOCS = """ Parameters ---------- t : [ int, float, time_string, datetime ], optional Time, which can be either time_string, int, or datetime object. Parsed using `~sunpy.time.parse_time`. Defaults to the current time. """ def add_parameter_docs(f): if isinstance(f.__doc__, six.string_types): f.__doc__ += PARAMETER_DOCS return f @add_parameter_docs def solar_cycle_number(t='now'): """ Return the solar cycle number. """ time = parse_time(t) result = (time.year + 8) % 28 + 1 return result @add_parameter_docs def solar_semidiameter_angular_size(t='now'): r""" Return the angular size of the semi-diameter of the Sun as a function of time as viewed from Earth (in arcsec) .. math:: Radius_{\odot}[rad]=\tan^{-1}\left(\frac{}{D_{\odot \oplus}(t)[m]}\right) since :math:`tan(x) \approx x` when :math:`x << 1` .. math:: Radius_{\odot}[rad]=\frac{}{D_{\odot \oplus}(t)[m]} """ # Import here to avoid a circular import from sunpy.coordinates import get_sunearth_distance solar_semidiameter_rad = (constants.radius.to(u.AU)) / get_sunearth_distance(t) return Angle(solar_semidiameter_rad.to(u.arcsec, equivalencies=u.dimensionless_angles())) @add_parameter_docs def position(t='now'): """ Returns the position of the Sun (right ascension and declination) on the celestial sphere using the equatorial coordinate system in arcsec. """ ra = true_rightascension(t) dec = true_declination(t) return ra, dec @add_parameter_docs def eccentricity_SunEarth_orbit(t='now'): """ Returns the eccentricity of the Sun Earth Orbit. """ T = julian_centuries(t) result = 0.016751040 - 0.00004180 * T - 0.0000001260 * T**2 return result @add_parameter_docs def mean_ecliptic_longitude(t='now'): """ Returns the mean ecliptic longitude. """ T = julian_centuries(t) result = 279.696680 + 36000.76892 * T + 0.0003025 * T**2 result = result * u.deg return Longitude(result) @add_parameter_docs def longitude_Sun_perigee(t='now'): # pylint: disable=W0613 # T = julian_centuries(t) return 1 @add_parameter_docs def mean_anomaly(t='now'): """ Returns the mean anomaly (the angle through which the Sun has moved assuming a circular orbit) as a function of time. """ T = julian_centuries(t) result = 358.475830 + 35999.049750 * T - 0.0001500 * T**2 - 0.00000330 * T**3 result = result * u.deg return Longitude(result) @add_parameter_docs def carrington_rotation_number(t='now'): """ Return the Carrington Rotation number """ jd = julian_day(t) result = (1. / 27.2753) * (jd - 2398167.0) + 1.0 return result @add_parameter_docs def geometric_mean_longitude(t='now'): """ Returns the geometric mean longitude (in degrees). """ T = julian_centuries(t) result = 279.696680 + 36000.76892 * T + 0.0003025 * T**2 result = result * u.deg return Longitude(result) @add_parameter_docs def equation_of_center(t='now'): """ Returns the Sun's equation of center (in degrees). """ T = julian_centuries(t) mna = mean_anomaly(t) result = ((1.9194600 - 0.0047890 * T - 0.0000140 * T**2) * np.sin(mna) + (0.0200940 - 0.0001000 * T) * np.sin(2 * mna) + 0.0002930 * np.sin(3 * mna)) result = result * u.deg return Angle(result) @add_parameter_docs def true_longitude(t='now'): """ Returns the Sun's true geometric longitude (in degrees). (Referred to the mean equinox of date. Question: Should the higher accuracy terms from which app_long is derived be added to true_long?) """ result = equation_of_center(t) + geometric_mean_longitude(t) return Longitude(result) @add_parameter_docs def true_anomaly(t='now'): """ Returns the Sun's true anomaly (in degrees). """ result = mean_anomaly(t) + equation_of_center(t) return Longitude(result) @deprecated('0.8', 'Use sunpy.coordinates.get_sunearth_distance() for higher accuracy') @add_parameter_docs def sunearth_distance(t='now'): """ Returns the Sun Earth distance (AU). There are a set of higher accuracy terms not included here. """ ta = true_anomaly(t) e = eccentricity_SunEarth_orbit(t) result = 1.00000020 * (1.0 - e**2) / (1.0 + e * np.cos(ta)) return result * u.AU @add_parameter_docs def apparent_longitude(t='now'): """ Returns the apparent longitude of the Sun. """ T = julian_centuries(t) omega = (259.18 - 1934.142 * T) * u.deg true_long = true_longitude(t) result = true_long - (0.00569 - 0.00479 * np.sin(omega)) * u.deg return Longitude(result) @add_parameter_docs def true_latitude(t='now'): # pylint: disable=W0613 """ Returns the true latitude. Never more than 1.2 arcsec from 0, set to 0 here. """ return Latitude(0.0 * u.deg) @add_parameter_docs def apparent_latitude(t='now'): # pylint: disable=W0613 """ Returns the true latitude. Set to 0 here. """ return Latitude(0.0 * u.deg) @add_parameter_docs def true_obliquity_of_ecliptic(t='now'): """ Returns the true obliquity of the ecliptic. """ T = julian_centuries(t) result = 23.452294 - 0.0130125 * T - 0.00000164 * T**2 + 0.000000503 * T**3 return Angle(result, u.deg) @add_parameter_docs def true_rightascension(t='now'): """ Return the true right ascension. """ y = np.cos(true_obliquity_of_ecliptic(t)) * np.sin(true_longitude(t)) x = np.cos(true_longitude(t)) true_ra = np.arctan2(y, x) return Longitude(true_ra.to(u.hourangle)) @add_parameter_docs def true_declination(t='now'): """ Return the true declination. """ result = np.arcsin(np.sin(true_obliquity_of_ecliptic(t)) * np.sin(apparent_longitude(t))) return Latitude(result.to(u.deg)) @add_parameter_docs def apparent_obliquity_of_ecliptic(t='now'): """ Return the apparent obliquity of the ecliptic. """ omega = apparent_longitude(t) result = true_obliquity_of_ecliptic(t) + (0.00256 * np.cos(omega)) * u.deg return result @add_parameter_docs def apparent_rightascension(t='now'): """ Returns the apparent right ascension of the Sun. """ y = np.cos(apparent_obliquity_of_ecliptic(t)) * np.sin(apparent_longitude(t)) x = np.cos(apparent_longitude(t)) app_ra = np.arctan2(y, x) return Longitude(app_ra.to(u.hourangle)) @add_parameter_docs def apparent_declination(t='now'): """ Returns the apparent declination of the Sun. """ ob = apparent_obliquity_of_ecliptic(t) app_long = apparent_longitude(t) result = np.arcsin(np.sin(ob)) * np.sin(app_long) return Latitude(result.to(u.deg)) @deprecated('0.8', 'Use sunpy.coordinates.get_sun_P() for higher accuracy') @add_parameter_docs def solar_north(t='now'): """ Returns the position of the Solar north pole in degrees. """ T = julian_centuries(t) ob1 = true_obliquity_of_ecliptic(t) # in degrees i = 7.25 * u.deg k = (74.3646 + 1.395833 * T) * u.deg lamda = true_longitude(t) - (0.00569 * u.deg) omega = (259.18 - 1934.142 * T) * u.deg lamda2 = lamda - (0.00479 * np.sin(omega)) * u.deg diff = lamda - k x = np.arctan(-np.cos(lamda2) * np.tan(ob1)) y = np.arctan(-np.cos(diff) * np.tan(i)) result = x + y return Angle(result.to(u.deg)) @deprecated('0.8', 'Use sunpy.coordinates.get_sun_L0() and .get_sun_B0() for higher accuracy') @add_parameter_docs def heliographic_solar_center(t='now'): """ Returns the position of the solar center in heliographic coordinates. """ jd = julian_day(t) T = julian_centuries(t) # Heliographic coordinates in degrees theta = ((jd - 2398220) * 360 / 25.38) * u.deg i = 7.25 * u.deg k = (74.3646 + 1.395833 * T) * u.deg lamda = true_longitude(t) - 0.00569 * u.deg diff = lamda - k # Latitude at center of disk (deg): he_lat = np.arcsin(np.sin(diff) * np.sin(i)) # Longitude at center of disk (deg): y = -np.sin(diff) * np.cos(i) x = -np.cos(diff) rpol = (np.arctan2(y, x)) he_lon = rpol - theta return Longitude(he_lon.to(u.deg)), Latitude(he_lat.to(u.deg)) @add_parameter_docs def print_params(t='now'): """ Print out a summary of Solar ephemeris. """ # import here to avoid circular import from sunpy.coordinates.ephemeris import (get_sun_L0, get_sun_B0, get_sun_P, get_sunearth_distance) print('Solar Ephemeris for {}\n'.format(parse_time(t).ctime())) print('Distance = {}'.format(get_sunearth_distance(t))) print('Semidiameter = {}'.format(solar_semidiameter_angular_size(t))) print('True (long, lat) = ({}, {})'.format(true_longitude(t), true_latitude(t))) print('Apparent (long, lat) = ({}, {})'.format(apparent_longitude(t), apparent_latitude(t))) print('True (RA, Dec) = ({}, {})'.format(true_rightascension(t), true_declination(t))) print('Apparent (RA, Dec) = ({}, {})'.format(apparent_rightascension(t), apparent_declination(t))) print('Heliographic long. and lat of disk center = ({}, {})'.format(get_sun_L0(t), get_sun_B0(t))) print('Position angle of north pole in = {}'.format(get_sun_P(t))) print('Carrington Rotation Number = {}'.format(carrington_rotation_number(t))) sunpy-0.8.3/sunpy/tests/0000755000175000017500000000000013232563477015430 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/tests/tests/0000755000175000017500000000000013232563477016572 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/tests/tests/__init__.py0000644000175000001440000000000013203275053017643 0ustar nabil00000000000000sunpy-0.8.3/sunpy/tests/tests/test_main.py0000644000175000017500000000673513231613140021120 0ustar nabilnabil00000000000000import os.path import pytest import sunpy.tests root_dir = os.path.dirname(os.path.abspath(sunpy.__file__)) def test_main_nonexisting_module(): with pytest.raises(ImportError): sunpy.tests.main('doesnotexist') def test_main_stdlib_module(): """This test makes sure that the module is really searched within the sunpy package. """ with pytest.raises(ImportError): sunpy.tests.main('random') def test_main_noargs(monkeypatch): monkeypatch.setattr(pytest, 'main', lambda x: x) args = sunpy.tests.main() assert args in (['-m not figure', '-p no:warnings', 'sunpy'], ['-m not figure', '-p no:warnings', root_dir]) def test_main_submodule_map(monkeypatch): monkeypatch.setattr(pytest, 'main', lambda x: x) args = sunpy.tests.main('map') assert args in (['-m not figure', '-p no:warnings', os.path.join('sunpy', 'map')], ['-m not figure', '-p no:warnings', os.path.join(root_dir, 'map')]) def test_main_submodule_jsoc(monkeypatch): monkeypatch.setattr(pytest, 'main', lambda x: x) args = sunpy.tests.main('net.jsoc') assert args in (['-m not figure', '-p no:warnings', os.path.join('sunpy', 'net', 'jsoc')], ['-m not figure', '-p no:warnings', os.path.join(root_dir, 'net', 'jsoc')]) def test_main_with_cover(monkeypatch): monkeypatch.setattr(pytest, 'main', lambda x: x) args = sunpy.tests.main('map', coverage=True) covpath = os.path.abspath( os.path.join(sunpy.tests.testdir, os.path.join(os.pardir, 'map'))) assert args in (['--cov', covpath, '-m not figure', '-p no:warnings', os.path.join('sunpy', 'map')], ['--cov', os.path.join('sunpy', 'map'), '-m not figure', '-p no:warnings', os.path.join(root_dir, 'map')], ['--cov', os.path.join('sunpy', 'map'), '-m not figure', '-p no:warnings', os.path.join('sunpy', 'map')], ['--cov', covpath, '-m not figure', '-p no:warnings', os.path.join(root_dir, 'map')]) def test_main_with_show_uncovered_lines(monkeypatch): monkeypatch.setattr(pytest, 'main', lambda x: x) args = sunpy.tests.main('map', cov_report='term-missing') assert args in (['--cov-report', 'term-missing', '-m not figure', '-p no:warnings', os.path.join('sunpy', 'map')], ['--cov-report', 'term-missing', '-m not figure', '-p no:warnings', os.path.join(root_dir, 'map')]) def test_main_exclude_remote_data(monkeypatch): monkeypatch.setattr(pytest, 'main', lambda x: x) args = sunpy.tests.main('map', remote_data=False) assert args in (['-m not figure', '-p no:warnings', os.path.join('sunpy', 'map')], ['-m not figure', '-p no:warnings', os.path.join(root_dir, 'map')]) def test_main_only_remote_data(monkeypatch): monkeypatch.setattr(pytest, 'main', lambda x: x) args = sunpy.tests.main('map', offline=False, remote_data=True) assert args in (['--remote-data', '-k remote_data', '-m not figure', '-p no:warnings', os.path.join('sunpy', 'map')], ['--remote-data', '-k remote_data', '-m not figure', '-p no:warnings', os.path.join(root_dir, 'map')]) def test_main_figures(monkeypatch): monkeypatch.setattr(pytest, 'main', lambda x: x) args = sunpy.tests.main(figure=True) assert args in (['-p no:warnings', 'sunpy'], ['-p no:warnings', root_dir]) sunpy-0.8.3/sunpy/tests/__init__.py0000644000175000017500000000567413231613140017533 0ustar nabilnabil00000000000000from __future__ import absolute_import, division, print_function import os.path testdir = os.path.dirname(os.path.abspath(__file__)) try: import pytest except ImportError: pytest = None def main(modulename='', coverage=False, cov_report=False, online=False, offline=True, remote_data=False, figure=False, verbose=False, parallel=0, args=None): """ Execute the test suite of the sunpy package. The parameters may be used to restrict the number of tests that will be executed or to adjust the output. See the following documentation of the parameters for more information. Parameters ---------- modulename : str The name of the SunPy submodule which will be tested. The default is to test the whole sunpy package, i.e. all submodules. coverage : bool Whether to enable or disable code coverage. The default is False. cov_report: string Specify if a coverage report should be generated and which one. Allowed values: 'html' 'xml' 'annotate' 'term-missing' online : bool Run the tests that require an internet connection. offline: bool Run the tests that don't require an internet connection. remote_data : bool Run the tests that require an internet connection. figure: bool Include the figure tests in the test run. """ print(modulename) if pytest is None: raise ImportError("You need to install pytest to run SunPy's tests") if not modulename: module = __import__('sunpy') else: module = __import__('sunpy.{0}'.format(modulename), fromlist=['sunpy']) path = None for path in module.__path__: if os.path.exists(path): break else: raise ImportError( 'No module named {0!r} in the sunpy package'.format(modulename)) assert path is not None all_args = [] if coverage: print(path, modulename) all_args.extend(['--cov', path]) if cov_report: all_args.extend(['--cov-report', cov_report]) if online or remote_data or not offline: all_args.append('--remote-data') if not offline: all_args.append('-k remote_data') if not figure: all_args.append('-m not figure') # Hardcoded until we update this module all_args.append('-p no:warnings') all_args.append(path) if args: all_args.append(args) if verbose: all_args.append('-v') if parallel != 0: try: import xdist except ImportError: raise ImportError( 'Parallel testing requires the pytest-xdist plugin ' 'https://pypi.python.org/pypi/pytest-xdist') try: parallel = int(parallel) except ValueError: raise ValueError( "parallel must be an int, got {0}".format(parallel)) all_args.extend(['-n', str(parallel)]) return pytest.main(all_args) sunpy-0.8.3/sunpy/tests/coveragerc0000644000175000001440000000117113203275053016445 0ustar nabil00000000000000[run] source = sunpy omit = sunpy/_astropy_init* sunpy/conftest* sunpy/cython_version* sunpy/*setup* sunpy/*tests/* sunpy/version* sunpy/__init__* [report] exclude_lines = # Have to re-enable the standard pragma pragma: no cover # Don't complain about packages we have installed except ImportError # Don't complain if tests don't hit assertions raise AssertionError raise NotImplementedError # Don't complain about script hooks def main\(.*\): # Ignore branches that don't pertain to this version of Python pragma: py{ignore_python_version} six.PY{ignore_python_version} sunpy-0.8.3/sunpy/tests/figure_hashes_py27.json0000644000175000017500000000701113231613140021775 0ustar nabilnabil00000000000000{ "sunpy.map.tests.test_plotting.test_draw_contours_aia": "c5411773725ec088f80f9225a587b3151ee474e4dff65ed86aa813a40f3378dc", "sunpy.map.tests.test_plotting.test_draw_grid_aia171": "20ed4b00040ae5846b1c50a0c77a0a815f2cccd9efc9afed0b8242d16cc8d326", "sunpy.map.tests.test_plotting.test_heliographic_peek": "5bf47ea584be4ccf51f8205a9481d60d5b46fcfc6cfbbc4fbdd261c8d5c02ef6", "sunpy.map.tests.test_plotting.test_heliographic_rectangle": "a6298f15d8cc0090d5c34864933ee3e9d1ee09b271e5ab9a7ceb9e4f8fcd3ca6", "sunpy.map.tests.test_plotting.test_peek_aia171": "279fde911a24da747a9f16a5be7f436106aba4fb95ff76397f5c12424ddcfa9a", "sunpy.map.tests.test_plotting.test_peek_basic_plot_aia171": "f2f003960d71e5628892d04954b8d90a425f7de8810f6828f49ce15dca281c92", "sunpy.map.tests.test_plotting.test_peek_grid_aia171": "e64690246e0abdd7c3b41b7eacdf15e5efd82ac0af02c820155b5954a3f032fd", "sunpy.map.tests.test_plotting.test_peek_grid_limb_aia171": "ed2bce754a47f6b7115234c081ed9539c6a63871b97206b7df1b6aec205b9e47", "sunpy.map.tests.test_plotting.test_peek_grid_spacing_aia171": "9a83ddfe4d68cb6111de7050dc8c43ba725b1a9017c784dfa0d7dc746613afdd", "sunpy.map.tests.test_plotting.test_peek_limb_aia171": "621f086ce7bf1abd9c303d5e7050f63b77a80388773dbfb1fbc2206ff3aa22e4", "sunpy.map.tests.test_plotting.test_plot_aia171": "0d25061fdc1ad0167ad7fb7d56ba8f895df6f4a4c7178ae49fdbd45ed54707a7", "sunpy.map.tests.test_plotting.test_plot_aia171_nowcsaxes": "f0f335c59621718804227860171823408c64a4cfcb4e9451f8ffbbb0099351ce", "sunpy.map.tests.test_plotting.test_plot_aia171_superpixel": "382037489f7851a4fc0d08528942d8036d3cc2183472397fa87bd22450bc1fed", "sunpy.map.tests.test_plotting.test_plot_aia171_superpixel_nowcsaxes": "fb20a189bb4df2f09c5d534ab4de7b4277d72e51e1475a9f06501a10c29a1ba9", "sunpy.map.tests.test_plotting.test_plot_masked_aia171": "f99fe3abd2ae93bfd599fd2861025e66ecef8f255f586b315a970fb9b9f26e19", "sunpy.map.tests.test_plotting.test_plot_masked_aia171_nowcsaxes": "e853fdacec8d606fff106b3f5bcf92a07db00558a0e1f3a947022248a8e8f337", "sunpy.map.tests.test_plotting.test_plot_masked_aia171_superpixel": "7422778204438942b151e6df0f59857b6d398c3f70772821f121843b5a550415", "sunpy.map.tests.test_plotting.test_plot_masked_aia171_superpixel_nowcsaxes": "60532a3fbec7d151b74a83bf6e2488a764164595eeb24fc935567729d0d52dc4", "sunpy.map.tests.test_plotting.test_rectangle_aia171": "a71b04a82645b4793fc97f12c1655fd101572bdfdee1d2df60a601954f1fdd01", "sunpy.timeseries.tests.test_timeseriesbase.test_eve_peek": "ed39b8cfb4264b70e21e178e7bcecb5a11ea3d55c4fbd9a62a9ac71f1601d72c", "sunpy.timeseries.tests.test_timeseriesbase.test_fermi_gbm_peek": "daccdd2245dba424e4f6edc55fe0beed1842d36b66912050a7b3910c7b947449", "sunpy.timeseries.tests.test_timeseriesbase.test_generic_ts_peek": "69aefdc55c2a330c8d6752d9fd18b0d882da79d3f6f9fa047958217d50a80d0f", "sunpy.timeseries.tests.test_timeseriesbase.test_lyra_peek": "a3ff6b9481ead6756de4c4f0f0f7eacf6d0d39e25ed553bfa6818ce71fbf0d68", "sunpy.timeseries.tests.test_timeseriesbase.test_noaa_ind_peek": "dc8a633161599e0c9fb3cd6d5425d0f31b6c4e50dbe7a24e7469b3b8b8ccc742", "sunpy.timeseries.tests.test_timeseriesbase.test_noaa_pre_peek": "76739eb613572901474b2f573508ff27324a6183175ee3cb43e5b5c21b54999d", "sunpy.timeseries.tests.test_timeseriesbase.test_norh_peek": "f388fa1332a109404ed581464e882a24c46a51b54c9a481a57546a453b0fabfc", "sunpy.timeseries.tests.test_timeseriesbase.test_rhessi_peek": "c4b9ba470cd2840790ee72ddc20f587129cfdeabb21260a225ca3d369fb4f3ab" }sunpy-0.8.3/sunpy/tests/figure_hashes_py35.json0000644000175000017500000000701113231613140021774 0ustar nabilnabil00000000000000{ "sunpy.map.tests.test_plotting.test_draw_contours_aia": "c5411773725ec088f80f9225a587b3151ee474e4dff65ed86aa813a40f3378dc", "sunpy.map.tests.test_plotting.test_draw_grid_aia171": "20ed4b00040ae5846b1c50a0c77a0a815f2cccd9efc9afed0b8242d16cc8d326", "sunpy.map.tests.test_plotting.test_heliographic_peek": "5bf47ea584be4ccf51f8205a9481d60d5b46fcfc6cfbbc4fbdd261c8d5c02ef6", "sunpy.map.tests.test_plotting.test_heliographic_rectangle": "a6298f15d8cc0090d5c34864933ee3e9d1ee09b271e5ab9a7ceb9e4f8fcd3ca6", "sunpy.map.tests.test_plotting.test_peek_aia171": "279fde911a24da747a9f16a5be7f436106aba4fb95ff76397f5c12424ddcfa9a", "sunpy.map.tests.test_plotting.test_peek_basic_plot_aia171": "f2f003960d71e5628892d04954b8d90a425f7de8810f6828f49ce15dca281c92", "sunpy.map.tests.test_plotting.test_peek_grid_aia171": "e64690246e0abdd7c3b41b7eacdf15e5efd82ac0af02c820155b5954a3f032fd", "sunpy.map.tests.test_plotting.test_peek_grid_limb_aia171": "ed2bce754a47f6b7115234c081ed9539c6a63871b97206b7df1b6aec205b9e47", "sunpy.map.tests.test_plotting.test_peek_grid_spacing_aia171": "9a83ddfe4d68cb6111de7050dc8c43ba725b1a9017c784dfa0d7dc746613afdd", "sunpy.map.tests.test_plotting.test_peek_limb_aia171": "621f086ce7bf1abd9c303d5e7050f63b77a80388773dbfb1fbc2206ff3aa22e4", "sunpy.map.tests.test_plotting.test_plot_aia171": "0d25061fdc1ad0167ad7fb7d56ba8f895df6f4a4c7178ae49fdbd45ed54707a7", "sunpy.map.tests.test_plotting.test_plot_aia171_nowcsaxes": "f0f335c59621718804227860171823408c64a4cfcb4e9451f8ffbbb0099351ce", "sunpy.map.tests.test_plotting.test_plot_aia171_superpixel": "382037489f7851a4fc0d08528942d8036d3cc2183472397fa87bd22450bc1fed", "sunpy.map.tests.test_plotting.test_plot_aia171_superpixel_nowcsaxes": "fb20a189bb4df2f09c5d534ab4de7b4277d72e51e1475a9f06501a10c29a1ba9", "sunpy.map.tests.test_plotting.test_plot_masked_aia171": "f99fe3abd2ae93bfd599fd2861025e66ecef8f255f586b315a970fb9b9f26e19", "sunpy.map.tests.test_plotting.test_plot_masked_aia171_nowcsaxes": "e853fdacec8d606fff106b3f5bcf92a07db00558a0e1f3a947022248a8e8f337", "sunpy.map.tests.test_plotting.test_plot_masked_aia171_superpixel": "7422778204438942b151e6df0f59857b6d398c3f70772821f121843b5a550415", "sunpy.map.tests.test_plotting.test_plot_masked_aia171_superpixel_nowcsaxes": "60532a3fbec7d151b74a83bf6e2488a764164595eeb24fc935567729d0d52dc4", "sunpy.map.tests.test_plotting.test_rectangle_aia171": "a71b04a82645b4793fc97f12c1655fd101572bdfdee1d2df60a601954f1fdd01", "sunpy.timeseries.tests.test_timeseriesbase.test_eve_peek": "ed39b8cfb4264b70e21e178e7bcecb5a11ea3d55c4fbd9a62a9ac71f1601d72c", "sunpy.timeseries.tests.test_timeseriesbase.test_fermi_gbm_peek": "daccdd2245dba424e4f6edc55fe0beed1842d36b66912050a7b3910c7b947449", "sunpy.timeseries.tests.test_timeseriesbase.test_generic_ts_peek": "69aefdc55c2a330c8d6752d9fd18b0d882da79d3f6f9fa047958217d50a80d0f", "sunpy.timeseries.tests.test_timeseriesbase.test_lyra_peek": "a3ff6b9481ead6756de4c4f0f0f7eacf6d0d39e25ed553bfa6818ce71fbf0d68", "sunpy.timeseries.tests.test_timeseriesbase.test_noaa_ind_peek": "dc8a633161599e0c9fb3cd6d5425d0f31b6c4e50dbe7a24e7469b3b8b8ccc742", "sunpy.timeseries.tests.test_timeseriesbase.test_noaa_pre_peek": "76739eb613572901474b2f573508ff27324a6183175ee3cb43e5b5c21b54999d", "sunpy.timeseries.tests.test_timeseriesbase.test_norh_peek": "f388fa1332a109404ed581464e882a24c46a51b54c9a481a57546a453b0fabfc", "sunpy.timeseries.tests.test_timeseriesbase.test_rhessi_peek": "c4b9ba470cd2840790ee72ddc20f587129cfdeabb21260a225ca3d369fb4f3ab" }sunpy-0.8.3/sunpy/tests/hash.py0000644000175000017500000000414413231613140016706 0ustar nabilnabil00000000000000from __future__ import absolute_import, division, print_function from sys import version_info import os import io import hashlib import json import matplotlib.pyplot as plt HASH_LIBRARY_NAME = 'figure_hashes_py{0}{1}.json'.format(version_info.major, version_info.minor) # Load the hash library if it exists try: with open(os.path.join(os.path.dirname(__file__), HASH_LIBRARY_NAME)) as infile: hash_library = json.load(infile) except IOError: hash_library = {} def hash_figure(figure=None, out_stream=None): """ For a matplotlib.figure.Figure, returns the SHA256 hash as a hexadecimal string. Parameters ---------- figure : matplotlib.figure.Figure If None is specified, the current figure is used (as determined by matplotlib.pyplot.gcf()) out_stream : I/O stream (e.g., an open file) If not None, write a PNG of the figure to the stream Returns ------- out : string The SHA256 hash in hexadecimal representation """ if figure is None: figure = plt.gcf() if out_stream is None: imgdata = io.BytesIO() else: imgdata = out_stream figure.savefig(imgdata, format='png') imgdata.seek(0) buf = imgdata.read() if out_stream is None: imgdata.close() hasher = hashlib.sha256() hasher.update(buf) return hasher.hexdigest() def verify_figure_hash(name, figure=None): """ Verifies whether a figure has the same hash as the named hash in the current hash library. If the hash library does not contain the specified name, the hash is added to the library. Parameters ---------- name : string The identifier for the hash in the hash library figure : matplotlib.figure.Figure If None is specified, the current figure is used (as determined by matplotlib.pyplot.gcf()) Returns ------- out : bool False if the figure's hash does not match the named hash, otherwise True """ if name not in hash_library: hash_library[name] = hash_figure(figure) return True return hash_library[name] == hash_figure(figure) sunpy-0.8.3/sunpy/tests/helpers.py0000644000175000017500000000510613231613140017424 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- # Lovingly borrowed from Astropy # Licensed under a 3-clause BSD style license - see licences/ASTROPY.rst from __future__ import absolute_import, division, print_function import warnings import tempfile import platform import pytest import numpy as np import matplotlib.pyplot as plt import astropy.units as u from astropy.utils.decorators import wraps from sunpy.tests import hash __all__ = ['skip_windows', 'skip_glymur', 'skip_ana', 'warnings_as_errors'] # SunPy's JPEG2000 capabilities rely on the glymur library. First we check to # make sure that glymur imports correctly before proceeding. try: import glymur except ImportError: SKIP_GLYMUR = True else: # See if we have a C backend if any((glymur.lib.openjp2.OPENJP2, glymur.lib.openjpeg.OPENJPEG)): SKIP_GLYMUR = False else: SKIP_GLYMUR = True try: from sunpy.io import _pyana except ImportError as e: SKIP_ANA = True else: SKIP_ANA = False skip_windows = pytest.mark.skipif(platform.system() == 'Windows', reason="Windows") skip_glymur = pytest.mark.skipif(SKIP_GLYMUR, reason="Glymur can not be imported") skip_ana = pytest.mark.skipif(SKIP_ANA, reason="ANA is not available") @pytest.fixture def warnings_as_errors(request): warnings.simplefilter('error') request.addfinalizer(lambda *args: warnings.resetwarnings()) new_hash_library = {} figure_test_pngfiles = {} def figure_test(test_function): """ A decorator for a test that verifies the hash of the current figure or the returned figure, with the name of the test function as the hash identifier in the library. A PNG is also created with a temporary filename, with the lookup stored in the `figure_test_pngfiles` dictionary. All such decorated tests are marked with `pytest.mark.figure` for convenient filtering. Examples -------- @figure_test def test_simple_plot(): plt.plot([0,1]) """ @pytest.mark.figure @wraps(test_function) def wrapper(*args, **kwargs): plt.figure() name = "{0}.{1}".format(test_function.__module__, test_function.__name__) pngfile = tempfile.NamedTemporaryFile(delete=False) figure_hash = hash.hash_figure(test_function(*args, **kwargs), out_stream=pngfile) figure_test_pngfiles[name] = pngfile.name pngfile.close() new_hash_library[name] = figure_hash if name not in hash.hash_library: pytest.fail("Hash not present: {0}".format(name)) else: assert hash.hash_library[name] == figure_hash plt.close() return wrapper sunpy-0.8.3/sunpy/tests/mocks.py0000644000175000017500000001652013231613140017100 0ustar nabilnabil00000000000000""" Support for creating our own mocked objects Author: Michael Charlton """ import io from collections import MutableMapping, defaultdict class MockObject(MutableMapping): """ Object from which we can construct other 'mocked' objects. See following examples. Limitations ----------- On initiation a `ValueError` will be raised if any of the `kwargs` have the same name as an existing attribute/method of the `MockObject` or underlying data store. Updating existing attributes, or adding new ones, should only be done using bracket notation and *not* dot notation. Using dot notation will update the `MockObject` and not the data store. Examples -------- >>> mo = MockObject(code=400) >>> mo.code 400 >>> mo['code'] 400 >>> mo.code = 210 >>> mo.code 210 >>> mo['code'] 400 The recommended way of changing the value of an existing, or new, attribute is using bracket notation: >>> m = MockObject(start='now') >>> m['start'] = 'Thursday' >>> m['start'] 'Thursday' >>> m.start 'Thursday' """ def __init__(self, *args, **kwargs): self._datastore = dict() self.prohibited_attrs = set(dir(self)) self.prohibited_attrs.update(dir(self._datastore)) for candidate in kwargs.keys(): if candidate in self.prohibited_attrs: raise ValueError("kwarg '{kwarg}' is already an attribute " "of {datastore} or {obj}".format(kwarg=candidate, datastore=type(self._datastore), obj=type(self))) self.update(dict(*args, **kwargs)) def __getattr__(self, name): if name in self._datastore: return self._datastore[name] raise AttributeError(name) def __getitem__(self, name): return self._datastore[name] def __setitem__(self, name, value): if name in self.prohibited_attrs: raise ValueError("Name '{name}' is already an attribute " "of {datastore} or {obj}".format(name=name, datastore=type(self._datastore), obj=type(self))) self._datastore[name] = value def __delitem__(self, name): raise NotImplementedError("'del' operation for {0} " "not supported".format(self.__class__.__name__)) def __iter__(self): return iter(self._datastore) def __len__(self): return len(self._datastore) def __repr__(self): return ("<{module}.{name} {contents} at {address}>".format(module=self.__module__, name=self.__class__.__name__, contents=self._datastore, address=hex(id(self)))) class MockHTTPResponse(MockObject): """ The result of calling `urlopen(...)`. For this implementation we are only interested in querying the 'headers' attribute, which is a http.client.HTTPMessage object. Parameters ---------- url : `str` optional, default: '' The url of the connection headers : `dict` of `str` optional, default: empty dictionary HTTP header fields of the response message. Limitations ----------- On a 'real' http.client.HTTPMessage, header name retrieval is case insensitive. In this implementation the header names are case sensitive. Examples -------- >>> result = MockHTTPResponse(url='http://abc.com', headers={'Content-Type':'text/html'}) >>> result.headers.get('Content-Type') 'text/html' """ def __init__(self, *args, **kwargs): super(MockHTTPResponse, self).__init__(*args, **kwargs) self.setdefault('url', '') headers_store = defaultdict(lambda: None) if 'headers' in self: headers_store.update(self['headers']) self['headers'] = headers_store class MockOpenTextFile(MockObject): """ Partial implementation of a file like object for reading/wrtiing text files. Binary files are *not* supported. Many methods not implemented, no attempt is made to keep track of where we are in the file say in regards to any read operation. Parameters ---------- file : `str` optional, default:'UNKNOWN' The name of the file. As per the builtin `open` function mode : `str` optional, default:'r' The way in which the file is to be used. As per the builtin `open` function data : `str` optional keyword, default:'' The inital data which can be read from the file. Limitations ----------- Unlike in a real file, this implementation makes no attempt to keep track of where we are, when reading or writing. Examples -------- >>> dummy_read_only = MockOpenTextFile() >>> named_write = MockOpenTextFile(file='a.txt', mode='w') >>> named_read = MockOpenTextFile('b.txt') >>> named_rd_wr = MockOpenTextFile('c.txt', 'r+', data='Hello, world') """ def __init__(self, *args, **kwargs): # Positional and/or keword args can be used for the 'file' & 'mode' # parameters. Could do a lot more checking to make sure all required # arguments are present num_pos_args = len(args) if num_pos_args == 1: kwargs['file'] = args[0] elif num_pos_args == 2: kwargs['file'] = args[0] kwargs['mode'] = args[1] if 'mode' not in kwargs: kwargs['mode'] = 'r' super(MockOpenTextFile, self).__init__(**kwargs) self.setdefault('file', 'N/A') self['name'] = self['file'] self.setdefault('closed', False) self.setdefault('data', '') def write(self, content): if not self.writable(): raise io.UnsupportedOperation(':not writable') self.data += content return len(content) def read(self): if not self.readable(): raise io.UnsupportedOperation(': not readable') return self.data def readlines(self): if self.closed: raise ValueError('I/O operation on closed file') # Documentation recommends using '\n' as the line terminator when reading/writing text # files. See `os.linesep` in https://docs.python.org/3/library/os.html new_line = '\n' return ['{0}{1}'.format(line, new_line) for line in self.data.split(new_line)] def readable(self): if self.closed: raise ValueError('I/O operation on closed file') return 'r' in self.mode def writable(self): if self.closed: raise ValueError('I/O operation on closed file') return ('w' in self.mode) or ('r+' in self.mode) def close(self): self.closed = True self.data = '' def __repr__(self): return ("<{module}.{name} file '{file}' mode '{mode}' " "at {address}>".format(module=self.__module__, name=self.__class__.__name__, file=self.file, mode=self.mode, address=hex(id(self)))) sunpy-0.8.3/sunpy/tests/setup_command.py0000644000175000017500000001002413232043316020616 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- """ Created on Sat Jun 7 19:36:08 2014 @author: Stuart Mumford This file is designed to be imported and ran only via setup.py, hence it's dependency on astropy_helpers which will be available in that context. """ from __future__ import absolute_import, division, print_function import os from astropy_helpers.commands.test import AstropyTest from astropy_helpers.compat import _fix_user_options class SunPyTest(AstropyTest): description = 'Run the tests for this package' user_options = [ # Package to test ('package=', 'P', "The name of a specific package to test, e.g. 'io' or 'utils'. " "If nothing is specified, all default tests are run."), # Print all the things ('verbose-results', 'V', 'Turn on verbose output from pytest.'), # plugins to enable ('plugins=', 'p', 'Plugins to enable when running pytest.'), # Run online tests? ('online', 'R', 'Also run tests that do require a internet connection.'), # Run only online tests? ('online-only', None, 'Only run test that do require a internet connection.'), # Run tests that check figure generation ('figure', None, 'Run tests that compare figures against stored hashes.'), # Calculate test coverage ('coverage', 'c', 'Create a coverage report. Requires the coverage package.'), ('cov-report=', None, 'Specify the type of coverage report to generate. (Default terminal)'), # Run tests in parallel ('parallel=', 'j', 'Run the tests in parallel on the specified number of ' 'CPUs. If negative, all the cores on the machine will be ' 'used. Requires the pytest-xdist plugin.'), # Pass additional cli args to pytest ('args=', 'a', 'Additional arguments to be passed to pytest.') ] user_options = _fix_user_options(user_options) package_name = '' def initialize_options(self): self.package = '' #self.test_path = None self.verbose_results = False self.plugins = None self.args = None self.online = False self.online_only = False self.figure = False self.coverage = False self.cov_report = 'term' if self.coverage else None self.docs_path = os.path.abspath('docs') self.parallel = 0 self.temp_root = None def _validate_required_deps(self): """ This method checks that any required modules are installed before running the tests. """ try: import sunpy except ImportError: raise ImportError( "The 'test' command requires the sunpy package to be " "installed and importable.") def generate_testing_command(self): """ Build a Python script to run the tests. """ cmd_pre = '' # Commands to run before the test function cmd_post = '' # Commands to run after the test function if self.coverage: pre, post = self._generate_coverage_commands() cmd_pre += pre cmd_post += post online = self.online offline = not self.online_only cmd = ('{cmd_pre}{0}; import {1.package_name}, sys; result = (' '{1.package_name}.self_test(' 'modulename={1.package!r}, ' 'args={1.args!r}, ' 'verbose={1.verbose_results!r}, ' 'parallel={1.parallel!r}, ' 'online={online!r}, ' 'offline={offline!r}, ' 'figure={figure!r}, ' 'cov_report={1.cov_report!r})); ' '{cmd_post}' 'sys.exit(result)') x = cmd.format('pass', self, online=online, offline=offline, figure=self.figure, cmd_pre=cmd_pre, cmd_post=cmd_post) return x sunpy-0.8.3/sunpy/tests/setup_package.py0000644000175000017500000000022413231613140020571 0ustar nabilnabil00000000000000def get_package_data(): return { _ASTROPY_PACKAGE_NAME_ + '.tests': ['coveragerc', 'figure_hashes_py2.json', 'figure_hashes_py3.json']} sunpy-0.8.3/sunpy/time/0000755000175000017500000000000013232563477015224 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/time/tests/0000755000175000017500000000000013232563477016366 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/time/tests/__init__.py0000644000175000001440000000000013203275053017437 0ustar nabil00000000000000sunpy-0.8.3/sunpy/time/tests/test_julian.py0000644000175000001440000000677013210261730020240 0ustar nabil00000000000000from __future__ import absolute_import, division, print_function from datetime import datetime from numpy.testing import assert_almost_equal import pytest from sunpy.time import julian DATETIME_DATE_1 = datetime(1900, 1, 1, 12, 00, 0) STRING_DATE_1 = '1900/1/1 12:00:00' DATETIME_DATE_2 = datetime(1984, 11, 23, 14, 21, 5) STRING_DATE_2 = '1984/11/23 14:21:05' DATETIME_DATE_3 = datetime(2174, 2, 11, 5, 2, 0) STRING_DATE_3 = '2174/02/11 05:02:00' DATETIME_DATE_4 = datetime(814, 1, 28, 23, 59, 59) STRING_DATE_4 = '0814/01/28 23:59:59' LANDING = datetime(1966, 2, 3) def test__all__(): """should return __all__""" assert julian.__all__ == ["julian_day", "julian_centuries"] def test_julian_day(): assert julian.julian_day('1900-01-01 12:00') == 2415021.0 assert julian.julian_day(LANDING) == 2439159.5 result = julian.julian_day('2000-03-01 15:30:26') assert_almost_equal(result, 2451605.1461111, decimal=3) def test_julian_day1(): """should return julian day for date 1""" expected_day = 2415021.0 assert julian.julian_day(DATETIME_DATE_1) == expected_day assert julian.julian_day(STRING_DATE_1) == expected_day def test_julian_day2(): """should return julian day for date 2""" expected_day = 2446028.097974537 assert julian.julian_day(DATETIME_DATE_2) == expected_day assert julian.julian_day(STRING_DATE_2) == expected_day def test_julian_day3(): """should return julian day for date 3""" expected_day = 2515138.7097222223 assert julian.julian_day(DATETIME_DATE_3) == expected_day assert julian.julian_day(STRING_DATE_3) == expected_day def test_julian_day4(): """should return julian day for date 4""" expected_day = 2018395.499988426 assert julian.julian_day(DATETIME_DATE_4) == expected_day assert julian.julian_day(STRING_DATE_4) == expected_day def test_julian_day5(): """should raise value error when passed empty string""" pytest.raises(ValueError, julian.julian_day, '') def test_julian_day6(): """should raise value error when passed non-date string""" pytest.raises(ValueError, julian.julian_day, 'A lovely bunch of coconuts') def test_julian_centuries1(): """should return julian century for date 1""" expected_century = 2.7378507871321012e-05 assert julian.julian_centuries(DATETIME_DATE_1) == expected_century assert julian.julian_centuries(STRING_DATE_1) == expected_century def test_julian_centuries2(): """should return julian century for date 2""" expected_century = 0.8489554544705528 assert julian.julian_centuries(DATETIME_DATE_2) == expected_century assert julian.julian_centuries(STRING_DATE_2) == expected_century def test_julian_centuries3(): """should return julian century for date 3""" expected_century = 2.741100882196367 assert julian.julian_centuries(DATETIME_DATE_3) == expected_century assert julian.julian_centuries(STRING_DATE_3) == expected_century def test_julian_centuries4(): """should return julian century for date 4""" expected_century = -10.85898699552564 assert julian.julian_centuries(DATETIME_DATE_4) == expected_century assert julian.julian_centuries(STRING_DATE_4) == expected_century def test_julian_centuries5(): """should raise value error when passed empty string""" pytest.raises(ValueError, julian.julian_centuries, '') def test_julian_centuries6(): """should raise value error when passed non-date string""" pytest.raises(ValueError, julian.julian_centuries, 'Are you suggesting coconuts migrate?') sunpy-0.8.3/sunpy/time/tests/test_time.py0000644000175000017500000001751113231613140020720 0ustar nabilnabil00000000000000from __future__ import absolute_import, division, print_function from datetime import datetime from sunpy import time from sunpy.time import parse_time, is_time_in_given_format, get_day, find_time import astropy.time import numpy as np import pandas from sunpy.extern.six.moves import range import pytest LANDING = datetime(1966, 2, 3) def test_parse_time_24(): assert parse_time("2010-10-10T24:00:00") == datetime(2010, 10, 11) def test_parse_time_24_2(): assert parse_time("2010-10-10T24:00:00.000000") == datetime(2010, 10, 11) def test_parse_time_trailing_zeros(): # see issue #289 at https://github.com/sunpy/sunpy/issues/289 assert parse_time('2010-10-10T00:00:00.00000000') == datetime(2010, 10, 10) def test_parse_time_tuple(): assert parse_time((1966, 2, 3)) == LANDING def test_parse_time_int(): assert parse_time(765548612.0, 'utime') == datetime(2003, 4, 5, 12, 23, 32) assert parse_time(1009685652.0, 'utime') == datetime(2010, 12, 30, 4, 14, 12) def test_parse_time_pandas_timestamp(): ts = pandas.Timestamp(LANDING) dt = parse_time(ts) assert isinstance(dt, datetime) assert dt == LANDING def test_parse_time_pandas_series(): inputs = [datetime(2012, 1, i) for i in range(1, 13)] ind = pandas.Series(inputs) dts = parse_time(ind) assert isinstance(dts, np.ndarray) assert all([isinstance(dt, datetime) for dt in dts]) assert list(dts) == inputs def test_parse_time_pandas_index(): inputs = [datetime(2012, 1, i) for i in range(1, 13)] ind = pandas.DatetimeIndex(inputs) dts = parse_time(ind) assert isinstance(dts, np.ndarray) assert all([isinstance(dt, datetime) for dt in dts]) assert list(dts) == inputs def test_parse_time_numpy_date(): inputs = np.arange('2005-02', '2005-03', dtype='datetime64[D]') dts = parse_time(inputs) assert isinstance(dts, np.ndarray) assert all([isinstance(dt, datetime) for dt in dts]) def test_parse_time_numpy_datetime(): inputs = np.arange('2005-02-01T00', '2005-02-01T10', dtype='datetime64') dts = parse_time(inputs) assert isinstance(dts, np.ndarray) assert all([isinstance(dt, datetime) for dt in dts]) def test_parse_time_individual_numpy_datetime(): dt64 = np.datetime64('2005-02-01T00') dt = parse_time(dt64) assert isinstance(dt, datetime) def test_parse_time_astropy(): astropy_time = parse_time(astropy.time.Time(['2016-01-02T23:00:01'])) assert astropy_time == datetime(year=2016, month=1, day=2, hour=23, minute=0, second=1) def test_parse_time_now(): """ Ensure 'parse_time' can be called with 'now' argument to get utc """ # TODO: once mocking support is merged in, we can perform a like for like comparison, # the following at least ensures that 'now' is a legal argument. assert isinstance(parse_time('now'), datetime) is True def test_ISO(): assert parse_time('1966-02-03') == LANDING assert ( parse_time('1966-02-03T20:17:40') == datetime(1966, 2, 3, 20, 17, 40) ) assert ( parse_time('19660203T201740') == datetime(1966, 2, 3, 20, 17, 40) ) lst = [ ('2007-05-04T21:08:12.999999', datetime(2007, 5, 4, 21, 8, 12, 999999)), ('20070504T210812.999999', datetime(2007, 5, 4, 21, 8, 12, 999999)), ('2007/05/04 21:08:12.999999', datetime(2007, 5, 4, 21, 8, 12, 999999)), ('2007-05-04 21:08:12.999999', datetime(2007, 5, 4, 21, 8, 12, 999999)), ('2007/05/04 21:08:12', datetime(2007, 5, 4, 21, 8, 12)), ('2007-05-04 21:08:12', datetime(2007, 5, 4, 21, 8, 12)), ('2007-05-04 21:08', datetime(2007, 5, 4, 21, 8)), ('2007-05-04T21:08:12', datetime(2007, 5, 4, 21, 8, 12)), ('20070504T210812', datetime(2007, 5, 4, 21, 8, 12)), ('2007-May-04 21:08:12', datetime(2007, 5, 4, 21, 8, 12)), ('2007-May-04 21:08', datetime(2007, 5, 4, 21, 8)), ('2007-May-04', datetime(2007, 5, 4)), ('2007-05-04', datetime(2007, 5, 4)), ('2007/05/04', datetime(2007, 5, 4)), ('04-May-2007', datetime(2007, 5, 4)), ('04-May-2007 21:08:12.999999', datetime(2007, 5, 4, 21, 8, 12, 999999)), ('20070504_210812', datetime(2007, 5, 4, 21, 8, 12)), ('2007.05.04_21:08:12_TAI', datetime(2007, 5, 4, 21, 8, 12)), ] for k, v in lst: assert parse_time(k) == v def test_break_time(): t = datetime(2007, 5, 4, 21, 8, 12) assert time.break_time(t) == '20070504_210812' def test_day_of_year(): # Note that 2012 is a leap year, 2011 is a standard year # test that it starts at 1 assert time.day_of_year('2011/01/01') == 1.0 # test fractional day assert time.day_of_year('2011/01/01 06:00') == 1.25 assert time.day_of_year('2011/01/01 12:00') == 1.50 assert time.day_of_year('2011/01/01 18:00') == 1.75 # test correct number of days in a (standard) year assert time.day_of_year('2011/12/31') == 365 # test correct number of days in a (leap) year assert time.day_of_year('2012/12/31') == 366 # test a few extra dates in standard year assert time.day_of_year('2011/08/01') == 213 assert time.day_of_year('2011/04/10') == 100 assert time.day_of_year('2011/01/31') == 31 assert time.day_of_year('2011/09/30') == 273 # test a few extra dates in a leap year assert time.day_of_year('2012/08/01') == 214 assert time.day_of_year('2012/04/10') == 101 assert time.day_of_year('2012/01/31') == 31 assert time.day_of_year('2012/09/30') == 274 def test_time_string_parse_format(): assert parse_time('01/06/2012', _time_string_parse_format='%d/%m/%Y') == datetime(2012, 6, 1, 0, 0) assert parse_time('06/01/2012', _time_string_parse_format='%d/%m/%Y') == datetime(2012, 1, 6, 0, 0) assert parse_time('06/01/85', _time_string_parse_format='%d/%m/%y') == datetime(1985, 1, 6, 0, 0) assert parse_time('6/1/85', _time_string_parse_format='%d/%m/%y') == datetime(1985, 1, 6, 0, 0) with pytest.raises(ValueError): parse_time('01/06/2012') with pytest.raises(ValueError): parse_time('01/06/2012', time_string_parse_format='%d/%m/%m') with pytest.raises(ValueError): parse_time('2016', _time_string_parse_format='zz') def test__iter_empty(): class CountDown(object): def __init__(self, start_from=0): self.start = start_from def __iter__(self): return self def __next__(self): self.start -= 1 if self.start < 0: raise StopIteration return self.start next = __next__ # Support Py2.x one_count = CountDown(1) assert time.time._iter_empty(one_count) is False assert time.time._iter_empty(one_count) is True def test_is_time(): assert time.is_time(datetime.utcnow()) is True assert time.is_time('2017-02-14 08:08:12.999', "%Y-%m-%d %H:%M:%S.%f") is True assert time.is_time(None) is False assert time.is_time('2016-14-14 19:08', "%Y-%b-%d %H:%M:%S") is False def test_is_time_in_given_format(): assert is_time_in_given_format('2017-02-14 08:08:12.999', "%Y-%m-%d %H:%M:%S.%f") is True assert is_time_in_given_format('2017-02-14 08:08:12.999', "%Y-%m-%dT%H:%M:%S.%f") is False def test_get_day(): end_of_day = datetime(year=2017, month=1, day=1, hour=23, minute=59, second=59, microsecond=999) begining_of_day = get_day(end_of_day) assert begining_of_day.year == 2017 assert begining_of_day.month == 1 assert begining_of_day.day == 1 assert begining_of_day.hour == 0 assert begining_of_day.minute == 0 assert begining_of_day.second == 0 assert begining_of_day.microsecond == 0 sunpy-0.8.3/sunpy/time/tests/test_timerange.py0000644000175000017500000002024713231613140021735 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- from __future__ import absolute_import, division, print_function import datetime import pytest import astropy.units as u import sunpy.time from sunpy.extern.six.moves import zip tbegin_str = '2012/1/1' tfin_str = '2012/1/2' dt = u.Quantity(24 * 60 * 60, 's') start = sunpy.time.parse_time(tbegin_str) end = sunpy.time.parse_time(tfin_str) delta = end - start @pytest.mark.parametrize("inputs", [ (tbegin_str, tfin_str), (tbegin_str, dt), (tbegin_str, datetime.timedelta(days=1)) ]) def test_timerange_inputs(inputs): timerange = sunpy.time.TimeRange(*inputs) assert isinstance(timerange, sunpy.time.TimeRange) assert timerange.start == start assert timerange.end == end assert timerange.dt == delta def test_timerange_invalid_range(): """ TimeRange can expect a range of two times. if this is not the case then raise an exception """ lower = '2016/01/04 09:30' mid = '2016/06/04 09:30' upper = '2017/03/04 09:30' with pytest.raises(ValueError): sunpy.time.TimeRange((lower,)) with pytest.raises(ValueError): sunpy.time.TimeRange((lower, mid, upper)) def test_equals(): """ Test the __eq__ operator """ lower = '2016/01/04T09:30:00.000' upper = '2016/06/04T09:30:00.000' upper_plus_one_msec = '2016/06/04T09:30:00.001' tr = sunpy.time.TimeRange((lower, upper)) # This should *always* hold true assert tr == tr # Same values, different format tr_diff_format = sunpy.time.TimeRange('2016-01-04T09:30:00.000', '2016-06-04T09:30:00.000') assert tr == tr_diff_format lower_dt = datetime.datetime(year=2016, month=1, day=4, hour=9, minute=30, second=0) upper_dt = datetime.datetime(year=2016, month=6, day=4, hour=9, minute=30, second=0) tr_datetime = sunpy.time.TimeRange(lower_dt, upper_dt) assert tr == tr_datetime tr_plus_one_msec = sunpy.time.TimeRange((lower, upper_plus_one_msec)) assert (tr_plus_one_msec == tr) is False # Attempt using objects which are *not* TimeRanges assert (tr == lower_dt) is False assert (lower_dt == tr) is False def test_not_equals(): """ Test __ne__ operator """ a_st = '2016/01/04T09:30:00.000' a_et = '2016/06/04T09:30:00.000' b_st = '2017/01/04T09:30:00.000' b_et = '2017/06/04T09:30:00.000' # Same start time, different end times assert sunpy.time.TimeRange(a_st, a_et) != sunpy.time.TimeRange(a_st, b_et) # Different start times, same end times assert sunpy.time.TimeRange(b_st, b_et) != sunpy.time.TimeRange(a_st, b_et) # Different start & end times assert sunpy.time.TimeRange(a_st, a_et) != sunpy.time.TimeRange(b_st, b_et) # Different objects assert sunpy.time.TimeRange(a_st, a_et) != dict() assert list() != sunpy.time.TimeRange(a_st, a_et) def test_get_dates(): lower = '2016/01/04 09:30' lower_plus_one_day = '2016/01/05 09:30' upper = '2016/06/04 09:30' single_day = sunpy.time.TimeRange((lower, lower)) assert single_day.get_dates() == [datetime.date(2016, 1, 4)] two_days = sunpy.time.TimeRange((lower, lower_plus_one_day)) assert two_days.get_dates() == [datetime.date(2016, 1, 4), datetime.date(2016, 1, 5)] one_year = sunpy.time.TimeRange('2017/01/01', '2017-12-31') assert len(one_year.get_dates()) == 365 leap_year = sunpy.time.TimeRange('2016/01/01', '2016-12-31') assert len(leap_year.get_dates()) == 366 @pytest.mark.parametrize("ainput", [ (tbegin_str, tfin_str), (tbegin_str, dt), (tbegin_str, datetime.timedelta(days=1)), (sunpy.time.TimeRange(tbegin_str, tfin_str)) ]) def test_timerange_input(ainput): timerange = sunpy.time.TimeRange(ainput) assert isinstance(timerange, sunpy.time.TimeRange) assert timerange.start == start assert timerange.end == end assert timerange.dt == delta @pytest.mark.parametrize("ainput", [ (tbegin_str, tfin_str), (tfin_str, -dt), (tfin_str, tbegin_str) ]) def test_start_lessthan_end(ainput): """Test that the start and end time for a timerange is always in the right order""" timerange = sunpy.time.TimeRange(ainput) t1 = timerange.start t2 = timerange.end assert t1 < t2 assert timerange.start == start assert timerange.end == end @pytest.fixture def timerange_a(): return sunpy.time.TimeRange(tbegin_str, tfin_str) def test_center(timerange_a): assert timerange_a.center == datetime.datetime(year=2012, day=1, month=1, hour=12) def test_split(timerange_a): expect = [sunpy.time.TimeRange('2012/1/1T00:00:00', '2012/1/1T12:00:00'), sunpy.time.TimeRange('2012/1/1T12:00:00', '2012/1/2T00:00:00')] split = timerange_a.split(n=2) # Doing direct comparisons seem to not work assert all([wi.start == ex.start and wi.end == ex.end for wi, ex in zip(split, expect)]) def test_split_n_0_error(timerange_a): with pytest.raises(ValueError): timerange_a.split(n=0) def test_input_error(timerange_a): with pytest.raises(ValueError): sunpy.time.TimeRange((tbegin_str)) def test_window(timerange_a): timerange = sunpy.time.TimeRange(tbegin_str, tfin_str) window = timerange.window(u.Quantity(12 * 60 * 60, 's'), u.Quantity(10, 's')) expect = [sunpy.time.TimeRange('2012/1/1T00:00:00', '2012/1/1T00:00:10'), sunpy.time.TimeRange('2012/1/1T12:00:00', '2012/1/1T12:00:10'), sunpy.time.TimeRange('2012/1/2T00:00:00', '2012/1/2T00:00:10')] assert isinstance(window, list) # Doing direct comparisons seem to not work assert all([wi.start == ex.start and wi.end == ex.end for wi, ex in zip(window, expect)]) def test_window_timedelta(timerange_a): timerange = sunpy.time.TimeRange(tbegin_str, tfin_str) window = timerange.window(datetime.timedelta(hours=12), datetime.timedelta(seconds=10)) expect = [sunpy.time.TimeRange('2012/1/1T00:00:00', '2012/1/1T00:00:10'), sunpy.time.TimeRange('2012/1/1T12:00:00', '2012/1/1T12:00:10'), sunpy.time.TimeRange('2012/1/2T00:00:00', '2012/1/2T00:00:10')] assert isinstance(window, list) # Doing direct comparisons seem to not work assert all([wi.start == ex.start and wi.end == ex.end for wi, ex in zip(window, expect)]) def test_days(timerange_a): assert timerange_a.days == u.Quantity(1, 'd') def test_start(timerange_a): assert timerange_a.start == start def test_end(timerange_a): assert timerange_a.end == end def test_seconds(timerange_a): assert timerange_a.seconds == dt def test_minutes(timerange_a): assert timerange_a.minutes == u.Quantity(24 * 60, 'min') def test_hours(timerange_a): assert timerange_a.hours == u.Quantity(24, 'hour') def test_next(): timerange = sunpy.time.TimeRange(tbegin_str, tfin_str) timerange.next() assert isinstance(timerange, sunpy.time.TimeRange) assert timerange.start == start + delta assert timerange.end == end + delta assert timerange.dt == delta def test_previous(): timerange = sunpy.time.TimeRange(tbegin_str, tfin_str) timerange.previous() assert isinstance(timerange, sunpy.time.TimeRange) assert timerange.start == start - delta assert timerange.end == end - delta assert timerange.dt == delta def test_extend(): timerange = sunpy.time.TimeRange(tbegin_str, tfin_str) timerange.extend(delta, delta) assert isinstance(timerange, sunpy.time.TimeRange) assert timerange.start == start + delta assert timerange.end == end + delta assert timerange.dt == delta def test_contains(timerange_a): before = datetime.datetime(year=1990, month=1, day=1) after = datetime.datetime(year=2022, month=1, day=1) between = datetime.datetime(year=2014, month=5, day=4) timerange = sunpy.time.TimeRange('2014/05/03 12:00', '2014/05/05 21:00') assert between in timerange assert before not in timerange assert after not in timerange assert timerange.start in timerange assert timerange.end in timerange assert '2014/05/04 15:21' in timerange assert '1975/4/13' not in timerange assert '2100/1/1'not in timerange assert '2014/05/03 12:00' in timerange assert '2014/05/05 21:00' in timerange sunpy-0.8.3/sunpy/time/__init__.py0000644000175000001440000000025213210261730016301 0ustar nabil00000000000000"""Time related functionality""" from __future__ import absolute_import from sunpy.time.time import * from sunpy.time.timerange import * from sunpy.time.julian import * sunpy-0.8.3/sunpy/time/julian.py0000644000175000017500000000101413231613140017032 0ustar nabilnabil00000000000000from __future__ import absolute_import from astropy.time import Time from sunpy.time import parse_time __all__ = ['julian_day', 'julian_centuries'] def julian_day(t='now'): """ Wrap a UTC -> JD conversion from astropy. """ return Time(parse_time(t)).jd def julian_centuries(t='now'): """Returns the number of Julian centuries since J1900.0 (noon on 1900 January 0).""" DAYS_IN_JULIAN_CENTURY = 36525.0 # J1900.0 is 2415021.0 return (julian_day(t) - 2415020.0) / DAYS_IN_JULIAN_CENTURY sunpy-0.8.3/sunpy/time/time.py0000644000175000017500000002424513231613140016521 0ustar nabilnabil00000000000000from __future__ import absolute_import, division, print_function import re from datetime import datetime, date, time, timedelta import numpy as np import pandas from sunpy.extern import six import astropy.time __all__ = ['find_time', 'parse_time', 'is_time', 'day_of_year', 'break_time', 'get_day', 'is_time_in_given_format'] # Mapping of time format codes to regular expressions. REGEX = { '%Y': '(?P\d{4})', '%j': '(?P\d{3})', '%m': '(?P\d{1,2})', '%d': '(?P\d{1,2})', '%H': '(?P\d{1,2})', '%M': '(?P\d{1,2})', '%S': '(?P\d{1,2})', '%f': '(?P\d+)', '%b': '(?P[a-zA-Z]+)', } TIME_FORMAT_LIST = [ "%Y-%m-%dT%H:%M:%S.%f", # Example 2007-05-04T21:08:12.999999 "%Y/%m/%dT%H:%M:%S.%f", # Example 2007/05/04T21:08:12.999999 "%Y-%m-%dT%H:%M:%S.%fZ", # Example 2007-05-04T21:08:12.999Z "%Y-%m-%dT%H:%M:%S", # Example 2007-05-04T21:08:12 "%Y/%m/%dT%H:%M:%S", # Example 2007/05/04T21:08:12 "%Y%m%dT%H%M%S.%f", # Example 20070504T210812.999999 "%Y%m%dT%H%M%S", # Example 20070504T210812 "%Y/%m/%d %H:%M:%S", # Example 2007/05/04 21:08:12 "%Y/%m/%d %H:%M", # Example 2007/05/04 21:08 "%Y/%m/%d %H:%M:%S.%f", # Example 2007/05/04 21:08:12.999999 "%Y-%m-%d %H:%M:%S.%f", # Example 2007-05-04 21:08:12.999999 "%Y-%m-%d %H:%M:%S", # Example 2007-05-04 21:08:12 "%Y-%m-%d %H:%M", # Example 2007-05-04 21:08 "%Y-%b-%d %H:%M:%S", # Example 2007-May-04 21:08:12 "%Y-%b-%d %H:%M", # Example 2007-May-04 21:08 "%Y-%b-%d", # Example 2007-May-04 "%Y-%m-%d", # Example 2007-05-04 "%Y/%m/%d", # Example 2007/05/04 "%d-%b-%Y", # Example 04-May-2007 "%d-%b-%Y %H:%M:%S.%f", # Example 04-May-2007 21:08:12.999999 "%Y%m%d_%H%M%S", # Example 20070504_210812 "%Y:%j:%H:%M:%S", # Example 2012:124:21:08:12 "%Y:%j:%H:%M:%S.%f", # Example 2012:124:21:08:12.999999 "%Y%m%d%H%M%S", # Example 20140101000001 (JSOC / VSO) "%Y.%m.%d_%H:%M:%S_TAI", # Example 2016.05.04_21:08:12_TAI ] def _group_or_none(match, group, fun): try: ret = match.group(group) except IndexError: return None else: return fun(ret) def _n_or_eq(a, b): return a is None or a == b def _regex_parse_time(inp, format): # Parser for finding out the minute value so we can adjust the string # from 24:00:00 to 00:00:00 the next day because strptime does not # understand the former. for key, value in six.iteritems(REGEX): format = format.replace(key, value) match = re.match(format, inp) if match is None: return None, None try: hour = match.group("hour") except IndexError: return inp, timedelta(days=0) if match.group("hour") == "24": if not all( _n_or_eq(_group_or_none(match, g, int), 00) for g in ["minute", "second", "microsecond"] ): raise ValueError from_, to = match.span("hour") return inp[:from_] + "00" + inp[to:], timedelta(days=1) return inp, timedelta(days=0) def find_time(string, format): """ Return iterator of occurrences of date formatted with format in string. Currently supported format codes: """ re_format = format for key, value in six.iteritems(REGEX): re_format = re_format.replace(key, value) matches = re.finditer(re_format, string) for match in matches: try: matchstr = string[slice(*match.span())] dt = datetime.strptime(matchstr, format) except ValueError: continue else: yield dt find_time.__doc__ += ', '.join(list(REGEX.keys())) def _iter_empty(iter): try: next(iter) except StopIteration: return True return False def _astropy_time(time): """ Return an `~astropy.time.Time` instance, running it through `~sunpy.time.parse_time` if needed """ return time if isinstance(time, astropy.time.Time) else astropy.time.Time(parse_time(time)) def _parse_dt64(dt): """ Parse a single numpy datetime64 object """ # Validate (in an agnostic way) that we are getting a datetime rather than a date return datetime(*(dt.astype(datetime).timetuple()[:6])) def parse_time(time_string, time_format='', **kwargs): """Given a time string will parse and return a datetime object. Similar to the anytim function in IDL. utime -- Time since epoch 1 Jan 1979 Parameters ---------- time_string : [ int, float, time_string, datetime ] Date to parse which can be either time_string, int, datetime object. time_format : [ basestring, utime, datetime ] Specifies the format user has provided the time_string in. Returns ------- out : datetime DateTime corresponding to input date string Note: If time_string is an instance of float, then it is assumed to be in utime format. Examples -------- >>> import sunpy.time >>> sunpy.time.parse_time('2012/08/01') datetime.datetime(2012, 8, 1, 0, 0) >>> sunpy.time.parse_time('2005-08-04T00:01:02.000Z') datetime.datetime(2005, 8, 4, 0, 1, 2) """ if isinstance(time_string, pandas.Timestamp): return time_string.to_pydatetime() elif isinstance(time_string, pandas.Series) and 'datetime64' in str(time_string.dtype): return np.array([dt.to_pydatetime() for dt in time_string]) elif isinstance(time_string, pandas.DatetimeIndex): return time_string._mpl_repr() elif isinstance(time_string, datetime) or time_format == 'datetime': return time_string elif isinstance(time_string, date): return datetime.combine(time_string, time()) elif isinstance(time_string, tuple): return datetime(*time_string) elif time_format == 'utime' or isinstance(time_string, (int, float)): return datetime(1979, 1, 1) + timedelta(0, time_string) elif isinstance(time_string, np.datetime64): return _parse_dt64(time_string) elif isinstance(time_string, np.ndarray) and 'datetime64' in str(time_string.dtype): return np.array([_parse_dt64(dt) for dt in time_string]) elif time_string is 'now': return datetime.utcnow() elif isinstance(time_string, astropy.time.Time): return time_string.datetime else: # remove trailing zeros and the final dot to allow any # number of zeros. This solves issue #289 if '.' in time_string: time_string = time_string.rstrip("0").rstrip(".") for time_format in TIME_FORMAT_LIST: try: try: ts, time_delta = _regex_parse_time(time_string, time_format) except TypeError: break if ts is None: continue return datetime.strptime(ts, time_format) + time_delta except ValueError: pass time_string_parse_format = kwargs.pop('_time_string_parse_format', None) if time_string_parse_format is not None: ts, time_delta = _regex_parse_time(time_string, time_string_parse_format) if ts and time_delta: return datetime.strptime(ts, time_string_parse_format) + time_delta else: return datetime.strptime(time_string, time_string_parse_format) raise ValueError("'{tstr!s}' is not a valid time string!".format(tstr=time_string)) def is_time(time_string, time_format=''): """ Returns true if the input is a valid date/time representation Parameters ---------- time_string : [ int, float, time_string, datetime ] Date to parse which can be either time_string, int, datetime object. time_format : [ basestring, utime, datetime ] Specifies the format user has provided the time_string in. Returns ------- out : bool True if can be parsed by parse_time Notes ----- If time_string is an instance of float, then it is assumed to be in unix time format. Examples -------- >>> import sunpy.time >>> sunpy.time.parse_time('2012/08/01') datetime.datetime(2012, 8, 1, 0, 0) >>> sunpy.time.parse_time('2005-08-04T00:01:02.000Z') datetime.datetime(2005, 8, 4, 0, 1, 2) .. todo:: add ability to parse tai (International Atomic Time seconds since Jan 1, 1958) """ if time_string is None: return False elif isinstance(time_string, datetime): return True try: parse_time(time_string, time_format) except ValueError: return False else: return True def day_of_year(time_string): """Returns the (fractional) day of year. Parameters ---------- time_string : string A parse_time compatible string Returns ------- out : float The fractional day of year (where Jan 1st is 1). Examples -------- >>> import sunpy.time >>> sunpy.time.day_of_year('2012/01/01') 1.0 >>> sunpy.time.day_of_year('2012/08/01') 214.0 >>> sunpy.time.day_of_year('2005-08-04T00:18:02.000Z') 216.01252314814815 """ SECONDS_IN_DAY = 60 * 60 * 24.0 time = parse_time(time_string) time_diff = time - datetime(time.year, 1, 1, 0, 0, 0) return time_diff.days + time_diff.seconds / SECONDS_IN_DAY + 1 def break_time(t='now', time_format=''): """Given a time returns a string. Useful for naming files.""" # TODO: should be able to handle a time range return parse_time(t, time_format).strftime("%Y%m%d_%H%M%S") def get_day(dt): """ Return datetime for the beginning of the day of given datetime. """ return datetime(dt.year, dt.month, dt.day) def is_time_in_given_format(time_string, time_format): """Tests whether a time string is formatted according to the given time format.""" try: datetime.strptime(time_string, time_format) return True except ValueError: return False sunpy-0.8.3/sunpy/time/timerange.py0000644000175000017500000002730713231613140017540 0ustar nabilnabil00000000000000from __future__ import absolute_import, division, print_function from datetime import timedelta from datetime import datetime import astropy.units as u from sunpy.time import parse_time from sunpy import config from sunpy.extern.six.moves import range TIME_FORMAT = config.get('general', 'time_format') __all__ = ['TimeRange'] class TimeRange(object): """ An object to handle time ranges. .. note:: Regardless of how a TimeRange is constructed it will always provide a positive time range where the start time is before the end time. Parameters ---------- a : str, number, `datetime.datetime` A time (usually the start time) specified as a parse_time-compatible time string, number, or a datetime object. b : str, number, `datetime.datetime`, `datetime.timedelta`, `astropy.units.Quantity` (time) Another time (usually the end time) specified as a parse_time-compatible time string, number, or a datetime object. May also be the size of the time range specified as a timedelta object, or a `astropy.units.Quantity`. Examples -------- >>> from sunpy.time import TimeRange >>> time_range = TimeRange('2010/03/04 00:10', '2010/03/04 00:20') >>> time_range = TimeRange(('2010/03/04 00:10', '2010/03/04 00:20')) >>> import astropy.units as u >>> time_range = TimeRange('2010/03/04 00:10', 400 * u.s) >>> time_range = TimeRange('2010/03/04 00:10', 400 * u.day) """ def __init__(self, a, b=None): """Creates a new TimeRange instance""" # If a is a TimeRange object, copy attributes to new instance. self._t1 = None self._t2 = None if isinstance(a, TimeRange): self.__dict__ = a.__dict__.copy() return # Normalize different input types if b is None: x = parse_time(a[0]) if len(a) != 2: raise ValueError('If b is None a must have two elements') else: y = a[1] else: x = parse_time(a) y = b if isinstance(y, u.Quantity): y = timedelta(seconds=y.to('s').value) # Timedelta if isinstance(y, timedelta): if y.days >= 0: self._t1 = x self._t2 = x + y else: self._t1 = x + y self._t2 = x return # Otherwise, assume that the second argument is parse_time-compatible y = parse_time(y) if isinstance(y, datetime): if x < y: self._t1 = x self._t2 = y else: self._t1 = y self._t2 = x @property def start(self): """ Get the start time Returns ------- start : `datetime.datetime` """ return self._t1 @property def end(self): """ Get the end time Returns ------- end : `datetime.datetime` """ return self._t2 @property def dt(self): """ Get the length of the time range. Always a positive value. Returns ------- dt : `datetime.timedelta` """ return self._t2 - self._t1 @property def center(self): """ Gets the center of the TimeRange instance. Returns ------- value : `datetime.datetime` """ return self.start + self.dt // 2 @property def hours(self): """ Get the number of hours elapsed. Returns ------- value : `astropy.units.Quantity` """ return self._duration.to('hour') @property def days(self): """ Gets the number of days elapsed. Returns ------- value : `astropy.units.Quantity` """ return self._duration.to('d') @property def seconds(self): """ Gets the number of seconds elapsed. Returns ------- value : `astropy.units.Quantity` """ return self._duration.to('s') @property def minutes(self): """ Gets the number of minutes elapsed. Returns ------- value : `astropy.units.Quantity` """ return self._duration.to('min') @property def _duration(self): """ The duration of the time range. Returns ------- value : `astropy.units.Quantity` """ return self.dt.total_seconds() * u.s def __eq__(self, other): """ Check two TimeRange objects have the same start and end datetime. Parameters ---------- other : `~sunpy.time.timerange.TimeRange` The second TimeRange object to compare to. Returns ------- result : `bool` """ if isinstance(other, TimeRange): return (self.start == other.start) and (self.end == other.end) return NotImplemented def __ne__(self, other): """ Check two TimeRange objects have different start or end datetimes. Parameters ---------- other : `~sunpy.time.timerange.TimeRange` The second TimeRange object to compare to. Returns ------- result : `bool` """ if isinstance(other, TimeRange): return (self.start != other.start) or (self.end != other.end) return NotImplemented def __repr__(self): """ Returns a human-readable representation of the TimeRange instance. """ t1 = self.start.strftime(TIME_FORMAT) t2 = self.end.strftime(TIME_FORMAT) center = self.center.strftime(TIME_FORMAT) fully_qualified_name = '{0}.{1}'.format(self.__class__.__module__, self.__class__.__name__) return (' <{0} object at {1}>'.format(fully_qualified_name, hex(id(self))) + '\n Start:'.ljust(12) + t1 + '\n End:'.ljust(12) + t2 + '\n Center:'.ljust(12) + center + '\n Duration:'.ljust(12) + str(self.days.value) + ' days or' + '\n '.ljust(12) + str(self.hours.value) + ' hours or' + '\n '.ljust(12) + str(self.minutes.value) + ' minutes or' + '\n '.ljust(12) + str(self.seconds.value) + ' seconds' + '\n') def split(self, n=2): """ Splits the TimeRange into multiple equally sized parts. Parameters ---------- n : int The number of times to split the time range (must >= 1) Returns ------- time ranges: list An list of equally sized TimeRange objects between the start and end times. Raises ------ ValueError If requested amount is less than 1 """ if n <= 0: raise ValueError('n must be greater than or equal to 1') subsections = [] previous_time = self.start next_time = None for _ in range(n): next_time = previous_time + self.dt // n next_range = TimeRange(previous_time, next_time) subsections.append(next_range) previous_time = next_time return subsections def window(self, cadence, window): """ Split the TimeRange up into a series of TimeRange windows, 'window' long, between the start and end with a cadence of 'cadence'. Parameters ---------- cadence : `astropy.units.Quantity`, `datetime.timedelta` Cadence in seconds or a timedelta instance window : `astropy.units.quantity`, `datetime.timedelta` The length of the Time's, assumed to be seconds if int. Returns ------- time ranges : list A list of TimeRange objects, that are window long and separated by cadence. Examples -------- >>> import astropy.units as u >>> from sunpy.time import TimeRange >>> time_range = TimeRange('2010/03/04 00:10', '2010/03/04 01:20') >>> time_range.window(60*60*u.s, window=12*u.s) # doctest: +NORMALIZE_WHITESPACE +SKIP [ Start: 2010-03-04 00:10:00 End: 2010-03-04 00:10:12 Center:2010-03-04 00:10:06 Duration:0.0001388888888888889 days or 0.003333333333333333 hours or 0.2 minutes or 12.0 seconds, Start: 2010-03-04 01:10:00 End: 2010-03-04 01:10:12 Center:2010-03-04 01:10:06 Duration:0.0001388888888888889 days or 0.003333333333333333 hours or 0.2 minutes or 12.0 seconds, Start: 2010-03-04 02:10:00 End: 2010-03-04 02:10:12 Center:2010-03-04 02:10:06 Duration:0.0001388888888888889 days or 0.003333333333333333 hours or 0.2 minutes or 12.0 seconds] """ if not isinstance(window, timedelta): window = timedelta(seconds=window.to('s').value) if not isinstance(cadence, timedelta): cadence = timedelta(seconds=cadence.to('s').value) n = 1 times = [TimeRange(self.start, self.start + window)] while times[-1].end < self.end: times.append(TimeRange(self.start + cadence * n, self.start + cadence * n + window)) n += 1 return times def next(self): """Shift the time range forward by the amount of time elapsed""" dt = self.dt self._t1 = self._t1 + dt self._t2 = self._t2 + dt return self def previous(self): """Shift the time range backward by the amount of time elapsed""" dt = self.dt self._t1 = self._t1 - dt self._t2 = self._t2 - dt return self def extend(self, dt_start, dt_end): """Extend the time range forwards and backwards Parameters ---------- dt_start : `datetime.timedelta` The amount to shift the start time dt_end : `datetime.timedelta` The amount to shift the end time """ # Only a timedelta object is acceptable here self._t1 = self._t1 + dt_start self._t2 = self._t2 + dt_end def get_dates(self): """ Return all partial days contained within the timerange """ dates = [] dates = [self.start.date() + timedelta(days=i) for i in range(int(self.days.value) + 1)] return dates def __contains__(self, time): """ Checks whether the given time lies within this range. Both limits are inclusive (i.e. __contains__(t1) and __contains__(t2) always return true) Parameters ---------- time : `datetime.datetime`, str A parse_time-compatible time to be checked. Returns ------- value : bool True if time lies between start and end, False otherwise. Examples -------- >>> from sunpy.time import TimeRange >>> time1 = '2014/5/5 12:11' >>> time2 = '2012/5/5 12:11' >>> time_range = TimeRange('2014/05/04 13:54', '2018/02/03 12:12') >>> time1 in time_range True >>> time2 in time_range False """ this_time = parse_time(time) return this_time >= self.start and this_time <= self.end sunpy-0.8.3/sunpy/timeseries/0000755000175000017500000000000013232563477016437 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/timeseries/sources/0000755000175000017500000000000013232563477020122 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/timeseries/sources/__init__.py0000644000175000017500000000057413231613140022217 0ustar nabilnabil00000000000000"""Datasource-specific classes This is where datasource specific logic is implemented. Each mission should have its own file with one or more classes defined. Typically, these classes will be subclasses of the :mod`sunpy.TimeSeries` class. """ __all__ = ['rhessi', 'eve', 'goes', 'lyra', 'noaa', 'norh', 'fermi_gbm'] from . import eve, rhessi, goes, lyra, noaa, norh, fermi_gbm sunpy-0.8.3/sunpy/timeseries/sources/eve.py0000644000175000017500000001763713232563373021264 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- """EVE TimeSeries subclass definitions.""" from __future__ import absolute_import import os import codecs import numpy from datetime import datetime from collections import OrderedDict import matplotlib.pyplot as plt from pandas.io.parsers import read_csv from os.path import basename from sunpy.timeseries.timeseriesbase import GenericTimeSeries from sunpy.util.metadata import MetaDict from astropy import units as u __all__ = ['EVESpWxTimeSeries'] class EVESpWxTimeSeries(GenericTimeSeries): """ SDO EVE LightCurve for level 0CS data. The Extreme Ultraviolet Variability Experiment (EVE) is an instrument on board the Solar Dynamics Observatory (SDO). The EVE instrument is designed to measure the solar extreme ultraviolet (EUV) irradiance. The EUV radiation includes the 0.1-105 nm range, which provides the majority of the energy for heating Earth’s thermosphere and creating Earth’s ionosphere (charged plasma). EVE includes several irradiance instruments: The Multiple EUV Grating Spectrographs (MEGS)-A is a grazing- incidence spectrograph that measures the solar EUV irradiance in the 5 to 37 nm range with 0.1-nm resolution, and the MEGS-B is a normal-incidence, dual-pass spectrograph that measures the solar EUV irradiance in the 35 to 105 nm range with 0.1-nm resolution. Level 0CS data is primarily used for space weather. It is provided near real-time and is crudely calibrated 1-minute averaged broadband irradiances from ESP and MEGS-P broadband. Data is available starting on 2010/03/01. Examples -------- >>> import sunpy.timeseries >>> import sunpy.data.sample >>> eve = sunpy.timeseries.TimeSeries(sunpy.data.sample.EVE_TIMESERIES, source='EVE') >>> eve = sunpy.timeseries.TimeSeries("http://lasp.colorado.edu/eve/data_access/quicklook/quicklook_data/L0CS/LATEST_EVE_L0CS_DIODES_1m.txt", source='EVE') # doctest: +REMOTE_DATA >>> eve.peek(subplots=True) # doctest: +SKIP References ---------- * `SDO Mission Homepage `_ * `EVE Homepage `_ * `Level 0CS Definition `_ * `EVE Data Acess `_ * `Instrument Paper `_ """ # Class attribute used to specify the source class of the TimeSeries. _source = 'eve' def peek(self, column=None, **kwargs): """Plots the time series in a new figure. An example is shown below. .. plot:: import sunpy.timeseries from sunpy.data.sample import EVE_TIMESERIES eve = sunpy.timeseries.TimeSeries(EVE_TIMESERIES, source='eve') eve.peek(subplots=True) Parameters ---------- column : `str` The column to display. If None displays all. **kwargs : `dict` Any additional plot arguments that should be used when plotting. Returns ------- fig : `~matplotlib.Figure` A plot figure. """ # Check we have a timeseries valid for plotting self._validate_data_for_ploting() figure = plt.figure() # Choose title if none was specified if "title" not in kwargs and column is None: if len(self.data.columns) > 1: kwargs['title'] = 'EVE (1 minute data)' else: if self._filename is not None: base = self._filename.replace('_', ' ') kwargs['title'] = os.path.splitext(base)[0] else: kwargs['title'] = 'EVE Averages' if column is None: self.plot(**kwargs) else: data = self.data[column] if "title" not in kwargs: kwargs['title'] = 'EVE ' + column.replace('_', ' ') data.plot(**kwargs) figure.show() return figure @classmethod def _parse_file(cls, filepath): """Parses an EVE CSV file.""" cls._filename = basename(filepath) with codecs.open(filepath, mode='rb', encoding='ascii') as fp: # Determine type of EVE CSV file and parse line1 = fp.readline() fp.seek(0) if line1.startswith("Date"): return cls._parse_average_csv(fp) elif line1.startswith(";"): return cls._parse_level_0cs(fp) @staticmethod def _parse_average_csv(fp): """Parses an EVE Averages file.""" print('\nin _parse_average_csv()') return "", read_csv(fp, sep=",", index_col=0, parse_dates=True) @staticmethod def _parse_level_0cs(fp): """Parses and EVE Level 0CS file.""" is_missing_data = False #boolean to check for missing data missing_data_val = numpy.nan header = [] fields = [] line = fp.readline() # Read header at top of file while line.startswith(";"): header.append(line) if '; Missing data:' in line : is_missing_data = True missing_data_val = line.split(':')[1].strip() line = fp.readline() meta = MetaDict() for hline in header : if hline == '; Format:\n' or hline == '; Column descriptions:\n': continue elif ('Created' in hline) or ('Source' in hline): meta[hline.split(':', 1)[0].replace(';', ' ').strip()] = hline.split(':', 1)[1].strip() elif ':' in hline : meta[hline.split(':')[0].replace(';', ' ').strip()] = hline.split(':')[1].strip() fieldnames_start = False for hline in header: if hline.startswith("; Format:"): fieldnames_start = False if fieldnames_start: fields.append(hline.split(":")[0].replace(';', ' ').strip()) if hline.startswith("; Column descriptions:"): fieldnames_start = True # Next line is YYYY DOY MM DD date_parts = line.split(" ") year = int(date_parts[0]) month = int(date_parts[2]) day = int(date_parts[3]) # function to parse date column (HHMM) parser = lambda x: datetime(year, month, day, int(x[0:2]), int(x[2:4])) data = read_csv(fp, sep="\s*", names=fields, index_col=0, date_parser=parser, header=None, engine='python') if is_missing_data : #If missing data specified in header data[data == float(missing_data_val)] = numpy.nan # Add the units data units = OrderedDict([('XRS-B proxy', u.W/u.m**2), ('XRS-A proxy', u.W/u.m**2), ('SEM proxy', u.W/u.m**2), ('0.1-7ESPquad', u.W/u.m**2), ('17.1ESP', u.W/u.m**2), ('25.7ESP', u.W/u.m**2), ('30.4ESP', u.W/u.m**2), ('36.6ESP', u.W/u.m**2), ('darkESP', u.ct), ('121.6MEGS-P', u.W/u.m**2), ('darkMEGS-P', u.ct), ('q0ESP', u.dimensionless_unscaled), ('q1ESP', u.dimensionless_unscaled), ('q2ESP', u.dimensionless_unscaled), ('q3ESP', u.dimensionless_unscaled), ('CMLat', u.deg), ('CMLon', u.deg)]) # Todo: check units used. return data, meta, units @classmethod def is_datasource_for(cls, **kwargs): """Determines if header corresponds to an EVE image""" if kwargs.get('source', ''): return kwargs.get('source', '').lower().startswith(cls._source) sunpy-0.8.3/sunpy/timeseries/sources/fermi_gbm.py0000644000175000017500000001576713232563373022436 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- """FERMI GBM TimeSeries subclass definitions.""" from __future__ import absolute_import, print_function from collections import OrderedDict import numpy as np import matplotlib.pyplot as plt import pandas as pd import sunpy.io from sunpy.instr import fermi from sunpy.timeseries.timeseriesbase import GenericTimeSeries from sunpy.util.metadata import MetaDict from astropy import units as u __all__ = ['GBMSummaryTimeSeries'] class GBMSummaryTimeSeries(GenericTimeSeries): """ Fermi/GBM Summary Lightcurve TimeSeries. The Gamma-ray Burst Monitor (GBM) is an instrument aboard Fermi. It is meant to detect gamma-ray bursts but also detects solar flares. It consists of 12 Sodium Iodide (NaI) scintillation detectors and 2 Bismuth Germanate (BGO) scintillation detectors. The NaI detectors cover from a few keV to about 1 MeV and provide burst triggers and locations. The BGO detectors cover the energy range from about 150 keV to about 30 MeV. This summary lightcurve makes use of the CSPEC (daily version) data set which consists of the counts accumulated every 4.096 seconds in 128 energy channels for each of the 14 detectors. Note that the data is re-binned from the original 128 into the following 8 pre-determined energy channels. * 4-15 keV * 15-25 keV * 25-50 keV * 50-100 keV * 100-300 keV * 300-800 keV * 800-2000 keV Examples -------- >>> import sunpy.timeseries >>> import sunpy.data.sample >>> gbm = sunpy.timeseries.TimeSeries(sunpy.data.sample.GBM_TIMESERIES, source='GBMSummary') # doctest: +SKIP >>> gbm.peek() # doctest: +SKIP References ---------- * `Fermi Mission Homepage `_ * `Fermi GBM Homepage `_ * `Fermi Science Support Center `_ * `Fermi Data Product `_ * `GBM Instrument Papers `_ """ # Class attribute used to specify the source class of the TimeSeries. _source = 'gbmsummary' def peek(self, **kwargs): """Plots the GBM lightcurve TimeSeries. An example can be seen below. .. plot:: import sunpy.timeseries import sunpy.data.sample gbm = sunpy.timeseries.TimeSeries(sunpy.data.sample.GBM_TIMESERIES, source='GBMSummary') gbm.peek() Parameters ---------- **kwargs : `dict` Any additional plot arguments that should be used when plotting. Returns ------- fig : `~matplotlib.Figure` A plot figure. """ # Check we have a timeseries valid for plotting self._validate_data_for_ploting() figure = plt.figure() axes = plt.gca() data_lab = self.data.columns.values for d in data_lab: axes.plot(self.data.index, self.data[d], label=d) axes.set_yscale("log") axes.set_title('Fermi GBM Summary data ' + str(self.meta.get( 'DETNAM').values())) axes.set_xlabel('Start time: ' + self.data.index[0].strftime( '%Y-%m-%d %H:%M:%S UT')) axes.set_ylabel('Counts/s/keV') axes.legend() figure.autofmt_xdate() plt.show() return figure @classmethod def _parse_file(cls, filepath): """Parses GBM CSPEC FITS data files to create TimeSeries.""" hdus = sunpy.io.read_file(filepath) return cls._parse_hdus(hdus) @classmethod def _parse_hdus(cls, hdulist): header = MetaDict(OrderedDict(hdulist[0].header)) # these GBM files have three FITS extensions. # extn1 - this gives the energy range for each of the 128 energy bins # extn2 - this contains the data, e.g. counts, exposure time, time of observation # extn3 - eclipse times? energy_bins = hdulist[1].data count_data = hdulist[2].data misc = hdulist[3].data # rebin the 128 energy channels into some summary ranges # 4-15 keV, 15 - 25 keV, 25-50 keV, 50-100 keV, 100-300 keV, 300-800 keV, 800 - 2000 keV # put the data in the units of counts/s/keV summary_counts = _bin_data_for_summary(energy_bins, count_data) gbm_times = [] # get the time information in datetime format with the correct MET adjustment for t in count_data['time']: gbm_times.append(fermi.met_to_utc(t)) column_labels = ['4-15 keV', '15-25 keV', '25-50 keV', '50-100 keV', '100-300 keV', '300-800 keV', '800-2000 keV'] # Add the units data units = OrderedDict([('4-15 keV', u.ct / u.s / u.keV), ('15-25 keV', u.ct / u.s / u.keV), ('25-50 keV', u.ct / u.s / u.keV), ('50-100 keV', u.ct / u.s / u.keV), ('100-300 keV', u.ct / u.s / u.keV), ('300-800 keV', u.ct / u.s / u.keV), ('800-2000 keV', u.ct / u.s / u.keV)]) return pd.DataFrame(summary_counts, columns=column_labels, index=gbm_times), header, units @classmethod def is_datasource_for(cls, **kwargs): """Determines if the file corresponds to a GBM summary lightcurve timeseries""" # Check if source is explicitly assigned if 'source' in kwargs.keys(): if kwargs.get('source', ''): return kwargs.get('source', '').lower().startswith(cls._source) # Check if HDU defines the source instrument if 'meta' in kwargs.keys(): return kwargs['meta'].get('INSTRUME', '').startswith('GBM') def _bin_data_for_summary(energy_bins, count_data): """ Rebin the 128 energy channels into some summary ranges, 4-15 keV, 15-25 keV, 25-50 keV, 50-100 keV, 100-300 keV, 300-800 keV, 800 - 2000 keV and put the data in the units of counts/s/keV""" # find the indices corresponding to some standard summary energy bins ebands = [4, 15, 25, 50, 100, 300, 800, 2000] indices = [] for e in ebands: indices.append(np.searchsorted(energy_bins['e_max'], e)) summary_counts = [] for i in range(0, len(count_data['counts'])): counts_in_bands = [] for j in range(1, len(ebands)): counts_in_bands.append( np.sum(count_data['counts'][i][indices[j - 1]:indices[j]]) / (count_data['exposure'][i] * (energy_bins['e_max'][indices[j]] - energy_bins['e_min'][indices[j - 1]]))) summary_counts.append(counts_in_bands) return summary_counts def _parse_detector(detector): """Check and fix detector name strings.""" oklist = ['n0', 'n1', 'n2', 'n3', 'n4', 'n5', 'n6', 'n7', 'n8', 'n9', 'n10', 'n11'] altlist = [str(i) for i in range(12)] if detector in oklist: return detector elif detector in altlist: return 'n' + detector else: raise ValueError('Detector string could not be interpreted') sunpy-0.8.3/sunpy/timeseries/sources/goes.py0000644000175000017500000001675213232563373021437 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- """GOES XRS TimeSeries subclass definitions.""" from __future__ import absolute_import, print_function, division # pylint: disable=W0221,W0222,E1101,E1121 from collections import OrderedDict import datetime import matplotlib.dates from matplotlib import pyplot as plt import numpy as np from pandas import DataFrame import sunpy.io from sunpy.timeseries.timeseriesbase import GenericTimeSeries from sunpy.time import parse_time, TimeRange, is_time_in_given_format from sunpy.util.metadata import MetaDict from astropy import units as u __author__ = ["Alex Hamilton"] __email__ = "####" __all__ = ['XRSTimeSeries'] class XRSTimeSeries(GenericTimeSeries): """ GOES XRS Time Series Each GOES satellite there are two X-ray Sensors (XRS) which provide solar X ray fluxes for the wavelength bands of 0.5 to 4 Å (short channel) and 1 to 8 Å (long channel). Most recent data is usually available one or two days late. Data is available starting on 1981/01/01. Examples -------- >>> import sunpy.timeseries >>> import sunpy.data.sample >>> goes = sunpy.timeseries.TimeSeries(sunpy.data.sample.GOES_XRS_TIMESERIES) >>> goes.peek() # doctest: +SKIP References ---------- * `GOES Mission Homepage `_ * `GOES XRS Homepage `_ * `GOES XRS Guide `_ * `NASCOM Data Archive `_ Notes: http://umbra.nascom.nasa.gov/goes/fits/goes_fits_files_notes.txt """ # Class attribute used to specify the source class of the TimeSeries. _source = 'xrs' def peek(self, title="GOES Xray Flux"): """Plots GOES XRS light curve is the usual manner. An example is shown below. .. plot:: import sunpy.timeseries import sunpy.data.sample ts_goes = sunpy.timeseries.TimeSeries(sunpy.data.sample.GOES_XRS_TIMESERIES, source='XRS') ts_goes.peek() Parameters ---------- title : `str` The title of the plot. **kwargs : `dict` Any additional plot arguments that should be used when plotting. Returns ------- fig : `~matplotlib.Figure` A plot figure. """ # Check we have a timeseries valid for plotting self._validate_data_for_ploting() figure = plt.figure() axes = plt.gca() dates = matplotlib.dates.date2num(parse_time(self.data.index)) axes.plot_date(dates, self.data['xrsa'], '-', label='0.5--4.0 $\AA$', color='blue', lw=2) axes.plot_date(dates, self.data['xrsb'], '-', label='1.0--8.0 $\AA$', color='red', lw=2) axes.set_yscale("log") axes.set_ylim(1e-9, 1e-2) axes.set_title(title) axes.set_ylabel('Watts m$^{-2}$') axes.set_xlabel(datetime.datetime.isoformat(self.data.index[0])[0:10]) ax2 = axes.twinx() ax2.set_yscale("log") ax2.set_ylim(1e-9, 1e-2) ax2.set_yticks((1e-9, 1e-8, 1e-7, 1e-6, 1e-5, 1e-4, 1e-3, 1e-2)) ax2.set_yticklabels((' ', 'A', 'B', 'C', 'M', 'X', ' ')) axes.yaxis.grid(True, 'major') axes.xaxis.grid(False, 'major') axes.legend() # @todo: display better tick labels for date range (e.g. 06/01 - 06/05) formatter = matplotlib.dates.DateFormatter('%H:%M') axes.xaxis.set_major_formatter(formatter) axes.fmt_xdata = matplotlib.dates.DateFormatter('%H:%M') figure.autofmt_xdate() figure.show() return figure # ToDo: is this part of the DL pipeline? If so delete. @classmethod def _get_goes_sat_num(self, start, end): """Parses the query time to determine which GOES satellite to use.""" goes_operational = { 2: TimeRange('1980-01-04', '1983-05-01'), 5: TimeRange('1983-05-02', '1984-08-01'), 6: TimeRange('1983-06-01', '1994-08-19'), 7: TimeRange('1994-01-01', '1996-08-14'), 8: TimeRange('1996-03-21', '2003-06-19'), 9: TimeRange('1997-01-01', '1998-09-09'), 10: TimeRange('1998-07-10', '2009-12-02'), 11: TimeRange('2006-06-20', '2008-02-16'), 12: TimeRange('2002-12-13', '2007-05-09'), 13: TimeRange('2006-08-01', '2006-08-01'), 14: TimeRange('2009-12-02', '2010-11-05'), 15: TimeRange('2010-09-01', datetime.datetime.utcnow())} sat_list = [] for sat_num in goes_operational: if ((start >= goes_operational[sat_num].start and start <= goes_operational[sat_num].end and (end >= goes_operational[sat_num].start and end <= goes_operational[sat_num].end))): # if true then the satellite with sat_num is available sat_list.append(sat_num) if not sat_list: # if no satellites were found then raise an exception raise Exception('No operational GOES satellites within time range') else: return sat_list @classmethod def _parse_file(cls, filepath): """Parses a GOES/XRS FITS file from http://umbra.nascom.nasa.gov/goes/fits/""" hdus = sunpy.io.read_file(filepath) return cls._parse_hdus(hdus) @classmethod def _parse_hdus(cls, hdulist): header = MetaDict(OrderedDict(hdulist[0].header)) if len(hdulist) == 4: if is_time_in_given_format(hdulist[0].header['DATE-OBS'], '%d/%m/%Y'): start_time = datetime.datetime.strptime(hdulist[0].header['DATE-OBS'], '%d/%m/%Y') elif is_time_in_given_format(hdulist[0].header['DATE-OBS'], '%d/%m/%y'): start_time = datetime.datetime.strptime(hdulist[0].header['DATE-OBS'], '%d/%m/%y') else: raise ValueError("Date not recognized") xrsb = hdulist[2].data['FLUX'][0][:, 0] xrsa = hdulist[2].data['FLUX'][0][:, 1] seconds_from_start = hdulist[2].data['TIME'][0] elif 1 <= len(hdulist) <= 3: start_time = parse_time(header['TIMEZERO']) seconds_from_start = hdulist[0].data[0] xrsb = hdulist[0].data[1] xrsa = hdulist[0].data[2] else: raise ValueError("Don't know how to parse this file") times = [start_time + datetime.timedelta(seconds=int(np.floor(s)), microseconds=int((s - np.floor(s)) * 1e6)) for s in seconds_from_start] # remove bad values as defined in header comments xrsb[xrsb == -99999] = np.nan xrsa[xrsa == -99999] = np.nan # fix byte ordering newxrsa = xrsa.byteswap().newbyteorder() newxrsb = xrsb.byteswap().newbyteorder() data = DataFrame({'xrsa': newxrsa, 'xrsb': newxrsb}, index=times) data.sort_index(inplace=True) # Add the units units = OrderedDict([('xrsa', u.W/u.m**2), ('xrsb', u.W/u.m**2)]) return data, header, units @classmethod def is_datasource_for(cls, **kwargs): """Determines if header corresponds to a GOES lightcurve TimeSeries""" if 'source' in kwargs.keys(): if kwargs.get('source', ''): return kwargs.get('source', '').lower().startswith(cls._source) if 'meta' in kwargs.keys(): return kwargs['meta'].get('TELESCOP', '').startswith('GOES') sunpy-0.8.3/sunpy/timeseries/sources/lyra.py0000644000175000017500000001644713231613140021435 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- """Proba-2 TimeSeries subclass definitions.""" from __future__ import absolute_import, division, print_function import datetime import sys from collections import OrderedDict from matplotlib import pyplot as plt import pandas import sunpy.io from sunpy.timeseries.timeseriesbase import GenericTimeSeries from sunpy.time import parse_time from sunpy.util.metadata import MetaDict from sunpy import config from astropy import units as u TIME_FORMAT = config.get("general", "time_format") __all__ = ['LYRATimeSeries'] class LYRATimeSeries(GenericTimeSeries): """ Proba-2 LYRA Lightcurve TimeSeries. LYRA (Large Yield RAdiometer) is an ultraviolet irradiance radiometer that observes the Sun in four passbands, chosen for their relevance to solar physics, aeronomy and space weather. LYRA is composed of three (redundant) units, each of them constituted of the same four channels: * 120-123 nm Lyman-alpha channel * 190-222 nm Herzberg continuum channel * Aluminium filter channel (17-80 nm + a contribution below 5 nm), including He II at 30.4 nm * Zirconium filter channel (6-20 nm + a contribution below 2 nm), rejecting He II LYRA can take data with cadences chosen in the 100Hz to 0.1Hz interval. PROBA2 was launched on 2 November 2009. This class can hold either Level 2 data (the default) which has sub-second resolution or Level 3 which is the Level 2 data averaged to one minute cadence. The level can be specified with the ``level`` keyword argument to `~sunpy.lightcurve.LyraLightCurve.create`. Examples -------- >>> import sunpy.timeseries >>> import sunpy.data.sample >>> lyra = sunpy.timeseries.TimeSeries(sunpy.data.sample.LYRA_LEVEL3_TIMESERIES) >>> lyra.peek() # doctest: +SKIP References ---------- * `Proba2 SWAP Science Center `_ * `LYRA Data Homepage `_ * `LYRA Instrument Homepage `_ """ # Class attribute used to specify the source class of the TimeSeries. _source = 'lyra' def peek(self, names=3, **kwargs): """Plots the LYRA data. An example is shown below. .. plot:: import sunpy.timeseries import sunpy.data.sample lyra = sunpy.timeseries.TimeSeries(sunpy.data.sample.LYRA_LEVEL3_TIMESERIES, source='LYRA') lyra.peek() Parameters ---------- names : `int` The number of columns to plot. **kwargs : `dict` Any additional plot arguments that should be used when plotting. Returns ------- fig : `~matplotlib.Figure` A plot figure. """ # Check we have a timeseries valid for plotting self._validate_data_for_ploting() lyranames = (('Lyman alpha','Herzberg cont.','Al filter','Zr filter'), ('120-123nm','190-222nm','17-80nm + <5nm','6-20nm + <2nm')) # Choose title if none was specified #if not kwargs.has_key("title"): # if len(self.data.columns) > 1: # kwargs['title'] = 'LYRA data' # else: # if self._filename is not None: # base = self._filename # kwargs['title'] = os.path.splitext(base)[0] # else: # kwargs['title'] = 'LYRA data' figure = plt.figure() plt.subplots_adjust(left=0.17,top=0.94,right=0.94,bottom=0.15) axes = plt.gca() axes = self.data.plot(ax=axes, subplots=True, sharex=True, **kwargs) for i, name in enumerate(self.data.columns): if names < 3: name = lyranames[names][i] else: name = lyranames[0][i] + ' \n (' + lyranames[1][i] + ')' axes[i].set_ylabel( "{name} \n (W/m**2)".format(name=name), fontsize=9.5) axes[0].set_title("LYRA ({0:{1}})".format(self.data.index[0],TIME_FORMAT)) axes[-1].set_xlabel("Time") for axe in axes: axe.locator_params(axis='y',nbins=6) figure.show() return figure @classmethod def _parse_file(cls, filepath): """Parses Lyra FITS data files to create TimeSeries.""" hdus = sunpy.io.read_file(filepath) return cls._parse_hdus(hdus) @classmethod def _parse_hdus(cls, hdulist): """Parses LYRA HDU list from a FITS file""" # Open file with PyFITS fits_record = hdulist[1].data # secondary_header = hdulist[1].header # Start and end dates. Different LYRA FITS files have # different tags for the date obs. """ print(hdulist[0].header) if 'date-obs' in hdulist[0].header: start_str = hdulist[0].header['date-obs'] elif 'date_obs' in hdulist[0].header: start_str = hdulist[0].header['date_obs'] # end_str = hdulist[0].header['date-end'] """ metadata = MetaDict(OrderedDict(hdulist[0].header)) start_str = metadata.get('date-obs', metadata.get('date_obs', '')) # start = datetime.datetime.strptime(start_str, '%Y-%m-%dT%H:%M:%S.%f') start = parse_time(start_str) # end = datetime.datetime.strptime(end_str, '%Y-%m-%dT%H:%M:%S.%f') # First column are times. For level 2 data, the units are [s]. # For level 3 data, the units are [min] if hdulist[1].header['TUNIT1'] == 's': times = [start + datetime.timedelta(seconds=n) for n in fits_record.field(0)] elif hdulist[1].header['TUNIT1'] == 'MIN': times = [start + datetime.timedelta(minutes=int(n)) for n in fits_record.field(0)] else: raise ValueError("Time unit in LYRA fits file not recognised. " "Value = {0}".format(hdulist[1].header['TUNIT1'])) # Rest of columns are the data table = {} for i, col in enumerate(fits_record.columns[1:-1]): # temporary patch for big-endian data bug on pandas 0.13 if fits_record.field(i+1).dtype.byteorder == '>' and sys.byteorder =='little': table[col.name] = fits_record.field(i + 1).byteswap().newbyteorder() else: table[col.name] = fits_record.field(i + 1) # Return the header and the data data = pandas.DataFrame(table, index=times) data.sort_index(inplace=True) # Add the units data units = OrderedDict([('CHANNEL1', u.W/u.m**2), ('CHANNEL2', u.W/u.m**2), ('CHANNEL3', u.W/u.m**2), ('CHANNEL4', u.W/u.m**2)]) # ToDo: check: http://www.wmo-sat.info/oscar/instruments/view/733 return data, metadata, units @classmethod def is_datasource_for(cls, **kwargs): """Determines if the file corresponds to a LYRA LightCurve timeseries""" # Check if source is explicitly assigned if 'source' in kwargs.keys(): if kwargs.get('source', ''): return kwargs.get('source', '').lower().startswith(cls._source) # Check if HDU defines the source instrument if 'meta' in kwargs.keys(): return kwargs['meta'].get('INSTRUME', '').startswith('LYRA') sunpy-0.8.3/sunpy/timeseries/sources/noaa.py0000644000175000017500000002670513232563373021417 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- """NOAA Solar Cycle TimeSeries subclass definitions.""" from __future__ import absolute_import from collections import OrderedDict import datetime from matplotlib import pyplot as plt from pandas.io.parsers import read_csv import numpy as np from sunpy.timeseries.timeseriesbase import GenericTimeSeries from sunpy.util.metadata import MetaDict from astropy import units as u __all__ = ['NOAAIndicesTimeSeries', 'NOAAPredictIndicesTimeSeries'] class NOAAIndicesTimeSeries(GenericTimeSeries): """NOAA Solar Cycle monthly indices. Solar activity is measured by a number of different values. The NOAA Solar Weather Prediction Center (SWPC) publishes the following indices. All of these indices are also provided as a 13-month running smoothed value. * The SWO sunspot number is issued by the NOAA Space Weather Prediction Center (SWPC) * The RI sunspot number is the official International Sunspot Number and is issued by the `Solar Influence Data Analysis Center (SDIC) `_ in Brussels, Belgium. * The ratio between the SWO and RI indices. * Radio flux at 10.7 cm is produced by `Penticon/Ottawa `_ and the units are in sfu. * The Ap Geomagnetic Index is produced by the United States Air Force (USAF). Examples -------- >>> import sunpy.timeseries >>> import sunpy.data.sample >>> noaa = sunpy.timeseries.TimeSeries(sunpy.data.sample.NOAAINDICES_TIMESERIES, source='NOAAIndices') >>> noaa.peek() # doctest: +SKIP References ---------- * `Solar and Geomagnetic Indices Data Archive `_ * `Recent solar indices `_ * `Indices Descriptions `_ * `NOAA plots of Solar Cycle Progression `_ * `NOAA Product List `_ """ # Class attribute used to specify the source class of the TimeSeries. _source = 'noaaindices' def peek(self, type='sunspot SWO', **plot_args): """Plots NOAA Indices as a function of time. An example is shown below. .. plot:: import sunpy.timeseries import sunpy.data.sample noaa = sunpy.timeseries.TimeSeries(sunpy.data.sample.NOAAINDICES_TIMESERIES, source='NOAAIndices') noaa.peek() Parameters ---------- type : `str` The type of plot required. **plot_args : `dict` Any additional plot arguments that should be used when plotting. Returns ------- fig : `~matplotlib.Figure` A plot figure. """ # Check we have a timeseries valid for plotting self._validate_data_for_ploting() figure = plt.figure() axes = plt.gca() if type == 'sunspot SWO': axes = self.data['sunspot SWO'].plot() self.data['sunspot SWO smooth'].plot() axes.set_ylabel('Sunspot Number') if type == 'sunspot RI': axes = self.data['sunspot RI'].plot() self.data['sunspot RI smooth'].plot() axes.set_ylabel('Sunspot Number') if type == 'sunspot compare': axes = self.data['sunspot RI'].plot() self.data['sunspot SWO'].plot() axes.set_ylabel('Sunspot Number') if type == 'radio': axes = self.data['radio flux'].plot() self.data['radio flux smooth'].plot() axes.set_ylabel('Radio Flux [sfu]') if type == 'geo': axes = self.data['geomagnetic ap'].plot() self.data['geomagnetic ap smooth'].plot() axes.set_ylabel('Geomagnetic AP Index') axes.set_ylim(0) axes.set_title('Solar Cycle Progression') axes.yaxis.grid(True, 'major') axes.xaxis.grid(True, 'major') axes.legend() figure.show() return figure @classmethod def _parse_file(cls, filepath): """Parses an NOAA indices csv file""" """ header = [] with open(filepath, 'r') as fp: line = fp.readline() # Read header at top of file while line.startswith((":", "#")): header += line line = fp.readline() fields = ('yyyy', 'mm', 'sunspot SWO', 'sunspot RI', 'sunspot ratio', 'sunspot SWO smooth', 'sunspot RI smooth', 'radio flux', 'radio flux smooth', 'geomagnetic ap', 'geomagnetic smooth') data = read_csv(fp, delim_whitespace=True, names = fields, comment='#', dtype={'yyyy':np.str, 'mm':np.str}) data = data.dropna(how='any') timeindex = [datetime.datetime.strptime(x + y, '%Y%m') for x,y in zip(data['yyyy'], data['mm'])] data['time']=timeindex data = data.set_index('time') data = data.drop('mm',1) data = data.drop('yyyy',1) return data, {'comments': header} """ header = [] with open(filepath, 'r') as fp: line = fp.readline() # Read header at top of file while line.startswith((":", "#")): header += line line = fp.readline() fields = ('yyyy', 'mm', 'sunspot SWO', 'sunspot RI', 'sunspot ratio', 'sunspot SWO smooth', 'sunspot RI smooth', 'radio flux', 'radio flux smooth', 'geomagnetic ap', 'geomagnetic smooth') data = read_csv(fp, delim_whitespace=True, names = fields, comment='#', dtype={'yyyy':np.str, 'mm':np.str}) data = data.dropna(how='any') timeindex = [datetime.datetime.strptime(x + y, '%Y%m') for x,y in zip(data['yyyy'], data['mm'])] data['time']=timeindex data = data.set_index('time') data = data.drop('mm',1) data = data.drop('yyyy',1) # Add the units data units = OrderedDict([('sunspot SWO', u.dimensionless_unscaled), ('sunspot RI', u.dimensionless_unscaled), ('sunspot ratio', u.dimensionless_unscaled), ('sunspot SWO smooth', u.dimensionless_unscaled), ('sunspot RI smooth', u.dimensionless_unscaled), ('radio flux', u.W/u.m**2), ('radio flux smooth', u.W/u.m**2), ('geomagnetic ap', u.dimensionless_unscaled), ('geomagnetic smooth', u.dimensionless_unscaled)]) # Todo: check units # Todo: fix header/meta, it's returning rubbish. return data, MetaDict({'comments': header}), units @classmethod def is_datasource_for(cls, **kwargs): """Determines if header corresponds to an NOAA indices timeseries""" if kwargs.get('source', ''): return kwargs.get('source', '').lower().startswith(cls._source) class NOAAPredictIndicesTimeSeries(GenericTimeSeries): """NOAA Solar Cycle Predicted Progression The predictions are updated monthly and are produced by ISES. Observed values are initially the preliminary values which are replaced with the final values as they become available. The following predicted values are available. * The predicted RI sunspot number is the official International Sunspot Number and is issued by the `Solar Influence Data Analysis Center (SDIC) `_ in Brussels, Belgium. * The predicted radio flux at 10.7 cm is produced by `Penticon/Ottawa `_ and the units are in sfu. Examples -------- >>> import sunpy.timeseries >>> import sunpy.data.sample >>> noaa = sunpy.timeseries.TimeSeries(sunpy.data.sample.NOAAPREDICT_TIMESERIES, source='NOAAPredictIndices') >>> noaa.peek() # doctest: +SKIP References ---------- * `Solar and Geomagnetic Indices Data Archive `_ * `Predicted solar indices `_ * `NOAA plots of Solar Cycle Progression `_ * `NOAA Product List `_ """ # Class attribute used to specify the source class of the TimeSeries. _source = 'noaapredictindices' def peek(self, **plot_args): """Plots predicted NOAA Indices as a function of time. An example is shown below. .. plot:: import sunpy.timeseries import sunpy.data.sample noaa = sunpy.timeseries.TimeSeries(sunpy.data.sample.NOAAPREDICT_TIMESERIES, source='NOAAPredictIndices') noaa.peek() Parameters ---------- **plot_args : `dict` Any additional plot arguments that should be used when plotting. Returns ------- fig : `~matplotlib.Figure` A plot figure. """ # Check we have a timeseries valid for plotting self._validate_data_for_ploting() figure = plt.figure() axes = plt.gca() axes = self.data['sunspot'].plot(color='b') self.data['sunspot low'].plot(linestyle='--', color='b') self.data['sunspot high'].plot(linestyle='--', color='b') axes.set_ylim(0) axes.set_title('Solar Cycle Sunspot Number Prediction') axes.set_ylabel('Sunspot Number') # axes.set_xlabel(datetime.datetime.isoformat(self.data.index[0])[0:10]) axes.yaxis.grid(True, 'major') axes.xaxis.grid(True, 'major') axes.legend() figure.show() return figure @staticmethod def _parse_file(filepath): """Parses an NOAA indices csv file""" header = '' with open(filepath, 'r') as fp: line = fp.readline() # Read header at top of file while line.startswith((":", "#")): header += line line = fp.readline() fields = ('yyyy', 'mm', 'sunspot', 'sunspot low', 'sunspot high', 'radio flux', 'radio flux low', 'radio flux high') data = read_csv(filepath, delim_whitespace=True, names = fields, comment='#', skiprows=2, dtype={'yyyy':np.str, 'mm':np.str}) data = data.dropna(how='any') timeindex = [datetime.datetime.strptime(x + y, '%Y%m') for x,y in zip(data['yyyy'], data['mm'])] data['time']=timeindex data = data.set_index('time') data = data.drop('mm',1) data = data.drop('yyyy',1) # Add the units data units = OrderedDict([('sunspot', u.dimensionless_unscaled), ('sunspot low', u.dimensionless_unscaled), ('sunspot high', u.dimensionless_unscaled), ('radio flux', u.W/u.m**2), ('radio flux low', u.W/u.m**2), ('radio flux high', u.W/u.m**2)]) # Todo: check units used. return data, MetaDict({'comments': header}), units @classmethod def is_datasource_for(cls, **kwargs): """Determines if header corresponds to an NOAA predict indices timeseries""" if kwargs.get('source', ''): return kwargs.get('source', '').lower().startswith(cls._source) sunpy-0.8.3/sunpy/timeseries/sources/norh.py0000644000175000017500000001151313231613140021421 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- """Nobeyama Radioheliograph TimeSeries subclass definitions.""" from __future__ import absolute_import import datetime import pandas import numpy as np import matplotlib.pyplot as plt from collections import OrderedDict import astropy.units as u import sunpy.io from sunpy import config from sunpy.time import parse_time from sunpy.util.metadata import MetaDict from sunpy.timeseries.timeseriesbase import GenericTimeSeries TIME_FORMAT = config.get("general", "time_format") __all__ = ['NoRHTimeSeries'] class NoRHTimeSeries(GenericTimeSeries): """ Nobeyama Radioheliograph Correlation Lightcurve TimeSeries. Nobeyama Radioheliograph (NoRH) is a radio telescope dedicated to observing the Sun. It consists of 84 parabolic antennas with 80 cm diameter, sitting on lines of 490 m long in the east/west and of 220 m long in the north/south. It observes the full solar disk at 17 GHz and 34 GHz with a temporal resolution down to 0.1 second resolution (typically 1 s). It is located in Japan at `35.941667, 138.475833 `_. Its first observation was in April, 1992 and daily 8-hour observations are available starting June, 1992. Examples -------- >>> import sunpy.data.sample >>> import sunpy.timeseries >>> norh = sunpy.timeseries.TimeSeries(sunpy.data.sample.NORH_TIMESERIES, source='NoRH') >>> norh.peek() # doctest: +SKIP References ---------- * `Nobeyama Radioheliograph Homepage `_ * `Analysis Manual `_ * `Nobeyama Correlation Plots `_ """ # Class attribute used to specify the source class of the TimeSeries. _source = 'norh' def __init__(self, data, header, units, **kwargs): super(NoRHTimeSeries, self).__init__(data, header, units, **kwargs) def peek(self, **kwargs): """ Plots the NoRH lightcurve TimeSeries .. plot:: import sunpy.data.sample import sunpy.timeseries norh = sunpy.timeseries.TimeSeries(sunpy.data.sample.NORH_TIMESERIES, source='NoRH') norh.peek() Parameters ---------- **kwargs : `dict` Any additional plot arguments that should be used when plotting. Returns ------- fig : `~matplotlib.Figure` A plot figure. """ # Check we have a timeseries valid for plotting self._validate_data_for_ploting() figure = plt.figure() axes = plt.gca() data_lab = str(self.meta.get('OBS-FREQ').values()).replace('[', '').replace( ']', '').replace('\'', '') axes.plot(self.data.index, self.data, label=data_lab) axes.set_yscale("log") axes.set_ylim(1e-4, 1) axes.set_title('Nobeyama Radioheliograph') axes.set_xlabel('Start time: ' + self.data.index[0].strftime(TIME_FORMAT)) axes.set_ylabel('Correlation') axes.legend() plt.show() return figure @classmethod def _parse_file(cls, filepath): """This method parses NoRH tca and tcz correlation FITS files.""" hdus = sunpy.io.read_file(filepath) return cls._parse_hdus(hdus) @classmethod def _parse_hdus(cls, hdulist): """This method parses NoRH tca and tcz correlation FITS files.""" header = MetaDict(OrderedDict(hdulist[0].header)) # For these NoRH files, the time series data is recorded in the primary # HDU data = hdulist[0].data # No explicit time array in FITS file, so construct the time array from # the FITS header obs_start_time = parse_time(header['DATE-OBS'] + 'T' + header['CRVAL1']) length = len(data) cadence = np.float(header['CDELT1']) sec_array = np.linspace(0, length - 1, int(length / cadence)) norh_time = [] for s in sec_array: norh_time.append(obs_start_time + datetime.timedelta(0, s)) # Add the units data units = OrderedDict([('Correlation Coefficient', u.dimensionless_unscaled)]) # Todo: check units used. return pandas.DataFrame( data, index=norh_time, columns=('Correlation Coefficient', )), header, units @classmethod def is_datasource_for(cls, **kwargs): """Determines if header corresponds to a Nobeyama Radioheliograph Correlation lightcurve""" if 'source' in kwargs.keys(): if kwargs.get('source', ''): return kwargs.get('source', '').lower().startswith(cls._source) if 'meta' in kwargs.keys(): return kwargs['meta'].get('ORIGIN', '').startswith('NOBEYAMA RADIO OBS') sunpy-0.8.3/sunpy/timeseries/sources/rhessi.py0000644000175000017500000001273513232563373021774 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- """RHESSI TimeSeries subclass definitions.""" from __future__ import absolute_import from collections import OrderedDict import datetime import matplotlib.dates import matplotlib.pyplot as plt from pandas import DataFrame from sunpy.timeseries.timeseriesbase import GenericTimeSeries from sunpy.util.metadata import MetaDict from sunpy.instr import rhessi import sunpy.io from astropy import units as u __all__ = ['RHESSISummaryTimeSeries'] class RHESSISummaryTimeSeries(GenericTimeSeries): """ RHESSI X-ray Summary Lightcurve TimeSeries. The RHESSI mission consists of a single spin-stabilized spacecraft in a low-altitude orbit inclined 38 degrees to the Earth's equator. The only instrument on board is a set of 9 Germanium spectrometers with the ability to obtain high fidelity solar spectra from X rays (down to 3 keV) to gamma rays (1 MeV). Each spectrometer is coupled to a set of grids with different pitches which enable fourier-style imaging as the spacecraft spins. RHESSI provides summary lightcurves in the following passbands * 3 - 6 keV * 6 - 12 keV * 12 - 25 keV * 25 - 50 keV * 50 - 100 keV * 100 - 300 keV * 300 - 800 keV * 800 - 7000 keV * 7000 - 20000 keV RHESSI was launched on 5 February 2002. Examples -------- >>> import sunpy.data.sample >>> import sunpy.timeseries >>> rhessi = sunpy.timeseries.TimeSeries(sunpy.data.sample.RHESSI_TIMESERIES) >>> rhessi.peek() # doctest: +SKIP References ---------- * RHESSI Homepage ``_ * Mission Paper ``_ """ # Class attribute used to specify the source class of the TimeSeries. _source = 'rhessi' def peek(self, title="RHESSI Observing Summary Count Rate", **kwargs): """Plots RHESSI Count Rate light curve. An example is shown below. .. plot:: import sunpy.data.sample import sunpy.timeseries rhessi = sunpy.timeseries.TimeSeries(sunpy.data.sample.RHESSI_TIMESERIES, source='RHESSI') rhessi.peek() Parameters ---------- title : `str` The title of the plot. **kwargs : `dict` Any additional plot arguments that should be used when plotting. Returns ------- fig : `~matplotlib.Figure` A plot figure. """ # Check we have a timeseries valid for plotting self._validate_data_for_ploting() figure = plt.figure() axes = plt.gca() #dates = matplotlib.dates.date2num(self.data.index) lc_linecolors = rhessi.hsi_linecolors() for lc_color, (item, frame) in zip(lc_linecolors, self.data.iteritems()): axes.plot_date(self.data.index, frame.values, '-', label=item, lw=2, color=lc_color) axes.set_yscale("log") axes.set_xlabel(datetime.datetime.isoformat(self.data.index[0])[0:10]) axes.set_title('RHESSI Observing Summary Count Rates') axes.set_ylabel('Count Rate s$^{-1}$ detector$^{-1}$') axes.yaxis.grid(True, 'major') axes.xaxis.grid(False, 'major') axes.legend() # @todo: display better tick labels for date range (e.g. 06/01 - 06/05) formatter = matplotlib.dates.DateFormatter('%H:%M') axes.xaxis.set_major_formatter(formatter) axes.fmt_xdata = matplotlib.dates.DateFormatter('%H:%M') figure.autofmt_xdate() figure.show() @classmethod def _parse_file(cls, filepath): """Parses rhessi FITS data files to create TimeSeries.""" #header, d, hdus = rhessi.parse_obssumm_file(filepath) hdus = sunpy.io.read_file(filepath) return cls._parse_hdus(hdus) @classmethod def _parse_hdus(cls, hdulist): """Parses a RHESSI FITS HDU list form a FITS file.""" header, d = rhessi.parse_obssumm_hdulist(hdulist) header = MetaDict(OrderedDict(header)) data = DataFrame(d['data'], columns=d['labels'], index=d['time']) # Add the units data units = OrderedDict([('3 - 6 keV', u.ct / u.s / u.Unit('detector')), ('6 - 12 keV', u.ct / u.s / u.Unit('detector')), ('12 - 25 keV', u.ct / u.s / u.Unit('detector')), ('25 - 50 keV', u.ct / u.s / u.Unit('detector')), ('50 - 100 keV', u.ct / u.s / u.Unit('detector')), ('100 - 300 keV', u.ct / u.s / u.Unit('detector')), ('300 - 800 keV', u.ct / u.s / u.Unit('detector')), ('800 - 7000 keV', u.ct / u.s / u.Unit('detector')), ('7000 - 20000 keV', u.ct / u.s / u.Unit('detector'))]) # Todo: check units used. http://hesperia.gsfc.nasa.gov/ssw/hessi/doc/guides/hessi_data_access.htm return data, header, units @classmethod def is_datasource_for(cls, **kwargs): """Determines if the file corresponds to a RHESSI X-ray Summary lightcurve""" # Check if source is explicitly assigned if 'source' in kwargs.keys(): if kwargs.get('source', ''): return kwargs.get('source', '').lower().startswith(cls._source) # Check if HDU defines the source instrument if 'meta' in kwargs.keys(): return kwargs['meta'].get('telescop', '').startswith('HESSI') sunpy-0.8.3/sunpy/timeseries/tests/0000755000175000017500000000000013232563477017601 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/timeseries/tests/__init__.py0000644000175000017500000000000013231613140021656 0ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/timeseries/tests/test_timeseries_factory.py0000644000175000017500000005013413231613140025073 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- """ Created on Thu Jun 23 12:08:21 2016 @author: alex_ """ import os import glob import pytest import datetime import numpy as np from pandas import DataFrame from collections import OrderedDict import sunpy.data.test import sunpy.timeseries from sunpy.util.metadata import MetaDict import sunpy.io from sunpy.util.datatype_factory_base import NoMatchError import astropy.units as u from astropy.table import Table from astropy.time import Time from astropy.io import fits # ============================================================================== # TimeSeries Factory Tests # ============================================================================== filepath = sunpy.data.test.rootdir eve_filepath = os.path.join(filepath, 'EVE_L0CS_DIODES_1m_truncated.txt') fermi_gbm_filepath = os.path.join(filepath, 'gbm.fits') norh_filepath = os.path.join(filepath, 'tca110810_truncated') lyra_filepath = os.path.join(filepath, 'lyra_20150101-000000_lev3_std_truncated.fits.gz') rhessi_filepath = os.path.join(filepath, 'hsi_obssumm_20120601_018_truncated.fits.gz') noaa_ind_filepath = os.path.join(filepath, 'RecentIndices_truncated.txt') noaa_pre_filepath = os.path.join(filepath, 'predicted-sunspot-radio-flux_truncated.txt') goes_filepath_com = os.path.join(filepath, 'go1520120601.fits.gz') goes_filepath = os.path.join(filepath, 'go1520110607.fits') a_list_of_many = glob.glob(os.path.join(filepath, "eve", "*")) # ============================================================================== # Multi file Tests # ============================================================================== class TestTimeSeries(object): def test_factory_concatenate_same_source(self): # Test making a TimeSeries that is the concatenation of multiple files ts_from_list = sunpy.timeseries.TimeSeries(a_list_of_many, source='EVE', concatenate=True) assert isinstance(ts_from_list, sunpy.timeseries.sources.eve.EVESpWxTimeSeries) ts_from_folder = sunpy.timeseries.TimeSeries(os.path.join(filepath, "eve"), source='EVE', concatenate=True) assert isinstance(ts_from_folder, sunpy.timeseries.sources.eve.EVESpWxTimeSeries) # text the two methods get identical dataframes assert ts_from_list == ts_from_folder # test the frames have correct headings/keys (correct concatenation axis) ts_from_list.columns == sunpy.timeseries.TimeSeries(a_list_of_many[0], source='EVE', concatenate=True).columns def test_factory_concatenate_different_source(self): # Test making a TimeSeries that is the concatenation of multiple files ts_from_list = sunpy.timeseries.TimeSeries(a_list_of_many, source='EVE', concatenate=True) assert isinstance(ts_from_list, sunpy.timeseries.sources.eve.EVESpWxTimeSeries) ts_from_folder = sunpy.timeseries.TimeSeries(os.path.join(filepath, "eve"), source='EVE', concatenate=True) assert isinstance(ts_from_folder, sunpy.timeseries.sources.eve.EVESpWxTimeSeries) # text the two methods get identical dataframes assert ts_from_list == ts_from_folder # test the frames have correct headings/keys (correct concatenation axis) ts_from_list.columns == sunpy.timeseries.TimeSeries(a_list_of_many[0], source='EVE', concatenate=True).columns def test_factory_generate_list_of_ts(self): # Test making a list TimeSeries from multiple files ts_list = sunpy.timeseries.TimeSeries(a_list_of_many, source='EVE') assert isinstance(ts_list, list) for ts in ts_list: assert isinstance(ts, sunpy.timeseries.sources.eve.EVESpWxTimeSeries) def test_factory_generate_from_glob(self): # Test making a TimeSeries from a glob ts_from_glob = sunpy.timeseries.TimeSeries(os.path.join(filepath, "eve", "*"), source='EVE', concatenate=True) assert isinstance(ts_from_glob, sunpy.timeseries.sources.eve.EVESpWxTimeSeries) #============================================================================== # Individual Implicit Source Tests #============================================================================== def test_implicit_fermi_gbm(self): # Test a GBMSummary TimeSeries ts_gbm = sunpy.timeseries.TimeSeries(fermi_gbm_filepath) assert isinstance(ts_gbm, sunpy.timeseries.sources.fermi_gbm.GBMSummaryTimeSeries) def test_implicit_norh(self): # Test a NoRH TimeSeries ts_norh = sunpy.timeseries.TimeSeries(norh_filepath) assert isinstance(ts_norh, sunpy.timeseries.sources.norh.NoRHTimeSeries) def test_implicit_goes(self): # Test a GOES TimeSeries ts_goes = sunpy.timeseries.TimeSeries(goes_filepath) assert isinstance(ts_goes, sunpy.timeseries.sources.goes.XRSTimeSeries) def test_implicit_goes_com(self): # Test a GOES TimeSeries ts_goes = sunpy.timeseries.TimeSeries(goes_filepath_com) assert isinstance(ts_goes, sunpy.timeseries.sources.goes.XRSTimeSeries) def test_implicit_lyra(self): # Test a LYRA TimeSeries ts_lyra = sunpy.timeseries.TimeSeries(lyra_filepath) assert isinstance(ts_lyra, sunpy.timeseries.sources.lyra.LYRATimeSeries) def test_implicit_rhessi(self): # Test a RHESSI TimeSeries ts_rhessi = sunpy.timeseries.TimeSeries(rhessi_filepath) assert isinstance(ts_rhessi, sunpy.timeseries.sources.rhessi.RHESSISummaryTimeSeries) #============================================================================== # Individual Explicit Sources Tests #============================================================================== def test_eve(self): #Test an EVE TimeSeries ts_eve = sunpy.timeseries.TimeSeries(eve_filepath, source='EVE') assert isinstance(ts_eve, sunpy.timeseries.sources.eve.EVESpWxTimeSeries) def test_fermi_gbm(self): #Test a GBMSummary TimeSeries ts_gbm = sunpy.timeseries.TimeSeries(fermi_gbm_filepath, source='GBMSummary') assert isinstance(ts_gbm, sunpy.timeseries.sources.fermi_gbm.GBMSummaryTimeSeries) def test_norh(self): #Test a NoRH TimeSeries ts_norh = sunpy.timeseries.TimeSeries(norh_filepath, source='NoRH') assert isinstance(ts_norh, sunpy.timeseries.sources.norh.NoRHTimeSeries) def test_goes(self): #Test a GOES TimeSeries ts_goes = sunpy.timeseries.TimeSeries(goes_filepath, source='XRS') assert isinstance(ts_goes, sunpy.timeseries.sources.goes.XRSTimeSeries) def test_goes_com(self): #Test a GOES TimeSeries ts_goes = sunpy.timeseries.TimeSeries(goes_filepath_com, source='XRS') assert isinstance(ts_goes, sunpy.timeseries.sources.goes.XRSTimeSeries) def test_lyra(self): #Test a LYRA TimeSeries ts_lyra = sunpy.timeseries.TimeSeries(lyra_filepath, source='LYRA') assert isinstance(ts_lyra, sunpy.timeseries.sources.lyra.LYRATimeSeries) def test_rhessi(self): #Test a RHESSI TimeSeries ts_rhessi = sunpy.timeseries.TimeSeries(rhessi_filepath, source='RHESSI') assert isinstance(ts_rhessi, sunpy.timeseries.sources.rhessi.RHESSISummaryTimeSeries) def test_noaa_ind(self): #Test a NOAAPredictIndices TimeSeries ts_noaa_ind = sunpy.timeseries.TimeSeries(noaa_ind_filepath, source='NOAAIndices') assert isinstance(ts_noaa_ind, sunpy.timeseries.sources.noaa.NOAAIndicesTimeSeries) def test_noaa_pre(self): #Test a NOAAIndices TimeSeries ts_noaa_pre = sunpy.timeseries.TimeSeries(noaa_pre_filepath, source='NOAAPredictIndices') assert isinstance(ts_noaa_pre, sunpy.timeseries.sources.noaa.NOAAPredictIndicesTimeSeries) #============================================================================== # Manual TimeSeries Tests #============================================================================== def test_meta_from_fits_header(self): # Generate the data and the corrisponding dates base = datetime.datetime.today() times = [base - datetime.timedelta(minutes=x) for x in range(0, 24 * 60)] intensity = np.sin(np.arange(0, 12 * np.pi, ((12 * np.pi) / (24*60)))) data = DataFrame(intensity, index=times, columns=['intensity']) # Use a FITS file HDU using sunpy.io hdulist = sunpy.io.read_file(goes_filepath) meta = hdulist[0].header meta_md = MetaDict(OrderedDict(meta)) ts_hdu_meta = sunpy.timeseries.TimeSeries(data, meta) ts_md_meta = sunpy.timeseries.TimeSeries(data, meta_md) assert ts_hdu_meta == ts_md_meta # Use a FITS file HDU using astropy.io hdulist = fits.open(goes_filepath) meta = hdulist[0].header hdulist.close() meta_md = MetaDict(sunpy.io.header.FileHeader(meta)) ts_hdu_meta = sunpy.timeseries.TimeSeries(data, meta) ts_md_meta = sunpy.timeseries.TimeSeries(data, meta_md) assert ts_hdu_meta == ts_md_meta def test_generic_construction_basic(self): # Generate the data and the corrisponding dates base = datetime.datetime.today() times = [base - datetime.timedelta(minutes=x) for x in range(0, 24 * 60)] intensity = np.sin(np.arange(0, 12 * np.pi, ((12 * np.pi) / (24*60)))) # Create the data DataFrame, header MetaDict and units OrderedDict data = DataFrame(intensity, index=times, columns=['intensity']) units = OrderedDict([('intensity', u.W/u.m**2)]) meta = MetaDict({'key':'value'}) # Create normal TS from dataframe and check ts_generic = sunpy.timeseries.TimeSeries(data, meta, units) assert isinstance(ts_generic, sunpy.timeseries.timeseriesbase.GenericTimeSeries) assert ts_generic.columns == ['intensity'] assert ts_generic.units == units assert ts_generic.meta.metadata[0][2] == meta # Create TS using a tuple of values ts_tuple = sunpy.timeseries.TimeSeries(((data, meta, units),)) assert isinstance(ts_tuple, sunpy.timeseries.timeseriesbase.GenericTimeSeries) assert ts_generic == ts_tuple def test_generic_construction_basic_omitted_details(self): # Generate the data and the corrisponding dates base = datetime.datetime.today() times = [base - datetime.timedelta(minutes=x) for x in range(0, 24 * 60)] intensity = np.sin(np.arange(0, 12 * np.pi, ((12 * np.pi) / (24*60)))) # Create the data DataFrame, header MetaDict and units OrderedDict data = DataFrame(intensity, index=times, columns=['intensity']) units = OrderedDict([('intensity', u.W/u.m**2)]) meta = MetaDict({'key':'value'}) # Create TS omitting units input arguments ts_1 = sunpy.timeseries.TimeSeries(data, meta) assert isinstance(ts_1, sunpy.timeseries.timeseriesbase.GenericTimeSeries) assert ts_1.columns == ['intensity'] assert ts_1.units == OrderedDict([('intensity', u.dimensionless_unscaled)]) assert ts_1.meta.metadata[0][2] == meta ts_2 = sunpy.timeseries.TimeSeries(data, units) assert isinstance(ts_2, sunpy.timeseries.timeseriesbase.GenericTimeSeries) assert ts_2.columns == ['intensity'] assert ts_2.units == units assert ts_2.meta.metadata[0][2] == MetaDict() def test_generic_construction_basic_different_meta_types(self): # Generate the data and the corrisponding dates base = datetime.datetime.today() times = [base - datetime.timedelta(minutes=x) for x in range(0, 24 * 60)] intensity = np.sin(np.arange(0, 12 * np.pi, ((12 * np.pi) / (24*60)))) # Create the data DataFrame, header MetaDict and units OrderedDict data = DataFrame(intensity, index=times, columns=['intensity']) units = OrderedDict([('intensity', u.W/u.m**2)]) meta_md = MetaDict({'key':'value'}) meta_di = {'key':'value'} meta_od = OrderedDict({'key':'value'}) # Create TS using different dictionary meta types ts_md = sunpy.timeseries.TimeSeries(data, meta_md, units) ts_di = sunpy.timeseries.TimeSeries(data, meta_di, units) ts_od = sunpy.timeseries.TimeSeries(data, meta_od, units) assert ts_md == ts_di == ts_od assert ts_md.meta.metadata[0][2] == ts_di.meta.metadata[0][2] == ts_od.meta.metadata[0][2] def test_generic_construction_ts_list(self): # Generate the data and the corrisponding dates base = datetime.datetime.today() times = [base - datetime.timedelta(minutes=x) for x in range(0, 24 * 60)] intensity1 = np.sin(np.arange(0, 12 * np.pi, ((12 * np.pi) / (24*60)))) intensity2 = np.sin(np.arange(0, 12 * np.pi, ((12 * np.pi) / (24*60)))) # Create the data DataFrame, header MetaDict and units OrderedDict data = DataFrame(intensity1, index=times, columns=['intensity']) data2 = DataFrame(intensity2, index=times, columns=['intensity2']) units = OrderedDict([('intensity', u.W/u.m**2)]) units2 = OrderedDict([('intensity', u.W/u.m**2)]) meta = MetaDict({'key':'value'}) meta2 = MetaDict({'key2':'value2'}) # Create TS individually ts_1 = sunpy.timeseries.TimeSeries(data, meta, units) ts_2 = sunpy.timeseries.TimeSeries(data2, meta2, units2) # Create TS list using ts_list = sunpy.timeseries.TimeSeries(data, meta, units, data2, meta2, units2) assert isinstance(ts_list, list) assert len(ts_list) == 2 assert ts_list[0] == ts_1 assert ts_list[1] == ts_2 # Create TS using a tuple ts_list2 = sunpy.timeseries.TimeSeries(((data, meta, units),(data2, meta2, units2))) assert ts_list == ts_list2 def test_generic_construction_concatenation(self): # Generate the data and the corrisponding dates base = datetime.datetime.today() times = [base - datetime.timedelta(minutes=x) for x in range(0, 24 * 60)] intensity1 = np.sin(np.arange(0, 12 * np.pi, ((12 * np.pi) / (24*60)))) intensity2 = np.sin(np.arange(0, 12 * np.pi, ((12 * np.pi) / (24*60)))) # Create the data DataFrame, header MetaDict and units OrderedDict data = DataFrame(intensity1, index=times, columns=['intensity']) data2 = DataFrame(intensity2, index=times, columns=['intensity2']) units = OrderedDict([('intensity', u.W/u.m**2)]) units2 = OrderedDict([('intensity', u.W/u.m**2)]) meta = MetaDict({'key':'value'}) meta2 = MetaDict({'key2':'value2'}) # Create TS individually ts_1 = sunpy.timeseries.TimeSeries(data, meta, units) ts_2 = sunpy.timeseries.TimeSeries(data2, meta2, units2) ts_concat_1 = ts_1.concatenate(ts_2) # Concatinate during construction ts_concat_2 = sunpy.timeseries.TimeSeries(data, meta, units, data2, meta2, units2, concatenate=True) assert isinstance(ts_concat_2, sunpy.timeseries.timeseriesbase.GenericTimeSeries) # Create TS using a tuple ts_concat_3 = sunpy.timeseries.TimeSeries(((data, meta, units),(data2, meta2, units2)), concatenate=True) assert isinstance(ts_concat_3, sunpy.timeseries.timeseriesbase.GenericTimeSeries) assert ts_concat_1 == ts_concat_2 == ts_concat_3 def test_table_to_ts(self): # Generate the data and the corresponding dates base = datetime.datetime.today() times = Time([base - datetime.timedelta(minutes=x) for x in range(0, 24 * 60)]) intensity = u.Quantity(np.sin(np.arange(0, 12 * np.pi, ((12 * np.pi) / (24*60)))), u.W/u.m**2) # Create the units and meta objects units = OrderedDict([('intensity', u.W/u.m**2)]) meta = MetaDict({'key':'value'}) tbl_meta = MetaDict({'t_key':'t_value'}) # Create a suitable mixin qtable table = Table([times, intensity], names=['time', 'intensity'], meta=tbl_meta) table.add_index('time') # Create TS from table and check ts_table = sunpy.timeseries.TimeSeries(table, meta, units) assert isinstance(ts_table, sunpy.timeseries.timeseriesbase.GenericTimeSeries) ts_table2 = sunpy.timeseries.TimeSeries(table, units, meta) assert (ts_table2 == ts_table) # Create TS using a tuple of values ts_table3 = sunpy.timeseries.TimeSeries((table, meta, units)) assert isinstance(ts_table3, sunpy.timeseries.timeseriesbase.GenericTimeSeries) # ToDo: Try an incompatible table dual_index_table = Table([times, intensity], names=['time', 'intensity'], meta=tbl_meta) dual_index_table.add_index(('time', 'intensity')) with pytest.raises(ValueError): sunpy.timeseries.TimeSeries((dual_index_table, meta, units)) #============================================================================== # Test some other options #============================================================================== def test_passed_ts(self): # Test an EVE TimeSeries ts_eve = sunpy.timeseries.TimeSeries(eve_filepath, source='EVE') ts_from_ts_1 = sunpy.timeseries.TimeSeries(ts_eve, source='EVE') ts_from_ts_2 = sunpy.timeseries.TimeSeries(ts_eve) assert ts_eve == ts_from_ts_1 == ts_from_ts_2 #============================================================================== # Test some Errors #============================================================================== def test_invalid_manual_data(self): meta = MetaDict({'key':'value'}) data = [] with pytest.raises(NoMatchError): sunpy.timeseries.TimeSeries(data, meta) def test_invalid_filepath(self): invalid_filepath = os.path.join(filepath, 'invalid_filepath_here') with pytest.raises(NoMatchError): sunpy.timeseries.TimeSeries(invalid_filepath) # Now with silence_errors kwarg set with pytest.raises(NoMatchError): sunpy.timeseries.TimeSeries(invalid_filepath, silence_errors=True) def test_invalid_file(self): invalid_filepath = os.path.join(filepath, 'annotation_ppt.db') with pytest.raises(TypeError): sunpy.timeseries.TimeSeries(invalid_filepath) # Now with silence_errors kwarg set with pytest.raises(TypeError): sunpy.timeseries.TimeSeries(invalid_filepath, silence_errors=True) def test_validate_units(self): valid_units = OrderedDict([('Watt Per Meter Squared', u.Unit("W / m2")), ('Meter Cubed', u.Unit("m3"))]) assert sunpy.timeseries.TimeSeries._validate_units(valid_units) # Test for not having only units for values invalid_units_1 = OrderedDict([('Watt Per Meter Squared', 'string'), ('Meter Cubed', u.Unit("m3"))]) assert not sunpy.timeseries.TimeSeries._validate_units(invalid_units_1) # Test for being a MetaDict object invalid_units_2 = MetaDict(OrderedDict([('Watt Per Meter Squared', u.Unit("W / m2")), ('Meter Cubed', u.Unit("m3"))])) assert not sunpy.timeseries.TimeSeries._validate_units(invalid_units_2) def test_validate_meta_basic(self): valid_meta_1 = MetaDict({'key':'value'}) assert sunpy.timeseries.TimeSeries._validate_meta(valid_meta_1) valid_meta_2 = OrderedDict({'key':'value'}) assert sunpy.timeseries.TimeSeries._validate_meta(valid_meta_2) invalid_meta = [] assert not sunpy.timeseries.TimeSeries._validate_meta(invalid_meta) def test_validate_meta_astropy_header(self): # Manually open a goes file for the sunpy.io.header.FileHeader test hdus = sunpy.io.read_file(goes_filepath) header = hdus[0].header assert sunpy.timeseries.TimeSeries._validate_meta(header) # Manually open a goes file for the astropy.io.fits.header.Header test hdulist = fits.open(goes_filepath) header = hdulist[0].header hdulist.close() assert sunpy.timeseries.TimeSeries._validate_meta(header) sunpy-0.8.3/sunpy/timeseries/tests/test_timeseriesbase.py0000644000175000017500000007437513231613140024214 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- """ Test Generic TimeSeries Created on Thu Jun 23 12:29:55 2016 @author: alex_ """ import os import glob import pytest import datetime import warnings import copy import numpy as np import astropy.units as u from pandas.util.testing import assert_frame_equal from pandas import DataFrame import pandas as pd from collections import OrderedDict from astropy.tests.helper import assert_quantity_allclose from astropy.table import Table from astropy.time import Time import sunpy from sunpy.time import TimeRange, parse_time import sunpy.timeseries from sunpy.util.metadata import MetaDict from sunpy.timeseries import TimeSeriesMetaData from sunpy.tests.helpers import figure_test import sunpy.data.test #============================================================================== # TimeSeries Tests #============================================================================== filepath = sunpy.data.test.rootdir eve_filepath = os.path.join(filepath, 'EVE_L0CS_DIODES_1m_truncated.txt') fermi_gbm_filepath = os.path.join(filepath, 'gbm.fits') norh_filepath = os.path.join(filepath, 'tca110810_truncated') goes_filepath = os.path.join(filepath, 'goes.fits') lyra_filepath = os.path.join(filepath, 'lyra_20150101-000000_lev3_std_truncated.fits.gz') rhessi_filepath = os.path.join(filepath, 'hsi_obssumm_20120601_018_truncated.fits.gz') noaa_ind_filepath = os.path.join(filepath, 'RecentIndices_truncated.txt') noaa_pre_filepath = os.path.join(filepath, 'predicted-sunspot-radio-flux_truncated.txt') goes_filepath = os.path.join(filepath, 'go1520120601.fits.gz') a_list_of_many = glob.glob(os.path.join(filepath, "eve", "*")) @pytest.fixture def eve_test_ts(): #ToDo: return sunpy.timeseries.TimeSeries(os.path.join(testpath, filename), source='EVE') return sunpy.timeseries.TimeSeries(eve_filepath, source='EVE') @pytest.fixture def fermi_gbm_test_ts(): #ToDo: return sunpy.timeseries.TimeSeries(os.path.join(testpath, filename), source='GBMSummary') return sunpy.timeseries.TimeSeries(fermi_gbm_filepath, source='GBMSummary') @pytest.fixture def norh_test_ts(): #ToDo: return sunpy.timeseries.TimeSeries(os.path.join(testpath, filename), source='NoRH') return sunpy.timeseries.TimeSeries(norh_filepath, source='NoRH') @pytest.fixture def goes_test_ts(): #ToDo: return sunpy.timeseries.TimeSeries(os.path.join(testpath, filename), source='XRS') return sunpy.timeseries.TimeSeries(goes_filepath, source='XRS') @pytest.fixture def lyra_test_ts(): #ToDo: return sunpy.timeseries.TimeSeries(os.path.join(testpath, filename), source='LYRA') return sunpy.timeseries.TimeSeries(lyra_filepath, source='LYRA') @pytest.fixture def rhessi_test_ts(): #ToDo: return sunpy.timeseries.TimeSeries(os.path.join(testpath, filename), source='RHESSI') return sunpy.timeseries.TimeSeries(rhessi_filepath, source='RHESSI') @pytest.fixture def noaa_ind_test_ts(): #ToDo: return sunpy.timeseries.TimeSeries(os.path.join(testpath, filename), source='NOAAIndices') return sunpy.timeseries.TimeSeries(noaa_ind_filepath, source='NOAAIndices') @pytest.fixture def noaa_pre_test_ts(): #ToDo: return sunpy.timeseries.TimeSeries(os.path.join(testpath, filename), source='NOAAPredictIndices') return sunpy.timeseries.TimeSeries( noaa_pre_filepath, source='NOAAPredictIndices') @pytest.fixture def generic_ts(): # Generate the data and the corrisponding dates base = parse_time("2016/10/01T05:00:00") dates = [base - datetime.timedelta(minutes=x) for x in range(0, 24 * 60)] intensity = np.sin(np.arange(0, 12 * np.pi, ((12 * np.pi) / (24 * 60)))) # Create the data DataFrame, header MetaDict and units OrderedDict data = DataFrame(intensity, index=dates, columns=['intensity']) units = OrderedDict([('intensity', u.W / u.m**2)]) meta = MetaDict({'key': 'value'}) # Create the time series return sunpy.timeseries.TimeSeries(data, meta, units) @pytest.fixture def concatenate_multi_files_ts(): return sunpy.timeseries.TimeSeries( a_list_of_many, source='EVE', concatenate=True) #============================================================================== # Test Creating TimeSeries From Various Dataformats #============================================================================== @pytest.fixture def table_ts(): # Generate the data and the corresponding dates base = datetime.datetime.today() times = Time( [base - datetime.timedelta(minutes=x) for x in range(0, 24 * 60)]) intensity = u.Quantity( np.sin(np.arange(0, 12 * np.pi, ((12 * np.pi) / (24 * 60)))), u.W / u.m **2) # Create the units and meta objects units = OrderedDict([('intensity', u.W / u.m**2)]) meta = MetaDict({'key': 'value'}) tbl_meta = MetaDict({'t_key': 't_value'}) # Create a suitable mixin qtable table = Table( [times, intensity], names=['time', 'intensity'], meta=tbl_meta) table.add_index('time') # Create TS from dataframe and check return sunpy.timeseries.TimeSeries(table, meta, units) #============================================================================== # Test Resulting TimeSeries Parameters #============================================================================== def test_units_type(eve_test_ts, fermi_gbm_test_ts, norh_test_ts, goes_test_ts, lyra_test_ts, rhessi_test_ts, noaa_ind_test_ts, noaa_pre_test_ts, generic_ts, table_ts): assert isinstance(eve_test_ts.units, OrderedDict) assert isinstance(fermi_gbm_test_ts.units, OrderedDict) assert isinstance(norh_test_ts.units, OrderedDict) assert isinstance(goes_test_ts.units, OrderedDict) assert isinstance(lyra_test_ts.units, OrderedDict) assert isinstance(rhessi_test_ts.units, OrderedDict) assert isinstance(noaa_ind_test_ts.units, OrderedDict) assert isinstance(noaa_pre_test_ts.units, OrderedDict) assert isinstance(generic_ts.units, OrderedDict) assert isinstance(table_ts.units, OrderedDict) def test_meta_type(eve_test_ts, fermi_gbm_test_ts, norh_test_ts, goes_test_ts, lyra_test_ts, rhessi_test_ts, noaa_ind_test_ts, noaa_pre_test_ts, generic_ts, table_ts): assert isinstance(eve_test_ts.meta, TimeSeriesMetaData) assert isinstance(fermi_gbm_test_ts.meta, TimeSeriesMetaData) assert isinstance(norh_test_ts.meta, TimeSeriesMetaData) assert isinstance(goes_test_ts.meta, TimeSeriesMetaData) assert isinstance(lyra_test_ts.meta, TimeSeriesMetaData) assert isinstance(rhessi_test_ts.meta, TimeSeriesMetaData) assert isinstance(noaa_ind_test_ts.meta, TimeSeriesMetaData) assert isinstance(noaa_pre_test_ts.meta, TimeSeriesMetaData) assert isinstance(generic_ts.meta, TimeSeriesMetaData) assert isinstance(table_ts.meta, TimeSeriesMetaData) def test_data_type(eve_test_ts, fermi_gbm_test_ts, norh_test_ts, goes_test_ts, lyra_test_ts, rhessi_test_ts, noaa_ind_test_ts, noaa_pre_test_ts, generic_ts, table_ts): assert isinstance(eve_test_ts.data, DataFrame) assert isinstance(fermi_gbm_test_ts.data, DataFrame) assert isinstance(norh_test_ts.data, DataFrame) assert isinstance(goes_test_ts.data, DataFrame) assert isinstance(lyra_test_ts.data, DataFrame) assert isinstance(rhessi_test_ts.data, DataFrame) assert isinstance(noaa_ind_test_ts.data, DataFrame) assert isinstance(noaa_pre_test_ts.data, DataFrame) assert isinstance(generic_ts.data, DataFrame) assert isinstance(table_ts.data, DataFrame) # ToDo: check length? (should match the number of columns) #============================================================================== # Test Basic Single-Timeseries Truncation Operations #============================================================================== @pytest.fixture def truncation_slice_test_ts_1(eve_test_ts): # Truncate by slicing the second half off. return eve_test_ts.truncate(0, int(len(eve_test_ts.data) / 2), None) @pytest.fixture def truncation_slice_test_ts_2(eve_test_ts): # Truncate by slicing the first half off. return eve_test_ts.truncate( int(len(eve_test_ts.data) / 2), len(eve_test_ts.data), None) def test_truncation_slices(eve_test_ts, truncation_slice_test_ts_1, truncation_slice_test_ts_2): # Test resulting DataFrame are similar assert len(eve_test_ts.data) == (len(truncation_slice_test_ts_1.data) + len(truncation_slice_test_ts_2.data)) # Test column lists and unit dictionaries match assert eve_test_ts.columns == truncation_slice_test_ts_1.columns == truncation_slice_test_ts_2.columns assert eve_test_ts.meta.columns == truncation_slice_test_ts_1.meta.columns == truncation_slice_test_ts_2.meta.columns assert eve_test_ts.units == truncation_slice_test_ts_1.units == truncation_slice_test_ts_2.units # Test MetaDict match assert eve_test_ts.meta.metadata[0][ 2] == truncation_slice_test_ts_1.meta.metadata[0][ 2] == truncation_slice_test_ts_2.meta.metadata[0][2] # For TS and meta, Test time ranges match for the start and end of the TS. assert truncation_slice_test_ts_1.time_range.start == truncation_slice_test_ts_1.meta.time_range.start == eve_test_ts.time_range.start assert truncation_slice_test_ts_2.time_range.end == truncation_slice_test_ts_2.meta.time_range.end == eve_test_ts.time_range.end @pytest.fixture def truncation_timerange_test_ts(eve_test_ts): # Truncate using a TimeRange object. return eve_test_ts.truncate(eve_test_ts.time_range.split(3)[1]) def test_truncation_timerange(eve_test_ts, truncation_timerange_test_ts): # Check the resulting timerange in both TS and TSMD assert truncation_timerange_test_ts.time_range == truncation_timerange_test_ts.meta.time_range == eve_test_ts.time_range.split( 3)[1] @pytest.fixture def truncation_dates_test_ts(eve_test_ts): # Truncate using strings for start and end datetime. start_str = str(eve_test_ts.time_range.split(3)[1].start) end_str = str(eve_test_ts.time_range.split(3)[1].end) return eve_test_ts.truncate(start_str, end_str) def test_truncation_dates(eve_test_ts, truncation_dates_test_ts): # Check the resulting timerange in both TS and TSMD assert truncation_dates_test_ts.time_range == truncation_dates_test_ts.meta.time_range == eve_test_ts.time_range.split( 3)[1] #============================================================================== # Test Basic Single-Timeseries Truncation Operations #============================================================================== @pytest.fixture def truncated_none_ts(concatenate_multi_files_ts): # This timerange covers the whole range of metadata, so no change is expected a = concatenate_multi_files_ts.meta.metadata[0][ 0].start - datetime.timedelta(days=1) b = concatenate_multi_files_ts.meta.metadata[-1][ 0].end + datetime.timedelta(days=1) tr = TimeRange(a, b) truncated = copy.deepcopy(concatenate_multi_files_ts) truncated = truncated.truncate(tr) return truncated def test_truncated_none_ts(concatenate_multi_files_ts, truncated_none_ts): assert concatenate_multi_files_ts.meta == truncated_none_ts.meta @pytest.fixture def truncated_start_ts(concatenate_multi_files_ts): # This time range starts after the original, so expect truncation a = concatenate_multi_files_ts.meta.metadata[1][0].center b = concatenate_multi_files_ts.meta.metadata[-1][ 0].end + datetime.timedelta(days=1) tr = TimeRange(a, b) truncated = copy.deepcopy(concatenate_multi_files_ts) truncated = truncated.truncate(tr) return truncated def test_truncated_start_ts(concatenate_multi_files_ts, truncated_start_ts): # Check the 3 untouched metadata entries match assert concatenate_multi_files_ts.meta.metadata[ 2:] == truncated_start_ts.meta.metadata[1:] # Now check the truncated (but not truncated out) meta entry assert concatenate_multi_files_ts.meta.metadata[1][ 0].start != truncated_start_ts.meta.metadata[0][0].start assert concatenate_multi_files_ts.meta.metadata[1][ 0].end == truncated_start_ts.meta.metadata[0][0].end assert concatenate_multi_files_ts.meta.metadata[1][ 1] == truncated_start_ts.meta.metadata[0][1] assert concatenate_multi_files_ts.meta.metadata[1][ 2] == truncated_start_ts.meta.metadata[0][2] @pytest.fixture def truncated_end_ts(concatenate_multi_files_ts): # This time range ends before the original, so expect truncation a = concatenate_multi_files_ts.meta.metadata[0][ 0].start - datetime.timedelta(days=1) b = concatenate_multi_files_ts.meta.metadata[-2][0].center tr = TimeRange(a, b) truncated = copy.deepcopy(concatenate_multi_files_ts) truncated = truncated.truncate(tr) return truncated def test_truncated_end_ts(concatenate_multi_files_ts, truncated_end_ts): # Check the 3 untouched metadata entries match assert concatenate_multi_files_ts.meta.metadata[: -2] == truncated_end_ts.meta.metadata[: 3] # Now check the truncated (but not truncated out) meta entry assert concatenate_multi_files_ts.meta.metadata[-2][ 0].start == truncated_end_ts.meta.metadata[-1][0].start assert concatenate_multi_files_ts.meta.metadata[-2][ 0].end != truncated_end_ts.meta.metadata[-1][0].end assert concatenate_multi_files_ts.meta.metadata[-2][ 1] == truncated_end_ts.meta.metadata[-1][1] assert concatenate_multi_files_ts.meta.metadata[-2][ 2] == truncated_end_ts.meta.metadata[-1][2] @pytest.fixture def truncated_both_ts(concatenate_multi_files_ts): # This time range starts after and ends before the original, so expect truncation a = concatenate_multi_files_ts.meta.metadata[1][0].center b = concatenate_multi_files_ts.meta.metadata[-2][0].center tr = TimeRange(a, b) truncated = copy.deepcopy(concatenate_multi_files_ts) truncated = truncated.truncate(tr) return truncated def test_truncated_both_ts(concatenate_multi_files_ts, truncated_both_ts): # Check the 1 untouched metadata entry matches the original assert concatenate_multi_files_ts.meta.metadata[ 2:-2] == truncated_both_ts.meta.metadata[1:-1] # Check the start truncated (but not truncated out) meta entry assert concatenate_multi_files_ts.meta.metadata[1][ 0].start != truncated_both_ts.meta.metadata[0][0].start assert concatenate_multi_files_ts.meta.metadata[1][ 0].end == truncated_both_ts.meta.metadata[0][0].end assert concatenate_multi_files_ts.meta.metadata[1][ 1] == truncated_both_ts.meta.metadata[0][1] assert concatenate_multi_files_ts.meta.metadata[1][ 2] == truncated_both_ts.meta.metadata[0][2] # Check the end truncated (but not truncated out) meta entry assert concatenate_multi_files_ts.meta.metadata[-2][ 0].start == truncated_both_ts.meta.metadata[-1][0].start assert concatenate_multi_files_ts.meta.metadata[-2][ 0].end != truncated_both_ts.meta.metadata[-1][0].end assert concatenate_multi_files_ts.meta.metadata[-2][ 1] == truncated_both_ts.meta.metadata[-1][1] assert concatenate_multi_files_ts.meta.metadata[-2][ 2] == truncated_both_ts.meta.metadata[-1][2] @pytest.fixture def truncated_new_tr_all_before_ts(concatenate_multi_files_ts): # Time range begins and ends before the data a = concatenate_multi_files_ts.meta.metadata[0][ 0].start - datetime.timedelta(days=2) b = concatenate_multi_files_ts.meta.metadata[0][ 0].start - datetime.timedelta(days=1) tr = TimeRange(a, b) truncated = copy.deepcopy(concatenate_multi_files_ts) truncated = truncated.truncate(tr) return truncated @pytest.fixture def truncated_new_tr_all_after_ts(concatenate_multi_files_ts): # Time range begins and ends after the data a = concatenate_multi_files_ts.meta.metadata[-1][ 0].end + datetime.timedelta(days=1) b = concatenate_multi_files_ts.meta.metadata[-1][ 0].end + datetime.timedelta(days=2) tr = TimeRange(a, b) truncated = copy.deepcopy(concatenate_multi_files_ts) truncated = truncated.truncate(tr) return truncated def test_truncated_outside_tr_ts(truncated_new_tr_all_before_ts, truncated_new_tr_all_after_ts): assert truncated_new_tr_all_before_ts.meta.metadata == truncated_new_tr_all_after_ts.meta.metadata == [] #============================================================================== # Test Extraction Operations #============================================================================== @pytest.fixture def extraction_test_ts(eve_test_ts): # Extract the CMLon column return eve_test_ts.extract('CMLon') def test_extraction(eve_test_ts, extraction_test_ts): # Test there's only one column in the data, metadata and units assert len(extraction_test_ts.data.columns) == 1 assert len(extraction_test_ts.meta.columns) == 1 assert len(extraction_test_ts.units) == 1 # Test this column name matches assert eve_test_ts.data.columns[0] == eve_test_ts.data.columns[0] == list( eve_test_ts.units.keys())[0] # Test the data matches extracted_df = DataFrame(eve_test_ts.data['CMLon']).dropna() extracted_df = extracted_df.sort_index() assert_frame_equal(extraction_test_ts.data, extracted_df) #============================================================================== # Test Concatenation Operations #============================================================================== @pytest.fixture def concatenated_slices_test_ts(truncation_slice_test_ts_1, truncation_slice_test_ts_2): # Concatenate the slices to make a TS similar to the original return truncation_slice_test_ts_1.concatenate(truncation_slice_test_ts_2) def test_concatenation_of_slices(eve_test_ts, concatenated_slices_test_ts): # Test resulting DataFrame is similar to the original assert_frame_equal(concatenated_slices_test_ts.data, eve_test_ts.data) # Otherwise: concatenated_ts.data.equals(eve_test_ts) # Compare timeranges from before and after match for both metadata and TS assert eve_test_ts.meta.time_range == concatenated_slices_test_ts.meta.time_range assert eve_test_ts.time_range == concatenated_slices_test_ts.time_range # Test metadata MetaDict matches eve_test_ts.meta.metadata[0][ 2] == concatenated_slices_test_ts.meta.metadata[0][ 2] == concatenated_slices_test_ts.meta.metadata[1][2] # ToDo: Will TSMD.concatenate() want to re-merge the metadata entries back into one? @pytest.fixture def concatenation_different_data_test_ts(eve_test_ts, fermi_gbm_test_ts): # Take two different data sources and concatenate return eve_test_ts.concatenate(fermi_gbm_test_ts) def test_concatenation_of_different_data(eve_test_ts, fermi_gbm_test_ts, concatenation_different_data_test_ts): # ToDo: test the metadata is as expected using the below. (note ATM this fails if the order is changed) #assert concatenation_different_data_test_ts.meta.metadata[0] == fermi_gbm_test_ts.meta.metadata[0] #assert concatenation_different_data_test_ts.meta.metadata[1] == eve_test_ts.meta.metadata[0] value = True for key in list(concatenation_different_data_test_ts.meta.metadata[0][2] .keys()): if concatenation_different_data_test_ts.meta.metadata[0][2][ key] != fermi_gbm_test_ts.meta.metadata[0][2][key]: value = False for key in list(concatenation_different_data_test_ts.meta.metadata[1][2] .keys()): if concatenation_different_data_test_ts.meta.metadata[1][2][ key] != eve_test_ts.meta.metadata[0][2][key]: value = False assert value # Test units concatenation comined_units = copy.deepcopy(eve_test_ts.units) comined_units.update(fermi_gbm_test_ts.units) assert dict(concatenation_different_data_test_ts.units) == dict( comined_units) # Test data is the concatenation comined_df = pd.concat([eve_test_ts.data, fermi_gbm_test_ts.data]) comined_df = comined_df.sort_index() assert_frame_equal(concatenation_different_data_test_ts.data, comined_df) def test_concatenation_different_data_error(eve_test_ts, fermi_gbm_test_ts): # Take two different data sources and concatenate but set with the same_source # kwarg as true, this should not concatenate. with pytest.raises(TypeError): eve_test_ts.concatenate(fermi_gbm_test_ts, same_source=True) def test_generic_construction_concatenation(): # Generate the data and the corrisponding dates base = datetime.datetime.today() times = [base - datetime.timedelta(minutes=x) for x in range(0, 24 * 60)] intensity1 = np.sin(np.arange(0, 12 * np.pi, ((12 * np.pi) / (24 * 60)))) intensity2 = np.sin(np.arange(0, 12 * np.pi, ((12 * np.pi) / (24 * 60)))) # Create the data DataFrame, header MetaDict and units OrderedDict data = DataFrame(intensity1, index=times, columns=['intensity']) data2 = DataFrame(intensity2, index=times, columns=['intensity2']) units = OrderedDict([('intensity', u.W / u.m**2)]) units2 = OrderedDict([('intensity', u.W / u.m**2)]) meta = MetaDict({'key': 'value'}) meta2 = MetaDict({'key2': 'value2'}) # Create TS individually ts_1 = sunpy.timeseries.TimeSeries(data, meta, units) ts_2 = sunpy.timeseries.TimeSeries(data2, meta2, units2) ts_concat = ts_1.concatenate(ts_2, axis=1) assert isinstance(ts_concat, sunpy.timeseries.timeseriesbase.GenericTimeSeries) assert len(ts_concat.data) == len(times) assert ts_concat.columns == ['intensity', 'intensity2'] assert len(ts_concat.meta.metadata) == 2 #============================================================================== # Test Data Manipulation #============================================================================== @pytest.fixture def column_quantity(eve_test_ts): # Get the astropy Quantity of values from a column return eve_test_ts.quantity('CMLon') def test_column_quantity(eve_test_ts, column_quantity): # Test the units and values match assert eve_test_ts.units['CMLon'] == column_quantity.unit assert ((eve_test_ts.data['CMLon'].values == column_quantity.value) | (np.isnan(eve_test_ts.data['CMLon'].values) & np.isnan(column_quantity.value))).all() @pytest.fixture def add_column_from_quantity_ts(eve_test_ts, column_quantity): # Add a column to a TS using an astropy quantity return eve_test_ts.add_column('quantity_added', column_quantity) def test_add_column_from_quantity(eve_test_ts, add_column_from_quantity_ts, column_quantity): # Test the column similar to the original quantity? assert_quantity_allclose( add_column_from_quantity_ts.quantity('quantity_added'), column_quantity) # Test the full list of columns are pressent assert set(add_column_from_quantity_ts.data.columns) == set( eve_test_ts.data.columns) | set(['quantity_added']) @pytest.fixture def add_column_from_array_ts(eve_test_ts, column_quantity): # Add a column to a TS using a numpy array return eve_test_ts.add_column( 'array_added', column_quantity.value, unit=column_quantity.unit) def test_add_column_from_array(eve_test_ts, add_column_from_array_ts, column_quantity): # Test the column similar to the original quantity? assert_quantity_allclose( add_column_from_array_ts.quantity('array_added'), column_quantity) # Test the full list of columns are pressent assert set(add_column_from_array_ts.data.columns) == set( eve_test_ts.data.columns) | set(['array_added']) def test_add_column_from_array_no_units(eve_test_ts, column_quantity): ts = eve_test_ts.add_column('array_added', column_quantity.value) assert (ts.quantity('array_added') == column_quantity.value).all() #============================================================================== # Test Exporting to different formats #============================================================================== def test_ts_to_table(generic_ts): tbl = generic_ts.to_table() assert isinstance(tbl, Table) assert tbl.keys() == ['date', generic_ts.columns[0]] assert len(tbl) == len(generic_ts.data) assert (tbl[generic_ts.columns[0]].quantity == generic_ts.quantity(generic_ts.columns[0])).all() def test_ts_to_dataframe(generic_ts): df = generic_ts.to_dataframe() assert isinstance(df, DataFrame) assert_frame_equal(df, generic_ts.data) def test_ts_to_array(generic_ts): arr = generic_ts.to_array() assert isinstance(arr, np.ndarray) assert len(arr) == len(generic_ts.data) #============================================================================== # Test Basic Working Peek #============================================================================== @figure_test def test_eve_peek(eve_test_ts): eve_test_ts.peek() @figure_test def test_fermi_gbm_peek(fermi_gbm_test_ts): fermi_gbm_test_ts.peek() @figure_test def test_norh_peek(norh_test_ts): norh_test_ts.peek() """ @figure_test def test_goes_peek(goes_test_ts): goes_test_ts.peek() """ @figure_test def test_lyra_peek(lyra_test_ts): lyra_test_ts.peek() @figure_test def test_rhessi_peek(rhessi_test_ts): rhessi_test_ts.peek() @figure_test def test_noaa_ind_peek(noaa_ind_test_ts): noaa_ind_test_ts.peek() @figure_test def test_noaa_pre_peek(noaa_pre_test_ts): noaa_pre_test_ts.peek() @figure_test def test_generic_ts_peek(generic_ts): generic_ts.peek() #============================================================================== # Test Peek Of Invalid Data for all sources #============================================================================== def test_eve_invalid_peek(eve_test_ts): a = eve_test_ts.time_range.start - datetime.timedelta(days=2) b = eve_test_ts.time_range.start - datetime.timedelta(days=1) empty_ts = eve_test_ts.truncate(TimeRange(a, b)) with pytest.raises(ValueError): empty_ts.peek() def test_fermi_gbm_invalid_peek(fermi_gbm_test_ts): a = fermi_gbm_test_ts.time_range.start - datetime.timedelta(days=2) b = fermi_gbm_test_ts.time_range.start - datetime.timedelta(days=1) empty_ts = fermi_gbm_test_ts.truncate(TimeRange(a, b)) with pytest.raises(ValueError): empty_ts.peek() def test_norh_invalid_peek(norh_test_ts): a = norh_test_ts.time_range.start - datetime.timedelta(days=2) b = norh_test_ts.time_range.start - datetime.timedelta(days=1) empty_ts = norh_test_ts.truncate(TimeRange(a, b)) with pytest.raises(ValueError): empty_ts.peek() """ def test_goes_peek(goes_test_ts): goes_test_ts.peek() """ def test_lyra_invalid_peek(lyra_test_ts): a = lyra_test_ts.time_range.start - datetime.timedelta(days=2) b = lyra_test_ts.time_range.start - datetime.timedelta(days=1) empty_ts = lyra_test_ts.truncate(TimeRange(a, b)) with pytest.raises(ValueError): empty_ts.peek() def test_rhessi_invalid_peek(rhessi_test_ts): a = rhessi_test_ts.time_range.start - datetime.timedelta(days=2) b = rhessi_test_ts.time_range.start - datetime.timedelta(days=1) empty_ts = rhessi_test_ts.truncate(TimeRange(a, b)) with pytest.raises(ValueError): empty_ts.peek() def test_noaa_ind_invalid_peek(noaa_ind_test_ts): a = noaa_ind_test_ts.time_range.start - datetime.timedelta(days=2) b = noaa_ind_test_ts.time_range.start - datetime.timedelta(days=1) empty_ts = noaa_ind_test_ts.truncate(TimeRange(a, b)) with pytest.raises(ValueError): empty_ts.peek() def test_noaa_pre_invalid_peek(noaa_pre_test_ts): a = noaa_pre_test_ts.time_range.start - datetime.timedelta(days=2) b = noaa_pre_test_ts.time_range.start - datetime.timedelta(days=1) empty_ts = noaa_pre_test_ts.truncate(TimeRange(a, b)) with pytest.raises(ValueError): empty_ts.peek() def test_generic_ts_invalid_peek(generic_ts): a = generic_ts.time_range.start - datetime.timedelta(days=2) b = generic_ts.time_range.start - datetime.timedelta(days=1) empty_ts = generic_ts.truncate(TimeRange(a, b)) with pytest.raises(ValueError): empty_ts.peek() #============================================================================== # Test Other Functions #============================================================================== def test_equality(generic_ts, table_ts): generic_copy_ts = copy.deepcopy(generic_ts) assert generic_ts == generic_copy_ts generic_copy_ts.meta.metadata[0][2]['key'] = 1 assert generic_ts != generic_copy_ts assert generic_ts != table_ts def test_equality_different_ts_types(generic_ts, table_ts): # this should fail as they're not the smae type and can't match assert not (generic_ts == eve_test_ts) def test_ts_index(generic_ts): assert (generic_ts.index == generic_ts.data.index).all() def test_ts_sort_index(generic_ts): assert generic_ts.sort_index().data.equals(generic_ts.data.sort_index()) #_validate_units #_validate_meta # ToDo: ###Extracting column as quantity or array#ts_eve = ts_eve.add_column(colname, qua_new, overwrite=True) ###Updating a column using quantity or array#ts_eve = ts_eve.add_column(colname, qua_new, overwrite=True) ###Updating the units# ts_eve = ts_eve.add_column(colname, qua_new, unit=unit, overwrite=True) sunpy-0.8.3/sunpy/timeseries/tests/test_timeseriesmetadata.py0000644000175000017500000005007413231613140025050 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- """ Created on Wed Jul 20 10:24:06 2016 """ from __future__ import print_function, division import copy from sunpy.timeseries import TimeSeriesMetaData from sunpy.time import TimeRange from sunpy.util.metadata import MetaDict from collections import OrderedDict import pytest #============================================================================== # Creating TimeSeriesMetaData Objects #============================================================================== @pytest.fixture def basic_1_md(): tr = TimeRange('2010-01-01 13:59:57.468999', '2010-01-02 13:59:56.091999') colnames = [ 'column1', 'column2' ] metadict = MetaDict(OrderedDict([('md1_key1', 'value1'), ('md1_key2', 'value2'), ('all_same', 'value3'), ('all_different', 'diff_1')])) lis = [ ( tr, colnames, metadict ) ] return TimeSeriesMetaData(lis) @pytest.fixture def basic_2_md(): tr = TimeRange('2010-01-02 13:59:57.468999', '2010-01-03 13:59:56.091999') colnames = [ 'column1', 'column2' ] metadict = MetaDict(OrderedDict([('md2_key1', 'value1'), ('md2_key2', 'value2'), ('all_same', 'value3'), ('all_different', 'diff_2')])) lis = [ ( tr, colnames, metadict ) ] return TimeSeriesMetaData(lis) @pytest.fixture def basic_3_md(): tr = TimeRange('2010-01-03 13:59:57.468999', '2010-01-03 13:59:56.091999') colnames = [ 'column1', 'column2' ] metadict = MetaDict(OrderedDict([('md3_key1', 'value1'), ('md3_key2', 'value2'), ('all_same', 'value3'), ('all_different', 'diff_3')])) lis = [ ( tr, colnames, metadict ) ] return TimeSeriesMetaData(lis) @pytest.fixture def basic_4_md(): tr = TimeRange('2010-01-01 20:59:57.468999', '2010-01-03 20:59:56.091999') colnames = [ 'md4_column1', 'md4_column2' ] metadict = MetaDict(OrderedDict([('md4_key1', 'value1'), ('md4_key2', 'value2'), ('all_same', 'value3'), ('all_different', 'diff_4')])) tup = ( tr, colnames, metadict ) return TimeSeriesMetaData(tup) @pytest.fixture def overlap_and_interleave_with_basic_1_md(): tr = TimeRange('2010-01-01 01:01:00.0', '2010-01-02 01:01:00.0') colnames = [ 'column1', 'column2' ] metadict = MetaDict(OrderedDict([('other_key1', 'value1'), ('other_key2', 'value2'), ('all_same', 'value3'), ('all_different', 'diff_5')])) lis = [ ( tr, colnames, metadict ) ] return TimeSeriesMetaData(lis) #============================================================================== # Test Creating TimeSeriesMetaData With Limited Input #============================================================================== def test_create_mithout_metadata(): tr = TimeRange('2010-01-01 13:59:57.468999', '2010-01-02 13:59:56.091999') colnames = [ 'column1', 'column2' ] tsmd_1 = TimeSeriesMetaData(timerange=tr, colnames=colnames) assert isinstance(tsmd_1, TimeSeriesMetaData) assert tsmd_1.metadata[0][1] == colnames tsmd_2 = TimeSeriesMetaData(timerange=tr) assert isinstance(tsmd_1, TimeSeriesMetaData) assert tsmd_2.metadata[0][1] == [] assert tsmd_1.metadata[0][0] == tsmd_2.metadata[0][0] == tr assert tsmd_1.metadata[0][2] == tsmd_2.metadata[0][2] == MetaDict() assert len(tsmd_1.metadata) == len(tsmd_2.metadata) == 1 def test_create_mithout_metadata_or_timerange(): # without a timerange we should get errors colnames = [ 'column1', 'column2' ] with pytest.raises(ValueError): TimeSeriesMetaData(colnames=colnames) with pytest.raises(ValueError): TimeSeriesMetaData() #============================================================================== # Test Appending TimeSeriesMetaData Objects #============================================================================== def test_append_similar(basic_1_md): appended = copy.deepcopy(basic_1_md) appended.append(*basic_1_md.metadata[0]) # The duplicate should not have been added assert appended == basic_1_md @pytest.fixture def basic_ascending_append_md(basic_1_md, basic_2_md, basic_3_md): appended = copy.deepcopy(basic_1_md) appended.append(*basic_2_md.metadata[0]) appended.append(*basic_3_md.metadata[0]) return appended def test_basic_ascending_append_md(basic_1_md, basic_2_md, basic_3_md, basic_ascending_append_md): # Check all the entries are in the correct order assert basic_ascending_append_md.metadata[0] == basic_1_md.metadata[0] assert basic_ascending_append_md.metadata[1] == basic_2_md.metadata[0] assert basic_ascending_append_md.metadata[2] == basic_3_md.metadata[0] def test_basic_descending_append_md(basic_1_md, basic_2_md, basic_3_md, basic_ascending_append_md): appended = copy.deepcopy(basic_3_md) appended.append(*basic_1_md.metadata[0]) appended.append(*basic_2_md.metadata[0]) assert appended == basic_ascending_append_md def test_basic_random_append_md(basic_1_md, basic_2_md, basic_3_md, basic_ascending_append_md): appended = copy.deepcopy(basic_3_md) appended.append(*basic_1_md.metadata[0]) appended.append(*basic_2_md.metadata[0]) assert appended == basic_ascending_append_md @pytest.fixture def complex_append_md(basic_1_md, basic_2_md, basic_3_md, basic_4_md): appended = copy.deepcopy(basic_1_md) appended.append(*basic_2_md.metadata[0]) appended.append(*basic_3_md.metadata[0]) appended.append(*basic_4_md.metadata[0]) return appended def test_complex_append_md(basic_1_md, basic_2_md, basic_3_md, basic_4_md, complex_append_md): # Check all the entries are in the correct order assert complex_append_md.metadata[0] == basic_1_md.metadata[0] assert complex_append_md.metadata[1] == basic_4_md.metadata[0] assert complex_append_md.metadata[2] == basic_2_md.metadata[0] assert complex_append_md.metadata[3] == basic_3_md.metadata[0] def test_append_invalid_timerange(basic_1_md): appended = copy.deepcopy(basic_1_md) with pytest.raises(ValueError): appended.append('not_a_timerange', basic_1_md.metadata[0][1], basic_1_md.metadata[0][2]) #============================================================================== # Test TimeSeriesMetaData Concatenation #============================================================================== def test_concatenate(basic_ascending_append_md, basic_4_md, complex_append_md): concatenated = copy.deepcopy(basic_ascending_append_md) concatenated = concatenated.concatenate(basic_4_md) assert concatenated == complex_append_md #============================================================================== # Test TimeSeriesMetaData Truncation #============================================================================== @pytest.fixture def truncated_none_md(basic_ascending_append_md): # This timerange covers the whole range of metadata, so no change is expected tr = TimeRange('2010-01-01 1:59:57.468999', '2010-01-04 23:59:56.091999') truncated = copy.deepcopy(basic_ascending_append_md) truncated._truncate(tr) return truncated @pytest.fixture def truncated_start_md(basic_ascending_append_md): # This time range starts after the original, so expect truncation tr = TimeRange('2010-01-02 20:59:57.468999', '2010-01-04 23:59:56.091999') truncated = copy.deepcopy(basic_ascending_append_md) truncated._truncate(tr) return truncated @pytest.fixture def truncated_end_md(basic_ascending_append_md): # This time range ends before the original, so expect truncation tr = TimeRange('2010-01-01 1:59:57.468999', '2010-01-03 1:59:56.091999') truncated = copy.deepcopy(basic_ascending_append_md) truncated._truncate(tr) return truncated @pytest.fixture def truncated_both_md(basic_ascending_append_md): # This time range starts after and ends before the original, so expect truncation tr = TimeRange('2010-01-02 20:59:57.468999', '2010-01-03 1:59:56.091999') truncated = copy.deepcopy(basic_ascending_append_md) truncated._truncate(tr) return truncated @pytest.fixture def truncated_new_tr_all_before_md(basic_ascending_append_md): # Time range begins and ends before the data tr = TimeRange('2010-01-01 01:01:01.000000', '2010-01-01 02:01:01.000000') truncated = copy.deepcopy(basic_ascending_append_md) truncated._truncate(tr) return truncated @pytest.fixture def truncated_new_tr_all_after_md(basic_ascending_append_md): # Time range begins and ends after the data tr = TimeRange('2010-01-04 01:01:01.000000', '2010-01-04 02:01:01.000000') truncated = copy.deepcopy(basic_ascending_append_md) truncated._truncate(tr) return truncated #============================================================================== # Test TimeSeriesMetaData TimeRanges #============================================================================== def test_truncated_none_tr(basic_ascending_append_md, truncated_none_md): assert basic_ascending_append_md.time_range == truncated_none_md.time_range def test_truncated_start_tr(truncated_start_md): tr = TimeRange('2010-01-02 20:59:57.468999', truncated_start_md.time_range.end) assert truncated_start_md.time_range == tr def test_truncated_end_tr(basic_ascending_append_md, truncated_end_md): tr = TimeRange(truncated_end_md.time_range.start, '2010-01-03 1:59:56.091999') assert truncated_end_md.time_range == tr def test_truncated_both_tr(truncated_both_md): tr = TimeRange('2010-01-02 20:59:57.468999', '2010-01-03 1:59:56.091999') assert truncated_both_md.time_range == tr def test_truncated_tr_outside(truncated_new_tr_all_before_md, truncated_new_tr_all_after_md): assert truncated_new_tr_all_before_md.metadata == truncated_new_tr_all_after_md.metadata == [] def test_basic_ascending_append_tr(basic_1_md, basic_3_md, basic_ascending_append_md): tr = TimeRange(basic_1_md.time_range.start, basic_3_md.time_range.end) assert basic_ascending_append_md.time_range == tr def test_complex_append_tr(basic_1_md, basic_4_md, complex_append_md): tr = TimeRange(basic_1_md.time_range.start, basic_4_md.time_range.end) assert complex_append_md.time_range == tr #============================================================================== # Test TimeSeriesMetaData find method #============================================================================== def test_find_return_type(basic_ascending_append_md): assert isinstance(basic_ascending_append_md.find(), TimeSeriesMetaData) def test_find_no_filters(basic_ascending_append_md, basic_1_md): assert basic_ascending_append_md.find() == basic_ascending_append_md def test_find_time_filter(basic_1_md, basic_2_md, basic_4_md, complex_append_md): assert complex_append_md.find(time='2010-01-01 14:59:57.468999') == basic_1_md temp_md = copy.deepcopy(basic_2_md) temp_md = temp_md.concatenate(basic_4_md) assert complex_append_md.find(time='2010-01-02 20:59:57.468999') == temp_md def test_find_colname_filter(basic_4_md, complex_append_md, basic_ascending_append_md): assert complex_append_md.find(colname='md4_column2') == basic_4_md assert complex_append_md.find(colname='column1') == basic_ascending_append_md def test_find_both_filters(basic_2_md, basic_4_md, complex_append_md): assert complex_append_md.find(time='2010-01-02 20:59:57.468999', colname='column2') == basic_2_md assert complex_append_md.find(time='2010-01-02 20:59:57.468999', colname='md4_column1') == basic_4_md #============================================================================== # Test TimeSeriesMetaData get and update methods #============================================================================== def test_get_return_type(complex_append_md): assert isinstance(complex_append_md.get('md1_key1'),TimeSeriesMetaData) def test_get_no_filters(complex_append_md): assert complex_append_md.get('md1_key1').values() == ['value1'] assert complex_append_md.get('all_same').values() == ['value3'] def test_get_time_filter(complex_append_md): assert complex_append_md.get('md1_key1', time='2010-01-01 20:59:57.468999').values() == ['value1'] assert complex_append_md.get('md2_key2', time='2010-01-02 20:59:57.468999').values() == ['value2'] assert complex_append_md.get('all_same', time='2010-01-01 20:59:57.468999').values() == ['value3'] assert complex_append_md.get('all_different', time='2010-01-01 20:59:57.468999').values() == ['diff_1', 'diff_4'] def test_get_colname_filter(complex_append_md): assert complex_append_md.get('md1_key1', colname='column1').values() == ['value1'] assert complex_append_md.get('md2_key2', colname='column2').values() == ['value2'] assert complex_append_md.get('all_same', colname='column1').values() == ['value3'] assert complex_append_md.get('all_different', colname='column1').values() == ['diff_1', 'diff_2', 'diff_3'] def test_get_both_filters(complex_append_md): assert complex_append_md.get('all_different', time='2010-01-02 20:59:57.468999', colname='column2').values() == ['diff_2'] #============================================================================== # Test TimeSeriesMetaData update method #============================================================================== def test_update(complex_append_md): assert isinstance(complex_append_md.get('md1_key1'),TimeSeriesMetaData) def test_update_all_dict_type_input(complex_append_md): # Check all three dictionary types work the same updated_dict_md = copy.deepcopy(complex_append_md) updated_dict_md.update({'added':'added'}) updated_ordereddict_md = copy.deepcopy(complex_append_md) updated_ordereddict_md.update(MetaDict(OrderedDict([('added', 'added')]))) updated_metadict_md = copy.deepcopy(complex_append_md) updated_metadict_md.update(MetaDict(OrderedDict([('added', 'added')]))) assert updated_dict_md == updated_ordereddict_md == updated_metadict_md def test_update_overwrite(complex_append_md, overwrite=True): updated_not_overwritten_md = copy.deepcopy(complex_append_md) updated_not_overwritten_md.update({'all_same': 'updated'}) updated_overwritten_md = copy.deepcopy(complex_append_md) updated_overwritten_md.update({'all_same': 'updated'}, overwrite=True) assert updated_not_overwritten_md == complex_append_md assert updated_overwritten_md.get('all_same').values() == ['updated'] def test_update_time_filter(complex_append_md): updated_md = copy.deepcopy(complex_append_md) updated_md.update({'all_same': 'updated'}, time='2010-01-01 20:59:57.468999', overwrite=True) assert updated_md.metadata[0][2]['all_same'] == updated_md.metadata[1][2]['all_same'] == 'updated' assert updated_md.metadata[2][2]['all_same'] == updated_md.metadata[3][2]['all_same'] == 'value3' def test_update_colname_filter(complex_append_md): updated_md = copy.deepcopy(complex_append_md) updated_md.update({'all_same': 'updated'}, colname='column1', overwrite=True) assert updated_md.metadata[0][2]['all_same'] == updated_md.metadata[2][2]['all_same'] == updated_md.metadata[3][2]['all_same'] == 'updated' assert updated_md.metadata[1][2]['all_same'] == 'value3' def test_update_both_filters(complex_append_md): updated_md = copy.deepcopy(complex_append_md) updated_md.update({'all_same': 'updated'}, colname='column1', time='2010-01-01 23:59:57.468999', overwrite=True) assert updated_md.metadata[0][2]['all_same'] == 'updated' assert updated_md.metadata[1][2]['all_same'] == updated_md.metadata[2][2]['all_same'] == updated_md.metadata[3][2]['all_same'] == 'value3' #============================================================================== # Test Misc Methods #============================================================================== def test_get_index(basic_1_md, basic_ascending_append_md): assert basic_ascending_append_md.get_index(0) == basic_1_md.get_index(0) def test_equality(basic_1_md, basic_2_md, basic_ascending_append_md): basic_1_copy_md = copy.deepcopy(basic_1_md) assert basic_1_md == basic_1_copy_md assert basic_1_md != basic_2_md assert basic_1_md != basic_ascending_append_md def test_to_string_basic(basic_1_md): default_str = basic_1_md.to_string() assert isinstance(default_str, str) # check this matches the __str__ and __repr__ methods default_str == basic_1_md.__str__() == basic_1_md.__repr__() def test_to_string_depth(basic_1_md): depth_1_str = basic_1_md.to_string(depth=1) assert len(depth_1_str.split('\n')) == 7 assert len(depth_1_str.split('...')) == 4 assert basic_1_md.metadata[0][1][0] in depth_1_str # for depth of 2 the time-range will take exactly 2 lines depth_2_str = basic_1_md.to_string(depth=2) assert len(depth_2_str.split('\n')) == 8 assert len(depth_2_str.split('...')) == 2 assert (basic_1_md.metadata[0][1][0] in depth_2_str) and (basic_1_md.metadata[0][1][1] in depth_2_str) def test_to_string_width(basic_1_md): width_110_str = basic_1_md.to_string(width=110) split = width_110_str.split('\n') assert len(split[0]) == len(split[1]) == len(split[2]) == len(split[3]) == 110 width_60_str = basic_1_md.to_string(width=60) split = width_60_str.split('\n') assert len(split[0]) == len(split[1]) == len(split[2]) == len(split[3]) == 60 def test_to_string_few_metadict_entries(basic_1_md): tr = basic_1_md.metadata[0][0] colnames = basic_1_md.metadata[0][1] metadict = MetaDict(OrderedDict([('md1_key1', 'value1')])) lis = [ ( tr, colnames, metadict ) ] basic_1_md_less_metadict_entries = TimeSeriesMetaData(lis) depth_3_str = basic_1_md_less_metadict_entries.to_string(depth = 3) assert isinstance(depth_3_str, str) def test_timeranges(basic_ascending_append_md): lis = [] lis.append(basic_ascending_append_md.metadata[0][0]) lis.append(basic_ascending_append_md.metadata[1][0]) lis.append(basic_ascending_append_md.metadata[2][0]) assert basic_ascending_append_md.timeranges == lis def test_columns(complex_append_md): lis = complex_append_md.metadata[0][1] + complex_append_md.metadata[1][1] lis.sort() assert complex_append_md.columns == lis def test_metas(complex_append_md): lis = [] lis.append(complex_append_md.metadata[0][2]) lis.append(complex_append_md.metadata[1][2]) lis.append(complex_append_md.metadata[2][2]) lis.append(complex_append_md.metadata[3][2]) assert complex_append_md.metas == lis def test_rename_column(complex_append_md): col_renamed_md = copy.deepcopy(complex_append_md) old = complex_append_md.metadata[0][1][0] new = 'renamed' col_renamed_md._rename_column(old, new) assert col_renamed_md.metadata[0][1][0] == col_renamed_md.metadata[2][1][0] == col_renamed_md.metadata[3][1][0] == new def test_remove_column(complex_append_md): col_removed_md = copy.deepcopy(complex_append_md) col = complex_append_md.metadata[0][1][0] col_removed_md._remove_columns(col) assert col_removed_md.metadata[0][1] == col_removed_md.metadata[2][1] == col_removed_md.metadata[3][1] == [complex_append_md.metadata[0][1][1]] assert col_removed_md.metadata[1][1] == [complex_append_md.metadata[1][1][0], complex_append_md.metadata[1][1][1]] def test_remove_columns(complex_append_md): cols_removed_md = copy.deepcopy(complex_append_md) lis = [ complex_append_md.metadata[0][1][0], complex_append_md.metadata[1][1][1]] cols_removed_md._remove_columns(lis) assert cols_removed_md.metadata[0][1] == cols_removed_md.metadata[2][1] == cols_removed_md.metadata[3][1] == [complex_append_md.metadata[0][1][1]] assert cols_removed_md.metadata[1][1] == [complex_append_md.metadata[1][1][0]] def test_validate_meta_good(complex_append_md): assert complex_append_md._validate_meta(complex_append_md) def test_validate_meta_interleaved(basic_1_md, overlap_and_interleave_with_basic_1_md): concatenated = copy.deepcopy(basic_1_md) concatenated = concatenated.concatenate(overlap_and_interleave_with_basic_1_md) assert concatenated._validate_meta(concatenated)sunpy-0.8.3/sunpy/timeseries/__init__.py0000644000175000017500000000235013231613140020526 0ustar nabilnabil00000000000000""" SunPy's TimeSeries module provides a datatype for 1D time series data, replacing the SunPy LightCurve module. Currently the objects can be instansiated from files (such as CSV and FITS) and urls to these files, but don't include data downloaders for their specific instruments as this will become part of the universal downloader. """ from __future__ import absolute_import from sunpy.timeseries.metadata import TimeSeriesMetaData from sunpy.timeseries.timeseries_factory import TimeSeries from sunpy.timeseries.timeseriesbase import GenericTimeSeries from sunpy.timeseries.sources.eve import EVESpWxTimeSeries from sunpy.timeseries.sources.goes import XRSTimeSeries from sunpy.timeseries.sources.noaa import NOAAIndicesTimeSeries, NOAAPredictIndicesTimeSeries from sunpy.timeseries.sources.lyra import LYRATimeSeries from sunpy.timeseries.sources.norh import NoRHTimeSeries from sunpy.timeseries.sources.rhessi import RHESSISummaryTimeSeries from sunpy.timeseries.sources.fermi_gbm import GBMSummaryTimeSeries try: # register pandas datetime converter with matplotlib # This is to work around the change in pandas-dev/pandas#17710 import pandas.plotting._converter pandas.plotting._converter.register() except ImportError: pass sunpy-0.8.3/sunpy/timeseries/metadata.py0000644000175000017500000006336113231613140020560 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- from __future__ import absolute_import, division, print_function __authors__ = ["Alex Hamilton, Stuart Mumford"] __email__ = "stuart@mumford.me.uk" from sunpy.util.metadata import MetaDict import itertools import copy import warnings import inspect from sunpy.time import TimeRange, parse_time class TimeSeriesMetaData(object): """ An object used to store metadata for TimeSeries objects that enables multiple TimeSeries metadata to be concatenated in an organised fashion. Attributes ---------- metadata : `list` of `tuple` The list of 3-tuples which each represent a source files metadata. The tuples consist of: ( TimeRange, [ colnames ], MetaDict(metadata) ) Examples -------- >>> from sunpy.timeseries import TimeSeriesMetaData >>> from sunpy.time import TimeRange, parse_time >>> from sunpy.util import MetaDict >>> tr = TimeRange('2012-06-01 00:00','2012-06-02 00:00') >>> md = TimeSeriesMetaData(timerange=tr, colnames=['GOES'], ... meta=MetaDict([('goes_key','goes_val')])) >>> tr2 = TimeRange('2012-06-01 12:00','2012-06-02 12:00') >>> md.append(tr2, ['EVE'], MetaDict([('eve_key','eve_val')])) >>> md.find(parse_time('2012-06-01T21:08:12')) |-------------------------------------------------------------------------------------------------| |TimeRange | Columns | Meta | |-------------------------------------------------------------------------------------------------| |2012-06-01 00:00:00 | GOES | goes_key: goes_val | | to | | | |2012-06-02 00:00:00 | | | |-------------------------------------------------------------------------------------------------| |2012-06-01 12:00:00 | EVE | eve_key: eve_val | | to | | | |2012-06-02 12:00:00 | | | |-------------------------------------------------------------------------------------------------| >>> md.find(parse_time('2012-06-01T21:08:12')).columns ['EVE', 'GOES'] >>> md.find(parse_time('2012-06-01T21:08:12')).values() ['eve_val', 'goes_val'] >>> md.find(parse_time('2012-06-01T21:08:12')).metas [MetaDict([('goes_key', 'goes_val')]), MetaDict([('eve_key', 'eve_val')])] >>> md.find(parse_time('2012-06-01T21:08:12'), 'GOES') |-------------------------------------------------------------------------------------------------| |TimeRange | Columns | Meta | |-------------------------------------------------------------------------------------------------| |2012-06-01 00:00:00 | GOES | goes_key: goes_val | | to | | | |2012-06-02 00:00:00 | | | |-------------------------------------------------------------------------------------------------| """ def __init__(self, meta=None, timerange=None, colnames=None, **kwargs): self.metadata = [] # Parse in arguments if not isinstance(meta, type(None)): if isinstance(meta, (dict, MetaDict)) and isinstance(timerange, TimeRange) and isinstance(colnames, list): # Given a single metadata entry as a dictionary with additional timerange and colnames. self.metadata.append((timerange, colnames, meta)) elif isinstance(meta, tuple): # Given a single metadata entry as a tuple. self.metadata.append(meta) elif isinstance(meta, list): # Given a complex metadata list (of tuples) self.metadata = copy.copy(meta) else: # In the event no metadata dictionary is sent we default to something usable if isinstance(timerange, TimeRange) and isinstance(colnames, list): self.metadata.append((timerange, colnames, MetaDict())) elif isinstance(timerange, TimeRange): self.metadata.append((timerange, [], MetaDict())) warnings.warn("No time range given for metadata. This will mean the metadata can't be linked to columns in data.", Warning) else: raise ValueError("You cannot create a TimeSeriesMetaData object without specifying a TimeRange") def __eq__(self, other): """ Check two TimeSeriesMetaData objects are the same, they have the same entries in the same order. Parameters ---------- other : `~sunpy.timeseries.metadata.TimeSeriesMetaData` The second TimeSeriesMetaData object to compare with. Returns ------- result : `bool` """ match = True if len(self.metadata) == len(other.metadata): for i in range(0,len(self.metadata)): # if self.metadata[i] != other.metadata[i]: match = False else: match = False return match def __ne__(self, other): """ Check two TimeSeriesMetaData objects are not the same, they don't have same entries in the same order. Parameters ---------- other : `~sunpy.timeseries.GenericTimeSeries` The second TimeSeries object to compare with. Returns ------- result : `bool` """ return not self == other def append(self, timerange, columns, metadata, **kwargs): """ Add the given metadata MetaDict into the metadata list as a tuple with it's TimeRange and colnames (list). Will add the new entry so the list is in chronological order for the TimeRange.start datetime values. Parameters ---------- timerange : `~sunpy.time.TimeRange` The timerange for which a given metadict is relevant. This will generally initilly be the full range of the original file, but if the TimeSeries gets truncated this may change appropriately. columns : `str` A list of the colomn name strings that the metadata is relevant for. metadata : `~sunpy.util.metadata.MetaDict` or `OrderedDict` or `dict` The dictionary holding the metadata. """ # Parameters metadata = MetaDict(metadata) # Check the types are correct. pos = 0 if isinstance(timerange, TimeRange): for i, meta in enumerate(self.metadata): if timerange.start > meta[0].start: pos = i + 1 else: raise ValueError( 'Incorrect datatime or data for append to TimeSeriesMetaData.') # Prepare tuple to append. new_metadata = (timerange, columns, metadata) # Check this isn't a duplicate entry (same TR and comnames) duplicate = False if pos < len(self.metadata): old_metadata = self.metadata[pos] if (new_metadata[0] == old_metadata[0]) and (new_metadata[1] == old_metadata[1]): duplicate = True # Insert into the given position if not duplicate: self.metadata.insert(pos, new_metadata) def find_indices(self, time=None, colname=None, **kwargs): """ Find the indices for all the metadata entries matching the given filters for datetime and/or column name. Will return all metadata entry indices if no filters are given. Parameters ---------- time : `str` or `~datetime.datetime` optional The string (parsed using the `~sunpy.time.parse_time`) or datetime that you need metadata for. colname : `str` optional A string that can be used to narrow results to specific columns. indices : `bool` optional If True then return a list of indices, not of MetaDict items. Used when other methods use the filters for selecting metadata entries. Returns ------- list : `list` A list of integers that contain all matching metadata. """ # Parameters dt = time if not dt: dt = False elif isinstance(dt, str): dt = parse_time(dt) # Find all results with suitable timerange. results_indices = [] for i, meta in enumerate(self.metadata): if dt in meta[0] or not(dt): results_indices.append(i) # Filter out only those with the correct column. results = [] for i in results_indices: if (colname in self.metadata[i][1]) or (not colname): results.append(i) return results def find(self, time=None, colname=None, **kwargs): """ Find all metadata matching the given filters for datetime and/or column name. Will return all metadata entries if no filters are given. Parameters ---------- time : `str` or `~datetime.datetime` optional The string (parsed using the `~sunpy.time.parse_time`) or datetime that you need metadata for. colname : `str` optional A string that can be used to narrow results to specific columns. Returns ------- metadata : `~sunpy.timeseries.metadata.TimeSeriesMetaData` A TimeSeriesMetaData that contain all matching metadata entries. """ # Get the indices indices = self.find_indices(time=time, colname=colname, **kwargs) # Extract the relevant metadata entries metadata = [] for i in indices: metadata.append(copy.copy(self.metadata[i])) # Return a TimeSeriesMetaData object return TimeSeriesMetaData(meta=metadata) def get_index(self, index): """ Return the dictionary entry at the given index. Parameters ---------- index : `int` The integer index of the metadata entry in the list. Returns ------- metadata : `~sunpy.util.metadata.MetaDict` An ordered Dictionary containing the metadata at the given index. """ return self.metadata[index][2] def get(self, keys, time=None, colname=None, **kwargs): """ Return a TimeSeriesMetaData object of all entries matching the time and colname filters with the dictionaries containing only the key value pairs with the key matching the given input key. Parameters ---------- keys : `str` The Key/s to be searched in the dictionary. time : `str` or `~datetime.datetime` optional The string (parsed using the `~sunpy.time.parse_time`) or datetime that you need metadata for. colname : `str` optional A string that can be used to narrow results to specific columns. itemised : `bool` optional Option to allow the return of the time ranges and column names (as list) that match each given value. Returns ------- metadata : `~sunpy.timeseries.metadata.TimeSeriesMetaData` A TimeSeriesMetaData that contain all matching metadata entries but with only the requested key/value pairs in the MetaDict objects. """ # Make a list of keys if only one is given if isinstance(keys, str): keys = [ keys ] # Find all metadata entries for the given time/colname filters full_metadata = self.find(time=time, colname=colname) metadata = [] # Append to metadata only key:value pairs with requested keys for i, entry in enumerate(full_metadata.metadata): metadict = MetaDict() for curkey, value in entry[2].items(): for key in keys: if curkey.lower() == key.lower(): metadict.update({key:value}) metadata.append((entry[0], entry[1], metadict)) # Return a TimeSeriesMetaData object return TimeSeriesMetaData(meta=metadata) def concatenate(self, tsmetadata2, **kwargs): """ Combine the metadata from a TimeSeriesMetaData object with the current TimeSeriesMetaData and return as a new TimeSeriesMetaData object. Parameters ---------- tsmetadata2 : `~sunpy.timeseries.TimeSeriesMetaData` The second TimeSeriesMetaData object. """ # Create a copy of the metadata meta = TimeSeriesMetaData(copy.copy(self.metadata)) # Append each metadata entry from the second TimeSeriesMetaData object # to the original TimeSeriesMetaData object. for entry in tsmetadata2.metadata: meta.append(entry[0], entry[1], entry[2]) return meta def update(self, dictionary, time=None, colname=None, row=None, overwrite=False, **kwargs): """ Make updates to the MetaDict metadata for all matching metadata entries. Parameters ---------- dictionary : `dict` or `OrderedDict` or `~sunpy.util.metadata.MetaDict` The second TimeSeriesMetaData object. time : `str` or `~datetime.datetime` optional The string (parsed using the `~sunpy.time.parse_time`) or datetime to filter the metadata entries updated. colname : `str` optional A string that can be used to narrow results to specific columns. overwrite : `bool` optional Option to define if the user is able to overwrite already present keys. Defaults to False, designed to stop users from being able to corrupt/damage the metadict values so easily. """ # Find all matching metadata entries indices = self.find_indices(time=time, colname=colname, row=row, indices=True) # Now update each matching entries for i in indices: # Seperate keys for new and current pairs old_keys = set(dictionary.keys()) old_keys.intersection_update(set(self.metadata[i][2].keys())) new_keys = set(dictionary.keys()) new_keys.difference_update(old_keys) # Old keys only overwritten if allowed for key in (self.metadata[i][2].keys()): if key in old_keys and overwrite: self.metadata[i][2][key] = dictionary[key] for key in dictionary: if key in new_keys: self.metadata[i][2][key] = dictionary[key] def _truncate(self, timerange): """Removes metadata entries outside of the new (truncated) TimeRange. Also adjusts start and end times of time ranges going outside of the truncated time range. Parameters ---------- timerange : `sunpy.time.TimeRange` Either a time range to truncate to. """ truncated = [] for metatuple in self.metadata: # Get metadata time range parameters start = metatuple[0].start end = metatuple[0].end out_of_range = False # Find truncations if start < timerange.start and end > timerange.start: # Truncate the start start = timerange.start elif start > timerange.end: # Metadata time range starts after truncated data ends. out_of_range = True if end > timerange.end and start < timerange.end: # Truncate the end end = timerange.end elif end < timerange.start: # Metadata time range finishes before truncated data starts. out_of_range = True # Add the values if applicable if not out_of_range: truncated.append((TimeRange(start, end), metatuple[1], metatuple[2])) # Update the original list self.metadata = truncated @property def columns(self): """Returns a list of all the names of the columns in the metadata.""" all_cols = set() for metatuple in self.metadata: all_cols.update(metatuple[1]) all_cols = list(all_cols) all_cols.sort() return all_cols @property def metas(self): """Returns a list of all the metadict objects in the TimeSeriesMetaData object.""" all_metas = [] for metatuple in self.metadata: all_metas.append(metatuple[2]) return all_metas @property def timeranges(self): """Returns a list of all the TimeRange objects the TimeSeriesMetaData object.""" all_tr = [] for metatuple in self.metadata: all_tr.append(metatuple[0]) return all_tr def values(self): """Returns a list of all the values from the metadict objects in each entry in the TimeSeriesMetaData object.""" all_vals = set() for metatuple in self.metadata: for key, value in metatuple[2].items(): all_vals.add(str(value)) all_vals = list(all_vals) all_vals.sort() return all_vals @property def time_range(self): """Returns the TimeRange of the entire time series meta data.""" start = self.metadata[0][0].start end = self.metadata[0][0].end for metatuple in self.metadata: if end < metatuple[0].end: end = metatuple[0].end return TimeRange(start, end) def _remove_columns(self, colnames): """Removes the given column/s from the TimeSeriesMetaData object. Parameters ---------- colnames : `str` or `list` The name or names of the columns to be removed. """ # Parameters if isinstance(colnames, str): colnames = [ colnames ] # Create a new list with all metadata entries without colnames reduced = [] for metatuple in self.metadata: # Check each colname for colname in colnames: if colname in metatuple[1]: # Removed from the list. metatuple[1].remove(colname) # Add the column if it still has some columns listed if len(metatuple[1]) > 0: reduced.append(metatuple) # Update the original list self.metadata = reduced def _rename_column(self, old, new): """ Change the name of a column in all the metadata entries. Parameters ---------- old : `str` The original column name to be changed. new : `str` The new column name. """ for i in range(0, len(self.metadata)): # Update the colnames colnames = self.metadata[i][1] colnames = [w.replace(old, new) for w in colnames] # Replace values self.metadata[i] = ( self.metadata[i][0], colnames, self.metadata[i][2] ) def _validate_meta(self, meta): """ Validate a meta argument. """ # Checking for metadata that may overlap. indices = range(0, len(self.metadata)) for i, j in itertools.combinations(indices, 2): # Check if the TimeRanges overlap if not ((self.metadata[i][0].end <= self.metadata[j][0].start) or (self.metadata[i][0].start >= self.metadata[j][0].end)): # Check column headings overlap col_overlap = list(set(self.metadata[i][1]) & set(self.metadata[j][1])) # If we have an overlap then show a warning if col_overlap: warnings.warn_explicit('Metadata entries ' + str(i) + ' and ' + str(j) + ' contain interleaved data.', Warning, __file__, inspect.currentframe().f_back.f_lineno) # ToDo: Check all entries are in tr.start time order. return True def to_string(self, depth=10, width=99): """ Print a table-like representation of the TimeSeriesMetaData object. Parameters ---------- depth : `int` The maximum number of lines to show for each entry. Metadata dictionaries and column lists will be truncated if this is small. width : `int` The number of characters wide to make the entire table. """ # Parameters colspace = ' | ' liswidths = (26, 15, width-2-2*len(colspace) - 26 - 15) colheadings = '|' + 'TimeRange'.ljust(100)[:liswidths[0]] + colspace + 'Columns'.ljust(100)[:liswidths[1]] + colspace + 'Meta'.ljust(100)[:liswidths[2]] + '|' rowspace = "-" * (liswidths[0] + len(colspace) + liswidths[1] + len(colspace) + liswidths[2]) rowspace = '|' + rowspace + '|' # Headings full = rowspace + '\n' + colheadings + '\n' + rowspace + '\n' # Add metadata entries for entry in self.metadata: # Make lists for each of the columns for each metadata entry # Padded to the widths given in liswidths lis_range = [ str(entry[0].start), ' to ', str(entry[0].end) ] # Shorten TimeRange representation if depth of only 2 if depth == 2: lis_range = [ str(entry[0].start), str(entry[0].end) ] liscols = [] for col in entry[1]: liscols.append(col.ljust(100)[:liswidths[1]]) lismeta = [] for key in list(entry[2].keys()): string = str(key) + ': ' + str(entry[2][key]) lismeta.append(string.ljust(100)[:liswidths[2]]) # Add lines of the entry upto the given depth for i in range(0, depth): # What to do in the event any of the lists have more entries # then the current depth if len(lis_range) > i or len(entry[1]) > i or len(lismeta) > i : # The start of the line Str is just a vertical bar/pipe line = '|' # Check we have a time range entry to print if len(lis_range) > i: # Simply add that time range entry to the line Str line += lis_range[i].ljust(100)[:liswidths[0]] else: # No entry to add, so just add a blank space line += ''.ljust(100)[:liswidths[0]] # Add a column break vertical bar/pipe line += colspace # Check we have another column name entry to print if len(entry[1]) > i: # Simply add that column name to the line Str line += entry[1][i].ljust(100)[:liswidths[1]] else: # No entry to add, so just add a blank space line += ''.ljust(100)[:liswidths[1]] # Add a column break vertical bar/pipe line += colspace # Check we have another meta key/value pair to print if len(lismeta) > i: # Simply add that key/value pair to the line Str line += lismeta[i].ljust(100)[:liswidths[2]] else: # No entry to add, so just add a blank space line += ''.ljust(100)[:liswidths[2]] # Finish the line Str with vertical bar/pipe and \n full += line + '|\n' # Reached the depth limit, add line to show if the columns are truncated if len(lis_range) >= depth or len(entry[1]) >= depth or len(lismeta) >= depth: # The start of the line Str is just a vertical bar/pipe line = '|' # Check we have more time range entries to print if len(lis_range) > depth: # We have more time range entries, use ellipsis to show this line += '...'.ljust(100)[:liswidths[0]] else: # No entry to add, so just add a blank space line += ''.ljust(100)[:liswidths[0]] # Add a column break vertical bar/pipe line += colspace # Check we have more than one column name entry to print if len(entry[1]) > depth: # We have more column name entries, use ellipsis line += '...'.ljust(100)[:liswidths[1]] else: # No more column name entries, so just add a blank space line += ''.ljust(100)[:liswidths[1]] # Add a column break vertical bar/pipe line += colspace # Check we have more meta key/value pairs to print if len(lismeta) > depth: # We have more key/value pairs, use ellipsis to show this line += '...'.ljust(100)[:liswidths[2]] else: # No morekey/value pairs, add a blank space line += ''.ljust(100)[:liswidths[2]] # Finish the line Str with vertical bar/pipe and \n full += line + '|\n' # Add a line to close the table full += rowspace + '\n' return full def __repr__(self): return self.to_string() def __str__(self): return self.to_string() sunpy-0.8.3/sunpy/timeseries/timeseries_factory.py0000644000175000017500000005146413231613140022701 0ustar nabilnabil00000000000000from __future__ import absolute_import, division, print_function import warnings import os import glob from collections import OrderedDict import copy import numpy as np import pandas as pd import astropy.io.fits from astropy.table import Table import astropy from astropy.time import Time import astropy.units as u import sunpy from sunpy.timeseries.timeseriesbase import GenericTimeSeries, TIMESERIES_CLASSES from sunpy.util.metadata import MetaDict from sunpy.io.file_tools import read_file, UnrecognizedFileTypeError from sunpy.io.fits import HDPair from sunpy.io.header import FileHeader from sunpy.util.net import download_file from sunpy.util import expand_list from sunpy.util.config import get_and_create_download_dir from sunpy.util.datatype_factory_base import BasicRegistrationFactory from sunpy.util.datatype_factory_base import NoMatchError from sunpy.util.datatype_factory_base import MultipleMatchError from sunpy.util.datatype_factory_base import ValidationFunctionError from sunpy.extern import six from sunpy.extern.six.moves.urllib.request import urlopen __authors__ = ["Alex Hamilton, Russell Hewett, Stuart Mumford"] __all__ = ['TimeSeries', 'TimeSeriesFactory'] class TimeSeriesFactory(BasicRegistrationFactory): """ TimeSeries(*args, **kwargs) TimeSeries factory class. Used to create a variety of TimeSeries objects. Valid time series types are specified by registering them with the factory. Parameters ---------- source : `str`, optional A string to select the observational source of the data, currently necessary to define how files should be read for all instruments. concatenate : `bool`, optional, default:False If set, combine any resulting list of TimeSeries objects into a single TimeSeries, using successive concatenate methods. Examples -------- >>> import sunpy.timeseries >>> import sunpy.data.sample >>> my_timeseries = sunpy.timeseries.TimeSeries(sunpy.data.sample.GOES_XRS_TIMESERIES) The SunPy TimeSeries factory accepts a wide variety of inputs for creating time series * Preloaded tuples of (data, header) pairs or (data, header, units) >>> my_timeseries = sunpy.timeseries.TimeSeries((data, header)) # doctest: +SKIP headers and units are some base of `dict` or `~collections.OrderedDict` or `~sunpy.util.metadata.MetaDict`. * data, header pairs, or data, header units triples, not in tuples >>> my_timeseries = sunpy.timeseries.TimeSeries(data, header) # doctest: +SKIP >>> my_timeseries = sunpy.timeseries.TimeSeries(data, header, units) # doctest: +SKIP * File names for files understood by sunpy.io and those not >>> my_timeseries = sunpy.timeseries.TimeSeries('filename.fits') # doctest: +SKIP >>> my_timeseries = sunpy.timeseries.TimeSeries('filename.fits', source='lyra') # doctest: +SKIP * Multiple files can be combined into one TimeSeries, as long as they are the same source # doctest: +SKIP >>> my_timeseries = sunpy.timeseries.TimeSeries(['goesfile1.fits', 'goesfile2.fits'], ... concatenate=True) # doctest: +SKIP * All fits files in a directory by giving a directory >>> my_timeseries = sunpy.timeseries.TimeSeries('local_dir/sub_dir') # doctest: +SKIP * Some regex globs >>> my_timeseries = sunpy.timeseries.TimeSeries('eit_*.fits') # doctest: +SKIP * URLs >>> my_timeseries = sunpy.timeseries.TimeSeries(url) # doctest: +SKIP * Lists of any of the above >>> my_timeseries = sunpy.timeseries.TimeSeries(['file1.fits', 'file2.fits', ... 'file3.fits', 'directory1/']) # doctest: +SKIP * Any mixture of the above not in a list >>> my_timeseries = sunpy.timeseries.TimeSeries((data, header), data2, header2, ... 'file1.fits', url, 'eit_*.fits') # doctest: +SKIP """ def _read_file(self, fname, **kwargs): """ Test reading a file with sunpy.io for automatic source detection. Parameters ---------- fname : filename kwargs Returns ------- parsed : bool True if file has been reading pairs : list or string List of (data, header) pairs if ``parsed`` is ``True`` or ``fname`` if ``False`` """ if 'source' not in kwargs.keys() or not kwargs['source']: try: pairs = read_file(fname, **kwargs) new_pairs = [] for pair in pairs: filedata, filemeta = pair if isinstance(filemeta, FileHeader): data = filedata meta = MetaDict(filemeta) new_pairs.append(HDPair(data, meta)) return True, new_pairs except UnrecognizedFileTypeError: return False, fname else: return False, fname def _validate_meta(self, meta): """ Validate a meta argument for use as metadata. Currently only validates by class. """ if isinstance(meta, astropy.io.fits.header.Header): return True elif isinstance(meta, sunpy.io.header.FileHeader): return True elif isinstance(meta, dict): return True else: return False def _validate_units(self, units, **kwargs): """ Validates the astropy unit-information associated with a TimeSeries. Should be a dictionary of some form (but not MetaDict) with only astropy units for values. """ warnings.simplefilter('always', Warning) result = True # It must be a dictionary if not isinstance(units, dict) or isinstance(units, MetaDict): return False for key in units: if not isinstance(units[key], u.UnitBase): # If this is not a unit then this can't be a valid units dict. return False # Passed all the tests return result def _from_table(self, t, **kwargs): """ Extract the data, metadata and units from an astropy table for use in constructing a TimeSeries. Parameters ---------- t: `~astropy.table.table.Table` The input table. The datetime column must be the first column or the (single) primary key index. Returns ------- data : `~pandas.core.frame.DataFrame` meta : `~sunpy.util.metadata.MetaDict` units : `dict` """ table = copy.deepcopy(t) # Default the time index to the first column index_name = table.colnames[0] # Check if another column is defined as the index/primary_key if table.primary_key: # Check there is only one primary_key/index column if len(table.primary_key) == 1: table.primary_key[0] else: raise ValueError("Invalid input Table, TimeSeries doesn't support conversion" " of tables with more then one index column.") # Extract, convert and remove the index column from the input table index = table[index_name] # Convert if the index is given as an astropy Time object if isinstance(index, Time): index = index.datetime index = pd.to_datetime(index) table.remove_column(index_name) # Extract the column values from the table data = {} units = {} for colname in table.colnames: data[colname] = table[colname] units[colname] = table[colname].unit # Create a dataframe with this and return df = pd.DataFrame(data=data, index=index) return df, MetaDict(table.meta), units def _parse_args(self, *args, **kwargs): """ Parses an args list for data-header pairs. args can contain any mixture of the following entries: * tuples of (data, header, unit) (1) * data, header not in a tuple (1) * filename, which will be read * directory, from which all files will be read * glob, from which all files will be read * url, which will be downloaded and read * lists containing any of the above. (1) Note that header/unit are optional and in either order, but data but be the first entry in each group. Example ------- self._parse_args(data, header, (data, header), ['file1', 'file2', 'file3'], 'file4', 'directory1', '*.fits') """ data_header_unit_tuples = list() data_header_pairs = list() already_timeseries = list() filepaths = list() # Take source kwarg if defined source = kwargs.get('source', None) # Account for nested lists of items. Simply outputs a single list of # items, nested lists are expanded to element level. args = expand_list(args) # For each of the arguments, handle each of the cases i = 0 while i < len(args): arg = args[i] # Data-header pair in a tuple if (isinstance(arg, (np.ndarray, Table, pd.DataFrame))): # and self._validate_meta(args[i+1])): # Assume a Pandas Dataframe is given data = arg units = OrderedDict() meta = MetaDict() # Convert the data argument into a Pandas DataFrame if needed. if isinstance(data, Table): # We have an AstroPy Table: data, meta, units = self._from_table(data) elif isinstance(data, np.ndarray): # We have a numpy ndarray. We assume the first column is a dt index data = pd.DataFrame(data=data[:, 1:], index=Time(data[:, 0])) # If there are 1 or 2 more arguments: for _ in range(2): if (len(args) > i+1): # If that next argument isn't data but is metaddata or units: if not isinstance(args[i+1], (np.ndarray, Table, pd.DataFrame)): if self._validate_units(args[i+1]): units.update(args[i+1]) i += 1 # an extra increment to account for the units elif self._validate_meta(args[i+1]): # if we have an astropy.io FITS header then convert # to preserve multi-line comments if isinstance(args[i+1], astropy.io.fits.header.Header): args[i+1] = MetaDict(sunpy.io.header.FileHeader(args[i+1])) meta.update(args[i+1]) i += 1 # an extra increment to account for the meta # Add a 3-tuple for this TimeSeries. data_header_unit_tuples.append((data, meta, units)) # Filepath elif (isinstance(arg, six.string_types) and os.path.isfile(os.path.expanduser(arg))): path = os.path.expanduser(arg) read, result = self._read_file(path, **kwargs) if read: data_header_pairs.append(result) else: filepaths.append(result) # Directory elif (isinstance(arg, six.string_types) and os.path.isdir(os.path.expanduser(arg))): path = os.path.expanduser(arg) files = [os.path.join(path, elem) for elem in os.listdir(path)] for afile in files: # returns a boolean telling us if it were read and either a # tuple or the original filepath for reading by a source read, result = self._read_file(afile, **kwargs) if read: data_header_pairs.append(result) else: filepaths.append(result) # Glob elif (isinstance(arg, six.string_types) and '*' in arg): files = glob.glob(os.path.expanduser(arg)) for afile in files: # data_header_unit_tuples += self._read_file(afile, **kwargs) # returns a boolean telling us if it were read and either a # tuple or the original filepath for reading by a source read, result = self._read_file(afile, **kwargs) if read: data_header_pairs.append(result) else: filepaths.append(result) # Already a TimeSeries elif isinstance(arg, GenericTimeSeries): already_timeseries.append(arg) # A URL elif (isinstance(arg, six.string_types) and _is_url(arg)): url = arg path = download_file(url, get_and_create_download_dir()) pairs = self._read_file(path, **kwargs) # data_header_pairs += pairs filepaths.append(pairs[1]) else: # raise ValueError("File not found or invalid input") raise NoMatchError("File not found or invalid input") i += 1 # TODO: # In the end, if there are already TimeSeries it should be put in the # same order as the input, currently they are not. return data_header_unit_tuples, data_header_pairs, already_timeseries, filepaths def __call__(self, *args, **kwargs): """ Method for running the factory. Takes arbitrary arguments and keyword arguments and passes them to a sequence of pre-registered types to determine which is the correct TimeSeries source type to build. Arguments args and kwargs are passed through to the validation function and to the constructor for the final type. For TimeSeries types, validation function must take a data-header pair as an argument. Parameters ---------- silence_errors : `bool`, optional If set, ignore data-header pairs which cause an exception. Notes ----- Extra keyword arguments are passed through to `sunpy.io.read_file` such as `memmap` for FITS files. """ # Hack to get around Python 2.x not backporting PEP 3102. silence_errors = kwargs.pop('silence_errors', False) (data_header_unit_tuples, data_header_pairs, already_timeseries, filepaths) = self._parse_args(*args, **kwargs) new_timeseries = list() # The filepaths for unreadable files for filepath in filepaths: try: new_ts = self._check_registered_widgets(filepath=filepath, **kwargs) except (NoMatchError, MultipleMatchError, ValidationFunctionError): if not silence_errors: raise except: raise new_timeseries.append(new_ts) # data_header_pairs is a list of HDUs as read by sunpy.io # For each set of HDus find the matching class and read the # data_header_unit_tuples by calling the _parse_hdus method # of the class. for pairs in data_header_pairs: # Pairs may be x long where x is the number of HDUs in the file. headers = [pair.header for pair in pairs] types = [] for header in headers: try: match = self._get_matching_widget(meta=header, **kwargs) if not match == GenericTimeSeries: types.append(match) except (MultipleMatchError, NoMatchError): continue if not types: # If no specific classes have been found we can read the data # if we only have one data header pair: if len(pairs) == 1: already_timeseries.append(GenericTimeSeries(pairs[0].data, pairs[0].header)) else: raise NoMatchError("Input read by sunpy.io can not find a " "matching class for reading multiple HDUs") if len(set(types)) > 1: raise MultipleMatchError("Multiple HDUs return multiple matching classes.") cls = types[0] data_header_unit_tuples.append(cls._parse_hdus(pairs)) # Loop over each registered type and check to see if WidgetType # matches the arguments. If it does, use that type for triple in data_header_unit_tuples: data, header, units = triple # Make a MetaDict from various input types meta = header if isinstance(meta, astropy.io.fits.header.Header): meta = sunpy.io.header.FileHeader(meta) meta = MetaDict(meta) try: new_ts = self._check_registered_widgets(data=data, meta=meta, units=units, **kwargs) except (NoMatchError, MultipleMatchError, ValidationFunctionError): if not silence_errors: raise except: raise new_timeseries.append(new_ts) new_timeseries += already_timeseries # Concatenate the timeseries into one if specified. concatenate = kwargs.get('concatenate', False) if concatenate: # Merge all these timeseries into one. full_timeseries = new_timeseries.pop(0) for timeseries in new_timeseries: full_timeseries = full_timeseries.concatenate(timeseries) new_timeseries = [full_timeseries] # Sanitize any units OrderedDict details for timeseries in new_timeseries: timeseries._sanitize_units() # Only return single time series, not in a list if we only have one. if len(new_timeseries) == 1: return new_timeseries[0] return new_timeseries def _get_matching_widget(self, **kwargs): candidate_widget_types = list() for key in self.registry: # Call the registered validation function for each registered class if self.registry[key](**kwargs): candidate_widget_types.append(key) n_matches = len(candidate_widget_types) if n_matches == 0: if self.default_widget_type is None: raise NoMatchError("No types match specified arguments and no default is set.") else: candidate_widget_types = [self.default_widget_type] elif n_matches > 1: raise MultipleMatchError("Too many candidate types identified ({0})." "Specify enough keywords to guarantee unique type " "identification.".format(n_matches)) # Only one suitable source class is found return candidate_widget_types[0] def _check_registered_widgets(self, **kwargs): """ Checks the (instrument) source/s that are compatible with this given file/data. Only if exactly one source is compatible will a TimeSeries be returned. """ WidgetType = self._get_matching_widget(**kwargs) # Dealing with the fact that timeseries filetypes are less consistent # (then maps), we use a _parse_file() method embedded into each # instrument subclass. filepath = kwargs.pop('filepath', None) data = kwargs.pop('data', None) meta = kwargs.pop('meta', None) units = kwargs.pop('units', None) if filepath: data, meta, units = WidgetType._parse_file(filepath) # Now return a TimeSeries from the given file. return WidgetType(data, meta, units, **kwargs) def _is_url(arg): try: urlopen(arg) except: return False return True class InvalidTimeSeriesInput(ValueError): """Exception to raise when input variable is not a TimeSeries instance and does not point to a valid TimeSeries input file.""" pass class InvalidTimeSeriesType(ValueError): """Exception to raise when an invalid type of time series is requested with TimeSeries.""" pass class NoTimeSeriesFound(ValueError): """Exception to raise when input does not point to any valid time series or files.""" pass TimeSeries = TimeSeriesFactory(default_widget_type=GenericTimeSeries, additional_validation_functions=['is_datasource_for']) TimeSeries.registry = TIMESERIES_CLASSES sunpy-0.8.3/sunpy/timeseries/timeseriesbase.py0000644000175000017500000005074713232563373022025 0ustar nabilnabil00000000000000""" TimeSeries is a generic time series class from which all other TimeSeries classes inherit from. """ from __future__ import absolute_import, division, print_function __authors__ = ["Alex Hamilton, Stuart Mumford"] __email__ = "stuart@mumford.me.uk" import warnings from abc import ABCMeta from collections import OrderedDict import copy import matplotlib.pyplot as plt import pandas as pd from sunpy import config from sunpy.time import TimeRange from sunpy.extern import six from sunpy.timeseries import TimeSeriesMetaData from sunpy.util.metadata import MetaDict import astropy import astropy.units as u from astropy.table import Table from astropy.table import Column # define and register a new unit, needed for RHESSI det = u.def_unit('detector') u.add_enabled_units([det]) TIME_FORMAT = config.get("general", "time_format") # pylint: disable=E1101,E1121,W0404,W0612,W0613 __authors__ = ["Alex Hamilton"] __email__ = "####" # GenericTimeSeries subclass registry. TIMESERIES_CLASSES = OrderedDict() class GenericTimeSeriesMeta(ABCMeta): """ Registration metaclass for `~sunpy.timeseries.GenericTimeSeries`. This class checks for the existance of a method named ``is_datasource_for`` when a subclass of `GenericTimeSeries` is defined. If it exists it will add that class to the registry. """ _registry = TIMESERIES_CLASSES def __new__(mcls, name, bases, members): cls = super(GenericTimeSeriesMeta, mcls).__new__(mcls, name, bases, members) # The registry contains the class as the key and the validation method # as the item. if 'is_datasource_for' in members: mcls._registry[cls] = cls.is_datasource_for return cls @six.add_metaclass(GenericTimeSeriesMeta) class GenericTimeSeries: """ A generic time series object. Attributes ---------- meta : `~sunpy.timeseries.metadata.TimeSeriesMetaData` The metadata giving details about the time series data/instrument. data : `~pandas.DataFrame` An pandas DataFrame prepresenting one or more fields as a function of time. Parameters ---------------- filename: `str` or File A file to read. source: `str` A string identifier for a registered subclass, matched by that subclasses `_is_source_for` method. concatenate : `bool` Concatenate all files into one TimeSeries object if True, or return one TimeSeries for each file if False. All other keywords are passed to _is_source_for and then __init__. Examples -------- >>> from sunpy.timeseries import TimeSeries >>> import datetime >>> import numpy as np >>> import pandas as pd >>> base = datetime.datetime.today() >>> times = [base - datetime.timedelta(minutes=x) for x in range(0, 24 * 60)] >>> intensity = np.sin(np.arange(0, 12 * np.pi, step=(12 * np.pi) / (24 * 60))) >>> df = pd.DataFrame(intensity, index=times, columns=['intensity']) >>> ts = TimeSeries(df) >>> ts.peek() # doctest: +SKIP References ---------- * `Pandas Documentation `_ """ # Class attribute used to specify the source class of the TimeSeries. _source = None def __init__(self, data, meta=None, units=None, **kwargs): self.data = data tr = TimeRange(self.data.index.min(), self.data.index.max()) # Check metadata input if meta is None: # No meta given, so default self.meta = TimeSeriesMetaData(MetaDict(), tr, list(self.data.columns.values)) elif isinstance(meta, (dict, OrderedDict, MetaDict)): # Given the values for metadata (dict) and infer timerange and colnames from the data self.meta = TimeSeriesMetaData(meta, tr, list(self.data.columns.values)) elif isinstance(meta, tuple): # Given the values all in a tuple self.meta = TimeSeriesMetaData(meta, tr, list(self.data.columns.values)) else: # Should have a list of 3-tuples giving a complex metadata list. self.meta = meta if units is None: self.units = {} else: self.units = units # Validate input data #self._validate_meta() #self._validate_units() # #### Attribute definitions #### # @property def source(self): """Returns a string/object used to specify the source class of the TimeSeries.""" return self._source @property def columns(self): """Returns a list of all the names of the columns in the data.""" return list(self.data.columns.values) @property def index(self): """Return the time index of the data.""" return self.data.index @property def time_range(self): """Returns the start and end times of the TimeSeries as a `~sunpy.time.TimeRange` object""" return TimeRange(self.data.index.min(), self.data.index.max()) # #### Data Access, Selection and Organisation Methods #### # def quantity(self, colname, **kwargs): """ Return a `~astropy.units.quantity.Quantity` for the given column. Parameters ---------- colname : `str` The heading of the column you want output. Returns ------- quantity : `~astropy.units.quantity.Quantity` """ values = self.data[colname].values unit = self.units[colname] return u.Quantity(values, unit) def add_column(self, colname, quantity, unit=False, overwrite=True, **kwargs): """ Return an new TimeSeries with the given column added or updated. Parameters ---------- colname : `str` The heading of the column you want output. quantity : `~astropy.units.quantity.Quantity` or `~numpy.ndarray` The values to be placed within the column. If updating values only then a numpy array is permitted. overwrite : `bool`, optional, default:True Set to true to allow the method to overwrite a column already present in the TimeSeries. Returns ------- newts : TimeSeries """ # Get the expected units from the quantity if required if not unit and isinstance(quantity, astropy.units.quantity.Quantity): unit = quantity.unit elif not unit: unit = u.dimensionless_unscaled # Make a copy of all the TimeSeries components. data = copy.copy(self.data) meta = TimeSeriesMetaData(copy.copy(self.meta.metadata)) units = copy.copy(self.units) # Add the unit to the units dictionary if already there. if not (colname in self.data.columns): units[colname] = unit # Convert the given quantity into values for given units if necessary. values = quantity if isinstance(values, astropy.units.quantity.Quantity) and overwrite: values = values.to(units[colname]).value # Update or add the data. if not (colname in self.data.columns) or overwrite: data[colname] = values # Return a new TimeSeries with the given updated/added column. return self.__class__(data, meta, units) def sort_index(self, **kwargs): """Returns a sorted version of the TimeSeries object. Generally this shouldn't be necessary as most TimeSeries operations sort the data anyway to ensure consistent behaviour when truncating. Returns ------- newts : `~sunpy.timeseries.TimeSeries` A new time series in ascending chronological order. """ return GenericTimeSeries(self.data.sort_index(**kwargs), TimeSeriesMetaData(copy.copy(self.meta.metadata)), copy.copy(self.units)) def truncate(self, a, b=None, int=None): """Returns a truncated version of the TimeSeries object. Parameters ---------- a : `sunpy.time.TimeRange`, `str` or `int` Either a time range to truncate to, or a start time in some format recognised by pandas, or a index integer. b : `str` or `int` If specified, the end time of the time range in some format recognised by pandas, or a index integer. int : `int` If specified, the integer indicating the slicing intervals. Returns ------- newts : `~sunpy.timeseries.TimeSeries` A new time series with only the selected times. """ # Evaluate inputs # If given strings, then use to create a sunpy.time.timerange.TimeRange # for the SunPy text date parser. if isinstance(a, str) and isinstance(b, str): a = TimeRange(a, b) if isinstance(a, TimeRange): # If we have a TimeRange, extract the values start = a.start end = a.end else: # Otherwise we already have the values start = a end = b # If an interval integer was given then use in truncation. truncated_data = self.data.sort_index()[start:end:int] # Truncate the metadata # Check there is data still truncated_meta = TimeSeriesMetaData([]) if len(truncated_data) > 0: tr = TimeRange(truncated_data.index.min(), truncated_data.index.max()) truncated_meta = TimeSeriesMetaData(copy.deepcopy(self.meta.metadata)) truncated_meta._truncate(tr) # Build similar TimeSeries object and sanatise metadata and units. object = self.__class__(truncated_data.sort_index(), truncated_meta, copy.copy(self.units)) object._sanitize_metadata() object._sanitize_units() return object def extract(self, column_name): """Returns a new time series with the chosen column. Parameters ---------- column_name : `str` A valid column name. Returns ------- newts : `~sunpy.timeseries.TimeSeries` A new time series with only the selected column. """ """ # TODO allow the extract function to pick more than one column if isinstance(self, pandas.Series): return self else: return GenericTimeSeries(self.data[column_name], TimeSeriesMetaData(self.meta.metadata.copy())) """ # Extract column and remove empty rows data = self.data[[column_name]].dropna() # Build generic TimeSeries object and sanatise metadata and units. object = GenericTimeSeries(data.sort_index(), TimeSeriesMetaData(copy.copy(self.meta.metadata)), copy.copy(self.units)) object._sanitize_metadata() object._sanitize_units() return object def concatenate(self, otherts, **kwargs): """Concatenate with another TimeSeries. This function will check and remove any duplicate times. It will keep the column values from the original time series to which the new time series is being added. Parameters ---------- otherts : `~sunpy.timeseries.TimeSeries` Another time series. same_source : `bool` Optional Set to true to check if the sources of the time series match. Returns ------- newts : `~sunpy.timeseries.TimeSeries` A new time series. Debate: decide if we want to be able to concatenate multiple time series at once. """ # check to see if nothing needs to be done if self == otherts: return self # Check the sources match if specified. same_source = kwargs.get('same_source', False) if same_source and not (isinstance(otherts, self.__class__)): raise TypeError("TimeSeries classes must match if specified.") # Concatenate the metadata and data meta = self.meta.concatenate(otherts.meta) data = pd.concat([self.data.copy(), otherts.data], **kwargs) # Add all the new units to the dictionary. units = OrderedDict() units.update(self.units) units.update(otherts.units) # If sources match then build similar TimeSeries. if self.__class__ == otherts.__class__: object = self.__class__(data.sort_index(), meta, units) else: # Build generic time series if the sources don't match. object = GenericTimeSeries(data.sort_index(), meta, units) # Sanatise metadata and units object._sanitize_metadata() object._sanitize_units() return object # #### Plotting Methods #### # def plot(self, axes=None, **plot_args): """Plot a plot of the time series Parameters ---------- axes : `~matplotlib.axes.Axes` or None If provided the image will be plotted on the given axes. Otherwise the current axes will be used. **plot_args : `dict` Any additional plot arguments that should be used when plotting. Returns ------- axes : `~matplotlib.axes.Axes` The plot axes. """ # Get current axes if axes is None: axes = plt.gca() axes = self.data.plot(ax=axes, **plot_args) return axes def peek(self, **kwargs): """Displays the time series in a new figure. Parameters ---------- **kwargs : `dict` Any additional plot arguments that should be used when plotting. Returns ------- fig : `~matplotlib.Figure` A plot figure. """ # Check we have a timeseries valid for plotting self._validate_data_for_ploting() # Now make the plot figure = plt.figure() self.plot(**kwargs) figure.show() return figure def _validate_data_for_ploting(self): """Raises an exception if the timeseries is invalid for plotting. To be added into all the peek methods in all source sup-classes. Currently only checks if we have an empty timeseries, where: len(self.data) == 0 """ # Check we have a valid TS if len(self.data) == 0: raise ValueError('The timeseries can\'t be plotted as it has no data present. (len(self.data) == 0)') # #### Miscellaneous #### # def _validate_meta(self): """ Validates the meta-information associated with a TimeSeries. This method includes very basic validation checks which apply to all of the kinds of files that SunPy can read. Datasource-specific validation should be handled in the relevant file in the sunpy.timeseries.sources package. Allows for default unit assignment for: COL_UNITS """ warnings.simplefilter('always', Warning) # for meta_property in ('cunit1', 'cunit2', 'waveunit'): if (self.meta.get(meta_property) and u.Unit(self.meta.get(meta_property), parse_strict='silent').physical_type == 'unknown'): warnings.warn("Unknown value for "+meta_property.upper(), Warning) def _validate_units(self, units, **kwargs): """ Validates the astropy unit-information associated with a TimeSeries. This method includes very basic validation checks which apply to all of the kinds of files that SunPy can read. Datasource-specific validation should be handled in the relevant file in the sunpy.timeseries.sources package. Allows for default unit assignment for: COL_UNITS """ warnings.simplefilter('always', Warning) result = True for key in units: if not isinstance(units[key], astropy.units.UnitBase): # If this is not a unit then this can't be a valid units dict. result = False warnings.warn("Invalid unit given for \""+str(key)+"\"", Warning) return result def _sanitize_units(self, **kwargs): """ Sanitises the collections.OrderedDict used to store the units. Primarily this method will: Remove entries that don't match up to a column, Add unitless entries for columns with no units defined. Re-arrange the order of the dictionary to match the columns. """ warnings.simplefilter('always', Warning) # Populate unspecified units: for column in set(self.data.columns.tolist()) - set(self.units.keys()): # For all columns not present in the units dictionary. self.units[column] = u.dimensionless_unscaled warnings.warn("Unknown units for \""+str(column)+"\"", Warning) # Re-arrange so it's in the same order as the columns and removed unused. units = OrderedDict() for column in self.data.columns.tolist(): units.update({column:self.units[column]}) # Now use the amended units Ordered Dictionary self.units = units def _sanitize_metadata(self, **kwargs): """ Sanitises the TimeSeriesMetaData object used to store the metadata. Primarily this method will: Remove entries outside of the datas TimeRange or truncate TimeRanges if the metadata overflows past the data, Remove column references in the metadata that don't match to a column in the data. Remove metadata entries that have no columns matching the data. """ warnings.simplefilter('always', Warning) # Truncate the metadata self.meta._truncate(self.time_range) # Remove non-existant columns redundant_cols = list(set(self.meta.columns) - set(self.columns)) self.meta._remove_columns(redundant_cols) # #### Export/Output Methods #### # def to_table(self, **kwargs): """ Return an Astropy Table of the give TimeSeries object. Returns ------- newtable : `~astrpy.table` A new astropy table containing the data from the time series. The table will include units where relevant. """ # ToDo: Table.from_pandas(df) doesn't include the index column. Add request? # Get data columns table = Table.from_pandas(self.data) # Get index column and add to table. index_col = Column(self.data.index.values, name='date') table.add_column(index_col, index=0) # Add in units. for key in self.units: table[key].unit = self.units[key] # Output the table return table def to_dataframe(self, **kwargs): """ Return a Pandas DataFrame of the give TimeSeries object. Returns ------- newdf : `~pandas.core.frame.DataFrame` A Pandas Dataframe containing the data. """ return self.data def to_array(self, **kwargs): """ Return a numpy array of the give TimeSeries object. Parameters ---------- columns: `list`, optional, default:None If None, return all columns minus the index, otherwise, returns specified columns. Returns ------- values : `~numpy.ndarray` If the caller is heterogeneous and contains booleans or objects, the result will be of dtype=object. See Notes. """ return self.data.as_matrix(**kwargs) def __eq__(self, other): """ Check two TimeSeries objects are the same, they have matching type, data, metadata and units entries. Parameters ---------- other : `~sunpy.timeseries.GenericTimeSeries` The second TimeSeries object to compare with. Returns ------- result : `bool` """ match = True if isinstance(other, type(self)): if (not self.data.equals(other.data)) or (self.meta != other.meta) or (self.units != other.units): match = False else: match = False return match def __ne__(self, other): """ Check two TimeSeries objects are not the same, they don't have matching type, data, metadata and/or units entries. Parameters ---------- other : `~sunpy.timeseries.GenericTimeSeries` The second TimeSeries object to compare with. Returns ------- result : `bool` """ return not self == other @classmethod def _parse_file(cls, filepath): """Parses a file - to be implemented in any subclass that may use files""" return NotImplemented sunpy-0.8.3/sunpy/util/0000755000175000017500000000000013232563477015243 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/util/tests/0000755000175000017500000000000013232563477016405 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/util/tests/__init__.py0000644000175000001440000000002713210261730017462 0ustar nabil00000000000000# -*- coding: utf-8 -*-sunpy-0.8.3/sunpy/util/tests/test_cond_dispatch.py0000644000175000017500000000345313231613140022603 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- # Author: Florian Mayer from __future__ import absolute_import, division, print_function import pytest from sunpy.util.cond_dispatch import ConditionalDispatch @pytest.fixture def oddeven(request): f = ConditionalDispatch() # Multiply even numbers by two. f.add(lambda x: 2 * x, lambda x: x % 2 == 0) # Multiply odd numbers by three. f.add(lambda x: 3 * x, lambda x: x % 2 == 1) return f def test_dispatch(oddeven): assert oddeven(2) == 4 assert oddeven(3) == 9 def test_wrong_sig(oddeven): with pytest.raises(TypeError) as exc_info: oddeven(y=2) assert "There are no functions matching your input parameter signature." in str( exc_info.value) def test_nocond(): f = ConditionalDispatch() # Multiply even numbers by two. f.add(lambda x: 2 * x, lambda x: x % 2 == 0) with pytest.raises(TypeError) as exc_info: f(3) assert "Your input did not fulfill the condition for any function." in str( exc_info.value) def test_else(): f = ConditionalDispatch() # Multiply even numbers by two. f.add(lambda x: 2 * x, lambda x: x % 2 == 0) f.add(lambda x: 3 * x) assert f(2) == 4 assert f(3) == 9 def test_else2(): # This verifies else branches do not catch cases that are covered # by cases added later. f = ConditionalDispatch() # Because gcd(2, 3) == 1, 2 | x and 3 | x are mutually exclusive. f.add(lambda x: 2 * x, lambda x: x % 2 == 0) f.add(lambda x: 3 * x) f.add(lambda x: 4 * x, lambda x: x % 3 == 0) assert f(2) == 4 assert f(3) == 12 assert f(5) == 15 def test_types(): f = ConditionalDispatch() f.add(lambda x: 2 * x, lambda x: x % 2 == 0, [int]) with pytest.raises(TypeError): f(2.0) sunpy-0.8.3/sunpy/util/tests/test_datatype_factory_base.py0000644000175000017500000001172713231613140024340 0ustar nabilnabil00000000000000from __future__ import absolute_import, division, print_function import pytest from sunpy.util.datatype_factory_base import BasicRegistrationFactory from sunpy.util.datatype_factory_base import NoMatchError from sunpy.util.datatype_factory_base import MultipleMatchError from sunpy.util.datatype_factory_base import ValidationFunctionError class BaseWidget(object): def __init__(self, *args, **kwargs): pass class DefaultWidget(BaseWidget): pass class StandardWidget(BaseWidget): @classmethod def _factory_validation_function(cls, *args, **kwargs): return kwargs.get('style') == 'standard' class DuplicateStandardWidget(BaseWidget): @classmethod def _factory_validation_function(cls, *args, **kwargs): return kwargs.get('style') == 'standard' class FancyWidget(BaseWidget): @classmethod def _factory_validation_function(cls, *args, **kwargs): return kwargs.get('style') == 'fancy' and 'feature' in kwargs class ExternallyValidatedWidget(BaseWidget): pass def external_validation_function(*args, **kwargs): return kwargs.get('style') == 'external' class UnvalidatedWidget(BaseWidget): pass class MissingClassMethodWidget(BaseWidget): def _factory_validation_function(cls, *args, **kwargs): return kwargs.get('style') == 'missing' class DifferentValidationWidget(BaseWidget): @classmethod def different_validation_function(cls, *args, **kwargs): return kwargs.get('style') == 'different' class MissingClassMethodDifferentValidationWidget(BaseWidget): def different_validation_function(cls, *args, **kwargs): return kwargs.get('style') == 'missing-different' class TestBasicRegistrationFactory(object): def test_default_factory(self): DefaultFactory = BasicRegistrationFactory() DefaultFactory.register(DefaultWidget, is_default=True) assert DefaultFactory.default_widget_type == DefaultWidget DefaultFactory.register(StandardWidget) DefaultFactory.register(FancyWidget) DefaultFactory.register(ExternallyValidatedWidget, validation_function=external_validation_function) assert type(DefaultFactory()) is DefaultWidget assert type(DefaultFactory(style='standard')) is StandardWidget assert type(DefaultFactory(style='fancy')) is DefaultWidget assert type(DefaultFactory(style='fancy', feature="present")) is FancyWidget assert type(DefaultFactory(style='external')) is ExternallyValidatedWidget with pytest.raises(ValidationFunctionError): DefaultFactory.register(UnvalidatedWidget) with pytest.raises(ValidationFunctionError): DefaultFactory.register(MissingClassMethodWidget) DefaultFactory.unregister(StandardWidget) assert type(DefaultFactory(style='standard')) is not StandardWidget def test_validation_fun_not_callable(self): TestFactory = BasicRegistrationFactory() with pytest.raises(AttributeError): TestFactory.register(StandardWidget, validation_function='not_callable') def test_no_default_factory(self): NoDefaultFactory = BasicRegistrationFactory() NoDefaultFactory.register(StandardWidget) NoDefaultFactory.register(FancyWidget) with pytest.raises(NoMatchError): NoDefaultFactory() # Raises because all requirements are not met for FancyWidget and no # default is present. with pytest.raises(NoMatchError): NoDefaultFactory(style='fancy') assert type(NoDefaultFactory(style='standard')) is StandardWidget assert type(NoDefaultFactory(style='fancy', feature='present')) is FancyWidget def test_with_external_registry(self): external_registry = {} FactoryWithExternalRegistry = \ BasicRegistrationFactory(registry=external_registry) assert len(external_registry) == 0 FactoryWithExternalRegistry.register(StandardWidget) assert type(FactoryWithExternalRegistry(style='standard')) is StandardWidget # Ensure the 'external_registry' is being populated see #1988 assert len(external_registry) == 1 def test_multiple_match_factory(self): MultipleMatchFactory = BasicRegistrationFactory() MultipleMatchFactory.register(StandardWidget) MultipleMatchFactory.register(DuplicateStandardWidget) with pytest.raises(MultipleMatchError): MultipleMatchFactory(style='standard') def test_extra_validation_factory(self): ExtraValidationFactory = \ BasicRegistrationFactory( additional_validation_functions=['different_validation_function']) ExtraValidationFactory.register(DifferentValidationWidget) assert type(ExtraValidationFactory(style='different')) is DifferentValidationWidget with pytest.raises(ValidationFunctionError): ExtraValidationFactory.register(MissingClassMethodDifferentValidationWidget) sunpy-0.8.3/sunpy/util/tests/test_metadata.py0000644000175000017500000002452113231613140021560 0ustar nabilnabil00000000000000import pytest from sunpy.util.metadata import MetaDict def check_contents(metadict_inst, expected): """ Ensure that the key/values of `metadict_inst` match those of the key/value pairs in `expected`. The case of the keys is ignored, as is the order. """ assert len(metadict_inst) == len(expected) for key, val in expected: assert metadict_inst[key.upper()] == val def check_insertion_order(metadict_inst, expected): """ Ensure that the keys of `metadict_inst` are in the same order as the keys in `expected`. The keys case is ignored. """ def normalise_keys(lst_pairs): return [key.lower() for key, _ in lst_pairs] assert normalise_keys(metadict_inst.items()) == normalise_keys(expected) def check_contents_and_insertion_order(metadict_inst, expected): """ Ensure both the contents and order of the the key/values of `metadict_inst` match the key/values in `expected`. Keys are case insensitive. Parameters ---------- metadict_inst: sunpy.util.metadata.MetaDict a Metadict instance under test expected: iterable object of key/value pairs the values we expect from a test """ check_contents(metadict_inst, expected) check_insertion_order(metadict_inst, expected) def pairs_to_dict(lst_of_pairs): """ Convert a list/tuple of lists/tuples to a dictionary Parameters ---------- lst_of_pairs: iteterable object of iterable objects an iterable containing iterables, each of these contained iterables is a key/value pair. Examples -------- >>> pairs_to_dict([['a', 1], ['b', 2]]) # doctest: +SKIP {'a': 1, 'b': 2} >>> pairs_to_dict([('x', 34), ('y', 56)]) # doctest: +SKIP {'x': 34, 'y': 56} """ return {kv_pair[0]: kv_pair[1] for kv_pair in lst_of_pairs} @pytest.fixture def sea_locations(): return [['labrador', 'americas'], ['Norwegian', 'Europe'], ['BALTIC', 'europe'], ['LaPteV', 'arctic']] @pytest.fixture def atomic_weights(): return [['hydrogen', 1], ['chromium', 24], ['mercury', 80], ['iridium', 77]] @pytest.fixture def seas_metadict(sea_locations): return MetaDict(sea_locations) # Test constructors `MetaDict.__init__(...)` def test_init_with_lst_of_lsts(seas_metadict, sea_locations): """ Initialise `MetaDict` with a list of lists. Each sub list is a key/value pair. Example ------- >>> m = MetaDict([['H', 'Hydrogen'], ['B', 'Boron']]) """ check_contents_and_insertion_order(MetaDict(sea_locations), sea_locations) def test_init_with_tuple_of_tuples(sea_locations): """ Initialise `MetaDict` with a tuple of tuples. Each 'sub-tuple' is a key/value pair. Example ------- >>> c = MetaDict((('Be', 21), ('Nb', 21))) """ in_tuple = tuple(tuple(kv_pair) for kv_pair in sea_locations) check_contents_and_insertion_order(MetaDict(in_tuple), sea_locations) def test_init_with_dict(sea_locations): """ Initialise `MetaDict` with standard Python dictionary Order of insertion is *not* preserved - only check the contents. """ check_contents(MetaDict(pairs_to_dict(sea_locations)), sea_locations) def test_init_with_metadict(atomic_weights): """ Initialise `MetaDict` with another `MetaDict`. """ original = MetaDict(atomic_weights) new = MetaDict(original) check_contents_and_insertion_order(new, atomic_weights) # It's not just a simple reassignemnet assert id(original) != id(new) def test_init_with_illegal_arg(): """ Ensure attempt to initialise with a nonsensical data structure is rejected. """ with pytest.raises(TypeError): MetaDict(set(('a', 'b', 'c', 'd'))) # Test individual methods def test_membership(seas_metadict): """ Test `MetaDict.__contains__(...)` """ assert 'labrador' in seas_metadict assert 'pechora' not in seas_metadict def test_getitem(seas_metadict): """ Test `MetaDict.__getitem__(...)` """ assert seas_metadict['Norwegian'] == 'Europe' assert seas_metadict['BALTIC'] != 'arctic' with pytest.raises(KeyError): seas_metadict['key-not-exists'] def test_setitem_existing_entry(seas_metadict): """ Test `MetaDict.__setitem__(...)` on an existing entry """ len_before = len(seas_metadict) seas_metadict['NORWEGIAN'] = 'Scandinavia' assert len(seas_metadict) == len_before assert seas_metadict['NORWEGIAN'] == 'Scandinavia' def test_setitem_new_entry(seas_metadict): """ Test `MetaDict.__setitem__(...)`. Add a new entry """ len_before = len(seas_metadict) seas_metadict['Irish'] = 'N.Europe' assert len(seas_metadict) == len_before + 1 assert seas_metadict['Irish'] == 'N.Europe' def test_get(seas_metadict): """ Test `MetaDict.get(...)` """ assert seas_metadict.get('BALTIC') == 'europe' assert seas_metadict.get('atlantic') is None default_value = 'Unknown' assert seas_metadict.get('sargasso', default=default_value) == default_value def test_setdefault(seas_metadict): """ Test `MetaDict.setdefault(...)` """ seas_metadict.setdefault('poseidon', 'NOT-FOUND') assert seas_metadict.get('poseidon') == 'NOT-FOUND' assert seas_metadict['poseidon'] == 'NOT-FOUND' # Should only impact key 'poseidon' assert seas_metadict.get('Wandel') is None def test_has_key(seas_metadict): """ Test `MetaDict.has_key(...)` """ # suppress pep8/flake8 'W601 .has_key() is deprecated, ...' warnings # as MetaDict explicitly supports the 'has_key()' method assert seas_metadict.has_key('LaPteV') is True # noqa assert seas_metadict.has_key('Beaufort') is False # noqa def test_pop(seas_metadict): """ Test `MetaDict.pop(...)` """ # Nothing to 'pop', nothing should change len_before = len(seas_metadict) seas_metadict.pop('kara') is None assert len(seas_metadict) == len_before # Nothing to 'pop', nothing should change but, we should get the default value default_value = 'not-recognized' assert seas_metadict.pop('lincoln', default=default_value) == default_value assert len(seas_metadict) == len_before assert seas_metadict.pop('baltic') == 'europe' assert len(seas_metadict) == len_before - 1 # Test `MetaDict.update(...)`. def test_update_with_distinct_keys(seas_metadict, sea_locations, atomic_weights): """ Update the MetaDict 'world_seas', with another MetaDict, 'chem_elems' which has a completley different set of keys. This should result in adding 'chem_elems' onto 'world_seas'. Original insertion order of 'world_seas' should be preserved. """ world_seas = seas_metadict chem_elems = MetaDict(atomic_weights) world_seas.update(chem_elems) check_contents_and_insertion_order(world_seas, sea_locations + atomic_weights) @pytest.fixture def seas_and_atomic_weights(): """ A mixture of key/value data from `seas` & `atomic_weights` """ return [['norwegian', 'NORWAY'], ['Chromium', 24], ['laptev', 'russia'], ['Iridium', 77]] @pytest.fixture def combined_seas_atomic(): """ The expected result of a `MetaDict` initailsed with `sea_locations` and then updated with `seas_and_atomic_weights` """ return [['labrador', 'americas'], ['Norwegian', 'NORWAY'], ['BALTIC', 'europe'], ['LaPteV', 'russia'], ['Chromium', 24], ['Iridium', 77]] def test_update_with_like_keys(seas_metadict, seas_and_atomic_weights, combined_seas_atomic): """ Update the `MetaDict` 'world_seas' with another `MetaDict`, 'atomic_seas'. 'atomic_seas' has some keys which are the same as 'world_seas', some are different. In 'world_seas', values of existing keys should be updated but, original insertion order should be preserved """ world_seas = seas_metadict atomic_seas = MetaDict(seas_and_atomic_weights) world_seas.update(atomic_seas) check_contents_and_insertion_order(world_seas, combined_seas_atomic) def test_update_with_dict(seas_metadict, seas_and_atomic_weights, combined_seas_atomic): """ Update an existing `MetaDict` with a standard python dictionary some of whose keys are the same, some are different. In the updated `MetaDict`, values of existing keys should be updated but as we are using a standard dictionary, insertion order of the new items is non-deterministic so only check the contents of the updated structure. """ seas_metadict.update(pairs_to_dict(seas_and_atomic_weights)) check_contents(seas_metadict, combined_seas_atomic) def test_update_with_same_metadict(seas_metadict, sea_locations): """ Upadate a 'MetaDict' with itself. Nothing should changes. """ seas_metadict.update(seas_metadict) check_contents_and_insertion_order(seas_metadict, sea_locations) def test_key_case_insensitivity(seas_metadict): """ The keys of a `Metadict` are case insensitive. Using the key 'BALTIC' is identical to the key 'baltic'. """ # membership assert 'laptev' in seas_metadict assert 'LAPTEV' in seas_metadict # get assert seas_metadict['norwegian'] == 'Europe' assert seas_metadict['NORWEGIAN'] == 'Europe' assert seas_metadict.get('labrador') == 'americas' assert seas_metadict.get('labRAdor') == 'americas' # suppress pep8/flake8 'W601 .has_key() is deprecated, ...' warnings # as MetaDict explicitly supports the 'has_key()' method assert seas_metadict.has_key('BALTIC') # noqa assert seas_metadict.has_key('balTIC') # noqa # This key already exists. It should *not* take on the default value seas_metadict.setdefault('norwEgiaN', default='Sweden') assert seas_metadict['norwEgiaN'] == 'Europe' assert seas_metadict['Norwegian'] == 'Europe' assert seas_metadict.get('norwEgiaN') == 'Europe' # setting, existing entry seas_metadict['LaPteV'] = 'japan' assert seas_metadict['LaPteV'] == 'japan' assert seas_metadict['LAPTEV'] == 'japan' assert seas_metadict.get('LApTEV') == 'japan' # setting, new entry seas_metadict['bering'] = 'Russia' assert seas_metadict['bering'] == 'Russia' assert seas_metadict['BeRinG'] == 'Russia' assert seas_metadict.get('BERING') == 'Russia' sunpy-0.8.3/sunpy/util/tests/test_multimethod.py0000644000175000017500000000407213231613140022332 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- # Author: Florian Mayer from __future__ import absolute_import, division, print_function import pytest import sys from sunpy.util.multimethod import MultiMethod, FAIL, WARN, TypeWarning def test_super(): class String(str): pass mm = MultiMethod(lambda *a: a) with pytest.raises(TypeError): mm.super() @mm.add_dec(str, str) def foo(foo, bar): return 'String' # Suppress pep8 warning "F811 redefinition of unused 'foo' ..." @mm.add_dec(String, str) # noqa def foo(foo, bar): return 'Fancy', mm.super(super(String, foo), bar) assert mm('foo', 'bar') == 'String' assert mm(String('foo'), 'bar') == ('Fancy', 'String') def test_override(recwarn): class String(str): pass mm = MultiMethod(lambda *a: a) @mm.add_dec(str, str) def foo(foo, bar): return 'String' pytest.raises( TypeError, mm.add_dec(String, str, override=FAIL), lambda x, y: None ) mm.add_dec(String, str, override=WARN)(lambda x, y: None) w = recwarn.pop(TypeWarning) assert 'Definition (String, str) overrides prior definition (str, str).' in str(w.message) # Illegal value for 'override' pytest.raises( ValueError, mm.add_dec(String, String, override=sys.maxsize), lambda x, y: None ) def test_invalid_arg_for_override_to_add_method(): def dummy_validator(): pass mm = MultiMethod(lambda *a: a) # See #1991 with pytest.raises(ValueError): mm.add(dummy_validator, tuple(), override=sys.maxsize) def test_call_cached(): def sum_together(first, second): return first + second # Setup mm = MultiMethod(lambda *a: a) mm.add(sum_together, (int, int, )) assert mm(3, 4) == 7 # The following call 'should' use the previously cached call # You'll only see the result of this in the code coverage test though assert mm(1, 2) == 3 def test_no_registered_methods(): mm = MultiMethod(lambda *a: a) with pytest.raises(TypeError): mm(2) sunpy-0.8.3/sunpy/util/tests/test_scraper.py0000644000175000017500000001624113231613140021437 0ustar nabilnabil00000000000000from __future__ import absolute_import, division, print_function import pytest import datetime from sunpy.time import TimeRange from sunpy.util.scraper import Scraper PATTERN_EXAMPLES = [ ('%b%y', datetime.timedelta(days=31)), ('%m%y', datetime.timedelta(days=31)), ('%H%d', datetime.timedelta(hours=1)), ('%y%b', datetime.timedelta(days=31)), ] def testDirectoryDatePattern(): s = Scraper('%Y/%m/%d/%Y%m%d_%H%M%S_59.fit.gz') testpath = '2014/03/05/20140305_013000_59.fit.gz' d = datetime.datetime(2014, 3, 5, 1, 30) assert s.matches(testpath, d) def testDirectoryDatePatternFalse(): s = Scraper('%Y/%m/%d/%Y%m%d_%H%M%S_59.fit.gz') testpath = '2013/03/05/20140305_013000_59.fit.gz' d = datetime.datetime(2014, 3, 5, 1, 30) assert not s.matches(testpath, d) def testDirectoryObsPattern(): s = Scraper('%y%m%d/{observatory}_%Y%m%d.fits', observatory='SDO') testpath = '140305/SDO_20140305.fits' d = datetime.datetime(2014, 3, 5) assert s.matches(testpath, d) def testDirectoryRange(): s = Scraper('%Y/%m/%d/%Y%m%d_%H.fit.gz') directory_list = ['2009/12/30/', '2009/12/31/', '2010/01/01/', '2010/01/02/', '2010/01/03/'] timerange = TimeRange('2009-12-30', '2010-01-03') assert s.range(timerange) == directory_list def testDirectoryRangeFalse(): s = Scraper('%Y%m%d/%Y%m%d_%H.fit.gz') directory_list = ['20091230/', '20091231/', '20100101/', '20090102/', '20090103/'] timerange = TimeRange('2009/12/30', '2010/01/03') assert s.range(timerange) != directory_list def testNoDateDirectory(): s = Scraper('mySpacecraft/myInstrument/xMinutes/aaa%y%b.ext') directory_list = ['mySpacecraft/myInstrument/xMinutes/'] timerange = TimeRange('2009/11/20', '2010/01/03') assert s.range(timerange) == directory_list @pytest.mark.parametrize('pattern, mintime', PATTERN_EXAMPLES) def test_smallerPattern(pattern, mintime): assert mintime == Scraper('')._smallerPattern(pattern) def testDirectoryRangeHours(): s = Scraper('%Y%m%d_%H/%H%M.csv') timerange = TimeRange('2009-12-31T23:40:00', '2010-01-01T01:15:00') assert len(s.range(timerange)) == 3 # 3 directories (1 per hour) def testDirectoryRange_single(): s = Scraper('%Y%m%d/%H_%M.csv') startdate = datetime.datetime(2010, 10, 10, 5, 0) enddate = datetime.datetime(2010, 10, 10, 7, 0) timerange = TimeRange(startdate, enddate) assert len(s.range(timerange)) == 1 def testDirectoryRange_Month(): s = Scraper('%Y%m/%d/%j_%H.txt') startdate = datetime.datetime(2008, 2, 20, 10) enddate = datetime.datetime(2008, 3, 2, 5) timerange = TimeRange(startdate, enddate) assert len(s.range(timerange)) == 12 startdate = datetime.datetime(2009, 2, 20, 10) enddate = datetime.datetime(2009, 3, 2, 5) timerange = TimeRange(startdate, enddate) assert len(s.range(timerange)) == 11 def testNoDirectory(): s = Scraper('files/%Y%m%d_%H%M.dat') startdate = datetime.datetime(2010, 1, 10, 20, 30) enddate = datetime.datetime(2010, 1, 20, 20, 30) timerange = TimeRange(startdate, enddate) assert len(s.range(timerange)) == 1 def testExtractDates_usingPattern(): # Standard pattern s = Scraper('data/%Y/%m/%d/fits/swap/swap_00174_fd_%Y%m%d_%H%M%S.fts.gz') testURL = 'data/2014/05/14/fits/swap/swap_00174_fd_20140514_200135.fts.gz' timeURL = datetime.datetime(2014, 5, 14, 20, 1, 35) assert s._extractDateURL(testURL) == timeURL # Not-full repeated pattern s = Scraper('data/%Y/fits/swap/swap_00174_fd_%Y%m%d_%H%M%S.fts.gz') testURL = 'data/2014/fits/swap/swap_00174_fd_20140514_200135.fts.gz' timeURL = datetime.datetime(2014, 5, 14, 20, 1, 35) assert s._extractDateURL(testURL) == timeURL def testExtractDates_notSeparators(): s = Scraper('data/%Y/%m/swap%m%d_%H%M%S') testURL = 'data/2014/05/swap0514_200135' timeURL = datetime.datetime(2014, 5, 14, 20, 1, 35) assert s._extractDateURL(testURL) == timeURL def testExtractDates_notSeparators_andSimilar(): s = Scraper('data/%Y/Jun%b%d_%H%M%S') testURL = 'data/2014/JunJun14_200135' timeURL = datetime.datetime(2014, 6, 14, 20, 1, 35) assert s._extractDateURL(testURL) == timeURL testURL = 'data/2014/JunMay14_200135' timeURL = datetime.datetime(2014, 5, 14, 20, 1, 35) assert s._extractDateURL(testURL) == timeURL # and testing with the month afterwards s = Scraper('data/%Y/%dJun%b_%H%M%S') testURL = 'data/2014/14JunJun_200135' timeURL = datetime.datetime(2014, 6, 14, 20, 1, 35) assert s._extractDateURL(testURL) == timeURL def testURL_pattern(): s = Scraper('fd_%Y%m%d_%H%M%S.fts') assert s._URL_followsPattern('fd_20130410_231211.fts') assert not s._URL_followsPattern('fd_20130410_231211.fts.gz') assert not s._URL_followsPattern('fd_20130410_ar_231211.fts.gz') @pytest.mark.xfail def testURL_patternMilliseconds(): s = Scraper('fd_%Y%m%d_%H%M%S_%e.fts') # NOTE: Seems that if below fails randomly - not understood why # with `== True` fails a bit less... assert s._URL_followsPattern('fd_20130410_231211_119.fts') assert not s._URL_followsPattern('fd_20130410_231211.fts.gz') assert not s._URL_followsPattern('fd_20130410_ar_231211.fts.gz') # Local files don't work # def testFilesRange_sameDirectory_local(): # s = Scraper('/'.join(['file:/',sunpy.data.test.rootdir, # 'EIT','efz%Y%m%d.%H%M%S_s.fits'])) # print(s.pattern) # print(s.now) # startdate = datetime.datetime(2004, 3, 1, 4, 0) # enddate = datetime.datetime(2004, 3, 1, 6, 30) # assert len(s.filelist(TimeRange(startdate, enddate))) == 3 # startdate = datetime.datetime(2010, 1, 10, 20, 30) # enddate = datetime.datetime(2010, 1, 20, 20, 30) # assert len(s.filelist(TimeRange(startdate, enddate))) == 0 @pytest.mark.xfail @pytest.mark.remote_data def testFilesRange_sameDirectory_remote(): pattern = ('http://solarmonitor.org/data/%Y/%m/%d/' 'fits/{instrument}/' '{instrument}_00174_fd_%Y%m%d_%H%M%S.fts.gz') s = Scraper(pattern, instrument='swap') startdate = datetime.datetime(2014, 5, 14, 0, 0) enddate = datetime.datetime(2014, 5, 14, 6, 30) timerange = TimeRange(startdate, enddate) assert len(s.filelist(timerange)) == 2 startdate = datetime.datetime(2014, 5, 14, 21, 0) enddate = datetime.datetime(2014, 5, 14, 23, 30) timerange = TimeRange(startdate, enddate) assert len(s.filelist(timerange)) == 0 @pytest.mark.xfail @pytest.mark.remote_data def testFilesRange_sameDirectory_months_remote(): pattern = ('http://www.srl.caltech.edu/{spacecraft}/DATA/{instrument}/' 'Ahead/1minute/AeH%y%b.1m') s = Scraper(pattern, spacecraft='STEREO', instrument='HET') startdate = datetime.datetime(2007, 8, 1) enddate = datetime.datetime(2007, 9, 10) timerange = TimeRange(startdate, enddate) assert len(s.filelist(timerange)) == 2 @pytest.mark.remote_data def test_ftp(): pattern = 'ftp://solar-pub.nao.ac.jp/pub/nsro/norh/data/tcx/%Y/%m/tca%y%m%d' s = Scraper(pattern) timerange = TimeRange('2016/5/18 15:28:00', '2016/5/20 16:30:50') assert len(s.filelist(timerange)) == 2 sunpy-0.8.3/sunpy/util/tests/test_sysinfo.py0000644000175000001440000000025713210261730020461 0ustar nabil00000000000000from __future__ import absolute_import # -*- coding: utf-8 -*- import sunpy def test_sysinfo(): output = sunpy.util.get_sys_dict() assert isinstance(output, dict) sunpy-0.8.3/sunpy/util/tests/test_util.py0000644000175000017500000001030413231613140020747 0ustar nabilnabil00000000000000""" This module tests the functions implemented in sunpy.util.util. """ from __future__ import absolute_import, division, print_function import numpy as np import pytest from pytest_mock import mocker from sunpy.util import util def test_to_signed(): """ This should return a signed type that can hold uint32 and ensure that an exception is raised when attempting to convert an unsigned 64 bit integer to an integer """ assert util.to_signed(np.dtype('uint32')) == np.dtype('int64') with pytest.raises(ValueError): util.to_signed(np.dtype('uint64')) == np.dtype('int64') def test_unique(): """ This should add the unique values of itr to unique_list. """ itr = [6, 1, 2, 1, 7, 41.2, '41.2', 1, '41.2'] unique_list = [] for elem in util.unique(itr): unique_list.append(elem) assert unique_list == [6, 1, 2, 7, 41.2, '41.2'] def test_unique_key(): """ This should add each element of itr to unique_list if no preceding element is congruent to it in mod 10. """ itr = [7, 3, 17, 104, 6, 1006, 117, 14, 10] unique_list = [] for elem in util.unique(itr, lambda x: x % 10): unique_list.append(elem) assert unique_list == [7, 3, 104, 6, 10] def test_print_table(): """ This should return a string representation of lst with table elements left-justified and with columns separated by dashes. """ lst = [['n', 'sqrt(n)', 'n^2'], ['1', '1', '1'], ['4', '2', '16'], ['3', '1.732', '9']] expected = ('n|sqrt(n)|n^2\n' '1|1 |1 \n' '4|2 |16 \n' '3|1.732 |9 ') assert util.print_table(lst, colsep='|') == expected def test_minimal_pairs(): """ This should return the pairs of elements from list1 and list2 with minimal difference between their values. """ list1 = [0, 5, 10, 15, 20, 25] list2 = [3, 12, 19, 21, 26, 29] assert list(util.minimal_pairs(list1, list2)) == [(1, 0, 2), (2, 1, 2), (4, 2, 1), (5, 4, 1)] def test_find_next(): """ This should return a generator yielding the nearest larger element in list2 for each element in list1 (or None if none exists after the previous element yielded from list2). """ list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9] list2 = [0, 2, 3, 5, 0, 0, 5, 9, 10, 15] assert list(util.find_next(list1, list2, None)) == [(1, 2), (2, 3), (3, 5), (4, 5), (5, 9), (6, 10), (7, 15), (8, None), (9, None)] def test_common_base(): """ This should return the base class common to each object in objs. """ class TestA(object): """Base test class.""" pass class TestB(TestA): """First inherited class.""" pass class TestC(TestA): """Second inherited class.""" pass inst_b = TestB() inst_c = TestC() objs = [inst_b, inst_c] assert util.common_base(objs) == TestA def test_merge(): """ This should return a sorted (from greatest to least) merged list from list1 and list2. """ list1 = [13, 11, 9, 7, 5, 3, 1] list2 = [14, 12, 10, 8, 6, 4, 2] result = list(util.merge([list1, list2])) assert result[::-1] == sorted(result) assert list(util.merge([[], [1], []])) == [1] def test_replacement_filename(): """ This should return a replacement path for the current file. """ assert util.replacement_filename(__file__).endswith('test_util.0.py') def test_replacement_filename_path_not_exists(mocker): """ If a candidate path does not exist, then just return it as it is OK to use """ path_not_exists = '/tmp' mocker.patch('os.path.exists', return_value=False) assert util.replacement_filename(path_not_exists) == path_not_exists def test_expand_list(): """ This should return an expanded version of list lst. """ lst = [1, 2, 3, [4, 5, 6], 7, (8, 9)] assert util.expand_list(lst) == [1, 2, 3, 4, 5, 6, 7, 8, 9] def test_expand_list_generator(): lst = ['a', 'b', [], (['c', 'd']), tuple(), ['e']] assert list(util.expand_list_generator(lst)) == ['a', 'b', 'c', 'd', 'e'] sunpy-0.8.3/sunpy/util/tests/test_xml.py0000644000175000017500000001410313232563447020612 0ustar nabilnabil00000000000000from __future__ import absolute_import, division, print_function from xml.parsers.expat import ExpatError from xml.dom.minidom import Document from xml.dom.minidom import parseString import pytest from sunpy.util import xml def test_xml_to_dict1(): """ should return dict of xml string """ source_xml = "\ one\ two\ " xml_dict = xml.xml_to_dict(source_xml) expected_dict = {u'outer': {u'inner2': u'two', u'inner1': u'one'}} assert xml_dict == expected_dict def test_xml_to_dict2(): """ should return dict of xml string and if a tag is duplicated it takes the last one. """ source_xml = "\ one-one\ one-two\ two-one\ two-two\ " xml_dict = xml.xml_to_dict(source_xml) expected_dict = {u'outer': {u'inner2': u'two-two', u'inner1': u'one-two'}} assert xml_dict == expected_dict def test_xml_to_dict3(): """ should return dict of xml string with empty value if there are no inner elements """ source_xml = "" xml_dict = xml.xml_to_dict(source_xml) expected_dict = {u'outer': ''} assert xml_dict == expected_dict def test_xml_to_dict4(): """ should return dict of xml string with empty value if there are no inner elements """ source_xml = "" xml_dict = xml.xml_to_dict(source_xml) expected_dict = {u'outer': ''} assert xml_dict == expected_dict def test_xml_to_dict5(): """ should return dict of xml string with 2 layer nesting """ source_xml = "\ \ one-one\ \ \ two-one\ \ " xml_dict = xml.xml_to_dict(source_xml) expected_dict = {u'outer': {u'mid2': {u'inner2': u'two-one'}, u'mid1': {u'inner1': u'one-one'}}} assert xml_dict == expected_dict def test_xml_to_dict6(): """ should return dict of xml string with 2 layer nesting and if a tag is duplicated it takes the last one. """ source_xml = "\ \ one-one\ \ \ two-one\ \ " xml_dict = xml.xml_to_dict(source_xml) expected_dict = {u'outer': {u'mid': {u'inner2': u'two-one'}}} assert xml_dict == expected_dict def test_xml_to_dict7(): """ should raise TypeError when passed None """ assert pytest.raises(TypeError, xml.xml_to_dict, None) def test_xml_to_dict8(): """ should raise TypeError when passed non string """ assert pytest.raises(TypeError, xml.xml_to_dict, 9) def test_xml_to_dict9(): """ should raise ExpatError when passed empty string """ assert pytest.raises(ExpatError, xml.xml_to_dict, "") def test_xml_to_dict10(): """ should raise ExpatError when passed space """ assert pytest.raises(ExpatError, xml.xml_to_dict, " ") def test_get_node_text1(): """ should raise NotTextNodeError if there is a non text node. """ doc = Document() outer = doc.createElement("outer") doc.appendChild(outer) pytest.raises(xml.NotTextNodeError, xml.get_node_text, doc) def test_get_node_text2(): """ should return empty string for a node with no child nodes. """ assert xml.get_node_text(Document()) == "" def test_get_node_text3(): """ should return node text """ node = parseString("one") text_node = node.childNodes[0] assert xml.get_node_text(text_node) == "one" def test_get_node_text4(): """ should raise AttributeError when sent None """ assert pytest.raises(AttributeError, xml.get_node_text, None) def test_get_node_text5(): """ should raise AttributeError when sent wrong type """ assert pytest.raises(AttributeError, xml.get_node_text, "wrong type") def test_node_to_dict1(): """ should return dict of node """ doc = Document() outer = doc.createElement("outer") doc.appendChild(outer) inner1 = doc.createElement("inner1") inner2 = doc.createElement("inner2") outer.appendChild(inner1) outer.appendChild(inner2) inner1_text = doc.createTextNode("one") inner2_text = doc.createTextNode("two") inner1.appendChild(inner1_text) inner2.appendChild(inner2_text) expected_dict = {'outer': {'inner2': 'two', 'inner1': 'one'}} xml_dict = xml.node_to_dict(doc) assert xml_dict == expected_dict def test_node_to_dict2(): """ should return dict of node double nested """ doc = Document() outer = doc.createElement("outer") doc.appendChild(outer) mid1 = doc.createElement("mid1") outer.appendChild(mid1) mid2 = doc.createElement("mid2") outer.appendChild(mid2) inner1 = doc.createElement("inner1") inner2 = doc.createElement("inner2") mid1.appendChild(inner1) mid2.appendChild(inner2) inner1_text = doc.createTextNode("one") inner2_text = doc.createTextNode("two") inner1.appendChild(inner1_text) inner2.appendChild(inner2_text) expected_dict = {'outer': {'mid2': {'inner2': 'two'}, 'mid1': {'inner1': 'one'}}} xml_dict = xml.node_to_dict(doc) assert xml_dict == expected_dict def test_node_to_dict3(): """ should return empty dict when sent empty doc """ expected_dict = {} xml_dict = xml.node_to_dict(Document()) assert xml_dict == expected_dict def test_node_to_dict4(): """ should raise AttributeError when sent wrong type """ assert pytest.raises(AttributeError, xml.node_to_dict, 9) def test_node_to_dict5(): """ should raise AttributeError when sent None """ assert pytest.raises(AttributeError, xml.node_to_dict, None) sunpy-0.8.3/sunpy/util/__init__.py0000644000175000017500000000042113231613140017327 0ustar nabilnabil00000000000000"""SunPy utility functions""" from __future__ import absolute_import, division, print_function from sunpy.util.exceptions import * from sunpy.util.decorators import * from sunpy.util.util import * from sunpy.util.sysinfo import * from sunpy.util.metadata import MetaDict sunpy-0.8.3/sunpy/util/cond_dispatch.py0000644000175000001440000002377113210261730017376 0ustar nabil00000000000000# -*- coding: utf-8 -*- # Author: Florian Mayer """ Offer a callable object that dispatches based on arbitrary conditions and function signature. That means, whenever it is called, it finds the registered methods that match the input's signature and then checks for user-defined conditions and types. First, we need to create a new ConditionalDispatch >>> from sunpy.util.cond_dispatch import ConditionalDispatch >>> fun = ConditionalDispatch() We then can start adding branches, in this case we add a branch for even integers, in which case the function applied is a multiplication by three. >>> fun.add(lambda x: 3 * x, lambda x: x % 2 == 0, [int]) By adding the other branch (odd), the function can be used for all integers. In the case of an odd integer, we double the input. Please note that the system has no way of verifying the conditions are mutually exclusive. In some cases it can even be useful to use not mutually exclusive conditions, in which case the branch that was added the earliest is executed. >>> fun.add(lambda x: 2 * x, lambda x: x % 2 == 1, [int]) We can verify this is working. >>> fun(2) 6 >>> fun(3) 6 And that using a float, e.g., does not. >>> fun(3.2) Traceback (most recent call last): File "", line 1, in File "/home/florian/Projects/sunpy/sunpy/util/cond_dispatch.py", line 128, in __call__ "There are no functions matching your input parameter " TypeError: There are no functions matching your input parameter signature. We can then add a branch for floats, giving the condition None that means that this branch is always executed for floats. >>> fun.add(lambda y: 5 * y, None, [float]) Also note that the float branch takes y, while the integer branch takes x. Thus, if the user explicitly passes fun(x=1) using a keyword argument, only the integer branch is considered. This can be useful if the user wants control over which kind of data they are passing the the function. >>> fun(2.0) 10.0 >>> fun(y=2) Traceback (most recent call last): File "", line 1, in File "/home/florian/Projects/sunpy/sunpy/util/cond_dispatch.py", line 128, in __call__ "There are no functions matching your input parameter " TypeError: There are no functions matching your input parameter signature. >>> fun(y=2.5) 12.5 >>> fun(x=2) 6 >>> fun(x=2.5) Traceback (most recent call last): File "", line 1, in File "/home/florian/Projects/sunpy/sunpy/util/cond_dispatch.py", line 128, in __call__ "There are no functions matching your input parameter " TypeError: There are no functions matching your input parameter signature. """ from __future__ import absolute_import, division, print_function import inspect from itertools import chain, repeat from sunpy.extern.six.moves import zip __all__ = ['run_cls', 'matches_types', 'arginize', 'correct_argspec', 'matches_signature', 'ConditionalDispatch', 'fmt_argspec_types'] def run_cls(name): """ run_cls("foo")(cls, *args, **kwargs) -> cls.foo(*args, **kwargs) """ fun = lambda cls, *args, **kwargs: getattr(cls, name)(*args, **kwargs) fun.__name__ = str(name) fun.run_cls = True return fun def matches_types(fun, types, args, kwargs): """ See if args and kwargs match are instances of types. types are given in the order they are defined in the function. kwargs are automatically converted into that order. """ return all( isinstance(obj, cls) for obj, cls in zip( arginize(fun, args, kwargs), types ) ) def arginize(fun, a, kw): """ Turn args and kwargs into args by considering the function signature. """ args, varargs, keywords, defaults = correct_argspec(fun) if varargs is not None: raise ValueError names = args[len(a):] if defaults: defs = dict(zip(args[-len(defaults):], defaults)) else: defs = {} return list(a) + [kw.get(name, defs.get(name, None)) for name in names] def correct_argspec(fun): """ Remove first argument if method is bound. """ args, varargs, keywords, defaults = inspect.getargspec(fun) if inspect.ismethod(fun): args = args[1:] return args, varargs, keywords, defaults def matches_signature(fun, a, kw): """ Check whether function can be called with a as args and kw as kwargs. """ args, varargs, keywords, defaults = correct_argspec(fun) if varargs is None and len(a) > len(args): return False skw = set(kw) sargs = set(args[len(a):]) # There mayn't be unexpected parameters unless there is a **kwargs # in fun's signature. if keywords is None and skw - sargs != set(): return False rest = set(args[len(a):]) - set(kw) # If there are any arguments that weren't passed but do not have # defaults, the signature does not match. defs = set() if defaults is None else set(defaults) if keywords is None and rest > defs: return False return True class ConditionalDispatch(object): def __init__(self): self.funcs = [] self.nones = [] @classmethod def from_existing(cls, cond_dispatch): new = cls() new.funcs = cond_dispatch.funcs[:] new.nones = cond_dispatch.nones[:] return new def add_dec(self, condition): def _dec(fun): self.add(fun, condition) return fun return _dec def add(self, fun, condition=None, types=None, check=True): """ Add fun to ConditionalDispatch under the condition that the arguments must match. If condition is left out, the function is executed for every input that matches the signature. Functions are considered in the order they are added, but ones with condition=None are considered as the last: that means, a function with condition None serves as an else branch for that signature. conditions must be mutually exclusive because otherwise which will be executed depends on the order they are added in. Function signatures of fun and condition must match (if fun is bound, the bound parameter needs to be left out in condition). """ if condition is None: self.nones.append((fun, types)) elif check and correct_argspec(fun) != correct_argspec(condition): raise ValueError( "Signature of condition must match signature of fun." ) else: self.funcs.append((fun, condition, types)) def __call__(self, *args, **kwargs): matched = False for fun, condition, types in self.funcs: if (matches_signature(condition, args, kwargs) and (types is None or matches_types(condition, types, args, kwargs))): matched = True if condition(*args, **kwargs): return fun(*args, **kwargs) for fun, types in self.nones: if (matches_signature(fun, args, kwargs) and (types is None or matches_types(fun, types, args, kwargs))): return fun(*args, **kwargs) if matched: raise TypeError( "Your input did not fulfill the condition for any function." ) else: raise TypeError( "There are no functions matching your input parameter " "signature." ) def wrapper(self): return lambda *args, **kwargs: self(*args, **kwargs) def get_signatures(self, prefix="", start=0): """ Return an iterator containing all possible function signatures. If prefix is given, use it as function name in signatures, else leave it out. If start is given, leave out first n elements. If start is -1, leave out first element if the function was created by run_cls. """ for fun, condition, types in self.funcs: if start == -1: st = getattr(fun, 'run_cls', 0) else: st = start if types is not None: yield prefix + fmt_argspec_types(condition, types, st) else: args, varargs, keywords, defaults = correct_argspec(condition) args = args[st:] yield prefix + inspect.formatargspec( args, varargs, keywords, defaults ) for fun, types in self.nones: if types is not None: yield prefix + fmt_argspec_types(fun, types, st) else: args, varargs, keywords, defaults = correct_argspec(condition) args = args[st:] yield prefix + inspect.formatargspec( args, varargs, keywords, defaults ) def generate_docs(self): fns = (item[0] for item in chain(self.funcs, self.nones)) return '\n\n'.join("{0} -> :py:meth:`{1}`".format(sig, fun.__name__) for sig, fun in # The 1 prevents the cls from incorrectly being shown in the # documentation. zip(self.get_signatures("create", -1), fns) ) def fmt_argspec_types(fun, types, start=0): args, varargs, keywords, defaults = correct_argspec(fun) args = args[start:] types = types[start:] NULL = object() if defaults is None: defaults = [] defs = chain(repeat(NULL, len(args) - len(defaults)), defaults) spec = [] for key, value, type_ in zip(args, defs, types): # This is a work around for a bug introduced during Python 3 porting. # for some reason the type was being passed in as a length 1 tuple. # This extracts the type under that condition. SM 6/10/15 if isinstance(type_, tuple) and len(type_) == 1: type_ = type_[0] if value is NULL: spec.append("{0}: {1}".format(key, type_.__name__)) else: spec.append("{0}: {1} = {2}".format(key, type_.__name__, value)) if varargs is not None: spec.append('*{!s}'.format(varargs)) if keywords is not None: spec.append('**{!s}'.format(keywords)) return '(' + ', '.join(spec) + ')' sunpy-0.8.3/sunpy/util/config.py0000644000175000001440000001366713210261730016044 0ustar nabil00000000000000"""SunPy configuration file functionality""" from __future__ import absolute_import, division, print_function import os import tempfile from sunpy.extern.six.moves import configparser import sunpy __all__ = ['load_config', 'print_config'] def load_config(): """ Read the sunpyrc configuration file. If one does not exists in the user's home directory then read in the defaults from module """ config = configparser.SafeConfigParser() # Get locations of SunPy configuration files to be loaded config_files = _find_config_files() # Read in configuration files config.read(config_files) # Specify the working directory as a default so that the user's home # directory can be located in an OS-independent manner if not config.has_option('general', 'working_dir'): config.set('general', 'working_dir', os.path.join(_get_home(), "sunpy")) # Specify the database url as a default so that the user's home # directory can be located in an OS-independent manner if not config.has_option('database', 'url'): config.set('database', 'url', "sqlite:///" + os.path.join( _get_home(), "sunpy/sunpydb.sqlite")) # Use absolute filepaths and adjust OS-dependent paths as needed filepaths = [ ('downloads', 'download_dir'), ('downloads', 'sample_dir') ] _fix_filepaths(config, filepaths) return config def get_and_create_download_dir(): ''' Get the config of download directory and create one if not present. ''' config = load_config() if not os.path.isdir(config.get('downloads', 'download_dir')): os.makedirs(config.get('downloads', 'download_dir')) return config.get('downloads', 'download_dir') def get_and_create_sample_dir(): ''' Get the config of download directory and create one if not present. ''' config = load_config() if not os.path.isdir(config.get('downloads', 'sample_dir')): os.makedirs(config.get('downloads', 'sample_dir')) return config.get('downloads', 'sample_dir') def print_config(): """Print current configuration options""" print("FILES USED:") for file_ in _find_config_files(): print(" " + file_) print("\nCONFIGURATION:") for section in sunpy.config.sections(): print(" [{0}]".format(section)) for option in sunpy.config.options(section): print(" {} = {}".format(option, sunpy.config.get(section, option))) print("") def _is_writable_dir(p): """Checks to see if a directory is writable""" return os.path.isdir(p) and os.access(p, os.W_OK) def _get_home(): """Find user's home directory if possible. Otherwise raise error. """ path = os.path.expanduser("~") if not os.path.isdir(path): for evar in ('HOME', 'USERPROFILE', 'TMP'): try: path = os.environ[evar] if os.path.isdir(path): break except KeyError: pass if path: return path else: raise RuntimeError('please define environment variable $HOME') def _find_config_files(): """Finds locations of SunPy configuration files""" config_files = [] config_filename = 'sunpyrc' # find default configuration file module_dir = os.path.dirname(sunpy.__file__) config_files.append(os.path.join(module_dir, 'data', 'sunpyrc')) # if a user configuration file exists, add that to list of files to read # so that any values set there will override ones specified in the default # config file config_path = _get_user_configdir() if os.path.exists(os.path.join(config_path, config_filename)): config_files.append(os.path.join(config_path, config_filename)) return config_files def _get_user_configdir(): """ Return the string representing the configuration dir. The default is "HOME/.sunpy". You can override this with the SUNPY_CONFIGDIR environment variable """ configdir = os.environ.get('SUNPY_CONFIGDIR') if configdir is not None: if not _is_writable_dir(configdir): raise RuntimeError('Could not write to SUNPY_CONFIGDIR="{0}"' .format(configdir)) return configdir h = _get_home() p = os.path.join(_get_home(), '.sunpy') if os.path.exists(p): if not _is_writable_dir(p): raise RuntimeError("'{0}' is not a writable dir; you must set {1}/." "sunpy to be a writable dir. You can also set " "environment variable SUNPY_CONFIGDIR to any " "writable directory where you want matplotlib " "data stored ".format(h, h)) else: if not _is_writable_dir(h): raise RuntimeError("Failed to create {0}/.sunpy; consider setting " "SUNPY_CONFIGDIR to a writable directory for " "sunpy configuration data".format(h)) os.mkdir(p) return p def _fix_filepaths(config, filepaths): """Converts relative filepaths to absolute filepaths""" # Parse working_dir working_dir = _expand_filepath(config.get("general", "working_dir")) config.set('general', 'working_dir', working_dir) for f in filepaths: val = config.get(*f) filepath = _expand_filepath(val, working_dir) # Replace config value with full filepath params = f + (filepath,) config.set(*params) def _expand_filepath(filepath, working_dir=""): """Checks a filepath and expands it if necessary""" # Expand home directory if filepath[0] == "~": return os.path.abspath(os.path.expanduser(filepath)) # Check for /tmp elif filepath == "/tmp": return tempfile.gettempdir() # Relative filepaths elif not filepath.startswith("/"): return os.path.join(working_dir, filepath) # Absolute filepath else: return filepath sunpy-0.8.3/sunpy/util/create.py0000644000175000001440000000733713210261730016037 0ustar nabil00000000000000# -*- coding: utf-8 -*- # Author: Florian Mayer from __future__ import absolute_import, division, print_function import os import glob from sunpy import config from sunpy.util.net import download_file from sunpy.util.config import get_and_create_download_dir from sunpy.util.cond_dispatch import ConditionalDispatch, run_cls from sunpy.extern import six from sunpy.extern.six.moves import map __all__ = ['Parent'] class Parent(object): _create = ConditionalDispatch() @classmethod def read(cls, filename): raise NotImplementedError @classmethod def read_many(cls, filenames): return list(map(cls.read, filenames)) @classmethod def from_glob(cls, pattern): """ Read out files using glob (e.g., ~/BIR_2011*) pattern. Returns list of objects made from all matched files. """ return cls.read_many(glob.glob(pattern)) @classmethod def from_single_glob(cls, singlepattern): """ Read out a single file using glob (e.g., ~/BIR_2011*) pattern. If more than one file matches the pattern, raise ValueError. """ matches = glob.glob(os.path.expanduser(singlepattern)) if len(matches) != 1: raise ValueError("Invalid number of matches: {0:d}".format(len(matches))) return cls.read(matches[0]) @classmethod def from_files(cls, filenames): """ Return list of object read from given list of filenames. """ filenames = list(map(os.path.expanduser, filenames)) return cls.read_many(filenames) @classmethod def from_file(cls, filename): """ Return object from file. """ filename = os.path.expanduser(filename) return cls.read(filename) @classmethod def from_dir(cls, directory): """ Return list that contains all files in the directory read in. """ directory = os.path.expanduser(directory) return cls.read_many( (os.path.join(directory, elem) for elem in os.listdir(directory)) ) @classmethod def from_url(cls, url): """ Return object read from URL. Parameters ---------- url : str URL to retrieve the data from """ path = download_file(url, get_and_create_download_dir()) return cls.read(path) Parent._create.add( run_cls('from_file'), lambda cls, filename: os.path.isfile(os.path.expanduser(filename)), [type, six.string_types], check=False ) Parent._create.add( # pylint: disable=W0108 # The lambda is necessary because introspection is performed on the # argspec of the function. run_cls('from_dir'), lambda cls, directory: os.path.isdir(os.path.expanduser(directory)), [type, six.string_types], check=False ) # If it is not a kwarg and only one matches, do not return a list. Parent._create.add( run_cls('from_single_glob'), lambda cls, singlepattern: ('*' in singlepattern and len(glob.glob( os.path.expanduser(singlepattern))) == 1), [type, six.string_types], check=False ) # This case only gets executed under the condition that the previous one wasn't. # This is either because more than one file matched, or because the user # explicitly used pattern=, in both cases we want a list. Parent._create.add( run_cls('from_glob'), lambda cls, pattern: '*' in pattern and glob.glob( os.path.expanduser(pattern) ), [type, six.string_types], check=False ) Parent._create.add( run_cls('from_files'), lambda cls, filenames: True, types=[type, list], check=False ) Parent._create.add( run_cls('from_url'), lambda cls, url: True, types=[type, six.string_types], check=False ) sunpy-0.8.3/sunpy/util/datatype_factory_base.py0000644000175000017500000001263713231613140022140 0ustar nabilnabil00000000000000from __future__ import absolute_import, division, print_function import inspect class BasicRegistrationFactory(object): """ Generalized registerable factory type. Widgets (classes) can be registered with an instance of this class. Arguments to the factory's `__call__` method are then passed to a function specified by the registered factory, which validates the input and returns a instance of the class that best matches the inputs. Attributes ---------- registry : dict Dictionary mapping classes (key) to function (value) which validates input. default_widget_type : type Class of the default widget. Defaults to None. validation_functions : list of strings List of function names that are valid validation functions. Parameters ---------- default_widget_type : type, optional additional_validation_functions : list of strings, optional List of strings corresponding to additional validation function names. Notes ----- * A valid validation function must be a classmethod of the registered widget and it must return True or False. """ def __init__(self, default_widget_type=None, additional_validation_functions=[], registry=None): if registry is None: self.registry = dict() else: self.registry = registry self.default_widget_type = default_widget_type self.validation_functions = (['_factory_validation_function'] + additional_validation_functions) def __call__(self, *args, **kwargs): """ Method for running the factory. Arguments args and kwargs are passed through to the validation function and to the constructor for the final type. """ # Any preprocessing and massaging of inputs can happen here return self._check_registered_widget(*args, **kwargs) def _check_registered_widget(self, *args, **kwargs): """ Implementation of a basic check to see if arguments match a widget.""" candidate_widget_types = list() for key in self.registry: # Call the registered validation function for each registered class if self.registry[key](*args, **kwargs): candidate_widget_types.append(key) n_matches = len(candidate_widget_types) if n_matches == 0: if self.default_widget_type is None: raise NoMatchError("No types match specified arguments and no default is set.") else: candidate_widget_types = [self.default_widget_type] elif n_matches > 1: raise MultipleMatchError("Too many candidate types identified ({0})." "Specify enough keywords to guarantee unique type " "identification.".format(n_matches)) # Only one is found WidgetType = candidate_widget_types[0] return WidgetType(*args, **kwargs) def register(self, WidgetType, validation_function=None, is_default=False): """ Register a widget with the factory. If `validation_function` is not specified, tests `WidgetType` for existence of any function in in the list `self.validation_functions`, which is a list of strings which must be callable class attribute Parameters ---------- WidgetType : type Widget to register. validation_function : function, optional Function to validate against. Defaults to None, which indicates that a classmethod in validation_functions is used. is_default : bool, optional Sets WidgetType to be the default widget. """ if is_default: self.default_widget_type = WidgetType elif validation_function is not None: if not callable(validation_function): raise AttributeError("Keyword argument 'validation_function' must be callable.") self.registry[WidgetType] = validation_function else: found = False for vfunc_str in self.validation_functions: if hasattr(WidgetType, vfunc_str): vfunc = getattr(WidgetType, vfunc_str) # check if classmethod: stackoverflow #19227724 _classmethod = inspect.ismethod(vfunc) and vfunc.__self__ is WidgetType if _classmethod: self.registry[WidgetType] = vfunc found = True break else: raise ValidationFunctionError("{0}.{1} must be a classmethod." .format(WidgetType.__name__, vfunc_str)) if not found: raise ValidationFunctionError("No proper validation function for class {0} " "found.".format(WidgetType.__name__)) def unregister(self, WidgetType): """ Remove a widget from the factory's registry.""" self.registry.pop(WidgetType) class NoMatchError(Exception): """Exception for when no candidate class is found.""" class MultipleMatchError(Exception): """Exception for when too many candidate classes are found.""" class ValidationFunctionError(AttributeError): """Exception for when no candidate class is found.""" sunpy-0.8.3/sunpy/util/decorators.py0000644000175000017500000001424113232563447017761 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- # Licensed under a 3-clause BSD style license - see LICENSE.rst """Sundry function and class decorators.""" from __future__ import print_function import functools import inspect import textwrap import types import warnings from sunpy.util.exceptions import SunpyDeprecationWarning __all__ = ['deprecated'] def deprecated(since, message='', name='', alternative=''): """ Used to mark a function or class as deprecated. Parameters ------------ since : str The release at which this API became deprecated. This is required. message : str, optional Override the default deprecation message. The format specifier ``func`` may be used for the name of the function, and ``alternative`` may be used in the deprecation message to insert the name of an alternative to the deprecated function. ``obj_type`` may be used to insert a friendly name for the type of object being deprecated. name : str, optional The name of the deprecated function or class; if not provided the name is automatically determined from the passed in function or class, though this is useful in the case of renamed functions, where the new function is just assigned to the name of the deprecated function. For example:: def new_function(): ... oldFunction = new_function alternative : str, optional An alternative function or class name that the user may use in place of the deprecated object. The deprecation warning will tell the user about this alternative if provided. """ method_types = (classmethod, staticmethod, types.MethodType) def deprecate_doc(old_doc, message): """ Returns a given docstring with a deprecation message prepended to it. """ if not old_doc: old_doc = '' old_doc = textwrap.dedent(old_doc).strip('\n') new_doc = (('\n.. deprecated:: {since}' '\n {message}\n\n'.format( **{'since': since, 'message': message.strip()})) + old_doc) if not old_doc: # This is to prevent a spurious 'unexpected unindent' warning from # docutils when the original docstring was blank. new_doc += r'\ ' return new_doc def get_function(func): """ Given a function or classmethod (or other function wrapper type), get the function object. """ if isinstance(func, method_types): func = func.__func__ return func def deprecate_function(func, message): """ Returns a wrapped function that displays an ``AstropyDeprecationWarning`` when it is called. """ if isinstance(func, method_types): func_wrapper = type(func) else: func_wrapper = lambda f: f func = get_function(func) def deprecated_func(*args, **kwargs): category = SunpyDeprecationWarning warnings.warn(message, category, stacklevel=2) return func(*args, **kwargs) # If this is an extension function, we can't call # functools.wraps on it, but we normally don't care. # This crazy way to get the type of a wrapper descriptor is # straight out of the Python 3.3 inspect module docs. if type(func) is not type(str.__dict__['__add__']): # nopep8 deprecated_func = functools.wraps(func)(deprecated_func) deprecated_func.__doc__ = deprecate_doc( deprecated_func.__doc__, message) return func_wrapper(deprecated_func) def deprecate_class(cls, message): """ Returns a wrapper class with the docstrings updated and an __init__ function that will raise an ``AstropyDeprectationWarning`` warning when called. """ # Creates a new class with the same name and bases as the # original class, but updates the dictionary with a new # docstring and a wrapped __init__ method. __module__ needs # to be manually copied over, since otherwise it will be set # to *this* module (astropy.utils.misc). # This approach seems to make Sphinx happy (the new class # looks enough like the original class), and works with # extension classes (which functools.wraps does not, since # it tries to modify the original class). # We need to add a custom pickler or you'll get # Can't pickle : it's not found as ... # errors. Picklability is required for any class that is # documented by Sphinx. members = cls.__dict__.copy() members.update({ '__doc__': deprecate_doc(cls.__doc__, message), '__init__': deprecate_function(get_function(cls.__init__), message), }) return type(cls)(cls.__name__, cls.__bases__, members) def deprecate(obj, message=message, name=name, alternative=alternative): if isinstance(obj, type): obj_type_name = 'class' elif inspect.isfunction(obj): obj_type_name = 'function' elif inspect.ismethod(obj) or isinstance(obj, method_types): obj_type_name = 'method' else: obj_type_name = 'object' if not name: name = get_function(obj).__name__ altmessage = '' if not message or type(message) is type(deprecate): message = ('The {func} {obj_type} is deprecated and may ' 'be removed in a future version.') if alternative: altmessage = '\n Use {} instead.'.format(alternative) message = ((message.format(**{ 'func': name, 'name': name, 'alternative': alternative, 'obj_type': obj_type_name})) + altmessage) if isinstance(obj, type): return deprecate_class(obj, message) else: return deprecate_function(obj, message) if type(message) is type(deprecate): return deprecate(message) return deprecate sunpy-0.8.3/sunpy/util/exceptions.py0000644000175000017500000000140713231613140017756 0ustar nabilnabil00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ This module contains errors/exceptions and warnings of general use for sunpy. Exceptions that are specific to a given subpackage should *not* be here, but rather in the particular subpackage. """ from __future__ import (absolute_import, division, print_function, unicode_literals) class SunpyWarning(Warning): """ The base warning class from which all Sunpy warnings should inherit. """ class SunpyUserWarning(UserWarning, SunpyWarning): """ The primary warning class for Sunpy. Use this if you do not need a specific sub-class. """ class SunpyDeprecationWarning(SunpyWarning): """ A warning class to indicate a deprecated feature. """ sunpy-0.8.3/sunpy/util/metadata.py0000644000175000017500000000450613231613140017360 0ustar nabilnabil00000000000000""" MapHeader is a generalized header class that deals with header parsing and normalization. """ from __future__ import absolute_import, division, print_function from collections import OrderedDict __all__ = ['MetaDict'] class MetaDict(OrderedDict): """ A class to hold meta data associated with a Map derivative. This class handles everything in lower case. This allows case insensitive indexing. """ def __init__(self, *args): """Creates a new MapHeader instance""" # Store all keys as upper-case to allow for case-insensitive indexing # OrderedDict can be instantiated from a list of lists or a tuple of tuples tags = dict() if args: args = list(args) adict = args[0] if isinstance(adict, list) or isinstance(adict, tuple): tags = OrderedDict((k.upper(), v) for k, v in adict) elif isinstance(adict, dict): tags = OrderedDict((k.upper(), v) for k, v in adict.items()) else: raise TypeError("Can not create a MetaDict from this type input") args[0] = tags super(MetaDict, self).__init__(*args) def __contains__(self, key): """Override __contains__""" return OrderedDict.__contains__(self, key.lower()) def __getitem__(self, key): """Override [] indexing""" return OrderedDict.__getitem__(self, key.lower()) def __setitem__(self, key, value): """Override [] indexing""" return OrderedDict.__setitem__(self, key.lower(), value) def get(self, key, default=None): """Override .get() indexing""" return OrderedDict.get(self, key.lower(), default) def has_key(self, key): """Override .has_key() to perform case-insensitively""" return key.lower() in self def pop(self, key, default=None): """Override .pop() to perform case-insensitively""" return OrderedDict.pop(self, key.lower(), default) def update(self, d2): """Override .update() to perform case-insensitively""" return OrderedDict.update(self, OrderedDict((k.lower(), v) for k, v in d2.items())) def setdefault(self, key, default=None): """Override .setdefault() to perform case-insensitively""" return OrderedDict.setdefault(self, key.lower(), default) sunpy-0.8.3/sunpy/util/multimethod.py0000644000175000017500000001316713231613140020136 0ustar nabilnabil00000000000000# Copyright (c) 2011 Florian Mayer # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. """ Multimethod implementation in pure Python. """ from __future__ import absolute_import, division, print_function from warnings import warn from sunpy.extern.six.moves import zip, map from sunpy.extern import six __all__ = ['TypeWarning', 'MultiMethod'] SILENT = 0 WARN = 1 FAIL = 2 def _fmt_t(types): return ', '.join(type_.__name__ for type_ in types) class TypeWarning(UserWarning): pass class MultiMethod(object): """ A multimethod is a callable object that decides which code to execute based on the type of one or more of its arguments. Parameters ---------- get : function function which receives args and kwargs and returns a tuple of values to consider for dispatch. """ def __init__(self, get): self.get = get self.methods = [] self.cache = {} def add(self, fun, types, override=SILENT): """ Add fun to the multimethod. It will be executed if get returns values of the types passed as types. Must return tuples of same length for any input. Parameters ---------- fun : function function to be added to the multimethod types : tuple of classes types for which the function is executed override : SILENT, WARN or FAIL control behaviour when overriding existing definitions. If it is set to SILENT, prior definitions are silently overridden, if it is set to WARN a TypeWarning will be issued, and with FAIL a TypeError is raised when attempting to override an existing definition. """ if override not in (SILENT, WARN, FAIL): raise ValueError("Invalid value '{0}' for override.".format(override)) overriden = False if override != SILENT: for signature, _ in self.methods: if all(issubclass(a, b) for a, b in zip(types, signature)): overriden = True if overriden and override == FAIL: raise TypeError elif overriden and override == WARN: # pylint: disable=W0631 warn('Definition ({0}) overrides prior definition ({1}).'.format(_fmt_t(types), _fmt_t(signature)), TypeWarning, stacklevel=3) self.methods.append((types, fun)) def add_dec(self, *types, **kwargs): """ Return a decorator that adds the function it receives to the multimethod with the types passed as \*args. Using keyword arg override to control overriding behaviour. Compare add. """ self.cache = {} def _dec(fun): self.add(fun, types, kwargs.get('override', SILENT)) return fun return _dec def __call__(self, *args, **kwargs): objs = self.get(*args, **kwargs) # pylint: disable=W0141 types = tuple(map(type, objs)) # This code is duplicate for performance reasons. cached = self.cache.get(types, None) if cached is not None: return cached(*args, **kwargs) for signature, fun in reversed(self.methods): if all(issubclass(ty, sig) for ty, sig in zip(types, signature)): self.cache[types] = fun return fun(*args, **kwargs) raise TypeError('{0!r}'.format(types)) # XXX: Other Python implementations. def super(self, *args, **kwargs): """ Like __call__, only that when you give it super(cls, obj) items, it will skip the multimethod for cls and use the one for its parent class. The normal __call__ does not consider this for performance reasons. """ objs = self.get(*args, **kwargs) types = tuple( [ x.__thisclass__.__mro__[1] if isinstance(x, super) else type(x) for x in objs ] ) nargs = [ x.__self__ if isinstance(x, super) else x for x in args ] for k, elem in six.iteritems(kwargs): if isinstance(elem, super): kwargs[k] = elem.__self__ # This code is duplicate for performance reasons. cached = self.cache.get(types, None) if cached is not None: return cached(*nargs, **kwargs) for signature, fun in reversed(self.methods): if all(issubclass(ty, sig) for ty, sig in zip(types, signature)): self.cache[types] = fun return fun(*nargs, **kwargs) raise TypeError sunpy-0.8.3/sunpy/util/net.py0000644000175000017500000001541413231613140016366 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- # Author: Florian Mayer from __future__ import absolute_import, division, print_function import os import re import sys import shutil # For Content-Disposition parsing from sunpy.extern.six.moves.urllib.parse import urlparse, urljoin from sunpy.extern.six.moves.urllib.request import urlopen from sunpy.extern.six.moves.urllib.error import HTTPError, URLError from sunpy.extern.six.moves import filter from email.parser import FeedParser from unicodedata import normalize from sunpy.util import replacement_filename from sunpy.extern import six __all__ = ['slugify', 'get_content_disposition', 'get_filename', 'get_system_filename', 'get_system_filename_slugify', 'download_file', 'download_fileobj', 'check_download_file', 'url_exists'] # Characters not allowed in slugified version. _punct_re = re.compile(r'[:\t !"#$%&\'()*\-/<=>?@\[\\\]^_`{|},.]+') def slugify(text, delim=u'_', encoding="ascii"): """ Slugify given unicode text. """ text = normalize('NFKD', text) period = u'.' name_and_extension = text.rsplit(period, 1) name = name_and_extension[0] name = six.text_type(delim).join( filter(None, (word for word in _punct_re.split(name.lower())))) if len(name_and_extension) == 2: extension = name_and_extension[1] return six.text_type(period).join([name, extension]) else: return name def get_content_disposition(content_disposition): """ Get content disposition filename from given header. Do not include "Content-Disposition:". Returns a unicode string! """ parser = FeedParser() parser.feed('Content-Disposition: ' + content_disposition) name = parser.close().get_filename() if not isinstance(name, six.text_type): name = name.decode('latin1', 'ignore') return name def get_filename(sock, url): """ Get filename from given urllib2.urlopen object and URL. First, tries Content-Disposition, if unavailable, extracts name from URL. """ name = None # NOTE: This gives bytes on 2 and unicode on 3. # How does 3.x know the encoding? cd = sock.headers.get('Content-Disposition', None) if cd is not None: try: name = get_content_disposition(cd) except IndexError: pass if not name: parsed = urlparse(url) name = parsed.path.rstrip('/').rsplit('/', 1)[-1] return six.text_type(name) def get_system_filename(sock, url, default=u"file"): """ Get filename from given urllib2.urlopen object and URL. First, attempts to extract Content-Disposition, second, extract from URL, eventually fall back to default. Returns bytestring in file system encoding. """ name = get_filename(sock, url) if not name: name = default.decode("ascii", "ignore") return name.encode(sys.getfilesystemencoding(), 'ignore') def get_system_filename_slugify(sock, url, default=u"file"): """ Get filename from given urllib2.urlopen object and URL. First, attempts to extract Content-Disposition, second, extract from URL, eventually fall back to default. Returns bytestring in file system encoding, normalized so it shouldn't violate operating system restrictions. """ return slugify(get_system_filename(sock, url, default)) def download_file(url, directory, default=u'file', overwrite=False): """ Download file from url into directory. Try to get filename from Content-Disposition header, otherwise get from path of url. Fall back to default if both fail. Only overwrite existing files when overwrite is True. """ opn = urlopen(url) try: path = download_fileobj(opn, directory, url, default, overwrite) finally: opn.close() return path def download_fileobj(opn, directory, url='', default=u"file", overwrite=False): """ Download file from url into directory. Try to get filename from Content-Disposition header, otherwise get from path of url if given. Fall back to default if both fail. Only overwrite existing files when overwrite is True. """ filename = get_system_filename(opn, url, default) path = os.path.join(directory, filename.decode('utf-8')) if not overwrite and os.path.exists(path): path = replacement_filename(path) with open(path, 'wb') as fd: shutil.copyfileobj(opn, fd) return path def check_download_file(filename, remotepath, download_dir, remotename=None, replace=False): """ Downloads a file from remotepath to localpath if it isn't there. This function checks whether a file with name filename exists in the location, localpath, on the user's local machine. If it doesn't, it downloads the file from remotepath. Parameters ---------- filename : string Name of file. remotepath : string URL of the remote location from which filename can be downloaded. download_dir : string The files directory. remotename : (optional) string filename under which the file is stored remotely. Default is same as filename. replace : (optional) bool If True, file will be downloaded whether or not file already exists locally. Examples -------- >>> from sunpy.util.net import check_download_file >>> remotepath = "http://www.download_repository.com/downloads/" >>> check_download_file("filename.txt", remotepath, download_dir='.') # doctest: +SKIP """ # Check if file already exists locally. If not, try downloading it. if replace or not os.path.isfile(os.path.join(download_dir, filename)): # set local and remote file names be the same unless specified # by user. if not isinstance(remotename, six.string_types): remotename = filename download_file(urljoin(remotepath, remotename), download_dir, default=filename, overwrite=replace) def url_exists(url, timeout=2): """ Checks whether a url is online. Parameters ---------- url: `str` A string containing a URL Returns ------- value: `bool` Examples -------- >>> from sunpy.util.net import url_exists >>> url_exists('http://www.google.com') #doctest: +REMOTE_DATA True >>> url_exists('http://aslkfjasdlfkjwerf.com') #doctest: +REMOTE_DATA False """ try: urlopen(url, timeout=timeout) except HTTPError: return False except URLError: return False else: return True def is_online(): """ Checks whether an internet connection is available. Returns ------- value: `bool` Examples -------- >>> from sunpy.util.net import is_online >>> is_online() #doctest: +REMOTE_DATA True """ return url_exists('http://www.google.com') sunpy-0.8.3/sunpy/util/progressbar.py0000644000175000001440000000427213210261730017120 0ustar nabil00000000000000from __future__ import absolute_import, division, print_function import sys from sunpy.extern.six.moves import range __all__ = ['TTYProgressBar'] class TTYProgressBar(object): """ A simple progress bar to visualize progress on a TTY (teletypewriter). It needs to support '\b' to delete characters. The ProgressBar interface is start, finish, draw and poke. """ SYMBOL = '=' LEFT_BORDER = '[' RIGHT_BORDER = ']' def __init__(self, n, current=0, width=40, output=sys.stdout): """ Parameters ---------- n : int Total number of items until completion current : int Current state of completion width : int Width of progress bar. output : file Teletypewriter to print on. """ self.n = n self.current = current self.width = width # Future division, so it is float. self.step = self.n / self.width self.output = output def start(self): """ Draw empty bar to output. """ self.output.write( self.LEFT_BORDER + " " * (len(self.SYMBOL) * self.width) + self.RIGHT_BORDER ) self.output.flush() self.output.write("\b" * (self.width+len(self.RIGHT_BORDER))) def finish(self): """ Finish the bar, the ProgressBar cannot be used after this method was called. """ print() def _draw_one(self): """ Advance progress bar by one. """ self.output.write(self.SYMBOL) def draw(self): """ Draw current state of progress bar onto and empty bar. """ cur = self.current self.current = 0 for _ in range(cur): self.poke() def poke(self, n=1): """ Increase finished items by n. May advance the progress bar by one or more fields. """ if self.current > self.n: raise ValueError("ProgressBar overflowed.") diff = int((self.current + n) / self.step) - int(self.current / self.step) for _ in range(diff): self._draw_one() self.current += n sunpy-0.8.3/sunpy/util/scraper.py0000644000175000017500000002702513231613140017240 0ustar nabilnabil00000000000000from __future__ import absolute_import, division, print_function import os import datetime import re from ftplib import FTP from bs4 import BeautifulSoup from sunpy.extern import six from sunpy.extern.six.moves import range, zip from sunpy.extern.six.moves.urllib.request import urlopen __all__ = ['Scraper'] # regular expressions to convert datetime format # added `%e` as for milliseconds `%f/1000` TIME_CONVERSIONS = {'%Y': '\d{4}', '%y': '\d{2}', '%b': '[A-Z][a-z]{2}', '%B': '\W', '%m': '\d{2}', '%d': '\d{2}', '%j': '\d{3}', '%H': '\d{2}', '%I': '\d{2}', '%M': '\d{2}', '%S': '\d{2}', '%e': '\d{3}', '%f': '\d{6}'} class Scraper(object): """ A Scraper to scrap web data archives based on dates. Parameters ---------- pattern : string A string containing the url with the date encoded as datetime formats, and any other parameter as kwargs as string format. Attributes ---------- pattern : string A converted string with the kwargs. now : datetime.datetime The pattern with the actual date. Examples -------- >>> # Downloading data from SolarMonitor.org >>> from sunpy.util.scraper import Scraper >>> solmon_pattern = ('http://solarmonitor.org/data/' ... '%Y/%m/%d/fits/{instrument}/' ... '{instrument}_{wave:05d}_fd_%Y%m%d_%H%M%S.fts.gz') >>> solmon = Scraper(solmon_pattern, instrument = 'swap', wave = 174) >>> print(solmon.pattern) http://solarmonitor.org/data/%Y/%m/%d/fits/swap/swap_00174_fd_%Y%m%d_%H%M%S.fts.gz >>> print(solmon.now) # doctest: +SKIP http://solarmonitor.org/data/2017/11/20/fits/swap/swap_00174_fd_20171120_193933.fts.gz Notes ----- The now attribute does not return an existent file, but just how the pattern looks with the actual time. """ def __init__(self, pattern, **kwargs): self.pattern = pattern.format(**kwargs) milliseconds = re.search('\%e', self.pattern) if not milliseconds: self.now = datetime.datetime.now().strftime(self.pattern) else: now = datetime.datetime.now() milliseconds_ = int(now.microsecond / 1000.) self.now = now.strftime(self.pattern[0:milliseconds.start()] + str(milliseconds_) + self.pattern[milliseconds.end():]) def matches(self, filepath, date): return date.strftime(self.pattern) == filepath def range(self, timerange): """ Gets the directories for a certain range of time (i.e. using `~sunpy.time.TimeRange`). Parameters ---------- timerange : `~sunpy.time.timerange.TimeRange` Time interval where to find the directories for a given pattern. Returns ------- directories : list of strings List of all the possible directories valid for the time range given. Notice that these directories may not exist in the archive. """ # find directory structure - without file names directorypattern = os.path.dirname(self.pattern) + '/' # TODO what if there's not slashes? rangedelta = timerange.dt timestep = self._smallerPattern(directorypattern) if timestep is None: return [directorypattern] else: # Number of elements in the time range (including end) n_steps = rangedelta.total_seconds()/timestep.total_seconds() TotalTimeElements = int(round(n_steps)) + 1 directories = [(timerange.start + n * timestep).strftime(directorypattern) for n in range(TotalTimeElements)] # TODO if date <= endate return directories def _URL_followsPattern(self, url): """Check whether the url provided follows the pattern""" pattern = self.pattern for k, v in six.iteritems(TIME_CONVERSIONS): pattern = pattern.replace(k, v) matches = re.match(pattern, url) if matches: return matches.end() == matches.endpos == len(self.now) return False def _extractDateURL(self, url): """Extracts the date from a particular url following the pattern""" # remove the user and passwd from files if there: url = url.replace("anonymous:data@sunpy.org@", "") # url_to_list substitutes '.' and '_' for '/' to then create # a list of all the blocks in times - assuming they are all # separated with either '.', '_' or '/' url_to_list = lambda txt: re.sub(r'\.|_', '/', txt).split('/') pattern_list = url_to_list(self.pattern) url_list = url_to_list(url) time_order = ['%Y', '%y', '%b', '%B', '%m', '%d', '%j', '%H', '%I', '%M', '%S', '%e', '%f'] final_date = [] final_pattern = [] # Find in directory and filename for pattern_elem, url_elem in zip(pattern_list, url_list): time_formats = [x for x in time_order if x in pattern_elem] if len(time_formats) > 0: # Find whether there's text that should not be here toremove = re.split('%.', pattern_elem) if len(toremove) > 0: for bit in toremove: if bit != '': url_elem = url_elem.replace(bit, '', 1) pattern_elem = pattern_elem.replace(bit, '', 1) final_date.append(url_elem) final_pattern.append(pattern_elem) for time_bit in time_formats: time_order.remove(time_bit) # Find and remove repeated elements eg: %Y in ['%Y', '%Y%m%d'] # Make all as single strings date_together = ''.join(final_date) pattern_together = ''.join(final_pattern) re_together = pattern_together for k, v in six.iteritems(TIME_CONVERSIONS): re_together = re_together.replace(k, v) # Lists to contain the unique elements of the date and the pattern final_date = list() final_pattern = list() re_together = re_together.replace('[A-Z]', '\\[A-Z]') for p, r in zip(pattern_together.split('%')[1:], re_together.split('\\')[1:]): if p == 'e': continue regexp = r'\{}'.format(r) if not r.startswith('[') else r pattern = '%{}'.format(p) date_part = re.search(regexp, date_together) date_together = date_together[:date_part.start()] + \ date_together[date_part.end():] if pattern not in final_pattern: final_pattern.append('%{}'.format(p)) final_date.append(date_part.group()) return datetime.datetime.strptime(' '.join(final_date), ' '.join(final_pattern)) def filelist(self, timerange): """ Returns the list of existent files in the archive for the given time range. Parameters ---------- timerange : `~sunpy.time.TimeRange` Time interval where to find the directories for a given pattern. Returns ------- filesurls : list of strings List of all the files found between the time range given. Examples -------- >>> from sunpy.util.scraper import Scraper >>> solmon_pattern = ('http://solarmonitor.org/data/' ... '%Y/%m/%d/fits/{instrument}/' ... '{instrument}_{wave:05d}_fd_%Y%m%d_%H%M%S.fts.gz') >>> solmon = Scraper(solmon_pattern, instrument = 'swap', wave = 174) >>> from sunpy.time import TimeRange >>> timerange = TimeRange('2015-01-01','2015-01-01T16:00:00') >>> print(solmon.filelist(timerange)) # doctest: +REMOTE_DATA ['http://solarmonitor.org/data/2015/01/01/fits/swap/swap_00174_fd_20150101_025423.fts.gz', 'http://solarmonitor.org/data/2015/01/01/fits/swap/swap_00174_fd_20150101_061145.fts.gz', 'http://solarmonitor.org/data/2015/01/01/fits/swap/swap_00174_fd_20150101_093037.fts.gz', 'http://solarmonitor.org/data/2015/01/01/fits/swap/swap_00174_fd_20150101_124927.fts.gz'] Note ---- The search is strict with the time range, so if the archive scraped contains daily files, but the range doesn't start from the beginning of the day, then the file for that day won't be selected. The end of the timerange will normally be OK as includes the file on such end. """ directories = self.range(timerange) filesurls = [] if directories[0][0:3] == "ftp": # TODO use urlsplit from pr #1807 return self._ftpfileslist(timerange) for directory in directories: try: opn = urlopen(directory) try: soup = BeautifulSoup(opn, "lxml") for link in soup.find_all("a"): href = link.get("href") if href.endswith(self.pattern.split('.')[-1]): fullpath = directory + href if self._URL_followsPattern(fullpath): datehref = self._extractDateURL(fullpath) if (datehref >= timerange.start and datehref <= timerange.end): filesurls.append(fullpath) finally: opn.close() except: raise return filesurls def _ftpfileslist(self, timerange): directories = self.range(timerange) filesurls = list() domain = directories[0].find('//') domain_slash = directories[0].find('/', 6) # TODO: Use also urlsplit from pr #1807 ftpurl = directories[0][domain + 2:domain_slash] with FTP(ftpurl, user="anonymous", passwd="data@sunpy.org") as ftp: for directory in directories: ftp.cwd(directory[domain_slash:]) for file_i in ftp.nlst(): fullpath = directory + file_i if self._URL_followsPattern(fullpath): datehref = self._extractDateURL(fullpath) if (datehref >= timerange.start and datehref <= timerange.end): filesurls.append(fullpath) filesurls = ['ftp://anonymous:data@sunpy.org@' + url[domain + 2:] for url in filesurls] return filesurls def _smallerPattern(self, directoryPattern): """Obtain the smaller time step for the given pattern""" try: if "%S" in directoryPattern: return datetime.timedelta(seconds=1) elif "%M" in directoryPattern: return datetime.timedelta(minutes=1) elif any(hour in directoryPattern for hour in ["%H", "%I"]): return datetime.timedelta(hours=1) elif any(day in directoryPattern for day in ["%d", "%j"]): return datetime.timedelta(days=1) elif any(month in directoryPattern for month in ["%b", "%B", "%m"]): return datetime.timedelta(days=31) elif any(year in directoryPattern for year in ["%Y", "%y"]): return datetime.timedelta(days=365) else: return None except: raise sunpy-0.8.3/sunpy/util/sysinfo.py0000644000175000001440000001064113216172320016260 0ustar nabil00000000000000from __future__ import absolute_import, division, print_function import platform import datetime __all__ = ['get_sys_dict', 'system_info'] def get_sys_dict(): """ Test which packages are installed on system. Returns ------- sys_prop : `dict` A dictionary containing the programs and versions installed on this machine """ try: from sunpy.version import version as sunpy_version from sunpy.version import githash as sunpy_git_description except ImportError: sunpy_version = 'Missing version.py; re-run setup.py' sunpy_git_description = 'N/A' # Dependencies try: from numpy import __version__ as numpy_version except ImportError: numpy_version = "NOT INSTALLED" try: from scipy import __version__ as scipy_version except ImportError: scipy_version = "NOT INSTALLED" try: from matplotlib import __version__ as matplotlib_version except ImportError: matplotlib_version = "NOT INSTALLED" try: from astropy import __version__ as astropy_version except ImportError: astropy_version = "NOT INSTALLED" try: from pandas import __version__ as pandas_version except ImportError: pandas_version = "NOT INSTALLED" try: from bs4 import __version__ as bs4_version except ImportError: bs4_version = "NOT INSTALLED" try: from PyQt4.QtCore import PYQT_VERSION_STR as pyqt_version except ImportError: pyqt_version = "NOT INSTALLED" try: from suds import __version__ as suds_version except ImportError: suds_version = "NOT INSTALLED" try: from sqlalchemy import __version__ as sqlalchemy_version except ImportError: sqlalchemy_version = "NOT INSTALLED" try: from requests import __version__ as requests_version except ImportError: requests_version = "NOT INSTALLED" sys_prop = {'Time':datetime.datetime.utcnow().strftime("%A, %d. %B %Y %I:%M%p UT"), 'System':platform.system(), 'Processor':platform.processor(), 'SunPy':sunpy_version, 'SunPy_git':sunpy_git_description, 'Arch':platform.architecture()[0], "Python":platform.python_version(), 'NumPy':numpy_version, 'SciPy':scipy_version, 'matplotlib':matplotlib_version, 'Astropy':astropy_version, 'Pandas':pandas_version, 'beautifulsoup':bs4_version, 'PyQt':pyqt_version, 'SUDS':suds_version, 'Sqlalchemy':sqlalchemy_version, 'Requests':requests_version } return sys_prop def system_info(): """ Takes dictionary from sys_info() and prints the contents in an attractive fashion. """ sys_prop = get_sys_dict() # title print("==========================================================") print(" SunPy Installation Information\n") print("==========================================================\n") # general properties print("###########") print(" General") print("###########") # OS and architecture information for sys_info in ['Time', 'System', 'Processor', 'Arch', 'SunPy', 'SunPy_git']: print('{0} : {1}'.format(sys_info, sys_prop[sys_info])) if sys_prop['System'] == "Linux": distro = " ".join(platform.linux_distribution()) print("OS: {0} (Linux {1} {2})".format(distro, platform.release(), sys_prop['Processor'])) elif sys_prop['System'] == "Darwin": print("OS: Mac OS X {0} ({1})".format(platform.mac_ver()[0], sys_prop['Processor'])) elif sys_prop['System'] == "Windows": print("OS: Windows {0} {1} ({2})".format(platform.release(), platform.version(), sys_prop['Processor'])) else: print("Unknown OS ({0})".format(sys_prop['Processor'])) print("\n") # required libraries print("###########") print(" Required Libraries ") print("###########") for sys_info in ['Python', 'NumPy', 'SciPy', 'matplotlib', 'Astropy', 'Pandas']: print('{0}: {1}'.format(sys_info, sys_prop[sys_info])) print("\n") # recommended print("###########") print(" Recommended Libraries ") print("###########") for sys_info in ['beautifulsoup', 'PyQt', 'SUDS', 'Sqlalchemy', 'Requests']: print('{0}: {1}'.format(sys_info, sys_prop[sys_info])) sunpy-0.8.3/sunpy/util/util.py0000644000175000017500000001270413232563373016571 0ustar nabilnabil00000000000000""" General utility functions. """ from __future__ import absolute_import, division, print_function import os from itertools import count import numpy as np from sunpy.extern import six from sunpy.extern.six.moves import map, zip __all__ = ['to_signed', 'unique', 'print_table', 'replacement_filename', 'merge', 'common_base', 'minimal_pairs', 'expand_list', 'expand_list_generator'] def to_signed(dtype): """ Return dtype that can hold data of passed dtype but is signed. Raise ValueError if no such dtype exists. Parameters ---------- dtype : `numpy.dtype` dtype whose values the new dtype needs to be able to represent. Returns ------- `numpy.dtype` """ if dtype.kind == "u": if dtype.itemsize == 8: raise ValueError("Cannot losslessly convert uint64 to int.") dtype = "int{0:d}".format(min(dtype.itemsize * 2 * 8, 64)) return np.dtype(dtype) def unique(itr, key=None): """ not documented yet Parameters ---------- itr : iterable Object to be iterated over key : object not documented yet """ items = set() if key is None: for elem in itr: if elem not in items: yield elem items.add(elem) else: for elem in itr: x = key(elem) if x not in items: yield elem items.add(x) def print_table(lst, colsep=' ', linesep='\n'): width = [max(map(len, col)) for col in zip(*lst)] return linesep.join( colsep.join(col.ljust(n) for n, col in zip(width, row)) for row in lst) def minimal_pairs(one, other): """ Find pairs of values in one and other with minimal distance. Assumes one and other are sorted in the same sort sequence. Parameters ---------- one, other : sequence Sequence of scalars to find pairs from. Returns ------- `tuple` Pairs of values in `one` and `other` with minimal distance """ lbestdiff = bestdiff = bestj = besti = None for i, freq in enumerate(one): lbestj = bestj bestdiff, bestj = None, None for j, o_freq in enumerate(other[lbestj:]): j = lbestj + j if lbestj else j diff = abs(freq - o_freq) if bestj is not None and diff > bestdiff: break if bestj is None or bestdiff > diff: bestj = j bestdiff = diff if lbestj is not None and lbestj != bestj: yield (besti, lbestj, lbestdiff) besti = i lbestdiff = bestdiff elif lbestdiff is None or bestdiff < lbestdiff: besti = i lbestdiff = bestdiff yield (besti, bestj, lbestdiff) DONT = object() def find_next(one, other, pad=DONT): """ Given two sorted sequences one and other, for every element in one, return the one larger than it but nearest to it in other. If no such exists and pad is not DONT, return value of pad as "partner". """ n = 0 for elem1 in one: for elem2 in other[n:]: n += 1 if elem2 > elem1: yield elem1, elem2 break else: if pad is not DONT: yield elem1, pad def common_base(objs): """ Find class that every item of objs is an instance of. """ for cls in objs[0].__class__.__mro__: if all(isinstance(obj, cls) for obj in objs): break return cls def merge(items, key=(lambda x: x)): """ Given sorted lists of iterables, return new iterable that returns elements of all iterables sorted with respect to key. """ state = {} for item in map(iter, items): try: first = next(item) except StopIteration: continue else: state[item] = (first, key(first)) while state: for item, (value, tk) in six.iteritems(state): # Value is biggest. if all(tk >= k for it, (v, k) in six.iteritems(state) if it is not item): yield value break try: n = next(item) state[item] = (n, key(n)) except StopIteration: del state[item] def replacement_filename(path): """ Return replacement path for already used path. Enumerates until an unused filename is found. E.g., "/home/florian/foo.fits" becomes "/home/florian/foo.0.fits", if that is used "/home/florian/foo.1.fits", etc. """ if not os.path.exists(path): return path else: dir_, filename = os.path.split(path) base, ext = os.path.splitext(filename) for c in count(): name = base + '.' + str(c) + ext newpath = os.path.join(dir_, name) if not os.path.exists(newpath): return newpath def expand_list(inp): """ Expand a list of lists. Parameters ---------- inp : `list` Returns ------- `list` A flat list consisting of the entries of the input. References ---------- Taken from :http://stackoverflow.com/a/2185971/2486799 """ return [item for item in expand_list_generator(inp)] def expand_list_generator(inp): for item in inp: if type(item) in [list, tuple]: for nested_item in expand_list_generator(item): yield nested_item else: yield item sunpy-0.8.3/sunpy/util/xml.py0000644000175000001440000000507113210261730015365 0ustar nabil00000000000000"""XML helper functions""" from __future__ import absolute_import, division, print_function from xml.dom.minidom import parseString #pylint: disable=E0611,F0401 __all__ = ['NotTextNodeError', 'xml_to_dict', 'node_to_dict', 'get_node_text'] # # Converting XML to a Dictionary # Author: Christoph Dietze # URL : http://code.activestate.com/recipes/116539/ # class NotTextNodeError(Exception): pass def xml_to_dict(xmlstring): """ Converts an XML string to a Python dictionary .. Warning:: This method does not support multiple inner nodes of the same name but with different values. It always takes the last value. Examples -------- :: one two gives you the dict:: {u'outer': {u'inner': u'two'}} """ return node_to_dict(parseString(xmlstring)) def node_to_dict(node): """ node_to_dict() scans through the children of node and makes a dictionary from the content. Three cases are differentiated: 1. If the node contains no other nodes, it is a text-node and {nodeName: text} is merged into the dictionary. 2. If the node has the attribute "method" set to "true", then it's children will be appended to a list and this list is merged to the dictionary in the form: {nodeName:list}. 3. Else, node_to_dict() will call itself recursively on the nodes children (merging {nodeName: node_to_dict()} to the dictionary). """ dic = {} for n in node.childNodes: if n.nodeType != n.ELEMENT_NODE: continue if n.getAttribute("multiple") == "true": # node with multiple children: put them in a list l = [] for c in n.childNodes: if c.nodeType != n.ELEMENT_NODE: continue l.append(node_to_dict(c)) dic.update({n.nodeName: l}) continue try: text = get_node_text(n) except NotTextNodeError: # 'normal' node dic.update({n.nodeName: node_to_dict(n)}) continue # text node dic.update({n.nodeName: text}) continue return dic def get_node_text(node): """ scans through all children of node and gathers the text. if node has non-text child-nodes, then NotTextNodeError is raised. """ t = "" for n in node.childNodes: if n.nodeType == n.TEXT_NODE: t += n.nodeValue else: raise NotTextNodeError return t sunpy-0.8.3/sunpy/visualization/0000755000175000017500000000000013232563477017167 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/visualization/tests/0000755000175000017500000000000013232563477020331 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/visualization/tests/__init__.py0000644000175000017500000000000013231613140022406 0ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/visualization/tests/test_imageanimator.py0000644000175000017500000000250313231613140024535 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- # Author: Rajul Srivastava from __future__ import absolute_import import matplotlib.pyplot as plt import pytest from sunpy.visualization import imageanimator @pytest.fixture def slider_pb(): test_slider_ax = plt.axes([0.1, 0.8, 0.8, 0.1]) return imageanimator.SliderPB(test_slider_ax, 'foo', -5, 5) # Tests for the SliderPB class def test_SliderPB_instance(slider_pb): dummy_slider_ax = plt.axes([0.1, 0.8, 0.8, 0.1]) assert slider_pb.ax == dummy_slider_ax assert slider_pb.label.get_text() == 'foo' assert slider_pb.valmin == -5 assert slider_pb.valmax == 5 assert slider_pb.valinit == 0.5 assert slider_pb.valfmt == '%1.2f' assert slider_pb.closedmin is True assert slider_pb.closedmax is True assert slider_pb.slidermin is None assert slider_pb.slidermax is None assert slider_pb.changed_args == {} assert slider_pb.cnt == 0 def test_SliderPB_set_val(slider_pb): pass def test_SliderPB_on_changed(slider_pb): def dummy_function(): pass t = slider_pb.on_changed(dummy_function) assert t == 0 assert slider_pb.cnt == 1 assert len(slider_pb.observers) == 1 assert slider_pb.observers[t] == dummy_function assert len(slider_pb.changed_args) == 1 assert slider_pb.changed_args[t] == () sunpy-0.8.3/sunpy/visualization/__init__.py0000644000175000001440000000011113210261730020236 0ustar nabil00000000000000# -*- coding: utf-8 -*- from sunpy.visualization.visualization import * sunpy-0.8.3/sunpy/visualization/imageanimator.py0000644000175000017500000010703613231613140022343 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- import abc import numpy as np import matplotlib.pyplot as plt import matplotlib.widgets as widgets import matplotlib.animation as mplanim from mpl_toolkits.axes_grid1 import make_axes_locatable import mpl_toolkits.axes_grid1.axes_size as Size import astropy.wcs from sunpy.extern import six from sunpy.extern.six.moves import range __all__ = ['BaseFuncAnimator', 'ImageAnimator', 'LineAnimator', 'ImageAnimatorWCS'] class SliderPB(widgets.Slider): __doc__ = widgets.Slider.__doc__ def __init__(self, ax, label, valmin, valmax, valinit=0.5, valfmt='%1.2f', closedmin=True, closedmax=True, slidermin=None, slidermax=None, dragging=True, **kwargs): widgets.Slider.__init__(self, ax, label, valmin, valmax, valinit=valinit, valfmt=valfmt, closedmin=closedmin, closedmax=closedmax, slidermin=slidermin, slidermax=slidermax, dragging=dragging, **kwargs) self.changed_args = {} def set_val(self, val): xy = self.poly.xy xy[2] = val, 1 xy[3] = val, 0 self.poly.xy = xy self.valtext.set_text(self.valfmt % val) if self.drawon: self.ax.figure.canvas.draw() self.val = val if not self.eventson: return for cid, func in self.observers.items(): func(val, *self.changed_args[cid]) def on_changed(self, func, *args): """ When the slider value is changed, call *func* with the new slider position A connection id is returned which can be used to disconnect """ cid = self.cnt self.observers[cid] = func self.changed_args[cid] = args self.cnt += 1 return cid class ButtonPB(widgets.Button): def __init__(self, ax, label, image=None, color='0.85', hovercolor='0.95'): widgets.Button.__init__(self, ax, label, image=image, color=color, hovercolor=hovercolor) self.clicked_args = {} def on_clicked(self, func, *args): """ When the button is clicked, call this *func* with event A connection id is returned which can be used to disconnect """ cid = self.cnt self.observers[cid] = func self.clicked_args[cid] = args self.cnt += 1 return cid def _release(self, event): if self.ignore(event): return if event.canvas.mouse_grabber != self.ax: return event.canvas.release_mouse(self.ax) if not self.eventson: return if event.inaxes != self.ax: return for cid, func in self.observers.items(): func(event, *self.clicked_args[cid]) class BaseFuncAnimator(object): """ Create a matplotlib backend independent data explorer which allows definition of figure update functions for each slider. The following keyboard shortcuts are defined in the viewer: - 'left': previous step on active slider - 'right': next step on active slider - 'top': change the active slider up one - 'bottom': change the active slider down one - 'p': play/pause active slider This viewer can have user defined buttons added by specifying the labels and functions called when those buttons are clicked as keyword arguments. To make this class useful the subclass must implement `_plot_start_image` which must define a `self.im` attribute which is an instance of AxesImage Parameters ---------- data: iterable Some arbitrary data slider_functions: list A list of functions to call when that slider is changed. These functions will have `val`, the axes image object and the slider widget instance passed to them, i.e.: update_slider(val, im, slider) slider_ranges: list list of [min,max] pairs to set the ranges for each slider or an array of values for all points of the slider. (The slider update function decides which to support.) fig: mpl.figure Figure to use interval: int Animation interval in ms colorbar: bool Plot colorbar button_labels: list List of strings to label buttons button_func: list List of functions to map to the buttons Extra keywords are passed to imshow. """ def __init__(self, data, slider_functions, slider_ranges, fig=None, interval=200, colorbar=False, **kwargs): # Allow the user to specify the button func: self.button_func = kwargs.pop('button_func', []) self.button_labels = kwargs.pop('button_labels', []) self.num_buttons = len(self.button_labels) if not fig: fig = plt.figure() self.fig = fig self.data = data self.interval = interval self.if_colorbar = colorbar self.imshow_kwargs = kwargs if len(slider_functions) != len(slider_ranges): raise ValueError("You must specify the same number of functions " "as extents") self.num_sliders = len(slider_functions) self.slider_functions = slider_functions self.slider_ranges = slider_ranges # Set active slider self.active_slider = 0 # Set a blank timer self.timer = None # Set up axes self._make_axes_grid() self._add_widgets() self._set_active_slider(0) # Set the current axes to the main axes so commands like # plt.ylabel() work. plt.sca(self.axes) # Do Plot self.im = self.plot_start_image(self.axes) # Connect fig events self._connect_fig_events() def label_slider(self, i, label): """ Change the Slider label Parameters ---------- i: int The index of the slider to change (0 is bottom) label: str The label to set """ self.sliders[i]._slider.label.set_text(label) def get_animation(self, axes=None, slider=0, startframe=0, endframe=None, stepframe=1, **kwargs): """ Return a matplotlib.animation.FuncAnimation instance for the selected slider. This will allow easy saving of the animation to a file. Parameters ---------- slider: int The slider to animate along startframe: int The frame to start the animation endframe: int The frame to end the animation stepframe: int The step between frames """ if not axes: axes = plt.gca() anim_fig = axes.get_figure() if endframe is None: endframe = self.slider_ranges[slider][1] im = self.plot_start_image(axes) anim_kwargs = {'frames': list(range(startframe, endframe, stepframe)), 'fargs': [im, self.sliders[slider]._slider]} anim_kwargs.update(kwargs) ani = mplanim.FuncAnimation(anim_fig, self.slider_functions[slider], **anim_kwargs) return ani def plot_start_image(self, ax): """ This method creates the initial image on the mpl axes .. warning:: This method needs to be implemented in subclasses Parameters ---------- ax: mpl axes This is the axes on which to plot the image Returns ------- AxesImage: An AxesImage object, the instance returned from a plt.imshow() command. """ raise NotImplementedError("Please define your setup function") def _connect_fig_events(self): self.fig.canvas.mpl_connect('button_press_event', self._mouse_click) self.fig.canvas.mpl_connect('key_press_event', self._key_press) def _add_colorbar(self, im): self.colorbar = plt.colorbar(im, self.cax) # ============================================================================= # Figure event callback functions # ============================================================================= def _mouse_click(self, event): if event.inaxes in self.sliders: slider = self.sliders.index(event.inaxes) self._set_active_slider(slider) def _key_press(self, event): if event.key == 'left': self._previous(self.sliders[self.active_slider]._slider) elif event.key == 'right': self._step(self.sliders[self.active_slider]._slider) elif event.key == 'up': self._set_active_slider((self.active_slider+1) % self.num_sliders) elif event.key == 'down': self._set_active_slider((self.active_slider-1) % self.num_sliders) elif event.key == 'p': self._click_slider_button(event, self.slider_buttons[self.active_slider]._button, self.sliders[self.active_slider]._slider) # ============================================================================= # Active Slider methods # ============================================================================= def _set_active_slider(self, ind): self._dehighlight_slider(self.active_slider) self._highliget_slider(ind) self.active_slider = ind def _highliget_slider(self, ind): ax = self.sliders[ind] [a.set_linewidth(2.0) for n, a in ax.spines.items()] self.fig.canvas.draw() def _dehighlight_slider(self, ind): ax = self.sliders[ind] [a.set_linewidth(1.0) for n, a in ax.spines.items()] self.fig.canvas.draw() # ============================================================================= # Build the figure and place the widgets # ============================================================================= def _get_main_axes(self): """ Allow replacement of main axes by subclassing """ return self.fig.add_subplot(111) def _make_axes_grid(self): self.axes = self._get_main_axes() # Split up the current axes so there is space for start & stop buttons self.divider = make_axes_locatable(self.axes) pad = 0.01 # Padding between axes pad_size = Size.Fraction(pad, Size.AxesX(self.axes)) large_pad_size = Size.Fraction(0.1, Size.AxesY(self.axes)) # Define size of useful axes cells, 50% each in x 20% for buttons in y. small_x = Size.Fraction((1.-2.*pad)/10, Size.AxesX(self.axes)) ysize = Size.Fraction((1.-2.*pad)/15., Size.AxesY(self.axes)) # Set up grid, 3x3 with cells for padding. if self.num_buttons > 0: xsize = Size.Fraction((1.-2.*pad)/self.num_buttons, Size.AxesX(self.axes)) horiz = [xsize] + [pad_size, xsize]*(self.num_buttons-1) + \ [Size.Fraction(0.1, Size.AxesY(self.axes)), small_x] vert = [ysize, pad_size] * self.num_sliders + \ [large_pad_size, large_pad_size, Size.AxesY(self.axes)] else: vert = [ysize, pad_size] * self.num_sliders + \ [large_pad_size, Size.AxesY(self.axes)] horiz = [Size.Fraction(0.8, Size.AxesX(self.axes))] + \ [Size.Fraction(0.1, Size.AxesX(self.axes))]*2 self.divider.set_horizontal(horiz) self.divider.set_vertical(vert) self.button_ny = len(vert) - 3 # If we are going to add a colorbar it'll need an axis next to the plot if self.if_colorbar: nx1 = -3 self.cax = self.fig.add_axes((0., 0., 0.141, 1.)) locator = self.divider.new_locator(nx=-2, ny=len(vert)-1, nx1=-1) self.cax.set_axes_locator(locator) else: # Main figure spans all horiz and is in the top (2) in vert. nx1 = -1 self.axes.set_axes_locator( self.divider.new_locator(nx=0, ny=len(vert)-1, nx1=nx1)) def _add_widgets(self): self.buttons = [] for i in range(0, self.num_buttons): x = i*2 # The i+1/10. is a bug that if you make two axes directly on top of # one another then the divider doesn't work. self.buttons.append(self.fig.add_axes((0., 0., 0.+i/10., 1.))) locator = self.divider.new_locator(nx=x, ny=self.button_ny) self.buttons[-1].set_axes_locator(locator) self.buttons[-1]._button = widgets.Button(self.buttons[-1], self.button_labels[i]) self.buttons[-1]._button.on_clicked(self.button_func[i]) self.sliders = [] self.slider_buttons = [] for i in range(self.num_sliders): x = i * 2 self.sliders.append(self.fig.add_axes((0., 0., 0.01+i/10., 1.))) if self.num_buttons == 0: nx1 = 1 else: nx1 = -3 locator = self.divider.new_locator(nx=0, ny=x, nx1=nx1) self.sliders[-1].set_axes_locator(locator) sframe = SliderPB(self.sliders[-1], "{slide:d}".format(slide=i), self.slider_ranges[i][0], self.slider_ranges[i][-1]-1, valinit=self.slider_ranges[i][0], valfmt='%4.1f') sframe.on_changed(self._slider_changed, sframe) sframe.slider_ind = i sframe.cval = sframe.val self.sliders[-1]._slider = sframe self.slider_buttons.append( self.fig.add_axes((0., 0., 0.05+x/10., 1.))) if self.num_buttons == 0: nx = 2 else: nx = 2 + 2*(self.num_buttons-1) locator = self.divider.new_locator(nx=nx, ny=x) self.slider_buttons[-1].set_axes_locator(locator) butt = ButtonPB(self.slider_buttons[-1], ">") butt.on_clicked(self._click_slider_button, butt, sframe) butt.clicked = False self.slider_buttons[-1]._button = butt # ============================================================================= # Widget callbacks # ============================================================================= def _click_slider_button(self, event, button, slider): self._set_active_slider(slider.slider_ind) if button.clicked: self._stop_play(event) button.clicked = False button.label.set_text(">") else: button.clicked = True self._start_play(event, button, slider) button.label.set_text("||") self.fig.canvas.draw() def _start_play(self, event, button, slider): if not self.timer: self.timer = self.fig.canvas.new_timer() self.timer.interval = self.interval self.timer.add_callback(self._step, slider) self.timer.start() def _stop_play(self, event): if self.timer: self.timer.remove_callback(self._step) self.timer = None def _step(self, slider): s = slider if s.val >= s.valmax: s.set_val(s.valmin) else: s.set_val(s.val+1) self.fig.canvas.draw() def _previous(self, slider): s = slider if s.val <= s.valmin: s.set_val(s.valmax) else: s.set_val(s.val-1) self.fig.canvas.draw() def _slider_changed(self, val, slider): self.slider_functions[slider.slider_ind](val, self.im, slider) @six.add_metaclass(abc.ABCMeta) class ArrayAnimator(BaseFuncAnimator): """ Create a matplotlib backend independent data explorer The following keyboard shortcuts are defined in the viewer: - 'left': previous step on active slider - 'right': next step on active slider - 'top': change the active slider up one - 'bottom': change the active slider down one - 'p': play/pause active slider This viewer can have user defined buttons added by specifying the labels and functions called when those buttons are clicked as keyword arguments. Parameters ---------- data: ndarray The data to be visualized image_axes: list The axes that make the image fig: mpl.figure Figure to use axis_ranges: list of physical coordinates for array or None If None array indices will be used for all axes. If a list it should contain one element for each axis of the numpy array. For the image axes a [min, max] pair should be specified which will be passed to :func:`matplotlib.pyplot.imshow` as extent. For the slider axes a [min, max] pair can be specified or an array the same length as the axis which will provide all values for that slider. If None is specified for an axis then the array indices will be used for that axis. interval: int Animation interval in ms colorbar: bool Plot colorbar button_labels: list List of strings to label buttons button_func: list List of functions to map to the buttons """ def __init__(self, data, image_axes=[-2, -1], axis_ranges=None, **kwargs): all_axes = list(range(self.naxis)) # Handle negative indexes self.image_axes = [all_axes[i] for i in image_axes] slider_axes = list(range(self.naxis)) for x in self.image_axes: slider_axes.remove(x) if len(slider_axes) != self.num_sliders: raise ValueError("Specific the same number of axes as sliders!") self.slider_axes = slider_axes # Verify that combined slider_axes and image_axes make all axes ax = self.slider_axes + self.image_axes ax.sort() if ax != list(range(self.naxis)): raise ValueError("spatial_axes and slider_axes mismatch") self.axis_ranges = self._sanitize_axis_ranges(axis_ranges, data) # create data slice self.frame_slice = [slice(None)] * self.naxis for i in self.slider_axes: self.frame_slice[i] = 0 base_kwargs = {'slider_functions': [self.update_plot] * self.num_sliders, 'slider_ranges': [self.axis_ranges[i] for i in self.slider_axes]} base_kwargs.update(kwargs) BaseFuncAnimator.__init__(self, data, **base_kwargs) @property def frame_index(self): """ A tuple version of ``frame_slice`` to be used when indexing arrays. """ return tuple(self.frame_slice) def label_slider(self, i, label): """ Change the Slider label Parameters ---------- i: int The index of the slider to change (0 is bottom) label: str The label to set """ self.sliders[i]._slider.label.set_text(label) def _sanitize_axis_ranges(self, axis_ranges, data): """ This method takes the various allowed values of axis_ranges and returns them in a standardized way for the rest of the class to use. The outputted axis range describes the physical coordinates of the array axes. The allowed values of axis range is either None or a list. If axis_ranges is None then all axis are assumed to be not scaled and use array indices. Where axis_ranges is a list it must have the same length as the number of axis as the array and each element must be one of the following: * None: Build a min,max pair or linspace array of array indices * [min, max]: leave for image axes or convert to a array for slider axes (from min to max in axis length steps) * [min, max] pair where min == max: convert to array indies min, max pair or array. * array of axis length, check that it was passed for a slider axes and do nothing if it was, error if it is not. """ # If no axis range at all make it all [min,max] pairs if axis_ranges is None: axis_ranges = [[0, i] for i in data.shape] # need the same number of axis ranges as axes if len(axis_ranges) != data.ndim: raise ValueError("Length of axis_ranges must equal number of axes") # For each axis validate and translate the axis_ranges for i, d in enumerate(data.shape): # If [min,max] pair or None if axis_ranges[i] is None or len(axis_ranges[i]) == 2: # If min==max or None if axis_ranges[i] is None or axis_ranges[i][0] == axis_ranges[i][1]: if i in self.slider_axes: axis_ranges[i] = np.linspace(0, d, d) else: axis_ranges[i] = [0, d] # min max pair for slider axes should be converted # to an array elif i in self.slider_axes: axis_ranges[i] = np.linspace(axis_ranges[i][0], axis_ranges[i][1], d) # If we have a whole list of values for the axis, make sure we are a slider axis. elif len(axis_ranges[i]) == d: axis_ranges[i] = np.array(axis_ranges[i]) # If above criteria are not met, raise an error. else: raise ValueError("axis_ranges must be None or a list with length equal to number " "of axes in data whose elements are either None, [min,max], " "or a list/array of same length as the plot/image axis of data.") return axis_ranges @abc.abstractmethod def plot_start_image(self): """ Abstract method for plotting first slice of array. Must exists here but be defined in subclass. """ @abc.abstractmethod def update_plot(self): """ Abstract method for updating plot. Must exists here but be defined in subclass. """ class ImageAnimator(ArrayAnimator): """ Create a matplotlib backend independent data explorer for 2D images. The following keyboard shortcuts are defined in the viewer: - 'left': previous step on active slider - 'right': next step on active slider - 'top': change the active slider up one - 'bottom': change the active slider down one - 'p': play/pause active slider This viewer can have user defined buttons added by specifying the labels and functions called when those buttons are clicked as keyword arguments. Parameters ---------- data: ndarray The data to be visualized >= 2D image_axes: list The two axes that make the image fig: mpl.figure Figure to use axis_ranges: list of physical coordinates for array or None If None array indices will be used for all axes. If a list it should contain one element for each axis of the numpy array. For the image axes a [min, max] pair should be specified which will be passed to :func:`matplotlib.pyplot.imshow` as extent. For the slider axes a [min, max] pair can be specified or an array the same length as the axis which will provide all values for that slider. If None is specified for an axis then the array indices will be used for that axis. interval: int Animation interval in ms colorbar: bool Plot colorbar button_labels: list List of strings to label buttons button_func: list List of functions to map to the buttons Extra keywords are passed to imshow. """ def __init__(self, data, image_axes=[-2, -1], axis_ranges=None, **kwargs): # Check that number of axes is 2. if len(image_axes) != 2: raise ValueError("There can only be two spatial axes") # Define number of slider axes. self.naxis = data.ndim self.num_sliders = self.naxis-2 # Run init for parent class super(ImageAnimator, self).__init__(data, image_axes=image_axes, axis_ranges=axis_ranges, **kwargs) def plot_start_image(self, ax): """Sets up plot of initial image.""" # Create extent arg extent = [] # reverse because numpy is in y-x and extent is x-y for i in self.image_axes[::-1]: extent += self.axis_ranges[i] imshow_args = {'interpolation': 'nearest', 'origin': 'lower', 'extent': extent, } imshow_args.update(self.imshow_kwargs) im = ax.imshow(self.data[self.frame_index], **imshow_args) if self.if_colorbar: self._add_colorbar(im) return im def update_plot(self, val, im, slider): """Updates plot based on slider/array dimension being iterated.""" val = int(val) ax_ind = self.slider_axes[slider.slider_ind] ind = np.argmin(np.abs(self.axis_ranges[ax_ind] - val)) self.frame_slice[ax_ind] = ind if val != slider.cval: im.set_array(self.data[self.frame_index]) slider.cval = val def _sanitize_axis_ranges(self, axis_ranges, data): """ This method takes the various allowed values of axis_ranges and returns them in a standardized way for the rest of the class to use. The outputted axis_ranges describe the physical coordinates of the array axes. The allowed values of axis_range is either None or a list. If axis_ranges is None then all axes are assumed to be not scaled and use array indices. Where axis_ranges is a list it must have the same length as the number of axis as the array and each element must be one of the following: * None: Build a min,max pair or linspace array of array indices * [min, max]: leave for image axes or convert to a array for slider axes (from min to max in axis length steps) * [min, max] pair where min == max: convert to array indies min,max pair or array. * array of axis length, check that it was passed for a slider axes and do nothing if it was, error if it is not. """ # Run super class's version of this function. axis_ranges = super(ImageAnimator, self)._sanitize_axis_ranges(axis_ranges, data) # Check that axis ranges which are array type are only for slider axes. for i, d in enumerate(data.shape): if len(axis_ranges[i]) == d: if i not in self.slider_axes: raise ValueError("Slider axes mis-match, non-slider axes need [min,max] pairs") return axis_ranges class LineAnimator(ArrayAnimator): """ Create a matplotlib backend independent data explorer for 1D plots. The following keyboard shortcuts are defined in the viewer: - 'left': previous step on active slider - 'right': next step on active slider - 'top': change the active slider up one - 'bottom': change the active slider down one - 'p': play/pause active slider This viewer can have user defined buttons added by specifying the labels and functions called when those buttons are clicked as keyword arguments. Parameters ---------- data: ndarray The y-axis data to be visualized plot_axis_index: `int` The axis used to plot against xdata. Default = -1, i.e. last dimension of arrary. fig: `matplotlib.figure` Figure to use axis_ranges: `list` of physical coordinates for array or None If None array indices will be used for all axes. X-axis values must be supplied (if desired) as an array in the element of axis_ranges corresponding to the plot_axis_index in the data input arg, i.e. xdata = axis_ranges[plot_axis_index]. Also, the number of x-axis values must correspond to the number of y-axis values, i.e. len(axis_ranges[plot_axis_index]) must equal len(data[plot_axis_index]). For the slider axes a [min, max] pair can be specified or an array the same length as the axis which will provide all values for that slider. If None is specified for an axis then the array indices will be used for that axis. xlabel: `str` Label of x-axis of plot. ylabel: `str` Label of y-axis of plot. xlim: `tuple` Limits of x-axis of plot. ylim: `tuple` Limits of y-axis of plot. interval: `int` Animation interval in ms button_labels: `list` List of strings to label buttons button_func: `list` List of functions to map to the buttons Extra keywords are passed to plot. """ def __init__(self, data, plot_axis_index=-1, axis_ranges=None, ylabel=None, xlabel=None, xlim=None, ylim=None, **kwargs): # Check inputs. plot_axis_index = int(plot_axis_index) if plot_axis_index not in range(-2, 2): raise ValueError("plot_axis_index must be either 0 or 1 (or equivalent " "negative indices) referring to the axis of data to be " "used for a single plot.") if data.ndim < 2: raise ValueError("data must have at least two dimensions. One for data " "for each single plot and at least one for time/iteration.") # Ensure axis_ranges are input correctly. if axis_ranges[plot_axis_index] is not None: if len(axis_ranges[plot_axis_index]) != data.shape[plot_axis_index]: raise ValueError("The plot_axis_index axis range must be specified as None " "or an array. Not [min, max]") # Define number of slider axes. self.naxis = data.ndim self.num_sliders = self.naxis-1 # Attach data to class. if axis_ranges is not None and all(axis_range is None for axis_range in axis_ranges): axis_ranges = None if axis_ranges[plot_axis_index] is None: self.xdata = np.arange(data.shape[plot_axis_index]) else: self.xdata = np.asarray(axis_ranges[plot_axis_index]) if ylim is None: ylim = (data.min(), data.max()) if xlim is None: xlim = (self.xdata.min(), self.xdata.max()) self.ylim = ylim self.xlim = xlim self.xlabel = xlabel self.ylabel = ylabel # Run init for base class super(LineAnimator, self).__init__(data, image_axes=[plot_axis_index], axis_ranges=axis_ranges, **kwargs) def plot_start_image(self, ax): """Sets up plot of initial image.""" ax.set_xlim(self.xlim) ax.set_ylim(self.ylim) if self.xlabel is not None: ax.set_xlabel(self.xlabel) if self.ylabel is not None: ax.set_ylabel(self.ylabel) plot_args = {} plot_args.update(self.imshow_kwargs) line, = ax.plot(self.xdata, self.data[self.frame_index], **plot_args) return line def update_plot(self, val, line, slider): """Updates plot based on slider/array dimension being iterated.""" val = int(val) ax_ind = self.slider_axes[slider.slider_ind] ind = np.argmin(np.abs(self.axis_ranges[ax_ind] - val)) self.frame_slice[ax_ind] = ind if val != slider.cval: line.set_ydata(self.data[self.frame_index]) slider.cval = val class ImageAnimatorWCS(ImageAnimator): """ Animates N-dimensional data with the associated astropy WCS object. The following keyboard shortcuts are defined in the viewer: - 'left': previous step on active slider - 'right': next step on active slider - 'top': change the active slider up one - 'bottom': change the active slider down one - 'p': play/pause active slider This viewer can have user defined buttons added by specifying the labels and functions called when those buttons are clicked as keyword arguments. Parameters ---------- data: `numpy.ndarray` The data to be visualized >= 2D wcs: `astropy.wcs.WCS` The wcs data. image_axes: `list` The two axes that make the image fig: `matplotlib.figure.Figure` Figure to use axis_ranges: list of physical coordinates for array or None If None array indices will be used for all axes. If a list it should contain one element for each axis of the numpy array. For the image axes a [min, max] pair should be specified which will be passed to :func:`matplotlib.pyplot.imshow` as extent. For the slider axes a [min, max] pair can be specified or an array the same length as the axis which will provide all values for that slider. If None is specified for an axis then the array indices will be used for that axis. interval: `int` Animation interval in ms colorbar: `bool` Plot colorbar button_labels: `list` List of strings to label buttons button_func: `list` List of functions to map to the buttons unit_x_axis: `astropy.units.Unit` The unit of x axis. unit_y_axis: `astropy.units.Unit` The unit of y axis. Extra keywords are passed to imshow. """ def __init__(self, data, wcs=None, image_axes=[-1, -2], unit_x_axis=None, unit_y_axis=None, axis_ranges=None, **kwargs): if not isinstance(wcs, astropy.wcs.WCS): raise ValueError("wcs data should be provided.") if wcs.wcs.naxis is not data.ndim: raise ValueError("Dimensions of data and wcs not matching") self.wcs = wcs list_slices_wcsaxes = [0 for i in range(self.wcs.naxis)] list_slices_wcsaxes[image_axes[0]] = 'x' list_slices_wcsaxes[image_axes[1]] = 'y' self.slices_wcsaxes = list_slices_wcsaxes[::-1] self.unit_x_axis = unit_x_axis self.unit_y_axis = unit_y_axis super(ImageAnimatorWCS, self).__init__(data, image_axes=image_axes, axis_ranges=axis_ranges, **kwargs) def _get_main_axes(self): axes = self.fig.add_axes([0.1, 0.1, 0.8, 0.8], projection=self.wcs, slices=self.slices_wcsaxes) self._set_unit_in_axis(axes) return axes def _set_unit_in_axis(self, axes): if self.unit_x_axis is not None: axes.coords[2].set_format_unit(self.unit_x_axis) axes.coords[2].set_ticks(exclude_overlapping=True) if self.unit_y_axis is not None: axes.coords[1].set_format_unit(self.unit_y_axis) axes.coords[1].set_ticks(exclude_overlapping=True) def plot_start_image(self, ax): """Sets up plot of initial image.""" imshow_args = {'interpolation': 'nearest', 'origin': 'lower', } imshow_args.update(self.imshow_kwargs) im = ax.imshow(self.data[self.frame_index], **imshow_args) if self.if_colorbar: self._add_colorbar(im) return im def update_plot(self, val, im, slider): """Updates plot based on slider/array dimension being iterated.""" val = int(val) ax_ind = self.slider_axes[slider.slider_ind] ind = np.argmin(np.abs(self.axis_ranges[ax_ind] - val)) self.frame_slice[ax_ind] = ind list_slices_wcsaxes = list(self.slices_wcsaxes) list_slices_wcsaxes[self.wcs.naxis-ax_ind-1] = val self.slices_wcsaxes = list_slices_wcsaxes if val != slider.cval: self.axes.reset_wcs(wcs=self.wcs, slices=self.slices_wcsaxes) self._set_unit_in_axis(self.axes) im.set_array(self.data[self.frame_index]) slider.cval = val sunpy-0.8.3/sunpy/visualization/mapcubeanimator.py0000644000175000017500000001066513231613140022676 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- from copy import deepcopy from sunpy.visualization import imageanimator, wcsaxes_compat, axis_labels_from_ctype from sunpy.visualization.wcsaxes_compat import _FORCE_NO_WCSAXES __all__ = ['MapCubeAnimator'] class MapCubeAnimator(imageanimator.BaseFuncAnimator): """ Create an interactive viewer for a MapCube The following keyboard shortcuts are defined in the viewer: - 'left': previous step on active slider - 'right': next step on active slider - 'top': change the active slider up one - 'bottom': change the active slider down one - 'p': play/pause active slider Parameters ---------- mapcube : `sunpy.map.MapCube` A MapCube annotate : `bool` Annotate the figure with scale and titles fig : `matplotlib.figure` Figure to use interval : `int` Animation interval in ms colorbar : `bool` Plot colorbar plot_function : function A function to call when each map is plotted, the function must have the signature `(fig, axes, smap)` where fig and axes are the figure and axes objects of the plot and smap is the current frames Map object. Any objects returned from this function will have their `remove()` method called at the start of the next frame to clear them from the plot. Notes ----- Extra keywords are passed to `mapcube[0].plot()` i.e. the `plot()` routine of the maps in the cube. """ def __init__(self, mapcube, annotate=True, **kwargs): self.mapcube = mapcube self.annotate = annotate self.user_plot_function = kwargs.pop('plot_function', lambda fig, ax, smap: []) # List of object to remove at the start of each plot step self.remove_obj = [] slider_functions = [self.updatefig] slider_ranges = [[0, len(mapcube.maps)]] imageanimator.BaseFuncAnimator.__init__( self, mapcube.maps, slider_functions, slider_ranges, **kwargs) if annotate: self._annotate_plot(0) def updatefig(self, val, im, slider): # Remove all the objects that need to be removed from the # plot while self.remove_obj: self.remove_obj.pop(0).remove() i = int(val) im.set_array(self.data[i].data) im.set_cmap(self.mapcube[i].plot_settings['cmap']) norm = deepcopy(self.mapcube[i].plot_settings['norm']) # The following explicit call is for bugged versions of Astropy's ImageNormalize norm.autoscale_None(self.data[i].data) im.set_norm(norm) if wcsaxes_compat.is_wcsaxes(im.axes): im.axes.reset_wcs(self.mapcube[i].wcs) wcsaxes_compat.default_wcs_ticks(im.axes, self.mapcube[i].spatial_units, self.mapcube[i].coordinate_system) # Having this line in means the plot will resize for non-homogenous # maps. However it also means that if you zoom in on the plot bad # things happen. # im.set_extent(self.mapcube[i].xrange + self.mapcube[i].yrange) if self.annotate: self._annotate_plot(i) self.remove_obj += list( self.user_plot_function(self.fig, self.axes, self.mapcube[i])) def _annotate_plot(self, ind): """ Annotate the image. This may overwrite some stuff in `GenericMap.plot()` """ # Normal plot self.axes.set_title("{s.name}".format(s=self.data[ind])) self.axes.set_xlabel(axis_labels_from_ctype(self.data[ind].coordinate_system[0], self.data[ind].spatial_units[0])) self.axes.set_ylabel(axis_labels_from_ctype(self.data[ind].coordinate_system[1], self.data[ind].spatial_units[1])) def _get_main_axes(self): """ Create an axes which is wcsaxes if we have that... """ if not _FORCE_NO_WCSAXES: return self.fig.add_subplot(111, projection=self.mapcube[0].wcs) else: return self.fig.add_subplot(111) def plot_start_image(self, ax): im = self.mapcube[0].plot( annotate=self.annotate, axes=ax, **self.imshow_kwargs) self.remove_obj += list( self.user_plot_function(self.fig, self.axes, self.mapcube[0])) return im sunpy-0.8.3/sunpy/visualization/visualization.py0000644000175000017500000000261313231613140022422 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- from matplotlib import pyplot def toggle_pylab(fn): """ A decorator to prevent functions from opening matplotlib windows unexpectedly when sunpy is run in interactive shells like ipython --pylab. Toggles the value of matplotlib.pyplot.isinteractive() to preserve the users' expectations of pylab's behaviour in general. Parameters ---------- fn : function object ? Returns ------ ? : ? ? .. todo:: improve documentation """ if pyplot.isinteractive(): def fn_itoggle(*args, **kwargs): pyplot.ioff() ret = fn(*args, **kwargs) pyplot.ion() return ret return fn_itoggle else: return fn def axis_labels_from_ctype(ctype, unit): ctype_short = ctype[:4] labels = {'HGLN': 'Heliographic Longitude [{}]'.format(unit), 'CRLN': 'Carrington Longitude [{}]'.format(unit), 'HPLN': 'Helioprojective Longitude (Solar-X) [{}]'.format(unit), 'SOLX': 'Heliocentric X [{}]'.format(unit), 'HGLT': 'Latitude [{}]'.format(unit), 'CRLT': 'Latitude [{}]'.format(unit), 'HPLT': 'Helioprojective Latitude (Solar-Y) [{}]'.format(unit), 'SOLY': 'Heliocentric Y [{}]'.format(unit)} return labels.get(ctype_short, "{} [{}]".format(ctype, unit)) sunpy-0.8.3/sunpy/visualization/wcsaxes_compat.py0000644000175000017500000001446213231613140022546 0ustar nabilnabil00000000000000# -*- coding: utf-8 -*- """ Helpers and Functions to make WCSAxes work in SunPy """ import matplotlib.pyplot as plt import astropy.units as u try: from astropy.visualization import wcsaxes except ImportError: raise ImportError("Astropy >= 1.3 is required to use SunPy") # Force is put here to enable disabling all checks in this module. It should # only be used by tests and other such hacks. _FORCE_NO_WCSAXES = False __all__ = ['is_wcsaxes'] def is_wcsaxes(axes): """ Test a matplotlib Axes object to see if it is an instance of WCSAxes. Parameters ---------- axes : `matplotlib.axes` Object Axes to test Returns ------- result : `bool` Result of the test """ if not _FORCE_NO_WCSAXES: return isinstance(axes, wcsaxes.WCSAxes) else: return False def gca_wcs(wcs, fig=None, slices=None): """ Get the current axes, and return a WCSAxes if possible. Parameters ---------- wcs : `astropy.wcs.WCS` A `~astropy.wcs.WCS` object used to create a new axes. fig : `matplotlib.figure.Figure` The figure in which to check for the axes. slices : `tuple` ``slices`` is passed to `~astropy.visualization.wcsaxes.WCSAxes` to describe which two dimensions of the `~astropy.wcs.WCS` object are being plotted. This slices the multidimensional wcs object in the way it needs to be sliced. Returns ------- ax : `matplotlib.axes.Axes` or `~astropy.visualization.wcsaxes.WCSAxes` object. The current axes, or a new one if created. """ if not fig: fig = plt.gcf() if not len(fig.get_axes()): if not _FORCE_NO_WCSAXES: ax = plt.gca(projection=wcs, slices=slices) else: ax = plt.gca() else: ax = plt.gca() return ax def get_world_transform(axes): """ Get the transformation to world coordinates. If the axes is a `~astropy.visualization.wcsaxes.WCSAxes` instance this returns the transform to the ``'world'`` coordinates, otherwise it returns the transform to the matplotlib data coordinates, which are assumed to be in world coordinates. Parameters ---------- axes : `~astropy.visualization.wcsaxes.WCSAxes` or `~matplotlib.axes.Axes` object. The axes to get the transform from. Returns ------- transform : `~matplotlib.transforms.CompositeGenericTransform` The transformation object. """ if is_wcsaxes(axes): transform = axes.get_transform('world') else: transform = axes.transData return transform def solar_coord_type_from_ctype(ctype): """ Determine whether a particular WCS ctype corresponds to an angle or scalar coordinate. """ if ctype[2:4] == 'LN': if ctype[:4] in ['HPLN', 'HGLN']: return 'longitude', 180. return 'longitude', None elif ctype[2:4] == 'LT': return 'latitude', None else: return 'scalar', None def default_wcs_ticks(axes, units, ctypes): """ Set the ticks and axes type on a solar WCSAxes plot. """ if not isinstance(axes, wcsaxes.WCSAxes): raise TypeError("This axes is not a WCSAxes") x = axes.coords[0] y = axes.coords[1] if x.ticks.get_tick_out() == 'in': x.set_ticks(color='white') if y.ticks.get_tick_out() == 'in': y.set_ticks(color='white') x.set_ticks_position('bl') y.set_ticks_position('bl') xtype = solar_coord_type_from_ctype(ctypes[0]) ytype = solar_coord_type_from_ctype(ctypes[1]) x.set_coord_type(*xtype) y.set_coord_type(*ytype) if xtype[0] == 'scalar': x.set_major_formatter('x.x') elif units[0] is u.deg: x.set_major_formatter('d.d') elif units[0] is u.arcsec: x.set_major_formatter('s.s') else: x.set_major_formatter('x.x') if ytype[0] == 'scalar': x.set_major_formatter('x.x') elif units[1] is u.deg: y.set_major_formatter('d.d') elif units[1] is u.arcsec: y.set_major_formatter('s.s') else: y.set_major_formatter('x.x') def default_wcs_grid(axes, units, ctypes): """ Apply some default wcsaxes grid formatting. Parameters ---------- axes : `~astropy.visualization.wcsaxes.WCSAxes` object. The `~astropy.visualization.wcsaxes.WCSAxes` object to draw the world coordinate grid on. units : `tuple` The axes units axes x y order. """ default_wcs_ticks(axes, units, ctypes) axes.coords.grid(color='white', alpha=0.6, linestyle='dotted', linewidth=0.5) @u.quantity_input(grid_spacing=u.deg) def wcsaxes_heliographic_overlay(axes, grid_spacing=10*u.deg, **kwargs): """ Create a heliographic overlay using wcsaxes. Also draw a grid and label the top axes. Parameters ---------- axes : `~astropy.visualization.wcsaxes.WCSAxes` object. The `~astropy.visualization.wcsaxes.WCSAxes` object to create the HGS overlay on. grid_spacing: `~astropy.units.Quantity` Spacing for longitude and latitude grid in degrees. Returns ------- overlay : `~astropy.visualization.wcsaxes.WCSAxes` overlay The overlay object. Notes ----- Keywords are passed to `~astropy.visualization.wcsaxes.coordinates_map.CoordinatesMap.grid`. """ # Unpack spacing if isinstance(grid_spacing, u.Quantity) and grid_spacing.size == 1: lon_space = lat_space = grid_spacing elif grid_spacing.size == 2: lon_space, lat_space = grid_spacing else: raise ValueError("grid_spacing must be a Quantity of length one or two.") overlay = axes.get_coords_overlay('heliographic_stonyhurst') lon = overlay[0] lat = overlay[1] lon.coord_wrap = 180 lon.set_major_formatter('dd') lon.set_axislabel('Solar Longitude') lat.set_axislabel('Solar Latitude') lon.set_ticks_position('tr') lat.set_ticks_position('tr') grid_kw = {'color': 'white', 'zorder': 100, 'alpha': 0.5} grid_kw.update(kwargs) lon.set_ticks(spacing=lon_space, color=grid_kw['color']) lat.set_ticks(spacing=lat_space, color=grid_kw['color']) overlay.grid(**grid_kw) if axes.title: x, y = axes.title.get_position() axes.title.set_position([x, y + 0.07]) return overlay sunpy-0.8.3/sunpy/wcs/0000755000175000017500000000000013232563477015062 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/wcs/tests/0000755000175000017500000000000013232563477016224 5ustar nabilnabil00000000000000sunpy-0.8.3/sunpy/wcs/tests/__init__.py0000644000175000001440000000000013210261730017270 0ustar nabil00000000000000sunpy-0.8.3/sunpy/wcs/tests/test_wcs.py0000644000175000017500000001634013232563373020430 0ustar nabilnabil00000000000000from __future__ import absolute_import #pylint: disable=E1103 import numpy as np from numpy.testing import assert_allclose import sunpy.wcs as wcs import sunpy.sun as sun import pytest # the following values are taken from the test file 'aia_171_level1.fits' @pytest.fixture def angle_unit(): return 'arcsec' @pytest.fixture def dsun(): return 147724815128.0 @pytest.fixture def b0(): return -6.820544 @pytest.fixture def l0(): return 0.0 # the following known_answers come from equivalent queries to IDL # WCS implementation (http://hesperia.gsfc.nasa.gov/ssw/gen/idl/wcs/) def test_convert_angle_units(): actual = np.array([wcs._convert_angle_units(), wcs._convert_angle_units('arcsec'), wcs._convert_angle_units('arcmin'), wcs._convert_angle_units('degrees'), wcs._convert_angle_units('mas')]) desired = np.array([np.deg2rad(1) / (60 * 60), np.deg2rad(1) / (60 * 60), np.deg2rad(1) / 60.0, np.deg2rad(1), np.deg2rad(1) / (60 * 60 * 1000)]) assert_allclose(actual, desired, rtol=1e-2, atol=0) def test_conv_hpc_hcc(angle_unit, dsun): coord = [40.0, 32.0] result = wcs.convert_hpc_hcc(coord[0], coord[1], angle_units=angle_unit, dsun_meters=dsun) known_answer = [28512914, 22810332] assert_allclose(result, known_answer, rtol=1e-2, atol=0) result = wcs.convert_hpc_hcc(coord[0], coord[1], angle_units=angle_unit, dsun_meters=0.5*dsun) known_answer = [14323802., 11459042.] assert_allclose(result, known_answer, rtol=1e-2, atol=0) # Make sure that z coordinate is returned if parameter z is True result = wcs.convert_hpc_hcc(coord[0], coord[1], angle_units=angle_unit, dsun_meters=dsun, z=True) known_answer = [28748691, 22998953, 695016924] assert_allclose(result, known_answer, rtol=1e-2, atol=0) def test_conv_hcc_hpc(angle_unit, dsun): coord = [28748691, 22998953] result = wcs.convert_hcc_hpc(coord[0], coord[1], angle_units=angle_unit, dsun_meters=dsun) known_answer = [40.331028, 32.264823] assert_allclose(result, known_answer, rtol=1e-4, atol=0) def test_conv_hcc_hg(b0, l0): coord = [28748691, 22998953] result = wcs.convert_hcc_hg(coord[0], coord[1], b0_deg=b0, l0_deg=l0) known_answer = [2.3744334, -4.9292855] assert_allclose(result, known_answer, rtol=1e-2, atol=0) # Make sure that r value is returned if radius=True result = wcs.convert_hcc_hg(coord[0], coord[1], b0_deg=b0, l0_deg=l0, radius=True) known_answer = [2.3744334, -4.9292855, sun.constants.radius.si.value] assert_allclose(result, known_answer, rtol=1e-2, atol=0) def test_conv_hg_hcc(b0, l0): coord = [34.0, 96.0] result = wcs.convert_hg_hcc(coord[0], coord[1], b0_deg=b0, l0_deg=l0) known_answer = [-40653538.0, 6.7903529e8] assert_allclose(result, known_answer, rtol=1e-2, atol=0) # Test the radius parameter using half of the Sun's radius known_answer = [x / 2.0 for x in known_answer] radius = sun.constants.radius.si.value / 2.0 result = wcs.convert_hg_hcc(coord[0], coord[1], b0_deg=b0, l0_deg=l0, r=radius) assert_allclose(result, known_answer, rtol=1e-2, atol=0) # Make sure that z coordinates are returned if z=True known_answer = [-40653538., 6.7964496e8, -1.4199085e8] result = wcs.convert_hg_hcc(coord[0], coord[1], b0_deg=b0, l0_deg=l0, z=True) assert_allclose(result, known_answer, rtol=1e-2, atol=0) # If z < 0, using occultation should make the return coordinates nan coord2 = [55.0, 56.0] known_answer = [[np.nan, 3.1858718e8], [np.nan, 5.9965928e8]] coords = zip(coord, coord2) result = wcs.convert_hg_hcc(*coords, b0_deg=b0, l0_deg=l0, occultation=True) assert_allclose(result, known_answer, rtol=1e-2, atol=0) def test_conv_hg_hpc(angle_unit, dsun, b0, l0): coord = [34.0, 45.0] result = wcs.convert_hg_hpc(coord[0], coord[1], dsun_meters=dsun, b0_deg=b0, l0_deg=l0, angle_units=angle_unit) known_answer = [381.737592, 747.072612] assert_allclose(result, known_answer, rtol=1e-2, atol=0) # Test to make sure occultation parameter works coord = [34.0, 96.0] coord2 = [55.0, 56.0] known_answer = [[np.nan, 441.65710359], [np.nan, 831.30194808]] coords = zip(coord, coord2) result = wcs.convert_hg_hpc(*coords, dsun_meters=dsun, b0_deg=b0, l0_deg=l0, angle_units=angle_unit, occultation=True) assert_allclose(result, known_answer, rtol=1e-2, atol=0) def test_conv_hpc_hg(angle_unit, dsun, b0, l0): coord = [382, 748] known_answer = [33.486471, 44.663506] result = wcs.convert_hpc_hg(coord[0], coord[1], dsun_meters=dsun, b0_deg=b0, l0_deg=l0, angle_units=angle_unit) assert_allclose(result, known_answer, rtol=1e-2, atol=0) def test_convert_to_coord(dsun, angle_unit, b0, l0): x, y = (34.0, 96.0) b0_deg = b0 l0_deg = l0 def check_conversion(from_coord, to_coord, expected): # Make sure that wcs.convert_to_coord returns the expected value assert_allclose(wcs.convert_to_coord(x, y, from_coord, to_coord, b0_deg=b0_deg, l0_deg=l0_deg, dsun_meters=dsun, angle_units=angle_unit), expected, rtol=1e-2, atol=0) check_conversion('hcc', 'hg', wcs.convert_hcc_hg(x, y, b0_deg=b0_deg, l0_deg=l0_deg)) check_conversion('hpc', 'hg', wcs.convert_hpc_hg(x, y, b0_deg=b0_deg, l0_deg=l0_deg, dsun_meters=dsun, angle_units=angle_unit)) check_conversion('hg', 'hcc', wcs.convert_hg_hcc(x, y, b0_deg=b0_deg, l0_deg=l0_deg)) check_conversion('hcc', 'hpc', wcs.convert_hcc_hpc(x, y, dsun_meters=dsun, angle_units=angle_unit)) check_conversion('hg', 'hpc', wcs.convert_hg_hpc(x, y, b0_deg=b0_deg, l0_deg=l0_deg, dsun_meters=dsun, angle_units=angle_unit)) check_conversion('hpc', 'hcc', wcs.convert_hpc_hcc(x, y, dsun_meters=dsun, angle_units=angle_unit)) def test_convert_back(): # Make sure transformation followed by inverse transformation returns # the original coordinates coord = [40.0, 32.0] assert_allclose(wcs.convert_hcc_hpc(*wcs.convert_hpc_hcc(*coord)), coord, rtol=1e-2, atol=0) coord = [13.0, 58.0] assert_allclose(wcs.convert_hg_hcc(*wcs.convert_hcc_hg(*coord)), coord, rtol=1e-2, atol=0) coord = [34.0, 45.0] assert_allclose(wcs.convert_hpc_hg(*wcs.convert_hg_hpc(*coord)), coord, rtol=1e-2, atol=0) # Ensures that further testing involving wcs uses the "constants" value # of the solar radius in meters. There is a line above that resets the # wcs value of the solar radius for the purposes of these tests. The # line below restores the original value. This ensures that when using # Travis testing, all further tests that use wcs also use the correct # value of the solar radius. wcs.wcs.rsun_meters = sun.constants.radius.si.value sunpy-0.8.3/sunpy/wcs/__init__.py0000644000175000017500000000573713232563373017202 0ustar nabilnabil00000000000000""" .. warning:: As of version 0.8.0 the `sunpy.wcs` package is deprecated and will be removed in a future version, you should now transition to using `sunpy.coordinates` and `sunpy.map.GenericMap.world_to_pixel` / `sunpy.map.GenericMap.pixel_to_world` (or `astropy.wcs` directly) for the functionality provided in this module. The WCS package provides functions to parse World Coordinate System (WCS) coordinates for solar images as well as convert between various solar coordinate systems. The solar coordinates supported are * Helioprojective-Cartesian (HPC): The most often used solar coordinate system. Describes positions on the Sun as angles measured from the center of the solar disk (usually in arcseconds) using cartesian coordinates (X, Y) * Helioprojective-Radial (HPR): Describes positions on the Sun using angles, similar to HPC, but uses a radial coordinate (rho, psi) system centered on solar disk where psi is measured in the counter clock wise direction. * Heliocentric-Cartesian (HCC): The same as HPC but with positions expressed in true (deprojected) physical distances instead of angles on the celestial sphere. * Heliocentric-Radial (HCR): The same as HPR but with rho expressed in true (deprojected) physical distances instead of angles on the celestial sphere. * Stonyhurst-Heliographic (HG): Expressed positions on the Sun using longitude and latitude on the solar sphere but with the origin which is at the intersection of the solar equator and the central meridian as seen from Earth. This means that the coordinate system remains fixed with respect to Earth while the Sun rotates underneath it. * Carrington-Heliographic (HG): Carrington longitude is offset from Stonyhurst longitude by a time-dependent scalar value, L0. At the start of each Carrington rotation, L0 = 360, and steadily decreases until it reaches L0 = 0, at which point the next Carrington rotation starts. Some definitions * b0: Tilt of the solar North rotational axis toward the observer (helio- graphic latitude of the observer). Note that SOLAR_B0, HGLT_OBS, and CRLT_OBS are all synonyms. * l0: Carrington longitude of central meridian as seen from Earth. * dsun_meters: Distance between observer and the Sun. Default is 1 AU. * rsun_meters: Radius of the Sun in meters. Default is 6.955e8 meters. This valued is stored locally in this module and can be modified if necessary. References ---------- | Thompson (2006), A&A, 449, 791 | PDF """ from __future__ import absolute_import import warnings from sunpy.util.exceptions import SunpyDeprecationWarning warnings.warn("As of v0.8.0, the `sunpy.wcs` module is deprecated and will be " "removed in a future version. Use `sunpy.coordinates` or " "`sunpy.map` for coordinate transformations.", SunpyDeprecationWarning) from sunpy.wcs.wcs import * sunpy-0.8.3/sunpy/wcs/wcs.py0000644000175000017500000004133613231613140016215 0ustar nabilnabil00000000000000from __future__ import absolute_import import numpy as np from sunpy.util.decorators import deprecated import sunpy.sun as sun import astropy.units as u rsun_meters = sun.constants.radius.si.value __all__ = ['_convert_angle_units', 'convert_pixel_to_data', 'convert_hpc_hg', 'convert_data_to_pixel', 'convert_hpc_hcc', 'convert_hcc_hpc', 'convert_hcc_hg', 'convert_hg_hcc', 'proj_tan', 'convert_hg_hpc', 'convert_to_coord', 'get_center'] def _convert_angle_units(unit='arcsec'): """Determine the conversion factor between the data units and radians.""" if unit == 'degrees': return np.deg2rad(1) elif unit == 'arcmin': return np.deg2rad(1) / 60.0 elif unit == 'arcsec': return np.deg2rad(1) / (60 * 60.0) elif unit == 'mas': return np.deg2rad(1) / (60 * 60 * 1000.0) else: raise ValueError("The units specified are either invalid or is not supported at this time.") @deprecated("0.8.0", alternative="sunpy.map.GenericMap.pixel_to_world") def convert_pixel_to_data(size, scale, reference_pixel, reference_coordinate, x=None, y=None): """ Calculate the data coordinate for particular pixel indices. Parameters ---------- size : 2d ndarray Number of pixels in width and height. scale : 2d ndarray The size of a pixel (dx,dy) in data coordinates (equivalent to WCS/CDELT) reference_pixel : 2d ndarray The reference pixel (x,y) at which the reference coordinate is given (equivalent to WCS/CRPIX) reference_coordinate : 2d ndarray The data coordinate (x, y) as measured at the reference pixel (equivalent to WCS/CRVAL) x,y : int or ndarray The pixel values at which data coordinates are requested. If none are given, returns coordinates for every pixel. Returns ------- out : ndarray The data coordinates at pixel (x,y). Notes ----- This function assumes a gnomic projection which is correct for a detector at the focus of an optic observing the Sun. """ cdelt = np.array(scale) crpix = np.array(reference_pixel) crval = np.array(reference_coordinate) # first assume that coord is just [x,y] if (x is None) and (y is None): x, y = np.meshgrid(np.arange(size[0]), np.arange(size[1])) # note that crpix[] counts pixels starting at 1 coordx = (x - (crpix[0] - 1)) * cdelt[0] + crval[0] coordy = (y - (crpix[1] - 1)) * cdelt[1] + crval[1] # Correct for Gnomic projection coordx, coordy = proj_tan(coordx, coordy) return coordx, coordy @deprecated("0.8.0") def get_center(size, scale, reference_pixel, reference_coordinate): """ Returns the center of the image in data coordinates. Parameters ---------- size : 2d ndarray Number of pixels in width and height. scale : 2d ndarray The size of a pixel (dx,dy) in data coordinates (equivalent to WCS/CDELT) reference_pixel : 2d ndarray The reference pixel (x,y) at which the reference coordinate is given (equivalent to WCS/CRPIX) reference_coordinate : 2d ndarray The data coordinate (x, y) as measured at the reference pixel (equivalent to WCS/CRVAL) Returns ------- out : ndarray The data coordinates """ return scale * (size - 1 * u.pix) / 2. + reference_coordinate - (reference_pixel - 1 * u.pix) * scale @deprecated("0.8.0", alternative="sunpy.map.GenericMap.world_to_pixel") def convert_data_to_pixel(x, y, scale, reference_pixel, reference_coordinate): """ Calculate the pixel indices for a given data coordinate. Parameters ---------- x, y : float Data coordinate in same units as reference coordinate scale : 2d ndarray The size of a pixel (dx,dy) in data coordinates (equivalent to WCS/CDELT) reference_pixel : 2d ndarray The reference pixel (x,y) at which the reference coordinate is given (equivalent to WCS/CRPIX) reference_coordinate : 2d ndarray The data coordinate (x, y) as measured at the reference pixel (equivalent to WCS/CRVAL) Returns ------- out : ndarray The pixel coordinates (x,y) at that data coordinate. """ # TODO: Needs to check what coordinate system the data is given in cdelt = np.array(scale) crpix = np.array(reference_pixel) crval = np.array(reference_coordinate) # De-apply any tabular projections. # coord = inv_proj_tan(coord) # note that crpix[] counts pixels starting at 1 pixelx = (x - crval[0]) / cdelt[0] + (crpix[0] - 1) pixely = (y - crval[1]) / cdelt[1] + (crpix[1] - 1) return pixelx, pixely @deprecated("0.8.0", alternative="sunpy.coordinates") def convert_hpc_hcc(x, y, dsun_meters=None, angle_units='arcsec', z=False): """ Converts from Helioprojective-Cartesian (HPC) coordinates into Heliocentric-Cartesian (HCC) coordinates. Returns all three dimensions, x, y, z in meters. Parameters ---------- x, y : float Data coordinate in angle units (default is arcsec) dsun_meters : float Distance from the observer to the Sun in meters. Default is 1 AU. angle_units : str Units of the data coordinates (e.g. arcsec, arcmin, degrees). Default is arcsec. z : Bool If true return the z coordinate as well. Returns ------- out : ndarray The data coordinates (x,y,z) in heliocentric cartesian coordinates in meters. Notes ----- Implements Eq. (15) of Thompson (2006), A&A, 449, 791. Examples -------- >>> import sunpy.wcs >>> sunpy.wcs.convert_hpc_hcc(40.0, 32.0, z=True) # doctest: +FLOAT_CMP (28876152.176423457, 23100922.071266972, 694524220.8157959) """ c = np.array([_convert_angle_units(unit=angle_units), _convert_angle_units(unit=angle_units)]) cosx = np.cos(x * c[0]) sinx = np.sin(x * c[0]) cosy = np.cos(y * c[1]) siny = np.sin(y * c[1]) if dsun_meters is None: dsun_meters = sun.constants.au.si.value elif isinstance(dsun_meters, u.Quantity): dsun_meters = dsun_meters.si.value q = dsun_meters * cosy * cosx distance = q ** 2 - dsun_meters ** 2 + rsun_meters ** 2 # distance[np.where(distance < 0)] = np.sqrt(-1) distance = q - np.sqrt(distance) rx = distance * cosy * sinx ry = distance * siny rz = dsun_meters - distance * cosy * cosx if np.all(z == True): return rx, ry, rz else: return rx, ry @deprecated("0.8.0", alternative="sunpy.coordinates") def convert_hcc_hpc(x, y, dsun_meters=None, angle_units='arcsec'): """ Convert Heliocentric-Cartesian (HCC) to angular Helioprojective-Cartesian (HPC) coordinates (in degrees). Parameters ---------- x, y : float (meters) Data coordinate in meters. dsun_meters : float Distance from the observer to the Sun in meters. Default is 1 AU. angle_units : str Units of the data coordinates (e.g. arcsec, arcmin, degrees). Default is arcsec. Returns ------- out : ndarray The data coordinates (x,y) in helioprojective cartesian coordinates in arcsec. Notes ----- Implements Eq. (16) of Thompson (2006), A&A, 449, 791. Examples -------- >>> import sunpy.wcs >>> sunpy.wcs.convert_hcc_hpc(28748691, 22998953) # doctest: +FLOAT_CMP (39.823439773829705, 31.858751644835717) """ # Calculate the z coordinate by assuming that it is on the surface of the Sun z = np.sqrt(rsun_meters ** 2 - x ** 2 - y ** 2) if dsun_meters is None: dsun_meters = sun.constants.au.si.value elif isinstance(dsun_meters, u.Quantity): dsun_meters = dsun_meters.si.value zeta = dsun_meters - z distance = np.sqrt(x**2 + y**2 + zeta**2) hpcx = np.rad2deg(np.arctan2(x, zeta)) hpcy = np.rad2deg(np.arcsin(y / distance)) if angle_units == 'arcsec': hpcx = 60 * 60 * hpcx hpcy = 60 * 60 * hpcy elif angle_units == 'arcmin': hpcx = 60 * hpcx hpcy = 60 * hpcy return hpcx, hpcy @deprecated("0.8.0", alternative="sunpy.coordinates") def convert_hcc_hg(x, y, z=None, b0_deg=0, l0_deg=0, radius=False): """ Convert from Heliocentric-Cartesian (HCC) (given in meters) to Stonyhurst Heliographic coordinates (HG) given in degrees, with radial output in meters. Parameters ---------- x, y : float (meters) Data coordinate in meters. z : float (meters) Data coordinate in meters. If None, then the z-coordinate is assumed to be on the Sun. b0_deg : float (degrees) Tilt of the solar North rotational axis toward the observer (heliographic latitude of the observer). Usually given as SOLAR_B0, HGLT_OBS, or CRLT_OBS. Default is 0. l0_deg : float (degrees) Carrington longitude of central meridian as seen from Earth. Default is 0. radius : Bool If true, forces the output to return a triple of (lon, lat, r). If false, return (lon, lat) only. Returns ------- out : ndarray (degrees, meters) if radius is false, return the data coordinates (lon, lat). If radius=True, return the data coordinates (lon, lat, r). The quantities (lon, lat) are the heliographic coordinates in degrees. The quantity 'r' is the heliographic radius in meters. Notes ----- Implements Eq. (12) of Thompson (2006), A&A, 449, 791. Examples -------- >>> import sunpy.wcs >>> sunpy.wcs.convert_hcc_hg(230000.0,45000000.0, # doctest: +FLOAT_CMP ... z=695508000.0 + 8000000.0, radius=True) (0.01873188196651189, 3.6599471896203317, 704945784.41465974) """ if z is None: z = np.sqrt(rsun_meters**2 - x**2 - y**2) cosb = np.cos(np.deg2rad(b0_deg)) sinb = np.sin(np.deg2rad(b0_deg)) hecr = np.sqrt(x**2 + y**2 + z**2) hgln = np.arctan2(x, z * cosb - y * sinb) + np.deg2rad(l0_deg) hglt = np.arcsin((y * cosb + z * sinb) / hecr) if radius: return np.rad2deg(hgln), np.rad2deg(hglt), hecr else: return np.rad2deg(hgln), np.rad2deg(hglt) @deprecated("0.8.0", alternative="sunpy.coordinates") def convert_hg_hcc(hglon_deg, hglat_deg, b0_deg=0, l0_deg=0, occultation=False, z=False, r=rsun_meters): """ Convert from Stonyhurst Heliographic coordinates (given in degrees) to Heliocentric-Cartesian coordinates (given in meters). Parameters ---------- hglon_deg, hglat_deg : float (degrees) Heliographic longitude and latitude in degrees. b0_deg : float (degrees) Tilt of the solar North rotational axis toward the observer (heliographic latitude of the observer). Usually given as SOLAR_B0, HGLT_OBS, or CRLT_OBS. Default is 0. l0_deg : float (degrees) Carrington longitude of central meridian as seen from Earth. Default is 0. occultation : Bool If true set all points behind the Sun (e.g. not visible) to Nan. z : Bool If true return the z coordinate as well. r : float (meters) Heliographic radius Returns ------- out : ndarray (meters) The data coordinates in Heliocentric-Cartesian coordinates. Notes ----- Implements Eq. (11) of Thompson (2006), A&A, 449, 791, with the default assumption that the value 'r' in Eq. (11) is identical to the radius of the Sun. Examples -------- >>> import sunpy.wcs >>> sunpy.wcs.convert_hg_hcc(0.01873188196651189, 3.6599471896203317, # doctest: +FLOAT_CMP ... r=704945784.41465974, z=True) (230000.0, 45000000.0, 703508000.0) """ lon = np.deg2rad(hglon_deg) lat = np.deg2rad(hglat_deg) cosb = np.cos(np.deg2rad(b0_deg)) sinb = np.sin(np.deg2rad(b0_deg)) lon = lon - np.deg2rad(l0_deg) cosx = np.cos(lon) sinx = np.sin(lon) cosy = np.cos(lat) siny = np.sin(lat) # Perform the conversion. x = r * cosy * sinx y = r * (siny * cosb - cosy * cosx * sinb) zz = r * (siny * sinb + cosy * cosx * cosb) if occultation: x[zz < 0] = np.nan y[zz < 0] = np.nan if np.all(z == True): return x, y, zz else: return x, y @deprecated("0.8.0", alternative="sunpy.coordinates") def convert_hg_hpc(hglon_deg, hglat_deg, b0_deg=0, l0_deg=0, dsun_meters=None, angle_units='arcsec', occultation=False): """ Convert from Heliographic coordinates (HG) to Helioprojective-Cartesian (HPC). Parameters ---------- hglon_deg, hglat_deg : float (degrees) Heliographic longitude and latitude in degrees. b0_deg : float (degrees) Tilt of the solar North rotational axis toward the observer (heliographic latitude of the observer). Usually given as SOLAR_B0, HGLT_OBS, or CRLT_OBS. Default is 0. l0_deg : float (degrees) Carrington longitude of central meridian as seen from Earth. Default is 0. occultation : Bool If true set all points behind the Sun (e.g. not visible) to Nan. dsun_meters : float (meters) Distance between the observer and the Sun. angle_units : str Returns ------- out : ndarray (arcsec) The data coordinates (x,y) in Helioprojective-Cartesian coordinates. Notes ----- Uses equations 11 and 16 in Thompson (2006), A&A, 449, 791-803. Examples -------- >>> import sunpy.wcs >>> sunpy.wcs.convert_hg_hpc(34.0, 45.0, b0_deg=-7.064078, l0_deg=0.0) # doctest: +FLOAT_CMP (380.05656560308898, 743.78281283290016) """ tempx, tempy = convert_hg_hcc(hglon_deg, hglat_deg, b0_deg=b0_deg, l0_deg=l0_deg, occultation=occultation) x, y = convert_hcc_hpc(tempx, tempy, dsun_meters=dsun_meters, angle_units=angle_units) return x, y @deprecated("0.8.0", alternative="sunpy.coordinates") def convert_hpc_hg(x, y, b0_deg=0, l0_deg=0, dsun_meters=None, angle_units='arcsec'): """ Convert from Helioprojective-Cartesian (HPC) to Heliographic coordinates (HG) in degrees. Parameters ---------- x, y : float () Data coordinate in angle units. b0 : float (degrees) Tilt of the solar North rotational axis toward the observer (heliographic latitude of the observer). Usually given as SOLAR_B0, HGLT_OBS, or CRLT_OBS. Default is 0. l0 : float (degrees) Carrington longitude of central meridian as seen from Earth. Default is 0. dsun_meters : float (meters) Distance between the observer and the Sun. angle_units : str Units used for input x and y. Default is arcsec. Returns ------- out : ndarray (degrees) The data coordinates (hglongitude, hglatitude) in Heliographic coordinates. Notes ----- Uses equations 15 and 12 in Thompson (2006), A&A, 449, 791-803. Examples -------- >>> import sunpy.wcs >>> sunpy.wcs.convert_hpc_hg(382, 748, b0_deg=-7.064078, l0_deg=0.0) # doctest: +FLOAT_CMP (34.504653439914669, 45.443143275518182) """ tempx, tempy = convert_hpc_hcc(x, y, dsun_meters=dsun_meters, angle_units=angle_units) lon, lat = convert_hcc_hg(tempx, tempy, b0_deg=b0_deg, l0_deg=l0_deg) return lon, lat @deprecated("0.8.0", alternative="sunpy.map") def proj_tan(x, y, force=False): """ Applies the gnomonic (TAN) projection to intermediate relative coordinates. This function is not currently implemented!""" # if pixels are within 3 degrees of the Sun then skip the calculation unless # force is True. This applies to all sdo images so this function is just # here as a place holder for the future # TODO: write proj_tan function return x, y @deprecated("0.8.0", alternative="sunpy.coordinates") def convert_to_coord(x, y, from_coord, to_coord, b0_deg=0, l0_deg=0, dsun_meters=None, angle_units='arcsec'): """ Apply a coordinate transform to coordinates. Right now can only do hpc to hcc to hg """ if (from_coord == 'hcc') and (to_coord == 'hg'): rx, ry = convert_hcc_hg(x, y, b0_deg=b0_deg, l0_deg=l0_deg) elif (from_coord == 'hpc') and (to_coord == 'hg'): rx, ry = convert_hpc_hg(x, y, b0_deg=b0_deg, l0_deg=l0_deg, dsun_meters=dsun_meters, angle_units=angle_units) elif (from_coord == 'hg') and (to_coord == 'hcc'): rx, ry = convert_hg_hcc(x, y, b0_deg=b0_deg, l0_deg=l0_deg) elif (from_coord == 'hcc') and (to_coord == 'hpc'): rx, ry = convert_hcc_hpc(x, y, dsun_meters=dsun_meters, angle_units=angle_units) elif (from_coord == 'hg') and (to_coord == 'hpc'): rx, ry = convert_hg_hpc(x, y, b0_deg=b0_deg, l0_deg=l0_deg, dsun_meters=dsun_meters, angle_units=angle_units) elif (from_coord == 'hpc') and (to_coord == 'hcc'): rx, ry = convert_hpc_hcc(x, y, dsun_meters=dsun_meters, angle_units=angle_units) return rx, ry sunpy-0.8.3/sunpy/__init__.py0000644000175000017500000000111113232563373016364 0ustar nabilnabil00000000000000""" SunPy ===== An open-source Python library for Solar Physics data analysis. Web Links --------- Homepage: http://www.sunpy.org Documentation: http://docs.sunpy.org """ from __future__ import absolute_import try: from .version import version as __version__ except ImportError: __version__ = '' try: from .version import githash as __githash__ except ImportError: __githash__ = '' from sunpy.util.config import load_config, print_config from sunpy.util import system_info from sunpy.tests import main as self_test # Load user configuration config = load_config()sunpy-0.8.3/sunpy/_compiler.c0000644000175000017500000000573113232563477016411 0ustar nabilnabil00000000000000#include /*************************************************************************** * Macros for determining the compiler version. * * These are borrowed from boost, and majorly abridged to include only * the compilers we care about. ***************************************************************************/ #ifndef PY3K #if PY_MAJOR_VERSION >= 3 #define PY3K 1 #else #define PY3K 0 #endif #endif #define STRINGIZE(X) DO_STRINGIZE(X) #define DO_STRINGIZE(X) #X #if defined __clang__ /* Clang C++ emulates GCC, so it has to appear early. */ # define COMPILER "Clang version " __clang_version__ #elif defined(__INTEL_COMPILER) || defined(__ICL) || defined(__ICC) || defined(__ECC) /* Intel */ # if defined(__INTEL_COMPILER) # define INTEL_VERSION __INTEL_COMPILER # elif defined(__ICL) # define INTEL_VERSION __ICL # elif defined(__ICC) # define INTEL_VERSION __ICC # elif defined(__ECC) # define INTEL_VERSION __ECC # endif # define COMPILER "Intel C compiler version " STRINGIZE(INTEL_VERSION) #elif defined(__GNUC__) /* gcc */ # define COMPILER "GCC version " __VERSION__ #elif defined(__SUNPRO_CC) /* Sun Workshop Compiler */ # define COMPILER "Sun compiler version " STRINGIZE(__SUNPRO_CC) #elif defined(_MSC_VER) /* Microsoft Visual C/C++ Must be last since other compilers define _MSC_VER for compatibility as well */ # if _MSC_VER < 1200 # define COMPILER_VERSION 5.0 # elif _MSC_VER < 1300 # define COMPILER_VERSION 6.0 # elif _MSC_VER == 1300 # define COMPILER_VERSION 7.0 # elif _MSC_VER == 1310 # define COMPILER_VERSION 7.1 # elif _MSC_VER == 1400 # define COMPILER_VERSION 8.0 # elif _MSC_VER == 1500 # define COMPILER_VERSION 9.0 # elif _MSC_VER == 1600 # define COMPILER_VERSION 10.0 # else # define COMPILER_VERSION _MSC_VER # endif # define COMPILER "Microsoft Visual C++ version " STRINGIZE(COMPILER_VERSION) #else /* Fallback */ # define COMPILER "Unknown compiler" #endif /*************************************************************************** * Module-level ***************************************************************************/ struct module_state { /* The Sun compiler can't handle empty structs */ #if defined(__SUNPRO_C) || defined(_MSC_VER) int _dummy; #endif }; #if PY3K static struct PyModuleDef moduledef = { PyModuleDef_HEAD_INIT, "_compiler", NULL, sizeof(struct module_state), NULL, NULL, NULL, NULL, NULL }; #define INITERROR return NULL PyMODINIT_FUNC PyInit__compiler(void) #else #define INITERROR return PyMODINIT_FUNC init_compiler(void) #endif { PyObject* m; #if PY3K m = PyModule_Create(&moduledef); #else m = Py_InitModule3("_compiler", NULL, NULL); #endif if (m == NULL) INITERROR; PyModule_AddStringConstant(m, "compiler", COMPILER); #if PY3K return m; #endif } sunpy-0.8.3/sunpy/conftest.py0000644000175000017500000000373513231613137016461 0ustar nabilnabil00000000000000from __future__ import absolute_import, print_function from functools import partial import os import tempfile import json # Force MPL to use non-gui backends for testing. try: import matplotlib except ImportError: pass else: matplotlib.use('Agg') from sunpy.tests.hash import HASH_LIBRARY_NAME from sunpy.tests.helpers import new_hash_library, figure_test_pngfiles from sunpy.extern import six import pytest # Don't actually import pytest_remotedata because that can do things to the # entrypoints code in pytest. if six.PY2: import imp try: imp.find_module('pytest_remotedata') HAVE_REMOTEDATA = True except ImportError: HAVE_REMOTEDATA = False else: import importlib remotedata_spec = importlib.util.find_spec("pytest_remotedata") HAVE_REMOTEDATA = remotedata_spec is not None def pytest_runtest_setup(item): """ pytest hook to skip all tests that have the mark 'online' if the client is online (simply detected by checking whether http://www.google.com can be requested). """ if isinstance(item, item.Function): if 'remote_data' in item.keywords and not HAVE_REMOTEDATA: pytest.skip("skipping remotedata tests as pytest-remotedata is not installed") def pytest_unconfigure(config): if len(figure_test_pngfiles) > 0: tempdir = tempfile.mkdtemp(suffix="_figures") # Rename each PNG with the name of the corresponding test for test_name in figure_test_pngfiles: os.rename(figure_test_pngfiles[test_name], os.path.join(tempdir, test_name + '.png')) # Write the new hash library in JSON hashfile = os.path.join(tempdir, HASH_LIBRARY_NAME) with open(hashfile, 'w') as outfile: json.dump(new_hash_library, outfile, sort_keys=True, indent=4, separators=(',', ': ')) print('All test files for figure hashes can be found in {0}'.format(tempdir)) print("The corresponding hash library is {0}".format(hashfile)) sunpy-0.8.3/sunpy/version.py0000644000175000017500000001620213232563475016324 0ustar nabilnabil00000000000000# Autogenerated by Astropy-affiliated package sunpy's setup.py on 2018-01-26 08:30:53 from __future__ import unicode_literals import datetime import locale import os import subprocess import warnings def _decode_stdio(stream): try: stdio_encoding = locale.getdefaultlocale()[1] or 'utf-8' except ValueError: stdio_encoding = 'utf-8' try: text = stream.decode(stdio_encoding) except UnicodeDecodeError: # Final fallback text = stream.decode('latin1') return text def update_git_devstr(version, path=None): """ Updates the git revision string if and only if the path is being imported directly from a git working copy. This ensures that the revision number in the version string is accurate. """ try: # Quick way to determine if we're in git or not - returns '' if not devstr = get_git_devstr(sha=True, show_warning=False, path=path) except OSError: return version if not devstr: # Probably not in git so just pass silently return version if 'dev' in version: # update to the current git revision version_base = version.split('.dev', 1)[0] devstr = get_git_devstr(sha=False, show_warning=False, path=path) return version_base + '.dev' + devstr else: # otherwise it's already the true/release version return version def get_git_devstr(sha=False, show_warning=True, path=None): """ Determines the number of revisions in this repository. Parameters ---------- sha : bool If True, the full SHA1 hash will be returned. Otherwise, the total count of commits in the repository will be used as a "revision number". show_warning : bool If True, issue a warning if git returns an error code, otherwise errors pass silently. path : str or None If a string, specifies the directory to look in to find the git repository. If `None`, the current working directory is used, and must be the root of the git repository. If given a filename it uses the directory containing that file. Returns ------- devversion : str Either a string with the revision number (if `sha` is False), the SHA1 hash of the current commit (if `sha` is True), or an empty string if git version info could not be identified. """ if path is None: path = os.getcwd() if not os.path.isdir(path): path = os.path.abspath(os.path.dirname(path)) if sha: # Faster for getting just the hash of HEAD cmd = ['rev-parse', 'HEAD'] else: cmd = ['rev-list', '--count', 'HEAD'] def run_git(cmd): try: p = subprocess.Popen(['git'] + cmd, cwd=path, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) stdout, stderr = p.communicate() except OSError as e: if show_warning: warnings.warn('Error running git: ' + str(e)) return (None, b'', b'') if p.returncode == 128: if show_warning: warnings.warn('No git repository present at {0!r}! Using ' 'default dev version.'.format(path)) return (p.returncode, b'', b'') if p.returncode == 129: if show_warning: warnings.warn('Your git looks old (does it support {0}?); ' 'consider upgrading to v1.7.2 or ' 'later.'.format(cmd[0])) return (p.returncode, stdout, stderr) elif p.returncode != 0: if show_warning: warnings.warn('Git failed while determining revision ' 'count: {0}'.format(_decode_stdio(stderr))) return (p.returncode, stdout, stderr) return p.returncode, stdout, stderr returncode, stdout, stderr = run_git(cmd) if not sha and returncode == 128: # git returns 128 if the command is not run from within a git # repository tree. In this case, a warning is produced above but we # return the default dev version of '0'. return '0' elif not sha and returncode == 129: # git returns 129 if a command option failed to parse; in # particular this could happen in git versions older than 1.7.2 # where the --count option is not supported # Also use --abbrev-commit and --abbrev=0 to display the minimum # number of characters needed per-commit (rather than the full hash) cmd = ['rev-list', '--abbrev-commit', '--abbrev=0', 'HEAD'] returncode, stdout, stderr = run_git(cmd) # Fall back on the old method of getting all revisions and counting # the lines if returncode == 0: return str(stdout.count(b'\n')) else: return '' elif sha: return _decode_stdio(stdout)[:40] else: return _decode_stdio(stdout).strip() # This function is tested but it is only ever executed within a subprocess when # creating a fake package, so it doesn't get picked up by coverage metrics. def _get_repo_path(pathname, levels=None): # pragma: no cover """ Given a file or directory name, determine the root of the git repository this path is under. If given, this won't look any higher than ``levels`` (that is, if ``levels=0`` then the given path must be the root of the git repository and is returned if so. Returns `None` if the given path could not be determined to belong to a git repo. """ if os.path.isfile(pathname): current_dir = os.path.abspath(os.path.dirname(pathname)) elif os.path.isdir(pathname): current_dir = os.path.abspath(pathname) else: return None current_level = 0 while levels is None or current_level <= levels: if os.path.exists(os.path.join(current_dir, '.git')): return current_dir current_level += 1 if current_dir == os.path.dirname(current_dir): break current_dir = os.path.dirname(current_dir) return None _packagename = "sunpy" _last_generated_version = "0.8.3" _last_githash = "5437856a2ab0bff996b6a8740f38d3631cca642d" # Determine where the source code for this module # lives. If __file__ is not a filesystem path then # it is assumed not to live in a git repo at all. if _get_repo_path(__file__, levels=len(_packagename.split('.'))): version = update_git_devstr(_last_generated_version, path=__file__) githash = get_git_devstr(sha=True, show_warning=False, path=__file__) or _last_githash else: # The file does not appear to live in a git repo so don't bother # invoking git version = _last_generated_version githash = _last_githash major = 0 minor = 8 bugfix = 3 release = True timestamp = datetime.datetime(2018, 1, 26, 8, 30, 53) debug = False try: from ._compiler import compiler except ImportError: compiler = "unknown" try: from .cython_version import cython_version except ImportError: cython_version = "unknown" sunpy-0.8.3/CHANGELOG.rst0000644000175000017500000006570613232563447015144 0ustar nabilnabil000000000000000.8.3 (Unreleased) ================== Bug Fixes --------- - `~sunpy.net.dataretriever.clients.XRSClient` now reports time ranges of files correctly. [#2364] - Make parse_time work with datetime64s and pandas series [#2370] - CompositeMap axes scaling now uses map spatial units [#2310] - Moved license file to root of repository and updated README file [#2326] - Fix docstring formatting for net.vso.attrs [#2309]] - Fix coloring of ticks under matplotlib 2.0 default style [#2320] - Always index arrays with tuples in `ImageAnimator` [#2320] - Added links to possible attrs for FIDO in guide [#2317] [#2289] - Updated GitHub Readme [#2281] [#2283] - Fix matplotlib / pandas 0.21 bug in examples [#2336] - Fixes the off limb enhancement example [#2329] - Changes to masking hot pixels and picking bright pixels examples [#2325] [#2319] - Travis CI fix for numpy-dev build [#2340] - Updated masking brightest pixel example [#2338] - Changed TRAVIS cronjobs [#2338] - Support array values for `obstime` for coordinates and transformations [#2342] [#2346] - Updated Gallery off limb enhance example [#2337] - Documentation fixes for VSO [#2354] [#2353] - All tests within the documentation have been fixed [#2343] - Change to using pytest-remotedata for our online tests [#2345] - Fixed upstream astropy/numpy documentation issues [#2359] - Documentation for Map improved [#2361] - Fix the output units of pixel_to_world [#2362] - Documentation for Database improved [#2355] - Added test for mapsave [#2365] - Documentation for Sun improved [#2369] 0.8.2 ===== Bug Fixes --------- - Shows a warning if observation time is missing [#2293] - Updates MapCube to access the correct properties of the namedtuple SpatialPair [#2297] 0.8.1 ====== Bug fixes --------- - Fixed TimeSeries test failures due to missing test files [#2273] - Refactored a GOES test to avoid a Py3.6 issue [#2276] 0.8.0 ====== New Features ------------ - Solar differential rotation for maps and submaps included. - Solar rotation calculation and mapcube derotation now use sunpy coordinates. - Sample data now downloads automatically on import if not available and is now pluggable so can be used by affiliated packages. Shortcut names have been normalized and all LIGHTCURVE shortcuts have changed to TIMESERIES. - Calculation of points on an arc of a great circle connecting two points on the Sun. - Removed ``extract_time`` function from ``sunpy.time`` and also tests related to the function from ``sunpy.time.tests`` - User can now pass a custom time format as an argument inside ``sunpy.database.add_from_dir()`` in case the ``date-obs`` metadata cannot be read automatically from the files. - Add time format used by some SDO HMI FITS keywords - Now the ``sunpy.database.tables.display_entries()`` prints an astropy table. - Additional methods added inside the ``sunpy.database`` class to make it easier to display the database contents. - Remove unused ``sunpy.visualization.plotting`` module - Port the pyana wrapper to Python 3 - ``Map.peek(basic_plot-True)`` no longer issues warnings - Remove the ``sunpy.map.nddata_compat`` module, this makes ``Map.data`` and ``Map.meta`` read only. - Add a ``NorthOffsetFrame`` class for generating HGS-like coordinate systems with a shifted north pole. - Remove deprecated ``VSOClient.show`` method. - Deprecate ``sunpy.wcs``: ``sunpy.coordinates`` and ``sunpy.map`` now provide all that functionality in a more robust manner. - Added hdu index in ``sunpy.database.tables.DatabaseEntry`` as a column in the table. - Removed ``HelioviewerClient`` from the ``sunpy.net`` namespace. It should now be imported with ``from sunpy.net.helioviewer import HelioviewerClient``. - Removed compatibility with standalone ``wcsaxes`` and instead depend on the version in astropy 1.3. SunPy now therefore depends on astropy>-1.3. - Update to ``TimeRange.__repr__``; now includes the qualified name and ``id`` of the object. - A new ``sunpy.visualization.imageanimator.LineAnimator`` class has been added to animate 1D data. This has resulted in API change for the ``sunpy.visualization.imageanimator.ImageAnimator`` class. The updateimage method has been renamed to update\_plot. - Drop support for Python 3.4. - SunPy now requires WCSAxes and Map.draw\_grid only works with WCSAxes. - ``Helioprojective`` and ``HelioCentric`` frames now have an ``observer`` attribute which itself is a coordinate object (``SkyCoord``) instead of ``B0``, ``L0`` and ``D0`` to describe the position of the observer. - ``GenericMap.draw_grid`` now uses ``WCSAxes``, it will only work on a ``WCSAxes`` plot, this may be less performant than the previous implementation. - ``GenericMap.world_to_pixel`` and ``GenericMap.pixel_to_world`` now accept and return ``SkyCoord`` objects only. - ``GenericMap`` has a new property ``observer_coordinate`` which returns a ``SkyCoord`` describing the position of the observer. - ``GenericMap.submap`` now takes arguments of the form ``bottom_left`` and ``top_right`` rather than ``range_a`` and ``range_b``. This change enables submap to properly handle rotated maps and take input in the form of ``SkyCoord`` objects. - When referring to physical coordinates ``Pair.x`` has been replaced with ``SpatialPair.axis1``. This means values returned by ``GenericMap`` now differentiate between physical and pixel coordinates. - The physical radius of the Sun (length units) is now passed from Map into the coordinate frame so a consistent value is used when calculating distance to the solar surface in the ``HelioprojectiveFrame`` coordinate frame. - A new ``sunpy.visualization.imageanimator.ImageAnimatorWCS`` class has been added to animate N-Dimensional data with the associated WCS object. - Moved Docs to docs/ to follow the astropy style - Added SunPy specific warnings under util. - SunPy coordinate frames can now be transformed to and from Astropy coordinate frames - The time attribute for SunPy coordinate frames has been renamed from ``dateobs`` to ``obstime`` - Ephemeris calculations with higher accuracy are now available under ``sunpy.coordinates.ephemeris`` - Add support for SunPy coordinates to specify observer as a string of a major solar-system body, with the default being Earth. To make transformations using an observer specified as a string, ``obstime`` must be set. - Added VSO query result block level caching in the database module. This prevents re-downloading of files which have already been downloaded. Especially helpful in case of overlapping queries. - Change the default representation for the Heliographic Carrington frame so Longitude follows the convention of going from 0-360 degrees. - All Clients that are able to search and download data now have a uniform API that is `search` and `fetch`. The older functions are still there but are deprecated for 0.8. Bug fixes --------- - Add tests for RHESSI instrument - Maps from Helioviewer JPEG2000 files now have correct image scaling. - Get and set methods for composite maps now use Map plot\_settings. - Simplified map names when plotting. - Fix bug in ``wcs.convert_data_to_pixel`` where crpix[1] was used for both axes. - Fix some leftover instances of ``GenericMap.units`` - Fixed bugs in ``sun`` equations - ``sunpy.io.fits.read`` will now return any parse-able HDUs even if some raise an error. - ``VSOClient`` no longer prints a lot of XML junk if the query fails. - Fix Map parsing of some header values to allow valid float strings like 'nan' and 'inf'. - Fix Map parsing of some header values to allow valid float strings like 'nan' and 'inf'. 0.7.8 ===== - The SunPy data directory "~/sunpy" is no longer created until it is used (issue #2018) - Change the default representation for the Heliographic Carrington frame so Longitude follows the convention of going from 0-360 degrees. - Fix for surface gravity unit. - Support for Pandas 0.20.1 0.7.7 ===== - Fix errors with Numpy 1.12 0.7.6 ===== - Add Astropy 1.3 Support 0.7.5 ===== - Fix test faliure (mapbase) with 1.7.4 - Restrict supported Astropy version to 1.0-1.3. - Update to ``TimeRange.__repr__``; now includes the qualified name and ``id`` of the object. - Change the default representation for the Heliographic Carrington frame so Longitude follows the convention of going from 0-360 degrees. - Fix Map parsing of some header values to allow valid float strings like 'nan' and 'inf'. 0.7.0 ===== - Fixed test failures with numpy developer version.[#1808] - Added ``timeout`` parameter in ``sunpy.data.download_sample_data()`` - Fixed ``aiaprep`` to return properly sized map. - Deprecation warnings fixed when using image coalignment. - Sunpy is now Python 3.x compatible (3.4 and 3.5). - Added a unit check and warnings for map metadata. - Added IRIS SJI color maps. - Updated ``show_colormaps()`` with new string filter to show a subset of color maps. - Fixed MapCube animations by working around a bug in Astropy's ImageNormalize - Remove ``vso.QueryResponse.num_records()`` in favour of ``len(qr)`` - Add a ``draw_rectangle`` helper to ``GenericMap`` which can plot rectangles in the native coordinate system of the map. - Added the ability to shift maps to correct for incorrect map location, for example. - Bug fix for RHESSI summary light curve values. - Mapcube solar derotation and coalignment now pass keywords to the routine used to shift the images, scipy.ndimage.interpolation.shift. - Add automatic registration of ``GenericMap`` subclasses with the factory as long as they define an ``is_datasource_for`` method. - Added functions ``flareclass_to_flux`` and ``flux_to_flareclass`` which convert between GOES flux to GOES class numbers (e.g. X12, M3.4). - Removed old ``sunpy.util.goes_flare_class()`` - Bug fix for RHESSI summary light curve values. - The ``MapCube.as_array`` function now returns a masked numpy array if at least one of the input maps in the MapCube has a mask. - Map superpixel method now respects maps that have masks. - Map superpixel method now accepts numpy functions as an argument, or any user-defined function. - Map superpixel method no longer has the restriction that the number of original pixels in the x (or y) side of the superpixel exactly divides the number of original pixels in the x (or y) side of the original map data. - ``sunpy.physics.transforms`` has been deprecated and the code moved into ``sunpy.physics``. - Add the ``sunpy.coordinates`` module, this adds the core physical solar coordinates frame within the astropy coordinates framework. - Added ability of maps to draw contours on top of themselves (``draw_contours``) - Added concatenate functionality to lightcurve base class. - Fix Map to allow astropy.io.fits Header objects as valid input for meta arguments. - Added an examples gallery using ``sphinx-gallery``. - API clean up to constants. Removed constant() function which is now replaced by get(). - Prevent helioviewer tests from checking access to the API endpoint when running tests offline. - ``GenericMap.units`` is renamed to ``GenericMap.spatial_units`` to avoid confusion with ``NDData.unit``. - ``GenericMap`` now has a ``coordinate_frame`` property which returns an ``astropy.coordinates`` frame with all the meta data from the map populated. - ``GenericMap`` now has a ``_mpl_axes`` method which allows it to be specified as a projection to ``matplotlib`` methods and will return a ``WCSAxes`` object with ``WCS`` projection. 0.6.5 ===== - The draw\_grid keyword of the peek method of Map now accepts booleans or astropy quantities. - Fix bug in ``wcs.convert_data_to_pixel`` where crpix[1] was used for both axes. - Fixed bugs in ``sun`` equations 0.6.4 ===== - Bug fix for rhessi summary lightcurve values. - Fix docstring for ``pixel_to_data`` and ``data_to_pixel``. - Fix the URL for the Helioviewer API. (This fixes Helioviewer.) - Fix the way ``reshape_image_to_4d_superpixel`` checks the dimension of the new image. - Fix Map to allow astropy.io.fits Header objects as valid input for meta arguments. - Prevent helioviewer tests from checking access to API when running tests in offline mode. 0.6.3 ===== - Change setup.py extras to install suds-jurko not suds. 0.6.2 ===== - Changed start of GOES 2 operational time range back to 1980-01-04 so data from 1980 can be read into GOESLightCurve object - Fix bug with numpy 1.10 - update astropy\_helpers - Added new sample data 0.6.1 ===== - Fixed MapCube animations by working around a bug in Astropy's ImageNormalize - Small fix to RTD builds for Affiliated packages - SunPy can now be installed without having to install Astropy first. - MapCubes processed with ``coalignment.apply_shifts`` now have correct metadata. - Multiple fixes for WCS transformations, especially with solar-x, solar-y CTYPE headers. 0.6.0 ===== - Enforced the use of Astropy Quantities through out most of SunPy. - Dropped Support for Python 2.6. - Remove old style string formatting and other 2.6 compatibility lines. - Added vso like querying feature to JSOC Client. - Refactor the JSOC client so that it follows the .query() .get() interface of VSOClient and UnifedDownloader. - Provide ``__str__`` and ``__repr__`` methods on vso ``QueryResponse`` deprecate ``.show()``. - Downloaded files now keep file extensions rather than replacing all periods with underscores. - Update to TimeRange API, removed t1 and t0, start and end are now read-only attributes. - Added ability to download level3 data for lyra Light Curve along with corresponding tests. - Added support for gzipped FITS files. - Add STEREO HI Map subclass and color maps. - Map.rotate() no longer crops any image data. - For accuracy, default Map.rotate() transformation is set to bi-quartic. - ``sunpy.image.transform.affine_transform`` now casts integer data to float64 and sets NaN values to 0 for all transformations except scikit-image rotation with order <- 3. - CD matrix now updated, if present, when Map pixel size is changed. - Removed now-redundant method for rotating IRIS maps since the functionality exists in Map.rotate() - Provide ``__str__`` and ``__repr__`` methods on vso ``QueryResponse`` deprecate ``.show()`` - SunPy colormaps are now registered with matplotlib on import of ``sunpy.cm`` - ``sunpy.cm.get_cmap`` no longer defaults to 'sdoaia94' - Added database url config setting to be setup by default as a sqlite database in the sunpy working directory - Added a few tests for the sunpy.roi module - Added capability for figure-based tests - Removed now-redundant method for rotating IRIS maps since the functionality exists in Map.rotate(). - SunPy colormaps are now registered with matplotlib on import of ``sunpy.cm``. - ``sunpy.cm.get_cmap`` no longer defaults to 'sdoaia94'. - Added database url config setting to be setup by default as a sqlite database in the sunpy working directory. - Added a few tests for the sunpy.roi module. - Refactored mapcube co-alignment functionality. - Removed sample data from distribution and added ability to download sample files - Changed start of GOES 2 operational time range back to 1980-01-04 so data from 1980 can be read into GOESLightCurve object - Require JSOC request data calls have an email address attached. - Calculation of the solar rotation of a point on the Sun as seen from Earth, and its application to the de-rotation of mapcubes. - Downloaded files now keep file extensions rather than replacing all periods with underscores - Fixed the downloading of files with duplicate names in sunpy.database - Removed sample data from distribution and added ability to download sample files. - Added the calculation of the solar rotation of a point on the Sun as seen from Earth, and its application to the de-rotation of mapcubes. - Changed default for GOESLightCurve.create() so that it gets the data from the most recent existing GOES fits file. - Map plot functionality now uses the mask property if it is present, allowing the plotting of masked map data - Map Expects Quantities and returns quantities for most parameters. - Map now used Astropy.wcs for world <-> pixel conversions. - map.world\_to\_pixel now has a similar API to map.pixel\_to\_world. - map.shape has been replaced with map.dimensions, which is ordered x first. - map.rsun\_arcseconds is now map.rsun\_obs as it returns a quantity. - Map properties are now named tuples rather than dictionaries. - Improvement for Map plots, standardization and improved color tables, better access to plot variables through new plot\_settings variable. - Huge improvements in Instrument Map doc strings. Now contain instrument descriptions as well as reference links for more info. - net.jsoc can query data series with time sampling by a Sample attribute implemented in vso. - MapCube.plot and MapCube.peek now support a user defined plot\_function argument for customising the animation. - Added new sample data file, an AIA cutout file. - Moved documentation build directory to doc/build 0.5.5 ===== - Changed default for GOESLightCurve.create() so that it gets the data from the most recent existing GOES fits file. - Improvements to the Map documentation. - Typo fixes in sunpy.wcs documentation. 0.5.4 ===== - ``sunpy.image.transform.affine_transform`` now casts integer data to float64 and sets NaN values to 0 for all transformations except scikit-image rotation with order <- 3. - Updated SWPC/NOAA links due to their new website. - Exposed the raw AIA color tables in ``sunpy.cm.color_tables``. - Fixes ``map`` compatibility with Astropy 1.0.x. 0.5.3 ===== - Goes peek() plot now works with matplotlib 1.4.x - The ANA file reading C extensions will no longer compile under windows. Windows was not a supported platform for these C extensions previously. 0.5.2 ===== - If no CROTA keyword is specified in Map meta data, it will now default to 0 as specified by the FITS WCS standard. - Map now correctly parses and converts the CD matrix, as long as CDELT is specified as well. (Fixes SWAP files) - Fix of HELIO webservice URLs - MapCube.plot() is now fixed and returns a matplotlib.animation.FuncAnimation object. 0.5.1 ===== - MAJOR FIX: map.rotate() now works correctly for all submaps and off center rotations. - HELIO URL updated, querys should now work as expected. - All tabs removed from the code base. - All tests now use tempfile rather than creating files in the current directory. - Documentation builds under newer sphinx versions. - ANA and JP2 tests are skipped if dependancies are missing. - ANA tests are skipped on windows. 0.5.0 ===== - Added additional functionality to the GOES module i.e. the ability to calculate GOES temperature and emission measure from GOES fluxes. - changed \_maps attribute in MapCube to a non-hidden type - Added Nobeyama Radioheliograph data support to Lightcurve object. - Fixed some tests on map method to support Windows - Added a window/split method to time range - Updates to spectrogram documentation - Added method Database.add\_from\_hek\_query\_result to HEK database - Added method Database.download\_from\_vso\_query\_result - GOES Lightcurve now makes use of a new source of GOES data, provides metadata, and data back to 1981. - Removed sqlalchemy as a requirement for SunPy - Added support for NOAA solar cycle prediction in lightcurves - Some basic tests for GenericLightCurve on types of expected input. - Fix algorithm in sunpy.sun.equation\_of\_center - Added Docstrings to LightCurve methods. - Added tests for classes in sunpy.map.sources. Note that some classes (TRACE, RHESSI) were left out because SunPy is not able to read their FITS files. - Added functions that implement image coalignment with support for MapCubes. - Cleaned up the sunpy namespace, removed .units, /ssw and .sphinx. Also moved .coords .physics.transforms. - Added contains functionality to TimeRange module - Added t-'now' to parse\_time to privide utcnow datetime. - Fixed time dependant functions (.sun) to default to t-'now' - Fixed solar\_semidiameter\_angular\_size - Improved line quality and performances issues with map.draw\_grid() - Remove deprecated make\_map command. 0.4.2 ===== - Fixes to the operational range of GOES satellites - Fix the URL for HELIO queries. 0.4.1 ===== - Fix map.rotate() functionality - Change of source for GOES data. - Fix EIT test data and sunpy FITS saving - Some documentation fixes - fix file paths to use os.path.join for platform independance. 0.4.0 ===== - **Major** documentation refactor. A far reaching re-write and restructure. - Add a SunPy Database to store and search local data. - Add beta support for querying the HELIO HEC - Add beta HEK to VSO query translation. - Add the ability to download the GOES event list. - Add support for downloading and querying the LYTAF database. - Add support for ANA data. - Updated sun.constants to use astropy.constants objects which include units, source, and error instide. For more info check out http://docs.astropy.org/en/latest/constants/index.html - Add some beta support for IRIS data products - Add a new MapCubeAnimator class with interactive widgets which is returned by mapcube.peek(). - The Glymur library is now used to read JPEG2000 files. - GOESLightCurve now supports all satellites. - Add support for VSO queries through proxies. - Fix apparent Right Ascension calulations. - LightCurve meta data member now an OrderedDict Instance 0.3.2 ===== - Pass draw\_limb arguments to patches.Circle - Pass graw\_grid arguments to pyplot.plot() - Fix README code example - Fix Documentation links in potting guide - Update to new EVE data URL - Update LogicalLightcurve example in docs - Improved InteractiveVSOClient documentation - GOESLightCurve now fails politely if no data is avalible. Known Bugs: - sunpy.util.unit\_conversion.to\_angstrom does not work if 'nm' is passed in. 0.3.1 ===== - Bug Fix: Fix a regression in CompositeMap that made contor plots fail. - Bug Fix: Allow Map() to accept dict as metadata. - Bug Fix: Pass arguments from Map() to io.read\_file. 0.3.0 ===== - Removal of Optional PIL dependancy - Parse\_time now looks through nested lists/tuples - Draw\_limb and draw\_grid are now implemented on MapCube and CompositeMap - Caculations for differential roation added - mapcube.plot() now runs a mpl animation with optional controls - A basic Region of Interest framework now exists under sunpy.roi - STEREO COR colour maps have been ported from solarsoft. - sunpy.time.timerange has a split() method that divides up a time range into n equal parts. - Added download progress bar - pyfits is depricated in favor of Astropy spectra: - Plotting has been refactorted to use a consistent interface - spectra now no-longer inherits from numpy.ndarray instead has a .data attribute. Map: \* map now no-longer inherits from numpy.ndarray instead has a .data attribute. \* make\_map is deprecated in favor of Map which is a new factory class \* sunpy.map.Map is now sunpy.map.GenericMap \* mymap.header is now mymap.meta \* attributes of the map class are now read only, changes have to be made through map.meta \* new MapMeta class to replace MapHeader, MapMeta is not returned by sunpy.io \* The groundwork for GenericMap inherting from astropy.NDData has been done, there is now a NDDataStandin class to provide basic functionality. io: \* top level file\_tools improved to be more flexible and support multiple HDUs \* all functions in sunpy.io now assume mutliple HDUs, even JP2 ones. \* there is now a way to override the automatic filetype detection \* Automatic fits file detection improved \* extract\_waveunit added to io.fits for detection of common ways of storing wavelength unit in fits files. - A major re-work of all interal imports has resulted in a much cleaner namespace, i.e. sunpy.util.util is no longer used to import util. - Some SOHO and STEREO files were not reading properly due to a date\_obs parameter. - Sunpy will now read JP2 files without a comment parameter. - Memory leak in Crotate patched - Callisto: Max gap between files removed 0.2.0 ===== - Completely re-written plotting routines for most of the core datatypes. - JPEG 2000 support as an input file type. - Improved documentation for much of the code base, including re-written installation instructions. - New lightcurve object - LYRA support - GOES/XRS support - SDO/EVE support - New Spectrum and Spectrogram object (in development) - Spectrogram plotting routines - Callisto spectrum type and support - STEREO/SWAVES support - Map Object - Added support for LASCO, Yohkoh/XRT maps - A new CompositeMap object for overlaying maps - Resample method - Superpixel method - The addition of the rotate() method for 2D maps. sunpy-0.8.3/README.md0000644000175000017500000000657713232563447014403 0ustar nabilnabil00000000000000# [SunPy](http://sunpy.org) [![Downloads](https://img.shields.io/pypi/dm/sunpy.svg)](https://pypi.python.org/pypi/sunpy/) [![Latest Version](https://img.shields.io/pypi/v/sunpy.svg)](https://pypi.python.org/pypi/sunpy/) [![Build Status](https://secure.travis-ci.org/sunpy/sunpy.svg)](http://travis-ci.org/sunpy/sunpy) [![Build status](https://ci.appveyor.com/api/projects/status/xow461iejsjvp9vl?svg=true)](https://ci.appveyor.com/project/sunpy/sunpy) [![Coverage Status](https://coveralls.io/repos/sunpy/sunpy/badge.svg?branch=master)](https://coveralls.io/r/sunpy/sunpy?branch=master) [![Research software impact](http://depsy.org/api/package/pypi/sunpy/badge.svg)](http://depsy.org/package/python/sunpy) [![DOI](https://zenodo.org/badge/2165383.svg)](https://zenodo.org/badge/latestdoi/2165383) [![Powered by NumFOCUS](https://img.shields.io/badge/powered%20by-NumFOCUS-orange.svg?style=flat&colorA=E1523D&colorB=007D8A)](http://numfocus.org) SunPy is an open-source Python library for solar physics data analysis. See [sunpy.org](http://sunpy.org) for more information about the project. For some examples of using SunPy see our [gallery](http://docs.sunpy.org/en/stable/generated/gallery/index.html). Installation ------------ The recommended way to install SunPy is with [conda](https://www.continuum.io/downloads). To install SunPy once conda is installed run the following two commands: $ conda config --append channels conda-forge $ conda install sunpy If you want to develop SunPy you will need to install from git. The best way to do this is to create a new conda environment and install the git version of SunPy in it: $ conda config --append channels conda-forge $ conda create -n sunpy-dev python sunpy hypothesis pytest-mock $ source activate sunpy-dev $ conda remove sunpy $ git clone https://github.com/sunpy/sunpy.git sunpy-git $ cd sunpy-git $ pip install -e . For detailed installation instructions, see the [installation guide](http://docs.sunpy.org/en/latest/guide/installation/index.html) in the SunPy docs. Usage ----- Here is a quick example of plotting an AIA image: ```python >>> import sunpy.map >>> from sunpy.data.sample import AIA_171_IMAGE >>> aia = sunpy.map.Map(AIA_171_IMAGE) >>> aia.peek() ``` Getting Help ------------ For more information or to ask questions about SunPy, check out: * [SunPy Documentation](http://docs.sunpy.org/en/latest/) * [SunPy Mailing List](https://groups.google.com/forum/#!forum/sunpy) * [SunPy Matrix Channel](https://riot.im/app/#/room/#sunpy:matrix.org) Contributing ------------ If you would like to get involved, start by joining the [SunPy mailing list](https://groups.google.com/forum/#!forum/sunpy) and check out the [Developer's Guide](http://docs.sunpy.org/en/latest/dev_guide/index.html) section of the SunPy docs. Stop by our chat room [#sunpy:matrix.org](https://riot.im/app/#/room/#sunpy:matrix.org) if you have any questions. Help is always welcome so let us know what you like to work on, or check out the [issues page](https://github.com/sunpy/sunpy/issues) for the list of known outstanding items. For more information on contributing to SunPy, please read our [contributing guide](https://github.com/sunpy/sunpy/blob/master/CONTRIBUTING.md). ### Code of Conduct When you are interacting with the SunPy community you are asked to follow our [Code of Conduct](https://github.com/sunpy/sunpy/wiki/Code-of-Conduct). sunpy-0.8.3/RELEASE.md0000644000175000017500000000376013231613137014504 0ustar nabilnabil00000000000000The SunPy project is happy to announce the release of SunPy 0.8.0. SunPy 0.8 is the next major release of SunPy and contains 1442 commits in over 200 pull requests, closing 163 issues from 35 people, 17 of whom have never contributed before. This release is a large milestone for the SunPy library. It contains large new features that have been in development for a number of years, and will form the foundation of SunPy for the future. The main additions are `sunpy.net.Fido` and `sunpy.timeseries`, as well as major upgrades to `sunpy.coordinates`. Along with this it deprecates some old parts of SunPy that have been rewritten, two submodules `sunpy.lightcurve` and `sunpy.wcs` have been superseded by `sunpy.timeseries` and `sunpy.coordinates` respectively. The people who have contributed to the code for this release are: Stuart Mumford Jack Ireland Nabil Freij Punyaslok Pattnaik Alex Hamilton Ankit Kumar * David Pérez-Suárez Steven Christe Rishabh Sharma Albert Y. Shih Sudarshan Konge Daniel Ryan Ankit Baruah * Brigitta Sipocz Prateek Chanda * Andrew Leonard Sanskar Modi Nitin Choudhary * Agneet Chatterjee * Michael Charlton * Rajul Srivastava Dhruv Goel * Garrison Taylor * Serge Zahniy * Andrew Inglis Ankit Joe Letts * Shane Maloney * Adrian Price-Whelan * Dan D'Avella * Duygu Keşkek * Fionnlagh Mackenzie Dover * Kalpesh Krishna * Kaustubh Hiware * Larry Manley Where an * indicates their first contribution. In addition to the code contributions I would like to highlight the work of Nabil Freij who has done a lot of work in the last few months releasing bug fixes for the 0.7 series as well as a lot of behind the scenes work on SunPy's tooling. I would also like to thank Duygu Keşkek who has redesigned the sunpy.org page and the documentation as part of her GSOC project. Finally, I would like to welcome Monica Bobra and Sabrina Savage to the SunPy Board. sunpy-0.8.3/ah_bootstrap.py0000644000175000017500000010434413231613137016141 0ustar nabilnabil00000000000000""" This bootstrap module contains code for ensuring that the astropy_helpers package will be importable by the time the setup.py script runs. It also includes some workarounds to ensure that a recent-enough version of setuptools is being used for the installation. This module should be the first thing imported in the setup.py of distributions that make use of the utilities in astropy_helpers. If the distribution ships with its own copy of astropy_helpers, this module will first attempt to import from the shipped copy. However, it will also check PyPI to see if there are any bug-fix releases on top of the current version that may be useful to get past platform-specific bugs that have been fixed. When running setup.py, use the ``--offline`` command-line option to disable the auto-upgrade checks. When this module is imported or otherwise executed it automatically calls a main function that attempts to read the project's setup.cfg file, which it checks for a configuration section called ``[ah_bootstrap]`` the presences of that section, and options therein, determine the next step taken: If it contains an option called ``auto_use`` with a value of ``True``, it will automatically call the main function of this module called `use_astropy_helpers` (see that function's docstring for full details). Otherwise no further action is taken (however, ``ah_bootstrap.use_astropy_helpers`` may be called manually from within the setup.py script). Additional options in the ``[ah_boostrap]`` section of setup.cfg have the same names as the arguments to `use_astropy_helpers`, and can be used to configure the bootstrap script when ``auto_use = True``. See https://github.com/astropy/astropy-helpers for more details, and for the latest version of this module. """ import contextlib import errno import imp import io import locale import os import re import subprocess as sp import sys try: from ConfigParser import ConfigParser, RawConfigParser except ImportError: from configparser import ConfigParser, RawConfigParser if sys.version_info[0] < 3: _str_types = (str, unicode) _text_type = unicode PY3 = False else: _str_types = (str, bytes) _text_type = str PY3 = True # What follows are several import statements meant to deal with install-time # issues with either missing or misbehaving pacakges (including making sure # setuptools itself is installed): # Some pre-setuptools checks to ensure that either distribute or setuptools >= # 0.7 is used (over pre-distribute setuptools) if it is available on the path; # otherwise the latest setuptools will be downloaded and bootstrapped with # ``ez_setup.py``. This used to be included in a separate file called # setuptools_bootstrap.py; but it was combined into ah_bootstrap.py try: import pkg_resources _setuptools_req = pkg_resources.Requirement.parse('setuptools>=0.7') # This may raise a DistributionNotFound in which case no version of # setuptools or distribute is properly installed _setuptools = pkg_resources.get_distribution('setuptools') if _setuptools not in _setuptools_req: # Older version of setuptools; check if we have distribute; again if # this results in DistributionNotFound we want to give up _distribute = pkg_resources.get_distribution('distribute') if _setuptools != _distribute: # It's possible on some pathological systems to have an old version # of setuptools and distribute on sys.path simultaneously; make # sure distribute is the one that's used sys.path.insert(1, _distribute.location) _distribute.activate() imp.reload(pkg_resources) except: # There are several types of exceptions that can occur here; if all else # fails bootstrap and use the bootstrapped version from ez_setup import use_setuptools use_setuptools() # typing as a dependency for 1.6.1+ Sphinx causes issues when imported after # initializing submodule with ah_boostrap.py # See discussion and references in # https://github.com/astropy/astropy-helpers/issues/302 try: import typing # noqa except ImportError: pass # Note: The following import is required as a workaround to # https://github.com/astropy/astropy-helpers/issues/89; if we don't import this # module now, it will get cleaned up after `run_setup` is called, but that will # later cause the TemporaryDirectory class defined in it to stop working when # used later on by setuptools try: import setuptools.py31compat # noqa except ImportError: pass # matplotlib can cause problems if it is imported from within a call of # run_setup(), because in some circumstances it will try to write to the user's # home directory, resulting in a SandboxViolation. See # https://github.com/matplotlib/matplotlib/pull/4165 # Making sure matplotlib, if it is available, is imported early in the setup # process can mitigate this (note importing matplotlib.pyplot has the same # issue) try: import matplotlib matplotlib.use('Agg') import matplotlib.pyplot except: # Ignore if this fails for *any* reason* pass # End compatibility imports... # In case it didn't successfully import before the ez_setup checks import pkg_resources from setuptools import Distribution from setuptools.package_index import PackageIndex from setuptools.sandbox import run_setup from distutils import log from distutils.debug import DEBUG # TODO: Maybe enable checking for a specific version of astropy_helpers? DIST_NAME = 'astropy-helpers' PACKAGE_NAME = 'astropy_helpers' # Defaults for other options DOWNLOAD_IF_NEEDED = True INDEX_URL = 'https://pypi.python.org/simple' USE_GIT = True OFFLINE = False AUTO_UPGRADE = True # A list of all the configuration options and their required types CFG_OPTIONS = [ ('auto_use', bool), ('path', str), ('download_if_needed', bool), ('index_url', str), ('use_git', bool), ('offline', bool), ('auto_upgrade', bool) ] class _Bootstrapper(object): """ Bootstrapper implementation. See ``use_astropy_helpers`` for parameter documentation. """ def __init__(self, path=None, index_url=None, use_git=None, offline=None, download_if_needed=None, auto_upgrade=None): if path is None: path = PACKAGE_NAME if not (isinstance(path, _str_types) or path is False): raise TypeError('path must be a string or False') if PY3 and not isinstance(path, _text_type): fs_encoding = sys.getfilesystemencoding() path = path.decode(fs_encoding) # path to unicode self.path = path # Set other option attributes, using defaults where necessary self.index_url = index_url if index_url is not None else INDEX_URL self.offline = offline if offline is not None else OFFLINE # If offline=True, override download and auto-upgrade if self.offline: download_if_needed = False auto_upgrade = False self.download = (download_if_needed if download_if_needed is not None else DOWNLOAD_IF_NEEDED) self.auto_upgrade = (auto_upgrade if auto_upgrade is not None else AUTO_UPGRADE) # If this is a release then the .git directory will not exist so we # should not use git. git_dir_exists = os.path.exists(os.path.join(os.path.dirname(__file__), '.git')) if use_git is None and not git_dir_exists: use_git = False self.use_git = use_git if use_git is not None else USE_GIT # Declared as False by default--later we check if astropy-helpers can be # upgraded from PyPI, but only if not using a source distribution (as in # the case of import from a git submodule) self.is_submodule = False @classmethod def main(cls, argv=None): if argv is None: argv = sys.argv config = cls.parse_config() config.update(cls.parse_command_line(argv)) auto_use = config.pop('auto_use', False) bootstrapper = cls(**config) if auto_use: # Run the bootstrapper, otherwise the setup.py is using the old # use_astropy_helpers() interface, in which case it will run the # bootstrapper manually after reconfiguring it. bootstrapper.run() return bootstrapper @classmethod def parse_config(cls): if not os.path.exists('setup.cfg'): return {} cfg = ConfigParser() try: cfg.read('setup.cfg') except Exception as e: if DEBUG: raise log.error( "Error reading setup.cfg: {0!r}\n{1} will not be " "automatically bootstrapped and package installation may fail." "\n{2}".format(e, PACKAGE_NAME, _err_help_msg)) return {} if not cfg.has_section('ah_bootstrap'): return {} config = {} for option, type_ in CFG_OPTIONS: if not cfg.has_option('ah_bootstrap', option): continue if type_ is bool: value = cfg.getboolean('ah_bootstrap', option) else: value = cfg.get('ah_bootstrap', option) config[option] = value return config @classmethod def parse_command_line(cls, argv=None): if argv is None: argv = sys.argv config = {} # For now we just pop recognized ah_bootstrap options out of the # arg list. This is imperfect; in the unlikely case that a setup.py # custom command or even custom Distribution class defines an argument # of the same name then we will break that. However there's a catch22 # here that we can't just do full argument parsing right here, because # we don't yet know *how* to parse all possible command-line arguments. if '--no-git' in argv: config['use_git'] = False argv.remove('--no-git') if '--offline' in argv: config['offline'] = True argv.remove('--offline') return config def run(self): strategies = ['local_directory', 'local_file', 'index'] dist = None # First, remove any previously imported versions of astropy_helpers; # this is necessary for nested installs where one package's installer # is installing another package via setuptools.sandbox.run_setup, as in # the case of setup_requires for key in list(sys.modules): try: if key == PACKAGE_NAME or key.startswith(PACKAGE_NAME + '.'): del sys.modules[key] except AttributeError: # Sometimes mysterious non-string things can turn up in # sys.modules continue # Check to see if the path is a submodule self.is_submodule = self._check_submodule() for strategy in strategies: method = getattr(self, 'get_{0}_dist'.format(strategy)) dist = method() if dist is not None: break else: raise _AHBootstrapSystemExit( "No source found for the {0!r} package; {0} must be " "available and importable as a prerequisite to building " "or installing this package.".format(PACKAGE_NAME)) # This is a bit hacky, but if astropy_helpers was loaded from a # directory/submodule its Distribution object gets a "precedence" of # "DEVELOP_DIST". However, in other cases it gets a precedence of # "EGG_DIST". However, when activing the distribution it will only be # placed early on sys.path if it is treated as an EGG_DIST, so always # do that dist = dist.clone(precedence=pkg_resources.EGG_DIST) # Otherwise we found a version of astropy-helpers, so we're done # Just active the found distribution on sys.path--if we did a # download this usually happens automatically but it doesn't hurt to # do it again # Note: Adding the dist to the global working set also activates it # (makes it importable on sys.path) by default. try: pkg_resources.working_set.add(dist, replace=True) except TypeError: # Some (much) older versions of setuptools do not have the # replace=True option here. These versions are old enough that all # bets may be off anyways, but it's easy enough to work around just # in case... if dist.key in pkg_resources.working_set.by_key: del pkg_resources.working_set.by_key[dist.key] pkg_resources.working_set.add(dist) @property def config(self): """ A `dict` containing the options this `_Bootstrapper` was configured with. """ return dict((optname, getattr(self, optname)) for optname, _ in CFG_OPTIONS if hasattr(self, optname)) def get_local_directory_dist(self): """ Handle importing a vendored package from a subdirectory of the source distribution. """ if not os.path.isdir(self.path): return log.info('Attempting to import astropy_helpers from {0} {1!r}'.format( 'submodule' if self.is_submodule else 'directory', self.path)) dist = self._directory_import() if dist is None: log.warn( 'The requested path {0!r} for importing {1} does not ' 'exist, or does not contain a copy of the {1} ' 'package.'.format(self.path, PACKAGE_NAME)) elif self.auto_upgrade and not self.is_submodule: # A version of astropy-helpers was found on the available path, but # check to see if a bugfix release is available on PyPI upgrade = self._do_upgrade(dist) if upgrade is not None: dist = upgrade return dist def get_local_file_dist(self): """ Handle importing from a source archive; this also uses setup_requires but points easy_install directly to the source archive. """ if not os.path.isfile(self.path): return log.info('Attempting to unpack and import astropy_helpers from ' '{0!r}'.format(self.path)) try: dist = self._do_download(find_links=[self.path]) except Exception as e: if DEBUG: raise log.warn( 'Failed to import {0} from the specified archive {1!r}: ' '{2}'.format(PACKAGE_NAME, self.path, str(e))) dist = None if dist is not None and self.auto_upgrade: # A version of astropy-helpers was found on the available path, but # check to see if a bugfix release is available on PyPI upgrade = self._do_upgrade(dist) if upgrade is not None: dist = upgrade return dist def get_index_dist(self): if not self.download: log.warn('Downloading {0!r} disabled.'.format(DIST_NAME)) return None log.warn( "Downloading {0!r}; run setup.py with the --offline option to " "force offline installation.".format(DIST_NAME)) try: dist = self._do_download() except Exception as e: if DEBUG: raise log.warn( 'Failed to download and/or install {0!r} from {1!r}:\n' '{2}'.format(DIST_NAME, self.index_url, str(e))) dist = None # No need to run auto-upgrade here since we've already presumably # gotten the most up-to-date version from the package index return dist def _directory_import(self): """ Import astropy_helpers from the given path, which will be added to sys.path. Must return True if the import succeeded, and False otherwise. """ # Return True on success, False on failure but download is allowed, and # otherwise raise SystemExit path = os.path.abspath(self.path) # Use an empty WorkingSet rather than the man # pkg_resources.working_set, since on older versions of setuptools this # will invoke a VersionConflict when trying to install an upgrade ws = pkg_resources.WorkingSet([]) ws.add_entry(path) dist = ws.by_key.get(DIST_NAME) if dist is None: # We didn't find an egg-info/dist-info in the given path, but if a # setup.py exists we can generate it setup_py = os.path.join(path, 'setup.py') if os.path.isfile(setup_py): with _silence(): run_setup(os.path.join(path, 'setup.py'), ['egg_info']) for dist in pkg_resources.find_distributions(path, True): # There should be only one... return dist return dist def _do_download(self, version='', find_links=None): if find_links: allow_hosts = '' index_url = None else: allow_hosts = None index_url = self.index_url # Annoyingly, setuptools will not handle other arguments to # Distribution (such as options) before handling setup_requires, so it # is not straightforward to programmatically augment the arguments which # are passed to easy_install class _Distribution(Distribution): def get_option_dict(self, command_name): opts = Distribution.get_option_dict(self, command_name) if command_name == 'easy_install': if find_links is not None: opts['find_links'] = ('setup script', find_links) if index_url is not None: opts['index_url'] = ('setup script', index_url) if allow_hosts is not None: opts['allow_hosts'] = ('setup script', allow_hosts) return opts if version: req = '{0}=={1}'.format(DIST_NAME, version) else: req = DIST_NAME attrs = {'setup_requires': [req]} try: if DEBUG: _Distribution(attrs=attrs) else: with _silence(): _Distribution(attrs=attrs) # If the setup_requires succeeded it will have added the new dist to # the main working_set return pkg_resources.working_set.by_key.get(DIST_NAME) except Exception as e: if DEBUG: raise msg = 'Error retrieving {0} from {1}:\n{2}' if find_links: source = find_links[0] elif index_url != INDEX_URL: source = index_url else: source = 'PyPI' raise Exception(msg.format(DIST_NAME, source, repr(e))) def _do_upgrade(self, dist): # Build up a requirement for a higher bugfix release but a lower minor # release (so API compatibility is guaranteed) next_version = _next_version(dist.parsed_version) req = pkg_resources.Requirement.parse( '{0}>{1},<{2}'.format(DIST_NAME, dist.version, next_version)) package_index = PackageIndex(index_url=self.index_url) upgrade = package_index.obtain(req) if upgrade is not None: return self._do_download(version=upgrade.version) def _check_submodule(self): """ Check if the given path is a git submodule. See the docstrings for ``_check_submodule_using_git`` and ``_check_submodule_no_git`` for further details. """ if (self.path is None or (os.path.exists(self.path) and not os.path.isdir(self.path))): return False if self.use_git: return self._check_submodule_using_git() else: return self._check_submodule_no_git() def _check_submodule_using_git(self): """ Check if the given path is a git submodule. If so, attempt to initialize and/or update the submodule if needed. This function makes calls to the ``git`` command in subprocesses. The ``_check_submodule_no_git`` option uses pure Python to check if the given path looks like a git submodule, but it cannot perform updates. """ cmd = ['git', 'submodule', 'status', '--', self.path] try: log.info('Running `{0}`; use the --no-git option to disable git ' 'commands'.format(' '.join(cmd))) returncode, stdout, stderr = run_cmd(cmd) except _CommandNotFound: # The git command simply wasn't found; this is most likely the # case on user systems that don't have git and are simply # trying to install the package from PyPI or a source # distribution. Silently ignore this case and simply don't try # to use submodules return False stderr = stderr.strip() if returncode != 0 and stderr: # Unfortunately the return code alone cannot be relied on, as # earlier versions of git returned 0 even if the requested submodule # does not exist # This is a warning that occurs in perl (from running git submodule) # which only occurs with a malformatted locale setting which can # happen sometimes on OSX. See again # https://github.com/astropy/astropy/issues/2749 perl_warning = ('perl: warning: Falling back to the standard locale ' '("C").') if not stderr.strip().endswith(perl_warning): # Some other unknown error condition occurred log.warn('git submodule command failed ' 'unexpectedly:\n{0}'.format(stderr)) return False # Output of `git submodule status` is as follows: # # 1: Status indicator: '-' for submodule is uninitialized, '+' if # submodule is initialized but is not at the commit currently indicated # in .gitmodules (and thus needs to be updated), or 'U' if the # submodule is in an unstable state (i.e. has merge conflicts) # # 2. SHA-1 hash of the current commit of the submodule (we don't really # need this information but it's useful for checking that the output is # correct) # # 3. The output of `git describe` for the submodule's current commit # hash (this includes for example what branches the commit is on) but # only if the submodule is initialized. We ignore this information for # now _git_submodule_status_re = re.compile( '^(?P[+-U ])(?P[0-9a-f]{40}) ' '(?P\S+)( .*)?$') # The stdout should only contain one line--the status of the # requested submodule m = _git_submodule_status_re.match(stdout) if m: # Yes, the path *is* a git submodule self._update_submodule(m.group('submodule'), m.group('status')) return True else: log.warn( 'Unexpected output from `git submodule status`:\n{0}\n' 'Will attempt import from {1!r} regardless.'.format( stdout, self.path)) return False def _check_submodule_no_git(self): """ Like ``_check_submodule_using_git``, but simply parses the .gitmodules file to determine if the supplied path is a git submodule, and does not exec any subprocesses. This can only determine if a path is a submodule--it does not perform updates, etc. This function may need to be updated if the format of the .gitmodules file is changed between git versions. """ gitmodules_path = os.path.abspath('.gitmodules') if not os.path.isfile(gitmodules_path): return False # This is a minimal reader for gitconfig-style files. It handles a few of # the quirks that make gitconfig files incompatible with ConfigParser-style # files, but does not support the full gitconfig syntax (just enough # needed to read a .gitmodules file). gitmodules_fileobj = io.StringIO() # Must use io.open for cross-Python-compatible behavior wrt unicode with io.open(gitmodules_path) as f: for line in f: # gitconfig files are more flexible with leading whitespace; just # go ahead and remove it line = line.lstrip() # comments can start with either # or ; if line and line[0] in (':', ';'): continue gitmodules_fileobj.write(line) gitmodules_fileobj.seek(0) cfg = RawConfigParser() try: cfg.readfp(gitmodules_fileobj) except Exception as exc: log.warn('Malformatted .gitmodules file: {0}\n' '{1} cannot be assumed to be a git submodule.'.format( exc, self.path)) return False for section in cfg.sections(): if not cfg.has_option(section, 'path'): continue submodule_path = cfg.get(section, 'path').rstrip(os.sep) if submodule_path == self.path.rstrip(os.sep): return True return False def _update_submodule(self, submodule, status): if status == ' ': # The submodule is up to date; no action necessary return elif status == '-': if self.offline: raise _AHBootstrapSystemExit( "Cannot initialize the {0} submodule in --offline mode; " "this requires being able to clone the submodule from an " "online repository.".format(submodule)) cmd = ['update', '--init'] action = 'Initializing' elif status == '+': cmd = ['update'] action = 'Updating' if self.offline: cmd.append('--no-fetch') elif status == 'U': raise _AHBootstrapSystemExit( 'Error: Submodule {0} contains unresolved merge conflicts. ' 'Please complete or abandon any changes in the submodule so that ' 'it is in a usable state, then try again.'.format(submodule)) else: log.warn('Unknown status {0!r} for git submodule {1!r}. Will ' 'attempt to use the submodule as-is, but try to ensure ' 'that the submodule is in a clean state and contains no ' 'conflicts or errors.\n{2}'.format(status, submodule, _err_help_msg)) return err_msg = None cmd = ['git', 'submodule'] + cmd + ['--', submodule] log.warn('{0} {1} submodule with: `{2}`'.format( action, submodule, ' '.join(cmd))) try: log.info('Running `{0}`; use the --no-git option to disable git ' 'commands'.format(' '.join(cmd))) returncode, stdout, stderr = run_cmd(cmd) except OSError as e: err_msg = str(e) else: if returncode != 0: err_msg = stderr if err_msg is not None: log.warn('An unexpected error occurred updating the git submodule ' '{0!r}:\n{1}\n{2}'.format(submodule, err_msg, _err_help_msg)) class _CommandNotFound(OSError): """ An exception raised when a command run with run_cmd is not found on the system. """ def run_cmd(cmd): """ Run a command in a subprocess, given as a list of command-line arguments. Returns a ``(returncode, stdout, stderr)`` tuple. """ try: p = sp.Popen(cmd, stdout=sp.PIPE, stderr=sp.PIPE) # XXX: May block if either stdout or stderr fill their buffers; # however for the commands this is currently used for that is # unlikely (they should have very brief output) stdout, stderr = p.communicate() except OSError as e: if DEBUG: raise if e.errno == errno.ENOENT: msg = 'Command not found: `{0}`'.format(' '.join(cmd)) raise _CommandNotFound(msg, cmd) else: raise _AHBootstrapSystemExit( 'An unexpected error occurred when running the ' '`{0}` command:\n{1}'.format(' '.join(cmd), str(e))) # Can fail of the default locale is not configured properly. See # https://github.com/astropy/astropy/issues/2749. For the purposes under # consideration 'latin1' is an acceptable fallback. try: stdio_encoding = locale.getdefaultlocale()[1] or 'latin1' except ValueError: # Due to an OSX oddity locale.getdefaultlocale() can also crash # depending on the user's locale/language settings. See: # http://bugs.python.org/issue18378 stdio_encoding = 'latin1' # Unlikely to fail at this point but even then let's be flexible if not isinstance(stdout, _text_type): stdout = stdout.decode(stdio_encoding, 'replace') if not isinstance(stderr, _text_type): stderr = stderr.decode(stdio_encoding, 'replace') return (p.returncode, stdout, stderr) def _next_version(version): """ Given a parsed version from pkg_resources.parse_version, returns a new version string with the next minor version. Examples ======== >>> _next_version(pkg_resources.parse_version('1.2.3')) '1.3.0' """ if hasattr(version, 'base_version'): # New version parsing from setuptools >= 8.0 if version.base_version: parts = version.base_version.split('.') else: parts = [] else: parts = [] for part in version: if part.startswith('*'): break parts.append(part) parts = [int(p) for p in parts] if len(parts) < 3: parts += [0] * (3 - len(parts)) major, minor, micro = parts[:3] return '{0}.{1}.{2}'.format(major, minor + 1, 0) class _DummyFile(object): """A noop writeable object.""" errors = '' # Required for Python 3.x encoding = 'utf-8' def write(self, s): pass def flush(self): pass @contextlib.contextmanager def _silence(): """A context manager that silences sys.stdout and sys.stderr.""" old_stdout = sys.stdout old_stderr = sys.stderr sys.stdout = _DummyFile() sys.stderr = _DummyFile() exception_occurred = False try: yield except: exception_occurred = True # Go ahead and clean up so that exception handling can work normally sys.stdout = old_stdout sys.stderr = old_stderr raise if not exception_occurred: sys.stdout = old_stdout sys.stderr = old_stderr _err_help_msg = """ If the problem persists consider installing astropy_helpers manually using pip (`pip install astropy_helpers`) or by manually downloading the source archive, extracting it, and installing by running `python setup.py install` from the root of the extracted source code. """ class _AHBootstrapSystemExit(SystemExit): def __init__(self, *args): if not args: msg = 'An unknown problem occurred bootstrapping astropy_helpers.' else: msg = args[0] msg += '\n' + _err_help_msg super(_AHBootstrapSystemExit, self).__init__(msg, *args[1:]) BOOTSTRAPPER = _Bootstrapper.main() def use_astropy_helpers(**kwargs): """ Ensure that the `astropy_helpers` module is available and is importable. This supports automatic submodule initialization if astropy_helpers is included in a project as a git submodule, or will download it from PyPI if necessary. Parameters ---------- path : str or None, optional A filesystem path relative to the root of the project's source code that should be added to `sys.path` so that `astropy_helpers` can be imported from that path. If the path is a git submodule it will automatically be initialized and/or updated. The path may also be to a ``.tar.gz`` archive of the astropy_helpers source distribution. In this case the archive is automatically unpacked and made temporarily available on `sys.path` as a ``.egg`` archive. If `None` skip straight to downloading. download_if_needed : bool, optional If the provided filesystem path is not found an attempt will be made to download astropy_helpers from PyPI. It will then be made temporarily available on `sys.path` as a ``.egg`` archive (using the ``setup_requires`` feature of setuptools. If the ``--offline`` option is given at the command line the value of this argument is overridden to `False`. index_url : str, optional If provided, use a different URL for the Python package index than the main PyPI server. use_git : bool, optional If `False` no git commands will be used--this effectively disables support for git submodules. If the ``--no-git`` option is given at the command line the value of this argument is overridden to `False`. auto_upgrade : bool, optional By default, when installing a package from a non-development source distribution ah_boostrap will try to automatically check for patch releases to astropy-helpers on PyPI and use the patched version over any bundled versions. Setting this to `False` will disable that functionality. If the ``--offline`` option is given at the command line the value of this argument is overridden to `False`. offline : bool, optional If `False` disable all actions that require an internet connection, including downloading packages from the package index and fetching updates to any git submodule. Defaults to `True`. """ global BOOTSTRAPPER config = BOOTSTRAPPER.config config.update(**kwargs) # Create a new bootstrapper with the updated configuration and run it BOOTSTRAPPER = _Bootstrapper(**config) BOOTSTRAPPER.run() sunpy-0.8.3/ez_setup.py0000644000175000017500000003037113231613137015310 0ustar nabilnabil00000000000000#!/usr/bin/env python """ Setuptools bootstrapping installer. Maintained at https://github.com/pypa/setuptools/tree/bootstrap. Run this script to install or upgrade setuptools. This method is DEPRECATED. Check https://github.com/pypa/setuptools/issues/581 for more details. """ import os import shutil import sys import tempfile import zipfile import optparse import subprocess import platform import textwrap import contextlib from distutils import log try: from urllib.request import urlopen except ImportError: from urllib2 import urlopen try: from site import USER_SITE except ImportError: USER_SITE = None # 33.1.1 is the last version that supports setuptools self upgrade/installation. DEFAULT_VERSION = "33.1.1" DEFAULT_URL = "https://pypi.io/packages/source/s/setuptools/" DEFAULT_SAVE_DIR = os.curdir DEFAULT_DEPRECATION_MESSAGE = "ez_setup.py is deprecated and when using it setuptools will be pinned to {0} since it's the last version that supports setuptools self upgrade/installation, check https://github.com/pypa/setuptools/issues/581 for more info; use pip to install setuptools" MEANINGFUL_INVALID_ZIP_ERR_MSG = 'Maybe {0} is corrupted, delete it and try again.' log.warn(DEFAULT_DEPRECATION_MESSAGE.format(DEFAULT_VERSION)) def _python_cmd(*args): """ Execute a command. Return True if the command succeeded. """ args = (sys.executable,) + args return subprocess.call(args) == 0 def _install(archive_filename, install_args=()): """Install Setuptools.""" with archive_context(archive_filename): # installing log.warn('Installing Setuptools') if not _python_cmd('setup.py', 'install', *install_args): log.warn('Something went wrong during the installation.') log.warn('See the error message above.') # exitcode will be 2 return 2 def _build_egg(egg, archive_filename, to_dir): """Build Setuptools egg.""" with archive_context(archive_filename): # building an egg log.warn('Building a Setuptools egg in %s', to_dir) _python_cmd('setup.py', '-q', 'bdist_egg', '--dist-dir', to_dir) # returning the result log.warn(egg) if not os.path.exists(egg): raise IOError('Could not build the egg.') class ContextualZipFile(zipfile.ZipFile): """Supplement ZipFile class to support context manager for Python 2.6.""" def __enter__(self): return self def __exit__(self, type, value, traceback): self.close() def __new__(cls, *args, **kwargs): """Construct a ZipFile or ContextualZipFile as appropriate.""" if hasattr(zipfile.ZipFile, '__exit__'): return zipfile.ZipFile(*args, **kwargs) return super(ContextualZipFile, cls).__new__(cls) @contextlib.contextmanager def archive_context(filename): """ Unzip filename to a temporary directory, set to the cwd. The unzipped target is cleaned up after. """ tmpdir = tempfile.mkdtemp() log.warn('Extracting in %s', tmpdir) old_wd = os.getcwd() try: os.chdir(tmpdir) try: with ContextualZipFile(filename) as archive: archive.extractall() except zipfile.BadZipfile as err: if not err.args: err.args = ('', ) err.args = err.args + ( MEANINGFUL_INVALID_ZIP_ERR_MSG.format(filename), ) raise # going in the directory subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0]) os.chdir(subdir) log.warn('Now working in %s', subdir) yield finally: os.chdir(old_wd) shutil.rmtree(tmpdir) def _do_download(version, download_base, to_dir, download_delay): """Download Setuptools.""" py_desig = 'py{sys.version_info[0]}.{sys.version_info[1]}'.format(sys=sys) tp = 'setuptools-{version}-{py_desig}.egg' egg = os.path.join(to_dir, tp.format(**locals())) if not os.path.exists(egg): archive = download_setuptools(version, download_base, to_dir, download_delay) _build_egg(egg, archive, to_dir) sys.path.insert(0, egg) # Remove previously-imported pkg_resources if present (see # https://bitbucket.org/pypa/setuptools/pull-request/7/ for details). if 'pkg_resources' in sys.modules: _unload_pkg_resources() import setuptools setuptools.bootstrap_install_from = egg def use_setuptools( version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=DEFAULT_SAVE_DIR, download_delay=15): """ Ensure that a setuptools version is installed. Return None. Raise SystemExit if the requested version or later cannot be installed. """ to_dir = os.path.abspath(to_dir) # prior to importing, capture the module state for # representative modules. rep_modules = 'pkg_resources', 'setuptools' imported = set(sys.modules).intersection(rep_modules) try: import pkg_resources pkg_resources.require("setuptools>=" + version) # a suitable version is already installed return except ImportError: # pkg_resources not available; setuptools is not installed; download pass except pkg_resources.DistributionNotFound: # no version of setuptools was found; allow download pass except pkg_resources.VersionConflict as VC_err: if imported: _conflict_bail(VC_err, version) # otherwise, unload pkg_resources to allow the downloaded version to # take precedence. del pkg_resources _unload_pkg_resources() return _do_download(version, download_base, to_dir, download_delay) def _conflict_bail(VC_err, version): """ Setuptools was imported prior to invocation, so it is unsafe to unload it. Bail out. """ conflict_tmpl = textwrap.dedent(""" The required version of setuptools (>={version}) is not available, and can't be installed while this script is running. Please install a more recent version first, using 'easy_install -U setuptools'. (Currently using {VC_err.args[0]!r}) """) msg = conflict_tmpl.format(**locals()) sys.stderr.write(msg) sys.exit(2) def _unload_pkg_resources(): sys.meta_path = [ importer for importer in sys.meta_path if importer.__class__.__module__ != 'pkg_resources.extern' ] del_modules = [ name for name in sys.modules if name.startswith('pkg_resources') ] for mod_name in del_modules: del sys.modules[mod_name] def _clean_check(cmd, target): """ Run the command to download target. If the command fails, clean up before re-raising the error. """ try: subprocess.check_call(cmd) except subprocess.CalledProcessError: if os.access(target, os.F_OK): os.unlink(target) raise def download_file_powershell(url, target): """ Download the file at url to target using Powershell. Powershell will validate trust. Raise an exception if the command cannot complete. """ target = os.path.abspath(target) ps_cmd = ( "[System.Net.WebRequest]::DefaultWebProxy.Credentials = " "[System.Net.CredentialCache]::DefaultCredentials; " '(new-object System.Net.WebClient).DownloadFile("%(url)s", "%(target)s")' % locals() ) cmd = [ 'powershell', '-Command', ps_cmd, ] _clean_check(cmd, target) def has_powershell(): """Determine if Powershell is available.""" if platform.system() != 'Windows': return False cmd = ['powershell', '-Command', 'echo test'] with open(os.path.devnull, 'wb') as devnull: try: subprocess.check_call(cmd, stdout=devnull, stderr=devnull) except Exception: return False return True download_file_powershell.viable = has_powershell def download_file_curl(url, target): cmd = ['curl', url, '--location', '--silent', '--output', target] _clean_check(cmd, target) def has_curl(): cmd = ['curl', '--version'] with open(os.path.devnull, 'wb') as devnull: try: subprocess.check_call(cmd, stdout=devnull, stderr=devnull) except Exception: return False return True download_file_curl.viable = has_curl def download_file_wget(url, target): cmd = ['wget', url, '--quiet', '--output-document', target] _clean_check(cmd, target) def has_wget(): cmd = ['wget', '--version'] with open(os.path.devnull, 'wb') as devnull: try: subprocess.check_call(cmd, stdout=devnull, stderr=devnull) except Exception: return False return True download_file_wget.viable = has_wget def download_file_insecure(url, target): """Use Python to download the file, without connection authentication.""" src = urlopen(url) try: # Read all the data in one block. data = src.read() finally: src.close() # Write all the data in one block to avoid creating a partial file. with open(target, "wb") as dst: dst.write(data) download_file_insecure.viable = lambda: True def get_best_downloader(): downloaders = ( download_file_powershell, download_file_curl, download_file_wget, download_file_insecure, ) viable_downloaders = (dl for dl in downloaders if dl.viable()) return next(viable_downloaders, None) def download_setuptools( version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=DEFAULT_SAVE_DIR, delay=15, downloader_factory=get_best_downloader): """ Download setuptools from a specified location and return its filename. `version` should be a valid setuptools version number that is available as an sdist for download under the `download_base` URL (which should end with a '/'). `to_dir` is the directory where the egg will be downloaded. `delay` is the number of seconds to pause before an actual download attempt. ``downloader_factory`` should be a function taking no arguments and returning a function for downloading a URL to a target. """ # making sure we use the absolute path to_dir = os.path.abspath(to_dir) zip_name = "setuptools-%s.zip" % version url = download_base + zip_name saveto = os.path.join(to_dir, zip_name) if not os.path.exists(saveto): # Avoid repeated downloads log.warn("Downloading %s", url) downloader = downloader_factory() downloader(url, saveto) return os.path.realpath(saveto) def _build_install_args(options): """ Build the arguments to 'python setup.py install' on the setuptools package. Returns list of command line arguments. """ return ['--user'] if options.user_install else [] def _parse_args(): """Parse the command line for options.""" parser = optparse.OptionParser() parser.add_option( '--user', dest='user_install', action='store_true', default=False, help='install in user site package') parser.add_option( '--download-base', dest='download_base', metavar="URL", default=DEFAULT_URL, help='alternative URL from where to download the setuptools package') parser.add_option( '--insecure', dest='downloader_factory', action='store_const', const=lambda: download_file_insecure, default=get_best_downloader, help='Use internal, non-validating downloader' ) parser.add_option( '--version', help="Specify which version to download", default=DEFAULT_VERSION, ) parser.add_option( '--to-dir', help="Directory to save (and re-use) package", default=DEFAULT_SAVE_DIR, ) options, args = parser.parse_args() # positional arguments are ignored return options def _download_args(options): """Return args for download_setuptools function from cmdline args.""" return dict( version=options.version, download_base=options.download_base, downloader_factory=options.downloader_factory, to_dir=options.to_dir, ) def main(): """Install or upgrade setuptools and EasyInstall.""" options = _parse_args() archive = download_setuptools(**_download_args(options)) return _install(archive, _build_install_args(options)) if __name__ == '__main__': sys.exit(main()) sunpy-0.8.3/setup.cfg0000644000175000017500000000221613231613137014716 0ustar nabilnabil00000000000000[build_sphinx] source-dir = docs build-dir = docs/_build all_files = 1 [build_docs] source-dir = docs build-dir = docs/_build all_files = 1 [upload_docs] upload-dir = docs/_build/html show-response = 1 [tool:pytest] minversion = 3.0 testpaths = "sunpy" "docs" norecursedirs = ".tox" "build" "docs[\/]_build" "docs[\/]generated" "*.egg-info" "astropy_helpers" doctest_plus = enabled addopts = -p no:warnings --doctest-rst markers = online: marks this test function as needing online connectivity. figure: marks this test function as using hash-based Matplotlib figure verification. This mark is not meant to be directly applied, but is instead automatically applied when a test function uses the @sunpy.tests.helpers.figure_test decorator. # Disable internet access for tests not marked remote_data remote_data_strict = True [ah_bootstrap] auto_use = True [metadata] package_name = sunpy description = SunPy: Python for Solar Physics author = The SunPy Community author_email = sunpy@googlegroups.com license = BSD url = http://sunpy.org/ edit_on_github = True github_project = sunpy/sunpy [pycodestyle] max_line_length = 100 [yapf] column_limit = 100 sunpy-0.8.3/setup.py0000755000175000017500000001122413232563447014622 0ustar nabilnabil00000000000000#!/usr/bin/env python # This file is based havily on the astropy version here: # https://github.com/astropy/package-template/blob/master/setup.py # Which is licensed under the astropy license. import glob import os import sys import ah_bootstrap from setuptools import setup # A dirty hack to get around some early import/configurations ambiguities if sys.version_info[0] >= 3: import builtins else: import __builtin__ as builtins builtins._ASTROPY_SETUP_ = True # -- Read the Docs Setup ----------------------------------------------------- on_rtd = os.environ.get('READTHEDOCS', None) == 'True' if on_rtd: os.environ['HOME'] = '/home/docs/' os.environ['SUNPY_CONFIGDIR'] = '/home/docs/' from astropy_helpers.setup_helpers import ( register_commands, get_debug_option, get_package_info) from astropy_helpers.git_helpers import get_git_devstr from astropy_helpers.version_helpers import generate_version_py # Get some values from the setup.cfg try: from ConfigParser import ConfigParser except ImportError: from configparser import ConfigParser conf = ConfigParser() conf.read(['setup.cfg']) metadata = dict(conf.items('metadata')) PACKAGENAME = metadata.get('package_name', 'packagename') DESCRIPTION = metadata.get('description', 'SunPy: Python for Solar Physics') AUTHOR = metadata.get('author', 'The SunPy Community') AUTHOR_EMAIL = metadata.get('author_email', 'sunpy@googlegroups.com') LICENSE = metadata.get('license', 'BSD 2-Clause') URL = metadata.get('url', 'http://sunpy.org') LONG_DESCRIPTION = "SunPy is a Python library for solar physics data analysis." # Store the package name in a built-in variable so it's easy # to get from other parts of the setup infrastructure builtins._ASTROPY_PACKAGE_NAME_ = PACKAGENAME # VERSION should be PEP386 compatible (http://www.python.org/dev/peps/pep-0386) VERSION = '0.8.3' # Indicates if this version is a release version RELEASE = 'dev' not in VERSION if not RELEASE: VERSION += get_git_devstr(False) # Populate the dict of setup command overrides; this should be done before # invoking any other functionality from distutils since it can potentially # modify distutils' behavior. cmdclassd = register_commands(PACKAGENAME, VERSION, RELEASE) try: from sunpy.tests.setup_command import SunPyTest # Overwrite the Astropy Testing framework cmdclassd['test'] = type('SunPyTest', (SunPyTest,), {'package_name': 'sunpy'}) except Exception: # Catch everything, if it doesn't work, we still want SunPy to install. pass # Freeze build information in version.py generate_version_py(PACKAGENAME, VERSION, RELEASE, get_debug_option(PACKAGENAME)) # Treat everything in scripts except README.rst as a script to be installed scripts = [fname for fname in glob.glob(os.path.join('scripts', '*')) if os.path.basename(fname) != 'README.rst'] # Get configuration information from all of the various subpackages. # See the docstring for setup_helpers.update_package_files for more # details. package_info = get_package_info() # Add the project-global data package_info['package_data'].setdefault(PACKAGENAME, []) # Include all .c files, recursively, including those generated by # Cython, since we can not do this in MANIFEST.in with a "dynamic" # directory name. c_files = [] for root, dirs, files in os.walk(PACKAGENAME): for filename in files: if filename.endswith('.c'): c_files.append( os.path.join( os.path.relpath(root, PACKAGENAME), filename)) package_info['package_data'][PACKAGENAME].extend(c_files) extras_require = {'database': ["sqlalchemy"], 'image': ["scikit-image"], 'jpeg2000': ["glymur"], 'net': ["suds-jurko", "beautifulsoup4", "requests", "dateutil"], 'tests': ["pytest", "pytest-cov", "pytest-mock", "pytest-rerunfailures", "mock", "hypothesis"]} extras_require['all'] = extras_require['database'] + extras_require['image'] + \ extras_require['net'] + extras_require['tests'] setup(name=PACKAGENAME, version=VERSION, description=DESCRIPTION, scripts=scripts, install_requires=['numpy>=1.11', 'astropy>=2.0', 'scipy', 'pandas>=0.12.0', 'matplotlib>=1.3'], extras_require=extras_require, provides=[PACKAGENAME], author=AUTHOR, author_email=AUTHOR_EMAIL, license=LICENSE, url=URL, long_description=LONG_DESCRIPTION, cmdclass=cmdclassd, zip_safe=False, use_2to3=False, include_package_data=True, **package_info ) sunpy-0.8.3/PKG-INFO0000644000175000017500000000052113232563477014203 0ustar nabilnabil00000000000000Metadata-Version: 1.1 Name: sunpy Version: 0.8.3 Summary: SunPy: Python for Solar Physics Home-page: http://sunpy.org/ Author: The SunPy Community Author-email: sunpy@googlegroups.com License: BSD Description-Content-Type: UNKNOWN Description: SunPy is a Python library for solar physics data analysis. Platform: UNKNOWN Provides: sunpy